From 4b13ea518994a760acb88ed73ab138e3592f4060 Mon Sep 17 00:00:00 2001 From: Devis Lucato Date: Fri, 17 May 2024 17:35:49 -0700 Subject: [PATCH] Rename Content Storage to Document Storage Breaking changes: * Renamed IContentStorage to IDocumentStorage * Renamed namespaces * Renamed exceptions * Renamed DI methods * Renamed AzureBlobs nuget package * Configuration schema changes, deprecated ContentStorageType => use DocumentStorageType * Update bicep/arm templates, rename env var matching config settings Other changes: * Bump version to 0.60 * Improve README docs * Fix Postgres docs * Refactor memory db comparison tests --- Directory.Build.props | 2 +- README.md | 239 +++++++++--------- docs/index.md | 2 +- docs/infra-async.png | Bin 0 -> 152869 bytes docs/infra-sync.png | Bin 0 -> 179165 bytes docs/packages.md | 77 +----- .../001-dotnet-WebClient/file9-settings.json | 2 +- .../002-dotnet-Serverless/appsettings.json | 2 +- .../002-dotnet-Serverless/file9-settings.json | 2 +- .../appsettings.json | 2 +- .../appsettings.json | 2 +- .../104-dotnet-custom-LLM/appsettings.json | 2 +- .../appsettings.json | 4 +- .../106-dotnet-retrieve-synthetics/Program.cs | 2 +- .../appsettings.json | 2 +- .../appsettings.json | 2 +- .../appsettings.json | 2 +- .../appsettings.json | 2 +- .../Program.cs | 2 +- .../appsettings.json | 2 +- .../DiscordMessageHandler.cs | 2 +- .../301-discord-test-application/Program.cs | 2 +- .../appsettings.json | 2 +- .../AzureAISearch/AzureAISearchMemory.cs | 4 +- extensions/AzureBlobs/AzureBlobs.csproj | 8 +- extensions/AzureBlobs/AzureBlobsStorage.cs | 34 +-- extensions/AzureBlobs/DependencyInjection.cs | 12 +- extensions/AzureBlobs/README.md | 2 +- extensions/AzureQueues/AzureQueuesPipeline.cs | 10 +- .../Discord/Discord/DiscordConnector.cs | 12 +- .../StorageTests.cs | 6 +- .../MongoDbAtlas/DependencyInjection.cs | 20 +- .../MongoDbAtlas/MongoDbAtlasStorage.cs | 10 +- .../Postgres.TestApplication/Program.cs | 14 +- .../Postgres.UnitTests/PostgresConfigTests.cs | 2 +- extensions/Postgres/README.md | 5 +- .../Qdrant/Qdrant.TestApplication/Program.cs | 2 +- .../AdditionalFilteringTests.cs | 2 +- .../MockEmbeddingGenerator.cs | 2 +- .../Redis/Redis.TestApplication/Program.cs | 2 +- .../TikToken/TikToken.UnitTests/Startup.cs | 2 +- .../TikTokenTokenizersTest.cs | 2 +- infra/main.bicep | 2 +- infra/main.json | 2 +- infra/modules/container-app.bicep | 2 +- .../ContentStorage/ContentStorageException.cs | 29 --- .../DocumentStorageException.cs | 29 +++ .../EmbeddingFileContent.cs | 2 +- .../IDocumentStorage.cs} | 4 +- service/Abstractions/IKernelMemory.cs | 2 +- .../KernelMemoryBuilderExtensions.cs | 16 +- .../Pipeline/IPipelineOrchestrator.cs | 12 +- .../Core/Configuration/KernelMemoryConfig.cs | 26 +- .../DevTools/DependencyInjection.cs | 16 +- .../DevTools/SimpleFileStorage.cs | 6 +- .../DevTools/SimpleFileStorageConfig.cs | 2 +- .../Core/Handlers/DeleteDocumentHandler.cs | 10 +- .../Handlers/DeleteGeneratedFilesHandler.cs | 10 +- service/Core/Handlers/DeleteIndexHandler.cs | 10 +- .../Handlers/GenerateEmbeddingsHandler.cs | 6 +- .../GenerateEmbeddingsParallelHandler.cs | 6 +- service/Core/Handlers/SaveRecordsHandler.cs | 2 +- .../Core/Handlers/TextExtractionHandler.cs | 2 +- service/Core/KernelMemoryBuilder.cs | 10 +- service/Core/Pipeline/BaseOrchestrator.cs | 28 +- .../DistributedPipelineOrchestrator.cs | 8 +- .../Pipeline/InProcessPipelineOrchestrator.cs | 8 +- service/Service.AspNetCore/WebAPIEndpoints.cs | 4 +- service/Service/Program.cs | 8 +- service/Service/README.md | 20 +- service/Service/ServiceConfiguration.cs | 12 +- service/Service/appsettings.json | 4 +- .../ParallelHandlersTest.cs | 2 +- .../ServerLess/SubDirFilesAndStreamsTest.cs | 2 +- .../TestCosineSimilarity.cs | 128 +++++----- .../VectorDbComparison/TestMemoryFilters.cs | 211 ++++++++-------- .../Core.UnitTests/KernelMemoryBuilderTest.cs | 14 +- .../TestHelpers/BaseFunctionalTestCase.cs | 2 +- tools/InteractiveSetup/Context.cs | 4 +- tools/InteractiveSetup/Main.cs | 30 +-- ...rage.cs => MongoDbAtlasDocumentStorage.cs} | 6 +- 81 files changed, 583 insertions(+), 621 deletions(-) create mode 100644 docs/infra-async.png create mode 100644 docs/infra-sync.png delete mode 100644 service/Abstractions/ContentStorage/ContentStorageException.cs create mode 100644 service/Abstractions/DocumentStorage/DocumentStorageException.cs rename service/Abstractions/{ContentStorage => DocumentStorage}/EmbeddingFileContent.cs (95%) rename service/Abstractions/{ContentStorage/IContentStorage.cs => DocumentStorage/IDocumentStorage.cs} (97%) rename service/Core/{ContentStorage => DocumentStorage}/DevTools/DependencyInjection.cs (56%) rename service/Core/{ContentStorage => DocumentStorage}/DevTools/SimpleFileStorage.cs (95%) rename service/Core/{ContentStorage => DocumentStorage}/DevTools/SimpleFileStorageConfig.cs (91%) rename tools/InteractiveSetup/Services/{MongoDbAtlasContentStorage.cs => MongoDbAtlasDocumentStorage.cs} (83%) diff --git a/Directory.Build.props b/Directory.Build.props index d9a0b701a..a7a53de17 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -2,7 +2,7 @@ - 0.51.0 + 0.60.0 12 diff --git a/README.md b/README.md index d6e066f72..77e71699c 100644 --- a/README.md +++ b/README.md @@ -33,52 +33,17 @@ This repository presents best practices and a reference architecture for memory AI and LLMs application scenarios. Please note that **the provided code serves as a demonstration** and is **not an officially supported** Microsoft offering. -## Kernel Memory (KM) and Semantic Memory (SM) +# Synchronous Memory API (aka "serverless") -**Kernel Memory (KM) is a service** built on the feedback received and lessons learned -from developing Semantic Kernel (SK) and Semantic Memory (SM). It provides several -features that would otherwise have to be developed manually, such as storing files, -extracting text from files, providing a framework to secure users' data, etc. -The KM codebase is entirely in .NET, which eliminates the need to write and maintain -features in multiple languages. As a service, **KM can be used from any language, tool, -or platform, e.g. browser extensions and ChatGPT assistants.** - -**Semantic Memory (SM) is a library for C#, Python, and Java** that wraps direct calls -to databases and supports vector search. It was developed as part of the Semantic -Kernel (SK) project and serves as the first public iteration of long-term memory. -The core library is maintained in three languages, while the list of supported -storage engines (known as "connectors") varies across languages. - -Here's comparison table: - -| Feature | Kernel Memory | Semantic Memory | -|-----------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------| -| Data formats | Web pages, PDF, Images, Word, PowerPoint, Excel, Markdown, Text, JSON, HTML | Text only | -| Search | Cosine similarity, Hybrid search with filters (AND/OR conditions) | Cosine similarity | -| Language support | Any language, command line tools, browser extensions, low-code/no-code apps, chatbots, assistants, etc. | C#, Python, Java | -| Storage engines | [Azure AI Search](https://azure.microsoft.com/products/ai-services/ai-search), [Elasticsearch](https://www.nuget.org/packages/FreeMindLabs.KernelMemory.Elasticsearch), [MongoDB Atlas](https://www.mongodb.com/atlas/database), [Postgres+pgvector](https://github.com/microsoft/kernel-memory/extensions/postgres), [Qdrant](https://qdrant.tech), [Redis](https://redis.io), [MSSQL Server](https://www.nuget.org/packages/KernelMemory.MemoryStorage.SqlServer), In memory KNN, On disk KNN. In progress: Azure Cosmos DB for MongoDB vCore, [Chroma](https://www.trychroma.com) | Azure AI Search, Chroma, DuckDB, Kusto, Milvus, MongoDB, Pinecone, Postgres, Qdrant, Redis, SQLite, Weaviate | -| File storage | Disk, [Azure Blobs](https://learn.microsoft.com/azure/storage/blobs/storage-blobs-introduction), [MongoDB Atlas](https://www.mongodb.com/atlas/database), In memory (volatile) | - | -| RAG | Yes, with sources lookup | - | -| Summarization | Yes | - | -| OCR | Yes via [Azure Document Intelligence](https://azure.microsoft.com/products/ai-services/ai-document-intelligence) | - | -| Security Filters | Yes | - | -| Large document ingestion | Yes, including async processing using queues ([Azure Queues](https://learn.microsoft.com/azure/storage/queues/storage-queues-introduction), [RabbitMQ](https://www.rabbitmq.com), File based or In memory queues) | - | -| Document storage | Yes | - | -| Custom storage schema | some DBs | - | -| Vector DBs with internal embedding | Yes | - | -| Concurrent write to multiple vector DBs | Yes | - | -| LLMs | [Azure OpenAI](https://learn.microsoft.com/azure/ai-services/openai/concepts/models), [OpenAI](https://platform.openai.com/docs/models), [LLamaSharp](https://github.com/SciSharp/LLamaSharp) via [llama.cpp](https://github.com/ggerganov/llama.cpp), [LM Studio](https://lmstudio.ai/), Anthropic, Semantic Kernel connectors | Azure OpenAI, OpenAI, Gemini, Hugging Face, ONNX, custom ones, etc. -| LLMs with dedicated tokenization | Yes | No | -| Cloud deployment | Yes | - | -| Web service with OpenAPI | Yes | - | - -# Kernel Memory in serverless mode - -Kernel Memory works and scales at best when running as a **Web Service**, allowing to +Kernel Memory works and scales at best when running as an asynchronous **Web Service**, allowing to ingest thousands of documents and information without blocking your app. -However, you can use Kernel Memory also in serverless mode, embedding the `MemoryServerless` -class in your .NET app. +However, Kernel Memory can also run in serverless mode, embedding `MemoryServerless` +class instance in .NET backend/console/desktop apps in synchronous mode. This approach +works as well as in ASP.NET Web APIs and Azure Functions. Each request is processed +immediately, although calling clients are responsible for handling transient errors. + +![image](docs/infra-sync.png) > ### Importing documents into your Kernel Memory can be as simple as this: > @@ -108,7 +73,7 @@ class in your .NET app. > var answer2 = await memory.AskAsync("what's the project timeline?", filter: new MemoryFilter().ByTag("user", "Blake")); > ``` -The code leverages the default documents ingestion pipeline: +The example leverages the default documents ingestion pipeline: 1. Extract text: recognize the file format and extract the information 2. Partition the text in small chunks, to optimize search @@ -117,51 +82,41 @@ The code leverages the default documents ingestion pipeline: [Azure AI Search](https://learn.microsoft.com/azure/search/vector-search-overview), [Qdrant](https://qdrant.tech/) or other DBs. -Documents are organized by users, safeguarding their private information. -Furthermore, memories can be categorized and structured using **tags**, enabling -efficient search and retrieval through faceted navigation. - -# Data lineage, citations - -All memories and answers are fully correlated to the data provided. When -producing an answer, Kernel Memory includes all the information needed -to verify its accuracy: - -```csharp -await memory.ImportFileAsync("NASA-news.pdf"); - -var answer = await memory.AskAsync("Any news from NASA about Orion?"); - -Console.WriteLine(answer.Result + "/n"); - -foreach (var x in answer.RelevantSources) -{ - Console.WriteLine($" * {x.SourceName} -- {x.Partitions.First().LastUpdate:D}"); -} -``` +In the example, memories are organized by users using tags, safeguarding private information. +Furthermore, memories can be categorized and structured using **tags**, enabling efficient +search and retrieval through faceted navigation. -> Yes, there is news from NASA about the Orion spacecraft. NASA has invited the -> media to see a new test version of the Orion spacecraft and the hardware that -> will be used to recover the capsule and astronauts upon their return from -> space during the Artemis II mission. The event is scheduled to take place at -> Naval Base San Diego on Wednesday, August 2, at 11 a.m. PDT. Personnel from -> NASA, the U.S. Navy, and the U.S. Air Force will be available to speak with -> the media. Teams are currently conducting tests in the Pacific Ocean to -> demonstrate and evaluate the processes, procedures, and hardware for recovery -> operations for crewed Artemis missions. These tests will help prepare the -> team for Artemis II, which will be NASA's first crewed mission under the -> Artemis program. The Artemis II crew, consisting of NASA astronauts Reid -> Wiseman, Victor Glover, and Christina Koch, and Canadian Space Agency -> astronaut Jeremy Hansen, will participate in recovery testing at sea next -> year. For more information about the Artemis program, you can visit the NASA -> website. +> ### Data lineage, citations, referencing sources: +> +> All memories and answers are fully correlated to the data provided. When +> producing an answer, Kernel Memory includes all the information needed +> to verify its accuracy: +> +> ```csharp +> await memory.ImportFileAsync("NASA-news.pdf"); > -> - **NASA-news.pdf -- Tuesday, August 1, 2023** +> var answer = await memory.AskAsync("Any news from NASA about Orion?"); +> +> Console.WriteLine(answer.Result + "/n"); +> +> foreach (var x in answer.RelevantSources) +> { +> Console.WriteLine($" * {x.SourceName} -- {x.Partitions.First().LastUpdate:D}"); +> } +> ``` +> +> > Yes, there is news from NASA about the Orion spacecraft. NASA has invited the +> > media to see a new test version [......] For more information about the Artemis program, +> > you can visit the NASA website. +> > +> > - **NASA-news.pdf -- Tuesday, August 1, 2023** -## Using Kernel Memory Service +# Memory as a Service - Asynchronous API Depending on your scenarios, you might want to run all the code **locally -inside your process, or remotely through an asynchronous service.** +inside your process, or remotely through an asynchronous and scalable service.** + +![image](docs/infra-async.png) If you're importing small files, and need only C# and can block the process during the import, local-in-process execution can be fine, using @@ -169,16 +124,16 @@ the **MemoryServerless** seen above. However, if you are in one of these scenarios: -* I'd just like a web service to import data and send queries to answer -* My app is written in **TypeScript, Java, Rust, or some other language** -* I want to define **custom pipelines mixing multiple languages** - like Python, TypeScript, etc -* I'm importing **big documents that can require minutes to process**, and +- I'd just like a web service to import data and send queries to answer +- My app is written in **TypeScript, Java, Rust, or some other language** +- I'm importing **big documents that can require minutes to process**, and I don't want to block the user interface -* I need memory import to **run independently, supporting failures and retry +- I need memory import to **run independently, supporting failures and retry logic** +- I want to define **custom pipelines mixing multiple languages** + like Python, TypeScript, etc -then you can deploy Kernel Memory as a service, plugging in the +then you can deploy Kernel Memory as a backend service, plugging in the default handlers, or your custom Python/TypeScript/Java/etc. handlers, and leveraging the asynchronous non-blocking memory encoding process, sending documents and asking questions using the **MemoryWebClient**. @@ -186,6 +141,45 @@ sending documents and asking questions using the **MemoryWebClient**. [Here](service/Service/README.md) you can find a complete set of instruction about [how to run the Kernel Memory service](service/Service/README.md). +# Kernel Memory (KM) and SK Semantic Memory (SM) + +**Kernel Memory (KM) is a service** built on the feedback received and lessons learned +from developing Semantic Kernel (SK) and Semantic Memory (SM). It provides several +features that would otherwise have to be developed manually, such as storing files, +extracting text from files, providing a framework to secure users' data, etc. +The KM codebase is entirely in .NET, which eliminates the need to write and maintain +features in multiple languages. As a service, **KM can be used from any language, tool, +or platform, e.g. browser extensions and ChatGPT assistants.** + +**Semantic Memory (SM) is a library for C#, Python, and Java** that wraps direct calls +to databases and supports vector search. It was developed as part of the Semantic +Kernel (SK) project and serves as the first public iteration of long-term memory. +The core library is maintained in three languages, while the list of supported +storage engines (known as "connectors") varies across languages. + +Here's comparison table: + +| Feature | Kernel Memory | Semantic Memory | +| --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------ | +| Data formats | Web pages, PDF, Images, Word, PowerPoint, Excel, Markdown, Text, JSON, HTML | Text only | +| Search | Cosine similarity, Hybrid search with filters (AND/OR conditions) | Cosine similarity | +| Language support | Any language, command line tools, browser extensions, low-code/no-code apps, chatbots, assistants, etc. | C#, Python, Java | +| Storage engines | [Azure AI Search](https://azure.microsoft.com/products/ai-services/ai-search), [Elasticsearch](https://www.nuget.org/packages/FreeMindLabs.KernelMemory.Elasticsearch), [MongoDB Atlas](https://www.mongodb.com/atlas/database), [Postgres+pgvector](https://github.com/microsoft/kernel-memory/extensions/postgres), [Qdrant](https://qdrant.tech), [Redis](https://redis.io), [SQL Server](https://www.nuget.org/packages/KernelMemory.MemoryStorage.SqlServer), In memory KNN, On disk KNN. | Azure AI Search, Chroma, DuckDB, Kusto, Milvus, MongoDB, Pinecone, Postgres, Qdrant, Redis, SQLite, Weaviate | +| File storage | Disk, [Azure Blobs](https://learn.microsoft.com/azure/storage/blobs/storage-blobs-introduction), [MongoDB Atlas](https://www.mongodb.com/atlas/database), In memory (volatile) | - | +| RAG | Yes, with sources lookup | - | +| Summarization | Yes | - | +| OCR | Yes via [Azure Document Intelligence](https://azure.microsoft.com/products/ai-services/ai-document-intelligence) | - | +| Security Filters | Yes | - | +| Large document ingestion | Yes, including async processing using queues ([Azure Queues](https://learn.microsoft.com/azure/storage/queues/storage-queues-introduction), [RabbitMQ](https://www.rabbitmq.com), File based or In memory queues) | - | +| Document storage | Yes | - | +| Custom storage schema | some DBs | - | +| Vector DBs with internal embedding | Yes | - | +| Concurrent write to multiple vector DBs | Yes | - | +| LLMs | [Azure OpenAI](https://learn.microsoft.com/azure/ai-services/openai/concepts/models), [OpenAI](https://platform.openai.com/docs/models), [LLamaSharp](https://github.com/SciSharp/LLamaSharp) via [llama.cpp](https://github.com/ggerganov/llama.cpp), [LM Studio](https://lmstudio.ai/), Anthropic, Semantic Kernel connectors | Azure OpenAI, OpenAI, Gemini, Hugging Face, ONNX, custom ones, etc. | +| LLMs with dedicated tokenization | Yes | No | +| Cloud deployment | Yes | - | +| Web service with OpenAPI | Yes | - | + ## Quick test using the Docker image If you want to give the service a quick test, use the following command @@ -214,7 +208,7 @@ on macOS/Linux: docker run --volume ./appsettings.Development.json:/app/appsettings.Production.json -it --rm -p 9001:9001 kernelmemory/service -### To import files using Kernel Memory **web service**, use `MemoryWebClient`: +# Import files using KM web service and `MemoryWebClient` > ```csharp > #reference clients/WebClient/WebClient.csproj @@ -232,15 +226,16 @@ on macOS/Linux: > .AddTag("fiscalYear", "2023")); > ``` -### Getting answers via the web service +# Get answers via the web service > ``` > curl http://127.0.0.1:9001/ask -d'{"query":"Any news from NASA about Orion?"}' -H 'Content-Type: application/json' > ``` +> > ```json > { > "Query": "Any news from NASA about Orion?", -> "Text": "Yes, there is news from NASA about the Orion spacecraft. NASA has invited the media to see a new test version of the Orion spacecraft and the hardware that will be used to recover the capsule and astronauts upon their return from space during the Artemis II mission. The event is scheduled to take place at Naval Base San Diego on August 2nd at 11 a.m. PDT. Personnel from NASA, the U.S. Navy, and the U.S. Air Force will be available to speak with the media. Teams are currently conducting tests in the Pacific Ocean to demonstrate and evaluate the processes, procedures, and hardware for recovery operations for crewed Artemis missions. These tests will help prepare the team for Artemis II, which will be NASA's first crewed mission under the Artemis program. The Artemis II crew, consisting of NASA astronauts Reid Wiseman, Victor Glover, and Christina Koch, and Canadian Space Agency astronaut Jeremy Hansen, will participate in recovery testing at sea next year. For more information about the Artemis program, you can visit the NASA website.", +> "Text": "Yes, there is news from NASA about the Orion spacecraft. NASA has invited the media to see a new test version [......] For more information about the Artemis program, you can visit the NASA website.", > "RelevantSources": [ > { > "Link": "...", @@ -248,7 +243,7 @@ on macOS/Linux: > "SourceName": "file5-NASA-news.pdf", > "Partitions": [ > { -> "Text": "Skip to main content\nJul 28, 2023\nMEDIA ADVISORY M23-095\nNASA Invites Media to See Recovery Craft for\nArtemis Moon Mission\n(/sites/default/files/thumbnails/image/ksc-20230725-ph-fmx01_0003orig.jpg)\nAboard the USS John P. Murtha, NASA and Department of Defense personnel practice recovery operations for Artemis II in July. A\ncrew module test article is used to help verify the recovery team will be ready to recovery the Artemis II crew and the Orion spacecraft.\nCredits: NASA/Frank Michaux\nMedia are invited to see the new test version of NASA’s Orion spacecraft and the hardware teams will use\nto recover the capsule and astronauts upon their return from space during the Artemis II\n(http://www.nasa.gov/artemis-ii) mission. The event will take place at 11 a.m. PDT on Wednesday, Aug. 2,\nat Naval Base San Diego.\nPersonnel involved in recovery operations from NASA, the U.S. Navy, and the U.S. Air Force will be\navailable to speak with media.\nU.S. media interested in attending must RSVP by 4 p.m., Monday, July 31, to the Naval Base San Diego\nPublic Affairs (mailto:nbsd.pao@us.navy.mil) or 619-556-7359.\nOrion Spacecraft (/exploration/systems/orion/index.html)\nNASA Invites Media to See Recovery Craft for Artemis Moon Miss... https://www.nasa.gov/press-release/nasa-invites-media-to-see-recov...\n1 of 3 7/28/23, 4:51 PMTeams are currently conducting the first in a series of tests in the Pacific Ocean to demonstrate and\nevaluate the processes, procedures, and hardware for recovery operations (https://www.nasa.gov\n/exploration/systems/ground/index.html) for crewed Artemis missions. The tests will help prepare the\nteam for Artemis II, NASA’s first crewed mission under Artemis that will send four astronauts in Orion\naround the Moon to checkout systems ahead of future lunar missions.\nThe Artemis II crew – NASA astronauts Reid Wiseman, Victor Glover, and Christina Koch, and CSA\n(Canadian Space Agency) astronaut Jeremy Hansen – will participate in recovery testing at sea next year.\nFor more information about Artemis, visit:\nhttps://www.nasa.gov/artemis (https://www.nasa.gov/artemis)\n-end-\nRachel Kraft\nHeadquarters, Washington\n202-358-1100\nrachel.h.kraft@nasa.gov (mailto:rachel.h.kraft@nasa.gov)\nMadison Tuttle\nKennedy Space Center, Florida\n321-298-5868\nmadison.e.tuttle@nasa.gov (mailto:madison.e.tuttle@nasa.gov)\nLast Updated: Jul 28, 2023\nEditor: Claire O’Shea\nTags:  Artemis (/artemisprogram),Ground Systems (http://www.nasa.gov/exploration/systems/ground\n/index.html),Kennedy Space Center (/centers/kennedy/home/index.html),Moon to Mars (/topics/moon-to-\nmars/),Orion Spacecraft (/exploration/systems/orion/index.html)\nNASA Invites Media to See Recovery Craft for Artemis Moon Miss... https://www.nasa.gov/press-release/nasa-invites-media-to-see-recov...\n2 of 3 7/28/23, 4:51 PM", +> "Text": "Skip to main content\nJul 28, 2023\nMEDIA ADVISORY M23-095\nNASA Invites Media to See Recovery Craft for\nArtemis Moon Mission\n(/sites/default/files/thumbnails/image/ksc-20230725-ph-fmx01_0003orig.jpg)\nAboard the [......] to Mars (/topics/moon-to-\nmars/),Orion Spacecraft (/exploration/systems/orion/index.html)\nNASA Invites Media to See Recovery Craft for Artemis Moon Miss... https://www.nasa.gov/press-release/nasa-invites-media-to-see-recov...\n2 of 3 7/28/23, 4:51 PM", > "Relevance": 0.8430657, > "SizeInTokens": 863, > "LastUpdate": "2023-08-01T08:15:02-07:00" @@ -261,7 +256,7 @@ on macOS/Linux: You can find a [full example here](examples/001-dotnet-WebClient/README.md). -## Custom memory ingestion pipelines +# Custom memory ingestion pipelines On the other hand, if you need a custom data pipeline, you can also customize the steps, which will be handled by your custom business logic: @@ -287,7 +282,7 @@ await memory.ImportDocumentAsync( steps: new[] { "step1", "step2", "step3" }); ``` -# Web API specs +# Web API specs with OpenAI swagger The API schema is available at http://127.0.0.1:9001/swagger/index.html when running the service locally with OpenAPI enabled. @@ -298,8 +293,8 @@ running the service locally with OpenAPI enabled. 1. [Collection of Jupyter notebooks with various scenarios](examples/000-notebooks) 2. [Using Kernel Memory web service to upload documents and answer questions](examples/001-dotnet-WebClient) -4. [Importing files and asking question without running the service (serverless mode)](examples/002-dotnet-Serverless) -3. [Using KM Plugin for Semantic Kernel](examples/003-dotnet-SemanticKernel-plugin) +3. [Importing files and asking question without running the service (serverless mode)](examples/002-dotnet-Serverless) +4. [Using KM Plugin for Semantic Kernel](examples/003-dotnet-SemanticKernel-plugin) 5. [Processing files with custom logic (custom handlers) in serverless mode](examples/004-dotnet-serverless-custom-pipeline) 6. [Processing files with custom logic (custom handlers) in asynchronous mode](examples/005-dotnet-AsyncMemoryCustomPipeline) 7. [Upload files and ask questions from command line using curl](examples/006-curl-calling-webservice) @@ -336,27 +331,27 @@ running the service locally with OpenAPI enabled. ### .NET packages -* **Microsoft.KernelMemory.WebClient:** .NET web client to call a running instance of Kernel Memory web service. +- **Microsoft.KernelMemory.WebClient:** .NET web client to call a running instance of Kernel Memory web service. [![Nuget package](https://img.shields.io/nuget/vpre/Microsoft.KernelMemory.WebClient)](https://www.nuget.org/packages/Microsoft.KernelMemory.WebClient/) [![Example code](https://img.shields.io/badge/example-code-blue)](examples/001-dotnet-WebClient) -* **Microsoft.KernelMemory.Core:** Kernel Memory core library including all extensions, can be used to build custom pipelines and handlers, contains +- **Microsoft.KernelMemory.Core:** Kernel Memory core library including all extensions, can be used to build custom pipelines and handlers, contains also the serverless client to use memory in a synchronous way without the web service. [![Nuget package](https://img.shields.io/nuget/vpre/Microsoft.KernelMemory.Core)](https://www.nuget.org/packages/Microsoft.KernelMemory.Core/) [![Example code](https://img.shields.io/badge/example-code-blue)](examples/002-dotnet-Serverless) -* **Microsoft.KernelMemory.Service.AspNetCore:** an extension to load Kernel Memory into your ASP.NET apps. +- **Microsoft.KernelMemory.Service.AspNetCore:** an extension to load Kernel Memory into your ASP.NET apps. [![Nuget package](https://img.shields.io/nuget/vpre/Microsoft.KernelMemory.Service.AspNetCore)](https://www.nuget.org/packages/Microsoft.KernelMemory.Service.AspNetCore/) [![Example code](https://img.shields.io/badge/example-code-blue)](examples/204-dotnet-ASP.NET-MVC-integration) -* **Microsoft.KernelMemory.SemanticKernelPlugin:** a Memory plugin for Semantic Kernel, +- **Microsoft.KernelMemory.SemanticKernelPlugin:** a Memory plugin for Semantic Kernel, replacing the original Semantic Memory available in SK. [![Nuget package](https://img.shields.io/nuget/vpre/Microsoft.KernelMemory.SemanticKernelPlugin)](https://www.nuget.org/packages/Microsoft.KernelMemory.SemanticKernelPlugin/) - [![Example code](https://img.shields.io/badge/example-code-blue)](examples/011-dotnet-using-MemoryPlugin) + [![Example code](https://img.shields.io/badge/example-code-blue)](examples/003-dotnet-SemanticKernel-plugin) ### Packages for Python, Java and other languages @@ -375,26 +370,26 @@ We also welcome PR contributions to support more languages. githubcontrib --repo kernel-memory --owner microsoft --showlogin true --sortBy login --cols 6 --imagesize 110 --> -[aaronpowell](https://github.com/aaronpowell) |[afederici75](https://github.com/afederici75) |[alexibraimov](https://github.com/alexibraimov) |[alkampfergit](https://github.com/alkampfergit) |[amomra](https://github.com/amomra) |[anthonypuppo](https://github.com/anthonypuppo) | -:---: |:---: |:---: |:---: |:---: |:---: | -[aaronpowell](https://github.com/aaronpowell) |[afederici75](https://github.com/afederici75) |[alexibraimov](https://github.com/alexibraimov) |[alkampfergit](https://github.com/alkampfergit) |[amomra](https://github.com/amomra) |[anthonypuppo](https://github.com/anthonypuppo) | +| [aaronpowell](https://github.com/aaronpowell) | [afederici75](https://github.com/afederici75) | [alexibraimov](https://github.com/alexibraimov) | [alkampfergit](https://github.com/alkampfergit) | [amomra](https://github.com/amomra) | [anthonypuppo](https://github.com/anthonypuppo) | +| :----------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | +| [aaronpowell](https://github.com/aaronpowell) | [afederici75](https://github.com/afederici75) | [alexibraimov](https://github.com/alexibraimov) | [alkampfergit](https://github.com/alkampfergit) | [amomra](https://github.com/amomra) | [anthonypuppo](https://github.com/anthonypuppo) | -[cherchyk](https://github.com/cherchyk) |[coryisakson](https://github.com/coryisakson) |[crickman](https://github.com/crickman) |[dluc](https://github.com/dluc) |[DM-98](https://github.com/DM-98) |[GraemeJones104](https://github.com/GraemeJones104) | -:---: |:---: |:---: |:---: |:---: |:---: | -[cherchyk](https://github.com/cherchyk) |[coryisakson](https://github.com/coryisakson) |[crickman](https://github.com/crickman) |[dluc](https://github.com/dluc) |[DM-98](https://github.com/DM-98) |[GraemeJones104](https://github.com/GraemeJones104) | +| [cherchyk](https://github.com/cherchyk) | [coryisakson](https://github.com/coryisakson) | [crickman](https://github.com/crickman) | [dluc](https://github.com/dluc) | [DM-98](https://github.com/DM-98) | [GraemeJones104](https://github.com/GraemeJones104) | +| :-----------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------: | :------------------------------------------------------------------------------------------------------------------------------------------: | +| [cherchyk](https://github.com/cherchyk) | [coryisakson](https://github.com/coryisakson) | [crickman](https://github.com/crickman) | [dluc](https://github.com/dluc) | [DM-98](https://github.com/DM-98) | [GraemeJones104](https://github.com/GraemeJones104) | -[jurepurgar](https://github.com/jurepurgar) |[kbeaugrand](https://github.com/kbeaugrand) |[KSemenenko](https://github.com/KSemenenko) |[lecramr](https://github.com/lecramr) |[luismanez](https://github.com/luismanez) |[marcominerva](https://github.com/marcominerva) | -:---: |:---: |:---: |:---: |:---: |:---: | -[jurepurgar](https://github.com/jurepurgar) |[kbeaugrand](https://github.com/kbeaugrand) |[KSemenenko](https://github.com/KSemenenko) |[lecramr](https://github.com/lecramr) |[luismanez](https://github.com/luismanez) |[marcominerva](https://github.com/marcominerva) | +| [jurepurgar](https://github.com/jurepurgar) | [kbeaugrand](https://github.com/kbeaugrand) | [KSemenenko](https://github.com/KSemenenko) | [lecramr](https://github.com/lecramr) | [luismanez](https://github.com/luismanez) | [marcominerva](https://github.com/marcominerva) | +| :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | +| [jurepurgar](https://github.com/jurepurgar) | [kbeaugrand](https://github.com/kbeaugrand) | [KSemenenko](https://github.com/KSemenenko) | [lecramr](https://github.com/lecramr) | [luismanez](https://github.com/luismanez) | [marcominerva](https://github.com/marcominerva) | -[neel015](https://github.com/neel015) |[pascalberger](https://github.com/pascalberger) |[pawarsum12](https://github.com/pawarsum12) |[pradeepr-roboticist](https://github.com/pradeepr-roboticist) |[qihangnet](https://github.com/qihangnet) |[slapointe](https://github.com/slapointe) | -:---: |:---: |:---: |:---: |:---: |:---: | -[neel015](https://github.com/neel015) |[pascalberger](https://github.com/pascalberger) |[pawarsum12](https://github.com/pawarsum12) |[pradeepr-roboticist](https://github.com/pradeepr-roboticist) |[qihangnet](https://github.com/qihangnet) |[slapointe](https://github.com/slapointe) | +| [neel015](https://github.com/neel015) | [pascalberger](https://github.com/pascalberger) | [pawarsum12](https://github.com/pawarsum12) | [pradeepr-roboticist](https://github.com/pradeepr-roboticist) | [qihangnet](https://github.com/qihangnet) | [slapointe](https://github.com/slapointe) | +| :----------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | :-----------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | :-------------------------------------------------------------------------------------------------------------------------------: | +| [neel015](https://github.com/neel015) | [pascalberger](https://github.com/pascalberger) | [pawarsum12](https://github.com/pawarsum12) | [pradeepr-roboticist](https://github.com/pradeepr-roboticist) | [qihangnet](https://github.com/qihangnet) | [slapointe](https://github.com/slapointe) | -[slorello89](https://github.com/slorello89) |[spenavajr](https://github.com/spenavajr) |[TaoChenOSU](https://github.com/TaoChenOSU) |[teresaqhoang](https://github.com/teresaqhoang) |[Valkozaur](https://github.com/Valkozaur) |[vicperdana](https://github.com/vicperdana) | -:---: |:---: |:---: |:---: |:---: |:---: | -[slorello89](https://github.com/slorello89) |[spenavajr](https://github.com/spenavajr) |[TaoChenOSU](https://github.com/TaoChenOSU) |[teresaqhoang](https://github.com/teresaqhoang) |[Valkozaur](https://github.com/Valkozaur) |[vicperdana](https://github.com/vicperdana) | +| [slorello89](https://github.com/slorello89) | [spenavajr](https://github.com/spenavajr) | [TaoChenOSU](https://github.com/TaoChenOSU) | [teresaqhoang](https://github.com/teresaqhoang) | [Valkozaur](https://github.com/Valkozaur) | [vicperdana](https://github.com/vicperdana) | +| :----------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :----------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------------: | :--------------------------------------------------------------------------------------------------------------------------------: | :---------------------------------------------------------------------------------------------------------------------------------: | +| [slorello89](https://github.com/slorello89) | [spenavajr](https://github.com/spenavajr) | [TaoChenOSU](https://github.com/TaoChenOSU) | [teresaqhoang](https://github.com/teresaqhoang) | [Valkozaur](https://github.com/Valkozaur) | [vicperdana](https://github.com/vicperdana) | -[xbotter](https://github.com/xbotter) | -:---: | -[xbotter](https://github.com/xbotter) | +| [xbotter](https://github.com/xbotter) | +| :---------------------------------------------------------------------------------------------------------------------------: | +| [xbotter](https://github.com/xbotter) | diff --git a/docs/index.md b/docs/index.md index eaad31c40..1ed03772d 100644 --- a/docs/index.md +++ b/docs/index.md @@ -79,7 +79,7 @@ Here's comparison table: * [Quickstart: test KM in few minutes](quickstart) * [**Memory service**, web clients and plugins](service) * [**Memory API**, memory ingestion and information retrieval](functions) -* [KM **Extensions**: vector DBs, AI models, Data formats, Orchestration, Content storage](extensions) +* [KM **Extensions**: vector DBs, AI models, Data formats, Orchestration, Document storage](extensions) * [Embedding **serverless** memory in .NET apps](serverless) * [**Security**, service and users](security) * [**How-to guides**, customizing KM and examples](how-to) diff --git a/docs/infra-async.png b/docs/infra-async.png new file mode 100644 index 0000000000000000000000000000000000000000..7c9b86c297622e6d08df89eed3335e743d37e8f8 GIT binary patch literal 152869 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

vC_gyp}^I;cb6E>5LNM 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

<}RNN3a{IWb;Es>QWi2U7(( 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ȗ)c$dx_G&JE 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 MD)%%`Sl9di01q}rdjJ3c literal 0 HcmV?d00001 diff --git a/docs/infra-sync.png b/docs/infra-sync.png new file mode 100644 index 0000000000000000000000000000000000000000..11cf78a4674cc0e8bbd4489b510f5549ef9f8142 GIT binary patch literal 179165 zcmaI8bwE_z7cLAVC^!;|4q^}@s5Fv-G>UXHz>p%{odXOAsFX@dcXu~q07`e4bc58; z+%uHEzwh4f4?;O}&fa^i^{jfvAHxK+nSXWt8Pf`+t2KXHZ1JlP40}Fi#@O20H0zMjtiE#<|iHZKd zIMDfDv1j5go&SEx41J+tPk=WD20wB3)-Hedqc`mcq(O>+PkZOU|uPc$4{WnjqPnjW?gjO1#Dp_=v?nb&Zv4HY&qf zadou@kBP_#<35dxW`@i>9?I2h66dfxd(8h!zN85bxjP2v|NbrSF(}{H>K22?|LX$a zlQ9@ypY!4T-#?GOFt<7?%ze`y#ggpcHOxj+c~AcAB2cYN%4%Z<8Xd%h+5fQGRBm2 zTy1+y7*&n!DbUhf*6`W+`My&-sW>Jo!PL?+|3fKEP0epYM`zS|rCP7cZFtc#e|42* zzkj<}=ktw;;HWvXKVniJpdXw~Q2(Bo#5-SVd;sP&R(F2Oloh;`^#0E+z4i zap0R1cwwZv4IA|fSL0pm=bNcTQ^LuqR5UDXU%5wfCW^lsKX&^^H3+Fe%-eyh#>d0> zL69zqe+2nJ7XIs8bVWY z*avgfz6CrsB7)JIgxU)W3C&vadpND1{P_E~Jrn1ckcgz_O<{ATn#dl$yL)Y|qxOLV z|EMPpHm1j}%x&z!zZysQ2gG1QRwx5^u^L>tv>qs#k?AIJAD(E(=e&6L4oWY*md_eq z500Ol)S>4O+-O9WHS{(8EMpqskuLho#2cx&A}*$o!6;B^7wnZh+o5ARYI2Or5)oyk zBtN<_KW{vSk>@@Jzda6rcRlaMbNLk^JbSV=-mEp=rxs)n`!8wAd00KAFO!y*3mth1 zw-Xnai}Bj|#lFE?*F2nc@Q^lfQfx8r9|Oq?2VrgarneOT-Bp4h(ws_nxEXc5(!P`; za(PrI-nkU}PqmQF0_p7yz1mui?;{GsCT7qAs$aCzuTeQ~eZ87QHSXI%M|Df0nnGJ% z$ZB(jNs&61N*?_Y-Ce$WnJ6c;#%p(FMr^liKmYxJmRqC8;bP=|s9*%6tRrNw^2;_u z730rs$9TAtm`CSQs8OlSkPqHp3_y6@AP?7ktkUXxVZ4O5KxWh~Li-<8D@D2oC;N~; z%jhe(mV4Y$Llc<{N%mj!pu*Ft@4whU&8X;KjKZA?LbOGD?+=M5elvc;#73mGSO>H(I!-v^pM6{6mvbesZBkGq)!u z;lSSfWlT)(g8X-JVaOK@Be=5+n@w^OdTiIkY)UPalP}qH6LLX z{OYbOOj_=4KGp>|_*+kYY>Cr$m(uKLOM!i|&x9$JDzvNiA){i57fHtBMj6W->0e5v zqb*4Ltz#84_J`gB=U**@z>qBg+l{ULCiA~Lo)oL7L{yXrfTw(V zbOl_HVlh8p?F$g_mP$HNY|GoWHYs^+vxv0an*PLMn?7#W1a+Pg8S~Y+F<4a}z1(6? ze(4Li=StVTp&KUN@bZ=v#-`H9mNfhL!>x)fvuF(Bxx#-`{=ZIuU*T%mz?wRwpu$U8 z-7umgMmCd(FDpPJ^13-oqB`L!1f!+s2CHGsL)`(Bo#)`m(t;f$g`+AL)zqc)DDm?FBvy6dsz^|DYjSCwa)cd zTyMdI%_2J(T|9rqg~Fz$zQi@wo;nzc37$Ay$d8z)_AI2xP)wG!t7tRwPNn5zltis$ zx*qeBQdk6me8x<-K>MQz*+^Y;U(k?8p_yDY%#ECdUi6vL`cLf5y6tS=jEQTCsw7c< z-ESkSu2xcBVAb19jIS>fgK5L8 zmkvrP(oIe4n@FCf85>?Z!Eq&Q4YxvpY;~c9InwU3kgvGPxKyQSCK(}RmcES@ajv>A zN9 zUazeX_8?bX$IuL4mXM%NQ}mA)M|FfQc8TK#!1fxMkkiFc2p7A9C$Ag^E!@2Wg)hdn zs-#C`W?!<>H69j>9DSXwL^~Ri{)D!%dnH;|cKOAu5Oll_YTVPo^2T-{m6exynx1YE zLTxu~KK!7dsYy@2D{Ly2=DTYOiyVbK_iV_o=t377z3|PFf<8y!5ZBZ)o$??qP zUb_3suFc<^psAxhX_~U3$vukCG_+!4m*q>U>%ITNB`@&Y-z-W+H_w;y&IyxPOe2rv z&!gPt&@{tkk`Ol+xg3bSp+HLGRhF&x>ZZg|T=$+#0IS|%v8`SpxgCi| zr5m5r25HJ_?4v~GzU$8EV#MNA9RD)Qm=T{X{rw1+F-aPTib7kW+De=@X`2d*OP=<9 z+hfhW*_s;jmg6sogbKTBxr+9eKfbUjq(7FLx@qY6>H$4rDF*(m8%Zq=zc zjju!y-1{noMYxlOG&W~XE7su`0@TySL~b%j{zLxpdVyR~3Kuk!wm?D8nDI@@Bgfx| zB7w8d{%-0U02GW>%+SBV?+y6e`}`|dAOwl|^*$mZgn=@a;GWGg?cx4Umu)iUnIAPYR_;- zZe~mMono&bU_FY#i}JEk8A^(8j3pHVu3F>F&tgXgUHAnKLcn!m;+y|P=jK}Erj1N$ z?)Kbxx>B)Spg}v|d`}faYg@Z_2$d2?jlmIPBgu9CaUIZ=F{93&P>o_cd>X=QG;GfV z29!oqe(JTGr&-$0TL*uN*vX%Cz&zJV{_$-fJ1`&n$a3*;oC8t>39QK0#zplJgZ+H_ z7dzX{JyScEc1VI>-_ywZ$Gaj=6gQl49Pc8qZ*gkb&NH&x7#h4$TN$FW%x4ypeBT$* zc+XTrC2ire4b{NX-VSG`=l8!RXE6krT&d(w+`sB-_OP9WGbgBc#A)MAX2qV!En|e{ zOQX-kKl!YV8}Ht4bjBgi!vZl@J1NpfU$WYo8*w7|I_{T^`j{ozv{78cB~68$-uQ<4 z@P^;DFyT`)L%ae)qrjw&B*qIU#ldB@$6I`@Q;Q$FDx$oNI+k1WRTi%wRPe_#UscDq-c03FF5oUgrjng<;e&sw0xl3_?H90} z*rjio=g+|am69_(yVd=rf;75nID4=c({||E?vJ;e*??Jx@m3x|T7OdDkQ36NeU!Xs zPg1VwO2>~k{MZ9eXlR?;KNLue<`}?`9xi86KG(?HBL{c zA|I34K&CCw=a@93fb%v9`6)4*OLHu}HAXuZF1n5PC1F@$SrwWjskA~(^<)(Giv8hT z>BMtcBd7omrzz;d;D3IAZ!`JHnG%5*r`jq@Wp=^o7S836FEJ)8QyT!*b_WvlStgI* z3PM-ys*H3({qj}J*2nXRJqItX?j1rw5` z;<1&FUfWyuunD=9u0!wz`1U)aR#!jC zKwa_^X;~_@pwlY=n6+xKM_p1ywF;ZUnK&^tG`#L{42y2w9Gr`w3+Gydn%xjk@8v1Zel`q-%Gkt+*;0`8F z68QYcky+@n5AOLt`EPTXAax75u@+9hOY=$qSPT@1zhx4bS>y7RvQAB+<}>KT0Y23*(bU^@#1T+`UhjY!GZ z__q#_5B^IXsrIL<70v;|9e&|V2X zaa8pVu=Ted$gWzRTx!_ILHe6_@7_(kH4SMur%{qL4DEz>#}jxlC*YkO29rGyD3!zV zADycc;WlW?RLE)fRbqhVf}EgWR)(1MR?j2$xA59I;MT%{$Xv~eq>>x~Th#8YYpn(& z1!~Kxnn|~GRT`zF14wb4KAeG#Ha%cgz28M9FU+bO_uB3w6K@yK(dzc(_zqmyFq_a& zUzqXYOhS3Ido=)C2tp!G*8=ro|LTh2ep5`iOvsBbs+vKG+`S=bOx#pIRK=|?z>NSn zcDH^{{R^r7z>UgY>;U^jD)e#10YxRiD`tt1sok&z4hbN?k0e*`Tm-tqHOQZH!T3=o9bk6(QEWL~CF|Wq%~7ZQ zM>E%eyYh$Q-gBx{fkspSnM2n5UxwM~tvw^KMg{qZbieK&OpACe=SKMoz2>6p$$aN) zE(Xmm?wcU`oYc)$psq?8C0X=c=wxJ3paBpvViCj#-_By-urb!td)WhN&eaS}f+Xt8X%<+2`e@sgy?|v?_l}z7W%~ma1w5C97L=<*F)lfzd@esOb z5mNSq_GdesyRj&TrVr8*KroxrVRtUPOMvj0Za<7b8|_I*=pus@d$_1zTI%W;rxXoO zq-hoJ({wRyxMKgC8GQ-z9yb0xBZX}G8$&(ZS@Yw5b~#TvYb29LALQrfGh06gS6;X^ z4xrrOX05Sw0jYH9{A2B98qbH*N?S{4Z(lQ#w2kLI{!%PHNX>u_v4lO4?}P4hIVTH2 zVNSuJpOb8Ro>f@uyzf<*78XR!T{>Ih+i<`{-r?c22%I|{Udg!c5WB-)nPIm1`I@3i zR~-Ai#g;1z*SqXyPZAUajL=~jkM_D~O)86>9xKm*mHyXfNV9Ysl@$@LuDF$gR##FD0eh3{+Hd zYSw>vKO<`kIFUo?qqXYTSQ+QOkHqbaw7kl9X4mj#|2D>|u6jpIpZcqbmba-3uOx@2`w};;!t1SB9h|wuMIXfI zsqig`fMAIOQI~UeV|Sz=j-RB&;ue5Ee=IyffSc4%Pw`oW)eweFM4em&ez?|n*S2D~ zJv+v=wo{&HYc7Yz6sDeb&AIsk!CV0FIZAx+{G$2_k=3%IiPOAamBArhJn&rHu%W_g zq||NTL5cfmXQ(+9+2#h90xXU78AUl*4RrYv!?}t% zTm>BHmON}~tAAQ*_cM_#DqwoBqWtl5ZlTN*c;$V#HWC{x0~gQjgo_U5r|=W3WXYN7 zt@~{M#yvA%;atFcHv@Qh&ejSf2^PMUN8@$A75)9GQ4+C7Gtw){-+CYNeNmncX@#o3(tNeN>xG;-Js+I6Uw}J?mQ8+v-#vig+`btGd*^Y=EWb`3c=Jxb3NwG%J_O8DD(vU9)* zM%H=r9!~Yp8ZDA2y|65)IhxL<=;6KNiAK#lCeRgpwmCIZpNf5vkjPI-4XYU)_0zlS zRCSEa*w4^D1g%2<>)3&mwXC~4m+ZNlzXP!mBr+qN< z7r%^iZ%pn;&0?XcNvI+?%2;$qB(?fjW1Qxy~2TibT0DhVR9@ z?=YPAXTVgzI%Nu?h|kO^L22AYDAsjn;)N}NpV3f-70)&X%XH$l4* zT(Y?}@v@4<`U?W!+0ty9GA|ZOoO31002Y}RaBcb2v0xzbZl)QNb<5X2%LVdKQw{lq zHl89bx_yDf6Kf3B7*B1B>PYrB(@ml_oE;S8v73EL^+;||Z(hV3a%$8T`{?x0{3pqo z_G4g5$CX zK3L%${9C*|Xg|!jsS!lQ?98j+?PGVg#4a>uO4ehZsiiy82iyA~XsEN9TmB9E#`YfOcIcY1obp;#2+;_$oy)rQ z_z8v7kkYL=Tw3#>(9cYYF@?IdM^aHfBE3=kNa!8^YPib95ew(0SA*_ zL}}JH(4_`xjq)TN;>zHdh@|5k{}F4hfaueGDB~bjk2c?`R$dM^D4Zo5QO^bf>X62z zU9Y%v_-&2^_Fg4xb$%A_E+fX9{bG2OQ=y}#N`kMWj>2mD@8XT51fJ}Sf?;ium|;N> z9!5=_TC8LGiF8;cechvo(44IWY>Uvcc)867@CdM%zWN<<{~W1wBNz}TbD*E&i5+R% zj{O2(*$#aF{?q;q5x>LVM;oNhxdVmD&Lh?K%Z^diUkJ%Eca$s3_c@0emXT=hC>#e^ z3>H3(`nkn;5m^*Y)uIj@SBX2Wtg0oO!afkMypAF{MZn0LJFS6%>B&0C#w@Bu7Uzs& zdmY?lQ?pK{&-SrVSB(s8XJ!TlC0yJ> z?P{3(S2)YVU(_OHY`0u~;r6XeF7wLH*I+UB2Tn03nFFcFGe9Fgv4n17ohz|&T)vL- znCrG5P)4<#4K*66bsGR_e(E|6-YhmiwXS~>q%;>~tmLxnvKc#w_Cp=DXIf(4Q+^XA z*LuJE(QC=`2p2q@$~sPl5=2oPCsp%mYaawtr-C9P@QoU`qigI|dF%t1XV}eM_pVT< z*P_}9Jlb6HmsSE;WaMmm$~$5*wKmG-GWNo5@~k%kemY$LYW;NsayX3nC_>yyBSM|O!6;&PWcMoID0&qT& zsh(35v1=ugo1vE!hEbzy-SPQZ4Cg=&Zshc;Yrvz_WxKW7b8!mSH|{m3ZUJG!{ArCkNAWeNx=sjtz%<*!mRN`w2-Z5 zWb#cV)xgHh%={G%>0*-Aq0;=77B!!(kx77OvM&o>9ckWw68U}=A{7&5MHV2@WUlj+ zi+MWx$yDRSP32db!IP2IZIW9?1C{2tlZKqrmHK#@dChXd^w4q7I1iwwsK*ZH?hnUB zZQMU7dvAKNc(gBptiMnd#zE}r@<`(}jswa!qb`-A=CMX=-$wD+9QVE*-D+$R!~dh? zVgTWZYdguxi%3Z}ONA=3Vdgy{~lY2bS*OwPnAeo4TrwA)DO~E2)NF zZ-_&sW}Jo+{v5eWHqVus)0e?wLkRBNAwhj}LVbOe(vu-=&jFqr$#R0?ry?7FPYtxd zh3e>qo6uM}{0i_5FS)9GfZx%=kfm?$e3s?rwC8tuiFhvhF6}0AgiUr?VD`i#ebXF2 z-Y+d>HTeD7)-Z+F4eGBHs_)~LDwuYK!NPq0j*`yoyWv{O;U$!1CYVpJFt6c}+WQDY zbA&vMwr8JO!%Q#3itdMP^7{624o-Ybd$2SSr%O=}c)oJ^duR=2EqxyMioan(&#bg) z!Do)XnvQYt0O+UeMHvH@C0{E!MU%inI^;>hmID;xG{eS8FMO}Ndt}S@_b`U}r5;jr z9|lS~wuZ2GJS}qY?_32kfJfcK%;PQ1u392qE2DBV^jGiH@Td-lR(_c3>RSk@Lk#s00$a9U>ghpC*J6pk5lGi8OsED(M8 zy+AXGzHt#H_PfmX(r{1iZ@!-&w=EK37#MMva& zF_I0cCp(vh!tnNX))sy|DCuo+Kn=KW>deWnI_{zX>}AVa24YU{oV zUff`jH~FMds=@C;JmVwBX8;Dcihh9O|5j$DbQW9S=pdkhrE{sdYTK^Nuk-tuNMD@> z{uV-rzA=+_AX8AC?!%-i077b(6hCMg(hF z8k@vqi(3+M8CqrDAM)6=6?O(?J;x^tA9=v$LqWI>cuxvGVOGL(?nt5U*{^90q)}D!c_$LHHVF^m(gkm#}R3c^p}d!`B+C z=Q%Bz;+sDYX=f*kqE35-h>yhRG|{F!zd_Hn!T5OQDUXdv2)&dMZSc#T-a(!OU%bPL z*NCe9<70~Bw=G&R>w0yS*s5LfL5dnt*_~C_M)HFQ7AX%JC>~bW18lIt%FBvldd84` zP+^Y5=Qgq7B)|vL%Z9ulQLUvDX%a82#^8H+N0JgixljPL&ENZbo}~@somfD0y2aQQ z)3dv$(Gxs9Pf(l3+*$F;?ev1OcqFZP_xukph~(fza%AYxw^>wn0rqPma|a2|>SyLgMliP_g_EH;%R zRZa3|O3XMSUBB%s=~vN1B3Hz_KNOfOE5p({4-{7Q`{-HGC6eEiK&6aV=Y{xLB&~(O z8kR`%OjX@V3}YPV^X}S&x>Z>ta()<|85kVlc7U?)HuqJ`$!P8+URC)`FGI4IeKZ9L z7!-`8EHN;)PHpisU+D6B$pLnhC@>=br4&I;^{hjW;!!#$qdaOkmG|Hg?Yhxp+_D0W zZ1%)ab1L(f4UgD#$=IjgJTz9fjTy08(tp;n&))+7`2$#DJi1pgI4QJvcAQ$*u_Cy< zx0dzW4BCx;9(^BM(R@p5g?nmfg0OLCKJNIJw8^qjVHtc5S|MoUwe#d_=OX@LzwMt< ztS?-wl+xPczgjSBb{G!$2AB+s%D_CYxzcmvUoIE{KH87g2Jdc-O6+06kmX~&LKYO& znUb{~HGc}K=)_+%t&HZY z?XON5FUHcT};=4%ZjOciBUrt7OwI)4#BCo;pm-Rw9llTeNkp3$s znag*XXlV;@=VyOKbdfWW0S3Jh|MS_o3YuWM?kjo5z&A2JY_M$3x|Q*m>{~ zSTh}6PaJ&^WN*sQGr4bcQ-3R4NINp>8bCAhOYK_%j)iU!R=(Fr#t7 z92zoZ1oVew3>ZxLwPdk1oDMSdU{0(>=hrF}BxZ2wRgJtgU`IR00u^o}GVkda~9x9X6Kr z?sKW6x*w9w01c6?pDQ%r8loA8&4Xn~5u5g~U^cz_cP_=D#6sKZJKNF*-!!bXtH30* z9}0`J=%6s1$ytIJ7O!e#rqcS1l}_p9WlvfZ{bwxLLv}W*QN4~?1Gr=kKty{|cXU*S z{c!*Yz5W2gC2otLJa%5scekuF4grv{kzt^=}&s*&rFTSjlQSY@W+6OVWT~1?Y>S{Hm z^6j{ngWy*NSGnd1_$#gG_4AqeHb@!L5U%NUuByqWNz$$>ew++qe8QWx|7!9&4lxi# zS&%##e18^+P%NO1tffaL=6Ab%8=WWXD{(IvW%A#!AI7l>Ta^ z+%)z)xO2q4r(tD*OtG*ffKNZ!NJ?!!bYEsfe`}?%OFlSgzHs1=N`;QdfQMRa&;vp| zP_D|Wu@06bpwPN^`B1Egpt2-~uALh8yd;ZU(hJfFv|y0mZ~+!l6uthrwXVs0T4brrEVl1DXi-=#=K9mXUL$=BTcv0bA>RZEe)aaO~qNjOyJ$9el7dSrs+b!ngze*>YM) zc%U%;s4c1|*_$DG@Y*)xXrWqVFEMTJt=t-~7T}Bk&SelgZB4oLt7u4lpriyXGlfP^ z@-tQ0Pv(orJoiQVb}JlE>BF_=4dUwBF&!fLMhQtd4Z9D$inE3d3n0CYvCogMQ2Z}V zh7bV~*snXTqx5&0@z2aCs{4I3)dYKx7iNQd;*1e>*Bw@-#km~wB}M<_SD1?=lU60l zz2A0V7%HNF$o-rvxwNeWMn0yi%Sz44%eH(!BJzuowoA-Pd8QLX>T5C}J0wT+5wOj@ zhKF6gEMltNuS`pI%N$&%H+aSJg{t;+)-V@A>5k(ts5rdq0igx}9KYE#iXdl^fSJ&^ zm38gWd|2wVQS)(FZTTX5>yP-eJaZfiU)ciH`s*_G@}B^<7fx1g{+;kxjrG?*`O-^B zYXj7P9{wQdZbM2|j%}37llL^ul6}NvuqyyT=E#%uHQFiIZL@yGCRk}-?gZ2w~~J!20syOuNY$ z{ELqxBk`P2YK8TWQj1Dxpqdrt$ye!%Dr;K$A5Ad$)dCR%QCMZw{ueD7L!}3afJ2%t zdAB&KKHXQPrbUo3@(OY*n7qPK|igoDF7HCFu0rZ}pIEP8G}i6-BfjFaZ5hbr0t=HF(E~S^9G^-&fsfp}erM@m0szk#yyQ zoIsnCMivG_=BC5UE?BG>TYa^*lKN((NF)I0h?Dk~20x!(&>NtJG&<34ZISYoyXR!CY8@9U5TZbN4A3E){_6(L+Pt8bwyM8A5lRVZ! z9K`3mou$fkrON9y{MY-z;+j`5r5R%t(G+OdQK(d-0FLlGAa;Fw?cvCI>`DNZfC=mp z<8v&0;V{aMG5u7tzOzTLiae=Tp66=HHxW?$?s=dZSm7iRJR{zo@!_6n6~I4*1$y8i z4A2bedfC*r)3pdA_(gIxkGC2c*qBM$`3{zk9?vnWpS1$fcO);u*5K=pV}TC#u#A^h zY={Dpd*3!2_F#U+D}W9W&*M;JHj3`1M+Xy~xn-mrxLMh9m#oG{);!9jCnLiJzV+T; zeB@zH;F;$+d3GO`29Hc`A#^DFM@tg+dOpCiGCU4_n%gWXCih$lN7xJ4yuvk>v%VyG z1r`Ix)?%b|tdgKh)zMKKN*FpjPk#o{=-gWSfyKB?B15meQG2g<1U{BRR9K3Ly`rJ5 zZUFrqaegxD@2^6T z%XNFvI>UHHk?FRAlwN^d4sGY*5KVB@Z689AHo8l`E%fTjS&)dtwLt|gq>pLHz=z_F z0*`k|WzPO`(yAvH#Hv9R1}!Yy@7?Jx0(kRV$kwabC3_oBMCl0cQV87(838o1Q9HHk zOd~_xVdM+bl#+V`nPJ8C5SPORqD9I~&&>-mB5;6@i8&9p7>J0NJ@dm{eqXH9pc4;I({%dKOe@cyzsWs|_I@>po~&w17NWW5hW z(A<05TLYNxQAbbs9bad@mQE6|vbmV3)0~ zk;VuQ9a#UwGq{QWSIn66#h!S81AZZNBnrF9{$ep>-DYgtYFa-P>B+B*o~Wr~>Ok|2 z(C4(niU8xm_rmmBA3u2_;D+)ai7mOCdqEih&W0cB>cL)}FPAZu+0Ec}7I~XMuMK-M zIwdu_Y10Q5Wt17>|B^Nlb2o4<>u(0uawdyQ9uAfz2nX^MJ*~i)``2V}96)2o1Gu)E z&AqXj@*$Z(^>0|ObH81H{0(5zLUslQCyh?PY7cl3EVev*M;pXR;mU`HvCF&g%8fH$ zbtbnwWQYBb&4N|tV5PTW@NAb*Wk#{1V~pJA3CglQ8+tYD9VwB&Lm}ji*m`<;Hd8LC zFY8kkl)`UK-?0HO{jcWOnJ{+59{pnGn?K2ZPy(i%7Qe9mnB=28pY+IiXD6VsQW1oCu;!Eni z7knU!5k=PYf7x~kG%of2id8ImKwID(D?gFEhH!U z?`;?AD~$2ptb1U?6O3M(SfT*zY%5w)p!?N{d#%>9-A08o$Eey$eW`{#qJMx3M>rSo zw1GN+i6|BHMAo{Aly95TDH@3hZhEwDP!Vg@AABaj#5;Eak=JolO?Sm5;TgvF+Z!`H zBA*4r&pgkm!HHoXEfJKUxuMveow@jG#RD7qibGH1_${c#Ud(OFf%6{zkqgA=J7)_- z-ndN?-5JlaEC%pJiTNs5QUY}K|B(dYI}Jn|Z;@()l+9dsol>;(o#_<=z4%pea-@iWxO*$rxm)eUN=X4ZEerd8CYn^#2)8wU z^!vOAcXBrGoDgtlnrSn>BAFv2>)eVf4OwsWYDtIGvo{rt+C&Zsem=lp(s8~1u^j8{ z^qT|SBkMYQI5G~h6wp+TgQ(!bvzqy7w$XjnW%-w6g^o@#)cI)q7vvD78Pn}mUz4^K zH|YzIv1%Q9)y{F%ObGBLX`ZQrH;IT6*FQ%MaT58QdBiifw+eplAnkwDr8%75=^?>p zcWp6UGq&ru^?jvM-NFH%QyUrcy!Bv3%sHnf1*6H%z>F3e!zwDHgRRV;Q zzS;ssB1g!|>qZwVb&#hlVRWE<5g0k}6L?eQwg2B1wy1W`! zgXgMNc!vbv1{lKXNAW0!3&P_0@_>mLr9r*it5%&hzZP2DR(HW%774bzj9<$M2?6>p z)+uz56Lx~Wej$mj>dZchx6Dqb!I>}V%ztDo7mmza;O)SZ#g?faP zIPUpp?)~-+>+ay#>lkqeKuV(7zpNxz&Qt;U8n?OMWOr{H;Kv3UzQ8V?CT@ye{8vwq z`yhg0^+aboI;ft}XMoex4)6yuntRvjt6*&p2__D*MI!@t>KH3)krefKY~ z4nasbw?x*{6Dpv1Q{RW**Z}k&gsDUV6oJB$9QrQ632Qi(ijKMc_So}zlo0K8H0A*u zAbs2gC4#QXeP2#}Da+&hT>xW1$b1#cBZHwyeFtoX{jXs7weUdzBMvA@6$^^u{@Lah zPp#Q)>H?tYrmg6VdjrEN5YE(!e7$t`Asi~q^HTIF`iA==H4pzt0mai_*@0U@W9pr&Km(op=jRyfeBW(2P=`Bw_LAf0so*(g7HRKTb$)JRg|%GM&sVwL+SA3HW4hyw_yYbglK&uvx? zht=*{W}>-5%@h`ojdY6~E5i7{FklTSL**Ea6zY`Un3&w`{bC1S_41{=%B^2LH~dM9 zm#ZOK<7`Eppauq8LmLy-f%%$`W{>_dm``?>17500lsF#JT$Q(y^JrCD?k$bw$=udB z-YP8@85aU#QnHEhbB-8YvHO1GY)>dAw!U6b28~;Kj;@4fj*(kOP;M^$7-jn-ITVkn4f3~$;#Ce&xzuMW+3=BL2u}ac3u6e zSZ4>tGPc<5{~kKo4Tpo@Y+_;(?Hw$VPAl0?l2<&OEcB-V8l9-kRUqV^E$cEq6}X^W zTwTq~K<^~fP(bNbN#M&1X2;3mIB3__s+-uJJtPzRxd%YECtjupUGt--RxPVnzxSBz%6#uKhfi_5Qzb#QR{a+y`ph6!CN)uK%)@ zdoU@LK%-~VW{uMM4{HSA5)uuI=FdoP6m(3SPtyybl_4wQz3R?1f@R69|ICa7w=Hu- z09?nMY)EUHGO63Rvad#oyQ>wK#m1wFckc+}f+hbpLjV?SN~(Sq?`z}{1<9sfx%5CY z0mr0Hqh3{I#ru`f7T4G&b{0x?gSntg=2}zr-Tw`#_{o>BfDxUSB!<77HiV;HHevoHXS3f;5%lhi}kroTLRb_ip?$P^;t%hzIl^hshaYGQI z$;0`PT9m^!RbAQf@V;H;5ofQ)JAZ#glczlk5^O0s-h_=4p+jbi~3%$`Qvh>caN{4w{9968D&v!(fdxmlR zbGQ;x*sQu#I%>Ei(7<+{RkC}~v9&TMAL?#y&Xl9yxU1}3?9euC;)eAT!A zuJZT8wboCN`&_cChXJL=@cbGRT~pwMnM-~G?BKuy<`kck9cj}rX(RUEVK3(V@EZ#W z%O7&bUa5wBBM6XCCNvMsrrwXkUN@`X-&%HxTM^uP>j3Vje`T*-VPEJrPDNe+P2{Dg zlC880g&#bq`ftEO4)8r20!kOR5{pMU5>TczJpg$QcHc>_)o01QMd&+F<-q(Te<~Fw zC?=FYCtF{*C7N;+?mU)u0I3O-Ze^%iSZSb7vu7DsSGOxoe)#AyH|2|GUwD&~scC3? zQlq)WW}HN~FD6mWl=2dSa{qk*f@#-)8MiZyI*~O0!>d($FRKHhjeGqL?SaIUr$qk?id*O5HrwF7FcaA_ALiys zMmAo8?GgGTP_ntz!JchAlG~?8OB;AYMqWr7$;LN(;@$?8YM>ai$U`CZ9`Y@9|8sCy zbVe0jY>C;Enq@l+(Emtwjo4vX%QGOxbRD$ovzpfJ$xS;(Yk23VI`K*$_Czk<1?gah zfoU#w6Y~20J(AMTtgdYK1AaTLz}qDZBivg&r1M@V$-|ZG>c!f3J`-i%Ygw8cz6Ov7 zS`G!5&ifl@yCqZvp_Ve&jaq7*b41bT3cTtfJGa%J#?xSqj%6lMJ9z%&O&3U0@Fsr1 z0Nsu@+knJQ4uTnPuzAPKxuxZ!{j|Zvq)u?;r;LdMo9XGK`5c~*Qn;kliIe*K4H!qt zt&&X@YFGp!mxSEWTCuxfvo9E5Vr@r}Y+UC|JFUzE^TKNVqXq&lK+Bu>XXW6U5b(mC zb!h{mL5QBezpS0phh9cT1z8R6?UkIeLtm@Q|2;oUtQ_27`@X0C0YIX(3pv~@rWF$x zZ7=AQaCso?4m{`SN1KyQ_INM0UKU0bEY0?fjT}(jLT7+`B^0~MWc+6FN~jp{gnSTD z6=4l0pOF0uP3;!g>fwL&0|R7zbLVTDbVf}vw9avUZ}Aa(8dC#D1LXjHFgh1-v@rns z>i`Yf1GkK8?K|WLfuF=2Q1ox@*~;jE7)M9oKdu+tc?gSQ1I!$75j0PJwpZ_G5NFZ< zPc#nHbME3E>`Mn^CR@uWQhnL;ZOf6Ddb#dzH(Skw=1+SHB)mTn<_6`sUJVN0KV4r- z4Ue7jNJ707%HrB7*7fjF9W5oB%9r_H+XVMwdp@+ahqlmla`CN40W-<}BFnfPcFooy zB`{WDJW}xda6o4fC~DbPrcUkrXRtPJ4HTsGVa8}NjzQ&p1kjV<+85~o@^it!yI zg9Ox3pk#YhH^0}53@_)e2AoDM+@Rx~=+foLu}P=305P75%Ep>yNlrKJ7;#6suLp7q z)~4tsA+T?R=QFv!N;RtNY3EG>P<#tNz|ps)!mTLymhMpBaY2zef%X9i4h*Z8EHZ(cYQL zxSkqhRXnABTT?zXHKX7jFgUs=>a%g@f2FQXk!RoZwAya!L(DVf)Trj0*_o}lzII(d z3BXJ`N8d?LDZx0D2uoU#Nr-v2DM|MqarKPC&usDt_le2ZA)lkt=rV6<0&~th+)dxo zpsct4D+55>;DZT(#v7j_@A!rHuqEiO!sjr%$x99#Q$VyMWcJE{@IQ_VyN^gPWk=Stcngphtr9?zmGxWL3UQ81JMfABvx2e zr&ZV$^sR!gqu0S>*Wj+@9-2@7HXYr5Sk;*83<G1`>4B z5xILQ)rkZDK~3O;!&S&qHwT4iIOU*BP%4@%P|$@lYp!8w7ywMcotHqEL=ZEr*Y8($ zrvnr0#kTuwPubHsX%*$Q!DTsV&0S`V-OaL}NB-4K!2dmv9j`rVii{|d%SD;yw$Gya zgkKX=7D)dsFXL!pLNoMU(*PBDXPZsIRA_6;=IwZcKli;;n%V2Ro@^86dg`Q#CoB=#7~ex`Fo|H&MHBK3>$-7)nJfC@mvDA5<|W>$T*KrSJ9 zQF}<*V>j8ggdlVlZPOh=(I&rW+h7b-%Yfqk@JTbp?Fm6@lkP%gGM(rF|9;5$&-ZcG#!Lfa?K zO@q1H+hRRxrt?sdv9y;BsS4p?Iks#sfY-$6Vr_>r{5LHC##T5%=J(Bd3`j&^Do3c6$NuWCR1`u(=s$&xIB*(`nYu?uVcS6$1e@|{GTi& zRWHj6MDs2WG6pWU*li0!Nok(X>}v}JYGvmBZvHJ-o4*40NU{HO!0+FRhZh6!bkx%` zIZu~xG)`Ox{@0Frk;fKZ{G9; zePABW>tWd4>lGH1Q1?c-8>N6-D_FR_98o2KBMoDD^)K!S-udOc+VJ${e)R^mi4pF3 z3qgEpTwWNZnBDbqLGQsQuK(FH0$74K2=TNaXKCEUlTW)?$$xD|4O2NSY++0O6{%iN zeB?#P-XNi+B`dlwlxcF$8)ci`z1$3tMPfQs!N26Hbm^lJkMyt1>AxVRZ3wzZL$io5 zH|gR$k_5PnLjJ4H-4Jlr8ubPKVLJLn0ps-UMYdwtEUkLKJG$pkY9j*u-S`ZLW9E+em`}&uHT>1srXemli7f zL6hEA>k7foS0C#ZCDIDSY%XpHAIqitOV9T4&9My~XMtX?h9S@o0jYKn}U&Z0$X$k{>`*g7L=pM6Q!1MOa; z_G(!i&j5Ewn0wFg5fgO*jcFR558c#}%l3DFb@=|}zj(V~9(bNzMD#YI?*@8Uj5f|6 z0#7XS96oW&V+u9?wmuXkJoxtoz{#M}G^4RG5O!ku0P0qb>C!oHr-MpOUD%q*Uz7cZ z*fKn@g_+ow1m$i>?XrNTPriZHny;i&)RGF=>DI$tep!D8zqYm$KcsZ+K5&NX@G-dL)|7oBeI)%(e(WL+a6q!?^-@TSEK$;C{=LVSv0oGkx22nUN+DDp-XW= zuV&1FP2}~PA9T+xZz5ilBM)(RA9t!0Zt4IiBtPgy1Gl$~r+L_`$)k^|{9QdWWVC^n zvFEgAkXJ;(?)*)(6e1K6FCza*^R=dYFqwiNm2w&WIXT|ld>N`)9+`vS>o-|s=@-kc zmOmk(h$p`<-wY?{$4ge^6Ma9&@)%fdb~HF1e6~0~PGtjOVZpQnx+Ai+ez6%;pxJn% z)JG@W=nR2I=Lu2gxKXw{*;)+_c9^6KEzGNkEe)Q_gsNtjHjJ5s`xT z8u6c_jt!#a#+iD3V|}zxL&46ZbP_4M3VP2>3RkA;ksrntSC)rbr+!;h}JBxTh zh^(R@1_lRpUbTUg>&{qxi0VUXl@R0$zhF4p7hA))cFX-?-dE6zVqn+{3NZp@hE|NM z$gUCUyrB6OD=VwISPcrsotzlSpY@YiWYFJvb%@Kvxs~J1p*y_O2Sh~b{KdYypMH7v z|Mn5GM-uF1Nq-yPecD{Ls6Qt}rJ~K3z7~tKlD3Yawe@{PxNYl8u|Ndy&6|@KkAeh; zvL>xaf&J1`yypP z_3q|qbZHBIbKEbyThs?TL;UFZU`J+9!s@qS$UlTw^=f6^=_XZ(rJj@%`yc!TCg%0P zKRt7#TwC7_jD%y1+r7=W&0e^zNejQN**RqW{S96Uu%Bym%4KV;Eve<;0n!@Y0gaUN zO!@q|ZWOYMeE;A8zz}Wmbe~ohf(%_^o+aporNv=lu+SeP#ARl25P-}qn7u*qgmmV6 ze247FV5FqN^6yUDdB^-SBmXA6cp7Jhg27ntAQ)Q0Py(+o%(hNqh2c@q z!CPg!PbYncY;UN{!vDljFNi3lUHtk(2V8dF>PD$dz08VJ8bu=K*DVeBfVQ{dyA?^i zEUsRdmub^5$Zlx!8zlTkqyUqTViV+Pu61+tf3(MUU>?LFYbMH!HHSR$>rh(DWUtw` zEo1NweoLMPp4Ix8f`ocDLNF=3v%3#L(j>mqYx&Y*a3y}-+J(I*1-QNr8^CO>*8XPR zFI=yX#FLu#DV}veoQT5`P2R82Gk5_BK0Fd;9ELdTu6>PmD;qoBB>&j4e2r|*F%}1(KTFySS{|kN zmRA(QbyJ?~!Hv@l&YA-gfc3NwMn(KDRIrHQanhqa7jfz)pNEHs8?97Pq@1(7i@g;6 zr&sfWunFTW?)Mf5#V zqm|FANa|(H3B>Sj`0raox&<;xb5Fu7RK~*U=J8_=>S;MsC`HS`0^)0t2;MV11cUr+x3`h+AYCcx2HzGL%KgH zHZP+0ICtuo-18jwo!-s2P@{C7;HS#J-90@4JVD}lG|F*jeaIRVnFf|L=O|Ss1?O)b z{By0&alEA#)vJ4J{=NiLm?-GchW80G96~*AnyvhYxByu##8vr&pC-@` zhcnB#68;UF^fy!hqWs?hx1i?I=WLV5YP_aHn}NND$qH^AE^ z2<{7*iVlq#dCwe&|Myvb`wmD5H+N3>G^-ClSk?>KJd~u7rN?cliFy?b=o~Im9U2C4 z^q)Pz6*S<;%%fUyIIZVAULQ-wzrqIX zt*`O@W&)PC>5SLM1!E8-cfjS zoaEu#Ft-KS>I8;{Q|5IJ##*y2m|m*#b0V(muHi+!X9P5^gRgC@yV&YIBcw38-8RLO zhUR9=U;kX{J93mGd3;SH~h?81z-RZE!RGK&rongBt);Y7kZ zD`K$Nfw+#Np@EIly4Qgb4Fn9`&_1z9Ni1vhr^rNBAZR19zz25@BG!yw10aj1TbNmN z>0u1t(>B2ldG1)}6)J6|_)h%SYG5`e5+Yv0Q#53rBZW1Pb^pmezPy5pIlJswONW8_ z5aL~0>-rjPYzW;)W2DhH6RE?eHW-qgWDGi=hu;_w^qUZ`2NjNnIs%$I3eKhhl%n#j zb0fsf)H)|Qcn7Ta-j;nCyQ57MoFS}hx?RKqsjBZt4dHH&`nJ^S-Oy(_p%)RsU}2@s zAIV^)1Pd3VK&W-mViw_ft5a4E4uWo+CrNLP?`(L9z6-RC&AmCJlR3>B{|1o#Z}0dH z@AY$3clomjRCsE=Pr+6&!!}9u%xsC?vTSXhw1T|x65O3&un-v0molguMN6M%kY{(0 z#&d9VP_(5=eFJD3yEBTKbXB1W%ED9u`)NHnA|(8K(4eVJ>jm$nLqxjl0EhK)x`fp@ z@Qd%>zlIFj4~K^9Ub~b-h;F+#7}ii0zKO96KM%8%R=19^{ZL8#0<^qsV`B)UK`MbP`{Rcb`!<8~2Z7P(7mg`IqfuXUu-}-4a_lZDJOG(Z2XTUEwhgz@R9S_JnbpuQ zy3!&4PqN&Yb}HW>MAE+?iCE)OPg1cuA(90`+^}fEms0cy{M!@sLFE?jM$*LpTF1vzI_Y!5}Tr0aY1a1NEW7pW3e-lnc|!v)yi9b zi$(P(Uk8MsO(Bh)l2uy~!O0(}|0}E`>w=g*<_`0m!4gDJBDFKo{IK=Vlpm!UxB`du zJFokDGRSKKma?GW)0hM!l?ErQZ>N6l>-P1<4?C1wk-q#k5h5#o!#QXg>$8LzXW}Gz zL}ILakpG{tUIg#W>#!dYAIVoMQ3>U+*2G-_oT(N5cK@ROyik6EzqI$)dDWr9fKGo) z>%n;6OhWsu+wK3w(ZAT|9Rm?8(&eW9zyy(I2sRsIcG#Sww~X`g_(gFpAapknKe^B0 zj|ssDidsrnnXAuH^@)jykX@KT{bg(aF}i=fkVPbukw9z<&cAy_t@q-92Lp+L|GdNZ zu5R=x2aP({v2y$rY<@>}q6Kzl*N@ua2o~_iSok|S7{+W~4m+qS6nc~{jgBzx1zhwY z_&fE=Tns;T2=?b#*n3VEZqtgFqmgU%0%8Q>oPS1c0EkqXD&P!DN!4K>_?89EQcY4N z3-0}(O`b`~BmqK2UoR48jV3lIK0|()dUeq%3uT0vP28~mi}~(g!^7bKBy@`Q&t<`h zg^$yv;S->|&?W&?@|t`AFl}!Rgi)O=HA*cVqt*Jc42DJdN5Yt)of;YmRDEzpG{XlC zV7}#IV1vHxsM=<|SUEgYY_?*hA{M`d1Xf~Di5nXat$L;sH@FGsAGyT~76ifg+Dt+n zjK*IGLGogNX2*g;u1m4+d(yOz3Uywm| zpOb`Q1v-AU4;~woqyLT$|C_FVz4qppZfkFEhv4xS?m=-u*?SE*A1-#z7bmw04UtkG zEO|eYxTQc1EI2|5p^LOPk@9yH=ub)(_gj_(i3lKc?@T>zLjISC_=`65OL?>VDw@@i z4lK6+F5N+ahs2e-OeqQcCFT6bs6&Sk69JnI%u^;bv}G8M*BasLar0=lIb;DcmJbM{ z5JViX-?W#GCr+Rdnq5hLeR+Z3<7Mq4r=rqvUdVppk@nD0DGuB>~ z>?5+OFM{TP+k*GmmiMUOiEMk1WS}6AS_{6E=|AZ8KT}#AKpBB4vu{sq1GLPWIr#y! zcp-ebzR!^4%b>>n_DYL(vhX;fj+G{#LOVVI2(|ve?z(OWc|&e0g16S?7mZo=cp&a1Nn%z{jaxOTNOy$;SX)G-nCMh2K{7 zTJZof^Cqwo%h;MZe&=5pf&?HIB#U#-ABh3fWRvr?{h+V_!>y@{KEUP(*a+a0$WUMy z=&i=jD#?v#-T>UKX^q3ogr-Y+qv1gQvDnKC<{a!*SxKlXpvCQt05aA@1(+?+2@Xi% z&9|58hI0KQQB!ckPrgg~Q!B^zYEyMFg)b$vJ%60-do2_z8(UyY6YDlHW0XM}0LEAK zRz77R# zTtMY*!rJyza^bO&;GW03zkI&fLZ?nM&71r5CscU_jRqza4!h09oLcb4xEUyL{ab@J zUBPxr1=f|V$dXgAWD28bv9>;YkDcE>RoJ}xA4UGlPMnjyK1an!asoD?N&X*J-=?(f zW9M4qGh%c%FUl0_8lQIJd1{OeEnIJw!dBM)aVCE+zz2n6fQ(xRlP5Skz*R`fth(Py zBv-$e87sFEQ7?`(z{IFNSlH$w6Jnees?l}hMb9(NEv{qZ#PAKe> zeUr$mFOLNq($d7fVJd&|4bTTf#CHL84`nQ^zxpP2WF{xDeedjkVPmUhxfY*b-rS0m+E-LG^} zOe>uDh^^>}-sjT#h3L&dS5w6Qs^(vhdA2@Rf8e%7?;yw+%nl0+8yKbI0n*?1D{sTs zu`VyHK9?>eZd{LONhx~VmptBBZYg3xv-?)GaQB6Oz3K*8y8EtVttfR87AstQUaaWX ziI->^Ld<U^u+C3medu-WwsmjQKMOqocPB|k{$(qu~@+N=}SdrIwE@2TJXlw4B+ z3p4}sz~o3ioYERfVqf^v9`tq^Joht=&Rl~Ai4I8bdeLBM)5lRxct?D)6s3{t$ITtNr4rr}^ zMjMOrU}vJR&W46}`{Q80fv=)oD@Bc>`Lu)3QEzjC4Rb1Ch~{f!qFz)q2S<2~Sz63T zQ9MYf7tF8ujK4l=%PT2*w|^+_6xDLf6SW(7ZRPk`K%Ws7nRyp<4Qi#>tiFlkqRGrrRlGEDmzm3tWSrS~H49%XOL+HgnEDwcwme2Vm=qW}L6u zadxRGX(%9Kq!j1Q(e<3A9KO^36Zg-FfwGs=gyo02j5*S_&C;uSeb-Xr(Mg4i4cm^I zljSr6h6Mp`-Ju+8W1NxQwqtkiJ(O}*QTYynTJw{q&-L!_YP3Y4@_5)zyNIzqwD^d< z=02rVsTvhnc%t9Z!s0^LExF*J<;0_O!jc>g=`Lh&ObZMT67&)2>*^y^#MMFg&cvIi zK8-rUJqb?u_L|<@wCnEYMmx(x`1ocCt~*O-)kG7Yz1ib6@DLB@0a2X&l@EGanD1$& z;VQ+yTGCgTb6o2#l(_Gq*jC*7q$9C9FVz_6N;uoUzcf`6z8)@?$u$6)2qii!RO}-k zwAU#YfXnwrULSsk{AVVDcY+ugCjKeK);?R0ySOk0c%WjHDs9(2lMOfJ)i7$S-g0m; zN&9*ht>&+g6ZZ(`j5#dI@QSvrRw7fAQ}HyNg;c_fAS`cI=V;fD)L_r!%T7mgu4DO< z=Ut&{4u{>gmXBWJ#36cD(w3jA-FhCMaA`DKD1tuf$t(idHHG3YX+0t35xTodtuQ-3 zk_dUV)}vSR7ntEv#rx~N@u_8T6Jggqk{zuBHLLwoR-)VAy>tba#)>qV9##msKjnCU*jv&#)uOga+OjE?5HL|`H%`CXPIl&&a-|$%#i81wmbUw$i(74W zv2}^8Gz;d|sRantWtx9B?JCTsN`s;G&ilb?#)da+e2Y{B^bK$Vm6O;Q3Xv?7(j{Yp zCCr&(pQj}?y{q*P%Js&y+f)moBf^H3SuV5_0@QbO^Zdy>C>-|3QC}GrMpmR!EjNv; zybW;=Q*}6+iDVp#3nt2~claJE^$A-%SnOk&Fl#p!`e4fRo@FX^dAC2V9&ZQB5@gbE zdLN^W9x$6`%bd8A&fhGAN<V3fFb{J{UUgMg2| z-xZaXf?hQC^azrci1K=I*Lt?%;8P+?k$>s33(Z{lSej&8#?-czT)>4`&;O8b6(PYP~N!Sw{B}x-?zWxJ^!KHA&heH}Z~8!w$S| zO$MePuTCQdN(cXNtb`71tmf)>HO$rHjxP~a%p3%dc#CN`fe>kocF}<* zky=TwFv8fro=NNeO~boqsGPupWY{7L>psI!ag3okG{HIRNQWSCU z&yi?Loy$1)btpKbB~3%o0yNs-k29gs&t|<}2XD8qnu@ z*3;m*k!KOSO<5vXtX8scIk<$fb9!f7ss@8M3Bz~Pja{!>``(|ma4htSd9Ux<3X5<2 zn8_;g98~p#yjzZ>hA1$}_FTb7MS6a!LP%RroiiDz84s3p9UOSOzKUZf{VUv=y2)Z1 zwMLR?A+^;E8wc&FUIN)9tCe+Aa9B7kGea+I`YCQHz^?ia`MU!4N+^_g^MmDO3Azh2|V>R`&82k*>&Yql+#_|m~@8iLQYPYQ{?OMAn<0= zT)V*$l?DWkYh0GC{<~O-?H?=U_g)h6Cg%%eoJ^|?ogVXt#7^hcXC#(h9wk5STdLq` z=mlNjQoKl7xSg-SggBi`jg?68nEP(0Cfm(N=vvJ>X(k-&^YUcJMq;Y3wPZxE3ezC_ z^-7v*&9Fg~GnSnc2^V9oHx{=Ns)SO&bK@{olICizzb~eN3kvo3v2IZn-~9;~*pwWpimCl#qV z;dm!p-`^VM-lrOX`OiSNHr4Cx8hc;=MOM}K+Lq7GWsu>{Wzx4T;ut!K62qc z4o~YJH)3XpoHZ7h#J1DXsiEIZk)Q0zK+tl!uxvk^VxT-fF)w32rH>sd1l%hjZS!YR zQX7m(DF$36XD3MzG)GEbv`?05cFnS+enPlYby!P0y0PEqlr!J$W?BCP%ECjM-n;ZdeSKxSjr#p*`cY&mY% zX@Y%UUN)eA4irzPfOUt_&7*oz^n7Q6%#CsR$wdC$C)h-20-16<`wU;11IeUjy|kPCd~33Da_qmLfb&^jSP&&aMgW;4U?tStFWlwh>p=aeJ3tNd^kvms@f6R^G_9U5qct<&HUU@t-B_98|v$#}RoL)l>h7-js`Mf*C zIo&#iV*2xm2PodU-&A+`%#tT;N{+j2zLmS^!=N{!8u;EZ{46H-B48e#i0LQ_Pf4N|~|DP7c2jlQ@C3#eBtk&#{Wj! zmQ81iuM(_nK8^XBt4^~F+(NdVR|hdaxQu)5PH5T&3SMzN5KKMrcu;6y)(+W8pKw_XczlgT8P z2(fRLloZQMw-O13-F}Ggf@b0);7wvGF)cQo8)bgR;s7&OBN9?xriP>l4!r5IAMY?EdA9Pb=?{}(tdSK+*@A4i@aQfe#b>Z&*I#UUFSJW5Rqnoyl^OZ6H&G)# zuEfG(7z3iDIT1H><{>7*B;U2m8Pxdd?_}7MlL1XDWqXU6kGvXke3YcU-C?hche&~* zAcXszc_i`*#Pldl5UIDmZl$Q$_|R+w9#^vPHF0+?pZwU!b7?J6rtvD=a<*ZhfkK$L z>~QX_${Q=qr>hiMsZ#M7tjm*DJ#o`&E=bt*G6|eKuEks=f3E2fmm-f846==#FimMs zZK9^Q;-%1G^TeO_mHz8D_FZYVibPkFOcW1{ zbQd+3R5N8##L(#PIIQae)|O~V*TQyi`BMtEy2rEz7eiRgc)Y@kF_S#Z=G=Q5)`cA* zg5+nH9|L4^6%}mNi909RYl;GXeK1KdkByS)X`SCG<%%+Y_GD16sqryutJIk?Sm5VD5ws&5r@G&%#u6A9gxV zWPonUIRcf-IZP23KN>l>wZ%3#qL_3 zxEF_uldRi>TPNF(r6gSV8ACRqw@871Zu>2vZkn@HRKfK z-9b}H*V&8anuS>*V!gXu62%rn`)Dk8(3SK%LEbY;*FSvE)5L64jz`uAQ1$4Je2GZ| zmuJk5GEa~)4-|SHQr6(wR7fDd=J4-OhJJ{-AA^%a3CtScwmvRp48KK@-2bWCP5+CI zN9)|LiE-0IPOEZ1|(i_@MrW>Uk$dEDA#zP`uL3KtzXidS8y9Ahc>iFcqh0=na(Vzw8UyX6FqT9O zeValulN3ESQ!Jh`v1-?m8nIAV0ZAGA+P*@m_O(34Mmh?4VuuNPJp#cww+WYDZg-@i z1JR>WuBvkk*>=!ClvkW$9rPi$4c{x)^dc>2=d^ki($aVAA7jtI$ce_ua(7!@ExtiQ zFQHTs8!#PM>6v_<&N}!p(`#3pc@3imiWC@NqJ&IWc{FjdoZP4hsA$%Z$a27nHW9vgxpxaaS69_0Iab72^Cw$C@bX8GPZg8m-&`Ilo?rXRHqOW_Q`88p1 zGFCEyZeX*Z1ZTGTSvkYORko^j+7VUQU0;4ZD{C86rW{7`x&my^i*?zTx>3U7gS)lX zNR2X{%VkIxU(55ZsIA-eGB~T#10$!vM6*X&@HBga4rO7b)0U8RO@IjEEDU0|$LQwM z=m;3(nh{6N6BkG3#R5;_eXdXskK4#4$y8s-bfsM70msDLxL+f;9tqI#GbBT={{?qY zrEb3W+^NsqaW*}5wu*3c6LL%eo;qm~buNK0r#o&vW+v|jlSwI3YCIO|YVdPb+$2>R z`c=Ob&=&P~k2OS^UQeyj?Pzp+9emx@6;|8lmcsZ9BZjnU7)Qvt)Jy2X2SIIRY z;A`@l;B{trWnGqje$7{=_Ci%7We6G)V$o_W$7uF_feOPKSZvoGxnmB8{p7i9nX8DF zhwM5&Iga`aJ;W3RjP87THbo>}i}ku|#N1@A%7=1QRZh>X0wy{=m7u4oM`jN?XX_8g z^vq#TO>SP{&aM(L11*)Poz_n_S({u|{9CVZ3nj#K(4K9A!WAdf5wCfk6YO;*p0(}h z#iM@~7{}a=GbN2?n`cPG%o&4L2Ba^$8)>&gH1&aB3qX1cNxL#Gy{H+e35)D*$8O=gF~XS0G7 zB)`mC?h5Dc?>9407$eFMM^nktrXB{H1~@)sl6u~)m_oDr(t(|Wpbj3#0tpunJ`hfcDhZod#D?-0<_RPurVwnNz2VSK~TpL4BW z9jwF(sTWqVE(;+FkTwQ8H-v!-(K->dvuKfO$3-=|CRGOqjK|v6|xRY~w1}BTbs@hF`4_AubbU~#Je)p6;s!3$YPvf^742E5zLyLS5u{{Z4-coNH*>Bnnv|Icf>OKRZAAY?UV6@gLCwA2$4x?BlNnNkj7XlW zka3+Fd&Xq`MOaab$V0%vOa+yp)pg>^4&6eDVkclDm%q$rLo-t0oN*>AnrL6KvH3Gh z!sJB{eq?C^ljS#~+7qVm!<EZM3j7t>rp?IT-W5gX{)EUP|$i0hSGk zR2|QIj4n-@##Vym$wCGv1|nCT3|9umbABXizp z9FwRy%E|Z<%q8ElZ>>y`*tjm1R(?7xZ!wN*R)I`)y^-4Zq10Dc>XDZ8Q%^Hx z)>Lq3G4&{3pui+id}BvCHNc~8kBc6k8)G=b)RFgMk)c2H=gAwj3D=1E$n-8z=>@$w z^X8eOS;xWN(T9gVkpT5?DAAf7`ggj za-a_vyFVT{ul92mXVjyn3pU(42D7)56A!Y~cBXTb%|$zolq%{r`PqE0TT%_K_PRbR zQWHNHO&dBRl9@qlQ)>itn>zM#reLEB#Ck^s_4m_@=B?nXF*kcW*MCeV8CKRl*EP~i z&&6#>h1*oTAa2}IZ`NrPz0uIxY!>2Tz-t^T!}!;BClPZa<_`ri%S}Ms(eGt@ii0S8 zr2@2*Suc#fCAB4lL@D7jik*|y1uhDgcag12;K}r5kB(CQV7i1;Z-6H_p(d^5Cqz;J z2}CB)t7P}3auL5aXe|lyj5oGFETI|t7LjBvMXS-uP^`;h|Lmn%E82>b(g;J0zrW-w zoa_8V?nz6pdZ0tlr#FI?f|#=JvJ#B6CuQu~DBpNsV)x;!(dh3}c(M1<&3X}w(IlK01 z`H9fEqj3ZGIVX&+l>!!RJKdeLEDaB1vwRX~&m(2DbZ65!#`sBarBa&x=y(R(Xo41% za%0$2jJ`#;p$EmaVxfFq{lpUp9Cm43~dqSpxYXUYX0<@dd26R zInFQhV$2M_;$SjrnOQyx$VzA0>E5hl5+3RkEyNu`G2*S2#{Ejm6~}uu8Y&Z@J3w|bB#cSlF8Lr9@%2ryM#f7&_b=JpPmw1 ze=U0cdZJ$_Ymp-nRlqUYYe=CdzbO@cQXOA_AxzuVn=gBmX4+y()GV%NEx-(FY3epn zpoWpYCKz4B+xMEeHx)Bo%JUcLG3z*?KPzx%JU*D4-h8J_we#fui(Wk}kWqnvAR|mb zrgpeEis>g(l6_%(&)tzX34YyGqedlA!qvYLgp350_XZoMTn(9$7OEv70JR-yNOY~<}Yp!zQ_@{V$S6I&>SUZ%Oo~}-g(2?jMNv45=tZ}gLi6qVA>~< zcuH@^dZ6rj5V;?XwGO>f5mgZ&$z^H|Zh?h~puf%y%tKRAaH28Z8iu^FT`a7H2pYuQ zcCFlGujozQx_@o`U+oz{yDqaOG;=X3?LGHW0#q;X(@(m7OJHFHNLhE2>O_314$HjW5kp+^yv8Y$REJB?50(*n`US&31 z+=iorN${LFGe*G8!bXnvK*?vIkGE$9{p?l8^79lCt-Np(w^?xo(KmP7*+-+fO&5qf zA@>48`JTLyD=PY+H1n7i8fREehj&1+kcx+DMAuJ3Vm7g#EYBi#pQ*6wL$MVCR77xh zq@0pOjN4WPH_4fmB2-ro$Is_S-%pO)$f1v?_78VU%I~pn*^dvGP+xCR6tKhU5~;G4 z&RuxMhcMqmPZZyun8fEF+nX;ywLUk$7uN4Ms%_ogh;(h#vs~5Lu$q2*aYDwCbBz)r zAt4d`kr};ura=W<;_mQGkbhcWaU?0%>2{wgj-1>1qZmB~SBCrQNxu8Mc1=UzlkAbX!eBBcmo)zb4UDd{m&Pm9Zj=-hQCkqno2L`#}6PMpJKeSw6(2jjlZWN`vJf0J+kiDHji^S z5nxl#koX0Ax-J=<=(glD`(a=CkLKjeF)Q@;7 z{BUQEaQgv62|I~oRS41xeI^U~9ZU9Bn%>7M zm%Dk6>)oZ81c@v)ogULhh3qs5xRkapX`rlmx3D3#MLJy#K3YZ=RB#%Wposr>lh~#b z*iS^>oU=+zL5(#cK3&H9msaKxVl`LOV2So-#~P-f8xtk+v}|TomJ)JUf7X}_DGp=P zYpG(oTU$7{+XeNF1Fa4PKUlv{@?*H@AP zzLQ!R$dsfU51ZhQIz3OBvyL}J>%`GEA^tPi;>AhKT@49Z+Q8;`kOPQ3IbOf4K_I)% zh`!cT5mT#)jZsDIE+bJO;_7Jr-E!2An$S||f{ljH*eXmEvERf#&CVN^!tq@Ozea3s znBJu`jVTLPiAIBUE^F+)H~aP0T01|E0?_|DHzo{kQrdyw4@x)U7mdUe?3Kvt-RK%E zvd$L>kQ2Elt-%BFG^>v@0ebsgX{R^e*Nm1*7)*j~8N_^|L9!6dl|*0m+#5;6?c2Z| zb8)FHbQ7RaaUV?e>x06J zlXM@8a?l?0C9aOx$;Os+gffINWfO2DJzN5eb|YN2Jtk_{;|FeIk-2VP9n@n?7Y5<3 z;08;3Bz}!5*?+8xaioi(m3wy`yzIJygM9{y@eB*~VK3ZQXyu+B8xb8>kBpMpX%rGL zxoGZYuQdc2V5T#L)dPj!WvaSxDAc+^* z*1SR`s_25Sk|T@+(cnq~N=3P-qZ+d)c6uI#Y(@toDX;7UhajnDNcL(`oUvuW3lQ$n z%$s-tRZ*UiLlxJcX(eMk`}KwSy4nErxwN51*rcGcX;FH%kKkeh6y6ToiM#eyhDStV zYNYxcjM7hYhNV>3Tb$lIn$8HVPp8DgsodXGCOlXogj4T$E}BpH7)|5vxKcn|+94=l zcXPQb(3d)N8hx|UMD@v7DWitH0S2{S`DbMPNB(E;@H-}i-J4tw7V7P_M9d-7AI#WY z?Fm)zS9d>X-j;O!qIGSn6nHfc`*d;l+Tx{ck_-$oUb=HF%riqG)7$7_(9eyv##FiW zp2{P!66UhtcH?TANkTVr(y{s?AP2z>K}V-f3v2QI>QF?nPId~zXeFN#$LSEA(L@zh zM+vEmHfg^m$h2IB_14x>AWbub#9dQxZ$FC&!iKk3Tkw7D|ulh$FD{?IKXIxSGr9yFW&e;=K)A|@p zT#rXc=03jysi(aH%3>uY#3t_fR+vPwC+Lu+`@=?pzPe?J!Q#6Eh5-vulj}2n=&gsp z%A87nE?SEO!eY7Ek%2@?BStQ>nJRyvhP zdz+`x=V4_5n?j+*(iwQ`=6*X1q(F-hy1J!nyL(^2@!Mv^Gb~ahHysu8^D>)_tZ6wf zZYrJ3Hz)cEa5=D`+>2Do(Uwk*14skH_@RN$p^)m6bZNx|THs0xB;`7T#DVks)% zO#4|kS$gh?>k1x~#wW<02<)2hPlx*-sU93rn2WW(?L~VsT@QsXv8zVd5?(_oZ)`;~ zUw|ZuTc{NC&5Q?fF6&n&EH||J&U7plW}~Vb%bc(AL$SHKRF^C0HZN(<2DHRwr_}I8 zjZur{{ds!A1tyRw*{JQ!(;%NMv6w^DGv<4qUAwN}pAsvPGX>W7{Y1j%=G9fm**+`E zv^;izJMr4&&CX|eDh8Icl)&1y-EZUqrGPAfIp%NSkZGNZX)D!p(RFM<&&wy7{eT4` zjAz%ew~?<^DMd?;N*6_^pdA0ZtSXW&Pz9ZAN6SBB>tYExF8Z&YnMP)aFKT#FVj?ox^rFU7sMySo;5 zmqI8M*FbRzh2Sp1-62@8;Cb`RyfgFsXYxBA_P3nm$iDa5>sq(8$$e*`_J=Xf2FsTo z!z?SN;;)E<8Is#J8!0zK@%yZzL5U&JYpo{|%Rq@xEU!*(s%5EXR zh&&1_(Y5IszhI+c4n9+6=$@(B1dnAO&E$a*y<86tdTwL-&ddK1i-m}o(CZNAUzD_rMU2hv; zF28kP%&}2qoDk(o%b8SfuZNjDqtlQIy4hFS3L_QTbiX`WqB2L3s#*R!+W4VKZap10 zQ^dDO3dr7=2l5WJA->i&g4#N4zkbdDY#)Q=0s-CNrAdc@|bNp02hK2>mII8N=y(kN44-A?i;rC&;^>(vRCY z&$>yi!bh9SJGLQ@Asw4Q_D&qnyz`=qvvQ%9!d}mC9QaGln(exDp!+BhQ_B5!0wv!w z+B`+YR(rvx$tG_4DP}xu8x1f{^5@?=9p$?}mD!c|r;4A4cU-*)88_&j10ga-IBTxl zi-PLB^0m+v$?xlm-I8BlP?RWzQIJ|9Zw(;u z$f5la0=PNaTbT7|{A-mo1SY?WHkxINt-GkyQMslN%W}|w)39UU;SAD&0&H%{!2Tl%LzmQda|BdDbM?STs%G40wuEL$_vK&di zu&TbU5t*jyQ4`qNW7iGU$boljXcl!`svG^W)4_?1|DiS&;RkwZlH)qez454%x&nwq zq(K`CK0_I1#SUd2vk6iJcifGJ8LsjN%ORYByASj$=5{-ME8UD>MVof+hvzf6w>1LZ zpmOiXu?M8rg)Zs(WqnB3(RSd!i;@GpW(Ea;t9uh%{?@$d7t%rplN+3PA5c+e{{At6 znE2hT;@y7A2E8QbIOm4J@F+gShsr5Wd0#0n4-o(EEEK@Ld_h<5vEOCbe%_5=`n8%> z#xv@3OF@)!#K^3rAl`sAO3iBu4F3t2grJl{?y-oUUFhTD(fPwJOU?riqO@=ycNRU5 zw{pNr|DuP-e&@`a3r{at^{ahthA{yt#~qAwWFnCQVLw*FwItf4M1qze|1G(CR6|Vi z0PnsV#*eL|N=lPgp^pb09ryH=S*Rz%E;0+?9=HZFD$E8 z`aoWN_kDc(wO`<;nNod13aJxD!)<5Q;z>Aty9n&-sj?RwT9&@zholn!TcrLH+O>Ga z=%hrmyVA>fN|W64=MSdYv6lMc@fijZRuN-Z-`I$9*-;pB^d25xc;L(&)+)qhQ^x36 zu;p2gyEgQ{gJEJezjfgoe#WCav$XfRTG}XqdBlab@*fPH1EaKXY;X{*$nO#Ncq8_A z{-)m~(v12$)XzsByCbZ&c7m1nl=gvHz4A?oSBocuw4`O(b3#5;`N*)*pgeokB4u-G zh7%!z!5%zH+^GB3roRZW+(@Koy3wRFe3mHCv%~{p=eU5*cqgB^2_iuNyW~8>G;j&C zQA+x;AhFq-gD?r7^eLtq^Uv%*vLlLC+tZfLvUYxqUId#)VcOQ{WB1zvl$6t!4PIb& z(-yvE8}rHK`J#B8JtHxd5j;h+W;)LE%4qbOtt45%#=RVMfcg0?%ZxL!?j|@lFP9t}!k0 z5%Nx!@RKB$Ph*cr=vR{1Nw2yvqjK~pS)3_nH=J`N$V}fMYqE z|JX=}Uujd@qm-|au!{#!W2#gQ8WlAQRjwEqNXr+CQG)jPwlWj&1T$CgsvMk0;DNgo zta$cUPD#b8Y9$Re5cuH~Ih*vZ3@x}JzRDU;qX943O;nh09U9uo%PetqtZ^=rQXPQU zz#7aJ3WP;_=TdX2?)7Flj$iiYF~sq5xyg-rCQF(7#%609H0heD@1$PElo>Z z{F@03j>QZMm(BTdi`RP;NHyI2qgyQ`{F^Az6{OsF#2y@4Cq0@p)3HxCdlkRU?px*T z`z@gy*j3Pt@FU%Nh6YQ&ln@*9wW4nWM|7ebD6;d7kk07rwBcK05|2WkBCh$ieOc(! z^5PlGj(xV6C#N-@M8*WY^eD9Wa1@}B%{oveR%`G-&+LZ}sMTT8^n$xF?^56IED8|c zCD~dbaV_M&?(HO#%fpB{I6AyKM{kTCd%4bsYA!0Ah!QV!!}uP zXSx#n58OugwF^@*=aQC&29GxW7`s8{*oXLX`)lO_S>_0n<3DRs*5`2yL~(p6R*)%| z+n{6%*QLC|-Gz!$^v*y>49a~7?(cBU>eL16s#(Hk63{**7*xi!U^{^^Kv%`^U-_nRM# zn!HQQJ?r*Hg|9aYVS(%QR1W%Z(JqcjP7upka}vzisrELCF6A8%2-9ve53IYmK>Jrk z7vztEi_7Vhk`~#ydUB2BRFf7o+N2B>bNHu3m&jvux>Pq&&uL<98E5i^rtMAH9X@?h z+1O)p{b;{IvwV+%Z(EERjgEYxUl9Z+ta+iMUmw*8?-o}rMlFxmXt&xkiV^dVIgp&R zJEJfkn3(BF&Gzzc<_Q33<;{AfZt{ms>Q$8 z=5)X;_GF#TPMr9GgRzkR^k_GvWte|!%{<5PlBe=taV|eXBw|rjeVPReLyUluoU3Fc zbVYU!VU+(Q6)kh2{3YrhO?XPCcj@BAwd8B-=;Nnk-qlONzu*LN83yR_8xc%cAC2(pbw@P!9)b5h zn@i$^CP)eS<|ZPm&wH)mGp$_WVWjw8Wgn>=SH*0#4#f;)`NhF}vnK$*1kQkp2I#*; zgMKVsvv5OdqioqTJ+zOl>-}X|N+!DK&gVFIi~-Z(4M2}+55I@4HSMP3AnRM0uY=0o z>nvfnwH1SpyZ2f1ou?ldMzm41EG<*$<`fwC)2r8h;B+d9K2K^%*Fk3b{8wPXE27{u z+k|1yDciGaW}09e!4jvhUzv~?|5#cFq6J4v<-BfE?C}B8KiM2`>?Xgq{234+j*Vb7 zOt84BFh1J1MAqkbXDk>ok>H%36WJ!^s>*xEtG>RfHqPDttjOr-zsS0z8wnsTAF{(9 zZZjofS(y^v+3PXh{#vbe|3OYN2sa7{o6jVkPLH7*wq2>l3XhXlJj|wL{7$RGaCX=) zZn_(CRjT_J2k~@gm=4|h@ybY!=O7iK`OCJg&&&3P*87*jteD6xXdH-`kV{#IP0!^u zp6tEEG)wOaoJREKei)huX<6ayrIfoV9-8!iLsAE$r~39c&~hXIZ`5} z>c?aA_T}2zwC>Su|2-0Ixo|q0w|;n-Gb!Y+QQb67{-R0c`NuZwquhr!hx_NOsi?pe z^p5CTP~i7Nkoe|v5%_F^fZGF)Odt$h3_-72w;LkW4BeI}a_PL;F8Va<+RLa!tesbd zZnkx`chaL)6VIQ_2Y7r)a2|oePQ|<^ec!w^KAwHN(Jgo?88N`-*Rqrv@*G4mbc*=7 zy0bldjv}UwY>3_%w*>i1`hlK2ooib`JzvxP4&v(*l?lu^AZV=bcVK!>z@xaojT8?5Wd8i;Az{q$)`fG~kBH?orl{(113X+=h#Op!!Ohu)4J36H=dS zWe3Zqz{sHTd2DL}{>Psm(M2$LM!_gv8t38QLHb42a)=|P*8jqXj={Yu<`+k2yhBF~ zC{XR)-Y_}C*)+h_S;h><$IT(U7`s{}=p`i>4w=gON=?beepEfz28HRi-h+a#sl<4rm*uu;CdjTsU>%fU3Zyx8c{FsE zjY!XYisLu*f?JX&wQeM-y0AD)-Ez@8>p{bBoJY>g_R7B&|2eSbmD|mpdWo|iMF53= zA3pgk;BijA%dQjC=AiIU-F#Rxezrf50Cbr)loKHP@ips%6G6vRHrGjjf!9S-6J1>3hKbMPT=i7l?j+tWicSqrx1 zAQi(=VcZ|-RI=%o3YHZbtS{o8owM&+FSx4#_NwN?IqNE03`e7pxTf?@|F5UW=*U=^ zD7~4coL3=?!x|`B-6o2XLUEbnn0hy-tUPv$-{@?^^ASDpe;`@f6x8bz@h}ysWQjs{ zq%(@abwrORPNPJCV`+9p_UzCy1$=Axj$r7fz!QEwds3cPFB6~6p*GZdYT;lvPxyg! zBqd*WN(o$M)`nEFIe0c3T?9cn3-oyvL2om;uc&?sWRJ{p4&j0c_YGX*rNkqhaAy4N} z>Tmxc=QECUWdEx7p9>h#>+IdvA|hgR(f0Z+HTJVVHIQ)YX|-voEXmV@Li=u-?KqY` zL?=UXNq4VN38+fRgExSQLL^!E7C$41hDI<2|9acCa6*?H=TDAGzH*ffgQVK{(SD}* zMG_Poe7z!FAfTp9(|*5cI?-Rnb(|rSaTr!*UeGg@fnaF2T-fHuG|LK7DVx%65mr?Y z8BWuAKaOiPTgpD=;ZB>TCbsiTsL>(WMJpb3GF9yz-;|{pihVd6Cieftabz*pIxEx; zyy@$fz1;DSCK~kXmDJ}7^!em+8}eB1^}>Wc)JejcN@Ny<^&p>?xWDYBnAgFjU^#1* zgTxIj%i;-FY3nc+$}-aM*>qdv#(=cb8hmyuKOkh)jL#J+3g|<`i@?gdJIBXHofcS{ z=9~K0hbMR*zHq8Po&zVHX*3=60SW~V2`ebeS&W$am@$0uGAcM38dA@RbTdP{rPi$+nMims{K5Q!zavLwGr9gqK& z8cIEfsozeHq&Kxw;VcXx8GlCJeh0Tx$m1h)jITATwi9qeeN7>|9Rl9FC?4o97npLJ zZM!Dm`MTZX;y(P$(Vcg`TL>%E2_s}Vj7RRUfit!8 zYG-e4Pq>m?G9wkV@EY>r6hgr^xsTW#~T=0q|9XBCsw{+{5_X6SX}Y-=mf zYv*M_k{_X#YqE{P`n){cT}Md3I?zwt-5rPlx#Vdzmjq1-Wn!eZqdfN~vc= z8E_glPmBklEAa;rf8gYOTznLF(z-)6`v=;^o*GeK93S@%_PGMlOaas2mcU1G-@WHl z5a%kGN(Vfg?rjHr)wlm;sQvQRszTn@ymK-UNFWNozXKevXR_rGYTxz!V@Ec-P$Wb2 z+fw-Injo#_7s;S!a+R8EXKjmmyUMp~D+@b0+D=ijz_tw3nD!`!t@!& z4-56{bVD`<>Fc9FAL=K-E%xsa<+PE|YQJb=9BbKWz_Hxwam?5(9{da*dNdTd&F}<% z_3N*|Vt-WKKt@sK{OOb@JfpREB8=$8PG}92QyvC~j(6aU6IpIR`2msuN`o_a69`Ns zUfmbA(E-!s)p~P?cvPtg{P8Gj63bzV{bhgmFm{aVMARSQrbsM!_LHyk?3(DtW75ZY zFOeR9fb`kI-x~={En^N5Z?Zcr7h2BE-4f^heWvLEw)<+!)sQAXivZVg9ucRdhUSeV zkTD2VlYGAZg+<5ph@iXZd4H2)SHB&MqKXiHXe)>eAQ=}8;C5)YP)~b+@*jiiYy248 zceXk}Vst$;6*49=QOZUuC`={? z8`(axGL2|`<~`kWm!X^5L4^8xN_q)nXF|}Dd<&8?ljAd15iiHZ{1h76f@tw1PA7oV zH(u8+M@e0khvQn0^cgX{gM9>JR|%c5fe+Un%dQux(f2r%qV^}g@EBi)3N0E)!5wR}aB2 zNj^K}Aj;umy?vk}fS3Mw80j}63@j{@Nu1Jn;n7XU0eS|Lv-Ua$T}T~8cP}o~WcgnD zeUoQ+W%f-XaGAAH@d2{e`;L_SFAP%$yz3ve0jM!C1c*S@@kd_HsY{3i?L z+f@CwYfgAzCtNhd?Ayg0Tob$XZfnZ@W^_%Q4py(fZwf@koBt;+RE(`KQ66lJA-)EM`Y-5P`rJs^hsP_lcRX3 zbI*9I!_5_7EeUpKiN9g^xB$&8NoihWe5@9rHa+U+5DNxcp2#JivSO!}7PJ?;dCQ>T zEvpLJep5AEBE(bYl`z?^e)QUJf!BV%t2uE@&8=@{oQ~3}f?k&x_Ujs7UK>$z@9YCu zHwv9mrpzk?cf>DZ^8o-Oj8pC{ZxfrB@c?=7zFywna!13m<^mSG92#2i5PaQ%u(%^d{#3KbC zlFLgY^V}Lmj3iN;a4X>k`rqr(4pm(3s+kzv&T$hK4ELgqwHZBxQE5f8{2X|pU27*= z98VQ4?D*3xq&0y4Bw+WU{rTwU7iWw0p0on_`e&+t@sjpAIRMs=1?{>SVoVie;g<(yVI>4ph`rUDS0(srJ6E=^F2d8@pC;4D zywQ3YhMJlpV%+)al9~?39sNzg=O=jJTMm;SD{6-Bb@q^AQ7$I_HAR|E1SFZcyM4#i zK8jnFA~Jjp@#4YzAQkvwbS})N@4aGTq0h{v-#j3 z=!Jft9`MyUp%=X^-ah-z%{ImeaY!1*kJZ)Kf%p5m$D1oD@rO#M-gAOo2%=UuV%(q+ z^VF|%K(SoRqu(rRlO1FXK3qi`Hw7y{7U6lBYLfvh~&YQ`Q~?iEWyKU-4C(|FLI+% zqZpL{?O>Cv$j6lz+#kPGZZZChD*1l9TGy_-czvV*AXQy8=tD4`w7*pAzvQpLZyZ9s zVqD|s4<86U7p=tz_3`YopYG3Dy3Dd!ax3`0S~qHemKop~OFn@OW3s*(ZyL_Wr?hQ4 z=@$k(1@)h{u70C1`oHPjc0m%2#APjQLhmD=c5EMc{+Ul2l)})Jau<1I0VnpVH0=0y zG5ch=gjV_sQh>;ayX)iG7XJp}VH}O0&Col}o3E9Gy_J)8(~PeZW6W>%mv&@c-yO99 z;t~xyg3ukZf|?L+AmF+t#Ca-GtT?iUu#zB{2@?TdWW0f*>GP>`jJrJSR{oGl)dE75 zm;#S#>o+d~_O0R!w2wV#X@M@`m}iRHN-xfX(A=9megP3Pm`VarNwN&zo+SDlkMsT-Z z&#VFQ6o_#*`X-N&aQ`X5&}&NtUZ7Ai`ymZDWe9e9?37P^%7Li#t7xV2+DUMbM~ks- zEs~~wLC8jZ5tCf>{dKvbQUSDpis2_}tz5TLpLCE@P^dCgVEYVd3+KxUD|Vhb_LU=c zaP~AYF4Bf)(!Lyq9OvbXRlk`gc#(2?&*G*re^QE{R_}@o3j8lQ@c$oly~HrvdzWv3 zWmHeP{IYeL+Ta8Kg+pR_B`A5%@DYsh-li&G9J_G17sI+ymuJ;^4RTCJT|4%|+io`6d@ z5TqC4K8E!ga%4@%eC+Qpf4A0_{hZMVV~Bx<4b7FGI;I5$9cD|W=$aV@j(&U>^{h15 zqXA)}$B{x_IQhBKo%itrJ~|{tEC&?hn}2BC9cf5V!sX(^e2vv>qn@HHX(iD!bnr+7 z08iHD&U@p!S(8u+ENZ&bG^}{fs!x3?Daoq#7aQXGXqUQgFP3aSx8A zp0VSf$XSyVC)o5FYRPGRvifEV%}&l}uDR_{#8X#6hO$)(6rDJ*%K6vYw(9hyE)~b2 zf{&B37$LASMFw)pX2Z(q4yD*Ah+cX83m-sr<~Q*>$h1Hf`B~}>fsjmvxVOR-r$WlC z@j{b+#lck@fIoYhLN`JKcZbazkaj&vEdG`jOcZcU(!>oPBe(3^9yilJp#ky^&76Wn z@UwCy96pK7q$M)A7pe(rSd@PnMf-U6l$;91$4A#r=hkQdE-eZWc}~kCkU04KR7PORFyhg5Bimg^Ri%B zf2rg^dns1wJ)qT1bwl!zsfi%zt}6*&<^z9vfqf4oas`8fh5sZtT8p=6jHcFCPC_zf z;Y98RIe%CQ;5_;3+RohX zZ35E@q7|Yy7&{AlBp*h-8=|Z7W*9Fre?681!ZX@(fa#EP2+dluy0%`kP0ppUxP{1h z0cKq(JA3#wGq_G6@e;HndsvT#vko;%FirC(tr8lKbdL zki>RMOabJvDv!uvNls+yTo^ZaUuasSTc)LA{P)QT7j$CN;t*A$Dym{1p8y7D*&Q;M z7XRLw@PzcyPyoUKQD|-EdjV3?0G?`FH}VyB_L*y{C|+rU!OTiDI=Yf9ml?FLd+heA zbbs|L=x*bW7Ru6KS2ZIE@_uPU0e4s4ZW(C=yhXM7=fHLeP4bWbHZ1?Arab>9_-2N6 zI_r#DMaNpjxU*3uz59XWn;zIl*C5O4n>e`8;eI-cWru_Lu$16eF`(D-;cirz({5d- z!p`;6Qz_bS>1TC6)mY>$aREzztSpr2<)4{rVfp@77Qo-bvNY}KimN8oCl-Sl-?qqs zU)_Gn4!ps?zja<5_eHW0DKQ5$SrK}5+VSRrPCaW(8@2PwG0d~9Cc5HDMP_NjAzr3z zDmLp#RR(3cF>*p8bx=xb=eK{vOwpA!^INRR!?M=3-Jv<#y3znxmJx}q5)E-Nj)IEU;z$+uI#{a<-mOGmYqx49#(x zan%<&(B{fDInvTbn!(Jft!l#>CIhSXY9{gV|9h2q-k<=T4@{hnLf!_#`zF7$SkwQw z<;F3Y9t+(p__fUY$th^Og(d>yopc@D=M|#u$jo+!r6*)L@2JARb-w#^k0nIfTBqgA z4l`0$Fd;&Fp`x}x*X>H(r%yCCqS>{1=C?iM_w28{yao_xFI5%@U&nNf5(#lzBc=rzV2Q2#lH8B0s!(Q$TS2P|HTNHYTYIcSKO5}-zpYmXR3YugfFJJQA7 zobrorM1lOwSi23R{f<|P8ZfHzxPZhVe>;Q+i8F)OK06c}?KHuPMS6QsbFnE1g zR#&FwszNz)Mx)jGka)k?8p4ruL+=6-na2KyE#QkEXpUaLnPsF*0DU?AxI1KCm`ah_>s zjniF~fB3(RNB^;5%tBwQ75hPBSTz*iAg$)!vWdIjQuAW*AXB>|vFb_B zCBXN>kGSgQ26dvD*But`D?XbK38ArDbgu35VXIbWWe1g8)}e}21$3S}+xNu{-P$gm zLK;$lG;6dh0lVxgZidDI=PQAD#v=IeQSt%(M_-16bk(6qJZ6C zol}kM;4IY|VwHi)d^*|EK!Rv^?JliGeTrtlS^Tsky8M%~GyL?Og1_HC9gF_^2tGvh zh+$b+UMAn(*`elVB=c@*sY|2Ui(*L5$Y2SVM6+=Bj{^Tog`jzf z&IZzS0SI;~PHfvQ;V?A*+sBGm9nRKFCLPtAO&Ll?6h|z_dShCGdmqAC$DH72VL5G# z%PT7zySs0+_;H#C1zlP9d|vNsQs5@Ykz~U z(T1qX!?{p_ZAAL+(@@|WO3@#lVn(rh(im!idqQUwZ!b1|*Pg5b#)ZN}f%P6*&nkGUKpbfI~fAAc`fc5abSP2Hgtcc&#(Qr6O4 z#Xa=TfojR~F3MBhW+$t0kF{t%hP~vrV>}_=OrENhL^&M8kGX;}ypbtWMA^?U&2GlN zyNpPa`7q}j$ZKkLMZ{(%W0~ zRs4dI{ZD2MlyRG#y@r)Nq>g^yG71AkxOO(=KQ>Nw28^ZUrB}ght}N3I5CJ`Hkc(Wc zk3`$mTX6Ix3^%Eh0~}=yen6yKE!@OQKO!y`DKbH3Rk19zl;_iA5g11R``>*!AlBIw9So73nub_J1+<9zYr z(uWkiB%Thl_?=I&w+jb+AUlB(ZRJWN|vr?$@VmEKXYK@>3WO z$NE$Q+CM_rf(=)Mv%K(-xm&&AE6o=N{7%!U#(g_O@>wGHyCv>-7jqAZ5UN^7KOS_D zcfNkm>0&3EBzQ$V#4p|G25yJ>DjUUs;*YA->g_Opj)rh6>&#|PyUQ@Ik-8h}ldxqA z2}}6kw@KBy=pC2otx8XRkk1oQ2a;o$>DAAhHTsLA> zCYIYj3jHnhpO%~F? zR?1HyzAtn7r!p0`-3;O2H6G}+c-`0k;Nsge)kah^jP*-qX&YV-D|0gt$tk`em;v1c zFr73ThqN>`G%KqO-`i!a`ycdBz2(6F)pO?_uDm##O4)fKM6#!4Jbcn)VWQ4RQ9LMB ztjt_-BMyzwU>J*jIpF^=W^2P7viI*LvR!0Xd|X>%a%Rv>Dji*4|9g5tT&6leRuTi@ zX^TuIJJBEM<#Yt?z_{!!A|!Ikl8>Oz-My+Ka+f(0T9HEhLP%)w@5;1vWq+=@E8eh+ z?849W!xK~@Z;hs?v9W6>5BIQ?l+HuoiO1H!eRj z^um^pB)50oVX-V^uo;c-yo;VNGV>xJ$cSpBNkO5xfg)V-Hz89-jHptV91Yx(AQ!bJ zA)&wdpz)QJ<#i}kP*DC`RMeO6KM1^g3J%_Fo};!QnLS^%Vm{XH6k2T02z^}c^^LSu zJMhT8svpFg1z-v+AXI~omf$H(1Y^WsmLp7tzPF{BME1q;7 z?~(8Amq!LS7i327b^X>6j=V9R1igm0E4dS0rP)vCGb{7{>&+NjdcD1)stc?2@8~~~ zFT(~XQbt)}=tdlWMVvns>d9TIFsL{>`@W@nN=Y%>33?@9gIUwvUhaLkW!U?$DQ}-6 z;PW=m|LkS^;{ggc6RclLyry)xj@xzUt>05$efsB%@~0bK^FijY?Bplv0Rn|@N@-Bv zjlrd}{R^sW>dx_Yfnoic2S&OH^l=e^7ah|1X8%k;HdWLX7{8rvP}>;=(0WS;cwq>!{-TNh0Pq3I+FiI)aW872-&75#7~JN(14|)vPTu zGzc8em6nVnkZ0U3{Q*B5-c5Y_{HcFVOg384X7#GA$?Rd6h)8t$qalORQq$evo7gob z!n@W-x%twM05%pH9t{Mg_eIP7h}3~{*2K+r+m1#3Oi>N#+XwpFvHis||6c1{{jqeI zHi>2cApwb*Y=5BAAp#KfFJ-e!2;*q6T`vqSMaS41bCYKx1y{#iOTioJ^=dHVU|}JO zgm{4=O8S4A_jjLh7~u{ho88Rjs!L_~t8iEfp1$I6wDh`Z?o#0MRAG!I6$J|k>GxL= zf0M;WtI&E1IU1ocvwTM_tk9^a!vh{$DU2P*6q#@+0BzN4wX_h-35Ia@G1zpAmY}uq$o03l* zLA5`g1=6nuJOSkeD^6B9LegJ7UG%Q>U;?+5$A>uGFAt|))jS>~m1pgIkq)o~>S}S8 zx=eLi9WFO|?@W6gjU7y^SCejQhJGxkF4Rmt*835qvHRuqiJtp6laq+?ttf;qdYe@K z93}>~=DY}<1Q>AA?7B;L6eSe)8u&_-Z8jr7jFQ0pAUc!?(1MR8H8ak^DkaNgq^5xR zw$xw!Q?c5T3kaT`ljna)=z20tH5Zv?Uyhr{gW=$m55RQ0nWCbsHLLQX5U*rxr%Q-H zO{ijWhb~j%tO!kF*yS$%H2)R+PJ?Gkq6V}36PrFHWKPQjrF03S;cG|0`9OB`wjj&< zubrrMBdm}0$qWnX+zblKu}$0Du#KkSw~WEn?$#Eis3i8Z_+CPqm(T@>b~`c>YUzfO zYQF8WGy-vbDau9ZH6#xR?Q=1dc5NsCa2mgL00p4vo3}%NvQ^D2C2I=Q_6-hm^8~Gz zZZjkqCZy{;6DsL0L)sc@he*%u3#nSor1sCl=fJ+?)03=}$p!V7@gwDP zT8;iXroy|;K~mO5h(?z3%=O7s-#5jyIpY_;B*7wD%MX`j>3b`CRNaht#Qb7R27a>9 zdOWy0ya$_3+UQ@Y<}2zF+( zpFFLb#+zxsgZFlct>Ct-Q;1wO!I2^2nB1D>=JCqay!(H4$w-5`PS|{<_eT>EJtb*+9gI=P*3D;wQLtSBMq#~x z2xzpKJGv={WGlBwhrwif0|02^iErz{4>W_Hy9YM`Dw;K%gCj7`C}}zqhy|OU`+UFG zh$ZFzqnWGU=2Hl49><#$qh+Jgq1lEOYu;LLYu>d85c)s6_lRjTbpBhon3hR0_&X{C z<9c+2@NMbr^{ zm;lL&-!q@dfIC%#XJ^GQYmuN$Er4(7t|ISG3ZEXec{-X| z*MzmOy+BtjY(cMR)Wd|X4M;t1$Bu2-bt^#!Rh~v50mOK)tsn&kxb>YZ_kQNkQe7^f z9RbnTR7E!;O$cem-sgTyz_1B4ug+kvc;1eDmF0iJsCfJPUB?bTErkUic!?p-=^J=c2upB5$K*$@c}Qis?N{FLNn*R;Q4!oqJy(t!^cdgNXZ*CSZ7sqk^G>f$ zG|#?pv|&Q$9HasQfWTH2g`qULOcA=gAxRg%H_4mzy~oNxV&k;v$+X;N92fqAj*=37 z5z!8Co!Hy=?>8{85+t-QFfIv+dKKxu;s-;ZD&H?owyelbVi+Bctd}()sR?^yD*1zY zBLFJw8l<$WP5T_bRyKXVY)1t7tNz=z^B)5qX_Pj;W0{dC)5ti%Xl-vLLO3_t=2$H? zhYIR~h>nJ?m0xm&k&8I)vhX#A#8+(v9@`Bz%_+*vkJesl;90Xf5j*e?M$Po6b{SM3 z=O|Y$EV&ZbBlqmXGj zfPp>ewSnX8VDbc+Jd87&N;69><`80LzjpMnXsm3_U<})XxJZvqVgm&tCZ%WZ+q9#) z!sK|{&J0>iL`~k5Y`G~CDgy@I#oV)EUgpHlY)=cgSb?+`mdKjw9Pok~%_|!BXFAXq z8&AXjnue=0=e8;RkSGR!pZ-2(poh+r#y;mQ&NMQI`%U4au)tp=}YRZLo!Ag26axSQ5${C*%X0<~`LedKG~>z~VWls&Ux2xgG!GW1(NC=QnXKl@Z& zgcy}N?WFw)l!O)AAEc;aB@0k3(-60j2uC7RRNpVuvu|(ES_Ug{y7hdFH&e6O^6Z1r z?!OzL+PqS1Gn>@?89fLtGbQ<=G{n8MDk@xSf5EWTCianz_*lqI@;=^RvQEi2Hd|z< zRj7AXpELO8_v>wfcfZt{zH;Wx9FPVt(^M+zo~4=9lVZ!_GToSpw> zP({#w{D3;zE8Y=(gc}is5&j%w2+CH{DkZ;S2G-1^VF+2|4*gSGd)0=LtDEYY744~3eK~ahi(j5^NoG<)SIq05C z@o&%-sUTXRqRz7E#N;OB^a=%VEBEIiS9SP)k4VE_JL96qx$NnCV`5I5FSPrZIbTrR zWxwBz05iqv+uIv#`M&S<2}sEnQ478&0#zD@Lxu^rDpbUzPM<<2D%PI8rZSR))U;XD z{uZKk;^8AXshcWMV+j<9tS~MfW<=hS=L;}pBp+2F(WSFIFA)6^=hcN)uvo?aN{bYr z3Z@df*9Km#|EO`j7+?{fMk7Mi#1E>GUZN;uB-P3TuR z(EjkQ2oSL&N5XLKC=S)}PR=fg^!e($74;kct6{rD51#gU4~^Z*pEt;7nr{}?+iSi* zEBv}6;zzW*-?Q*HWHYtcCiZj_0~q^ZkkqoBxF_=!1}Q4V-Z5i%A`aeQ1rfw8`Mk8_B<_nMhC^P5;Rj#VDr#HgdpEF>}yJ=}&X zJ1STl#c#-Ux%W_{3|)Y@F&U%N&HGtD?qev7=O1s=Rl4=A3&yt`>uk3X9-3FUBe8gq z$B!H0z~w0ZDK}1L;AxeiW_@u6Hq{3-%0XQwAq?Pz8&P=e5Bq;j z*EH(@snF?!<-_`bpIVxTbl6tO1hpul_5+^s(hN^l{AE($nq(oJrS#4|kTBii=ye9m z%ru{ox>)hh(I_FT?5qaP{ILH(uI))8CPScHpIH3^7G*T20*ItSBc6%GR?NRSKQlOl z29z^C#TGD%w2~NdDQozQWCj6y)?HAOU=UZKQ_1xmy7sd>Y*{mNw9U{C8|*vt=`+MC?xH>mZ) zV8fB8D+{(ViHXci)ldOlRVPdQQPR74q|9%O%SZ|8P=M5CqClV62gV2T(rxW0P{aPk zjv{Hjr{rbB(*RBm`vWYY^m~Jw4f=-bI2HwJ8q*Cv;Qs?r-0ns;Q4K8wp9iW@)owbi z4rZ(1;|oW+oa?ogbF9s&6U|4btA8tAn4v=R+fEn!KJ+-I2)gwUAAAQ;dN0jy89U-O zH}^{;ecI;#NewSO%=1^7KT3WpEXW&)g>Jq%Zjt~v1pWoBM!WNTb3-dq&L3W3+7c7r z8@+bQ&tq*&XZd^*E+4ruzV-%17d49Whg zW|av9lhiMUcS7ZMB{wr1`Iot}EJn9AUCOU;d|3tgubj_I z@@Jj`7=#!@d^f89;|M8~JNqDrY5nbtPvNXEN+l5_DtR>l`fD&uX%Hl&Nxb2UVlMr{mwvrWX+D zgq!tM4{;DHGF}DU(wO$40E;V!^asE@$ILuYTh0yj#4z<=tF!V4FO}U_orF}Z5|uNH zYmfI}G=>snFPdLbBhJ}#aHAT1`JV-*hon|(UII75Jg`1%ZWx*73D@f_cubS-+t6x? z14NVn*|b>ZdesTXrpE)L-8`SZ92uLejGh{S?wj%eA0V_7vcTiLfPO1MPW4B?fZkE) zQ7pehCdvYsHZWNB{7(J#pN@>*5Hg3y&HDu&JVpme%k+I*ZeSGrtH=}-2v<3Ad)3+) z4tjs^g6O@1mPU9T%5sIeUoY80e`&IiU&llKsDaMQf{64OY^>%!-{z<#Dd!h#tI0IY zApI$f{yln5DY3gqAgyO2@ODC`YbHz zlmtAF-susH%ibZAD(Zce+2Q5=+j#ax@FjC(8e$S`Ln1RCJjz0X{(@991pZ1CF?sL# z5uf~R>ZUobLII~WKtLdt``x=UBwWYRH9Xg0xfSkHx(cya>keR-~n;Q zKmXZT??-#l{e5iu`o1yh9#^XWSu-(%<-gMj)phN}CMo&Ls?_uV0T4H1NKQ^sW|-ud znRv7<8b{9Mr`;~Nu-)y@INnY(I$yqz&Q4kXwFGkD?pfr+E(<>HidXZl%&)9E`5~tM z9I+jh3{2LAJs@*YwsBEdKLlw4)2rXKJUar(!l~&i* za?#KikiKE0z7d+Fkw)GOZLPiyVvqsq@6{c>5GHR;Em8`G={FGX&YcD0i~+&dLWguQ zSo}>qgQ`O?92zFqMs2N^|Cip2iua4JsX^YVVTP^pI*RL=g{eyeeOw6uExG9c!k`$9kx|It^jpu0vQrbGz6ePou1Kk;EYNlq4BfDo_!B7Ww|;dTJoGGWg#VXCp? zqfyAm94h3SPQ#j$bJvj7_5A?zdRHO428zWQtrhr6yIrD<4UAmx&xjhqzv~~~$WPvq z0U{Ee@aBuaI+32KDXy?z_}Nzo0!k{nPQVvYeS`qj9y?CXgWm$L6)TWOoU;`!4Tw#h zlwY>}ymwvQD2u`te&zv_y$RI9lNtl^wsw`LC0X_(ICdGx&dx|~|CvhR~JV!g1Kh9Qqq{2$uo=`&(p zoJ1U42=vW!<}YM9y`sVXVxvr+w<9|9Tdkp7apCKQ)dg z9ToFEU#bzWt#ks2s|F@ufC3eZ?YRAPePByhl?LlQl5DThYRR?Bs@bP^S&#E{QD1Sb zNMKkcAQ_%-HLWzA0u6}h!j$%d%ie%MQocX9>xj6LW8alwWzDbXw z1c}2zEOmc9z6SJ}_VGy5871fBM&1?jpd zP>xD1R}8C-m?m8M#5?}5&4=or;*}m_OlTNhVOfE~Ox8VEUtW9;6v*=}+TQS6ar+B- zYAr3iF-twlo`DUGkRynKpdQ66gLC)nsn$;Wz5#}w9lq5b-V=A0GocpbB88M|>v7DM zc`td}#A>}4OIm~o8Q8?e(&440XyT3LJI1WJcsVC}&iFsZ9IOthAAiK}32q@5UWuO8 z47*Vd=-u|2GrAj$1{#vE5m4LN+A^loo+~>?%=-8XZuJrhg5(UCs9E-0 z)pLza(}G3{`8-D5>&Z%yf8Nv=a&hh^FBRl3^KqyIbfm&)=#1xXF0kg`|R zb<)yB*H()mM~_W9zgq?Y#sV&qsKBCbLqiycued2(_RKrjRvtgzI2g5uMWRwo4?L-R z!X7{5A^XFNG5AT+DPc&NEU@pgHl@F|-1?3`D;hcmNohVqaHM6lPGHAqbzp^kx|l+% zi*3AIYnX_jK1_j(#cKeM%`J9mIm-g}K9j`QA9$*21km&BwTCNoM~r36nv+4#q{Z9) zKPspIUP3_Tug!_AV?ePv_C|U(>g{wTr97*nxmbsFCMi=Ow=ld(->f~ZwEO(oQ||;x zV{9I5Xo^`H3pORB>!@?C3gt}-1G3$qU^l(K8|VwdS-jP<=2hx=Gf`q@O_gRfeazBg ziGB9WuKpV*CrjMV!(~_}mlk|@K-43iZy!+9MUIf(T%h%B8H(7HH05pM8iBt6R)MHM zP-||kqML+(ge|`+&)LE&JpP1eTmG3SB?@Lhe>U3}>K~iMTnfvrq;A{VX!y-&q7;ck zF8em&4ft?GejcBtq^AuktY>)}V;ype0!7R*h&oJ3j$j%fkKL{2x5c`K(7W42z~}t!w+rx*XCBS>MKNn8d?wJe@AZL`@g!(tD=Q2G4!Kt+d~iz*~wBxKUC!z}F4%({ugod@5%4nf+~)b@Y|?>#s-oznn@g zIGZ0d(zi09qRBc&=9Nn~(>s+fPzy?=0E9icIWh+rt37{#bUWLNL$rV>&$UW>N7}cD zMxReTz=Onppr9NHRC$`a-(OHTxMmIKD!3v>_LF*AWE8d7>dF#dB|<5kKKfpFEVU!> z`}n*P{CZ?IyM&0y!&D~WXt*t*_jnh@;lqgEi;%wtE+^gC#2_L0KnS22ET->?_PCQR zy3lh@S0U*kcQFj2682Q>+C=_{Z8H{YCUD0D(KgnQ<&~^UI+!mA^o?i|5IxpY1}$i3 zjw&S?Tl1&*Er!S{rPLP}cJ{m&{r_Bk*2wbfix15PH#bdSeh!h(6-Z9I_&_Qf@?Z`v zhF2362|qDlJ!E|FDH^_Tb$2}yf<)t^4|^mw`(T}4CHsq4dECaSYry&q2UFf$;87jjR`(+67>rase31L5rvtfq-NOYnzW03Az+a|9`+x&m~RXD?|oU4vykuw^IU! zo>RCTjr!xP&ffT_wkOMwAHg^*%<518%9}dHn|TK~d|c!!>ze`5bPsl1RJcuu89-@k zua`Oyxcm>vfe+wYn1qDTefY5*d{MKDQ`evhD|X(|A!tKS5>zC@_$WF{!?>(3F$Why zs2nP{vJcAq?4Ud?k7Jbjy&Q&C!w1?N`zO{M3!b*- z{j~Eb?eRMR9=AcdH7EY#0mJQKglCGQ#HAz!;d7&oHer@+mEDI`Isf5c=xKtaBPDP1 z9P%<-!ea!kpN2*abMVQRCJ30snIktJzP9vp5S81!JCn4t(`6=R&*+d_Cg{REJ`mzQ ztvTG>kJJGSw#$RvJY?4rs|IA-Lp2Q3*zQ_%0d(B{T5M`o%*_n#IH8=aX+r~7Ze~Ni zLfdI)x2=~zC~iP!^LxVAsXwR_UzKlaGx+Ae*Uh&5tPQn}w6h-!^GG5M-n%P}FxJHZ zn3LQS@$&_9BKx1bN4&5hj7*GUnn6aF(r-oPh~CiJb5QC7w(6Km=s zfIy9}g2>=Y#5V;da&H_@GY=(}R#0}zCbT`22s!E}w-xuFqUQ&XEI*Ckh>o5VE?NZ@ zkOpCmf7tyfj;$Df7KxRXm1bJH7caZH0zM+0Md`+@Z~3}{x$@Q(kz(-H4bkgyLOV1N zIu8OG+M#n|Uwj^k$|e6RkUzVGjmH1jTh;kpOkP!xPnbO7tcy-28pJwvUD9+Dh-g#5 zx28!_nc5TAUmGi1hrw{Aw+7|1SooQViD^ zVJYAH=SRA4wrtF|BV>64q#32rIU^z@E1id^NahIV(ut3RnH7>C4Yez#2JY)h>}*4R zW*^dE?s4Dc<*Tt++RcF(U8U2QeJs0Jjy6DDA-J5xD`Q)e25Y*}5dPTPft4dP75Q-$R1%Ws9`oJVEA{4^0#j>I4k%%* zY`p~?9UpO0MC=M7BpsGaZ{LktS+l)RF%c>TkVdOmFcR_>`(aG)ZkM#xGIk7KOBY*3U7RM1+i?2s%7sgoy z*GXpv3fz@{s50qfGNXr;;E?YVpR6WpDv*{320J4Nx5-AQ+FP_z+Zo0kpSTGI`eM zjVAtuNn|08a^@Iee`fYpHnWe>Msz}`QH}Ood2$&y)o+M+&XTicX~t%lGeX(g6Zs%e zq*Qf`|3^ONLYH#%yBc~MSuAFwobQ3YrGemJ_;fNoJ7g4D<2(V{$w}wIvB&Qp!w1l- z@I!fZo))6~=-)MlH00PjR3|55twBnVyR!;do=@>@O=_1edm_LjV!gFl!(5tGYr}0j z**eTUyPy4bEKC>Q&jmB6i5FyKuRmU#idg_>W6ifdHLF+`-odl{(%6zsPQbUs#TGNv z<=)Glk_{fWKBHp=VwG*#)+P229rZEC97#Uz$42CsL)byl&77xQQPmg1JtPS6s_pX_-yQ5!B7B3G>zcK8Ex5OFUuS%v#Dq~+@`F#d|-_cK0q3M7kmwG_hDoV zM4EK}X=eIb@oVUVbW}2UYzB>^e=mh9P@_|O2}*iO%1^G>BO6{52w2O9fF5|dEqnw( z1}HU^_R~y2P@^wN^snTF8YaXC6Skz&Ia>Q0ZOWznN#<6=5rJ{}+L~h)+QHCW>LU}< zZCqIMOX2Kte?HMJ)l==VL&F#ooH!1JuKSEZpgAOt>BFQYHua7MTp@lJ=1)NL^10KY zP=iW%YqOLD)y|88>KcEKeVe+$IhfiXthK8eRAr}198WOMqb6i4e$3t~qdtxih~ZB) z4!AEKATmyKYt)jThC%ce`^n5?uk-;y%v~->^9aBA zcmKZFK7vCpO+|FZTO23jna>Y!*!*@m@-&k5 zt8lPY!&9|rW?KvWnwpq3MD!+9x#2BI8IdrZ-1ldv%aLq5Nw4aG4WY|#rf27p#TUI_ z#P8MKPqUiyCnV?7d6afERmmqu&q&qR(n~2a>8KL_Nb+k*>(wd$V7m$L%3x1HIwE=- zBI<@);tI<`vARQ^+k}yK-PFL<*Rok|@Xpsc>n#Ue9QD7abnZ^x`~$cF&O9F^^;~g& z^T&pQ)5Oe_qVA?95X7Vr#hUGH^h07P-TZBua0D(IFC}KiNNX`=+0$W^AAsn1Y7sC` z)!uB7A|J4f!vfTEWNrDJub34P5M;wg*;)8S=xu!EW^4rKBGRpxQXyPN`*)h84mu&CN9?ZFtZmzA zlo)IO4SFICg(-3c_az)#A=gLw*223V(VhF(WsUWxgClmbDBqEbs2nF#NCuOvUKd#%jOx9XyXYn2YUBqBEX*6HcZDQg4*d{Wg6th_q<4s=z?y= z9!_SQ0Bk-$!dUJLd%&9%@NL4XRLc?0P^_-CIlv9`4>R+^Z~&l(4qMslI+kyE9broe zwtvkMn<$sBybK6kpqtauviqTyqWW`M(au`exkn()l?Zu3t7IvN<@)60ffOrYqzlswD?$1gO$%g{%(i2*DqxWQUz~z?K;kEAJWkvVr zi}*#Ma%8_R_t|?%p$?;{HLZfK2qgSM(phZqCJ6+6j!YRGM)qL((s0RNydyIYP~(rQ z-Xfi$xYYER+4E~Q-d6{Il}G%K7b1{HUP-c-5N2sNG^%2Ty*F8O{~HY#aKNefoUef3 z_$wS}7pFFiozV_Nz$?~U48~IY_qn0}gp%I-iwUm8SCGWTWybKKh})XEHddOWA(m;7 z0F6&xcL)PCFAxT@Iq*usKY~jlP}vUomYleTvw)!3U)$=1C>oFhDx&KmUN}H1ORuM| z&cLe(0wDzm6u&!v0 zk%h%D*FkVlOvPN4Qd7A03E{@TN{dIRc3YgmPDF@lN3VZ7SJUfByFI)ET zBCSB6Sx@|vRc7Kqz`wne|9)PPgrU`Pfu>mhjZCl+hAUPZ7*ArnNMr0#d%TU>JSXRO z3EWQ&-XF*x<<#G#%MA^7PdmD5{@)zoOV0X*VN!bIQ)+lTNv}*PptQJ4;RC!D)9K-G z_c#Ge=8?X!0sb1(sy~T(0~!D2YKWc$x2paf)7B z`+tLG0JY-o4ddcfKY!&F8Y|I`{lFGy-3SMeli@XvEg)x=+K>=@n4r;us>-z5vB5n$_U zp2*+76-za1(Vnjd4O93mNRx(j4YZ?-EMIuB@(#wU&5qw-?RVFq4H7wgWRC7F&4#&k zJrH!Mqv*H-#7OOp|CqOio?Q$h8XEfgat)ihX!;EFKSci@(!WsO0Wyy~rpJ$nWJplO zgsaY4BSieT6~a|IGn~${9_62+6;=<(#(?M1FcHvA<7!&F^~&+#+|GR$!Y48y?M#hG z@Io0sq7^;c5NwjUoC;8&On+auxbA5$?=sFG;;1JBDj05fbCi{ZF7s<-pnK1lfAtRL zwf%AwyTM}hCHi#3Kd2!p3OwZv*jBxmu-C++)DulrAF>b2Ueb`YeqFS{9cAMEd?1!M z8hN?uuf(l{-flhpXfqGctN0@}27U*#@U*hHGifRxMW1Z zkiKXHH5&hGzWK<900X!~0`k_)bWKZ^*>W0EpdjrX#Mw)6)I9mh=20X!g|pa5o&St8 zC4!^Rg5^BE$?<gi3(OB1&1RZN{}?d9PE$;d$JftTV3Do7ul@-yQZgds>CyAwAQz(X}s zdNh0~#rW@)Q-zYk;f-0W#X_kWY;{o&oPyIr`((v$6$Mq@o%K}*$ z{Y3{5NQkIVtvkILoy{!YdRpr}!E0w43aj?rz1%a03B?R~EyyzXN6$m8_)D@BuWM*% zqv{aHP<6)S4{53NfTY1J7jRJ_2fF^mB_##qjX~+#>eB1a%+HhX(xHnZinovT!$_Rk z%g41ygKl8+O9$a#P?`wj4zj}NZLfr`2_9c@&(Y|FVpjk{!;0sBnQl;du1D+D#c{G# zg^#q-saF9n{=7FKqW`pKXIcjEIw}^NQ$8fGp%LzGnOC(BruyimCXFX---^s9$p%=C z{}5({8hNJ0IU9LF*@@q014%YByj=x(;M}3cctF%@uu7wTP*B7ZeO!^MGVg1Yk!I0>WhiHAKs8x2lgy)~$cDjd*xQQ`l4O_2EyS=PPh=7uda zh&DVP{)oIXO+>;A9|lu60yO#-yqM z$Ss1+4tZ>EK#mW5nin!cb?!ycc)b_Hgi6sd-ic_b@}QN!aK1P`G2GP1+1{?8f;v$N zEhv|ml<@W2H#D+tGK1z%!UY9yBOl59x!#|QR=m|44rmFDmgp(X&Sfm}Z)LP50u!lwqOeHB&XJcpY}l%^d^ezO(V*JK`tL@H$pYQPb-qtW zI6&znP+`!?sXfi3kNjjd&xD2F$Sy7rTZp{FuqLsS;oz2Q13fdaEw;#Q{=5H+lsc~> zJDnbtvxMH(giS%ivk!h4e3LBEp4z*&PB7gG?PV)l4oBNn^!q02@N$5~?qo5I0tAmu zAjfyxgc4&Qc6I=f2uOsiPnlfUg`cyXn9aWV*S7GNdVjK5xV%y_!Y808#3P%i7bEym;?g_GMcVVaa2cp$FaLy~n`wPUQxWS~F%lvthqnllrF-0K zvPfF?16a-e-bzIj2!C^fx;}yen}UgXOI{7sh3XErP$n)-D+D=verWBHmv5HI<2o)z7}Q`0mpV~DeT0OLn_*! zk`8@!wDJ>RFExZb(m=cD*En(eF)QP)Dnv2?pXhH)aL>-ePtGV@!_pXX?cf_L!yh!F zH8zv`_YAeGrb${jJZRg~(`bXK@RKtrm`;^;LZs+4yXn4wPpx_n8i7EjE8LnXlq)O1GNexMx(>oF z;hIEg{l%!C@^RN?09sBGI&yy*Qa0K}tzi|*g^=qF=4mH~J}cdJ*~V!l_P=d=vV>l5 zkG5K?8(-_=8hPIZzeB5{E5j51w z`g4;*>RKBK#JprcYl|SDBIbK#IRh<6di@&ttb&4u_Ey5jNXXhj1~eLPS47O4o1eJI zjc4AnvIuscd~b5~F#AA)<{!FsyInA0%u2o&Rf4*!zc-d&e<$=F()}cFaCI)SG5l*V zFi-0|J}e9cc_kv^A}y~!o7|i7i(%U*UXdD#c>{f*Ro zzV0nbp)>_Htwj1hImW0%#OgQe3B$v@rF~kwAIm`S*`zjLsnFZO)s^j#8uMA-ZP$A) z1ZCCQ1c^5Bq*ehng`*MQ>E7eW1}{pcyBGG_pt*q_XQmcgXv4dEf&)fA#WrIkstiaE z1DO~SviDYg6}YXM?$GJi83Gn!^fswWi@!AbxBg>%UOs@kVXQQ2VV1plVQG?Riz+`J z&w9Qp(D8+xbJ~f7nVzhONQXWX~(wdp&0)S214A#fZJnhVGj$0 zDO#?`t3{qfy`ca;@npw@o9YUmUWsSM@Nx?MERpp&limh;H7?)K#H5M!mbQtp^ne@^}67s4;1~aMF<6a%dgoc z*fo#rR$I$MC=6Cjn-cB#-K;E~4i3vijvnXf_4XMks9>td$YbSNpO296a$0|ntEE(g zz0JBxIr)UiYIP6_Hq=+Ef52KZYr)ZPbq;x3oEg3~JqM>(#m_>A$?w$)MU((mA{m^Y zOYf|=_J$)^PGh5p49{JGkGeR`p7s?zxFnVIIS3t0qM@o5|S3 zlBVQIUp1|CvO2JD|1?qCG4vMY^7;A-L!*hafOi^yX-GR<#A{NZbqC~s+Ubpig%+bk zq%h;b0awVd{AtZ=WQv~g+Yl+0a)clBx$^$wm)Um^MDk%UtYxtNRUDT(9jS>??IpakZ$6^KmB0UT6bt}j+dhvQYf9jLcp9Vnev60 zj|@N6tQqog`7(n_k{SFEtuc5W*Pa#5#?~aX3C}NzCr@Tm>ly8wXi9ZfVz5vW*K@y6 zdGNg+E?4PVMPOE}sWMw4017+M>M13gjevGBkeyj(5u6p*WXRbG#?-V9h4~vR1Fm%j z(-r>I9j$InA2Ya6g0I`~Lu6ZU6+YeKYqem-EZ1iQ^1>V#nmCETqkup7a4qOM2)%WQ zm19pG$&rx4blRO(gLzhE=+S4WH6(i0P=mB4(4u4089n`&sOF4i{hs!{KL3@6L)CY@ zLYct9NUaaP2y)v)Z+IWm8eA^PTkqW{$i{f3kk7m6%n*(m{KmyQPv#0cC9K$Ktc25F zLAhk~URH|S%}RA|!dA@)q`#U=N9Q>SVo|tRX*xaGKM=$vnw_cMGXlC3ZI2j(i;~QK z|4J4c|<4}`2Bymg#?KxyFv?dM&o;fz+G1=4D{u) z*x6VMPj%F7k7pS4K8Yq!7!tmBT^)*P1t%1m@Z=&Jr+6Z-6uHr8D!H*a%XfIG^w51P zH2V7X4c+2!Q=o1VUVCxS6E$XSyI@KhSw%jQCP2llxNoU(1ia3h=n>kF zhBsr$fw2a4#l{ju4qj;0M(YTtcQ&QQS2wSIYsh}Ighe<+P?=(1gu2PGc9k>Ec68#O zeLQ&AlQm?zOaDrvb55PHSO$X|ZDGWPUyJ^Y=sGd)0?*;7s~c=eI_~<(lGHD1$}J5P zpBn>)X73EWZ9V_zbas^cx~$H)Wd^~RBUvoAD!PT1gOwxgRr%hup#lvra{>5>vRKn zV5V;Fw~xAyc4#9bJ0~e7B%Qzp{b%R>&o=b;M4h>x*J-}|O)H`sLpl(Xc5-4BDM-?@ zp6I&V?3&l>Wqf4Gz_*3ncQOZ>p;@dV5bqNfwJ#(!ra9%NWya?B_7n&^TfAdeCU(%S zPSZbaxn9{a6GL7kj6;{A6`f@u8c25G<>?Rafy9K&t2#_pl1wnIx^JoI{Tf#RE84Iu zHbOL%s5~%DXeInn9<4*zwj=t^Yo?=)UB+vFwZ*oFdOj^JLAVrXQNY7u!erBvukgu- zuV-X0Aej$K#By95ehx}a&Uf4U;+KarZ#eN{`Y7HkYStTfpUUTlaa#niNOj*TydTcD z_~?w^2*-T&7)@+%*Vb;a&NkXYA@Vda(x0s7c+6&}@Ux#7VFn|-*X|=vxxx92i*ZHlljPu2CmPea}sL4(z2INt7a~=U1|Mi~A~3d&Ci6aJ{Q; zprfHgRQqfDz6JUHOFKHnfcr@V-CTY-N#ifdg`EMT$CwO{EII6sgz_;qosTn%?r01s zT(3TCe~}7Pb*#4izH`W%9uO<2bBG7SchnCYBdb>kV4AO4ApY94tw)GXHiCQ*2D3}e zyqNN($p*-jN}%0Z3bgKZQq&8xNZO^!jVBD-i z#(dSIW*{`JwFf_4(cW0H;msiW+`%p;&I~JD({9w8sSPk>uJr(f~7T%TopoMkXxU&qoJne5pfcHlSDo4u`= zoVz~nVy*Uxfty7YpGE4ftq84kic7&s6u~JI?56{N`g>5;?#GATF~=&k>PwzsZ5dkQ zkZ=2V#dCM02Cc;{hRnKvco)M#I5sLfSUmUGx#rBXQjLwZ`jv#r4T38nqKXG`jB@|b zX^j%#v5Z_xPuH$cLEevy6T&Tb@bYcOxQkk)rNu%pm8F9LteAOoZyAZ~GxJxa(2$3N z%9L?x?TBbn)~2Xwhg}bLqiWIIvy#4)JxtC92S3iL>#@}^3JqKx^^I2>QT4S&-5H&p zUG8Cj%rmM{AvH)It({Eqy@u7CZt$EB%u|K!KEyE+Rzl6_N{om||3GU^`IR>8qr;ug_Y5+o5eL>IMtQ*aicns@`NJWb-C1!y}vMUAUA)wt6=xD|nZ zpl{Fz%C+wEu|jtu`u z`)pMGC;PV7%&mX`a>@AR@i*2w1@n2I%!!3X1yuA9c^dMON1lxBIuEP?R{OsuoSGe? z&}66`kxFPqAEuJghnHBvS*fXxNHi3e%AWf`v6-t^VU1RCnJNyHNN2YaXzI?y#WhruQRB5uXetQc9`HIx_rv6Tvu4MetUaS<&tm_5iUES2Pyy^|AVsWU9jif{S20Kc^dacBsYoPBcCU3x5TCbXe_4_bQ747Ttc=5ci!IU{k6f34%;(ESIotR zpwY!?ay4<__aBT0zKkkEiq%@`4;1TtBR4K4<5KwCggV=L0*sz;*$R!2BwBV451?3f zmklna`{uae79d%wA<)r6fTvwbY0;8&_HBEZSz@A9se?c3-gx=aO_DZUf|x_RT2mu+ z36nu{@Z0Y#2#QQ&hTCxJW;Sc7H2wIwwMW}tl8A@x4+gw3Lmk{BLF^c2oWG`mb)}FY z(FOH>7h!O$5QYH=_2yC!tHba&;}6Hzb~-#%G1&s$k76DVmhssC08eUshT~*in8GO?1pvHLWhxkMU4C^W5&>+e22h!LaQ07T0R^ z-|nI7`Andzw>;%oY!k(wJFFBh;YY!w%iWPV56TLqJZo2lr(TIb*`ku5@$7Sy2$jp@ zenm+|Yc0UY;8RICf(yH!OxXFw-LukB_`N+%TZ;Ojvnm)Re}GytN7Izu$#xwAR|++w zAUpe*J+t?_6uVhoX*m7IkOE*z0YXb^HQI|#eG5Ty2j+@&DKdq(e#tJ~ZV^>qdxPOx^{ z+wVKTLCEX<-?6#-=VONQEY6vtSA=a#6`!qadXcYhjXF>Ff4!0{PRqHonOMMnD|Yt_ zCs@wT=wULV$^y=&Gl{8*J+piG(lh~Doieqg0R1e;d#~w&N{fB|K7*G);=Ck(s}n{y zb-e(c;v{>T-QaZF(~gWIiFk|9M&-bH1d@h-raHtrP$Z`!w!U7{_16?z4f)+ynHrCV zR3U!Nc?N^cBdL$F41>G!`IxFf6uLh14$4>o(%LWj<%9#8^}T}6)(ZKI0|#WGdHvk8 z69>u{7N&-Z>GhQ8NGj031lA4_5||JikeZ6EsHpf6ulYH9EI2s07_gWTMivq%Tb^4Mm;v7&=Ym2L5>BQ-l#~LcF0b%3 zCh=bW%Zeu>QNx_B^Clz1#quT!4QD$F2tGWTR_-EN>pM70h^wz{l41IoPo~M$jrz#$ z8xvQ*Y%?D>@1st-w-PCk+-M=W*|QXoxAO{J1Z2X!mW7G$rzR;TQ?&2c{H0!N8oyar zT$T)bdPBPKe7vmLzeTP}7TV&(_SQ0)K&ftm(q{rD2XuYkjR!dJMPMS-K&! z6_@^U=^j7Y?Vv)gwYt_uu8O|TaH|_E49afw`r-!nTtBxsRQ#-=w3Tw<>oKD0S}%KC zg?`tE(L3J@<4kKw)0E*^n|MAMFVL0+Pvx+L);lb=w)0c1i`+!tjKbBpMUyv-XG!_F zCi|h6+Z6jBhUBn-tf*#3y7-ogRr`E12~X|76VkKtyQ+{qny>*5<4ApQ3hl~$yCc_~ ziR6Z#+Kgji;C0shy5dHroc?~4x3*b)E+K|jV?6P_?MkMp>UeO_*Wymxw+qSGvzN_x z{fx%TdAm(!rTjC`OhLJYxl9voL51!Q z@%#LdZUP1NlMq&VV=P}IOQQvY5pdXk)x-RuJm`Aup18}!v( zmPf-Fmna(bK zYQ%-vN`~chm;S_RFSLSxCb$b1+k($()ll43#`S0sI)2L~5Y>IpQp7#W^0lpJtwQ_3 zfPuN7pf-;xJ-HD@SI|87bbUMY+`^1B2LG@9>?K&?G|e%MPcpZ}AW75|<{nIL-?ngA zwD%3&{CMnN92kq6pdxoYKmN)idjE|O-V|H(9~G7iTEH7T-B>A@k*xQ~f{qS(PK6dx z>d2AE(|j=2{0{7r|6)q{pD@jg_L0^3?pL#>Rld(YUiXLfeSLlMY#$bzTzh|*kB>TU z+(2o7?niuYH-EinxY4V7^%EiK`&nL&8n15&6#~kd9#^<(sxUnaDay^(qRw|SgwXm@G-sm924qf?vu>T|f zjZHvx?9b`qghI}+e!QxowMz1{W+QKmvi-OsUf;|3&=?8jH7|nM$;wNa$6yzu$J`3y zO{wrcyvd`F9hc3U@o|!IE2_e4pA^-hFlmezJ02~F2i>K!UPnwG`*IVcn$I?1Bo*bZ zWbUhX{+<%SfBtdL`Jv^Zd45m!l@F7fmnBN=d@<#n=EjIltZu_kFdm$l&9OI&to=&W z%@Ksm>g`-yQQK2r$sU^S!0@0Fj1GGGyz5wbI)&H#Wbfq(NF<1YYHTr#jbuUMV4G`h z?Y`{5%d5%&$C_^fjBio0E5$;fYrEM0x-H91JF`*L70)c?e2#*D96qnWS>&BM9JZ2E zYiba(`{TA{+CU9b1BJg2FRz}y$!Dc@1r98%{LO>OX-5`kvRe21t1^;0< z7{uY>^Qk`AOhN&r>2>+);AVPC{Rt9I)4ZX8?FiJ7IQ9RAA&T}u53cv));F0Ycg#jl zLITJiTOA;to}L=)*WU&N1R&w#!!s~2G&DA@ZS=>_G`TV$;BokMySwl3`uy_#F8U@5 zT%-Vu07ZSx%?)%9VG;_v=XO2nsx}^|^uBlTIv-*;<99Ps;Gg%=ikz)6Et$^batSd2KWCU8%6hmUC1F za+7LriD)$?;6V8km-y^?70S7U-*6%Hl_xsJwmPjTF4nTkQ8CVScZY|1P`3?6DLfo} z-&_xNj{T2)%teTt$rN@BRu@){!U%-pUjOdfj8gt1>Ku$_`ooS#hYpPxF@#@R;v_wm zwv=d-g>`s`=+;q=Q#oi+pM@^ zNVW}-L|xr4Y>(fyiCtY=5N{8JfwO11e|;C;75g7Ag&@n1dvT59Ydw3g>uC<6+Xo~! zs<#oUSt8(FpxvUD$N&0t@`9kc^2Gr5Y)=T&XwcI-@)W&p5R zID31BD;PH7Y`jpecWWp;k+Ri!U&U$nx2Whh-<#DCU(U}N114(pd6Gd?-&-_m}>jsZzpsUmMUc;d!VYlZdvK#YzoyjbAsE*D~`@4(XTsBje z=K|upTaft8IUeU+mgwzNnWj{i7cv#6n>-|~WKHFu5RZ6r4TmW9J4Pk{A5(7`mSy*R4ND1#fV7g*ASvCAlyr9rNOxa^ zbW3-4r*wCBcXxBq^_=Ma`@ipZ4i4Do-ZQh-tTog7Hw*a_>saV{@|bI$bE(cVSrvMB zMN{L#!F47M?-G>i|D^dZc%}b>dymfuZ6t-?8T}P>evq7JebVI%i~n=+zGQE92HCQi z3zl_5@2h)HHmn5|hA*EYQCr7#lk=rQR}(PzXb#^G##vom-N)BgcQ+`We^Xw<9LFJ|#31vBCb(Zwt}b9cGUlW4xNJ%$ z^M2AW;Te8>7o~~6ZiJJ&ySu&VA}qB(CW?jl!H>DQxpnr3m?LQ~jPaXiIaX&` zx(^*+>vYxTgpaiT;QAxs$vvGtGW}R>0UcO%_`r+b&L;2f;&Z#Sb#@9qMC1PVM!WEuLDmX%p8p+kPZo7ju_g~(oz{ThFLy{EoYn3 zIxB%GC@9EeHdns&Gd?NF8?;of(dynjWj`Dk5CCUCmn{~>09u)UNFiR_+}QYlfsykw zH&yy%t{AmdtImpFc&ADPr0V;078OY$OIk9!(qiTTjDxYnWw*&L-m#JT7dY%Z`HEg^ zHsm7d&AB@jl59hLXcz<+Hi@u^3pZEccsl9CiMUrvDE${a+uT%7G(_kJ%%~tuh*@h| zCWtgQ*Ed(V)a#n9v}$*;PrdRm(h?1TXX|fMK_;Y)GtE8J+Pe`wMWPPHpYHk6GCnaO zs`t$NVveS5v5ZU6PV-?cMY?6iow8RTUG779W#zAkhzQgjc{#Zg&b+B91^X1=Mp;_o|&3;`~cq1 zLTxx%ZEdA6Nu@F{Fvxdl3Tz9n463NGR?XW^{zr1{ef0XYsjk~OqoWa07w8*}TjQAI zvNvCduUZ&Wqdr-Y!yCCB{hWO!>KDWRuZUUGg)85EL<5D4XL=zz$U%eVu1LDbbBP(q zJ`uw*yT_O2l>En^dHIu#6*!XH9WCI9Ae~UoV2O;amQ^24;Vr}3wQ6J3lR@JnK!gby z>846pS<$~;F~Up~1qL*PI4IU+tQ%iP`aUf&XFfcc=`o=kHLkt0c3OvdO^nW6Ri2}=Pq-On6;Xyf_yxQ=pX85WA<*+*;GC!-whQZ zt7#sM*NQl5>RebDm>90mxjB{Fhlip|YzdrD(lCeZ zw}{yJasJ2z-`w1qu1W3PHoD+{2zExCgkm$x?XnT2BDA`{Jl(YS8)<52M1!Q%)Ubg< zFSpdxLs#}?B!!dB{vi7Lr@h-|4`Pf)%@hnf;lB{hA(3u`JBX&15mSo?Hd*RUSTlCJ>qNojvMKrX zEym)1RQ^&LU$__dn8)7UgYrZJu>A@Sj5i~F7=ruGYd|>N@pQ#RK)F<-eNx{qCK1=Q zs_MsgC#Sl~-1R=Y;|>%sb&cgx9ZKR>p<7DUgvaxp5$T*QI_E=e95r@CDvj}6kYD$c zw)>s1@E_9y8}uh-Z4eCRqNb+iSDWjqgUFu4)KSyLv$OM!?qKWv2~tIA&JK^UbpC^- zi5v;*i!HI?4}F7!osV~y8Rrdj4QIXW5yOXTFNbuZ&De4mkxiI?pQ+ausq`Pg4NlgE zB6Dg98*{#F)T{Wvk|^gD-4w$e?_EyioSWo-kN^9JUs>Qrb@PGvlf$2|SA|rB00Yy$gCY5)Ki;>6|D}gpb!e0Q1if8LoId52wU*=e6b&~y9w4|;GOe2u zaxCArO_H%nd1c%O5bIozZ`MZm>7sX1gl-+G9rmHSMi9Uit>2z+ngn(FBllJ-uTm#k zSlB=+m1+cn!FHr!RrI6y=hRkoYSnOQ9?$iK591;P8O!Mc{Ar7ix0~U8BO^UW^HsVg zyKih=$)_@r9n82dA5L3|85!j@k%9C|p62!oKn?}&TJCp0m@HSt@QjuM6z!d%JXsM{ z@^`O+vnR!*R!Jw?Wsgh)9WEag>mD8;(P4?0%~!$zaq3GymF4?#n9(2%sj+>N)hBXy<^?0E@4B{s+m<_i&AH>)JV|LZp}BYkP|Jie zRfdSk*Wtn%3U8aRSp|bxO6-iR!+(;NxFuVWQo~176x2BoLzQ0d(6fGZ`d(GA&>7V0 zHtqgmaQ(N0k%Pu=RLzPg!Vt)kLvbR75TW$GcX$bALqqj-2~+www^*fs^S@UhkWK^# z##upbS*`92B!)d%Yz{9YcpHZAw#s263#afF^6;9Vy>WC%4&_8793O_a8X@?&toa%{ z)#U-|c=8~=+Z?kM76~_>XeZ6}q+ZW{XDGqjdbCNwF3i^wbEV#D!ay?NX~*>oKb1(S ztq&J3Q+H3#TLQN;h_}*7CG5Wabj=woZ`e58j~D(Nv}4Vm>}-bfDq(Un8jW=2N+w08 zjLgSFPnmBZV9w=9Cgqx$rh;nd?^72;33&07(_?|pGDfG$cAKlF_!mmUP4fNHb(A4y~Nqw8qt)UPoD38u)5vTAT8)_$lG$Y_HF$R@g{w63c zOvp#r2qSKZI`;Ui1b;*+=-y3mw^LANcssNBhr<&+ZvYM94=x$V{Ht{GwV>Z368Nv# z8d;Tfm67Edeq=IpyZS{`R5Ag*@?;o+nm0e1g4SH=G}5oTyacE&4-vv0G*9YzKp+sQ zLzNT3hY#sOmOu^2WVwP{@_C@&<47MDq=waaJ&^Yz`11T@{ru?c1JHUT ziU#Rc?pz38>qFb!5z5nBpd8H5?ew!cH!nIU%_gZ#hOTjcx)(NQ zhd;W%I-K6=><-47&J~!au?Y?V3!YnT^^-FX+zSjJ4tN_aI6ZiEzLHQ^wrdxY7)j2;{ zq0;#BF68~ySa!>w6PjvBWd(1C<87^ychJD6gfa#Q?Fsu4l&ax(}&*vdRV^ zeGLQ)shN)x%4SesI$cR@|H6_z1}`tXh4rHZPlmX;x&%6hG%n2@W_C(wJ6}F=<8suA z`P~%a$z~2E_oO(F4j$uE2P-f)!aeno^7X~!4X@5%1BUVV3cl@%N$?_!6`~j35}kKrY#Q$xA&mSv;^~+2 z2Fm0y|070XqT0ZD+8tEV(%*PU!=`9)xw-UDs21|JRN(fw0LE*)+lH9!1Eb*(9{{$B zd??C-Pun-OqFP$;i3BXyrhoDhGO;O1ii8WvVs1K5630Nh(!Q!Cd>+tlN0Fn}Hg~_h zu%N%Yp&o-xf$QDRTDP*Q5o$$gS-XBM3G$bq@9iw#=y$5I;eHImXrv{gA}7F0;^a#^ z35&4t0AT-WS~xJP3kWoO=n!E#);WtJY1lLG{~;)q0^})e z_%xtndz0nLkN?4gCg^WcxZW_@prGJg?;y$S7JsZBDGZz>JsF^_j=F|34Zyi6L1jxd zBZ9}T`aNra_YT}N+s`VGsYnL#%t=hcjI-*|AQ5TxOR(&w*~b4%?nIK$=gze%g6ePannJcFj1PVc$m)wZi?>T| z`shzJ8zq)4-F0poVO3M)P59JopXf#XUlEOu=jF(Ihpi85Ps_3f)V!KUf0{l(Hi!dU z6eSlIm%@aS)SIGUU(lKMOK}}m3vH?Vi~Pb-E%QUj#PLH_V z?ji0IzJ!M*^_?4?65WMJTe}SE1~8P@aF=Ki8vu%Xvkk5BdH0(Q265KPq%qBcsaJ*j z+V11k+l|U>ge49I8IjX7GMDR;Of4f%yrQ}Upqf(|b9_67sjrqMXLY`ZPURK&20U^i za9k#k%N+Gy1g{Db^~X*W5F>)Vt8-+xWQhoO%ooN~K=rj#5*hfH&H3Wz>HP=(cKz5S zFdyd=T%8@1k)S0}AdyySZ(c`iDf4H#`<`d#x_Vj zem=77(T6>y!ei07t2cW?%^1?A>QYC*-t=JlbA+1rj>WnuhhyAQ8k1vUdHzTy$WRSQ zKv1vX#ci%prK3KTIi*a@F$cXiNG~H<*iupSa%VGS3fD(FOhmJCu%g7Yl-9cSPd>=R z22(Ff{x|~n6&B{^1j%jL1GB-3EjPG|B|8v30X^7$aQDv zmk2MmkJ~4;J=$k`71@HmwM>?=2o37zeeQZ5q%Sp3?*gabc%NN8EdG{i=hrCJ3hC{; zeh~(ZHaJ~g$`0735|0C-yYpiaPOEDJl1c^(N|Yq-qZ0Gsvo3i}dL26|j6WkpbzT|x zwBv^D4|K)C*zhL=bjbk{SbF70!JxkW7GKq}tM)$1V_lu}a37qXDqNOyVbAXHstNVt zAC1pjc+TdEs)i{TAv;d|YuI6ugs%+?qQcnjyOUng)n5HAnmj(W$HS$4-YL8Yt= zEPUc}WE+%fyk{yO1%73oZ#;Pa-0YAs=gAN3$0C&Jh8s$ldK;{i+|?aGLcL-GA^(=? z7q|J4*j*H$GxezaP5kfV#)#TbKG($d>@D|TG(T#f;6?=4Do1_zR-4?j@?F@;4mAw= zTU!y2ust}M!iC1ph5``BL7}R!ytqQ+a*KK_Rf-%D)F$xis23=~z{`M%L|#5kF?^QY zqQ!JO4-ESFNL*a`j#f1Hu?>3fY3D_)=GZ3zP&uv{%ESr`Q;G6y5+Kio5#z_%PPO~+qRL>%W-jn7q*y%~=XJ5Zx3*^0wW zY29lSRFPmIfI(+Io$ZDKn(bauNzA3%lG)D5d~4@c-J@9%P(34i`TQiKud+5kFpA7u z!tE`(kPRFZQ7$67wbnx@x~^7|-+#0kUjprP5FY~P|vRkeYM3j}>7fBs^4k8yOHzqsp z9W6NlSv8z?rN6b!AEJndnuX#&GRvk~H_rvS<>mOaAm1zDE3R zU0c^qS5X;bSsv0SV?ElFu~%d15!}z*j?8Qv&%JjKYqRrEZ5#Y*@5C*?JLfi5 z#`Na|+!YV0vsKAZYs9TnL)$YIl91NKk-+MN3K#???8 zS)yx4(HG?!KNRn5exg5rS2v4j^8v|}-?X|nuk0l#+eg5a0N-;LU$|Xrk@nIttRv{iu-f9^+MHPDh5{Lr+_v?V zrowLcr$(?u?|^39S6flE_{kJTxxJfTeE(|#oH@d=EhhXT;HIdUKnx!& zF1};m5)7;(;M@sFLeX#y)p0Z8kG3Vka@A(hGzDP+rvte(vFQ9PWAP5KuLRw(Jv^RX`? zj?4kl(paZMM94%RznK}6C%KFd&LimrijF?`^fvPT&>RLI? zd-Y+fb(RuNmNvE^+LzN8a{(DXlE{9{-id~~AK${;d7LhCv`mOUM;#f|O%aWIfWg;$ zQ;RtGB)RHpNgFIz>QN_ebb?c=x2AZ_j6H|IxF!IFbY*QNLVq`r*Xfh_lE*s>g>*$t zscWX2_Bfx*8h9BerlEb|tlMGR!a4Mt=t3F~Nl?KlvU1FMy_w%C)1isIeRke4b(j99 zg>usq*rd=khJ_VXG=3NQ&&8*}RXR$=xHhnL$=PHBp9Z08e$Jx6nGk{HT;#H%Jsps8 zZcg8*w!W51YXqok$Q9TTExzP|CdY@H8&~Min)Up(1wTH2r9qh0i?aUZX!0vWRI>4n9d5-iwA2oxfC^5 zpvTZL*Vr3U(JCu@L1TedLb7ABxPks(Bl@EaSRlX7Mk?BucIJ?Y42h5x+RsHApDea( z&M)Q%gMA-ZzcP9@#x-+vUv9=8rH!J1v88YW2?Q^vXq!HLkYaDCD<^*mokKs5pM6Wx ztC-lfHQsV-ZT^{da&#(4GmbunYnO&n)yAF{IMrQ8?HStF%8G&;F^VOZ(<2W z>?b>$NUh^rEh#>m9vVOePaK`Oe*^2&?uE)% WB&lzWft=WJA@Z5!HYrHC#lwT8< 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

gH7dni0c4s#Gh>SOFv6}gwAHi zX$K21=7T$qt4|)@v4mL_5P$ECaJctxRE+c8QBkE=zD(-oV*?4Q!JziupzUG))>6Ge znz>k&8vLZL@%EbyF>ctiJC#Nge~RxuTsoamNi(b^O>fT8#QYqH<=3Hyp&x!6DfM z%JnDORGp8exjNMIZ4}eCynXd9JUv;(JHay+{65Jek1q`bfclO^B6g5??34e55wjb^ zd7>&p$%7(d3pZTZ?`T9qbTiC{M&!=3MqpT8(+%Zw1HaVIR$svWE5Fiu<&dNbh-$ftZ40Ftxe|D8C z;Bk$PmW7dlPC#u7m1%Sl8fQu4!rMMM;lzMvuUO>g!=Xah z9VwfpN`O1-re2%iU6vF{SB@B!1$Dnx6~S)TZWhkY&wD6sq`@^JKEcwyOk`JJAid%MDTA=PUNMoymZdea;ADQO`N_A|9W~FA`EC z444Pesjy!OwxDGFhjMxZ+652~v?cUpNKpK!_d83XGnR3Tdy-~2&4k&KhB!G_AhW;F zT<_(B-ksU`=@-83x*0(mXorM_x(@JTRdTX#htOyCE3 z71l0xz=ZbKmR}oAJ!H>dJizeD3DW)=EljqU9J6y0sO8Hceeu4>J_jq|fmtw5VSo%> zhI{yR`vhF_MShL9RR$`)O5x_JL5TzcK|!UqR@-;62b*q7Uvd!8GZ-lK}4Ac;=+s`_Xaf;hLx5Nlea+Slc(ld`JLx~R=P@9 zOGK)&`AVRvorQDo!9^~V_fLS;TSPQHo@ZNRo%+@&IjGHbHp``aKHBne+x5o$=r0Td zk?4hY>Gdc7S^}Fff*ewMkQHs8pzc(on=r|ktZ$?~I^GmyrU7Ft@r!KaRO+6X5(0*v zDPmc36f`q&Ez9VNCl910;-)mGlpqgX$uxX?3HznNj$qlgKZv)AH^E^keK{ z$*G`ysb*rKp`86XIVd%YuZe8P_gn_|UnKNmD@chPCU}#;WJMX(#qQY92UsGkPwLln z#mKX-s0(;`3mPlpnk3)NCt)Q*vg;)M2ZtT22}^AU)>jt#;NL21Jnz`*jEp%TePgFk zV8h|zFKM54299ns4wJ#$5mxgDd2heR&zr@5O*}aR1?(8c>~q%@D_jgU!>)P7>~kPp zsIqP9iGF+saEPfkOcFGm9!Fn&8JS{0vKl3rk&KkOreqtcTyhwD&0Mw*3AV{@HaW4{ z!hP(;nzClye;YV%*pGd^D61)^mFluetxnl51k-o|P71Z}V{5&nsbCY;<5DSJrV#Cjard}HuUxi&~a`^hEGDTIpTi*Mo`9o2s+a zkX6aVcvk)UGVT>2;x{w~^eM;RXw25d^Z;4TF~4;Gf(p$LXPfnMzFq)qkCPoa8@SUC z6hZ&}S{BQ!nQb)5;zV~74^girl;;Tm4ABLK!(_PqL&X^g&bQz=pBCLItJ88l7Y>&1 zcH4u#x)6(|(&Tm#{WV;br;gIiE;AVYOCiw{51bn{USQv2FbVy} z49X-P>8$NPm*6Gs#5d=OcKw}y^WO<&#sTx@)+zczh3tkWQ;{SZ!7ub=azF3h z-T=k$;v3pT*4MfB?ZnSV3$?Hhut)ginQ zEWD{SAb&c_4$6w1-CwQ{ zm8%GJ6hFTq9$iuheGgu&X6*WlH6aIh3hM8`RqT&!`4QT6zv=Ka{aX09Cea9=&g@j) z`F^1N{2FB!(GgZ+z169E@smdc*KfN;#_AU*=6_g($Tp?mFQ>IsMQu+-*a1^X$Q$H^ zK_D###`8amZ4&m^U7YYr`ZLqrCLH{_RL|O_{m-A5Loinekz^L`wbh%b1fFgE)NDfV z`49B8mjx@{aO~>5c|c<{9#9uw!%ltN^473zcYWiinMwNJ#h#`|IND-c9$qOlMv-I; zq_#2w5;VW_bgBOH7n+2%rc00#W3-5-4;M>Zt*K4N|8BfG{69?BPTx-H?k2Hp0Yh-` z{DOvTc6^DZ|7^GS4*|XFDEqVbj$qs6qg;4bP*9~tx4La6=lw3_%!1AOaAR1D+mS#H(jNsEqnC($cI z`wz&}W&|lRNi}~y>qNv@EIB7xD){#k`!;y?kob5{%)-XsIU$RQku|vVzS4GasoY7k0hh?Wi2xo0 z7yr~1I|bC?C*m2v_L;^$0UtCKmr=i1Xo~R=d!XZJsf}^=5?Vda~*p%jd?CO-7jJJb3hNX+o)l0JG2WluF?_$u2 z9#pEMg?T|HuZQ5aV}E#?578fPsR5Fb zkuX1PNmgLmbOq|ya2v3}F{S{~2LVQV=q>Cc4*ia!)-(syatyaKlW>otQ*L7b?ky+V zavU-RIK^~bDLfYCq0}~T6+BzGxaWt`Q8IKo- z>hrx9YFiV(h*ZHczJTo2SkPrY4vb8uGh-~1$ggW-(|Rfc;cjMQ&wzieRmgt}BaV1q z+*&dA?x+-zwMj^+2H0#8Fb161k|Z|ll0>Iw1=EA`;Z8?Qp4ue!I0pWyK`UmYSXh~y z;88Mw8{v3;oR;rM2sY>u~nwY4S^QMPCBaD&|@rHOsN|C)jl*a>pLrCLo&ozJWIU9}A(IHUnz zI$MqG>Cz~2z>Bc{*hy7lQVIzN$Iryf4GzLCHoMj~x%tP$&{Q6CY-z2o<~O(vd3kUY*#N~3M#Xz) zCPCDKj2xI)MS`Ch>yu9Ykx+US#OGiE4Vw(>kMDMm!Cl<#z7vq81S)0SliA;Gn>t^p zybpQwh^C8P9(?-v!7S2pSGM=gY_m2a6UbejOF)*LG{*^hbpzWm->Bxo672Qm4}_2F zZ=wp;$$ilT7YwfJM*av-B*6=S2phYDfV>kbzt8XA)#p?vp3D(TDRTA;8IE8QD6!4N z(|rG?8^hmw01;_EFH;%s+|Q7fGEc`LBSU!gMs>NH^r+kKDhctrLserm_}E}Mdu39o zlH7a!P6m&J6LK`186MFdF&u6$JhN9?Dn2muXZn@omGX4+vZ+N>2yrAP8s>QL@jE>O zn>^BD=SJ@|xz~**S#hQY`rJShf;0{EvCm@s#W4e4iOL^QQstomejnGDC+C{{;2T$~ z%S}+?O|u!|OB&;169N(vBno4lj6~_jlhiz3BgI5UbH>~g@+kgn6@0#_UyvV#`{Wtx z;ryX^ElDmzg7Px%x6if}Z^+HA5BBzsfn7mJBuTEJ*+HOZINADE0DoAX)r0eNZX^)F z?Hq*K238?qXTs|EY#AT4Q^s5|!o#s>X;^p=;BF?<<-d)VS`)ZWp^qjBQd#C`rTPLHJD$3=V^{wivVZ2@qnVkIZOuW(CVs!!E(w zJyz#jLaWYkb>IENdm`4N`+M#iMye-7q1~y>3?Y+~TY8Jb%!Sis(vaXULda-OYih)i zMWfZsDZ@>>t%Of+9`46ODin_&7E%z%`1a$E?1)Ia2rf)n18$LyaWSfb-qaD-32a30 zSV%God&sP@tCsaC-`t!K=blY3jejUHNg-~+7#K=|a7P?_+Zk9uQ(+;w*x8Dx(k_Y~ z&DEF%IH?W6ba|%Offx+2>SZj;2_Z&2OF&|XM+1g1#HA*LJt-mYoux?Xa&t?F|Ljm! zEpjOj76+l=S)fJ4-pUmhuoZQL4hfs3(oEQH|L7+GZlmsw5hjggeVUJt?^L|sVp z-SJqI`n&Tr^{tyI!r|qZNm9}epca`D8arD?e@@mAD> zm18FLG^u<}yhzWv0{V&9LSJQ1j_|E3E@gR4T0K@`42)LS6SQS4Mhz`l9T5W62luZ5 zFD);rrr@4@^m3Dzd9vnd1>YkQ=J9)$Ew603%lEhs)8clAqtxfyS-**)?%I+Ge#^UL(rjpo#?phnci_;;aT^00o8C?(g)zgY5s>c_J?P~xj(Y`3Y z=_fl*LTlTfPUeUN@(xL`76aN4>a5F-{h-2Sp$#gH_meS0y%cq$yg*g zgbfxVNMr&93H| zyI!u=5MJ%&D+7-ET88v;>i&vdW;&!+KrM)Jk-> z6H9n-A?J%_!aiPf;$L}@&wd(H5ANN7cmLIcM*BSXV{F=;c&6~D35L(1NO}*}iDUF% z`LS(U$if-KXQ;0;wTx^5nMvn5&4gk9%AEGT6ZYyhr%_^IqCCZ{ zk~>qHeElA08RqxN5d#BMX^Qb)1|_er5`v>bIUc-Wh^nXFMN_RO7fg7!ZL9qTtM$#; z)U@24-H1rYg__QzN0ODwK|x}F;{uFKlXna-L3369U3}f7j)aH^sV_hQqSI3;qU#=$ zqpvF`=*F*xJU}zMCi&CcCniQ#P@W&z&;mPEwYc=u62{DpizOi5kD7a@PkUKzxtHGz z23cw>tVS1_h))-4-fCZb5j>PxGy7L|2bDK(EU9ts6V}H}WKl&JPt4~9;jYWMKm?({ z2U`kGteH`)JhNKK0wjT(XK(a#d;PSnpwIs6>5}d4cON?Q`E?9gm**D+pBFM-P7Jnc zu^rO);f7|GATk{)FR`)yn#*jZ;R0ZIoIO>ngnTAqt=$35#OIS1{Oq%!ugn-cN?7YQ zhU<9=!7u-dum86#en9XebA6_SlvL4Fj`9n(ctQ2mfS%1gukz4DB5CSr-^y=H*hy35 zZ+5XCpvH`)_0?(~Q*)V!;%UmR)>~nvSH$bkQliWEU@zJd!oue4{X%xea)GyI<&Zw8 zj{IR19~m~^rLeHrJ6iiT3JBJDP79XwuSKaN8qR7~z?N_5Nog?xcCO7Oo|8uvh12Pv zXv(PmN@|gl1&j$G=LzmcBZ)}6o*XGoF7Dg^qc8|xY7Ig?NGk70mfh>AMH1K{B1i}I z&{mM6A#b|ly)9&eAU9)$+L)D#)FrYd-5a%ch@T#OG)O$?+j2xfB5Kvo-Xiz8*JXyf zH(fpEoP}{{aDq$6N#6`Bc#gF_q4ZmUe3e2I4}SKlQG{nwr{dkCPs9E zM>CV3A2Fn*mOEg_)IykL?Ybt{*>qYugC)^9~a^y>q6xguQ=gu6=a{D1MY4>)}g-^zg9~0~L z+4U*qHLaW@dQwXN0KofdU+R6HWhU5%7frLKFtD%Y6^;tHs}aW~3yAS}ijuC-X9 z$V{5))4J|*3_A6b2OF?+QSt!MU>sdWvsM2D3v{|l4vFN$2~S!&=4vXR=;`_v zW>oE|qo+jwwVg@*<(0Ro-Eg%sjKSJl%tWvDDosb7_+u#>fRn^k1RtoM@mSD5@(4$-Z zt#Stb;}G~#5U@&WX#}8ue-AViNv{D}5^DdeP6RdR%1V90q6+vaVtROa%P)0D>hN>S=7x!hl~qs&O)HBJL0DmPhrRug@_VdxMX*Kn zZxG4e6nkxUlwfv5(-q30jXB)B00v2Q)612uo@cZUwp-$hJ)Pac1m%op--A-jwG zCTf?h1yUurcj9}@kw6BC$pLg{eqKz}uycBvk$bN-8#lc*w5FS_!h|TrZwjaYCb6j<&WNk8zG)8E>lTQ6phxeCXJ)ob`H&Kz z_a7D}R>F^_wRLO-ousPvdE`$DdoO7R%!)0c28z{D8q?$xHEyIr1qt$vYnr1xjc_vU8~u&=X_& z_BnL2C!vw1v?IS2Yo7=e<^LnU36UJaPx-#xEy`CJGaT4Ew@^(TCaLq+XoCb5xjHJ9P3=Nolyr{C=Jm*RBQqjmRzgP){)B2BBM z0>gPuT35;IQX7r4d#Lz+C5l*{fEKJ7TsGfIn)5ZjGJcRw3w!8$YG}=bbLKVN8-A;LUoXzey)gG@o@K$nrcZ5D!k< zS9cT4I%ocL)J0P3F`D7AR$mTAzAT6}zjg>x*t*2$9a(O9CtP){s^N}n!|}y& zKisjhhV;`n6y#+6ADrCFD zP4#z08`TOLi?YlupEpbcqaB3;P>(#YTF`}M? zby8eb`p;wxfc~=MeDuY%Pp;#7WeQ0=9S|I?SWXo{=lAke4DS4QNCR1&=dm8K`+G?{ ztjeGYL_iQ1+$>-WM*F^_6zsXz%9q(AUHX!sDWyvVN6l%ObNTn`Wb`H%%@Na(qVSU- z`)F|o5xwV|KL~iWRu>Y%(%#4qvIx>)rIa`y^Kd@eY(BZ%h8FUb8jced>q^2CEKin@ zh6=9sM=CwWb&%|M7{OnWh(~)mcx01X{M_F>21pD07grnSd8%6VtcrMxl#&0Y9P`p3 zfVYBpal?SNG6v3Ox9Xqp#`D1I%0B`gHrBRPGSMh3utaRc%j7{iPa^&-SZwh|e|ENE zaG3VJ$`qYY~wQJMOozMYL*%om)?4x610)I1tyW zlh-V{*N<=rDx6Vou5xK4hWRjAGHAu9Rs}U{87u~p&9ocwa6Z~Z!q$WoSLrb1&!z1X zWl5kiuu;@=fBSA6aPvslv9SLY@Akq^EaB3}t0_Y;Cg4mdaAfNZUj{ad$0NIQvOt`; znW{a z7E1dJv`s&L$QM#$z26~KMuNkPwzrZS#zA<`lV0&6GVmIQ)NdMO?re5@#mmOfZ$V7~Hd_H5N%BSLbmeFdwxs|)Vv*-6H$wi`{9YwH_zDt0J zG6M_EQ4bqf$mXdvkK=q~eI0&I^_itbj_}sHGVi1vxU@*Qr!gPDwWv<>SDk&d8t>)b z*E;UA+LvT*kIEQWn9KJ3o$vke@gB zHR{u~FbnWj)@u1U$bw<6qWDYNV^Yxll7wG^_GzX<3W{wg$RccIDpw0XFj%XRGLpc( zC=aN25(NxfVzR%Hz`OK4CkY@MWLH}&*kY}dj$vi%NODDT+KBGzNX`D4^T|eSvNt{iu9GxEK73d`(V-4=dkGVPsTm>8BvwlPD}B zUfrxeS%eiCX`44O#F3C_ldo7psO?(q1+`@Z*UZGFsP#MA0!!MREKjgnT09mYn_|cq zaC2sf;%w%tDxp!{H%osuARfj|Q-(gZBBv`T)~=f@KTR6@%`1yM-afhK4+J7^S%!20 zY$9UNo)@+V$&sVQk-q$SmZn(nKz;Le1yr5nwV{@>Q4~&|luSkk*DeP9rX!{Iyw_G$|h)khALnwuQ6-3%&_qg6wTZj3F+kFd=hm5>rn) zAwT+ut@e89J9R#Nz@z;1Ne#X>dad52)@ZFo^Ypf6l*Rqgi)L3f;OFb7?J?MZGx?=n z-(U?f76^z@qMu7J1EwH)qzsU0aI2|xJ>e{1l$;7c4C~aS%upzDZ!t$vlXS=hb3;5( zH{1LmCCZ2&h$}3!=#!DM4dK9T`4D}?0+N$uvs zo7Y)h`rywac$-e&WJ>jPJiW@6#O4-lE%~%|8Mr7|f_kTCkZKLDbC(-!QFt>bTv=ay z7tlVtzYM{>5>9_&cA=Tft{Ia;M_Vc&+8a4v%K2{CU^5&h1ibJ{AN#?O(mT83-RyLL z>L1M7v^sMlrcJF6Ok@f`z_iKwfr8f=?`Yo?+4;w2ckIoW<#amvb0dOyO7?bD!_a;g z#t(GC`%#Jys8d7%+Czv0<-hhIhM(^HYe>l%cMYb|PU~f5?j~C$_8&cAW$dp)zcp*? z83-J1WtHvzG*#=-)NPM}u#ur36c!93+f2?ZyT+!P3-R8@0aMY=*%g2{fyf{51d;JS zbA9U9fUn+H6Y7zRvSfa@oaQ1k8zpgI+uJ!~=)%0Ws>lpopIcCrf}I{%a5rRbs)SCy zoYb{wsyE@wcfkdd8kL8;yS8!&E2NZ^ypMI%+E$QqQ8R^3c!{^miK`7I47ct#Xe8rv zqPjToJ+<^Wl90M-@7;J(j(J9ZycW&1wGmn2(*vW;W%P051*?94M#% zYac3)HoN6U?7;K7A+H^Pxcnhj)$&_F^N)ZQ0NpyM0k<1ABYd`QOr=T_Yc5SR_{#q>vUO-+dZB$3)apJAKKnP0;n^LT$u`Iv1#aC zj?s56GA$E@x!{4P577N~)rK+J-y@{-rra{jCg4MMTg`D`FX9>gv5L6&U)AV#cUKzJ z+ppjn%{O3i#0&kNMj-oTA&y7_Y<1S_Zfo&&&HtDp`?R<;Qf%0fA^;0Cj#4Ed{_xXm zAbkjsci*#NwZ{7YAp2m&-Khanw+ylEnGv}7E9*!CY)BO)DDZ$J)OOPuf&;iq`Jo?i zJX=~Kp$(6nl+I!f)5%~H$a0<2;1~DU*Dpx7$>~_aZKAV^E(w#Vsif%ioiT`q9R0l9 z?66JimIiPn$p^F9-cu`KIp4HU>z&e8nI#kz4FWQ3tQviPYN98^XSd+k1{Lgk7zT*! zGDlv}N)2%1{br>O(U>rQAEV*DWqptWm|xoQX_io%xo1*ojJY#A^5d9kwX)gs6GdWg zH62p}yYmJ+plHU0kv^e-Gg=Z(Yu$LzF3c`aKvz^saq5={##>bw8jV?0UdtO~+Ej&oZZc@B0E~l84=} z0*_tpb{_Zi1rwhC)Ge*1c)gQd9e?`HehSRjB2;SCe>WTH-a9MXgMfo6iV#qeoVJ8P zlcQp`wT&B@0{oz;Hn28sWl7`z4A?x%wGtTa)LYs+@zA7k;|Xxw!2Xl){#t9gBG_oT zlwgZP@4Y^p0VO3`o%T=u{kxyLsv6lqmyRyaSrfQfCz9KP6U4*{!8)0ywhJ!djI_Y? z#_~%5Ce5gso?a~NR_z_SEDo$ciHOZ3_H@>n$gpN;=d=?Vs`b1S(2YEse80D+ z=J$;fDmj-2x69o*brP;F3{<%XHnnYGR%(R(n#p|MG+o_M&7xL_i*>-*XS#^4toNuR z;}mwSi8QBHNBobfh_x%@d8Pd}Z3|BRKSOL${K>B09ggRazj_TNhQ=K{7+PR3<;rP&{Z*w+UT%}aA5mt);G&70*F09r>lcmZFrri|*1O?PcCN{dBu|;vZs;O;%WFnKFVAtyaSJF#L z9}tSeUh4*4{j4(()637PK{IM$5M_Y0N*5aNUh^9syi{=rRH~svr1P|%?%HtlEM$FndiB04No}yQcF=4Of5t4 zl4)iUo5~4{)qrZ+@`M4%k<|ffq%Af372dZTehmEHB6mb}-d1!Kn!s zuyn!v=sXm+ksTiC_r~n%dA02bH?7(jQ6=DHB5Uzv}dCpxfv|0W+73E`9pDI6Zh-L zO3ZT-_l_F9Vdyz9*R|rvS<4HG`^I@{mep_RUcE6kGF;5C*=J(<8fT_522148tlY-> zHc?o@Iqq4vtrlJ;u7E8cwXc0S8uV4tsO2gz(v;zYw^e zbusV_yNIqtsfeGt#8UY$<)58ZtTA*!r24#mMkKPh4{8#Dewq)=kRRVWJBA&jNL>#< z?Z{m1IKwuR!(D;kTgnDZ4=Lu{X_W}L9LcKR_2G{u5PV{CO|t_fmSi+b2~uN!0M(bL1uL9Oux2WPA?|k-9n4x zk?l_5xsu!6AjG*S2$m6eOg7*^N42KK>I_xFEhWO|RzElp%1y|IBJ~23xzgb$AUH&c z=MZZH2!A-VS>KUnWj&MA%`uehel#j^9+JzoA-sOa=JaIiA0BEi|ES0BvN(XOpWP{y zjh}MRiL7;_Tr%djco{WxzbL(%K4lm+%4xYS4^r2BdEK~!2`9eJi8=(=!(7YgpPb@7 z+wfu|i1Xn(VChLCykFrgRRM?FIQiNx>(!j2LZBO#(QW9WV*In3O1NE=~S2+AcQz4tb^b3`eg06?ORi-;+R``q7 zg*`7QTm9$Ea`JrhS&cTxOxo1$+w(011cZNC8O6y$1vniY-7>4KLK{xokXclR=U3L4 zjIF%}O`ra#ui+o8Ye>Na!5Jd@`2D zob0E!2kaME(Nt(tyC+3b%eAf;-Y?MoNpw6~A!7JC6=h)Uu8x0-yU>P>c)w9tXw))O zJ#+nnxMjItAlw6nM89Ss>~G>SiJ9k}>S`LDMk9bbT)G0LKETY(NWCqi+fb%FezelE z0gRiYf6ixDiZmxIh!b`{U*Vl?c;*lSHsqIn!#d1JT=ifF@Muj^aUtE9yWXhM*aFb?Io8#m4np%=D;_F@XoQZ8~k~=!*i8t>kiMG*@e#2yrw988i-a6e6{AoNo`D74|a=V+Qt8m>v+d|y+ zoxPaN6~o+vw{u0rl4E2n2K-Qm!RP9sU)&q|NLfqig%THcdp^g8Hge?N*+zs*>%j;@MKa2YBw1xq8>;8+Pfq#^L`??GV; zi+sMiVSC0-NC=2AMNo%3!+AdF^u}PKGT2(f3iT2Y>wF-jckf(@-5o{KKP08Gco^R_OjKr;uwVPO*M>kwA|p{CfqMK*`}pZO&;7o6_CkoXSy2A#I(bQD^}EfCM=e zg5}w?&ksrM7w9f6kje>jM$O-Moya$~JH^uL#pSr2t%RQ(pmefxaz?xjwV97d-{wXq zwK&coj@OfMzGC%!PN0vwyL^*D4K_O83R{rjTKq{kg7@A-GL-c`b(z4vX1gaG9*b=%Qs!rSWZd>%me*8Tqw0Y&BmBkM0dnrILKbEGgsN zy5NStQ&ET5*Txu^AoBPYqDFP)k)Cq%K2<%CgtKJ+R`JOhj+M-v^1j;CUx5v*4wk42 z)IwA{Y}Z*-peiQLE~vA-W-jr0gd=|48sx2KT&>%QZnrqU_5qjNeVNY$Rp?1bnw-mB z9W6xpDq+0yTW2)aIBo49A{(&f^JPm`uLQAcGUGw+f^@-%PSfRj5shfUSn`AQhjJ=R zilqK{Is*i;o`aCkDBesFRAp6_1tBepfq_A*`!%8O=erv=r!z!mtg`e+uq2Llb<*{g zngwZ{BaWgCZna*w>a%Vxud6bNlg;KNhR$oNQGX$L`2@NNzTmHN#Ppkfdufla#G`hD z0XS^-=Yf2_Irn%eOL>>Q;0(s&I6W`roZpYtCh+ymj6zG7kqZ?Eye%RjZj17WUH;i{ zHwpY8-{7#s5}GtlSXH-`NNm!-meBeM)@-v9Rp1pgV)zF!DYs^Y&zD`HB&3L8^Yzj^ zI&1lxm`@GiktT8f$SQGcB98-DQCAWQCYzh++T{IAFqj&upT_W{j{0&_EwcbrBFD+kS* zM`^^@izo~S-}|JUD~$EPxBZ&!lMwrZCJXRH*v7dQM;jWDIaRs^Zu>U8VNZ0pKmU{#!Y#MCc5 zvkmupgA1f`-MvFv4^?vejx(Vtga_Oh?9vJRr))SSD%$b!7?o;&Q=1Kn6?>+pRs2sY z2^YzaHaoB!Y)<)z8*42lt3_&O98O9(y~Vc=Cf=7LqAU)l?{YEdfo)c72P<@P<*We( zUUB*>TetQP^A7iq>oXnQ^%WQ#&3+3Pt#`5z%0eJ}cz$2@@W55+KGDE|y@ulnd+c5} z=rS2Ly}#plM3SDe%Xdmm#9xGa`xZd}@BIn!IP^-2TO#Rn5%Fhef5GGAAbw5})Xl=8 zr$OR$V20j;O*4}BH-ZePN6^ocLqZsHHQs5mdm1v@O66y^IDp{RbI;CbOcBvX)meed zNlJ4pbYT=xF^m5-2`MZiuHBL!jsY5^xeq0ayVFKE!6KXG&yszj*W;=b(e2t;Uw#=> zl^oZq8g|JMxHdWS<2T-MWqvb;Pis|HhQ7h8xv9L%?24*xm5MFpH!&c8_J66vfnc&*r@iJ>uGj_n>6Mx z=e2Wy?3mIc_6H0PCD*VX+-I%Nw5Y=k! zh-@ym-TjfI$C?7iLq;U^r&GM;W(OF;k@gZ^nT&h96$m3TXi6t8$Gw!90)iVPtkintek$nI$gI%U1st4oQ40v+TuUJw{#p-?ub%XEnx9*aQU<%sPRE=L?n)ZxzENWtA^GVG-Q z%=HHvk|W&zW9u!W;^=~|(Lg2v0)zkog1bY2;O-vWAvgqryF0;M0t9z=cXxMZaCdj+ zHhJFn-tSxMvic7rJ>BQjsoH1Pu4-*OfZmsV2OH{XM&HZ(-i_Uy!L3d%HJgCZ8Z7;qCm49L_(*$^5PYH^MIMd2O*TH* zgn@vF5S5%eNbF^SA>B-|Y>!F9y+#(|Y4~ zqxov9=JiU(FVm7jtrh%bXV@ywrw_;(>sII0q^5=F32e@RT4DSg)F2Zq?^~WEuXoq1 zKx({*t=^KAY>H&NimpYlR-rmrI`~t*5VR&ogWgnYNMN9pFb9kk01$(&wiW+*W;c-2 zy*yb9rpAN~8RdVweF9Lz8_9axR%eKkW6hRJ;KGZ+jm9MRX9UC&GNke9pgg+b~ij^Kipk&!`r2La}8 zb8jN+Znf`pJxAt3B)yViwa!x8YD0sSm9?CJ*YV^>GLJjfD{Oyx?CVVCIUMp;2pC%f zI&TRXTTv`nHR#Ra%j`?e<)jIu_o6zv9eiRk^Y}!)liK5lN_cnd3GvRk#xR~K5DqgU zenS=S#jd6f4war%Q;Y5~w9dI}>A|J^&$x+rul&9%%l7bst`SN;L$ zjyvqRk#RxcheQMH*~P4A+Myr41iGoHxayLlWnk)a5|w1ED=vd}Y4}hFFfX4a)*|dR z&W;k+=gW29mi}nS%p7hY(&%$?a%!KMK@;>x=olB5!C-p<3`%8*Ogb4BeR*WWeic(R z0x!(rc+tDWAdW`Ohf*Q8JEI>FvQ_TbBwJpFF zlg)}?N6yn0;{<4zS&ldgK`$F#n5j0>W=_qKj4$K?5?9WjsymfAJ)f%7T!TjiMF@C! z@I0TdF?@V|ZEJz?)J$^FeK|TcMpJ-w`Dhjx(MINp@M>RsXx^#ZP2QGMt54XEb(%fJ zbUf`_yI{UD{>C7&7OYS^WlK2Ks2)QKxJ%3&)f}qMX0X=J{dyn_DW$wAYmJZ=ljGGH zrr=Nh3~-3Qy?9W|ZJ7k;z$eCwqvB}+a)u8)_cI=`6w139qvEOyr_WmRwTgeCBt?Jo zF_WJy4cgB`#y%X)SG+x(Em7!Xa&5Z|gVz`?S3(Hc4{N&5H$U1Ro&7dDJA2m#d2GXx z(>l)fR28yZZRHNf=Pk{gW!6n4-kh46nrN^!Dk*H_b-ke>A|jgB2d6capII0gZFwPm{d%IMm?ap%g7!7@a{b6Xf)?q8bz1~E)Bq9Eg@eSkUi zNlR;JBI$Iqz`9WV$HjSr*uGJwqKsoI$k&G-r%;z0{*w6j#{FwzH)K7F3er4t9s2WU zZ!CQrk<5OTPfYqhoiPON%E_4Kj^(&14cS4NJlAriQE6fFcR;}Ae1(1jhdq@;N=xzk zp^0l6ow-s?Y~H6c-;3ZeDMCt0I5!-O8`rsD*QT!r>%rTen*gM!cQ{UzpmE*oMI<31 z$#-ucUUGixNmo--BfRwD+%kFpfb@0WfxkoFbSHMFktf&DF9GppOM{-}RWuZaWz!P365u%=hJf(RTfrCa}urI@ZK}b9lA-sbS!!Oenuz?9P;HjLim;M8! zY7rzwpv&_p)$k*1;MH-!dVl-G*1Su>1JU95!9{zvREaTYm92>O3fKW){wd+*fSS$4 z3W-$lI8es(rKMl6O|$%SpN0!1Lu$#dc?!Q0L$=D45;L}e!YDbdLqYV(1p)sIH9hR2CPs#h$O^80h|krti#aPJq_w5Ycxh| z!S=HIw=UAjL6eh{{n9(1EtX-)bX)JFP32B|dwUCsG&;)ZM^6`MN?CtRlE}POQ&UrI zupu2yX7>d!P?38Qi@AJeb3{ahMCG7QvohOx;ZMUXbLxHY(2%4OyXOnnQ^Z{+|8A=D z#|3)Nk1uzdNb^fe`lAPkCeZ{kekNyIF73<-8km`<^ebDU%wM7r0Lt9^2k7BrSp{$x%TD3GHu<6~e1 zXnWk}yeU{|a@<@nO6xI7bNBD>7pqA-v{|Qc1<=T~>SKVg8!vClS?sF5R#6NDT;*#a z;3e!Xt)A5OiX{U+;tG8K9=e!g2|mB?i-Fu{Xa=;$Q1_Dg?`_-mN%DGfJAVZx;05LE zWF|!!ACu7cWfsYdH@)p`RO%rj6zMQ_Iel6VQ^p3z*G@NUJA<@;#)<<%iJny2pe7b{ zE~14IVORWr?+tMFaqWTRWEqa9;Qry^ZlD2cIC%hK=fntP>*_Z8RC?G2BGr7eXgc_~ z($gb+KV<9INV}vD`1Q5^J9gV09RP_01_ri|B(YZ5?aO~pW#R zt~Fnx2T;IofB%h6KllW8TQacAA+2#|OWZVb9&rzs(|%6;w3amAn^T z%+Adr*lUD5pN3wgFQTq-`M$3)B_w68>aGa>BNY^w?ejVkYbUTId4`2T_%-{8YQg`; z<{O-q5HUQr+TS{=qiXnFi_XP&7_ZvY)+c9qzZz=9e+lucl=dSfZ2HAKZ0QsZKTpWB z%F0DVkhvLK$AROjd%V${hPHc12nL6szNJ(J|2!Cg5T! zd&viYf#iFKDi$b{Ctk1k8w8_lH8h$0i9&2mx|_>+c=c;N?=2tzv7L&1)d<0Qe;|qc zn}gbIqR{#EA2jtIB+=2)5u5P5vAXF`5-aC&Cn&)OepVjsrYJNn(3D^fI+Njdr7q9DYT0KA5SDP)!13_6=5bf_+rn}sB zA8FC}&5+F6;bGCkSnKWbDT99RS_b9VHqH*XGz19q+cIJwUC0a?52QmzB)I%Fh<-m0XWlj+Y&dcGLx2&)`0aFx`>ewh`*e zg18o#4f4iqI_=TF5y;$}T}44EFPgX44H;2zCQ~NBG6Lbz?`+&BBcmiEP;JLNj){4DUGehuA|W_J2Mb2;6+a$ahaQ80)8}X)$-TnTxcRoV{cu!!b_L(aGL| zoIZm~$vCgE0FA^d@}(AaV{-c73o7aq)x6-oygi8y-+;DrjkUVV`9?GB<;?lPP{J$f zMge`RY)LT<>T~;3k2eVi*vp`dS3CrqOPBE9))O$hSikltVo`ec2fO;}6UDf$6K75I z?FE}am3pn)kdBSE+T}~zLAckmaX~jZK5R_>?Z-*8tf(yDx?z6)j>9n4mKd#26)a4s z%+j+FmGaM!o5%_9E*;0D!vT$D`T?@eMCWoRY#d9kQkm@}F>n>HXPX4g9&!H2c{I}f z6`Ihmhy%v`4JV_xUn;TtIzDf`+dMh^&elNF))gc}g;(EjD3$#9?qSa?$x~q^#HqCs z;sft5tmCr&1rA{p*-ozQyH64KM92dlfgiXEZ11K-(s^PmIiDB~a+x;WFMOSe*G0Ag zC)>`2bD-Wnu>idrF0wXN2l@K)X5qCOL+jJsQA->09tL~>2YPuWGe7Nv46vP~fi^Sj zBD|#h)kBVfq1#$n8kj5!oCr&l&v|GHo8d87{9jd-A`Enw=xx!*u1JRejamJK?daw> zQk>gi;rY9U@T(=>2^RsR!tE&twOMKkiRHN2;X zBLX0;t+=Y2qGu`$)8bh%MMuCa`82K%{dj{b>)FH#yi7)OQn_ixOxiPjO3`I=y-0INt0Eqa5~GeB&# zcJNDiTeL^~c0*tO{4%ub!nI&fn|5DEiXgqU<&2j^$0}RJ86FbWCz3PXt>LT@z3JE9 zLfpPO$DZK-uDRm8q~ao?3icwRYx%FJ^}ZcR?#t?#tE0^?wO7wcc=jlBxYk7a23dE& zKwCdtE=Iku?Uz=^D7AhzEZ|4mshRGIBCH+Sf6DEm>$XySdzBXe?m`;cpNmoAw3}!+ z9yJ>W2jB*9 z8Ihe`#Kpe-v@~oHoLJ;HJiHNai?PZGSknnD6#7YJrA5ZBj?5QXuaO-zl~0&)fis>d zzK|Ycx0lUq*CnW5uNsFYGWz2`ZB`e2`Rd;L8@fSxtNXtnv~El~rIZc8%*yQLIG|~R zPy776)l~KMME@6_2%V4f4v!zWx8aKweD#vEpk(giaY%*;Jwef%*ATMo2~8t{cZ=9j z6M}3!olV*3dP~T_T_nKKo7tQs+5!|jVj)A{hQ1jgSs82$J9*1BUXljGLe~^(A40cr z2F7-}z2}`MwAJKdG3@8&Y+<4S2513xIIRWGwO^8ljUI0{cCDr=g7YE57`E;`3ks<= zORRj851cXbr3fiVB8XnQV=agM--;J$S9K1W$=oVy43sr*S_YUjV3|g>hkLqPZ}0_5 zMBd&_2P2b;gdgWcP-Kq@q`ROxA>SDdFi&3|MX;o3D4$k7EC|6?F}~Dx#xQAg?kWEgyJt3!*0xA`|RsfvH*PFB}oe zm9~bYEprsli4=WlPD^k~Io!$3M7W0P_|@{z;1IAT;K}@n2IH?6e{ff0*zOF=1%zR< zmZ}0o!a`L7uV-sv(P`&XT-)yYVvVWOOBbf0uyW2}6(Ur~mUp6KiugL>bR4k3dd?!dK_d|~DaQyssAlRc}n zDJM7@L#~xW)A|`VB=;?*(Jmg12?+{=_Giq6S9A;1ra_t7ZkqAV1gk-7jh^(c0|qrs z0G-mznK`Co>BJ&aST2Vhy%PGjfiP66sMgZm4^b5h1)4d5Pr`=kd$B3KR})U7w>Q*x zDXFN$#19@nelUFdCf~%ar?m<%BZ9+j1A2bE6^+4jzj9}Dei+-}+7&OaX6O)%VD=sJ zy*?lFfoE%^ONj0ScZU^O&sVX((R_5Gkh2>9l*ZLJgbJ7sm4AB#MAJ{-pa$KR5wkh7 zXJ!hkW&gCow+{OVXC$_+8TJCLOI^L-3v_Z-z*}b0d()n?SY_bOK0zCj>HOmF?eyq0P`De4A@^wL#m6a4W%thS;u^8^|Y#bLzU_Fr@>${$_#pN&|fRvKl({Y3-w>DdK7FQ?)G}> zHX$Y!B-%M0LyN5Xhx-2Af&gC|+zLrA4H5dmpQ+QqXimP3T1C0Tnz?v3{ zYOOJ~LrIgrX}q3Q2wBfCP3RhU{QYrbV|##^=|Q6^fp2XUL0Me&^3bT*(rXE9`5!6q zAnk@<6_pK=?KTOou{qrUx<qrO=X##p@0Q9c-i5VmEs z@m$}@Dvj4mUDgbZfq}vGd^L5qpO;n+p!gXyYHDgHSJ%y&IW1~}Ozrt5+_t9+c;yoH zKU3!DJHWOeqzv*Swu<)FSNo@1AgxC28o-;H*aFabqQ+E(>v~$@9oZW^+-cF7`@O7) za+__5?X0xFe+wQe-R^CG-BaN+z~y$0@j^oJJ)bK0unPs49|Er1r>DPH@5#n1f0!1y zg-ShJLCFU_&|kFPJhOgst$W`N9>8gJhhEoO#fsoM=VK-!5JZMX6V6O;lUGQ3W*rVI;waS(54^ ztcXOQQu{TAS;d1WR6d&(fB%G>WD`%@ulvt*3I*GHM?d3IKxtLo*cSpdaOAJy02La> z0oS)?!Te(6#71T@UId=}6E1F;V8BO8$pj!rM)dWobkKQRT-+-W&0@X?($>~?dpxfD z!ew1)@;hs*FC4e%pw?mq3m{PCk8gp%%(b1`Oc%_qArdD$Xfvjn9vrU zfDy7ep5V-uX-AClJOZi^2Bn!-vJit#OUS^0giI>&_u86HO$zZ{N=nN5{yyA^qm9kC zADWsI>HKdK{{G!gE^6e}iK3^DS!UXE^@K!)jSuumsV$Ww-MpCd*W2)X&`|jy_sB}u z2CV_3;KWkfb2x=pdSYzg_R2#;ELPy#Y$ssrQA&t5rxdCplOsR&HKIFNxhc$ZBxb&I z-?hsUr$w!d8Wbbv=h0No#DG_FP{xE7mHF*mV)h*Yv47Z~hai}eXc*(IsKbAXY{7JN zcfnmyxt^f{UhqHJijrS@V8t`No|)2q*wt&1rK|8--RZ3Sw;_V7D{(a47cKs;nVQld zQ)6Q>t%1LTRqodZGh0evLAYyxTES7{0 z&_&{G#RV5YMNyyP{bREc3`M)}mXDj7GTi}MUI7oL?tvv=idrr-)U*ipe%c`MIhqK- z<$NwK{)5cMWN{v8=4zE2Q48?I4-Ey$9YA;r+qPJLP zBlXd~SP9DIe%t_p>A@RQ(?hPk}_*Z}JM*)azT1i4z*A* z2NQ}gy!|}Qx(9sMVc~;S^xVwVl}A~nmk$>D(OUvo#!E;Dk(}S6?3tcd+NSPj65RyN z9M;Ijh{QxDhhGiTRI<#v^Psaj1SQaghaUmGHvWkb%;k3u=O^T~9xRa4VwJ<=wq*Z# z(FItX1=r8oZg)ICxQ5S%qIZWJ%BNp7b0Vl~?a<-TJ4vywGJK?TG+Ru>BB2yO*OgN+ zJu@?@<)xyKkWf11%$nG}W|Kp~5_Sw3g$6dD_+w)+eR~?UIW1+nw|rtw)tE|aq$<>A zvmN}^S^n66|-4#u###&h3hZn}%1iX2KKim?QI583` zBHUxK6Ho|-W@*n+h=N6u?mmAetQYrKgk$){)=CEwwODEA4f&cbrvSs|s+ynwD4P1k zElmqIbW%$ zHaKt#U*LbX%;`3;U%q_Vg54zznofl65paF!JT7-iZ7XL3X9~mP@Ou2XZ@hc~5>Gl~ zsoZQfTYTb!|DBOnyaZ2_6u#(L?cjSQ}WQO6mRl96bOgrXhjC z7!%T&6Y(rg^~6I=obQY#I@7Sre=AzqdcMDsh0_u#=*QRdX};N-)u*(Vkd*zc(MM5P zAvY=uf3kvhCJk3c2@f-o0gdAURxpm{gHwB|+a_+mU@E+5S6<9a%x6MbT)6D$KZr2K z91G?2+HUE-uM7hkfj$Z_JcFOg2_u}T8+%B^py#P<<+6!iqt7e02Lg6I3`lj)!Ol*| z%*-s@N^ANT3M%SM>60F7$l7vv13Qf47VQy#nYj_Z%h%*-`)jZuTe(G!#K$JbQ!O+& z{4ZYug+tK2mv#**R{X=1CobF&>c%?T{`^tG(@nj#{-%O{*km`5bfHt;Y z(59RUl@$fTEG#$1D+})mKJ%x=#)g|>==JAuB4bF45bUWJbM)1OwExXoua+ofi5upT ziuo!+PvSitf-+X=1=-tz8Jxx_paB7bi@?3W&vz+VXgC;Iii(_~-FYNGsZ2jgsn%7q z5Dt;LggMyz$AqviAE*@#5HY$Ss;goaQ0RJ$t-+B>Ur-6dPLn_v{KAY?ZDBbo{w{%2 z3wudQ6#d~JxM?ES5wh$xGqPo7J2}CQBK}7L8Iti0>{6UFk*AgBSMH6`s# zm$0SLT`#u8mGb1WL?meRE$_Fsww9%Kxjb~2#SHB)H$vz#SL^$1YB6s4P>D{T&< zG_7SFU-a5Sf9A=SYT~Eh!%^w#ymC->xW&#FUOBhJA;+A;z6tEPV@0B;oGCd8E~JZy z9Jox415OfhUBgpHprj@t0js^FmAPbi9PSJ;aiIg~bj0c+bz$&zuEd;A_fjz}A}YIN zX7idbtKJnFhvC%NR3s*s6ox&J-t#tjTkKz02?B-ghs_TxDmvRf;C&DnE8Q4TBVsB5 zRz6@aQM#|&y`BTfl7T|2jINqbxJfbcxBN+ zIY6_;MJebS(5tlPEp#@|;*ke#X9^EC)gAhrtTgFEUY^$|9!?wYjg@Ae>+qZX5V2X> z7ZuM>a!A`_@M!Ez{CdU~7n)tU zWwo8ZAmu5cH>bq(YjNUd@f0nT@!Yv^=?%D$gfusoC5Lreuj&9wdwa;!PCZ9&kst9v zqei2@_aXY?XT^{fb8+Q}m2w$>Qj(egfgYCc2yp~t@BX94KVnL{sOC+X_Jn{PYl zz4Yly7|j=*C9P=`Sa+EVgzh-$q*t<|Q@f&1;JrT( zMSe%V4Es@{D@6TCk_uq4gv4(CIg~;E_Q=*Z?1i9mK1CYR&ZvK4=zI_~u1j^-W)SMQ zW4;<`vXnI8tDpV^jpfawkMD=1)(>O|P&I1JI?_LutQ{XCVq;^M*L$qBL;e2!JO5ye z>kCQ1q>C|<uD{H-^=x&C`oD$!#Hfh((?j>pRpSJU4~NNuEjNIs<2=VZ>5X@@KE zoZ$@Mp?oe=RyYG8Y5&A_RoI3Zqb4Xh`W_46TpIt9w5M!Ty{8DnVvuKG@he-|`0OxL zMcWvi<<_y=#(_}w8V-kdfSuo>!<%?V9Es}x)~`d|B(O3v2p9{wv1>$k{c~(NYkdhRRGw40UD%$vepNQqC{KB%j2p3K@b6^;CDI(f%O!*gzNJhoRLzb?RPhE`Mw0+Qm9jNj4_!(kZ}G*AoNhb~s-_ym*5z zfZW(9#?Q#eh~}39VRP210I@x=GinqYQ6r--CDqu<>zRpKvZ67hL`C`amm83RD`kg} zuLlP92S>Xh0!-ib*lNEu*nCBamtIw5AzhXnb#E7l@k4{VBw2=Ba|RCuO)Rv7fY+o?@~NL`MN3{=>QL@&|p20tNpf~A%2kPw<0F%!zq(U zN-8TL-dHMrzJH)j+MQc)_$M~97lRTBjob*nQHyMEVhq&+aRIUd8(uxKysRqRyELEF z-np1i98Ez7B|K;vb@taT<-Vp{JTT{#xpRQ7fTJ{tt_m+<7aoo`J16UOTfiJb{ui0P zA(v;6dVOTc4Ga{gnX;A#$mxGcsj~>D*8kE3uNjDD#!J`lf4{x!i@@)@KAcnfrUE>% zl8FEtE4+}d)JpNGNgLt?WUZCqR+0g~KiOn|_&!Nw1RjTDGroZ;7(6$pa^F>Dk1z)) zSD3MOtBTfrT_gT_J=<~Cd;Cdc>hDh{z1`wn1=8U_X--t0yR@!VuOEwCQnEbWOE{D6LPPT9Pc^5MjowK%3k(L%M>1nqR_{3?2XBAlGWP*64}KjD1JL-7XZ{!|;^*1uyA zHLkK6W3825=b6rAL5H|VaI<6>yVj&UbZ*eW_srIsJ&MOkA{HxY&P*J&Hb#X>jNvJ{ z=Ja^K4d^E-ESfd9Z!;S6_w#l(4OBy&Tr-U4jpOP#Ex)2kH+sUk~? z@}dYvkq^vp`>&@ch_ouU_5V_)ba*Y&6LgGaWt8Zt^ey0MmEh`#Elcg~Z0HK>H9;X1 zgo`_*LcbMkW$`~yM|Nla)j8*NiCpo8P8it22NOm{CKO`nAqGNT{%@x$-X8qh*>zAI z--Z#nxwt@(bJwPp;y(mOmG;K7Vrxq~`FCmgMTewkfiZ_UK17x^kMtDZlUr^ncGu&v z)?Kx2FWN+5sRLR-6kp}L(*~5eLh7RoST%4f`@59P+UlP{n3{ZpYS&ww_Cn`f_~a~e zRwFK+>kck+Q<>H$;5jUm&Uhj4>g)KOg1xN#WmpL+-q@k=TK*m%*;7MP<(q?L?BS$#ayo2`>~Fw5c`#qvz@-?Z<#vx`-d}UZC|o7 z*Q#5NAd8MdZxJvTMS-h*8Oejl@@~|G(IBwNXVy9X44q@yZb-Y_1XMN18FAgFoOgXK zw{NfMZN7WH-h^W+L}3bV+5z3R_}9QwHROB0f{g3MTyhwjGePy6)zatX^Rq19Y7^&^ zyq2dqT!!EqdW~A$gqIP0=YwA|4o`<6_MX}_XB_)$$HAg$G*2~m`x>6RLSIdet+w`z zR(UhHM{L_HSNV&RT}#{97wt+y$W!qW^Ga{Fijd-|sG-rVt2@hv2sc~SHWli_x=j^4 zR5C-A)3ie@5Y5gPVf@IQe% zz!P#;Wpcc^!tU3zv+?0}tR$5dZn9cW@HS8J$2HOI`J=g>8&)T!9`~)IPx4!1grn86 zmmj9bBMZYwpN$sd!(6ucH%&uw8=K>=5f7VX85eFhbzlF;@B#h))dyNx!gZ5ocXkfLDpzylFy)+S zE9bDwAN;rR<12toz`~BEAB&>oQ#F9bCGK=9Xcs31Kw}~BbmtMX^D_lnhKHz5RJ4bb z2qFfiUGmlkxxt~Vxv#6?$VeEUe{KG{zs_M~y@Y*M`)jbyCs`s_UkfMwGyan(^3Nwp zmL@Bq`O0@13@7J4MCL@a*Q1`{-#K7JFVK{rOS=h(ehb+?L=~ZVEEk8N!d))Lao#pj z6fEX2M$sEW5j35#p@_Rt6oNFvd?7hs9+2I4ah_b8wAvuwAayeS061!E5*nB8C;Tdqci>q-`sZ8{Y%i-_&pq) zlsq(ax8xr*{nP48(YL9`$S0wRLU>qpq(S`HvqzodQSKMYxkfaLpL^qZC{vM3D!WtFEmH?dO!KgddO>(FTj_k3_N7Cr>0RtQKXl3Yf<99 zm#=3LL38*>yvccVf&Y0A!*@LWH&>Z3x^ZHy1BtGditA?M3Y$9{f|N$Jf070~hbU;C zMTlDM?_Uxc%qUVnv_z&;DY+$#YR%ZSDt4b|mGy7u-uDa(kK1%l9_rC+qsY%R zI`MVoJt2wZ6!VA&(C$Xo-@YnV@17!>;dc3DO=@zRi+LGUB&Sa8l04oN{VuvfUK1El zc5YH;+b>Ln?XQt@&0k^k;*6*vw!dvoAwT_RqMooqy`&vc%Fur&K4eVBPR>wCNy-C> z`&V)zm_#-JrM;4`40R`@n2hru23CsW8%tdYK3)P6P;e)(3++DS2h3n`!dkk&Psy9XQR zoz*OcpmWYEsxBMQIEC`qDUsI7y$(?{OBJ(4XSE5LxsN#HE{0lkbR4F9S7oBh4E?(tEwuKdcrSoglnkA0&=ysb!e`Pq zvw~ehhT83;VNAMtza#HKP@HpZIeLeHjBX~E%F+0gk{a$-c;uF?)kS0GV7cgJEBdc5 z-B8t?=~k`8y;lk^gZJ9x%C$Ys==c_e#V{Am-}gv2C7>mB4e6!Ke#?IT^W$P7Hnxee35FIQ-ac`AtiM}Qh;QUaA+YFgEov?c_% zHDtRZ0iMYt<|xg(#QKJrsnkJtQk1pB9-hg+Od0aH!66~=Jda0=p-u<)2lP0Yf;`Yy zHaVFulmaBP$D0voNb179N-KvG?xhhb9-dQRQTE^;)W8(~{DU@@GEx{upIB~S8lU;0 zEk!tTJNzfEf?`W_?d2-5%s5A+wukPnzHTb7ijC*{LY802Pg>gXtq?2hA9qcnH-gMB z%VRSipp_(VBN9W?A7075aT)0I&kU>0t=z?um<-w>V2Uj|E#9)4E1;Qa*{m=>;YWackdqChjxKyH z!4lSA!6S@Z+ieG&rZ_4~3}*)Rcn2e`-Pi3cHIe5lS^y3p(Q6fHRWulXB}7=DZaI|8 zYw7tv-+#vAMGpRWtVz`b|1bS%^2xi)HGE_3MDVk>rk$M~Vke;>8uUyeUmcIRjs;Do zn|*!%HHSlAZx?w{m#hJTK>9K$7^U`7G$H;`X!3PeDUj|1yBru8@J?-hx`vhR55-ts zOV!T`9}dEi|A`d*&~dR(T?_o=k?;JwKNk~d{9B1=VqV8$-@i)*U(1)ZPl+o47rHD8 z{i{HDm$5!#C0YUA8)9@yvvyfHcH;?jmrr7vnO^am)T7lhlQr{&qSHTJ^Q(BSI}dNs z*T??m{}JdWxG^rzI+;LC)No{wq z7Ris<8pSL9c;>+C{55-)F^7IN5q34^4O}E22J#o8&gQHZ#6pt?QGv3ro!u7V|9|HZ zOCS3rHb&*2UFX#%G_aLa?i4^uwE&wp6sQ z%4Dy17>@h}Z{62D=v_Z8&8e!Wnbhm3o-s7@sGQUpJUKi-)av9@pr_1Sk!VeMMRt&Aa&`<<`+n5^u z9%EBPP$vBD!QcP=tB@GT6#JHyl_5{j-3^rNxQVs`l%38}t$F|0*r^z6?(s9LHWH9! zemZZ6=Um3%{Gajjev!~w$^AS%7&CbC_2bz&o2{qwHotCbn+H|>S6~RW#M@Vw;0Qe| z#73z)3TuK?=~)X^Mq^@#fQx$sxw(n<6HyG`K2r~%MYa#XO%LIF+t*x+>~TBOrtVWh zQ}vpjUtV^#+=4^W(+PMZ*JUMngkC9LVR6&s0!Y@>9Qdog4GAOS0^ z45(D1L?OmKd`@rA}1$j%nn1e{bI-J8ZP>8HI3K7#{N<168Y995|EtI)?6Ch z>9*Q9n@kI=1AOxI2>OWN3-6|)x0RPe4|gVP?*E^O5_nG`%N`~Ie-1^O4hx2`2ngNF z4YpB9Ng*oQ?r2EQ$NMbyRX4q_M8$lQBOMM74!wRa!m##349m5&BZ0@II*L@Lxl)OKU3q&{={n!@(d!=(jUD45yIa>m53L z*L{g~a*lpoq8w>nO;y|?B2M~;FEri9!=1may;FE$T}l3T9q!$NnBwz;TjR1bpFKLB z?YuX8!@B;cXazZfonfd|O1lM1X79mOG8=!5Qu%-WBr7Z`8d<0VyTE%#@C1{mIzexa zw$&?z+^q84FF`t%EZf40i;Hu|LL(xOM8aIKEZv(L3no@yZdmmzvS6Xd>--{hL%%?nt_`e z*Tu&Z3-z~m)TXTF2wr#ous5j zk7xXdzw9{NE}t0~7=B9Mt~laDLqmTTg5WwXdt0u$)D(EA9RHxzYtB+V!C9`u_H^Fz zq<2?k0zcdyYBJ-zde~R5;LQT6ypR~Kpd=opU5iG(G>^RaH%fNg-m;!5zaJVljIsRg zOY=sM#dOw?=W7W+dOmjv!Xh}fx5Yu+)}Ypc#dW+ssoqqDRBV}GI5m#q6HuSD4NZ5K zt1~f}@$*Ar39@;4zFel|mz4CRID&)P0F}L!y*=}_MccE(veRZ*U|3iWQ1|S&FIoDn zZ|M=`b_L_^ZZjf-=n)@sC(8A726q?_P~bZIlR3F*Kouei>ysX+^yQvzSn7>=)_^wT zs?$^5?s3tyEF&|s6ZR2n;PmLoY!t|YzpcNTl&sM2`)Di#dB@vOBiuCV!RY>?_&v=X zuN88jFfC!=X<|c!*LbT;%!sccJrSb;Dc`PGlYe=6BQb7cqdM; zmzqZSI&6DT(BPBsFD(7=q=rg?D{&KV8P_6TZ6n3&4++6!Gdj)dKS}Ks@6W4r_b)*- z8?|4v>+9!>cbn?8yMWvcgWH|e(}`o7Da!Ws)_8`XHBb%N1r(zO1qF$LTNkQ-oelvq zcdyAw`Ax~yAF*?dK*41v&R}&fH}VF5yO<9 z%lhuo>aYFMp<2n(X1o);RN9BtDn@k26*tmS9*CP;^OG<7?%n?a0FID$j8$9#dns-* z#M^+Xu7;l0G>xKBb*M+eSKEM+XrBP1Geq&sSCYdo-Q?+AWUoO<_zb;HQ#Y%0(&D7K&WHhmKK!R1lu`L>j_5De~ky!rob zcr6)LD8Pwme(s&PTF<YS{k?gC1bKfByzmeX2>4Bh(5J21SH~FoKU=Mo|VzWrUcS zn9?gNQ5+l`D5$9!&DA|ACFUb8E^KU_0A%`;`}038JDu74I!WRC`#^(dTVp<)vud_FCG$kTAq#Xcdp5$lZ_vKJ$w2F zUz!9>aYeT}H{IO8AmN4fgkU5EKJM(=OE0Q~IkgtOlX2Y^>m=lQNP3i2QhJ9SR1bOf zb^MDB>eB1&?3#k_5(#C2coy{Y+Dxlr3P$6&I_vM;GcFx|tU@2{%r2-ZzeqwmPOZb? zDt9EugKT;K58}-uE~g`e56|33h`93iO&QrQOuORp zyN}6S|L4s2T%Z+1Km<2@=ociqu<)gT~ z_^8BsyJVBW^(Gq?CgQY2qYBZIrwZ+(G`WX;aZyR%@4veBn;4Rd({pb{ia|ak+cASOS^1Toshi%Lrs4@0BGqI=9cV znuu0Au5Ga0uPQg)fhx%SDVxCQ0jW!?)_@G~x`zrjRq2>|ZeW}|JiMoAv;mc>a+IyG zIBMP|2TGA2uukLq%6Kv2xtpjpU8g00)5C~2md0(w-Qv+C`npn2T)8!<_pZ-LyX$ZD>95ib(8=OQ=K zczRx~OUs`&vz&3%I6Dbh+OpM~v#VB~WiYe=S+qSy=jx9*;DkqI?DV`(Yt9q0Y4m%2^l=eF^K$yul8`g2dfP~j=UY6O?L9o5vG%ap zqna6?YAm_OTC&qZ@MEkC~U<>=ke4@;PLn^oxM$yf6+(y0MH{j;Hhg^nAKI zcRD-IOAJpN2{*dxCxcI3s506t^E5Zz%?$d%%&}@JHvFsU<422XZJciguy~$N=Pb%B zR44dA7a%-e(d6o~j)^XMmt}*X3p!z4k5rOqT0!3@ub`D`=}bW5G!l#?vsil%2LmH2 zB#hL@aIZqi%BrYiiC3}OTx!_HAbuqG^ng*f-a!6>gi0nQsL5!GFUkGCd!{u-&_&2# z*joXi_6Ab-nk)AWI{YEz|9Q7DjL$2A(f_xL9st1HE@q&9Sf39-0{3ghtqB0f%p;?- zF>GC5vF88^aNSTnUS>HQ7;;1FA@WyeRoF2%GmEq*`P7$7YoXAVk%^`Dt4Ju;-h@L% zLnC0zcUFvREuep|K&p?H^WDNJA*WO(p?NWFfPtysm6JA3(wsx+yp%Q}V@+|-7n3p_ z`{IuQ4$iuJ{k2ii!tB%rp;zdgk-?k=0R}4=wYd7LrOf@`i@dV31gDY@dL%MRdof+> z8i;-#HRo=|r9?OXnIuF0`0*xAkgSkt+bg8poKr;aNx8~GqY1U`Cu?A&wvt7FQd<0G zGklr(L0_dpT$|ji$ER@V@HoL%Mc%1)QrkAI08%?P5F#d&uVq?joUG*PS zzo#iRs|fEM%S1!DdDJ_LtYvloP`PS(sW$D3wIASab<|v|Z?^gnR-E;t*Vu!*JEkcE z5600&PxU)+PGNTK>Xws>ZixfJ2nSwrn48iV``Dq~!fm69+C?~5JxzL(WjFZQTyt?S z(&UcV&{(FMM+DBWX<=6iSe);jzGxq6THa38cL|AaL7LaQDG#-2ba0ZihCqLTpN?Jr zh;f3nwTHaUNJv~~Uh^GJYbAAHpVhz$+EESg-Q#1@iv8hi5Ukb&k#13{(|HfZ2o5@} z`fnrfegAX~>~cxgAu$or@O_C!9Tt-FkgKh1tK0MSoNBEZrhtIJ*+}h5To-MvVD4zU zC~q-KpWd8#jK?(fDtgd4jGVfBXl(ZH+=u%H_WZd1ho`4y2b4q&LRwn5KWN)K5U8Q# zB&@WbZO^_yPK|&z9WR%YtCDK} z#blR2K4lN~mqxcFuJ?u!kj9#l^l`zdjq+Dq_5aZI7En=k-TSa2NT|SowA4^aqjbm6 zEz;dc4c!gW9nv8npmcY4gLDnu-3{M>&-=Xk{(s+E_nPGbmUHfX_TJ~(*Nzj{RFLm1 z`AKJ+Oe%@3;q+V9dGU6oXxm}HTZ>nz74{Y_8{NC}GPAX2JU@Sup{d+4(HS!Ng7|(a zeK1#19iIHPUh&G(tSzAwzjb;Vb2&TJC3y1H%qqFiG2Y8gddoG~-q+KnGl@|ug2Abf z2BR$ewt`rO%z*%_EruoL-68Rz^qdP8?T&7<;b}F2MdzQkJCh~iWgB0a-x+fGO8jab zM$8~Dzh|4eU541X<_~V+CJd%$xL~S6nu?mHYHvLdoMVnE>|HS{yO}DDZTnB1ccN3H zN^huDuq|djz<%X9Wp%sV)+8Y!YBFV-R=d9$&pB#o;eVKh04?G15$fAM{~EY+&UH0` z8C7pJz!()R4|ffnuTk?3&9&bToX9=$>sOIpHyY=CvtibpBDgNtd9NBiA|m2K`<&0( z^u8vh>gK4o|5f95VI#pq^ifw=7c6oQZ9H8bbiez6goJdkQ#!a*GPD2Q?Bh}e?-!@j zBFzRDHUmw|rL3jdIN}anx4WB5hqZXaGzAV7M!x(4J}|SI%VE32<}zL1VZlv_W50r9 zQa19v^`M!ESTN7>w*qxLcv?*-3^Zi?c9v9Ek6}5N!{d7vj51$#U7tJ=7*}79{Cp;j z8*Azca9=n@UqL4gbo7cDsU+p(z&zIf*Jr(+XygM)(?g@oKL*n)zB4`F;y4Ar-< zOe#bpHY+j>@3-oH~^S3``u3*$HKA6xN@q+$^8kCv0sG*sc$H z3TlG`;_WACNA2iT`1`LeJ6FE-hMVIY#Zl1xx!C7oS)Cc7i)xY==I3YCa zPOB&~*$#Dc4BjnEzkNr``MFSPfEJq__&n@pRaqj1t5~pJw^M~1V|0mh{&%P!&PxRY zy)^yko}QkDJf}6i&aU78Qo-Z$>mv>6#p@_fqY;sF=^Eg8aZ87F()OB_{2!9w(MQpd zhnKo%7l+I8sl#1c)A+IE^O>8|&d$v-INiamPltSttq1!7)^>Mx=nuWl(CO`sJVqGr z4nock8d2s=BD*RIw)TkGh=oF%)f-)~gJ@0Mlfj(#ND3}RNr2=0#X~N{6B3x8Xe&&6z6_E!d10*Gz=^7 z$ENYZNW$I-hk7@#tN0GY`3=06dg+gY;(Gc?`EXIy4CH8Ns3?)ZEzY?DZeglao0pSY zu6o#Os4orX{piFUI!4&q(!H1r?4cq+I=5E_Vrb+YOvjHzx~pYi8(6D@b};F3L`jFv1+x*h;GQwdxSMi&PNnXKJL)J(b*M~=U|&xR(kqu z-eJ0U>{315_%fJ|TUxe3Q`43<^l>+RoAv~7iYhCclPrmgDorHTAUGei+guD~^avl- z8WA>+%)2X`o(}ecm4x_<>~XS3wE914@^~hl2*9XLbS(8s&$l`TVJ<`9?>)LpRmg33 z{lwQI|8poc^^^y6(fw@7V`%n&dFH`RV59KxB@uc&|9pv;iyA#=3*PCgQ-|v)_2eOv z+J7VEN4n)sQ0qKYiSw|_03v$mZP## z!!Hya%DxhLHVA7$E@a+_y#qPfA=>TqbzE3Jbp->G82;W6fM@FM(H`wq{9NSkgSH6~ zM$^?D8$+H6o1qI&mXCl!%H|gV$r=YDY3*Z-KLA8sS`TzwQdLmY46AzfIeCocG5G&a zO#SEbSp{I=L)V)6r;x2X{hIhV*EnjSZpSozC+v|l^lUmAZbmq<80_ z$CKua;BwRM_DOL9_z}3O3v{i~lR-LG_lik=STk=Y0&4(x>dVOUZw(Dkg+E$xjN_>O zgBpIn(jT8m44%<_`~i`b?OvkVMdh2gi1j8;T+3u7z(=t(btANa9Cc?=dGyx4>a?y! zN69Z+{&6t;`Hs*G$-%VqjO<6*FA-?(co=7MqnylUUVXW&kZ|yM)G)ZG6xAO%-1*}! z;-_>wJx??kD5SjpuNQF2*YOtC$z%O;rjlRrGB z1hTM(CEV!z|0^hVv8M5X=L59JA#{rHland&oGTl86Qcve-2~7()$o&hJj}s#m|2n& z%~o6qW-*n?q)BDmUqXDVzgoRYUe!12-)2bTkx_HWMxCso>QFp;vneK85}8P?07*KYyS{(y-7FPAr?_nj4gA zKj4F1s?d822qs<_cE5YzZvS{r5Mh899pVdvvHM_?gaW^8bl(uhgMH!xIHQqjTI88`Ko2CDFq+D9317-F$(s z(mkshq7}cGesdnrl{;Do_xK)A5+}w(NURT!@VPtKP;Whk$j(`)GIX%{f6V9#>*+0C zhU4X8Zv9)j{AhuEsW*k0fH^!xd{Ds!ttyh495v~Ht4TF-4~tF_VY)D^&cQ*4BB+e; z#(P#!AO5IRd==4;_2w?cJ|a4Nrlq7qY{z6Lvt9*K1Qk{ihi5%vyoF6!^Q=yVGm$tHmKvnMn$M9To)*K4RymeYX;2!XH|P6s@M#J(nJrMasq%^mwefJfB@E8{kk+#h;kC4Y@P7W8~rEIS|8&PluMG7 zwA+8etxjM9yEATGURo*C;wkY4l4ves0wKwCUJnqIQZfp*oa3Y^BB-b6|&ewm1`$dCBW2DB;^*h*^wdSK0AUc=iT0!-C-f z`E#@QmhF;qmWRIrvQR?OClV2bkqwr=H@b(l+`OMXT;Nx(!box7!Be(>x2DdCaw{H1vDrfKRDIqlv2ca5?AQK{n7oyIGO*C)kaY9Q8l50B+k|UgDt#)=WEz$COS} zW?ZqmGC?b|+^OsJYw~W>0K1y^>&9vp?X1OfMJ8KvB-bXCCNDFXH1`E97ZHWz)?YR6 z-n%x;wiR(@WWP*cUqwcI`2+^>hhtGpDo*S`px5;wUd&v%Dbj!UhyoP~TAIj?f)3z$ z-gM;dcPx%?liTnY?)=X&rbUF7lgs0a^TLrj@CZBkIH~b1O)V3MJ%?{5N*H zR)DwRm1FAy`Vg}Y1mQxbsbni?4w&cuE1GD$<)o>AG4I}-=PZb(*ZsCpd|}A|4C{_D zRB6Vk(;+R{C(v^DGVjtU^?Ur(-h4cgB8u>9j86->=aq>F2WuFS%huW?Emw6xIxtlB(^$kVh_vXY%6TBXfqHC)p+z&r)$7W!D{ghZk zayecM{~~?(goMIZS40BUu9G|w4~Gq>-QwKFe5*V?9rxaO9)68HP^g=Q&bdA7Eky?G z`Q4t5!*$KaBrvky^|OQ~cSwLhjMAhUqb;hhpR+y33#jBnlb-zpY9vAsL4l2@pO2T2dRvldQf+1dhz1*vn~uir_)&HV0y6Uw=>$Q&GyNXt8g~P z`xaS$ER)#rc9ryr^Y-sc5zh1IPwU@6+zP6$zT#lB(Y|IoYTFO2)RFvj=UiyY2$&D! zb{CK%t)6Z$8qRUVXu(qFMlM}3;A;SFG#>9m6Zme&Q{^34+(d2YvDC>vT8Db`MMoZ@ zBDuGXH*M!}4O(#*&8j%yt8@J%drgSZRWh@C9H>*8cY}y9AaJn7K6MYYQv>UA*=%=c zbKbez$UZ+RhlgGMbNC2)<)lGw#9czP?NO3ZaLQ|QpUV}WH?3O!H|hrO>`I=8tkBUE zya(RqeIZ%E+b~Z*p|NEz8Ow3x31~q9wzSH{7J<+vFA(c*l}QeD*J3c=-wD6&gb!@XBY? zTQYJu!>`m*B)!`&_$711rZK#=O!}NP8C%{s9yc>=z{hOcAJm1-R)9hIXq4C57h!|y zVVgkzT%|mXU0m(E>)QF|3Q5FCYT&&rpbP%hE2H5Mm64pc_u1>_^mZ%>PnqaP(NX4$ zXZ?=|GzJ`YzT+`C+LZ->8rQNv92`?=GM>>2USf!_CwXfFIkQDuM(s6Jz*pnv)2U~2 zRI&Wd%Uq~$XPwDVbt}8W^f{y9%g1#-SLh5qDZd!Uf7SE;WzGMgIA}XWo_c9Kj z;ws-SPq)UE8f6ww%l5|W>U_>%L82rxp6l&|TMr_v3!R7;%(!xO!An)h$;}rKvieqy zIPCHgWA&aoI4i(b(#*DggH{vT5a?U%9DO$^$S{bj=R9@Kt6nHH2sKYsr16Sqph%gNzg#FeS82XZM271l z=;Zclxx;jGOd zCrQu58?5rybeBaZHF`PstKukloJ9Onv&yfRA(+lsG%Af{IW44Kw`&>rq@*y@PP&~3qE6n zS-AgotlEd}B+b)H^Oe=;x4;kct{fkOhrrWP2rLTBPIBoV#Jw#>-@26V{)ok+)Yl&~ zaQWaXp%$h|M{ql`{wm6LJYoA270g`@qPCLVpo^Sj)L~Z8d7}m%CK`4QtU^9VV1I4o z0vXRU^BOH!;L7Ld6w23Y&VihrkK#r~i(_C%XeFtW`Ka&(MPX-G3v4R&7mYwlkBXSn zg-7%Ct?_oc*Ezu<30-VvzVVBwL}j1dM7-P8PAME%d%9RVmy!H7O0q)4WT!H)n(Y&l zb~(3trIj4X0kOlBK@1M5kU+&|b~pE|DX=jqhX!{+2Xoe06;Dmz%GTT-DWYmQ=oODP ze#So2!VIKf7=b@yT;5><;ZUy_JbZ3^`(B>f=x2LDwxjHI%3@^nm|O>R4gqfsXMm|b z36gW^dxMWYqye_?t;brYQ*-N58Lf+c$bbCwZk#Lfr9!C5FU8Z`LDW>Y1M2kv#iT3q1MtLzCZmRc+4`=Zg#EvXN$p}0=Zv2Tq7Ye_NMaDCiZS^(}OGU=Be-n$$t59Twfrzz; z)AWB51JC(gwNV60hGJ4+IbXmz^6ok%#Ok7T?a`hwp1n```ub3_a#)a&s^KYtS!CbO zxcrw;&jAMI-5D1aLx$hp%*{lG*oI{LuYMT7qaEI&i7I5?zDlxhr-v66E(tLU4ctxe zQKYdc+fY;uh?~&;3R}76<1(CxQqVFWnZh|#y(V^~@s)2D&dU#Ye2g7IH1I4D$c2c)T!%;=F?MQ&=6?9MKX1 zH{4~acNM7lPOE|HS-B#I-eK6kuw~~p<}p^s){2DMoSis=uxhC4RO?;ZGPtdB8tY&r zjugrbJ{S0zlvRh!5^abK8@Zf%PoxhYpP}`QzEw>W2+`D2#}xz@Ck%I8jPu(bJ1VOf zH+}>5$Dg!hK}!Den$BV}T{`+vM6fw5>V^Cu8Jn@->$SyM${bbcgvbYaPR z-6;=`dKa#eHe)8yl9TZ1 zKaXn_uTOzZ^(zX*!&i!=Bo(;VX>e%jOs5gnc2Dh@J9k!|dy}V@BOJGO`UbAo+mEnP zcIKYDyP4zMtiF3%PEqpOL>U~<`6G=5PzLMk*z*dIizz{ETTKQnKU~NUvjdV;!e(UL zSX|B;v3B(rKxCj=f>!{u{uo{16KPRI5MlMu4J|HxtK#5BpIO2soZI1zH5L0?U+9|< zSc6V`>w<*hl)uMT97=Q#}zcvgV(d7#`>-h8Z7WZ;SyQG==Pk zA=0Qp@$Ot#7%3NXNX1=ju(h8d&`G70ikusamb@lhtpr!To=*46# zmbAJ&+zK?y0&7c)5`m8{v<-Lk1G7d508iHrFMy88$lY`TJ9k6IDPzP|8;*C#D_`##BIFUiu7 zK)%HmIhm^Cfm76E01&CjWrE2VUzYpw4v9^dZW2`LOPJty^=vJ4q(hB}F0|=4 zq28MZu@r{p)efYi$W<&c=#|4xBYCV?k23NsB}XLz;OhEaXyMsT5A45NA<7U5a^3*R7m4LX>sckJ9#9@(q~cC@-=KbF1P zGgdlUkV%a1=WhwM4w<4Bur@;51g0+ZE)_@#yP520C*~ON2s*abUME+uf7hi(?M>MC zkrlQ4o>%xXg}We*o~CCOb*SsKlx9or{(jF1Z|mMX&yDm~eN`HNosdVa$ay#&UNKZY(4C+xfW#ub9tF|+ zJV!Vm#j8nv(Ern6Cuq)|Doc6w*KSUsD%BbHm<`tA9h`6;w4j_AJ54#jd1J)Y3{}>#R>r> z`)_>J5iR%$V`II4c8L|zQQ};BuqVFV1|h>inLT1>#K}9$J+*OftCG1nCyZsppWvq9 zx67YwE2Etruxj9{#Sw>@z%BkfY*_}q4`RU(MZ+U_6sY^5bZJ+~AFJ++aW9Bi2+P53n{U=JMPZvj|lNBVVzl-Mh!M~s34C@EI$4t$T}$1aOx;< z(6jCgNKNtvE6yx?T@J59+3)}5FvVfCmvXtyATkaPY^`Ih#iFAM#P+k%BDygjA$ z0DK594^1uIy8L-Z#(5^up*%9slqK$Xpa6Jxx2SU=u6K2wy8Au?vZ^oNAtktLnKg*# zYvRU!Ts0@2;a{M06+I;oo-FGF&}~&gn89V+ql{Sm06L+K&N*oc|2kYS&8*|!7#|dy zO2tWP42`{;2;Oz3LU}d~C|yC~5GyiTJ$+=9S)G`TPFw4SgsI6=y!qU-LiW&kx{kPG zkPFyTDO&_y-=ZQZPgHi;RI0nEq&8|%u8&`&Vr!)QG8K?Y1)KKL4<19=m!|qsjV^i&8rSP6ljTf^7?HCIg<;(NMH_*ZN=`E` z4}XDItV<3Zk{-(a!R{iwJCIMT96jehIQc%<^BWbae~r00_bp;J1L2Xgqh1 z{MS_H3Eq!;qRg^gn{X>!i}6!7siyba z&Oxco#%fVCWs^^J zfvx>Pft_3T1rhTxt4!p-W~?A8p&Vj1wN6EfisQIor(U)>W=+2oFu|s|nVA{rcs5Tb zvqz0GbAQ2t&POC&g~HG;3-t5r-DuR@@bEyNAjyGz7mu>+^RW9Xxw^|)Tv*|Yh4!#L zMi#{Bper6_Le`YYv9nL27OPjIFV>v`auhY8SEQw+m7(9eI0J}I!+0bsa&4lPtixl~ zDOq03qH<3TUQBFPdnz$@HV3(fwx5OIC|Ql2R;{LRJO}zdEnNdEk}Y)Bzq5$k9~NJK z*#Tvai@v53)|b=kG*oKf3OisqYnBY<6#9l*f zfH6C(57%@@-)7EGKJ>-rZvSfVHK4v&0p#qe9Qb~e;(59+TtYUERE37PtGQ@eBdUXY zJHZ?Fgcs6^!fH(J^yIxGT=n(P6xgn!|1rr!Kx<7(PezU^cqG0@u^qbbg~h#X5S(BY z%2kZ>mm)nx5NuCFvI8drp4GNDs%MPzxY(9X?!OkGaiXo) zF5zS%O1Z`T33(AXP{@G7t4rXiK~E;-30srYG())0ucN{Z^&SUNUs?gsKxI|euH(t; zH4bm!^<&CWLxh*`I*EtjCA8>u5+^l?1u`F?KM}nB<-=<9e}(=#Kb+ELNnJ|rH_PXZ59z;V)XuO_y}zc ziJ@wDeBis9*ibD{8(Vq}guj8(IU+v<9ZXHYTTBU(41A+ten>n1`FMJYEnq`iecCc0 zc>3+~7FNZb8v%H3 zD+MpLAVqaCv-b6p8pzKOKs%B=_b47JXv3p55O^*jYUB||5zTvZJORj|Msv+){{+oL z@Cd=!D)DpipyxT@u2qAkcAK7%(Nq3{SM0+#B`Cj%C8g5& zU*SDPW3`4kwS5IGuLqYEYNy@Ad+SP~ZIHsuEWJN$6UUR4QS&sa=Chkw!uGkSw)?n0 zHxJEe?imgM9`k0M2z}W2K0(>S=`v_o^%rYlT+ArQ5`QD@$G3nUQifs+z56K3*OGoR zii&=St+$7z;<^$o6Ccdx@wR2-_CplESU={fX@OcMx*^r*{7`N5PV#zBeQ%+N74rYv zEVc{_xzM6mI?HZ`3_OqR3vQ#q3h}8866oaETO@!g)dAeX!NVCjGzY7eyd&{mNisMx zIwH)TXKrRrZo%Q__n>^EFM3AhOWnhWhieWEx;BX3(A43svrT|F0hY{-S~S z2Se^SbNxK@rZ;wgAb5L#Fz^X@-FmOEk{O!kR4shDF8J`CbG$@Nop8NviBK--7#^+k zaB;n?eDnFvoByHk|1oELn8ErAIN_1w#Vu368QRe1FLERcJ4Q27{SEH^(2k}?U$v)? za`5LZDtuvHX8{Y-R=CTngUo%q#p`#atNXX9{>N-t@nE)@$(Hx&3WWJY$ysIUa3dO#kcPHjAQ8*!b z>UNHjJ}oNQYD|}=ewIPD&Vp^wzzJ&=t%lBu zhH4B!M}Gw3Y3DK z82d`?^=6w-3KL6SpS>+Q^)u){gPJ@5tEZ7rqw^+IlZt;3WKAURry_Xs2BkJf6pEWF z4xIVIZ>;k%byF;VoIJdPsB!k)j^thyC3#P$-i;SkY{olUe1iJB0%9#Q-7kHk?>~K= zXlWjPx=y1p#PqCqq7-;=7z=-J@nSnXN->a^&~TQz*;8>K#J5pt8@Y^M+bvDq5_+FJ zbO8e%P2n=q)KNY~=CsJrx&y>qY&Q4jqe_34fut1zEY45DjV^I_!o*{K$N@J^Cc=)% zJmt`fT0E=XK*#fcNv!Ssk$Yqsi#}OQ1y9#-NpjX^*fKmIRJS5<5cGXnGP+KZN9w?d zvgk&0{gaKuWAV>(de3j#DOD~5T2(=;je@}S2{Q?TCdMk8KeX5LPDHCC4=z&m2c}6Q zm&Z!$m!i^aiC=_;A0`+N5H`-OtXzo4U9CrzO$AdxDEixPDTX)^L=KtFRxq37$M)OnO?-3mZQZfL45h~J# zZaynrd;O;Zh%EFW+}y>U>k98+N~GZVrgF0)+M#t%4e|b1>DwsAL_Fb!8Ao$fSDf&O zC7k!o&y8X*|Mlr+GgbPmApqF}$F=eb0h!z&Bc}{0#T=Q{{Uf$PFtTq@)Z7!L+s)W6 z)#hx&Hr$8x(5E48%S!6>+tTr==&K~K| zw2BH1wC4Bd&_dB3wSHdWwE3Fy@>fcin*h`KaPs+?fuViNufI=6KqU{xcMN%K^xdFT zO@`;|(#Y9w=XX9%ast0kIqyB-fCt_W4@Sev&^Zp_WYclgU%I<9A_ESahq6kNi{Nh* z&>+;r(}p6iU(O2c`#|37^UMeJq2O+jMI4W(b@FP~CM50ilBY!+2}R$tK25D_m~gq* za61iAvT6VF3`e}O@b-4_Y$=xsURLSj=kyi2WG3v`fncxHY;>?wMGbCQ$!9np@b7() zl1j_Tdk%IhC4`SeTG-qRb~aCOI_ly4yQ0q3zlo!;F2G*Hna_trtNWBe$>tQbs%9pm zBC7!<-%F0n(^Ir*0P=kGJJW>*=yLGuKDunf(+Qedbe5Z)HBZD$c!k@s^TSDdQgrz- z+XD+*UK=A_2s_4#@-zjnc7rP|=Wj;K0uAP}UH(Ex7g({^>ywyE;$}G$95uS4{l_*z zJI+*LQ|@QvF4m4w1V=f19fLB84~~prg{!_b++l|f+c$vKB?jzxQDtV{;i*#Tk;ZC| z844F&9k;TQvrN#|tx(S14i!F!^-j@PS%cmeWy^{mU;W*}wxn~2p04i=x=*pdjgymc zy_*X(D7{0o^m#{m1L(9a32FA5j`K)6L`ah}*HmTfUnuYIomunKVPwaP+K+~vC zn?0*`wo(^L@CvqmYESK3!ca|+0vTusr!K#Dq#G>JyG!6<_%8w=MKLC=R!%Ul*Q5vi znST54X<`{VfI#Az-csw>p;7p4cScLGmbo4WlcWD%hsza#=lr}qj}8miqc-~kc|US{ z3snZ-eb*dlWW>2)UtM~j>K;|5_FYJ{v@~smPd}o+daQ3`3z9?<^E3CW^{89JZ}m20 z4@Vxa4l`09mEa2_-te#&m=Z{>lSVw`c3izCLfUuKp2h5sIu9+nyMpfyy?EnNNB&e$ ze+(Od;n7QnYncvn{(Ig3e5RqGJM8m-b=rmZ)5|gu2sEVPs*O+$k_bbaP!*M?lyIE! z0#95oV63;G1=4_Jvg&Py;+USEx1DP-?f(I1;JQ4WYUQbZXNNI&98r;ygx3hL2c&>fnf)>=NtJD7`2C8D(pLO8TVKtASmD5D@BKx&@+;c0Pf z6TJa>9_9CAo;u+Lv8Opui^i)igj9u=s^I06@FW?ZzER-h)Qrwe<_{&CZj88c zBRiIUBdu4ZuEOM@BK#8)faRbz0gd__VWBIn8d6()+&wsHML$ot%pgT^?S`PIrH|PO zY$I5)9+QLqalO0{aqs%%ki+Cgz2PBGU(fA-x`ZEb-^Mzuf_pJi;&^^r1r468sw#>- zSoq?CLw6|{RU!#1I1TlDd8ux4R>YkAA%Z$X%yF;FwEhx!q`dikvV!*63`-_4Pc{r0 zoV<>{Zb*Qfq4ruG94q+na@W2k10RT5%k|7J$|@pR(<|_&N;T#<_M07IFBeoHkds{a zKI&W)OBTJm74tt{+9DKoYYVSvR|}b2InkpeP{rrDqt4XW@<1^Q^Fu87@8b!PT$q=> zd677N@6qA~qog|4+CE3%onFu2=oVL8V`*6$YouvHV#maoBP0F2!Cq5#pnwX|=yk*SS9vXMG)m?wMoN@||<775lTAeWvXw3;K7R zq&8!X%gHN0e25oQ;<(7MBY=GzY(oMKR6Inl*J>kauOCNMJe7KwTA*Oc8rXKCQ&r2V zb5(^Pk%G zpz&Op!tZ=OMMB>i8qpSOM0j-;$$%Oei}_@hIbV-{;YPn!Ab!_?Q0v~;!5uJ8+ea0f zsCag8aN-+Qn2K=p!s3)>0$mdeaIur_w zBpe@}RVz;o>3wb1PQhlOf%O)4YNhLfgXp*}uPz&LmT!;7YWO%kA34vW>aI?rdP>p} zgj&eVczRS#+n3AFXAWoep(ny2?FmPP9udiR5p#*LRvw}!Px*+knXMRwLK1y&)+Ko+ zw5Rr7!!qB;g&|)+305E1+T|kf1hSr?zNpVn zd>0rs!6f@HjR+^+!dFCAITS$BbcjYC3GP-HpSvG7IUUqDQo)X>3DLyPw}jjd=NHesk2F;g#gDS01d z(MX8Fg_DdyL4q|)D!p8iuF*8+gL}!d4Y^tZ|d8^n+q?C95 z{s-MUveqlS+=1-{LNq2lfw`+Y3=Y>9S}PmH*aROiTXlp;3|jn=B|SrCD2j9qF+(#~ zNg9jZkgdw+{4DU!=d7n^oP7bE?Gcw*&~S7t6jppf{S@h#t2Z^{A(PzXK_a83K{C!P zT%-=%IE}5080J%|v)J%hZi4%(P`s&wka@Xj58r>L2H?0PuBoa@;Wm3(R9^Z%;+Xr6 z*8j~O&F~3iNqYY&U2#J(;2T6}htJd$4^Fnc;d5EzaAt{~7)-J-@2=4&w~73QlVy2L z3TbQq-AL|XS<-Pv;pHI96D{IU0!(7oS~cM6wv1wKs;J52)D&*x1=PFgv~5_%Rcjfn zONMfl6CaHAI28YQ2l}kcWW2q)?thbKVOi4Z&j*R)qJ@2`F(9!v?W;0K0JXBx8@5Lj z@lph)bA`?qioOo#!rpb!{b(EFbF11b8GaTChxItz=3iUGgduD^^#qM{5_6HMqv?H3 zPfwT7Sk?JFLZnkqL{s9WYuJ78V<-rBK$8hTj4~cX)ysB=H$w% zty5Ei8ahEsTY=$4d>wRmJ&6TuryiU$+E8|YToi4BbLI8d_(U>fyYT}XThp>!oFzZm z2yTm*R21s^D5wEK9MxH=9(*-6DlGE%*GtDC!T>r|&1z@&^Zt?NZ8g;*e>id|(}nL@ z^~zF2iXB)8yCMQJmEHogvZj}jsf2F84_wb*B)J>n(`vqe%q22H#;ERyHG??-39j9H0C7#iGE#cmoJ87#+r?p_sQ z<(bcQ=s~$2V&(MZT$3$Q!!NIHR`xe}!G^j@N-64d#euYSTw7Bdy3MCOg_>~hA z7=1LyVq;Y#1+a8X-$5rT##)dGo$gYqo9l2j>mRT0X$?Ig-SDhRK7_|7c=eqy>Sbmp zC^~+QR|+v|tAoxXNd`sRd&P#4e9AmOvh}T0T5z~z53tyW0rOA5PQ9@ zm@WjG_tibMu(AP7rtu*lBMPL|dGWUbP*H=st;tUbmFgYHwpn`5p*Qx@Q09a9Ea50~ zP5NI|Lb)|;w5@;~Efm=6YJd8D9cn+P!;h@x3Q%ZQ3DZ*fTZ8AM(-b(7n4IoPPXk2y zX+8ZC(aA$!HursAoa4a>{hLsQMrF|EPf(^bAM_s2UmqjGtr!8-Q}H=b^TqN;l~~Sr z6j}+wY;1< z7^E(Vu!V)~f8a0TAdS%U)-EHiaU)Br8$1v?FV)Mg-`a&B_jO8Ni; zGr`Hy7@rbkAmmyER4<(d8V{1$C%eYgE*w7FOF<5)px6?i{WdA7u|kQQOXrxuKg-|5 zL%ha9c|`#^XPI6vN+Fk3pJ8rb3mrNdx1mJ&@Wws;+v>=x5NY-%P_;>0ZA0J@Wdt3f z@^NWT|1~9G_Vl@=x>PBS+-B}6tQxHxKG@oU3_>HJGs zo^ZgxN4+@s0Yb=J`-;<8hls}2s3rBOQI!G<^cN#MC#f}8X%Z0=5xSFSGX*VP6eTb= zCex|O!YyZF0{Gi1&w8B(8wmK?clXL0e0r<-z@GeK4B?tldXNjG8daKw4U1q zE!EfeaZ?oqeI{v1Z&2j1o}0)g$0~n~9zmx`o$k6k?qbHCWlOVeyWiIEJ=T1-XB5wH zzG|c_GHdxgR=wpnxso>{=aLwBaA(gELBF&zp98eEw{0}xY#cZ5EE(#vvNU|oagQmf zeh7*3VTc9(lvVkp4_tf!@+l0@vDeRGQF|SnpPZ})55EYe7#DJqWK5q%PT_7qKtOxS z{T5U~9Ot|^YwpwWZJOlZc8f$rf{s^P^h>p8dMdzBn4@a*)q80QP>^K*0W@PMN{e_4 z(cW~2n&Ek)Ne{+DFwfgaB%}24%f5~r6jd`bMsjmDp;xN&6l>;%1pOCILvghyM2N`l z*6uaN%C{mS!b`^^jw(|s%AU5P%#Xm`_KBK0wKILH>#;F;AaEkS>r&`cnPek>amg43 z1@L-~^fE6u@DxqIkePjewgN2#>^v(bY-ZbrqM32h->Y(#uitp6PZH6@ObN+N16NRP zu%MrY?dMJw-iP*{P*~uOH6&N&hq8>Z(#Elj^y5jFvuok>0@F>}oLVjU>SeXSY%d(q2hW4IQ!$DetU|FfvysQG(UT`(`0usO7f`-F`CuU3Im@MYV5ZQ#^k)sWuvXy zrqq9$-ZV2g-6G35pPZDmu(AU*Rrkp*-Qj3ehB!N2H+8Z+(I`1RIcr~;y21Oosd9cW z(8DAgE+^wl9S}$t(P+t3=q=RfT+Pv<+F*D?rk#7$9)_BTTb`r6dH*2idy_tl$6D}I z^6+p4pE1kNLTUDqnkwlnE*4`;aoqLfQqWGP-@N_f=M~U%7th{5O^sFo4~QEZbZ=`3 z=n)f_)ll&I_0cgVIxVwGrsBI*of2qWOgT$%k-J!)>Wwpe@p3qVv+EQ`m-sFlfzlHxVKE7SCrh)rV*XeDgg+g$ehs& zl51QWbF{@Ch7bd+d8}RrT||Q zGSmNw+WsXd)7Azp)g7g}c#&M1)SxY#Y&8^HS4U@_9vpha4{ErWke@&xAvbCqKNkGEQ%CfXxL)Z z8oq}{QhpzVe}~f>PdtAG;zDmDK4|X%MT>$08e?Awy+Uls+g!xofL_=3hdiOOt?_Dt z?81Y53YY=SW@>O&y%h{Zw+=V1BW%5w%S-j2%oCJH zLQhPd57T{3hb&Ya!Fu8)sjDvlb!vo4IYe!0+1B#*$$Hcw9HM2lrQ;uLlUCP!o(W05 z(cbi*;pWv^od&I7b+6ZbjNDY{jY73L{+=$DY8O5jCu%%1ltvd|9NT5v+i+FI zvfJxOL;mz2H<@m0Mu=eK|(a;Yn>FZbn zgtHWDgQEWs(7$Qu$IlZtnA{0MrU2#RKuQ@kl>n7u3gcie_&20HUfz>*o8tmjRIrzf z)4!l&&wxXnQ~t-4ze>ZKejq>(XAJz5-?YL;Ic#VqM&e2lv=jDQNreXIr5e4P9)f|y ztL<{@wYEPE`1ik^usr*Dvc9EN!3dJYgs1`*w&_qafw zkr&7X<;YUdzmRk`=A4?;f)=`|sV|r+{?T*{*pt}rT*601`kI(_1Oph>ow^67Hi8nL zo~-o+ZeUoikp3TE?%PyR^-{D&#k=H)vKaJJ;JZW9b_KsxY)lY}OUzCp&=JnGy`zg% z=hV(Ctd<0(E@^Rfk4WR-$f_925;9=wY(Vy=oCggWmJk+FPCTBg&w@Sf(#!Xao+_A$ z3yCSbOM0^lO0(zd3+I(ce*M15$fEi$i1HAM-XrF0XvoT&Xslw430V}P*T$=KGs#di z?3W+ul{frckYI1br>lbK>3mP*N zWcD`vw(6P~UhU6J6@-1wJ(GH`d+7|2?d%Z3J72`o;LqnDFKGSmGN2i3X|15io=>8m zoWCP%j*X#B(aP@Pu4<4h)m+tX=R!!Y$95T@jjcCiqOO82mFy`#^1}A^6@ICprfbJ) z|JxtvFpRhw6shExG=OjCs+F;gkGrc++9>_Sjv(s@z*yPb!Zjx;<*(^DRb-{=?! z1%cx;U36+Bz-Q0`h*sxCQ#P_cVErRcwNVS5#%K`Vb;1tl+a}Ygmm(S84*gca2OO8z zDl|jYt{)iv@il+C(}=VdlO!)OdHEWxpY|gM$eIOMi?lutEX$p!-Al|z+8RG9Dfh~q z>~pA^Y?e!(8?)+=Jj2U3T!~90*~tu9(=u~W=3na{y5Wc6l7g-{OcO@xw}VW}MIg<@ z(pFbvhsI&hT7ZkHYF3?-AtLG|ma1G|y++a@UD$E3So46uW*qDLXwh)z9ZCzW|Gvit z2Q1{qfLC7q+3BI2&RZ z=Zvu0eoI;PcH6||;VsIVnV z?&$zOjB7kp5gJ@hS?wQJ;Q0X<9;Xo;;`|=fnMjquJI}k4vj!Vu$-5ovB}c|t9tfsB zzG>@Jl+}V1uUb%_+^Y-9%HG>mQUL|(arg!YMN&zNn3(aM z(ced?%9y7oWd*+k8QZ=4b=*U58ctZC@&2cDK~U76llL}MU=nplikwV1>)N(fd#Z=Y z4?iDooXLe0cvaug=FX`7)f|2oT&1M~EbNNfp`pz(FpK~!XXp%H>YWVskLEUd1|+A?b*OCMbD-#^>gxbThoY8)VQ7L zTkhPQ&u<}Tj;oIM0%%WOJUN4aKGrLh1nMh)HSJ}xyUKKklpyck>03*f+pab!G)cWB zNg=d1NSRCCfwnTR#-A8dMBuY1f7S0rBg4j(VfC#*OKH)9K3792ML`fH6v%2gopo!eNH3|aJpJr<7SuA4p&gdg_pys_b5D%LfQVY!x7Le5?v&VL{B`O=@bYqZ zCd@Cyrzy|z*l)TDKYKJNw<7r@`kWQkmMKGdwxJ{CbhoFiR7&gWGE|iqySFMt=leC0 z%PC8zV;LXzW-SUnm%jq}y{flw(t6saG48J@fIRljZ7lBZR2a~7Y}F>760~0=drl8)fe(5ph6c8&Qm18CC|7ICHKHdUVm89)Db^05< zH=EtKdcbYRe-7NE!pGZ4N_y>j9EQ5~+6L(dv;S*!H z9M|dBeTC^!TY7pZRj+Kr53=l>JK0=2^u{&|<6axTwF8DNN*(xg7>fOCRaAI5T3Xwr zT#!r9A5&6yZDU88x=sof?Z-AOQ|pvtEhIeBl5he7E{uyr9&=?%#FzZN zq*j}fZOm!Rb@ z8e6S;{iqLO1zbln@fC?6+j+h}re^E6(<4;zSPL3?&HOyYC3q(d3wM%-;}h`%p_D3( ztVa5vozu1E(Vwsk7kg48DSn(GE>6i-q;wfB|Af7lm>`xBQN#7zvjxE{%+EI)nVEGn z1ZyK(XRD=^qR(O|Bgz!kI*r-SRBF~?9hzE^O)B@432l7**L1;ZBg96S_cp`*4ebTp z_0T#Y8X1Z#g8ZjiZcr`3PXxL%KfQb9D&EF!p+zc@;PJ)=d76|SrEjWj%|vZzy)~4? zAspmuD1b^w`H-R);H=T_}423c8veHmQsUzz888MwTh_VO~LH0n$S*~u#MiKry;1O zW#L}z&tkX3Lk~Rd+=s*%72HT!Uxk!&d&6LrV;0OFaW>H$F-@M*%h5!RNKSukG_9=9 zKEr(m-IX2{`k0d98}A(hy^&w{AI#3aaa#0u=z>iS*@^XhdxhC=zOcL6Mc#mlxVJx% zx2V^Y{EO}w<5)7J>!*qzWYZmy9ndzAa(*?OAU5RedV*+fk-3NYa%IU zE+vLTTpd@n!zxZ2#Ky(pB36ILhi5-oS^dM_&1V0KV%LPo2en_N`S3Kl?~e)(PXn2W z*-N%@<~}Ge@BFL1pX2xkQc9TOK6K-BA7p$otyF`lrDAp%*{m-RH?$lXx(ESzl~0*O z07IS!%us0eJHudUAmloYTgAoLFk=7k=sd#ZWnH=Y-GVkTGI8ceAl4aS(OiP5hqhHF(e2QmjS2Z!A(f1aT>exmnd-w*>lr3Y)lQ-0j4-=<+@k z!}h}TET1_B`H@VsBX56e4PEL);Uaoq*7y%;Z8-DZa;i?}72*>o9=6JeKUS63!*2LO$6oCsJwf125d$IaDLw;XA9@@$1>z*?M$(0XGCb z76q%s@J7=~sOd%^lsyM3(r!u6MhNG?&fY_yO{I|uVhlkFH{+R<<;+!Sp(!S6&WT;& zT&h0TczzRvXvoCb3VKSK#%`mzUR7_cmb|*eO89T4WqfctJ?r+*br23N3Qy+=%f?To zE-dS!C*T5CfdE7AI8q;a;5|is7Z>@LpWZPP%RUv@u5&6ktcAGqJYc{*`Dj!Yalbp0 zhbzJul3%3u?8lbpV%FBzmrET?G;R|kYHO=u=4MV`D#Jn)`gV*g6wp#tR{ejQK&sVdblDdT!(%W6=w5O z2m0jgC1A%Tz}?g)GD`;FoxunVJn#p7`Kg3K!m)}@q12UTLW^1YmDu`+FBETlyj3Zc zBjjx@0l%Csv|+t#RQ1OsZnIyF@}=P$t=?pFh!T$=4 zw|FOC1ScdkGvyaDGp|~V^(nf8(R!}1o%gE+>fs+l8kGwpRWBwlk)&p^+}EO{E!Wg} zXDhS$$k_B0nqeN4_F`%FHzI=`{`{35@#1y$-bBI=#xsUeM+)l2x%9jmS5mPh=?oKl zTdFy{PYq z#N;5Hb(PJG)yN!Fq3;n$*XU0;A%fGow(EO;+669l)Yv^OS~m`;y!x5Xrn#Ba!`K`O zoy_{Y5Xtry$1l2!8Gmxqd!@W%sEd9UE4#MJzW8MCD#~BTMnvOD*fzlqt!gVna(mu2lvFC(B#+%;j7Rv97q^_KT)CHpx!vrA?FH zvBedhFw&)MB`_qY$G1iZ=3D@)6k zuvL#SwQWxyX+3v~Pxm@$Q^mE3;J$i903(gl18MM+Wl19*c;f-vsvDFtP>IS(%4eAQ zWU&~O^) zc{9!zK~787kH!`SU%Dufaj*{vzyKnR-iq-`9wCsk_d{>FbN;Xk!Q%K1w zw&{eIdbSwPO0`xdi}ty>s>^-leUsJgdFN|Gj%d`ikebh5IUl;MzPXD$-LChjK;AX) zrc7)Bk0PLw=av>RqMJmAOgLPW;Il{t8E4zvLXT~3@|OI12?Sxv{oo$yov`im@^KciaS1=jB z>5uF-JfFa}x?^rvXCrI-Qn4|g%;u|v8>jqhPLt#t>=D|zkstaFRcgC5>&ZE~=%4Eh zO`0$IBhfR=B}VATuQQioe};E4F&Fn3(B#_eu8D6f;tF)o;?)9CyTk1xrU~3vKg@q4`VGKDus$=$Sq)eYfPC5~b1%wyltiSSOYLkspfmNM*nIQIF8mm^zBjW*X( zHy4?8uKHa0v(PYGc9*AZ?jy|Nx`i_jE7XELmMK4JzOA9v=+_e;8(H>|Sn}s%bnNqu zu{Y;?yFUi3=cre_bi8)xT<}DTjcTJC7nY4S6}Pll=Ddk{Ea8s97`VvD*8mjE!F!srdZV|;1y{)kWbDiHZB&zUD+`V3*OO=c~b z2S55ZJW3Lm|3H$O4!lffJS^qdaoT9sc*B>2Udr`7-*~f}^YrKN?%M8sZwi;=Z8)dy z0pI1)>1^wm@1DB(5wo=+X|1kQw#xqdH3%i8h|5mxggQ9hJrV$mJ@MT+3;+7XtTt>c z0Yr;8%l6TV%jlV?x5uPa2s{D1Os&4v<%ZdF*ml!PgmlBU(GV%m8gMWfdyF(!j`Z5@ zD?zURe#RWLml_+@8bvTRhM5`j+q?JNf$;Dj`sTz#Lfu(nA#$-Xak#zE5=)hD?TNmh zuK3mz0!i!L^NQFM*(rdD_A9;HzymUa$*jV<2`>f9v1@bFO`W;=7T2=#*x~;L8 z?v4-J&{`akQBk8OX)Y580ouCw>Bn`|qg4WDSdx3Yja9&6j`_KHg}z)}DC2xtn@;bU ze^VnR+WQ@6dqartQ)SP4x1j5H?@Etxo`eL5uskE$U`n{7@>%34umHT+&1#BF&{;1b zJ;T&_#7xD2GPLawqwu(VYY8{}DD`&%skMe$3fH3&=-YUGGAUUzk_{E#+A86xgv=we zfuE(dgFO+hLQ8s*o!l)KgN$lGPuLZVQnVOZBb zG_+W-zh{+8x=5kvQfp={vtkFi%3lXK?t44YQk`0M=IZ|!Ri7@g*mMmF=A24BWE5ZKXMxLAghtnyL*IB zMbFzJp}U8cbMP}iHDGW#Cm@qFE*2Lr9tk_#4LqmweIG}znnTDlg?P&z_yrX^%XRW%c%Z_oS z_QtW6yrPm;Q0NfrwUgiNy{uW(Ezc=cKyh4@E|tu)L|I## z-=&BHWTA$d4CsmI(=*3*vmwD^wEueN*Dhs6Bh*Ds1HFmapS*&3B_Dr0yA&c_pZV;e z!c?ytAClP@bdu+1r5m`&-X~B=E1!(TT%W1swmLE{7AhitLzS(b;l#EW2;m#euZ5WH zvz0W@)PqkR?Ul4NTn}USxW3iZ4Kg8IX&d4)td_gV+k*}Os=guTOS|F|XFn=&yl;vu zT#W4i%TSjwwe;nM4F<3T#0 zJ%q|l)7ECQp#F_N9mP(Z945;*7%Ej!7&*FkO*^S-r1;uISdNOlZj{Gq!>tTcb$*Of z1taO-@gg)v?sMsOYO!loMerq+F7s`dynC-OxoI>zQ6-t%OeRaYlB&$886^*q|!AE^_md z5ZTdKARWkIm*%LxZ(wZgams+>CdI7q9#&lFCB~ufg~!%g zz6w)s4dvjt$3RgMsPw<>B-l^hIvUW|mIw=3UZqpWQG2`~su5?a*j;zuQQv>y0_-{igtRZDLa&sJ17OI`{r%>i=X8)yd!>6Svi}SA=DbQIykwS1)fO zW$o2N;YV0mzQeyrZ!;kP6a zNX8aE@?M*elD8SH42b=1 zO9s>w0$uaz&G0>WjQv?$b_LGTt?C+aiJ$FhCnlzCF@=yd&;k3`T9*83+UjnjhukDs zKiNZu>AL8c^$-k2yjh*+kv$ZY6Y{gp}iI62`+8ds^<*-z&l+2yB_=e_Gn!zbV9rl!FAVZ3gsYKH!3|8M55~bld|3 zL9(_DR7c2kl1ND8BhplL*z@;`To(#R#Jeoa_Us^YKA-I|e+Xn>!X}%b?RT;#O{P{y zx-Ed;MDL=ne{dr-2B|>6hOhl!KwLqP;LYtl+hdw@WiIo}@29)b`yviP&ZcqS4>v@b z6Fyw+rc~eRZ06&m>v<1`V{$i z17PTFA%$aKI&ooxc~~gt^IQBY5dfs>6u}&p8wDZp%<%CGzr2Hv}SIgDp8;_HG0UV1Jp0Dh&QW#!u@l$=TrXT7TlO-qj~W*Hi4We zHZh^2q$_P}RScpQAC0ye`wenw;hJFODwaZlr;Y}d_JD(O!RlBvmj$3MU#jx=I$#TO zTOUY{Od&#cWLsDmc=K*T_V>wQL$Hj~rBE&5_~3D}7j0L4MMS}_D@@NkJ0=vq!o>3T zDW|u&5>)z4L}1-~|g8DVKWVHQ394rv)GN_(LS zMC{@$-|!4~g9tFnBMr$RkYi%q3Pi@+S};SeF}A<#hgr;aFB?$?*s~rwb`fflvg>(- zU&lBgO>MxqGrCa3yzX)@+znroT>Avj-zc81?wI6mh<^mR=GHmkj1^A81`1-7p&@F0 z9*L7#eRWV-0%N*98Tkf_>vYT2`IAMD%)0q=>au1Uws1P(q2LrKw=e_mj{BWTbN6_T zPYDQF?RV!Q8y|WkOU;#R={E*{%+(^tXY#7^y=6k1kMivR zbVKSZoyMII4?QG7QKyYYz!GJt;>R|f#lG08K%~TKXNu2BY1p>>r??eFu(Hx#up+p% z375rQW`x=Mh*y^6{B*-!?vJOq&uJvdCyw%Z<}!}I6@%-LLA&&??Tsy4Mr_v$;y zbcN#0eQZ4bKXC>(0VoM7N!7QenRNB+x3w|YZII3t+Gcl-?MmQE zU)X7;DsQUayH1oaeG)G0HZHN8ONHveqp@+nTGu6c`W&k?z`J=|!*4`t#1W~b) zzJ&=C^WbNy7`p)9<)rq$3T46FtV)|dW^+dp%DQEjQy`nigwA>UD|Ib9aM}>pV~ODN zn806fD;nt2M8s6p5x$=w2)gj0^vg;srYnW8zQ0r8L2^U8_HJ|Zg2t*n|BSp&Ct|2O|%5p5`rJl~s*!!p0Q*|_Jk^s9xouc%xZF!{4=B=jeVsO7+@ zDa|Bf2PMJ-J7Z%Bi0@{yCk^m4PE$!U0l{YRM2jDj;SF7V7aQHY1hbyKugwe$LH%#a ztOhYC`TkP1jiFN~4oBX(x-`$ss3Nuay1k>l*wL_DsH9Stxa}$Cl>(r_;n#oyyfaF< zc>SLOgpg}nFtxYpRpz9xKTAu?FyHpK5d5>0eM$I)){$MclQMb~$=N1YwVB<@O{uaH zEJkUDE##}1tU}SG*nW#ygZ5y zr3Mfm-bwdszulNG(Y$MQF1{Oiqw^E4(?Uf|342-|xb5&_{7hZ27a#naX#nX{xz=n@ z2lg>ROa(}>)3%(M8EQuLdD}Jz%r|Twff*6-_2#g#a+fuV(3|nJo$qj6Gu0uq>%%+x z)WM0MGUl5E>~-6HJ@BB^g2&;dz?#UGXS*9|vK4)NIU+1#&a{48JM8y2uX%hqH+%sy`k^TMkXOy8&Zx}$vN^?28q!tmS`y~O? zPQ?`XteIOLFbG`i64|jVM99eT_2lR~^>eTj((*<}Mxu7o7b+Tt!>h7bm*!UJ zR$IQEX>OH4O(+T4pvFrz3=;8Cc(@f_y4H0U|5Z0@Qi%IJ>Q<|eiNZE(Q|uWgIowtS z)vGa_K|;4rA9>V%c97}bF6s01k2FM#yXJCr7z)5LuL*CjCxo-&Jw>S!$cS0jPW=35 zx`B{80{8P=Z?DbV56Htl*$z*6dyDJweinNV+rmfszu7~f^BbRA6|hh0ebbRy+u2wG zK~$yuB`lfujmO`?biv8rNfq;Zf&Zf9k#yoy{$n2NKWUi+hd<5qYN(x`zyjpnO%MBe z=I_n(iwOe4iV=UT;!gS3N4}%&WQCTP;L^z^{Ib|E#qErgCyAoOzA+VRlz&DJ4Z)2Dh{+8&sX|ZWS#yA;{KI84~39Zy0*$=-*hR1Ymr&nLWn8bFJW?r z*r}caf?d@9nSPGVvNhkV8*kho>q1s8$2fl(DZKIYa&sb zA;?5q)b)ax&lJ{LddT{91&spa_$>RJ%K<#){5|slHu_ zdP*7}h4(ur|1J=3ifDY$+P(=9WVjpxiJ$=~XT<8yZVQQde!LTB>B5tjEee|dl(SNZ zuU|KHS`rV?wXy2>Ih_hZzzS29ko5sr<+P#W5is6ZQW)k>sZQqh%P|^=#S(ZM*uLZl z`q~+R8w-GcpjyfTmGdO|N6-Ee9)M&6RU&a+@%z0eOFeuPRd|Xtm6S5Mo-ZuK34^|= z16nkq0@s@t&U;7qFf!`4%zGEb=NI`}K&rBM($%8`SAs8ipMOr-S$sPLqfy}YUd9m*9JSx>o#-~Jq zhy-8y*boCy^L+ZV!oOij2Eu(U&-A+$!15R^RbbDbruk7JvpKuRwxL5m_x?6__%ain zVXVsTh_381CEaXlqTr%`zF0@r^7abT(pL8?$TF|TCcrR6|046?PGy%}!@JA;IglO#6 zru1yAdg3xFtCsJ@e0H+dfu#Z4SdJk&_zlU1(m_V!PZ3jWLY!I*+juFGv*VLMHo%Hi z*3;a0O<=wO>b8XLZU+^oL&^@1qcdB))UkIz&KawWsT)<{;C$mjx}}3t9o+f+H$MX> zqI<9*85F8#Ij0$s^oerK&!dK+GB@+P+|pZ~M?jDDH}Sc(Btg@EY()CmNto@Pa)0=l zc(aav)5^4BUO-39$FlFv4?KP$1m2qU6EEvwl1KZ?#yU3hE7?8rPz|0Bx=LV1f+w5;IOr?9<7JT>lVBFI{z#=PKR;PXY^MA4$FQpK3!V%|)i9 zZb*Hf)5g;bf8d$(Pr30KyKgyCuV&rv700(0fv%#rpAsw{^{0P+YyTsc0>Ke7{kalR z?5-Br^_KlgQc8!sI+#0n?o`w8b@elcboPKw)NGTkQr54vzlA1L7)0-#{YFcYZvM5w z!F%TqYO$0*?~qJ~pCcG{n|xidEk#RqN>wBN6Vq(NsxRAw*yrF^7nxt;Jy-;us}(k1 z96Qd)os%YoLzq|}I%TV{-(Kr$_*%AnRinbv+3&J<<`uS4RuVjd!aL7x3@ON~x4!o= zR;S$TYtJmnx!vu33G$w~`Dw_BKms6Nbz>&v;>)0N*JGHvx%^|M}G(JS5RR>~>6L6yQz@zxS`x5?d@SU4?tVuV| z$o|}4MqTG~rqFuf12X+jk$GG_hTAvn$66JLl@5Hp-pF_Eo=%j`%dgzc&8>(WmK;#5 zKpA?+fNq$6;S()*L)=gVrGc~T3E}?)L#?Gh$3^S;-3_bamc4vX}`rluVjXp82L*!9F` zelJd{MN1YJfY;&Nk3>8W_MB1pewYjzVg>duc&+Mi>;ruiF(56YzCWdP3MpfSZ%IrG z+z3wj{ZuV_%2Lg`pkz=dQJv6)_h34tHAA za%AbPOF{*B*1}u+=DtW6o@-d$Xn(1NK)3TPnA#jHxRD(+Zf?%;|Jx3H>}EE@&<3gR zcP?=L9>Hbb+}xa%dI#@9oQGSm63j`22RnByx@HzCyw{m_dz-+uNsCGELtI*7I36&ZGo zgceA2DWgUf^mxuiUS6ZDd!Lw?-VpJ+yZeIKl>gl>*!U)mU*>@^;7MD}yRQd0`*$zO zG~g}OA8r?)!7k0**0Et$*3^t8L)OZfKT~y9i~88BLMPMH zJZppQ#51Yt@=AdQO^>-`|MS7I2L}3_WXECOUAFG5r5kUqj3trHrW;6|bP~G4vWFVF z&r25VoP7KquTj+aq|xXP!|8*&9e#Ly5V11QG>tp$w4oXuiyUaK?aV2CBg8I{+PCcG zjm=tPb|D!$$a6`bfPV_n@t6_~IOT5`6`ZsNtq&-Ap{e#R&$}O?rgR=EZ^Cj?vfVX@%1ev>g}n)Xc&|o}NDUjD6z0oLe1&{SXzFC!%;& zSC$>|gWaCpiPWVGlXHVhIEZqzG;g_%&eGOsLxw_S67zM8sO+khrcQFedgrr)(olXAf$+|^n>zE;J#Jo- z@L;FN3r2{~4V_jwT-}3+C+A7jcNq?qR|d~n%`-yb|0p0!{sZ_-3_of;7;Dh~k%4Pf zgTPF@$kFjlpG8x9N@jLr&Z93w72gtG{WUQ45ju=eMoTr-npS!2%#4P_mzb#6T%9_U z5}HbHGnT)^UlO`->0k~2+iGORZhrH&y5ZG_+U2IhNyelM%5W9Jj*n&?kLS1xk&`1>0~_CIllRr?>*TSY8D z1zG{Qc@0SMFSwi}y1;fvh~E&wXXvrwlrdC3FcqozAubLEHBn^qqp~j6T-927077FXyk$@4r$*I5oB=X}NmPqvgbMtY}OXDzlrc7-w*-Ra0tl}qP% z^F>odE0byVi7ND>{KQfq2n|8P&>N5u%vmz7Lx%BpkG9F3)MMhhbCnV*+VhH<2^k92 z)@r5@;I$O?v~-dM%lJMSqavo6U{v z{*HPCLm4aOMF%KIAMkp7Nl&_IpNd5IKP&UC2_O#+Q9#%liOS83J+v=Sh!*hY2VFwQG;KMhJcyelLf}!qAuzYr#MH@4w(^4j@ zEIr4?!JjR)@Gc>6MHXsuZx_%R4fV>eK=nL}130?`C~Wxk^{VT+MeC+|6)F6Wk$FYJ zxO-8EsykA>>!#0qC3Ca3s95lxZUnrvvT2z5lED9nml?Ei7ZepaRtyN;f`#oV&xXUW z*G+zKG*@2p_Rofpt*)})+XXMp#pjx@Mb@-F_lCj*PSFM_nETiaQ7_UrP?~19Jn6L3 z)ybhOc__qlUXj6D`<;a@{VhCXu;VkeGS)4}MPn9U-!LNWj$dPRo=&;$in;f^TYr{m zlg9Hls?tsvBXTRGnLVvS!o=}jBtk=fUp5-)1;cnCZFb_LgU^E0htz}we|IgP9;mT% z+-HB^bmguK-q7Fz_`uPnqrcUJ&Rr1)4EhY5PPaOzd*Mn*U!>r>b<>~0YYpG?BeY_= z^HJ4zVL01tMQeA}-#H&eKL<}-ygGG|my>=Bc=yc*S+9;yF97FPNLuF6oGUZ;t>lW9 zjPOSjh%?V!p|n36!P*4Ef`ZMlkW*?fjgJhLER}{@5`})>-Ka!Z9utM$bIC$kDmF6_ zuA4R$^C1&qcfxZSWoxC7l3vylsRRnL8i*RPmSQzL*$&?jZ89#tBN6F1~-qCjm!@O^?aLm zHHg!3Xth5~f?s zY!CoirRc5{>X2h^c|AnSdv%5d-*v_E2Os)W(y$?*g?BvN(gQ2c;=8G|%eo>Fn zj^!}WF|AA33%aKl(Y{@wEiGi~DYs!0Y)XP|&j%?PW8}b4R7AS`ZW4puhAyb4*Ij{0 zZB3}UpSk9ip}W<$QFr;`U>7W{t>KZVhC+y0yVYke&8rj%+=rZT=`zsz#Vfyw52gRt z&}rdR5Kl)?rjPCm=ro7S47TQ;Z+RVAZU@2YwA^NBDeOW)Eh}zhOEFtXNB#^Xgs0+n zKWzy9VNhzG;{*4$w?LMA(0AnPFq42PW!_xI5G{I4Uu;RmUB1n?O{t+VpAUG^hAfEa zFq3g+{{fjLWKGjtye87!N=mOOV%1PrXX|sDjOA5bpPB=Sv|Tu8^CWH=*Ghxu@n<2JN#n zRACC9kWroAF$CM9IVHT=eao5IPv*(*%6^~fT|{T{IlD}lALKd#e<#DoCC@Gd{wvMn zt%7p|+o2%etV#2O9-+bvj+DRzq{bJ-qRLzsE4BQ)vd(JI{7}3zg3NS9fVX-h^;S1Q zF)NEBe?LtYTM)tf^^-klv$ALaJ=75O_W3w2SnTx(n$9HA26pO28D0}Gz(8@^?7kcS*&jeF;oHv6rZ*b+DUeNnfT|Xf~q^ve#W*8m$ngP!=Jx0ZYy)H7Jzz+24TnXMk-&ljynGwl(5psJCSWRXxU+oTeci3EYNeg6vX=P3wWkGFSvEY7M=-{H*>pX zlVmFUr9WDkChAq`KqZW3NYMYqj4prd03(9XcK4#TIRkDp_m&IpHAjvT1oc~G+fmf% zKrr{gae@DB@B*?sx1k6Jj;r*A&j7S7EEKT72R0Le1};g8IMlVhxnN^Hv=RC}6B&nq zKx&Snhz1nP$__C@%yGIiHmbMBarecJfYx4cF9@G4T%&pbd`PSUQi4foa?ZC%R z5WmAwIyG$k877leMpGN(!5*A4!(GBAhw zWPhDLPuibtq!lv8`{C1$L)E3Q+t{AYF?Z#1P6#D27P_G$c=a@?$4%u_P73LAhpqGuW7|*gy zpNX}oh_n1K(=b*hZmxSxs?AQi{I)yub$g6c(fbW4kCk~B*(wE#InB{Qw% zuh`bvGcF_w+{pW!z8gVL;X%6nNVYqG)1JBc$1-$qxU#4rI`PNF)n|yc1!#GgT-o^c zmp3>n+3L!6o&^H(MN5W7`=M=qeNx=5?ZP_mXYbtS+qz!3=1I&4U4n(CcSbDco|j8Q zzH#lhKO_Nw-GV&NUW=H}d&nnF@#&HfoEbGs85H zp0LFswm*jJv9cq2Tnr1;IGYKlbcDGrt|^?&e*SWyxR1#l{k+rX9rzaK%Vn{rINd9q z$>l8Q1On?rUETH4pK5U8WFYKgPa2-~(sBIBnsLP#{TV9ixqcmKzm&t)KP)&SIx5(l z8}YrQ+#WSJ?Af~HaeiD%yO$Lw5v(Kej8X$Vwf>FbFEE``_rYgvg--_`De|EwE#oAx zVcV@umEEW?NhA-WiTcRQs3ARiw%n*1S?5Z+>tiWDYY~F+-1fe{;cUxaJ|cR{H@%U<{yWU;=^dIF7JgpTV$9BtE7ETSL^FGd&g~{jDWm1O^`lnUqQ4Dg-O07S?7-&7;R%g*oRu=baaKE%SQ! z7Vok1T`bj!^=$TZs&|zt94`xMmi?%w@VeDvVJqA5(#K1uvk@IV5j`%F(H~s` zckH8UN{x13u`Lc->;M>8q~1^&vha@X)N`|~(_*u!hnSF!e{?5_2nludjS> zx@y7eF!uq7qcgq&x-dX}eDLOAW5YqYLAL_7ZajoE=|MT%DQOslmbLaOuMbBD7R*;! z53H9A#z#gJ;0CL0;xs%LN?Z}U=rJA7R+j?hhvXAZ1W^wZTwAUEs$mB8m(jG_>zXx! zxFN?@>r17v!uk0~tv2TTH+O7^G5tgHixErY_4!G8=tR3RilaXA2uUF4_NTOj|Eeno z?D*e@G%`421c z;UE5xdQ^ -/// KM pipeline handler fetching discord data files from content storage +/// KM pipeline handler fetching discord data files from document storage /// and storing messages in Postgres. /// public sealed class DiscordMessageHandler : IPipelineStepHandler, IDisposable, IAsyncDisposable diff --git a/examples/301-discord-test-application/Program.cs b/examples/301-discord-test-application/Program.cs index 5701fc6a5..53434d933 100644 --- a/examples/301-discord-test-application/Program.cs +++ b/examples/301-discord-test-application/Program.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft. All rights reserved. using Microsoft.KernelMemory; -using Microsoft.KernelMemory.ContentStorage.DevTools; +using Microsoft.KernelMemory.DocumentStorage.DevTools; using Microsoft.KernelMemory.Sources.DiscordBot; namespace Microsoft.Discord.TestApplication; diff --git a/examples/301-discord-test-application/appsettings.json b/examples/301-discord-test-application/appsettings.json index f4bd01e51..392e91563 100644 --- a/examples/301-discord-test-application/appsettings.json +++ b/examples/301-discord-test-application/appsettings.json @@ -5,7 +5,7 @@ "DiscordToken": "", // Index where to store files, e.g. disk folder, Azure blobs folder, etc. "Index": "discord", - // File name used when uploading a message to content storage. + // File name used when uploading a message to document storage. "FileName": "discord-msg.json", // Handlers processing the incoming Discord events "Steps": [ diff --git a/extensions/AzureAISearch/AzureAISearch/AzureAISearchMemory.cs b/extensions/AzureAISearch/AzureAISearch/AzureAISearchMemory.cs index 84c0536e1..5193ec199 100644 --- a/extensions/AzureAISearch/AzureAISearch/AzureAISearchMemory.cs +++ b/extensions/AzureAISearch/AzureAISearch/AzureAISearchMemory.cs @@ -16,8 +16,8 @@ using Azure.Search.Documents.Models; using Microsoft.Extensions.Logging; using Microsoft.KernelMemory.AI; -using Microsoft.KernelMemory.ContentStorage; using Microsoft.KernelMemory.Diagnostics; +using Microsoft.KernelMemory.DocumentStorage; using Microsoft.KernelMemory.MemoryStorage; namespace Microsoft.KernelMemory.MemoryDb.AzureAISearch; @@ -92,7 +92,7 @@ public AzureAISearchMemory( default: this._log.LogCritical("Azure AI Search authentication type '{0}' undefined or not supported", config.Auth); - throw new ContentStorageException($"Azure AI Search authentication type '{config.Auth}' undefined or not supported"); + throw new DocumentStorageException($"Azure AI Search authentication type '{config.Auth}' undefined or not supported"); } } diff --git a/extensions/AzureBlobs/AzureBlobs.csproj b/extensions/AzureBlobs/AzureBlobs.csproj index 41bb27fa2..34e913bbd 100644 --- a/extensions/AzureBlobs/AzureBlobs.csproj +++ b/extensions/AzureBlobs/AzureBlobs.csproj @@ -3,8 +3,8 @@ net8.0 LatestMajor - Microsoft.KernelMemory.ContentStorage.AzureBlobs - Microsoft.KernelMemory.ContentStorage.AzureBlobs + Microsoft.KernelMemory.DocumentStorage.AzureBlobs + Microsoft.KernelMemory.DocumentStorage.AzureBlobs $(NoWarn);KMEXP03;CA1724;CS1591; @@ -19,8 +19,8 @@ true - Microsoft.KernelMemory.ContentStorage.AzureBlobs - Azure Blob Storage for Kernel Memory content storage + Microsoft.KernelMemory.DocumentStorage.AzureBlobs + Azure Blob Storage for Kernel Memory document storage Azure Blob Storage adapter allowing Kernel Memory to upload documents and maintain their state in Azure Blobs Copilot, Plugin, Memory, RAG, Kernel Memory, Azure Blob, Semantic Memory, Episodic Memory, Declarative Memory, AI, Artificial Intelligence, Embeddings, Vector DB, Vector Search, Memory DB, ETL bin/$(Configuration)/$(TargetFramework)/$(AssemblyName).xml diff --git a/extensions/AzureBlobs/AzureBlobsStorage.cs b/extensions/AzureBlobs/AzureBlobsStorage.cs index 5bed6e372..052b5018b 100644 --- a/extensions/AzureBlobs/AzureBlobsStorage.cs +++ b/extensions/AzureBlobs/AzureBlobsStorage.cs @@ -15,12 +15,12 @@ using Microsoft.KernelMemory.Diagnostics; using Microsoft.KernelMemory.Pipeline; -namespace Microsoft.KernelMemory.ContentStorage.AzureBlobs; +namespace Microsoft.KernelMemory.DocumentStorage.AzureBlobs; // TODO: a container can contain up to 50000 blocks // TODO: optionally use one container per index [Experimental("KMEXP03")] -public sealed class AzureBlobsStorage : IContentStorage +public sealed class AzureBlobsStorage : IDocumentStorage { private const string DefaultContainerName = "smemory"; private const string DefaultEndpointSuffix = "core.windows.net"; @@ -91,7 +91,7 @@ public AzureBlobsStorage( default: this._log.LogCritical("Azure Blob authentication type '{0}' undefined or not supported", config.Auth); - throw new ContentStorageException($"Azure Blob authentication type '{config.Auth}' undefined or not supported"); + throw new DocumentStorageException($"Azure Blob authentication type '{config.Auth}' undefined or not supported"); } this._containerName = config.Container; @@ -105,7 +105,7 @@ public AzureBlobsStorage( if (this._containerClient == null) { this._log.LogCritical("Unable to instantiate Azure Blob container client"); - throw new ContentStorageException("Unable to instantiate Azure Blob container client"); + throw new DocumentStorageException("Unable to instantiate Azure Blob container client"); } } @@ -132,7 +132,7 @@ public Task DeleteIndexDirectoryAsync(string index, CancellationToken cancellati { if (string.IsNullOrWhiteSpace(index)) { - throw new ContentStorageException("The index name is empty, stopping the process to prevent data loss"); + throw new DocumentStorageException("The index name is empty, stopping the process to prevent data loss"); } return this.DeleteBlobsByPrefixAsync(index, cancellationToken); @@ -163,7 +163,7 @@ public Task EmptyDocumentDirectoryAsync(string index, string documentId, Cancell var directoryName = JoinPaths(index, documentId); if (string.IsNullOrWhiteSpace(index) || string.IsNullOrWhiteSpace(documentId) || string.IsNullOrWhiteSpace(directoryName)) { - throw new ContentStorageException("The index, or document ID, or directory name is empty, stopping the process to prevent data loss"); + throw new DocumentStorageException("The index, or document ID, or directory name is empty, stopping the process to prevent data loss"); } return this.DeleteBlobsByPrefixAsync(directoryName, cancellationToken); @@ -178,7 +178,7 @@ public Task DeleteDocumentDirectoryAsync( var directoryName = JoinPaths(index, documentId); if (string.IsNullOrWhiteSpace(index) || string.IsNullOrWhiteSpace(documentId) || string.IsNullOrWhiteSpace(directoryName)) { - throw new ContentStorageException("The index, or document ID, or directory name is empty, stopping the process to prevent data loss"); + throw new DocumentStorageException("The index, or document ID, or directory name is empty, stopping the process to prevent data loss"); } return this.DeleteBlobsByPrefixAsync(directoryName, cancellationToken); @@ -234,12 +234,12 @@ public async Task ReadFileAsync( if (logErrIfNotFound) { this._log.LogError("Unable to download file {0}", blobName); } - throw new ContentStorageFileNotFoundException("Unable to fetch blob content"); + throw new DocumentStorageFileNotFoundException("Unable to fetch blob content"); } catch (RequestFailedException e) when (e.Status == 404) { this._log.LogInformation("File not found: {0}", blobName); - throw new ContentStorageFileNotFoundException("File not found", e); + throw new DocumentStorageFileNotFoundException("File not found", e); } } @@ -294,7 +294,7 @@ private async Task InternalWriteAsync( size = stream.Length; break; default: - throw new ContentStorageException($"Unexpected object type {content.GetType().FullName}"); + throw new DocumentStorageException($"Unexpected object type {content.GetType().FullName}"); } if (size == 0) @@ -311,7 +311,7 @@ private async Task DeleteBlobsByPrefixAsync(string prefix, CancellationToken can { if (string.IsNullOrWhiteSpace(prefix)) { - throw new ContentStorageException("The blob prefix is empty, stopping the process to prevent data loss"); + throw new DocumentStorageException("The blob prefix is empty, stopping the process to prevent data loss"); } this._log.LogInformation("Deleting blobs at {0}", prefix); @@ -350,7 +350,7 @@ private BlobClient GetBlobClient(string blobName) BlobClient? blobClient = this._containerClient.GetBlobClient(blobName); if (blobClient == null) { - throw new ContentStorageException("Unable to instantiate Azure Blob blob client"); + throw new DocumentStorageException("Unable to instantiate Azure Blob blob client"); } return blobClient; @@ -361,7 +361,7 @@ private BlobLeaseClient GetBlobLeaseClient(BlobClient blobClient) var blobLeaseClient = blobClient.GetBlobLeaseClient(); if (blobLeaseClient == null) { - throw new ContentStorageException("Unable to instantiate Azure blob lease client"); + throw new DocumentStorageException("Unable to instantiate Azure blob lease client"); } return blobLeaseClient; @@ -376,7 +376,7 @@ private async Task LeaseBlobAsync(BlobLeaseClient blobLeaseClient, Ca .ConfigureAwait(false); if (lease == null || !lease.HasValue) { - throw new ContentStorageException("Unable to lease blob"); + throw new DocumentStorageException("Unable to lease blob"); } this._log.LogTrace("Blob {0} leased", blobLeaseClient.Uri); @@ -401,7 +401,7 @@ private void ValidateAccountName(string value) if (string.IsNullOrEmpty(value)) { this._log.LogCritical("The Azure Blob account name is empty"); - throw new ContentStorageException("The account name is empty"); + throw new DocumentStorageException("The account name is empty"); } } @@ -410,7 +410,7 @@ private void ValidateAccountKey(string value) if (string.IsNullOrEmpty(value)) { this._log.LogCritical("The Azure Blob account key is empty"); - throw new ContentStorageException("The Azure Blob account key is empty"); + throw new DocumentStorageException("The Azure Blob account key is empty"); } } @@ -419,7 +419,7 @@ private void ValidateConnectionString(string value) if (string.IsNullOrEmpty(value)) { this._log.LogCritical("The Azure Blob connection string is empty"); - throw new ContentStorageException("The Azure Blob connection string is empty"); + throw new DocumentStorageException("The Azure Blob connection string is empty"); } } diff --git a/extensions/AzureBlobs/DependencyInjection.cs b/extensions/AzureBlobs/DependencyInjection.cs index ef4e239bf..896ae63dd 100644 --- a/extensions/AzureBlobs/DependencyInjection.cs +++ b/extensions/AzureBlobs/DependencyInjection.cs @@ -1,8 +1,8 @@ // Copyright (c) Microsoft. All rights reserved. using Microsoft.Extensions.DependencyInjection; -using Microsoft.KernelMemory.ContentStorage; -using Microsoft.KernelMemory.ContentStorage.AzureBlobs; +using Microsoft.KernelMemory.DocumentStorage; +using Microsoft.KernelMemory.DocumentStorage.AzureBlobs; #pragma warning disable IDE0130 // reduce number of "using" statements // ReSharper disable once CheckNamespace - reduce number of "using" statements @@ -10,19 +10,19 @@ namespace Microsoft.KernelMemory; public static partial class KernelMemoryBuilderExtensions { - public static IKernelMemoryBuilder WithAzureBlobsStorage(this IKernelMemoryBuilder builder, AzureBlobsConfig config) + public static IKernelMemoryBuilder WithAzureBlobsDocumentStorage(this IKernelMemoryBuilder builder, AzureBlobsConfig config) { - builder.Services.AddAzureBlobsAsContentStorage(config); + builder.Services.AddAzureBlobsAsDocumentStorage(config); return builder; } } public static partial class DependencyInjection { - public static IServiceCollection AddAzureBlobsAsContentStorage(this IServiceCollection services, AzureBlobsConfig config) + public static IServiceCollection AddAzureBlobsAsDocumentStorage(this IServiceCollection services, AzureBlobsConfig config) { return services .AddSingleton(config) - .AddSingleton(); + .AddSingleton(); } } diff --git a/extensions/AzureBlobs/README.md b/extensions/AzureBlobs/README.md index ddb430460..03fc3d1e5 100644 --- a/extensions/AzureBlobs/README.md +++ b/extensions/AzureBlobs/README.md @@ -1,6 +1,6 @@ # Kernel Memory with Azure Blob Storage -[![Nuget package](https://img.shields.io/nuget/v/Microsoft.KernelMemory.ContentStorage.AzureBlobs)](https://www.nuget.org/packages/Microsoft.KernelMemory.ContentStorage.AzureBlobs/) +[![Nuget package](https://img.shields.io/nuget/v/Microsoft.KernelMemory.DocumentStorage.AzureBlobs)](https://www.nuget.org/packages/Microsoft.KernelMemory.DocumentStorage.AzureBlobs/) [![Discord](https://img.shields.io/discord/1063152441819942922?label=Discord&logo=discord&logoColor=white&color=d82679)](https://aka.ms/KMdiscord) This project contains the [Azure Blob Storage](https://learn.microsoft.com/azure/storage/blobs) diff --git a/extensions/AzureQueues/AzureQueuesPipeline.cs b/extensions/AzureQueues/AzureQueuesPipeline.cs index c77f07839..80ce56af2 100644 --- a/extensions/AzureQueues/AzureQueuesPipeline.cs +++ b/extensions/AzureQueues/AzureQueuesPipeline.cs @@ -12,8 +12,8 @@ using Azure.Storage.Queues; using Azure.Storage.Queues.Models; using Microsoft.Extensions.Logging; -using Microsoft.KernelMemory.ContentStorage; using Microsoft.KernelMemory.Diagnostics; +using Microsoft.KernelMemory.DocumentStorage; using Microsoft.KernelMemory.Pipeline.Queue; using Timer = System.Timers.Timer; @@ -124,7 +124,7 @@ public AzureQueuesPipeline( default: this._log.LogCritical("Azure Queue authentication type '{0}' undefined or not supported", config.Auth); - throw new ContentStorageException($"Azure Queue authentication type '{config.Auth}' undefined or not supported"); + throw new DocumentStorageException($"Azure Queue authentication type '{config.Auth}' undefined or not supported"); } } @@ -345,7 +345,7 @@ private void ValidateAccountName(string value) if (string.IsNullOrEmpty(value)) { this._log.LogCritical("The Azure Queue account name is empty"); - throw new ContentStorageException("The account name is empty"); + throw new DocumentStorageException("The account name is empty"); } } @@ -354,7 +354,7 @@ private void ValidateAccountKey(string value) if (string.IsNullOrEmpty(value)) { this._log.LogCritical("The Azure Queue account key is empty"); - throw new ContentStorageException("The Azure Queue account key is empty"); + throw new DocumentStorageException("The Azure Queue account key is empty"); } } @@ -363,7 +363,7 @@ private void ValidateConnectionString(string value) if (string.IsNullOrEmpty(value)) { this._log.LogCritical("The Azure Queue connection string is empty"); - throw new ContentStorageException("The Azure Queue connection string is empty"); + throw new DocumentStorageException("The Azure Queue connection string is empty"); } } diff --git a/extensions/Discord/Discord/DiscordConnector.cs b/extensions/Discord/Discord/DiscordConnector.cs index 760e8d992..a3398a7da 100644 --- a/extensions/Discord/Discord/DiscordConnector.cs +++ b/extensions/Discord/Discord/DiscordConnector.cs @@ -25,8 +25,8 @@ public sealed class DiscordConnector : IHostedService, IDisposable, IAsyncDispos private readonly IKernelMemory _memory; private readonly ILogger _log; private readonly string _authToken; - private readonly string _contentStorageIndex; - private readonly string _contentStorageFilename; + private readonly string _docStorageIndex; + private readonly string _docStorageFilename; private readonly List _pipelineSteps; ///

@@ -55,9 +55,9 @@ public DiscordConnector( this._client.Log += this.OnLog; this._client.MessageReceived += this.OnMessage; this._memory = memory; - this._contentStorageIndex = config.Index; + this._docStorageIndex = config.Index; this._pipelineSteps = config.Steps; - this._contentStorageFilename = config.FileName; + this._docStorageFilename = config.FileName; } /// @@ -153,9 +153,9 @@ private Task OnMessage(SocketMessage message) { await this._memory.ImportDocumentAsync( fileContent, - fileName: this._contentStorageFilename, + fileName: this._docStorageFilename, documentId: documentId, - index: this._contentStorageIndex, + index: this._docStorageIndex, steps: this._pipelineSteps).ConfigureAwait(false); } }); diff --git a/extensions/MongoDbAtlas/MongoDbAtlas.FunctionalTests/StorageTests.cs b/extensions/MongoDbAtlas/MongoDbAtlas.FunctionalTests/StorageTests.cs index 7f2c42dbe..d01a4251c 100644 --- a/extensions/MongoDbAtlas/MongoDbAtlas.FunctionalTests/StorageTests.cs +++ b/extensions/MongoDbAtlas/MongoDbAtlas.FunctionalTests/StorageTests.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft. All rights reserved. using System.Text; -using Microsoft.KernelMemory.ContentStorage; +using Microsoft.KernelMemory.DocumentStorage; using Microsoft.KernelMemory.MongoDbAtlas; using Microsoft.KM.TestHelpers; @@ -165,7 +165,7 @@ public async Task CanCleanIndexCorrectly() await this._sut.EmptyDocumentDirectoryAsync(this.IndexName, id); // Assert: check that the files are not there anymore - await Assert.ThrowsAsync(async () => await this._sut.ReadFileAsync(this.IndexName, id, fileName1, false)); - await Assert.ThrowsAsync(async () => await this._sut.ReadFileAsync(this.IndexName, id, fileName2, false)); + await Assert.ThrowsAsync(async () => await this._sut.ReadFileAsync(this.IndexName, id, fileName1, false)); + await Assert.ThrowsAsync(async () => await this._sut.ReadFileAsync(this.IndexName, id, fileName2, false)); } } diff --git a/extensions/MongoDbAtlas/MongoDbAtlas/DependencyInjection.cs b/extensions/MongoDbAtlas/MongoDbAtlas/DependencyInjection.cs index 8cb12f5ea..6092de0e1 100644 --- a/extensions/MongoDbAtlas/MongoDbAtlas/DependencyInjection.cs +++ b/extensions/MongoDbAtlas/MongoDbAtlas/DependencyInjection.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft. All rights reserved. using Microsoft.Extensions.DependencyInjection; -using Microsoft.KernelMemory.ContentStorage; +using Microsoft.KernelMemory.DocumentStorage; using Microsoft.KernelMemory.MemoryStorage; using Microsoft.KernelMemory.MongoDbAtlas; @@ -25,7 +25,7 @@ public static IKernelMemoryBuilder WithMongoDbAtlasMemoryDb( } /// - /// Adds Mongodb as content storage for files. + /// Adds Mongodb as document storage for files. /// /// The kernel builder /// Configuration for Mongodb @@ -33,20 +33,20 @@ public static IKernelMemoryBuilder WithMongoDbAtlasStorage( this IKernelMemoryBuilder builder, MongoDbAtlasConfig config) { - builder.Services.AddMongoDbAtlasAsContentStorage(config); + builder.Services.AddMongoDbAtlasAsDocumentStorage(config); return builder; } /// - /// Adds Mongodb as content storage service and memory service, for both files and memory records. + /// Adds Mongodb as document storage and memory db, for both files and memory records. /// /// The kernel builder /// Configuration for Mongodb - public static IKernelMemoryBuilder WithMongoDbAtlasMemoryDbAndStorage( + public static IKernelMemoryBuilder WithMongoDbAtlasMemoryDbAndDocumentStorage( this IKernelMemoryBuilder builder, MongoDbAtlasConfig config) { - builder.Services.AddMongoDbAtlasAsMemoryDbAndContentStorage(config); + builder.Services.AddMongoDbAtlasAsMemoryDbAndDocumentStorage(config); return builder; } } @@ -75,13 +75,13 @@ public static IServiceCollection AddMongoDbAtlasAsMemoryDb( /// /// The services collection /// Mongodb configuration. - public static IServiceCollection AddMongoDbAtlasAsContentStorage( + public static IServiceCollection AddMongoDbAtlasAsDocumentStorage( this IServiceCollection services, MongoDbAtlasConfig config) { return services .AddSingleton(config) - .AddSingleton(); + .AddSingleton(); } /// @@ -89,13 +89,13 @@ public static IServiceCollection AddMongoDbAtlasAsContentStorage( /// /// The services collection /// Mongodb configuration. - public static IServiceCollection AddMongoDbAtlasAsMemoryDbAndContentStorage( + public static IServiceCollection AddMongoDbAtlasAsMemoryDbAndDocumentStorage( this IServiceCollection services, MongoDbAtlasConfig config) { return services .AddSingleton(config) .AddSingleton() - .AddSingleton(); + .AddSingleton(); } } diff --git a/extensions/MongoDbAtlas/MongoDbAtlas/MongoDbAtlasStorage.cs b/extensions/MongoDbAtlas/MongoDbAtlas/MongoDbAtlasStorage.cs index 3bc3307a1..4979f06a7 100644 --- a/extensions/MongoDbAtlas/MongoDbAtlas/MongoDbAtlasStorage.cs +++ b/extensions/MongoDbAtlas/MongoDbAtlas/MongoDbAtlasStorage.cs @@ -5,7 +5,7 @@ using System.IO; using System.Threading; using System.Threading.Tasks; -using Microsoft.KernelMemory.ContentStorage; +using Microsoft.KernelMemory.DocumentStorage; using Microsoft.KernelMemory.Pipeline; using MongoDB.Bson; using MongoDB.Driver; @@ -14,7 +14,7 @@ namespace Microsoft.KernelMemory.MongoDbAtlas; [Experimental("KMEXP03")] -public sealed class MongoDbAtlasStorage : MongoDbAtlasBaseStorage, IContentStorage +public sealed class MongoDbAtlasStorage : MongoDbAtlasBaseStorage, IDocumentStorage { private readonly IMimeTypeDetection _mimeTypeDetection; @@ -163,7 +163,7 @@ public async Task ReadFileAsync( Console.WriteLine(error); } - throw new ContentStorageFileNotFoundException(error); + throw new DocumentStorageFileNotFoundException(error); } BinaryData docData = new(doc["content"].AsString); @@ -188,7 +188,7 @@ public async Task ReadFileAsync( Console.WriteLine($"File {fileName} not found in index {index} and document {documentId}"); } - throw new ContentStorageFileNotFoundException("File not found"); + throw new DocumentStorageFileNotFoundException("File not found"); } BinaryData docData = new(doc["content"].AsString); @@ -215,7 +215,7 @@ public async Task ReadFileAsync( Console.WriteLine($"File {fileName} not found in index {index} and document {documentId}"); } - throw new ContentStorageFileNotFoundException("File not found"); + throw new DocumentStorageFileNotFoundException("File not found"); } async Task AsyncStreamDelegate() => await bucket.OpenDownloadStreamAsync(file.Id, cancellationToken: cancellationToken).ConfigureAwait(false); diff --git a/extensions/Postgres/Postgres.TestApplication/Program.cs b/extensions/Postgres/Postgres.TestApplication/Program.cs index 252257e8e..d4431238c 100644 --- a/extensions/Postgres/Postgres.TestApplication/Program.cs +++ b/extensions/Postgres/Postgres.TestApplication/Program.cs @@ -1,10 +1,10 @@ // Copyright (c) Microsoft. All rights reserved. using Microsoft.KernelMemory; -using Microsoft.KernelMemory.ContentStorage.DevTools; +using Microsoft.KernelMemory.DocumentStorage.DevTools; using Microsoft.KernelMemory.FileSystem.DevTools; -namespace Postgres.TestApplication; +namespace Microsoft.Postgres.TestApplication; internal static class Program { @@ -31,23 +31,25 @@ private static async Task Test1() var azureOpenAITextConfig = cfg.GetSection("KernelMemory:Services:AzureOpenAIText").Get(); ArgumentNullExceptionEx.ThrowIfNull(azureOpenAITextConfig, nameof(azureOpenAITextConfig), "AzureOpenAIText config not found"); - // Concatenate our 'WithPostgres()' after 'WithOpenAIDefaults()' from the core nuget + // Concatenate our 'WithPostgresMemoryDb()' after 'WithOpenAIDefaults()' from the core nuget var mem1 = new KernelMemoryBuilder() .WithAzureOpenAITextGeneration(azureOpenAITextConfig) .WithAzureOpenAITextEmbeddingGeneration(azureOpenAIEmbeddingConfig) .WithPostgresMemoryDb(postgresConfig) + .WithSimpleFileStorage(SimpleFileStorageConfig.Persistent) .Build(); - // Concatenate our 'WithPostgres()' before 'WithOpenAIDefaults()' from the core nuget + // Concatenate our 'WithPostgresMemoryDb()' before 'WithOpenAIDefaults()' from the core nuget var mem2 = new KernelMemoryBuilder() .WithPostgresMemoryDb(postgresConfig) + .WithSimpleFileStorage(SimpleFileStorageConfig.Persistent) .WithAzureOpenAITextGeneration(azureOpenAITextConfig) .WithAzureOpenAITextEmbeddingGeneration(azureOpenAIEmbeddingConfig) .Build(); - // Concatenate our 'WithPostgres()' before and after KM builder extension methods from the core nuget + // Concatenate our 'WithPostgresMemoryDb()' before and after KM builder extension methods from the core nuget var mem3 = new KernelMemoryBuilder() - .WithSimpleFileStorage() + .WithSimpleFileStorage(SimpleFileStorageConfig.Persistent) .WithAzureOpenAITextGeneration(azureOpenAITextConfig) .WithPostgresMemoryDb(postgresConfig) .WithAzureOpenAITextEmbeddingGeneration(azureOpenAIEmbeddingConfig) diff --git a/extensions/Postgres/Postgres.UnitTests/PostgresConfigTests.cs b/extensions/Postgres/Postgres.UnitTests/PostgresConfigTests.cs index 1b7e34431..1fc35dba5 100644 --- a/extensions/Postgres/Postgres.UnitTests/PostgresConfigTests.cs +++ b/extensions/Postgres/Postgres.UnitTests/PostgresConfigTests.cs @@ -2,7 +2,7 @@ using Microsoft.KernelMemory; -namespace Postgres.UnitTests; +namespace Microsoft.Postgres.UnitTests; public class PostgresConfigTests { diff --git a/extensions/Postgres/README.md b/extensions/Postgres/README.md index 27713781c..0ccaebbc9 100644 --- a/extensions/Postgres/README.md +++ b/extensions/Postgres/README.md @@ -41,7 +41,7 @@ To use Postgres with Kernel Memory: } } ``` -4. Configure KM builder to store memories in Postgres, for example: +4. Configure KM builder to store memories in Postgres, and to persist documents, for example: ```csharp // using Microsoft.KernelMemory; // using Microsoft.KernelMemory.Postgres; @@ -56,7 +56,8 @@ To use Postgres with Kernel Memory: .BindSection("KernelMemory:Services:Postgres", postgresConfig); var memory = new KernelMemoryBuilder() - .WithPostgres(postgresConfig) + .WithPostgresMemoryDb(postgresConfig) + .WithSimpleFileStorage(SimpleFileStorageConfig.Persistent) .WithAzureOpenAITextGeneration(azureOpenAIConfig) .WithAzureOpenAITextEmbeddingGeneration(azureOpenAIConfig) .Build(); diff --git a/extensions/Qdrant/Qdrant.TestApplication/Program.cs b/extensions/Qdrant/Qdrant.TestApplication/Program.cs index ab8dc9286..7b8eae32a 100644 --- a/extensions/Qdrant/Qdrant.TestApplication/Program.cs +++ b/extensions/Qdrant/Qdrant.TestApplication/Program.cs @@ -5,7 +5,7 @@ using Microsoft.KernelMemory.MemoryStorage; using Microsoft.KM.TestHelpers; -namespace Qdrant.TestApplication; +namespace Microsoft.Qdrant.TestApplication; public static class Program { diff --git a/extensions/Redis/Redis.FunctionalTests/AdditionalFilteringTests.cs b/extensions/Redis/Redis.FunctionalTests/AdditionalFilteringTests.cs index 9a7fecf88..4c5396d81 100644 --- a/extensions/Redis/Redis.FunctionalTests/AdditionalFilteringTests.cs +++ b/extensions/Redis/Redis.FunctionalTests/AdditionalFilteringTests.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft. All rights reserved. using Microsoft.KernelMemory; -using Microsoft.KernelMemory.ContentStorage.DevTools; +using Microsoft.KernelMemory.DocumentStorage.DevTools; using Microsoft.KernelMemory.FileSystem.DevTools; using Microsoft.KM.TestHelpers; using Xunit.Abstractions; diff --git a/extensions/Redis/Redis.TestApplication/MockEmbeddingGenerator.cs b/extensions/Redis/Redis.TestApplication/MockEmbeddingGenerator.cs index 766e8982d..b67acc4a2 100644 --- a/extensions/Redis/Redis.TestApplication/MockEmbeddingGenerator.cs +++ b/extensions/Redis/Redis.TestApplication/MockEmbeddingGenerator.cs @@ -3,7 +3,7 @@ using Microsoft.KernelMemory; using Microsoft.KernelMemory.AI; -namespace Redis.TestApplication; +namespace Microsoft.Redis.TestApplication; internal sealed class MockEmbeddingGenerator : ITextEmbeddingGenerator { diff --git a/extensions/Redis/Redis.TestApplication/Program.cs b/extensions/Redis/Redis.TestApplication/Program.cs index 469d267b6..4fb3fb617 100644 --- a/extensions/Redis/Redis.TestApplication/Program.cs +++ b/extensions/Redis/Redis.TestApplication/Program.cs @@ -7,7 +7,7 @@ using Microsoft.KernelMemory.MemoryStorage; using StackExchange.Redis; -namespace Redis.TestApplication; +namespace Microsoft.Redis.TestApplication; public static class Program { diff --git a/extensions/TikToken/TikToken.UnitTests/Startup.cs b/extensions/TikToken/TikToken.UnitTests/Startup.cs index d30e2a5d5..99a1a4f77 100644 --- a/extensions/TikToken/TikToken.UnitTests/Startup.cs +++ b/extensions/TikToken/TikToken.UnitTests/Startup.cs @@ -5,7 +5,7 @@ using Microsoft.Extensions.Hosting; -namespace TikToken.UnitTests; +namespace Microsoft.TikToken.UnitTests; public class Startup { diff --git a/extensions/TikToken/TikToken.UnitTests/TikTokenTokenizersTest.cs b/extensions/TikToken/TikToken.UnitTests/TikTokenTokenizersTest.cs index 095fbc9c6..41c4203db 100644 --- a/extensions/TikToken/TikToken.UnitTests/TikTokenTokenizersTest.cs +++ b/extensions/TikToken/TikToken.UnitTests/TikTokenTokenizersTest.cs @@ -6,7 +6,7 @@ using Xunit; using Xunit.Abstractions; -namespace TikToken.UnitTests; +namespace Microsoft.TikToken.UnitTests; public class TikTokenTokenizers : BaseUnitTestCase { diff --git a/infra/main.bicep b/infra/main.bicep index 8b0f921a2..96059d90a 100644 --- a/infra/main.bicep +++ b/infra/main.bicep @@ -105,7 +105,7 @@ module managedidentity 'modules/managed-identity.bicep' = { Module to create a Storage Account See https://learn.microsoft.com/azure/storage/common/storage-account-overview - The storage account is used to store files (KM Content Storage) and + The storage account is used to store files (KM Document Storage) and to run asynchronous ingestion (KM Pipelines Orchestration). */ module storage 'modules/storage.bicep' = { diff --git a/infra/main.json b/infra/main.json index 29b39e26a..e14f79f09 100644 --- a/infra/main.json +++ b/infra/main.json @@ -1231,7 +1231,7 @@ "value": "true" }, { - "name": "KernelMemory__ContentStorageType", + "name": "KernelMemory__DocumentStorageType", "value": "AzureBlobs" }, { diff --git a/infra/modules/container-app.bicep b/infra/modules/container-app.bicep index 8ea4612a2..015c21053 100644 --- a/infra/modules/container-app.bicep +++ b/infra/modules/container-app.bicep @@ -81,7 +81,7 @@ resource kmService 'Microsoft.App/containerApps@2023-05-01' = { value: 'true' } { - name: 'KernelMemory__ContentStorageType' + name: 'KernelMemory__DocumentStorageType' value: 'AzureBlobs' } { diff --git a/service/Abstractions/ContentStorage/ContentStorageException.cs b/service/Abstractions/ContentStorage/ContentStorageException.cs deleted file mode 100644 index 87ee5085d..000000000 --- a/service/Abstractions/ContentStorage/ContentStorageException.cs +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -using System; - -namespace Microsoft.KernelMemory.ContentStorage; - -public class ContentStorageException : KernelMemoryException -{ - /// - public ContentStorageException() { } - - /// - public ContentStorageException(string message) : base(message) { } - - /// - public ContentStorageException(string message, Exception? innerException) : base(message, innerException) { } -} - -public class ContentStorageFileNotFoundException : ContentStorageException -{ - /// - public ContentStorageFileNotFoundException() { } - - /// - public ContentStorageFileNotFoundException(string message) : base(message) { } - - /// - public ContentStorageFileNotFoundException(string message, Exception? innerException) : base(message, innerException) { } -} diff --git a/service/Abstractions/DocumentStorage/DocumentStorageException.cs b/service/Abstractions/DocumentStorage/DocumentStorageException.cs new file mode 100644 index 000000000..144e60d37 --- /dev/null +++ b/service/Abstractions/DocumentStorage/DocumentStorageException.cs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System; + +namespace Microsoft.KernelMemory.DocumentStorage; + +public class DocumentStorageException : KernelMemoryException +{ + /// + public DocumentStorageException() { } + + /// + public DocumentStorageException(string message) : base(message) { } + + /// + public DocumentStorageException(string message, Exception? innerException) : base(message, innerException) { } +} + +public class DocumentStorageFileNotFoundException : DocumentStorageException +{ + /// + public DocumentStorageFileNotFoundException() { } + + /// + public DocumentStorageFileNotFoundException(string message) : base(message) { } + + /// + public DocumentStorageFileNotFoundException(string message, Exception? innerException) : base(message, innerException) { } +} diff --git a/service/Abstractions/ContentStorage/EmbeddingFileContent.cs b/service/Abstractions/DocumentStorage/EmbeddingFileContent.cs similarity index 95% rename from service/Abstractions/ContentStorage/EmbeddingFileContent.cs rename to service/Abstractions/DocumentStorage/EmbeddingFileContent.cs index 8fba9d1de..90c6af075 100644 --- a/service/Abstractions/ContentStorage/EmbeddingFileContent.cs +++ b/service/Abstractions/DocumentStorage/EmbeddingFileContent.cs @@ -3,7 +3,7 @@ using System; using System.Text.Json.Serialization; -namespace Microsoft.KernelMemory.ContentStorage; +namespace Microsoft.KernelMemory.DocumentStorage; public class EmbeddingFileContent { diff --git a/service/Abstractions/ContentStorage/IContentStorage.cs b/service/Abstractions/DocumentStorage/IDocumentStorage.cs similarity index 97% rename from service/Abstractions/ContentStorage/IContentStorage.cs rename to service/Abstractions/DocumentStorage/IDocumentStorage.cs index ab93b0d0d..7add23129 100644 --- a/service/Abstractions/ContentStorage/IContentStorage.cs +++ b/service/Abstractions/DocumentStorage/IDocumentStorage.cs @@ -4,9 +4,9 @@ using System.Threading; using System.Threading.Tasks; -namespace Microsoft.KernelMemory.ContentStorage; +namespace Microsoft.KernelMemory.DocumentStorage; -public interface IContentStorage +public interface IDocumentStorage { /// /// Create a new container (aka index), if it doesn't exist already diff --git a/service/Abstractions/IKernelMemory.cs b/service/Abstractions/IKernelMemory.cs index bf7bed55d..00ce78632 100644 --- a/service/Abstractions/IKernelMemory.cs +++ b/service/Abstractions/IKernelMemory.cs @@ -161,7 +161,7 @@ public Task IsDocumentReadyAsync( CancellationToken cancellationToken = default); /// - /// Export a file from content storage + /// Export a file from document storage /// /// ID of the document containing the file /// File name diff --git a/service/Abstractions/KernelMemoryBuilderExtensions.cs b/service/Abstractions/KernelMemoryBuilderExtensions.cs index 4e7184aab..be2881582 100644 --- a/service/Abstractions/KernelMemoryBuilderExtensions.cs +++ b/service/Abstractions/KernelMemoryBuilderExtensions.cs @@ -3,8 +3,8 @@ using System; using Microsoft.KernelMemory.AI; using Microsoft.KernelMemory.Configuration; -using Microsoft.KernelMemory.ContentStorage; using Microsoft.KernelMemory.DataFormats; +using Microsoft.KernelMemory.DocumentStorage; using Microsoft.KernelMemory.MemoryStorage; using Microsoft.KernelMemory.Pipeline; using Microsoft.KernelMemory.Pipeline.Queue; @@ -86,18 +86,18 @@ public static IKernelMemoryBuilder WithCustomIngestionQueueClientFactory( return builder; } - public static IKernelMemoryBuilder WithCustomStorage( - this IKernelMemoryBuilder builder, IContentStorage service) + public static IKernelMemoryBuilder WithCustomDocumentStorage( + this IKernelMemoryBuilder builder, IDocumentStorage service) { - service = service ?? throw new ConfigurationException("Memory Builder: the content storage instance is NULL"); - builder.AddSingleton(service); + service = service ?? throw new ConfigurationException("Memory Builder: the document storage instance is NULL"); + builder.AddSingleton(service); return builder; } - public static IKernelMemoryBuilder WithCustomStorage( - this IKernelMemoryBuilder builder) where T : class, IContentStorage + public static IKernelMemoryBuilder WithCustomDocumentStorage( + this IKernelMemoryBuilder builder) where T : class, IDocumentStorage { - builder.AddSingleton(); + builder.AddSingleton(); return builder; } diff --git a/service/Abstractions/Pipeline/IPipelineOrchestrator.cs b/service/Abstractions/Pipeline/IPipelineOrchestrator.cs index 52ff6d8a3..7d57b97d9 100644 --- a/service/Abstractions/Pipeline/IPipelineOrchestrator.cs +++ b/service/Abstractions/Pipeline/IPipelineOrchestrator.cs @@ -92,7 +92,7 @@ public interface IPipelineOrchestrator Task StopAllPipelinesAsync(); /// - /// Fetch a file from content storage, streaming its content and details + /// Fetch a file from document storage, streaming its content and details /// /// Pipeline containing the file /// Name of the file to fetch @@ -101,7 +101,7 @@ public interface IPipelineOrchestrator Task ReadFileAsStreamAsync(DataPipeline pipeline, string fileName, CancellationToken cancellationToken = default); /// - /// Fetch a file from content storage + /// Fetch a file from document storage /// /// Pipeline containing the file /// Name of the file to fetch @@ -109,7 +109,7 @@ public interface IPipelineOrchestrator Task ReadFileAsync(DataPipeline pipeline, string fileName, CancellationToken cancellationToken = default); /// - /// Fetch a file from content storage + /// Fetch a file from document storage /// /// Pipeline containing the file /// Name of the file to fetch @@ -117,7 +117,7 @@ public interface IPipelineOrchestrator Task ReadTextFileAsync(DataPipeline pipeline, string fileName, CancellationToken cancellationToken = default); /// - /// Write a text file from content storage + /// Write a text file from document storage /// /// Pipeline containing the file /// Name of the file to fetch @@ -126,7 +126,7 @@ public interface IPipelineOrchestrator Task WriteTextFileAsync(DataPipeline pipeline, string fileName, string fileContent, CancellationToken cancellationToken = default); /// - /// Write a file from content storage + /// Write a file from document storage /// /// Pipeline containing the file /// Name of the file to fetch @@ -172,7 +172,7 @@ public interface IPipelineOrchestrator /// /// Start an asynchronous job, via handlers, to delete a specified index - /// from vector and content storage. This might be a long running + /// from vector and document storage. This might be a long running /// operation, hence the use of queue/handlers. /// /// Optional index name diff --git a/service/Core/Configuration/KernelMemoryConfig.cs b/service/Core/Configuration/KernelMemoryConfig.cs index a1373e075..f1b5b62e4 100644 --- a/service/Core/Configuration/KernelMemoryConfig.cs +++ b/service/Core/Configuration/KernelMemoryConfig.cs @@ -1,5 +1,6 @@ // Copyright (c) Microsoft. All rights reserved. +using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.Configuration; @@ -122,10 +123,33 @@ public class RetrievalConfig /// public ServiceConfig Service { get; set; } = new(); + /// + /// Legacy Documents storage settings. + /// + [Obsolete("`ContentStorageType` has been deprecated, please use `DocumentStorageType`")] + + public string ContentStorageType + { + get + { + return this._contentStorageType; + } + set + { + this._contentStorageType = value; + if (!string.IsNullOrEmpty(this._contentStorageType)) + { + throw new ConfigurationException($"`ContentStorageType` (value: {this._contentStorageType}) has been deprecated, please use `DocumentStorageType`"); + } + } + } + + private string _contentStorageType = string.Empty; + /// /// Documents storage settings. /// - public string ContentStorageType { get; set; } = string.Empty; + public string DocumentStorageType { get; set; } = string.Empty; /// /// The text generator used to generate synthetic data during ingestion diff --git a/service/Core/ContentStorage/DevTools/DependencyInjection.cs b/service/Core/DocumentStorage/DevTools/DependencyInjection.cs similarity index 56% rename from service/Core/ContentStorage/DevTools/DependencyInjection.cs rename to service/Core/DocumentStorage/DevTools/DependencyInjection.cs index f80c6d87e..61052e5d2 100644 --- a/service/Core/ContentStorage/DevTools/DependencyInjection.cs +++ b/service/Core/DocumentStorage/DevTools/DependencyInjection.cs @@ -1,8 +1,8 @@ // Copyright (c) Microsoft. All rights reserved. using Microsoft.Extensions.DependencyInjection; -using Microsoft.KernelMemory.ContentStorage; -using Microsoft.KernelMemory.ContentStorage.DevTools; +using Microsoft.KernelMemory.DocumentStorage; +using Microsoft.KernelMemory.DocumentStorage.DevTools; using Microsoft.KernelMemory.FileSystem.DevTools; // ReSharper disable once CheckNamespace @@ -12,29 +12,29 @@ public static partial class KernelMemoryBuilderExtensions { public static IKernelMemoryBuilder WithSimpleFileStorage(this IKernelMemoryBuilder builder, SimpleFileStorageConfig? config = null) { - builder.Services.AddSimpleFileStorageAsContentStorage(config ?? new SimpleFileStorageConfig()); + builder.Services.AddSimpleFileStorageAsDocumentStorage(config ?? new SimpleFileStorageConfig()); return builder; } public static IKernelMemoryBuilder WithSimpleFileStorage(this IKernelMemoryBuilder builder, string directory) { - builder.Services.AddSimpleFileStorageAsContentStorage(directory); + builder.Services.AddSimpleFileStorageAsDocumentStorage(directory); return builder; } } public static partial class DependencyInjection { - public static IServiceCollection AddSimpleFileStorageAsContentStorage(this IServiceCollection services, SimpleFileStorageConfig config) + public static IServiceCollection AddSimpleFileStorageAsDocumentStorage(this IServiceCollection services, SimpleFileStorageConfig config) { return services .AddSingleton(config) - .AddSingleton(); + .AddSingleton(); } - public static IServiceCollection AddSimpleFileStorageAsContentStorage(this IServiceCollection services, string directory) + public static IServiceCollection AddSimpleFileStorageAsDocumentStorage(this IServiceCollection services, string directory) { var config = new SimpleFileStorageConfig { StorageType = FileSystemTypes.Disk, Directory = directory }; - return services.AddSimpleFileStorageAsContentStorage(config); + return services.AddSimpleFileStorageAsDocumentStorage(config); } } diff --git a/service/Core/ContentStorage/DevTools/SimpleFileStorage.cs b/service/Core/DocumentStorage/DevTools/SimpleFileStorage.cs similarity index 95% rename from service/Core/ContentStorage/DevTools/SimpleFileStorage.cs rename to service/Core/DocumentStorage/DevTools/SimpleFileStorage.cs index 96983f419..de91dc1b1 100644 --- a/service/Core/ContentStorage/DevTools/SimpleFileStorage.cs +++ b/service/Core/DocumentStorage/DevTools/SimpleFileStorage.cs @@ -10,10 +10,10 @@ using Microsoft.KernelMemory.FileSystem.DevTools; using Microsoft.KernelMemory.Pipeline; -namespace Microsoft.KernelMemory.ContentStorage.DevTools; +namespace Microsoft.KernelMemory.DocumentStorage.DevTools; [Experimental("KMEXP03")] -public class SimpleFileStorage : IContentStorage +public class SimpleFileStorage : IDocumentStorage { private readonly ILogger _log; private readonly IFileSystem _fileSystem; @@ -120,7 +120,7 @@ public async Task ReadFileAsync( this._log.LogError("File not found {0}/{1}/{2}", index, documentId, fileName); } - throw new ContentStorageFileNotFoundException("File not found"); + throw new DocumentStorageFileNotFoundException("File not found"); } } } diff --git a/service/Core/ContentStorage/DevTools/SimpleFileStorageConfig.cs b/service/Core/DocumentStorage/DevTools/SimpleFileStorageConfig.cs similarity index 91% rename from service/Core/ContentStorage/DevTools/SimpleFileStorageConfig.cs rename to service/Core/DocumentStorage/DevTools/SimpleFileStorageConfig.cs index 5c623c015..f20dc10f0 100644 --- a/service/Core/ContentStorage/DevTools/SimpleFileStorageConfig.cs +++ b/service/Core/DocumentStorage/DevTools/SimpleFileStorageConfig.cs @@ -2,7 +2,7 @@ using Microsoft.KernelMemory.FileSystem.DevTools; -namespace Microsoft.KernelMemory.ContentStorage.DevTools; +namespace Microsoft.KernelMemory.DocumentStorage.DevTools; public class SimpleFileStorageConfig { diff --git a/service/Core/Handlers/DeleteDocumentHandler.cs b/service/Core/Handlers/DeleteDocumentHandler.cs index cb075bba8..f7c848a7f 100644 --- a/service/Core/Handlers/DeleteDocumentHandler.cs +++ b/service/Core/Handlers/DeleteDocumentHandler.cs @@ -4,8 +4,8 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using Microsoft.KernelMemory.ContentStorage; using Microsoft.KernelMemory.Diagnostics; +using Microsoft.KernelMemory.DocumentStorage; using Microsoft.KernelMemory.MemoryStorage; using Microsoft.KernelMemory.Pipeline; @@ -14,19 +14,19 @@ namespace Microsoft.KernelMemory.Handlers; public sealed class DeleteDocumentHandler : IPipelineStepHandler { private readonly List _memoryDbs; - private readonly IContentStorage _contentStorage; + private readonly IDocumentStorage _documentStorage; private readonly ILogger _log; public string StepName { get; } public DeleteDocumentHandler( string stepName, - IContentStorage contentStorage, + IDocumentStorage documentStorage, List memoryDbs, ILogger? log = null) { this.StepName = stepName; - this._contentStorage = contentStorage; + this._documentStorage = documentStorage; this._memoryDbs = memoryDbs; this._log = log ?? DefaultLogger.Instance; @@ -55,7 +55,7 @@ public DeleteDocumentHandler( } // Delete files, leaving the status file - await this._contentStorage.EmptyDocumentDirectoryAsync( + await this._documentStorage.EmptyDocumentDirectoryAsync( index: pipeline.Index, documentId: pipeline.DocumentId, cancellationToken).ConfigureAwait(false); diff --git a/service/Core/Handlers/DeleteGeneratedFilesHandler.cs b/service/Core/Handlers/DeleteGeneratedFilesHandler.cs index 37f9e003c..b888376e0 100644 --- a/service/Core/Handlers/DeleteGeneratedFilesHandler.cs +++ b/service/Core/Handlers/DeleteGeneratedFilesHandler.cs @@ -3,26 +3,26 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using Microsoft.KernelMemory.ContentStorage; using Microsoft.KernelMemory.Diagnostics; +using Microsoft.KernelMemory.DocumentStorage; using Microsoft.KernelMemory.Pipeline; namespace Microsoft.KernelMemory.Handlers; public sealed class DeleteGeneratedFilesHandler : IPipelineStepHandler { - private readonly IContentStorage _contentStorage; + private readonly IDocumentStorage _documentStorage; private readonly ILogger _log; public string StepName { get; } public DeleteGeneratedFilesHandler( string stepName, - IContentStorage contentStorage, + IDocumentStorage documentStorage, ILogger? log = null) { this.StepName = stepName; - this._contentStorage = contentStorage; + this._documentStorage = documentStorage; this._log = log ?? DefaultLogger.Instance; this._log.LogInformation("Handler '{0}' ready", stepName); @@ -35,7 +35,7 @@ public DeleteGeneratedFilesHandler( this._log.LogDebug("Deleting generated files, pipeline '{0}/{1}'", pipeline.Index, pipeline.DocumentId); // Delete files, leaving the status file - await this._contentStorage.EmptyDocumentDirectoryAsync( + await this._documentStorage.EmptyDocumentDirectoryAsync( index: pipeline.Index, documentId: pipeline.DocumentId, cancellationToken).ConfigureAwait(false); diff --git a/service/Core/Handlers/DeleteIndexHandler.cs b/service/Core/Handlers/DeleteIndexHandler.cs index f47279bee..2b539bd0a 100644 --- a/service/Core/Handlers/DeleteIndexHandler.cs +++ b/service/Core/Handlers/DeleteIndexHandler.cs @@ -4,8 +4,8 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using Microsoft.KernelMemory.ContentStorage; using Microsoft.KernelMemory.Diagnostics; +using Microsoft.KernelMemory.DocumentStorage; using Microsoft.KernelMemory.MemoryStorage; using Microsoft.KernelMemory.Pipeline; @@ -14,19 +14,19 @@ namespace Microsoft.KernelMemory.Handlers; public sealed class DeleteIndexHandler : IPipelineStepHandler { private readonly List _memoryDbs; - private readonly IContentStorage _contentStorage; + private readonly IDocumentStorage _documentStorage; private readonly ILogger _log; public string StepName { get; } public DeleteIndexHandler( string stepName, - IContentStorage contentStorage, + IDocumentStorage documentStorage, List memoryDbs, ILogger? log = null) { this.StepName = stepName; - this._contentStorage = contentStorage; + this._documentStorage = documentStorage; this._memoryDbs = memoryDbs; this._log = log ?? DefaultLogger.Instance; @@ -46,7 +46,7 @@ public DeleteIndexHandler( } // Delete index from file storage - await this._contentStorage.DeleteIndexDirectoryAsync( + await this._documentStorage.DeleteIndexDirectoryAsync( index: pipeline.Index, cancellationToken).ConfigureAwait(false); diff --git a/service/Core/Handlers/GenerateEmbeddingsHandler.cs b/service/Core/Handlers/GenerateEmbeddingsHandler.cs index ddf3492c4..e73e870f8 100644 --- a/service/Core/Handlers/GenerateEmbeddingsHandler.cs +++ b/service/Core/Handlers/GenerateEmbeddingsHandler.cs @@ -8,14 +8,14 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.KernelMemory.AI; -using Microsoft.KernelMemory.ContentStorage; using Microsoft.KernelMemory.Diagnostics; +using Microsoft.KernelMemory.DocumentStorage; using Microsoft.KernelMemory.Pipeline; namespace Microsoft.KernelMemory.Handlers; /// -/// Memory ingestion pipeline handler responsible for generating text embedding and saving them to the content storage. +/// Memory ingestion pipeline handler responsible for generating text embedding and saving them to the document storage. /// public sealed class GenerateEmbeddingsHandler : IPipelineStepHandler { @@ -28,7 +28,7 @@ public sealed class GenerateEmbeddingsHandler : IPipelineStepHandler public string StepName { get; } /// - /// Handler responsible for generating embeddings and saving them to content storages (not memory db). + /// Handler responsible for generating embeddings and saving them to document storages (not memory db). /// Note: stepName and other params are injected with DI /// /// Pipeline step for which the handler will be invoked diff --git a/service/Core/Handlers/GenerateEmbeddingsParallelHandler.cs b/service/Core/Handlers/GenerateEmbeddingsParallelHandler.cs index 10254639b..567de42ce 100644 --- a/service/Core/Handlers/GenerateEmbeddingsParallelHandler.cs +++ b/service/Core/Handlers/GenerateEmbeddingsParallelHandler.cs @@ -8,14 +8,14 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.KernelMemory.AI; -using Microsoft.KernelMemory.ContentStorage; using Microsoft.KernelMemory.Diagnostics; +using Microsoft.KernelMemory.DocumentStorage; using Microsoft.KernelMemory.Pipeline; namespace Microsoft.KernelMemory.Handlers; /// -/// Memory ingestion pipeline handler responsible for generating text embedding and saving them to the content storage. +/// Memory ingestion pipeline handler responsible for generating text embedding and saving them to the document storage. /// public sealed class GenerateEmbeddingsParallelHandler : IPipelineStepHandler { @@ -28,7 +28,7 @@ public sealed class GenerateEmbeddingsParallelHandler : IPipelineStepHandler public string StepName { get; } /// - /// Handler responsible for generating embeddings and saving them to content storages (not memory db). + /// Handler responsible for generating embeddings and saving them to document storage (not memory db). /// Note: stepName and other params are injected with DI /// /// Pipeline step for which the handler will be invoked diff --git a/service/Core/Handlers/SaveRecordsHandler.cs b/service/Core/Handlers/SaveRecordsHandler.cs index 42921f81f..0f8cfa904 100644 --- a/service/Core/Handlers/SaveRecordsHandler.cs +++ b/service/Core/Handlers/SaveRecordsHandler.cs @@ -7,8 +7,8 @@ using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; -using Microsoft.KernelMemory.ContentStorage; using Microsoft.KernelMemory.Diagnostics; +using Microsoft.KernelMemory.DocumentStorage; using Microsoft.KernelMemory.FileSystem.DevTools; using Microsoft.KernelMemory.MemoryStorage; using Microsoft.KernelMemory.Pipeline; diff --git a/service/Core/Handlers/TextExtractionHandler.cs b/service/Core/Handlers/TextExtractionHandler.cs index e1639f43c..065ec74fc 100644 --- a/service/Core/Handlers/TextExtractionHandler.cs +++ b/service/Core/Handlers/TextExtractionHandler.cs @@ -16,7 +16,7 @@ namespace Microsoft.KernelMemory.Handlers; /// -/// Memory ingestion pipeline handler responsible for extracting text from files and saving it to content storage. +/// Memory ingestion pipeline handler responsible for extracting text from files and saving it to document storage. /// public sealed class TextExtractionHandler : IPipelineStepHandler, IDisposable { diff --git a/service/Core/KernelMemoryBuilder.cs b/service/Core/KernelMemoryBuilder.cs index 2b6dc151d..71eef0898 100644 --- a/service/Core/KernelMemoryBuilder.cs +++ b/service/Core/KernelMemoryBuilder.cs @@ -5,8 +5,8 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.KernelMemory.AI; using Microsoft.KernelMemory.AppBuilders; -using Microsoft.KernelMemory.ContentStorage; -using Microsoft.KernelMemory.ContentStorage.DevTools; +using Microsoft.KernelMemory.DocumentStorage; +using Microsoft.KernelMemory.DocumentStorage.DevTools; using Microsoft.KernelMemory.FileSystem.DevTools; using Microsoft.KernelMemory.MemoryStorage; using Microsoft.KernelMemory.MemoryStorage.DevTools; @@ -349,19 +349,19 @@ private bool IsEmbeddingGeneratorEnabled() private ClientTypes GetBuildType() { var hasQueueFactory = (this._memoryServiceCollection.HasService()); - var hasContentStorage = (this._memoryServiceCollection.HasService()); + var hasDocumentStorage = (this._memoryServiceCollection.HasService()); var hasMimeDetector = (this._memoryServiceCollection.HasService()); var hasEmbeddingGenerator = (this._memoryServiceCollection.HasService()); var hasMemoryDb = (this._memoryServiceCollection.HasService()); var hasTextGenerator = (this._memoryServiceCollection.HasService()); - if (hasContentStorage && hasMimeDetector && hasEmbeddingGenerator && hasMemoryDb && hasTextGenerator) + if (hasDocumentStorage && hasMimeDetector && hasEmbeddingGenerator && hasMemoryDb && hasTextGenerator) { return hasQueueFactory ? ClientTypes.AsyncService : ClientTypes.SyncServerless; } var missing = new List(); - if (!hasContentStorage) { missing.Add("Content storage"); } + if (!hasDocumentStorage) { missing.Add("Document storage"); } if (!hasMimeDetector) { missing.Add("MIME type detection"); } diff --git a/service/Core/Pipeline/BaseOrchestrator.cs b/service/Core/Pipeline/BaseOrchestrator.cs index 1de025024..6b67f96e1 100644 --- a/service/Core/Pipeline/BaseOrchestrator.cs +++ b/service/Core/Pipeline/BaseOrchestrator.cs @@ -9,8 +9,8 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.KernelMemory.AI; -using Microsoft.KernelMemory.ContentStorage; using Microsoft.KernelMemory.Diagnostics; +using Microsoft.KernelMemory.DocumentStorage; using Microsoft.KernelMemory.FileSystem.DevTools; using Microsoft.KernelMemory.MemoryStorage; using Microsoft.KernelMemory.Models; @@ -27,7 +27,7 @@ public abstract class BaseOrchestrator : IPipelineOrchestrator, IDisposable private readonly List _embeddingGenerators; private readonly ITextGenerator _textGenerator; private readonly List _defaultIngestionSteps; - private readonly IContentStorage _contentStorage; + private readonly IDocumentStorage _documentStorage; private readonly IMimeTypeDetection _mimeTypeDetection; private readonly string? _defaultIndexName; @@ -35,7 +35,7 @@ public abstract class BaseOrchestrator : IPipelineOrchestrator, IDisposable protected CancellationTokenSource CancellationTokenSource { get; private set; } protected BaseOrchestrator( - IContentStorage contentStorage, + IDocumentStorage documentStorage, List embeddingGenerators, List memoryDbs, ITextGenerator textGenerator, @@ -48,7 +48,7 @@ protected BaseOrchestrator( this.Log = log ?? DefaultLogger.Instance; this._defaultIngestionSteps = config.DataIngestion.GetDefaultStepsOrDefaults(); this.EmbeddingGenerationEnabled = config.DataIngestion.EmbeddingGenerationEnabled; - this._contentStorage = contentStorage; + this._documentStorage = documentStorage; this._embeddingGenerators = embeddingGenerators; this._memoryDbs = memoryDbs; this._textGenerator = textGenerator; @@ -153,7 +153,7 @@ public DataPipeline PrepareNewDocumentUpload( try { - using StreamableFileContent? streamableContent = await this._contentStorage.ReadFileAsync(index, documentId, Constants.PipelineStatusFilename, false, cancellationToken) + using StreamableFileContent? streamableContent = await this._documentStorage.ReadFileAsync(index, documentId, Constants.PipelineStatusFilename, false, cancellationToken) .ConfigureAwait(false); if (streamableContent == null) @@ -178,7 +178,7 @@ public DataPipeline PrepareNewDocumentUpload( return result; } - catch (ContentStorageFileNotFoundException) + catch (DocumentStorageFileNotFoundException) { throw new PipelineNotFoundException("Pipeline/Document not found"); } @@ -226,7 +226,7 @@ public Task StopAllPipelinesAsync() public async Task ReadFileAsStreamAsync(DataPipeline pipeline, string fileName, CancellationToken cancellationToken = default) { pipeline.Index = IndexName.CleanName(pipeline.Index, this._defaultIndexName); - return await this._contentStorage.ReadFileAsync(pipeline.Index, pipeline.DocumentId, fileName, true, cancellationToken) + return await this._documentStorage.ReadFileAsync(pipeline.Index, pipeline.DocumentId, fileName, true, cancellationToken) .ConfigureAwait(false); } @@ -256,7 +256,7 @@ public Task WriteTextFileAsync(DataPipeline pipeline, string fileName, string fi public Task WriteFileAsync(DataPipeline pipeline, string fileName, BinaryData fileContent, CancellationToken cancellationToken = default) { pipeline.Index = IndexName.CleanName(pipeline.Index, this._defaultIndexName); - return this._contentStorage.WriteFileAsync(pipeline.Index, pipeline.DocumentId, fileName, fileContent.ToStream(), cancellationToken); + return this._documentStorage.WriteFileAsync(pipeline.Index, pipeline.DocumentId, fileName, fileContent.ToStream(), cancellationToken); } /// @@ -315,7 +315,7 @@ protected async Task CleanUpAfterCompletionAsync(DataPipeline pipeline, Cancella { try { - await this._contentStorage.DeleteDocumentDirectoryAsync(index: pipeline.Index, documentId: pipeline.DocumentId, cancellationToken).ConfigureAwait(false); + await this._documentStorage.DeleteDocumentDirectoryAsync(index: pipeline.Index, documentId: pipeline.DocumentId, cancellationToken).ConfigureAwait(false); } catch (Exception e) { @@ -327,7 +327,7 @@ protected async Task CleanUpAfterCompletionAsync(DataPipeline pipeline, Cancella { try { - await this._contentStorage.DeleteIndexDirectoryAsync(pipeline.Index, cancellationToken).ConfigureAwait(false); + await this._documentStorage.DeleteIndexDirectoryAsync(pipeline.Index, cancellationToken).ConfigureAwait(false); } catch (Exception e) { @@ -423,7 +423,7 @@ protected async Task UpdatePipelineStatusAsync(DataPipeline pipeline, Cancellati this.Log.LogDebug("Saving pipeline status to '{0}/{1}/{2}'", pipeline.Index, pipeline.DocumentId, Constants.PipelineStatusFilename); try { - await this._contentStorage.WriteFileAsync( + await this._documentStorage.WriteFileAsync( pipeline.Index, pipeline.DocumentId, Constants.PipelineStatusFilename, @@ -447,8 +447,8 @@ private async Task UploadFormFilesAsync(DataPipeline pipeline, CancellationToken { this.Log.LogDebug("Uploading {0} files, pipeline '{1}/{2}'", pipeline.FilesToUpload.Count, pipeline.Index, pipeline.DocumentId); - await this._contentStorage.CreateIndexDirectoryAsync(pipeline.Index, cancellationToken).ConfigureAwait(false); - await this._contentStorage.CreateDocumentDirectoryAsync(pipeline.Index, pipeline.DocumentId, cancellationToken).ConfigureAwait(false); + await this._documentStorage.CreateIndexDirectoryAsync(pipeline.Index, cancellationToken).ConfigureAwait(false); + await this._documentStorage.CreateDocumentDirectoryAsync(pipeline.Index, pipeline.DocumentId, cancellationToken).ConfigureAwait(false); foreach (DocumentUploadRequest.UploadedFile file in pipeline.FilesToUpload) { @@ -462,7 +462,7 @@ private async Task UploadFormFilesAsync(DataPipeline pipeline, CancellationToken var fileSize = file.FileContent.Length; this.Log.LogDebug("Uploading file '{0}', size {1} bytes", file.FileName, fileSize); - await this._contentStorage.WriteFileAsync(pipeline.Index, pipeline.DocumentId, file.FileName, file.FileContent, cancellationToken).ConfigureAwait(false); + await this._documentStorage.WriteFileAsync(pipeline.Index, pipeline.DocumentId, file.FileName, file.FileContent, cancellationToken).ConfigureAwait(false); string mimeType = string.Empty; try diff --git a/service/Core/Pipeline/DistributedPipelineOrchestrator.cs b/service/Core/Pipeline/DistributedPipelineOrchestrator.cs index a36607530..b569c11b4 100644 --- a/service/Core/Pipeline/DistributedPipelineOrchestrator.cs +++ b/service/Core/Pipeline/DistributedPipelineOrchestrator.cs @@ -9,7 +9,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.KernelMemory.AI; -using Microsoft.KernelMemory.ContentStorage; +using Microsoft.KernelMemory.DocumentStorage; using Microsoft.KernelMemory.MemoryStorage; using Microsoft.KernelMemory.Pipeline.Queue; @@ -36,7 +36,7 @@ public sealed class DistributedPipelineOrchestrator : BaseOrchestrator /// Create a new instance of the asynchronous orchestrator /// /// Queue client factory - /// Service used to store files + /// Service used to store files /// Services used to generate embeddings during the ingestion /// Services where to store memory records /// Service used to generate text, e.g. synthetic memory records @@ -45,14 +45,14 @@ public sealed class DistributedPipelineOrchestrator : BaseOrchestrator /// public DistributedPipelineOrchestrator( QueueClientFactory queueClientFactory, - IContentStorage contentStorage, + IDocumentStorage documentStorage, List embeddingGenerators, List memoryDbs, ITextGenerator textGenerator, IMimeTypeDetection? mimeTypeDetection = null, KernelMemoryConfig? config = null, ILogger? log = null) - : base(contentStorage, embeddingGenerators, memoryDbs, textGenerator, mimeTypeDetection, config, log) + : base(documentStorage, embeddingGenerators, memoryDbs, textGenerator, mimeTypeDetection, config, log) { this._queueClientFactory = queueClientFactory; } diff --git a/service/Core/Pipeline/InProcessPipelineOrchestrator.cs b/service/Core/Pipeline/InProcessPipelineOrchestrator.cs index 5d88d42b3..ff2e8941f 100644 --- a/service/Core/Pipeline/InProcessPipelineOrchestrator.cs +++ b/service/Core/Pipeline/InProcessPipelineOrchestrator.cs @@ -10,7 +10,7 @@ using Microsoft.Extensions.Logging; using Microsoft.KernelMemory.AI; using Microsoft.KernelMemory.Configuration; -using Microsoft.KernelMemory.ContentStorage; +using Microsoft.KernelMemory.DocumentStorage; using Microsoft.KernelMemory.Handlers; using Microsoft.KernelMemory.MemoryStorage; @@ -26,7 +26,7 @@ public sealed class InProcessPipelineOrchestrator : BaseOrchestrator /// /// Create a new instance of the synchronous orchestrator. /// - /// Service used to store files + /// Service used to store files /// Services used to generate embeddings during the ingestion /// Services where to store memory records /// Service used to generate text, e.g. synthetic memory records @@ -35,7 +35,7 @@ public sealed class InProcessPipelineOrchestrator : BaseOrchestrator /// Global KM configuration /// Application logger public InProcessPipelineOrchestrator( - IContentStorage contentStorage, + IDocumentStorage documentStorage, List embeddingGenerators, List memoryDbs, ITextGenerator textGenerator, @@ -43,7 +43,7 @@ public InProcessPipelineOrchestrator( IServiceProvider? serviceProvider = null, KernelMemoryConfig? config = null, ILogger? log = null) - : base(contentStorage, embeddingGenerators, memoryDbs, textGenerator, mimeTypeDetection, config, log) + : base(documentStorage, embeddingGenerators, memoryDbs, textGenerator, mimeTypeDetection, config, log) { this._serviceProvider = serviceProvider; } diff --git a/service/Service.AspNetCore/WebAPIEndpoints.cs b/service/Service.AspNetCore/WebAPIEndpoints.cs index bbe86a395..0e7b44221 100644 --- a/service/Service.AspNetCore/WebAPIEndpoints.cs +++ b/service/Service.AspNetCore/WebAPIEndpoints.cs @@ -13,10 +13,10 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Logging; -using Microsoft.KernelMemory.ContentStorage; using Microsoft.KernelMemory.Service.AspNetCore.Models; using System.IO; using Microsoft.AspNetCore.Http.HttpResults; +using Microsoft.KernelMemory.DocumentStorage; namespace Microsoft.KernelMemory.Service.AspNetCore; @@ -367,7 +367,7 @@ public static void AddGetDownloadEndpoint(this IEndpointRouteBuilder builder, st return response; } - catch (ContentStorageFileNotFoundException e) + catch (DocumentStorageFileNotFoundException e) { return Results.Problem(title: "File not found", detail: e.Message, statusCode: 404); } diff --git a/service/Service/Program.cs b/service/Service/Program.cs index ea1b06e9a..1944e64a0 100644 --- a/service/Service/Program.cs +++ b/service/Service/Program.cs @@ -5,17 +5,17 @@ using System.Linq; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.KernelMemory.AI; using Microsoft.KernelMemory.Configuration; -using Microsoft.KernelMemory.ContentStorage; using Microsoft.KernelMemory.Diagnostics; +using Microsoft.KernelMemory.DocumentStorage; using Microsoft.KernelMemory.MemoryStorage; -using Microsoft.KernelMemory.Service.AspNetCore; using Microsoft.KernelMemory.Pipeline; -using Microsoft.AspNetCore.Mvc; +using Microsoft.KernelMemory.Service.AspNetCore; // KM Configuration: // @@ -160,7 +160,7 @@ public static void Main(string[] args) Console.WriteLine("* Web service auth : " + (config.ServiceAuthorization.Enabled ? "Enabled" : "Disabled")); Console.WriteLine("* OpenAPI swagger : " + (config.Service.OpenApiEnabled ? "Enabled" : "Disabled")); Console.WriteLine("* Memory Db : " + app.Services.GetService()?.GetType().FullName); - Console.WriteLine("* Content storage : " + app.Services.GetService()?.GetType().FullName); + Console.WriteLine("* Document storage : " + app.Services.GetService()?.GetType().FullName); Console.WriteLine("* Embedding generation: " + app.Services.GetService()?.GetType().FullName); Console.WriteLine("* Text generation : " + app.Services.GetService()?.GetType().FullName); Console.WriteLine("* Log level : " + app.Logger.GetLogLevelName()); diff --git a/service/Service/README.md b/service/Service/README.md index 8d4898020..adcec7834 100644 --- a/service/Service/README.md +++ b/service/Service/README.md @@ -89,9 +89,17 @@ env var, so the code will use the settings stored in `appsettings.Development.js The service depends on three main components: -- **Content storage**: this is where content like files, chats, emails are - saved and transformed when uploaded. Currently, the solution supports Azure Blobs, - local filesystem and in-memory volatile filesystem. +- **Document storage**: this is where the application stores files, chats, emails, + cache, async job status, and temporary files used during the memory ingestion. + The solution supports Azure Blobs, local filesystem, MongoDb, and in-memory + volatile filesystem. The volatile file system is used by default, but should be + avoided in Production and used only for demos and tests. + +- **Memory storage**: service used to persist embeddings and memory records. + The service supports **Azure AI Search**, **Postgres**, **Qdrant**, **Redis**, + **SQL Server** and other engines, plus a very basic in memory vector storage + with support for persistence on disk called **SimpleVectorDb**. + Unless configured differently, KM uses SimpleVectorDb storing data in memory only. - **Embedding generator**: all the documents uploaded are automatically partitioned (aka "chunked") and indexed for vector search, generating @@ -108,12 +116,6 @@ The service depends on three main components: factor affecting summarization and answer generations, so you might get better results with 16k, 32k and bigger models. -- **Vector storage**: service used to persist embeddings. The - service supports **Azure AI Search**, **Qdrant**, **Redis** and other engines, - plus a very basic in memory vector storage with support for persistence on disk - called **SimpleVectorDb**. Unless configured differently, KM uses SimpleVectorDb - storing data in memory only. - - **Data ingestion orchestration**: this can run in memory and in the same process, e.g. when working with small files, or run as a service, in which case it requires persistent queues like **Azure Queues** or **RabbitMQ**. diff --git a/service/Service/ServiceConfiguration.cs b/service/Service/ServiceConfiguration.cs index c5caf614a..3b1164ed7 100644 --- a/service/Service/ServiceConfiguration.cs +++ b/service/Service/ServiceConfiguration.cs @@ -5,7 +5,7 @@ using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.KernelMemory.AI; -using Microsoft.KernelMemory.ContentStorage.DevTools; +using Microsoft.KernelMemory.DocumentStorage.DevTools; using Microsoft.KernelMemory.MemoryDb.SQLServer; using Microsoft.KernelMemory.MemoryStorage; using Microsoft.KernelMemory.MemoryStorage.DevTools; @@ -152,21 +152,21 @@ private void ConfigureQueueDependency(IKernelMemoryBuilder builder) private void ConfigureStorageDependency(IKernelMemoryBuilder builder) { - switch (this._memoryConfiguration.ContentStorageType) + switch (this._memoryConfiguration.DocumentStorageType) { case string x1 when x1.Equals("AzureBlob", StringComparison.OrdinalIgnoreCase): case string x2 when x2.Equals("AzureBlobs", StringComparison.OrdinalIgnoreCase): // Check 2 keys for backward compatibility - builder.Services.AddAzureBlobsAsContentStorage(this.GetServiceConfig("AzureBlobs") - ?? this.GetServiceConfig("AzureBlob")); + builder.Services.AddAzureBlobsAsDocumentStorage(this.GetServiceConfig("AzureBlobs") + ?? this.GetServiceConfig("AzureBlob")); break; case string x when x.Equals("MongoDbAtlas", StringComparison.OrdinalIgnoreCase): - builder.Services.AddMongoDbAtlasAsContentStorage(this.GetServiceConfig("MongoDbAtlas")); + builder.Services.AddMongoDbAtlasAsDocumentStorage(this.GetServiceConfig("MongoDbAtlas")); break; case string x when x.Equals("SimpleFileStorage", StringComparison.OrdinalIgnoreCase): - builder.Services.AddSimpleFileStorageAsContentStorage(this.GetServiceConfig("SimpleFileStorage")); + builder.Services.AddSimpleFileStorageAsDocumentStorage(this.GetServiceConfig("SimpleFileStorage")); break; default: diff --git a/service/Service/appsettings.json b/service/Service/appsettings.json index 86221adfb..e5dc196fe 100644 --- a/service/Service/appsettings.json +++ b/service/Service/appsettings.json @@ -19,7 +19,7 @@ // "Microsoft.KernelMemory.Handlers.TextPartitioningHandler": "Information", // "Microsoft.KernelMemory.Handlers.GenerateEmbeddingsHandler": "Information", // "Microsoft.KernelMemory.Handlers.SaveEmbeddingsHandler": "Information", - // "Microsoft.KernelMemory.ContentStorage.AzureBlobs": "Information", + // "Microsoft.KernelMemory.DocumentStorage.AzureBlobs": "Information", // "Microsoft.KernelMemory.Pipeline.Queue.AzureQueues": "Information", "Microsoft.AspNetCore": "Warning" }, @@ -106,7 +106,7 @@ "AccessKey2": "" }, // "AzureBlobs" or "SimpleFileStorage" - "ContentStorageType": "SimpleFileStorage", + "DocumentStorageType": "SimpleFileStorage", // "AzureOpenAIText", "OpenAI" or "LlamaSharp" "TextGeneratorType": "", // Name of the index to use when none is specified diff --git a/service/tests/Core.FunctionalTests/ParallelHandlersTest.cs b/service/tests/Core.FunctionalTests/ParallelHandlersTest.cs index dbf4072b7..92cb68ae7 100644 --- a/service/tests/Core.FunctionalTests/ParallelHandlersTest.cs +++ b/service/tests/Core.FunctionalTests/ParallelHandlersTest.cs @@ -2,7 +2,7 @@ using System.Diagnostics; using Microsoft.KernelMemory; -using Microsoft.KernelMemory.ContentStorage.DevTools; +using Microsoft.KernelMemory.DocumentStorage.DevTools; using Microsoft.KernelMemory.MemoryStorage.DevTools; using Microsoft.KM.TestHelpers; using Xunit.Abstractions; diff --git a/service/tests/Core.FunctionalTests/ServerLess/SubDirFilesAndStreamsTest.cs b/service/tests/Core.FunctionalTests/ServerLess/SubDirFilesAndStreamsTest.cs index 46d418c48..ce0827c4f 100644 --- a/service/tests/Core.FunctionalTests/ServerLess/SubDirFilesAndStreamsTest.cs +++ b/service/tests/Core.FunctionalTests/ServerLess/SubDirFilesAndStreamsTest.cs @@ -1,7 +1,7 @@ // Copyright (c) Microsoft. All rights reserved. using Microsoft.KernelMemory; -using Microsoft.KernelMemory.ContentStorage.DevTools; +using Microsoft.KernelMemory.DocumentStorage.DevTools; using Microsoft.KernelMemory.FileSystem.DevTools; using Microsoft.KernelMemory.MemoryStorage.DevTools; using Microsoft.KM.TestHelpers; diff --git a/service/tests/Core.FunctionalTests/VectorDbComparison/TestCosineSimilarity.cs b/service/tests/Core.FunctionalTests/VectorDbComparison/TestCosineSimilarity.cs index 002cf6c5d..113486f57 100644 --- a/service/tests/Core.FunctionalTests/VectorDbComparison/TestCosineSimilarity.cs +++ b/service/tests/Core.FunctionalTests/VectorDbComparison/TestCosineSimilarity.cs @@ -15,67 +15,60 @@ namespace Microsoft.KM.Core.FunctionalTests.VectorDbComparison; -public class TestCosineSimilarity(IConfiguration cfg, ITestOutputHelper log) : BaseFunctionalTestCase(cfg, log) +public class TestCosineSimilarity : BaseFunctionalTestCase { private const string IndexName = "test-cosinesimil"; - private readonly ITestOutputHelper _log = log; + // On/Off toggles + private readonly bool _azSearchEnabled = true; + private readonly bool _postgresEnabled = true; + private readonly bool _elasticsearchEnabled = false; + private readonly bool _mongoDbAtlasEnabled = false; + private readonly bool _qdrantEnabled = false; + private readonly bool _redisEnabled = false; - [Fact] - [Trait("Category", "Serverless")] - public async Task CompareCosineSimilarity() - { - bool azSearchEnabled = true; - bool mongoDbAtlasEnabled = false; - bool postgresEnabled = true; - bool qdrantEnabled = false; - bool redisEnabled = false; - bool simpleDbEnabled = true; - bool elasticsearchEnabled = true; + private readonly Dictionary _memoryDbs = new(); + private readonly FakeEmbeddingGenerator _embeddingGenerator; - // == Ctors - var embeddingGenerator = new FakeEmbeddingGenerator(); + public TestCosineSimilarity(IConfiguration cfg, ITestOutputHelper log) : base(cfg, log) + { + this._embeddingGenerator = new FakeEmbeddingGenerator(); - SimpleVectorDb? simpleVecDb = null; - if (simpleDbEnabled) { simpleVecDb = new SimpleVectorDb(this.SimpleVectorDbConfig, embeddingGenerator); } + this._memoryDbs.Add("simple", new SimpleVectorDb(this.SimpleVectorDbConfig, this._embeddingGenerator)); - AzureAISearchMemory? acs = null; - if (azSearchEnabled) { acs = new AzureAISearchMemory(this.AzureAiSearchConfig, embeddingGenerator); } + if (this._azSearchEnabled) { this._memoryDbs.Add("acs", new AzureAISearchMemory(this.AzureAiSearchConfig, this._embeddingGenerator)); } - QdrantMemory? qdrant = null; - if (qdrantEnabled) { qdrant = new QdrantMemory(this.QdrantConfig, embeddingGenerator); } + if (this._mongoDbAtlasEnabled) { this._memoryDbs.Add("mongoDb", new MongoDbAtlasMemory(this.MongoDbAtlasConfig, this._embeddingGenerator)); } - PostgresMemory? postgres = null; - if (postgresEnabled) { postgres = new PostgresMemory(this.PostgresConfig, embeddingGenerator); } + if (this._postgresEnabled) { this._memoryDbs.Add("postgres", new PostgresMemory(this.PostgresConfig, this._embeddingGenerator)); } - MongoDbAtlasMemory? atlasVectorDb = null; - if (mongoDbAtlasEnabled) { atlasVectorDb = new MongoDbAtlasMemory(this.MongoDbAtlasConfig, embeddingGenerator); } + if (this._qdrantEnabled) { this._memoryDbs.Add("qdrant", new QdrantMemory(this.QdrantConfig, this._embeddingGenerator)); } - ElasticsearchMemory? elasticsearch = null; - if (elasticsearchEnabled) { elasticsearch = new ElasticsearchMemory(this.ElasticsearchConfig, embeddingGenerator); } + if (this._elasticsearchEnabled) { this._memoryDbs.Add("es", new ElasticsearchMemory(this.ElasticsearchConfig, this._embeddingGenerator)); } - RedisMemory? redis = null; - if (redisEnabled) + if (this._redisEnabled) { // TODO: revisit RedisMemory not to need this, e.g. not to connect in ctor - var redisMux = await ConnectionMultiplexer.ConnectAsync(this.RedisConfig.ConnectionString); - redis = new RedisMemory(this.RedisConfig, redisMux, embeddingGenerator); + var redisMux = ConnectionMultiplexer.ConnectAsync(this.RedisConfig.ConnectionString); + redisMux.Wait(TimeSpan.FromSeconds(5)); + this._memoryDbs.Add("redis", new RedisMemory(this.RedisConfig, redisMux.Result, this._embeddingGenerator)); } + } - var dbs = new IMemoryDb[] { simpleVecDb!, acs!, postgres!, qdrant!, redis!, atlasVectorDb! }; + [Fact] + [Trait("Category", "Serverless")] + public async Task CompareCosineSimilarity() + { + var target = new[] { 0.01f, 0.5f, 0.41f }; + this._embeddingGenerator.Mock("text01", target); // == Delete indexes left over - - await this.DeleteIndexAsync(IndexName, dbs); - await Task.Delay(TimeSpan.FromSeconds(2)); + await this.DeleteIndexAsync(IndexName); // == Create indexes - - await this.CreateIndexAsync(IndexName, 3, dbs); - await Task.Delay(TimeSpan.FromSeconds(1)); + await this.CreateIndexAsync(IndexName, 3); // == Insert data. Note: records are inserted out of order on purpose. - var records = new Dictionary { ["3"] = new() { Id = "3", Vector = new[] { 0.1f, 0.1f, 0.1f } }, @@ -86,69 +79,68 @@ public async Task CompareCosineSimilarity() ["7"] = new() { Id = "7", Vector = new[] { 0.88f, 0.01f, 0.13f } }, ["6"] = new() { Id = "6", Vector = new[] { 0.81f, 0.12f, 0.13f } }, }; - - foreach (KeyValuePair r in records) - { - await this.UpsertAsync(IndexName, r.Value, dbs); - } - - await Task.Delay(TimeSpan.FromSeconds(2)); + await this.UpsertAsync(IndexName, records); // == Test results: test precision and ordering - - var target = new[] { 0.01f, 0.5f, 0.41f }; - embeddingGenerator.Mock("text01", target); - - await this.TestSimilarityAsync(records, dbs); + await this.TestSimilarityAsync(records); } - private async Task DeleteIndexAsync(string indexName, IMemoryDb[] memoryDbs) + private async Task DeleteIndexAsync(string indexName) { - foreach (var memoryDb in memoryDbs.Where(x => x != null)) + foreach (var memoryDb in this._memoryDbs) { - this._log.WriteLine($"Deleting index {indexName} in {memoryDb.GetType().FullName}"); - await memoryDb.DeleteIndexAsync(indexName); + Console.WriteLine($"Deleting index {indexName} in {memoryDb.Value.GetType().FullName}"); + await memoryDb.Value.DeleteIndexAsync(indexName); } + + await Task.Delay(TimeSpan.FromSeconds(2)); } - private async Task CreateIndexAsync(string indexName, int vectorSize, IMemoryDb[] memoryDbs) + private async Task CreateIndexAsync(string indexName, int vectorSize) { - foreach (var memoryDb in memoryDbs.Where(x => x != null)) + foreach (var memoryDb in this._memoryDbs) { - this._log.WriteLine($"Creating index {indexName} in {memoryDb.GetType().FullName}"); - await memoryDb.CreateIndexAsync(indexName, vectorSize); + Console.WriteLine($"Creating index {indexName} in {memoryDb.Value.GetType().FullName}"); + await memoryDb.Value.CreateIndexAsync(indexName, vectorSize); } + + await Task.Delay(TimeSpan.FromSeconds(1)); } - private async Task UpsertAsync(string indexName, MemoryRecord record, IMemoryDb[] memoryDbs) + private async Task UpsertAsync(string indexName, Dictionary records) { - foreach (var memoryDb in memoryDbs.Where(x => x != null)) + foreach (KeyValuePair record in records) { - this._log.WriteLine($"Adding record in {memoryDb.GetType().FullName}"); - await memoryDb.UpsertAsync(indexName, record); + foreach (var memoryDb in this._memoryDbs) + { + Console.WriteLine($"Adding record in {memoryDb.Value.GetType().FullName}"); + await memoryDb.Value.UpsertAsync(indexName, record.Value); + } } + + await Task.Delay(TimeSpan.FromSeconds(2)); } - private async Task TestSimilarityAsync(Dictionary records, IMemoryDb[] memoryDbs) + private async Task TestSimilarityAsync(Dictionary records) { var target = new[] { 0.01f, 0.5f, 0.41f }; - foreach (var memoryDb in memoryDbs.Where(x => x != null)) + foreach (var memoryDb in this._memoryDbs) { const double Precision = 0.000001d; var previous = "0"; - IAsyncEnumerable<(MemoryRecord, double)> list = memoryDb.GetSimilarListAsync( + IAsyncEnumerable<(MemoryRecord, double)> list = memoryDb.Value.GetSimilarListAsync( index: IndexName, text: "text01", limit: 10, withEmbeddings: true); List<(MemoryRecord, double)> results = await list.ToListAsync(); - this._log.WriteLine($"\n\n{memoryDb.GetType().FullName}: {results.Count} results"); + Console.WriteLine($"\n\n{memoryDb.Value.GetType().FullName}: {results.Count} results"); previous = "0"; foreach ((MemoryRecord? memoryRecord, double actual) in results) { var expected = CosineSim(target, records[memoryRecord.Id].Vector); var diff = expected - actual; - this._log.WriteLine($" - ID: {memoryRecord.Id}, Distance: {actual}, Expected distance: {expected}, Difference: {diff:0.0000000000}"); + Console.WriteLine($" - ID: {memoryRecord.Id}, Distance: {actual}, Expected distance: {expected}, Difference: {diff:0.0000000000}"); Assert.True(Math.Abs(diff) < Precision); Assert.True(string.Compare(memoryRecord.Id, previous, StringComparison.OrdinalIgnoreCase) > 0, "Records are not ordered by similarity"); previous = memoryRecord.Id; diff --git a/service/tests/Core.FunctionalTests/VectorDbComparison/TestMemoryFilters.cs b/service/tests/Core.FunctionalTests/VectorDbComparison/TestMemoryFilters.cs index 2e33fe61c..7ec304cae 100644 --- a/service/tests/Core.FunctionalTests/VectorDbComparison/TestMemoryFilters.cs +++ b/service/tests/Core.FunctionalTests/VectorDbComparison/TestMemoryFilters.cs @@ -4,162 +4,157 @@ using Microsoft.KernelMemory.MemoryDb.AzureAISearch; using Microsoft.KernelMemory.MemoryDb.Elasticsearch; using Microsoft.KernelMemory.MemoryDb.Qdrant; +using Microsoft.KernelMemory.MemoryDb.Redis; using Microsoft.KernelMemory.MemoryStorage; using Microsoft.KernelMemory.MemoryStorage.DevTools; using Microsoft.KernelMemory.MongoDbAtlas; using Microsoft.KernelMemory.Postgres; using Microsoft.KM.TestHelpers; +using StackExchange.Redis; using Xunit.Abstractions; // ReSharper disable MissingBlankLines namespace Microsoft.KM.Core.FunctionalTests.VectorDbComparison; -// #pragma warning disable CS8600 // by design -// #pragma warning disable CS8604 // by design -public class TestMemoryFilters(IConfiguration cfg, ITestOutputHelper log) : BaseFunctionalTestCase(cfg, log) +public class TestMemoryFilters : BaseFunctionalTestCase { private const string IndexName = "test-filters"; - private readonly ITestOutputHelper _log = log; + // On/Off toggles + private readonly bool _azSearchEnabled = true; + private readonly bool _postgresEnabled = true; + private readonly bool _elasticsearchEnabled = false; + private readonly bool _mongoDbAtlasEnabled = false; + private readonly bool _qdrantEnabled = false; + private readonly bool _redisEnabled = false; - [Fact] - [Trait("Category", "Serverless")] - public async Task TestFilters() - { - bool azSearchEnabled = true; - bool mongoDbAtlasEnabled = false; - bool postgresEnabled = true; - bool qdrantEnabled = false; - bool elasticsearchEnabled = false; - - // Booleans used for investigating test failures - const bool DeleteIndex = true; - const bool CreateIndex = true; - const bool CreateRecords = true; + private readonly Dictionary _memoryDbs = new(); - var embeddingGenerator = new FakeEmbeddingGenerator(); + public TestMemoryFilters(IConfiguration cfg, ITestOutputHelper log) : base(cfg, log) + { + FakeEmbeddingGenerator _ = new(); - AzureAISearchMemory acs = null!; - if (azSearchEnabled) { acs = new AzureAISearchMemory(this.AzureAiSearchConfig, embeddingGenerator); } + this._memoryDbs.Add("simple", new SimpleVectorDb(this.SimpleVectorDbConfig, _)); - MongoDbAtlasMemory mongoDbAtlas = null!; - if (mongoDbAtlasEnabled) { mongoDbAtlas = new MongoDbAtlasMemory(this.MongoDbAtlasConfig, embeddingGenerator); } + if (this._azSearchEnabled) { this._memoryDbs.Add("acs", new AzureAISearchMemory(this.AzureAiSearchConfig, _)); } - PostgresMemory postgres = null!; - if (postgresEnabled) { postgres = new PostgresMemory(this.PostgresConfig, embeddingGenerator); } + if (this._mongoDbAtlasEnabled) { this._memoryDbs.Add("mongoDb", new MongoDbAtlasMemory(this.MongoDbAtlasConfig, _)); } - QdrantMemory qdrant = null!; - if (qdrantEnabled) { qdrant = new QdrantMemory(this.QdrantConfig, embeddingGenerator); } + if (this._postgresEnabled) { this._memoryDbs.Add("postgres", new PostgresMemory(this.PostgresConfig, _)); } - ElasticsearchMemory elasticsearch = null!; - if (elasticsearchEnabled) - { - elasticsearch = new ElasticsearchMemory(this.ElasticsearchConfig, embeddingGenerator); - } + if (this._qdrantEnabled) { this._memoryDbs.Add("qdrant", new QdrantMemory(this.QdrantConfig, _)); } - var simpleVecDb = new SimpleVectorDb(this.SimpleVectorDbConfig, embeddingGenerator); + if (this._elasticsearchEnabled) { this._memoryDbs.Add("es", new ElasticsearchMemory(this.ElasticsearchConfig, _)); } - if (DeleteIndex) + if (this._redisEnabled) { - if (azSearchEnabled) { await acs.DeleteIndexAsync(IndexName); } - - if (qdrantEnabled) { await qdrant.DeleteIndexAsync(IndexName); } - - if (postgresEnabled) { await postgres.DeleteIndexAsync(IndexName); } - - if (mongoDbAtlasEnabled) { await mongoDbAtlas.DeleteIndexAsync(IndexName); } - - if (elasticsearchEnabled) { await elasticsearch.DeleteIndexAsync(IndexName); } - - await simpleVecDb.DeleteIndexAsync(IndexName); - - await Task.Delay(TimeSpan.FromSeconds(2)); + // TODO: revisit RedisMemory not to need this, e.g. not to connect in ctor + var redisMux = ConnectionMultiplexer.ConnectAsync(this.RedisConfig.ConnectionString); + redisMux.Wait(TimeSpan.FromSeconds(5)); + this._memoryDbs.Add("redis", new RedisMemory(this.RedisConfig, redisMux.Result, _)); } + } - if (CreateIndex) - { - if (azSearchEnabled) { await acs.CreateIndexAsync(IndexName, 3); } - - if (qdrantEnabled) { await qdrant.CreateIndexAsync(IndexName, 3); } - - if (postgresEnabled) { await postgres.CreateIndexAsync(IndexName, 3); } - - if (mongoDbAtlasEnabled) { await mongoDbAtlas!.CreateIndexAsync(IndexName, 3); } - - if (elasticsearchEnabled) { await elasticsearch.CreateIndexAsync(IndexName, 3); } - - await simpleVecDb.CreateIndexAsync(IndexName, 3); - } + [Fact] + [Trait("Category", "Serverless")] + public async Task TestFilters() + { + // Booleans used for investigating test failures + const bool DeleteIndex = true; + const bool CreateIndex = true; + const bool CreateRecords = true; - if (CreateRecords) + var records = new Dictionary { - var records = new Dictionary - { - ["1"] = new() { Id = "1", Vector = new[] { 0.25f, 0.33f, 0.29f }, Tags = new() { { "user", "Kaylee" }, { "collection", "Work" } } }, - ["2"] = new() { Id = "2", Vector = new[] { 0.25f, 0.25f, 0.35f }, Tags = new() { { "user", "Kaylee" }, { "collection", "Personal" } } }, - ["3"] = new() { Id = "3", Vector = new[] { 0.1f, 0.1f, 0.1f }, Tags = new() { { "user", "Kaylee" }, { "collection", "Family" } } }, - ["4"] = new() { Id = "4", Vector = new[] { 0.05f, 0.91f, 0.03f }, Tags = new() { { "user", "Kaylee" }, { "collection", "Family" } } }, - ["5"] = new() { Id = "5", Vector = new[] { 0.65f, 0.12f, 0.99f }, Tags = new() { { "user", "Kaylee" }, { "collection", "Family" } } }, - ["6"] = new() { Id = "6", Vector = new[] { 0.81f, 0.12f, 0.13f }, Tags = new() { { "user", "Madelynn" }, { "collection", "Personal" } } }, - ["7"] = new() { Id = "7", Vector = new[] { 0.88f, 0.01f, 0.13f }, Tags = new() { { "user", "Madelynn" }, { "collection", "Work" } } }, - }; - - foreach (KeyValuePair r in records) - { - if (azSearchEnabled) { await acs.UpsertAsync(IndexName, r.Value); } - - if (qdrantEnabled) { await qdrant.UpsertAsync(IndexName, r.Value); } - - if (postgresEnabled) { await postgres.UpsertAsync(IndexName, r.Value); } + ["1"] = new() { Id = "1", Vector = new[] { 0.25f, 0.33f, 0.29f }, Tags = new() { { "user", "Kaylee" }, { "collection", "Work" } } }, + ["2"] = new() { Id = "2", Vector = new[] { 0.25f, 0.25f, 0.35f }, Tags = new() { { "user", "Kaylee" }, { "collection", "Personal" } } }, + ["3"] = new() { Id = "3", Vector = new[] { 0.1f, 0.1f, 0.1f }, Tags = new() { { "user", "Kaylee" }, { "collection", "Family" } } }, + ["4"] = new() { Id = "4", Vector = new[] { 0.05f, 0.91f, 0.03f }, Tags = new() { { "user", "Kaylee" }, { "collection", "Family" } } }, + ["5"] = new() { Id = "5", Vector = new[] { 0.65f, 0.12f, 0.99f }, Tags = new() { { "user", "Kaylee" }, { "collection", "Family" } } }, + ["6"] = new() { Id = "6", Vector = new[] { 0.81f, 0.12f, 0.13f }, Tags = new() { { "user", "Madelynn" }, { "collection", "Personal" } } }, + ["7"] = new() { Id = "7", Vector = new[] { 0.88f, 0.01f, 0.13f }, Tags = new() { { "user", "Madelynn" }, { "collection", "Work" } } }, + }; - if (mongoDbAtlasEnabled) { await mongoDbAtlas.UpsertAsync(IndexName, r.Value); } + if (DeleteIndex) { await this.DeleteIndexAsync(IndexName); } - if (elasticsearchEnabled) { await elasticsearch.UpsertAsync(IndexName, r.Value); } + if (CreateIndex) { await this.CreateIndexAsync(IndexName, 3); } - await simpleVecDb.UpsertAsync(IndexName, r.Value); - } - - await Task.Delay(TimeSpan.FromSeconds(2)); - } + if (CreateRecords) { await this.UpsertAsync(IndexName, records); } for (int i = 1; i <= 3; i++) { - if (azSearchEnabled) + Console.WriteLine("\n----- Simple vector DB -----"); + await this.TestVectorDbFiltering(this._memoryDbs["simple"], i); + + if (this._memoryDbs.TryGetValue("acs", out IMemoryDb? acs)) { - this._log.WriteLine("----- Azure AI Search -----"); + Console.WriteLine("----- Azure AI Search -----"); await this.TestVectorDbFiltering(acs, i); } - if (qdrantEnabled) + if (this._memoryDbs.TryGetValue("qdrant", out IMemoryDb? qdrant)) { - this._log.WriteLine("\n----- Qdrant vector DB -----"); + Console.WriteLine("\n----- Qdrant vector DB -----"); await this.TestVectorDbFiltering(qdrant, i); } - if (postgresEnabled) + if (this._memoryDbs.TryGetValue("postgres", out IMemoryDb? postgres)) { - this._log.WriteLine("\n----- Postgres vector DB -----"); + Console.WriteLine("\n----- Postgres vector DB -----"); await this.TestVectorDbFiltering(postgres, i); } - if (mongoDbAtlasEnabled) + if (this._memoryDbs.TryGetValue("mongoDb", out IMemoryDb? mongoDb)) { - this._log.WriteLine("\n----- MongoDB Atlas vector DB -----"); - await this.TestVectorDbFiltering(mongoDbAtlas, i); + Console.WriteLine("\n----- MongoDB Atlas vector DB -----"); + await this.TestVectorDbFiltering(mongoDb, i); } - if (elasticsearchEnabled) + if (this._memoryDbs.TryGetValue("es", out IMemoryDb? es)) { - this._log.WriteLine("\n----- Elasticsearch vector DB -----"); - await this.TestVectorDbFiltering(elasticsearch, i); + Console.WriteLine("\n----- Elasticsearch vector DB -----"); + await this.TestVectorDbFiltering(es, i); } - this._log.WriteLine("\n----- Simple vector DB -----"); - await this.TestVectorDbFiltering(simpleVecDb, i); + Console.WriteLine("\n\n"); + } + } - this._log.WriteLine("\n\n"); + private async Task DeleteIndexAsync(string indexName) + { + foreach (var memoryDb in this._memoryDbs) + { + Console.WriteLine($"Deleting index {indexName} in {memoryDb.Value.GetType().FullName}"); + await memoryDb.Value.DeleteIndexAsync(indexName); } + + await Task.Delay(TimeSpan.FromSeconds(2)); + } + + private async Task CreateIndexAsync(string indexName, int vectorSize) + { + foreach (var memoryDb in this._memoryDbs) + { + Console.WriteLine($"Creating index {indexName} in {memoryDb.Value.GetType().FullName}"); + await memoryDb.Value.CreateIndexAsync(indexName, vectorSize); + } + + await Task.Delay(TimeSpan.FromSeconds(1)); + } + + private async Task UpsertAsync(string indexName, Dictionary records) + { + foreach (KeyValuePair record in records) + { + foreach (var memoryDb in this._memoryDbs) + { + Console.WriteLine($"Adding record in {memoryDb.Value.GetType().FullName}"); + await memoryDb.Value.UpsertAsync(indexName, record.Value); + } + } + + await Task.Delay(TimeSpan.FromSeconds(2)); } // NOTE: result order does not matter, checking result count only @@ -170,10 +165,10 @@ private async Task TestVectorDbFiltering(IMemoryDb vectorDb, int test) { var singleFilter = new List { MemoryFilters.ByTag("user", "Kaylee") }; var singleFilterResults = await vectorDb.GetListAsync(IndexName, filters: singleFilter, limit: int.MaxValue).ToListAsync(); - this._log.WriteLine($"\nSingle memory filter: {singleFilterResults.Count} results"); + Console.WriteLine($"\nSingle memory filter: {singleFilterResults.Count} results"); foreach (MemoryRecord r in singleFilterResults.OrderBy(x => x.Id)) { - this._log.WriteLine($" - ID: {r.Id}, Tags: {string.Join(", ", r.Tags.Select(t => $"{t.Key}: {string.Join(", ", t.Value)}"))}"); + Console.WriteLine($" - ID: {r.Id}, Tags: {string.Join(", ", r.Tags.Select(t => $"{t.Key}: {string.Join(", ", t.Value)}"))}"); } Assert.Equal(5, singleFilterResults.Count); @@ -184,10 +179,10 @@ private async Task TestVectorDbFiltering(IMemoryDb vectorDb, int test) { var singleFilterMultipleTags = new List { MemoryFilters.ByTag("user", "Kaylee").ByTag("collection", "Work") }; var singleFilterMultipleTagsResults = await vectorDb.GetListAsync(IndexName, filters: singleFilterMultipleTags, limit: int.MaxValue).ToListAsync(); - this._log.WriteLine($"\nSingle memory filter with multiple tags: {singleFilterMultipleTagsResults.Count} results"); + Console.WriteLine($"\nSingle memory filter with multiple tags: {singleFilterMultipleTagsResults.Count} results"); foreach (MemoryRecord r in singleFilterMultipleTagsResults.OrderBy(x => x.Id)) { - this._log.WriteLine($" - ID: {r.Id}, Tags: {string.Join(", ", r.Tags.Select(t => $"{t.Key}: {string.Join(", ", t.Value)}"))}"); + Console.WriteLine($" - ID: {r.Id}, Tags: {string.Join(", ", r.Tags.Select(t => $"{t.Key}: {string.Join(", ", t.Value)}"))}"); } Assert.Equal(1, singleFilterMultipleTagsResults.Count); @@ -202,10 +197,10 @@ private async Task TestVectorDbFiltering(IMemoryDb vectorDb, int test) MemoryFilters.ByTag("user", "Madelynn").ByTag("collection", "Personal") }; var multipleFiltersResults = await vectorDb.GetListAsync(IndexName, filters: multipleFilters, limit: int.MaxValue).ToListAsync(); - this._log.WriteLine($"\nMultiple memory filters with multiple tags: {multipleFiltersResults.Count} results"); + Console.WriteLine($"\nMultiple memory filters with multiple tags: {multipleFiltersResults.Count} results"); foreach (MemoryRecord r in multipleFiltersResults.OrderBy(x => x.Id)) { - this._log.WriteLine($" - ID: {r.Id}, Tags: {string.Join(", ", r.Tags.Select(t => $"{t.Key}: {string.Join(", ", t.Value)}"))}"); + Console.WriteLine($" - ID: {r.Id}, Tags: {string.Join(", ", r.Tags.Select(t => $"{t.Key}: {string.Join(", ", t.Value)}"))}"); } Assert.Equal(4, multipleFiltersResults.Count); diff --git a/service/tests/Core.UnitTests/KernelMemoryBuilderTest.cs b/service/tests/Core.UnitTests/KernelMemoryBuilderTest.cs index 10df06c75..033119edd 100644 --- a/service/tests/Core.UnitTests/KernelMemoryBuilderTest.cs +++ b/service/tests/Core.UnitTests/KernelMemoryBuilderTest.cs @@ -3,7 +3,7 @@ using Microsoft.Extensions.DependencyInjection; using Microsoft.KernelMemory; using Microsoft.KernelMemory.AI; -using Microsoft.KernelMemory.ContentStorage; +using Microsoft.KernelMemory.DocumentStorage; using Microsoft.KernelMemory.MemoryStorage; using Microsoft.KernelMemory.Pipeline; using Microsoft.KernelMemory.Pipeline.Queue; @@ -24,7 +24,7 @@ public KernelMemoryBuilderTest(ITestOutputHelper output) : base(output) public void ItBuildsServerlessClients() { // Arrange - var myContentStorage = new Mock(); + var myDocumentStorage = new Mock(); var myMimeTypeDetection = new Mock(); var myTextEmbeddingGenerator = new Mock(); var myTextGenerator = new Mock(); @@ -33,7 +33,7 @@ public void ItBuildsServerlessClients() myTextEmbeddingGenerator.SetupGet(x => x.MaxTokens).Returns(int.MaxValue); var target = new KernelMemoryBuilder() - .WithCustomStorage(myContentStorage.Object) + .WithCustomDocumentStorage(myDocumentStorage.Object) .WithCustomMimeTypeDetection(myMimeTypeDetection.Object) .WithCustomEmbeddingGenerator(myTextEmbeddingGenerator.Object) .WithCustomTextGenerator(myTextGenerator.Object) @@ -54,7 +54,7 @@ public void ItBuildsAsyncClients() var hostServiceCollection = new ServiceCollection(); var myQueue = new Mock(); var myQueueFactory = new QueueClientFactory(() => myQueue.Object); - var myContentStorage = new Mock(); + var myDocumentStorage = new Mock(); var myMimeTypeDetection = new Mock(); var myTextEmbeddingGenerator = new Mock(); var myTextGenerator = new Mock(); @@ -64,7 +64,7 @@ public void ItBuildsAsyncClients() var target = new KernelMemoryBuilder(hostServiceCollection) .WithCustomIngestionQueueClientFactory(myQueueFactory) - .WithCustomStorage(myContentStorage.Object) + .WithCustomDocumentStorage(myDocumentStorage.Object) .WithCustomMimeTypeDetection(myMimeTypeDetection.Object) .WithCustomEmbeddingGenerator(myTextEmbeddingGenerator.Object) .WithCustomTextGenerator(myTextGenerator.Object) @@ -82,13 +82,13 @@ public void ItBuildsAsyncClients() public void ItDetectsMissingEmbeddingGenerator() { // Arrange - var myContentStorage = new Mock(); + var myDocumentStorage = new Mock(); var myMimeTypeDetection = new Mock(); var myTextGenerator = new Mock(); var myMemoryDb = new Mock(); var target = new KernelMemoryBuilder() - .WithCustomStorage(myContentStorage.Object) + .WithCustomDocumentStorage(myDocumentStorage.Object) .WithCustomMimeTypeDetection(myMimeTypeDetection.Object) .WithCustomTextGenerator(myTextGenerator.Object) .WithCustomMemoryDb(myMemoryDb.Object); diff --git a/service/tests/TestHelpers/BaseFunctionalTestCase.cs b/service/tests/TestHelpers/BaseFunctionalTestCase.cs index 525aa5e5e..c85852a1b 100644 --- a/service/tests/TestHelpers/BaseFunctionalTestCase.cs +++ b/service/tests/TestHelpers/BaseFunctionalTestCase.cs @@ -3,7 +3,7 @@ using System.Reflection; using Microsoft.Extensions.Configuration; using Microsoft.KernelMemory; -using Microsoft.KernelMemory.ContentStorage.DevTools; +using Microsoft.KernelMemory.DocumentStorage.DevTools; using Microsoft.KernelMemory.FileSystem.DevTools; using Microsoft.KernelMemory.MemoryStorage.DevTools; using Microsoft.KernelMemory.MongoDbAtlas; diff --git a/tools/InteractiveSetup/Context.cs b/tools/InteractiveSetup/Context.cs index 51b5bea7c..f2f1c634f 100644 --- a/tools/InteractiveSetup/Context.cs +++ b/tools/InteractiveSetup/Context.cs @@ -9,9 +9,9 @@ internal sealed class Context public BoundedBoolean CfgWebService = new(); // Storage - public BoundedBoolean CfgContentStorage = new(initialState: true); + public BoundedBoolean CfgDocumentStorage = new(initialState: true); public BoundedBoolean CfgAzureBlobs = new(); - public BoundedBoolean CfgMongoDbAtlasContentStorage = new(); + public BoundedBoolean CfgMongoDbAtlasDocumentStorage = new(); public BoundedBoolean CfgSimpleFileStorage = new(); // Queues diff --git a/tools/InteractiveSetup/Main.cs b/tools/InteractiveSetup/Main.cs index 9f030ffce..0bba57019 100644 --- a/tools/InteractiveSetup/Main.cs +++ b/tools/InteractiveSetup/Main.cs @@ -32,10 +32,10 @@ public static void InteractiveSetup(string[] args) Services.RabbitMQ.Setup(ctx); SimpleQueues.Setup(ctx); - // Storage - ContentStorageTypeSetup(ctx); + // Document Storage + DocumentStorageTypeSetup(ctx); AzureBlobs.Setup(ctx); - MongoDbAtlasContentStorage.Setup(ctx); + MongoDbAtlasDocumentStorage.Setup(ctx); SimpleFileStorage.Setup(ctx); // Image support @@ -94,8 +94,8 @@ private static void ConfigureItem(Context ctx, string[] items) QueuesTypeSetup(ctx); break; - case string x when x.Equals("ContentStorageType", StringComparison.OrdinalIgnoreCase): - ContentStorageTypeSetup(ctx); + case string x when x.Equals("DocumentStorageType", StringComparison.OrdinalIgnoreCase): + DocumentStorageTypeSetup(ctx); break; case string x when x.Equals("AzureAISearch", StringComparison.OrdinalIgnoreCase): @@ -301,36 +301,36 @@ private static void QueuesTypeSetup(Context ctx) }); } - private static void ContentStorageTypeSetup(Context ctx) + private static void DocumentStorageTypeSetup(Context ctx) { - if (!ctx.CfgContentStorage.Value) { return; } + if (!ctx.CfgDocumentStorage.Value) { return; } var config = AppSettings.GetCurrentConfig(); SetupUI.AskQuestionWithOptions(new QuestionWithOptions { - Title = "Where should the service store files?", + Title = "Where should the service store files? A persistent storage is required to handle updates, downloads, etc.", Options = new List { new("Azure Blobs", - config.ContentStorageType == "AzureBlobs", + config.DocumentStorageType == "AzureBlobs", () => { - AppSettings.Change(x => { x.ContentStorageType = "AzureBlobs"; }); + AppSettings.Change(x => { x.DocumentStorageType = "AzureBlobs"; }); ctx.CfgAzureBlobs.Value = true; }), new("MongoDB Atlas", - config.ContentStorageType == "MongoDbAtlas", + config.DocumentStorageType == "MongoDbAtlas", () => { - AppSettings.Change(x => { x.ContentStorageType = "MongoDbAtlas"; }); - ctx.CfgMongoDbAtlasContentStorage.Value = true; + AppSettings.Change(x => { x.DocumentStorageType = "MongoDbAtlas"; }); + ctx.CfgMongoDbAtlasDocumentStorage.Value = true; }), new("SimpleFileStorage (only for tests, data stored in memory or disk, see config file)", - config.ContentStorageType == "SimpleFileStorage", + config.DocumentStorageType == "SimpleFileStorage", () => { - AppSettings.Change(x => { x.ContentStorageType = "SimpleFileStorage"; }); + AppSettings.Change(x => { x.DocumentStorageType = "SimpleFileStorage"; }); ctx.CfgSimpleFileStorage.Value = true; }), new("-exit-", false, SetupUI.Exit), diff --git a/tools/InteractiveSetup/Services/MongoDbAtlasContentStorage.cs b/tools/InteractiveSetup/Services/MongoDbAtlasDocumentStorage.cs similarity index 83% rename from tools/InteractiveSetup/Services/MongoDbAtlasContentStorage.cs rename to tools/InteractiveSetup/Services/MongoDbAtlasDocumentStorage.cs index 5d9a9291e..ac93b6cb1 100644 --- a/tools/InteractiveSetup/Services/MongoDbAtlasContentStorage.cs +++ b/tools/InteractiveSetup/Services/MongoDbAtlasDocumentStorage.cs @@ -5,13 +5,13 @@ namespace Microsoft.KernelMemory.InteractiveSetup.Services; -internal static class MongoDbAtlasContentStorage +internal static class MongoDbAtlasDocumentStorage { public static void Setup(Context ctx, bool force = false) { - if (!ctx.CfgMongoDbAtlasContentStorage.Value && !force) { return; } + if (!ctx.CfgMongoDbAtlasDocumentStorage.Value && !force) { return; } - ctx.CfgMongoDbAtlasContentStorage.Value = false; + ctx.CfgMongoDbAtlasDocumentStorage.Value = false; const string ServiceName = "MongoDbAtlas"; if (!AppSettings.GetCurrentConfig().Services.TryGetValue(ServiceName, out var config))