mirror of
https://github.com/aaronpo97/the-biergarten-app.git
synced 2026-07-16 09:37:23 +00:00
1 line
43 KiB
XML
1 line
43 KiB
XML
<?plantuml 1.2026.2?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="DESCRIPTION" height="889px" preserveAspectRatio="none" style="width:2443px;height:889px;background:#FFFFFF;" version="1.1" viewBox="0 0 2443 889" width="2443px" zoomAndPan="magnify"><title>The Biergarten App - Vertical Slice Architecture</title><defs/><g><g class="title" data-source-line="6"><text fill="#000000" font-family="Arial" font-size="22" font-weight="bold" lengthAdjust="spacing" textLength="496.3643" x="968.9442" y="35.6357">The Biergarten App - Vertical Slice Architecture</text></g><!--cluster API.Core (thin host)--><g class="cluster" data-qualified-name="API.Core .thin host." data-source-line="8" id="ent0002"><rect fill="#E3F2FD" height="150.7" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="514" x="569.06" y="58.2979"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="131.4346" x="760.3427" y="73.4297">API.Core (thin host)</text></g><!--cluster Feature Slices--><g class="cluster" data-qualified-name="Feature Slices" data-source-line="20" id="ent0007"><rect fill="#F3E5F5" height="135.74" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="1245" x="94.06" y="271.9979"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="94.9375" x="669.0913" y="287.1297">Feature Slices</text></g><!--cluster Shared--><g class="cluster" data-qualified-name="Shared" data-source-line="39" id="ent0018"><rect fill="#FCE4EC" height="135.74" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="682" x="17.06" y="470.7379"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="47.4619" x="334.329" y="485.8697">Shared</text></g><!--cluster Infrastructure Layer--><g class="cluster" data-qualified-name="Infrastructure Layer" data-source-line="51" id="ent0024"><rect fill="#FFF3E0" height="97.1" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="1098" x="915.06" y="490.0579"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="132.2686" x="1397.9257" y="505.1897">Infrastructure Layer</text></g><!--cluster Domain Layer--><g class="cluster" data-qualified-name="Domain Layer" data-source-line="59" id="ent0030"><rect fill="#E8F5E9" height="120.79" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="520" x="711.06" y="642.6379"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="92.5859" x="924.767" y="657.7697">Domain Layer</text></g><!--cluster SQL Server--><g class="cluster" data-qualified-name="SQL Server" data-source-line="70" id="ent0036"><path d="M1373.06,649.4779 C1373.06,639.4779 1467.06,639.4779 1467.06,639.4779 C1467.06,639.4779 1561.06,639.4779 1561.06,649.4779 L1561.06,862.5279 C1561.06,872.5279 1467.06,872.5279 1467.06,872.5279 C1467.06,872.5279 1373.06,872.5279 1373.06,862.5279 L1373.06,649.4779" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1373.06,649.4779 C1373.06,659.4779 1467.06,659.4779 1467.06,659.4779 C1467.06,659.4779 1561.06,659.4779 1561.06,649.4779" fill="none" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="14" font-weight="bold" lengthAdjust="spacing" textLength="76.2617" x="1428.9291" y="674.6097">SQL Server</text></g><!--entity API--><g class="entity" data-qualified-name="API.Core .thin host..API" data-source-line="9" id="ent0003"><rect fill="#FFFFFF" height="62.1973" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="223.6201" x="585.25" y="112.0479"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="788.8701" y="117.0479"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="786.8701" y="119.0479"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="786.8701" y="123.0479"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="56.7998" x="600.25" y="145.1797">API.Core</text><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="183.6201" x="600.25" y="161.2783">ASP.NET Core Web API host</text></g><g class="entity" data-qualified-name="API.Core .thin host..GMN4" data-source-line="11" id="ent0005"><path d="M843.39,93.2979 L843.39,139.1479 L809.18,143.1479 L843.39,147.1479 L843.39,192.9902 A0,0 0 0 0 843.39,192.9902 L1066.7215,192.9902 A0,0 0 0 0 1066.7215,192.9902 L1066.7215,103.2979 L1056.7215,93.2979 L843.39,93.2979 A0,0 0 0 0 843.39,93.2979" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1056.7215,93.2979 L1056.7215,103.2979 L1066.7215,103.2979 L1056.7215,93.2979" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="139.4263" x="849.39" y="110.4917">- Program.cs wiring only</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="181.7334" x="849.39" y="125.4404">- MediatR + AddApplicationPart</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="140.8926" x="856.6136" y="140.3892">per Features.* assembly</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="202.3315" x="849.39" y="155.3379">- Swagger/OpenAPI, health checks</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="133.6499" x="849.39" y="170.2866">- JWT auth middleware</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="132.9517" x="849.39" y="185.2354">- Global exception filter</text></g><!--entity AuthSlice--><g class="entity" data-qualified-name="Feature Slices.AuthSlice" data-source-line="21" id="ent0008"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="127.9375" x="948.09" y="326.3179"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1056.0275" y="331.3179"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1054.0275" y="333.3179"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1054.0275" y="337.3179"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="87.9375" x="963.09" y="359.4497">Features.Auth</text></g><!--entity BrewerySlice--><g class="entity" data-qualified-name="Feature Slices.BrewerySlice" data-source-line="22" id="ent0009"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="161.3789" x="506.37" y="326.3179"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="647.7489" y="331.3179"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="645.7489" y="333.3179"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="645.7489" y="337.3179"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="121.3789" x="521.37" y="359.4497">Features.Breweries</text></g><!--entity UserSlice--><g class="entity" data-qualified-name="Feature Slices.UserSlice" data-source-line="23" id="ent0010"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="210.4131" x="702.85" y="326.3179"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="893.2631" y="331.3179"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="891.2631" y="333.3179"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="891.2631" y="337.3179"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="170.4131" x="717.85" y="359.4497">Features.UserManagement</text></g><!--entity EmailsSlice--><g class="entity" data-qualified-name="Feature Slices.EmailsSlice" data-source-line="24" id="ent0011"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="141.1445" x="110.49" y="326.3179"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="231.6345" y="331.3179"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="229.6345" y="333.3179"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="229.6345" y="337.3179"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="101.1445" x="125.49" y="359.4497">Features.Emails</text></g><g class="entity" data-qualified-name="Feature Slices.GMN12" data-source-line="26" id="ent0013"><path d="M1111.37,306.9979 L1111.37,345.3679 L1076.52,349.3679 L1111.37,353.3679 L1111.37,391.7415 A0,0 0 0 0 1111.37,391.7415 L1322.7489,391.7415 A0,0 0 0 0 1322.7489,391.7415 L1322.7489,316.9979 L1312.7489,306.9979 L1111.37,306.9979 A0,0 0 0 0 1111.37,306.9979" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1312.7489,306.9979 L1312.7489,316.9979 L1322.7489,316.9979 L1312.7489,306.9979" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="140.8926" x="1117.37" y="324.1917">Each slice owns its own:</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="170.498" x="1117.37" y="339.1404">- Controller (HTTP endpoints)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="190.3789" x="1117.37" y="354.0892">- Commands/Queries + Handlers</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="65.749" x="1117.37" y="369.0379">- Validators</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="70.0781" x="1117.37" y="383.9866">- Repository</text></g><g class="entity" data-qualified-name="Feature Slices.GMN15" data-source-line="33" id="ent0016"><path d="M286.55,321.9479 L286.55,345.3679 L251.83,349.3679 L286.55,353.3679 L286.55,376.794 A0,0 0 0 0 286.55,376.794 L471.5607,376.794 A0,0 0 0 0 471.5607,376.794 L471.5607,331.9479 L461.5607,321.9479 L286.55,321.9479 A0,0 0 0 0 286.55,321.9479" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M461.5607,321.9479 L461.5607,331.9479 L471.5607,331.9479 L461.5607,321.9479" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="157.5171" x="292.55" y="339.1417">No controller - invoked only</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="164.0107" x="292.55" y="354.0904">via MediatR commands sent</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="95.3608" x="292.55" y="369.0392">from other slices</text></g><!--entity SharedContracts--><g class="entity" data-qualified-name="Shared.SharedContracts" data-source-line="40" id="ent0019"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="148.9443" x="534.59" y="525.0579"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="663.5343" y="530.0579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="661.5343" y="532.0579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="661.5343" y="536.0579"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="108.9443" x="549.59" y="558.1897">Shared.Contracts</text></g><!--entity SharedApp--><g class="entity" data-qualified-name="Shared.SharedApp" data-source-line="41" id="ent0020"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="157.5234" x="33.3" y="525.0579"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="170.8234" y="530.0579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="168.8234" y="532.0579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="168.8234" y="536.0579"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="117.5234" x="48.3" y="558.1897">Shared.Application</text></g><g class="entity" data-qualified-name="Shared.GMN21" data-source-line="43" id="ent0022"><path d="M226.11,505.7379 L226.11,544.1079 L190.99,548.1079 L226.11,552.1079 L226.11,590.4815 A0,0 0 0 0 226.11,590.4815 L500.0006,590.4815 A0,0 0 0 0 500.0006,590.4815 L500.0006,515.7379 L490.0006,505.7379 L226.11,505.7379 A0,0 0 0 0 226.11,505.7379" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M490.0006,505.7379 L490.0006,515.7379 L500.0006,515.7379 L490.0006,505.7379" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="116.3462" x="232.11" y="522.9317">- ValidationBehavior</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="105.4917" x="239.3336" y="537.8804">(MediatR pipeline)</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="174.0908" x="232.11" y="552.8292">- Cross-slice email commands</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="200.1416" x="239.3336" y="567.7779">(SendRegistrationEmailCommand,</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="245.667" x="239.3336" y="582.7266">SendResendConfirmationEmailCommand)</text></g><!--entity Sql--><g class="entity" data-qualified-name="Infrastructure Layer.Sql" data-source-line="52" id="ent0025"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="146.5996" x="1393.76" y="525.0579"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1520.3596" y="530.0579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1518.3596" y="532.0579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1518.3596" y="536.0579"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="106.5996" x="1408.76" y="558.1897">Infrastructure.Sql</text></g><!--entity JWT--><g class="entity" data-qualified-name="Infrastructure Layer.JWT" data-source-line="53" id="ent0026"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="147.3652" x="1575.38" y="525.0579"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1702.7452" y="530.0579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1700.7452" y="532.0579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1700.7452" y="536.0579"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="107.3652" x="1590.38" y="558.1897">Infrastructure.Jwt</text></g><!--entity PwdHash--><g class="entity" data-qualified-name="Infrastructure Layer.PwdHash" data-source-line="54" id="ent0027"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="239.1992" x="1757.46" y="525.0579"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1976.6592" y="530.0579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1974.6592" y="532.0579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1974.6592" y="536.0579"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="199.1992" x="1772.46" y="558.1897">Infrastructure.PasswordHashing</text></g><!--entity Email--><g class="entity" data-qualified-name="Infrastructure Layer.Email" data-source-line="55" id="ent0028"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="161.3721" x="931.37" y="525.0579"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1072.7421" y="530.0579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1070.7421" y="532.0579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1070.7421" y="536.0579"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="121.3721" x="946.37" y="558.1897">Infrastructure.Email</text></g><!--entity EmailTemplates--><g class="entity" data-qualified-name="Infrastructure Layer.EmailTemplates" data-source-line="56" id="ent0029"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="230.6201" x="1127.75" y="525.0579"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1338.3701" y="530.0579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1336.3701" y="532.0579"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1336.3701" y="536.0579"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="190.6201" x="1142.75" y="558.1897">Infrastructure.Email.Templates</text></g><!--entity Domain--><g class="entity" data-qualified-name="Domain Layer.Domain" data-source-line="60" id="ent0031"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="138.041" x="922.04" y="689.4779"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1040.081" y="694.4779"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1038.081" y="696.4779"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1038.081" y="700.4779"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="98.041" x="937.04" y="722.6097">Domain.Entities</text></g><!--entity DomainExceptions--><g class="entity" data-qualified-name="Domain Layer.DomainExceptions" data-source-line="61" id="ent0032"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="160.6133" x="726.75" y="689.4779"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="867.3633" y="694.4779"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="865.3633" y="696.4779"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="865.3633" y="700.4779"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="120.6133" x="741.75" y="722.6097">Domain.Exceptions</text></g><g class="entity" data-qualified-name="Domain Layer.GMN33" data-source-line="63" id="ent0034"><path d="M1094.71,677.6379 L1094.71,708.5279 L1060.57,712.5279 L1094.71,716.5279 L1094.71,747.4328 A0,0 0 0 0 1094.71,747.4328 L1215.4063,747.4328 A0,0 0 0 0 1215.4063,747.4328 L1215.4063,687.6379 L1205.4063,677.6379 L1094.71,677.6379 A0,0 0 0 0 1094.71,677.6379" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M1205.4063,677.6379 L1205.4063,687.6379 L1215.4063,687.6379 L1205.4063,677.6379" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="82.3608" x="1100.71" y="694.8317">- UserAccount</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="94.6436" x="1100.71" y="709.7804">- UserCredential</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="99.6963" x="1100.71" y="724.7292">- UserVerification</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="81.6309" x="1100.71" y="739.6779">- BreweryPost</text></g><!--entity SP--><g class="entity" data-qualified-name="SQL Server.SP" data-source-line="71" id="ent0037"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="156.7305" x="1388.69" y="689.4779"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1525.4205" y="694.4779"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1523.4205" y="696.4779"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1523.4205" y="700.4779"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="116.7305" x="1403.69" y="722.6097">Stored Procedures</text></g><!--entity Tables--><g class="entity" data-qualified-name="SQL Server.Tables" data-source-line="72" id="ent0038"><rect fill="#FFFFFF" height="46.0986" rx="2.5" ry="2.5" style="stroke:#000000;stroke-width:1;" width="82.0205" x="1426.05" y="810.4279"/><rect fill="#FFFFFF" height="10" style="stroke:#000000;stroke-width:1;" width="15" x="1488.0705" y="815.4279"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1486.0705" y="817.4279"/><rect fill="#FFFFFF" height="2" style="stroke:#000000;stroke-width:1;" width="4" x="1486.0705" y="821.4279"/><text fill="#000000" font-family="Arial" font-size="14" lengthAdjust="spacing" textLength="42.0205" x="1441.05" y="843.5597">Tables</text></g><g class="entity" data-qualified-name="GMN66" data-source-line="114" id="ent0067"><path d="M2032.01,520.6879 L2032.01,575.534 L2162.1135,575.534 L2162.1135,530.6879 L2152.1135,520.6879 L2032.01,520.6879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2152.1135,520.6879 L2152.1135,530.6879 L2162.1135,530.6879 L2152.1135,520.6879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="109.1035" x="2038.01" y="537.8817">SQL-first approach</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="80.9263" x="2038.01" y="552.8304">All queries via</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="104.7808" x="2038.01" y="567.7792">stored procedures</text></g><g class="entity" data-qualified-name="GMN69" data-source-line="120" id="ent0070"><path d="M2267.86,520.6879 L2267.86,575.534 L2436.2526,575.534 L2436.2526,530.6879 L2426.2526,520.6879 L2267.86,520.6879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><path d="M2426.2526,520.6879 L2426.2526,530.6879 L2436.2526,530.6879 L2426.2526,520.6879" fill="#FFFFFF" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="122.8335" x="2273.86" y="537.8817">No Features.* project</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="138.0234" x="2273.86" y="552.8304">ever references another</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="147.3926" x="2273.86" y="567.7792">Features.* project directly</text></g><!--link API to AuthSlice--><g class="link" data-entity-1="ent0003" data-entity-2="ent0008" data-link-type="dependency" data-source-line="76" id="lnk39"><path d="M741.04,174.5879 C765.1,189.7679 796.05,206.9779 826.06,216.9979 C852,225.6579 862.18,213.6479 887.06,224.9979 C910.84,235.8379 912.22,245.8879 931.06,263.9979 C952.29,284.3979 971.3713,304.3667 987.4613,321.6467" fill="none" id="API-to-AuthSlice" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="991.55,326.0379,988.3443,316.7253,988.1427,322.3786,982.4895,322.177,991.55,326.0379" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="110.5698" x="924.19" y="238.1917">AddApplicationPart</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="90.6826" x="934.1336" y="253.1404">+ MediatR scan</text></g><!--link API to BrewerySlice--><g class="link" data-entity-1="ent0003" data-entity-2="ent0009" data-link-type="dependency" data-source-line="77" id="lnk40"><path d="M670.43,174.5779 C658.56,189.1579 645.04,207.2679 635.06,224.9979 C616.24,258.4379 603.3314,295.0215 595.3914,320.4015" fill="none" id="API-to-BrewerySlice" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="593.6,326.1279,600.1047,318.7327,595.0929,321.3559,592.4696,316.3441,593.6,326.1279" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="110.5698" x="636.06" y="238.1917">AddApplicationPart</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="90.6826" x="646.0036" y="253.1404">+ MediatR scan</text></g><!--link API to UserSlice--><g class="link" data-entity-1="ent0003" data-entity-2="ent0010" data-link-type="dependency" data-source-line="78" id="lnk41"><path d="M718.99,174.5379 C729.3,189.3979 741.4,207.7679 751.06,224.9979 C770.21,259.1579 786.1779,295.3512 796.6679,320.4712" fill="none" id="API-to-UserSlice" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="798.98,326.0079,799.203,316.1615,797.0533,321.394,791.8208,319.2443,798.98,326.0079" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="110.5698" x="767.66" y="238.1917">AddApplicationPart</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="90.6826" x="777.6036" y="253.1404">+ MediatR scan</text></g><!--link API to EmailsSlice--><g class="link" data-entity-1="ent0003" data-entity-2="ent0011" data-link-type="dependency" data-source-line="79" id="lnk42"><path d="M584.85,160.0779 C494.93,176.3779 367.91,207.5679 269.06,263.9979 C240.94,280.0479 218.8941,302.4832 202.5741,321.6132" fill="none" id="API-to-EmailsSlice" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="198.68,326.1779,207.5643,321.927,201.9251,322.374,201.4781,316.7348,198.68,326.1779" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="106.939" x="346.17" y="238.1917">MediatR scan only</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="80.1963" x="359.5413" y="253.1404">(no controller)</text></g><!--link AuthSlice to Sql--><g class="link" data-entity-1="ent0008" data-entity-2="ent0025" data-link-type="dependency" data-source-line="81" id="lnk43"><path d="M1033.64,372.7179 C1049.07,387.3179 1071.11,405.5179 1094.06,415.7379 C1210.13,467.4479 1262,406.7379 1376.06,462.7379 C1405.84,477.3579 1428.8344,500.3459 1445.5344,519.9959" fill="none" id="AuthSlice-to-Sql" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1449.42,524.5679,1446.6396,515.1196,1446.182,520.7579,1440.5437,520.3003,1449.42,524.5679" style="stroke:#000000;stroke-width:1;"/></g><!--link AuthSlice to JWT--><g class="link" data-entity-1="ent0008" data-entity-2="ent0026" data-link-type="dependency" data-source-line="82" id="lnk44"><path d="M1032.29,372.6079 C1047.6,387.7779 1070.04,406.6879 1094.06,415.7379 C1128.83,428.8479 1224.05,420.4279 1261.06,423.7379 C1393.66,435.5979 1437.56,406.1379 1558.06,462.7379 C1588.29,476.9379 1611.4211,500.265 1628.0111,520.105" fill="none" id="AuthSlice-to-JWT" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1631.86,524.7079,1629.1553,515.2377,1628.6526,520.8721,1623.0181,520.3695,1631.86,524.7079" style="stroke:#000000;stroke-width:1;"/></g><!--link AuthSlice to PwdHash--><g class="link" data-entity-1="ent0008" data-entity-2="ent0027" data-link-type="dependency" data-source-line="83" id="lnk45"><path d="M1032.23,372.7779 C1047.51,388.0279 1069.93,406.9679 1094.06,415.7379 C1128.64,428.3079 1388.37,421.0279 1425.06,423.7379 C1565.75,434.1179 1606.95,416.0179 1740.06,462.7379 C1780.78,477.0379 1817.4422,501.2183 1843.9222,520.9883" fill="none" id="AuthSlice-to-PwdHash" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1848.73,524.5779,1843.9113,515.9883,1844.7235,521.5866,1839.1252,522.3988,1848.73,524.5779" style="stroke:#000000;stroke-width:1;"/></g><!--link AuthSlice to SharedContracts--><g class="link" data-entity-1="ent0008" data-entity-2="ent0019" data-link-type="dependency" data-source-line="84" id="lnk46"><path d="M991.79,372.8879 C976.69,387.9779 954.68,406.6779 931.06,415.7379 C899.89,427.6879 812.55,412.6779 781.06,423.7379 C720.04,445.1679 665.9482,491.2925 635.3982,520.6225" fill="none" id="AuthSlice-to-SharedContracts" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="631.07,524.7779,640.3325,521.4303,634.6768,521.3151,634.792,515.6594,631.07,524.7779" style="stroke:#000000;stroke-width:1;"/></g><!--link AuthSlice to SharedApp--><g class="link" data-entity-1="ent0008" data-entity-2="ent0020" data-link-type="dependency" data-source-line="85" id="lnk47"><path d="M992.21,372.8279 C977.15,388.0979 955.01,407.0479 931.06,415.7379 C906.72,424.5679 490.71,420.2279 465.06,423.7379 C410.91,431.1479 400.05,446.2179 346.06,454.7379 C315.94,459.4979 237.3,451.2279 209.06,462.7379 C176.82,475.8879 151.8021,499.8234 134.0921,520.0534" fill="none" id="AuthSlice-to-SharedApp" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="130.14,524.5679,139.0779,520.4309,133.4334,520.8058,133.0585,515.1614,130.14,524.5679" style="stroke:#000000;stroke-width:1;"/></g><!--link AuthSlice to SharedApp--><g class="link" data-entity-1="ent0008" data-entity-2="ent0020" data-link-type="dependency" data-source-line="100" id="lnk57"><path d="M992.2,372.8179 C977.14,388.0779 955,407.0179 931.06,415.7379 C887.83,431.4779 562.29,415.2979 517.06,423.7379 C477.53,431.1179 471.53,447.0379 432.06,454.7379 C407.73,459.4879 232.12,453.6379 209.06,462.7379 C176.46,475.5979 151.2965,499.8811 133.6665,520.2511" fill="none" id="AuthSlice-to-SharedApp-1" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="129.74,524.7879,138.6543,520.6004,133.0121,521.0072,132.6053,515.365,129.74,524.7879" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="34.6899" x="596.8154" y="436.9317">sends</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="192.2007" x="518.06" y="451.8804">SendRegistrationEmailCommand</text></g><!--link BrewerySlice to Sql--><g class="link" data-entity-1="ent0009" data-entity-2="ent0025" data-link-type="dependency" data-source-line="87" id="lnk48"><path d="M612.01,372.7279 C630.67,387.9579 657.62,406.8879 685.06,415.7379 C732.25,430.9679 861.07,407.9179 908.06,423.7379 C930.73,431.3779 929.33,447.2979 952.06,454.7379 C996.84,469.3979 1332.36,445.1179 1376.06,462.7379 C1407.43,475.3879 1430.8108,499.5655 1447.0908,519.9955" fill="none" id="BrewerySlice-to-Sql" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1450.83,524.6879,1448.3494,515.1565,1447.714,520.7775,1442.0929,520.1421,1450.83,524.6879" style="stroke:#000000;stroke-width:1;"/></g><!--link BrewerySlice to SharedContracts--><g class="link" data-entity-1="ent0009" data-entity-2="ent0019" data-link-type="dependency" data-source-line="88" id="lnk49"><path d="M560.61,372.8479 C541.86,387.5079 515.45,405.7279 489.06,415.7379 C476.9,420.3579 439.61,413.9279 431.06,423.7379 C422.01,434.1279 421.78,444.5579 431.06,454.7379 C443.99,468.9279 499.51,454.9579 517.06,462.7379 C547.96,476.4479 571.5303,500.1674 588.2203,520.2074" fill="none" id="BrewerySlice-to-SharedContracts" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="592.06,524.8179,589.374,515.3423,588.8602,520.9758,583.2267,520.462,592.06,524.8179" style="stroke:#000000;stroke-width:1;"/></g><!--link BrewerySlice to SharedApp--><g class="link" data-entity-1="ent0009" data-entity-2="ent0020" data-link-type="dependency" data-source-line="89" id="lnk50"><path d="M562.09,372.6579 C543.41,387.8479 516.47,406.7679 489.06,415.7379 C450.79,428.2579 346.16,410.7279 308.06,423.7379 C285.42,431.4679 286.28,445.8879 264.06,454.7379 C241.11,463.8779 231.51,452.4379 209.06,462.7379 C177.62,477.1679 152.7219,500.6044 134.7919,520.3644" fill="none" id="BrewerySlice-to-SharedApp" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="130.76,524.8079,139.7701,520.8307,134.1199,521.105,133.8456,515.4548,130.76,524.8079" style="stroke:#000000;stroke-width:1;"/></g><!--link UserSlice to Sql--><g class="link" data-entity-1="ent0010" data-entity-2="ent0025" data-link-type="dependency" data-source-line="91" id="lnk51"><path d="M844,372.7879 C867.91,386.8679 900.44,404.4279 931.06,415.7379 C1005.81,443.3579 1026.99,444.8479 1106.06,454.7379 C1135.84,458.4679 1348.28,451.3679 1376.06,462.7379 C1407.36,475.5579 1430.7524,499.7022 1447.0524,520.0822" fill="none" id="UserSlice-to-Sql" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1450.8,524.7679,1448.3024,515.241,1447.677,520.8631,1442.0548,520.2378,1450.8,524.7679" style="stroke:#000000;stroke-width:1;"/></g><!--link UserSlice to SharedContracts--><g class="link" data-entity-1="ent0010" data-entity-2="ent0019" data-link-type="dependency" data-source-line="92" id="lnk52"><path d="M775.58,372.8879 C751.71,388.0779 717.87,406.9079 685.06,415.7379 C673.63,418.8179 480.27,415.2079 472.06,423.7379 C462.5,433.6579 463.21,444.1779 472.06,454.7379 C485.11,470.3079 498.85,453.7379 517.06,462.7379 C546.98,477.5279 570.2654,500.5194 587.2054,520.1094" fill="none" id="UserSlice-to-SharedContracts" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="591.13,524.6479,588.2688,515.2237,587.8595,520.8658,582.2175,520.4565,591.13,524.6479" style="stroke:#000000;stroke-width:1;"/></g><!--link UserSlice to SharedApp--><g class="link" data-entity-1="ent0010" data-entity-2="ent0020" data-link-type="dependency" data-source-line="93" id="lnk53"><path d="M775.87,372.8579 C752.01,388.1479 718.05,407.0979 685.06,415.7379 C648.93,425.1979 384.52,412.0379 349.06,423.7379 C326.34,431.2379 327.54,446.5679 305.06,454.7379 C264.82,469.3579 248.5,446.0879 209.06,462.7379 C176.98,476.2779 151.9528,500.1516 134.1928,520.2516" fill="none" id="UserSlice-to-SharedApp" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="130.22,524.7479,139.1768,520.652,133.5307,521.0009,133.1817,515.3549,130.22,524.7479" style="stroke:#000000;stroke-width:1;"/></g><!--link EmailsSlice to Email--><g class="link" data-entity-1="ent0011" data-entity-2="ent0028" data-link-type="dependency" data-source-line="95" id="lnk54"><path d="M203,372.8479 C219.54,388.1279 243.66,407.0779 269.06,415.7379 C315.45,431.5479 662.06,413.8579 710.06,423.7379 C807.97,443.8879 909.1172,492.1097 965.7872,521.8497" fill="none" id="EmailsSlice-to-Email" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="971.1,524.6379,964.9895,516.9137,966.6726,522.3144,961.272,523.9975,971.1,524.6379" style="stroke:#000000;stroke-width:1;"/></g><!--link EmailsSlice to EmailTemplates--><g class="link" data-entity-1="ent0011" data-entity-2="ent0029" data-link-type="dependency" data-source-line="96" id="lnk55"><path d="M203,372.8679 C219.53,388.1579 243.65,407.1179 269.06,415.7379 C296.31,424.9879 758.52,419.9979 787.06,423.7379 C843.39,431.1179 854.83,446.6679 911.06,454.7379 C954.87,461.0279 1067.81,449.5479 1110.06,462.7379 C1151.04,475.5379 1187.1025,500.61 1212.4825,521" fill="none" id="EmailsSlice-to-EmailTemplates" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1217.16,524.7579,1212.649,516.0028,1213.2621,521.6263,1207.6386,522.2394,1217.16,524.7579" style="stroke:#000000;stroke-width:1;"/></g><!--link EmailsSlice to SharedApp--><g class="link" data-entity-1="ent0011" data-entity-2="ent0020" data-link-type="dependency" data-source-line="97" id="lnk56"><path d="M110.1,367.6979 C80.98,378.6779 50.14,396.1979 33.06,423.7379 C11,459.2879 45.2334,496.3389 75.8634,520.9589" fill="none" id="EmailsSlice-to-SharedApp" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="80.54,524.7179,76.0311,515.9617,76.6429,521.5854,71.0192,522.1971,80.54,524.7179" style="stroke:#000000;stroke-width:1;"/></g><!--link EmailsSlice to SharedApp--><g class="link" data-entity-1="ent0011" data-entity-2="ent0020" data-link-type="dependency" data-source-line="101" id="lnk58"><path d="M123.13,372.7679 C101.16,384.4379 78.47,401.0979 66.06,423.7379 C47.71,457.2179 69.198,494.7804 88.908,520.1404" fill="none" id="EmailsSlice-to-SharedApp-1" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/><polygon fill="#000000" points="92.59,524.8779,90.2253,515.3171,89.5217,520.93,83.9088,520.2264,92.59,524.8779" style="stroke:#000000;stroke-width:1;"/><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="45.5381" x="140.3913" y="436.9317">handles</text><text fill="#000000" font-family="Arial" font-size="13" lengthAdjust="spacing" textLength="192.2007" x="67.06" y="451.8804">SendRegistrationEmailCommand</text></g><!--link Sql to SP--><g class="link" data-entity-1="ent0025" data-entity-2="ent0037" data-link-type="dependency" data-source-line="103" id="lnk59"><path d="M1467.06,571.3579 C1467.06,602.2879 1467.06,651.9679 1467.06,683.0379" fill="none" id="Sql-to-SP" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1467.06,689.0379,1471.06,680.0379,1467.06,684.0379,1463.06,680.0379,1467.06,689.0379" style="stroke:#000000;stroke-width:1;"/></g><!--link Sql to Domain--><g class="link" data-entity-1="ent0025" data-entity-2="ent0031" data-link-type="dependency" data-source-line="104" id="lnk60"><path d="M1443.76,571.6179 C1426.54,586.7079 1401.74,605.4079 1376.06,614.4779 C1313.32,636.6679 1138.28,605.3679 1077.06,631.4779 C1048.35,643.7279 1027.0296,665.2761 1011.4696,684.3761" fill="none" id="Sql-to-Domain" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1007.68,689.0279,1016.4656,684.5766,1010.838,685.1514,1010.2632,679.5238,1007.68,689.0279" style="stroke:#000000;stroke-width:1;"/></g><!--link SP to Tables--><g class="link" data-entity-1="ent0037" data-entity-2="ent0038" data-link-type="dependency" data-source-line="105" id="lnk61"><path d="M1467.06,735.9079 C1467.06,757.1679 1467.06,782.9779 1467.06,804.2079" fill="none" id="SP-to-Tables" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1467.06,810.2079,1471.06,801.2079,1467.06,805.2079,1463.06,801.2079,1467.06,810.2079" style="stroke:#000000;stroke-width:1;"/></g><!--link AuthSlice to Domain--><g class="link" data-entity-1="ent0008" data-entity-2="ent0031" data-link-type="dependency" data-source-line="107" id="lnk62"><path d="M983.8,372.7579 C960.35,393.2879 928.72,426.0179 915.06,462.7379 C891.55,525.9479 893.07,550.7279 915.06,614.4779 C925.18,643.8179 943.9809,666.8117 962.0509,684.9117" fill="none" id="AuthSlice-to-Domain" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="966.29,689.1579,962.7621,679.9625,962.7574,685.6194,957.1005,685.6147,966.29,689.1579" style="stroke:#000000;stroke-width:1;"/></g><!--link BrewerySlice to Domain--><g class="link" data-entity-1="ent0009" data-entity-2="ent0031" data-link-type="dependency" data-source-line="108" id="lnk63"><path d="M614.65,372.6879 C633.48,386.8979 659.55,404.6579 685.06,415.7379 C699.3,421.9179 705.71,415.8179 719.06,423.7379 C816.98,481.8379 810.96,532.5979 890.06,614.4779 C915.57,640.8879 941.7421,665.8157 962.5121,685.1857" fill="none" id="BrewerySlice-to-Domain" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="966.9,689.2779,963.0462,680.2143,963.2434,685.8677,957.59,686.0649,966.9,689.2779" style="stroke:#000000;stroke-width:1;"/></g><!--link UserSlice to Domain--><g class="link" data-entity-1="ent0010" data-entity-2="ent0031" data-link-type="dependency" data-source-line="109" id="lnk64"><path d="M840.55,372.8879 C864.41,388.0779 898.25,406.9079 931.06,415.7379 C998.11,433.7979 2131.89,412.7279 2180.06,462.7379 C2226.84,511.3179 2227.38,566.4279 2180.06,614.4779 C2158.56,636.3179 1105.49,620.0479 1077.06,631.4779 C1047.92,643.2079 1026.4688,665.1131 1011.0088,684.4331" fill="none" id="UserSlice-to-Domain" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="1007.26,689.1179,1016.0063,684.5899,1010.384,685.2139,1009.76,679.5916,1007.26,689.1179" style="stroke:#000000;stroke-width:1;"/></g><!--link AuthSlice to DomainExceptions--><g class="link" data-entity-1="ent0008" data-entity-2="ent0032" data-link-type="dependency" data-source-line="110" id="lnk65"><path d="M988.36,372.8479 C972.95,386.5879 951.9,403.7679 931.06,415.7379 C922.4,420.7179 917.5,417.0779 910.06,423.7379 C829.62,495.7979 812.4057,629.163 808.5557,683.293" fill="none" id="AuthSlice-to-DomainExceptions" style="stroke:#000000;stroke-width:1;"/><polygon fill="#000000" points="808.13,689.2779,812.7584,680.5843,808.4847,684.2905,804.7786,680.0167,808.13,689.2779" style="stroke:#000000;stroke-width:1;"/></g><!--link GMN66 to Sql--><g class="link" data-entity-1="ent0067" data-entity-2="ent0025" data-link-type="association" data-source-line="114" id="lnk68"><path d="M2080.78,520.3679 C2063.46,493.8979 2033.36,455.6779 1995.56,439.2379 C1952.76,420.6279 1618.66,421.3479 1575.56,439.2379 C1533.91,456.5279 1499.97,498.4379 1481.71,524.9279" fill="none" id="GMN66-Sql" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><!--link AuthSlice to GMN69--><g class="link" data-entity-1="ent0008" data-entity-2="ent0070" data-link-type="association" data-source-line="120" id="lnk71"><path d="M1032.21,372.8379 C1047.48,388.1179 1069.9,407.0679 1094.06,415.7379 C1120.16,425.1079 1565.35,422.6879 1593.06,423.7379 C1737.22,429.2279 2105.8,412.5879 2241.06,462.7379 C2274.2,475.0279 2305.64,500.7379 2326.54,520.5679" fill="none" id="AuthSlice-GMN69" style="stroke:#000000;stroke-width:1;stroke-dasharray:7,7;"/></g><?plantuml-src bLPHSzis37xNhy3IXoPhxEwQvMxBG-ySLrxQQpCrzjg7PG-q14jSA58XwNY-tVxxG5AMQDdPhdwI0H04FW0V-9sji4Pe1ECoCGzSDaop6fOiVoYrMijYgeJIy6BcVv55WIks5dQcfBrbv66YEHEHlY4FhCIvtGe4ZRbbiXIO99PR4YmgX6kEkcJQeeH9qy08lg2sF6S2veBdpcDUSKidrvhEjVxWP9Az7q-LHZYr5PTGAMFFJk15UZ5xCti7VoS0l-zCxkLaderlqmNu0rzn2QJoH_u0PjmVCfVAKeIyh2oeLIi32YVJggHCnhc13TTSbg2asBRAJrXmPk_W5KoAWiAdY9dbIcQKa3S1Q53339aBtuo_f_iCrilEmNp3oXBrwryRb7JdELJ8XAqWhp1_CAtHXwyBO6kIrhme16uO8H4qlmYr9AJmhnmRTo-ikB2eIOkoy2ab_qIWjN44P0t1DRj8BsUN0Quko0bT5O2X3s-wfxxMk47DqNYRy6zxQFQRGVs9IRgtHXc0Tg93mxHcN0HduNDdCgX850n0ol8AZ6yGjP46k3Nkuwh5PKhzg9KGXFtfpMAHEJWQnQKrPvr5NJDPcDUVrpuPAk4D_QSJEzI_CC4BPbKdkCD66Kw2ROplCCxz701k5UHzD2FWyaazOD5tqHDdNH_bRLHW23ElNMbLWwBnr25TyrnjvnMrHU5gEar_JAUXfa4uzd2mt0QKWx2JHNPH1qUM93t8CjP4OD71QwpO4rUwRV_JNMeDRr1mYLq1j39c54g83hCk-Tt9EULvXoKt5AVpx95jwtRU6WKRGilbi-AwFh0yUmwmztAb6VbUUsg1ZsoB-iHJt4NwGu1ltsGyVnG1baTnHFjX4xgSflM8DgF1toXTt313V5LwospZ_nwnzWdq8_6SnNY1DN6snMXyEj5UikyKwMINPFhJx3BzEIGPLEDK4YVlfZh8OksEOM9zBppeZyw1AxMR-qcUqnwnaMHA3KHTxlP5BoJovwks1Ljnop0PqVMWbDHmRCcCQ_xF7waLz9DBBZG-ZIaD6P5tZeMZcL2upEaMR2bQGVXqlbxIU0j_BTMdCOdR4EFnsvvsuEe8nz_BLzticfp9xbXCYzzsiYF9RpiMqGuTZ4qyqzpBKnaJqLcIz9cDHczzJ-zBN1_lItRzEZWve9DZMaSKoHuckpiFXGDtpnXuZprMEtS3oS3NCQrt5AFdL67gZahx-Hgg8tyl_TD6IOGyeZdQF-W2eLfUmG7fX-gG-jmrEEaRhVwaTmyzcrQeKT8-wQ5r9U_keu8x1ZJtyhyeSo_UuVdAxxx_yv0Gn27LhFji9tsU-N_jG0sQeBKvA6KhtozBAppc8I8SWlXMkIfutX6u2cl9CpEnmOXsWI4G6mAHdWead0W1Z-skfvLB4XCuekau8kd89NXTAclTzjr_VD12ZzvpRP4SCn7xzBKomAHVswGvD8U2kySmlG2wA_y5?></g></svg> |