Skip to content

Commit 29eada3

Browse files
NinjaRocksclaude
andcommitted
Build the MicroFx microservice platform
Implements the feature-model platform described in docs/microfx-design.md: a composition kernel plus 19 built-in cross-cutting features, a RabbitMQ transport adapter, Roslyn analyzers, and a containerised reference service. Composition A feature is an identified, ordered, introspectable capability with a lifecycle. Ordering is declared through a topologically-sorted graph rather than statement position, so middleware order cannot be broken by rearranging Program.cs. Four override grains: disable, configure, replace (with edge inheritance), or substitute a single service. Every built-in registration uses TryAdd, so a service's own registration always wins. Features Kernel (cannot be disabled): core, configuration, observability, health, diagnostics. HTTP: api, validation, ratelimiting, idempotency. Cross-cutting: security, multitenancy, resilience, caching, persistence, messaging, jobs, featureflags, storage, serviceclients. Messaging Transport-neutral. The envelope, handler pipeline, outbox, inbox, dedupe, retry policy, and tracing are written once; a transport maps destinations and moves bytes. Capability negotiation is explicit: the core emulates a missing convenience and reports it, and refuses to start rather than silently weaken a correctness guarantee such as at-least-once delivery. Persistence EF Core built in (Relational only, no driver) with ambient transactions, a transactional outbox with a lease-based relay, a durable inbox, audit and cross-tenant write guards, and a migration gate that asserts rather than migrates. Verification 258 tests passing, stable across repeated runs. Release build clean with TreatWarningsAsErrors across six projects. The headline test kills the host between commit and publish and asserts the event still arrives on restart. Not verified The RabbitMQ adapter and the container image have never been executed -- Docker was unavailable throughout. CI now covers both. See docs/implementation-status.md section 8 before deploying. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 90730eb commit 29eada3

137 files changed

Lines changed: 26408 additions & 89 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.editorconfig

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
root = true
2+
3+
[*]
4+
charset = utf-8
5+
end_of_line = crlf
6+
indent_style = space
7+
indent_size = 4
8+
insert_final_newline = true
9+
trim_trailing_whitespace = true
10+
11+
[*.{json,yml,yaml,props,targets,csproj}]
12+
indent_size = 2
13+
14+
[*.md]
15+
trim_trailing_whitespace = false
16+
17+
[*.cs]
18+
# Usings
19+
dotnet_sort_system_directives_first = true
20+
csharp_using_directive_placement = outside_namespace:warning
21+
22+
# Modern C# — file-scoped namespaces keep one level of indentation off every file
23+
csharp_style_namespace_declarations = file_scoped:warning
24+
csharp_style_expression_bodied_methods = when_on_single_line:suggestion
25+
csharp_style_prefer_primary_constructors = true:suggestion
26+
csharp_prefer_braces = true:suggestion
27+
28+
# 'var' only where the type is apparent on the right-hand side
29+
csharp_style_var_for_built_in_types = false:suggestion
30+
csharp_style_var_when_type_is_apparent = true:suggestion
31+
csharp_style_var_elsewhere = false:suggestion
32+
33+
# Naming
34+
dotnet_naming_rule.private_fields_underscore.severity = warning
35+
dotnet_naming_rule.private_fields_underscore.symbols = private_fields
36+
dotnet_naming_rule.private_fields_underscore.style = underscore_camel
37+
dotnet_naming_symbols.private_fields.applicable_kinds = field
38+
dotnet_naming_symbols.private_fields.applicable_accessibilities = private
39+
dotnet_naming_style.underscore_camel.required_prefix = _
40+
dotnet_naming_style.underscore_camel.capitalization = camel_case
41+
42+
# Correctness rules the platform relies on
43+
dotnet_diagnostic.CA2007.severity = none # library code has no sync context to capture
44+
dotnet_diagnostic.CA1848.severity = suggestion # LoggerMessage enforced by convention, phased in
45+
dotnet_diagnostic.CA1062.severity = warning # validate public arguments
46+
dotnet_diagnostic.CA2100.severity = error # SQL injection review
47+
dotnet_diagnostic.CA3075.severity = error # insecure DTD processing
48+
dotnet_diagnostic.CA5350.severity = error # weak crypto
49+
dotnet_diagnostic.CA5351.severity = error # broken crypto
50+
dotnet_diagnostic.CA5394.severity = error # insecure randomness
51+
dotnet_diagnostic.IDE0005.severity = warning # unnecessary usings

