ARCHITECTURE_8.svg 28 KB

1
  1. <svg id="mermaid-svg" width="100%" xmlns="http://www.w3.org/2000/svg" class="flowchart" style="max-width: 1285.01171875px;" viewBox="0 0 1285.01171875 940.1283569335938" role="graphics-document document" aria-roledescription="flowchart-v2" xmlns:xlink="http://www.w3.org/1999/xlink"><style xmlns="http://www.w3.org/1999/xhtml">@import url("https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.7.2/css/all.min.css");</style><style>#mermaid-svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg .error-icon{fill:#552222;}#mermaid-svg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg .marker{fill:#333333;stroke:#333333;}#mermaid-svg .marker.cross{stroke:#333333;}#mermaid-svg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg p{margin:0;}#mermaid-svg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg .cluster-label text{fill:#333;}#mermaid-svg .cluster-label span{color:#333;}#mermaid-svg .cluster-label span p{background-color:transparent;}#mermaid-svg .label text,#mermaid-svg span{fill:#333;color:#333;}#mermaid-svg .node rect,#mermaid-svg .node circle,#mermaid-svg .node ellipse,#mermaid-svg .node polygon,#mermaid-svg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg .rough-node .label text,#mermaid-svg .node .label text,#mermaid-svg .image-shape .label,#mermaid-svg .icon-shape .label{text-anchor:middle;}#mermaid-svg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg .rough-node .label,#mermaid-svg .node .label,#mermaid-svg .image-shape .label,#mermaid-svg .icon-shape .label{text-align:center;}#mermaid-svg .node.clickable{cursor:pointer;}#mermaid-svg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg .arrowheadPath{fill:#333333;}#mermaid-svg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg .cluster text{fill:#333;}#mermaid-svg .cluster span{color:#333;}#mermaid-svg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg rect.text{fill:none;stroke-width:0;}#mermaid-svg .icon-shape,#mermaid-svg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg .icon-shape p,#mermaid-svg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg .icon-shape rect,#mermaid-svg .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}</style><g><marker id="mermaid-svg_flowchart-v2-pointEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 0 L 10 5 L 0 10 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="mermaid-svg_flowchart-v2-pointStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="4.5" refY="5" markerUnits="userSpaceOnUse" markerWidth="8" markerHeight="8" orient="auto"><path d="M 0 5 L 10 10 L 10 0 z" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="mermaid-svg_flowchart-v2-circleEnd" class="marker flowchart-v2" viewBox="0 0 10 10" refX="11" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="mermaid-svg_flowchart-v2-circleStart" class="marker flowchart-v2" viewBox="0 0 10 10" refX="-1" refY="5" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><circle cx="5" cy="5" r="5" class="arrowMarkerPath" style="stroke-width: 1; stroke-dasharray: 1, 0;"/></marker><marker id="mermaid-svg_flowchart-v2-crossEnd" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="12" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"/></marker><marker id="mermaid-svg_flowchart-v2-crossStart" class="marker cross flowchart-v2" viewBox="0 0 11 11" refX="-1" refY="5.2" markerUnits="userSpaceOnUse" markerWidth="11" markerHeight="11" orient="auto"><path d="M 1,1 l 9,9 M 10,1 l -9,9" class="arrowMarkerPath" style="stroke-width: 2; stroke-dasharray: 1, 0;"/></marker><g class="root"><g class="clusters"><g class="cluster " id="SPA" data-look="classic"><rect style="" x="8" y="8" width="1269.01171875" height="772.9314575195312"/><g class="cluster-label " transform="translate(542.505859375, 8)"><foreignObject width="200" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table; white-space: break-spaces; line-height: 1.5; max-width: 200px; text-align: center; width: 200px;"><span class="nodeLabel "><p>dashboard/ (Vite build → Caddy)</p></span></div></foreignObject></g></g></g><g class="edgePaths"><path d="M198.961,107.523L198.961,111.69C198.961,115.857,198.961,124.19,198.961,131.857C198.961,139.523,198.961,146.523,198.961,150.023L198.961,153.523" id="L_Routes_AuthGate_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Routes_AuthGate_0" data-points="W3sieCI6MTk4Ljk2MDkzNzUsInkiOjEwNy41MjMzMzA2ODg0NzY1Nn0seyJ4IjoxOTguOTYwOTM3NSwieSI6MTMyLjUyMzMzMDY4ODQ3NjU2fSx7IngiOjE5OC45NjA5Mzc1LCJ5IjoxNTcuNTIzMzMwNjg4NDc2NTZ9XQ==" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M148.787,263.715L143.08,270.254C137.372,276.792,125.958,289.87,120.25,305.175C114.543,320.481,114.543,338.014,114.543,346.78L114.543,355.547" id="L_AuthGate_Login_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_AuthGate_Login_0" data-points="W3sieCI6MTQ4Ljc4NjkwMjk2OTgzMzQyLCJ5IjoyNjMuNzE0NzM2ODM0OTY1MTV9LHsieCI6MTE0LjU0Mjk2ODc1LCJ5IjozMDIuOTQ3NzQ2Mjc2ODU1NDd9LHsieCI6MTE0LjU0Mjk2ODc1LCJ5IjozNTkuNTQ2NzgzNDQ3MjY1Nn1d" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M261.821,262.25L268.971,269.033C276.121,275.816,290.422,289.382,297.572,303.878C304.723,318.374,304.723,333.799,304.723,341.512L304.723,349.225" id="L_AuthGate_Overview_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_AuthGate_Overview_0" data-points="W3sieCI6MjYxLjgyMDY4NDE1MjM2NSwieSI6MjYyLjI0OTY3NzQxMDQ0ODR9LHsieCI6MzA0LjcyMjY1NjI1LCJ5IjozMDIuOTQ3NzQ2Mjc2ODU1NDd9LHsieCI6MzA0LjcyMjY1NjI1LCJ5IjozNTMuMjI1MDA5OTE4MjEyOX1d" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M304.723,437.097L304.723,443.477C304.723,449.856,304.723,462.615,365.502,479.596C426.282,496.577,547.84,517.781,608.62,528.382L669.399,538.984" id="L_Overview_TanQ_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Overview_TanQ_0" data-points="W3sieCI6MzA0LjcyMjY1NjI1LCJ5Ijo0MzcuMDk2OTU4MTYwNDAwNH0seyJ4IjozMDQuNzIyNjU2MjUsInkiOjQ3NS4zNzQyMjE4MDE3NTc4fSx7IngiOjY3My4zMzk4NDM3NSwieSI6NTM5LjY3MTM4NDY4NDgzNjd9XQ==" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M524.676,435.344L524.676,442.016C524.676,448.687,524.676,462.031,548.825,477.263C572.974,492.495,621.272,509.616,645.421,518.176L669.57,526.737" id="L_Routers_TanQ_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Routers_TanQ_0" data-points="W3sieCI6NTI0LjY3NTc4MTI1LCJ5Ijo0MzUuMzQzODk4NzczMTkzMzZ9LHsieCI6NTI0LjY3NTc4MTI1LCJ5Ijo0NzUuMzc0MjIxODAxNzU3OH0seyJ4Ijo2NzMuMzM5ODQzNzUsInkiOjUyOC4wNzMyNDg4ODk0NDV9XQ==" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M737.754,436.401L737.754,442.896C737.754,449.392,737.754,462.383,737.754,472.379C737.754,482.374,737.754,489.374,737.754,492.874L737.754,496.374" id="L_Events_TanQ_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Events_TanQ_0" data-points="W3sieCI6NzM3Ljc1MzkwNjI1LCJ5Ijo0MzYuNDAwNTQzMjEyODkwNn0seyJ4Ijo3MzcuNzUzOTA2MjUsInkiOjQ3NS4zNzQyMjE4MDE3NTc4fSx7IngiOjczNy43NTM5MDYyNSwieSI6NTAwLjM3NDIyMTgwMTc1Nzh9XQ==" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M981.465,450.374L981.465,454.541C981.465,458.708,981.465,467.041,952.219,480.272C922.973,493.503,864.481,511.631,835.235,520.695L805.989,529.759" id="L_Commands_TanQ_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Commands_TanQ_0" data-points="W3sieCI6OTgxLjQ2NDg0Mzc1LCJ5Ijo0NTAuMzc0MjIxODAxNzU3OH0seyJ4Ijo5ODEuNDY0ODQzNzUsInkiOjQ3NS4zNzQyMjE4MDE3NTc4fSx7IngiOjgwMi4xNjc5Njg3NSwieSI6NTMwLjk0MzI5Njc4MDcwMzF9XQ==" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M1190.488,431.606L1190.488,438.901C1190.488,446.195,1190.488,460.785,1126.426,478.767C1062.363,496.75,934.238,518.126,870.176,528.814L806.113,539.502" id="L_Alerts_TanQ_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_Alerts_TanQ_0" data-points="W3sieCI6MTE5MC40ODgyODEyNSwieSI6NDMxLjYwNTk5ODk5MjkxOTl9LHsieCI6MTE5MC40ODgyODEyNSwieSI6NDc1LjM3NDIyMTgwMTc1Nzh9LHsieCI6ODAyLjE2Nzk2ODc1LCJ5Ijo1NDAuMTYwMzYxODMwNTg1NH1d" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M673.34,560.392L598.58,571.4C523.82,582.408,374.301,604.424,299.541,618.932C224.781,633.44,224.781,640.44,224.781,643.94L224.781,647.44" id="L_TanQ_API_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_TanQ_API_0" data-points="W3sieCI6NjczLjMzOTg0Mzc1LCJ5Ijo1NjAuMzkxNjY1MzEyNjI5OH0seyJ4IjoyMjQuNzgxMjUsInkiOjYyNi40Mzk3ODExODg5NjQ4fSx7IngiOjIyNC43ODEyNSwieSI6NjUxLjQzOTc4MTE4ODk2NDh9XQ==" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M802.168,562.185L863.331,572.894C924.493,583.603,1046.819,605.022,1107.982,619.324C1169.145,633.626,1169.145,640.813,1169.145,644.406L1169.145,648" id="L_TanQ_SSEClient_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_TanQ_SSEClient_0" data-points="W3sieCI6ODAyLjE2Nzk2ODc1LCJ5Ijo1NjIuMTg1MzQ4NTY2NDkzMn0seyJ4IjoxMTY5LjE0NDUzMTI1LCJ5Ijo2MjYuNDM5NzgxMTg4OTY0OH0seyJ4IjoxMTY5LjE0NDUzMTI1LCJ5Ijo2NTEuOTk5NjM3NjAzNzU5OH1d" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M224.781,755.931L224.781,760.098C224.781,764.265,224.781,772.598,224.781,782.931C224.781,793.265,224.781,805.598,298.806,822.674C372.831,839.75,520.88,861.569,594.905,872.478L668.929,883.387" id="L_API_GoServer_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_API_GoServer_0" data-points="W3sieCI6MjI0Ljc4MTI1LCJ5Ijo3NTUuOTMxNDU3NTE5NTMxMn0seyJ4IjoyMjQuNzgxMjUsInkiOjc4MC45MzE0NTc1MTk1MzEyfSx7IngiOjIyNC43ODEyNSwieSI6ODE3LjkzMTQ1NzUxOTUzMTJ9LHsieCI6NjcyLjg4NjcxODc1LCJ5Ijo4ODMuOTcwMjQyMDM1MDU0OH1d" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/><path d="M1169.145,755.372L1169.145,759.632C1169.145,763.892,1169.145,772.412,1169.145,782.838C1169.145,793.265,1169.145,805.598,1108.714,822.355C1048.283,839.112,927.422,860.292,866.992,870.882L806.561,881.472" id="L_SSEClient_GoServer_0" class=" edge-thickness-normal edge-pattern-solid edge-thickness-normal edge-pattern-solid flowchart-link" style=";" data-edge="true" data-et="edge" data-id="L_SSEClient_GoServer_0" data-points="W3sieCI6MTE2OS4xNDQ1MzEyNSwieSI6NzU1LjM3MTYwMTEwNDczNjN9LHsieCI6MTE2OS4xNDQ1MzEyNSwieSI6NzgwLjkzMTQ1NzUxOTUzMTJ9LHsieCI6MTE2OS4xNDQ1MzEyNSwieSI6ODE3LjkzMTQ1NzUxOTUzMTJ9LHsieCI6ODAyLjYyMTA5Mzc1LCJ5Ijo4ODIuMTYyMzY5OTE3MTM3NX1d" marker-end="url(#mermaid-svg_flowchart-v2-pointEnd)"/></g><g class="edgeLabels"><g class="edgeLabel"><g class="label" data-id="L_Routes_AuthGate_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(114.54296875, 302.94774627685547)"><g class="label" data-id="L_AuthGate_Login_0" transform="translate(-30.6953125, -12)"><foreignObject width="61.390625" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "><p>no token</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(304.72265625, 302.94774627685547)"><g class="label" data-id="L_AuthGate_Overview_0" transform="translate(-34.6953125, -12)"><foreignObject width="69.390625" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "><p>has token</p></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Overview_TanQ_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Routers_TanQ_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Events_TanQ_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Commands_TanQ_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_Alerts_TanQ_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_TanQ_API_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "></span></div></foreignObject></g></g><g class="edgeLabel"><g class="label" data-id="L_TanQ_SSEClient_0" transform="translate(0, 0)"><foreignObject width="0" height="0"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(224.78125, 817.9314575195312)"><g class="label" data-id="L_API_GoServer_0" transform="translate(-21.3359375, -12)"><foreignObject width="42.671875" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "><p>REST</p></span></div></foreignObject></g></g><g class="edgeLabel" transform="translate(1169.14453125, 817.9314575195312)"><g class="label" data-id="L_SSEClient_GoServer_0" transform="translate(-45.8046875, -12)"><foreignObject width="91.609375" height="24"><div xmlns="http://www.w3.org/1999/xhtml" class="labelBkg" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="edgeLabel "><p>EventSource</p></span></div></foreignObject></g></g></g><g class="nodes"><g class="node default " id="flowchart-Routes-0" transform="translate(198.9609375, 70.26166534423828)"><path d="M0,11.843836337324039 a56.265625,11.843836337324039 0,0,0 112.53125,0 a56.265625,11.843836337324039 0,0,0 -112.53125,0 l0,50.843836337324035 a56.265625,11.843836337324039 0,0,0 112.53125,0 l0,-50.843836337324035" class="basic label-container" style="" label-offset-y="11.843836337324039" transform="translate(-56.265625, -37.26575450598605)"/><g class="label" style="" transform="translate(-48.765625, -2)"><rect/><foreignObject width="97.53125" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>Wouter router</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-AuthGate-1" transform="translate(198.9609375, 211.73553848266602)"><path d="M0,15.14146990683689 a95.9921875,15.14146990683689 0,0,0 191.984375,0 a95.9921875,15.14146990683689 0,0,0 -191.984375,0 l0,78.14146990683689 a95.9921875,15.14146990683689 0,0,0 191.984375,0 l0,-78.14146990683689" class="basic label-container" style="" label-offset-y="15.14146990683689" transform="translate(-95.9921875, -54.21220486025533)"/><g class="label" style="" transform="translate(-88.4921875, -14)"><rect/><foreignObject width="176.984375" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>Auth gate<br />(localStorage c2s_token)</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-Login-2" transform="translate(114.54296875, 395.16098403930664)"><path d="M0,10.7428001140576 a47.09375,10.7428001140576 0,0,0 94.1875,0 a47.09375,10.7428001140576 0,0,0 -94.1875,0 l0,49.7428001140576 a47.09375,10.7428001140576 0,0,0 94.1875,0 l0,-49.7428001140576" class="basic label-container" style="" label-offset-y="10.7428001140576" transform="translate(-47.09375, -35.6142001710864)"/><g class="label" style="" transform="translate(-39.59375, -2)"><rect/><foreignObject width="79.1875" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>Login page</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-Overview-3" transform="translate(304.72265625, 395.16098403930664)"><path d="M0,14.957318604067286 a93.0859375,14.957318604067286 0,0,0 186.171875,0 a93.0859375,14.957318604067286 0,0,0 -186.171875,0 l0,53.95731860406728 a93.0859375,14.957318604067286 0,0,0 186.171875,0 l0,-53.95731860406728" class="basic label-container" style="" label-offset-y="14.957318604067286" transform="translate(-93.0859375, -41.93597790610093)"/><g class="label" style="" transform="translate(-85.5859375, -2)"><rect/><foreignObject width="171.171875" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>Overview: stats + charts</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-Routers-4" transform="translate(524.67578125, 395.16098403930664)"><path d="M0,13.788609226974607 a76.8671875,13.788609226974607 0,0,0 153.734375,0 a76.8671875,13.788609226974607 0,0,0 -153.734375,0 l0,52.78860922697461 a76.8671875,13.788609226974607 0,0,0 153.734375,0 l0,-52.78860922697461" class="basic label-container" style="" label-offset-y="13.788609226974607" transform="translate(-76.8671875, -40.18291384046191)"/><g class="label" style="" transform="translate(-69.3671875, -2)"><rect/><foreignObject width="138.734375" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>Routers: status grid</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-Events-5" transform="translate(737.75390625, 395.16098403930664)"><path d="M0,14.493039138429209 a86.2109375,14.493039138429209 0,0,0 172.421875,0 a86.2109375,14.493039138429209 0,0,0 -172.421875,0 l0,53.49303913842921 a86.2109375,14.493039138429209 0,0,0 172.421875,0 l0,-53.49303913842921" class="basic label-container" style="" label-offset-y="14.493039138429209" transform="translate(-86.2109375, -41.239558707643816)"/><g class="label" style="" transform="translate(-78.7109375, -2)"><rect/><foreignObject width="157.421875" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>Events: filterable table</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-Commands-6" transform="translate(981.46484375, 395.16098403930664)"><path d="M0,15.808823529411764 a107.5,15.808823529411764 0,0,0 215,0 a107.5,15.808823529411764 0,0,0 -215,0 l0,78.80882352941177 a107.5,15.808823529411764 0,0,0 215,0 l0,-78.80882352941177" class="basic label-container" style="" label-offset-y="15.808823529411764" transform="translate(-107.5, -55.21323529411765)"/><g class="label" style="" transform="translate(-100, -14)"><rect/><foreignObject width="200" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table; white-space: break-spaces; line-height: 1.5; max-width: 200px; text-align: center; width: 200px;"><span class="nodeLabel "><p>Commands: console + history</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-Alerts-7" transform="translate(1190.48828125, 395.16098403930664)"><path d="M0,11.296676944158959 a51.5234375,11.296676944158959 0,0,0 103.046875,0 a51.5234375,11.296676944158959 0,0,0 -103.046875,0 l0,50.29667694415896 a51.5234375,11.296676944158959 0,0,0 103.046875,0 l0,-50.29667694415896" class="basic label-container" style="" label-offset-y="11.296676944158959" transform="translate(-51.5234375, -36.44501541623844)"/><g class="label" style="" transform="translate(-44.0234375, -2)"><rect/><foreignObject width="88.046875" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>Alerts: inbox</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-TanQ-8" transform="translate(737.75390625, 550.9070014953613)"><path d="M0,12.688519544475223 a64.4140625,12.688519544475223 0,0,0 128.828125,0 a64.4140625,12.688519544475223 0,0,0 -128.828125,0 l0,75.68851954447523 a64.4140625,12.688519544475223 0,0,0 128.828125,0 l0,-75.68851954447523" class="basic label-container" style="" label-offset-y="12.688519544475223" transform="translate(-64.4140625, -50.53277931671283)"/><g class="label" style="" transform="translate(-56.9140625, -14)"><rect/><foreignObject width="113.828125" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>TanStack Query<br />data fetching</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-SSEClient-9" transform="translate(1169.14453125, 703.685619354248)"><path d="M0,13.457320944191148 a72.8671875,13.457320944191148 0,0,0 145.734375,0 a72.8671875,13.457320944191148 0,0,0 -145.734375,0 l0,76.45732094419114 a72.8671875,13.457320944191148 0,0,0 145.734375,0 l0,-76.45732094419114" class="basic label-container" style="" label-offset-y="13.457320944191148" transform="translate(-72.8671875, -51.685981416286715)"/><g class="label" style="" transform="translate(-65.3671875, -14)"><rect/><foreignObject width="130.734375" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>EventSource<br />/api/events/stream</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-API-10" transform="translate(224.78125, 703.685619354248)"><path d="M0,13.830559588964592 a77.390625,13.830559588964592 0,0,0 154.78125,0 a77.390625,13.830559588964592 0,0,0 -154.78125,0 l0,76.83055958896459 a77.390625,13.830559588964592 0,0,0 154.78125,0 l0,-76.83055958896459" class="basic label-container" style="" label-offset-y="13.830559588964592" transform="translate(-77.390625, -52.245839383446885)"/><g class="label" style="" transform="translate(-69.890625, -14)"><rect/><foreignObject width="139.78125" height="48"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>lib/api.ts<br />fetch + JWT header</p></span></div></foreignObject></g></g><g class="node default " id="flowchart-GoServer-32" transform="translate(737.75390625, 893.5299339294434)"><path d="M0,12.732319205054285 a64.8671875,12.732319205054285 0,0,0 129.734375,0 a64.8671875,12.732319205054285 0,0,0 -129.734375,0 l0,51.73231920505428 a64.8671875,12.732319205054285 0,0,0 129.734375,0 l0,-51.73231920505428" class="basic label-container" style="" label-offset-y="12.732319205054285" transform="translate(-64.8671875, -38.59847880758143)"/><g class="label" style="" transform="translate(-57.3671875, -2)"><rect/><foreignObject width="114.734375" height="24"><div xmlns="http://www.w3.org/1999/xhtml" style="display: table-cell; white-space: nowrap; line-height: 1.5; max-width: 200px; text-align: center;"><span class="nodeLabel "><p>Go server :3843</p></span></div></foreignObject></g></g></g></g></g></svg>