Основные большие литералы перенесены на codegen-tools

This commit is contained in:
2025-03-27 20:06:09 +03:00
parent 22d627cf9c
commit 361b4cd3f6
11 changed files with 81 additions and 311 deletions
-18
View File
@@ -1,18 +0,0 @@
using Example.Events.Shared;
using mROA.Implementation;
namespace Example.Events.Backend;
public class Chat : IChat
{
public void PostSymbol(string symbol, RequestContext context)
{
OnCharPosted?.Invoke(symbol, context);
}
public event Action<string, RequestContext>? OnCharPosted;
public void OnCharPostedExternal(string p0, RequestContext p1)
{
}
}
-22
View File
@@ -1,22 +0,0 @@
using Example.Events.Shared;
using mROA.Implementation.Attributes;
namespace Example.Events.Backend;
[SharedObjectSingleton]
public class ChatFactory : IChatFactory
{
private static readonly Dictionary<Guid, IChat> Chats = new();
public IChat GetChat(Guid id)
{
if (Chats.TryGetValue(id, out var chat))
{
return chat;
}
var created = new Chat();
Chats.Add(id, created);
return created;
}
}
@@ -1,18 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<DefineConstants />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Example.Events.Shared\Example.Events.Shared.csproj"/>
</ItemGroup>
</Project>
-53
View File
@@ -1,53 +0,0 @@
using System.Net;
using mROA.Abstract;
using mROA.Cbor;
using mROA.Codegen;
using mROA.Implementation;
using mROA.Implementation.Backend;
using mROA.Implementation.Bootstrap;
using mROA.Implementation.Frontend;
namespace Example.Events.Backend;
class Program
{
static void Main(string[] args)
{
var builder = new FullMixBuilder();
builder.Modules.Add(new CborSerializationToolkit());
builder.Modules.Add(new BackendIdentityGenerator());
builder.UseNetworkGateway(IPEndPoint.Parse("192.168.1.101:6000"), typeof(NextGenerationInteractionModule),
builder.GetModule<IIdentityGenerator>()!);
builder.Modules.Add(new ConnectionHub());
builder.Modules.Add(new HubRequestExtractor(typeof(RequestExtractor)));
builder.UseBasicExecution();
builder.Modules.Add(new CreativeRepresentationModuleProducer(
new IInjectableModule[] { builder.GetModule<ISerializationToolkit>()! },
typeof(RepresentationModule)));
builder.Modules.Add(new RemoteContextRepository());
// builder.UseCollectableContextRepository(typeof(PrinterFactory).Assembly);
builder.Modules.Add(new MultiClientContextRepository(i =>
{
var repo = new ContextRepository();
repo.FillSingletons(typeof(ChatFactory).Assembly);
repo.Inject(builder.Modules.OfType<CreativeRepresentationModuleProducer>().First());
return repo;
}));
builder.SetupMethodsRepository(new CoCodegenMethodRepository());
builder.Modules.Add(new CancellationRepository());
builder.Build();
new RemoteTypeBinder();
TransmissionConfig.RealContextRepository = builder.GetModule<MultiClientContextRepository>();
TransmissionConfig.RemoteEndpointContextRepository = builder.GetModule<RemoteContextRepository>();
TransmissionConfig.OwnershipRepository = new MultiClientOwnershipRepository();
var gateway = builder.GetModule<IGatewayModule>();
gateway.Run();
}
}
@@ -1,18 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
<DefineConstants />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Example.Events.Shared\Example.Events.Shared.csproj"/>
</ItemGroup>
</Project>
-72
View File
@@ -1,72 +0,0 @@
using System.Diagnostics;
using System.Net;
using Example.Events.Shared;
using mROA.Cbor;
using mROA.Codegen;
using mROA.Implementation;
using mROA.Implementation.Backend;
using mROA.Implementation.Bootstrap;
using mROA.Implementation.Frontend;
namespace Example.Events.Client;
class Program
{
static void Main(string[] args)
{
var builder = new FullMixBuilder();
new RemoteTypeBinder();
// builder.Modules.Add(new JsonSerializationToolkit());
builder.Modules.Add(new CborSerializationToolkit());
builder.Modules.Add(new RemoteContextRepository());
builder.Modules.Add(new NextGenerationInteractionModule());
builder.Modules.Add(new RepresentationModule());
builder.Modules.Add(new NetworkFrontendBridge(new IPEndPoint(IPAddress.Parse("95.105.78.72"), 6000)));
builder.Modules.Add(new StaticRepresentationModuleProducer());
builder.Modules.Add(new RequestExtractor());
builder.Modules.Add(new BasicExecutionModule());
builder.Modules.Add(new CoCodegenMethodRepository());
builder.UseCollectableContextRepository();
builder.Modules.Add(new CancellationRepository());
builder.Build();
TransmissionConfig.RealContextRepository = builder.GetModule<ContextRepository>();
TransmissionConfig.RemoteEndpointContextRepository = builder.GetModule<RemoteContextRepository>();
builder.GetModule<NetworkFrontendBridge>()!.Connect();
_ = builder.GetModule<RequestExtractor>()!.StartExtraction();
var chatFactory =
TransmissionConfig.RemoteEndpointContextRepository.GetSingleObject(typeof(IChatFactory), 0) as IChatFactory;
var chat = chatFactory.GetChat(Guid.Empty);
chat.OnCharPosted += (s, context) => { Console.Write(s); };
while (true)
{
var input = Console.ReadKey(true);
if (input.Key == ConsoleKey.Escape)
return;
var symb = "";
if (input.Key == ConsoleKey.Backspace)
{
symb = "\b \b";
}
else
symb = input.KeyChar.ToString();
#if TRACE
Console.Write(symb);
var sw = Stopwatch.StartNew();
chat.PostSymbol(symb);
sw.Stop();
Console.WriteLine($"{sw.ElapsedMilliseconds}ms");
#else
Console.Write(symb);
chat.PostSymbol(symb);
#endif
}
}
}
@@ -1,16 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<LangVersion>9</LangVersion>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\mROA.Cbor\mROA.Cbor.csproj"/>
<ProjectReference Include="..\mROA\mROA.csproj"/>
<ProjectReference Include="..\mROA.Codegen\mROA.Codegen.csproj" OutputItemType="Analyzer" ReferenceOutputAssembly="false"/>
</ItemGroup>
</Project>
-13
View File
@@ -1,13 +0,0 @@
using System;
using mROA.Implementation;
using mROA.Implementation.Attributes;
namespace Example.Events.Shared
{
[SharedObjectInterface]
public partial interface IChat : IShared
{
void PostSymbol(string symbol, RequestContext context = default);
event Action<string, RequestContext> OnCharPosted;
}
}
-12
View File
@@ -1,12 +0,0 @@
using System;
using mROA.Implementation;
using mROA.Implementation.Attributes;
namespace Example.Events.Shared
{
[SharedObjectInterface]
public interface IChatFactory : IShared
{
IChat GetChat(Guid id);
}
}
+80 -44
View File
@@ -26,7 +26,7 @@ namespace mROA.Codegen
private TemplateDocument InterfaceTemplateOriginal; private TemplateDocument InterfaceTemplateOriginal;
private TemplateDocument InterfaceTemplate; private TemplateDocument InterfaceTemplate;
private TemplateDocument BinderTemplate; private TemplateDocument BinderTemplate;
private TemplateDocument MethodInvokerOriginal;
private static Predicate<IParameterSymbol> ParameterFilter = private static Predicate<IParameterSymbol> ParameterFilter =
i => i.Type.Name is "CancellationToken" or "RequestContext"; i => i.Type.Name is "CancellationToken" or "RequestContext";
@@ -36,6 +36,8 @@ namespace mROA.Codegen
public void Initialize(GeneratorInitializationContext context) public void Initialize(GeneratorInitializationContext context)
{ {
MethodRepoTemplate = TemplateReader.FromEmbeddedResource("MethodRepo.cstmpl"); MethodRepoTemplate = TemplateReader.FromEmbeddedResource("MethodRepo.cstmpl");
MethodInvokerOriginal =
((InnerTemplateSection)MethodRepoTemplate["syncInvoker"])?.InnerTemplate;
ClassTemplateOriginal = TemplateReader.FromEmbeddedResource("RemoteEndpoint.cstmpl"); ClassTemplateOriginal = TemplateReader.FromEmbeddedResource("RemoteEndpoint.cstmpl");
BinderTemplate = TemplateReader.FromEmbeddedResource("RemoteTypeBinder.cstmpl"); BinderTemplate = TemplateReader.FromEmbeddedResource("RemoteTypeBinder.cstmpl");
InterfaceTemplateOriginal = TemplateReader.FromEmbeddedResource("PartialInterface.cstmpl"); InterfaceTemplateOriginal = TemplateReader.FromEmbeddedResource("PartialInterface.cstmpl");
@@ -182,9 +184,7 @@ namespace mROA.Codegen
{ {
var methodsStringed = invokers; var methodsStringed = invokers;
// var invokersJoin = string.Join(",\r\n\t\t\t", methodsStringed);
// MethodRepoTemplate.Insert("invoker", invokersJoin);
var coCodegenRepoCode = MethodRepoTemplate.Compile(); var coCodegenRepoCode = MethodRepoTemplate.Compile();
#if !DONT_ADD #if !DONT_ADD
@@ -388,7 +388,7 @@ namespace mROA.Codegen
} }
else else
{ {
var invokerTemplate = (TemplateDocument)((InnerTemplateSection)MethodRepoTemplate["syncInvoker"]).InnerTemplate.Clone(); var invokerTemplate = (TemplateDocument)MethodInvokerOriginal.Clone();
invokerTemplate.AddDefine("isVoid", isVoid.ToString().ToLower()); invokerTemplate.AddDefine("isVoid", isVoid.ToString().ToLower());
invokerTemplate.AddDefine("returnType", isVoid ? "void" : method.ReturnType.ToDisplayString()); invokerTemplate.AddDefine("returnType", isVoid ? "void" : method.ReturnType.ToDisplayString());
invokerTemplate.AddDefine("parametersType", parameterTypes); invokerTemplate.AddDefine("parametersType", parameterTypes);
@@ -467,18 +467,22 @@ namespace mROA.Codegen
} }
} }
var parametersInsert = string.Join(", ", parametersInsertList); var parametersInsert = string.Join(", ", parametersInsertList);
var backend = $@"new mROA.Implementation.MethodInvoker
{level}{{ var funcInvoking = $@"{{
{level} IsVoid = true,
{level} ReturnType = typeof(void),
{level} ParameterTypes = new Type[] {{ {parameterTypes} }},
{level} SuitableType = typeof({baseInterface.ToDisplayString()}),
{level} Invoking = (i, parameters, special) => {{
{level} (i as {baseInterface.ToDisplayString()}).{EventExternalName(eventSymbol)}({parametersInsert}); {level} (i as {baseInterface.ToDisplayString()}).{EventExternalName(eventSymbol)}({parametersInsert});
{level} return null; {level} return null;
{level} }} {level} }}";
{level}}}";
var invokerTemplate = (TemplateDocument)MethodInvokerOriginal.Clone();
invokerTemplate.AddDefine("isVoid", "true");
invokerTemplate.AddDefine("returnType", "void");
invokerTemplate.AddDefine("parametersType", parameterTypes);
invokerTemplate.AddDefine("suitableType", baseInterface.ToDisplayString());
invokerTemplate.AddDefine("funcInvoking", funcInvoking);
var backend = invokerTemplate.Compile();
MethodRepoTemplate.Insert("invoker", backend); MethodRepoTemplate.Insert("invoker", backend);
invokers.Add(backend); invokers.Add(backend);
@@ -503,24 +507,38 @@ namespace mROA.Codegen
var parameterInserts = string.Join(", ", var parameterInserts = string.Join(", ",
method.Parameters.Select( method.Parameters.Select(
p => Caster(p.Type, "parameters[" + method.Parameters.IndexOf(p) + "]"))); p => Caster(p.Type, "parameters[" + method.Parameters.IndexOf(p) + "]")));
backend = $@"new mROA.Implementation.MethodInvoker
{level}{{ var invokerTemplate = (TemplateDocument)MethodInvokerOriginal.Clone();
{level} IsVoid = false, invokerTemplate.AddDefine("isVoid", "false");
{level} ReturnType = typeof({method.ReturnType.ToDisplayString()}), invokerTemplate.AddDefine("returnType", method.ReturnType.ToDisplayString());
{level} ParameterTypes = new Type[] {{ {parameterTypes} }}, invokerTemplate.AddDefine("parametersType", parameterTypes);
{level} SuitableType = typeof({baseInterace.ToDisplayString()}), invokerTemplate.AddDefine("suitableType", baseInterace.ToDisplayString());
{level} Invoking = (i, parameters, _) => (i as {method.ContainingType.ToDisplayString()})[{parameterInserts}], invokerTemplate.AddDefine("funcInvoking", $"(i as {method.ContainingType.ToDisplayString()})[{parameterInserts}]");
{level}}}"; backend = invokerTemplate.Compile();
// backend = $@"new mROA.Implementation.MethodInvoker
// {level}{{
// {level} IsVoid = false,
// {level} ReturnType = typeof({method.ReturnType.ToDisplayString()}),
// {level} ParameterTypes = new Type[] {{ {parameterTypes} }},
// {level} SuitableType = typeof({baseInterace.ToDisplayString()}),
// {level} Invoking = (i, parameters, _) => (i as {method.ContainingType.ToDisplayString()})[{parameterInserts}],
// {level}}}";
} }
else else
{ {
backend = $@"new mROA.Implementation.MethodInvoker var invokerTemplate = (TemplateDocument)MethodInvokerOriginal.Clone();
{level}{{ invokerTemplate.AddDefine("isVoid", "false");
{level} IsVoid = false, invokerTemplate.AddDefine("returnType", method.ReturnType.ToDisplayString());
{level} ReturnType = typeof({method.ReturnType.ToDisplayString()}), invokerTemplate.AddDefine("suitableType", baseInterace.ToDisplayString());
{level} SuitableType = typeof({baseInterace.ToDisplayString()}), invokerTemplate.AddDefine("funcInvoking", $"(i as {method.ContainingType.ToDisplayString()}).{(method.AssociatedSymbol as IPropertySymbol)!.Name}");
{level} Invoking = (i, _, _) => (i as {method.ContainingType.ToDisplayString()}).{(method.AssociatedSymbol as IPropertySymbol)!.Name}, backend = invokerTemplate.Compile();
{level}}}"; // backend = $@"new mROA.Implementation.MethodInvoker
// {level}{{
// {level} IsVoid = false,
// {level} ReturnType = typeof({method.ReturnType.ToDisplayString()}),
// {level} SuitableType = typeof({baseInterace.ToDisplayString()}),
// {level} Invoking = (i, _, _) => (i as {method.ContainingType.ToDisplayString()}).{(method.AssociatedSymbol as IPropertySymbol)!.Name},
// {level}}}";
} }
frontend = frontend =
@@ -541,25 +559,43 @@ namespace mROA.Codegen
var valueInsert = Caster(method.Parameters.Last().Type, var valueInsert = Caster(method.Parameters.Last().Type,
"parameters[" + (method.Parameters.Length - 1) + "]"); "parameters[" + (method.Parameters.Length - 1) + "]");
backend = $@"new mROA.Implementation.MethodInvoker var invokerTemplate = (TemplateDocument)MethodInvokerOriginal.Clone();
{level}{{
{level} IsVoid = true,
{level} ReturnType = typeof({method.ReturnType.ToDisplayString()}), invokerTemplate.AddDefine("isVoid", "true");
{level} ParameterTypes = new Type[] {{ {parameterTypes} }}, invokerTemplate.AddDefine("returnType", method.ReturnType.ToDisplayString());
{level} SuitableType = typeof({baseInterace.ToDisplayString()}), invokerTemplate.AddDefine("parametersType", parameterTypes);
{level} Invoking = (i, parameters, _) => (i as {method.ContainingType.ToDisplayString()})[{parameterInserts}] = {valueInsert}, invokerTemplate.AddDefine("suitableType", baseInterace.ToDisplayString());
{level}}}"; invokerTemplate.AddDefine("funcInvoking", $"(i as {method.ContainingType.ToDisplayString()})[{parameterInserts}] = {valueInsert}");
backend = invokerTemplate.Compile();
// backend = $@"new mROA.Implementation.MethodInvoker
// {level}{{
// {level} IsVoid = true,
// {level} ReturnType = typeof({method.ReturnType.ToDisplayString()}),
// {level} ParameterTypes = new Type[] {{ {parameterTypes} }},
// {level} SuitableType = typeof({baseInterace.ToDisplayString()}),
// {level} Invoking = (i, parameters, _) => (i as {method.ContainingType.ToDisplayString()})[{parameterInserts}] = {valueInsert},
// {level}}}";
} }
else else
{ {
backend = $@"new mROA.Implementation.MethodInvoker var invokerTemplate = (TemplateDocument)MethodInvokerOriginal.Clone();
{level}{{
{level} IsVoid = true, invokerTemplate.AddDefine("isVoid", "true");
{level} ReturnType = typeof({method.ReturnType.ToDisplayString()}), invokerTemplate.AddDefine("returnType", method.ReturnType.ToDisplayString());
{level} ParameterTypes = new Type[] {{ typeof({method.Parameters.First().Type.ToDisplayString()}) }}, invokerTemplate.AddDefine("parametersType", $"typeof({method.Parameters.First().Type.ToDisplayString()})");
{level} SuitableType = typeof({baseInterace.ToDisplayString()}), invokerTemplate.AddDefine("suitableType", baseInterace.ToDisplayString());
{level} Invoking = (i, parameters, _) => (i as {method.ContainingType.ToDisplayString()}).{(method.AssociatedSymbol as IPropertySymbol)!.Name} = {Caster((method.AssociatedSymbol as IPropertySymbol)!.Type, "parameters[0]")}, invokerTemplate.AddDefine("funcInvoking", $"(i as {method.ContainingType.ToDisplayString()}).{(method.AssociatedSymbol as IPropertySymbol)!.Name} = {Caster((method.AssociatedSymbol as IPropertySymbol)!.Type, "parameters[0]")}");
{level}}}"; backend = invokerTemplate.Compile();
// backend = $@"new mROA.Implementation.MethodInvoker
// {level}{{
// {level} IsVoid = true,
// {level} ReturnType = typeof({method.ReturnType.ToDisplayString()}),
// {level} ParameterTypes = new Type[] {{ typeof({method.Parameters.First().Type.ToDisplayString()}) }},
// {level} SuitableType = typeof({baseInterace.ToDisplayString()}),
// {level} Invoking = (i, parameters, _) => (i as {method.ContainingType.ToDisplayString()}).{(method.AssociatedSymbol as IPropertySymbol)!.Name} = {Caster((method.AssociatedSymbol as IPropertySymbol)!.Type, "parameters[0]")},
// {level}}}";
} }
frontend = $"set => CallAsync({index}, new object[] {{ {parametersArray} }}).Wait();"; frontend = $"set => CallAsync({index}, new object[] {{ {parametersArray} }}).Wait();";
-24
View File
@@ -23,14 +23,6 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mROA.Cbor", "mROA.Cbor\mROA
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TotalDemo", "TotalDemo", "{FC4FA752-10A7-4D78-A7C2-9BCD8A81FB5E}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TotalDemo", "TotalDemo", "{FC4FA752-10A7-4D78-A7C2-9BCD8A81FB5E}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Events", "Events", "{032E1288-4D26-4FA5-ABB6-E7D738F319DE}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Events.Shared", "Example.Events.Shared\Example.Events.Shared.csproj", "{6342C7FC-12B4-4BC6-BA25-159B1400D952}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Events.Backend", "Example.Events.Backend\Example.Events.Backend.csproj", "{B63F58B2-8D86-42F3-96A5-470CB449BFD3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Example.Events.Client", "Example.Events.Client\Example.Events.Client.csproj", "{98451C0E-E179-4F5F-9F1A-8B353EDE2EBC}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mROA.CodegenTools", "mROA.CodegenTools\mROA.CodegenTools.csproj", "{2A2821B7-E5C5-443A-9801-9622493594A0}" Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "mROA.CodegenTools", "mROA.CodegenTools\mROA.CodegenTools.csproj", "{2A2821B7-E5C5-443A-9801-9622493594A0}"
EndProject EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Codegen", "Codegen", "{3DB22457-E65B-426F-B3DD-08C615132B3E}" Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Codegen", "Codegen", "{3DB22457-E65B-426F-B3DD-08C615132B3E}"
@@ -75,18 +67,6 @@ Global
{6211E4EA-13FD-4EB1-8E6A-C0173DD0784A}.Debug|Any CPU.Build.0 = Debug|Any CPU {6211E4EA-13FD-4EB1-8E6A-C0173DD0784A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6211E4EA-13FD-4EB1-8E6A-C0173DD0784A}.Release|Any CPU.ActiveCfg = Release|Any CPU {6211E4EA-13FD-4EB1-8E6A-C0173DD0784A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6211E4EA-13FD-4EB1-8E6A-C0173DD0784A}.Release|Any CPU.Build.0 = Release|Any CPU {6211E4EA-13FD-4EB1-8E6A-C0173DD0784A}.Release|Any CPU.Build.0 = Release|Any CPU
{6342C7FC-12B4-4BC6-BA25-159B1400D952}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{6342C7FC-12B4-4BC6-BA25-159B1400D952}.Debug|Any CPU.Build.0 = Debug|Any CPU
{6342C7FC-12B4-4BC6-BA25-159B1400D952}.Release|Any CPU.ActiveCfg = Release|Any CPU
{6342C7FC-12B4-4BC6-BA25-159B1400D952}.Release|Any CPU.Build.0 = Release|Any CPU
{B63F58B2-8D86-42F3-96A5-470CB449BFD3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{B63F58B2-8D86-42F3-96A5-470CB449BFD3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{B63F58B2-8D86-42F3-96A5-470CB449BFD3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{B63F58B2-8D86-42F3-96A5-470CB449BFD3}.Release|Any CPU.Build.0 = Release|Any CPU
{98451C0E-E179-4F5F-9F1A-8B353EDE2EBC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{98451C0E-E179-4F5F-9F1A-8B353EDE2EBC}.Debug|Any CPU.Build.0 = Debug|Any CPU
{98451C0E-E179-4F5F-9F1A-8B353EDE2EBC}.Release|Any CPU.ActiveCfg = Release|Any CPU
{98451C0E-E179-4F5F-9F1A-8B353EDE2EBC}.Release|Any CPU.Build.0 = Release|Any CPU
{2A2821B7-E5C5-443A-9801-9622493594A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {2A2821B7-E5C5-443A-9801-9622493594A0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2A2821B7-E5C5-443A-9801-9622493594A0}.Debug|Any CPU.Build.0 = Debug|Any CPU {2A2821B7-E5C5-443A-9801-9622493594A0}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2A2821B7-E5C5-443A-9801-9622493594A0}.Release|Any CPU.ActiveCfg = Release|Any CPU {2A2821B7-E5C5-443A-9801-9622493594A0}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -104,10 +84,6 @@ Global
{A9BB364E-0BA6-40B9-A293-757BC48EFC06} = {FC4FA752-10A7-4D78-A7C2-9BCD8A81FB5E} {A9BB364E-0BA6-40B9-A293-757BC48EFC06} = {FC4FA752-10A7-4D78-A7C2-9BCD8A81FB5E}
{9BD25A13-3165-47C0-9EAA-5C59EC490E32} = {FC4FA752-10A7-4D78-A7C2-9BCD8A81FB5E} {9BD25A13-3165-47C0-9EAA-5C59EC490E32} = {FC4FA752-10A7-4D78-A7C2-9BCD8A81FB5E}
{E7703F5B-F2A6-4A88-AA57-EBB1E38D533E} = {FC4FA752-10A7-4D78-A7C2-9BCD8A81FB5E} {E7703F5B-F2A6-4A88-AA57-EBB1E38D533E} = {FC4FA752-10A7-4D78-A7C2-9BCD8A81FB5E}
{032E1288-4D26-4FA5-ABB6-E7D738F319DE} = {EAE92F5A-664C-41AB-8811-5885524B5347}
{6342C7FC-12B4-4BC6-BA25-159B1400D952} = {032E1288-4D26-4FA5-ABB6-E7D738F319DE}
{B63F58B2-8D86-42F3-96A5-470CB449BFD3} = {032E1288-4D26-4FA5-ABB6-E7D738F319DE}
{98451C0E-E179-4F5F-9F1A-8B353EDE2EBC} = {032E1288-4D26-4FA5-ABB6-E7D738F319DE}
{3DB22457-E65B-426F-B3DD-08C615132B3E} = {EAE92F5A-664C-41AB-8811-5885524B5347} {3DB22457-E65B-426F-B3DD-08C615132B3E} = {EAE92F5A-664C-41AB-8811-5885524B5347}
{87396E86-D7ED-4556-AB50-F3696FEF9072} = {3DB22457-E65B-426F-B3DD-08C615132B3E} {87396E86-D7ED-4556-AB50-F3696FEF9072} = {3DB22457-E65B-426F-B3DD-08C615132B3E}
EndGlobalSection EndGlobalSection