.github/workflows/master.yml

Lines changed: 76 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,90 @@
1-
# This workflow will build a .NET project
2-
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-net
3-
4-
name: Buid Master
1+
name: Build Master
52

63
on:
74
push:
85
branches: [ "master" ]
6+
pull_request:
7+
branches: [ "master" ]
8+
9+
permissions:
10+
contents: read
911

1012
jobs:
1113
build:
12-
1314
runs-on: ubuntu-latest
1415

1516
steps:
16-
- uses: actions/checkout@v3
17+
- uses: actions/checkout@v4
18+
1719
- name: Setup .NET
18-
uses: actions/setup-dotnet@v3
20+
uses: actions/setup-dotnet@v4
1921
with:
20-
dotnet-version: 6.0.x
21-
- name: Restore dependencies
22-
run: dotnet restore
22+
global-json-file: global.json
23+
24+
# Locked mode fails rather than silently resolving a different version than the lock file
25+
# records. A build that quietly drifts its dependency graph is not reproducible.
26+
- name: Restore
27+
run: dotnet restore --locked-mode
28+
2329
- name: Build
24-
run: dotnet build --no-restore
30+
run: dotnet build --no-restore --configuration Release
31+
2532
- name: Test
26-
run: dotnet test --no-build --verbosity normal
33+
run: dotnet test --no-build --configuration Release --verbosity normal --collect:"XPlat Code Coverage"
34+
35+
# The core must build and test with no cloud SDK on its graph. Asserted rather than assumed,
36+
# because a transitive reference is easy to acquire and invisible until someone looks.
37+
- name: Assert cloud-neutral core
38+
run: |
39+
if dotnet list src/MicroFx/MicroFx.csproj package --include-transitive \
40+
| grep -Ei '\b(AWSSDK|Azure\.|Google\.Cloud)'; then
41+
echo "::error::A cloud SDK reached the MicroFx core dependency graph."
42+
exit 1
43+
fi
44+
echo "Core is cloud-neutral."
45+
46+
# The adapter exists to keep RabbitMQ.Client off the graph of every service that does not use
47+
# messaging. If it leaked into the core, that separation would have bought nothing.
48+
- name: Assert transport isolation
49+
run: |
50+
if dotnet list src/MicroFx/MicroFx.csproj package --include-transitive \
51+
| grep -Ei 'RabbitMQ\.Client'; then
52+
echo "::error::RabbitMQ.Client reached the MicroFx core dependency graph."
53+
exit 1
54+
fi
55+
echo "Transport is isolated to its adapter."
56+
57+
- name: Build the reference container
58+
run: docker build -f src/MicroFx.Host.Service/Dockerfile -t microfx-host-service:ci .
59+
60+
# Runs the messaging suite against a real broker. The in-process lane proves the semantics; this
61+
# proves the adapter honours the capabilities it advertises.
62+
broker-conformance:
63+
runs-on: ubuntu-latest
64+
65+
services:
66+
rabbitmq:
67+
image: rabbitmq:4-management-alpine
68+
ports:
69+
- 5672:5672
70+
options: >-
71+
--health-cmd "rabbitmq-diagnostics -q check_running"
72+
--health-interval 10s
73+
--health-timeout 5s
74+
--health-retries 10
75+
76+
steps:
77+
- uses: actions/checkout@v4
78+
79+
- name: Setup .NET
80+
uses: actions/setup-dotnet@v4
81+
with:
82+
global-json-file: global.json
83+
84+
- name: Restore
85+
run: dotnet restore --locked-mode
86+
87+
- name: Transport conformance against RabbitMQ
88+
env:
89+
MICROFX_RABBITMQ_URI: amqp://guest:guest@localhost:5672/
90+
run: dotnet test test/MicroFx.Messaging.RabbitMq.Tests --configuration Release

.gitignore

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -396,3 +396,9 @@ FodyWeavers.xsd
396396

