From 016b80d98e9392fa0b980d6453f0bae72364f5e4 Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Tue, 29 Sep 2026 05:01:48 -0400 Subject: [PATCH 1/2] perf: reuse Costes thresholds across object sets in one step (#185) --- .../perf_coloc_step_cache_20260929/README.md | 44 ++++++ .../abba_1_control.csv | 3 + .../abba_2_candidate.csv | 3 + .../abba_3_candidate.csv | 3 + .../abba_4_control.csv | 3 + .../affected_case_execution.png | Bin 0 -> 72376 bytes .../full_first_candidate.csv | 31 ++++ .../full_first_control.csv | 31 ++++ .../full_suite_execution_delta.png | Bin 0 -> 186278 bytes .../full_warm_candidate.csv | 31 ++++ .../full_warm_control.csv | 31 ++++ .../perf_coloc_step_cache_20260929/plot.py | 78 ++++++++++ openhcs/core/context/processing_context.py | 30 +++- openhcs/core/steps/function_execution.py | 3 +- .../cellprofiler/module_callable_abi.py | 9 ++ .../cellprofiler/runtime/module_execution.py | 4 + .../backends/cellprofiler/colocalization.py | 134 ++++++++++++------ .../unit/test_cellprofiler_library_loading.py | 35 +++++ .../test_function_step_execution_scope.py | 19 +++ 19 files changed, 448 insertions(+), 44 deletions(-) create mode 100644 benchmark/results/perf_coloc_step_cache_20260929/README.md create mode 100644 benchmark/results/perf_coloc_step_cache_20260929/abba_1_control.csv create mode 100644 benchmark/results/perf_coloc_step_cache_20260929/abba_2_candidate.csv create mode 100644 benchmark/results/perf_coloc_step_cache_20260929/abba_3_candidate.csv create mode 100644 benchmark/results/perf_coloc_step_cache_20260929/abba_4_control.csv create mode 100644 benchmark/results/perf_coloc_step_cache_20260929/affected_case_execution.png create mode 100644 benchmark/results/perf_coloc_step_cache_20260929/full_first_candidate.csv create mode 100644 benchmark/results/perf_coloc_step_cache_20260929/full_first_control.csv create mode 100644 benchmark/results/perf_coloc_step_cache_20260929/full_suite_execution_delta.png create mode 100644 benchmark/results/perf_coloc_step_cache_20260929/full_warm_candidate.csv create mode 100644 benchmark/results/perf_coloc_step_cache_20260929/full_warm_control.csv create mode 100644 benchmark/results/perf_coloc_step_cache_20260929/plot.py diff --git a/benchmark/results/perf_coloc_step_cache_20260929/README.md b/benchmark/results/perf_coloc_step_cache_20260929/README.md new file mode 100644 index 0000000000..882b776ece --- /dev/null +++ b/benchmark/results/perf_coloc_step_cache_20260929/README.md @@ -0,0 +1,44 @@ +# Step-scoped Costes threshold reuse: official30 1w_1t (2026-09-29) + +This report accompanies [issue #185](https://github.com/OpenHCSDev/openhcs/issues/185). It compares the same CPU-only integration code with and without a step-scoped Costes threshold cache. The control is commit `30e1e905c`, including the faster completion polling from [PR #183](https://github.com/OpenHCSDev/openhcs/pull/183). Each benchmark observation owns a fresh ZMQ execution server and uses one well and one OpenHCS thread with the `fork` start method. `total_seconds` includes server startup, compilation, execution, and shutdown; `execute_seconds` is the server execution job and can include first-use JIT work. The native CellProfiler 4.2.8.1 reference is retained in the [native summary](../perf_lazy_catalog_20260929/native_cp_summary.csv). + +An instrumentation-only probe on the two segmentation tutorials found **180 object-colocalization calls but only 40 distinct selected image-pair pixel inputs**: 20 pairs repeated five times and 20 repeated four times across object sets. The image payloads are reconstructed between sets, so object identity cannot establish reuse. The candidate fingerprints the exact selected pixels and keeps method, scale, and backend selection in its key. The cache lives only for one FunctionStep invocation. + +An interleaved control/candidate/candidate/control experiment measured the two affected pipelines. The first control had a cold compilation run and is retained as raw data but excluded from the warmed comparison. The later control and the mean of both candidates give: + +| Pipeline | Control execution (s) | Candidate execution (s) | Execution saved (s) | Control total (s) | Candidate total (s) | +| --- | ---: | ---: | ---: | ---: | ---: | +| Advanced segmentation | 10.815 | 9.384 | 1.431 | 18.642 | 17.286 | +| Beginner segmentation | 6.778 | 5.607 | 1.171 | 13.362 | 12.060 | +| **Both** | **17.593** | **14.991** | **2.602** | **32.004** | **29.347** | + +All 15 produced result files in both candidate runs matched the control byte-for-byte. A separate instrumented run confirmed the mechanism: `coloc_object_costes_thresholds` fell from **3.999 to 1.400 seconds** over 180 calls, and `coloc_object_total` fell from **5.217 to 2.620 seconds**. These are phase sums from separate profiled runs, not additional time to subtract from the benchmark. + +![Native CellProfiler and OpenHCS execution time for the affected tutorials](affected_case_execution.png) + +The full official30 sweeps showed material run-order variation, including in cases this cache cannot affect. All 30 cases succeeded in every sweep; the two warmed sweeps produced the same 110 result paths with byte-identical contents. + +| Sweep order | Compile sum (s) | Execution sum (s) | Total sum (s) | +| --- | ---: | ---: | ---: | +| First candidate | 84.079 | 97.248 | 270.468 | +| First control, cold checkout | 99.153 | 100.178 | 288.514 | +| Warmed control | 83.701 | 89.286 | 261.691 | +| Warmed candidate | 84.095 | 87.857 | 260.928 | + +The warmed candidate saved **1.429 seconds in summed execution** and **0.763 seconds in summed total** against the immediately preceding warmed control. The two affected tutorials saved 2.654 seconds in that full-suite comparison; unrelated cases varied in the other direction. The pair-specific improvement and its profiled mechanism are reproducible. The small full-suite net difference is not a stable estimate of a global speedup. It is also much smaller than the remaining end-to-end startup and compilation terms, so this cache is a targeted improvement, not the dominant route to faster official30 total time. + +![Per-case execution changes in the warmed full sweep](full_suite_execution_delta.png) + +The warmed full-sweep native execution ratios for the affected tutorials are 3.34× to 3.84× for advanced segmentation and 2.37× to 2.90× for beginner segmentation. These use the saved native execution reference and OpenHCS's `execute_seconds`; they do not include either system's total startup boundary. + +The retained CSVs are `abba_*.csv`, `full_first_*.csv`, and `full_warm_*.csv`. `plot.py` regenerates both figures. Raw result trees and profiling events are under `/home/ts/code/projects/openhcs-benchmark-runs/perf-coloc-step-cache-*20260929`. Validation also included 624 focused unit tests and byte parity in the full sweep. The separate [batch executor metadata issue #176](https://github.com/OpenHCSDev/openhcs/issues/176) remains open; this cache does not restore those declarations. + +Reproduce the fresh-server sweep with the native reference: + +```bash +OPENHCS_CPU_ONLY=true .venv/bin/python scripts/benchmark_cppipe_well_throughput.py \ + --manifest benchmark/manifests/official30_portable_axis1.json \ + --output-dir /path/to/output \ + --native-summary-csv benchmark/results/perf_lazy_catalog_20260929/native_cp_summary.csv \ + --mode 1w_1t +``` diff --git a/benchmark/results/perf_coloc_step_cache_20260929/abba_1_control.csv b/benchmark/results/perf_coloc_step_cache_20260929/abba_1_control.csv new file mode 100644 index 0000000000..98b1247997 --- /dev/null +++ b/benchmark/results/perf_coloc_step_cache_20260929/abba_1_control.csv @@ -0,0 +1,3 @@ +case_name,mode_name,worker_count,well_count,compile_seconds,prepare_seconds,execute_seconds,total_seconds,wells_per_second,successful_wells,native_single_sample_execution_seconds,projected_native_execution_seconds,projected_execution_speedup,peak_memory_mb,status,memory_limit_mb,error_message,execution_route,server_lifecycle,run_input_sha256 +cp_tutorial_advanced_segmentation_final,1w_1t,1,1,50.092376708984375,0.0,12.277675151824951,66.6460295310244,0.08144864460364552,1,36.253466514870524,36.253466514870524,2.9527957098198527,1523.5390625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,45578cef16d0f9006b11f3172f9a33471622f9c1ab3a461e2dd3316561930482 +cp_tutorial_beginner_segmentation_final,1w_1t,1,1,3.277191638946533,0.0,7.9185473918914795,14.549100143834949,0.1262857883535547,1,16.074153264053166,16.074153264053166,2.029937117066819,1014.4140625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,45578cef16d0f9006b11f3172f9a33471622f9c1ab3a461e2dd3316561930482 diff --git a/benchmark/results/perf_coloc_step_cache_20260929/abba_2_candidate.csv b/benchmark/results/perf_coloc_step_cache_20260929/abba_2_candidate.csv new file mode 100644 index 0000000000..a0b3214e5f --- /dev/null +++ b/benchmark/results/perf_coloc_step_cache_20260929/abba_2_candidate.csv @@ -0,0 +1,3 @@ +case_name,mode_name,worker_count,well_count,compile_seconds,prepare_seconds,execute_seconds,total_seconds,wells_per_second,successful_wells,native_single_sample_execution_seconds,projected_native_execution_seconds,projected_execution_speedup,peak_memory_mb,status,memory_limit_mb,error_message,execution_route,server_lifecycle,run_input_sha256 +cp_tutorial_advanced_segmentation_final,1w_1t,1,1,4.238177299499512,0.0,9.434734344482422,17.30373717378825,0.10599132561531162,1,36.253466514870524,36.253466514870524,3.842552974061438,1089.796875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,56a334216fae7002dfa87fe7431ab12e1df13742d256f30887eb2a2446bd4041 +cp_tutorial_beginner_segmentation_final,1w_1t,1,1,3.1875345706939697,0.0,5.5730133056640625,12.019987728912383,0.17943614076493636,1,16.074153264053166,16.074153264053166,2.8842840277658053,960.5625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,56a334216fae7002dfa87fe7431ab12e1df13742d256f30887eb2a2446bd4041 diff --git a/benchmark/results/perf_coloc_step_cache_20260929/abba_3_candidate.csv b/benchmark/results/perf_coloc_step_cache_20260929/abba_3_candidate.csv new file mode 100644 index 0000000000..4450c36292 --- /dev/null +++ b/benchmark/results/perf_coloc_step_cache_20260929/abba_3_candidate.csv @@ -0,0 +1,3 @@ +case_name,mode_name,worker_count,well_count,compile_seconds,prepare_seconds,execute_seconds,total_seconds,wells_per_second,successful_wells,native_single_sample_execution_seconds,projected_native_execution_seconds,projected_execution_speedup,peak_memory_mb,status,memory_limit_mb,error_message,execution_route,server_lifecycle,run_input_sha256 +cp_tutorial_advanced_segmentation_final,1w_1t,1,1,4.3331286907196045,0.0,9.333743572235107,17.268264922779053,0.1071381479746968,1,36.253466514870524,36.253466514870524,3.8841292600659134,1090.54296875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,56a334216fae7002dfa87fe7431ab12e1df13742d256f30887eb2a2446bd4041 +cp_tutorial_beginner_segmentation_final,1w_1t,1,1,3.1799824237823486,0.0,5.640503883361816,12.100588019937277,0.17728912534743022,1,16.074153264053166,16.074153264053166,2.8497725728845262,977.95703125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,56a334216fae7002dfa87fe7431ab12e1df13742d256f30887eb2a2446bd4041 diff --git a/benchmark/results/perf_coloc_step_cache_20260929/abba_4_control.csv b/benchmark/results/perf_coloc_step_cache_20260929/abba_4_control.csv new file mode 100644 index 0000000000..b7a0888067 --- /dev/null +++ b/benchmark/results/perf_coloc_step_cache_20260929/abba_4_control.csv @@ -0,0 +1,3 @@ +case_name,mode_name,worker_count,well_count,compile_seconds,prepare_seconds,execute_seconds,total_seconds,wells_per_second,successful_wells,native_single_sample_execution_seconds,projected_native_execution_seconds,projected_execution_speedup,peak_memory_mb,status,memory_limit_mb,error_message,execution_route,server_lifecycle,run_input_sha256 +cp_tutorial_advanced_segmentation_final,1w_1t,1,1,4.226243019104004,0.0,10.815070152282715,18.641795020084828,0.09246357036241064,1,36.253466514870524,36.253466514870524,3.352124951979029,1088.5390625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,45578cef16d0f9006b11f3172f9a33471622f9c1ab3a461e2dd3316561930482 +cp_tutorial_beginner_segmentation_final,1w_1t,1,1,3.3164355754852295,0.0,6.7775774002075195,13.362209782004356,0.1475453456229628,1,16.074153264053166,16.074153264053166,2.3716664989411997,957.03125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,45578cef16d0f9006b11f3172f9a33471622f9c1ab3a461e2dd3316561930482 diff --git a/benchmark/results/perf_coloc_step_cache_20260929/affected_case_execution.png b/benchmark/results/perf_coloc_step_cache_20260929/affected_case_execution.png new file mode 100644 index 0000000000000000000000000000000000000000..4f2c929e6a4bf12fc16a056e61f8ec15b3b898f7 GIT binary patch literal 72376 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¨bqkmb; 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¥Bg&1=Dp$>vZ2 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 W?#}IAt}K_Ir<|_)edu>T?*1=;ZoN$a literal 0 HcmV?d00001 diff --git a/benchmark/results/perf_coloc_step_cache_20260929/full_first_candidate.csv b/benchmark/results/perf_coloc_step_cache_20260929/full_first_candidate.csv new file mode 100644 index 0000000000..e42c59ac6d --- /dev/null +++ b/benchmark/results/perf_coloc_step_cache_20260929/full_first_candidate.csv @@ -0,0 +1,31 @@ +case_name,mode_name,worker_count,well_count,compile_seconds,prepare_seconds,execute_seconds,total_seconds,wells_per_second,successful_wells,native_single_sample_execution_seconds,projected_native_execution_seconds,projected_execution_speedup,peak_memory_mb,status,memory_limit_mb,error_message,execution_route,server_lifecycle,run_input_sha256 +ExampleColocalization,1w_1t,1,1,3.3314623832702637,0.0,4.047102689743042,10.49303712695837,0.2470903450348308,1,37.035618890076876,37.035618890076876,9.151143850127593,1313.76171875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleCometAssay,1w_1t,1,1,3.0678517818450928,0.0,3.382840394973755,9.415838974993676,0.29560957161496776,1,13.304211451206356,13.304211451206356,3.9328522477660592,1233.125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleFly,1w_1t,1,1,2.9995768070220947,0.0,2.528999090194702,8.652359592262655,0.3954133490506761,1,8.094948755111545,8.094948755111545,3.200850797652257,911.796875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleFlyURL,1w_1t,1,1,2.6812729835510254,0.0,1.1671361923217773,6.791301331017166,0.8567980382912347,1,4.900778113398701,4.900778113398701,4.198977073660625,824.68359375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleHuman,1w_1t,1,1,2.620032548904419,0.0,1.2181837558746338,6.832155702169985,0.8208942166381279,1,4.420192994643003,4.420192994643003,3.628510865726809,795.67578125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleIlluminationCorrection_Example1_AllMethod,1w_1t,1,1,2.5418341159820557,0.0,4.662762403488159,9.888185085728765,0.2144651417906071,1,946.6214662808925,946.6214662808925,203.017306987964,1312.375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleIlluminationCorrection_Example1_EachMethod,1w_1t,1,1,2.4701032638549805,0.0,0.16818952560424805,5.320872409734875,5.945673468114845,1,4.54475614009425,4.54475614009425,27.021636001210418,757.953125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleIlluminationCorrection_Example2,1w_1t,1,1,2.85026478767395,0.0,2.3008546829223633,8.016120202839375,0.4346211029415727,1,48.04419008316472,48.04419008316472,20.88101888387962,973.43359375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleIlluminationCorrection_Example3,1w_1t,1,1,2.956389904022217,0.0,0.8741958141326904,6.6492008520290256,1.1439084743183343,1,2.1520505752414465,2.1520505752414465,2.4617488901803366,796.0390625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleImagingFlowCytometryObjectsInGrid,1w_1t,1,1,3.4203906059265137,0.0,23.51734471321106,30.361198461148888,0.042521807295627295,1,61.60158259188756,61.60158259188756,2.619410624077912,2453.83984375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleNeighbors,1w_1t,1,1,2.4734487533569336,0.0,1.379551649093628,6.744648599997163,0.724873186630602,1,4.5466188420541584,4.5466188420541584,3.2957220884345353,833.3671875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExamplePercentPositive,1w_1t,1,1,2.445389747619629,0.0,0.5640556812286377,5.9112587329000235,1.772874617310439,1,2.5050158216618,2.5050158216618,4.441078966185259,798.546875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleSpeckles,1w_1t,1,1,2.3372161388397217,0.0,1.4638993740081787,6.56630947580561,0.6831070616978165,1,3.179383432958275,3.179383432958275,2.171859274898844,916.71875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleTrackObjects,1w_1t,1,1,2.4260778427124023,0.0,5.029005765914917,10.31930301617831,0.19884646121857688,1,9.587221414782107,9.587221414782107,1.9063850512483798,1578.8359375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleTumor,1w_1t,1,1,2.303354501724243,0.0,1.0990476608276367,6.154544240795076,0.9098786482534806,1,4.360487373080105,4.360487373080105,3.9675143567444966,1030.734375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleUntangleAndStraightenWorms,1w_1t,1,1,3.006577253341675,0.0,1.2314109802246094,7.1993993683718145,0.8120765658737265,1,3.4416790287941694,3.4416790287941694,2.794906886542791,865.18359375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleUntangleWorms,1w_1t,1,1,3.2606966495513916,0.0,2.211594343185425,8.507513043936342,0.4521624877009182,1,4.618807300925255,4.618807300925255,2.088451399397527,924.35546875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleUntangleWormsBrightField,1w_1t,1,1,3.3257691860198975,0.0,3.895765781402588,10.349423209670931,0.25668894284501137,1,7.377188352867961,7.377188352867961,1.8936426794662078,1020.09765625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleVitra,1w_1t,1,1,2.9028685092926025,0.0,1.5386874675750732,7.410238386131823,0.649904558965422,1,4.122247557155788,4.122247557155788,2.6790674805796204,996.34765625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleWoundHealing,1w_1t,1,1,2.023697853088379,0.0,2.044299364089966,6.776258641853929,0.4891651475150544,1,4.702593941241503,4.702593941241503,2.3003450589708008,1167.01953125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleYeastColonies,1w_1t,1,1,3.223799705505371,0.0,2.2835490703582764,8.649375961627811,0.43791482871139065,1,12.096297012176365,12.096297012176365,5.297147834129319,1149.1171875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +ExampleYeastPatches,1w_1t,1,1,3.211822986602783,0.0,2.7104239463806152,8.996431880164891,0.368945972948386,1,5.990533472970128,5.990533472970128,2.2101832006648374,1113.39453125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +cp_tutorial_3d_monolayer,1w_1t,1,1,3.5883374214172363,0.0,10.085208892822266,16.968512172345072,0.09915511028350726,1,14.058660756796598,14.058660756796598,1.3939880577785826,1430.68359375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +cp_tutorial_advanced_segmentation_final,1w_1t,1,1,4.423793315887451,0.0,9.268096923828125,17.375662088859826,0.10789701577559212,1,36.253466514870524,36.253466514870524,3.9116408484748857,1100.3125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +cp_tutorial_quality_control,1w_1t,1,1,2.0238704681396484,0.0,0.6121540069580078,5.509663320146501,1.6335758463288101,1,4.787729676347226,4.787729676347226,7.82111955803248,807.65625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +cp_tutorial_beginner_segmentation_final,1w_1t,1,1,3.170426845550537,0.0,5.66499924659729,12.072373040020466,0.17652253009577273,1,16.074153264053166,16.074153264053166,2.8374502033178883,970.3984375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +cp_tutorial_pixel_based_classification,1w_1t,1,1,2.3951919078826904,0.0,0.9567317962646484,6.207462176214904,1.0452250086223567,1,4.208680049050599,4.208680049050599,4.399017640557654,1020.7890625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +cp_tutorial_translocation_final,1w_1t,1,1,2.5509088039398193,0.0,0.9266119003295898,6.385702965315431,1.079200471787926,1,3.004684013314545,3.004684013314545,3.242656404742696,879.53515625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +cp4_supplement_combine_objects,1w_1t,1,1,1.9912192821502686,0.0,0.15514206886291504,4.98156897816807,6.445704942117339,1,1.8334413380362093,1.8334413380362093,11.817821893662222,777.11328125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 +cp_tutorial_translocation_start,1w_1t,1,1,2.0552892684936523,0.0,0.2602684497833252,4.96244603022933,3.8421867914935715,1,2.1760300607420504,2.1760300607420504,8.36071395727606,816.0546875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,2712686a312b6cd048a8c3f2c24844a05fd8dc668390809299286250a672ceb2 diff --git a/benchmark/results/perf_coloc_step_cache_20260929/full_first_control.csv b/benchmark/results/perf_coloc_step_cache_20260929/full_first_control.csv new file mode 100644 index 0000000000..51dfb7fe0c --- /dev/null +++ b/benchmark/results/perf_coloc_step_cache_20260929/full_first_control.csv @@ -0,0 +1,31 @@ +case_name,mode_name,worker_count,well_count,compile_seconds,prepare_seconds,execute_seconds,total_seconds,wells_per_second,successful_wells,native_single_sample_execution_seconds,projected_native_execution_seconds,projected_execution_speedup,peak_memory_mb,status,memory_limit_mb,error_message,execution_route,server_lifecycle,run_input_sha256 +ExampleColocalization,1w_1t,1,1,8.959827661514282,0.0,5.9743382930755615,18.10615696478635,0.1673825536727691,1,37.035618890076876,37.035618890076876,6.199116466672514,1399.75390625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleCometAssay,1w_1t,1,1,3.8960726261138916,0.0,4.9796857833862305,11.971674900036305,0.20081588347126414,1,13.304211451206356,13.304211451206356,2.671696976462514,1236.02734375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleFly,1w_1t,1,1,5.515779972076416,0.0,2.245816469192505,10.944007717072964,0.44527236028309797,1,8.094948755111545,8.094948755111545,3.604456938559243,923.53125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleFlyURL,1w_1t,1,1,2.6587178707122803,0.0,1.0173213481903076,6.621140057686716,0.9829735724890466,1,4.900778113398701,4.900778113398701,4.817335370103651,829.79296875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleHuman,1w_1t,1,1,2.6428587436676025,0.0,1.229111671447754,6.849782811943442,0.8135957238304585,1,4.420192994643003,4.420192994643003,3.596250118946896,800.58984375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleIlluminationCorrection_Example1_AllMethod,1w_1t,1,1,2.551304340362549,0.0,3.659698963165283,8.897983701899648,0.2732465183789591,1,946.6214662808925,946.6214662808925,258.6610198840391,1305.21875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleIlluminationCorrection_Example1_EachMethod,1w_1t,1,1,2.470106840133667,0.0,0.17411589622497559,5.331762987188995,5.7433009948034695,1,4.54475614009425,4.54475614009425,26.101902460542487,760.90234375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleIlluminationCorrection_Example2,1w_1t,1,1,2.87899112701416,0.0,1.8799498081207275,7.5637625036761165,0.5319290949579338,1,48.04419008316472,48.04419008316472,25.556102548924752,964.0703125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleIlluminationCorrection_Example3,1w_1t,1,1,2.9665210247039795,0.0,1.7319183349609375,7.572056937031448,0.577394430103169,1,2.1520505752414465,2.1520505752414465,1.2425820154447322,816.33984375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleImagingFlowCytometryObjectsInGrid,1w_1t,1,1,6.606513261795044,0.0,22.775487184524536,32.80469819577411,0.04390685441317273,1,61.60158259188756,61.60158259188756,2.7047317184830426,2531.44921875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleNeighbors,1w_1t,1,1,2.4554996490478516,0.0,2.6658759117126465,8.062196737155318,0.3751112328996465,1,4.5466188420541584,4.5466188420541584,1.7054877993676985,850.078125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExamplePercentPositive,1w_1t,1,1,2.46867299079895,0.0,0.440265417098999,5.811366650741547,2.2713571431279096,1,2.5050158216618,2.5050158216618,5.68978558017996,799.58984375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleSpeckles,1w_1t,1,1,2.3365750312805176,0.0,0.8261454105377197,5.933030019979924,1.2104406648571977,1,3.179383432958275,3.179383432958275,3.848454996425974,896.88671875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleTrackObjects,1w_1t,1,1,3.293782949447632,0.0,3.3337652683258057,9.467654252890497,0.29996113088735643,1,9.587221414782107,9.587221414782107,2.8757937776455225,1563.41015625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleTumor,1w_1t,1,1,2.2969553470611572,0.0,0.8088836669921875,5.8879763642326,1.2362717171907718,1,4.360487373080105,4.360487373080105,5.390747212506418,956.4375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleUntangleAndStraightenWorms,1w_1t,1,1,4.349471092224121,0.0,1.4747226238250732,8.752413948997855,0.6780936183146375,1,3.4416790287941694,3.4416790287941694,2.333780585712646,873.00390625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleUntangleWorms,1w_1t,1,1,3.2605271339416504,0.0,2.2592837810516357,8.497339265886694,0.44261814668298416,1,4.618807300925255,4.618807300925255,2.044367927421373,912.14453125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleUntangleWormsBrightField,1w_1t,1,1,3.2337803840637207,0.0,3.754312753677368,10.117098330985755,0.2663603342637065,1,7.377188352867961,7.377188352867961,1.964990355596232,1021.12109375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleVitra,1w_1t,1,1,2.9137535095214844,0.0,1.2614099979400635,7.0860986933112144,0.7927636546666372,1,4.122247557155788,4.122247557155788,3.2679680388514396,934.73046875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleWoundHealing,1w_1t,1,1,2.0257351398468018,0.0,1.4442038536071777,6.18752931104973,0.692423024285877,1,4.702593941241503,4.702593941241503,3.2561843187828834,1201.890625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleYeastColonies,1w_1t,1,1,3.2377517223358154,0.0,2.0723824501037598,8.382851363159716,0.4825364159737659,1,12.096297012176365,12.096297012176365,5.836903806809756,1147.84375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleYeastPatches,1w_1t,1,1,3.2135751247406006,0.0,3.312673330307007,9.61351311719045,0.3018709967116871,1,5.990533472970128,5.990533472970128,1.808368310320217,1125.64453125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +cp_tutorial_3d_monolayer,1w_1t,1,1,4.531014919281006,0.0,10.493285179138184,18.33756344905123,0.09529903961707922,1,14.058660756796598,14.058660756796598,1.339776868425036,1422.68359375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +cp_tutorial_advanced_segmentation_final,1w_1t,1,1,4.264570951461792,0.0,10.793980121612549,18.682571393903345,0.0926442321306227,1,36.253466514870524,36.253466514870524,3.3586745673434217,1098.76953125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +cp_tutorial_quality_control,1w_1t,1,1,1.9164009094238281,0.0,0.6174421310424805,5.479508075863123,1.6195849776425433,1,4.787729676347226,4.787729676347226,7.754135060825363,804.96484375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +cp_tutorial_beginner_segmentation_final,1w_1t,1,1,3.2973175048828125,0.0,6.770091772079468,13.314955311827362,0.14770848515290436,1,16.074153264053166,16.074153264053166,2.3742888287489063,966.33984375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +cp_tutorial_pixel_based_classification,1w_1t,1,1,2.2479281425476074,0.0,0.9247426986694336,6.006233660969883,1.0813818821590593,1,4.208680049050599,4.208680049050599,4.55119035284762,990.296875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +cp_tutorial_translocation_final,1w_1t,1,1,2.5995290279388428,0.0,0.8435826301574707,6.301024904940277,1.185420330209183,1,3.004684013314545,3.004684013314545,3.5618135152375814,878.30859375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +cp4_supplement_combine_objects,1w_1t,1,1,1.9942057132720947,0.0,0.15790820121765137,4.98315173573792,6.332793308320059,1,1.8334413380362093,1.8334413380362093,11.610805036713082,775.48828125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +cp_tutorial_translocation_start,1w_1t,1,1,2.0697431564331055,0.0,0.25570130348205566,4.9467200338840485,3.9108130712762557,1,2.1760300607420504,2.1760300607420504,8.510046805040075,802.16015625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 diff --git a/benchmark/results/perf_coloc_step_cache_20260929/full_suite_execution_delta.png b/benchmark/results/perf_coloc_step_cache_20260929/full_suite_execution_delta.png new file mode 100644 index 0000000000000000000000000000000000000000..697d56bae30a833c4855ba59840ed00b3e54a3de GIT binary patch literal 186278 zcmeFZXIPcl)-6aSa|SI%1eFa4qKG6xf&qa|5Xq8DP?RiDGM0r21!NPHASgK_S+XSp zA|R3l1XOaCoT10EJg2{}Z$IC2?|u4q_m9hSN)O21`+e6t*PLUHG3L5|;k@+b4U8M; z=;$_6Wh9m9=+>^Iqg$i8ZVi4i9j9J|zeH@$U9?rPG_t*M$@&VN!X?}5W|p>Q#s>TC zuUOj{TUziP<>ftkoO}N@Tife4B0N0i|Nf1mmeyB!ZhDR4P3YENm(jGLquZNG{`*Of z(U*ztCptQ+Nvs7p@<+uo^35n|*8T);{0JZ=-6|Ba?Cbs!cZbGhNo`U5btC``k75 z?kD@zI|zV{ZKO-J6Y@HZ^=LeZWS2dh&*Psprmm;e&GdH^!P)mKS$2GpF?T zU!&ITwJdmE;5ez}f6}`9-qP~&&Rx4=-oBNg)>ZNpC*j4WLrux8FRdae@%qJXT&i&w zg3I^dwec#kvb4eG)YQNu+A;IOVcm}3R#!H=irWugq$;D zS)Yx1L_1q`d11O~qJ|u8VQPR?Utj;hviFpVnOTzk@Wk#(*1V8z7REleLK zdMc~KrM(!V<%5p1IaWQ^cZ+Y!v6Q3T*|aCZtR+4AxCw>r*s%*;WnO*^k3}7{c6h`p zhO0NH=-PdL^{3>b$c<4mH@dx8fG{yJ=CnIq+8?3VQ0<~J2!`mQ@r&}zZ+}Rn>9T#@$LgY!R^|omuZc^J{McI z?f-DVZm3Ct<9w)0=2*2*CqKQ%)tWFhTyU0UXOU#jjup3`={_s{6APjlqn*W;Zf~0+ z&ONwH@4keN}jfpn1Zb&3jw9-A7slHnWK9+_`k<>ibYeJ|p?oU%jusE4jP1 zF-BqUJ_$F`mUP{G`$jy`uv4lvcMu-aW1aeK+2-{F^|9uGhgIVq-Py{LBGl=ka`foY zil%(?Ho?M~R#OqDskp|xqWRvvcEcZe)zW_1qkG}Pqu#0@R?bnMJ%dfjA@8?eVal=W zY`6!+o72TEn>n>TUhZP_B$-EZkVH_?5wJacOsg7y_(qF$lXJAY2UgRHDsHht&C zT;?uVSXc;FT6Po&*Va(k*5z2VbCn#UP&e-t^!M{q34Y^swenrS;p*;Z`T6-G_QP?A z*^pVSrT&Mmi!(tLr+@$b_bk)q^H<*a^Ge6>;?dJl{#3{iZsx`mxt2|nl38!VplEBG zX;d8?V3zyn(YC_L_b0V-ES|2+b@@=FXO8L>Ttpy{;H=IQu^Wu45nq%aD_XRWJ?m~F zcBFaNs@v()r+ZnxT&@WdYx(t(@4<5~g+~5Rl&B67s*&Gf^gdLR>^=OrO5)i)7O|Hm zja+=fPa4KJ=;)IE+0mbadcJ&lj`zNXotEc3n=&)f7V9)UsCmSBdBJY-Y^JE=ME_u8 zVukmV?8{=St}^3YLSaYnRQQU+1xy3=oCcyVS1JS@KX>-drZlaTOC@)x>@oFc-iHcT z+jWHPDt+*~My_>_Kaak6Pj!ffl9CcW%3sjpQ{26K>!?;0AMew1n7sB_uRe6b>Z=Dn z_X_)3F)^{mY;*0MSgprLb?dOL?7GS}Q|sRPvZ^I(2?$trELHG-Tkpu2dSrhoThU7) zzpIK8Y)h``2BjMWjO!>Z*3@N0<}1b>9wZZm8GA7b)HNk*vz4+-_g=#!VjCxg zjf!~VSY9UWEo!E#XZu79~T@2Xt?u~qvhtCfvS{ij@;#)xwpdn)|OO@j6cS;V=o zt}JxIUng zA4I(r*fcxZZkn~^wO7b??%O4*6{|g$MoOsE_AX7E)fLyt#o?BW*gPGnuV24LFpD{T zl;0w&?9C+1fAu|6&$|FQ8Ur$=P2YPqt{Ve&Y)F9eG-QUPa}RcDQr312X%#r6wXELV zvac>hH@_~1m+qU#n^p0OV1dNYr{?Z1mAJf9CdYnkjAU#K>l-&TR8{>+n#ATzWcB&l z%wpCM=PT=f==rVRHVz{6TMHaBmX?-w1axMbhX{K;Po7@OBI@uA*_ixmp38hXGrkQK zwn>l;;7U-6ywiAMM=;-2?_0NSQ7R1bc-`IIe_OL=5RZIfVxsQkSV83H&wtn)$?2^Q z8OrSo^P}9pbH@Y;bi?M&Y6vm4MD-(T@yexx^IwMwou(5e`f5l;NI3Q9&(yLfAF%XU zNZtE{ttFdN^&iK^#(M5LLb6eC#XjfZ_I!=SnUVTr?Hm%Fjj8(j(Q=Qo7w7!fZQNLo zcVXDEBLby}+`>VX>SnY4xb+9xQ8Ht;dckSq`$Mod)@U*h#IuO}ua{d{~B)6HczGBY!iN1tukd9-5U?3hDk;1Ry? z3PJPMID=A8^`Uou96oxk(`v5crN7gnBvzOBN{61eIE|h;b0*Vq(nz@+Xm6bf}9?yu#$eymQ$UM8D z1e7rQECo+z9`lbcPCtMCd}3xsos`;_R)+bD9MMc(uGPT;MnC6b6Pq-rJgv?f>nu*? zDVjS|TU%>wZC%%9S!~XCfWG+XDE2%;^C%Aw582~LrI|y8+jy`Moo7cIYa^xYka?~k zcm1}3;R2F}>hm+dC6=3gdRfb)w%Tf%%Bf%EA~@7p6x_h0x?I#ehw%u?Ku4i7^}Mtb%F^Vbw7UeG z-DYJcANI!C@v%1mLJ5lD;`di>o~3y+izQ%-aB*|X)BGje-R9@#<1eNe2-a{euNM2t z26D#(5d@oGL}9>2nfmsHe4Z*++or#hm1aBGz&X-UsD0_uB~Nc}^_8W0wJ4eGlbw%e zWQ_B7FuQ+#^^pWvta%@v1etL%ziHxB>L~^EPU$efud734nPs)#7;UR!d&=uxou8S|8jn^Xw@0p#f zk+2LD+Enrp`(G)~*7$)Fww%fCJD1E_Gb=vLRB(jvMo!~fm>#y{&k5tW$_x{>dNRZ+%Nlv~_iLy^35H8L^iY)5F^H zZ|nu$Nz*DvS-+-}YhC(8!o4Wh9QR*Q78qI|tGM^6h~4qf(9oo?9IR#;ayk9J98|!N zX2B!H_9LxV_-58_W!_ECah~70@4flt9H0v$UZ-d~418I2yyVX23@!I!x8;Wi&v|}K zYHMj}=|^7P&d6xOC*}O!(C6+}7RLFB9zF^nDRbHK;w*gtpo))U3XA&^Z^gn6ah}bL z{4!QLKH@jFZ{IGJs#lmKeghRzs3}R)@3O06L=B7A{AhcA+0CDR*(4++^uR`J!6o@( z+Uq#2tc2>1*hS{UAJbSXX4+p`mGtAC8~c*4)kc&dgKa7~R%H%Ms+cbB9L+yd`Iu)f zcFQr!9@MfjM2lG%>zC!LLwdz_LxH>oZ`PGmR#uuYk;^38P*PHo(h`Pc-!oP?8|Euu zsvcs_rJI*IzBpFQAu{vVR`Fw%Orj3QDkfbfDmaWMi4?-Yyh*#r#nBKbU(iQ!&e;I)s|-)b3;A$QN=nN8K`x~Tk2JtZ%HrSK zhniD`kpHhtw;*owt%jP8bS0)19nZ0B&E!+B@A4;(jd z$*nySCS<7>;oeDEGHK0>AFq*E{Wv^3XN|uLF73WEj=S4~Ad*$}LAK|$`YL%c<+6@^ zPvzsBJu2B|Ef0VCWer7J+N3q>QpuV~70n|nTg z`rXxV*T8G5=~pVNmiyj6<-@8MEsmZ%OY>!u+r`So#Z}8IVA62RXZ^Z$FFrp0R#Mzu zB=vCjCB9LQ^{)Z@w3e@DAdTO-bkXgPlem^hz$a>0b4^Xnz5Dlhk-RJ&oSa0K4j2@? zcyTNe5ow>5MI!a~#@~~g3>BH!Wc`o1&3#!r+1J3n?#5V$`SdT6ruqbEoe(Uf_dpKb zHT#FMKEhnqwm|HDe$x(xq9QtE2FXr5>Z^%AUt1HXZP8|+in-hBm8{!QETXHP* zX?7h&u5H{Qhc!|dO0Vn=tZAPc@A5*5XK&E}vMxhEX4W)ISrENcMb9pO3>70OjP;Vi zQsHbz#^Ixg(?lv~$-Tw152I+dz;S0I6_I;eW-y{cBUO}*d~W+#}%D#T}M)r3gp(LCAU>n zR6G%NOm7s~!5$x@7;Z6c@nQy0^%9e~%ZZAj7v(@4Nh@LJ=hPylHg_TU2)Mfi@9;3T z@?jrdG_H?nk$+LT%6kfhxE8mZ|2|0A#>fy@T76NxsETAMtIpPi;A59=RS)gnx6gcP zu(2}biP`ds%me#m{o;;6mXM2!PKzTs=GklMl>g$CBK@xDB%^>y6sni3r?%<0_8Xm9 zA6bf5o~5Ry3g6a3wqT>;AvL1CRm-u^%~-=qk_L-msGv5)y*w3yd2^Gi5tJ zaV0lDe`vlhoM39(zW4h`-bd^Ch%)jq?JQDP^PBthc7TRExi4NI9dD7#yzR=8W3q03 z(?hGOC%kBx^&V+q&(Y! z2>et_zRhuZP_1yPPOdl8_x$m%)!| zktzDc78Z#rvEFFH4l61uJ{5P>N>oo)mX!3M3}DAA;|`|=6H{e9L&~_t105%O2M`go zC_sR=PL`D9Fi%B7azA1q)R18_~SwpO827Ct5dNgy^sVSV(u zVQjJwQB*&ER0BNG^T5k>NPSf|24C+C}u}#a^MuVtI!cQ+3pq9iVyNftZMCB%5cz(tNeZhvETv2#b zw>>=ifo;)j%LGq%MY_1UB20Gw_SQOx1nsXLdhHN+_;TzGz~HPhHI<30Xqs4iNLbnRN1*PbJ} zkd_Xmxd};zt+ddz!*#Y@RZJ12gAy>~&VBoiP_6Ck)KIk4fQI(md4BUI9f^4GB{>cn z!V!pw-m$0QZVOa&pEQ&alF}!ipy6u|U9(u*sklD&cZEb}{^#rI+56G^vk6zr!?3Xp0E_4()(l_$j_Ft$D6Kh*)sjpW-0ww4h z4~88*(ICJLHAO#U*9eG}hXw`)6sl(WWu^KU1wbTDf~B$Xo6+CccE1HQWTE?ZG3u)Q z4uS#eUZYNLzH#HmS2m5w6wI|{&Yq0`8N?ugy$%39R>1@ znA~^b`YSxtyW8pM4F$sD;tq8IItaynBFMkddcE{ES*yrDu|JXnU2P?$vCAH!k$Z3) zZ&!ww(J%MRqnoGqqHWr^G2=32!?Z(9D9h?D5xjdYr)kY zwLo*FHOsUjFsHY+?|sv<^U|Ev110^{t8nBZ51ghvCz+&@&2)%Q-y&$`ia~cF{g$JZ&-8v3pQmv!&>E@5e#CEQn*)H~hLKna;N zB^d`E*3M2s3uLOq{^gJ$r-kZO85x;~JoOYE;}vFmd;9YfEpq2ya~jD#K5EVcN>3>W zsCX~ZeEPj=-|ZgjOMUh$TKsDJdQmXGQ_Q8AY{fh3CSvn`zjF| zJJI-IIV701^S`>s?mTqiRcQO`VBGp{ELBb}3u^gyw)&>~ZIAkXwotckpcZ-=&KECD zJSgQIXGub+zB5?7x1F^rk6G9K!*(&}8Gg#1j*bp>dY1L{9_Fo?)btb&mW8Vow9=Po z@*1sCDR;44Sm~2kP1C&kI$opGX((B8v8(yW)c82BMQ72|%PtzJdIF-NqMN8?hf@m- z(st+RngmnfEtClN}zvZQR8_giU+D+8SAc7pd7O5PiE<#BoKD(-&jp zgD4W8Go`hXH}BrP`&tv9-C%=ic)9wm5B2r+{jFJv)s)OjyL(xFIw36FveWsshmCSG zE2j^88!gYB1aQh^-{`2tr$T3;bA9sW;T#Xq%(R@a?SE8lqY%tr!M%9RpfecN^~qSK zN6nen0@{AT8+h2+%f9-oSN7X4pZKwh^dN`y3SJ&4Rd||9(6eE=cdsyV?A5G}j~_4E zELQ=jw95CEp9H}d^lZ0)iGQvb-r;Q!U#z3J>HYQ2qRH!DqaHjkj`4E}L~SzQ6`P8z z@b#c3fMfg^n$mb|Q&-PpeZk6B*>CK9;LMDMLB5tDG|U3qGp_oa`+3k9Ftbt2WOtzJ z*ua2ssDyimk(g!SbYQh)WY%ue#)K;}R`mfATwk0|#9!?~mC6`w)1%``0ELbX!yY>HDlOUra!w71z1J7;{Z zOTg^o1!SRmls*P}dRAbb$vKA#h0RXDO27U3Yd^{@xPW7^EPh{O*84{RUi712ljINV z?Y3xsQkx5S7WLZM?&{VU{ zGzmsB(ge#=xIEM5)c5oTrL>)gGz*RMDqXndUR$f8q9Uh}tY+p#Vb+5OGjELPJr#9S z7P9Q%kDc}7PMrl1Q*llCQgSy$<)M_MWIuQ*6kR`yj)HjfD1%twCNv8T;8G;Zot&J| z5Xs)T)Q{gsO_ZC^0VVq4gkTme-yQiNdCNW#G_U78Jw59HN*d#oSQD>=tA-01*S+aw zsGw!KEjs~%Y+m#0uTN?UvM!?6ioH`{)93v@Oe~RfYM#y(U%?es_0ESreJbEGcO59? z$n7JtiyynL)P(7xg;R#Wvvbd$cyPTTv*d|Qf4R$|<;4ooHTHIu?y>WoH6)P6M+{~2xhodb%17ei$-&CvhMZk2yopM$zTmjsg zbzh&X*~}>8x%g`C)t|orwFe$Nc(5v~lcwc<9W|8^_n8}}Xl?Q7rSIii$1bHG6{fnL z;H)rce;xIXU1uZ5O39=Hkr`$QsKUb?@#a}MYe5xpUn!VhjvUg^Q~|T0%CU||8^S94`im%KW zDukX;0!=bl8+q58MIr_LotFP3SYTiyN@+5EF!l(gW@qs(wWYN9D`U&~(A}t3L&;); z)LBRCv4FX(seq_{9R>>c7P!~;^wFbQKOXB$A++EvgGb39umKMu-`ic5% ze5{3{An*dUF=vtN>V_;(9<{aI6-Sc;z z(F^k9bqTt7NfW^L)JRUJ3HtG15xa!rSKdV-b0!el6pPiGZJx*^Y#nvzJl%`(u0@H> z1fx0JLK9w9oYw(X&A`x*jfzqq=`g+a*XK=|crjB#kb# zfvM5_G4_*%{p7cNBvw8y2@?_-o$iL;k0vE)X1r@}Z(q9Zh>WqTUX!g<>)>%QHYO{z zVmDVb_OC|`GmNTD+`_N_dQ*%=Ii~k7dDFhktG}whKEB>iaqD`C>k1~_QYMAdP1?Qw zHeh5D^a}Id1s+L6nS2ZApOUh=YV|iV46`=Vdf)&m0WTEJ{rmUVt^hq5gJ7k7jWLur znUY;P^aqs-bb0WbzW(LK{{F{P{gd4thoJ@J;h~e3_`umaCsc0`g>bB}u+R>#<(MJQ z#rX^%qzdHDDv4vhQQ&go(AlcT7JB)x>LIi4V>}RaJ)u9-X=Wew-Z?3$m^o2zr@+q2 zfpKTZnlB=73N6JD!mAEsFo`~f(oJ;KAF8E3;nI2=G_|wMYC)x#r%3Eh zh4!eGZ=Vc}B!vJH$|V<9p9S=&)mwEtU1xO(&iVS+vIqJ>-F$iv#l4XJC!NvJd+j?Z zcy5}qw7;XXQ=(|@$ZXzYD7HnGNtAPatY{mgE$qE|m*84Rm&uwLQZ!X0 zb##urwNv@y;5t^`?C_}YdKZT07E3*J@p(%(L<`~j#92)xzP+MQUX z<%OZtyc=U-PP3!QU^=v(vWtAlKMtJE>88Q%GK1iK5+OpVoEAKL_AJp$L$3I+NQ7P1 zHJ-nFxMspxSj^2QIyy5?df%7s?kF(Z{Qwk1_(iK7z|NYhk_ZZth_tu<`pd4jYR}!+ zJ+3=O-a!@w1Cfl2%&^ zDbIf(8VX=4hYKD9&cb5Tjre%#xaa|KnPcXqwR2k+)0S7*LU zX%LXnmcKC(BY<7{plqG{%49hIeV*LKSrAiN*=9jeFO9z;6t9drYb}bpUA~UkE`8e{ z_2$i+{?C8^wX1E1+qLD=-}OI=HXVCNnLT+h*}z8#%rD>lwlqU&l9GbOUGt(|)|x?* zNeh0H0tr-@>)Mysw?!a->!yW@Ijf^n7jjR50ua>wDdVc5XXkCAF%&Bfx{0CUIu^Im zj*a`a4p;ySqyUh~c`hz9Nicp4MrtyKBHddvu&kGYj1lCZTjY`pKFl~{7;AiF`*oSCJqy8by4- z8KJp2bmGK`QgcVf0^m{FSE;5UXDEd1i~$o9l{_Jx5UooM z7RnuB&p%Zr8NuvbzPRhcMHfqRN*|mojaX1ZDAKy2Pa-U1E9O-UKRg3Wu`FKBE?Sz9 z3mM{liVopRtKn z{=1%<@Xk-nQ2WrQaX6I$9X-eY3sG58OVQCJP8zknJJRh|!vL58LS0_d}K2w3}jq2DL_!%0vMW8=CXK^n-h`a*hHF2OG{mhh`bu35JFIR_MTbb z@u?2yv3P(RaJIDEcJvvLJoDyl0M4d{Qj3G{_ec})f6{(fCR6N^0kTMOwo`G~39B;@ zX(I?6<~vW_Wy-@I@FC+a6lwQN*10N5wsbEvR<&N7>I8P zI(|hNMFIfr0DgWlk(!N^ghF_pQ*Y>-6*bYhK?y$)lz!y{&jUKftlYp3{D9x4SDuj0 zc=|Hq!hVy4!(7eQetG>lJXwY|c_ctJ6&hmCxD}=T@w3O&-qG0vm1aW2}2KQJayZ{m8{m@_~KvfRrHztf?MQQ1|KmYub z)F)^W^-n zFgunC7-ouSfZW^k;!?@fKx}vdBo8iRPgE!(cKMF!7rlPSwc)LKsPZcKcwX%t^%;pk-%>RFrv+Tf;4=| zceh1-j92y589znwT0m>ka&?vaB)ZH`5Y8NEHw7u#6bQPv^$N6t;Nw?hgBARqpp%+h z0f7=vgaZx^4w7mM+@oJkUnqaL$IxonZ`ekf0m4PN%f$WMJDo6kMM6kb0&h)R0RB)Z z+jDKC(N@%=;jH>q=QYKjg4;O<{4F!S-JH^15sh#g-f{8);|Nq zeHd&ZDf}=PB;YBLj={*F3HzMIb;@_2#^LvOS={0vFAw2a5&r?QTqOD|qJe<$ZmjU* z0J+6wlWCwOQ4&9n3T}dSoK*hvp(mb$Z%TmBlyEUE0$TvIqoCQxXCFU)RWF#UT7ZeoOqR12e02$^26lTUu{`n^zj(z)Fu^P0f zPPat`lzmnB2FM)}Aq)4kVat{#I9|F(Mv}pFOSSH=(W`1ii;k(RA5I6l+8AxzB$|mjC+euNRN(1yRY5hFED{ zx;R+K(n3D;MD3Cz^3?r7CwM2Tmn&MpW@wT)rly+_zB?V1zihghOD^)TcDp-#D3Q3o zifo~k!vI)iNE`Hx86YZ3>g)L`3<;6D^sQuTZ_Q+1jbgSwE!}z6f)#E|`%C_T7MAoGixlW$f*gc@ienl zLZMg82y+RfNw~~?Kt233cQrQLE#1i*34IS}bpguvKY=NN;;O(ndEx3?T~mMO(fc&G zIFD*3h3qn%K+3RsS3B1B%h#{8?lhi)Z@0$B%UMDsEZefHO>{xi$W1u0Xa37Zkkpg| zafekdkh>zg`ro>5Z%w#mV2H3yOylwKm4zXmjNz$)dOz-vP%x#t;VGb&K|HlHByw2| zT&9rx#lFjIQ0EC%U?@B1tuQ$2cPXk`Y*40iuhggFAkt*y*9<^K=7!LvBsRVXFgbs@ zW{E}(ZS(b|A*&Vxz^D-Iyy`nS2+FouAV1K z6IL@T@2E}zC=TL%B+!q@SJ&K835Z=QWVsctFyQ5SgYNStq=*4>D}hBa_ddm`p7f;m z{nJEpLDla=b`i@PG|g)eci;K4-mSIV378~4B7?co+&8j1Z=>}bw1q;+bqktp4~>WA(Hsj;QNW5SA7Z+mWYqQ1DCSI zkYAc11Wnh;@o0*zP^TSbU0|_lMROD^U}}^h52CsuQGzAk`*+%rtHdDquCr4gO-iO_3~H7ZP_mRaQ;<=g!bW01MocHA92i7%1iWVoPED~? z#?}->o}GuEpI_1Pj5evs)bl$-U;^39bmD@v4>K`EtJuBohNtNogbLDN#3Hq~a6cAv zwntvC7%XbYh6P9Nr=NaW0LQJ0)-a?Tq@*60Q2}Y$UruS+9Df*VW?+WkqLaCe4$~DG zs<#G@pb?q@t(%uXa#(Jv!XNBB9D^Fe;Y_@p#=z~UbOFTM$iNwa+80DkL0&M$9-~FU zeG?Bcc2{`~Jd2?4Xi>yh<(L9`1V#%vT0?=O4RL@8Rvy*OQ^mE>qQLLrIxCG@<|a{R zT6I|7?J7A&D%VJ7u|6zjPIKR$6HEXnL>xRk_O2hfsff;67_&(JhdLIAPc=&C0O^YS z7|4+0t*y)wD*P2egQ$LhI>-RL0KJmbC3x(#(yeNswdt_-NBW4TYq}BDKgTj0jg}gH z%E`wB5m(#&lHC5g5BX?}2-x9b0P}P~VxTq_%Ys@4K)fi%E-I>nofSZVm9w+=?l`>0 zBrIWwjR58+RRoV#1tqZR`1q_0&Vx}i8Q2VTbwV-835-bQZo*^Cl;sXwFTbQ?`pMy8&U8ryd z@~XkCBg>8OlM^W~*x~OZwUJ=G&Z1<{L)OW`mv#+FY4Mphaoe<4;ubi9Q~34Z6DN2Sf-(YG z0Z8Xvh)^opvShTfn#A!3svvrm)S& zp&KK}4TSQ$FtPl1k9krNZb2%|TJ)>$4{4@HIn4|QbqnLcMM1otUs%vek~Wir{S!Pw zB0lXMU=<3S28c0Ln0b&+#G33&@${Y`k46LDR>H?kegRs!8qjtA`>k}G=e`s1P?I)j ze{YmOYnC%ak`4X+>(rWmrVRf1?(M1nV%Ww?VeH3?!laPTiKb5(fd5&p?;3u7GqVfI zkZ;H7AHRdY9FG5^WBv1!|MI>6y9aq5?f>=PA8>qI^VAl6cZvpjx$fkTfB38qk7&r^ z?*B9z^pLzvF(7Isef{^Bi|VNj@%vJK8}9Ib?@K4c>1;G;@Sg^T{`2SjW5E0V%Kw1{ z`=7k2|NUYAlS5wr``HcSvR<@@zBgLOZu__f4@9Rp|F~kB#jKl6wbra|(Ii6uk^#qAAqkl?CDh zoRaKv*tI~2XndVApsX90|A;YxGVgtfpFe+&O-SjUTU;csia)Iv^UG+SQp+~^kXvekEf{7%{4F5+1R9pb0Ll9(WQ2jlu!!@!F4#VB1=*w!8~4vG z(utbNY?p>-rL^#=?+qFK$+WlF67?3C#wOja^dyLA*q2lB zd=3NO6WtQ9pez>X@dGNVpF}F$!iu|KEaOX3P=RP4!|82;ISMEOJrUU3q@y6W+P-CPB5U)xe#ndtpmtL zn17VK@~ORjdS!7eR>YfQ9wTetzrJ<*?)PZNyG28r>j#&!s||0T3UKun#1n|>hH@77 zBq%Eb#E^Zl6V0v;nMs2ylJ)NUlNkOY13I)R_ymI5mZ2N}`UQ-5OtYSIwaKk-aN5;_ z`8Q@?=a(Qylk#Cs2A(?%_A(+xL(lP?#L8SG<}a$u$43w^1s(3IuHQ-asU~g9p!Ki8 zIuIPfN57fOjmhy8MuF4SY#2kcNLG~{mvn!JhxeOt3Yif8{#Cbi{h5#OgR(jG z1ZYsGpcgKHj|tbrp%|tLvVjnBSE_^6$e1PCcYeo-%L3OvoFaNaiMiYZ z8zNXOAU=CAUTmd9~H>)yOb|p#;e*^AAQO&Ay_ccEicS=2SVpNd;=_-W-g-nUQ-)M9un@+xx#*_jNehK# za9x;ELKmp=$-8?n7{d@0V>nyLY-p}4tjsVY)nhv+LZ~}z+LW}b9Fi58mzK+H4@TY{ zfJ>H0L0gzb;gAY4gjerds!tB%|uo~cG%z1BjgDq)zes=AHyr)l} zPQN>xdJR0{0#tZ1j%(A2Ep)KtSVO9Qv1$(7HxaFv%RhegJvWs!=4k1-K-3VIU}$zz zhw~IR`2~Z@Yme9qcX;tFw@Xa8AETE z186s7Wji;|bQI6*KK94WpMUv900k7}fCL&=WYnCX{h31lA@4qNli7AqlVo(zya%)GVs3Yt9$V)FkgRUdFvR|_RS?Mb>aO>;Karcas4^vsM-SGVZZPfZs&6RR4pY#$yA6tV!KP&Gz=4{=~RPIUX?hOuX+k^2q{3JU&K8@r-2 zK9XZU@-;^yc++9%U!eI@;3y`@3O#=~=%r{pBrg_;j;|#v{@EblU*FFzO${fcJawis z5;{%*93>b6|qKXt#502r*jGK!lTI03?i!W}V?)vTuiR$XPM<&uAp59Ug; zg7$O6iX351%=Q@S>lqn&dM%$pXvgue$TarLH3H|~ce$h}Pg=-4$d3Naxyyk@Chxz0 z4cz_p0BvWnMGNe$!{Wr$X#%(zVNR=ac_Y6R_vGHadycqT50?$DAiv3Z z?p>aa^BCe`?*Ro!APRKPplc>gkU;u@0kThaWQuFJEOw>VN1B(vrJ0V%adU1My0I^fGIW+0X`CbU&dBlSh)u1(Hgf0Aoza+~HifGI zEL9Ov2Fcj$i4O3Gi9KfKiW|Mlf&-anmji-tlw@>Mi^6~0Tolg^51Bw@I-tT>B-}yd zkY*h9aVgCmL@AL)!H8Fx!!)M^98qOV4{^L&>71LJ+m`Ze64TGKwu^vk@?{V@I0UDh zV9pODo0XsP^KTp8Vjo~ag!n+>Q73~JNrHnWa0qX=%QQv!9j0)gI-;6p%5X`YJI5AW z#+wCfiPT93V+qAYcK?$IYt&3Z>33x3A+~Dqz{#|XDXB-;Ku4sw#YXMhoPD4}=mSlv z;J^)Hw8brH`}1u&i{ldbQmtecDZ;>Cys=6C6wFY-)q0k^7nt`rB6z_WprBL$ZN3R< z7b9Hk4+f4R$Msg#)8##Vq|lYj|@CY?6J@39AUe z;HcAotuaP?8J)QffI?U@BG>!wFTjL0Sz>HgVhqDBy?}5fiZ;3n5tkJjn;b^f+CHG{ z!JbFXfoQ-m91-yW%!)`d1x@x2>xnZyJ`fxWH!s;b_RZ7q5`2$$2*izfcBa@<=gAZ` z-jM-O0a2`_u<4lq99{{~77!KeI0}Ve2bci}l(5BhGBk&%_c0=K5DzqXS6T4V8uxdw z*-ms*Ni%|l;*Ir{f7{*;A!oXdoR@;}%tIm~TIfiezm8I-4mC3QXEw2#6SMNMdp==bOc9ije~dDNf`e& zLvTmEy@0q=h3klnA%O}eJSh%JVQv$#^e!8Wiwe_~9!rfHOz*WS-W#??abo!g-Ck~PT3rZy} zT0-PcA{lEy00W3(pGN z*;wW@r!a8z12|%*0S`L>x_lO-xW=>-?>d|_Ve?x+Z;fZUpG+l@Ft0??AXA5r;R?w; z675R!hinoLKt3@$tAT(kE$Rz%K96K6;BL>~L4X=K}4_@>aQJZZy#VjM6MR{gEc z*<;DVjERvnC;NSc#k7RV;QuD<&m!!HI*W_R6fWQMJI-Q zlpob+r+&h(9W5Q&YV^*ZN)iKh1SA(uxDta^9>~@aKPb8lSQE^N8nAb5aU z?G?E_(?D?aW>|JexkR87hM&L+YT_>xBHf-Ihflp5M-e$ue7_}hi2DV_HI~$1z2wV*br4c=X9j1y(%gP9*BOzZ} z_$XMMD*OD*?My5M8F2(XQ4hciN38|n0|?Sp?eKLVxDM?N+1d5zEZL|a3N%pC2!&1D z@drDi7IGm-z}cb|F#-z{xm#?gCkYq#6_!!O^1VCssf|~Lg5(l!{FS`e%#4}M#wWan zs%S4H7Z+wmLax2ZjI{cXY3v7A{kgNNWUIvY))lf#0)YL%zAcXqz*$62)=2+2gMaPE zNlhAfOjwr*ThC20T1!(ot26GwbFRF+g=fF##aA);8--+OKigZ%_Q}vi`HO{T@ZQ=s zV1R5ufU4h-W+U`1==i* z|ERniE+^{vAFtz&%{Y1Mo9g$!@TPSvrrUn55qB29YU8H-_xI2F{)deFe{l@ge>X!L zib0FIljLwOSaPU4R{4J-Z@zz7HMw4r#_+;fMMV1N{n5kop^j~4SM(Uk3~pVipGkIot?e3Pf^aemgSU* z*x}hrP~iyY1oMCl4RZpJMUy!gOET&-ek>oi@BTN%XSCd8mMIe7!eDg4F;venZx}1L z51?Naf~D=Z&wn$7OB{(l=l;2Kh$_~nxajKe_04(#^Hx<-$RRN|!iGjwCe1LqdJe|Q z`i_6SeG=>Gd+xW1^AHWe2Nap`gglxb=0u?>DnQHkS=OofdEpnTqjJrBy&KC6JW;Su z)B)%P9MKkZbas}b6%-Z*VDN2fGtqqT^@{J$Uk^O;)^lIB!^tWtUhwjbT?pGSwHCE; z($xVr8O(zcxlR?M-DElldyGmW;QP^|N4DPNY%TIG88?4D!2AGuTjEfwruO70FCagKlT=1jCXB5he;=p2ec^Y+d)?BOHQ_%UpJJE zM|Dd4b02hJn*eY5Fa%D(4LMQ>GA<`LAOdW69o4xOcwc{V6oUh#Wk-SK04YnR#$hs3 zs9oC+{-utL2T`#|YIxYB+z@m`n}Q4S5PB<|yCWN6*fmSMj462(PMpRAIadw%F941M zM<*xLLiJW~$q@_m+2q6(4V0b$oNoX=(3zH$+DW?VWlTYm(g0tUKVC(i{px&;yDiS5 zxw}}-eCN_fS1~e9jyxC#qy$UcBUE?1vys(PdeXgu*-pZJRbb2m<%-}O0q}K_&81rI z6devLcshti4woW{8Zu#q!LIZZ;gLQ2%vG$L8}uOmlF>4_b6K};-Abw=7`=Lc0&bd< zcNvFpQ{VcwNgRB@31byL9X5sA{5W-nT8BqZxQ8dRgwQiTKN&7=e_(aio zoNPC(JTZLInuR?UY-EB)Y8Yi8f2@eF>-^kwKO-0bU*<8E9}h|~3}pRH_q$+mE5RJX zI_OIQmN^Vc9#bPYrJDiycm`;F}M5lw9lY{pLSDE@swszU<_@tPPS{Xi@lkUYTMQu&OkUWn|BD#VWR%MzCx4Hh2+v;_r8 zj9a!qfZ#yM5mSUD;s4_m9W0fxCyM-M=F!;kyRW#APb3S3e?AJ{4t{xZegY2ma>B$N zaT~*GaR{av*hHsS1nop0NqA& zZ`w@R_{&ZSY!#~8ceFqZ2q4cI(UqoR0{svKDTH4DBmcE$B!yr@Kx1h@e@2cgcwl&E z%RUm*BxRDr9gx9NVW2%v%f!idw%5*0jCK?z5}Fvum#}R}!)#Py^&z}7dP`!}-mqzt zysepwb74UNO-%6zCrr-80PI#FOw7tw_ga=i_!h%Nz6{O!UNLiyNWXvop4e9iw@wvtTYBl}VzN+IYie5EK5)_HmT zG$aM$Jc@`S^e-V1A+QaAf+bGSQa4kTt*yt=6?rj>wJt#;tmMz)l#74fP_>vIal z`5{=lX1K{{p`N@D&y;oCaj5279BpJE8A>5F3h9sxUyXRz*3|ISWB zjJHm`G_f(EdnaCLH4uNqD~)}C<7m99;?Jq<&^KB5)Y_kczN;VFW&)0`E1j9+WG{LB znlO&udfKMUeKvlar?!Px4Bazo+yArM~h56p!y6W)j*q4ZY2t#W2}y ziT}pB1WPbbHZ1pm|0^!ji%Z;BFZbvO;JH##L1jx`ek@XgXm(sxwcjs zhxe4z>W^CHFhO=0rWpwcAUzE6TuDb$dLTj6ky9Sh;5)lQi-K?RB-7cYwUbTauWArz zlmTp)T`Js|-@XRf$-Y@F^O_P#FE|jP8N19MEuu{)IVus7B11XL7!YF~pctW@aOs-E z55~gF{|*~cA}>SP!_-<6*d>}mH{4-l3gUZ`1`ETRFbrtit7S4!Q7ag|6B=%JHw9r$ zxLbs_KZOX1$PQ#Snjh5u)r6XGN&QwQK^4^X>Guu|ehxF?YX+uQex#Id-DztMC|AR0 zMc5%Ep@t+)zUrqZHDF{UM-$=PcUJ!#&qR>fS+zCTH<1 zV>(KNjIFi=*c@YyAX{9s3*oipeWJ`E4m?naUAbJt?glc7K zftf#DQpnKuGi=-T44X5Au=(=nkn3?1BPm2w`T)5r3pgA#?$g(o7-%MQOm-(`q{&n( z*#)xb`iCPQcfAaGq!(yD}U1yCoWkK|kY4tLC1`GgeIA5-K5CrC@=+#qts zC~A5gBvQgqV8X2B;8Ao91huE6G}(-kF)O^dySLZKVi88!DKI79&$b#LS3-uG24Ocu z8Ub<<0)NvIO7zCZ$uzCKt`BlLF#`wl8r~t|2rLt%kP+NW_+JFH=9@kgOB5YIO+A9? ziSv^z0t#B5`)U!Wdd%K5QQBy#EM;SIFK0sjh4Gp3kOn2$pG%E)^k z35=Ky3w^?gu>$hxC2i{TxGf2*) z8rXOK&Z+P&&218|{oR8<8~4qYzM0zcJ*zN>{I~Q`>7g)Lc!i81CepP~0UU-dSu z%+0hm;x>Xi7Wk5wJ;@2**yyQfK@)+|6)AT(z8DWKKCJ6oUGpEw8<0q`b;Rj`?v_K_ z0_mPn++~jbUVqCs{+TvpP8@WxAla6v8Xp0Fhp6xFFpt>yF+SPw)xDw$v){-4Vex#3 zV`{<X*v=huZ|F`cZ zfCJlKsr)IhZanD+t+Z;Cbb6iWB8Z*pdFpRJI56ai{mZ`p$@uv{=Lq}pyzqW#oha0$ z`tJn#%_)_v^Ym2ZSEC98OzUs@r}xU}PNpmPSIKSct%ni`{u!2NZFV2+{-p2XF5IRrR@TeVco7 zj>$d7Bx(|Si5nHW*c(QTWrK>MpkRxF1+0kJ5cMQRgALsv78H$OK|n>Yw3Wq`}_*@;vKVYpyxx;*{`tUO(hn{?*I&Lz)g; zH=OdX^OWngls9o5TMQCPVDEgZruQr|Z+XShk(j;ke&xfq=pvM_q^kqEPqzFaTA`M9 z9%h-5w=GFZWVFLPt*?>~Hs ztMJ=zC->wCQU65cfFfv@*_GedxbH{b2prG-tp3Ze%WJ1iRL}tVUOP*zEm9y90Snbz zpZt)7>QBSP$Y{s+*ZR%(pOyE(dyZ31G6p)?hma5oi4nBykb&4mTAR)oZ&Z?sVkzZD zVNfm6A!${Y9R>$86LwKd)qH!ufj(_m@k3Tl;o3-|TQHxo7=d^`S7K0|?7}S6 zJA!Q}?QOymDZ|OTTK)(BPJJIjS@V|Jg9ARfsG$n-$*i-g2@OW>w|ilOCeP@Wi=T)Y z^5bXELe%V|BN%PD&?j_GjyZGyM^ZW)El6H4bwxMjU?wT6)@F7J#QO(R)z!6*Jxn{k z4A&8rmRvy773mCuG98V0~t zu^B*$)I~%kwP||%*Y8%`iv7EMC)FOfr0NI3o1yf)!6QsUnHtXnz*E@dl(iBkVC}&{ zBdd#}E$D{WsqaQ>>v-8&UKZLGzXUG?hNHm>q?6=Dy1+60vJA^6{WC}PGjy*u#}5IO zWaG}~iaHmWP3xjFh@d#KM$?>Wef;W)6D+P$Zs6u~+P%Y})o2L;=QxH<>O!|~=q}6g zKIgyYexhJWeA_fQEMZc+L5HsfWlDdn#mOzmGIYqw`e=zM9qiR`;@GUfjB!Ih3~>f* z?aHHZQi+iWsIGHQ)o$gen@*)If@J^arD!I_;m9VDx^rMe(0uIu-FJ~MPrV%&POENv zDt0y@Ko4X5))vDubiogC-h#K~d!4TGB^{iu7+MCM?+hFP0yFpI zn+;LN*w+AfL-)*slaK<1IN|&{j68|9VTU%|Lq-l#7r)d#xcq|8G>Dq&__A5L6sxYH zQ9HLJ`G}ci_vk)DE7n2CG3UaJg6e;4>pc5LxBq(jJ(}1QOix=3@~iwzY0x@=e2Q-% z1Rd7LSie3@M-g|2=r1OUoY|MXeKif0U4?7Gk?;QTAhRehPaLYwG`T@rlP5p;rR4MF zE_S04AFFiX<=Gt=-j_UY3mKMh9b$kB>`0Z?vTitbj>eol&+W;RC!3wW&%~fnp^fLW z4;9oiYG_T`5GukFmP5%rkD+Hq4|YAYn$Kfk#is%+1a1RKnMK#{P@?AV$37w!OPt6; zXK(z>er{!95nKP%Jz{NsNt6ZPnN)p5Um5g^t|G(~ii$+=Krb!LXZxw8B71wFW_vzQ z&M8qdlPzxU>N8QC0%8#Lxj(DA1@)$qf618nQwu63dACTk8Lt}5%7t=*P)=G}8onkGBK2*^$j{4*s8dEI-Wh(bR*7IoaG=9% zZ1HQvrAu3q-3FVYj(6QSIqap=hjbea2)Vrc%?Z^+3)2=4!bG6U?Jb|pSY62$wy9cU zWl7Q)M5f@kvUlfzikbZ34H*GrAF%c%3aIV9J&&Vza+&R!9ezST(}uYstk>h7EB$zP zN-#d{^LjYttWBo}zXt{VWIHm6_Y0CMYLF|P_Kc{N;^20#E7vOTfmLadOowRA@Q*Dy zYtnhqqcB3z*`bLCAVXUw)rKA=?i92;J3`u-)Xh8MC-_h!JXNv2yu56pJT%}VKy%&R zbKxPK?fwBcbIOzmimdzzGKwJjXK}KMbIBx!z;8cJjF&e$tJk^NsMP?)B-t~lHZ z^Xzf=Cr-gT{~5`Po~L+0LIl`eIBDPEM=SK>9q{lAf`sA9+Lz4y@+-?X1tZsf8_;xC zmumghsi#paD?pWDt;-*lzm>?#+O5wJGAS@mk|b|9rgI|ZJi6p<9M++8m3gJtnR?chCdL|0ff#FX~FOSLT6U{SQFmHRW4#u!-d-AVIH90kMM&cw}knNVxf z4|z434a5rc!<`GO`JJ!v9Z3oE#KuZ}l za$;~!x0DRFM>glXw7cArNlHTDNucTrPJSv+1vt;5bdH!e#FTKXW6dS?y`1Kpiu!$U zSp%2QAaQ5VbV}R(H8&+OtvKuA?x5xzg=Jvtq6>Lf>Uj^WVu=j4y4gp*0X_UaUsd@` zg&>yKMS1CO_@eE&dxu^g9~dN#t;s3qt?k9T$BqMEHZ>xs_-2n6C7Sft4$XcpacTWr zBc_C=z#-u3w{XI@!uXHY(+u)pMFjxJ25WkDck$>A@b9whA;;HRue^~1HEcq5UN?Kh zmZprIG4}QGm6_O1?2<7Q6f!8LQ{~FR3YCf$PJf#byKWN($$t{yW);BFX+@d|^q7FZ z%j^y9-J@>il@EQfq}%nonfW7pg67mW-{QC->fznvJ-!Yp9`xJu#Iz=f``Q#16!;lr z$knacyPL0KgW1pP8JC)O(l&zM(>D1fJ1~JYNWM2I;tj_GnD*iB*At(91yrFtVtiZ< zSy1(aFZx(X{>uhGac|+1>tB#e%7@rEe+QNZwm*;ksZoP9eQrQ{dUvFp3G?#YdbWI9m(do3S54~H z$u`HWaDCG!wlQf%`-8(b6ij(txPJMehF@IR`K;f&x@pDou4Ntn_RGja)Y~WL z)0C0h_T}R=iKrfIG404WP7db^+LM&ofpmjFvlR?AJq6yWoc5-qObW#pzEup<>G? zwt}?CtD~Pdmj10p%mf}kk$%CR9;~Xv?CLRoK&~ewcroIC<*+7Y2Xrx=!}O6}ffE=vIInzf;y=eUZk`Q4nd2D3s7%5P@}&1mT8 z%cm(VDSw^sbN+4VjJ00Ghj>89pCykb)iIxL_HIG0nD*DEALSh$K?D%GMk#Yf1}CH^ z9QKpt_Ch%-Hho9$7MF)^1|sU?%4U<)m_EoJ>b@2*uT&Dz#=Y2qH_(>^(N5$i*^!() zS;0OcyvCE53=Qn1cJ)ZeUti$(3bCCAe%#Ne)fDF?P3PY$#R&9#(Vb*Mj(c2yn)!GO z-lX zg(ReI?{0A4#aupQ3Z-H1Y5C`oCxpSC=usyCL-4b~cTZ$|=W^zNSD2Jvx z3`*@qUHhi^Lb)A_6&6Y-rEG{uPz$Uc6*i^=4C*ce-n6IoS5uSt8lqI5g)iSD3Fl=` zwX6Jf^Sh4geIn=7e|9nIJDalJy?WJm4XsstXyc>A)8i=UP!og!q-O&goN!!5-kx>; zRHXXBcs>l^`NYvYJ%-1MF_yAsPO}D;V8-j7V$@t`#fWM7hUx-##NqCy_Ml@+sPNic z|I*y{+lgLm02d7;qertX?t|knF<=kgCA`TB1L;|6{cXyb zlx)(UT5#YH?S=mQZ~|AVgd%?{Ek5ma^9h-4CP3&!cvDLh86GgsU0ro*Q?}3Auw=;k z_;Eh8YaH>xiI+S|9^dyZd9;AnGpIntvL>4eq8b!ttKuIu(DV+Mk#{)Iq5kFDxE=cv zrTL)q=1Ks`IL<}L^8){lE+^CqaK#`-Ni7Gb^_nyLWU$p~)=Z3kgl(V>x^#A+?Kleo ztfk;XH)d@(eu{Ja-#`BNF2_5A2tN>$hn1_*7&rj>j*Dq;E^>j`!4z`i>40ba)D?_f zum+TZEi_nut23>l%E4AgHmq2rs@vF|-R#BOfw&|fx5B!t{k z3-j5Z#8EcoM)Z1EdEf-L9kyyx?Pm=>+?WV4MXy<0Bj62f;Q{|cEH@ZN5tO8|5m%7M&<}i{-l&UlWlsG_`K(T zU@1_yFJ?LZz{P7&OgxJV*`IQSGZ7R126!;gYLrQ|_8f)VSikPn zSF9u71LulJn|8|y0cLeeXe$EM>8R`%{hc0b*7Q?^bjczsiKlk-g_vYO(iqAp3{A!v z@QNHMOF~PWpcroyE;3X00|zIYfOPizwxDj=L{GW_g84PJflS~3(TJ%$Lq#b~AON-x zA*5@%)2WB{yZRhDAF+SOv902FQGm%BLyDIHuQ&_Mp%DoCX)t@aRZ7dt;UgBkBj8@g zbps@=pQ$*P!jq%8tymNSQ#j*kv2OUbu-RE3JYuJKOyqUV+^}lFx38D1sf3F+I$GP$ z8J7E5phNnVb-w>%Az(QTj$1YJN&Wu)nNRiy-=MV88XDZw@X^Q(A2#_jClXwFU+uq| z+9UL%Rb`$$4=%;vc}p&>%XpYF2b%mH5G1&wY>BmnZOg--epc|XlYQN$`ANG`BGil*1w1RqQ3zDNBvfJ zrTNvmD}RZ+9e6u=$F5QBD}R!|#5Ve$4QAEw*WiT$x+!8zhPN&i734RiA&&dK4d&k! z@0-8j!*8sT^Sjq;`u{!M^?%Hr{O9%mx1(e)bw2mcPQ>pnM=D^G52^%y^uO99_)oOY zpCtFLViSb#3fi?~avhzU7~KB;XP#u0Sf^08H3f(Wog$kT z0x?4qX3|)j>)L-=m~s&sZQJ|w?A|>ZqZbGtrbzeFw>O7!SkuxS1t!M zErot7(V#?xd8K2Zpn8798D<5lPy}<^|FncmP2&Yc*S=}Nk{>}k5%gngZ2P!)z&L42 zpFVy1ZQ1$KtX6A1ce8gDc?7yEr~{x_-R*vu$%DWA@(r}1u9w|xcJ?R?$r@C75jF^V zs%%_Io*{!t`wJjxaXruOPXoLgg$b8eQSvlO;)#3S02fCJ!x2OzkNwpj)hq*;Cv`C+ zv%fiYoBEIZ4{i_QmFptOs-3FN!N~cys8AiGh#+AZS+`5&ci&sj^rglh)4_NC*1qLQ z02vNL&5jgq@t3OAr5`bASR-{o2vo*W`r~okZLe~%0|+`@mrsC-q%0VOd^*8Sw3i+O zD+x1Ij82%51ph-g0VN9&*}F)1FE9%eewOUj#GBa%)~cvyELAXgx?grb!%<3 ze`6c`QKWwh{R@1K(ud)2qkA?&aVMjrTD5{H`p32z$?Zd>k#O!V?1vlAN$`_63PfWA zg}eC(xz|Uep4VTT)cV-HyD=BuF8Qd0|L8ZuhgDqyZmHwYq-;^Hgzek6Pwpl&FNWTZ zFx3bjzZeh|_r2JRf*@|Pb+zY{}7=GZq6y{^}dt7${_|=cAS2u6DYwp3jJmDE& zl@w+kdqM_q&lSFqG-kjXoZ=jQ*M? zaZ)xYcjx3#{4eDsxEVZ#e3~D$Fxtwj>Db>Ioja6xsrl!kb29E&ublmD%VBCqX)Akp z2$iuclr|gc(eP2hW3(lszUf}X{IS+G0o*|I&2^Pb+K{!I=uhZ$hWOoC>+OA4ghKjW z+lu?qjtOhF{)Zoa&>Sy)Fxx}JXD9{t11+{3k*rFYM~q`bq#QYU;<9p5fEe%X@P1o= z$|`4O85#K~|F?iLZs1?L}q>voF^e1Wz*8 z;tq@11CQlT81RfWp9ZJZ+&PC$jrZpoIJ2q|#=|;OaYvyqI|{CCDCLe`xHd0Er#%nn z=-^J5QGf)9M+2WRz@q`=RvnxK6h!Ua1H5Wr$y@$9vyXiB3>v70_VO;}MJFh8@;Fu2 zhwk`>)1&=$A!62C&pyqZetP#}>ppxI zQ==9N2xg5)Jx;9%N!CMi&q%K|2+U}^XwgY|VzYNec&pT#ku*bbnInK%v}Twa@ROj?=+CM#nB zC@xY2zEjyw5XW5ds(|8(0i&cc`~OZl(fDJkUnFXSE&#<(^LJmcAdw1Ia!f(1)D&XE zXyUdCZwz0L99W3jUWT)T(E^SrJ$pG8YaEB(jJ;DbDo9H4U}$XFgdT#lEdi!8yjKnA zWzWWuZqEPXx4%+EO*92#!Sbu?c#fO+irGG*z6;qEKbG@ntMjhcFqyTcL|T=ND?6zN zQxAAK1so{ZID*j09=0c)Wz`#^7g?}NhhqmO)y_hzCQUNEXibjSVL<~!wW9(GxXzK< zpR+`b8bBbU7B$axLj>sxc^?Ec_U_gxY%#HnHDV75SdzRz&ofEr#N(X$#o3yRsLIYD zkCu%2yFT7OaC0!kDd`7oDU1^^^6Qw_1?wDH6H9?ghw>1jJ9R##lq2R;blkv5gxWYH z0aNc*Kfxp`=KLMyWe>{@MzNjgzwP^K!lJ(N*`?l{pZ910`GgS+u7i`$R}j8{^|C2Y zIZ<~A8f1mi)mvPF9(}?ZfdWJ+6*Rvv%T8ww>rahe4vf7r8qtW`T8y}-s}%|lW@<90 zNlS_c{DZstZjW}GH_z(j-`_>2UwnW4s9%-A{n*S(ibBf>|5NhZ38u#ue?xAuMsW;<1y#!@W zde;f}$jlCLnE`z~nYhCvOoSsPpL=mzG2PCJpq}1XtE;O8#Uvdf-&$K9d!pI9>HLJ| z?e?elqWi_qUw{49=Umx_4M*>lcYB-M$#kc`@guX(`dLr^*v@fd+W{Ll#Mb)a z+=>;Azps_|{q7ZeR!sQjvsxQl4siTzW7>==ADI8VuwV0UQu51wh%9qT9y++`2l>l( zMrLl^mc00U$NZcLx0dDha<^&HqzMRwd^N&rxN$Z1J=@!JaCrdjw{|LkBy2kGvaBpLA#RIfNZB#n+a^*zZOi0>&(QCefaS@P$k(0h;EX{)dhpKcyK z!T4v}b7YAD7WwJ38ueQA-LtNYULw2nE_OSb;W2;iT=`pT%AgJ=_KlJr4kisC2@RgH zG|;kLo=eWx6`ZUpRcxzLP!8@Z4h-=96pL-@#{+jgoZ9>WIe^+_^5NE~V7srilZ6aE zIKOLH?PkGk53RgG+c?MnAz}m5<42Eb`I?LXSMUVM`vtq6#sB)D0TRw_06ff{L6WaNBi~f z{{>NptXi~7wPY|TVsVBiR%SxKtX;1!zkt}b8LI+W z6ooq9dI$cbjq>iyAxa5#)T#=oK|duR1jIJe{*nTc*t>9YzH$5AXS1;}~6Vklrnv)Uv)!3y;jGY_7?JI{6{|ddxk%K;K)|h;KNA6jerpd67 zaeV2ulQKIQzqNdZe~kaPZqNkGI^<+$w<5LBBj8z$MtLj)u%X*5%tmymd{RPLK4{#~ zr(y3k`JV@Y6iOcaB$xb53Tvgs0;Aq=nySWA(gMeLjLA*SH||bE4K@785|zs{Tk~h; z`NY@u7o!S(v`l!^Oq4|yOorY|3Iu53p+^Z4o013b2; zz}!hJv#?u#9rDqjL4(xzfGD9;Uz=N$XHqn_4^)Qe*0- z=H-xPvU3inGM&L`Oj@*I?**`aQKuyN*j08?XB)7f3K07z%;!l$4VmsWhq4p-*+JM! z6X`+!_@E2$sP_iMR?Bn<$h?b;{mQ=cV3_{p?61|36Z;F*w)dIqF@JtMN!YAM^oEn@ z-b=!0Kw|e?tfKsJH-4(8hiX1}-8M}8%6T0V(wO+a;$;0MvpEjHscb*s| z-4UxqdAHG)PR}uRix;f|^^rIM668i*OjGFIj?AsY)i{T^c!)Q95DsLQ!a5etM+$Z} z>HjxW3B$wvb zIwzVV^hY&`RB?)KMDIe&L6r~Glu1mMPUfZpaVigH0*XZO@!pdn=_PRj z-=WM2%LpaOqIw1&$s=mL% zDqQftBFF##T*$w=AI!gG9{x|{xJvYiibq@Jce7us_j`ZCRT}@78~IPazmo0x{?GrT zi~Zf~C_tK6asVUNk(P=Fl%;)@Sk+~)yvi7oebkwK_msZULArlf1Av2$Mz_~v_g<=7 zd4Jz58moB1XTKGwMVYWaxe&h8L2mgv z#s6QH@DCUn^hLGUa{bruU!HZ3e8^7l%vguxTX<=T?fVp{k-WwMi9?{c9RH&KMMY}dcQg~6Bc{O2}!Ghwb(o>g_R%2 z&lrrH5y$)(Gcw#%Kss=BahJeTZ7nP;`g*Bgs%$tebQEj`l!Sw0fByC)?uVy3yAx)*JZ841%#{i+fPL* z`h)*bmbD1RAg+r{hg|~qtGy3^aQw!Jf|4QExKS5e|Ja{?dtt6W;ny~!M{DUD?QCw7 zRhQxR)8P?nEYIHAlnY9RG%Vxs+vmm`bw`Ig+6hxRU-qKsO(wS=JU6Mf&^Qh`S#Mf9 zZ~^k;aX2RKy?%-fa6N0&@!O{dRqmULG;MHARI#xq5_d>*N1rVuZIN)7CEXLHLD#gaYse2O;BygY&n|M4 zRFvZWXwH}blxOmxd>V0i8i#!;#3pgq;N=Ms2JE{-OJwGi2%5uBqJ0^XSF{;3Em;@} zKSz5qctL&IJQ^INc@-kj@h)YrpyGo6BD-R_kb&t{j0HxY$jLvFpAVZnBRnnd%t+>mx)T1C}yEnDD>*N#G0hxzK4_r^BM(lvwQn!~l2T1y z(ptcjmHayT;lqcv#XQu5-+I?jhSqk%*%rXlq08!lWCAT3TCC!n5c_^RJYaIpU|EKSbLwEXkw*N-b=Wd&W9?8 zv>W1m>YqDhjLt<5RYL%9eaLR<^8A5sT<$#iXY8ba>OpJYvQ;>fSHfO&G_jwuO-XgaVPnPjpiG!Qvp) zD_7%wV*M@M>*RNGKegC0(68OZ^B+#kl!q6swFF#ZmB`S*F`+O5 z&SSP-+_Yv>Ouwb3rndZ9rq->fb5uZ!A_jgNQ}R4~{L&}hlMa6hduYmyt#_w>b@0`u zV>W^5TXu9lTHG+d^UY%8ywc^ilauZ_TZE98$mK-C&SVw_V|*8+*+STH4k_Di+ni+G_?0>jrhRf{3g#iml8(1bWsJPx@|paWZ8LUS z6`7`G%A83Eeu%C0**N9mn%w#zzP_<+3! z)}=#+H!}bA?%ffBHh7cs;oA!)0Dj+8u;{gosE^?7Bio!mX_&U&HncqWkQ+r;C!9u9 z(@I^eZ3G#_QF+zg^`ui^XA&)_g?H;beb1>QugtDwiTwWL$)7pRs%$(ehCE1#h7V8iQT;U5A8)Ip3wEnp7v%ETsGIkDEe`S6(Ejfc4%=>QX#O#D7id(c=a<*v> z-NmSYoHe2CaOn{fllVQ71@=XQ2D3sWQxdD6C4~!7i@SM!7SE#i(~vjeU4D%a(~-eW zGL@~5p&K#H*U-6Ie<={Dx(siYSC|JWav^0wp*p+s7U{jIeSIJ0nI+~=2=aT{CuGJB zU=Wq?is;g@qHqm`o@PHwl_!XiOj>wsqH>YRI4zd3tsZ{-?1_~Tww)yYG8m7;tQdbu_A(1H@U`CzDL6eg?L0bvNnLYSsJ<(rAqUU*Rho z=-f2L?;Bc=C@9!b4JL^hq^%Qvfm(d$f%B@>yLan0U0u_nB71(4W_s@AM3azZHC|dx4w~AK<>7X0mA)~3kpz9YE&Ic zV~eRb4k&j})0GG#18mV!EiEmTlGshIG#>pW#^=K(D>?xoI$%IxRF{|SjS%!8I4_%` zFL*?xajRy>sTnGB93fTUbqdH*ELE#xVJIyn`;ur-M?Fce3%k+(YVRdWmZ-!LD_V3m zIvy>1^l+r76>0cO%@oq5W3r5t!z&w4M~L|SQpbZlCE)TDurfKa3%(>kjN{e1qpwoP zJ%tis{Tq0hKf{1tFOQ**Up&7T(O>O8p66q1$IIUqUnqsn7oKvVC}oD!@Int?y_~|u z4P_GX9Z9y;rCPMqn0Gd*g;^=t-B&;=LS7AuMqPZmZ4O?sqKfL{c48bn;S< zK3@dcL^Ka27eKYjs@iyPiNo1O^&2!$>MqK5CAW{ve%7sF>khZO*uDUtPql=lwF27! zM4VppHu<64F!?Pbo;Alq=xy&%az!15x7WpkFUVbFQ!*uUG=-0#c%FBvYo^muFGD=3 zT^pyH2o50pr1$nEL$}pfC+1OuO$)yi_6jPcjJ?LW{_V~$7O2a5nRzR09j^Pp(x}O% zEG(XE6}IWrA+{rLf266@#=G+}TX83_I@-yE3uFz)Qm@EAL`5WV{s}{UfpzYMWkz^~%_DgJj#;2WSc|TLs@~fwvi~rhqmf`WjE<}I{(`}l6^nu|%p;)9O z#G=Vl7iO;gsj{+<##wZQ-;syOJ8WCkuCgeQruiPoQ+*=Gv(_jDLr4Ae^vR!lZltcQ zarMFgh}oJ?7!x$x6Gi8h&nwgMMVmNc{yaRF^O`ZiMcbb1W&Zo!v%MzxE%qGosN}>w z&^v6uT5|y5H+AVn^0xPBpeR%mrb|WzfhhzA*5%Yg+&6VcNyoBQD9o&WEIR!D`!9=) z3vb{H5>wv4b@trKk2(8Yw;w*MQswMt6@Q_>{`ik-{i@jhwrraF;PCG%e~7;X_vY)~ z|M|bbdOClJeArZ^uVY2_292GSg?zQb@(Zat%g}oEwRS%~z7@K77zEv> zqeqVpJxvNagY?}LOiPsrTv}dr9%#M-52?lo_kx_Be4_AV@Xg5gHX?ojrrcBke|fwj=lm}E7xkyQVL zCaEB&;Fe=ds%#f-EG21N05SGc4DM~u&JqcLvuhvsnoibR0iYsphwWl+^eQ0zfX;N6 z@-wGd{n_v#;cO^H1w&nEa)N7kf(Gi$uI5F1j4#dtE<3=~y#sU*LYu}hfjwqVjkDPx zpID$P`$Ec3Tk6UJoCDvqs1M2;=W?g^Vl+xy&uAnj~&sr=M;Un2*6A#%%4EsiPlU7)oiR0*HYQzc%Z8 zlGc;b2|5@OEDimBE(nsp<=dee1p^#IPL}?H&lBTEe(mB=P>_%QzD(xDzyLCl$*dI~ zt~7~mpt66!j>#u(`Z_JuK!6HNgmAnjzh@i)cMyO4E`Ap0qjpi;E%AtuQs40Vxl_(W(e5zn#* zd^cyEjid^NBwqU`e_OdLCfFN3`iC=;r#Mmr^>9hM#w3uN*l^{ex#XD(W>Vo~Gv5i- z^+tev3f-Kd3vl`Q*BW#Vg`dMlUR3bzT#k)=s%Hi_y^^7>^vVo+VxpMw0KX+OS8%&LL398su=Do5v0K+=bWGrmNYM^<>PeKn+F{^R4{ zt%+Y^ZdCa$h|67NaN@b&o>{M9!`USzCAC>%9YF@dvM9iv23t_?O)*c!`*8%Z=c2Pk z9aC#2*jm*gkVHJYz;~~r3Gc=O2x3@)e-W+ZE5M!8Yp>RVX)wIDD;I&g1zSaK^ zwqPqx>zYU;sYie9$Z2~X(RwwQQn<*3gK4iZHL*FG(W^;PmueS(^7iha89m*|X;Vn& z>QSb2A`z?BsL`%kyOO9fVm3OzhK}Zcl)SH=X&s@hjxNJchhTdozMS3?j|S$O|527g zI>=yW3+HR!b?iza8+B?n^};6jZ%(*VtpY&U`v$0Z3f@|mHaasUD6WK}`x6jyYcGJl zbxJE?=&g8h!8rs*T!YsK?jrr|!K%kyg!kg>2>d1SiU~ zfo$xsL}+(E`X85nrDwU71pvzzxwUt7f}Pgi6akwm^dZw& zKq@r@+P`=j;J{YgQt$4y{;I#pjTpVi$-0GmdBrMfJf+RJQ*D1eZ1Kg6x>H&v4$0p5 zfuaAqZqsKz>_!TTlznWK2S=OUz`GU%VmMi5Jm&lIRAa4ZpppC)c?d&=SUovM<$p%{ zdQm2E^QvCGy1;gwYr>RemO*_MerQ_lRp4?5i4_N!B`Q-4Xe9~ZW4qEPKESG$Fjp=G zDvu?VrCtez48}Z)=zU@zKcnvH&x7EgNduKR|IPr zK5#SycW!Lh_4%potM$jv=PpdDQG2bvfDAO9GfSAWid|Wfn+WlLkpT@m`>xDo$wQ4M zJi3B|Z!hk5sEtt-I3d@pciJ(3_>AHQaz2ejWCx!3@mgc{Q)?19A?b z&R`MrmhRiyQ+>oNw@%Fb6!3W@Sa}c;jx{d7#0KbS6*Vd2R2c<4Sjhs^@hpZ4%@}oH zMa_ywX<#p*JrQ5^uzpX}_@23EgLoQ_8SUwVsE|-KDLjs{E}|fh>TL!nGv{DL&QHCO zENNCNYcRRj*PXxq`nRL`V604%u#*;=PY(wVNPTf?sqk59#CDLy?LurXyH>L~1MOVA z5Pnb|q#{SXz;cwvf_#tM&d(v)QZpIDM~#}Qc%Qd+s1GdaA`RkJ5TFlY_N=x8FEte6 zgMV?KQ*rsx9V{gykc!^(4G|s!hbP{8dGF3f=dg(v(q^mE&;*pK6Lw zQ{r-$p0%h@r!QKvq%IoG6D@6SRqtmU$U+E9I|CK=BF9k+uxz_Bw5)Ya>sTfC#x)Ib z58OE8;n~G;b3Hsdqlyk&FrHKD_H=OZ2W4hv8HFs=RfeFcH_OYHyHmhMXU)L`NbZ^b z7uba}fmQ0T{yXAePmGy@Emm#19#>d7ZJx8_=1{;TZgh^C^Dr&zbjHs8Bt;f%rzv*R z(mFSfF2Sz1^%LNg&Q$$V23t^@PB|8u2lTs&Az~xMI6W`C3BgHSAf$+vdH@kHPh%ct zJn(QkN6Tk60-&pPGKGBgx|vq}H}FA%I*Q$dk3RkMgdd<|>NQ9qJ9>U(RtJaZ<9;Nm z^;qof4Ru)H5q`URF1+>fO2@SaLsnGn!YUhqV>t?MctydR^h->JX5waOAgn zQdFvk*d)3(-Kfv&)tgcKO8WRn@lP&oywhN1-um?DuPT?i3=oc#)EQ~0fFo^bgS)Cwvo z(Kvg5_Y8^_G2C4st~-Ft(0s_Vq5EhnQv!|r_(ji(g))bF2aBAoVnH}x+4eV*3Iko z&(9Uyp*b3y==ReLr)hT3S`uBW0H`iy{VSo)05`5DFs@qS|6rpD^rD$~I;!-V?^-%J z`ECoNihaef304)|G%A%`Y0SuPXyq!*FDf=QNwb7+{dnh4I5=$hHYefRqlF4DB zh$8i8i(2o*BJAe5H^EeP$$r~%qfch(00T{nY3f#$DK6w@GS}2}b8ZEN(rykahZhOW z>0e&W$O}L-CJV7bp!EZ+v#it;hwZ$`antKxjHB9Z4TOHiCqAlpu|+F}i4JwZH^5+I zX%G3c(5%d9-EETXTBuyaqo672xZ^p*s)o~czIuDS>p(Jc#*Y|U_ALp!-EUm^`{q{_ z^R-N9_@1D2h^vEXE6*i4Ln85;9RfM`glOoTcO(1%|`C%vm@Yk zs`WYq1Ej5EH*fR(&?azkQ788r?IeKFhM+bLdXTQ$C(r#0OcMhW4_3 zoj&Y9W`|50i`(9>Zd}+;9dXt3_yb=r!_*0T%WXcRN7$F6VI#+r)c4k2bR^7rTYBD^ z@co^$i9m0Wp65uOq7xDlT6QmSKI`V48#v_Yn=HDU6pk}EzvQc{W*JF|CcetFkmc#O z+p>ZkNY0FUJ%S=({M|Cs&%eVAz!{-&tSJ?6`O9)y(J5XLSv6%}7tL$wO@D zo&9#hoSe#Ib;3BR)LIs#rqcI=xGEb;AX${GZu#rH)n<3+Lk*|y*;V4ahfyB`ffB5a zjcJbZ1clpgFHcOWy`5Cma5-S`0j#rwuNp6qM~q$I+4~uEHUHq<1>KBzBJ>)%wS8ai zJkqKQ@y3<8igeua+n5te&5S&rBimCmduL{hpDrRRJOZb}+A-Rm?7Z7UK5I5bkFsc6 zP0{)zt^TAGaE~ErZfD{^2-^yoUN5~9!TmG?i`;GL@+lHvX z#7XNQz^J^_1@{w?r{$MS@Vs#*6@8EI7d9+U4S^CHka3C;epJ!~=4PRDqD$WnHK$5_ z`SPWSO)X3!=GNurP-Bu`IQi|$(dn<&4fPxLM>9ec-@44aw{db_Wmj%+ZyxcY9E4ZY z&kM4l54Ap%CQD!Cs~iWiLT)NU0SJx{m*%fmKSk4+OpkMO+mXJ?Qib1?B8?|YQ#xu? z&#N)c7S9AW>F}U4Dr0*J9*s}k+-LdQMU4iG;Yi_zDkT4C@Zyip8msiGeKk>J*;)Hx z3y9JX;|bDoSlt1!q$H@7hJ*V>{&{-ptsSDU%1%Rs^u&`lGLKM6*~reC^-Q(>`hMnp zrmK;h+~rhNcS!;(^^(QF6uS$q=%S2amny=O+s+9SCdemZzR>@`> zP&Au_N3?Vcs0|v-`2hj`ocfc5QO#22r-f_i3g~A&<>}iOU-l(j<(Uc;c(U5xKVS3wZ2j#-`>N~(9rkbQNnl~3-ER0rw? zLNz|dd$lZm+Ek|4x7WQ{e2umxIe}AT|C`PhE|0HmvOm*z@6}9mY3tybc)f6Rpbtp$T zgze1~5dvmchgp1X;_?!IKHxik`!#LDg6KuU~$|0mPVR-acmT` z=-B~6uwOi(;7N%ugGWWCrFqpdE2#wjT$7LPeejn2xlNL%BU@j-B%q}CDyZB%3gP%e z$4eXL0D1&)BFJBwBzk&JPzIsYP#&W2zIP|F`N3^h(mG{nY$F@-nG#-{FL{IlXZ$@r zIwsxeCafn_;>tWVft|-MA%SM6n8L1n`LOd1kBqXonX;l8{`2?Lko!QM2$~?)W3Nol z-Eph=tI|@m_XE55RC@zjO?uv3WrUJJx`!&5!6oEwmt`51G>EE3PB7w3ixemRhJ1;M zXxdH4jMh7wz0Y8REh~xBjXn6(K_r7d`4J(5x07jKbGAq}7$uQX^a2dHOJW+^qDQbF z0NcGC&0hiN%aTeaQp0vxwgGPIwC2UbUw2%4@{Vg=B{*zAlkA%Ji`L%0u+i}RVZ@8> z1OD>+V(V+UGbxl-I4g*WA`gObjj#r4q07a>s13w$na+my|MuTYV5o}^#%pa!1k&#` zvk44?WEo0TX{h?1u-6H+{TmBm{Ok;w5rkhK+RXR-o1(D+gN%=!pbPsMOk+$#b60y9 zuR{ZSbzi@y@~B*KiH<^W)4ZMGtAkrnJ&4V&btrIzg+7WfTJgd`3mjLkuJsaAr~|xB z$VJC=-(Y`s*rjp8J#zo+yM6on-rwrb2mJlVU-TFL^lG$&uW0x2tDQHS9Q(fVn)&w| zi@5BHpV0sPw*>J2rp>lh!{mC%jm0F+$cnK8RO_qOYsez0*AU%tMOV1ngBwLoX#yB|j8-1$wsc(w$q3RyVTah?QnwBMP+iZ^vA4 zqgMKf-w@~;a9Wu&;G(2JQl=6MB(tKYQ|#{3s;zm4Omrh#K$KA`#MN5Y`Uz9K`(tmU zc2iDbIksP7WRfS%IdLAqMBfc@J8;@oy*>VXhfiX=byU??%8+o(bX;9>A2TBUSp%Dl zFPg#{kXIOiJAJ0`=Su#N)k_Z`X_zhh>F5|v`NW%Q$tS+s~q zVlJ`XoQKClCPKN@_i$OQgc&abw3Y$|#AS2cKi==i9kD&C{B8t&NusKJo~Taf=Agby z31uTYJu9+sfXpfCJ+#WF6huj|;A93n%EyV|R?0#5`1jv;g8>~x{VQ_?$woLH#0*!z zX0Mm)p>5>w+UNiUy^CjT+xw(<9lFPal^J9}_B}s_-5UN5N}NH9E(Hb~d608RA0TRd zGyi}CO7Dd9O6Ac;OU%&zei@<;tH-6m-#$Amzs@DEpI##mlH)~1B`^BXdMA=dQ?RUB zNTrYaRfQKtULvv-HNnWv` zdAAg*Y;;_7sl@~G9?(_*HbSMET72tE;j~zWZvD5jEANd}gZSH1c_3^~qONYiobqg-HDcQzD z?~6nZOv#^ay3>ib(ZvDs?uA}IoQ*=~8sA63DqL+PVsVYR1u*eQZ|yBLEopOf!fkzYY$qpj-_h-iu1XeaUjJ)Sjtx|hX1nBIe*^# z`JE_RrzaE<699Edf(Mdy&q|BKz14}VX%z|E&x&@rfN)35e`b3oVz31@%$CR9ZLS@=sbVqxt5L*5?9nw^=l@9|01=p7HKfoEC=PE-e}aYVht$&raU(VhviXiJ&u?GSe| zqgRJ)|JY*Z$%#G9XN>0jCN+;%cXe+Vza@ZNA5MU%3liG_ABi@FINk}%ccVJ9c7S30 zXh)`;bH}^0YPd<__$uVjduJhM*YE!0FI64Si#Hlp8bhnj4Xt<(?X@mR>WY637UvO8 z@9A>)tF$kUo_l8c<$j}zm$>NdmxsnpE4JG=d1%m(%iCQVG+g04xFR9C^!F!Z=k`69 z2QKY>DpGBBDHKWNB`MX^J+iKN4Hjfwy3*6If5R8pp*PgghBH{J3frSg?yIfalBKdLlOL%W}R$RwXCB!rX@wP0}2n@zO$<5g~F^u(@Lh zbR-(5)m-}6*M^Q6jaS+J%b$-k;MkOyFV)OazmNTxfh>i3!7z1ux_(pqOw5FO%>8`@ zIMyDvHU8;D*H^j)sRXZk<-B);6h)*^B7lLks&Q4O?>d z@9k+WYfzm*R0>oycI;Dw5zOEYxK|V-myEF*F-W2c!rF?LXKI+ctUm6}Y|gNZr+vy_ z`6v%(n~A_hQ84@UhU6K=fmR4A?ur^l5>+)! zDY>$U^bsjvGyq@bAdP{*DjWtLghT-nb;_6mxZ}}y&yK#)wQ?&tDc`g-?sYc%a|l(` zI`@TZ0#h8Ek0a9RZ^}!VakvgB$v~dudXW8lQD+#ciLYaeAkLB6Y0QYNqup zisG!BJy+v#IP3mtkC=nI7$RTWv<|E@Wn5G6?z!&nku5tGivSgH5+rptb@fF$PRDY- zJ$fSh`q{rsr|e&Fbu)6_bb9kA{LB_sokY?gG&Hn`!`#A9XV=n~-g|QZv9tM1*9#CD*74+75^C}?%pw$T$7Up|SveDCco+q-%+TDfv1_X_k+`=~bPOy`12FGhM6uV38tAr;olN3U-$ ze+#36b8Cuu$K1v@Xi>X?rgXddhWQI)HxC*(ka;tY+Z$4M-c|&w^N_}LHHw~eS+Jhs zGrOGmB)!JNg|B_vRYZ+HUq}4#SxK=Kfnr#+b-RBvZw36PZSkN7{PBRJm7;MC#(=7- z^>Q6Sz`>h9QRv#gfQ-@UR(2Y^7x2c&mOR|;YOmPQ0_jlUp*5?t1!0TOtihQr`D}X+ zj&3nTFS2KTcW z4=jfbJ3jFP2tSeAvRACAV)VJa+xn-+H|U1XvK)DcW@48&AOW_}((^ky4aqqReEO-C zt#o47AL5z>k4=*}?}$$Q`*-KM_l!tq8*d(ZRsc)83$G_HYz=FoZimS$gRf>r3noON zU*Yo(1|~4**5XBuoEngjr;H4Y|BnqFws7*{HwE2SqD$XM$B{hFU=)!|Ze2u;rv#_t zo^O9=TVlx}{4!vSY|11Zkalw@t?oiUVqCYY4+Zpq<#Z+@pi!&Z z6D@MN0h6-#E6EumN|kqMKAk2={b`==58}Ls7ta7blo)J6yB{W;)_xX*N%6wP(IZN1p4hKAv*i-U! z0VRaQoGah?oO`_6ui&3g{?eg^wui>={^kSyl-xS#W0T45=J{P?++gfJ*c}p_vYL(o zD0PRt&l~qIrLn@_n{&{0NxF$C&)%DHj~u&3o;)9^E|tmC&1*~H^VHEK%yBZXCO2?_ zIVhi`G|mbye1f1Zcz3PL)2p=8qYfc@TfsrNOPej6TsV}YThTRP_BnQ%ZYg|^T~!~ z(hsU_KMP?ODk>|ZDnV1PX8CQqdw#r~-UElm7K6?$*>4^6EX_G~(y(9xo5Ch$!$G=g zSCVrnZf4e4`SFy7NgNFY1Zsx_(0KC^UhrBSYxE(FwRslE;0*0&qqe0p@7O-d5OVUyPK&Isjg1F{+erHC>mdBg1zMBo_ggHmDF? zC3uLeqwAvUwdKbon8UC6qG>M2<2CnP`8wE$0>Y5#U}^Q~6FAcCF*PxiWwx?3?~uO) zS~ecr-%>W&lDX%k?cxL%Wv~#0k`_l#W4hJ|&-!N$F{!Qi^x^CojeeIVsmt@*$YQ9e z9B=(2hO?TarVYatWHV#ZYzNuB*uI`o)Y?2^pLxXWJnuP6jj!sP4Pb-8==%Jb3=B(# zKg+BBE6#>v77W>*8UWrufWV?zz4(zjpQ$R_UK31FA~gCykvF6`l|~_Y%j46bl32P&Ee-RKL@KqDqqG( z^)pg%ZZ04!N!lcaEDvN96f$ADZ+4TMi$$`TW|oGr64lr;tpI5_GnZtPX)ZgG ze(fOvCQ=P?wY2gMEH8iS`tbZYJ5Lf1X>z26BO%>KPW+4{nt~G*NFgz+85u;IWjlKI=m8Qx<(=7HP8eyQm;(fetmMf329ef2Uel*ZzMw5h za%g0&D{d_o^5D|)2dliFfbeiv2Pw>m?{`@ewHh=C=Re5T~B zL&;3w0-L1zvax)1Y3hxl#2g3P$wNoFK6q5~VM&cL`h2i*92d;|+u#0{(!1>T>!-un zIRUpPf$xilDUqhrAAbZ5Y>PFt zeRta9eyh2f*^R3hA!@HJp4ka{0d4DSa#)>PBoEI69~8r-kW?FPmHo86w8Fig=Hy6R zV7=sZiz`A?@YdvU`xTVT`~{(wICa+%>nD_9`n?}HAXPz3*8TQIF|Hxn$zdwSVY>L( z)UawHSjS4XWU*~X7q0-VEB4RPUa@(as}RR6YD96&ts^Cuu3X6iQy1@o{M?U({mk=6 z^-i2>%PUgmbkh^ouVT0;J#Z-Pr=2oeC=7=lf`&-H#IlJ@OWsAAH_nxv=oM>gm3EfO z!j8omapr~1-*I`HR9kM%Yu3p;LGC$nz%0sfz(4aEU$74mzj`P9+cvr0x8r7HJbhYw zT9}RXwe41UkSr6QFMi+~8`)=2^r<3BB26fP{~aUt)mu8GrzvNsrR8=Juq2WVE0YP3 z1zlXU^HCS4^X+8IEL!j4aL%RF`!$8@U@J|2;%wKD{deTZk#6Z&dc^{g5s7Yn=vCEh z)#7#Uhiqof8F6jNnI{vMzWveQQog|>r1mE({QNdPOa|eD1lK?UI6G|l6DaB83lYxY0jUn#uYdk7lJXS$9Ahx#kiS={=X_wa;q=`dUtoCwD1 z=`o}cUNHOGz9BKEip6UTJ)oLr0FQb`D-bnkWJj0RsIPc`kb^6hN4a z4EuTd$V5^`VaCe5$obctm}PbAeG;-oE+vaT)|o)O{^`U`FsOpVHlIO+7)EYq&+tUw z%_XYXq{0NU9kV$Tt5z0hJX93l`@=`xr$j2GS1Xnv^qYP0y($}JB@3A$TBThCTk!z+ z-GXeG&$ivSZ;1ooISdkKWs-!H-;N=n(Fp@&0M#=7D~o>$)rli6CNRVW$#qbapyRWE>%t!8{J+13JU@hRKM`UTt)vhEd>KXzEecq+#W%g)gy3@5&a^6>o^D7q3(W$Mg*!dw1x zn-@jxFm=z7qLb~IjUJu!p-)fxH-G~p=s_uP;TLn}Ov`qNp{Vl2cIo25r!RpfI?`}u zG zVv#edGUb@ij~3tW6Wdb!iw?dF9Tac$TFXB=1D(hnME1Idsy_9*@8JbZWVIa6YEFHo zu4}@6n?|AY@*Nf_%5^v1heCscLwUk=Y|udYZ%*Xo-camV z8LKAL*RwD?4y?xE{_E@qu;rWb21HFe#l1<+!2W0nLHNsd6T;YH74k6LiJy2$y@l2z z4CdegrlzRmR<6ajAEad>%VMekSNC%u2jYHWu#BGosF=*44 z)}Szw=P$m=PCIu-^!cu7i!=~MeIfOwIO?*&Ob{lF-Qj+euFN?Gt#Lw(fX@KJdYI$G zMLja$g9_hQUf_wSMzDP3D8-7AJFgVwv}iOh=Bux^bUW;Or*_SHw^_655NMzaHLuz@ zEK5;+8Ok{d$A<+qSAr6|-ai>ZZFE3IHRrqAmB4!^)kl=+G3WXSiUXNzQj2A=4`qqX zPjB7*;m^^|OQya*QEpd+5^vowa6;7BBoJ`x@9$9fNi(8>b=;mSHH5k+XryIR=V&&Y zZV=-N8v>HZZj|c8U&I;GGB29D0@ELSI0@1xqIy^3IxsOv6Psh9k?$9w$thz0}?V)PF8m+*h2%V$R55i1k-LwjthzC=|u ztIo=l28<=jlPXHmwnDH5hm0_uFO$hn;)TEUF^|=TN=d9!O=_jdX&?QIbO~T*<#Ffe z`swXm$4g$`N6VL&cgt*Up0Bi0QCd3*o0ge}oPGf^sk9qS_!V2mP)&(ubH;-$ z6IGguzy{<#sotEkKa(=VBquun*&j(>k4Nkyuj*EFW!KsFHNW=>-DOHGF?3c< zB2pTU_L}DoGVi}~he0f6!tf|;+%?vakJKb3Ij{=bCQPN|Y_uM{&U<|(!AHVFf_(v$ zi+k&Gg%g_-@g7!;mZOT2Eha&9%EH;Ejy5DFqgY;o@dc<*$Q%uuMw=mUaqo`q<^RQg z-%Y7v#P6ekQbUw)F@r5B?GN)OWnr9p;@tQJ zJPdnCJ)3dX513~>O^4~h`M@D*+f-he=HuDW?dn3R4`VFuTLmz*t|Y&Rj{IzwWILT1 zFew`*#GwVC!ZS2{3|Jn_c=J>3H&&UMdEaSGwyP^hS!>Hmso__Dh}F2*^alqi#7aJ|uv$i56 zKlyyGX+EQNcx4^z9`(YMY{wK9^!j`+I%JzPh;a-T`%~n27>zY+4I-sfo0Ha0dt--Y zT^iLN;ge_2TsGHVN6B?$ z(nZ@giM&MxF;x(IXR>rnwKAL9nVF*&-syJ4pLBDAA~;Om#T4Y} zJA#5Q>1^jzl&a07DoVDQ)T%P-#u(f1o|E#6weFtH~1x${*Diu1q(GPUFE z;*%FeDG4nTi1SIpv}94Tec9H!eBF}XDuE@KSFYi&;#}-n;_y>y98W>!I#RmNY>Omg zmk$zn1{Kr3h8Q`NWEPs-P57CS`5uJ{=1BGD37J!)$XZq{&8B2fEJNBPjgusT$Oh*C z6q-q~j0Je8H%|(&?JqLw1yEu$2c%c+dy#a4Yn1YY^}n3iI&WKcH{etG&z+{qEOvC1 zyT0=|$EuM~2AN(Cq9f^vJUEe)DBrhuhJL(+MFq(v41mg=kY>3C^h<(NM1L%#JU|-J zf$JRHHUgE4Bt2j#P> zD$#u2_pCXxmjtvpR-LepM=WmGK>EzIW9i0K<>^1SP7As|8PF_HFvLp z_&hlCBmjp5{~>HD{Yo)GN(sZ*KmF%uuTN1|`m@~2aP@(N9KmA_?6N_z*qlE}Y)>Hq&l59r&b2fX0+{~bNx zUq@esZ4$i$$Pg8-^QygvWF{vd;9!|&V%Fzx%kD$2j^g)~qpfGJ2>?7*g8ChYufK?x?Eg2KmGbkODDl)!tXDsVRnl%j{XN za{gUx=~R2q1V6*7w)C<7F-TLd-xQ%5q~|hj{rTlfJhYP%f7?CCJ#9a1_%KEg$o*5k zWZ9a{2Ys8{*5tf?ETqxDBczatfsR-V)24jae<9Wa$h1UbwKF@0To|S0-WKn2vlcDk zygfj?V*5bpu0v5ngwPo-xK+O2zkcRmgmrSMqz}R8%dit#z$M(j`8ObvOob4m+1L41 z<#S@uMA0!60~6(g9!aY}pKCZD?`)1-0#zl^C)D&0>(*cVs#B-Muihx9^jj=3YBVja z)0%+y;f|Km!$p9&`dnFTSj!XFhc<(CH4(iruG>Q@a`cNl0PQo3`ydH%m(0os=BWfq zb6z0aI>hBou{kCvVa|lj8S~H=9af?AG2qclYy#kYmvMs^C%g%E(oxEBDdUYO5spMh zN6S4#fl|&P>`+y^$;+epX2E3Vecri)OH@ypAML)+JK=D5r)BZ4f}NhOY*;%pc2?U4 zzW!;4b_$7!@u#lYqY{0I3EVy5^Lg=cDm}Kw)O+RI%Kt7b6x9G(SZ>5BlAzEXc_kVs zxu31C1DqdF&!Rszcm#-%=wZx|*2J@&Z1VY@M{L~JXYGbu_dXhUY=fE4u*??ZRfa~| z7H(DZCaT}$VT=i-_LfJCy6eFKJ|0(qna)vsC0JDc2)qZvyQ(-MC9z~Q#B^znywdb=31h1K?x}&d7t-6QD$B(UyYtuE& zTl3ZOi{aPr>IRz~zOX_)WY%9jI(!fuPwy-iBfgv^Qm#Nw5W2dQPcMP*620=M;=DI^ z>70YTF952(ptz7xIXs$ixZxq29|dkf(I)bGi4+~$xtzjSWJi+GBtR86ii{(W{RzwC z@N31A1xas|Y3~)#oEOB)&jvP!zLb6t{Q5M@awxcpOr!xOGOfKqv1kS#DQQ9YO#{)f z41rh`!#_8j%u5knu7nO#6Nrt2g)@Bi#dp{YH{tdZ?W$$o)l)q9JNQ3v9>%7)Mv+VQi6mB{|R%pAqsnmakXXv(-*m zl_yl@w#JFzOdGKgy9?`{ryp*1@|!PXCW17qyL$C%cTvCa)Yj{DLn?Q8#L6@e^IWC8Jna}5n_yc_4%B0+CWnG#9#vuDN*)Z`1503gG-!GxcC z5Q@^*hiLNaSX4%X70SFUprY0o-_E*ty7b3tm2y%f_FQZI$jAFoKL~ebJ$VYIgJShw z(KkjLHmE45Iww@`K=L)z1~~}juf@}`sd0zg&pY?c-kD{8XxLbHXSYjvh8BFkrfa4R zXqYkcsY96iGmaFMjeT{R)jjf_8T{!Ol_?pD$3;bw#3l9{&WnZjo!%ph@Cl=^RwxlB z1hlj~nZ_b5-q@A9l{uR#w|zmZWfV5I(|wK?DeJ_TB&m^S7ScnhD#%6*bF8NOp{+Y; zd_ca~B%8Giikv_5R)GXyTD|tvy1JkLxgj;V9Pj|r>GSJ5XK!2P6m6)9clb-(k!q6g#ZWJiS3y^d$wqj0hsl!yRThv=Z!MGAPM40 zS{*p59{KEUHgaiNN*k&7>g5@JIA z;%Ptp&S_o7aVhyedIi9M_nML3oH$`I%?mcytL4h_mJx)J5lQX+JmKv*zVMV+g#wJ> z%4@wOkmM|@qL4vcl#^etqH5usXx0)y0L>g=)O5)?myXZUr=;d#O2$=Nr1{9c>ZF3B zW%NS+!_|0}?`iO`_}zIve5_2GT)~j3M6v=8P%8izyvj@6JwK&wElhF0(AZ<%3$1Un z-%Z3V@u};-mjeXbywj4bEY3>gr%Z|efsF`Va2_a3{1i~XA&(kp<9H>e%KrmaO#}*N z1bwnkJn%4RYH8J@36exDBKt$mY+>`sWJe6E5}eObwH(m+G8d*m z|0(7ww$6#(?%VwJeZecs2~Ji%-l?m?Ctd>Ox2FF;anCC)`{1Rj#O`U1`N_+y`*u-# zJvb-2lTstnOf@u=^K}8w=kz5hfgHjDwzMe z>gQ)ETUIF+SV*NqD?32JK<~#kZg+2VD}CR_(Rx@LCaqok7tM5Hw1x~Ge9rU+cD3Bg z9luY!wd&l(ZX0hP#2ktaMKnj;Co)gyWO@CE=hiNupT*bh443g#yb`8N4eDcP8N8#+ zacQvztpt$WQdTkwn_DH0BisH#=~uL!sX4V%zDjl;lpC&6QgLJVyoxu5&%&P=>W;p< z>Rh+ccbyaB<8S=#u5dB@m~(mgpFMWpjFo>ndRNJguB)_9Bp>bES>r~xMvJT6GWUmN zmEPX3R_MH_?L{<4zin#MH1a3^7hQ4N-}|p8lWb^{N3?4vId1!0kGK9S58J!?j(V;6 zqvM#Fy-bz-QQHrlbnAcr@4DyyqiO9UILD9t&ki{;C4KzmVcV958KCz6>U;Pv-~nNw zUvBUrZ65Tk%T^zVQIYZr%lifq(+(^O*i{B4x*RJBqmW@euDkAX?pFP>&NVAU?JcoN z96NH`OQx2%N~sWFQ_d+Cn5_qdm6&^2PRY{^*fB|8FcvWPTe)X}k^&imGi>(Z3ClJg z;JOg8j0pK8PK&*K4t(c4YL%hg+ZN-ljJB`%$80mps6)d%csrRw$f2Sh0aRyTZd zzizdwEeS*B!rC8MefX-Ow)TE|5f_TbjpKRe00=)WLOD6$w9>iNx0I=GyxZ!n;?);t zUiCZ2dou&|6GNZ);e)Qp9VjcIS1LnR?b=md`>*_gLbc>p>yP* z08xSw(h9O}-@d(A-Nod-V33aXZu8QT*^O1Ld%1tiitoY-UKRdJ{9*Rp*SnsHT)U$G zkAIg*v?(gT?cF=K?DL;>vnldvSJm|{O~$28Xjp;e-^Yx6x(~E~kPC?SIxLYvM zmaPL(xr^n?LE3s|^Xk-GE^C=ad7cR!6TbX|_ah^a!N=bm_Tj#-OM=oSK&-TvnR8h<n`iMvMd+MIkn9M8x zCOBZWCU9jIccF~$6HL_or)3(=ACBw^q)oeg%u`XEqsW~Y5@&xwPTRI_ zT(1$tH3T*S+0e?59@1S$JA64a;20tRF^aH=P6Kgo(X(T%wz?PyY5`B(Ff`+hxdRZK<T4p(sKD8TD!Gv{R&`kHX_i7n@+YhG!<@F6Xb* zPB|K*-r`r$0;n&t<&RUic>W^sE**TT{2dfw8SMffXoPkZf}6!0%KIBS{K4ChQ3}My z_{r{o^0|O+YC>h_F0R|RUl#A3A`Pyla!`BKp;$=*DZ+lewH+;#m~$lenfgJd?Z9Ax zi)d5P9RZCEV0}ntkX-6#+>!Te=A$AoqewU;oT-4U!h|PbJI$s#-a(5&WDODX^LW!o z$S&uWzr5l0-xO&GzNbmytdxi-{^Q7k+DcTv{X{<~0x}Mm*48~HQm8-hTt3)*U>ixG zmr_%h0{;DB$m{&8Ix?|YhHgvq@yX{Mes^4Lg7%xjaS&y-F#q_ClmYaW(!>9!$vuet zYYvXZmC-tjs7*&f;o(*71D|P*I!VUM@IfpRUv3qJL>6E2n|q^3idCxFx}W#&E9>u)$dESfH%F7#xGxe;qw;>a-D*VmwS}#ljc~qx5GRr*64XaoecM6-I6kb*SDnBt0|{6N4WOHi_xOAc02;wW%n{ zClxU?YNF(Y6%?|b~5aV+1jOpxp>7flYF)@CSiJwL+{=%kr>r&{yW8~_n zlvl%aLeDNeyCL~<$1kU=NzA$JH$Th}X#o50;aN=vx_kB6A|^S;SW%H@5S;>Ju^8b< zme9srqOGHiIJ}<6a07dy?xlYlhJIa<2InaXUC{>v?k(kv3BD*&PZ=6X#KRtm`-PE| z=nzAYHc>!I9uIeG zIck-#DbvP`E!V;qCfq(!tIK8n=x?mz)1qul#WyQwCkqQwRtAttim~_xbs0HMgwQxe zjm)l4>eAVKn&SLwgJX%WohX|mu#pD^3mKWgFqIV|S%#e)O8a_miVQUseu_-i-`KX2 zfCC*a$eKveB$+{ovom5)6_vcQ?@84aM4Nzfo52&xG$y8Mgvb~gT1IKI1nIfgV>gG! zew!o!yKHX!!QAe&1KR8%LG%cr2!Sg@KB^;#o>xTrPpRvdGd?%6M%qyK+)EJkbcr+r#lIGBA;x(0pIO$Rsf>e9h^o$i+z! zt)VaFAMg4C@SJ!V!$#bS%n;PPhBUjS-?#T0qX{Um`0H5q0@tz+k)n z2Lcvd>^ypS?ZwEehOcce%c#(8+qR97$W^ zj||qLb*< z2PD2gd!BD!p;)xw_0-XXeloUt1&eE;WczjiG95T>T*ldy>qXlT7=3pJdg(~~rwLCBkAz6N#?qxF-gPdDTdyt&M>;M;Db>uI8@Th_Nr z7o)?Y);t2{kKLJH{3vxp!Hn*O<)|6;tD~G7!=8|%_U!JFdn+z)^7KS}J&+0ICfP;Q ztOo#hyF;dogYsSv_nZ16{hWIZP#+FSvAzbzIJmLqCWvJEIoa6bL|DFakt<<5(Hi}e zUF0CgVj6jvu5VSA15$P`YbW!=EC@gMsZB#tng>r!UDc)bgLgDw6n#$1s1KO_JP*Fq z3+w**_X*GG04@*3KXv6j)?=nv&5#TiiJXfzz0F*^p^PIEjki-WGCN}Z=;v)-tH_@! zMV{mn9>&E~&yFdl;1ToCLf6IBFYh6h6TLVR%_SWD%Mof-#LHZ9;mQE-rNrs$TF|#T zaBPQJSoOu)D_k&Fe{SW#@d0(tIpwj04d`zavk66l;PyeU0)p*kias^1Xw4?>(}=+G zM-f4y7g%#OGX9r#5X6cfXXr-TzU${?*VokOU5o46$<4|C=gu=# z3>3?TsFu!ZoTobS*JVHKtN3H^zRo!fBj=k~7NqYXQTjvSf%^xfuz@zuDV71w}xK5N7=`2UlF^>+37sh}>VGpL!@S!oSl&{wA(- zpN*&zy2f(ZuK)yHE^+=8CAAvgR_{D%vUzhL6Ul?B5+Uy-9?|C$@{ZcX@N{ekqnv;9VTuNiKq-eK10m^vi~>S;tMIjg7j7`rB+ zuWk1>3GQU3`SwoZDBIh4&LBXNtK#TGiB96cO6Q@Y6g4$9ba6*Jcj=%1 zL1A2!x22E3Hgqt9rpuPUV!#J0_L zHBVr+Jwmo<>=Ji7NP1g@m&CdS&$e`NFAv((j5{hC1aCeoFU5Aey z+vNG3^|+ns{#M9<-rh8liA2a*@@*HoH(ozvriI}m?Wt$5oqEVzozv<11`S1qE)(7j z{6r^4Bj5MOBbM&}P?3qF_r{7+ND`#t>Vv=?VQx!lKOHMV6D066XbNsCJuYOyB&mh4 zx6G7d9XYL-O{2|o3bc+saM@gKIL>8J&XnRirbqqFpSLQLU};1`RknZh4H2AG__fi* zkDtu>`!_jNJVlvkAY>~1MNCs!kmxuYV{DX{*>tLd28o+SvYBr;f@N79yyboTxQwM< zS^085Fl;~vyAj^Di>B7x>LPRO@*R7`v>y?UZEVXiXWatviS*5JFq{7(e@```ULs6l5OX@19-tgv0N* zYR&oa$Mbk!ZBxfrb|0TP&Hm-OJ=w~zt$nLB{W9}+O2)p^}Z# z96NR?cHbr9OA=?PhKA2Q*j+Jv70)|COQf%{OT9Md`HNL!qrgE#$%MtDj3u41>o1># z^=w0ZcI|EVFbE zQ2Pr$0P{M#HTzpEtBz0p(XEa#9h*7kl>tKgq5SAcbc1ch!&6w>h5ZCOI-yJ%YU}y#r_aa^%3w1QQRrFQZK)>s%-w-kNY^ zb2nT|mywWE*FlK3e|2-yr9p>T*zxL_LUQ|9Ok!_n)N+*%#Y>5EauYSKh!SzwNmVJ_ zkwT#W{1~4aN5Lb?L5z*%71Z}enZ2GIeq2h&KN4X)vO~q^M(<%!u_@iiU^$kkX&Duo17O?^34+=C)vmq{}8wNnjace)@gDEBLI?=^7|`$d)@ zW`Oley8={^k!NgvT{Ml)Fr7d$g1%Y0*Ga8d&&mc&1?DHe)6Q_}4p zF8D@UoMt=FrN~~y2sWW#194&qYcBF!^X;Zdb1NDei6ZBv0#F95JiPZG|M2dzX!7@m z6x0JmUQRQ6eDf#SYPXv^Gj&Y}LvFxh?%2llB|gk>XX8c`!S|n9`2+rpt8Q|xdoWjz zXmzQ%gxYBhd%-6l@GIS#%)u3NI+fv(?M~f_=Z}sNpTOYUrix#p6P_*-KR0aB_x<`^ zqKjfErvVDWG447n8nJ9&08((QiYgH?xb`)zOMGO)pqdGupQ?x~JT(b1FW2d`xlQ$` z$6o-LW^f88B?w~0oS<5N!^*^pRr?Sqss!!W@U*gWA)@2fUvKsfnDI*o*<(Gb0uCAP ztTROE)HY1nKx-L*M63vg51%*@TvxZ9>m&#}2ilV;Sry=JOqYLPaSV)tp^JM~#w4t~PkB#qA={MJnV{8nXwiPL%9B zDCRHlN7AGBFfw_1)H1aZ!F65Q{LyBx%~NQtl!p#|PaqOapag(-b?=azA_Iah@eIy$ zTu!*BTFR*>`ctVYnA*Fdw6s*mXct9!u)FlYl~@x zbQEIF&m2Dd9dAZ)E#{N0q~a8>*)vGgXk1Kk5KOjMgF{Q7 zULupqn3Bbu*B%D)73Xq!VhLD6I^X1oz6+hsQMH-1ynnYU%KD51-NBZ~%|Jck*^1TgIuT*~d{u2rta{VyF2B9DcsKCq>A!4??cL}nDUZAM7Vz&Fh^2JO zVt@Hc@%G8bae6nWb;GN7bJkXL-WcGXYLx@P9O~aj0qk<>KjRn8q5gI;f3bhVP>Pp+ z)!!X9uD87F>f=^m`jOo`_*8V8k5Aof8%TGj&vg;AT0L``P;%mLpMTg%{O|NC6pa7+ z-LnB7k$?VZm*#(%U$^(qMBJ-y{!GO6eM%mJXYLIC5z{9W$~QqD(21yXtMbn(1GEfU z?mVB@&iKf{!f-hDf4$nBS%0R>9KLAt)XIPF-|5eW$^Z7-I-c96D(2JV@qIkX>-d-H z9XGUZ6Xfth9{<(Hn)&g_;V=HryxFV8w(ab%3X1`u)FX>_k$P`_$JvK9o)#4yp%%x* zJR)*^&wC7*ViB7@w6$G5TH{;yE&O$DZEcyg`uy3m!$G0X_E3_RQ>hTN?|~Z6TBG+@ zBL3$TQw!GNXyI;uzU0TKfzc&Hw6xaHipk0Frgz(&`7-s7jx&unp<57QYR@#7w!4*M z`duZ!OrQHZ=F)@(Mp2yDPFH;UWZzp9^=&HP7qETl-a&m2!8Mh^SS}|YjFu#6-%-Gj zazQsi?rl^rwtvnBmJU~2`&T_di*+w=S_+Xiwc8K(9&$ZaH|C5-_?_3W_NRLXCrha; z(=kL5#;wY&ucVQaYZ~Rp$X@;*a~5>4>+bz-nC_h_%Ws!2_j(Y!1`j0%hE3gZF%~v zxAQ88nJRxQysk#DFOR zP0`IDU+wyFBR%f7XRg~1xnwhnEf8KQa@hR&^L0Sxgx9FeV+jqPI@ORFD_dIVwMA6a z*pQK-%lgbQ$)~=jOfwD)p&&7_f9D1?rX!|%`WdejyIWKU5&|5(kw1%^tt)O^#oUD6TZ%245i*4qpk!94>0SzR z5ob-ET42)1NBbTjna#wY3+`9$E~u*VFV)(4B`emfkIC7OPh(P;K5Oor*qOLIi~AJ8 zqtcjPlH^vb7#j1l+YVU|r+MG}kbCRaEh#FbcHgk!^z0n&X4w{EUU9CV+Lger55oe2 zZr+?u-t~F#u?eyLw{kha*nh{f<@>&a-Ay1f?lbWVDI)D0WZw{BbeDl2eI1^C>!WdP z!4{G5a?yH`h)7oy0I?#CRL2Gf$~9plMLPi5E)*O+(xb4A`{TAul2jk5lJdg_C-SL2-*uKCKP%aYZ@t@glR6Wbi6h|jpU*?U73+d|BNg`nv3lw*x zjI5V8N)c6DD>*P6GC|O>f9ude7amVU>BRNNnOF!QM|CZfsJN7QCbX;fX=YRvP#qbN zVXBJ7TJ?t=`cl0NNqpa2DRXXkjPXxzY@!?#^YwqRO~bj^Bn>h(kfN*ad{Iutcpw`H7@~ypbR9lZ6@K; zvUQR+d3_jo_3&)DP$?@d2d|6XUV0jA-~ul-3|=aEZszevEU%-o&v{;wCBpfg4G_Dv zKF549t@X&ELx*ZFT&M@79#$)pf<3r@>gVK|$iYElS)n`vdxjD6nysOM@~ntb-JEep#tjTegr68k=A0$s zf7+7xA*9LQ?(S2(Tv-Frx@xuH0Aw?aKkDS@*pn-wxbTot*_v1iBwK9mU3?0b5#K<( zj6<5I#s zNVca%%OtPRVxhL>>j1$W+qrXR2|DF2mf2zx<-OiYNbo5iwc_`iy*URP-Po<()g!sY zidc>lnjf-eeT-u8?EBLI6+5NZtz?$SRvCw8Vt@l=jB8fjgZ-zy#ph12B5X~aukTx+pXfgKohec;y@O16_FSmZFu;Toz*Bh!x$J#nfcI}!d>)G;Kh{nSn9=`#O=)%OMNsR)N0CFL!OqstT zeR+6@T-Iz=@wEa*OXwPSO(~At2uI@*-(@;FGRjK`NmP{rq(~k$)q@Ld8RJ#~d{=dy ztI=#+VxME)LLDHe9L}AyT#zob(8_>I44Xe~X;R$GgO<(`$Yn&|u~WFSqphxUDJTQb z0+q7N#rj8_Z6>Bv?lDnkrdYo{J9l%};rdCZtfC5!kpU=xnRmY@4kcCh*>>fLgHLAg z1@CzB$7eL4tJ5miT%%Y^gP)i2=xvpx81+RxM81JAQ^mI8aFi%mIo>%&#`dh|**tP%S&WqV&3tQwJB_cc`X|r*E@Ld6PYzO15&xt1 zym|K_R4uLunkFfb+6xwB@b4v~P+&a{zGygG<&$H^wjsxWROeFOayFk40_7bYs~ANM z?VtR^Ddp#VhYsoNX>)e9v;O?cnUexIcO}-X>C28CuLL$@4ZVQ=RYnB~w*tB#&Qc*^ z>YH9y27#LlqafqkTF$A=eHzGXDU@UyY*6=tRuLzyQbm%>2% zc{>*x3F0dqpNH;sd#kVEvE)mKbPUL?9>rl3B^qhc7$wN?#Bcb%uVbPfg>rpw^JZ&s z3_(aZlm$Ko3Q|$MCv};l-E>tD5+J)lP&D zbu1=va`S;&#o*r$KTD0czj+*wNrKef@AE%d!R)s?; zknt@f0T9Z=;bMv)X8FC$SoE*@=(^qu!ugFchx`j($i0CU9MR;`P%o$1UJn>D84mzRBsJZ0)2aydQ5}s+A9$nen z<&xh>w1er##v1j$*g`_{CaPaCP0P)qg@8(bhwzSkvPEf?t}DLz=9_glj^YN|VmH#~ z{n$TzSw(WKL^oWBajNm0+c$Jd7RRsR?#uAu;m~i8wGt1nn(udr8E%FmDFv{+2*R3( zjmpw#P~=I=b^W5h_y8pAI)M|j(=Ap}(%Mf)v-uHZc!bxsY*|4Q8YJWaMUe0z0zE}p zaED1;Ub1cVqD}dwRRM{<7A`}5y}Zuy9p25%d^KU7wzg6wD1Ww{n#(>3U-jAN(f*$l zkyKw3?ullRQYok?XR_fH^vXfAt3|YAV_-K}S0>~E%?6V1)3CttVHco!+NfiNTHX&V=cXIY>$iP@ zon)!tMU~te*4`h*j&5jufh$!NPo6xHPzt1wBW$&g=QSRjt`jzN{P=o5tKEC|4(A*I z0*;YZdZ`zuGu8h5yKf5aE=0VON#tk{NUJ#?OuBQbip@2fa^w!?K9*;S*vG`v?cRmd zQHlwLpOoG)T~1LS(4l%pdQ9b=rVpi6yO%H5wI9&in!BIg^wEf~C`t!U7QC~>&uNj= zOtd$mGzHIpK})5>G7zdAd_8VZtHBbCRdPM~*PA&;Yzyzb?%#nSCma~UKFR_^s3LDt z+9@vENPs;@h#WOrEZpfR)Q|Y3oW~er7FQ=tmaYt+uG=k z{DFL%k~YKP+_if8I4e85Y@NkgXSnCeNC>2&D?&EcN}3UGOm^ThsI;W=0fSe^IA&Iv z9z_xDFxQ0gRp@K(5ut@7o*w;xkiQ4IkDb}irOs1DVj7VC|0d0WJUNav{h2fWE}s*e z{@IGy8_iW3GH!}RhHChvq<_^;yJgSDsq{OV6Y+yWgczvJ0yt)aSoRdKQeojdmZ7DI zfLst0lhd}gt+1S1?bPlwpl#N&J<|x7n@CT=s<5Ps{^!eAuhcN;ZnZ3;=994$2Z&GY z4mUZbACsP<^bA0r;ynh;B5oe0%JSR!9D!eRiv)FNk~Kr(L9>kY+Vbn6cOF`ldz<=& z_K3p@H=-<(Da2QsZTB5KIH5IxV>Nf@I-3z-RIaI4D%Yga*_BNZykF)j!$H^obl_-+ zeMQ99VFG{M4oymFKz+1M&lPRGZBZi!%-37DZuPNQ3Qad~=+M#|Px&Yhi6>f$u&qP& zUce14k7Lr!%u}NfHx1VWL=y5L|EhGPtRb6s{Et6~oo)G`!Gn9zykTMz-^m zBd#NfIyr$O>HtL~%`?@Zw|gwg#|gQ;$ejAnptkZAh`1-H^Z+1?$jKt5ZA<(ZpvV19 zSBi&(o1ejaXIp+PI=UBh+nsHr)Z#Ke1ee}%*zejHx8m)+eseOXEOZOpar~L>q;^$5 ze?Z-P$lzV@QuSaX$M%I>rsB$8=sQJ%nADE8=dcG`7PeDb2i{p?o9|ZW4UpJ{0t2D* zk|`7-IN>iB=MNu*tw0*4%zAW6-}mep2wbx22+;G;apQDpizgVJMAamY6ET+4v{9Wn z79E%<^Vs)0f|%(SEx`vtSi@Xu+X%^4BkERYX_yfSrxp$I(!z0G>^dm4f_m{;NH4`h zkdhvtR4whjJE)HMppnYk=LBv;U|HukK#@8$0oi{lO~Ml`aN z%4xJ&G8qEKy^I?Ca?ggO_|Xa;OByU)Jral)GVqux{xthm=EAV6#1?~tvSs=PIYy{9 zGc|qe?d@N%5wZ|X%Yef_5omHO(_!+tyvv;&9LxYrMD4}o7ja@HqL^iAWz(D`hYG61 zKFp?!4@SEMh%M>?WLx$W#a-PMUw7z0>V2-H)U=M8CXW`Oi6{kPUOzI|uijeM&>+=s zazpJ#UE9%o2Mupqrva;&A@&uT+mFx$t%f|CVr#sOQmQ!8!`747BH98Oa|tFbY7(i2 zK2mDDd9C^k9jQt)o2RRn&DF2cQHZvSTkI^Hdnv`Yz;_S?Mm3w3B);yw(KaNQd^pn5 z{7I*88H!~ez)GT|co_9ez$kffaLLCrD6X`{wDV7zs;CCg*k^IvTWfsRZX4tI{Kr}5 zO%i?@xy{|mZDGEpR*C;2*dig=6log%g`O&vIZbm%&H3c<&PlJddI{y#DTdulciiY# zFSu4jukYJlY~4OWogSZ(86S8X-uTta*y(ITr;+V{XscUxxsK|*`_3UX$LwCa_JY@> zY84J0lE1U0AU5aS^`qam{hS5%!XnuZdD(Gh>z`P6s_y^kdoB3AMpu?(lu^X8#DDv z4JtG&pTJHD;w8oD$*IldhJ7I{My~jMIvN6p$Jt@3gPV_c+c@qP;kH@PYw?CvZV8@%&+S9c7u!+4jCsOl>mGu4=U+4W5B`^#KaWa+iF#g>Yc5 zjB`dpa2Ax=;Dq@wAI>F;;p!Z(L^{aJM0yF+E{r|(q5$VaYVChrU2zE@Scc7UMv2>5 zK#J69Ex}xR;&$umvKU;3%Rol&NU#-Dy>JWQ8Uu0CE^uF}A75!0YC0iBBexdC7SNx> za6o#>C!;R<{Z}h+KXEilgj{*K7$_t$0}$Nqy!*kFLy0k2TTPmrFV#d$Z1CQvG2E!^ zywic0feqUF*$MgOl>j{*^N+SI&AuBx-{pFSJ)XSH+FDIz<=ao&x9@e~!Ue%+Y51uK zgn*0#IXLY{4^aa!xUuP)$dNL~tMt?#+;)Mz-qK*+qjvwEw ziKucyIii4`r00ZfD$FS4G333htyRxPYx6skwQBxdJfyA!2NA(|ZBG;f6S=iET77M> z#W>+=K3TBwW}B-~T1^miY-u5rzuy$LyfE2=YNgD-Y6D6cfkzSi&TmDZ0wJ;i`(AYSmW_dQjx6>e>B}NwOBs@^*o1oaGLYn+v+*Jk=7V z=Ha;Pz6c?pG#EW^Av4$L7!FGVX>zS!!{+kXmUowSHkA&hF_qag&@z%uB;r5n_D%eW z+$(y~ps3g6b?5_zjT<*EZti@)X|9IcU}eO$QtOTe$_6zxV=G9Yz|OZdb6G9w=`Qyy z)>eP-q+isVoICMa2vL@hFjw|H+)Ds&Qid%k1L(fYNQZ>s%@8dUv>nZyo?y*17iUlg znLLb4N;%|TK2hBz^6=n=OIu?No65{cr;95n<6O%nH1<-#Iqr?t{?SR`eqH!bRTyaPT$Y3KNI`>qIXD57AHzF2ZIJg<8SMJX(xsL;Sn zjK+5aSJ`GiI30R5gN7C{Xrf6Y4R(0ePb0$QgH-T1GDE54&9T(TPr|1lv8EzmAe>QX zF@CmCv(oYaBKC;)$#J-w)a2q}V>7M%p6A#d8SmWQ`G!r=_l{cL+p4+r^VgwqZQ7JO zJ>=Z=23we~gxP!ga2clLXhmzUaPy?sHSBblMGI{FEW@A}(^6Ke=xp3_=)%~!wN4n=OQ2s_z7ao(KhU1+yd6>?xbQi$(-Z?4+y2y}TA8G2hW zWhpJHk6mXLq82Mk@;oz6&;E)S;f&K3tnQ8xo;?m$_=SD%wCHvY`16j6hfC8cKjmmo z&xmz(m2@3(kvc3gDM@@#?{j3TsfpdAcfpt1|I;%xGCQ_;Wxv-|-`h5|Et?jLgD&$s zKJGV=L^8CYI`9S3fWQ~n64mZWRqhP5)#bG;#EqAYdYm~&I``z%EJBMaM`|lFxIfl+iFq%GwCq=>P+ZCF>Cq7O29r^vyze#plJv zXW^aqTd}z=8#+0FjBNQ~r9z1A&>Jo9pd#Q*|k>04)#D`x;q@Ds} z55IK%v{)_!Lui&TTPh@&njhKf!$2<1m&81Wo?4EV`RwX_V)uy!k{D}&MgYCUnkWh! z(nnXQtO}by$0a#=62`ytaPPxuM>tc2`UX=UID5_{E=Vshba$E|QPjc8Qn!#V)-Lu8dfih4e!EB(TblkJw@q|P} zEZvy^Kz#Vtk{hpWo-LF3y%xOB4ZEbJYK!} zgw!d#h)G}wozrH{7eSjiS?W-VzF?OL#wYq}Wap}1`J0-RWn9419Vjdy7uhBlDNz#e z#Z^UDMsLi>&T|V#jUcyD%RY z^X^_%z16gjk79b2jarqnWzSu%zTlIRi%Ds-9QIpep*A`HvGYk|4{k^6Ei47a(beh( zH|Z`ZQneL|rLY)$cN<3S=UJl3e$G1qdXbUc$k*?)dgVL{QZbpc1rv)7qsud>8pU1D z)seHnqVJ?_(}6LTF<19{uyeh>xG@n-yZ|a+ibtDP5oEz0k^N9y< zOy=gT?4dJvvfAq&^`pa$p5Jl2_hQw`jZH~UE`9KRKfA6vJe#QQ9`6p)<>vH8H7lxUh+b@@M0 z?!5Ppzy2Rc5KmBuT5E`2lipp?*>!yDDcZk5Hz-$EdD*nQUsUfecLiG`^89n^$^Qan z<^NQ7_TP90|F_%ei&4a9KHDM0DC{PxNTfmpWl!4s!`(jU4HL4 zdqXoa&iSzzw<&-`aNcM)ir0oe6IyMEHR|8v1=fPhdLCV5@XOnu(FkthZ%d$i@+&Uh z&HP5}ZtK=D_DNzHiyGWop5>r)IU!yr45zoX~s&Veh8McfkpYkYk;m7u*%V^_R5bsr@EBVhCkSTWo<%%#uwd2toV&@T*lb5 z1_f=D=r`;$YlTR0cD|muLq|ua{*SLl521{g_XD}YzzECmiz+NBfap3ipL!mLtCAE=j!F$lEUdJ~AQ}Aue0gs7?oSz6C}6W(r2NeSmxeX6 zvaz0DcCh416!Wc^w8X-|hU|A|#{&6j(hDQ21{V?bP@E*VhGZ~~ZEEZLW@NCuQH~2? zs!7!G2TRUf@NDuFKe~$LTq6?OVslcGhZ!${BKQTgmmsRi_F@9&i^6LeNSPu2t1gQ* zPoZ~6q^YI7&_}U~h)AO9#j?eEytmD{ZOLnD3ij4%A2^JhNfTVF@)mX_3;}1z(5X`m zMgJ&9Z1L;hRKzzV0_mh37;jH=S;}9LMnuL~qqtovS{%ydEmdz1Sx%d2!>SM;iEygu zI9DpiZF@Xj#`VFI$o3XD1z@}g66h$eX!m^$vcub4mhh#AY`JC2&{f#PtZ*{OSM(eR3&3*lJ})>5a$;U zoaxTDNKbzJk~(CINNCYnE#sIF9MndEb+B$mCi z9#nn3_8`r`=JzqI5-F}b#N8L>5;1@xvddIrlawma)lE(ePt}9(s;y>d;C$2rJ|MI zNi-+29Uw&KDS?IRA?|}D$T-!75ttlABWtTEik9(|wj-v7VNDCXF|f!1*_h1t;6J6Y zjs{64Wn_stUlHR3&#>^$aZDRTOoQ~~Ku&$Sf*KPC{2)bF#eDv*QHRy3 zU*EBR`}eihF}ojB89{soBHogeU=D_LdZsuTWV#~$%7D(Q+LC4lc14dvw{$4EkFnBX zs_nQjVXD0IZIh9x(LzG0u4&`8w#1t zR2p)=Qf=fo4f;|>Lr6(TQ%i@L`nsHaXF<|ir-4Dk$_S%jE5ib~QDlb?2N7NNT61Q) zXAR?(LKHPdl-OppsH|Is|`$I<*`NpM5i-hoAp z;PK0)r{>v@6GHwPR@Zd?Rpra^F)=ZsP!(uaUt&2NDLPT{k0ws z_b^J_+OdSai5sDeIA5yIbL{5fR5*P4z_qbA{2a@M^4?N6kBIx@kKm_6;Chj#`}0Th zm9xV}g=dF;Z;onIGJSju51hj# zBDjqdSYS2x+i(f!C|+|Xf}${og$6YoQZuASK=Kp8upiFqRVW7}j7yZozx~!f$fj*W zYF_`?Am5Bl{f`g|noY-O{ryO6TaKwyVCI%# zibvt~?yJc$)t}tPDBl?*dL7aH(8VzleW6(Tg{H^m)S)o)qlt2|@XPITR0y?@GBxC& z-HZD(XlYXa@k`sgyxCLSou7C<(5QSLB4E8pus~fU=9`K@&>CR9+t))r_Lv6r=0}sm|Ozb@vmRjGMMe-um2ef<^Qfmf5nP0>n)ah+dclv4<9~s z>&N=vNhaSq_30C2GsHA_KUutbb>7bh$7hS?;#W7f>#cT4T;^?d$y-KdROQkyN%kCt z`j6B+*_@x~TZ>okA38A!3>q00lf9fQ_ilKOYUDfSMAP)hc}4Li4su>H18A*JpsQ&fb$V#NqvVxEiKRGv`0B5`4`^w~aBN-yarCl- zYug6*P0xy&vP_g16gkPiF9M*u@@d@|4d*v6wGy5fE--SSkomXa6L2(`X3PvApwnzk zrHo9MUE5kvy^;tMFp>wb#x|3}+M9CHA188Al7iSBD-H`!N0Wm(|IV2g715+EXl37_ z+O`>TJnv8+8yTs`G!uS&@>B4|M=rNt|DNJ&FYfM0VXK6031k}B(6YWIJlpM^_EekXyB`dfBSL_Wy$5_TUS&l z$QSZl0fg`T<4*5%_!%Za7MiT2uD70a+*KsvXm-vcpd$Cl7c4q}`a<3;g=89+hgishrbyu>ni;%|FK#R)%zu3*tzt zp(W?h`)NB4wnamUb8gs-Nsy7!i1Q|5tL5}+{bhV^f$A51LYYx1X(_Pa_i?w3yes}x ziXbAzY+D<#1j?n>%tLT`ee{jmUL!70Yg#&%~nmNop%v zL8N4@p-0q>M}U6ByugJN=J+<(cZ*DQ1K<)yO|r;jDF`Mr%Vm*5ffXrSvUufd62AqV zdOaaENVbQ6<-chy?Td&8@NwpjxQ8=RCfn79R`kAv2w)*>>+cUA*qJs{D7B8L#oro8 zVXy&copYyNHC!>Vu+_mC@+xN3r4qaQ`Pbl&X;O|N)CA&b>vrNE}yBhNmEZ?Eo z`AN52@i0h&Al$9c+R4v;Q*bectDa>^n4zbZg(N0J8I^M^~XH#_2*K zHN~bErFsSe3K{wrb?us%GbJ-dkK*2^hE{ZyEFKzV2~1%Dy+F98ODyr8j(t9uP7IxE zW^>~zltL=8u|&!(EKwazpP=EzXw|P@psOtKKJz87-c1*GFY zwFyQ5SEKW%8b;eLq(FWEPoawxFoyoTIMs)9Qd}s|L(3(9h|X?RNJMn5oH5elOK1b{ zLORO0cedL@klrzbe4vg|({IKmc?;E671`zTdU59W8K5BUPfpm2I8AF;3mCz{ln!X9 zp0~8(&YQyWzDe2@-ci$3y<1MKpke3`w}d4)Zu^TR(eK(6VJ|(@d$)>Ym9ib?2KJ&y z8LQGmCL%Ph05uY~;bEqMT*b@Y_=f#$IWMfS7Bldwh&2=$afOA2_Vnr@WpmMqumR@K z>ZoUC(PxH~p$F_iZ1TA_t7NAf6vb}P);Vsmz+iJg_huQH1#K}%K)ZQ>V(?M-`rM6N z4le78HV$Vrhn)O+y=Zpgxe-Q|nVQ^KvwF2fRxjYhe0z8s)9*&Depu|l=N<=Wb>#UQ z9w>?z){L>u+seev3$|Xb*)uzzP1ci69xEtU)kHZsN7*3$fN$VmZQNd6kY5}DYkYu% zYvt;43dA{NkyvCkpb-YvbxY{$lw{(-bK@VlEuPwV>%;V;yeiI=12Wt}^AeG`k_kDx zw+vW93=8Pf0iG_%hC1B)!q|!4D35L*k2=bx?WJ_1uRQL~N!p$Md_rDco*QR}kNYLY z3vOe~UrquTPEY#A3C)wxF~wnYIlUA3)(tsj4>>?K2l1kFV6Kv{P^TJYdZ`ov7et=l zYJN~$Ir@0+XDO{(!OSebq?Dy53HhGmExUWK{rT+G!Kfd4Puh0V!&o9uieE(*INsZ4 zWi^&g(&)xft{=-$sY$Kt#-hSIX4>erH!O57uFeUx1oB97`DOopn@#VlZf8trJw@+m z>6MQgE9#pO@1MKpb^L64R|-mlvz>QSzR#fw4cY0pv&n3K6UXQnh-wpiN5`IY%jh1j zt_Ll;{j#oZ9Q$?S(uRL@GaN%Lz0sK}y*0-3EuzhMa3Lf4dm?QTr`gh2zOX%FfyIc6 z>N{SXn`4oG`Qw}*P?)7PhhQ`}&V-(^nB!__z{J72XYby&b6#sz4?ifjN^FH6X0YT3=L)UjZi~wlmCmn#^ z_wKSAD7y7c(>ZsiAsJ8DE>QvNMM%JN;J}YZ{^Ta}MZ^YkfE25qyp`66gFWZ?rSXn+ zn`T|}?I5Y4q2#Q!{&*V90~}#U%o8VpNY~Jp66Z;S=~MCqDw!ySMN`E!xkqK-q)88Z zC(yPX;EZNPgYO#D9%ekkgXcpV4samnox9qe9r_Ua? zZ);gOAeu?{_{#Ca6OWBEQ_hY7;pooViAP1`M)}f<(@b5$uf)(z+N-1h=gcJux(JEz zcy8;>!7D=l*hDeXXju39^@PH6qRCwf7dA^7N~;-N1RFEhh*meA)5Q${w>wWk7Eq{N zwIScO&EcE~>&S{l-%Ob@*SnA1+^jeGMrC(;URR&7srw!<(mu5%TiIyeVk^9is2{DI z$=}DQ7r99+xiLx9N}Q-783g2DtFxj9?lic)!HXX`eZUIk9{wsxb_ z-|rW=hwRqlX7i*g^#=f-1MEx`HS&_+GIHcICBC)wu@i!N{@Wfs%m~xX928S_#ERpq)Rcs1`6 z!GV6Icjw(~!#UibvsbbQmO{w*Q#W^w-o8+duz70IDRUeT9?Nj*O;^$X)5rcEc#?EW z!)z|u$Vm;0>;|8d4IIb^jgm8*)A)SmO@YlWQe!H;er?w9QF>-AX%at^qGRrjK_8()2=60%~p zi%!3__D??BUnIxZ;QiG%7H0>qRFpvPi$qgkA?;UkELFCOpbP~0QPNYe3;*a}0L z>)h?MiU`w{+rhp-2IfU3tX8ueY$&n)s;a6(30!H#u@l;lj7})G=Vg&Xzh$4?{$FrH^!KTUaIOrxn6- z8A$%ddU8gx8?pk{0?N{G(`6RFX zTcF71uN>Q%N)w^yq9c+t3$L6e z<--hyRQ?~-y$M*)`Tqay{LY*)bB`eFIgk9WQme2LzYNojv2;S z;@hG~4I&9iWM5{CC=sPd_9!WmB&50@&wQQVIrsm*&UN3v`}hA{_w72@HFHLNm(S<@ zc`eV^^Z9)3y-}g@>UBS=jvH}K^UgjvXFs~!fA9RG(~2me`^^ZsW*9W6b7ffi%XtBo z6QoRyyFSO(!s7JjPJOat0IwsDqmxc5DgmW6 zSe*x2@grW+5;`% zb=3LD#3c=U`%FwJD0ka2(|wmA{>s~3;LFBwc|!;hTlHK~h)4z^oK{0E(tS=>RM$Zh z>Mf*=C?VpF4n0BUt^UdSpUAOO83n>1I()i_L4d)SUNf>=$h_}AX!Pa9oPlQkl)sa| zjW}>WC43xXo4Bq%R41~JgG-({Z&yJO4-ZyEU%E}{w;p%L%&9F>sTJqkKKUp59!Q^^ z|8}Xrrlo)y`w{z8?S`?Q_}%U^b0Rr3qU#FJqcNCqzzIt6`B*9cgjpC2YpI29c-Sp> z>yxv&@7m90;7TP;*lT;}@F<^TzCf>`38fA*G&JT;$$qcO@{@i~hAo;As-#(0{J_Pv_9)h|sMI@G99iY_NfTzfeF`so)tnJAC6 z-FxZT)q~u`RvkO0FIq$?_loq^ zg9i*Fw+nfKhsReR&Ux3GYDx~Ptch(IO47}ZFFJb)w(aELUl)y>H2Jui;Tkr5G4%zEWa z8anWgNq2cL8R^SAN3NFYNu2z^UVykSf;*k>_5<1X^3eqzbl?3X73_7l3s$|nd#4nC z%O4i-1bZc@iV)X>hrI#x@C7Y~l3Ov0k>{T!6f)wRf%*tZQ4AWqZb1a#}iIG9)N*`9v1CI1H$`j~FF1jb%Ha6Xq*fKXU zQkS`s7%PA^S-aK+7NsP24_=#mGaTjs4$Z4IOQ$SZKR<5Uwrx-@Ce-xq^w!q&#U!Aa z@h7XTu(B?EeW=*l&FbirziVSE1~K38@rP4#3ssS>PJ?}R`&t_0_(}oU(YInz@ux;2 zbE@LGPiXd%9CX5b;%LYYvPhL(2wj^UiTfgK_(>&U2c#>NOjunv4}tTNVwv6?=aVFZdofd;rjn z_z{#dnkqAIRQljC%|mK&ET+f4DVM$>VF^MJG$M^1&zO=HUqyS4m7(Cfq{Ie4mNZ=< z0a((W6U_?a1zd{(Vq)MW(c|U4kKsOtM=24jy`51K`9>|ZOD`m?}ip5{9_3vnut zVQUGZp?tY^P%O(aS@VBnl5&nVm!v{UT$y)5=8*Y0?ldE)C>dvLYLq_$Hf{+V0WF2# zks5Jm_I-t};V7?Zz*C-FPu~5BK^4P->zg-kHa7?{Xwv>zH>=i-LbmK&d1Q;bZ8yxC zqA2&c<lpk3$9lSW(2wH z+H0*aFwXYPRow$nvV<8ojra3Yj$Dk@#iVx_(qT7gSL3g?dgWWHmy+|my z&9sTH5Y6;SWETl`a8VV~MsaX7_a!MVjm}o$Y8_P(A0%O?mt@rS4fWK#_ym|aqmNNz ziX{yaq^C_J32N7UFT?gNGdSdUp%W1&NvNA(X%46sH+ik%@nLzEL3AonTSQ?77|_s4 zj$TZ5bB>o4$p)1ZGZn!vV1l$pyha{#eEg!d_nP7U*+#1pBRF=~Vx5;Mpu+MO#Xvj~ zs`kw^M-N%=5$l<&?MPZ$MQjS5Kh>_0*ecIa-j#>V1k`{|fG$sL0Sdwl2BVskSe z91g}dmn0!X5&S^(EHSu<(UV4pH=YHuek6P>x~(UR5@~6 z|F&&b`(sUJf|2Gpm&P?rS=+^E)ARA_-9@26nMElDZ{ic@Esb&IaLlqbo90`|S(_Z? zQP8B=lz+}T4P5$Xs}5ZkKHHwYrA{Fu?*)1?u}&L8vJjZjegcg2POJo=&p(&>a-L6W zyBfGNsRGr^8EjxKbP;ixVXzD)o}JHa0v%cR5Br;5N9e>rsyC?N3H<)hoIH8yY^E-7 zEU;PrW(K0)ui6|uhkt=8mXy=&PDMr8Oc^7QD>|KN3Q9?_ZNv)?Glc0rMbjFb<6e#$ zbIKvB{@6l3m~?euM{IKVBJcUSQY!Vje(|!udt=3`T}4Eq(?!Y22ND_8ee&t2k&GNH z+qAKxldZp6fCa;I-Cr%#VExCAfezUx?8(cb9GEo2>f{O^Bs~tsZHhAG3*o3l;(6IN zry)yPvkF17;?hMaceq*FE(|TTHA@T@`QEf7sUe25r$r;->105!dI%WL5JF3b(z~!x z0)eB1zy%477_H!|!pOjpcCynsrOm)Shu4u`uNQyxGo2uozE>zws>~bRFYdcZjE`Kr zxY`OeR-^bz#0)mf>JXzu`;|FK*UNppJi>_KoVV7HXsD_>HEHsn*0)TmMoEGr{tQ%> z4TYZ_yV9u3;i?UUoYHR1EP0lT!vrgFecDIdlzgTBJj{-AKo0XNs zQ$gb|Q~0SIr~Pwl-ApOZK3ncKvEQU^TpZ9t#Rj@Qm|`#6oIln!vt)O#s)M*@Zu-Mc zf#$1xT=#X2pK3hvTeY*b`y6-mX!-SvnRDl3;ac(jhFzA z)0&f~tOn7-LQ10ZyFag9wMLiOBDl;fYC&n)!;0zHOZ`PHnyPWeeLr;1zx}f~^xOZp?zD@4TD=R8 zfcL7IHT@Si-~YLp@5$edf$nd7dH;O!&;N7pTkR{efAeNPyU!q3z9@C1md5O{Am~&4 zB#|m6|Mv52C!TikyOrzVU4-=TC5|crs&}7w`j^aIuJxAIZ8NedI$0Pb>cuaSuO!fi zd;Y@bu<8EY9`_5Awx(GkzR*U*j&`D`@b&(CJ0`yr03(DC1T?jUZn=;pQD`k62-q7v zlaUeooTCX_{6tq-0EiVXlyu;SX4t2(NCwBu^9c9@?)NYq&lmH>PxNd`hnNogdc$OC z8SYG}SRe-_;*7gyL!5fHg1N=rBq>@L0CLxwYbHpV9L`+n&;=@}61lTb)acc!{w(Gz z-2Uwe#*~=0a&CQhg2?1WMTVt{tw@;I0q*KBS2Hb;MpPgV;U%pz7gLA_=|bN3rVsdf ziM*xn5%V1=i~0+ks1m`(yQY{aIjE=<#qEq{R(@KR-AOEQS2s}jMJbVP{Tf4mn<`^k~ol#U@!gD{Pj92NW z+{v6>VUMb(z|~c9Bbmbx_9zu+d{hYPJO_IpmAtf$^X7Ln#Re@k&?ONc5rp1>S>=9q zKYAEt7OPquR|9NT=7r?@LGFk4l>ru%d>d ze6*%|BB}IksJHdG}A6%9uz3IdCID0r%m-fCPrdx)Yb5PvKkWpoJgN72JH zvb)){vum5F;U>gc8f0e65fx)xZcVBpDYVTkn>Ux7T+1P*HGgl*=FQKDA?{d4Lblx$93|zQP<3#O^+4%&)KtxK2N(_+t&UO3hgmw zy*%0lPJ@iB8T-rt4==o;IJ|N@Jnv5Vx?HMpT73sa+JT|RTc?lhBgX_Ak{<>+g@=&#l9{+ zQf{Y8Z!LeN0|wRnGJZBPzKhP^fG}x{Q8d$X9EdQ4GGfJdOvDh+;JzwbJ-p5uH_z6r26+vUwS2Fbk9 zXXUlpzz0l|wDvNPi=fUtx+|2>Aw)zAgTMpEkoWH2w?N7!!Z`iUMY6)q3$3xvOSeud z`^%$1T6s%r>q~dL|F|vx+E5;E1V-P=Z+t`34i;%nUXMC%xQ_^_@y%Vx+4bqg>Evlp zuSZ#*LBr-&Ix1v1GOrC)qI~ft5oHK;BtV<<4XM1{>9IPU$uhJ5=JLNTH^V39L)4Ip zAPm@Lbfj%`Oio8#4ngEnWn0JW#=n;%Awxy`hUu;Wo=MY&VkP2H->ei6*bB1=3?TMh z3zxa&7*s1}kSqHSQ03i*Hc`b@x;r2e}*_Qp^X~ z`#OHCi4yqL1<|U{&ZSY}t>T!#15Y$p=y}B*PKVYD>UnOA6(mHX`tB9Qdg=)>xqWvk zEJ@Fat{~X2G2Iq*>jv3TQ->bOWMQ}qF|#pcK}!S(iQLen5G^ff#}-;8C3*{ z&k8hH^YpZSz1JtC48c=FR1to{SqG7?(ZPPYDO7uU{&T2)h)5M3TCi^u6wTy^Xj#`w zpvCvl^92SxnE%_kXT@G_r_4ar^2+s&yQh{Mj%afT@Gt~ypZFX)azs&B>S*433kcxU zr}q-|QE(p!zO(udNWBj=;rN@?(O(5s0L;v+PLz?YmXOQ+3HKP_&+iD1ZI@ zdia>>ZYUdyqRkQj+0f>6;wsB}klFN^R!gPmpz@$`J6bKIr(CSU0%Qzwl_7fi+yWfxn8qcwZ*=Fmm2Ev^+PPB zF#Y)T&j0;N;i@+?y}s=j_2gNfRr6f@Kk5oKOSVd;KPOL3PE6Wg_r&~Z>EwN7iD-2SpavD{MA8P#8=);cQt7(dM zSZFURici~N({HSpP)~sg@9@y*>9%dAm7LCq4GrD0%rNkIH!^@UPyPBO{rN=QH`ilv zLALhdd^M2a$J$p6`Q3qXOlNb9dqNc4HGVsEsQ|2+xP4wZ#**xwi zdw#`w;Tg-GTy$Rf_VQZWPOS6Q>MZ&uhJKO2Nm|yxFzP2&zo5VUjjAwV%?L~eS`Cnh zf&9iSV0Hu8AxyVzyw59O@gIy4^o`ijTzy?k4Z<@#_OCT-Wgi> zbQYwd=ZiV^E)tqMy|BZhTbZ}0eWtK#QZ_@BDHfT&C!F|Nnn@BgweLPVVDH`@A~(tbLTEmlkT0L`^@W|9F{aeXz1YcpfN?hsXo*MfAKyIVk zor;YKpx2zB1XBq`xy{<9*_X90lEPiiAd3oUH>%3K?1T?IGIhVe3niWV+w(vp`p{hI6?xX+Y`_yPW8jjG{OWHoNL z3LJ3w_?Is>mQ#Z52Ew;6h`d>FqURnGZ_bx?YDu)5j#z6?E!@Z~+-m`RRH!23LVT-w z5jtQBQpbO}ZYs5i*We+)(#r|(tUKMC+$zE;w70w(F>WiG<&RFf_KG!EKdOBscdtJO zoGSAZ#ZwtSj@eK;%AGAPgLxEiE1uq?5U^0SI>pl#`h85-KTpdxHO{y1u-T|u7Z<8b zY+PVN;GQPhwXT{PKWS=0H@59*l+*}FW~6pUYDz;w9L|e5K)``aR$@2y2&GNV4R5@w zWg_x25^N*$S_Xy3Ggd$(A)l2lRr5HG%R@G?iO<^G&uka)&FKB^4-2`;stG~uTb=rn zVSR@QzrUj$>>&19V<=8CD6ku2%8-W$tQl5Ff1{xll&@_F(x>v|YG`>JKH0QGz2}wQ zck*}!TkLGR8qqJnm$gVx91O;fXD@ebJoXkQRq&Iw+7|ZmUVTl{$Ni2((> z_Kz6nJ)DKAYG##{SnevjbvT{rKqi-C#+|TRm3RXT!REE8YFpEusNM9;BC=yYq6PYg z4zS{iidf62SpDxt0wY)oZMHX9&Z#DwEUj9_7bl*52?wbfu9rN#f2!jFbT$6?Z=) zFhrzi-RJ{C9xvIF-z_?S3se7BjAG7b4`u<8VouefC)i0mOqqA)&T!vFr6LnlG<8=v zx94+%z@8|uM-WUkH|y1>Pc)0-L(JZacxu%m(Vn$t5&1gv5&#jGmp8h-2NhlBSnsgz zhpq|{WCkjjyE1zg>+lc%d@i|VrBA%;GXsha%85g+Oja8%m& zba)B~;rQt9e@R=tkM3_&U}o1K$1a)cx`~k}s~y^s^Jiqdrplez8Zsm0Qpv{jl1peH zqRpf7yqCaE4*4ZLV^lYuN9M5-M@0Xz89oFRjBDpked;e=d&jh#xXKIttJT(zezkd& zarjfOBYz%{d+TM`fwIX9k8av!{*znh4O{HWpFMf9r`5TZ&w0mgi&pXV@`-0M7?O;h z1Go{5td`+osA`_&o%mP#o$)!RGRC;fYvZxkYQC^e)oN9)`kbq+Qg=gy-P2`$>D>pf zE{_Wf--c}r%glzo;s zJG2Ci0&YDP6JO}^%UtrD!(^E$rpG3)zQ5#Q|K1+vHwJnhfAag^kog>uBL-i7gWu$z zw&a(69pmR!k`;z}K%^7i5iQQ%R-Mn6l<$7)P9uw$#f{S7LK#vqS(XD;E46dl1O)-$ z_q#*7>Wgm~as8v%RmEP3v7!^sS1j?*4DYL{m|kr;iX-|Q#KxcI`2Xz z)DI3~AZuP!>k}_r9<}c(C8AsREp-UJLD+Qu3<20f=p>KPMhn+AfT2wv-*QKXXfMz9I6)Q%Ii=NABm8LYNpn3kcg7P zx*uWBhr8W7+o~udY_Z^J?@xStT2yq2XX`$ba3Wr(Q>6#u;_N}$b*YFkNfHIqgi_KnbdN)XrWYHMXOAaes5aJ6yVdlm%)wt$x?k1+lntrE(w zyPpx^bvK}Cd8a2CEmrJxIWO4JVx0(b z(Xx8=>hj%kasBBnT>bLN=pNNl(iNa5C)LSr6~PShesYLCQ|RNQ>Y1tWgj7~a496-( zyVnc?>*XWEKOV*w((^5l76|lTlf+r+*Hi*=7i2?Cc+eXIHDY@6YmJi0&dytC-Sg?^ z0_n^i-#ivgA`rTcW=%k$S?lN3fis2x@sD7#i+Z8EE;y0^Ey@A;s{Et8=h=)5q3ZT< z&;l*`*S&GbqmSd>NtbXBkU4*3|YDxhLSdrKmXL?_^mBB3v-Kn zB3!Qr)nUU7$LI==%@@E}dOYUMo2PLxI7;Oo%cq+nk=45mm;5&VY(dj%BO{TaFi}5C zLmly&GXoejn2uQH>;~~XCpkMe8!_TaH1@vPMub2AhVizc6o>c@b0WsQ5!1qtJ~Tks5W1JB+3q!ckX;vtCnAllC@6U zjOHH2E$eSQ*P{NpY}+lG`S8S`EM9om-Qs7> zo$Ec-;AOgbDYa4AE3 zg8AU$PgirksfL>zn!5>wx&AHl)+yKj7kO|LSLN7e>r^ z);_Nl3?fDq0{-z}cR%xUSkEQD{VFuH*DrO304tkC`%$QA36P**bcfEd=jG>uNRTFQ z5a61pam~2D4(b{sCLgs`V7K`*m?I_b^a1Nq>7n|GYJYwDvZYHYv%HxY1p!f~sAhJWR7bpx%Fw`r(YBY*pCB$W|7uJU?KHu zJJ!`4(6uXz|Mcf)(D|Z#D=YlwhEo{Hra_hkOn9D;^tQF)BQmGs*)#q&{vw^$Bp&Xe zx0p&WJM2eUGMu4kW(j#N1G?WQ&|ILc+2*vY=*&{lzK6s2z46-)*2T zxJJYXpWUIFS)YYIDGA(Js}C5vi}zMHpSf0;M~A-W=*G0Sb^o-?r#}t)u!rU7(W9j# z9ThwAC!yegfDQB6b0Xm}^hfRQLR^!yp>s@Z1)2jv%{=cjOA@~}U930J-~+H{Z=Sl4 z#_x{bMk3eCVWm6C*z`JmDP==P+7wZaB@_jmnYQy5JSL5m8#M}je~78w-{ZiO@H*us zO^awf49zv>ZXY!o(_ew&)C3#MXA3wW-sB@C(y*Fwl(Y@mLksF~qvZ5K1!ItVFy2X* z`ONnpJlHPw9h5@j9N)a>yoyX-wN-&Tn8fW^?=9S)ayW3+s#P3^tstJ0r(EZDr|HrI z)^O>!Gc$&AlQOtT)PgTFq~c_#LY+EP97f#AowITFGCFF9W6Bx(2pC8ad&K_tCM~0MF>l@&~DXz{>8{g0-V`K;c&Cf z*9Uh737-jL@sP!H(n?x2IN zDfjw5rW0WG;h(D=eTN5O;*;mk2ad>MbXuRDxdzFzBMJS?NHcUJs1!Q|v~f)R5X0~` zg^UJ%2+UABL3m?W9SQ zc6f`f9dV2cGXY#{DH-0mjOVMqd3_+`si`Rxw;w=?cPa8(xUhi~U#ZU-7`Bg^(cc28s)yrq%`T-ffd8yRSv5z?Z=O-FoVo>L`xr^`RWA@Xs;?J*X?>f+b z9^7FY>`{Wp7I(<$$Pn%}>pLYzT;L*c;3gc8-=(IRLMOKg`?}^=xRB?YCVpsUHls}z zHT!4tA78JV3qsSr`ITiq{ltguQSrk0Tf)l9>E*9q*Wj1iv2JjQ`6+3%v~Dvm27GQQ zwL(LEhqF|*hOvaJ^Eq>sCziT_ov-{?KTy-xdg{21m{e!Ko|I)Bx%(2f- zjjQHVBkyJRhOOWG)6ou~-2M;iZmG5VJvhC8_jz%rI(an!p#l2A@)s`Yc*E6Fwk2=0n`i}5BaT>&iOK^WjLwQ&dAse%z+$%#k+p#T_g5`mz4HZ)KW?TaDw(2f2Sv2t~k1zMQx0?q9h zYzb|Y3Ak7S^o#5V>98ej`XwF_S*AJflrsuQ6Prt0661#QIXTHc$(l_T5WH7&*AHL4 zc+q#^(Jq5hj%_WAzC!@m#vCSE1$oVy4lqPST4A8yVr+KugQM3nGgT?;agl!-Y|F&) z?Ies)kzy|C=XxgXFlquwG^!$b?&Ws0GPic`-o4emz{~Bp!W&1EsqDET$hM$f^Y?Vc zV_k2{4@e^d_jABQj^^0RYuChbnf?9ugTXKbX~1@xLdC0cPnob9ye%WR_bFSo;e3?9fNenh6?3m!(C4BiWzzrARZv$dZEEYK}CO z6DRhGb}Cs%m3`?E7UtDoXxE&VPbXvBY)3R+$DyyHRm2>9s%@lAx?DIDas_N%p3FpG z=ImQVz$UH@;8z07v&#@HIE=bP9+dI&LtpZjrbDijzH$ z{(i*&!rE|l)7YW; z`&|uMe5B9Sia+T+nmj+Kn=>;jet_{AB7%DUON_#2xHQq6M!%I-TZ&s5xYx!xm1BN` znBO4fQ@aJ7`vdFes6mlVIeVIl5YYJ(ASCq6oLs!OHb~68ixkszFLE51bQq z2v5VJ6wA`pt5yxzUyi8BZlcfNB!}Qy6g1HhWm&VgoyoqiU}2#*qJBeA?tWH;=lx>M zHM}wC+2KQnG$gjES3~6(Z1U~o>HdeqUkhfowhn%JtNMr!Wkj)h_3FB}HU$L6SY~@^ ziArjtK~oDOKtGA;$w>sycbmw3POBXdLteo~G!oQB<{Y3!BbFL}d>d_K#8fGTp8U;P z0Te_Df)x03#a$HL9%wY-qgZ? z{;_jKCNK@xQDh^wKHE85-FlU*WPa}bLy>nJQx+tJhT?*vNIw@}xATLWb*n8l> z2r1t%R!6`79qKR#6gGC(IQ#ZQ;VZmw2_;r5DlL@K7RN}VJn-u)KwR5sAf^C*xkPs}HH}9PawcAci$lku1+*9_I}^EvfNbYM zUQH!Eu6i^y-Zpt{vt@}TKm(URtHb;6q+E}Inl_+z8*S(#{INBDoy+FkTpPx0>{`o| zdD;5(aaeK^P&)Y(-o7pGayK3Tx!7rcp8t<|sH_x}sS~vI0s2Zn@t>PGO>WV>tV;}v z9zECSTHL5e5{gJ$EzW=PL#?C-N4LGlc#)LYVb)#ki^`mql@j3b-Wklz0BZcxml&aZ z4HxZ5&bXo}`d{s{s=?%G#YY9RFidHM^gN<0x(4TZH`vHj#M+c)^7yLybK8Oj_hkQU z3hSsD)>GZx-LHRhd3?L=K(CDc_CbCZn?${Yh^K-Nu!218=`)_ID@FvTWDxD(Hfe5s zD}CBRSm;qF^^^em^LyQZgFY!4x4)d}o`bad`1B z?j`S8u97{a-X~aegM;-wTv^l9TX`;^xqp&+(7P;N$Vx2Rk1qr_eNC>_D{3QyOehH) zJweXLscgc}jRvAQq#Fi*16Zzik+Z0wowF}6Gd}R8E0>45<}nspM=1_*XTs2%P*f<+ zo1S;4dRI$67qd5&gj~%54?XTDsV-a}poWtp79{BzhxXj0(Sy2m>jvC92r8%V-meYH zVkP(yXgy8BUTTvb#a&9@sMq8m1}XK-!O2tko|?CcMA@lZ^`{g3+Q%5>$T&IC*o$15 zw6WWP%#dZzpFfv^O?TH|GrB6Ms(hk@ydvBHDXjBYLYw%~g4Vpg2&*eiIu4j^n&(vn z_k@s`YxbtTuD1A0A06I1OKSDFNF!~(3tZdZ94u9q+0^Za9BnQUoV5R$+D$VKL{VpN z-gE-8pqz@<`X`VB(Hq3!s@Q^t@-+xe87(R94 zRHiN3N62&C9LNxJ>a1z44Yco4TLS-fwoLJF;U^&$g-RYTeThfqJ~#?4x$q{=-Msm_ zk2mg03=KclloNj8V06&4b1&>tUmd!9UD&M1%gk~TBVMz0rHa|f;7&p-!4ySB3wC&f zT|3qgqB0R`5Z!?c`kv;Tm)ymTdto&9^{sTZiK$t$W`p)FDL9Z1L4f9ER6=m$jx+I!iZeFHOI}?y%;nF@}NP22uatR@ouLm4z2!n zR<|Jr0mT$SLortT>9Y8f|J#36mJEN&^ylcv z^_^>6DEP3N?YBE&pTGU{zZ*Zi>N@Z3TUEP#x_0fuMX@o{Z?=08b^1@YGspksvw!^M zzr|<&4Rrfo`>QIz_vDHe%qEvFUk-LYdo~cxd5>ROdPF2IiHq}C8Z&@RAVkm98#lSB z@$s*Zyp=Jfn4MVuPPO3rs1mSUNPSI@JKAO0%Vd1By%1^0-oj?lBiJdWXS*zVA|_PI z__r5){OV6QU&Dwl5r=oIN}u5duDuQdw!x8y96+zlh3JhNZxq*fJFNaB`@j)?o@cB- zU0mH0JT*a?caB|rRa!W+lPk3PP3CS?hc0tDgct7pY&vlx|E5#i!pJ=1#fuliQraB# zDpgjpKh^`3|9l0=j_bT*zm50YS<$AXWP4f9B!4F>$JMQO9R@SSJYz%hsq71hr}#Xn zI}gk$jEIQn6Xy8-n_G4JG`qyBJ^2p0U|S-vHh;=RC8~@JbHAWqC)3<|RXf0`)0`NS z4W&(I3KT=~Jyv|78zsOmj+LYnO%UlwMGwUl`Rs4MDJiB=6PO!B{UT`w0%P%UDPLZ7 zh0eLdTdf@glOQA_1&tnBUZDEIR60+H@Z@?29jV3v*ulUKb7iHcnjX?M%vzNR1Y zaMg5>_mGYU=B6@5TzsvYWo)M(O6x5UlZxYZY=Y^*yZth|#y8cz+A(x=ri-()v+cMT zB$ey&48yu$6I9}s=H}mNbOm6`j5ZpGFrN{kwNn{W!aR83*3X;W7<8~|BXhpWRxr?deTtJyvQDkt<1nUt{E@Z&XnJCK!hzS({Zx1~Ma!FuX@VCJn1$_9m3VP~oZdGodjdjVBdhf;I=Lf21~DSjUXPOCv-w%T<8L?D+w zkeZf2WIzgguU?_n7iC(?WYVuh%yL>m2Lh9&qQA#LK|3@i?jW2($0$`I=>oMRMIbem z(~TMzo@S2*>OhyXn-vmTn83{n5KDz64bY&gHZ|d0fY3%nYzRXSKpZ;fIrEx&S^yKa zzy@oHo>n&ah`;7)>RphTcK5lUsVj`OxAR*qkqpz-`%XH_C3o{Ng#ynW3XntZ-@e_H zQE!|T**z|PoOel}Rt{3{%RD?<>ws(<5LYII>pC3ClZUP9TogOe%F03E4hfr!UiAz$L0 z80Pi>KI&Nx$z9?fc{2myx3si0s5ysDE)0|JB=U`4XjbGMo(NHwp=^Hv_$j*`t>NH! zf#46r+rLZKu1PG!JZSUuw=RdMp@mlRSFL!;sIvnYMrsVIGJuv<`p46*Hh5Jia$_Iq z^M$i%JL;2Xnz2Q2jT|8$buQaG$03YgmSH3pPz*mB=@HtpaP1iMyat%M%{m>s1W%vXrq)c4JU%E?1T=)LD0`aEg&Jm*8Rw`1IfA=Pjye8nhj|{=Ox>8Z6+IWA z6(6c;H^GpeKH-l%EFR2n+_EWIuxDRMB>Z^}AEtd>{Ac&~s9nE)6mYsgPv#w+-DbMG zM^l;h-D}%IbF}Y|zPseJ^H!$xnj#$WqAbvV?iEg`V(2#0Np93S><8y{aRo1?0F`mdr1WdVk?_$wsbBl;-%0e0a{9DR9dm=Ay3>Jymg9mPT5hwr zZ+B){O3$O*av1Mnn~vLj4n#0}&Kzx>*7g^FWi}y&L$7(52E@1TONzW^2iIZi`ggp( zPnQiS4Y~!%q3x)BeZv<$T~159g9Y|l#gQ|KE+GWh87%#z70u;(L>hF7rX z?Ffm45;u=-p#j^IL?l+(EPaI22(79?#XuoC1oDPpjE8g)dcx(VEy^K5E$Mq(JO$R6 zOBAD+#7EM-!s#hHWX6bx2yO}Iv^NdIP}sXHQMlw<*VIZb&Q0kN z$G;yvC;=gj{OFwp`}Ufg`d%P1dk>tb zoM|T}G+E7!l^KF0S9;@~s{O)D#D??r#RM{xe!Pq&j_B2Y3V=K!QKgn@GL2!&uz7Xh z{E>|sH|F0b6*aQuITqs~5bnqNKVIySLQ%>*>8nf|exyc&!`9})sU@WsXxcQ}go9RP zd_v$0VBVy+KpK?};iXBJ7&sy#ZrCUsC!=1;YlhxRL( z_6_lvc(p#D3@tM=8&P}#`C6jxf)pgAMT8b$u9>rH1U)t}y>8zh@7%6ljgZC^lquix zOzcDbAp#G)=a9xV&5Xu({?~@6=&E;zne|==Z2r@eFH?)XI#s;vX}Z?cs{LP--6y9; z%nf^6n2-EhRTHr|cQUV@;_HTZx>V7;~Bo{wUs9oFuB=y69ta9rN$r%ZFDcZWMpRuI!OYf63rV~c) zQ1N1~y5Kh>{`ngd>&h1I*EfBgu)p$l<0s2z5VB`v<~A7EmBsJ>t_|KO(g4-com;$T zpOcC`S^7H@*yJTxl48{VZ6o>Q8>#CZb^w}2HQx_%R}{L%RDe{owSq2ivY%it+Nlc# z|8V|KsZS#KYKJxyp}8BTg`m_HlffEyN&|o?bSoZGq`RZQDymr1qFjhB01_ahY*Lh# zSGkm1pY!`mq! zLG}>ocd3{jic;7A!)=$Pgh+VjPFiT>8Sma|9VBKZTGh{o@!wxLmOQrb?!SKB*83rx zu~PlFi8q$C&Jtc+4*N!hu=MESeJCj~3cP$^<~ZDUGCaq!)*E8sQ+MJwC!LR#rcAu{IMFD(1Z`+Bm*i*9GEi1h!_EfeVFq+Rhlj z=2l$9hiQ?1lvVp^P6Q6qG*Wt;!Co=^VJI|!KKL?g9WvFu)XRBP_;?d-)J35Q(z3+* z>(5aPMlL+Da$$qwX9rUrKqu0gURr}Mh~+x7S{=vN4S#IiBiPdf1*};>EL<31fexnOiX?Rw2QjF-7c>$D0%NcJB; ze-w2gk+Z24!z6I#o)<^l@%_oe}M)tQWou0 zK5dN?=E;WWheWn-j+o#0Kui#qlRkuC?c; zs!-D(Q(Q5%xL@w{aul`erRUvwf{k)o+s6jsUbMS5jvv&mTle|(ySDQRf}IxJ|0K@F z;I?~q|ESiOUf~z8aab0n3FXV3=g`Ylt!QkMH=pjb#p9kGt&-ZCF3Flh%JF8R(Y>Ot zOGi+qh_S=8mks1|AQaHG=IV1`uJQy9fq+`@sIby1hZdVw>ZHet67ZX$u)^7m-okL0 zs$Pb6hM_!5Lyvs{@E|Rm)K78%pptD~0yrjlH*3$I{$ZVi`G-*}=l$D%ga|x_8m#-Q z%BTfH!ajPF@fIidqV(T+SAooLb0d3PS)7+N-w#N{Q% zCumNR>-F7tGAk1(xm`Pdrch( zK)$c&PRtD?Q2ojVc2K7QXRL~T&J!*ufFwDExl|GsxP~U6S#rr` z4B}q*6beYqd*fyUAqZKc=HFY-3%=q$z%o%3pi*LuVvm7P=8h8-8PZs>eA~t{1`#9* zB}}f`ktggJxTtZ4Y153B!9U*8!x6af+{czt_&R7%!beF?xPq+<*M9)rfp+W2xR;$O z+sWGr9)AsgZrlC5YrxRbCs$3y*wL%gh)bWvEkS2(PmTp$I@%2oI2tWH@92LAF4V&J}sm=L@@48~%753SGdjs)rdW(Pgt3RsRV$%n* z3R-hE%FBgr!+dH>?{|XP!^mo;&{rA(n{|#?k4Dj#z^vS17c8j;f^ApugnEiJl z+0Z^Xg+X|qzPjoikvtjqA{kXd~8 zcz8m2*tX=KTaY;kn7$M48fIaHwVz?z&6_usU~$vq5_~>x+&E#p%)pZZ4u%CXzs*B$ zqlDpjg8=zSojRh{wfOk+{-fFH)XaAtrWx(@mSG9)+46J|bB9e7Q>{rU;_XomQF4Zj z3Z>AtCsXS8nSyS;b|KZXO-Gh2-Yr)8W^0?@`%};5Xs%J-b@o zb2m|_HEDsu$LDdWNvH7Sg^l-LCj0`p8N73$*Tu?L55K-X&hg`V^#i1u2aO6hjoPc7-EKGT>)?sBQCI^7pN`?I zy3X_TOpsYIM8e7Q>h%u!C_W&s!TC7W(B&nXZ$1Z zUO71KTSGd&u?Z$Cp66-x7f_R9FLO3%OA+&vXLb&S%o@f@1Eshw*5&BERtC$XgO4v{aB5Ki?97S26c;Ij$8mMsZuV@eMW#GPZC97Obzv018~aZk z3$kv=Obd;nKMJw9XZE-!f+BuCZHn1M~ki$+ZUTjy0|&WxHK-Lkwg_w(k>o2Pq? z!zD`2oltDe)$fP|06jGAld?2;;gQ@`OH5-YmeVIlDY&B0odr4EgpE0W-M8#aJ(Qj- zNxN~(>&ir5zAC73zxldGe#dUOF1#7IcyYDtx?6B{L2j|H5fuaYs~ogSP`RIjXor8k zXDe@(w2mR&%fHwziF!+ZF0e-jqYmg7=hx@_r7b;L)H-*zTUc1i#U-#o=RyLjUt{T< z{iYfElZgwXYX3+GlxSSV8Zt5e!@&H5kaMH{=oln^nHGP7+}U90`_*(HKSgl6ys zEGb6OkP9~Pd0o_JMJ#7)2L&E{-VG$2E%3EkGF5v8Zxk&58DdmPV2u$xvGu~gO`7K) zwQ=SF_#o=UUmSY!^r_HmyB?L6Loc{?!*@^+l>k&&pPUqK%A=2GmIs?rLW!~|X^=qW z%d$YCdP^k~ugtO>$9NcDc9pBFKix#-nsnpFSeo5*LcD$BY&tp-%u%+=tOrF;D$l)z zfroemkCT3dy82v7O3K|M#&7gUxFLip{ZN8iI_ink>U;k!v&(TsU@N?t>xW{&lDr^L);%fu;_#EY+5o@b8&qw(?N-i2}pWCwWK(;JY@=! zhz`CLi^u}f0fV&-=D6SVt@IXsuz6`0c#NRyF+vOZh-ht+LfS`SBPfSV!q*6fbpj$H zDtne%!&7AZGhl8q(JEalp~*6RjjR@9u=*?TPc+D<$cm>$(cebENTj!AHVLCtb&<1T529$ z)HNk@ST4CDwnlxM?<9}m*8>?s+&Jz%T8o1jLPWyGbSH*zs{8@1c-$g%N(7sfHL&&E z)7&n&DI-4(CYU&+sr=zsM;?CFu9prr;K2~)Q)^jS!>_c+^V!^vgM?7ur&XyZzM7O= z6Q96GHriV1VZ1rtc1!ps4RrYKss!Lpe8R+sF92exZQnlE-Ase2 zHOrlX-~MC3loa9{aut+;*tbk z=@^IUN14WTT9HkKA^cBH*Vv?s)`bLKRkOe&X{oNnj1zrWe~UQ84Q@nTU&BIPl1MU0 ztWORH(g0cfGZ%784z{j4!g|}!OhQpxw59402S=9G6vkk_n+V9~xW`<=BIgUw(~3Lf zw%%WXqw5@!I$8K@l(p%Mtt}F#^*^!FwvgZ$1thdLF0Q@dftGpI%|19Qd#ONfXo3S+ zL=H%k%2^bhSt5&cl3OV<+?k3&`a>rlydPafx1FOX$@gf zu8ZOXn!AB4CghIKvprC!$)YDeNW?-RDKZZ9aOve>s%~be21t=I@jtW^m;|f9A;WrM zhvZetwSl+}4LHvLZCa75>gB{m_XzJCt_+o?jC(c4;;|Zr<*C$7wA9X7oU?pn>Q(Ix zxULwHTFOpJo>TUGdffb;r(qLFke@v!()=Vrqzy%IcJ4Et0} zp*sg+FqN60toOC!f`qxPON;v6Bf_=?mTiVBY^7EPNOzqPzEZf!8}ud2icl!wpLY6T3_OwVxfr%4b&=KdZx%(TjN{j}kk zRLByY0tJR)$-3d;qG@y?Is>#*qK}Jci3h8yb(vLxL{FhKr>|SML%LXx<84AP!}vDQayte)QsCO1JLnN5Ijd$PHo$uUh^tZJOrhBp&X;OXoA;d-qT3ePR0|W3ZWz zRTE5%edNmkMWlU@f*GV19gv$oWz%&m$xfG%P|Ep)s`ViWHNm`q;j#$dbh2{wRNRcU zBKHY;j%q$IwKfKI)U2&3LIigrgfKU7D;uz1Qp6WdoygiQSA0kXQ!oDdLs1!nq$ps( zg!a$P*3mqj4j;=596n2Dw=9TFqM9%}a*)Uf`zo?c;-rQn3<7jiql+_yq)iI3Up}?k zP0wiPS3cH^6?_<;t-3WIFkgt7#w$G{#k^%=6LGoc3Zh4B;===+xqNIZgXZ+i3tGSO zczlc>l!x^db!B*xH?hpct_J+*LLET;zt~4{>$f~Rsv`$Ki6Uvb-e2`t zc2YhgdAUit?SB52(sFmN?;QVJXKF(!3JzbpmX)Oqr&Sv$Hg=1|tEMF&f5ZULSX7o% zY(H*Auo2t|t%a_54t`uJ>US1m?-6Y7VV;ORNNV{fQ!Nd_%ktYyPs=3}0%xudyn?wC zRDoTmA2qR$nD*J1$N_M)?U+7KW>}QlLwEURgyk%9yo>J$6QA{gxj@&GHk>}=eKU^@ zENp`TQgqx%r7G)UfHrZanlIn~ETOQl(8>S^`l7vGq6mZFy!&tIJuTu1axz(f#>_y`s^ym@t@7mw_0(=MaJQ9mv<1~8C zNOVALZaiYD=AklEJZvy>s5&j;I_b6*B_HA%>l%@F)}RgNhz|8$M_zGv$brwzA&z|2 zWx%7jk>u@R=Tcu~240$f-%$aXR@Q>E3IYDKx#c(wY~aDs_Y9^w3xDAReP;-diI$To zk?<`?aO~Q|dpmdpgjMC)faeeotjiWWhHeOs2$AFS8`eD@z8>rF(c8hq8JgSV?NG4J zjc<3Bwu)+RC>h4i*g(TeDpYcATRoH%DG7(E^rC2l>y~+cY5nxqfZb<&;c$iohjXW>44x!Ugr_;6_*f!y4@bu&kLR2;+^}|B*>*JA za{01=`Q>g4u3JYs1bu$2FgtAzX_=Px8|EPzUGatO9465GxN*j1V*@D77B36u8>Hp5 z>q|TBx87FLWx(`;pqwvvz4U(Jl&A1cCK#)-hb%jEtaUdA1X>d;lzOulu$Qbi8}P^i zzs}mf)goo;>eS-ZuFu*B)OMfxDEzr=qkn|#q0QfO#Q~LiQ)Z=d3sBXEuYjf=37v?c z0p=QFnmd}`sQl?k@%VQ2_CY_5yC*o^+&}^!RC0}nzQ0k0EKlCZX&wkpRzavHV_H`^BuV1Hd*MV3_v7F8|TX$f0*B(01p&`^zhDEGXqSIQl#2EB(p| zcDC&2^HRZr@Gpa(O^#0<@KKW{kk@iu&C-@g4nP;jy0H=TD+dmCe?VkfSsa||Lv1Bm zoa5}~6dSZ#)Wp^E-*yH7=p9(JY3~t zTBInye9}P23wesw00$(HVCfR!D|!M`-^wW zh3r!VyW_i~Y#jc=hk7HOB5)EkHwLd;uRWfX)3RB(|Gr7wAd(&6f3yOjpy&>?zTA1N6P#(3Uu7UN$A8Dj;q`lIj!6^s}>h}aS zs-R~663ryI6~&p@z<3NuMvR-$R1nn^i*0pyTo>kUoG<4*+4XTk9Aw4?1&yL!bvP)Q zw1h1fa%W~{R+*&p9&+X74v(ak3LO7Bp@={(*c=9$@FX z%YY!Ero@=s3^UaGfI_Hr5?56Q2!yL_N3WDqyzbEQOx9~nZZrk>>9enNu$!iX%6-ef$D5wi&giu$TIYQJuu@Qh^Z(MqaPW z!1-2S9jG-nVZVj!{plgmeP!!Cph2OVK1ov(2z@|>i*UBPDSIfaw*w2Why8AE_>gEh z0-V!((vdSETUIU_m}M@;66qHCt?*ZZtb8U726(k%F-MCT0tUTbF z1v$=IK_lP>U-RIAZe6=d?B}+-Kr=t}rYLEp?LIg=_iHgXb`%Mq=bId6toI4--&IBs zNI)xw6_)JlexVpS;gybF&!>r_n6MYOrIEI3+Xsr-2wy==id|!mWJDZ?BdFDV;Ztf* zuu8)!;vkJs9>S%4S9jAtrnKEw-TQf_s|K5*=kSn+r1J^an@^AnvsxB{a>s@%h<>rt zNu(+QfeTI@{AM>(RHc*CUy3%&IUG^FW~0I2mIEHrmeX|ZYtg{9w=AxsX0*tprPnr9 zV}vS5imLTgu2dJF86Ms`aY81^+}|B=5mlv|%braAC_D4Ur{3ZoY0s8x=ius#v?T#5 zMP~i&e2w9Po{o0fQuvFx)*ctMIZ{34@`}}~2YPh7ux#s2vjQHF9hE0HLH`t_K{|Ae zU;o(g9BV6|c^HFM`Ye@ME=wRCX^%U-d^rlpPP@gp%}L+Co!{Av*w*4boG0qks~7CD zA>flbJRn?QNaPb`p=HeUBoNogA|7 zZ|tGiu#8wXg)pOCiJZ`_6xB&U6-XX0y2l)I8Phi8^T}T{=}~-f=&hh6r5srn=;OoO z_?$M4uyi5#s%KE~WXrJ2uLecMk!vi^Jt(GW+b_2Z>i0pgHW*KJ*lo72&LHp{Et^xX zjKR4dKc*@Qdj9o-8p&stkE>cxrZ!3N zvZvWu&h_)C2wk@945KPkF@3B2PKmq^kutXHf7Xu05EK`eG1pMe5tt_)I&0Y&PdT`NQ8G%F-$lRX4WbdW8fM5bA*j(LtMRx44pr@~!_}prf2x`Xh8Q@^& zGG}$_tI$c$8vBN(T%?fh=#pGd*0G?TD#HPFcT+hJ;nJi`J~z^onFsl;`fYr>N%KCe zTp^sEjyew-NC@815m}sPww<;_EtJ2u^^vHl={s`2y_GVSZXKdEoX-`TmEl^Oo8eZnkTT8?$Sa4b2sYswdKMQ@Fy zZ|B`c;#2L(H&y@O^=+ECe)u0&C-@}ipD*}}3H0K>H!U`;eXjZp|399l|0`4X{r7JK zXMScIWE!AvJ^BA7uQIC@=#2XFIP{M@k7ozDZb=nS7N}Mte_-@cj8PZdt)LQ<9u#H= zY%Af)3fYpLGg-~NR#8|nx-P7Fd0nA)ll39wnf&CMCQ;ntPsD%C6W~QOh{)VVrIBK} zKKWyqEBuECB)mnNeW=AGQc{UY8`3_y642v5bda-W&oWbW!ARlW9sz5MG)I$euFA+nCUSFp=W5)%>X9~)kQ$;1c=A@q_^pF#D&Sa`l+i{^ za<(J9kZ%hgbvS4k$88&ReGi8t&yLU32#8R+iT*$fZ9A-Rr_R<$T$Zw+x}!ron*yCx z-KuNt>E$J4{vnoLObtq8+j-dcu@jgPeQGC_Yr&1KbKGR#%Fx)~N1hQ>H6!RQI>iS@ zPz+3=pA>{Dn`%(HtdX5zIZFzqLR)jmHscP@iK1rQk13t_#`~!>bOxaKS!aNl8N^WL zg!<=re(>%RxeCC(x)iYp7*or%v=*w$B?-3>8KBWqL{a?t1t(U{r#TiAT8>hNm%8Ej z8}OkW80xfZcqJ`(%gU8Ad8FhIVXj6fAs(#5=FmJ!LlE~gieEYCQE&_-6xh>v@rKh< zsr!yA7bfRS!hlHo&QN~@Y?@bp!7ZgC3XDWZ+LX1{8`eqqA+92)@%&>GczgTwcMzv+ zB-gvbG_XyE+(nrb2bhbLqP!1WBpSn927`2U8T17m)lPxjd*0wQip0)1EefhWHM$gl zBEfRH^LWV-e1+u4o#EVSo=k(I4nhOqFJoX3xZL7PP6Bkse^Z#jg=%t#1kF zq*c~VU#??1d>Bo(c=JAFVA#FdZbI3c#BdDtQ9LlgHoT#x(#ftzpvp;(gzk5aT2h!W zWB?4!o6etKIwz%!l2}zfb>aXt0#)mjpBFgl`H;RqbRHm%p8j2u&c5J4T2N;UfTMA1 zQSmC!DhoqG={HqNMroL$=zhU()|wN`hH!7v2u=eYHwL{O=ku}`fUzw9hvT!r6pyO> zTY(KvF?GO;@)l;8o`o>>XH{GC zHBDVA&`p~R!I}5UxCE`xd#ab08#PtnLqw{Qa}BtrCqR@?2E+RomP}P0%<>|_On|wT zw@>{09yNW`zeQ#A_+!D+WL=4K(pGM3{d|cHL52j)*8TWL?it8J^vYWYIEP>mGA$9v z=MBKY?I7N@X67yKruh%TZ#1RTH4~{{9)AbFxpexpMS6u<5LGImkz|6vL=IpitL8#3 z9!iv8ga*ZH7qxBo5?y``I3daQHHw{0DvK*(u=Qif-&`a{AF%6 z0Zot*H`wk~eFW}6PVFxbOnOlU64mo3oH*h8igOhE8kzE18hU~Ban^4K*R$kwP(w3% z!^GULEpyLr#r^h@DIaKtEH_X&W5pXEa)GP*+nYz-VsC-=d)={l7 zkxEE3y< z&@BN^pZ&~Q4VdIiHC>JDcoL$+os(O*>}lfOx#NFfNbfVHEh$w|LNGH(%U6tS+rr6ofx8$w0 zagCbr(`Ro^;*&*GpNne}i_d?#kdV zT2uJu4rT-U_A_FN_J45qCQw!0>6SOCG8L`F#Au?T#wmaz&N$D;XgnwmD4?PkgCj_Y z5(iX-N-T|0)EvZFiGuSyfT9Q{Dh3A-1QAeBF@m7tfPx_K{Wcz|Qho33@AmzAb@$h- zb=R#39L{;)|N9Jk?`J=}*QTHtM`s!)XUA)+oy z!)Lz4qYj004N1|JnhV#2-t0}GQ-RU;n9}yV=@N)u1tHZ09f(k3XlpC00pR?Lt*d=z z&;=vq+cNGum9_6$(?C-YA_sTmFP*KfC#JU!$=}H6v!>Z4x3O{BcU4muH2d0F$iunt zWK88STZNUtmaS-$$U;u^F~cQOU{XXwKcIQG;jC&)X6hKi?^A9=%DrOBlwQY23Gbvw zTfds!#Rg;Qp2&C93-PdPg99Na$o&-XQC6@EQ}(9agDI2|jm$SfZMWM3V1$3)hNOH3 z6pZ*b75*00K6ggU+Us^FAdm;0jJES4lGILrcn zfQr^xJZPBwct+-NuC*?S9Pg42P3Q;Xk$l3=q&Giv>HNzCdo#0@9!xK$9htODX`1vd zhaIgjl|`FdedNf@1LpGDvLaj)+-;T}G`P>#hXGg9CfX!0?%{UV+ValCrP!qr^|zB! zT6F6+MyG>|6)>I#Igz#tHyO9c`wTg(;pgONMiLl(^QG1n#vHB3q&x~4pHF%(97}k2 zhV40gi!>F+Ri6~UWgORWe&V#bEwU~#(`2Dt<5s>3dkl*H#9^cC+eYHr=qvN+#PVh} z{n|;%pB{}j~W*G;u$TOf#&{oLs3Lde$m+U1Q@@<`(xr&&cgv1 zo>BYgup@Z5Ee+aH18`9gQ{O8`pMkTaQc3h2=nylpfgt2^W{6(sOPq5ckhWm;o*o^< zKXn7U$M=)`i8}9NG-TjnHuROa=5xNZS9TxKOx_1ou`at)VIq5N#&~LlGA?j$Mbw0y0JY@^lb16>h@Jq)qzmw}Eh{ zgN&Mo%BsC}sLOy0&REYH61(R|hH$_xfs$x*IEp^)ML?mk3ya&@`O0%w2+vd;2|`kF zhXSO|3t8FAK~ge|E9p(Ni`6)B@Q*u=-wKTMk~1ixj-OSY0Hvq!s6Cxn%T%8<9#Iiy zWK2LhnsoR8b%rriDjTk(BV)fEP}OCv38eB(B*Qsk-6{N;X(dg{t3LuTm`bQkL%R0H zLzDC?6Xvlo9jU-*WHRn;I!#V<=l#K>40)c$P=Gr%w1{7wYE5~?$P!j15I4gr1@yp~ zGNWQLm_YV`9$yx5hTspZtnyf;qsM}`sQW=pZE>r2vl%@7G3Op0U6t@uKs4y+RSMx_ zxE>i22?xvl7IGCFPHVrM=C!FZM*zH!M7}R9oSQ29fQr&E7Co3s9Rv$akv*<^Fs<2x z!7UqFX~#edQB!s>}=5CBAjcl0-wC2tKYMG2J*HYRY4$Icnq0R`G9GoT<~z% z0(SBWpVl%kB%?twHc3cahfK`nVfRT}-fz@vpN1$984^H{2fvD*vNNo49EuXI!!?&RpkS-xI*K5QR^Ak!2Iwd%xz}D+5n0 zkM#OL_NxL15x`m_MV_|e(-4Q64_+r%46XQI9@Y-+Y@2Pc0Tb*8Xy%1I{eUj3tqKU1q>i1h$Os8*daOJq#l zdi(7cJmWUxK_ae`9*;w<cI=;o!hCmDhE^>aL*f%}^4-ms_7rS^W3E zKcE;@k-!Sfmf;a7usB_-C#uK1aEHMuB_4s16KxVFLpZ!*W@cKtr$P3>Pn z+kClB)4p@>Up7}(M)qt(`*6OK2qO6>5G&SO{zL+n^zs4OVBWrxB@|%z!w8NYiAwlF zZq}p|%}htLP92V>(-rth*^8V%ndEftPPsZ6J-G;aUSQy&A=Qq%#}n}&!S)jBSCwdcooqR4R;YIK?>fU#qxrRYucoq5t z-d241*U?kwbcM!Z>(;I7KZzOi2;{+${+pi+)zmM4Zmk6ud)J)&3{9x<_H4UeEP%gt zpbpi_7179GB#x-B2dBa1eGc|1r`GEE|sm;Sx^+U@9>x?sh)<~O^Wc3>(-rm-Ac;0ZnO5VRrDZ(pgB}K zs%JO=J1OSG&(kqlrF=eMKrVf+%ySTW;NE_Hq}vJa>=p9HQJKMrs5A!CJv~Qw`f*As zQ6cIFmXA%|m(C0^WJi++Ww!RIy^;vz6#dst6$JNoD!He2NgJnq>qIymok?uu6Xnur zNY+mKILRycaQT%T$5-OsL4!Afnd}XWu_MNzPaa||WfQ+Vy5x(^eb@bz{nPc=m8ZXJ zXjy$HGyma`+u|Py^ei}w9kr0_ua%?(TdSp!)Hb_WOeMt{1DqOA{{6R~`T^>X;MWY9 z47!N79&>^h=SO2$XrA_;Cl$j~g?WBE9Mr&+d%BOYm-RY0wV$Vm~u zky$0!IT^E&>5=?JPLxH z(z!A26Cb)#=0*HUTC`uZqK?=q>iZV1ktc*%k;pe3`vCu06zyoaCp&E6eruPYvc&U>@B-4M5WFG)xiaIB$QrT*Y2=6GBx0l zbtY}fa77W3h&KYZh#K8%Hfq!rs?s&vpp8kYZ=mpL<%a`-$O@_jlTnNm2`17YtGt$_ z{yrZ?EBUh~Be)_Gr!zpUQjCjdFE-p8L*)nZb+`!6jPO#O4G`^qscI3j>g9+(Q)b#< zbPCZ~;qYDwuicZ%UmzGegoLG#z}p=dhT&NxLEgURIzrn)aOozb2ek?&hk>VA7f`d; z=Xeg%t+PO6v>UJ)^8xKM(kT)Y1p_B2N?opS6!aI;1&eV6Myu!i{hH>(KcjM!7ofHV z!_#l?+WP}Zm&Ae7f5PtVg1L`*^_Z!93yCKdTKN`$OpC?l+G*~d5R-?RCRtJqNaXE4 z@ymOxEQm9iI{B~tGwF9!7%!I9;>eQdhOVBS0qHeZFVskfNJt3)?sdY_3sS|#V~_Y_ zbVnf~MdS=D(`|(z;JOqNBlTvhqod>lB9ATvbST~uIdG(yo=Qz_G0Q8=;W#Z7LLe$& z_O6cT`EEYfL)bF0cPA3w=D2SN6}FgG^yJR8xLDwQLG)T~CF6ezvtvkh>5;US`y@$N zPDw}eKz}+Q7L)`O-giUW3E$E6P1@H8;#v(H57uagHB$Iw#~6<1*R}I_Ll2)L{Mjkf zgPRR)D9RX7@&@p@@j}-#ryR;4JLr`T=LRt&GcLf zhE?&+XB`71&U@c{zo+f99*NzfS0XVFykBXBl`T)1eH%y#uD&lEm(BVh_;*|aLugqv zkCc1ka0tT7kvoTc;>*&~+6VVLAKXGcKJ9Qmt2mB6f2{yHw0CJz(P<{6WKhBV6J)-J zpF11}*2A1}1x=ujO$@X06-vT08bqglc%PQf!)b%;9VG7W;WXk84>4x3n}aV!2ADS9 zy6%^VZHlZMh9h%5X;?r^c4`^O{{ECPVcbdh>pcjhR5X}u6$CtkAg>Mo`qmziW{IVa zz8t!}dW=bw8*bS&ZTf4`6d6b&g#qbKBxNl(^n!D7`|QbZ#8`BG&)c4s&>BKp@+(%z z9UL4tKubNPR3dICo(Rgm_BacdfzCcdsbBU>p^eFn_Ozz1UuWIExW|^5f8?qeG{ave zD~aCvDyb$*rve&ubs&|l0jOh}ZVSAP13O7yuS@_lBz-HLmIK*cR?)hlJ$l@HxS+G4 zc3@X)moIlrpXI*$F}ZwlwO@I5u-qTP3339-1jzq(PqkmkDt1O#w&{mmjqQF~?W!Hz zc!~lrkBnYeIx?Nqo?4U*b~Y774*N89_Nu14O9}=qMe8u@iAeVt7e$XopD0 zfpGf!g9opEtLwX9fk~2u%!4AO^rw`uh(?VSHgV@%f213g`Uw-@*R~I`?pTCdpgI_2 zBm#~&ot@QVWwXuWA0*^g-)kCr_Rs#FB5L9pa)NdNVYO_7tsraW+os?5Mg$?Txb!wF zdlml{dVu19;lSfJj&Hv=Y+kOzGTZ&nRwvI~6PhH9FnKmOsrir1wg*dT;S)8U2_uUK zC{MMBL&&%S1(ZrmC+6)ZXE(BQVAzZeu)6`=AMhjr^;{EmNK7+n)&|=SV0Z-&ig7%( z$K_Z^B-t^4EYI)ZQNa$6b90La7yp(s|LK#S*GhVXHVYpArVKS}^S*%pA%NRpO&W2~ z`e0f&cl6I{^>8JeHhm6SeS-sebMS$c%a^d9mr`Vh^dkc=kGIG>7!H(+nmEP4x=Ebie&Ephm#5BQM7aot?_ z^83Wnqjyy70-;HAqz5so2h)Q7t2XE8urI~bthp!32SB%~wP zRcsgeWF?VNWs+Ww;vg4CNC{tWCVEqx$X!HRR=9MU+`NcGn{pnA8PxC?WflD=seAnk zzc=GDU-0Kpfd8%)FhbHG+16TEHfvTteTPMZ3(P?QcxZ8@Bs$ce(&lpSrIypi8EB>g zLQuU6exQGpGzJe)#Doga6Jf+yKh? zwhgYKjF5DJ8MX(@+C;V88;_*t;iK|$zd@2~sWg)bA{r;71yNG78l0}Rv0+ftK`7sW z)Fxj)$YJ1KO?+L(JYW#@8KVkbZ)RorVGk}An`sx8*vk`3Y~764MyxQrUOxwxmYI=C z5&-GW(*%_+vuW7qWrt!8Y>$6)U?u-WML%CNPlqNkKhyMsFJcLE2%#R!DN0qK5rh0b5f%0{0851Ee`r-NkJg$cWk zzWsgeqM=UGy_AC_8QBEjkI-yg+~5KxTzO$_HdWnDhu!f&@#@FDS9-ChFP|j{G6sV{ zk=}}meGT}jN$}z}pDQM|kBme(3KE}2!ov#-Xsp;*ICowH6o2*VZAhI^`5o6U|EGJP|Etk?;u|RQwz+7I%CCRNYw>^TxBiW> zNx55oRF+4t^756vj~-utz#L1r0${iBmh?M427Fq>&yWl`lPH1mJE$scZ4%c^hv;llK-`UlgMcR%Y>^&h`A zs>YwdZB1WizN_&E*U5kTr&=b$MNlUFQpL|{->9E%PKuhPDQMu2SrBiX+h;(0c4P!x z%@@P_doZG=bv#H&%AxVK-VxV1cC4rM_KejICL00&)#p1!ylduvuLcnc0;x(#kGW57 z-})$U`Qyy!gFpY=m?orr?+o!&7#iR6;=`NHcnKL@(@07_kVql7HBLXSG2h`Ix7@8?R zlYr$TM4fIqXLtT!vY{hg0e&15A9g&uyM}@ZtS#Q-@G{~bX_;owGVA6i>8hz1(e<{GqXtp*-^K#f9b9!wXCnhHviy@*9;)$p@d##!Qj9zZKa{Qa{Xzy z=P#elsn9eeZ2P<3CwEKJD@!+gV7h?T@6xW{{y1^x(1Uc>+Bhej1i9XZubw{7K1aEq ztP+z+A+%2hqZ%_ZYTW?#iCI&+*uzI6`&)tr{;R2{zy|?irOx)HBSInglZ7^zNfM7# zU>gZB7Au2q;wcEEnikIlKW^pLYSf`VsJS{U*VM1d7{SaCt~D2A(p+n(TWwsz3x9tz zk)A4Y;GHZCbcv)Q~Mje5*&O#en|Nz5rme5ejv)&rFEUf(W;~e@ddrDmI__Ad`{4nsz(%sog?D<6Umf zac2rb;xO{xdt3rfX}8c9ZN9z0bX5nA#x3~FHVqhNIF3_}EARkKl*h&X@zF9wUuz+* z8kS7-?C>+SFv6oL%0aJ_%#%`a6-d%tAN3zReQx1vgd0%bUgJ*B;@T-|qxf{-pTucO z;34Zw9+(PCNKULoG^vN>c>@%o(<(6;ztifScixfQ6Oy`GT&$o4S$|1&L(<1MN#27h z97*Hq_PL5y284cVWErPUuxnS#c^Q-~Bb30YT-*0><9rI67Sl*^8uheYRMFjc)gXai z2{IuchtM$QXd?j!;k^mDc?%a-drB<;kTZCplm`M6`7Dd03_fKb=mpW`rTFFfl`S}X zf--ZV+w4q1r^kMFFcXJa9x4OQ0biy7gq_3uu)*tNtwWp`-CM&cPE-4K%c1GnMu! za@waNYY>>R^$Poag=teVsR9l>O!XB)^=V$_3enH90w;W*S0M}_fVqV)CU)w)5frY` zAue~iDCCK;+hV3ccUx6Z@RU@HfdPQ4>bGz74JgM z_ZC{1aInYF=b4v%8JY-)`-#P2`*a2bg)LfCH^v02uX^@jjXxclDhCAZ5e+~8cAFV= zaay&$o0GFalPf_jwgcbA-isnUN)7}%*{S>23$kyNdb=3FP_zkSWux9spqK$^cfV`w zon6Du0adX50ht15wgvRm^JPPW_$cNJpb=zPZDAN-9o;*Az?{94larQEfbv>H;t@64QA@N_G-ius`=`u_c*VAsOugZ8O&CEBE+j9|2-WQaaaFK7d+l)F)DXY8$S zO74-3sB9Ylw57+Y^Euni%&r$3KJPoyN7^zi<`f|(h-2=PFGCy`ebBInc8Q8eL6@GE zQ$|8KeRND=ex@{@>&FJJzHN7qQxyxHCaDh;LDr+S?c4^O4W_x?57}oYOqa9w>f$2} z{IJ3cz&Ng>&17um!ZiU753MhU2|_Df29E(etff1f0&L}xEoT9aw?oWLk; zZ`w}1+F0EUhi3%smZEaVA(=c=AGO~Uw629?3m9BS#MrWZXxM8(^9Semgpse@5gg~5s@)zLXp9;R} z=**q@_V)CQNF8K+3NT#t{;b_`lOL}?q~QhQA~lm?t_#b>QifYd(&K2q_6yb7Qcivw;fG zWtAS8k>ukqUuim<3#(ls1ZTHrI#`PWwcW|iG1f#ry@wGjhx`;Bk-M%&NA{Ap6K^K}% z^4{jtDbNtAy-~)42aa|!#<|0`y|tiKwN+0&HiR*PT|(Og96LqMl;^!#Z^tdmk5s7J1K6{Xo%ZR z59YwbDwGSSAsXJ92lT0*A?C0G*npr%1R&ozGWm*oj#T#YJ)#{_mP@$7c5aZ-^|85! zNvI;7VW$O$znAjG^154v7V*rg7}?UxcMnQriG*-=vI<+WcrlNmi`W3 zZ_Scd>-RniPHEUEcB@>idTRf;roY9Y%lWCq>)XBW1;5qg zNiS2s+W6InHR^rZ_*_ZzcF|MZmJK&mo@QqMPCHuGPrVOyg8bBC$C-2xW{v-T#Qrh) z-AlDC*(~r><$PzKzsCG=Uh4m)!L9t$|4lFbgXc^WrNj?7tg)K4An;TbGp`T-D9`z? zch&#FAN|(`etO`k%AYe^b!1=K!{D2iq0Q}ci>&5UJ5&Gs|M$=MuYc~pj2B$)Lh2&@ zZl~OAmRC3bXyJ>}%q1rej*mV-Q|(UmEWpb`^)Wm}S@-=}zUypEpKJ$zHL}8vhN_tZ z9q>`d>w8%}Z%+YCJ5d_c(k=4R9AB4=a}Aq5wkxv6yM+I z#ro#pIb#Od1y{cKeX72>do}k%*MWg(^Zo%ZT0mKA-w~V8t{*RJ>7DWWsWICY-R~UH zyJXQhFm(o;817PEBKSf5mQg?@1|rrz@0y^oC$5Kd^cq{rRfRff{mn^@%|q|Smx0Ox zB{A5BH*lMD`j%g-T61x-?l|3 z_&A%FRqyn5M&xcN**y@v3KIs;Hqi%pbi_6=sw=`n`A!l5sz&8AtzbwvP2o43E>8L! zT=929qVj$mjoI0=vL88yH4BR?in&CbB;TT?|8izLuSFBzM3IA86Y3rZvSiKD6-!Gu z-HpsG*|>Vn!sORh1*zrf`Ocqt7t1Umft+b!UN0pghrwejZdXIR#)48O58r`Rh!0*&s^<{RgsP!N~H~< z*|bC}B^0;NZq>zkdVM~?Z$d(r~OOu0Fif<@E}Q;S|x6-DDMmEK4#wLn3LSVqUBl;@|;qO>oGY>zp~m^t{C` z^RH2~G94OOoRaWuFKPI9B8dypT1Ro2S~ z*S?_QccczPqU99w@!axn5x8g%3y^+=zLzRg_7W-}Y29c#+i78GZ2p?0IlhjM4!TT1 zswdwv>dm1fN=P?Y+yi4M4x787bLKs{{WsL7+W^&bK%P`=i$_PvVO6(=)eCRC zhlQQ3^Ivz%yp&S9&~oySTB1Kh075cV$ee7P<97LSUgo_nI-EMcmdl0ovK8gFuT3hT zRXwU!{ag77+#s6Mg9Q7&T#v%R<3@`Pc+)aqxpx2l2j%a*M)j%!FSL$J3xd)pq{&y& z8YO|{eBOKh?K6LqK%4ryVt-?Can#HCk?#8lat5Px<8S@>FLe)iG5Re90!5iX*TA43 z>DDBZfxmotv7Q#1OGJmTQDOsSbwqKn(;k2b04lHQSF2j9yVuj?vXis$s>fefHd=O7li=wX$rJHJ&l-ghH9vxTsY*zI6rR%Sq zlPwAZ>mqVsG}5QO2(iEeYBcTyJ1Z{Msp1u;YHOftl|^U#ZV=veSW$e*#dN^lIs5kQ zOTv9Ha6W9Td)0R=V`(a6mmu8^i$g;FpN!M?IVo)jVCH}CY*dFs0G=$Mh@OA&uK@sg zRxKDsqMEM|T+&FUz9cC{XS^G^qsZOwR<~$?oqqln1|pLjUuZOR1TJDO0I{z1*HYU^ zaRr3BIG^?>tmeMXyMsqKL`8c&Kl-Y3=D~B9ADmisqg%$yIj?{B9CYQM^G9EUqnA&B zvt47M7AGNkZs$6q&W!_9jN54QxcZNKMPyA*Cv5NIf^OU&&8))Gg+oY1vhP>S2Zj== zffI%1&Cr*F}x~^x)Ogsb3t^??mN9)zRDXo?H^&l>m7=*Mz!a-emQX9z-{^Mj(?WJIP-w4 z)7H3E8$(H?R(nxv^ET1aiBvy0OGInhXW4Cxxy&JVT+V6y}a5y zIKO^M`A5ftoVv)Cstq_o8Qr-_?p$5*ojOt|glV-7C)e9H$51 zC}KnBYTtpbr>8XR+^gCZm(Mb0Zw4;tTxB*-nyPPbyHH?1Nx9$@mlf(#FD)&LitFBN z(!$L1g*KLRQ~q(CW0!o)X}`(rUlMzWR80W<8liPTpT6b%ODXw5qh68$Z}lU~3Wb7V zSGYylpMYzX_P>H5SiO3s9>T&j^s|P^HdF4`x;H(3(#@HarJ^bbESha&NbmEN3KeqO zqvRRM5Dv}_nv~Mmogi4+qtz&8Qnq}7#{1*u!}{=-hm%;fL7UD;iHIQT`)Ed1;MG%B zQ#SMS`UK)Nk!wgNAo_#=WMLq`Rm%uYinnf;nVI5~9U7OPUbb+1mHguFCeozwD?KGM z#6l3TX^O{BBcBhjIn2l#9CB8;laU1N0qNlPHPpF|{ z{F0L>S(hdvg{qx6Y0`FBlxFkx5t4Hl)003(=t@WlxX*Uzi)Ilo{iJgf zG(@2_PR(#=oxiOE@MK!?<-rSnqd&{vuxS=MMqN1+DFF0(PD8@Eu4N`km67V;l!`@gnpt70(D&FvtK?)6(k2SuaQ) z1s_4k-lBP7{){?CJBTMJyd4xm>ysRJ3^tc@E75LpUTdrk@o3*e(N*t2#dbt?m~bDp z+)==gR>L5pQXS0Oeiq~wxzuOA<0Hd<+pSOUrrmYAz?+3^A16j!Ogb_-O#=yIfXkVB ztX}fXl4dWwjWr8P?Q^>~>k#d=?Q!VkX%3-)DJWWlI79{)5P*@}K40qRc;VFRf8>Z> zPV~`-W5-qTztAxN|`z! zl_$&@mQeCHpYOXaFo|}|EZ%|0GaLbzrwGgsDwVwEPXTM&dbM4WZ_4lf_xkjy+9z>u zeAu!Pz|>sA7eQHs`G@vFFN4oS{?Z_-vRO3#8K)96|BwD=`-XlUxNuY7sST&pxa(_N zmw9w_^xm)j(bJh(^!^_pVk>{`|0jLwR8yZC{pnFK7Uc1C zYwIl>TlCAi2RB@zK#fYsHUZ58Q{Qypmwn1!M*!=NPtA^gOe{d3=R9&`lE=!Ydm@(q z@Wb4YcvEe&>Ie;|nZq&a5LVSpn4HeEgNWzjMfVfq;#!;UF}?7rvFf$0Hvk}mod=#; zUS8$CY0k<2oH=X8%l%1P*60hBaEShslWOyPsd*!MEpBB1{1L^WArjTeh|x6S&FLMA z+^K^(+N{Ic*iGZ7u0hsHDsR-De0{5h0Wo+ICA;kGX(;5Dpk3hKxwXQR6NL09nnD>D zXvi0rf%Uc2Cxbm9?C6HiOQs`6)8BdbwY5J>sm3)OgCH^Wr6gAT2QAUn`o68- z99jS4BtbL(LRaVvd7Mcngidia+89cmZ_CSk^*P>rHg;Q^i3%_UPT--zJoZX)&2D|gW5agB{kO|Z4>u_I%;2O$Fb4Cp<1d3 zwkcnaYEk*nm=YSXv*27#F?j?=(n_XZytTm(3oLgro~}W1m55-p^}+;zf=FmhibmWz zKkH$7BE1?36S7X@o2@uYM|)EPb}HBln5oea*=e(KO5+@|e|R&Fp$WvrQP;0u7fr8H zjvk>xV?Y2#Cny9oq{fp;V93RfPvwg=g3ZeDD=!J&(%bIIT{ z#U66t^x6B6BTQw!lPbUg?nA%~b)&X2@&=s0^KOs&Q=1ylylS*r13}=Sx++>fO*@6x z%a)vo!9Q>g#0e6r*YEpbEIfh)8nhu6T?RC;vDsV2&vXGI>r43)I#pVQ>D7yemfu|A zjW$GmvDMHm+GEJLioGr-J*QXFLHKY0#p@uZGWKSopbuQ_;+IUBTzmLj9(8gxSRCz# zk*LJfl(^f;cv?$oRB11vz%Wt)hGSD_S2TJBISGrS0cIT;GLnQ(t2DVH>rc0#8PhNY z^=a6QtO1w~W%j;!3cWN1?jD><(wHx$u$=O(*Js}AS0QuMRbn7=F$L^bCn$=(o%GwP zzT`o>XX{KK*7yP1lE(e(!;mp{GCBMTCS&)~(6%W9!rRCI6rYXlhG4mEfE52wxE>gy z-F%3t+yQ>a!^4H77To^j&-AhhyIOsH{x0e5@`@MnS1}3hFtxD(AZKi37`G%39D|l{ z75Blynnse8XmqXe!;I20>#Y%k2V%*l5{)v)gBFT=m%yXA6^#KR?8K?>CNDadT({9b z+-vjy;MRV$mPZE zZMEC|_1m{8$)!7_YV5h7NRCd4 z{PuhK_07$v&GcH}y}mA#@>Q^D=`jp#oIXec>A}=}>B&ZKu5O=;ebFfu#h>75<<>Xh zaT0SP%_|_p1F5ZwR84SzG5g_v)-dn<7~?NTtXXS3cliZ=bWtf7|*~YqTxQ;X;!;9@Hd5DSf1|k zX}exfOYW&hwhMXVaT2L7zvE@gma!m1GuY}AK=kH^yhy`Bmvbr~JaPU6Vr)3e1A3Vf z&Y4rXUIP=NC~~-~r4NtBzgMc+3Whe2222ntVi6H{)M-)!%V z9RKe95Z zrs{aE<^96x_x%E^n)PXaG%U=%pv8%`XM1?_R+fKu(yv$cr2AXe4?A@K-o20Vy=%Gn zeb#s5=FPWkzV8D09eDfMB*XekMO*4{4G9w(D=6mNWz6kjQW)O8RYCGplLx%UfsjC5 zqMs$7+CMg$qUh^)rF=81S-=J9=~p&Z9TqA9DwXhitxX1SXQIzg3z**!b0qzf8FM&0m^0wAa5h{<|Tk$Jy1nj#GM=5cj#!k&Omb7Uulr z$PcUVf~K$krjGvaa3No9ylH9!I0>t_8$QXr*ZQq9F6aIi7Pjg4OvMy$KD6cDP9@Fe zRLkG~hLmbNT+7`nzy62Bot3}zpT8FW9UbWnD=?cUJN5x-K!6N76klFe*qgTZ@h6U} zd#F2?99^k#-~RFW(SLrGJ$8(Xiw#t|25}izZQ|l`sr14Hw4R!gJevt39Rz2ujv0O7 z!JgSmQJnUb`6axm6Qn}M+{y~1+;>e$eOI&cuC$;sma6se8ohP-f<7lS)r3_YX=vf2 zLoK#OTxPOW-U(ocr5oFiIEGhW4oO9V7XtyNbO-3_y3+@N>hSZs;!^#tg0zHxDJdyW zHYwC2`N>TS+ew03%)$^Yum>?A}JB%%RxfE3ct8rMkS=K z#S7V_AcIx(7OfavaOB8MK7QdnkTm_HxO9LZ0cd!<3@*0c(qlBUXWIWmd$t2C%cetz zk#ep;URQlqFL-vHblrPaZA@kL^Wt`L#u03q5fRHQ2x7QU#&rAX4OdyzCf>0b@a@`K-2SEnWss`70jpeUK&v6@2x37Vuz&_DH@vhH_4B4pXW6 z4}=!>?l+j=mFSP-Zk}vTL&f#aqt=jwL&MZGKZp;{cW-7o#12*@=Gxl8rr{)w!2r_N z|Be~ZE%MS45QSOG)SP@q73q_6DVGOioj7qq3tT{|{+{rHQZ$d6N0_}TD&*QpSFbb2 zBjF(WNjVWzPg%mSw!mO8yvY|d1J4AnX9qcc2w#JaYV}KD0185cZ8BsgUDgc~WJNnT zIBE7)u2&KqiG=|Sc8x_TXrVqZf{%dW+KApH(xEn~o^m(t>?NLc4II()4KiwNFBo1P z&>t25S|;DMU*SYNI2!Y5iPXK8(&IW(ci9(nU8Y_Axv#Y40q*PR2QZ~sZR6ZpWfE1u z;&ASs7PsI@iM3{Yhp%sT>6d=VZ#GjJZ5v0jTmFvk-TRX%N!7kdkePIx^d}cI3a08Q za=e$FI?9RxzL-ZHW9ytYS4@3BEAFGQEJp_Fv@}TQc_#`)SX->DN|}>k4!MgwBJf^p z=d)6CuInjy6S^^(x?)JHPj7M`+n%zExY&>d)2HTI{@jO)*YV+3YCPv&N~$5ciI?JhN^oH0Qm3ybc&qrXlA*mmB1@*l|dB_p%w5p7zQSZUf=1=iFtYRyGhn#w02*_7SKz5KLlS~VF zBBdh>+27w%xVR_{T)aY2Ycc0A%IDd=pD+}WmV@jMp6xWCum^>suJ4%b{AVi$m@7;t zxB)Wq?&re$6S*&_gJ5pu#uG7^oZfy>OG`d#fF(9H|P_C{!ZlVE;zP;n`jkX?sben(xrn=bh9` zV;HcNLE4);X~YJ)lTZOPOwn1zmoYNPO1<3{o{p84X+G2rMe#m9A17aOeLv=|Hgi&s zU9U5Kfi@9UEDOQV#Sl%$uFdnBhfbZ6fgSF{7i5#0Ir(&^t1Q3((@;NqY$PnnMrVa= zUqj5=AeJt^7dSMDm#p&VUr`+7kcKXc2hrD zGjn2`h+@)jFTqNkv~bpbedOo*S|>A)*eh`>Y4RF?!t!2ObZ3L+JvDD; z)p&tV_fg)XCYT=D$odrzZOx-U=1x*>zzOYR%=3^1#d3Ui^~BzlAnrsF$Godt_7s|F z&?H0RQ63!kBG7fy&~+5>As#bamViPghx(08hqxV_2Kjk;i*4OHIi=5EN3WGW()eBz z*9D*-gAZ7CSS!&s&TwDjPk}cX0}xPd8^$i{p4kq(=jjT|(#(?SlzPZC2S15u^UflQ znf7TzY*#ST)g;I6M<9wDhdSo=7O-f%{Fh`wL0=o%ce^$dSVEMaU|CrpnYW*~ikJd_ zz8jTCvxulg6JfoOtX+o-pM|&*NGSD5HgUP$cPCFoPz*!|zBaGaF+_mjk2qLaB!x}L0gz+?k@V04ks6~N6=vR&AS&* zgo6;CKXq}~ybpi2?9U^Fqg4pp+#b^Z)0e`NV>^2H9e4Au@uWPfqMIiQr-2?21cIXl$@U<#lHRIE)6|;Ur}13h;Sdi%tnK3LLau3HA3MCi15t zmXIl=5PYJfkqDRY^5hKfN07xJ)aSZ8eU@3NtFsmcy6igJrc>-3g8YpA*e)1Je+8D2dKajA?dHwnjQR0s+|;J16bD0brXYFGQ*91f zZrGdZQ;G$T(mZuoutFAAU|w=Tp&n)wtj#a}Z6BX9&#ZmoJ{e*d=c!`&nZ1i@MKtn~ zkb7OCIoe6-Ak+cS&L&P>j`)``=B^3B?cNmM{;U61QJs+xw1W7kCm5zIjx4585mZe4 zP?C_Q?JA@|lrwul1yxUm)|nE6oJu8O0%=nYNfrH7$^qXgdz0v!#1m=o55p@ho#uX2 z?6fZ`svDPW+l;uc9!ArI3JXvIM#julZkV=P(i$bxJFU8R5{%J<@=ON!)FvaTp&0Pl z2A`qcP0bUkmLT%E^9ofWJVirbVMYQ{SBz02%vV=K@gxbC#>n{6J`l~7V?nk{>^_^0 zDYQu=mXJ#+H7ueIP;gCSsbGa=(`su?nfn&qSz;JtEe~(?u)^aW@X#MkelMk=|z5acw-tIkxw&rQL z>OLvps#c|`_virIEoX6E%7*dEk4M zZdS<-dagNE=I<8gY3~#s5UxJu;-8pP(*8Ax9*1uv9+IO=#>~>FmH=o?pP3XeS10p? zAZ1y%>Fl~yw5t92;1UirX%OfdS$@gpBbKpgZ~;cco|eqE-lyak%C74kr-yFh{CO~f zRp|@);C$^}hH6!rI5+_Q@&KnIxXf{TwYL`~F7q6~809XyTJ4jfHzem#W^E`vG1_J@XI>tWVOn$ zpAHy`7(Kq6Ot%{|I}AaIDCI>+9(Zv@dS)_4?g?;|lGanqkKAteF=Hh40zT}#mU7VU z%TD8WIqqH4nw@PbX$l@(lgx|0Ua!NWdTo~%g?>lGlyn)H4@W^Ms9ys|Zo-Hioy}0L z(+G}gKzP(K?D~b<%NYzZBaz}kR#=Gt_EJ1p1q;Gu*Tkfk>*b0AWR(yGaGuNe#ixpX zLvwX@%1!*!B|{nRa)fqi49~?is$StG8Z#iiSmg)vi1Fw;Q&c!(O+&P{!U;_6C2!WY z`;s<(DUTjKk~~-@4*Dsub4Fx7^eXQHk$n}0TYNBhRno)MRf)^;`=M{qIu9O^7PNMB zBs4#ripQGnb7Z4^)Lm|YrvS2FD*?eFjsRC5^4P)u_{INFCF0Y&3T!zK)<{5Nh~{6DJ~n%7$yo15&7# z(Fi1r^NjN0f=dX^{-#ZvfFK&=AHDl{26oGbOjM+Qp{(G}{K^#6=ZGh&l@+~uWjSZP z*DVU9mdr)6rK2S5!rbJs6emRiJ@W+}(5VAE*7OSI@zLN82;tM~IgcN=Mp!2zS&s}| zc$V)$yk8=n_M1MiLv7tw3+rDTC!)U0Ke3_EWr6pD+}sWCC9f--8GsV^B$`eoN?Kn+ z%8125D@?yyHecBPDhpqBZippI4Hk4X$0t9i=>AM(?y=)G{Bo(|fB^%vkwWzeNgBbt z@m_1w2>ltC&&41f6H`UP)9_U4%d1z1sVFBbT6v-X(LeH-Wqnc(c&5LSux1@F#N?8g zn3!Bz978=dI@NlWJ0j1(;PO>kVY7Q+%}?Vt7u;=dhP=?CY16v_z0<*B>BNODRfLf zpY&dM^T`yLV-5S!xCRw8T{Jy2>a^}NQ4clYhMpJNJT3!&d>~s!fD*0*2Z5Xm{nK$0T zK@j$SV8PgvJUJ!%cr&8IWdK0SH$6#%b4&+Z!r=}4;fFcPL+3`sAl#h_KC+?xq#vd4 zhOX`Wta3`rx|U=!#!wjpNRH@7qM4NAjJi%{NG8gE2c8EibtEMKa}4;bt%fO)he-3@ zu-AfJWM{D!T5|%Nrj>0+!yaaw*1qc$dd-4+v9;tafKEYD8B@ zydn(spO#W^uID|ww^aVvv|i{+?css!5zR19JPzMj{#XK7j(AHLNqsooJ6-mxSFe5^ zKj|~H2+7+A)uG+U0b3m4i6p`qybs&-;M;W#PiF?;zAyr)R4NO&7Tm?Z@_N{{4Z|#U zPb$R+6|DX$3+j4nM%E|$-F2!GL&p&SksZPxrzM&x({VvWB;<@;nN;XM(_0A^(<4DA zDzsXQk{n)7xkW!@$CE_EvzcN^yF4}YfhZ*buFVl^sIx!D&}a`d0+39Zy|279-;XF0 zNc*D>lp=8|+=OxUmwoDDUP~SH8-#=!TA>_-3TBEmL@yE;<aHPbAi@MJfcrQ%VD0oGJTA8+*=jKbY6SVi1Vdd4fTP@p4u2x?8a^Bxfk;T zw6`%=Q!+AKjbN!q=U!O0e7T;e1mE&~?WiUxBS&y9!dN{^ar7u?R@8wTH*WkvEk$|Y zpK^q6i$1Fu%?JnOAbssm&7qjX2*U1 zFTSW>+=D)v+$4WJ7?oxO$$sfvXt)n1D62<*bzbI6K1eJDTMhHTnS!J(%6bEI`tCV5T zw73od+JmXIYckFQ)zTY*_dR{Iu$ZwO5z!)lcvaQJ04gmE?xgd`!qoJ1fo=+My^3!C zSsF}WRxOd?(y7v|h-RR@1cuD1R|w^L`YSGC|Nfd9v+_lybAV!-k+nVopRlJ>-z(J+ zNN=Y|Hx5*-(wmg(G_iKV8sBfwMQh>fg*7Yqglz}fU21%?#*}-E?{ee%7z=PCe}K!a zZF(mjcw%7elWY)a?NIr~>9(*}kj*?`gW;6sTKrKlQO-l!oFR#fsgZP?a+3ARpX8dz z=z&T9aIONtSoSAjx;4Co;06x)LGU^; zR0HB?pm*fAuN?S%5N9B@n-mAVeCGuozWZ(7b$dD*-BoU5kmaD-LdlWvwa?Z1QrfZl zo4s@RUz8>nSs1|yNJhf~Li#D8PW`rEgMIrJ__QYK*4h-0UgiSM9{l)qei>&3|G5{K zhxtxjFM3EVSQ8sVkuoxL;D?kp25woqh-}A>-~e*I6k#AUM}!NOx!r%w?fd3--!7f- zvB%@vP0h?QyoInaEU#IA5C^M>O9mr2lfWOc8cF_Fm(knT)jWT?S-E?~mF@G)`p!6e zV+Z%kyCxpESDF&K!fWPQvv-63p;Pbkt5U3bdNjBxz)ONCmQ{PlBnpV^KE2&v&HDTm zqu&u?{f(=cDG&4+|^8#6x>QcXAvm|f(u_8|IGWOh^Kpy}xNR}9~Ksac}>+g7FIBU~=X z|MR~1*m7lbd6^3^tph`&T9apynGX)BXZj7t+1Xt_UJ@QNax3`+%AH-MBx=E>u`ddL zLGB|}ycF#m=`|MGAgtE|$4=%XA1wp`@{sTxRtd+b6>}W&&>F}UOphfRj}?XWOox(T zrbAVMQ=HKPTnXn%yL+ql^M(KsJja{psTu}`gWjN9a}v5ie`TMRb>Q^Mx9*h47hn4c zA!LoGShP~{Wi1ifvQ^YOgw56wm*#pYy8u!t=%Z>7%GocSmr;u=k)}iy^n@7BO-O3} zVGXM#TG5FaTurU_AI2@%;^#)yr(V`Y(Mn$J#MKpf6 zo|_%g8xRE&U97g20BHO-Ev;x>3XRG%)bAD71)zsoU?`t^1YCSF8A1*jM(xm%h#sWT zfn556m#&{&Gjo)7Lp*tM^@~Qnt3w@s0``)4opQ68K?)F##grQkwku!*wKQmJ8g+^wGrC8KR-|ZYKk>JpMOfc*7f}dPmc+Y~H~@Y^dqM098d&vb380uZ zg1mf!=qrcApHaY1Pwb3X0RU6G4`tr3mXj2!qgwODJ_-sg6Jq+fV`O1oTs+($57cb) zEAdFwbcc@ySE9wM8Ot^+>y1UI0BaESB$}6F;Jp1@5G~6F?#iaF*J`}K1<^LiKzKkx zms(bXhj9wz7EW%gci^43-<}36uT?Bk?=bjUKMfht4&J~tj8UXotMGgSqr46sgafx* zdnam&ic*0hX+V5A_Y0@Ka_6Y$(3PP)DS7aR15zX+6Qx1((P`|mcg=Xl_fx(NG@`rV zp|F;l8&9AkYMW#83%~By2N86CKB_(Mb#VlKU=EZ76>dg7pUdWt8?E{ZRNnjmR`h4? zH8|rJt{SCA4cwB0rTQ22DlV#Gn4%o+4aTk;0V(~PRy^li;6&ym-%Fvn*b2Vi98UG% zrn8|%+W&}3MyjE4<-pFzSey#x5&w-RG=dgiqEDZkGzY=FBulb846IQce0g)JNX+=ic#_M6vtVm(@hU&=vWd^%U?MjS+~9_0OXdA-@?EU>{SF78h2INr)IxS ztda15;;%1{+u=J=5O@#3oY879f<&e_H@N%p!@2{Fd zN1ys#%Nu13%g5FtUQM;YQK>RcVxBheu(Sv&(N$gQ9`Jl<$3%HaW;r`}Cjr2=$mp7i z2O(`}8(;^?S}6OpEJQ2Gxj=gvq!x7xEMRG%k3!khq1zOkDNjrJV z@l=2OUQW&~faOsXycLrsAnHVZQBxSU^^Kg>%!!LGu0$QX29n@a<@Tq*BP;f;na<;V zxAT}ZryP^8UK{NZd~nune|ZXPy_=q6oo9DSpV%;Ri3hlcOqG;I1l@BGv=Np7B?miN z?z&FHGB67OW!I}|8lEHefWIo$q8usZj!6lcKXIX^|M})_I!W1FYfY(^ApjH@=H2h@ zyu?&{4s2L)*Le!mHyrg0Uhr&blg6t<$&PtY;tXu80)>&&6^-#=1)Bt4E=MBoR<3vw zpRgO%fzCyJDa1bB2Dhg78Fgf$fizR!smkm(BilR(!6Krhm>PDAo6N&A;l__)oVvd<7eyUB>!0I75)h$`MK<%&@8cR) zlNNGt?eFh|t|I(B^yqCuar-<&i~i+@>ah4I8$Fo^=}>%%i4eSOx6*0Lc#YQ&T3B8> zN1k>sPWhEb(P?d`$Vh*9LWAG)PXi(jNdG&=r+Wx%GC}9SO-?!vXdu>z5v$b0c*#yU z7O>l*dfm2t=&L%P`mt3UoJ9d+2Rhpl5?Y?Fnt#`6(Rt5}^?)m@R^47FyGAjU2Ho9a z|3e&SJYE6|nkN0|^7k98<^*3(uhG&@&lRcaQ{3xAz8PjbG9~^17s7+cg!XP-LZ`I{ zLBShZ*<7dSnEsK!#>A)(#FxgV&R3@5*_S8y?AJQ_fJl?m`5zNIlr#DxBXzYl(gPWv zF1X+uB}UQz36GavAffipZI=vV;kbeg?(@@Dare8>GVW8HMxl-+-U~7!;p}ve}LNNjxm|Y$q?5*&fb7 z+8C5Xdpluj8)jZO;$b8t^*|IId&Y$AX>x9P{Wj3vlY{Hb>A5v+{F-66SL62==+P$l z`=V#wm#?^emSQOp?9+uiIV2N4s?iG_N#e4f+a7*?iycM6LCM_`8BlgL!MmMzYE@Kf zx9{BLp>yZXjr6T`vU1pclE@@m&0-_Fk(VA%Q3AF_@<0jc1upJH`KMrw{-^!{+*&O& z`sCYp$D1TJjO;B#FDsiU*ELjoYJPPw@?RX`F|1p98iatSS~aCi4FF_7UN2nzddie$ zm`?WV)7(6`cilSvF~>Vjx%p!4_d5x724!peKgp2dyvzKrc&`K7_g-mS9(T8-^WBV{ zoNZNhcON-}uNySDrRhAWS?~jBm+Q^UduN9cU!A*xll_#-;nBNanTqu%UyqJH`L5Zh zHKY&}DLzVbun^m+w=o!=p)@zVHw*|PVOOUnrvTFyP-a9Q9fR@SS09C=5+2D@98_?3 zc|;LFnIvF%#b|i}^F(r{H($t0P3|)E=_Ke871wNJX46uSu3fs+4L`RW)qi z!u;(YH0sKk1GnzTE~=0cm9zk(3Nwpst6Q4K<&|V#JVk)cV_V_D4cn?HSSe-`Z?^Io z%)^8jQ!&4GhT8x_5Fk!gV*hm7)B{-O>_me4fIufK3VEF!%3Qn%dxji(1#-o}RA&9% z*6nx#8dI)Q9t`AycXZ!~ikN2qX`FlIWxIdqJAC?X&{9XH_jTGetS{ikPZrP@W0l4U zv;d?XI2p1$mNHDx1*C;}TuYGY9TJcV@&yu-)LwqCl(p+NITwY8qEx3+({2ON8p=VG z^TTMcs`s6+KCK*w4`?)n4K&YQyl{kB z*UDC0V-TSY=ZOX#jTXkQS_`p|*1Zw%j!|3dg{Wh+@q}At|5^HRPckC!V?Rl58|ho7 z%3?k^Zj;spuXVm!neksq*tLj@aG|~h%H`cqLMA7i)-)jdM;-pP#xvMM4`Q7HiX3t{ zzp-o%@BRA8_pQgC_*uK02$e?HeY0ICzrJH@bEvFD5m4KvElwn%(>>4s{na<>3IUYS zkPj7D#wcXRW892glzx*hJbC&wfsqfX?toP{9CPM~pwf`O1sK!**F@?X4|0P9JT!-H zH=+_5v(g|O60CsY`Sa$vgOTdH2#0oXa`YAvVXz0iq-<878zA??5e!{+3>lGS4m1^j+VW>Z9Wde*@*nbH10yu@cmX-_#*JO&3O#MNE=qozxm z1d*x&AC7bVC)pfvZRwT1f{tJh0e$iFzg&s%dAkK;(PL9W;K6 z$vD`DN-i-y%VU1*Ljo#2D#eo$)LxJt$j$g16hWoj+Z{NzW(EGrgjMbQqg{CVKJJ>OIREe)02RoCVF`6rM>MCamhqJt@>QpV&lF-XNj%q z8PA3>o~~U+m_mL2>|+z0ayyJF=gfSG)zlvnm;+CJG|FEcoQ&W|+!C!)_-N$SYRWiM zNSWKa;@6rZU%eRI+i&LDx8A*rDxguL;Cro2Z{bY+FE{^l%FxVg?i`|!>FF>t`%fE9 zp3`cD$}j6df!(5F$NkCw_zxH`RDS(e6)D`2%CCRNq_gr{hZ={+j;s6+vw@?XJYNod zT=Pjo_lm_9eVQKr?tkAZi^{j<|MuYu`^N1hRHKZM+yY-@LXP~AziZpQ8FE`#ym$|~ zO+yr9$KI0&*|wF`VYrC$!>}+edIoY;MNaZ7Bhuc+$G!k(Xt?Ampdt-i&(AGhR62!< z6q%rqmb)tlINLIZW9B*m?Hj`t3%~PK=Sd=u3i;7^fxsO$`AR)a#D<3(N-kUgCau`J zaI#$D&d`BBg{~<&2;DbMgg2?P<|p5|!b*$FqDCqxdg^xeh1fLg7ewJgx|bz;>wz_S z63Qp=z>4cWg;0ahYkcxU`=MFw8dv9fQra*GWJ2v2e{Msut`98B| z&YZXQ_tR@gcUm!}#qk!BjpFzr({lovsBgLV;aqVfd|~M)r)?)+-bJ4!`GMD-g1N#B zfujU0v-7s(da#M|ZtTMo(x)knf8f=79o0plHE4VC`tA|UWX=c;KR?eVE8`gLzK{z3 z@(2i)7uSaNwuZ+xh7zPbsF)-z;nTJxQv}p)cQ-6pJR6as*gnWqlbg*ewFGplB^O*N z)W%1DomiWBZm2P|%o~nTNNYw;k1_z)NBKn{m$K4Jcuv9#L5&cy5Je1O*GMVD1lh)% z!xWkyH*8pTv9Lon^`A!dx$UlbWoz@QBKQQyvoOeJ3wJNh$XAJlq;35Wkz(_%!&sDU zBPVN(?TR_BmtRrO$Vh@w19sh)m(5qZ0f;8GN0SDtwJK`X!yCgjf?^>`4xM4ZoQKFP znzwD+Hp9C$(93>*fB(7Bb)=Z!hG=hAPEL+<)Sw04-+*8UltWiHfX_~3C+tuBww#h- z7DXA3ogEF{Ci#Ek-y1is;@?@b6xyW9t~{T>Gdn3zgf5bwCZ3p08WQdYnk)cC=89-w zb}=BpCaEK_Mf@d4YB3ElvKyv3Jg?G<8d%yVJEQOyj(rPmpN8_47U}uVcXy)U73wVE zJJ7!@vKfNfuu=G*+uk1K#|Fa!|Av$ zYb`yZAg1g3qfT+wZ&UE1y}b5tow6dcf2xtG8wQduB?gk0LY00{_M>3o2LtzC*I*E! znIVyb!B7p0KsCUS;lj`nUjEV>YGA-V?bD`BleEQl?%Z9xbD2jo6gKtQX)Lf0OT^1{ zu0IX~+(?-!DCOg4tj~^laYvlakLDNb>6*jF1_oDJ7;@QzpkG2twg(0drSiKRe0wz^ zPd2LzW6$W(l=p*7Ny0+QXayGKiln zDCZyKpK5S`n#UH7#cj>BzeLh?uH|HhFDS3TxPAt}smNZ8)lhMUP+y7tmirFJxD}5Z z<(!rutM^Nt^J9GvfIpoIdDOu)NRwQg$vpVQuCItD@|ciJtHwwH=7{S@63#eFJ1nj| zy(D=(MP&<=HvHc)KEIVAjcv@5Wb;^{)4o>2{V#0CSt_U}Tb}lY2j)6gBr= zg1$TKgAfm$cnQPl+$;95WJ<_EnJGIy^49On>1w`;`bkVj>c=zaWaL>+1*@=t5KOo; zN=jY+Wiv|zN$#1&oX7skeSNZfXGae z%$bsssX{{8nL`wz%*jxQ%!R(G3}r}}lA%mRh76^IWNJW4^}G)DZ~w0AzW=!Hb*<-q z*1gtqTkCi2eQgcr_dL(fF}&aJ<9!_Y%Be%Gk<33B{xd#urNbN_2m0daPEG+CeXjfL zA+>iYS;1J@BOpaL^1685*#8#dcRFFY`L{uVyanjXlcCY1Gv%!t1|$sV=_84kJ3VRG zo;4WEiwz5h@Lc1DUiaDVOY@kF1}dC6nnwGVNXhVLv%=bdfXHd``~TKgdM%0nz3uA9 zAeb{)wiyfhB8F-EM0Umy4+PQP(`(^ToHwLf_zgjlm-ma~Id^%lU5BMiL!61egID8k zIaA9;je(q3{K^|5@3}Obx`hH@(y$zr85TKAP&y-S2=q#=+c7@9AF`C1ElkGCK)OU- zx}Uw_Q$hAca3G+9tmq(IqNYj8p%LQMnax`ye+!5)W$|Y38hA&7vbB98Eg@_Z!FNyJ z=U=jWEtf%iq;jYdohgO~7aYK-%d_;`leRy~`Ta813F9P`5Y8TtkH3`mCDYEm==6Eh z`9ESmqAIXuNT$$WmE0*u)@C&LQ|(bxVDsIaTGWYSklHdoI?TF7GGhI21Jsi{%k_)da6J3eRIVTnP#&hTSo zgp)+WDZMl6UW9#|2$Mz8*E+~|GzlE5m*4JN;kvw`z{6u1G(lp^*{l0y{QT$lZ-lq@ zm_XVZ5s~0JVb6nD+4lsYD>x2YDjUzed|t~tvP+e64nzn^SH;1Utc0vbJalClFQihZ zre1q?JaG4$fB#>=)OY4JuS_z=cu~A+5bX-Bf#Q8i{orPdSkXmU(|gL`INjvE2WMp* z1F?lCPIG-!MKSK_&z-@ktc7CA@>TWVO+ zCg6gr;gQ3Kh2Ip<1%#|}@M^e9(&F*@7We7h+hY5(fVFvnU7fefnE_XjHQ8bra(lN- z=Mn&g&6ioA88_W2#HWT?F1(u0*~*IBx!awP7xyeRY<{NcjwgW?7K%8Czsh9{N~Up8 zg^44D49?>|LBhI!xyj$m!Ig{gxX*lT@GC#bNY)RDQ6@s291t1O_kl472rEOklTQAs zUkg2;3vBn76OXAp0w-@;z5-kq+1s3pDI(Ll7gqAlk7-RZLir6BPvoU6cQ62^6+|C> z(v*~RAR%&uY*wl<>EI<%Gq&y-jywoZyTdSvaiAt6J~Lnf;P~8|?6)WC=8YTV-xVU7 z6H<{tw7al#k1z8LJJ;Lu=6|0C z_#=`pnML8A%c_mc@V^an%o5`Z$a<;%iE@oZ(+3H9eA z87d?YiE;b(U=pIm_8WfMMt?iXqHcOfS6ovq^*I(|;le9()MZVu82T;wJXu^_NcxWv zvTA;b6H|QRLe$c{Y0`-S-ZCj^%@GBI3WhEeWC>IxqiI+V`U=rKOYRqhjZ#?>9O=y@My?6D;Z zgfhXzrw$M*9Gi{QPGT)Ac2vl0W4|p~uwa1|pIz!xmae^;_mam=a~EkcX$}Ej2z80k z)Qq=-5g!!ZcqqZErO zb{a~dNmx};u#jm3&T+|t>xw9Y?Y74dir;&`f_WkYCQs)@Wb~8z91EA|sZCRQQo#sh zUN2}3Xs>i|;#|NwMk?zPi z+L+6N`12iu!(JQHSVN^S|L7zP3pJf6%6Sc?N|nG6yRbozNJ;_YnEi-#xaf&=YBRoI zD!7iC`Y2cMo?{|BDu8Z#_(cxZo$0k?WE4CXC~TA{W{B|rvMq+5=p2+Y^YaC9UZaRe zg}Lx7Fa068Z0f}a=kG7#MPXlZpmfTALm>j%qlF&%>QnZ+C=feoEF{qjTuVzv(KQZH z<>um>uH`@TW1oXR3xV{vh2y^gNmTNOA+uYxYj>>m{r)s@!emSR$XS&7mF`8h$Jvqp zxcL&SHIT_>|dRv)dVY5u#PV8rw@`Yq) z85>ro+%VJJvMjZte4p2wvDZoxwpjiFE5Dll0kpj8{#f2!rgyfg3-v18BVCY~32qG22tUtJWh5NJabGb;$LvzfW&Qx=d7!KVEdN%fQ48b{g?)M1xce z5x)b^<3E4Ob${EYS^Y-`G~KeA_jE=y7SMF(mcPG_fBeszT>tfV|LXwY|Dncb<&kkE zTQ+`pU!s(SY^b)nYd}kbDG41n`pl|dY0{&vlcsIxuwk%o->NqnbQ}G#^C=VkJ;ytD zE}k{5cFXmv4S(=DGkc1`Vpsq8Q)J|xV-Pe zK&=mVFGc2Fthy{g%X{E|{8QOm%^Yz5-+wAxQ*S`W<&qu zkC<-ONT>C`e?ZHY#yT}L>;Cft_?O0-l{Gf}^8@&o8X6V;>&uv`1xs6}sHn)l=nGI{ z@thex&*PT&U^R=TmX^)i-fuiF;4azx?1=?Ahqa?@(wa?XPT2mr?RIqL(+F})L6nji zN~Yeg4{&#d+G^W@1Cd|eHV(q?@Xp>Iwdcm>Ri@MPg%s3ghh{yoqctu^1Ej%xKI?O4 zS+BI&yD}tn{cNkrlbcCQl%GZRZDc%M!?di(@x-KawW?OFI`PRd*8?l)$051;FIyJ# z_~yTFM``EOB^8Dy6Wlagw6LGH|IwpI7B0SJt=qM0Wn$6{yhwjx^ZZM&K<7R;8Fzb8 za_uw&*ILZoSrt#v{xr5tzkb?s?L--!9k=~co`g@T0%~T0hfHqFN|M}PX;D?vJ%2Rk zfF0ZP_QN2j{X^!=>4+%88+~KwUpJ{;zJd#jtfHDTm#R^__Dv#D*WRO??)9@PJkT+6 z7;zr&w(iVKVenuc;Eo7w6@juP0{*OJ(Vret(tEF4hgx%VmZRps9_zNU&Sv8WiOqT= zFo?t`x>nl-vxhn`OHd5}g_NX9@e7|*i#B82vPl+QD9b*kMOU9OV@9KHF7@doEYZnN zpFUj&nF@o^S5N^ZS}(D(s!IvAEif=NYn*LFqKO}lFjFXIz~Op>m}n5!$4{KtvU~Ri z^0>g7Ycn1kWa`;Oe3c638x)j|NqyTtuU9`JAHwu1Dvm1gvYu2yt4M<^-9oXHq zNlHpe;e+1sXJ`gLK0jBR@wA>y@LY50!zGT`)3quYJf0$QBZ{Ec@HI}RJ5AHIi$xtF zw}E(mgL&%=+$fCGC4=w(u{Q14KZk1V+WR^lJ|Q6?SJTtAv6Q!3cGQ+z13|Tcdce?R zd56xO>%gieFoO1gH+*xmUUj9bNql!kYh{b^h~2nZ>lu&9pj0-WJUPh!%gXW+ZP1*x zNLaEM?i|1n}M+Co9y-q{HcgSD4ANbF!xDq`s_B03`Nd&x7*+F zpxps=Gpuu|J$xtu53VdP8-Mn%##CuX^C#G=_E#AfTM8C^6QR&%ev>0A3ym5z+W+Y6 zcIei28DKa^ev8<$!-3Z(E?F-*()Vg&=O5L8Qrmp3JQLORvt1T%1*Jb0!H{!U@ zqc+WnreLaNmVD-cb)_oQ1|JoLPuxZR7JM+^=bKV&c{hOaJHiYqUSv~?`%{CkM|u2i zV(c8dyM4{h{21W;ZcMB=7jAzmOFyDN7%8~QR#2wEeH)z1WV_7`P>R=Y-gt9wbs4F1 zirX`}oy9Wy{b!$Sz#0M$r4o&m9DW&Z48LR;Uhb{gbLm$dnge+gV+-!}DWb#LwtM&S z?@JS$OZM-)|C0h-RkK#&?RRl1$2gP6Ud5(&@7=pW%^DD)`_B_EbjhrC&35;`ea&C3 zEce{pqHhx>9j{SuR#uo#i)Zp>6H>Pfirr3Kx>Qh_^;uj)WEIQoQw3_L*3m&d^7if9 zl-&GxtC(4Dhy;B5{>}hn-tq>cS-nQl5Zp9LnTHIfS-%y{kR`0a=E}+r;m!?6W$XmFUH86i+Z|JZbDlB|b1j$XkwB32BaB>o{`}&j6%VuBou3~I3=E`wszM*r zI&Lws8XmO@?mCvscJ5NWTXp;SN*pfRc=`>3}WWy=6xEl{>buHIXB4>CVJ@T(MHkb$dw?}#gPka^#QraaYYWe7Q zZ{Lz4)Q=uL+Nkrifg8Tnt-2O&bTMLweTDPQBA=QSD_5RI2;ALcZVSdJa4sGm?RlC)oYCdx zhyZpQJ5@s#z3Rn_$rUSAn#xx${Sx;>vtGRl_3G90Egs+SU5M*}$`vbS(E7}Cb4!?c zz_T)~()AlRGU@qlaNVI}E@q3ldW{w)jiBHNmTlm1ylJAQ08LiAdir#Wu`iohpUVs@ z%EPwE^4O^69^aqMgvqE>w_d$dT*`}B_j+>3Xy4To5TF47F;j^TGe)mUoU#D)} z)xgRJG2Ku$s-FgR9fFroa4bE{yoC$b5T6H^a^}_&2{VZG<`xzkuXWL?&1G<=rcsP{ z>fHG%j~$U*tG`~wHbw-uYut6wKzT+aKRum z3M^+6lBi8)&s*uas&UV3-nvaAP660dY2UtmC#S^vi$1?-%nQ_WWtj;xNE(47#!V|n zoKO+mX%L7f_EH{E%EC}<;d0Ce z=W&EXJXAL(?t?$XxUmkgjetRdXP-X1a(B16 z+ux1rKSd$Bd+**XAc1Oz$6k5I$6L90Bwd3eoj6wnHQ5zBpfpiS$POR+uPP9zLu` zXRj!fSQb-5CQZ0!6A`;`^z$DBhP@l}0z;m!m&;2d@03D~R5v@5xAon&UHTEHBkCCk z*5LhH7Z}(WKDYka8K3bEX+O!8Nz;f_t! zVW`I^|5~7Ve(B2NO>%c>U0zE`7@v?($t=0#ELFfPjEly-`*&MlQ=x*l%_AA)*3{7d zoITSbaPMB3{KQ1Gg4EGnUDN7I#bR{<_^t+kWz5xIr)7`u$^LS(;J56O@&%{qj%UqVH>34@&*Mn(A?grKKiPw$~p&PL6Qg z*|kdQu%Sb*@IJhTc8Ut0#(B!S*XK(HX-uvuK;1jvY|4}=Iw1E_6JAS7s*c)tH#5qQ z?ooFQbxTaI9vT`tG5Xmu|&7^{w z>f*AI`s*-^9yg5V8yJ;vrfpaE(MctuxHZVtz`W<)5{`?DU&x#j4�`X<55gB9gzX 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 GrRHD6R;nKW literal 0 HcmV?d00001 diff --git a/benchmark/results/perf_coloc_step_cache_20260929/full_warm_candidate.csv b/benchmark/results/perf_coloc_step_cache_20260929/full_warm_candidate.csv new file mode 100644 index 0000000000..9304dbb288 --- /dev/null +++ b/benchmark/results/perf_coloc_step_cache_20260929/full_warm_candidate.csv @@ -0,0 +1,31 @@ +case_name,mode_name,worker_count,well_count,compile_seconds,prepare_seconds,execute_seconds,total_seconds,wells_per_second,successful_wells,native_single_sample_execution_seconds,projected_native_execution_seconds,projected_execution_speedup,peak_memory_mb,status,memory_limit_mb,error_message,execution_route,server_lifecycle,run_input_sha256 +ExampleColocalization,1w_1t,1,1,3.302696704864502,0.0,3.718935251235962,10.096186046022922,0.2688941679389705,1,37.035618890076876,37.035618890076876,9.958661925552038,1310.671875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleCometAssay,1w_1t,1,1,3.055711030960083,0.0,2.591752529144287,8.60999168176204,0.38583930709239733,1,13.304211451206356,13.304211451206356,5.133287727744198,1217.671875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleFly,1w_1t,1,1,2.9811851978302,0.0,2.148517608642578,8.231432453263551,0.4654371907297491,1,8.094948755111545,8.094948755111545,3.7676902076803973,919.47265625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleFlyURL,1w_1t,1,1,2.655057668685913,0.0,1.139488697052002,6.735906984191388,0.8775865900092942,1,4.900778113398701,4.900778113398701,4.300857152929748,829.60546875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleHuman,1w_1t,1,1,2.6445040702819824,0.0,1.2340328693389893,6.7614734950475395,0.8103511866224851,1,4.420192994643003,4.420192994643003,3.581908638309353,798.98828125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleIlluminationCorrection_Example1_AllMethod,1w_1t,1,1,2.55765700340271,0.0,2.846787214279175,8.120627946220338,0.35127318086301246,1,946.6214662808925,946.6214662808925,332.522733533698,1274.73046875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleIlluminationCorrection_Example1_EachMethod,1w_1t,1,1,2.516428232192993,0.0,0.16867399215698242,5.414463059045374,5.928596265566031,1,4.54475614009425,4.54475614009425,26.944024280071062,761.5625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleIlluminationCorrection_Example2,1w_1t,1,1,2.8671979904174805,0.0,1.772667646408081,7.5290824440307915,0.5641215385333392,1,48.04419008316472,48.04419008316472,27.10276242730308,1004.50390625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleIlluminationCorrection_Example3,1w_1t,1,1,2.940793514251709,0.0,0.8718390464782715,6.647682448849082,1.1470007039021997,1,2.1520505752414465,2.1520505752414465,2.468403524635073,799.00390625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleImagingFlowCytometryObjectsInGrid,1w_1t,1,1,3.4476630687713623,0.0,21.533740043640137,28.337062722072005,0.046438751372191105,1,61.60158259188756,61.60158259188756,2.8607005781181623,2426.86328125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleNeighbors,1w_1t,1,1,2.472842216491699,0.0,1.471928358078003,6.772686000913382,0.6793808914081716,1,4.5466188420541584,4.5466188420541584,3.088885961807943,837.9375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExamplePercentPositive,1w_1t,1,1,2.444183111190796,0.0,0.5557022094726562,5.940390051808208,1.7995249667064817,1,2.5050158216618,2.5050158216618,4.507838513075161,801.6953125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleSpeckles,1w_1t,1,1,2.3182339668273926,0.0,0.8259930610656738,5.874337824061513,1.21066392338675,1,3.179383432958275,3.179383432958275,3.849164820896099,902.00390625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleTrackObjects,1w_1t,1,1,2.423386573791504,0.0,3.357529878616333,8.586916312109679,0.29783800476918126,1,9.587221414782107,9.587221414782107,2.85543889745907,1571.36328125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleTumor,1w_1t,1,1,2.3061318397521973,0.0,0.8246448040008545,5.943696439266205,1.2126433043031262,1,4.360487373080105,4.360487373080105,5.287715816463916,955.89453125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleUntangleAndStraightenWorms,1w_1t,1,1,3.0381131172180176,0.0,1.2356970310211182,7.267080613877624,0.8092598548801643,1,3.4416790287941694,3.4416790287941694,2.7852126713860743,863.01953125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleUntangleWorms,1w_1t,1,1,3.2455945014953613,0.0,2.2246034145355225,8.542148170992732,0.44951832468925307,1,4.618807300925255,4.618807300925255,2.076238519974411,913.421875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleUntangleWormsBrightField,1w_1t,1,1,3.3344175815582275,0.0,3.7285454273223877,10.139678824227303,0.26820110402091535,1,7.377188352867961,7.377188352867961,1.9785700608094252,1025.49609375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleVitra,1w_1t,1,1,2.9031996726989746,0.0,1.3693935871124268,7.169969641137868,0.7302502431814736,1,4.122247557155788,4.122247557155788,3.0102722810672495,936.21875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleWoundHealing,1w_1t,1,1,2.035460948944092,0.0,1.54510498046875,6.293716668151319,0.6472052142998223,1,4.702593941241503,4.702593941241503,3.0435433195062527,1194.7890625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleYeastColonies,1w_1t,1,1,3.2516937255859375,0.0,2.1811540126800537,8.476604882627726,0.45847289746003217,1,12.096297012176365,12.096297012176365,5.545824339709628,1150.05078125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +ExampleYeastPatches,1w_1t,1,1,3.356388568878174,0.0,2.5256619453430176,9.025991102680564,0.3959358067867579,1,5.990533472970128,5.990533472970128,2.3718667037035064,1094.1796875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +cp_tutorial_3d_monolayer,1w_1t,1,1,3.613546371459961,0.0,10.241461515426636,17.157875870820135,0.09764231389179245,1,14.058660756796598,14.058660756796598,1.372720166513358,1420.94140625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +cp_tutorial_advanced_segmentation_final,1w_1t,1,1,4.264207124710083,0.0,9.438591003417969,17.339269490912557,0.10594801699087003,1,36.253466514870524,36.253466514870524,3.84098288629544,1102.30078125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +cp_tutorial_quality_control,1w_1t,1,1,1.9192872047424316,0.0,0.6170415878295898,5.4689456769265234,1.6206363067316831,1,4.787729676347226,4.787729676347226,7.759168540305045,807.9375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +cp_tutorial_beginner_segmentation_final,1w_1t,1,1,3.207782506942749,0.0,5.538364887237549,12.039867510087788,0.18055870647027458,1,16.074153264053166,16.074153264053166,2.902328320962382,996.01953125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +cp_tutorial_pixel_based_classification,1w_1t,1,1,2.3737740516662598,0.0,0.8111603260040283,6.017411075998098,1.232801910968996,1,4.208680049050599,4.208680049050599,5.188468807126667,1021.8046875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +cp_tutorial_translocation_final,1w_1t,1,1,2.562145948410034,0.0,0.9290289878845215,6.426769196987152,1.0763926777754111,1,3.004684013314545,3.004684013314545,3.234219870960612,880.37109375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +cp4_supplement_combine_objects,1w_1t,1,1,1.9982993602752686,0.0,0.15286612510681152,4.984665384981781,6.541671670563208,1,1.8334413380362093,1.8334413380362093,11.993771260670972,778.32421875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 +cp_tutorial_translocation_start,1w_1t,1,1,2.0574376583099365,0.0,0.2561960220336914,4.975822530221194,3.9032612296708247,1,2.1760300607420504,2.1760300607420504,8.493613770692695,835.33203125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,96d7bea1c83b1b08e752ca5c6ed1f7e19a221bf2965d6aafb8b96c6061ce7c98 diff --git a/benchmark/results/perf_coloc_step_cache_20260929/full_warm_control.csv b/benchmark/results/perf_coloc_step_cache_20260929/full_warm_control.csv new file mode 100644 index 0000000000..3170876390 --- /dev/null +++ b/benchmark/results/perf_coloc_step_cache_20260929/full_warm_control.csv @@ -0,0 +1,31 @@ +case_name,mode_name,worker_count,well_count,compile_seconds,prepare_seconds,execute_seconds,total_seconds,wells_per_second,successful_wells,native_single_sample_execution_seconds,projected_native_execution_seconds,projected_execution_speedup,peak_memory_mb,status,memory_limit_mb,error_message,execution_route,server_lifecycle,run_input_sha256 +ExampleColocalization,1w_1t,1,1,3.323961019515991,0.0,3.617356538772583,9.969379255082458,0.2764449645152516,1,37.035618890076876,37.035618890076876,10.238310349867684,1288.4375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleCometAssay,1w_1t,1,1,3.02347731590271,0.0,2.520958185195923,8.462881289888173,0.396674568373407,1,13.304211451206356,13.304211451206356,5.277442334955819,1218.84765625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleFly,1w_1t,1,1,3.111642837524414,0.0,2.0385589599609375,8.29406239464879,0.49054259388169075,1,8.094948755111545,8.094948755111545,3.9709171596717807,920.3828125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleFlyURL,1w_1t,1,1,2.667515993118286,0.0,1.0166563987731934,6.562555972021073,0.9836164914780522,1,4.900778113398701,4.900778113398701,4.820486173413658,829.453125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleHuman,1w_1t,1,1,2.646012544631958,0.0,1.2079601287841797,6.767570375930518,0.8278418932639002,1,4.420192994643003,4.420192994643003,3.659220937277092,798.5546875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleIlluminationCorrection_Example1_AllMethod,1w_1t,1,1,2.5429792404174805,0.0,2.791534900665283,8.050101389177144,0.3582258633992641,1,946.6214662808925,946.6214662808925,339.1042920707501,1281.109375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleIlluminationCorrection_Example1_EachMethod,1w_1t,1,1,2.4414167404174805,0.0,0.1653294563293457,5.297076327726245,6.04852893248462,1,4.54475614009425,4.54475614009425,27.489089004447198,760.359375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleIlluminationCorrection_Example2,1w_1t,1,1,2.869089126586914,0.0,1.7775242328643799,7.4743453389965,0.5625802346382398,1,48.04419008316472,48.04419008316472,27.028711729991002,981.32421875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleIlluminationCorrection_Example3,1w_1t,1,1,2.920943260192871,0.0,0.8762273788452148,6.648663740139455,1.1412562813523424,1,2.1520505752414465,2.1520505752414465,2.4560412367822226,798.50390625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleImagingFlowCytometryObjectsInGrid,1w_1t,1,1,3.4163036346435547,0.0,21.254642009735107,27.948565289843827,0.04704854589138586,1,61.60158259188756,61.60158259188756,2.8982648855564186,2424.671875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleNeighbors,1w_1t,1,1,2.455495595932007,0.0,1.4713807106018066,6.794630188029259,0.6796337567800463,1,4.5466188420541584,4.5466188420541584,3.090035644272212,836.67578125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExamplePercentPositive,1w_1t,1,1,2.4268131256103516,0.0,0.4376182556152344,5.770994539372623,2.2850966274113267,1,2.5050158216618,2.5050158216618,5.724203205691393,798.9375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleSpeckles,1w_1t,1,1,2.327207565307617,0.0,0.8347718715667725,5.954534489661455,1.197932074691392,1,3.179383432958275,3.179383432958275,3.808685392083147,889.80078125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleTrackObjects,1w_1t,1,1,2.4236276149749756,0.0,3.143188238143921,8.357484063133597,0.31814830173534514,1,9.587221414782107,9.587221414782107,3.05015821147366,1567.6953125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleTumor,1w_1t,1,1,2.338942766189575,0.0,0.8002221584320068,6.020175698213279,1.2496529738184798,1,4.360487373080105,4.360487373080105,5.449096013067484,947.01953125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleUntangleAndStraightenWorms,1w_1t,1,1,2.9941883087158203,0.0,1.2451016902923584,7.191384637262672,0.8031472511817032,1,3.4416790287941694,3.4416790287941694,2.764175051425751,857.95703125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleUntangleWorms,1w_1t,1,1,3.2426037788391113,0.0,2.2027556896209717,8.482035635970533,0.45397680946272806,1,4.618807300925255,4.618807300925255,2.0968314019972016,906.1484375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleUntangleWormsBrightField,1w_1t,1,1,3.2127177715301514,0.0,3.745802640914917,10.062537916004658,0.26696547999542997,1,7.377188352867961,7.377188352867961,1.9694546296400905,1020.91796875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleVitra,1w_1t,1,1,2.8912148475646973,0.0,1.3636698722839355,7.20144598511979,0.7333153135701056,1,4.122247557155788,4.122247557155788,3.022907259989298,932.11328125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleWoundHealing,1w_1t,1,1,2.0138261318206787,0.0,1.3847479820251465,6.037405799143016,0.7221530653812792,1,4.702593941241503,4.702593941241503,3.395992629910982,1170.62890625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleYeastColonies,1w_1t,1,1,3.2719123363494873,0.0,2.0856516361236572,8.444489850196987,0.47946645675620897,1,12.096297012176365,12.096297012176365,5.799768668298919,1148.171875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +ExampleYeastPatches,1w_1t,1,1,3.2333009243011475,0.0,2.6243515014648438,8.92510417709127,0.38104651737460715,1,5.990533472970128,5.990533472970128,2.2826719170912777,1083.1640625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +cp_tutorial_3d_monolayer,1w_1t,1,1,3.5835182666778564,0.0,10.267441272735596,17.229198317974806,0.09739524906321338,1,14.058660756796598,14.058660756796598,1.3692467659034286,1430.11328125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +cp_tutorial_advanced_segmentation_final,1w_1t,1,1,4.228123188018799,0.0,10.850493907928467,18.6846966301091,0.0921617032814791,1,36.253466514870524,36.253466514870524,3.3411812238685354,1100.0546875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +cp_tutorial_quality_control,1w_1t,1,1,1.907684326171875,0.0,0.6087887287139893,5.400636968202889,1.6426059695822701,1,4.787729676347226,4.787729676347226,7.864353347114144,807.28125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +cp_tutorial_beginner_segmentation_final,1w_1t,1,1,3.2727670669555664,0.0,6.780334949493408,13.271101823076606,0.14748533921244036,1,16.074153264053166,16.074153264053166,2.3707019467016366,992.53515625,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +cp_tutorial_pixel_based_classification,1w_1t,1,1,2.2634620666503906,0.0,0.9301130771636963,6.036275522317737,1.0751380929396437,1,4.208680049050599,4.208680049050599,4.524912241729387,992.42578125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +cp_tutorial_translocation_final,1w_1t,1,1,2.560678720474243,0.0,0.825181245803833,6.3381188018247485,1.2118549774187741,1,3.004684013314545,3.004684013314545,3.6412412771058498,880.296875,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +cp4_supplement_combine_objects,1w_1t,1,1,1.999769926071167,0.0,0.15795016288757324,5.05013538338244,6.331110913204858,1,1.8334413380362093,1.8334413380362093,11.607720463961963,777.8984375,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 +cp_tutorial_translocation_start,1w_1t,1,1,2.0898513793945312,0.0,0.25942063331604004,4.963807687163353,3.8547434998423844,1,2.1760300607420504,2.1760300607420504,8.388037732107048,817.73828125,success,,,ordinary-zmq-outcomes-v1,fresh-per-observation,50c23a3811b9352d3843d7afb36b4502b39da167b48378dbe6c7918345ec4ca5 diff --git a/benchmark/results/perf_coloc_step_cache_20260929/plot.py b/benchmark/results/perf_coloc_step_cache_20260929/plot.py new file mode 100644 index 0000000000..64ddbfd465 --- /dev/null +++ b/benchmark/results/perf_coloc_step_cache_20260929/plot.py @@ -0,0 +1,78 @@ +"""Regenerate Costes cache execution figures from retained benchmark CSVs.""" + +from __future__ import annotations + +import csv +from pathlib import Path + +import matplotlib.pyplot as plt +import numpy as np + +HERE = Path(__file__).resolve().parent +TARGETS = ( + "cp_tutorial_advanced_segmentation_final", + "cp_tutorial_beginner_segmentation_final", +) + + +def rows(path: Path) -> dict[str, dict[str, str]]: + with path.open(newline="", encoding="utf-8") as handle: + return {row["case_name"]: row for row in csv.DictReader(handle)} + + +control = rows(HERE / "full_warm_control.csv") +candidate = rows(HERE / "full_warm_candidate.csv") +native = rows(HERE.parent / "perf_lazy_catalog_20260929" / "native_cp_summary.csv") + +fig, ax = plt.subplots(figsize=(9.5, 4.5), layout="constrained") +x = np.arange(len(TARGETS)) +width = 0.23 +for offset, label, values, color in ( + ( + -width, + "Native CellProfiler", + [float(native[name]["median_native_execution_seconds"]) for name in TARGETS], + "#697b8c", + ), + ( + 0, + "OpenHCS control", + [float(control[name]["execute_seconds"]) for name in TARGETS], + "#d87a57", + ), + ( + width, + "OpenHCS step cache", + [float(candidate[name]["execute_seconds"]) for name in TARGETS], + "#3a8c83", + ), +): + bars = ax.bar(x + offset, values, width, label=label, color=color) + ax.bar_label(bars, fmt="%.2f", padding=3, fontsize=9) +ax.set_xticks(x, ("Advanced segmentation", "Beginner segmentation")) +ax.set_ylabel("Execution seconds, one well / one thread") +ax.set_ylim(0, 42) +ax.legend(frameon=False, ncol=3, loc="upper right") +ax.set_title("Repeated Costes inputs: exact step-local threshold reuse") +fig.savefig(HERE / "affected_case_execution.png", dpi=180) +plt.close(fig) + +ordered = sorted( + control, + key=lambda name: float(candidate[name]["execute_seconds"]) + - float(control[name]["execute_seconds"]), +) +deltas = [ + float(candidate[name]["execute_seconds"]) - float(control[name]["execute_seconds"]) + for name in ordered +] +colors = ["#3a8c83" if name in TARGETS else "#aeb7bf" for name in ordered] +fig, ax = plt.subplots(figsize=(10, 9), layout="constrained") +ax.barh(range(len(ordered)), deltas, color=colors) +ax.set_yticks(range(len(ordered)), ordered, fontsize=7.5) +ax.invert_yaxis() +ax.axvline(0, color="#2f3640", linewidth=0.8) +ax.set_xlabel("Candidate minus control execution seconds (lower is faster)") +ax.set_title("Warmed official30 paired execution differences") +fig.savefig(HERE / "full_suite_execution_delta.png", dpi=180) +plt.close(fig) diff --git a/openhcs/core/context/processing_context.py b/openhcs/core/context/processing_context.py index e9a6f47172..187565b391 100644 --- a/openhcs/core/context/processing_context.py +++ b/openhcs/core/context/processing_context.py @@ -6,8 +6,10 @@ from __future__ import annotations +from collections.abc import Iterator +from contextlib import contextmanager from dataclasses import dataclass -from typing import TYPE_CHECKING +from typing import TYPE_CHECKING, TypeVar, cast if TYPE_CHECKING: from openhcs.core.orchestrator.worker_lanes import WorkerLaneExecutionContext @@ -40,6 +42,8 @@ from openhcs.core.steps.function_output_identity import FunctionOutputIdentityCache from openhcs.runtime.zmq_config import OPENHCS_ZMQ_CONFIG +_RuntimeStepValue = TypeVar("_RuntimeStepValue") + @dataclass(frozen=True, slots=True) class RequiredVisualizer: @@ -126,6 +130,7 @@ def __init__( self.runtime_function_output_identity_cache = FunctionOutputIdentityCache() self.runtime_pattern_discovery_cache = RuntimePatternDiscoveryCache() self.runtime_source_binding_context_cache = RuntimeSourceBindingContextCache() + self._runtime_step_values: dict[type[object], object] | None = None self.runtime_source_workspace_projection_cache = ( VirtualWorkspaceSourceProjectionCache() ) @@ -175,6 +180,29 @@ def release_execution_image_cache(self) -> None: """Release image reuse storage without discarding runtime observations.""" self.runtime_image_stack_cache.clear() + @contextmanager + def runtime_step_scope(self) -> Iterator[None]: + """Own runtime-only values for exactly one FunctionStep invocation.""" + previous = self._runtime_step_values + self._runtime_step_values = {} + try: + yield + finally: + self._runtime_step_values = previous + + def runtime_step_value( + self, value_type: type[_RuntimeStepValue] + ) -> _RuntimeStepValue: + """Resolve one declared runtime value shared within the active step.""" + values = self._runtime_step_values + if values is None: + raise RuntimeError("Runtime step values require an active FunctionStep.") + value = values.get(value_type) + if value is None: + value = value_type() + values[value_type] = value + return cast(_RuntimeStepValue, value) + def install_debug_event_sink(self, debug_event_sink: DebugEventSink) -> None: """Install the debug sink selected for this execution context.""" diff --git a/openhcs/core/steps/function_execution.py b/openhcs/core/steps/function_execution.py index 25257bb69b..e376923be2 100644 --- a/openhcs/core/steps/function_execution.py +++ b/openhcs/core/steps/function_execution.py @@ -691,7 +691,8 @@ def execute( try: executor = cls(context, step_index) step_name = executor.plan.step_name or step_name - return executor.run() + with context.runtime_step_scope(): + return executor.run() except Exception as error: full_traceback = traceback.format_exc() logger.error( diff --git a/openhcs/interop/cellprofiler/module_callable_abi.py b/openhcs/interop/cellprofiler/module_callable_abi.py index 595b711da5..78a23086ea 100644 --- a/openhcs/interop/cellprofiler/module_callable_abi.py +++ b/openhcs/interop/cellprofiler/module_callable_abi.py @@ -39,6 +39,7 @@ from openhcs.interop.cellprofiler.runtime.invocation import ( CellProfilerImageRequest, ) + from openhcs.interop.cellprofiler.runtime.adapter import CellProfilerRuntimeAdapter from openhcs.interop.cellprofiler.runtime.output_contexts import ( CellProfilerObjectLabelOutputSourceContext, ) @@ -253,6 +254,14 @@ def object_measurement_invocation_kwargs( del cls, include_image_measurements return runtime_kwargs + @classmethod + def shared_object_measurement_runtime_kwargs( + cls, adapter: "CellProfilerRuntimeAdapter" + ) -> "RuntimeCallableKwargs": + """Project runtime-owned values shared by this module's object calls.""" + del cls, adapter + return {} + @classmethod def validate_callable_artifact_abi( cls, diff --git a/openhcs/interop/cellprofiler/runtime/module_execution.py b/openhcs/interop/cellprofiler/runtime/module_execution.py index e9b9898234..f076bfb092 100644 --- a/openhcs/interop/cellprofiler/runtime/module_execution.py +++ b/openhcs/interop/cellprofiler/runtime/module_execution.py @@ -854,6 +854,9 @@ def _run_per_object_measurement( ) ) measurement_row_policy = module_type.runtime_object_measurement_row_policy() + shared_runtime_kwargs = module_type.shared_object_measurement_runtime_kwargs( + cellprofiler_runtime + ) label_payload_seconds = 0.0 label_align_seconds = 0.0 contract_execute_seconds = 0.0 @@ -934,6 +937,7 @@ def _run_per_object_measurement( image=aligned_measurement_image.payload, kwargs={ **invocation_kwargs, + **shared_runtime_kwargs, **_execution_mode_semantic_control_kwargs( processing_contract, execution_mode, diff --git a/openhcs/processing/backends/cellprofiler/colocalization.py b/openhcs/processing/backends/cellprofiler/colocalization.py index 40b6cd78fe..14a5131593 100644 --- a/openhcs/processing/backends/cellprofiler/colocalization.py +++ b/openhcs/processing/backends/cellprofiler/colocalization.py @@ -6,10 +6,11 @@ from collections.abc import Callable, Hashable, Mapping from dataclasses import dataclass, field, fields, make_dataclass, replace from enum import Enum +import hashlib import logging from types import MappingProxyType import time -from typing import Annotated, ClassVar, Tuple +from typing import TYPE_CHECKING, Annotated, ClassVar, Tuple, cast from metaclass_registry import AutoRegisterMeta import numpy as np @@ -167,6 +168,9 @@ RuntimeInputBindingRequest, ) +if TYPE_CHECKING: + from openhcs.interop.cellprofiler.runtime.adapter import CellProfilerRuntimeAdapter + @dataclass(frozen=True, slots=True) class ColocalizationThresholdMaskGroup: @@ -440,6 +444,21 @@ class MeasureColocalizationModule( object_gate_setting = SettingNameFamily("Select an object to measure") ignored_settings = ("Hidden",) + @classmethod + def shared_object_measurement_runtime_kwargs( + cls, adapter: "CellProfilerRuntimeAdapter" + ) -> RuntimeCallableKwargs: + """Share exact Costes image-pair thresholds across object sets in one step.""" + del cls + return cast( + RuntimeCallableKwargs, + { + "costes_threshold_batch": adapter.request.context.runtime_step_value( + ColocalizationCostesThresholdBatch + ) + }, + ) + class MeasurementFeature(RuntimeMeasurementFeature): """Exact source-pair feature identities emitted by MeasureColocalization.""" @@ -1582,15 +1601,12 @@ def from_dense_label_payload( @dataclass(frozen=True, slots=True) class ColocalizationCostesThresholdCacheKey: - """Batch-local identity for Costes thresholds over one image pair.""" + """Exact selected-pixel content and algorithm identity for Costes thresholds.""" - image_payload_id: int - image_data_id: int - channel_1: int - channel_2: int + pair_digest: bytes method: CostesMethod scale_max: int - backend_provider: object + backend_provider: CellProfilerBackendProvider | None @dataclass(frozen=True, slots=True) @@ -1892,6 +1908,14 @@ class _ObjectColocalizationRankProviderRuntimeParameter(KeywordRuntimeParameter) parameter_default = _DIRECT_OBJECT_COLOCALIZATION_RANK_PROVIDER +class _ColocalizationCostesThresholdBatchRuntimeParameter(KeywordRuntimeParameter): + """Step-owned Costes cache supplied by the CellProfiler module executor.""" + + parameter_name = "costes_threshold_batch" + annotation_type = RuntimeSliceInvariantValue + parameter_default = None + + @dataclass(slots=True) class CachedObjectColocalizationRankProvider(ObjectColocalizationRankProvider): """Share RWC ranks across source-pair calls in one measurement-image batch.""" @@ -2221,32 +2245,19 @@ def _resolve_object_costes_thresholds( base: ObjectColocalizationBaseStage, provided: ColocalizationCostesThresholds | None, metrics: ObjectColocalizationMetricArrays, + threshold_batch: ColocalizationCostesThresholdBatch | None = None, ) -> ColocalizationCostesThresholds | None: options = context.options if not (options.do_costes and base.full_first_pixels.size): return None if provided is not None: resolved = provided - elif options.costes_method == CostesMethod.FASTER: - threshold_c1, threshold_c2 = costes_backend( - backend_provider=options.costes_backend_provider - ).scaled_second_channel_costes( - base.full_first_pixels, base.full_second_pixels, options.scale_max - ) - resolved = ColocalizationCostesThresholds.from_thresholds( - threshold_c1, threshold_c2 - ) else: - threshold_c1, threshold_c2 = costes_backend( - backend_provider=options.costes_backend_provider - ).linear_costes( - base.full_first_pixels, - base.full_second_pixels, - options.scale_max, - options.costes_method == CostesMethod.FAST, - ) - resolved = ColocalizationCostesThresholds.from_thresholds( - threshold_c1, threshold_c2 + request = ColocalizationCostesThresholdRequest.from_object_context(context) + resolved = ( + threshold_batch.resolve(request) + if threshold_batch is not None + else request.thresholds() ) metrics.costes_threshold_1.fill(resolved.first) metrics.costes_threshold_2.fill(resolved.second) @@ -2626,6 +2637,7 @@ def _measure_colocalization_objects_core( *, costes_thresholds: ColocalizationCostesThresholds | None = None, rank_provider: ObjectColocalizationRankProvider = DirectObjectColocalizationRankProvider(), + threshold_batch: ColocalizationCostesThresholdBatch | None = None, ) -> Tuple[RuntimeArrayData, ObjectColocalizationColumnarMeasurements]: """Measure colocalization between two channels within labeled objects.""" total_started_at = time.perf_counter() @@ -2680,7 +2692,7 @@ def _measure_colocalization_objects_core( ) phase_started_at = time.perf_counter() resolved_costes_thresholds = _resolve_object_costes_thresholds( - context, base, costes_thresholds, metrics + context, base, costes_thresholds, metrics, threshold_batch ) runtime_profiler.log( "coloc_object_costes_thresholds", @@ -2755,6 +2767,7 @@ def _measure_colocalization_objects_core( @runtime_bound_parameters( _ObjectColocalizationRankProviderRuntimeParameter, _ColocalizationThresholdMaskOutputsRuntimeParameter, + _ColocalizationCostesThresholdBatchRuntimeParameter, ) def measure_colocalization_objects( image: np.ndarray, @@ -2778,6 +2791,7 @@ def measure_colocalization_objects( threshold_mask_outputs: tuple[ColocalizationThresholdMaskRuntimeOutput, ...] = (), *, rank_provider: ObjectColocalizationRankProvider = _DIRECT_OBJECT_COLOCALIZATION_RANK_PROVIDER, + costes_threshold_batch: RuntimeSliceInvariantValue | None = None, ) -> Tuple[RuntimeArrayData | AlignedImageStack, ColumnarRows]: """Measure image and/or object colocalization through one declared callable. @@ -2799,6 +2813,10 @@ def measure_colocalization_objects( measurement_scope, CellProfilerMeasurementTargetScope.OBJECT, ).measurement_scope_selection + if costes_threshold_batch is not None and not isinstance( + costes_threshold_batch, ColocalizationCostesThresholdBatch + ): + raise TypeError("Costes threshold batch must be a runtime cache instance.") context = _prepare_object_colocalization_context( image, labels, @@ -2820,6 +2838,7 @@ def measure_colocalization_objects( context, costes_thresholds=costes_thresholds, rank_provider=rank_provider, + threshold_batch=costes_threshold_batch, ) output = _colocalization_threshold_mask_canonical_output( image, @@ -2972,15 +2991,39 @@ class ColocalizationCostesThresholdRequest: @property def cache_key(self) -> ColocalizationCostesThresholdCacheKey: - """Return the batch-local identity for this resolved source pair.""" + """Fingerprint the exact selected pixels reused across object sets.""" + pair = self.image_pair_context + if pair is None: + pair = ColocalizationImagePairContext.from_request( + self.image, channel_1=self.channel_1, channel_2=self.channel_2 + ) + digest = hashlib.blake2b(digest_size=32) + for pixels in (pair.full_first_pixels, pair.full_second_pixels): + array = np.ascontiguousarray(pixels) + digest.update(array.dtype.str.encode("ascii")) + digest.update(repr(array.shape).encode("ascii")) + digest.update(array.tobytes()) return ColocalizationCostesThresholdCacheKey( - id(self.image), - id(self.image_data), - self.channel_1, - self.channel_2, - self.method, - self.scale_max, - self.backend_provider, + pair_digest=digest.digest(), + method=self.method, + scale_max=self.scale_max, + backend_provider=self.backend_provider, + ) + + @classmethod + def from_object_context( + cls, context: ObjectColocalizationRequestContext + ) -> "ColocalizationCostesThresholdRequest": + """Use the object call's already-selected full image-pair pixels.""" + return cls( + image=context.image, + image_data=context.image_data, + channel_1=context.channel_1, + channel_2=context.channel_2, + method=context.options.costes_method, + scale_max=context.options.scale_max, + backend_provider=context.options.costes_backend_provider, + image_pair_context=context.image_pair, ) @staticmethod @@ -3070,8 +3113,8 @@ def thresholds(self) -> ColocalizationCostesThresholds: return ColocalizationCostesThresholds.from_thresholds(first, second) -class ColocalizationCostesThresholdBatch: - """Batch-local Costes threshold cache keyed by resolved image-pair identity.""" +class ColocalizationCostesThresholdBatch(RuntimeSliceInvariantValue): + """Costes threshold cache scoped to one runtime FunctionStep.""" def __init__(self) -> None: self._thresholds: dict[ @@ -3084,6 +3127,17 @@ def __init__(self) -> None: ColocalizationObjectLabelCacheKey, ColocalizationObjectLabelContext ] = {} + def resolve( + self, request: ColocalizationCostesThresholdRequest + ) -> ColocalizationCostesThresholds: + """Compute once for each exact pixel pair and algorithm selection.""" + key = request.cache_key + thresholds = self._thresholds.get(key) + if thresholds is None: + thresholds = request.thresholds() + self._thresholds[key] = thresholds + return thresholds + def image_pair_context( self, request: RuntimeBatchInvocationRequest ) -> ColocalizationImagePairContext: @@ -3156,11 +3210,7 @@ def request_kwargs( ) thresholds = None if threshold_request is not None: - key = threshold_request.cache_key - thresholds = self._thresholds.get(key) - if thresholds is None: - thresholds = threshold_request.thresholds() - self._thresholds[key] = thresholds + thresholds = self.resolve(threshold_request) kwargs = { **request.kwargs, "image_pair_context": image_pair_context, diff --git a/tests/unit/test_cellprofiler_library_loading.py b/tests/unit/test_cellprofiler_library_loading.py index 44959f5c0d..bf774ae583 100644 --- a/tests/unit/test_cellprofiler_library_loading.py +++ b/tests/unit/test_cellprofiler_library_loading.py @@ -1,4 +1,5 @@ import importlib +from dataclasses import replace import sys import types from typing import get_type_hints @@ -74,9 +75,11 @@ ) from openhcs.processing.backends.cellprofiler.colocalization import ( ColocalizationCostesThresholdBatch, + ColocalizationCostesThresholdRequest, ColocalizationCostesThresholds, ColocalizationImagePairContext, ColocalizationObjectLabelContext, + CostesMethod, MeasureColocalizationModule, ObjectColocalizationMetricArrays, costes_backend, @@ -1323,6 +1326,38 @@ def test_colocalization_threshold_batch_caches_semantic_label_context() -> None: assert second is first +def test_costes_thresholds_reuse_equal_pixels_across_distinct_image_payloads() -> None: + image = np.stack( + ( + np.array(((0.1, 0.2), (0.3, 0.4)), dtype=np.float32), + np.array(((0.4, 0.3), (0.2, 0.1)), dtype=np.float32), + ) + ) + + def request_for(pixels: np.ndarray) -> ColocalizationCostesThresholdRequest: + return ColocalizationCostesThresholdRequest( + image=pixels, + image_data=pixels, + channel_1=0, + channel_2=1, + method=CostesMethod.FASTER, + scale_max=255, + backend_provider=None, + image_pair_context=ColocalizationImagePairContext.from_request( + pixels, channel_1=0, channel_2=1 + ), + ) + + batch = ColocalizationCostesThresholdBatch() + first = batch.resolve(request_for(image)) + assert batch.resolve(request_for(image.copy())) is first + + changed = image.copy() + changed[0, 0, 0] += np.float32(0.1) + assert batch.resolve(request_for(changed)) is not first + assert batch.resolve(replace(request_for(image), scale_max=65535)) is not first + + def test_measure_colocalization_objects_batch_uses_contract_execution() -> None: image = np.stack( ( diff --git a/tests/unit/test_function_step_execution_scope.py b/tests/unit/test_function_step_execution_scope.py index af672642db..9836d217d2 100644 --- a/tests/unit/test_function_step_execution_scope.py +++ b/tests/unit/test_function_step_execution_scope.py @@ -83,6 +83,25 @@ from openhcs.core.steps.function_step import FunctionStep +def test_runtime_step_values_share_within_step_and_release_between_steps() -> None: + class Counter: + pass + + context = ProcessingContext() + with pytest.raises(RuntimeError, match="active FunctionStep"): + context.runtime_step_value(Counter) + + with context.runtime_step_scope(): + first = context.runtime_step_value(Counter) + assert context.runtime_step_value(Counter) is first + with context.runtime_step_scope(): + assert context.runtime_step_value(Counter) is not first + assert context.runtime_step_value(Counter) is first + + with context.runtime_step_scope(): + assert context.runtime_step_value(Counter) is not first + + def test_runtime_axis_scope_returns_exact_complete_plane_selection() -> None: scope = RuntimeExecutionAxisScope.from_raw( "A01", From 16f86e27aefe2326596afcba9f1441524b7fbd1d Mon Sep 17 00:00:00 2001 From: Tristan Simas Date: Tue, 29 Sep 2026 06:37:14 -0400 Subject: [PATCH 2/2] test: supply step-scoped values to CellProfiler runtime fixture (#185) --- tests/unit/cellprofiler_runtime_test_support.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/tests/unit/cellprofiler_runtime_test_support.py b/tests/unit/cellprofiler_runtime_test_support.py index e13afbffd3..c387ce86f4 100644 --- a/tests/unit/cellprofiler_runtime_test_support.py +++ b/tests/unit/cellprofiler_runtime_test_support.py @@ -46,6 +46,13 @@ class CellProfilerRuntimeTestContext: runtime_function_output_identity_cache: FunctionOutputIdentityCache = field( default_factory=FunctionOutputIdentityCache ) + _runtime_step_values: dict[type[object], object] = field(default_factory=dict) + + def runtime_step_value(self, value_type: type[Any]) -> Any: + """Provide one runtime-only value per type for a test step.""" + if value_type not in self._runtime_step_values: + self._runtime_step_values[value_type] = value_type() + return self._runtime_step_values[value_type] def cellprofiler_runtime_input_edge_for_test(