diff --git a/WindowsAppRuntime.sln b/WindowsAppRuntime.sln
index 256c372b50..030712d2d3 100644
--- a/WindowsAppRuntime.sln
+++ b/WindowsAppRuntime.sln
@@ -249,12 +249,38 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Framework.Widgets", "test\D
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "DynamicDependencyLifetimeManagerShadow", "dev\DynamicDependency\DynamicDependencyLifetimeManagerShadow\DynamicDependencyLifetimeManagerShadow.vcxproj", "{6539E9E1-BF36-40E5-86BC-070E99DB7B7B}"
EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ToastNotifications", "dev\ToastNotifications\ToastNotifications.vcxitems", "{53A85993-86AA-4818-AE5C-D5FB6FA71C89}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ToastNotificationTests", "test\ToastNotificationTests\ToastNotificationTests.vcxproj", "{E977B1BD-00DC-4085-A105-E0A18E0183D7}"
+ ProjectSection(ProjectDependencies) = postProject
+ {B73AD907-6164-4294-88FB-F3C9C10DA1F1} = {B73AD907-6164-4294-88FB-F3C9C10DA1F1}
+ {A7391725-4EF5-438F-8DE1-645423E46955} = {A7391725-4EF5-438F-8DE1-645423E46955}
+ {D6A64926-4988-4C64-A5A8-2C14B1388696} = {D6A64926-4988-4C64-A5A8-2C14B1388696}
+ {9C1A6C58-52D6-4514-9120-5C339C5DF4BE} = {9C1A6C58-52D6-4514-9120-5C339C5DF4BE}
+ {F76B776E-86F5-48C5-8FC7-D2795ECC9746} = {F76B776E-86F5-48C5-8FC7-D2795ECC9746}
+ {4B30C685-8490-440F-9879-A75D45DAA361} = {4B30C685-8490-440F-9879-A75D45DAA361}
+ {B71E818A-882E-456A-87E5-4DE4A6602B99} = {B71E818A-882E-456A-87E5-4DE4A6602B99}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ToastNotificationsTestApp", "test\TestApps\ToastNotificationsTestApp\ToastNotificationsTestApp.vcxproj", "{4B30C685-8490-440F-9879-A75D45DAA361}"
+ ProjectSection(ProjectDependencies) = postProject
+ {B73AD907-6164-4294-88FB-F3C9C10DA1F1} = {B73AD907-6164-4294-88FB-F3C9C10DA1F1}
+ {A7391725-4EF5-438F-8DE1-645423E46955} = {A7391725-4EF5-438F-8DE1-645423E46955}
+ {9C1A6C58-52D6-4514-9120-5C339C5DF4BE} = {9C1A6C58-52D6-4514-9120-5C339C5DF4BE}
+ {F76B776E-86F5-48C5-8FC7-D2795ECC9746} = {F76B776E-86F5-48C5-8FC7-D2795ECC9746}
+ {B71E818A-882E-456A-87E5-4DE4A6602B99} = {B71E818A-882E-456A-87E5-4DE4A6602B99}
+ EndProjectSection
+EndProject
+Project("{C7167F0D-BC9F-4E6E-AFE1-012C56B48DB5}") = "ToastNotificationsTestAppPackage", "test\TestApps\ToastNotificationsTestAppPackage\ToastNotificationsTestAppPackage.wapproj", "{D6A64926-4988-4C64-A5A8-2C14B1388696}"
+EndProject
Global
GlobalSection(SharedMSBuildProjectFiles) = preSolution
test\inc\inc.vcxitems*{0a5fee93-48b7-40ec-bb9a-b27d11060da9}*SharedItemsImports = 4
dev\PushNotifications\PushNotifications.vcxitems*{103c0c23-7ba8-4d44-a63c-83488e2e3a81}*SharedItemsImports = 9
test\inc\inc.vcxitems*{2cd5cd9b-cf45-4fa7-9769-ee4e02426bf0}*SharedItemsImports = 4
dev\EnvironmentManager\API\Microsoft.Process.Environment.vcxitems*{2f3fad1b-d3df-4866-a3a3-c2c777d55638}*SharedItemsImports = 9
+ test\inc\inc.vcxitems*{4b30c685-8490-440f-9879-a75d45daa361}*SharedItemsImports = 4
+ dev\ToastNotifications\ToastNotifications.vcxitems*{53a85993-86aa-4818-ae5c-d5fb6fa71c89}*SharedItemsImports = 9
dev\UndockedRegFreeWinRT\UndockedRegFreeWinRT.vcxitems*{56371ca6-144b-4989-a4e9-391ad4fa7651}*SharedItemsImports = 9
test\inc\inc.vcxitems*{56a1d696-feda-4333-bf37-772ebececb10}*SharedItemsImports = 4
test\inc\inc.vcxitems*{5b2d17fe-c371-417f-860c-3d32397c2404}*SharedItemsImports = 4
@@ -273,20 +299,25 @@ Global
dev\EnvironmentManager\ChangeTracker\ChangeTracker.vcxitems*{e15c3465-9d45-495d-92ce-b91ef45e8623}*SharedItemsImports = 9
dev\AppLifecycle\AppLifecycle.vcxitems*{e3a522a3-6635-4a42-bded-1af46a15f63c}*SharedItemsImports = 9
test\inc\inc.vcxitems*{e5659a29-fe68-417b-9bc5-613073dd54df}*SharedItemsImports = 4
+ test\inc\inc.vcxitems*{e977b1bd-00dc-4085-a105-e0a18e0183d7}*SharedItemsImports = 4
dev\Common\Common.vcxitems*{f76b776e-86f5-48c5-8fc7-d2795ecc9746}*SharedItemsImports = 4
EndGlobalSection
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
+ Debug|ARM = Debug|ARM
Debug|ARM64 = Debug|ARM64
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
+ Release|ARM = Release|ARM
Release|ARM64 = Release|ARM64
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B73AD907-6164-4294-88FB-F3C9C10DA1F1}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {B73AD907-6164-4294-88FB-F3C9C10DA1F1}.Debug|ARM.ActiveCfg = Debug|ARM
+ {B73AD907-6164-4294-88FB-F3C9C10DA1F1}.Debug|ARM.Build.0 = Debug|ARM
{B73AD907-6164-4294-88FB-F3C9C10DA1F1}.Debug|ARM64.ActiveCfg = Debug|ARM64
{B73AD907-6164-4294-88FB-F3C9C10DA1F1}.Debug|ARM64.Build.0 = Debug|ARM64
{B73AD907-6164-4294-88FB-F3C9C10DA1F1}.Debug|x64.ActiveCfg = Debug|x64
@@ -294,6 +325,8 @@ Global
{B73AD907-6164-4294-88FB-F3C9C10DA1F1}.Debug|x86.ActiveCfg = Debug|Win32
{B73AD907-6164-4294-88FB-F3C9C10DA1F1}.Debug|x86.Build.0 = Debug|Win32
{B73AD907-6164-4294-88FB-F3C9C10DA1F1}.Release|Any CPU.ActiveCfg = Release|Win32
+ {B73AD907-6164-4294-88FB-F3C9C10DA1F1}.Release|ARM.ActiveCfg = Release|ARM
+ {B73AD907-6164-4294-88FB-F3C9C10DA1F1}.Release|ARM.Build.0 = Release|ARM
{B73AD907-6164-4294-88FB-F3C9C10DA1F1}.Release|ARM64.ActiveCfg = Release|ARM64
{B73AD907-6164-4294-88FB-F3C9C10DA1F1}.Release|ARM64.Build.0 = Release|ARM64
{B73AD907-6164-4294-88FB-F3C9C10DA1F1}.Release|x64.ActiveCfg = Release|x64
@@ -301,6 +334,8 @@ Global
{B73AD907-6164-4294-88FB-F3C9C10DA1F1}.Release|x86.ActiveCfg = Release|Win32
{B73AD907-6164-4294-88FB-F3C9C10DA1F1}.Release|x86.Build.0 = Release|Win32
{7C502995-59C3-483B-86BA-815985353633}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {7C502995-59C3-483B-86BA-815985353633}.Debug|ARM.ActiveCfg = Debug|ARM
+ {7C502995-59C3-483B-86BA-815985353633}.Debug|ARM.Build.0 = Debug|ARM
{7C502995-59C3-483B-86BA-815985353633}.Debug|ARM64.ActiveCfg = Debug|ARM64
{7C502995-59C3-483B-86BA-815985353633}.Debug|ARM64.Build.0 = Debug|ARM64
{7C502995-59C3-483B-86BA-815985353633}.Debug|x64.ActiveCfg = Debug|x64
@@ -308,6 +343,8 @@ Global
{7C502995-59C3-483B-86BA-815985353633}.Debug|x86.ActiveCfg = Debug|Win32
{7C502995-59C3-483B-86BA-815985353633}.Debug|x86.Build.0 = Debug|Win32
{7C502995-59C3-483B-86BA-815985353633}.Release|Any CPU.ActiveCfg = Release|Win32
+ {7C502995-59C3-483B-86BA-815985353633}.Release|ARM.ActiveCfg = Release|ARM
+ {7C502995-59C3-483B-86BA-815985353633}.Release|ARM.Build.0 = Release|ARM
{7C502995-59C3-483B-86BA-815985353633}.Release|ARM64.ActiveCfg = Release|ARM64
{7C502995-59C3-483B-86BA-815985353633}.Release|ARM64.Build.0 = Release|ARM64
{7C502995-59C3-483B-86BA-815985353633}.Release|x64.ActiveCfg = Release|x64
@@ -315,18 +352,24 @@ Global
{7C502995-59C3-483B-86BA-815985353633}.Release|x86.ActiveCfg = Release|Win32
{7C502995-59C3-483B-86BA-815985353633}.Release|x86.Build.0 = Release|Win32
{6BAC3B29-3A6B-4B3F-A9AB-A316AA4E48ED}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {6BAC3B29-3A6B-4B3F-A9AB-A316AA4E48ED}.Debug|ARM.ActiveCfg = Debug|ARM
+ {6BAC3B29-3A6B-4B3F-A9AB-A316AA4E48ED}.Debug|ARM.Build.0 = Debug|ARM
{6BAC3B29-3A6B-4B3F-A9AB-A316AA4E48ED}.Debug|ARM64.ActiveCfg = Debug|ARM64
{6BAC3B29-3A6B-4B3F-A9AB-A316AA4E48ED}.Debug|x64.ActiveCfg = Debug|x64
{6BAC3B29-3A6B-4B3F-A9AB-A316AA4E48ED}.Debug|x64.Build.0 = Debug|x64
{6BAC3B29-3A6B-4B3F-A9AB-A316AA4E48ED}.Debug|x86.ActiveCfg = Debug|Win32
{6BAC3B29-3A6B-4B3F-A9AB-A316AA4E48ED}.Debug|x86.Build.0 = Debug|Win32
{6BAC3B29-3A6B-4B3F-A9AB-A316AA4E48ED}.Release|Any CPU.ActiveCfg = Release|Win32
+ {6BAC3B29-3A6B-4B3F-A9AB-A316AA4E48ED}.Release|ARM.ActiveCfg = Release|ARM
+ {6BAC3B29-3A6B-4B3F-A9AB-A316AA4E48ED}.Release|ARM.Build.0 = Release|ARM
{6BAC3B29-3A6B-4B3F-A9AB-A316AA4E48ED}.Release|ARM64.ActiveCfg = Release|ARM64
{6BAC3B29-3A6B-4B3F-A9AB-A316AA4E48ED}.Release|x64.ActiveCfg = Release|x64
{6BAC3B29-3A6B-4B3F-A9AB-A316AA4E48ED}.Release|x64.Build.0 = Release|x64
{6BAC3B29-3A6B-4B3F-A9AB-A316AA4E48ED}.Release|x86.ActiveCfg = Release|Win32
{6BAC3B29-3A6B-4B3F-A9AB-A316AA4E48ED}.Release|x86.Build.0 = Release|Win32
{F76B776E-86F5-48C5-8FC7-D2795ECC9746}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {F76B776E-86F5-48C5-8FC7-D2795ECC9746}.Debug|ARM.ActiveCfg = Debug|ARM
+ {F76B776E-86F5-48C5-8FC7-D2795ECC9746}.Debug|ARM.Build.0 = Debug|ARM
{F76B776E-86F5-48C5-8FC7-D2795ECC9746}.Debug|ARM64.ActiveCfg = Debug|ARM64
{F76B776E-86F5-48C5-8FC7-D2795ECC9746}.Debug|ARM64.Build.0 = Debug|ARM64
{F76B776E-86F5-48C5-8FC7-D2795ECC9746}.Debug|x64.ActiveCfg = Debug|x64
@@ -334,6 +377,8 @@ Global
{F76B776E-86F5-48C5-8FC7-D2795ECC9746}.Debug|x86.ActiveCfg = Debug|Win32
{F76B776E-86F5-48C5-8FC7-D2795ECC9746}.Debug|x86.Build.0 = Debug|Win32
{F76B776E-86F5-48C5-8FC7-D2795ECC9746}.Release|Any CPU.ActiveCfg = Release|Win32
+ {F76B776E-86F5-48C5-8FC7-D2795ECC9746}.Release|ARM.ActiveCfg = Release|ARM
+ {F76B776E-86F5-48C5-8FC7-D2795ECC9746}.Release|ARM.Build.0 = Release|ARM
{F76B776E-86F5-48C5-8FC7-D2795ECC9746}.Release|ARM64.ActiveCfg = Release|ARM64
{F76B776E-86F5-48C5-8FC7-D2795ECC9746}.Release|ARM64.Build.0 = Release|ARM64
{F76B776E-86F5-48C5-8FC7-D2795ECC9746}.Release|x64.ActiveCfg = Release|x64
@@ -341,6 +386,8 @@ Global
{F76B776E-86F5-48C5-8FC7-D2795ECC9746}.Release|x86.ActiveCfg = Release|Win32
{F76B776E-86F5-48C5-8FC7-D2795ECC9746}.Release|x86.Build.0 = Release|Win32
{D6BC25C5-1AA7-4C4A-A02C-B42DEDBFEA33}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {D6BC25C5-1AA7-4C4A-A02C-B42DEDBFEA33}.Debug|ARM.ActiveCfg = Debug|ARM
+ {D6BC25C5-1AA7-4C4A-A02C-B42DEDBFEA33}.Debug|ARM.Build.0 = Debug|ARM
{D6BC25C5-1AA7-4C4A-A02C-B42DEDBFEA33}.Debug|ARM64.ActiveCfg = Debug|ARM64
{D6BC25C5-1AA7-4C4A-A02C-B42DEDBFEA33}.Debug|ARM64.Build.0 = Debug|ARM64
{D6BC25C5-1AA7-4C4A-A02C-B42DEDBFEA33}.Debug|x64.ActiveCfg = Debug|x64
@@ -348,6 +395,8 @@ Global
{D6BC25C5-1AA7-4C4A-A02C-B42DEDBFEA33}.Debug|x86.ActiveCfg = Debug|Win32
{D6BC25C5-1AA7-4C4A-A02C-B42DEDBFEA33}.Debug|x86.Build.0 = Debug|Win32
{D6BC25C5-1AA7-4C4A-A02C-B42DEDBFEA33}.Release|Any CPU.ActiveCfg = Release|Win32
+ {D6BC25C5-1AA7-4C4A-A02C-B42DEDBFEA33}.Release|ARM.ActiveCfg = Release|ARM
+ {D6BC25C5-1AA7-4C4A-A02C-B42DEDBFEA33}.Release|ARM.Build.0 = Release|ARM
{D6BC25C5-1AA7-4C4A-A02C-B42DEDBFEA33}.Release|ARM64.ActiveCfg = Release|ARM64
{D6BC25C5-1AA7-4C4A-A02C-B42DEDBFEA33}.Release|ARM64.Build.0 = Release|ARM64
{D6BC25C5-1AA7-4C4A-A02C-B42DEDBFEA33}.Release|x64.ActiveCfg = Release|x64
@@ -355,6 +404,7 @@ Global
{D6BC25C5-1AA7-4C4A-A02C-B42DEDBFEA33}.Release|x86.ActiveCfg = Release|Win32
{D6BC25C5-1AA7-4C4A-A02C-B42DEDBFEA33}.Release|x86.Build.0 = Release|Win32
{58E95711-A12F-4C0E-A978-C6B4A0842AC8}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {58E95711-A12F-4C0E-A978-C6B4A0842AC8}.Debug|ARM.ActiveCfg = Debug|Win32
{58E95711-A12F-4C0E-A978-C6B4A0842AC8}.Debug|ARM64.ActiveCfg = Debug|ARM64
{58E95711-A12F-4C0E-A978-C6B4A0842AC8}.Debug|ARM64.Build.0 = Debug|ARM64
{58E95711-A12F-4C0E-A978-C6B4A0842AC8}.Debug|x64.ActiveCfg = Debug|x64
@@ -362,6 +412,7 @@ Global
{58E95711-A12F-4C0E-A978-C6B4A0842AC8}.Debug|x86.ActiveCfg = Debug|Win32
{58E95711-A12F-4C0E-A978-C6B4A0842AC8}.Debug|x86.Build.0 = Debug|Win32
{58E95711-A12F-4C0E-A978-C6B4A0842AC8}.Release|Any CPU.ActiveCfg = Release|Win32
+ {58E95711-A12F-4C0E-A978-C6B4A0842AC8}.Release|ARM.ActiveCfg = Release|Win32
{58E95711-A12F-4C0E-A978-C6B4A0842AC8}.Release|ARM64.ActiveCfg = Release|ARM64
{58E95711-A12F-4C0E-A978-C6B4A0842AC8}.Release|ARM64.Build.0 = Release|ARM64
{58E95711-A12F-4C0E-A978-C6B4A0842AC8}.Release|x64.ActiveCfg = Release|x64
@@ -369,6 +420,7 @@ Global
{58E95711-A12F-4C0E-A978-C6B4A0842AC8}.Release|x86.ActiveCfg = Release|Win32
{58E95711-A12F-4C0E-A978-C6B4A0842AC8}.Release|x86.Build.0 = Release|Win32
{66D0D8B1-FAF4-4C6A-8303-07F3BA356FE3}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {66D0D8B1-FAF4-4C6A-8303-07F3BA356FE3}.Debug|ARM.ActiveCfg = Debug|Win32
{66D0D8B1-FAF4-4C6A-8303-07F3BA356FE3}.Debug|ARM64.ActiveCfg = Debug|ARM64
{66D0D8B1-FAF4-4C6A-8303-07F3BA356FE3}.Debug|ARM64.Build.0 = Debug|ARM64
{66D0D8B1-FAF4-4C6A-8303-07F3BA356FE3}.Debug|x64.ActiveCfg = Debug|x64
@@ -376,6 +428,7 @@ Global
{66D0D8B1-FAF4-4C6A-8303-07F3BA356FE3}.Debug|x86.ActiveCfg = Debug|Win32
{66D0D8B1-FAF4-4C6A-8303-07F3BA356FE3}.Debug|x86.Build.0 = Debug|Win32
{66D0D8B1-FAF4-4C6A-8303-07F3BA356FE3}.Release|Any CPU.ActiveCfg = Release|Win32
+ {66D0D8B1-FAF4-4C6A-8303-07F3BA356FE3}.Release|ARM.ActiveCfg = Release|Win32
{66D0D8B1-FAF4-4C6A-8303-07F3BA356FE3}.Release|ARM64.ActiveCfg = Release|ARM64
{66D0D8B1-FAF4-4C6A-8303-07F3BA356FE3}.Release|ARM64.Build.0 = Release|ARM64
{66D0D8B1-FAF4-4C6A-8303-07F3BA356FE3}.Release|x64.ActiveCfg = Release|x64
@@ -383,18 +436,22 @@ Global
{66D0D8B1-FAF4-4C6A-8303-07F3BA356FE3}.Release|x86.ActiveCfg = Release|Win32
{66D0D8B1-FAF4-4C6A-8303-07F3BA356FE3}.Release|x86.Build.0 = Release|Win32
{9C1A6C58-52D6-4514-9120-5C339C5DF4BE}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {9C1A6C58-52D6-4514-9120-5C339C5DF4BE}.Debug|ARM.ActiveCfg = Debug|Win32
{9C1A6C58-52D6-4514-9120-5C339C5DF4BE}.Debug|ARM64.ActiveCfg = Debug|Win32
{9C1A6C58-52D6-4514-9120-5C339C5DF4BE}.Debug|x64.ActiveCfg = Debug|x64
{9C1A6C58-52D6-4514-9120-5C339C5DF4BE}.Debug|x64.Build.0 = Debug|x64
{9C1A6C58-52D6-4514-9120-5C339C5DF4BE}.Debug|x86.ActiveCfg = Debug|Win32
{9C1A6C58-52D6-4514-9120-5C339C5DF4BE}.Debug|x86.Build.0 = Debug|Win32
{9C1A6C58-52D6-4514-9120-5C339C5DF4BE}.Release|Any CPU.ActiveCfg = Release|Win32
+ {9C1A6C58-52D6-4514-9120-5C339C5DF4BE}.Release|ARM.ActiveCfg = Release|Win32
{9C1A6C58-52D6-4514-9120-5C339C5DF4BE}.Release|ARM64.ActiveCfg = Release|Win32
{9C1A6C58-52D6-4514-9120-5C339C5DF4BE}.Release|x64.ActiveCfg = Release|x64
{9C1A6C58-52D6-4514-9120-5C339C5DF4BE}.Release|x64.Build.0 = Release|x64
{9C1A6C58-52D6-4514-9120-5C339C5DF4BE}.Release|x86.ActiveCfg = Release|Win32
{9C1A6C58-52D6-4514-9120-5C339C5DF4BE}.Release|x86.Build.0 = Release|Win32
{51293DFA-614B-4355-A60D-B30DF3228FD1}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {51293DFA-614B-4355-A60D-B30DF3228FD1}.Debug|ARM.ActiveCfg = Debug|ARM
+ {51293DFA-614B-4355-A60D-B30DF3228FD1}.Debug|ARM.Build.0 = Debug|ARM
{51293DFA-614B-4355-A60D-B30DF3228FD1}.Debug|ARM64.ActiveCfg = Debug|ARM64
{51293DFA-614B-4355-A60D-B30DF3228FD1}.Debug|ARM64.Build.0 = Debug|ARM64
{51293DFA-614B-4355-A60D-B30DF3228FD1}.Debug|x64.ActiveCfg = Debug|x64
@@ -402,6 +459,8 @@ Global
{51293DFA-614B-4355-A60D-B30DF3228FD1}.Debug|x86.ActiveCfg = Debug|Win32
{51293DFA-614B-4355-A60D-B30DF3228FD1}.Debug|x86.Build.0 = Debug|Win32
{51293DFA-614B-4355-A60D-B30DF3228FD1}.Release|Any CPU.ActiveCfg = Release|Win32
+ {51293DFA-614B-4355-A60D-B30DF3228FD1}.Release|ARM.ActiveCfg = Release|ARM
+ {51293DFA-614B-4355-A60D-B30DF3228FD1}.Release|ARM.Build.0 = Release|ARM
{51293DFA-614B-4355-A60D-B30DF3228FD1}.Release|ARM64.ActiveCfg = Release|ARM64
{51293DFA-614B-4355-A60D-B30DF3228FD1}.Release|ARM64.Build.0 = Release|ARM64
{51293DFA-614B-4355-A60D-B30DF3228FD1}.Release|x64.ActiveCfg = Release|x64
@@ -409,6 +468,8 @@ Global
{51293DFA-614B-4355-A60D-B30DF3228FD1}.Release|x86.ActiveCfg = Release|Win32
{51293DFA-614B-4355-A60D-B30DF3228FD1}.Release|x86.Build.0 = Release|Win32
{1A41BB90-CC34-4EDD-9A27-50714CDBC169}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {1A41BB90-CC34-4EDD-9A27-50714CDBC169}.Debug|ARM.ActiveCfg = Debug|ARM
+ {1A41BB90-CC34-4EDD-9A27-50714CDBC169}.Debug|ARM.Build.0 = Debug|ARM
{1A41BB90-CC34-4EDD-9A27-50714CDBC169}.Debug|ARM64.ActiveCfg = Debug|ARM64
{1A41BB90-CC34-4EDD-9A27-50714CDBC169}.Debug|ARM64.Build.0 = Debug|ARM64
{1A41BB90-CC34-4EDD-9A27-50714CDBC169}.Debug|x64.ActiveCfg = Debug|x64
@@ -416,6 +477,8 @@ Global
{1A41BB90-CC34-4EDD-9A27-50714CDBC169}.Debug|x86.ActiveCfg = Debug|Win32
{1A41BB90-CC34-4EDD-9A27-50714CDBC169}.Debug|x86.Build.0 = Debug|Win32
{1A41BB90-CC34-4EDD-9A27-50714CDBC169}.Release|Any CPU.ActiveCfg = Release|Win32
+ {1A41BB90-CC34-4EDD-9A27-50714CDBC169}.Release|ARM.ActiveCfg = Release|ARM
+ {1A41BB90-CC34-4EDD-9A27-50714CDBC169}.Release|ARM.Build.0 = Release|ARM
{1A41BB90-CC34-4EDD-9A27-50714CDBC169}.Release|ARM64.ActiveCfg = Release|ARM64
{1A41BB90-CC34-4EDD-9A27-50714CDBC169}.Release|ARM64.Build.0 = Release|ARM64
{1A41BB90-CC34-4EDD-9A27-50714CDBC169}.Release|x64.ActiveCfg = Release|x64
@@ -423,18 +486,22 @@ Global
{1A41BB90-CC34-4EDD-9A27-50714CDBC169}.Release|x86.ActiveCfg = Release|Win32
{1A41BB90-CC34-4EDD-9A27-50714CDBC169}.Release|x86.Build.0 = Release|Win32
{B71E818A-882E-456A-87E5-4DE4A6602B99}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {B71E818A-882E-456A-87E5-4DE4A6602B99}.Debug|ARM.ActiveCfg = Debug|Win32
{B71E818A-882E-456A-87E5-4DE4A6602B99}.Debug|ARM64.ActiveCfg = Debug|Win32
{B71E818A-882E-456A-87E5-4DE4A6602B99}.Debug|x64.ActiveCfg = Debug|x64
{B71E818A-882E-456A-87E5-4DE4A6602B99}.Debug|x64.Build.0 = Debug|x64
{B71E818A-882E-456A-87E5-4DE4A6602B99}.Debug|x86.ActiveCfg = Debug|Win32
{B71E818A-882E-456A-87E5-4DE4A6602B99}.Debug|x86.Build.0 = Debug|Win32
{B71E818A-882E-456A-87E5-4DE4A6602B99}.Release|Any CPU.ActiveCfg = Release|Win32
+ {B71E818A-882E-456A-87E5-4DE4A6602B99}.Release|ARM.ActiveCfg = Release|Win32
{B71E818A-882E-456A-87E5-4DE4A6602B99}.Release|ARM64.ActiveCfg = Release|Win32
{B71E818A-882E-456A-87E5-4DE4A6602B99}.Release|x64.ActiveCfg = Release|x64
{B71E818A-882E-456A-87E5-4DE4A6602B99}.Release|x64.Build.0 = Release|x64
{B71E818A-882E-456A-87E5-4DE4A6602B99}.Release|x86.ActiveCfg = Release|Win32
{B71E818A-882E-456A-87E5-4DE4A6602B99}.Release|x86.Build.0 = Release|Win32
{2E5BF0D2-78FA-4B60-A341-F65A0D58BD86}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {2E5BF0D2-78FA-4B60-A341-F65A0D58BD86}.Debug|ARM.ActiveCfg = Debug|ARM
+ {2E5BF0D2-78FA-4B60-A341-F65A0D58BD86}.Debug|ARM.Build.0 = Debug|ARM
{2E5BF0D2-78FA-4B60-A341-F65A0D58BD86}.Debug|ARM64.ActiveCfg = Debug|ARM64
{2E5BF0D2-78FA-4B60-A341-F65A0D58BD86}.Debug|ARM64.Build.0 = Debug|ARM64
{2E5BF0D2-78FA-4B60-A341-F65A0D58BD86}.Debug|x64.ActiveCfg = Debug|x64
@@ -442,6 +509,8 @@ Global
{2E5BF0D2-78FA-4B60-A341-F65A0D58BD86}.Debug|x86.ActiveCfg = Debug|Win32
{2E5BF0D2-78FA-4B60-A341-F65A0D58BD86}.Debug|x86.Build.0 = Debug|Win32
{2E5BF0D2-78FA-4B60-A341-F65A0D58BD86}.Release|Any CPU.ActiveCfg = Release|Win32
+ {2E5BF0D2-78FA-4B60-A341-F65A0D58BD86}.Release|ARM.ActiveCfg = Release|ARM
+ {2E5BF0D2-78FA-4B60-A341-F65A0D58BD86}.Release|ARM.Build.0 = Release|ARM
{2E5BF0D2-78FA-4B60-A341-F65A0D58BD86}.Release|ARM64.ActiveCfg = Release|ARM64
{2E5BF0D2-78FA-4B60-A341-F65A0D58BD86}.Release|ARM64.Build.0 = Release|ARM64
{2E5BF0D2-78FA-4B60-A341-F65A0D58BD86}.Release|x64.ActiveCfg = Release|x64
@@ -449,18 +518,22 @@ Global
{2E5BF0D2-78FA-4B60-A341-F65A0D58BD86}.Release|x86.ActiveCfg = Release|Win32
{2E5BF0D2-78FA-4B60-A341-F65A0D58BD86}.Release|x86.Build.0 = Release|Win32
{A7391725-4EF5-438F-8DE1-645423E46955}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {A7391725-4EF5-438F-8DE1-645423E46955}.Debug|ARM.ActiveCfg = Debug|Win32
{A7391725-4EF5-438F-8DE1-645423E46955}.Debug|ARM64.ActiveCfg = Debug|Win32
{A7391725-4EF5-438F-8DE1-645423E46955}.Debug|x64.ActiveCfg = Debug|x64
{A7391725-4EF5-438F-8DE1-645423E46955}.Debug|x64.Build.0 = Debug|x64
{A7391725-4EF5-438F-8DE1-645423E46955}.Debug|x86.ActiveCfg = Debug|Win32
{A7391725-4EF5-438F-8DE1-645423E46955}.Debug|x86.Build.0 = Debug|Win32
{A7391725-4EF5-438F-8DE1-645423E46955}.Release|Any CPU.ActiveCfg = Release|Win32
+ {A7391725-4EF5-438F-8DE1-645423E46955}.Release|ARM.ActiveCfg = Release|Win32
{A7391725-4EF5-438F-8DE1-645423E46955}.Release|ARM64.ActiveCfg = Release|Win32
{A7391725-4EF5-438F-8DE1-645423E46955}.Release|x64.ActiveCfg = Release|x64
{A7391725-4EF5-438F-8DE1-645423E46955}.Release|x64.Build.0 = Release|x64
{A7391725-4EF5-438F-8DE1-645423E46955}.Release|x86.ActiveCfg = Release|Win32
{A7391725-4EF5-438F-8DE1-645423E46955}.Release|x86.Build.0 = Release|Win32
{8C79C46D-1577-44CA-83DF-88B74C3E4586}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {8C79C46D-1577-44CA-83DF-88B74C3E4586}.Debug|ARM.ActiveCfg = Debug|ARM
+ {8C79C46D-1577-44CA-83DF-88B74C3E4586}.Debug|ARM.Build.0 = Debug|ARM
{8C79C46D-1577-44CA-83DF-88B74C3E4586}.Debug|ARM64.ActiveCfg = Debug|ARM64
{8C79C46D-1577-44CA-83DF-88B74C3E4586}.Debug|ARM64.Build.0 = Debug|ARM64
{8C79C46D-1577-44CA-83DF-88B74C3E4586}.Debug|x64.ActiveCfg = Debug|x64
@@ -468,6 +541,8 @@ Global
{8C79C46D-1577-44CA-83DF-88B74C3E4586}.Debug|x86.ActiveCfg = Debug|Win32
{8C79C46D-1577-44CA-83DF-88B74C3E4586}.Debug|x86.Build.0 = Debug|Win32
{8C79C46D-1577-44CA-83DF-88B74C3E4586}.Release|Any CPU.ActiveCfg = Release|Win32
+ {8C79C46D-1577-44CA-83DF-88B74C3E4586}.Release|ARM.ActiveCfg = Release|ARM
+ {8C79C46D-1577-44CA-83DF-88B74C3E4586}.Release|ARM.Build.0 = Release|ARM
{8C79C46D-1577-44CA-83DF-88B74C3E4586}.Release|ARM64.ActiveCfg = Release|ARM64
{8C79C46D-1577-44CA-83DF-88B74C3E4586}.Release|ARM64.Build.0 = Release|ARM64
{8C79C46D-1577-44CA-83DF-88B74C3E4586}.Release|x64.ActiveCfg = Release|x64
@@ -475,6 +550,8 @@ Global
{8C79C46D-1577-44CA-83DF-88B74C3E4586}.Release|x86.ActiveCfg = Release|Win32
{8C79C46D-1577-44CA-83DF-88B74C3E4586}.Release|x86.Build.0 = Release|Win32
{CCD23028-B9D3-410B-836E-20B2E7C08451}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {CCD23028-B9D3-410B-836E-20B2E7C08451}.Debug|ARM.ActiveCfg = Debug|ARM
+ {CCD23028-B9D3-410B-836E-20B2E7C08451}.Debug|ARM.Build.0 = Debug|ARM
{CCD23028-B9D3-410B-836E-20B2E7C08451}.Debug|ARM64.ActiveCfg = Debug|ARM64
{CCD23028-B9D3-410B-836E-20B2E7C08451}.Debug|ARM64.Build.0 = Debug|ARM64
{CCD23028-B9D3-410B-836E-20B2E7C08451}.Debug|x64.ActiveCfg = Debug|x64
@@ -482,6 +559,8 @@ Global
{CCD23028-B9D3-410B-836E-20B2E7C08451}.Debug|x86.ActiveCfg = Debug|Win32
{CCD23028-B9D3-410B-836E-20B2E7C08451}.Debug|x86.Build.0 = Debug|Win32
{CCD23028-B9D3-410B-836E-20B2E7C08451}.Release|Any CPU.ActiveCfg = Release|Win32
+ {CCD23028-B9D3-410B-836E-20B2E7C08451}.Release|ARM.ActiveCfg = Release|ARM
+ {CCD23028-B9D3-410B-836E-20B2E7C08451}.Release|ARM.Build.0 = Release|ARM
{CCD23028-B9D3-410B-836E-20B2E7C08451}.Release|ARM64.ActiveCfg = Release|ARM64
{CCD23028-B9D3-410B-836E-20B2E7C08451}.Release|ARM64.Build.0 = Release|ARM64
{CCD23028-B9D3-410B-836E-20B2E7C08451}.Release|x64.ActiveCfg = Release|x64
@@ -489,18 +568,23 @@ Global
{CCD23028-B9D3-410B-836E-20B2E7C08451}.Release|x86.ActiveCfg = Release|Win32
{CCD23028-B9D3-410B-836E-20B2E7C08451}.Release|x86.Build.0 = Release|Win32
{B2546322-D329-4F6C-9C2E-7EFC3C9ED214}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {B2546322-D329-4F6C-9C2E-7EFC3C9ED214}.Debug|ARM.ActiveCfg = Debug|ARM
+ {B2546322-D329-4F6C-9C2E-7EFC3C9ED214}.Debug|ARM.Build.0 = Debug|ARM
{B2546322-D329-4F6C-9C2E-7EFC3C9ED214}.Debug|ARM64.ActiveCfg = Debug|ARM64
{B2546322-D329-4F6C-9C2E-7EFC3C9ED214}.Debug|x64.ActiveCfg = Debug|x64
{B2546322-D329-4F6C-9C2E-7EFC3C9ED214}.Debug|x64.Build.0 = Debug|x64
{B2546322-D329-4F6C-9C2E-7EFC3C9ED214}.Debug|x86.ActiveCfg = Debug|Win32
{B2546322-D329-4F6C-9C2E-7EFC3C9ED214}.Debug|x86.Build.0 = Debug|Win32
{B2546322-D329-4F6C-9C2E-7EFC3C9ED214}.Release|Any CPU.ActiveCfg = Release|Win32
+ {B2546322-D329-4F6C-9C2E-7EFC3C9ED214}.Release|ARM.ActiveCfg = Release|ARM
+ {B2546322-D329-4F6C-9C2E-7EFC3C9ED214}.Release|ARM.Build.0 = Release|ARM
{B2546322-D329-4F6C-9C2E-7EFC3C9ED214}.Release|ARM64.ActiveCfg = Release|ARM64
{B2546322-D329-4F6C-9C2E-7EFC3C9ED214}.Release|x64.ActiveCfg = Release|x64
{B2546322-D329-4F6C-9C2E-7EFC3C9ED214}.Release|x64.Build.0 = Release|x64
{B2546322-D329-4F6C-9C2E-7EFC3C9ED214}.Release|x86.ActiveCfg = Release|Win32
{B2546322-D329-4F6C-9C2E-7EFC3C9ED214}.Release|x86.Build.0 = Release|Win32
{C62688A1-16A0-4729-B6ED-842F4FAA29F3}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {C62688A1-16A0-4729-B6ED-842F4FAA29F3}.Debug|ARM.ActiveCfg = Debug|Win32
{C62688A1-16A0-4729-B6ED-842F4FAA29F3}.Debug|ARM64.ActiveCfg = Debug|ARM64
{C62688A1-16A0-4729-B6ED-842F4FAA29F3}.Debug|ARM64.Build.0 = Debug|ARM64
{C62688A1-16A0-4729-B6ED-842F4FAA29F3}.Debug|x64.ActiveCfg = Debug|x64
@@ -508,6 +592,7 @@ Global
{C62688A1-16A0-4729-B6ED-842F4FAA29F3}.Debug|x86.ActiveCfg = Debug|Win32
{C62688A1-16A0-4729-B6ED-842F4FAA29F3}.Debug|x86.Build.0 = Debug|Win32
{C62688A1-16A0-4729-B6ED-842F4FAA29F3}.Release|Any CPU.ActiveCfg = Release|Win32
+ {C62688A1-16A0-4729-B6ED-842F4FAA29F3}.Release|ARM.ActiveCfg = Release|Win32
{C62688A1-16A0-4729-B6ED-842F4FAA29F3}.Release|ARM64.ActiveCfg = Release|ARM64
{C62688A1-16A0-4729-B6ED-842F4FAA29F3}.Release|ARM64.Build.0 = Release|ARM64
{C62688A1-16A0-4729-B6ED-842F4FAA29F3}.Release|x64.ActiveCfg = Release|x64
@@ -515,30 +600,36 @@ Global
{C62688A1-16A0-4729-B6ED-842F4FAA29F3}.Release|x86.ActiveCfg = Release|Win32
{C62688A1-16A0-4729-B6ED-842F4FAA29F3}.Release|x86.Build.0 = Release|Win32
{5D97F9A6-AFAD-4B0C-B609-E62DDDE6E4FA}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {5D97F9A6-AFAD-4B0C-B609-E62DDDE6E4FA}.Debug|ARM.ActiveCfg = Debug|Win32
{5D97F9A6-AFAD-4B0C-B609-E62DDDE6E4FA}.Debug|ARM64.ActiveCfg = Debug|Win32
{5D97F9A6-AFAD-4B0C-B609-E62DDDE6E4FA}.Debug|x64.ActiveCfg = Debug|x64
{5D97F9A6-AFAD-4B0C-B609-E62DDDE6E4FA}.Debug|x64.Build.0 = Debug|x64
{5D97F9A6-AFAD-4B0C-B609-E62DDDE6E4FA}.Debug|x86.ActiveCfg = Debug|Win32
{5D97F9A6-AFAD-4B0C-B609-E62DDDE6E4FA}.Debug|x86.Build.0 = Debug|Win32
{5D97F9A6-AFAD-4B0C-B609-E62DDDE6E4FA}.Release|Any CPU.ActiveCfg = Release|Win32
+ {5D97F9A6-AFAD-4B0C-B609-E62DDDE6E4FA}.Release|ARM.ActiveCfg = Release|Win32
{5D97F9A6-AFAD-4B0C-B609-E62DDDE6E4FA}.Release|ARM64.ActiveCfg = Release|Win32
{5D97F9A6-AFAD-4B0C-B609-E62DDDE6E4FA}.Release|x64.ActiveCfg = Release|x64
{5D97F9A6-AFAD-4B0C-B609-E62DDDE6E4FA}.Release|x64.Build.0 = Release|x64
{5D97F9A6-AFAD-4B0C-B609-E62DDDE6E4FA}.Release|x86.ActiveCfg = Release|Win32
{5D97F9A6-AFAD-4B0C-B609-E62DDDE6E4FA}.Release|x86.Build.0 = Release|Win32
{72F124D1-A1D2-44BC-8941-1B4C452591E5}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {72F124D1-A1D2-44BC-8941-1B4C452591E5}.Debug|ARM.ActiveCfg = Debug|Win32
{72F124D1-A1D2-44BC-8941-1B4C452591E5}.Debug|ARM64.ActiveCfg = Debug|Win32
{72F124D1-A1D2-44BC-8941-1B4C452591E5}.Debug|x64.ActiveCfg = Debug|x64
{72F124D1-A1D2-44BC-8941-1B4C452591E5}.Debug|x64.Build.0 = Debug|x64
{72F124D1-A1D2-44BC-8941-1B4C452591E5}.Debug|x86.ActiveCfg = Debug|Win32
{72F124D1-A1D2-44BC-8941-1B4C452591E5}.Debug|x86.Build.0 = Debug|Win32
{72F124D1-A1D2-44BC-8941-1B4C452591E5}.Release|Any CPU.ActiveCfg = Release|Win32
+ {72F124D1-A1D2-44BC-8941-1B4C452591E5}.Release|ARM.ActiveCfg = Release|Win32
{72F124D1-A1D2-44BC-8941-1B4C452591E5}.Release|ARM64.ActiveCfg = Release|Win32
{72F124D1-A1D2-44BC-8941-1B4C452591E5}.Release|x64.ActiveCfg = Release|x64
{72F124D1-A1D2-44BC-8941-1B4C452591E5}.Release|x64.Build.0 = Release|x64
{72F124D1-A1D2-44BC-8941-1B4C452591E5}.Release|x86.ActiveCfg = Release|Win32
{72F124D1-A1D2-44BC-8941-1B4C452591E5}.Release|x86.Build.0 = Release|Win32
{8E52D7EA-A200-4A6B-BA74-8EFB49468CAF}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {8E52D7EA-A200-4A6B-BA74-8EFB49468CAF}.Debug|ARM.ActiveCfg = Debug|ARM
+ {8E52D7EA-A200-4A6B-BA74-8EFB49468CAF}.Debug|ARM.Build.0 = Debug|ARM
{8E52D7EA-A200-4A6B-BA74-8EFB49468CAF}.Debug|ARM64.ActiveCfg = Debug|ARM64
{8E52D7EA-A200-4A6B-BA74-8EFB49468CAF}.Debug|ARM64.Build.0 = Debug|ARM64
{8E52D7EA-A200-4A6B-BA74-8EFB49468CAF}.Debug|x64.ActiveCfg = Debug|x64
@@ -546,6 +637,8 @@ Global
{8E52D7EA-A200-4A6B-BA74-8EFB49468CAF}.Debug|x86.ActiveCfg = Debug|Win32
{8E52D7EA-A200-4A6B-BA74-8EFB49468CAF}.Debug|x86.Build.0 = Debug|Win32
{8E52D7EA-A200-4A6B-BA74-8EFB49468CAF}.Release|Any CPU.ActiveCfg = Release|Win32
+ {8E52D7EA-A200-4A6B-BA74-8EFB49468CAF}.Release|ARM.ActiveCfg = Release|ARM
+ {8E52D7EA-A200-4A6B-BA74-8EFB49468CAF}.Release|ARM.Build.0 = Release|ARM
{8E52D7EA-A200-4A6B-BA74-8EFB49468CAF}.Release|ARM64.ActiveCfg = Release|ARM64
{8E52D7EA-A200-4A6B-BA74-8EFB49468CAF}.Release|ARM64.Build.0 = Release|ARM64
{8E52D7EA-A200-4A6B-BA74-8EFB49468CAF}.Release|x64.ActiveCfg = Release|x64
@@ -553,6 +646,9 @@ Global
{8E52D7EA-A200-4A6B-BA74-8EFB49468CAF}.Release|x86.ActiveCfg = Release|Win32
{8E52D7EA-A200-4A6B-BA74-8EFB49468CAF}.Release|x86.Build.0 = Release|Win32
{A3FBA80D-5B35-471F-9A45-DB4B29E195B9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A3FBA80D-5B35-471F-9A45-DB4B29E195B9}.Debug|ARM.ActiveCfg = Debug|ARM
+ {A3FBA80D-5B35-471F-9A45-DB4B29E195B9}.Debug|ARM.Build.0 = Debug|ARM
+ {A3FBA80D-5B35-471F-9A45-DB4B29E195B9}.Debug|ARM.Deploy.0 = Debug|ARM
{A3FBA80D-5B35-471F-9A45-DB4B29E195B9}.Debug|ARM64.ActiveCfg = Debug|ARM64
{A3FBA80D-5B35-471F-9A45-DB4B29E195B9}.Debug|ARM64.Build.0 = Debug|ARM64
{A3FBA80D-5B35-471F-9A45-DB4B29E195B9}.Debug|ARM64.Deploy.0 = Debug|ARM64
@@ -563,6 +659,9 @@ Global
{A3FBA80D-5B35-471F-9A45-DB4B29E195B9}.Debug|x86.Build.0 = Debug|x86
{A3FBA80D-5B35-471F-9A45-DB4B29E195B9}.Debug|x86.Deploy.0 = Debug|x86
{A3FBA80D-5B35-471F-9A45-DB4B29E195B9}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A3FBA80D-5B35-471F-9A45-DB4B29E195B9}.Release|ARM.ActiveCfg = Release|ARM
+ {A3FBA80D-5B35-471F-9A45-DB4B29E195B9}.Release|ARM.Build.0 = Release|ARM
+ {A3FBA80D-5B35-471F-9A45-DB4B29E195B9}.Release|ARM.Deploy.0 = Release|ARM
{A3FBA80D-5B35-471F-9A45-DB4B29E195B9}.Release|ARM64.ActiveCfg = Release|ARM64
{A3FBA80D-5B35-471F-9A45-DB4B29E195B9}.Release|ARM64.Build.0 = Release|ARM64
{A3FBA80D-5B35-471F-9A45-DB4B29E195B9}.Release|ARM64.Deploy.0 = Release|ARM64
@@ -573,6 +672,7 @@ Global
{A3FBA80D-5B35-471F-9A45-DB4B29E195B9}.Release|x86.Build.0 = Release|x86
{A3FBA80D-5B35-471F-9A45-DB4B29E195B9}.Release|x86.Deploy.0 = Release|x86
{5B2D17FE-C371-417F-860C-3D32397C2404}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {5B2D17FE-C371-417F-860C-3D32397C2404}.Debug|ARM.ActiveCfg = Debug|Win32
{5B2D17FE-C371-417F-860C-3D32397C2404}.Debug|ARM64.ActiveCfg = Debug|ARM64
{5B2D17FE-C371-417F-860C-3D32397C2404}.Debug|ARM64.Build.0 = Debug|ARM64
{5B2D17FE-C371-417F-860C-3D32397C2404}.Debug|x64.ActiveCfg = Debug|x64
@@ -580,6 +680,7 @@ Global
{5B2D17FE-C371-417F-860C-3D32397C2404}.Debug|x86.ActiveCfg = Debug|Win32
{5B2D17FE-C371-417F-860C-3D32397C2404}.Debug|x86.Build.0 = Debug|Win32
{5B2D17FE-C371-417F-860C-3D32397C2404}.Release|Any CPU.ActiveCfg = Release|Win32
+ {5B2D17FE-C371-417F-860C-3D32397C2404}.Release|ARM.ActiveCfg = Release|Win32
{5B2D17FE-C371-417F-860C-3D32397C2404}.Release|ARM64.ActiveCfg = Release|ARM64
{5B2D17FE-C371-417F-860C-3D32397C2404}.Release|ARM64.Build.0 = Release|ARM64
{5B2D17FE-C371-417F-860C-3D32397C2404}.Release|x64.ActiveCfg = Release|x64
@@ -587,6 +688,7 @@ Global
{5B2D17FE-C371-417F-860C-3D32397C2404}.Release|x86.ActiveCfg = Release|Win32
{5B2D17FE-C371-417F-860C-3D32397C2404}.Release|x86.Build.0 = Release|Win32
{424A6D96-37EE-4456-8347-08AB425C8DBE}.Debug|Any CPU.ActiveCfg = Debug|ARM64
+ {424A6D96-37EE-4456-8347-08AB425C8DBE}.Debug|ARM.ActiveCfg = Debug|x86
{424A6D96-37EE-4456-8347-08AB425C8DBE}.Debug|ARM64.ActiveCfg = Debug|ARM64
{424A6D96-37EE-4456-8347-08AB425C8DBE}.Debug|ARM64.Build.0 = Debug|ARM64
{424A6D96-37EE-4456-8347-08AB425C8DBE}.Debug|ARM64.Deploy.0 = Debug|ARM64
@@ -597,6 +699,7 @@ Global
{424A6D96-37EE-4456-8347-08AB425C8DBE}.Debug|x86.Build.0 = Debug|x86
{424A6D96-37EE-4456-8347-08AB425C8DBE}.Debug|x86.Deploy.0 = Debug|x86
{424A6D96-37EE-4456-8347-08AB425C8DBE}.Release|Any CPU.ActiveCfg = Release|ARM64
+ {424A6D96-37EE-4456-8347-08AB425C8DBE}.Release|ARM.ActiveCfg = Release|x86
{424A6D96-37EE-4456-8347-08AB425C8DBE}.Release|ARM64.ActiveCfg = Release|ARM64
{424A6D96-37EE-4456-8347-08AB425C8DBE}.Release|ARM64.Build.0 = Release|ARM64
{424A6D96-37EE-4456-8347-08AB425C8DBE}.Release|ARM64.Deploy.0 = Release|ARM64
@@ -607,6 +710,7 @@ Global
{424A6D96-37EE-4456-8347-08AB425C8DBE}.Release|x86.Build.0 = Release|x86
{424A6D96-37EE-4456-8347-08AB425C8DBE}.Release|x86.Deploy.0 = Release|x86
{56A1D696-FEDA-4333-BF37-772EBECECB10}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {56A1D696-FEDA-4333-BF37-772EBECECB10}.Debug|ARM.ActiveCfg = Debug|Win32
{56A1D696-FEDA-4333-BF37-772EBECECB10}.Debug|ARM64.ActiveCfg = Debug|ARM64
{56A1D696-FEDA-4333-BF37-772EBECECB10}.Debug|ARM64.Build.0 = Debug|ARM64
{56A1D696-FEDA-4333-BF37-772EBECECB10}.Debug|x64.ActiveCfg = Debug|x64
@@ -614,6 +718,7 @@ Global
{56A1D696-FEDA-4333-BF37-772EBECECB10}.Debug|x86.ActiveCfg = Debug|Win32
{56A1D696-FEDA-4333-BF37-772EBECECB10}.Debug|x86.Build.0 = Debug|Win32
{56A1D696-FEDA-4333-BF37-772EBECECB10}.Release|Any CPU.ActiveCfg = Release|Win32
+ {56A1D696-FEDA-4333-BF37-772EBECECB10}.Release|ARM.ActiveCfg = Release|Win32
{56A1D696-FEDA-4333-BF37-772EBECECB10}.Release|ARM64.ActiveCfg = Release|ARM64
{56A1D696-FEDA-4333-BF37-772EBECECB10}.Release|ARM64.Build.0 = Release|ARM64
{56A1D696-FEDA-4333-BF37-772EBECECB10}.Release|x64.ActiveCfg = Release|x64
@@ -621,6 +726,7 @@ Global
{56A1D696-FEDA-4333-BF37-772EBECECB10}.Release|x86.ActiveCfg = Release|Win32
{56A1D696-FEDA-4333-BF37-772EBECECB10}.Release|x86.Build.0 = Release|Win32
{D012E4BB-F16B-472D-A26D-D449CEFA988E}.Debug|Any CPU.ActiveCfg = Debug|ARM64
+ {D012E4BB-F16B-472D-A26D-D449CEFA988E}.Debug|ARM.ActiveCfg = Debug|x86
{D012E4BB-F16B-472D-A26D-D449CEFA988E}.Debug|ARM64.ActiveCfg = Debug|ARM64
{D012E4BB-F16B-472D-A26D-D449CEFA988E}.Debug|ARM64.Build.0 = Debug|ARM64
{D012E4BB-F16B-472D-A26D-D449CEFA988E}.Debug|ARM64.Deploy.0 = Debug|ARM64
@@ -631,6 +737,7 @@ Global
{D012E4BB-F16B-472D-A26D-D449CEFA988E}.Debug|x86.Build.0 = Debug|x86
{D012E4BB-F16B-472D-A26D-D449CEFA988E}.Debug|x86.Deploy.0 = Debug|x86
{D012E4BB-F16B-472D-A26D-D449CEFA988E}.Release|Any CPU.ActiveCfg = Release|ARM64
+ {D012E4BB-F16B-472D-A26D-D449CEFA988E}.Release|ARM.ActiveCfg = Release|x86
{D012E4BB-F16B-472D-A26D-D449CEFA988E}.Release|ARM64.ActiveCfg = Release|ARM64
{D012E4BB-F16B-472D-A26D-D449CEFA988E}.Release|ARM64.Build.0 = Release|ARM64
{D012E4BB-F16B-472D-A26D-D449CEFA988E}.Release|ARM64.Deploy.0 = Release|ARM64
@@ -641,6 +748,7 @@ Global
{D012E4BB-F16B-472D-A26D-D449CEFA988E}.Release|x86.Build.0 = Release|x86
{D012E4BB-F16B-472D-A26D-D449CEFA988E}.Release|x86.Deploy.0 = Release|x86
{0A5FEE93-48B7-40EC-BB9A-B27D11060DA9}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {0A5FEE93-48B7-40EC-BB9A-B27D11060DA9}.Debug|ARM.ActiveCfg = Debug|Win32
{0A5FEE93-48B7-40EC-BB9A-B27D11060DA9}.Debug|ARM64.ActiveCfg = Debug|ARM64
{0A5FEE93-48B7-40EC-BB9A-B27D11060DA9}.Debug|ARM64.Build.0 = Debug|ARM64
{0A5FEE93-48B7-40EC-BB9A-B27D11060DA9}.Debug|x64.ActiveCfg = Debug|x64
@@ -648,6 +756,7 @@ Global
{0A5FEE93-48B7-40EC-BB9A-B27D11060DA9}.Debug|x86.ActiveCfg = Debug|Win32
{0A5FEE93-48B7-40EC-BB9A-B27D11060DA9}.Debug|x86.Build.0 = Debug|Win32
{0A5FEE93-48B7-40EC-BB9A-B27D11060DA9}.Release|Any CPU.ActiveCfg = Release|Win32
+ {0A5FEE93-48B7-40EC-BB9A-B27D11060DA9}.Release|ARM.ActiveCfg = Release|Win32
{0A5FEE93-48B7-40EC-BB9A-B27D11060DA9}.Release|ARM64.ActiveCfg = Release|ARM64
{0A5FEE93-48B7-40EC-BB9A-B27D11060DA9}.Release|ARM64.Build.0 = Release|ARM64
{0A5FEE93-48B7-40EC-BB9A-B27D11060DA9}.Release|x64.ActiveCfg = Release|x64
@@ -655,6 +764,7 @@ Global
{0A5FEE93-48B7-40EC-BB9A-B27D11060DA9}.Release|x86.ActiveCfg = Release|Win32
{0A5FEE93-48B7-40EC-BB9A-B27D11060DA9}.Release|x86.Build.0 = Release|Win32
{1307DD1B-BBE8-4CD0-B1A0-0DB6D61EEAA0}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {1307DD1B-BBE8-4CD0-B1A0-0DB6D61EEAA0}.Debug|ARM.ActiveCfg = Debug|Win32
{1307DD1B-BBE8-4CD0-B1A0-0DB6D61EEAA0}.Debug|ARM64.ActiveCfg = Debug|ARM64
{1307DD1B-BBE8-4CD0-B1A0-0DB6D61EEAA0}.Debug|ARM64.Build.0 = Debug|ARM64
{1307DD1B-BBE8-4CD0-B1A0-0DB6D61EEAA0}.Debug|x64.ActiveCfg = Debug|x64
@@ -662,6 +772,7 @@ Global
{1307DD1B-BBE8-4CD0-B1A0-0DB6D61EEAA0}.Debug|x86.ActiveCfg = Debug|Win32
{1307DD1B-BBE8-4CD0-B1A0-0DB6D61EEAA0}.Debug|x86.Build.0 = Debug|Win32
{1307DD1B-BBE8-4CD0-B1A0-0DB6D61EEAA0}.Release|Any CPU.ActiveCfg = Release|Win32
+ {1307DD1B-BBE8-4CD0-B1A0-0DB6D61EEAA0}.Release|ARM.ActiveCfg = Release|Win32
{1307DD1B-BBE8-4CD0-B1A0-0DB6D61EEAA0}.Release|ARM64.ActiveCfg = Release|ARM64
{1307DD1B-BBE8-4CD0-B1A0-0DB6D61EEAA0}.Release|ARM64.Build.0 = Release|ARM64
{1307DD1B-BBE8-4CD0-B1A0-0DB6D61EEAA0}.Release|x64.ActiveCfg = Release|x64
@@ -669,18 +780,22 @@ Global
{1307DD1B-BBE8-4CD0-B1A0-0DB6D61EEAA0}.Release|x86.ActiveCfg = Release|Win32
{1307DD1B-BBE8-4CD0-B1A0-0DB6D61EEAA0}.Release|x86.Build.0 = Release|Win32
{C422B090-F501-4204-8068-1084B0799405}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {C422B090-F501-4204-8068-1084B0799405}.Debug|ARM.ActiveCfg = Debug|Win32
{C422B090-F501-4204-8068-1084B0799405}.Debug|ARM64.ActiveCfg = Debug|Win32
{C422B090-F501-4204-8068-1084B0799405}.Debug|x64.ActiveCfg = Debug|x64
{C422B090-F501-4204-8068-1084B0799405}.Debug|x64.Build.0 = Debug|x64
{C422B090-F501-4204-8068-1084B0799405}.Debug|x86.ActiveCfg = Debug|Win32
{C422B090-F501-4204-8068-1084B0799405}.Debug|x86.Build.0 = Debug|Win32
{C422B090-F501-4204-8068-1084B0799405}.Release|Any CPU.ActiveCfg = Release|Win32
+ {C422B090-F501-4204-8068-1084B0799405}.Release|ARM.ActiveCfg = Release|Win32
{C422B090-F501-4204-8068-1084B0799405}.Release|ARM64.ActiveCfg = Release|Win32
{C422B090-F501-4204-8068-1084B0799405}.Release|x64.ActiveCfg = Release|x64
{C422B090-F501-4204-8068-1084B0799405}.Release|x64.Build.0 = Release|x64
{C422B090-F501-4204-8068-1084B0799405}.Release|x86.ActiveCfg = Release|Win32
{C422B090-F501-4204-8068-1084B0799405}.Release|x86.Build.0 = Release|Win32
{BF3FCED0-CADB-490A-93A7-4D90E1F45AB0}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {BF3FCED0-CADB-490A-93A7-4D90E1F45AB0}.Debug|ARM.ActiveCfg = Debug|ARM
+ {BF3FCED0-CADB-490A-93A7-4D90E1F45AB0}.Debug|ARM.Build.0 = Debug|ARM
{BF3FCED0-CADB-490A-93A7-4D90E1F45AB0}.Debug|ARM64.ActiveCfg = Debug|ARM64
{BF3FCED0-CADB-490A-93A7-4D90E1F45AB0}.Debug|ARM64.Build.0 = Debug|ARM64
{BF3FCED0-CADB-490A-93A7-4D90E1F45AB0}.Debug|x64.ActiveCfg = Debug|x64
@@ -688,6 +803,8 @@ Global
{BF3FCED0-CADB-490A-93A7-4D90E1F45AB0}.Debug|x86.ActiveCfg = Debug|Win32
{BF3FCED0-CADB-490A-93A7-4D90E1F45AB0}.Debug|x86.Build.0 = Debug|Win32
{BF3FCED0-CADB-490A-93A7-4D90E1F45AB0}.Release|Any CPU.ActiveCfg = Release|Win32
+ {BF3FCED0-CADB-490A-93A7-4D90E1F45AB0}.Release|ARM.ActiveCfg = Release|ARM
+ {BF3FCED0-CADB-490A-93A7-4D90E1F45AB0}.Release|ARM.Build.0 = Release|ARM
{BF3FCED0-CADB-490A-93A7-4D90E1F45AB0}.Release|ARM64.ActiveCfg = Release|ARM64
{BF3FCED0-CADB-490A-93A7-4D90E1F45AB0}.Release|ARM64.Build.0 = Release|ARM64
{BF3FCED0-CADB-490A-93A7-4D90E1F45AB0}.Release|x64.ActiveCfg = Release|x64
@@ -695,6 +812,7 @@ Global
{BF3FCED0-CADB-490A-93A7-4D90E1F45AB0}.Release|x86.ActiveCfg = Release|Win32
{BF3FCED0-CADB-490A-93A7-4D90E1F45AB0}.Release|x86.Build.0 = Release|Win32
{1DEBBFF6-EE6E-4944-9DE2-35B7A686AF42}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {1DEBBFF6-EE6E-4944-9DE2-35B7A686AF42}.Debug|ARM.ActiveCfg = Debug|Win32
{1DEBBFF6-EE6E-4944-9DE2-35B7A686AF42}.Debug|ARM64.ActiveCfg = Debug|ARM64
{1DEBBFF6-EE6E-4944-9DE2-35B7A686AF42}.Debug|ARM64.Build.0 = Debug|ARM64
{1DEBBFF6-EE6E-4944-9DE2-35B7A686AF42}.Debug|x64.ActiveCfg = Debug|x64
@@ -702,6 +820,7 @@ Global
{1DEBBFF6-EE6E-4944-9DE2-35B7A686AF42}.Debug|x86.ActiveCfg = Debug|Win32
{1DEBBFF6-EE6E-4944-9DE2-35B7A686AF42}.Debug|x86.Build.0 = Debug|Win32
{1DEBBFF6-EE6E-4944-9DE2-35B7A686AF42}.Release|Any CPU.ActiveCfg = Release|Win32
+ {1DEBBFF6-EE6E-4944-9DE2-35B7A686AF42}.Release|ARM.ActiveCfg = Release|Win32
{1DEBBFF6-EE6E-4944-9DE2-35B7A686AF42}.Release|ARM64.ActiveCfg = Release|ARM64
{1DEBBFF6-EE6E-4944-9DE2-35B7A686AF42}.Release|ARM64.Build.0 = Release|ARM64
{1DEBBFF6-EE6E-4944-9DE2-35B7A686AF42}.Release|x64.ActiveCfg = Release|x64
@@ -709,18 +828,21 @@ Global
{1DEBBFF6-EE6E-4944-9DE2-35B7A686AF42}.Release|x86.ActiveCfg = Release|Win32
{1DEBBFF6-EE6E-4944-9DE2-35B7A686AF42}.Release|x86.Build.0 = Release|Win32
{CBD95746-61CE-4F31-B6CC-C5ABF1766180}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {CBD95746-61CE-4F31-B6CC-C5ABF1766180}.Debug|ARM.ActiveCfg = Debug|Win32
{CBD95746-61CE-4F31-B6CC-C5ABF1766180}.Debug|ARM64.ActiveCfg = Debug|Win32
{CBD95746-61CE-4F31-B6CC-C5ABF1766180}.Debug|x64.ActiveCfg = Debug|x64
{CBD95746-61CE-4F31-B6CC-C5ABF1766180}.Debug|x64.Build.0 = Debug|x64
{CBD95746-61CE-4F31-B6CC-C5ABF1766180}.Debug|x86.ActiveCfg = Debug|Win32
{CBD95746-61CE-4F31-B6CC-C5ABF1766180}.Debug|x86.Build.0 = Debug|Win32
{CBD95746-61CE-4F31-B6CC-C5ABF1766180}.Release|Any CPU.ActiveCfg = Release|Win32
+ {CBD95746-61CE-4F31-B6CC-C5ABF1766180}.Release|ARM.ActiveCfg = Release|Win32
{CBD95746-61CE-4F31-B6CC-C5ABF1766180}.Release|ARM64.ActiveCfg = Release|Win32
{CBD95746-61CE-4F31-B6CC-C5ABF1766180}.Release|x64.ActiveCfg = Release|x64
{CBD95746-61CE-4F31-B6CC-C5ABF1766180}.Release|x64.Build.0 = Release|x64
{CBD95746-61CE-4F31-B6CC-C5ABF1766180}.Release|x86.ActiveCfg = Release|Win32
{CBD95746-61CE-4F31-B6CC-C5ABF1766180}.Release|x86.Build.0 = Release|Win32
{47D8D21D-F022-4D58-8DB2-8B467756E08C}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {47D8D21D-F022-4D58-8DB2-8B467756E08C}.Debug|ARM.ActiveCfg = Debug|x86
{47D8D21D-F022-4D58-8DB2-8B467756E08C}.Debug|ARM64.ActiveCfg = Debug|arm64
{47D8D21D-F022-4D58-8DB2-8B467756E08C}.Debug|ARM64.Build.0 = Debug|arm64
{47D8D21D-F022-4D58-8DB2-8B467756E08C}.Debug|x64.ActiveCfg = Debug|x64
@@ -728,6 +850,7 @@ Global
{47D8D21D-F022-4D58-8DB2-8B467756E08C}.Debug|x86.ActiveCfg = Debug|x86
{47D8D21D-F022-4D58-8DB2-8B467756E08C}.Debug|x86.Build.0 = Debug|x86
{47D8D21D-F022-4D58-8DB2-8B467756E08C}.Release|Any CPU.ActiveCfg = Release|x86
+ {47D8D21D-F022-4D58-8DB2-8B467756E08C}.Release|ARM.ActiveCfg = Release|x86
{47D8D21D-F022-4D58-8DB2-8B467756E08C}.Release|ARM64.ActiveCfg = Release|arm64
{47D8D21D-F022-4D58-8DB2-8B467756E08C}.Release|ARM64.Build.0 = Release|arm64
{47D8D21D-F022-4D58-8DB2-8B467756E08C}.Release|x64.ActiveCfg = Release|x64
@@ -735,6 +858,7 @@ Global
{47D8D21D-F022-4D58-8DB2-8B467756E08C}.Release|x86.ActiveCfg = Release|x86
{47D8D21D-F022-4D58-8DB2-8B467756E08C}.Release|x86.Build.0 = Release|x86
{4782BB2A-2968-44B4-867C-5FAEB7A51C6B}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {4782BB2A-2968-44B4-867C-5FAEB7A51C6B}.Debug|ARM.ActiveCfg = Debug|x86
{4782BB2A-2968-44B4-867C-5FAEB7A51C6B}.Debug|ARM64.ActiveCfg = Debug|arm64
{4782BB2A-2968-44B4-867C-5FAEB7A51C6B}.Debug|ARM64.Build.0 = Debug|arm64
{4782BB2A-2968-44B4-867C-5FAEB7A51C6B}.Debug|x64.ActiveCfg = Debug|x64
@@ -742,6 +866,7 @@ Global
{4782BB2A-2968-44B4-867C-5FAEB7A51C6B}.Debug|x86.ActiveCfg = Debug|x86
{4782BB2A-2968-44B4-867C-5FAEB7A51C6B}.Debug|x86.Build.0 = Debug|x86
{4782BB2A-2968-44B4-867C-5FAEB7A51C6B}.Release|Any CPU.ActiveCfg = Release|x86
+ {4782BB2A-2968-44B4-867C-5FAEB7A51C6B}.Release|ARM.ActiveCfg = Release|x86
{4782BB2A-2968-44B4-867C-5FAEB7A51C6B}.Release|ARM64.ActiveCfg = Release|arm64
{4782BB2A-2968-44B4-867C-5FAEB7A51C6B}.Release|ARM64.Build.0 = Release|arm64
{4782BB2A-2968-44B4-867C-5FAEB7A51C6B}.Release|x64.ActiveCfg = Release|x64
@@ -749,6 +874,7 @@ Global
{4782BB2A-2968-44B4-867C-5FAEB7A51C6B}.Release|x86.ActiveCfg = Release|x86
{4782BB2A-2968-44B4-867C-5FAEB7A51C6B}.Release|x86.Build.0 = Release|x86
{D417EDBE-D783-484F-83F3-710DEC7CB585}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {D417EDBE-D783-484F-83F3-710DEC7CB585}.Debug|ARM.ActiveCfg = Debug|x86
{D417EDBE-D783-484F-83F3-710DEC7CB585}.Debug|ARM64.ActiveCfg = Debug|x86
{D417EDBE-D783-484F-83F3-710DEC7CB585}.Debug|ARM64.Build.0 = Debug|x86
{D417EDBE-D783-484F-83F3-710DEC7CB585}.Debug|x64.ActiveCfg = Debug|x64
@@ -756,6 +882,7 @@ Global
{D417EDBE-D783-484F-83F3-710DEC7CB585}.Debug|x86.ActiveCfg = Debug|x86
{D417EDBE-D783-484F-83F3-710DEC7CB585}.Debug|x86.Build.0 = Debug|x86
{D417EDBE-D783-484F-83F3-710DEC7CB585}.Release|Any CPU.ActiveCfg = Release|x86
+ {D417EDBE-D783-484F-83F3-710DEC7CB585}.Release|ARM.ActiveCfg = Release|x86
{D417EDBE-D783-484F-83F3-710DEC7CB585}.Release|ARM64.ActiveCfg = Release|arm64
{D417EDBE-D783-484F-83F3-710DEC7CB585}.Release|ARM64.Build.0 = Release|arm64
{D417EDBE-D783-484F-83F3-710DEC7CB585}.Release|x64.ActiveCfg = Release|x64
@@ -763,18 +890,21 @@ Global
{D417EDBE-D783-484F-83F3-710DEC7CB585}.Release|x86.ActiveCfg = Release|x86
{D417EDBE-D783-484F-83F3-710DEC7CB585}.Release|x86.Build.0 = Release|x86
{8F2C21F1-47AB-428C-A110-EE33FD7D9493}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {8F2C21F1-47AB-428C-A110-EE33FD7D9493}.Debug|ARM.ActiveCfg = Debug|Win32
{8F2C21F1-47AB-428C-A110-EE33FD7D9493}.Debug|ARM64.ActiveCfg = Debug|ARM64
{8F2C21F1-47AB-428C-A110-EE33FD7D9493}.Debug|x64.ActiveCfg = Debug|x64
{8F2C21F1-47AB-428C-A110-EE33FD7D9493}.Debug|x64.Build.0 = Debug|x64
{8F2C21F1-47AB-428C-A110-EE33FD7D9493}.Debug|x86.ActiveCfg = Debug|Win32
{8F2C21F1-47AB-428C-A110-EE33FD7D9493}.Debug|x86.Build.0 = Debug|Win32
{8F2C21F1-47AB-428C-A110-EE33FD7D9493}.Release|Any CPU.ActiveCfg = Release|Win32
+ {8F2C21F1-47AB-428C-A110-EE33FD7D9493}.Release|ARM.ActiveCfg = Release|Win32
{8F2C21F1-47AB-428C-A110-EE33FD7D9493}.Release|ARM64.ActiveCfg = Release|ARM64
{8F2C21F1-47AB-428C-A110-EE33FD7D9493}.Release|x64.ActiveCfg = Release|x64
{8F2C21F1-47AB-428C-A110-EE33FD7D9493}.Release|x64.Build.0 = Release|x64
{8F2C21F1-47AB-428C-A110-EE33FD7D9493}.Release|x86.ActiveCfg = Release|Win32
{8F2C21F1-47AB-428C-A110-EE33FD7D9493}.Release|x86.Build.0 = Release|Win32
{E5659A29-FE68-417B-9BC5-613073DD54DF}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {E5659A29-FE68-417B-9BC5-613073DD54DF}.Debug|ARM.ActiveCfg = Debug|Win32
{E5659A29-FE68-417B-9BC5-613073DD54DF}.Debug|ARM64.ActiveCfg = Debug|ARM64
{E5659A29-FE68-417B-9BC5-613073DD54DF}.Debug|ARM64.Build.0 = Debug|ARM64
{E5659A29-FE68-417B-9BC5-613073DD54DF}.Debug|x64.ActiveCfg = Debug|x64
@@ -782,6 +912,7 @@ Global
{E5659A29-FE68-417B-9BC5-613073DD54DF}.Debug|x86.ActiveCfg = Debug|Win32
{E5659A29-FE68-417B-9BC5-613073DD54DF}.Debug|x86.Build.0 = Debug|Win32
{E5659A29-FE68-417B-9BC5-613073DD54DF}.Release|Any CPU.ActiveCfg = Release|Win32
+ {E5659A29-FE68-417B-9BC5-613073DD54DF}.Release|ARM.ActiveCfg = Release|Win32
{E5659A29-FE68-417B-9BC5-613073DD54DF}.Release|ARM64.ActiveCfg = Release|ARM64
{E5659A29-FE68-417B-9BC5-613073DD54DF}.Release|ARM64.Build.0 = Release|ARM64
{E5659A29-FE68-417B-9BC5-613073DD54DF}.Release|x64.ActiveCfg = Release|x64
@@ -789,12 +920,14 @@ Global
{E5659A29-FE68-417B-9BC5-613073DD54DF}.Release|x86.ActiveCfg = Release|Win32
{E5659A29-FE68-417B-9BC5-613073DD54DF}.Release|x86.Build.0 = Release|Win32
{2CD5CD9B-CF45-4FA7-9769-EE4E02426BF0}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {2CD5CD9B-CF45-4FA7-9769-EE4E02426BF0}.Debug|ARM.ActiveCfg = Debug|Win32
{2CD5CD9B-CF45-4FA7-9769-EE4E02426BF0}.Debug|ARM64.ActiveCfg = Debug|Win32
{2CD5CD9B-CF45-4FA7-9769-EE4E02426BF0}.Debug|x64.ActiveCfg = Debug|x64
{2CD5CD9B-CF45-4FA7-9769-EE4E02426BF0}.Debug|x64.Build.0 = Debug|x64
{2CD5CD9B-CF45-4FA7-9769-EE4E02426BF0}.Debug|x86.ActiveCfg = Debug|Win32
{2CD5CD9B-CF45-4FA7-9769-EE4E02426BF0}.Debug|x86.Build.0 = Debug|Win32
{2CD5CD9B-CF45-4FA7-9769-EE4E02426BF0}.Release|Any CPU.ActiveCfg = Release|Win32
+ {2CD5CD9B-CF45-4FA7-9769-EE4E02426BF0}.Release|ARM.ActiveCfg = Release|Win32
{2CD5CD9B-CF45-4FA7-9769-EE4E02426BF0}.Release|ARM64.ActiveCfg = Release|Win32
{2CD5CD9B-CF45-4FA7-9769-EE4E02426BF0}.Release|x64.ActiveCfg = Release|x64
{2CD5CD9B-CF45-4FA7-9769-EE4E02426BF0}.Release|x64.Build.0 = Release|x64
@@ -802,6 +935,7 @@ Global
{2CD5CD9B-CF45-4FA7-9769-EE4E02426BF0}.Release|x86.Build.0 = Release|Win32
{D6574FD6-8D13-4412-9FCB-308D44063CDA}.Debug|Any CPU.ActiveCfg = Debug|x86
{D6574FD6-8D13-4412-9FCB-308D44063CDA}.Debug|Any CPU.Build.0 = Debug|x86
+ {D6574FD6-8D13-4412-9FCB-308D44063CDA}.Debug|ARM.ActiveCfg = Debug|x86
{D6574FD6-8D13-4412-9FCB-308D44063CDA}.Debug|ARM64.ActiveCfg = Debug|arm64
{D6574FD6-8D13-4412-9FCB-308D44063CDA}.Debug|ARM64.Build.0 = Debug|arm64
{D6574FD6-8D13-4412-9FCB-308D44063CDA}.Debug|x64.ActiveCfg = Debug|x64
@@ -810,6 +944,7 @@ Global
{D6574FD6-8D13-4412-9FCB-308D44063CDA}.Debug|x86.Build.0 = Debug|x86
{D6574FD6-8D13-4412-9FCB-308D44063CDA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D6574FD6-8D13-4412-9FCB-308D44063CDA}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D6574FD6-8D13-4412-9FCB-308D44063CDA}.Release|ARM.ActiveCfg = Release|Any CPU
{D6574FD6-8D13-4412-9FCB-308D44063CDA}.Release|ARM64.ActiveCfg = Release|arm64
{D6574FD6-8D13-4412-9FCB-308D44063CDA}.Release|ARM64.Build.0 = Release|arm64
{D6574FD6-8D13-4412-9FCB-308D44063CDA}.Release|x64.ActiveCfg = Release|x64
@@ -817,6 +952,7 @@ Global
{D6574FD6-8D13-4412-9FCB-308D44063CDA}.Release|x86.ActiveCfg = Release|x86
{D6574FD6-8D13-4412-9FCB-308D44063CDA}.Release|x86.Build.0 = Release|x86
{63ACBA4F-385A-4D04-98AD-263FED501A19}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {63ACBA4F-385A-4D04-98AD-263FED501A19}.Debug|ARM.ActiveCfg = Debug|x86
{63ACBA4F-385A-4D04-98AD-263FED501A19}.Debug|ARM64.ActiveCfg = Debug|arm64
{63ACBA4F-385A-4D04-98AD-263FED501A19}.Debug|ARM64.Build.0 = Debug|arm64
{63ACBA4F-385A-4D04-98AD-263FED501A19}.Debug|x64.ActiveCfg = Debug|x64
@@ -824,6 +960,7 @@ Global
{63ACBA4F-385A-4D04-98AD-263FED501A19}.Debug|x86.ActiveCfg = Debug|x86
{63ACBA4F-385A-4D04-98AD-263FED501A19}.Debug|x86.Build.0 = Debug|x86
{63ACBA4F-385A-4D04-98AD-263FED501A19}.Release|Any CPU.ActiveCfg = Release|x86
+ {63ACBA4F-385A-4D04-98AD-263FED501A19}.Release|ARM.ActiveCfg = Release|x86
{63ACBA4F-385A-4D04-98AD-263FED501A19}.Release|ARM64.ActiveCfg = Release|arm64
{63ACBA4F-385A-4D04-98AD-263FED501A19}.Release|ARM64.Build.0 = Release|arm64
{63ACBA4F-385A-4D04-98AD-263FED501A19}.Release|x64.ActiveCfg = Release|x64
@@ -831,6 +968,7 @@ Global
{63ACBA4F-385A-4D04-98AD-263FED501A19}.Release|x86.ActiveCfg = Release|x86
{63ACBA4F-385A-4D04-98AD-263FED501A19}.Release|x86.Build.0 = Release|x86
{85E9BB46-7841-4732-A039-9C902B71DEC3}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {85E9BB46-7841-4732-A039-9C902B71DEC3}.Debug|ARM.ActiveCfg = Debug|x86
{85E9BB46-7841-4732-A039-9C902B71DEC3}.Debug|ARM64.ActiveCfg = Debug|arm64
{85E9BB46-7841-4732-A039-9C902B71DEC3}.Debug|ARM64.Build.0 = Debug|arm64
{85E9BB46-7841-4732-A039-9C902B71DEC3}.Debug|x64.ActiveCfg = Debug|x64
@@ -838,6 +976,7 @@ Global
{85E9BB46-7841-4732-A039-9C902B71DEC3}.Debug|x86.ActiveCfg = Debug|x86
{85E9BB46-7841-4732-A039-9C902B71DEC3}.Debug|x86.Build.0 = Debug|x86
{85E9BB46-7841-4732-A039-9C902B71DEC3}.Release|Any CPU.ActiveCfg = Release|x86
+ {85E9BB46-7841-4732-A039-9C902B71DEC3}.Release|ARM.ActiveCfg = Release|x86
{85E9BB46-7841-4732-A039-9C902B71DEC3}.Release|ARM64.ActiveCfg = Release|arm64
{85E9BB46-7841-4732-A039-9C902B71DEC3}.Release|ARM64.Build.0 = Release|arm64
{85E9BB46-7841-4732-A039-9C902B71DEC3}.Release|x64.ActiveCfg = Release|x64
@@ -845,6 +984,7 @@ Global
{85E9BB46-7841-4732-A039-9C902B71DEC3}.Release|x86.ActiveCfg = Release|x86
{85E9BB46-7841-4732-A039-9C902B71DEC3}.Release|x86.Build.0 = Release|x86
{F1F2F3A6-A7DE-45D1-9E96-E28171FD3147}.Debug|Any CPU.ActiveCfg = Debug|x86
+ {F1F2F3A6-A7DE-45D1-9E96-E28171FD3147}.Debug|ARM.ActiveCfg = Debug|x86
{F1F2F3A6-A7DE-45D1-9E96-E28171FD3147}.Debug|ARM64.ActiveCfg = Debug|arm64
{F1F2F3A6-A7DE-45D1-9E96-E28171FD3147}.Debug|ARM64.Build.0 = Debug|arm64
{F1F2F3A6-A7DE-45D1-9E96-E28171FD3147}.Debug|x64.ActiveCfg = Debug|x64
@@ -852,6 +992,7 @@ Global
{F1F2F3A6-A7DE-45D1-9E96-E28171FD3147}.Debug|x86.ActiveCfg = Debug|x86
{F1F2F3A6-A7DE-45D1-9E96-E28171FD3147}.Debug|x86.Build.0 = Debug|x86
{F1F2F3A6-A7DE-45D1-9E96-E28171FD3147}.Release|Any CPU.ActiveCfg = Release|x86
+ {F1F2F3A6-A7DE-45D1-9E96-E28171FD3147}.Release|ARM.ActiveCfg = Release|x86
{F1F2F3A6-A7DE-45D1-9E96-E28171FD3147}.Release|ARM64.ActiveCfg = Release|arm64
{F1F2F3A6-A7DE-45D1-9E96-E28171FD3147}.Release|ARM64.Build.0 = Release|arm64
{F1F2F3A6-A7DE-45D1-9E96-E28171FD3147}.Release|x64.ActiveCfg = Release|x64
@@ -859,18 +1000,21 @@ Global
{F1F2F3A6-A7DE-45D1-9E96-E28171FD3147}.Release|x86.ActiveCfg = Release|x86
{F1F2F3A6-A7DE-45D1-9E96-E28171FD3147}.Release|x86.Build.0 = Release|x86
{5E2CC9D5-7C05-41D9-9DB5-EC5DF64BA1DC}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {5E2CC9D5-7C05-41D9-9DB5-EC5DF64BA1DC}.Debug|ARM.ActiveCfg = Debug|Win32
{5E2CC9D5-7C05-41D9-9DB5-EC5DF64BA1DC}.Debug|ARM64.ActiveCfg = Debug|Win32
{5E2CC9D5-7C05-41D9-9DB5-EC5DF64BA1DC}.Debug|x64.ActiveCfg = Debug|x64
{5E2CC9D5-7C05-41D9-9DB5-EC5DF64BA1DC}.Debug|x64.Build.0 = Debug|x64
{5E2CC9D5-7C05-41D9-9DB5-EC5DF64BA1DC}.Debug|x86.ActiveCfg = Debug|Win32
{5E2CC9D5-7C05-41D9-9DB5-EC5DF64BA1DC}.Debug|x86.Build.0 = Debug|Win32
{5E2CC9D5-7C05-41D9-9DB5-EC5DF64BA1DC}.Release|Any CPU.ActiveCfg = Release|Win32
+ {5E2CC9D5-7C05-41D9-9DB5-EC5DF64BA1DC}.Release|ARM.ActiveCfg = Release|Win32
{5E2CC9D5-7C05-41D9-9DB5-EC5DF64BA1DC}.Release|ARM64.ActiveCfg = Release|Win32
{5E2CC9D5-7C05-41D9-9DB5-EC5DF64BA1DC}.Release|x64.ActiveCfg = Release|x64
{5E2CC9D5-7C05-41D9-9DB5-EC5DF64BA1DC}.Release|x64.Build.0 = Release|x64
{5E2CC9D5-7C05-41D9-9DB5-EC5DF64BA1DC}.Release|x86.ActiveCfg = Release|Win32
{5E2CC9D5-7C05-41D9-9DB5-EC5DF64BA1DC}.Release|x86.Build.0 = Release|Win32
{34519337-9249-451E-B5A9-1ECACF9C3DA8}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {34519337-9249-451E-B5A9-1ECACF9C3DA8}.Debug|ARM.ActiveCfg = Debug|Win32
{34519337-9249-451E-B5A9-1ECACF9C3DA8}.Debug|ARM64.ActiveCfg = Debug|ARM64
{34519337-9249-451E-B5A9-1ECACF9C3DA8}.Debug|ARM64.Build.0 = Debug|ARM64
{34519337-9249-451E-B5A9-1ECACF9C3DA8}.Debug|x64.ActiveCfg = Debug|x64
@@ -878,6 +1022,7 @@ Global
{34519337-9249-451E-B5A9-1ECACF9C3DA8}.Debug|x86.ActiveCfg = Debug|Win32
{34519337-9249-451E-B5A9-1ECACF9C3DA8}.Debug|x86.Build.0 = Debug|Win32
{34519337-9249-451E-B5A9-1ECACF9C3DA8}.Release|Any CPU.ActiveCfg = Release|Win32
+ {34519337-9249-451E-B5A9-1ECACF9C3DA8}.Release|ARM.ActiveCfg = Release|Win32
{34519337-9249-451E-B5A9-1ECACF9C3DA8}.Release|ARM64.ActiveCfg = Release|ARM64
{34519337-9249-451E-B5A9-1ECACF9C3DA8}.Release|ARM64.Build.0 = Release|ARM64
{34519337-9249-451E-B5A9-1ECACF9C3DA8}.Release|x64.ActiveCfg = Release|x64
@@ -885,6 +1030,7 @@ Global
{34519337-9249-451E-B5A9-1ECACF9C3DA8}.Release|x86.ActiveCfg = Release|Win32
{34519337-9249-451E-B5A9-1ECACF9C3DA8}.Release|x86.Build.0 = Release|Win32
{0B01DB78-F115-4C90-B28F-7819071303C6}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {0B01DB78-F115-4C90-B28F-7819071303C6}.Debug|ARM.ActiveCfg = Debug|Win32
{0B01DB78-F115-4C90-B28F-7819071303C6}.Debug|ARM64.ActiveCfg = Debug|ARM64
{0B01DB78-F115-4C90-B28F-7819071303C6}.Debug|ARM64.Build.0 = Debug|ARM64
{0B01DB78-F115-4C90-B28F-7819071303C6}.Debug|x64.ActiveCfg = Debug|x64
@@ -892,6 +1038,7 @@ Global
{0B01DB78-F115-4C90-B28F-7819071303C6}.Debug|x86.ActiveCfg = Debug|Win32
{0B01DB78-F115-4C90-B28F-7819071303C6}.Debug|x86.Build.0 = Debug|Win32
{0B01DB78-F115-4C90-B28F-7819071303C6}.Release|Any CPU.ActiveCfg = Release|Win32
+ {0B01DB78-F115-4C90-B28F-7819071303C6}.Release|ARM.ActiveCfg = Release|Win32
{0B01DB78-F115-4C90-B28F-7819071303C6}.Release|ARM64.ActiveCfg = Release|ARM64
{0B01DB78-F115-4C90-B28F-7819071303C6}.Release|ARM64.Build.0 = Release|ARM64
{0B01DB78-F115-4C90-B28F-7819071303C6}.Release|x64.ActiveCfg = Release|x64
@@ -899,6 +1046,7 @@ Global
{0B01DB78-F115-4C90-B28F-7819071303C6}.Release|x86.ActiveCfg = Release|Win32
{0B01DB78-F115-4C90-B28F-7819071303C6}.Release|x86.Build.0 = Release|Win32
{D45D4170-E055-4926-8B03-04DAA5F02C6C}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {D45D4170-E055-4926-8B03-04DAA5F02C6C}.Debug|ARM.ActiveCfg = Debug|Win32
{D45D4170-E055-4926-8B03-04DAA5F02C6C}.Debug|ARM64.ActiveCfg = Debug|ARM64
{D45D4170-E055-4926-8B03-04DAA5F02C6C}.Debug|ARM64.Build.0 = Debug|ARM64
{D45D4170-E055-4926-8B03-04DAA5F02C6C}.Debug|x64.ActiveCfg = Debug|x64
@@ -906,6 +1054,7 @@ Global
{D45D4170-E055-4926-8B03-04DAA5F02C6C}.Debug|x86.ActiveCfg = Debug|Win32
{D45D4170-E055-4926-8B03-04DAA5F02C6C}.Debug|x86.Build.0 = Debug|Win32
{D45D4170-E055-4926-8B03-04DAA5F02C6C}.Release|Any CPU.ActiveCfg = Release|Win32
+ {D45D4170-E055-4926-8B03-04DAA5F02C6C}.Release|ARM.ActiveCfg = Release|Win32
{D45D4170-E055-4926-8B03-04DAA5F02C6C}.Release|ARM64.ActiveCfg = Release|ARM64
{D45D4170-E055-4926-8B03-04DAA5F02C6C}.Release|ARM64.Build.0 = Release|ARM64
{D45D4170-E055-4926-8B03-04DAA5F02C6C}.Release|x64.ActiveCfg = Release|x64
@@ -913,6 +1062,7 @@ Global
{D45D4170-E055-4926-8B03-04DAA5F02C6C}.Release|x86.ActiveCfg = Release|Win32
{D45D4170-E055-4926-8B03-04DAA5F02C6C}.Release|x86.Build.0 = Release|Win32
{09DDAE21-397F-4263-8561-7F2FF28127CF}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {09DDAE21-397F-4263-8561-7F2FF28127CF}.Debug|ARM.ActiveCfg = Debug|Win32
{09DDAE21-397F-4263-8561-7F2FF28127CF}.Debug|ARM64.ActiveCfg = Debug|ARM64
{09DDAE21-397F-4263-8561-7F2FF28127CF}.Debug|ARM64.Build.0 = Debug|ARM64
{09DDAE21-397F-4263-8561-7F2FF28127CF}.Debug|x64.ActiveCfg = Debug|x64
@@ -920,6 +1070,7 @@ Global
{09DDAE21-397F-4263-8561-7F2FF28127CF}.Debug|x86.ActiveCfg = Debug|Win32
{09DDAE21-397F-4263-8561-7F2FF28127CF}.Debug|x86.Build.0 = Debug|Win32
{09DDAE21-397F-4263-8561-7F2FF28127CF}.Release|Any CPU.ActiveCfg = Release|Win32
+ {09DDAE21-397F-4263-8561-7F2FF28127CF}.Release|ARM.ActiveCfg = Release|Win32
{09DDAE21-397F-4263-8561-7F2FF28127CF}.Release|ARM64.ActiveCfg = Release|ARM64
{09DDAE21-397F-4263-8561-7F2FF28127CF}.Release|ARM64.Build.0 = Release|ARM64
{09DDAE21-397F-4263-8561-7F2FF28127CF}.Release|x64.ActiveCfg = Release|x64
@@ -927,6 +1078,7 @@ Global
{09DDAE21-397F-4263-8561-7F2FF28127CF}.Release|x86.ActiveCfg = Release|Win32
{09DDAE21-397F-4263-8561-7F2FF28127CF}.Release|x86.Build.0 = Release|Win32
{6539E9E1-BF36-40E5-86BC-070E99DB7B7B}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {6539E9E1-BF36-40E5-86BC-070E99DB7B7B}.Debug|ARM.ActiveCfg = Debug|Win32
{6539E9E1-BF36-40E5-86BC-070E99DB7B7B}.Debug|ARM64.ActiveCfg = Debug|ARM64
{6539E9E1-BF36-40E5-86BC-070E99DB7B7B}.Debug|ARM64.Build.0 = Debug|ARM64
{6539E9E1-BF36-40E5-86BC-070E99DB7B7B}.Debug|x64.ActiveCfg = Debug|x64
@@ -934,12 +1086,71 @@ Global
{6539E9E1-BF36-40E5-86BC-070E99DB7B7B}.Debug|x86.ActiveCfg = Debug|Win32
{6539E9E1-BF36-40E5-86BC-070E99DB7B7B}.Debug|x86.Build.0 = Debug|Win32
{6539E9E1-BF36-40E5-86BC-070E99DB7B7B}.Release|Any CPU.ActiveCfg = Release|Win32
+ {6539E9E1-BF36-40E5-86BC-070E99DB7B7B}.Release|ARM.ActiveCfg = Release|Win32
{6539E9E1-BF36-40E5-86BC-070E99DB7B7B}.Release|ARM64.ActiveCfg = Release|ARM64
{6539E9E1-BF36-40E5-86BC-070E99DB7B7B}.Release|ARM64.Build.0 = Release|ARM64
{6539E9E1-BF36-40E5-86BC-070E99DB7B7B}.Release|x64.ActiveCfg = Release|x64
{6539E9E1-BF36-40E5-86BC-070E99DB7B7B}.Release|x64.Build.0 = Release|x64
{6539E9E1-BF36-40E5-86BC-070E99DB7B7B}.Release|x86.ActiveCfg = Release|Win32
{6539E9E1-BF36-40E5-86BC-070E99DB7B7B}.Release|x86.Build.0 = Release|Win32
+ {E977B1BD-00DC-4085-A105-E0A18E0183D7}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {E977B1BD-00DC-4085-A105-E0A18E0183D7}.Debug|ARM.ActiveCfg = Debug|Win32
+ {E977B1BD-00DC-4085-A105-E0A18E0183D7}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {E977B1BD-00DC-4085-A105-E0A18E0183D7}.Debug|ARM64.Build.0 = Debug|ARM64
+ {E977B1BD-00DC-4085-A105-E0A18E0183D7}.Debug|x64.ActiveCfg = Debug|x64
+ {E977B1BD-00DC-4085-A105-E0A18E0183D7}.Debug|x64.Build.0 = Debug|x64
+ {E977B1BD-00DC-4085-A105-E0A18E0183D7}.Debug|x86.ActiveCfg = Debug|Win32
+ {E977B1BD-00DC-4085-A105-E0A18E0183D7}.Debug|x86.Build.0 = Debug|Win32
+ {E977B1BD-00DC-4085-A105-E0A18E0183D7}.Release|Any CPU.ActiveCfg = Release|Win32
+ {E977B1BD-00DC-4085-A105-E0A18E0183D7}.Release|ARM.ActiveCfg = Release|Win32
+ {E977B1BD-00DC-4085-A105-E0A18E0183D7}.Release|ARM64.ActiveCfg = Release|ARM64
+ {E977B1BD-00DC-4085-A105-E0A18E0183D7}.Release|ARM64.Build.0 = Release|ARM64
+ {E977B1BD-00DC-4085-A105-E0A18E0183D7}.Release|x64.ActiveCfg = Release|x64
+ {E977B1BD-00DC-4085-A105-E0A18E0183D7}.Release|x64.Build.0 = Release|x64
+ {E977B1BD-00DC-4085-A105-E0A18E0183D7}.Release|x86.ActiveCfg = Release|Win32
+ {E977B1BD-00DC-4085-A105-E0A18E0183D7}.Release|x86.Build.0 = Release|Win32
+ {4B30C685-8490-440F-9879-A75D45DAA361}.Debug|Any CPU.ActiveCfg = Debug|Win32
+ {4B30C685-8490-440F-9879-A75D45DAA361}.Debug|ARM.ActiveCfg = Debug|Win32
+ {4B30C685-8490-440F-9879-A75D45DAA361}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {4B30C685-8490-440F-9879-A75D45DAA361}.Debug|ARM64.Build.0 = Debug|ARM64
+ {4B30C685-8490-440F-9879-A75D45DAA361}.Debug|x64.ActiveCfg = Debug|x64
+ {4B30C685-8490-440F-9879-A75D45DAA361}.Debug|x64.Build.0 = Debug|x64
+ {4B30C685-8490-440F-9879-A75D45DAA361}.Debug|x86.ActiveCfg = Debug|Win32
+ {4B30C685-8490-440F-9879-A75D45DAA361}.Debug|x86.Build.0 = Debug|Win32
+ {4B30C685-8490-440F-9879-A75D45DAA361}.Release|Any CPU.ActiveCfg = Release|Win32
+ {4B30C685-8490-440F-9879-A75D45DAA361}.Release|ARM.ActiveCfg = Release|Win32
+ {4B30C685-8490-440F-9879-A75D45DAA361}.Release|ARM64.ActiveCfg = Release|ARM64
+ {4B30C685-8490-440F-9879-A75D45DAA361}.Release|ARM64.Build.0 = Release|ARM64
+ {4B30C685-8490-440F-9879-A75D45DAA361}.Release|x64.ActiveCfg = Release|x64
+ {4B30C685-8490-440F-9879-A75D45DAA361}.Release|x64.Build.0 = Release|x64
+ {4B30C685-8490-440F-9879-A75D45DAA361}.Release|x86.ActiveCfg = Release|Win32
+ {4B30C685-8490-440F-9879-A75D45DAA361}.Release|x86.Build.0 = Release|Win32
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Debug|ARM.ActiveCfg = Debug|ARM
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Debug|ARM64.ActiveCfg = Debug|ARM64
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Debug|ARM64.Build.0 = Debug|ARM64
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Debug|ARM64.Deploy.0 = Debug|ARM64
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Debug|x64.ActiveCfg = Debug|x64
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Debug|x64.Build.0 = Debug|x64
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Debug|x64.Deploy.0 = Debug|x64
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Debug|x86.ActiveCfg = Debug|x86
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Debug|x86.Build.0 = Debug|x86
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Debug|x86.Deploy.0 = Debug|x86
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Release|Any CPU.Deploy.0 = Release|Any CPU
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Release|ARM.ActiveCfg = Release|ARM
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Release|ARM64.ActiveCfg = Release|ARM64
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Release|ARM64.Build.0 = Release|ARM64
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Release|ARM64.Deploy.0 = Release|ARM64
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Release|x64.ActiveCfg = Release|x64
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Release|x64.Build.0 = Release|x64
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Release|x64.Deploy.0 = Release|x64
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Release|x86.ActiveCfg = Release|x86
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Release|x86.Build.0 = Release|x86
+ {D6A64926-4988-4C64-A5A8-2C14B1388696}.Release|x86.Deploy.0 = Release|x86
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -1023,6 +1234,10 @@ Global
{D45D4170-E055-4926-8B03-04DAA5F02C6C} = {448ED2E5-0B37-4D97-9E6B-8C10A507976A}
{09DDAE21-397F-4263-8561-7F2FF28127CF} = {0C534F12-B076-47E5-A05B-2A711233AC6F}
{6539E9E1-BF36-40E5-86BC-070E99DB7B7B} = {6CD01EF6-D4A4-4801-ADCF-344CF87FF942}
+ {53A85993-86AA-4818-AE5C-D5FB6FA71C89} = {448ED2E5-0B37-4D97-9E6B-8C10A507976A}
+ {E977B1BD-00DC-4085-A105-E0A18E0183D7} = {8630F7AA-2969-4DC9-8700-9B468C1DC21D}
+ {4B30C685-8490-440F-9879-A75D45DAA361} = {AC5FFC80-92FE-4933-BED2-EC5519AC4440}
+ {D6A64926-4988-4C64-A5A8-2C14B1388696} = {AC5FFC80-92FE-4933-BED2-EC5519AC4440}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {4B3D7591-CFEC-4762-9A07-ABE99938FB77}
diff --git a/build/NuSpecs/AppxManifest.xml b/build/NuSpecs/AppxManifest.xml
index 12dfcb72b8..4546bfc138 100644
--- a/build/NuSpecs/AppxManifest.xml
+++ b/build/NuSpecs/AppxManifest.xml
@@ -55,6 +55,11 @@
+
+
+
+
+
diff --git a/build/ProjectReunion-BuildFoundation.yml b/build/ProjectReunion-BuildFoundation.yml
index e8beb5b7b6..50a873c113 100644
--- a/build/ProjectReunion-BuildFoundation.yml
+++ b/build/ProjectReunion-BuildFoundation.yml
@@ -436,20 +436,18 @@ jobs:
prereleaseVersionTag: nightly
buildPool: $(ProjectReunionBuildPool)
-# Build WinAppSDK
-- job: IntegrationBuild
+# Build WinAppSDK and Run Integration Test from TestAll.ps1
+- job: WinAppSDKIntegrationBuildAndTest
dependsOn: ['CreateNugetPackage']
condition: succeeded()
pool: $(ProjectReunionBuildPool)
variables:
WindowsAppSDKPackageVersion: $[ dependencies.CreateNugetPackage.outputs['SetVersion.packageVersion'] ]
steps:
- - template: ..\eng\common\AzurePipelinesTemplates\WindowsAppSDK-BuildSetup-Steps.yml
- parameters:
- ArtifactName: 'FullNuget'
-
- - template: ..\eng\common\AzurePipelinesTemplates\WindowsAppSDK-Build-Steps.yml
+ - template: ..\eng\common\AzurePipelinesTemplates\WindowsAppSDK-BuildAndIntegrationTest-Steps.yml
parameters:
+ TestSelection: '*Foundation_*'
+ TransportPackageArtifactName: 'FullNuget'
BuildType: 'stable'
TransportPackages:
FoundationPackage:
@@ -460,7 +458,7 @@ jobs:
- job: Publish
dependsOn:
- CreateNugetPackage
- - IntegrationBuild
+ - WinAppSDKIntegrationBuildAndTest
condition: succeeded()
pool: $(ProjectReunionBuildPool)
variables:
@@ -489,4 +487,4 @@ jobs:
parameters:
AssetNames: 'Microsoft.WindowsAppSDK.Foundation.TransportPackage'
AssetVersions: $(WindowsAppSDKPackageVersion)
- TriggerSubscription: true
\ No newline at end of file
+ TriggerSubscription: true
diff --git a/dev/ToastNotifications/ToastActivatedEventArgs.h b/dev/ToastNotifications/ToastActivatedEventArgs.h
new file mode 100644
index 0000000000..ff8c8f869f
--- /dev/null
+++ b/dev/ToastNotifications/ToastActivatedEventArgs.h
@@ -0,0 +1,19 @@
+#pragma once
+#include "Microsoft.Windows.ToastNotifications.ToastActivatedEventArgs.g.h"
+
+namespace winrt::Microsoft::Windows::ToastNotifications::implementation
+{
+ struct ToastActivatedEventArgs : ToastActivatedEventArgsT
+ {
+ ToastActivatedEventArgs() = default;
+
+ ToastActivatedEventArgs(winrt::hstring const& arguments, winrt::Windows::Foundation::Collections::IMap const& userInput) : m_arguments(arguments), m_userInput(userInput) {};
+
+ winrt::hstring ActivationArgs() { return m_arguments; };
+ winrt::Windows::Foundation::Collections::IMap UserInput() { return m_userInput; };
+
+ private:
+ winrt::hstring m_arguments;
+ winrt::Windows::Foundation::Collections::IMap m_userInput;
+ };
+}
diff --git a/dev/ToastNotifications/ToastActivationCallback.cpp b/dev/ToastNotifications/ToastActivationCallback.cpp
new file mode 100644
index 0000000000..6d3f9bf6ca
--- /dev/null
+++ b/dev/ToastNotifications/ToastActivationCallback.cpp
@@ -0,0 +1,51 @@
+#include "pch.h"
+#include
+#include "ToastActivatedEventArgs.h"
+#include "externs.h"
+#include
+#include
+#include
+#include
+#include
+
+namespace winrt
+{
+ using namespace Microsoft::Windows::ToastNotifications;
+ using namespace Windows::ApplicationModel::Core;
+ using namespace Windows::Foundation;
+ using namespace Windows::Foundation::Collections;
+}
+
+HRESULT __stdcall ToastActivationCallback::Activate(
+ LPCWSTR /* appUserModelId */,
+ LPCWSTR invokedArgs,
+ [[maybe_unused]] NOTIFICATION_USER_INPUT_DATA const* data,
+ [[maybe_unused]] ULONG dataCount) noexcept try
+{
+ winrt::IMap userInput{ winrt::single_threaded_map() };
+ for (unsigned long i = 0; i < dataCount; i++)
+ {
+ userInput.Insert(data[i].Key, data[i].Value);
+ }
+
+ winrt::ToastActivatedEventArgs activatedEventArgs = winrt::make(invokedArgs, userInput);
+
+
+ if (GetToastHandlers())
+ {
+ /* As the process is already launched, we invoke the foreground toast event handlers with the activatedEventArgs */
+ GetToastHandlers()(*this, activatedEventArgs);
+ }
+ else
+ {
+ /* Activation results in a process launch, we cache the activatedEventArgs in the COM static store
+ and fire an event to let the main thread know that it is okay to infer into AppLifeCycle::GetToastActivatedEventArgs().
+ */
+ auto appProperties = winrt::CoreApplication::Properties();
+ appProperties.Insert(ACTIVATED_EVENT_ARGS_KEY, activatedEventArgs);
+ SetEvent(GetWaitHandleForArgs().get());
+ }
+
+ return S_OK;
+}
+CATCH_RETURN()
diff --git a/dev/ToastNotifications/ToastActivationCallback.h b/dev/ToastNotifications/ToastActivationCallback.h
new file mode 100644
index 0000000000..257394bb61
--- /dev/null
+++ b/dev/ToastNotifications/ToastActivationCallback.h
@@ -0,0 +1,38 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+#pragma once
+
+#include "NotificationActivationCallback.h"
+
+struct ToastActivationCallback : winrt::implements
+{
+ HRESULT __stdcall Activate(
+ LPCWSTR appUserModelId,
+ LPCWSTR invokedArgs,
+ [[maybe_unused]] NOTIFICATION_USER_INPUT_DATA const* data,
+ [[maybe_unused]] ULONG dataCount) noexcept;
+};
+
+struct ToastActivationCallbackFactory : winrt::implements
+{
+ STDMETHODIMP CreateInstance(_In_opt_ IUnknown* aggregateInterface, _In_ REFIID interfaceId, _Outptr_ VOID** object) noexcept final try
+ {
+ RETURN_HR_IF_NULL(CLASS_E_NOAGGREGATION, aggregateInterface);
+ return winrt::make().as(interfaceId, object);
+ }
+ CATCH_RETURN()
+
+ STDMETHODIMP LockServer(BOOL fLock) noexcept final
+ {
+ if (fLock)
+ {
+ ++winrt::get_module_lock();
+ }
+ else
+ {
+ --winrt::get_module_lock();
+ }
+ return S_OK;
+ }
+};
diff --git a/dev/ToastNotifications/ToastActivationInfo.cpp b/dev/ToastNotifications/ToastActivationInfo.cpp
new file mode 100644
index 0000000000..7dc27c2a89
--- /dev/null
+++ b/dev/ToastNotifications/ToastActivationInfo.cpp
@@ -0,0 +1,42 @@
+#include "pch.h"
+#include "ToastActivationInfo.h"
+#include "Microsoft.Windows.ToastNotifications.ToastActivationInfo.g.cpp"
+
+namespace winrt::Microsoft::Windows::ToastNotifications::implementation
+{
+ winrt::Microsoft::Windows::ToastNotifications::ToastActivationInfo ToastActivationInfo::CreateFromActivationGuid(winrt::guid const& taskClsid)
+ {
+ THROW_HR_IF_MSG(E_ILLEGAL_METHOD_CALL, !AppModel::Identity::IsPackagedProcess(), "Not applicable for unpackaged applications");
+
+ THROW_HR_IF(E_INVALIDARG, (taskClsid == winrt::guid(GUID_NULL)));
+
+ return winrt::make(taskClsid);
+ }
+
+ winrt::Microsoft::Windows::ToastNotifications::ToastActivationInfo ToastActivationInfo::CreateFromToastAssets(winrt::Microsoft::Windows::ToastNotifications::ToastAssets const& assets)
+ {
+ THROW_HR_IF_MSG(E_ILLEGAL_METHOD_CALL, AppModel::Identity::IsPackagedProcess(), "Not applicable for packaged applications");
+
+ THROW_HR_IF_NULL_MSG(E_POINTER, assets, "Invalid Toast asset parameter");
+
+ THROW_HR_IF_NULL_MSG(E_POINTER, assets.IconPath(), "Invalid icon URI");
+
+ THROW_HR_IF_MSG(E_INVALIDARG, (assets.DisplayName().size() == 0), "Display name string is empty");
+
+ return winrt::make(assets);
+ }
+
+ winrt::guid ToastActivationInfo::TaskClsid()
+ {
+ THROW_HR_IF_MSG(E_ILLEGAL_METHOD_CALL, !AppModel::Identity::IsPackagedProcess(), "Not applicable for unpackaged applications");
+
+ return m_taskClsid;
+ }
+
+ winrt::Microsoft::Windows::ToastNotifications::ToastAssets ToastActivationInfo::Assets()
+ {
+ THROW_HR_IF_MSG(E_ILLEGAL_METHOD_CALL, AppModel::Identity::IsPackagedProcess(), "Not applicable for packaged applications");
+
+ return m_assets;
+ }
+}
diff --git a/dev/ToastNotifications/ToastActivationInfo.h b/dev/ToastNotifications/ToastActivationInfo.h
new file mode 100644
index 0000000000..c062bd0451
--- /dev/null
+++ b/dev/ToastNotifications/ToastActivationInfo.h
@@ -0,0 +1,27 @@
+#pragma once
+#include "Microsoft.Windows.ToastNotifications.ToastActivationInfo.g.h"
+
+namespace winrt::Microsoft::Windows::ToastNotifications::implementation
+{
+ struct ToastActivationInfo : ToastActivationInfoT
+ {
+ ToastActivationInfo() = default;
+
+ ToastActivationInfo(winrt::guid const& taskClsid) : m_taskClsid(taskClsid) {};
+ ToastActivationInfo(winrt::Microsoft::Windows::ToastNotifications::ToastAssets const& assets) : m_assets(assets) {};
+ static winrt::Microsoft::Windows::ToastNotifications::ToastActivationInfo CreateFromActivationGuid(winrt::guid const& taskClsid);
+ static winrt::Microsoft::Windows::ToastNotifications::ToastActivationInfo CreateFromToastAssets(winrt::Microsoft::Windows::ToastNotifications::ToastAssets const& assets);
+ winrt::guid TaskClsid();
+ winrt::Microsoft::Windows::ToastNotifications::ToastAssets Assets();
+
+ private:
+ const winrt::guid m_taskClsid{ GUID_NULL };
+ const winrt::Microsoft::Windows::ToastNotifications::ToastAssets m_assets{ nullptr };
+ };
+}
+namespace winrt::Microsoft::Windows::ToastNotifications::factory_implementation
+{
+ struct ToastActivationInfo : ToastActivationInfoT
+ {
+ };
+}
diff --git a/dev/ToastNotifications/ToastAssets.cpp b/dev/ToastNotifications/ToastAssets.cpp
new file mode 100644
index 0000000000..7b0d338056
--- /dev/null
+++ b/dev/ToastNotifications/ToastAssets.cpp
@@ -0,0 +1,15 @@
+#include "pch.h"
+#include "ToastAssets.h"
+#include "Microsoft.Windows.ToastNotifications.ToastAssets.g.cpp"
+
+namespace winrt::Microsoft::Windows::ToastNotifications::implementation
+{
+ hstring ToastAssets::DisplayName()
+ {
+ return m_displayName;
+ }
+ winrt::Windows::Foundation::Uri ToastAssets::IconPath()
+ {
+ return m_iconPath;
+ }
+}
diff --git a/dev/ToastNotifications/ToastAssets.h b/dev/ToastNotifications/ToastAssets.h
new file mode 100644
index 0000000000..163564b3aa
--- /dev/null
+++ b/dev/ToastNotifications/ToastAssets.h
@@ -0,0 +1,24 @@
+#pragma once
+#include "Microsoft.Windows.ToastNotifications.ToastAssets.g.h"
+
+namespace winrt::Microsoft::Windows::ToastNotifications::implementation
+{
+ struct ToastAssets : ToastAssetsT
+ {
+ ToastAssets() = default;
+
+ ToastAssets(winrt::hstring const& displayName, winrt::Windows::Foundation::Uri const& iconPath) : m_displayName(displayName), m_iconPath(iconPath) {};
+ hstring DisplayName();
+ winrt::Windows::Foundation::Uri IconPath();
+
+ private:
+ const hstring m_displayName;
+ const winrt::Windows::Foundation::Uri m_iconPath;
+ };
+}
+namespace winrt::Microsoft::Windows::ToastNotifications::factory_implementation
+{
+ struct ToastAssets : ToastAssetsT
+ {
+ };
+}
diff --git a/dev/ToastNotifications/ToastNotification.cpp b/dev/ToastNotifications/ToastNotification.cpp
new file mode 100644
index 0000000000..b7f86a0710
--- /dev/null
+++ b/dev/ToastNotifications/ToastNotification.cpp
@@ -0,0 +1,79 @@
+#include "pch.h"
+#include "ToastNotification.h"
+#include "Microsoft.Windows.ToastNotifications.ToastNotification.g.cpp"
+
+namespace winrt::Microsoft::Windows::ToastNotifications::implementation
+{
+ ToastNotification::ToastNotification(winrt::Windows::Data::Xml::Dom::XmlDocument const& /* payload */)
+ {
+ throw hresult_not_implemented();
+ }
+ hstring ToastNotification::Tag()
+ {
+ throw hresult_not_implemented();
+ }
+ void ToastNotification::Tag(hstring const& /* value */)
+ {
+ throw hresult_not_implemented();
+ }
+ hstring ToastNotification::Group()
+ {
+ throw hresult_not_implemented();
+ }
+ void ToastNotification::Group(hstring const& /* value */)
+ {
+ throw hresult_not_implemented();
+ }
+ uint32_t ToastNotification::ToastId()
+ {
+ throw hresult_not_implemented();
+ }
+ void ToastNotification::ToastId(uint32_t /* value */)
+ {
+ throw hresult_not_implemented();
+ }
+ winrt::Windows::Data::Xml::Dom::XmlDocument ToastNotification::Payload()
+ {
+ throw hresult_not_implemented();
+ }
+ winrt::Microsoft::Windows::ToastNotifications::ToastProgressData ToastNotification::ProgressData()
+ {
+ throw hresult_not_implemented();
+ }
+ void ToastNotification::ProgressData(winrt::Microsoft::Windows::ToastNotifications::ToastProgressData const& /* value */)
+ {
+ throw hresult_not_implemented();
+ }
+ winrt::Windows::Foundation::DateTime ToastNotification::ExpirationTime()
+ {
+ throw hresult_not_implemented();
+ }
+ void ToastNotification::ExpirationTime(winrt::Windows::Foundation::DateTime const& /* value */)
+ {
+ throw hresult_not_implemented();
+ }
+ bool ToastNotification::ExpiresOnReboot()
+ {
+ throw hresult_not_implemented();
+ }
+ void ToastNotification::ExpiresOnReboot(bool /* value */)
+ {
+ throw hresult_not_implemented();
+ }
+ winrt::Microsoft::Windows::ToastNotifications::ToastPriority ToastNotification::Priority()
+ {
+ throw hresult_not_implemented();
+ }
+ void ToastNotification::Priority(winrt::Microsoft::Windows::ToastNotifications::ToastPriority const& /* value */)
+ {
+ throw hresult_not_implemented();
+ }
+ bool ToastNotification::SuppressDisplay()
+ {
+ throw hresult_not_implemented();
+ }
+ void ToastNotification::SuppressDisplay(bool /* value */)
+ {
+ throw hresult_not_implemented();
+ }
+}
diff --git a/dev/ToastNotifications/ToastNotification.h b/dev/ToastNotifications/ToastNotification.h
new file mode 100644
index 0000000000..02c94d2922
--- /dev/null
+++ b/dev/ToastNotifications/ToastNotification.h
@@ -0,0 +1,35 @@
+#pragma once
+#include "Microsoft.Windows.ToastNotifications.ToastNotification.g.h"
+
+namespace winrt::Microsoft::Windows::ToastNotifications::implementation
+{
+ struct ToastNotification : ToastNotificationT
+ {
+ ToastNotification() = default;
+
+ ToastNotification(winrt::Windows::Data::Xml::Dom::XmlDocument const& payload);
+ hstring Tag();
+ void Tag(hstring const& value);
+ hstring Group();
+ void Group(hstring const& value);
+ uint32_t ToastId();
+ void ToastId(uint32_t value);
+ winrt::Windows::Data::Xml::Dom::XmlDocument Payload();
+ winrt::Microsoft::Windows::ToastNotifications::ToastProgressData ProgressData();
+ void ProgressData(winrt::Microsoft::Windows::ToastNotifications::ToastProgressData const& value);
+ winrt::Windows::Foundation::DateTime ExpirationTime();
+ void ExpirationTime(winrt::Windows::Foundation::DateTime const& value);
+ bool ExpiresOnReboot();
+ void ExpiresOnReboot(bool value);
+ winrt::Microsoft::Windows::ToastNotifications::ToastPriority Priority();
+ void Priority(winrt::Microsoft::Windows::ToastNotifications::ToastPriority const& value);
+ bool SuppressDisplay();
+ void SuppressDisplay(bool value);
+ };
+}
+namespace winrt::Microsoft::Windows::ToastNotifications::factory_implementation
+{
+ struct ToastNotification : ToastNotificationT
+ {
+ };
+}
diff --git a/dev/ToastNotifications/ToastNotificationHistory.cpp b/dev/ToastNotifications/ToastNotificationHistory.cpp
new file mode 100644
index 0000000000..7617c6912a
--- /dev/null
+++ b/dev/ToastNotifications/ToastNotificationHistory.cpp
@@ -0,0 +1,31 @@
+#include "pch.h"
+#include "ToastNotificationHistory.h"
+#include "Microsoft.Windows.ToastNotifications.ToastNotificationHistory.g.cpp"
+
+namespace winrt::Microsoft::Windows::ToastNotifications::implementation
+{
+ winrt::Windows::Foundation::IAsyncAction ToastNotificationHistory::RemoveWithIdentiferAsync(uint32_t /* toastIdentifier */)
+ {
+ throw hresult_not_implemented();
+ }
+ winrt::Windows::Foundation::IAsyncAction ToastNotificationHistory::RemoveWithTagAsync(hstring /* tag */)
+ {
+ throw hresult_not_implemented();
+ }
+ winrt::Windows::Foundation::IAsyncAction ToastNotificationHistory::RemoveWithTagGroupAsync(hstring /* tag */, hstring /* group */)
+ {
+ throw hresult_not_implemented();
+ }
+ winrt::Windows::Foundation::IAsyncAction ToastNotificationHistory::RemoveGroupAsync(hstring /* group */)
+ {
+ throw hresult_not_implemented();
+ }
+ winrt::Windows::Foundation::IAsyncAction ToastNotificationHistory::RemoveAllAsync()
+ {
+ throw hresult_not_implemented();
+ }
+ winrt::Windows::Foundation::IAsyncOperation> ToastNotificationHistory::GetAllAsync()
+ {
+ throw hresult_not_implemented();
+ }
+}
diff --git a/dev/ToastNotifications/ToastNotificationHistory.h b/dev/ToastNotifications/ToastNotificationHistory.h
new file mode 100644
index 0000000000..3c6c739c6e
--- /dev/null
+++ b/dev/ToastNotifications/ToastNotificationHistory.h
@@ -0,0 +1,17 @@
+#pragma once
+#include "Microsoft.Windows.ToastNotifications.ToastNotificationHistory.g.h"
+
+namespace winrt::Microsoft::Windows::ToastNotifications::implementation
+{
+ struct ToastNotificationHistory : ToastNotificationHistoryT
+ {
+ ToastNotificationHistory() = default;
+
+ winrt::Windows::Foundation::IAsyncAction RemoveWithIdentiferAsync(uint32_t toastIdentifier);
+ winrt::Windows::Foundation::IAsyncAction RemoveWithTagAsync(hstring tag);
+ winrt::Windows::Foundation::IAsyncAction RemoveWithTagGroupAsync(hstring tag, hstring group);
+ winrt::Windows::Foundation::IAsyncAction RemoveGroupAsync(hstring group);
+ winrt::Windows::Foundation::IAsyncAction RemoveAllAsync();
+ winrt::Windows::Foundation::IAsyncOperation> GetAllAsync();
+ };
+}
diff --git a/dev/ToastNotifications/ToastNotificationManager.cpp b/dev/ToastNotifications/ToastNotificationManager.cpp
new file mode 100644
index 0000000000..b6596a75ed
--- /dev/null
+++ b/dev/ToastNotifications/ToastNotificationManager.cpp
@@ -0,0 +1,109 @@
+#include "pch.h"
+#include "ToastNotificationManager.h"
+#include "Microsoft.Windows.ToastNotifications.ToastNotificationManager.g.cpp"
+#include
+#include
+#include
+#include "ToastActivationCallback.h"
+#include "externs.h"
+#include "ToastNotificationUtility.h"
+#include
+
+static winrt::event> g_toastHandlers;
+
+winrt::event>& GetToastHandlers()
+{
+ return g_toastHandlers;
+}
+
+namespace winrt
+{
+ using namespace winrt::Windows::UI;
+ using namespace winrt::Windows::Foundation;
+ using namespace Windows::ApplicationModel::Core;
+}
+
+namespace winrt::Microsoft::Windows::ToastNotifications::implementation
+{
+ static wil::unique_com_class_object_cookie s_toastcomActivatorRegistration;
+
+ winrt::Microsoft::Windows::ToastNotifications::ToastNotificationManager ToastNotificationManager::Default()
+ {
+ static auto toastNotificationManager{ winrt::make() };
+ return toastNotificationManager;
+ }
+
+ void ToastNotificationManager::RegisterActivator(winrt::Microsoft::Windows::ToastNotifications::ToastActivationInfo const& details)
+ {
+ THROW_HR_IF_MSG(E_INVALIDARG, s_toastcomActivatorRegistration, "Toast activator already registered.");
+
+ THROW_HR_IF_NULL(E_INVALIDARG, details);
+
+ std::wstring storedComActivatorString;
+ if (!AppModel::Identity::IsPackagedProcess())
+ {
+ storedComActivatorString = RegisterComActivatorGuidAndAssets(details);
+ // Remove braces around the guid string
+ storedComActivatorString = storedComActivatorString.substr(1, storedComActivatorString.size() - 2);
+ }
+
+ THROW_IF_FAILED(::CoRegisterClassObject(
+ AppModel::Identity::IsPackagedProcess() ? details.TaskClsid() : winrt::guid(storedComActivatorString),
+ winrt::make().get(),
+ CLSCTX_LOCAL_SERVER,
+ REGCLS_MULTIPLEUSE,
+ &s_toastcomActivatorRegistration));
+
+ GetWaitHandleForArgs().create();
+ }
+
+ void ToastNotificationManager::UnregisterActivator()
+ {
+ THROW_HR_IF_MSG(HRESULT_FROM_WIN32(ERROR_NOT_FOUND), !s_toastcomActivatorRegistration, "Toast activator not registered.");
+
+ s_toastcomActivatorRegistration.reset();
+
+ if (!AppModel::Identity::IsPackagedProcess())
+ {
+ std::wstring storedComActivatorString;
+ THROW_IF_WIN32_ERROR(GetActivatorGuid(storedComActivatorString));
+
+ UnRegisterComServer(storedComActivatorString);
+ UnRegisterAppIdentifierFromRegistry();
+
+ // TODO: Remove ToastGuid reference from LRP
+ }
+ }
+ winrt::event_token ToastNotificationManager::ToastActivated(winrt::Windows::Foundation::EventHandler const& /* handler */)
+ {
+ throw hresult_not_implemented();
+ }
+ void ToastNotificationManager::ToastActivated(winrt::event_token const&/* token */)
+ {
+ throw hresult_not_implemented();
+ }
+ void ToastNotificationManager::ShowToast(winrt::Microsoft::Windows::ToastNotifications::ToastNotification const& /* toast */)
+ {
+ throw hresult_not_implemented();
+ }
+ winrt::Windows::Foundation::IAsyncOperation ToastNotificationManager::UpdateToastProgressDataAsync(winrt::Microsoft::Windows::ToastNotifications::ToastProgressData /* data */, hstring /* tag */, hstring /* group */)
+ {
+ throw hresult_not_implemented();
+ }
+ winrt::Windows::Foundation::IAsyncOperation ToastNotificationManager::UpdateToastProgressDataAsync(winrt::Microsoft::Windows::ToastNotifications::ToastProgressData /* data */, hstring /* tag */)
+ {
+ throw hresult_not_implemented();
+ }
+ winrt::Microsoft::Windows::ToastNotifications::ToastNotificationSetting ToastNotificationManager::Setting()
+ {
+ throw hresult_not_implemented();
+ }
+ winrt::Microsoft::Windows::ToastNotifications::ToastNotificationHistory ToastNotificationManager::History()
+ {
+ throw hresult_not_implemented();
+ }
+ winrt::Windows::Data::Xml::Dom::XmlDocument ToastNotificationManager::GetXmlTemplateContent(winrt::Microsoft::Windows::ToastNotifications::ToastTemplateType const& /* type */)
+ {
+ throw hresult_not_implemented();
+ }
+}
diff --git a/dev/ToastNotifications/ToastNotificationManager.h b/dev/ToastNotifications/ToastNotificationManager.h
new file mode 100644
index 0000000000..2c20ad1d4a
--- /dev/null
+++ b/dev/ToastNotifications/ToastNotificationManager.h
@@ -0,0 +1,38 @@
+#pragma once
+#include "Microsoft.Windows.ToastNotifications.ToastNotificationManager.g.h"
+
+namespace winrt::Microsoft::Windows::ToastNotifications::implementation
+{
+ struct ToastNotificationManager : ToastNotificationManagerT
+ {
+ ToastNotificationManager() = default;
+
+ static winrt::Microsoft::Windows::ToastNotifications::ToastNotificationManager Default();
+
+ void RegisterActivator(winrt::Microsoft::Windows::ToastNotifications::ToastActivationInfo const& details);
+
+ void UnregisterActivator();
+
+ winrt::event_token ToastActivated(winrt::Windows::Foundation::EventHandler const& handler);
+
+ void ToastActivated(winrt::event_token const& token);
+
+ void ShowToast(winrt::Microsoft::Windows::ToastNotifications::ToastNotification const& toast);
+
+ winrt::Windows::Foundation::IAsyncOperation UpdateToastProgressDataAsync(winrt::Microsoft::Windows::ToastNotifications::ToastProgressData data, hstring tag, hstring group);
+
+ winrt::Windows::Foundation::IAsyncOperation UpdateToastProgressDataAsync(winrt::Microsoft::Windows::ToastNotifications::ToastProgressData data, hstring tag);
+
+ winrt::Microsoft::Windows::ToastNotifications::ToastNotificationSetting Setting();
+
+ winrt::Microsoft::Windows::ToastNotifications::ToastNotificationHistory History();
+
+ winrt::Windows::Data::Xml::Dom::XmlDocument GetXmlTemplateContent(winrt::Microsoft::Windows::ToastNotifications::ToastTemplateType const& type);
+ };
+}
+namespace winrt::Microsoft::Windows::ToastNotifications::factory_implementation
+{
+ struct ToastNotificationManager : ToastNotificationManagerT
+ {
+ };
+}
diff --git a/dev/ToastNotifications/ToastNotificationUtility.cpp b/dev/ToastNotifications/ToastNotificationUtility.cpp
new file mode 100644
index 0000000000..8b46f50cab
--- /dev/null
+++ b/dev/ToastNotifications/ToastNotificationUtility.cpp
@@ -0,0 +1,216 @@
+
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+#include "pch.h"
+#include "ToastNotificationUtility.h"
+#include
+#include
+#include
+#include
+
+namespace winrt
+{
+ using namespace winrt::Windows::Foundation;
+ using namespace Windows::ApplicationModel::Core;
+}
+
+std::wstring RetrieveUnpackagedAppId()
+{
+ wil::unique_cotaskmem_string processName;
+ THROW_IF_FAILED(GetCurrentProcessPath(processName));
+
+ std::wstring wideStringProcessName{ processName.get() };
+ // subKey: L"Software\\Classes\\AppUserModelId\\{Path to ToastNotificationsTestApp.exe}"
+ std::wstring subKey{ c_appIdentifierPath + ConvertPathToKey(wideStringProcessName) };
+
+ wil::unique_hkey hKey;
+ THROW_IF_FAILED(RegCreateKeyEx(
+ HKEY_CURRENT_USER,
+ subKey.c_str(),
+ 0,
+ nullptr /* lpClass */,
+ REG_OPTION_NON_VOLATILE,
+ KEY_ALL_ACCESS,
+ nullptr /* lpSecurityAttributes */,
+ &hKey,
+ nullptr /* lpdwDisposition */));
+
+ WCHAR registeredGuidBuffer[GUID_LENGTH];
+ DWORD bufferLength = sizeof(registeredGuidBuffer);
+ HRESULT status = RegGetValueW(
+ hKey.get(),
+ nullptr /* lpValue */,
+ L"ToastGUID",
+ RRF_RT_REG_SZ,
+ nullptr /* pdwType */,
+ ®isteredGuidBuffer,
+ &bufferLength);
+
+ if (status == ERROR_FILE_NOT_FOUND)
+ {
+ GUID newToastGuid;
+ THROW_IF_FAILED(CoCreateGuid(&newToastGuid));
+
+ wil::unique_cotaskmem_string newToastGuidString;
+ THROW_IF_FAILED(StringFromCLSID(newToastGuid, &newToastGuidString));
+
+ std::wstring guidWideStr{ newToastGuidString.get() };
+ RegisterValue(hKey, L"ToastGUID", reinterpret_cast(guidWideStr.c_str()), REG_SZ, guidWideStr.size() * sizeof(wchar_t));
+ return guidWideStr;
+ }
+
+ THROW_HR_IF(status, FAILED_WIN32(status));
+ return registeredGuidBuffer;
+}
+
+std::wstring RetrieveAppId()
+{
+ if (AppModel::Identity::IsPackagedProcess())
+ {
+ wchar_t appUserModelId[APPLICATION_USER_MODEL_ID_MAX_LENGTH] = {};
+ UINT32 appUserModelIdSize{ APPLICATION_USER_MODEL_ID_MAX_LENGTH };
+
+ THROW_IF_FAILED(GetCurrentApplicationUserModelId(&appUserModelIdSize, appUserModelId));
+ return appUserModelId;
+ }
+
+ return RetrieveUnpackagedAppId();
+}
+
+void RegisterAssets(std::wstring const& appId, winrt::Microsoft::Windows::ToastNotifications::ToastAssets const& activationInfo, wil::unique_cotaskmem_string const& clsid)
+{
+ wil::unique_hkey hKey;
+ // subKey: \Software\Classes\AppUserModelId\{AppGUID}
+ std::wstring subKey{ c_appIdentifierPath + appId };
+
+ THROW_IF_FAILED(RegCreateKeyEx(
+ HKEY_CURRENT_USER,
+ subKey.c_str(),
+ 0,
+ nullptr /* lpClass */,
+ REG_OPTION_NON_VOLATILE,
+ KEY_ALL_ACCESS,
+ nullptr /* lpSecurityAttributes */,
+ &hKey,
+ nullptr /* lpdwDisposition */));
+
+ RegisterValue(hKey, L"DisplayName", reinterpret_cast(activationInfo.DisplayName().c_str()), REG_EXPAND_SZ, activationInfo.DisplayName().size() * sizeof(wchar_t));
+ RegisterValue(hKey, L"IconUri", reinterpret_cast(activationInfo.IconPath().AbsoluteUri().c_str()), REG_EXPAND_SZ, activationInfo.IconPath().AbsoluteUri().size() * sizeof(wchar_t));
+
+ std::wstring wideStringClsid{ clsid.get() };
+ RegisterValue(hKey, L"CustomActivator", reinterpret_cast(wideStringClsid.c_str()), REG_SZ, wideStringClsid.size() * sizeof(wchar_t));
+}
+
+void RegisterComServer(wil::unique_cotaskmem_string const& processName, wil::unique_cotaskmem_string const& clsid)
+{
+ wil::unique_hkey hKey;
+ //subKey: Software\Classes\CLSID\{comActivatorGuidString}\LocalServer32
+ std::wstring subKey{ c_clsIdPath + clsid.get() + LR"(\LocalServer32)" };
+
+ THROW_IF_FAILED(RegCreateKeyEx(
+ HKEY_CURRENT_USER,
+ subKey.c_str(),
+ 0,
+ nullptr /* lpClass */,
+ REG_OPTION_NON_VOLATILE,
+ KEY_ALL_ACCESS,
+ nullptr /* lpSecurityAttributes */,
+ &hKey,
+ nullptr /* lpdwDisposition */));
+
+ std::wstring comRegistrationExeString{ c_quote + processName.get() + c_quote + c_toastActivatedArgument };
+
+ RegisterValue(hKey, nullptr, reinterpret_cast(comRegistrationExeString.c_str()), REG_SZ, (comRegistrationExeString.size() * sizeof(wchar_t)));
+}
+
+void UnRegisterComServer(std::wstring const& clsid)
+{
+ wil::unique_hkey hKey;
+ //subKey: Software\Classes\CLSID\{comActivatorGuidString}\LocalServer32
+ std::wstring subKey{ c_clsIdPath + clsid + LR"(\LocalServer32)" };
+
+ THROW_IF_FAILED(RegDeleteKeyEx(
+ HKEY_CURRENT_USER,
+ subKey.c_str(),
+ KEY_WOW64_64KEY,
+ 0));
+}
+
+void UnRegisterAppIdentifierFromRegistry()
+{
+ std::wstring appIdentifier{ RetrieveAppId() };
+
+ wil::unique_hkey hKey;
+ //subKey: \Software\Classes\AppUserModelId\{AppGUID}
+ std::wstring subKey{ c_appIdentifierPath + appIdentifier };
+
+ THROW_IF_FAILED(RegDeleteKeyEx(
+ HKEY_CURRENT_USER,
+ subKey.c_str(),
+ KEY_WOW64_64KEY,
+ 0));
+}
+
+HRESULT GetActivatorGuid(std::wstring& activatorGuid) noexcept try
+{
+ std::wstring appIdentifier{ RetrieveAppId() };
+ // subKey: \Software\Classes\AppUserModelId\{AppGUID}
+ std::wstring subKey{ c_appIdentifierPath + appIdentifier };
+
+ wil::unique_hkey hKey;
+ THROW_IF_FAILED(RegCreateKeyEx(
+ HKEY_CURRENT_USER,
+ subKey.c_str(),
+ 0,
+ nullptr /* lpClass */,
+ REG_OPTION_NON_VOLATILE,
+ KEY_ALL_ACCESS,
+ nullptr /* lpSecurityAttributes */,
+ &hKey,
+ nullptr /* lpdwDisposition */));
+
+ WCHAR activatorGuidBuffer[GUID_LENGTH];
+ DWORD bufferLength = sizeof(activatorGuidBuffer);
+ HRESULT status = RegGetValueW(
+ hKey.get(),
+ nullptr /* lpValue */,
+ L"CustomActivator",
+ RRF_RT_REG_SZ,
+ nullptr /* pdwType */,
+ &activatorGuidBuffer,
+ &bufferLength);
+
+ activatorGuid = activatorGuidBuffer;
+ return status;
+}
+CATCH_RETURN()
+
+std::wstring RegisterComActivatorGuidAndAssets(winrt::Microsoft::Windows::ToastNotifications::ToastActivationInfo const& details)
+{
+ std::wstring appIdentifier{ RetrieveAppId() };
+ THROW_IF_FAILED(PushNotifications_RegisterFullTrustApplication(appIdentifier.c_str(), GUID_NULL));
+
+ std::wstring registeredGuid;
+ HRESULT status = GetActivatorGuid(registeredGuid);
+ if (status == ERROR_FILE_NOT_FOUND)
+ {
+ wil::unique_cotaskmem_string processName;
+ THROW_IF_FAILED(GetCurrentProcessPath(processName));
+
+ GUID comActivatorGuid = GUID_NULL;
+ THROW_IF_FAILED(CoCreateGuid(&comActivatorGuid));
+
+ // StringFromCLSID returns GUID String with braces.
+ wil::unique_cotaskmem_string comActivatorGuidString;
+ THROW_IF_FAILED(StringFromCLSID(comActivatorGuid, &comActivatorGuidString));
+
+ RegisterAssets(appIdentifier, details.Assets(), comActivatorGuidString);
+ RegisterComServer(processName, comActivatorGuidString);
+
+ return comActivatorGuidString.get();
+ }
+
+ THROW_IF_WIN32_ERROR(status);
+ return registeredGuid;
+}
diff --git a/dev/ToastNotifications/ToastNotificationUtility.h b/dev/ToastNotifications/ToastNotificationUtility.h
new file mode 100644
index 0000000000..4e546b343e
--- /dev/null
+++ b/dev/ToastNotifications/ToastNotificationUtility.h
@@ -0,0 +1,49 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+#pragma once
+#include "pch.h"
+#include
+#include
+
+const std::wstring c_appIdentifierPath{ LR"(Software\Classes\AppUserModelId\)" };
+const std::wstring c_clsIdPath{ LR"(Software\Classes\CLSID\)" };
+const std::wstring c_quote{ LR"(")" };
+const std::wstring c_toastActivatedArgument{ L" ----ToastActivated:" };
+
+winrt::event>& GetToastHandlers();
+
+inline const int GUID_LENGTH = 39; // GUID + '{' + '}' + '/0'
+
+inline std::wstring ConvertPathToKey(std::wstring path)
+{
+ for (int i = 0; i < path.length(); i++)
+ {
+ if (path[i] == '\\')
+ {
+ path[i] = '.';
+ }
+ }
+ return path;
+}
+
+inline void RegisterValue(wil::unique_hkey const& hKey, PCWSTR const& key, const BYTE* value, DWORD const& valueType, size_t const& size)
+{
+ THROW_IF_FAILED(RegSetValueExW(hKey.get(), key, 0, valueType, value, (DWORD) size));
+}
+
+std::wstring RetrieveUnpackagedAppId();
+
+std::wstring RetrieveAppId();
+
+void RegisterAssets(std::wstring const& appId, winrt::Microsoft::Windows::ToastNotifications::ToastAssets const& activationInfo, wil::unique_cotaskmem_string const& clsid);
+
+void RegisterComServer(wil::unique_cotaskmem_string const& processName, wil::unique_cotaskmem_string const& clsid);
+
+void UnRegisterComServer(std::wstring const& clsid);
+
+void UnRegisterAppIdentifierFromRegistry();
+
+HRESULT GetActivatorGuid(std::wstring& activatorGuid) noexcept;
+
+std::wstring RegisterComActivatorGuidAndAssets(winrt::Microsoft::Windows::ToastNotifications::ToastActivationInfo const& details);
diff --git a/dev/ToastNotifications/ToastNotifications.idl b/dev/ToastNotifications/ToastNotifications.idl
new file mode 100644
index 0000000000..463b025bde
--- /dev/null
+++ b/dev/ToastNotifications/ToastNotifications.idl
@@ -0,0 +1,211 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+namespace Microsoft.Windows.ToastNotifications
+{
+ [experimental]
+ // The Shell asset details for Unpackaged App Registrations
+ runtimeclass ToastAssets
+ {
+ // Initialize using Shell assets like DisplayName and iconPath
+ ToastAssets(String displayName, Windows.Foundation.Uri iconPath);
+
+ // The App friendly DisplayName for the toast in Action Centre
+ String DisplayName { get; };
+
+ // The full file path for the icon image
+ Windows.Foundation.Uri IconPath { get; };
+ };
+
+ [experimental]
+ // The Registration Info for Packaged and Unpackaged Toast Activations
+ runtimeclass ToastActivationInfo
+ {
+ // Initialize using a manifest defined COM Activator Id. Only applicable to Packaged Win32 applications
+ static ToastActivationInfo CreateFromActivationGuid(Guid taskClsid);
+
+ // Initialize using Toast Assets. Only applicable to Unpackaged Win32 applications which need to specify their own assets like DisplayName and Icon.
+ static ToastActivationInfo CreateFromToastAssets(ToastAssets assets);
+
+ // The CLSID associated with the Client COM server that Windows App SDK will activate
+ Guid TaskClsid{ get; };
+
+ // The Shell assets associated with the Unpackaged app
+ ToastAssets Assets{ get; };
+ };
+
+ [experimental]
+ // Event args for the Toast Activation
+ runtimeclass ToastActivatedEventArgs
+ {
+ // Arguments from the invoked button. Empty for Default Activation with no launch args specified in payload.
+ String ActivationArgs{ get; };
+
+ // The data from the input elements of a toast like a TextBox
+ Windows.Foundation.Collections.IMap UserInput{ get; };
+ };
+
+ [experimental]
+ // Toast Progress Data
+ runtimeclass ToastProgressData
+ {
+ // Initializes a new Instance of ToastProgressData
+ ToastProgressData();
+
+ // Gets or sets the sequence number of this notification data.
+ // When multiple ToastProgressData objects are received, the system displays the data with the greatest non-zero number.
+ UInt32 SequenceNumber;
+
+ // Gets/Sets the value for the title. Binds to {progressTitle} in progress xml tag.
+ String Title;
+
+ // Gets/Sets the Value for the numerical Progress percentile: a number between 0 and 1. Binds to {progressValue} in progress xml tag.
+ Double Value;
+
+ // Gets/Sets the Value for the Progress String. Binds to {progressValueString} in progress xml tag
+ String ValueStringOverride;
+
+ // Gets/Sets the Value for the Status. Binds to {progressStatus} in progress xml tag
+ String Status;
+ };
+
+ [experimental]
+ // The Toast User Setting or Toast Group Policy Setting
+ enum ToastNotificationSetting
+ {
+ Enabled, // Toast is not blocked by settings or group policy
+ DisabledForApplication, // Toast is blocked by a user defined App Setting
+ DisabledForUser, // Toast is blocked by a user defined Global Setting
+ DisabledByGroupPolicy, // Toast is blocked by Group Policy
+ DisabledByManifest, // Toast is blocked by a setting in the manifest. Only for packaged applications.
+ };
+
+ [experimental]
+ // Some basic predefined Toast Payload Templates
+ enum ToastTemplateType
+ {
+ BasicToast,
+ ToastWithTwoButtons,
+ ToastWithThreeButtons,
+ ToastWithProgressBar,
+ ToastWithAvatarAndProgressBar,
+ ToastWithAvatar,
+ ToastWithAvatarAndTextBox,
+ ToastWithAvatarAndDropdown,
+ ToastWithDropdown,
+ ToastWithReminder,
+ ToastWithAlarm,
+ ToastWithHeroImage,
+ ToastWithInlineImage,
+ };
+
+ [experimental]
+ // The Result for a Toast Progress related operation
+ enum ToastProgressResult
+ {
+ Succeeded, // The progress operation succeeded
+ Failed, // The progress operation failed
+ NotificationNotFound, // The progress operation failed to find a toast to process updates
+ };
+
+ [experimental]
+ enum ToastPriority
+ {
+ Default, // The notification should have default behavior in terms of delivery and display priority during connected standby mode.
+ High, // The notification should be treated as high priority. For desktop PCs, this means during connected standby mode the incoming notification can turn on the screen for Surface-like devices if it doesn't have a closed lid detected.
+ };
+
+ [experimental]
+ // Represent a toast Notification construct
+ runtimeclass ToastNotification
+ {
+ // Initialize a new Toast using an XML Payload.
+ ToastNotification(Windows.Data.Xml.Dom.XmlDocument payload);
+
+ // Unique identifier used to replace a notification within a group.
+ String Tag;
+
+ // Unique identifier for a toast group in the app
+ String Group;
+
+ // A unique identifier for the Toast generated by the platform.
+ UInt32 ToastId;
+
+ // The notification Xml Payload
+ Windows.Data.Xml.Dom.XmlDocument Payload{ get; };
+
+ // Gets or sets additional information about the toast progress.
+ ToastProgressData ProgressData;
+
+ // Gets or sets the time after which a toast notification should not be displayed.
+ Windows.Foundation.DateTime ExpirationTime;
+
+ // Indicates whether the toast will remain in the Action Center after a reboot.
+ Boolean ExpiresOnReboot;
+
+ // Gets or sets the priority for a Toast.
+ // Hints on how and at what urgency level a notification should be presented to the user (whether to wake up the screen, etc).
+ ToastPriority Priority;
+
+ // Gets or sets whether a toast's pop-up UI is displayed on the user's screen.
+ Boolean SuppressDisplay;
+ };
+
+ [experimental]
+ // Supports Toast related operations for all prior displayed Toasts in Action Centre
+ runtimeclass ToastNotificationHistory
+ {
+ // Removes a specific toast with a specific toastIdentifier from Action Centre
+ Windows.Foundation.IAsyncAction RemoveWithIdentiferAsync(UInt32 toastIdentifier);
+
+ // Removes a toast having a specific tag
+ Windows.Foundation.IAsyncAction RemoveWithTagAsync(String tag);
+
+ // Removes a toast having a specific tag and group
+ Windows.Foundation.IAsyncAction RemoveWithTagGroupAsync(String tag, String group);
+
+ // Remove all toasts for a specific group
+ Windows.Foundation.IAsyncAction RemoveGroupAsync(String group);
+
+ // Removes all the toasts for the App from Action Centre
+ Windows.Foundation.IAsyncAction RemoveAllAsync();
+
+ // Gets all the toasts for the App from Action Centre
+ Windows.Foundation.IAsyncOperation > GetAllAsync();
+ };
+
+ [experimental]
+ // The manager class which encompasses all Toast API Functionality
+ runtimeclass ToastNotificationManager
+ {
+ // Gets a Default instance of a ToastNotificationManager
+ static ToastNotificationManager Default{ get; };
+
+ // Register an activator using an ActivationInfo context and caches the token for unregister
+ void RegisterActivator(ToastActivationInfo details);
+
+ // Unregisters the activator and removes the cached Registration token.
+ void UnregisterActivator();
+
+ // Event handler for Toast Activations
+ event Windows.Foundation.EventHandler ToastActivated;
+
+ // Displays the Toast in Action Centre
+ void ShowToast(ToastNotification toast);
+
+ // Updates the Toast for a Progress related operation using Tag and Group
+ Windows.Foundation.IAsyncOperation UpdateToastProgressDataAsync(ToastProgressData data, String tag, String group);
+
+ // Updates the Toast for a Progress related operation using Tag
+ Windows.Foundation.IAsyncOperation UpdateToastProgressDataAsync(ToastProgressData data, String tag);
+
+ // Get the Toast Setting status for the app
+ ToastNotificationSetting Setting{ get; };
+
+ // Gets an instance of ToastHistory
+ ToastNotificationHistory History{ get; };
+
+ // Gets an Xml Payload based ona predefined Toast Template
+ Windows.Data.Xml.Dom.XmlDocument GetXmlTemplateContent(ToastTemplateType type);
+ };
+}
diff --git a/dev/ToastNotifications/ToastNotifications.vcxitems b/dev/ToastNotifications/ToastNotifications.vcxitems
new file mode 100644
index 0000000000..6e3db62100
--- /dev/null
+++ b/dev/ToastNotifications/ToastNotifications.vcxitems
@@ -0,0 +1,40 @@
+
+
+
+ $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
+ true
+ {53a85993-86aa-4818-ae5c-d5fb6fa71c89}
+
+
+
+ %(AdditionalIncludeDirectories);$(MSBuildThisFileDirectory)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/dev/ToastNotifications/ToastProgressData.cpp b/dev/ToastNotifications/ToastProgressData.cpp
new file mode 100644
index 0000000000..e97a8f53ed
--- /dev/null
+++ b/dev/ToastNotifications/ToastProgressData.cpp
@@ -0,0 +1,47 @@
+#include "pch.h"
+#include "ToastProgressData.h"
+#include "Microsoft.Windows.ToastNotifications.ToastProgressData.g.cpp"
+
+namespace winrt::Microsoft::Windows::ToastNotifications::implementation
+{
+ uint32_t ToastProgressData::SequenceNumber()
+ {
+ throw hresult_not_implemented();
+ }
+ void ToastProgressData::SequenceNumber(uint32_t /* value */)
+ {
+ throw hresult_not_implemented();
+ }
+ hstring ToastProgressData::Title()
+ {
+ throw hresult_not_implemented();
+ }
+ void ToastProgressData::Title(hstring const& /* value */)
+ {
+ throw hresult_not_implemented();
+ }
+ double ToastProgressData::Value()
+ {
+ throw hresult_not_implemented();
+ }
+ void ToastProgressData::Value(double /* value */)
+ {
+ throw hresult_not_implemented();
+ }
+ hstring ToastProgressData::ValueStringOverride()
+ {
+ throw hresult_not_implemented();
+ }
+ void ToastProgressData::ValueStringOverride(hstring const& /* value */)
+ {
+ throw hresult_not_implemented();
+ }
+ hstring ToastProgressData::Status()
+ {
+ throw hresult_not_implemented();
+ }
+ void ToastProgressData::Status(hstring const& /* value */)
+ {
+ throw hresult_not_implemented();
+ }
+}
diff --git a/dev/ToastNotifications/ToastProgressData.h b/dev/ToastNotifications/ToastProgressData.h
new file mode 100644
index 0000000000..c02a8da163
--- /dev/null
+++ b/dev/ToastNotifications/ToastProgressData.h
@@ -0,0 +1,27 @@
+#pragma once
+#include "Microsoft.Windows.ToastNotifications.ToastProgressData.g.h"
+
+namespace winrt::Microsoft::Windows::ToastNotifications::implementation
+{
+ struct ToastProgressData : ToastProgressDataT
+ {
+ ToastProgressData() = default;
+
+ uint32_t SequenceNumber();
+ void SequenceNumber(uint32_t value);
+ hstring Title();
+ void Title(hstring const& value);
+ double Value();
+ void Value(double value);
+ hstring ValueStringOverride();
+ void ValueStringOverride(hstring const& value);
+ hstring Status();
+ void Status(hstring const& value);
+ };
+}
+namespace winrt::Microsoft::Windows::ToastNotifications::factory_implementation
+{
+ struct ToastProgressData : ToastProgressDataT
+ {
+ };
+}
diff --git a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapAutoInitializer.cpp b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapAutoInitializer.cpp
index b9719aae31..305f31b2e1 100644
--- a/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapAutoInitializer.cpp
+++ b/dev/WindowsAppRuntime_BootstrapDLL/MddBootstrapAutoInitializer.cpp
@@ -3,6 +3,7 @@
#include
#include
+#include
#include
#include
diff --git a/dev/WindowsAppRuntime_DLL/WindowsAppRuntime_DLL.vcxproj b/dev/WindowsAppRuntime_DLL/WindowsAppRuntime_DLL.vcxproj
index e500db1986..f8f5dd1211 100644
--- a/dev/WindowsAppRuntime_DLL/WindowsAppRuntime_DLL.vcxproj
+++ b/dev/WindowsAppRuntime_DLL/WindowsAppRuntime_DLL.vcxproj
@@ -110,6 +110,7 @@
+
diff --git a/eng/Version.Details.xml b/eng/Version.Details.xml
index 871f21e079..95ef71e2a7 100644
--- a/eng/Version.Details.xml
+++ b/eng/Version.Details.xml
@@ -3,25 +3,29 @@
https://github.com/microsoft/CsWinRT
-
+
+
https://github.com/microsoft/CsWinRT
-
+
+
https://github.com/microsoft/CsWinRT
-
+
+
https://github.com/microsoft/CsWinRT
-
+
+
-
+
https://dev.azure.com/microsoft/ProjectReunion/_git/ProjectReunionInternal
- c29bc59c779108f3818a0efb0e467c2b4bb6cb47
+ bc05e6cd828aed47148cb75597685d8cd59ae39d
diff --git a/eng/Versions.props b/eng/Versions.props
index df8e55f120..f766242b10 100644
--- a/eng/Versions.props
+++ b/eng/Versions.props
@@ -8,4 +8,4 @@
$(CsWinRTDependencyDotNetCoreSdkPackageVersion)
-
\ No newline at end of file
+
diff --git a/eng/common/AzurePipelinesTemplates/WindowsAppSDK-Build-Steps.yml b/eng/common/AzurePipelinesTemplates/WindowsAppSDK-Build-Steps.yml
index c456bb28b4..4e2c9e0e41 100644
--- a/eng/common/AzurePipelinesTemplates/WindowsAppSDK-Build-Steps.yml
+++ b/eng/common/AzurePipelinesTemplates/WindowsAppSDK-Build-Steps.yml
@@ -11,6 +11,8 @@
#
# The template eng\common\AzurePipelinesTemplates\WindowsAppSDK-BuildSetup-Steps.yml
# will facilitate setting up the requirements to sucessfully run this template.
+# In most cases, WindowsAppSDK-BuildSetup-Steps.yml should be called first,
+# then WindowsAppSDK-Build-Steps.yml.
#
# The intended use of this yml template is for the feeder repos' pipeline to build the WinAppSDK package
# with the latest versions from ProjectReunionInternal with the latest version of the transport package it
@@ -18,6 +20,9 @@
#
# The WindowsAppSDK Nuget package produced will be published to WindowsAppSDKNugetPackage build artifacts
parameters:
+ - name: TransportPackageArtifactName
+ type: string
+ default: ''
- name: BuildType
displayName: "Build Type"
type: string
@@ -34,6 +39,14 @@ parameters:
version: 1.0.0-stable
steps:
+ - ${{ if ne(parameters.TransportPackageArtifactName, '') }}:
+ - task: DownloadBuildArtifacts@0
+ inputs:
+ artifactName: ${{ parameters.TransportPackageArtifactName }}
+ downloadPath: '$(Build.SourcesDirectory)\build\packages'
+ itemPattern: |
+ **/*.nupkg
+
# Replace the versions in version.details.xml in the ProjectReunionInternal repo
# Please note, the UpdateVersionDetailsConfig.ps1 that is used is one from the ProjectReunionInternal repo
- ${{ each package in parameters.TransportPackages }}:
@@ -47,7 +60,13 @@ steps:
displayName: BuildAll
inputs:
filePath: 'BuildAll.ps1'
- arguments: -WindowsAppSDKPackageVersion "" -BuildType ${{ parameters.BuildType }} -Checkpoint "none" -Platform "x86,x64,arm64" -Configuration "release,debug"
+ arguments: >
+ -WindowsAppSDKPackageVersion ""
+ -BuildType ${{ parameters.BuildType }}
+ -Checkpoint "none"
+ -Platform "x86,x64,arm64"
+ -Configuration "release,debug"
+ -YamlStep "none"
- task: PublishBuildArtifacts@1
displayName: 'Publish Windows App SDK Packages'
diff --git a/eng/common/AzurePipelinesTemplates/WindowsAppSDK-BuildAndIntegrationTest-Steps.yml b/eng/common/AzurePipelinesTemplates/WindowsAppSDK-BuildAndIntegrationTest-Steps.yml
new file mode 100644
index 0000000000..6a70f87461
--- /dev/null
+++ b/eng/common/AzurePipelinesTemplates/WindowsAppSDK-BuildAndIntegrationTest-Steps.yml
@@ -0,0 +1,45 @@
+# This yml template combines WindowsAppSDK-BuildSetup, WindowsAppSDK-Build,
+# and WindowsAppSDK-IntegrationTest templatesfor running the testAll script in ProjectReunionInternal
+parameters:
+ - name: TransportPackageArtifactName
+ type: string
+ default: ''
+ - name: AzureSubscriptionServiceConnection
+ type: string
+ default: 'ProjectReunion Resource Manager'
+ - name: NuGetServiceConnectionName
+ type: string
+ default: 'ProjectReunionInternal'
+ - name: BuildType
+ displayName: "Build Type"
+ type: string
+ default: 'stable'
+ values:
+ - 'stable'
+ - 'experimental'
+ - name: "TransportPackages"
+ displayName: "TransportPackages to replace (name:version)"
+ type: object
+ default:
+ Foundation:
+ name: Microsoft.WindowsAppSDK.Foundation.TransportPackage
+ version: 1.0.0-stable
+ - name: TestSelection
+ type: string
+ default: "*"
+
+steps:
+ - template: WindowsAppSDK-BuildSetup-Steps.yml
+ parameters:
+ AzureSubscriptionServiceConnection: ${{ parameters.AzureSubscriptionServiceConnection }}
+ NuGetServiceConnectionName: ${{ parameters.NuGetServiceConnectionName }}
+
+ - template: WindowsAppSDK-Build-Steps.yml
+ parameters:
+ TransportPackageArtifactName: ${{ parameters.TransportPackageArtifactName }}
+ BuildType: ${{ parameters.BuildType }}
+ TransportPackages: ${{ parameters.TransportPackages }}
+
+ - template: WindowsAppSDK-IntegrationTest-Steps.yml
+ parameters:
+ TestSelection: ${{ parameters.TestSelection }}
diff --git a/eng/common/AzurePipelinesTemplates/WindowsAppSDK-BuildSetup-Steps.yml b/eng/common/AzurePipelinesTemplates/WindowsAppSDK-BuildSetup-Steps.yml
index afbcfe18b5..05947ebde6 100644
--- a/eng/common/AzurePipelinesTemplates/WindowsAppSDK-BuildSetup-Steps.yml
+++ b/eng/common/AzurePipelinesTemplates/WindowsAppSDK-BuildSetup-Steps.yml
@@ -13,25 +13,16 @@
# NuGetServiceConnectionName
# Service connection name to ProjectReunion Internal feed
# This is used to download other transport packages
-#
-# RefBranch
-# The branch of the ProjectReunionInternal repository
parameters:
- - name: ArtifactName
- type: string
- default: ''
- name: AzureSubscriptionServiceConnection
type: string
default: 'ProjectReunion Resource Manager'
- name: NuGetServiceConnectionName
type: string
default: 'ProjectReunionInternal'
- - name: RefBranch
- type: string
- default: 'main'
steps:
- - checkout: git://ProjectReunion/ProjectReunionInternal@${{ parameters.RefBranch }}
+ - checkout: git://ProjectReunion/ProjectReunionInternal
- task: AzureKeyVault@1
inputs:
@@ -40,13 +31,6 @@ steps:
SecretsFilter: 'TestMSCert'
RunAsPreJob: false
- - task: DownloadBuildArtifacts@0
- inputs:
- artifactName: ${{ parameters.ArtifactName }}
- downloadPath: '$(Build.SourcesDirectory)\build\packages'
- itemPattern: |
- **/*.nupkg
-
# Setup for MyCert.pfx
- task: PowerShell@2
name: CreateCert
diff --git a/eng/common/AzurePipelinesTemplates/WindowsAppSDK-IntegrationTest-Steps.yml b/eng/common/AzurePipelinesTemplates/WindowsAppSDK-IntegrationTest-Steps.yml
new file mode 100644
index 0000000000..328c9b4b03
--- /dev/null
+++ b/eng/common/AzurePipelinesTemplates/WindowsAppSDK-IntegrationTest-Steps.yml
@@ -0,0 +1,88 @@
+# This yml template is for running the testAll script in ProjectReunionInternal
+# It downloads the WindowsAppSDK NuGetPackage from WindowsAppSDKNugetPackage (by default)
+#
+# Requirements:
+# - This yml template can only be called from a pipeline in the "microsoft" AzureDevOps
+# - Only the ProjectReunionInternal repository is checkout in the job
+#
+# The template eng\common\AzurePipelinesTemplates\WindowsAppSDK-BuildSetup-Steps.yml
+# will facilitate setting up the requirements to sucessfully run this template.
+# eng\common\AzurePipelinesTemplates\WindowsAppSDK-Build-Steps.yml will build the
+# WindowsAppSDK Nuget Package for this template to use.
+#
+# In most cases, WindowsAppSDK-BuildSetup-Steps.yml should be called first,
+# then WindowsAppSDK-Build-Steps.yml, and finally WindowsAppSDK-IntegrationTest-Steps.yml
+#
+# Parameters:
+# WinAppSDkPackageArtifactName
+# Name of the Artifact where the WindowsAppSDK NuGetPackage for the build lives
+
+parameters:
+ - name: WinAppSDkPackageArtifactName
+ type: string
+ default: "WindowsAppSDKNugetPackage"
+ - name: TestSelection
+ type: string
+ default: "*"
+
+steps:
+ - task: DownloadBuildArtifacts@0
+ inputs:
+ artifactName: ${{ parameters.WinAppSDkPackageArtifactName }}
+ downloadPath: '$(Build.SourcesDirectory)\temp'
+ itemPattern: |
+ **/Microsoft.WindowsAppSDK.*.nupkg
+
+ - task: PowerShell@2
+ displayName: Extract WindowsAppSDKVersion
+ inputs:
+ targetType: 'inline'
+ script: |
+ Copy-Item -Path "$(Build.SourcesDirectory)\temp" -Destination "$(Build.SourcesDirectory)\PackLocation" -Recurse
+
+ $files = Get-ChildItem $(Build.SourcesDirectory)\temp
+ foreach ($file in $files) # Iterate through each package we restored in the directory
+ {
+ Write-Host "file:" $file.FullName
+ $nupkgPaths = Get-ChildItem $file.FullName -Filter "*.nupkg"
+
+ # Extract nupkg to access the nuspec
+ # The files in this directory does not contain the nuspec by default
+ foreach ($nupkgPath in $nupkgPaths)
+ {
+ Write-Host "nupkgPath:" $nupkgPath.FullName
+ $rename = $nupkgPath.Name + ".zip"
+ Rename-Item $nupkgPath.FullName $rename
+ $renamedFilePath = $nupkgPath.FullName + ".zip"
+ $dest = $file.FullName + "/contents"
+ Expand-Archive $renamedFilePath -Destination $dest
+ }
+
+ $nuspecPaths = Get-ChildItem $file.FullName -Recurse -Filter "*.nuspec"
+ foreach ($nuspecPath in $nuspecPaths)
+ {
+ Write-Host "Found Nuspecs"
+ [xml]$nuspec = Get-Content -Path $nuspecPath.FullName
+ if ($nuspec.package.metadata.id -eq 'Microsoft.WindowsAppSDK')
+ {
+ $version = $nuspec.package.metadata.version
+ Write-Host "Found " $version
+ Write-Host "##vso[task.setvariable variable=WindowsAppSDKPackageVersion;]$version"
+ Exit 0
+ }
+ }
+ }
+ Exit 1
+
+ - task: PowerShell@2
+ name: TestAll
+ displayName: TestAll
+ inputs:
+ filePath: 'TestAll.ps1'
+ arguments: >
+ -WindowsAppSDKPackageVersion "$(WindowsAppSDKPackageVersion)"
+ -Checkpoint "none" -Platform "x64"
+ -Configuration "release"
+ -YamlStep "none"
+ -RunTestMachineSetup
+ -Name "${{ parameters.TestSelection }}"
diff --git a/global.json b/global.json
index c7d7c2c082..a5b3bee768 100644
--- a/global.json
+++ b/global.json
@@ -1,8 +1,8 @@
{
"tools": {
- "dotnet": "6.0.100"
+ "dotnet": "6.0.101"
},
"msbuild-sdks": {
- "Microsoft.WinAppSDK.EngCommon": "1.0.0-20211213.0-CI"
+ "Microsoft.WinAppSDK.EngCommon": "1.0.0-20220110.0-CI"
}
}
diff --git a/test/Deployment/data/WindowsAppRuntime.Test.Framework/appxmanifest.xml b/test/Deployment/data/WindowsAppRuntime.Test.Framework/appxmanifest.xml
index e2ae934691..72cfee27b9 100644
--- a/test/Deployment/data/WindowsAppRuntime.Test.Framework/appxmanifest.xml
+++ b/test/Deployment/data/WindowsAppRuntime.Test.Framework/appxmanifest.xml
@@ -71,6 +71,14 @@
+
+
+ Microsoft.WindowsAppRuntime.dll
+
+
+
+
+
Microsoft.WindowsAppRuntime.dll
diff --git a/test/DynamicDependency/data/Microsoft.WindowsAppRuntime.Framework/appxmanifest.xml b/test/DynamicDependency/data/Microsoft.WindowsAppRuntime.Framework/appxmanifest.xml
index a765555b58..384cc4a402 100644
--- a/test/DynamicDependency/data/Microsoft.WindowsAppRuntime.Framework/appxmanifest.xml
+++ b/test/DynamicDependency/data/Microsoft.WindowsAppRuntime.Framework/appxmanifest.xml
@@ -71,6 +71,14 @@
+
+
+ Microsoft.WindowsAppRuntime.dll
+
+
+
+
+
Microsoft.WindowsAppRuntime.dll
diff --git a/test/TestApps/PushNotificationsDemoApp/PushNotificationsDemoApp.vcxproj b/test/TestApps/PushNotificationsDemoApp/PushNotificationsDemoApp.vcxproj
index 5b627f6a43..bbb1ce14c9 100644
--- a/test/TestApps/PushNotificationsDemoApp/PushNotificationsDemoApp.vcxproj
+++ b/test/TestApps/PushNotificationsDemoApp/PushNotificationsDemoApp.vcxproj
@@ -250,6 +250,11 @@
true
$(OutDir)\..\WindowsAppRuntime_DLL\Microsoft.WindowsAppRuntime.dll
+
+ $(OutDir)\..\WindowsAppRuntime_DLL\Microsoft.Windows.ToastNotifications.winmd
+ true
+ $(OutDir)\..\WindowsAppRuntime_DLL\Microsoft.WindowsAppRuntime.dll
+
diff --git a/test/TestApps/PushNotificationsDemoApp/main.cpp b/test/TestApps/PushNotificationsDemoApp/main.cpp
index 8d82381432..a3fa9523ba 100644
--- a/test/TestApps/PushNotificationsDemoApp/main.cpp
+++ b/test/TestApps/PushNotificationsDemoApp/main.cpp
@@ -9,6 +9,7 @@
using namespace winrt::Microsoft::Windows::AppLifecycle;
using namespace winrt::Microsoft::Windows::PushNotifications;
+using namespace winrt::Microsoft::Windows::ToastNotifications;
using namespace winrt::Windows::ApplicationModel::Activation;
using namespace winrt::Windows::ApplicationModel::Background; // BackgroundTask APIs
using namespace winrt::Windows::Foundation;
@@ -99,6 +100,10 @@ int main()
RETURN_IF_FAILED(MddBootstrapInitialize(c_Version_MajorMinor, nullptr, minVersion));
}
+ ToastAssets assets(L"ToastNotificationApp", winrt::Windows::Foundation::Uri{ LR"(C:\Windows\System32\WindowsSecurityIcon.png)" });
+ auto activationInfo = ToastActivationInfo::CreateFromToastAssets(assets);
+ ToastNotificationManager::Default().RegisterActivator(activationInfo);
+
if (PushNotificationManager::IsActivatorSupported(PushNotificationRegistrationActivators::ComActivator))
{
PushNotificationActivationInfo info(
@@ -153,6 +158,7 @@ int main()
PushNotificationManager::UnregisterActivator(PushNotificationRegistrationActivators::ComActivator);
}
+ ToastNotificationManager::Default().UnregisterActivator();
if (!Test::AppModel::IsPackagedProcess())
{
MddBootstrapShutdown();
diff --git a/test/TestApps/PushNotificationsDemoApp/pch.h b/test/TestApps/PushNotificationsDemoApp/pch.h
index f5e2c8d252..4dde0809ff 100644
--- a/test/TestApps/PushNotificationsDemoApp/pch.h
+++ b/test/TestApps/PushNotificationsDemoApp/pch.h
@@ -17,3 +17,4 @@
#include
#include
#include
+#include
diff --git a/test/TestApps/ToastNotificationsTestApp/ToastNotificationsTestApp.vcxproj b/test/TestApps/ToastNotificationsTestApp/ToastNotificationsTestApp.vcxproj
new file mode 100644
index 0000000000..42ab12c8ba
--- /dev/null
+++ b/test/TestApps/ToastNotificationsTestApp/ToastNotificationsTestApp.vcxproj
@@ -0,0 +1,283 @@
+
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
+
+
+
+
+ Create
+
+
+
+
+
+
+
+
+
+
+ $(OutDir)\..\WindowsAppRuntime_DLL\Microsoft.Windows.AppLifecycle.winmd
+ true
+ $(OutDir)\..\WindowsAppRuntime_DLL\Microsoft.WindowsAppRuntime.dll
+
+
+ $(OutDir)\..\WindowsAppRuntime_DLL\Microsoft.Windows.ToastNotifications.winmd
+ true
+ $(OutDir)\..\WindowsAppRuntime_DLL\Microsoft.WindowsAppRuntime.dll
+
+
+
+
+ {f76b776e-86f5-48c5-8fc7-d2795ecc9746}
+
+
+
+ 16.0
+ Win32Proj
+ {4b30c685-8490-440f-9879-a75d45daa361}
+ ToastNotificationsTestApp
+ 10.0
+
+
+
+ Application
+ true
+ v142
+ Unicode
+
+
+ Application
+ false
+ v142
+ true
+ Unicode
+
+
+ Application
+ true
+ v142
+ Unicode
+
+
+ Application
+ false
+ v142
+ true
+ Unicode
+
+
+ Application
+ true
+ v142
+ Unicode
+ false
+
+
+ Application
+ false
+ v142
+ true
+ Unicode
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+ false
+
+
+ true
+
+
+ false
+
+
+ true
+
+
+ false
+
+
+
+ Use
+ Level3
+ true
+ %(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;..\..\inc
+ WIN32;_DEBUG;%(PreprocessorDefinitions)
+ pch.h
+ stdcpp17
+
+
+ Console
+ %(AdditionalLibraryDirectories);$(OutDir)\..\WindowsAppRuntime_DLL
+ onecore.lib;onecoreuap.lib;Microsoft.WindowsAppRuntime.lib;%(AdditionalDependencies)
+ Microsoft.WindowsAppRuntime.Bootstrap.dll;%(DelayLoadDLLs)
+
+
+
+
+ Use
+ Level3
+ true
+ true
+ true
+ %(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;..\..\inc
+ WIN32;NDEBUG;%(PreprocessorDefinitions)
+ pch.h
+ stdcpp17
+
+
+ Console
+ true
+ true
+ %(AdditionalLibraryDirectories);$(OutDir)\..\WindowsAppRuntime_DLL
+ onecore.lib;onecoreuap.lib;Microsoft.WindowsAppRuntime.lib;%(AdditionalDependencies)
+ Microsoft.WindowsAppRuntime.Bootstrap.dll;%(DelayLoadDLLs)
+
+
+
+
+ Use
+ Level3
+ true
+ %(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;..\..\inc
+ _DEBUG;%(PreprocessorDefinitions)
+ pch.h
+ stdcpp17
+
+
+ Console
+ %(AdditionalLibraryDirectories);$(OutDir)\..\WindowsAppRuntime_DLL
+ onecore.lib;onecoreuap.lib;Microsoft.WindowsAppRuntime.lib;%(AdditionalDependencies)
+ Microsoft.WindowsAppRuntime.Bootstrap.dll
+
+
+
+
+ Use
+ Level3
+ true
+ true
+ true
+ %(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;..\..\inc
+ NDEBUG;%(PreprocessorDefinitions)
+ pch.h
+ stdcpp17
+
+
+ Console
+ true
+ true
+ %(AdditionalLibraryDirectories);$(OutDir)\..\WindowsAppRuntime_DLL
+ onecore.lib;onecoreuap.lib;Microsoft.WindowsAppRuntime.lib;%(AdditionalDependencies)
+ Microsoft.WindowsAppRuntime.Bootstrap.dll;%(DelayLoadDLLs)
+
+
+
+
+ Use
+ Level3
+ true
+ %(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;..\..\inc
+ _DEBUG;%(PreprocessorDefinitions)
+ pch.h
+ stdcpp17
+
+
+ Console
+ %(AdditionalLibraryDirectories);$(OutDir)\..\WindowsAppRuntime_DLL
+ onecore.lib;onecoreuap.lib;Microsoft.WindowsAppRuntime.lib;%(AdditionalDependencies)
+ Microsoft.WindowsAppRuntime.Bootstrap.dll;%(DelayLoadDLLs)
+
+
+
+
+ Use
+ Level3
+ true
+ true
+ true
+ %(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL;..\..\inc
+ NDEBUG;%(PreprocessorDefinitions)
+ pch.h
+ stdcpp17
+
+
+ Console
+ true
+ true
+ %(AdditionalLibraryDirectories);$(OutDir)\..\WindowsAppRuntime_DLL
+ onecore.lib;onecoreuap.lib;Microsoft.WindowsAppRuntime.lib;%(AdditionalDependencies)
+ Microsoft.WindowsAppRuntime.Bootstrap.dll;%(DelayLoadDLLs)
+
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
+
+
+
+
diff --git a/test/TestApps/ToastNotificationsTestApp/ToastNotificationsTestApp.vcxproj.filters b/test/TestApps/ToastNotificationsTestApp/ToastNotificationsTestApp.vcxproj.filters
new file mode 100644
index 0000000000..5f5111d685
--- /dev/null
+++ b/test/TestApps/ToastNotificationsTestApp/ToastNotificationsTestApp.vcxproj.filters
@@ -0,0 +1,30 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Source Files
+
+
+
+
+ Header Files
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/TestApps/ToastNotificationsTestApp/main.cpp b/test/TestApps/ToastNotificationsTestApp/main.cpp
new file mode 100644
index 0000000000..dcfabe0358
--- /dev/null
+++ b/test/TestApps/ToastNotificationsTestApp/main.cpp
@@ -0,0 +1,258 @@
+#include "pch.h"
+#include
+#include
+#include
+#include "WindowsAppRuntime.Test.AppModel.h"
+
+namespace winrt
+{
+ using namespace winrt::Microsoft::Windows::AppLifecycle;
+ using namespace winrt::Windows::ApplicationModel::Activation;
+ using namespace winrt::Windows::Foundation;
+ using namespace winrt::Microsoft::Windows::ToastNotifications;
+}
+
+bool VerifyFailedRegisterActivatorUsingNullClsid()
+{
+ try
+ {
+ auto activationInfo = winrt::ToastActivationInfo::CreateFromActivationGuid(winrt::guid(GUID_NULL));
+
+ winrt::ToastNotificationManager::Default().RegisterActivator(activationInfo);
+ }
+ catch (...)
+ {
+ return winrt::to_hresult() == E_INVALIDARG;
+ }
+
+ return false;
+}
+
+bool VerifyFailedRegisterActivatorUsingNullClsid_Unpackaged()
+{
+ try
+ {
+ auto activationInfo = winrt::ToastActivationInfo::CreateFromActivationGuid(winrt::guid(GUID_NULL));
+
+ winrt::ToastNotificationManager::Default().RegisterActivator(activationInfo);
+ }
+ catch (...)
+ {
+ return winrt::to_hresult() == E_ILLEGAL_METHOD_CALL;
+ }
+
+ return false;
+}
+
+bool VerifyFailedRegisterActivatorUsingNullAssets()
+{
+ try
+ {
+ auto activationInfo = winrt::ToastActivationInfo::CreateFromToastAssets(nullptr);
+
+ winrt::ToastNotificationManager::Default().RegisterActivator(activationInfo);
+ }
+ catch (...)
+ {
+ return winrt::to_hresult() == E_ILLEGAL_METHOD_CALL;
+ }
+
+ return false;
+}
+
+bool VerifyFailedRegisterActivatorUsingNullAssets_Unpackaged()
+{
+ try
+ {
+ auto activationInfo = winrt::ToastActivationInfo::CreateFromToastAssets(nullptr);
+
+ winrt::ToastNotificationManager::Default().RegisterActivator(activationInfo);
+ }
+ catch (...)
+ {
+ return winrt::to_hresult() == E_POINTER;
+ }
+
+ return false;
+}
+
+bool VerifyRegisterActivatorandUnRegisterActivatorUsingClsid()
+{
+ auto activationInfo = winrt::ToastActivationInfo::CreateFromActivationGuid(winrt::guid("1940DBA9-0F64-4F0D-8A4B-5D207B812E61"));
+
+ winrt::ToastNotificationManager::Default().RegisterActivator(activationInfo);
+
+ winrt::ToastNotificationManager::Default().UnregisterActivator();
+
+ return true;
+}
+
+bool VerifyRegisterActivatorandUnRegisterActivatorUsingAssets_Unpackaged()
+{
+ winrt::ToastAssets assets(L"ToastNotificationApp", winrt::Uri{ LR"(C:\Windows\System32\WindowsSecurityIcon.png)" });
+
+ auto activationInfo = winrt::ToastActivationInfo::CreateFromToastAssets(assets);
+
+ winrt::ToastNotificationManager::Default().RegisterActivator(activationInfo);
+
+ winrt::ToastNotificationManager::Default().UnregisterActivator();
+
+ return true;
+}
+
+bool VerifyFailedMultipleRegisterActivatorUsingSameClsid()
+{
+ try
+ {
+ auto activationInfo = winrt::ToastActivationInfo::CreateFromActivationGuid(winrt::guid("1940DBA9-0F64-4F0D-8A4B-5D207B812E61"));
+
+ winrt::ToastNotificationManager::Default().RegisterActivator(activationInfo);
+
+ winrt::ToastNotificationManager::Default().RegisterActivator(activationInfo);
+ }
+ catch (...)
+ {
+ return winrt::to_hresult() == E_INVALIDARG;
+ }
+
+ return false;
+}
+
+bool VerifyFailedMultipleRegisterActivatorUsingSameAssets_Unpackaged()
+{
+ try
+ {
+ winrt::ToastAssets assets(L"ToastNotificationApp", winrt::Uri{ LR"(C:\Windows\System32\WindowsSecurityIcon.png)" });
+
+ auto activationInfo = winrt::ToastActivationInfo::CreateFromToastAssets(assets);
+
+ winrt::ToastNotificationManager::Default().RegisterActivator(activationInfo);
+
+ winrt::ToastNotificationManager::Default().RegisterActivator(activationInfo);
+ }
+ catch (...)
+ {
+ return winrt::to_hresult() == E_INVALIDARG;
+ }
+
+ return false;
+}
+
+bool VerifyFailedToastAssetsWithEmptyDisplayName_Unpackaged()
+{
+ try
+ {
+ winrt::ToastAssets assets(L"", winrt::Uri{LR"(C:\Windows\System32\WindowsSecurityIcon.png)"});
+
+ auto activationInfo = winrt::ToastActivationInfo::CreateFromToastAssets(assets);
+ }
+ catch (...)
+ {
+ return winrt::to_hresult() == E_INVALIDARG;
+ }
+
+ return false;
+}
+
+bool VerifyFailedToastAssetsWithEmptyIconPath_Unpackaged()
+{
+ try
+ {
+ winrt::ToastAssets assets(L"ToastNotificationApp", winrt::Uri{ L""});
+
+ auto activationInfo = winrt::ToastActivationInfo::CreateFromToastAssets(assets);
+ }
+ catch (...)
+ {
+ return winrt::to_hresult() == E_POINTER;
+ }
+
+ return false;
+}
+
+bool VerifyFailedToastAssetsWithNullIconPath_Unpackaged()
+{
+ try
+ {
+ winrt::ToastAssets assets(L"ToastNotificationApp", nullptr);
+
+ auto activationInfo = winrt::ToastActivationInfo::CreateFromToastAssets(assets);
+ }
+ catch (...)
+ {
+ return winrt::to_hresult() == E_POINTER;
+ }
+
+ return false;
+}
+
+std::string unitTestNameFromLaunchArguments(const winrt::ILaunchActivatedEventArgs& launchArgs)
+{
+ std::string unitTestName = to_string(launchArgs.Arguments());
+ auto argStart = unitTestName.rfind(" ");
+ if (argStart != std::wstring::npos)
+ {
+ unitTestName = unitTestName.substr(argStart + 1);
+ }
+
+ return unitTestName;
+}
+
+std::map const& GetSwitchMapping()
+{
+ static std::map switchMapping = {
+ { "VerifyFailedRegisterActivatorUsingNullClsid", &VerifyFailedRegisterActivatorUsingNullClsid },
+ { "VerifyFailedRegisterActivatorUsingNullClsid_Unpackaged", &VerifyFailedRegisterActivatorUsingNullClsid_Unpackaged},
+ { "VerifyFailedRegisterActivatorUsingNullAssets", &VerifyFailedRegisterActivatorUsingNullAssets },
+ { "VerifyRegisterActivatorandUnRegisterActivatorUsingClsid", &VerifyRegisterActivatorandUnRegisterActivatorUsingClsid },
+ { "VerifyRegisterActivatorandUnRegisterActivatorUsingAssets_Unpackaged", &VerifyRegisterActivatorandUnRegisterActivatorUsingAssets_Unpackaged },
+ { "VerifyFailedMultipleRegisterActivatorUsingSameClsid", &VerifyFailedMultipleRegisterActivatorUsingSameClsid },
+ { "VerifyFailedMultipleRegisterActivatorUsingSameAssets_Unpackaged", &VerifyFailedMultipleRegisterActivatorUsingSameAssets_Unpackaged },
+ { "VerifyFailedToastAssetsWithEmptyDisplayName_Unpackaged", &VerifyFailedToastAssetsWithEmptyDisplayName_Unpackaged },
+ { "VerifyFailedToastAssetsWithEmptyIconPath_Unpackaged", &VerifyFailedToastAssetsWithEmptyIconPath_Unpackaged },
+ { "VerifyFailedToastAssetsWithNullIconPath_Unpackaged", &VerifyFailedToastAssetsWithNullIconPath_Unpackaged },
+ };
+ return switchMapping;
+}
+
+bool runUnitTest(std::string unitTest)
+{
+ auto const& switchMapping = GetSwitchMapping();
+ auto it = switchMapping.find(unitTest);
+ if (it == switchMapping.end())
+ {
+ return false;
+ }
+
+ return it->second();
+}
+
+
+int main() try
+{
+ bool testResult = false;
+ auto scope_exit = wil::scope_exit([&] {
+ ::Test::Bootstrap::CleanupBootstrap();
+ });
+
+ ::Test::Bootstrap::SetupBootstrap();
+
+ auto args = winrt::AppInstance::GetCurrent().GetActivatedEventArgs();
+ auto kind = args.Kind();
+
+ if (kind == winrt::ExtendedActivationKind::Launch)
+ {
+ auto unitTest = unitTestNameFromLaunchArguments(args.Data().as());
+ std::cout << unitTest << std::endl;
+
+ testResult = runUnitTest(unitTest);
+ }
+
+ return testResult ? 0 : 1; // We want 0 to be success and 1 failure
+}
+catch (...)
+{
+ std::cout << winrt::to_string(winrt::to_message()) << std::endl;
+
+ return 1; // in the event of unhandled test crash
+}
diff --git a/test/TestApps/ToastNotificationsTestApp/packages.config b/test/TestApps/ToastNotificationsTestApp/packages.config
new file mode 100644
index 0000000000..3aaafdd08f
--- /dev/null
+++ b/test/TestApps/ToastNotificationsTestApp/packages.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/TestApps/ToastNotificationsTestApp/pch.cpp b/test/TestApps/ToastNotificationsTestApp/pch.cpp
new file mode 100644
index 0000000000..8c646996e9
--- /dev/null
+++ b/test/TestApps/ToastNotificationsTestApp/pch.cpp
@@ -0,0 +1,3 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+#include "pch.h"
diff --git a/test/TestApps/ToastNotificationsTestApp/pch.h b/test/TestApps/ToastNotificationsTestApp/pch.h
new file mode 100644
index 0000000000..90a39c2919
--- /dev/null
+++ b/test/TestApps/ToastNotificationsTestApp/pch.h
@@ -0,0 +1,19 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+#pragma once
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
diff --git a/test/TestApps/ToastNotificationsTestAppPackage/Images/LockScreenLogo.scale-200.png b/test/TestApps/ToastNotificationsTestAppPackage/Images/LockScreenLogo.scale-200.png
new file mode 100644
index 0000000000..735f57adb5
Binary files /dev/null and b/test/TestApps/ToastNotificationsTestAppPackage/Images/LockScreenLogo.scale-200.png differ
diff --git a/test/TestApps/ToastNotificationsTestAppPackage/Images/SplashScreen.scale-200.png b/test/TestApps/ToastNotificationsTestAppPackage/Images/SplashScreen.scale-200.png
new file mode 100644
index 0000000000..023e7f1fed
Binary files /dev/null and b/test/TestApps/ToastNotificationsTestAppPackage/Images/SplashScreen.scale-200.png differ
diff --git a/test/TestApps/ToastNotificationsTestAppPackage/Images/Square150x150Logo.scale-200.png b/test/TestApps/ToastNotificationsTestAppPackage/Images/Square150x150Logo.scale-200.png
new file mode 100644
index 0000000000..af49fec1a5
Binary files /dev/null and b/test/TestApps/ToastNotificationsTestAppPackage/Images/Square150x150Logo.scale-200.png differ
diff --git a/test/TestApps/ToastNotificationsTestAppPackage/Images/Square44x44Logo.scale-200.png b/test/TestApps/ToastNotificationsTestAppPackage/Images/Square44x44Logo.scale-200.png
new file mode 100644
index 0000000000..ce342a2ec8
Binary files /dev/null and b/test/TestApps/ToastNotificationsTestAppPackage/Images/Square44x44Logo.scale-200.png differ
diff --git a/test/TestApps/ToastNotificationsTestAppPackage/Images/Square44x44Logo.targetsize-24_altform-unplated.png b/test/TestApps/ToastNotificationsTestAppPackage/Images/Square44x44Logo.targetsize-24_altform-unplated.png
new file mode 100644
index 0000000000..f6c02ce97e
Binary files /dev/null and b/test/TestApps/ToastNotificationsTestAppPackage/Images/Square44x44Logo.targetsize-24_altform-unplated.png differ
diff --git a/test/TestApps/ToastNotificationsTestAppPackage/Images/StoreLogo.png b/test/TestApps/ToastNotificationsTestAppPackage/Images/StoreLogo.png
new file mode 100644
index 0000000000..7385b56c0e
Binary files /dev/null and b/test/TestApps/ToastNotificationsTestAppPackage/Images/StoreLogo.png differ
diff --git a/test/TestApps/ToastNotificationsTestAppPackage/Images/Wide310x150Logo.scale-200.png b/test/TestApps/ToastNotificationsTestAppPackage/Images/Wide310x150Logo.scale-200.png
new file mode 100644
index 0000000000..288995b397
Binary files /dev/null and b/test/TestApps/ToastNotificationsTestAppPackage/Images/Wide310x150Logo.scale-200.png differ
diff --git a/test/TestApps/ToastNotificationsTestAppPackage/Package.appxmanifest b/test/TestApps/ToastNotificationsTestAppPackage/Package.appxmanifest
new file mode 100644
index 0000000000..82398d33c4
--- /dev/null
+++ b/test/TestApps/ToastNotificationsTestAppPackage/Package.appxmanifest
@@ -0,0 +1,65 @@
+
+
+
+
+
+
+
+ ToastNotificationsTestAppPackage
+ Microsoft Corporation
+ Images\StoreLogo.png
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Windows App Runtime TestProtocol
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/test/TestApps/ToastNotificationsTestAppPackage/ToastNotificationsTestAppPackage.wapproj b/test/TestApps/ToastNotificationsTestAppPackage/ToastNotificationsTestAppPackage.wapproj
new file mode 100644
index 0000000000..7ce834d72f
--- /dev/null
+++ b/test/TestApps/ToastNotificationsTestAppPackage/ToastNotificationsTestAppPackage.wapproj
@@ -0,0 +1,86 @@
+
+
+
+ 15.0
+
+
+
+ Debug
+ x86
+
+
+ Release
+ x86
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+ Debug
+ ARM
+
+
+ Release
+ ARM
+
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
+
+ Debug
+ AnyCPU
+
+
+ Release
+ AnyCPU
+
+
+
+ $(MSBuildExtensionsPath)\Microsoft\DesktopBridge\
+
+
+
+ d6a64926-4988-4c64-a5a8-2c14b1388696
+ 10.0.19041.0
+ 10.0.17763.0
+ en-US
+ true
+ ..\ToastNotificationsTestApp\ToastNotificationsTestApp.vcxproj
+ true
+ False
+ $(SolutionDir)temp\MSTest.pfx
+ SHA256
+ True
+ True
+ $(Platform)
+ 0
+
+
+
+ Designer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/ToastNotificationTests/APITests.cpp b/test/ToastNotificationTests/APITests.cpp
new file mode 100644
index 0000000000..f1e9a9ed52
--- /dev/null
+++ b/test/ToastNotificationTests/APITests.cpp
@@ -0,0 +1,216 @@
+#include "pch.h"
+#include
+
+using namespace WEX::Common;
+using namespace WEX::Logging;
+using namespace WEX::TestExecution;
+
+using namespace winrt::Windows::ApplicationModel::Activation;
+using namespace winrt::Windows::ApplicationModel::Background;
+using namespace winrt::Windows::Foundation;
+using namespace winrt::Windows::Foundation::Collections;
+using namespace winrt::Windows::Management::Deployment;
+using namespace winrt::Windows::Storage;
+using namespace winrt::Windows::System;
+
+namespace Test::ToastNotifications
+{
+ class APITests
+ {
+ private:
+ wil::unique_event m_failed;
+ wil::unique_process_handle m_processHandle;
+ winrt::com_ptr m_testAppLauncher;
+
+ public:
+ BEGIN_TEST_CLASS(APITests)
+ TEST_CLASS_PROPERTY(L"Description", L"Windows App SDK Toast Notifications test")
+ TEST_CLASS_PROPERTY(L"ThreadingModel", L"MTA")
+ TEST_CLASS_PROPERTY(L"RunAs:Class", L"RestrictedUser")
+ END_TEST_CLASS()
+
+ static const int testWaitTime()
+ {
+ return 3000;
+ }
+
+ static PCWSTR GetTestPackageFile()
+ {
+ return L"ToastNotificationsTestAppPackage";
+ }
+
+ static PCWSTR GetTestPackageFullName()
+ {
+ return L"ToastNotificationsTestAppPackage_1.0.0.0_" WINDOWSAPPRUNTIME_TEST_PACKAGE_DDLM_ARCHITECTURE L"__8wekyb3d8bbwe";
+ }
+
+ TEST_CLASS_SETUP(ClassInit)
+ {
+ try
+ {
+ // Cleanup previous installations. Need this to remove any manual installations outside of running this tests.
+ TP::RemovePackage(GetTestPackageFullName());
+ TP::RemovePackage_DynamicDependencyLifetimeManager();
+ TP::RemovePackage_DynamicDependencyDataStore();
+ TP::RemovePackage_WindowsAppRuntimeFramework();
+
+ TP::AddPackage_WindowsAppRuntimeFramework(); // Installs WARfwk
+ TP::AddPackage_DynamicDependencyDataStore(); // Installs WARmain
+ TP::AddPackage_DynamicDependencyLifetimeManager(); // Installs WARddlm
+ TP::WapProj::AddPackage(TAEF::GetDeploymentDir(), GetTestPackageFile(), L".msix"); // Installs ToastNotificationsTestApp.msix
+ }
+ catch (...)
+ {
+ return false;
+ }
+
+ m_testAppLauncher = winrt::create_instance(CLSID_ApplicationActivationManager, CLSCTX_ALL);
+
+ return true;
+ }
+
+ TEST_CLASS_CLEANUP(ClassUninit)
+ {
+ try
+ {
+ // Remove in reverse order to avoid conflicts between inter-dependent packages.
+ TP::RemovePackage(GetTestPackageFullName());
+ TP::RemovePackage_DynamicDependencyLifetimeManager();
+ TP::RemovePackage_DynamicDependencyDataStore();
+ TP::RemovePackage_WindowsAppRuntimeFramework();
+ }
+ catch (...)
+ {
+ return false;
+ }
+ return true;
+ }
+
+ TEST_METHOD_SETUP(MethodInit)
+ {
+ VERIFY_IS_TRUE(TP::IsPackageRegistered_WindowsAppRuntimeFramework());
+ VERIFY_IS_TRUE(TP::IsPackageRegistered_DynamicDependencyDataStore());
+ VERIFY_IS_TRUE(TP::IsPackageRegistered_DynamicDependencyLifetimeManager());
+ return true;
+ }
+
+ TEST_METHOD_CLEANUP(MethodUninit)
+ {
+ VERIFY_IS_TRUE(TP::IsPackageRegistered_WindowsAppRuntimeFramework());
+ VERIFY_IS_TRUE(TP::IsPackageRegistered_DynamicDependencyDataStore());
+ VERIFY_IS_TRUE(TP::IsPackageRegistered_DynamicDependencyLifetimeManager());
+
+ m_processHandle.reset();
+ return true;
+ }
+
+ void RunTest(const PCWSTR& testName, const int& waitTime)
+ {
+ DWORD processId{};
+ VERIFY_SUCCEEDED(m_testAppLauncher->ActivateApplication(L"ToastNotificationsTestAppPackage_8wekyb3d8bbwe!App", testName, AO_NONE, &processId));
+
+ m_processHandle.reset(OpenProcess(SYNCHRONIZE | PROCESS_QUERY_LIMITED_INFORMATION, FALSE, processId));
+ VERIFY_IS_TRUE(m_processHandle.is_valid());
+
+ VERIFY_IS_TRUE(wil::handle_wait(m_processHandle.get(), waitTime));
+
+ DWORD exitCode{};
+ VERIFY_WIN32_BOOL_SUCCEEDED(GetExitCodeProcess(m_processHandle.get(), &exitCode));
+ VERIFY_ARE_EQUAL(exitCode, 0);
+ }
+
+ wil::unique_handle RunUnpackaged(const std::wstring& command, const std::wstring& args, const std::wstring& directory)
+ {
+ SHELLEXECUTEINFO ei{};
+ ei.cbSize = sizeof(SHELLEXECUTEINFO);
+ ei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_DOENVSUBST;
+ ei.lpFile = command.c_str();
+ ei.lpParameters = args.c_str();
+ ei.lpDirectory = directory.c_str();
+ ei.nShow = SW_NORMAL;
+
+ if (!ShellExecuteEx(&ei))
+ {
+ auto lastError = GetLastError();
+ VERIFY_WIN32_SUCCEEDED(lastError);
+ }
+
+ wil::unique_handle process{ ei.hProcess };
+ return process;
+ }
+
+ const std::wstring GetDeploymentDir()
+ {
+ WEX::Common::String deploymentDir;
+ WEX::TestExecution::RuntimeParameters::TryGetValue(L"TestDeploymentDir", deploymentDir);
+ return reinterpret_cast(deploymentDir.GetBuffer());
+ }
+
+ void RunTestUnpackaged(const PCWSTR& testName, const int& waitTime)
+ {
+ auto processHandle = RunUnpackaged(L"ToastNotificationsTestApp.exe", testName, GetDeploymentDir());
+ VERIFY_IS_TRUE(processHandle.is_valid());
+
+ VERIFY_IS_TRUE(wil::handle_wait(processHandle.get(), testWaitTime()));
+
+ DWORD exitCode{};
+ VERIFY_WIN32_BOOL_SUCCEEDED(GetExitCodeProcess(processHandle.get(), &exitCode));
+ VERIFY_ARE_EQUAL(exitCode, 0);
+ }
+
+ TEST_METHOD(VerifyFailedRegisterActivatorUsingNullClsid)
+ {
+ RunTest(L"VerifyFailedRegisterActivatorUsingNullClsid", testWaitTime());
+ }
+
+ TEST_METHOD(VerifyFailedRegisterActivatorUsingNullClsid_Unpackaged)
+ {
+ RunTestUnpackaged(L"VerifyFailedRegisterActivatorUsingNullClsid_Unpackaged", testWaitTime());
+ }
+
+ TEST_METHOD(VerifyFailedRegisterActivatorUsingNullAssets)
+ {
+ RunTest(L"VerifyFailedRegisterActivatorUsingNullAssets", testWaitTime());
+ }
+
+ TEST_METHOD(VerifyFailedRegisterActivatorUsingNullAssets_Unpackaged)
+ {
+ RunTestUnpackaged(L"VerifyFailedRegisterActivatorUsingNullAssets_Unpackaged", testWaitTime());
+ }
+
+ TEST_METHOD(VerifyRegisterActivatorandUnRegisterActivatorUsingClsid)
+ {
+ RunTest(L"VerifyRegisterActivatorandUnRegisterActivatorUsingClsid", testWaitTime());
+ }
+
+ TEST_METHOD(VerifyFailedMultipleRegisterActivatorUsingSameClsid)
+ {
+ RunTest(L"VerifyFailedMultipleRegisterActivatorUsingSameClsid", testWaitTime());
+ }
+
+ TEST_METHOD(VerifyRegisterActivatorandUnRegisterActivatorUsingAssets_Unpackaged)
+ {
+ RunTestUnpackaged(L"VerifyRegisterActivatorandUnRegisterActivatorUsingAssets_Unpackaged", testWaitTime());
+ }
+
+ TEST_METHOD(VerifyFailedMultipleRegisterActivatorUsingSameAssets_Unpackaged)
+ {
+ RunTestUnpackaged(L"VerifyFailedMultipleRegisterActivatorUsingSameAssets_Unpackaged", testWaitTime());
+ }
+
+ TEST_METHOD(VerifyFailedToastAssetsWithEmptyDisplayName_Unpackaged)
+ {
+ RunTestUnpackaged(L"VerifyFailedToastAssetsWithEmptyDisplayName_Unpackaged", testWaitTime());
+ }
+
+ TEST_METHOD(VerifyFailedToastAssetsWithEmptyIconPath_Unpackaged)
+ {
+ RunTestUnpackaged(L"VerifyFailedToastAssetsWithEmptyIconPath_Unpackaged", testWaitTime());
+ }
+
+ TEST_METHOD(VerifyFailedToastAssetsWithNullIconPath_Unpackaged)
+ {
+ RunTestUnpackaged(L"VerifyFailedToastAssetsWithEmptyIconPath_Unpackaged", testWaitTime());
+ }
+ };
+}
diff --git a/test/ToastNotificationTests/ToastNotificationTests.vcxproj b/test/ToastNotificationTests/ToastNotificationTests.vcxproj
new file mode 100644
index 0000000000..e7a48afeea
--- /dev/null
+++ b/test/ToastNotificationTests/ToastNotificationTests.vcxproj
@@ -0,0 +1,296 @@
+
+
+
+
+
+ Debug
+ Win32
+
+
+ Release
+ Win32
+
+
+ Debug
+ x64
+
+
+ Release
+ x64
+
+
+ Debug
+ ARM64
+
+
+ Release
+ ARM64
+
+
+
+ 16.0
+ Win32Proj
+ {e977b1bd-00dc-4085-a105-e0a18e0183d7}
+ ToastNotificationTests
+ 10.0
+
+
+
+ DynamicLibrary
+ true
+ v142
+ Unicode
+
+
+ DynamicLibrary
+ false
+ v142
+ true
+ Unicode
+
+
+ DynamicLibrary
+ true
+ v142
+ Unicode
+
+
+ DynamicLibrary
+ false
+ v142
+ true
+ Unicode
+
+
+ DynamicLibrary
+ true
+ v142
+ Unicode
+ false
+
+
+ DynamicLibrary
+ false
+ v142
+ true
+ Unicode
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ true
+
+
+ false
+
+
+ true
+
+
+ false
+
+
+ true
+
+
+
+ Level3
+ true
+ %(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;..\inc;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL
+ WIN32;_DEBUG;TOASTNOTIFICATIONTESTS_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ true
+ Use
+ pch.h
+
+
+ Windows
+ true
+ $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories);$(OutDir)\..\WindowsAppRuntime_DLL
+ onecore.lib;onecoreuap.lib;Microsoft.WindowsAppRuntime.lib;wex.common.lib;wex.logger.lib;te.common.lib;%(AdditionalDependencies)
+ false
+
+
+
+
+ Level3
+ true
+ true
+ true
+ %(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;..\inc;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL
+ WIN32;NDEBUG;TOASTNOTIFICATIONTESTS_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ true
+ true
+ Use
+ pch.h
+
+
+ Windows
+ true
+ true
+ true
+ $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories);$(OutDir)\..\WindowsAppRuntime_DLL
+ onecore.lib;onecoreuap.lib;Microsoft.WindowsAppRuntime.lib;wex.common.lib;wex.logger.lib;te.common.lib;%(AdditionalDependencies)
+ false
+
+
+
+
+ Level3
+ true
+ %(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;..\inc;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL
+ _DEBUG;TOASTNOTIFICATIONTESTS_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ true
+ true
+ Use
+ pch.h
+
+
+ Windows
+ true
+ $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories);$(OutDir)\..\WindowsAppRuntime_DLL
+ onecore.lib;onecoreuap.lib;Microsoft.WindowsAppRuntime.lib;wex.common.lib;wex.logger.lib;te.common.lib;%(AdditionalDependencies)
+ false
+
+
+
+
+ Level3
+ true
+ true
+ true
+ %(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;..\inc;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL
+ NDEBUG;TOASTNOTIFICATIONTESTS_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)
+ true
+ Use
+ pch.h
+
+
+ Windows
+ true
+ true
+ true
+ $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories);$(OutDir)\..\WindowsAppRuntime_DLL
+ onecore.lib;onecoreuap.lib;Microsoft.WindowsAppRuntime.lib;wex.common.lib;wex.logger.lib;te.common.lib;%(AdditionalDependencies)
+ false
+
+
+
+
+ Use
+ Level3
+ true
+ %(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;..\inc;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL
+ _DEBUG;%(PreprocessorDefinitions);;INLINE_TEST_METHOD_MARKUP
+ true
+ pch.h
+
+
+ Windows
+ $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories);$(OutDir)\..\WindowsAppRuntime_DLL
+ onecore.lib;onecoreuap.lib;Microsoft.WindowsAppRuntime.lib;wex.common.lib;wex.logger.lib;te.common.lib;%(AdditionalDependencies)
+
+
+
+
+ Use
+ Level3
+ true
+ true
+ true
+ %(AdditionalIncludeDirectories);$(OutDir)\..\WindowsAppRuntime_DLL;..\inc;$(OutDir)\..\WindowsAppRuntime_BootstrapDLL
+ NDEBUG;%(PreprocessorDefinitions);;INLINE_TEST_METHOD_MARKUP
+ true
+ pch.h
+
+
+ Windows
+ true
+ true
+ $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories);$(OutDir)\..\WindowsAppRuntime_DLL
+ onecore.lib;onecoreuap.lib;Microsoft.WindowsAppRuntime.lib;wex.common.lib;wex.logger.lib;te.common.lib;%(AdditionalDependencies)
+
+
+
+
+
+
+
+
+ Create
+ Create
+ Create
+ Create
+ Create
+ Create
+ Create
+ Create
+
+
+
+
+
+
+ .Debug
+ _Debug
+ $(AppxPackageDir)\ToastNotificationsTestAppPackage_1.0.0.0_$(PlatformTarget)$(TestPkgDebugConfigName)_Test
+ $(TestPkgOutputPath)\ToastNotificationsTestAppPackage_1.0.0.0_$(PlatformTarget)$(TestPkgDebugConfigName).msix
+
+
+
+
+
+
+
+
+ $(OutDir)\..\WindowsAppRuntime_DLL\Microsoft.Windows.ToastNotifications.winmd
+ true
+
+
+
+
+ {f76b776e-86f5-48c5-8fc7-d2795ecc9746}
+
+
+
+
+
+
+
+
+
+
+ This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/ToastNotificationTests/ToastNotificationTests.vcxproj.filters b/test/ToastNotificationTests/ToastNotificationTests.vcxproj.filters
new file mode 100644
index 0000000000..be13053b6d
--- /dev/null
+++ b/test/ToastNotificationTests/ToastNotificationTests.vcxproj.filters
@@ -0,0 +1,33 @@
+
+
+
+
+ {4FC737F1-C7A5-4376-A066-2A32D752A2FF}
+ cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx
+
+
+ {93995380-89BD-4b04-88EB-625FBE52EBFB}
+ h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd
+
+
+ {67DA6AB6-F800-4c08-8B7A-83BB121AAD01}
+ rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms
+
+
+
+
+ Header Files
+
+
+
+
+ Source Files
+
+
+ Source Files
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/ToastNotificationTests/packages.config b/test/ToastNotificationTests/packages.config
new file mode 100644
index 0000000000..3aaafdd08f
--- /dev/null
+++ b/test/ToastNotificationTests/packages.config
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/test/ToastNotificationTests/pch.cpp b/test/ToastNotificationTests/pch.cpp
new file mode 100644
index 0000000000..64b7eef6d6
--- /dev/null
+++ b/test/ToastNotificationTests/pch.cpp
@@ -0,0 +1,5 @@
+// pch.cpp: source file corresponding to the pre-compiled header
+
+#include "pch.h"
+
+// When you are using pre-compiled headers, this source file is necessary for compilation to succeed.
diff --git a/test/ToastNotificationTests/pch.h b/test/ToastNotificationTests/pch.h
new file mode 100644
index 0000000000..fd8a9b5103
--- /dev/null
+++ b/test/ToastNotificationTests/pch.h
@@ -0,0 +1,43 @@
+// Copyright (c) Microsoft Corporation. All rights reserved.
+// Licensed under the MIT License. See LICENSE in the project root for license information.
+
+#ifndef PCH_H
+#define PCH_H
+
+#include
+
+#include
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+
+#include
+
+#include
+#include
+
+#include
+#include
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+
+namespace TP = ::Test::Packages;
+namespace TAEF = ::Test::TAEF;
+#endif //PCH_H