397397
# JetBrains Rider
398398
*.sln.iml
399+
400+
# Local SQLite databases created by the reference host's zero-configuration default.
401+
# The schema is created on startup, so nothing here is worth version-controlling.
402+
*.db
403+
*.db-shm
404+
*.db-wal

Directory.Build.props

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<Project>
2+
3+
<PropertyGroup>
4+
<TargetFramework>net10.0</TargetFramework>
5+
<LangVersion>latest</LangVersion>
6+
<Nullable>enable</Nullable>
7+
<ImplicitUsings>enable</ImplicitUsings>
8+
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
9+
<AnalysisLevel>latest-recommended</AnalysisLevel>
10+
<EnforceCodeStyleInBuild>true</EnforceCodeStyleInBuild>
11+
<Deterministic>true</Deterministic>
12+
<InvariantGlobalization>true</InvariantGlobalization>
13+
</PropertyGroup>
14+
15+
<PropertyGroup>
16+
<Product>MicroFx</Product>
17+
<Authors>NinjaRocks</Authors>
18+
<Company>NinjaRocks</Company>
19+
<PackageLicenseExpression>MIT</PackageLicenseExpression>
20+
<PackageProjectUrl>https://github.com/NinjaRocks/MicroFx</PackageProjectUrl>
21+
<RepositoryUrl>https://github.com/NinjaRocks/MicroFx</RepositoryUrl>
22+
<RepositoryType>git</RepositoryType>
23+
<VersionPrefix>0.1.0</VersionPrefix>
24+
</PropertyGroup>
25+
26+
<!-- Source-linked, symbol-published builds so a stack trace from a consumer is navigable. -->
27+
<PropertyGroup Condition="'$(Configuration)' == 'Release'">
28+
<PublishRepositoryUrl>true</PublishRepositoryUrl>
29+
<EmbedUntrackedSources>true</EmbedUntrackedSources>
30+
<IncludeSymbols>true</IncludeSymbols>
31+
<SymbolPackageFormat>snupkg</SymbolPackageFormat>
32+
</PropertyGroup>
33+
34+
</Project>

Directory.Packages.props

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
<Project>
2+
3+
<PropertyGroup>
4+
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
5+
<CentralPackageTransitivePinningEnabled>true</CentralPackageTransitivePinningEnabled>
6+
</PropertyGroup>
7+
8+
<ItemGroup Label="Runtime">
9+
<PackageVersion Include="Microsoft.Extensions.Hosting" Version="10.0.11" />
10+
<PackageVersion Include="Microsoft.Extensions.Hosting.Abstractions" Version="10.0.11" />
11+
<PackageVersion Include="Microsoft.Extensions.Configuration.Binder" Version="10.0.11" />
12+
<PackageVersion Include="Microsoft.Extensions.Diagnostics.HealthChecks" Version="10.0.11" />
13+
<PackageVersion Include="Microsoft.Extensions.Options.DataAnnotations" Version="10.0.11" />
14+
<PackageVersion Include="Microsoft.Extensions.DependencyModel" Version="10.0.11" />
15+
</ItemGroup>
16+
17+
<ItemGroup Label="Web">
18+
<PackageVersion Include="Asp.Versioning.Http" Version="10.2.2" />
19+
<PackageVersion Include="Microsoft.AspNetCore.OpenApi" Version="10.0.11" />
20+
<PackageVersion Include="Scalar.AspNetCore" Version="2.16.20" />
21+
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="10.0.11" />
22+
</ItemGroup>
23+
24+
<ItemGroup Label="Persistence">
25+
<!-- Relational only: no database driver reaches the core. A service supplies its own EF
26+
provider, so changing database engine needs no MicroFx package. -->
27+
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="10.0.11" />
28+
<PackageVersion Include="Microsoft.EntityFrameworkCore.Sqlite" Version="10.0.11" />
29+
</ItemGroup>
30+
31+
<ItemGroup Label="Platform">
32+
<PackageVersion Include="FluentValidation" Version="12.1.1" />
33+
<PackageVersion Include="FluentValidation.DependencyInjectionExtensions" Version="12.1.1" />
34+
<PackageVersion Include="Microsoft.Extensions.Http.Resilience" Version="10.9.0" />
35+
<PackageVersion Include="Microsoft.Extensions.Caching.Hybrid" Version="10.9.0" />
36+
<PackageVersion Include="Cronos" Version="0.13.0" />
37+
<PackageVersion Include="OpenFeature" Version="2.14.1" />
38+
</ItemGroup>
39+
40+
<ItemGroup Label="Adapters">
41+
<PackageVersion Include="RabbitMQ.Client" Version="7.2.2" />
42+
</ItemGroup>
43+
44+
<ItemGroup Label="Analyzers">
45+
<PackageVersion Include="Microsoft.CodeAnalysis.CSharp" Version="4.14.0" />
46+
<PackageVersion Include="Microsoft.CodeAnalysis.Analyzers" Version="4.14.0" />
47+
</ItemGroup>
48+
49+
<ItemGroup Label="OpenTelemetry">
50+
<PackageVersion Include="OpenTelemetry.Extensions.Hosting" Version="1.17.0" />
51+
<PackageVersion Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.17.0" />
52+
<PackageVersion Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.17.0" />
53+
<PackageVersion Include="OpenTelemetry.Instrumentation.Http" Version="1.17.0" />
54+
<PackageVersion Include="OpenTelemetry.Instrumentation.Runtime" Version="1.17.0" />
55+
</ItemGroup>
56+
57+
<ItemGroup Label="Test">
58+
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.9.0" />
59+
<PackageVersion Include="NUnit" Version="4.6.1" />
60+
<PackageVersion Include="NUnit3TestAdapter" Version="6.2.0" />
61+
<PackageVersion Include="NUnit.Analyzers" Version="4.14.0" />
62+
<PackageVersion Include="coverlet.collector" Version="10.0.1" />
63+
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="10.0.11" />
64+
<PackageVersion Include="Microsoft.Extensions.TimeProvider.Testing" Version="10.9.0" />
65+
</ItemGroup>
66+
67+
</Project>

