From b23a0fa9c48aab0d1ef73db4d1ec7939319884b9 Mon Sep 17 00:00:00 2001 From: enisn Date: Mon, 23 Jun 2025 16:03:36 +0300 Subject: [PATCH 01/13] Add RenderLayout property to control layout rendering Introduces a RenderLayout property to IPageLayout and PageLayout, allowing conditional rendering of the menu, toolbar, and footer in the Application layout. Updates Application.cshtml to respect this property, enabling more flexible page layouts. --- .../Volo/Abp/AspNetCore/Mvc/UI/Layout/IPageLayout.cs | 5 +++++ .../Volo/Abp/AspNetCore/Mvc/UI/Layout/PageLayout.cs | 7 ++----- .../Themes/Basic/Layouts/Application.cshtml | 5 ++++- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/IPageLayout.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/IPageLayout.cs index 0f91b334f91..607f2d642e1 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/IPageLayout.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/IPageLayout.cs @@ -3,4 +3,9 @@ public interface IPageLayout { ContentLayout Content { get; } + + /// + /// If false, the menu, toolbar and footer will not be rendered. + /// + bool RenderLayout { get; set; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageLayout.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageLayout.cs index f92167bd639..7b6f6ec275a 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageLayout.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageLayout.cs @@ -4,10 +4,7 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Layout; public class PageLayout : IPageLayout, IScopedDependency { - public ContentLayout Content { get; } + public ContentLayout Content { get; } = new(); - public PageLayout() - { - Content = new ContentLayout(); - } + public bool RenderLayout { get; set; } = true; } diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Application.cshtml b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Application.cshtml index 6823d2b938d..dfbc1ed5a8d 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Application.cshtml +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Application.cshtml @@ -63,7 +63,10 @@ @await Component.InvokeLayoutHookAsync(LayoutHooks.Body.First, StandardLayouts.Application) - @(await Component.InvokeAsync()) + @if (PageLayout.RenderLayout) + { + @(await Component.InvokeAsync()) + }
@(await Component.InvokeAsync()) From 5a2029dbed893899351249b7ef2b560826db133d Mon Sep 17 00:00:00 2001 From: enisn Date: Mon, 23 Jun 2025 16:37:17 +0300 Subject: [PATCH 02/13] Add RenderLayoutElements to control layout rendering Introduces the RenderLayoutElements property to IPageLayout and updates usage throughout the codebase. This allows pages to control whether navigation, toolbar, and other layout elements are rendered, providing more flexibility for special pages like error or embedded content. Documentation is updated to explain the new property and its usage. --- .../framework/ui/mvc-razor-pages/page-header.md | 16 ++++++++++++++++ .../Abp/AspNetCore/Mvc/UI/Layout/IPageLayout.cs | 4 ++-- .../Abp/AspNetCore/Mvc/UI/Layout/PageLayout.cs | 2 +- .../Themes/Basic/Layouts/Account.cshtml | 7 ++++++- .../Themes/Basic/Layouts/Application.cshtml | 4 ++-- 5 files changed, 27 insertions(+), 6 deletions(-) diff --git a/docs/en/framework/ui/mvc-razor-pages/page-header.md b/docs/en/framework/ui/mvc-razor-pages/page-header.md index 7d760f6ec78..5d501535961 100644 --- a/docs/en/framework/ui/mvc-razor-pages/page-header.md +++ b/docs/en/framework/ui/mvc-razor-pages/page-header.md @@ -6,6 +6,22 @@ `IPageLayout` can be injected in any page/view to set the page header properties. +### RenderLayoutElements + +The `RenderLayoutElements` property controls whether the application layout (navigation menu, toolbar, etc.) should be rendered around the page content: + +```csharp +@inject IPageLayout PageLayout +@{ + PageLayout.RenderLayoutElements = false; // Hide navigation and layout elements +} +``` + +* When set to `true` (default), the full application layout including navigation menu is rendered. +* When set to `false`, only the page content is rendered without the surrounding layout elements. +* This is useful for pages public pages, error pages, or embedded content where you want a clean layout without navigation. +* This is not `Empty` Layout, it's still the same layout with related page, but without the navigation menu, toolbar and footer. All the layout hooks are still available. + ### Page Title Page Title can be set as shown in the example below: diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/IPageLayout.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/IPageLayout.cs index 607f2d642e1..9c8d9b0375b 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/IPageLayout.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/IPageLayout.cs @@ -5,7 +5,7 @@ public interface IPageLayout ContentLayout Content { get; } /// - /// If false, the menu, toolbar and footer will not be rendered. + /// Whether the application layout (navigation menu, toolbar, etc.) should be rendered around the page content. /// - bool RenderLayout { get; set; } + bool RenderLayoutElements { get; set; } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageLayout.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageLayout.cs index 7b6f6ec275a..dba9d973634 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageLayout.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageLayout.cs @@ -6,5 +6,5 @@ public class PageLayout : IPageLayout, IScopedDependency { public ContentLayout Content { get; } = new(); - public bool RenderLayout { get; set; } = true; + public bool RenderLayoutElements { get; set; } = true; } diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Account.cshtml b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Account.cshtml index 1e5f1b1fe76..e37b16ab8a1 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Account.cshtml +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Account.cshtml @@ -2,6 +2,7 @@ @using Microsoft.Extensions.Options @using Volo.Abp.AspNetCore.MultiTenancy @using Volo.Abp.AspNetCore.Mvc.UI.Components.LayoutHook +@using Volo.Abp.AspNetCore.Mvc.UI.Layout @using Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy.Localization @using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Bundling @using Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic.Themes.Basic.Components.MainNavbar @@ -19,6 +20,7 @@ @inject IStringLocalizer MultiTenancyStringLocalizer @inject ITenantResolveResultAccessor TenantResolveResultAccessor @inject IOptions ThemingOptions +@inject IPageLayout PageLayout @{ Layout = null; @@ -58,7 +60,10 @@ @await Component.InvokeLayoutHookAsync(LayoutHooks.Body.First, StandardLayouts.Account) - @(await Component.InvokeAsync()) + @if (PageLayout.RenderLayoutElements) + { + @(await Component.InvokeAsync()) + }
diff --git a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Application.cshtml b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Application.cshtml index dfbc1ed5a8d..1d58bd77193 100644 --- a/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Application.cshtml +++ b/modules/basic-theme/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Basic/Themes/Basic/Layouts/Application.cshtml @@ -18,7 +18,7 @@ @{ Layout = null; - var containerClass = ViewBag.FluidLayout == true ? "container-fluid" : "container"; //TODO: Better and type-safe options + var containerClass = ViewBag.FluidLayout == true || PageLayout.RenderLayoutElements == false ? "container-fluid" : "container"; //TODO: Better and type-safe options var pageTitle = ViewBag.Title == null ? BrandingProvider.AppName : ViewBag.Title; //TODO: Discard to get from Title @@ -63,7 +63,7 @@ @await Component.InvokeLayoutHookAsync(LayoutHooks.Body.First, StandardLayouts.Application) - @if (PageLayout.RenderLayout) + @if (PageLayout.RenderLayoutElements) { @(await Component.InvokeAsync()) } From 14bfbb45c5fad1ee93dfcfe33a55b4c11d08f882 Mon Sep 17 00:00:00 2001 From: enisn Date: Wed, 25 Jun 2025 11:15:29 +0300 Subject: [PATCH 03/13] Add page embedding feature for conditional layout rendering Introduces the PageEmbedding feature, allowing ABP MVC pages to be embedded in other UI technologies like iframes by conditionally disabling layout elements. This includes new classes and interfaces for embedding services, options for configuration, and automatic iframe detection. Updates to the PageLayout class ensure compatibility with the new embedding logic. Documentation is added to explain usage and configuration options. --- .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 +++ ...olo.Abp.AspNetCore.Mvc.UI.Embedding.abppkg | 3 + ...olo.Abp.AspNetCore.Mvc.UI.Embedding.csproj | 23 ++ .../UI/AbpAspNetCoreMvcUiEmbeddingModule.cs | 25 +++ .../Mvc/UI/Layout/EmbeddingPageLayout.cs | 43 ++++ .../Mvc/UI/Layout/IPageEmbeddingService.cs | 13 ++ .../Mvc/UI/Layout/PageEmbeddingOptions.cs | 33 +++ .../Mvc/UI/Layout/PageEmbeddingService.cs | 205 ++++++++++++++++++ .../Abp/AspNetCore/Mvc/UI/Layout/README.md | 75 +++++++ .../AspNetCore/Mvc/UI/Layout/PageLayout.cs | 2 +- 11 files changed, 454 insertions(+), 1 deletion(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/FodyWeavers.xml create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/FodyWeavers.xsd create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo.Abp.AspNetCore.Mvc.UI.Embedding.abppkg create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo.Abp.AspNetCore.Mvc.UI.Embedding.csproj create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/AbpAspNetCoreMvcUiEmbeddingModule.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddingPageLayout.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/IPageEmbeddingService.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageEmbeddingOptions.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageEmbeddingService.cs create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/README.md diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/FodyWeavers.xml b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/FodyWeavers.xml new file mode 100644 index 00000000000..1715698ccd2 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/FodyWeavers.xsd b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/FodyWeavers.xsd new file mode 100644 index 00000000000..ffa6fc4b782 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo.Abp.AspNetCore.Mvc.UI.Embedding.abppkg b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo.Abp.AspNetCore.Mvc.UI.Embedding.abppkg new file mode 100644 index 00000000000..f4bad072d26 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo.Abp.AspNetCore.Mvc.UI.Embedding.abppkg @@ -0,0 +1,3 @@ +{ + "role": "lib.framework" +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo.Abp.AspNetCore.Mvc.UI.Embedding.csproj b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo.Abp.AspNetCore.Mvc.UI.Embedding.csproj new file mode 100644 index 00000000000..d6e1229ce21 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo.Abp.AspNetCore.Mvc.UI.Embedding.csproj @@ -0,0 +1,23 @@ + + + + + + + net9.0 + enable + Nullable + true + Volo.Abp.AspNetCore.Mvc.UI.Embedding + Volo.Abp.AspNetCore.Mvc.UI.Embedding + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + true + Library + + + + + + + + diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/AbpAspNetCoreMvcUiEmbeddingModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/AbpAspNetCoreMvcUiEmbeddingModule.cs new file mode 100644 index 00000000000..0df420b19b5 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/AbpAspNetCoreMvcUiEmbeddingModule.cs @@ -0,0 +1,25 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.AspNetCore.Mvc.UI.Layout; +using Volo.Abp.Modularity; +using Volo.Abp.UI.Navigation; +using Volo.Abp.VirtualFileSystem; + +namespace Volo.Abp.AspNetCore.Mvc.UI; + +[DependsOn(typeof(AbpAspNetCoreMvcUiModule))] +public class AbpAspNetCoreMvcUiEmbeddingModule : AbpModule +{ + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.FileSets.AddEmbedded(); + }); + + // Configure page embedding options + Configure(options => + { + // Default configuration - can be overridden by applications + }); + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddingPageLayout.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddingPageLayout.cs new file mode 100644 index 00000000000..db9210a8de7 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddingPageLayout.cs @@ -0,0 +1,43 @@ +using Microsoft.AspNetCore.Http; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Layout; + +[Dependency(ReplaceServices = true)] +[ExposeServices(typeof(IPageLayout))] +public class EmbeddingPageLayout : PageLayout, IScopedDependency +{ + protected IPageEmbeddingService PageEmbeddingService { get; } + protected IHttpContextAccessor HttpContextAccessor { get; } + + private bool? _renderLayoutElements; + + public EmbeddingPageLayout(IPageEmbeddingService pageEmbeddingService, IHttpContextAccessor httpContextAccessor) + { + PageEmbeddingService = pageEmbeddingService; + HttpContextAccessor = httpContextAccessor; + } + + public ContentLayout Content { get; } = new(); + + public override bool RenderLayoutElements + { + get + { + if (_renderLayoutElements.HasValue) + { + return _renderLayoutElements.Value; + } + + // Check if this is an embedding request + var httpContext = HttpContextAccessor.HttpContext; + if (httpContext != null && PageEmbeddingService.IsEmbeddingRequest(httpContext)) + { + return false; + } + + return true; + } + set => _renderLayoutElements = value; + } +} diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/IPageEmbeddingService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/IPageEmbeddingService.cs new file mode 100644 index 00000000000..6c282e20a13 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/IPageEmbeddingService.cs @@ -0,0 +1,13 @@ +using Microsoft.AspNetCore.Http; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Layout; + +public interface IPageEmbeddingService +{ + /// + /// Determines if the current request should render the page in embedding mode (without layout elements) + /// + /// The current HTTP context + /// True if the page should be rendered without layout elements + bool IsEmbeddingRequest(HttpContext httpContext); +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageEmbeddingOptions.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageEmbeddingOptions.cs new file mode 100644 index 00000000000..7c9b73c867f --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageEmbeddingOptions.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Layout; + +public class PageEmbeddingOptions +{ + /// + /// Query parameter name to enable embedding mode. Default: "embed" + /// + public string QueryParameterName { get; set; } = "embed"; + + /// + /// Query parameter values that enable embedding mode. Default: ["true", "1"] + /// + public HashSet QueryParameterValues { get; set; } = new() { "true", "1" }; + + /// + /// Paths that should always be rendered without layout elements (for embedding) + /// + public HashSet EmbeddedPaths { get; set; } = new(); + + /// + /// Path patterns that should always be rendered without layout elements (for embedding) + /// Supports wildcards like "/api/embed/*" + /// + public HashSet EmbeddedPathPatterns { get; set; } = new(); + + /// + /// When true, automatically disable layout elements for requests that come from iframes. + /// Uses multiple detection methods with fallbacks. + /// + public bool AlwaysEmbedIFrameRequests { get; set; } = false; +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageEmbeddingService.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageEmbeddingService.cs new file mode 100644 index 00000000000..6036c9838e1 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageEmbeddingService.cs @@ -0,0 +1,205 @@ +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.Options; +using System; +using System.Linq; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Layout; + +public class PageEmbeddingService : IPageEmbeddingService, ITransientDependency +{ + protected PageEmbeddingOptions Options { get; } + + public PageEmbeddingService(IOptions options) + { + Options = options.Value; + } + + public virtual bool IsEmbeddingRequest(HttpContext httpContext) + { + // Check if iframe detection is enabled and this is an iframe request + if (Options.AlwaysEmbedIFrameRequests && IsIFrameRequest(httpContext)) + { + return true; + } + + // Check query parameter + if (IsEmbeddingQueryParameterPresent(httpContext)) + { + return true; + } + + // Check exact paths + if (IsEmbeddedPath(httpContext)) + { + return true; + } + + // Check path patterns + if (IsEmbeddedPathPattern(httpContext)) + { + return true; + } + + return false; + } + + protected virtual bool IsEmbeddingQueryParameterPresent(HttpContext httpContext) + { + if (!httpContext.Request.Query.ContainsKey(Options.QueryParameterName)) + { + return false; + } + + var value = httpContext.Request.Query[Options.QueryParameterName].ToString().ToLowerInvariant(); + return Options.QueryParameterValues.Contains(value); + } + + protected virtual bool IsEmbeddedPath(HttpContext httpContext) + { + var path = httpContext.Request.Path.Value?.ToLowerInvariant(); + if (path == null) + { + return false; + } + + return Options.EmbeddedPaths.Any(embeddedPath => + path.Equals(embeddedPath.ToLowerInvariant())); + } + + protected virtual bool IsEmbeddedPathPattern(HttpContext httpContext) + { + var path = httpContext.Request.Path.Value?.ToLowerInvariant(); + if (path == null) + { + return false; + } + + return Options.EmbeddedPathPatterns.Any(pattern => + IsPathMatchingPattern(path, pattern.ToLowerInvariant())); + } + + protected virtual bool IsPathMatchingPattern(string path, string pattern) + { + // Simple wildcard matching - can be enhanced for more complex patterns + if (pattern.EndsWith("*")) + { + var prefix = pattern[..^1]; + return path.StartsWith(prefix); + } + + if (pattern.StartsWith("*")) + { + var suffix = pattern[1..]; + return path.EndsWith(suffix); + } + + return path.Equals(pattern); + } + + protected virtual bool IsIFrameRequest(HttpContext httpContext) + { + // Method 1: Check Sec-Fetch-Dest header (most reliable for modern browsers) + if (IsIFrameRequestBySecFetchDest(httpContext)) + { + return true; + } + + // Method 2: Check Sec-Fetch-Site and Sec-Fetch-Mode headers + if (IsIFrameRequestBySecFetchHeaders(httpContext)) + { + return true; + } + + // Method 3: Check for custom iframe headers + if (IsIFrameRequestByCustomHeaders(httpContext)) + { + return true; + } + + // Method 4: Check X-Requested-With header + if (IsIFrameRequestByXRequestedWith(httpContext)) + { + return true; + } + + // Method 5: Check referer header (least reliable) + if (IsIFrameRequestByReferer(httpContext)) + { + return true; + } + + return false; + } + + protected virtual bool IsIFrameRequestBySecFetchDest(HttpContext httpContext) + { + var secFetchDest = httpContext.Request.Headers["Sec-Fetch-Dest"].FirstOrDefault(); + return string.Equals(secFetchDest, "iframe", StringComparison.OrdinalIgnoreCase); + } + + protected virtual bool IsIFrameRequestBySecFetchHeaders(HttpContext httpContext) + { + var secFetchSite = httpContext.Request.Headers["Sec-Fetch-Site"].FirstOrDefault(); + var secFetchMode = httpContext.Request.Headers["Sec-Fetch-Mode"].FirstOrDefault(); + + // Check for cross-site or same-site requests with navigate mode (common for iframes) + return !string.IsNullOrEmpty(secFetchSite) && + (string.Equals(secFetchSite, "cross-site", StringComparison.OrdinalIgnoreCase) || + string.Equals(secFetchSite, "same-site", StringComparison.OrdinalIgnoreCase)) && + string.Equals(secFetchMode, "navigate", StringComparison.OrdinalIgnoreCase); + } + + protected virtual bool IsIFrameRequestByCustomHeaders(HttpContext httpContext) + { + // Check for common custom headers that indicate iframe requests + var customHeaders = new[] + { + "X-Frame-Request", + "X-Iframe-Request", + "X-Embedded-Request" + }; + + return customHeaders.Any(header => + { + var value = httpContext.Request.Headers[header].FirstOrDefault(); + return string.Equals(value, "true", StringComparison.OrdinalIgnoreCase) || + string.Equals(value, "1", StringComparison.OrdinalIgnoreCase); + }); + } + + protected virtual bool IsIFrameRequestByXRequestedWith(HttpContext httpContext) + { + var xRequestedWith = httpContext.Request.Headers["X-Requested-With"].FirstOrDefault(); + + // Some iframe libraries use this header + return string.Equals(xRequestedWith, "iframe", StringComparison.OrdinalIgnoreCase) || + string.Equals(xRequestedWith, "embedded", StringComparison.OrdinalIgnoreCase); + } + + protected virtual bool IsIFrameRequestByReferer(HttpContext httpContext) + { + var referer = httpContext.Request.Headers["Referer"].FirstOrDefault(); + var host = httpContext.Request.Host.Host; + + if (string.IsNullOrEmpty(referer) || string.IsNullOrEmpty(host)) + { + return false; + } + + try + { + var refererUri = new Uri(referer); + var refererHost = refererUri.Host; + + // If referer host is different from current host, it might be an iframe request + // This is the least reliable method as it can have false positives + return !string.Equals(refererHost, host, StringComparison.OrdinalIgnoreCase); + } + catch + { + // Invalid referer URI + return false; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/README.md b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/README.md new file mode 100644 index 00000000000..47f0d54d163 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/README.md @@ -0,0 +1,75 @@ +# Page Embedding Feature + +This feature allows ABP MVC pages to be embedded in other UI technologies (like iframes) by conditionally disabling layout elements. + +## Configuration + +### 1. Using Query Parameters + +Add `?embed=true` to any page URL to render it without layout elements: + +``` +https://myapp.com/MyPage?embed=true +https://myapp.com/Identity/Users?embed=1 +``` + +### 2. Automatic IFrame Detection + +Enable automatic iframe detection to embed all pages when accessed from iframes: + +```csharp +Configure(options => +{ + // Automatically embed pages when accessed from iframes + options.AlwaysEmbedIFrameRequests = true; +}); +``` + +### 3. Configuring Specific Paths + +Configure specific paths and patterns for embedding: + +```csharp +Configure(options => +{ + // Specific paths that should always be embedded + options.EmbeddedPaths.Add("/embed/dashboard"); + options.EmbeddedPaths.Add("/reports/widget"); + + // Path patterns with wildcards + options.EmbeddedPathPatterns.Add("/api/embed/*"); + options.EmbeddedPathPatterns.Add("*/widget"); + + // Customize query parameter name and values + options.QueryParameterName = "iframe"; + options.QueryParameterValues.Add("yes"); + + // Enable automatic iframe detection + options.AlwaysEmbedIFrameRequests = true; +}); +``` + +## How It Works + +1. The `PageLayout.RenderLayoutElements` property is automatically set to `false` when embedding conditions are met +2. Themes check this property to conditionally render navigation, headers, footers, etc. +3. The `PageEmbeddingService` evaluates multiple factors: + - **IFrame detection** (when `AlwaysEmbedIFrameRequests = true`): + - `Sec-Fetch-Dest: iframe` header (most reliable) + - `Sec-Fetch-Site` + `Sec-Fetch-Mode` headers + - Custom headers (`X-Frame-Request`, `X-Iframe-Request`, etc.) + - `X-Requested-With` header + - Referer header analysis (least reliable) + - Query parameters (`?embed=true`) + - Configured embedded paths + - Path patterns with wildcards + +## Theme Integration + +Themes already support this feature through the existing `PageLayout.RenderLayoutElements` property. No changes needed in theme implementations. + +## Security Considerations + +- Embedding should be carefully controlled to prevent clickjacking attacks +- Consider implementing CORS policies for cross-origin embedding +- Validate the source of embedding requests when necessary \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageLayout.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageLayout.cs index dba9d973634..197bacb9a08 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageLayout.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI/Volo/Abp/AspNetCore/Mvc/UI/Layout/PageLayout.cs @@ -6,5 +6,5 @@ public class PageLayout : IPageLayout, IScopedDependency { public ContentLayout Content { get; } = new(); - public bool RenderLayoutElements { get; set; } = true; + public virtual bool RenderLayoutElements { get; set; } = true; } From 3490e72f948fd195de8b4d7fd8c111d09409f7a3 Mon Sep 17 00:00:00 2001 From: enisn Date: Wed, 25 Jun 2025 11:15:45 +0300 Subject: [PATCH 04/13] Update Volo.Abp.sln --- framework/Volo.Abp.sln | 1955 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1955 insertions(+) diff --git a/framework/Volo.Abp.sln b/framework/Volo.Abp.sln index 78f7ae00116..98acbc29903 100644 --- a/framework/Volo.Abp.sln +++ b/framework/Volo.Abp.sln @@ -491,980 +491,2934 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.BlobStoring.Bunny. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.Timing.Tests", "test\Volo.Abp.Timing.Tests\Volo.Abp.Timing.Tests.csproj", "{58FCF22D-E8DB-4EB8-B586-9BB6E9899D64}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Abp.AspNetCore.Mvc.UI.Embedding", "src\Volo.Abp.AspNetCore.Mvc.UI.Embedding\Volo.Abp.AspNetCore.Mvc.UI.Embedding.csproj", "{B297E998-8398-4134-A95B-5BBB4753870E}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {1020F5FD-6A97-40C2-AFCA-EBDF641DF111}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1020F5FD-6A97-40C2-AFCA-EBDF641DF111}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1020F5FD-6A97-40C2-AFCA-EBDF641DF111}.Debug|x64.ActiveCfg = Debug|Any CPU + {1020F5FD-6A97-40C2-AFCA-EBDF641DF111}.Debug|x64.Build.0 = Debug|Any CPU + {1020F5FD-6A97-40C2-AFCA-EBDF641DF111}.Debug|x86.ActiveCfg = Debug|Any CPU + {1020F5FD-6A97-40C2-AFCA-EBDF641DF111}.Debug|x86.Build.0 = Debug|Any CPU {1020F5FD-6A97-40C2-AFCA-EBDF641DF111}.Release|Any CPU.ActiveCfg = Release|Any CPU {1020F5FD-6A97-40C2-AFCA-EBDF641DF111}.Release|Any CPU.Build.0 = Release|Any CPU + {1020F5FD-6A97-40C2-AFCA-EBDF641DF111}.Release|x64.ActiveCfg = Release|Any CPU + {1020F5FD-6A97-40C2-AFCA-EBDF641DF111}.Release|x64.Build.0 = Release|Any CPU + {1020F5FD-6A97-40C2-AFCA-EBDF641DF111}.Release|x86.ActiveCfg = Release|Any CPU + {1020F5FD-6A97-40C2-AFCA-EBDF641DF111}.Release|x86.Build.0 = Release|Any CPU {02BE03BA-3411-448C-AB61-CB36407CC49A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {02BE03BA-3411-448C-AB61-CB36407CC49A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {02BE03BA-3411-448C-AB61-CB36407CC49A}.Debug|x64.ActiveCfg = Debug|Any CPU + {02BE03BA-3411-448C-AB61-CB36407CC49A}.Debug|x64.Build.0 = Debug|Any CPU + {02BE03BA-3411-448C-AB61-CB36407CC49A}.Debug|x86.ActiveCfg = Debug|Any CPU + {02BE03BA-3411-448C-AB61-CB36407CC49A}.Debug|x86.Build.0 = Debug|Any CPU {02BE03BA-3411-448C-AB61-CB36407CC49A}.Release|Any CPU.ActiveCfg = Release|Any CPU {02BE03BA-3411-448C-AB61-CB36407CC49A}.Release|Any CPU.Build.0 = Release|Any CPU + {02BE03BA-3411-448C-AB61-CB36407CC49A}.Release|x64.ActiveCfg = Release|Any CPU + {02BE03BA-3411-448C-AB61-CB36407CC49A}.Release|x64.Build.0 = Release|Any CPU + {02BE03BA-3411-448C-AB61-CB36407CC49A}.Release|x86.ActiveCfg = Release|Any CPU + {02BE03BA-3411-448C-AB61-CB36407CC49A}.Release|x86.Build.0 = Release|Any CPU {B1D860BB-6EC6-4BAE-ADAA-C2AEC2FFB510}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B1D860BB-6EC6-4BAE-ADAA-C2AEC2FFB510}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B1D860BB-6EC6-4BAE-ADAA-C2AEC2FFB510}.Debug|x64.ActiveCfg = Debug|Any CPU + {B1D860BB-6EC6-4BAE-ADAA-C2AEC2FFB510}.Debug|x64.Build.0 = Debug|Any CPU + {B1D860BB-6EC6-4BAE-ADAA-C2AEC2FFB510}.Debug|x86.ActiveCfg = Debug|Any CPU + {B1D860BB-6EC6-4BAE-ADAA-C2AEC2FFB510}.Debug|x86.Build.0 = Debug|Any CPU {B1D860BB-6EC6-4BAE-ADAA-C2AEC2FFB510}.Release|Any CPU.ActiveCfg = Release|Any CPU {B1D860BB-6EC6-4BAE-ADAA-C2AEC2FFB510}.Release|Any CPU.Build.0 = Release|Any CPU + {B1D860BB-6EC6-4BAE-ADAA-C2AEC2FFB510}.Release|x64.ActiveCfg = Release|Any CPU + {B1D860BB-6EC6-4BAE-ADAA-C2AEC2FFB510}.Release|x64.Build.0 = Release|Any CPU + {B1D860BB-6EC6-4BAE-ADAA-C2AEC2FFB510}.Release|x86.ActiveCfg = Release|Any CPU + {B1D860BB-6EC6-4BAE-ADAA-C2AEC2FFB510}.Release|x86.Build.0 = Release|Any CPU {05271341-7A15-484C-9FD6-802A4193F4DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {05271341-7A15-484C-9FD6-802A4193F4DE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {05271341-7A15-484C-9FD6-802A4193F4DE}.Debug|x64.ActiveCfg = Debug|Any CPU + {05271341-7A15-484C-9FD6-802A4193F4DE}.Debug|x64.Build.0 = Debug|Any CPU + {05271341-7A15-484C-9FD6-802A4193F4DE}.Debug|x86.ActiveCfg = Debug|Any CPU + {05271341-7A15-484C-9FD6-802A4193F4DE}.Debug|x86.Build.0 = Debug|Any CPU {05271341-7A15-484C-9FD6-802A4193F4DE}.Release|Any CPU.ActiveCfg = Release|Any CPU {05271341-7A15-484C-9FD6-802A4193F4DE}.Release|Any CPU.Build.0 = Release|Any CPU + {05271341-7A15-484C-9FD6-802A4193F4DE}.Release|x64.ActiveCfg = Release|Any CPU + {05271341-7A15-484C-9FD6-802A4193F4DE}.Release|x64.Build.0 = Release|Any CPU + {05271341-7A15-484C-9FD6-802A4193F4DE}.Release|x86.ActiveCfg = Release|Any CPU + {05271341-7A15-484C-9FD6-802A4193F4DE}.Release|x86.Build.0 = Release|Any CPU {7CC7946B-E026-4F66-8D4F-4F78F4801D43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7CC7946B-E026-4F66-8D4F-4F78F4801D43}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7CC7946B-E026-4F66-8D4F-4F78F4801D43}.Debug|x64.ActiveCfg = Debug|Any CPU + {7CC7946B-E026-4F66-8D4F-4F78F4801D43}.Debug|x64.Build.0 = Debug|Any CPU + {7CC7946B-E026-4F66-8D4F-4F78F4801D43}.Debug|x86.ActiveCfg = Debug|Any CPU + {7CC7946B-E026-4F66-8D4F-4F78F4801D43}.Debug|x86.Build.0 = Debug|Any CPU {7CC7946B-E026-4F66-8D4F-4F78F4801D43}.Release|Any CPU.ActiveCfg = Release|Any CPU {7CC7946B-E026-4F66-8D4F-4F78F4801D43}.Release|Any CPU.Build.0 = Release|Any CPU + {7CC7946B-E026-4F66-8D4F-4F78F4801D43}.Release|x64.ActiveCfg = Release|Any CPU + {7CC7946B-E026-4F66-8D4F-4F78F4801D43}.Release|x64.Build.0 = Release|Any CPU + {7CC7946B-E026-4F66-8D4F-4F78F4801D43}.Release|x86.ActiveCfg = Release|Any CPU + {7CC7946B-E026-4F66-8D4F-4F78F4801D43}.Release|x86.Build.0 = Release|Any CPU {2C282467-2CD5-4750-BE1F-CA8BD8ECC6EA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2C282467-2CD5-4750-BE1F-CA8BD8ECC6EA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2C282467-2CD5-4750-BE1F-CA8BD8ECC6EA}.Debug|x64.ActiveCfg = Debug|Any CPU + {2C282467-2CD5-4750-BE1F-CA8BD8ECC6EA}.Debug|x64.Build.0 = Debug|Any CPU + {2C282467-2CD5-4750-BE1F-CA8BD8ECC6EA}.Debug|x86.ActiveCfg = Debug|Any CPU + {2C282467-2CD5-4750-BE1F-CA8BD8ECC6EA}.Debug|x86.Build.0 = Debug|Any CPU {2C282467-2CD5-4750-BE1F-CA8BD8ECC6EA}.Release|Any CPU.ActiveCfg = Release|Any CPU {2C282467-2CD5-4750-BE1F-CA8BD8ECC6EA}.Release|Any CPU.Build.0 = Release|Any CPU + {2C282467-2CD5-4750-BE1F-CA8BD8ECC6EA}.Release|x64.ActiveCfg = Release|Any CPU + {2C282467-2CD5-4750-BE1F-CA8BD8ECC6EA}.Release|x64.Build.0 = Release|Any CPU + {2C282467-2CD5-4750-BE1F-CA8BD8ECC6EA}.Release|x86.ActiveCfg = Release|Any CPU + {2C282467-2CD5-4750-BE1F-CA8BD8ECC6EA}.Release|x86.Build.0 = Release|Any CPU {DDEC5D74-212F-41BD-974C-4B4E88E574E1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DDEC5D74-212F-41BD-974C-4B4E88E574E1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DDEC5D74-212F-41BD-974C-4B4E88E574E1}.Debug|x64.ActiveCfg = Debug|Any CPU + {DDEC5D74-212F-41BD-974C-4B4E88E574E1}.Debug|x64.Build.0 = Debug|Any CPU + {DDEC5D74-212F-41BD-974C-4B4E88E574E1}.Debug|x86.ActiveCfg = Debug|Any CPU + {DDEC5D74-212F-41BD-974C-4B4E88E574E1}.Debug|x86.Build.0 = Debug|Any CPU {DDEC5D74-212F-41BD-974C-4B4E88E574E1}.Release|Any CPU.ActiveCfg = Release|Any CPU {DDEC5D74-212F-41BD-974C-4B4E88E574E1}.Release|Any CPU.Build.0 = Release|Any CPU + {DDEC5D74-212F-41BD-974C-4B4E88E574E1}.Release|x64.ActiveCfg = Release|Any CPU + {DDEC5D74-212F-41BD-974C-4B4E88E574E1}.Release|x64.Build.0 = Release|Any CPU + {DDEC5D74-212F-41BD-974C-4B4E88E574E1}.Release|x86.ActiveCfg = Release|Any CPU + {DDEC5D74-212F-41BD-974C-4B4E88E574E1}.Release|x86.Build.0 = Release|Any CPU {A1AE63E9-0CF4-4AFB-A584-65D826DEA3CB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A1AE63E9-0CF4-4AFB-A584-65D826DEA3CB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A1AE63E9-0CF4-4AFB-A584-65D826DEA3CB}.Debug|x64.ActiveCfg = Debug|Any CPU + {A1AE63E9-0CF4-4AFB-A584-65D826DEA3CB}.Debug|x64.Build.0 = Debug|Any CPU + {A1AE63E9-0CF4-4AFB-A584-65D826DEA3CB}.Debug|x86.ActiveCfg = Debug|Any CPU + {A1AE63E9-0CF4-4AFB-A584-65D826DEA3CB}.Debug|x86.Build.0 = Debug|Any CPU {A1AE63E9-0CF4-4AFB-A584-65D826DEA3CB}.Release|Any CPU.ActiveCfg = Release|Any CPU {A1AE63E9-0CF4-4AFB-A584-65D826DEA3CB}.Release|Any CPU.Build.0 = Release|Any CPU + {A1AE63E9-0CF4-4AFB-A584-65D826DEA3CB}.Release|x64.ActiveCfg = Release|Any CPU + {A1AE63E9-0CF4-4AFB-A584-65D826DEA3CB}.Release|x64.Build.0 = Release|Any CPU + {A1AE63E9-0CF4-4AFB-A584-65D826DEA3CB}.Release|x86.ActiveCfg = Release|Any CPU + {A1AE63E9-0CF4-4AFB-A584-65D826DEA3CB}.Release|x86.Build.0 = Release|Any CPU {3FB342CA-23B6-4795-91EF-C664527C07B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3FB342CA-23B6-4795-91EF-C664527C07B7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3FB342CA-23B6-4795-91EF-C664527C07B7}.Debug|x64.ActiveCfg = Debug|Any CPU + {3FB342CA-23B6-4795-91EF-C664527C07B7}.Debug|x64.Build.0 = Debug|Any CPU + {3FB342CA-23B6-4795-91EF-C664527C07B7}.Debug|x86.ActiveCfg = Debug|Any CPU + {3FB342CA-23B6-4795-91EF-C664527C07B7}.Debug|x86.Build.0 = Debug|Any CPU {3FB342CA-23B6-4795-91EF-C664527C07B7}.Release|Any CPU.ActiveCfg = Release|Any CPU {3FB342CA-23B6-4795-91EF-C664527C07B7}.Release|Any CPU.Build.0 = Release|Any CPU + {3FB342CA-23B6-4795-91EF-C664527C07B7}.Release|x64.ActiveCfg = Release|Any CPU + {3FB342CA-23B6-4795-91EF-C664527C07B7}.Release|x64.Build.0 = Release|Any CPU + {3FB342CA-23B6-4795-91EF-C664527C07B7}.Release|x86.ActiveCfg = Release|Any CPU + {3FB342CA-23B6-4795-91EF-C664527C07B7}.Release|x86.Build.0 = Release|Any CPU {8CECCEAF-F0D8-4257-96BA-EACF4763AF42}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8CECCEAF-F0D8-4257-96BA-EACF4763AF42}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8CECCEAF-F0D8-4257-96BA-EACF4763AF42}.Debug|x64.ActiveCfg = Debug|Any CPU + {8CECCEAF-F0D8-4257-96BA-EACF4763AF42}.Debug|x64.Build.0 = Debug|Any CPU + {8CECCEAF-F0D8-4257-96BA-EACF4763AF42}.Debug|x86.ActiveCfg = Debug|Any CPU + {8CECCEAF-F0D8-4257-96BA-EACF4763AF42}.Debug|x86.Build.0 = Debug|Any CPU {8CECCEAF-F0D8-4257-96BA-EACF4763AF42}.Release|Any CPU.ActiveCfg = Release|Any CPU {8CECCEAF-F0D8-4257-96BA-EACF4763AF42}.Release|Any CPU.Build.0 = Release|Any CPU + {8CECCEAF-F0D8-4257-96BA-EACF4763AF42}.Release|x64.ActiveCfg = Release|Any CPU + {8CECCEAF-F0D8-4257-96BA-EACF4763AF42}.Release|x64.Build.0 = Release|Any CPU + {8CECCEAF-F0D8-4257-96BA-EACF4763AF42}.Release|x86.ActiveCfg = Release|Any CPU + {8CECCEAF-F0D8-4257-96BA-EACF4763AF42}.Release|x86.Build.0 = Release|Any CPU {B31FFAE3-5DAC-4E51-BD17-F7446B741A36}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B31FFAE3-5DAC-4E51-BD17-F7446B741A36}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B31FFAE3-5DAC-4E51-BD17-F7446B741A36}.Debug|x64.ActiveCfg = Debug|Any CPU + {B31FFAE3-5DAC-4E51-BD17-F7446B741A36}.Debug|x64.Build.0 = Debug|Any CPU + {B31FFAE3-5DAC-4E51-BD17-F7446B741A36}.Debug|x86.ActiveCfg = Debug|Any CPU + {B31FFAE3-5DAC-4E51-BD17-F7446B741A36}.Debug|x86.Build.0 = Debug|Any CPU {B31FFAE3-5DAC-4E51-BD17-F7446B741A36}.Release|Any CPU.ActiveCfg = Release|Any CPU {B31FFAE3-5DAC-4E51-BD17-F7446B741A36}.Release|Any CPU.Build.0 = Release|Any CPU + {B31FFAE3-5DAC-4E51-BD17-F7446B741A36}.Release|x64.ActiveCfg = Release|Any CPU + {B31FFAE3-5DAC-4E51-BD17-F7446B741A36}.Release|x64.Build.0 = Release|Any CPU + {B31FFAE3-5DAC-4E51-BD17-F7446B741A36}.Release|x86.ActiveCfg = Release|Any CPU + {B31FFAE3-5DAC-4E51-BD17-F7446B741A36}.Release|x86.Build.0 = Release|Any CPU {BF9AB22C-F48D-4DDE-A894-BC28EB37166B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BF9AB22C-F48D-4DDE-A894-BC28EB37166B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF9AB22C-F48D-4DDE-A894-BC28EB37166B}.Debug|x64.ActiveCfg = Debug|Any CPU + {BF9AB22C-F48D-4DDE-A894-BC28EB37166B}.Debug|x64.Build.0 = Debug|Any CPU + {BF9AB22C-F48D-4DDE-A894-BC28EB37166B}.Debug|x86.ActiveCfg = Debug|Any CPU + {BF9AB22C-F48D-4DDE-A894-BC28EB37166B}.Debug|x86.Build.0 = Debug|Any CPU {BF9AB22C-F48D-4DDE-A894-BC28EB37166B}.Release|Any CPU.ActiveCfg = Release|Any CPU {BF9AB22C-F48D-4DDE-A894-BC28EB37166B}.Release|Any CPU.Build.0 = Release|Any CPU + {BF9AB22C-F48D-4DDE-A894-BC28EB37166B}.Release|x64.ActiveCfg = Release|Any CPU + {BF9AB22C-F48D-4DDE-A894-BC28EB37166B}.Release|x64.Build.0 = Release|Any CPU + {BF9AB22C-F48D-4DDE-A894-BC28EB37166B}.Release|x86.ActiveCfg = Release|Any CPU + {BF9AB22C-F48D-4DDE-A894-BC28EB37166B}.Release|x86.Build.0 = Release|Any CPU {C761A3F7-787D-4C7E-A41C-5FAB07F6B774}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C761A3F7-787D-4C7E-A41C-5FAB07F6B774}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C761A3F7-787D-4C7E-A41C-5FAB07F6B774}.Debug|x64.ActiveCfg = Debug|Any CPU + {C761A3F7-787D-4C7E-A41C-5FAB07F6B774}.Debug|x64.Build.0 = Debug|Any CPU + {C761A3F7-787D-4C7E-A41C-5FAB07F6B774}.Debug|x86.ActiveCfg = Debug|Any CPU + {C761A3F7-787D-4C7E-A41C-5FAB07F6B774}.Debug|x86.Build.0 = Debug|Any CPU {C761A3F7-787D-4C7E-A41C-5FAB07F6B774}.Release|Any CPU.ActiveCfg = Release|Any CPU {C761A3F7-787D-4C7E-A41C-5FAB07F6B774}.Release|Any CPU.Build.0 = Release|Any CPU + {C761A3F7-787D-4C7E-A41C-5FAB07F6B774}.Release|x64.ActiveCfg = Release|Any CPU + {C761A3F7-787D-4C7E-A41C-5FAB07F6B774}.Release|x64.Build.0 = Release|Any CPU + {C761A3F7-787D-4C7E-A41C-5FAB07F6B774}.Release|x86.ActiveCfg = Release|Any CPU + {C761A3F7-787D-4C7E-A41C-5FAB07F6B774}.Release|x86.Build.0 = Release|Any CPU {CECE1288-B5A1-4A6B-BEE0-331861F94983}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CECE1288-B5A1-4A6B-BEE0-331861F94983}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CECE1288-B5A1-4A6B-BEE0-331861F94983}.Debug|x64.ActiveCfg = Debug|Any CPU + {CECE1288-B5A1-4A6B-BEE0-331861F94983}.Debug|x64.Build.0 = Debug|Any CPU + {CECE1288-B5A1-4A6B-BEE0-331861F94983}.Debug|x86.ActiveCfg = Debug|Any CPU + {CECE1288-B5A1-4A6B-BEE0-331861F94983}.Debug|x86.Build.0 = Debug|Any CPU {CECE1288-B5A1-4A6B-BEE0-331861F94983}.Release|Any CPU.ActiveCfg = Release|Any CPU {CECE1288-B5A1-4A6B-BEE0-331861F94983}.Release|Any CPU.Build.0 = Release|Any CPU + {CECE1288-B5A1-4A6B-BEE0-331861F94983}.Release|x64.ActiveCfg = Release|Any CPU + {CECE1288-B5A1-4A6B-BEE0-331861F94983}.Release|x64.Build.0 = Release|Any CPU + {CECE1288-B5A1-4A6B-BEE0-331861F94983}.Release|x86.ActiveCfg = Release|Any CPU + {CECE1288-B5A1-4A6B-BEE0-331861F94983}.Release|x86.Build.0 = Release|Any CPU {053F7446-0545-482E-9F29-9C96B926966C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {053F7446-0545-482E-9F29-9C96B926966C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {053F7446-0545-482E-9F29-9C96B926966C}.Debug|x64.ActiveCfg = Debug|Any CPU + {053F7446-0545-482E-9F29-9C96B926966C}.Debug|x64.Build.0 = Debug|Any CPU + {053F7446-0545-482E-9F29-9C96B926966C}.Debug|x86.ActiveCfg = Debug|Any CPU + {053F7446-0545-482E-9F29-9C96B926966C}.Debug|x86.Build.0 = Debug|Any CPU {053F7446-0545-482E-9F29-9C96B926966C}.Release|Any CPU.ActiveCfg = Release|Any CPU {053F7446-0545-482E-9F29-9C96B926966C}.Release|Any CPU.Build.0 = Release|Any CPU + {053F7446-0545-482E-9F29-9C96B926966C}.Release|x64.ActiveCfg = Release|Any CPU + {053F7446-0545-482E-9F29-9C96B926966C}.Release|x64.Build.0 = Release|Any CPU + {053F7446-0545-482E-9F29-9C96B926966C}.Release|x86.ActiveCfg = Release|Any CPU + {053F7446-0545-482E-9F29-9C96B926966C}.Release|x86.Build.0 = Release|Any CPU {D8BE64D2-BD83-40F5-9783-D7FDDF668C45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D8BE64D2-BD83-40F5-9783-D7FDDF668C45}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D8BE64D2-BD83-40F5-9783-D7FDDF668C45}.Debug|x64.ActiveCfg = Debug|Any CPU + {D8BE64D2-BD83-40F5-9783-D7FDDF668C45}.Debug|x64.Build.0 = Debug|Any CPU + {D8BE64D2-BD83-40F5-9783-D7FDDF668C45}.Debug|x86.ActiveCfg = Debug|Any CPU + {D8BE64D2-BD83-40F5-9783-D7FDDF668C45}.Debug|x86.Build.0 = Debug|Any CPU {D8BE64D2-BD83-40F5-9783-D7FDDF668C45}.Release|Any CPU.ActiveCfg = Release|Any CPU {D8BE64D2-BD83-40F5-9783-D7FDDF668C45}.Release|Any CPU.Build.0 = Release|Any CPU + {D8BE64D2-BD83-40F5-9783-D7FDDF668C45}.Release|x64.ActiveCfg = Release|Any CPU + {D8BE64D2-BD83-40F5-9783-D7FDDF668C45}.Release|x64.Build.0 = Release|Any CPU + {D8BE64D2-BD83-40F5-9783-D7FDDF668C45}.Release|x86.ActiveCfg = Release|Any CPU + {D8BE64D2-BD83-40F5-9783-D7FDDF668C45}.Release|x86.Build.0 = Release|Any CPU {CE12E5C2-7B3E-4637-B6A3-274BB5C3DE16}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CE12E5C2-7B3E-4637-B6A3-274BB5C3DE16}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CE12E5C2-7B3E-4637-B6A3-274BB5C3DE16}.Debug|x64.ActiveCfg = Debug|Any CPU + {CE12E5C2-7B3E-4637-B6A3-274BB5C3DE16}.Debug|x64.Build.0 = Debug|Any CPU + {CE12E5C2-7B3E-4637-B6A3-274BB5C3DE16}.Debug|x86.ActiveCfg = Debug|Any CPU + {CE12E5C2-7B3E-4637-B6A3-274BB5C3DE16}.Debug|x86.Build.0 = Debug|Any CPU {CE12E5C2-7B3E-4637-B6A3-274BB5C3DE16}.Release|Any CPU.ActiveCfg = Release|Any CPU {CE12E5C2-7B3E-4637-B6A3-274BB5C3DE16}.Release|Any CPU.Build.0 = Release|Any CPU + {CE12E5C2-7B3E-4637-B6A3-274BB5C3DE16}.Release|x64.ActiveCfg = Release|Any CPU + {CE12E5C2-7B3E-4637-B6A3-274BB5C3DE16}.Release|x64.Build.0 = Release|Any CPU + {CE12E5C2-7B3E-4637-B6A3-274BB5C3DE16}.Release|x86.ActiveCfg = Release|Any CPU + {CE12E5C2-7B3E-4637-B6A3-274BB5C3DE16}.Release|x86.Build.0 = Release|Any CPU {D2F3594F-E2B9-4338-A022-F00C4E9A14C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D2F3594F-E2B9-4338-A022-F00C4E9A14C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D2F3594F-E2B9-4338-A022-F00C4E9A14C3}.Debug|x64.ActiveCfg = Debug|Any CPU + {D2F3594F-E2B9-4338-A022-F00C4E9A14C3}.Debug|x64.Build.0 = Debug|Any CPU + {D2F3594F-E2B9-4338-A022-F00C4E9A14C3}.Debug|x86.ActiveCfg = Debug|Any CPU + {D2F3594F-E2B9-4338-A022-F00C4E9A14C3}.Debug|x86.Build.0 = Debug|Any CPU {D2F3594F-E2B9-4338-A022-F00C4E9A14C3}.Release|Any CPU.ActiveCfg = Release|Any CPU {D2F3594F-E2B9-4338-A022-F00C4E9A14C3}.Release|Any CPU.Build.0 = Release|Any CPU + {D2F3594F-E2B9-4338-A022-F00C4E9A14C3}.Release|x64.ActiveCfg = Release|Any CPU + {D2F3594F-E2B9-4338-A022-F00C4E9A14C3}.Release|x64.Build.0 = Release|Any CPU + {D2F3594F-E2B9-4338-A022-F00C4E9A14C3}.Release|x86.ActiveCfg = Release|Any CPU + {D2F3594F-E2B9-4338-A022-F00C4E9A14C3}.Release|x86.Build.0 = Release|Any CPU {8343BE23-6A7B-4C58-BF0D-95188B11B180}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8343BE23-6A7B-4C58-BF0D-95188B11B180}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8343BE23-6A7B-4C58-BF0D-95188B11B180}.Debug|x64.ActiveCfg = Debug|Any CPU + {8343BE23-6A7B-4C58-BF0D-95188B11B180}.Debug|x64.Build.0 = Debug|Any CPU + {8343BE23-6A7B-4C58-BF0D-95188B11B180}.Debug|x86.ActiveCfg = Debug|Any CPU + {8343BE23-6A7B-4C58-BF0D-95188B11B180}.Debug|x86.Build.0 = Debug|Any CPU {8343BE23-6A7B-4C58-BF0D-95188B11B180}.Release|Any CPU.ActiveCfg = Release|Any CPU {8343BE23-6A7B-4C58-BF0D-95188B11B180}.Release|Any CPU.Build.0 = Release|Any CPU + {8343BE23-6A7B-4C58-BF0D-95188B11B180}.Release|x64.ActiveCfg = Release|Any CPU + {8343BE23-6A7B-4C58-BF0D-95188B11B180}.Release|x64.Build.0 = Release|Any CPU + {8343BE23-6A7B-4C58-BF0D-95188B11B180}.Release|x86.ActiveCfg = Release|Any CPU + {8343BE23-6A7B-4C58-BF0D-95188B11B180}.Release|x86.Build.0 = Release|Any CPU {27D76546-6091-4AEE-9079-1FE3991C81BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {27D76546-6091-4AEE-9079-1FE3991C81BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {27D76546-6091-4AEE-9079-1FE3991C81BC}.Debug|x64.ActiveCfg = Debug|Any CPU + {27D76546-6091-4AEE-9079-1FE3991C81BC}.Debug|x64.Build.0 = Debug|Any CPU + {27D76546-6091-4AEE-9079-1FE3991C81BC}.Debug|x86.ActiveCfg = Debug|Any CPU + {27D76546-6091-4AEE-9079-1FE3991C81BC}.Debug|x86.Build.0 = Debug|Any CPU {27D76546-6091-4AEE-9079-1FE3991C81BC}.Release|Any CPU.ActiveCfg = Release|Any CPU {27D76546-6091-4AEE-9079-1FE3991C81BC}.Release|Any CPU.Build.0 = Release|Any CPU + {27D76546-6091-4AEE-9079-1FE3991C81BC}.Release|x64.ActiveCfg = Release|Any CPU + {27D76546-6091-4AEE-9079-1FE3991C81BC}.Release|x64.Build.0 = Release|Any CPU + {27D76546-6091-4AEE-9079-1FE3991C81BC}.Release|x86.ActiveCfg = Release|Any CPU + {27D76546-6091-4AEE-9079-1FE3991C81BC}.Release|x86.Build.0 = Release|Any CPU {DE160F1A-92FB-44BA-87E2-B8AD7A938AC7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DE160F1A-92FB-44BA-87E2-B8AD7A938AC7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DE160F1A-92FB-44BA-87E2-B8AD7A938AC7}.Debug|x64.ActiveCfg = Debug|Any CPU + {DE160F1A-92FB-44BA-87E2-B8AD7A938AC7}.Debug|x64.Build.0 = Debug|Any CPU + {DE160F1A-92FB-44BA-87E2-B8AD7A938AC7}.Debug|x86.ActiveCfg = Debug|Any CPU + {DE160F1A-92FB-44BA-87E2-B8AD7A938AC7}.Debug|x86.Build.0 = Debug|Any CPU {DE160F1A-92FB-44BA-87E2-B8AD7A938AC7}.Release|Any CPU.ActiveCfg = Release|Any CPU {DE160F1A-92FB-44BA-87E2-B8AD7A938AC7}.Release|Any CPU.Build.0 = Release|Any CPU + {DE160F1A-92FB-44BA-87E2-B8AD7A938AC7}.Release|x64.ActiveCfg = Release|Any CPU + {DE160F1A-92FB-44BA-87E2-B8AD7A938AC7}.Release|x64.Build.0 = Release|Any CPU + {DE160F1A-92FB-44BA-87E2-B8AD7A938AC7}.Release|x86.ActiveCfg = Release|Any CPU + {DE160F1A-92FB-44BA-87E2-B8AD7A938AC7}.Release|x86.Build.0 = Release|Any CPU {CF564447-8E0B-4A07-B0D2-396E00A8E437}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CF564447-8E0B-4A07-B0D2-396E00A8E437}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CF564447-8E0B-4A07-B0D2-396E00A8E437}.Debug|x64.ActiveCfg = Debug|Any CPU + {CF564447-8E0B-4A07-B0D2-396E00A8E437}.Debug|x64.Build.0 = Debug|Any CPU + {CF564447-8E0B-4A07-B0D2-396E00A8E437}.Debug|x86.ActiveCfg = Debug|Any CPU + {CF564447-8E0B-4A07-B0D2-396E00A8E437}.Debug|x86.Build.0 = Debug|Any CPU {CF564447-8E0B-4A07-B0D2-396E00A8E437}.Release|Any CPU.ActiveCfg = Release|Any CPU {CF564447-8E0B-4A07-B0D2-396E00A8E437}.Release|Any CPU.Build.0 = Release|Any CPU + {CF564447-8E0B-4A07-B0D2-396E00A8E437}.Release|x64.ActiveCfg = Release|Any CPU + {CF564447-8E0B-4A07-B0D2-396E00A8E437}.Release|x64.Build.0 = Release|Any CPU + {CF564447-8E0B-4A07-B0D2-396E00A8E437}.Release|x86.ActiveCfg = Release|Any CPU + {CF564447-8E0B-4A07-B0D2-396E00A8E437}.Release|x86.Build.0 = Release|Any CPU {D0279C94-E9A3-4A1B-968B-D3BBF3E06FD8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D0279C94-E9A3-4A1B-968B-D3BBF3E06FD8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D0279C94-E9A3-4A1B-968B-D3BBF3E06FD8}.Debug|x64.ActiveCfg = Debug|Any CPU + {D0279C94-E9A3-4A1B-968B-D3BBF3E06FD8}.Debug|x64.Build.0 = Debug|Any CPU + {D0279C94-E9A3-4A1B-968B-D3BBF3E06FD8}.Debug|x86.ActiveCfg = Debug|Any CPU + {D0279C94-E9A3-4A1B-968B-D3BBF3E06FD8}.Debug|x86.Build.0 = Debug|Any CPU {D0279C94-E9A3-4A1B-968B-D3BBF3E06FD8}.Release|Any CPU.ActiveCfg = Release|Any CPU {D0279C94-E9A3-4A1B-968B-D3BBF3E06FD8}.Release|Any CPU.Build.0 = Release|Any CPU + {D0279C94-E9A3-4A1B-968B-D3BBF3E06FD8}.Release|x64.ActiveCfg = Release|Any CPU + {D0279C94-E9A3-4A1B-968B-D3BBF3E06FD8}.Release|x64.Build.0 = Release|Any CPU + {D0279C94-E9A3-4A1B-968B-D3BBF3E06FD8}.Release|x86.ActiveCfg = Release|Any CPU + {D0279C94-E9A3-4A1B-968B-D3BBF3E06FD8}.Release|x86.Build.0 = Release|Any CPU {4C2F7B03-C598-4432-A43A-B065D9D0712F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4C2F7B03-C598-4432-A43A-B065D9D0712F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4C2F7B03-C598-4432-A43A-B065D9D0712F}.Debug|x64.ActiveCfg = Debug|Any CPU + {4C2F7B03-C598-4432-A43A-B065D9D0712F}.Debug|x64.Build.0 = Debug|Any CPU + {4C2F7B03-C598-4432-A43A-B065D9D0712F}.Debug|x86.ActiveCfg = Debug|Any CPU + {4C2F7B03-C598-4432-A43A-B065D9D0712F}.Debug|x86.Build.0 = Debug|Any CPU {4C2F7B03-C598-4432-A43A-B065D9D0712F}.Release|Any CPU.ActiveCfg = Release|Any CPU {4C2F7B03-C598-4432-A43A-B065D9D0712F}.Release|Any CPU.Build.0 = Release|Any CPU + {4C2F7B03-C598-4432-A43A-B065D9D0712F}.Release|x64.ActiveCfg = Release|Any CPU + {4C2F7B03-C598-4432-A43A-B065D9D0712F}.Release|x64.Build.0 = Release|Any CPU + {4C2F7B03-C598-4432-A43A-B065D9D0712F}.Release|x86.ActiveCfg = Release|Any CPU + {4C2F7B03-C598-4432-A43A-B065D9D0712F}.Release|x86.Build.0 = Release|Any CPU {01A70034-D353-4BF9-821D-F2B6F7641532}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {01A70034-D353-4BF9-821D-F2B6F7641532}.Debug|Any CPU.Build.0 = Debug|Any CPU + {01A70034-D353-4BF9-821D-F2B6F7641532}.Debug|x64.ActiveCfg = Debug|Any CPU + {01A70034-D353-4BF9-821D-F2B6F7641532}.Debug|x64.Build.0 = Debug|Any CPU + {01A70034-D353-4BF9-821D-F2B6F7641532}.Debug|x86.ActiveCfg = Debug|Any CPU + {01A70034-D353-4BF9-821D-F2B6F7641532}.Debug|x86.Build.0 = Debug|Any CPU {01A70034-D353-4BF9-821D-F2B6F7641532}.Release|Any CPU.ActiveCfg = Release|Any CPU {01A70034-D353-4BF9-821D-F2B6F7641532}.Release|Any CPU.Build.0 = Release|Any CPU + {01A70034-D353-4BF9-821D-F2B6F7641532}.Release|x64.ActiveCfg = Release|Any CPU + {01A70034-D353-4BF9-821D-F2B6F7641532}.Release|x64.Build.0 = Release|Any CPU + {01A70034-D353-4BF9-821D-F2B6F7641532}.Release|x86.ActiveCfg = Release|Any CPU + {01A70034-D353-4BF9-821D-F2B6F7641532}.Release|x86.Build.0 = Release|Any CPU {D5E2FB37-0194-480A-B952-5FFECC1200EB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D5E2FB37-0194-480A-B952-5FFECC1200EB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5E2FB37-0194-480A-B952-5FFECC1200EB}.Debug|x64.ActiveCfg = Debug|Any CPU + {D5E2FB37-0194-480A-B952-5FFECC1200EB}.Debug|x64.Build.0 = Debug|Any CPU + {D5E2FB37-0194-480A-B952-5FFECC1200EB}.Debug|x86.ActiveCfg = Debug|Any CPU + {D5E2FB37-0194-480A-B952-5FFECC1200EB}.Debug|x86.Build.0 = Debug|Any CPU {D5E2FB37-0194-480A-B952-5FFECC1200EB}.Release|Any CPU.ActiveCfg = Release|Any CPU {D5E2FB37-0194-480A-B952-5FFECC1200EB}.Release|Any CPU.Build.0 = Release|Any CPU + {D5E2FB37-0194-480A-B952-5FFECC1200EB}.Release|x64.ActiveCfg = Release|Any CPU + {D5E2FB37-0194-480A-B952-5FFECC1200EB}.Release|x64.Build.0 = Release|Any CPU + {D5E2FB37-0194-480A-B952-5FFECC1200EB}.Release|x86.ActiveCfg = Release|Any CPU + {D5E2FB37-0194-480A-B952-5FFECC1200EB}.Release|x86.Build.0 = Release|Any CPU {703BD43C-02B9-413F-854C-9CBA0C963196}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {703BD43C-02B9-413F-854C-9CBA0C963196}.Debug|Any CPU.Build.0 = Debug|Any CPU + {703BD43C-02B9-413F-854C-9CBA0C963196}.Debug|x64.ActiveCfg = Debug|Any CPU + {703BD43C-02B9-413F-854C-9CBA0C963196}.Debug|x64.Build.0 = Debug|Any CPU + {703BD43C-02B9-413F-854C-9CBA0C963196}.Debug|x86.ActiveCfg = Debug|Any CPU + {703BD43C-02B9-413F-854C-9CBA0C963196}.Debug|x86.Build.0 = Debug|Any CPU {703BD43C-02B9-413F-854C-9CBA0C963196}.Release|Any CPU.ActiveCfg = Release|Any CPU {703BD43C-02B9-413F-854C-9CBA0C963196}.Release|Any CPU.Build.0 = Release|Any CPU + {703BD43C-02B9-413F-854C-9CBA0C963196}.Release|x64.ActiveCfg = Release|Any CPU + {703BD43C-02B9-413F-854C-9CBA0C963196}.Release|x64.Build.0 = Release|Any CPU + {703BD43C-02B9-413F-854C-9CBA0C963196}.Release|x86.ActiveCfg = Release|Any CPU + {703BD43C-02B9-413F-854C-9CBA0C963196}.Release|x86.Build.0 = Release|Any CPU {3AF7C7F5-6513-47D4-8DD0-6E1AF14568D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3AF7C7F5-6513-47D4-8DD0-6E1AF14568D8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3AF7C7F5-6513-47D4-8DD0-6E1AF14568D8}.Debug|x64.ActiveCfg = Debug|Any CPU + {3AF7C7F5-6513-47D4-8DD0-6E1AF14568D8}.Debug|x64.Build.0 = Debug|Any CPU + {3AF7C7F5-6513-47D4-8DD0-6E1AF14568D8}.Debug|x86.ActiveCfg = Debug|Any CPU + {3AF7C7F5-6513-47D4-8DD0-6E1AF14568D8}.Debug|x86.Build.0 = Debug|Any CPU {3AF7C7F5-6513-47D4-8DD0-6E1AF14568D8}.Release|Any CPU.ActiveCfg = Release|Any CPU {3AF7C7F5-6513-47D4-8DD0-6E1AF14568D8}.Release|Any CPU.Build.0 = Release|Any CPU + {3AF7C7F5-6513-47D4-8DD0-6E1AF14568D8}.Release|x64.ActiveCfg = Release|Any CPU + {3AF7C7F5-6513-47D4-8DD0-6E1AF14568D8}.Release|x64.Build.0 = Release|Any CPU + {3AF7C7F5-6513-47D4-8DD0-6E1AF14568D8}.Release|x86.ActiveCfg = Release|Any CPU + {3AF7C7F5-6513-47D4-8DD0-6E1AF14568D8}.Release|x86.Build.0 = Release|Any CPU {2B48CF90-DBDB-469F-941C-5B5AECEEACE0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2B48CF90-DBDB-469F-941C-5B5AECEEACE0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2B48CF90-DBDB-469F-941C-5B5AECEEACE0}.Debug|x64.ActiveCfg = Debug|Any CPU + {2B48CF90-DBDB-469F-941C-5B5AECEEACE0}.Debug|x64.Build.0 = Debug|Any CPU + {2B48CF90-DBDB-469F-941C-5B5AECEEACE0}.Debug|x86.ActiveCfg = Debug|Any CPU + {2B48CF90-DBDB-469F-941C-5B5AECEEACE0}.Debug|x86.Build.0 = Debug|Any CPU {2B48CF90-DBDB-469F-941C-5B5AECEEACE0}.Release|Any CPU.ActiveCfg = Release|Any CPU {2B48CF90-DBDB-469F-941C-5B5AECEEACE0}.Release|Any CPU.Build.0 = Release|Any CPU + {2B48CF90-DBDB-469F-941C-5B5AECEEACE0}.Release|x64.ActiveCfg = Release|Any CPU + {2B48CF90-DBDB-469F-941C-5B5AECEEACE0}.Release|x64.Build.0 = Release|Any CPU + {2B48CF90-DBDB-469F-941C-5B5AECEEACE0}.Release|x86.ActiveCfg = Release|Any CPU + {2B48CF90-DBDB-469F-941C-5B5AECEEACE0}.Release|x86.Build.0 = Release|Any CPU {127FC2BF-DC40-4370-B845-16088328264C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {127FC2BF-DC40-4370-B845-16088328264C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {127FC2BF-DC40-4370-B845-16088328264C}.Debug|x64.ActiveCfg = Debug|Any CPU + {127FC2BF-DC40-4370-B845-16088328264C}.Debug|x64.Build.0 = Debug|Any CPU + {127FC2BF-DC40-4370-B845-16088328264C}.Debug|x86.ActiveCfg = Debug|Any CPU + {127FC2BF-DC40-4370-B845-16088328264C}.Debug|x86.Build.0 = Debug|Any CPU {127FC2BF-DC40-4370-B845-16088328264C}.Release|Any CPU.ActiveCfg = Release|Any CPU {127FC2BF-DC40-4370-B845-16088328264C}.Release|Any CPU.Build.0 = Release|Any CPU + {127FC2BF-DC40-4370-B845-16088328264C}.Release|x64.ActiveCfg = Release|Any CPU + {127FC2BF-DC40-4370-B845-16088328264C}.Release|x64.Build.0 = Release|Any CPU + {127FC2BF-DC40-4370-B845-16088328264C}.Release|x86.ActiveCfg = Release|Any CPU + {127FC2BF-DC40-4370-B845-16088328264C}.Release|x86.Build.0 = Release|Any CPU {A8C8B76D-0869-4C11-AC55-DB9DD115788E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A8C8B76D-0869-4C11-AC55-DB9DD115788E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A8C8B76D-0869-4C11-AC55-DB9DD115788E}.Debug|x64.ActiveCfg = Debug|Any CPU + {A8C8B76D-0869-4C11-AC55-DB9DD115788E}.Debug|x64.Build.0 = Debug|Any CPU + {A8C8B76D-0869-4C11-AC55-DB9DD115788E}.Debug|x86.ActiveCfg = Debug|Any CPU + {A8C8B76D-0869-4C11-AC55-DB9DD115788E}.Debug|x86.Build.0 = Debug|Any CPU {A8C8B76D-0869-4C11-AC55-DB9DD115788E}.Release|Any CPU.ActiveCfg = Release|Any CPU {A8C8B76D-0869-4C11-AC55-DB9DD115788E}.Release|Any CPU.Build.0 = Release|Any CPU + {A8C8B76D-0869-4C11-AC55-DB9DD115788E}.Release|x64.ActiveCfg = Release|Any CPU + {A8C8B76D-0869-4C11-AC55-DB9DD115788E}.Release|x64.Build.0 = Release|Any CPU + {A8C8B76D-0869-4C11-AC55-DB9DD115788E}.Release|x86.ActiveCfg = Release|Any CPU + {A8C8B76D-0869-4C11-AC55-DB9DD115788E}.Release|x86.Build.0 = Release|Any CPU {6E6A7554-3488-45AB-BC0E-9BDE1F19789D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6E6A7554-3488-45AB-BC0E-9BDE1F19789D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6E6A7554-3488-45AB-BC0E-9BDE1F19789D}.Debug|x64.ActiveCfg = Debug|Any CPU + {6E6A7554-3488-45AB-BC0E-9BDE1F19789D}.Debug|x64.Build.0 = Debug|Any CPU + {6E6A7554-3488-45AB-BC0E-9BDE1F19789D}.Debug|x86.ActiveCfg = Debug|Any CPU + {6E6A7554-3488-45AB-BC0E-9BDE1F19789D}.Debug|x86.Build.0 = Debug|Any CPU {6E6A7554-3488-45AB-BC0E-9BDE1F19789D}.Release|Any CPU.ActiveCfg = Release|Any CPU {6E6A7554-3488-45AB-BC0E-9BDE1F19789D}.Release|Any CPU.Build.0 = Release|Any CPU + {6E6A7554-3488-45AB-BC0E-9BDE1F19789D}.Release|x64.ActiveCfg = Release|Any CPU + {6E6A7554-3488-45AB-BC0E-9BDE1F19789D}.Release|x64.Build.0 = Release|Any CPU + {6E6A7554-3488-45AB-BC0E-9BDE1F19789D}.Release|x86.ActiveCfg = Release|Any CPU + {6E6A7554-3488-45AB-BC0E-9BDE1F19789D}.Release|x86.Build.0 = Release|Any CPU {F79B6D80-C79B-4C13-9221-CA2345983743}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F79B6D80-C79B-4C13-9221-CA2345983743}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F79B6D80-C79B-4C13-9221-CA2345983743}.Debug|x64.ActiveCfg = Debug|Any CPU + {F79B6D80-C79B-4C13-9221-CA2345983743}.Debug|x64.Build.0 = Debug|Any CPU + {F79B6D80-C79B-4C13-9221-CA2345983743}.Debug|x86.ActiveCfg = Debug|Any CPU + {F79B6D80-C79B-4C13-9221-CA2345983743}.Debug|x86.Build.0 = Debug|Any CPU {F79B6D80-C79B-4C13-9221-CA2345983743}.Release|Any CPU.ActiveCfg = Release|Any CPU {F79B6D80-C79B-4C13-9221-CA2345983743}.Release|Any CPU.Build.0 = Release|Any CPU + {F79B6D80-C79B-4C13-9221-CA2345983743}.Release|x64.ActiveCfg = Release|Any CPU + {F79B6D80-C79B-4C13-9221-CA2345983743}.Release|x64.Build.0 = Release|Any CPU + {F79B6D80-C79B-4C13-9221-CA2345983743}.Release|x86.ActiveCfg = Release|Any CPU + {F79B6D80-C79B-4C13-9221-CA2345983743}.Release|x86.Build.0 = Release|Any CPU {A7A97BFD-48FA-45D1-8423-031BA30BEAA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A7A97BFD-48FA-45D1-8423-031BA30BEAA1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A7A97BFD-48FA-45D1-8423-031BA30BEAA1}.Debug|x64.ActiveCfg = Debug|Any CPU + {A7A97BFD-48FA-45D1-8423-031BA30BEAA1}.Debug|x64.Build.0 = Debug|Any CPU + {A7A97BFD-48FA-45D1-8423-031BA30BEAA1}.Debug|x86.ActiveCfg = Debug|Any CPU + {A7A97BFD-48FA-45D1-8423-031BA30BEAA1}.Debug|x86.Build.0 = Debug|Any CPU {A7A97BFD-48FA-45D1-8423-031BA30BEAA1}.Release|Any CPU.ActiveCfg = Release|Any CPU {A7A97BFD-48FA-45D1-8423-031BA30BEAA1}.Release|Any CPU.Build.0 = Release|Any CPU + {A7A97BFD-48FA-45D1-8423-031BA30BEAA1}.Release|x64.ActiveCfg = Release|Any CPU + {A7A97BFD-48FA-45D1-8423-031BA30BEAA1}.Release|x64.Build.0 = Release|Any CPU + {A7A97BFD-48FA-45D1-8423-031BA30BEAA1}.Release|x86.ActiveCfg = Release|Any CPU + {A7A97BFD-48FA-45D1-8423-031BA30BEAA1}.Release|x86.Build.0 = Release|Any CPU {166E89F7-A505-45F2-B4CD-F345DE39030E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {166E89F7-A505-45F2-B4CD-F345DE39030E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {166E89F7-A505-45F2-B4CD-F345DE39030E}.Debug|x64.ActiveCfg = Debug|Any CPU + {166E89F7-A505-45F2-B4CD-F345DE39030E}.Debug|x64.Build.0 = Debug|Any CPU + {166E89F7-A505-45F2-B4CD-F345DE39030E}.Debug|x86.ActiveCfg = Debug|Any CPU + {166E89F7-A505-45F2-B4CD-F345DE39030E}.Debug|x86.Build.0 = Debug|Any CPU {166E89F7-A505-45F2-B4CD-F345DE39030E}.Release|Any CPU.ActiveCfg = Release|Any CPU {166E89F7-A505-45F2-B4CD-F345DE39030E}.Release|Any CPU.Build.0 = Release|Any CPU + {166E89F7-A505-45F2-B4CD-F345DE39030E}.Release|x64.ActiveCfg = Release|Any CPU + {166E89F7-A505-45F2-B4CD-F345DE39030E}.Release|x64.Build.0 = Release|Any CPU + {166E89F7-A505-45F2-B4CD-F345DE39030E}.Release|x86.ActiveCfg = Release|Any CPU + {166E89F7-A505-45F2-B4CD-F345DE39030E}.Release|x86.Build.0 = Release|Any CPU {6E50143F-0982-4BCB-9D0E-FF5451AE8123}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6E50143F-0982-4BCB-9D0E-FF5451AE8123}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6E50143F-0982-4BCB-9D0E-FF5451AE8123}.Debug|x64.ActiveCfg = Debug|Any CPU + {6E50143F-0982-4BCB-9D0E-FF5451AE8123}.Debug|x64.Build.0 = Debug|Any CPU + {6E50143F-0982-4BCB-9D0E-FF5451AE8123}.Debug|x86.ActiveCfg = Debug|Any CPU + {6E50143F-0982-4BCB-9D0E-FF5451AE8123}.Debug|x86.Build.0 = Debug|Any CPU {6E50143F-0982-4BCB-9D0E-FF5451AE8123}.Release|Any CPU.ActiveCfg = Release|Any CPU {6E50143F-0982-4BCB-9D0E-FF5451AE8123}.Release|Any CPU.Build.0 = Release|Any CPU + {6E50143F-0982-4BCB-9D0E-FF5451AE8123}.Release|x64.ActiveCfg = Release|Any CPU + {6E50143F-0982-4BCB-9D0E-FF5451AE8123}.Release|x64.Build.0 = Release|Any CPU + {6E50143F-0982-4BCB-9D0E-FF5451AE8123}.Release|x86.ActiveCfg = Release|Any CPU + {6E50143F-0982-4BCB-9D0E-FF5451AE8123}.Release|x86.Build.0 = Release|Any CPU {3622B544-1345-4230-ABC2-4902328DE971}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3622B544-1345-4230-ABC2-4902328DE971}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3622B544-1345-4230-ABC2-4902328DE971}.Debug|x64.ActiveCfg = Debug|Any CPU + {3622B544-1345-4230-ABC2-4902328DE971}.Debug|x64.Build.0 = Debug|Any CPU + {3622B544-1345-4230-ABC2-4902328DE971}.Debug|x86.ActiveCfg = Debug|Any CPU + {3622B544-1345-4230-ABC2-4902328DE971}.Debug|x86.Build.0 = Debug|Any CPU {3622B544-1345-4230-ABC2-4902328DE971}.Release|Any CPU.ActiveCfg = Release|Any CPU {3622B544-1345-4230-ABC2-4902328DE971}.Release|Any CPU.Build.0 = Release|Any CPU + {3622B544-1345-4230-ABC2-4902328DE971}.Release|x64.ActiveCfg = Release|Any CPU + {3622B544-1345-4230-ABC2-4902328DE971}.Release|x64.Build.0 = Release|Any CPU + {3622B544-1345-4230-ABC2-4902328DE971}.Release|x86.ActiveCfg = Release|Any CPU + {3622B544-1345-4230-ABC2-4902328DE971}.Release|x86.Build.0 = Release|Any CPU {BC55B87F-D2BD-428D-8F78-A95EE7BDFDFA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BC55B87F-D2BD-428D-8F78-A95EE7BDFDFA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BC55B87F-D2BD-428D-8F78-A95EE7BDFDFA}.Debug|x64.ActiveCfg = Debug|Any CPU + {BC55B87F-D2BD-428D-8F78-A95EE7BDFDFA}.Debug|x64.Build.0 = Debug|Any CPU + {BC55B87F-D2BD-428D-8F78-A95EE7BDFDFA}.Debug|x86.ActiveCfg = Debug|Any CPU + {BC55B87F-D2BD-428D-8F78-A95EE7BDFDFA}.Debug|x86.Build.0 = Debug|Any CPU {BC55B87F-D2BD-428D-8F78-A95EE7BDFDFA}.Release|Any CPU.ActiveCfg = Release|Any CPU {BC55B87F-D2BD-428D-8F78-A95EE7BDFDFA}.Release|Any CPU.Build.0 = Release|Any CPU + {BC55B87F-D2BD-428D-8F78-A95EE7BDFDFA}.Release|x64.ActiveCfg = Release|Any CPU + {BC55B87F-D2BD-428D-8F78-A95EE7BDFDFA}.Release|x64.Build.0 = Release|Any CPU + {BC55B87F-D2BD-428D-8F78-A95EE7BDFDFA}.Release|x86.ActiveCfg = Release|Any CPU + {BC55B87F-D2BD-428D-8F78-A95EE7BDFDFA}.Release|x86.Build.0 = Release|Any CPU {5E7381EE-54BC-4BFD-883A-8C6578C2CAD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5E7381EE-54BC-4BFD-883A-8C6578C2CAD7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5E7381EE-54BC-4BFD-883A-8C6578C2CAD7}.Debug|x64.ActiveCfg = Debug|Any CPU + {5E7381EE-54BC-4BFD-883A-8C6578C2CAD7}.Debug|x64.Build.0 = Debug|Any CPU + {5E7381EE-54BC-4BFD-883A-8C6578C2CAD7}.Debug|x86.ActiveCfg = Debug|Any CPU + {5E7381EE-54BC-4BFD-883A-8C6578C2CAD7}.Debug|x86.Build.0 = Debug|Any CPU {5E7381EE-54BC-4BFD-883A-8C6578C2CAD7}.Release|Any CPU.ActiveCfg = Release|Any CPU {5E7381EE-54BC-4BFD-883A-8C6578C2CAD7}.Release|Any CPU.Build.0 = Release|Any CPU + {5E7381EE-54BC-4BFD-883A-8C6578C2CAD7}.Release|x64.ActiveCfg = Release|Any CPU + {5E7381EE-54BC-4BFD-883A-8C6578C2CAD7}.Release|x64.Build.0 = Release|Any CPU + {5E7381EE-54BC-4BFD-883A-8C6578C2CAD7}.Release|x86.ActiveCfg = Release|Any CPU + {5E7381EE-54BC-4BFD-883A-8C6578C2CAD7}.Release|x86.Build.0 = Release|Any CPU {5D2275B7-0745-420A-AF1C-32C563DAB5C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5D2275B7-0745-420A-AF1C-32C563DAB5C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5D2275B7-0745-420A-AF1C-32C563DAB5C8}.Debug|x64.ActiveCfg = Debug|Any CPU + {5D2275B7-0745-420A-AF1C-32C563DAB5C8}.Debug|x64.Build.0 = Debug|Any CPU + {5D2275B7-0745-420A-AF1C-32C563DAB5C8}.Debug|x86.ActiveCfg = Debug|Any CPU + {5D2275B7-0745-420A-AF1C-32C563DAB5C8}.Debug|x86.Build.0 = Debug|Any CPU {5D2275B7-0745-420A-AF1C-32C563DAB5C8}.Release|Any CPU.ActiveCfg = Release|Any CPU {5D2275B7-0745-420A-AF1C-32C563DAB5C8}.Release|Any CPU.Build.0 = Release|Any CPU + {5D2275B7-0745-420A-AF1C-32C563DAB5C8}.Release|x64.ActiveCfg = Release|Any CPU + {5D2275B7-0745-420A-AF1C-32C563DAB5C8}.Release|x64.Build.0 = Release|Any CPU + {5D2275B7-0745-420A-AF1C-32C563DAB5C8}.Release|x86.ActiveCfg = Release|Any CPU + {5D2275B7-0745-420A-AF1C-32C563DAB5C8}.Release|x86.Build.0 = Release|Any CPU {10EB789E-C993-4BE8-BA43-C419936C7233}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {10EB789E-C993-4BE8-BA43-C419936C7233}.Debug|Any CPU.Build.0 = Debug|Any CPU + {10EB789E-C993-4BE8-BA43-C419936C7233}.Debug|x64.ActiveCfg = Debug|Any CPU + {10EB789E-C993-4BE8-BA43-C419936C7233}.Debug|x64.Build.0 = Debug|Any CPU + {10EB789E-C993-4BE8-BA43-C419936C7233}.Debug|x86.ActiveCfg = Debug|Any CPU + {10EB789E-C993-4BE8-BA43-C419936C7233}.Debug|x86.Build.0 = Debug|Any CPU {10EB789E-C993-4BE8-BA43-C419936C7233}.Release|Any CPU.ActiveCfg = Release|Any CPU {10EB789E-C993-4BE8-BA43-C419936C7233}.Release|Any CPU.Build.0 = Release|Any CPU + {10EB789E-C993-4BE8-BA43-C419936C7233}.Release|x64.ActiveCfg = Release|Any CPU + {10EB789E-C993-4BE8-BA43-C419936C7233}.Release|x64.Build.0 = Release|Any CPU + {10EB789E-C993-4BE8-BA43-C419936C7233}.Release|x86.ActiveCfg = Release|Any CPU + {10EB789E-C993-4BE8-BA43-C419936C7233}.Release|x86.Build.0 = Release|Any CPU {8D22063D-88DE-4F7A-A917-C81AB4ACE601}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8D22063D-88DE-4F7A-A917-C81AB4ACE601}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8D22063D-88DE-4F7A-A917-C81AB4ACE601}.Debug|x64.ActiveCfg = Debug|Any CPU + {8D22063D-88DE-4F7A-A917-C81AB4ACE601}.Debug|x64.Build.0 = Debug|Any CPU + {8D22063D-88DE-4F7A-A917-C81AB4ACE601}.Debug|x86.ActiveCfg = Debug|Any CPU + {8D22063D-88DE-4F7A-A917-C81AB4ACE601}.Debug|x86.Build.0 = Debug|Any CPU {8D22063D-88DE-4F7A-A917-C81AB4ACE601}.Release|Any CPU.ActiveCfg = Release|Any CPU {8D22063D-88DE-4F7A-A917-C81AB4ACE601}.Release|Any CPU.Build.0 = Release|Any CPU + {8D22063D-88DE-4F7A-A917-C81AB4ACE601}.Release|x64.ActiveCfg = Release|Any CPU + {8D22063D-88DE-4F7A-A917-C81AB4ACE601}.Release|x64.Build.0 = Release|Any CPU + {8D22063D-88DE-4F7A-A917-C81AB4ACE601}.Release|x86.ActiveCfg = Release|Any CPU + {8D22063D-88DE-4F7A-A917-C81AB4ACE601}.Release|x86.Build.0 = Release|Any CPU {5BECBCEF-459F-424B-A15A-0558D291842A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5BECBCEF-459F-424B-A15A-0558D291842A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5BECBCEF-459F-424B-A15A-0558D291842A}.Debug|x64.ActiveCfg = Debug|Any CPU + {5BECBCEF-459F-424B-A15A-0558D291842A}.Debug|x64.Build.0 = Debug|Any CPU + {5BECBCEF-459F-424B-A15A-0558D291842A}.Debug|x86.ActiveCfg = Debug|Any CPU + {5BECBCEF-459F-424B-A15A-0558D291842A}.Debug|x86.Build.0 = Debug|Any CPU {5BECBCEF-459F-424B-A15A-0558D291842A}.Release|Any CPU.ActiveCfg = Release|Any CPU {5BECBCEF-459F-424B-A15A-0558D291842A}.Release|Any CPU.Build.0 = Release|Any CPU + {5BECBCEF-459F-424B-A15A-0558D291842A}.Release|x64.ActiveCfg = Release|Any CPU + {5BECBCEF-459F-424B-A15A-0558D291842A}.Release|x64.Build.0 = Release|Any CPU + {5BECBCEF-459F-424B-A15A-0558D291842A}.Release|x86.ActiveCfg = Release|Any CPU + {5BECBCEF-459F-424B-A15A-0558D291842A}.Release|x86.Build.0 = Release|Any CPU {87117AFB-4C87-40CB-889E-F1D97C504906}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {87117AFB-4C87-40CB-889E-F1D97C504906}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87117AFB-4C87-40CB-889E-F1D97C504906}.Debug|x64.ActiveCfg = Debug|Any CPU + {87117AFB-4C87-40CB-889E-F1D97C504906}.Debug|x64.Build.0 = Debug|Any CPU + {87117AFB-4C87-40CB-889E-F1D97C504906}.Debug|x86.ActiveCfg = Debug|Any CPU + {87117AFB-4C87-40CB-889E-F1D97C504906}.Debug|x86.Build.0 = Debug|Any CPU {87117AFB-4C87-40CB-889E-F1D97C504906}.Release|Any CPU.ActiveCfg = Release|Any CPU {87117AFB-4C87-40CB-889E-F1D97C504906}.Release|Any CPU.Build.0 = Release|Any CPU + {87117AFB-4C87-40CB-889E-F1D97C504906}.Release|x64.ActiveCfg = Release|Any CPU + {87117AFB-4C87-40CB-889E-F1D97C504906}.Release|x64.Build.0 = Release|Any CPU + {87117AFB-4C87-40CB-889E-F1D97C504906}.Release|x86.ActiveCfg = Release|Any CPU + {87117AFB-4C87-40CB-889E-F1D97C504906}.Release|x86.Build.0 = Release|Any CPU {D43CC2C9-449A-4619-B5C6-CBC72BCA0512}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D43CC2C9-449A-4619-B5C6-CBC72BCA0512}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D43CC2C9-449A-4619-B5C6-CBC72BCA0512}.Debug|x64.ActiveCfg = Debug|Any CPU + {D43CC2C9-449A-4619-B5C6-CBC72BCA0512}.Debug|x64.Build.0 = Debug|Any CPU + {D43CC2C9-449A-4619-B5C6-CBC72BCA0512}.Debug|x86.ActiveCfg = Debug|Any CPU + {D43CC2C9-449A-4619-B5C6-CBC72BCA0512}.Debug|x86.Build.0 = Debug|Any CPU {D43CC2C9-449A-4619-B5C6-CBC72BCA0512}.Release|Any CPU.ActiveCfg = Release|Any CPU {D43CC2C9-449A-4619-B5C6-CBC72BCA0512}.Release|Any CPU.Build.0 = Release|Any CPU + {D43CC2C9-449A-4619-B5C6-CBC72BCA0512}.Release|x64.ActiveCfg = Release|Any CPU + {D43CC2C9-449A-4619-B5C6-CBC72BCA0512}.Release|x64.Build.0 = Release|Any CPU + {D43CC2C9-449A-4619-B5C6-CBC72BCA0512}.Release|x86.ActiveCfg = Release|Any CPU + {D43CC2C9-449A-4619-B5C6-CBC72BCA0512}.Release|x86.Build.0 = Release|Any CPU {75C24B75-7B8A-4FC5-9DE4-91BF6168BCC0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {75C24B75-7B8A-4FC5-9DE4-91BF6168BCC0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75C24B75-7B8A-4FC5-9DE4-91BF6168BCC0}.Debug|x64.ActiveCfg = Debug|Any CPU + {75C24B75-7B8A-4FC5-9DE4-91BF6168BCC0}.Debug|x64.Build.0 = Debug|Any CPU + {75C24B75-7B8A-4FC5-9DE4-91BF6168BCC0}.Debug|x86.ActiveCfg = Debug|Any CPU + {75C24B75-7B8A-4FC5-9DE4-91BF6168BCC0}.Debug|x86.Build.0 = Debug|Any CPU {75C24B75-7B8A-4FC5-9DE4-91BF6168BCC0}.Release|Any CPU.ActiveCfg = Release|Any CPU {75C24B75-7B8A-4FC5-9DE4-91BF6168BCC0}.Release|Any CPU.Build.0 = Release|Any CPU + {75C24B75-7B8A-4FC5-9DE4-91BF6168BCC0}.Release|x64.ActiveCfg = Release|Any CPU + {75C24B75-7B8A-4FC5-9DE4-91BF6168BCC0}.Release|x64.Build.0 = Release|Any CPU + {75C24B75-7B8A-4FC5-9DE4-91BF6168BCC0}.Release|x86.ActiveCfg = Release|Any CPU + {75C24B75-7B8A-4FC5-9DE4-91BF6168BCC0}.Release|x86.Build.0 = Release|Any CPU {B17BAA37-27E8-4421-A18B-DDF6D146EA06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B17BAA37-27E8-4421-A18B-DDF6D146EA06}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B17BAA37-27E8-4421-A18B-DDF6D146EA06}.Debug|x64.ActiveCfg = Debug|Any CPU + {B17BAA37-27E8-4421-A18B-DDF6D146EA06}.Debug|x64.Build.0 = Debug|Any CPU + {B17BAA37-27E8-4421-A18B-DDF6D146EA06}.Debug|x86.ActiveCfg = Debug|Any CPU + {B17BAA37-27E8-4421-A18B-DDF6D146EA06}.Debug|x86.Build.0 = Debug|Any CPU {B17BAA37-27E8-4421-A18B-DDF6D146EA06}.Release|Any CPU.ActiveCfg = Release|Any CPU {B17BAA37-27E8-4421-A18B-DDF6D146EA06}.Release|Any CPU.Build.0 = Release|Any CPU + {B17BAA37-27E8-4421-A18B-DDF6D146EA06}.Release|x64.ActiveCfg = Release|Any CPU + {B17BAA37-27E8-4421-A18B-DDF6D146EA06}.Release|x64.Build.0 = Release|Any CPU + {B17BAA37-27E8-4421-A18B-DDF6D146EA06}.Release|x86.ActiveCfg = Release|Any CPU + {B17BAA37-27E8-4421-A18B-DDF6D146EA06}.Release|x86.Build.0 = Release|Any CPU {C6CE997A-DE6F-4669-822F-5654BA72C0B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C6CE997A-DE6F-4669-822F-5654BA72C0B0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C6CE997A-DE6F-4669-822F-5654BA72C0B0}.Debug|x64.ActiveCfg = Debug|Any CPU + {C6CE997A-DE6F-4669-822F-5654BA72C0B0}.Debug|x64.Build.0 = Debug|Any CPU + {C6CE997A-DE6F-4669-822F-5654BA72C0B0}.Debug|x86.ActiveCfg = Debug|Any CPU + {C6CE997A-DE6F-4669-822F-5654BA72C0B0}.Debug|x86.Build.0 = Debug|Any CPU {C6CE997A-DE6F-4669-822F-5654BA72C0B0}.Release|Any CPU.ActiveCfg = Release|Any CPU {C6CE997A-DE6F-4669-822F-5654BA72C0B0}.Release|Any CPU.Build.0 = Release|Any CPU + {C6CE997A-DE6F-4669-822F-5654BA72C0B0}.Release|x64.ActiveCfg = Release|Any CPU + {C6CE997A-DE6F-4669-822F-5654BA72C0B0}.Release|x64.Build.0 = Release|Any CPU + {C6CE997A-DE6F-4669-822F-5654BA72C0B0}.Release|x86.ActiveCfg = Release|Any CPU + {C6CE997A-DE6F-4669-822F-5654BA72C0B0}.Release|x86.Build.0 = Release|Any CPU {BA4E3D59-2929-4797-A5F0-7565D76F4076}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BA4E3D59-2929-4797-A5F0-7565D76F4076}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BA4E3D59-2929-4797-A5F0-7565D76F4076}.Debug|x64.ActiveCfg = Debug|Any CPU + {BA4E3D59-2929-4797-A5F0-7565D76F4076}.Debug|x64.Build.0 = Debug|Any CPU + {BA4E3D59-2929-4797-A5F0-7565D76F4076}.Debug|x86.ActiveCfg = Debug|Any CPU + {BA4E3D59-2929-4797-A5F0-7565D76F4076}.Debug|x86.Build.0 = Debug|Any CPU {BA4E3D59-2929-4797-A5F0-7565D76F4076}.Release|Any CPU.ActiveCfg = Release|Any CPU {BA4E3D59-2929-4797-A5F0-7565D76F4076}.Release|Any CPU.Build.0 = Release|Any CPU + {BA4E3D59-2929-4797-A5F0-7565D76F4076}.Release|x64.ActiveCfg = Release|Any CPU + {BA4E3D59-2929-4797-A5F0-7565D76F4076}.Release|x64.Build.0 = Release|Any CPU + {BA4E3D59-2929-4797-A5F0-7565D76F4076}.Release|x86.ActiveCfg = Release|Any CPU + {BA4E3D59-2929-4797-A5F0-7565D76F4076}.Release|x86.Build.0 = Release|Any CPU {74ECE2F5-A7FB-4363-BDD3-EDAF13F845C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {74ECE2F5-A7FB-4363-BDD3-EDAF13F845C8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {74ECE2F5-A7FB-4363-BDD3-EDAF13F845C8}.Debug|x64.ActiveCfg = Debug|Any CPU + {74ECE2F5-A7FB-4363-BDD3-EDAF13F845C8}.Debug|x64.Build.0 = Debug|Any CPU + {74ECE2F5-A7FB-4363-BDD3-EDAF13F845C8}.Debug|x86.ActiveCfg = Debug|Any CPU + {74ECE2F5-A7FB-4363-BDD3-EDAF13F845C8}.Debug|x86.Build.0 = Debug|Any CPU {74ECE2F5-A7FB-4363-BDD3-EDAF13F845C8}.Release|Any CPU.ActiveCfg = Release|Any CPU {74ECE2F5-A7FB-4363-BDD3-EDAF13F845C8}.Release|Any CPU.Build.0 = Release|Any CPU + {74ECE2F5-A7FB-4363-BDD3-EDAF13F845C8}.Release|x64.ActiveCfg = Release|Any CPU + {74ECE2F5-A7FB-4363-BDD3-EDAF13F845C8}.Release|x64.Build.0 = Release|Any CPU + {74ECE2F5-A7FB-4363-BDD3-EDAF13F845C8}.Release|x86.ActiveCfg = Release|Any CPU + {74ECE2F5-A7FB-4363-BDD3-EDAF13F845C8}.Release|x86.Build.0 = Release|Any CPU {89E49906-6606-4126-AB3C-1605E17A1F68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {89E49906-6606-4126-AB3C-1605E17A1F68}.Debug|Any CPU.Build.0 = Debug|Any CPU + {89E49906-6606-4126-AB3C-1605E17A1F68}.Debug|x64.ActiveCfg = Debug|Any CPU + {89E49906-6606-4126-AB3C-1605E17A1F68}.Debug|x64.Build.0 = Debug|Any CPU + {89E49906-6606-4126-AB3C-1605E17A1F68}.Debug|x86.ActiveCfg = Debug|Any CPU + {89E49906-6606-4126-AB3C-1605E17A1F68}.Debug|x86.Build.0 = Debug|Any CPU {89E49906-6606-4126-AB3C-1605E17A1F68}.Release|Any CPU.ActiveCfg = Release|Any CPU {89E49906-6606-4126-AB3C-1605E17A1F68}.Release|Any CPU.Build.0 = Release|Any CPU + {89E49906-6606-4126-AB3C-1605E17A1F68}.Release|x64.ActiveCfg = Release|Any CPU + {89E49906-6606-4126-AB3C-1605E17A1F68}.Release|x64.Build.0 = Release|Any CPU + {89E49906-6606-4126-AB3C-1605E17A1F68}.Release|x86.ActiveCfg = Release|Any CPU + {89E49906-6606-4126-AB3C-1605E17A1F68}.Release|x86.Build.0 = Release|Any CPU {46EF4B32-327C-4AFF-B39D-8202580847DB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {46EF4B32-327C-4AFF-B39D-8202580847DB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {46EF4B32-327C-4AFF-B39D-8202580847DB}.Debug|x64.ActiveCfg = Debug|Any CPU + {46EF4B32-327C-4AFF-B39D-8202580847DB}.Debug|x64.Build.0 = Debug|Any CPU + {46EF4B32-327C-4AFF-B39D-8202580847DB}.Debug|x86.ActiveCfg = Debug|Any CPU + {46EF4B32-327C-4AFF-B39D-8202580847DB}.Debug|x86.Build.0 = Debug|Any CPU {46EF4B32-327C-4AFF-B39D-8202580847DB}.Release|Any CPU.ActiveCfg = Release|Any CPU {46EF4B32-327C-4AFF-B39D-8202580847DB}.Release|Any CPU.Build.0 = Release|Any CPU + {46EF4B32-327C-4AFF-B39D-8202580847DB}.Release|x64.ActiveCfg = Release|Any CPU + {46EF4B32-327C-4AFF-B39D-8202580847DB}.Release|x64.Build.0 = Release|Any CPU + {46EF4B32-327C-4AFF-B39D-8202580847DB}.Release|x86.ActiveCfg = Release|Any CPU + {46EF4B32-327C-4AFF-B39D-8202580847DB}.Release|x86.Build.0 = Release|Any CPU {4AFAFAF8-06FB-48D4-AFA6-B32215584E96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4AFAFAF8-06FB-48D4-AFA6-B32215584E96}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4AFAFAF8-06FB-48D4-AFA6-B32215584E96}.Debug|x64.ActiveCfg = Debug|Any CPU + {4AFAFAF8-06FB-48D4-AFA6-B32215584E96}.Debug|x64.Build.0 = Debug|Any CPU + {4AFAFAF8-06FB-48D4-AFA6-B32215584E96}.Debug|x86.ActiveCfg = Debug|Any CPU + {4AFAFAF8-06FB-48D4-AFA6-B32215584E96}.Debug|x86.Build.0 = Debug|Any CPU {4AFAFAF8-06FB-48D4-AFA6-B32215584E96}.Release|Any CPU.ActiveCfg = Release|Any CPU {4AFAFAF8-06FB-48D4-AFA6-B32215584E96}.Release|Any CPU.Build.0 = Release|Any CPU + {4AFAFAF8-06FB-48D4-AFA6-B32215584E96}.Release|x64.ActiveCfg = Release|Any CPU + {4AFAFAF8-06FB-48D4-AFA6-B32215584E96}.Release|x64.Build.0 = Release|Any CPU + {4AFAFAF8-06FB-48D4-AFA6-B32215584E96}.Release|x86.ActiveCfg = Release|Any CPU + {4AFAFAF8-06FB-48D4-AFA6-B32215584E96}.Release|x86.Build.0 = Release|Any CPU {6F80DD0F-D91C-4A69-A20E-BB687036EFA8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6F80DD0F-D91C-4A69-A20E-BB687036EFA8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6F80DD0F-D91C-4A69-A20E-BB687036EFA8}.Debug|x64.ActiveCfg = Debug|Any CPU + {6F80DD0F-D91C-4A69-A20E-BB687036EFA8}.Debug|x64.Build.0 = Debug|Any CPU + {6F80DD0F-D91C-4A69-A20E-BB687036EFA8}.Debug|x86.ActiveCfg = Debug|Any CPU + {6F80DD0F-D91C-4A69-A20E-BB687036EFA8}.Debug|x86.Build.0 = Debug|Any CPU {6F80DD0F-D91C-4A69-A20E-BB687036EFA8}.Release|Any CPU.ActiveCfg = Release|Any CPU {6F80DD0F-D91C-4A69-A20E-BB687036EFA8}.Release|Any CPU.Build.0 = Release|Any CPU + {6F80DD0F-D91C-4A69-A20E-BB687036EFA8}.Release|x64.ActiveCfg = Release|Any CPU + {6F80DD0F-D91C-4A69-A20E-BB687036EFA8}.Release|x64.Build.0 = Release|Any CPU + {6F80DD0F-D91C-4A69-A20E-BB687036EFA8}.Release|x86.ActiveCfg = Release|Any CPU + {6F80DD0F-D91C-4A69-A20E-BB687036EFA8}.Release|x86.Build.0 = Release|Any CPU {975056D6-0B2D-43BA-9BF8-0E937581F873}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {975056D6-0B2D-43BA-9BF8-0E937581F873}.Debug|Any CPU.Build.0 = Debug|Any CPU + {975056D6-0B2D-43BA-9BF8-0E937581F873}.Debug|x64.ActiveCfg = Debug|Any CPU + {975056D6-0B2D-43BA-9BF8-0E937581F873}.Debug|x64.Build.0 = Debug|Any CPU + {975056D6-0B2D-43BA-9BF8-0E937581F873}.Debug|x86.ActiveCfg = Debug|Any CPU + {975056D6-0B2D-43BA-9BF8-0E937581F873}.Debug|x86.Build.0 = Debug|Any CPU {975056D6-0B2D-43BA-9BF8-0E937581F873}.Release|Any CPU.ActiveCfg = Release|Any CPU {975056D6-0B2D-43BA-9BF8-0E937581F873}.Release|Any CPU.Build.0 = Release|Any CPU + {975056D6-0B2D-43BA-9BF8-0E937581F873}.Release|x64.ActiveCfg = Release|Any CPU + {975056D6-0B2D-43BA-9BF8-0E937581F873}.Release|x64.Build.0 = Release|Any CPU + {975056D6-0B2D-43BA-9BF8-0E937581F873}.Release|x86.ActiveCfg = Release|Any CPU + {975056D6-0B2D-43BA-9BF8-0E937581F873}.Release|x86.Build.0 = Release|Any CPU {CB6FD800-B6C5-4C2A-8920-B8A29C74AEF6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CB6FD800-B6C5-4C2A-8920-B8A29C74AEF6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CB6FD800-B6C5-4C2A-8920-B8A29C74AEF6}.Debug|x64.ActiveCfg = Debug|Any CPU + {CB6FD800-B6C5-4C2A-8920-B8A29C74AEF6}.Debug|x64.Build.0 = Debug|Any CPU + {CB6FD800-B6C5-4C2A-8920-B8A29C74AEF6}.Debug|x86.ActiveCfg = Debug|Any CPU + {CB6FD800-B6C5-4C2A-8920-B8A29C74AEF6}.Debug|x86.Build.0 = Debug|Any CPU {CB6FD800-B6C5-4C2A-8920-B8A29C74AEF6}.Release|Any CPU.ActiveCfg = Release|Any CPU {CB6FD800-B6C5-4C2A-8920-B8A29C74AEF6}.Release|Any CPU.Build.0 = Release|Any CPU + {CB6FD800-B6C5-4C2A-8920-B8A29C74AEF6}.Release|x64.ActiveCfg = Release|Any CPU + {CB6FD800-B6C5-4C2A-8920-B8A29C74AEF6}.Release|x64.Build.0 = Release|Any CPU + {CB6FD800-B6C5-4C2A-8920-B8A29C74AEF6}.Release|x86.ActiveCfg = Release|Any CPU + {CB6FD800-B6C5-4C2A-8920-B8A29C74AEF6}.Release|x86.Build.0 = Release|Any CPU {A5B650AB-A67F-4A4C-9F81-7B5471CA1331}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A5B650AB-A67F-4A4C-9F81-7B5471CA1331}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A5B650AB-A67F-4A4C-9F81-7B5471CA1331}.Debug|x64.ActiveCfg = Debug|Any CPU + {A5B650AB-A67F-4A4C-9F81-7B5471CA1331}.Debug|x64.Build.0 = Debug|Any CPU + {A5B650AB-A67F-4A4C-9F81-7B5471CA1331}.Debug|x86.ActiveCfg = Debug|Any CPU + {A5B650AB-A67F-4A4C-9F81-7B5471CA1331}.Debug|x86.Build.0 = Debug|Any CPU {A5B650AB-A67F-4A4C-9F81-7B5471CA1331}.Release|Any CPU.ActiveCfg = Release|Any CPU {A5B650AB-A67F-4A4C-9F81-7B5471CA1331}.Release|Any CPU.Build.0 = Release|Any CPU + {A5B650AB-A67F-4A4C-9F81-7B5471CA1331}.Release|x64.ActiveCfg = Release|Any CPU + {A5B650AB-A67F-4A4C-9F81-7B5471CA1331}.Release|x64.Build.0 = Release|Any CPU + {A5B650AB-A67F-4A4C-9F81-7B5471CA1331}.Release|x86.ActiveCfg = Release|Any CPU + {A5B650AB-A67F-4A4C-9F81-7B5471CA1331}.Release|x86.Build.0 = Release|Any CPU {D9455AE7-2E0C-4647-9880-F5831BCEE3D8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D9455AE7-2E0C-4647-9880-F5831BCEE3D8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D9455AE7-2E0C-4647-9880-F5831BCEE3D8}.Debug|x64.ActiveCfg = Debug|Any CPU + {D9455AE7-2E0C-4647-9880-F5831BCEE3D8}.Debug|x64.Build.0 = Debug|Any CPU + {D9455AE7-2E0C-4647-9880-F5831BCEE3D8}.Debug|x86.ActiveCfg = Debug|Any CPU + {D9455AE7-2E0C-4647-9880-F5831BCEE3D8}.Debug|x86.Build.0 = Debug|Any CPU {D9455AE7-2E0C-4647-9880-F5831BCEE3D8}.Release|Any CPU.ActiveCfg = Release|Any CPU {D9455AE7-2E0C-4647-9880-F5831BCEE3D8}.Release|Any CPU.Build.0 = Release|Any CPU + {D9455AE7-2E0C-4647-9880-F5831BCEE3D8}.Release|x64.ActiveCfg = Release|Any CPU + {D9455AE7-2E0C-4647-9880-F5831BCEE3D8}.Release|x64.Build.0 = Release|Any CPU + {D9455AE7-2E0C-4647-9880-F5831BCEE3D8}.Release|x86.ActiveCfg = Release|Any CPU + {D9455AE7-2E0C-4647-9880-F5831BCEE3D8}.Release|x86.Build.0 = Release|Any CPU {8C327AA0-BBED-4F8B-A88E-1DD97B04E58F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8C327AA0-BBED-4F8B-A88E-1DD97B04E58F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8C327AA0-BBED-4F8B-A88E-1DD97B04E58F}.Debug|x64.ActiveCfg = Debug|Any CPU + {8C327AA0-BBED-4F8B-A88E-1DD97B04E58F}.Debug|x64.Build.0 = Debug|Any CPU + {8C327AA0-BBED-4F8B-A88E-1DD97B04E58F}.Debug|x86.ActiveCfg = Debug|Any CPU + {8C327AA0-BBED-4F8B-A88E-1DD97B04E58F}.Debug|x86.Build.0 = Debug|Any CPU {8C327AA0-BBED-4F8B-A88E-1DD97B04E58F}.Release|Any CPU.ActiveCfg = Release|Any CPU {8C327AA0-BBED-4F8B-A88E-1DD97B04E58F}.Release|Any CPU.Build.0 = Release|Any CPU + {8C327AA0-BBED-4F8B-A88E-1DD97B04E58F}.Release|x64.ActiveCfg = Release|Any CPU + {8C327AA0-BBED-4F8B-A88E-1DD97B04E58F}.Release|x64.Build.0 = Release|Any CPU + {8C327AA0-BBED-4F8B-A88E-1DD97B04E58F}.Release|x86.ActiveCfg = Release|Any CPU + {8C327AA0-BBED-4F8B-A88E-1DD97B04E58F}.Release|x86.Build.0 = Release|Any CPU {B417D97C-330A-42CE-BDC6-93355B0A959A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B417D97C-330A-42CE-BDC6-93355B0A959A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B417D97C-330A-42CE-BDC6-93355B0A959A}.Debug|x64.ActiveCfg = Debug|Any CPU + {B417D97C-330A-42CE-BDC6-93355B0A959A}.Debug|x64.Build.0 = Debug|Any CPU + {B417D97C-330A-42CE-BDC6-93355B0A959A}.Debug|x86.ActiveCfg = Debug|Any CPU + {B417D97C-330A-42CE-BDC6-93355B0A959A}.Debug|x86.Build.0 = Debug|Any CPU {B417D97C-330A-42CE-BDC6-93355B0A959A}.Release|Any CPU.ActiveCfg = Release|Any CPU {B417D97C-330A-42CE-BDC6-93355B0A959A}.Release|Any CPU.Build.0 = Release|Any CPU + {B417D97C-330A-42CE-BDC6-93355B0A959A}.Release|x64.ActiveCfg = Release|Any CPU + {B417D97C-330A-42CE-BDC6-93355B0A959A}.Release|x64.Build.0 = Release|Any CPU + {B417D97C-330A-42CE-BDC6-93355B0A959A}.Release|x86.ActiveCfg = Release|Any CPU + {B417D97C-330A-42CE-BDC6-93355B0A959A}.Release|x86.Build.0 = Release|Any CPU {38EF3EC8-9915-4216-B646-4BEE07006943}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {38EF3EC8-9915-4216-B646-4BEE07006943}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38EF3EC8-9915-4216-B646-4BEE07006943}.Debug|x64.ActiveCfg = Debug|Any CPU + {38EF3EC8-9915-4216-B646-4BEE07006943}.Debug|x64.Build.0 = Debug|Any CPU + {38EF3EC8-9915-4216-B646-4BEE07006943}.Debug|x86.ActiveCfg = Debug|Any CPU + {38EF3EC8-9915-4216-B646-4BEE07006943}.Debug|x86.Build.0 = Debug|Any CPU {38EF3EC8-9915-4216-B646-4BEE07006943}.Release|Any CPU.ActiveCfg = Release|Any CPU {38EF3EC8-9915-4216-B646-4BEE07006943}.Release|Any CPU.Build.0 = Release|Any CPU + {38EF3EC8-9915-4216-B646-4BEE07006943}.Release|x64.ActiveCfg = Release|Any CPU + {38EF3EC8-9915-4216-B646-4BEE07006943}.Release|x64.Build.0 = Release|Any CPU + {38EF3EC8-9915-4216-B646-4BEE07006943}.Release|x86.ActiveCfg = Release|Any CPU + {38EF3EC8-9915-4216-B646-4BEE07006943}.Release|x86.Build.0 = Release|Any CPU {65FB5893-7CB6-4694-A692-7E666E347D29}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {65FB5893-7CB6-4694-A692-7E666E347D29}.Debug|Any CPU.Build.0 = Debug|Any CPU + {65FB5893-7CB6-4694-A692-7E666E347D29}.Debug|x64.ActiveCfg = Debug|Any CPU + {65FB5893-7CB6-4694-A692-7E666E347D29}.Debug|x64.Build.0 = Debug|Any CPU + {65FB5893-7CB6-4694-A692-7E666E347D29}.Debug|x86.ActiveCfg = Debug|Any CPU + {65FB5893-7CB6-4694-A692-7E666E347D29}.Debug|x86.Build.0 = Debug|Any CPU {65FB5893-7CB6-4694-A692-7E666E347D29}.Release|Any CPU.ActiveCfg = Release|Any CPU {65FB5893-7CB6-4694-A692-7E666E347D29}.Release|Any CPU.Build.0 = Release|Any CPU + {65FB5893-7CB6-4694-A692-7E666E347D29}.Release|x64.ActiveCfg = Release|Any CPU + {65FB5893-7CB6-4694-A692-7E666E347D29}.Release|x64.Build.0 = Release|Any CPU + {65FB5893-7CB6-4694-A692-7E666E347D29}.Release|x86.ActiveCfg = Release|Any CPU + {65FB5893-7CB6-4694-A692-7E666E347D29}.Release|x86.Build.0 = Release|Any CPU {B10E37A1-43A1-4042-BAAA-F589302958D5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B10E37A1-43A1-4042-BAAA-F589302958D5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B10E37A1-43A1-4042-BAAA-F589302958D5}.Debug|x64.ActiveCfg = Debug|Any CPU + {B10E37A1-43A1-4042-BAAA-F589302958D5}.Debug|x64.Build.0 = Debug|Any CPU + {B10E37A1-43A1-4042-BAAA-F589302958D5}.Debug|x86.ActiveCfg = Debug|Any CPU + {B10E37A1-43A1-4042-BAAA-F589302958D5}.Debug|x86.Build.0 = Debug|Any CPU {B10E37A1-43A1-4042-BAAA-F589302958D5}.Release|Any CPU.ActiveCfg = Release|Any CPU {B10E37A1-43A1-4042-BAAA-F589302958D5}.Release|Any CPU.Build.0 = Release|Any CPU + {B10E37A1-43A1-4042-BAAA-F589302958D5}.Release|x64.ActiveCfg = Release|Any CPU + {B10E37A1-43A1-4042-BAAA-F589302958D5}.Release|x64.Build.0 = Release|Any CPU + {B10E37A1-43A1-4042-BAAA-F589302958D5}.Release|x86.ActiveCfg = Release|Any CPU + {B10E37A1-43A1-4042-BAAA-F589302958D5}.Release|x86.Build.0 = Release|Any CPU {A1C792B7-0DBF-460D-9158-A1A68A2D9C1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A1C792B7-0DBF-460D-9158-A1A68A2D9C1A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A1C792B7-0DBF-460D-9158-A1A68A2D9C1A}.Debug|x64.ActiveCfg = Debug|Any CPU + {A1C792B7-0DBF-460D-9158-A1A68A2D9C1A}.Debug|x64.Build.0 = Debug|Any CPU + {A1C792B7-0DBF-460D-9158-A1A68A2D9C1A}.Debug|x86.ActiveCfg = Debug|Any CPU + {A1C792B7-0DBF-460D-9158-A1A68A2D9C1A}.Debug|x86.Build.0 = Debug|Any CPU {A1C792B7-0DBF-460D-9158-A1A68A2D9C1A}.Release|Any CPU.ActiveCfg = Release|Any CPU {A1C792B7-0DBF-460D-9158-A1A68A2D9C1A}.Release|Any CPU.Build.0 = Release|Any CPU + {A1C792B7-0DBF-460D-9158-A1A68A2D9C1A}.Release|x64.ActiveCfg = Release|Any CPU + {A1C792B7-0DBF-460D-9158-A1A68A2D9C1A}.Release|x64.Build.0 = Release|Any CPU + {A1C792B7-0DBF-460D-9158-A1A68A2D9C1A}.Release|x86.ActiveCfg = Release|Any CPU + {A1C792B7-0DBF-460D-9158-A1A68A2D9C1A}.Release|x86.Build.0 = Release|Any CPU {627B88DB-BDCF-4D92-8454-EFE95F4AFB7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {627B88DB-BDCF-4D92-8454-EFE95F4AFB7A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {627B88DB-BDCF-4D92-8454-EFE95F4AFB7A}.Debug|x64.ActiveCfg = Debug|Any CPU + {627B88DB-BDCF-4D92-8454-EFE95F4AFB7A}.Debug|x64.Build.0 = Debug|Any CPU + {627B88DB-BDCF-4D92-8454-EFE95F4AFB7A}.Debug|x86.ActiveCfg = Debug|Any CPU + {627B88DB-BDCF-4D92-8454-EFE95F4AFB7A}.Debug|x86.Build.0 = Debug|Any CPU {627B88DB-BDCF-4D92-8454-EFE95F4AFB7A}.Release|Any CPU.ActiveCfg = Release|Any CPU {627B88DB-BDCF-4D92-8454-EFE95F4AFB7A}.Release|Any CPU.Build.0 = Release|Any CPU + {627B88DB-BDCF-4D92-8454-EFE95F4AFB7A}.Release|x64.ActiveCfg = Release|Any CPU + {627B88DB-BDCF-4D92-8454-EFE95F4AFB7A}.Release|x64.Build.0 = Release|Any CPU + {627B88DB-BDCF-4D92-8454-EFE95F4AFB7A}.Release|x86.ActiveCfg = Release|Any CPU + {627B88DB-BDCF-4D92-8454-EFE95F4AFB7A}.Release|x86.Build.0 = Release|Any CPU {23C5849D-4C09-4588-AE32-E31F03B7ED63}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {23C5849D-4C09-4588-AE32-E31F03B7ED63}.Debug|Any CPU.Build.0 = Debug|Any CPU + {23C5849D-4C09-4588-AE32-E31F03B7ED63}.Debug|x64.ActiveCfg = Debug|Any CPU + {23C5849D-4C09-4588-AE32-E31F03B7ED63}.Debug|x64.Build.0 = Debug|Any CPU + {23C5849D-4C09-4588-AE32-E31F03B7ED63}.Debug|x86.ActiveCfg = Debug|Any CPU + {23C5849D-4C09-4588-AE32-E31F03B7ED63}.Debug|x86.Build.0 = Debug|Any CPU {23C5849D-4C09-4588-AE32-E31F03B7ED63}.Release|Any CPU.ActiveCfg = Release|Any CPU {23C5849D-4C09-4588-AE32-E31F03B7ED63}.Release|Any CPU.Build.0 = Release|Any CPU + {23C5849D-4C09-4588-AE32-E31F03B7ED63}.Release|x64.ActiveCfg = Release|Any CPU + {23C5849D-4C09-4588-AE32-E31F03B7ED63}.Release|x64.Build.0 = Release|Any CPU + {23C5849D-4C09-4588-AE32-E31F03B7ED63}.Release|x86.ActiveCfg = Release|Any CPU + {23C5849D-4C09-4588-AE32-E31F03B7ED63}.Release|x86.Build.0 = Release|Any CPU {9FC49D82-04E5-4170-8618-682BD3350910}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9FC49D82-04E5-4170-8618-682BD3350910}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9FC49D82-04E5-4170-8618-682BD3350910}.Debug|x64.ActiveCfg = Debug|Any CPU + {9FC49D82-04E5-4170-8618-682BD3350910}.Debug|x64.Build.0 = Debug|Any CPU + {9FC49D82-04E5-4170-8618-682BD3350910}.Debug|x86.ActiveCfg = Debug|Any CPU + {9FC49D82-04E5-4170-8618-682BD3350910}.Debug|x86.Build.0 = Debug|Any CPU {9FC49D82-04E5-4170-8618-682BD3350910}.Release|Any CPU.ActiveCfg = Release|Any CPU {9FC49D82-04E5-4170-8618-682BD3350910}.Release|Any CPU.Build.0 = Release|Any CPU + {9FC49D82-04E5-4170-8618-682BD3350910}.Release|x64.ActiveCfg = Release|Any CPU + {9FC49D82-04E5-4170-8618-682BD3350910}.Release|x64.Build.0 = Release|Any CPU + {9FC49D82-04E5-4170-8618-682BD3350910}.Release|x86.ActiveCfg = Release|Any CPU + {9FC49D82-04E5-4170-8618-682BD3350910}.Release|x86.Build.0 = Release|Any CPU {D1318094-7907-4826-B5F3-CFFC741F235F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D1318094-7907-4826-B5F3-CFFC741F235F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D1318094-7907-4826-B5F3-CFFC741F235F}.Debug|x64.ActiveCfg = Debug|Any CPU + {D1318094-7907-4826-B5F3-CFFC741F235F}.Debug|x64.Build.0 = Debug|Any CPU + {D1318094-7907-4826-B5F3-CFFC741F235F}.Debug|x86.ActiveCfg = Debug|Any CPU + {D1318094-7907-4826-B5F3-CFFC741F235F}.Debug|x86.Build.0 = Debug|Any CPU {D1318094-7907-4826-B5F3-CFFC741F235F}.Release|Any CPU.ActiveCfg = Release|Any CPU {D1318094-7907-4826-B5F3-CFFC741F235F}.Release|Any CPU.Build.0 = Release|Any CPU + {D1318094-7907-4826-B5F3-CFFC741F235F}.Release|x64.ActiveCfg = Release|Any CPU + {D1318094-7907-4826-B5F3-CFFC741F235F}.Release|x64.Build.0 = Release|Any CPU + {D1318094-7907-4826-B5F3-CFFC741F235F}.Release|x86.ActiveCfg = Release|Any CPU + {D1318094-7907-4826-B5F3-CFFC741F235F}.Release|x86.Build.0 = Release|Any CPU {5AB7E368-1CC8-401D-9952-6CA6779305E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5AB7E368-1CC8-401D-9952-6CA6779305E7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5AB7E368-1CC8-401D-9952-6CA6779305E7}.Debug|x64.ActiveCfg = Debug|Any CPU + {5AB7E368-1CC8-401D-9952-6CA6779305E7}.Debug|x64.Build.0 = Debug|Any CPU + {5AB7E368-1CC8-401D-9952-6CA6779305E7}.Debug|x86.ActiveCfg = Debug|Any CPU + {5AB7E368-1CC8-401D-9952-6CA6779305E7}.Debug|x86.Build.0 = Debug|Any CPU {5AB7E368-1CC8-401D-9952-6CA6779305E7}.Release|Any CPU.ActiveCfg = Release|Any CPU {5AB7E368-1CC8-401D-9952-6CA6779305E7}.Release|Any CPU.Build.0 = Release|Any CPU + {5AB7E368-1CC8-401D-9952-6CA6779305E7}.Release|x64.ActiveCfg = Release|Any CPU + {5AB7E368-1CC8-401D-9952-6CA6779305E7}.Release|x64.Build.0 = Release|Any CPU + {5AB7E368-1CC8-401D-9952-6CA6779305E7}.Release|x86.ActiveCfg = Release|Any CPU + {5AB7E368-1CC8-401D-9952-6CA6779305E7}.Release|x86.Build.0 = Release|Any CPU {03F51721-DA51-4BAE-9909-3FC88FAB7774}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {03F51721-DA51-4BAE-9909-3FC88FAB7774}.Debug|Any CPU.Build.0 = Debug|Any CPU + {03F51721-DA51-4BAE-9909-3FC88FAB7774}.Debug|x64.ActiveCfg = Debug|Any CPU + {03F51721-DA51-4BAE-9909-3FC88FAB7774}.Debug|x64.Build.0 = Debug|Any CPU + {03F51721-DA51-4BAE-9909-3FC88FAB7774}.Debug|x86.ActiveCfg = Debug|Any CPU + {03F51721-DA51-4BAE-9909-3FC88FAB7774}.Debug|x86.Build.0 = Debug|Any CPU {03F51721-DA51-4BAE-9909-3FC88FAB7774}.Release|Any CPU.ActiveCfg = Release|Any CPU {03F51721-DA51-4BAE-9909-3FC88FAB7774}.Release|Any CPU.Build.0 = Release|Any CPU + {03F51721-DA51-4BAE-9909-3FC88FAB7774}.Release|x64.ActiveCfg = Release|Any CPU + {03F51721-DA51-4BAE-9909-3FC88FAB7774}.Release|x64.Build.0 = Release|Any CPU + {03F51721-DA51-4BAE-9909-3FC88FAB7774}.Release|x86.ActiveCfg = Release|Any CPU + {03F51721-DA51-4BAE-9909-3FC88FAB7774}.Release|x86.Build.0 = Release|Any CPU {D5733D90-8C3D-4026-85E2-41DED26C4938}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D5733D90-8C3D-4026-85E2-41DED26C4938}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D5733D90-8C3D-4026-85E2-41DED26C4938}.Debug|x64.ActiveCfg = Debug|Any CPU + {D5733D90-8C3D-4026-85E2-41DED26C4938}.Debug|x64.Build.0 = Debug|Any CPU + {D5733D90-8C3D-4026-85E2-41DED26C4938}.Debug|x86.ActiveCfg = Debug|Any CPU + {D5733D90-8C3D-4026-85E2-41DED26C4938}.Debug|x86.Build.0 = Debug|Any CPU {D5733D90-8C3D-4026-85E2-41DED26C4938}.Release|Any CPU.ActiveCfg = Release|Any CPU {D5733D90-8C3D-4026-85E2-41DED26C4938}.Release|Any CPU.Build.0 = Release|Any CPU + {D5733D90-8C3D-4026-85E2-41DED26C4938}.Release|x64.ActiveCfg = Release|Any CPU + {D5733D90-8C3D-4026-85E2-41DED26C4938}.Release|x64.Build.0 = Release|Any CPU + {D5733D90-8C3D-4026-85E2-41DED26C4938}.Release|x86.ActiveCfg = Release|Any CPU + {D5733D90-8C3D-4026-85E2-41DED26C4938}.Release|x86.Build.0 = Release|Any CPU {82ED4DD2-DEF8-40D5-9BF9-663AFD35B06D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {82ED4DD2-DEF8-40D5-9BF9-663AFD35B06D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {82ED4DD2-DEF8-40D5-9BF9-663AFD35B06D}.Debug|x64.ActiveCfg = Debug|Any CPU + {82ED4DD2-DEF8-40D5-9BF9-663AFD35B06D}.Debug|x64.Build.0 = Debug|Any CPU + {82ED4DD2-DEF8-40D5-9BF9-663AFD35B06D}.Debug|x86.ActiveCfg = Debug|Any CPU + {82ED4DD2-DEF8-40D5-9BF9-663AFD35B06D}.Debug|x86.Build.0 = Debug|Any CPU {82ED4DD2-DEF8-40D5-9BF9-663AFD35B06D}.Release|Any CPU.ActiveCfg = Release|Any CPU {82ED4DD2-DEF8-40D5-9BF9-663AFD35B06D}.Release|Any CPU.Build.0 = Release|Any CPU + {82ED4DD2-DEF8-40D5-9BF9-663AFD35B06D}.Release|x64.ActiveCfg = Release|Any CPU + {82ED4DD2-DEF8-40D5-9BF9-663AFD35B06D}.Release|x64.Build.0 = Release|Any CPU + {82ED4DD2-DEF8-40D5-9BF9-663AFD35B06D}.Release|x86.ActiveCfg = Release|Any CPU + {82ED4DD2-DEF8-40D5-9BF9-663AFD35B06D}.Release|x86.Build.0 = Release|Any CPU {6EABA98D-0B71-4ED7-A939-AFDA106D1151}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6EABA98D-0B71-4ED7-A939-AFDA106D1151}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6EABA98D-0B71-4ED7-A939-AFDA106D1151}.Debug|x64.ActiveCfg = Debug|Any CPU + {6EABA98D-0B71-4ED7-A939-AFDA106D1151}.Debug|x64.Build.0 = Debug|Any CPU + {6EABA98D-0B71-4ED7-A939-AFDA106D1151}.Debug|x86.ActiveCfg = Debug|Any CPU + {6EABA98D-0B71-4ED7-A939-AFDA106D1151}.Debug|x86.Build.0 = Debug|Any CPU {6EABA98D-0B71-4ED7-A939-AFDA106D1151}.Release|Any CPU.ActiveCfg = Release|Any CPU {6EABA98D-0B71-4ED7-A939-AFDA106D1151}.Release|Any CPU.Build.0 = Release|Any CPU + {6EABA98D-0B71-4ED7-A939-AFDA106D1151}.Release|x64.ActiveCfg = Release|Any CPU + {6EABA98D-0B71-4ED7-A939-AFDA106D1151}.Release|x64.Build.0 = Release|Any CPU + {6EABA98D-0B71-4ED7-A939-AFDA106D1151}.Release|x86.ActiveCfg = Release|Any CPU + {6EABA98D-0B71-4ED7-A939-AFDA106D1151}.Release|x86.Build.0 = Release|Any CPU {468C3DCB-8C00-40E7-AE51-0738EAAB312A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {468C3DCB-8C00-40E7-AE51-0738EAAB312A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {468C3DCB-8C00-40E7-AE51-0738EAAB312A}.Debug|x64.ActiveCfg = Debug|Any CPU + {468C3DCB-8C00-40E7-AE51-0738EAAB312A}.Debug|x64.Build.0 = Debug|Any CPU + {468C3DCB-8C00-40E7-AE51-0738EAAB312A}.Debug|x86.ActiveCfg = Debug|Any CPU + {468C3DCB-8C00-40E7-AE51-0738EAAB312A}.Debug|x86.Build.0 = Debug|Any CPU {468C3DCB-8C00-40E7-AE51-0738EAAB312A}.Release|Any CPU.ActiveCfg = Release|Any CPU {468C3DCB-8C00-40E7-AE51-0738EAAB312A}.Release|Any CPU.Build.0 = Release|Any CPU + {468C3DCB-8C00-40E7-AE51-0738EAAB312A}.Release|x64.ActiveCfg = Release|Any CPU + {468C3DCB-8C00-40E7-AE51-0738EAAB312A}.Release|x64.Build.0 = Release|Any CPU + {468C3DCB-8C00-40E7-AE51-0738EAAB312A}.Release|x86.ActiveCfg = Release|Any CPU + {468C3DCB-8C00-40E7-AE51-0738EAAB312A}.Release|x86.Build.0 = Release|Any CPU {86A3BB43-8FA2-4CC2-BAD0-A86C6C9D9585}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {86A3BB43-8FA2-4CC2-BAD0-A86C6C9D9585}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86A3BB43-8FA2-4CC2-BAD0-A86C6C9D9585}.Debug|x64.ActiveCfg = Debug|Any CPU + {86A3BB43-8FA2-4CC2-BAD0-A86C6C9D9585}.Debug|x64.Build.0 = Debug|Any CPU + {86A3BB43-8FA2-4CC2-BAD0-A86C6C9D9585}.Debug|x86.ActiveCfg = Debug|Any CPU + {86A3BB43-8FA2-4CC2-BAD0-A86C6C9D9585}.Debug|x86.Build.0 = Debug|Any CPU {86A3BB43-8FA2-4CC2-BAD0-A86C6C9D9585}.Release|Any CPU.ActiveCfg = Release|Any CPU {86A3BB43-8FA2-4CC2-BAD0-A86C6C9D9585}.Release|Any CPU.Build.0 = Release|Any CPU + {86A3BB43-8FA2-4CC2-BAD0-A86C6C9D9585}.Release|x64.ActiveCfg = Release|Any CPU + {86A3BB43-8FA2-4CC2-BAD0-A86C6C9D9585}.Release|x64.Build.0 = Release|Any CPU + {86A3BB43-8FA2-4CC2-BAD0-A86C6C9D9585}.Release|x86.ActiveCfg = Release|Any CPU + {86A3BB43-8FA2-4CC2-BAD0-A86C6C9D9585}.Release|x86.Build.0 = Release|Any CPU {7E0517E0-AE09-4E10-8469-308F065F2F43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7E0517E0-AE09-4E10-8469-308F065F2F43}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7E0517E0-AE09-4E10-8469-308F065F2F43}.Debug|x64.ActiveCfg = Debug|Any CPU + {7E0517E0-AE09-4E10-8469-308F065F2F43}.Debug|x64.Build.0 = Debug|Any CPU + {7E0517E0-AE09-4E10-8469-308F065F2F43}.Debug|x86.ActiveCfg = Debug|Any CPU + {7E0517E0-AE09-4E10-8469-308F065F2F43}.Debug|x86.Build.0 = Debug|Any CPU {7E0517E0-AE09-4E10-8469-308F065F2F43}.Release|Any CPU.ActiveCfg = Release|Any CPU {7E0517E0-AE09-4E10-8469-308F065F2F43}.Release|Any CPU.Build.0 = Release|Any CPU + {7E0517E0-AE09-4E10-8469-308F065F2F43}.Release|x64.ActiveCfg = Release|Any CPU + {7E0517E0-AE09-4E10-8469-308F065F2F43}.Release|x64.Build.0 = Release|Any CPU + {7E0517E0-AE09-4E10-8469-308F065F2F43}.Release|x86.ActiveCfg = Release|Any CPU + {7E0517E0-AE09-4E10-8469-308F065F2F43}.Release|x86.Build.0 = Release|Any CPU {8B1CB44B-BA40-4C78-9447-A7864126D7C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8B1CB44B-BA40-4C78-9447-A7864126D7C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8B1CB44B-BA40-4C78-9447-A7864126D7C3}.Debug|x64.ActiveCfg = Debug|Any CPU + {8B1CB44B-BA40-4C78-9447-A7864126D7C3}.Debug|x64.Build.0 = Debug|Any CPU + {8B1CB44B-BA40-4C78-9447-A7864126D7C3}.Debug|x86.ActiveCfg = Debug|Any CPU + {8B1CB44B-BA40-4C78-9447-A7864126D7C3}.Debug|x86.Build.0 = Debug|Any CPU {8B1CB44B-BA40-4C78-9447-A7864126D7C3}.Release|Any CPU.ActiveCfg = Release|Any CPU {8B1CB44B-BA40-4C78-9447-A7864126D7C3}.Release|Any CPU.Build.0 = Release|Any CPU + {8B1CB44B-BA40-4C78-9447-A7864126D7C3}.Release|x64.ActiveCfg = Release|Any CPU + {8B1CB44B-BA40-4C78-9447-A7864126D7C3}.Release|x64.Build.0 = Release|Any CPU + {8B1CB44B-BA40-4C78-9447-A7864126D7C3}.Release|x86.ActiveCfg = Release|Any CPU + {8B1CB44B-BA40-4C78-9447-A7864126D7C3}.Release|x86.Build.0 = Release|Any CPU {8BB10746-8BAD-4317-8EE5-A36805DB93F6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8BB10746-8BAD-4317-8EE5-A36805DB93F6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8BB10746-8BAD-4317-8EE5-A36805DB93F6}.Debug|x64.ActiveCfg = Debug|Any CPU + {8BB10746-8BAD-4317-8EE5-A36805DB93F6}.Debug|x64.Build.0 = Debug|Any CPU + {8BB10746-8BAD-4317-8EE5-A36805DB93F6}.Debug|x86.ActiveCfg = Debug|Any CPU + {8BB10746-8BAD-4317-8EE5-A36805DB93F6}.Debug|x86.Build.0 = Debug|Any CPU {8BB10746-8BAD-4317-8EE5-A36805DB93F6}.Release|Any CPU.ActiveCfg = Release|Any CPU {8BB10746-8BAD-4317-8EE5-A36805DB93F6}.Release|Any CPU.Build.0 = Release|Any CPU + {8BB10746-8BAD-4317-8EE5-A36805DB93F6}.Release|x64.ActiveCfg = Release|Any CPU + {8BB10746-8BAD-4317-8EE5-A36805DB93F6}.Release|x64.Build.0 = Release|Any CPU + {8BB10746-8BAD-4317-8EE5-A36805DB93F6}.Release|x86.ActiveCfg = Release|Any CPU + {8BB10746-8BAD-4317-8EE5-A36805DB93F6}.Release|x86.Build.0 = Release|Any CPU {EC71FBDD-A6BD-4B5D-92FE-E108FE12CE8B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EC71FBDD-A6BD-4B5D-92FE-E108FE12CE8B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EC71FBDD-A6BD-4B5D-92FE-E108FE12CE8B}.Debug|x64.ActiveCfg = Debug|Any CPU + {EC71FBDD-A6BD-4B5D-92FE-E108FE12CE8B}.Debug|x64.Build.0 = Debug|Any CPU + {EC71FBDD-A6BD-4B5D-92FE-E108FE12CE8B}.Debug|x86.ActiveCfg = Debug|Any CPU + {EC71FBDD-A6BD-4B5D-92FE-E108FE12CE8B}.Debug|x86.Build.0 = Debug|Any CPU {EC71FBDD-A6BD-4B5D-92FE-E108FE12CE8B}.Release|Any CPU.ActiveCfg = Release|Any CPU {EC71FBDD-A6BD-4B5D-92FE-E108FE12CE8B}.Release|Any CPU.Build.0 = Release|Any CPU + {EC71FBDD-A6BD-4B5D-92FE-E108FE12CE8B}.Release|x64.ActiveCfg = Release|Any CPU + {EC71FBDD-A6BD-4B5D-92FE-E108FE12CE8B}.Release|x64.Build.0 = Release|Any CPU + {EC71FBDD-A6BD-4B5D-92FE-E108FE12CE8B}.Release|x86.ActiveCfg = Release|Any CPU + {EC71FBDD-A6BD-4B5D-92FE-E108FE12CE8B}.Release|x86.Build.0 = Release|Any CPU {CAE68246-70A8-4E87-9B83-A9F7DA343E5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CAE68246-70A8-4E87-9B83-A9F7DA343E5E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CAE68246-70A8-4E87-9B83-A9F7DA343E5E}.Debug|x64.ActiveCfg = Debug|Any CPU + {CAE68246-70A8-4E87-9B83-A9F7DA343E5E}.Debug|x64.Build.0 = Debug|Any CPU + {CAE68246-70A8-4E87-9B83-A9F7DA343E5E}.Debug|x86.ActiveCfg = Debug|Any CPU + {CAE68246-70A8-4E87-9B83-A9F7DA343E5E}.Debug|x86.Build.0 = Debug|Any CPU {CAE68246-70A8-4E87-9B83-A9F7DA343E5E}.Release|Any CPU.ActiveCfg = Release|Any CPU {CAE68246-70A8-4E87-9B83-A9F7DA343E5E}.Release|Any CPU.Build.0 = Release|Any CPU + {CAE68246-70A8-4E87-9B83-A9F7DA343E5E}.Release|x64.ActiveCfg = Release|Any CPU + {CAE68246-70A8-4E87-9B83-A9F7DA343E5E}.Release|x64.Build.0 = Release|Any CPU + {CAE68246-70A8-4E87-9B83-A9F7DA343E5E}.Release|x86.ActiveCfg = Release|Any CPU + {CAE68246-70A8-4E87-9B83-A9F7DA343E5E}.Release|x86.Build.0 = Release|Any CPU {27C120C9-F618-4C1D-B959-8D0B048D0835}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {27C120C9-F618-4C1D-B959-8D0B048D0835}.Debug|Any CPU.Build.0 = Debug|Any CPU + {27C120C9-F618-4C1D-B959-8D0B048D0835}.Debug|x64.ActiveCfg = Debug|Any CPU + {27C120C9-F618-4C1D-B959-8D0B048D0835}.Debug|x64.Build.0 = Debug|Any CPU + {27C120C9-F618-4C1D-B959-8D0B048D0835}.Debug|x86.ActiveCfg = Debug|Any CPU + {27C120C9-F618-4C1D-B959-8D0B048D0835}.Debug|x86.Build.0 = Debug|Any CPU {27C120C9-F618-4C1D-B959-8D0B048D0835}.Release|Any CPU.ActiveCfg = Release|Any CPU {27C120C9-F618-4C1D-B959-8D0B048D0835}.Release|Any CPU.Build.0 = Release|Any CPU + {27C120C9-F618-4C1D-B959-8D0B048D0835}.Release|x64.ActiveCfg = Release|Any CPU + {27C120C9-F618-4C1D-B959-8D0B048D0835}.Release|x64.Build.0 = Release|Any CPU + {27C120C9-F618-4C1D-B959-8D0B048D0835}.Release|x86.ActiveCfg = Release|Any CPU + {27C120C9-F618-4C1D-B959-8D0B048D0835}.Release|x86.Build.0 = Release|Any CPU {E6E0BBB5-48A7-4FDA-8A47-8B308BCD36AD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E6E0BBB5-48A7-4FDA-8A47-8B308BCD36AD}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E6E0BBB5-48A7-4FDA-8A47-8B308BCD36AD}.Debug|x64.ActiveCfg = Debug|Any CPU + {E6E0BBB5-48A7-4FDA-8A47-8B308BCD36AD}.Debug|x64.Build.0 = Debug|Any CPU + {E6E0BBB5-48A7-4FDA-8A47-8B308BCD36AD}.Debug|x86.ActiveCfg = Debug|Any CPU + {E6E0BBB5-48A7-4FDA-8A47-8B308BCD36AD}.Debug|x86.Build.0 = Debug|Any CPU {E6E0BBB5-48A7-4FDA-8A47-8B308BCD36AD}.Release|Any CPU.ActiveCfg = Release|Any CPU {E6E0BBB5-48A7-4FDA-8A47-8B308BCD36AD}.Release|Any CPU.Build.0 = Release|Any CPU + {E6E0BBB5-48A7-4FDA-8A47-8B308BCD36AD}.Release|x64.ActiveCfg = Release|Any CPU + {E6E0BBB5-48A7-4FDA-8A47-8B308BCD36AD}.Release|x64.Build.0 = Release|Any CPU + {E6E0BBB5-48A7-4FDA-8A47-8B308BCD36AD}.Release|x86.ActiveCfg = Release|Any CPU + {E6E0BBB5-48A7-4FDA-8A47-8B308BCD36AD}.Release|x86.Build.0 = Release|Any CPU {6C3E76B8-C4DA-4E74-9F8B-A8BC4C831722}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6C3E76B8-C4DA-4E74-9F8B-A8BC4C831722}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6C3E76B8-C4DA-4E74-9F8B-A8BC4C831722}.Debug|x64.ActiveCfg = Debug|Any CPU + {6C3E76B8-C4DA-4E74-9F8B-A8BC4C831722}.Debug|x64.Build.0 = Debug|Any CPU + {6C3E76B8-C4DA-4E74-9F8B-A8BC4C831722}.Debug|x86.ActiveCfg = Debug|Any CPU + {6C3E76B8-C4DA-4E74-9F8B-A8BC4C831722}.Debug|x86.Build.0 = Debug|Any CPU {6C3E76B8-C4DA-4E74-9F8B-A8BC4C831722}.Release|Any CPU.ActiveCfg = Release|Any CPU {6C3E76B8-C4DA-4E74-9F8B-A8BC4C831722}.Release|Any CPU.Build.0 = Release|Any CPU + {6C3E76B8-C4DA-4E74-9F8B-A8BC4C831722}.Release|x64.ActiveCfg = Release|Any CPU + {6C3E76B8-C4DA-4E74-9F8B-A8BC4C831722}.Release|x64.Build.0 = Release|Any CPU + {6C3E76B8-C4DA-4E74-9F8B-A8BC4C831722}.Release|x86.ActiveCfg = Release|Any CPU + {6C3E76B8-C4DA-4E74-9F8B-A8BC4C831722}.Release|x86.Build.0 = Release|Any CPU {D86548EA-7047-4623-8824-F6285CD254AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D86548EA-7047-4623-8824-F6285CD254AA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D86548EA-7047-4623-8824-F6285CD254AA}.Debug|x64.ActiveCfg = Debug|Any CPU + {D86548EA-7047-4623-8824-F6285CD254AA}.Debug|x64.Build.0 = Debug|Any CPU + {D86548EA-7047-4623-8824-F6285CD254AA}.Debug|x86.ActiveCfg = Debug|Any CPU + {D86548EA-7047-4623-8824-F6285CD254AA}.Debug|x86.Build.0 = Debug|Any CPU {D86548EA-7047-4623-8824-F6285CD254AA}.Release|Any CPU.ActiveCfg = Release|Any CPU {D86548EA-7047-4623-8824-F6285CD254AA}.Release|Any CPU.Build.0 = Release|Any CPU + {D86548EA-7047-4623-8824-F6285CD254AA}.Release|x64.ActiveCfg = Release|Any CPU + {D86548EA-7047-4623-8824-F6285CD254AA}.Release|x64.Build.0 = Release|Any CPU + {D86548EA-7047-4623-8824-F6285CD254AA}.Release|x86.ActiveCfg = Release|Any CPU + {D86548EA-7047-4623-8824-F6285CD254AA}.Release|x86.Build.0 = Release|Any CPU {EB9C3B4D-FEBD-4691-8F34-AAC2C13F6F2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EB9C3B4D-FEBD-4691-8F34-AAC2C13F6F2F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EB9C3B4D-FEBD-4691-8F34-AAC2C13F6F2F}.Debug|x64.ActiveCfg = Debug|Any CPU + {EB9C3B4D-FEBD-4691-8F34-AAC2C13F6F2F}.Debug|x64.Build.0 = Debug|Any CPU + {EB9C3B4D-FEBD-4691-8F34-AAC2C13F6F2F}.Debug|x86.ActiveCfg = Debug|Any CPU + {EB9C3B4D-FEBD-4691-8F34-AAC2C13F6F2F}.Debug|x86.Build.0 = Debug|Any CPU {EB9C3B4D-FEBD-4691-8F34-AAC2C13F6F2F}.Release|Any CPU.ActiveCfg = Release|Any CPU {EB9C3B4D-FEBD-4691-8F34-AAC2C13F6F2F}.Release|Any CPU.Build.0 = Release|Any CPU + {EB9C3B4D-FEBD-4691-8F34-AAC2C13F6F2F}.Release|x64.ActiveCfg = Release|Any CPU + {EB9C3B4D-FEBD-4691-8F34-AAC2C13F6F2F}.Release|x64.Build.0 = Release|Any CPU + {EB9C3B4D-FEBD-4691-8F34-AAC2C13F6F2F}.Release|x86.ActiveCfg = Release|Any CPU + {EB9C3B4D-FEBD-4691-8F34-AAC2C13F6F2F}.Release|x86.Build.0 = Release|Any CPU {35AC93EF-E383-4F4E-839D-6EE1C62681F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {35AC93EF-E383-4F4E-839D-6EE1C62681F1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {35AC93EF-E383-4F4E-839D-6EE1C62681F1}.Debug|x64.ActiveCfg = Debug|Any CPU + {35AC93EF-E383-4F4E-839D-6EE1C62681F1}.Debug|x64.Build.0 = Debug|Any CPU + {35AC93EF-E383-4F4E-839D-6EE1C62681F1}.Debug|x86.ActiveCfg = Debug|Any CPU + {35AC93EF-E383-4F4E-839D-6EE1C62681F1}.Debug|x86.Build.0 = Debug|Any CPU {35AC93EF-E383-4F4E-839D-6EE1C62681F1}.Release|Any CPU.ActiveCfg = Release|Any CPU {35AC93EF-E383-4F4E-839D-6EE1C62681F1}.Release|Any CPU.Build.0 = Release|Any CPU + {35AC93EF-E383-4F4E-839D-6EE1C62681F1}.Release|x64.ActiveCfg = Release|Any CPU + {35AC93EF-E383-4F4E-839D-6EE1C62681F1}.Release|x64.Build.0 = Release|Any CPU + {35AC93EF-E383-4F4E-839D-6EE1C62681F1}.Release|x86.ActiveCfg = Release|Any CPU + {35AC93EF-E383-4F4E-839D-6EE1C62681F1}.Release|x86.Build.0 = Release|Any CPU {EE01E964-E60E-4C3C-BCF0-AF1A0C0A3DC9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EE01E964-E60E-4C3C-BCF0-AF1A0C0A3DC9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EE01E964-E60E-4C3C-BCF0-AF1A0C0A3DC9}.Debug|x64.ActiveCfg = Debug|Any CPU + {EE01E964-E60E-4C3C-BCF0-AF1A0C0A3DC9}.Debug|x64.Build.0 = Debug|Any CPU + {EE01E964-E60E-4C3C-BCF0-AF1A0C0A3DC9}.Debug|x86.ActiveCfg = Debug|Any CPU + {EE01E964-E60E-4C3C-BCF0-AF1A0C0A3DC9}.Debug|x86.Build.0 = Debug|Any CPU {EE01E964-E60E-4C3C-BCF0-AF1A0C0A3DC9}.Release|Any CPU.ActiveCfg = Release|Any CPU {EE01E964-E60E-4C3C-BCF0-AF1A0C0A3DC9}.Release|Any CPU.Build.0 = Release|Any CPU + {EE01E964-E60E-4C3C-BCF0-AF1A0C0A3DC9}.Release|x64.ActiveCfg = Release|Any CPU + {EE01E964-E60E-4C3C-BCF0-AF1A0C0A3DC9}.Release|x64.Build.0 = Release|Any CPU + {EE01E964-E60E-4C3C-BCF0-AF1A0C0A3DC9}.Release|x86.ActiveCfg = Release|Any CPU + {EE01E964-E60E-4C3C-BCF0-AF1A0C0A3DC9}.Release|x86.Build.0 = Release|Any CPU {DA7A2C04-E8C4-48AA-A37E-27C25BCE280A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DA7A2C04-E8C4-48AA-A37E-27C25BCE280A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DA7A2C04-E8C4-48AA-A37E-27C25BCE280A}.Debug|x64.ActiveCfg = Debug|Any CPU + {DA7A2C04-E8C4-48AA-A37E-27C25BCE280A}.Debug|x64.Build.0 = Debug|Any CPU + {DA7A2C04-E8C4-48AA-A37E-27C25BCE280A}.Debug|x86.ActiveCfg = Debug|Any CPU + {DA7A2C04-E8C4-48AA-A37E-27C25BCE280A}.Debug|x86.Build.0 = Debug|Any CPU {DA7A2C04-E8C4-48AA-A37E-27C25BCE280A}.Release|Any CPU.ActiveCfg = Release|Any CPU {DA7A2C04-E8C4-48AA-A37E-27C25BCE280A}.Release|Any CPU.Build.0 = Release|Any CPU + {DA7A2C04-E8C4-48AA-A37E-27C25BCE280A}.Release|x64.ActiveCfg = Release|Any CPU + {DA7A2C04-E8C4-48AA-A37E-27C25BCE280A}.Release|x64.Build.0 = Release|Any CPU + {DA7A2C04-E8C4-48AA-A37E-27C25BCE280A}.Release|x86.ActiveCfg = Release|Any CPU + {DA7A2C04-E8C4-48AA-A37E-27C25BCE280A}.Release|x86.Build.0 = Release|Any CPU {D91DE561-F403-416F-BD0B-DBF0BA1C4447}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D91DE561-F403-416F-BD0B-DBF0BA1C4447}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D91DE561-F403-416F-BD0B-DBF0BA1C4447}.Debug|x64.ActiveCfg = Debug|Any CPU + {D91DE561-F403-416F-BD0B-DBF0BA1C4447}.Debug|x64.Build.0 = Debug|Any CPU + {D91DE561-F403-416F-BD0B-DBF0BA1C4447}.Debug|x86.ActiveCfg = Debug|Any CPU + {D91DE561-F403-416F-BD0B-DBF0BA1C4447}.Debug|x86.Build.0 = Debug|Any CPU {D91DE561-F403-416F-BD0B-DBF0BA1C4447}.Release|Any CPU.ActiveCfg = Release|Any CPU {D91DE561-F403-416F-BD0B-DBF0BA1C4447}.Release|Any CPU.Build.0 = Release|Any CPU + {D91DE561-F403-416F-BD0B-DBF0BA1C4447}.Release|x64.ActiveCfg = Release|Any CPU + {D91DE561-F403-416F-BD0B-DBF0BA1C4447}.Release|x64.Build.0 = Release|Any CPU + {D91DE561-F403-416F-BD0B-DBF0BA1C4447}.Release|x86.ActiveCfg = Release|Any CPU + {D91DE561-F403-416F-BD0B-DBF0BA1C4447}.Release|x86.Build.0 = Release|Any CPU {D3E07597-BB3D-4249-B873-607E2C128C0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D3E07597-BB3D-4249-B873-607E2C128C0E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3E07597-BB3D-4249-B873-607E2C128C0E}.Debug|x64.ActiveCfg = Debug|Any CPU + {D3E07597-BB3D-4249-B873-607E2C128C0E}.Debug|x64.Build.0 = Debug|Any CPU + {D3E07597-BB3D-4249-B873-607E2C128C0E}.Debug|x86.ActiveCfg = Debug|Any CPU + {D3E07597-BB3D-4249-B873-607E2C128C0E}.Debug|x86.Build.0 = Debug|Any CPU {D3E07597-BB3D-4249-B873-607E2C128C0E}.Release|Any CPU.ActiveCfg = Release|Any CPU {D3E07597-BB3D-4249-B873-607E2C128C0E}.Release|Any CPU.Build.0 = Release|Any CPU + {D3E07597-BB3D-4249-B873-607E2C128C0E}.Release|x64.ActiveCfg = Release|Any CPU + {D3E07597-BB3D-4249-B873-607E2C128C0E}.Release|x64.Build.0 = Release|Any CPU + {D3E07597-BB3D-4249-B873-607E2C128C0E}.Release|x86.ActiveCfg = Release|Any CPU + {D3E07597-BB3D-4249-B873-607E2C128C0E}.Release|x86.Build.0 = Release|Any CPU {77A621CF-9562-411B-A707-C7C02CC3B8FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {77A621CF-9562-411B-A707-C7C02CC3B8FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {77A621CF-9562-411B-A707-C7C02CC3B8FA}.Debug|x64.ActiveCfg = Debug|Any CPU + {77A621CF-9562-411B-A707-C7C02CC3B8FA}.Debug|x64.Build.0 = Debug|Any CPU + {77A621CF-9562-411B-A707-C7C02CC3B8FA}.Debug|x86.ActiveCfg = Debug|Any CPU + {77A621CF-9562-411B-A707-C7C02CC3B8FA}.Debug|x86.Build.0 = Debug|Any CPU {77A621CF-9562-411B-A707-C7C02CC3B8FA}.Release|Any CPU.ActiveCfg = Release|Any CPU {77A621CF-9562-411B-A707-C7C02CC3B8FA}.Release|Any CPU.Build.0 = Release|Any CPU + {77A621CF-9562-411B-A707-C7C02CC3B8FA}.Release|x64.ActiveCfg = Release|Any CPU + {77A621CF-9562-411B-A707-C7C02CC3B8FA}.Release|x64.Build.0 = Release|Any CPU + {77A621CF-9562-411B-A707-C7C02CC3B8FA}.Release|x86.ActiveCfg = Release|Any CPU + {77A621CF-9562-411B-A707-C7C02CC3B8FA}.Release|x86.Build.0 = Release|Any CPU {882E82F1-1A57-4BB9-B126-4CBF700C8F0C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {882E82F1-1A57-4BB9-B126-4CBF700C8F0C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {882E82F1-1A57-4BB9-B126-4CBF700C8F0C}.Debug|x64.ActiveCfg = Debug|Any CPU + {882E82F1-1A57-4BB9-B126-4CBF700C8F0C}.Debug|x64.Build.0 = Debug|Any CPU + {882E82F1-1A57-4BB9-B126-4CBF700C8F0C}.Debug|x86.ActiveCfg = Debug|Any CPU + {882E82F1-1A57-4BB9-B126-4CBF700C8F0C}.Debug|x86.Build.0 = Debug|Any CPU {882E82F1-1A57-4BB9-B126-4CBF700C8F0C}.Release|Any CPU.ActiveCfg = Release|Any CPU {882E82F1-1A57-4BB9-B126-4CBF700C8F0C}.Release|Any CPU.Build.0 = Release|Any CPU + {882E82F1-1A57-4BB9-B126-4CBF700C8F0C}.Release|x64.ActiveCfg = Release|Any CPU + {882E82F1-1A57-4BB9-B126-4CBF700C8F0C}.Release|x64.Build.0 = Release|Any CPU + {882E82F1-1A57-4BB9-B126-4CBF700C8F0C}.Release|x86.ActiveCfg = Release|Any CPU + {882E82F1-1A57-4BB9-B126-4CBF700C8F0C}.Release|x86.Build.0 = Release|Any CPU {20513A4E-FAC7-4106-8976-5D79A3BDFED1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {20513A4E-FAC7-4106-8976-5D79A3BDFED1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {20513A4E-FAC7-4106-8976-5D79A3BDFED1}.Debug|x64.ActiveCfg = Debug|Any CPU + {20513A4E-FAC7-4106-8976-5D79A3BDFED1}.Debug|x64.Build.0 = Debug|Any CPU + {20513A4E-FAC7-4106-8976-5D79A3BDFED1}.Debug|x86.ActiveCfg = Debug|Any CPU + {20513A4E-FAC7-4106-8976-5D79A3BDFED1}.Debug|x86.Build.0 = Debug|Any CPU {20513A4E-FAC7-4106-8976-5D79A3BDFED1}.Release|Any CPU.ActiveCfg = Release|Any CPU {20513A4E-FAC7-4106-8976-5D79A3BDFED1}.Release|Any CPU.Build.0 = Release|Any CPU + {20513A4E-FAC7-4106-8976-5D79A3BDFED1}.Release|x64.ActiveCfg = Release|Any CPU + {20513A4E-FAC7-4106-8976-5D79A3BDFED1}.Release|x64.Build.0 = Release|Any CPU + {20513A4E-FAC7-4106-8976-5D79A3BDFED1}.Release|x86.ActiveCfg = Release|Any CPU + {20513A4E-FAC7-4106-8976-5D79A3BDFED1}.Release|x86.Build.0 = Release|Any CPU {7CE07034-7E02-4C78-B981-F1039412CA5E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7CE07034-7E02-4C78-B981-F1039412CA5E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7CE07034-7E02-4C78-B981-F1039412CA5E}.Debug|x64.ActiveCfg = Debug|Any CPU + {7CE07034-7E02-4C78-B981-F1039412CA5E}.Debug|x64.Build.0 = Debug|Any CPU + {7CE07034-7E02-4C78-B981-F1039412CA5E}.Debug|x86.ActiveCfg = Debug|Any CPU + {7CE07034-7E02-4C78-B981-F1039412CA5E}.Debug|x86.Build.0 = Debug|Any CPU {7CE07034-7E02-4C78-B981-F1039412CA5E}.Release|Any CPU.ActiveCfg = Release|Any CPU {7CE07034-7E02-4C78-B981-F1039412CA5E}.Release|Any CPU.Build.0 = Release|Any CPU + {7CE07034-7E02-4C78-B981-F1039412CA5E}.Release|x64.ActiveCfg = Release|Any CPU + {7CE07034-7E02-4C78-B981-F1039412CA5E}.Release|x64.Build.0 = Release|Any CPU + {7CE07034-7E02-4C78-B981-F1039412CA5E}.Release|x86.ActiveCfg = Release|Any CPU + {7CE07034-7E02-4C78-B981-F1039412CA5E}.Release|x86.Build.0 = Release|Any CPU {5F3A2D1E-EA89-40A7-8D2F-FB4EB2092403}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5F3A2D1E-EA89-40A7-8D2F-FB4EB2092403}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5F3A2D1E-EA89-40A7-8D2F-FB4EB2092403}.Debug|x64.ActiveCfg = Debug|Any CPU + {5F3A2D1E-EA89-40A7-8D2F-FB4EB2092403}.Debug|x64.Build.0 = Debug|Any CPU + {5F3A2D1E-EA89-40A7-8D2F-FB4EB2092403}.Debug|x86.ActiveCfg = Debug|Any CPU + {5F3A2D1E-EA89-40A7-8D2F-FB4EB2092403}.Debug|x86.Build.0 = Debug|Any CPU {5F3A2D1E-EA89-40A7-8D2F-FB4EB2092403}.Release|Any CPU.ActiveCfg = Release|Any CPU {5F3A2D1E-EA89-40A7-8D2F-FB4EB2092403}.Release|Any CPU.Build.0 = Release|Any CPU + {5F3A2D1E-EA89-40A7-8D2F-FB4EB2092403}.Release|x64.ActiveCfg = Release|Any CPU + {5F3A2D1E-EA89-40A7-8D2F-FB4EB2092403}.Release|x64.Build.0 = Release|Any CPU + {5F3A2D1E-EA89-40A7-8D2F-FB4EB2092403}.Release|x86.ActiveCfg = Release|Any CPU + {5F3A2D1E-EA89-40A7-8D2F-FB4EB2092403}.Release|x86.Build.0 = Release|Any CPU {D211A446-38FA-4F97-9A95-1F004A0FFF69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D211A446-38FA-4F97-9A95-1F004A0FFF69}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D211A446-38FA-4F97-9A95-1F004A0FFF69}.Debug|x64.ActiveCfg = Debug|Any CPU + {D211A446-38FA-4F97-9A95-1F004A0FFF69}.Debug|x64.Build.0 = Debug|Any CPU + {D211A446-38FA-4F97-9A95-1F004A0FFF69}.Debug|x86.ActiveCfg = Debug|Any CPU + {D211A446-38FA-4F97-9A95-1F004A0FFF69}.Debug|x86.Build.0 = Debug|Any CPU {D211A446-38FA-4F97-9A95-1F004A0FFF69}.Release|Any CPU.ActiveCfg = Release|Any CPU {D211A446-38FA-4F97-9A95-1F004A0FFF69}.Release|Any CPU.Build.0 = Release|Any CPU + {D211A446-38FA-4F97-9A95-1F004A0FFF69}.Release|x64.ActiveCfg = Release|Any CPU + {D211A446-38FA-4F97-9A95-1F004A0FFF69}.Release|x64.Build.0 = Release|Any CPU + {D211A446-38FA-4F97-9A95-1F004A0FFF69}.Release|x86.ActiveCfg = Release|Any CPU + {D211A446-38FA-4F97-9A95-1F004A0FFF69}.Release|x86.Build.0 = Release|Any CPU {64D99E19-EE25-465A-82E5-17B25F4C4E18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {64D99E19-EE25-465A-82E5-17B25F4C4E18}.Debug|Any CPU.Build.0 = Debug|Any CPU + {64D99E19-EE25-465A-82E5-17B25F4C4E18}.Debug|x64.ActiveCfg = Debug|Any CPU + {64D99E19-EE25-465A-82E5-17B25F4C4E18}.Debug|x64.Build.0 = Debug|Any CPU + {64D99E19-EE25-465A-82E5-17B25F4C4E18}.Debug|x86.ActiveCfg = Debug|Any CPU + {64D99E19-EE25-465A-82E5-17B25F4C4E18}.Debug|x86.Build.0 = Debug|Any CPU {64D99E19-EE25-465A-82E5-17B25F4C4E18}.Release|Any CPU.ActiveCfg = Release|Any CPU {64D99E19-EE25-465A-82E5-17B25F4C4E18}.Release|Any CPU.Build.0 = Release|Any CPU + {64D99E19-EE25-465A-82E5-17B25F4C4E18}.Release|x64.ActiveCfg = Release|Any CPU + {64D99E19-EE25-465A-82E5-17B25F4C4E18}.Release|x64.Build.0 = Release|Any CPU + {64D99E19-EE25-465A-82E5-17B25F4C4E18}.Release|x86.ActiveCfg = Release|Any CPU + {64D99E19-EE25-465A-82E5-17B25F4C4E18}.Release|x86.Build.0 = Release|Any CPU {E803DDB8-81EA-454B-9A66-9C2941100B67}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E803DDB8-81EA-454B-9A66-9C2941100B67}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E803DDB8-81EA-454B-9A66-9C2941100B67}.Debug|x64.ActiveCfg = Debug|Any CPU + {E803DDB8-81EA-454B-9A66-9C2941100B67}.Debug|x64.Build.0 = Debug|Any CPU + {E803DDB8-81EA-454B-9A66-9C2941100B67}.Debug|x86.ActiveCfg = Debug|Any CPU + {E803DDB8-81EA-454B-9A66-9C2941100B67}.Debug|x86.Build.0 = Debug|Any CPU {E803DDB8-81EA-454B-9A66-9C2941100B67}.Release|Any CPU.ActiveCfg = Release|Any CPU {E803DDB8-81EA-454B-9A66-9C2941100B67}.Release|Any CPU.Build.0 = Release|Any CPU + {E803DDB8-81EA-454B-9A66-9C2941100B67}.Release|x64.ActiveCfg = Release|Any CPU + {E803DDB8-81EA-454B-9A66-9C2941100B67}.Release|x64.Build.0 = Release|Any CPU + {E803DDB8-81EA-454B-9A66-9C2941100B67}.Release|x86.ActiveCfg = Release|Any CPU + {E803DDB8-81EA-454B-9A66-9C2941100B67}.Release|x86.Build.0 = Release|Any CPU {88F6D091-CA16-4B71-9499-8D5B8FA2E712}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {88F6D091-CA16-4B71-9499-8D5B8FA2E712}.Debug|Any CPU.Build.0 = Debug|Any CPU + {88F6D091-CA16-4B71-9499-8D5B8FA2E712}.Debug|x64.ActiveCfg = Debug|Any CPU + {88F6D091-CA16-4B71-9499-8D5B8FA2E712}.Debug|x64.Build.0 = Debug|Any CPU + {88F6D091-CA16-4B71-9499-8D5B8FA2E712}.Debug|x86.ActiveCfg = Debug|Any CPU + {88F6D091-CA16-4B71-9499-8D5B8FA2E712}.Debug|x86.Build.0 = Debug|Any CPU {88F6D091-CA16-4B71-9499-8D5B8FA2E712}.Release|Any CPU.ActiveCfg = Release|Any CPU {88F6D091-CA16-4B71-9499-8D5B8FA2E712}.Release|Any CPU.Build.0 = Release|Any CPU + {88F6D091-CA16-4B71-9499-8D5B8FA2E712}.Release|x64.ActiveCfg = Release|Any CPU + {88F6D091-CA16-4B71-9499-8D5B8FA2E712}.Release|x64.Build.0 = Release|Any CPU + {88F6D091-CA16-4B71-9499-8D5B8FA2E712}.Release|x86.ActiveCfg = Release|Any CPU + {88F6D091-CA16-4B71-9499-8D5B8FA2E712}.Release|x86.Build.0 = Release|Any CPU {01E3D389-8872-4EB1-9D3D-13B6ED54DE0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {01E3D389-8872-4EB1-9D3D-13B6ED54DE0E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {01E3D389-8872-4EB1-9D3D-13B6ED54DE0E}.Debug|x64.ActiveCfg = Debug|Any CPU + {01E3D389-8872-4EB1-9D3D-13B6ED54DE0E}.Debug|x64.Build.0 = Debug|Any CPU + {01E3D389-8872-4EB1-9D3D-13B6ED54DE0E}.Debug|x86.ActiveCfg = Debug|Any CPU + {01E3D389-8872-4EB1-9D3D-13B6ED54DE0E}.Debug|x86.Build.0 = Debug|Any CPU {01E3D389-8872-4EB1-9D3D-13B6ED54DE0E}.Release|Any CPU.ActiveCfg = Release|Any CPU {01E3D389-8872-4EB1-9D3D-13B6ED54DE0E}.Release|Any CPU.Build.0 = Release|Any CPU + {01E3D389-8872-4EB1-9D3D-13B6ED54DE0E}.Release|x64.ActiveCfg = Release|Any CPU + {01E3D389-8872-4EB1-9D3D-13B6ED54DE0E}.Release|x64.Build.0 = Release|Any CPU + {01E3D389-8872-4EB1-9D3D-13B6ED54DE0E}.Release|x86.ActiveCfg = Release|Any CPU + {01E3D389-8872-4EB1-9D3D-13B6ED54DE0E}.Release|x86.Build.0 = Release|Any CPU {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Debug|x64.ActiveCfg = Debug|Any CPU + {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Debug|x64.Build.0 = Debug|Any CPU + {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Debug|x86.ActiveCfg = Debug|Any CPU + {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Debug|x86.Build.0 = Debug|Any CPU {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Release|Any CPU.ActiveCfg = Release|Any CPU {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Release|Any CPU.Build.0 = Release|Any CPU + {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Release|x64.ActiveCfg = Release|Any CPU + {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Release|x64.Build.0 = Release|Any CPU + {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Release|x86.ActiveCfg = Release|Any CPU + {575BEFA1-19C2-49B1-8D31-B5D4472328DE}.Release|x86.Build.0 = Release|Any CPU {6C161F55-54B6-42A5-B177-3B0ED50323C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {6C161F55-54B6-42A5-B177-3B0ED50323C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6C161F55-54B6-42A5-B177-3B0ED50323C1}.Debug|x64.ActiveCfg = Debug|Any CPU + {6C161F55-54B6-42A5-B177-3B0ED50323C1}.Debug|x64.Build.0 = Debug|Any CPU + {6C161F55-54B6-42A5-B177-3B0ED50323C1}.Debug|x86.ActiveCfg = Debug|Any CPU + {6C161F55-54B6-42A5-B177-3B0ED50323C1}.Debug|x86.Build.0 = Debug|Any CPU {6C161F55-54B6-42A5-B177-3B0ED50323C1}.Release|Any CPU.ActiveCfg = Release|Any CPU {6C161F55-54B6-42A5-B177-3B0ED50323C1}.Release|Any CPU.Build.0 = Release|Any CPU + {6C161F55-54B6-42A5-B177-3B0ED50323C1}.Release|x64.ActiveCfg = Release|Any CPU + {6C161F55-54B6-42A5-B177-3B0ED50323C1}.Release|x64.Build.0 = Release|Any CPU + {6C161F55-54B6-42A5-B177-3B0ED50323C1}.Release|x86.ActiveCfg = Release|Any CPU + {6C161F55-54B6-42A5-B177-3B0ED50323C1}.Release|x86.Build.0 = Release|Any CPU {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Debug|Any CPU.Build.0 = Debug|Any CPU + {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Debug|x64.ActiveCfg = Debug|Any CPU + {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Debug|x64.Build.0 = Debug|Any CPU + {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Debug|x86.ActiveCfg = Debug|Any CPU + {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Debug|x86.Build.0 = Debug|Any CPU {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Release|Any CPU.ActiveCfg = Release|Any CPU {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Release|Any CPU.Build.0 = Release|Any CPU + {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Release|x64.ActiveCfg = Release|Any CPU + {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Release|x64.Build.0 = Release|Any CPU + {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Release|x86.ActiveCfg = Release|Any CPU + {46C6336C-A1D8-4858-98CE-6F4C698C5A77}.Release|x86.Build.0 = Release|Any CPU {69168816-4394-4DDA-BB6B-C21983D37F0B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {69168816-4394-4DDA-BB6B-C21983D37F0B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {69168816-4394-4DDA-BB6B-C21983D37F0B}.Debug|x64.ActiveCfg = Debug|Any CPU + {69168816-4394-4DDA-BB6B-C21983D37F0B}.Debug|x64.Build.0 = Debug|Any CPU + {69168816-4394-4DDA-BB6B-C21983D37F0B}.Debug|x86.ActiveCfg = Debug|Any CPU + {69168816-4394-4DDA-BB6B-C21983D37F0B}.Debug|x86.Build.0 = Debug|Any CPU {69168816-4394-4DDA-BB6B-C21983D37F0B}.Release|Any CPU.ActiveCfg = Release|Any CPU {69168816-4394-4DDA-BB6B-C21983D37F0B}.Release|Any CPU.Build.0 = Release|Any CPU + {69168816-4394-4DDA-BB6B-C21983D37F0B}.Release|x64.ActiveCfg = Release|Any CPU + {69168816-4394-4DDA-BB6B-C21983D37F0B}.Release|x64.Build.0 = Release|Any CPU + {69168816-4394-4DDA-BB6B-C21983D37F0B}.Release|x86.ActiveCfg = Release|Any CPU + {69168816-4394-4DDA-BB6B-C21983D37F0B}.Release|x86.Build.0 = Release|Any CPU {43D5FE61-ECBF-4B16-AD95-0043E18EB93A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {43D5FE61-ECBF-4B16-AD95-0043E18EB93A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {43D5FE61-ECBF-4B16-AD95-0043E18EB93A}.Debug|x64.ActiveCfg = Debug|Any CPU + {43D5FE61-ECBF-4B16-AD95-0043E18EB93A}.Debug|x64.Build.0 = Debug|Any CPU + {43D5FE61-ECBF-4B16-AD95-0043E18EB93A}.Debug|x86.ActiveCfg = Debug|Any CPU + {43D5FE61-ECBF-4B16-AD95-0043E18EB93A}.Debug|x86.Build.0 = Debug|Any CPU {43D5FE61-ECBF-4B16-AD95-0043E18EB93A}.Release|Any CPU.ActiveCfg = Release|Any CPU {43D5FE61-ECBF-4B16-AD95-0043E18EB93A}.Release|Any CPU.Build.0 = Release|Any CPU + {43D5FE61-ECBF-4B16-AD95-0043E18EB93A}.Release|x64.ActiveCfg = Release|Any CPU + {43D5FE61-ECBF-4B16-AD95-0043E18EB93A}.Release|x64.Build.0 = Release|Any CPU + {43D5FE61-ECBF-4B16-AD95-0043E18EB93A}.Release|x86.ActiveCfg = Release|Any CPU + {43D5FE61-ECBF-4B16-AD95-0043E18EB93A}.Release|x86.Build.0 = Release|Any CPU {E9E1714F-7ED2-4BD1-BA4A-BA06E398288A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E9E1714F-7ED2-4BD1-BA4A-BA06E398288A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E9E1714F-7ED2-4BD1-BA4A-BA06E398288A}.Debug|x64.ActiveCfg = Debug|Any CPU + {E9E1714F-7ED2-4BD1-BA4A-BA06E398288A}.Debug|x64.Build.0 = Debug|Any CPU + {E9E1714F-7ED2-4BD1-BA4A-BA06E398288A}.Debug|x86.ActiveCfg = Debug|Any CPU + {E9E1714F-7ED2-4BD1-BA4A-BA06E398288A}.Debug|x86.Build.0 = Debug|Any CPU {E9E1714F-7ED2-4BD1-BA4A-BA06E398288A}.Release|Any CPU.ActiveCfg = Release|Any CPU {E9E1714F-7ED2-4BD1-BA4A-BA06E398288A}.Release|Any CPU.Build.0 = Release|Any CPU + {E9E1714F-7ED2-4BD1-BA4A-BA06E398288A}.Release|x64.ActiveCfg = Release|Any CPU + {E9E1714F-7ED2-4BD1-BA4A-BA06E398288A}.Release|x64.Build.0 = Release|Any CPU + {E9E1714F-7ED2-4BD1-BA4A-BA06E398288A}.Release|x86.ActiveCfg = Release|Any CPU + {E9E1714F-7ED2-4BD1-BA4A-BA06E398288A}.Release|x86.Build.0 = Release|Any CPU {58CF8957-5045-4F81-884D-72DF48F721CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {58CF8957-5045-4F81-884D-72DF48F721CC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58CF8957-5045-4F81-884D-72DF48F721CC}.Debug|x64.ActiveCfg = Debug|Any CPU + {58CF8957-5045-4F81-884D-72DF48F721CC}.Debug|x64.Build.0 = Debug|Any CPU + {58CF8957-5045-4F81-884D-72DF48F721CC}.Debug|x86.ActiveCfg = Debug|Any CPU + {58CF8957-5045-4F81-884D-72DF48F721CC}.Debug|x86.Build.0 = Debug|Any CPU {58CF8957-5045-4F81-884D-72DF48F721CC}.Release|Any CPU.ActiveCfg = Release|Any CPU {58CF8957-5045-4F81-884D-72DF48F721CC}.Release|Any CPU.Build.0 = Release|Any CPU + {58CF8957-5045-4F81-884D-72DF48F721CC}.Release|x64.ActiveCfg = Release|Any CPU + {58CF8957-5045-4F81-884D-72DF48F721CC}.Release|x64.Build.0 = Release|Any CPU + {58CF8957-5045-4F81-884D-72DF48F721CC}.Release|x86.ActiveCfg = Release|Any CPU + {58CF8957-5045-4F81-884D-72DF48F721CC}.Release|x86.Build.0 = Release|Any CPU {3DA9923E-048E-4FE7-9748-3A0194F5D196}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3DA9923E-048E-4FE7-9748-3A0194F5D196}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3DA9923E-048E-4FE7-9748-3A0194F5D196}.Debug|x64.ActiveCfg = Debug|Any CPU + {3DA9923E-048E-4FE7-9748-3A0194F5D196}.Debug|x64.Build.0 = Debug|Any CPU + {3DA9923E-048E-4FE7-9748-3A0194F5D196}.Debug|x86.ActiveCfg = Debug|Any CPU + {3DA9923E-048E-4FE7-9748-3A0194F5D196}.Debug|x86.Build.0 = Debug|Any CPU {3DA9923E-048E-4FE7-9748-3A0194F5D196}.Release|Any CPU.ActiveCfg = Release|Any CPU {3DA9923E-048E-4FE7-9748-3A0194F5D196}.Release|Any CPU.Build.0 = Release|Any CPU + {3DA9923E-048E-4FE7-9748-3A0194F5D196}.Release|x64.ActiveCfg = Release|Any CPU + {3DA9923E-048E-4FE7-9748-3A0194F5D196}.Release|x64.Build.0 = Release|Any CPU + {3DA9923E-048E-4FE7-9748-3A0194F5D196}.Release|x86.ActiveCfg = Release|Any CPU + {3DA9923E-048E-4FE7-9748-3A0194F5D196}.Release|x86.Build.0 = Release|Any CPU {2C621EED-563C-4F81-A75E-50879E173544}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2C621EED-563C-4F81-A75E-50879E173544}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2C621EED-563C-4F81-A75E-50879E173544}.Debug|x64.ActiveCfg = Debug|Any CPU + {2C621EED-563C-4F81-A75E-50879E173544}.Debug|x64.Build.0 = Debug|Any CPU + {2C621EED-563C-4F81-A75E-50879E173544}.Debug|x86.ActiveCfg = Debug|Any CPU + {2C621EED-563C-4F81-A75E-50879E173544}.Debug|x86.Build.0 = Debug|Any CPU {2C621EED-563C-4F81-A75E-50879E173544}.Release|Any CPU.ActiveCfg = Release|Any CPU {2C621EED-563C-4F81-A75E-50879E173544}.Release|Any CPU.Build.0 = Release|Any CPU + {2C621EED-563C-4F81-A75E-50879E173544}.Release|x64.ActiveCfg = Release|Any CPU + {2C621EED-563C-4F81-A75E-50879E173544}.Release|x64.Build.0 = Release|Any CPU + {2C621EED-563C-4F81-A75E-50879E173544}.Release|x86.ActiveCfg = Release|Any CPU + {2C621EED-563C-4F81-A75E-50879E173544}.Release|x86.Build.0 = Release|Any CPU {D078553A-C70C-4F56-B3E2-9C5BA6384C72}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D078553A-C70C-4F56-B3E2-9C5BA6384C72}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D078553A-C70C-4F56-B3E2-9C5BA6384C72}.Debug|x64.ActiveCfg = Debug|Any CPU + {D078553A-C70C-4F56-B3E2-9C5BA6384C72}.Debug|x64.Build.0 = Debug|Any CPU + {D078553A-C70C-4F56-B3E2-9C5BA6384C72}.Debug|x86.ActiveCfg = Debug|Any CPU + {D078553A-C70C-4F56-B3E2-9C5BA6384C72}.Debug|x86.Build.0 = Debug|Any CPU {D078553A-C70C-4F56-B3E2-9C5BA6384C72}.Release|Any CPU.ActiveCfg = Release|Any CPU {D078553A-C70C-4F56-B3E2-9C5BA6384C72}.Release|Any CPU.Build.0 = Release|Any CPU + {D078553A-C70C-4F56-B3E2-9C5BA6384C72}.Release|x64.ActiveCfg = Release|Any CPU + {D078553A-C70C-4F56-B3E2-9C5BA6384C72}.Release|x64.Build.0 = Release|Any CPU + {D078553A-C70C-4F56-B3E2-9C5BA6384C72}.Release|x86.ActiveCfg = Release|Any CPU + {D078553A-C70C-4F56-B3E2-9C5BA6384C72}.Release|x86.Build.0 = Release|Any CPU {F006B0B4-F25D-4511-9FB3-F17AA44BDCEA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F006B0B4-F25D-4511-9FB3-F17AA44BDCEA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F006B0B4-F25D-4511-9FB3-F17AA44BDCEA}.Debug|x64.ActiveCfg = Debug|Any CPU + {F006B0B4-F25D-4511-9FB3-F17AA44BDCEA}.Debug|x64.Build.0 = Debug|Any CPU + {F006B0B4-F25D-4511-9FB3-F17AA44BDCEA}.Debug|x86.ActiveCfg = Debug|Any CPU + {F006B0B4-F25D-4511-9FB3-F17AA44BDCEA}.Debug|x86.Build.0 = Debug|Any CPU {F006B0B4-F25D-4511-9FB3-F17AA44BDCEA}.Release|Any CPU.ActiveCfg = Release|Any CPU {F006B0B4-F25D-4511-9FB3-F17AA44BDCEA}.Release|Any CPU.Build.0 = Release|Any CPU + {F006B0B4-F25D-4511-9FB3-F17AA44BDCEA}.Release|x64.ActiveCfg = Release|Any CPU + {F006B0B4-F25D-4511-9FB3-F17AA44BDCEA}.Release|x64.Build.0 = Release|Any CPU + {F006B0B4-F25D-4511-9FB3-F17AA44BDCEA}.Release|x86.ActiveCfg = Release|Any CPU + {F006B0B4-F25D-4511-9FB3-F17AA44BDCEA}.Release|x86.Build.0 = Release|Any CPU {EE1AAB08-3FBD-487F-B0B4-BEBA4B69528A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EE1AAB08-3FBD-487F-B0B4-BEBA4B69528A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EE1AAB08-3FBD-487F-B0B4-BEBA4B69528A}.Debug|x64.ActiveCfg = Debug|Any CPU + {EE1AAB08-3FBD-487F-B0B4-BEBA4B69528A}.Debug|x64.Build.0 = Debug|Any CPU + {EE1AAB08-3FBD-487F-B0B4-BEBA4B69528A}.Debug|x86.ActiveCfg = Debug|Any CPU + {EE1AAB08-3FBD-487F-B0B4-BEBA4B69528A}.Debug|x86.Build.0 = Debug|Any CPU {EE1AAB08-3FBD-487F-B0B4-BEBA4B69528A}.Release|Any CPU.ActiveCfg = Release|Any CPU {EE1AAB08-3FBD-487F-B0B4-BEBA4B69528A}.Release|Any CPU.Build.0 = Release|Any CPU + {EE1AAB08-3FBD-487F-B0B4-BEBA4B69528A}.Release|x64.ActiveCfg = Release|Any CPU + {EE1AAB08-3FBD-487F-B0B4-BEBA4B69528A}.Release|x64.Build.0 = Release|Any CPU + {EE1AAB08-3FBD-487F-B0B4-BEBA4B69528A}.Release|x86.ActiveCfg = Release|Any CPU + {EE1AAB08-3FBD-487F-B0B4-BEBA4B69528A}.Release|x86.Build.0 = Release|Any CPU {4DADBBD2-4C63-4C90-9661-EBF6252A7D6F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4DADBBD2-4C63-4C90-9661-EBF6252A7D6F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4DADBBD2-4C63-4C90-9661-EBF6252A7D6F}.Debug|x64.ActiveCfg = Debug|Any CPU + {4DADBBD2-4C63-4C90-9661-EBF6252A7D6F}.Debug|x64.Build.0 = Debug|Any CPU + {4DADBBD2-4C63-4C90-9661-EBF6252A7D6F}.Debug|x86.ActiveCfg = Debug|Any CPU + {4DADBBD2-4C63-4C90-9661-EBF6252A7D6F}.Debug|x86.Build.0 = Debug|Any CPU {4DADBBD2-4C63-4C90-9661-EBF6252A7D6F}.Release|Any CPU.ActiveCfg = Release|Any CPU {4DADBBD2-4C63-4C90-9661-EBF6252A7D6F}.Release|Any CPU.Build.0 = Release|Any CPU + {4DADBBD2-4C63-4C90-9661-EBF6252A7D6F}.Release|x64.ActiveCfg = Release|Any CPU + {4DADBBD2-4C63-4C90-9661-EBF6252A7D6F}.Release|x64.Build.0 = Release|Any CPU + {4DADBBD2-4C63-4C90-9661-EBF6252A7D6F}.Release|x86.ActiveCfg = Release|Any CPU + {4DADBBD2-4C63-4C90-9661-EBF6252A7D6F}.Release|x86.Build.0 = Release|Any CPU {38FB8F75-426E-4265-8D0E-E121837B6FCC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {38FB8F75-426E-4265-8D0E-E121837B6FCC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {38FB8F75-426E-4265-8D0E-E121837B6FCC}.Debug|x64.ActiveCfg = Debug|Any CPU + {38FB8F75-426E-4265-8D0E-E121837B6FCC}.Debug|x64.Build.0 = Debug|Any CPU + {38FB8F75-426E-4265-8D0E-E121837B6FCC}.Debug|x86.ActiveCfg = Debug|Any CPU + {38FB8F75-426E-4265-8D0E-E121837B6FCC}.Debug|x86.Build.0 = Debug|Any CPU {38FB8F75-426E-4265-8D0E-E121837B6FCC}.Release|Any CPU.ActiveCfg = Release|Any CPU {38FB8F75-426E-4265-8D0E-E121837B6FCC}.Release|Any CPU.Build.0 = Release|Any CPU + {38FB8F75-426E-4265-8D0E-E121837B6FCC}.Release|x64.ActiveCfg = Release|Any CPU + {38FB8F75-426E-4265-8D0E-E121837B6FCC}.Release|x64.Build.0 = Release|Any CPU + {38FB8F75-426E-4265-8D0E-E121837B6FCC}.Release|x86.ActiveCfg = Release|Any CPU + {38FB8F75-426E-4265-8D0E-E121837B6FCC}.Release|x86.Build.0 = Release|Any CPU {D863A3C3-CC1D-426F-BDD4-02E7AE2A3170}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D863A3C3-CC1D-426F-BDD4-02E7AE2A3170}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D863A3C3-CC1D-426F-BDD4-02E7AE2A3170}.Debug|x64.ActiveCfg = Debug|Any CPU + {D863A3C3-CC1D-426F-BDD4-02E7AE2A3170}.Debug|x64.Build.0 = Debug|Any CPU + {D863A3C3-CC1D-426F-BDD4-02E7AE2A3170}.Debug|x86.ActiveCfg = Debug|Any CPU + {D863A3C3-CC1D-426F-BDD4-02E7AE2A3170}.Debug|x86.Build.0 = Debug|Any CPU {D863A3C3-CC1D-426F-BDD4-02E7AE2A3170}.Release|Any CPU.ActiveCfg = Release|Any CPU {D863A3C3-CC1D-426F-BDD4-02E7AE2A3170}.Release|Any CPU.Build.0 = Release|Any CPU + {D863A3C3-CC1D-426F-BDD4-02E7AE2A3170}.Release|x64.ActiveCfg = Release|Any CPU + {D863A3C3-CC1D-426F-BDD4-02E7AE2A3170}.Release|x64.Build.0 = Release|Any CPU + {D863A3C3-CC1D-426F-BDD4-02E7AE2A3170}.Release|x86.ActiveCfg = Release|Any CPU + {D863A3C3-CC1D-426F-BDD4-02E7AE2A3170}.Release|x86.Build.0 = Release|Any CPU {E026A085-D881-4AE0-9F08-422AC3903BD7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E026A085-D881-4AE0-9F08-422AC3903BD7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E026A085-D881-4AE0-9F08-422AC3903BD7}.Debug|x64.ActiveCfg = Debug|Any CPU + {E026A085-D881-4AE0-9F08-422AC3903BD7}.Debug|x64.Build.0 = Debug|Any CPU + {E026A085-D881-4AE0-9F08-422AC3903BD7}.Debug|x86.ActiveCfg = Debug|Any CPU + {E026A085-D881-4AE0-9F08-422AC3903BD7}.Debug|x86.Build.0 = Debug|Any CPU {E026A085-D881-4AE0-9F08-422AC3903BD7}.Release|Any CPU.ActiveCfg = Release|Any CPU {E026A085-D881-4AE0-9F08-422AC3903BD7}.Release|Any CPU.Build.0 = Release|Any CPU + {E026A085-D881-4AE0-9F08-422AC3903BD7}.Release|x64.ActiveCfg = Release|Any CPU + {E026A085-D881-4AE0-9F08-422AC3903BD7}.Release|x64.Build.0 = Release|Any CPU + {E026A085-D881-4AE0-9F08-422AC3903BD7}.Release|x86.ActiveCfg = Release|Any CPU + {E026A085-D881-4AE0-9F08-422AC3903BD7}.Release|x86.Build.0 = Release|Any CPU {0CAED4CC-1CFD-4092-A326-AFE4DB3A9AB4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0CAED4CC-1CFD-4092-A326-AFE4DB3A9AB4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0CAED4CC-1CFD-4092-A326-AFE4DB3A9AB4}.Debug|x64.ActiveCfg = Debug|Any CPU + {0CAED4CC-1CFD-4092-A326-AFE4DB3A9AB4}.Debug|x64.Build.0 = Debug|Any CPU + {0CAED4CC-1CFD-4092-A326-AFE4DB3A9AB4}.Debug|x86.ActiveCfg = Debug|Any CPU + {0CAED4CC-1CFD-4092-A326-AFE4DB3A9AB4}.Debug|x86.Build.0 = Debug|Any CPU {0CAED4CC-1CFD-4092-A326-AFE4DB3A9AB4}.Release|Any CPU.ActiveCfg = Release|Any CPU {0CAED4CC-1CFD-4092-A326-AFE4DB3A9AB4}.Release|Any CPU.Build.0 = Release|Any CPU + {0CAED4CC-1CFD-4092-A326-AFE4DB3A9AB4}.Release|x64.ActiveCfg = Release|Any CPU + {0CAED4CC-1CFD-4092-A326-AFE4DB3A9AB4}.Release|x64.Build.0 = Release|Any CPU + {0CAED4CC-1CFD-4092-A326-AFE4DB3A9AB4}.Release|x86.ActiveCfg = Release|Any CPU + {0CAED4CC-1CFD-4092-A326-AFE4DB3A9AB4}.Release|x86.Build.0 = Release|Any CPU {70DD6E17-B98B-4B00-8F38-C489E291BB53}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {70DD6E17-B98B-4B00-8F38-C489E291BB53}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70DD6E17-B98B-4B00-8F38-C489E291BB53}.Debug|x64.ActiveCfg = Debug|Any CPU + {70DD6E17-B98B-4B00-8F38-C489E291BB53}.Debug|x64.Build.0 = Debug|Any CPU + {70DD6E17-B98B-4B00-8F38-C489E291BB53}.Debug|x86.ActiveCfg = Debug|Any CPU + {70DD6E17-B98B-4B00-8F38-C489E291BB53}.Debug|x86.Build.0 = Debug|Any CPU {70DD6E17-B98B-4B00-8F38-C489E291BB53}.Release|Any CPU.ActiveCfg = Release|Any CPU {70DD6E17-B98B-4B00-8F38-C489E291BB53}.Release|Any CPU.Build.0 = Release|Any CPU + {70DD6E17-B98B-4B00-8F38-C489E291BB53}.Release|x64.ActiveCfg = Release|Any CPU + {70DD6E17-B98B-4B00-8F38-C489E291BB53}.Release|x64.Build.0 = Release|Any CPU + {70DD6E17-B98B-4B00-8F38-C489E291BB53}.Release|x86.ActiveCfg = Release|Any CPU + {70DD6E17-B98B-4B00-8F38-C489E291BB53}.Release|x86.Build.0 = Release|Any CPU {667F5544-C1EB-447C-96FD-9B757F04DE2B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {667F5544-C1EB-447C-96FD-9B757F04DE2B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {667F5544-C1EB-447C-96FD-9B757F04DE2B}.Debug|x64.ActiveCfg = Debug|Any CPU + {667F5544-C1EB-447C-96FD-9B757F04DE2B}.Debug|x64.Build.0 = Debug|Any CPU + {667F5544-C1EB-447C-96FD-9B757F04DE2B}.Debug|x86.ActiveCfg = Debug|Any CPU + {667F5544-C1EB-447C-96FD-9B757F04DE2B}.Debug|x86.Build.0 = Debug|Any CPU {667F5544-C1EB-447C-96FD-9B757F04DE2B}.Release|Any CPU.ActiveCfg = Release|Any CPU {667F5544-C1EB-447C-96FD-9B757F04DE2B}.Release|Any CPU.Build.0 = Release|Any CPU + {667F5544-C1EB-447C-96FD-9B757F04DE2B}.Release|x64.ActiveCfg = Release|Any CPU + {667F5544-C1EB-447C-96FD-9B757F04DE2B}.Release|x64.Build.0 = Release|Any CPU + {667F5544-C1EB-447C-96FD-9B757F04DE2B}.Release|x86.ActiveCfg = Release|Any CPU + {667F5544-C1EB-447C-96FD-9B757F04DE2B}.Release|x86.Build.0 = Release|Any CPU {73559227-EBF0-475F-835B-1FF0CD9132AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {73559227-EBF0-475F-835B-1FF0CD9132AA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {73559227-EBF0-475F-835B-1FF0CD9132AA}.Debug|x64.ActiveCfg = Debug|Any CPU + {73559227-EBF0-475F-835B-1FF0CD9132AA}.Debug|x64.Build.0 = Debug|Any CPU + {73559227-EBF0-475F-835B-1FF0CD9132AA}.Debug|x86.ActiveCfg = Debug|Any CPU + {73559227-EBF0-475F-835B-1FF0CD9132AA}.Debug|x86.Build.0 = Debug|Any CPU {73559227-EBF0-475F-835B-1FF0CD9132AA}.Release|Any CPU.ActiveCfg = Release|Any CPU {73559227-EBF0-475F-835B-1FF0CD9132AA}.Release|Any CPU.Build.0 = Release|Any CPU + {73559227-EBF0-475F-835B-1FF0CD9132AA}.Release|x64.ActiveCfg = Release|Any CPU + {73559227-EBF0-475F-835B-1FF0CD9132AA}.Release|x64.Build.0 = Release|Any CPU + {73559227-EBF0-475F-835B-1FF0CD9132AA}.Release|x86.ActiveCfg = Release|Any CPU + {73559227-EBF0-475F-835B-1FF0CD9132AA}.Release|x86.Build.0 = Release|Any CPU {928DC30D-C078-4BB4-A9F8-FE7252C67DC6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {928DC30D-C078-4BB4-A9F8-FE7252C67DC6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {928DC30D-C078-4BB4-A9F8-FE7252C67DC6}.Debug|x64.ActiveCfg = Debug|Any CPU + {928DC30D-C078-4BB4-A9F8-FE7252C67DC6}.Debug|x64.Build.0 = Debug|Any CPU + {928DC30D-C078-4BB4-A9F8-FE7252C67DC6}.Debug|x86.ActiveCfg = Debug|Any CPU + {928DC30D-C078-4BB4-A9F8-FE7252C67DC6}.Debug|x86.Build.0 = Debug|Any CPU {928DC30D-C078-4BB4-A9F8-FE7252C67DC6}.Release|Any CPU.ActiveCfg = Release|Any CPU {928DC30D-C078-4BB4-A9F8-FE7252C67DC6}.Release|Any CPU.Build.0 = Release|Any CPU + {928DC30D-C078-4BB4-A9F8-FE7252C67DC6}.Release|x64.ActiveCfg = Release|Any CPU + {928DC30D-C078-4BB4-A9F8-FE7252C67DC6}.Release|x64.Build.0 = Release|Any CPU + {928DC30D-C078-4BB4-A9F8-FE7252C67DC6}.Release|x86.ActiveCfg = Release|Any CPU + {928DC30D-C078-4BB4-A9F8-FE7252C67DC6}.Release|x86.Build.0 = Release|Any CPU {E69182B3-350A-43F5-A935-5EBBEBECEF97}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E69182B3-350A-43F5-A935-5EBBEBECEF97}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E69182B3-350A-43F5-A935-5EBBEBECEF97}.Debug|x64.ActiveCfg = Debug|Any CPU + {E69182B3-350A-43F5-A935-5EBBEBECEF97}.Debug|x64.Build.0 = Debug|Any CPU + {E69182B3-350A-43F5-A935-5EBBEBECEF97}.Debug|x86.ActiveCfg = Debug|Any CPU + {E69182B3-350A-43F5-A935-5EBBEBECEF97}.Debug|x86.Build.0 = Debug|Any CPU {E69182B3-350A-43F5-A935-5EBBEBECEF97}.Release|Any CPU.ActiveCfg = Release|Any CPU {E69182B3-350A-43F5-A935-5EBBEBECEF97}.Release|Any CPU.Build.0 = Release|Any CPU + {E69182B3-350A-43F5-A935-5EBBEBECEF97}.Release|x64.ActiveCfg = Release|Any CPU + {E69182B3-350A-43F5-A935-5EBBEBECEF97}.Release|x64.Build.0 = Release|Any CPU + {E69182B3-350A-43F5-A935-5EBBEBECEF97}.Release|x86.ActiveCfg = Release|Any CPU + {E69182B3-350A-43F5-A935-5EBBEBECEF97}.Release|x86.Build.0 = Release|Any CPU {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Debug|x64.ActiveCfg = Debug|Any CPU + {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Debug|x64.Build.0 = Debug|Any CPU + {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Debug|x86.ActiveCfg = Debug|Any CPU + {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Debug|x86.Build.0 = Debug|Any CPU {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Release|Any CPU.ActiveCfg = Release|Any CPU {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Release|Any CPU.Build.0 = Release|Any CPU + {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Release|x64.ActiveCfg = Release|Any CPU + {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Release|x64.Build.0 = Release|Any CPU + {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Release|x86.ActiveCfg = Release|Any CPU + {3B801003-BE74-49ED-9749-DA5E99F45EBF}.Release|x86.Build.0 = Release|Any CPU {9CAA07ED-FE5C-4427-A6FA-6C6CB5B4CC62}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9CAA07ED-FE5C-4427-A6FA-6C6CB5B4CC62}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9CAA07ED-FE5C-4427-A6FA-6C6CB5B4CC62}.Debug|x64.ActiveCfg = Debug|Any CPU + {9CAA07ED-FE5C-4427-A6FA-6C6CB5B4CC62}.Debug|x64.Build.0 = Debug|Any CPU + {9CAA07ED-FE5C-4427-A6FA-6C6CB5B4CC62}.Debug|x86.ActiveCfg = Debug|Any CPU + {9CAA07ED-FE5C-4427-A6FA-6C6CB5B4CC62}.Debug|x86.Build.0 = Debug|Any CPU {9CAA07ED-FE5C-4427-A6FA-6C6CB5B4CC62}.Release|Any CPU.ActiveCfg = Release|Any CPU {9CAA07ED-FE5C-4427-A6FA-6C6CB5B4CC62}.Release|Any CPU.Build.0 = Release|Any CPU + {9CAA07ED-FE5C-4427-A6FA-6C6CB5B4CC62}.Release|x64.ActiveCfg = Release|Any CPU + {9CAA07ED-FE5C-4427-A6FA-6C6CB5B4CC62}.Release|x64.Build.0 = Release|Any CPU + {9CAA07ED-FE5C-4427-A6FA-6C6CB5B4CC62}.Release|x86.ActiveCfg = Release|Any CPU + {9CAA07ED-FE5C-4427-A6FA-6C6CB5B4CC62}.Release|x86.Build.0 = Release|Any CPU {925AF101-2203-409C-9C3B-03917316858F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {925AF101-2203-409C-9C3B-03917316858F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {925AF101-2203-409C-9C3B-03917316858F}.Debug|x64.ActiveCfg = Debug|Any CPU + {925AF101-2203-409C-9C3B-03917316858F}.Debug|x64.Build.0 = Debug|Any CPU + {925AF101-2203-409C-9C3B-03917316858F}.Debug|x86.ActiveCfg = Debug|Any CPU + {925AF101-2203-409C-9C3B-03917316858F}.Debug|x86.Build.0 = Debug|Any CPU {925AF101-2203-409C-9C3B-03917316858F}.Release|Any CPU.ActiveCfg = Release|Any CPU {925AF101-2203-409C-9C3B-03917316858F}.Release|Any CPU.Build.0 = Release|Any CPU + {925AF101-2203-409C-9C3B-03917316858F}.Release|x64.ActiveCfg = Release|Any CPU + {925AF101-2203-409C-9C3B-03917316858F}.Release|x64.Build.0 = Release|Any CPU + {925AF101-2203-409C-9C3B-03917316858F}.Release|x86.ActiveCfg = Release|Any CPU + {925AF101-2203-409C-9C3B-03917316858F}.Release|x86.Build.0 = Release|Any CPU {2307198B-5837-4F05-AA84-D6EC2A923D69}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2307198B-5837-4F05-AA84-D6EC2A923D69}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2307198B-5837-4F05-AA84-D6EC2A923D69}.Debug|x64.ActiveCfg = Debug|Any CPU + {2307198B-5837-4F05-AA84-D6EC2A923D69}.Debug|x64.Build.0 = Debug|Any CPU + {2307198B-5837-4F05-AA84-D6EC2A923D69}.Debug|x86.ActiveCfg = Debug|Any CPU + {2307198B-5837-4F05-AA84-D6EC2A923D69}.Debug|x86.Build.0 = Debug|Any CPU {2307198B-5837-4F05-AA84-D6EC2A923D69}.Release|Any CPU.ActiveCfg = Release|Any CPU {2307198B-5837-4F05-AA84-D6EC2A923D69}.Release|Any CPU.Build.0 = Release|Any CPU + {2307198B-5837-4F05-AA84-D6EC2A923D69}.Release|x64.ActiveCfg = Release|Any CPU + {2307198B-5837-4F05-AA84-D6EC2A923D69}.Release|x64.Build.0 = Release|Any CPU + {2307198B-5837-4F05-AA84-D6EC2A923D69}.Release|x86.ActiveCfg = Release|Any CPU + {2307198B-5837-4F05-AA84-D6EC2A923D69}.Release|x86.Build.0 = Release|Any CPU {9467418B-4A9B-4093-9B31-01A9DEF5B372}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9467418B-4A9B-4093-9B31-01A9DEF5B372}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9467418B-4A9B-4093-9B31-01A9DEF5B372}.Debug|x64.ActiveCfg = Debug|Any CPU + {9467418B-4A9B-4093-9B31-01A9DEF5B372}.Debug|x64.Build.0 = Debug|Any CPU + {9467418B-4A9B-4093-9B31-01A9DEF5B372}.Debug|x86.ActiveCfg = Debug|Any CPU + {9467418B-4A9B-4093-9B31-01A9DEF5B372}.Debug|x86.Build.0 = Debug|Any CPU {9467418B-4A9B-4093-9B31-01A9DEF5B372}.Release|Any CPU.ActiveCfg = Release|Any CPU {9467418B-4A9B-4093-9B31-01A9DEF5B372}.Release|Any CPU.Build.0 = Release|Any CPU + {9467418B-4A9B-4093-9B31-01A9DEF5B372}.Release|x64.ActiveCfg = Release|Any CPU + {9467418B-4A9B-4093-9B31-01A9DEF5B372}.Release|x64.Build.0 = Release|Any CPU + {9467418B-4A9B-4093-9B31-01A9DEF5B372}.Release|x86.ActiveCfg = Release|Any CPU + {9467418B-4A9B-4093-9B31-01A9DEF5B372}.Release|x86.Build.0 = Release|Any CPU {CD5770BB-2E0C-4B3C-80E0-21B8CC43DBA9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CD5770BB-2E0C-4B3C-80E0-21B8CC43DBA9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CD5770BB-2E0C-4B3C-80E0-21B8CC43DBA9}.Debug|x64.ActiveCfg = Debug|Any CPU + {CD5770BB-2E0C-4B3C-80E0-21B8CC43DBA9}.Debug|x64.Build.0 = Debug|Any CPU + {CD5770BB-2E0C-4B3C-80E0-21B8CC43DBA9}.Debug|x86.ActiveCfg = Debug|Any CPU + {CD5770BB-2E0C-4B3C-80E0-21B8CC43DBA9}.Debug|x86.Build.0 = Debug|Any CPU {CD5770BB-2E0C-4B3C-80E0-21B8CC43DBA9}.Release|Any CPU.ActiveCfg = Release|Any CPU {CD5770BB-2E0C-4B3C-80E0-21B8CC43DBA9}.Release|Any CPU.Build.0 = Release|Any CPU + {CD5770BB-2E0C-4B3C-80E0-21B8CC43DBA9}.Release|x64.ActiveCfg = Release|Any CPU + {CD5770BB-2E0C-4B3C-80E0-21B8CC43DBA9}.Release|x64.Build.0 = Release|Any CPU + {CD5770BB-2E0C-4B3C-80E0-21B8CC43DBA9}.Release|x86.ActiveCfg = Release|Any CPU + {CD5770BB-2E0C-4B3C-80E0-21B8CC43DBA9}.Release|x86.Build.0 = Release|Any CPU {29E42ADB-85F8-44AE-A9B0-078F84C1B866}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {29E42ADB-85F8-44AE-A9B0-078F84C1B866}.Debug|Any CPU.Build.0 = Debug|Any CPU + {29E42ADB-85F8-44AE-A9B0-078F84C1B866}.Debug|x64.ActiveCfg = Debug|Any CPU + {29E42ADB-85F8-44AE-A9B0-078F84C1B866}.Debug|x64.Build.0 = Debug|Any CPU + {29E42ADB-85F8-44AE-A9B0-078F84C1B866}.Debug|x86.ActiveCfg = Debug|Any CPU + {29E42ADB-85F8-44AE-A9B0-078F84C1B866}.Debug|x86.Build.0 = Debug|Any CPU {29E42ADB-85F8-44AE-A9B0-078F84C1B866}.Release|Any CPU.ActiveCfg = Release|Any CPU {29E42ADB-85F8-44AE-A9B0-078F84C1B866}.Release|Any CPU.Build.0 = Release|Any CPU + {29E42ADB-85F8-44AE-A9B0-078F84C1B866}.Release|x64.ActiveCfg = Release|Any CPU + {29E42ADB-85F8-44AE-A9B0-078F84C1B866}.Release|x64.Build.0 = Release|Any CPU + {29E42ADB-85F8-44AE-A9B0-078F84C1B866}.Release|x86.ActiveCfg = Release|Any CPU + {29E42ADB-85F8-44AE-A9B0-078F84C1B866}.Release|x86.Build.0 = Release|Any CPU {E1963439-2BE5-4DB5-8438-2A9A792A1ADA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E1963439-2BE5-4DB5-8438-2A9A792A1ADA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E1963439-2BE5-4DB5-8438-2A9A792A1ADA}.Debug|x64.ActiveCfg = Debug|Any CPU + {E1963439-2BE5-4DB5-8438-2A9A792A1ADA}.Debug|x64.Build.0 = Debug|Any CPU + {E1963439-2BE5-4DB5-8438-2A9A792A1ADA}.Debug|x86.ActiveCfg = Debug|Any CPU + {E1963439-2BE5-4DB5-8438-2A9A792A1ADA}.Debug|x86.Build.0 = Debug|Any CPU {E1963439-2BE5-4DB5-8438-2A9A792A1ADA}.Release|Any CPU.ActiveCfg = Release|Any CPU {E1963439-2BE5-4DB5-8438-2A9A792A1ADA}.Release|Any CPU.Build.0 = Release|Any CPU + {E1963439-2BE5-4DB5-8438-2A9A792A1ADA}.Release|x64.ActiveCfg = Release|Any CPU + {E1963439-2BE5-4DB5-8438-2A9A792A1ADA}.Release|x64.Build.0 = Release|Any CPU + {E1963439-2BE5-4DB5-8438-2A9A792A1ADA}.Release|x86.ActiveCfg = Release|Any CPU + {E1963439-2BE5-4DB5-8438-2A9A792A1ADA}.Release|x86.Build.0 = Release|Any CPU {D1815C77-16D6-4F99-8814-69065CD89FB3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D1815C77-16D6-4F99-8814-69065CD89FB3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D1815C77-16D6-4F99-8814-69065CD89FB3}.Debug|x64.ActiveCfg = Debug|Any CPU + {D1815C77-16D6-4F99-8814-69065CD89FB3}.Debug|x64.Build.0 = Debug|Any CPU + {D1815C77-16D6-4F99-8814-69065CD89FB3}.Debug|x86.ActiveCfg = Debug|Any CPU + {D1815C77-16D6-4F99-8814-69065CD89FB3}.Debug|x86.Build.0 = Debug|Any CPU {D1815C77-16D6-4F99-8814-69065CD89FB3}.Release|Any CPU.ActiveCfg = Release|Any CPU {D1815C77-16D6-4F99-8814-69065CD89FB3}.Release|Any CPU.Build.0 = Release|Any CPU + {D1815C77-16D6-4F99-8814-69065CD89FB3}.Release|x64.ActiveCfg = Release|Any CPU + {D1815C77-16D6-4F99-8814-69065CD89FB3}.Release|x64.Build.0 = Release|Any CPU + {D1815C77-16D6-4F99-8814-69065CD89FB3}.Release|x86.ActiveCfg = Release|Any CPU + {D1815C77-16D6-4F99-8814-69065CD89FB3}.Release|x86.Build.0 = Release|Any CPU {17F8CA89-D9A2-4863-A5BD-B8E4D2901FD5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {17F8CA89-D9A2-4863-A5BD-B8E4D2901FD5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {17F8CA89-D9A2-4863-A5BD-B8E4D2901FD5}.Debug|x64.ActiveCfg = Debug|Any CPU + {17F8CA89-D9A2-4863-A5BD-B8E4D2901FD5}.Debug|x64.Build.0 = Debug|Any CPU + {17F8CA89-D9A2-4863-A5BD-B8E4D2901FD5}.Debug|x86.ActiveCfg = Debug|Any CPU + {17F8CA89-D9A2-4863-A5BD-B8E4D2901FD5}.Debug|x86.Build.0 = Debug|Any CPU {17F8CA89-D9A2-4863-A5BD-B8E4D2901FD5}.Release|Any CPU.ActiveCfg = Release|Any CPU {17F8CA89-D9A2-4863-A5BD-B8E4D2901FD5}.Release|Any CPU.Build.0 = Release|Any CPU + {17F8CA89-D9A2-4863-A5BD-B8E4D2901FD5}.Release|x64.ActiveCfg = Release|Any CPU + {17F8CA89-D9A2-4863-A5BD-B8E4D2901FD5}.Release|x64.Build.0 = Release|Any CPU + {17F8CA89-D9A2-4863-A5BD-B8E4D2901FD5}.Release|x86.ActiveCfg = Release|Any CPU + {17F8CA89-D9A2-4863-A5BD-B8E4D2901FD5}.Release|x86.Build.0 = Release|Any CPU {9E53F91F-EACD-4191-A487-E727741F1311}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9E53F91F-EACD-4191-A487-E727741F1311}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9E53F91F-EACD-4191-A487-E727741F1311}.Debug|x64.ActiveCfg = Debug|Any CPU + {9E53F91F-EACD-4191-A487-E727741F1311}.Debug|x64.Build.0 = Debug|Any CPU + {9E53F91F-EACD-4191-A487-E727741F1311}.Debug|x86.ActiveCfg = Debug|Any CPU + {9E53F91F-EACD-4191-A487-E727741F1311}.Debug|x86.Build.0 = Debug|Any CPU {9E53F91F-EACD-4191-A487-E727741F1311}.Release|Any CPU.ActiveCfg = Release|Any CPU {9E53F91F-EACD-4191-A487-E727741F1311}.Release|Any CPU.Build.0 = Release|Any CPU + {9E53F91F-EACD-4191-A487-E727741F1311}.Release|x64.ActiveCfg = Release|Any CPU + {9E53F91F-EACD-4191-A487-E727741F1311}.Release|x64.Build.0 = Release|Any CPU + {9E53F91F-EACD-4191-A487-E727741F1311}.Release|x86.ActiveCfg = Release|Any CPU + {9E53F91F-EACD-4191-A487-E727741F1311}.Release|x86.Build.0 = Release|Any CPU {251C7FD3-D313-4BCE-8068-352EC7EEA275}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {251C7FD3-D313-4BCE-8068-352EC7EEA275}.Debug|Any CPU.Build.0 = Debug|Any CPU + {251C7FD3-D313-4BCE-8068-352EC7EEA275}.Debug|x64.ActiveCfg = Debug|Any CPU + {251C7FD3-D313-4BCE-8068-352EC7EEA275}.Debug|x64.Build.0 = Debug|Any CPU + {251C7FD3-D313-4BCE-8068-352EC7EEA275}.Debug|x86.ActiveCfg = Debug|Any CPU + {251C7FD3-D313-4BCE-8068-352EC7EEA275}.Debug|x86.Build.0 = Debug|Any CPU {251C7FD3-D313-4BCE-8068-352EC7EEA275}.Release|Any CPU.ActiveCfg = Release|Any CPU {251C7FD3-D313-4BCE-8068-352EC7EEA275}.Release|Any CPU.Build.0 = Release|Any CPU + {251C7FD3-D313-4BCE-8068-352EC7EEA275}.Release|x64.ActiveCfg = Release|Any CPU + {251C7FD3-D313-4BCE-8068-352EC7EEA275}.Release|x64.Build.0 = Release|Any CPU + {251C7FD3-D313-4BCE-8068-352EC7EEA275}.Release|x86.ActiveCfg = Release|Any CPU + {251C7FD3-D313-4BCE-8068-352EC7EEA275}.Release|x86.Build.0 = Release|Any CPU {FA5D1D6A-2A05-4A3D-99C1-2B6C1D1F99A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FA5D1D6A-2A05-4A3D-99C1-2B6C1D1F99A3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FA5D1D6A-2A05-4A3D-99C1-2B6C1D1F99A3}.Debug|x64.ActiveCfg = Debug|Any CPU + {FA5D1D6A-2A05-4A3D-99C1-2B6C1D1F99A3}.Debug|x64.Build.0 = Debug|Any CPU + {FA5D1D6A-2A05-4A3D-99C1-2B6C1D1F99A3}.Debug|x86.ActiveCfg = Debug|Any CPU + {FA5D1D6A-2A05-4A3D-99C1-2B6C1D1F99A3}.Debug|x86.Build.0 = Debug|Any CPU {FA5D1D6A-2A05-4A3D-99C1-2B6C1D1F99A3}.Release|Any CPU.ActiveCfg = Release|Any CPU {FA5D1D6A-2A05-4A3D-99C1-2B6C1D1F99A3}.Release|Any CPU.Build.0 = Release|Any CPU + {FA5D1D6A-2A05-4A3D-99C1-2B6C1D1F99A3}.Release|x64.ActiveCfg = Release|Any CPU + {FA5D1D6A-2A05-4A3D-99C1-2B6C1D1F99A3}.Release|x64.Build.0 = Release|Any CPU + {FA5D1D6A-2A05-4A3D-99C1-2B6C1D1F99A3}.Release|x86.ActiveCfg = Release|Any CPU + {FA5D1D6A-2A05-4A3D-99C1-2B6C1D1F99A3}.Release|x86.Build.0 = Release|Any CPU {B64FCE08-E9D2-4984-BF12-FE199F257416}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B64FCE08-E9D2-4984-BF12-FE199F257416}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B64FCE08-E9D2-4984-BF12-FE199F257416}.Debug|x64.ActiveCfg = Debug|Any CPU + {B64FCE08-E9D2-4984-BF12-FE199F257416}.Debug|x64.Build.0 = Debug|Any CPU + {B64FCE08-E9D2-4984-BF12-FE199F257416}.Debug|x86.ActiveCfg = Debug|Any CPU + {B64FCE08-E9D2-4984-BF12-FE199F257416}.Debug|x86.Build.0 = Debug|Any CPU {B64FCE08-E9D2-4984-BF12-FE199F257416}.Release|Any CPU.ActiveCfg = Release|Any CPU {B64FCE08-E9D2-4984-BF12-FE199F257416}.Release|Any CPU.Build.0 = Release|Any CPU + {B64FCE08-E9D2-4984-BF12-FE199F257416}.Release|x64.ActiveCfg = Release|Any CPU + {B64FCE08-E9D2-4984-BF12-FE199F257416}.Release|x64.Build.0 = Release|Any CPU + {B64FCE08-E9D2-4984-BF12-FE199F257416}.Release|x86.ActiveCfg = Release|Any CPU + {B64FCE08-E9D2-4984-BF12-FE199F257416}.Release|x86.Build.0 = Release|Any CPU {8B758716-DCC9-4223-8421-5588D1597487}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8B758716-DCC9-4223-8421-5588D1597487}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8B758716-DCC9-4223-8421-5588D1597487}.Debug|x64.ActiveCfg = Debug|Any CPU + {8B758716-DCC9-4223-8421-5588D1597487}.Debug|x64.Build.0 = Debug|Any CPU + {8B758716-DCC9-4223-8421-5588D1597487}.Debug|x86.ActiveCfg = Debug|Any CPU + {8B758716-DCC9-4223-8421-5588D1597487}.Debug|x86.Build.0 = Debug|Any CPU {8B758716-DCC9-4223-8421-5588D1597487}.Release|Any CPU.ActiveCfg = Release|Any CPU {8B758716-DCC9-4223-8421-5588D1597487}.Release|Any CPU.Build.0 = Release|Any CPU + {8B758716-DCC9-4223-8421-5588D1597487}.Release|x64.ActiveCfg = Release|Any CPU + {8B758716-DCC9-4223-8421-5588D1597487}.Release|x64.Build.0 = Release|Any CPU + {8B758716-DCC9-4223-8421-5588D1597487}.Release|x86.ActiveCfg = Release|Any CPU + {8B758716-DCC9-4223-8421-5588D1597487}.Release|x86.Build.0 = Release|Any CPU {79323211-E658-493E-9863-035AA4C3F913}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {79323211-E658-493E-9863-035AA4C3F913}.Debug|Any CPU.Build.0 = Debug|Any CPU + {79323211-E658-493E-9863-035AA4C3F913}.Debug|x64.ActiveCfg = Debug|Any CPU + {79323211-E658-493E-9863-035AA4C3F913}.Debug|x64.Build.0 = Debug|Any CPU + {79323211-E658-493E-9863-035AA4C3F913}.Debug|x86.ActiveCfg = Debug|Any CPU + {79323211-E658-493E-9863-035AA4C3F913}.Debug|x86.Build.0 = Debug|Any CPU {79323211-E658-493E-9863-035AA4C3F913}.Release|Any CPU.ActiveCfg = Release|Any CPU {79323211-E658-493E-9863-035AA4C3F913}.Release|Any CPU.Build.0 = Release|Any CPU + {79323211-E658-493E-9863-035AA4C3F913}.Release|x64.ActiveCfg = Release|Any CPU + {79323211-E658-493E-9863-035AA4C3F913}.Release|x64.Build.0 = Release|Any CPU + {79323211-E658-493E-9863-035AA4C3F913}.Release|x86.ActiveCfg = Release|Any CPU + {79323211-E658-493E-9863-035AA4C3F913}.Release|x86.Build.0 = Release|Any CPU {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Debug|x64.ActiveCfg = Debug|Any CPU + {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Debug|x64.Build.0 = Debug|Any CPU + {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Debug|x86.ActiveCfg = Debug|Any CPU + {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Debug|x86.Build.0 = Debug|Any CPU {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Release|Any CPU.ActiveCfg = Release|Any CPU {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Release|Any CPU.Build.0 = Release|Any CPU + {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Release|x64.ActiveCfg = Release|Any CPU + {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Release|x64.Build.0 = Release|Any CPU + {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Release|x86.ActiveCfg = Release|Any CPU + {A0CFBDD6-A3CB-438C-83F1-5025F12E2D42}.Release|x86.Build.0 = Release|Any CPU {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Debug|x64.ActiveCfg = Debug|Any CPU + {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Debug|x64.Build.0 = Debug|Any CPU + {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Debug|x86.ActiveCfg = Debug|Any CPU + {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Debug|x86.Build.0 = Debug|Any CPU {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Release|Any CPU.ActiveCfg = Release|Any CPU {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Release|Any CPU.Build.0 = Release|Any CPU + {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Release|x64.ActiveCfg = Release|Any CPU + {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Release|x64.Build.0 = Release|Any CPU + {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Release|x86.ActiveCfg = Release|Any CPU + {D53A17BB-4E23-451D-AD9B-E1F6AC3F7958}.Release|x86.Build.0 = Release|Any CPU {02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}.Debug|x64.ActiveCfg = Debug|Any CPU + {02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}.Debug|x64.Build.0 = Debug|Any CPU + {02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}.Debug|x86.ActiveCfg = Debug|Any CPU + {02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}.Debug|x86.Build.0 = Debug|Any CPU {02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}.Release|Any CPU.ActiveCfg = Release|Any CPU {02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}.Release|Any CPU.Build.0 = Release|Any CPU + {02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}.Release|x64.ActiveCfg = Release|Any CPU + {02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}.Release|x64.Build.0 = Release|Any CPU + {02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}.Release|x86.ActiveCfg = Release|Any CPU + {02B1FBE2-850E-4612-ABC6-DD62BCF2DD6B}.Release|x86.Build.0 = Release|Any CPU {68443D4A-1608-4039-B995-7AF4CF82E9F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {68443D4A-1608-4039-B995-7AF4CF82E9F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {68443D4A-1608-4039-B995-7AF4CF82E9F8}.Debug|x64.ActiveCfg = Debug|Any CPU + {68443D4A-1608-4039-B995-7AF4CF82E9F8}.Debug|x64.Build.0 = Debug|Any CPU + {68443D4A-1608-4039-B995-7AF4CF82E9F8}.Debug|x86.ActiveCfg = Debug|Any CPU + {68443D4A-1608-4039-B995-7AF4CF82E9F8}.Debug|x86.Build.0 = Debug|Any CPU {68443D4A-1608-4039-B995-7AF4CF82E9F8}.Release|Any CPU.ActiveCfg = Release|Any CPU {68443D4A-1608-4039-B995-7AF4CF82E9F8}.Release|Any CPU.Build.0 = Release|Any CPU + {68443D4A-1608-4039-B995-7AF4CF82E9F8}.Release|x64.ActiveCfg = Release|Any CPU + {68443D4A-1608-4039-B995-7AF4CF82E9F8}.Release|x64.Build.0 = Release|Any CPU + {68443D4A-1608-4039-B995-7AF4CF82E9F8}.Release|x86.ActiveCfg = Release|Any CPU + {68443D4A-1608-4039-B995-7AF4CF82E9F8}.Release|x86.Build.0 = Release|Any CPU {75E5C841-5F36-4C44-A532-57CB8E7FFE15}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {75E5C841-5F36-4C44-A532-57CB8E7FFE15}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75E5C841-5F36-4C44-A532-57CB8E7FFE15}.Debug|x64.ActiveCfg = Debug|Any CPU + {75E5C841-5F36-4C44-A532-57CB8E7FFE15}.Debug|x64.Build.0 = Debug|Any CPU + {75E5C841-5F36-4C44-A532-57CB8E7FFE15}.Debug|x86.ActiveCfg = Debug|Any CPU + {75E5C841-5F36-4C44-A532-57CB8E7FFE15}.Debug|x86.Build.0 = Debug|Any CPU {75E5C841-5F36-4C44-A532-57CB8E7FFE15}.Release|Any CPU.ActiveCfg = Release|Any CPU {75E5C841-5F36-4C44-A532-57CB8E7FFE15}.Release|Any CPU.Build.0 = Release|Any CPU + {75E5C841-5F36-4C44-A532-57CB8E7FFE15}.Release|x64.ActiveCfg = Release|Any CPU + {75E5C841-5F36-4C44-A532-57CB8E7FFE15}.Release|x64.Build.0 = Release|Any CPU + {75E5C841-5F36-4C44-A532-57CB8E7FFE15}.Release|x86.ActiveCfg = Release|Any CPU + {75E5C841-5F36-4C44-A532-57CB8E7FFE15}.Release|x86.Build.0 = Release|Any CPU {C44242F7-D55D-4867-AAF4-A786E404312E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C44242F7-D55D-4867-AAF4-A786E404312E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C44242F7-D55D-4867-AAF4-A786E404312E}.Debug|x64.ActiveCfg = Debug|Any CPU + {C44242F7-D55D-4867-AAF4-A786E404312E}.Debug|x64.Build.0 = Debug|Any CPU + {C44242F7-D55D-4867-AAF4-A786E404312E}.Debug|x86.ActiveCfg = Debug|Any CPU + {C44242F7-D55D-4867-AAF4-A786E404312E}.Debug|x86.Build.0 = Debug|Any CPU {C44242F7-D55D-4867-AAF4-A786E404312E}.Release|Any CPU.ActiveCfg = Release|Any CPU {C44242F7-D55D-4867-AAF4-A786E404312E}.Release|Any CPU.Build.0 = Release|Any CPU + {C44242F7-D55D-4867-AAF4-A786E404312E}.Release|x64.ActiveCfg = Release|Any CPU + {C44242F7-D55D-4867-AAF4-A786E404312E}.Release|x64.Build.0 = Release|Any CPU + {C44242F7-D55D-4867-AAF4-A786E404312E}.Release|x86.ActiveCfg = Release|Any CPU + {C44242F7-D55D-4867-AAF4-A786E404312E}.Release|x86.Build.0 = Release|Any CPU {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Debug|x64.ActiveCfg = Debug|Any CPU + {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Debug|x64.Build.0 = Debug|Any CPU + {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Debug|x86.ActiveCfg = Debug|Any CPU + {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Debug|x86.Build.0 = Debug|Any CPU {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Release|Any CPU.ActiveCfg = Release|Any CPU {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Release|Any CPU.Build.0 = Release|Any CPU + {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Release|x64.ActiveCfg = Release|Any CPU + {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Release|x64.Build.0 = Release|Any CPU + {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Release|x86.ActiveCfg = Release|Any CPU + {A80E9A0B-8932-4B5D-83FB-6751708FD484}.Release|x86.Build.0 = Release|Any CPU {658D7EDE-A057-4256-96B6-083D3C2B9704}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {658D7EDE-A057-4256-96B6-083D3C2B9704}.Debug|Any CPU.Build.0 = Debug|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Debug|x64.ActiveCfg = Debug|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Debug|x64.Build.0 = Debug|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Debug|x86.ActiveCfg = Debug|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Debug|x86.Build.0 = Debug|Any CPU {658D7EDE-A057-4256-96B6-083D3C2B9704}.Release|Any CPU.ActiveCfg = Release|Any CPU {658D7EDE-A057-4256-96B6-083D3C2B9704}.Release|Any CPU.Build.0 = Release|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Release|x64.ActiveCfg = Release|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Release|x64.Build.0 = Release|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Release|x86.ActiveCfg = Release|Any CPU + {658D7EDE-A057-4256-96B6-083D3C2B9704}.Release|x86.Build.0 = Release|Any CPU {36D4B268-FD3A-4655-A41B-D56D68476C83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {36D4B268-FD3A-4655-A41B-D56D68476C83}.Debug|Any CPU.Build.0 = Debug|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Debug|x64.ActiveCfg = Debug|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Debug|x64.Build.0 = Debug|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Debug|x86.ActiveCfg = Debug|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Debug|x86.Build.0 = Debug|Any CPU {36D4B268-FD3A-4655-A41B-D56D68476C83}.Release|Any CPU.ActiveCfg = Release|Any CPU {36D4B268-FD3A-4655-A41B-D56D68476C83}.Release|Any CPU.Build.0 = Release|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Release|x64.ActiveCfg = Release|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Release|x64.Build.0 = Release|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Release|x86.ActiveCfg = Release|Any CPU + {36D4B268-FD3A-4655-A41B-D56D68476C83}.Release|x86.Build.0 = Release|Any CPU {1738845A-5348-4EB8-B736-CD1D22A808B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1738845A-5348-4EB8-B736-CD1D22A808B4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1738845A-5348-4EB8-B736-CD1D22A808B4}.Debug|x64.ActiveCfg = Debug|Any CPU + {1738845A-5348-4EB8-B736-CD1D22A808B4}.Debug|x64.Build.0 = Debug|Any CPU + {1738845A-5348-4EB8-B736-CD1D22A808B4}.Debug|x86.ActiveCfg = Debug|Any CPU + {1738845A-5348-4EB8-B736-CD1D22A808B4}.Debug|x86.Build.0 = Debug|Any CPU {1738845A-5348-4EB8-B736-CD1D22A808B4}.Release|Any CPU.ActiveCfg = Release|Any CPU {1738845A-5348-4EB8-B736-CD1D22A808B4}.Release|Any CPU.Build.0 = Release|Any CPU + {1738845A-5348-4EB8-B736-CD1D22A808B4}.Release|x64.ActiveCfg = Release|Any CPU + {1738845A-5348-4EB8-B736-CD1D22A808B4}.Release|x64.Build.0 = Release|Any CPU + {1738845A-5348-4EB8-B736-CD1D22A808B4}.Release|x86.ActiveCfg = Release|Any CPU + {1738845A-5348-4EB8-B736-CD1D22A808B4}.Release|x86.Build.0 = Release|Any CPU {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Debug|x64.ActiveCfg = Debug|Any CPU + {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Debug|x64.Build.0 = Debug|Any CPU + {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Debug|x86.ActiveCfg = Debug|Any CPU + {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Debug|x86.Build.0 = Debug|Any CPU {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Release|Any CPU.ActiveCfg = Release|Any CPU {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Release|Any CPU.Build.0 = Release|Any CPU + {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Release|x64.ActiveCfg = Release|Any CPU + {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Release|x64.Build.0 = Release|Any CPU + {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Release|x86.ActiveCfg = Release|Any CPU + {2B83DF1F-0FD2-4DEA-ABC5-E324B51401D4}.Release|x86.Build.0 = Release|Any CPU {60D0E384-965E-4F81-9D71-B28F419254FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {60D0E384-965E-4F81-9D71-B28F419254FC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {60D0E384-965E-4F81-9D71-B28F419254FC}.Debug|x64.ActiveCfg = Debug|Any CPU + {60D0E384-965E-4F81-9D71-B28F419254FC}.Debug|x64.Build.0 = Debug|Any CPU + {60D0E384-965E-4F81-9D71-B28F419254FC}.Debug|x86.ActiveCfg = Debug|Any CPU + {60D0E384-965E-4F81-9D71-B28F419254FC}.Debug|x86.Build.0 = Debug|Any CPU {60D0E384-965E-4F81-9D71-B28F419254FC}.Release|Any CPU.ActiveCfg = Release|Any CPU {60D0E384-965E-4F81-9D71-B28F419254FC}.Release|Any CPU.Build.0 = Release|Any CPU + {60D0E384-965E-4F81-9D71-B28F419254FC}.Release|x64.ActiveCfg = Release|Any CPU + {60D0E384-965E-4F81-9D71-B28F419254FC}.Release|x64.Build.0 = Release|Any CPU + {60D0E384-965E-4F81-9D71-B28F419254FC}.Release|x86.ActiveCfg = Release|Any CPU + {60D0E384-965E-4F81-9D71-B28F419254FC}.Release|x86.Build.0 = Release|Any CPU {845E6A13-D1B5-4DDC-A16C-68D807E3B4C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {845E6A13-D1B5-4DDC-A16C-68D807E3B4C7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {845E6A13-D1B5-4DDC-A16C-68D807E3B4C7}.Debug|x64.ActiveCfg = Debug|Any CPU + {845E6A13-D1B5-4DDC-A16C-68D807E3B4C7}.Debug|x64.Build.0 = Debug|Any CPU + {845E6A13-D1B5-4DDC-A16C-68D807E3B4C7}.Debug|x86.ActiveCfg = Debug|Any CPU + {845E6A13-D1B5-4DDC-A16C-68D807E3B4C7}.Debug|x86.Build.0 = Debug|Any CPU {845E6A13-D1B5-4DDC-A16C-68D807E3B4C7}.Release|Any CPU.ActiveCfg = Release|Any CPU {845E6A13-D1B5-4DDC-A16C-68D807E3B4C7}.Release|Any CPU.Build.0 = Release|Any CPU + {845E6A13-D1B5-4DDC-A16C-68D807E3B4C7}.Release|x64.ActiveCfg = Release|Any CPU + {845E6A13-D1B5-4DDC-A16C-68D807E3B4C7}.Release|x64.Build.0 = Release|Any CPU + {845E6A13-D1B5-4DDC-A16C-68D807E3B4C7}.Release|x86.ActiveCfg = Release|Any CPU + {845E6A13-D1B5-4DDC-A16C-68D807E3B4C7}.Release|x86.Build.0 = Release|Any CPU {8E49687A-E69F-49F2-8DB0-428D0883A937}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8E49687A-E69F-49F2-8DB0-428D0883A937}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8E49687A-E69F-49F2-8DB0-428D0883A937}.Debug|x64.ActiveCfg = Debug|Any CPU + {8E49687A-E69F-49F2-8DB0-428D0883A937}.Debug|x64.Build.0 = Debug|Any CPU + {8E49687A-E69F-49F2-8DB0-428D0883A937}.Debug|x86.ActiveCfg = Debug|Any CPU + {8E49687A-E69F-49F2-8DB0-428D0883A937}.Debug|x86.Build.0 = Debug|Any CPU {8E49687A-E69F-49F2-8DB0-428D0883A937}.Release|Any CPU.ActiveCfg = Release|Any CPU {8E49687A-E69F-49F2-8DB0-428D0883A937}.Release|Any CPU.Build.0 = Release|Any CPU + {8E49687A-E69F-49F2-8DB0-428D0883A937}.Release|x64.ActiveCfg = Release|Any CPU + {8E49687A-E69F-49F2-8DB0-428D0883A937}.Release|x64.Build.0 = Release|Any CPU + {8E49687A-E69F-49F2-8DB0-428D0883A937}.Release|x86.ActiveCfg = Release|Any CPU + {8E49687A-E69F-49F2-8DB0-428D0883A937}.Release|x86.Build.0 = Release|Any CPU {50968CDE-1029-4051-B2E5-B69D0ECF2A18}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {50968CDE-1029-4051-B2E5-B69D0ECF2A18}.Debug|Any CPU.Build.0 = Debug|Any CPU + {50968CDE-1029-4051-B2E5-B69D0ECF2A18}.Debug|x64.ActiveCfg = Debug|Any CPU + {50968CDE-1029-4051-B2E5-B69D0ECF2A18}.Debug|x64.Build.0 = Debug|Any CPU + {50968CDE-1029-4051-B2E5-B69D0ECF2A18}.Debug|x86.ActiveCfg = Debug|Any CPU + {50968CDE-1029-4051-B2E5-B69D0ECF2A18}.Debug|x86.Build.0 = Debug|Any CPU {50968CDE-1029-4051-B2E5-B69D0ECF2A18}.Release|Any CPU.ActiveCfg = Release|Any CPU {50968CDE-1029-4051-B2E5-B69D0ECF2A18}.Release|Any CPU.Build.0 = Release|Any CPU + {50968CDE-1029-4051-B2E5-B69D0ECF2A18}.Release|x64.ActiveCfg = Release|Any CPU + {50968CDE-1029-4051-B2E5-B69D0ECF2A18}.Release|x64.Build.0 = Release|Any CPU + {50968CDE-1029-4051-B2E5-B69D0ECF2A18}.Release|x86.ActiveCfg = Release|Any CPU + {50968CDE-1029-4051-B2E5-B69D0ECF2A18}.Release|x86.Build.0 = Release|Any CPU {2CD3B26A-CA81-4279-8D5D-6A594517BB3F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2CD3B26A-CA81-4279-8D5D-6A594517BB3F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2CD3B26A-CA81-4279-8D5D-6A594517BB3F}.Debug|x64.ActiveCfg = Debug|Any CPU + {2CD3B26A-CA81-4279-8D5D-6A594517BB3F}.Debug|x64.Build.0 = Debug|Any CPU + {2CD3B26A-CA81-4279-8D5D-6A594517BB3F}.Debug|x86.ActiveCfg = Debug|Any CPU + {2CD3B26A-CA81-4279-8D5D-6A594517BB3F}.Debug|x86.Build.0 = Debug|Any CPU {2CD3B26A-CA81-4279-8D5D-6A594517BB3F}.Release|Any CPU.ActiveCfg = Release|Any CPU {2CD3B26A-CA81-4279-8D5D-6A594517BB3F}.Release|Any CPU.Build.0 = Release|Any CPU + {2CD3B26A-CA81-4279-8D5D-6A594517BB3F}.Release|x64.ActiveCfg = Release|Any CPU + {2CD3B26A-CA81-4279-8D5D-6A594517BB3F}.Release|x64.Build.0 = Release|Any CPU + {2CD3B26A-CA81-4279-8D5D-6A594517BB3F}.Release|x86.ActiveCfg = Release|Any CPU + {2CD3B26A-CA81-4279-8D5D-6A594517BB3F}.Release|x86.Build.0 = Release|Any CPU {2A864049-9CD5-4493-8CDB-C408474D43D4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2A864049-9CD5-4493-8CDB-C408474D43D4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2A864049-9CD5-4493-8CDB-C408474D43D4}.Debug|x64.ActiveCfg = Debug|Any CPU + {2A864049-9CD5-4493-8CDB-C408474D43D4}.Debug|x64.Build.0 = Debug|Any CPU + {2A864049-9CD5-4493-8CDB-C408474D43D4}.Debug|x86.ActiveCfg = Debug|Any CPU + {2A864049-9CD5-4493-8CDB-C408474D43D4}.Debug|x86.Build.0 = Debug|Any CPU {2A864049-9CD5-4493-8CDB-C408474D43D4}.Release|Any CPU.ActiveCfg = Release|Any CPU {2A864049-9CD5-4493-8CDB-C408474D43D4}.Release|Any CPU.Build.0 = Release|Any CPU + {2A864049-9CD5-4493-8CDB-C408474D43D4}.Release|x64.ActiveCfg = Release|Any CPU + {2A864049-9CD5-4493-8CDB-C408474D43D4}.Release|x64.Build.0 = Release|Any CPU + {2A864049-9CD5-4493-8CDB-C408474D43D4}.Release|x86.ActiveCfg = Release|Any CPU + {2A864049-9CD5-4493-8CDB-C408474D43D4}.Release|x86.Build.0 = Release|Any CPU {C1D891B0-AE83-42CB-987D-425A2787DE78}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C1D891B0-AE83-42CB-987D-425A2787DE78}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C1D891B0-AE83-42CB-987D-425A2787DE78}.Debug|x64.ActiveCfg = Debug|Any CPU + {C1D891B0-AE83-42CB-987D-425A2787DE78}.Debug|x64.Build.0 = Debug|Any CPU + {C1D891B0-AE83-42CB-987D-425A2787DE78}.Debug|x86.ActiveCfg = Debug|Any CPU + {C1D891B0-AE83-42CB-987D-425A2787DE78}.Debug|x86.Build.0 = Debug|Any CPU {C1D891B0-AE83-42CB-987D-425A2787DE78}.Release|Any CPU.ActiveCfg = Release|Any CPU {C1D891B0-AE83-42CB-987D-425A2787DE78}.Release|Any CPU.Build.0 = Release|Any CPU + {C1D891B0-AE83-42CB-987D-425A2787DE78}.Release|x64.ActiveCfg = Release|Any CPU + {C1D891B0-AE83-42CB-987D-425A2787DE78}.Release|x64.Build.0 = Release|Any CPU + {C1D891B0-AE83-42CB-987D-425A2787DE78}.Release|x86.ActiveCfg = Release|Any CPU + {C1D891B0-AE83-42CB-987D-425A2787DE78}.Release|x86.Build.0 = Release|Any CPU {04F44063-C952-403A-815F-EFB778BDA125}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {04F44063-C952-403A-815F-EFB778BDA125}.Debug|Any CPU.Build.0 = Debug|Any CPU + {04F44063-C952-403A-815F-EFB778BDA125}.Debug|x64.ActiveCfg = Debug|Any CPU + {04F44063-C952-403A-815F-EFB778BDA125}.Debug|x64.Build.0 = Debug|Any CPU + {04F44063-C952-403A-815F-EFB778BDA125}.Debug|x86.ActiveCfg = Debug|Any CPU + {04F44063-C952-403A-815F-EFB778BDA125}.Debug|x86.Build.0 = Debug|Any CPU {04F44063-C952-403A-815F-EFB778BDA125}.Release|Any CPU.ActiveCfg = Release|Any CPU {04F44063-C952-403A-815F-EFB778BDA125}.Release|Any CPU.Build.0 = Release|Any CPU + {04F44063-C952-403A-815F-EFB778BDA125}.Release|x64.ActiveCfg = Release|Any CPU + {04F44063-C952-403A-815F-EFB778BDA125}.Release|x64.Build.0 = Release|Any CPU + {04F44063-C952-403A-815F-EFB778BDA125}.Release|x86.ActiveCfg = Release|Any CPU + {04F44063-C952-403A-815F-EFB778BDA125}.Release|x86.Build.0 = Release|Any CPU {231F1581-AA21-44C3-BF27-51EB3AD5355C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {231F1581-AA21-44C3-BF27-51EB3AD5355C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {231F1581-AA21-44C3-BF27-51EB3AD5355C}.Debug|x64.ActiveCfg = Debug|Any CPU + {231F1581-AA21-44C3-BF27-51EB3AD5355C}.Debug|x64.Build.0 = Debug|Any CPU + {231F1581-AA21-44C3-BF27-51EB3AD5355C}.Debug|x86.ActiveCfg = Debug|Any CPU + {231F1581-AA21-44C3-BF27-51EB3AD5355C}.Debug|x86.Build.0 = Debug|Any CPU {231F1581-AA21-44C3-BF27-51EB3AD5355C}.Release|Any CPU.ActiveCfg = Release|Any CPU {231F1581-AA21-44C3-BF27-51EB3AD5355C}.Release|Any CPU.Build.0 = Release|Any CPU + {231F1581-AA21-44C3-BF27-51EB3AD5355C}.Release|x64.ActiveCfg = Release|Any CPU + {231F1581-AA21-44C3-BF27-51EB3AD5355C}.Release|x64.Build.0 = Release|Any CPU + {231F1581-AA21-44C3-BF27-51EB3AD5355C}.Release|x86.ActiveCfg = Release|Any CPU + {231F1581-AA21-44C3-BF27-51EB3AD5355C}.Release|x86.Build.0 = Release|Any CPU {C9142DED-1F6C-4385-A37D-81E46B233306}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C9142DED-1F6C-4385-A37D-81E46B233306}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C9142DED-1F6C-4385-A37D-81E46B233306}.Debug|x64.ActiveCfg = Debug|Any CPU + {C9142DED-1F6C-4385-A37D-81E46B233306}.Debug|x64.Build.0 = Debug|Any CPU + {C9142DED-1F6C-4385-A37D-81E46B233306}.Debug|x86.ActiveCfg = Debug|Any CPU + {C9142DED-1F6C-4385-A37D-81E46B233306}.Debug|x86.Build.0 = Debug|Any CPU {C9142DED-1F6C-4385-A37D-81E46B233306}.Release|Any CPU.ActiveCfg = Release|Any CPU {C9142DED-1F6C-4385-A37D-81E46B233306}.Release|Any CPU.Build.0 = Release|Any CPU + {C9142DED-1F6C-4385-A37D-81E46B233306}.Release|x64.ActiveCfg = Release|Any CPU + {C9142DED-1F6C-4385-A37D-81E46B233306}.Release|x64.Build.0 = Release|Any CPU + {C9142DED-1F6C-4385-A37D-81E46B233306}.Release|x86.ActiveCfg = Release|Any CPU + {C9142DED-1F6C-4385-A37D-81E46B233306}.Release|x86.Build.0 = Release|Any CPU {A30D63B0-E952-4052-BAEE-38B8BF924093}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A30D63B0-E952-4052-BAEE-38B8BF924093}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A30D63B0-E952-4052-BAEE-38B8BF924093}.Debug|x64.ActiveCfg = Debug|Any CPU + {A30D63B0-E952-4052-BAEE-38B8BF924093}.Debug|x64.Build.0 = Debug|Any CPU + {A30D63B0-E952-4052-BAEE-38B8BF924093}.Debug|x86.ActiveCfg = Debug|Any CPU + {A30D63B0-E952-4052-BAEE-38B8BF924093}.Debug|x86.Build.0 = Debug|Any CPU {A30D63B0-E952-4052-BAEE-38B8BF924093}.Release|Any CPU.ActiveCfg = Release|Any CPU {A30D63B0-E952-4052-BAEE-38B8BF924093}.Release|Any CPU.Build.0 = Release|Any CPU + {A30D63B0-E952-4052-BAEE-38B8BF924093}.Release|x64.ActiveCfg = Release|Any CPU + {A30D63B0-E952-4052-BAEE-38B8BF924093}.Release|x64.Build.0 = Release|Any CPU + {A30D63B0-E952-4052-BAEE-38B8BF924093}.Release|x86.ActiveCfg = Release|Any CPU + {A30D63B0-E952-4052-BAEE-38B8BF924093}.Release|x86.Build.0 = Release|Any CPU {3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}.Debug|x64.ActiveCfg = Debug|Any CPU + {3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}.Debug|x64.Build.0 = Debug|Any CPU + {3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}.Debug|x86.ActiveCfg = Debug|Any CPU + {3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}.Debug|x86.Build.0 = Debug|Any CPU {3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}.Release|Any CPU.ActiveCfg = Release|Any CPU {3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}.Release|Any CPU.Build.0 = Release|Any CPU + {3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}.Release|x64.ActiveCfg = Release|Any CPU + {3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}.Release|x64.Build.0 = Release|Any CPU + {3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}.Release|x86.ActiveCfg = Release|Any CPU + {3D35A1E0-A9A1-404F-9B55-5F1A7EB6D5B8}.Release|x86.Build.0 = Release|Any CPU {8A22D962-016E-474A-8BB7-F831F0ABF3AC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8A22D962-016E-474A-8BB7-F831F0ABF3AC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A22D962-016E-474A-8BB7-F831F0ABF3AC}.Debug|x64.ActiveCfg = Debug|Any CPU + {8A22D962-016E-474A-8BB7-F831F0ABF3AC}.Debug|x64.Build.0 = Debug|Any CPU + {8A22D962-016E-474A-8BB7-F831F0ABF3AC}.Debug|x86.ActiveCfg = Debug|Any CPU + {8A22D962-016E-474A-8BB7-F831F0ABF3AC}.Debug|x86.Build.0 = Debug|Any CPU {8A22D962-016E-474A-8BB7-F831F0ABF3AC}.Release|Any CPU.ActiveCfg = Release|Any CPU {8A22D962-016E-474A-8BB7-F831F0ABF3AC}.Release|Any CPU.Build.0 = Release|Any CPU + {8A22D962-016E-474A-8BB7-F831F0ABF3AC}.Release|x64.ActiveCfg = Release|Any CPU + {8A22D962-016E-474A-8BB7-F831F0ABF3AC}.Release|x64.Build.0 = Release|Any CPU + {8A22D962-016E-474A-8BB7-F831F0ABF3AC}.Release|x86.ActiveCfg = Release|Any CPU + {8A22D962-016E-474A-8BB7-F831F0ABF3AC}.Release|x86.Build.0 = Release|Any CPU {E1A62D10-F2FB-4040-BD60-11A3934058DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E1A62D10-F2FB-4040-BD60-11A3934058DF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E1A62D10-F2FB-4040-BD60-11A3934058DF}.Debug|x64.ActiveCfg = Debug|Any CPU + {E1A62D10-F2FB-4040-BD60-11A3934058DF}.Debug|x64.Build.0 = Debug|Any CPU + {E1A62D10-F2FB-4040-BD60-11A3934058DF}.Debug|x86.ActiveCfg = Debug|Any CPU + {E1A62D10-F2FB-4040-BD60-11A3934058DF}.Debug|x86.Build.0 = Debug|Any CPU {E1A62D10-F2FB-4040-BD60-11A3934058DF}.Release|Any CPU.ActiveCfg = Release|Any CPU {E1A62D10-F2FB-4040-BD60-11A3934058DF}.Release|Any CPU.Build.0 = Release|Any CPU + {E1A62D10-F2FB-4040-BD60-11A3934058DF}.Release|x64.ActiveCfg = Release|Any CPU + {E1A62D10-F2FB-4040-BD60-11A3934058DF}.Release|x64.Build.0 = Release|Any CPU + {E1A62D10-F2FB-4040-BD60-11A3934058DF}.Release|x86.ActiveCfg = Release|Any CPU + {E1A62D10-F2FB-4040-BD60-11A3934058DF}.Release|x86.Build.0 = Release|Any CPU {4EBDDB1B-D6C5-4FAE-B5A7-2171B18CDFA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {4EBDDB1B-D6C5-4FAE-B5A7-2171B18CDFA5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4EBDDB1B-D6C5-4FAE-B5A7-2171B18CDFA5}.Debug|x64.ActiveCfg = Debug|Any CPU + {4EBDDB1B-D6C5-4FAE-B5A7-2171B18CDFA5}.Debug|x64.Build.0 = Debug|Any CPU + {4EBDDB1B-D6C5-4FAE-B5A7-2171B18CDFA5}.Debug|x86.ActiveCfg = Debug|Any CPU + {4EBDDB1B-D6C5-4FAE-B5A7-2171B18CDFA5}.Debug|x86.Build.0 = Debug|Any CPU {4EBDDB1B-D6C5-4FAE-B5A7-2171B18CDFA5}.Release|Any CPU.ActiveCfg = Release|Any CPU {4EBDDB1B-D6C5-4FAE-B5A7-2171B18CDFA5}.Release|Any CPU.Build.0 = Release|Any CPU + {4EBDDB1B-D6C5-4FAE-B5A7-2171B18CDFA5}.Release|x64.ActiveCfg = Release|Any CPU + {4EBDDB1B-D6C5-4FAE-B5A7-2171B18CDFA5}.Release|x64.Build.0 = Release|Any CPU + {4EBDDB1B-D6C5-4FAE-B5A7-2171B18CDFA5}.Release|x86.ActiveCfg = Release|Any CPU + {4EBDDB1B-D6C5-4FAE-B5A7-2171B18CDFA5}.Release|x86.Build.0 = Release|Any CPU {29CA7471-4E3E-4E75-8B33-001DDF682F01}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {29CA7471-4E3E-4E75-8B33-001DDF682F01}.Debug|Any CPU.Build.0 = Debug|Any CPU + {29CA7471-4E3E-4E75-8B33-001DDF682F01}.Debug|x64.ActiveCfg = Debug|Any CPU + {29CA7471-4E3E-4E75-8B33-001DDF682F01}.Debug|x64.Build.0 = Debug|Any CPU + {29CA7471-4E3E-4E75-8B33-001DDF682F01}.Debug|x86.ActiveCfg = Debug|Any CPU + {29CA7471-4E3E-4E75-8B33-001DDF682F01}.Debug|x86.Build.0 = Debug|Any CPU {29CA7471-4E3E-4E75-8B33-001DDF682F01}.Release|Any CPU.ActiveCfg = Release|Any CPU {29CA7471-4E3E-4E75-8B33-001DDF682F01}.Release|Any CPU.Build.0 = Release|Any CPU + {29CA7471-4E3E-4E75-8B33-001DDF682F01}.Release|x64.ActiveCfg = Release|Any CPU + {29CA7471-4E3E-4E75-8B33-001DDF682F01}.Release|x64.Build.0 = Release|Any CPU + {29CA7471-4E3E-4E75-8B33-001DDF682F01}.Release|x86.ActiveCfg = Release|Any CPU + {29CA7471-4E3E-4E75-8B33-001DDF682F01}.Release|x86.Build.0 = Release|Any CPU {37F89B0B-1C6B-426F-A5EE-676D1956D9E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {37F89B0B-1C6B-426F-A5EE-676D1956D9E9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {37F89B0B-1C6B-426F-A5EE-676D1956D9E9}.Debug|x64.ActiveCfg = Debug|Any CPU + {37F89B0B-1C6B-426F-A5EE-676D1956D9E9}.Debug|x64.Build.0 = Debug|Any CPU + {37F89B0B-1C6B-426F-A5EE-676D1956D9E9}.Debug|x86.ActiveCfg = Debug|Any CPU + {37F89B0B-1C6B-426F-A5EE-676D1956D9E9}.Debug|x86.Build.0 = Debug|Any CPU {37F89B0B-1C6B-426F-A5EE-676D1956D9E9}.Release|Any CPU.ActiveCfg = Release|Any CPU {37F89B0B-1C6B-426F-A5EE-676D1956D9E9}.Release|Any CPU.Build.0 = Release|Any CPU + {37F89B0B-1C6B-426F-A5EE-676D1956D9E9}.Release|x64.ActiveCfg = Release|Any CPU + {37F89B0B-1C6B-426F-A5EE-676D1956D9E9}.Release|x64.Build.0 = Release|Any CPU + {37F89B0B-1C6B-426F-A5EE-676D1956D9E9}.Release|x86.ActiveCfg = Release|Any CPU + {37F89B0B-1C6B-426F-A5EE-676D1956D9E9}.Release|x86.Build.0 = Release|Any CPU {DEFE3DB2-EA4F-4F90-87FC-B25D64427BC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DEFE3DB2-EA4F-4F90-87FC-B25D64427BC5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DEFE3DB2-EA4F-4F90-87FC-B25D64427BC5}.Debug|x64.ActiveCfg = Debug|Any CPU + {DEFE3DB2-EA4F-4F90-87FC-B25D64427BC5}.Debug|x64.Build.0 = Debug|Any CPU + {DEFE3DB2-EA4F-4F90-87FC-B25D64427BC5}.Debug|x86.ActiveCfg = Debug|Any CPU + {DEFE3DB2-EA4F-4F90-87FC-B25D64427BC5}.Debug|x86.Build.0 = Debug|Any CPU {DEFE3DB2-EA4F-4F90-87FC-B25D64427BC5}.Release|Any CPU.ActiveCfg = Release|Any CPU {DEFE3DB2-EA4F-4F90-87FC-B25D64427BC5}.Release|Any CPU.Build.0 = Release|Any CPU + {DEFE3DB2-EA4F-4F90-87FC-B25D64427BC5}.Release|x64.ActiveCfg = Release|Any CPU + {DEFE3DB2-EA4F-4F90-87FC-B25D64427BC5}.Release|x64.Build.0 = Release|Any CPU + {DEFE3DB2-EA4F-4F90-87FC-B25D64427BC5}.Release|x86.ActiveCfg = Release|Any CPU + {DEFE3DB2-EA4F-4F90-87FC-B25D64427BC5}.Release|x86.Build.0 = Release|Any CPU {F689967F-1EF1-4D75-8BA4-2F2F3506B1F3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F689967F-1EF1-4D75-8BA4-2F2F3506B1F3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F689967F-1EF1-4D75-8BA4-2F2F3506B1F3}.Debug|x64.ActiveCfg = Debug|Any CPU + {F689967F-1EF1-4D75-8BA4-2F2F3506B1F3}.Debug|x64.Build.0 = Debug|Any CPU + {F689967F-1EF1-4D75-8BA4-2F2F3506B1F3}.Debug|x86.ActiveCfg = Debug|Any CPU + {F689967F-1EF1-4D75-8BA4-2F2F3506B1F3}.Debug|x86.Build.0 = Debug|Any CPU {F689967F-1EF1-4D75-8BA4-2F2F3506B1F3}.Release|Any CPU.ActiveCfg = Release|Any CPU {F689967F-1EF1-4D75-8BA4-2F2F3506B1F3}.Release|Any CPU.Build.0 = Release|Any CPU + {F689967F-1EF1-4D75-8BA4-2F2F3506B1F3}.Release|x64.ActiveCfg = Release|Any CPU + {F689967F-1EF1-4D75-8BA4-2F2F3506B1F3}.Release|x64.Build.0 = Release|Any CPU + {F689967F-1EF1-4D75-8BA4-2F2F3506B1F3}.Release|x86.ActiveCfg = Release|Any CPU + {F689967F-1EF1-4D75-8BA4-2F2F3506B1F3}.Release|x86.Build.0 = Release|Any CPU {B9D1ADCB-D552-4626-A1F1-78FF72C1E822}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B9D1ADCB-D552-4626-A1F1-78FF72C1E822}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B9D1ADCB-D552-4626-A1F1-78FF72C1E822}.Debug|x64.ActiveCfg = Debug|Any CPU + {B9D1ADCB-D552-4626-A1F1-78FF72C1E822}.Debug|x64.Build.0 = Debug|Any CPU + {B9D1ADCB-D552-4626-A1F1-78FF72C1E822}.Debug|x86.ActiveCfg = Debug|Any CPU + {B9D1ADCB-D552-4626-A1F1-78FF72C1E822}.Debug|x86.Build.0 = Debug|Any CPU {B9D1ADCB-D552-4626-A1F1-78FF72C1E822}.Release|Any CPU.ActiveCfg = Release|Any CPU {B9D1ADCB-D552-4626-A1F1-78FF72C1E822}.Release|Any CPU.Build.0 = Release|Any CPU + {B9D1ADCB-D552-4626-A1F1-78FF72C1E822}.Release|x64.ActiveCfg = Release|Any CPU + {B9D1ADCB-D552-4626-A1F1-78FF72C1E822}.Release|x64.Build.0 = Release|Any CPU + {B9D1ADCB-D552-4626-A1F1-78FF72C1E822}.Release|x86.ActiveCfg = Release|Any CPU + {B9D1ADCB-D552-4626-A1F1-78FF72C1E822}.Release|x86.Build.0 = Release|Any CPU {89840441-5A3A-4FD7-9CB4-E5B52FAEF72A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {89840441-5A3A-4FD7-9CB4-E5B52FAEF72A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {89840441-5A3A-4FD7-9CB4-E5B52FAEF72A}.Debug|x64.ActiveCfg = Debug|Any CPU + {89840441-5A3A-4FD7-9CB4-E5B52FAEF72A}.Debug|x64.Build.0 = Debug|Any CPU + {89840441-5A3A-4FD7-9CB4-E5B52FAEF72A}.Debug|x86.ActiveCfg = Debug|Any CPU + {89840441-5A3A-4FD7-9CB4-E5B52FAEF72A}.Debug|x86.Build.0 = Debug|Any CPU {89840441-5A3A-4FD7-9CB4-E5B52FAEF72A}.Release|Any CPU.ActiveCfg = Release|Any CPU {89840441-5A3A-4FD7-9CB4-E5B52FAEF72A}.Release|Any CPU.Build.0 = Release|Any CPU + {89840441-5A3A-4FD7-9CB4-E5B52FAEF72A}.Release|x64.ActiveCfg = Release|Any CPU + {89840441-5A3A-4FD7-9CB4-E5B52FAEF72A}.Release|x64.Build.0 = Release|Any CPU + {89840441-5A3A-4FD7-9CB4-E5B52FAEF72A}.Release|x86.ActiveCfg = Release|Any CPU + {89840441-5A3A-4FD7-9CB4-E5B52FAEF72A}.Release|x86.Build.0 = Release|Any CPU {DD9519E0-5A68-48DC-A051-7BF2AC922F3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DD9519E0-5A68-48DC-A051-7BF2AC922F3E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DD9519E0-5A68-48DC-A051-7BF2AC922F3E}.Debug|x64.ActiveCfg = Debug|Any CPU + {DD9519E0-5A68-48DC-A051-7BF2AC922F3E}.Debug|x64.Build.0 = Debug|Any CPU + {DD9519E0-5A68-48DC-A051-7BF2AC922F3E}.Debug|x86.ActiveCfg = Debug|Any CPU + {DD9519E0-5A68-48DC-A051-7BF2AC922F3E}.Debug|x86.Build.0 = Debug|Any CPU {DD9519E0-5A68-48DC-A051-7BF2AC922F3E}.Release|Any CPU.ActiveCfg = Release|Any CPU {DD9519E0-5A68-48DC-A051-7BF2AC922F3E}.Release|Any CPU.Build.0 = Release|Any CPU + {DD9519E0-5A68-48DC-A051-7BF2AC922F3E}.Release|x64.ActiveCfg = Release|Any CPU + {DD9519E0-5A68-48DC-A051-7BF2AC922F3E}.Release|x64.Build.0 = Release|Any CPU + {DD9519E0-5A68-48DC-A051-7BF2AC922F3E}.Release|x86.ActiveCfg = Release|Any CPU + {DD9519E0-5A68-48DC-A051-7BF2AC922F3E}.Release|x86.Build.0 = Release|Any CPU {00D07595-993C-40FC-BD90-0DD6331414D3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {00D07595-993C-40FC-BD90-0DD6331414D3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {00D07595-993C-40FC-BD90-0DD6331414D3}.Debug|x64.ActiveCfg = Debug|Any CPU + {00D07595-993C-40FC-BD90-0DD6331414D3}.Debug|x64.Build.0 = Debug|Any CPU + {00D07595-993C-40FC-BD90-0DD6331414D3}.Debug|x86.ActiveCfg = Debug|Any CPU + {00D07595-993C-40FC-BD90-0DD6331414D3}.Debug|x86.Build.0 = Debug|Any CPU {00D07595-993C-40FC-BD90-0DD6331414D3}.Release|Any CPU.ActiveCfg = Release|Any CPU {00D07595-993C-40FC-BD90-0DD6331414D3}.Release|Any CPU.Build.0 = Release|Any CPU + {00D07595-993C-40FC-BD90-0DD6331414D3}.Release|x64.ActiveCfg = Release|Any CPU + {00D07595-993C-40FC-BD90-0DD6331414D3}.Release|x64.Build.0 = Release|Any CPU + {00D07595-993C-40FC-BD90-0DD6331414D3}.Release|x86.ActiveCfg = Release|Any CPU + {00D07595-993C-40FC-BD90-0DD6331414D3}.Release|x86.Build.0 = Release|Any CPU {A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Debug|x64.ActiveCfg = Debug|Any CPU + {A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Debug|x64.Build.0 = Debug|Any CPU + {A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Debug|x86.ActiveCfg = Debug|Any CPU + {A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Debug|x86.Build.0 = Debug|Any CPU {A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Release|Any CPU.ActiveCfg = Release|Any CPU {A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Release|Any CPU.Build.0 = Release|Any CPU + {A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Release|x64.ActiveCfg = Release|Any CPU + {A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Release|x64.Build.0 = Release|Any CPU + {A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Release|x86.ActiveCfg = Release|Any CPU + {A37BFEB5-7C57-4CDC-93B8-B5CE4BB9ACE1}.Release|x86.Build.0 = Release|Any CPU {F03A1CEA-FA44-4F30-BFC2-00BC2EAAB4E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F03A1CEA-FA44-4F30-BFC2-00BC2EAAB4E2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F03A1CEA-FA44-4F30-BFC2-00BC2EAAB4E2}.Debug|x64.ActiveCfg = Debug|Any CPU + {F03A1CEA-FA44-4F30-BFC2-00BC2EAAB4E2}.Debug|x64.Build.0 = Debug|Any CPU + {F03A1CEA-FA44-4F30-BFC2-00BC2EAAB4E2}.Debug|x86.ActiveCfg = Debug|Any CPU + {F03A1CEA-FA44-4F30-BFC2-00BC2EAAB4E2}.Debug|x86.Build.0 = Debug|Any CPU {F03A1CEA-FA44-4F30-BFC2-00BC2EAAB4E2}.Release|Any CPU.ActiveCfg = Release|Any CPU {F03A1CEA-FA44-4F30-BFC2-00BC2EAAB4E2}.Release|Any CPU.Build.0 = Release|Any CPU + {F03A1CEA-FA44-4F30-BFC2-00BC2EAAB4E2}.Release|x64.ActiveCfg = Release|Any CPU + {F03A1CEA-FA44-4F30-BFC2-00BC2EAAB4E2}.Release|x64.Build.0 = Release|Any CPU + {F03A1CEA-FA44-4F30-BFC2-00BC2EAAB4E2}.Release|x86.ActiveCfg = Release|Any CPU + {F03A1CEA-FA44-4F30-BFC2-00BC2EAAB4E2}.Release|x86.Build.0 = Release|Any CPU {B9133C38-AC24-4E2F-B581-D124CF410CDF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B9133C38-AC24-4E2F-B581-D124CF410CDF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B9133C38-AC24-4E2F-B581-D124CF410CDF}.Debug|x64.ActiveCfg = Debug|Any CPU + {B9133C38-AC24-4E2F-B581-D124CF410CDF}.Debug|x64.Build.0 = Debug|Any CPU + {B9133C38-AC24-4E2F-B581-D124CF410CDF}.Debug|x86.ActiveCfg = Debug|Any CPU + {B9133C38-AC24-4E2F-B581-D124CF410CDF}.Debug|x86.Build.0 = Debug|Any CPU {B9133C38-AC24-4E2F-B581-D124CF410CDF}.Release|Any CPU.ActiveCfg = Release|Any CPU {B9133C38-AC24-4E2F-B581-D124CF410CDF}.Release|Any CPU.Build.0 = Release|Any CPU + {B9133C38-AC24-4E2F-B581-D124CF410CDF}.Release|x64.ActiveCfg = Release|Any CPU + {B9133C38-AC24-4E2F-B581-D124CF410CDF}.Release|x64.Build.0 = Release|Any CPU + {B9133C38-AC24-4E2F-B581-D124CF410CDF}.Release|x86.ActiveCfg = Release|Any CPU + {B9133C38-AC24-4E2F-B581-D124CF410CDF}.Release|x86.Build.0 = Release|Any CPU {8FDB3BF7-AD89-43F6-8DEB-C3E29B8801FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8FDB3BF7-AD89-43F6-8DEB-C3E29B8801FE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8FDB3BF7-AD89-43F6-8DEB-C3E29B8801FE}.Debug|x64.ActiveCfg = Debug|Any CPU + {8FDB3BF7-AD89-43F6-8DEB-C3E29B8801FE}.Debug|x64.Build.0 = Debug|Any CPU + {8FDB3BF7-AD89-43F6-8DEB-C3E29B8801FE}.Debug|x86.ActiveCfg = Debug|Any CPU + {8FDB3BF7-AD89-43F6-8DEB-C3E29B8801FE}.Debug|x86.Build.0 = Debug|Any CPU {8FDB3BF7-AD89-43F6-8DEB-C3E29B8801FE}.Release|Any CPU.ActiveCfg = Release|Any CPU {8FDB3BF7-AD89-43F6-8DEB-C3E29B8801FE}.Release|Any CPU.Build.0 = Release|Any CPU + {8FDB3BF7-AD89-43F6-8DEB-C3E29B8801FE}.Release|x64.ActiveCfg = Release|Any CPU + {8FDB3BF7-AD89-43F6-8DEB-C3E29B8801FE}.Release|x64.Build.0 = Release|Any CPU + {8FDB3BF7-AD89-43F6-8DEB-C3E29B8801FE}.Release|x86.ActiveCfg = Release|Any CPU + {8FDB3BF7-AD89-43F6-8DEB-C3E29B8801FE}.Release|x86.Build.0 = Release|Any CPU {ACFBA3FB-18CE-4655-9D14-1F1F5C3DFC30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {ACFBA3FB-18CE-4655-9D14-1F1F5C3DFC30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {ACFBA3FB-18CE-4655-9D14-1F1F5C3DFC30}.Debug|x64.ActiveCfg = Debug|Any CPU + {ACFBA3FB-18CE-4655-9D14-1F1F5C3DFC30}.Debug|x64.Build.0 = Debug|Any CPU + {ACFBA3FB-18CE-4655-9D14-1F1F5C3DFC30}.Debug|x86.ActiveCfg = Debug|Any CPU + {ACFBA3FB-18CE-4655-9D14-1F1F5C3DFC30}.Debug|x86.Build.0 = Debug|Any CPU {ACFBA3FB-18CE-4655-9D14-1F1F5C3DFC30}.Release|Any CPU.ActiveCfg = Release|Any CPU {ACFBA3FB-18CE-4655-9D14-1F1F5C3DFC30}.Release|Any CPU.Build.0 = Release|Any CPU + {ACFBA3FB-18CE-4655-9D14-1F1F5C3DFC30}.Release|x64.ActiveCfg = Release|Any CPU + {ACFBA3FB-18CE-4655-9D14-1F1F5C3DFC30}.Release|x64.Build.0 = Release|Any CPU + {ACFBA3FB-18CE-4655-9D14-1F1F5C3DFC30}.Release|x86.ActiveCfg = Release|Any CPU + {ACFBA3FB-18CE-4655-9D14-1F1F5C3DFC30}.Release|x86.Build.0 = Release|Any CPU {DADEA538-3CA1-4ADE-A7E6-EF77A0CE4401}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DADEA538-3CA1-4ADE-A7E6-EF77A0CE4401}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DADEA538-3CA1-4ADE-A7E6-EF77A0CE4401}.Debug|x64.ActiveCfg = Debug|Any CPU + {DADEA538-3CA1-4ADE-A7E6-EF77A0CE4401}.Debug|x64.Build.0 = Debug|Any CPU + {DADEA538-3CA1-4ADE-A7E6-EF77A0CE4401}.Debug|x86.ActiveCfg = Debug|Any CPU + {DADEA538-3CA1-4ADE-A7E6-EF77A0CE4401}.Debug|x86.Build.0 = Debug|Any CPU {DADEA538-3CA1-4ADE-A7E6-EF77A0CE4401}.Release|Any CPU.ActiveCfg = Release|Any CPU {DADEA538-3CA1-4ADE-A7E6-EF77A0CE4401}.Release|Any CPU.Build.0 = Release|Any CPU + {DADEA538-3CA1-4ADE-A7E6-EF77A0CE4401}.Release|x64.ActiveCfg = Release|Any CPU + {DADEA538-3CA1-4ADE-A7E6-EF77A0CE4401}.Release|x64.Build.0 = Release|Any CPU + {DADEA538-3CA1-4ADE-A7E6-EF77A0CE4401}.Release|x86.ActiveCfg = Release|Any CPU + {DADEA538-3CA1-4ADE-A7E6-EF77A0CE4401}.Release|x86.Build.0 = Release|Any CPU {863C18F9-2407-49F9-9ADC-F6229AF3B385}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {863C18F9-2407-49F9-9ADC-F6229AF3B385}.Debug|Any CPU.Build.0 = Debug|Any CPU + {863C18F9-2407-49F9-9ADC-F6229AF3B385}.Debug|x64.ActiveCfg = Debug|Any CPU + {863C18F9-2407-49F9-9ADC-F6229AF3B385}.Debug|x64.Build.0 = Debug|Any CPU + {863C18F9-2407-49F9-9ADC-F6229AF3B385}.Debug|x86.ActiveCfg = Debug|Any CPU + {863C18F9-2407-49F9-9ADC-F6229AF3B385}.Debug|x86.Build.0 = Debug|Any CPU {863C18F9-2407-49F9-9ADC-F6229AF3B385}.Release|Any CPU.ActiveCfg = Release|Any CPU {863C18F9-2407-49F9-9ADC-F6229AF3B385}.Release|Any CPU.Build.0 = Release|Any CPU + {863C18F9-2407-49F9-9ADC-F6229AF3B385}.Release|x64.ActiveCfg = Release|Any CPU + {863C18F9-2407-49F9-9ADC-F6229AF3B385}.Release|x64.Build.0 = Release|Any CPU + {863C18F9-2407-49F9-9ADC-F6229AF3B385}.Release|x86.ActiveCfg = Release|Any CPU + {863C18F9-2407-49F9-9ADC-F6229AF3B385}.Release|x86.Build.0 = Release|Any CPU {B4B6B7DE-9798-4007-B1DF-7EE7929E392A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B4B6B7DE-9798-4007-B1DF-7EE7929E392A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B4B6B7DE-9798-4007-B1DF-7EE7929E392A}.Debug|x64.ActiveCfg = Debug|Any CPU + {B4B6B7DE-9798-4007-B1DF-7EE7929E392A}.Debug|x64.Build.0 = Debug|Any CPU + {B4B6B7DE-9798-4007-B1DF-7EE7929E392A}.Debug|x86.ActiveCfg = Debug|Any CPU + {B4B6B7DE-9798-4007-B1DF-7EE7929E392A}.Debug|x86.Build.0 = Debug|Any CPU {B4B6B7DE-9798-4007-B1DF-7EE7929E392A}.Release|Any CPU.ActiveCfg = Release|Any CPU {B4B6B7DE-9798-4007-B1DF-7EE7929E392A}.Release|Any CPU.Build.0 = Release|Any CPU + {B4B6B7DE-9798-4007-B1DF-7EE7929E392A}.Release|x64.ActiveCfg = Release|Any CPU + {B4B6B7DE-9798-4007-B1DF-7EE7929E392A}.Release|x64.Build.0 = Release|Any CPU + {B4B6B7DE-9798-4007-B1DF-7EE7929E392A}.Release|x86.ActiveCfg = Release|Any CPU + {B4B6B7DE-9798-4007-B1DF-7EE7929E392A}.Release|x86.Build.0 = Release|Any CPU {E9CE58DB-0789-4D18-8B63-474F7D7B14B4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E9CE58DB-0789-4D18-8B63-474F7D7B14B4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E9CE58DB-0789-4D18-8B63-474F7D7B14B4}.Debug|x64.ActiveCfg = Debug|Any CPU + {E9CE58DB-0789-4D18-8B63-474F7D7B14B4}.Debug|x64.Build.0 = Debug|Any CPU + {E9CE58DB-0789-4D18-8B63-474F7D7B14B4}.Debug|x86.ActiveCfg = Debug|Any CPU + {E9CE58DB-0789-4D18-8B63-474F7D7B14B4}.Debug|x86.Build.0 = Debug|Any CPU {E9CE58DB-0789-4D18-8B63-474F7D7B14B4}.Release|Any CPU.ActiveCfg = Release|Any CPU {E9CE58DB-0789-4D18-8B63-474F7D7B14B4}.Release|Any CPU.Build.0 = Release|Any CPU + {E9CE58DB-0789-4D18-8B63-474F7D7B14B4}.Release|x64.ActiveCfg = Release|Any CPU + {E9CE58DB-0789-4D18-8B63-474F7D7B14B4}.Release|x64.Build.0 = Release|Any CPU + {E9CE58DB-0789-4D18-8B63-474F7D7B14B4}.Release|x86.ActiveCfg = Release|Any CPU + {E9CE58DB-0789-4D18-8B63-474F7D7B14B4}.Release|x86.Build.0 = Release|Any CPU {808EC18E-C8CC-4F5C-82B6-984EADBBF85D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {808EC18E-C8CC-4F5C-82B6-984EADBBF85D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {808EC18E-C8CC-4F5C-82B6-984EADBBF85D}.Debug|x64.ActiveCfg = Debug|Any CPU + {808EC18E-C8CC-4F5C-82B6-984EADBBF85D}.Debug|x64.Build.0 = Debug|Any CPU + {808EC18E-C8CC-4F5C-82B6-984EADBBF85D}.Debug|x86.ActiveCfg = Debug|Any CPU + {808EC18E-C8CC-4F5C-82B6-984EADBBF85D}.Debug|x86.Build.0 = Debug|Any CPU {808EC18E-C8CC-4F5C-82B6-984EADBBF85D}.Release|Any CPU.ActiveCfg = Release|Any CPU {808EC18E-C8CC-4F5C-82B6-984EADBBF85D}.Release|Any CPU.Build.0 = Release|Any CPU + {808EC18E-C8CC-4F5C-82B6-984EADBBF85D}.Release|x64.ActiveCfg = Release|Any CPU + {808EC18E-C8CC-4F5C-82B6-984EADBBF85D}.Release|x64.Build.0 = Release|Any CPU + {808EC18E-C8CC-4F5C-82B6-984EADBBF85D}.Release|x86.ActiveCfg = Release|Any CPU + {808EC18E-C8CC-4F5C-82B6-984EADBBF85D}.Release|x86.Build.0 = Release|Any CPU {FB27F78E-F10E-4810-9B8E-BCD67DCFC8A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {FB27F78E-F10E-4810-9B8E-BCD67DCFC8A2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FB27F78E-F10E-4810-9B8E-BCD67DCFC8A2}.Debug|x64.ActiveCfg = Debug|Any CPU + {FB27F78E-F10E-4810-9B8E-BCD67DCFC8A2}.Debug|x64.Build.0 = Debug|Any CPU + {FB27F78E-F10E-4810-9B8E-BCD67DCFC8A2}.Debug|x86.ActiveCfg = Debug|Any CPU + {FB27F78E-F10E-4810-9B8E-BCD67DCFC8A2}.Debug|x86.Build.0 = Debug|Any CPU {FB27F78E-F10E-4810-9B8E-BCD67DCFC8A2}.Release|Any CPU.ActiveCfg = Release|Any CPU {FB27F78E-F10E-4810-9B8E-BCD67DCFC8A2}.Release|Any CPU.Build.0 = Release|Any CPU + {FB27F78E-F10E-4810-9B8E-BCD67DCFC8A2}.Release|x64.ActiveCfg = Release|Any CPU + {FB27F78E-F10E-4810-9B8E-BCD67DCFC8A2}.Release|x64.Build.0 = Release|Any CPU + {FB27F78E-F10E-4810-9B8E-BCD67DCFC8A2}.Release|x86.ActiveCfg = Release|Any CPU + {FB27F78E-F10E-4810-9B8E-BCD67DCFC8A2}.Release|x86.Build.0 = Release|Any CPU {87B0C2A8-FE95-4779-8B9C-2181AA52B3FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {87B0C2A8-FE95-4779-8B9C-2181AA52B3FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {87B0C2A8-FE95-4779-8B9C-2181AA52B3FA}.Debug|x64.ActiveCfg = Debug|Any CPU + {87B0C2A8-FE95-4779-8B9C-2181AA52B3FA}.Debug|x64.Build.0 = Debug|Any CPU + {87B0C2A8-FE95-4779-8B9C-2181AA52B3FA}.Debug|x86.ActiveCfg = Debug|Any CPU + {87B0C2A8-FE95-4779-8B9C-2181AA52B3FA}.Debug|x86.Build.0 = Debug|Any CPU {87B0C2A8-FE95-4779-8B9C-2181AA52B3FA}.Release|Any CPU.ActiveCfg = Release|Any CPU {87B0C2A8-FE95-4779-8B9C-2181AA52B3FA}.Release|Any CPU.Build.0 = Release|Any CPU + {87B0C2A8-FE95-4779-8B9C-2181AA52B3FA}.Release|x64.ActiveCfg = Release|Any CPU + {87B0C2A8-FE95-4779-8B9C-2181AA52B3FA}.Release|x64.Build.0 = Release|Any CPU + {87B0C2A8-FE95-4779-8B9C-2181AA52B3FA}.Release|x86.ActiveCfg = Release|Any CPU + {87B0C2A8-FE95-4779-8B9C-2181AA52B3FA}.Release|x86.Build.0 = Release|Any CPU {184E859A-282D-44D7-B8E9-FEA874644013}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {184E859A-282D-44D7-B8E9-FEA874644013}.Debug|Any CPU.Build.0 = Debug|Any CPU + {184E859A-282D-44D7-B8E9-FEA874644013}.Debug|x64.ActiveCfg = Debug|Any CPU + {184E859A-282D-44D7-B8E9-FEA874644013}.Debug|x64.Build.0 = Debug|Any CPU + {184E859A-282D-44D7-B8E9-FEA874644013}.Debug|x86.ActiveCfg = Debug|Any CPU + {184E859A-282D-44D7-B8E9-FEA874644013}.Debug|x86.Build.0 = Debug|Any CPU {184E859A-282D-44D7-B8E9-FEA874644013}.Release|Any CPU.ActiveCfg = Release|Any CPU {184E859A-282D-44D7-B8E9-FEA874644013}.Release|Any CPU.Build.0 = Release|Any CPU + {184E859A-282D-44D7-B8E9-FEA874644013}.Release|x64.ActiveCfg = Release|Any CPU + {184E859A-282D-44D7-B8E9-FEA874644013}.Release|x64.Build.0 = Release|Any CPU + {184E859A-282D-44D7-B8E9-FEA874644013}.Release|x86.ActiveCfg = Release|Any CPU + {184E859A-282D-44D7-B8E9-FEA874644013}.Release|x86.Build.0 = Release|Any CPU {228723E6-FA6D-406B-B8F8-C9BCC547AF8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {228723E6-FA6D-406B-B8F8-C9BCC547AF8E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {228723E6-FA6D-406B-B8F8-C9BCC547AF8E}.Debug|x64.ActiveCfg = Debug|Any CPU + {228723E6-FA6D-406B-B8F8-C9BCC547AF8E}.Debug|x64.Build.0 = Debug|Any CPU + {228723E6-FA6D-406B-B8F8-C9BCC547AF8E}.Debug|x86.ActiveCfg = Debug|Any CPU + {228723E6-FA6D-406B-B8F8-C9BCC547AF8E}.Debug|x86.Build.0 = Debug|Any CPU {228723E6-FA6D-406B-B8F8-C9BCC547AF8E}.Release|Any CPU.ActiveCfg = Release|Any CPU {228723E6-FA6D-406B-B8F8-C9BCC547AF8E}.Release|Any CPU.Build.0 = Release|Any CPU + {228723E6-FA6D-406B-B8F8-C9BCC547AF8E}.Release|x64.ActiveCfg = Release|Any CPU + {228723E6-FA6D-406B-B8F8-C9BCC547AF8E}.Release|x64.Build.0 = Release|Any CPU + {228723E6-FA6D-406B-B8F8-C9BCC547AF8E}.Release|x86.ActiveCfg = Release|Any CPU + {228723E6-FA6D-406B-B8F8-C9BCC547AF8E}.Release|x86.Build.0 = Release|Any CPU {42EA6F06-2D78-4D18-8AC4-8F2AB7E6DA19}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {42EA6F06-2D78-4D18-8AC4-8F2AB7E6DA19}.Debug|Any CPU.Build.0 = Debug|Any CPU + {42EA6F06-2D78-4D18-8AC4-8F2AB7E6DA19}.Debug|x64.ActiveCfg = Debug|Any CPU + {42EA6F06-2D78-4D18-8AC4-8F2AB7E6DA19}.Debug|x64.Build.0 = Debug|Any CPU + {42EA6F06-2D78-4D18-8AC4-8F2AB7E6DA19}.Debug|x86.ActiveCfg = Debug|Any CPU + {42EA6F06-2D78-4D18-8AC4-8F2AB7E6DA19}.Debug|x86.Build.0 = Debug|Any CPU {42EA6F06-2D78-4D18-8AC4-8F2AB7E6DA19}.Release|Any CPU.ActiveCfg = Release|Any CPU {42EA6F06-2D78-4D18-8AC4-8F2AB7E6DA19}.Release|Any CPU.Build.0 = Release|Any CPU + {42EA6F06-2D78-4D18-8AC4-8F2AB7E6DA19}.Release|x64.ActiveCfg = Release|Any CPU + {42EA6F06-2D78-4D18-8AC4-8F2AB7E6DA19}.Release|x64.Build.0 = Release|Any CPU + {42EA6F06-2D78-4D18-8AC4-8F2AB7E6DA19}.Release|x86.ActiveCfg = Release|Any CPU + {42EA6F06-2D78-4D18-8AC4-8F2AB7E6DA19}.Release|x86.Build.0 = Release|Any CPU {C996F458-98FB-483D-9306-4701290E2FC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C996F458-98FB-483D-9306-4701290E2FC1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C996F458-98FB-483D-9306-4701290E2FC1}.Debug|x64.ActiveCfg = Debug|Any CPU + {C996F458-98FB-483D-9306-4701290E2FC1}.Debug|x64.Build.0 = Debug|Any CPU + {C996F458-98FB-483D-9306-4701290E2FC1}.Debug|x86.ActiveCfg = Debug|Any CPU + {C996F458-98FB-483D-9306-4701290E2FC1}.Debug|x86.Build.0 = Debug|Any CPU {C996F458-98FB-483D-9306-4701290E2FC1}.Release|Any CPU.ActiveCfg = Release|Any CPU {C996F458-98FB-483D-9306-4701290E2FC1}.Release|Any CPU.Build.0 = Release|Any CPU + {C996F458-98FB-483D-9306-4701290E2FC1}.Release|x64.ActiveCfg = Release|Any CPU + {C996F458-98FB-483D-9306-4701290E2FC1}.Release|x64.Build.0 = Release|Any CPU + {C996F458-98FB-483D-9306-4701290E2FC1}.Release|x86.ActiveCfg = Release|Any CPU + {C996F458-98FB-483D-9306-4701290E2FC1}.Release|x86.Build.0 = Release|Any CPU {75D8DADB-3FA9-4C1D-B23A-DBFD08133B7C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {75D8DADB-3FA9-4C1D-B23A-DBFD08133B7C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75D8DADB-3FA9-4C1D-B23A-DBFD08133B7C}.Debug|x64.ActiveCfg = Debug|Any CPU + {75D8DADB-3FA9-4C1D-B23A-DBFD08133B7C}.Debug|x64.Build.0 = Debug|Any CPU + {75D8DADB-3FA9-4C1D-B23A-DBFD08133B7C}.Debug|x86.ActiveCfg = Debug|Any CPU + {75D8DADB-3FA9-4C1D-B23A-DBFD08133B7C}.Debug|x86.Build.0 = Debug|Any CPU {75D8DADB-3FA9-4C1D-B23A-DBFD08133B7C}.Release|Any CPU.ActiveCfg = Release|Any CPU {75D8DADB-3FA9-4C1D-B23A-DBFD08133B7C}.Release|Any CPU.Build.0 = Release|Any CPU + {75D8DADB-3FA9-4C1D-B23A-DBFD08133B7C}.Release|x64.ActiveCfg = Release|Any CPU + {75D8DADB-3FA9-4C1D-B23A-DBFD08133B7C}.Release|x64.Build.0 = Release|Any CPU + {75D8DADB-3FA9-4C1D-B23A-DBFD08133B7C}.Release|x86.ActiveCfg = Release|Any CPU + {75D8DADB-3FA9-4C1D-B23A-DBFD08133B7C}.Release|x86.Build.0 = Release|Any CPU {90B1866A-EF99-40B9-970E-B898E5AA523F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {90B1866A-EF99-40B9-970E-B898E5AA523F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {90B1866A-EF99-40B9-970E-B898E5AA523F}.Debug|x64.ActiveCfg = Debug|Any CPU + {90B1866A-EF99-40B9-970E-B898E5AA523F}.Debug|x64.Build.0 = Debug|Any CPU + {90B1866A-EF99-40B9-970E-B898E5AA523F}.Debug|x86.ActiveCfg = Debug|Any CPU + {90B1866A-EF99-40B9-970E-B898E5AA523F}.Debug|x86.Build.0 = Debug|Any CPU {90B1866A-EF99-40B9-970E-B898E5AA523F}.Release|Any CPU.ActiveCfg = Release|Any CPU {90B1866A-EF99-40B9-970E-B898E5AA523F}.Release|Any CPU.Build.0 = Release|Any CPU + {90B1866A-EF99-40B9-970E-B898E5AA523F}.Release|x64.ActiveCfg = Release|Any CPU + {90B1866A-EF99-40B9-970E-B898E5AA523F}.Release|x64.Build.0 = Release|Any CPU + {90B1866A-EF99-40B9-970E-B898E5AA523F}.Release|x86.ActiveCfg = Release|Any CPU + {90B1866A-EF99-40B9-970E-B898E5AA523F}.Release|x86.Build.0 = Release|Any CPU {40C6740E-BFCA-4D37-8344-3D84E2044BB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {40C6740E-BFCA-4D37-8344-3D84E2044BB2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {40C6740E-BFCA-4D37-8344-3D84E2044BB2}.Debug|x64.ActiveCfg = Debug|Any CPU + {40C6740E-BFCA-4D37-8344-3D84E2044BB2}.Debug|x64.Build.0 = Debug|Any CPU + {40C6740E-BFCA-4D37-8344-3D84E2044BB2}.Debug|x86.ActiveCfg = Debug|Any CPU + {40C6740E-BFCA-4D37-8344-3D84E2044BB2}.Debug|x86.Build.0 = Debug|Any CPU {40C6740E-BFCA-4D37-8344-3D84E2044BB2}.Release|Any CPU.ActiveCfg = Release|Any CPU {40C6740E-BFCA-4D37-8344-3D84E2044BB2}.Release|Any CPU.Build.0 = Release|Any CPU + {40C6740E-BFCA-4D37-8344-3D84E2044BB2}.Release|x64.ActiveCfg = Release|Any CPU + {40C6740E-BFCA-4D37-8344-3D84E2044BB2}.Release|x64.Build.0 = Release|Any CPU + {40C6740E-BFCA-4D37-8344-3D84E2044BB2}.Release|x86.ActiveCfg = Release|Any CPU + {40C6740E-BFCA-4D37-8344-3D84E2044BB2}.Release|x86.Build.0 = Release|Any CPU {7B2FCAD6-86E6-49C8-ADBE-A61B4F4B101B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7B2FCAD6-86E6-49C8-ADBE-A61B4F4B101B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7B2FCAD6-86E6-49C8-ADBE-A61B4F4B101B}.Debug|x64.ActiveCfg = Debug|Any CPU + {7B2FCAD6-86E6-49C8-ADBE-A61B4F4B101B}.Debug|x64.Build.0 = Debug|Any CPU + {7B2FCAD6-86E6-49C8-ADBE-A61B4F4B101B}.Debug|x86.ActiveCfg = Debug|Any CPU + {7B2FCAD6-86E6-49C8-ADBE-A61B4F4B101B}.Debug|x86.Build.0 = Debug|Any CPU {7B2FCAD6-86E6-49C8-ADBE-A61B4F4B101B}.Release|Any CPU.ActiveCfg = Release|Any CPU {7B2FCAD6-86E6-49C8-ADBE-A61B4F4B101B}.Release|Any CPU.Build.0 = Release|Any CPU + {7B2FCAD6-86E6-49C8-ADBE-A61B4F4B101B}.Release|x64.ActiveCfg = Release|Any CPU + {7B2FCAD6-86E6-49C8-ADBE-A61B4F4B101B}.Release|x64.Build.0 = Release|Any CPU + {7B2FCAD6-86E6-49C8-ADBE-A61B4F4B101B}.Release|x86.ActiveCfg = Release|Any CPU + {7B2FCAD6-86E6-49C8-ADBE-A61B4F4B101B}.Release|x86.Build.0 = Release|Any CPU {9A7EEA08-15BE-476D-8168-53039867038E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9A7EEA08-15BE-476D-8168-53039867038E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A7EEA08-15BE-476D-8168-53039867038E}.Debug|x64.ActiveCfg = Debug|Any CPU + {9A7EEA08-15BE-476D-8168-53039867038E}.Debug|x64.Build.0 = Debug|Any CPU + {9A7EEA08-15BE-476D-8168-53039867038E}.Debug|x86.ActiveCfg = Debug|Any CPU + {9A7EEA08-15BE-476D-8168-53039867038E}.Debug|x86.Build.0 = Debug|Any CPU {9A7EEA08-15BE-476D-8168-53039867038E}.Release|Any CPU.ActiveCfg = Release|Any CPU {9A7EEA08-15BE-476D-8168-53039867038E}.Release|Any CPU.Build.0 = Release|Any CPU + {9A7EEA08-15BE-476D-8168-53039867038E}.Release|x64.ActiveCfg = Release|Any CPU + {9A7EEA08-15BE-476D-8168-53039867038E}.Release|x64.Build.0 = Release|Any CPU + {9A7EEA08-15BE-476D-8168-53039867038E}.Release|x86.ActiveCfg = Release|Any CPU + {9A7EEA08-15BE-476D-8168-53039867038E}.Release|x86.Build.0 = Release|Any CPU {508B6355-AD28-4E60-8549-266D21DBF2CF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {508B6355-AD28-4E60-8549-266D21DBF2CF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {508B6355-AD28-4E60-8549-266D21DBF2CF}.Debug|x64.ActiveCfg = Debug|Any CPU + {508B6355-AD28-4E60-8549-266D21DBF2CF}.Debug|x64.Build.0 = Debug|Any CPU + {508B6355-AD28-4E60-8549-266D21DBF2CF}.Debug|x86.ActiveCfg = Debug|Any CPU + {508B6355-AD28-4E60-8549-266D21DBF2CF}.Debug|x86.Build.0 = Debug|Any CPU {508B6355-AD28-4E60-8549-266D21DBF2CF}.Release|Any CPU.ActiveCfg = Release|Any CPU {508B6355-AD28-4E60-8549-266D21DBF2CF}.Release|Any CPU.Build.0 = Release|Any CPU + {508B6355-AD28-4E60-8549-266D21DBF2CF}.Release|x64.ActiveCfg = Release|Any CPU + {508B6355-AD28-4E60-8549-266D21DBF2CF}.Release|x64.Build.0 = Release|Any CPU + {508B6355-AD28-4E60-8549-266D21DBF2CF}.Release|x86.ActiveCfg = Release|Any CPU + {508B6355-AD28-4E60-8549-266D21DBF2CF}.Release|x86.Build.0 = Release|Any CPU {F7407459-8AFA-45E4-83E9-9BB01412CC08}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F7407459-8AFA-45E4-83E9-9BB01412CC08}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F7407459-8AFA-45E4-83E9-9BB01412CC08}.Debug|x64.ActiveCfg = Debug|Any CPU + {F7407459-8AFA-45E4-83E9-9BB01412CC08}.Debug|x64.Build.0 = Debug|Any CPU + {F7407459-8AFA-45E4-83E9-9BB01412CC08}.Debug|x86.ActiveCfg = Debug|Any CPU + {F7407459-8AFA-45E4-83E9-9BB01412CC08}.Debug|x86.Build.0 = Debug|Any CPU {F7407459-8AFA-45E4-83E9-9BB01412CC08}.Release|Any CPU.ActiveCfg = Release|Any CPU {F7407459-8AFA-45E4-83E9-9BB01412CC08}.Release|Any CPU.Build.0 = Release|Any CPU + {F7407459-8AFA-45E4-83E9-9BB01412CC08}.Release|x64.ActiveCfg = Release|Any CPU + {F7407459-8AFA-45E4-83E9-9BB01412CC08}.Release|x64.Build.0 = Release|Any CPU + {F7407459-8AFA-45E4-83E9-9BB01412CC08}.Release|x86.ActiveCfg = Release|Any CPU + {F7407459-8AFA-45E4-83E9-9BB01412CC08}.Release|x86.Build.0 = Release|Any CPU {CA805B77-D50C-431F-B3CB-1111C9C6E807}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CA805B77-D50C-431F-B3CB-1111C9C6E807}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CA805B77-D50C-431F-B3CB-1111C9C6E807}.Debug|x64.ActiveCfg = Debug|Any CPU + {CA805B77-D50C-431F-B3CB-1111C9C6E807}.Debug|x64.Build.0 = Debug|Any CPU + {CA805B77-D50C-431F-B3CB-1111C9C6E807}.Debug|x86.ActiveCfg = Debug|Any CPU + {CA805B77-D50C-431F-B3CB-1111C9C6E807}.Debug|x86.Build.0 = Debug|Any CPU {CA805B77-D50C-431F-B3CB-1111C9C6E807}.Release|Any CPU.ActiveCfg = Release|Any CPU {CA805B77-D50C-431F-B3CB-1111C9C6E807}.Release|Any CPU.Build.0 = Release|Any CPU + {CA805B77-D50C-431F-B3CB-1111C9C6E807}.Release|x64.ActiveCfg = Release|Any CPU + {CA805B77-D50C-431F-B3CB-1111C9C6E807}.Release|x64.Build.0 = Release|Any CPU + {CA805B77-D50C-431F-B3CB-1111C9C6E807}.Release|x86.ActiveCfg = Release|Any CPU + {CA805B77-D50C-431F-B3CB-1111C9C6E807}.Release|x86.Build.0 = Release|Any CPU {C4F54FB5-C828-414D-BA03-E8E7A10C784D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C4F54FB5-C828-414D-BA03-E8E7A10C784D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C4F54FB5-C828-414D-BA03-E8E7A10C784D}.Debug|x64.ActiveCfg = Debug|Any CPU + {C4F54FB5-C828-414D-BA03-E8E7A10C784D}.Debug|x64.Build.0 = Debug|Any CPU + {C4F54FB5-C828-414D-BA03-E8E7A10C784D}.Debug|x86.ActiveCfg = Debug|Any CPU + {C4F54FB5-C828-414D-BA03-E8E7A10C784D}.Debug|x86.Build.0 = Debug|Any CPU {C4F54FB5-C828-414D-BA03-E8E7A10C784D}.Release|Any CPU.ActiveCfg = Release|Any CPU {C4F54FB5-C828-414D-BA03-E8E7A10C784D}.Release|Any CPU.Build.0 = Release|Any CPU + {C4F54FB5-C828-414D-BA03-E8E7A10C784D}.Release|x64.ActiveCfg = Release|Any CPU + {C4F54FB5-C828-414D-BA03-E8E7A10C784D}.Release|x64.Build.0 = Release|Any CPU + {C4F54FB5-C828-414D-BA03-E8E7A10C784D}.Release|x86.ActiveCfg = Release|Any CPU + {C4F54FB5-C828-414D-BA03-E8E7A10C784D}.Release|x86.Build.0 = Release|Any CPU {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}.Debug|x64.ActiveCfg = Debug|Any CPU + {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}.Debug|x64.Build.0 = Debug|Any CPU + {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}.Debug|x86.ActiveCfg = Debug|Any CPU + {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}.Debug|x86.Build.0 = Debug|Any CPU {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}.Release|Any CPU.ActiveCfg = Release|Any CPU {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}.Release|Any CPU.Build.0 = Release|Any CPU + {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}.Release|x64.ActiveCfg = Release|Any CPU + {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}.Release|x64.Build.0 = Release|Any CPU + {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}.Release|x86.ActiveCfg = Release|Any CPU + {E5FCE710-C5A3-4F94-B9C9-BD1E99252BFB}.Release|x86.Build.0 = Release|Any CPU {3683340D-92F5-4B14-B77B-34A163333309}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {3683340D-92F5-4B14-B77B-34A163333309}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3683340D-92F5-4B14-B77B-34A163333309}.Debug|x64.ActiveCfg = Debug|Any CPU + {3683340D-92F5-4B14-B77B-34A163333309}.Debug|x64.Build.0 = Debug|Any CPU + {3683340D-92F5-4B14-B77B-34A163333309}.Debug|x86.ActiveCfg = Debug|Any CPU + {3683340D-92F5-4B14-B77B-34A163333309}.Debug|x86.Build.0 = Debug|Any CPU {3683340D-92F5-4B14-B77B-34A163333309}.Release|Any CPU.ActiveCfg = Release|Any CPU {3683340D-92F5-4B14-B77B-34A163333309}.Release|Any CPU.Build.0 = Release|Any CPU + {3683340D-92F5-4B14-B77B-34A163333309}.Release|x64.ActiveCfg = Release|Any CPU + {3683340D-92F5-4B14-B77B-34A163333309}.Release|x64.Build.0 = Release|Any CPU + {3683340D-92F5-4B14-B77B-34A163333309}.Release|x86.ActiveCfg = Release|Any CPU + {3683340D-92F5-4B14-B77B-34A163333309}.Release|x86.Build.0 = Release|Any CPU {EDFFDA74-090D-439C-A58D-06CCF86D4423}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EDFFDA74-090D-439C-A58D-06CCF86D4423}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EDFFDA74-090D-439C-A58D-06CCF86D4423}.Debug|x64.ActiveCfg = Debug|Any CPU + {EDFFDA74-090D-439C-A58D-06CCF86D4423}.Debug|x64.Build.0 = Debug|Any CPU + {EDFFDA74-090D-439C-A58D-06CCF86D4423}.Debug|x86.ActiveCfg = Debug|Any CPU + {EDFFDA74-090D-439C-A58D-06CCF86D4423}.Debug|x86.Build.0 = Debug|Any CPU {EDFFDA74-090D-439C-A58D-06CCF86D4423}.Release|Any CPU.ActiveCfg = Release|Any CPU {EDFFDA74-090D-439C-A58D-06CCF86D4423}.Release|Any CPU.Build.0 = Release|Any CPU + {EDFFDA74-090D-439C-A58D-06CCF86D4423}.Release|x64.ActiveCfg = Release|Any CPU + {EDFFDA74-090D-439C-A58D-06CCF86D4423}.Release|x64.Build.0 = Release|Any CPU + {EDFFDA74-090D-439C-A58D-06CCF86D4423}.Release|x86.ActiveCfg = Release|Any CPU + {EDFFDA74-090D-439C-A58D-06CCF86D4423}.Release|x86.Build.0 = Release|Any CPU {C6D6D878-208A-4FD2-822E-365545D8681B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C6D6D878-208A-4FD2-822E-365545D8681B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C6D6D878-208A-4FD2-822E-365545D8681B}.Debug|x64.ActiveCfg = Debug|Any CPU + {C6D6D878-208A-4FD2-822E-365545D8681B}.Debug|x64.Build.0 = Debug|Any CPU + {C6D6D878-208A-4FD2-822E-365545D8681B}.Debug|x86.ActiveCfg = Debug|Any CPU + {C6D6D878-208A-4FD2-822E-365545D8681B}.Debug|x86.Build.0 = Debug|Any CPU {C6D6D878-208A-4FD2-822E-365545D8681B}.Release|Any CPU.ActiveCfg = Release|Any CPU {C6D6D878-208A-4FD2-822E-365545D8681B}.Release|Any CPU.Build.0 = Release|Any CPU + {C6D6D878-208A-4FD2-822E-365545D8681B}.Release|x64.ActiveCfg = Release|Any CPU + {C6D6D878-208A-4FD2-822E-365545D8681B}.Release|x64.Build.0 = Release|Any CPU + {C6D6D878-208A-4FD2-822E-365545D8681B}.Release|x86.ActiveCfg = Release|Any CPU + {C6D6D878-208A-4FD2-822E-365545D8681B}.Release|x86.Build.0 = Release|Any CPU {9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Debug|x64.ActiveCfg = Debug|Any CPU + {9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Debug|x64.Build.0 = Debug|Any CPU + {9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Debug|x86.ActiveCfg = Debug|Any CPU + {9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Debug|x86.Build.0 = Debug|Any CPU {9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Release|Any CPU.ActiveCfg = Release|Any CPU {9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Release|Any CPU.Build.0 = Release|Any CPU + {9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Release|x64.ActiveCfg = Release|Any CPU + {9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Release|x64.Build.0 = Release|Any CPU + {9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Release|x86.ActiveCfg = Release|Any CPU + {9DD41C8F-0886-483C-B98B-C55EAA7F226D}.Release|x86.Build.0 = Release|Any CPU {0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Debug|x64.ActiveCfg = Debug|Any CPU + {0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Debug|x64.Build.0 = Debug|Any CPU + {0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Debug|x86.ActiveCfg = Debug|Any CPU + {0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Debug|x86.Build.0 = Debug|Any CPU {0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Release|Any CPU.ActiveCfg = Release|Any CPU {0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Release|Any CPU.Build.0 = Release|Any CPU + {0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Release|x64.ActiveCfg = Release|Any CPU + {0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Release|x64.Build.0 = Release|Any CPU + {0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Release|x86.ActiveCfg = Release|Any CPU + {0AD06E14-CBFE-4551-8D18-9E921D8F2A87}.Release|x86.Build.0 = Release|Any CPU {08531C5D-0436-4721-986D-96446CF54316}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {08531C5D-0436-4721-986D-96446CF54316}.Debug|Any CPU.Build.0 = Debug|Any CPU + {08531C5D-0436-4721-986D-96446CF54316}.Debug|x64.ActiveCfg = Debug|Any CPU + {08531C5D-0436-4721-986D-96446CF54316}.Debug|x64.Build.0 = Debug|Any CPU + {08531C5D-0436-4721-986D-96446CF54316}.Debug|x86.ActiveCfg = Debug|Any CPU + {08531C5D-0436-4721-986D-96446CF54316}.Debug|x86.Build.0 = Debug|Any CPU {08531C5D-0436-4721-986D-96446CF54316}.Release|Any CPU.ActiveCfg = Release|Any CPU {08531C5D-0436-4721-986D-96446CF54316}.Release|Any CPU.Build.0 = Release|Any CPU + {08531C5D-0436-4721-986D-96446CF54316}.Release|x64.ActiveCfg = Release|Any CPU + {08531C5D-0436-4721-986D-96446CF54316}.Release|x64.Build.0 = Release|Any CPU + {08531C5D-0436-4721-986D-96446CF54316}.Release|x86.ActiveCfg = Release|Any CPU + {08531C5D-0436-4721-986D-96446CF54316}.Release|x86.Build.0 = Release|Any CPU {0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Debug|x64.ActiveCfg = Debug|Any CPU + {0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Debug|x64.Build.0 = Debug|Any CPU + {0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Debug|x86.ActiveCfg = Debug|Any CPU + {0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Debug|x86.Build.0 = Debug|Any CPU {0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Release|Any CPU.ActiveCfg = Release|Any CPU {0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Release|Any CPU.Build.0 = Release|Any CPU + {0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Release|x64.ActiveCfg = Release|Any CPU + {0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Release|x64.Build.0 = Release|Any CPU + {0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Release|x86.ActiveCfg = Release|Any CPU + {0CFC9D4F-F12F-4B44-ABCF-AB4A0E9E85B2}.Release|x86.Build.0 = Release|Any CPU {192A829F-D608-4E41-8DE0-058E943E453F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {192A829F-D608-4E41-8DE0-058E943E453F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {192A829F-D608-4E41-8DE0-058E943E453F}.Debug|x64.ActiveCfg = Debug|Any CPU + {192A829F-D608-4E41-8DE0-058E943E453F}.Debug|x64.Build.0 = Debug|Any CPU + {192A829F-D608-4E41-8DE0-058E943E453F}.Debug|x86.ActiveCfg = Debug|Any CPU + {192A829F-D608-4E41-8DE0-058E943E453F}.Debug|x86.Build.0 = Debug|Any CPU {192A829F-D608-4E41-8DE0-058E943E453F}.Release|Any CPU.ActiveCfg = Release|Any CPU {192A829F-D608-4E41-8DE0-058E943E453F}.Release|Any CPU.Build.0 = Release|Any CPU + {192A829F-D608-4E41-8DE0-058E943E453F}.Release|x64.ActiveCfg = Release|Any CPU + {192A829F-D608-4E41-8DE0-058E943E453F}.Release|x64.Build.0 = Release|Any CPU + {192A829F-D608-4E41-8DE0-058E943E453F}.Release|x86.ActiveCfg = Release|Any CPU + {192A829F-D608-4E41-8DE0-058E943E453F}.Release|x86.Build.0 = Release|Any CPU {DCC41E99-EBC7-4F19-BA0D-A6F770D8E431}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DCC41E99-EBC7-4F19-BA0D-A6F770D8E431}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DCC41E99-EBC7-4F19-BA0D-A6F770D8E431}.Debug|x64.ActiveCfg = Debug|Any CPU + {DCC41E99-EBC7-4F19-BA0D-A6F770D8E431}.Debug|x64.Build.0 = Debug|Any CPU + {DCC41E99-EBC7-4F19-BA0D-A6F770D8E431}.Debug|x86.ActiveCfg = Debug|Any CPU + {DCC41E99-EBC7-4F19-BA0D-A6F770D8E431}.Debug|x86.Build.0 = Debug|Any CPU {DCC41E99-EBC7-4F19-BA0D-A6F770D8E431}.Release|Any CPU.ActiveCfg = Release|Any CPU {DCC41E99-EBC7-4F19-BA0D-A6F770D8E431}.Release|Any CPU.Build.0 = Release|Any CPU + {DCC41E99-EBC7-4F19-BA0D-A6F770D8E431}.Release|x64.ActiveCfg = Release|Any CPU + {DCC41E99-EBC7-4F19-BA0D-A6F770D8E431}.Release|x64.Build.0 = Release|Any CPU + {DCC41E99-EBC7-4F19-BA0D-A6F770D8E431}.Release|x86.ActiveCfg = Release|Any CPU + {DCC41E99-EBC7-4F19-BA0D-A6F770D8E431}.Release|x86.Build.0 = Release|Any CPU {18B796D2-D45D-41AE-9A42-75C9B14B20DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {18B796D2-D45D-41AE-9A42-75C9B14B20DF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {18B796D2-D45D-41AE-9A42-75C9B14B20DF}.Debug|x64.ActiveCfg = Debug|Any CPU + {18B796D2-D45D-41AE-9A42-75C9B14B20DF}.Debug|x64.Build.0 = Debug|Any CPU + {18B796D2-D45D-41AE-9A42-75C9B14B20DF}.Debug|x86.ActiveCfg = Debug|Any CPU + {18B796D2-D45D-41AE-9A42-75C9B14B20DF}.Debug|x86.Build.0 = Debug|Any CPU {18B796D2-D45D-41AE-9A42-75C9B14B20DF}.Release|Any CPU.ActiveCfg = Release|Any CPU {18B796D2-D45D-41AE-9A42-75C9B14B20DF}.Release|Any CPU.Build.0 = Release|Any CPU + {18B796D2-D45D-41AE-9A42-75C9B14B20DF}.Release|x64.ActiveCfg = Release|Any CPU + {18B796D2-D45D-41AE-9A42-75C9B14B20DF}.Release|x64.Build.0 = Release|Any CPU + {18B796D2-D45D-41AE-9A42-75C9B14B20DF}.Release|x86.ActiveCfg = Release|Any CPU + {18B796D2-D45D-41AE-9A42-75C9B14B20DF}.Release|x86.Build.0 = Release|Any CPU {5EED625D-8D86-492A-BCB8-F6C8CD8D4AA1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {5EED625D-8D86-492A-BCB8-F6C8CD8D4AA1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5EED625D-8D86-492A-BCB8-F6C8CD8D4AA1}.Debug|x64.ActiveCfg = Debug|Any CPU + {5EED625D-8D86-492A-BCB8-F6C8CD8D4AA1}.Debug|x64.Build.0 = Debug|Any CPU + {5EED625D-8D86-492A-BCB8-F6C8CD8D4AA1}.Debug|x86.ActiveCfg = Debug|Any CPU + {5EED625D-8D86-492A-BCB8-F6C8CD8D4AA1}.Debug|x86.Build.0 = Debug|Any CPU {5EED625D-8D86-492A-BCB8-F6C8CD8D4AA1}.Release|Any CPU.ActiveCfg = Release|Any CPU {5EED625D-8D86-492A-BCB8-F6C8CD8D4AA1}.Release|Any CPU.Build.0 = Release|Any CPU + {5EED625D-8D86-492A-BCB8-F6C8CD8D4AA1}.Release|x64.ActiveCfg = Release|Any CPU + {5EED625D-8D86-492A-BCB8-F6C8CD8D4AA1}.Release|x64.Build.0 = Release|Any CPU + {5EED625D-8D86-492A-BCB8-F6C8CD8D4AA1}.Release|x86.ActiveCfg = Release|Any CPU + {5EED625D-8D86-492A-BCB8-F6C8CD8D4AA1}.Release|x86.Build.0 = Release|Any CPU {B02EF042-C39E-45C4-A92D-BF7554E1889D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B02EF042-C39E-45C4-A92D-BF7554E1889D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B02EF042-C39E-45C4-A92D-BF7554E1889D}.Debug|x64.ActiveCfg = Debug|Any CPU + {B02EF042-C39E-45C4-A92D-BF7554E1889D}.Debug|x64.Build.0 = Debug|Any CPU + {B02EF042-C39E-45C4-A92D-BF7554E1889D}.Debug|x86.ActiveCfg = Debug|Any CPU + {B02EF042-C39E-45C4-A92D-BF7554E1889D}.Debug|x86.Build.0 = Debug|Any CPU {B02EF042-C39E-45C4-A92D-BF7554E1889D}.Release|Any CPU.ActiveCfg = Release|Any CPU {B02EF042-C39E-45C4-A92D-BF7554E1889D}.Release|Any CPU.Build.0 = Release|Any CPU + {B02EF042-C39E-45C4-A92D-BF7554E1889D}.Release|x64.ActiveCfg = Release|Any CPU + {B02EF042-C39E-45C4-A92D-BF7554E1889D}.Release|x64.Build.0 = Release|Any CPU + {B02EF042-C39E-45C4-A92D-BF7554E1889D}.Release|x86.ActiveCfg = Release|Any CPU + {B02EF042-C39E-45C4-A92D-BF7554E1889D}.Release|x86.Build.0 = Release|Any CPU {CAE48068-233C-47A9-BEAB-DDF521730E7A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {CAE48068-233C-47A9-BEAB-DDF521730E7A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CAE48068-233C-47A9-BEAB-DDF521730E7A}.Debug|x64.ActiveCfg = Debug|Any CPU + {CAE48068-233C-47A9-BEAB-DDF521730E7A}.Debug|x64.Build.0 = Debug|Any CPU + {CAE48068-233C-47A9-BEAB-DDF521730E7A}.Debug|x86.ActiveCfg = Debug|Any CPU + {CAE48068-233C-47A9-BEAB-DDF521730E7A}.Debug|x86.Build.0 = Debug|Any CPU {CAE48068-233C-47A9-BEAB-DDF521730E7A}.Release|Any CPU.ActiveCfg = Release|Any CPU {CAE48068-233C-47A9-BEAB-DDF521730E7A}.Release|Any CPU.Build.0 = Release|Any CPU + {CAE48068-233C-47A9-BEAB-DDF521730E7A}.Release|x64.ActiveCfg = Release|Any CPU + {CAE48068-233C-47A9-BEAB-DDF521730E7A}.Release|x64.Build.0 = Release|Any CPU + {CAE48068-233C-47A9-BEAB-DDF521730E7A}.Release|x86.ActiveCfg = Release|Any CPU + {CAE48068-233C-47A9-BEAB-DDF521730E7A}.Release|x86.Build.0 = Release|Any CPU {C44E2BD5-8D62-48A7-84AF-FE7CF2C8716C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C44E2BD5-8D62-48A7-84AF-FE7CF2C8716C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C44E2BD5-8D62-48A7-84AF-FE7CF2C8716C}.Debug|x64.ActiveCfg = Debug|Any CPU + {C44E2BD5-8D62-48A7-84AF-FE7CF2C8716C}.Debug|x64.Build.0 = Debug|Any CPU + {C44E2BD5-8D62-48A7-84AF-FE7CF2C8716C}.Debug|x86.ActiveCfg = Debug|Any CPU + {C44E2BD5-8D62-48A7-84AF-FE7CF2C8716C}.Debug|x86.Build.0 = Debug|Any CPU {C44E2BD5-8D62-48A7-84AF-FE7CF2C8716C}.Release|Any CPU.ActiveCfg = Release|Any CPU {C44E2BD5-8D62-48A7-84AF-FE7CF2C8716C}.Release|Any CPU.Build.0 = Release|Any CPU + {C44E2BD5-8D62-48A7-84AF-FE7CF2C8716C}.Release|x64.ActiveCfg = Release|Any CPU + {C44E2BD5-8D62-48A7-84AF-FE7CF2C8716C}.Release|x64.Build.0 = Release|Any CPU + {C44E2BD5-8D62-48A7-84AF-FE7CF2C8716C}.Release|x86.ActiveCfg = Release|Any CPU + {C44E2BD5-8D62-48A7-84AF-FE7CF2C8716C}.Release|x86.Build.0 = Release|Any CPU {E9492F9F-47E0-45A6-A51D-9949FEAA8543}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E9492F9F-47E0-45A6-A51D-9949FEAA8543}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E9492F9F-47E0-45A6-A51D-9949FEAA8543}.Debug|x64.ActiveCfg = Debug|Any CPU + {E9492F9F-47E0-45A6-A51D-9949FEAA8543}.Debug|x64.Build.0 = Debug|Any CPU + {E9492F9F-47E0-45A6-A51D-9949FEAA8543}.Debug|x86.ActiveCfg = Debug|Any CPU + {E9492F9F-47E0-45A6-A51D-9949FEAA8543}.Debug|x86.Build.0 = Debug|Any CPU {E9492F9F-47E0-45A6-A51D-9949FEAA8543}.Release|Any CPU.ActiveCfg = Release|Any CPU {E9492F9F-47E0-45A6-A51D-9949FEAA8543}.Release|Any CPU.Build.0 = Release|Any CPU + {E9492F9F-47E0-45A6-A51D-9949FEAA8543}.Release|x64.ActiveCfg = Release|Any CPU + {E9492F9F-47E0-45A6-A51D-9949FEAA8543}.Release|x64.Build.0 = Release|Any CPU + {E9492F9F-47E0-45A6-A51D-9949FEAA8543}.Release|x86.ActiveCfg = Release|Any CPU + {E9492F9F-47E0-45A6-A51D-9949FEAA8543}.Release|x86.Build.0 = Release|Any CPU {8764DFAF-D13D-449A-9A5E-5D7F0B2D7FEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {8764DFAF-D13D-449A-9A5E-5D7F0B2D7FEF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8764DFAF-D13D-449A-9A5E-5D7F0B2D7FEF}.Debug|x64.ActiveCfg = Debug|Any CPU + {8764DFAF-D13D-449A-9A5E-5D7F0B2D7FEF}.Debug|x64.Build.0 = Debug|Any CPU + {8764DFAF-D13D-449A-9A5E-5D7F0B2D7FEF}.Debug|x86.ActiveCfg = Debug|Any CPU + {8764DFAF-D13D-449A-9A5E-5D7F0B2D7FEF}.Debug|x86.Build.0 = Debug|Any CPU {8764DFAF-D13D-449A-9A5E-5D7F0B2D7FEF}.Release|Any CPU.ActiveCfg = Release|Any CPU {8764DFAF-D13D-449A-9A5E-5D7F0B2D7FEF}.Release|Any CPU.Build.0 = Release|Any CPU + {8764DFAF-D13D-449A-9A5E-5D7F0B2D7FEF}.Release|x64.ActiveCfg = Release|Any CPU + {8764DFAF-D13D-449A-9A5E-5D7F0B2D7FEF}.Release|x64.Build.0 = Release|Any CPU + {8764DFAF-D13D-449A-9A5E-5D7F0B2D7FEF}.Release|x86.ActiveCfg = Release|Any CPU + {8764DFAF-D13D-449A-9A5E-5D7F0B2D7FEF}.Release|x86.Build.0 = Release|Any CPU {0F80E95C-41E6-4F23-94FF-FC9D0B8D5D71}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0F80E95C-41E6-4F23-94FF-FC9D0B8D5D71}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0F80E95C-41E6-4F23-94FF-FC9D0B8D5D71}.Debug|x64.ActiveCfg = Debug|Any CPU + {0F80E95C-41E6-4F23-94FF-FC9D0B8D5D71}.Debug|x64.Build.0 = Debug|Any CPU + {0F80E95C-41E6-4F23-94FF-FC9D0B8D5D71}.Debug|x86.ActiveCfg = Debug|Any CPU + {0F80E95C-41E6-4F23-94FF-FC9D0B8D5D71}.Debug|x86.Build.0 = Debug|Any CPU {0F80E95C-41E6-4F23-94FF-FC9D0B8D5D71}.Release|Any CPU.ActiveCfg = Release|Any CPU {0F80E95C-41E6-4F23-94FF-FC9D0B8D5D71}.Release|Any CPU.Build.0 = Release|Any CPU + {0F80E95C-41E6-4F23-94FF-FC9D0B8D5D71}.Release|x64.ActiveCfg = Release|Any CPU + {0F80E95C-41E6-4F23-94FF-FC9D0B8D5D71}.Release|x64.Build.0 = Release|Any CPU + {0F80E95C-41E6-4F23-94FF-FC9D0B8D5D71}.Release|x86.ActiveCfg = Release|Any CPU + {0F80E95C-41E6-4F23-94FF-FC9D0B8D5D71}.Release|x86.Build.0 = Release|Any CPU {0858571B-CE73-4AD6-BD06-EC9F0714D8E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {0858571B-CE73-4AD6-BD06-EC9F0714D8E9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0858571B-CE73-4AD6-BD06-EC9F0714D8E9}.Debug|x64.ActiveCfg = Debug|Any CPU + {0858571B-CE73-4AD6-BD06-EC9F0714D8E9}.Debug|x64.Build.0 = Debug|Any CPU + {0858571B-CE73-4AD6-BD06-EC9F0714D8E9}.Debug|x86.ActiveCfg = Debug|Any CPU + {0858571B-CE73-4AD6-BD06-EC9F0714D8E9}.Debug|x86.Build.0 = Debug|Any CPU {0858571B-CE73-4AD6-BD06-EC9F0714D8E9}.Release|Any CPU.ActiveCfg = Release|Any CPU {0858571B-CE73-4AD6-BD06-EC9F0714D8E9}.Release|Any CPU.Build.0 = Release|Any CPU + {0858571B-CE73-4AD6-BD06-EC9F0714D8E9}.Release|x64.ActiveCfg = Release|Any CPU + {0858571B-CE73-4AD6-BD06-EC9F0714D8E9}.Release|x64.Build.0 = Release|Any CPU + {0858571B-CE73-4AD6-BD06-EC9F0714D8E9}.Release|x86.ActiveCfg = Release|Any CPU + {0858571B-CE73-4AD6-BD06-EC9F0714D8E9}.Release|x86.Build.0 = Release|Any CPU {86F3684C-A0A5-4943-8CFA-AE79E8E3E315}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {86F3684C-A0A5-4943-8CFA-AE79E8E3E315}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86F3684C-A0A5-4943-8CFA-AE79E8E3E315}.Debug|x64.ActiveCfg = Debug|Any CPU + {86F3684C-A0A5-4943-8CFA-AE79E8E3E315}.Debug|x64.Build.0 = Debug|Any CPU + {86F3684C-A0A5-4943-8CFA-AE79E8E3E315}.Debug|x86.ActiveCfg = Debug|Any CPU + {86F3684C-A0A5-4943-8CFA-AE79E8E3E315}.Debug|x86.Build.0 = Debug|Any CPU {86F3684C-A0A5-4943-8CFA-AE79E8E3E315}.Release|Any CPU.ActiveCfg = Release|Any CPU {86F3684C-A0A5-4943-8CFA-AE79E8E3E315}.Release|Any CPU.Build.0 = Release|Any CPU + {86F3684C-A0A5-4943-8CFA-AE79E8E3E315}.Release|x64.ActiveCfg = Release|Any CPU + {86F3684C-A0A5-4943-8CFA-AE79E8E3E315}.Release|x64.Build.0 = Release|Any CPU + {86F3684C-A0A5-4943-8CFA-AE79E8E3E315}.Release|x86.ActiveCfg = Release|Any CPU + {86F3684C-A0A5-4943-8CFA-AE79E8E3E315}.Release|x86.Build.0 = Release|Any CPU {32F3E84B-D02E-42BD-BC5C-0D211564EF30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {32F3E84B-D02E-42BD-BC5C-0D211564EF30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32F3E84B-D02E-42BD-BC5C-0D211564EF30}.Debug|x64.ActiveCfg = Debug|Any CPU + {32F3E84B-D02E-42BD-BC5C-0D211564EF30}.Debug|x64.Build.0 = Debug|Any CPU + {32F3E84B-D02E-42BD-BC5C-0D211564EF30}.Debug|x86.ActiveCfg = Debug|Any CPU + {32F3E84B-D02E-42BD-BC5C-0D211564EF30}.Debug|x86.Build.0 = Debug|Any CPU {32F3E84B-D02E-42BD-BC5C-0D211564EF30}.Release|Any CPU.ActiveCfg = Release|Any CPU {32F3E84B-D02E-42BD-BC5C-0D211564EF30}.Release|Any CPU.Build.0 = Release|Any CPU + {32F3E84B-D02E-42BD-BC5C-0D211564EF30}.Release|x64.ActiveCfg = Release|Any CPU + {32F3E84B-D02E-42BD-BC5C-0D211564EF30}.Release|x64.Build.0 = Release|Any CPU + {32F3E84B-D02E-42BD-BC5C-0D211564EF30}.Release|x86.ActiveCfg = Release|Any CPU + {32F3E84B-D02E-42BD-BC5C-0D211564EF30}.Release|x86.Build.0 = Release|Any CPU {78340A37-219E-4F2D-9AC6-40A7B467EEEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {78340A37-219E-4F2D-9AC6-40A7B467EEEC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {78340A37-219E-4F2D-9AC6-40A7B467EEEC}.Debug|x64.ActiveCfg = Debug|Any CPU + {78340A37-219E-4F2D-9AC6-40A7B467EEEC}.Debug|x64.Build.0 = Debug|Any CPU + {78340A37-219E-4F2D-9AC6-40A7B467EEEC}.Debug|x86.ActiveCfg = Debug|Any CPU + {78340A37-219E-4F2D-9AC6-40A7B467EEEC}.Debug|x86.Build.0 = Debug|Any CPU {78340A37-219E-4F2D-9AC6-40A7B467EEEC}.Release|Any CPU.ActiveCfg = Release|Any CPU {78340A37-219E-4F2D-9AC6-40A7B467EEEC}.Release|Any CPU.Build.0 = Release|Any CPU + {78340A37-219E-4F2D-9AC6-40A7B467EEEC}.Release|x64.ActiveCfg = Release|Any CPU + {78340A37-219E-4F2D-9AC6-40A7B467EEEC}.Release|x64.Build.0 = Release|Any CPU + {78340A37-219E-4F2D-9AC6-40A7B467EEEC}.Release|x86.ActiveCfg = Release|Any CPU + {78340A37-219E-4F2D-9AC6-40A7B467EEEC}.Release|x86.Build.0 = Release|Any CPU {44467427-E0BE-492C-B9B4-82B362C183C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {44467427-E0BE-492C-B9B4-82B362C183C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {44467427-E0BE-492C-B9B4-82B362C183C3}.Debug|x64.ActiveCfg = Debug|Any CPU + {44467427-E0BE-492C-B9B4-82B362C183C3}.Debug|x64.Build.0 = Debug|Any CPU + {44467427-E0BE-492C-B9B4-82B362C183C3}.Debug|x86.ActiveCfg = Debug|Any CPU + {44467427-E0BE-492C-B9B4-82B362C183C3}.Debug|x86.Build.0 = Debug|Any CPU {44467427-E0BE-492C-B9B4-82B362C183C3}.Release|Any CPU.ActiveCfg = Release|Any CPU {44467427-E0BE-492C-B9B4-82B362C183C3}.Release|Any CPU.Build.0 = Release|Any CPU + {44467427-E0BE-492C-B9B4-82B362C183C3}.Release|x64.ActiveCfg = Release|Any CPU + {44467427-E0BE-492C-B9B4-82B362C183C3}.Release|x64.Build.0 = Release|Any CPU + {44467427-E0BE-492C-B9B4-82B362C183C3}.Release|x86.ActiveCfg = Release|Any CPU + {44467427-E0BE-492C-B9B4-82B362C183C3}.Release|x86.Build.0 = Release|Any CPU {F701EDA5-D7EA-4AA7-9C57-83ED50CE72EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F701EDA5-D7EA-4AA7-9C57-83ED50CE72EC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F701EDA5-D7EA-4AA7-9C57-83ED50CE72EC}.Debug|x64.ActiveCfg = Debug|Any CPU + {F701EDA5-D7EA-4AA7-9C57-83ED50CE72EC}.Debug|x64.Build.0 = Debug|Any CPU + {F701EDA5-D7EA-4AA7-9C57-83ED50CE72EC}.Debug|x86.ActiveCfg = Debug|Any CPU + {F701EDA5-D7EA-4AA7-9C57-83ED50CE72EC}.Debug|x86.Build.0 = Debug|Any CPU {F701EDA5-D7EA-4AA7-9C57-83ED50CE72EC}.Release|Any CPU.ActiveCfg = Release|Any CPU {F701EDA5-D7EA-4AA7-9C57-83ED50CE72EC}.Release|Any CPU.Build.0 = Release|Any CPU + {F701EDA5-D7EA-4AA7-9C57-83ED50CE72EC}.Release|x64.ActiveCfg = Release|Any CPU + {F701EDA5-D7EA-4AA7-9C57-83ED50CE72EC}.Release|x64.Build.0 = Release|Any CPU + {F701EDA5-D7EA-4AA7-9C57-83ED50CE72EC}.Release|x86.ActiveCfg = Release|Any CPU + {F701EDA5-D7EA-4AA7-9C57-83ED50CE72EC}.Release|x86.Build.0 = Release|Any CPU {2BE6BDC7-A9A3-4E30-9099-A9EF4813F6FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2BE6BDC7-A9A3-4E30-9099-A9EF4813F6FF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2BE6BDC7-A9A3-4E30-9099-A9EF4813F6FF}.Debug|x64.ActiveCfg = Debug|Any CPU + {2BE6BDC7-A9A3-4E30-9099-A9EF4813F6FF}.Debug|x64.Build.0 = Debug|Any CPU + {2BE6BDC7-A9A3-4E30-9099-A9EF4813F6FF}.Debug|x86.ActiveCfg = Debug|Any CPU + {2BE6BDC7-A9A3-4E30-9099-A9EF4813F6FF}.Debug|x86.Build.0 = Debug|Any CPU {2BE6BDC7-A9A3-4E30-9099-A9EF4813F6FF}.Release|Any CPU.ActiveCfg = Release|Any CPU {2BE6BDC7-A9A3-4E30-9099-A9EF4813F6FF}.Release|Any CPU.Build.0 = Release|Any CPU + {2BE6BDC7-A9A3-4E30-9099-A9EF4813F6FF}.Release|x64.ActiveCfg = Release|Any CPU + {2BE6BDC7-A9A3-4E30-9099-A9EF4813F6FF}.Release|x64.Build.0 = Release|Any CPU + {2BE6BDC7-A9A3-4E30-9099-A9EF4813F6FF}.Release|x86.ActiveCfg = Release|Any CPU + {2BE6BDC7-A9A3-4E30-9099-A9EF4813F6FF}.Release|x86.Build.0 = Release|Any CPU {1E161A34-10C1-46FA-9EFD-10DD0858A8F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1E161A34-10C1-46FA-9EFD-10DD0858A8F5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1E161A34-10C1-46FA-9EFD-10DD0858A8F5}.Debug|x64.ActiveCfg = Debug|Any CPU + {1E161A34-10C1-46FA-9EFD-10DD0858A8F5}.Debug|x64.Build.0 = Debug|Any CPU + {1E161A34-10C1-46FA-9EFD-10DD0858A8F5}.Debug|x86.ActiveCfg = Debug|Any CPU + {1E161A34-10C1-46FA-9EFD-10DD0858A8F5}.Debug|x86.Build.0 = Debug|Any CPU {1E161A34-10C1-46FA-9EFD-10DD0858A8F5}.Release|Any CPU.ActiveCfg = Release|Any CPU {1E161A34-10C1-46FA-9EFD-10DD0858A8F5}.Release|Any CPU.Build.0 = Release|Any CPU + {1E161A34-10C1-46FA-9EFD-10DD0858A8F5}.Release|x64.ActiveCfg = Release|Any CPU + {1E161A34-10C1-46FA-9EFD-10DD0858A8F5}.Release|x64.Build.0 = Release|Any CPU + {1E161A34-10C1-46FA-9EFD-10DD0858A8F5}.Release|x86.ActiveCfg = Release|Any CPU + {1E161A34-10C1-46FA-9EFD-10DD0858A8F5}.Release|x86.Build.0 = Release|Any CPU {62B2B8C9-8F24-4D31-894F-C1F0728D32AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {62B2B8C9-8F24-4D31-894F-C1F0728D32AB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {62B2B8C9-8F24-4D31-894F-C1F0728D32AB}.Debug|x64.ActiveCfg = Debug|Any CPU + {62B2B8C9-8F24-4D31-894F-C1F0728D32AB}.Debug|x64.Build.0 = Debug|Any CPU + {62B2B8C9-8F24-4D31-894F-C1F0728D32AB}.Debug|x86.ActiveCfg = Debug|Any CPU + {62B2B8C9-8F24-4D31-894F-C1F0728D32AB}.Debug|x86.Build.0 = Debug|Any CPU {62B2B8C9-8F24-4D31-894F-C1F0728D32AB}.Release|Any CPU.ActiveCfg = Release|Any CPU {62B2B8C9-8F24-4D31-894F-C1F0728D32AB}.Release|Any CPU.Build.0 = Release|Any CPU + {62B2B8C9-8F24-4D31-894F-C1F0728D32AB}.Release|x64.ActiveCfg = Release|Any CPU + {62B2B8C9-8F24-4D31-894F-C1F0728D32AB}.Release|x64.Build.0 = Release|Any CPU + {62B2B8C9-8F24-4D31-894F-C1F0728D32AB}.Release|x86.ActiveCfg = Release|Any CPU + {62B2B8C9-8F24-4D31-894F-C1F0728D32AB}.Release|x86.Build.0 = Release|Any CPU {983B0136-384B-4439-B374-31111FFAA286}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {983B0136-384B-4439-B374-31111FFAA286}.Debug|Any CPU.Build.0 = Debug|Any CPU + {983B0136-384B-4439-B374-31111FFAA286}.Debug|x64.ActiveCfg = Debug|Any CPU + {983B0136-384B-4439-B374-31111FFAA286}.Debug|x64.Build.0 = Debug|Any CPU + {983B0136-384B-4439-B374-31111FFAA286}.Debug|x86.ActiveCfg = Debug|Any CPU + {983B0136-384B-4439-B374-31111FFAA286}.Debug|x86.Build.0 = Debug|Any CPU {983B0136-384B-4439-B374-31111FFAA286}.Release|Any CPU.ActiveCfg = Release|Any CPU {983B0136-384B-4439-B374-31111FFAA286}.Release|Any CPU.Build.0 = Release|Any CPU + {983B0136-384B-4439-B374-31111FFAA286}.Release|x64.ActiveCfg = Release|Any CPU + {983B0136-384B-4439-B374-31111FFAA286}.Release|x64.Build.0 = Release|Any CPU + {983B0136-384B-4439-B374-31111FFAA286}.Release|x86.ActiveCfg = Release|Any CPU + {983B0136-384B-4439-B374-31111FFAA286}.Release|x86.Build.0 = Release|Any CPU {F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Debug|x64.ActiveCfg = Debug|Any CPU + {F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Debug|x64.Build.0 = Debug|Any CPU + {F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Debug|x86.ActiveCfg = Debug|Any CPU + {F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Debug|x86.Build.0 = Debug|Any CPU {F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Release|Any CPU.ActiveCfg = Release|Any CPU {F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Release|Any CPU.Build.0 = Release|Any CPU + {F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Release|x64.ActiveCfg = Release|Any CPU + {F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Release|x64.Build.0 = Release|Any CPU + {F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Release|x86.ActiveCfg = Release|Any CPU + {F19A6E0C-F719-4ED9-A024-14E4B8D40883}.Release|x86.Build.0 = Release|Any CPU {198683D0-7DC6-40F2-B81B-8E446E70A9DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {198683D0-7DC6-40F2-B81B-8E446E70A9DE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {198683D0-7DC6-40F2-B81B-8E446E70A9DE}.Debug|x64.ActiveCfg = Debug|Any CPU + {198683D0-7DC6-40F2-B81B-8E446E70A9DE}.Debug|x64.Build.0 = Debug|Any CPU + {198683D0-7DC6-40F2-B81B-8E446E70A9DE}.Debug|x86.ActiveCfg = Debug|Any CPU + {198683D0-7DC6-40F2-B81B-8E446E70A9DE}.Debug|x86.Build.0 = Debug|Any CPU {198683D0-7DC6-40F2-B81B-8E446E70A9DE}.Release|Any CPU.ActiveCfg = Release|Any CPU {198683D0-7DC6-40F2-B81B-8E446E70A9DE}.Release|Any CPU.Build.0 = Release|Any CPU + {198683D0-7DC6-40F2-B81B-8E446E70A9DE}.Release|x64.ActiveCfg = Release|Any CPU + {198683D0-7DC6-40F2-B81B-8E446E70A9DE}.Release|x64.Build.0 = Release|Any CPU + {198683D0-7DC6-40F2-B81B-8E446E70A9DE}.Release|x86.ActiveCfg = Release|Any CPU + {198683D0-7DC6-40F2-B81B-8E446E70A9DE}.Release|x86.Build.0 = Release|Any CPU {DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Debug|x64.ActiveCfg = Debug|Any CPU + {DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Debug|x64.Build.0 = Debug|Any CPU + {DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Debug|x86.ActiveCfg = Debug|Any CPU + {DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Debug|x86.Build.0 = Debug|Any CPU {DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Release|Any CPU.ActiveCfg = Release|Any CPU {DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Release|Any CPU.Build.0 = Release|Any CPU + {DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Release|x64.ActiveCfg = Release|Any CPU + {DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Release|x64.Build.0 = Release|Any CPU + {DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Release|x86.ActiveCfg = Release|Any CPU + {DFAF8763-D1D6-4EB4-B459-20E31007FE2F}.Release|x86.Build.0 = Release|Any CPU {DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Debug|x64.ActiveCfg = Debug|Any CPU + {DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Debug|x64.Build.0 = Debug|Any CPU + {DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Debug|x86.ActiveCfg = Debug|Any CPU + {DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Debug|x86.Build.0 = Debug|Any CPU {DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Release|Any CPU.ActiveCfg = Release|Any CPU {DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Release|Any CPU.Build.0 = Release|Any CPU + {DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Release|x64.ActiveCfg = Release|Any CPU + {DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Release|x64.Build.0 = Release|Any CPU + {DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Release|x86.ActiveCfg = Release|Any CPU + {DACD4485-61BE-4DE5-ACAE-4FFABC122500}.Release|x86.Build.0 = Release|Any CPU {E1051CD0-9262-4869-832D-B951723F4DDE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E1051CD0-9262-4869-832D-B951723F4DDE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E1051CD0-9262-4869-832D-B951723F4DDE}.Debug|x64.ActiveCfg = Debug|Any CPU + {E1051CD0-9262-4869-832D-B951723F4DDE}.Debug|x64.Build.0 = Debug|Any CPU + {E1051CD0-9262-4869-832D-B951723F4DDE}.Debug|x86.ActiveCfg = Debug|Any CPU + {E1051CD0-9262-4869-832D-B951723F4DDE}.Debug|x86.Build.0 = Debug|Any CPU {E1051CD0-9262-4869-832D-B951723F4DDE}.Release|Any CPU.ActiveCfg = Release|Any CPU {E1051CD0-9262-4869-832D-B951723F4DDE}.Release|Any CPU.Build.0 = Release|Any CPU + {E1051CD0-9262-4869-832D-B951723F4DDE}.Release|x64.ActiveCfg = Release|Any CPU + {E1051CD0-9262-4869-832D-B951723F4DDE}.Release|x64.Build.0 = Release|Any CPU + {E1051CD0-9262-4869-832D-B951723F4DDE}.Release|x86.ActiveCfg = Release|Any CPU + {E1051CD0-9262-4869-832D-B951723F4DDE}.Release|x86.Build.0 = Release|Any CPU {2F9BA650-395C-4BE0-8CCB-9978E753562A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2F9BA650-395C-4BE0-8CCB-9978E753562A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2F9BA650-395C-4BE0-8CCB-9978E753562A}.Debug|x64.ActiveCfg = Debug|Any CPU + {2F9BA650-395C-4BE0-8CCB-9978E753562A}.Debug|x64.Build.0 = Debug|Any CPU + {2F9BA650-395C-4BE0-8CCB-9978E753562A}.Debug|x86.ActiveCfg = Debug|Any CPU + {2F9BA650-395C-4BE0-8CCB-9978E753562A}.Debug|x86.Build.0 = Debug|Any CPU {2F9BA650-395C-4BE0-8CCB-9978E753562A}.Release|Any CPU.ActiveCfg = Release|Any CPU {2F9BA650-395C-4BE0-8CCB-9978E753562A}.Release|Any CPU.Build.0 = Release|Any CPU + {2F9BA650-395C-4BE0-8CCB-9978E753562A}.Release|x64.ActiveCfg = Release|Any CPU + {2F9BA650-395C-4BE0-8CCB-9978E753562A}.Release|x64.Build.0 = Release|Any CPU + {2F9BA650-395C-4BE0-8CCB-9978E753562A}.Release|x86.ActiveCfg = Release|Any CPU + {2F9BA650-395C-4BE0-8CCB-9978E753562A}.Release|x86.Build.0 = Release|Any CPU {7ADB6D92-82CC-4A2A-8BCF-FC6C6308796D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {7ADB6D92-82CC-4A2A-8BCF-FC6C6308796D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7ADB6D92-82CC-4A2A-8BCF-FC6C6308796D}.Debug|x64.ActiveCfg = Debug|Any CPU + {7ADB6D92-82CC-4A2A-8BCF-FC6C6308796D}.Debug|x64.Build.0 = Debug|Any CPU + {7ADB6D92-82CC-4A2A-8BCF-FC6C6308796D}.Debug|x86.ActiveCfg = Debug|Any CPU + {7ADB6D92-82CC-4A2A-8BCF-FC6C6308796D}.Debug|x86.Build.0 = Debug|Any CPU {7ADB6D92-82CC-4A2A-8BCF-FC6C6308796D}.Release|Any CPU.ActiveCfg = Release|Any CPU {7ADB6D92-82CC-4A2A-8BCF-FC6C6308796D}.Release|Any CPU.Build.0 = Release|Any CPU + {7ADB6D92-82CC-4A2A-8BCF-FC6C6308796D}.Release|x64.ActiveCfg = Release|Any CPU + {7ADB6D92-82CC-4A2A-8BCF-FC6C6308796D}.Release|x64.Build.0 = Release|Any CPU + {7ADB6D92-82CC-4A2A-8BCF-FC6C6308796D}.Release|x86.ActiveCfg = Release|Any CPU + {7ADB6D92-82CC-4A2A-8BCF-FC6C6308796D}.Release|x86.Build.0 = Release|Any CPU {DEEB5200-BBF9-464D-9B7E-8FC035A27E94}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {DEEB5200-BBF9-464D-9B7E-8FC035A27E94}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DEEB5200-BBF9-464D-9B7E-8FC035A27E94}.Debug|x64.ActiveCfg = Debug|Any CPU + {DEEB5200-BBF9-464D-9B7E-8FC035A27E94}.Debug|x64.Build.0 = Debug|Any CPU + {DEEB5200-BBF9-464D-9B7E-8FC035A27E94}.Debug|x86.ActiveCfg = Debug|Any CPU + {DEEB5200-BBF9-464D-9B7E-8FC035A27E94}.Debug|x86.Build.0 = Debug|Any CPU {DEEB5200-BBF9-464D-9B7E-8FC035A27E94}.Release|Any CPU.ActiveCfg = Release|Any CPU {DEEB5200-BBF9-464D-9B7E-8FC035A27E94}.Release|Any CPU.Build.0 = Release|Any CPU + {DEEB5200-BBF9-464D-9B7E-8FC035A27E94}.Release|x64.ActiveCfg = Release|Any CPU + {DEEB5200-BBF9-464D-9B7E-8FC035A27E94}.Release|x64.Build.0 = Release|Any CPU + {DEEB5200-BBF9-464D-9B7E-8FC035A27E94}.Release|x86.ActiveCfg = Release|Any CPU + {DEEB5200-BBF9-464D-9B7E-8FC035A27E94}.Release|x86.Build.0 = Release|Any CPU {40FB8907-9CF7-44D0-8B5F-538AC6DAF8B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {40FB8907-9CF7-44D0-8B5F-538AC6DAF8B9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {40FB8907-9CF7-44D0-8B5F-538AC6DAF8B9}.Debug|x64.ActiveCfg = Debug|Any CPU + {40FB8907-9CF7-44D0-8B5F-538AC6DAF8B9}.Debug|x64.Build.0 = Debug|Any CPU + {40FB8907-9CF7-44D0-8B5F-538AC6DAF8B9}.Debug|x86.ActiveCfg = Debug|Any CPU + {40FB8907-9CF7-44D0-8B5F-538AC6DAF8B9}.Debug|x86.Build.0 = Debug|Any CPU {40FB8907-9CF7-44D0-8B5F-538AC6DAF8B9}.Release|Any CPU.ActiveCfg = Release|Any CPU {40FB8907-9CF7-44D0-8B5F-538AC6DAF8B9}.Release|Any CPU.Build.0 = Release|Any CPU + {40FB8907-9CF7-44D0-8B5F-538AC6DAF8B9}.Release|x64.ActiveCfg = Release|Any CPU + {40FB8907-9CF7-44D0-8B5F-538AC6DAF8B9}.Release|x64.Build.0 = Release|Any CPU + {40FB8907-9CF7-44D0-8B5F-538AC6DAF8B9}.Release|x86.ActiveCfg = Release|Any CPU + {40FB8907-9CF7-44D0-8B5F-538AC6DAF8B9}.Release|x86.Build.0 = Release|Any CPU {E50739A7-5E2F-4EB5-AEA9-554115CB9613}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {E50739A7-5E2F-4EB5-AEA9-554115CB9613}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E50739A7-5E2F-4EB5-AEA9-554115CB9613}.Debug|x64.ActiveCfg = Debug|Any CPU + {E50739A7-5E2F-4EB5-AEA9-554115CB9613}.Debug|x64.Build.0 = Debug|Any CPU + {E50739A7-5E2F-4EB5-AEA9-554115CB9613}.Debug|x86.ActiveCfg = Debug|Any CPU + {E50739A7-5E2F-4EB5-AEA9-554115CB9613}.Debug|x86.Build.0 = Debug|Any CPU {E50739A7-5E2F-4EB5-AEA9-554115CB9613}.Release|Any CPU.ActiveCfg = Release|Any CPU {E50739A7-5E2F-4EB5-AEA9-554115CB9613}.Release|Any CPU.Build.0 = Release|Any CPU + {E50739A7-5E2F-4EB5-AEA9-554115CB9613}.Release|x64.ActiveCfg = Release|Any CPU + {E50739A7-5E2F-4EB5-AEA9-554115CB9613}.Release|x64.Build.0 = Release|Any CPU + {E50739A7-5E2F-4EB5-AEA9-554115CB9613}.Release|x86.ActiveCfg = Release|Any CPU + {E50739A7-5E2F-4EB5-AEA9-554115CB9613}.Release|x86.Build.0 = Release|Any CPU {BE7109C5-7368-4688-8557-4A15D3F4776A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BE7109C5-7368-4688-8557-4A15D3F4776A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BE7109C5-7368-4688-8557-4A15D3F4776A}.Debug|x64.ActiveCfg = Debug|Any CPU + {BE7109C5-7368-4688-8557-4A15D3F4776A}.Debug|x64.Build.0 = Debug|Any CPU + {BE7109C5-7368-4688-8557-4A15D3F4776A}.Debug|x86.ActiveCfg = Debug|Any CPU + {BE7109C5-7368-4688-8557-4A15D3F4776A}.Debug|x86.Build.0 = Debug|Any CPU {BE7109C5-7368-4688-8557-4A15D3F4776A}.Release|Any CPU.ActiveCfg = Release|Any CPU {BE7109C5-7368-4688-8557-4A15D3F4776A}.Release|Any CPU.Build.0 = Release|Any CPU + {BE7109C5-7368-4688-8557-4A15D3F4776A}.Release|x64.ActiveCfg = Release|Any CPU + {BE7109C5-7368-4688-8557-4A15D3F4776A}.Release|x64.Build.0 = Release|Any CPU + {BE7109C5-7368-4688-8557-4A15D3F4776A}.Release|x86.ActiveCfg = Release|Any CPU + {BE7109C5-7368-4688-8557-4A15D3F4776A}.Release|x86.Build.0 = Release|Any CPU {C753DDD6-5699-45F8-8669-08CE0BB816DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C753DDD6-5699-45F8-8669-08CE0BB816DE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C753DDD6-5699-45F8-8669-08CE0BB816DE}.Debug|x64.ActiveCfg = Debug|Any CPU + {C753DDD6-5699-45F8-8669-08CE0BB816DE}.Debug|x64.Build.0 = Debug|Any CPU + {C753DDD6-5699-45F8-8669-08CE0BB816DE}.Debug|x86.ActiveCfg = Debug|Any CPU + {C753DDD6-5699-45F8-8669-08CE0BB816DE}.Debug|x86.Build.0 = Debug|Any CPU {C753DDD6-5699-45F8-8669-08CE0BB816DE}.Release|Any CPU.ActiveCfg = Release|Any CPU {C753DDD6-5699-45F8-8669-08CE0BB816DE}.Release|Any CPU.Build.0 = Release|Any CPU + {C753DDD6-5699-45F8-8669-08CE0BB816DE}.Release|x64.ActiveCfg = Release|Any CPU + {C753DDD6-5699-45F8-8669-08CE0BB816DE}.Release|x64.Build.0 = Release|Any CPU + {C753DDD6-5699-45F8-8669-08CE0BB816DE}.Release|x86.ActiveCfg = Release|Any CPU + {C753DDD6-5699-45F8-8669-08CE0BB816DE}.Release|x86.Build.0 = Release|Any CPU {75AA8A90-B3F6-43DF-ADA7-0990DEF44E2C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {75AA8A90-B3F6-43DF-ADA7-0990DEF44E2C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75AA8A90-B3F6-43DF-ADA7-0990DEF44E2C}.Debug|x64.ActiveCfg = Debug|Any CPU + {75AA8A90-B3F6-43DF-ADA7-0990DEF44E2C}.Debug|x64.Build.0 = Debug|Any CPU + {75AA8A90-B3F6-43DF-ADA7-0990DEF44E2C}.Debug|x86.ActiveCfg = Debug|Any CPU + {75AA8A90-B3F6-43DF-ADA7-0990DEF44E2C}.Debug|x86.Build.0 = Debug|Any CPU {75AA8A90-B3F6-43DF-ADA7-0990DEF44E2C}.Release|Any CPU.ActiveCfg = Release|Any CPU {75AA8A90-B3F6-43DF-ADA7-0990DEF44E2C}.Release|Any CPU.Build.0 = Release|Any CPU + {75AA8A90-B3F6-43DF-ADA7-0990DEF44E2C}.Release|x64.ActiveCfg = Release|Any CPU + {75AA8A90-B3F6-43DF-ADA7-0990DEF44E2C}.Release|x64.Build.0 = Release|Any CPU + {75AA8A90-B3F6-43DF-ADA7-0990DEF44E2C}.Release|x86.ActiveCfg = Release|Any CPU + {75AA8A90-B3F6-43DF-ADA7-0990DEF44E2C}.Release|x86.Build.0 = Release|Any CPU {70720321-DED4-464F-B913-BDA5BBDD7982}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {70720321-DED4-464F-B913-BDA5BBDD7982}.Debug|Any CPU.Build.0 = Debug|Any CPU + {70720321-DED4-464F-B913-BDA5BBDD7982}.Debug|x64.ActiveCfg = Debug|Any CPU + {70720321-DED4-464F-B913-BDA5BBDD7982}.Debug|x64.Build.0 = Debug|Any CPU + {70720321-DED4-464F-B913-BDA5BBDD7982}.Debug|x86.ActiveCfg = Debug|Any CPU + {70720321-DED4-464F-B913-BDA5BBDD7982}.Debug|x86.Build.0 = Debug|Any CPU {70720321-DED4-464F-B913-BDA5BBDD7982}.Release|Any CPU.ActiveCfg = Release|Any CPU {70720321-DED4-464F-B913-BDA5BBDD7982}.Release|Any CPU.Build.0 = Release|Any CPU + {70720321-DED4-464F-B913-BDA5BBDD7982}.Release|x64.ActiveCfg = Release|Any CPU + {70720321-DED4-464F-B913-BDA5BBDD7982}.Release|x64.Build.0 = Release|Any CPU + {70720321-DED4-464F-B913-BDA5BBDD7982}.Release|x86.ActiveCfg = Release|Any CPU + {70720321-DED4-464F-B913-BDA5BBDD7982}.Release|x86.Build.0 = Release|Any CPU {1BBCBA72-CDB6-4882-96EE-D4CD149433A2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {1BBCBA72-CDB6-4882-96EE-D4CD149433A2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1BBCBA72-CDB6-4882-96EE-D4CD149433A2}.Debug|x64.ActiveCfg = Debug|Any CPU + {1BBCBA72-CDB6-4882-96EE-D4CD149433A2}.Debug|x64.Build.0 = Debug|Any CPU + {1BBCBA72-CDB6-4882-96EE-D4CD149433A2}.Debug|x86.ActiveCfg = Debug|Any CPU + {1BBCBA72-CDB6-4882-96EE-D4CD149433A2}.Debug|x86.Build.0 = Debug|Any CPU {1BBCBA72-CDB6-4882-96EE-D4CD149433A2}.Release|Any CPU.ActiveCfg = Release|Any CPU {1BBCBA72-CDB6-4882-96EE-D4CD149433A2}.Release|Any CPU.Build.0 = Release|Any CPU + {1BBCBA72-CDB6-4882-96EE-D4CD149433A2}.Release|x64.ActiveCfg = Release|Any CPU + {1BBCBA72-CDB6-4882-96EE-D4CD149433A2}.Release|x64.Build.0 = Release|Any CPU + {1BBCBA72-CDB6-4882-96EE-D4CD149433A2}.Release|x86.ActiveCfg = Release|Any CPU + {1BBCBA72-CDB6-4882-96EE-D4CD149433A2}.Release|x86.Build.0 = Release|Any CPU {BC4BB2D6-DFD8-4190-AAC3-32C0A7A8E915}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BC4BB2D6-DFD8-4190-AAC3-32C0A7A8E915}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BC4BB2D6-DFD8-4190-AAC3-32C0A7A8E915}.Debug|x64.ActiveCfg = Debug|Any CPU + {BC4BB2D6-DFD8-4190-AAC3-32C0A7A8E915}.Debug|x64.Build.0 = Debug|Any CPU + {BC4BB2D6-DFD8-4190-AAC3-32C0A7A8E915}.Debug|x86.ActiveCfg = Debug|Any CPU + {BC4BB2D6-DFD8-4190-AAC3-32C0A7A8E915}.Debug|x86.Build.0 = Debug|Any CPU {BC4BB2D6-DFD8-4190-AAC3-32C0A7A8E915}.Release|Any CPU.ActiveCfg = Release|Any CPU {BC4BB2D6-DFD8-4190-AAC3-32C0A7A8E915}.Release|Any CPU.Build.0 = Release|Any CPU + {BC4BB2D6-DFD8-4190-AAC3-32C0A7A8E915}.Release|x64.ActiveCfg = Release|Any CPU + {BC4BB2D6-DFD8-4190-AAC3-32C0A7A8E915}.Release|x64.Build.0 = Release|Any CPU + {BC4BB2D6-DFD8-4190-AAC3-32C0A7A8E915}.Release|x86.ActiveCfg = Release|Any CPU + {BC4BB2D6-DFD8-4190-AAC3-32C0A7A8E915}.Release|x86.Build.0 = Release|Any CPU {58FCF22D-E8DB-4EB8-B586-9BB6E9899D64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {58FCF22D-E8DB-4EB8-B586-9BB6E9899D64}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58FCF22D-E8DB-4EB8-B586-9BB6E9899D64}.Debug|x64.ActiveCfg = Debug|Any CPU + {58FCF22D-E8DB-4EB8-B586-9BB6E9899D64}.Debug|x64.Build.0 = Debug|Any CPU + {58FCF22D-E8DB-4EB8-B586-9BB6E9899D64}.Debug|x86.ActiveCfg = Debug|Any CPU + {58FCF22D-E8DB-4EB8-B586-9BB6E9899D64}.Debug|x86.Build.0 = Debug|Any CPU {58FCF22D-E8DB-4EB8-B586-9BB6E9899D64}.Release|Any CPU.ActiveCfg = Release|Any CPU {58FCF22D-E8DB-4EB8-B586-9BB6E9899D64}.Release|Any CPU.Build.0 = Release|Any CPU + {58FCF22D-E8DB-4EB8-B586-9BB6E9899D64}.Release|x64.ActiveCfg = Release|Any CPU + {58FCF22D-E8DB-4EB8-B586-9BB6E9899D64}.Release|x64.Build.0 = Release|Any CPU + {58FCF22D-E8DB-4EB8-B586-9BB6E9899D64}.Release|x86.ActiveCfg = Release|Any CPU + {58FCF22D-E8DB-4EB8-B586-9BB6E9899D64}.Release|x86.Build.0 = Release|Any CPU + {B297E998-8398-4134-A95B-5BBB4753870E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B297E998-8398-4134-A95B-5BBB4753870E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B297E998-8398-4134-A95B-5BBB4753870E}.Debug|x64.ActiveCfg = Debug|Any CPU + {B297E998-8398-4134-A95B-5BBB4753870E}.Debug|x64.Build.0 = Debug|Any CPU + {B297E998-8398-4134-A95B-5BBB4753870E}.Debug|x86.ActiveCfg = Debug|Any CPU + {B297E998-8398-4134-A95B-5BBB4753870E}.Debug|x86.Build.0 = Debug|Any CPU + {B297E998-8398-4134-A95B-5BBB4753870E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B297E998-8398-4134-A95B-5BBB4753870E}.Release|Any CPU.Build.0 = Release|Any CPU + {B297E998-8398-4134-A95B-5BBB4753870E}.Release|x64.ActiveCfg = Release|Any CPU + {B297E998-8398-4134-A95B-5BBB4753870E}.Release|x64.Build.0 = Release|Any CPU + {B297E998-8398-4134-A95B-5BBB4753870E}.Release|x86.ActiveCfg = Release|Any CPU + {B297E998-8398-4134-A95B-5BBB4753870E}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1712,6 +3666,7 @@ Global {1BBCBA72-CDB6-4882-96EE-D4CD149433A2} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} {BC4BB2D6-DFD8-4190-AAC3-32C0A7A8E915} = {447C8A77-E5F0-4538-8687-7383196D04EA} {58FCF22D-E8DB-4EB8-B586-9BB6E9899D64} = {447C8A77-E5F0-4538-8687-7383196D04EA} + {B297E998-8398-4134-A95B-5BBB4753870E} = {5DF0E140-0513-4D0D-BE2E-3D4D85CD70E6} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {BB97ECF4-9A84-433F-A80B-2A3285BDD1D5} From a26388e8739745e59ac80603520362021a2b9334 Mon Sep 17 00:00:00 2001 From: enisn Date: Wed, 25 Jun 2025 11:16:33 +0300 Subject: [PATCH 05/13] Add Embedding project to nupkg build list Included 'Volo.Abp.AspNetCore.Mvc.UI.Embedding' in the list of projects for packaging. This ensures the Embedding module is built and packaged with the rest of the framework. --- nupkg/common.ps1 | 1 + 1 file changed, 1 insertion(+) diff --git a/nupkg/common.ps1 b/nupkg/common.ps1 index e916a379d21..f0d3b860eca 100644 --- a/nupkg/common.ps1 +++ b/nupkg/common.ps1 @@ -125,6 +125,7 @@ $projects = ( "framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling.Abstractions", "framework/src/Volo.Abp.AspNetCore.Mvc.UI.Bundling", "framework/src/Volo.Abp.AspNetCore.Mvc.UI", + "framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding", "framework/src/Volo.Abp.AspNetCore.Mvc.UI.MultiTenancy", "framework/src/Volo.Abp.AspNetCore.Mvc.UI.Packages", "framework/src/Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared", From a32185768fd25fbe4259f1c47e918eaf6630ac3a Mon Sep 17 00:00:00 2001 From: enisn Date: Wed, 25 Jun 2025 14:43:22 +0300 Subject: [PATCH 06/13] Initial NPM package for abp-embedding component --- .../aspnetcore.mvc.ui.embedding/README.md | 391 ++++++++++++++++++ .../abp.resourcemapping.js | 5 + .../aspnetcore.mvc.ui.embedding/package.json | 35 ++ .../src/abp-embedding.css | 68 +++ .../src/abp-embedding.js | 374 +++++++++++++++++ 5 files changed, 873 insertions(+) create mode 100644 npm/packs/aspnetcore.mvc.ui.embedding/README.md create mode 100644 npm/packs/aspnetcore.mvc.ui.embedding/abp.resourcemapping.js create mode 100644 npm/packs/aspnetcore.mvc.ui.embedding/package.json create mode 100644 npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css create mode 100644 npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/README.md b/npm/packs/aspnetcore.mvc.ui.embedding/README.md new file mode 100644 index 00000000000..836be1baae4 --- /dev/null +++ b/npm/packs/aspnetcore.mvc.ui.embedding/README.md @@ -0,0 +1,391 @@ +# ABP Embedding Web Component + +A framework-agnostic web component for embedding iframe content with data passing capabilities. + +## Features + +- ✅ **Framework Agnostic**: Works with plain HTML, Vue, Angular, React, and any other framework +- ✅ **Data Passing**: Send data to iframe content using postMessage API +- ✅ **Event Handling**: Listen for iframe load and message events +- ✅ **URL Synchronization**: Keep parent and iframe URLs in sync with browser history support +- ✅ **Clean Styling**: No borders, outlines, or visual artifacts by default +- ✅ **Responsive**: Built-in responsive behavior options +- ✅ **TypeScript Ready**: Includes type definitions +- ✅ **Accessible**: Proper ARIA attributes and semantic HTML + +## Installation + +```bash +npm install @abp/aspnetcore.mvc.ui.embedding +``` + +## Usage + +### Basic HTML Usage + +```html + + + + + + + + + + + + + + + + + + +``` + +### JavaScript API + +```javascript +// Create programmatically +const embedding = abp.embedding.create({ + src: 'https://example.com', + width: '100%', + height: '500px', + urlSync: true // Enable URL synchronization +}); + +// Add to DOM +document.body.appendChild(embedding); + +// Send data to iframe +embedding.sendData({ + type: 'user-data', + payload: { userId: 123, name: 'John Doe' } +}); + +// Listen for iframe messages +embedding.addEventListener('iframe-message', (event) => { + console.log('Received from iframe:', event.detail.data); +}); + +// Listen for iframe load +embedding.addEventListener('iframe-loaded', (event) => { + console.log('Iframe loaded:', event.detail.iframe); +}); + +// Listen for URL synchronization +embedding.addEventListener('url-synced', (event) => { + console.log('URL synced:', event.detail); +}); + +// Navigate programmatically (if URL sync is enabled) +embedding.syncUrl('/dashboard'); +``` + +### Vue.js Usage + +```vue + + + +``` + +### Angular Usage + +```typescript +// app.component.ts +import { Component, ViewChild, ElementRef } from '@angular/core'; + +@Component({ + selector: 'app-root', + template: ` + + + ` +}) +export class AppComponent { + @ViewChild('embedding') embedding!: ElementRef; + + onIframeLoaded() { + this.embedding.nativeElement.sendData({ + type: 'angular-data', + timestamp: Date.now() + }); + } + + onIframeMessage(event: any) { + console.log('Received:', event.detail.data); + } +} +``` + +### React Usage + +```jsx +import { useRef, useEffect } from 'react'; + +function EmbeddingComponent() { + const embeddingRef = useRef(null); + + useEffect(() => { + const element = embeddingRef.current; + + const handleLoad = () => { + element.sendData({ type: 'react-init' }); + }; + + const handleMessage = (event) => { + console.log('Message:', event.detail.data); + }; + + element.addEventListener('iframe-loaded', handleLoad); + element.addEventListener('iframe-message', handleMessage); + + return () => { + element.removeEventListener('iframe-loaded', handleLoad); + element.removeEventListener('iframe-message', handleMessage); + }; + }, []); + + return ( + + ); +} +``` + +## URL Synchronization + +The web component supports URL synchronization between the parent page and iframe content. When enabled, the component will: + +- Keep parent and iframe URLs synchronized (paths only) +- Add `?embed=1` parameter to all iframe URLs +- Support browser back/forward navigation +- Work seamlessly with SPAs (Angular, React, Vue, etc.) + +### Example URL Mapping + +``` +Parent URL: https://parent.com/forms/2 +Iframe URL: https://iframe.com/forms/2?embed=1 +``` + +### Enable URL Sync + +```html + + +``` + +### Iframe Implementation for URL Sync + +Your iframe application needs to implement URL change notifications: + +```javascript +// Detect embedded mode +const isEmbedded = new URLSearchParams(window.location.search).has('embed'); + +// Your SPA router +function navigateToPath(path) { + // Update your SPA content + updateContent(path); + + // Notify parent if embedded + if (isEmbedded) { + window.parent.postMessage({ + type: 'url-change', + path: path + }, '*'); + } +} + +// Listen for navigation commands from parent +window.addEventListener('message', function(event) { + if (event.data && event.data.type === 'navigate') { + // Update URL without notifying parent (to avoid loop) + window.history.replaceState({}, '', event.data.path + '?embed=1'); + + // Navigate in your SPA + navigateToPath(event.data.path); + } +}); +``` + +### URL Sync Events + +```javascript +embedding.addEventListener('url-synced', (event) => { + const { type, oldPath, newPath, path, url } = event.detail; + + if (type === 'iframe-to-parent') { + console.log(`URL synced from iframe: ${oldPath} → ${newPath}`); + } else if (type === 'parent-to-iframe') { + console.log(`URL synced to iframe: ${path}`); + } +}); +``` + +## Receiving Data in Your Iframe Application + +Here's how to handle the data in your iframe content: + +```html + + + + Iframe Content + + +
+

Iframe Application

+
+ +
+ + + + +``` + +## Attributes + +| Attribute | Type | Default | Description | +|-----------|------|---------|-------------| +| `src` | string | - | URL to load in the iframe | +| `width` | string | `100%` | Width of the iframe | +| `height` | string | `100%` | Height of the iframe | +| `allow` | string | - | Feature policy for the iframe | +| `sandbox` | string | - | Sandbox restrictions for the iframe | +| `loading` | string | - | Loading behavior (`lazy`, `eager`) | +| `url-sync` | boolean | `false` | Enable URL synchronization with browser history | + +## Events + +| Event | Description | Detail | +|-------|-------------|--------| +| `iframe-loaded` | Fired when iframe finishes loading | `{ iframe: HTMLIFrameElement }` | +| `iframe-message` | Fired when iframe sends a message | `{ data: any, origin: string, source: Window }` | +| `url-synced` | Fired when URL synchronization occurs | `{ type: string, oldPath?: string, newPath?: string, path?: string, url?: string }` | + +## Methods + +| Method | Parameters | Description | +|--------|------------|-------------| +| `sendData(data, targetOrigin?)` | `data: any`, `targetOrigin: string = '*'` | Send data to iframe | +| `getIframe()` | - | Get the iframe element | +| `isLoaded()` | - | Check if iframe is loaded | +| `syncUrl(path)` | `path: string` | Navigate to path and sync URLs (requires `url-sync="true"`) | + +## CSS Custom Properties + +```css +abp-embedding { + --border-radius: 8px; + --box-shadow: 0 2px 8px rgba(0,0,0,0.1); + --background-color: #ffffff; +} +``` + +## Security Considerations + +- Always validate data received from iframes +- Use specific `targetOrigin` when sending sensitive data +- Consider using `sandbox` attribute for untrusted content +- Implement proper CORS policies on your iframe content + +## Browser Support + +- Chrome 54+ +- Firefox 63+ +- Safari 10.1+ +- Edge 79+ + +## License + +LGPL-3.0 \ No newline at end of file diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/abp.resourcemapping.js b/npm/packs/aspnetcore.mvc.ui.embedding/abp.resourcemapping.js new file mode 100644 index 00000000000..3c7c855dab2 --- /dev/null +++ b/npm/packs/aspnetcore.mvc.ui.embedding/abp.resourcemapping.js @@ -0,0 +1,5 @@ +module.exports = { + mappings: { + "@node_modules/@abp/aspnetcore.mvc.ui.embedding/src/*.*": "@libs/abp/embedding/" + } +} \ No newline at end of file diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/package.json b/npm/packs/aspnetcore.mvc.ui.embedding/package.json new file mode 100644 index 00000000000..4e2018cdab9 --- /dev/null +++ b/npm/packs/aspnetcore.mvc.ui.embedding/package.json @@ -0,0 +1,35 @@ +{ + "version": "9.3.0-rc.1", + "name": "@abp/aspnetcore.mvc.ui.embedding", + "repository": { + "type": "git", + "url": "https://github.com/abpframework/abp.git", + "directory": "npm/packs/aspnetcore.mvc.ui.embedding" + }, + "publishConfig": { + "access": "public" + }, + "dependencies": { + "@abp/core": "~9.3.0-rc.1", + "@abp/utils": "~9.3.0-rc.1" + }, + "gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431", + "homepage": "https://abp.io", + "license": "LGPL-3.0", + "keywords": [ + "aspnetcore", + "boilerplate", + "framework", + "web", + "best-practices", + "angular", + "maui", + "blazor", + "mvc", + "csharp", + "webapp", + "embedding", + "iframe", + "web-component" + ] +} \ No newline at end of file diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css new file mode 100644 index 00000000000..3fbed67fb04 --- /dev/null +++ b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css @@ -0,0 +1,68 @@ +/* ABP Embedding Component Styles */ + +abp-embedding { + display: block; + position: relative; + width: 100%; + height: 400px; /* Default height */ + overflow: hidden; +} + +abp-embedding iframe { + border: none !important; + outline: none !important; + margin: 0 !important; + padding: 0 !important; + background: transparent; + display: block; + box-shadow: none !important; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +/* Responsive behavior */ +abp-embedding.responsive { + aspect-ratio: 16 / 9; + height: auto; +} + +abp-embedding.responsive iframe { + width: 100%; + height: 100%; +} + +/* Loading state */ +abp-embedding[loading]::before { + content: 'Loading...'; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: #666; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + font-size: 14px; + z-index: 1; +} + +abp-embedding[loading] iframe { + opacity: 0; + transition: opacity 0.3s ease; +} + +abp-embedding.loaded iframe { + opacity: 1; +} + +/* Custom styling variables for easy theming */ +abp-embedding { + --border-radius: 0; + --box-shadow: none; + --background-color: transparent; +} + +abp-embedding iframe { + border-radius: var(--border-radius); + box-shadow: var(--box-shadow); + background-color: var(--background-color); +} \ No newline at end of file diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js new file mode 100644 index 00000000000..0afa876bba7 --- /dev/null +++ b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js @@ -0,0 +1,374 @@ +(function() { + 'use strict'; + + // Extend abp namespace if it exists + var abp = window.abp || {}; + if (!window.abp) { + window.abp = abp; + } + + abp.embedding = abp.embedding || {}; + + /** + * ABP Embedding Web Component + * Renders an iframe with data passing capabilities + */ + class AbpEmbeddingElement extends HTMLElement { + constructor() { + super(); + this.iframe = null; + this.dataQueue = []; + this.isIframeLoaded = false; + this.urlSyncEnabled = false; + this.baseIframeUrl = ''; + this.isNavigatingFromParent = false; + + // Bind methods + this.handleIframeLoad = this.handleIframeLoad.bind(this); + this.handleIframeMessage = this.handleIframeMessage.bind(this); + this.handlePopState = this.handlePopState.bind(this); + } + + static get observedAttributes() { + return ['src', 'width', 'height', 'allow', 'sandbox', 'loading', 'url-sync']; + } + + connectedCallback() { + this.render(); + this.setupEventListeners(); + this.initializeUrlSync(); + } + + disconnectedCallback() { + this.cleanup(); + } + + attributeChangedCallback(name, oldValue, newValue) { + if (oldValue !== newValue) { + this.updateIframeAttribute(name, newValue); + } + } + + render() { + // Clear existing content + this.innerHTML = ''; + + // Create iframe element + this.iframe = document.createElement('iframe'); + + // Set default attributes + this.iframe.setAttribute('frameborder', '0'); + this.iframe.setAttribute('scrolling', 'auto'); + this.iframe.style.border = 'none'; + this.iframe.style.outline = 'none'; + this.iframe.style.display = 'block'; + this.iframe.style.width = '100%'; + this.iframe.style.height = '100%'; + + // Apply custom attributes + this.updateAllAttributes(); + + // Add load event listener + this.iframe.addEventListener('load', this.handleIframeLoad); + + this.appendChild(this.iframe); + } + + updateAllAttributes() { + const attributes = ['src', 'width', 'height', 'allow', 'sandbox', 'loading']; + attributes.forEach(attr => { + const value = this.getAttribute(attr); + if (value) { + this.updateIframeAttribute(attr, value); + } + }); + } + + updateIframeAttribute(name, value) { + if (!this.iframe) return; + + switch (name) { + case 'src': + this.baseIframeUrl = this.extractBaseUrl(value); + this.iframe.src = value; + this.isIframeLoaded = false; + break; + case 'width': + this.iframe.style.width = value.includes('%') || value.includes('px') ? value : value + 'px'; + break; + case 'height': + this.iframe.style.height = value.includes('%') || value.includes('px') ? value : value + 'px'; + break; + case 'url-sync': + this.urlSyncEnabled = value === 'true' || value === ''; + if (this.urlSyncEnabled) { + this.initializeUrlSync(); + } + break; + default: + this.iframe.setAttribute(name, value); + } + } + + setupEventListeners() { + // Listen for messages from iframe + window.addEventListener('message', this.handleIframeMessage); + } + + cleanup() { + window.removeEventListener('message', this.handleIframeMessage); + window.removeEventListener('popstate', this.handlePopState); + if (this.iframe) { + this.iframe.removeEventListener('load', this.handleIframeLoad); + } + } + + handleIframeLoad() { + this.isIframeLoaded = true; + + // Send any queued data + if (this.dataQueue.length > 0) { + this.dataQueue.forEach(data => this.sendDataToIframe(data)); + this.dataQueue = []; + } + + // Initialize URL sync if enabled + if (this.urlSyncEnabled) { + this.syncInitialUrl(); + } + + // Dispatch custom event + this.dispatchEvent(new CustomEvent('iframe-loaded', { + detail: { iframe: this.iframe }, + bubbles: true + })); + } + + handleIframeMessage(event) { + // Verify the message is from our iframe + if (this.iframe && event.source === this.iframe.contentWindow) { + // Handle URL sync messages + if (this.urlSyncEnabled && event.data && event.data.type === 'url-change') { + this.handleIframeUrlChange(event.data.path); + return; + } + + // Dispatch custom event with the received data + this.dispatchEvent(new CustomEvent('iframe-message', { + detail: { + data: event.data, + origin: event.origin, + source: event.source + }, + bubbles: true + })); + } + } + + /** + * Send data to the iframe content + * @param {*} data - Data to send + * @param {string} targetOrigin - Target origin (default: '*') + */ + sendData(data, targetOrigin = '*') { + if (this.isIframeLoaded && this.iframe) { + this.sendDataToIframe({ data, targetOrigin }); + } else { + // Queue the data until iframe is loaded + this.dataQueue.push({ data, targetOrigin }); + } + } + + sendDataToIframe({ data, targetOrigin }) { + try { + this.iframe.contentWindow.postMessage(data, targetOrigin); + } catch (error) { + console.error('Failed to send data to iframe:', error); + } + } + + /** + * Get the iframe element + * @returns {HTMLIFrameElement} + */ + getIframe() { + return this.iframe; + } + + /** + * Check if iframe is loaded + * @returns {boolean} + */ + isLoaded() { + return this.isIframeLoaded; + } + + /** + * Initialize URL synchronization + */ + initializeUrlSync() { + if (!this.urlSyncEnabled) { + this.urlSyncEnabled = this.hasAttribute('url-sync'); + } + + if (this.urlSyncEnabled) { + window.addEventListener('popstate', this.handlePopState); + + // Sync initial URL if needed + if (this.isIframeLoaded) { + this.syncInitialUrl(); + } + } + } + + /** + * Extract base URL from iframe src + * @param {string} url + * @returns {string} + */ + extractBaseUrl(url) { + try { + const urlObj = new URL(url); + return `${urlObj.protocol}//${urlObj.host}`; + } catch (error) { + console.warn('Invalid iframe URL:', url); + return ''; + } + } + + /** + * Handle URL change from iframe + * @param {string} path + */ + handleIframeUrlChange(path) { + if (this.isNavigatingFromParent) { + this.isNavigatingFromParent = false; + return; + } + + // Update parent URL to match iframe path + const currentPath = window.location.pathname; + const newPath = path.startsWith('/') ? path : '/' + path; + + if (currentPath !== newPath) { + window.history.pushState({ iframePath: newPath }, '', newPath); + + // Dispatch custom event + this.dispatchEvent(new CustomEvent('url-synced', { + detail: { + type: 'iframe-to-parent', + oldPath: currentPath, + newPath: newPath + }, + bubbles: true + })); + } + } + + /** + * Handle browser back/forward button + * @param {PopStateEvent} event + */ + handlePopState(event) { + if (!this.urlSyncEnabled || !this.isIframeLoaded) { + return; + } + + const currentPath = window.location.pathname; + this.navigateIframeToPath(currentPath); + } + + /** + * Navigate iframe to specific path + * @param {string} path + */ + navigateIframeToPath(path) { + if (!this.baseIframeUrl || !this.iframe) { + return; + } + + this.isNavigatingFromParent = true; + + // Construct iframe URL with embed parameter + const iframePath = path.startsWith('/') ? path : '/' + path; + const iframeUrl = `${this.baseIframeUrl}${iframePath}?embed=1`; + + // Send navigation command to iframe + this.iframe.contentWindow.postMessage({ + type: 'navigate', + path: iframePath, + url: iframeUrl + }, '*'); + + // Dispatch custom event + this.dispatchEvent(new CustomEvent('url-synced', { + detail: { + type: 'parent-to-iframe', + path: iframePath, + url: iframeUrl + }, + bubbles: true + })); + } + + /** + * Sync initial URL when iframe loads + */ + syncInitialUrl() { + const currentPath = window.location.pathname; + + // If we have a specific path in the URL, navigate iframe to it + if (currentPath && currentPath !== '/') { + setTimeout(() => { + this.navigateIframeToPath(currentPath); + }, 100); // Small delay to ensure iframe is ready + } + } + + /** + * Manually sync URL (useful for programmatic navigation) + * @param {string} path + */ + syncUrl(path) { + if (this.urlSyncEnabled) { + this.navigateIframeToPath(path); + + // Update parent URL + const newPath = path.startsWith('/') ? path : '/' + path; + window.history.pushState({ iframePath: newPath }, '', newPath); + } + } + } + + // Register the custom element + if (!customElements.get('abp-embedding')) { + customElements.define('abp-embedding', AbpEmbeddingElement); + } + + // Add utility functions to abp.embedding namespace + abp.embedding.create = function(options) { + const element = document.createElement('abp-embedding'); + + if (options.src) element.setAttribute('src', options.src); + if (options.width) element.setAttribute('width', options.width); + if (options.height) element.setAttribute('height', options.height); + if (options.allow) element.setAttribute('allow', options.allow); + if (options.sandbox) element.setAttribute('sandbox', options.sandbox); + if (options.loading) element.setAttribute('loading', options.loading); + if (options.urlSync) element.setAttribute('url-sync', options.urlSync); + + return element; + }; + + abp.embedding.sendData = function(element, data, targetOrigin) { + if (element && typeof element.sendData === 'function') { + element.sendData(data, targetOrigin); + } + }; + + // Log that the component is loaded + if (abp.log && abp.log.debug) { + abp.log.debug('ABP Embedding Web Component loaded'); + } + +})(); \ No newline at end of file From 9060ae8e562f54bf9ec99965179543f779b4940a Mon Sep 17 00:00:00 2001 From: enisn Date: Wed, 25 Jun 2025 16:41:41 +0300 Subject: [PATCH 07/13] Enhance iframe styling in abp-embedding CSS Updated the CSS for the abp-embedding component to improve iframe presentation. Added important flags to various properties to ensure consistent rendering across browsers, including border, outline, background, and shadow styles. This change aims to enhance the visual integration of embedded content. --- .../src/abp-embedding.css | 28 ++++++++++++++----- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css index 3fbed67fb04..731f24aca9a 100644 --- a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css +++ b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css @@ -10,15 +10,29 @@ abp-embedding { abp-embedding iframe { border: none !important; + border-width: 0 !important; + border-style: none !important; + border-color: transparent !important; outline: none !important; + outline-width: 0 !important; + outline-style: none !important; margin: 0 !important; padding: 0 !important; - background: transparent; + background: transparent !important; + background-color: transparent !important; display: block; box-shadow: none !important; - -webkit-appearance: none; - -moz-appearance: none; - appearance: none; + -webkit-box-shadow: none !important; + -moz-box-shadow: none !important; + filter: none !important; + -webkit-filter: none !important; + -moz-filter: none !important; + -webkit-appearance: none !important; + -moz-appearance: none !important; + appearance: none !important; + text-shadow: none !important; + -webkit-text-shadow: none !important; + -moz-text-shadow: none !important; } /* Responsive behavior */ @@ -62,7 +76,7 @@ abp-embedding { } abp-embedding iframe { - border-radius: var(--border-radius); - box-shadow: var(--box-shadow); - background-color: var(--background-color); + border-radius: var(--border-radius) !important; + box-shadow: var(--box-shadow) !important; + background-color: var(--background-color) !important; } \ No newline at end of file From 9d7fec96c0fc99a3cfa04adddff9bbfa05ef2780 Mon Sep 17 00:00:00 2001 From: enisn Date: Thu, 26 Jun 2025 09:44:21 +0300 Subject: [PATCH 08/13] Add auto-height feature to embedding component Introduces an auto-height capability to the aspnetcore.mvc.ui.embedding web component, allowing iframes to automatically resize to fit their content. Adds supporting documentation, example demos, a new iframe-side script for height measurement and communication, and updates CSS and JS to support configuration, events, and programmatic control of auto-height. --- .../aspnetcore.mvc.ui.embedding/README.md | 100 ++++ .../examples/auto-height-demo.html | 202 ++++++++ .../examples/basic-usage.html | 152 ++++++ .../src/abp-embedding-iframe.js | 473 ++++++++++++++++++ .../src/abp-embedding.css | 23 + .../src/abp-embedding.js | 205 ++++++++ 6 files changed, 1155 insertions(+) create mode 100644 npm/packs/aspnetcore.mvc.ui.embedding/examples/auto-height-demo.html create mode 100644 npm/packs/aspnetcore.mvc.ui.embedding/examples/basic-usage.html create mode 100644 npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding-iframe.js diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/README.md b/npm/packs/aspnetcore.mvc.ui.embedding/README.md index 836be1baae4..044c8e25cbc 100644 --- a/npm/packs/aspnetcore.mvc.ui.embedding/README.md +++ b/npm/packs/aspnetcore.mvc.ui.embedding/README.md @@ -5,6 +5,7 @@ A framework-agnostic web component for embedding iframe content with data passin ## Features - ✅ **Framework Agnostic**: Works with plain HTML, Vue, Angular, React, and any other framework +- ✅ **Auto-Height**: Automatically resize iframe to match content height - ✅ **Data Passing**: Send data to iframe content using postMessage API - ✅ **Event Handling**: Listen for iframe load and message events - ✅ **URL Synchronization**: Keep parent and iframe URLs in sync with browser history support @@ -39,6 +40,9 @@ npm install @abp/aspnetcore.mvc.ui.embedding + + + @@ -81,6 +85,18 @@ embedding.addEventListener('url-synced', (event) => { // Navigate programmatically (if URL sync is enabled) embedding.syncUrl('/dashboard'); + +// Enable auto-height +abp.embedding.enableAutoHeight(embedding, { + minHeight: 200, + maxHeight: 1000, + watchForChanges: true +}); + +// Listen for height updates +embedding.addEventListener('height-updated', (event) => { + console.log('Height updated:', event.detail); +}); ``` ### Vue.js Usage @@ -194,6 +210,85 @@ function EmbeddingComponent() { } ``` +## Auto-Height Feature + +The auto-height feature automatically adjusts the iframe height to match its content, preventing double scrollbars and providing a seamless user experience. + +### Basic Usage + +```html + + +``` + +### Programmatic Usage + +```javascript +// Enable auto-height with options +const embedding = document.querySelector('abp-embedding'); +abp.embedding.enableAutoHeight(embedding, { + minHeight: 100, // Minimum height in pixels + maxHeight: 1000, // Maximum height in pixels + watchForChanges: true // Monitor content changes +}); + +// Disable auto-height +abp.embedding.disableAutoHeight(embedding); + +// Manually request height update +embedding.requestHeightUpdate(); +``` + +### Iframe Content Setup + +Include this script in your iframe content to enable height communication: + +```html + + + + Your Iframe Content + + + + + + + +``` + +The iframe script automatically: +- Waits for page to fully load (including images) +- Measures content height using multiple methods +- Sends height updates to parent via postMessage +- Monitors for content changes (if enabled) +- Handles configuration from parent + +### Auto-Height Events + +```javascript +// Listen for height updates +embedding.addEventListener('height-updated', (event) => { + const { originalHeight, appliedHeight, wasConstrained } = event.detail; + console.log(`Height: ${originalHeight}px → ${appliedHeight}px`); + + if (wasConstrained) { + console.log('Height was constrained by min/max limits'); + } +}); +``` + +### Configuration Options + +```javascript +{ + minHeight: 100, // Minimum iframe height (default: 100) + maxHeight: 10000, // Maximum iframe height (default: 90% of viewport) + watchForChanges: true, // Monitor DOM changes (default: true) + debounceDelay: 250 // Debounce delay for change detection (default: 250ms) +} +``` + ## URL Synchronization The web component supports URL synchronization between the parent page and iframe content. When enabled, the component will: @@ -344,6 +439,7 @@ Here's how to handle the data in your iframe content: | `sandbox` | string | - | Sandbox restrictions for the iframe | | `loading` | string | - | Loading behavior (`lazy`, `eager`) | | `url-sync` | boolean | `false` | Enable URL synchronization with browser history | +| `auto-height` | boolean | `false` | Enable automatic height adjustment to content | ## Events @@ -352,6 +448,7 @@ Here's how to handle the data in your iframe content: | `iframe-loaded` | Fired when iframe finishes loading | `{ iframe: HTMLIFrameElement }` | | `iframe-message` | Fired when iframe sends a message | `{ data: any, origin: string, source: Window }` | | `url-synced` | Fired when URL synchronization occurs | `{ type: string, oldPath?: string, newPath?: string, path?: string, url?: string }` | +| `height-updated` | Fired when iframe height is updated | `{ originalHeight: number, appliedHeight: number, wasConstrained: boolean }` | ## Methods @@ -361,6 +458,9 @@ Here's how to handle the data in your iframe content: | `getIframe()` | - | Get the iframe element | | `isLoaded()` | - | Check if iframe is loaded | | `syncUrl(path)` | `path: string` | Navigate to path and sync URLs (requires `url-sync="true"`) | +| `enableAutoHeight(options?)` | `options: object` | Enable auto-height with configuration | +| `disableAutoHeight()` | - | Disable auto-height functionality | +| `requestHeightUpdate()` | - | Manually request height update from iframe | ## CSS Custom Properties diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/examples/auto-height-demo.html b/npm/packs/aspnetcore.mvc.ui.embedding/examples/auto-height-demo.html new file mode 100644 index 00000000000..a76c3e9026c --- /dev/null +++ b/npm/packs/aspnetcore.mvc.ui.embedding/examples/auto-height-demo.html @@ -0,0 +1,202 @@ + + + + + + ABP Embedding Auto-Height Demo + + + + +

ABP Embedding Auto-Height Demo

+ +
+

Basic Auto-Height Example

+

This iframe will automatically resize to match its content height:

+ + + + +
Status: Loading...
+ + + + +
+ +
+

Programmatic Example

+

This example shows how to enable auto-height programmatically with custom options:

+ + + + +
Status: Auto-height disabled
+ + + + +
+ +
+

Event Monitoring

+

Monitor events from the embedding component:

+ +
Events will appear here...
+ +
+ + + + + \ No newline at end of file diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/examples/basic-usage.html b/npm/packs/aspnetcore.mvc.ui.embedding/examples/basic-usage.html new file mode 100644 index 00000000000..ba1a050908f --- /dev/null +++ b/npm/packs/aspnetcore.mvc.ui.embedding/examples/basic-usage.html @@ -0,0 +1,152 @@ + + + + + + ABP Embedding - Basic Usage + + + + +

ABP Embedding Web Component - Basic Usage

+ +
+

Example 1: Basic Iframe Embedding

+

This example shows a basic iframe embedding with data communication.

+ +
+ + + +
+ +
+ + +
+ +
+
+ + + + + \ No newline at end of file diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding-iframe.js b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding-iframe.js new file mode 100644 index 00000000000..342f84e6d31 --- /dev/null +++ b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding-iframe.js @@ -0,0 +1,473 @@ +(function() { + 'use strict'; + + // Check if we're in an iframe + if (window.self === window.top) { + return; // Not in iframe, exit + } + + /** + * ABP Embedding Iframe Content Script + * Handles height measurement and communication with parent + */ + class AbpEmbeddingIframeHandler { + constructor() { + this.config = { + minHeight: 100, + maxHeight: 10000, + watchForChanges: true, + debounceDelay: 250 + }; + this.isEnabled = false; + this.observer = null; + this.debounceTimer = null; + this.lastReportedHeight = 0; + + // Bind methods + this.handleMessage = this.handleMessage.bind(this); + this.measureHeight = this.measureHeight.bind(this); + this.reportHeight = this.reportHeight.bind(this); + this.debouncedReportHeight = this.debouncedReportHeight.bind(this); + } + + init() { + // Listen for messages from parent + window.addEventListener('message', this.handleMessage); + + // If we're in an iframe, proactively enable with defaults + // This helps with race conditions where parent hasn't sent config yet + if (window.self !== window.top) { + setTimeout(() => { + if (!this.isEnabled) { + console.debug('ABP Iframe: Proactively enabling auto-height (iframe detected)'); + this.configure({}); + this.enable(); + } + }, 50); + } + + // Wait for DOM to be ready + if (document.readyState === 'loading') { + document.addEventListener('DOMContentLoaded', () => { + this.onDomReady(); + }); + } else { + this.onDomReady(); + } + } + + onDomReady() { + // Wait for all content to load (including images) + if (document.readyState === 'complete') { + this.onPageFullyLoaded(); + } else { + window.addEventListener('load', () => { + this.onPageFullyLoaded(); + }); + } + } + + onPageFullyLoaded() { + // Wait for layout to complete with multiple strategies + this.waitForLayoutCompletion().then(() => { + // Send ready signal to parent first + this.sendReadySignal(); + + // Then report height + this.reportHeight(); + + // Also set up a retry mechanism in case the first measurement was off + setTimeout(() => { + this.retryInitialHeight(); + }, 1000); + }); + } + + sendReadySignal() { + // Tell parent that iframe is ready and can handle auto-height + if (window.parent && window.parent !== window) { + window.parent.postMessage({ + type: 'iframe-ready-for-auto-height', + timestamp: Date.now(), + initialHeight: this.measureHeight() + }, '*'); + } + } + + async waitForLayoutCompletion() { + // Strategy 1: Wait for any pending images + await this.waitForImages(); + + // Strategy 2: Use requestAnimationFrame to ensure rendering is complete + await new Promise(resolve => { + requestAnimationFrame(() => { + requestAnimationFrame(() => { + resolve(); + }); + }); + }); + + // Strategy 3: Small delay to ensure CSS transitions/animations are done + await new Promise(resolve => setTimeout(resolve, 250)); + + // Strategy 4: Wait for fonts to load if supported + if (document.fonts && document.fonts.ready) { + try { + await document.fonts.ready; + } catch (error) { + // Font loading API not supported, continue + } + } + } + + async waitForImages() { + const images = document.querySelectorAll('img'); + const imagePromises = Array.from(images).map(img => { + if (img.complete) { + return Promise.resolve(); + } + + return new Promise(resolve => { + const timeout = setTimeout(() => { + resolve(); // Don't wait forever for broken images + }, 3000); + + img.addEventListener('load', () => { + clearTimeout(timeout); + resolve(); + }); + + img.addEventListener('error', () => { + clearTimeout(timeout); + resolve(); + }); + }); + }); + + await Promise.all(imagePromises); + } + + retryInitialHeight() { + if (!this.isEnabled) { + return; + } + + const currentHeight = this.measureHeight(); + + // If the height seems too small, it might have been measured too early + if (currentHeight < 200 && this.lastReportedHeight > 0) { + const heightDifference = Math.abs(currentHeight - this.lastReportedHeight); + + // If there's a significant difference, report the new height + if (heightDifference > 50) { + console.debug('ABP Iframe: Retrying height measurement due to significant change'); + this.reportHeight(); + } + } + } + + handleMessage(event) { + if (!event.data || typeof event.data !== 'object') { + return; + } + + switch (event.data.type) { + case 'auto-height-config': + this.configure(event.data.config); + this.enable(); + break; + case 'auto-height-disable': + this.disable(); + break; + case 'request-height-update': + this.reportHeight(); + break; + } + } + + configure(config) { + this.config = { ...this.config, ...config }; + } + + enable() { + if (this.isEnabled) { + return; + } + + this.isEnabled = true; + + // Set up change monitoring if enabled + if (this.config.watchForChanges) { + this.setupChangeMonitoring(); + } + + // Send ready signal and report initial height + this.sendReadySignal(); + + // Use a small delay to ensure parent receives ready signal first + setTimeout(() => { + this.reportHeight(); + }, 50); + } + + disable() { + this.isEnabled = false; + + // Clean up observers + if (this.observer) { + this.observer.disconnect(); + this.observer = null; + } + + // Clear debounce timer + if (this.debounceTimer) { + clearTimeout(this.debounceTimer); + this.debounceTimer = null; + } + } + + setupChangeMonitoring() { + // Use ResizeObserver if available (modern browsers) + if (window.ResizeObserver) { + this.observer = new ResizeObserver(() => { + this.debouncedReportHeight(); + }); + this.observer.observe(document.body); + } else { + // Fallback: Use MutationObserver for older browsers + this.observer = new MutationObserver(() => { + this.debouncedReportHeight(); + }); + + this.observer.observe(document.body, { + childList: true, + subtree: true, + attributes: true, + attributeFilter: ['style', 'class'] + }); + } + + // Also monitor window resize + window.addEventListener('resize', this.debouncedReportHeight); + } + + measureHeight() { + // Force layout recalculation + document.body.offsetHeight; + + // Fix common CSS issues that interfere with height measurement + this.fixCSSIssues(); + + // Try multiple methods to get the most accurate height + const methods = [ + () => { + // Method 1: Body scroll height (most reliable for content) + return Math.max(document.body.scrollHeight, document.body.offsetHeight); + }, + () => { + // Method 2: Document element height + return Math.max(document.documentElement.scrollHeight, document.documentElement.offsetHeight); + }, + () => { + // Method 3: Bounding rect of body + const bodyRect = document.body.getBoundingClientRect(); + return bodyRect.height + window.pageYOffset; + }, + () => { + // Method 4: Walk through all visible elements + const elements = document.querySelectorAll('body *'); + let maxBottom = 0; + + for (const element of elements) { + const style = window.getComputedStyle(element); + if (style.display === 'none' || style.visibility === 'hidden') { + continue; + } + + const rect = element.getBoundingClientRect(); + const bottom = rect.bottom + window.pageYOffset; + if (bottom > maxBottom) { + maxBottom = bottom; + } + } + + // Add body margins/padding + const bodyStyle = window.getComputedStyle(document.body); + const bodyMarginBottom = parseFloat(bodyStyle.marginBottom) || 0; + const bodyPaddingBottom = parseFloat(bodyStyle.paddingBottom) || 0; + + return maxBottom + bodyMarginBottom + bodyPaddingBottom; + }, + () => { + // Method 5: Custom height calculation including margins + const body = document.body; + const html = document.documentElement; + + const height = Math.max( + body.scrollHeight, + body.offsetHeight, + html.clientHeight, + html.scrollHeight, + html.offsetHeight + ); + + return height; + } + ]; + + let maxHeight = 0; + const heights = []; + + for (const method of methods) { + try { + const height = method(); + if (height && height > 0) { + heights.push(height); + if (height > maxHeight) { + maxHeight = height; + } + } + } catch (error) { + console.warn('Height measurement method failed:', error); + } + } + + // If we got very different heights, log them for debugging + if (heights.length > 1) { + const min = Math.min(...heights); + const max = Math.max(...heights); + if (max - min > 100) { + console.debug('Height measurement variance:', heights); + } + } + + // Fallback if no height was measured + if (maxHeight === 0) { + maxHeight = window.innerHeight || 400; + console.warn('Could not measure content height, using fallback:', maxHeight); + } + + // Add padding to ensure no content is cut off + maxHeight += 20; + + // Ensure height is within configured bounds + return Math.max( + this.config.minHeight, + Math.min(maxHeight, this.config.maxHeight) + ); + } + + fixCSSIssues() { + // Common CSS fixes that interfere with height measurement + const html = document.documentElement; + const body = document.body; + + // Store original styles to avoid overriding intentional styles + if (!this.originalStyles) { + this.originalStyles = { + htmlHeight: html.style.height, + bodyHeight: body.style.height, + htmlOverflow: html.style.overflow, + bodyOverflow: body.style.overflow + }; + } + + // Temporarily fix height issues for measurement + const htmlStyle = window.getComputedStyle(html); + const bodyStyle = window.getComputedStyle(body); + + // If html/body have 100% height, it can interfere with scrollHeight + if (htmlStyle.height === '100%' || htmlStyle.height === '100vh') { + html.style.height = 'auto'; + } + if (bodyStyle.height === '100%' || bodyStyle.height === '100vh') { + body.style.height = 'auto'; + } + + // Ensure overflow is visible for accurate measurement + if (htmlStyle.overflow === 'hidden') { + html.style.overflow = 'visible'; + } + if (bodyStyle.overflow === 'hidden') { + body.style.overflow = 'visible'; + } + + // Force layout recalculation + body.offsetHeight; + + // Restore styles after a brief moment (after measurement) + setTimeout(() => { + if (this.originalStyles) { + if (this.originalStyles.htmlHeight) html.style.height = this.originalStyles.htmlHeight; + if (this.originalStyles.bodyHeight) body.style.height = this.originalStyles.bodyHeight; + if (this.originalStyles.htmlOverflow) html.style.overflow = this.originalStyles.htmlOverflow; + if (this.originalStyles.bodyOverflow) body.style.overflow = this.originalStyles.bodyOverflow; + } + }, 10); + } + + reportHeight() { + if (!this.isEnabled) { + return; + } + + const height = this.measureHeight(); + + // Only report if height has changed significantly (avoid unnecessary updates) + // But be more lenient for the first measurement + const threshold = this.lastReportedHeight === 0 ? 1 : 5; + if (Math.abs(height - this.lastReportedHeight) < threshold) { + return; + } + + console.debug('ABP Iframe: Reporting height:', height, '(previous:', this.lastReportedHeight, ')'); + + this.lastReportedHeight = height; + + // Send height to parent + window.parent.postMessage({ + type: 'height-update', + height: height, + timestamp: Date.now(), + isInitial: this.lastReportedHeight === height // Flag if this is the first measurement + }, '*'); + } + + debouncedReportHeight() { + if (this.debounceTimer) { + clearTimeout(this.debounceTimer); + } + + this.debounceTimer = setTimeout(() => { + this.reportHeight(); + this.debounceTimer = null; + }, this.config.debounceDelay); + } + } + + // Create and initialize the handler + const handler = new AbpEmbeddingIframeHandler(); + handler.init(); + + // Expose handler globally for debugging + window.abpEmbeddingIframeHandler = handler; + + // Auto-enable if embed parameter is present in URL + const urlParams = new URLSearchParams(window.location.search); + if (urlParams.get('embed') === '1') { + // Enable with default config + handler.configure({}); + handler.enable(); + } + + // Also try to auto-detect if we're in an iframe and enable automatically + // This helps with cases where the embed parameter isn't set but auto-height is expected + setTimeout(() => { + if (window.self !== window.top && !handler.isEnabled) { + console.debug('ABP Iframe: Auto-enabling iframe handler (detected iframe context)'); + handler.configure({}); + handler.enable(); + } + }, 100); + +})(); \ No newline at end of file diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css index 731f24aca9a..ad9ca160e92 100644 --- a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css +++ b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css @@ -79,4 +79,27 @@ abp-embedding iframe { border-radius: var(--border-radius) !important; box-shadow: var(--box-shadow) !important; background-color: var(--background-color) !important; +} + +/* Auto-height specific styles */ +abp-embedding[auto-height] { + height: auto !important; + min-height: 100px; + transition: height 0.3s ease; +} + +abp-embedding[auto-height] iframe { + transition: height 0.3s ease; + min-height: 100px !important; + height: auto !important; +} + +/* Prevent height jumping during initial load */ +abp-embedding[auto-height][loading] { + min-height: 200px; +} + +/* Force proper sizing during height updates */ +abp-embedding[auto-height].height-updating iframe { + transition: none !important; } \ No newline at end of file diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js index 0afa876bba7..3096f3c576b 100644 --- a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js +++ b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js @@ -137,6 +137,30 @@ this.syncInitialUrl(); } + // Request height update if auto-height is enabled + if (this.hasAttribute('auto-height') || this.autoHeightConfig) { + // Send auto-height config to iframe even if just using attribute + if (this.hasAttribute('auto-height') && !this.autoHeightConfig) { + // Create basic config for attribute-based auto-height + this.autoHeightConfig = { + minHeight: 100, + maxHeight: window.innerHeight * 0.9, + watchForChanges: true, + initialDelay: 250, + retryDelays: [100, 300, 500, 1000] + }; + + // Send config to iframe + this.sendData({ + type: 'auto-height-config', + config: this.autoHeightConfig + }); + } + + // Multiple attempts to ensure we get the height after content is fully rendered + this.scheduleInitialHeightUpdate(); + } + // Dispatch custom event this.dispatchEvent(new CustomEvent('iframe-loaded', { detail: { iframe: this.iframe }, @@ -147,6 +171,18 @@ handleIframeMessage(event) { // Verify the message is from our iframe if (this.iframe && event.source === this.iframe.contentWindow) { + // Handle iframe ready signal for auto-height + if (event.data && event.data.type === 'iframe-ready-for-auto-height') { + this.handleIframeReadyForAutoHeight(event.data); + return; + } + + // Handle auto-height messages + if (event.data && event.data.type === 'height-update') { + this.updateIframeHeight(event.data.height); + return; + } + // Handle URL sync messages if (this.urlSyncEnabled && event.data && event.data.type === 'url-change') { this.handleIframeUrlChange(event.data.path); @@ -338,6 +374,163 @@ window.history.pushState({ iframePath: newPath }, '', newPath); } } + + /** + * Update iframe height based on content + * @param {number} height + */ + updateIframeHeight(height) { + if (!this.iframe) { + console.warn('ABP Embedding: No iframe found for height update'); + return; + } + + if (!height || height <= 0) { + console.warn('ABP Embedding: Invalid height received:', height); + return; + } + + const config = this.autoHeightConfig || {}; + const minHeight = config.minHeight || 100; + const maxHeight = config.maxHeight || window.innerHeight * 0.9; + + // Ensure height is within reasonable bounds + const newHeight = Math.max(minHeight, Math.min(height, maxHeight)); + + console.debug('ABP Embedding: Updating height from', height, 'to', newHeight); + + // Add class to disable transitions during update + this.classList.add('height-updating'); + + // Update iframe height with multiple methods to ensure it takes + this.iframe.style.setProperty('height', newHeight + 'px', 'important'); + this.iframe.style.setProperty('min-height', newHeight + 'px', 'important'); + + // Update the component's height if not responsive + if (!this.classList.contains('responsive')) { + this.style.setProperty('height', newHeight + 'px', 'important'); + } + + // Force layout recalculation + this.iframe.offsetHeight; + + // Remove updating class to re-enable transitions + setTimeout(() => { + this.classList.remove('height-updating'); + }, 10); + + // Dispatch custom event + this.dispatchEvent(new CustomEvent('height-updated', { + detail: { + originalHeight: height, + appliedHeight: newHeight, + wasConstrained: height !== newHeight + }, + bubbles: true + })); + } + + /** + * Request height update from iframe content + */ + requestHeightUpdate() { + if (this.isIframeLoaded && this.iframe) { + this.iframe.contentWindow.postMessage({ + type: 'request-height-update' + }, '*'); + } + } + + /** + * Schedule initial height update with multiple attempts + */ + scheduleInitialHeightUpdate() { + const config = this.autoHeightConfig || {}; + const attempts = config.retryDelays || [100, 300, 500, 1000]; + + // Mark that we're waiting for iframe to be ready + this.waitingForIframeReady = true; + + attempts.forEach(delay => { + setTimeout(() => { + if (this.isIframeLoaded && (this.hasAttribute('auto-height') || this.autoHeightConfig)) { + console.debug('ABP Embedding: Requesting height update after', delay, 'ms'); + this.requestHeightUpdate(); + } + }, delay); + }); + + // Also set a timeout to stop waiting after reasonable time + setTimeout(() => { + this.waitingForIframeReady = false; + }, 5000); + } + + handleIframeReadyForAutoHeight(data) { + console.debug('ABP Embedding: Iframe ready for auto-height', data); + + this.waitingForIframeReady = false; + + // Use the initial height from the ready signal + if (data.initialHeight && data.initialHeight > 0) { + this.updateIframeHeight(data.initialHeight); + } + + // Also enable auto-height if it's set via attribute but not programmatically enabled yet + if (this.hasAttribute('auto-height') && !this.autoHeightConfig) { + this.enableAutoHeight(); + } + } + + /** + * Enable auto-height functionality + * @param {Object} options - Configuration options + */ + enableAutoHeight(options = {}) { + const config = { + minHeight: options.minHeight || 100, + maxHeight: options.maxHeight || window.innerHeight * 0.9, + watchForChanges: options.watchForChanges !== false, // Default true + initialDelay: options.initialDelay || 250, // Delay before first measurement + retryDelays: options.retryDelays || [100, 300, 500, 1000], // Multiple retry attempts + ...options + }; + + // Store config + this.autoHeightConfig = config; + + // Add auto-height attribute for CSS targeting + this.setAttribute('auto-height', 'true'); + + // Request initial height update + if (this.isIframeLoaded) { + this.scheduleInitialHeightUpdate(); + } + + // Send configuration to iframe + this.sendData({ + type: 'auto-height-config', + config: config + }); + } + + /** + * Disable auto-height functionality + */ + disableAutoHeight() { + this.removeAttribute('auto-height'); + delete this.autoHeightConfig; + + // Reset to original height + const originalHeight = this.getAttribute('height') || '400px'; + this.iframe.style.height = originalHeight; + this.style.height = originalHeight; + + // Notify iframe to stop monitoring + this.sendData({ + type: 'auto-height-disable' + }); + } } // Register the custom element @@ -366,6 +559,18 @@ } }; + abp.embedding.enableAutoHeight = function(element, options) { + if (element && typeof element.enableAutoHeight === 'function') { + element.enableAutoHeight(options); + } + }; + + abp.embedding.disableAutoHeight = function(element) { + if (element && typeof element.disableAutoHeight === 'function') { + element.disableAutoHeight(); + } + }; + // Log that the component is loaded if (abp.log && abp.log.debug) { abp.log.debug('ABP Embedding Web Component loaded'); From 224ecd7320892f3c89fceb70169a526d8e9f344a Mon Sep 17 00:00:00 2001 From: enisn Date: Thu, 26 Jun 2025 09:44:46 +0300 Subject: [PATCH 09/13] Add embedded script support for embedding layout Introduced EmbeddedScriptViewComponent and its view to inject an embedding script when the page is embedded. Updated EmbeddingPageLayout to expose IsEmbedded property and set it based on the request. Registered the view component to render at the end of the body via layout hooks. --- .../Mvc/UI/AbpAspNetCoreMvcUiEmbeddingModule.cs | 11 +++++++++++ .../Mvc/UI/Layout/EmbeddedScript/Default.cshtml | 9 +++++++++ .../EmbeddedScript/EmbeddedScriptViewComponent.cs | 15 +++++++++++++++ .../Mvc/UI/Layout/EmbeddingPageLayout.cs | 6 +++--- 4 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddedScript/Default.cshtml create mode 100644 framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddedScript/EmbeddedScriptViewComponent.cs diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/AbpAspNetCoreMvcUiEmbeddingModule.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/AbpAspNetCoreMvcUiEmbeddingModule.cs index 0df420b19b5..7884e51e5e1 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/AbpAspNetCoreMvcUiEmbeddingModule.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/AbpAspNetCoreMvcUiEmbeddingModule.cs @@ -1,6 +1,9 @@ using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.AspNetCore.Mvc.UI.Embedding.Volo.Abp.AspNetCore.Mvc.UI.Layout.EmbeddedScript; using Volo.Abp.AspNetCore.Mvc.UI.Layout; +using Volo.Abp.AspNetCore.Mvc.UI.Theming; using Volo.Abp.Modularity; +using Volo.Abp.Ui.LayoutHooks; using Volo.Abp.UI.Navigation; using Volo.Abp.VirtualFileSystem; @@ -21,5 +24,13 @@ public override void ConfigureServices(ServiceConfigurationContext context) { // Default configuration - can be overridden by applications }); + + Configure(options => + { + options.Add( + LayoutHooks.Body.Last, + typeof(EmbeddedScriptViewComponent) + ); + }); } } diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddedScript/Default.cshtml b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddedScript/Default.cshtml new file mode 100644 index 00000000000..d1618c7059a --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddedScript/Default.cshtml @@ -0,0 +1,9 @@ +@using Volo.Abp.AspNetCore.Mvc.UI.Layout +@inject EmbeddingPageLayout PageLayout + + +@if (PageLayout.IsEmbedded) +{ + + +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddedScript/EmbeddedScriptViewComponent.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddedScript/EmbeddedScriptViewComponent.cs new file mode 100644 index 00000000000..3f3c08e3ae9 --- /dev/null +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddedScript/EmbeddedScriptViewComponent.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; + +namespace Volo.Abp.AspNetCore.Mvc.UI.Embedding.Volo.Abp.AspNetCore.Mvc.UI.Layout.EmbeddedScript; + +public class EmbeddedScriptViewComponent : AbpViewComponent +{ + public virtual IViewComponentResult Invoke() + { + return View("~/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddedScript/Default.cshtml"); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddingPageLayout.cs b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddingPageLayout.cs index db9210a8de7..b39c6927876 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddingPageLayout.cs +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddingPageLayout.cs @@ -4,9 +4,10 @@ namespace Volo.Abp.AspNetCore.Mvc.UI.Layout; [Dependency(ReplaceServices = true)] -[ExposeServices(typeof(IPageLayout))] +[ExposeServices(typeof(IPageLayout), typeof(EmbeddingPageLayout))] public class EmbeddingPageLayout : PageLayout, IScopedDependency { + public bool IsEmbedded { get; protected set; } protected IPageEmbeddingService PageEmbeddingService { get; } protected IHttpContextAccessor HttpContextAccessor { get; } @@ -18,8 +19,6 @@ public EmbeddingPageLayout(IPageEmbeddingService pageEmbeddingService, IHttpCont HttpContextAccessor = httpContextAccessor; } - public ContentLayout Content { get; } = new(); - public override bool RenderLayoutElements { get @@ -33,6 +32,7 @@ public override bool RenderLayoutElements var httpContext = HttpContextAccessor.HttpContext; if (httpContext != null && PageEmbeddingService.IsEmbeddingRequest(httpContext)) { + IsEmbedded = true; return false; } From 8873bf259c97bb4322a5151c998fb03692ac81e1 Mon Sep 17 00:00:00 2001 From: enisn Date: Thu, 26 Jun 2025 11:30:29 +0300 Subject: [PATCH 10/13] Update Default.cshtml --- .../AspNetCore/Mvc/UI/Layout/EmbeddedScript/Default.cshtml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddedScript/Default.cshtml b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddedScript/Default.cshtml index d1618c7059a..55457e86a5d 100644 --- a/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddedScript/Default.cshtml +++ b/framework/src/Volo.Abp.AspNetCore.Mvc.UI.Embedding/Volo/Abp/AspNetCore/Mvc/UI/Layout/EmbeddedScript/Default.cshtml @@ -4,6 +4,6 @@ @if (PageLayout.IsEmbedded) { - - + } \ No newline at end of file From e397dee23ba201e3430038bec3820ebd12fb003b Mon Sep 17 00:00:00 2001 From: enisn Date: Thu, 26 Jun 2025 11:48:57 +0300 Subject: [PATCH 11/13] Refactor embedding iframe and component for simpler auto-height Simplifies the ABP embedding iframe script and web component by removing bidirectional messaging, URL sync, and complex height measurement strategies. The iframe now only reports its height to the parent, and the parent component updates the iframe height accordingly. CSS is updated to remove default and auto-height-related height rules, delegating all height management to JavaScript for more predictable behavior. --- .../src/abp-embedding-iframe.js | 457 +++++------------- .../src/abp-embedding.css | 21 +- .../src/abp-embedding.js | 402 ++------------- 3 files changed, 151 insertions(+), 729 deletions(-) diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding-iframe.js b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding-iframe.js index 342f84e6d31..4e21ee22cc8 100644 --- a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding-iframe.js +++ b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding-iframe.js @@ -7,44 +7,31 @@ } /** - * ABP Embedding Iframe Content Script - * Handles height measurement and communication with parent + * ABP Embedding Iframe Handler + * Simple one-way height reporting to parent */ class AbpEmbeddingIframeHandler { constructor() { this.config = { minHeight: 100, maxHeight: 10000, - watchForChanges: true, - debounceDelay: 250 + debounceDelay: 100 }; this.isEnabled = false; this.observer = null; this.debounceTimer = null; this.lastReportedHeight = 0; - // Bind methods - this.handleMessage = this.handleMessage.bind(this); + // Bind methods to ensure correct 'this' context this.measureHeight = this.measureHeight.bind(this); this.reportHeight = this.reportHeight.bind(this); this.debouncedReportHeight = this.debouncedReportHeight.bind(this); + this.onContentChange = this.onContentChange.bind(this); } init() { - // Listen for messages from parent - window.addEventListener('message', this.handleMessage); - - // If we're in an iframe, proactively enable with defaults - // This helps with race conditions where parent hasn't sent config yet - if (window.self !== window.top) { - setTimeout(() => { - if (!this.isEnabled) { - console.debug('ABP Iframe: Proactively enabling auto-height (iframe detected)'); - this.configure({}); - this.enable(); - } - }, 50); - } + // Auto-enable for iframe context + this.enable(); // Wait for DOM to be ready if (document.readyState === 'loading') { @@ -57,380 +44,178 @@ } onDomReady() { - // Wait for all content to load (including images) + // Wait for content to load if (document.readyState === 'complete') { - this.onPageFullyLoaded(); + this.onPageLoaded(); } else { window.addEventListener('load', () => { - this.onPageFullyLoaded(); + this.onPageLoaded(); }); } } - onPageFullyLoaded() { - // Wait for layout to complete with multiple strategies - this.waitForLayoutCompletion().then(() => { - // Send ready signal to parent first - this.sendReadySignal(); - - // Then report height + onPageLoaded() { + // Wait for layout completion then report height + this.waitForLayout().then(() => { this.reportHeight(); - - // Also set up a retry mechanism in case the first measurement was off - setTimeout(() => { - this.retryInitialHeight(); - }, 1000); - }); - } - - sendReadySignal() { - // Tell parent that iframe is ready and can handle auto-height - if (window.parent && window.parent !== window) { - window.parent.postMessage({ - type: 'iframe-ready-for-auto-height', - timestamp: Date.now(), - initialHeight: this.measureHeight() - }, '*'); - } - } - - async waitForLayoutCompletion() { - // Strategy 1: Wait for any pending images - await this.waitForImages(); - - // Strategy 2: Use requestAnimationFrame to ensure rendering is complete - await new Promise(resolve => { - requestAnimationFrame(() => { - requestAnimationFrame(() => { - resolve(); - }); - }); }); - - // Strategy 3: Small delay to ensure CSS transitions/animations are done - await new Promise(resolve => setTimeout(resolve, 250)); - - // Strategy 4: Wait for fonts to load if supported - if (document.fonts && document.fonts.ready) { - try { - await document.fonts.ready; - } catch (error) { - // Font loading API not supported, continue - } - } } - async waitForImages() { + async waitForLayout() { + // Wait for images to load const images = document.querySelectorAll('img'); const imagePromises = Array.from(images).map(img => { - if (img.complete) { - return Promise.resolve(); - } + if (img.complete) return Promise.resolve(); return new Promise(resolve => { - const timeout = setTimeout(() => { - resolve(); // Don't wait forever for broken images - }, 3000); - - img.addEventListener('load', () => { - clearTimeout(timeout); - resolve(); - }); - - img.addEventListener('error', () => { - clearTimeout(timeout); - resolve(); - }); + const timeout = setTimeout(resolve, 2000); // Don't wait forever + img.addEventListener('load', () => { clearTimeout(timeout); resolve(); }); + img.addEventListener('error', () => { clearTimeout(timeout); resolve(); }); }); }); await Promise.all(imagePromises); - } - - retryInitialHeight() { - if (!this.isEnabled) { - return; - } - - const currentHeight = this.measureHeight(); - // If the height seems too small, it might have been measured too early - if (currentHeight < 200 && this.lastReportedHeight > 0) { - const heightDifference = Math.abs(currentHeight - this.lastReportedHeight); - - // If there's a significant difference, report the new height - if (heightDifference > 50) { - console.debug('ABP Iframe: Retrying height measurement due to significant change'); - this.reportHeight(); - } - } - } - - handleMessage(event) { - if (!event.data || typeof event.data !== 'object') { - return; - } - - switch (event.data.type) { - case 'auto-height-config': - this.configure(event.data.config); - this.enable(); - break; - case 'auto-height-disable': - this.disable(); - break; - case 'request-height-update': - this.reportHeight(); - break; - } - } - - configure(config) { - this.config = { ...this.config, ...config }; + // Wait for layout + await new Promise(resolve => { + requestAnimationFrame(() => { + requestAnimationFrame(resolve); + }); + }); + + // Small delay for CSS/fonts + await new Promise(resolve => setTimeout(resolve, 100)); } enable() { - if (this.isEnabled) { - return; - } - - this.isEnabled = true; - - // Set up change monitoring if enabled - if (this.config.watchForChanges) { - this.setupChangeMonitoring(); - } - - // Send ready signal and report initial height - this.sendReadySignal(); + if (this.isEnabled) return; - // Use a small delay to ensure parent receives ready signal first - setTimeout(() => { - this.reportHeight(); - }, 50); + this.isEnabled = true; + this.setupMonitoring(); } disable() { this.isEnabled = false; - - // Clean up observers + if (this.observer) { this.observer.disconnect(); this.observer = null; } - - // Clear debounce timer + if (this.debounceTimer) { clearTimeout(this.debounceTimer); this.debounceTimer = null; } + + window.removeEventListener('resize', this.debouncedReportHeight); } - setupChangeMonitoring() { - // Use ResizeObserver if available (modern browsers) - if (window.ResizeObserver) { - this.observer = new ResizeObserver(() => { - this.debouncedReportHeight(); - }); - this.observer.observe(document.body); - } else { - // Fallback: Use MutationObserver for older browsers - this.observer = new MutationObserver(() => { - this.debouncedReportHeight(); - }); - - this.observer.observe(document.body, { - childList: true, - subtree: true, - attributes: true, - attributeFilter: ['style', 'class'] - }); - } + setupMonitoring() { + // Use MutationObserver for content changes + this.observer = new MutationObserver(this.onContentChange); + this.observer.observe(document.body, { + childList: true, + subtree: true, + attributes: true, + attributeFilter: ['style', 'class', 'height', 'width'] + }); - // Also monitor window resize + // Monitor window resize window.addEventListener('resize', this.debouncedReportHeight); + + // Monitor common dynamic content events + this.setupDynamicContentMonitoring(); } - measureHeight() { - // Force layout recalculation - document.body.offsetHeight; - - // Fix common CSS issues that interfere with height measurement - this.fixCSSIssues(); - - // Try multiple methods to get the most accurate height - const methods = [ - () => { - // Method 1: Body scroll height (most reliable for content) - return Math.max(document.body.scrollHeight, document.body.offsetHeight); - }, - () => { - // Method 2: Document element height - return Math.max(document.documentElement.scrollHeight, document.documentElement.offsetHeight); - }, - () => { - // Method 3: Bounding rect of body - const bodyRect = document.body.getBoundingClientRect(); - return bodyRect.height + window.pageYOffset; - }, - () => { - // Method 4: Walk through all visible elements - const elements = document.querySelectorAll('body *'); - let maxBottom = 0; - - for (const element of elements) { - const style = window.getComputedStyle(element); - if (style.display === 'none' || style.visibility === 'hidden') { - continue; - } - - const rect = element.getBoundingClientRect(); - const bottom = rect.bottom + window.pageYOffset; - if (bottom > maxBottom) { - maxBottom = bottom; - } - } - - // Add body margins/padding - const bodyStyle = window.getComputedStyle(document.body); - const bodyMarginBottom = parseFloat(bodyStyle.marginBottom) || 0; - const bodyPaddingBottom = parseFloat(bodyStyle.paddingBottom) || 0; - - return maxBottom + bodyMarginBottom + bodyPaddingBottom; - }, - () => { - // Method 5: Custom height calculation including margins - const body = document.body; - const html = document.documentElement; - - const height = Math.max( - body.scrollHeight, - body.offsetHeight, - html.clientHeight, - html.scrollHeight, - html.offsetHeight - ); - - return height; - } - ]; - - let maxHeight = 0; - const heights = []; + setupDynamicContentMonitoring() { + // Monitor for images loading + const handleImageLoad = this.debouncedReportHeight; + document.addEventListener('load', handleImageLoad, true); + document.addEventListener('error', handleImageLoad, true); - for (const method of methods) { - try { - const height = method(); - if (height && height > 0) { - heights.push(height); - if (height > maxHeight) { - maxHeight = height; - } - } - } catch (error) { - console.warn('Height measurement method failed:', error); - } + // Monitor for AJAX/fetch requests + const originalFetch = window.fetch; + if (originalFetch) { + window.fetch = (...args) => { + return originalFetch.apply(this, args).then(response => { + setTimeout(this.debouncedReportHeight, 100); + return response; + }); + }; } + + // Monitor XMLHttpRequest + const originalXHROpen = XMLHttpRequest.prototype.open; + XMLHttpRequest.prototype.open = function(...args) { + this.addEventListener('loadend', handleImageLoad); + return originalXHROpen.apply(this, args); + }; + } - // If we got very different heights, log them for debugging - if (heights.length > 1) { - const min = Math.min(...heights); - const max = Math.max(...heights); - if (max - min > 100) { - console.debug('Height measurement variance:', heights); + onContentChange(mutations) { + let shouldUpdate = false; + + for (const mutation of mutations) { + if (mutation.type === 'childList' && + (mutation.addedNodes.length > 0 || mutation.removedNodes.length > 0)) { + shouldUpdate = true; + break; + } else if (mutation.type === 'attributes') { + shouldUpdate = true; + break; } } + + if (shouldUpdate) { + this.debouncedReportHeight(); + } + } + + measureHeight() { + // Force layout calculation + document.body.offsetHeight; + + // Try different height measurement methods + const heights = [ + Math.max(document.body.scrollHeight, document.body.offsetHeight), + Math.max(document.documentElement.scrollHeight, document.documentElement.offsetHeight) + ]; - // Fallback if no height was measured + // Get the maximum height + let maxHeight = Math.max(...heights); + if (maxHeight === 0) { maxHeight = window.innerHeight || 400; - console.warn('Could not measure content height, using fallback:', maxHeight); } - // Add padding to ensure no content is cut off - maxHeight += 20; - - // Ensure height is within configured bounds + // Add small padding and ensure within bounds + maxHeight += 10; return Math.max( this.config.minHeight, Math.min(maxHeight, this.config.maxHeight) ); } - fixCSSIssues() { - // Common CSS fixes that interfere with height measurement - const html = document.documentElement; - const body = document.body; - - // Store original styles to avoid overriding intentional styles - if (!this.originalStyles) { - this.originalStyles = { - htmlHeight: html.style.height, - bodyHeight: body.style.height, - htmlOverflow: html.style.overflow, - bodyOverflow: body.style.overflow - }; - } - - // Temporarily fix height issues for measurement - const htmlStyle = window.getComputedStyle(html); - const bodyStyle = window.getComputedStyle(body); - - // If html/body have 100% height, it can interfere with scrollHeight - if (htmlStyle.height === '100%' || htmlStyle.height === '100vh') { - html.style.height = 'auto'; - } - if (bodyStyle.height === '100%' || bodyStyle.height === '100vh') { - body.style.height = 'auto'; - } - - // Ensure overflow is visible for accurate measurement - if (htmlStyle.overflow === 'hidden') { - html.style.overflow = 'visible'; - } - if (bodyStyle.overflow === 'hidden') { - body.style.overflow = 'visible'; - } - - // Force layout recalculation - body.offsetHeight; - - // Restore styles after a brief moment (after measurement) - setTimeout(() => { - if (this.originalStyles) { - if (this.originalStyles.htmlHeight) html.style.height = this.originalStyles.htmlHeight; - if (this.originalStyles.bodyHeight) body.style.height = this.originalStyles.bodyHeight; - if (this.originalStyles.htmlOverflow) html.style.overflow = this.originalStyles.htmlOverflow; - if (this.originalStyles.bodyOverflow) body.style.overflow = this.originalStyles.bodyOverflow; - } - }, 10); - } - reportHeight() { - if (!this.isEnabled) { - return; - } + if (!this.isEnabled) return; const height = this.measureHeight(); - - // Only report if height has changed significantly (avoid unnecessary updates) - // But be more lenient for the first measurement - const threshold = this.lastReportedHeight === 0 ? 1 : 5; + const threshold = this.lastReportedHeight === 0 ? 1 : 3; + if (Math.abs(height - this.lastReportedHeight) < threshold) { return; } - console.debug('ABP Iframe: Reporting height:', height, '(previous:', this.lastReportedHeight, ')'); - this.lastReportedHeight = height; // Send height to parent - window.parent.postMessage({ - type: 'height-update', - height: height, - timestamp: Date.now(), - isInitial: this.lastReportedHeight === height // Flag if this is the first measurement - }, '*'); + if (window.parent && window.parent !== window) { + window.parent.postMessage({ + type: 'height-update', + height: height, + timestamp: Date.now() + }, '*'); + } } debouncedReportHeight() { @@ -449,25 +234,7 @@ const handler = new AbpEmbeddingIframeHandler(); handler.init(); - // Expose handler globally for debugging + // Expose handler globally for manual control if needed window.abpEmbeddingIframeHandler = handler; - // Auto-enable if embed parameter is present in URL - const urlParams = new URLSearchParams(window.location.search); - if (urlParams.get('embed') === '1') { - // Enable with default config - handler.configure({}); - handler.enable(); - } - - // Also try to auto-detect if we're in an iframe and enable automatically - // This helps with cases where the embed parameter isn't set but auto-height is expected - setTimeout(() => { - if (window.self !== window.top && !handler.isEnabled) { - console.debug('ABP Iframe: Auto-enabling iframe handler (detected iframe context)'); - handler.configure({}); - handler.enable(); - } - }, 100); - })(); \ No newline at end of file diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css index ad9ca160e92..9516ad512f1 100644 --- a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css +++ b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css @@ -4,7 +4,6 @@ abp-embedding { display: block; position: relative; width: 100%; - height: 400px; /* Default height */ overflow: hidden; } @@ -33,17 +32,16 @@ abp-embedding iframe { text-shadow: none !important; -webkit-text-shadow: none !important; -moz-text-shadow: none !important; + width: 100%; } /* Responsive behavior */ abp-embedding.responsive { aspect-ratio: 16 / 9; - height: auto; } abp-embedding.responsive iframe { width: 100%; - height: 100%; } /* Loading state */ @@ -81,25 +79,16 @@ abp-embedding iframe { background-color: var(--background-color) !important; } -/* Auto-height specific styles */ +/* Auto-height specific styles - only non-height related rules */ abp-embedding[auto-height] { - height: auto !important; - min-height: 100px; - transition: height 0.3s ease; + /* Let JavaScript handle all height management */ } abp-embedding[auto-height] iframe { - transition: height 0.3s ease; - min-height: 100px !important; - height: auto !important; -} - -/* Prevent height jumping during initial load */ -abp-embedding[auto-height][loading] { - min-height: 200px; + /* Let JavaScript handle all height management */ } -/* Force proper sizing during height updates */ +/* Disable transitions during height updates to prevent conflicts */ abp-embedding[auto-height].height-updating iframe { transition: none !important; } \ No newline at end of file diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js index 3096f3c576b..3518d4ae2c7 100644 --- a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js +++ b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js @@ -11,32 +11,27 @@ /** * ABP Embedding Web Component - * Renders an iframe with data passing capabilities + * Simple iframe with auto-height capability */ class AbpEmbeddingElement extends HTMLElement { constructor() { super(); this.iframe = null; - this.dataQueue = []; this.isIframeLoaded = false; - this.urlSyncEnabled = false; - this.baseIframeUrl = ''; - this.isNavigatingFromParent = false; + this.autoHeightConfig = null; // Bind methods this.handleIframeLoad = this.handleIframeLoad.bind(this); this.handleIframeMessage = this.handleIframeMessage.bind(this); - this.handlePopState = this.handlePopState.bind(this); } static get observedAttributes() { - return ['src', 'width', 'height', 'allow', 'sandbox', 'loading', 'url-sync']; + return ['src', 'width', 'height', 'allow', 'sandbox', 'loading', 'auto-height']; } connectedCallback() { this.render(); this.setupEventListeners(); - this.initializeUrlSync(); } disconnectedCallback() { @@ -63,7 +58,6 @@ this.iframe.style.outline = 'none'; this.iframe.style.display = 'block'; this.iframe.style.width = '100%'; - this.iframe.style.height = '100%'; // Apply custom attributes this.updateAllAttributes(); @@ -89,7 +83,6 @@ switch (name) { case 'src': - this.baseIframeUrl = this.extractBaseUrl(value); this.iframe.src = value; this.isIframeLoaded = false; break; @@ -97,12 +90,15 @@ this.iframe.style.width = value.includes('%') || value.includes('px') ? value : value + 'px'; break; case 'height': - this.iframe.style.height = value.includes('%') || value.includes('px') ? value : value + 'px'; + if (!this.hasAttribute('auto-height')) { + this.iframe.style.height = value.includes('%') || value.includes('px') ? value : value + 'px'; + } break; - case 'url-sync': - this.urlSyncEnabled = value === 'true' || value === ''; - if (this.urlSyncEnabled) { - this.initializeUrlSync(); + case 'auto-height': + if (value === 'true' || value === '') { + this.enableAutoHeight(); + } else { + this.disableAutoHeight(); } break; default: @@ -117,7 +113,6 @@ cleanup() { window.removeEventListener('message', this.handleIframeMessage); - window.removeEventListener('popstate', this.handlePopState); if (this.iframe) { this.iframe.removeEventListener('load', this.handleIframeLoad); } @@ -125,41 +120,6 @@ handleIframeLoad() { this.isIframeLoaded = true; - - // Send any queued data - if (this.dataQueue.length > 0) { - this.dataQueue.forEach(data => this.sendDataToIframe(data)); - this.dataQueue = []; - } - - // Initialize URL sync if enabled - if (this.urlSyncEnabled) { - this.syncInitialUrl(); - } - - // Request height update if auto-height is enabled - if (this.hasAttribute('auto-height') || this.autoHeightConfig) { - // Send auto-height config to iframe even if just using attribute - if (this.hasAttribute('auto-height') && !this.autoHeightConfig) { - // Create basic config for attribute-based auto-height - this.autoHeightConfig = { - minHeight: 100, - maxHeight: window.innerHeight * 0.9, - watchForChanges: true, - initialDelay: 250, - retryDelays: [100, 300, 500, 1000] - }; - - // Send config to iframe - this.sendData({ - type: 'auto-height-config', - config: this.autoHeightConfig - }); - } - - // Multiple attempts to ensure we get the height after content is fully rendered - this.scheduleInitialHeightUpdate(); - } // Dispatch custom event this.dispatchEvent(new CustomEvent('iframe-loaded', { @@ -169,224 +129,21 @@ } handleIframeMessage(event) { - // Verify the message is from our iframe - if (this.iframe && event.source === this.iframe.contentWindow) { - // Handle iframe ready signal for auto-height - if (event.data && event.data.type === 'iframe-ready-for-auto-height') { - this.handleIframeReadyForAutoHeight(event.data); - return; - } - - // Handle auto-height messages - if (event.data && event.data.type === 'height-update') { - this.updateIframeHeight(event.data.height); - return; - } - - // Handle URL sync messages - if (this.urlSyncEnabled && event.data && event.data.type === 'url-change') { - this.handleIframeUrlChange(event.data.path); - return; - } - - // Dispatch custom event with the received data - this.dispatchEvent(new CustomEvent('iframe-message', { - detail: { - data: event.data, - origin: event.origin, - source: event.source - }, - bubbles: true - })); - } - } - - /** - * Send data to the iframe content - * @param {*} data - Data to send - * @param {string} targetOrigin - Target origin (default: '*') - */ - sendData(data, targetOrigin = '*') { - if (this.isIframeLoaded && this.iframe) { - this.sendDataToIframe({ data, targetOrigin }); - } else { - // Queue the data until iframe is loaded - this.dataQueue.push({ data, targetOrigin }); - } - } - - sendDataToIframe({ data, targetOrigin }) { - try { - this.iframe.contentWindow.postMessage(data, targetOrigin); - } catch (error) { - console.error('Failed to send data to iframe:', error); - } - } - - /** - * Get the iframe element - * @returns {HTMLIFrameElement} - */ - getIframe() { - return this.iframe; - } - - /** - * Check if iframe is loaded - * @returns {boolean} - */ - isLoaded() { - return this.isIframeLoaded; - } - - /** - * Initialize URL synchronization - */ - initializeUrlSync() { - if (!this.urlSyncEnabled) { - this.urlSyncEnabled = this.hasAttribute('url-sync'); - } - - if (this.urlSyncEnabled) { - window.addEventListener('popstate', this.handlePopState); - - // Sync initial URL if needed - if (this.isIframeLoaded) { - this.syncInitialUrl(); - } - } - } - - /** - * Extract base URL from iframe src - * @param {string} url - * @returns {string} - */ - extractBaseUrl(url) { - try { - const urlObj = new URL(url); - return `${urlObj.protocol}//${urlObj.host}`; - } catch (error) { - console.warn('Invalid iframe URL:', url); - return ''; - } - } - - /** - * Handle URL change from iframe - * @param {string} path - */ - handleIframeUrlChange(path) { - if (this.isNavigatingFromParent) { - this.isNavigatingFromParent = false; - return; - } - - // Update parent URL to match iframe path - const currentPath = window.location.pathname; - const newPath = path.startsWith('/') ? path : '/' + path; - - if (currentPath !== newPath) { - window.history.pushState({ iframePath: newPath }, '', newPath); + // Simple message filtering - only accept height updates from our iframe + if (this.iframe && + event.source === this.iframe.contentWindow && + event.data && + event.data.type === 'height-update') { - // Dispatch custom event - this.dispatchEvent(new CustomEvent('url-synced', { - detail: { - type: 'iframe-to-parent', - oldPath: currentPath, - newPath: newPath - }, - bubbles: true - })); - } - } - - /** - * Handle browser back/forward button - * @param {PopStateEvent} event - */ - handlePopState(event) { - if (!this.urlSyncEnabled || !this.isIframeLoaded) { - return; - } - - const currentPath = window.location.pathname; - this.navigateIframeToPath(currentPath); - } - - /** - * Navigate iframe to specific path - * @param {string} path - */ - navigateIframeToPath(path) { - if (!this.baseIframeUrl || !this.iframe) { - return; - } - - this.isNavigatingFromParent = true; - - // Construct iframe URL with embed parameter - const iframePath = path.startsWith('/') ? path : '/' + path; - const iframeUrl = `${this.baseIframeUrl}${iframePath}?embed=1`; - - // Send navigation command to iframe - this.iframe.contentWindow.postMessage({ - type: 'navigate', - path: iframePath, - url: iframeUrl - }, '*'); - - // Dispatch custom event - this.dispatchEvent(new CustomEvent('url-synced', { - detail: { - type: 'parent-to-iframe', - path: iframePath, - url: iframeUrl - }, - bubbles: true - })); - } - - /** - * Sync initial URL when iframe loads - */ - syncInitialUrl() { - const currentPath = window.location.pathname; - - // If we have a specific path in the URL, navigate iframe to it - if (currentPath && currentPath !== '/') { - setTimeout(() => { - this.navigateIframeToPath(currentPath); - }, 100); // Small delay to ensure iframe is ready - } - } - - /** - * Manually sync URL (useful for programmatic navigation) - * @param {string} path - */ - syncUrl(path) { - if (this.urlSyncEnabled) { - this.navigateIframeToPath(path); - - // Update parent URL - const newPath = path.startsWith('/') ? path : '/' + path; - window.history.pushState({ iframePath: newPath }, '', newPath); + this.updateIframeHeight(event.data.height); } } /** * Update iframe height based on content - * @param {number} height */ updateIframeHeight(height) { - if (!this.iframe) { - console.warn('ABP Embedding: No iframe found for height update'); - return; - } - - if (!height || height <= 0) { - console.warn('ABP Embedding: Invalid height received:', height); + if (!this.iframe || !height || height <= 0) { return; } @@ -397,121 +154,45 @@ // Ensure height is within reasonable bounds const newHeight = Math.max(minHeight, Math.min(height, maxHeight)); - console.debug('ABP Embedding: Updating height from', height, 'to', newHeight); - - // Add class to disable transitions during update - this.classList.add('height-updating'); - - // Update iframe height with multiple methods to ensure it takes - this.iframe.style.setProperty('height', newHeight + 'px', 'important'); - this.iframe.style.setProperty('min-height', newHeight + 'px', 'important'); - - // Update the component's height if not responsive - if (!this.classList.contains('responsive')) { - this.style.setProperty('height', newHeight + 'px', 'important'); - } - - // Force layout recalculation - this.iframe.offsetHeight; - - // Remove updating class to re-enable transitions - setTimeout(() => { - this.classList.remove('height-updating'); - }, 10); + // Update iframe height + this.iframe.style.height = newHeight + 'px'; // Dispatch custom event this.dispatchEvent(new CustomEvent('height-updated', { detail: { - originalHeight: height, - appliedHeight: newHeight, - wasConstrained: height !== newHeight + height: newHeight, + originalHeight: height }, bubbles: true })); } /** - * Request height update from iframe content + * Get the iframe element */ - requestHeightUpdate() { - if (this.isIframeLoaded && this.iframe) { - this.iframe.contentWindow.postMessage({ - type: 'request-height-update' - }, '*'); - } + getIframe() { + return this.iframe; } /** - * Schedule initial height update with multiple attempts + * Check if iframe is loaded */ - scheduleInitialHeightUpdate() { - const config = this.autoHeightConfig || {}; - const attempts = config.retryDelays || [100, 300, 500, 1000]; - - // Mark that we're waiting for iframe to be ready - this.waitingForIframeReady = true; - - attempts.forEach(delay => { - setTimeout(() => { - if (this.isIframeLoaded && (this.hasAttribute('auto-height') || this.autoHeightConfig)) { - console.debug('ABP Embedding: Requesting height update after', delay, 'ms'); - this.requestHeightUpdate(); - } - }, delay); - }); - - // Also set a timeout to stop waiting after reasonable time - setTimeout(() => { - this.waitingForIframeReady = false; - }, 5000); - } - - handleIframeReadyForAutoHeight(data) { - console.debug('ABP Embedding: Iframe ready for auto-height', data); - - this.waitingForIframeReady = false; - - // Use the initial height from the ready signal - if (data.initialHeight && data.initialHeight > 0) { - this.updateIframeHeight(data.initialHeight); - } - - // Also enable auto-height if it's set via attribute but not programmatically enabled yet - if (this.hasAttribute('auto-height') && !this.autoHeightConfig) { - this.enableAutoHeight(); - } + isLoaded() { + return this.isIframeLoaded; } /** * Enable auto-height functionality - * @param {Object} options - Configuration options */ enableAutoHeight(options = {}) { const config = { minHeight: options.minHeight || 100, maxHeight: options.maxHeight || window.innerHeight * 0.9, - watchForChanges: options.watchForChanges !== false, // Default true - initialDelay: options.initialDelay || 250, // Delay before first measurement - retryDelays: options.retryDelays || [100, 300, 500, 1000], // Multiple retry attempts ...options }; - // Store config this.autoHeightConfig = config; - - // Add auto-height attribute for CSS targeting this.setAttribute('auto-height', 'true'); - - // Request initial height update - if (this.isIframeLoaded) { - this.scheduleInitialHeightUpdate(); - } - - // Send configuration to iframe - this.sendData({ - type: 'auto-height-config', - config: config - }); } /** @@ -519,17 +200,13 @@ */ disableAutoHeight() { this.removeAttribute('auto-height'); - delete this.autoHeightConfig; + this.autoHeightConfig = null; - // Reset to original height + // Reset to original height if specified const originalHeight = this.getAttribute('height') || '400px'; - this.iframe.style.height = originalHeight; - this.style.height = originalHeight; - - // Notify iframe to stop monitoring - this.sendData({ - type: 'auto-height-disable' - }); + if (this.iframe) { + this.iframe.style.height = originalHeight; + } } } @@ -548,17 +225,11 @@ if (options.allow) element.setAttribute('allow', options.allow); if (options.sandbox) element.setAttribute('sandbox', options.sandbox); if (options.loading) element.setAttribute('loading', options.loading); - if (options.urlSync) element.setAttribute('url-sync', options.urlSync); + if (options.autoHeight) element.setAttribute('auto-height', options.autoHeight); return element; }; - abp.embedding.sendData = function(element, data, targetOrigin) { - if (element && typeof element.sendData === 'function') { - element.sendData(data, targetOrigin); - } - }; - abp.embedding.enableAutoHeight = function(element, options) { if (element && typeof element.enableAutoHeight === 'function') { element.enableAutoHeight(options); @@ -571,9 +242,4 @@ } }; - // Log that the component is loaded - if (abp.log && abp.log.debug) { - abp.log.debug('ABP Embedding Web Component loaded'); - } - })(); \ No newline at end of file From 82aad60c5184dd02b3c738a0ca5a4e27afd600b1 Mon Sep 17 00:00:00 2001 From: enisn Date: Thu, 26 Jun 2025 14:28:01 +0300 Subject: [PATCH 12/13] Add browser history sync for embedded iframe navigation Introduces logic to synchronize the browser's URL fragment with the navigation state of the embedded iframe, allowing back/forward navigation and deep linking. Only one instance manages history to prevent conflicts, and cross-origin navigation is handled gracefully. --- .../src/abp-embedding.js | 146 ++++++++++++++++++ 1 file changed, 146 insertions(+) diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js index 3518d4ae2c7..70f3ad36c3a 100644 --- a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js +++ b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js @@ -9,6 +9,9 @@ abp.embedding = abp.embedding || {}; + // Static state to ensure only one instance manages history + let historyManagerInstance = null; + /** * ABP Embedding Web Component * Simple iframe with auto-height capability @@ -19,10 +22,14 @@ this.iframe = null; this.isIframeLoaded = false; this.autoHeightConfig = null; + this.isHistoryManager = false; + this.initialSrc = null; // Original src attribute + this.initialUrl = null; // Actual loaded URL // Bind methods this.handleIframeLoad = this.handleIframeLoad.bind(this); this.handleIframeMessage = this.handleIframeMessage.bind(this); + this.handlePopState = this.handlePopState.bind(this); } static get observedAttributes() { @@ -30,8 +37,10 @@ } connectedCallback() { + this.setupHistoryManager(); this.render(); this.setupEventListeners(); + this.handleInitialFragment(); } disconnectedCallback() { @@ -44,6 +53,108 @@ } } + setupHistoryManager() { + if (historyManagerInstance === null) { + historyManagerInstance = this; + this.isHistoryManager = true; + } else { + console.warn('ABP Embedding: Multiple instances detected. Only the first instance will manage browser history.'); + } + } + + handleInitialFragment() { + if (!this.isHistoryManager) return; + + // Store the original src attribute as initialSrc + this.initialSrc = this.getAttribute('src'); + + // Check if there's a fragment in the current URL + const fragment = this.parseFragmentFromUrl(); + if (fragment && this.initialSrc) { + // Build absolute URL from relative fragment + const absoluteUrl = this.buildAbsoluteUrl(fragment); + // Update iframe src to navigate to the fragment URL + this.iframe.src = absoluteUrl; + } + } + + parseFragmentFromUrl() { + const hash = window.location.hash; + if (hash && hash.startsWith('#page=')) { + return hash.substring(6); // Remove '#page=' prefix + } + return null; + } + + buildAbsoluteUrl(relativePath) { + if (!this.initialSrc) return relativePath; + + try { + // If relativePath starts with '/', it's relative to the domain + if (relativePath.startsWith('/')) { + const url = new URL(this.initialSrc); + return url.origin + relativePath; + } else { + // Otherwise, it's relative to the current path + return new URL(relativePath, this.initialSrc).href; + } + } catch (e) { + console.warn('ABP Embedding: Failed to build absolute URL', e); + return relativePath; + } + } + + buildRelativePath(absoluteUrl) { + if (!this.initialUrl || !absoluteUrl) return null; + + try { + const initialUrlObj = new URL(this.initialUrl); + const currentUrlObj = new URL(absoluteUrl); + + // Check if same origin + if (initialUrlObj.origin !== currentUrlObj.origin) { + return null; + } + + // Return pathname + search + hash relative to initial URL + const relativePath = currentUrlObj.pathname + currentUrlObj.search + currentUrlObj.hash; + const initialPath = initialUrlObj.pathname; + + // If it's the same as initial path, return relative + if (relativePath === initialPath) { + return '/'; + } + + return relativePath; + } catch (e) { + console.warn('ABP Embedding: Failed to build relative path', e); + return null; + } + } + + updateUrlFragment(relativePath) { + if (!this.isHistoryManager || !relativePath) return; + + const newHash = '#page=' + relativePath; + if (window.location.hash !== newHash) { + // Update URL without page refresh + history.pushState({}, '', window.location.pathname + window.location.search + newHash); + } + } + + handlePopState(event) { + if (!this.isHistoryManager || !this.iframe) return; + + const fragment = this.parseFragmentFromUrl(); + if (fragment && this.initialSrc) { + const absoluteUrl = this.buildAbsoluteUrl(fragment); + this.iframe.src = absoluteUrl; + } else if (!fragment && this.initialSrc) { + // No fragment, navigate back to initial URL + this.iframe.src = this.initialSrc; + } + } + render() { // Clear existing content this.innerHTML = ''; @@ -109,10 +220,22 @@ setupEventListeners() { // Listen for messages from iframe window.addEventListener('message', this.handleIframeMessage); + + // Listen for popstate events (back/forward buttons) + if (this.isHistoryManager) { + window.addEventListener('popstate', this.handlePopState); + } } cleanup() { window.removeEventListener('message', this.handleIframeMessage); + if (this.isHistoryManager) { + window.removeEventListener('popstate', this.handlePopState); + // Reset the static instance if this was the history manager + if (historyManagerInstance === this) { + historyManagerInstance = null; + } + } if (this.iframe) { this.iframe.removeEventListener('load', this.handleIframeLoad); } @@ -121,6 +244,29 @@ handleIframeLoad() { this.isIframeLoaded = true; + try { + const currentUrl = this.iframe.contentWindow.location.href; + + if (!this.initialUrl) { + // First load - store the initial URL + this.initialUrl = currentUrl; + } else if (this.isHistoryManager && currentUrl !== this.initialUrl) { + // Navigation detected - check if it's same domain + if (currentUrl.startsWith(this.initialUrl) || + (this.initialSrc && currentUrl.startsWith(new URL(this.initialSrc).origin))) { + + // Generate relative path and update URL fragment + const relativePath = this.buildRelativePath(currentUrl); + if (relativePath) { + this.updateUrlFragment(relativePath); + } + } + } + } catch (e) { + // Handle potential cross-origin errors gracefully + console.warn('ABP Embedding: Could not access iframe URL due to cross-origin restrictions', e); + } + // Dispatch custom event this.dispatchEvent(new CustomEvent('iframe-loaded', { detail: { iframe: this.iframe }, From a63fa305e2b62022b27423c108194e04147d7374 Mon Sep 17 00:00:00 2001 From: enisn Date: Fri, 27 Jun 2025 11:51:45 +0300 Subject: [PATCH 13/13] Add URL change detection and reporting for embedded iframes Introduces URL change monitoring in abp-embedding-iframe.js, reporting navigation events to the parent window via postMessage. Updates abp-embedding.js to handle 'url-change' messages from the iframe and dispatches a custom 'iframe-loaded' event. Also sets a minimum height for embedded iframes in abp-embedding.css to improve user experience. --- .../src/abp-embedding-iframe.js | 91 +++++++++++++++++++ .../src/abp-embedding.css | 1 + .../src/abp-embedding.js | 64 ++++++++----- 3 files changed, 131 insertions(+), 25 deletions(-) diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding-iframe.js b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding-iframe.js index 4e21ee22cc8..1db934510a2 100644 --- a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding-iframe.js +++ b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding-iframe.js @@ -21,18 +21,28 @@ this.observer = null; this.debounceTimer = null; this.lastReportedHeight = 0; + this.lastReportedUrl = null; // Bind methods to ensure correct 'this' context this.measureHeight = this.measureHeight.bind(this); this.reportHeight = this.reportHeight.bind(this); this.debouncedReportHeight = this.debouncedReportHeight.bind(this); this.onContentChange = this.onContentChange.bind(this); + this.reportUrlChange = this.reportUrlChange.bind(this); + this.handlePopState = this.handlePopState.bind(this); + this.handleHashChange = this.handleHashChange.bind(this); } init() { // Auto-enable for iframe context this.enable(); + // Report initial URL + this.reportUrlChange(); + + // Setup URL change monitoring + this.setupUrlMonitoring(); + // Wait for DOM to be ready if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', () => { @@ -108,6 +118,10 @@ } window.removeEventListener('resize', this.debouncedReportHeight); + + // Remove URL monitoring listeners + window.removeEventListener('popstate', this.handlePopState); + window.removeEventListener('hashchange', this.handleHashChange); } setupMonitoring() { @@ -228,6 +242,83 @@ this.debounceTimer = null; }, this.config.debounceDelay); } + + setupUrlMonitoring() { + // Monitor popstate events (back/forward navigation) + window.addEventListener('popstate', this.handlePopState); + + // Monitor hashchange events + window.addEventListener('hashchange', this.handleHashChange); + + // Override history methods to catch programmatic navigation + this.overrideHistoryMethods(); + + // Monitor for navigation through other means + this.setupNavigationMonitoring(); + } + + overrideHistoryMethods() { + const originalPushState = history.pushState; + const originalReplaceState = history.replaceState; + + history.pushState = (...args) => { + const result = originalPushState.apply(history, args); + setTimeout(() => this.reportUrlChange(), 0); + return result; + }; + + history.replaceState = (...args) => { + const result = originalReplaceState.apply(history, args); + setTimeout(() => this.reportUrlChange(), 0); + return result; + }; + } + + setupNavigationMonitoring() { + // Monitor for clicks on links + document.addEventListener('click', (event) => { + const link = event.target.closest('a'); + if (link && link.href) { + // Delay to allow navigation to complete + setTimeout(() => this.reportUrlChange(), 100); + } + }); + + // Monitor for form submissions + document.addEventListener('submit', () => { + setTimeout(() => this.reportUrlChange(), 100); + }); + } + + handlePopState(event) { + this.reportUrlChange(); + } + + handleHashChange(event) { + this.reportUrlChange(); + } + + reportUrlChange() { + try { + const currentUrl = window.location.href; + + // Only report if URL actually changed + if (currentUrl !== this.lastReportedUrl) { + this.lastReportedUrl = currentUrl; + + // Send URL change to parent + if (window.parent && window.parent !== window) { + window.parent.postMessage({ + type: 'url-change', + url: currentUrl, + timestamp: Date.now() + }, '*'); + } + } + } catch (e) { + console.warn('ABP Embedding Iframe: Failed to report URL change', e); + } + } } // Create and initialize the handler diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css index 9516ad512f1..ce7feee4a1a 100644 --- a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css +++ b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.css @@ -33,6 +33,7 @@ abp-embedding iframe { -webkit-text-shadow: none !important; -moz-text-shadow: none !important; width: 100%; + min-height: 50vh; /* Minimum height for better UX */ } /* Responsive behavior */ diff --git a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js index 70f3ad36c3a..7dd6da03b0a 100644 --- a/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js +++ b/npm/packs/aspnetcore.mvc.ui.embedding/src/abp-embedding.js @@ -132,13 +132,23 @@ } } + ensureInitialHistoryEntry() { + if (!this.isHistoryManager) return; + + // Only push initial state if there's no fragment currently + if (!window.location.hash || !window.location.hash.startsWith('#page=')) { + // Replace current state to represent the initial iframe state + history.replaceState({ isInitial: true }, '', window.location.href); + } + } + updateUrlFragment(relativePath) { if (!this.isHistoryManager || !relativePath) return; const newHash = '#page=' + relativePath; if (window.location.hash !== newHash) { // Update URL without page refresh - history.pushState({}, '', window.location.pathname + window.location.search + newHash); + history.pushState({ relativePath: relativePath }, '', window.location.pathname + window.location.search + newHash); } } @@ -149,9 +159,13 @@ if (fragment && this.initialSrc) { const absoluteUrl = this.buildAbsoluteUrl(fragment); this.iframe.src = absoluteUrl; - } else if (!fragment && this.initialSrc) { + } else if (!fragment) { // No fragment, navigate back to initial URL - this.iframe.src = this.initialSrc; + if (this.initialUrl) { + this.iframe.src = this.initialUrl; + } else if (this.initialSrc) { + this.iframe.src = this.initialSrc; + } } } @@ -244,12 +258,30 @@ handleIframeLoad() { this.isIframeLoaded = true; + // Dispatch custom event + this.dispatchEvent(new CustomEvent('iframe-loaded', { + detail: { iframe: this.iframe }, + bubbles: true + })); + } + + handleIframeMessage(event) { + // Simple message filtering - only accept messages from our iframe + if (this.iframe && event.source === this.iframe.contentWindow && event.data) { + if (event.data.type === 'height-update') { + this.updateIframeHeight(event.data.height); + } else if (event.data.type === 'url-change') { + this.handleUrlChange(event.data.url); + } + } + } + + handleUrlChange(currentUrl) { try { - const currentUrl = this.iframe.contentWindow.location.href; - if (!this.initialUrl) { - // First load - store the initial URL + // First load - store the initial URL and ensure history entry exists this.initialUrl = currentUrl; + this.ensureInitialHistoryEntry(); } else if (this.isHistoryManager && currentUrl !== this.initialUrl) { // Navigation detected - check if it's same domain if (currentUrl.startsWith(this.initialUrl) || @@ -263,25 +295,7 @@ } } } catch (e) { - // Handle potential cross-origin errors gracefully - console.warn('ABP Embedding: Could not access iframe URL due to cross-origin restrictions', e); - } - - // Dispatch custom event - this.dispatchEvent(new CustomEvent('iframe-loaded', { - detail: { iframe: this.iframe }, - bubbles: true - })); - } - - handleIframeMessage(event) { - // Simple message filtering - only accept height updates from our iframe - if (this.iframe && - event.source === this.iframe.contentWindow && - event.data && - event.data.type === 'height-update') { - - this.updateIframeHeight(event.data.height); + console.warn('ABP Embedding: Failed to handle URL change', e); } }