Files
the-biergarten-app/tooling/pipeline/diagrams/planned/output/biergarten_activity.svg
2026-04-27 18:47:39 -04:00

1 line
106 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="ACTIVITY" height="5277px" preserveAspectRatio="none" style="width:3817px;height:5277px;background:#040404;" version="1.1" viewBox="0 0 3817 5277" width="3817px" zoomAndPan="magnify"><title>The Biergarten Data Pipeline &#8212; Activity Diagram</title><defs/><g><rect fill="#040404" height="5277" style="stroke:none;stroke-width:1;" width="3817" x="0" y="0"/><g class="title" data-source-line="23"><text fill="#EAEAEA" font-family="'Volkhov'" font-size="20" font-weight="bold" lengthAdjust="spacing" textLength="486.14" x="1664.1863" y="39.42">The Biergarten Data Pipeline &#8212; Activity Diagram</text></g><rect fill="none" height="16.926" style="stroke:none;stroke-width:1;" width="3784.5126" x="15" y="59.33"/><ellipse cx="161.2959" cy="91.256" fill="#151515" rx="10" ry="10" style="stroke:#DDDDDD;stroke-width:1;"/><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="187.59" x="67.5009" y="121.256"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="167.59" x="77.5009" y="144.152">ParseArguments(argc, argv)</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="95.4522" x="113.5698" y="228.645"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="75.4522" x="123.5698" y="251.541">spdlog::error</text><ellipse cx="161.2959" cy="303.608" fill="none" rx="11" ry="11" style="stroke:#AFAFAF;stroke-width:1;"/><ellipse cx="161.2959" cy="303.608" fill="#DDDDDD" rx="6" ry="6" style="stroke:#AFAFAF;stroke-width:1;"/><polygon fill="#333333" points="124.0443,178.182,198.5475,178.182,210.5475,190.182,198.5475,202.182,124.0443,202.182,112.0443,190.182,124.0443,178.182" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="165.2959" y="215.078">yes</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="74.5032" x="124.0443" y="194.615">Invalid args?</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="210.5475" y="186.152">no</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="273.4256" x="24.5831" y="356.608"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="253.4256" x="34.5831" y="379.504">Init CurlGlobalState &amp; LlamaBackendState</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="114.5036" x="104.0441" y="413.534"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="94.5036" x="114.0441" y="436.43">Build DI injector</text><path d="M276.2738,460.46 L276.2738,486.849 L256.2738,490.849 L276.2738,494.849 L276.2738,521.238 A0,0 0 0 0 276.2738,521.238 L473.4405,521.238 A0,0 0 0 0 473.4405,521.238 L473.4405,470.46 L463.4405,460.46 L276.2738,460.46 A0,0 0 0 0 276.2738,460.46" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><path d="M463.4405,460.46 L463.4405,470.46 L473.4405,470.46 L463.4405,460.46" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="157.3748" x="282.2738" y="478.356">Opens SQLite connection.</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="160.5016" x="282.2738" y="495.282">Begins a single transaction</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="176.1667" x="282.2738" y="512.208">covering all five fixture types.</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="189.9558" x="66.318" y="472.386"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="169.9558" x="76.318" y="495.282">Initialize SqliteExportService</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="280.5918" x="21" y="541.238"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="260.5918" x="31" y="564.134">Create BoundedChannel&lt;LogEntry&gt; log_ch</text><path d="M269.3659,588.164 L269.3659,623.016 L249.3659,627.016 L269.3659,631.016 L269.3659,665.868 A0,0 0 0 0 269.3659,665.868 L550.3176,665.868 A0,0 0 0 0 550.3176,665.868 L550.3176,598.164 L540.3176,588.164 L269.3659,588.164 A0,0 0 0 0 269.3659,588.164" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><path d="M540.3176,588.164 L540.3176,598.164 L550.3176,598.164 L540.3176,588.164" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="195.644" x="275.3659" y="606.06">Log worker drains log_ch for the</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="137.3777" x="275.3659" y="622.986">entire pipeline lifetime.</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="199.83" x="275.3659" y="639.912">All workers emit LogEntry structs</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="259.9517" x="275.3659" y="656.838">via PipelineLogger -- never spdlog directly.</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="176.1401" x="73.2258" y="608.553"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="156.1401" x="83.2258" y="631.449">Spawn Log Worker thread</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="245.1019" x="38.7449" y="685.868"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="225.1019" x="48.7449" y="708.764">BiergartenPipelineOrchestrator::Run()</text><path d="M274.132,5017.5561 L274.132,5027.0191 L254.132,5031.0191 L274.132,5035.0191 L274.132,5044.4821 A0,0 0 0 0 274.132,5044.4821 L515.0663,5044.4821 A0,0 0 0 0 515.0663,5044.4821 L515.0663,5027.5561 L505.0663,5017.5561 L274.132,5017.5561 A0,0 0 0 0 274.132,5017.5561" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><path d="M505.0663,5017.5561 L505.0663,5027.5561 L515.0663,5027.5561 L505.0663,5017.5561" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="219.9343" x="280.132" y="5035.4521">COMMIT covers all five fixture types.</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="185.6723" x="68.4597" y="5012.5561"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="165.6723" x="78.4597" y="5035.4521">Finalize SqliteExportService</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="98.6565" x="111.9676" y="5069.4821"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="78.6565" x="121.9676" y="5092.3781">Close log_ch</text><path d="M239.9794,5122.9451 L239.9794,5140.8711 L219.9794,5144.8711 L239.9794,5148.8711 L239.9794,5166.7971 A0,0 0 0 0 239.9794,5166.7971 L452.2715,5166.7971 A0,0 0 0 0 452.2715,5166.7971 L452.2715,5132.9451 L442.2715,5122.9451 L239.9794,5122.9451 A0,0 0 0 0 239.9794,5122.9451" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><path d="M442.2715,5122.9451 L442.2715,5132.9451 L452.2715,5132.9451 L442.2715,5122.9451" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="191.2921" x="245.9794" y="5140.8411">Drain guarantees no LogEntry is</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="133.9327" x="245.9794" y="5157.7671">dropped at shutdown.</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="117.3669" x="102.6124" y="5126.4081"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="97.3669" x="112.6124" y="5149.3041">Join Log Worker</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="254.6731" x="33.9594" y="5186.7971"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="234.6731" x="43.9594" y="5209.6931">spdlog::info "Pipeline complete in X ms"</text><ellipse cx="161.2959" cy="5254.7231" fill="none" rx="11" ry="11" style="stroke:#AFAFAF;stroke-width:1;"/><ellipse cx="161.2959" cy="5254.7231" fill="#DDDDDD" rx="6" ry="6" style="stroke:#AFAFAF;stroke-width:1;"/><line style="stroke:#AFAFAF;stroke-width:1;" x1="15" x2="15" y1="59.33" y2="5265.7231"/><rect fill="#AAAAAA" height="6" rx="2.5" ry="2.5" style="stroke:#AAAAAA;stroke-width:1;" width="835.4839" x="561.3176" y="742.794"/><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="304.4079" x="607.4182" y="768.794"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="284.4079" x="617.4182" y="791.69">JsonLoader::LoadBeerStyles("beer-styles.json")</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="372.6092" x="573.3176" y="825.72"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="352.6092" x="583.3176" y="848.616">EnrichmentService::PreWarmBeerStyleCache(beer_styles)</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="283.8713" x="1037.4285" y="768.794"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="263.8713" x="1047.4285" y="791.69">JsonLoader::LoadLocations("locations.json")</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="410.8747" x="973.9268" y="825.72"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="390.8747" x="983.9268" y="848.616">EnrichmentService::PreWarmLocationCache(sampled_locations)</text><rect fill="#AAAAAA" height="6" rx="2.5" ry="2.5" style="stroke:#AAAAAA;stroke-width:1;" width="835.4839" x="561.3176" y="882.646"/><rect fill="#AAAAAA" height="6" rx="2.5" ry="2.5" style="stroke:#AAAAAA;stroke-width:1;" width="728.7923" x="614.6634" y="908.646"/><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="392.2328" x="628.6634" y="934.646"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="372.2328" x="638.6634" y="957.542">JsonLoader::LoadNamesByCountry("names-by-country.json")</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="280.5595" x="1048.8962" y="934.646"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="260.5595" x="1058.8962" y="957.542">JsonLoader::LoadPersonas("personas.json")</text><rect fill="#AAAAAA" height="6" rx="2.5" ry="2.5" style="stroke:#AAAAAA;stroke-width:1;" width="728.7923" x="614.6634" y="991.572"/><line style="stroke:#AFAFAF;stroke-width:1;" x1="555.3176" x2="555.3176" y1="59.33" y2="5265.7231"/><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="230.9414" x="2015.1311" y="1017.572"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="210.9414" x="2025.1311" y="1040.468">RunUserPhase(sampled_locations)</text><rect fill="#151515" height="53.852" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="174.2744" x="2043.4646" y="1074.498"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="154.2744" x="2053.4646" y="1097.394">Create BoundedChannels</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="102.505" x="2053.4646" y="1114.32">(loc_ch, exp_ch)</text><rect fill="#AAAAAA" height="6" rx="2.5" ry="2.5" style="stroke:#AAAAAA;stroke-width:1;" width="1161.0874" x="1406.8015" y="1148.35"/><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="212.0816" x="1418.8015" y="1459.524"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="192.0816" x="1428.8015" y="1482.42">Loop: Send Locations -&gt; loc_ch</text><path d="M1594.2616,1531.45 L1594.2616,1557.839 L1574.2616,1561.839 L1594.2616,1565.839 L1594.2616,1592.228 A0,0 0 0 0 1594.2616,1592.228 L1799.0623,1592.228 A0,0 0 0 0 1799.0623,1592.228 L1799.0623,1541.45 L1789.0623,1531.45 L1594.2616,1531.45 A0,0 0 0 0 1594.2616,1531.45" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><path d="M1789.0623,1531.45 L1789.0623,1541.45 L1799.0623,1541.45 L1789.0623,1531.45" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="144.8039" x="1600.2616" y="1549.346">Producer closes loc_ch.</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="136.1004" x="1600.2616" y="1566.272">LLM Worker while loop</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="183.8007" x="1600.2616" y="1583.198">terminates on empty + closed.</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="98.8385" x="1475.4231" y="1543.376"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="78.8385" x="1485.4231" y="1566.272">Close loc_ch</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="213.3655" x="2023.919" y="1917.636"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="193.3655" x="2033.919" y="1940.532">Join LLM Worker, SQLite Worker</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="253.0675" x="2004.068" y="1974.562"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="233.0675" x="2014.068" y="1997.458">RunBreweryPhase(sampled_locations)</text><rect fill="#151515" height="53.852" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="174.2744" x="2043.4646" y="2031.488"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="154.2744" x="2053.4646" y="2054.384">Create BoundedChannels</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="102.505" x="2053.4646" y="2071.31">(loc_ch, exp_ch)</text><rect fill="#AAAAAA" height="6" rx="2.5" ry="2.5" style="stroke:#AAAAAA;stroke-width:1;" width="955.7542" x="1588.1348" y="2105.34"/><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="212.0816" x="1602.1348" y="2335.44"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="192.0816" x="1612.1348" y="2358.336">Loop: Send Locations -&gt; loc_ch</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="98.8385" x="1658.7564" y="2407.366"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="78.8385" x="1668.7564" y="2430.262">Close loc_ch</text><path d="M2257.2845,2685.922 L2257.2845,2703.848 L2237.2845,2707.848 L2257.2845,2711.848 L2257.2845,2729.774 A0,0 0 0 0 2257.2845,2729.774 L2509.688,2729.774 A0,0 0 0 0 2509.688,2729.774 L2509.688,2695.922 L2499.688,2685.922 L2257.2845,2685.922 A0,0 0 0 0 2257.2845,2685.922" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><path d="M2499.688,2685.922 L2499.688,2695.922 L2509.688,2695.922 L2499.688,2685.922" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="231.4035" x="2263.2845" y="2703.818">brewery_pool_ is now fully populated.</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="120.3964" x="2263.2845" y="2720.744">Phase 1b may begin.</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="213.3655" x="2023.919" y="2689.385"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="193.3655" x="2033.919" y="2712.281">Join LLM Worker, SQLite Worker</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="115.7419" x="2072.7308" y="2749.774"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="95.7419" x="2082.7308" y="2772.67">RunBeerPhase()</text><rect fill="#151515" height="53.852" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="174.2744" x="2043.4646" y="2806.7"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="154.2744" x="2053.4646" y="2829.596">Create BoundedChannels</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="114.712" x="2053.4646" y="2846.522">(brew_ch, exp_ch)</text><rect fill="#AAAAAA" height="6" rx="2.5" ry="2.5" style="stroke:#AAAAAA;stroke-width:1;" width="1001.1842" x="1554.7048" y="2880.552"/><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="224.4902" x="1568.7048" y="3243.967"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="204.4902" x="1578.7048" y="3266.863">Loop: Send Breweries -&gt; brew_ch</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="111.0456" x="1625.4271" y="3315.893"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="91.0456" x="1635.4271" y="3338.789">Close brew_ch</text><path d="M2257.2845,3719.32 L2257.2845,3737.246 L2237.2845,3741.246 L2257.2845,3745.246 L2257.2845,3763.172 A0,0 0 0 0 2257.2845,3763.172 L2504.1238,3763.172 A0,0 0 0 0 2504.1238,3763.172 L2504.1238,3729.32 L2494.1238,3719.32 L2257.2845,3719.32 A0,0 0 0 0 2257.2845,3719.32" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><path d="M2494.1238,3719.32 L2494.1238,3729.32 L2504.1238,3729.32 L2494.1238,3719.32" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="225.8393" x="2263.2845" y="3737.216">Both brewery_pool_ and beer_pool_</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="187.1287" x="2263.2845" y="3754.142">are now completely populated.</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="213.3655" x="2023.919" y="3722.783"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="193.3655" x="2033.919" y="3745.679">Join LLM Worker, SQLite Worker</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="137.0586" x="2062.0725" y="3783.172"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="117.0586" x="2072.0725" y="3806.068">RunCheckinPhase()</text><path d="M2268.0973,3836.635 L2268.0973,3863.024 L2248.0973,3867.024 L2268.0973,3871.024 L2268.0973,3897.413 A0,0 0 0 0 2268.0973,3897.413 L2531.889,3897.413 A0,0 0 0 0 2531.889,3897.413 L2531.889,3846.635 L2521.889,3836.635 L2268.0973,3836.635 A0,0 0 0 0 2268.0973,3836.635" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><path d="M2521.889,3836.635 L2521.889,3846.635 L2531.889,3846.635 L2521.889,3836.635" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="200.899" x="2274.0973" y="3854.531">Weights seeded from each user's</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="242.7917" x="2274.0973" y="3871.457">persona.checkin_weight. J-curve profile</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="212.6934" x="2274.0973" y="3888.383">emerges from persona distribution.</text><rect fill="#151515" height="53.852" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="234.991" x="2013.1063" y="3840.098"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="179.0656" x="2023.1063" y="3862.994">ICheckinDistributionStrategy::</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="214.991" x="2023.1063" y="3879.92">AssignActivityWeights(user_pool_)</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="292.2334" x="1984.4851" y="3975.8091"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="272.2334" x="1994.4851" y="3998.7051">CheckinsForUser(user, brewery_pool_.size())</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="181.5219" x="2039.8408" y="4091.1311"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="161.5219" x="2049.8408" y="4114.0271">TimestampFor(user, index)</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="239.6223" x="2010.7906" y="4148.0571"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="219.6223" x="2020.7906" y="4170.9531">Select brewery from brewery_pool_</text><rect fill="#151515" height="53.852" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="287.9727" x="1986.6154" y="4204.9831"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="267.9727" x="1996.6154" y="4227.8791">GenerateCheckin(user, brewery, timestamp)</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="110.263" x="1996.6154" y="4244.8051">via DataGenerator</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="173.2084" x="2043.9976" y="4285.8721"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="153.2084" x="2053.9976" y="4308.7681">ProcessCheckin(checkin)</text><rect fill="#151515" height="53.852" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="287.0855" x="1987.059" y="4342.7981"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="267.0855" x="1997.059" y="4365.6941">PipelineLogger::Log(Info, CheckinGeneration,</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="165.565" x="2003.975" y="4382.6201">nullopt, checkin_id, "sqlite")</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="179.4969" x="2040.8533" y="4416.6501"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="159.4969" x="2050.8533" y="4439.5461">Append -&gt; checkin_pool_</text><polygon fill="#333333" points="2057.8894,4032.7351,2203.3141,4032.7351,2215.3141,4044.7351,2203.3141,4056.7351,2057.8894,4056.7351,2045.8894,4044.7351,2057.8894,4032.7351" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="59.2411" x="2134.6018" y="4069.6311">remaining</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="145.4247" x="2057.8894" y="4049.1681">For each checkin index?</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="30.706" x="2015.1834" y="4040.7051">done</text><polygon fill="#333333" points="2009.7504,3917.413,2251.4532,3917.413,2263.4532,3929.413,2251.4532,3941.413,2009.7504,3941.413,1997.7504,3929.413,2009.7504,3917.413" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="59.2411" x="2134.6018" y="3954.3091">remaining</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="241.7028" x="2009.7504" y="3933.846">For each GeneratedUser in user_pool_?</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="30.706" x="1967.0444" y="3925.383">done</text><path d="M2213.6191,4507.5761 L2213.6191,4533.9651 L2193.6191,4537.9651 L2213.6191,4541.9651 L2213.6191,4568.3541 A0,0 0 0 0 2213.6191,4568.3541 L2501.3048,4568.3541 A0,0 0 0 0 2501.3048,4568.3541 L2501.3048,4517.5761 L2491.3048,4507.5761 L2213.6191,4507.5761 A0,0 0 0 0 2213.6191,4507.5761" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><path d="M2491.3048,4507.5761 L2491.3048,4517.5761 L2501.3048,4517.5761 L2491.3048,4507.5761" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="148.5804" x="2219.6191" y="4525.4721">Beer selection biased by</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="266.6857" x="2219.6191" y="4542.3981">user.persona.style_affinities and abv_range.</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="219.4598" x="2219.6191" y="4559.3241">Rating skew modulated per persona.</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="126.0347" x="2067.5844" y="4519.5021"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="106.0347" x="2077.5844" y="4542.3981">RunRatingPhase()</text><rect fill="#151515" height="53.852" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="311.5252" x="1974.8392" y="4646.7501"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="291.5252" x="1984.8392" y="4669.6461">Match brewery_id, select beer from beer_pool_</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="288.0478" x="1984.8392" y="4686.5721">(same brewery_id, biased by persona affinities)</text><polygon fill="#333333" points="2057.4425,4720.6021,2203.7611,4720.6021,2215.7611,4732.6021,2203.7611,4744.6021,2057.4425,4744.6021,2045.4425,4732.6021,2057.4425,4720.6021" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="146.3186" x="2057.4425" y="4737.0351">Beer exists for brewery?</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="2024.2947" y="4728.5721">yes</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="2215.7611" y="4728.5721">no</text><rect fill="#151515" height="53.852" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="256.0901" x="1852.2022" y="4754.6021"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="236.0901" x="1862.2022" y="4777.4981">GenerateRating(user, beer, checkin_id)</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="110.263" x="1862.2022" y="4794.4241">via DataGenerator</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="150.1336" x="1905.1804" y="4829.7781"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="130.1336" x="1915.1804" y="4852.6741">ProcessRating(rating)</text><rect fill="#151515" height="53.852" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="276.0616" x="1842.2164" y="4886.7041"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="256.0616" x="1852.2164" y="4909.6001">PipelineLogger::Log(Info, RatingGeneration,</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="153.5141" x="1859.1324" y="4926.5261">nullopt, rating_id, "sqlite")</text><rect fill="#151515" height="53.852" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="285.3566" x="2138.278" y="4754.6021"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="265.3566" x="2148.278" y="4777.4981">PipelineLogger::Log(Warn, RatingGeneration,</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="168.3958" x="2155.194" y="4794.4241">nullopt, brewery_id, "sqlite")</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="196.8815" x="2182.5156" y="4829.7781"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="176.8815" x="2192.5156" y="4852.6741">Skip -- brewery has no beers</text><polygon fill="#333333" points="2130.6018,4946.5561,2142.6018,4958.5561,2130.6018,4970.5561,2118.6018,4958.5561,2130.6018,4946.5561" style="stroke:#AFAFAF;stroke-width:0.5;"/><polygon fill="#333333" points="1988.6693,4588.3541,2272.5343,4588.3541,2284.5343,4600.3541,2272.5343,4612.3541,1988.6693,4612.3541,1976.6693,4600.3541,1988.6693,4588.3541" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="59.2411" x="2134.6018" y="4625.2501">remaining</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="283.865" x="1988.6693" y="4604.7871">For each GeneratedCheckin in checkin_pool_?</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="30.706" x="1945.9633" y="4596.3241">done</text><line style="stroke:#AFAFAF;stroke-width:1;" x1="1400.8015" x2="1400.8015" y1="59.33" y2="5265.7231"/><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="123.1779" x="2723.491" y="1232.746"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="103.1779" x="2733.491" y="1255.642">Receive Location</text><path d="M2940.6894,1294.672 L2940.6894,1304.135 L2920.6894,1308.135 L2940.6894,1312.135 L2940.6894,1321.598 A0,0 0 0 0 2940.6894,1321.598 L3175.0264,1321.598 A0,0 0 0 0 3175.0264,1321.598 L3175.0264,1304.672 L3165.0264,1294.672 L2940.6894,1294.672 A0,0 0 0 0 2940.6894,1294.672" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><path d="M3165.0264,1294.672 L3165.0264,1304.672 L3175.0264,1304.672 L3165.0264,1294.672" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="213.3369" x="2946.6894" y="1312.568">Guaranteed cache hit from startup.</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="271.2188" x="2649.4706" y="1289.672"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="251.2188" x="2659.4706" y="1312.568">GetLocationContextFromCache(location)</text><path d="M2942.7695,1346.894 L2942.7695,1381.746 L2922.7695,1385.746 L2942.7695,1389.746 L2942.7695,1424.598 A0,0 0 0 0 2942.7695,1424.598 L3177.1064,1424.598 A0,0 0 0 0 3177.1064,1424.598 L3177.1064,1356.894 L3167.1064,1346.894 L2942.7695,1346.894 A0,0 0 0 0 2942.7695,1346.894" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><path d="M3167.1064,1346.894 L3167.1064,1356.894 L3177.1064,1356.894 L3167.1064,1346.894" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="213.3369" x="2948.7695" y="1364.79">Guaranteed cache hit from startup.</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="201.4453" x="2948.7695" y="1381.716">Returns a Persona struct carrying</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="162.2598" x="2948.7695" y="1398.642">style_affinities, abv_range,</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="197.9643" x="2948.7695" y="1415.568">ibu_preference, checkin_weight.</text><rect fill="#151515" height="53.852" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="275.379" x="2647.3905" y="1358.82"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="255.379" x="2657.3905" y="1381.716">IPersonaSelectionStrategy::SelectPersona(</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="120.7278" x="2664.3065" y="1398.642">personas_palette_)</text><path d="M2912.7978,1459.598 L2912.7978,1485.987 L2892.7978,1489.987 L2912.7978,1493.987 L2912.7978,1520.376 A0,0 0 0 0 2912.7978,1520.376 L3179.4688,1520.376 A0,0 0 0 0 3179.4688,1520.376 L3179.4688,1469.598 L3169.4688,1459.598 L2912.7978,1459.598 A0,0 0 0 0 2912.7978,1459.598" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><path d="M3169.4688,1459.598 L3169.4688,1469.598 L3179.4688,1469.598 L3169.4688,1459.598" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="245.671" x="2918.7978" y="1477.494">Deterministic lookup -- no LLM involved.</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="224.3249" x="2918.7978" y="1494.42">Name selected from pre-keyed table</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="239.9088" x="2918.7978" y="1511.346">and passed into the generation prompt.</text><rect fill="#151515" height="53.852" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="215.4356" x="2677.3622" y="1463.061"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="195.4356" x="2687.3622" y="1485.957">NamesByCountry::SampleName(</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="113.9809" x="2694.2782" y="1502.883">location.iso3166_1)</text><path d="M2981.4037,1555.376 L2981.4037,1590.228 L2961.4037,1594.228 L2981.4037,1598.228 L2981.4037,1633.08 A0,0 0 0 0 2981.4037,1633.08 L3278.6476,1633.08 A0,0 0 0 0 3278.6476,1633.08 L3278.6476,1565.376 L3268.6476,1555.376 L2981.4037,1555.376 A0,0 0 0 0 2981.4037,1555.376" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><path d="M3268.6476,1555.376 L3268.6476,1565.376 L3278.6476,1565.376 L3268.6476,1555.376" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="276.2438" x="2987.4037" y="1573.272">LLM receives: EnrichedCity context + persona</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="240.7473" x="2987.4037" y="1590.198">description + sampled name. Generates</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="221.3189" x="2987.4037" y="1607.124">bio and preference signals grounded</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="130.7184" x="2987.4037" y="1624.05">in locale and persona.</text><rect fill="#151515" height="53.852" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="352.6475" x="2608.7562" y="1567.302"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="332.6475" x="2618.7562" y="1590.198">GenerateUser(enriched_city, persona, sampled_name)</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="110.263" x="2618.7562" y="1607.124">via DataGenerator</text><rect fill="#151515" height="53.852" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="265.5933" x="2652.2833" y="1668.08"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="245.5933" x="2662.2833" y="1690.976">PipelineLogger::Log(Info, UserGeneration,</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="110.3182" x="2669.1994" y="1707.902">city, user_id, "llm")</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="212.4033" x="2678.8783" y="1741.932"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="192.4033" x="2688.8783" y="1764.828">Send GeneratedUser -&gt; exp_ch</text><polygon fill="#333333" points="2730.0655,1174.35,2840.0944,1174.35,2852.0944,1186.35,2840.0944,1198.35,2730.0655,1198.35,2718.0655,1186.35,2730.0655,1174.35" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="2789.08" y="1211.246">yes</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="110.0289" x="2730.0655" y="1190.783">loc_ch has items?</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="2702.8978" y="1182.32">no</text><path d="M2856.4687,1810.858 L2856.4687,1837.247 L2836.4687,1841.247 L2856.4687,1845.247 L2856.4687,1871.636 A0,0 0 0 0 2856.4687,1871.636 L3061.2694,1871.636 A0,0 0 0 0 3061.2694,1871.636 L3061.2694,1820.858 L3051.2694,1810.858 L2856.4687,1810.858 A0,0 0 0 0 2856.4687,1810.858" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><path d="M3051.2694,1810.858 L3051.2694,1820.858 L3061.2694,1820.858 L3051.2694,1810.858" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="148.7429" x="2862.4687" y="1828.754">Producer closes exp_ch.</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="151.5184" x="2862.4687" y="1845.68">SQLite Worker while loop</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="183.8007" x="2862.4687" y="1862.606">terminates on empty + closed.</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="102.7775" x="2733.6913" y="1822.784"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="82.7775" x="2743.6913" y="1845.68">Close exp_ch</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="123.1779" x="2698.6263" y="2189.736"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="103.1779" x="2708.6263" y="2212.632">Receive Location</text><path d="M2915.8247,2266.662 L2915.8247,2276.125 L2895.8247,2280.125 L2915.8247,2284.125 L2915.8247,2293.588 A0,0 0 0 0 2915.8247,2293.588 L3150.1617,2293.588 A0,0 0 0 0 3150.1617,2293.588 L3150.1617,2276.662 L3140.1617,2266.662 L2915.8247,2266.662 A0,0 0 0 0 2915.8247,2266.662" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><path d="M3140.1617,2266.662 L3140.1617,2276.662 L3150.1617,2276.662 L3140.1617,2266.662" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="213.3369" x="2921.8247" y="2284.558">Guaranteed cache hit from startup.</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="271.2188" x="2624.6059" y="2261.662"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="251.2188" x="2634.6059" y="2284.558">GetLocationContextFromCache(location)</text><path d="M2916.5202,2327.051 L2916.5202,2353.44 L2896.5202,2357.44 L2916.5202,2361.44 L2916.5202,2387.829 A0,0 0 0 0 2916.5202,2387.829 L3176.1973,2387.829 A0,0 0 0 0 3176.1973,2387.829 L3176.1973,2337.051 L3166.1973,2327.051 L2916.5202,2327.051 A0,0 0 0 0 2916.5202,2327.051" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><path d="M3166.1973,2327.051 L3166.1973,2337.051 L3176.1973,2337.051 L3166.1973,2327.051" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="189.1634" x="2922.5202" y="2344.947">KV cache stays warm across all</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="238.6771" x="2922.5202" y="2361.873">brewery generations -- system prompt</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="208.9429" x="2922.5202" y="2378.799">does not change within this phase.</text><rect fill="#151515" height="53.852" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="272.6099" x="2623.9104" y="2330.514"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="252.6099" x="2633.9104" y="2353.41">GenerateBrewery(enriched_city, context)</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="110.263" x="2633.9104" y="2370.336">via DataGenerator</text><rect fill="#151515" height="70.778" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="165.1811" x="2677.6248" y="2422.829"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="145.1811" x="2687.6248" y="2445.725">PipelineLogger::Log(Info,</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="119.0803" x="2694.5408" y="2462.651">BreweryGeneration,</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="133.819" x="2694.5408" y="2479.577">city, brewery_id, "llm")</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="234.5294" x="2642.9506" y="2525.533"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="214.5294" x="2652.9506" y="2548.429">Send GeneratedBrewery -&gt; exp_ch</text><polygon fill="#333333" points="2705.2009,2131.34,2815.2297,2131.34,2827.2297,2143.34,2815.2297,2155.34,2705.2009,2155.34,2693.2009,2143.34,2705.2009,2131.34" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="2764.2153" y="2168.236">yes</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="110.0289" x="2705.2009" y="2147.773">loc_ch has items?</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="2678.0331" y="2139.31">no</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="102.7775" x="2708.8266" y="2606.459"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="82.7775" x="2718.8266" y="2629.355">Close exp_ch</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="184.7103" x="2661.235" y="2964.948"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="164.7103" x="2671.235" y="2987.844">Receive GeneratedBrewery</text><rect fill="#151515" height="53.852" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="242.4597" x="2632.3603" y="3021.874"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="222.4597" x="2642.3603" y="3044.77">IBeerSelectionStrategy::SelectStyles(</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="186.0366" x="2649.2763" y="3061.696">brewery, beer_style_palette_)</text><path d="M2888.3784,3175.652 L2888.3784,3210.504 L2868.3784,3214.504 L2888.3784,3218.504 L2888.3784,3253.356 A0,0 0 0 0 2888.3784,3253.356 L3126.1049,3253.356 A0,0 0 0 0 3126.1049,3253.356 L3126.1049,3185.652 L3116.1049,3175.652 L2888.3784,3175.652 A0,0 0 0 0 2888.3784,3175.652" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><path d="M3116.1049,3175.652 L3116.1049,3185.652 L3126.1049,3185.652 L3116.1049,3175.652" fill="#191919" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="213.3369" x="2894.3784" y="3193.548">Guaranteed cache hit from startup.</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="189.1634" x="2894.3784" y="3210.474">KV cache stays warm across all</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="216.7265" x="2894.3784" y="3227.4">beer generations -- system prompt</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="208.9429" x="2894.3784" y="3244.326">does not change within this phase.</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="229.5765" x="2638.8019" y="3196.041"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="209.5765" x="2648.8019" y="3218.937">GetStyleContextFromCache(style)</text><rect fill="#151515" height="53.852" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="253.4023" x="2626.889" y="3288.356"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="233.4023" x="2636.889" y="3311.252">GenerateBeer(brewery, style_context)</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="110.263" x="2636.889" y="3328.178">via DataGenerator</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="217.4865" x="2644.8469" y="3374.171"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="197.4865" x="2654.8469" y="3397.067">Attach GeneratedBeer to bundle</text><polygon fill="#333333" points="2665.6612,3110.726,2841.519,3110.726,2853.519,3122.726,2841.519,3134.726,2665.6612,3134.726,2653.6612,3122.726,2665.6612,3110.726" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="59.2411" x="2757.5901" y="3147.622">remaining</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="175.8578" x="2665.6612" y="3127.159">For each selected BeerStyle?</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="30.706" x="2622.9552" y="3118.696">done</text><rect fill="#151515" height="70.778" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="165.1811" x="2670.9996" y="3455.801"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="145.1811" x="2680.9996" y="3478.697">PipelineLogger::Log(Info,</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="97.1297" x="2687.9156" y="3495.623">BeerGeneration,</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="133.819" x="2687.9156" y="3512.549">city, brewery_id, "llm")</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="195.6918" x="2655.7442" y="3560.931"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="175.6918" x="2665.7442" y="3583.827">Send BeersBundle -&gt; exp_ch</text><polygon fill="#333333" points="2692.4721,2906.552,2814.7081,2906.552,2826.7081,2918.552,2814.7081,2930.552,2692.4721,2930.552,2680.4721,2918.552,2692.4721,2906.552" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="2757.5901" y="2943.448">yes</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="122.2359" x="2692.4721" y="2922.985">brew_ch has items?</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="2665.3044" y="2914.522">no</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="102.7775" x="2702.2014" y="3639.857"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="82.7775" x="2712.2014" y="3662.753">Close exp_ch</text><line style="stroke:#AFAFAF;stroke-width:1;" x1="2571.889" x2="2571.889" y1="59.33" y2="5265.7231"/><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="162.5842" x="3553.6949" y="1411.524"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="142.5842" x="3563.6949" y="1434.42">Receive GeneratedUser</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="131.0462" x="3569.4638" y="1483.45"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="111.0462" x="3579.4638" y="1506.346">ProcessUser(user)</text><rect fill="#151515" height="53.852" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="265.5933" x="3502.1903" y="1555.376"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="245.5933" x="3512.1903" y="1578.272">PipelineLogger::Log(Info, UserGeneration,</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="126.11" x="3519.1063" y="1595.198">city, user_id, "sqlite")</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="158.8269" x="3555.5735" y="1644.228"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="138.8269" x="3565.5735" y="1667.124">Append -&gt; user_pool_</text><polygon fill="#333333" points="3578.003,1346.598,3691.9708,1346.598,3703.9708,1358.598,3691.9708,1370.598,3578.003,1370.598,3566.003,1358.598,3578.003,1346.598" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="3638.9869" y="1383.494">yes</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="113.9678" x="3578.003" y="1363.031">exp_ch has items?</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="3550.8353" y="1354.568">no</text><rect fill="#AAAAAA" height="6" rx="2.5" ry="2.5" style="stroke:#AAAAAA;stroke-width:1;" width="478.136" x="3315.6476" y="1891.636"/><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="184.7103" x="3399.7401" y="2273.588"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="164.7103" x="3409.7401" y="2296.484">Receive GeneratedBrewery</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="176.6731" x="3403.7586" y="2338.977"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="156.6731" x="3413.7586" y="2361.873">ProcessBrewery(brewery)</text><rect fill="#151515" height="70.778" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="176.5268" x="3403.8318" y="2410.903"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="145.1811" x="3413.8318" y="2433.799">PipelineLogger::Log(Info,</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="119.0803" x="3420.7478" y="2450.725">BreweryGeneration,</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="149.6108" x="3420.7478" y="2467.651">city, brewery_id, "sqlite")</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="182.3278" x="3400.9313" y="2513.607"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="162.3278" x="3410.9313" y="2536.503">Append -&gt; brewery_pool_</text><polygon fill="#333333" points="3435.1113,2208.662,3549.0791,2208.662,3561.0791,2220.662,3549.0791,2232.662,3435.1113,2232.662,3423.1113,2220.662,3435.1113,2208.662" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="3496.0952" y="2245.558">yes</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="113.9678" x="3435.1113" y="2225.095">exp_ch has items?</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="3407.9435" y="2216.632">no</text><rect fill="#AAAAAA" height="6" rx="2.5" ry="2.5" style="stroke:#AAAAAA;stroke-width:1;" width="270.8027" x="3339.6476" y="2663.385"/><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="145.8726" x="3422.8276" y="3095.152"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="125.8726" x="3432.8276" y="3118.048">Receive BeersBundle</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="220.2327" x="3385.6476" y="3232.004"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="200.2327" x="3395.6476" y="3254.9">Set beer.brewery_id from bundle</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="132.7719" x="3429.378" y="3303.93"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="112.7719" x="3439.378" y="3326.826">ProcessBeer(beer)</text><rect fill="#151515" height="36.926" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="160.3772" x="3415.5754" y="3372.819"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="140.3772" x="3425.5754" y="3395.715">Append -&gt; beer_pool_</text><polygon fill="#333333" points="3421.1325,3167.078,3570.3954,3167.078,3582.3954,3179.078,3570.3954,3191.078,3421.1325,3191.078,3409.1325,3179.078,3421.1325,3167.078" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="59.2411" x="3499.7639" y="3203.974">remaining</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="149.263" x="3421.1325" y="3183.511">For each beer in bundle?</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="30.706" x="3378.4265" y="3175.048">done</text><rect fill="#151515" height="70.778" rx="12.5" ry="12.5" style="stroke:#AFAFAF;stroke-width:0.5;" width="176.5268" x="3407.5005" y="3454.449"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="145.1811" x="3417.5005" y="3477.345">PipelineLogger::Log(Info,</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="97.1297" x="3424.4165" y="3494.271">BeerGeneration,</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="149.6108" x="3424.4165" y="3511.197">city, brewery_id, "sqlite")</text><polygon fill="#333333" points="3438.78,3030.226,3552.7479,3030.226,3564.7479,3042.226,3552.7479,3054.226,3438.78,3054.226,3426.78,3042.226,3438.78,3030.226" style="stroke:#AFAFAF;stroke-width:0.5;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="3499.7639" y="3067.122">yes</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="113.9678" x="3438.78" y="3046.659">exp_ch has items?</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="3411.6123" y="3038.196">no</text><rect fill="#AAAAAA" height="6" rx="2.5" ry="2.5" style="stroke:#AAAAAA;stroke-width:1;" width="316.2327" x="3327.6476" y="3696.783"/><line style="stroke:#AFAFAF;stroke-width:1;" x1="3309.6476" x2="3309.6476" y1="59.33" y2="5265.7231"/><line style="stroke:#AFAFAF;stroke-width:1;" x1="3798.7836" x2="3798.7836" y1="59.33" y2="5265.7231"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="161.2959" x2="161.2959" y1="101.256" y2="121.256"/><polygon fill="#9A9A9A" points="157.2959,111.256,161.2959,121.256,165.2959,111.256,161.2959,115.256" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="161.2959" x2="161.2959" y1="265.571" y2="292.608"/><polygon fill="#9A9A9A" points="157.2959,282.608,161.2959,292.608,165.2959,282.608,161.2959,286.608" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="161.2959" x2="161.2959" y1="202.182" y2="228.645"/><polygon fill="#9A9A9A" points="157.2959,218.645,161.2959,228.645,165.2959,218.645,161.2959,222.645" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="210.5475" x2="222.5475" y1="190.182" y2="190.182"/><polygon fill="#9A9A9A" points="218.5475,262.608,222.5475,272.608,226.5475,262.608,222.5475,266.608" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="222.5475" x2="222.5475" y1="190.182" y2="336.608"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="222.5475" x2="161.2959" y1="336.608" y2="336.608"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="161.2959" x2="161.2959" y1="336.608" y2="356.608"/><polygon fill="#9A9A9A" points="157.2959,346.608,161.2959,356.608,165.2959,346.608,161.2959,350.608" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="161.2959" x2="161.2959" y1="158.182" y2="178.182"/><polygon fill="#9A9A9A" points="157.2959,168.182,161.2959,178.182,165.2959,168.182,161.2959,172.182" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="161.2959" x2="161.2959" y1="393.534" y2="413.534"/><polygon fill="#9A9A9A" points="157.2959,403.534,161.2959,413.534,165.2959,403.534,161.2959,407.534" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="161.2959" x2="161.2959" y1="450.46" y2="472.386"/><polygon fill="#9A9A9A" points="157.2959,462.386,161.2959,472.386,165.2959,462.386,161.2959,466.386" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="161.2959" x2="161.2959" y1="509.312" y2="541.238"/><polygon fill="#9A9A9A" points="157.2959,531.238,161.2959,541.238,165.2959,531.238,161.2959,535.238" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="161.2959" x2="161.2959" y1="578.164" y2="608.553"/><polygon fill="#9A9A9A" points="157.2959,598.553,161.2959,608.553,165.2959,598.553,161.2959,602.553" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="161.2959" x2="161.2959" y1="645.479" y2="685.868"/><polygon fill="#9A9A9A" points="157.2959,675.868,161.2959,685.868,165.2959,675.868,161.2959,679.868" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="161.2959" x2="161.2959" y1="5049.4821" y2="5069.4821"/><polygon fill="#9A9A9A" points="157.2959,5059.4821,161.2959,5069.4821,165.2959,5059.4821,161.2959,5063.4821" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="161.2959" x2="161.2959" y1="5106.4081" y2="5126.4081"/><polygon fill="#9A9A9A" points="157.2959,5116.4081,161.2959,5126.4081,165.2959,5116.4081,161.2959,5120.4081" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="161.2959" x2="161.2959" y1="5163.3341" y2="5186.7971"/><polygon fill="#9A9A9A" points="157.2959,5176.7971,161.2959,5186.7971,165.2959,5176.7971,161.2959,5180.7971" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="161.2959" x2="161.2959" y1="5223.7231" y2="5243.7231"/><polygon fill="#9A9A9A" points="157.2959,5233.7231,161.2959,5243.7231,165.2959,5233.7231,161.2959,5237.7231" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="759.6222" x2="759.6222" y1="805.72" y2="825.72"/><polygon fill="#9A9A9A" points="755.6222,815.72,759.6222,825.72,763.6222,815.72,759.6222,819.72" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1179.3642" x2="1179.3642" y1="805.72" y2="825.72"/><polygon fill="#9A9A9A" points="1175.3642,815.72,1179.3642,825.72,1183.3642,815.72,1179.3642,819.72" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="759.6222" x2="759.6222" y1="748.794" y2="768.794"/><polygon fill="#9A9A9A" points="755.6222,758.794,759.6222,768.794,763.6222,758.794,759.6222,762.794" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1179.3642" x2="1179.3642" y1="748.794" y2="768.794"/><polygon fill="#9A9A9A" points="1175.3642,758.794,1179.3642,768.794,1183.3642,758.794,1179.3642,762.794" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="759.6222" x2="759.6222" y1="862.646" y2="882.646"/><polygon fill="#9A9A9A" points="755.6222,872.646,759.6222,882.646,763.6222,872.646,759.6222,876.646" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1179.3642" x2="1179.3642" y1="862.646" y2="882.646"/><polygon fill="#9A9A9A" points="1175.3642,872.646,1179.3642,882.646,1183.3642,872.646,1179.3642,876.646" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="824.7798" x2="824.7798" y1="914.646" y2="934.646"/><polygon fill="#9A9A9A" points="820.7798,924.646,824.7798,934.646,828.7798,924.646,824.7798,928.646" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1189.1759" x2="1189.1759" y1="914.646" y2="934.646"/><polygon fill="#9A9A9A" points="1185.1759,924.646,1189.1759,934.646,1193.1759,924.646,1189.1759,928.646" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="824.7798" x2="824.7798" y1="971.572" y2="991.572"/><polygon fill="#9A9A9A" points="820.7798,981.572,824.7798,991.572,828.7798,981.572,824.7798,985.572" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1189.1759" x2="1189.1759" y1="971.572" y2="991.572"/><polygon fill="#9A9A9A" points="1185.1759,981.572,1189.1759,991.572,1193.1759,981.572,1189.1759,985.572" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="979.0596" x2="979.0596" y1="888.646" y2="908.646"/><polygon fill="#9A9A9A" points="975.0596,898.646,979.0596,908.646,983.0596,898.646,979.0596,902.646" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="1054.498" y2="1074.498"/><polygon fill="#9A9A9A" points="2126.6018,1064.498,2130.6018,1074.498,2134.6018,1064.498,2130.6018,1068.498" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1524.8423" x2="1524.8423" y1="1496.45" y2="1543.376"/><polygon fill="#9A9A9A" points="1520.8423,1533.376,1524.8423,1543.376,1528.8423,1533.376,1524.8423,1537.376" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1524.8423" x2="1524.8423" y1="1154.35" y2="1459.524"/><polygon fill="#9A9A9A" points="1520.8423,1449.524,1524.8423,1459.524,1528.8423,1449.524,1524.8423,1453.524" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="1128.35" y2="1148.35"/><polygon fill="#9A9A9A" points="2126.6018,1138.35,2130.6018,1148.35,2134.6018,1138.35,2130.6018,1142.35" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="1954.562" y2="1974.562"/><polygon fill="#9A9A9A" points="2126.6018,1964.562,2130.6018,1974.562,2134.6018,1964.562,2130.6018,1968.562" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="2011.488" y2="2031.488"/><polygon fill="#9A9A9A" points="2126.6018,2021.488,2130.6018,2031.488,2134.6018,2021.488,2130.6018,2025.488" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1708.1756" x2="1708.1756" y1="2372.366" y2="2407.366"/><polygon fill="#9A9A9A" points="1704.1756,2397.366,1708.1756,2407.366,1712.1756,2397.366,1708.1756,2401.366" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1708.1756" x2="1708.1756" y1="2111.34" y2="2335.44"/><polygon fill="#9A9A9A" points="1704.1756,2325.44,1708.1756,2335.44,1712.1756,2325.44,1708.1756,2329.44" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="2085.34" y2="2105.34"/><polygon fill="#9A9A9A" points="2126.6018,2095.34,2130.6018,2105.34,2134.6018,2095.34,2130.6018,2099.34" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="2726.311" y2="2749.774"/><polygon fill="#9A9A9A" points="2126.6018,2739.774,2130.6018,2749.774,2134.6018,2739.774,2130.6018,2743.774" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="2786.7" y2="2806.7"/><polygon fill="#9A9A9A" points="2126.6018,2796.7,2130.6018,2806.7,2134.6018,2796.7,2130.6018,2800.7" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1680.9499" x2="1680.9499" y1="3280.893" y2="3315.893"/><polygon fill="#9A9A9A" points="1676.9499,3305.893,1680.9499,3315.893,1684.9499,3305.893,1680.9499,3309.893" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1680.9499" x2="1680.9499" y1="2886.552" y2="3243.967"/><polygon fill="#9A9A9A" points="1676.9499,3233.967,1680.9499,3243.967,1684.9499,3233.967,1680.9499,3237.967" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="2860.552" y2="2880.552"/><polygon fill="#9A9A9A" points="2126.6018,2870.552,2130.6018,2880.552,2134.6018,2870.552,2130.6018,2874.552" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="3759.709" y2="3783.172"/><polygon fill="#9A9A9A" points="2126.6018,3773.172,2130.6018,3783.172,2134.6018,3773.172,2130.6018,3777.172" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="3820.098" y2="3840.098"/><polygon fill="#9A9A9A" points="2126.6018,3830.098,2130.6018,3840.098,2134.6018,3830.098,2130.6018,3834.098" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="4128.0571" y2="4148.0571"/><polygon fill="#9A9A9A" points="2126.6018,4138.0571,2130.6018,4148.0571,2134.6018,4138.0571,2130.6018,4142.0571" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="4184.9831" y2="4204.9831"/><polygon fill="#9A9A9A" points="2126.6018,4194.9831,2130.6018,4204.9831,2134.6018,4194.9831,2130.6018,4198.9831" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="4258.8351" y2="4285.8721"/><polygon fill="#9A9A9A" points="2126.6018,4275.8721,2130.6018,4285.8721,2134.6018,4275.8721,2130.6018,4279.8721" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="4322.7981" y2="4342.7981"/><polygon fill="#9A9A9A" points="2126.6018,4332.7981,2130.6018,4342.7981,2134.6018,4332.7981,2130.6018,4336.7981" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="4396.6501" y2="4416.6501"/><polygon fill="#9A9A9A" points="2126.6018,4406.6501,2130.6018,4416.6501,2134.6018,4406.6501,2130.6018,4410.6501" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="4056.7351" y2="4091.1311"/><polygon fill="#9A9A9A" points="2126.6018,4081.1311,2130.6018,4091.1311,2134.6018,4081.1311,2130.6018,4085.1311" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="4453.5761" y2="4463.5761"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2286.5881" y1="4463.5761" y2="4463.5761"/><polygon fill="#9A9A9A" points="2282.5881,4265.8721,2286.5881,4255.8721,2290.5881,4265.8721,2286.5881,4261.8721" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2286.5881" x2="2286.5881" y1="4044.7351" y2="4463.5761"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2286.5881" x2="2215.3141" y1="4044.7351" y2="4044.7351"/><polygon fill="#9A9A9A" points="2225.3141,4040.7351,2215.3141,4044.7351,2225.3141,4048.7351,2221.3141,4044.7351" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2045.8894" x2="1974.6154" y1="4044.7351" y2="4044.7351"/><polygon fill="#9A9A9A" points="1970.6154,4251.8721,1974.6154,4261.8721,1978.6154,4251.8721,1974.6154,4255.8721" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1974.6154" x2="1974.6154" y1="4044.7351" y2="4475.5761"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1974.6154" x2="2298.5881" y1="4475.5761" y2="4475.5761"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2298.5881" x2="2298.5881" y1="3929.413" y2="4475.5761"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2298.5881" x2="2263.4532" y1="3929.413" y2="3929.413"/><polygon fill="#9A9A9A" points="2273.4532,3925.413,2263.4532,3929.413,2273.4532,3933.413,2269.4532,3929.413" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="4012.7351" y2="4032.7351"/><polygon fill="#9A9A9A" points="2126.6018,4022.7351,2130.6018,4032.7351,2134.6018,4022.7351,2130.6018,4026.7351" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="3941.413" y2="3975.8091"/><polygon fill="#9A9A9A" points="2126.6018,3965.8091,2130.6018,3975.8091,2134.6018,3965.8091,2130.6018,3969.8091" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1997.7504" x2="1950.6154" y1="3929.413" y2="3929.413"/><polygon fill="#9A9A9A" points="1946.6154,4195.4461,1950.6154,4205.4461,1954.6154,4195.4461,1950.6154,4199.4461" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1950.6154" x2="1950.6154" y1="3929.413" y2="4497.5761"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1950.6154" x2="2130.6018" y1="4497.5761" y2="4497.5761"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="4497.5761" y2="4519.5021"/><polygon fill="#9A9A9A" points="2126.6018,4509.5021,2130.6018,4519.5021,2134.6018,4509.5021,2130.6018,4513.5021" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="3893.95" y2="3917.413"/><polygon fill="#9A9A9A" points="2126.6018,3907.413,2130.6018,3917.413,2134.6018,3907.413,2130.6018,3911.413" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1980.2472" x2="1980.2472" y1="4808.4541" y2="4829.7781"/><polygon fill="#9A9A9A" points="1976.2472,4819.7781,1980.2472,4829.7781,1984.2472,4819.7781,1980.2472,4823.7781" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1980.2472" x2="1980.2472" y1="4866.7041" y2="4886.7041"/><polygon fill="#9A9A9A" points="1976.2472,4876.7041,1980.2472,4886.7041,1984.2472,4876.7041,1980.2472,4880.7041" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2280.9563" x2="2280.9563" y1="4808.4541" y2="4829.7781"/><polygon fill="#9A9A9A" points="2276.9563,4819.7781,2280.9563,4829.7781,2284.9563,4819.7781,2280.9563,4823.7781" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2045.4425" x2="1980.2472" y1="4732.6021" y2="4732.6021"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1980.2472" x2="1980.2472" y1="4732.6021" y2="4754.6021"/><polygon fill="#9A9A9A" points="1976.2472,4744.6021,1980.2472,4754.6021,1984.2472,4744.6021,1980.2472,4748.6021" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2215.7611" x2="2280.9563" y1="4732.6021" y2="4732.6021"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2280.9563" x2="2280.9563" y1="4732.6021" y2="4754.6021"/><polygon fill="#9A9A9A" points="2276.9563,4744.6021,2280.9563,4754.6021,2284.9563,4744.6021,2280.9563,4748.6021" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1980.2472" x2="1980.2472" y1="4940.5561" y2="4958.5561"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1980.2472" x2="2118.6018" y1="4958.5561" y2="4958.5561"/><polygon fill="#9A9A9A" points="2108.6018,4954.5561,2118.6018,4958.5561,2108.6018,4962.5561,2112.6018,4958.5561" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2280.9563" x2="2280.9563" y1="4866.7041" y2="4958.5561"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2280.9563" x2="2142.6018" y1="4958.5561" y2="4958.5561"/><polygon fill="#9A9A9A" points="2152.6018,4954.5561,2142.6018,4958.5561,2152.6018,4962.5561,2148.6018,4958.5561" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="4700.6021" y2="4720.6021"/><polygon fill="#9A9A9A" points="2126.6018,4710.6021,2130.6018,4720.6021,2134.6018,4710.6021,2130.6018,4714.6021" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="4612.3541" y2="4646.7501"/><polygon fill="#9A9A9A" points="2126.6018,4636.7501,2130.6018,4646.7501,2134.6018,4636.7501,2130.6018,4640.7501" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="4970.5561" y2="4980.5561"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2445.6346" y1="4980.5561" y2="4980.5561"/><polygon fill="#9A9A9A" points="2441.6346,4805.0281,2445.6346,4795.0281,2449.6346,4805.0281,2445.6346,4801.0281" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2445.6346" x2="2445.6346" y1="4600.3541" y2="4980.5561"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2445.6346" x2="2284.5343" y1="4600.3541" y2="4600.3541"/><polygon fill="#9A9A9A" points="2294.5343,4596.3541,2284.5343,4600.3541,2294.5343,4604.3541,2290.5343,4600.3541" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1976.6693" x2="1828.2164" y1="4600.3541" y2="4600.3541"/><polygon fill="#9A9A9A" points="1824.2164,4799.7781,1828.2164,4809.7781,1832.2164,4799.7781,1828.2164,4803.7781" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1828.2164" x2="1828.2164" y1="4600.3541" y2="4997.5561"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1828.2164" x2="161.2959" y1="4997.5561" y2="4997.5561"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="161.2959" x2="161.2959" y1="4997.5561" y2="5012.5561"/><polygon fill="#9A9A9A" points="157.2959,5002.5561,161.2959,5012.5561,165.2959,5002.5561,161.2959,5006.5561" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="4556.4281" y2="4588.3541"/><polygon fill="#9A9A9A" points="2126.6018,4578.3541,2130.6018,4588.3541,2134.6018,4578.3541,2130.6018,4582.3541" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2785.08" x2="2785.08" y1="1269.672" y2="1289.672"/><polygon fill="#9A9A9A" points="2781.08,1279.672,2785.08,1289.672,2789.08,1279.672,2785.08,1283.672" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2785.08" x2="2785.08" y1="1326.598" y2="1358.82"/><polygon fill="#9A9A9A" points="2781.08,1348.82,2785.08,1358.82,2789.08,1348.82,2785.08,1352.82" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2785.08" x2="2785.08" y1="1412.672" y2="1463.061"/><polygon fill="#9A9A9A" points="2781.08,1453.061,2785.08,1463.061,2789.08,1453.061,2785.08,1457.061" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2785.08" x2="2785.08" y1="1516.913" y2="1567.302"/><polygon fill="#9A9A9A" points="2781.08,1557.302,2785.08,1567.302,2789.08,1557.302,2785.08,1561.302" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2785.08" x2="2785.08" y1="1621.154" y2="1668.08"/><polygon fill="#9A9A9A" points="2781.08,1658.08,2785.08,1668.08,2789.08,1658.08,2785.08,1662.08" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2785.08" x2="2785.08" y1="1721.932" y2="1741.932"/><polygon fill="#9A9A9A" points="2781.08,1731.932,2785.08,1741.932,2789.08,1731.932,2785.08,1735.932" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2785.08" x2="2785.08" y1="1198.35" y2="1232.746"/><polygon fill="#9A9A9A" points="2781.08,1222.746,2785.08,1232.746,2789.08,1222.746,2785.08,1226.746" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2785.08" x2="2785.08" y1="1778.858" y2="1788.858"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2785.08" x2="3290.6476" y1="1788.858" y2="1788.858"/><polygon fill="#9A9A9A" points="3286.6476,1487.987,3290.6476,1477.987,3294.6476,1487.987,3290.6476,1483.987" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3290.6476" x2="3290.6476" y1="1186.35" y2="1788.858"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3290.6476" x2="2852.0944" y1="1186.35" y2="1186.35"/><polygon fill="#9A9A9A" points="2862.0944,1182.35,2852.0944,1186.35,2862.0944,1190.35,2858.0944,1186.35" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2718.0655" x2="2596.7562" y1="1186.35" y2="1186.35"/><polygon fill="#9A9A9A" points="2592.7562,1473.987,2596.7562,1483.987,2600.7562,1473.987,2596.7562,1477.987" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2596.7562" x2="2596.7562" y1="1186.35" y2="1800.858"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2596.7562" x2="2785.08" y1="1800.858" y2="1800.858"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2785.08" x2="2785.08" y1="1800.858" y2="1822.784"/><polygon fill="#9A9A9A" points="2781.08,1812.784,2785.08,1822.784,2789.08,1812.784,2785.08,1816.784" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2760.2153" x2="2760.2153" y1="2226.662" y2="2261.662"/><polygon fill="#9A9A9A" points="2756.2153,2251.662,2760.2153,2261.662,2764.2153,2251.662,2760.2153,2255.662" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2760.2153" x2="2760.2153" y1="2298.588" y2="2330.514"/><polygon fill="#9A9A9A" points="2756.2153,2320.514,2760.2153,2330.514,2764.2153,2320.514,2760.2153,2324.514" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2760.2153" x2="2760.2153" y1="2384.366" y2="2422.829"/><polygon fill="#9A9A9A" points="2756.2153,2412.829,2760.2153,2422.829,2764.2153,2412.829,2760.2153,2416.829" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2760.2153" x2="2760.2153" y1="2493.607" y2="2525.533"/><polygon fill="#9A9A9A" points="2756.2153,2515.533,2760.2153,2525.533,2764.2153,2515.533,2760.2153,2519.533" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2760.2153" x2="2760.2153" y1="2155.34" y2="2189.736"/><polygon fill="#9A9A9A" points="2756.2153,2179.736,2760.2153,2189.736,2764.2153,2179.736,2760.2153,2183.736" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2760.2153" x2="2760.2153" y1="2562.459" y2="2574.459"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2760.2153" x2="3188.1973" y1="2574.459" y2="2574.459"/><polygon fill="#9A9A9A" points="3184.1973,2363.903,3188.1973,2353.903,3192.1973,2363.903,3188.1973,2359.903" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3188.1973" x2="3188.1973" y1="2143.34" y2="2574.459"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3188.1973" x2="2827.2297" y1="2143.34" y2="2143.34"/><polygon fill="#9A9A9A" points="2837.2297,2139.34,2827.2297,2143.34,2837.2297,2147.34,2833.2297,2143.34" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2693.2009" x2="2611.9104" y1="2143.34" y2="2143.34"/><polygon fill="#9A9A9A" points="2607.9104,2349.903,2611.9104,2359.903,2615.9104,2349.903,2611.9104,2353.903" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2611.9104" x2="2611.9104" y1="2143.34" y2="2586.459"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2611.9104" x2="2760.2153" y1="2586.459" y2="2586.459"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2760.2153" x2="2760.2153" y1="2586.459" y2="2606.459"/><polygon fill="#9A9A9A" points="2756.2153,2596.459,2760.2153,2606.459,2764.2153,2596.459,2760.2153,2600.459" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2753.5901" x2="2753.5901" y1="3001.874" y2="3021.874"/><polygon fill="#9A9A9A" points="2749.5901,3011.874,2753.5901,3021.874,2757.5901,3011.874,2753.5901,3015.874" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2753.5901" x2="2753.5901" y1="3232.967" y2="3288.356"/><polygon fill="#9A9A9A" points="2749.5901,3278.356,2753.5901,3288.356,2757.5901,3278.356,2753.5901,3282.356" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2753.5901" x2="2753.5901" y1="3342.208" y2="3374.171"/><polygon fill="#9A9A9A" points="2749.5901,3364.171,2753.5901,3374.171,2757.5901,3364.171,2753.5901,3368.171" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2753.5901" x2="2753.5901" y1="3134.726" y2="3196.041"/><polygon fill="#9A9A9A" points="2749.5901,3186.041,2753.5901,3196.041,2757.5901,3186.041,2753.5901,3190.041" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2753.5901" x2="2753.5901" y1="3411.097" y2="3422.449"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2753.5901" x2="3138.1049" y1="3422.449" y2="3422.449"/><polygon fill="#9A9A9A" points="3134.1049,3284.43,3138.1049,3274.43,3142.1049,3284.43,3138.1049,3280.43" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3138.1049" x2="3138.1049" y1="3122.726" y2="3422.449"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3138.1049" x2="2853.519" y1="3122.726" y2="3122.726"/><polygon fill="#9A9A9A" points="2863.519,3118.726,2853.519,3122.726,2863.519,3126.726,2859.519,3122.726" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2653.6612" x2="2614.889" y1="3122.726" y2="3122.726"/><polygon fill="#9A9A9A" points="2610.889,3270.43,2614.889,3280.43,2618.889,3270.43,2614.889,3274.43" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2614.889" x2="2614.889" y1="3122.726" y2="3434.449"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2614.889" x2="2753.5901" y1="3434.449" y2="3434.449"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2753.5901" x2="2753.5901" y1="3434.449" y2="3455.801"/><polygon fill="#9A9A9A" points="2749.5901,3445.801,2753.5901,3455.801,2757.5901,3445.801,2753.5901,3449.801" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2753.5901" x2="2753.5901" y1="3075.726" y2="3110.726"/><polygon fill="#9A9A9A" points="2749.5901,3100.726,2753.5901,3110.726,2757.5901,3100.726,2753.5901,3104.726" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2753.5901" x2="2753.5901" y1="3526.579" y2="3560.931"/><polygon fill="#9A9A9A" points="2749.5901,3550.931,2753.5901,3560.931,2757.5901,3550.931,2753.5901,3554.931" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2753.5901" x2="2753.5901" y1="2930.552" y2="2964.948"/><polygon fill="#9A9A9A" points="2749.5901,2954.948,2753.5901,2964.948,2757.5901,2954.948,2753.5901,2958.948" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2753.5901" x2="2753.5901" y1="3597.857" y2="3607.857"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2753.5901" x2="3150.1049" y1="3607.857" y2="3607.857"/><polygon fill="#9A9A9A" points="3146.1049,3272.43,3150.1049,3262.43,3154.1049,3272.43,3150.1049,3268.43" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3150.1049" x2="3150.1049" y1="2918.552" y2="3607.857"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3150.1049" x2="2826.7081" y1="2918.552" y2="2918.552"/><polygon fill="#9A9A9A" points="2836.7081,2914.552,2826.7081,2918.552,2836.7081,2922.552,2832.7081,2918.552" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2680.4721" x2="2590.889" y1="2918.552" y2="2918.552"/><polygon fill="#9A9A9A" points="2586.889,3258.43,2590.889,3268.43,2594.889,3258.43,2590.889,3262.43" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2590.889" x2="2590.889" y1="2918.552" y2="3619.857"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2590.889" x2="2753.5901" y1="3619.857" y2="3619.857"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2753.5901" x2="2753.5901" y1="3619.857" y2="3639.857"/><polygon fill="#9A9A9A" points="2749.5901,3629.857,2753.5901,3639.857,2757.5901,3629.857,2753.5901,3633.857" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3634.9869" x2="3634.9869" y1="1448.45" y2="1483.45"/><polygon fill="#9A9A9A" points="3630.9869,1473.45,3634.9869,1483.45,3638.9869,1473.45,3634.9869,1477.45" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3634.9869" x2="3634.9869" y1="1520.376" y2="1555.376"/><polygon fill="#9A9A9A" points="3630.9869,1545.376,3634.9869,1555.376,3638.9869,1545.376,3634.9869,1549.376" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3634.9869" x2="3634.9869" y1="1609.228" y2="1644.228"/><polygon fill="#9A9A9A" points="3630.9869,1634.228,3634.9869,1644.228,3638.9869,1634.228,3634.9869,1638.228" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3634.9869" x2="3634.9869" y1="1370.598" y2="1411.524"/><polygon fill="#9A9A9A" points="3630.9869,1401.524,3634.9869,1411.524,3638.9869,1401.524,3634.9869,1405.524" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3634.9869" x2="3634.9869" y1="1681.154" y2="1693.154"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3634.9869" x2="3779.7836" y1="1693.154" y2="1693.154"/><polygon fill="#9A9A9A" points="3775.7836,1535.876,3779.7836,1525.876,3783.7836,1535.876,3779.7836,1531.876" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3779.7836" x2="3779.7836" y1="1358.598" y2="1693.154"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3779.7836" x2="3703.9708" y1="1358.598" y2="1358.598"/><polygon fill="#9A9A9A" points="3713.9708,1354.598,3703.9708,1358.598,3713.9708,1362.598,3709.9708,1358.598" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3566.003" x2="3490.1903" y1="1358.598" y2="1358.598"/><polygon fill="#9A9A9A" points="3486.1903,1521.876,3490.1903,1531.876,3494.1903,1521.876,3490.1903,1525.876" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3490.1903" x2="3490.1903" y1="1358.598" y2="1705.154"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3490.1903" x2="3634.9869" y1="1705.154" y2="1705.154"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3634.9869" x2="3634.9869" y1="1705.154" y2="1891.636"/><polygon fill="#9A9A9A" points="3630.9869,1881.636,3634.9869,1891.636,3638.9869,1881.636,3634.9869,1885.636" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3492.0952" x2="3492.0952" y1="2310.514" y2="2338.977"/><polygon fill="#9A9A9A" points="3488.0952,2328.977,3492.0952,2338.977,3496.0952,2328.977,3492.0952,2332.977" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3492.0952" x2="3492.0952" y1="2375.903" y2="2410.903"/><polygon fill="#9A9A9A" points="3488.0952,2400.903,3492.0952,2410.903,3496.0952,2400.903,3492.0952,2404.903" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3492.0952" x2="3492.0952" y1="2481.681" y2="2513.607"/><polygon fill="#9A9A9A" points="3488.0952,2503.607,3492.0952,2513.607,3496.0952,2503.607,3492.0952,2507.607" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3492.0952" x2="3492.0952" y1="2232.662" y2="2273.588"/><polygon fill="#9A9A9A" points="3488.0952,2263.588,3492.0952,2273.588,3496.0952,2263.588,3492.0952,2267.588" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3492.0952" x2="3492.0952" y1="2550.533" y2="2562.533"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3492.0952" x2="3596.4503" y1="2562.533" y2="2562.533"/><polygon fill="#9A9A9A" points="3592.4503,2399.866,3596.4503,2389.866,3600.4503,2399.866,3596.4503,2395.866" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3596.4503" x2="3596.4503" y1="2220.662" y2="2562.533"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3596.4503" x2="3561.0791" y1="2220.662" y2="2220.662"/><polygon fill="#9A9A9A" points="3571.0791,2216.662,3561.0791,2220.662,3571.0791,2224.662,3567.0791,2220.662" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3423.1113" x2="3387.7401" y1="2220.662" y2="2220.662"/><polygon fill="#9A9A9A" points="3383.7401,2385.866,3387.7401,2395.866,3391.7401,2385.866,3387.7401,2389.866" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3387.7401" x2="3387.7401" y1="2220.662" y2="2574.533"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3387.7401" x2="3492.0952" y1="2574.533" y2="2574.533"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3492.0952" x2="3492.0952" y1="2574.533" y2="2663.385"/><polygon fill="#9A9A9A" points="3488.0952,2653.385,3492.0952,2663.385,3496.0952,2653.385,3492.0952,2657.385" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3495.7639" x2="3495.7639" y1="3268.93" y2="3303.93"/><polygon fill="#9A9A9A" points="3491.7639,3293.93,3495.7639,3303.93,3499.7639,3293.93,3495.7639,3297.93" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3495.7639" x2="3495.7639" y1="3340.856" y2="3372.819"/><polygon fill="#9A9A9A" points="3491.7639,3362.819,3495.7639,3372.819,3499.7639,3362.819,3495.7639,3366.819" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3495.7639" x2="3495.7639" y1="3191.078" y2="3232.004"/><polygon fill="#9A9A9A" points="3491.7639,3222.004,3495.7639,3232.004,3499.7639,3222.004,3495.7639,3226.004" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3495.7639" x2="3495.7639" y1="3409.745" y2="3421.097"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3495.7639" x2="3617.8803" y1="3421.097" y2="3421.097"/><polygon fill="#9A9A9A" points="3613.8803,3311.93,3617.8803,3301.93,3621.8803,3311.93,3617.8803,3307.93" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3617.8803" x2="3617.8803" y1="3179.078" y2="3421.097"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3617.8803" x2="3582.3954" y1="3179.078" y2="3179.078"/><polygon fill="#9A9A9A" points="3592.3954,3175.078,3582.3954,3179.078,3592.3954,3183.078,3588.3954,3179.078" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3409.1325" x2="3373.6476" y1="3179.078" y2="3179.078"/><polygon fill="#9A9A9A" points="3369.6476,3297.93,3373.6476,3307.93,3377.6476,3297.93,3373.6476,3301.93" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3373.6476" x2="3373.6476" y1="3179.078" y2="3433.097"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3373.6476" x2="3495.7639" y1="3433.097" y2="3433.097"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3495.7639" x2="3495.7639" y1="3433.097" y2="3454.449"/><polygon fill="#9A9A9A" points="3491.7639,3444.449,3495.7639,3454.449,3499.7639,3444.449,3495.7639,3448.449" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3495.7639" x2="3495.7639" y1="3132.078" y2="3167.078"/><polygon fill="#9A9A9A" points="3491.7639,3157.078,3495.7639,3167.078,3499.7639,3157.078,3495.7639,3161.078" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3495.7639" x2="3495.7639" y1="3054.226" y2="3095.152"/><polygon fill="#9A9A9A" points="3491.7639,3085.152,3495.7639,3095.152,3499.7639,3085.152,3495.7639,3089.152" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3495.7639" x2="3495.7639" y1="3525.227" y2="3536.579"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3495.7639" x2="3629.8803" y1="3536.579" y2="3536.579"/><polygon fill="#9A9A9A" points="3625.8803,3308.393,3629.8803,3298.393,3633.8803,3308.393,3629.8803,3304.393" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3629.8803" x2="3629.8803" y1="3042.226" y2="3536.579"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3629.8803" x2="3564.7479" y1="3042.226" y2="3042.226"/><polygon fill="#9A9A9A" points="3574.7479,3038.226,3564.7479,3042.226,3574.7479,3046.226,3570.7479,3042.226" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3426.78" x2="3355.6476" y1="3042.226" y2="3042.226"/><polygon fill="#9A9A9A" points="3351.6476,3294.393,3355.6476,3304.393,3359.6476,3294.393,3355.6476,3298.393" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3355.6476" x2="3355.6476" y1="3042.226" y2="3548.579"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3355.6476" x2="3495.7639" y1="3548.579" y2="3548.579"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3495.7639" x2="3495.7639" y1="3548.579" y2="3696.783"/><polygon fill="#9A9A9A" points="3491.7639,3686.783,3495.7639,3696.783,3499.7639,3686.783,3495.7639,3690.783" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="161.2959" x2="161.2959" y1="722.794" y2="727.794"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="161.2959" x2="979.0596" y1="727.794" y2="727.794"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="979.0596" x2="979.0596" y1="727.794" y2="742.794"/><polygon fill="#9A9A9A" points="975.0596,732.794,979.0596,742.794,983.0596,732.794,979.0596,736.794" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="979.0596" x2="979.0596" y1="997.572" y2="1002.572"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="979.0596" x2="2130.6018" y1="1002.572" y2="1002.572"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="1002.572" y2="1017.572"/><polygon fill="#9A9A9A" points="2126.6018,1007.572,2130.6018,1017.572,2134.6018,1007.572,2130.6018,1011.572" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2017.3136" x2="2017.3136" y1="1154.35" y2="1158.35"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2017.3136" x2="2785.08" y1="1158.35" y2="1158.35"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2785.08" x2="2785.08" y1="1158.35" y2="1174.35"/><polygon fill="#9A9A9A" points="2781.08,1164.35,2785.08,1174.35,2789.08,1164.35,2785.08,1168.35" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2548.889" x2="2548.889" y1="1154.35" y2="1158.35"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2548.889" x2="3634.9869" y1="1158.35" y2="1158.35"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3634.9869" x2="3634.9869" y1="1158.35" y2="1346.598"/><polygon fill="#9A9A9A" points="3630.9869,1336.598,3634.9869,1346.598,3638.9869,1336.598,3634.9869,1340.598" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1524.8423" x2="1524.8423" y1="1580.302" y2="1877.636"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1524.8423" x2="3322.6476" y1="1877.636" y2="1877.636"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3322.6476" x2="3322.6476" y1="1877.636" y2="1891.636"/><polygon fill="#9A9A9A" points="3318.6476,1881.636,3322.6476,1891.636,3326.6476,1881.636,3322.6476,1885.636" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2785.08" x2="2785.08" y1="1859.71" y2="1877.636"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2785.08" x2="3346.6476" y1="1877.636" y2="1877.636"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3346.6476" x2="3346.6476" y1="1877.636" y2="1891.636"/><polygon fill="#9A9A9A" points="3342.6476,1881.636,3346.6476,1891.636,3350.6476,1881.636,3346.6476,1885.636" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3346.6476" x2="3346.6476" y1="1897.636" y2="1902.636"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3346.6476" x2="2130.6018" y1="1902.636" y2="1902.636"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="1902.636" y2="1917.636"/><polygon fill="#9A9A9A" points="2126.6018,1907.636,2130.6018,1917.636,2134.6018,1907.636,2130.6018,1911.636" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1992.4489" x2="1992.4489" y1="2111.34" y2="2115.34"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1992.4489" x2="2760.2153" y1="2115.34" y2="2115.34"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2760.2153" x2="2760.2153" y1="2115.34" y2="2131.34"/><polygon fill="#9A9A9A" points="2756.2153,2121.34,2760.2153,2131.34,2764.2153,2121.34,2760.2153,2125.34" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2536.889" x2="2536.889" y1="2111.34" y2="2115.34"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2536.889" x2="3492.0952" y1="2115.34" y2="2115.34"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3492.0952" x2="3492.0952" y1="2115.34" y2="2208.662"/><polygon fill="#9A9A9A" points="3488.0952,2198.662,3492.0952,2208.662,3496.0952,2198.662,3492.0952,2202.662" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1708.1756" x2="1708.1756" y1="2444.292" y2="2649.385"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1708.1756" x2="3346.6476" y1="2649.385" y2="2649.385"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3346.6476" x2="3346.6476" y1="2649.385" y2="2663.385"/><polygon fill="#9A9A9A" points="3342.6476,2653.385,3346.6476,2663.385,3350.6476,2653.385,3346.6476,2657.385" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2760.2153" x2="2760.2153" y1="2643.385" y2="2649.385"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2760.2153" x2="3346.6476" y1="2649.385" y2="2649.385"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3346.6476" x2="3346.6476" y1="2649.385" y2="2663.385"/><polygon fill="#9A9A9A" points="3342.6476,2653.385,3346.6476,2663.385,3350.6476,2653.385,3346.6476,2657.385" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3346.6476" x2="3346.6476" y1="2669.385" y2="2674.385"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3346.6476" x2="2130.6018" y1="2674.385" y2="2674.385"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="2674.385" y2="2689.385"/><polygon fill="#9A9A9A" points="2126.6018,2679.385,2130.6018,2689.385,2134.6018,2679.385,2130.6018,2683.385" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1985.8237" x2="1985.8237" y1="2886.552" y2="2890.552"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1985.8237" x2="2753.5901" y1="2890.552" y2="2890.552"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2753.5901" x2="2753.5901" y1="2890.552" y2="2906.552"/><polygon fill="#9A9A9A" points="2749.5901,2896.552,2753.5901,2906.552,2757.5901,2896.552,2753.5901,2900.552" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2536.889" x2="2536.889" y1="2886.552" y2="2890.552"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2536.889" x2="3495.7639" y1="2890.552" y2="2890.552"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3495.7639" x2="3495.7639" y1="2890.552" y2="3030.226"/><polygon fill="#9A9A9A" points="3491.7639,3020.226,3495.7639,3030.226,3499.7639,3020.226,3495.7639,3024.226" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1680.9499" x2="1680.9499" y1="3352.819" y2="3682.783"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="1680.9499" x2="3346.6476" y1="3682.783" y2="3682.783"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3346.6476" x2="3346.6476" y1="3682.783" y2="3696.783"/><polygon fill="#9A9A9A" points="3342.6476,3686.783,3346.6476,3696.783,3350.6476,3686.783,3346.6476,3690.783" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2753.5901" x2="2753.5901" y1="3676.783" y2="3682.783"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2753.5901" x2="3346.6476" y1="3682.783" y2="3682.783"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3346.6476" x2="3346.6476" y1="3682.783" y2="3696.783"/><polygon fill="#9A9A9A" points="3342.6476,3686.783,3346.6476,3696.783,3350.6476,3686.783,3346.6476,3690.783" style="stroke:#9A9A9A;stroke-width:1;"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3346.6476" x2="3346.6476" y1="3702.783" y2="3707.783"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="3346.6476" x2="2130.6018" y1="3707.783" y2="3707.783"/><line style="stroke:#9A9A9A;stroke-width:1;" x1="2130.6018" x2="2130.6018" y1="3707.783" y2="3722.783"/><polygon fill="#9A9A9A" points="2126.6018,3712.783,2130.6018,3722.783,2134.6018,3712.783,2130.6018,3716.783" style="stroke:#9A9A9A;stroke-width:1;"/><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="28.5837" x="270.8669" y="72.226">Main</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="225.1019" x="865.5086" y="72.226">BiergartenPipelineOrchestrator::Run()</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="78.2797" x="1947.2054" y="72.226">Orchestrator</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="71.9356" x="2904.8005" y="72.226">LLM Worker</text><text fill="#EAEAEA" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="87.3536" x="3510.5388" y="72.226">SQLite Worker</text><?plantuml-src tLhhRcEt4VwlfnYuG2CZih5UPpU1NBImBdQyyQsM4xV00W9rpaXYV4IUa9Ha1VxHH-YFzWNp99qXUOukbcnlia64PWFPFXpEVRuPyiZUIvKB8qQGOb-CCtUYbRiK8uITrWLqXB8x5RkEfYD_HZWuN5XqqcKut_w3pkw7UhApZi9lVljcOQadalk1qMELDdMc3Vpff4d_lbulEv8SV7NmpPlcElwR28wDqTEu-FxT-vF3HVr5ukH4kbd72LDmQ3VQpVOwedQfw5V7xxuv_7ej7vrleZcED8rLivy8B2crIT6ynAybnKYhz0dRPgFrjl7kcGtFSh_K3f-mR3NQxLPhXUevvtikpyhfJEKe4-gJg6w7ChbNQ2qSBD2GJJeP6as9Q722ncAbuhC3ReS83ObcG4561ItX15pB73Ef47xvrtzApm2vPa2yAfN72o7LOyLoNbJgruAu7Pl1U8JAsQemWwG6z3dPFQh8FbJFr4HaCkL7zc-xu8OafJf3kri1gDiypVIWNaTAH7D4JombIGKpYr1LUhU2AfNzIlrCIGVDiSbECzqJ6MMaG_Wpd6TY93WGHEQV7LNgZR7CKcYTWLG_OkAOQzWlIGkgiivFcNJOViYrSHqq4vdGBaMX02C7GqSgNEMeB7J-Vavqa6YbY8tKQf-M6ZYGj2R0IZKWvpb3W23yCgqccZnB2o2o3FfoWlJnuCQ6w6Ovsdss1bWKQTGqo3OqE84mRGu5YSd-Sgu7RUNCxAz0NkacGxAdaukf0bg0EstkqP03QMkweZElJyDwQWJh61X0N_CE91AAZYHLyYAscUoZaoDakuv9uR3T0ex8ruKY50ypJfmbcecS9mOj3qZKtXuepYO8OOIK12GkcorPEa-kOlULIOP8Z0L5frw_6QigfShZg-WUAnMow9vJvuFLwbmBIlbwdNys44t7pJAqrPqU_Rvd_H_xFnBTpYxdLhsjZ4o6dASnylNwjS4xOKRbvgOWcLNUtmtxQITB134WjwwJUwuJmGb0OhFYrzS9BNO6cLQCyWpJRic4jhCRlRsRZERMOXkp9gKHHQkwe_ZllTviBmbFIaMUj-6Q0g-L81Fo-5kviLIXyWNyyjz__x7_amxNtnvtsl36GzFtdVODdBOlspV7jsTNbrkXuUDYrZvME6s_jsYkXyAkZ_5wAB0VLPMeg8HhW0yv_IJI8WrMP510pxNEwz3XO9Nv27iC8uc74I9fPffGTVvW2Jy0herEnmdLSi9qDXBk-xNpyui2VQP3cJ4NGcbUSMX6Kf7w5hGYwCYfJtmPMAJx7dGY3Ypbt-ES8MiVU4PpWHm5XBmZRXRIbgs2BBZ111bL2ml98VxvARgobAZVueCxeKuNgghmjA_59qO3d8wfFz8UJ27X3J0azElJTl3jRPm73ypnp4iyYmNJmImqXmx70WUpUZqyYklLZmgWAAbkBZ9q3hk_KHU06wIkuljGb1DXchOPCwCE5EayWdL5lo-v_w6bljoRT4d606kHHFR6tTnW7msg16j0OXEQ6hfJPCNM6h-CEMInJsf-wiqjFBulhJuyUF--Ux39tXQ6z97MoOHpwdwS-vwYVSP9DT7P9EGH_-V7QElTInxoVY7Dz-vnHdywqSim4WhIDnUMKf1uECtz3mQeq7YzQ9EcF5rhsccWGgxOAdhWfcfDQFgf5M6iGL74ZBMx7nNtHPwQujumngonbaqo8ODj7TgHUPCdgoHaBLLE51Atf6WJ8tElzPU5N62v-r2eQYDjJ-fWU1bC6b86IcGMmfYAQH5ovMD49UVfWyIrxbXkzzmg1ZJEzNKDs46dfKjh7FVWfJ4jT6LQWvqi6-t4oDSzC1KQfxoPmIdWsb60YGW2FFILO3KdU06i0c6m8GvkdnMlbdWkG5QG-mh8Mh8zEeMCI6XEzxd6RYkSzPkyRlruMph-EC_P97As9ycrphfF7JxlyQlTwuEcR9cZTMtPkqVRDHGS23yLD6xQT-sRVsxROC2JGCFW5CrisuQ1_w_cNDHQTFOgZaUm_GJa_kw7A9wapYnCQNG7aHXDPsmwwHNu6wGjD1hBlSpEBBahzfm2rZN13qcXPikj6ARI3QdCwCD2pgcnOjRpgC0e44rTYmrHiPT0ERBu95p-lK0owhACaqKuepqlekKd-MKZR1PKdnqvbx9iIGfxH-afzCTPDeDSv-ECdS99uO433dem4ZFeyMN4ub5xgx2u5x2ulNqdD0_4M1p9dWLTZiklGDsGTZHm5ncq3BlbarVWRgJzzTLpvgysDfrJueK9LqNCGIgCyl9ZySJYkKMbJhG194ISJ-Fb_KbKp-28hAAJo6x4FEu3uO9bjGbuIR7mre3l9noBNedKu2ry3L2_6gfNm7gn2P6eQkdQuDKNEn0Za7Fiu7bGMMKwo_GeHJCyAXf434Yg5UvMNWE8k662VBvBy3RRyAB_o0QneCRHsdpqWQNu12zjpCKEEa-wFxSw9DIYTnSwZuyXbXFwSeF0nRdwQL0-LqmMEzJlqeCQsWrN6X6V3-Vs4Oqmw5jJedbqTRZSdxQp4xtrZQZvRRlvtTdbDlQYPhXocRUZi_Ya9IcKiZTU1kwFwjZooRvuBtFdRsfiTNx0srs9RAGWjCQqk3dnvS9Rlk0BXE8IOENs1pxi9MD3XKUes9V-VWL7Q0Q4YU7w9Tu-fGkABgR1Qdaktm1GRivrNbUhzUW7ImpAKt9jEKVthVoPlERBObLSj8O4fVYm7Wpgjt941KCdCTeL-NloEVnnXokd-u0IgpFX0jv7bPTLhO4hn6m6_G9j2WvH-vTl1UA65GXHD3tgtCrlz9wVSmkgDNDkmB4dpMQRQlpGrpZNzUNfDfRu3SL53SeANyPTxbcs6D2W9mLVNFPcjCH9j5_KvkfbhaVdyZwNvv0W1UmzJc6aqm3BNAJpIxvNr6Qph9hbf5XReHV29SEbHcLZmR1LeLhA1a83jUKxt4NoqjmIJEOM-YpbLyZUHVX0A6Fz2yt8OFLjya8P1bSKLOZyEQ-3bsimRZV-nyiL6CWt5M3WigQBbs-vDxA_4qQznFwvSspdNleRzGA-UCHIsZl4nYAN_MqjxTlsyKthwcvBNkk5xppKJwHwxVS8cbSN5sUtuLi1zkNl19HtSl75VnZUolV-AynR_9OV1iNHo8UrV6alkQUdHXEw4qGuiCEnI_LqiJUNtxoGbC6mKtxZevZikFp_0IExSrJnNydu7m00?></g></svg>