MicroFx.sln

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,20 +23,110 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = ".github", ".github", "{067F
2323
.github\workflows\master.yml = .github\workflows\master.yml
2424
EndProjectSection
2525
EndProject
26+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MicroFx.Host.Service", "src\MicroFx.Host.Service\MicroFx.Host.Service.csproj", "{0094B9F1-CA10-43B4-8397-C435CCCBED61}"
27+
EndProject
28+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MicroFx.Host.Service.E2E.Tests", "test\MicroFx.Host.Service.E2E.Tests\MicroFx.Host.Service.E2E.Tests.csproj", "{955EB936-0929-46C1-A6D6-65BE8D4851FB}"
29+
EndProject
30+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MicroFx.Messaging.RabbitMq", "src\MicroFx.Messaging.RabbitMq\MicroFx.Messaging.RabbitMq.csproj", "{02F19DCF-517C-47E7-8570-0B4CB3821C73}"
31+
EndProject
32+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MicroFx.Analyzers", "src\MicroFx.Analyzers\MicroFx.Analyzers.csproj", "{AAADAF6D-BF9C-4476-97B1-9B0DD94344FF}"
33+
EndProject
34+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MicroFx.Messaging.RabbitMq.Tests", "test\MicroFx.Messaging.RabbitMq.Tests\MicroFx.Messaging.RabbitMq.Tests.csproj", "{4EB2082E-DA25-4537-A8EA-FFEEE8DE670B}"
35+
EndProject
2636
Global
2737
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2838
Debug|Any CPU = Debug|Any CPU
39+
Debug|x64 = Debug|x64
40+
Debug|x86 = Debug|x86
2941
Release|Any CPU = Release|Any CPU
42+
Release|x64 = Release|x64
43+
Release|x86 = Release|x86
3044
EndGlobalSection
3145
GlobalSection(ProjectConfigurationPlatforms) = postSolution
3246
{A02C1E77-E7F9-4BF5-8372-3BBCC110655B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
3347
{A02C1E77-E7F9-4BF5-8372-3BBCC110655B}.Debug|Any CPU.Build.0 = Debug|Any CPU
48+
{A02C1E77-E7F9-4BF5-8372-3BBCC110655B}.Debug|x64.ActiveCfg = Debug|Any CPU
49+
{A02C1E77-E7F9-4BF5-8372-3BBCC110655B}.Debug|x64.Build.0 = Debug|Any CPU
50+
{A02C1E77-E7F9-4BF5-8372-3BBCC110655B}.Debug|x86.ActiveCfg = Debug|Any CPU
51+
{A02C1E77-E7F9-4BF5-8372-3BBCC110655B}.Debug|x86.Build.0 = Debug|Any CPU
3452
{A02C1E77-E7F9-4BF5-8372-3BBCC110655B}.Release|Any CPU.ActiveCfg = Release|Any CPU
3553
{A02C1E77-E7F9-4BF5-8372-3BBCC110655B}.Release|Any CPU.Build.0 = Release|Any CPU
54+
{A02C1E77-E7F9-4BF5-8372-3BBCC110655B}.Release|x64.ActiveCfg = Release|Any CPU
55+
{A02C1E77-E7F9-4BF5-8372-3BBCC110655B}.Release|x64.Build.0 = Release|Any CPU
56+
{A02C1E77-E7F9-4BF5-8372-3BBCC110655B}.Release|x86.ActiveCfg = Release|Any CPU
57+
{A02C1E77-E7F9-4BF5-8372-3BBCC110655B}.Release|x86.Build.0 = Release|Any CPU
3658
{B1684EF5-A37A-42C3-B44E-B55DC035B322}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
3759
{B1684EF5-A37A-42C3-B44E-B55DC035B322}.Debug|Any CPU.Build.0 = Debug|Any CPU
60+
{B1684EF5-A37A-42C3-B44E-B55DC035B322}.Debug|x64.ActiveCfg = Debug|Any CPU
61+
{B1684EF5-A37A-42C3-B44E-B55DC035B322}.Debug|x64.Build.0 = Debug|Any CPU
62+
{B1684EF5-A37A-42C3-B44E-B55DC035B322}.Debug|x86.ActiveCfg = Debug|Any CPU
63+
{B1684EF5-A37A-42C3-B44E-B55DC035B322}.Debug|x86.Build.0 = Debug|Any CPU
3864
{B1684EF5-A37A-42C3-B44E-B55DC035B322}.Release|Any CPU.ActiveCfg = Release|Any CPU
3965
{B1684EF5-A37A-42C3-B44E-B55DC035B322}.Release|Any CPU.Build.0 = Release|Any CPU
66+
{B1684EF5-A37A-42C3-B44E-B55DC035B322}.Release|x64.ActiveCfg = Release|Any CPU
67+
{B1684EF5-A37A-42C3-B44E-B55DC035B322}.Release|x64.Build.0 = Release|Any CPU
68+
{B1684EF5-A37A-42C3-B44E-B55DC035B322}.Release|x86.ActiveCfg = Release|Any CPU
69+
{B1684EF5-A37A-42C3-B44E-B55DC035B322}.Release|x86.Build.0 = Release|Any CPU
70+
{0094B9F1-CA10-43B4-8397-C435CCCBED61}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
71+
{0094B9F1-CA10-43B4-8397-C435CCCBED61}.Debug|Any CPU.Build.0 = Debug|Any CPU
72+
{0094B9F1-CA10-43B4-8397-C435CCCBED61}.Debug|x64.ActiveCfg = Debug|Any CPU
73+
{0094B9F1-CA10-43B4-8397-C435CCCBED61}.Debug|x64.Build.0 = Debug|Any CPU
74+
{0094B9F1-CA10-43B4-8397-C435CCCBED61}.Debug|x86.ActiveCfg = Debug|Any CPU
75+
{0094B9F1-CA10-43B4-8397-C435CCCBED61}.Debug|x86.Build.0 = Debug|Any CPU
76+
{0094B9F1-CA10-43B4-8397-C435CCCBED61}.Release|Any CPU.ActiveCfg = Release|Any CPU
77+
{0094B9F1-CA10-43B4-8397-C435CCCBED61}.Release|Any CPU.Build.0 = Release|Any CPU
78+
{0094B9F1-CA10-43B4-8397-C435CCCBED61}.Release|x64.ActiveCfg = Release|Any CPU
79+
{0094B9F1-CA10-43B4-8397-C435CCCBED61}.Release|x64.Build.0 = Release|Any CPU
80+
{0094B9F1-CA10-43B4-8397-C435CCCBED61}.Release|x86.ActiveCfg = Release|Any CPU
81+
{0094B9F1-CA10-43B4-8397-C435CCCBED61}.Release|x86.Build.0 = Release|Any CPU
82+
{955EB936-0929-46C1-A6D6-65BE8D4851FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
83+
{955EB936-0929-46C1-A6D6-65BE8D4851FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
84+
{955EB936-0929-46C1-A6D6-65BE8D4851FB}.Debug|x64.ActiveCfg = Debug|Any CPU
85+
{955EB936-0929-46C1-A6D6-65BE8D4851FB}.Debug|x64.Build.0 = Debug|Any CPU
86+
{955EB936-0929-46C1-A6D6-65BE8D4851FB}.Debug|x86.ActiveCfg = Debug|Any CPU
87+
{955EB936-0929-46C1-A6D6-65BE8D4851FB}.Debug|x86.Build.0 = Debug|Any CPU
88+
{955EB936-0929-46C1-A6D6-65BE8D4851FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
89+
{955EB936-0929-46C1-A6D6-65BE8D4851FB}.Release|Any CPU.Build.0 = Release|Any CPU
90+
{955EB936-0929-46C1-A6D6-65BE8D4851FB}.Release|x64.ActiveCfg = Release|Any CPU
91+
{955EB936-0929-46C1-A6D6-65BE8D4851FB}.Release|x64.Build.0 = Release|Any CPU
92+
{955EB936-0929-46C1-A6D6-65BE8D4851FB}.Release|x86.ActiveCfg = Release|Any CPU
93+
{955EB936-0929-46C1-A6D6-65BE8D4851FB}.Release|x86.Build.0 = Release|Any CPU
94+
{02F19DCF-517C-47E7-8570-0B4CB3821C73}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
95+
{02F19DCF-517C-47E7-8570-0B4CB3821C73}.Debug|Any CPU.Build.0 = Debug|Any CPU
96+
{02F19DCF-517C-47E7-8570-0B4CB3821C73}.Debug|x64.ActiveCfg = Debug|Any CPU
97+
{02F19DCF-517C-47E7-8570-0B4CB3821C73}.Debug|x64.Build.0 = Debug|Any CPU
98+
{02F19DCF-517C-47E7-8570-0B4CB3821C73}.Debug|x86.ActiveCfg = Debug|Any CPU
99+
{02F19DCF-517C-47E7-8570-0B4CB3821C73}.Debug|x86.Build.0 = Debug|Any CPU
100+
{02F19DCF-517C-47E7-8570-0B4CB3821C73}.Release|Any CPU.ActiveCfg = Release|Any CPU
101+
{02F19DCF-517C-47E7-8570-0B4CB3821C73}.Release|Any CPU.Build.0 = Release|Any CPU
102+
{02F19DCF-517C-47E7-8570-0B4CB3821C73}.Release|x64.ActiveCfg = Release|Any CPU
103+
{02F19DCF-517C-47E7-8570-0B4CB3821C73}.Release|x64.Build.0 = Release|Any CPU
104+
{02F19DCF-517C-47E7-8570-0B4CB3821C73}.Release|x86.ActiveCfg = Release|Any CPU
105+
{02F19DCF-517C-47E7-8570-0B4CB3821C73}.Release|x86.Build.0 = Release|Any CPU
106+
{AAADAF6D-BF9C-4476-97B1-9B0DD94344FF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
107+
{AAADAF6D-BF9C-4476-97B1-9B0DD94344FF}.Debug|Any CPU.Build.0 = Debug|Any CPU
108+
{AAADAF6D-BF9C-4476-97B1-9B0DD94344FF}.Debug|x64.ActiveCfg = Debug|Any CPU
109+
{AAADAF6D-BF9C-4476-97B1-9B0DD94344FF}.Debug|x64.Build.0 = Debug|Any CPU
110+
{AAADAF6D-BF9C-4476-97B1-9B0DD94344FF}.Debug|x86.ActiveCfg = Debug|Any CPU
111+
{AAADAF6D-BF9C-4476-97B1-9B0DD94344FF}.Debug|x86.Build.0 = Debug|Any CPU
112+
{AAADAF6D-BF9C-4476-97B1-9B0DD94344FF}.Release|Any CPU.ActiveCfg = Release|Any CPU
113+
{AAADAF6D-BF9C-4476-97B1-9B0DD94344FF}.Release|Any CPU.Build.0 = Release|Any CPU
114+
{AAADAF6D-BF9C-4476-97B1-9B0DD94344FF}.Release|x64.ActiveCfg = Release|Any CPU
115+
{AAADAF6D-BF9C-4476-97B1-9B0DD94344FF}.Release|x64.Build.0 = Release|Any CPU
116+
{AAADAF6D-BF9C-4476-97B1-9B0DD94344FF}.Release|x86.ActiveCfg = Release|Any CPU
117+
{AAADAF6D-BF9C-4476-97B1-9B0DD94344FF}.Release|x86.Build.0 = Release|Any CPU
118+
{4EB2082E-DA25-4537-A8EA-FFEEE8DE670B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
119+
{4EB2082E-DA25-4537-A8EA-FFEEE8DE670B}.Debug|Any CPU.Build.0 = Debug|Any CPU
120+
{4EB2082E-DA25-4537-A8EA-FFEEE8DE670B}.Debug|x64.ActiveCfg = Debug|Any CPU
121+
{4EB2082E-DA25-4537-A8EA-FFEEE8DE670B}.Debug|x64.Build.0 = Debug|Any CPU
122+
{4EB2082E-DA25-4537-A8EA-FFEEE8DE670B}.Debug|x86.ActiveCfg = Debug|Any CPU
123+
{4EB2082E-DA25-4537-A8EA-FFEEE8DE670B}.Debug|x86.Build.0 = Debug|Any CPU
124+
{4EB2082E-DA25-4537-A8EA-FFEEE8DE670B}.Release|Any CPU.ActiveCfg = Release|Any CPU
125+
{4EB2082E-DA25-4537-A8EA-FFEEE8DE670B}.Release|Any CPU.Build.0 = Release|Any CPU
126+
{4EB2082E-DA25-4537-A8EA-FFEEE8DE670B}.Release|x64.ActiveCfg = Release|Any CPU
127+
{4EB2082E-DA25-4537-A8EA-FFEEE8DE670B}.Release|x64.Build.0 = Release|Any CPU
128+
{4EB2082E-DA25-4537-A8EA-FFEEE8DE670B}.Release|x86.ActiveCfg = Release|Any CPU
129+
{4EB2082E-DA25-4537-A8EA-FFEEE8DE670B}.Release|x86.Build.0 = Release|Any CPU
40130
EndGlobalSection
41131
GlobalSection(SolutionProperties) = preSolution
42132
HideSolutionNode = FALSE
@@ -45,6 +135,11 @@ Global
45135
{A02C1E77-E7F9-4BF5-8372-3BBCC110655B} = {428C54A8-1D13-40B9-B9B7-23B52A38F92D}
46136
{B1684EF5-A37A-42C3-B44E-B55DC035B322} = {20A19668-38C4-49D8-8498-96B692955072}
47137
{067F0714-9510-425B-8C55-8BE9EDDF36EA} = {836E2035-43D2-4C3D-8031-D4F1E12F1748}
138+
{0094B9F1-CA10-43B4-8397-C435CCCBED61} = {428C54A8-1D13-40B9-B9B7-23B52A38F92D}
139+
{955EB936-0929-46C1-A6D6-65BE8D4851FB} = {20A19668-38C4-49D8-8498-96B692955072}
140+
{02F19DCF-517C-47E7-8570-0B4CB3821C73} = {428C54A8-1D13-40B9-B9B7-23B52A38F92D}
141+
{AAADAF6D-BF9C-4476-97B1-9B0DD94344FF} = {428C54A8-1D13-40B9-B9B7-23B52A38F92D}
142+
{4EB2082E-DA25-4537-A8EA-FFEEE8DE670B} = {20A19668-38C4-49D8-8498-96B692955072}
48143
EndGlobalSection
49144
GlobalSection(ExtensibilityGlobals) = postSolution
50145
SolutionGuid = {A8A9F502-B291-42C3-BBAA-7EAF3B394022}

0 commit comments

Comments
 (0)