diff --git a/build/repo.props b/build/repo.props index 53ad94228896e7b337eb74bb68044b9b1de9ffeb..500a42773e29e0238ec6a37603a21515b21d808d 100644 --- a/build/repo.props +++ b/build/repo.props @@ -166,6 +166,7 @@ $(RepositoryRoot)src\MusicStore\**\*.*proj; $(RepositoryRoot)src\SignalR\**\*.csproj; $(RepositoryRoot)src\Components\**\*.csproj; + $(RepositoryRoot)src\Analyzers\**\*.csproj; $(RepositoryRoot)src\ProjectTemplates\*\*.csproj; $(RepositoryRoot)src\ProjectTemplates\testassets\*\*.csproj; " diff --git a/eng/Versions.props b/eng/Versions.props index 2ae50f6f34b2268e175cd9c8bddaa7f907d45816..e36b083079c940be5b534f370cf776d0db0b13c0 100644 --- a/eng/Versions.props +++ b/eng/Versions.props @@ -150,9 +150,9 @@ <MicrosoftAzureStorageBlobPackageVersion>10.0.1</MicrosoftAzureStorageBlobPackageVersion> <MicrosoftBuildFrameworkPackageVersion>15.8.166</MicrosoftBuildFrameworkPackageVersion> <MicrosoftBuildUtilitiesCorePackageVersion>15.8.166</MicrosoftBuildUtilitiesCorePackageVersion> - <MicrosoftCodeAnalysisCommonPackageVersion>2.8.0</MicrosoftCodeAnalysisCommonPackageVersion> - <MicrosoftCodeAnalysisCSharpPackageVersion>2.8.0</MicrosoftCodeAnalysisCSharpPackageVersion> - <MicrosoftCodeAnalysisCSharpWorkspacesPackageVersion>2.8.0</MicrosoftCodeAnalysisCSharpWorkspacesPackageVersion> + <MicrosoftCodeAnalysisCommonPackageVersion>3.0.0</MicrosoftCodeAnalysisCommonPackageVersion> + <MicrosoftCodeAnalysisCSharpPackageVersion>3.0.0</MicrosoftCodeAnalysisCSharpPackageVersion> + <MicrosoftCodeAnalysisCSharpWorkspacesPackageVersion>3.0.0</MicrosoftCodeAnalysisCSharpWorkspacesPackageVersion> <MicrosoftIdentityModelClientsActiveDirectoryPackageVersion>3.19.8</MicrosoftIdentityModelClientsActiveDirectoryPackageVersion> <MicrosoftIdentityModelLoggingPackageVersion>5.3.0</MicrosoftIdentityModelLoggingPackageVersion> <MicrosoftIdentityModelProtocolsOpenIdConnectPackageVersion>5.3.0</MicrosoftIdentityModelProtocolsOpenIdConnectPackageVersion> diff --git a/src/Analyzers/Analyzers.sln b/src/Analyzers/Analyzers.sln new file mode 100644 index 0000000000000000000000000000000000000000..e247944f6a669d9b492ae6a8b2019bbb73267758 --- /dev/null +++ b/src/Analyzers/Analyzers.sln @@ -0,0 +1,794 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.28903.44 +MinimumVisualStudioVersion = 15.0.26124.0 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Analyzers", "Analyzers", "{E20BC57F-1881-40B0-BEAF-338BBDA87956}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc", "..\Mvc\Mvc\src\Microsoft.AspNetCore.Mvc.csproj", "{C13EDBA9-14CB-46FE-8F9F-3ABCC1A5CD3A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR", "..\SignalR\server\SignalR\src\Microsoft.AspNetCore.SignalR.csproj", "{E60ADC05-55CE-46FD-9CBF-31E31FEF79D6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Components.Server", "..\Components\Server\src\Microsoft.AspNetCore.Components.Server.csproj", "{476B2742-74FD-4009-92DE-7B1214EAF244}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Antiforgery", "..\Antiforgery\src\Microsoft.AspNetCore.Antiforgery.csproj", "{E38BD375-143D-4928-8814-924597931A07}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Abstractions", "..\Http\Authentication.Abstractions\src\Microsoft.AspNetCore.Authentication.Abstractions.csproj", "{B0E13EEA-7E85-4265-BC1C-AFA1526FB36D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authentication.Core", "..\Http\Authentication.Core\src\Microsoft.AspNetCore.Authentication.Core.csproj", "{31B70151-7A3F-47F9-87DE-B279E93B3915}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authorization", "..\Security\Authorization\Core\src\Microsoft.AspNetCore.Authorization.csproj", "{D345FDA8-05A0-4141-BCEF-1A11AF01480A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Authorization.Policy", "..\Security\Authorization\Policy\src\Microsoft.AspNetCore.Authorization.Policy.csproj", "{34CCB39F-37E7-46E7-AC58-E9197F4A5380}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Components", "..\Components\Components\src\Microsoft.AspNetCore.Components.csproj", "{34522BFF-D1D8-44A3-891E-77C6BE7C81F1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Components.Browser", "..\Components\Browser\src\Microsoft.AspNetCore.Components.Browser.csproj", "{9C20C5AB-E609-4167-922D-0E7C7C6ED1EC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Connections.Abstractions", "..\Servers\Connections.Abstractions\src\Microsoft.AspNetCore.Connections.Abstractions.csproj", "{A21D03D7-5D69-47E7-B32C-4D7067D71B0E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Cors", "..\Middleware\CORS\src\Microsoft.AspNetCore.Cors.csproj", "{48A3DFDD-C975-42CA-87BA-3B8BAF549E22}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Cryptography.Internal", "..\DataProtection\Cryptography.Internal\src\Microsoft.AspNetCore.Cryptography.Internal.csproj", "{D8F56A11-8961-4BD4-8846-C5483BA500F8}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.DataProtection", "..\DataProtection\DataProtection\src\Microsoft.AspNetCore.DataProtection.csproj", "{7E619CBF-B8B4-4FF6-8A73-C259FD4B0A0F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.DataProtection.Abstractions", "..\DataProtection\Abstractions\src\Microsoft.AspNetCore.DataProtection.Abstractions.csproj", "{52055C8F-9A92-48D4-B4F7-33F287173456}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Diagnostics.Abstractions", "..\Middleware\Diagnostics.Abstractions\src\Microsoft.AspNetCore.Diagnostics.Abstractions.csproj", "{AACC0D65-5B5D-4D38-BC24-1FADDC1A5F0F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Hosting.Abstractions", "..\Hosting\Abstractions\src\Microsoft.AspNetCore.Hosting.Abstractions.csproj", "{DF11316F-4166-415D-B610-01603DADFED1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Hosting.Server.Abstractions", "..\Hosting\Server.Abstractions\src\Microsoft.AspNetCore.Hosting.Server.Abstractions.csproj", "{AEC73094-8FE0-419C-A7E4-4BCC7CEF2BBC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Html.Abstractions", "..\Html\Abstractions\src\Microsoft.AspNetCore.Html.Abstractions.csproj", "{A42AAAA1-C8D9-4EA9-935F-A155F8B4BEE6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http", "..\Http\Http\src\Microsoft.AspNetCore.Http.csproj", "{3090F751-B421-4853-829C-C0CC5ADE3D83}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Abstractions", "..\Http\Http.Abstractions\src\Microsoft.AspNetCore.Http.Abstractions.csproj", "{E10A7203-BCC8-4F81-A9FB-56C241BC4B33}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Connections", "..\SignalR\common\Http.Connections\src\Microsoft.AspNetCore.Http.Connections.csproj", "{4B501200-A3FD-4F3B-B8AC-582108B13A05}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Connections.Common", "..\SignalR\common\Http.Connections.Common\src\Microsoft.AspNetCore.Http.Connections.Common.csproj", "{99F7E758-9327-4A16-8AB7-72B35B1D2C92}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Extensions", "..\Http\Http.Extensions\src\Microsoft.AspNetCore.Http.Extensions.csproj", "{04C932ED-58DA-4EB9-90CD-2835C67B9952}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Http.Features", "..\Http\Http.Features\src\Microsoft.AspNetCore.Http.Features.csproj", "{7B7FBB84-21AE-4720-90BE-F9FD22AEE803}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Localization", "..\Middleware\Localization\src\Microsoft.AspNetCore.Localization.csproj", "{9D5B4D52-7E1B-4981-8994-5288262577B2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Abstractions", "..\Mvc\Mvc.Abstractions\src\Microsoft.AspNetCore.Mvc.Abstractions.csproj", "{06091041-72DA-4C68-8FC1-AD65E495993D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.ApiExplorer", "..\Mvc\Mvc.ApiExplorer\src\Microsoft.AspNetCore.Mvc.ApiExplorer.csproj", "{535E8748-EC5E-41CB-94ED-ACB8A75E46AB}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Core", "..\Mvc\Mvc.Core\src\Microsoft.AspNetCore.Mvc.Core.csproj", "{9B71BB93-4E03-4F4A-A52C-6490E9CFD99E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Cors", "..\Mvc\Mvc.Cors\src\Microsoft.AspNetCore.Mvc.Cors.csproj", "{11FB37B1-F4C9-4C4F-867E-4FD9050282C7}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.DataAnnotations", "..\Mvc\Mvc.DataAnnotations\src\Microsoft.AspNetCore.Mvc.DataAnnotations.csproj", "{2E4394A2-9863-4B60-B9EA-906FA6C46854}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Formatters.Json", "..\Mvc\Mvc.Formatters.Json\src\Microsoft.AspNetCore.Mvc.Formatters.Json.csproj", "{470CD0EE-3C90-462A-B003-3403AB4558A5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Localization", "..\Mvc\Mvc.Localization\src\Microsoft.AspNetCore.Mvc.Localization.csproj", "{0192C192-BE48-4BC4-8308-9497407FA054}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.Razor", "..\Mvc\Mvc.Razor\src\Microsoft.AspNetCore.Mvc.Razor.csproj", "{DB90A8A7-6E65-4388-AA9A-4FCFFF39AF30}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.RazorPages", "..\Mvc\Mvc.RazorPages\src\Microsoft.AspNetCore.Mvc.RazorPages.csproj", "{823DD383-E8EB-4CF8-84BB-0EA3D6E024C3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.TagHelpers", "..\Mvc\Mvc.TagHelpers\src\Microsoft.AspNetCore.Mvc.TagHelpers.csproj", "{BD6F4453-AE41-4578-B3FB-9F7C4617D96C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Mvc.ViewFeatures", "..\Mvc\Mvc.ViewFeatures\src\Microsoft.AspNetCore.Mvc.ViewFeatures.csproj", "{47E04D89-C2F0-4339-B439-E097AD1ABC09}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor", "..\Razor\Razor\src\Microsoft.AspNetCore.Razor.csproj", "{10588AC3-7F69-47F3-B58D-387ED27C9A50}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Razor.Runtime", "..\Razor\Razor.Runtime\src\Microsoft.AspNetCore.Razor.Runtime.csproj", "{3EEBE055-DD80-4256-B71F-48C9489E2FC2}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.ResponseCaching.Abstractions", "..\Middleware\ResponseCaching.Abstractions\src\Microsoft.AspNetCore.ResponseCaching.Abstractions.csproj", "{F871786B-8DF5-4BA7-A5CA-D128651F69AA}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Routing", "..\Http\Routing\src\Microsoft.AspNetCore.Routing.csproj", "{AFBA7019-7A48-42AB-9C0B-B10D8CDC8A05}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Routing.Abstractions", "..\Http\Routing.Abstractions\src\Microsoft.AspNetCore.Routing.Abstractions.csproj", "{B634CC5E-8AC9-49EF-801F-C04AA322EEC1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Common", "..\SignalR\common\SignalR.Common\src\Microsoft.AspNetCore.SignalR.Common.csproj", "{D3A17614-4C31-455F-ADA4-0FD746C569BE}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Core", "..\SignalR\server\Core\src\Microsoft.AspNetCore.SignalR.Core.csproj", "{8AFB0927-456A-4EC9-A07F-65C15A03AA9E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.SignalR.Protocols.Json", "..\SignalR\common\Protocols.Json\src\Microsoft.AspNetCore.SignalR.Protocols.Json.csproj", "{01E8A2FA-4591-4D85-81BE-341CA3C61A90}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.StaticFiles", "..\Middleware\StaticFiles\src\Microsoft.AspNetCore.StaticFiles.csproj", "{894DE066-00B0-44E6-88B9-46F91A17EE26}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.WebSockets", "..\Middleware\WebSockets\src\Microsoft.AspNetCore.WebSockets.csproj", "{0684DA04-DFBA-499D-8D07-2649C3C1068D}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.WebUtilities", "..\Http\WebUtilities\src\Microsoft.AspNetCore.WebUtilities.csproj", "{66456C7C-8CE9-4E01-95A3-399B59CA3438}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Net.Http.Headers", "..\Http\Headers\src\Microsoft.Net.Http.Headers.csproj", "{BDF0389F-B502-4D71-8ADF-206A59F9D32A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Analyzers", "Analyzers\src\Microsoft.AspNetCore.Analyzers.csproj", "{95534D16-E720-4435-9867-5D3E2B288406}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Analyzers.Test", "Analyzers\test\Microsoft.AspNetCore.Analyzers.Test.csproj", "{63A928CC-792F-400A-97D3-F455C0A78B8F}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_dependencies", "_dependencies", "{15FC976B-4FFC-47E1-A047-194F21C3CA9F}" +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 + {C13EDBA9-14CB-46FE-8F9F-3ABCC1A5CD3A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C13EDBA9-14CB-46FE-8F9F-3ABCC1A5CD3A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C13EDBA9-14CB-46FE-8F9F-3ABCC1A5CD3A}.Debug|x64.ActiveCfg = Debug|Any CPU + {C13EDBA9-14CB-46FE-8F9F-3ABCC1A5CD3A}.Debug|x64.Build.0 = Debug|Any CPU + {C13EDBA9-14CB-46FE-8F9F-3ABCC1A5CD3A}.Debug|x86.ActiveCfg = Debug|Any CPU + {C13EDBA9-14CB-46FE-8F9F-3ABCC1A5CD3A}.Debug|x86.Build.0 = Debug|Any CPU + {C13EDBA9-14CB-46FE-8F9F-3ABCC1A5CD3A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C13EDBA9-14CB-46FE-8F9F-3ABCC1A5CD3A}.Release|Any CPU.Build.0 = Release|Any CPU + {C13EDBA9-14CB-46FE-8F9F-3ABCC1A5CD3A}.Release|x64.ActiveCfg = Release|Any CPU + {C13EDBA9-14CB-46FE-8F9F-3ABCC1A5CD3A}.Release|x64.Build.0 = Release|Any CPU + {C13EDBA9-14CB-46FE-8F9F-3ABCC1A5CD3A}.Release|x86.ActiveCfg = Release|Any CPU + {C13EDBA9-14CB-46FE-8F9F-3ABCC1A5CD3A}.Release|x86.Build.0 = Release|Any CPU + {E60ADC05-55CE-46FD-9CBF-31E31FEF79D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E60ADC05-55CE-46FD-9CBF-31E31FEF79D6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E60ADC05-55CE-46FD-9CBF-31E31FEF79D6}.Debug|x64.ActiveCfg = Debug|Any CPU + {E60ADC05-55CE-46FD-9CBF-31E31FEF79D6}.Debug|x64.Build.0 = Debug|Any CPU + {E60ADC05-55CE-46FD-9CBF-31E31FEF79D6}.Debug|x86.ActiveCfg = Debug|Any CPU + {E60ADC05-55CE-46FD-9CBF-31E31FEF79D6}.Debug|x86.Build.0 = Debug|Any CPU + {E60ADC05-55CE-46FD-9CBF-31E31FEF79D6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E60ADC05-55CE-46FD-9CBF-31E31FEF79D6}.Release|Any CPU.Build.0 = Release|Any CPU + {E60ADC05-55CE-46FD-9CBF-31E31FEF79D6}.Release|x64.ActiveCfg = Release|Any CPU + {E60ADC05-55CE-46FD-9CBF-31E31FEF79D6}.Release|x64.Build.0 = Release|Any CPU + {E60ADC05-55CE-46FD-9CBF-31E31FEF79D6}.Release|x86.ActiveCfg = Release|Any CPU + {E60ADC05-55CE-46FD-9CBF-31E31FEF79D6}.Release|x86.Build.0 = Release|Any CPU + {476B2742-74FD-4009-92DE-7B1214EAF244}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {476B2742-74FD-4009-92DE-7B1214EAF244}.Debug|Any CPU.Build.0 = Debug|Any CPU + {476B2742-74FD-4009-92DE-7B1214EAF244}.Debug|x64.ActiveCfg = Debug|Any CPU + {476B2742-74FD-4009-92DE-7B1214EAF244}.Debug|x64.Build.0 = Debug|Any CPU + {476B2742-74FD-4009-92DE-7B1214EAF244}.Debug|x86.ActiveCfg = Debug|Any CPU + {476B2742-74FD-4009-92DE-7B1214EAF244}.Debug|x86.Build.0 = Debug|Any CPU + {476B2742-74FD-4009-92DE-7B1214EAF244}.Release|Any CPU.ActiveCfg = Release|Any CPU + {476B2742-74FD-4009-92DE-7B1214EAF244}.Release|Any CPU.Build.0 = Release|Any CPU + {476B2742-74FD-4009-92DE-7B1214EAF244}.Release|x64.ActiveCfg = Release|Any CPU + {476B2742-74FD-4009-92DE-7B1214EAF244}.Release|x64.Build.0 = Release|Any CPU + {476B2742-74FD-4009-92DE-7B1214EAF244}.Release|x86.ActiveCfg = Release|Any CPU + {476B2742-74FD-4009-92DE-7B1214EAF244}.Release|x86.Build.0 = Release|Any CPU + {E38BD375-143D-4928-8814-924597931A07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E38BD375-143D-4928-8814-924597931A07}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E38BD375-143D-4928-8814-924597931A07}.Debug|x64.ActiveCfg = Debug|Any CPU + {E38BD375-143D-4928-8814-924597931A07}.Debug|x64.Build.0 = Debug|Any CPU + {E38BD375-143D-4928-8814-924597931A07}.Debug|x86.ActiveCfg = Debug|Any CPU + {E38BD375-143D-4928-8814-924597931A07}.Debug|x86.Build.0 = Debug|Any CPU + {E38BD375-143D-4928-8814-924597931A07}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E38BD375-143D-4928-8814-924597931A07}.Release|Any CPU.Build.0 = Release|Any CPU + {E38BD375-143D-4928-8814-924597931A07}.Release|x64.ActiveCfg = Release|Any CPU + {E38BD375-143D-4928-8814-924597931A07}.Release|x64.Build.0 = Release|Any CPU + {E38BD375-143D-4928-8814-924597931A07}.Release|x86.ActiveCfg = Release|Any CPU + {E38BD375-143D-4928-8814-924597931A07}.Release|x86.Build.0 = Release|Any CPU + {B0E13EEA-7E85-4265-BC1C-AFA1526FB36D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B0E13EEA-7E85-4265-BC1C-AFA1526FB36D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B0E13EEA-7E85-4265-BC1C-AFA1526FB36D}.Debug|x64.ActiveCfg = Debug|Any CPU + {B0E13EEA-7E85-4265-BC1C-AFA1526FB36D}.Debug|x64.Build.0 = Debug|Any CPU + {B0E13EEA-7E85-4265-BC1C-AFA1526FB36D}.Debug|x86.ActiveCfg = Debug|Any CPU + {B0E13EEA-7E85-4265-BC1C-AFA1526FB36D}.Debug|x86.Build.0 = Debug|Any CPU + {B0E13EEA-7E85-4265-BC1C-AFA1526FB36D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B0E13EEA-7E85-4265-BC1C-AFA1526FB36D}.Release|Any CPU.Build.0 = Release|Any CPU + {B0E13EEA-7E85-4265-BC1C-AFA1526FB36D}.Release|x64.ActiveCfg = Release|Any CPU + {B0E13EEA-7E85-4265-BC1C-AFA1526FB36D}.Release|x64.Build.0 = Release|Any CPU + {B0E13EEA-7E85-4265-BC1C-AFA1526FB36D}.Release|x86.ActiveCfg = Release|Any CPU + {B0E13EEA-7E85-4265-BC1C-AFA1526FB36D}.Release|x86.Build.0 = Release|Any CPU + {31B70151-7A3F-47F9-87DE-B279E93B3915}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {31B70151-7A3F-47F9-87DE-B279E93B3915}.Debug|Any CPU.Build.0 = Debug|Any CPU + {31B70151-7A3F-47F9-87DE-B279E93B3915}.Debug|x64.ActiveCfg = Debug|Any CPU + {31B70151-7A3F-47F9-87DE-B279E93B3915}.Debug|x64.Build.0 = Debug|Any CPU + {31B70151-7A3F-47F9-87DE-B279E93B3915}.Debug|x86.ActiveCfg = Debug|Any CPU + {31B70151-7A3F-47F9-87DE-B279E93B3915}.Debug|x86.Build.0 = Debug|Any CPU + {31B70151-7A3F-47F9-87DE-B279E93B3915}.Release|Any CPU.ActiveCfg = Release|Any CPU + {31B70151-7A3F-47F9-87DE-B279E93B3915}.Release|Any CPU.Build.0 = Release|Any CPU + {31B70151-7A3F-47F9-87DE-B279E93B3915}.Release|x64.ActiveCfg = Release|Any CPU + {31B70151-7A3F-47F9-87DE-B279E93B3915}.Release|x64.Build.0 = Release|Any CPU + {31B70151-7A3F-47F9-87DE-B279E93B3915}.Release|x86.ActiveCfg = Release|Any CPU + {31B70151-7A3F-47F9-87DE-B279E93B3915}.Release|x86.Build.0 = Release|Any CPU + {D345FDA8-05A0-4141-BCEF-1A11AF01480A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D345FDA8-05A0-4141-BCEF-1A11AF01480A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D345FDA8-05A0-4141-BCEF-1A11AF01480A}.Debug|x64.ActiveCfg = Debug|Any CPU + {D345FDA8-05A0-4141-BCEF-1A11AF01480A}.Debug|x64.Build.0 = Debug|Any CPU + {D345FDA8-05A0-4141-BCEF-1A11AF01480A}.Debug|x86.ActiveCfg = Debug|Any CPU + {D345FDA8-05A0-4141-BCEF-1A11AF01480A}.Debug|x86.Build.0 = Debug|Any CPU + {D345FDA8-05A0-4141-BCEF-1A11AF01480A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D345FDA8-05A0-4141-BCEF-1A11AF01480A}.Release|Any CPU.Build.0 = Release|Any CPU + {D345FDA8-05A0-4141-BCEF-1A11AF01480A}.Release|x64.ActiveCfg = Release|Any CPU + {D345FDA8-05A0-4141-BCEF-1A11AF01480A}.Release|x64.Build.0 = Release|Any CPU + {D345FDA8-05A0-4141-BCEF-1A11AF01480A}.Release|x86.ActiveCfg = Release|Any CPU + {D345FDA8-05A0-4141-BCEF-1A11AF01480A}.Release|x86.Build.0 = Release|Any CPU + {34CCB39F-37E7-46E7-AC58-E9197F4A5380}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {34CCB39F-37E7-46E7-AC58-E9197F4A5380}.Debug|Any CPU.Build.0 = Debug|Any CPU + {34CCB39F-37E7-46E7-AC58-E9197F4A5380}.Debug|x64.ActiveCfg = Debug|Any CPU + {34CCB39F-37E7-46E7-AC58-E9197F4A5380}.Debug|x64.Build.0 = Debug|Any CPU + {34CCB39F-37E7-46E7-AC58-E9197F4A5380}.Debug|x86.ActiveCfg = Debug|Any CPU + {34CCB39F-37E7-46E7-AC58-E9197F4A5380}.Debug|x86.Build.0 = Debug|Any CPU + {34CCB39F-37E7-46E7-AC58-E9197F4A5380}.Release|Any CPU.ActiveCfg = Release|Any CPU + {34CCB39F-37E7-46E7-AC58-E9197F4A5380}.Release|Any CPU.Build.0 = Release|Any CPU + {34CCB39F-37E7-46E7-AC58-E9197F4A5380}.Release|x64.ActiveCfg = Release|Any CPU + {34CCB39F-37E7-46E7-AC58-E9197F4A5380}.Release|x64.Build.0 = Release|Any CPU + {34CCB39F-37E7-46E7-AC58-E9197F4A5380}.Release|x86.ActiveCfg = Release|Any CPU + {34CCB39F-37E7-46E7-AC58-E9197F4A5380}.Release|x86.Build.0 = Release|Any CPU + {34522BFF-D1D8-44A3-891E-77C6BE7C81F1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {34522BFF-D1D8-44A3-891E-77C6BE7C81F1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {34522BFF-D1D8-44A3-891E-77C6BE7C81F1}.Debug|x64.ActiveCfg = Debug|Any CPU + {34522BFF-D1D8-44A3-891E-77C6BE7C81F1}.Debug|x64.Build.0 = Debug|Any CPU + {34522BFF-D1D8-44A3-891E-77C6BE7C81F1}.Debug|x86.ActiveCfg = Debug|Any CPU + {34522BFF-D1D8-44A3-891E-77C6BE7C81F1}.Debug|x86.Build.0 = Debug|Any CPU + {34522BFF-D1D8-44A3-891E-77C6BE7C81F1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {34522BFF-D1D8-44A3-891E-77C6BE7C81F1}.Release|Any CPU.Build.0 = Release|Any CPU + {34522BFF-D1D8-44A3-891E-77C6BE7C81F1}.Release|x64.ActiveCfg = Release|Any CPU + {34522BFF-D1D8-44A3-891E-77C6BE7C81F1}.Release|x64.Build.0 = Release|Any CPU + {34522BFF-D1D8-44A3-891E-77C6BE7C81F1}.Release|x86.ActiveCfg = Release|Any CPU + {34522BFF-D1D8-44A3-891E-77C6BE7C81F1}.Release|x86.Build.0 = Release|Any CPU + {9C20C5AB-E609-4167-922D-0E7C7C6ED1EC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9C20C5AB-E609-4167-922D-0E7C7C6ED1EC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C20C5AB-E609-4167-922D-0E7C7C6ED1EC}.Debug|x64.ActiveCfg = Debug|Any CPU + {9C20C5AB-E609-4167-922D-0E7C7C6ED1EC}.Debug|x64.Build.0 = Debug|Any CPU + {9C20C5AB-E609-4167-922D-0E7C7C6ED1EC}.Debug|x86.ActiveCfg = Debug|Any CPU + {9C20C5AB-E609-4167-922D-0E7C7C6ED1EC}.Debug|x86.Build.0 = Debug|Any CPU + {9C20C5AB-E609-4167-922D-0E7C7C6ED1EC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9C20C5AB-E609-4167-922D-0E7C7C6ED1EC}.Release|Any CPU.Build.0 = Release|Any CPU + {9C20C5AB-E609-4167-922D-0E7C7C6ED1EC}.Release|x64.ActiveCfg = Release|Any CPU + {9C20C5AB-E609-4167-922D-0E7C7C6ED1EC}.Release|x64.Build.0 = Release|Any CPU + {9C20C5AB-E609-4167-922D-0E7C7C6ED1EC}.Release|x86.ActiveCfg = Release|Any CPU + {9C20C5AB-E609-4167-922D-0E7C7C6ED1EC}.Release|x86.Build.0 = Release|Any CPU + {A21D03D7-5D69-47E7-B32C-4D7067D71B0E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A21D03D7-5D69-47E7-B32C-4D7067D71B0E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A21D03D7-5D69-47E7-B32C-4D7067D71B0E}.Debug|x64.ActiveCfg = Debug|Any CPU + {A21D03D7-5D69-47E7-B32C-4D7067D71B0E}.Debug|x64.Build.0 = Debug|Any CPU + {A21D03D7-5D69-47E7-B32C-4D7067D71B0E}.Debug|x86.ActiveCfg = Debug|Any CPU + {A21D03D7-5D69-47E7-B32C-4D7067D71B0E}.Debug|x86.Build.0 = Debug|Any CPU + {A21D03D7-5D69-47E7-B32C-4D7067D71B0E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A21D03D7-5D69-47E7-B32C-4D7067D71B0E}.Release|Any CPU.Build.0 = Release|Any CPU + {A21D03D7-5D69-47E7-B32C-4D7067D71B0E}.Release|x64.ActiveCfg = Release|Any CPU + {A21D03D7-5D69-47E7-B32C-4D7067D71B0E}.Release|x64.Build.0 = Release|Any CPU + {A21D03D7-5D69-47E7-B32C-4D7067D71B0E}.Release|x86.ActiveCfg = Release|Any CPU + {A21D03D7-5D69-47E7-B32C-4D7067D71B0E}.Release|x86.Build.0 = Release|Any CPU + {48A3DFDD-C975-42CA-87BA-3B8BAF549E22}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {48A3DFDD-C975-42CA-87BA-3B8BAF549E22}.Debug|Any CPU.Build.0 = Debug|Any CPU + {48A3DFDD-C975-42CA-87BA-3B8BAF549E22}.Debug|x64.ActiveCfg = Debug|Any CPU + {48A3DFDD-C975-42CA-87BA-3B8BAF549E22}.Debug|x64.Build.0 = Debug|Any CPU + {48A3DFDD-C975-42CA-87BA-3B8BAF549E22}.Debug|x86.ActiveCfg = Debug|Any CPU + {48A3DFDD-C975-42CA-87BA-3B8BAF549E22}.Debug|x86.Build.0 = Debug|Any CPU + {48A3DFDD-C975-42CA-87BA-3B8BAF549E22}.Release|Any CPU.ActiveCfg = Release|Any CPU + {48A3DFDD-C975-42CA-87BA-3B8BAF549E22}.Release|Any CPU.Build.0 = Release|Any CPU + {48A3DFDD-C975-42CA-87BA-3B8BAF549E22}.Release|x64.ActiveCfg = Release|Any CPU + {48A3DFDD-C975-42CA-87BA-3B8BAF549E22}.Release|x64.Build.0 = Release|Any CPU + {48A3DFDD-C975-42CA-87BA-3B8BAF549E22}.Release|x86.ActiveCfg = Release|Any CPU + {48A3DFDD-C975-42CA-87BA-3B8BAF549E22}.Release|x86.Build.0 = Release|Any CPU + {D8F56A11-8961-4BD4-8846-C5483BA500F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D8F56A11-8961-4BD4-8846-C5483BA500F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D8F56A11-8961-4BD4-8846-C5483BA500F8}.Debug|x64.ActiveCfg = Debug|Any CPU + {D8F56A11-8961-4BD4-8846-C5483BA500F8}.Debug|x64.Build.0 = Debug|Any CPU + {D8F56A11-8961-4BD4-8846-C5483BA500F8}.Debug|x86.ActiveCfg = Debug|Any CPU + {D8F56A11-8961-4BD4-8846-C5483BA500F8}.Debug|x86.Build.0 = Debug|Any CPU + {D8F56A11-8961-4BD4-8846-C5483BA500F8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D8F56A11-8961-4BD4-8846-C5483BA500F8}.Release|Any CPU.Build.0 = Release|Any CPU + {D8F56A11-8961-4BD4-8846-C5483BA500F8}.Release|x64.ActiveCfg = Release|Any CPU + {D8F56A11-8961-4BD4-8846-C5483BA500F8}.Release|x64.Build.0 = Release|Any CPU + {D8F56A11-8961-4BD4-8846-C5483BA500F8}.Release|x86.ActiveCfg = Release|Any CPU + {D8F56A11-8961-4BD4-8846-C5483BA500F8}.Release|x86.Build.0 = Release|Any CPU + {7E619CBF-B8B4-4FF6-8A73-C259FD4B0A0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7E619CBF-B8B4-4FF6-8A73-C259FD4B0A0F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7E619CBF-B8B4-4FF6-8A73-C259FD4B0A0F}.Debug|x64.ActiveCfg = Debug|Any CPU + {7E619CBF-B8B4-4FF6-8A73-C259FD4B0A0F}.Debug|x64.Build.0 = Debug|Any CPU + {7E619CBF-B8B4-4FF6-8A73-C259FD4B0A0F}.Debug|x86.ActiveCfg = Debug|Any CPU + {7E619CBF-B8B4-4FF6-8A73-C259FD4B0A0F}.Debug|x86.Build.0 = Debug|Any CPU + {7E619CBF-B8B4-4FF6-8A73-C259FD4B0A0F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7E619CBF-B8B4-4FF6-8A73-C259FD4B0A0F}.Release|Any CPU.Build.0 = Release|Any CPU + {7E619CBF-B8B4-4FF6-8A73-C259FD4B0A0F}.Release|x64.ActiveCfg = Release|Any CPU + {7E619CBF-B8B4-4FF6-8A73-C259FD4B0A0F}.Release|x64.Build.0 = Release|Any CPU + {7E619CBF-B8B4-4FF6-8A73-C259FD4B0A0F}.Release|x86.ActiveCfg = Release|Any CPU + {7E619CBF-B8B4-4FF6-8A73-C259FD4B0A0F}.Release|x86.Build.0 = Release|Any CPU + {52055C8F-9A92-48D4-B4F7-33F287173456}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {52055C8F-9A92-48D4-B4F7-33F287173456}.Debug|Any CPU.Build.0 = Debug|Any CPU + {52055C8F-9A92-48D4-B4F7-33F287173456}.Debug|x64.ActiveCfg = Debug|Any CPU + {52055C8F-9A92-48D4-B4F7-33F287173456}.Debug|x64.Build.0 = Debug|Any CPU + {52055C8F-9A92-48D4-B4F7-33F287173456}.Debug|x86.ActiveCfg = Debug|Any CPU + {52055C8F-9A92-48D4-B4F7-33F287173456}.Debug|x86.Build.0 = Debug|Any CPU + {52055C8F-9A92-48D4-B4F7-33F287173456}.Release|Any CPU.ActiveCfg = Release|Any CPU + {52055C8F-9A92-48D4-B4F7-33F287173456}.Release|Any CPU.Build.0 = Release|Any CPU + {52055C8F-9A92-48D4-B4F7-33F287173456}.Release|x64.ActiveCfg = Release|Any CPU + {52055C8F-9A92-48D4-B4F7-33F287173456}.Release|x64.Build.0 = Release|Any CPU + {52055C8F-9A92-48D4-B4F7-33F287173456}.Release|x86.ActiveCfg = Release|Any CPU + {52055C8F-9A92-48D4-B4F7-33F287173456}.Release|x86.Build.0 = Release|Any CPU + {AACC0D65-5B5D-4D38-BC24-1FADDC1A5F0F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AACC0D65-5B5D-4D38-BC24-1FADDC1A5F0F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AACC0D65-5B5D-4D38-BC24-1FADDC1A5F0F}.Debug|x64.ActiveCfg = Debug|Any CPU + {AACC0D65-5B5D-4D38-BC24-1FADDC1A5F0F}.Debug|x64.Build.0 = Debug|Any CPU + {AACC0D65-5B5D-4D38-BC24-1FADDC1A5F0F}.Debug|x86.ActiveCfg = Debug|Any CPU + {AACC0D65-5B5D-4D38-BC24-1FADDC1A5F0F}.Debug|x86.Build.0 = Debug|Any CPU + {AACC0D65-5B5D-4D38-BC24-1FADDC1A5F0F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AACC0D65-5B5D-4D38-BC24-1FADDC1A5F0F}.Release|Any CPU.Build.0 = Release|Any CPU + {AACC0D65-5B5D-4D38-BC24-1FADDC1A5F0F}.Release|x64.ActiveCfg = Release|Any CPU + {AACC0D65-5B5D-4D38-BC24-1FADDC1A5F0F}.Release|x64.Build.0 = Release|Any CPU + {AACC0D65-5B5D-4D38-BC24-1FADDC1A5F0F}.Release|x86.ActiveCfg = Release|Any CPU + {AACC0D65-5B5D-4D38-BC24-1FADDC1A5F0F}.Release|x86.Build.0 = Release|Any CPU + {DF11316F-4166-415D-B610-01603DADFED1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DF11316F-4166-415D-B610-01603DADFED1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DF11316F-4166-415D-B610-01603DADFED1}.Debug|x64.ActiveCfg = Debug|Any CPU + {DF11316F-4166-415D-B610-01603DADFED1}.Debug|x64.Build.0 = Debug|Any CPU + {DF11316F-4166-415D-B610-01603DADFED1}.Debug|x86.ActiveCfg = Debug|Any CPU + {DF11316F-4166-415D-B610-01603DADFED1}.Debug|x86.Build.0 = Debug|Any CPU + {DF11316F-4166-415D-B610-01603DADFED1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DF11316F-4166-415D-B610-01603DADFED1}.Release|Any CPU.Build.0 = Release|Any CPU + {DF11316F-4166-415D-B610-01603DADFED1}.Release|x64.ActiveCfg = Release|Any CPU + {DF11316F-4166-415D-B610-01603DADFED1}.Release|x64.Build.0 = Release|Any CPU + {DF11316F-4166-415D-B610-01603DADFED1}.Release|x86.ActiveCfg = Release|Any CPU + {DF11316F-4166-415D-B610-01603DADFED1}.Release|x86.Build.0 = Release|Any CPU + {AEC73094-8FE0-419C-A7E4-4BCC7CEF2BBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AEC73094-8FE0-419C-A7E4-4BCC7CEF2BBC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AEC73094-8FE0-419C-A7E4-4BCC7CEF2BBC}.Debug|x64.ActiveCfg = Debug|Any CPU + {AEC73094-8FE0-419C-A7E4-4BCC7CEF2BBC}.Debug|x64.Build.0 = Debug|Any CPU + {AEC73094-8FE0-419C-A7E4-4BCC7CEF2BBC}.Debug|x86.ActiveCfg = Debug|Any CPU + {AEC73094-8FE0-419C-A7E4-4BCC7CEF2BBC}.Debug|x86.Build.0 = Debug|Any CPU + {AEC73094-8FE0-419C-A7E4-4BCC7CEF2BBC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AEC73094-8FE0-419C-A7E4-4BCC7CEF2BBC}.Release|Any CPU.Build.0 = Release|Any CPU + {AEC73094-8FE0-419C-A7E4-4BCC7CEF2BBC}.Release|x64.ActiveCfg = Release|Any CPU + {AEC73094-8FE0-419C-A7E4-4BCC7CEF2BBC}.Release|x64.Build.0 = Release|Any CPU + {AEC73094-8FE0-419C-A7E4-4BCC7CEF2BBC}.Release|x86.ActiveCfg = Release|Any CPU + {AEC73094-8FE0-419C-A7E4-4BCC7CEF2BBC}.Release|x86.Build.0 = Release|Any CPU + {A42AAAA1-C8D9-4EA9-935F-A155F8B4BEE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A42AAAA1-C8D9-4EA9-935F-A155F8B4BEE6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A42AAAA1-C8D9-4EA9-935F-A155F8B4BEE6}.Debug|x64.ActiveCfg = Debug|Any CPU + {A42AAAA1-C8D9-4EA9-935F-A155F8B4BEE6}.Debug|x64.Build.0 = Debug|Any CPU + {A42AAAA1-C8D9-4EA9-935F-A155F8B4BEE6}.Debug|x86.ActiveCfg = Debug|Any CPU + {A42AAAA1-C8D9-4EA9-935F-A155F8B4BEE6}.Debug|x86.Build.0 = Debug|Any CPU + {A42AAAA1-C8D9-4EA9-935F-A155F8B4BEE6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A42AAAA1-C8D9-4EA9-935F-A155F8B4BEE6}.Release|Any CPU.Build.0 = Release|Any CPU + {A42AAAA1-C8D9-4EA9-935F-A155F8B4BEE6}.Release|x64.ActiveCfg = Release|Any CPU + {A42AAAA1-C8D9-4EA9-935F-A155F8B4BEE6}.Release|x64.Build.0 = Release|Any CPU + {A42AAAA1-C8D9-4EA9-935F-A155F8B4BEE6}.Release|x86.ActiveCfg = Release|Any CPU + {A42AAAA1-C8D9-4EA9-935F-A155F8B4BEE6}.Release|x86.Build.0 = Release|Any CPU + {3090F751-B421-4853-829C-C0CC5ADE3D83}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3090F751-B421-4853-829C-C0CC5ADE3D83}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3090F751-B421-4853-829C-C0CC5ADE3D83}.Debug|x64.ActiveCfg = Debug|Any CPU + {3090F751-B421-4853-829C-C0CC5ADE3D83}.Debug|x64.Build.0 = Debug|Any CPU + {3090F751-B421-4853-829C-C0CC5ADE3D83}.Debug|x86.ActiveCfg = Debug|Any CPU + {3090F751-B421-4853-829C-C0CC5ADE3D83}.Debug|x86.Build.0 = Debug|Any CPU + {3090F751-B421-4853-829C-C0CC5ADE3D83}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3090F751-B421-4853-829C-C0CC5ADE3D83}.Release|Any CPU.Build.0 = Release|Any CPU + {3090F751-B421-4853-829C-C0CC5ADE3D83}.Release|x64.ActiveCfg = Release|Any CPU + {3090F751-B421-4853-829C-C0CC5ADE3D83}.Release|x64.Build.0 = Release|Any CPU + {3090F751-B421-4853-829C-C0CC5ADE3D83}.Release|x86.ActiveCfg = Release|Any CPU + {3090F751-B421-4853-829C-C0CC5ADE3D83}.Release|x86.Build.0 = Release|Any CPU + {E10A7203-BCC8-4F81-A9FB-56C241BC4B33}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E10A7203-BCC8-4F81-A9FB-56C241BC4B33}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E10A7203-BCC8-4F81-A9FB-56C241BC4B33}.Debug|x64.ActiveCfg = Debug|Any CPU + {E10A7203-BCC8-4F81-A9FB-56C241BC4B33}.Debug|x64.Build.0 = Debug|Any CPU + {E10A7203-BCC8-4F81-A9FB-56C241BC4B33}.Debug|x86.ActiveCfg = Debug|Any CPU + {E10A7203-BCC8-4F81-A9FB-56C241BC4B33}.Debug|x86.Build.0 = Debug|Any CPU + {E10A7203-BCC8-4F81-A9FB-56C241BC4B33}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E10A7203-BCC8-4F81-A9FB-56C241BC4B33}.Release|Any CPU.Build.0 = Release|Any CPU + {E10A7203-BCC8-4F81-A9FB-56C241BC4B33}.Release|x64.ActiveCfg = Release|Any CPU + {E10A7203-BCC8-4F81-A9FB-56C241BC4B33}.Release|x64.Build.0 = Release|Any CPU + {E10A7203-BCC8-4F81-A9FB-56C241BC4B33}.Release|x86.ActiveCfg = Release|Any CPU + {E10A7203-BCC8-4F81-A9FB-56C241BC4B33}.Release|x86.Build.0 = Release|Any CPU + {4B501200-A3FD-4F3B-B8AC-582108B13A05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4B501200-A3FD-4F3B-B8AC-582108B13A05}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4B501200-A3FD-4F3B-B8AC-582108B13A05}.Debug|x64.ActiveCfg = Debug|Any CPU + {4B501200-A3FD-4F3B-B8AC-582108B13A05}.Debug|x64.Build.0 = Debug|Any CPU + {4B501200-A3FD-4F3B-B8AC-582108B13A05}.Debug|x86.ActiveCfg = Debug|Any CPU + {4B501200-A3FD-4F3B-B8AC-582108B13A05}.Debug|x86.Build.0 = Debug|Any CPU + {4B501200-A3FD-4F3B-B8AC-582108B13A05}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4B501200-A3FD-4F3B-B8AC-582108B13A05}.Release|Any CPU.Build.0 = Release|Any CPU + {4B501200-A3FD-4F3B-B8AC-582108B13A05}.Release|x64.ActiveCfg = Release|Any CPU + {4B501200-A3FD-4F3B-B8AC-582108B13A05}.Release|x64.Build.0 = Release|Any CPU + {4B501200-A3FD-4F3B-B8AC-582108B13A05}.Release|x86.ActiveCfg = Release|Any CPU + {4B501200-A3FD-4F3B-B8AC-582108B13A05}.Release|x86.Build.0 = Release|Any CPU + {99F7E758-9327-4A16-8AB7-72B35B1D2C92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {99F7E758-9327-4A16-8AB7-72B35B1D2C92}.Debug|Any CPU.Build.0 = Debug|Any CPU + {99F7E758-9327-4A16-8AB7-72B35B1D2C92}.Debug|x64.ActiveCfg = Debug|Any CPU + {99F7E758-9327-4A16-8AB7-72B35B1D2C92}.Debug|x64.Build.0 = Debug|Any CPU + {99F7E758-9327-4A16-8AB7-72B35B1D2C92}.Debug|x86.ActiveCfg = Debug|Any CPU + {99F7E758-9327-4A16-8AB7-72B35B1D2C92}.Debug|x86.Build.0 = Debug|Any CPU + {99F7E758-9327-4A16-8AB7-72B35B1D2C92}.Release|Any CPU.ActiveCfg = Release|Any CPU + {99F7E758-9327-4A16-8AB7-72B35B1D2C92}.Release|Any CPU.Build.0 = Release|Any CPU + {99F7E758-9327-4A16-8AB7-72B35B1D2C92}.Release|x64.ActiveCfg = Release|Any CPU + {99F7E758-9327-4A16-8AB7-72B35B1D2C92}.Release|x64.Build.0 = Release|Any CPU + {99F7E758-9327-4A16-8AB7-72B35B1D2C92}.Release|x86.ActiveCfg = Release|Any CPU + {99F7E758-9327-4A16-8AB7-72B35B1D2C92}.Release|x86.Build.0 = Release|Any CPU + {04C932ED-58DA-4EB9-90CD-2835C67B9952}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {04C932ED-58DA-4EB9-90CD-2835C67B9952}.Debug|Any CPU.Build.0 = Debug|Any CPU + {04C932ED-58DA-4EB9-90CD-2835C67B9952}.Debug|x64.ActiveCfg = Debug|Any CPU + {04C932ED-58DA-4EB9-90CD-2835C67B9952}.Debug|x64.Build.0 = Debug|Any CPU + {04C932ED-58DA-4EB9-90CD-2835C67B9952}.Debug|x86.ActiveCfg = Debug|Any CPU + {04C932ED-58DA-4EB9-90CD-2835C67B9952}.Debug|x86.Build.0 = Debug|Any CPU + {04C932ED-58DA-4EB9-90CD-2835C67B9952}.Release|Any CPU.ActiveCfg = Release|Any CPU + {04C932ED-58DA-4EB9-90CD-2835C67B9952}.Release|Any CPU.Build.0 = Release|Any CPU + {04C932ED-58DA-4EB9-90CD-2835C67B9952}.Release|x64.ActiveCfg = Release|Any CPU + {04C932ED-58DA-4EB9-90CD-2835C67B9952}.Release|x64.Build.0 = Release|Any CPU + {04C932ED-58DA-4EB9-90CD-2835C67B9952}.Release|x86.ActiveCfg = Release|Any CPU + {04C932ED-58DA-4EB9-90CD-2835C67B9952}.Release|x86.Build.0 = Release|Any CPU + {7B7FBB84-21AE-4720-90BE-F9FD22AEE803}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7B7FBB84-21AE-4720-90BE-F9FD22AEE803}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7B7FBB84-21AE-4720-90BE-F9FD22AEE803}.Debug|x64.ActiveCfg = Debug|Any CPU + {7B7FBB84-21AE-4720-90BE-F9FD22AEE803}.Debug|x64.Build.0 = Debug|Any CPU + {7B7FBB84-21AE-4720-90BE-F9FD22AEE803}.Debug|x86.ActiveCfg = Debug|Any CPU + {7B7FBB84-21AE-4720-90BE-F9FD22AEE803}.Debug|x86.Build.0 = Debug|Any CPU + {7B7FBB84-21AE-4720-90BE-F9FD22AEE803}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7B7FBB84-21AE-4720-90BE-F9FD22AEE803}.Release|Any CPU.Build.0 = Release|Any CPU + {7B7FBB84-21AE-4720-90BE-F9FD22AEE803}.Release|x64.ActiveCfg = Release|Any CPU + {7B7FBB84-21AE-4720-90BE-F9FD22AEE803}.Release|x64.Build.0 = Release|Any CPU + {7B7FBB84-21AE-4720-90BE-F9FD22AEE803}.Release|x86.ActiveCfg = Release|Any CPU + {7B7FBB84-21AE-4720-90BE-F9FD22AEE803}.Release|x86.Build.0 = Release|Any CPU + {9D5B4D52-7E1B-4981-8994-5288262577B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9D5B4D52-7E1B-4981-8994-5288262577B2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9D5B4D52-7E1B-4981-8994-5288262577B2}.Debug|x64.ActiveCfg = Debug|Any CPU + {9D5B4D52-7E1B-4981-8994-5288262577B2}.Debug|x64.Build.0 = Debug|Any CPU + {9D5B4D52-7E1B-4981-8994-5288262577B2}.Debug|x86.ActiveCfg = Debug|Any CPU + {9D5B4D52-7E1B-4981-8994-5288262577B2}.Debug|x86.Build.0 = Debug|Any CPU + {9D5B4D52-7E1B-4981-8994-5288262577B2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9D5B4D52-7E1B-4981-8994-5288262577B2}.Release|Any CPU.Build.0 = Release|Any CPU + {9D5B4D52-7E1B-4981-8994-5288262577B2}.Release|x64.ActiveCfg = Release|Any CPU + {9D5B4D52-7E1B-4981-8994-5288262577B2}.Release|x64.Build.0 = Release|Any CPU + {9D5B4D52-7E1B-4981-8994-5288262577B2}.Release|x86.ActiveCfg = Release|Any CPU + {9D5B4D52-7E1B-4981-8994-5288262577B2}.Release|x86.Build.0 = Release|Any CPU + {06091041-72DA-4C68-8FC1-AD65E495993D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {06091041-72DA-4C68-8FC1-AD65E495993D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {06091041-72DA-4C68-8FC1-AD65E495993D}.Debug|x64.ActiveCfg = Debug|Any CPU + {06091041-72DA-4C68-8FC1-AD65E495993D}.Debug|x64.Build.0 = Debug|Any CPU + {06091041-72DA-4C68-8FC1-AD65E495993D}.Debug|x86.ActiveCfg = Debug|Any CPU + {06091041-72DA-4C68-8FC1-AD65E495993D}.Debug|x86.Build.0 = Debug|Any CPU + {06091041-72DA-4C68-8FC1-AD65E495993D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {06091041-72DA-4C68-8FC1-AD65E495993D}.Release|Any CPU.Build.0 = Release|Any CPU + {06091041-72DA-4C68-8FC1-AD65E495993D}.Release|x64.ActiveCfg = Release|Any CPU + {06091041-72DA-4C68-8FC1-AD65E495993D}.Release|x64.Build.0 = Release|Any CPU + {06091041-72DA-4C68-8FC1-AD65E495993D}.Release|x86.ActiveCfg = Release|Any CPU + {06091041-72DA-4C68-8FC1-AD65E495993D}.Release|x86.Build.0 = Release|Any CPU + {535E8748-EC5E-41CB-94ED-ACB8A75E46AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {535E8748-EC5E-41CB-94ED-ACB8A75E46AB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {535E8748-EC5E-41CB-94ED-ACB8A75E46AB}.Debug|x64.ActiveCfg = Debug|Any CPU + {535E8748-EC5E-41CB-94ED-ACB8A75E46AB}.Debug|x64.Build.0 = Debug|Any CPU + {535E8748-EC5E-41CB-94ED-ACB8A75E46AB}.Debug|x86.ActiveCfg = Debug|Any CPU + {535E8748-EC5E-41CB-94ED-ACB8A75E46AB}.Debug|x86.Build.0 = Debug|Any CPU + {535E8748-EC5E-41CB-94ED-ACB8A75E46AB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {535E8748-EC5E-41CB-94ED-ACB8A75E46AB}.Release|Any CPU.Build.0 = Release|Any CPU + {535E8748-EC5E-41CB-94ED-ACB8A75E46AB}.Release|x64.ActiveCfg = Release|Any CPU + {535E8748-EC5E-41CB-94ED-ACB8A75E46AB}.Release|x64.Build.0 = Release|Any CPU + {535E8748-EC5E-41CB-94ED-ACB8A75E46AB}.Release|x86.ActiveCfg = Release|Any CPU + {535E8748-EC5E-41CB-94ED-ACB8A75E46AB}.Release|x86.Build.0 = Release|Any CPU + {9B71BB93-4E03-4F4A-A52C-6490E9CFD99E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9B71BB93-4E03-4F4A-A52C-6490E9CFD99E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9B71BB93-4E03-4F4A-A52C-6490E9CFD99E}.Debug|x64.ActiveCfg = Debug|Any CPU + {9B71BB93-4E03-4F4A-A52C-6490E9CFD99E}.Debug|x64.Build.0 = Debug|Any CPU + {9B71BB93-4E03-4F4A-A52C-6490E9CFD99E}.Debug|x86.ActiveCfg = Debug|Any CPU + {9B71BB93-4E03-4F4A-A52C-6490E9CFD99E}.Debug|x86.Build.0 = Debug|Any CPU + {9B71BB93-4E03-4F4A-A52C-6490E9CFD99E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9B71BB93-4E03-4F4A-A52C-6490E9CFD99E}.Release|Any CPU.Build.0 = Release|Any CPU + {9B71BB93-4E03-4F4A-A52C-6490E9CFD99E}.Release|x64.ActiveCfg = Release|Any CPU + {9B71BB93-4E03-4F4A-A52C-6490E9CFD99E}.Release|x64.Build.0 = Release|Any CPU + {9B71BB93-4E03-4F4A-A52C-6490E9CFD99E}.Release|x86.ActiveCfg = Release|Any CPU + {9B71BB93-4E03-4F4A-A52C-6490E9CFD99E}.Release|x86.Build.0 = Release|Any CPU + {11FB37B1-F4C9-4C4F-867E-4FD9050282C7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {11FB37B1-F4C9-4C4F-867E-4FD9050282C7}.Debug|Any CPU.Build.0 = Debug|Any CPU + {11FB37B1-F4C9-4C4F-867E-4FD9050282C7}.Debug|x64.ActiveCfg = Debug|Any CPU + {11FB37B1-F4C9-4C4F-867E-4FD9050282C7}.Debug|x64.Build.0 = Debug|Any CPU + {11FB37B1-F4C9-4C4F-867E-4FD9050282C7}.Debug|x86.ActiveCfg = Debug|Any CPU + {11FB37B1-F4C9-4C4F-867E-4FD9050282C7}.Debug|x86.Build.0 = Debug|Any CPU + {11FB37B1-F4C9-4C4F-867E-4FD9050282C7}.Release|Any CPU.ActiveCfg = Release|Any CPU + {11FB37B1-F4C9-4C4F-867E-4FD9050282C7}.Release|Any CPU.Build.0 = Release|Any CPU + {11FB37B1-F4C9-4C4F-867E-4FD9050282C7}.Release|x64.ActiveCfg = Release|Any CPU + {11FB37B1-F4C9-4C4F-867E-4FD9050282C7}.Release|x64.Build.0 = Release|Any CPU + {11FB37B1-F4C9-4C4F-867E-4FD9050282C7}.Release|x86.ActiveCfg = Release|Any CPU + {11FB37B1-F4C9-4C4F-867E-4FD9050282C7}.Release|x86.Build.0 = Release|Any CPU + {2E4394A2-9863-4B60-B9EA-906FA6C46854}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {2E4394A2-9863-4B60-B9EA-906FA6C46854}.Debug|Any CPU.Build.0 = Debug|Any CPU + {2E4394A2-9863-4B60-B9EA-906FA6C46854}.Debug|x64.ActiveCfg = Debug|Any CPU + {2E4394A2-9863-4B60-B9EA-906FA6C46854}.Debug|x64.Build.0 = Debug|Any CPU + {2E4394A2-9863-4B60-B9EA-906FA6C46854}.Debug|x86.ActiveCfg = Debug|Any CPU + {2E4394A2-9863-4B60-B9EA-906FA6C46854}.Debug|x86.Build.0 = Debug|Any CPU + {2E4394A2-9863-4B60-B9EA-906FA6C46854}.Release|Any CPU.ActiveCfg = Release|Any CPU + {2E4394A2-9863-4B60-B9EA-906FA6C46854}.Release|Any CPU.Build.0 = Release|Any CPU + {2E4394A2-9863-4B60-B9EA-906FA6C46854}.Release|x64.ActiveCfg = Release|Any CPU + {2E4394A2-9863-4B60-B9EA-906FA6C46854}.Release|x64.Build.0 = Release|Any CPU + {2E4394A2-9863-4B60-B9EA-906FA6C46854}.Release|x86.ActiveCfg = Release|Any CPU + {2E4394A2-9863-4B60-B9EA-906FA6C46854}.Release|x86.Build.0 = Release|Any CPU + {470CD0EE-3C90-462A-B003-3403AB4558A5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {470CD0EE-3C90-462A-B003-3403AB4558A5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {470CD0EE-3C90-462A-B003-3403AB4558A5}.Debug|x64.ActiveCfg = Debug|Any CPU + {470CD0EE-3C90-462A-B003-3403AB4558A5}.Debug|x64.Build.0 = Debug|Any CPU + {470CD0EE-3C90-462A-B003-3403AB4558A5}.Debug|x86.ActiveCfg = Debug|Any CPU + {470CD0EE-3C90-462A-B003-3403AB4558A5}.Debug|x86.Build.0 = Debug|Any CPU + {470CD0EE-3C90-462A-B003-3403AB4558A5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {470CD0EE-3C90-462A-B003-3403AB4558A5}.Release|Any CPU.Build.0 = Release|Any CPU + {470CD0EE-3C90-462A-B003-3403AB4558A5}.Release|x64.ActiveCfg = Release|Any CPU + {470CD0EE-3C90-462A-B003-3403AB4558A5}.Release|x64.Build.0 = Release|Any CPU + {470CD0EE-3C90-462A-B003-3403AB4558A5}.Release|x86.ActiveCfg = Release|Any CPU + {470CD0EE-3C90-462A-B003-3403AB4558A5}.Release|x86.Build.0 = Release|Any CPU + {0192C192-BE48-4BC4-8308-9497407FA054}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0192C192-BE48-4BC4-8308-9497407FA054}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0192C192-BE48-4BC4-8308-9497407FA054}.Debug|x64.ActiveCfg = Debug|Any CPU + {0192C192-BE48-4BC4-8308-9497407FA054}.Debug|x64.Build.0 = Debug|Any CPU + {0192C192-BE48-4BC4-8308-9497407FA054}.Debug|x86.ActiveCfg = Debug|Any CPU + {0192C192-BE48-4BC4-8308-9497407FA054}.Debug|x86.Build.0 = Debug|Any CPU + {0192C192-BE48-4BC4-8308-9497407FA054}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0192C192-BE48-4BC4-8308-9497407FA054}.Release|Any CPU.Build.0 = Release|Any CPU + {0192C192-BE48-4BC4-8308-9497407FA054}.Release|x64.ActiveCfg = Release|Any CPU + {0192C192-BE48-4BC4-8308-9497407FA054}.Release|x64.Build.0 = Release|Any CPU + {0192C192-BE48-4BC4-8308-9497407FA054}.Release|x86.ActiveCfg = Release|Any CPU + {0192C192-BE48-4BC4-8308-9497407FA054}.Release|x86.Build.0 = Release|Any CPU + {DB90A8A7-6E65-4388-AA9A-4FCFFF39AF30}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DB90A8A7-6E65-4388-AA9A-4FCFFF39AF30}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DB90A8A7-6E65-4388-AA9A-4FCFFF39AF30}.Debug|x64.ActiveCfg = Debug|Any CPU + {DB90A8A7-6E65-4388-AA9A-4FCFFF39AF30}.Debug|x64.Build.0 = Debug|Any CPU + {DB90A8A7-6E65-4388-AA9A-4FCFFF39AF30}.Debug|x86.ActiveCfg = Debug|Any CPU + {DB90A8A7-6E65-4388-AA9A-4FCFFF39AF30}.Debug|x86.Build.0 = Debug|Any CPU + {DB90A8A7-6E65-4388-AA9A-4FCFFF39AF30}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DB90A8A7-6E65-4388-AA9A-4FCFFF39AF30}.Release|Any CPU.Build.0 = Release|Any CPU + {DB90A8A7-6E65-4388-AA9A-4FCFFF39AF30}.Release|x64.ActiveCfg = Release|Any CPU + {DB90A8A7-6E65-4388-AA9A-4FCFFF39AF30}.Release|x64.Build.0 = Release|Any CPU + {DB90A8A7-6E65-4388-AA9A-4FCFFF39AF30}.Release|x86.ActiveCfg = Release|Any CPU + {DB90A8A7-6E65-4388-AA9A-4FCFFF39AF30}.Release|x86.Build.0 = Release|Any CPU + {823DD383-E8EB-4CF8-84BB-0EA3D6E024C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {823DD383-E8EB-4CF8-84BB-0EA3D6E024C3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {823DD383-E8EB-4CF8-84BB-0EA3D6E024C3}.Debug|x64.ActiveCfg = Debug|Any CPU + {823DD383-E8EB-4CF8-84BB-0EA3D6E024C3}.Debug|x64.Build.0 = Debug|Any CPU + {823DD383-E8EB-4CF8-84BB-0EA3D6E024C3}.Debug|x86.ActiveCfg = Debug|Any CPU + {823DD383-E8EB-4CF8-84BB-0EA3D6E024C3}.Debug|x86.Build.0 = Debug|Any CPU + {823DD383-E8EB-4CF8-84BB-0EA3D6E024C3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {823DD383-E8EB-4CF8-84BB-0EA3D6E024C3}.Release|Any CPU.Build.0 = Release|Any CPU + {823DD383-E8EB-4CF8-84BB-0EA3D6E024C3}.Release|x64.ActiveCfg = Release|Any CPU + {823DD383-E8EB-4CF8-84BB-0EA3D6E024C3}.Release|x64.Build.0 = Release|Any CPU + {823DD383-E8EB-4CF8-84BB-0EA3D6E024C3}.Release|x86.ActiveCfg = Release|Any CPU + {823DD383-E8EB-4CF8-84BB-0EA3D6E024C3}.Release|x86.Build.0 = Release|Any CPU + {BD6F4453-AE41-4578-B3FB-9F7C4617D96C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD6F4453-AE41-4578-B3FB-9F7C4617D96C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD6F4453-AE41-4578-B3FB-9F7C4617D96C}.Debug|x64.ActiveCfg = Debug|Any CPU + {BD6F4453-AE41-4578-B3FB-9F7C4617D96C}.Debug|x64.Build.0 = Debug|Any CPU + {BD6F4453-AE41-4578-B3FB-9F7C4617D96C}.Debug|x86.ActiveCfg = Debug|Any CPU + {BD6F4453-AE41-4578-B3FB-9F7C4617D96C}.Debug|x86.Build.0 = Debug|Any CPU + {BD6F4453-AE41-4578-B3FB-9F7C4617D96C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD6F4453-AE41-4578-B3FB-9F7C4617D96C}.Release|Any CPU.Build.0 = Release|Any CPU + {BD6F4453-AE41-4578-B3FB-9F7C4617D96C}.Release|x64.ActiveCfg = Release|Any CPU + {BD6F4453-AE41-4578-B3FB-9F7C4617D96C}.Release|x64.Build.0 = Release|Any CPU + {BD6F4453-AE41-4578-B3FB-9F7C4617D96C}.Release|x86.ActiveCfg = Release|Any CPU + {BD6F4453-AE41-4578-B3FB-9F7C4617D96C}.Release|x86.Build.0 = Release|Any CPU + {47E04D89-C2F0-4339-B439-E097AD1ABC09}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {47E04D89-C2F0-4339-B439-E097AD1ABC09}.Debug|Any CPU.Build.0 = Debug|Any CPU + {47E04D89-C2F0-4339-B439-E097AD1ABC09}.Debug|x64.ActiveCfg = Debug|Any CPU + {47E04D89-C2F0-4339-B439-E097AD1ABC09}.Debug|x64.Build.0 = Debug|Any CPU + {47E04D89-C2F0-4339-B439-E097AD1ABC09}.Debug|x86.ActiveCfg = Debug|Any CPU + {47E04D89-C2F0-4339-B439-E097AD1ABC09}.Debug|x86.Build.0 = Debug|Any CPU + {47E04D89-C2F0-4339-B439-E097AD1ABC09}.Release|Any CPU.ActiveCfg = Release|Any CPU + {47E04D89-C2F0-4339-B439-E097AD1ABC09}.Release|Any CPU.Build.0 = Release|Any CPU + {47E04D89-C2F0-4339-B439-E097AD1ABC09}.Release|x64.ActiveCfg = Release|Any CPU + {47E04D89-C2F0-4339-B439-E097AD1ABC09}.Release|x64.Build.0 = Release|Any CPU + {47E04D89-C2F0-4339-B439-E097AD1ABC09}.Release|x86.ActiveCfg = Release|Any CPU + {47E04D89-C2F0-4339-B439-E097AD1ABC09}.Release|x86.Build.0 = Release|Any CPU + {10588AC3-7F69-47F3-B58D-387ED27C9A50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {10588AC3-7F69-47F3-B58D-387ED27C9A50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {10588AC3-7F69-47F3-B58D-387ED27C9A50}.Debug|x64.ActiveCfg = Debug|Any CPU + {10588AC3-7F69-47F3-B58D-387ED27C9A50}.Debug|x64.Build.0 = Debug|Any CPU + {10588AC3-7F69-47F3-B58D-387ED27C9A50}.Debug|x86.ActiveCfg = Debug|Any CPU + {10588AC3-7F69-47F3-B58D-387ED27C9A50}.Debug|x86.Build.0 = Debug|Any CPU + {10588AC3-7F69-47F3-B58D-387ED27C9A50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {10588AC3-7F69-47F3-B58D-387ED27C9A50}.Release|Any CPU.Build.0 = Release|Any CPU + {10588AC3-7F69-47F3-B58D-387ED27C9A50}.Release|x64.ActiveCfg = Release|Any CPU + {10588AC3-7F69-47F3-B58D-387ED27C9A50}.Release|x64.Build.0 = Release|Any CPU + {10588AC3-7F69-47F3-B58D-387ED27C9A50}.Release|x86.ActiveCfg = Release|Any CPU + {10588AC3-7F69-47F3-B58D-387ED27C9A50}.Release|x86.Build.0 = Release|Any CPU + {3EEBE055-DD80-4256-B71F-48C9489E2FC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3EEBE055-DD80-4256-B71F-48C9489E2FC2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3EEBE055-DD80-4256-B71F-48C9489E2FC2}.Debug|x64.ActiveCfg = Debug|Any CPU + {3EEBE055-DD80-4256-B71F-48C9489E2FC2}.Debug|x64.Build.0 = Debug|Any CPU + {3EEBE055-DD80-4256-B71F-48C9489E2FC2}.Debug|x86.ActiveCfg = Debug|Any CPU + {3EEBE055-DD80-4256-B71F-48C9489E2FC2}.Debug|x86.Build.0 = Debug|Any CPU + {3EEBE055-DD80-4256-B71F-48C9489E2FC2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3EEBE055-DD80-4256-B71F-48C9489E2FC2}.Release|Any CPU.Build.0 = Release|Any CPU + {3EEBE055-DD80-4256-B71F-48C9489E2FC2}.Release|x64.ActiveCfg = Release|Any CPU + {3EEBE055-DD80-4256-B71F-48C9489E2FC2}.Release|x64.Build.0 = Release|Any CPU + {3EEBE055-DD80-4256-B71F-48C9489E2FC2}.Release|x86.ActiveCfg = Release|Any CPU + {3EEBE055-DD80-4256-B71F-48C9489E2FC2}.Release|x86.Build.0 = Release|Any CPU + {F871786B-8DF5-4BA7-A5CA-D128651F69AA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F871786B-8DF5-4BA7-A5CA-D128651F69AA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F871786B-8DF5-4BA7-A5CA-D128651F69AA}.Debug|x64.ActiveCfg = Debug|Any CPU + {F871786B-8DF5-4BA7-A5CA-D128651F69AA}.Debug|x64.Build.0 = Debug|Any CPU + {F871786B-8DF5-4BA7-A5CA-D128651F69AA}.Debug|x86.ActiveCfg = Debug|Any CPU + {F871786B-8DF5-4BA7-A5CA-D128651F69AA}.Debug|x86.Build.0 = Debug|Any CPU + {F871786B-8DF5-4BA7-A5CA-D128651F69AA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F871786B-8DF5-4BA7-A5CA-D128651F69AA}.Release|Any CPU.Build.0 = Release|Any CPU + {F871786B-8DF5-4BA7-A5CA-D128651F69AA}.Release|x64.ActiveCfg = Release|Any CPU + {F871786B-8DF5-4BA7-A5CA-D128651F69AA}.Release|x64.Build.0 = Release|Any CPU + {F871786B-8DF5-4BA7-A5CA-D128651F69AA}.Release|x86.ActiveCfg = Release|Any CPU + {F871786B-8DF5-4BA7-A5CA-D128651F69AA}.Release|x86.Build.0 = Release|Any CPU + {AFBA7019-7A48-42AB-9C0B-B10D8CDC8A05}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AFBA7019-7A48-42AB-9C0B-B10D8CDC8A05}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AFBA7019-7A48-42AB-9C0B-B10D8CDC8A05}.Debug|x64.ActiveCfg = Debug|Any CPU + {AFBA7019-7A48-42AB-9C0B-B10D8CDC8A05}.Debug|x64.Build.0 = Debug|Any CPU + {AFBA7019-7A48-42AB-9C0B-B10D8CDC8A05}.Debug|x86.ActiveCfg = Debug|Any CPU + {AFBA7019-7A48-42AB-9C0B-B10D8CDC8A05}.Debug|x86.Build.0 = Debug|Any CPU + {AFBA7019-7A48-42AB-9C0B-B10D8CDC8A05}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AFBA7019-7A48-42AB-9C0B-B10D8CDC8A05}.Release|Any CPU.Build.0 = Release|Any CPU + {AFBA7019-7A48-42AB-9C0B-B10D8CDC8A05}.Release|x64.ActiveCfg = Release|Any CPU + {AFBA7019-7A48-42AB-9C0B-B10D8CDC8A05}.Release|x64.Build.0 = Release|Any CPU + {AFBA7019-7A48-42AB-9C0B-B10D8CDC8A05}.Release|x86.ActiveCfg = Release|Any CPU + {AFBA7019-7A48-42AB-9C0B-B10D8CDC8A05}.Release|x86.Build.0 = Release|Any CPU + {B634CC5E-8AC9-49EF-801F-C04AA322EEC1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B634CC5E-8AC9-49EF-801F-C04AA322EEC1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B634CC5E-8AC9-49EF-801F-C04AA322EEC1}.Debug|x64.ActiveCfg = Debug|Any CPU + {B634CC5E-8AC9-49EF-801F-C04AA322EEC1}.Debug|x64.Build.0 = Debug|Any CPU + {B634CC5E-8AC9-49EF-801F-C04AA322EEC1}.Debug|x86.ActiveCfg = Debug|Any CPU + {B634CC5E-8AC9-49EF-801F-C04AA322EEC1}.Debug|x86.Build.0 = Debug|Any CPU + {B634CC5E-8AC9-49EF-801F-C04AA322EEC1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B634CC5E-8AC9-49EF-801F-C04AA322EEC1}.Release|Any CPU.Build.0 = Release|Any CPU + {B634CC5E-8AC9-49EF-801F-C04AA322EEC1}.Release|x64.ActiveCfg = Release|Any CPU + {B634CC5E-8AC9-49EF-801F-C04AA322EEC1}.Release|x64.Build.0 = Release|Any CPU + {B634CC5E-8AC9-49EF-801F-C04AA322EEC1}.Release|x86.ActiveCfg = Release|Any CPU + {B634CC5E-8AC9-49EF-801F-C04AA322EEC1}.Release|x86.Build.0 = Release|Any CPU + {D3A17614-4C31-455F-ADA4-0FD746C569BE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D3A17614-4C31-455F-ADA4-0FD746C569BE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D3A17614-4C31-455F-ADA4-0FD746C569BE}.Debug|x64.ActiveCfg = Debug|Any CPU + {D3A17614-4C31-455F-ADA4-0FD746C569BE}.Debug|x64.Build.0 = Debug|Any CPU + {D3A17614-4C31-455F-ADA4-0FD746C569BE}.Debug|x86.ActiveCfg = Debug|Any CPU + {D3A17614-4C31-455F-ADA4-0FD746C569BE}.Debug|x86.Build.0 = Debug|Any CPU + {D3A17614-4C31-455F-ADA4-0FD746C569BE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D3A17614-4C31-455F-ADA4-0FD746C569BE}.Release|Any CPU.Build.0 = Release|Any CPU + {D3A17614-4C31-455F-ADA4-0FD746C569BE}.Release|x64.ActiveCfg = Release|Any CPU + {D3A17614-4C31-455F-ADA4-0FD746C569BE}.Release|x64.Build.0 = Release|Any CPU + {D3A17614-4C31-455F-ADA4-0FD746C569BE}.Release|x86.ActiveCfg = Release|Any CPU + {D3A17614-4C31-455F-ADA4-0FD746C569BE}.Release|x86.Build.0 = Release|Any CPU + {8AFB0927-456A-4EC9-A07F-65C15A03AA9E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8AFB0927-456A-4EC9-A07F-65C15A03AA9E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8AFB0927-456A-4EC9-A07F-65C15A03AA9E}.Debug|x64.ActiveCfg = Debug|Any CPU + {8AFB0927-456A-4EC9-A07F-65C15A03AA9E}.Debug|x64.Build.0 = Debug|Any CPU + {8AFB0927-456A-4EC9-A07F-65C15A03AA9E}.Debug|x86.ActiveCfg = Debug|Any CPU + {8AFB0927-456A-4EC9-A07F-65C15A03AA9E}.Debug|x86.Build.0 = Debug|Any CPU + {8AFB0927-456A-4EC9-A07F-65C15A03AA9E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8AFB0927-456A-4EC9-A07F-65C15A03AA9E}.Release|Any CPU.Build.0 = Release|Any CPU + {8AFB0927-456A-4EC9-A07F-65C15A03AA9E}.Release|x64.ActiveCfg = Release|Any CPU + {8AFB0927-456A-4EC9-A07F-65C15A03AA9E}.Release|x64.Build.0 = Release|Any CPU + {8AFB0927-456A-4EC9-A07F-65C15A03AA9E}.Release|x86.ActiveCfg = Release|Any CPU + {8AFB0927-456A-4EC9-A07F-65C15A03AA9E}.Release|x86.Build.0 = Release|Any CPU + {01E8A2FA-4591-4D85-81BE-341CA3C61A90}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {01E8A2FA-4591-4D85-81BE-341CA3C61A90}.Debug|Any CPU.Build.0 = Debug|Any CPU + {01E8A2FA-4591-4D85-81BE-341CA3C61A90}.Debug|x64.ActiveCfg = Debug|Any CPU + {01E8A2FA-4591-4D85-81BE-341CA3C61A90}.Debug|x64.Build.0 = Debug|Any CPU + {01E8A2FA-4591-4D85-81BE-341CA3C61A90}.Debug|x86.ActiveCfg = Debug|Any CPU + {01E8A2FA-4591-4D85-81BE-341CA3C61A90}.Debug|x86.Build.0 = Debug|Any CPU + {01E8A2FA-4591-4D85-81BE-341CA3C61A90}.Release|Any CPU.ActiveCfg = Release|Any CPU + {01E8A2FA-4591-4D85-81BE-341CA3C61A90}.Release|Any CPU.Build.0 = Release|Any CPU + {01E8A2FA-4591-4D85-81BE-341CA3C61A90}.Release|x64.ActiveCfg = Release|Any CPU + {01E8A2FA-4591-4D85-81BE-341CA3C61A90}.Release|x64.Build.0 = Release|Any CPU + {01E8A2FA-4591-4D85-81BE-341CA3C61A90}.Release|x86.ActiveCfg = Release|Any CPU + {01E8A2FA-4591-4D85-81BE-341CA3C61A90}.Release|x86.Build.0 = Release|Any CPU + {894DE066-00B0-44E6-88B9-46F91A17EE26}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {894DE066-00B0-44E6-88B9-46F91A17EE26}.Debug|Any CPU.Build.0 = Debug|Any CPU + {894DE066-00B0-44E6-88B9-46F91A17EE26}.Debug|x64.ActiveCfg = Debug|Any CPU + {894DE066-00B0-44E6-88B9-46F91A17EE26}.Debug|x64.Build.0 = Debug|Any CPU + {894DE066-00B0-44E6-88B9-46F91A17EE26}.Debug|x86.ActiveCfg = Debug|Any CPU + {894DE066-00B0-44E6-88B9-46F91A17EE26}.Debug|x86.Build.0 = Debug|Any CPU + {894DE066-00B0-44E6-88B9-46F91A17EE26}.Release|Any CPU.ActiveCfg = Release|Any CPU + {894DE066-00B0-44E6-88B9-46F91A17EE26}.Release|Any CPU.Build.0 = Release|Any CPU + {894DE066-00B0-44E6-88B9-46F91A17EE26}.Release|x64.ActiveCfg = Release|Any CPU + {894DE066-00B0-44E6-88B9-46F91A17EE26}.Release|x64.Build.0 = Release|Any CPU + {894DE066-00B0-44E6-88B9-46F91A17EE26}.Release|x86.ActiveCfg = Release|Any CPU + {894DE066-00B0-44E6-88B9-46F91A17EE26}.Release|x86.Build.0 = Release|Any CPU + {0684DA04-DFBA-499D-8D07-2649C3C1068D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {0684DA04-DFBA-499D-8D07-2649C3C1068D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {0684DA04-DFBA-499D-8D07-2649C3C1068D}.Debug|x64.ActiveCfg = Debug|Any CPU + {0684DA04-DFBA-499D-8D07-2649C3C1068D}.Debug|x64.Build.0 = Debug|Any CPU + {0684DA04-DFBA-499D-8D07-2649C3C1068D}.Debug|x86.ActiveCfg = Debug|Any CPU + {0684DA04-DFBA-499D-8D07-2649C3C1068D}.Debug|x86.Build.0 = Debug|Any CPU + {0684DA04-DFBA-499D-8D07-2649C3C1068D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {0684DA04-DFBA-499D-8D07-2649C3C1068D}.Release|Any CPU.Build.0 = Release|Any CPU + {0684DA04-DFBA-499D-8D07-2649C3C1068D}.Release|x64.ActiveCfg = Release|Any CPU + {0684DA04-DFBA-499D-8D07-2649C3C1068D}.Release|x64.Build.0 = Release|Any CPU + {0684DA04-DFBA-499D-8D07-2649C3C1068D}.Release|x86.ActiveCfg = Release|Any CPU + {0684DA04-DFBA-499D-8D07-2649C3C1068D}.Release|x86.Build.0 = Release|Any CPU + {66456C7C-8CE9-4E01-95A3-399B59CA3438}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {66456C7C-8CE9-4E01-95A3-399B59CA3438}.Debug|Any CPU.Build.0 = Debug|Any CPU + {66456C7C-8CE9-4E01-95A3-399B59CA3438}.Debug|x64.ActiveCfg = Debug|Any CPU + {66456C7C-8CE9-4E01-95A3-399B59CA3438}.Debug|x64.Build.0 = Debug|Any CPU + {66456C7C-8CE9-4E01-95A3-399B59CA3438}.Debug|x86.ActiveCfg = Debug|Any CPU + {66456C7C-8CE9-4E01-95A3-399B59CA3438}.Debug|x86.Build.0 = Debug|Any CPU + {66456C7C-8CE9-4E01-95A3-399B59CA3438}.Release|Any CPU.ActiveCfg = Release|Any CPU + {66456C7C-8CE9-4E01-95A3-399B59CA3438}.Release|Any CPU.Build.0 = Release|Any CPU + {66456C7C-8CE9-4E01-95A3-399B59CA3438}.Release|x64.ActiveCfg = Release|Any CPU + {66456C7C-8CE9-4E01-95A3-399B59CA3438}.Release|x64.Build.0 = Release|Any CPU + {66456C7C-8CE9-4E01-95A3-399B59CA3438}.Release|x86.ActiveCfg = Release|Any CPU + {66456C7C-8CE9-4E01-95A3-399B59CA3438}.Release|x86.Build.0 = Release|Any CPU + {BDF0389F-B502-4D71-8ADF-206A59F9D32A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BDF0389F-B502-4D71-8ADF-206A59F9D32A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BDF0389F-B502-4D71-8ADF-206A59F9D32A}.Debug|x64.ActiveCfg = Debug|Any CPU + {BDF0389F-B502-4D71-8ADF-206A59F9D32A}.Debug|x64.Build.0 = Debug|Any CPU + {BDF0389F-B502-4D71-8ADF-206A59F9D32A}.Debug|x86.ActiveCfg = Debug|Any CPU + {BDF0389F-B502-4D71-8ADF-206A59F9D32A}.Debug|x86.Build.0 = Debug|Any CPU + {BDF0389F-B502-4D71-8ADF-206A59F9D32A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BDF0389F-B502-4D71-8ADF-206A59F9D32A}.Release|Any CPU.Build.0 = Release|Any CPU + {BDF0389F-B502-4D71-8ADF-206A59F9D32A}.Release|x64.ActiveCfg = Release|Any CPU + {BDF0389F-B502-4D71-8ADF-206A59F9D32A}.Release|x64.Build.0 = Release|Any CPU + {BDF0389F-B502-4D71-8ADF-206A59F9D32A}.Release|x86.ActiveCfg = Release|Any CPU + {BDF0389F-B502-4D71-8ADF-206A59F9D32A}.Release|x86.Build.0 = Release|Any CPU + {95534D16-E720-4435-9867-5D3E2B288406}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {95534D16-E720-4435-9867-5D3E2B288406}.Debug|Any CPU.Build.0 = Debug|Any CPU + {95534D16-E720-4435-9867-5D3E2B288406}.Debug|x64.ActiveCfg = Debug|Any CPU + {95534D16-E720-4435-9867-5D3E2B288406}.Debug|x64.Build.0 = Debug|Any CPU + {95534D16-E720-4435-9867-5D3E2B288406}.Debug|x86.ActiveCfg = Debug|Any CPU + {95534D16-E720-4435-9867-5D3E2B288406}.Debug|x86.Build.0 = Debug|Any CPU + {95534D16-E720-4435-9867-5D3E2B288406}.Release|Any CPU.ActiveCfg = Release|Any CPU + {95534D16-E720-4435-9867-5D3E2B288406}.Release|Any CPU.Build.0 = Release|Any CPU + {95534D16-E720-4435-9867-5D3E2B288406}.Release|x64.ActiveCfg = Release|Any CPU + {95534D16-E720-4435-9867-5D3E2B288406}.Release|x64.Build.0 = Release|Any CPU + {95534D16-E720-4435-9867-5D3E2B288406}.Release|x86.ActiveCfg = Release|Any CPU + {95534D16-E720-4435-9867-5D3E2B288406}.Release|x86.Build.0 = Release|Any CPU + {63A928CC-792F-400A-97D3-F455C0A78B8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {63A928CC-792F-400A-97D3-F455C0A78B8F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {63A928CC-792F-400A-97D3-F455C0A78B8F}.Debug|x64.ActiveCfg = Debug|Any CPU + {63A928CC-792F-400A-97D3-F455C0A78B8F}.Debug|x64.Build.0 = Debug|Any CPU + {63A928CC-792F-400A-97D3-F455C0A78B8F}.Debug|x86.ActiveCfg = Debug|Any CPU + {63A928CC-792F-400A-97D3-F455C0A78B8F}.Debug|x86.Build.0 = Debug|Any CPU + {63A928CC-792F-400A-97D3-F455C0A78B8F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {63A928CC-792F-400A-97D3-F455C0A78B8F}.Release|Any CPU.Build.0 = Release|Any CPU + {63A928CC-792F-400A-97D3-F455C0A78B8F}.Release|x64.ActiveCfg = Release|Any CPU + {63A928CC-792F-400A-97D3-F455C0A78B8F}.Release|x64.Build.0 = Release|Any CPU + {63A928CC-792F-400A-97D3-F455C0A78B8F}.Release|x86.ActiveCfg = Release|Any CPU + {63A928CC-792F-400A-97D3-F455C0A78B8F}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {C13EDBA9-14CB-46FE-8F9F-3ABCC1A5CD3A} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {E60ADC05-55CE-46FD-9CBF-31E31FEF79D6} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {476B2742-74FD-4009-92DE-7B1214EAF244} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {E38BD375-143D-4928-8814-924597931A07} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {B0E13EEA-7E85-4265-BC1C-AFA1526FB36D} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {31B70151-7A3F-47F9-87DE-B279E93B3915} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {D345FDA8-05A0-4141-BCEF-1A11AF01480A} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {34CCB39F-37E7-46E7-AC58-E9197F4A5380} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {34522BFF-D1D8-44A3-891E-77C6BE7C81F1} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {9C20C5AB-E609-4167-922D-0E7C7C6ED1EC} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {A21D03D7-5D69-47E7-B32C-4D7067D71B0E} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {48A3DFDD-C975-42CA-87BA-3B8BAF549E22} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {D8F56A11-8961-4BD4-8846-C5483BA500F8} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {7E619CBF-B8B4-4FF6-8A73-C259FD4B0A0F} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {52055C8F-9A92-48D4-B4F7-33F287173456} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {AACC0D65-5B5D-4D38-BC24-1FADDC1A5F0F} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {DF11316F-4166-415D-B610-01603DADFED1} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {AEC73094-8FE0-419C-A7E4-4BCC7CEF2BBC} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {A42AAAA1-C8D9-4EA9-935F-A155F8B4BEE6} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {3090F751-B421-4853-829C-C0CC5ADE3D83} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {E10A7203-BCC8-4F81-A9FB-56C241BC4B33} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {4B501200-A3FD-4F3B-B8AC-582108B13A05} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {99F7E758-9327-4A16-8AB7-72B35B1D2C92} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {04C932ED-58DA-4EB9-90CD-2835C67B9952} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {7B7FBB84-21AE-4720-90BE-F9FD22AEE803} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {9D5B4D52-7E1B-4981-8994-5288262577B2} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {06091041-72DA-4C68-8FC1-AD65E495993D} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {535E8748-EC5E-41CB-94ED-ACB8A75E46AB} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {9B71BB93-4E03-4F4A-A52C-6490E9CFD99E} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {11FB37B1-F4C9-4C4F-867E-4FD9050282C7} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {2E4394A2-9863-4B60-B9EA-906FA6C46854} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {470CD0EE-3C90-462A-B003-3403AB4558A5} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {0192C192-BE48-4BC4-8308-9497407FA054} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {DB90A8A7-6E65-4388-AA9A-4FCFFF39AF30} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {823DD383-E8EB-4CF8-84BB-0EA3D6E024C3} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {BD6F4453-AE41-4578-B3FB-9F7C4617D96C} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {47E04D89-C2F0-4339-B439-E097AD1ABC09} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {10588AC3-7F69-47F3-B58D-387ED27C9A50} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {3EEBE055-DD80-4256-B71F-48C9489E2FC2} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {F871786B-8DF5-4BA7-A5CA-D128651F69AA} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {AFBA7019-7A48-42AB-9C0B-B10D8CDC8A05} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {B634CC5E-8AC9-49EF-801F-C04AA322EEC1} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {D3A17614-4C31-455F-ADA4-0FD746C569BE} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {8AFB0927-456A-4EC9-A07F-65C15A03AA9E} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {01E8A2FA-4591-4D85-81BE-341CA3C61A90} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {894DE066-00B0-44E6-88B9-46F91A17EE26} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {0684DA04-DFBA-499D-8D07-2649C3C1068D} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {66456C7C-8CE9-4E01-95A3-399B59CA3438} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {BDF0389F-B502-4D71-8ADF-206A59F9D32A} = {15FC976B-4FFC-47E1-A047-194F21C3CA9F} + {95534D16-E720-4435-9867-5D3E2B288406} = {E20BC57F-1881-40B0-BEAF-338BBDA87956} + {63A928CC-792F-400A-97D3-F455C0A78B8F} = {E20BC57F-1881-40B0-BEAF-338BBDA87956} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {C44A91F6-58D3-4900-8D5C-60E9690D5D3B} + EndGlobalSection +EndGlobal diff --git a/src/Analyzers/Analyzers/src/Microsoft.AspNetCore.Analyzers.csproj b/src/Analyzers/Analyzers/src/Microsoft.AspNetCore.Analyzers.csproj new file mode 100644 index 0000000000000000000000000000000000000000..5d67f77e3a2eff65e0ada4ff101ccbf4f24b0031 --- /dev/null +++ b/src/Analyzers/Analyzers/src/Microsoft.AspNetCore.Analyzers.csproj @@ -0,0 +1,46 @@ +<Project Sdk="Microsoft.NET.Sdk"> + <PropertyGroup> + <Description>CSharp Analyzers for ASP.NET Core.</Description> + <PackageTags>aspnetcore</PackageTags> + + <!-- + This package is for internal use only. It contains analyzers that are bundled in the .NET Core Web SDK. + + We do need to pack it so it can be picked up by the Web SDK. + --> + <IsShippingPackage>false</IsShippingPackage> + <IsPackable>true</IsPackable> + + <TargetFramework>netstandard2.0</TargetFramework> + <IncludeBuildOutput>false</IncludeBuildOutput> + <GenerateDocumentationFile>false</GenerateDocumentationFile> + <NuspecFile>$(MSBuildProjectName).nuspec</NuspecFile> + </PropertyGroup> + + <ItemGroup> + <Reference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" PrivateAssets="All" /> + </ItemGroup> + + <Target Name="PopulateNuspec" BeforeTargets="GenerateNuspec"> + + <PropertyGroup> + <NuspecProperties> + id=$(PackageId); + version=$(PackageVersion); + authors=$(Authors); + description=$(Description); + tags=$(PackageTags.Replace(';', ' ')); + licenseUrl=$(PackageLicenseUrl); + projectUrl=$(PackageProjectUrl); + iconUrl=$(PackageIconUrl); + repositoryUrl=$(RepositoryUrl); + repositoryCommit=$(SourceRevisionId); + copyright=$(Copyright); + + OutputBinary=$(OutputPath)$(AssemblyName).dll; + OutputSymbol=$(OutputPath)$(AssemblyName).pdb; + </NuspecProperties> + </PropertyGroup> + </Target> + +</Project> diff --git a/src/Analyzers/Analyzers/src/Microsoft.AspNetCore.Analyzers.nuspec b/src/Analyzers/Analyzers/src/Microsoft.AspNetCore.Analyzers.nuspec new file mode 100644 index 0000000000000000000000000000000000000000..5f9d436f73fbd73c9d29df220b605eaff359bd45 --- /dev/null +++ b/src/Analyzers/Analyzers/src/Microsoft.AspNetCore.Analyzers.nuspec @@ -0,0 +1,24 @@ +<?xml version="1.0" encoding="utf-8"?> +<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd"> + <metadata> + <id>$id$</id> + <version>$version$</version> + <authors>$authors$</authors> + <requireLicenseAcceptance>true</requireLicenseAcceptance> + <licenseUrl>$licenseUrl$</licenseUrl> + <projectUrl>$projectUrl$</projectUrl> + <iconUrl>$iconUrl$</iconUrl> + <description>$description$</description> + <copyright>$copyright$</copyright> + <tags>$tags$</tags> + <repository type="git" url="$repositoryUrl$" commit="$repositoryCommit$" /> + <dependencies> + <group targetFramework=".NETStandard1.3" /> + </dependencies> + </metadata> + + <files> + <file src="$OutputBinary$" target="analyzers\dotnet\cs\" /> + <file src="$OutputSymbol$" target="analyzers\dotnet\cs\" /> + </files> +</package> diff --git a/src/Analyzers/Analyzers/src/Properties/AssemblyInfo.cs b/src/Analyzers/Analyzers/src/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000000000000000000000000000000000..9db659780bc8b0a561cbc231610c60fbb7621bfb --- /dev/null +++ b/src/Analyzers/Analyzers/src/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("Microsoft.AspNetCore.Analyzers.Test, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] diff --git a/src/Analyzers/Analyzers/src/StartupFacts.cs b/src/Analyzers/Analyzers/src/StartupFacts.cs new file mode 100644 index 0000000000000000000000000000000000000000..a267024a053a0e46e2eb63ae5f9f2bca0200433f --- /dev/null +++ b/src/Analyzers/Analyzers/src/StartupFacts.cs @@ -0,0 +1,126 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Analyzers +{ + internal static class StartupFacts + { + public static bool IsStartupClass(StartupSymbols symbols, INamedTypeSymbol type) + { + if (symbols == null) + { + throw new ArgumentNullException(nameof(symbols)); + } + + if (type == null) + { + throw new ArgumentNullException(nameof(type)); + } + + // It's not good enough to just look for a method called ConfigureServices or Configure as a hueristic. + // ConfigureServices might not appear in trivial cases, and Configure might be named ConfigureDevelopment + // or something similar. + // + // Additionally, a startup class could be called anything and wired up explicitly. + // + // Since we already are analyzing the symbol it should be cheap to do a pass over the members. + var members = type.GetMembers(); + for (var i = 0; i < members.Length; i++) + { + if (members[i] is IMethodSymbol method && (IsConfigureServices(symbols, method) || IsConfigure(symbols, method))) + { + return true; + } + } + + return false; + } + + // Based on StartupLoader. The philosophy is that we want to do analysis only on things + // that would be recognized as a ConfigureServices method to avoid false positives. + // + // The ConfigureServices method follows the naming pattern `Configure{Environment?}Services` (ignoring case). + // The ConfigureServices method must be public. + // The ConfigureServices method can be instance or static. + // The ConfigureServices method cannot have other parameters besides IServiceCollection. + // + // The ConfigureServices method does not actually need to accept IServiceCollection + // but we exclude that case because a ConfigureServices method that doesn't accept an + // IServiceCollection can't do anything interesting to analysis. + public static bool IsConfigureServices(StartupSymbols symbols, IMethodSymbol symbol) + { + if (symbol == null) + { + throw new ArgumentNullException(nameof(symbol)); + } + + if (symbol.DeclaredAccessibility != Accessibility.Public) + { + return false; + } + + if (symbol.Name == null || + !symbol.Name.StartsWith(SymbolNames.ConfigureServicesMethodPrefix, StringComparison.OrdinalIgnoreCase) || + !symbol.Name.EndsWith(SymbolNames.ConfigureServicesMethodSuffix, StringComparison.OrdinalIgnoreCase)) + { + return false; + } + + if (symbol.Parameters.Length != 1) + { + return false; + } + + if (symbol.Parameters[0].Type != symbols.IServiceCollection) + { + return false; + } + + return true; + } + + // Based on StartupLoader. The philosophy is that we want to do analysis only on things + // that would be recognized as a Configure method to avoid false positives. + // + // The Configure method follows the naming pattern `Configure{Environment?}` (ignoring case). + // The Configure method must be public. + // The Configure method can be instance or static. + // The Configure method *can* have other parameters besides IApplicationBuilder. + // + // The Configure method does not actually need to accept IApplicationBuilder + // but we exclude that case because a Configure method that doesn't accept an + // IApplicationBuilder can't do anything interesting to analysis. + public static bool IsConfigure(StartupSymbols symbols, IMethodSymbol symbol) + { + if (symbol == null) + { + throw new ArgumentNullException(nameof(symbol)); + } + + if (symbol.DeclaredAccessibility != Accessibility.Public) + { + return false; + } + + if (symbol.Name == null || + !symbol.Name.StartsWith(SymbolNames.ConfigureMethodPrefix, StringComparison.OrdinalIgnoreCase)) + { + return false; + } + + // IApplicationBuilder can appear in any parameter, but must appear. + for (var i = 0; i < symbol.Parameters.Length; i++) + { + if (symbol.Parameters[i].Type == symbols.IApplicationBuilder) + { + return true; + } + } + + return false; + } + } +} diff --git a/src/Analyzers/Analyzers/src/StartupSymbols.cs b/src/Analyzers/Analyzers/src/StartupSymbols.cs new file mode 100644 index 0000000000000000000000000000000000000000..9b98302b4614f3531a7b7dbaebe169e50dac39b9 --- /dev/null +++ b/src/Analyzers/Analyzers/src/StartupSymbols.cs @@ -0,0 +1,22 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Analyzers +{ + internal class StartupSymbols + { + public StartupSymbols(Compilation compilation) + { + IApplicationBuilder = compilation.GetTypeByMetadataName(SymbolNames.IApplicationBuilder.MetadataName); + IServiceCollection = compilation.GetTypeByMetadataName(SymbolNames.IServiceCollection.MetadataName); + } + + public bool HasRequiredSymbols => IApplicationBuilder != null && IServiceCollection != null; + + public INamedTypeSymbol IApplicationBuilder { get; } + + public INamedTypeSymbol IServiceCollection { get; } + } +} diff --git a/src/Analyzers/Analyzers/src/SymbolNames.cs b/src/Analyzers/Analyzers/src/SymbolNames.cs new file mode 100644 index 0000000000000000000000000000000000000000..0aff8e073840635b52bf857e736a3d861c333988 --- /dev/null +++ b/src/Analyzers/Analyzers/src/SymbolNames.cs @@ -0,0 +1,26 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Analyzers +{ + internal static class SymbolNames + { + public const string ConfigureServicesMethodPrefix = "Configure"; + + public const string ConfigureServicesMethodSuffix = "Services"; + + public const string ConfigureMethodPrefix = "Configure"; + + public static class IApplicationBuilder + { + public const string MetadataName = "Microsoft.AspNetCore.Builder.IApplicationBuilder"; + } + + public static class IServiceCollection + { + public const string MetadataName = "Microsoft.Extensions.DependencyInjection.IServiceCollection"; + } + } +} diff --git a/src/Analyzers/Analyzers/test/AnalyzerTestBase.cs b/src/Analyzers/Analyzers/test/AnalyzerTestBase.cs new file mode 100644 index 0000000000000000000000000000000000000000..85b0e4b31b57585991453d58c4edfa09b273df03 --- /dev/null +++ b/src/Analyzers/Analyzers/test/AnalyzerTestBase.cs @@ -0,0 +1,59 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Analyzer.Testing; +using Microsoft.AspNetCore.Testing; +using Microsoft.AspNetCore.Testing.xunit; +using Microsoft.CodeAnalysis; + +namespace Microsoft.AspNetCore.Analyzers +{ + public abstract class AnalyzerTestBase + { + private static readonly string ProjectDirectory = GetProjectDirectory(); + + public TestSource Read(string source) + { + var filePath = Path.Combine(ProjectDirectory, "TestFiles", GetType().Name, source); + if (!File.Exists(filePath)) + { + throw new FileNotFoundException($"TestFile {source} could not be found at {filePath}.", filePath); + } + + var fileContent = File.ReadAllText(filePath); + return TestSource.Read(fileContent); + } + + public Project CreateProject(string source) + { + if (!source.EndsWith(".cs")) + { + source = source + ".cs"; + } + + var read = Read(source); + return DiagnosticProject.Create(GetType().Assembly, new[] { read.Source, }); + } + + public Task<Compilation> CreateCompilationAsync(string source) + { + return CreateProject(source).GetCompilationAsync(); + } + + private static string GetProjectDirectory() + { + // On helix we use the published test files + if (SkipOnHelixAttribute.OnHelix()) + { + return AppContext.BaseDirectory; + } + + var solutionDirectory = TestPathUtilities.GetSolutionRootDirectory("Analyzers"); + var projectDirectory = Path.Combine(solutionDirectory, "Analyzers", "test"); + return projectDirectory; + } + } +} diff --git a/src/Analyzers/Analyzers/test/Microsoft.AspNetCore.Analyzers.Test.csproj b/src/Analyzers/Analyzers/test/Microsoft.AspNetCore.Analyzers.Test.csproj new file mode 100644 index 0000000000000000000000000000000000000000..59b34f4d466efa9e378d42080e14538e211a39b4 --- /dev/null +++ b/src/Analyzers/Analyzers/test/Microsoft.AspNetCore.Analyzers.Test.csproj @@ -0,0 +1,30 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFramework>netcoreapp3.0</TargetFramework> + <PreserveCompilationContext>true</PreserveCompilationContext> + <RootNamespace>Microsoft.AspNetCore.Analyzers</RootNamespace> + <!-- https://github.com/aspnet/AspNetCore/issues/6549 --> + <BuildHelixPayload>false</BuildHelixPayload> + </PropertyGroup> + + <ItemGroup> + <Compile Include="$(SharedSourceRoot)test\SkipOnHelixAttribute.cs" /> + <Content Include="TestFiles\**\*.*" CopyToPublishDirectory="PreserveNewest" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\src\Microsoft.AspNetCore.Analyzers.csproj" /> + + <Reference Include="Microsoft.AspNetCore.Analyzer.Testing" /> + <Reference Include="Microsoft.CodeAnalysis.CSharp.Workspaces" /> + + <!-- + These tests include startup code for most parts of our stack. This list will grow as we add more. + --> + <Reference Include="Microsoft.AspNetCore.Components.Server" /> + <Reference Include="Microsoft.AspNetCore.Mvc" /> + <Reference Include="Microsoft.AspNetCore.SignalR" /> + </ItemGroup> + +</Project> diff --git a/src/Analyzers/Analyzers/test/StartupFactsTest.cs b/src/Analyzers/Analyzers/test/StartupFactsTest.cs new file mode 100644 index 0000000000000000000000000000000000000000..b7a25e85a38f189f38ad91c597aa76eab011d7e5 --- /dev/null +++ b/src/Analyzers/Analyzers/test/StartupFactsTest.cs @@ -0,0 +1,142 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Analyzers.TestFiles.StartupFactsTest; +using Microsoft.CodeAnalysis; +using Xunit; + +namespace Microsoft.AspNetCore.Analyzers +{ + public class StartupFactsTest : AnalyzerTestBase + { + [Theory] + [InlineData(nameof(BasicStartup), nameof(BasicStartup.ConfigureServices))] + [InlineData(nameof(EnvironmentStartup), nameof(EnvironmentStartup.ConfigureDevelopmentServices))] + [InlineData(nameof(EnvironmentStartup), nameof(EnvironmentStartup.configurePRODUCTIONservices))] + public async Task IsConfigureServices_FindsConfigureServicesMethod(string source, string methodName) + { + // Arrange + var compilation = await CreateCompilationAsync(source); + var symbols = new StartupSymbols(compilation); + + var type = (INamedTypeSymbol)compilation.GetSymbolsWithName(source).Single(); + var methods = type.GetMembers(methodName).Cast<IMethodSymbol>(); + + foreach (var method in methods) + { + // Act + var result = StartupFacts.IsConfigureServices(symbols, method); + + // Assert + Assert.True(result); + } + } + + [Theory] + [InlineData(nameof(NotAStartupClass), nameof(NotAStartupClass.ConfigureServices))] + [InlineData(nameof(NotAStartupClass), nameof(NotAStartupClass.ConfigureSrvces))] + + // This is an interesting case where a method follows both naming conventions. + [InlineData(nameof(EnvironmentStartup), nameof(EnvironmentStartup.ConfigureDevelopmentServices2))] + public async Task IsConfigureServices_RejectsNonConfigureServicesMethod(string source, string methodName) + { + // Arrange + var compilation = await CreateCompilationAsync(source); + var symbols = new StartupSymbols(compilation); + + var type = (INamedTypeSymbol)compilation.GetSymbolsWithName(source).Single(); + var methods = type.GetMembers(methodName).Cast<IMethodSymbol>(); + + foreach (var method in methods) + { + // Act + var result = StartupFacts.IsConfigureServices(symbols, method); + + // Assert + Assert.False(result); + } + } + + [Theory] + [InlineData(nameof(BasicStartup), nameof(BasicStartup.Configure))] + [InlineData(nameof(EnvironmentStartup), nameof(EnvironmentStartup.configurePRODUCTION))] + [InlineData(nameof(EnvironmentStartup), nameof(EnvironmentStartup.ConfigureDevelopmentServices2))] + public async Task IsConfigure_FindsConfigureMethod(string source, string methodName) + { + // Arrange + var compilation = await CreateCompilationAsync(source); + var symbols = new StartupSymbols(compilation); + + var type = (INamedTypeSymbol)compilation.GetSymbolsWithName(source).Single(); + var methods = type.GetMembers(methodName).Cast<IMethodSymbol>(); + + foreach (var method in methods) + { + // Act + var result = StartupFacts.IsConfigure(symbols, method); + + // Assert + Assert.True(result); + } + } + + [Theory] + [InlineData(nameof(NotAStartupClass), nameof(NotAStartupClass.Configure))] + [InlineData(nameof(NotAStartupClass), nameof(NotAStartupClass.Configur))] + public async Task IsConfigure_RejectsNonConfigureMethod(string source, string methodName) + { + // Arrange + var compilation = await CreateCompilationAsync(source); + var symbols = new StartupSymbols(compilation); + + var type = (INamedTypeSymbol)compilation.GetSymbolsWithName(source).Single(); + var methods = type.GetMembers(methodName).Cast<IMethodSymbol>(); + + foreach (var method in methods) + { + // Act + var result = StartupFacts.IsConfigure(symbols, method); + + // Assert + Assert.False(result); + } + } + + [Theory] + [InlineData(nameof(BasicStartup))] + [InlineData(nameof(EnvironmentStartup))] + public async Task IsStartupClass_FindsStartupClass(string source) + { + // Arrange + var compilation = await CreateCompilationAsync(source); + var symbols = new StartupSymbols(compilation); + + var type = (INamedTypeSymbol)compilation.GetSymbolsWithName(source).Single(); + + // Act + var result = StartupFacts.IsStartupClass(symbols, type); + + // Assert + Assert.True(result); + } + + [Theory] + [InlineData(nameof(NotAStartupClass))] + public async Task IsStartupClass_RejectsNotStartupClass(string source) + { + // Arrange + var compilation = await CreateCompilationAsync(source); + var symbols = new StartupSymbols(compilation); + + var type = (INamedTypeSymbol)compilation.GetSymbolsWithName(source).Single(); + + // Act + var result = StartupFacts.IsStartupClass(symbols, type); + + // Assert + Assert.False(result); + } + } +} diff --git a/src/Analyzers/Analyzers/test/TestFiles/StartupFactsTest/BasicStartup.cs b/src/Analyzers/Analyzers/test/TestFiles/StartupFactsTest/BasicStartup.cs new file mode 100644 index 0000000000000000000000000000000000000000..7447e5e001e59ff340916933f7d11deeeb2ebacd --- /dev/null +++ b/src/Analyzers/Analyzers/test/TestFiles/StartupFactsTest/BasicStartup.cs @@ -0,0 +1,19 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.AspNetCore.Analyzers.TestFiles.StartupFactsTest +{ + public class BasicStartup + { + public void ConfigureServices(IServiceCollection services) + { + } + + public void Configure(IApplicationBuilder app) + { + } + } +} diff --git a/src/Analyzers/Analyzers/test/TestFiles/StartupFactsTest/EnvironmentStartup.cs b/src/Analyzers/Analyzers/test/TestFiles/StartupFactsTest/EnvironmentStartup.cs new file mode 100644 index 0000000000000000000000000000000000000000..434a451277d883d474ef919e7a6ee9f626469cc9 --- /dev/null +++ b/src/Analyzers/Analyzers/test/TestFiles/StartupFactsTest/EnvironmentStartup.cs @@ -0,0 +1,30 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace Microsoft.AspNetCore.Analyzers.TestFiles.StartupFactsTest +{ + public class EnvironmentStartup + { + public void ConfigureDevelopmentServices(IServiceCollection services) + { + } + + public void configurePRODUCTIONservices(IServiceCollection services) + { + } + + // Yes, this is technically a Configure method - if you have an Enviroment called DevelopmentServices2. + public static void ConfigureDevelopmentServices2(IConfiguration configuration, ILogger logger, IApplicationBuilder app) + { + } + + public static void configurePRODUCTION(IConfiguration configuration, ILogger logger, IApplicationBuilder app) + { + } + } +} diff --git a/src/Analyzers/Analyzers/test/TestFiles/StartupFactsTest/NotAStartupClass.cs b/src/Analyzers/Analyzers/test/TestFiles/StartupFactsTest/NotAStartupClass.cs new file mode 100644 index 0000000000000000000000000000000000000000..74948f1e72d0d6cbf11cdafe278e51be6991a51e --- /dev/null +++ b/src/Analyzers/Analyzers/test/TestFiles/StartupFactsTest/NotAStartupClass.cs @@ -0,0 +1,47 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; + +namespace Microsoft.AspNetCore.Analyzers.TestFiles.StartupFactsTest +{ + public class NotAStartupClass + { + // no args - not a ConfigureServices (technically it is, but we exclude this case). + public void ConfigureServices() + { + } + + // extra arg - not a ConfigureServices + public void ConfigureServices(IServiceCollection services, string x) + { + } + + // wrong name - not a ConfigureServices + public void ConfigureSrvces(IServiceCollection services) + { + } + + // non-public - not a ConfigureServices + internal void ConfigureServices(IServiceCollection services) + { + } + + // no IApplicationBuilder - not a Configure + public void Configure(IConfiguration configuration) + { + } + + // wrong prefix - not a Configure + public void Configur(IApplicationBuilder app) + { + } + + // non-public - not a Configure + internal void Configure(IApplicationBuilder app) + { + } + } +} diff --git a/src/Analyzers/build.cmd b/src/Analyzers/build.cmd new file mode 100644 index 0000000000000000000000000000000000000000..033fe6f6146851cbeaf23c53a480a594dc9ac421 --- /dev/null +++ b/src/Analyzers/build.cmd @@ -0,0 +1,3 @@ +@ECHO OFF +SET RepoRoot=%~dp0..\.. +%RepoRoot%\build.cmd -projects %~dp0\**\*.*proj %* diff --git a/src/Analyzers/build.sh b/src/Analyzers/build.sh new file mode 100644 index 0000000000000000000000000000000000000000..7046bb98a0fc242399a70d813c1eb51fa8dbd462 --- /dev/null +++ b/src/Analyzers/build.sh @@ -0,0 +1,7 @@ +#!/usr/bin/env bash + +set -euo pipefail + +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +repo_root="$DIR/../.." +"$repo_root/build.sh" --projects "$DIR/**/*.*proj" "$@" diff --git a/src/Analyzers/shared/FeatureDetection/Microsoft.AspNetCore.Analyzers.FeatureDetection.Sources.csproj b/src/Analyzers/shared/FeatureDetection/Microsoft.AspNetCore.Analyzers.FeatureDetection.Sources.csproj new file mode 100644 index 0000000000000000000000000000000000000000..81c027292be71d9a22e16d7482df4bfa671691c0 --- /dev/null +++ b/src/Analyzers/shared/FeatureDetection/Microsoft.AspNetCore.Analyzers.FeatureDetection.Sources.csproj @@ -0,0 +1,53 @@ +<Project> + + <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" /> + + <PropertyGroup> + <!-- This does not represent the TFM for the code. It's only here because /t:Pack requires it. --> + <TargetFramework>netstandard1.0</TargetFramework> + <IsPackable>true</IsPackable> + <IsShipping>false</IsShipping> + <NoBuild>true</NoBuild> + <GeneratePackageOnBuild>true</GeneratePackageOnBuild> + <GenerateAssemblyInfo>false</GenerateAssemblyInfo> + <EnableDefaultItems>false</EnableDefaultItems> + <IncludeBuildOutput>false</IncludeBuildOutput> + <IncludeSymbols>false</IncludeSymbols> + <ContentTargetFolders>contentFiles</ContentTargetFolders> + <DisableImplicitFrameworkReferences>true</DisableImplicitFrameworkReferences> + <DefaultExcludeItems>$(DefaultExcludeItems);$(BaseOutputPath);$(BaseIntermediateOutputPath);</DefaultExcludeItems> + <NoWarn>$(NoWarn);NU5105;CS8021</NoWarn> + <IsProjectReferenceProvider>false</IsProjectReferenceProvider> + </PropertyGroup> + + <ItemGroup> + <Compile Include="$(MSBuildProjectDirectory)\**\*.cs" Exclude="$(DefaultExcludeItems)"> + <Pack>true</Pack> + <PackagePath>$(ContentTargetFolders)\cs\netstandard1.0\shared\</PackagePath> + </Compile> + </ItemGroup> + + <ItemGroup> + <Compile Include="../../Analyzers/src/StartupFacts.cs"> + <Link>%(FileName)%(Extension)</Link> + <Pack>true</Pack> + <PackagePath>$(ContentTargetFolders)\cs\netstandard1.0\shared\</PackagePath> + </Compile> + <Compile Include="../../Analyzers/src/StartupSymbols.cs"> + <Link>%(FileName)%(Extension)</Link> + <Pack>true</Pack> + <PackagePath>$(ContentTargetFolders)\cs\netstandard1.0\shared\</PackagePath> + </Compile> + <Compile Include="../../Analyzers/src/SymbolNames.cs"> + <Link>%(FileName)%(Extension)</Link> + <Pack>true</Pack> + <PackagePath>$(ContentTargetFolders)\cs\netstandard1.0\shared\</PackagePath> + </Compile> + </ItemGroup> + + <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" /> + + <!-- This project does not produce a binary. Disable the compiler. --> + <Target Name="Compile" /> + <Target Name="CopyFilesToOutputDirectory" /> +</Project> diff --git a/src/Analyzers/startvs.cmd b/src/Analyzers/startvs.cmd new file mode 100644 index 0000000000000000000000000000000000000000..9f4a9fdee9999c086633e44c58246f725613d362 --- /dev/null +++ b/src/Analyzers/startvs.cmd @@ -0,0 +1,3 @@ +@ECHO OFF + +%~dp0..\..\startvs.cmd %~dp0Analyzers.sln diff --git a/src/Components/Analyzers/src/Microsoft.AspNetCore.Components.Analyzers.csproj b/src/Components/Analyzers/src/Microsoft.AspNetCore.Components.Analyzers.csproj index 3ad086e33b15a4583fec287b50b8f75102a38fdb..abd1e5e519c01420f36ea9f82a3776f1f5382245 100644 --- a/src/Components/Analyzers/src/Microsoft.AspNetCore.Components.Analyzers.csproj +++ b/src/Components/Analyzers/src/Microsoft.AspNetCore.Components.Analyzers.csproj @@ -1,7 +1,7 @@ <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> - <TargetFramework>netstandard1.3</TargetFramework> + <TargetFramework>netstandard2.0</TargetFramework> <IncludeBuildOutput>false</IncludeBuildOutput> <NoPackageAnalysis>true</NoPackageAnalysis> <GenerateDocumentationFile>false</GenerateDocumentationFile> diff --git a/src/Mvc/Mvc.Analyzers/src/Microsoft.AspNetCore.Mvc.Analyzers.csproj b/src/Mvc/Mvc.Analyzers/src/Microsoft.AspNetCore.Mvc.Analyzers.csproj index 83e63858149bafa5736fbe7f93cd6e792fa12420..1e92917e80e974d716d8a773bb8a20e0b46a8ef6 100644 --- a/src/Mvc/Mvc.Analyzers/src/Microsoft.AspNetCore.Mvc.Analyzers.csproj +++ b/src/Mvc/Mvc.Analyzers/src/Microsoft.AspNetCore.Mvc.Analyzers.csproj @@ -5,7 +5,7 @@ <!-- This package is for internal use only. It contains analyzers that are bundled in the .NET Core WebSDK. --> <IsShippingPackage>false</IsShippingPackage> - <TargetFramework>netstandard1.3</TargetFramework> + <TargetFramework>netstandard2.0</TargetFramework> <IncludeBuildOutput>false</IncludeBuildOutput> <GenerateDocumentationFile>false</GenerateDocumentationFile> <NuspecFile>$(MSBuildProjectName).nuspec</NuspecFile> diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/StartupAnalysisContext.cs b/src/Mvc/Mvc.Analyzers/src/Startup/StartupAnalysisContext.cs index 9d2ff14ba1dc832d56ecf47fc992c11c01f00eff..12dc164ba9b61fc6e2e00d5437a77547dc4b8762 100644 --- a/src/Mvc/Mvc.Analyzers/src/Startup/StartupAnalysisContext.cs +++ b/src/Mvc/Mvc.Analyzers/src/Startup/StartupAnalysisContext.cs @@ -7,6 +7,7 @@ namespace Microsoft.AspNetCore.Analyzers { internal class StartupAnalysisContext { +#pragma warning disable RS1012 // Start action has no registered actions. public StartupAnalysisContext(OperationBlockStartAnalysisContext operationBlockStartAnalysisContext, StartupSymbols startupSymbols) { OperationBlockStartAnalysisContext = operationBlockStartAnalysisContext; @@ -16,5 +17,6 @@ namespace Microsoft.AspNetCore.Analyzers public OperationBlockStartAnalysisContext OperationBlockStartAnalysisContext { get; } public StartupSymbols StartupSymbols { get; } +#pragma warning restore RS1012 // Start action has no registered actions. } } diff --git a/src/Mvc/Mvc.Analyzers/src/Startup/StartupAnalzyer.cs b/src/Mvc/Mvc.Analyzers/src/Startup/StartupAnalzyer.cs index be2a9ebb8805b0310e491d84bd6094055c959ea4..983ad54a5043a9a38115e992a60ae8e2ed2c2bc7 100644 --- a/src/Mvc/Mvc.Analyzers/src/Startup/StartupAnalzyer.cs +++ b/src/Mvc/Mvc.Analyzers/src/Startup/StartupAnalzyer.cs @@ -131,7 +131,7 @@ namespace Microsoft.AspNetCore.Analyzers OnConfigureMethodFound(method); } } - +#pragma warning disable RS1012 // Start action has no registered actions. private bool IsStartupFile(OperationBlockStartAnalysisContext context) { foreach (var location in context.OwningSymbol.Locations) @@ -144,5 +144,6 @@ namespace Microsoft.AspNetCore.Analyzers return false; } +#pragma warning restore RS1012 // Start action has no registered actions. } } diff --git a/src/Mvc/Mvc.Api.Analyzers/src/AddResponseTypeAttributeCodeFixAction.cs b/src/Mvc/Mvc.Api.Analyzers/src/AddResponseTypeAttributeCodeFixAction.cs index d138d6afb15ca96d0decb8aa5d1d01e7f27a73ea..18b82c2ae1b6fd5b8e22c3d629c7e2a52442f90e 100644 --- a/src/Mvc/Mvc.Api.Analyzers/src/AddResponseTypeAttributeCodeFixAction.cs +++ b/src/Mvc/Mvc.Api.Analyzers/src/AddResponseTypeAttributeCodeFixAction.cs @@ -37,6 +37,8 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers _diagnostic = diagnostic; } + public override string EquivalenceKey => _diagnostic.Location.ToString(); + public override string Title => "Add ProducesResponseType attributes."; protected override async Task<Document> GetChangedDocumentAsync(CancellationToken cancellationToken) diff --git a/src/Mvc/Mvc.Api.Analyzers/src/AddResponseTypeAttributeCodeFixProvider.cs b/src/Mvc/Mvc.Api.Analyzers/src/AddResponseTypeAttributeCodeFixProvider.cs index a5a2a626137f4a6e980408b19a2da60e4ca564ff..bd9734e0b2ad50782013429db3d49156cdd6cff7 100644 --- a/src/Mvc/Mvc.Api.Analyzers/src/AddResponseTypeAttributeCodeFixProvider.cs +++ b/src/Mvc/Mvc.Api.Analyzers/src/AddResponseTypeAttributeCodeFixProvider.cs @@ -17,6 +17,8 @@ namespace Microsoft.AspNetCore.Mvc.Api.Analyzers ApiDiagnosticDescriptors.API1000_ActionReturnsUndocumentedStatusCode.Id, ApiDiagnosticDescriptors.API1001_ActionReturnsUndocumentedSuccessResult.Id); + public override FixAllProvider GetFixAllProvider() => WellKnownFixAllProviders.BatchFixer; + public sealed override Task RegisterCodeFixesAsync(CodeFixContext context) { if (context.Diagnostics.Length == 0) diff --git a/src/Mvc/Mvc.Api.Analyzers/src/Microsoft.AspNetCore.Mvc.Api.Analyzers.csproj b/src/Mvc/Mvc.Api.Analyzers/src/Microsoft.AspNetCore.Mvc.Api.Analyzers.csproj index ad062a74033127041b4b89f6fad32342c8c3ec42..f5efb230a265584bd7d25e78cfb0c5cea49879db 100644 --- a/src/Mvc/Mvc.Api.Analyzers/src/Microsoft.AspNetCore.Mvc.Api.Analyzers.csproj +++ b/src/Mvc/Mvc.Api.Analyzers/src/Microsoft.AspNetCore.Mvc.Api.Analyzers.csproj @@ -5,7 +5,7 @@ <!-- This package is for internal use only. It contains analyzers that are bundled in the .NET Core WebSDK. --> <IsShippingPackage>false</IsShippingPackage> - <TargetFramework>netstandard1.3</TargetFramework> + <TargetFramework>netstandard2.0</TargetFramework> <IncludeBuildOutput>false</IncludeBuildOutput> <GenerateDocumentationFile>false</GenerateDocumentationFile> <NuspecFile>$(MSBuildProjectName).nuspec</NuspecFile>