This repository has been archived on 2024-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
gameservicewarden/src/GameServiceWarden.Core/UMLSketch.drawio

561 lines
88 KiB
Plaintext
Raw Normal View History

<mxfile host="65bd71144e" pages="2">
<diagram id="LHR7ubqCPd17_LyHkaH9" name="Structure">
<mxGraphModel dx="574" dy="229" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
<root>
<mxCell id="0"/>
<mxCell id="1" parent="0"/>
<mxCell id="dmd0HlDYcxYugIlahWj0-10" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=0;exitDx=0;exitDy=0;dashed=1;endArrow=block;endFill=0;sketch=1;" parent="1" source="dmd0HlDYcxYugIlahWj0-5" target="dmd0HlDYcxYugIlahWj0-9" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="dmd0HlDYcxYugIlahWj0-5" value="GameServiceInfo" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;sketch=1;" parent="1" vertex="1">
<mxGeometry x="762" y="1030" width="401" height="386" as="geometry">
<mxRectangle x="762" y="1030" width="130" height="26" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="dmd0HlDYcxYugIlahWj0-6" value="- serviceName: string&#10;- controlLock: object&#10;- state: ServiceState&#10;- service: IGameService&#10;- serviceConsoleStream: Stream&#10;- moduleName: string&#10;- assemblyName: string&#10;- Dictionary&lt;string, IConfigurable&gt;&#10;- disposed: bool" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;sketch=1;" parent="dmd0HlDYcxYugIlahWj0-5" vertex="1">
<mxGeometry y="26" width="401" height="140" as="geometry"/>
</mxCell>
<mxCell id="dmd0HlDYcxYugIlahWj0-7" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;sketch=1;" parent="dmd0HlDYcxYugIlahWj0-5" vertex="1">
<mxGeometry y="166" width="401" height="8" as="geometry"/>
</mxCell>
<mxCell id="dmd0HlDYcxYugIlahWj0-8" value="+ Start(): void&#10;+ Stop(): void&#10;+ GetConfigurableOptions(): ISet&lt;string&gt;&#10;+ SetConfigurableValue(configurationName: string, value: string): bool&#10;+ GetConfigurableValue(configurationName: string): string&#10;+ GetServiceState(): ServiceState&#10;+ getModuleName(): string //Implemented as property&#10;+ GetassemblyName(): string&#10;+ SetServiceName(name: string): void // Implemented as property&#10;+ GetServiceName(): string // Implemented as property&#10;+ GetServiceConsoleStream(): Stream // Implemented as property&#10;- OnServiceStateChange(curr: ServiceState, prev: ServiceState): void&#10;# Dispose(disposing: bool): void&#10;+ Dispose(): voide" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;sketch=1;" parent="dmd0HlDYcxYugIlahWj0-5" vertex="1">
<mxGeometry y="174" width="401" height="212" as="geometry"/>
</mxCell>
<mxCell id="dmd0HlDYcxYugIlahWj0-9" value="«interface»&lt;br&gt;&lt;span&gt;IDisposable&lt;/span&gt;" style="html=1;sketch=1;" parent="1" vertex="1">
<mxGeometry x="1250" y="980" width="111" height="50" as="geometry"/>
</mxCell>
<mxCell id="dmd0HlDYcxYugIlahWj0-15" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="1" source="dmd0HlDYcxYugIlahWj0-11" target="dmd0HlDYcxYugIlahWj0-5" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="wwlaSBDwwZOn0hO83bWU-6" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;sketch=1;" parent="1" source="dmd0HlDYcxYugIlahWj0-11" target="wwlaSBDwwZOn0hO83bWU-2" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="wwlaSBDwwZOn0hO83bWU-18" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="1" source="dmd0HlDYcxYugIlahWj0-11" target="wwlaSBDwwZOn0hO83bWU-12" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="fdKXkHfjRXYybK0fejAG-2" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="1" source="dmd0HlDYcxYugIlahWj0-11" target="zFFzFwxISwJASp9ezwbr-1" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="SI3d9EEbteElKQB4Ic5T-1" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="1" source="dmd0HlDYcxYugIlahWj0-11" target="fdKXkHfjRXYybK0fejAG-9" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="SI3d9EEbteElKQB4Ic5T-14" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="1" source="dmd0HlDYcxYugIlahWj0-11" target="SI3d9EEbteElKQB4Ic5T-10" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="dmd0HlDYcxYugIlahWj0-11" value="GameServiceManager" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;sketch=1;" parent="1" vertex="1">
<mxGeometry x="669.5" y="640" width="561" height="300" as="geometry">
<mxRectangle x="25" y="490" width="120" height="26" as="alternateBounds"/>
</mxGeometry>
</mxCell>
<mxCell id="dmd0HlDYcxYugIlahWj0-12" value="- services: IPersistentDictionary&lt;GameServiceInfo&gt;&#10;- modules: IReadOnlyPersistentDictionary&lt;string, IReadOnlyDictionary&lt;string, IGameServiceModule&gt;&gt;&#10;- running: IDictionary&lt;string, GameServiceInfo&gt;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;sketch=1;" parent="dmd0HlDYcxYugIlahWj0-11" vertex="1">
<mxGeometry y="26" width="561" height="54" as="geometry"/>
</mxCell>
<mxCell id="dmd0HlDYcxYugIlahWj0-13" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;sketch=1;" parent="dmd0HlDYcxYugIlahWj0-11" vertex="1">
<mxGeometry y="80" width="561" height="8" as="geometry"/>
</mxCell>
<mxCell id="dmd0HlDYcxYugIlahWj0-14" value="+ CreateService(serviceName: string, assemblyName: string, moduleName: string): void&#10;+ DeleteService(serviceName: string): void&#10;+ GetModuleNames(): IEnumerable&lt;string&gt;&#10;+ GetServiceNames(): IEnumerable&lt;string&gt;&#10;+ GetServiceOptions(serviceName: string): IEnumerable&lt;string&gt;&#10;+ GetServiceOptionValue(serviceName: string, optionName: string): IEnumerable&lt;string&gt;&#10;+ SetServiceOptionValue(serviceName: string, optionName: string, string: value): bool&#10;+ GetServiceState(serviceName: string): ServiceState&#10;+ StartService(serviceName: string): void&#10;+ StopService(serviceName: string): void&#10;+ ExecuteCommand(serviceName: string, command: string): void&#10;+ GetServiceConsoleStream(): Stream&#10;+ ExecuteServiceAction(serviceAction: serviceAction): void" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;sketch=1;" parent="dmd0HlDYcxYugIlahWj0-11" vertex="1">
<mxGeometry y="88" width="561" height="212" as="geometry"/>
</mxCell>
<mxCell id="dmd0HlDYcxYugIlahWj0-38" value="&lt;&lt;Interface&gt;&gt;&#10;ITextCommand" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;sketch=1;" parent="1" vertex="1">
<mxGeometry x="1285" y="138" width="181" height="114" as="geometry"/>
</mxCell>
<mxCell id="dmd0HlDYcxYugIlahWj0-40" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;sketch=1;" parent="dmd0HlDYcxYugIlahWj0-38" vertex="1">
<mxGeometry y="40" width="181" height="8" as="geometry"/>
</mxCell>
<mxCell id="dmd0HlDYcxYugIlahWj0-41" value="+ GetPrefix(): string&#10;+ Validate(input: string): bool&#10;+ Execute(input: string): void&#10;+ Help(): string" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;sketch=1;" parent="dmd0HlDYcxYugIlahWj0-38" vertex="1">
<mxGeometry y="48" width="181" height="66" as="geometry"/>
</mxCell>
<mxCell id="2br9O0FZKGLhbr8u3XJU-1" value="ConsoleView" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;sketch=1;" parent="1" vertex="1">
<mxGeometry x="850" y="30" width="200" height="104" as="geometry"/>
</mxCell>
<mxCell id="2br9O0FZKGLhbr8u3XJU-2" value="- mainController: ITextCommand&#10;- mainPresenter: ITextOutput" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;sketch=1;" parent="2br9O0FZKGLhbr8u3XJU-1" vertex="1">
<mxGeometry y="26" width="200" height="44" as="geometry"/>
</mxCell>
<mxCell id="2br9O0FZKGLhbr8u3XJU-3" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;sketch=1;" parent="2br9O0FZKGLhbr8u3XJU-1" vertex="1">
<mxGeometry y="70" width="200" height="8" as="geometry"/>
</mxCell>
<mxCell id="2br9O0FZKGLhbr8u3XJU-4" value="+ Interact()" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;sketch=1;" parent="2br9O0FZKGLhbr8u3XJU-1" vertex="1">
<mxGeometry y="78" width="200" height="26" as="geometry"/>
</mxCell>
<mxCell id="wwlaSBDwwZOn0hO83bWU-9" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;sketch=1;" parent="1" source="qpeZJq-dxPH0P0VpmRa_-7" target="dmd0HlDYcxYugIlahWj0-38" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="wwlaSBDwwZOn0hO83bWU-10" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="1" source="qpeZJq-dxPH0P0VpmRa_-7" target="dmd0HlDYcxYugIlahWj0-38" edge="1">
<mxGeometry relative="1" as="geometry">
<mxPoint x="950" y="162" as="targetPoint"/>
</mxGeometry>
</mxCell>
<mxCell id="qpeZJq-dxPH0P0VpmRa_-7" value="MainController" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;sketch=1;" parent="1" vertex="1">
<mxGeometry x="1560" y="247" width="270" height="60" as="geometry"/>
</mxCell>
<mxCell id="qpeZJq-dxPH0P0VpmRa_-8" value="+ commands: Dictionary&lt;string, ITextCommand&gt;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;sketch=1;" parent="qpeZJq-dxPH0P0VpmRa_-7" vertex="1">
<mxGeometry y="26" width="270" height="26" as="geometry"/>
</mxCell>
<mxCell id="qpeZJq-dxPH0P0VpmRa_-9" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;sketch=1;" parent="qpeZJq-dxPH0P0VpmRa_-7" vertex="1">
<mxGeometry y="52" width="270" height="8" as="geometry"/>
</mxCell>
<mxCell id="K1k0_LUP-qlT_3mlrptx-1" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="1" source="2br9O0FZKGLhbr8u3XJU-2" target="dmd0HlDYcxYugIlahWj0-38" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="wwlaSBDwwZOn0hO83bWU-7" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="1" source="K1k0_LUP-qlT_3mlrptx-2" target="wwlaSBDwwZOn0hO83bWU-2" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="V3nv0dmUtDNsDw_gxP-z-3" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="1" source="K1k0_LUP-qlT_3mlrptx-2" target="dmd0HlDYcxYugIlahWj0-38" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="K1k0_LUP-qlT_3mlrptx-2" value="ConsoleGameServiceController" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;sketch=1;" parent="1" vertex="1">
<mxGeometry x="1230.5" y="318" width="290" height="60" as="geometry"/>
</mxCell>
<mxCell id="K1k0_LUP-qlT_3mlrptx-3" value="- service: IGameServiceActionExecuter" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;sketch=1;" parent="K1k0_LUP-qlT_3mlrptx-2" vertex="1">
<mxGeometry y="26" width="290" height="26" as="geometry"/>
</mxCell>
<mxCell id="K1k0_LUP-qlT_3mlrptx-4" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;sketch=1;" parent="K1k0_LUP-qlT_3mlrptx-2" vertex="1">
<mxGeometry y="52" width="290" height="8" as="geometry"/>
</mxCell>
<mxCell id="wwlaSBDwwZOn0hO83bWU-16" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="1" source="wwlaSBDwwZOn0hO83bWU-2" target="wwlaSBDwwZOn0hO83bWU-12" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="wwlaSBDwwZOn0hO83bWU-2" value="&lt;&lt;Interface&gt;&gt;&#10;IGameServiceActionExecuter" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;sketch=1;" parent="1" vertex="1">
<mxGeometry x="1275" y="480" width="250" height="74" as="geometry"/>
</mxCell>
<mxCell id="wwlaSBDwwZOn0hO83bWU-4" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;sketch=1;" parent="wwlaSBDwwZOn0hO83bWU-2" vertex="1">
<mxGeometry y="40" width="250" height="8" as="geometry"/>
</mxCell>
<mxCell id="wwlaSBDwwZOn0hO83bWU-5" value="+ ExecuteAction(action: ServiceAction): void" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;sketch=1;" parent="wwlaSBDwwZOn0hO83bWU-2" vertex="1">
<mxGeometry y="48" width="250" height="26" as="geometry"/>
</mxCell>
<mxCell id="SI3d9EEbteElKQB4Ic5T-15" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="1" source="wwlaSBDwwZOn0hO83bWU-12" target="SI3d9EEbteElKQB4Ic5T-10" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="wwlaSBDwwZOn0hO83bWU-12" value="&lt;&lt;DS&gt;&gt;&#10;GameServiceAction" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;sketch=1;" parent="1" vertex="1">
<mxGeometry x="1440" y="606" width="161" height="128" as="geometry"/>
</mxCell>
<mxCell id="wwlaSBDwwZOn0hO83bWU-13" value="+ AssemblyName: string&#10;+ ModuleName: string&#10;+ ServiceName: string&#10;+ Module: IModule&#10;+ Action: ServiceActions" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;sketch=1;" parent="wwlaSBDwwZOn0hO83bWU-12" vertex="1">
<mxGeometry y="40" width="161" height="80" as="geometry"/>
</mxCell>
<mxCell id="wwlaSBDwwZOn0hO83bWU-14" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;sketch=1;" parent="wwlaSBDwwZOn0hO83bWU-12" vertex="1">
<mxGeometry y="120" width="161" height="8" as="geometry"/>
</mxCell>
<mxCell id="wwlaSBDwwZOn0hO83bWU-19" value="&lt;&lt;Interface&gt;&gt;&#10;ITextOutput" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;sketch=1;" parent="1" vertex="1">
<mxGeometry x="340" y="137" width="310" height="110" as="geometry"/>
</mxCell>
<mxCell id="wwlaSBDwwZOn0hO83bWU-21" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;sketch=1;" parent="wwlaSBDwwZOn0hO83bWU-19" vertex="1">
<mxGeometry y="40" width="310" height="8" as="geometry"/>
</mxCell>
<mxCell id="wwlaSBDwwZOn0hO83bWU-22" value="+ GetPresenterName(): string&#10;+ Event TextOutput(output: string): void&#10;+ OnOutputReceived(sender: object, output: string): void" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;sketch=1;" parent="wwlaSBDwwZOn0hO83bWU-19" vertex="1">
<mxGeometry y="48" width="310" height="62" as="geometry"/>
</mxCell>
<mxCell id="V3nv0dmUtDNsDw_gxP-z-2" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="1" source="2br9O0FZKGLhbr8u3XJU-2" target="wwlaSBDwwZOn0hO83bWU-19" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="fdKXkHfjRXYybK0fejAG-3" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="1" source="HUSvFZX5SimreebZp30a-5" target="wwlaSBDwwZOn0hO83bWU-19" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="fdKXkHfjRXYybK0fejAG-4" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;sketch=1;" parent="1" source="HUSvFZX5SimreebZp30a-5" target="wwlaSBDwwZOn0hO83bWU-19" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="HUSvFZX5SimreebZp30a-5" value="MainPresenter" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;sketch=1;" parent="1" vertex="1">
<mxGeometry x="20" y="214" width="270" height="60" as="geometry"/>
</mxCell>
<mxCell id="HUSvFZX5SimreebZp30a-6" value="- textPresenters: Dictionary&lt;string, ITextOutput&gt;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;sketch=1;" parent="HUSvFZX5SimreebZp30a-5" vertex="1">
<mxGeometry y="26" width="270" height="26" as="geometry"/>
</mxCell>
<mxCell id="HUSvFZX5SimreebZp30a-7" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;sketch=1;" parent="HUSvFZX5SimreebZp30a-5" vertex="1">
<mxGeometry y="52" width="270" height="8" as="geometry"/>
</mxCell>
<mxCell id="HUSvFZX5SimreebZp30a-16" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;sketch=1;" parent="1" source="HUSvFZX5SimreebZp30a-11" target="wwlaSBDwwZOn0hO83bWU-19" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="fdKXkHfjRXYybK0fejAG-1" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=block;endFill=0;sketch=1;" parent="1" source="HUSvFZX5SimreebZp30a-11" target="zFFzFwxISwJASp9ezwbr-1" edge="1">
<mxGeometry relative="1" as="geometry"/>
</mxCell>
<mxCell id="HUSvFZX5SimreebZp30a-11" value="ServicePresenter" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=26;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;sketch=1;" parent="1" vertex="1">
<mxGeometry x="415" y="344" width="160" height="34" as="geometry"/>
</mxCell>
<mxCell id="HUSvFZX5SimreebZp30a-13" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;sketch=1;" parent="HUSvFZX5SimreebZp30a-11" vertex="1">
<mxGeometry y="26" width="160" height="8" as="geometry"/>
</mxCell>
<mxCell id="SI3d9EEbteElKQB4Ic5T-5" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="1" source="zFFzFwxISwJASp9ezwbr-1" target="fdKXkHfjRXYybK0fejAG-9" edge="1">
<mxGeometry relative="1" as="geometry">
<Array as="points">
<mxPoint x="495" y="660"/>
<mxPoint x="407" y="660"/>
</Array>
</mxGeometry>
</mxCell>
<mxCell id="zFFzFwxISwJASp9ezwbr-1" value="&lt;&lt;Interface&gt;&gt;&#10;IGameServiceOutputMonitor" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;sketch=1;" parent="1" vertex="1">
<mxGeometry x="355" y="464" width="280" height="74" as="geometry"/>
</mxCell>
<mxCell id="zFFzFwxISwJASp9ezwbr-3" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;sketch=1;" parent="zFFzFwxISwJASp9ezwbr-1" vertex="1">
<mxGeometry y="40" width="280" height="8" as="geometry"/>
</mxCell>
<mxCell id="zFFzFwxISwJASp9ezwbr-4" value="+ ServicesChanged(ServicesResult results): void" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;sketch=1;" parent="zFFzFwxISwJASp9ezwbr-1" vertex="1">
<mxGeometry y="48" width="280" height="26" as="geometry"/>
</mxCell>
<mxCell id="fdKXkHfjRXYybK0fejAG-9" value="&lt;&lt;DS&gt;&gt;&#10;GameServicesActionResults" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;sketch=1;" parent="1" vertex="1">
<mxGeometry x="225" y="830" width="365" height="138" as="geometry"/>
</mxCell>
<mxCell id="fdKXkHfjRXYybK0fejAG-10" value="+ Services: ICollection&lt;string&gt;&#10;+ Running: ICollection&lt;string&gt;&#10;+ Errors: ICollection&lt;string&gt;&#10;+ Consoles: IDictionary&lt;string, Stream&gt;&#10;+ ServiceOptions: IDictionary&lt;string, IDictionary&lt;string, string&gt;&gt;" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;sketch=1;" parent="fdKXkHfjRXYybK0fejAG-9" vertex="1">
<mxGeometry y="40" width="365" height="90" as="geometry"/>
</mxCell>
<mxCell id="fdKXkHfjRXYybK0fejAG-11" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;sketch=1;" parent="fdKXkHfjRXYybK0fejAG-9" vertex="1">
<mxGeometry y="130" width="365" height="8" as="geometry"/>
</mxCell>
<mxCell id="SI3d9EEbteElKQB4Ic5T-10" value="&lt;&lt;Enum&gt;&gt;&#10;GameServiceActions" style="swimlane;fontStyle=1;align=center;verticalAlign=top;childLayout=stackLayout;horizontal=1;startSize=40;horizontalStack=0;resizeParent=1;resizeParentMax=0;resizeLast=0;collapsible=1;marginBottom=0;sketch=1;" parent="1" vertex="1">
<mxGeometry x="882.5" y="408" width="160" height="198" as="geometry"/>
</mxCell>
<mxCell id="SI3d9EEbteElKQB4Ic5T-11" value="+ Start&#10;+ Stop&#10;+ AddModule&#10;+ RemoveModule&#10;+ CreateService&#10;+ DeleteService&#10;+ ExecuteCommand&#10;+ SetServiceOption&#10;+ RestoreService&#10;+ View" style="text;strokeColor=none;fillColor=none;align=left;verticalAlign=top;spacingLeft=4;spacingRight=4;overflow=hidden;rotatable=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;sketch=1;" parent="SI3d9EEbteElKQB4Ic5T-10" vertex="1">
<mxGeometry y="40" width="160" height="150" as="geometry"/>
</mxCell>
<mxCell id="SI3d9EEbteElKQB4Ic5T-12" value="" style="line;strokeWidth=1;fillColor=none;align=left;verticalAlign=middle;spacingTop=-1;spacingLeft=3;spacingRight=3;rotatable=0;labelPosition=right;points=[];portConstraint=eastwest;sketch=1;" parent="SI3d9EEbteElKQB4Ic5T-10" vertex="1">
<mxGeometry y="190" width="160" height="8" as="geometry"/>
</mxCell>
</root>
</mxGraphModel>
</diagram>
<diagram id="gj0qHRc3eh050ABAey3g" name="Data-Flow">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGraphModel dx="1216" dy="740" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" math="0" shadow="0">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<root>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="jVG6p58vlRYGO9X4wXeX-0"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="jVG6p58vlRYGO9X4wXeX-1" parent="jVG6p58vlRYGO9X4wXeX-0"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="28FAlPysTx9DMYvLwa-2-21" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.3333333333333333;exitDx=0;exitDy=0;exitPerimeter=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;endArrow=open;endFill=0;fillColor=#1ba1e2;strokeColor=#006EAF;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="jVG6p58vlRYGO9X4wXeX-2" target="jVG6p58vlRYGO9X4wXeX-3" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="jVG6p58vlRYGO9X4wXeX-2" value="Actor" style="shape=umlActor;verticalLabelPosition=bottom;verticalAlign=top;html=1;outlineConnect=0;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry x="10" y="300" width="30" height="60" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="jVG6p58vlRYGO9X4wXeX-12" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=open;endFill=0;exitX=0.5;exitY=1;exitDx=0;exitDy=0;fillColor=#1ba1e2;strokeColor=#006EAF;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="jVG6p58vlRYGO9X4wXeX-3" target="jVG6p58vlRYGO9X4wXeX-4" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="28FAlPysTx9DMYvLwa-2-22" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.25;exitDx=0;exitDy=0;entryX=0.75;entryY=0.1;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=open;endFill=0;fillColor=#1ba1e2;strokeColor=#006EAF;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="jVG6p58vlRYGO9X4wXeX-3" target="jVG6p58vlRYGO9X4wXeX-2" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="345FJoVc2gbAayMsQlD7-0" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=1;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="jVG6p58vlRYGO9X4wXeX-3" target="jVG6p58vlRYGO9X4wXeX-4" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="345FJoVc2gbAayMsQlD7-6" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.25;exitY=0;exitDx=0;exitDy=0;entryX=0;entryY=0.25;entryDx=0;entryDy=0;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="jVG6p58vlRYGO9X4wXeX-3" target="28FAlPysTx9DMYvLwa-2-7" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="jVG6p58vlRYGO9X4wXeX-3" value="Console View" style="whiteSpace=wrap;html=1;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry x="80" y="300" width="120" height="60" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="jVG6p58vlRYGO9X4wXeX-13" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=open;endFill=0;fillColor=#1ba1e2;strokeColor=#006EAF;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="jVG6p58vlRYGO9X4wXeX-4" target="jVG6p58vlRYGO9X4wXeX-5" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="345FJoVc2gbAayMsQlD7-2" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="jVG6p58vlRYGO9X4wXeX-4" target="jVG6p58vlRYGO9X4wXeX-5" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="jVG6p58vlRYGO9X4wXeX-4" value="string command (request)" style="whiteSpace=wrap;html=1;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry x="260" y="482.5" width="120" height="60" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="jVG6p58vlRYGO9X4wXeX-8" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;dashed=1;endArrow=block;endFill=0;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="jVG6p58vlRYGO9X4wXeX-5" target="jVG6p58vlRYGO9X4wXeX-7" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="28FAlPysTx9DMYvLwa-2-3" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;endArrow=open;endFill=0;dashed=1;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="jVG6p58vlRYGO9X4wXeX-5" target="jVG6p58vlRYGO9X4wXeX-7" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-18" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=open;endFill=0;strokeColor=#006EAF;fillColor=#1ba1e2;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="jVG6p58vlRYGO9X4wXeX-5" target="jVG6p58vlRYGO9X4wXeX-9" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="jVG6p58vlRYGO9X4wXeX-5" value="MainController" style="whiteSpace=wrap;html=1;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry x="420" y="482.5" width="120" height="60" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="jVG6p58vlRYGO9X4wXeX-6" value="http://www.plainionist.net/Implementing-Clean-Architecture-Controller-Presenter/" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry y="840" width="480" height="20" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="jVG6p58vlRYGO9X4wXeX-7" value="&amp;lt;&amp;lt;Interface&amp;gt;&amp;gt;&lt;br&gt;ICommand" style="whiteSpace=wrap;html=1;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry x="420" y="372.5" width="120" height="60" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="jVG6p58vlRYGO9X4wXeX-10" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;dashed=1;endArrow=block;endFill=0;exitX=0.5;exitY=0;exitDx=0;exitDy=0;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="jVG6p58vlRYGO9X4wXeX-9" target="jVG6p58vlRYGO9X4wXeX-7" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-8" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.25;entryDx=0;entryDy=0;endArrow=open;endFill=0;strokeColor=#006EAF;fillColor=#1ba1e2;exitX=1;exitY=0.5;exitDx=0;exitDy=0;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="jVG6p58vlRYGO9X4wXeX-9" target="UY-EM7-1ECCvWtENr50b-1" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxPoint x="809.9999999999998" y="512.5000000000002" as="sourcePoint"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxGeometry>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="345FJoVc2gbAayMsQlD7-3" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="jVG6p58vlRYGO9X4wXeX-9" target="UY-EM7-1ECCvWtENr50b-2" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="345FJoVc2gbAayMsQlD7-4" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;entryX=0;entryY=0.75;entryDx=0;entryDy=0;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="jVG6p58vlRYGO9X4wXeX-9" target="UY-EM7-1ECCvWtENr50b-1" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="jVG6p58vlRYGO9X4wXeX-9" value="ServiceController" style="whiteSpace=wrap;html=1;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry x="575" y="482.5" width="120" height="60" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-4" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=1;strokeColor=none;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="28FAlPysTx9DMYvLwa-2-1" target="UY-EM7-1ECCvWtENr50b-2" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-5" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;dashed=1;endArrow=block;endFill=0;strokeColor=#f0f0f0;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="28FAlPysTx9DMYvLwa-2-1" target="UY-EM7-1ECCvWtENr50b-2" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-7" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1.008;entryY=0.625;entryDx=0;entryDy=0;entryPerimeter=0;endArrow=open;endFill=0;strokeColor=#f0f0f0;dashed=1;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="28FAlPysTx9DMYvLwa-2-1" target="UY-EM7-1ECCvWtENr50b-1" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<Array as="points">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxPoint x="960" y="338"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxPoint x="960" y="580"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</Array>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxGeometry>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-16" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=open;endFill=0;dashed=1;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="28FAlPysTx9DMYvLwa-2-1" target="UY-EM7-1ECCvWtENr50b-11" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="345FJoVc2gbAayMsQlD7-7" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="28FAlPysTx9DMYvLwa-2-1" target="UY-EM7-1ECCvWtENr50b-10" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<Array as="points">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxPoint x="960" y="338"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxPoint x="960" y="83"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</Array>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxGeometry>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="28FAlPysTx9DMYvLwa-2-1" value="ServiceManager" style="whiteSpace=wrap;html=1;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry x="800" y="307.5" width="120" height="60" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="28FAlPysTx9DMYvLwa-2-9" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endArrow=open;endFill=0;fillColor=#1ba1e2;strokeColor=#006EAF;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="28FAlPysTx9DMYvLwa-2-5" target="tM_Gde3HH8YiZ2frBV5J-0" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-12" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=block;endFill=0;strokeColor=#f0f0f0;dashed=1;exitX=1;exitY=0.75;exitDx=0;exitDy=0;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="28FAlPysTx9DMYvLwa-2-5" target="UY-EM7-1ECCvWtENr50b-11" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-13" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.75;entryDx=0;entryDy=0;endArrow=open;endFill=0;strokeColor=#f0f0f0;dashed=1;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="28FAlPysTx9DMYvLwa-2-5" target="UY-EM7-1ECCvWtENr50b-10" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="tM_Gde3HH8YiZ2frBV5J-3" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;dashed=1;endArrow=block;endFill=0;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="28FAlPysTx9DMYvLwa-2-5" target="tM_Gde3HH8YiZ2frBV5J-1" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="28FAlPysTx9DMYvLwa-2-5" value="ServicePresenter" style="whiteSpace=wrap;html=1;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry x="575" y="122.5" width="120" height="60" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="28FAlPysTx9DMYvLwa-2-8" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=open;endFill=0;fillColor=#1ba1e2;strokeColor=#006EAF;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="28FAlPysTx9DMYvLwa-2-7" target="jVG6p58vlRYGO9X4wXeX-3" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="tM_Gde3HH8YiZ2frBV5J-5" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;entryX=0;entryY=0.5;entryDx=0;entryDy=0;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="28FAlPysTx9DMYvLwa-2-7" target="tM_Gde3HH8YiZ2frBV5J-0" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="28FAlPysTx9DMYvLwa-2-7" value="String Output" style="whiteSpace=wrap;html=1;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry x="260" y="122.5" width="120" height="60" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-1" value="ServiceAction &amp;lt;DS&amp;gt;" style="whiteSpace=wrap;html=1;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry x="800" y="542.5" width="120" height="60" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-6" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=0;entryDx=0;entryDy=0;endArrow=open;endFill=0;strokeColor=#f0f0f0;dashed=1;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="UY-EM7-1ECCvWtENr50b-2" target="UY-EM7-1ECCvWtENr50b-1" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-20" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;endArrow=open;endFill=0;strokeColor=#006EAF;fillColor=#1ba1e2;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="UY-EM7-1ECCvWtENr50b-1" target="28FAlPysTx9DMYvLwa-2-1" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-2" value="&amp;lt;&amp;lt;Interface&amp;gt;&amp;gt;&lt;br&gt;IServiceManipulator" style="whiteSpace=wrap;html=1;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry x="800" y="432.5" width="120" height="60" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-22" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.25;entryDx=0;entryDy=0;endArrow=open;endFill=0;strokeColor=#006EAF;fillColor=#1ba1e2;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="UY-EM7-1ECCvWtENr50b-10" target="28FAlPysTx9DMYvLwa-2-5" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-10" value="ServicesResult &amp;lt;DS&amp;gt;" style="whiteSpace=wrap;html=1;fillColor=none;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry x="800" y="67.5" width="120" height="60" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-14" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;entryX=0.5;entryY=1;entryDx=0;entryDy=0;endArrow=open;endFill=0;strokeColor=#f0f0f0;dashed=1;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="UY-EM7-1ECCvWtENr50b-11" target="UY-EM7-1ECCvWtENr50b-10" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-21" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.25;exitDx=0;exitDy=0;entryX=1;entryY=0.75;entryDx=0;entryDy=0;endArrow=open;endFill=0;strokeColor=#006EAF;fillColor=#1ba1e2;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="28FAlPysTx9DMYvLwa-2-1" target="UY-EM7-1ECCvWtENr50b-10" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-11" value="&amp;lt;&amp;lt;Interface&amp;gt;&amp;gt;&lt;br&gt;IServicesMonitor" style="whiteSpace=wrap;html=1;fillColor=none;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry x="800" y="167.5" width="120" height="60" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-70" value="" style="line;strokeWidth=2;direction=south;html=1;fillColor=none;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry x="220" y="50" width="10" height="570" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-71" value="" style="line;strokeWidth=2;direction=south;html=1;fillColor=none;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry x="760" y="50" width="10" height="570" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="UY-EM7-1ECCvWtENr50b-73" value="Page 191 (Chapter 22) of Clean Architecture" style="text;html=1;strokeColor=none;fillColor=none;align=left;verticalAlign=middle;whiteSpace=wrap;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry y="870" width="480" height="20" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="tM_Gde3HH8YiZ2frBV5J-2" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=0;exitDx=0;exitDy=0;entryX=0.5;entryY=1;entryDx=0;entryDy=0;dashed=1;endArrow=block;endFill=0;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="tM_Gde3HH8YiZ2frBV5J-0" target="tM_Gde3HH8YiZ2frBV5J-1" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="tM_Gde3HH8YiZ2frBV5J-4" value="Use" style="edgeStyle=orthogonalEdgeStyle;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.75;exitY=0;exitDx=0;exitDy=0;entryX=0.75;entryY=1;entryDx=0;entryDy=0;dashed=1;endArrow=open;endFill=0;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" source="tM_Gde3HH8YiZ2frBV5J-0" target="tM_Gde3HH8YiZ2frBV5J-1" edge="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry relative="1" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="tM_Gde3HH8YiZ2frBV5J-0" value="MainPresenter" style="html=1;dashed=0;whitespace=wrap;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry x="420" y="122.5" width="110" height="60" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxCell id="tM_Gde3HH8YiZ2frBV5J-1" value="&amp;lt;&amp;lt;Interface&amp;gt;&amp;gt;&lt;br&gt;IConsoleOutput" style="html=1;dashed=0;whitespace=wrap;sketch=1;" parent="jVG6p58vlRYGO9X4wXeX-1" vertex="1">
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
<mxGeometry x="420" y="20" width="110" height="50" as="geometry"/>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxCell>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</root>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</mxGraphModel>
&#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa; &#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;&#xa;
</diagram>
</mxfile>