From 76ac06124c65591c6a4c35b6c2c8fcde3c66cd3a Mon Sep 17 00:00:00 2001 From: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> Date: Mon, 8 Apr 2024 16:40:29 +0100 Subject: [PATCH 01/18] ADR for the ITextSearchService abstraction --- docs/decisions/0041-text-search-service.md | 87 ++++++++++ .../Search/AzureAISearch.cs | 66 ++++++++ .../KernelSyntaxExamples/Search/BingSearch.cs | 26 +++ .../Search/GoogleSearch.cs | 26 +++ .../AzureAIKernelSearchResult.cs | 31 ++++ .../AzureAISearchExecutionSettings.cs | 67 ++++++++ .../AzureAITextSearchService.cs | 150 ++++++++++++++++++ .../Search/ITextSearchService.cs | 24 +++ .../Search/KernelSearchResult.cs | 44 +++++ .../Search/KernelSearchResults.cs | 52 ++++++ .../Search/SearchExecutionSettings.cs | 31 ++++ .../Services/ISearchService.cs | 15 ++ 12 files changed, 619 insertions(+) create mode 100644 docs/decisions/0041-text-search-service.md create mode 100644 dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs create mode 100644 dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs create mode 100644 dotnet/samples/KernelSyntaxExamples/Search/GoogleSearch.cs create mode 100644 dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAIKernelSearchResult.cs create mode 100644 dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs create mode 100644 dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs create mode 100644 dotnet/src/SemanticKernel.Abstractions/Search/ITextSearchService.cs create mode 100644 dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResult.cs create mode 100644 dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResults.cs create mode 100644 dotnet/src/SemanticKernel.Abstractions/Search/SearchExecutionSettings.cs create mode 100644 dotnet/src/SemanticKernel.Abstractions/Services/ISearchService.cs diff --git a/docs/decisions/0041-text-search-service.md b/docs/decisions/0041-text-search-service.md new file mode 100644 index 000000000000..8ec562d1eea5 --- /dev/null +++ b/docs/decisions/0041-text-search-service.md @@ -0,0 +1,87 @@ +--- +# These are optional elements. Feel free to remove any of them. +status: proposed +contact: markwallace +date: {YYYY-MM-DD when the decision was last updated} +deciders: sergeymenshykh, markwallace, rbarreto, dmytrostruk +consulted: +informed: stephentoub, matthewbolanos +--- + +# Text Search Service + +## Context and Problem Statement + +{Describe the context and problem statement, e.g., in free form using two to three sentences or in the form of an illustrative story. +You may want to articulate the problem in form of a question and add links to collaboration boards or issue management systems.} + + + +## Decision Drivers + +- {decision driver 1, e.g., a force, facing concern, …} +- {decision driver 2, e.g., a force, facing concern, …} +- … + +## Considered Options + +- {title of option 1} +- {title of option 2} +- {title of option 3} +- … + +## Decision Outcome + +Chosen option: "{title of option 1}", because +{justification. e.g., only option, which meets k.o. criterion decision driver | which resolves force {force} | … | comes out best (see below)}. + + + +### Consequences + +- Good, because {positive consequence, e.g., improvement of one or more desired qualities, …} +- Bad, because {negative consequence, e.g., compromising one or more desired qualities, …} +- … + + + +## Validation + +{describe how the implementation of/compliance with the ADR is validated. E.g., by a review or an ArchUnit test} + + + +## Pros and Cons of the Options + +### {title of option 1} + + + +{example | description | pointer to more information | …} + +- Good, because {argument a} +- Good, because {argument b} + +- Neutral, because {argument c} +- Bad, because {argument d} +- … + +### {title of other option} + +{example | description | pointer to more information | …} + +- Good, because {argument a} +- Good, because {argument b} +- Neutral, because {argument c} +- Bad, because {argument d} +- … + + + +## More Information + +{You might want to provide additional evidence/confidence for the decision outcome here and/or +document the team agreement on the decision and/or +define when this decision when and how the decision should be realized and if/when it should be re-visited and/or +how the decision is validated. +Links to other decisions and resources might appear here as well.} diff --git a/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs b/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs new file mode 100644 index 000000000000..f8c706d788f8 --- /dev/null +++ b/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs @@ -0,0 +1,66 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System.Text.Json.Serialization; +using System.Threading.Tasks; +using Examples; +using Microsoft.SemanticKernel.Connectors.AzureAISearch; +using Microsoft.SemanticKernel.Search; +using Xunit; +using Xunit.Abstractions; + +namespace Search; + +/// +/// This example shows how to create and use a . +/// +public sealed class AzureAISearch : BaseTest +{ + /// + /// Show how to create a and use it to perform a text search. + /// + [Fact] + public async Task RunAsync() + { + var query = "What is the Semantic Kernel?"; + + // Create a search service with Azure AI search + var searchService = new AzureAITextSearchService( + endpoint: TestConfiguration.AzureAISearch.Endpoint, + adminKey: TestConfiguration.AzureAISearch.ApiKey); + + // Create search settings for a semantic search with Azure AI search + var searchSettings = new AzureAISearchExecutionSettings + { + Index = TestConfiguration.AzureAISearch.IndexName + }; + + KernelSearchResults searchResults = await searchService.SearchAsync(query, searchSettings); + + // Show using the search results + await foreach (KernelSearchResult result in searchResults.Results) + { + WriteLine($"Title: {result.Value.Title}"); + WriteLine($"Score: {result.Metadata?["Score"]}"); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + WriteLine(result.Value.Chunk); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + } + } + + public AzureAISearch(ITestOutputHelper output) : base(output) + { + } + + /// + /// Represents a custom search result. + /// + public class CustomSearchResult + { + [JsonPropertyName("title")] + public string? Title { get; set; } + [JsonPropertyName("chunk_id")] + public string? ChunkId { get; set; } + [JsonPropertyName("chunk")] + public string? Chunk { get; set; } + } +} diff --git a/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs b/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs new file mode 100644 index 000000000000..d55898486925 --- /dev/null +++ b/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft. All rights reserved. +using System.Threading.Tasks; +using Examples; +using Microsoft.SemanticKernel.Search; +using Xunit; +using Xunit.Abstractions; + +namespace Search; + +/// +/// This example shows how to create and use a . +/// +public sealed class BingSearch : BaseTest +{ + /// + /// Show how to create a and use it to perform a text search. + /// + [Fact] + public async Task RunAsync() + { + } + + public BingSearch(ITestOutputHelper output) : base(output) + { + } +} diff --git a/dotnet/samples/KernelSyntaxExamples/Search/GoogleSearch.cs b/dotnet/samples/KernelSyntaxExamples/Search/GoogleSearch.cs new file mode 100644 index 000000000000..a7cad4af62fe --- /dev/null +++ b/dotnet/samples/KernelSyntaxExamples/Search/GoogleSearch.cs @@ -0,0 +1,26 @@ +// Copyright (c) Microsoft. All rights reserved. +using System.Threading.Tasks; +using Examples; +using Microsoft.SemanticKernel.Search; +using Xunit; +using Xunit.Abstractions; + +namespace Search; + +/// +/// This example shows how to create and use a . +/// +public sealed class GoogleSearch : BaseTest +{ + /// + /// Show how to create a and use it to perform a text search. + /// + [Fact] + public async Task RunAsync() + { + } + + public GoogleSearch(ITestOutputHelper output) : base(output) + { + } +} diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAIKernelSearchResult.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAIKernelSearchResult.cs new file mode 100644 index 000000000000..613b7218c1a9 --- /dev/null +++ b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAIKernelSearchResult.cs @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System.Collections.Generic; +using Azure.Search.Documents.Models; +using Microsoft.SemanticKernel.Search; + +namespace Microsoft.SemanticKernel.Connectors.AzureAISearch; + +/// +/// AzureAISearch implementation of . +/// +/// +public class AzureAIKernelSearchResult : KernelSearchResult +{ + /// + /// Initializes a new instance of the class. + /// + /// The search result. + public AzureAIKernelSearchResult(SearchResult searchResult) : base(searchResult.Document, searchResult, GetResultsMetadata(searchResult)) + { + } + + static private Dictionary? GetResultsMetadata(SearchResult searchResult) + { + return new Dictionary() + { + { "Score", searchResult.Score }, + { "Highlights", searchResult.Highlights }, + }; + } +} diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs new file mode 100644 index 000000000000..14a9d1ab5892 --- /dev/null +++ b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs @@ -0,0 +1,67 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System; +using System.Text.Json; +using Azure.Search.Documents; +using Azure.Search.Documents.Models; +using Microsoft.SemanticKernel.Search; +using Microsoft.SemanticKernel.Text; + +namespace Microsoft.SemanticKernel.Connectors.AzureAISearch; + +/// +/// Provides execution settings for a search request. +/// +public class AzureAISearchExecutionSettings : SearchExecutionSettings +{ + /// + /// Parameters for filtering, sorting, faceting, paging, and other search query behaviors. + /// + public SearchOptions? SearchOptions + { + get + { + this._searchOptions ??= new SearchOptions() + { + QueryType = SearchQueryType.Simple, + IncludeTotalCount = true, + Size = 10, + }; + return this._searchOptions; + } + set + { + this._searchOptions = value; + } + } + + /// + /// Create a new settings object with the values from another settings object. + /// + /// Template configuration + /// An instance of + public static AzureAISearchExecutionSettings FromExecutionSettings(SearchExecutionSettings? executionSettings) + { + if (executionSettings is null) + { + return new AzureAISearchExecutionSettings(); + } + + if (executionSettings is AzureAISearchExecutionSettings settings) + { + return settings; + } + + var json = JsonSerializer.Serialize(executionSettings); + + var azureExecutionSettings = JsonSerializer.Deserialize(json, JsonOptionsCache.ReadPermissive); + if (azureExecutionSettings is not null) + { + return azureExecutionSettings; + } + + throw new ArgumentException($"Invalid execution settings, cannot convert to {nameof(AzureAISearchExecutionSettings)}", nameof(executionSettings)); + } + + private SearchOptions? _searchOptions; +} diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs new file mode 100644 index 000000000000..8f7e7b0ab5f5 --- /dev/null +++ b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs @@ -0,0 +1,150 @@ +// Copyright (c) Microsoft. All rights reserved. +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Text.RegularExpressions; +using System.Threading; +using System.Threading.Tasks; +using Azure; +using Azure.Search.Documents.Indexes; +using Azure.Search.Documents.Models; +using Microsoft.SemanticKernel.Search; + +namespace Microsoft.SemanticKernel.Connectors.AzureAISearch; + +/// +/// An Azure Search service that creates and recalls memories associated with text. +/// +public class AzureAITextSearchService : ITextSearchService +{ + /// + public IReadOnlyDictionary Attributes => this._attributes; + + /// + /// Create an instance of the connector with API key authentication. + /// + /// Required. The URI endpoint of the Search service. This is likely to be similar to "https://{search_service}.search.windows.net". The URI must use HTTPS. + /// + /// Required. The API key credential used to authenticate requests against the Search service. + /// You need to use an admin key to perform any operations on the SearchIndexClient. + /// See Create and manage api-keys for an Azure Cognitive Search service for more information about API keys in Azure Cognitive Search. + /// + public AzureAITextSearchService(string endpoint, string adminKey) + { + Verify.NotNullOrWhiteSpace(endpoint); + Verify.NotNullOrWhiteSpace(adminKey); + + this._searchIndexClient = new SearchIndexClient(new Uri(endpoint), new AzureKeyCredential(adminKey)); + + this._attributes = new Dictionary + { + { "ServiceName", this._searchIndexClient.ServiceName }, + }; + } + + /// + /// Create an instance of the connector with provided instance. + /// + public AzureAITextSearchService(SearchIndexClient searchIndexClient) + { + Verify.NotNull(searchIndexClient); + + this._searchIndexClient = searchIndexClient; + + this._attributes = new Dictionary + { + { "ServiceName", this._searchIndexClient.ServiceName }, + }; + } + + /// + public async Task> SearchAsync(string query, SearchExecutionSettings searchSettings, CancellationToken cancellationToken = default) where T : class + { + Verify.NotNullOrWhiteSpace(query); + Verify.NotNull(searchSettings); + + var indexName = this.NormalizeIndexName(searchSettings.Index); + var searchClient = this._searchIndexClient.GetSearchClient(indexName); + + var azureSearchSettings = AzureAISearchExecutionSettings.FromExecutionSettings(searchSettings); + + SearchResults? searchResults = null; + try + { + searchResults = await searchClient.SearchAsync(query, azureSearchSettings.SearchOptions, cancellationToken).ConfigureAwait(true); + } + catch (HttpOperationException e) when (e.StatusCode == System.Net.HttpStatusCode.NotFound) + { + // index not found, no data to return + } + + return new KernelSearchResults(searchResults, this.GetResultsAsync(searchResults, cancellationToken), searchResults?.TotalCount, GetResultsMetadata(searchResults)); + } + + #region private + + private readonly SearchIndexClient _searchIndexClient; + private readonly IReadOnlyDictionary _attributes; + + /// + /// Return the search results and associated metadata. + /// + /// The .NET type that maps to the index schema. Instances of this type + /// can be retrieved as documents from the index. + /// Response containing the documents matching the query. + /// Cancellation token + private async IAsyncEnumerable> GetResultsAsync(SearchResults? searchResults, [EnumeratorCancellation] CancellationToken cancellationToken) where T : class + { + if (searchResults == null) + { + yield break; + } + + await foreach (SearchResult searchResult in searchResults.GetResultsAsync()) + { + yield return new AzureAIKernelSearchResult(searchResult); + } + } + + static private Dictionary? GetResultsMetadata(SearchResults? searchResults) where T : class + { + return new Dictionary() + { + { "Coverage", searchResults?.Coverage }, + }; + } + + /// + /// Index names cannot contain special chars. We use this rule to replace a few common ones + /// with an underscore and reduce the chance of errors. If other special chars are used, we leave it + /// to the service to throw an error. + /// Note: + /// - replacing chars introduces a small chance of conflicts, e.g. "the-user" and "the_user". + /// - we should consider whether making this optional and leave it to the developer to handle. + /// + private static readonly Regex s_replaceIndexNameSymbolsRegex = new(@"[\s|\\|/|.|_|:]"); + + /// + /// Normalize index name to match Azure AI Search rules. + /// The method doesn't handle all the error scenarios, leaving it to the service + /// to throw an error for edge cases not handled locally. + /// + /// Value to normalize + /// The name of the argument used with . + /// Normalized name + private string NormalizeIndexName(string indexName, [CallerArgumentExpression("indexName")] string? parameterName = null) + { + if (indexName.Length > 128) + { + throw new ArgumentOutOfRangeException(parameterName, "The collection name is too long, it cannot exceed 128 chars."); + } + +#pragma warning disable CA1308 // The service expects a lowercase string + indexName = indexName.ToLowerInvariant(); +#pragma warning restore CA1308 + + return s_replaceIndexNameSymbolsRegex.Replace(indexName.Trim(), "-"); + } + + #endregion +} diff --git a/dotnet/src/SemanticKernel.Abstractions/Search/ITextSearchService.cs b/dotnet/src/SemanticKernel.Abstractions/Search/ITextSearchService.cs new file mode 100644 index 000000000000..cfb196a84b86 --- /dev/null +++ b/dotnet/src/SemanticKernel.Abstractions/Search/ITextSearchService.cs @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System.Threading; +using System.Threading.Tasks; +using Microsoft.SemanticKernel.Services; + +namespace Microsoft.SemanticKernel.Search; + +/// +/// Interface for text search services +/// +public interface ITextSearchService : ISearchService +{ + /// + /// Perform a search for content related to the specified query. + /// + /// What to search for + /// Search execution settings + /// The to monitor for cancellation requests. The default is . + public Task> SearchAsync( + string query, + SearchExecutionSettings searchSettings, + CancellationToken cancellationToken = default) where T : class; +} diff --git a/dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResult.cs b/dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResult.cs new file mode 100644 index 000000000000..4abcf7b453e1 --- /dev/null +++ b/dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResult.cs @@ -0,0 +1,44 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace Microsoft.SemanticKernel.Search; + +/// +/// Represents a search result retrieved from a instance. +/// +public class KernelSearchResult +{ + /// + /// The inner content representation. Use this to bypass the current abstraction. + /// + /// + /// The usage of this property is considered "unsafe". Use it only if strictly necessary. + /// + [JsonIgnore] + public object? InnerContent { get; } + + /// + /// The metadata associated with the content. + /// + public IReadOnlyDictionary? Metadata { get; } + + /// + /// The search result value. + /// + public T Value { get; } + + /// + /// Initializes a new instance of the class. + /// + /// The search result value + /// The inner content representation + /// Metadata associated with the search results + public KernelSearchResult(T value, object? innerContent, IReadOnlyDictionary? metadata = null) + { + this.Value = value; + this.InnerContent = innerContent; + this.Metadata = metadata; + } +} diff --git a/dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResults.cs b/dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResults.cs new file mode 100644 index 000000000000..cbdc1dda0a04 --- /dev/null +++ b/dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResults.cs @@ -0,0 +1,52 @@ +// Copyright (c) Microsoft. All rights reserved. +using System.Collections.Generic; +using System.Text.Json.Serialization; +using Microsoft.SemanticKernel.Services; + +namespace Microsoft.SemanticKernel.Search; + +/// +/// Represents the search results returned from a service. +/// +public class KernelSearchResults +{ + /// + /// The total count of results found by the search operation, or null + /// if the count was not requested. + /// + public long? TotalCount { get; internal set; } + + /// + /// The inner content representation. Use this to bypass the current abstraction. + /// + /// + /// The usage of this property is considered "unsafe". Use it only if strictly necessary. + /// + [JsonIgnore] + public object? InnerContent { get; } + + /// + /// The metadata associated with the content. + /// + public IReadOnlyDictionary? Metadata { get; } + + /// + /// The search results. + /// + public IAsyncEnumerable> Results { get; } + + /// + /// Initializes a new instance of the class. + /// + /// The inner content representation + /// The search results + /// The total count of results found by the search operation, or null if the count was not requested + /// Metadata associated with the search results + public KernelSearchResults(object? innerContent, IAsyncEnumerable> results, long? totalCount = null, IReadOnlyDictionary? metadata = null) + { + this.InnerContent = innerContent; + this.Results = results; + this.TotalCount = totalCount; + this.Metadata = metadata; + } +} diff --git a/dotnet/src/SemanticKernel.Abstractions/Search/SearchExecutionSettings.cs b/dotnet/src/SemanticKernel.Abstractions/Search/SearchExecutionSettings.cs new file mode 100644 index 000000000000..74a30c89bca7 --- /dev/null +++ b/dotnet/src/SemanticKernel.Abstractions/Search/SearchExecutionSettings.cs @@ -0,0 +1,31 @@ +// Copyright (c) Microsoft. All rights reserved. +using System.Collections.Generic; +using System.Text.Json.Serialization; +using Microsoft.SemanticKernel.Services; + +namespace Microsoft.SemanticKernel.Search; + +/// +/// Provides execution settings for a search request. +/// +/// +/// Implementors of can extend this +/// if the service they are calling supports additional properties. +/// +public class SearchExecutionSettings +{ + /// + /// The name of the desired Search Index. + /// + [JsonPropertyName("index")] + public string Index { get; set; } = string.Empty; + + /// + /// Extra properties that may be included in the serialized execution settings. + /// + /// + /// Avoid using this property if possible. Instead, use one of the classes that extends . + /// + [JsonExtensionData] + public IDictionary? ExtensionData { get; set; } +} diff --git a/dotnet/src/SemanticKernel.Abstractions/Services/ISearchService.cs b/dotnet/src/SemanticKernel.Abstractions/Services/ISearchService.cs new file mode 100644 index 000000000000..6c54246d802b --- /dev/null +++ b/dotnet/src/SemanticKernel.Abstractions/Services/ISearchService.cs @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft. All rights reserved. +using System.Collections.Generic; + +namespace Microsoft.SemanticKernel.Services; + +/// +/// Represents a search service. +/// +public interface ISearchService +{ + /// + /// Gets the search service attributes. + /// + IReadOnlyDictionary Attributes { get; } +} From 5f6d5522fc5d831cc182174a02189650fc5bf576 Mon Sep 17 00:00:00 2001 From: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> Date: Mon, 15 Apr 2024 12:08:27 +0100 Subject: [PATCH 02/18] Add implementations for Google and Bing --- .../AzureAITextSearchService.cs | 4 ++-- .../Plugins.Web/Bing/BingTextSearchService.cs | 24 +++++++++++++++++++ .../Google/GoogleTextSearchService.cs | 24 +++++++++++++++++++ 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs create mode 100644 dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs index 8f7e7b0ab5f5..58245d9b4555 100644 --- a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs +++ b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs @@ -15,7 +15,7 @@ namespace Microsoft.SemanticKernel.Connectors.AzureAISearch; /// /// An Azure Search service that creates and recalls memories associated with text. /// -public class AzureAITextSearchService : ITextSearchService +public sealed class AzureAITextSearchService : ITextSearchService { /// public IReadOnlyDictionary Attributes => this._attributes; @@ -100,7 +100,7 @@ public AzureAITextSearchService(SearchIndexClient searchIndexClient) yield break; } - await foreach (SearchResult searchResult in searchResults.GetResultsAsync()) + await foreach (SearchResult searchResult in searchResults.GetResultsAsync().ConfigureAwait(false)) { yield return new AzureAIKernelSearchResult(searchResult); } diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs b/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs new file mode 100644 index 000000000000..a92130fa68c9 --- /dev/null +++ b/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.SemanticKernel.Search; + +namespace Microsoft.SemanticKernel.Plugins.Web.Bing; + +/// +/// A Bing Search service that creates and recalls memories associated with text. +/// +public sealed class BingTextSearchService : ITextSearchService +{ + /// + public IReadOnlyDictionary Attributes => throw new NotImplementedException(); + + /// + public Task> SearchAsync(string query, SearchExecutionSettings searchSettings, CancellationToken cancellationToken = default) where T : class + { + throw new NotImplementedException(); + } +} diff --git a/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs b/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs new file mode 100644 index 000000000000..f59234bb9c2d --- /dev/null +++ b/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System; +using System.Collections.Generic; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.SemanticKernel.Search; + +namespace Microsoft.SemanticKernel.Plugins.Web.Google; + +/// +/// A Google Search service that creates and recalls memories associated with text. +/// +public sealed class GoogleTextSearchService : ITextSearchService +{ + /// + public IReadOnlyDictionary Attributes => throw new NotImplementedException(); + + /// + public Task> SearchAsync(string query, SearchExecutionSettings searchSettings, CancellationToken cancellationToken = default) where T : class + { + throw new NotImplementedException(); + } +} From f1d1286d9745b443ca0259a9ec7c1a04b2520953 Mon Sep 17 00:00:00 2001 From: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> Date: Mon, 15 Apr 2024 17:18:28 +0100 Subject: [PATCH 03/18] Add basic Bing text search service --- .../KernelSyntaxExamples/Search/BingSearch.cs | 39 +++++- .../KernelSyntaxExamples/TestConfiguration.cs | 1 + .../AzureAITextSearchService.cs | 8 +- .../Bing/BingKernelSearchResult.cs | 29 +++++ .../Plugins.Web/Bing/BingTextSearchService.cs | 122 +++++++++++++++++- .../Plugins/Plugins.Web/Bing/BingWebPage.cs | 71 ++++++++++ .../Plugins.Web/Bing/TextSearchResponse.cs | 91 +++++++++++++ .../Google/GoogleTextSearchService.cs | 43 +++++- dotnet/src/Plugins/Plugins.Web/WebPage.cs | 6 +- 9 files changed, 401 insertions(+), 9 deletions(-) create mode 100644 dotnet/src/Plugins/Plugins.Web/Bing/BingKernelSearchResult.cs create mode 100644 dotnet/src/Plugins/Plugins.Web/Bing/BingWebPage.cs create mode 100644 dotnet/src/Plugins/Plugins.Web/Bing/TextSearchResponse.cs diff --git a/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs b/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs index d55898486925..d5c24dfb8679 100644 --- a/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs +++ b/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs @@ -1,6 +1,8 @@ // Copyright (c) Microsoft. All rights reserved. +using System.Text.Json.Serialization; using System.Threading.Tasks; using Examples; +using Microsoft.SemanticKernel.Plugins.Web.Bing; using Microsoft.SemanticKernel.Search; using Xunit; using Xunit.Abstractions; @@ -13,14 +15,49 @@ namespace Search; public sealed class BingSearch : BaseTest { /// - /// Show how to create a and use it to perform a text search. + /// Show how to create a and use it to perform a text search. /// [Fact] public async Task RunAsync() { + var query = "What is the Semantic Kernel?"; + + // Create a search service with Azure AI search + var searchService = new BingTextSearchService( + endpoint: TestConfiguration.Bing.Endpoint, + apiKey: TestConfiguration.Bing.ApiKey); + + // Create search settings for a semantic search with Bing search + var searchSettings = new SearchExecutionSettings + { + }; + + KernelSearchResults searchResults = await searchService.SearchAsync(query, searchSettings); + + // Show using the search results + await foreach (KernelSearchResult result in searchResults.Results) + { + WriteLine($"Title: {result.Value.Name}"); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + WriteLine(result.Value.Snippet); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + } } public BingSearch(ITestOutputHelper output) : base(output) { } + + /// + /// Represents a custom search result. + /// + public class CustomSearchResult + { + [JsonPropertyName("name")] + public string? Name { get; set; } + [JsonPropertyName("url")] + public string? Url { get; set; } + [JsonPropertyName("snippet")] + public string? Snippet { get; set; } + } } diff --git a/dotnet/samples/KernelSyntaxExamples/TestConfiguration.cs b/dotnet/samples/KernelSyntaxExamples/TestConfiguration.cs index 1689759ab763..6ad81706a87a 100644 --- a/dotnet/samples/KernelSyntaxExamples/TestConfiguration.cs +++ b/dotnet/samples/KernelSyntaxExamples/TestConfiguration.cs @@ -136,6 +136,7 @@ public class PineconeConfig public class BingConfig { + public string Endpoint { get; set; } = "https://api.bing.microsoft.com/v7.0/search"; public string ApiKey { get; set; } } diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs index 58245d9b4555..b9f3c20fbf39 100644 --- a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs +++ b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs @@ -87,7 +87,7 @@ public AzureAITextSearchService(SearchIndexClient searchIndexClient) private readonly IReadOnlyDictionary _attributes; /// - /// Return the search results and associated metadata. + /// Return the search results. /// /// The .NET type that maps to the index schema. Instances of this type /// can be retrieved as documents from the index. @@ -106,6 +106,12 @@ await foreach (SearchResult searchResult in searchResults.GetResultsAsync().C } } + /// + /// Return the results metadata. + /// + /// The .NET type that maps to the index schema. Instances of this type + /// can be retrieved as documents from the index. + /// Response containing the documents matching the query. static private Dictionary? GetResultsMetadata(SearchResults? searchResults) where T : class { return new Dictionary() diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/BingKernelSearchResult.cs b/dotnet/src/Plugins/Plugins.Web/Bing/BingKernelSearchResult.cs new file mode 100644 index 000000000000..831eedb804cb --- /dev/null +++ b/dotnet/src/Plugins/Plugins.Web/Bing/BingKernelSearchResult.cs @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System.Collections.Generic; +using Microsoft.SemanticKernel.Search; + +namespace Microsoft.SemanticKernel.Plugins.Web.Bing; + +/// +/// Bing implementation of . +/// +/// +public class BingKernelSearchResult : KernelSearchResult +{ + /// + /// Initializes a new instance of the class. + /// + public BingKernelSearchResult(WebPages webPages, T webPage) : base(webPage, webPages, GetResultsMetadata(webPages)) + { + } + + static private Dictionary? GetResultsMetadata(WebPages webPages) + { + return new Dictionary() + { + { "TotalEstimatedMatches", webPages.TotalEstimatedMatches }, + { "SomeResultsRemoved", webPages.SomeResultsRemoved }, + }; + } +} diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs b/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs index a92130fa68c9..128e3d44d6b4 100644 --- a/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs +++ b/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs @@ -2,8 +2,14 @@ using System; using System.Collections.Generic; +using System.Net.Http; +using System.Runtime.CompilerServices; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.SemanticKernel.Http; using Microsoft.SemanticKernel.Search; namespace Microsoft.SemanticKernel.Plugins.Web.Bing; @@ -14,11 +20,121 @@ namespace Microsoft.SemanticKernel.Plugins.Web.Bing; public sealed class BingTextSearchService : ITextSearchService { /// - public IReadOnlyDictionary Attributes => throw new NotImplementedException(); + public IReadOnlyDictionary Attributes => this._attributes; + + /// + /// Create an instance of the connector with API key authentication. + /// + /// Required. The URI endpoint of the Bing search service. The URI must use HTTPS. + /// Required. The API key credential used to authenticate requests against the Search service. + /// The HTTP client to use for making requests. + /// The to use for logging. If null, no logging will be performed. + public BingTextSearchService(string endpoint, string apiKey, HttpClient? httpClient = null, ILoggerFactory? loggerFactory = null) + { + Verify.NotNullOrWhiteSpace(endpoint); + Verify.NotNullOrWhiteSpace(apiKey); + + this._uri = new Uri(endpoint ?? DefaultUri); + this._apiKey = apiKey; + this._logger = loggerFactory?.CreateLogger(typeof(BingTextSearchService)) ?? NullLogger.Instance; + this._httpClient = httpClient ?? HttpClientProvider.GetHttpClient(); + this._httpClient.DefaultRequestHeaders.Add("User-Agent", HttpHeaderConstant.Values.UserAgent); + this._httpClient.DefaultRequestHeaders.Add(HttpHeaderConstant.Names.SemanticKernelVersion, HttpHeaderConstant.Values.GetAssemblyVersion(typeof(BingTextSearchService))); + + this._attributes = new Dictionary + { + }; + } /// - public Task> SearchAsync(string query, SearchExecutionSettings searchSettings, CancellationToken cancellationToken = default) where T : class + public async Task> SearchAsync(string query, SearchExecutionSettings searchSettings, CancellationToken cancellationToken = default) where T : class { - throw new NotImplementedException(); + using HttpResponseMessage response = await this.SendGetRequestAsync(query, 1, 0, cancellationToken).ConfigureAwait(false); + + this._logger.LogDebug("Response received: {StatusCode}", response.StatusCode); + + string json = await response.Content.ReadAsStringWithExceptionMappingAsync().ConfigureAwait(false); + + // Sensitive data, logging as trace, disabled by default + this._logger.LogTrace("Response content received: {Data}", json); + + var searchResponse = JsonSerializer.Deserialize>(json); + + return new KernelSearchResults(searchResponse, this.GetResultsAsync(searchResponse, cancellationToken), 1, GetResultsMetadata(searchResponse)); } + + #region private + + private readonly ILogger _logger; + private readonly HttpClient _httpClient; + private readonly string? _apiKey; + private readonly Uri? _uri = null; + private readonly IReadOnlyDictionary _attributes; + + private const string DefaultUri = "https://api.bing.microsoft.com/v7.0/search"; + + /// + /// Sends a GET request to the specified URI. + /// + /// The query string. + /// The number of results to return. + /// The index of the first result to return. + /// A cancellation token to cancel the request. + /// A representing the response from the request. + private async Task SendGetRequestAsync(string query, int count = 1, int offset = 0, CancellationToken cancellationToken = default) + { + if (count is <= 0 or >= 50) + { + throw new ArgumentOutOfRangeException(nameof(count), count, $"{nameof(count)} value must be greater than 0 and less than 50."); + } + + Uri uri = new($"{this._uri}?q={Uri.EscapeDataString(query.Trim())}&count={count}&offset={offset}"); + + using var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, uri); + + if (!string.IsNullOrEmpty(this._apiKey)) + { + httpRequestMessage.Headers.Add("Ocp-Apim-Subscription-Key", this._apiKey); + } + + return await this._httpClient.SendWithSuccessCheckAsync(httpRequestMessage, cancellationToken).ConfigureAwait(false); + } + + /// + /// Return the search results. + /// + /// The .NET type that maps to the index schema. Instances of this type + /// can be retrieved as documents from the index. + /// Response containing the web pages matching the query. + /// Cancellation token + private async IAsyncEnumerable> GetResultsAsync(TextSearchResponse? searchResponse, [EnumeratorCancellation] CancellationToken cancellationToken) where T : class + { + if (searchResponse is null || searchResponse.WebPages is null || searchResponse.WebPages.Value is null) + { + yield break; + } + + foreach (var webPage in searchResponse.WebPages.Value) + { + yield return new BingKernelSearchResult(searchResponse.WebPages, webPage); + await Task.Yield(); + } + } + + /// + /// Return the results metadata. + /// + /// The .NET type that maps to the index schema. Instances of this type + /// can be retrieved as documents from the index. + /// Response containing the documents matching the query. + private static Dictionary? GetResultsMetadata(TextSearchResponse? searchResponse) where T : class + { + return new Dictionary() + { + { "AlteredQuery", searchResponse?.QueryContext?.AlteredQuery }, + }; + } + + + #endregion } diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/BingWebPage.cs b/dotnet/src/Plugins/Plugins.Web/Bing/BingWebPage.cs new file mode 100644 index 000000000000..8873ed3f5b3c --- /dev/null +++ b/dotnet/src/Plugins/Plugins.Web/Bing/BingWebPage.cs @@ -0,0 +1,71 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System.Text.Json.Serialization; + +namespace Microsoft.SemanticKernel.Plugins.Web.Bing; + +/// +/// Defines a webpage that is relevant to the query. +/// +/// TODO: Update this class to match the response from the Bing Web Search API. +public class BingWebPage +{ + /// + /// The last time that Bing crawled the webpage. The date is in the form, YYYY-MM-DDTHH:MM:SS. For example, 2015-04-13T05:23:39. + /// + [JsonPropertyName("dateLastCrawled")] + public string? DateLastCrawled { get; set; } + + /// + /// An ID that uniquely identifies this webpage in the list of web results. + /// + /// + /// The object includes this field only if the Ranking answer specifies that you mix the webpages with the other search results. + /// Each webpage contains an ID that matches an ID in the Ranking answer. For more information, see Ranking results. + /// + [JsonPropertyName("id")] + public string? Id { get; set; } + + /// + /// A two-letter language code that identifies the language used by the webpage. For example, the language code is en for English. + /// + [JsonPropertyName("language")] + public string? Language { get; set; } + + /// + /// A Boolean value that indicates whether the webpage contains adult content. If the webpage doesn't contain adult content, isFamilyFriendly is set to true. + /// + [JsonPropertyName("isFamilyFriendly")] + public string? IsFamilyFriendly { get; set; } + + /// + /// A Boolean value that indicates whether the user’s query is frequently used for navigation to different parts of the webpage’s domain. + /// Is true if users navigate from this page to other parts of the website. + /// + [JsonPropertyName("isNavigational")] + public string? IsNavigational { get; set; } + + /// + /// The name of the webpage. + /// + /// + /// Use this name along with url to create a hyperlink that when clicked takes the user to the webpage. + /// + [JsonPropertyName("name")] + public string? Name { get; set; } + + /// + /// The URL to the webpage. + /// + /// + /// Use this URL along with name to create a hyperlink that when clicked takes the user to the webpage. + /// + [JsonPropertyName("url")] + public string? Url { get; set; } + + /// + /// A snippet of text from the webpage that describes its contents. + /// + [JsonPropertyName("snippet")] + public string? Snippet { get; set; } +} diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/TextSearchResponse.cs b/dotnet/src/Plugins/Plugins.Web/Bing/TextSearchResponse.cs new file mode 100644 index 000000000000..25545072048d --- /dev/null +++ b/dotnet/src/Plugins/Plugins.Web/Bing/TextSearchResponse.cs @@ -0,0 +1,91 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System.Collections.Generic; +using System.Text.Json.Serialization; + +namespace Microsoft.SemanticKernel.Plugins.Web.Bing; + +/// +/// Bing search response. +/// +internal class TextSearchResponse +{ + /// + /// Type hint, which is set to SearchResponse. + /// + [JsonPropertyName("_type")] + public string Type { get; set; } = string.Empty; + + /// + /// The query string that Bing used for the request. + /// + [JsonPropertyName("queryContext")] + public QueryContext? QueryContext { get; set; } + + /// + /// A nullable WebAnswer object containing the Web Search API response data. + /// + [JsonPropertyName("webPages")] + public WebPages? WebPages { get; set; } +} + +/// +/// The query string that Bing used for the request. +/// +internal class QueryContext +{ + /// + /// The query string as specified in the request. + /// + [JsonPropertyName("originalQuery")] + public string OriginalQuery { get; set; } = string.Empty; + + /// + /// The query string that Bing used to perform the query. Bing uses the altered query string if the original query string contained spelling mistakes. + /// For example, if the query string is saling downwind, the altered query string is sailing downwind. + /// + /// + /// The object includes this field only if the original query string contains a spelling mistake. + /// + [JsonPropertyName("alteredQuery")] + public string? AlteredQuery { get; set; } +} + +/// +/// A list of webpages that are relevant to the search query. +/// +public sealed class WebPages +{ + /// + /// An ID that uniquely identifies the web answer. + /// + /// + /// The object includes this field only if the Ranking answer suggests that you display all web results in a group. For more information about how to use the ID, see Ranking results. + /// + [JsonPropertyName("id")] + public string Id { get; set; } = string.Empty; + + /// + /// A Boolean value that indicates whether the response excluded some results from the answer. If Bing excluded some results, the value is true. + /// + [JsonPropertyName("someResultsRemoved")] + public bool SomeResultsRemoved { get; set; } + + /// + /// The estimated number of webpages that are relevant to the query. Use this number along with the count and offset query parameters to page the results. + /// + [JsonPropertyName("totalEstimatedMatches")] + public long TotalEstimatedMatches { get; set; } + + /// + /// The URL to the Bing search results for the requested webpages. + /// + [JsonPropertyName("webSearchUrl")] + public string WebSearchUrl { get; set; } = string.Empty; + + /// + /// A list of webpages that are relevant to the query. + /// + [JsonPropertyName("value")] + public IList? Value { get; set; } +} diff --git a/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs b/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs index f59234bb9c2d..64da4e285607 100644 --- a/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs +++ b/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs @@ -2,8 +2,13 @@ using System; using System.Collections.Generic; +using System.Net.Http; using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.SemanticKernel.Http; +using Microsoft.SemanticKernel.Plugins.Web.Bing; using Microsoft.SemanticKernel.Search; namespace Microsoft.SemanticKernel.Plugins.Web.Google; @@ -14,11 +19,47 @@ namespace Microsoft.SemanticKernel.Plugins.Web.Google; public sealed class GoogleTextSearchService : ITextSearchService { /// - public IReadOnlyDictionary Attributes => throw new NotImplementedException(); + public IReadOnlyDictionary Attributes => this._attributes; + + /// + /// Create an instance of the connector with API key authentication. + /// + /// Required. The URI endpoint of the Google search service. The URI must use HTTPS. + /// Required. The API key credential used to authenticate requests against the Search service. + /// The HTTP client to use for making requests. + /// The to use for logging. If null, no logging will be performed. + public GoogleTextSearchService(string endpoint, string apiKey, HttpClient? httpClient = null, ILoggerFactory? loggerFactory = null) + { + Verify.NotNullOrWhiteSpace(endpoint); + Verify.NotNullOrWhiteSpace(apiKey); + + this._uri = new Uri(endpoint ?? DefaultUri); + this._apiKey = apiKey; + this._logger = loggerFactory?.CreateLogger(typeof(BingTextSearchService)) ?? NullLogger.Instance; + this._httpClient = httpClient ?? HttpClientProvider.GetHttpClient(); + this._httpClient.DefaultRequestHeaders.Add("User-Agent", HttpHeaderConstant.Values.UserAgent); + this._httpClient.DefaultRequestHeaders.Add(HttpHeaderConstant.Names.SemanticKernelVersion, HttpHeaderConstant.Values.GetAssemblyVersion(typeof(BingTextSearchService))); + + this._attributes = new Dictionary + { + }; + } /// public Task> SearchAsync(string query, SearchExecutionSettings searchSettings, CancellationToken cancellationToken = default) where T : class { throw new NotImplementedException(); } + + #region private + + private readonly ILogger _logger; + private readonly HttpClient _httpClient; + private readonly string? _apiKey; + private readonly Uri? _uri = null; + private readonly IReadOnlyDictionary _attributes; + + private const string DefaultUri = "https://api.bing.microsoft.com/v7.0/search?q"; + + #endregion } diff --git a/dotnet/src/Plugins/Plugins.Web/WebPage.cs b/dotnet/src/Plugins/Plugins.Web/WebPage.cs index 3a227fc8a259..dff9a6053dc5 100644 --- a/dotnet/src/Plugins/Plugins.Web/WebPage.cs +++ b/dotnet/src/Plugins/Plugins.Web/WebPage.cs @@ -33,11 +33,11 @@ public sealed class WebPage /// /// A sealed class containing the deserialized response from the respective Web Search API. /// -/// A WebPages? object containing the WebPages array from a Search API response data or null. +/// A WebAnswer? object containing the WebAnswer array from a Search API response data or null. public sealed class WebSearchResponse { /// - /// A nullable WebPages object containing the Web Search API response data. + /// A nullable WebAnswer object containing the Web Search API response data. /// [JsonPropertyName("webPages")] public WebPages? WebPages { get; set; } @@ -46,7 +46,7 @@ public sealed class WebSearchResponse /// /// A sealed class containing the deserialized response from the Web respective Search API. /// -/// A WebPages array object containing the Web Search API response data. +/// A WebAnswer array object containing the Web Search API response data. [SuppressMessage("Performance", "CA1819:Properties should not return arrays", Justification = "Required by the Web Search API")] public sealed class WebPages { From e8bdf81981814280872a0edf1637c814f3d984b5 Mon Sep 17 00:00:00 2001 From: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> Date: Fri, 26 Apr 2024 10:14:38 +0100 Subject: [PATCH 04/18] Add decision drivers to the ADR --- ...service.md => 00NN-text-search-service.md} | 30 ++++++++++++++---- .../text-search-service-v1-design.mmd | 28 ++++++++++++++++ .../text-search-service-v1-design.png | Bin 0 -> 95722 bytes 3 files changed, 52 insertions(+), 6 deletions(-) rename docs/decisions/{0041-text-search-service.md => 00NN-text-search-service.md} (54%) create mode 100644 docs/decisions/diagrams/text-search-service-v1-design.mmd create mode 100644 docs/decisions/diagrams/text-search-service-v1-design.png diff --git a/docs/decisions/0041-text-search-service.md b/docs/decisions/00NN-text-search-service.md similarity index 54% rename from docs/decisions/0041-text-search-service.md rename to docs/decisions/00NN-text-search-service.md index 8ec562d1eea5..e3925565fdad 100644 --- a/docs/decisions/0041-text-search-service.md +++ b/docs/decisions/00NN-text-search-service.md @@ -3,7 +3,7 @@ status: proposed contact: markwallace date: {YYYY-MM-DD when the decision was last updated} -deciders: sergeymenshykh, markwallace, rbarreto, dmytrostruk +deciders: sergeymenshykh, markwallace, rbarreto, dmytrostruk, westey consulted: informed: stephentoub, matthewbolanos --- @@ -15,13 +15,31 @@ informed: stephentoub, matthewbolanos {Describe the context and problem statement, e.g., in free form using two to three sentences or in the form of an illustrative story. You may want to articulate the problem in form of a question and add links to collaboration boards or issue management systems.} - - ## Decision Drivers -- {decision driver 1, e.g., a force, facing concern, …} -- {decision driver 2, e.g., a force, facing concern, …} -- … +- An AI must be able to perform searches with a search plugin and get back “results” of type `T`. +- Application developers should be able to easily add a search plugin using a search connector with minimal lines of code (ideally one). +- Application developers must be able to provide connector specific settings. +- Application developers must be able to set required information e.g. `IndexName` for search providers. +- Application developers must to be able to override the semantic descriptions of the search function(s) per instance registered via settings / inputs. +- Application developers must be able to optionally define the execution settings of an embedding service with a default being provided by the Kernel. +- Application developers must be able to support custom schemas for search connectors. No fields should be required. +- Search service developers must be able to easily create a new search service that returns type `T`. +- Search service developers must be able to easily create a new search connector return type that inherits from `SearchResultContent`. +- Search service developers must be able to define the attributes of the search method (e.g., name, description, input names, input descriptions, return description). +- Application developers must be ab able to import a vector DB search connection using an ML index file. +- The design must be flexible to support future requirements and different search modalities. + +### Future Requirements + +- An AI can perform search with filters using a search plugin to get back “results” of type T. This will require a Connector Dev to implement a search interface that accepts a Filter object. +- Connector developers can decide which search filters are given to the AI by “default”. +- Application developers can override which filters the AI can use via search settings. +- Application developers can set the filters when they create the connection. + +### Current Design + +Current Memory Design ## Considered Options diff --git a/docs/decisions/diagrams/text-search-service-v1-design.mmd b/docs/decisions/diagrams/text-search-service-v1-design.mmd new file mode 100644 index 000000000000..d377835175ff --- /dev/null +++ b/docs/decisions/diagrams/text-search-service-v1-design.mmd @@ -0,0 +1,28 @@ +block-beta +columns 1 + block:Plugin + PluginAbstraction[["TextMemoryPlugin"]] + PluginDescription["Provides a plugin to save or recall information from the long or short term memory."] + end + space + block:SemanticMemory + SemanticMemoryAbstraction[["ISemanticTextMemory"]] + SemanticMemoryDescription["An interface for semantic memory that creates and recalls memories associated with text."] + end + space + block:Memory + MemoryAbstraction[["IMemoryStore"]] + MemoryDescription[" An interface for storing and retrieving indexed MemoryRecord objects in a data store."] + end + space + block:MemoryClient + MemoryClientAbstraction[["Memory Client"]] + MemoryClientDescription[" A database specific service client."] + end + Plugin-- "Uses the provided Semantic Memory implementation to recall text memories." -->SemanticMemory + SemanticMemory-- "Uses the provided Memory Store to query the database." -->Memory + Memory-- "Uses a Memory Client (if available) to interact with the database." -->MemoryClient + style PluginDescription fill:#FFF,stroke-width:0px + style SemanticMemoryDescription fill:#FFF,stroke-width:0px + style MemoryDescription fill:#FFF,stroke-width:0px + style MemoryClientDescription fill:#FFF,stroke-width:0px diff --git a/docs/decisions/diagrams/text-search-service-v1-design.png b/docs/decisions/diagrams/text-search-service-v1-design.png new file mode 100644 index 0000000000000000000000000000000000000000..6ffb7937ee6de2d2155fc678cb6659a561fd899a GIT binary patch literal 95722 zcmd43byQSu-!H6!fYPGUB`6}@Fu)+9gp?A}4bn&q9U~xMz|bKugfvJ=2+|-7f^@^s z(hU+r&3n!7e(v+!=lprryViNuLU5SP-m|ax#wYfN7itQmH|cI(xpIY6N%5)1l`BMv zSFT)(B_aU7Dbeu713#|1X(&9oQqs$?243J>%c{y=xl$fUd~S9fyuRVAsONU&3hgNF z-&LA{uB|IqusKRkWwpGFH>a;BF+7`jyVqrQl`M$y7J7OMn(D0ROrFpj(qOtBr2E(_*m$%@Mx?c|CF_E( ze<#h>!Pahl=+W>=>IrgLx~_!@js3)VE>^RKMguZfx+xa!@I+Pll_ca4u#bONONB z;z;|l^vLXg8!nA**cQZo<9gz|UDYJ>k9zdRHbJs1|1lm)ht|XS^To`DgT+$}qw84L=>6e2JAk9Wi}4Zcgz z8QVN5uu_cC;$oY*xF1e))O2pbdVYEKruIPHdoMO5z4*_L`A%lRaRvC+)Qxc}P6$r$ zqYl|g^daxLn2!6acR6-qjd6d_ClmYc@#fhB!w~v1D>SUc$eJ`(4dQ<}vVa=_cQ5=z zwBL*;ritDCl~AA1%W=y{&I7no%<#;EZs`X$UXT7+n_6P>E7&(_V5Mj8J-^ATmv#Kx z>~w;or)jdXFAPhw%`Euk%Z_3pDMH%$JpR*;itqpyclHs=Ams=pfgv!68rXW>|B2EW}Bv#qMcf|Hix%d^>?1LZ)gkNP-TAPc z6%*PqzNYhA2+8d^=hHRRvdPQ)X+G=GWxpO2A+(u%jtqGnzEAtiN6C4Rf1ef=4rjVB zx*URM)MxK|?Eg|&HgS}h^%r}@;PP|E#pIz_410l_@1JOe*21C^x&*z~pF2>l-8|Hz z25%b5&bI5qGUdXSOUOGKLJJf;r`>hXi4DgylHqhBkFa*$2&w(fnw`4sAND7gXQy>( zrPPNBYCON(Z2fk3;8;nf3j43+@?L8>iTkCOnK`JxVax$E)f2B%%C>)Ogi@RM31ICU z&rcR3&35Nn%-TrB!l!D^_q)TSkH*>jE)K^q>iHB~dcg#wH@Uu+J)z+@eM}?tTICXX zdI;8Kh~#z++u!vOE@Sv^h6?ylz8LlJba5sLUd}Uyyu)VuoYUP2>+}#+v1#Gu_I7HM zRJeA`Bmx(9-CxL@@6Mvhcj?U^KXJRt!zS-X(|BTT>9rW4vtJs%F{Ca-wo`u~zm27Q z7R)kSnGU~{SXR0l!Jd8gi4RKEE4dR#Gv@{lZYN0hIqc%%dq-{T1=;Sd=z~Usi-0|0 z*mi#0v}oKG&LANub?{qgK2B5Z2E9X>Y|VP%X=5m6K8(2)={ZAtyi_%2OuW-%0?F4$ z%K0uyY}Cz%(wlRnAnoa9rT_NJ&2N35B?H&@_S&vp*)OeTkfqE^^RW|ONp)-GNcX#C za&|ao(pEX7MxP7Tz{&B+yT2?iR-5t2!x_7C{Px#!4fL1owthnOeXZ1pbeUOcIew7huz&J-)MLArqaCGV z;vWsq5tnDj%ms%sukqFIYMs|5fvMskc(R+18qk5n7?k8I3PvuTV!R#jB5-YsDN7e}8_1s}t5s$1{5 zl@8r(arLB~StDloQ{WZ!GZQX+MQ7*&L*+`EZzxBa*F7ki#Gk0~*Fuf83m>^!GsBoB zH*J{Um~N9+$i`Qy2Wegl=$+G?R^cI)Sa=?kG77d7uhX$&;8bhnbuu4Dk7s~AUy(tL zNoFOQ1V|uS00aOu%xYFiDs`z};yVX(zK5gzdu`;iVPNk|LE$S%F=c`*e)H=xb_x-v5B$K+#^`8A z*ydd*bCV18j!P5VJKXRzT%E=K)`coA`tCFo3#hO6#A$jE;}N7%IW=PDX>PMA#dI*k zp7)3^hG+U7Z`W?TWty*9L=ao2dB3jLOtq&8Qmc_{Fs3AtL*4fL;khx&gDr#z9T?h~ zRP=}%)SRvtEk1mr%v)=DIg((e6_%GC07>%{r*;HMSwJ_4P}b^E#8G~u|5?Xl2KjcD zo^{%+BK~W)1Nl|j70Tw)FaPF=yMijGP#t&o!@nqhHrue9uBV92`iVgMPER-Z+BQnD z98l~Yin(=ne(@MxU2OK@egdg|ah0s!CD`2W$YmU6Gbd@0%fE#piQ7UO;^EI?*li8F zdFvcf?-Hu0&cTH2$W;hk2A)y37cjBAJB244j_8=QuT=CxHoPP>ew{2VM#>DZFCpk7uSZ){Cd-2Ys#0fq9|D z)%ubpk&Zi4ov%w<$fpWk=Sox`>e>NLtG zRQ1K#tmnIFkEsV=>$dmz%EyfTTZQ_hUhRjm%+{?JDleRB>Q|^#M{aS)4I=ua&v%

JGq{k%W1xsCo)&1LTt5fc3VqlTa>ST99KVT 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 Date: Sat, 27 Apr 2024 21:28:32 +0100 Subject: [PATCH 05/18] Google search service --- .../Bing/BingKernelSearchResult.cs | 12 +- .../Plugins.Web/Bing/BingTextSearchService.cs | 2 - .../Google/GoogleKernelSearchResult.cs | 24 ++++ .../Google/GoogleTextSearchService.cs | 129 +++++++++++++++--- 4 files changed, 135 insertions(+), 32 deletions(-) create mode 100644 dotnet/src/Plugins/Plugins.Web/Google/GoogleKernelSearchResult.cs diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/BingKernelSearchResult.cs b/dotnet/src/Plugins/Plugins.Web/Bing/BingKernelSearchResult.cs index 831eedb804cb..3b0a1639ebef 100644 --- a/dotnet/src/Plugins/Plugins.Web/Bing/BingKernelSearchResult.cs +++ b/dotnet/src/Plugins/Plugins.Web/Bing/BingKernelSearchResult.cs @@ -9,15 +9,11 @@ namespace Microsoft.SemanticKernel.Plugins.Web.Bing; /// Bing implementation of . /// /// -public class BingKernelSearchResult : KernelSearchResult +/// +/// Initializes a new instance of the class. +/// +public class BingKernelSearchResult(WebPages webPages, T webPage) : KernelSearchResult(webPage, webPages, GetResultsMetadata(webPages)) { - ///

- /// Initializes a new instance of the class. - /// - public BingKernelSearchResult(WebPages webPages, T webPage) : base(webPage, webPages, GetResultsMetadata(webPages)) - { - } - static private Dictionary? GetResultsMetadata(WebPages webPages) { return new Dictionary() diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs b/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs index 128e3d44d6b4..036dd9cb9c5f 100644 --- a/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs +++ b/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs @@ -134,7 +134,5 @@ private async Task SendGetRequestAsync(string query, int co { "AlteredQuery", searchResponse?.QueryContext?.AlteredQuery }, }; } - - #endregion } diff --git a/dotnet/src/Plugins/Plugins.Web/Google/GoogleKernelSearchResult.cs b/dotnet/src/Plugins/Plugins.Web/Google/GoogleKernelSearchResult.cs new file mode 100644 index 000000000000..6e80280b16f3 --- /dev/null +++ b/dotnet/src/Plugins/Plugins.Web/Google/GoogleKernelSearchResult.cs @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System.Collections.Generic; +using Microsoft.SemanticKernel.Search; + +namespace Microsoft.SemanticKernel.Plugins.Web.Google; + +/// +/// Google implementation of . +/// +/// +/// +/// Initializes a new instance of the class. +/// +public class GoogleKernelSearchResult(T item, global::Google.Apis.CustomSearchAPI.v1.Data.Search searchResponse) : KernelSearchResult(item, searchResponse, GetResultsMetadata(searchResponse)) +{ + static private Dictionary? GetResultsMetadata(global::Google.Apis.CustomSearchAPI.v1.Data.Search searchResponse) + { + return new Dictionary() + { + { "ETag", searchResponse.ETag }, + }; + } +} diff --git a/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs b/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs index 64da4e285607..758cb0179c08 100644 --- a/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs +++ b/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs @@ -2,13 +2,13 @@ using System; using System.Collections.Generic; -using System.Net.Http; +using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; +using Google.Apis.CustomSearchAPI.v1; +using Google.Apis.Services; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; -using Microsoft.SemanticKernel.Http; -using Microsoft.SemanticKernel.Plugins.Web.Bing; using Microsoft.SemanticKernel.Search; namespace Microsoft.SemanticKernel.Plugins.Web.Google; @@ -16,29 +16,42 @@ namespace Microsoft.SemanticKernel.Plugins.Web.Google; /// /// A Google Search service that creates and recalls memories associated with text. /// -public sealed class GoogleTextSearchService : ITextSearchService +public sealed class GoogleTextSearchService : ITextSearchService, IDisposable { /// public IReadOnlyDictionary Attributes => this._attributes; /// - /// Create an instance of the connector with API key authentication. + /// Initializes a new instance of the class. /// - /// Required. The URI endpoint of the Google search service. The URI must use HTTPS. - /// Required. The API key credential used to authenticate requests against the Search service. - /// The HTTP client to use for making requests. + /// Google Custom Search API (looks like "ABcdEfG1...") + /// Google Search Engine ID (looks like "a12b345...") /// The to use for logging. If null, no logging will be performed. - public GoogleTextSearchService(string endpoint, string apiKey, HttpClient? httpClient = null, ILoggerFactory? loggerFactory = null) + public GoogleTextSearchService( + string apiKey, + string searchEngineId, + ILoggerFactory? loggerFactory = null) : this(new BaseClientService.Initializer { ApiKey = apiKey }, searchEngineId, loggerFactory) { - Verify.NotNullOrWhiteSpace(endpoint); Verify.NotNullOrWhiteSpace(apiKey); + } - this._uri = new Uri(endpoint ?? DefaultUri); - this._apiKey = apiKey; - this._logger = loggerFactory?.CreateLogger(typeof(BingTextSearchService)) ?? NullLogger.Instance; - this._httpClient = httpClient ?? HttpClientProvider.GetHttpClient(); - this._httpClient.DefaultRequestHeaders.Add("User-Agent", HttpHeaderConstant.Values.UserAgent); - this._httpClient.DefaultRequestHeaders.Add(HttpHeaderConstant.Names.SemanticKernelVersion, HttpHeaderConstant.Values.GetAssemblyVersion(typeof(BingTextSearchService))); + /// + /// Initializes a new instance of the class. + /// + /// The connector initializer + /// Google Search Engine ID (looks like "a12b345...") + /// The to use for logging. If null, no logging will be performed. + public GoogleTextSearchService( + BaseClientService.Initializer initializer, + string searchEngineId, + ILoggerFactory? loggerFactory = null) + { + Verify.NotNull(initializer); + Verify.NotNullOrWhiteSpace(searchEngineId); + + this._search = new CustomSearchAPIService(initializer); + this._searchEngineId = searchEngineId; + this._logger = loggerFactory?.CreateLogger(typeof(GoogleConnector)) ?? NullLogger.Instance; this._attributes = new Dictionary { @@ -46,20 +59,92 @@ public GoogleTextSearchService(string endpoint, string apiKey, HttpClient? httpC } /// - public Task> SearchAsync(string query, SearchExecutionSettings searchSettings, CancellationToken cancellationToken = default) where T : class + public async Task> SearchAsync(string query, SearchExecutionSettings searchSettings, CancellationToken cancellationToken = default) where T : class + { + var searchResponse = await this.ExecuteSearchAsync(query, 1, 0, cancellationToken).ConfigureAwait(false); + + return new KernelSearchResults(searchResponse, this.GetResultsAsync(searchResponse, cancellationToken), 1, GetResultsMetadata(searchResponse)); + } + + /// + public void Dispose() { - throw new NotImplementedException(); + this._search.Dispose(); } #region private private readonly ILogger _logger; - private readonly HttpClient _httpClient; - private readonly string? _apiKey; - private readonly Uri? _uri = null; + private readonly CustomSearchAPIService _search; + private readonly string? _searchEngineId; private readonly IReadOnlyDictionary _attributes; - private const string DefaultUri = "https://api.bing.microsoft.com/v7.0/search?q"; + /// + /// Execute a Google search + /// + /// The query string. + /// The number of results to return. + /// The index of the first result to return. + /// A cancellation token to cancel the request. + /// + /// + private async Task ExecuteSearchAsync(string query, int count, int offset, CancellationToken cancellationToken) + { + if (count is <= 0 or > 10) + { + throw new ArgumentOutOfRangeException(nameof(count), count, $"{nameof(count)} value must be must be greater than 0 and less than or equals 10."); + } + + if (offset < 0) + { + throw new ArgumentOutOfRangeException(nameof(offset)); + } + + var search = this._search.Cse.List(); + search.Cx = this._searchEngineId; + search.Q = query; + search.Num = count; + search.Start = offset; + + return await search.ExecuteAsync(cancellationToken).ConfigureAwait(false); + } + + /// + /// Return the search results. + /// + /// Google search response + /// Cancellation token + private async IAsyncEnumerable> GetResultsAsync(global::Google.Apis.CustomSearchAPI.v1.Data.Search searchResponse, [EnumeratorCancellation] CancellationToken cancellationToken) + { + if (searchResponse is null || searchResponse.Items is null) + { + yield break; + } + + foreach (var item in searchResponse.Items) + { + if (item is T itemT) + { + yield return new GoogleKernelSearchResult(itemT, searchResponse); + } + else + { + throw new NotSupportedException($"Type {typeof(T)} is not supported."); + } + await Task.Yield(); + } + } + + /// + /// Return the results metadata. + /// + /// Google search response + private static Dictionary? GetResultsMetadata(global::Google.Apis.CustomSearchAPI.v1.Data.Search searchResponse) + { + return new Dictionary() + { + }; + } #endregion } From 280d969f17a874ace791c964b72ecd2a78754523 Mon Sep 17 00:00:00 2001 From: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> Date: Mon, 29 Apr 2024 16:29:35 +0100 Subject: [PATCH 06/18] Try to eliminate KernelSearchResult --- docs/decisions/00NN-text-search-service.md | 45 +++++++++++-- ...d => text-search-service-imemorystore.mmd} | 0 ...g => text-search-service-imemorystore.png} | Bin ...arch-service-iwebsearchengineconnector.mmd | 23 +++++++ ...arch-service-iwebsearchengineconnector.png | Bin 0 -> 104277 bytes .../diagrams/text-search-service-option-1.mmd | 60 ++++++++++++++++++ .../diagrams/text-search-service-option-1.png | Bin 0 -> 72909 bytes .../Search/AzureAISearch.cs | 22 ++++--- .../KernelSyntaxExamples/Search/BingSearch.cs | 33 +++++++--- .../AzureAISearchExecutionSettings.cs | 3 +- .../AzureAITextSearchService.cs | 15 ++++- .../Bing/BingKernelSearchResult.cs | 4 +- ...earchResponse.cs => BingSearchResponse.cs} | 13 ++-- .../Plugins.Web/Bing/BingTextSearchService.cs | 37 +++++++++-- .../Plugins/Plugins.Web/Bing/BingWebPage.cs | 20 +++++- .../Google/GoogleTextSearchService.cs | 7 +- .../Search/ITextSearchService.cs | 6 +- .../Search/SearchExecutionSettings.cs | 12 ++++ 18 files changed, 254 insertions(+), 46 deletions(-) rename docs/decisions/diagrams/{text-search-service-v1-design.mmd => text-search-service-imemorystore.mmd} (100%) rename docs/decisions/diagrams/{text-search-service-v1-design.png => text-search-service-imemorystore.png} (100%) create mode 100644 docs/decisions/diagrams/text-search-service-iwebsearchengineconnector.mmd create mode 100644 docs/decisions/diagrams/text-search-service-iwebsearchengineconnector.png create mode 100644 docs/decisions/diagrams/text-search-service-option-1.mmd create mode 100644 docs/decisions/diagrams/text-search-service-option-1.png rename dotnet/src/Plugins/Plugins.Web/Bing/{TextSearchResponse.cs => BingSearchResponse.cs} (87%) diff --git a/docs/decisions/00NN-text-search-service.md b/docs/decisions/00NN-text-search-service.md index e3925565fdad..21eed93f64c6 100644 --- a/docs/decisions/00NN-text-search-service.md +++ b/docs/decisions/00NN-text-search-service.md @@ -39,11 +39,38 @@ You may want to articulate the problem in form of a question and add links to co ### Current Design -Current Memory Design +The current design for search is divided into two implementations: + +1. Search using a Memory Store i.e. Vector Database +1. Search using a Web Search Engine + +In each case a plugin implementation is provided which allows the search to be integrated into prompts e.g. to provide additional context or to be called from a planner or using auto function calling with a LLM. + +#### Memory Store Search + +The diagram below shows the layers in the current design of the Memory Store search functionality. + +Current Memory Design + +#### Web Search Engine Integration + +The diagram below shows the layers in the current design of the Web Search Engine integration. + +Current Web Search Design + +The Semantic Kernel currently includes experimental support for a `WebSearchEnginePlugin` which can be configured via a `IWebSearchEngineConnector` to integrate with a Web Search Services such as Bing or Google. The search results can be returned as a collection of string values or a collection of `WebPage` instances. + +- The `string` values returned from the plugin represent a snippet of the search result in plain text. +- The `WebPage` instances returned from the plugin are a normalized subset of a complete search result. Each `WebPage` incudes: + - `name` The name of the search result web page + - `url` The url of the search result web page + - `snippet` A snippet of the search result in plain text + +The current design doesn't support break glass scenario's or using custom types for the response values. ## Considered Options -- {title of option 1} +- Option 1 - {title of option 2} - {title of option 3} - … @@ -71,11 +98,19 @@ Chosen option: "{title of option 1}", because ## Pros and Cons of the Options -### {title of option 1} +### Option 1 - +The class diagram below shows the first option. +Current Memory Design -{example | description | pointer to more information | …} +- `IISearchService` is the base interface for all search services and just stores attributes for the service +- `ITextSearchService` is the interface for text based search services. This cna be invoked with a text query to return a collection of search results. +- `SearchExecutionSettings` provides execution settings for a search service. Some common settings e.g. `IndexName`, `Count`, `Offset` are defined. +- `KernelSearchResults` represents the search results returned from a `ISearchService` service. This provides access to the individual search results, underlying search result, metadata, ... This supports generics but an implementation can restrict the supported types. All implementations will support `string`, `KernelSearchResult` and whatever native types the connector implementation supports. + + + +Evaluation - Good, because {argument a} - Good, because {argument b} diff --git a/docs/decisions/diagrams/text-search-service-v1-design.mmd b/docs/decisions/diagrams/text-search-service-imemorystore.mmd similarity index 100% rename from docs/decisions/diagrams/text-search-service-v1-design.mmd rename to docs/decisions/diagrams/text-search-service-imemorystore.mmd diff --git a/docs/decisions/diagrams/text-search-service-v1-design.png b/docs/decisions/diagrams/text-search-service-imemorystore.png similarity index 100% rename from docs/decisions/diagrams/text-search-service-v1-design.png rename to docs/decisions/diagrams/text-search-service-imemorystore.png diff --git a/docs/decisions/diagrams/text-search-service-iwebsearchengineconnector.mmd b/docs/decisions/diagrams/text-search-service-iwebsearchengineconnector.mmd new file mode 100644 index 000000000000..817649347020 --- /dev/null +++ b/docs/decisions/diagrams/text-search-service-iwebsearchengineconnector.mmd @@ -0,0 +1,23 @@ +block-beta +columns 1 + block:Plugin + PluginAbstraction[["WebSearchEnginePlugin"]] + PluginDescription["Provides a plugin to perform a web search."] + end + space + block:Connector + ConnectorAbstraction[["IWebSearchEngineConnector"]] + ConnectorDescription["An interface for a web search engine connector.
Returns either search result summaries or a normalised WebPage instance."] + end + space + block:Service + ServiceType[["Web Search Service"]] + ServiceDescription["A web search service e.g. Bing, Google, ..."] + end + + Plugin-- "Uses the provided IWebSearchEngineConnector implementation to invoke a web search engine." -->Connector + Connector-- "Invokes the web search engine using REST or a service client." -->Service + + style PluginDescription fill:#FFF,stroke-width:0px + style ConnectorDescription fill:#FFF,stroke-width:0px + style ServiceDescription fill:#FFF,stroke-width:0px diff --git a/docs/decisions/diagrams/text-search-service-iwebsearchengineconnector.png b/docs/decisions/diagrams/text-search-service-iwebsearchengineconnector.png new file mode 100644 index 0000000000000000000000000000000000000000..4cda46613f98f34736950e4731cb2517f0416a33 GIT binary patch literal 104277 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 + SearchAsync~T~(query, searchSettings, cancellationToken) Task~KernelSearchResults~T~~ + } + + class ISearchService { + <> + +IReadOnlyDictionary Attributes + } + + class SearchExecutionSettings { + +string Index + +int Count + +int Offset + +IDictionary ExtensionData + } + } + + ITextSearchService ..> SearchExecutionSettings + ITextSearchService ..> KernelSearchResults + ITextSearchService --|> ISearchService + BingTextSearchService --|> ITextSearchService + GoogleTextSearchService --|> ITextSearchService + AzureAISearchService --|> ITextSearchService + AzureAISearchExecutionSettings --|> SearchExecutionSettings + diff --git a/docs/decisions/diagrams/text-search-service-option-1.png b/docs/decisions/diagrams/text-search-service-option-1.png new file mode 100644 index 0000000000000000000000000000000000000000..882b0df118b02fc681e1f429eedec1d121682670 GIT binary patch literal 72909 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 NMtWwtRoWM${s$&m9vlDw literal 0 HcmV?d00001 diff --git a/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs b/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs index f8c706d788f8..751d4754e0cd 100644 --- a/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs +++ b/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs @@ -22,21 +22,15 @@ public sealed class AzureAISearch : BaseTest public async Task RunAsync() { var query = "What is the Semantic Kernel?"; + var IndexName = TestConfiguration.AzureAISearch.IndexName; // Create a search service with Azure AI search var searchService = new AzureAITextSearchService( endpoint: TestConfiguration.AzureAISearch.Endpoint, adminKey: TestConfiguration.AzureAISearch.ApiKey); - // Create search settings for a semantic search with Azure AI search - var searchSettings = new AzureAISearchExecutionSettings - { - Index = TestConfiguration.AzureAISearch.IndexName - }; - - KernelSearchResults searchResults = await searchService.SearchAsync(query, searchSettings); - - // Show using the search results + // Search with a custom search result type + KernelSearchResults searchResults = await searchService.SearchAsync(query, new() { Index = IndexName, Count = 2, Offset = 2 }); await foreach (KernelSearchResult result in searchResults.Results) { WriteLine($"Title: {result.Value.Title}"); @@ -45,6 +39,16 @@ await foreach (KernelSearchResult result in searchResults.Re WriteLine(result.Value.Chunk); WriteLine("------------------------------------------------------------------------------------------------------------------"); } + + // Search for just the summaries + /* + KernelSearchResults summaryResults = await searchService.SearchAsync(query, new() { Index = IndexName, Count = 2, Offset = 2 }); + await foreach (KernelSearchResult result in summaryResults.Results) + { + WriteLine(result.Value); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + } + */ } public AzureAISearch(ITestOutputHelper output) : base(output) diff --git a/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs b/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs index d5c24dfb8679..9b43186bc1cf 100644 --- a/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs +++ b/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs @@ -1,4 +1,5 @@ // Copyright (c) Microsoft. All rights reserved. +using System; using System.Text.Json.Serialization; using System.Threading.Tasks; using Examples; @@ -27,19 +28,35 @@ public async Task RunAsync() endpoint: TestConfiguration.Bing.Endpoint, apiKey: TestConfiguration.Bing.ApiKey); - // Create search settings for a semantic search with Bing search - var searchSettings = new SearchExecutionSettings + // Search with a custom search result type + KernelSearchResults searchResults = await searchService.SearchAsync(query, new() { Count = 2 }); + await foreach (KernelSearchResult result in searchResults.Results) { - }; + WriteLine($"Title: {result.Value.Name}"); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + WriteLine(result.Value.Snippet); + WriteLine(result.Value.Url); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + } - KernelSearchResults searchResults = await searchService.SearchAsync(query, searchSettings); + // Search for just the summaries + KernelSearchResults summaryResults = await searchService.SearchAsync(query, new() { Count = 2, Offset = 2 }); + await foreach (KernelSearchResult result in summaryResults.Results) + { + WriteLine(result.Value); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + } - // Show using the search results - await foreach (KernelSearchResult result in searchResults.Results) + // Search with a the default result type + KernelSearchResults fullResults = await searchService.SearchAsync(query, new() { Count = 2, Offset = 4 }); + await foreach (KernelSearchResult result in fullResults.Results) { - WriteLine($"Title: {result.Value.Name}"); + WriteLine($"Name: {result.Value.Name}"); WriteLine("------------------------------------------------------------------------------------------------------------------"); WriteLine(result.Value.Snippet); + WriteLine(result.Value.Url); + WriteLine(result.Value.DisplayUrl); + WriteLine(result.Value.DateLastCrawled); WriteLine("------------------------------------------------------------------------------------------------------------------"); } } @@ -56,7 +73,7 @@ public class CustomSearchResult [JsonPropertyName("name")] public string? Name { get; set; } [JsonPropertyName("url")] - public string? Url { get; set; } + public Uri? Url { get; set; } [JsonPropertyName("snippet")] public string? Snippet { get; set; } } diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs index 14a9d1ab5892..dc1ec8091cf2 100644 --- a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs +++ b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs @@ -25,7 +25,8 @@ public class AzureAISearchExecutionSettings : SearchExecutionSettings { QueryType = SearchQueryType.Simple, IncludeTotalCount = true, - Size = 10, + Size = this.Count, + Skip = this.Offset, }; return this._searchOptions; } diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs index b9f3c20fbf39..d5cb28a021a7 100644 --- a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs +++ b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft. All rights reserved. using System; using System.Collections.Generic; +using System.Linq; using System.Runtime.CompilerServices; using System.Text.RegularExpressions; using System.Threading; @@ -68,17 +69,25 @@ public AzureAITextSearchService(SearchIndexClient searchIndexClient) var azureSearchSettings = AzureAISearchExecutionSettings.FromExecutionSettings(searchSettings); - SearchResults? searchResults = null; + //SearchResults? searchResults = null; try { - searchResults = await searchClient.SearchAsync(query, azureSearchSettings.SearchOptions, cancellationToken).ConfigureAwait(true); + if (typeof(T) == typeof(string)) + { + var searchDocuments = await searchClient.SearchAsync(query, azureSearchSettings.SearchOptions, cancellationToken).ConfigureAwait(true); + } + else + { + SearchResults? searchResults = await searchClient.SearchAsync(query, azureSearchSettings.SearchOptions, cancellationToken).ConfigureAwait(true); + return new KernelSearchResults(searchResults, this.GetResultsAsync(searchResults, cancellationToken), searchResults?.TotalCount, GetResultsMetadata(searchResults)); + } } catch (HttpOperationException e) when (e.StatusCode == System.Net.HttpStatusCode.NotFound) { // index not found, no data to return } - return new KernelSearchResults(searchResults, this.GetResultsAsync(searchResults, cancellationToken), searchResults?.TotalCount, GetResultsMetadata(searchResults)); + return new KernelSearchResults(null, AsyncEnumerable.Empty>(), 0, null); } #region private diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/BingKernelSearchResult.cs b/dotnet/src/Plugins/Plugins.Web/Bing/BingKernelSearchResult.cs index 3b0a1639ebef..51f725ca6ce0 100644 --- a/dotnet/src/Plugins/Plugins.Web/Bing/BingKernelSearchResult.cs +++ b/dotnet/src/Plugins/Plugins.Web/Bing/BingKernelSearchResult.cs @@ -12,9 +12,9 @@ namespace Microsoft.SemanticKernel.Plugins.Web.Bing; /// /// Initializes a new instance of the class. /// -public class BingKernelSearchResult(WebPages webPages, T webPage) : KernelSearchResult(webPage, webPages, GetResultsMetadata(webPages)) +internal class BingKernelSearchResult(BingWebPages webPages, T webPage) : KernelSearchResult(webPage, webPages, GetResultsMetadata(webPages)) { - static private Dictionary? GetResultsMetadata(WebPages webPages) + static private Dictionary? GetResultsMetadata(BingWebPages webPages) { return new Dictionary() { diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/TextSearchResponse.cs b/dotnet/src/Plugins/Plugins.Web/Bing/BingSearchResponse.cs similarity index 87% rename from dotnet/src/Plugins/Plugins.Web/Bing/TextSearchResponse.cs rename to dotnet/src/Plugins/Plugins.Web/Bing/BingSearchResponse.cs index 25545072048d..98e92543d225 100644 --- a/dotnet/src/Plugins/Plugins.Web/Bing/TextSearchResponse.cs +++ b/dotnet/src/Plugins/Plugins.Web/Bing/BingSearchResponse.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft. All rights reserved. using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Text.Json.Serialization; namespace Microsoft.SemanticKernel.Plugins.Web.Bing; @@ -8,7 +9,7 @@ namespace Microsoft.SemanticKernel.Plugins.Web.Bing; ///

/// Bing search response. /// -internal class TextSearchResponse +internal class BingSearchResponse { /// /// Type hint, which is set to SearchResponse. @@ -20,19 +21,19 @@ internal class TextSearchResponse /// The query string that Bing used for the request. /// [JsonPropertyName("queryContext")] - public QueryContext? QueryContext { get; set; } + public BingQueryContext? QueryContext { get; set; } /// /// A nullable WebAnswer object containing the Web Search API response data. /// [JsonPropertyName("webPages")] - public WebPages? WebPages { get; set; } + public BingWebPages? WebPages { get; set; } } /// /// The query string that Bing used for the request. /// -internal class QueryContext +internal class BingQueryContext { /// /// The query string as specified in the request. @@ -54,7 +55,9 @@ internal class QueryContext /// /// A list of webpages that are relevant to the search query. /// -public sealed class WebPages +[SuppressMessage("Performance", "CA1056:Change the type of parameter 'uri'...", +Justification = "A constant Uri cannot be defined, as required by this class")] +internal sealed class BingWebPages { /// /// An ID that uniquely identifies the web answer. diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs b/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs index 036dd9cb9c5f..a2dd6525ef4f 100644 --- a/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs +++ b/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Net.Http; using System.Runtime.CompilerServices; using System.Text.Json; @@ -47,9 +48,12 @@ public BingTextSearchService(string endpoint, string apiKey, HttpClient? httpCli } /// - public async Task> SearchAsync(string query, SearchExecutionSettings searchSettings, CancellationToken cancellationToken = default) where T : class + public async Task> SearchAsync(string query, SearchExecutionSettings? searchSettings = null, CancellationToken cancellationToken = default) where T : class { - using HttpResponseMessage response = await this.SendGetRequestAsync(query, 1, 0, cancellationToken).ConfigureAwait(false); + searchSettings ??= new SearchExecutionSettings(); + var count = searchSettings.Count; + var offset = searchSettings.Offset; + using HttpResponseMessage response = await this.SendGetRequestAsync(query, count, offset, cancellationToken).ConfigureAwait(false); this._logger.LogDebug("Response received: {StatusCode}", response.StatusCode); @@ -58,7 +62,30 @@ public BingTextSearchService(string endpoint, string apiKey, HttpClient? httpCli // Sensitive data, logging as trace, disabled by default this._logger.LogTrace("Response content received: {Data}", json); - var searchResponse = JsonSerializer.Deserialize>(json); + BingSearchResponse? searchResponse = null; + if (typeof(T) == typeof(string)) + { + var webPages = JsonSerializer.Deserialize>(json); + if (webPages is not null && webPages.WebPages is not null) + { + searchResponse = new BingSearchResponse() + { + Type = webPages.Type, + QueryContext = webPages.QueryContext, + WebPages = new BingWebPages() + { + Id = webPages.WebPages.Id, + SomeResultsRemoved = webPages.WebPages.SomeResultsRemoved, + TotalEstimatedMatches = webPages.WebPages.TotalEstimatedMatches, + Value = webPages?.WebPages?.Value.Select(x => x.Snippet).ToList() as List + }, + }; + } + } + else + { + searchResponse = JsonSerializer.Deserialize>(json); + } return new KernelSearchResults(searchResponse, this.GetResultsAsync(searchResponse, cancellationToken), 1, GetResultsMetadata(searchResponse)); } @@ -107,7 +134,7 @@ private async Task SendGetRequestAsync(string query, int co /// can be retrieved as documents from the index. /// Response containing the web pages matching the query. /// Cancellation token - private async IAsyncEnumerable> GetResultsAsync(TextSearchResponse? searchResponse, [EnumeratorCancellation] CancellationToken cancellationToken) where T : class + private async IAsyncEnumerable> GetResultsAsync(BingSearchResponse? searchResponse, [EnumeratorCancellation] CancellationToken cancellationToken) where T : class { if (searchResponse is null || searchResponse.WebPages is null || searchResponse.WebPages.Value is null) { @@ -127,7 +154,7 @@ private async Task SendGetRequestAsync(string query, int co /// The .NET type that maps to the index schema. Instances of this type /// can be retrieved as documents from the index. /// Response containing the documents matching the query. - private static Dictionary? GetResultsMetadata(TextSearchResponse? searchResponse) where T : class + private static Dictionary? GetResultsMetadata(BingSearchResponse? searchResponse) where T : class { return new Dictionary() { diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/BingWebPage.cs b/dotnet/src/Plugins/Plugins.Web/Bing/BingWebPage.cs index 8873ed3f5b3c..84440e49c703 100644 --- a/dotnet/src/Plugins/Plugins.Web/Bing/BingWebPage.cs +++ b/dotnet/src/Plugins/Plugins.Web/Bing/BingWebPage.cs @@ -8,7 +8,8 @@ namespace Microsoft.SemanticKernel.Plugins.Web.Bing; /// Defines a webpage that is relevant to the query. /// /// TODO: Update this class to match the response from the Bing Web Search API. -public class BingWebPage +/// https://learn.microsoft.com/en-us/bing/search-apis/bing-custom-search/reference/response-objects#webpage +public sealed class BingWebPage { /// /// The last time that Bing crawled the webpage. The date is in the form, YYYY-MM-DDTHH:MM:SS. For example, 2015-04-13T05:23:39. @@ -36,14 +37,14 @@ public class BingWebPage /// A Boolean value that indicates whether the webpage contains adult content. If the webpage doesn't contain adult content, isFamilyFriendly is set to true. /// [JsonPropertyName("isFamilyFriendly")] - public string? IsFamilyFriendly { get; set; } + public bool? IsFamilyFriendly { get; set; } /// /// A Boolean value that indicates whether the user’s query is frequently used for navigation to different parts of the webpage’s domain. /// Is true if users navigate from this page to other parts of the website. /// [JsonPropertyName("isNavigational")] - public string? IsNavigational { get; set; } + public bool? IsNavigational { get; set; } /// /// The name of the webpage. @@ -61,7 +62,20 @@ public class BingWebPage /// Use this URL along with name to create a hyperlink that when clicked takes the user to the webpage. /// [JsonPropertyName("url")] +#pragma warning disable CA1056 // URI-like properties should not be strings public string? Url { get; set; } +#pragma warning restore CA1056 // URI-like properties should not be strings + + /// + /// The display URL of the webpage. + /// + /// + /// The URL is meant for display purposes only and is not well formed. + /// + [JsonPropertyName("displayUrl")] +#pragma warning disable CA1056 // URI-like properties should not be strings + public string? DisplayUrl { get; set; } +#pragma warning restore CA1056 // URI-like properties should not be strings /// /// A snippet of text from the webpage that describes its contents. diff --git a/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs b/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs index 758cb0179c08..0075ee1893d0 100644 --- a/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs +++ b/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs @@ -59,9 +59,12 @@ public sealed class GoogleTextSearchService : ITextSearchService, IDisposable } /// - public async Task> SearchAsync(string query, SearchExecutionSettings searchSettings, CancellationToken cancellationToken = default) where T : class + public async Task> SearchAsync(string query, SearchExecutionSettings? searchSettings = null, CancellationToken cancellationToken = default) where T : class { - var searchResponse = await this.ExecuteSearchAsync(query, 1, 0, cancellationToken).ConfigureAwait(false); + searchSettings ??= new SearchExecutionSettings(); + var count = searchSettings.Count; + var offset = searchSettings.Offset; + var searchResponse = await this.ExecuteSearchAsync(query, count, offset, cancellationToken).ConfigureAwait(false); return new KernelSearchResults(searchResponse, this.GetResultsAsync(searchResponse, cancellationToken), 1, GetResultsMetadata(searchResponse)); } diff --git a/dotnet/src/SemanticKernel.Abstractions/Search/ITextSearchService.cs b/dotnet/src/SemanticKernel.Abstractions/Search/ITextSearchService.cs index cfb196a84b86..701b4b157380 100644 --- a/dotnet/src/SemanticKernel.Abstractions/Search/ITextSearchService.cs +++ b/dotnet/src/SemanticKernel.Abstractions/Search/ITextSearchService.cs @@ -7,7 +7,7 @@ namespace Microsoft.SemanticKernel.Search; /// -/// Interface for text search services +/// Interface for text based search services /// public interface ITextSearchService : ISearchService { @@ -15,10 +15,10 @@ public interface ITextSearchService : ISearchService /// Perform a search for content related to the specified query. /// /// What to search for - /// Search execution settings + /// Option search execution settings /// The to monitor for cancellation requests. The default is . public Task> SearchAsync( string query, - SearchExecutionSettings searchSettings, + SearchExecutionSettings? searchSettings = null, CancellationToken cancellationToken = default) where T : class; } diff --git a/dotnet/src/SemanticKernel.Abstractions/Search/SearchExecutionSettings.cs b/dotnet/src/SemanticKernel.Abstractions/Search/SearchExecutionSettings.cs index 74a30c89bca7..a3f910f9c019 100644 --- a/dotnet/src/SemanticKernel.Abstractions/Search/SearchExecutionSettings.cs +++ b/dotnet/src/SemanticKernel.Abstractions/Search/SearchExecutionSettings.cs @@ -20,6 +20,18 @@ public class SearchExecutionSettings [JsonPropertyName("index")] public string Index { get; set; } = string.Empty; + /// + /// Number of search results to return. + /// + [JsonPropertyName("count")] + public int Count { get; set; } = 1; + + /// + /// The index of the first result to return. + /// + [JsonPropertyName("offset")] + public int Offset { get; set; } = 0; + /// /// Extra properties that may be included in the serialized execution settings. /// From f167fe36300a2921368b3116157caad52157bfca Mon Sep 17 00:00:00 2001 From: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> Date: Mon, 29 Apr 2024 18:18:06 +0100 Subject: [PATCH 07/18] Eliminated KernelSearchResult --- .../Search/AzureAISearch.cs | 8 +++---- .../KernelSyntaxExamples/Search/BingSearch.cs | 24 +++++++++---------- .../AzureAITextSearchService.cs | 6 ++--- .../Plugins.Web/Bing/BingTextSearchService.cs | 4 ++-- .../Google/GoogleTextSearchService.cs | 4 ++-- .../Search/KernelSearchResults.cs | 4 ++-- 6 files changed, 25 insertions(+), 25 deletions(-) diff --git a/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs b/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs index 751d4754e0cd..a9bf07d1b49f 100644 --- a/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs +++ b/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs @@ -31,12 +31,12 @@ public async Task RunAsync() // Search with a custom search result type KernelSearchResults searchResults = await searchService.SearchAsync(query, new() { Index = IndexName, Count = 2, Offset = 2 }); - await foreach (KernelSearchResult result in searchResults.Results) + await foreach (CustomSearchResult result in searchResults.Results) { - WriteLine($"Title: {result.Value.Title}"); - WriteLine($"Score: {result.Metadata?["Score"]}"); + WriteLine($"Title: {result.Title}"); + //WriteLine($"Score: {result.Metadata?["Score"]}"); WriteLine("------------------------------------------------------------------------------------------------------------------"); - WriteLine(result.Value.Chunk); + WriteLine(result.Chunk); WriteLine("------------------------------------------------------------------------------------------------------------------"); } diff --git a/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs b/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs index 9b43186bc1cf..8bf2e0e283a7 100644 --- a/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs +++ b/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs @@ -30,33 +30,33 @@ public async Task RunAsync() // Search with a custom search result type KernelSearchResults searchResults = await searchService.SearchAsync(query, new() { Count = 2 }); - await foreach (KernelSearchResult result in searchResults.Results) + await foreach (CustomSearchResult result in searchResults.Results) { - WriteLine($"Title: {result.Value.Name}"); + WriteLine($"Title: {result.Name}"); WriteLine("------------------------------------------------------------------------------------------------------------------"); - WriteLine(result.Value.Snippet); - WriteLine(result.Value.Url); + WriteLine(result.Snippet); + WriteLine(result.Url); WriteLine("------------------------------------------------------------------------------------------------------------------"); } // Search for just the summaries KernelSearchResults summaryResults = await searchService.SearchAsync(query, new() { Count = 2, Offset = 2 }); - await foreach (KernelSearchResult result in summaryResults.Results) + await foreach (string result in summaryResults.Results) { - WriteLine(result.Value); + WriteLine(result); WriteLine("------------------------------------------------------------------------------------------------------------------"); } // Search with a the default result type KernelSearchResults fullResults = await searchService.SearchAsync(query, new() { Count = 2, Offset = 4 }); - await foreach (KernelSearchResult result in fullResults.Results) + await foreach (BingWebPage result in fullResults.Results) { - WriteLine($"Name: {result.Value.Name}"); + WriteLine($"Name: {result.Name}"); WriteLine("------------------------------------------------------------------------------------------------------------------"); - WriteLine(result.Value.Snippet); - WriteLine(result.Value.Url); - WriteLine(result.Value.DisplayUrl); - WriteLine(result.Value.DateLastCrawled); + WriteLine(result.Snippet); + WriteLine(result.Url); + WriteLine(result.DisplayUrl); + WriteLine(result.DateLastCrawled); WriteLine("------------------------------------------------------------------------------------------------------------------"); } } diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs index d5cb28a021a7..2e3c6c075343 100644 --- a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs +++ b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs @@ -87,7 +87,7 @@ public AzureAITextSearchService(SearchIndexClient searchIndexClient) // index not found, no data to return } - return new KernelSearchResults(null, AsyncEnumerable.Empty>(), 0, null); + return new KernelSearchResults(null, AsyncEnumerable.Empty(), 0, null); } #region private @@ -102,7 +102,7 @@ public AzureAITextSearchService(SearchIndexClient searchIndexClient) /// can be retrieved as documents from the index. /// Response containing the documents matching the query. /// Cancellation token - private async IAsyncEnumerable> GetResultsAsync(SearchResults? searchResults, [EnumeratorCancellation] CancellationToken cancellationToken) where T : class + private async IAsyncEnumerable GetResultsAsync(SearchResults? searchResults, [EnumeratorCancellation] CancellationToken cancellationToken) where T : class { if (searchResults == null) { @@ -111,7 +111,7 @@ public AzureAITextSearchService(SearchIndexClient searchIndexClient) await foreach (SearchResult searchResult in searchResults.GetResultsAsync().ConfigureAwait(false)) { - yield return new AzureAIKernelSearchResult(searchResult); + yield return searchResult.Document; } } diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs b/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs index a2dd6525ef4f..b181754c690a 100644 --- a/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs +++ b/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs @@ -134,7 +134,7 @@ private async Task SendGetRequestAsync(string query, int co /// can be retrieved as documents from the index. /// Response containing the web pages matching the query. /// Cancellation token - private async IAsyncEnumerable> GetResultsAsync(BingSearchResponse? searchResponse, [EnumeratorCancellation] CancellationToken cancellationToken) where T : class + private async IAsyncEnumerable GetResultsAsync(BingSearchResponse? searchResponse, [EnumeratorCancellation] CancellationToken cancellationToken) where T : class { if (searchResponse is null || searchResponse.WebPages is null || searchResponse.WebPages.Value is null) { @@ -143,7 +143,7 @@ private async Task SendGetRequestAsync(string query, int co foreach (var webPage in searchResponse.WebPages.Value) { - yield return new BingKernelSearchResult(searchResponse.WebPages, webPage); + yield return webPage; await Task.Yield(); } } diff --git a/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs b/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs index 0075ee1893d0..0dbc7de6f1ba 100644 --- a/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs +++ b/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs @@ -117,7 +117,7 @@ public void Dispose() /// /// Google search response /// Cancellation token - private async IAsyncEnumerable> GetResultsAsync(global::Google.Apis.CustomSearchAPI.v1.Data.Search searchResponse, [EnumeratorCancellation] CancellationToken cancellationToken) + private async IAsyncEnumerable GetResultsAsync(global::Google.Apis.CustomSearchAPI.v1.Data.Search searchResponse, [EnumeratorCancellation] CancellationToken cancellationToken) { if (searchResponse is null || searchResponse.Items is null) { @@ -128,7 +128,7 @@ private async IAsyncEnumerable> GetResultsAsync(global: { if (item is T itemT) { - yield return new GoogleKernelSearchResult(itemT, searchResponse); + yield return itemT; } else { diff --git a/dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResults.cs b/dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResults.cs index cbdc1dda0a04..22eda8dc779e 100644 --- a/dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResults.cs +++ b/dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResults.cs @@ -33,7 +33,7 @@ public class KernelSearchResults /// /// The search results. /// - public IAsyncEnumerable> Results { get; } + public IAsyncEnumerable Results { get; } /// /// Initializes a new instance of the class. @@ -42,7 +42,7 @@ public class KernelSearchResults /// The search results /// The total count of results found by the search operation, or null if the count was not requested /// Metadata associated with the search results - public KernelSearchResults(object? innerContent, IAsyncEnumerable> results, long? totalCount = null, IReadOnlyDictionary? metadata = null) + public KernelSearchResults(object? innerContent, IAsyncEnumerable results, long? totalCount = null, IReadOnlyDictionary? metadata = null) { this.InnerContent = innerContent; this.Results = results; From cb5676eb9cb752af3080d7089396ba3a2c7a4d5f Mon Sep 17 00:00:00 2001 From: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> Date: Mon, 29 Apr 2024 21:39:26 +0100 Subject: [PATCH 08/18] Update samples --- .../Search/AzureAISearch.cs | 27 ++++++++++++------- .../KernelSyntaxExamples/Search/BingSearch.cs | 6 +---- .../Search/GoogleSearch.cs | 11 +++++--- .../AzureAISearchExecutionSettings.cs | 7 +++++ .../AzureAITextSearchService.cs | 24 +++++++++++++++-- .../Google/GoogleTextSearchService.cs | 4 +-- 6 files changed, 56 insertions(+), 23 deletions(-) diff --git a/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs b/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs index a9bf07d1b49f..cad5842e57b2 100644 --- a/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs +++ b/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs @@ -2,6 +2,7 @@ using System.Text.Json.Serialization; using System.Threading.Tasks; +using Azure.Search.Documents.Models; using Examples; using Microsoft.SemanticKernel.Connectors.AzureAISearch; using Microsoft.SemanticKernel.Search; @@ -13,7 +14,7 @@ namespace Search; /// /// This example shows how to create and use a . /// -public sealed class AzureAISearch : BaseTest +public sealed class AzureAISearch(ITestOutputHelper output) : BaseTest(output) { /// /// Show how to create a and use it to perform a text search. @@ -34,25 +35,31 @@ public async Task RunAsync() await foreach (CustomSearchResult result in searchResults.Results) { WriteLine($"Title: {result.Title}"); - //WriteLine($"Score: {result.Metadata?["Score"]}"); + WriteLine($"Chunk Id: {result.ChunkId}"); WriteLine("------------------------------------------------------------------------------------------------------------------"); WriteLine(result.Chunk); WriteLine("------------------------------------------------------------------------------------------------------------------"); } // Search for just the summaries - /* - KernelSearchResults summaryResults = await searchService.SearchAsync(query, new() { Index = IndexName, Count = 2, Offset = 2 }); - await foreach (KernelSearchResult result in summaryResults.Results) + AzureAISearchExecutionSettings settings = new() { Index = IndexName, Count = 2, Offset = 2, SnippetField = "chunk" }; + KernelSearchResults summaryResults = await searchService.SearchAsync(query, settings); + await foreach (string result in summaryResults.Results) { - WriteLine(result.Value); + WriteLine(result); WriteLine("------------------------------------------------------------------------------------------------------------------"); } - */ - } - public AzureAISearch(ITestOutputHelper output) : base(output) - { + // Search with a the default result type + KernelSearchResults fullResults = await searchService.SearchAsync(query, new() { Index = IndexName, Count = 2, Offset = 4 }); + await foreach (SearchDocument result in fullResults.Results) + { + WriteLine($"Title: {result.GetString("title")}"); + WriteLine($"Chunk Id: {result.GetString("chunk_id")}"); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + WriteLine(result.GetString("chunk")); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + } } /// diff --git a/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs b/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs index 8bf2e0e283a7..7b140f0f0323 100644 --- a/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs +++ b/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs @@ -13,7 +13,7 @@ namespace Search; /// /// This example shows how to create and use a . /// -public sealed class BingSearch : BaseTest +public sealed class BingSearch(ITestOutputHelper output) : BaseTest(output) { /// /// Show how to create a and use it to perform a text search. @@ -61,10 +61,6 @@ await foreach (BingWebPage result in fullResults.Results) } } - public BingSearch(ITestOutputHelper output) : base(output) - { - } - /// /// Represents a custom search result. /// diff --git a/dotnet/samples/KernelSyntaxExamples/Search/GoogleSearch.cs b/dotnet/samples/KernelSyntaxExamples/Search/GoogleSearch.cs index a7cad4af62fe..8f5902dd5702 100644 --- a/dotnet/samples/KernelSyntaxExamples/Search/GoogleSearch.cs +++ b/dotnet/samples/KernelSyntaxExamples/Search/GoogleSearch.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft. All rights reserved. using System.Threading.Tasks; using Examples; +using Microsoft.SemanticKernel.Plugins.Web.Google; using Microsoft.SemanticKernel.Search; using Xunit; using Xunit.Abstractions; @@ -10,7 +11,7 @@ namespace Search; /// /// This example shows how to create and use a . /// -public sealed class GoogleSearch : BaseTest +public sealed class GoogleSearch(ITestOutputHelper output) : BaseTest(output) { /// /// Show how to create a and use it to perform a text search. @@ -18,9 +19,11 @@ public sealed class GoogleSearch : BaseTest [Fact] public async Task RunAsync() { - } + var query = "What is the Semantic Kernel?"; - public GoogleSearch(ITestOutputHelper output) : base(output) - { + // Create a search service with Azure AI search + var searchService = new GoogleTextSearchService( + searchEngineId: TestConfiguration.Google.SearchEngineId, + apiKey: TestConfiguration.Google.ApiKey); } } diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs index dc1ec8091cf2..bfc2eedc6e1a 100644 --- a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs +++ b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs @@ -2,6 +2,7 @@ using System; using System.Text.Json; +using System.Text.Json.Serialization; using Azure.Search.Documents; using Azure.Search.Documents.Models; using Microsoft.SemanticKernel.Search; @@ -14,6 +15,12 @@ namespace Microsoft.SemanticKernel.Connectors.AzureAISearch; /// public class AzureAISearchExecutionSettings : SearchExecutionSettings { + /// + /// Name of the field that contains the snippet of text to return. + /// + [JsonPropertyName("snippet_field")] + public string? SnippetField { get; set; } + /// /// Parameters for filtering, sorting, faceting, paging, and other search query behaviors. /// diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs index 2e3c6c075343..341cf18f7dad 100644 --- a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs +++ b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs @@ -59,7 +59,7 @@ public AzureAITextSearchService(SearchIndexClient searchIndexClient) } /// - public async Task> SearchAsync(string query, SearchExecutionSettings searchSettings, CancellationToken cancellationToken = default) where T : class + public async Task> SearchAsync(string query, SearchExecutionSettings? searchSettings, CancellationToken cancellationToken = default) where T : class { Verify.NotNullOrWhiteSpace(query); Verify.NotNull(searchSettings); @@ -74,7 +74,9 @@ public AzureAITextSearchService(SearchIndexClient searchIndexClient) { if (typeof(T) == typeof(string)) { - var searchDocuments = await searchClient.SearchAsync(query, azureSearchSettings.SearchOptions, cancellationToken).ConfigureAwait(true); + var response = await searchClient.SearchAsync(query, azureSearchSettings.SearchOptions, cancellationToken).ConfigureAwait(true); + SearchResults? searchResults = response.Value; + return new KernelSearchResults(searchResults, this.GetResultsAsync(searchResults, azureSearchSettings.SnippetField, cancellationToken), searchResults?.TotalCount, GetResultsMetadata(searchResults)); } else { @@ -115,6 +117,24 @@ await foreach (SearchResult searchResult in searchResults.GetResultsAsync().C } } + private async IAsyncEnumerable GetResultsAsync(SearchResults? searchResults, string? snippetField, [EnumeratorCancellation] CancellationToken cancellationToken) where T : class + { + Verify.NotNull(snippetField); + + if (searchResults is null) + { + yield break; + } + + await foreach (SearchResult searchResult in searchResults.GetResultsAsync().ConfigureAwait(false)) + { + if (searchResult.Document.GetString(snippetField!) is T snippetValue) + { + yield return snippetValue; + } + } + } + /// /// Return the results metadata. /// diff --git a/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs b/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs index 0dbc7de6f1ba..4fd8211dd52f 100644 --- a/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs +++ b/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs @@ -24,12 +24,12 @@ public sealed class GoogleTextSearchService : ITextSearchService, IDisposable /// /// Initializes a new instance of the class. /// - /// Google Custom Search API (looks like "ABcdEfG1...") /// Google Search Engine ID (looks like "a12b345...") + /// Google Custom Search API (looks like "ABcdEfG1...") /// The to use for logging. If null, no logging will be performed. public GoogleTextSearchService( - string apiKey, string searchEngineId, + string apiKey, ILoggerFactory? loggerFactory = null) : this(new BaseClientService.Initializer { ApiKey = apiKey }, searchEngineId, loggerFactory) { Verify.NotNullOrWhiteSpace(apiKey); From 5a73ae95dfbde4fa52419a597835e9e327c9ae7a Mon Sep 17 00:00:00 2001 From: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> Date: Tue, 30 Apr 2024 15:02:37 +0100 Subject: [PATCH 09/18] Start work on TextSearchPlugin --- docs/decisions/00NN-text-search-service.md | 51 +++++++++++++- ...md => text-search-service-abstraction.mmd} | 16 +++-- .../text-search-service-abstraction.png | Bin 0 -> 88651 bytes .../diagrams/text-search-service-option-1.png | Bin 72909 -> 0 bytes .../Example54_AzureChatCompletionWithData.cs | 6 +- ...ureAISearch.cs => AzureAISearchExample.cs} | 16 ++++- .../{BingSearch.cs => BingSearchExample.cs} | 19 ++++-- .../Search/GoogleSearch.cs | 29 -------- .../Search/GoogleSearchExample.cs | 62 ++++++++++++++++++ .../Search/TextSearchPluginExample.cs | 44 +++++++++++++ .../AzureAIKernelSearchResult.cs | 31 --------- .../AzureAISearchExecutionSettings.cs | 12 ++++ .../AzureAITextSearchService.cs | 25 +++++++ .../Bing/BingKernelSearchResult.cs | 25 ------- .../Plugins.Web/Bing/BingSearchResponse.cs | 4 +- .../Plugins.Web/Bing/BingTextSearchService.cs | 19 ++++++ .../Google/GoogleKernelSearchResult.cs | 24 ------- .../Google/GoogleTextSearchService.cs | 8 +++ .../Plugins/Plugins.Web/TextSearchPlugin.cs | 46 +++++++++++++ .../Search/KernelSearchResult.cs | 44 ------------- .../Search/TextSearchResult.cs | 38 +++++++++++ 21 files changed, 347 insertions(+), 172 deletions(-) rename docs/decisions/diagrams/{text-search-service-option-1.mmd => text-search-service-abstraction.mmd} (86%) create mode 100644 docs/decisions/diagrams/text-search-service-abstraction.png delete mode 100644 docs/decisions/diagrams/text-search-service-option-1.png rename dotnet/samples/KernelSyntaxExamples/Search/{AzureAISearch.cs => AzureAISearchExample.cs} (78%) rename dotnet/samples/KernelSyntaxExamples/Search/{BingSearch.cs => BingSearchExample.cs} (76%) delete mode 100644 dotnet/samples/KernelSyntaxExamples/Search/GoogleSearch.cs create mode 100644 dotnet/samples/KernelSyntaxExamples/Search/GoogleSearchExample.cs create mode 100644 dotnet/samples/KernelSyntaxExamples/Search/TextSearchPluginExample.cs delete mode 100644 dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAIKernelSearchResult.cs delete mode 100644 dotnet/src/Plugins/Plugins.Web/Bing/BingKernelSearchResult.cs delete mode 100644 dotnet/src/Plugins/Plugins.Web/Google/GoogleKernelSearchResult.cs create mode 100644 dotnet/src/Plugins/Plugins.Web/TextSearchPlugin.cs delete mode 100644 dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResult.cs create mode 100644 dotnet/src/SemanticKernel.Abstractions/Search/TextSearchResult.cs diff --git a/docs/decisions/00NN-text-search-service.md b/docs/decisions/00NN-text-search-service.md index 21eed93f64c6..49653836ce5a 100644 --- a/docs/decisions/00NN-text-search-service.md +++ b/docs/decisions/00NN-text-search-service.md @@ -106,9 +106,56 @@ The class diagram below shows the first option. - `IISearchService` is the base interface for all search services and just stores attributes for the service - `ITextSearchService` is the interface for text based search services. This cna be invoked with a text query to return a collection of search results. - `SearchExecutionSettings` provides execution settings for a search service. Some common settings e.g. `IndexName`, `Count`, `Offset` are defined. -- `KernelSearchResults` represents the search results returned from a `ISearchService` service. This provides access to the individual search results, underlying search result, metadata, ... This supports generics but an implementation can restrict the supported types. All implementations will support `string`, `KernelSearchResult` and whatever native types the connector implementation supports. - +- `KernelSearchResults` represents the search results returned from a `ISearchService` service. This provides access to the individual search results, underlying search result, metadata, ... This supports generics but an implementation can restrict the supported types. All implementations must support `string`, `TextSearchResult` and whatever native types the connector implementation supports. Some implementations will also support custom types. +- An AI must be able to perform searches with a search plugin and get back “results” of type `T`. + - 1 + - 2 + - 3 +- Application developers should be able to easily add a search plugin using a search connector with minimal lines of code (ideally one). + - 1 + - 2 + - 3 +- Application developers must be able to provide connector specific settings. + - 1 + - 2 + - 3 +- Application developers must be able to set required information e.g. `IndexName` for search providers. + - 1 + - 2 + - 3 +- Application developers must to be able to override the semantic descriptions of the search function(s) per instance registered via settings / inputs. + - 1 + - 2 + - 3 +- Application developers must be able to optionally define the execution settings of an embedding service with a default being provided by the Kernel. + - 1 + - 2 + - 3 +- Application developers must be able to support custom schemas for search connectors. No fields should be required. + - 1 + - 2 + - 3 +- Search service developers must be able to easily create a new search service that returns type `T`. + - 1 + - 2 + - 3 +- Search service developers must be able to easily create a new search connector return type that inherits from `SearchResultContent`. + - 1 + - 2 + - 3 +- Search service developers must be able to define the attributes of the search method (e.g., name, description, input names, input descriptions, return description). + - 1 + - 2 + - 3 +- Application developers must be ab able to import a vector DB search connection using an ML index file. + - 1 + - 2 + - 3 +- The design must be flexible to support future requirements and different search modalities. + - 1 + - 2 + - 3 Evaluation diff --git a/docs/decisions/diagrams/text-search-service-option-1.mmd b/docs/decisions/diagrams/text-search-service-abstraction.mmd similarity index 86% rename from docs/decisions/diagrams/text-search-service-option-1.mmd rename to docs/decisions/diagrams/text-search-service-abstraction.mmd index 4298e8cfd149..d436bf080526 100644 --- a/docs/decisions/diagrams/text-search-service-option-1.mmd +++ b/docs/decisions/diagrams/text-search-service-abstraction.mmd @@ -37,24 +37,28 @@ classDiagram SearchAsync~T~(query, searchSettings, cancellationToken) Task~KernelSearchResults~T~~ } - class ISearchService { - <> - +IReadOnlyDictionary Attributes - } - class SearchExecutionSettings { +string Index +int Count +int Offset +IDictionary ExtensionData } + + class TextSearchResult { + +string? Name + +string? Value + +string? Link + } } ITextSearchService ..> SearchExecutionSettings ITextSearchService ..> KernelSearchResults - ITextSearchService --|> ISearchService BingTextSearchService --|> ITextSearchService GoogleTextSearchService --|> ITextSearchService AzureAISearchService --|> ITextSearchService AzureAISearchExecutionSettings --|> SearchExecutionSettings + BingTextSearchService ..> TextSearchResult + GoogleTextSearchService ..> TextSearchResult + AzureAISearchService ..> TextSearchResult + diff --git a/docs/decisions/diagrams/text-search-service-abstraction.png b/docs/decisions/diagrams/text-search-service-abstraction.png new file mode 100644 index 0000000000000000000000000000000000000000..7a2de31613c6cf1d0c6e7fae5bb72722e9ffd650 GIT binary patch literal 88651 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�V?r>$za z>`FrkU|_!yJa4b`(xtO}S<;2E1(#FIbph*#95bwJ2t^3nTrzTUuVgEc{2^}N{!y}h zZ5g;sVR#cHTqLu6WkIZ|tPP13$ZiJoE<|_P91%x2)?rT<3Jwk^A8x?tW{3;G~I3WBNz#~5zRiw@%W=gq}!L#hSK2@!ChD~ssKV5+)&$B=F|CqTZNci+JOmCmMqOup5j*Q4!Y zfjg=c^v+{MyP)ZX=2s7N@BI$02_0eqkS~#ZW6;0_ddBpZY16mSxUugbT`$oST0=+$ z>>kf$feAIr#=G&UO+VPR(O;t>ZSy+xL-;4zwz%7cFp-MKi$4yH757J)6sEj3r9Z1I zVbP+*r0K0*ANuM+PkvAR>VZmZ0?(agWjpubt`?j0KmYt%OEd52`}I_bC#bMH&5EaH zq|~V1C3@?V+&_zI1RxJGRP+BP%rUGw+pooA0m!mf!|j~D#PdC|YSn7vf_r%5vMd3&X$#h)tJQK*OBYw8_W*F?pfi!(u3eX^q zzi3I!jx{K4X=G*x!um0N;%(ZYTFTvlEhqqTQ#WnpL&S%vrn)TdARGO_~tko%)ltwCgyh?ga{ z^KztEjhI>K^Hn4>y5vDhFJ;#K?GEIWeRC~?Jj8H3?P;4F_>NLIijl?&QV3}1GvpVf zA-ed|#O%w31>swi+g|n9z}sFCv@i1mIga#I=tmH}Zmn*tDDSvx^7N_&QH}T+1^pGm zhKld}B6TGkh{E2&GcRJL6LrYzNN!Kt6Na%4alFZ!n=`}=hT^`A^A_)}+!~qSO9Ssm ztj`E%OpO(d@6N&Gd ztom;%;UCiQYtrYK6K*}ORj#AzfKkE7|K%|Bx;76a!Os*7kI(JFg7)jyXA32Y@DoyB zZQ_PXY%e!c)&hEdcY{Jvm0^c!yZ0CL1zkes{qTWQOyIjk*0)w(e6`Ddz4GSe7v2ee zPd`;9SA|S!Vy}{O$Q`=lC50tXf|23cxVVnaaEBKPAe4DL;PF1BI#`Y=Nfj{*OD=6F znpH1lOFLKc!^2aVNqvCA&KvIfCNB#p#Ha9fO^!XBVh){;j5cc4>MWE28U})*%iUk> zMQV|_E@LwCQr9Bx<_)y~Bc|NBwfCx)>3n#ioTb1PkRf|mD{ zY2RE2Nd|Ln7v&NF>Hspi%_t@M%4@~s#Kt6w9hz_I_~QP0lW7Mk6?oz$Uh3X2TJi-r zqc0KDn(4V9PqDV>|PBhYp#t zgns1*a_`%+H-E7A$v9KN0DZGZ#u0kfrBWD(O73D5ErM^~b@UG3gmUZ{T=Hn- z=D-C6ZCNp}?cRHx+e+Q~!Zp<0fbWdv2D=%9*s0n6eFdXpk;hw$Qg||*oYd&8NtkYC zO-2W}D?IWdb`HfdsrP*bpovqD;(F{Fv(2;n4nME)lpoi^5md+K&{avNX3|7XlYA0LXQ1imv z!0eS8%NF%HX+QEh-j`J1Oh#`lF^jl)_YeM?fyvOT?cx*_2_3J{2<09duA#+S*qU8P zCCa@uE-PzM?#%P|bCq)ym~}=dFk3~6Jl+kfh*gw*u2F>SH7qfUmoNdId@>RdxNnP+ z+y->98l~wbAtacVVFXSZRk^dF8GtU~AYHvI-SMPyHi@T|E6ob$ewnT;HL-tJxh`NNb z@bF5=Y?&QVn|^xLv|%y>|F7B!Y;EQ#A@?q}RPI^|=u8O7fCxooG{c}@xoGa~b1R(B z<(@Zy3orJCSun-D8m6yNj=>b}6C8(B^qIOypA$Yj4{6EY$1pPnsoO_v;u!nZ?ogtq zjbwIH^Aun1)Wu4O0CA`NQP=5a39Udn9}&6WZ03;I2)ouMK^lyBXn5hs7c;5te(A9Q zQUWb|UdQVcWBhD&kMLbGhK5$sY;t##U#3cz_g`|A@eJ(533&?fv~q4KjWMO{L)BYA zgcMBb6>M^CfFpSVfFJN2#97*vr zgv}t8;d%CkncwVzFFREeya_p(KxK|e_on!t$F~Z0e)`U2Hl(g?mN=hb2z3?iJ`ZFp zJfnI+r*?xzoX<^RT(7osts@txJhj`NHi0&A)4u7Dx0MPGV|9iup{Y%T`wgHgLn;0? zJlQI$QZ&hMcwKRqLTZZ0nDnrp(c8G*kZd>WtLS5bp2|Jko{G<#_8OHM+LZ?UD?{un znPDUyvdB`v%_CrUWhv^s^&v~G_F_tcS|L1qH zz>nRbp4OkMv^%!fC@!o<`r8sM`)Pf5dAwC)9>;_}OnKwaBop{jBjV-o%a?Yz1 zNnFwGnj}x|>BEx~Ml44HDyH-r*%as6e}6Ryd7#}YIZ5nt&FAsGbLO-6v^!3v<nb#Sq&#DJ(kTMa9d_gU+@$ZTqRk`HQ>qOuCPBeM}BMvr=N4Xj?9X7ybY4$#y{G-aj#F9niFTTW z+DZvTc$?Dt+?=|w%67v!?SlPItD{;Ki!8xsa5S&_8qYjTYC7 zR!v7}CTgDh{cUq;IIqOdb{1PKHZuG@g~uzuv8A=yD%Mlyvx0bq@eJW1nt0FhAOH8QCzIRp!||iwC^WRtAA3Gq z)G=T*-aypsaj-g+yrfjzmoU9+iR3Oj7UWm5K-b zSC7Xbu^VTnmVS6ALyS1^t7Kc~a^mxzgbZi#o14t2F{}@I{!8Zr9j?2bIkd{v}~&Q(sI;G`)0N4seuy_W+7>P+Xd z9bwDE&R2@ucM9K8(42QV;@$9#mh%S-qhAK7$MSw!;?AFMc-0=*-$__%(Fs}Q4b`%i zeQJv<3$y#RO_T8?^q=|M6ji3O`(%13Z;vFHw0ot`ULS~8+}9>vtnEJ<>e?Gx zmZ!E^a&4D&MYxDds;B1Kc=s&Q7=--YLSg`1%9y4IwrojhYA z-iJ*ef29|1di#0^O=sgCH*d!A2}R@hV+X%FP4^v>C|BXyhp61XyXGPYphaZpoKW-) z&zQ=amSJnO7M&HT?@_;{@pTtpjxK>U&&-QFXhPv)DO-50v6`4Z05Jo%v-x+a)}3>> zMpA8`_wmS`3NKN>nG|ol>lauK+#7?9R^ZCJ{&`M3xqCeF{C#3@=~YYqD5MyeWq9ey zrnw3%uF`#8wH0;$vYp|=eie^8od@h2m8-}!7E%}UyE0*A9tV}FL0n&-GmYgUQN>sW2m zoMJ`RImOZKH3=gBH5;>US)*2!rK2~x8ZtKWR++OE9p;m-XGq+iZS}DeE9`eh?u($Y zU&3%eJ%0?HfMQe817QnmtTv;KD$ip^RUwK}(yqt@DyKU)*OtNx~E*ZoQ zrK~luJCd!{yv<0O(ZkW7uXq`|6%TPr6@(e}zc2(j>)5=jO|cyNL1*r%npE10;4sO+ zYCTE4odeIqGe5|Uc+XMdepblcN&mNR^K}LpXs^xm1ZpQFKU8QBm>Lkn3&oiA@y#y zl_ndzZH#ZZHlU;C`P;5D68WDAnua!|D>KQy;e-#mSJF!DrMw&xC)O0(qiqGD&bN*@ zXOZjvWJ}j_sm|)wdRBG1{{w}T#U`s^??&6e1=4WgR8beUF;KkE`J7S2gIfVL=R78Z zmRHzZ5mLtVSjxt`VO-TxYgxWn5!XMrOYFa7x7=#`!GLuRu_&e`p6IlQoH=JX@sN;| zGu(B~c;GqZrA&fag2_`?c0IBRT!`EkZJ~o=7PxTlH=8d1yiua#FgS3 zv$+c|EDL8`;x8QM?q0%Q9&>wcl-N8&6VEt-uRIS|p_qU#NK}!{Fh2WnReVG7l;exl z#DL-0Zdw(&?@-a^#d2Aai`@4o{Z~I@&ez|3T#e4K|2E@eC)Z9%3mE3io0UFPC4JK` zAsUlBD-N?H;}x~+Mu)c^Xv+E+{o@e{6FeVen;wgr_}(9RluxbrvsVYE&4z{J?%q5r zbm!SelP|b(`jojale*QH^)mAhS&Oqd9v#0|FTLZJeKhl&#nN~ut|28PNBf^oOZg!w z`azG@L-Nv(weQM{E~%F754E#S3Jq2ej4^#X#IJB`MVR_)vzjIF!b_KZTl=OO`DxPI z=)L}GZ$eafQVkato<9h^7V=xU>m#>|$~TSVX`$oorJnKOQ~4wF7=K_VE8^;h>4>tz z4L2>{?WwtLYgou6t^<CM^(Mw zeWE#UTl}GZY9g^Y%g!(H=dcwxcMWroPgQ6Kz4kq4dh^A|Q*W>~(=LC;DLT?DDgI7P z_0ML*xHZl1)&lyAUEgVX#Uhs52{lDZ!zotpP8%IK(6FU578;w7^DR;LaoIT?VJ*sp zVT+<$T*jt#vhPllE$5!cw(W{l)H?`x%r?D-(QeEU zc(^aJF7^rRSrgc3S4WZ?+xIehqmujEzAykWPO768-?CRs+Ex}@Xgz*ga|~!Q9Zu)4 z)2yU7pV=;DtgiTU=doYvu~w^eK8LqRy?4p;XxEy(U-RUaXi*o#dsabB5AF@0m?m1% zP>%CJ=lw_1y$h?j5nuZog3dL!d?SXAXAf|E=$2Dm+%8HVCnt3_x z+J2sbMz`@*9HXF-kcX~8pDI^(+4)wx5&gx-q9HF0HGlA)%RVu^DY><7JJUe8{{8}C z&hVu8V(qBtGyl!%vD4N8d|!ss(%K*da30|O$exBx8eU$?C;D(aeEG69K5;0m?j+9{ z1EZegeTg1Vt4$cOMl)Ly%o+2Y_cvCO?!gFwrebJ!rKp4v=YE>0k+I>i(E7wk3a;yC zCh6S)sdDw4re#PinqNyV036*S)qmtMlfRzZ&OV%k?%5o1W`8a-A^|zIlt` z)#oeY{KqYqev9u=&VRiiqMrWUU|gbqk>h$8`q`$IwOaC-p@KCv*;%$g9h?o;cp4pe|Te51au2)DjwL zb+jyl9BZP;-#=8WkaFg;-LyeSdi@-8G5XVV-`tX<1+A=UZQ8G-ZD}}f@owUeTacEb zLZ7Z!_?Pv3rEX=o=YZUb;4D=s-ckK^F6_2*4$?n3QIxlVdU|6;YF2#f0{al3YT{QX z|L?Tn^D=1ciStmf&2?YM9Oq5PrjI5?S6SMOFbj>0zHNvRuL<;xZ-YA$!OeZ9$lG&w zm2?Wk1p6ObHl@|keL!&?yU^#1k;oRelUJkGygHaaYWHJH#VjG&UN6Nm_wlk_i%9I9 z@Qn56Ue)7`syPL!)XmQYB`*3U)rTrDc0+HRFSlHL6|HOx6=Jx=W~_>}s{i%Gc8OLy zB5CsuZ{oIBCi59!9%DIO&Gy6plb5z}?ko?DzhglM)2{Nq)o!{o(4sTx-iW*Zwr!VE z!T4y~m6ceiTyG}4TT_|z4_H@!R)#rdYp1vgddp5ym4zcMXI7|(rZb>sGr;^x{`Yk6 zx$}7ehq)!eo6vu8d(G0bQ3+_(fbA#pmNi|0HSkV3xf&vFo0~@e%*0kLLqU^z29rx5XHdv~2uhny|AG zF$)yQP{a*j*)z3{@sG-Y_@;gPvaJ`lro?PcLJzjstLMgapX-$k%o$=6X`wX4u0>I7 zaqUj`5*sHxtPM%p&1&v_q>NYFG}UKLv^J)~=(2u`l#=sL?EC%@+|&mAE0?UDpWIYu zo34oozcFyzx=N&PJGeCG8z1BL8uquZiR1_^^7pZR4~Lt{@ubZ*$GG34y?5Rd7TEId zY_5k64$E&k#Vijqldc}OH+6_Vv1r-lw`}1rbiA-Mr}EdDrX%;^!*1S9*O{Ei1W)z( zK_-qrWo?BT|DD5%E?uIPos&pF47vV~Gt+v6wy)9GMb2=;^pI+v^e)tq*`ORI!}3qB zc_n$<6lsy3)2lYV44)EFDmhQ@tl66xjq7r@*iBmspN~-RCFcD3y`p6rkWPC~-|F@` zfLX(6IIy^hlBnPRzr@gIVr#l7k^|x*Ujy9?{Lc(2+19YeMi5jRpQcd0iS+Ts!>-{YM2{l-pLt_SaKg3W<KX7|E*x!+w)#tV6gULwF-R$-52$rnr@4J zKQ-Z`ZSHV%g4C$|BNomNbKwNkfTe5Z#* zs-ZJm{%*(hdy7#k9{7XW^;`uXl!bF8T_*gi{r03WG6q$mr9mhWXRI5_GrjgOJR08O z%!fU{U_y?lBxq?F#)ZnC9j)h5Y%OJ0*I?P8i3)_$j-tkn^2T&yHC8QQv09#g1skDt`%5*jH*$rjk%YR=9?N>cB8};TPP|>qm%PGIm?Oz57XL=n^ z)065=m$xtq6wJ(B>moS14`^oU(+{~|kN|^-){zUlFFgtu*4V?X6N&GdIIS$Kw38a8%aeio-I2@h6$1n2nVJ;-j~Feo@u>ID z2gYekRr&&(|L2EL|38k{|M|7>OFgHJrBQv)5v#xd{~!IaMXp`vss0A?(*L=0GN#|(N#z0NP}cnYoKL>rcXh@d6tzrRZrX|J zzxxYqP4*)G<72Ea?@%^-r0nMC(i*c?(9A-s>|Ag4Ce<;<+)Y!L{tM~<7=$5e`D@!Q z*XNm(T#9bjYnc^Kis$I1Jf1CTQ&2vI5=a2mBmA^@k>>!-WAn$x%JcxGJ7@Os5tom< z4qQY`(X31?{Y(7j%I}Su$3B)n_&vWiYW=+Qo`Qc6gE+8ed*AW+JN4d@jr_1RG>isifuV0YKph+r!6HVarFA1Y~~Q0-`)43mi@$W%iReo z&G~Z-kt-W(bFRnLUlbFmgq8!cGar*UP#qJ+hhSo0fmY?e?G%J=ro^HE{521K;e&-NyKUdj|Og^KtZfxV6{Jp z+hLB8R89gDnJOul!CraB$Pza{@SGXmp8w1WF6C#r%6&GbGR(lnCC|ei@4qX{rv4e{ z1^bTF<^9DGa*I!S!4KWI%mpL+>*;ZGZd9ruy-wtQa2rn*!_1pk->)E|n!lb$ja3#@ zZ!|Nch#dY!CC+(a`=vz>U#=60m&JKu9aQv!wAL5L^T5U-e}5q|7Ani|_K$k}k4L+% zE#Jt}Py1&D<*+ap(bC&)>~M-lHsKimqLmFLRuzB_^%u5jrQEZ~WSI73}9-r%464 zw&Tdh%;v}{q!YNdc~z=mGi>xu;|tG5P81Pzrvhtl&)dGJTJ3kd0BJyWeJl#|IO;R2 zqTFF-fwJlLlqbw;@D-o=9YAFT!2t+?J9|pi-%?@e+xebUO?DzBJ11Ble1?<6_!yWE zc|dO6azAqJ_Cw;G#^L%D{K)4gX7EPHk6yrY8)o?U*SR@w?2*%{utR6?Fg8kHKaUaX z{&;V+VY!wK`&jRIp~b|6)lrnjWBT<3?_c}4YBQD|wV;V&hj$4Sf!JDq7=~u-nGcEG zRi0^fNp{g^y)+hSB^Fd^1B24w{pGy2MVQWapFJ^=;D?TVj+!~RJ3)XOLYD?NCDHh~ zaT(bQrXG95L>N$GoQ^%Yg)jrw$B;P#_cDLPkVUl0cLkqzHHHutN*TSuk~7-yya9ch8jSKgGV*%p!nv(&?b^FZ#toZJb)?Pa z7PY!zn_uDYue+I*-~F&MH$41i>TR;viEJDU8k2d=*qp=l?!0KTNdCzt4>MlD7$z?C z3{TLCc?iA~gvTMP-S4GcOFtiw{RVD$PV7S0KEegKIo|vRRtW4pKEJzn34)>x3|Hno z=aFjmRQFvUj~Un}9QRK+Lr{3u5D4~-*33!$9=pDA+s54jfiXdJS5U6fzb~CUWwvbC zi!3IhWwvb$cGTg;8(A&)1wTJ#ac_)<>(K)4U_zodi!(vczqZ2qOj#u|% zMRm_s5#AdIRTB8~ENiNbvh+`SGonsF_VYyFdDX872}aIjb)k`;=>Lp>+7o1b&^y=~ zCX1~id{(+mU{sg^J*mRQK!A@A*9$cB7hjKPiVYsc|EhwLD|SNGU)aBI|jN{Btnlvk8CJdF#)D z*PoFmM5@Z0H(~i6C~I&5wIv>LGF+42`7=7ZF|trPVY7#~22Gou$G0%_Z2%o3L%u#=M>b7IB%FfenhLF4nB zN|EfNRI5L~2;x>0Nr&hGex`6Gun<;DPF{_M(NHX=frC807uCD8hn3F>y7wPocu23O z(#KtPV=^V=oYD~TtUY1u0UITB-3?P|uUloQEF_aZc{nBP0_vl1R-THf)z#M`F9Xi$ zN>eh)yHOJ0we~kX9EC_q>m3DKeDn`841fWgK*grGxPE#dL{ShvYL(mwl;WPbR-b0y z9?3~c-VAS#`i#AF$uzHU z1MH!39WJStDXM#W`(7ijZ4AcC^z0tg&Pu;yL7&3r%pKqg4rm4aL7w~_KEIiBU<0_# zJ_J6S0$Qv&d&ri7+uaQBMZz>LHmO{3nGsSZD~PO=^4xzRzj}k~<071uzPL;7=69Pt zNtlTtQsEu-wM_JVur4^ZW?m;2#wG5>r3MDd3$!!$Kuo#Ay zei8+E8Zk9idf`pU$}r!(;#@{P^cnzVAz%~vZE79tSTKcWZT`+dwJ*`0Fc+nu~6(qs@@e?V?tDTYPuftczuj(Y{H0D{&m zP)fgw19_z!UK7iE@z@smcSg)jry+$A^&3R7bsb4bS6DV@%MzKrxwdUNtS`s&C|RT) zxzojx*3VO1&{=;4wa)bbkUyjkJQ-34g}?!WjD9eag4$7keuU}l!UG{Dv4!mqj=Jfr zUoxov9$e|#Ox-#~^a|ait)`d9$@l&whoSKhUJ2vdkedh#Ok6RLA7uG@^3J@N4im>53M&r0PdazhxM^09m)jK;DGxb-MfuZnVOMEQ2dF z^0ZeJ0i)=}D469dN6BFo^pu8>tP%eK46*BEfj|6rvTicgGS~(jZ?;AyyJMyIqJnbE zJf`%ytdegvzdlt;vhb@wvGY6WSKnX%8Q*jOK3l|ejK%aVNY`H9&NcSJOL3-c&jn&A zcd^$N$eWpt5b}y)#R6&kVdc)oGWTNl~81HpKus&gK!s`|jP@>lTHK0)jLsKj)4m{MkUVfKoIJkAA~6=}Rm677*6;d>6qtwSt)T z`kcV*{ZH8@1ujS-uqlTcV*n?)cgz|PeV4I#vJjlvN#U%NQ+KtLI#@dEz=37BA-uv->lHb6Tcmj9fkM;+V4aPRUDPX8GN z`)WGWdVTX7QH-=WyRf!Lgi($$NY*G7Gd$H19%J&&FOr$_nY8qhUgEPSOV9+k?1kt_ z4Z5u6f9^JL+omQ~p8oudGRes2orJ{Re5XJ2BUEj}v?Z`c`HbO4jqT}Q1Fxn!dH%Cj zL16JX;i3q3R~hB`K0$_%v)yDF^sN&eNaI9#1qW86$2`dbYa8L`KNl7 zA_&t*o~mtAz$>+mAy?%5GZC{OG~cA)1Hw#{^pN*wA)SO7i9(T_clfOEqnA3!-?M$y zk=uVa3ayeUE8sbrI=4GWUK985^kLP;&$sKJ^?}XqgnqQ>v`OC05_4&HC2c?~6^|$$ z&9z*YGIKN-UK{3{_jS{4>*kwR{ER{c%@hMrLWXY#myp^7c13JU1XU`}x-}c-x|9Z~ zKqwYyL4b~w+*I&CC;?Zq!rPC)UpWGq(8VoSn&$IJIeg(IHyxrZ+5%LdR=ED?s5kS3 zZqjSONrZq6&fVQ$--lC928`-8l@>!-8-fps7HxqcX@|eKv~yx5zB%`o_)fN{07D5% z$?J!zp{HuPf7crr;pJKK5HkvT)_<*7e39EAXa>@ge(36x?6xfJbmg|~>15R~Laz6S za-GnOFr9#BC2eOj|Eh&&R?gDg;&=<=9n_dHa32zGa`P%IVxfXcyPNzy+SRw^DCj6C zAsN$PPEpNMh6T)*iaOG+nn4kgYyI_A-3@^i5j!jtP^Gs%?}<@W<lH>^2|7caW z%uz=OGsYs(yl=0EMe-~Lvzrrb-s?O^*qi+AboQoQWwR7YNut=bBftibG1?%C=TGsl zeo)5hxqe%FMF#7W*z}fXwNXg^JgMZ7eID^{WcWilw`Kl7m}$dE`jW4qQbJ&A*iisa z9y_^WB8*4xDuJ<*bmw)94CBdOuGsEW&8WD2a^PXZI(VnJZS1xD_NJ0WI+fEyPaSu3 z7kDeeJ?YCeEpl3&=|lIbm>!qZExT-yx)F{J{-e~7l*9n-rwDU;LC@&(Kv+LP*lA~A zS6vci4nu<(*FqzD?>PK&uUJDBQ)K1CZz@W5vFSJ_mN4{#fh+AHN!13m*T5={ex$e{ z)2u9?*W-t>3xA4BQ?aIF(ioHEEe%**m^Ie{eZv&b$?N(dv^>N zAfpNhBVF!_nfppABWIx(^DC46^-mqiF8tCzDTVx$-E*<-4FDrhh`-z(Ap zfhix#h64uD9uLJERsjV4pu{f4F{$0N)GFI1bqMjMbV_1wCM>Oi)AU_amg@E2M__oy zH=26L;B43s3Atc&nNZyJz}V!P&q`W$SZj0m-9}zqIlkI|lW>cPP~u->jId$+)`Y!i{EDl7YG zlZm44?Sds@zxJoa9iVA|Vr5Na*!JO$Rfd6ljZT+V)WP z{aO0}eJ4a4z4gcem8J9C2deiX;ve_HdyN%%pqYkY%iAxiq_NdA4^WCQ;6?t7L9WAL zn{P_{Z+OI*j=xmryT?^rv$Nrd(=+3~(N!NAe2XJI-DAC(pbtaHNWHWv7bM@tm@@gR zaHsRU&9}ScU*v$zS(hz!e*ZCv^QZg}g36pbXzNO&3qz#H+Y?*xT^!$2{%QW0uFf*v z5`zl~)Fz%r2^5vO4!givD3EgKdK%WNga)eQ-(M+=O>6W1u>TqiF9!`~2GVv`>lpdV ztv)e}SDqDNh~%GivB9MF)KB)8I1=#)P5}fUjyqZsX;a^uHJ`)sd}@*oaUf1SfA z?`q1mdmtJmtWyfrM<0vy;LqmAto$xubrsq|xC?bEG51u>)?%3a=1ft(-W8UYltXp^ zC{}^vB3K>5x@H;WL~m|E#2QqUtjY(LM|4+YCEcz)y?+))VMCoKSVYY&a*I!fLi?piq~tXVEzAlF|18IYkboMNpp^fL)H~pg?oSM=0}1 zD>_84S##5g)_4rpaf*z_=6SszVbu8{s24D2!-8)v`x6F;fTyUJ3Ds8;^>~f@ZlJat zCx3jP(vs1BzRQy%&DDQ?F|XCgA$a2KGr}Bwq*Pb^cer5YsIL$Av6~wU@*4tA#vz%E zdKDh5C7Ed^2R3)i*iXnKhw)~806tB~1a@yI^#we^HuD~KloB<0d+iB-fZf`ldju~O zK2UwZZB4*?FWiPqgn!QuN$&(D~b|G;D}VV+EVT7P@)jyeA*K-N5jjJ$xOn)^Yv z9kkWCIP!2ARf%9aqz(j9su;G0eSI^vCcx?b~5cU_fu_!b!$45Gc&}ng%bgPP*iaqF3`Ood?0ED!bnG218!8`Lm>n>O~{R3-Dp5y{(LB5*~lZ4)U zD813^ab>P9SY|_6jX=VrUmLhNIThKqmF{Ad`yt~o`LlUrd1{o}WAOVm`0su4G`-+8 zbE7Q6$oP$cj(j)p**_%+U|YgS{dEgY)@)M90k_0NU>;{7zN62F1@JdrFP?QYGdZgT z86R`#1Ar1!+RipP@PkE_FYLwn{FAISl#+B1OIdty;w9ZlUyj*L&bQ+s8e8r(4V*EI z{i{hAQjRt;uJ6(~162g#&uJyBqp+ST1?9?0Ju8y3^_F3CUNMzS%&>)$^Mosafczu; z^`rM55+@6+I2p?0Ak}#RvL?1c0G~$qnEt{>K1YNR5H(Qa!YCO@ zpMoKZyNPu85Q&}4_t`M0T@R7wO@gY%%1gv=pCP5#uKm*+x=V;lBln(H4_i2N+0MNE zqIi0e71}aQjxspv48hmXOHe=-0IQWS34@DYndys~v_>_Z+}Rwa5o9mItle)gb%-

i71cd2RrW-S{D6;cod|AOeaJnBO7(=_@kr>k{X4Lk-(RTDukocu z?hfiI^IdV^I{OFMz<@AtwVI4fuD3EA2?O6x&u2BTTlHAriZn) zHb6?0UKOwEdXwcxLMq36zt@G=IdYTN1Za9|)=cjVg5pcLHZzrG%{pEyP5{eT!)bt(5wJ9JGc*Xf71`VJ(*@f zu*PNB4N6%@uDYFqK!7?iCP}38f{6|8gA{W$##D9c{u>MyU?h4#3$bVp zYL2x{m>PmRb%X2aUEuXVD91n39Em$+FaS$oMiUajN`<-rY1N&qV^7pqGC+X9&({R1 zGBpiV+@$nsK1qo^?+!!6YjI13&oB<%QC9~3B8F>lhkKzg`c2=mH9Lx;2^pMkB4b4Uxz(Pm zN{zF`?EVTCu(J@b%AmQHfg4yv?soVoWII%AyzBt{%M~d4d$A^6Ww3d|!VzjjHw-h& z(ThK@_byE)g}_FMHe6z&ftjG%c+d$$PtRkz5SRt<1k9*N z;;`oDS9+zV8``X*e1hpuvq+{&8{$ziWBTtPD-h3vfoF|@ux*BfCL_vibqv=s7*Ze> zF3CxpSTjAZ{a9;V-LKGUu}AR8bVr6mceWQ0X@s@Y@1M~hfv^cym!57|8GikwXFR{5 z(79)F0m#*uDrF2EFK+N2`bbNq&yxAtWhSpEv zeu#y{Ycd+)rBl$uQR996TxFmvSVO}1#3t-Tc$$iqZo4?TAL(uC(p%~HjlVH5ClA>k zX23H8H1602rhXN;!am^4j{>)+-`$mEK*kKw)&gm;4+}V`B&P!qDs!08Sr}resKMiN zD<+n?H_m|#su`yC>(9CnOoc>xCNb%>QFiav`qC`)P;kzi6dpCqudkVUDdv;~*muz2 z0P7o@Bc%Y=TLX6UQm$ay-yt#d@m5IHa>rG)w+4Ax|x$Y^?v zt)!pv^C_k7@HxKe#>66#6k4L-)%P*uCDQAM#@y8FWZ>j$z^<}J5jjKIJKLKB;oRqQ z9ZC5Jx!r4k_#hHikrlWYfoF3=3Z~UYL366l$OOX)2N*Tu&>D9MJ)n-X zvwe7w>a***D-LFOE8Qdh3*U0M}p%<^3Owxe_W#BVgG&{!m7~A(rksuLd?ieS9sNP zn)Jd^=Y5Up?fg%^_kaRGiFyuDF{v>S(l)}P2hC(`JP9`J>TaWBJo-~2*a>JNYSo$r zNzI_j*OLgqjO+(k2^-Tr3L!;@Rrl+2X#S4jlk609WTs9y0`mxR_hv0=zf~vcOh*-Y zO6xGNb>-uu{LsSSLl!OyxR!5HiL<}oyLyoi(`&H&C)kqVZo5LuHcB2?6S&g?Ml5`C zy_ntYS$MnNy!Ja($IgpmU(rcweb7XHLS0oQ`+}cQ2L`EtZA)2TB@9#qCL-PT?fHa(;C}v4L6NN_pz)Df1<}v3|Xii@2 zF>|fJL;mgoosR<$LifmRnaoLsA7px=72ph;{m`2&z!2EN;uSB<0@7UaNhThHKaBF( z^u^UNzcu$T1Kl;N6sUO@;(SYJw&XNqoj$G?ZSyk*z>@fO01EpHqR z>Y4|X*Za4Hb+d#Cs&l=w-n&txnq}xoIbV%IvjED-(yA+y^-67I1*fku-;pp5XsZ>< z!%gl&+9ilc@J$C5KoUPuSLI-V1$M@DOU^18+1d zVWfKsZJ<7I&-?p1+vi6c$}KQUkRq?P?QmSH(wNftRfl7x-c*J z-i*5=WsYM4(Ce^EBL^62EY-)@z>6SDEf2}ZL5598aopRSniO6MD|(^k;zDFYz}b?4 zr}~}*Fy8@KP56a>`#+}IP`X<|RS?IF)=Q5yUIkxqYeQ8OHj!T37Zh4K2$8M6x@?}38wle=sFEhM#==2L)=uun% z16AC;H1CC9b+WHA=41e2{`Jkv(y1$|@>}zwtHKTW2-68Gp_6OZ{zt{y#0Mwgsb-yU zo7__PRhIh@6_5&F9uz78?!sHJKzKhy8`NUrDTDOhZ?WewA2s29z#_TzP;*GzAU3r(~DCE{j0@)ra zYPjg21OmVaeR3-uxrK)V$kK!{;lS;cnCHB*Jpo$_>hMUP6ZJ0B2{*gFiubsq1_^?^ z^zyhmVR$g!D+@ZXWCCuEnoa|bVjnz2)M{lYyKq0E(eR&WIv%lKi*8H}NoySY`RD{r zuLSxd6`NWm@S)u+qfkv3dEk?Z0a>Be9|T`l*qA&%4Ssa8ikM38LQKH=IC_^kq~jv_ zNtOGsf%Nt@xRA2|eh+9#6hIr&3-B?l_9()XDZp>YvO;jrXDX0?xp2M_#Y7>1W~KCN z?=O5G3fOdxSs4T5Tn4yU5x#blCS3bsxBxe50=EBUnTZ8(i_QtfzZV153Bu+`cjcK$ zdp9Pmz)R^z3L7B!oONFv?Vf&i=nM~HhuGu;U4>FaI@BsNEw*;EuZ zsr#WS14h$dcCK=1=9y@I5*riBul5m_#Uyp>%#FwsUI-AlQEc}Ti7YG*N0D3tFB?jw zU|gyY){0xM1k9_wt%U_jP&oD5&NgPTR{~^p@ zr5o0Q!qqM7ky)|bEyz*l=tNMFA^8N#X+O|R<*9_S{Y?ziCBWgm@WPPhOeq}f9Lt)3 zjYut$(zcm?6Q^8Chb!$3Cy#(9D zAxj!VzVZV}5pwO2;8gZKUY7KDKlg12gC7AJl2p|?mG+?e<`Cc`ydRX%e^0vpFuXa~ zI2pPMSGNzo&J5B5BTtCj7zG_D>(ConM7gUixA5hsksFY5R>0cqM^wAk@nA9Eg!G#F z7k~@2#!u3(qd*Z2l)=~A;5%(UzrQKa<4KJEu4xx3siS=U%k5xMlLp%p1#+sOs_RKo z-i5T+{-VCFA`lROyd?pIe#3}>#KHua5zmyA4@hHDcIidn&Uz#CFd~KeW`q&V74S7T zq5S@Pg1*2$r2gs+is%5rGY8iHzL~;8iR#rxH^%yxoAP!8!R(%s|6ppYW3A87>)_vB z=s4ec@whj`m<}RDLW=dYX?7#)?nsSgNtE>&%u^Ag?AM&)7J#cEEiFOdyoDTF5EhsJ z+=rPFf!+(TrImHP4pHPv{8eBK>X3*}r zZ$P8}n1d+VrrqNVw%S0EgGCBpkm?^gK7S(Y)chDy0YJSC_5GrBnhxJ3x6~uA2|8DR zy$CJ@+`iCpRooPk?>=An?S5ULBIziy)CN%jL*wb=X3+kgL3(8oAfICzimyS$6UG&8 zSY!afeALFKDA*x30C?ga&_qDCLRpzKHzyS*qS)#2+yCGhDn2Z z$Yv7hF5cC&9Y50W3Id%HNeB|Ta^TVlkkbhiZLH2tCwD_hwut;bfz4Avm!U8PW0+fr zJQfDWzz%%s@fMFATT2S8;Kav3_lp!8a@4)FpW^PJ>~cA&kT6{}T2eb&2B<~Tz)?tmZ z2iIGqa|^&FXzMq8Q2engk8i*=MxaG9l)cw>C(Jb2n-0TAxmA(5!YY9?kFvMn7t9{&uC=~Fb zaE?K4Vj2!QV;`o=da5_=>1kld8gocjZvaxYA@X3}^6)^SaDjz7`p74WEJx(Gs3;I} zerNgHU;sTlLyVoS5WDVFyf+18(Enq;TTaYGD`HQoiz5x&|e`T{@vSY|53BFIV|IS3`3_c7Sr7 zlN6aw<-7XkH0OQ#OCwNJ7XiI3*! z3Gk^1&@%`l1bqIVSLv%Yo4ZF!QKY^IB=p8NaF6Mf0>BJc9hUPP$paP!iPr1y=@nql zsuSSb#;Snj_EyM%YXc7$jqeq>Hz(|uYrpiG{_56Q+t#Bb?GJG3jzTlWqx+R0!UzQi zsbHq!d?{H}A3>0i-a_CXNDqkaSa=<>2+5-M;^U zn?*Jy7&lFK;?Ll#v#SGh`?S`=JMluT7lTG6nf|b(1CLTG?t&A?t27f%|)-{ zrTSBIRphW7y;8m|WF&yjql4saLW^bl&+Ir+slwB}eFY^&ng7a6d4Y##*=K4S|7OYsXAK<}>hEwy{`)@|k^qRy3lA#f39xsQ5CuW- z!!(FK`Levh+Hf}*xOMP{xpji%C*YWB&%IFR*6W%~7ZXu9&eW%i8dHTbvjmtzVi=_E zTJxWcXUd98E8GLiAR_x@gdcxts==|hqr_1dzyWTie3Yj`LT4^s0-FpT_#gcIXG_k& zvinzF+bd=LFqt&d{Amtq{*CH`#~%~tB93OD-oRZI*!C2IPFNWthhJsDO138f8Bg9E zLE3;J!OoGmsV!r!d+I(nR)Za=QQ> zZVP?5Oc1dhI~?^EqC+2?ODpg#+Y8`b$+-R8Dg>2cP&j0CAEDiWbcjbr5qJx_&q$zB z=?VRPuv4rrB;N})W(v8w6j7X{ar1#14&&8_T}3p&aFOQpbpdH_uR@_&k@Ol4{GLSm zpg~ox^w;h73%}}-$nXzC$hX*{eyFu4i`|3DFnv%qLekLInA`Xrc|~ggiE$VA;ohex zMFFwaZy9)IZ^JvIoKpAG%N=Pgy*ryG`z=&6mLlOB0N}Ry{Mdh-es6xwj_+ThtD^bU z$*Z~0!1n6AE^P{Uc_y!H2x+nP!PX*b$47RLSAn2xuSY~Z#PMjeju34j?YK!k_7C5Z znu9uE0_2+i0bnMt%{Dri?92tyre72!H$osBfNte%ur}=Jix8TGvQ->WyjkkjTe6hG zwwpK8FD^ePQs&GR{`}mvwgq!oMMwk>*q9O~U1vp&9fCb4KQBW%;TAE)zc$Let29p; zR(c6ftu9)8xUe(HNw``x?v%mr3JI)4sQLpj7)WBW*mi`>L5;iJo{U}HoLia&_Q<18 zXwQMICaA+lBvKQgW7<>Yhr{iBAm(fPf2yIjDHI^XZk928x5oy92jtQ2Rt#bSEYqm8|p%;f7$`w2Ywn-q+#SLS!Ih#O146%keyA)9^p7f z2-$@alI%^0?3qzyB#C1kgzRH;%yWLPkM8gN{oeQQ_s{SAaXqfCOB|o`9=g zegzzF9*PB&yjr<~F^0S!5gPg`9yxJ-IsvAC`{Z{$Jivo!fRG90H;fw&4?=;pqyW_~ z1ud5m+&cSbv^Rhv{gdDK#A`$u#d(~9D{-#?Y3nzWQlS?;=iSDa2g7s5>|m4V+kpwm zdHh$$cYO@bo}5{)5%?n$gt5m>fC{!v-(ecaiaF*g`B$o7kaP1`sIc3ZjO*-&jrxA0 zUo)RK9zao@trauG+c1-j_4(ik76={qC~&Jt{bJyOza9r72M@+hAQp|lZp69?^@X4n zxn@MLz@r_0=QqN-woR?)GWf$}@qpm6RQ@YLA4AV4K%J-e=q2U7HP6^6{gJp!>s7k| zG?o9VK&_lu|3*Z5GidU0sR6K`tEOG3tya4-xUZusW(n$j|KHcE6;I5HKg8n}q z2PjBBFB1y2Q~-w&o)(;Jiq6M-WH(z_Xv}UMc05F;u*LuWS50K)Vfl%J10aUei}_SJ znz3*Qq}ntuprRnC?%)xKgK-i15VTqAsf_#(Krm#mVY(oL);fW5JNuti%gSZupcN1~ z4gy?|2T;By3=9?e1+!leoUob(RrD1wSR2@#{68k(%gPWvRH#X%?)neulO>3#NpL<# z{tzl+WE#f#9pJE%J4znCS#S7}+_9RB zW9UfFNOGo80`4C-hY%`26qtfEt{7G%I{!Fo<>J4p6&C2d-~{~KU2BB6yHY+LNnbcY zo-+Na_SONmaY&&pL@LXT5pQo0$xG2lK3}w|LDcA=WoNY&L9r-PlE-A7s5SjYjj7jf zmSI+>{{Bd{(s^byQffGZ)CjJMdEmRL?otyF+1oSdzxTTomXhg727P%t#mx9l~$!;Q#o>plV$Mv`R9~t!q2FMf|OGo`H z9Mtz=ej%*~m_qUJ7E1v$xd#2KQD^tELTqLa&MlltT(5uPTVx*W#bfBJa*$ee(~B+dnr#zHTjxa(5-=nDnRP|5QI zv;w(Bvz0L!Ja5?qT4c2EKmAHAxoJdGbo5{_g1}T=$=o(cnR|8mspK7JwVQmhy#$0B8@ofi& zW|0UTrKDT$L#H@%V{A*P*^#b|9F}k=B6IQ$Su7tvp*4B!ot|@-Y<{jW7{C6r!$WCX z!YZD*#Z}qz;R6?9P(eIT{Qt=6uV=9`NfFmT57-AX7CqG6G#C`vfa@9nKp*M1-e=kz z18mGW95MAFR0Y{v*I%CVh%*xS=8sT- z3_!J&haj+h)otVn=bhY%$4Y(rFOL*}ak=GjYg4)nMkK!ln1$a0(sPfD;NAv{ff3=q zeu4gdfR*aG#6Pn1@t#mg_B=BLNNW^_S`oOu0kW?FvY6?G?knqVdQjA1IY>rdO>B7Tt?S!2Nw+ z$NDcAQGi0d&J=lU`XJbwUxa?+0LSmCyHO`tFn!f-pW3oANiI;U;Nbu*0lMOd3FbQV zjdQrFvZ}XPU+1g0y#ajjhDX~cZdI@*^mU)qRcQ`}_M~EJ*5K+Z7CF@Cg^T0g@&OnD zEZg)dB5*lKmb@uNOJyZ>++4ORqTLG~iORx>n;NQX@f5d(5sU3jAt2raTviWOk5F^0|D19!D0 zLF^(TW`^06T?<=?coK?`C!MPl|9Z^rYFJxvQYTnPst=kVO4BU_Fpo8C9nd#FRnI_2b;hT>xQHGj^V8TIVSdOCA#iA*?Db560VPfI~Ui`oibcnC8_U(Qh^0|BO)eB0ls zJ>Pk_9~i?OVDj|{qHgJ@V<6Nb79W!iAaDY*n1Hk2s8x$a*;-dsX%hzpQFrA&V$`K{J z2z9$lY!K)Z_+u7!K~7Z){Ttgql&F^Q3y1DK{rC;G@J~O51|N24UBY8~P>?I(l7IT* zorl2t={Y!wAp)ZHE}7vt27m=5;m+C(7ck_e=|w~w0lX!YJXe#e{);d)pBU7g<`0q5oSpRivG z@2{+^H?b5_U02*zOk=py0VW3u2H<1+ise?X+w4bL+zg*C`y)p%PCw__M=(9HAT&b< ztzOmh#e}%N z^&#xY28}+83aS-k{AXVrh@gR9cVbqqRoxj><_P07B;~^fC9>l!_TSA=j#W4z^6APX zYUYP2a_h+_Q6BI3b@&Zyhd?}c>dkz+`MuL=|5_tCmJe_cp8$V-Qi2MVJp&wY2?*O^ zoD};!aJCrzIhj-&ZiI2Z7nE?o%He4KKI-bb`hW@s$2+!igW+zz%1Q_zC|ENe*XM)~hH<`A za%y0*Lw6pIRjT0wELD4OIOKQL!C?jkMp{PWEM1u+-Rf{fq-wO>W4^A`Bk{bCY4uX% zD!(3x801b$L(~Zsl~`eDCvmIt1D8(#HiE9ZSh*RSgVs8zoC2)Azc|s=Bc^MzOU@%R z-tP^?*LgP}EQ*I~s`_DMG{6Hw-C>_Je6I$BXrrPZ7J@l&pq~)n7htH-qWc|yMZ-t@ z7yyS8!(@Qh{a1z84#U*!)o$p_P|OPfh(WyS{ng#N*Rk$CdBQG`XVET9bLSK{*c9dN z)U&$}fdE8Q=*4-^U&wAyqqgpVnNvUJMC<$P`v@FD^>zOKVg&+W0$PCZbrqgwJi&CX z0w!N+0S&CI&()828SuAkOID6PVw%P9;-rLYBj~c-;)GYt=^s3q&8B}Ccmns~VIg&W zmE+eG*;U|3&R8~=9!mXgUS@|G@Fwjfjz)o1^H=F`p(*gF*s06kTG4* z^B2SPFt(+`ZqdG*aIQ^OR(nAirQeT;_4Kv%mwxhHL_PaIyWQ$Oe6iHy&CikJ-<9xd z4ZtmG&%|NqAB!waz@b)(U=Sceu#pZpe(dfiEcE)<=FgZz+CtUg=*?uXNY`f`VDa7o zW&y@a_5Tew0U*x_Gc1R|1uwx%_)gIB5#Z>q58j>IFdhAdOrM8Rs%*8hu9YmNA=@p=e;=ELmG0B=7fpX9;J#-Fw3;UaVN9q z;&9PblUkQ?u!x$s8-e6BA_Sn?*BjomiwC!0qUbHH47=|Db36vdstCxFrlK9O4DgHQydJY}wO<;3(x^(R-zA$-h8e_UO zffQk!EK1l+ibUMF2$NHkoK^(T9njvQLqFKA>fQN5lJDqAUb4FRibJV=)v?j3M%HFAV=p=u#79k{VxX!{Xp^)nL~gOTUL!p^O@ z3BcFv!P@{`nIp+FRb1J%Gu}`JkLm}jM86Ssn(TwsF|}~q6Ci>QfVsN#XlNl7ryU6U zqoJwnFe~`QNC4>DB?`H3fQwYA0vZ)24|ifPja<1P_Hu%jboSsznAnOuVm9GLDuf{u zwi*I_Dush~RUP;$Cth^uHCG42s_B$%=wuIwuK$|dNF<3_0NGUnZV;WFjhKhInw$er z=;3w(kGqYW6Uw&$3>vZONkiaEB(Ij{X-}`dkKxE1ROja6^n0XMhb<^``S5*i#skYa z#S9|OVq6h zkS&t~H~KL`LNHAoW`r9G{ak$yyyb#ur^uYc+#rFS5MMa$s{3)YZt&Iz%U+Yg(y7Xk zo+1!{4casYpuu+j4_wpd_)|j&Um29sFK5atOXB)#x2+=fc2`}6EDQwew)u^e)r5rM z9L@&C^A)bE`?9mo!#?Cp|GarPAdy-FsG?^+)S4aJX`qyS8E3lMj+7(0>#O!L^#ckl|REB?l3}F-w zw@zP_JMrWICtNY5x%pPi*Zsc5nwJ)xbHlNo zn?WcavluJ36*x-s*n9UXU|eyd37xUm8e!jEg%j=fLP>ifsS2bS$6(g!E&6!@r^!y2 zhGQLosqBp@t-^0M7X8u-v$gUCv;>;GdT+CgLHP^}WPXD7!$U|zB)Z&0<5x&Z1vViji!uRx1>NYn z)OId6<%)UkyMPJxT|l(QNzkux_nej}5P0b^n@yOH$JCbW`=hzx zPD`ci+gwvaD;M9yKkO65zpWIf0wWFg>+Ux>S_ z7=kG1DoW;Y7`bwS9=Zp=0W%URr6QyG1_$0=y*ET~!Ee8gJ6T}dsAjV?3Y!eZi$%r- z#9qrhY=VIv`Yc=zRr*dHj0@;$OMcx_->A!mSM%(yw4i%d`%DV7UtN$LGQTEW=QdzT zKLAJcRKV$rlNIZ#AO6w47*W%kuWzlENxWP>2f-dCBqE_MpMNe}l#wh}4{$34FOgc1 z{(CeUg})QUX2$)q*v^`tVcr0=|Fz&f>iZk(PJ}8#3;^AgUZ3_8& zO1esZ-O=CtkZHi>iyE4z(3z`0q=g1g%h48XuivX!Fb8q=%luGg^m^)o!)z~~9n2n^ z|LV`Z#3n{n%li%%S0kCvbQ#@8$IajCdKGWDR9a8mOmZA>=Xs2t6+C{IlnG-!d*RO7 zXur0nU-}w`X%0$~Y%t?vicW*2@$=tBnaiM<{lzC~_M*#?OtlBNOI&KvSx614H$!g| zcSvZ(bQF!5Qzc|u`BH!KC9Aj(hnS` zAD8O#H#NJW;_{L(!aQDt<_ZluVn&{={V8nj0wQ=WhD5u{4@|RTlg-R^$7+9jgIX43 z;;?o$p42mV?_KZQOQr;H|wN$rNN@NQ50KMUH2mQke)s~t`t?V&+_ROAw^*SY$2(+%iAhByg z(C(_{J!ST%H60k6x+Cdb+@o@h10}qmFmi+9+c_M(k<*OosY0(Tg6OJ^7)z0#ncxV2FA zhIIm3pYluW&F7tb=k7jE^bFC#=9dkq$l+H>^EmRMm+PeF<&$QMuQa%5=~^$TD%`Pr zbvnd?C581hZEHxh_}xRS7cC#WR{wf=HIYt0pjEy;9ge9G-gIl+#mTjSjyR0N9I`{JlH{G|b^%${jpB(Z$9u2$oXA%cY<~bC zHe?}wt(xW2$eF&`K4{NSE$s7F8zRFP&J=+` zz?gK>%fS|q!xKB+ZgD&Dzfxo=u^eEBb8aq&U66gCem_<6Gubl26Nhj@-&z8uoi+`z zu5a6j8Vm_|LOuN#`4 zxk(aUNW)`hHYarGiJXb`PG;j2b|^bb$+8Tz~`|6zT@dc(92v!f)Grt~GGCq>WP-;DOnD?sveb2U33=IN~Cb8=e) z_%ij4Mhu)3-O4UM1-&<>n^vU1+AW^4tk`DDxo-|PX7^gi{=n@6K`=Y7%?8YFy-=8Z z?Cg4s&A5Uv0Pq1VQte2(2U^oGcFtnx;LNv*nuIOjbF+%b5+ZMkr|u~>x*C7El-jD| zNxEYvVv9R|R=|}Hb*e;>_vB!KBy-7K^r{;lac9T0w4u>T=QKfcR%Plwv^h7*!{7-Dt5=J=yAP7TXe^VA=`@TGilBg(OE^Wb4ZX2)cZ42*&fNH z1XWNKD=WG^mX|(}93{1K4U*fi_DHUZ2j7p8)8{w}z!z;mId&)}2owqcqS8{OBc=}z zupB^$o7WAXC=iR%{(;as0abswLu-P#N3}ULPlqI(Q;dQ|p2IFNhN`&GIucHJU1Tb; zTsV_KXg^rG@zY&P$+jt}X89np^f=6tz73}u;*tJTXwvM?_ZTR|Cq1v#yPBAP7J{5P zpL&F^Z0I(^kK6oddF8iwm5sue6W*7?i?8nXeIJYPLlrn{1u-5>Ug390Jv_~2PlZyr z1+htb$DF9XtO6uo&Z`P$3>SNdSh!vRKHxks*zy~xB3H%@Z{ky}Wf@u{T7TM}`dtw1 zmZR=E)4H4ouO#89)LnFyE)67EgEM~@*}LsI7k z;4PhUI*gQYudn(`(^9KE{PWaO`3?{7Y7 z;IEv%kdpub1GgX7-zo&9WFNq@W=O`Ok^CM1dv{*^V+@t&?|ylj!bRPfxpAzW+_c*xhZzVXP*0M7v>+Ob1@M9nP_^|YOOp$=2Nb~j1&-T(02D!Z*v$EO2n5?#n;^kp zt00PY{_ccgqXJlIV?n!bq~K5kk!isM`dKu|UbgYdEU7S{z3a-$*Zle-1mq+>7K+q? zpUILQe62+D>ifUa%(DVRS`;Y29Q#tkT}t`&kGMMd57z8pgci5g&249X?nO(I(r-AL z8fu;X^M#&V`**_^+m;ARyULt&uD)azNC?o^kF#@IJ@YYNU-w7@=MI5nOL^w0Nq6Su zPsWWIp!K<2fdzwGf(I3!++3<9Q9w}tH?5>p3M!Pz+JZ?D+i71LyI>$a$XVYB8>GS` zzgJW(;}ZWb)r|Y>;2(Lf3(?G|Q-=Jtn~&xO%L)*M1;6@O_X7q%mo592?M2(5jnXMckA`e%vDd9buGwu8(4E1{rqI% zI<(xg(Tm-c;B@&)HFc4q&qA~~e{aWo)c3kq5=b#nL6^@xYA*0CdNO`Ts68wIw+VNN zUK|3GYe>QQ^@1`11lM0rFo{`!NZtj0=?CvvjV0|Iw%&a zI8CNfLvIPIsM&xR6j_AGCf%)pQv8`LrLjO|^*xiV6@UH+nAlm*mB~AieD^{Q7qysv zl>F^%fe>F-3U4mK6dvvzi7`rpd}etS`8x&7_dC_nU;kKN;g(84|2!p?T%14=zgf^z zvttA-Rw`w37NgYcRm|?9X6h4zHnoVlcoZsl3h;5`=7vunz-hj4=6(+i;yJ+7s=%?M z;=0qrU23bS!>h-WD@3pA7atcsK&NG1>{#YczId9X9&7==H6)RW_d$|W-$=-B??xi9 zR>t1pk3T_ZN<}m5^W7H=Lf?VHHU)+Dn$81=6%;Zxgle?rOcOaz0z5E1RE~>kj=Hv% z|HK}lu8@jB^NvnE8~-k=({8ezGw4W6l0+2lb2(Fsy$L(WnS6mFCWt3>vy-xxTQ9|m z8%mQWjhmp&Z-S~zI2qY`Y$4}`9Up?~^k8x%C@1?Ns>28g_JZchJYO-HMy0uYU~Mz; z+K_5DeqPeY`ugdU0LA{ftxkT28g%s0CQgA83Zi2 z4XRKU{*nAhZMiAYYbyTb!QWJ5qPGV*l+=Ixai9!|X1wE7=3S8lACwLNe>FJcIkI?iOv;kHje53Y)t^r9Y_L-`&0-5qxj=j&SV?WKJ$~WT zqfKjNIZ*uax}|DQO~7PZBxhY*MhHKgQb$EyJ7+R1r{mjWxs^fd_AD*=>DJ0ZL!k?P z08z8z!5r%>?KuJ04^?3*sud7KP$)ebzJ_`}0Ex2DT3~KCPRK(Hd#yEM9=3&4=xFG9 zwQ8C&QLWM^#bx0BN3r;)j46nvjvaf}mof$)ll;ppS1_*eASpNi^b>3#O~qwt^j1O7 z&{mBVR@~^iz2)66k?H{Duuiy}|6E-_P*@gCoN>n6hY8#P&Peh|!V~)xW z@&MK=>RBjOt(e1=M+1nf&yr9egLLbeQ&@ctZNRg|jmei4KG3{^Vxdu1>W zpre8N8}I#OuB^3g3W(edpxO{d8YtOTzSdnS{tO&4jB`?VF{7Uk&|g{(j6w>F z8nD3wl*yyjAwzpfWy`H(1Ptu^-zA9RZ@YnfAJu=TVpDV2Ymuq|DCK$Rc8{wIR3M)i zlEDJ)$l-vtu8(T)rBXHyhv75Ye@O{svN}CQM7U7S^dVYhkSF9TvPL4vIaRD$@@+C~ z^mS{^{oC{=^L`Pv{}<)&Y%Go};;tcPLvg^>?JUmM>G#}21lW)tQVCkH_7cQpxd*EQ zHOBD2Z}c@6RqQw-q{)K^-V3?)1z+Y7`x7_{%2}NpC);NRXvL6Ttm-8EO*X-Qe;6pX zt2w4WE1b+d#)3Jkqn9GSA(pX#_GJwSFN6pCM;r=^O)OXpz>DiSe39k%ssDM%D3&7# zS%)ZI2wcSbum=%z9cbHSopwaL2kOQm2n+Y%dkpzrMlI*z{xuPHoM1@`k-3H3ll!k{ z7S$m9L!>!~+NCDCd<$Zkh9ZQaX(#Bke@_s%21QyX;zWjO8j9w*fcA>bvCtaiI%l!G z0Q=$ZONthWQvrO>Ng4+jHkE<(FZBUp)ncua^yKv9V1-krt`ZmqtIvD_eRTw@6a1|R zn}4sDXKWTz-|-+hH;WVBp($YB*fo1|DfTPQea*EY&XK4s_N)p za>=Ltm5|cV8dq6@b?5iLAAL!CETA2j(GY7j%N=0St5}^7Q~E#}FadTg??F)teG)8` zl{@=Y0v!l5;-L=F@6GH~GoXb3^NiB?ONcB${K2afkxh5%ef@1`e|;(S+S7*8EDoxl zc7KHnMIMAjq>x%XJ%RKP2%G^A84n_oV#J&~)18S&igxMAr$AKLN%-GKBwCm{i>{P~ zOy}8O+*eHDyh25&?*H!G(fJeI$Moa-dOS%KbwPHo^w%*GF7ulmh{i1U;nhqar8>@C zudJW!OvEcH>XDzA|HP-;JNPYyD%V#otVKrxvdwjodA|&2Jom~fdU>iGk)l>)2NJ*H1Ud%Zh*vmh+ zdEg^^5{?`kGD^2z{`hTi;oR6A+nn3wo;w_KKay{;9L9I%-evQ$@cNbI#V@}YI3wH5 zp>+PqcSk?z3zdsyJ7uG@9Fd&iE*grny)Zp;7h6M+m@v5L+``zkVJYet!@RqlJU6vS zlP4{+YF${oeh7L(j!n;9bGa~ytf@f{^ zdP7unFH$e(=iQ4r;B!MUJa=!01d4u1CrMAJM(c0b=~-X58nPzsj4%<-IZfIWJO0UW zbz4!ByHGXo;%72FJouKU;Ml%l^7SUe z&801;yPcO9B1~=_qp(z%wYxcv1?hN+o(BLb&lx+zK0(dmrq-w!x8XHfu^sn#ZJNl>mU623 z*#Z6Uu^A?IlBOx2n?Go)4LRq@nF7jU4dsL}XtKpPPK+SdyAI%TFC*5NVU4?N$O;S89uVjnJK=gLuTGa%3xTk_z(s4rvL$wTJh0MbYpuJ` zCzn{Pq$8A*jfiHfgVPSzA`D z&uKaMoP~Dz&7be_SmLfzX1ti&PzhP66=_q;ywpOaQ3UP&1MdeNS72Uqhw&T!*+-T*o(f@b>UHqOiv3jJ`j;b!_L3c3}3HW~VxbjjXcW>t+ zgSi!a*)_cuwi{rV1JwXkVX5t6X-{rUyy`0a5N4@S(?s(4T<`#539jnac|}pC zHLG`}Xx$P0@Vx}9dGxScYfQmpm^Qi^0Enm1LzPj+Jy+^3Ecflt)5W|La31Rxfm)t| zTcykT`4JOetn!Xj5A$MeRjkMPYNhSCOy`*pABS3EK;>fXB(OI{T!BXwFKHRLr6Vd$ zyR3NN&2P>xrVsHy1@h^>$HXhS2BK2`YzK1HK1142`Sp$YtwxZC8LMU1PUU~>4(>uA zOZN>Mb5M&#_T&xrofGnE|N6qM5e#zGR1Ceq&g&XMA78EiL{`C`d#V-cx~jWNgpsn! zQ%!(FP`t_M4ekYFc7KWOaP{|+ndfT^_SHu4fSkh7WD{mFbWVg4B^~f2ou6RZp*^Qk ze!=AH3(XpL{hf)(lOH??%?-VHxiTtuasMm6ewXKZ_Yyt$w5wbybWe%{1{A=Xoo5CS z;dF6gTR15r_R76+wNrmWFLRVf4!{q!@ALBb9L>L1uW{-$4*P9MbkWAN!pU%Kz;|z@ zjRFkQ*`8Z}WC$WU-+jqOp69K$eipPX7(lDFWM~y^l$tc#FKi8z-mqObrdv=7LFb1& z=JLWDH^%Agbnfe;H7r5gmJ`K`iKN6j;|G310Oyz@(lLJjqot|tf71W0MoD9V^X7DF zyuN=phhol=2CgoZ2N(0#gq|N*muF}K0s|9$n6l;>_>KT zD%DoaNcX@-`CCCtQzLD!XPnvGs%b$;vWfAa_#kk7CRjZu#XbpbbHp4646UmZvevTq zOPPpS?$60TWCBl!&y$FYAM*@6hbqw?gZloNKb|Y~N~}GQ%YE>hgZ}eBqAnkMa@#Wpj^=z-W;-~2kiIsAF1Nou*4nl!MG`mH`Chm` zUY+UcqW}hex$cF^+-&G|n>+$4el(}ZR@p9()!~ZQ=e%9$WWiixq+eBQNyACBV83Tz zzPBxI0#S)A{#q%6k`fw<5J;V%I|YdKPcR_bWA)UA!R500(RN_`wkX9c7h5XLGEa6M zeg(R@!}J%r<}T^Fe6Hz@RIarF`9Nx1#uWhfUN{eC%!s@yxDskNa9KKF&C&SX_jq!h z&@+s9NO)g~J}(OQ8T28QRkpt>35%o;0He0Xfv*$Q^qwbhdb1pe8>Hg!x#E8Nhc)+f z%2L4X^E8}cj*Z({+d)K$u4Rl(0P)uP3~tjm<-JzOd8t09f?nkD!hps#vW!)!6dN@L}(Ve%sbJS4%OAOrl=9 z<&?G%S<`+u>aKOiJB@1^Ou|pbp2N@{OZqhn+_s%ojxL=VEaVBkWkawCl>&b5LZEx` zz@OS*l1HPm$Ddy?&#W!8Q@iuL@JcyaRe0XIfN!cKp!;e1U48pQM_!;gvtll7bwNN5 zZR*}dcU$q1%;kAH=dBUaWTh3~xyh-FxY@%z70-XJsB_<0wJ_vHr8opfr&>}>RPQ?K zg6cms@3#MW2%5@__R zv*AH~_U2yuP5$E|_4#tmhkD+IGR`l&C1|Zw{HY~r$FvNVGc8^3Q+b{}|2RCXl-GIl zZeCUCtv2o2r^y<5I^A*9q7RL4=*;!K@o?L#1Cp;)&@>vtXN8Lj{od>t$Toz8?t{V!3Y=q2UnylVnhzov{=UmPDS=$?-?X9`-sBFu2( zLunWz!$1ffCGhT#AykyP{4PS6O4+PWFEStO zko)o5))CIR}@cKm67ZEtn3G`Jqo*^Hme>h2v-|_L}zijjv}Rw*?F+? zx>w^(_|7P5^8I3L7U$T;2!fbDV8PMSXQzr^`k?xU8nhDHc9lv=wOfycpz40vTQKsE zR=w%>_sX_I<*Y8iiAzmOYt2F0bGqH`2Kzm)kAOOgIUHQiugXW8R2pJ%RGNij9d=xd z8e*UwH8o1W8qCcbT&{lIVvH#<&DV3Y8UI?sAF;f%sB7DqAUPzKtj;|Fyb`)TQjRGb zpW~bLt`&qs69GSizuVW@e%x6snC_LPdnlL|agY;~f8j198QC61^?Dh*x;+UHSLF`v z1x=%!*V8uE(O9!5JsRq08P-!&CU35qJf7?S6rWq3f`+)NpBc%%zS&l79YWYAjWjds zf{<Onbtu=$HFItdTkkHk|Fw z;5(+y-&I|?<(s+FwiJ_VEJa7Ha&##1jD|*ZOYf~!$t_c5f|?MYbQ^&;$HL3IB6*Hp zO!0P^oMg#)?|3?yE_dYl%Nra8K<$~jvh+_2*Ry1FyEG~1dS#`XxE=!jCJJhe^T5|A zxy@&Ut97{qYEKw&^ao$N!{i(#nWO&A{?lX6`CdgjsSW&2cifI1g?zE) zs;@X{mtmnqrmgoF{(|h?@@5q{nBESau&v_>SI=_zq$?*bnX^YjljE4O=hDnbRTCXF zGy840W~79{uDm19&j5Ia?R;_Pce~qj=jbPcgL1wMVGNz-hPJL3us>d7nyKkog{S*$ zLMBR4@J*QE?}??~ex=a<8GE0U5&OlCJeH;yK~Ciau{m7$TFCdT{IwS|8cD~{B^I~& zgz^Pzr=Zfg1j0q=E@f=HTN^j#I_2_IaZizMQ>s>4jdm%jkY1{Sw-5J_g%`sUlY8!xs~KL1LC zYPdI3nK}1iVG0(~?*UBw`;wnjUw$Cnv)R}?eFuTIP*RUr{@uGHU-IlG>;IoWOHlv_ zdsi36y%CPe-~3+y1-_HKaceZ6HT2&ErUS$j{2U!(pP!2F+& zj8fI_I^~9Tsm#tl(Wp5C*^|vk2?Q|Cn$9WaqX|vOP5J0v zeWaTjK_~h=y~khP^wpuvykQ!$W3b>~15%Ssvw!rco&vDWm-Cq4sDju`KqD)OPJ}eHONK zluRE9Ah^=AH~Y-c{Y&H5pgbf<5wuMSxfS&dk8oI=W zNo_L_qOI$+`#*@jY-oWs(5>e~$_Uhj|MP}eBn4HgHuenKw!Xc)z7N#k6R3=nCY>8PKl}B9AiP+Y^t*Y9VO&i*S40M3u;*Hzw01kgwH8RavtsNzyvIY8p)+(zU70Qxek{-Qr0 zA?I^GI(INlff8376fhqg7M=G)5$Lu?rC^UyQf-F*M2ZK^8Sk@m*1 z_zbHH2!3uH-g28WrIjQ0nt2JNYL!0=y3M7d#MPlyWO{Z{Wgb#ezL7cRr~{pS>}0it zIHV@!Vv!~KAMYcHha;yindbrk{Z2iKP{CXLY1Mc_cUv6|99GWM@faF9e~q!b8tSzF zbScux03P;|fk%#(>u-Bvs@^X{r=;E?)7IrgEAVRc_Y>NWDnDRUNQa${%@!-8cNQZ) z^$_`nn;LSDu?hYABw;y_OL~kV*s*#vkqpa2y9Q39OO{c`RAzP<}I2!9fh5Zb=*f$l`f|c zT5jWiFUH2L!K?Pe^bm8&j`LL6A?|rs{dSaz(p}qa3_Mxce9oY`pee=7YGC49D$WE* zX_*&14amEYfA{mfnA^$+%t(~Mi~o{!An68!MP{L(+Nrlb@GQ$#$E{D3U(5ol-hoFB zwX~;gwZ!gOu{WJ7v=jE6D5;+%cHdYBYiG)%3edq=YA11bF=O}?)|g@$!sHIn#R8(L zbxQ_B@Yc42E|luDU8lq){IA0FEDK!KNf)0}d}@MC;fIyAl4RSK4l$+Vu(|7Z74L3c zh6D@AAVHS#?rqC*MiLsXbe|hWQuG+ZC=K9loB%J1u`zBFL3$2}ol!B%)dOeN4vsf=T8fQ07QL zJ|YCE2QCae0XE#O0^VOoqT`h40fq|!aew=)xJm@vC@c!1iKE~AGg>()yeB$zN8h84 zrR-C`X|#uxiJ_wk4J@wIopAmH@sTNe?QLagI))8$+_b*u%G+>IW7L$$wFqxK1%&aT2*r!c3WY*1&6*c5hjmD7Kqvvk0&I z2!u{Z&;SESUa*fK&u>Xe{tw7Yp4bA_#G3Z^j#Op$<&?jKJhq^8P^k4a1z)U|gI}A~ zto>~lnG%xM+rU{1>D;=&irB);6=2EXjz7d2RczTv8p4&?Cn5tQ{M8Y`0Tvm_3&XOS z_2mBmp5xA~nm5!a#{Z;$>qrx19Jr!$UW3_4?m^0Z6j#&Q26KGht3xgCd3_;Pmhnm z0I63(*NIJQpWeTlCf!+*=#u#9kxsajpW;zx!jn(3AD>&l__L1WG_}`%e6NPdJruvV zRqmBv!nj>`2If^5&PANs;TK6xtZCY=ImPIC0v#$pEixPZqt4_usq<^#Ch@)j7bFi; zK39K=cuWxgN5oy9gJgQhaHk;?e|6u$EyO4fzc@ll*scJB4xc4Y;U+NgsZ#P^Ft9cj znf4!o)X$_47~_YOg$nOQhyby}AVoevRyuXy-uvM2du;eu8boR+fSW_;uUKMc8t%}+ zz)IxuY<-grVqROy;+}lZIwA9kU%#{QRWlhnu%SZ_iWfQ0cwxFF_#cc4V9(Iibqf`% zJtSfH)j82t)cwTp%gf888?~U9?iu#Pe0D=`OKw|CeZDbG@R<2Ycc^X(-MvP6%O@P+ zy%*n67TQaHStm63CwWfRd2hb}AWh&_BWL~CI6+@^?>@&H@ST$1<^fX)+IDMo3UiCr zU!7KSxd!51_|vF|fbXt^-(1M@C!5-rDCjzds7|uwWQ+x>tDDI}t7sw@cK!*3haxX( zYH2)6A?&I zBFToi+}EZ@uf4g=do}Mdb&t8+ zV$4B{V7gL;`}M4JhEVGsVx>#WNwK(@i0s+lJ~9VrCDX>VG`oICQe<+qtU$t3`HizT zY~E64KZVc$VDymqB6%`khdrAU?Aax~&w8hrc+ zs(#lzA~#SA;Hyj7kG&-9(nwvFOle(;PT-GD=_NsN!?rGSd3=4_i`klEC)NCwR|!sl zbn$r;@98^yGxW+D^*mpFUqj}{6b!q5W%q8fyZFGN%JNg{ksKO_R-tz$#0-dF>=q=f ziA5LP>vk>cyHf|gz73k*(#elrESo#C>n$@U{$wo3sh2y2Buy+Hwe4D27aEFqQ6YO&R-1)nMbX|*8KRlDn zj;v%$-c}mQ`zuw>K#vGs&itFN?FZ@nbQHp;A!y(Tdtk3hR-oWTx@(hu2B(0xj(?A;P3?%d)9JV+?&*&1ScXAr!Yr-2?ML^oF@LdGi-9iQNhEjsqfUWo9Fr)rDxnj3tarMrE z^@2q1X?*9~5F6$%6C`}GNwA;WSwosyhC!;++}$^xmk2?e%iZ#ulU#@1?a zx=(wB-T$A(3%!sX(=jFi+0_|RorDL`T)2q9%CjAx-s!#MwI)elzjhAVyFVGZe&Us# zH8Sfva%pD(rEOvQyRo0M*LO!!B?gi`K_Yy~f z5>{bEHqKljkuVx^K_}XmnYfcdBHzA$1oIkUHSHL$<4B$iJyU{}o{OT1Ba|w5X~SuE zIRazW9#hv1S%A>$bhOoXu5c`xJ73uG%pA$vW}K_bC)$UU$|Xl5lmrl^v=-sqcwRoW zLE7`vr)%;J3~7}VK722pXe~&)0ET;t!Lr}1QHZR)&vHus0NNoPz6&T&E5n^ z=giUU^J1<)N|5Ompel(1vv1W6e;s6=E}4HHg2_UnI1_KrH4%|x>EG|wos;r87*pXUoqNc_fJ|}M zieG2(XFBf@1IZ$6x3#7AZ26k9>&)S|BAvyI2;JE$%FpO3!KciKPT6C;AMa5cdyTUq z(uLyamuS+^sIkYI*O5gUmAE>_fsyb^mvS~N(&5d zh+`M438I&J3Ug=AdIdhVk(?_`C((QLeH*!>QQEbU+c;=w=y_)S-Ry%f8}F|&_cvZ$ zP9c@m*P|4%%qQII)(q}Clu+=gwP|LtZ<3-nY7QQyu$Ae3!W7#gL9Vh~rd=@O9X$u6 zzSnl*pO)dkmd(0Pv_{JWIhn*zaGIC@csbc!8}at(Lh80B=eBs#=g+?ze=}Am7b}Ty zdrQ;>J|&tzSgRZ`Cwfs{$1IrJ)j2Op++3<8E?(JFS|!}df)o*Lzax1K8(^gN3a$(H z8xishD3+*C+)I%y*zI(L)AZ{aCaej&=s)T?O=+}qnpYKBuk09l03z)Fc?InD`W*^kuPovnq?+W}Cp;jY|5 zJ)7osIIHtbapYApUCXZwsSm{b2Q1i=*4wMIeTu8uo*6k$b7)78otDHFo_`b@L0>ycqx4QW-npJJb9T48N2%UdnyxT8OalFNhq1&f^PN(d zB@X?k=HL+>dJ+#B?V5c}ud^qZS6`e_Wy(nAmxAXvcCs2d(ogGbp3r>vlj1Y<48+>V ztN@lEo9XzsKX=jze4Cy>cV^Yh%QkYA2QyDN*L7=2_W1mRo0HpMl2@Ng+RNOVR#t1a zw}^rZ{l4j<;{EK454E~;5A_$kp~jhuvpx^Fx62YzDwMN#mPQ4iI!zq8!=6Iwmhk2} zPs)fKx=I(>dCU1b!Rd7Dw3j)0=4XSa=Iuc1;04mK|72nxR&g;ZhnagKiNx&n<+x(^ z)R#=#pBn*3&hCyFC$EyLeR-FmnD`MmimGH+UqaLf>)6N|k(@IBARWzFYnRek7zA+ zQbvL)T4%4(VI3&Hk05hJj%IT`y#TkU8;g-60r#737SRMk3fRLw^OOv_%fv;J57f1T z$Vfq$WeG~{ z=cDddQ<#jIrug3LDLl0G-!bJ>=m*=Jtb4l7TFG;FJv7)iL4BIIGouw8q-45y%XBX3 z)T@BHr9iu7QT0?fn`qQ@v}*D%=XAQ?URFNJ>zdM8EMl)gRWHeXzMuFaxMf2{k2JEK zlJoiZNq?HBp$f4!o~7d}!a-pNQ4|N8IBlyoZe5W)&QdQ;X!=7kc+_RCP^Y%u|I^(+ zVU*zA3=y53p-K~>Uf#39Rwo&c+^K6Tt~uv>Ddj-|^Y&`45Sd|c&L6TxPF%_k?w_dg zg`K`#gCINRI~@EYKJ~?6InF5~$LdGKRq%~1!=0N+BUZEQlJHjz)dSDo+#X3Mj(jGLGET*DrHsQ@Poss>um|i`NZ>H=yUY zN*%w&^B0tW)`(HeE3ni%MV>SE*ON>u)_Sdsxu)pWq3vC(v+wd9Di2Fl#(48 z=0kv8)h45z4!L(+$~Bw5+>JgH{R{IEg#U-RHxH+B4d1^t?MjKHloDw~Xi!R~LZ&3c zN*SAE9x{i821+GTQYkWv49PMqQv*%PkYQz}l9^=8_@4Kw_U`-r9mo5=fBx1#``E|c zENeZ_bKlo}UFZ2Z8PZuNwKo266xf<2zvs?D@qaGO5PyHMpun-}ZtNUci489~H*o~* zb~qd=Gbul!9Wb=QucPY6^S-?Ys-LH@KD^%Ee6ZF?uZ zx;#xC+vguFpuhTg@tDrhy}TJyrjn5l)!I!Z=_3MkDpx4Bu!+Rw7gDwiHmR{GMNY1O zl%}Akz_YzgXGZ3m1o?}eiv;SXpAW96+W9kBNMVGMCy=Zw)j1vK$=&I4X_`J|C;!~! zB~3(6X|f<}w?kST-h`W$S|ULfW6goWy4!d95%Q21WW0e*%-aI01W~WVcIoLDek+1}9(`oXBxx2|migFZgjJEPv%vfuUI$p1ZW0 zLdJ4-rO!O7Gx4Q2tIWmIZfMUO&C0jUy5*Hk0rNF|wrpdq7Y>XX>K9f)cZmPYVyV3+ zNT(ca3W=(-G1sjOcgHL;Dv(!_9r~2AEi!0C^2WN(_msF$)doh2@$=3~^Jd>e^LnG% zVs4)3JT-Djw9H}P>svmPxDF7XXC1#&_RyE_-JLDRv-Z6GW_w{&x2kJ5>;3lG_a$GS zRIN*9R7(2VxW^|O8oO+qJRy*9c5>11v3t4?tU51OxV0~nTIiEefwNZ+GM(op%T#1^ zeT`0jHxizB%v(}5DsreS_>>#36Gzt*Bc+YI*LE#rO!>DbLYc|%8D#g%9$k%JIjeCcHEeQ?=!x1VJnx!3r(-9V z)JzR}?H@8yJ~h5cblR3W<^D)@!Sk*Jup0NRr(ei4>8kc(luqBbFg9;8FG$?3*A7Bjn`|vrefDqHkhpu zc!V_Vw{1z)KE+3mm$|le^5KTcxss12l>|W!0U@>Mf!QqYJD<{jq)v_vXeR1NgfoK1 z+P~hEtghPnpmNXS%DZuaDmq;WB{EK_8@~>38r|ahy|_BF&%JkDq~sRkv#l!dA{s`9 zD<4oFoJxFYuu)@e=d-1aS8r+bJ@Mt!V%Z$aJIpd=**n^lwEs))?Kpm~J!?+GkY|dH z)e|7^3haqnJOe;V;;RGgzl6qgI(UrQu9L>(UnRd@$c_maFf=)L)bVFP_+aTNok z*E%=WTUN)?no=3tks`u{JrTV-BoTtsJ?UVg$r@Q z&sOI)P7MdF`dQ;8+OB-1dh;jljDYv=8is9s_LA9vve()W;PJm_Zh6nPqyB$Rv!Bh0 zS!CdIu<~4JrToUv#)^EDqJYAOiNli-e)A;Pt$I+&mM^67(n*2RdVWN}scd?hjLZ@a z!WwoHu64O~1tMuCz|2_@OR{@1>a4&xg>q;)Ag>--tZY35l8aD{2RVK(HX&5kAy`KS z37(7%v*s=mXX6!j>eNXoBH(lMKlkr}wg~gGtxJy1+14--@l*T*`_00+lj@&!?J7hf zuUssjpER~S#N?vZE=3C84jlp9Mx5;2`utB0^{)%lL{^Gb%(p8WJIfevC4y%jJV=@4 zxHM$uys4$9BRJELe{;IRj+5ubnly&eMA`g0vHUy7q}`|L?#8TfElZim-o1?YmvK@+w6(TRZx6O#3lqNsR%)$S8uW!hC~qh*di<7$ro@_t*& zd2nyulFTC*!~+&2u*f-XGcB>GO5{Ex|FxYt1M;pUl4X_Tz*$-wP!uy?{mL(UlwsOy zI3&dyUTJO`=O>={YiMuR21tDtdKf=DjX4h?+FJ0e^Oik@a6%ut_#U87 z?1FU(7TV@Ae*>|l)Urg&{GTJHiqteLP0Rlb+YOGfKG@{JX)ra~5f`2TYg#cIBkDMH zoo!=o@@Bgj)!>;F9r4^!;=NCZCmdrM1nv1Bk# z41>`|vd4c7YifWlY_NtBSVxm|+PzO*`P~C#et%kbFdQXhIRb$uQ>BzD61X{x;4ys+ zwD2vV4@}=ujPIzOc9Fel0Mvn;v(Vvm)QZ0kNQfsHn}jpN$gpIHN~{Z+UXL0~HIQZ5ojL;y*&G8`>rq?xEmyf1yY_rhkxaU`oRJ-iwT;|>Y& zW_Q8~X+Oe~nS6th{b}NwCma#B=`R%?Bp`kPna<)FZ-fs1k?Z;YOg80OOM{W3qK|JM zXtfi`Jp=&>EXi|{b1yLwfXDS!nAg-NcDAahH6EA;nqxNTWKHr^<$vCX zh&2r1K4h{-a&rKUGb|31&Z$C{Axt)>=d!PM>_N(DT32$8=%KrFE^Bn%UX|7pdR_mg zUWluRG8|;_3d?_Rl=>JWZQ{e0yaQFIvQ#Eu=a52X`HOz6Q zpZO-1y)K;Cu>5VIdI`Gy+2kokG#qOaJR$?%Auek(28qsu$O&#p52%OsJv>u!Shj2$ zaouVGDLkn%Gn z{gM7hTqDq~lk|#=WWyXiz?en4$3HxDY%7ez}N1y{N5(3 z<)8oYHIj#xOhG+3!q344Hj{Jg{V#xWt`?Jxslq zpudnLGJtMYBcTiS#p`=|Q?V$P#vXjY6F>9O!~7{3JY1Jdw14_+!Q)O~g9Ptp4N^n0 zx-UB)NNPiASo*MJ&0VzWdoTHVmHoM-G?iB?n|Zv$^+!(eNka2*nMwH)dG*y!hF>LM z%Shy4ip)lB+p@?+kg1`-uIS@-)K;@SeEx4-2Qwm!o4I0BhA zOpI_F*Wj>AY;3Se#%hGy0FL4C@_uhqK@&{`URmP$(+6P(SLiuSu$e5>{6G0!&leI= z9fvJ~AxMmP8uI)8@hv0BPQ&ar_-pkrw>N+_m>hH41z3F4J?Qfu0)j#|Xg85>zS0!A z80>_%f%#y>9`_`H*VqX1+&7c3auoO3-tUkQlzaFoNrR=(>ocrFe@VIo$$JM8mW*lM z_-)wz`WmwZEJNaB=UnaZcoKZ5*k729HzFwZH$K4RW3VkD1H-u209p?lO!&-245o7n z$jOGkF?XKmb*$02v5Qg1onkV^fa^f6kvR!X1Bbi1Hp9B>TNjF{adIQOBTK4&lBBl4 zFqwpJFj-GcYflRIjlYi@%cB3WT-N>6ss;yw+r>=HPMBV%P0#fYYRF5bJ^Wt+*YE4X zV5AJ>e6(-?q`EKX*AphSZt)~iPoAdsapZiyA`Ioii(d;O%SBzKqkzO<%`Udd>DkF3 z1w|d%B)}QljUuLi4^H=>W5z2GhZdQx@?;v0{Yb+acvxj=>LKa-U!13Ro^0oo=7D?hJ(n zj73=xSma~mF#r1byuWtkbrdW_#EN_LQy-OtA&S5dhAd>sI+|q&Io6N_C#Gc$vTOUX zL34>{4XnBiqr&CxZ|t{51lzW6dhuM*S%*jIP#Qa+P-}dK(3j9 zc7Z1qe%Na;2-aE7cz*NZ-rqOjt@xm~Xy3Q?dV%{*%1^QrBwFn&V_s@+2T}x3_SPV* z@PV{@HPc($2%gU#r_Ni6w|ppwUf2XgY^Q6Wn5w8cYbf}6LzKu!DaV#S4Y)Gd<$(~M8zd@!2C^8L}w*oupWDP+T z4cl!kx_0nyG@co-SUpEa9L~lvqUV*NTEth<|`(Kws$ww!M0MT@G3Ino+apyW%gNGa(ePT&Bp%~Idc2zfK-J&-S#lT^G33;4myL6M9Sn~QNvoM z^#KLFS_{{twb#Vx8QrC=_bijo1gpuC1fv0LV0K<@#b5?lp$|?Y6*wH|26gC|kmK03 zDin|2%8&Zu@qLh3*_1i^{wws>t@9U5+8PT0E2j%nN6Zp!zLijB$k>S~&&oZ{kC$#b z^lY_j^9+fLrC4cCR_PpjNgb8fV zb%d-%?ETgs;n?UxXp;KfZAF$_>+;+)6BBU1dVg(0(ZQuA7a8#zqLFpzvtwzP^x4~W*?A1|U`9JQ~ z*?=EPSYZ*gdEZJ-B>-0B3X*FHYv)VU81+9tk`Pls7&2{WuxP(Pd2M1^a{mdQOZruZ zXI$1>QAEuSe_b}0O!<~V$xJQm0*sxwmtDdrGlFplqhoQVXScuzHs$7y=mEnz zlh679^3$6?+VbcO& zw}C@)v5$JATUQbqeGnd<4l#7TYv|EmgjPiA@t1H0_YNcb49qt|GbZ=z;ba4I%*}r2 z;R0)MvpL+^?QptpabRjZeV}5hp}D5*$lb{?K2|0~Wtl1fVT6 zm>2+jwGLOU!Dlbxn9h@mVVM}B`#xO#meb<9@-Yro&V%imdpt%{(cvjo$B!!ulB9Z< zbA#5I4c~s<$)wY^HF}LBY0bJoypsnhstU8VXjhmAq7r!-EPuY#6wzHX+;K2Ua_MUn zbre8R<@8`7{SjRiDqX{IQqk@rRBeD)!*h0O7TrR{1@A`}^T7Yr1UucilWX`RP&#>= z#c#Gm&QCYu_A*F^W2fQbirljf5+z%HyZzz=Ndrz+G3Iw``t#&$@-b9?-ztjw`pBD;}{gzBx7ey@fEF02naM zJN)Y%_|J6X;Nf!!cUh}v!ijgF!-M`}k*tuvsn8y`9k)?7j=ctTFgMokhRMnM5THRB z_>%}#CwJK>Sw(U0@l$~AOW>9DtS1}7uXYwNUK_De;3mUYok|)gAQSPKjHLUYBgEeF@Ka|pxdT7@c(1_nyJM+JlnVK3JQ;!x-eWOM0;g(0u_ltr;mm zdawqV5T`FVH*b(%dkhzAP_HHGv&xHyfH wZtF49a}XWFg@@3p5~&;d5nvj$PFs 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 literal 0 HcmV?d00001 diff --git a/docs/decisions/diagrams/text-search-service-option-1.png b/docs/decisions/diagrams/text-search-service-option-1.png deleted file mode 100644 index 882b0df118b02fc681e1f429eedec1d121682670..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72909 zcmeFZcT`hfyETdhQ4vs4QL2Iph=7HnR8bHR=}k(Ah)4%1A%qYRup!a}M1cU(d!&~D zQB0oWh?C#oCgjLI%()@u(6fJ zaBkVN1II_6>sa}+v7H;*{kQLIZwHx;Z6`-pQ^PF4ZV`8+!Q6DGbs1dIclDy~hmhQt znc|a@A7DD+A5`8xm3XOn(KPTuuI4#-$JrA+pIZ}R3*PF8COez8OVcofK|A^={nl#Z ztUskOoldHvsydN<*X`hB#O@!09r~exLH9Gx1WD7&0g2#ZzX(N{tD`+RS4{hN@9RGv zcY++lcmCsG_xa9)!z%m!%L{j`|NrCvc|1C%r>EVy?QA~Za166#Xz7XEdY)18s7y2< z=~1!Efq#ZlhoHeB^i&nTehi=E*^wZ*KH?C=PThMi2WS6A=ot|<^{_fJ3nd(1oRbIqRwAx zddU9vc)vtINShU{#=IumdMIPd)4oEurw$XG??>(CBr}Z zX3wILgvaI4yPcV2(S}r;{tOMvX*W__TlEzJe!6C=*|qh-tDXax3v6v_d-r+jOPPcC zm>0&wKRkc(q7DDK553v#cng#rg1PjA9)7Cgw(m2n8>(@78_o|dvhYxzco80UYVRH% z@FA(B28{iW`!J7v;GpIBt~Aw~8=C$mcYY4Jq8^n$jpKZAxaRs*+YMj5k%8qyZz-QNf;jA@JLce=eW`SEi$y{B#X&h?OOm0`9o z4SP3f#2+O9#V|u=J~xhs^um00w!_1rZ{7GVx?`E+=%`U$_kC_gXW)k1?EgG98 za1bwz5Ao{myHVlPn4C<*8=EX(Wck z3{Lg(`U7o=79t0Ja~{ZlW>+tvzP&oR3dJ1bz5E`UPM>OCHCzt@E0zleZ^V@%?ggRm z&2~H0P8^mkR~1V&?6QnGxZXM2sntnUNA(0O4~44bQJMb9GN9-(v1n)Es;fWx-_JJE z@qXkhKi&}BdenFP@JgIXUIBj^wzhsa=Jzm(>!>R3H6hHgNytRr>0Fo;Pemmy~o3@+^m-Y9&E_uQHxcliyMXwxkWq-GStI)miTdZMtj#~r8 zLieY-+H6ISS~uzBdUm`LcC5;69G(-Yme;bMXbxLh1=ss|Hyt`GZ`VK@68GG)azawm zh=QIvd+8{ncJ%9oR%A?TRwQxQ);B_#FB;OlwJ{Ylty&FTny~jD2HjhgDQ{IKSbhuL z58h%ljd361p-{uv)>zR(F+QrvuBnF_E&hD}#RvYJl8*Nu_s*-OMhnnWIa7Pr{Nf{o z%l@vOgl(6)(C7OJ&whU*;bVl9FUwLND9>eB$f%xSKjX|WR4L11qJj#!G|5~?Cyo%7 ze1@!q$RG3$O?U46;!98DOTA{_oFya64_#?Tg0L@zy|d{Z@hiCv;uYK$#g8as&j$F4y-wx*iX-OUD$JbB9gvkx87UfQ2Ei)72czz#N&y|e3;n*?4 zm<9i}V?xfj2^_EDlzh=b@5u6w>lB(fpmXY27TXy@zs?O0^)&E|&ZLLY>rZNoikc`%Wq!-z+uI@1e@(!z$OoaOf+kpw-Aj z$aMJpZ$)GDy?}=O$1WQL;n)v4<0pkRpDgc_KWc4^4jWUIo2%;k8PcMDv`sc;Ox~i@ zcCsbsim_EbS4$80)cG%WIN4Jr0>sLNE(#;G`&Trs2j3QhM;j*xvMplYu_w%eX83kd-Vx*hlI=)LWKg!glANLbR4MxP3^Ig- z>2Cd{ZZQ+B{JM5$rA>@Zq}6|EU3o3L#auoWNEry|1J?T#9<)gQZKTD*y7t69k-tPAff=3^sX%;=^>4HzU z*~{c#Do2VND;r-VisKbBhL0Y4ckCeyCE7~g4(&bOZo;|#3jb-@j0emhCHRLCzZO7-g%y2d~IX6Z<9`GE5T1_cB8 zw7fHk9o<1*e=N*)fG> z28w<*F%^7W;%0yI=dr~!*VbwF8%>1f&gV6<)|Kno_9N+16L&&6wu5Xvj&5H*DRM1~ zy3x8)m~@Q&*aq>evj2Nhl)QyNSW^~tp<*-IxxP#Syny@3A))gW9o`~&=N`js`}Fyf z(mMq@P$B2K)6X-B4`*i1NvDUIH7hO!sBJj5#kzsKB;sO9j18}MIA!{0>Hw=rX(ERx25Me!wa3@Jdbp`l(VtHq&cj!H}5pk1DGA~;! z@_&Q4A5%1%zR(sU+4<35qJtf_uSzr*KW@JWBX z`wYh}OL-9E&{OE9tXL}8&}j$O2YZM#)LsqX02oMMYOwi%B9ju^rBdfLDuIwJ=kjEi z=9ri$I(D2Axc=m&ezKgTj---<*C#Il#c6p%V4xHD;X<}u*6C*Az;}#hc@dh1${qDc z_(pi_heu_{R2WON)Bet_$X$^B;sZ5YH?jnVP5yOx>1lhIpxf9p^e&yrn1&NW(~BL_ zHxH&|>x7E8uDL!YcJLWsFYJQRYt%@B$5g!_F!)b%Oil;*1k46%05twiyCQ8=>zB+@ z_UMV!TL*xla#;B!azsTpoJXa=C{8?V?u~mIXR3_j5!&d$^m@XHV4*q*w z+1UO+IX?P5QdZ4VNJ*|n5&!8_HgJ7+5NQ}yp-gQU>Q-Y)*i<@e#J+np)5UD*R;C7^ zi68a$_)UUBLK z0_Y)Z7Rg6OVYbU#qUhCnGIj0Ts+EYPh|H-@r6C_re8Xs3@a6^hS})q8JJqVX-vB)l zr=8}`+T<$ps3|!URQTKlaZGTeKl;|+i|Dn!l<q)CPD7d^g>&-}BxJGwVvzhj2V3=zAlCe}o5lTP&l)<{{JD*TXSLCOuscTs1rH(%DjvdLMp zyJ&Xf`t%i_5W!gPK}KoQraLrMZ9e;E*g%P)hrJ>`pseU7$gdZov2dmkYJl7fw1XQP z510M@5*4GMmXZIP~%S#Wo_hb-EotdpVsR{cpafXWDS+4XUu8dD1WZ|^I z2#t<2N7d#DA)g>5e~nm^jdIDQ>{|n~C)v|9i&iV$pzpYZl!l}YF9QJTlq|5e-+bfE zc&xU)fg5Li`&>uM8&Y`M7GB+@U>Xyx5ZK2g?szb=E9{iX_Q z?TrF_y=B~Ca&vqQ3NrK?)%<=&$=}V0Wqe9-s{d#oR#!K_2eHlY8$KK|>R3}t%ioIT zr`g_@eS69rA(Obd1yEvlYNO&PLS#3CxPoD;T{~mVuhd6}!67rkLZ77ZAv^NSg(5>A z5**yZ<%#2m6o+N(1(IBmb%n}-1NTnw{5k?msN_nkNJ#C@LavGUVLs5ncOb_*AeDp` zDLw;#>U{Ok>tl8lt6Y9)pDwe`DP=SMFfQs(BU2q$3j`9*K)ECl1jR8JnOj*_4I55; zp9%FegF11E!NrEv=qeudAZ!$TJ|}N+=?4k>gNHCPlf`)w!SpXTHMsrfS@%|(XHy+Y zSz{3QRoZ&Mk1^Dq_tAm2Ks26hwEvM_*N?_UtNNoFhyiQ8aNGKa$#UH}ZboSdibP{S zr|`Z(q5P)d!ol@Yw;-ZEOqI3v19zj+rT-hH2_B0M9~Mv#&Q3{Nfi3^atEWsk#;C5B z(MZGSjCB1Jg}TbG0mLjc7r@iq`D~w;g90WcJsT)b=Xu~O{(Up14cWR%$b?A~6E z5p!>g)x+Vs>PHT;-OR6li8nuH9#lllDo$FZYV=2qhRP%hJ_H{h-PLXw0J=6AS zqt*@$KWsBpY~@jdQ}{NhDrZNle7fKyWpUMa>c`2!xWAGHv^r;+_+Z5L)@sa4+HKI* zp9VQlV%7dNZbj{D{+k%HFk0wa#0_B(aiDXl2!G~ykf25Jf^R10 z@xs-03SvK>02|v#hZ)DlTo$xgFUc3@P(=u4<~;trGgc$YLEz5ce6_$|s2G7l<;!F$ z={BriAJjr%zbvFfaS&utMPMPefl2ACqt$ko$`o&!85kH`Q^05faW-(I=Dq;9Ve^rF z)$*l|kX+Ks-QxAa86c1k_CZn_XVV-(Q<%&FLuGQqJTce*hK4V z&!^=ywC|I-Kf#o$t*up+;cJ*5+z{N6Cs&nD^y?1nrh5#ldSs}?#(~;Mf5#;p^aZi} z>kYt4K;uVN?(sxD7Z1t0k9!QPUU~XU(iN;n&E@ZAD_Bpo5NLP}NPbz$8k=;CEL6NL z)3J87TSKOcFh7~(u(e@KX{1aPgE4XN5*10W9Yzm`(wL{5Kx+g_XZ1&EY<=l0s&U;G z>JT$XYj-ER-N14~0CF|*Q8)px02MQX2}Osrb@ zLVqLZ^AhRTcg~alDCP6D$?pv1yU5qT>TDb9E`tx^KOMy)k8=ek`Y>N zBBrqwUdm=HQ`O9Z?uBqYHKuzZf{weY%$OD~g`&^h#6wln0UjM~K0dbbp&&+A1H18; zn69A4#`d)es67ccl+KxC)f!B!6`SG8&gzOkMl~t5s_g_tq0eSelrTHnZa~2(Q=T+A z*iipAWUUuktP$Qq`DrMAyKL_1gQ!KsrY$wMfNJO4g``jpAdL#7I&OB)xpk$~_`?Jg zDW1y2gqt|_W60xRI2k7c2(9LdF->UwsF3y1b3=_xt@V{oLz@_34>A&JSLua8x=@># zAB2K8yw_UL1}ITh-el<$NU;adc;)E_>6*$5`P>xG`5MBu7v+XDgb(It zugzyZK+Z|4Tafi>=af~U7+jN2H&nAC&Onxbg}d*tb|za~aQJ{J=Nfl@Ld9$%Mbk2T z<+jf>SE=!2ht!+dv`2J^Ue%xZWlvwz!T(9cck3ezVxN?zd27pS`}){~d|(GwBZz23%VrL0^BW zZ93NpC^~iXQ9Pf}%(Ck7yoL|kOJ?OOY`hwO%hY98xXl?>tK}&NRz)W`4a!HlAq=2q z;DE_0&vS`Tc6BXJFE+OG6@KnJ6XA-W7||#Js)x2PEVBrnZy;L8k>CAg@)e(2%>f>j zpF)@(HD-B&Feh&b!kvzz-`M%2HkikKI~%E=z8%e4>Ew}lG~GzI^M;%q!~md}MF?~_ z5^33b#nU4wV!^>qV{Ai?6~M@g;sGl5ZdWGfMOrT^UKZ&*$9))QRpeRb(5uCU3oVSl zi@en_R)w*tcqUEG2;ZL1T%hBiDdX|g3KUHP=xMV8lR<t$qcMu{ncgI8Et0M6m$PyLNR{=jb=%b8SE)%hsV@=1l%Ezq`5d zixu7Va$q$m9%cz`F7}>`JeWzHqwo@GnUSTwe3pLV4{i{}fRQBSlE}4F-IV6H^-IG@ z!FqHZgp{>PS$Ug1@6xz%^NN&oih+u}P*i{WW`;(iuc2S(Y+B{;b6ngz%FG{yFPwr( zM}*b39zd^4;$}BV6b^`YA+HJY(>h7<;@JZL{WHmG@wX@%T3@FPgQo}O{l{GRhIOdu z@@*0-3I=(PSa+c;Z~`fA!4(e338i*ffiL(Q5Qw||R*iu__k1 z5HhwQ4}eIa<*F21K%^tM51Z8dnOz_E4dL6$Y86LpEuTtJVYFwHe3NUMsHcZFQ#*{I z3U22hWtx1?L~9h;*kY{~s_uS2uyCZrs=@=LYSb7b5pY59c;R_#T66Bip{gGjP1QLg zhtzVlB{uE0qLn?phMRyp7Z}g-IrX(jm@we*R@mHktyh1s2&Lwo9x*7OSFB`lgEs8$ zI;CeOvU;?yB}rmO%St?ZH-uiE0P>osfTCyJrwrcXJ4&ZrgNAVln!e;Sqdtzr2 z6lW@9Q+*LSs!$s*gX8*=X4Aadk2~D?k>y%5?(>=Xo^m)~7MVUSbavS+-{?CsV}bJe z^G$UhhFQ{IhnDeV>d)&|r=>inhQb5mb#sHB^dfoc4?J0$yFh6kT5e50^PZv1&QTEL z_ZOv7bQN-=C?1lSE}SG6u+&KLjD9Y>_3FAj+xv5?gz=vD{;IRK{-Z9X$4tH`SIgE; zXe#cAr+sogaAT+S7p>fqcdM1ztEQV9}nxGhAh!}PBu z5c(|And?|t9I|oY?oKF&oqwZ5?wGtX8=J)0!E=P5RZOYyNtdBw09qq&;@m|1GFx$5 zByb3IUNck_v(wZ(7-_~~KH;kZv~wX4?m_eb@7uuh%d{vy@Kzt~QD*Covvu65i&-z; zX*NTOHG%nco6^fwJEK<)Y1U-O7Ajrv03@RGCwH;=AApHNIqr6T#1hj^MVFnC=7t)R z3;HTZK%ue1hV0yP|NApWAD2z=>pu%MzL@rdN4*8YyzM%mFVkTMa~X7n!|AvrTmWP_ zzx3>EPr6$Telr$5MT=6rOia5I?I+&1{qljh+#8|liYm9^5rCSh4oBtW=1gu((Y;mc z@-06Cm+V9uxkr%oV8TJj7s~Q=@${e2{Qkt0OEX7T5#*h~z6y}>6%P$${k7cu@8?)}HCQ7`u+E@s)BO!OmVh*B%^_yCGkU(Eu^az{u~yU!Zh67yqdW zxAWZDnq3|$!Ln0+GQPaI|0&I?Fo?vcSa@K!wq;h)RSNfp+>}-N-p?MbhVc9fs6I0W zL4cN3*sz@0$~k{7k4b@NAcK6M&@g=AVDv6Ds%w~!?maCP%%z4*H)!cr-*H7R6rS+3 z%XF#n3MrI#{xi}Tqm2urRQ8urvh5r*hyzHD`mZNZK_9*-pOhpT8b1NBWv76=5Uv>)n*XF$A3gFbXz^MIiQB8p_i{AV!N;fYwYuDG) z5O@6)tsuR;7Zjgaj9C%S+m%~|vIXOb+6c^EMCgz#2!OO|^Cs|AZ$=umd0%TFsy=hU zF>p(-IPirZH8`$FJ74XKQuO{aq9T&KlGca^O)URh&OoDUi@-fj3tK)y;djP_Pv7aQ zbn#8OK7~k8rgxr)L666 zRN6HLvP&+XwqSqS+dx~NBuOnUb<+TCO-mPAVo_)|3Upnu5Z(|LZ59j22lh3%b?4^N ztNYmIQ~n3-jqT}4+D*1L?)cU%XCdZ5&6UA-3fGDNpUP0SE-z`c!YTGcy`*XG$lDWQ z?tR(18V`EU!G8oP=UN^pGKynP0s8Iyb$Z2MwKpibN==f9?HMW_bM7J3{E5De(um!k zk>3zNjTxf7+q5X~=}mK5Cu4`LtKD68-8CjBr`~hl=^FqM0V=pyuW6|m%^_lo#i@Q# zHaR^Hh`cW{wOD&r2DXf+flJ@*0dPdhhWG5Rz6^-S7xh7J!QQ|AG?elWa?R{QXWY-# ztA@L0Y5(i2r=09MKuXsh12m~alA{+aniBA(AP4mJCg(U@)gYkxB?mb>e%&|bre}X{ zD9+DRgno9a#QuAj$l@?K=^%C6fMKB~#(_~8ouLyfM;((O6}~;HEgxmU{Mosv{2@#G zS#-AO(!o1@Yi-3pxRu9RqTo{W$6IK9WPO__hUE=3qgmm=EwN=t7_0Aff!Ic$j8!VS zZ?4sh$LfFRN(zi?oQf{m6^Gm-3>c*ES0OG$p!ii99F9mybeD=^?U z8lp7Pp9$Rhn#Xx{`JE`?(&@c+)xX5=7nRahE0LT_vAb#wXr$**!L*(R#|`(9Tg;gh zeFdlPXTa|^rnIEHS9QvuvGIlmzA)MkF2!-a_qafSMAbL0blhAA0*764Mwk=PDr7hk z&eQZ{S4{?f?0J$Kv4gliWFuRdbABE`Q1!#A%zz(2g7UL@hpVl&i<{!)9LZzm z{#cI#2U-gU)Pj^c-m7?9R|SwWrI+IKLIAKc7z=xU}F-yI1%o)JFTsV z%f<|s(M_5%E^2s7wrRtRx!g)!`6xc5)K9Yiv58(&Lnzg+&8CM8AnZ^ykp8_~0|ZXG zVg|*KQ13``wgv!uK$D8CZ`W&sw?4FM0J9vI(b)~HJ!XmMi-Jz9;m;57NmWX!_W2TUEtL%N(=g`m~jte#3> z@J51}9%UsqH7$5J^|XM>#$D#$NFE&2q-*$kt6y2QM+`Jn_~`2ZKtP76f`eEzCx1Yr z8W($Xsy1UXCn>FbSMX3YTrIIEA^Rk`SkkRNt1?XmR0H24nB?E*9rcdC593|K-Q)4_ z5>VKh|7gFp5hwFWqcfu?Xq!hV!_gHva^wD+C2e%1wEH4c8w zO`e?*Ul_cY`X+)`#Je*dc&u+)*Di_EKZpHMSX=Aosij>F9PfF1!V(S1fw`Sqv##ta z6i*cL&vz3ETFSLKl%5B`E9+nHu(ds>p#b;$_oFZK@k^@;wK70l0=jlPP5>I|R@7kgZK23_WvFJqb<@AZ zpcLqEX(P_Z1u1o0hg9M^=;~=BEH@{dgyIkmXqVR3y)$v--;;P=`sn^%G4PfcWLJCU z6b#s54Tl-JFH_L6SRm~iGcEvSKn%mJbAm;SZ{#7aa>t<>%s z8%~N70qLHs0k_0B|62VJ-$KJ`dvBXTf<^k|F5Kz+Iu?a=blkDAeZW5qhW_^HK=Zzoh|wD=ZzZe=7g z@jypqQrIc;aky`HT{FA(%S-VnfMH>Gd!s`oF+PpuFX!W=c~q9X&{NT&3Xi{$Dc+Lt z;_5C4Cf*sTgq+%csd?>FB9MTuDfZNi>WU-n9a{08KVH+Is!sV%T+&%#3PG^9`*|zf zacJ;#Zqb@cEin{760-deBSKyal;2Q&+pj`n2S+hvPkQIj6$fmdKcqIa%J)9-5z{Gkm=>C zmEB3?yA!(agoW3_g~njwQsB_&&-(zFy4*kPR=hZ)e@S#{`W2rrWZ%izG^{%HZ(Z0a z&xYkEaG)a&VhauYV-y=MEPpbWEmjJ(RkPa_qnx-E_m@3wF79#?7>`p`_*Dc#8&HB; zM%8yY;HD={-{ND`gB77^PW9Tk0Sh^r-`N*5rjp&d+Z8>5j+J+)ARy)Xt_Cv6 zJ7cjIcx+Z@N^n7G2>;@FWBI(az-aifhfgPTD;dMH6*Ktih9VPJf~KPA=<_iFMEZ9QuWb*QR{vlida>Nod-yX?;c|kw>J>@B zZ-8OB#(36yu?$JhO%eWjgqIQ{5Rf_X!EZQ8_!Y0+A=PGWq6(n69$A%M-fw7dYtj!r z{h=EOZ;u+}t8o2iJ=+6`@Qs>`iL?6+t4$`_|M4PtMJNGw5ecqbHFR5YO^KEJe#3v- z_)m8tZUSV${RTw_Qt;+SnJou}t0cWxfWJ*l)b5PiE^$ z-JP6r#!KPCJ6U(QX>6J0fXj=T`7u4r?qWm36&{*@=AADS>@HbP;_8xv!@oF5Ay$j)J`zV5yM zT1eUM>?1cZ?fie8zK0VFS=%_TYBIYEH-XUKMMr!=h137twUhAzaDF-LszFf#^pA-3 zQK|xDK@`neZ}sR=rSqs6-vD&d|GXFA7ghepriy=F{J(#k(B9rYD%emBcxex!Rw6&D zJ)gMaHu4p4tPM)(M92DynWhdvl)sjxl2{C&#~K@L<}s>8DU}*%+Ht zn_6P{o}){4HYUp7FQy)FbWMlzC5r{{NW3=nFs8t@4`C$AK$pAKH1Wjcnvp1rYWN6GuEB z2HT?Uv-p)83t)oCZ@iC57nUx*Yd)qjX$;7@8I^laY@<=y<|efhPju7FGB zF-gK;&sg$bLg)WvE6sm?;{T2JGjvpTwgPrdVN1K-wbAKaIf2)3oUdV56nFv$a3)|y zR6C5{^)0@z`kb1Y+V$N{$~5=k(iM#J`~eQ`%H2&!D7(h6gpDWq%I1+XB{e)?u>Bio zDPQ&$z@fNm0M5xl{k=&Sc?O7k=NhE=JAUlip1#~`wFbaj*Z{`#TFYGTy~TG@uUlB- zL&vS6<330a58J_qD43A^D8bvkK<6dt{OR`EU3p|j!1HbJg?x!>$Pj^0Fb-(L^9?s5 zg3`IkoSSR&pU{Rvk9YlK*|`ST-|>dg+;|pp<*di%EBPJgN-pU~ONh|wuI4cjnCp2o zW2VWUTm{AMlftr`cQKKKU>n=~)g=-L>o52DQEowxO!m#@e$Y~UX2`{p)5OFwmiR9BJQgxt7luOV+9!cTdl$5RP2M_d zMeXntvRsvNh6iOkLnglF>hoL~V6>0-SYTTqw}&>f=g3Z@PrC}E)~CO+TcGg@y9>G8 zeKOsDrV9Nir$Y;#Hd^Bab{j3vfl%?PI=aO_X#ttxOT32f%f!=DpZU(X`zPKLnl2xl zZZ{koC_rJy>ng$%7QeiU>M#oL@FgH@rW1=^Kjn8e(>3)HXD;?P81b}8j8vC)tZDH< zo|9TliDe*ki)VeCU}9YdUUBV=0@81TkbkAQ@Hl3*+Yshrlck{nlbFL9y(&}hI9Srd zAtLy!#73lQaOJo~YIJBv3OEF)_ivTI@KED#=n}J8AdPBW!rIE9C&6nC9DEXz@sKVJEsxJ?;p0Y_g%$+dOnrnEDoQrM`r4>#m6$amCX=he># z4ha3$Cxb3WeXe%55KqdVmx{G(oi9mz^YyRav4OxflHm(J3a?$CkXsf;*u zEU`wL<@G1S_?iOKIX#QhzR<=orCI6CXE~Qtte3oJ12i_QITK-5kA+vVp5>C{Hqsvs z^;eX!G%z9T@15)V6T8S)crTB8>3!V#8+NtYA8Vko&Z(tOG9sBU%>G2|H@~s`&o%3V zX@DV)=n;N&sds|lX6u4!G5_LYg~j0fj~zRvrILU;yLC7+^dw(ECNKK3e)0@*EC0d; z0sf@S-tR^yS_`ugoAXSKg`qq&?nB9OiE=qRc2hp*GqT&G2Dgd7&$GYE$*+d!$3HNi zVZ8IGrl5}A?ew4fLIzEld1oW446FxU07i_=OuOUd8s18WUQ6D3256a9Fk|%((J@K} zm&Nc-RjMxND{bsee_e6)^6P_^>9vumuHSkyA`?dgQzehksx;FFeOw5=fbg$z^k{hS ztX5TtTZrK|o0-Jv&Ey?c$kO)|N{BZv^;3~>k)N2R!ohQ=h{0dJ&hLM-B3xpS>M?Nt zOZB^_Ki&Fua`10{_Xg$zG70B1UUGQFBwa9)@?j`eACqKOP1H=MG0Wl&DH@Gp2h3z; z-;oz3rX!74@maOM4~0*MX5%KI)GraeBufloXQsmvUcJ*B`du^@SPbRhbq zUPCoOXY*mhdcz~Exvp_j(77VxJkdQ9o@3{kZd1p1cOy7ej2(0uA}w9bocppL;wJ>o z`ehhtKCSf543B6jx{>1@D690xZ^7?59vW0X*ZhFcgj{LSQV7a7HjJwX=OBn93==H8#~ zWsy*kw(Mdn+%k#rJ(03DAuo7lu}LUdblVDdh{dXRhmhX zXTZY2OO7J4JaL4Gs;j{amfTc{0A!UfEq%uz(*xHd=98S9RR3*AVK7rmKS^7E>Z6T} zH{aj@GBrJ>Ckf20FNXKe-3g?&x)|ZB7ULYJlEkdaIwVp{FEn_{8^E|`bzSV92LI^% zTO+P6^Vy>%(spRc5Ar6f!;bXLaJWaR!8Q)IN|cBgx~CEc<4n^2)Dtg~K39_@p?>u0 z+u@~|y!1t%ms&H@cDGxSn`D#P$R?eHFZX=;RQO=!1+Y2IwQ*nOtlOPGP#_QYuQ3KT zmelT0r#$kOJJd|-nXlS>`i{$RA`GX*VnUn7GZEsw*RQ2Lay;vXa19E8{hYmBUc7b= zCz;6t4VS)|M#z?@vTg(hs022hK$y9%tS*w}8tPf*1i2K%0-$s2X4Pv~jo{CmZ z3A-&i9FuornIziaImN;|uv#wStNBT{NWThET3BHkw!gBue<|IxNiG|1yRucDZ36CB zDDtp`tulC+^La3fJOf-1v;4Ug2?IWq-n!&p1j&F*CMo-z_oBcc0@B4$~cM8pm@)}E83uQI2Aqa~E3vKoNKA}*TKik``*HL9%_JK}Fd!+d5G7UAZeW6MYcWjKvZC}Z;{A=z(&Q5z z8whZfWMJYOXcMc`c>-Q&!vqo5c9qDVYQe~K@D<|X-bB1!70PA2?tHWbbr4FgN;Bsm z<^Mc>a0$(g%V9(-45$r&iC|hmCMhf&M$L|<(;0e?}EL~jV>%LtV|_7D6rCd%&rm# z>{DgFui}COOxx?XcVLNOj=gi`W&q(av< z%+*&AZn640cVJ6jHL$yeUDD=dr!_4W09+lwuFiK`2rUYa=x{tZdMWrWp|`fEbkp+p z4bCKex!}M_*sGc&>O5SNDomeaA+okZ!LXxKK~^5(^X}9KG1Y{J)dpE>0j+gykm*+K zj|Dx34_@lk&F5v+gH0_!CgF}8ZL3Imv1E&uK}toNHwgdcZVxB`n)h6-s8 ze49cuP56omPc2O3yjIW>VR}{!l%%x0;@K$FL9l3ifY=y%rGQgTb^E-Es=VhM+G8wr0?+ISR|B@>QThjnsr8cmPUfM@9NOj!33-4o zYoKwMe#H_$gwO`@lSCsh0$>ge(A8y-kQ*b2dSEk+`)_jf#|wkb(8O2u2BwZzRwhau z2imLoM}At`R@(~VOorO~pe$d07Ig3yKO^8!i6Q84FsTIQKl3?h8m*JP;~MaAAhAJh z7VWUUYEpL*xRt4XmXcA9xI5tc#cl27yJ0CWq?Hq1HuOZ{bUuV3NtUsK0N{rZRXo_+1@ZBtd z$6r=msOE^`+2J;~b3NR>+UdJ-iRZhEdPiD{z8-da$}u zTyKNxKt54TY_fb{)+~B#eJe1!M)*lDv=Y2ZdPFd-d)=ug$HOjKkZRr(_)n%(I%htW zux|BA|8y{}U}`m&khFpd+TA}*@Xy3KW;Vo}^DV*#Z~4y~-i2JZU{190_Ns3`A{mH^ zqWPkssmr4DeJ8z?^`Bv8bI@R&*|YhMgHAzE;^xjKsfS3E0#fF~sGCiB9|Ige{oZ`2 zNiyloVTJ{z;Q*qCvB#P5m{Zcw#CQat4M0hXf9G#oTO6gFwh5_JZJ>~cHXMcZcXKr)TK0lhZ;V*A&Izyrh$E;gz>Te?S z0?>#1RZL1ympWqB4_vvo!)P}9vzgqX1%pq=4X^UQtO6EbdXluw-|C#U)}|IF8P>bt zwp`u+wB}dXB42e2FtoHM;E&5Ib@B^t*1}a<8xEGW!b!&vb|k~jdC2Cymw)dM2 z+&FY|huN>zESu6Hv8DV@yYmETtA~?{m1$g?`Q&&8KdjAL$J0AO=UZNPyP}+EA7J|w zl>495?L#gXhrA6)cNwdlnJzBL3)0efn4jo!hYm4Ajw_BPXKa<-e@NI% zRUC-Ax8~bdcoLKH9HT9JBIzkHS|lA>s3)$whiO*~$igC}hL<*3!01wY?<%I9sSY3t zxux^ZbZVvdmfcyyY0eJtimN3kH(D{ewP=l+kj6H|i#hmmwdpb=X8cU^Zb~d{)evg^ z3!*;o6Fg@6IbZsb<2l)M{v-;_`B5bc)DT!uy&B+wS)K#7QEFDtGCUNmnVf71hc3x1 z{iKdSuALx{L#~-S-b*wF4Iz+ccD37}T{^U{)q!{%*Q+ zy;8ttcmn3_<$5-hOmC3ZLyiHU6+StW^)AgIHb~9PrQbB-U3= zgAqAxhNc__U3&d}-@DUa7BpvuqdJHbG)G;~8=i)O6%HHZBW;Co(nXx1B@~|jVWIQt z>236+=fr6czYOmYZ7HVA+?JLoD<<{6Tp2}EPl4y}utqi@MT()G2mnz(8ShjA4p~+k zs;1OP6FW_Vt5nb2ANB{5mxrDb%!DE3HR;_xKFX(e!*P0^o=ZFyNmE{f3csQT56H=T zu&RGxq@`olg{;-2ovsAk&Tf|V4G76OB)N?BDW)BdAviI}mW2L@mqVR^+Z8RxZZ@ZR zXFeFnCjfj%*A&m%jOOp-EEid+1k?TcP&ZbIXLK385p%!>c4SSH`F4HQJxqx+_Var| zSU9=L@+N&uG2jwB^$7JqLjcyLoGI8F#OZ*^fSjYAol7$35@;G<1Gk>UES7z2Hw_Op z=$3P~4)iSL51dN0&!kx$FAI!Z7N1tq06eknDt3txkI6U{hi+_>eOu;DD)Xcu_Z=F1(QTrILPEVIiALX`WP}K>Tb^Ta1^oWteIJH@F+oen*3lJmQ{hzzt9)G`q( zgXfFY*LP4xJ;+>{`V#-`+6$e>uC z>EGC~InS%U%Y1fp*CBo!55VX^4UHwE=x@tTOC!*j)>!bYWVg)9O)9^p%5=R5#*P*9 z=;1sSr`t&i-I1mBTl47dxLD>`?S$%N?&I?=YT54hRVLBC$>d;WR^Doa-~DM;li;g5 z@SVbNkz*`z1;5%@DLL?d*ZM-o^0f}9oE4ybG2oGpUB!=RT3&Fc-s{T{FpoXE=O&(E zU>dpXj*Sp{-I2dZ^UYQ$(?Fv1TX52%8SkU$eWy`3ZB8RfnM^mybi95RMmC0n>gz^~ zzh>jnFuU6|TEf-Ur!!>9rIOzX)O@dhv`bmU9)>lwe3Om5h>;1OXqP zwwzzU{k*)2@vXGF1cq0&q#>T~)MMvu+00p8WC@*T{iS3lG1*m8^0n2ZKi{ZJh*a*9 zdX?%dqY}oNb8Sd--f3Xt(Lscy4iS<7-KOmsm5%syF*e=uA4#ui2&Nom50wdWxoBmGIo`W@A@n%YcU-v?_oJRm*b^H z4S7DqJF(OW4MYp3DOUG90NC;kR!TLoPPUsTH1u|yl@l#L)I7PMC8Wmb)*!yGCMD11 z;iqv~)v0Hv&WN0Ybo-sqY@-?et$^qcsr#Clb|INfmbwlbEC4ZSf4!37YNBkIq#vfO zMqgC9+;a0g7~xf=_EV#iCp8?$eKw*t3Kv|r%zji~yx(j==tE&!@#b>JVvfiDP2KbN zVk%+SFp;XyaZX+3%3rFfB~_bo4i=_5w-4)Xp-t>o&IpxtR2OTP5RctUy6Uy3zhC|> z`jYtYdFsX67lZJgVx25_+YRDr+9UONj4F#YpPBmoS2U%U)X#s_jwMK{5D8^sbJ;va z=3yc$`g00*g0FYx1C5?~hkf$A941=$1P5E8yxX{sb)QsW*4OPSmkxJ>X{(Io8S}j2 zMz3!4BiNE{6!+ZP_P;k+V}iOpGha=3?NpP`mvpBlK3#_a43jD3EBMmty)U5;}gAO9Q6Uot8}ySKICvHE7|Ic5=sl|dw5 zn`vV!ptHw6>oxtr@Ve?$D{BN+FMYkpwz$DU_}E)7gYFO6zVV~0zZ|#Tl?V~Ds=LWq zp57LG(WRWU*zmY(3Gb_E$4fzi&5oPzL^oalFNn=RU3fT4`6Qt9OxK zFX|2ZCd-pMShRb#bXdBRUAx$$-D=-4+OJ&%Q(nCxh2QI-^uu-SDfYcpg!sbUI{Z5^ zJXXvu!qiAHaMzj-DRcj~dhVl_2cEb2~;m=x*4@~50r-C8^|5%N{)W*+pz9#^*Klgb%nO|-A2 zk3Wbn9(U~inzEg>L7Xo9cQ)V zwq+=8WijhS2fD*4A`UAtd8J;0+_z?yMV;O@I3qh#jaMZSQjRNR)?nhre5q3ok^!!V7`KVP2j?f>%+Qi%}aQ{rj-DV zSIfO7qFd|P71?#VXuMmv^Yb@7B4>Qx%izT57pIga77yJo35TMu$` zJ5}|&sztC$&W5?x@#6(Go3o33YgOGwVMZ1qUDXQ(d08;*+0_^GK*4<$?R;bTwlvrqSGy zrt6hZvd>OCvmU&DW|+nYaYsQqot zCYKRyCBXK2K&C#x_^rmPYW5U?WM}$F$xP=otV6?Nyq`p@Ur$U*zD)5h0ZKX^skjn( z3tu;5$|3SP^|URr$d<7G$)xoDVwp*<3!6}#3Ra~a_s8o(;;&*U$6dr-Uthf*sTWUF z9B{4oIg@LgS`ss@&(-Q>tjeT_-?A1v*3IMsU+K)zKPu<=Zl@FHUiZjVqYoDRk)C;L zUXv+42q;mu-&`xW?k40~H={7vAdKhU88W1o8Bvgo1rUgngXk~*blOW@j7e_;tWU~b zA=NsjRBv2*=0>C;T8=BP*e?3rboS_yu3J#oyK5%P4xcF}zG%+MI4xmp3*V}h3W&GH zk)xYhs>5Z^Z~4wHR<6d+7i*K__|9Mnj7ksBp_AM(k1LN)vFu=acj_Fd?p23tVxH^o zIfgk}ChUD@R>-kCoS043mGtza#FyEc;n^4F7|V<@E;iql)Z-r5(vJ()9M?Kto(s#m zu%u#ndUYq7AkyE<%pTgNp_5fC=EHPR=gtWuN19dJ_{6D?={px2od)z&)wRBgHAbjj zX2myI<}l)4s`@`?y~&p0ajGb>BC~qOZY5m${3~>dp0Blza!jG6OAx-Ysa;|PA9~$` zEED?`06YX~%Pb76GV`PtX-Ero2C@s?!oG(5_;fd?31h#r-6L||sihmOEQk>u4OnU>XfctPJ>l<0mnYuc= zpN1=e(r#@1cI0xu)6V!^4bH-9+lQa6yE>?OF1CxRn)sv7g{Qt#7HnS`i?+TD1;hn> zLXSs5R(0~cUZdsisU6pg6$;_9J!rCMLQ}2gn7iU3@@{P&5_q97IY%1uu)DA)g~nad zy7**lKT4^kPn~KQJ$FvZiGQJ#eZlJytI;{V*r1x)rLt=5)C=#it~79Pc9|+p+k7?` zwm%9nWXauaJ)6P)I{xOfpAriW<7WC9^NRRUu^QoJj5Oyw!8HBqy7rIac;|TG>c@(L z(1*yrcW!*TYDRAW$K+BF>dw);QytPTaZkE%C_|vW#>nH$&8Pcw;(PCJxnr>$ZF) z-(60lP-(ZJE_WUL+7frtw7KpTzVGQD>*wQx7B3Im2mUHeGLlb@31`LjWvO<_8+xh8Bn&Tm0n5<-Y~7)vo0C(Ul2)bd2#Bo^z4sM zWpr+~66nj;rJU!a!j2A|Ns!J@P8n@v80YETU2f##kyBf_Kq^ojzX@$Sg`%ULlOdP2%hm{jGp2VRqz{*4k)~Dh=mCvsbPC8hb?+dt*7(Ay(c`4NIKT zb-uDHDCyZM4QgCS@KL+hQsCaT=YK&rmv48CSQqW9mF&1vuBzu+y;HtcW2sL`T~}ji zxyl!$Cd3uHpmx?~R>HFT@sYteC! zj4W4VjPS$m4cgh;A^whdTAxA6t|5-ZXD7S&^f3Y07^3`4cizG(Gq{y6||Zq-x5=f`Mad!w*?+(h;g{ zRDY|ZlC5jJ;Rk*CbgMJ2?!3x^#$s0s#O#i`acf2M>d_ZgruCwgb$Mc_A9W4&UeEYmgZ z@4>uixgFdRmpg0DnxI+}@~$p5XPTdN+!RwK#IU$IS8`X^RB8<)qZV&@Lr1@>`2Bq2 zXU!dJ$wpzpw^!7KfTLvJZBlf+ZfbkGE%mwHxOY1KpA)^L7rpOs3HC6>I?uQ}oLuYbUR$TxaNSj| zF=JEVREEeTpN(ld^ZRstBQIM5d$y0hP!_2|7xDi4i|svyw9_B&O1zI)`Q+xc5yJN! zsXd)olo*@$@Lh4eZ`!Ox)L)ol$cYKhY?{Bb1u#X|gcInL&fQ({w-);xCzo5a zEpze)BI;GStFvh>D->*FGUpX%CC7F*I-xlHE|UsMr9bS$W^8^aaD+i7`NHF_)+@~| zRlP^iX#Ar2$M*^1zV${aJ>s8j%dq)}7#c2srEY-s9s$Db4@`(O6=s4bx zJ*M4x)hH>#-J0n3)l+yjMr}Da`=DFa+FkZmI=qt22fR`;loOf-7iW&LBq`XW=Ug6; z$Ow}66L?(MVpzqJ|1I?*1xc0%!PQ@Pv@>6ETOO&FkCio`eao;r+?`c*c!O8?a3{}y zlIx(wBd(OyU}Hq3XOd+j9szr9u2jesz)P9Tk*v;t&?Cvb(?GT_wv@Ufq)EkVKyb&1 zSf8W2;j^ZbT(XstVn>Utos@2B4}qwmeE!t2!ix8<+ihu$p|X3u&x5UiCki2%GIvwn zD2dIwU(_)iyQaN#s-Z1j+&9ajpA$~*w7mqBb_(b7tJKnU3a296@Eb+%*|fEA3q#(a zUyci~7{4{}jyo)Ksn1d4D&*ver-`-q9i}{i0D6-PMo$$6qX`d};&hO#+c8%ltRjQdxSa z)bw!y8E>d;FC0wBE{EREv(A9`0M|`AA{Y}VnTlESCbhcjeM^z33ZVJL^Tj=-frltg z3&t>pbidgj^9|50vC?+-IigrDu>8f%zV1Xy<4KXjfway7QVM2^%Zazg1Q?iyYzwBK z$cXv$x|mcM=-22K6jgsMADxbCBsXLed=?f*9%tJr#q6hq3LLV{i-3n~or|$?kkVF&!sgoda7-cp4My?*O)cP`+k2o^oR{S&eH zf5|iENd|knkwhdpta<1MH(^eeYy@X*#?D`;c+)E9bt2_4-&^ylY>_3yLauHv=RE+* zbbxn`T3_J&FWgx}k!mms0LH7v#ojmk-Mshz3U`P%DRHg^c!)b-t-}{9O%^!4s zyfL7pCG4tpiaapAG3Nb~hN^*c$#BLa97wX`Oxg6S2Op!e=_-$S#@jWWz?_Zx9MWHQ z1VvHgN5eBP(~|-4!M?}-i)Fy5$l|>HJ=R+TrMTAJo8oIjjfzX{F)t)}&eU}KutK1} z@)<`m7N9`)H087X^?;m7zA)d&N%=friHm`jDR#bB+qy_8;T{1CN^#{Z4&bbPk*W?B znBuJ6afbcl@co(Z9~ThiLx|y8kQRZzuFg9ENllCchR$NMuH+Fqcp|@fdwmw6JtI0m z+AU8j`K8|lIAh!cSP`BSKpVdF0shYOT2UJ}Mziecq?ZG{O2iduskf7aA1O|1C?FWU zKQHEo)!Q>yqo9zqbgBtqwqqoKM$HKXm593kczLX0q2mqwD8dQNYmfCkcI^QE=NSyV zZ5w&J(36E*C1|Xgy@AP>H@7De%uJ^{Q>5^{7@4YjKRMz=7%le z9E-;oyZ*7?PzMC|o)mL=jr4z;nXv|6OJMjR`Tb$A9qWLMXZH7pi6b*P0&PYG`9}SA zFkyxX0G%EH+9&Vd69l}o`BfVOSCKE~X=}6on@jx9JNYLgpeLE}_*XwG6sI2ojsEMB z{;)FHT5+hU@XyX$b?{9iYVN;%a8HItz*cm8e$fGcE%Y1>>7G1)_pq--m)FWmj-~tiutbigX2tI z4A9|t!^V3_O!YVZH#5SRL1k=9Rnu(q71MAipoGUk1=kGJp1PzN!Egucx=>~ zKYJ8~YPx4P+gn6*mi6c&+^Xkhx<<~zOd#}|sJbjxmE5u%;6irtKP&?(kn$f};s5qA z^TYSo?mvS4dTRJk#6Pk1m%qXEo5CHzR{4*oPzN^eZ^QXtA199F)}JEQ13SiuL52fH zoZ|OzBrF_9F;D+&i!ycm8mz5?n!WAcyURiuOcWj%tp413=IHDq*gAwTG|W!G z5@ZMsyAprB6qb1j{D(Yya8YOgsnyeYH+aAdjU`|(5i2)a2gVP%M3#%6jNU<;)5Fh1 zuV7_JiUJ4f(CX5`vtWPqi7Bt;KJH2HI9Q~AAT6)Txl=JN1OKvP$R8@w0*@F~Z=qS& zf%zcvLf)v>9Y1fPk|J-{?g36!#QuJbd(|!ww;Whk#$q53Y(2&ID-LM$+bSaMZ*xN#I@F*gruUZoNns+T~y$I}q zF^KSAPA$LZs~^ogY>k4&n*HHpC(k{A;N&=vFrnh&5ZleAnx)kP4WWEj^{Xq1??muB zSY1a%QQ#8cj^MV8gw}>ucsW1xfzJ+&7sC82Iv%_*j7__jy>bZ<{2vS~e#D6$Xki$@ z>vC^h(=G1?mb&(Xft2Q7*K}=VE9v{@$ri180tSrqZ$Gqv{jcIP9_vuy<9K05u3um>BB`4(~Wpr0S!5ygD1 z{LmbNl8H}j78 zm$$5k2VsX&xWY;kgE z{sDD2{}T}YumobkVh9XcNd^N6P$IR{L0>Qy1%7t(1JG5&iO@GUJrdqs3xQ609;?mm z*&NHEa=V42I`u;Mx%!(HFi&?5zC0s8EE~QYzgAKh*g}9&_wDau_sgC)PQmitgg-eL z%KHks=8t@nWWoo$2#5#8&k`i15_bX)qlcQybY#!G51hES0>oOO?CDq2L?>5TIS%4? zMP!F5pxq}4iwvZ8x7UZ_P~;>tqcG-%y;pN8ABC~1<%8or#?qwjydr9IZ{&n$Cc47G z8rY4jy&aBYDxC@}2MU{ES99R>y-l&2**d&Dp={dk-7dpAJgZ6te5_SK8+RGesSvp$ zUMx3VlPV}ZuUzdXy$GF=9V#NJ{*7m^s-IL2^kY>`1zNrB$4l9c2(v}6%1CpN1ie`_ zzr!iz(*X+?I&MDo*c>Iq@8K7R%7t5o$YttAqe;o#>;4-U%E-oMlp!k7FgG|mXhv@nBc?Gt`B@X=2pQWo^vIJ&%Ah8A)nzn z(;@IIhSblQBJxZ-E}-9xcq^|tLo}Y<@frImK8|8H#Q_3DMcUsTQWoIuH+ux1zRfje22#rQ~NKnAfh$KVOZwsq=ocdh1T{<=0j>ob?A@lVH!jvUh z5imM(w()yQ^`sc!bVZ^%)CjmFJ4=D;wnozO<4K;uka|q*q7}h%jYPp)mtOqGTj#F> zpnyxi{sjY29|t?&d>4(?>bWr%NxM3II^F56wkHP_a#Q?BA1ue1PJ$OH1W07C>rRHW7Si;ik*t5EqYSCJ>50=0SK8``o^JG!n)@rWUiY))i201MDDg z@$w*%H0Xj#Y6Z;s$^h?$*N_L4iI5S5ZGI-(F9$PFi=fyCtmJ3tD*D2pwYkh z6^TO$et{+yJ^sc^0th3u^p+$h44mqAN(;X8VFi;Vuymk{P-ONjl!Tg#3ya$|fwg9& zp=*~H{p|buU0KILj+$#tZbKbF81gJgc!N-+1Kf5Ufh2<-R%ihu0q_Si1_C`zE3}sw&b*vB&`@BQ$-6{r7|(ciSuo0R4^PP8 z`i7Wd`8m_52&J3DbZ3K-%MG86)M(As!-}q{L$!p#Vy9+w<(^-n;kL+yIK9G?tOx?= z`cn&bkOF(9!MG!0NC(^L&lMc#583EG+qs5)4bXe2W!@_~43VVNj3KbkhRJM#P)EoG z!io8W0HJ&WV#+?KrJR+88j)cLSX<1H(GKiH!1c>U^Yv(zSV2KUF>A^A^Kbu3n1}eO*gU)J>pg#3Gbnf2I^1*k^`q8)$W8+y zOsvj}>8z6BnfT{;+~T5_GSqL3V8Io_*K`36CtB^iN8;CwkjR|*v)J=151l=l{&)>( zX{h0hnca8Tl77^4Vd>malq|EO{ws!UsNeN z?<0s20fqTBV87jCY#3bISvzDw$LA5tV~seKHlTaGUjd&ywB-V3d#+nWp@_!1vO~{t zlmOSHM^b)&^36s6CgR)YA@~H2_-=p*E6)xTWfYlpeFZ?WLWbI`ho}WCO4OrqD2nCN z2MmaE_d&dJ5F3^znB2~&(A`Dn8a9*R!FlNLRP6D7A4PBHG~ywU`1ZrV&KAA0i?c2} zo!Pkf4*Cp$d(R3-FVdVWF`GI?wg^+42a+o0Kv45!alMIF(7BODXh(0hZ`qbdNWcn2 zw|es@KRE@oZh`FF{zfXDQd}#dYBz*)T^x2;aDAogGJjgTbjgIi=!jtxqz^+|C5L5q z${aWCAX&1EvMk=hj6d0d`&ZOjhM+}5nZ5{;anDS!<8QqY8gdi`N%iPe+K=(s&h^h> zd$Ay4R5FBaoi^Z;N*ia>Gzy?C@iXKhqvhYBI@P}jVL=;>?J2q~Ez!$Rfve(w-Mim} zsMHZ7uk*bA&k%Th+mETiahei=Vwq0J z@A**W0%JMtqQ`1_jM9cr-ctVp<2P^nZ4R9is|zrUjc+&G`(SBOBPm}*;%YxoA(b2C zy=rP4{dI#k@38dFEcgKe6^Pc5gz)bHhgYW+l-!&gyv2!S@0VCbn`f>*XWpyvkPEMe z8uTM1<3u8jPp|18GXdRgAfzWmcLW{pZ77nt>q1tI+w9kTei@2`y4NA1MN!=P=Magw zmVc%^CFbLrWspRAXIYeGujZ9>7%PDaI2K12sMc9*E{%f!Qs}yP4uz6Z4!E4>CCwEI zZa4Za)UTKpD>-R3LEr^EC?h|__uq7nluiVLV22^i|A(@JkwodXhkDRWpJ*3dejyQGc~Gy+4rfo_VVpZNgB3#zYnAQldS5QAJ9*xX*k@dzB%hB-1B=N z&CKRHB6V;I2*ZCF3ti4+j$U_?hNW#6&RQ!fgv|t9(nFjjN}A*M+deluBFuS~F&IRD zn&`n1^;^RFb`oWIym^u^)l{*aW%N~h(5mrl>;qCB$5w{ao*BJ^+Vzo=cs~)j`;?{q|`G#gej>v)M}Z^WpWoViCAA$=)I#cjB_w+``V0B6N=y`Q)@4cJ}*{4meSGRTR|kBNjQQ} zYHWg-c?<4Hn%j;ci!l_+umfNe_9^4y(L~ZdCnaHRJ$?t7p!4-xhDRXBK#7=%jYv)B zx$kbf9=Zf{-^oDP@qMdv?fAzg#^9#sC>Qt)BoRTjn@Ik1h6tk5%}~EEB!w4ef+8sg z<7G}}@f_&1$*E+dU z^#k)ilL$%frHd+uE<{AKd(Mf1ff57iDXN>y;`==zZ>c@%MOlc{`$0=@$eaY$7*X;o zFQj5~FftURL86y}>cL?ge9SK!M8~v&;J@E8MW~nT1#e|QTbdjgiX*F#p^Q@pxiP+F zaMgmUgjd=hXZ|%V&Alm}&-7~oZgpqt^6Q_LnuuG5w-%8Ca+3ctpD1xrziuK)B?H^d z8U{%7@g)yJn{WaNZp8n3KPlrhCNc(re2acSxT|wqg5v0RDlsxkX6<5&>*Da%aTEWG z(Xfb{D$Nk(r+pVMYBnP%PBIGd#XQzaX~%=)mU-{VWcB=mqJ%VLkDWL?RM*&GH`aJn zs+A1GAFg;w*5#aa1OlU;2XEnHP%l0oY);1h&jFzBYWTPul}`wU^{p?GDi9=y5i3G% z(M_+ul=R-Rw?c;Er#sh+vSz(Wg>uhayoZE_2aXh}nHrE?{MS5)l|b!9gK9(cU>Wt~ z=nLyd&P1k@zCI#Vx45n!@D=6@6-fQxw-+-DQlqOONO*xY{}CMtQQoNNxNjXXN9BW9 zkG(R4=oBR7$N_@nO)S!Z7yG@wlth7qgI&iITpjW7Sq5j?BvSh2=a)ut+c^@L7v55; zQ%E&LPsC?0;}2T+bdk~j#rSq2B^nRnd&?x7&RHX2O%Et;^}gOu>ExHX2E_Dn#7}|w z7GnMai2r(_ux1Q#x~(WP+|>!8Erdqz%^GMG4D8}ai-ImP4aoD)lOEB<48Ujq!iz6y^InY)aLG^-+?e^seJ(X7{&p(27{JY*_ z4E8fY?&IwasPYM-@jizYA>*NZx61%aQcU{t(gd`S=3dR2d$@}yEdXUq66LN0GlXIi z)K)4^+&&a&lXf&F^`X)sCSOXnr*^DW)yrRLhAx`E^_mGCMFltQQv*|bD2L~leNxh+ zVaOf#Lym_S{{LKCfz-Op#|aZR_uV&vr6>Ma;wBdfREi)H=WpMDI_!h={elOzhaGGt zprY+SCEZOd4SA_o9t&20ZlWNeA@rEhhat2WDm*m=!7s40c3{Z8S-@4In6r-yG`k;- zIT}o|)1>Mt`Pb;aY;}mDKXtF;w0xHdz02GU7~Iynm&CfL78#DJ31^WGMMwq?D|jl; z`7kXM0P+A!%`=SITaD$PLwX3V$d+OSXOe;VLkHCqc`HMg;}QbCKSo;p!!5_G%Uj2q zx%0QOl>tsGG#eEv?n^mAGnJC!Nk;IYa%ZKhHv^60$$=u>fDoS6)M4mWlbbqMG|;0J z9y;ym(6+hPfpvcinD zbkc|EtLAL4ME_ZhlWns@mtYf8=PYia$mCXmnZDWOQlOV4!bv*W$`PyQ3#xt%9_V(N zfOVw@ZIH%-W}M!%5OJLC8_;WlWU$mT1Y)W(=T6YZrhM0|;8zQ2WeHT9cEMQg=m#|U zP)d@?%lyncFp<)P&agHvUtUVISORGyR8v8hJU>CsSeJO9bcKV7&N|%6r?_{Z)-^$V+DBaULcHf`0yE|}Vxr6)vN1b}hy+1)BiUl8%J;$sUyov7 z)FWik?o@V4{0?{f7>YShbIvZsGm=m0iZaC;E!AGvcjv8_!>Z_Y7qq0rRxb`;Z4zt! zRLS~dGRoR`03rXfK}pBL8O79sf^*sD5a1y00?yuz5AbrmpWT?jky`KhW~SJ0LyN9I zo#V`Z#62fI4i#%(%Za8SB$}LBFpZtb@+|UGGEblCUD;$l6Zw*Aw zM2Po71-3)&&JyUYjt@_!Fosa+Io9s&E_z@O`Mq}*T2w}I>ys?IH?pUlyBfkp3Zt!4qlmD)q)>)sA|Ec&Bn%yAQFeX24W zqC5TW_+QT*BEy9iYceWdF!YbR2=FeHW@i(IBN(3z%;E?#+K;+ZmF&NsH|blO?$TY1 zzWe$V0)jebV4$LKnUKyl(C_@suU2J~lyLkXORNcRFs`H63~6{wMS!$W?kVKEdB%$! zaDJ`aFSku27C=BW6{hjo*qrhiR{rV4kinsH?a``*sHZiVG zBk|SrY2?WxWDGCJq#(|B85I?ToL&UsM!x6g{N1>1yAP^6gaQ4Bq|?AG^uxKGC6qSG z@E_4SpW)ErnRi}ZT4M;54{jY`AfOI{99W=GD;+O`AwSE@M< zr18EClvpp8yAyimS`D#3dCurO*w#QrDnFga6XVRLw0N1A(v>0c!>qVrbFjWe-3vU( zn={4qtsMWTx)q~DL6JZ&ji`&rXjHFnGOYK;i;#7!-D2>=IAAF^M!f4+yv%lPcO*C! zR>lwOlL;Ch7imtC7y(`LXW8grXpH}XoW{Z#Xu&BuzP?*%opJh<)#;Sj0r2bRT@8qV zmhj9gWH$a)B4>;R$B2gcI_1z|*cA9jc9etNt{%iLBcRjCOEmVY$J}!^LJTNZ$6Z2` zho$roW+#cER9rClHbShle1^Kj02IG0;8Z&oAyn>=a41ALdfSDChY3Pc(ZJ4Tw(!-Q zUPG_H9!SUY7rRQ~-0G*`0+YZg)P;lkxgxGphNB1qDJ)2en*$lU7ee4n5DVRSEWJP@ zMAeN4k6I=Y3OrXxff~7c4x^_Ek9qzAMmShD?LVvdz?Xbs_UZH*9R}DdG{W}jc^CXlLKWXqHAM(<8XLDJ-?5Pnt z;Z}avyYn|KMm|5^n90aF#?nBJkc}N&;;9f}0*fnN3qm!ErIA|hhjmA3c%NPpMUrQb z`}BdV?BIHE6=R3i1!xm;A{{sdB_5bnnignkti@(8{cgYA{An!kJO|cFH zvh9I>B>Hbpy^RJT`9VHgQ!DGr8!W#S&5<(G!5Il;1YaPqcmT&{_O+BCD`z1W8S2AZ zxiL^sTSC;{F5F&nHT!nGR$;0cA+2H?pM#YdMA2H;i%k(u^0t`WG&rDQk!-exC=f=| z+a6J&TQU8UbX~h*12;nc(i-Tmhjtb!R|gm`--PqGBPDcV+0TScKMFxf0l6p$4vZ-Z zwY9U{s0DSYD9e%0F&p^B44ue5tn;kV26kWQr(O;)R)dteF~&-}&99vsVcQ+DY3zaO z*)^PdM?3+$WD>O4EeQU8Q_nicmk!?jCKMPF1XsUFAYAD@w(|oRsCqcK90&{|TxYI) zc2_mnOMa^i{%qgxg;d-ULV{qq*y`>!uy8*I5Q;OQAYGv?!?$=SxE(OBv)7>Yg>(DbVQ8>Xsa}sq zeL8b7yBO&qclJcGVYoP-|6YI0&k>fUbm4JYrJZa`3OH7LU&X!M#v4@>X9 z$xRg)hYG27-;9YhOq-wRmlFtB4UPxS`v$a?#}PcaY#4!-BuZ?>~3BN@Et72LDNDS`>++`C3ypiem8#-rclvg1eZGXbpO;k`N7>8+K` z@c`_kU)Ne#_9y+CY<4zTqw7X38BkW1nD{>KL}eIyEvo>)R>x^LCzNS`!o*Vrf9w6l0D5oIG2oR)? zP%*1tF z_jg&kKBzew19@#5h`IYz3V6;H%77>3w_ov#LuE<;G=2FO(h7z>bj#CM?76CvJ z#?PIc9p1g*vNf5KB@s}(@tvPz00M+UC}K3965hG(GVbTJ(7_!byjM*e{DFJ^78P^6 zQ`Oc_+=9~e@vl{rhm{cSe&W)l1GzP9BfSe62|7cV6cEx?z}X2}7noRoa}&n+3s*-$ z{g`p{Rlnz@h+vGKtf+zU2WXZj5wJGT0G z_$HqnAG#Rp&VT9P+`7M%_o6y$G;`Dmx78PnCgJd|@35&Vv{2sBaB) z0gx(|{nsOqSIhsm$QTqtf@!EuZJ&0V0ygy0N*Q;q*p0HB1z6dnIV_xUGyBbSv90p#Ic$C}392VvhQ>k`!!X1x9_^+WR zrxWPUp4L8EWP(fMn|Oy5XUbB(0_)g1|JFDLhZJ@JO8U}FW zfvggt3Fqrh<9<@yV8sDr@=Wi?YcI-E{1zsFoXP_sHJ1gYTaoWyfh}%Cyfwl)Uu0_Y z!6nq+S%7!@*A*v3W-7;a71J5gM2+^9$kM{}11qGi$X9U5rr-o@V|@~1?r0V7q!0`6 zPJP_S);PVMyaGNPsk`Vdr6D?2y5<;rjc`&ooIn4u@?jM?dkcIqNgm+LqeOb;=|m8d zHqZ%A=}9DPrJ9@%vnw#hln<*x!e_u;C6%%AR^l>(hNJ z`v6}=bwel8>o!GhXG%K>(gLCLq~2*tH;hLQQ5Ob8_#?;)j?7PlR8+(WgJ11{;G89# zXC0OQs3E5|WmV;K1F)u8YUtjoYm?!chl*3tF%s$u-14suVgC8Tj9EJ|P*qZ0yg(G{ zqaoC+$iWmj3{o9L%JJqsGm=2WN;q`!g{zQ1U%I!Z1as5nwDLusS`0h;bN{`&4bH_%Rl z1hz0SK`B-;FB$%q zQGZR36dzE?X+yp~@P4z<>>!1yzb@t9x$j?(|0`PfuV>**^Z)O^|93+i3wdP=hkE%J z8mjkmQ_5in=So#BxZ;Ze0-byg3kak(zh9$E14F8xQy>_LKKZ*b#w>&qV-`ODNG&~# z82JtA!7TOP+o>2a-#*-^KL!F@2<9zNSpW_K7-x~wfCk^g3PNtrl6nU7lz&es^yT#a zZ4&(8>~;vC(}q+a^A_l3arfWHb&v}Z3EacE+V)}h5cO_t}gKr~E;UL%W%oGh^ z>d#3$8WT#g_h)kRdze}Nw@pT{Vj+P#=uG&}obG>@P7)M8tUu|~07u>k@I7qicAw+KHHNw&*bcc%tfg3vL{>jZFxg~Mu<@J4+gF2fJvyJpBx0U|Z!+1bB!eGsL(ZmmG&p9Z!|0n+%8G!K}b4ZXaM1c{1T8a~@p09bt9#Q|^z5y*O0 zm3~d9^tvQ$4P-+98nUL`e4`SsdX_#z0Ngq}XJ(4F4VDR+&93;q?jJv_Scz2lNQ6wq z5oA43Yv)NYxN+r}gh2;`R(p&f0`ovh>1Bmb9qNJVu_2^j@_LbQQp@6a@KGY82j__> z=1KQ`w=h9yQ$w)hfo$E+TA-X^2>~&Y@;9*i79e|<0j-yRs3%FE4YyyaC9Kd>Lh#iY zN(rxIRN7hLFxNqpX|xe%JJa3ly!LC<`O)%1&Axlo^@m;nRy7xW+Yj9^^DwTz8NpGf zX%6CRW@VzMrN81&fi&BBo1lO&n@3;?=bEa`5 zW7q&0YHtV0_r-o7!{vYfI}q#&ul;z!6KgSeuY_`!yUvJgONh>=*CD@icZjlgC*eHb z+S|j{Q7?;xS2~BXi)gpAUQVT;rzbvLH{~rHF5F8@-5~Zcbu)YO)!JMrfclYJ@%7EE zv`nIqWGcN^O`me7N{T=fy%wTP7xTf=JSfgKB~7n`k2gT@XmoCC9qe)lwuI)^J7M};GhWe7s350FDBb>D7AAQ8jJ#%ZFD z;;}xZcL+{;kR<+Xs28mvq|jETL)*+5+9lO8t@jXR6_u1~D>y4UrJUagf@dZOTXlU? z5P24ojz>GVx5$`d_qs|Yqr8@C(ukecukKz0W^VsS5RryAdEQy-EOChyPK|}@~XpmEO+VX%3 z0+f^320dbvmy_QGJ3vWwzk*rv2376~;A{Fl;2eap!2+hO0P^K} z`wV)h;4eG0gQEWQ;U zzO5^=g2hn*5$#ahhI=zolY*W(Bi==% zQ12nX)%m1d(0kR5!}Z~{0j`U!O&q@LTJ%puG8k`F`?8mRUpI`a6t8%&*#*NPA6>rX zMOkN*weNo3mA>Ag%AC$rcXQHTM`3jG2bb&lX?{T$dILH>u7LZ-KEH0d3oRFiJ)w6! ze~)G=d~$25vBFkZE;hv!duILIc%xZ$q(@JBPuFm7&&4_#YuS9{#0sb@sd+3kJ*bZM z6wUtO6pQOxniVrc>av#R?gOJc_uk7nx*{xdnVfHB(WmvWEjZ8|2Z)ItT zT{&;5b78sITXQnU>1FHXr~NzSRR8xhz(oOF)$GB&1zwk(an)BO`!A@U$GfIm?3i$o zRQZ=gZ|5(M1Dz1?moK+mSFgVORGV~)|A2>i>s^u1`qol8$rNvJ@>xp{s{6-+Cg&Q> z`Q^EPNXB+e)whmJ-_97%`gxWu_D!}$KbxH2jGVYA6BHBkLge|HlYG2nkt3TygP#4~ z4(L}~bk>H*zTS(X08$vp4y&e|WtIgqD&g4GexYn?02YiDDF6D&fM$xqP=fa`bU9Ha zUI6%00>2Hic$gpkxp`8xH=ec6TR;2xEuWI@@gDGvcq~@bq7%;8p3$Z9cC|j@{*hkc zNh@1;DY4veC`(Sct)E8D(Q?H^UyW*Ww_QYpbA{cNCH0H2w8(1b__?~Su7*^DfO#mZ z0~2n0RD)w%W%~;0Uj8_eroGlzl$$1cpoNgU3;>L1KcRbiC5qLWWCwUXP zvi$hDgu$2keqC|sYTO~WdsGcvmV%Lggwa#kir(Lv?J*Zwc*@nJ@iQ`qy=6w;UV)0< zWzEzaAuEb)d})RQKPA@qP;?ky$-6F7Li%0uI`K1$FgV?rnPv=Q#0u)RTrkMW;Jwfa5=ce zKGLn&upjTf==EMM7NjzVhV19UHOAMPpWpPXKqPNQx{&Ve;v?Hlj8d; zXp&Z@a-LCr%UlmR^otDwRdeKFP)d%xJi2lKwL>a`1n4-T_>A>cB? zjBBrbt;zkNIS|=VB>rmU)DsH1AM5jF0BeR#cgx&wn=WC|q9-WYGzeEvcrTQ*o?>*I zu<=cc(yB_XV&Mn{g+FNH@jBoK8c*>~1cKS}B4%$IdQFo1>F(>F1O>G2o1+I{Q;Z|Yc@48J)C2d5{6$|jddolnXZHV*z8 z(>kCCUA*v#Jti$2F!kTtD?ArC=<&V}Mu~%oY=8KC@S^`RB{7Xq47wco(QuvM)20Z8 zLTnGt?u>ruBIqLr@p!QL9#%~RH=1eOHn0Kw^A;-;OuAZ|*{-_ByYfwW5gol&2R^DL z0XZ3}nM*6*E!hHoJ&N)Y0p?61w%6=LuNW{1>*v|Yl_K^1#bEs%zN6~y9_`rtQ*_7K zk77aT%3nO1yA3XK3D=9)RatJ=5iV>Rb&DIY)v!C_cOGkZ3-n}&{6(iZIzr;J&i@gV z7FzYg*{cR`hvm2vvTFDdTQgCopkCP06Oftnzmb?#G)i*Xw%kHkarfP8P6Mki5O1=0 zHiSzQ&W{BM_m+zgx_u9~;l#Mb@0be5c|N~o9Sga|KhJ%yd#!6-*R>*vqJJ{YmS0#KCEnjw(sei~t~>)P zeVOBo{Am0z3?Z!=ez10(={E7B0cgD&!8EaIev=L>eds*AhPk9&AS=;@oWepM7;|;o z#xk`y)7ZsU%BYz6&t(on-`=oEqtucxnGiMuT{%*PdZI)$G>_J4Yk|JP+^J2g@Mkcv zpg=wW44;LluSP3OM-XKV{`%vJ<@5VCC%`C=t*_?uLl%wvjh#Cob4R)^vfsuTEe~4? z-!ImE&F=rke(v{6IkC@{`=qhM+i%oxBW-V<;Vcygtgv}=m%zqy_^9QOB$j>!M?^b8 zHmQd_9NQwM&F^;JpN)8R)?T}v?~7ve?JF54r%xQj|4b!mnhgE`*=6ziO595F%GBhO z{Mrtw{Q3uMQ`2!)szu0%?@laBg<_v=B5n)nkpB(c0XJ-B;6KTT91 zouS3l)X+0`*E?766l*{*H-~T8eE9`Ix&&H7G)9w*Kd0E9(uY0esiS?1H^V|)HtVy^ z>vEK5V~O>Kx8yeb$uFR+sO8^j|ANT1%+HV% z_ltHF8US!Xw|rKd3e@f*G&!xk`@dw`gw;_@i(i z#4!b{{Iy~<=Gsak-_}$(!G1>c6_MX)qPX8BJX7jqeD=9ZF;HRdr(~o%b~?c!a`CEN zsz*qpX-3ke9;d3FNCT~?c_#kF>(_ch^ldw&6mz0((|sMYuV3(~s{L-t-fw(e-RIR~ z$I|Pzi?54T{F9Dpr!{?x+723vcL;H6_Z_r>>8g2BQe0*-k;-xsIS~~(Um*6ap?i6>?~-4 z>bCpuTkD(GFoYCDg+T6p@t(YojA^%`EWZwv^nbC5s6TtGOpKVpL^I1G+nvc$HkaxB z(QIQ$5dA-5JtfQvdG3IhGY3|M@UT>L-XqMSbZ2D@;bH;}rd17f9W=)s= z%QBBG>0%Jav5cnb!KgfAr_`0rv#bFjdQRB1%UITIZ>uX!PY;YQ^Ee2o$$5Y~XR6Ak zq>#^+yssp9#Ukx2TN(f!>DWN~xxy+L!EMWsJV0R9m?F_YSQFjD1)Lwa41*g0dE%d| zqPg+xJpxu%zGvC31P|6ht1g`2RpLh|4K)B2ez;T{C+ukFrxRa3+l^fE)&D0!1w^*M zGpxkZaa;M?+xh3hHks2d8S^@#HuRtd>+o8_Dsjma`z+5ncro8Q|8j`ipN(?z0wGc> z>?SD`m)7+JmD672&dp+t)k0n<+r%9yg+W~=c8*k*!i`#)tu}$|5GROgo=))LZ)gQ= zZ?S3h?NYDo%-pT6YeaU4nKg*mo^ZIVNxMa)w|nFW?)OUFu)ThmaJiRB9;#?9{Jjp z5tXFPEb9l#b{4T@zH=45hlN&J^Evya-RNogF+2OoD=+QypBaq>MyXwgI z;HP8^xB#Ct_S|S-$rN5{`M(*bIc{4?XwEBbG%&rmH#&SEY&pDoJG^pTpQTtiW1qYe z4O&NH|N5v2Wg+b?6#nXS3vr5brcu(q_;@TO|CsJX^Dh5DG8iOv0_52@cpuvp`)j+jB=W-u<-*dCw==^&yUI2f_mDCnd8WUL`g1pW zm^CRMWSvm>@GkDc9bmlMt<4#W)7r*a&GqpBT=|rRe`%+j`*hEkprIOK{U^u!u>G0( zhG)Bv9l2mB-&}FKzvUcD2L5L{$xFP2KsSl)r2EwyxHB-a&2x6SjolKv>r17!OROZ< zd?$ybAjVh-8+Pi!iRl|m1IzYp!*AP%jJJ)B~MMG?vi ztTAz79(S(vT=ioJc$&6MktL;*c1dty^C)YMyOt=knvqCS(vE)OLy|O#2B(3+MjOZc z>viFLQZ~;to2rIy&+!aqJ2VwuAG9xtTw2FxIc-mCm8!Acka8 zrCMXa(w(=4;i%4rA(AQtYgM{uXLv+D96t=!3?Szxmt17zK$IZ*w!pDX06epgQZOE5 z7^^Jma-9VdTp^`5Q4p`$DWPbxK0R{Y6T7D!)Tji_MQZKuHcK?hS7M0PUr_g4D87n4 z7*2U?W8P`9^$lAJ1%}>~35U;l2xbpN;rHGUpPB(r9xL)x5v@MxM=H+(Nzb}lzUbX4 z7W~&!q{G8EQtHF`x`4-ilQ8zt5DmdepMkO3=2Q;=;~b%NtAn7_Z~61ny~Z>(K^^8Klc%p%YBTE@_$ zKc-}u#YDs{r9U-~GN4xn4m0K+wL8o(HsJh_F%W1;El;$`$q4y2^O`I`>`|ckJV4}A^S7GEpB_9ha>%V`-|>|* z28S``ZnV_X!kGyqYz1F~Q1Asum`7Gq?I0#AtO{Zd@ECa4eqb67=Z>Iw-32s$GWRHv zT~c__-F=Yw?*@Z^zzwE-a=!1+@wI~H?elHF_@nO6j^(<#h@LyM!5^J7OMF+kG7$V4 z%5>!9Pm9W%dAj{-wThR;mFf}#&&J`mxi z2{h(9*OQ`QTO94kkt~K5{^QF9ZBcD=X9-|-&wz-~Iyra6Eq1>o@Z~uP$kHPZa109_ zfl=#Adr&?Rh-!qUR_6!j_e+VEuhmBi4sMT4w8nd~w8;s;Jo{IhUNQB|#4ogR^!!*@ z9)1oaQCN7j2nbxxMekeRU@wjZ!@=V#uwOPt%kk*#$9o1bG}ENlMu2Fd0hB4Xgkk@&zlP>v!LTezm| zJ|iI3$;dFxad+EBSqZrBn@vtT!vm{|%^vL;T0nj`F@jb_>*GCdI*jwDF;^K;)dzrA zMT|sI*e=#wHilk84cxmNeMLU#WA}|@C%Mxuv(StH`}otR^E#j}UIk7Rj2bSTabpVt zT2cil&PI{V2lVI5_O$U&V7pov>!ogGGCX0Grs;5CP+GJj)1JLE? z1Li4CRr3z|Dsso+23HGG8iD491N$@Pr=w0lyD1Op(PiWuCe7VH;+Vm_^v;dF!#ANe zrWK@g`K50B9VI~PE>b^)!Q9fQesOYpQL2&x8keH{@ShQ`+Ix#|Q1wEVV+;h{T-2Qj znjVT9NJZ?LexOsP&%oEPj0CS7{--lbMeh;WP3|~gx|C<_K17)feao|5dKMC7KG_b3N3fZstIKoN>hfz}LKg}W)L*$FtvwoO#%h>|84UN;}R3iqPh<7>b~l^ir} zFlNIZDGNKzBIFF*$9zEf0B!p$d(7n9uYP_P#e2a185ZcsCyU1CijMz0mMt0K%L?GE zfrbR*0N;ZLve;+QROn1Wx<0I*^nfUAX0UY7;hp1+Rq)wCUUrE6%+g!pKp;_|5_nnA z@QJ4_$b-)O6zuXFCn*9f`l+VHAM&hc z)v$h7p~}w&>!ZSTmwMgX%xb@WmaD)Tba_-^!-samh1#ert7#?VwNdAi1%d)(ZdDgN zIVe*CfnOs^3X~grr-M$cxQ})3WT7e)leiCV+sx2o2!q%oXD@7ggd;+f-L2;+;7Ig| zs2Q55zcmLpsM?!n>)AgyRQ6-&H{hJW=Gm=WNl}`80rVCFpx*{PBK76Ur4C{QQw{I#LW{&O=yFU110Qut z(>n>|Qs&ocp;tGo=_~i_l#a9?K>UU8nbD#mF=;XF0jhvX^qothhcWb}NSusQGT|S- zYYCE5AyB@3+OtOi-nX*(m0?h=6uNzKE4PIn+}>7x1dPj+jx_bI^rA({wclR(-=T*z zXgxn*j5cY*ha2c5_&Goc{y|H~Qs`J7JS0oIg@$w03$Apo#c2jpFDkn03>B*~WtfxUo>F+e;u!c4W+ zW3Fd78ptJ7t&8Buc4IV&=pj0R<9RfW4sN`|uBe(zSu?G(HsTG(-&-N3#(D|}iCAjk# z+LrlX3E6`zE@pf4Wlcm4`S{PKXcptqX0NX19(<_{)`lM(APr%oQ3C_K8Q4KbJHcKp zbEY@HX`5^pEN^hufqTcUAcV&}hfV9XlhwdjAFsXZLu(AAAS>akVA&9Kie0mh)Hr2% zhng%2_PhydwAu#_-7lZPS+fnnEZZ5&Gu>^ZA+a*_UfMVy zd53hz!PjGZSVF4@f$%9-N4l+?E?1oMQl#6@!i}jEs&|Jm&YWA2U*5Et)4)D$%`;Y4 zP8gi8jfokuN8L$SuEVIWw7O75r|x$_tgr4;Lm0PB?-h439at8d@6TNSCIejGkbP%c zAhIBj4s!s`gm&VG%$9{DfosVSQYadJ8@W!gz=65e_nU|Mr1&ewr)+RRZ(ZHaz5sj2 zKA4O)3I-9+OkymKVVr-@_7%2C249`jWCB&OCo=ZgZtThwpk5Rg8QBG^3gIYi7Rd=>7;jjqxyK#6_Hs!mp>{1nd$9J|j18%%W zq7c&9lt)cKr>qZ}tO%;`#Hzy$N|TKgP|DGh578GBX1&sOt?1bF0nArn>XR9u52~T6 zJnjHX>ov_EKai;MSZQEdK)*|GDwp67LB24R0s8PcxklZsK{n712ltyNz)8-9oU=EG zIW3*`pguf%=c0SYbo^i8m<=OI>JYiDBg_o)!Axk&S0AO$(*>(Elj?rpLKS2&D<%{S zEx_lF@|tkQHGyA{QEQxp$q!A^>t+y&2*ysZtB}!I-)$h0_d}e~hPW!_$V}Pt_P;&D zWqCD?;y25PCjsa1H0`p{U`aoS1Ah&0@`6=~f0YGV^7AFTJN98v%ZIh!yg)(>4>fYX zEaxX57cs8avdGD)sL4O(ykk0WOY&zSTFkjEw@7jJfC=cqegOg8Re&YbgNb(J%1D*;p$$~{l9`Yp)5|Fva^>67M_27nE=xNKxVT3r_jEk4WK$k#HI{L62Wo z>>cIvSB#6WV0(czY6SF)n=k*EDT7@b6FRlR?WU4DOC0Rc;bNbTPF=pKq}aZjkj}7y z%bXRvH-v0{CgB{gXZknj`&xN;c$mESw7t1Tn0VIG%WEeW)94FYy}~RWi?M=y+dw;6 zWM@|W5e!5MFnh^4It2(I_1EaU1@T1?nIR&bEHG7Fpc<$Nnl#-FGcB3Ssu_TbMjh$3 zUri9@h9g?qKR>LKxxFBo54W0U(&KW3nMjR(!AsH0|1HFSh;5$(hxau58&!h8U%!m9?OTCqoZh!f?f)>v`!{6UZu zXRcuaHbY^0Od=D6_UwwogssomD0Et_*=cYu zhTe37j~7~4cb65W;zKm2Hpq{MFG~HCi2ezQo#+?X>xJAv*qL`Cl|5)^%w!dGLWgM&sp*$-fdZ|V%RHk%5` zTpT{?oFraJLCFbOat?U7;qxCi@vmucuf`~3%YNjn0V`Wm#83){%~IBh7E)dN^|-GT zI$3R|w8a%rJRc_`3V8{L3`$E;miRa3=fD|9!>Q*>V$@<0Z@V;Bc-8Q77*8}7QgCDm_1?^BdgL(RamTY1+u*~&vFFXm250x8(c&ijdr+K2Sjr%}*5)^w? zI@ixnz|Yd}-h%LeBi=?_G~hXE?{19?0`a?q1P)zHoHUi=1) z_G>k;;by8Y`dG5_%tFE%#B4vun&0;X(taQ5h}+#k9vssK_HbQM(S6k~T>6Bd5RmtI zf4Q2S@+pU5=T)hV-sv42*kyI1*w^(1{1hJYf$1UG?Rb;qp|va=xBBbH7wy^iHySgM z&kbaT6sfS1ss*OpA2@qxzTSYfg*1|EuC*YFpKwt$=uFiI|7-JJZ#ZCxKIa&8)aJ@# zFt%?sO+Xu9IGfWZLjw5;B)PyrjH662EnW$xAq=*WTk71<2lY0IfFC3~NQXBUN78M`xFPAg)+I4{3S^cj zths3O=PJ+Pr`c%u?Q$T~X$oSFedhwnc8e?A2-Yn)ap^smt*hNnT-2aelvTYCTl6tv zo58Vcnw|<#nC(rnV?9*HEs(ciFwD$^6gQQ2l|JIzwop{gg3yp0J)n^ysBU>fZ%nr* z2hcEXKomJ5NhUD}c-Abk)vLJ^$vsAdNFBf*YR1z5-k%GLB#sIfb0>-pb1%__=@q?k#nh4>=!Y^Ue zYV_rAA1E4fqcMVW@FoP?DDVuU-=JjE_(3`}JUM!ms1<2#*+P{98B}_K;8V3a*FRmm ze0K-ABe~5Zs0;VOXrPEE^Z-WmPWKJ?xb{a!t9h=&vFA}%BsKc+V@@qYu~qc9ezt7$ zsRB%lxQ523T)mcWyw)>k0x>+MkWAbJpEYn)dUNji_Y-Wz2-&NMKaRM5=3xU0_9%+L z(zAHQ1pl)B#%)MmUA$a*7vKSOHYq#8R#!JNN(}1z{6K3XwO!hpnqGkq)dr6~X7oKR@&*nz8 zgVliJ++jnouXa5NpG|Mq4^=_>u&C-L{EZlobhwAeXnk6a9@Kl%-3>^X&1a|MWn`2xl#e8A*ybK!zZ6BB&_!4@@|aLzVk)A9U1valYqJDh{TItrt9o7zq$C6mOtmq%NPdBd;a#92TPws;qDC0wwqSjep~4_OOZTRJ>!lwQZ`J>S z8HGwX%t!7KMuXLjfU#_{4ulzcblhRqKMts&UA0G&MVMliE3e)u%M0S?tO5~D5R7Ko zrR+*~cL=O1nO~s*iwE2qu>^r?(*sG5%SlYNDzUqI$;-kp$YTnovGTj_ZdgS**9{ru z@d1v_F(knUvJly6;IckwUXoQU<= zJE5R_JH#Nginz?arW3OViY3e@<3sj7M5wF<%nm}P&cO%1?a~Rst%5ZU9O6BY5^7Xs zWSyvn1K$vO{TAhKGQc)JXrEAA;K~R*7qZ|TWK7)&*$jk6P1HGDECL$swNSp$J4nON z@1$b1$I~I;+JdoLQ@7LZ zrq(9Z#W*U=Ymrx%^@+YnLyoj9mw5+YNO+9_6=S&5f$98SqZa0l1TBZ_!Ls z8pY^FaQ9mVASQJBeJTYIDIW9m@c077Jw6L|d^ajfVWL10D^w&w`%fL{;57|G3s5_?!OKL2k-R&pF*NGBhIP7)vd%r!h!ZlzU zDZ%Lwb+DRhZwXPxe=LH%IRocMCKCA%04#THZ`7=b;!m;g3dmk&qixre9Y2x@@8^mF(I z>@8&p7^v`k_ydCX(9`CKI*SstkEp%GRJ|-GZ;bB(>OiQEg?Uvsu&_*NbmhmhPCCz+4Lux9GZNdAQ<)=* zPXC#0sDw$7;LZ8d3aCK3p|y#S3lm##dqMh_khF~$Pd4)pDSo9!YJ{$5#nK64BXnHT zAvrzLPh8{sz|{=7_3_M_9g4W>F{n?ayeQKjgB9LeO2F9fSzs0Jo#eQlV3Kb>n&>&%fFh5bi3-Oz3DMTZ0& zsn6dbL5~a~Iu)r%GW2*bn6E=I(R3hMX@s^>vQpYdR*iz@2q@2^Mjj;uLY{I^3UD-c zxJdMJetDPb$=Xae#om)|0cU~)#6ks`kEq;}ycY{kkR8!13XsS|FenWMb~x8~^emNzZZUa4n363(=2hNIIIZp~x( zBb;}}-(DXrLus$C6WCG;Kt%{bDP*Dw%iKu!({neLFyy^|uRHUxE8s;>!DaF9y;#gd zO9jq_{_+(VLlDO^S+)tnDXJMF`2QnXAsXf$IIE6_W&Yi8%xi7%v(w{C1om52OE;7G<{X%F) zHW)b}tv?3?Bu;|cdX>>gbrtLN>(`kYZ0%QP%*W4N`+3*p z4qUOXF`&q20X4PysNKoJBnBS`ubo7AoSo3&eN>YQ9krVlWA~>!QbOSDC=0pfv_6Vm z^GI#kt~cB!Zjp50gfqmP{VIzPZdi@y= z125clWq0Up#!UX;%|q%Vx5bWtF6zM=l?Qa{ddkVyvVd37YEtwigRu6|5{EBg!~OEF zyZb(L#wCc7_4dm@B6(KR2|rOKUhNaOBKkpEp|$rT8r`5y4*y1vT4UKL%SVDj6iao` zBr!s%dORs@wty`xl_ke`ESFmMxCo@h$&Z?cUtYCipP z1CKQ4!z>048XD@{12K7UcBg3cKXmLhKBsZz_B^EjS<@M&lin%OmIHRv700qapsWst z7|o1Xy>xQo?02xiDvxD|Cl5en#>*qv=Ovq#c$Ja**WE5(jwi}pyFaw^2|~V9Hxddg z^wf!77i~=4m=l;(!JAr)J5tVA`Od8<%C6*s=kO01{#9A47a7pN%rt>Alb&S*Zh*uR%eP&EAY54ds8)9v3X6L8kOAgH@ z+5y`)OFcuP_noGh(x7X4omOPeFJJjp&O2)$(%A3;y z0>8gD)L4~nOeIK^8Vg!aZ(F@tP1bl`(LF~{&l)*A-7>6TBWuNP=cl|z$%6_7_dAlx ztF&@%>;U|8Yv=c_Attqt9^{T@_i&CpP$Y#w%@|i|Iv<9wo#Iv-Gf6(oe zB~u9H-*gD$S;Aq@Mz`w`-}$ZI_>CtWYy&G`G>u6%*eVj-`ij>yb)j{7tn=B+)M0PF z7H|H%81+P0Dj=VGO{3U?f@pe6%!(IHeikWB=MVlhOKAglFDonMLTV}l(HD~ad3r5n zl_hSiRM&sCjJUZ^lvq!;RvUC)9ihJP*&_CCTB=dE_H1J0>4M?S%~%O9fk@nl7q{DG ztzkFPX^pRv*7746yCqLIS6OSSlwI$Uc9ET%A{g2MZ!=9XG0Z=9wmjNNkh`zB>JaHh ze#6HVt*%h}wf^fh$rsT25Jcm3@&LhzvmP$9jvqg;cesh(eRUaFA`Y2xx&^&Rxoi!S zhYm7S1II|ryhuy9yYitUxFA1=Z)d3d+>Ic>`sw|WG&=YezlX%fcHKoE3rBZpNjaNHc z7Nsn8#6+3*Lw`$}_YV&XW+z7OBmxz`UPqzD_GRR|sZ2PW_!ho@TwU$m%>sw^3_>EF zR!4(bqrknFj0a^p?sp8@jr#t0>K{3?{c5cxbmJnAanHdnJ>ZOI`0rF-W@O#f^PnVQDgRUeYl`(?)2>5yR8pl>P zv?rSuR;tVo90;I(!Z!mf!5-s$em&iAE0fH(mAR%S^QEQLX`mBvOlOk{aimM-4~((0 z@_~U;WcjJXhMPbTt?8!=7ZK@By1q2*Lz4O+nPcwHjc2K5lOvSJ163KMXv5omUzWvt zElsX-p7kyXfjWkP>j9x4OEp`mw_BInYBMQ1`Tpfx!$@s7RX?6{+Nw#veUey+`le9~ zA%A>)T{)$ zX1|8eyST3LYlfZnb9O9Bw;S(zzwAm=E@m%`OM!W-4YQH7E5=EhQ--1Z_FgH<?OAtCQB<0tWL!4n)hB9M_8u(J$VB34QhMxOB;y}-~X_PXBjMYDkZri zPtBo|CP)0`rm>8a!KM1l(w(09*2-r?T_X+dg&&+FG)Lr@hgHB?ES}&vQj!znnaHU-PO+p?tNZW8dIf0aC<+I0B%Ua78 z=&W#HhULeX;iBIzCm&l4;T_9q%a>d^ zoT4rIiKk=?t_I7eH-j%xrDn==q+fd``HLH zQzPeP+NLd_{h&;8#kAWS0^pJ2>G?IV;plSWRf1k{I_hr`Iq%>bcPTR+%7T`D-`?ppxMvkG9jI5Y!MvbDjES2=YOABw7u7!?2irUKMBTWA4 zy-ZAElcO9r?l+b#kiBK>*tIhp*gA<7gQ0F+JFM3b>SsGBaXEZs|3@sl=1lOZ*MGUj zzDty^k)<2qKGOh@7f>SrJOW=w9n{pER=(%Ok^Y`~rNCY@w>$$#W zbbwxvI5kSsbEYQMeDsQ&gND~q;-PnyJnc6>g3_j_4ilr-#cM?!Z;u9w7JgZ8|EU=J zGek>?AmJtG)esWQD9vW=6|Eal*ksVf_EIJjpq39@DB6GMpxvmL? zix0I=3oJLMDW!DEr#FUZs<9+TFBcOAgk3iZIK&uO-h4_tZ$7fKXf5bS}jv3 z^T%$U00_A9V;pNFQVN@>k4`KH}vKok&htIgT5AsXQ!+eD#H7G`Q}UbkUMUq^?b1` zA?m1UcNSe1=Rwb%GrE?2z^`MTBwtaLs1tasf1SXExwwC8f#B1Sqe`?M^|CJ4kuYU5ceGC(i0PzTb|*epN#l4QxYZaP6LaNd$H7yOIuDke_(< zrrWO({HY)47OWTu%?(EWba|Xp+L*@sy`q17RXW+Ag91!YPkfMEPuzeZvmz!&BJc=D zoNCQtz6OBXDxMztve0*Ef~kx~0FhZNQI~*nJO}}=A?M=hAXt;J&olsQ&<7 zZpb7=b&r5{k&UfUEl2M$IME-IG_R_yAQ(w($rzgHzll01q*Q-4yHU-W*;I$+^ic%U z`6>b@MF4e;(2yJ8GMz?EFpT>l=rx2*X`gvsBO#3 z?H5wSg#%a#9Z*6PCmz@hTQFxK6&hkf?a=I~rb7rI{qFBqmn$Sskx61ipA5vUpf?7i zHrQuKg7X72c$pzRi>)57WXqNhG1ULBJj_%66AiPBj}%(`vqcNKV%+dw>mTF zHn=CArNW5r4V(D)XXue(ioP|BmPBoXzAU%lmPI(A_J|e7Fl2}S1>w-o)BDJ+Qs{$e zk`)Z?LR2B3M%w6r1+jG`#y9N0qnFONCx8|E1@Ps=QqRC&;tT2^Y1)pSLfML|0yHT9 zp)gcHoow+|GDV|R9ebs3mV+hHn}pu(dqsunzrACLIhDc}Aq^ihE4-P`Qevw81=r{@ zSM!y=WS#OvB{qGA-BL1FXO4vqi_*JF4&PHtjA{9H4ccjvD^G;c&G5AXe{Y))vT%A$ z1p{4O1l&0bQ3IbWSt!FdCD2|S3{o9Vi;h7mFo&WRlMD1gnTL)wv-wo>M<}=eF z)LYeb=Lstz5Ot}XUji=vckBYjx$hca%y5FTYy7SOCD-Y|XWqOO?D&b8N0anK5%uBt zhQ|2^%uM?h(By4MXl~U@@gFck-PhWy02VzxfM>{wC-DeZVMngdXGjT+_jU zh78s0O2mTzkZ7;h9TYzf0CXPG!qC3>`6}ulhU{M?cklNpj|1e9jfht|94){32Ef~` zt=iy8C*H~sHDaKKVPo3oy!)>^6@3WIulf#WkEzqv2~ElA8BViDvMKTxE7OazUV-=2 zO(q1{%E{gn&Dw;+Z- z;w3mo@T@AoZRJk#oHJbbWoooK!?oJTr=<#Rl7CO;N7l8>i7Gy{{4)@yGf~*e3Sv?2 z0m~seZq6oT&jb^1@(_v+?f}p8X)(9|UE=07Ufip>CoVFo!+m!3@4Id~P-VR_xpL$d zO1OQ~p{dl}B2G6u=5y=U5!A_qtg;$ri-ex_&4Q2@H^_An__jy>Vv|tI-7B9sMz`a; z`5@2#i?%r4T(I3sKx}$rwYbwb#a!C)3~d?>Krd;y&1~3D6TbDAH`=oXtLS7oGqj5~ z=R!xUK300!*GTW&;(eR9RMi}p$`s9c)mIB^=SbQXJ7l+ohe;=v$DGdMup%4iY1t}6 z0}~99Opx2R8sPr8uO0$6K>J7CGt`(>-_JDh?=G!oB+i)_*uDd_wi~lcO}af`arwC6 zBW|jbf9vW(%I3GY>8nUATfa8Zl2XoD&xN)*6rG`$NN;%M0tXHqKkaFUe ztCVFCxxkCwj+%@}j!`QchhlpzR6fWKtU-MVQ;E9>KLgxI)eEAqL}{OF2E>5V*0|ZMMGm)SpM0bOs7_@y84I4 z%Hw&H*kXiEkT%3l|F$yi`0PsZ=)+CpPe50!APRjk+hb)>#s=dDC#G)bHJ2LK_|x^_ z0Vys6L{hA`*gg@FUopPiXK$H()qJ@ihM2GZj=e?Gj=E>9+U2e5uUDyn3UL-dh%6eD zg7e9@f9w-_1qu)JOkt|EhbN&))6v$KRpU=C$q{*L-x*qyyCP$M9-DAZo{gqFqmVUH zcD=hT_Wbj$>ztpOV#F3eJY<(IBg_Oiy!jF{NU$rWx_tPb!sy7nLaSQ4n3>C5h7ps& zLE)pHQ%rIZlBt6}%C;QszTNdEr#>@29KkvlHsW{G_YMOFg2M=8;k+TRw3DC>ei?gpDP@WNiQ04y7O-NPbRbP zU~L@jp7r^AWpM7hQ$7}|k|o>LC19)58kEuqC4O{W-!Gq(AsfKZ^^JQhzj)C&eK|^@ zX+0Wao`xl@iIuP<=b$)-`X=;tdhX{iN3j3yaQTTx&9$s1Oy@}TZ-BY2GV~VDgrt2Z zx5~C#X)2=~QoMPZw5BapmCJCjBm!mDodwTX5GKfWe01oocn_+yr>(q895SrRN11#@ zyXBz?Gdr@xa)j|yw8P$)6WXB+@b&dQQ?Gvi{{3q{%2CR zm@a0Kr)JcB2WmAVIe$KA>l=S{-UrFoa?~YLBs3hs#K)E_)*hPk`u-^<|F}Jr9b3WC zV-HW)c9ok3n788ZDVQgUb%pg@Upe%2!uBxP`>P#$oGbM0oc}obf12==NGZK|w#1at z()|H_DLPFTnY^%qAfHvobGAS{A!J31Y!YN;^)o@6#FFoo0Bw`Lk&s-rwCi0CuB<7- z7Ysfzr?L6hsw&UyJTDQ(+ii0z^OOmqNl!RkZ5YRo>AO z?}XkocImfN6jTi#tU9G^R5&fgtfizjsw(%zLh%-BS4U9NLwXFnN+8zp+bs ze5LnoaN=06>9|_OyDD(WOC(}&3h8u^VExR)>FF_*yaH^w`vYBFT5TvC8+Pp&L0lZ_ z^jk;7F!XZn3sDo4tlc@vL2SG-wY%YaX2mEF>Xx zAFIe++wfN6*re!zzP0cWhaTGdz)$;{z^`-nI=T5lp;Mkrxmv;BIcKx zd7Vs%8k1zEEaV5@3kD11zT951!RydxAhza(kyzzZg}hEX@8j;uUCjTacDyo2f4DEv z^lQ?BCBQp9zbXbViGS%#dVbgZ*>NuGC)#yAV-3@|&f^W6m5KmYL+7%EEAwe>U{`>5 zFLRslWrJoWJ<*llG;^{fODhZ#DPz#oV1ED+^2{o|>5}+nlurGb}tdo}6ZV zCwNKQq1=sCga6^>$@XONMXAD#b`IYzL<~5gaEMea;Rmjs5&WoBr${GB*A)nXhXPlIDW{94R7VmK|jx!%9OV4rU~ zNPTr18r2WTK~Uf&MtANLwb-%g7au%S$ks~!y$I(bDXKd#M`zBhR37s#%XK91{f63w zhcTke*y913gKnDpSB1Hw1DyO+yZCM9#NiYvYx-0~E+m68)~tJ8{#}}ze|)1&D4(ae zxiuY(!Mu-`!U7Yv$+C|4C-{)%<1pgDCN+ltYZ{nzVyr3tybh$d^Blf{nGFIn%-e zS*B@55y!1{yPWs-OJ3kn+F%){R4P-X$O7$ z|33{SEPs=p;8JK;*|+!)TM4*P6&Fx}Se-KP(!h&rR-^k}(3P`+829f*64Pm#ODZV} z#VUv}3Ta4K=Ui@~V!m1%Tac@Nk!#86xE#GkB~MoMY6ET$Qb}`h;2QroI@VJJnH#gM&a%M*MNfsuw8wrSoxe<=qgwp=|6V5K)C8z1f z(H@phSBU?N!Ymwz*KK3Yqod$a#XAP;rG}6na7>&)Tu+#%E}}*9mj#FZ2DL|vNMElR zxc}C$!myayjpf2h$O3bDtt3^eyvKj^719-26&hE08v`LpLF(SUBa%CFZL+(DI6}mD z`cTo*m2RAkRi1R1BWdR|L9YPEE*x$)A&f0AO`V%49(@FcUJxDDdw)7c{Q1RV4PgdI zbe2m5oB15$UdL=`jS;Dfh7gemqr} zJMyk(H+knOYpyo~<%ez$xB~g%o~$0;+4-8@{ojkDEWPukrnvwm9gN=%08KG6xyS|T z0;zFZOohbi))M)T#_&?Y3h)&@xb)3GsV7F;nH1-S1Gls~P0`vvm^DScDI$bmPC9%8 z>RPFLKc@Ex37~lEf$V|z$5hAe_$mcaXpXUc0$+OLcFko)+`7l*&YUbApWKG9F2Zme zu*Y~|TFYG3?qH5GtU$()ni*#P0k)F#>;?r{E4MC85MW z4Y$s;e-UrRGE;%2%Ld0LJjM&P)6a=;K7avk^F43^KZc6RS|=vzL=YVmD8TBWL6oqW z2zz{w(=J~pX;AF;Si|NIbZY-7_a7_GhM znG4O?z6*rDH0v4$T!8m(aUBy(ZxBm!+SP?lHjh&5U1J!uL;y-KFa8k~Q2|quXjR8` zENhP;%np-OW^69?yS+-PWAbGnA$fe8GO5Ez|lSjsI4736siTk4Y}*z zyM@8n7EWx`LYLO&?#-u-3?ZN9+`1%^?N-#-UQ{Ta_SN=I_RVP$o71Rx7nBKUu;HmI z502(tW5I2lQBDMy^#>F$M%1R)MI0H}{fYv&((}Oy_e-6PH*#Yu}v`M8HfDjX=`l@-d0=G_29{q~$3(6C?wG z+Sl?w0cJmdHr67)wpM%Z_7ZG-)CHiV2fjoTRNDvGq}&tM2DJdOe`qdzs&ofmtLd;J z;^{N!c<-5S4kf#0>$%;OjAw-Nwv>G_&S3B(^Xx3lSxYa0AFV`Op<25YyRSMI7OXlf z=Zi)9@Hy=ngWmypH_9kp&6)kN5Jn=(3^e1+Rk_IyK^CjMYunRz@BPX78i-(i93bzT z$@-wTs48X9B~S(P`GUEiMW%Cmvac|@BUQE9IQH0O;({OltG(}xYN~6uMSZcL2q>ro zX@UqMq7*?O^p11{=_;ZSq)0aq!V3zDB2}t@p(D+gE>%TEP^k$>AVvhF#1JV-AR%zq zw!GhW&;7=^W1Rb)JMNFWf9OcecI>^@-fKP2eCC`_qi-I0e63~oD`gNX0EhZ=LgC~4 zz;%iJ+G-1^gEf5oSOe$>{gvIZ(6o!(k7+NDogb=pRXX@>;IWo` z$hft6rJI<(8iG3iFnCPi`h{L~)=Kn6N*!p$f#<9&@ETAYsUn=ZupIKQFB+H?ba5U8 zc>ejuic1~}Q)ZM;T#f)VBBwcSc+x*H>!j(RJ5$Z3yaF6{t2Wb-~`rRw?o(uOJR1oJUBb8lXwH>aCt~OA%qwJ z1kyW{9wo#OJqNz{H@bil=9ie>T?Q!<-cFwZ!QFZAeee-*t>wQ5SX4q(RP=O4$mB+` z#DCBh@c?xa(2YL@DCqX1&)fj(xj{UlM6sz3P}fi((6~&DP$dE$PRP=>VGE$j>4d@v zxHxd3P15qDeecRW?H1=~i=@=eW00V^(HPK1zM6_9J(F=ql>=Z4#7k~L^Mx$iqxnPc zPm?O#)0b=;F5?9Ot60Q0^l!L%{r0QXQ=%WcZb`bJaIO4xn#`5@>{sC0#njb5ZU3LVv^3RAuta2m6{oUgWcMAO z6hhM+%+3X3bEy}^f7(t4pdAqFc%^h9?I!)YlPOU$N79$tuj~*s>B9c?JH*hW?WAW$ zn9-!KTmkLlhRf~34z6zHRe*v+-lZ3!qd8>pqd5ll=ksyUdS8;~(pR*V&YLt2;U~XQ zXSOLlByAHcneJW<`x$(Zoxst6?d=g^c(&ZT+X?NJ0M|8*3*@W^TN(g3T$Yf+Mdg!# zGrG+#O-|0X>-$*A`wE`sJPGge8bJQ)gf?&Bo&EA*to}Byh)=B$`NBubh!OZ6prb&~k41l&n_x0c6Kc zZf_vu_q5y9XH-~+Mf_34tGuJ-JBa|2h?3!2VluFPECy$=7B^z2XEP1|6(HqZQ_Ex! zKeIPNS*<{a#Z147@N_u}wDOc2nuM7>T6I|Z%VtM>M=6Oz%| z8DTuXA5agq^^4El?DT0a%Nw%`;#Un$9kUxLh{yq?(r3-m<*0%D*HLYe>py6JiBY<| zAMgO=0_^RWcm5LvjwPl7GmvHdJtj8s49wgjo?o~Sv)#Ho*`Vd7Vj@=LCP2Vquk2jJ zdf3-VZX~`J2PI)c6(T>4+!&AoQ>kuQ`%&aoan;{)6klSRZI;QQ!c$bb>`8&vWMF_$ zb@~`kd);u)_pT!Y09US}BV>K?SPA~Zx%h?29m1{TDDQBTm1=Rq^=y(tjdED6%qrq0347h35x$c0H4u=Bm*OptGRR6Y@1jda{~>y^1QEKAqMQdcp0y3 zrRtD(np#kxp=-EhpE^meKwri=ZMTf{lk?i!OkP@6;_tq2ng=9{v~kIyLK|=6(XUeS zv9QaTnAy+c$(F36D?&CEp^vuquL`4SGYX zx=S%Bmcx78@!#WX`n#3-dAvD zhmUeDwkB=%Bd8xV0%HB6@e70M0Er4*hV9j#fl&WO;7qPD)tl{btNOtJSWG|(czd_b z=2YSR`Mk8ICZhf=nYErZW0x06o3 zWnxbV@?o!KV+WQvY>C^jp)k2C_c?{e`#4AP7kA?_c70f|Yz;N~u@3p21h1f((zd&D zsUFIL8hh@;j8tM)m*WLhkKeqLfh*@ab07PdG*E!{ciz7D+gwk8Ba&)+XkB+Brjz&Z-9`-T(Rj`5q9C8MjkAABODejH!hm80uLl3?@<>}x5wz9pveId zw5Bweo9pjrlxvqS_w=mTefjfq2Sns%o7>e`Ehf$4km|!+V}Z)a4d(3v>k=Vbj5goM zF>H-Hbx-t_$aV3bdtGBjM#jYj3(topNRsyL7U!$e*c)4P6PlWop&k-J-#(s}>=u+h zNU1rxs9O1=h%YL6d|JR1@yC|67ysC&k{*MsZ0fwPdi|TM;HvBYR7$q3zFBd;%;kh6 zv`s8MfU2M4Wsa4e={-Qs7$TEZi@W^pKnnRjp1abpsSi^9os*s!l#8&@xKz>kcB5|o8C;>$G>n7WvO%|g*c={n{g?@a-RCo0| zA4pbW=X9fixdI}OeT&b69)V183^0E0D`7v&-`q0C83D+vLWh<988@RBOE+9hM+_QV`${p$qALi?S!NgNZqihJ%*CkX_L)z|W;l4{q1A^TP8UK2$3Cd`llLSRcD>Re$nRa|bhH{!Z1`I2bGGSl zOQ<|_f<*v)@as%kWy94EalnLNZAq9w=Wzf5h+m^NQ!2{}O7nR`ja##d+> z6IK1cD4kR8psrJRybmHk$mD#=*k#p}{pU+{534x`g297RNqljUrZVL02YHspP5moV zad^UCZrRc!ok)07wF^t3@f)Oxmv<5~4qW&VYvp3|V^Gf8BV|d&ZwYlV?E^Z?%|QZ3 zaqjJ^dGmQoFl`cLr0n{5Q~LEc_oZw*A}Um4wW~saAQRDirbAr;p8H_po#JhM z5z--*G+6%ek#(_z@!+>-^4$v6imO2W=i_s>2w)zLbA#^JKV(gJGiSqq=LZIaLh@@L zH(W|8vU`ADelOrxg;1o&RdR;VToGZeLdRE-pmLG69;wlWs`Xa~gZgxhrfoa6v)%dY z*kJ_oCWibrl_XwCOTa6a!LRT>l#;yQZJy)UDZW>D!(!=1c*}{SxTDi5IU0498H4=S z9+B10%Myz@+hY0|UW5J)WO=l#_K*7rcj(w6hah>nR@yn*lYCkizjQd4^yc{Q?6-h2 zSWt}+ckX!(Eh12_7WWZ^iyxjAj&JtWbmHKEwb zv5zt(Gw-aVrJ*b6o>8T|5TW5A-5)UfLV?|#^p%7A&T#wyD{#mg)^ zn`|o?KutxRdccJ;=ja{qQ*F*`rXar4Kr6>*5sY>yDTB}n_ornJ)WRu>$q0sm<)RlD z(Jy`f9MMhJ8o^8hX;ljqIBkiyp@N)~9)VR-#0udkAtBLBE5aXu1sjm1>(63yt+Tru z^Ke&J$UODF*fZ8li$Sl=)f0hbQg&5?qU7^93<#_j4z+)ntzEl~0HLX4x~=1BF=KKC zt-6F{Xup}Dk^AUsm<3(iTh83unB_BzrygiD?Fl>P$=bfNq_QLov^yfUQ2XFYpXzJ* z&V4E3`$Lu?gLxk49)6b6dT;zM?B2Axh#iH&A3g!qMRe@jyFkgYxjyE**V0*`HK}0$ zzKiuCF%5u_CCE=JcvABj)~9}!1*^WdgbdLGzH3OKI}IKBmWPmLIaa5Re;o&__+Li4 zS~lSIe{i-qN;QVTzfwj#%;20tr+8YSBXbu^a1A3AMON|RG^4GUc#a{Mh4;+@nxbc{ zpU~%>L>PD6Wn6X&@bNH27%KR`+t3O@go{^6z*opa*Al}%mNine<*#^z!raA;WZFVK z3af-dk9+8Fsj)i0rE>Lj@-Z}>xYnpoUE}Lg>rSq`csgII8CSPeX0X6(q;s{OQU2GV zg=l*;iz8-{SrSZHhg(k$>Qn*eSRknl2cbhwW7Dq3pNYoS6Csa08Q>;<5hmHRfZ9kc# zLiO9UU7<+tX$n+lZM69Hs}ts6hW5Da^L!&QIMs>okXGQ z$CJjLiLQv5#7_(=h$taTlvdHkskGp+@`zsh5?vR3>q zypSlfEHLB>3|Ux*0~ueu0^q)>*J2|FJJIk%G_F*g=u1`wJC-qANS(PY!46cebaa4X ztqr;eRPb!)C{|}KTMIdIrLs<)?YWSDF{!^%d8qte2L-Rcxm`gcjK*B}^eB93Zo!)0 zQoL?i&w7^I*mE&Hw4-fn7Vq19itFay!E#3jX7RCPKv2-!D7m=3O|V$0WhEvZEg;kO z`SPYj#;0IwRil)WGg-a?9#&x=t+U^kz-itd^>BH_=BfxUk;YL(yB~GD&h)A~*7lrK z0WBO!ZuFB>*5Fk1@aIn+GV}-3cQKB<#gu5QKF(s z3I3CPl1mt&<5^iv|0Rej5g8=`M!Vwe0ueb^Pu6i&7%n7M{Y=`XXcMZieWxuE#o=0FzGj8j}Ob#VUMNcLS0t3{pWP$YMSB*9Sligds3mSeDG zwYD8S`LSJ|@nw=o^&E4qR^<~94_xNXb*Y)68M3+cs0 zy=Baz2kb1>{%0lTc^TopE6>L};3QR7?M?XVN<^7um!`+@;GplJ^V}9)nuvIBBVS^j zZVg!8H1)9?=QX2*VV0@+9~)!W3o(*#Np-^A5*3?%Cpk8pl8tgg&} zu?Li!=GpogJ5UpBn!4^4g2n2|gm@6JDygnXT@f&(ODH@xoEe0hthF31S&jT&@wT*W zLHMb(SA2{bkiK^~orQ+)QOf=fs#OD7$(wUE){!Y}*`l}|yoE?Up4vGfG&tJ!o3uKBc*KMzrVt8L+p5Fp`Sik9Zp6Ra3=0-D?7CN&? z)O_o4b6LZeCNkO=xK@A_{K~W^+=8}#=nlrSv<*9d5J~oQzrMImEf?DORCG=%muEA$ za1a%{JY0Ylv!20@Rj8Ajd#k@mAt%q&Q?yqA7k2Fq!nvjDLr9_|w;|W_>@#hzoawiA z$+q|pzz5orutpJIbwSEvrPYWJ?g@3PVJw*t>7|>@?rFB@ld2j6MEZ zT?7xlOC|M`ZpytBDlepOl-Sd z`X*D>T5#p!`S_+(ZR_`Ce-`bHt%C(TiH$M{XK7axh+>r{(t7nYuC@@Qa`k;Ve)u^% zkp!V7QgdA%ET_4#d1PZE++kfOoDlt9Ar&XGH@?*Nxe*XACX=3=lQeFuie<*74R7;B z3*$z=(08-U>U=;(b@FK!u^jMQNA(UmUjp(?T=Kp3I!~u% zZM5cw#c7pXng;O0`B|Y#+C^8=3SJ*xw(=S)7h*U+tRcSMbV*6=@C2!H#@ykzeZP!F zl$>-BgU8cXhHrC(w7l;ro7{Rw=*Ep3!=T|Q2{;V`_Lc3)PwpmPLL8z^r2ja&vuH;- z^1B)+1c^Q1?k&fLVo$+2oVvdWw6c%>=TN|BzLkc2q4&pE)gG}O%=qwsOaT)aS~=yc zb*!wd>;ku>Se#tJs;EDBcG;>$8u=b(>hfP36u7(-`T{^CP=!iPFViel$VuxMJ6T4b zeSBpe_bHxGip3k3L3o&OeTU|0lqpxdoVh{W$yAA4h&lvHt$*zy0&ReMMeV2veXh z$iLJWrTpm5!Qe~N>uXO!l2D{-fq-kIP$G%SN~#A?xXx=sK@|{ zQQkk;8PI%cE*Jrfe+Gy25oA=TO)m#`B;?*OFlK(ey}=ELDPa>O6|@^yj^U1~GGH&) z7I;_?EZ_t|3L45S=sB;t!o31qu|w3O$E;tfvP=Z>FCB&IK6CuA@*R@!mnS8(`~^C8h)sk7BaRB;?16i!Z;P9JlZX zr7Wc%fE{$Bk1r0~dki@FP-XX}45`SxZT;qCJc{5iUMDO2d(Gxtz&3>E7Tx z;~h%CjUx8j!7P`P^=^#iA_E=_*yh#5D>M6UB{|%B+Cc9zvp?pFCeI}BIT%##hMRi` z*5?eb1t17Z(;7lGD8xX|y#udXmgR$?#|kI}H?DH*t)To0Qmn}9 z`$(ab0>Z9~KD~it(Kf>NqcwCk;dj#@Y{0RFHdBaBw`-d8&_EM5K4uYXui5>B4LC6n zFzd&(v{HdeL%Z7mjlg|rc|EnSofYt{|Jqda4thXeTT7s4s#Dc968_{0f0)PSZHdiu zu0g{AH>l~WL72Xe)J$9SZPyaFwE$p^7qk$HL2;{uAo|Gi`|z@2D%F(zhg9l1AOKaX>j+4cp}b`V)x}vd-wAED26P*(0dm$BNZL98l(-i^R4C^B#)SN~@=HfJd9o zyCnG^bDXac3DqQlVi#Yik#=wt@)Quc4W#!q-atMNA#g?9)^%j|gHB(gY!{Ru`zwlF+FA<0r2LT#y5soh5q3f*KNOv#rh3y1wmm5>^+{!iF0FROo;QxX2j1E<;@^XN52ht^+ z{K&lc_|{gN_1YVP23^Z238a4emF^cCobYVBy!gK7m}?|{svVGu5gvN6azfOzXrHt8fym>G6+U(hOhWyHxiYmK48gqsJ3M}7Xq-+`CxTtlo zy&bP!x2c;qzpY<|umg9#%kCzE#ocqbz%BGic9knj4u7&vw)34aF{R3sd3)G=%dzBP z#qtLc!XV~nnT-m^d;_8^Hr=-dc4xe7KYZ=Wo5;Uvz5B~|Y(~GZwqhKwCWdX7Mrs^P zLn@YNnHXJjRnkw3Gq(RZpD>$c!5e@<#AuwIF^MQ6Y_yPU0i z>H;yGg6tZSJGEbMPwcErsWKS}f6b@VJe?Y3BUX8-^MFqd=$%eZj67^<@32J}@wBM$ zO&YNs6dtP75gx^<18XdLDRV!PD5pcUcpej_?-DxkB2d5r!)eHJY@SX-H^0fAcPY1J zO-1e#wBFp#JM9QuGeb0R7kYfkSlPen$RbXeWP|QK?7Fj~O)e*?EPiAfC3^2m%nW5- z=R4~Ul?N`R=Uv}dIis88h+LR!%k#CCr*5NfD%v1ee84-^-+wdeL1p{FO*K~*J8+%~ zVeRt-KiH~_HBa(46rgUt&jFsgOK-iaT*ccW_7J4q?{UG?tL#S>m}SQ4Cnp)vuSSAC zWbswWN7jdbTq_F%RcDb~5+7pqmx~Rw_<-+&;0e8w z{)@YX{ea0^!^O&HZ|=hsF<24mn6%s7ntZ@%9zfYfOUumV5YY+8`y>gD4%k(jW+gpN z;Epa9tH5Es#A&FvHm|yum5V|uYs@w4@q7aOlE1uWpQtJLE0+&4lzvAmn#yux3CS?d z^b}ikY}8R;k-&RGPh!P=_I3=>iH^6~_Vd1_ww2AM zISl9 zCF--7ug}QKkF&X|G*Q5c5&4m`Xz5KGL4s&2Fbo96A&pBHgBmAT_yGuy>^MpTDOC z*@ifRQDL0k+U7SuTi}TEu-Nt#XpW;4(Ipe{X(yd$^Y5Tkl!^Vj=A(&Npc@MXd(wOEvUaa$lH7c~^NBcH=Ns%mvhT z{v0udF%)9tTbYLL)!!^=gI*|J^v~Fw%yO7|;*0gzqn@`*udEj^_EN{$tp6z9usF^! zoFJdU!{V_^<6xIvojmTR6~EOyDK{dg*iQ~wY6ej-TB~7FnckAf_6N;M?R%w28OdA+ zEG2kwT3cW}TMKR+(pj67GU)=5nUi3UdOWpMjy>=SZCynlm_0-nt+-zu!`>P`AAi|7 z`YQ@(U)xH+t69!+lb&V_h)@LYV z5}W%_+WM|=lztxGV48ndW5 zBc?hZO7o2A#xM9cLNWB?a8IgEVPW$vn)|HkKuAhvdcY840oPc3QKZ9#h1h_h9-H)d z9bj);rJ(5xIl;K|jd(}|7ECs76dINOuNIa&4dU7L{PmOJ+wL5Y@2aRxbMA2*jZ?eu zi?k5g>hsU(M%4XT_KTbX1)6bwTb&Zaepxu$lO=X+yY3G;G5@dZXe+&o`dR+}s3phd z$puQv$JP+Gt?hz}%CA%Bbmw}3iv0E->#E5(+z;dW*rs@QS`0pdp`tODze}BjJmiO;z`tc<<&;S4Y zkI?}xsY$=oAeS#+j(Vn31YGSZck?X-XFjynb$Z NMtWwtRoWM${s$&m9vlDw diff --git a/dotnet/samples/KernelSyntaxExamples/Example54_AzureChatCompletionWithData.cs b/dotnet/samples/KernelSyntaxExamples/Example54_AzureChatCompletionWithData.cs index 5ee1b10dbc60..fcf0afea5496 100644 --- a/dotnet/samples/KernelSyntaxExamples/Example54_AzureChatCompletionWithData.cs +++ b/dotnet/samples/KernelSyntaxExamples/Example54_AzureChatCompletionWithData.cs @@ -24,9 +24,9 @@ namespace Examples; /// potentially reshape our understanding of climate change. /// /// 2. Set your secrets: -/// dotnet user-secrets set "AzureAISearch:Endpoint" "https://... .search.windows.net" -/// dotnet user-secrets set "AzureAISearch:ApiKey" "{Key from your Search service resource}" -/// dotnet user-secrets set "AzureAISearch:IndexName" "..." +/// dotnet user-secrets set "AzureAISearchExample:Endpoint" "https://... .search.windows.net" +/// dotnet user-secrets set "AzureAISearchExample:ApiKey" "{Key from your Search service resource}" +/// dotnet user-secrets set "AzureAISearchExample:IndexName" "..." /// public class Example54_AzureChatCompletionWithData(ITestOutputHelper output) : BaseTest(output) { diff --git a/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs b/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearchExample.cs similarity index 78% rename from dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs rename to dotnet/samples/KernelSyntaxExamples/Search/AzureAISearchExample.cs index cad5842e57b2..66d3105259a8 100644 --- a/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearch.cs +++ b/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearchExample.cs @@ -14,7 +14,7 @@ namespace Search; ///

/// This example shows how to create and use a . /// -public sealed class AzureAISearch(ITestOutputHelper output) : BaseTest(output) +public sealed class AzureAISearchExample(ITestOutputHelper output) : BaseTest(output) { /// /// Show how to create a and use it to perform a text search. @@ -50,8 +50,20 @@ await foreach (string result in summaryResults.Results) WriteLine("------------------------------------------------------------------------------------------------------------------"); } + // Search with TextSearchResult result type + settings = new() { Index = IndexName, Count = 2, Offset = 2, NameField = "title", SnippetField = "chunk", LinkField = "metadata_spo_item_weburi" }; + KernelSearchResults textResults = await searchService.SearchAsync(query, settings); + await foreach (TextSearchResult result in textResults.Results) + { + WriteLine($"Name: {result.Name}"); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + WriteLine(result.Value); + WriteLine(result.Link); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + } + // Search with a the default result type - KernelSearchResults fullResults = await searchService.SearchAsync(query, new() { Index = IndexName, Count = 2, Offset = 4 }); + KernelSearchResults fullResults = await searchService.SearchAsync(query, new() { Index = IndexName, Count = 2, Offset = 6 }); await foreach (SearchDocument result in fullResults.Results) { WriteLine($"Title: {result.GetString("title")}"); diff --git a/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs b/dotnet/samples/KernelSyntaxExamples/Search/BingSearchExample.cs similarity index 76% rename from dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs rename to dotnet/samples/KernelSyntaxExamples/Search/BingSearchExample.cs index 7b140f0f0323..c9afeb66f3ef 100644 --- a/dotnet/samples/KernelSyntaxExamples/Search/BingSearch.cs +++ b/dotnet/samples/KernelSyntaxExamples/Search/BingSearchExample.cs @@ -11,9 +11,9 @@ namespace Search; /// -/// This example shows how to create and use a . +/// This example shows how to create and use a . /// -public sealed class BingSearch(ITestOutputHelper output) : BaseTest(output) +public sealed class BingSearchExample(ITestOutputHelper output) : BaseTest(output) { /// /// Show how to create a and use it to perform a text search. @@ -23,7 +23,7 @@ public async Task RunAsync() { var query = "What is the Semantic Kernel?"; - // Create a search service with Azure AI search + // Create a search service with Bing search service var searchService = new BingTextSearchService( endpoint: TestConfiguration.Bing.Endpoint, apiKey: TestConfiguration.Bing.ApiKey); @@ -47,8 +47,19 @@ await foreach (string result in summaryResults.Results) WriteLine("------------------------------------------------------------------------------------------------------------------"); } + // Search with TextSearchResult result type + KernelSearchResults textResults = await searchService.SearchAsync(query, new() { Count = 2, Offset = 4 }); + await foreach (TextSearchResult result in textResults.Results) + { + WriteLine($"Name: {result.Name}"); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + WriteLine(result.Value); + WriteLine(result.Link); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + } + // Search with a the default result type - KernelSearchResults fullResults = await searchService.SearchAsync(query, new() { Count = 2, Offset = 4 }); + KernelSearchResults fullResults = await searchService.SearchAsync(query, new() { Count = 2, Offset = 6 }); await foreach (BingWebPage result in fullResults.Results) { WriteLine($"Name: {result.Name}"); diff --git a/dotnet/samples/KernelSyntaxExamples/Search/GoogleSearch.cs b/dotnet/samples/KernelSyntaxExamples/Search/GoogleSearch.cs deleted file mode 100644 index 8f5902dd5702..000000000000 --- a/dotnet/samples/KernelSyntaxExamples/Search/GoogleSearch.cs +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. -using System.Threading.Tasks; -using Examples; -using Microsoft.SemanticKernel.Plugins.Web.Google; -using Microsoft.SemanticKernel.Search; -using Xunit; -using Xunit.Abstractions; - -namespace Search; - -/// -/// This example shows how to create and use a . -/// -public sealed class GoogleSearch(ITestOutputHelper output) : BaseTest(output) -{ - /// - /// Show how to create a and use it to perform a text search. - /// - [Fact] - public async Task RunAsync() - { - var query = "What is the Semantic Kernel?"; - - // Create a search service with Azure AI search - var searchService = new GoogleTextSearchService( - searchEngineId: TestConfiguration.Google.SearchEngineId, - apiKey: TestConfiguration.Google.ApiKey); - } -} diff --git a/dotnet/samples/KernelSyntaxExamples/Search/GoogleSearchExample.cs b/dotnet/samples/KernelSyntaxExamples/Search/GoogleSearchExample.cs new file mode 100644 index 000000000000..20c189a2d170 --- /dev/null +++ b/dotnet/samples/KernelSyntaxExamples/Search/GoogleSearchExample.cs @@ -0,0 +1,62 @@ +// Copyright (c) Microsoft. All rights reserved. +using System.Threading.Tasks; +using Examples; +using Google.Apis.CustomSearchAPI.v1.Data; +using Microsoft.SemanticKernel.Plugins.Web.Google; +using Microsoft.SemanticKernel.Search; +using Xunit; +using Xunit.Abstractions; + +namespace Search; + +/// +/// This example shows how to create and use a . +/// +public sealed class GoogleSearchExample(ITestOutputHelper output) : BaseTest(output) +{ + /// + /// Show how to create a and use it to perform a text search. + /// + [Fact] + public async Task RunAsync() + { + var query = "What is the Semantic Kernel?"; + + // Create a search service with Azure AI search + var searchService = new GoogleTextSearchService( + searchEngineId: TestConfiguration.Google.SearchEngineId, + apiKey: TestConfiguration.Google.ApiKey); + + // Search for just the summaries + KernelSearchResults summaryResults = await searchService.SearchAsync(query, new() { Count = 2, Offset = 2 }); + await foreach (string result in summaryResults.Results) + { + WriteLine(result); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + } + + // Search with TextSearchResult result type + KernelSearchResults textResults = await searchService.SearchAsync(query, new() { Count = 2, Offset = 4 }); + await foreach (TextSearchResult result in textResults.Results) + { + WriteLine($"Name: {result.Name}"); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + WriteLine(result.Value); + WriteLine(result.Link); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + } + + // Search with a the default result type + KernelSearchResults fullResults = await searchService.SearchAsync(query, new() { Count = 2, Offset = 6 }); + await foreach (Result result in fullResults.Results) + { + WriteLine($"Title: {result.Title}"); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + WriteLine(result.Snippet); + WriteLine(result.Link); + WriteLine(result.DisplayLink); + WriteLine(result.Kind); + WriteLine("------------------------------------------------------------------------------------------------------------------"); + } + } +} diff --git a/dotnet/samples/KernelSyntaxExamples/Search/TextSearchPluginExample.cs b/dotnet/samples/KernelSyntaxExamples/Search/TextSearchPluginExample.cs new file mode 100644 index 000000000000..5a1ef8e9a4bc --- /dev/null +++ b/dotnet/samples/KernelSyntaxExamples/Search/TextSearchPluginExample.cs @@ -0,0 +1,44 @@ +// Copyright (c) Microsoft. All rights reserved. +using System.Threading.Tasks; +using Examples; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.SemanticKernel; +using Microsoft.SemanticKernel.Plugins.Web; +using Microsoft.SemanticKernel.Plugins.Web.Bing; +using Microsoft.SemanticKernel.Search; +using Xunit; +using Xunit.Abstractions; + +namespace Search; + +/// +/// This example shows how to create and use a . +/// +public sealed class TextSearchPluginExample(ITestOutputHelper output) : BaseTest(output) +{ + /// + /// Show how to create a and use it to perform a text search. + /// + [Fact] + public async Task RunAsync() + { + // Create a search service with Bing search service + var searchService = new BingTextSearchService( + endpoint: TestConfiguration.Bing.Endpoint, + apiKey: TestConfiguration.Bing.ApiKey); + + // Build a kernel with Bing search service and add a text search plugin + var builder = Kernel.CreateBuilder(); + builder.Services.AddSingleton(searchService); + Kernel kernel = builder.Build(); + + var searchPlugin = new TextSearchPlugin(searchService); + kernel.ImportPluginFromObject(searchPlugin, "TextSearch"); + + var question = "What is the Semantic Kernel?"; + var function = kernel.Plugins["TextSearch"]["Search"]; + var result = await kernel.InvokeAsync(function, new() { ["query"] = question }); + + WriteLine(result); + } +} diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAIKernelSearchResult.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAIKernelSearchResult.cs deleted file mode 100644 index 613b7218c1a9..000000000000 --- a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAIKernelSearchResult.cs +++ /dev/null @@ -1,31 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -using System.Collections.Generic; -using Azure.Search.Documents.Models; -using Microsoft.SemanticKernel.Search; - -namespace Microsoft.SemanticKernel.Connectors.AzureAISearch; - -/// -/// AzureAISearch implementation of . -/// -/// -public class AzureAIKernelSearchResult : KernelSearchResult -{ - /// - /// Initializes a new instance of the class. - /// - /// The search result. - public AzureAIKernelSearchResult(SearchResult searchResult) : base(searchResult.Document, searchResult, GetResultsMetadata(searchResult)) - { - } - - static private Dictionary? GetResultsMetadata(SearchResult searchResult) - { - return new Dictionary() - { - { "Score", searchResult.Score }, - { "Highlights", searchResult.Highlights }, - }; - } -} diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs index bfc2eedc6e1a..e336d24be145 100644 --- a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs +++ b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs @@ -15,12 +15,24 @@ namespace Microsoft.SemanticKernel.Connectors.AzureAISearch; /// public class AzureAISearchExecutionSettings : SearchExecutionSettings { + /// + /// Name of the field that contains the name to return. + /// + [JsonPropertyName("name_field")] + public string? NameField { get; set; } + /// /// Name of the field that contains the snippet of text to return. /// [JsonPropertyName("snippet_field")] public string? SnippetField { get; set; } + /// + /// Name of the field that contains the link to return. + /// + [JsonPropertyName("link_field")] + public string? LinkField { get; set; } + /// /// Parameters for filtering, sorting, faceting, paging, and other search query behaviors. /// diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs index 341cf18f7dad..94e7efce8de3 100644 --- a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs +++ b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs @@ -78,6 +78,12 @@ public AzureAITextSearchService(SearchIndexClient searchIndexClient) SearchResults? searchResults = response.Value; return new KernelSearchResults(searchResults, this.GetResultsAsync(searchResults, azureSearchSettings.SnippetField, cancellationToken), searchResults?.TotalCount, GetResultsMetadata(searchResults)); } + if (typeof(T) == typeof(TextSearchResult)) + { + var response = await searchClient.SearchAsync(query, azureSearchSettings.SearchOptions, cancellationToken).ConfigureAwait(true); + SearchResults? searchResults = response.Value; + return new KernelSearchResults(searchResults, this.GetResultsAsync(searchResults, azureSearchSettings.NameField, azureSearchSettings.SnippetField, azureSearchSettings.LinkField, cancellationToken), searchResults?.TotalCount, GetResultsMetadata(searchResults)); + } else { SearchResults? searchResults = await searchClient.SearchAsync(query, azureSearchSettings.SearchOptions, cancellationToken).ConfigureAwait(true); @@ -135,6 +141,25 @@ await foreach (SearchResult searchResult in searchResults.GetRes } } + private async IAsyncEnumerable GetResultsAsync(SearchResults? searchResults, string? nameField, string? snippetField, string? linkField, [EnumeratorCancellation] CancellationToken cancellationToken) where T : class + { + Verify.NotNull(snippetField); + + if (searchResults is null) + { + yield break; + } + + await foreach (SearchResult searchResult in searchResults.GetResultsAsync().ConfigureAwait(false)) + { + var name = searchResult.Document.GetString(nameField!); + var snippet = searchResult.Document.GetString(snippetField!); + var link = searchResult.Document.GetString(linkField!); + + yield return (T)(object)new TextSearchResult(name, snippet, link, searchResult.Document); + } + } + /// /// Return the results metadata. /// diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/BingKernelSearchResult.cs b/dotnet/src/Plugins/Plugins.Web/Bing/BingKernelSearchResult.cs deleted file mode 100644 index 51f725ca6ce0..000000000000 --- a/dotnet/src/Plugins/Plugins.Web/Bing/BingKernelSearchResult.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -using System.Collections.Generic; -using Microsoft.SemanticKernel.Search; - -namespace Microsoft.SemanticKernel.Plugins.Web.Bing; - -/// -/// Bing implementation of . -/// -/// -/// -/// Initializes a new instance of the class. -/// -internal class BingKernelSearchResult(BingWebPages webPages, T webPage) : KernelSearchResult(webPage, webPages, GetResultsMetadata(webPages)) -{ - static private Dictionary? GetResultsMetadata(BingWebPages webPages) - { - return new Dictionary() - { - { "TotalEstimatedMatches", webPages.TotalEstimatedMatches }, - { "SomeResultsRemoved", webPages.SomeResultsRemoved }, - }; - } -} diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/BingSearchResponse.cs b/dotnet/src/Plugins/Plugins.Web/Bing/BingSearchResponse.cs index 98e92543d225..4fa07727770b 100644 --- a/dotnet/src/Plugins/Plugins.Web/Bing/BingSearchResponse.cs +++ b/dotnet/src/Plugins/Plugins.Web/Bing/BingSearchResponse.cs @@ -9,7 +9,7 @@ namespace Microsoft.SemanticKernel.Plugins.Web.Bing; /// /// Bing search response. /// -internal class BingSearchResponse +internal sealed class BingSearchResponse { /// /// Type hint, which is set to SearchResponse. @@ -33,7 +33,7 @@ internal class BingSearchResponse /// /// The query string that Bing used for the request. /// -internal class BingQueryContext +internal sealed class BingQueryContext { /// /// The query string as specified in the request. diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs b/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs index b181754c690a..1712145ea528 100644 --- a/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs +++ b/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs @@ -82,6 +82,25 @@ public BingTextSearchService(string endpoint, string apiKey, HttpClient? httpCli }; } } + else if (typeof(T) == typeof(TextSearchResult)) + { + var webPages = JsonSerializer.Deserialize>(json); + if (webPages is not null && webPages.WebPages is not null) + { + searchResponse = new BingSearchResponse() + { + Type = webPages.Type, + QueryContext = webPages.QueryContext, + WebPages = new BingWebPages() + { + Id = webPages.WebPages.Id, + SomeResultsRemoved = webPages.WebPages.SomeResultsRemoved, + TotalEstimatedMatches = webPages.WebPages.TotalEstimatedMatches, + Value = webPages?.WebPages?.Value.Select(x => new TextSearchResult(x.Name, x.Snippet, x.Url, x)).ToList() as List + }, + }; + } + } else { searchResponse = JsonSerializer.Deserialize>(json); diff --git a/dotnet/src/Plugins/Plugins.Web/Google/GoogleKernelSearchResult.cs b/dotnet/src/Plugins/Plugins.Web/Google/GoogleKernelSearchResult.cs deleted file mode 100644 index 6e80280b16f3..000000000000 --- a/dotnet/src/Plugins/Plugins.Web/Google/GoogleKernelSearchResult.cs +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -using System.Collections.Generic; -using Microsoft.SemanticKernel.Search; - -namespace Microsoft.SemanticKernel.Plugins.Web.Google; - -/// -/// Google implementation of . -/// -/// -/// -/// Initializes a new instance of the class. -/// -public class GoogleKernelSearchResult(T item, global::Google.Apis.CustomSearchAPI.v1.Data.Search searchResponse) : KernelSearchResult(item, searchResponse, GetResultsMetadata(searchResponse)) -{ - static private Dictionary? GetResultsMetadata(global::Google.Apis.CustomSearchAPI.v1.Data.Search searchResponse) - { - return new Dictionary() - { - { "ETag", searchResponse.ETag }, - }; - } -} diff --git a/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs b/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs index 4fd8211dd52f..dd60e2628746 100644 --- a/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs +++ b/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs @@ -130,6 +130,14 @@ private async IAsyncEnumerable GetResultsAsync(global::Google.Apis.CustomS { yield return itemT; } + else if (typeof(T) == typeof(string)) + { + yield return (T)(object)item.Snippet; + } + else if (typeof(T) == typeof(TextSearchResult)) + { + yield return (T)(object)new TextSearchResult(item.Title, item.Snippet, item.Link, item); + } else { throw new NotSupportedException($"Type {typeof(T)} is not supported."); diff --git a/dotnet/src/Plugins/Plugins.Web/TextSearchPlugin.cs b/dotnet/src/Plugins/Plugins.Web/TextSearchPlugin.cs new file mode 100644 index 000000000000..6576545c9118 --- /dev/null +++ b/dotnet/src/Plugins/Plugins.Web/TextSearchPlugin.cs @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System.ComponentModel; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.SemanticKernel.Search; + +namespace Microsoft.SemanticKernel.Plugins.Web; + +/// +/// Text search plugin +/// +/// +/// Initializes a new instance of the class. +/// +/// The text search service instance to use. +public sealed class TextSearchPlugin(ITextSearchService service) +{ + private readonly ITextSearchService _service = service; + + /// + /// Performs a text search using the provided query, count, and offset. + /// + /// The text to search for. + /// The number of results to return. Default is 1. + /// The number of results to skip. Default is 0. + /// A cancellation token to observe while waiting for the task to complete. + /// A task that represents the asynchronous operation. The value of the TResult parameter contains the search results as a string. + [KernelFunction, Description("Perform a web search.")] + public async Task SearchAsync( + [Description("Search query")] string query, + [Description("Number of results")] int count = 1, + [Description("Number of results to skip")] int offset = 0, + CancellationToken cancellationToken = default) + { + var results = await this._service.SearchAsync(query, new() { Count = count, Offset = offset }, cancellationToken).ConfigureAwait(false); + var resultList = await results.Results.ToListAsync(cancellationToken).ConfigureAwait(false); + if (resultList.Count == 0) + { + return string.Empty; + } + + return string.Join("\n", resultList); // TODO: Use a better way to format the results + } +} diff --git a/dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResult.cs b/dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResult.cs deleted file mode 100644 index 4abcf7b453e1..000000000000 --- a/dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResult.cs +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. - -using System.Collections.Generic; -using System.Text.Json.Serialization; - -namespace Microsoft.SemanticKernel.Search; - -/// -/// Represents a search result retrieved from a instance. -/// -public class KernelSearchResult -{ - /// - /// The inner content representation. Use this to bypass the current abstraction. - /// - /// - /// The usage of this property is considered "unsafe". Use it only if strictly necessary. - /// - [JsonIgnore] - public object? InnerContent { get; } - - /// - /// The metadata associated with the content. - /// - public IReadOnlyDictionary? Metadata { get; } - - /// - /// The search result value. - /// - public T Value { get; } - - /// - /// Initializes a new instance of the class. - /// - /// The search result value - /// The inner content representation - /// Metadata associated with the search results - public KernelSearchResult(T value, object? innerContent, IReadOnlyDictionary? metadata = null) - { - this.Value = value; - this.InnerContent = innerContent; - this.Metadata = metadata; - } -} diff --git a/dotnet/src/SemanticKernel.Abstractions/Search/TextSearchResult.cs b/dotnet/src/SemanticKernel.Abstractions/Search/TextSearchResult.cs new file mode 100644 index 000000000000..1a0967e63f51 --- /dev/null +++ b/dotnet/src/SemanticKernel.Abstractions/Search/TextSearchResult.cs @@ -0,0 +1,38 @@ +// Copyright (c) Microsoft. All rights reserved. + +using System.Text.Json.Serialization; + +namespace Microsoft.SemanticKernel.Search; + +/// +/// Represents a search result retrieved from a instance. +/// +/// +/// Initializes a new instance of the class. +/// +public class TextSearchResult(string? name, string? value, string? link, object? innerContent) +{ + /// + /// The text search result name. + /// + public string? Name { get; init; } = name; + + /// + /// The link reference associated with the text search result. + /// + public string? Link { get; init; } = link; + + /// + /// The text search result value. + /// + public string? Value { get; init; } = value; + + /// + /// The inner content representation. Use this to bypass the current abstraction. + /// + /// + /// The usage of this property is considered "unsafe". Use it only if strictly necessary. + /// + [JsonIgnore] + public object? InnerContent { get; init; } = innerContent; +} From 138a6cdd7a04a36f75aa0f9f3177067009d868aa Mon Sep 17 00:00:00 2001 From: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> Date: Wed, 1 May 2024 08:41:12 +0100 Subject: [PATCH 10/18] Update ADR --- docs/decisions/00NN-text-search-service.md | 68 +++++++------------ .../Search/TextSearchPluginExample.cs | 8 +-- 2 files changed, 27 insertions(+), 49 deletions(-) diff --git a/docs/decisions/00NN-text-search-service.md b/docs/decisions/00NN-text-search-service.md index 49653836ce5a..56390a1d2c57 100644 --- a/docs/decisions/00NN-text-search-service.md +++ b/docs/decisions/00NN-text-search-service.md @@ -21,8 +21,6 @@ You may want to articulate the problem in form of a question and add links to co - Application developers should be able to easily add a search plugin using a search connector with minimal lines of code (ideally one). - Application developers must be able to provide connector specific settings. - Application developers must be able to set required information e.g. `IndexName` for search providers. -- Application developers must to be able to override the semantic descriptions of the search function(s) per instance registered via settings / inputs. -- Application developers must be able to optionally define the execution settings of an embedding service with a default being provided by the Kernel. - Application developers must be able to support custom schemas for search connectors. No fields should be required. - Search service developers must be able to easily create a new search service that returns type `T`. - Search service developers must be able to easily create a new search connector return type that inherits from `SearchResultContent`. @@ -30,6 +28,9 @@ You may want to articulate the problem in form of a question and add links to co - Application developers must be ab able to import a vector DB search connection using an ML index file. - The design must be flexible to support future requirements and different search modalities. +- Application developers must to be able to override the semantic descriptions of the search function(s) per instance registered via settings / inputs. +- Application developers must be able to optionally define the execution settings of an embedding service with a default being provided by the Kernel. + ### Future Requirements - An AI can perform search with filters using a search plugin to get back “results” of type T. This will require a Connector Dev to implement a search interface that accepts a Filter object. @@ -70,7 +71,7 @@ The current design doesn't support break glass scenario's or using custom types ## Considered Options -- Option 1 +- Define `ITextSearchService` abstraction specifically for text search - {title of option 2} - {title of option 3} - … @@ -98,64 +99,45 @@ Chosen option: "{title of option 1}", because ## Pros and Cons of the Options -### Option 1 +### Define `ITextSearchService` Abstraction + +A new `ITextSearchService` abstraction is used to define the contract to perform a text based search. +`ITextSearchService` uses generics are each implementation is required to support returning search values as: + +- `string` values, this will typically be the snippet or chunk associated with the search result. +- instances of `TextSearchResult`, this is a normalized result that has name, value and link properties. +- instances of the implementation specific result types e.g. Azure AI Search uses `SearchDocument` to represent search results. +- optionally instances of a specific type, although there may be limitations to this approach or or it may not be supported at all. -The class diagram below shows the first option. -Current Memory Design +The class diagram below shows the class hierarchy. +Current Memory Design -- `IISearchService` is the base interface for all search services and just stores attributes for the service - `ITextSearchService` is the interface for text based search services. This cna be invoked with a text query to return a collection of search results. - `SearchExecutionSettings` provides execution settings for a search service. Some common settings e.g. `IndexName`, `Count`, `Offset` are defined. - `KernelSearchResults` represents the search results returned from a `ISearchService` service. This provides access to the individual search results, underlying search result, metadata, ... This supports generics but an implementation can restrict the supported types. All implementations must support `string`, `TextSearchResult` and whatever native types the connector implementation supports. Some implementations will also support custom types. +- `TextSearchResult` represents a normalized text search result. All implementations must be able to return results using this type. - An AI must be able to perform searches with a search plugin and get back “results” of type `T`. - - 1 - - 2 - - 3 - Application developers should be able to easily add a search plugin using a search connector with minimal lines of code (ideally one). - - 1 - - 2 - - 3 - Application developers must be able to provide connector specific settings. - - 1 - - 2 - - 3 - Application developers must be able to set required information e.g. `IndexName` for search providers. - - 1 - - 2 - - 3 - Application developers must to be able to override the semantic descriptions of the search function(s) per instance registered via settings / inputs. - - 1 - - 2 - - 3 - Application developers must be able to optionally define the execution settings of an embedding service with a default being provided by the Kernel. - - 1 - - 2 - - 3 - Application developers must be able to support custom schemas for search connectors. No fields should be required. - - 1 - - 2 - - 3 - Search service developers must be able to easily create a new search service that returns type `T`. - - 1 - - 2 - - 3 - Search service developers must be able to easily create a new search connector return type that inherits from `SearchResultContent`. - - 1 - - 2 - - 3 - Search service developers must be able to define the attributes of the search method (e.g., name, description, input names, input descriptions, return description). - - 1 - - 2 - - 3 - Application developers must be ab able to import a vector DB search connection using an ML index file. - - 1 - - 2 - - 3 - The design must be flexible to support future requirements and different search modalities. - - 1 - - 2 - - 3 + +#### Perform Search using Plugin + + +#### Return Results of Type `T` + + +#### Support ML Index File Format + Evaluation diff --git a/dotnet/samples/KernelSyntaxExamples/Search/TextSearchPluginExample.cs b/dotnet/samples/KernelSyntaxExamples/Search/TextSearchPluginExample.cs index 5a1ef8e9a4bc..aae907d3a71e 100644 --- a/dotnet/samples/KernelSyntaxExamples/Search/TextSearchPluginExample.cs +++ b/dotnet/samples/KernelSyntaxExamples/Search/TextSearchPluginExample.cs @@ -1,11 +1,9 @@ // Copyright (c) Microsoft. All rights reserved. using System.Threading.Tasks; using Examples; -using Microsoft.Extensions.DependencyInjection; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Plugins.Web; using Microsoft.SemanticKernel.Plugins.Web.Bing; -using Microsoft.SemanticKernel.Search; using Xunit; using Xunit.Abstractions; @@ -28,13 +26,11 @@ public async Task RunAsync() apiKey: TestConfiguration.Bing.ApiKey); // Build a kernel with Bing search service and add a text search plugin - var builder = Kernel.CreateBuilder(); - builder.Services.AddSingleton(searchService); - Kernel kernel = builder.Build(); - + Kernel kernel = new(); var searchPlugin = new TextSearchPlugin(searchService); kernel.ImportPluginFromObject(searchPlugin, "TextSearch"); + // Invoke the plugin to perform a text search var question = "What is the Semantic Kernel?"; var function = kernel.Plugins["TextSearch"]["Search"]; var result = await kernel.InvokeAsync(function, new() { ["query"] = question }); From 837284f23fe02336678a5b02e436d7b93b8624be Mon Sep 17 00:00:00 2001 From: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> Date: Wed, 1 May 2024 17:51:29 +0100 Subject: [PATCH 11/18] Updates to ADR --- docs/decisions/00NN-text-search-service.md | 110 +++++++++++++----- .../Search/AzureAISearchExample.cs | 4 +- .../AzureAISearchExecutionSettings.cs | 4 +- .../AzureAITextSearchService.cs | 4 +- 4 files changed, 86 insertions(+), 36 deletions(-) diff --git a/docs/decisions/00NN-text-search-service.md b/docs/decisions/00NN-text-search-service.md index 56390a1d2c57..9611fb751168 100644 --- a/docs/decisions/00NN-text-search-service.md +++ b/docs/decisions/00NN-text-search-service.md @@ -51,13 +51,13 @@ In each case a plugin implementation is provided which allows the search to be i The diagram below shows the layers in the current design of the Memory Store search functionality. -Current Memory Design +Current Memory Design #### Web Search Engine Integration The diagram below shows the layers in the current design of the Web Search Engine integration. -Current Web Search Design +Current Web Search Design The Semantic Kernel currently includes experimental support for a `WebSearchEnginePlugin` which can be configured via a `IWebSearchEngineConnector` to integrate with a Web Search Services such as Bing or Google. The search results can be returned as a collection of string values or a collection of `WebPage` instances. @@ -83,20 +83,6 @@ Chosen option: "{title of option 1}", because -### Consequences - -- Good, because {positive consequence, e.g., improvement of one or more desired qualities, …} -- Bad, because {negative consequence, e.g., compromising one or more desired qualities, …} -- … - - - -## Validation - -{describe how the implementation of/compliance with the ADR is validated. E.g., by a review or an ArchUnit test} - - - ## Pros and Cons of the Options ### Define `ITextSearchService` Abstraction @@ -110,30 +96,94 @@ A new `ITextSearchService` abstraction is used to define the contract to perform - optionally instances of a specific type, although there may be limitations to this approach or or it may not be supported at all. The class diagram below shows the class hierarchy. -Current Memory Design + +ITextSearchService Abstraction + +The abstraction contains the following interfaces and classes: - `ITextSearchService` is the interface for text based search services. This cna be invoked with a text query to return a collection of search results. - `SearchExecutionSettings` provides execution settings for a search service. Some common settings e.g. `IndexName`, `Count`, `Offset` are defined. - `KernelSearchResults` represents the search results returned from a `ISearchService` service. This provides access to the individual search results, underlying search result, metadata, ... This supports generics but an implementation can restrict the supported types. All implementations must support `string`, `TextSearchResult` and whatever native types the connector implementation supports. Some implementations will also support custom types. - `TextSearchResult` represents a normalized text search result. All implementations must be able to return results using this type. -- An AI must be able to perform searches with a search plugin and get back “results” of type `T`. -- Application developers should be able to easily add a search plugin using a search connector with minimal lines of code (ideally one). -- Application developers must be able to provide connector specific settings. -- Application developers must be able to set required information e.g. `IndexName` for search providers. -- Application developers must to be able to override the semantic descriptions of the search function(s) per instance registered via settings / inputs. -- Application developers must be able to optionally define the execution settings of an embedding service with a default being provided by the Kernel. -- Application developers must be able to support custom schemas for search connectors. No fields should be required. -- Search service developers must be able to easily create a new search service that returns type `T`. -- Search service developers must be able to easily create a new search connector return type that inherits from `SearchResultContent`. -- Search service developers must be able to define the attributes of the search method (e.g., name, description, input names, input descriptions, return description). -- Application developers must be ab able to import a vector DB search connection using an ML index file. -- The design must be flexible to support future requirements and different search modalities. +#### Return Results of Type `T` + + +```csharp +var searchService = new AzureAITextSearchService( + endpoint: TestConfiguration.AzureAISearch.Endpoint, + adminKey: TestConfiguration.AzureAISearch.ApiKey); + +AzureAISearchExecutionSettings settings = new() { Index = IndexName, Count = 2, Offset = 2, ValueField = "chunk" }; +KernelSearchResults summaryResults = await searchService.SearchAsync("What is the Semantic Kernel?", settings); +await foreach (string result in summaryResults.Results) +{ + Console.WriteLine(result); +} +``` + +```csharp +var searchService = new BingTextSearchService( + endpoint: TestConfiguration.Bing.Endpoint, + apiKey: TestConfiguration.Bing.ApiKey); + +KernelSearchResults summaryResults = await searchService.SearchAsync("What is the Semantic Kernel?", new() { Count = 2, Offset = 2 }); +await foreach (string result in summaryResults.Results) +{ + Console.WriteLine(result); +} +``` + +```csharp +AzureAISearchExecutionSettings settings = new() { Index = IndexName, Count = 2, Offset = 2, NameField = "title", ValueField = "chunk", LinkField = "metadata_spo_item_weburi" }; +KernelSearchResults textResults = await searchService.SearchAsync("What is the Semantic Kernel?", settings); +await foreach (TextSearchResult result in textResults.Results) +{ + Console.WriteLine(result.Name); + Console.WriteLine(result.Value); + Console.WriteLine(result.Link); +} +``` + +```csharp +var searchService = new BingTextSearchService( + endpoint: TestConfiguration.Bing.Endpoint, + apiKey: TestConfiguration.Bing.ApiKey); + +KernelSearchResults searchResults = await searchService.SearchAsync("What is the Semantic Kernel?", new() { Count = 2 }); +await foreach (CustomSearchResult result in searchResults.Results) +{ + Console.WriteLine(result.Name); + Console.WriteLine(result.Snippet); + Console.WriteLine(result.Url); +} +``` + +```csharp +KernelSearchResults fullResults = await searchService.SearchAsync("What is the Semantic Kernel?", new() { Index = IndexName, Count = 2, Offset = 6 }); +await foreach (SearchDocument result in fullResults.Results) +{ + Console.WriteLine(result.GetString("title")); + Console.WriteLine(result.GetString("chunk_id")); + Console.WriteLine(result.GetString("chunk")); +} +``` + #### Perform Search using Plugin +```csharp +var searchService = new BingTextSearchService( + endpoint: TestConfiguration.Bing.Endpoint, + apiKey: TestConfiguration.Bing.ApiKey); -#### Return Results of Type `T` +Kernel kernel = new(); +var searchPlugin = new TextSearchPlugin(searchService); +kernel.ImportPluginFromObject(searchPlugin, "TextSearch"); + +var function = kernel.Plugins["TextSearch"]["Search"]; +var result = await kernel.InvokeAsync(function, new() { ["query"] = "What is the Semantic Kernel?" }); +``` #### Support ML Index File Format diff --git a/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearchExample.cs b/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearchExample.cs index 66d3105259a8..30e930977109 100644 --- a/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearchExample.cs +++ b/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearchExample.cs @@ -42,7 +42,7 @@ await foreach (CustomSearchResult result in searchResults.Results) } // Search for just the summaries - AzureAISearchExecutionSettings settings = new() { Index = IndexName, Count = 2, Offset = 2, SnippetField = "chunk" }; + AzureAISearchExecutionSettings settings = new() { Index = IndexName, Count = 2, Offset = 2, ValueField = "chunk" }; KernelSearchResults summaryResults = await searchService.SearchAsync(query, settings); await foreach (string result in summaryResults.Results) { @@ -51,7 +51,7 @@ await foreach (string result in summaryResults.Results) } // Search with TextSearchResult result type - settings = new() { Index = IndexName, Count = 2, Offset = 2, NameField = "title", SnippetField = "chunk", LinkField = "metadata_spo_item_weburi" }; + settings = new() { Index = IndexName, Count = 2, Offset = 2, NameField = "title", ValueField = "chunk", LinkField = "metadata_spo_item_weburi" }; KernelSearchResults textResults = await searchService.SearchAsync(query, settings); await foreach (TextSearchResult result in textResults.Results) { diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs index e336d24be145..e22c414d10fd 100644 --- a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs +++ b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs @@ -24,8 +24,8 @@ public class AzureAISearchExecutionSettings : SearchExecutionSettings /// /// Name of the field that contains the snippet of text to return. /// - [JsonPropertyName("snippet_field")] - public string? SnippetField { get; set; } + [JsonPropertyName("value_field")] + public string? ValueField { get; set; } /// /// Name of the field that contains the link to return. diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs index 94e7efce8de3..0e9eba2173bd 100644 --- a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs +++ b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs @@ -76,13 +76,13 @@ public AzureAITextSearchService(SearchIndexClient searchIndexClient) { var response = await searchClient.SearchAsync(query, azureSearchSettings.SearchOptions, cancellationToken).ConfigureAwait(true); SearchResults? searchResults = response.Value; - return new KernelSearchResults(searchResults, this.GetResultsAsync(searchResults, azureSearchSettings.SnippetField, cancellationToken), searchResults?.TotalCount, GetResultsMetadata(searchResults)); + return new KernelSearchResults(searchResults, this.GetResultsAsync(searchResults, azureSearchSettings.ValueField, cancellationToken), searchResults?.TotalCount, GetResultsMetadata(searchResults)); } if (typeof(T) == typeof(TextSearchResult)) { var response = await searchClient.SearchAsync(query, azureSearchSettings.SearchOptions, cancellationToken).ConfigureAwait(true); SearchResults? searchResults = response.Value; - return new KernelSearchResults(searchResults, this.GetResultsAsync(searchResults, azureSearchSettings.NameField, azureSearchSettings.SnippetField, azureSearchSettings.LinkField, cancellationToken), searchResults?.TotalCount, GetResultsMetadata(searchResults)); + return new KernelSearchResults(searchResults, this.GetResultsAsync(searchResults, azureSearchSettings.NameField, azureSearchSettings.ValueField, azureSearchSettings.LinkField, cancellationToken), searchResults?.TotalCount, GetResultsMetadata(searchResults)); } else { From 6c38fae03369b76be53bb85860496118b0cd1600 Mon Sep 17 00:00:00 2001 From: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> Date: Thu, 2 May 2024 12:13:08 +0100 Subject: [PATCH 12/18] ADR updates and also update the plugin sample --- docs/decisions/00NN-text-search-service.md | 133 ++++++++++++++++-- .../Search/TextSearchPluginExample.cs | 20 ++- .../Plugins/Plugins.Web/TextSearchPlugin.cs | 24 +++- 3 files changed, 157 insertions(+), 20 deletions(-) diff --git a/docs/decisions/00NN-text-search-service.md b/docs/decisions/00NN-text-search-service.md index 9611fb751168..0928f0465639 100644 --- a/docs/decisions/00NN-text-search-service.md +++ b/docs/decisions/00NN-text-search-service.md @@ -8,12 +8,13 @@ consulted: informed: stephentoub, matthewbolanos --- -# Text Search Service +# Text Search Service ## Context and Problem Statement -{Describe the context and problem statement, e.g., in free form using two to three sentences or in the form of an illustrative story. -You may want to articulate the problem in form of a question and add links to collaboration boards or issue management systems.} +Semantic Kernel has support for searching using popular Vector databases e.g. Azure AI Search, Chroma, Milvus and also Web search engines e.g. Bing, Google. +There are two sets of abstractions and plugins depending on whether the developer wants to perform search against a Vector database of a Web search engine. +The current abstractions are experimental and the purpose of this ADR is to progress the design of the abstractions so that they can graduate to non experimental status. ## Decision Drivers @@ -23,13 +24,15 @@ You may want to articulate the problem in form of a question and add links to co - Application developers must be able to set required information e.g. `IndexName` for search providers. - Application developers must be able to support custom schemas for search connectors. No fields should be required. - Search service developers must be able to easily create a new search service that returns type `T`. -- Search service developers must be able to easily create a new search connector return type that inherits from `SearchResultContent`. -- Search service developers must be able to define the attributes of the search method (e.g., name, description, input names, input descriptions, return description). -- Application developers must be ab able to import a vector DB search connection using an ML index file. +- Search service developers must be able to easily create a new search connector return type that inherits from `KernelSearchResults` (alternate suggestion `SearchResultContent`). - The design must be flexible to support future requirements and different search modalities. +Need additional clarification + - Application developers must to be able to override the semantic descriptions of the search function(s) per instance registered via settings / inputs. - Application developers must be able to optionally define the execution settings of an embedding service with a default being provided by the Kernel. +- Search service developers must be able to define the attributes of the search method (e.g., name, description, input names, input descriptions, return description). +- Application developers must be ab able to import a vector DB search connection using an ML index file. ### Future Requirements @@ -67,7 +70,9 @@ The Semantic Kernel currently includes experimental support for a `WebSearchEngi - `url` The url of the search result web page - `snippet` A snippet of the search result in plain text -The current design doesn't support break glass scenario's or using custom types for the response values. +The current design doesn't support breaking glass scenario's or using custom types for the response values. + +One goal of this ADR is to have a design where text search is unified into a single abstraction and a single plugin can be configured to perform web based searches or to search a vector store. ## Considered Options @@ -108,6 +113,9 @@ The abstraction contains the following interfaces and classes: #### Return Results of Type `T` +All implementations of `ITextSearchService` **must** support returning the search results as a `string`. The `string` value is expected to contain the text value associated with the search result e.g. for Bing/Google this will be the snippet of text from the web page but for Azure AI Search this will be a designated field in the database. + +Below is an example where Azure AI Search returns `string` search results. Note the `ValueField` setting controls which field value is returned. ```csharp var searchService = new AzureAITextSearchService( @@ -122,6 +130,8 @@ await foreach (string result in summaryResults.Results) } ``` +Below is an example where Bing returns `string` search results. Note the `Snippet` value is returned in this case. + ```csharp var searchService = new BingTextSearchService( endpoint: TestConfiguration.Bing.Endpoint, @@ -134,6 +144,15 @@ await foreach (string result in summaryResults.Results) } ``` +All implementations of `ITextSearchService` **must** support returning the search results as a `TextSearchResult`. This is a common abstraction to present a search result that has the following properties: + +- `Name` - The name of the search result e.g. this could be a web page title. +- `Value` - The text value associated with the search result e.g. this could be a web page snippet. +- `Link` - A link to the resource associated with the search result e.g. this could be the URL of a web page. +- `InnerContent` - The actual search result object to support breaking glass scenarios. + +Below is an example where Azure AI Search returns `TextSearchResult` search results. Note the `NameField`, `ValueField` and `LinkField` settings control which field values are returned. + ```csharp AzureAISearchExecutionSettings settings = new() { Index = IndexName, Count = 2, Offset = 2, NameField = "title", ValueField = "chunk", LinkField = "metadata_spo_item_weburi" }; KernelSearchResults textResults = await searchService.SearchAsync("What is the Semantic Kernel?", settings); @@ -145,6 +164,8 @@ await foreach (TextSearchResult result in textResults.Results) } ``` +Below is an example where Bing returns `TextSearchResult` search results. Note the `Name`, `Snippet` and `Url` values is returned in this case. + ```csharp var searchService = new BingTextSearchService( endpoint: TestConfiguration.Bing.Endpoint, @@ -159,6 +180,10 @@ await foreach (CustomSearchResult result in searchResults.Results) } ``` +All implementations of `ITextSearchService` will support returning the implementation specific search results i.e. whatever the underlying client returns. + +Below is an example where Azure AI Search returns `Azure.Search.Documents.Models.SearchDocument` search results. + ```csharp KernelSearchResults fullResults = await searchService.SearchAsync("What is the Semantic Kernel?", new() { Index = IndexName, Count = 2, Offset = 6 }); await foreach (SearchDocument result in fullResults.Results) @@ -169,25 +194,113 @@ await foreach (SearchDocument result in fullResults.Results) } ``` +Below is an example where Bing returns `Microsoft.SemanticKernel.Plugins.Web.Bing.BingWebPage` search results. + +```csharp +KernelSearchResults fullResults = await searchService.SearchAsync(query, new() { Count = 2, Offset = 6 }); +await foreach (BingWebPage result in fullResults.Results) +{ + Console.WriteLine(result.Name); + Console.WriteLine(result.Snippet); + Console.WriteLine(result.Url); + Console.WriteLine(result.DisplayUrl); + Console.WriteLine(result.DateLastCrawled); +} +``` + +Implementations of `ITextSearchService` will optionally support returning the custom search results i.e. whatever the developer specifies. + +Below is an example where Bing returns `Search.CustomSearchResult` search results. + +```csharp +KernelSearchResults searchResults = await searchService.SearchAsync(query, new() { Count = 2 }); +await foreach (CustomSearchResult result in searchResults.Results) +{ + WriteLine(result.Name); + WriteLine(result.Snippet); + WriteLine(result.Url); +} + +public class CustomSearchResult +{ + [JsonPropertyName("name")] + public string? Name { get; set; } + [JsonPropertyName("url")] + public Uri? Url { get; set; } + [JsonPropertyName("snippet")] + public string? Snippet { get; set; } +} +``` #### Perform Search using Plugin +An out-of-the-box plugin is provided which allows a specific text search service implementation to be called. + +Below is an example where two instances of the `TextSearchPlugin` are configured both using the Bing text search service. + +1. Returns a single `string` search results. The result of calling the plugin with me the single `string` search result. +1. Returns two `BingWebPage` search results. The result of calling the plugin will be a JSON encoded string containing the two `TextSearchPlugin` search results. + ```csharp var searchService = new BingTextSearchService( endpoint: TestConfiguration.Bing.Endpoint, apiKey: TestConfiguration.Bing.ApiKey); Kernel kernel = new(); -var searchPlugin = new TextSearchPlugin(searchService); -kernel.ImportPluginFromObject(searchPlugin, "TextSearch"); +var stringPlugin = new TextSearchPlugin(searchService); +kernel.ImportPluginFromObject(stringPlugin, "StringSearch"); +var pagePlugin = new TextSearchPlugin(searchService); +kernel.ImportPluginFromObject(pagePlugin, "PageSearch"); -var function = kernel.Plugins["TextSearch"]["Search"]; +var function = kernel.Plugins["StringSearch"]["Search"]; var result = await kernel.InvokeAsync(function, new() { ["query"] = "What is the Semantic Kernel?" }); +Console.WriteLine(result); + +function = kernel.Plugins["PageSearch"]["Search"]; +result = await kernel.InvokeAsync(function, new() { ["query"] = "What is the Semantic Kernel?", ["count"] = 2 }); +Console.WriteLine(result); ``` +Single `string` result + +``` +Semantic Kernel is an open-source SDK that lets you easily build agents that can call your existing code. As a highly extensible SDK, you can use Semantic Kernel with models from OpenAI, Azure OpenAI, Hugging Face, and more! +``` + +Two `TextSearchPlugin` search results + +```json +[ + { + "dateLastCrawled": "2024-05-01T06:08:00.0000000Z", + "id": "https://api.bing.microsoft.com/api/v7/#WebPages.0", + "language": "en", + "isFamilyFriendly": true, + "isNavigational": true, + "name": "Create AI agents with Semantic Kernel | Microsoft Learn", + "url": "https://learn.microsoft.com/en-us/semantic-kernel/overview/", + "displayUrl": "https://learn.microsoft.com/en-us/semantic-kernel/overview", + "snippet": "Semantic Kernel is an open-source SDK that lets you easily build agents that can call your existing code. As a highly extensible SDK, you can use Semantic Kernel with models from OpenAI, Azure OpenAI, Hugging Face, and more!" + }, + { + "dateLastCrawled": "2024-05-02T00:03:00.0000000Z", + "id": "https://api.bing.microsoft.com/api/v7/#WebPages.1", + "language": "en", + "isFamilyFriendly": true, + "isNavigational": false, + "name": "Semantic Kernel: What It Is and Why It Matters", + "url": "https://techcommunity.microsoft.com/t5/microsoft-developer-community/semantic-kernel-what-it-is-and-why-it-matters/ba-p/3877022", + "displayUrl": "https://techcommunity.microsoft.com/t5/microsoft-developer-community/semantic-kernel...", + "snippet": "Semantic Kernel is a new AI SDK, and a simple and yet powerful programming model that lets you add large language capabilities to your app in just a matter of minutes. It uses natural language prompting to create and execute semantic kernel AI tasks across multiple languages and platforms." + } +] +``` + + #### Support ML Index File Format +TODO Evaluation diff --git a/dotnet/samples/KernelSyntaxExamples/Search/TextSearchPluginExample.cs b/dotnet/samples/KernelSyntaxExamples/Search/TextSearchPluginExample.cs index aae907d3a71e..493b67923629 100644 --- a/dotnet/samples/KernelSyntaxExamples/Search/TextSearchPluginExample.cs +++ b/dotnet/samples/KernelSyntaxExamples/Search/TextSearchPluginExample.cs @@ -10,12 +10,12 @@ namespace Search; /// -/// This example shows how to create and use a . +/// This example shows how to create and use a . /// public sealed class TextSearchPluginExample(ITestOutputHelper output) : BaseTest(output) { /// - /// Show how to create a and use it to perform a text search. + /// Show how to create a and use it to perform a text search. /// [Fact] public async Task RunAsync() @@ -27,14 +27,22 @@ public async Task RunAsync() // Build a kernel with Bing search service and add a text search plugin Kernel kernel = new(); - var searchPlugin = new TextSearchPlugin(searchService); - kernel.ImportPluginFromObject(searchPlugin, "TextSearch"); + var stringPlugin = new TextSearchPlugin(searchService); + kernel.ImportPluginFromObject(stringPlugin, "StringSearch"); + var pagePlugin = new TextSearchPlugin(searchService); + kernel.ImportPluginFromObject(pagePlugin, "PageSearch"); - // Invoke the plugin to perform a text search + // Invoke the plugin to perform a text search and return string values var question = "What is the Semantic Kernel?"; - var function = kernel.Plugins["TextSearch"]["Search"]; + var function = kernel.Plugins["StringSearch"]["Search"]; var result = await kernel.InvokeAsync(function, new() { ["query"] = question }); WriteLine(result); + + // Invoke the plugin to perform a text search and return BingWebPage values + function = kernel.Plugins["PageSearch"]["Search"]; + result = await kernel.InvokeAsync(function, new() { ["query"] = question, ["count"] = 2 }); + + WriteLine(result); } } diff --git a/dotnet/src/Plugins/Plugins.Web/TextSearchPlugin.cs b/dotnet/src/Plugins/Plugins.Web/TextSearchPlugin.cs index 6576545c9118..3bd74fbc5586 100644 --- a/dotnet/src/Plugins/Plugins.Web/TextSearchPlugin.cs +++ b/dotnet/src/Plugins/Plugins.Web/TextSearchPlugin.cs @@ -2,6 +2,8 @@ using System.ComponentModel; using System.Linq; +using System.Text.Encodings.Web; +using System.Text.Json; using System.Threading; using System.Threading.Tasks; using Microsoft.SemanticKernel.Search; @@ -12,13 +14,22 @@ namespace Microsoft.SemanticKernel.Plugins.Web; /// Text search plugin /// /// -/// Initializes a new instance of the class. +/// Initializes a new instance of the class. /// /// The text search service instance to use. -public sealed class TextSearchPlugin(ITextSearchService service) +public sealed class TextSearchPlugin(ITextSearchService service) where T : class { private readonly ITextSearchService _service = service; + /// + /// The usage of JavaScriptEncoder.UnsafeRelaxedJsonEscaping here is considered safe in this context + /// because the JSON result is not used for any security sensitive operations like HTML injection. + /// + private static readonly JsonSerializerOptions s_jsonOptionsCache = new() + { + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + }; + /// /// Performs a text search using the provided query, count, and offset. /// @@ -34,13 +45,18 @@ public sealed class TextSearchPlugin(ITextSearchService service) [Description("Number of results to skip")] int offset = 0, CancellationToken cancellationToken = default) { - var results = await this._service.SearchAsync(query, new() { Count = count, Offset = offset }, cancellationToken).ConfigureAwait(false); + var results = await this._service.SearchAsync(query, new() { Count = count, Offset = offset }, cancellationToken).ConfigureAwait(false); var resultList = await results.Results.ToListAsync(cancellationToken).ConfigureAwait(false); if (resultList.Count == 0) { return string.Empty; } - return string.Join("\n", resultList); // TODO: Use a better way to format the results + if (typeof(T) == typeof(string) && resultList.Count == 1) + { + return resultList[0] as string ?? string.Empty; + } + + return JsonSerializer.Serialize(resultList, s_jsonOptionsCache); } } From 2bae9e8e4a4376290e9cb60068fd8ddc98c9087e Mon Sep 17 00:00:00 2001 From: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> Date: Thu, 2 May 2024 12:15:39 +0100 Subject: [PATCH 13/18] Fix spelling mistakes --- docs/decisions/00NN-text-search-service.md | 4 ++-- dotnet/src/Plugins/Plugins.Web/Bing/BingSearchResponse.cs | 2 ++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/decisions/00NN-text-search-service.md b/docs/decisions/00NN-text-search-service.md index 0928f0465639..79138f946a70 100644 --- a/docs/decisions/00NN-text-search-service.md +++ b/docs/decisions/00NN-text-search-service.md @@ -65,7 +65,7 @@ The diagram below shows the layers in the current design of the Web Search Engin The Semantic Kernel currently includes experimental support for a `WebSearchEnginePlugin` which can be configured via a `IWebSearchEngineConnector` to integrate with a Web Search Services such as Bing or Google. The search results can be returned as a collection of string values or a collection of `WebPage` instances. - The `string` values returned from the plugin represent a snippet of the search result in plain text. -- The `WebPage` instances returned from the plugin are a normalized subset of a complete search result. Each `WebPage` incudes: +- The `WebPage` instances returned from the plugin are a normalized subset of a complete search result. Each `WebPage` includes: - `name` The name of the search result web page - `url` The url of the search result web page - `snippet` A snippet of the search result in plain text @@ -106,7 +106,7 @@ The class diagram below shows the class hierarchy. The abstraction contains the following interfaces and classes: -- `ITextSearchService` is the interface for text based search services. This cna be invoked with a text query to return a collection of search results. +- `ITextSearchService` is the interface for text based search services. This can be invoked with a text query to return a collection of search results. - `SearchExecutionSettings` provides execution settings for a search service. Some common settings e.g. `IndexName`, `Count`, `Offset` are defined. - `KernelSearchResults` represents the search results returned from a `ISearchService` service. This provides access to the individual search results, underlying search result, metadata, ... This supports generics but an implementation can restrict the supported types. All implementations must support `string`, `TextSearchResult` and whatever native types the connector implementation supports. Some implementations will also support custom types. - `TextSearchResult` represents a normalized text search result. All implementations must be able to return results using this type. diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/BingSearchResponse.cs b/dotnet/src/Plugins/Plugins.Web/Bing/BingSearchResponse.cs index 4fa07727770b..ad9eba67b39c 100644 --- a/dotnet/src/Plugins/Plugins.Web/Bing/BingSearchResponse.cs +++ b/dotnet/src/Plugins/Plugins.Web/Bing/BingSearchResponse.cs @@ -33,6 +33,7 @@ internal sealed class BingSearchResponse /// /// The query string that Bing used for the request. /// +#pragma warning disable CA1812 // Instantiated by reflection internal sealed class BingQueryContext { /// @@ -51,6 +52,7 @@ internal sealed class BingQueryContext [JsonPropertyName("alteredQuery")] public string? AlteredQuery { get; set; } } +#pragma warning restore CA1812 /// /// A list of webpages that are relevant to the search query. From 5348b2f220a0f82b365e6476210944c59b09c8a1 Mon Sep 17 00:00:00 2001 From: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> Date: Thu, 9 May 2024 10:32:04 +0100 Subject: [PATCH 14/18] Updates after merging latest from feature branch --- .../Search/AzureAISearchExample.cs | 40 ++++++++--------- .../Search/BingSearchExample.cs | 45 +++++++++---------- .../Search/GoogleSearchExample.cs | 34 +++++++------- .../Search/TextSearchPluginExample.cs | 10 ++--- .../AzureAISearchExecutionSettings.cs | 1 + .../samples/InternalUtilities/BaseTest.cs | 11 ++++- 6 files changed, 67 insertions(+), 74 deletions(-) rename dotnet/samples/{KernelSyntaxExamples => Concepts}/Search/AzureAISearchExample.cs (73%) rename dotnet/samples/{KernelSyntaxExamples => Concepts}/Search/BingSearchExample.cs (69%) rename dotnet/samples/{KernelSyntaxExamples => Concepts}/Search/GoogleSearchExample.cs (69%) rename dotnet/samples/{KernelSyntaxExamples => Concepts}/Search/TextSearchPluginExample.cs (90%) diff --git a/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearchExample.cs b/dotnet/samples/Concepts/Search/AzureAISearchExample.cs similarity index 73% rename from dotnet/samples/KernelSyntaxExamples/Search/AzureAISearchExample.cs rename to dotnet/samples/Concepts/Search/AzureAISearchExample.cs index 30e930977109..50f3e175197e 100644 --- a/dotnet/samples/KernelSyntaxExamples/Search/AzureAISearchExample.cs +++ b/dotnet/samples/Concepts/Search/AzureAISearchExample.cs @@ -1,13 +1,9 @@ // Copyright (c) Microsoft. All rights reserved. using System.Text.Json.Serialization; -using System.Threading.Tasks; using Azure.Search.Documents.Models; -using Examples; using Microsoft.SemanticKernel.Connectors.AzureAISearch; using Microsoft.SemanticKernel.Search; -using Xunit; -using Xunit.Abstractions; namespace Search; @@ -20,7 +16,7 @@ public sealed class AzureAISearchExample(ITestOutputHelper output) : BaseTest(ou /// Show how to create a and use it to perform a text search. /// [Fact] - public async Task RunAsync() + public async Task SearchAsync() { var query = "What is the Semantic Kernel?"; var IndexName = TestConfiguration.AzureAISearch.IndexName; @@ -34,11 +30,11 @@ public async Task RunAsync() KernelSearchResults searchResults = await searchService.SearchAsync(query, new() { Index = IndexName, Count = 2, Offset = 2 }); await foreach (CustomSearchResult result in searchResults.Results) { - WriteLine($"Title: {result.Title}"); - WriteLine($"Chunk Id: {result.ChunkId}"); - WriteLine("------------------------------------------------------------------------------------------------------------------"); - WriteLine(result.Chunk); - WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine($"Title: {result.Title}"); + Console.WriteLine($"Chunk Id: {result.ChunkId}"); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine(result.Chunk); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); } // Search for just the summaries @@ -46,8 +42,8 @@ await foreach (CustomSearchResult result in searchResults.Results) KernelSearchResults summaryResults = await searchService.SearchAsync(query, settings); await foreach (string result in summaryResults.Results) { - WriteLine(result); - WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine(result); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); } // Search with TextSearchResult result type @@ -55,22 +51,22 @@ await foreach (string result in summaryResults.Results) KernelSearchResults textResults = await searchService.SearchAsync(query, settings); await foreach (TextSearchResult result in textResults.Results) { - WriteLine($"Name: {result.Name}"); - WriteLine("------------------------------------------------------------------------------------------------------------------"); - WriteLine(result.Value); - WriteLine(result.Link); - WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine($"Name: {result.Name}"); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine(result.Value); + Console.WriteLine(result.Link); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); } // Search with a the default result type KernelSearchResults fullResults = await searchService.SearchAsync(query, new() { Index = IndexName, Count = 2, Offset = 6 }); await foreach (SearchDocument result in fullResults.Results) { - WriteLine($"Title: {result.GetString("title")}"); - WriteLine($"Chunk Id: {result.GetString("chunk_id")}"); - WriteLine("------------------------------------------------------------------------------------------------------------------"); - WriteLine(result.GetString("chunk")); - WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine($"Title: {result.GetString("title")}"); + Console.WriteLine($"Chunk Id: {result.GetString("chunk_id")}"); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine(result.GetString("chunk")); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); } } diff --git a/dotnet/samples/KernelSyntaxExamples/Search/BingSearchExample.cs b/dotnet/samples/Concepts/Search/BingSearchExample.cs similarity index 69% rename from dotnet/samples/KernelSyntaxExamples/Search/BingSearchExample.cs rename to dotnet/samples/Concepts/Search/BingSearchExample.cs index c9afeb66f3ef..305be64414d8 100644 --- a/dotnet/samples/KernelSyntaxExamples/Search/BingSearchExample.cs +++ b/dotnet/samples/Concepts/Search/BingSearchExample.cs @@ -1,12 +1,7 @@ // Copyright (c) Microsoft. All rights reserved. -using System; using System.Text.Json.Serialization; -using System.Threading.Tasks; -using Examples; using Microsoft.SemanticKernel.Plugins.Web.Bing; using Microsoft.SemanticKernel.Search; -using Xunit; -using Xunit.Abstractions; namespace Search; @@ -19,7 +14,7 @@ public sealed class BingSearchExample(ITestOutputHelper output) : BaseTest(outpu /// Show how to create a and use it to perform a text search. /// [Fact] - public async Task RunAsync() + public async Task SearchAsync() { var query = "What is the Semantic Kernel?"; @@ -32,43 +27,43 @@ public async Task RunAsync() KernelSearchResults searchResults = await searchService.SearchAsync(query, new() { Count = 2 }); await foreach (CustomSearchResult result in searchResults.Results) { - WriteLine($"Title: {result.Name}"); - WriteLine("------------------------------------------------------------------------------------------------------------------"); - WriteLine(result.Snippet); - WriteLine(result.Url); - WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine($"Title: {result.Name}"); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine(result.Snippet); + Console.WriteLine(result.Url); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); } // Search for just the summaries KernelSearchResults summaryResults = await searchService.SearchAsync(query, new() { Count = 2, Offset = 2 }); await foreach (string result in summaryResults.Results) { - WriteLine(result); - WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine(result); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); } // Search with TextSearchResult result type KernelSearchResults textResults = await searchService.SearchAsync(query, new() { Count = 2, Offset = 4 }); await foreach (TextSearchResult result in textResults.Results) { - WriteLine($"Name: {result.Name}"); - WriteLine("------------------------------------------------------------------------------------------------------------------"); - WriteLine(result.Value); - WriteLine(result.Link); - WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine($"Name: {result.Name}"); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine(result.Value); + Console.WriteLine(result.Link); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); } // Search with a the default result type KernelSearchResults fullResults = await searchService.SearchAsync(query, new() { Count = 2, Offset = 6 }); await foreach (BingWebPage result in fullResults.Results) { - WriteLine($"Name: {result.Name}"); - WriteLine("------------------------------------------------------------------------------------------------------------------"); - WriteLine(result.Snippet); - WriteLine(result.Url); - WriteLine(result.DisplayUrl); - WriteLine(result.DateLastCrawled); - WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine($"Name: {result.Name}"); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine(result.Snippet); + Console.WriteLine(result.Url); + Console.WriteLine(result.DisplayUrl); + Console.WriteLine(result.DateLastCrawled); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); } } diff --git a/dotnet/samples/KernelSyntaxExamples/Search/GoogleSearchExample.cs b/dotnet/samples/Concepts/Search/GoogleSearchExample.cs similarity index 69% rename from dotnet/samples/KernelSyntaxExamples/Search/GoogleSearchExample.cs rename to dotnet/samples/Concepts/Search/GoogleSearchExample.cs index 20c189a2d170..a688ca107a64 100644 --- a/dotnet/samples/KernelSyntaxExamples/Search/GoogleSearchExample.cs +++ b/dotnet/samples/Concepts/Search/GoogleSearchExample.cs @@ -1,11 +1,7 @@ // Copyright (c) Microsoft. All rights reserved. -using System.Threading.Tasks; -using Examples; using Google.Apis.CustomSearchAPI.v1.Data; using Microsoft.SemanticKernel.Plugins.Web.Google; using Microsoft.SemanticKernel.Search; -using Xunit; -using Xunit.Abstractions; namespace Search; @@ -18,7 +14,7 @@ public sealed class GoogleSearchExample(ITestOutputHelper output) : BaseTest(out /// Show how to create a and use it to perform a text search. /// [Fact] - public async Task RunAsync() + public async Task SearchAsync() { var query = "What is the Semantic Kernel?"; @@ -31,32 +27,32 @@ public async Task RunAsync() KernelSearchResults summaryResults = await searchService.SearchAsync(query, new() { Count = 2, Offset = 2 }); await foreach (string result in summaryResults.Results) { - WriteLine(result); - WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine(result); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); } // Search with TextSearchResult result type KernelSearchResults textResults = await searchService.SearchAsync(query, new() { Count = 2, Offset = 4 }); await foreach (TextSearchResult result in textResults.Results) { - WriteLine($"Name: {result.Name}"); - WriteLine("------------------------------------------------------------------------------------------------------------------"); - WriteLine(result.Value); - WriteLine(result.Link); - WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine($"Name: {result.Name}"); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine(result.Value); + Console.WriteLine(result.Link); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); } // Search with a the default result type KernelSearchResults fullResults = await searchService.SearchAsync(query, new() { Count = 2, Offset = 6 }); await foreach (Result result in fullResults.Results) { - WriteLine($"Title: {result.Title}"); - WriteLine("------------------------------------------------------------------------------------------------------------------"); - WriteLine(result.Snippet); - WriteLine(result.Link); - WriteLine(result.DisplayLink); - WriteLine(result.Kind); - WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine($"Title: {result.Title}"); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); + Console.WriteLine(result.Snippet); + Console.WriteLine(result.Link); + Console.WriteLine(result.DisplayLink); + Console.WriteLine(result.Kind); + Console.WriteLine("------------------------------------------------------------------------------------------------------------------"); } } } diff --git a/dotnet/samples/KernelSyntaxExamples/Search/TextSearchPluginExample.cs b/dotnet/samples/Concepts/Search/TextSearchPluginExample.cs similarity index 90% rename from dotnet/samples/KernelSyntaxExamples/Search/TextSearchPluginExample.cs rename to dotnet/samples/Concepts/Search/TextSearchPluginExample.cs index 493b67923629..a75cfe99abea 100644 --- a/dotnet/samples/KernelSyntaxExamples/Search/TextSearchPluginExample.cs +++ b/dotnet/samples/Concepts/Search/TextSearchPluginExample.cs @@ -1,11 +1,7 @@ // Copyright (c) Microsoft. All rights reserved. -using System.Threading.Tasks; -using Examples; using Microsoft.SemanticKernel; using Microsoft.SemanticKernel.Plugins.Web; using Microsoft.SemanticKernel.Plugins.Web.Bing; -using Xunit; -using Xunit.Abstractions; namespace Search; @@ -18,7 +14,7 @@ public sealed class TextSearchPluginExample(ITestOutputHelper output) : BaseTest /// Show how to create a and use it to perform a text search. /// [Fact] - public async Task RunAsync() + public async Task SearchAsync() { // Create a search service with Bing search service var searchService = new BingTextSearchService( @@ -37,12 +33,12 @@ public async Task RunAsync() var function = kernel.Plugins["StringSearch"]["Search"]; var result = await kernel.InvokeAsync(function, new() { ["query"] = question }); - WriteLine(result); + Console.WriteLine(result); // Invoke the plugin to perform a text search and return BingWebPage values function = kernel.Plugins["PageSearch"]["Search"]; result = await kernel.InvokeAsync(function, new() { ["query"] = question, ["count"] = 2 }); - WriteLine(result); + Console.WriteLine(result); } } diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs index e22c414d10fd..a8da4142c0f9 100644 --- a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs +++ b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAISearchExecutionSettings.cs @@ -36,6 +36,7 @@ public class AzureAISearchExecutionSettings : SearchExecutionSettings /// /// Parameters for filtering, sorting, faceting, paging, and other search query behaviors. /// + [JsonIgnore] public SearchOptions? SearchOptions { get diff --git a/dotnet/src/InternalUtilities/samples/InternalUtilities/BaseTest.cs b/dotnet/src/InternalUtilities/samples/InternalUtilities/BaseTest.cs index 06f573e0712c..58ef1074a1d2 100644 --- a/dotnet/src/InternalUtilities/samples/InternalUtilities/BaseTest.cs +++ b/dotnet/src/InternalUtilities/samples/InternalUtilities/BaseTest.cs @@ -86,7 +86,16 @@ public void WriteLine(object? target = null) /// Format string /// Arguments public void WriteLine(string? format, params object?[] args) - => this.Output.WriteLine(format ?? string.Empty, args); + { + if (args is null || args.Length == 0) + { + this.Output.WriteLine(format ?? string.Empty); + } + else + { + this.Output.WriteLine(format ?? string.Empty, args); + } + } /// /// Current interface ITestOutputHelper does not have a Write method. This extension method adds it to make it analogous to Console.Write when used in Console apps. From 1d8b7e08ee956a4329d7529c2d0ee7e5848ff33c Mon Sep 17 00:00:00 2001 From: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> Date: Thu, 9 May 2024 11:14:47 +0100 Subject: [PATCH 15/18] Update the memory store diagram --- .../text-search-service-imemorystore.mmd | 11 +++++++++-- .../text-search-service-imemorystore.png | Bin 95722 -> 109131 bytes 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/decisions/diagrams/text-search-service-imemorystore.mmd b/docs/decisions/diagrams/text-search-service-imemorystore.mmd index d377835175ff..63f294b5daa6 100644 --- a/docs/decisions/diagrams/text-search-service-imemorystore.mmd +++ b/docs/decisions/diagrams/text-search-service-imemorystore.mmd @@ -12,17 +12,24 @@ columns 1 space block:Memory MemoryAbstraction[["IMemoryStore"]] - MemoryDescription[" An interface for storing and retrieving indexed MemoryRecord objects in a data store."] + MemoryDescription["An interface for storing and retrieving indexed MemoryRecord objects in a data store."] end space block:MemoryClient MemoryClientAbstraction[["Memory Client"]] - MemoryClientDescription[" A database specific service client."] + MemoryClientDescription["A database specific service client."] + end + space + block:VectorDatabaseService + VectorDatabase[["Vector Database"]] + VectorDatabaseDescription["A vector database e.g. Redis, Milvus, Pinecone, Qdrant."] end Plugin-- "Uses the provided Semantic Memory implementation to recall text memories." -->SemanticMemory SemanticMemory-- "Uses the provided Memory Store to query the database." -->Memory Memory-- "Uses a Memory Client (if available) to interact with the database." -->MemoryClient + MemoryClient-- "Invokes the Vector Database Service." -->VectorDatabaseService style PluginDescription fill:#FFF,stroke-width:0px style SemanticMemoryDescription fill:#FFF,stroke-width:0px style MemoryDescription fill:#FFF,stroke-width:0px style MemoryClientDescription fill:#FFF,stroke-width:0px + style VectorDatabaseDescription fill:#FFF,stroke-width:0px \ No newline at end of file diff --git a/docs/decisions/diagrams/text-search-service-imemorystore.png b/docs/decisions/diagrams/text-search-service-imemorystore.png index 6ffb7937ee6de2d2155fc678cb6659a561fd899a..2004ed6905065cc0e027360bf53d7d17f66e2172 100644 GIT binary patch literal 109131 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 &+Id@ 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

IPjfjBfvM4A%&+XwEEc`6$*-C$64#{)>? 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ΠobT3i5u#~}tMV_YQXn8&I*8s@#Kd;e|;$IifKVQcixD;%G760b| zBtHHxx!eAmM{Q#tED4G`fR!7BFBzRC91|Dd-zN;7nutR?iXKGtrK3SadPYmG^@H%W z(n|>(<9|D4{`tXcW7+5@eV2*?VP^>(jxxrFF8`RV{&{6Zo!~bUTE;8hsPBCRi}Rm9 zF7-K8^z8o)%DnimqwJsmUP%6*g(Los*8lf6-%u}{k#>Lf=-a-o2O|L=cW>+6DuY`E F{}%c{y=xl$fUd~S9fyuRVAsONU&3hgNF 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

JGq{k%W1xsCo)&1LTt5fc3VqlTa>ST99KVT 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 Date: Fri, 10 May 2024 15:59:10 +0100 Subject: [PATCH 16/18] Code review feedback --- .../AzureAITextSearchService.cs | 2 +- .../Plugins.Web/Bing/BingTextSearchService.cs | 2 +- .../Plugins.Web/Google/GoogleTextSearchService.cs | 2 +- .../src/Plugins/Plugins.Web/TextSearchPlugin.cs | 4 ++-- .../Search/ITextSearchService.cs | 7 +++++-- .../Services/ISearchService.cs | 15 --------------- 6 files changed, 10 insertions(+), 22 deletions(-) delete mode 100644 dotnet/src/SemanticKernel.Abstractions/Services/ISearchService.cs diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs index 0e9eba2173bd..891e9cb50942 100644 --- a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs +++ b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs @@ -59,7 +59,7 @@ public AzureAITextSearchService(SearchIndexClient searchIndexClient) } /// - public async Task> SearchAsync(string query, SearchExecutionSettings? searchSettings, CancellationToken cancellationToken = default) where T : class + public async Task> SearchAsync(string query, SearchExecutionSettings? searchSettings, Kernel? kernel = null, CancellationToken cancellationToken = default) where T : class { Verify.NotNullOrWhiteSpace(query); Verify.NotNull(searchSettings); diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs b/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs index 1712145ea528..72c958f680ad 100644 --- a/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs +++ b/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs @@ -48,7 +48,7 @@ public BingTextSearchService(string endpoint, string apiKey, HttpClient? httpCli } /// - public async Task> SearchAsync(string query, SearchExecutionSettings? searchSettings = null, CancellationToken cancellationToken = default) where T : class + public async Task> SearchAsync(string query, SearchExecutionSettings? searchSettings = null, Kernel? kernel = null, CancellationToken cancellationToken = default) where T : class { searchSettings ??= new SearchExecutionSettings(); var count = searchSettings.Count; diff --git a/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs b/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs index dd60e2628746..7a10fba89ac0 100644 --- a/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs +++ b/dotnet/src/Plugins/Plugins.Web/Google/GoogleTextSearchService.cs @@ -59,7 +59,7 @@ public sealed class GoogleTextSearchService : ITextSearchService, IDisposable } /// - public async Task> SearchAsync(string query, SearchExecutionSettings? searchSettings = null, CancellationToken cancellationToken = default) where T : class + public async Task> SearchAsync(string query, SearchExecutionSettings? searchSettings = null, Kernel? kernel = null, CancellationToken cancellationToken = default) where T : class { searchSettings ??= new SearchExecutionSettings(); var count = searchSettings.Count; diff --git a/dotnet/src/Plugins/Plugins.Web/TextSearchPlugin.cs b/dotnet/src/Plugins/Plugins.Web/TextSearchPlugin.cs index 3bd74fbc5586..7277f277f9f5 100644 --- a/dotnet/src/Plugins/Plugins.Web/TextSearchPlugin.cs +++ b/dotnet/src/Plugins/Plugins.Web/TextSearchPlugin.cs @@ -31,14 +31,14 @@ public sealed class TextSearchPlugin(ITextSearchService service) where T : cl }; ///

- /// Performs a text search using the provided query, count, and offset. + /// Perform a search for content related to the specified query. /// /// The text to search for. /// The number of results to return. Default is 1. /// The number of results to skip. Default is 0. /// A cancellation token to observe while waiting for the task to complete. /// A task that represents the asynchronous operation. The value of the TResult parameter contains the search results as a string. - [KernelFunction, Description("Perform a web search.")] + [KernelFunction, Description("Perform a search for content related to the specified query.")] public async Task SearchAsync( [Description("Search query")] string query, [Description("Number of results")] int count = 1, diff --git a/dotnet/src/SemanticKernel.Abstractions/Search/ITextSearchService.cs b/dotnet/src/SemanticKernel.Abstractions/Search/ITextSearchService.cs index 701b4b157380..6cc94b4a9f0d 100644 --- a/dotnet/src/SemanticKernel.Abstractions/Search/ITextSearchService.cs +++ b/dotnet/src/SemanticKernel.Abstractions/Search/ITextSearchService.cs @@ -1,24 +1,27 @@ // Copyright (c) Microsoft. All rights reserved. +using System.ComponentModel; using System.Threading; using System.Threading.Tasks; -using Microsoft.SemanticKernel.Services; namespace Microsoft.SemanticKernel.Search; /// /// Interface for text based search services /// -public interface ITextSearchService : ISearchService +public interface ITextSearchService { /// /// Perform a search for content related to the specified query. /// /// What to search for /// Option search execution settings + /// The containing services, plugins, and other state for use throughout the operation. /// The to monitor for cancellation requests. The default is . + [Description("Perform a search for content related to the specified query.")] public Task> SearchAsync( string query, SearchExecutionSettings? searchSettings = null, + Kernel? kernel = null, CancellationToken cancellationToken = default) where T : class; } diff --git a/dotnet/src/SemanticKernel.Abstractions/Services/ISearchService.cs b/dotnet/src/SemanticKernel.Abstractions/Services/ISearchService.cs deleted file mode 100644 index 6c54246d802b..000000000000 --- a/dotnet/src/SemanticKernel.Abstractions/Services/ISearchService.cs +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright (c) Microsoft. All rights reserved. -using System.Collections.Generic; - -namespace Microsoft.SemanticKernel.Services; - -/// -/// Represents a search service. -/// -public interface ISearchService -{ - /// - /// Gets the search service attributes. - /// - IReadOnlyDictionary Attributes { get; } -} From c0341e6cdea68df2c375720f89e8ba3792bd9e05 Mon Sep 17 00:00:00 2001 From: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> Date: Mon, 10 Jun 2024 12:20:24 +0100 Subject: [PATCH 17/18] Add property for Filter and move new concept tests --- docs/decisions/00NN-text-search-service.md | 2 +- .../AzureAISearchExample.cs | 2 +- .../{Search => TextSearch}/BingSearchExample.cs | 2 +- .../GoogleSearchExample.cs | 2 +- .../TextSearchPluginExample.cs | 2 +- .../AzureAITextSearchService.cs | 10 ++++++++-- .../TextSearchPlugin.cs | 2 +- .../Plugins.Web/Bing/BingTextSearchService.cs | 2 +- .../Search/ITextSearchService.cs | 2 ++ .../Search/KernelSearchResults.cs | 5 +++-- .../Search/SearchExecutionSettings.cs | 16 ++++++++++++---- .../Search/TextSearchResult.cs | 2 ++ 12 files changed, 34 insertions(+), 15 deletions(-) rename dotnet/samples/Concepts/{Search => TextSearch}/AzureAISearchExample.cs (99%) rename dotnet/samples/Concepts/{Search => TextSearch}/BingSearchExample.cs (99%) rename dotnet/samples/Concepts/{Search => TextSearch}/GoogleSearchExample.cs (99%) rename dotnet/samples/Concepts/{Search => TextSearch}/TextSearchPluginExample.cs (98%) rename dotnet/src/Plugins/{Plugins.Web => Plugins.Memory}/TextSearchPlugin.cs (96%) diff --git a/docs/decisions/00NN-text-search-service.md b/docs/decisions/00NN-text-search-service.md index 79138f946a70..0dd7bb108a7e 100644 --- a/docs/decisions/00NN-text-search-service.md +++ b/docs/decisions/00NN-text-search-service.md @@ -13,7 +13,7 @@ informed: stephentoub, matthewbolanos ## Context and Problem Statement Semantic Kernel has support for searching using popular Vector databases e.g. Azure AI Search, Chroma, Milvus and also Web search engines e.g. Bing, Google. -There are two sets of abstractions and plugins depending on whether the developer wants to perform search against a Vector database of a Web search engine. +There are two sets of abstractions and plugins depending on whether the developer wants to perform search against a Vector database or a Web search engine. The current abstractions are experimental and the purpose of this ADR is to progress the design of the abstractions so that they can graduate to non experimental status. ## Decision Drivers diff --git a/dotnet/samples/Concepts/Search/AzureAISearchExample.cs b/dotnet/samples/Concepts/TextSearch/AzureAISearchExample.cs similarity index 99% rename from dotnet/samples/Concepts/Search/AzureAISearchExample.cs rename to dotnet/samples/Concepts/TextSearch/AzureAISearchExample.cs index 50f3e175197e..7f28cd4dc38a 100644 --- a/dotnet/samples/Concepts/Search/AzureAISearchExample.cs +++ b/dotnet/samples/Concepts/TextSearch/AzureAISearchExample.cs @@ -5,7 +5,7 @@ using Microsoft.SemanticKernel.Connectors.AzureAISearch; using Microsoft.SemanticKernel.Search; -namespace Search; +namespace TextSearch; /// /// This example shows how to create and use a . diff --git a/dotnet/samples/Concepts/Search/BingSearchExample.cs b/dotnet/samples/Concepts/TextSearch/BingSearchExample.cs similarity index 99% rename from dotnet/samples/Concepts/Search/BingSearchExample.cs rename to dotnet/samples/Concepts/TextSearch/BingSearchExample.cs index 305be64414d8..382a2f2c8064 100644 --- a/dotnet/samples/Concepts/Search/BingSearchExample.cs +++ b/dotnet/samples/Concepts/TextSearch/BingSearchExample.cs @@ -3,7 +3,7 @@ using Microsoft.SemanticKernel.Plugins.Web.Bing; using Microsoft.SemanticKernel.Search; -namespace Search; +namespace TextSearch; /// /// This example shows how to create and use a . diff --git a/dotnet/samples/Concepts/Search/GoogleSearchExample.cs b/dotnet/samples/Concepts/TextSearch/GoogleSearchExample.cs similarity index 99% rename from dotnet/samples/Concepts/Search/GoogleSearchExample.cs rename to dotnet/samples/Concepts/TextSearch/GoogleSearchExample.cs index a688ca107a64..0ac9e888ea41 100644 --- a/dotnet/samples/Concepts/Search/GoogleSearchExample.cs +++ b/dotnet/samples/Concepts/TextSearch/GoogleSearchExample.cs @@ -3,7 +3,7 @@ using Microsoft.SemanticKernel.Plugins.Web.Google; using Microsoft.SemanticKernel.Search; -namespace Search; +namespace TextSearch; /// /// This example shows how to create and use a . diff --git a/dotnet/samples/Concepts/Search/TextSearchPluginExample.cs b/dotnet/samples/Concepts/TextSearch/TextSearchPluginExample.cs similarity index 98% rename from dotnet/samples/Concepts/Search/TextSearchPluginExample.cs rename to dotnet/samples/Concepts/TextSearch/TextSearchPluginExample.cs index a75cfe99abea..477a0c0c6cce 100644 --- a/dotnet/samples/Concepts/Search/TextSearchPluginExample.cs +++ b/dotnet/samples/Concepts/TextSearch/TextSearchPluginExample.cs @@ -3,7 +3,7 @@ using Microsoft.SemanticKernel.Plugins.Web; using Microsoft.SemanticKernel.Plugins.Web.Bing; -namespace Search; +namespace TextSearch; /// /// This example shows how to create and use a . diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs index 891e9cb50942..274eaee242cf 100644 --- a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs +++ b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs @@ -30,7 +30,7 @@ public sealed class AzureAITextSearchService : ITextSearchService /// You need to use an admin key to perform any operations on the SearchIndexClient. /// See Create and manage api-keys for an Azure Cognitive Search service for more information about API keys in Azure Cognitive Search. /// - public AzureAITextSearchService(string endpoint, string adminKey) + public AzureAITextSearchService(string endpoint, string adminKey, string? index = null) { Verify.NotNullOrWhiteSpace(endpoint); Verify.NotNullOrWhiteSpace(adminKey); @@ -41,6 +41,8 @@ public AzureAITextSearchService(string endpoint, string adminKey) { { "ServiceName", this._searchIndexClient.ServiceName }, }; + + this._index = index; } /// @@ -64,7 +66,10 @@ public AzureAITextSearchService(SearchIndexClient searchIndexClient) Verify.NotNullOrWhiteSpace(query); Verify.NotNull(searchSettings); - var indexName = this.NormalizeIndexName(searchSettings.Index); + var index = searchSettings.Index ?? this._index; + Verify.NotNullOrWhiteSpace(index); + + var indexName = this.NormalizeIndexName(index); var searchClient = this._searchIndexClient.GetSearchClient(indexName); var azureSearchSettings = AzureAISearchExecutionSettings.FromExecutionSettings(searchSettings); @@ -102,6 +107,7 @@ public AzureAITextSearchService(SearchIndexClient searchIndexClient) private readonly SearchIndexClient _searchIndexClient; private readonly IReadOnlyDictionary _attributes; + private readonly string? _index; /// /// Return the search results. diff --git a/dotnet/src/Plugins/Plugins.Web/TextSearchPlugin.cs b/dotnet/src/Plugins/Plugins.Memory/TextSearchPlugin.cs similarity index 96% rename from dotnet/src/Plugins/Plugins.Web/TextSearchPlugin.cs rename to dotnet/src/Plugins/Plugins.Memory/TextSearchPlugin.cs index 7277f277f9f5..bec58a690afd 100644 --- a/dotnet/src/Plugins/Plugins.Web/TextSearchPlugin.cs +++ b/dotnet/src/Plugins/Plugins.Memory/TextSearchPlugin.cs @@ -45,7 +45,7 @@ public sealed class TextSearchPlugin(ITextSearchService service) where T : cl [Description("Number of results to skip")] int offset = 0, CancellationToken cancellationToken = default) { - var results = await this._service.SearchAsync(query, new() { Count = count, Offset = offset }, cancellationToken).ConfigureAwait(false); + var results = await this._service.SearchAsync(query, new() { Count = count, Offset = offset }, null, cancellationToken).ConfigureAwait(false); var resultList = await results.Results.ToListAsync(cancellationToken).ConfigureAwait(false); if (resultList.Count == 0) { diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs b/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs index 72c958f680ad..71edd1a096a0 100644 --- a/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs +++ b/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs @@ -77,7 +77,7 @@ public BingTextSearchService(string endpoint, string apiKey, HttpClient? httpCli Id = webPages.WebPages.Id, SomeResultsRemoved = webPages.WebPages.SomeResultsRemoved, TotalEstimatedMatches = webPages.WebPages.TotalEstimatedMatches, - Value = webPages?.WebPages?.Value.Select(x => x.Snippet).ToList() as List + Value = webPages?.WebPages?.Value.Select(x => x.Snippet).ToList() as List, }, }; } diff --git a/dotnet/src/SemanticKernel.Abstractions/Search/ITextSearchService.cs b/dotnet/src/SemanticKernel.Abstractions/Search/ITextSearchService.cs index 6cc94b4a9f0d..9bb2fc7edffd 100644 --- a/dotnet/src/SemanticKernel.Abstractions/Search/ITextSearchService.cs +++ b/dotnet/src/SemanticKernel.Abstractions/Search/ITextSearchService.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft. All rights reserved. using System.ComponentModel; +using System.Diagnostics.CodeAnalysis; using System.Threading; using System.Threading.Tasks; @@ -9,6 +10,7 @@ namespace Microsoft.SemanticKernel.Search; /// /// Interface for text based search services /// +[Experimental("SKEXP0001")] public interface ITextSearchService { /// diff --git a/dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResults.cs b/dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResults.cs index 22eda8dc779e..4e68531180b1 100644 --- a/dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResults.cs +++ b/dotnet/src/SemanticKernel.Abstractions/Search/KernelSearchResults.cs @@ -1,13 +1,14 @@ // Copyright (c) Microsoft. All rights reserved. using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Text.Json.Serialization; -using Microsoft.SemanticKernel.Services; namespace Microsoft.SemanticKernel.Search; /// -/// Represents the search results returned from a service. +/// Represents the search results returned from a service. /// +[Experimental("SKEXP0001")] public class KernelSearchResults { /// diff --git a/dotnet/src/SemanticKernel.Abstractions/Search/SearchExecutionSettings.cs b/dotnet/src/SemanticKernel.Abstractions/Search/SearchExecutionSettings.cs index a3f910f9c019..35fc2fe1ffe4 100644 --- a/dotnet/src/SemanticKernel.Abstractions/Search/SearchExecutionSettings.cs +++ b/dotnet/src/SemanticKernel.Abstractions/Search/SearchExecutionSettings.cs @@ -1,7 +1,8 @@ // Copyright (c) Microsoft. All rights reserved. +using System; using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; using System.Text.Json.Serialization; -using Microsoft.SemanticKernel.Services; namespace Microsoft.SemanticKernel.Search; @@ -9,16 +10,23 @@ namespace Microsoft.SemanticKernel.Search; /// Provides execution settings for a search request. /// /// -/// Implementors of can extend this +/// Implementors of can extend this /// if the service they are calling supports additional properties. /// +[Experimental("SKEXP0001")] public class SearchExecutionSettings { /// - /// The name of the desired Search Index. + /// The name of the desired search index. /// [JsonPropertyName("index")] - public string Index { get; set; } = string.Empty; + public string? Index { get; set; } + + /// + /// The filter expression to apply to the search query. + /// + [JsonPropertyName("filter")] + public FormattableString? Filter { get; set; } /// /// Number of search results to return. diff --git a/dotnet/src/SemanticKernel.Abstractions/Search/TextSearchResult.cs b/dotnet/src/SemanticKernel.Abstractions/Search/TextSearchResult.cs index 1a0967e63f51..f184d41c9dc9 100644 --- a/dotnet/src/SemanticKernel.Abstractions/Search/TextSearchResult.cs +++ b/dotnet/src/SemanticKernel.Abstractions/Search/TextSearchResult.cs @@ -1,5 +1,6 @@ // Copyright (c) Microsoft. All rights reserved. +using System.Diagnostics.CodeAnalysis; using System.Text.Json.Serialization; namespace Microsoft.SemanticKernel.Search; @@ -10,6 +11,7 @@ namespace Microsoft.SemanticKernel.Search; /// /// Initializes a new instance of the class. /// +[Experimental("SKEXP0001")] public class TextSearchResult(string? name, string? value, string? link, object? innerContent) { /// From acd0d18d0d1210573ee7c2b6ecdc671bacd54163 Mon Sep 17 00:00:00 2001 From: markwallace-microsoft <127216156+markwallace-microsoft@users.noreply.github.com> Date: Mon, 10 Jun 2024 14:58:57 +0100 Subject: [PATCH 18/18] Fix warnings --- .../Concepts/TextSearch/TextSearchPluginExample.cs | 2 +- .../AzureAITextSearchService.cs | 10 +++++----- dotnet/src/Plugins/Plugins.Memory/TextSearchPlugin.cs | 2 +- .../Plugins/Plugins.Web/Bing/BingTextSearchService.cs | 11 ++++------- .../Search/SearchExecutionSettings.cs | 2 +- 5 files changed, 12 insertions(+), 15 deletions(-) diff --git a/dotnet/samples/Concepts/TextSearch/TextSearchPluginExample.cs b/dotnet/samples/Concepts/TextSearch/TextSearchPluginExample.cs index 477a0c0c6cce..4448dd0334a0 100644 --- a/dotnet/samples/Concepts/TextSearch/TextSearchPluginExample.cs +++ b/dotnet/samples/Concepts/TextSearch/TextSearchPluginExample.cs @@ -1,6 +1,6 @@ // Copyright (c) Microsoft. All rights reserved. using Microsoft.SemanticKernel; -using Microsoft.SemanticKernel.Plugins.Web; +using Microsoft.SemanticKernel.Plugins; using Microsoft.SemanticKernel.Plugins.Web.Bing; namespace TextSearch; diff --git a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs index 274eaee242cf..7e397ce1b11c 100644 --- a/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs +++ b/dotnet/src/Connectors/Connectors.Memory.AzureAISearch/AzureAITextSearchService.cs @@ -19,7 +19,7 @@ namespace Microsoft.SemanticKernel.Connectors.AzureAISearch; public sealed class AzureAITextSearchService : ITextSearchService { /// - public IReadOnlyDictionary Attributes => this._attributes; + public IReadOnlyDictionary Attributes { get; } /// /// Create an instance of the connector with API key authentication. @@ -30,6 +30,7 @@ public sealed class AzureAITextSearchService : ITextSearchService /// You need to use an admin key to perform any operations on the SearchIndexClient. /// See Create and manage api-keys for an Azure Cognitive Search service for more information about API keys in Azure Cognitive Search. /// + /// The name of the search index. public AzureAITextSearchService(string endpoint, string adminKey, string? index = null) { Verify.NotNullOrWhiteSpace(endpoint); @@ -37,7 +38,7 @@ public AzureAITextSearchService(string endpoint, string adminKey, string? index this._searchIndexClient = new SearchIndexClient(new Uri(endpoint), new AzureKeyCredential(adminKey)); - this._attributes = new Dictionary + this.Attributes = new Dictionary { { "ServiceName", this._searchIndexClient.ServiceName }, }; @@ -54,7 +55,7 @@ public AzureAITextSearchService(SearchIndexClient searchIndexClient) this._searchIndexClient = searchIndexClient; - this._attributes = new Dictionary + this.Attributes = new Dictionary { { "ServiceName", this._searchIndexClient.ServiceName }, }; @@ -106,7 +107,6 @@ public AzureAITextSearchService(SearchIndexClient searchIndexClient) #region private private readonly SearchIndexClient _searchIndexClient; - private readonly IReadOnlyDictionary _attributes; private readonly string? _index; /// @@ -172,7 +172,7 @@ await foreach (SearchResult searchResult in searchResults.GetRes /// The .NET type that maps to the index schema. Instances of this type /// can be retrieved as documents from the index. /// Response containing the documents matching the query. - static private Dictionary? GetResultsMetadata(SearchResults? searchResults) where T : class + private static Dictionary? GetResultsMetadata(SearchResults? searchResults) where T : class { return new Dictionary() { diff --git a/dotnet/src/Plugins/Plugins.Memory/TextSearchPlugin.cs b/dotnet/src/Plugins/Plugins.Memory/TextSearchPlugin.cs index bec58a690afd..1b28f1cb2054 100644 --- a/dotnet/src/Plugins/Plugins.Memory/TextSearchPlugin.cs +++ b/dotnet/src/Plugins/Plugins.Memory/TextSearchPlugin.cs @@ -8,7 +8,7 @@ using System.Threading.Tasks; using Microsoft.SemanticKernel.Search; -namespace Microsoft.SemanticKernel.Plugins.Web; +namespace Microsoft.SemanticKernel.Plugins; /// /// Text search plugin diff --git a/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs b/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs index 71edd1a096a0..6f5c432ded7c 100644 --- a/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs +++ b/dotnet/src/Plugins/Plugins.Web/Bing/BingTextSearchService.cs @@ -21,7 +21,7 @@ namespace Microsoft.SemanticKernel.Plugins.Web.Bing; public sealed class BingTextSearchService : ITextSearchService { /// - public IReadOnlyDictionary Attributes => this._attributes; + public IReadOnlyDictionary Attributes { get; } /// /// Create an instance of the connector with API key authentication. @@ -42,9 +42,7 @@ public BingTextSearchService(string endpoint, string apiKey, HttpClient? httpCli this._httpClient.DefaultRequestHeaders.Add("User-Agent", HttpHeaderConstant.Values.UserAgent); this._httpClient.DefaultRequestHeaders.Add(HttpHeaderConstant.Names.SemanticKernelVersion, HttpHeaderConstant.Values.GetAssemblyVersion(typeof(BingTextSearchService))); - this._attributes = new Dictionary - { - }; + this.Attributes = new Dictionary(); } /// @@ -77,7 +75,7 @@ public BingTextSearchService(string endpoint, string apiKey, HttpClient? httpCli Id = webPages.WebPages.Id, SomeResultsRemoved = webPages.WebPages.SomeResultsRemoved, TotalEstimatedMatches = webPages.WebPages.TotalEstimatedMatches, - Value = webPages?.WebPages?.Value.Select(x => x.Snippet).ToList() as List, + Value = webPages?.WebPages?.Value?.Select(x => x.Snippet).ToList() as List ?? [], }, }; } @@ -96,7 +94,7 @@ public BingTextSearchService(string endpoint, string apiKey, HttpClient? httpCli Id = webPages.WebPages.Id, SomeResultsRemoved = webPages.WebPages.SomeResultsRemoved, TotalEstimatedMatches = webPages.WebPages.TotalEstimatedMatches, - Value = webPages?.WebPages?.Value.Select(x => new TextSearchResult(x.Name, x.Snippet, x.Url, x)).ToList() as List + Value = webPages?.WebPages?.Value?.Select(x => new TextSearchResult(x.Name, x.Snippet, x.Url, x)).ToList() as List ?? [], }, }; } @@ -115,7 +113,6 @@ public BingTextSearchService(string endpoint, string apiKey, HttpClient? httpCli private readonly HttpClient _httpClient; private readonly string? _apiKey; private readonly Uri? _uri = null; - private readonly IReadOnlyDictionary _attributes; private const string DefaultUri = "https://api.bing.microsoft.com/v7.0/search"; diff --git a/dotnet/src/SemanticKernel.Abstractions/Search/SearchExecutionSettings.cs b/dotnet/src/SemanticKernel.Abstractions/Search/SearchExecutionSettings.cs index 35fc2fe1ffe4..fca85dd44800 100644 --- a/dotnet/src/SemanticKernel.Abstractions/Search/SearchExecutionSettings.cs +++ b/dotnet/src/SemanticKernel.Abstractions/Search/SearchExecutionSettings.cs @@ -17,7 +17,7 @@ namespace Microsoft.SemanticKernel.Search; public class SearchExecutionSettings { /// - /// The name of the desired search index. + /// The name of the search index. /// [JsonPropertyName("index")] public string? Index { get; set; }