From b739a9e1008c208772a72e8a76970664898920ba Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 10 Dec 2025 18:32:47 +0000
Subject: [PATCH 01/14] Initial plan
From f76990a8443e884a9e156d413c9eebe399958fe5 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 10 Dec 2025 18:49:02 +0000
Subject: [PATCH 02/14] Add strongly-typed events with DurableEventAttribute
and generator support
Co-authored-by: YunchuWang <12449837+YunchuWang@users.noreply.github.com>
---
src/Abstractions/DurableEventAttribute.cs | 34 +++++
src/Generators/DurableTaskSourceGenerator.cs | 122 ++++++++++++++++--
.../Generators.Tests/ClassBasedSyntaxTests.cs | 95 ++++++++++++++
test/Generators.Tests/Utils/TestHelpers.cs | 1 +
4 files changed, 242 insertions(+), 10 deletions(-)
create mode 100644 src/Abstractions/DurableEventAttribute.cs
diff --git a/src/Abstractions/DurableEventAttribute.cs b/src/Abstractions/DurableEventAttribute.cs
new file mode 100644
index 00000000..f8cb18b2
--- /dev/null
+++ b/src/Abstractions/DurableEventAttribute.cs
@@ -0,0 +1,34 @@
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+
+namespace Microsoft.DurableTask;
+
+///
+/// Indicates that the attributed type represents a durable event.
+///
+///
+/// This attribute is meant to be used on type definitions to generate strongly-typed
+/// external event methods for orchestration contexts.
+/// It is used specifically by build-time source generators to generate type-safe methods for waiting
+/// for external events in orchestrations.
+///
+[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct, AllowMultiple = false, Inherited = false)]
+public sealed class DurableEventAttribute : Attribute
+{
+ ///
+ /// Initializes a new instance of the class.
+ ///
+ ///
+ /// The name of the durable event. If not specified, the type name is used as the implied name of the durable event.
+ ///
+ public DurableEventAttribute(string? name = null)
+ {
+ // This logic cannot become too complex as code-generator relies on examining the constructor arguments.
+ this.Name = string.IsNullOrEmpty(name) ? default : new TaskName(name!);
+ }
+
+ ///
+ /// Gets the name of the durable event.
+ ///
+ public TaskName Name { get; }
+}
diff --git a/src/Generators/DurableTaskSourceGenerator.cs b/src/Generators/DurableTaskSourceGenerator.cs
index 19a24cc9..9a6818c9 100644
--- a/src/Generators/DurableTaskSourceGenerator.cs
+++ b/src/Generators/DurableTaskSourceGenerator.cs
@@ -49,6 +49,13 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
transform: static (ctx, _) => GetDurableTaskTypeInfo(ctx))
.Where(static info => info != null)!;
+ // Create providers for DurableEvent attributes
+ IncrementalValuesProvider durableEventAttributes = context.SyntaxProvider
+ .CreateSyntaxProvider(
+ predicate: static (node, _) => node is AttributeSyntax,
+ transform: static (ctx, _) => GetDurableEventTypeInfo(ctx))
+ .Where(static info => info != null)!;
+
// Create providers for Durable Functions
IncrementalValuesProvider durableFunctions = context.SyntaxProvider
.CreateSyntaxProvider(
@@ -57,14 +64,15 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
.Where(static func => func != null)!;
// Collect all results and check if Durable Functions is referenced
- IncrementalValueProvider<(Compilation, ImmutableArray, ImmutableArray)> compilationAndTasks =
+ IncrementalValueProvider<(Compilation, ImmutableArray, ImmutableArray, ImmutableArray)> compilationAndTasks =
durableTaskAttributes.Collect()
+ .Combine(durableEventAttributes.Collect())
.Combine(durableFunctions.Collect())
.Combine(context.CompilationProvider)
- .Select((x, _) => (x.Right, x.Left.Left, x.Left.Right));
+ .Select((x, _) => (x.Right, x.Left.Left.Left, x.Left.Left.Right, x.Left.Right));
// Generate the source
- context.RegisterSourceOutput(compilationAndTasks, static (spc, source) => Execute(spc, source.Item1, source.Item2, source.Item3));
+ context.RegisterSourceOutput(compilationAndTasks, static (spc, source) => Execute(spc, source.Item1, source.Item2, source.Item3, source.Item4));
}
static DurableTaskTypeInfo? GetDurableTaskTypeInfo(GeneratorSyntaxContext context)
@@ -161,6 +169,46 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
return new DurableTaskTypeInfo(className, taskName, inputType, outputType, kind);
}
+ static DurableEventTypeInfo? GetDurableEventTypeInfo(GeneratorSyntaxContext context)
+ {
+ AttributeSyntax attribute = (AttributeSyntax)context.Node;
+
+ ITypeSymbol? attributeType = context.SemanticModel.GetTypeInfo(attribute.Name).Type;
+ if (attributeType?.ToString() != "Microsoft.DurableTask.DurableEventAttribute")
+ {
+ return null;
+ }
+
+ // DurableEventAttribute can be applied to both class and struct (record)
+ TypeDeclarationSyntax? typeDeclaration = attribute.Parent?.Parent as TypeDeclarationSyntax;
+ if (typeDeclaration == null)
+ {
+ return null;
+ }
+
+ // Verify that the attribute is being used on a non-abstract type
+ if (typeDeclaration.Modifiers.Any(SyntaxKind.AbstractKeyword))
+ {
+ return null;
+ }
+
+ if (context.SemanticModel.GetDeclaredSymbol(typeDeclaration) is not ITypeSymbol eventType)
+ {
+ return null;
+ }
+
+ string typeName = eventType.ToDisplayString();
+ string eventName = eventType.Name;
+
+ if (attribute.ArgumentList?.Arguments.Count > 0)
+ {
+ ExpressionSyntax expression = attribute.ArgumentList.Arguments[0].Expression;
+ eventName = context.SemanticModel.GetConstantValue(expression).ToString();
+ }
+
+ return new DurableEventTypeInfo(typeName, eventName, eventType);
+ }
+
static DurableFunction? GetDurableFunction(GeneratorSyntaxContext context)
{
MethodDeclarationSyntax method = (MethodDeclarationSyntax)context.Node;
@@ -177,9 +225,10 @@ static void Execute(
SourceProductionContext context,
Compilation compilation,
ImmutableArray allTasks,
+ ImmutableArray allEvents,
ImmutableArray allFunctions)
{
- if (allTasks.IsDefaultOrEmpty && allFunctions.IsDefaultOrEmpty)
+ if (allTasks.IsDefaultOrEmpty && allEvents.IsDefaultOrEmpty && allFunctions.IsDefaultOrEmpty)
{
return;
}
@@ -210,7 +259,7 @@ static void Execute(
}
}
- int found = activities.Count + orchestrators.Count + entities.Count + allFunctions.Length;
+ int found = activities.Count + orchestrators.Count + entities.Count + allEvents.Length + allFunctions.Length;
if (found == 0)
{
return;
@@ -221,6 +270,7 @@ static void Execute(
#nullable enable
using System;
+using System.Threading;
using System.Threading.Tasks;
using Microsoft.DurableTask.Internal;");
@@ -287,6 +337,12 @@ public static class GeneratedDurableTaskExtensions
AddActivityCallMethod(sourceBuilder, function);
}
+ // Generate WaitFor{EventName}Async methods for each event type
+ foreach (DurableEventTypeInfo eventInfo in allEvents)
+ {
+ AddEventWaitMethod(sourceBuilder, eventInfo);
+ }
+
if (isDurableFunctions)
{
if (activities.Count > 0)
@@ -299,11 +355,15 @@ public static class GeneratedDurableTaskExtensions
else
{
// ASP.NET Core-specific service registration methods
- AddRegistrationMethodForAllTasks(
- sourceBuilder,
- orchestrators,
- activities,
- entities);
+ // Only generate if there are actually tasks to register
+ if (orchestrators.Count > 0 || activities.Count > 0 || entities.Count > 0)
+ {
+ AddRegistrationMethodForAllTasks(
+ sourceBuilder,
+ orchestrators,
+ activities,
+ entities);
+ }
}
sourceBuilder.AppendLine(" }").AppendLine("}");
@@ -376,6 +436,19 @@ static void AddActivityCallMethod(StringBuilder sourceBuilder, DurableFunction a
}}");
}
+ static void AddEventWaitMethod(StringBuilder sourceBuilder, DurableEventTypeInfo eventInfo)
+ {
+ sourceBuilder.AppendLine($@"
+ ///
+ /// Waits for an external event of type .
+ ///
+ ///
+ public static Task<{eventInfo.TypeName}> WaitFor{eventInfo.EventName}Async(this TaskOrchestrationContext context, CancellationToken cancellationToken = default)
+ {{
+ return context.WaitForExternalEvent<{eventInfo.TypeName}>(""{eventInfo.EventName}"", cancellationToken);
+ }}");
+ }
+
static void AddActivityFunctionDeclaration(StringBuilder sourceBuilder, DurableTaskTypeInfo activity)
{
// GeneratedActivityContext is a generated class that we use for each generated activity trigger definition.
@@ -533,5 +606,34 @@ static string GetRenderedTypeExpression(ITypeSymbol? symbol)
return expression;
}
}
+
+ class DurableEventTypeInfo
+ {
+ public DurableEventTypeInfo(string typeName, string eventName, ITypeSymbol eventType)
+ {
+ this.TypeName = GetRenderedTypeExpression(eventType);
+ this.EventName = eventName;
+ }
+
+ public string TypeName { get; }
+ public string EventName { get; }
+
+ static string GetRenderedTypeExpression(ITypeSymbol? symbol)
+ {
+ if (symbol == null)
+ {
+ return "object";
+ }
+
+ string expression = symbol.ToString();
+ if (expression.StartsWith("System.", StringComparison.Ordinal)
+ && symbol.ContainingNamespace.Name == "System")
+ {
+ expression = expression.Substring("System.".Length);
+ }
+
+ return expression;
+ }
+ }
}
}
diff --git a/test/Generators.Tests/ClassBasedSyntaxTests.cs b/test/Generators.Tests/ClassBasedSyntaxTests.cs
index c3abc6c5..f19b235b 100644
--- a/test/Generators.Tests/ClassBasedSyntaxTests.cs
+++ b/test/Generators.Tests/ClassBasedSyntaxTests.cs
@@ -511,4 +511,99 @@ internal static DurableTaskRegistry AddAllGeneratedTasks(this DurableTaskRegistr
expectedOutput,
isDurableFunctions: false);
}
+
+ [Fact]
+ public Task Events_BasicRecord()
+ {
+ string code = @"
+#nullable enable
+using System.Threading.Tasks;
+using Microsoft.DurableTask;
+
+[DurableEvent(nameof(ApprovalEvent))]
+public sealed record ApprovalEvent(bool Approved, string? Approver);";
+
+ string expectedOutput = TestHelpers.WrapAndFormat(
+ GeneratedClassName,
+ methodList: @"
+///
+/// Waits for an external event of type .
+///
+///
+public static Task WaitForApprovalEventAsync(this TaskOrchestrationContext context, CancellationToken cancellationToken = default)
+{
+ return context.WaitForExternalEvent(""ApprovalEvent"", cancellationToken);
+}");
+
+ return TestHelpers.RunTestAsync(
+ GeneratedFileName,
+ code,
+ expectedOutput,
+ isDurableFunctions: false);
+ }
+
+ [Fact]
+ public Task Events_ClassWithExplicitName()
+ {
+ string code = @"
+using System.Threading.Tasks;
+using Microsoft.DurableTask;
+
+[DurableEvent(""CustomEventName"")]
+public class MyEventData
+{
+ public string Message { get; set; }
+}";
+
+ string expectedOutput = TestHelpers.WrapAndFormat(
+ GeneratedClassName,
+ methodList: @"
+///
+/// Waits for an external event of type .
+///
+///
+public static Task WaitForCustomEventNameAsync(this TaskOrchestrationContext context, CancellationToken cancellationToken = default)
+{
+ return context.WaitForExternalEvent(""CustomEventName"", cancellationToken);
+}");
+
+ return TestHelpers.RunTestAsync(
+ GeneratedFileName,
+ code,
+ expectedOutput,
+ isDurableFunctions: false);
+ }
+
+ [Fact]
+ public Task Events_WithNamespace()
+ {
+ string code = @"
+using System.Threading.Tasks;
+using Microsoft.DurableTask;
+using MyNS;
+
+namespace MyNS
+{
+ [DurableEvent(nameof(DataReceivedEvent))]
+ public record DataReceivedEvent(int Id, string Data);
+}";
+
+ string expectedOutput = TestHelpers.WrapAndFormat(
+ GeneratedClassName,
+ methodList: @"
+///
+/// Waits for an external event of type .
+///
+///
+public static Task WaitForDataReceivedEventAsync(this TaskOrchestrationContext context, CancellationToken cancellationToken = default)
+{
+ return context.WaitForExternalEvent(""DataReceivedEvent"", cancellationToken);
+}");
+
+ return TestHelpers.RunTestAsync(
+ GeneratedFileName,
+ code,
+ expectedOutput,
+ isDurableFunctions: false);
+ }
}
diff --git a/test/Generators.Tests/Utils/TestHelpers.cs b/test/Generators.Tests/Utils/TestHelpers.cs
index 67f030d9..960a525f 100644
--- a/test/Generators.Tests/Utils/TestHelpers.cs
+++ b/test/Generators.Tests/Utils/TestHelpers.cs
@@ -61,6 +61,7 @@ public static string WrapAndFormat(string generatedClassName, string methodList,
string formattedMethodList = IndentLines(spaces: 8, methodList);
string usings = @"
using System;
+using System.Threading;
using System.Threading.Tasks;
using Microsoft.DurableTask.Internal;";
From e0637653b1064c398c5885fd6d3171ca6304c239 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 10 Dec 2025 18:57:43 +0000
Subject: [PATCH 03/14] Add EventsSample demonstrating strongly-typed events
Co-authored-by: YunchuWang <12449837+YunchuWang@users.noreply.github.com>
---
Microsoft.DurableTask.sln | 365 ++++++++++++++++++++++-
samples/EventsSample/Events.cs | 20 ++
samples/EventsSample/EventsSample.csproj | 24 ++
samples/EventsSample/Program.cs | 75 +++++
samples/EventsSample/README.md | 83 ++++++
samples/EventsSample/Tasks.cs | 77 +++++
6 files changed, 634 insertions(+), 10 deletions(-)
create mode 100644 samples/EventsSample/Events.cs
create mode 100644 samples/EventsSample/EventsSample.csproj
create mode 100644 samples/EventsSample/Program.cs
create mode 100644 samples/EventsSample/README.md
create mode 100644 samples/EventsSample/Tasks.cs
diff --git a/Microsoft.DurableTask.sln b/Microsoft.DurableTask.sln
index 0ca1cad1..b13a8fbe 100644
--- a/Microsoft.DurableTask.sln
+++ b/Microsoft.DurableTask.sln
@@ -99,172 +99,514 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InProcessTestHost", "src\In
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InProcessTestHost.Tests", "test\InProcessTestHost.Tests\InProcessTestHost.Tests.csproj", "{B894780C-338F-475E-8E84-56AFA8197A06}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EventsSample", "samples\EventsSample\EventsSample.csproj", "{36C314FB-20F9-46B4-BC3F-08BA3096908E}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Grpc", "Grpc", "{51A52603-541D-DE3F-2825-C80F9EE6C532}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Grpc", "Grpc", "{3B8F957E-7773-4C0C-ACD7-91A1591D9312}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
+ Debug|x64 = Debug|x64
+ Debug|x86 = Debug|x86
Release|Any CPU = Release|Any CPU
+ Release|x64 = Release|x64
+ Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{B12489CB-B7E5-497B-8F0C-F87F678947C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B12489CB-B7E5-497B-8F0C-F87F678947C3}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Debug|x64.Build.0 = Debug|Any CPU
+ {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Debug|x86.Build.0 = Debug|Any CPU
{B12489CB-B7E5-497B-8F0C-F87F678947C3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B12489CB-B7E5-497B-8F0C-F87F678947C3}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Release|x64.ActiveCfg = Release|Any CPU
+ {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Release|x64.Build.0 = Release|Any CPU
+ {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Release|x86.ActiveCfg = Release|Any CPU
+ {B12489CB-B7E5-497B-8F0C-F87F678947C3}.Release|x86.Build.0 = Release|Any CPU
{B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Debug|x64.Build.0 = Debug|Any CPU
+ {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Debug|x86.Build.0 = Debug|Any CPU
{B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Release|x64.ActiveCfg = Release|Any CPU
+ {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Release|x64.Build.0 = Release|Any CPU
+ {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Release|x86.ActiveCfg = Release|Any CPU
+ {B0EB48BE-E4F7-4F50-B8BD-5C6172A7A584}.Release|x86.Build.0 = Release|Any CPU
{CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Debug|x64.Build.0 = Debug|Any CPU
+ {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Debug|x86.Build.0 = Debug|Any CPU
{CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Release|Any CPU.Build.0 = Release|Any CPU
+ {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Release|x64.ActiveCfg = Release|Any CPU
+ {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Release|x64.Build.0 = Release|Any CPU
+ {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Release|x86.ActiveCfg = Release|Any CPU
+ {CCA111DD-001F-4FBB-97C7-69BF32BE6A91}.Release|x86.Build.0 = Release|Any CPU
{7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Debug|x64.Build.0 = Debug|Any CPU
+ {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Debug|x86.Build.0 = Debug|Any CPU
{7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Release|x64.ActiveCfg = Release|Any CPU
+ {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Release|x64.Build.0 = Release|Any CPU
+ {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Release|x86.ActiveCfg = Release|Any CPU
+ {7161E5EC-BB61-4671-B91C-EE0F1E95D832}.Release|x86.Build.0 = Release|Any CPU
{4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Debug|x64.Build.0 = Debug|Any CPU
+ {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Debug|x86.Build.0 = Debug|Any CPU
{4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Release|Any CPU.Build.0 = Release|Any CPU
+ {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Release|x64.ActiveCfg = Release|Any CPU
+ {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Release|x64.Build.0 = Release|Any CPU
+ {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Release|x86.ActiveCfg = Release|Any CPU
+ {4133A1ED-7B45-480A-AE77-E9A3B34A95B5}.Release|x86.Build.0 = Release|Any CPU
{DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Debug|x64.Build.0 = Debug|Any CPU
+ {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Debug|x86.Build.0 = Debug|Any CPU
{DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Release|x64.ActiveCfg = Release|Any CPU
+ {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Release|x64.Build.0 = Release|Any CPU
+ {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Release|x86.ActiveCfg = Release|Any CPU
+ {DC9A3770-E66C-4CE9-833B-8647AAF5EFF2}.Release|x86.Build.0 = Release|Any CPU
{F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Debug|x64.Build.0 = Debug|Any CPU
+ {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Debug|x86.Build.0 = Debug|Any CPU
{F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Release|x64.ActiveCfg = Release|Any CPU
+ {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Release|x64.Build.0 = Release|Any CPU
+ {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Release|x86.ActiveCfg = Release|Any CPU
+ {F0677197-A9AC-4B98-8E99-CE525EDC07E2}.Release|x86.Build.0 = Release|Any CPU
{B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Debug|x64.Build.0 = Debug|Any CPU
+ {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Debug|x86.Build.0 = Debug|Any CPU
{B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Release|x64.ActiveCfg = Release|Any CPU
+ {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Release|x64.Build.0 = Release|Any CPU
+ {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Release|x86.ActiveCfg = Release|Any CPU
+ {B055F421-29B8-4D9A-BE75-E91DB167FBEC}.Release|x86.Build.0 = Release|Any CPU
{3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Debug|x64.Build.0 = Debug|Any CPU
+ {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Debug|x86.Build.0 = Debug|Any CPU
{3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Release|x64.ActiveCfg = Release|Any CPU
+ {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Release|x64.Build.0 = Release|Any CPU
+ {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Release|x86.ActiveCfg = Release|Any CPU
+ {3666FFB5-68E3-4173-AAB6-699E517EF9B0}.Release|x86.Build.0 = Release|Any CPU
{AF74325F-2E27-4D6B-A795-74145CA21557}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{AF74325F-2E27-4D6B-A795-74145CA21557}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {AF74325F-2E27-4D6B-A795-74145CA21557}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {AF74325F-2E27-4D6B-A795-74145CA21557}.Debug|x64.Build.0 = Debug|Any CPU
+ {AF74325F-2E27-4D6B-A795-74145CA21557}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {AF74325F-2E27-4D6B-A795-74145CA21557}.Debug|x86.Build.0 = Debug|Any CPU
{AF74325F-2E27-4D6B-A795-74145CA21557}.Release|Any CPU.ActiveCfg = Release|Any CPU
{AF74325F-2E27-4D6B-A795-74145CA21557}.Release|Any CPU.Build.0 = Release|Any CPU
+ {AF74325F-2E27-4D6B-A795-74145CA21557}.Release|x64.ActiveCfg = Release|Any CPU
+ {AF74325F-2E27-4D6B-A795-74145CA21557}.Release|x64.Build.0 = Release|Any CPU
+ {AF74325F-2E27-4D6B-A795-74145CA21557}.Release|x86.ActiveCfg = Release|Any CPU
+ {AF74325F-2E27-4D6B-A795-74145CA21557}.Release|x86.Build.0 = Release|Any CPU
{96255537-3600-4E90-96EA-420AA72F9DE4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{96255537-3600-4E90-96EA-420AA72F9DE4}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {96255537-3600-4E90-96EA-420AA72F9DE4}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {96255537-3600-4E90-96EA-420AA72F9DE4}.Debug|x64.Build.0 = Debug|Any CPU
+ {96255537-3600-4E90-96EA-420AA72F9DE4}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {96255537-3600-4E90-96EA-420AA72F9DE4}.Debug|x86.Build.0 = Debug|Any CPU
{96255537-3600-4E90-96EA-420AA72F9DE4}.Release|Any CPU.ActiveCfg = Release|Any CPU
{96255537-3600-4E90-96EA-420AA72F9DE4}.Release|Any CPU.Build.0 = Release|Any CPU
+ {96255537-3600-4E90-96EA-420AA72F9DE4}.Release|x64.ActiveCfg = Release|Any CPU
+ {96255537-3600-4E90-96EA-420AA72F9DE4}.Release|x64.Build.0 = Release|Any CPU
+ {96255537-3600-4E90-96EA-420AA72F9DE4}.Release|x86.ActiveCfg = Release|Any CPU
+ {96255537-3600-4E90-96EA-420AA72F9DE4}.Release|x86.Build.0 = Release|Any CPU
{6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Debug|x64.Build.0 = Debug|Any CPU
+ {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Debug|x86.Build.0 = Debug|Any CPU
{6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Release|x64.ActiveCfg = Release|Any CPU
+ {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Release|x64.Build.0 = Release|Any CPU
+ {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Release|x86.ActiveCfg = Release|Any CPU
+ {6652A050-BB1B-427E-A897-6D23AC1E5CDC}.Release|x86.Build.0 = Release|Any CPU
{B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Debug|x64.Build.0 = Debug|Any CPU
+ {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Debug|x86.Build.0 = Debug|Any CPU
{B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Release|x64.ActiveCfg = Release|Any CPU
+ {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Release|x64.Build.0 = Release|Any CPU
+ {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Release|x86.ActiveCfg = Release|Any CPU
+ {B9ED9368-D869-4F38-9E39-F907DB7F39F9}.Release|x86.Build.0 = Release|Any CPU
{7825CFEA-2923-4C44-BA36-8E16259B9777}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{7825CFEA-2923-4C44-BA36-8E16259B9777}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {7825CFEA-2923-4C44-BA36-8E16259B9777}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {7825CFEA-2923-4C44-BA36-8E16259B9777}.Debug|x64.Build.0 = Debug|Any CPU
+ {7825CFEA-2923-4C44-BA36-8E16259B9777}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {7825CFEA-2923-4C44-BA36-8E16259B9777}.Debug|x86.Build.0 = Debug|Any CPU
{7825CFEA-2923-4C44-BA36-8E16259B9777}.Release|Any CPU.ActiveCfg = Release|Any CPU
{7825CFEA-2923-4C44-BA36-8E16259B9777}.Release|Any CPU.Build.0 = Release|Any CPU
+ {7825CFEA-2923-4C44-BA36-8E16259B9777}.Release|x64.ActiveCfg = Release|Any CPU
+ {7825CFEA-2923-4C44-BA36-8E16259B9777}.Release|x64.Build.0 = Release|Any CPU
+ {7825CFEA-2923-4C44-BA36-8E16259B9777}.Release|x86.ActiveCfg = Release|Any CPU
+ {7825CFEA-2923-4C44-BA36-8E16259B9777}.Release|x86.Build.0 = Release|Any CPU
{848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Debug|x64.Build.0 = Debug|Any CPU
+ {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Debug|x86.Build.0 = Debug|Any CPU
{848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Release|x64.ActiveCfg = Release|Any CPU
+ {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Release|x64.Build.0 = Release|Any CPU
+ {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Release|x86.ActiveCfg = Release|Any CPU
+ {848FC5BD-4A99-4A0D-9099-9597700AA7BC}.Release|x86.Build.0 = Release|Any CPU
{93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Debug|x64.Build.0 = Debug|Any CPU
+ {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Debug|x86.Build.0 = Debug|Any CPU
{93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Release|x64.ActiveCfg = Release|Any CPU
+ {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Release|x64.Build.0 = Release|Any CPU
+ {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Release|x86.ActiveCfg = Release|Any CPU
+ {93ED401F-5AD2-47B6-B4CA-BA791D8B82B2}.Release|x86.Build.0 = Release|Any CPU
{8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Debug|x64.Build.0 = Debug|Any CPU
+ {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Debug|x86.Build.0 = Debug|Any CPU
{8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Release|Any CPU.Build.0 = Release|Any CPU
+ {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Release|x64.ActiveCfg = Release|Any CPU
+ {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Release|x64.Build.0 = Release|Any CPU
+ {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Release|x86.ActiveCfg = Release|Any CPU
+ {8A0156E6-F033-49AB-AB0C-6698CE1DB24F}.Release|x86.Build.0 = Release|Any CPU
{57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Debug|x64.Build.0 = Debug|Any CPU
+ {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Debug|x86.Build.0 = Debug|Any CPU
{57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Release|x64.ActiveCfg = Release|Any CPU
+ {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Release|x64.Build.0 = Release|Any CPU
+ {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Release|x86.ActiveCfg = Release|Any CPU
+ {57A4C812-B0D9-49E9-9EBE-7E94D3D78ED7}.Release|x86.Build.0 = Release|Any CPU
{1E135970-60CF-470A-9270-4560BFA0A7DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1E135970-60CF-470A-9270-4560BFA0A7DF}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1E135970-60CF-470A-9270-4560BFA0A7DF}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1E135970-60CF-470A-9270-4560BFA0A7DF}.Debug|x64.Build.0 = Debug|Any CPU
+ {1E135970-60CF-470A-9270-4560BFA0A7DF}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1E135970-60CF-470A-9270-4560BFA0A7DF}.Debug|x86.Build.0 = Debug|Any CPU
{1E135970-60CF-470A-9270-4560BFA0A7DF}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1E135970-60CF-470A-9270-4560BFA0A7DF}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1E135970-60CF-470A-9270-4560BFA0A7DF}.Release|x64.ActiveCfg = Release|Any CPU
+ {1E135970-60CF-470A-9270-4560BFA0A7DF}.Release|x64.Build.0 = Release|Any CPU
+ {1E135970-60CF-470A-9270-4560BFA0A7DF}.Release|x86.ActiveCfg = Release|Any CPU
+ {1E135970-60CF-470A-9270-4560BFA0A7DF}.Release|x86.Build.0 = Release|Any CPU
{505F6151-6E36-4E0A-A740-14751B8A9397}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{505F6151-6E36-4E0A-A740-14751B8A9397}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {505F6151-6E36-4E0A-A740-14751B8A9397}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {505F6151-6E36-4E0A-A740-14751B8A9397}.Debug|x64.Build.0 = Debug|Any CPU
+ {505F6151-6E36-4E0A-A740-14751B8A9397}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {505F6151-6E36-4E0A-A740-14751B8A9397}.Debug|x86.Build.0 = Debug|Any CPU
{505F6151-6E36-4E0A-A740-14751B8A9397}.Release|Any CPU.ActiveCfg = Release|Any CPU
{505F6151-6E36-4E0A-A740-14751B8A9397}.Release|Any CPU.Build.0 = Release|Any CPU
+ {505F6151-6E36-4E0A-A740-14751B8A9397}.Release|x64.ActiveCfg = Release|Any CPU
+ {505F6151-6E36-4E0A-A740-14751B8A9397}.Release|x64.Build.0 = Release|Any CPU
+ {505F6151-6E36-4E0A-A740-14751B8A9397}.Release|x86.ActiveCfg = Release|Any CPU
+ {505F6151-6E36-4E0A-A740-14751B8A9397}.Release|x86.Build.0 = Release|Any CPU
{93E3B973-0FC4-4241-B7BB-064FB538FB50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{93E3B973-0FC4-4241-B7BB-064FB538FB50}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Debug|x64.Build.0 = Debug|Any CPU
+ {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Debug|x86.Build.0 = Debug|Any CPU
{93E3B973-0FC4-4241-B7BB-064FB538FB50}.Release|Any CPU.ActiveCfg = Release|Any CPU
{93E3B973-0FC4-4241-B7BB-064FB538FB50}.Release|Any CPU.Build.0 = Release|Any CPU
+ {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Release|x64.ActiveCfg = Release|Any CPU
+ {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Release|x64.Build.0 = Release|Any CPU
+ {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Release|x86.ActiveCfg = Release|Any CPU
+ {93E3B973-0FC4-4241-B7BB-064FB538FB50}.Release|x86.Build.0 = Release|Any CPU
{44AD321D-96D4-481E-BD41-D0B12A619833}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{44AD321D-96D4-481E-BD41-D0B12A619833}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {44AD321D-96D4-481E-BD41-D0B12A619833}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {44AD321D-96D4-481E-BD41-D0B12A619833}.Debug|x64.Build.0 = Debug|Any CPU
+ {44AD321D-96D4-481E-BD41-D0B12A619833}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {44AD321D-96D4-481E-BD41-D0B12A619833}.Debug|x86.Build.0 = Debug|Any CPU
{44AD321D-96D4-481E-BD41-D0B12A619833}.Release|Any CPU.ActiveCfg = Release|Any CPU
{44AD321D-96D4-481E-BD41-D0B12A619833}.Release|Any CPU.Build.0 = Release|Any CPU
+ {44AD321D-96D4-481E-BD41-D0B12A619833}.Release|x64.ActiveCfg = Release|Any CPU
+ {44AD321D-96D4-481E-BD41-D0B12A619833}.Release|x64.Build.0 = Release|Any CPU
+ {44AD321D-96D4-481E-BD41-D0B12A619833}.Release|x86.ActiveCfg = Release|Any CPU
+ {44AD321D-96D4-481E-BD41-D0B12A619833}.Release|x86.Build.0 = Release|Any CPU
{82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Debug|x64.Build.0 = Debug|Any CPU
+ {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Debug|x86.Build.0 = Debug|Any CPU
{82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Release|Any CPU.ActiveCfg = Release|Any CPU
{82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Release|x64.ActiveCfg = Release|Any CPU
+ {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Release|x64.Build.0 = Release|Any CPU
+ {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Release|x86.ActiveCfg = Release|Any CPU
+ {82C0CD7D-2764-421A-8256-7E2304D5A6E7}.Release|x86.Build.0 = Release|Any CPU
{998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Debug|x64.Build.0 = Debug|Any CPU
+ {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Debug|x86.Build.0 = Debug|Any CPU
{998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Release|Any CPU.ActiveCfg = Release|Any CPU
{998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Release|Any CPU.Build.0 = Release|Any CPU
+ {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Release|x64.ActiveCfg = Release|Any CPU
+ {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Release|x64.Build.0 = Release|Any CPU
+ {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Release|x86.ActiveCfg = Release|Any CPU
+ {998E9D97-BD36-4A9D-81FC-5DAC1CE40083}.Release|x86.Build.0 = Release|Any CPU
{541FCCCE-1059-4691-B027-F761CD80DE92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{541FCCCE-1059-4691-B027-F761CD80DE92}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {541FCCCE-1059-4691-B027-F761CD80DE92}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {541FCCCE-1059-4691-B027-F761CD80DE92}.Debug|x64.Build.0 = Debug|Any CPU
+ {541FCCCE-1059-4691-B027-F761CD80DE92}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {541FCCCE-1059-4691-B027-F761CD80DE92}.Debug|x86.Build.0 = Debug|Any CPU
{541FCCCE-1059-4691-B027-F761CD80DE92}.Release|Any CPU.ActiveCfg = Release|Any CPU
{541FCCCE-1059-4691-B027-F761CD80DE92}.Release|Any CPU.Build.0 = Release|Any CPU
+ {541FCCCE-1059-4691-B027-F761CD80DE92}.Release|x64.ActiveCfg = Release|Any CPU
+ {541FCCCE-1059-4691-B027-F761CD80DE92}.Release|x64.Build.0 = Release|Any CPU
+ {541FCCCE-1059-4691-B027-F761CD80DE92}.Release|x86.ActiveCfg = Release|Any CPU
+ {541FCCCE-1059-4691-B027-F761CD80DE92}.Release|x86.Build.0 = Release|Any CPU
{FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Debug|x64.Build.0 = Debug|Any CPU
+ {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Debug|x86.Build.0 = Debug|Any CPU
{FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Release|x64.ActiveCfg = Release|Any CPU
+ {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Release|x64.Build.0 = Release|Any CPU
+ {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Release|x86.ActiveCfg = Release|Any CPU
+ {FC2692E7-79AE-400E-A50F-8E0BCC8C9BD9}.Release|x86.Build.0 = Release|Any CPU
{E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Debug|x64.Build.0 = Debug|Any CPU
+ {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Debug|x86.Build.0 = Debug|Any CPU
{E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Release|x64.ActiveCfg = Release|Any CPU
+ {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Release|x64.Build.0 = Release|Any CPU
+ {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Release|x86.ActiveCfg = Release|Any CPU
+ {E2E47F34-AFDD-4FAD-B1AB-66B1C4911EF2}.Release|x86.Build.0 = Release|Any CPU
{1110FD38-94C6-4374-BF9D-D3D43A129600}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1110FD38-94C6-4374-BF9D-D3D43A129600}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1110FD38-94C6-4374-BF9D-D3D43A129600}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1110FD38-94C6-4374-BF9D-D3D43A129600}.Debug|x64.Build.0 = Debug|Any CPU
+ {1110FD38-94C6-4374-BF9D-D3D43A129600}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1110FD38-94C6-4374-BF9D-D3D43A129600}.Debug|x86.Build.0 = Debug|Any CPU
{1110FD38-94C6-4374-BF9D-D3D43A129600}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1110FD38-94C6-4374-BF9D-D3D43A129600}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1110FD38-94C6-4374-BF9D-D3D43A129600}.Release|x64.ActiveCfg = Release|Any CPU
+ {1110FD38-94C6-4374-BF9D-D3D43A129600}.Release|x64.Build.0 = Release|Any CPU
+ {1110FD38-94C6-4374-BF9D-D3D43A129600}.Release|x86.ActiveCfg = Release|Any CPU
+ {1110FD38-94C6-4374-BF9D-D3D43A129600}.Release|x86.Build.0 = Release|Any CPU
{43E540F8-39E6-484C-9F4C-5C745378741A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{43E540F8-39E6-484C-9F4C-5C745378741A}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {43E540F8-39E6-484C-9F4C-5C745378741A}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {43E540F8-39E6-484C-9F4C-5C745378741A}.Debug|x64.Build.0 = Debug|Any CPU
+ {43E540F8-39E6-484C-9F4C-5C745378741A}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {43E540F8-39E6-484C-9F4C-5C745378741A}.Debug|x86.Build.0 = Debug|Any CPU
{43E540F8-39E6-484C-9F4C-5C745378741A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{43E540F8-39E6-484C-9F4C-5C745378741A}.Release|Any CPU.Build.0 = Release|Any CPU
+ {43E540F8-39E6-484C-9F4C-5C745378741A}.Release|x64.ActiveCfg = Release|Any CPU
+ {43E540F8-39E6-484C-9F4C-5C745378741A}.Release|x64.Build.0 = Release|Any CPU
+ {43E540F8-39E6-484C-9F4C-5C745378741A}.Release|x86.ActiveCfg = Release|Any CPU
+ {43E540F8-39E6-484C-9F4C-5C745378741A}.Release|x86.Build.0 = Release|Any CPU
{1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Debug|x64.Build.0 = Debug|Any CPU
+ {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Debug|x86.Build.0 = Debug|Any CPU
{1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Release|Any CPU.ActiveCfg = Release|Any CPU
{1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Release|Any CPU.Build.0 = Release|Any CPU
+ {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Release|x64.ActiveCfg = Release|Any CPU
+ {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Release|x64.Build.0 = Release|Any CPU
+ {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Release|x86.ActiveCfg = Release|Any CPU
+ {1E5C2E83-7B6B-425A-9C9B-0B887D273B12}.Release|x86.Build.0 = Release|Any CPU
{3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Debug|x64.Build.0 = Debug|Any CPU
+ {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Debug|x86.Build.0 = Debug|Any CPU
{3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Release|x64.ActiveCfg = Release|Any CPU
+ {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Release|x64.Build.0 = Release|Any CPU
+ {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Release|x86.ActiveCfg = Release|Any CPU
+ {3272C041-F81D-4C85-A4FB-2A700B5A7A9D}.Release|x86.Build.0 = Release|Any CPU
{B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Debug|x64.Build.0 = Debug|Any CPU
+ {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Debug|x86.Build.0 = Debug|Any CPU
{B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Release|x64.ActiveCfg = Release|Any CPU
+ {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Release|x64.Build.0 = Release|Any CPU
+ {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Release|x86.ActiveCfg = Release|Any CPU
+ {B48FACA9-A328-452A-BFAE-C4F60F9C7024}.Release|x86.Build.0 = Release|Any CPU
{69ED743C-D616-4530-87E2-391D249D7368}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{69ED743C-D616-4530-87E2-391D249D7368}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {69ED743C-D616-4530-87E2-391D249D7368}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {69ED743C-D616-4530-87E2-391D249D7368}.Debug|x64.Build.0 = Debug|Any CPU
+ {69ED743C-D616-4530-87E2-391D249D7368}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {69ED743C-D616-4530-87E2-391D249D7368}.Debug|x86.Build.0 = Debug|Any CPU
{69ED743C-D616-4530-87E2-391D249D7368}.Release|Any CPU.ActiveCfg = Release|Any CPU
{69ED743C-D616-4530-87E2-391D249D7368}.Release|Any CPU.Build.0 = Release|Any CPU
+ {69ED743C-D616-4530-87E2-391D249D7368}.Release|x64.ActiveCfg = Release|Any CPU
+ {69ED743C-D616-4530-87E2-391D249D7368}.Release|x64.Build.0 = Release|Any CPU
+ {69ED743C-D616-4530-87E2-391D249D7368}.Release|x86.ActiveCfg = Release|Any CPU
+ {69ED743C-D616-4530-87E2-391D249D7368}.Release|x86.Build.0 = Release|Any CPU
{A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Debug|x64.Build.0 = Debug|Any CPU
+ {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Debug|x86.Build.0 = Debug|Any CPU
{A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Release|Any CPU.Build.0 = Release|Any CPU
+ {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Release|x64.ActiveCfg = Release|Any CPU
+ {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Release|x64.Build.0 = Release|Any CPU
+ {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Release|x86.ActiveCfg = Release|Any CPU
+ {A89B766C-987F-4C9F-8937-D0AB9FE640C8}.Release|x86.Build.0 = Release|Any CPU
{100348B5-4D97-4A3F-B777-AB14F276F8FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{100348B5-4D97-4A3F-B777-AB14F276F8FE}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Debug|x64.Build.0 = Debug|Any CPU
+ {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Debug|x86.Build.0 = Debug|Any CPU
{100348B5-4D97-4A3F-B777-AB14F276F8FE}.Release|Any CPU.ActiveCfg = Release|Any CPU
{100348B5-4D97-4A3F-B777-AB14F276F8FE}.Release|Any CPU.Build.0 = Release|Any CPU
+ {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Release|x64.ActiveCfg = Release|Any CPU
+ {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Release|x64.Build.0 = Release|Any CPU
+ {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Release|x86.ActiveCfg = Release|Any CPU
+ {100348B5-4D97-4A3F-B777-AB14F276F8FE}.Release|x86.Build.0 = Release|Any CPU
{D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|x64.Build.0 = Debug|Any CPU
+ {D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {D2779F32-A548-44F8-B60A-6AC018966C79}.Debug|x86.Build.0 = Debug|Any CPU
{D2779F32-A548-44F8-B60A-6AC018966C79}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D2779F32-A548-44F8-B60A-6AC018966C79}.Release|Any CPU.Build.0 = Release|Any CPU
- {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|Any CPU.Build.0 = Release|Any CPU
- {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {B894780C-338F-475E-8E84-56AFA8197A06}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {B894780C-338F-475E-8E84-56AFA8197A06}.Release|Any CPU.Build.0 = Release|Any CPU
+ {D2779F32-A548-44F8-B60A-6AC018966C79}.Release|x64.ActiveCfg = Release|Any CPU
+ {D2779F32-A548-44F8-B60A-6AC018966C79}.Release|x64.Build.0 = Release|Any CPU
+ {D2779F32-A548-44F8-B60A-6AC018966C79}.Release|x86.ActiveCfg = Release|Any CPU
+ {D2779F32-A548-44F8-B60A-6AC018966C79}.Release|x86.Build.0 = Release|Any CPU
{6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|x64.Build.0 = Debug|Any CPU
+ {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Debug|x86.Build.0 = Debug|Any CPU
{6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|Any CPU.Build.0 = Release|Any CPU
+ {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|x64.ActiveCfg = Release|Any CPU
+ {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|x64.Build.0 = Release|Any CPU
+ {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|x86.ActiveCfg = Release|Any CPU
+ {6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC}.Release|x86.Build.0 = Release|Any CPU
{FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|x64.Build.0 = Debug|Any CPU
+ {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Debug|x86.Build.0 = Debug|Any CPU
{FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|x64.ActiveCfg = Release|Any CPU
+ {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|x64.Build.0 = Release|Any CPU
+ {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|x86.ActiveCfg = Release|Any CPU
+ {FE1DA748-D6DB-E168-BC42-6DBBCEAF229C}.Release|x86.Build.0 = Release|Any CPU
+ {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|x64.Build.0 = Debug|Any CPU
+ {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Debug|x86.Build.0 = Debug|Any CPU
+ {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|x64.ActiveCfg = Release|Any CPU
+ {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|x64.Build.0 = Release|Any CPU
+ {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|x86.ActiveCfg = Release|Any CPU
+ {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E}.Release|x86.Build.0 = Release|Any CPU
+ {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|x64.Build.0 = Debug|Any CPU
+ {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {B894780C-338F-475E-8E84-56AFA8197A06}.Debug|x86.Build.0 = Debug|Any CPU
+ {B894780C-338F-475E-8E84-56AFA8197A06}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {B894780C-338F-475E-8E84-56AFA8197A06}.Release|Any CPU.Build.0 = Release|Any CPU
+ {B894780C-338F-475E-8E84-56AFA8197A06}.Release|x64.ActiveCfg = Release|Any CPU
+ {B894780C-338F-475E-8E84-56AFA8197A06}.Release|x64.Build.0 = Release|Any CPU
+ {B894780C-338F-475E-8E84-56AFA8197A06}.Release|x86.ActiveCfg = Release|Any CPU
+ {B894780C-338F-475E-8E84-56AFA8197A06}.Release|x86.Build.0 = Release|Any CPU
+ {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Debug|x64.ActiveCfg = Debug|Any CPU
+ {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Debug|x64.Build.0 = Debug|Any CPU
+ {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Debug|x86.ActiveCfg = Debug|Any CPU
+ {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Debug|x86.Build.0 = Debug|Any CPU
+ {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Release|Any CPU.Build.0 = Release|Any CPU
+ {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Release|x64.ActiveCfg = Release|Any CPU
+ {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Release|x64.Build.0 = Release|Any CPU
+ {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Release|x86.ActiveCfg = Release|Any CPU
+ {36C314FB-20F9-46B4-BC3F-08BA3096908E}.Release|x86.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -310,10 +652,13 @@ Global
{A89B766C-987F-4C9F-8937-D0AB9FE640C8} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17}
{100348B5-4D97-4A3F-B777-AB14F276F8FE} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17}
{D2779F32-A548-44F8-B60A-6AC018966C79} = {E5637F81-2FB9-4CD7-900D-455363B142A7}
- {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E} = {8AFC9781-F6F1-4696-BB4A-9ED7CA9D612B}
- {B894780C-338F-475E-8E84-56AFA8197A06} = {E5637F81-2FB9-4CD7-900D-455363B142A7}
{6EB9D002-62C8-D6C1-62A8-14C54CA6DBBC} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17}
{FE1DA748-D6DB-E168-BC42-6DBBCEAF229C} = {8AFC9781-F6F1-4696-BB4A-9ED7CA9D612B}
+ {5F1E1662-D2D1-4325-BFE3-6AE23A8A4D7E} = {8AFC9781-F6F1-4696-BB4A-9ED7CA9D612B}
+ {B894780C-338F-475E-8E84-56AFA8197A06} = {E5637F81-2FB9-4CD7-900D-455363B142A7}
+ {36C314FB-20F9-46B4-BC3F-08BA3096908E} = {EFF7632B-821E-4CFC-B4A0-ED4B24296B17}
+ {51A52603-541D-DE3F-2825-C80F9EE6C532} = {1C217BB2-CE16-41CC-9D47-0FC0DB60BDB3}
+ {3B8F957E-7773-4C0C-ACD7-91A1591D9312} = {5B448FF6-EC42-491D-A22E-1DC8B618E6D5}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {AB41CB55-35EA-4986-A522-387AB3402E71}
diff --git a/samples/EventsSample/Events.cs b/samples/EventsSample/Events.cs
new file mode 100644
index 00000000..e284acae
--- /dev/null
+++ b/samples/EventsSample/Events.cs
@@ -0,0 +1,20 @@
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+
+using Microsoft.DurableTask;
+
+namespace EventsSample;
+
+///
+/// Example event type annotated with DurableEventAttribute.
+/// This generates a strongly-typed WaitForApprovalEventAsync method.
+///
+[DurableEvent(nameof(ApprovalEvent))]
+public sealed record ApprovalEvent(bool Approved, string? Approver);
+
+///
+/// Another example event type with custom name.
+/// This generates a WaitForDataReceivedAsync method that waits for "DataReceived" event.
+///
+[DurableEvent("DataReceived")]
+public sealed record DataReceivedEvent(int Id, string Data);
diff --git a/samples/EventsSample/EventsSample.csproj b/samples/EventsSample/EventsSample.csproj
new file mode 100644
index 00000000..9c8cf843
--- /dev/null
+++ b/samples/EventsSample/EventsSample.csproj
@@ -0,0 +1,24 @@
+
+
+
+ Exe
+ net6.0;net8.0;net10.0
+ enable
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/samples/EventsSample/Program.cs b/samples/EventsSample/Program.cs
new file mode 100644
index 00000000..eb1a3321
--- /dev/null
+++ b/samples/EventsSample/Program.cs
@@ -0,0 +1,75 @@
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+
+// This sample demonstrates the use of strongly-typed external events with DurableEventAttribute.
+
+using EventsSample;
+using Microsoft.DurableTask;
+using Microsoft.DurableTask.Client;
+using Microsoft.DurableTask.Worker;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Hosting;
+
+HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
+
+builder.Services.AddDurableTaskClient().UseGrpc();
+builder.Services.AddDurableTaskWorker()
+ .AddTasks(tasks =>
+ {
+ tasks.AddOrchestrator();
+ tasks.AddActivity();
+ tasks.AddOrchestrator();
+ tasks.AddActivity();
+ })
+ .UseGrpc();
+
+IHost host = builder.Build();
+await host.StartAsync();
+
+await using DurableTaskClient client = host.Services.GetRequiredService();
+
+Console.WriteLine("=== Strongly-Typed Events Sample ===");
+Console.WriteLine();
+
+// Example 1: Approval workflow
+Console.WriteLine("Starting approval workflow...");
+string approvalInstanceId = await client.ScheduleNewOrchestrationInstanceAsync("ApprovalOrchestrator", "Important Request");
+Console.WriteLine($"Started orchestration with ID: {approvalInstanceId}");
+Console.WriteLine();
+
+// Wait a moment for the notification to be sent
+await Task.Delay(1000);
+
+// Simulate approval
+Console.WriteLine("Simulating approval event...");
+await client.RaiseEventAsync(approvalInstanceId, "ApprovalEvent", new ApprovalEvent(true, "John Doe"));
+
+// Wait for completion
+OrchestrationMetadata approvalResult = await client.WaitForInstanceCompletionAsync(
+ approvalInstanceId,
+ getInputsAndOutputs: true);
+Console.WriteLine($"Approval workflow result: {approvalResult.ReadOutputAs()}");
+Console.WriteLine();
+
+// Example 2: Data processing workflow
+Console.WriteLine("Starting data processing workflow...");
+string dataInstanceId = await client.ScheduleNewOrchestrationInstanceAsync("DataProcessingOrchestrator", "test-input");
+Console.WriteLine($"Started orchestration with ID: {dataInstanceId}");
+Console.WriteLine();
+
+// Wait a moment
+await Task.Delay(1000);
+
+// Send data event
+Console.WriteLine("Sending data event...");
+await client.RaiseEventAsync(dataInstanceId, "DataReceived", new DataReceivedEvent(123, "Sample Data"));
+
+// Wait for completion
+OrchestrationMetadata dataResult = await client.WaitForInstanceCompletionAsync(
+ dataInstanceId,
+ getInputsAndOutputs: true);
+Console.WriteLine($"Data processing result: {dataResult.ReadOutputAs()}");
+Console.WriteLine();
+
+Console.WriteLine("Sample completed successfully!");
+await host.StopAsync();
diff --git a/samples/EventsSample/README.md b/samples/EventsSample/README.md
new file mode 100644
index 00000000..caa05f7f
--- /dev/null
+++ b/samples/EventsSample/README.md
@@ -0,0 +1,83 @@
+# Strongly-Typed Events Sample
+
+This sample demonstrates the use of strongly-typed external events using the `DurableEventAttribute`.
+
+## Overview
+
+The `DurableEventAttribute` allows you to define event types that automatically generate strongly-typed extension methods for waiting on external events in orchestrations. This provides compile-time type safety and better IntelliSense support.
+
+## Key Features
+
+1. **Strongly-Typed Event Definitions**: Define event types using records or classes with the `[DurableEvent]` attribute
+2. **Generated Extension Methods**: The source generator automatically creates `WaitFor{EventName}Async` methods
+3. **Type Safety**: Event payloads are strongly-typed, reducing runtime errors
+
+## Sample Code
+
+### Defining an Event
+
+```csharp
+[DurableEvent(nameof(ApprovalEvent))]
+public sealed record ApprovalEvent(bool Approved, string? Approver);
+```
+
+This generates an extension method:
+
+```csharp
+public static Task WaitForApprovalEventAsync(
+ this TaskOrchestrationContext context,
+ CancellationToken cancellationToken = default);
+```
+
+### Using the Generated Method in an Orchestrator
+
+```csharp
+[DurableTask("ApprovalOrchestrator")]
+public class ApprovalOrchestrator : TaskOrchestrator
+{
+ public override async Task RunAsync(TaskOrchestrationContext context, string requestName)
+ {
+ // Wait for approval event using the generated strongly-typed method
+ ApprovalEvent approvalEvent = await context.WaitForApprovalEventAsync();
+
+ if (approvalEvent.Approved)
+ {
+ return $"Request approved by {approvalEvent.Approver}";
+ }
+ else
+ {
+ return $"Request rejected by {approvalEvent.Approver}";
+ }
+ }
+}
+```
+
+### Raising Events from Client Code
+
+```csharp
+await client.RaiseEventAsync(
+ instanceId,
+ "ApprovalEvent",
+ new ApprovalEvent(true, "John Doe"));
+```
+
+## Running the Sample
+
+1. Ensure you have the Durable Task sidecar running (if using gRPC mode)
+2. Run the sample:
+ ```bash
+ dotnet run
+ ```
+
+The sample will:
+1. Start an approval workflow and wait for an approval event
+2. Raise an approval event from the client
+3. Complete the workflow with the approval result
+4. Start a data processing workflow and demonstrate another event type
+
+## Benefits
+
+- **Type Safety**: Compile-time checking of event payloads
+- **IntelliSense**: Better IDE support for discovering available event methods
+- **Less Boilerplate**: No need to manually call `WaitForExternalEvent` with string literals
+- **Refactoring Support**: Renaming event types automatically updates generated code
diff --git a/samples/EventsSample/Tasks.cs b/samples/EventsSample/Tasks.cs
new file mode 100644
index 00000000..5eec54cd
--- /dev/null
+++ b/samples/EventsSample/Tasks.cs
@@ -0,0 +1,77 @@
+// Copyright (c) Microsoft Corporation.
+// Licensed under the MIT License.
+
+using Microsoft.DurableTask;
+
+namespace EventsSample;
+
+///
+/// Orchestrator that demonstrates strongly-typed external events.
+///
+[DurableTask("ApprovalOrchestrator")]
+public class ApprovalOrchestrator : TaskOrchestrator
+{
+ public override async Task RunAsync(TaskOrchestrationContext context, string requestName)
+ {
+ // Send a notification requesting approval
+ await context.CallNotifyApprovalRequiredAsync(requestName);
+
+ // Wait for approval event using the generated strongly-typed method
+ // Note: WaitForApprovalEventAsync is generated by the source generator
+ ApprovalEvent approvalEvent = await context.WaitForApprovalEventAsync();
+
+ if (approvalEvent.Approved)
+ {
+ return $"Request '{requestName}' was approved by {approvalEvent.Approver ?? "unknown"}";
+ }
+ else
+ {
+ return $"Request '{requestName}' was rejected by {approvalEvent.Approver ?? "unknown"}";
+ }
+ }
+}
+
+///
+/// Activity that simulates sending an approval notification.
+///
+[DurableTask("NotifyApprovalRequired")]
+public class NotifyApprovalRequiredActivity : TaskActivity
+{
+ public override Task RunAsync(TaskActivityContext context, string requestName)
+ {
+ Console.WriteLine($"[{DateTime.UtcNow:HH:mm:ss}] Approval required for: {requestName}");
+ Console.WriteLine($" Instance ID: {context.InstanceId}");
+ return Task.FromResult("Notification sent");
+ }
+}
+
+///
+/// Orchestrator that demonstrates waiting for multiple event types.
+///
+[DurableTask("DataProcessingOrchestrator")]
+public class DataProcessingOrchestrator : TaskOrchestrator
+{
+ public override async Task RunAsync(TaskOrchestrationContext context, string input)
+ {
+ // Wait for data using the generated strongly-typed method
+ DataReceivedEvent dataEvent = await context.WaitForDataReceivedAsync();
+
+ // Process the data
+ string result = await context.CallProcessDataAsync(dataEvent.Data);
+
+ return $"Processed data {dataEvent.Id}: {result}";
+ }
+}
+
+///
+/// Activity that processes data.
+///
+[DurableTask("ProcessData")]
+public class ProcessDataActivity : TaskActivity
+{
+ public override Task RunAsync(TaskActivityContext context, string data)
+ {
+ Console.WriteLine($"[{DateTime.UtcNow:HH:mm:ss}] Processing data: {data}");
+ return Task.FromResult($"Processed: {data.ToUpper()}");
+ }
+}
From fd94810415e0201c545579dbb6a408d1ca146333 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 10 Dec 2025 19:00:41 +0000
Subject: [PATCH 04/14] Fix null safety in event name extraction
Co-authored-by: YunchuWang <12449837+YunchuWang@users.noreply.github.com>
---
src/Generators/DurableTaskSourceGenerator.cs | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/src/Generators/DurableTaskSourceGenerator.cs b/src/Generators/DurableTaskSourceGenerator.cs
index 9a6818c9..144a5407 100644
--- a/src/Generators/DurableTaskSourceGenerator.cs
+++ b/src/Generators/DurableTaskSourceGenerator.cs
@@ -203,7 +203,11 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
if (attribute.ArgumentList?.Arguments.Count > 0)
{
ExpressionSyntax expression = attribute.ArgumentList.Arguments[0].Expression;
- eventName = context.SemanticModel.GetConstantValue(expression).ToString();
+ Optional