mirror of
https://github.com/aaronpo97/the-biergarten-app.git
synced 2026-07-16 17:47:22 +00:00
1 line
142 KiB
XML
1 line
142 KiB
XML
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="ACTIVITY" height="6467px" preserveAspectRatio="none" style="width:4436px;height:6467px;background:#FCFCF7;" version="1.1" viewBox="0 0 4436 6467" width="4436px" zoomAndPan="magnify"><?plantuml 1.2026.3?><defs/><g><rect fill="#FCFCF7" height="6467" style="stroke:none;stroke-width:1;" width="4436" x="0" y="0"/><g class="title" data-source-line="5"><text fill="#14180C" font-family="'Volkhov'" font-size="20" font-weight="700" lengthAdjust="spacing" textLength="486.14" x="1973.9555" y="39.42">The Biergarten Data Pipeline — Activity Diagram</text></g><rect fill="none" height="16.926" style="stroke:none;stroke-width:1;" width="4389.051" x="20" y="64.33"/><ellipse cx="179.6112" cy="96.256" fill="#EBECE3" rx="10" ry="10" style="stroke:#222222;stroke-width:1;"/><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="187.59" x="85.8162" y="126.256"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="167.59" x="95.8162" y="149.152">ParseArguments(argc, argv)</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="95.4522" x="131.8851" y="233.645"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="75.4522" x="141.8851" y="256.541">spdlog::error</text><ellipse cx="179.6112" cy="308.608" fill="none" rx="11" ry="11" style="stroke:#4A5837;stroke-width:1;"/><ellipse cx="179.6112" cy="308.608" fill="#222222" rx="6" ry="6" style="stroke:#4A5837;stroke-width:1;"/><polygon fill="#CBD2B5" points="142.3595,183.182,216.8628,183.182,228.8628,195.182,216.8628,207.182,142.3595,207.182,130.3595,195.182,142.3595,183.182" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="183.6112" y="220.078">yes</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="74.5032" x="142.3595" y="199.615">Invalid args?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="228.8628" y="191.152">no</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="307.2223" x="26" y="361.608"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="287.2223" x="36" y="384.504">Init OpenSSL global state & LlamaBackendState</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="114.5036" x="122.3594" y="418.534"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="94.5036" x="132.3594" y="441.43">Build DI injector</text><path d="M294.5891,465.46 L294.5891,491.849 L274.5891,495.849 L294.5891,499.849 L294.5891,526.238 A0,0 0 0 0 294.5891,526.238 L508.7045,526.238 A0,0 0 0 0 508.7045,526.238 L508.7045,475.46 L498.7045,465.46 L294.5891,465.46 A0,0 0 0 0 294.5891,465.46" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M498.7045,465.46 L498.7045,475.46 L508.7045,475.46 L498.7045,465.46" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="157.3748" x="300.5891" y="483.356">Opens SQLite connection.</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="193.1154" x="300.5891" y="500.282">(Transactions are now managed</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="148.3823" x="300.5891" y="517.208">per-phase via batching).</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="189.9558" x="84.6332" y="477.386"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="169.9558" x="94.6332" y="500.282">Initialize SqliteExportService</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="280.5918" x="39.3153" y="546.238"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="260.5918" x="49.3153" y="569.134">Create BoundedChannel<LogEntry> log_ch</text><path d="M287.6812,593.164 L287.6812,628.016 L267.6812,632.016 L287.6812,636.016 L287.6812,670.868 A0,0 0 0 0 287.6812,670.868 L568.6329,670.868 A0,0 0 0 0 568.6329,670.868 L568.6329,603.164 L558.6329,593.164 L287.6812,593.164 A0,0 0 0 0 287.6812,593.164" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M558.6329,593.164 L558.6329,603.164 L568.6329,603.164 L558.6329,593.164" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="195.644" x="293.6812" y="611.06">Log worker drains log_ch for the</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="137.3777" x="293.6812" y="627.986">entire pipeline lifetime.</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="199.83" x="293.6812" y="644.912">All workers emit LogEntry structs</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="259.9517" x="293.6812" y="661.838">via PipelineLogger -- never spdlog directly.</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="176.1401" x="91.5411" y="613.553"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="156.1401" x="101.5411" y="636.449">Spawn Log Worker thread</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="245.1019" x="57.0602" y="690.868"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="225.1019" x="67.0602" y="713.764">BiergartenPipelineOrchestrator::Run()</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="254.6731" x="52.2746" y="6306.7811"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="234.6731" x="62.2746" y="6329.6771">spdlog::info "Pipeline complete in X ms"</text><path d="M258.2946,6360.2441 L258.2946,6378.1701 L238.2946,6382.1701 L258.2946,6386.1701 L258.2946,6404.0961 A0,0 0 0 0 258.2946,6404.0961 L470.5868,6404.0961 A0,0 0 0 0 470.5868,6404.0961 L470.5868,6370.2441 L460.5868,6360.2441 L258.2946,6360.2441 A0,0 0 0 0 258.2946,6360.2441" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M460.5868,6360.2441 L460.5868,6370.2441 L470.5868,6370.2441 L460.5868,6360.2441" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="191.2921" x="264.2946" y="6378.1401">Drain guarantees no LogEntry is</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="133.9327" x="264.2946" y="6395.0661">dropped at shutdown.</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="117.3669" x="120.9277" y="6363.7071"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="97.3669" x="130.9277" y="6386.6031">Join Log Worker</text><ellipse cx="179.6112" cy="6435.0961" fill="none" rx="11" ry="11" style="stroke:#4A5837;stroke-width:1;"/><ellipse cx="179.6112" cy="6435.0961" fill="#222222" rx="6" ry="6" style="stroke:#4A5837;stroke-width:1;"/><line style="stroke:#4A5837;stroke-width:1;" x1="20" x2="20" y1="64.33" y2="6446.0961"/><rect fill="#555555" height="6" rx="2.5" ry="2.5" style="stroke:#555555;stroke-width:1;" width="839.4839" x="597.7363" y="747.794"/><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="304.4079" x="645.8369" y="773.794"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="284.4079" x="655.8369" y="796.69">JsonLoader::LoadBeerStyles("beer-styles.json")</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="372.6092" x="611.7363" y="830.72"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="352.6092" x="621.7363" y="853.616">EnrichmentService::PreWarmBeerStyleCache(beer_styles)</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="237.1102" x="1099.2277" y="773.794"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="217.1102" x="1109.2277" y="796.69">JsonLoader::LoadCities("cities.json")</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="410.8747" x="1012.3454" y="830.72"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="390.8747" x="1022.3454" y="853.616">EnrichmentService::PreWarmLocationCache(sampled_locations)</text><rect fill="#555555" height="6" rx="2.5" ry="2.5" style="stroke:#555555;stroke-width:1;" width="839.4839" x="597.7363" y="887.646"/><path d="M1465.3235,927.72 L1465.3235,1005.424 L1775.5802,1005.424 L1775.5802,937.72 L1765.5802,927.72 L1465.3235,927.72" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M1765.5802,927.72 L1765.5802,937.72 L1775.5802,937.72 L1765.5802,927.72" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="247.7773" x="1471.3235" y="945.616">Each call is memoized after its first parse</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="289.2567" x="1471.3235" y="962.542">(implemented today). MockCuratedDataService</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="256.5326" x="1471.3235" y="979.468">returns a fixed in-memory dataset instead</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="261.9925" x="1471.3235" y="996.394">under --mocked, skipping these JSON files.</text><rect fill="#555555" height="6" rx="2.5" ry="2.5" style="stroke:#555555;stroke-width:1;" width="875.6906" x="579.6329" y="913.646"/><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="261.0983" x="591.6329" y="939.646"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="241.0983" x="601.6329" y="962.542">JsonLoader::LoadForenamesByCountry(</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="180.8044" x="608.5489" y="979.468">"forenames-by-country.json")</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="254.0328" x="880.7312" y="939.646"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="234.0328" x="890.7312" y="962.542">JsonLoader::LoadSurnamesByCountry(</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="175.2663" x="897.6472" y="979.468">"surnames-by-country.json")</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="280.5595" x="1162.764" y="948.109"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="260.5595" x="1172.764" y="971.005">JsonLoader::LoadPersonas("personas.json")</text><rect fill="#555555" height="6" rx="2.5" ry="2.5" style="stroke:#555555;stroke-width:1;" width="875.6906" x="579.6329" y="1013.498"/><line style="stroke:#4A5837;stroke-width:1;" x1="573.6329" x2="573.6329" y1="64.33" y2="6446.0961"/><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="230.9414" x="2404.9822" y="1039.498"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="210.9414" x="2414.9822" y="1062.394">RunUserPhase(sampled_locations)</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="174.2744" x="2433.3158" y="1096.424"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="154.2744" x="2443.3158" y="1119.32">Create BoundedChannels</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="102.505" x="2443.3158" y="1136.246">(loc_ch, exp_ch)</text><rect fill="#555555" height="6" rx="2.5" ry="2.5" style="stroke:#555555;stroke-width:1;" width="1378.5788" x="1786.5802" y="1170.276"/><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="212.0816" x="1798.5802" y="1540.532"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="192.0816" x="1808.5802" y="1563.428">Loop: Send Locations -> loc_ch</text><path d="M1974.0403,1612.458 L1974.0403,1638.847 L1954.0403,1642.847 L1974.0403,1646.847 L1974.0403,1673.236 A0,0 0 0 0 1974.0403,1673.236 L2178.841,1673.236 A0,0 0 0 0 2178.841,1673.236 L2178.841,1622.458 L2168.841,1612.458 L1974.0403,1612.458 A0,0 0 0 0 1974.0403,1612.458" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M2168.841,1612.458 L2168.841,1622.458 L2178.841,1622.458 L2168.841,1612.458" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="144.8039" x="1980.0403" y="1630.354">Producer closes loc_ch.</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="136.1004" x="1980.0403" y="1647.28">LLM Worker while loop</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="183.8007" x="1980.0403" y="1664.206">terminates on empty + closed.</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="98.8385" x="1855.2018" y="1624.384"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="78.8385" x="1865.2018" y="1647.28">Close loc_ch</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="213.3655" x="2413.7702" y="2059.292"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="193.3655" x="2423.7702" y="2082.188">Join LLM Worker, SQLite Worker</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="253.0675" x="2393.9192" y="2116.218"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="233.0675" x="2403.9192" y="2139.114">RunBreweryPhase(sampled_locations)</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="174.2744" x="2433.3158" y="2173.144"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="154.2744" x="2443.3158" y="2196.04">Create BoundedChannels</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="102.505" x="2443.3158" y="2212.966">(loc_ch, exp_ch)</text><rect fill="#555555" height="6" rx="2.5" ry="2.5" style="stroke:#555555;stroke-width:1;" width="1267.4121" x="1885.7469" y="2246.996"/><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="237.0742" x="1911.6891" y="2495.781"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="217.0742" x="1921.6891" y="2518.677">Loop: Sample User from user_pool_</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="106.545" x="1921.6891" y="2535.603">and pair with City</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="260.9585" x="1899.7469" y="2584.633"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="240.9585" x="1909.7469" y="2607.529">Send BreweryTask(City, User) -> loc_ch</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="98.8385" x="1980.8069" y="2656.559"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="78.8385" x="1990.8069" y="2679.455">Close loc_ch</text><path d="M2647.1357,2961.8 L2647.1357,2979.726 L2627.1357,2983.726 L2647.1357,2987.726 L2647.1357,3005.652 A0,0 0 0 0 2647.1357,3005.652 L2899.5392,3005.652 A0,0 0 0 0 2899.5392,3005.652 L2899.5392,2971.8 L2889.5392,2961.8 L2647.1357,2961.8 A0,0 0 0 0 2647.1357,2961.8" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M2889.5392,2961.8 L2889.5392,2971.8 L2899.5392,2971.8 L2889.5392,2961.8" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="231.4035" x="2653.1357" y="2979.696">brewery_pool_ is now fully populated.</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="120.3964" x="2653.1357" y="2996.622">Phase 1b may begin.</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="213.3655" x="2413.7702" y="2965.263"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="193.3655" x="2423.7702" y="2988.159">Join LLM Worker, SQLite Worker</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="115.7419" x="2462.582" y="3025.652"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="95.7419" x="2472.582" y="3048.548">RunBeerPhase()</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="174.2744" x="2433.3158" y="3082.578"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="154.2744" x="2443.3158" y="3105.474">Create BoundedChannels</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="114.712" x="2443.3158" y="3122.4">(brew_ch, exp_ch)</text><rect fill="#555555" height="6" rx="2.5" ry="2.5" style="stroke:#555555;stroke-width:1;" width="1171.9389" x="1934.4835" y="3156.43"/><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="224.4902" x="1948.4835" y="3552.289"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="204.4902" x="1958.4835" y="3575.185">Loop: Send Breweries -> brew_ch</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="111.0456" x="2005.2058" y="3624.215"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="91.0456" x="2015.2058" y="3647.111">Close brew_ch</text><path d="M2647.1357,4062.993 L2647.1357,4097.845 L2627.1357,4101.845 L2647.1357,4105.845 L2647.1357,4140.697 A0,0 0 0 0 2647.1357,4140.697 L2893.975,4140.697 A0,0 0 0 0 2893.975,4140.697 L2893.975,4072.993 L2883.975,4062.993 L2647.1357,4062.993 A0,0 0 0 0 2647.1357,4062.993" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M2883.975,4062.993 L2883.975,4072.993 L2893.975,4072.993 L2883.975,4062.993" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="225.8393" x="2653.1357" y="4080.889">Both brewery_pool_ and beer_pool_</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="187.1287" x="2653.1357" y="4097.815">are now completely populated.</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="192.3677" x="2653.1357" y="4114.741">Checkin and Follow phases may</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="111.5013" x="2653.1357" y="4131.667">now run in parallel.</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="213.3655" x="2413.7702" y="4083.382"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="193.3655" x="2423.7702" y="4106.278">Join LLM Worker, SQLite Worker</text><rect fill="#555555" height="6" rx="2.5" ry="2.5" style="stroke:#555555;stroke-width:1;" width="1258.9257" x="1889.9901" y="4160.697"/><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="137.0586" x="2027.4471" y="4186.697"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="117.0586" x="2037.4471" y="4209.593">RunCheckinPhase()</text><path d="M2233.4719,4240.16 L2233.4719,4266.549 L2213.4719,4270.549 L2233.4719,4274.549 L2233.4719,4300.938 A0,0 0 0 0 2233.4719,4300.938 L2497.2636,4300.938 A0,0 0 0 0 2497.2636,4300.938 L2497.2636,4250.16 L2487.2636,4240.16 L2233.4719,4240.16 A0,0 0 0 0 2233.4719,4240.16" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M2487.2636,4240.16 L2487.2636,4250.16 L2497.2636,4250.16 L2487.2636,4240.16" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="200.899" x="2239.4719" y="4258.056">Weights seeded from each user's</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="242.7917" x="2239.4719" y="4274.982">persona.checkin_weight. J-curve profile</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="212.6934" x="2239.4719" y="4291.908">emerges from persona distribution.</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="234.991" x="1978.4809" y="4243.623"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="179.0656" x="1988.4809" y="4266.519">ICheckinDistributionStrategy::</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="214.991" x="1988.4809" y="4283.445">AssignActivityWeights(user_pool_)</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="148.0175" x="2021.9676" y="4335.938"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="128.0175" x="2031.9676" y="4358.834">BEGIN TRANSACTION</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="292.2334" x="1949.8597" y="4471.605"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="272.2334" x="1959.8597" y="4494.501">CheckinsForUser(user, brewery_pool_.size())</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="181.5219" x="2005.2155" y="4608.457"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="161.5219" x="2015.2155" y="4631.353">TimestampFor(user, index)</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="239.6223" x="1976.1653" y="4680.383"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="219.6223" x="1986.1653" y="4703.279">Select brewery from brewery_pool_</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="287.9727" x="1951.9901" y="4752.3091"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="267.9727" x="1961.9901" y="4775.2051">GenerateCheckin(user, brewery, timestamp)</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="110.263" x="1961.9901" y="4792.1311">via DataGenerator</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="173.2084" x="2009.3722" y="4841.1611"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="153.2084" x="2019.3722" y="4864.0571">ProcessCheckin(checkin)</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="287.0855" x="1952.4337" y="4913.0871"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="267.0855" x="1962.4337" y="4935.9831">PipelineLogger::Log(Info, CheckinGeneration,</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="165.565" x="1969.3497" y="4952.9091">nullopt, checkin_id, "sqlite")</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="179.4969" x="2006.2279" y="5001.9391"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="159.4969" x="2016.2279" y="5024.8351">Append -> checkin_pool_</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="125.1082" x="2033.4223" y="5117.8651"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="105.1082" x="2043.4223" y="5140.7611">COMMIT & BEGIN</text><polygon fill="#CBD2B5" points="2035.3134,5067.4021,2156.6394,5067.4021,2168.6394,5079.4021,2156.6394,5091.4021,2035.3134,5091.4021,2023.3134,5079.4021,2035.3134,5067.4021" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="2099.9764" y="5104.2981">yes</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="121.326" x="2035.3134" y="5083.8351">Batch size reached?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="2168.6394" y="5075.3721">no</text><polygon fill="#CBD2B5" points="2095.9764,5181.2541,2107.9764,5193.2541,2095.9764,5205.2541,2083.9764,5193.2541,2095.9764,5181.2541" style="stroke:#4A5837;stroke-width:0.5;"/><polygon fill="#CBD2B5" points="2023.2641,4543.531,2168.6887,4543.531,2180.6887,4555.531,2168.6887,4567.531,2023.2641,4567.531,2011.2641,4555.531,2023.2641,4543.531" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="59.2411" x="2099.9764" y="4580.427">remaining</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="145.4247" x="2023.2641" y="4559.964">For each checkin index?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="30.706" x="1980.5581" y="4551.501">done</text><polygon fill="#CBD2B5" points="1975.125,4406.679,2216.8278,4406.679,2228.8278,4418.679,2216.8278,4430.679,1975.125,4430.679,1963.125,4418.679,1975.125,4406.679" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="59.2411" x="2099.9764" y="4443.575">remaining</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="241.7028" x="1975.125" y="4423.112">For each GeneratedUser in user_pool_?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="30.706" x="1932.419" y="4414.649">done</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="112.2447" x="2039.8541" y="5269.2541"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="92.2447" x="2049.8541" y="5292.1501">COMMIT (Final)</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="126.4149" x="2624.277" y="4312.123"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="106.4149" x="2634.277" y="4335.019">RunFollowPhase()</text><path d="M2820.7469,4382.864 L2820.7469,4417.716 L2800.7469,4421.716 L2820.7469,4425.716 L2820.7469,4460.568 A0,0 0 0 0 2820.7469,4460.568 L3136.9158,4460.568 A0,0 0 0 0 3136.9158,4460.568 L3136.9158,4392.864 L3126.9158,4382.864 L2820.7469,4382.864 A0,0 0 0 0 2820.7469,4382.864" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M3126.9158,4382.864 L3126.9158,4392.864 L3136.9158,4392.864 L3126.9158,4382.864" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="214.7865" x="2826.7469" y="4400.76">For RandomFollowStrategy, weights</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="295.1689" x="2826.7469" y="4417.686">are uniform. For ActivityWeightedFollowStrategy,</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="254.0563" x="2826.7469" y="4434.612">weights derived from user.activity_weight</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="271.5837" x="2826.7469" y="4451.538">so high-activity users attract more followers.</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="226.5247" x="2574.2221" y="4394.79"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="165.1947" x="2584.2221" y="4417.686">IFollowGenerationStrategy::</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="206.5247" x="2584.2221" y="4434.612">AssignFollowWeights(user_pool_)</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="148.0175" x="2613.4757" y="4495.568"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="128.0175" x="2623.4757" y="4518.464">BEGIN TRANSACTION</text><path d="M2807.7679,4572.494 L2807.7679,4590.42 L2787.7679,4594.42 L2807.7679,4598.42 L2807.7679,4616.346 A0,0 0 0 0 2807.7679,4616.346 L3127.8205,4616.346 A0,0 0 0 0 3127.8205,4616.346 L3127.8205,4582.494 L3117.8205,4572.494 L2807.7679,4572.494 A0,0 0 0 0 2807.7679,4572.494" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M3117.8205,4572.494 L3117.8205,4582.494 L3127.8205,4582.494 L3117.8205,4572.494" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="299.0526" x="2813.7679" y="4590.39">Self-follow constraint (follower_id != followed_id)</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="255.0636" x="2813.7679" y="4607.316">enforced here and at the DB schema level.</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="200.5669" x="2587.201" y="4567.494"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="165.1947" x="2597.201" y="4590.39">IFollowGenerationStrategy::</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="180.5669" x="2597.201" y="4607.316">GenerateFollows(user_pool_)</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="151.2743" x="2611.8473" y="4721.2721"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="131.2743" x="2621.8473" y="4744.1681">ProcessFollow(follow)</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="276.4418" x="2549.2636" y="4793.1981"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="256.4418" x="2559.2636" y="4816.0941">PipelineLogger::Log(Info, FollowGeneration,</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="166.4686" x="2566.1796" y="4833.0201">nullopt, follower_id, "sqlite")</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="168.2065" x="2603.3812" y="4882.0501"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="148.2065" x="2613.3812" y="4904.9461">Append -> follow_pool_</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="125.1082" x="2624.9304" y="5004.4391"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="105.1082" x="2634.9304" y="5027.3351">COMMIT & BEGIN</text><polygon fill="#CBD2B5" points="2626.8215,4953.9761,2748.1475,4953.9761,2760.1475,4965.9761,2748.1475,4977.9761,2626.8215,4977.9761,2614.8215,4965.9761,2626.8215,4953.9761" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="2691.4845" y="4990.8721">yes</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="121.326" x="2626.8215" y="4970.4091">Batch size reached?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="2760.1475" y="4961.9461">no</text><polygon fill="#CBD2B5" points="2687.4845,5061.3651,2699.4845,5073.3651,2687.4845,5085.3651,2675.4845,5073.3651,2687.4845,5061.3651" style="stroke:#4A5837;stroke-width:0.5;"/><polygon fill="#CBD2B5" points="2604.8563,4656.346,2770.1127,4656.346,2782.1127,4668.346,2770.1127,4680.346,2604.8563,4680.346,2592.8563,4668.346,2604.8563,4656.346" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="59.2411" x="2691.4845" y="4693.2421">remaining</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="165.2563" x="2604.8563" y="4672.779">For each GeneratedFollow?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="30.706" x="2562.1503" y="4664.316">done</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="112.2447" x="2631.3622" y="5144.3651"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="92.2447" x="2641.3622" y="5167.2611">COMMIT (Final)</text><rect fill="#555555" height="6" rx="2.5" ry="2.5" style="stroke:#555555;stroke-width:1;" width="1258.9257" x="1889.9901" y="5326.1801"/><path d="M2646.9098,5342.1801 L2646.9098,5368.5691 L2626.9098,5372.5691 L2646.9098,5376.5691 L2646.9098,5402.9581 A0,0 0 0 0 2646.9098,5402.9581 L2867.1771,5402.9581 A0,0 0 0 0 2867.1771,5402.9581 L2867.1771,5352.1801 L2857.1771,5342.1801 L2646.9098,5342.1801 A0,0 0 0 0 2646.9098,5342.1801" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M2857.1771,5342.1801 L2857.1771,5352.1801 L2867.1771,5352.1801 L2857.1771,5342.1801" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="199.2672" x="2652.9098" y="5360.0761">checkin_pool_ and follow_pool_</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="144.2613" x="2652.9098" y="5377.0021">are now fully populated.</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="146.5102" x="2652.9098" y="5393.9281">Rating phase may begin.</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="212.9138" x="2413.996" y="5354.1061"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="192.9138" x="2423.996" y="5377.0021">Join CheckinPhase, FollowPhase</text><path d="M2603.4703,5412.9581 L2603.4703,5439.3471 L2583.4703,5443.3471 L2603.4703,5447.3471 L2603.4703,5473.7361 A0,0 0 0 0 2603.4703,5473.7361 L2891.156,5473.7361 A0,0 0 0 0 2891.156,5473.7361 L2891.156,5422.9581 L2881.156,5412.9581 L2603.4703,5412.9581 A0,0 0 0 0 2603.4703,5412.9581" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M2881.156,5412.9581 L2881.156,5422.9581 L2891.156,5422.9581 L2881.156,5412.9581" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="148.5804" x="2609.4703" y="5430.8541">Beer selection biased by</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="266.6857" x="2609.4703" y="5447.7801">user.persona.style_affinities and abv_range.</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="219.4598" x="2609.4703" y="5464.7061">Rating skew modulated per persona.</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="126.0347" x="2457.4356" y="5424.8841"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="106.0347" x="2467.4356" y="5447.7801">RunRatingPhase()</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="148.0175" x="2446.4442" y="5493.7361"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="128.0175" x="2456.4442" y="5516.6321">BEGIN TRANSACTION</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="311.5252" x="2364.6903" y="5609.0581"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="291.5252" x="2374.6903" y="5631.9541">Match brewery_id, select beer from beer_pool_</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="288.0478" x="2374.6903" y="5648.8801">(same brewery_id, biased by persona affinities)</text><polygon fill="#CBD2B5" points="2447.2936,5682.9101,2593.6122,5682.9101,2605.6122,5694.9101,2593.6122,5706.9101,2447.2936,5706.9101,2435.2936,5694.9101,2447.2936,5682.9101" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="146.3186" x="2447.2936" y="5699.3431">Beer exists for brewery?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="2414.1459" y="5690.8801">yes</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="2605.6122" y="5690.8801">no</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="256.0901" x="2242.0534" y="5716.9101"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="236.0901" x="2252.0534" y="5739.8061">GenerateRating(user, beer, checkin_id)</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="110.263" x="2252.0534" y="5756.7321">via DataGenerator</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="150.1336" x="2295.0316" y="5790.7621"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="130.1336" x="2305.0316" y="5813.6581">ProcessRating(rating)</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="276.0616" x="2232.0676" y="5858.7621"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="256.0616" x="2242.0676" y="5881.6581">PipelineLogger::Log(Info, RatingGeneration,</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="153.5141" x="2248.9836" y="5898.5841">nullopt, rating_id, "sqlite")</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="125.1082" x="2307.5443" y="5983.0771"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="105.1082" x="2317.5443" y="6005.9731">COMMIT & BEGIN</text><polygon fill="#CBD2B5" points="2309.4354,5932.6141,2430.7614,5932.6141,2442.7614,5944.6141,2430.7614,5956.6141,2309.4354,5956.6141,2297.4354,5944.6141,2309.4354,5932.6141" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="2374.0984" y="5969.5101">yes</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="121.326" x="2309.4354" y="5949.0471">Batch size reached?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="2442.7614" y="5940.5841">no</text><polygon fill="#CBD2B5" points="2370.0984,6040.0031,2382.0984,6052.0031,2370.0984,6064.0031,2358.0984,6052.0031,2370.0984,6040.0031" style="stroke:#4A5837;stroke-width:0.5;"/><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="285.3566" x="2528.1292" y="5716.9101"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="265.3566" x="2538.1292" y="5739.8061">PipelineLogger::Log(Warn, RatingGeneration,</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="168.3958" x="2545.0452" y="5756.7321">nullopt, brewery_id, "sqlite")</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="196.8815" x="2572.3667" y="5790.7621"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="176.8815" x="2582.3667" y="5813.6581">Skip -- brewery has no beers</text><polygon fill="#CBD2B5" points="2520.4529,6070.0031,2532.4529,6082.0031,2520.4529,6094.0031,2508.4529,6082.0031,2520.4529,6070.0031" style="stroke:#4A5837;stroke-width:0.5;"/><polygon fill="#CBD2B5" points="2378.5205,5550.6621,2662.3854,5550.6621,2674.3854,5562.6621,2662.3854,5574.6621,2378.5205,5574.6621,2366.5205,5562.6621,2378.5205,5550.6621" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="59.2411" x="2524.4529" y="5587.5581">remaining</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="283.865" x="2378.5205" y="5567.0951">For each GeneratedCheckin in checkin_pool_?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="30.706" x="2335.8145" y="5558.6321">done</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="112.2447" x="2464.3306" y="6136.0031"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="92.2447" x="2474.3306" y="6158.8991">COMMIT (Final)</text><path d="M2633.2891,6197.9291 L2633.2891,6207.3921 L2613.2891,6211.3921 L2633.2891,6215.3921 L2633.2891,6224.8551 A0,0 0 0 0 2633.2891,6224.8551 L2850.7226,6224.8551 A0,0 0 0 0 2850.7226,6224.8551 L2850.7226,6207.9291 L2840.7226,6197.9291 L2633.2891,6197.9291 A0,0 0 0 0 2633.2891,6197.9291" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M2840.7226,6197.9291 L2840.7226,6207.9291 L2850.7226,6207.9291 L2840.7226,6197.9291" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="196.4335" x="2639.2891" y="6215.8251">Safely closes the DB connection.</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="185.6723" x="2427.6168" y="6192.9291"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="165.6723" x="2437.6168" y="6215.8251">Finalize SqliteExportService</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="98.6565" x="2471.1247" y="6249.8551"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="78.6565" x="2481.1247" y="6272.7511">Close log_ch</text><line style="stroke:#4A5837;stroke-width:1;" x1="1780.5802" x2="1780.5802" y1="64.33" y2="6446.0961"/><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="95.5008" x="3346.868" y="1254.672"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="75.5008" x="3356.868" y="1277.568">Receive City</text><path d="M3550.2278,1331.598 L3550.2278,1341.061 L3530.2278,1345.061 L3550.2278,1349.061 L3550.2278,1358.524 A0,0 0 0 0 3550.2278,1358.524 L3784.5647,1358.524 A0,0 0 0 0 3784.5647,1358.524 L3784.5647,1341.598 L3774.5647,1331.598 L3550.2278,1331.598 A0,0 0 0 0 3550.2278,1331.598" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M3774.5647,1331.598 L3774.5647,1341.598 L3784.5647,1341.598 L3774.5647,1331.598" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="213.3369" x="3556.2278" y="1349.494">Guaranteed cache hit from startup.</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="271.2188" x="3259.0089" y="1326.598"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="251.2188" x="3269.0089" y="1349.494">GetLocationContextFromCache(location)</text><path d="M3552.3079,1394.05 L3552.3079,1428.902 L3532.3079,1432.902 L3552.3079,1436.902 L3552.3079,1471.754 A0,0 0 0 0 3552.3079,1471.754 L3786.6448,1471.754 A0,0 0 0 0 3786.6448,1471.754 L3786.6448,1404.05 L3776.6448,1394.05 L3552.3079,1394.05 A0,0 0 0 0 3552.3079,1394.05" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M3776.6448,1394.05 L3776.6448,1404.05 L3786.6448,1404.05 L3776.6448,1394.05" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="213.3369" x="3558.3079" y="1411.946">Guaranteed cache hit from startup.</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="201.4453" x="3558.3079" y="1428.872">Returns a Persona struct carrying</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="162.2598" x="3558.3079" y="1445.798">style_affinities, abv_range,</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="197.9643" x="3558.3079" y="1462.724">ibu_preference, checkin_weight.</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="275.379" x="3256.9289" y="1405.976"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="255.379" x="3266.9289" y="1428.872">IPersonaSelectionStrategy::SelectPersona(</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="120.7278" x="3273.8449" y="1445.798">personas_palette_)</text><path d="M3569.9196,1506.754 L3569.9196,1566.995 L3549.9196,1570.995 L3569.9196,1574.995 L3569.9196,1635.236 A0,0 0 0 0 3569.9196,1635.236 L3836.5906,1635.236 A0,0 0 0 0 3836.5906,1635.236 L3836.5906,1516.754 L3826.5906,1506.754 L3569.9196,1506.754 A0,0 0 0 0 3569.9196,1506.754" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M3826.5906,1506.754 L3826.5906,1516.754 L3836.5906,1516.754 L3826.5906,1506.754" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="245.671" x="3575.9196" y="1524.65">Deterministic lookup -- no LLM involved.</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="221.3642" x="3575.9196" y="1541.576">Free function (implemented today in</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="241.3876" x="3575.9196" y="1558.502">generate_users.cc), not a class method.</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="227.0581" x="3575.9196" y="1575.428">Name selected from pre-keyed maps</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="239.9088" x="3575.9196" y="1592.354">and passed into the generation prompt.</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="204.7406" x="3575.9196" y="1609.28">Skips the city if either map has no</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="116.4738" x="3575.9196" y="1626.206">entry for iso3166_1.</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="310.6024" x="3239.3172" y="1544.069"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="230.9418" x="3249.3172" y="1566.965">SampleName(forenames_by_country,</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="283.6864" x="3256.2332" y="1583.891">surnames_by_country, location.iso3166_1, rng)</text><path d="M3590.9421,1670.236 L3590.9421,1705.088 L3570.9421,1709.088 L3590.9421,1713.088 L3590.9421,1747.94 A0,0 0 0 0 3590.9421,1747.94 L3888.186,1747.94 A0,0 0 0 0 3888.186,1747.94 L3888.186,1680.236 L3878.186,1670.236 L3590.9421,1670.236 A0,0 0 0 0 3590.9421,1670.236" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M3878.186,1670.236 L3878.186,1680.236 L3888.186,1680.236 L3878.186,1670.236" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="276.2438" x="3596.9421" y="1688.132">LLM receives: EnrichedCity context + persona</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="240.7473" x="3596.9421" y="1705.058">description + sampled name. Generates</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="221.3189" x="3596.9421" y="1721.984">bio and preference signals grounded</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="130.7184" x="3596.9421" y="1738.91">in locale and persona.</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="352.6475" x="3218.2946" y="1682.162"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="332.6475" x="3228.2946" y="1705.058">GenerateUser(enriched_city, persona, sampled_name)</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="110.263" x="3228.2946" y="1721.984">via DataGenerator</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="265.5933" x="3261.8217" y="1782.94"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="245.5933" x="3271.8217" y="1805.836">PipelineLogger::Log(Info, UserGeneration,</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="110.3182" x="3278.7377" y="1822.762">city, user_id, "llm")</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="212.4033" x="3288.4167" y="1869.792"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="192.4033" x="3298.4167" y="1892.688">Send GeneratedUser -> exp_ch</text><polygon fill="#CBD2B5" points="3339.6039,1196.276,3449.6328,1196.276,3461.6328,1208.276,3449.6328,1220.276,3339.6039,1220.276,3327.6039,1208.276,3339.6039,1196.276" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="3398.6184" y="1233.172">yes</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="110.0289" x="3339.6039" y="1212.709">loc_ch has items?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="3312.4362" y="1204.246">no</text><path d="M3466.0071,1952.514 L3466.0071,1978.903 L3446.0071,1982.903 L3466.0071,1986.903 L3466.0071,2013.292 A0,0 0 0 0 3466.0071,2013.292 L3670.8078,2013.292 A0,0 0 0 0 3670.8078,2013.292 L3670.8078,1962.514 L3660.8078,1952.514 L3466.0071,1952.514 A0,0 0 0 0 3466.0071,1952.514" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M3660.8078,1952.514 L3660.8078,1962.514 L3670.8078,1962.514 L3660.8078,1952.514" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="148.7429" x="3472.0071" y="1970.41">Producer closes exp_ch.</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="151.5184" x="3472.0071" y="1987.336">SQLite Worker while loop</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="183.8007" x="3472.0071" y="2004.262">terminates on empty + closed.</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="102.7775" x="3343.2296" y="1964.44"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="82.7775" x="3353.2296" y="1987.336">Close exp_ch</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="215.0783" x="3258.8395" y="2400.392"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="195.0783" x="3268.8395" y="2423.288">Receive BreweryTask(City, User)</text><path d="M3535.903,2468.355 L3535.903,2477.818 L3515.903,2481.818 L3535.903,2485.818 L3535.903,2495.281 A0,0 0 0 0 3535.903,2495.281 L3770.2399,2495.281 A0,0 0 0 0 3770.2399,2495.281 L3770.2399,2478.355 L3760.2399,2468.355 L3535.903,2468.355 A0,0 0 0 0 3535.903,2468.355" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M3760.2399,2468.355 L3760.2399,2478.355 L3770.2399,2478.355 L3760.2399,2468.355" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="213.3369" x="3541.903" y="2486.251">Guaranteed cache hit from startup.</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="299.0486" x="3216.8543" y="2463.355"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="279.0486" x="3226.8543" y="2486.251">GetLocationContextFromCache(task.location)</text><path d="M3552.5983,2540.281 L3552.5983,2558.207 L3532.5983,2562.207 L3552.5983,2566.207 L3552.5983,2584.133 A0,0 0 0 0 3552.5983,2584.133 L3867.9024,2584.133 A0,0 0 0 0 3867.9024,2584.133 L3867.9024,2550.281 L3857.9024,2540.281 L3552.5983,2540.281 A0,0 0 0 0 3552.5983,2540.281" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M3857.9024,2540.281 L3857.9024,2550.281 L3867.9024,2550.281 L3857.9024,2540.281" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="131.8658" x="3558.5983" y="2558.177">KV cache stays warm.</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="294.3041" x="3558.5983" y="2575.103">Brewery is linked to the sampled owner_user_id.</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="332.4393" x="3200.159" y="2535.281"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="312.4393" x="3210.159" y="2558.177">GenerateBrewery(enriched_city, context, task.user)</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="110.263" x="3210.159" y="2575.103">via DataGenerator</text><rect fill="#EBECE3" height="70.778" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="165.1811" x="3283.7881" y="2624.133"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="145.1811" x="3293.7881" y="2647.029">PipelineLogger::Log(Info,</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="119.0803" x="3300.7041" y="2663.955">BreweryGeneration,</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="133.819" x="3300.7041" y="2680.881">city, brewery_id, "llm")</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="234.5294" x="3249.1139" y="2729.911"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="214.5294" x="3259.1139" y="2752.807">Send GeneratedBrewery -> exp_ch</text><polygon fill="#CBD2B5" points="3311.3642,2335.959,3421.3931,2335.959,3433.3931,2347.959,3421.3931,2359.959,3311.3642,2359.959,3299.3642,2347.959,3311.3642,2335.959" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="3370.3786" y="2372.855">yes</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="110.0289" x="3311.3642" y="2352.392">loc_ch has items?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="3284.1964" y="2343.929">no</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="102.7775" x="3314.9899" y="2819.374"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="82.7775" x="3324.9899" y="2842.27">Close exp_ch</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="184.7103" x="3270.7734" y="3260.122"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="164.7103" x="3280.7734" y="3283.018">Receive GeneratedBrewery</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="242.4597" x="3241.8987" y="3330.196"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="222.4597" x="3251.8987" y="3353.092">IBeerSelectionStrategy::SelectStyles(</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="186.0366" x="3258.8147" y="3370.018">brewery, beer_style_palette_)</text><path d="M3497.9167,3483.974 L3497.9167,3518.826 L3477.9167,3522.826 L3497.9167,3526.826 L3497.9167,3561.678 A0,0 0 0 0 3497.9167,3561.678 L3735.6433,3561.678 A0,0 0 0 0 3735.6433,3561.678 L3735.6433,3493.974 L3725.6433,3483.974 L3497.9167,3483.974 A0,0 0 0 0 3497.9167,3483.974" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><path d="M3725.6433,3483.974 L3725.6433,3493.974 L3735.6433,3493.974 L3725.6433,3483.974" fill="#DBEEDD" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="213.3369" x="3503.9167" y="3501.87">Guaranteed cache hit from startup.</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="189.1634" x="3503.9167" y="3518.796">KV cache stays warm across all</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="216.7265" x="3503.9167" y="3535.722">beer generations -- system prompt</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="208.9429" x="3503.9167" y="3552.648">does not change within this phase.</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="229.5765" x="3248.3403" y="3504.363"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="209.5765" x="3258.3403" y="3527.259">GetStyleContextFromCache(style)</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="253.4023" x="3236.4273" y="3596.678"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="233.4023" x="3246.4273" y="3619.574">GenerateBeer(brewery, style_context)</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="110.263" x="3246.4273" y="3636.5">via DataGenerator</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="217.4865" x="3254.3852" y="3681.141"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="197.4865" x="3264.3852" y="3704.037">Attach GeneratedBeer to bundle</text><polygon fill="#CBD2B5" points="3275.1996,3419.048,3451.0574,3419.048,3463.0574,3431.048,3451.0574,3443.048,3275.1996,3443.048,3263.1996,3431.048,3275.1996,3419.048" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="59.2411" x="3367.1285" y="3455.944">remaining</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="175.8578" x="3275.1996" y="3435.481">For each selected BeerStyle?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="30.706" x="3232.4936" y="3427.018">done</text><rect fill="#EBECE3" height="70.778" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="165.1811" x="3280.538" y="3777.067"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="145.1811" x="3290.538" y="3799.963">PipelineLogger::Log(Info,</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="97.1297" x="3297.454" y="3816.889">BeerGeneration,</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="133.819" x="3297.454" y="3833.815">city, brewery_id, "llm")</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="195.6918" x="3265.2826" y="3882.845"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="175.6918" x="3275.2826" y="3905.741">Send BeersBundle -> exp_ch</text><polygon fill="#CBD2B5" points="3302.0105,3195.578,3424.2465,3195.578,3436.2465,3207.578,3424.2465,3219.578,3302.0105,3219.578,3290.0105,3207.578,3302.0105,3195.578" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="3367.1285" y="3232.474">yes</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="122.2359" x="3302.0105" y="3212.011">brew_ch has items?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="3274.8428" y="3203.548">no</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="102.7775" x="3311.7398" y="3976.919"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="82.7775" x="3321.7398" y="3999.815">Close exp_ch</text><line style="stroke:#4A5837;stroke-width:1;" x1="3169.159" x2="3169.159" y1="64.33" y2="6446.0961"/><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="148.0175" x="4170.5165" y="1273.728"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="128.0175" x="4180.5165" y="1296.624">BEGIN TRANSACTION</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="162.5842" x="4163.2332" y="1406.106"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="142.5842" x="4173.2332" y="1429.002">Receive GeneratedUser</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="131.0462" x="4179.0022" y="1478.032"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="111.0462" x="4189.0022" y="1500.928">ProcessUser(user)</text><rect fill="#EBECE3" height="53.852" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="265.5933" x="4111.7287" y="1549.958"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="245.5933" x="4121.7287" y="1572.854">PipelineLogger::Log(Info, UserGeneration,</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="126.11" x="4128.6447" y="1589.78">city, user_id, "sqlite")</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="158.8269" x="4165.1119" y="1638.81"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="138.8269" x="4175.1119" y="1661.706">Append -> user_pool_</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="125.1082" x="4181.9712" y="1761.199"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="105.1082" x="4191.9712" y="1784.095">COMMIT & BEGIN</text><polygon fill="#CBD2B5" points="4183.8623,1710.736,4305.1883,1710.736,4317.1883,1722.736,4305.1883,1734.736,4183.8623,1734.736,4171.8623,1722.736,4183.8623,1710.736" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="4248.5253" y="1747.632">yes</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="121.326" x="4183.8623" y="1727.169">Batch size reached?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="4317.1883" y="1718.706">no</text><polygon fill="#CBD2B5" points="4244.5253,1824.588,4256.5253,1836.588,4244.5253,1848.588,4232.5253,1836.588,4244.5253,1824.588" style="stroke:#4A5837;stroke-width:0.5;"/><polygon fill="#CBD2B5" points="4187.5414,1345.654,4301.5092,1345.654,4313.5092,1357.654,4301.5092,1369.654,4187.5414,1369.654,4175.5414,1357.654,4187.5414,1345.654" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="4248.5253" y="1382.55">yes</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="113.9678" x="4187.5414" y="1362.087">exp_ch has items?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="4160.3736" y="1353.624">no</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="112.2447" x="4188.403" y="1905.588"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="92.2447" x="4198.403" y="1928.484">COMMIT (Final)</text><rect fill="#555555" height="6" rx="2.5" ry="2.5" style="stroke:#555555;stroke-width:1;" width="478.136" x="3925.186" y="2033.292"/><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="148.0175" x="4109.7914" y="2272.996"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="128.0175" x="4119.7914" y="2295.892">BEGIN TRANSACTION</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="184.7103" x="4091.4451" y="2394.355"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="164.7103" x="4101.4451" y="2417.251">Receive GeneratedBrewery</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="176.6731" x="4095.4636" y="2457.318"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="156.6731" x="4105.4636" y="2480.214">ProcessBrewery(brewery)</text><rect fill="#EBECE3" height="70.778" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="176.5268" x="4095.5368" y="2529.244"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="145.1811" x="4105.5368" y="2552.14">PipelineLogger::Log(Info,</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="119.0803" x="4112.4528" y="2569.066">BreweryGeneration,</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="149.6108" x="4112.4528" y="2585.992">city, brewery_id, "sqlite")</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="182.3278" x="4092.6363" y="2635.022"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="162.3278" x="4102.6363" y="2657.918">Append -> brewery_pool_</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="125.1082" x="4121.2461" y="2757.411"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="105.1082" x="4131.2461" y="2780.307">COMMIT & BEGIN</text><polygon fill="#CBD2B5" points="4123.1372,2706.948,4244.4632,2706.948,4256.4632,2718.948,4244.4632,2730.948,4123.1372,2730.948,4111.1372,2718.948,4123.1372,2706.948" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="4187.8002" y="2743.844">yes</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="121.326" x="4123.1372" y="2723.381">Batch size reached?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="4256.4632" y="2714.918">no</text><polygon fill="#CBD2B5" points="4183.8002,2814.337,4195.8002,2826.337,4183.8002,2838.337,4171.8002,2826.337,4183.8002,2814.337" style="stroke:#4A5837;stroke-width:0.5;"/><polygon fill="#CBD2B5" points="4126.8163,2329.922,4240.7841,2329.922,4252.7841,2341.922,4240.7841,2353.922,4126.8163,2353.922,4114.8163,2341.922,4126.8163,2329.922" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="4187.8002" y="2366.818">yes</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="113.9678" x="4126.8163" y="2346.355">exp_ch has items?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="4099.6485" y="2337.892">no</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="112.2447" x="4127.6779" y="2882.337"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="92.2447" x="4137.6779" y="2905.233">COMMIT (Final)</text><rect fill="#555555" height="6" rx="2.5" ry="2.5" style="stroke:#555555;stroke-width:1;" width="364.9694" x="3937.186" y="2939.263"/><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="148.0175" x="4031.2936" y="3182.43"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="128.0175" x="4041.2936" y="3205.326">BEGIN TRANSACTION</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="145.8726" x="4032.366" y="3317.048"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="125.8726" x="4042.366" y="3339.944">Receive BeersBundle</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="220.2327" x="3995.186" y="3453.9"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="200.2327" x="4005.186" y="3476.796">Set beer.brewery_id from bundle</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="132.7719" x="4038.9164" y="3525.826"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="112.7719" x="4048.9164" y="3548.722">ProcessBeer(beer)</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="160.3772" x="4025.1138" y="3597.752"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="140.3772" x="4035.1138" y="3620.648">Append -> beer_pool_</text><polygon fill="#CBD2B5" points="4030.6708,3388.974,4179.9338,3388.974,4191.9338,3400.974,4179.9338,3412.974,4030.6708,3412.974,4018.6708,3400.974,4030.6708,3388.974" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="59.2411" x="4109.3023" y="3425.87">remaining</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="149.263" x="4030.6708" y="3405.407">For each beer in bundle?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="30.706" x="3987.9648" y="3396.944">done</text><rect fill="#EBECE3" height="70.778" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="176.5268" x="4017.0389" y="3689.289"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="145.1811" x="4027.0389" y="3712.185">PipelineLogger::Log(Info,</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="97.1297" x="4033.9549" y="3729.111">BeerGeneration,</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="149.6108" x="4033.9549" y="3746.037">city, brewery_id, "sqlite")</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="125.1082" x="4042.7482" y="3845.53"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="105.1082" x="4052.7482" y="3868.426">COMMIT & BEGIN</text><polygon fill="#CBD2B5" points="4044.6393,3795.067,4165.9653,3795.067,4177.9653,3807.067,4165.9653,3819.067,4044.6393,3819.067,4032.6393,3807.067,4044.6393,3795.067" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="4109.3023" y="3831.963">yes</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="121.326" x="4044.6393" y="3811.5">Batch size reached?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="4177.9653" y="3803.037">no</text><polygon fill="#CBD2B5" points="4105.3023,3908.919,4117.3023,3920.919,4105.3023,3932.919,4093.3023,3920.919,4105.3023,3908.919" style="stroke:#4A5837;stroke-width:0.5;"/><polygon fill="#CBD2B5" points="4048.3184,3253.974,4162.2862,3253.974,4174.2862,3265.974,4162.2862,3277.974,4048.3184,3277.974,4036.3184,3265.974,4048.3184,3253.974" style="stroke:#4A5837;stroke-width:0.5;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="21.1478" x="4109.3023" y="3290.87">yes</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="113.9678" x="4048.3184" y="3270.407">exp_ch has items?</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="15.1678" x="4021.1506" y="3261.944">no</text><rect fill="#EBECE3" height="36.926" rx="12.5" ry="12.5" style="stroke:#4A5837;stroke-width:0.5;" width="112.2447" x="4049.18" y="3990.067"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="92.2447" x="4059.18" y="4012.963">COMMIT (Final)</text><rect fill="#555555" height="6" rx="2.5" ry="2.5" style="stroke:#555555;stroke-width:1;" width="304.2327" x="3949.186" y="4046.993"/><line style="stroke:#4A5837;stroke-width:1;" x1="3919.186" x2="3919.186" y1="64.33" y2="6446.0961"/><line style="stroke:#4A5837;stroke-width:1;" x1="4408.322" x2="4408.322" y1="64.33" y2="6446.0961"/><line style="stroke:#656F33;stroke-width:1;" x1="179.6112" x2="179.6112" y1="106.256" y2="126.256"/><polygon fill="#656F33" points="175.6112,116.256,179.6112,126.256,183.6112,116.256,179.6112,120.256" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="179.6112" x2="179.6112" y1="270.571" y2="297.608"/><polygon fill="#656F33" points="175.6112,287.608,179.6112,297.608,183.6112,287.608,179.6112,291.608" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="179.6112" x2="179.6112" y1="207.182" y2="233.645"/><polygon fill="#656F33" points="175.6112,223.645,179.6112,233.645,183.6112,223.645,179.6112,227.645" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="228.8628" x2="240.8628" y1="195.182" y2="195.182"/><polygon fill="#656F33" points="236.8628,267.608,240.8628,277.608,244.8628,267.608,240.8628,271.608" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="240.8628" x2="240.8628" y1="195.182" y2="341.608"/><line style="stroke:#656F33;stroke-width:1;" x1="240.8628" x2="179.6112" y1="341.608" y2="341.608"/><line style="stroke:#656F33;stroke-width:1;" x1="179.6112" x2="179.6112" y1="341.608" y2="361.608"/><polygon fill="#656F33" points="175.6112,351.608,179.6112,361.608,183.6112,351.608,179.6112,355.608" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="179.6112" x2="179.6112" y1="163.182" y2="183.182"/><polygon fill="#656F33" points="175.6112,173.182,179.6112,183.182,183.6112,173.182,179.6112,177.182" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="179.6112" x2="179.6112" y1="398.534" y2="418.534"/><polygon fill="#656F33" points="175.6112,408.534,179.6112,418.534,183.6112,408.534,179.6112,412.534" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="179.6112" x2="179.6112" y1="455.46" y2="477.386"/><polygon fill="#656F33" points="175.6112,467.386,179.6112,477.386,183.6112,467.386,179.6112,471.386" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="179.6112" x2="179.6112" y1="514.312" y2="546.238"/><polygon fill="#656F33" points="175.6112,536.238,179.6112,546.238,183.6112,536.238,179.6112,540.238" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="179.6112" x2="179.6112" y1="583.164" y2="613.553"/><polygon fill="#656F33" points="175.6112,603.553,179.6112,613.553,183.6112,603.553,179.6112,607.553" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="179.6112" x2="179.6112" y1="650.479" y2="690.868"/><polygon fill="#656F33" points="175.6112,680.868,179.6112,690.868,183.6112,680.868,179.6112,684.868" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="179.6112" x2="179.6112" y1="6343.7071" y2="6363.7071"/><polygon fill="#656F33" points="175.6112,6353.7071,179.6112,6363.7071,183.6112,6353.7071,179.6112,6357.7071" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="179.6112" x2="179.6112" y1="6400.6331" y2="6424.0961"/><polygon fill="#656F33" points="175.6112,6414.0961,179.6112,6424.0961,183.6112,6414.0961,179.6112,6418.0961" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="798.0409" x2="798.0409" y1="810.72" y2="830.72"/><polygon fill="#656F33" points="794.0409,820.72,798.0409,830.72,802.0409,820.72,798.0409,824.72" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="1217.7828" x2="1217.7828" y1="810.72" y2="830.72"/><polygon fill="#656F33" points="1213.7828,820.72,1217.7828,830.72,1221.7828,820.72,1217.7828,824.72" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="798.0409" x2="798.0409" y1="753.794" y2="773.794"/><polygon fill="#656F33" points="794.0409,763.794,798.0409,773.794,802.0409,763.794,798.0409,767.794" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="1217.7828" x2="1217.7828" y1="753.794" y2="773.794"/><polygon fill="#656F33" points="1213.7828,763.794,1217.7828,773.794,1221.7828,763.794,1217.7828,767.794" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="798.0409" x2="798.0409" y1="867.646" y2="887.646"/><polygon fill="#656F33" points="794.0409,877.646,798.0409,887.646,802.0409,877.646,798.0409,881.646" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="1217.7828" x2="1217.7828" y1="867.646" y2="887.646"/><polygon fill="#656F33" points="1213.7828,877.646,1217.7828,887.646,1221.7828,877.646,1217.7828,881.646" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="722.1821" x2="722.1821" y1="919.646" y2="939.646"/><polygon fill="#656F33" points="718.1821,929.646,722.1821,939.646,726.1821,929.646,722.1821,933.646" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="1007.7476" x2="1007.7476" y1="919.646" y2="939.646"/><polygon fill="#656F33" points="1003.7476,929.646,1007.7476,939.646,1011.7476,929.646,1007.7476,933.646" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="1303.0438" x2="1303.0438" y1="919.646" y2="948.109"/><polygon fill="#656F33" points="1299.0438,938.109,1303.0438,948.109,1307.0438,938.109,1303.0438,942.109" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="722.1821" x2="722.1821" y1="993.498" y2="1013.498"/><polygon fill="#656F33" points="718.1821,1003.498,722.1821,1013.498,726.1821,1003.498,722.1821,1007.498" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="1007.7476" x2="1007.7476" y1="993.498" y2="1013.498"/><polygon fill="#656F33" points="1003.7476,1003.498,1007.7476,1013.498,1011.7476,1003.498,1007.7476,1007.498" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="1303.0438" x2="1303.0438" y1="985.035" y2="1013.498"/><polygon fill="#656F33" points="1299.0438,1003.498,1303.0438,1013.498,1307.0438,1003.498,1303.0438,1007.498" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="1017.4782" x2="1017.4782" y1="893.646" y2="913.646"/><polygon fill="#656F33" points="1013.4782,903.646,1017.4782,913.646,1021.4782,903.646,1017.4782,907.646" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="1076.424" y2="1096.424"/><polygon fill="#656F33" points="2516.4529,1086.424,2520.4529,1096.424,2524.4529,1086.424,2520.4529,1090.424" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="1904.6211" x2="1904.6211" y1="1577.458" y2="1624.384"/><polygon fill="#656F33" points="1900.6211,1614.384,1904.6211,1624.384,1908.6211,1614.384,1904.6211,1618.384" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="1904.6211" x2="1904.6211" y1="1176.276" y2="1540.532"/><polygon fill="#656F33" points="1900.6211,1530.532,1904.6211,1540.532,1908.6211,1530.532,1904.6211,1534.532" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="1150.276" y2="1170.276"/><polygon fill="#656F33" points="2516.4529,1160.276,2520.4529,1170.276,2524.4529,1160.276,2520.4529,1164.276" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="2096.218" y2="2116.218"/><polygon fill="#656F33" points="2516.4529,2106.218,2520.4529,2116.218,2524.4529,2106.218,2520.4529,2110.218" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="2153.144" y2="2173.144"/><polygon fill="#656F33" points="2516.4529,2163.144,2520.4529,2173.144,2524.4529,2163.144,2520.4529,2167.144" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2030.2261" x2="2030.2261" y1="2549.633" y2="2584.633"/><polygon fill="#656F33" points="2026.2261,2574.633,2030.2261,2584.633,2034.2261,2574.633,2030.2261,2578.633" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2030.2261" x2="2030.2261" y1="2621.559" y2="2656.559"/><polygon fill="#656F33" points="2026.2261,2646.559,2030.2261,2656.559,2034.2261,2646.559,2030.2261,2650.559" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2030.2261" x2="2030.2261" y1="2252.996" y2="2495.781"/><polygon fill="#656F33" points="2026.2261,2485.781,2030.2261,2495.781,2034.2261,2485.781,2030.2261,2489.781" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="2226.996" y2="2246.996"/><polygon fill="#656F33" points="2516.4529,2236.996,2520.4529,2246.996,2524.4529,2236.996,2520.4529,2240.996" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="3002.189" y2="3025.652"/><polygon fill="#656F33" points="2516.4529,3015.652,2520.4529,3025.652,2524.4529,3015.652,2520.4529,3019.652" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="3062.578" y2="3082.578"/><polygon fill="#656F33" points="2516.4529,3072.578,2520.4529,3082.578,2524.4529,3072.578,2520.4529,3076.578" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2060.7286" x2="2060.7286" y1="3589.215" y2="3624.215"/><polygon fill="#656F33" points="2056.7286,3614.215,2060.7286,3624.215,2064.7286,3614.215,2060.7286,3618.215" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2060.7286" x2="2060.7286" y1="3162.43" y2="3552.289"/><polygon fill="#656F33" points="2056.7286,3542.289,2060.7286,3552.289,2064.7286,3542.289,2060.7286,3546.289" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="3136.43" y2="3156.43"/><polygon fill="#656F33" points="2516.4529,3146.43,2520.4529,3156.43,2524.4529,3146.43,2520.4529,3150.43" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2095.9764" y1="4223.623" y2="4243.623"/><polygon fill="#656F33" points="2091.9764,4233.623,2095.9764,4243.623,2099.9764,4233.623,2095.9764,4237.623" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2095.9764" y1="4297.475" y2="4335.938"/><polygon fill="#656F33" points="2091.9764,4325.938,2095.9764,4335.938,2099.9764,4325.938,2095.9764,4329.938" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2095.9764" y1="4645.383" y2="4680.383"/><polygon fill="#656F33" points="2091.9764,4670.383,2095.9764,4680.383,2099.9764,4670.383,2095.9764,4674.383" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2095.9764" y1="4717.3091" y2="4752.3091"/><polygon fill="#656F33" points="2091.9764,4742.3091,2095.9764,4752.3091,2099.9764,4742.3091,2095.9764,4746.3091" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2095.9764" y1="4806.1611" y2="4841.1611"/><polygon fill="#656F33" points="2091.9764,4831.1611,2095.9764,4841.1611,2099.9764,4831.1611,2095.9764,4835.1611" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2095.9764" y1="4878.0871" y2="4913.0871"/><polygon fill="#656F33" points="2091.9764,4903.0871,2095.9764,4913.0871,2099.9764,4903.0871,2095.9764,4907.0871" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2095.9764" y1="4966.9391" y2="5001.9391"/><polygon fill="#656F33" points="2091.9764,4991.9391,2095.9764,5001.9391,2099.9764,4991.9391,2095.9764,4995.9391" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2095.9764" y1="5091.4021" y2="5117.8651"/><polygon fill="#656F33" points="2091.9764,5107.8651,2095.9764,5117.8651,2099.9764,5107.8651,2095.9764,5111.8651" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2168.6394" x2="2180.6394" y1="5079.4021" y2="5079.4021"/><polygon fill="#656F33" points="2176.6394,5126.3281,2180.6394,5136.3281,2184.6394,5126.3281,2180.6394,5130.3281" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2180.6394" x2="2180.6394" y1="5079.4021" y2="5193.2541"/><line style="stroke:#656F33;stroke-width:1;" x1="2180.6394" x2="2107.9764" y1="5193.2541" y2="5193.2541"/><polygon fill="#656F33" points="2117.9764,5189.2541,2107.9764,5193.2541,2117.9764,5197.2541,2113.9764,5193.2541" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2095.9764" y1="5154.7911" y2="5181.2541"/><polygon fill="#656F33" points="2091.9764,5171.2541,2095.9764,5181.2541,2099.9764,5171.2541,2095.9764,5175.2541" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2095.9764" y1="5038.8651" y2="5067.4021"/><polygon fill="#656F33" points="2091.9764,5057.4021,2095.9764,5067.4021,2099.9764,5057.4021,2095.9764,5061.4021" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2095.9764" y1="4567.531" y2="4608.457"/><polygon fill="#656F33" points="2091.9764,4598.457,2095.9764,4608.457,2099.9764,4598.457,2095.9764,4602.457" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2095.9764" y1="5205.2541" y2="5215.2541"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2251.9627" y1="5215.2541" y2="5215.2541"/><polygon fill="#656F33" points="2247.9627,4899.6241,2251.9627,4889.6241,2255.9627,4899.6241,2251.9627,4895.6241" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2251.9627" x2="2251.9627" y1="4555.531" y2="5215.2541"/><line style="stroke:#656F33;stroke-width:1;" x1="2251.9627" x2="2180.6887" y1="4555.531" y2="4555.531"/><polygon fill="#656F33" points="2190.6887,4551.531,2180.6887,4555.531,2190.6887,4559.531,2186.6887,4555.531" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2011.2641" x2="1939.9901" y1="4555.531" y2="4555.531"/><polygon fill="#656F33" points="1935.9901,4885.6241,1939.9901,4895.6241,1943.9901,4885.6241,1939.9901,4889.6241" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="1939.9901" x2="1939.9901" y1="4555.531" y2="5227.2541"/><line style="stroke:#656F33;stroke-width:1;" x1="1939.9901" x2="2263.9627" y1="5227.2541" y2="5227.2541"/><line style="stroke:#656F33;stroke-width:1;" x1="2263.9627" x2="2263.9627" y1="4418.679" y2="5227.2541"/><line style="stroke:#656F33;stroke-width:1;" x1="2263.9627" x2="2228.8278" y1="4418.679" y2="4418.679"/><polygon fill="#656F33" points="2238.8278,4414.679,2228.8278,4418.679,2238.8278,4422.679,2234.8278,4418.679" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2095.9764" y1="4508.531" y2="4543.531"/><polygon fill="#656F33" points="2091.9764,4533.531,2095.9764,4543.531,2099.9764,4533.531,2095.9764,4537.531" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2095.9764" y1="4430.679" y2="4471.605"/><polygon fill="#656F33" points="2091.9764,4461.605,2095.9764,4471.605,2099.9764,4461.605,2095.9764,4465.605" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="1963.125" x2="1915.9901" y1="4418.679" y2="4418.679"/><polygon fill="#656F33" points="1911.9901,4829.1981,1915.9901,4839.1981,1919.9901,4829.1981,1915.9901,4833.1981" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="1915.9901" x2="1915.9901" y1="4418.679" y2="5249.2541"/><line style="stroke:#656F33;stroke-width:1;" x1="1915.9901" x2="2095.9764" y1="5249.2541" y2="5249.2541"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2095.9764" y1="5249.2541" y2="5269.2541"/><polygon fill="#656F33" points="2091.9764,5259.2541,2095.9764,5269.2541,2099.9764,5259.2541,2095.9764,5263.2541" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2095.9764" y1="4372.864" y2="4406.679"/><polygon fill="#656F33" points="2091.9764,4396.679,2095.9764,4406.679,2099.9764,4396.679,2095.9764,4400.679" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2687.4845" x2="2687.4845" y1="4349.049" y2="4394.79"/><polygon fill="#656F33" points="2683.4845,4384.79,2687.4845,4394.79,2691.4845,4384.79,2687.4845,4388.79" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2687.4845" x2="2687.4845" y1="4448.642" y2="4495.568"/><polygon fill="#656F33" points="2683.4845,4485.568,2687.4845,4495.568,2691.4845,4485.568,2687.4845,4489.568" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2687.4845" x2="2687.4845" y1="4532.494" y2="4567.494"/><polygon fill="#656F33" points="2683.4845,4557.494,2687.4845,4567.494,2691.4845,4557.494,2687.4845,4561.494" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2687.4845" x2="2687.4845" y1="4758.1981" y2="4793.1981"/><polygon fill="#656F33" points="2683.4845,4783.1981,2687.4845,4793.1981,2691.4845,4783.1981,2687.4845,4787.1981" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2687.4845" x2="2687.4845" y1="4847.0501" y2="4882.0501"/><polygon fill="#656F33" points="2683.4845,4872.0501,2687.4845,4882.0501,2691.4845,4872.0501,2687.4845,4876.0501" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2687.4845" x2="2687.4845" y1="4977.9761" y2="5004.4391"/><polygon fill="#656F33" points="2683.4845,4994.4391,2687.4845,5004.4391,2691.4845,4994.4391,2687.4845,4998.4391" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2760.1475" x2="2772.1475" y1="4965.9761" y2="4965.9761"/><polygon fill="#656F33" points="2768.1475,5012.9021,2772.1475,5022.9021,2776.1475,5012.9021,2772.1475,5016.9021" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2772.1475" x2="2772.1475" y1="4965.9761" y2="5073.3651"/><line style="stroke:#656F33;stroke-width:1;" x1="2772.1475" x2="2699.4845" y1="5073.3651" y2="5073.3651"/><polygon fill="#656F33" points="2709.4845,5069.3651,2699.4845,5073.3651,2709.4845,5077.3651,2705.4845,5073.3651" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2687.4845" x2="2687.4845" y1="5041.3651" y2="5061.3651"/><polygon fill="#656F33" points="2683.4845,5051.3651,2687.4845,5061.3651,2691.4845,5051.3651,2687.4845,5055.3651" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2687.4845" x2="2687.4845" y1="4918.9761" y2="4953.9761"/><polygon fill="#656F33" points="2683.4845,4943.9761,2687.4845,4953.9761,2691.4845,4943.9761,2687.4845,4947.9761" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2687.4845" x2="2687.4845" y1="4680.346" y2="4721.2721"/><polygon fill="#656F33" points="2683.4845,4711.2721,2687.4845,4721.2721,2691.4845,4711.2721,2687.4845,4715.2721" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2687.4845" x2="2687.4845" y1="5085.3651" y2="5097.3651"/><line style="stroke:#656F33;stroke-width:1;" x1="2687.4845" x2="2837.7054" y1="5097.3651" y2="5097.3651"/><polygon fill="#656F33" points="2833.7054,4896.0871,2837.7054,4886.0871,2841.7054,4896.0871,2837.7054,4892.0871" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2837.7054" x2="2837.7054" y1="4668.346" y2="5097.3651"/><line style="stroke:#656F33;stroke-width:1;" x1="2837.7054" x2="2782.1127" y1="4668.346" y2="4668.346"/><polygon fill="#656F33" points="2792.1127,4664.346,2782.1127,4668.346,2792.1127,4672.346,2788.1127,4668.346" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2592.8563" x2="2537.2636" y1="4668.346" y2="4668.346"/><polygon fill="#656F33" points="2533.2636,4882.0871,2537.2636,4892.0871,2541.2636,4882.0871,2537.2636,4886.0871" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2537.2636" x2="2537.2636" y1="4668.346" y2="5109.3651"/><line style="stroke:#656F33;stroke-width:1;" x1="2537.2636" x2="2687.4845" y1="5109.3651" y2="5109.3651"/><line style="stroke:#656F33;stroke-width:1;" x1="2687.4845" x2="2687.4845" y1="5109.3651" y2="5144.3651"/><polygon fill="#656F33" points="2683.4845,5134.3651,2687.4845,5144.3651,2691.4845,5134.3651,2687.4845,5138.3651" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2687.4845" x2="2687.4845" y1="4621.346" y2="4656.346"/><polygon fill="#656F33" points="2683.4845,4646.346,2687.4845,4656.346,2691.4845,4646.346,2687.4845,4650.346" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2095.9764" y1="4166.697" y2="4186.697"/><polygon fill="#656F33" points="2091.9764,4176.697,2095.9764,4186.697,2099.9764,4176.697,2095.9764,4180.697" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2687.4845" x2="2687.4845" y1="4166.697" y2="4312.123"/><polygon fill="#656F33" points="2683.4845,4302.123,2687.4845,4312.123,2691.4845,4302.123,2687.4845,4306.123" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2095.9764" x2="2095.9764" y1="5306.1801" y2="5326.1801"/><polygon fill="#656F33" points="2091.9764,5316.1801,2095.9764,5326.1801,2099.9764,5316.1801,2095.9764,5320.1801" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2687.4845" x2="2687.4845" y1="5181.2911" y2="5326.1801"/><polygon fill="#656F33" points="2683.4845,5316.1801,2687.4845,5326.1801,2691.4845,5316.1801,2687.4845,5320.1801" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="4120.308" y2="4160.697"/><polygon fill="#656F33" points="2516.4529,4150.697,2520.4529,4160.697,2524.4529,4150.697,2520.4529,4154.697" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="5332.1801" y2="5354.1061"/><polygon fill="#656F33" points="2516.4529,5344.1061,2520.4529,5354.1061,2524.4529,5344.1061,2520.4529,5348.1061" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="5391.0321" y2="5424.8841"/><polygon fill="#656F33" points="2516.4529,5414.8841,2520.4529,5424.8841,2524.4529,5414.8841,2520.4529,5418.8841" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="5461.8101" y2="5493.7361"/><polygon fill="#656F33" points="2516.4529,5483.7361,2520.4529,5493.7361,2524.4529,5483.7361,2520.4529,5487.7361" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2370.0984" x2="2370.0984" y1="5770.7621" y2="5790.7621"/><polygon fill="#656F33" points="2366.0984,5780.7621,2370.0984,5790.7621,2374.0984,5780.7621,2370.0984,5784.7621" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2370.0984" x2="2370.0984" y1="5827.6881" y2="5858.7621"/><polygon fill="#656F33" points="2366.0984,5848.7621,2370.0984,5858.7621,2374.0984,5848.7621,2370.0984,5852.7621" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2370.0984" x2="2370.0984" y1="5956.6141" y2="5983.0771"/><polygon fill="#656F33" points="2366.0984,5973.0771,2370.0984,5983.0771,2374.0984,5973.0771,2370.0984,5977.0771" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2442.7614" x2="2454.7614" y1="5944.6141" y2="5944.6141"/><polygon fill="#656F33" points="2450.7614,5991.5401,2454.7614,6001.5401,2458.7614,5991.5401,2454.7614,5995.5401" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2454.7614" x2="2454.7614" y1="5944.6141" y2="6052.0031"/><line style="stroke:#656F33;stroke-width:1;" x1="2454.7614" x2="2382.0984" y1="6052.0031" y2="6052.0031"/><polygon fill="#656F33" points="2392.0984,6048.0031,2382.0984,6052.0031,2392.0984,6056.0031,2388.0984,6052.0031" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2370.0984" x2="2370.0984" y1="6020.0031" y2="6040.0031"/><polygon fill="#656F33" points="2366.0984,6030.0031,2370.0984,6040.0031,2374.0984,6030.0031,2370.0984,6034.0031" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2370.0984" x2="2370.0984" y1="5912.6141" y2="5932.6141"/><polygon fill="#656F33" points="2366.0984,5922.6141,2370.0984,5932.6141,2374.0984,5922.6141,2370.0984,5926.6141" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2670.8075" x2="2670.8075" y1="5770.7621" y2="5790.7621"/><polygon fill="#656F33" points="2666.8075,5780.7621,2670.8075,5790.7621,2674.8075,5780.7621,2670.8075,5784.7621" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2435.2936" x2="2370.0984" y1="5694.9101" y2="5694.9101"/><line style="stroke:#656F33;stroke-width:1;" x1="2370.0984" x2="2370.0984" y1="5694.9101" y2="5716.9101"/><polygon fill="#656F33" points="2366.0984,5706.9101,2370.0984,5716.9101,2374.0984,5706.9101,2370.0984,5710.9101" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2605.6122" x2="2670.8075" y1="5694.9101" y2="5694.9101"/><line style="stroke:#656F33;stroke-width:1;" x1="2670.8075" x2="2670.8075" y1="5694.9101" y2="5716.9101"/><polygon fill="#656F33" points="2666.8075,5706.9101,2670.8075,5716.9101,2674.8075,5706.9101,2670.8075,5710.9101" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2370.0984" x2="2370.0984" y1="6064.0031" y2="6082.0031"/><line style="stroke:#656F33;stroke-width:1;" x1="2370.0984" x2="2508.4529" y1="6082.0031" y2="6082.0031"/><polygon fill="#656F33" points="2498.4529,6078.0031,2508.4529,6082.0031,2498.4529,6086.0031,2502.4529,6082.0031" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2670.8075" x2="2670.8075" y1="5827.6881" y2="6082.0031"/><line style="stroke:#656F33;stroke-width:1;" x1="2670.8075" x2="2532.4529" y1="6082.0031" y2="6082.0031"/><polygon fill="#656F33" points="2542.4529,6078.0031,2532.4529,6082.0031,2542.4529,6086.0031,2538.4529,6082.0031" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="5662.9101" y2="5682.9101"/><polygon fill="#656F33" points="2516.4529,5672.9101,2520.4529,5682.9101,2524.4529,5672.9101,2520.4529,5676.9101" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="5574.6621" y2="5609.0581"/><polygon fill="#656F33" points="2516.4529,5599.0581,2520.4529,5609.0581,2524.4529,5599.0581,2520.4529,5603.0581" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="6094.0031" y2="6104.0031"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2835.4858" y1="6104.0031" y2="6104.0031"/><polygon fill="#656F33" points="2831.4858,5838.7621,2835.4858,5828.7621,2839.4858,5838.7621,2835.4858,5834.7621" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2835.4858" x2="2835.4858" y1="5562.6621" y2="6104.0031"/><line style="stroke:#656F33;stroke-width:1;" x1="2835.4858" x2="2674.3854" y1="5562.6621" y2="5562.6621"/><polygon fill="#656F33" points="2684.3854,5558.6621,2674.3854,5562.6621,2684.3854,5566.6621,2680.3854,5562.6621" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2366.5205" x2="2210.0676" y1="5562.6621" y2="5562.6621"/><polygon fill="#656F33" points="2206.0676,5824.7621,2210.0676,5834.7621,2214.0676,5824.7621,2210.0676,5828.7621" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2210.0676" x2="2210.0676" y1="5562.6621" y2="6116.0031"/><line style="stroke:#656F33;stroke-width:1;" x1="2210.0676" x2="2520.4529" y1="6116.0031" y2="6116.0031"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="6116.0031" y2="6136.0031"/><polygon fill="#656F33" points="2516.4529,6126.0031,2520.4529,6136.0031,2524.4529,6126.0031,2520.4529,6130.0031" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="5530.6621" y2="5550.6621"/><polygon fill="#656F33" points="2516.4529,5540.6621,2520.4529,5550.6621,2524.4529,5540.6621,2520.4529,5544.6621" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="6172.9291" y2="6192.9291"/><polygon fill="#656F33" points="2516.4529,6182.9291,2520.4529,6192.9291,2524.4529,6182.9291,2520.4529,6186.9291" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="6229.8551" y2="6249.8551"/><polygon fill="#656F33" points="2516.4529,6239.8551,2520.4529,6249.8551,2524.4529,6239.8551,2520.4529,6243.8551" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3394.6184" x2="3394.6184" y1="1291.598" y2="1326.598"/><polygon fill="#656F33" points="3390.6184,1316.598,3394.6184,1326.598,3398.6184,1316.598,3394.6184,1320.598" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3394.6184" x2="3394.6184" y1="1363.524" y2="1405.976"/><polygon fill="#656F33" points="3390.6184,1395.976,3394.6184,1405.976,3398.6184,1395.976,3394.6184,1399.976" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3394.6184" x2="3394.6184" y1="1459.828" y2="1544.069"/><polygon fill="#656F33" points="3390.6184,1534.069,3394.6184,1544.069,3398.6184,1534.069,3394.6184,1538.069" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3394.6184" x2="3394.6184" y1="1597.921" y2="1682.162"/><polygon fill="#656F33" points="3390.6184,1672.162,3394.6184,1682.162,3398.6184,1672.162,3394.6184,1676.162" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3394.6184" x2="3394.6184" y1="1736.014" y2="1782.94"/><polygon fill="#656F33" points="3390.6184,1772.94,3394.6184,1782.94,3398.6184,1772.94,3394.6184,1776.94" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3394.6184" x2="3394.6184" y1="1836.792" y2="1869.792"/><polygon fill="#656F33" points="3390.6184,1859.792,3394.6184,1869.792,3398.6184,1859.792,3394.6184,1863.792" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3394.6184" x2="3394.6184" y1="1220.276" y2="1254.672"/><polygon fill="#656F33" points="3390.6184,1244.672,3394.6184,1254.672,3398.6184,1244.672,3394.6184,1248.672" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3394.6184" x2="3394.6184" y1="1906.718" y2="1918.718"/><line style="stroke:#656F33;stroke-width:1;" x1="3394.6184" x2="3900.186" y1="1918.718" y2="1918.718"/><polygon fill="#656F33" points="3896.186,1568.995,3900.186,1558.995,3904.186,1568.995,3900.186,1564.995" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3900.186" x2="3900.186" y1="1208.276" y2="1918.718"/><line style="stroke:#656F33;stroke-width:1;" x1="3900.186" x2="3461.6328" y1="1208.276" y2="1208.276"/><polygon fill="#656F33" points="3471.6328,1204.276,3461.6328,1208.276,3471.6328,1212.276,3467.6328,1208.276" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3327.6039" x2="3206.2946" y1="1208.276" y2="1208.276"/><polygon fill="#656F33" points="3202.2946,1554.995,3206.2946,1564.995,3210.2946,1554.995,3206.2946,1558.995" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3206.2946" x2="3206.2946" y1="1208.276" y2="1930.718"/><line style="stroke:#656F33;stroke-width:1;" x1="3206.2946" x2="3394.6184" y1="1930.718" y2="1930.718"/><line style="stroke:#656F33;stroke-width:1;" x1="3394.6184" x2="3394.6184" y1="1930.718" y2="1964.44"/><polygon fill="#656F33" points="3390.6184,1954.44,3394.6184,1964.44,3398.6184,1954.44,3394.6184,1958.44" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3366.3786" x2="3366.3786" y1="2437.318" y2="2463.355"/><polygon fill="#656F33" points="3362.3786,2453.355,3366.3786,2463.355,3370.3786,2453.355,3366.3786,2457.355" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3366.3786" x2="3366.3786" y1="2500.281" y2="2535.281"/><polygon fill="#656F33" points="3362.3786,2525.281,3366.3786,2535.281,3370.3786,2525.281,3366.3786,2529.281" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3366.3786" x2="3366.3786" y1="2589.133" y2="2624.133"/><polygon fill="#656F33" points="3362.3786,2614.133,3366.3786,2624.133,3370.3786,2614.133,3366.3786,2618.133" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3366.3786" x2="3366.3786" y1="2694.911" y2="2729.911"/><polygon fill="#656F33" points="3362.3786,2719.911,3366.3786,2729.911,3370.3786,2719.911,3366.3786,2723.911" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3366.3786" x2="3366.3786" y1="2359.959" y2="2400.392"/><polygon fill="#656F33" points="3362.3786,2390.392,3366.3786,2400.392,3370.3786,2390.392,3366.3786,2394.392" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3366.3786" x2="3366.3786" y1="2766.837" y2="2778.837"/><line style="stroke:#656F33;stroke-width:1;" x1="3366.3786" x2="3879.9024" y1="2778.837" y2="2778.837"/><polygon fill="#656F33" points="3875.9024,2568.67,3879.9024,2558.67,3883.9024,2568.67,3879.9024,2564.67" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3879.9024" x2="3879.9024" y1="2347.959" y2="2778.837"/><line style="stroke:#656F33;stroke-width:1;" x1="3879.9024" x2="3433.3931" y1="2347.959" y2="2347.959"/><polygon fill="#656F33" points="3443.3931,2343.959,3433.3931,2347.959,3443.3931,2351.959,3439.3931,2347.959" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3299.3642" x2="3188.159" y1="2347.959" y2="2347.959"/><polygon fill="#656F33" points="3184.159,2554.67,3188.159,2564.67,3192.159,2554.67,3188.159,2558.67" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3188.159" x2="3188.159" y1="2347.959" y2="2790.837"/><line style="stroke:#656F33;stroke-width:1;" x1="3188.159" x2="3366.3786" y1="2790.837" y2="2790.837"/><line style="stroke:#656F33;stroke-width:1;" x1="3366.3786" x2="3366.3786" y1="2790.837" y2="2819.374"/><polygon fill="#656F33" points="3362.3786,2809.374,3366.3786,2819.374,3370.3786,2809.374,3366.3786,2813.374" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3363.1285" x2="3363.1285" y1="3297.048" y2="3330.196"/><polygon fill="#656F33" points="3359.1285,3320.196,3363.1285,3330.196,3367.1285,3320.196,3363.1285,3324.196" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3363.1285" x2="3363.1285" y1="3541.289" y2="3596.678"/><polygon fill="#656F33" points="3359.1285,3586.678,3363.1285,3596.678,3367.1285,3586.678,3363.1285,3590.678" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3363.1285" x2="3363.1285" y1="3650.53" y2="3681.141"/><polygon fill="#656F33" points="3359.1285,3671.141,3363.1285,3681.141,3367.1285,3671.141,3363.1285,3675.141" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3363.1285" x2="3363.1285" y1="3443.048" y2="3504.363"/><polygon fill="#656F33" points="3359.1285,3494.363,3363.1285,3504.363,3367.1285,3494.363,3363.1285,3498.363" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3363.1285" x2="3363.1285" y1="3718.067" y2="3730.067"/><line style="stroke:#656F33;stroke-width:1;" x1="3363.1285" x2="3747.6433" y1="3730.067" y2="3730.067"/><polygon fill="#656F33" points="3743.6433,3592.752,3747.6433,3582.752,3751.6433,3592.752,3747.6433,3588.752" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3747.6433" x2="3747.6433" y1="3431.048" y2="3730.067"/><line style="stroke:#656F33;stroke-width:1;" x1="3747.6433" x2="3463.0574" y1="3431.048" y2="3431.048"/><polygon fill="#656F33" points="3473.0574,3427.048,3463.0574,3431.048,3473.0574,3435.048,3469.0574,3431.048" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3263.1996" x2="3224.4273" y1="3431.048" y2="3431.048"/><polygon fill="#656F33" points="3220.4273,3578.752,3224.4273,3588.752,3228.4273,3578.752,3224.4273,3582.752" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3224.4273" x2="3224.4273" y1="3431.048" y2="3742.067"/><line style="stroke:#656F33;stroke-width:1;" x1="3224.4273" x2="3363.1285" y1="3742.067" y2="3742.067"/><line style="stroke:#656F33;stroke-width:1;" x1="3363.1285" x2="3363.1285" y1="3742.067" y2="3777.067"/><polygon fill="#656F33" points="3359.1285,3767.067,3363.1285,3777.067,3367.1285,3767.067,3363.1285,3771.067" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3363.1285" x2="3363.1285" y1="3384.048" y2="3419.048"/><polygon fill="#656F33" points="3359.1285,3409.048,3363.1285,3419.048,3367.1285,3409.048,3363.1285,3413.048" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3363.1285" x2="3363.1285" y1="3847.845" y2="3882.845"/><polygon fill="#656F33" points="3359.1285,3872.845,3363.1285,3882.845,3367.1285,3872.845,3363.1285,3876.845" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3363.1285" x2="3363.1285" y1="3219.578" y2="3260.122"/><polygon fill="#656F33" points="3359.1285,3250.122,3363.1285,3260.122,3367.1285,3250.122,3363.1285,3254.122" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3363.1285" x2="3363.1285" y1="3919.771" y2="3931.771"/><line style="stroke:#656F33;stroke-width:1;" x1="3363.1285" x2="3759.6433" y1="3931.771" y2="3931.771"/><polygon fill="#656F33" points="3755.6433,3580.752,3759.6433,3570.752,3763.6433,3580.752,3759.6433,3576.752" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3759.6433" x2="3759.6433" y1="3207.578" y2="3931.771"/><line style="stroke:#656F33;stroke-width:1;" x1="3759.6433" x2="3436.2465" y1="3207.578" y2="3207.578"/><polygon fill="#656F33" points="3446.2465,3203.578,3436.2465,3207.578,3446.2465,3211.578,3442.2465,3207.578" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3290.0105" x2="3200.4273" y1="3207.578" y2="3207.578"/><polygon fill="#656F33" points="3196.4273,3566.752,3200.4273,3576.752,3204.4273,3566.752,3200.4273,3570.752" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3200.4273" x2="3200.4273" y1="3207.578" y2="3943.771"/><line style="stroke:#656F33;stroke-width:1;" x1="3200.4273" x2="3363.1285" y1="3943.771" y2="3943.771"/><line style="stroke:#656F33;stroke-width:1;" x1="3363.1285" x2="3363.1285" y1="3943.771" y2="3976.919"/><polygon fill="#656F33" points="3359.1285,3966.919,3363.1285,3976.919,3367.1285,3966.919,3363.1285,3970.919" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4244.5253" x2="4244.5253" y1="1443.032" y2="1478.032"/><polygon fill="#656F33" points="4240.5253,1468.032,4244.5253,1478.032,4248.5253,1468.032,4244.5253,1472.032" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4244.5253" x2="4244.5253" y1="1514.958" y2="1549.958"/><polygon fill="#656F33" points="4240.5253,1539.958,4244.5253,1549.958,4248.5253,1539.958,4244.5253,1543.958" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4244.5253" x2="4244.5253" y1="1603.81" y2="1638.81"/><polygon fill="#656F33" points="4240.5253,1628.81,4244.5253,1638.81,4248.5253,1628.81,4244.5253,1632.81" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4244.5253" x2="4244.5253" y1="1734.736" y2="1761.199"/><polygon fill="#656F33" points="4240.5253,1751.199,4244.5253,1761.199,4248.5253,1751.199,4244.5253,1755.199" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4317.1883" x2="4329.1883" y1="1722.736" y2="1722.736"/><polygon fill="#656F33" points="4325.1883,1769.662,4329.1883,1779.662,4333.1883,1769.662,4329.1883,1773.662" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4329.1883" x2="4329.1883" y1="1722.736" y2="1836.588"/><line style="stroke:#656F33;stroke-width:1;" x1="4329.1883" x2="4256.5253" y1="1836.588" y2="1836.588"/><polygon fill="#656F33" points="4266.5253,1832.588,4256.5253,1836.588,4266.5253,1840.588,4262.5253,1836.588" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4244.5253" x2="4244.5253" y1="1798.125" y2="1824.588"/><polygon fill="#656F33" points="4240.5253,1814.588,4244.5253,1824.588,4248.5253,1814.588,4244.5253,1818.588" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4244.5253" x2="4244.5253" y1="1675.736" y2="1710.736"/><polygon fill="#656F33" points="4240.5253,1700.736,4244.5253,1710.736,4248.5253,1700.736,4244.5253,1704.736" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4244.5253" x2="4244.5253" y1="1369.654" y2="1406.106"/><polygon fill="#656F33" points="4240.5253,1396.106,4244.5253,1406.106,4248.5253,1396.106,4244.5253,1400.106" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4244.5253" x2="4244.5253" y1="1848.588" y2="1858.588"/><line style="stroke:#656F33;stroke-width:1;" x1="4244.5253" x2="4389.322" y1="1858.588" y2="1858.588"/><polygon fill="#656F33" points="4385.322,1616.884,4389.322,1606.884,4393.322,1616.884,4389.322,1612.884" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4389.322" x2="4389.322" y1="1357.654" y2="1858.588"/><line style="stroke:#656F33;stroke-width:1;" x1="4389.322" x2="4313.5092" y1="1357.654" y2="1357.654"/><polygon fill="#656F33" points="4323.5092,1353.654,4313.5092,1357.654,4323.5092,1361.654,4319.5092,1357.654" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4175.5414" x2="4099.7287" y1="1357.654" y2="1357.654"/><polygon fill="#656F33" points="4095.7287,1602.884,4099.7287,1612.884,4103.7287,1602.884,4099.7287,1606.884" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4099.7287" x2="4099.7287" y1="1357.654" y2="1870.588"/><line style="stroke:#656F33;stroke-width:1;" x1="4099.7287" x2="4244.5253" y1="1870.588" y2="1870.588"/><line style="stroke:#656F33;stroke-width:1;" x1="4244.5253" x2="4244.5253" y1="1870.588" y2="1905.588"/><polygon fill="#656F33" points="4240.5253,1895.588,4244.5253,1905.588,4248.5253,1895.588,4244.5253,1899.588" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4244.5253" x2="4244.5253" y1="1310.654" y2="1345.654"/><polygon fill="#656F33" points="4240.5253,1335.654,4244.5253,1345.654,4248.5253,1335.654,4244.5253,1339.654" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4244.5253" x2="4244.5253" y1="1942.514" y2="2033.292"/><polygon fill="#656F33" points="4240.5253,2023.292,4244.5253,2033.292,4248.5253,2023.292,4244.5253,2027.292" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4183.8002" x2="4183.8002" y1="2431.281" y2="2457.318"/><polygon fill="#656F33" points="4179.8002,2447.318,4183.8002,2457.318,4187.8002,2447.318,4183.8002,2451.318" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4183.8002" x2="4183.8002" y1="2494.244" y2="2529.244"/><polygon fill="#656F33" points="4179.8002,2519.244,4183.8002,2529.244,4187.8002,2519.244,4183.8002,2523.244" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4183.8002" x2="4183.8002" y1="2600.022" y2="2635.022"/><polygon fill="#656F33" points="4179.8002,2625.022,4183.8002,2635.022,4187.8002,2625.022,4183.8002,2629.022" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4183.8002" x2="4183.8002" y1="2730.948" y2="2757.411"/><polygon fill="#656F33" points="4179.8002,2747.411,4183.8002,2757.411,4187.8002,2747.411,4183.8002,2751.411" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4256.4632" x2="4268.4632" y1="2718.948" y2="2718.948"/><polygon fill="#656F33" points="4264.4632,2765.874,4268.4632,2775.874,4272.4632,2765.874,4268.4632,2769.874" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4268.4632" x2="4268.4632" y1="2718.948" y2="2826.337"/><line style="stroke:#656F33;stroke-width:1;" x1="4268.4632" x2="4195.8002" y1="2826.337" y2="2826.337"/><polygon fill="#656F33" points="4205.8002,2822.337,4195.8002,2826.337,4205.8002,2830.337,4201.8002,2826.337" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4183.8002" x2="4183.8002" y1="2794.337" y2="2814.337"/><polygon fill="#656F33" points="4179.8002,2804.337,4183.8002,2814.337,4187.8002,2804.337,4183.8002,2808.337" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4183.8002" x2="4183.8002" y1="2671.948" y2="2706.948"/><polygon fill="#656F33" points="4179.8002,2696.948,4183.8002,2706.948,4187.8002,2696.948,4183.8002,2700.948" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4183.8002" x2="4183.8002" y1="2353.922" y2="2394.355"/><polygon fill="#656F33" points="4179.8002,2384.355,4183.8002,2394.355,4187.8002,2384.355,4183.8002,2388.355" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4183.8002" x2="4183.8002" y1="2838.337" y2="2850.337"/><line style="stroke:#656F33;stroke-width:1;" x1="4183.8002" x2="4288.1553" y1="2850.337" y2="2850.337"/><polygon fill="#656F33" points="4284.1553,2604.633,4288.1553,2594.633,4292.1553,2604.633,4288.1553,2600.633" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4288.1553" x2="4288.1553" y1="2341.922" y2="2850.337"/><line style="stroke:#656F33;stroke-width:1;" x1="4288.1553" x2="4252.7841" y1="2341.922" y2="2341.922"/><polygon fill="#656F33" points="4262.7841,2337.922,4252.7841,2341.922,4262.7841,2345.922,4258.7841,2341.922" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4114.8163" x2="4079.4451" y1="2341.922" y2="2341.922"/><polygon fill="#656F33" points="4075.4451,2590.633,4079.4451,2600.633,4083.4451,2590.633,4079.4451,2594.633" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4079.4451" x2="4079.4451" y1="2341.922" y2="2862.337"/><line style="stroke:#656F33;stroke-width:1;" x1="4079.4451" x2="4183.8002" y1="2862.337" y2="2862.337"/><line style="stroke:#656F33;stroke-width:1;" x1="4183.8002" x2="4183.8002" y1="2862.337" y2="2882.337"/><polygon fill="#656F33" points="4179.8002,2872.337,4183.8002,2882.337,4187.8002,2872.337,4183.8002,2876.337" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4183.8002" x2="4183.8002" y1="2309.922" y2="2329.922"/><polygon fill="#656F33" points="4179.8002,2319.922,4183.8002,2329.922,4187.8002,2319.922,4183.8002,2323.922" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4183.8002" x2="4183.8002" y1="2919.263" y2="2939.263"/><polygon fill="#656F33" points="4179.8002,2929.263,4183.8002,2939.263,4187.8002,2929.263,4183.8002,2933.263" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4105.3023" x2="4105.3023" y1="3490.826" y2="3525.826"/><polygon fill="#656F33" points="4101.3023,3515.826,4105.3023,3525.826,4109.3023,3515.826,4105.3023,3519.826" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4105.3023" x2="4105.3023" y1="3562.752" y2="3597.752"/><polygon fill="#656F33" points="4101.3023,3587.752,4105.3023,3597.752,4109.3023,3587.752,4105.3023,3591.752" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4105.3023" x2="4105.3023" y1="3412.974" y2="3453.9"/><polygon fill="#656F33" points="4101.3023,3443.9,4105.3023,3453.9,4109.3023,3443.9,4105.3023,3447.9" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4105.3023" x2="4105.3023" y1="3634.678" y2="3646.678"/><line style="stroke:#656F33;stroke-width:1;" x1="4105.3023" x2="4227.4187" y1="3646.678" y2="3646.678"/><polygon fill="#656F33" points="4223.4187,3533.826,4227.4187,3523.826,4231.4187,3533.826,4227.4187,3529.826" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4227.4187" x2="4227.4187" y1="3400.974" y2="3646.678"/><line style="stroke:#656F33;stroke-width:1;" x1="4227.4187" x2="4191.9338" y1="3400.974" y2="3400.974"/><polygon fill="#656F33" points="4201.9338,3396.974,4191.9338,3400.974,4201.9338,3404.974,4197.9338,3400.974" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4018.6708" x2="3983.186" y1="3400.974" y2="3400.974"/><polygon fill="#656F33" points="3979.186,3519.826,3983.186,3529.826,3987.186,3519.826,3983.186,3523.826" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3983.186" x2="3983.186" y1="3400.974" y2="3658.678"/><line style="stroke:#656F33;stroke-width:1;" x1="3983.186" x2="4105.3023" y1="3658.678" y2="3658.678"/><line style="stroke:#656F33;stroke-width:1;" x1="4105.3023" x2="4105.3023" y1="3658.678" y2="3689.289"/><polygon fill="#656F33" points="4101.3023,3679.289,4105.3023,3689.289,4109.3023,3679.289,4105.3023,3683.289" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4105.3023" x2="4105.3023" y1="3353.974" y2="3388.974"/><polygon fill="#656F33" points="4101.3023,3378.974,4105.3023,3388.974,4109.3023,3378.974,4105.3023,3382.974" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4105.3023" x2="4105.3023" y1="3819.067" y2="3845.53"/><polygon fill="#656F33" points="4101.3023,3835.53,4105.3023,3845.53,4109.3023,3835.53,4105.3023,3839.53" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4177.9653" x2="4189.9653" y1="3807.067" y2="3807.067"/><polygon fill="#656F33" points="4185.9653,3853.993,4189.9653,3863.993,4193.9653,3853.993,4189.9653,3857.993" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4189.9653" x2="4189.9653" y1="3807.067" y2="3920.919"/><line style="stroke:#656F33;stroke-width:1;" x1="4189.9653" x2="4117.3023" y1="3920.919" y2="3920.919"/><polygon fill="#656F33" points="4127.3023,3916.919,4117.3023,3920.919,4127.3023,3924.919,4123.3023,3920.919" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4105.3023" x2="4105.3023" y1="3882.456" y2="3908.919"/><polygon fill="#656F33" points="4101.3023,3898.919,4105.3023,3908.919,4109.3023,3898.919,4105.3023,3902.919" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4105.3023" x2="4105.3023" y1="3760.067" y2="3795.067"/><polygon fill="#656F33" points="4101.3023,3785.067,4105.3023,3795.067,4109.3023,3785.067,4105.3023,3789.067" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4105.3023" x2="4105.3023" y1="3277.974" y2="3317.048"/><polygon fill="#656F33" points="4101.3023,3307.048,4105.3023,3317.048,4109.3023,3307.048,4105.3023,3311.048" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4105.3023" x2="4105.3023" y1="3932.919" y2="3944.919"/><line style="stroke:#656F33;stroke-width:1;" x1="4105.3023" x2="4239.4187" y1="3944.919" y2="3944.919"/><polygon fill="#656F33" points="4235.4187,3616.715,4239.4187,3606.715,4243.4187,3616.715,4239.4187,3612.715" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4239.4187" x2="4239.4187" y1="3265.974" y2="3944.919"/><line style="stroke:#656F33;stroke-width:1;" x1="4239.4187" x2="4174.2862" y1="3265.974" y2="3265.974"/><polygon fill="#656F33" points="4184.2862,3261.974,4174.2862,3265.974,4184.2862,3269.974,4180.2862,3265.974" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4036.3184" x2="3965.186" y1="3265.974" y2="3265.974"/><polygon fill="#656F33" points="3961.186,3602.715,3965.186,3612.715,3969.186,3602.715,3965.186,3606.715" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3965.186" x2="3965.186" y1="3265.974" y2="3956.919"/><line style="stroke:#656F33;stroke-width:1;" x1="3965.186" x2="4105.3023" y1="3956.919" y2="3956.919"/><line style="stroke:#656F33;stroke-width:1;" x1="4105.3023" x2="4105.3023" y1="3956.919" y2="3990.067"/><polygon fill="#656F33" points="4101.3023,3980.067,4105.3023,3990.067,4109.3023,3980.067,4105.3023,3984.067" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4105.3023" x2="4105.3023" y1="3219.356" y2="3253.974"/><polygon fill="#656F33" points="4101.3023,3243.974,4105.3023,3253.974,4109.3023,3243.974,4105.3023,3247.974" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="4105.3023" x2="4105.3023" y1="4026.993" y2="4046.993"/><polygon fill="#656F33" points="4101.3023,4036.993,4105.3023,4046.993,4109.3023,4036.993,4105.3023,4040.993" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="179.6112" x2="179.6112" y1="727.794" y2="732.794"/><line style="stroke:#656F33;stroke-width:1;" x1="179.6112" x2="1017.4782" y1="732.794" y2="732.794"/><line style="stroke:#656F33;stroke-width:1;" x1="1017.4782" x2="1017.4782" y1="732.794" y2="747.794"/><polygon fill="#656F33" points="1013.4782,737.794,1017.4782,747.794,1021.4782,737.794,1017.4782,741.794" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="1017.4782" x2="1017.4782" y1="1019.498" y2="1024.498"/><line style="stroke:#656F33;stroke-width:1;" x1="1017.4782" x2="2520.4529" y1="1024.498" y2="1024.498"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="1024.498" y2="1039.498"/><polygon fill="#656F33" points="2516.4529,1029.498,2520.4529,1039.498,2524.4529,1029.498,2520.4529,1033.498" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2407.1648" x2="2407.1648" y1="1176.276" y2="1180.276"/><line style="stroke:#656F33;stroke-width:1;" x1="2407.1648" x2="3394.6184" y1="1180.276" y2="1180.276"/><line style="stroke:#656F33;stroke-width:1;" x1="3394.6184" x2="3394.6184" y1="1180.276" y2="1196.276"/><polygon fill="#656F33" points="3390.6184,1186.276,3394.6184,1196.276,3398.6184,1186.276,3394.6184,1190.276" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3097.529" x2="3097.529" y1="1176.276" y2="1180.276"/><line style="stroke:#656F33;stroke-width:1;" x1="3097.529" x2="4244.5253" y1="1180.276" y2="1180.276"/><line style="stroke:#656F33;stroke-width:1;" x1="4244.5253" x2="4244.5253" y1="1180.276" y2="1273.728"/><polygon fill="#656F33" points="4240.5253,1263.728,4244.5253,1273.728,4248.5253,1263.728,4244.5253,1267.728" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="1904.6211" x2="1904.6211" y1="1661.31" y2="2019.292"/><line style="stroke:#656F33;stroke-width:1;" x1="1904.6211" x2="3944.186" y1="2019.292" y2="2019.292"/><line style="stroke:#656F33;stroke-width:1;" x1="3944.186" x2="3944.186" y1="2019.292" y2="2033.292"/><polygon fill="#656F33" points="3940.186,2023.292,3944.186,2033.292,3948.186,2023.292,3944.186,2027.292" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3394.6184" x2="3394.6184" y1="2001.366" y2="2019.292"/><line style="stroke:#656F33;stroke-width:1;" x1="3394.6184" x2="3956.186" y1="2019.292" y2="2019.292"/><line style="stroke:#656F33;stroke-width:1;" x1="3956.186" x2="3956.186" y1="2019.292" y2="2033.292"/><polygon fill="#656F33" points="3952.186,2023.292,3956.186,2033.292,3960.186,2023.292,3956.186,2027.292" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3956.186" x2="3956.186" y1="2039.292" y2="2044.292"/><line style="stroke:#656F33;stroke-width:1;" x1="3956.186" x2="2520.4529" y1="2044.292" y2="2044.292"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="2044.292" y2="2059.292"/><polygon fill="#656F33" points="2516.4529,2049.292,2520.4529,2059.292,2524.4529,2049.292,2520.4529,2053.292" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2378.925" x2="2378.925" y1="2252.996" y2="2256.996"/><line style="stroke:#656F33;stroke-width:1;" x1="2378.925" x2="3366.3786" y1="2256.996" y2="2256.996"/><line style="stroke:#656F33;stroke-width:1;" x1="3366.3786" x2="3366.3786" y1="2256.996" y2="2335.959"/><polygon fill="#656F33" points="3362.3786,2325.959,3366.3786,2335.959,3370.3786,2325.959,3366.3786,2329.959" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3036.8039" x2="3036.8039" y1="2252.996" y2="2256.996"/><line style="stroke:#656F33;stroke-width:1;" x1="3036.8039" x2="4183.8002" y1="2256.996" y2="2256.996"/><line style="stroke:#656F33;stroke-width:1;" x1="4183.8002" x2="4183.8002" y1="2256.996" y2="2272.996"/><polygon fill="#656F33" points="4179.8002,2262.996,4183.8002,2272.996,4187.8002,2262.996,4183.8002,2266.996" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2030.2261" x2="2030.2261" y1="2693.485" y2="2925.263"/><line style="stroke:#656F33;stroke-width:1;" x1="2030.2261" x2="3956.186" y1="2925.263" y2="2925.263"/><line style="stroke:#656F33;stroke-width:1;" x1="3956.186" x2="3956.186" y1="2925.263" y2="2939.263"/><polygon fill="#656F33" points="3952.186,2929.263,3956.186,2939.263,3960.186,2929.263,3956.186,2933.263" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3366.3786" x2="3366.3786" y1="2856.3" y2="2925.263"/><line style="stroke:#656F33;stroke-width:1;" x1="3366.3786" x2="3956.186" y1="2925.263" y2="2925.263"/><line style="stroke:#656F33;stroke-width:1;" x1="3956.186" x2="3956.186" y1="2925.263" y2="2939.263"/><polygon fill="#656F33" points="3952.186,2929.263,3956.186,2939.263,3960.186,2929.263,3956.186,2933.263" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3956.186" x2="3956.186" y1="2945.263" y2="2950.263"/><line style="stroke:#656F33;stroke-width:1;" x1="3956.186" x2="2520.4529" y1="2950.263" y2="2950.263"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="2950.263" y2="2965.263"/><polygon fill="#656F33" points="2516.4529,2955.263,2520.4529,2965.263,2524.4529,2955.263,2520.4529,2959.263" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2375.6749" x2="2375.6749" y1="3162.43" y2="3166.43"/><line style="stroke:#656F33;stroke-width:1;" x1="2375.6749" x2="3363.1285" y1="3166.43" y2="3166.43"/><line style="stroke:#656F33;stroke-width:1;" x1="3363.1285" x2="3363.1285" y1="3166.43" y2="3195.578"/><polygon fill="#656F33" points="3359.1285,3185.578,3363.1285,3195.578,3367.1285,3185.578,3363.1285,3189.578" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2958.306" x2="2958.306" y1="3162.43" y2="3166.43"/><line style="stroke:#656F33;stroke-width:1;" x1="2958.306" x2="4105.3023" y1="3166.43" y2="3166.43"/><line style="stroke:#656F33;stroke-width:1;" x1="4105.3023" x2="4105.3023" y1="3166.43" y2="3182.43"/><polygon fill="#656F33" points="4101.3023,3172.43,4105.3023,3182.43,4109.3023,3172.43,4105.3023,3176.43" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2060.7286" x2="2060.7286" y1="3661.141" y2="4032.993"/><line style="stroke:#656F33;stroke-width:1;" x1="2060.7286" x2="3956.186" y1="4032.993" y2="4032.993"/><line style="stroke:#656F33;stroke-width:1;" x1="3956.186" x2="3956.186" y1="4032.993" y2="4046.993"/><polygon fill="#656F33" points="3952.186,4036.993,3956.186,4046.993,3960.186,4036.993,3956.186,4040.993" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3363.1285" x2="3363.1285" y1="4013.845" y2="4032.993"/><line style="stroke:#656F33;stroke-width:1;" x1="3363.1285" x2="3956.186" y1="4032.993" y2="4032.993"/><line style="stroke:#656F33;stroke-width:1;" x1="3956.186" x2="3956.186" y1="4032.993" y2="4046.993"/><polygon fill="#656F33" points="3952.186,4036.993,3956.186,4046.993,3960.186,4036.993,3956.186,4040.993" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="3956.186" x2="3956.186" y1="4052.993" y2="4057.993"/><line style="stroke:#656F33;stroke-width:1;" x1="3956.186" x2="2520.4529" y1="4057.993" y2="4057.993"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="4057.993" y2="4083.382"/><polygon fill="#656F33" points="2516.4529,4073.382,2520.4529,4083.382,2524.4529,4073.382,2520.4529,4077.382" style="stroke:#656F33;stroke-width:1;"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="2520.4529" y1="6286.7811" y2="6291.7811"/><line style="stroke:#656F33;stroke-width:1;" x1="2520.4529" x2="179.6112" y1="6291.7811" y2="6291.7811"/><line style="stroke:#656F33;stroke-width:1;" x1="179.6112" x2="179.6112" y1="6291.7811" y2="6306.7811"/><polygon fill="#656F33" points="175.6112,6296.7811,179.6112,6306.7811,183.6112,6296.7811,179.6112,6300.7811" style="stroke:#656F33;stroke-width:1;"/><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="28.5837" x="282.5246" y="77.226">Main</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="225.1019" x="1064.5556" y="77.226">BiergartenPipelineOrchestrator::Run()</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="78.2797" x="2435.7298" y="77.226">Orchestrator</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="71.9356" x="3508.2047" y="77.226">LLM Worker</text><text fill="#14180C" font-family="'DM Sans'" font-size="13" lengthAdjust="spacing" textLength="87.3536" x="4120.0772" y="77.226">SQLite Worker</text><?plantuml-src rLhRKYF76RxNKxIvo4grakBrLlb2v5182CoQ1O9mIAgsIjMQQKbjPhh7tIDOfRZ88-GYUK4_IRw_3oEDa82rDnjCKGZD_Dtz7x__CFELL4csI0NhTdy_aSBCk2c5wjm9-Gzyb7EHYswnoBE6lP6gu8RdB1LJliZA8wtA4QZOcxThDqjPPgAwzStNZOQxmgxcWlMh_TaXBpcxa8N8f1Bivt_-cnqafRoLvP8TIZx3Jet6_NikrNt3bbZIw5rmOyM1cIroeKhRv6QMj1d-thRs6tBAcYVgbcSofKlspoq6pXLhBeLjDHZhsIBDzApN4yPeiuyhjjH5GsHMiARIhOPGgPmsUYTAbkoy46eqEcMpJ4zu1afU2lOxTfhndFTvSWFQ4LtRR_Jw2vcbxF24IVMZI4hQscyYmGh47_sKoL8CFnRQb2DXRcM2LKfZFoDdyn9yq66MZVvo2ZgMQAMmZTIgYrlDAyELvUwxXLY2ANt7SgxuJAIuNmZJAUOS8jnApYQyJEPIpLfT4eRH8U1bO0HntzSBbOfqCESu8Fl3gPuDLMcMVs9GoZYPGv9HmUyKmmrshSsDCD0VbgORtDBzEty_DJ2E3HkmgQOL0YGmZWIhHJHj9gUYb70Yt3l8ih3SCf53rP4HADaiajA2XcI9Ve7RCnpLwJ0bRl6Fjo9BSK1IPikQf2lVYglFJJ8Ns9Z3BhtUvK8ruIdtpwAxRpGWqGrvpZkhrQdcgS0z-kmBOKRbCXEskJV1_nthldH_1DrUYrohDrH69dDoqs3pNk_2Y6jkychnWEFC9gqV-_LOIISoFeDQjvqxW5FHcOdxVDvnfphXv3t-DClp8XFfE0jNwKnIe9DqbxX7sWZ5Ss7xom6S2BPgVb2CxKtZzSvasKdydOgfnoKPBSos7Msu_EaRNi2VjE9GJX7-gnPMyjNSU0Xzi8J36wLbkSWrOXN0CItXOxAqR2gDBLb1W4DnA4blf5yGbJhborQNlTV9pM01dn4fGLdGFAYDA248uXMxVCG2gJfq0dmy1PqL9QxO4g45MWfASkyScucqpO2YHO4Ofb12MByRdPzX5_AkDKz_nNx-px_-lx_WuUAxWz6GVUsG-uVHy98T3y-6bmTN9-TdBuB3-_MelczGMFzWXRaWlDmQ2TkXqdvGJL01ujfCV2pm2T8OB1jdm3DFjIvwR4J6Yh5dMOTWDd4m2v91fc7QrOMQOp9sONIwIE0L2T7PGDXrzqvFtqTqlfl3BN0JIOpkm75pgS2-PLe1MWkaqTT-YxJhG3buJosGxbSR4lT-po0kWw8G2oAdN8eeYPaK4boAHCXRmO18IoZ3NJiMPGKsoFtYOtbaTEvn9shPeTK3WHaxNg1mm1e4Iq8Bs1oPOOhbp6N-HU6bNqM0E_4aHFr8P3vbZiWEOhRizVobSD-1IyI5SS4pKPPY_2jvOUoo2lDmJaXXM6RC4Z4Sw1owZ_bqAfK3RfGiazinpfY9TY2HayMuC68gWAY9Q3CScw2S6gC40sDRXHyv1pu3N3Oh81vFbkE0cssIEUBf-dKMRT6LLhzzy-stupTjPb0qx537eV2U9Mqf4tAtcqNXqh5spYZLhSvklOlHpv4HWaqNojbZ2suovtRqCnDAaBd62mIbxIP9gqsdGvr9nYs1SZdNrRuaABFEgjZAcGCAwzo89RxclB21ZaDB1POxs2qrmMWyYHWgiB0euwOZWArr90bLdIWXXSGtGniwxrSwK0fNeb29KsbjgrMEWr04D4tXiZ90XdPlHmy4nWVi8TkqFYWgToY1XBM-EDrY2LAtyO5dUsmODgSGfAgH0Wu17mu9Ir9X4oCB9_hhU2wZSxiiiXerDv7QQw_oGsRbJF7CifdnY1YzLJad0b8uUd_YLdNKgpXArJCKwLFTPgIWuyekpbkzbiWRnXAPS2_ByhtWbJs7fv7Zb1OJfdeutlVe5h2BIlaAOrS4Js2i9_GoX4hyiy9iRK-N9_h3uvCpTdLvS3Ow653Et5_Xh-Vc6VXRqqXG5KHBXBNE0qcPKOM_oXRMTJ6LEGwAWWI52Hn9eNKszhUe3UjJ7mBdGVU3X4fEkjcCkKq6v-_VdroXhNAgyCjNxLZm9hHaswphbpQFO8filSPxaFJVQNZhAicrwzRTVrcrr1lkYgd-vV1wUFdtbrPFKG7LD-9EcEMNgQ7SziuxFU2lVAqHWLuYG07PeH29G16ulEBsfZbmdaoRj1ujmpvdMRJZ_ETKIkWFRhh_ct8fWaNWRZCzXHpIPeu5XnpFpqtV_pLm0WQMbjsXyun9DXn7gWBytBX2mENSc8xq7VOU1wpPuFnnv2Aa2jjlnQ-9l_TKEeaSVaf6-RBm7ZYi8toqOv3oIPp_96tj1Fn8zHl6_9htrkGXEz24RRh8iYKhTB78IFtab0xos9i9QiCbcuYPL2-r8mUFBeiCNrvBxbA8Y3tue-c2xF8BUcxluEYoeg_MqRwwyWou3xI_F4vFtAnlLtCQ9eWKVy474OBLD72zJNMx1QQEq89GVArweMgW6DWp8eTKD0QEGOTyuoUEcyd6dHH2V0keVq8ll3K3C9uOZKwEPrb5HXAkDMIMMacxj51lwCqgobGBwnh2P4wjiilpY6lyiSpDlBjLRxQMBDRp78vgLghrMWr9RdTc8wmhIrBmogZ4CdBM12wQYVs8Ki4WgLQYrNWEz8eTLVRZMOgMsRux-kKbg3NczhTwgJCthEPrjzD3Hw9qfDsLBhoRhUjyBVCvouggjwadA57lI3PDzRaiLS-Gl-aSsDSeeUk9aChhbIQftWuFdn9DLLifDlFZm8-itC8ZdMKWTL5gAM6w1loEcOKYPw2dX5acifUQGBzn-NFmtN3mFKBaDJiwFpqzlwxdqcOKmj5EI86fS2we5LIZrNgtyigtAtKDJmID-JSgZTQBKCJEH8lq7UnSPN3AS-7QeGIjd2pgsUw3Eh0qI8eFTw_TJDCsL_ffRHdG12gaEP76WPz355hsoi-iukHfOrhAtdMIXG4w8Q7GenCVKhamCpYZdno6UMswnd1jUFCKG5RuLXz9oNMhRmUxNj2LnHRLYAPTTuqkGKYprTeEgK5Q79QAZpiHzKhci1mwBAmBPxW5AyJqLKWyES3jm-9-BQ46rkiier-CHpsQLGDqnps252jsTe-dmf8DH5O875sKgrdv5b2kvOL8LvFj-R2z0xWteNi5tjiopyCh3o1z8t5l2q4FhxK8z9TMAdeOVfxYUS57ldO9nDAvNnLtQpCVOZxyA2Cib0I_UTSjgKUuI3SMUsyESPsYIB-DWKtST7bO7SBOKLkDYdCsxyHxZX85POazuRkv1WjJTmezGdXM13-kg-ZgdkOfFI64fXr_FerFo4nIbQmPMQ8ovgi_HWvJV8tv7KfB8FrS63z4vwKRYHpscOMzSyuoSKi9ibRTxWGVp-qEm0c1vsa2Qq_FX3ULL8-vDG4VcnLuiYyuAjWTLKzKIkjPBGhllcnKIZKGSPPRbt6jJDeoGRY48f7n_ViwBtwAyDOLDbJld1s_n362rsO5WlLwbheE6njlDf6SdWTEg0nrK1CBXyqdipuKuyFPDPlP6t47j4czCQb-M3tsMdy1wI7Wx8pPGPN6wqwrBOfxxrt8hBSVDcHl4OVZgsBzWwB9lAYHLogeQf-Lr2vkNM3IPk8ZYYBh7dM63Hv6PrKHUFN4Wa3GtrKwtbqEH4mAoutxU1gJFFakJFAxVBdUh7PrAzVNtAYdk7viw4gFfsa-4aiq_qJQwTc62G1OsKI_XzZtCc3bQdXmUNX-_JBV3NAwUjxhcYC-fUOtF3WEMNlzjSqA4AedJFu5o_WoQ_KcgeHNixtg3TZOMHCa_8tbTcy_jl7LAvaRh1nIlS5cSKZdlADwdr9IbPOQZMpiwWixNvIflbjdqBq1-ry0?></g></svg> |