From a3789212ecb2e58a1190dca5483d46065f349736 Mon Sep 17 00:00:00 2001 From: Avanika Narayan Date: Mon, 13 Apr 2026 15:03:03 -0700 Subject: [PATCH] refactor: remove dead shims, stale files, and test duplication (#243) --- assets/OpenJarvis_Architecture.png | Bin 240689 -> 0 bytes docs/experiments/neurips-2026-plan.md | 240 ------------------ scripts/migrate_savings_single_provider.sql | 37 --- src/openjarvis/agents/react.py | 6 - src/openjarvis/intelligence/_stubs.py | 5 - src/openjarvis/intelligence/router.py | 9 - src/openjarvis/optimize/__init__.py | 4 - src/openjarvis/optimize/config.py | 4 - src/openjarvis/optimize/feedback/__init__.py | 4 - src/openjarvis/optimize/feedback/collector.py | 4 - src/openjarvis/optimize/feedback/judge.py | 7 - src/openjarvis/optimize/llm_optimizer.py | 4 - src/openjarvis/optimize/optimizer.py | 4 - src/openjarvis/optimize/personal/__init__.py | 4 - src/openjarvis/optimize/personal/dataset.py | 4 - src/openjarvis/optimize/personal/scorer.py | 4 - .../optimize/personal/synthesizer.py | 4 - src/openjarvis/optimize/search_space.py | 4 - src/openjarvis/optimize/store.py | 4 - src/openjarvis/optimize/trial_runner.py | 4 - src/openjarvis/optimize/types.py | 7 - tests/agents/test_backward_compat.py | 43 ---- tests/agents/test_react.py | 44 ---- tests/channels/channel_test_helpers.py | 65 +++++ tests/channels/test_bluebubbles.py | 39 +-- tests/channels/test_discord_channel.py | 37 +-- tests/channels/test_email_channel.py | 48 +--- tests/channels/test_feishu.py | 39 +-- tests/channels/test_google_chat.py | 51 +--- tests/channels/test_irc_channel.py | 43 +--- tests/channels/test_matrix_channel.py | 57 +---- tests/channels/test_mattermost.py | 39 +-- tests/channels/test_sendblue.py | 27 +- tests/channels/test_signal_channel.py | 42 +-- tests/channels/test_slack.py | 37 +-- tests/channels/test_teams.py | 39 +-- tests/channels/test_telegram.py | 37 +-- tests/channels/test_tier1_gmail.py | 24 +- tests/channels/test_tier2_twitter.py | 10 +- tests/channels/test_twilio_sms.py | 62 +---- tests/channels/test_webchat.py | 37 +-- tests/channels/test_whatsapp.py | 39 +-- tests/intelligence/test_intelligence_stubs.py | 79 ------ tests/intelligence/test_router.py | 12 +- tests/intelligence/test_routing_models.py | 11 +- tests/learning/test_feedback_collector.py | 4 +- tests/learning/test_llm_optimizer.py | 4 +- tests/learning/test_multi_bench_runner.py | 19 +- tests/learning/test_optimize_store.py | 4 +- tests/learning/test_optimize_types.py | 2 +- tests/learning/test_optimizer_engine.py | 12 +- tests/learning/test_pareto.py | 4 +- tests/learning/test_personal_synthesizer.py | 6 +- tests/learning/test_search_space.py | 4 +- tests/learning/test_trace_judge.py | 2 +- tests/learning/test_trial_runner.py | 4 +- tests/speech/test_config.py | 7 + tests/speech/test_system_integration.py | 8 - tests/telemetry/energy_test_helpers.py | 55 ++++ tests/telemetry/test_energy_amd.py | 30 +-- tests/telemetry/test_energy_apple.py | 13 +- tests/telemetry/test_energy_nvidia.py | 35 +-- tests/telemetry/test_energy_rapl.py | 14 +- tests/telemetry/test_store.py | 11 + tests/telemetry/test_telemetry_record.py | 20 -- 65 files changed, 352 insertions(+), 1230 deletions(-) delete mode 100644 assets/OpenJarvis_Architecture.png delete mode 100644 docs/experiments/neurips-2026-plan.md delete mode 100644 scripts/migrate_savings_single_provider.sql delete mode 100644 src/openjarvis/agents/react.py delete mode 100644 src/openjarvis/intelligence/_stubs.py delete mode 100644 src/openjarvis/intelligence/router.py delete mode 100644 src/openjarvis/optimize/__init__.py delete mode 100644 src/openjarvis/optimize/config.py delete mode 100644 src/openjarvis/optimize/feedback/__init__.py delete mode 100644 src/openjarvis/optimize/feedback/collector.py delete mode 100644 src/openjarvis/optimize/feedback/judge.py delete mode 100644 src/openjarvis/optimize/llm_optimizer.py delete mode 100644 src/openjarvis/optimize/optimizer.py delete mode 100644 src/openjarvis/optimize/personal/__init__.py delete mode 100644 src/openjarvis/optimize/personal/dataset.py delete mode 100644 src/openjarvis/optimize/personal/scorer.py delete mode 100644 src/openjarvis/optimize/personal/synthesizer.py delete mode 100644 src/openjarvis/optimize/search_space.py delete mode 100644 src/openjarvis/optimize/store.py delete mode 100644 src/openjarvis/optimize/trial_runner.py delete mode 100644 src/openjarvis/optimize/types.py delete mode 100644 tests/agents/test_backward_compat.py delete mode 100644 tests/agents/test_react.py create mode 100644 tests/channels/channel_test_helpers.py delete mode 100644 tests/intelligence/test_intelligence_stubs.py delete mode 100644 tests/speech/test_system_integration.py create mode 100644 tests/telemetry/energy_test_helpers.py delete mode 100644 tests/telemetry/test_telemetry_record.py diff --git a/assets/OpenJarvis_Architecture.png b/assets/OpenJarvis_Architecture.png deleted file mode 100644 index 1c776ee5493917d077e3f4285b67212fe5d2b8cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 240689 zcmeFYcUTi`w?0ZyQ4moP5RhU)q)YFh0wNtnY6!hUKx%+cMMR}Z3mp_eN(jA&rYODl z7LZ<(&;ta*8Ncs)ec!!*`|R`oxqi8>WF|B7Jd=4=yVt!|-fL?rQ&Tcgl8}&4t2|SD zK|(^|L_$Jtb@2jl1hzccNJ4U1&0ax4TSY;EUE9sY#@@-Agyh-#1bqqvoeug8(2LvW zE-F4!UDddnPn!LvpX`~y>%2Gj9z77ee~wPNF7MZ*(z&h=MXzhdNe!Ly94()3`j>vn zDhxl5+PQzO-`ezO#&33-FdNu=;@(>;jPE6Rg!`qIQ=506#3$Cz(CHb8qn{gP_}*o9 z61V2_pZtQ2JKsk|1!><)NJ%)%pt-EQ}sk=N&kDU(VTZXzI^}pNegl8oy&BeWbUtYn@DDxA!PR zm%aUsl!vvI=Jn48WTo;y8hw0p-dybq8NV>uEV!oX?{y57N)8-SXB%AH6%H%mh7+G$ zxzUwVd%}2TD@BBMbm?A>GN(rP!g)pX7=^p1zNB%@sTN+@hN<{k-S{y{@~OsP+@<(O zH?NZ2>rU3nYwfiUZG$dt8~8ZiatVs2+aYhcE%ru2A(oj@&`c-(_7%O!=9AA$^L{2W zKYXw1hc7;MB^PV6(y^duYk=QgaJz7r>u1j`r^D(IANz8MF*?W^qPIKO=8d#Bf<8lo~wZrB!)C_VU=k@GY-|S95@EhTlW4 zO#^rmgJh7vlI_p10=H1v>sy4=uu?PGJC``kwUzI&u?gM`*S>Kx`vVJS_`OT6+^l19 z%M?Efj_17wr&mc~GLPb!vle^UqY@c@P#^HMhsEjSL^G)Eep%2Bn5UaKDX~kCKV-d1 zTEl*|B#3O(kHPBfWLL<$&7!l3^q1;egP&}1D&ApdTW9E> zml!ge`s4g9H19(_IGuWAu~BO_iUZ0SuwjcyLl=4 z66OuX8^oI{-+Mad?@T-tXbZlQ$0qYJa}T#00(z_=E<=J3Ue{){oxjjb3JqO&^-5l% zjM=J|JbWhsq1#+(&oRq4JkGFHjFXQsfbLYgev%2^3N6(K^||e|j8AB~96ELUX7hu@_lx-eMZgL}Gj8(v31Qx-cGrbB9Zx zT1IkdB7!ALg105ep}(k49$&pk{+yllUWiIRfmfo>+Kegb{BnqeHllVG=ldEsu^k2P@6`jNmekMsQkP|9b7iCF?hsHz99yUh#QepSk{C@%}){D(RSokYK7r zTuppUOiikH#JHy4vrUeeXUF$ou{2yCesC_ueNfp@K|NDeNqm-`jkgjlyEKt}OI`D} zTD#Js(2nNLwH=Nf+8xdh_kYIDE4|OU$R+%si)-qEMm$x#W+!I>{Yc8XLS(Lu&WcV~ zzUQ#cu=MblgM)*OLxzK(gGHr}!;%ARxHk{2Pxw@Xbk6P7)za0^6VRFc9H4&s_1KXq z(ne`FH>ZEczROOug0=!yfoHl*txTQqR@<`ZY0lGzR*pyp4@z`w?`N$nhQY2?!WzRW zI^~82k4DjbQ}-yFoaNg+8z~J&myv=-&y9SH)GECk(nov?GzO~%uME;V2n^2@_&*`s zCbvuyuDMKVNovWwaN~1` z+r8B7-|g5PeK+FitEcat@-jXbpC5b&^}V})vajgN;fvZYTK6BeU87iASuGxR>2Goj zVjgGwaZ_D*-0D^5Cs=mxGhEE;7>>L6$a?E{Op}bQOuZu04&x5vj#f@LEbfUKxp;if zn@Y0ZbV-BMw;sN8O}y0dV@%PhtaUN3Lm18<-qLBEP_9|#t4^(dis=b@chm5 zj4$`T6g&k(wV}TxZb%GEO+&4uo=VV5ib*uyga}Gm?{yC3DhGPHxp#U_E_=Wt4w6a) zl`K)oo{=_T}~OkF?MoCLAPpJ3l?z9oOF{3d(b`L?h^ROt05EeiT?O;#AU&($-TXeB9+Z5 zzVD^CxhC;+da)+m)n$QvKCx|9vqVMvUd6pZS{+))>$4o^?;};$Z_4|gY;Lc_QOEx5 zh~&zS{}GSjYM_06zc9T&c^z()<_pQ%|FK5frzw;aFTJ*9b!rG*rmpv$6EQ=HsqrZ3=(I#Q^jQ{PM@(9pg^cxayjOlhg~6oYh~xTXzHHg62`|Yz znGamL$AXzp^+F@(DSn=k&A#q@jUT$6i^(h!1q(HJzC}lH2xr{5z(ACt&E!g&5bE+6 zJu$@Fy4$!UhjgoC4hfC<@9?aS@$OFo0e=nNEOiBrYWi|~mUNx00lussRL z;~RYdr!zHOY_Qw4@GJFpow}aLv61MKh&yr?%Yv4Ts(e^H(=EWtK8ijIzTx{k zqk%>31vN&D+O@Edxwjn5Gmsn3^%Wg~I%u0OJvpiJ#CycGR`^H0eO*0WYtVZTRh8Tf zyauz^x0&f!#q1=2CR&GCDJy$A?RPLmr=+C6l};SXs{Aln1kOkC6R#htS*9zX;plF3 z4y>8=XNE0o=)h!(p|RLn9u|lu?ILHsB6I~le0N`X9mZ6~B*hfRJVg`A;$XkyEOm%j zD3(sqNadl~U^NMN<7+h+)A%J+85XS)?a9_BLoBg&>%!13Xc!M z7g^aG5SFt|>GMsO^@#E>nyV)q9qUz(hBTp014?=tki^$*p{?N=45^cCRcy73(6z&* z=B_6299S|?bjN{E`NmPaDAxp6bGv?f&j#C*SWW5dUnh&ZGN;)A?m=1OFXMDi%?WMT zEBL4uJUOmf?j7tE;q$M#UF99+OlbzWud@6wi=FJ{{N17DqF+VfefMQH{P_Ke`KUuJ zq`Y{2iI3|qfwLwfSS#M6F}`6FR=HP6++cAro~_t>il2d{;tz&UvG`*gLcT;kjhM8z z-H~gbsgl{%G#+4o%tYMRG&M2Jj2BqIyPSXcNoLZDWXpkqq{52i=GOGH^iNW32Mmgy zUopzRq9!E@4k{=#a+^7Nc=424d0N5a#LN) zpbq$O5}T2Dg{bj7U8QLkcF6KT7yNCD&_r@w7dLBmG5&}A5AVoPva_?x zxLMgqy-94)2=YG^_%k;!ROa_lDQ$aiYbQfRdkC;*z&+$7#3W??b^ZTw=I=ZHW2C{~BLyWN zKK$peZLn z+O{+OXThk#OI!&ro+!o!KH=!3=YE+LYt>-{ce+h5xp$AiblcFVA~Ajwvl$S9_`{_=>A$mkCJhv*sQd{g|&iJX#wb5G)Xci?`tOUayU316ul z)e2s6eW~C}plxg}d7jx>GLSi$u?m8usD|5kLdMGPhy+XZRmRAlO*$CX>L-rAI9qGu z9Ya3|mG;8KDLYnQg$%fe%Mv`O*Cv*9Q6u6WM+rRoIo`>fPQ|VVxeAL1*Oi>c+N_i^ zgBPsk<0av!ydwh+#^KzCB`M1P;@g9nRf3uip4O!rQ~kC6ADhozQDTh=Zjpme?CMKg z;P{;8H8U-_h!Iawi*%rSlCPPrc;}HBv%L7a4ULoht?l;_H>J_nK%m3o)1A1~oo^q1 zFpaayxvBG;Hd^?Y3MUcr!5CpMgM`m|MVc&(=o>s{>|mLbNqYaE`fxFtBpBj7Ey?}Y z&v?~BRfyh-t8g9zX=X|?BgTvx9DEqZ34E=nNZpYwOhmI-z^2P`vtCO(ceFSICO~>z zq^56b=g^YoJi@C5sZ|(^S@1NC2_&NJedLc1yuld-`|pyfaxHrQ$Xex zi0e-wA@}FGLoV6j+i)I)hpk|C3QI1-`V#fj@l1Y!kjETb`{$~*-9wz0o2$UNM4`a# z^^c$8I5fBsiR!Vpt{Ey61b%sWr=;OIHhb6e>bMl4g#Pa+9{h^(>iAooOv}4}J(YM; z^C$$h)Nui_v?;kExN{;<{VKRVmPh~1Vta?DC3Jlmh&g{~9gkON%R4`|=@F2*wyByre# z-Fj-MC+T)N;HxLy{6lPsoM`C=i(2ec-g_kt*KiKMM6ZosNYQ@%*KOH@9zD6nUZU{; z`g->dKD=J~sKi21!=68TR37HL%QEQ@Z4bq+3VESd^OVS_`$z)Mn%&b_xL7KsFGe98!0?B+!I zA=@3JuC}Pm_yp5HPSaHSA22*iyh2!X=h~1h2dt_)_U@h3#lBQER)n4jYfW**J&lxm zi<~*+YBxmrK6gFKp|rkdSY~ybO}>C` z;ZDiv%53_wT)o1vO>eYkPT8VoPQw<6iobCwDdAxN0rN+20fG+c*`9!3%RwnTFb1+PXuS z+U|iThp(H<@f-^%E7EhBVp;Qz=Vm1QaW%y~*vhky?~95?kfRLZvr4+$vjTTpHLHy< z$F~YkcW70Tg+iBn5#RIt4n){T@T&!)v#G8qe0xR%#XbGrO(9=9{lw2BM6~rWx^&X1 z+U7Lc1{K18w!o=b+e+4#DUdjAL0l5YSG=yJAmUW;awn!=n8uxFOOs{q&R3i;?Jx4X+iE2W|vjygJQ_Zs(qTvbqhbe=4TN0$1+~IU%EOzV~kHlDE$Qw z<`tXmZ#|YZ+b>ws&~In?;_t-5P<>DixmC?3Srh&edGhE{`h_0pb{hH9YuZKUH{e>X z=d&G0PamZFUM{7ko@RDrH(q(qJ@{n^@to3adTL`MS$HKI_i0a^A`gFA-*yon^f7eHqR*PCum>C7jB5p6$#I z>>OEwzoiA%^5Z5OW-HNyOO6W1*nS*>DO%6teBw7&_$ASj5xf_E=C0LTnW$dws*WD6 zV|_43K}{u{J4dVb?8$$y(r<%IiPnvM>_3TGJ{#XFmYMj3v~JL*ViTu9U&a!uEca`O zQB_ih`9ro=-EWe2wkwX@TF(uARzGg;=n@ze|Gd{wHG<0Kb%&?en@^jbtX5b;{$_@g#Tlbjc^R&&s`9CgV+-0H^-M!AFXAUD3l5*Lai)BO)c zo=gw$Sb4qCz%#W+XgsPi#&%tX3DA?dniV+bliPpAp`d0BzDH&-o!J0>*1tl=yV{^C zMWn&0PaBH{1Uz3y6_{Any2n}~9b&E!BsG1>=4yjEiMF{J} z5jl~P20V6Z35}O4GvZT;y%$rQs7{%mlcIA`+Qv>?pM6d4oens+SuZ4;!4z{}o>O=l!7Ni2A}en* zzanI|dJoY9w$=+q9teFhA8B_TTAKf=g`=!1^>tX8q*}ev>J8ADMMc{e6J_DVbE`CMX>V>ROGe+!*i? zE^NuqyX9SKKQL0IAU~x+nd&T@*v(2;GQ*`f053xmBCb*^W=YwH4?S0?Q{A=*eeGOu zJG|;DleiDu_{SC2m*IT>k8KJn}s z?6?hO!0b&>?ay63Yu0Pq#t!@EbsHWgjBq{8R|i>XGMzSBhmV;BW30;2s0O(Yqb>K3 zb{0PhtVEYX8ZxeuO&y*@9W>hOnGb~tn#T0^X#MA^6 zJwx~$wF~9Dry}WAJsPB1KSePxqVs31^v!OGfxi%R>xEFb#mMyuWdH<1{%r>?Dn)U zyP{>ws#pa~k);st1$34-%HEY|hoL9tt{Y;vp1S*d?$F7w&SlK)o5@`us0`_WjV&9b zFfH;WnDNt=PdKjJ)1zY84-aN}C$rq3EfE7V<{{h_%ym;#Yjw)?CuYog4O zl%kfw@}$6WS~GKcHsWsDM0s)Q?GlWOZ$|&<3aH1RQZp{lj5!L1^#~|b_}gBBn&J3A zVhMT_aW2F8@a@ULihLE}=Dzuu!G%XQ-I!A|6^E7->AOHNnhRXb1ZhIeS+-&(b}dDL5mFz9LLkNK|YH zjW-26=n}l-1gcoOjTrTF@wo}PHeE7vmfhiAnH{wD)F{z&aJ0C5rTA5)cNMdO0r?DD zV+Ozdi`<=wY8^8KUx&EM#I=gbD(R9D_tpLp-$ElJxsF%S56 zx}(qX!d~*4ww4zPKc{x8cAnykmbGT<9fK9rRX80)aQcm4jrVtVc8gPQwary*)J?Bg zS=RizVS_-*jnAP)w{)mYs#)+gNk{w!TSr?Td)wE_bNRLv7|+I}OTZ;omGu*)O$(*_ zpW{&Kh$WO7L*f@@t@hb7?8V7Db%tN0220W5as+Dn@#B|bRL5ZL>{kJjUYpsQGcfj5 zLSr|W!+P=u%?WhD=!$3wx>|nFgG+YEmhE>M-KJ>(#hG9m2T8$#iQI<6GX2^;wrty{ zEJ%tmiu3D9t`i}$kK7z%K-tC+Q; ze%}JWrfujL?1#=TQJwKUer+rfRj;bJ7aSpOijrFl9)igXhm~8vE>CI8gJyoaHeEjOabr^T6W=7~I82?;X#Xyd^KfWkZ()06iYHTa zLAZ&^`4LwRPh+Dql9wol;UXhttt5LCQda^=ab?MOccsU=HQOIOA`97B9INXYv2>_L zpkdJ^kmNi9-Z?$5OE5i)c^o_0V9J`m9}CeQ{;ErEk1h+wtZ5KEGU{goBQVE5O(Wv( zgzgXup_ESk+`fEv+J!Td>HDrjJLM6KO?n|Aak-jmwcL?TY!`1@%tVW_B3CPOH_9h< zU2D0ic|%gWZ6XHudA>dqqFwaS0u-w)@FaAPS>_vzA>&Bexk=YXqx4E@#oz965 zz-zsbYoZmSMH!XMVEhdSGY~Ntl>=%^1UFFDu)UV>KQ44Mp2-)cuY=ki)v2RiR zElftP**;0R1wMIg4(k)pZ1rSk|I7@(tb#pZ%LHi+P2BdY^Hp9eh``kFq_EF>rvZ!Y zuDkeOlKKX0MKEV*M*JUsxWm?dVkSha5E7;%^l z!ZXvSnilPk7`4CMxXdJG_%ykH)S<5YrQp#?Tr*ZA1dPM{3~yf)Y#@JPffsyTxjv+q zfSELQab23>uPYv)c1mv*8NIq0RxD2oy$SJjo*b;Q@FZ*`Nt7kpNi4}Kag>bE=V=Y+ z@p6PSh#`jueQ>S9X8^eA*wJN{>6#G+PTeDiRpS9iB#pi+i-qADm-9C=-aD8f%&Xo` z>czcPISvXLdReR@eRNda1J~VrE#1}moOf8SuyUQkqzNXj_qZmC;$-VAW$NwOXRq_D zo8>EVVaAeWYN)Z4cL8syrenv1>aQF;`j(1JeTHCIuZ1#h6WvwUd1)tbPj66yF^x?k z?16Q28&zNu{UYzo2*$}CH@vv7S*nl{ zDtk%gqt6%rLfMblMS`imB7VNW%iDttQSqnNr@T}9&%vMhG$~T94mtZSnI8PeGro9(do}t84?|?)yUj6>0t-NtvI+%%(#0oC^xO>Lp^u0Yxo_Z+BI1 z7P)v-VDIaJz=5cpp&)o!U7xtrUR-F`r~x)$Fb}`@xXD?g(&8og6tvFY&L|NS-G&&e zu^>uxBnYFHB<(&|?VPlET!V<}=KD3R8g#n~?z2AByRVV%SnCK;X(A%>ZMxC%q#K!z z2USidM}0ts)34X%s3G3zi`LXB0Wvw5*4p)*fgnv%O9%m1t=hxj1ZtNvT6%oc9-+YO z1Qqs=6_1a#Jngsam3xp^no6NQMjLe@BexwEg@cIPYIvQ;`)p3w;}M)nK*}I!kpk>E_!d z{zpHLcUlpjDXM$}fOI~l!ahAjM^=jkbTA;r2hs95Z0>!5RF&*I_6gVP0HsrS10=<3 z&#?{g7+1I5uA72AdR`K@9tFPRh)+QBG+6Q0*@jq{87aiXCN{hU`O@VNAqn^rZ_s=zKl4E0+IOgm0lPFY?(7UV7B50 z55{nmkvatzSQDHk<=>iX%uq44!(z$*dz`Qbbzg!n{xk^%&G6)Inp>Y%zv}g3r#{uf8p!ve1gM60}FrjSm7t3A4!= ze0##{^60!^WWWkvhO8>(Ol;d(tUnxp_Wqi$&;NtJbpl9wh}naue-PzG4R$${;^?++ zrF9NE+ma{>F_^Ng)OmM(WHd{PKey^uMaqoN?s@x}Ltn>*E4VAM6I6|51>Ab(pRAR1 zYKSP)#Upq+pFSuwS91&jhD5Q9qTNhqLN#wYY=fve>lxX6^rHvrhe|!#Tq^Ck`BFwA z2L$WIN3n{zfu)M~{bZ)ZL8UJTIt=ucD9$ZYe|6!?@cL+_zQ zzQ>wqH>zDYbE?8&6kb#+d*M|{^8scowIjSw9wSMEN`5NPcy|_Zf_AI)BA;Et(35U_ zryGB}Ani-&Z76c>A-_uGF%W~Q_xBGtPic3$3^yN?DtC7E6Inv8zgftjkmch3M^D36 zCP^@#%ijVDzIkbNJQ{YuQh{zuvsdVr$N*|s%GN*Ciais7T;B}U5rm(OH9A9VmjBL& zw;n0H(at4RxZjbaGRpUsc_h%du5q`_R$p|Zkvs6r5zSHP)sw<&_(BVu%SipA&`4)p zOp1PaOpWu%3G30|>8Kw!gPuAbt~Tn|Hg0i6sDK{Y=UoNq7@w~q&?u(B0|*+`WyiQ6 zJH$^u5H#794Lao&vgxk@-+U-md6 z9zY_;@wE(cj8n?kCj1qAR-Yr_KN0%HDXv1ZAA!Qe_JmeRXtql1vw`o`?IASN9CU2F zcdfhPV_(vPuTo5Dd5kul_zD=79)r3x?v_~t+=xb%lmF(-uOs?&>r;GF4THZ)9H*L% zoMYT?@>_0chDtNDL7j03RW;^3AELoD>R{(6x`s~;==*tagSP}TyP=T}E?4buk&+EE z6K`~@A)9*Tr`%^+uR7^jhV^-jQZTWcv2>LLED5vMLB5EU4yVYW0wSRAiXkF%Z3oPa1Dr+WKD)hm(R`>mh z7{f!WNx!xIZ+2%EV{SP+)>fO!vN9X2g_G@Gw+ys$43ds~Fe`H4K`C&tZsLGm?yno% z_W(8e_4%$4j7WL3mZ-6_feUOKmy-&{R9s?vmW)y}ikXDlSI~^J?=@MW0~`RE51PVUl;ANm~w7{kDF% zqR4WbahW!XC_OfNx^f^e0l{*QeSF#GUzsYEqPN#mZ!|y{b3fj+9~+(g z>G@!Y$EBXLOCM5FSb#LHtaNnJ`bGvqmByU*wQxCU+5rhi;}=gqYZluHhq{FWko9Q% zH$8*}a`WkBr^zkU0Y@U45?j@1-8N{^~f`1bQ=F zFHDcqt@j)VuOHCsRj-A%IsL$8b4zQM{*~r!)tBT|);yys8`Zv`^o$$)ANAqgwe-sl zC3-tElWs?ybX|3&hIy7-zSYO>btY%dshHlo+`*VhYWdnHFA)B8f_!|A{~}p+=!fX5 zeplZu?+5TxsdrU|C-TD%n1_-9B7uh?DzV|BdLZf;9qGe`e<)++{Ffy$fowj9=w*3 zRwQmf^%yUgb$vWwYfh07pzUBfnfla@m2~ApH{zPTcIBs(TKG`>UocS!^nydPto!TX08l^t+$i%3kc1CIn<=inJYTaA$xhU)Q-LLIirI|j( z2i+8~L-x90B!NU4ii>-n+3i|+BJ*mi1SQc~jFxKTrQVQbUBbME{2CsyFM)h1o5>G{ z=JuHYD7ynd+iyG`|@ow7Wj`!HXdmtZRz7~aB4G7_EKa6fF@nf6j4aOJ? zSHWPyt*8;Jv5=4!dr_!F*&&ZTm{b{ z1)Ke%fzOXmy*uqKOSd-8ffx&=7hC(}ZsWY{7)zLQul{uCo(f{|rc*z13f|ik??fyf z7e=uZke0v-w2|*`i6Ci_UsdU_35ChRM#v9thMYt5nr&?!TAE|bv%!#ru+GlB+hBCA z&C&Ysyt;Tl*0hq@;7p}0&;P56^d)-Mb?*Wwocn&LI@Rj$PLR?&=d*z>k0P|a{tx9S zR{U(GqhtX5WGHcb2 zcvpXn9tGc+Gc>i~q{y;i+va5agUv0&vkopr``M~wMv(Bs%X_n7FrR*9wywNw;puR> z;{A+5ew?R&kB$vPk$tE+xs)nU;*#~WbZ=er1uCd453OP&lJ{ztIO6#|Q@c;BJ}pT> z&1Zpbl<)D9*q=dTa_Fhfp-RO0_$Gj4;x#Cf`ZNvRN@EnS%&{NIdz_2*IBTI^TrH)A zBNl{9MrcygrSgnDJ_{z;TKu25-0Cg=d6OOBgm-$%I$~vf%+%J$4>#8&Jsu)y zY*Y2#>FM;ead&)@!yxqx;psr3Qk@0^*O{!ymtFc+r`ULn{9kc1g^=U1DfeRmEBj?Z zJJ8Zs{i5gKcCi4^@?t2fyB;6QYd;v|={mvT)@9T83?bJihRyj@V7%tr1KfjX+3WisU!YKs$%62cW5O&Je7@cR+D>J2 zrP|4S^+uMAacN-$>-sd=Fu^R+#ILP_`veW3xHG-fuY*~J;669b-7hCA%WXc0wMsbk zVx=B+q2AA$?tjZk+8(~gCN!{9@4noA-x01^WxT@gG?w4gZR*5U4**(lg;Lqs9+0DV zW%yJ4cEm`K%nFmhh+B^S91C8aV@1Gti@R11u(RKdFJ29O#hKssYbkI|YOG?&gjt;Y zvhU}y=?DN%6iJ7}63+FuTAOY7SF|Wcy}uv?aG+cK2gx)X?f8ji^SSS#;V&AEET@W) zEMk!d+$dIZi-q!B&ZWKNL2Z})K^3@p+S&PZ8PCZG0=ik~5&q0+CgNWfv5zxAx4In9 za`)}b3p`bgd2%G%r75flwiQT~ekyXZmubN?Ugb2TqgQm)8(3Yml_w`gP;+AjYi2tNiy6GBqT^v9mqYnqq35_61@iB@=%4H6CfC!~KJ z)K_U;{?uTLg{Xg5XeY0}zb^H6dx~pnfb8r?&dfXq!!`i2x*t2to$E;FK`m9ygib-R z3G1FlDWeXfJtHTe9)}Gr$ax1*r5q|{w24B=?){{l%)zfJe96MrTU=gsGc^~TR+8XB zE>jW8d7SjT>V?K%k~h(T?JG?642_3-3S7EbdC-`yFUBKJ<*c#iS=781Qr2SSz(&xR zC4^UKA^6Ue#x~2iNu!$*chaxzt(a#16rFoo_p9mo*aL}lhm!57(qTR{(bawi-w2aH zh{8_59szX9d_%2mqvH0REK6F7)U?;PSyuGh2qQ4MA^Ytz(ZSz!D)g%Dy@CZwQ$hUv zV!m({!7qD4+Zl1 z^OQ<|!>Z>DNn-A$9viYUt8XEu&i9I|yv6Jq(ouMoay?vUkt~5_W4S9;2cFE9i>!Mv zLJd?Dz-$iUQU2;<4YZIt?8u{4#Q6m!5VDr@^f4F|oFNOH0WbQDd|EG8IbFiCBky>U zQ#-Qx%yUTkFBjUv@DU?7>w(zB5RCavqEefz{*ucH8grnLXIG%`D08}YlhO<7YPC_gPN85+4iM&gm0#7mRwZ#pqTfK;G`H@s6RW!Xl4f zzKtXfH>~ci4=>dWLAw=b;4!W(u*1!+K=al1{GEX$d!YVq&60VHP@=ts`fOU^5m`@+ zIwhxfWf_0FkpX)B{GXx(GDsxb#qhsHIY8SV^r$6HbR+O`U5F4g!K2cz;Kf=%N37(R zT;k90L@NMcsY44)llf_zVreZUz6x%@$vlTm6N*5H?r)`Q_I$Q*>O>C zi~+gmqSlHEj?|J5B)s-i%ETeMxA=mSyv=uY#)sW?YQN@xQq~&Xl{|eII9>65&}^s8 zRP6kwbl{9}nbS;C5c}}I-0TSaGffKI#LM#A`g_N*q2i{=XB8U`)T4MzbiC&*@g6|& zS72fds()9UljVgU-Wqn!uY@@uR1`uY9c`Wgm7hXARHw(Lvga|TFVJb@&D|1e`T$V+ zCW8)zT7GP`5psts94M~iEB45>xs0je0ujt-aW3%e?Ni@@|LfqO#v*-d$>kqr&LOz6@BH8oW3`3`3}4 zAUD|`_r2mZ)Hbx-0b?_Oeop7MRy}gw7g33mO0eAp?0BT;2WO;jpL?X9Fkr?rj&*Kl zvqQ!0jKYm2BiVs{_oFsB?A143AynGJi)XXbjq5!o94h@}zE;b;noWmqq>)W^GYYq> z($+}%Lj$DTV~%E6&1+rw{J!>nDJq>tvfl4E;Wnxt1@DbGf7oc&iv|jW&d`ScLbn55 z5F5yEGJo7RP$RrU!xm?>Z={xOPsg;LJ@;5qkzUe$IgMwpe0_ev+0>=V`3}$@WLrI{ zi@lNM?UKhw#}>GGo68ksu79!M_D8Ru_018*1#@xeY@}miAG7TQvaD(tmNnzJgR26= zQ*Fihl&6|z)E#7up1;UdUCaOSZ9nZikJVz$S`}IyFG9Lqe*eKiCV>3;$w0CJ)%dWk ziarKHrfRcW=M64JkUp!FpNLty?l&HRk;E}m`&%WdZKC`-rHzmvtjJr8B<*P9ZyEqK zmm75I%Mc*~p3xHp&-!XDOYpVb}CkL7T04Mpnt$p(s(78K1i>voX4Hg#Df{LBhC#jfw3vi zvh{R}j%xs%KU{L?Eda9tEx=#d_ph_qubxqo+x3NLjrl5KALw@P{(4)*J}j7H+XKex zjKStycm0KHGF=ddK=-fQY*u;U8Ib|kwVOQFfAFm=hoju*;WL_uA_m1wnWejj0fnAB(0 z-p-|mFt!fWfObYRXTIAsG^TlyCg(qD>vW*a$~|C0$0Sd9b3;5(O(%)MgLniDJ2{!M zVHC3XV6Am+hLe^p7*d0+#d`|<4Tgh)5&$ofKxzFCFG7DvY@5~KNnw2)m=t+HN}SSe z8@M%H9db`&UFOPHop%ij@^sm zPm5t^QZ_qLV8V1bX)!>pCQe4{!$CVs@L~HG@8#6D+A=|l<%Z#4yqFnz(`y=_DF^7? z+UAM`Y=UNac)zNzBPmoHwL6N*0{Zh#*0g+zj;4rVd%TW^CWP%UFnWERpqJ>$J728l z0+6|dH>gLDU$sH2Mvx8Dua>GVQ>AT9vvz3{|Myz-+G&0xZ%CT&AW`czhRb5@Qy!YxmJU`j8=;D~(1d;!}=wI1@ zPqXJFos7xp?OkXK-k)W5cEH#9m{>4YlWxfqh|Hxqmr##<$GCg&W`i(NBw9N<()TNO z`SAy7jUX3sq#Hoji_b|Iq;evR<> z4~njF1)8f}reR$PxBu#SHm5z@Ee>4D8AU5Nt1ynxj*LoAve=cB=;1d2zmIr^C^c7* zWjhrl>~e+hfyR7sE%x0{aK4|rZM#4AdL$lYOuG`0@R9T)@gl&UuQjafXS(2Sihwdo zG|a1^Mv`7SNaV#f%@pf$&+hP9e^ic00QOQQ%THx90>E3T{f4Qx#+=QuwhCar@0d|o zqB78y2KiHB6&K8?c8l!QtW4dqO|7a%SNvvd;~7^(@9UJn7kZdRVxll6d$;ZY`C&%- zskpG`G1=MxG(OO^0zQ<&@0F{?%3hu9`tCFrFv1HPQj=#=NHP$T7U;adx(~A6S{L(e zsdBW0HfWo|ppF|%4$b+EUf@6=*GelmEG(yVYD%g$o>@EitksamYlm0?Vv|#?ir@Jv z->p~E?p@(uul|9-B*A9@GWOy5o6!C7z8UBx&Gtmi?1Wv~v2YxuS9EC{RZI~N5L*0A z08ZxYqjAc`7{sFFRDjfvWR8=0KwGF#33SsHkRlrHcdL^7go(0`;S1!S$n^ z;^Xh4fdFBevrP3E#KRy2PUKG)p7gJKZ2EU==K}BS>jfzPqb$RG9SGWP`+uYg)awyQMuIkcMemv zzJM>c+TK@9_M+55Vu5x>a0mQ`o{j~zQ>AC1tZ)Vbtmb&;SV`ryuq!=DNFxHxgdUq> z60LlC%%d>lI#0g|*jUvrWERU4-gMIH)qtl&H0z;k0xGWde^qT_rY4Y~&>X zKXmtKEUJca#UG-@TsOJQ7Q=9=BdT~*6fJY6EQ)rtC>gfL$mrI;+>p6LGmSaM@)}MP zA4dZgvhL|HHUPlyt9!R8kd6%F>r(0S3)07vF-2#^a(+T?)0Y`V1AOB_Q|n3PE{zBE zGDiE~Hl!~L*cg? zGWWP&z$?ouuL{lUK3-j*a zQrB%3PUV9_n}}}0QofPy5|C7fRYV5nXe-1gf32JW$Qkg$qhnl4LmH?48${}iHn|es zYo?fKRP%6=D!JNDw?F8yLf3~SY|IMtC>-d`yu$V4^1g3FUq_(a{a_?kjr<*Bd1A-K zU2@oi$NuXtxpH2F5*8!%nbqc=9Gz&jxf+6CJ%`_?QI~{Yvm$_hQ|nG|5&|Nty;CJ=6q__toh8fjOta4nZEiNsB=@6t&}udA=n59 zZF*Rsui9za5CBf}e@dyQZrZ z7J&3eO%{W)$w0uE+1Q4i)A^1@7c98@#m|dUzGx>i1)<5YpI-z(6Q@(+fR?Cuikt#lv1)Q%g)dqOrD{0I3NYawi6p#ze(24bKYd{W^b~KB@?>rbvt$F z8Wf>d7ui8QtQ49l-te`_KLZgtj0+KdA3V2ya-6kI?m3luzp?mK%Oi764PvZG77jA~U8rJVx|2(23 zgRXe;&+_VALbJB z+&5TpzEy+G#6M_*{z-3OuR~uqqyHyW@6XbdKagP-7w)psYRn(SpCU-Y$aEOBeDUxyr4!zxaa)So8X@6yQ9Ixq%S?+4qzJTM-?ZEuzV29y=T>o5u& z9n7!$Z*0EbRg1zbmQ|?))897Be>=j5y*2*J7yqdZf8KHwI<5LgE`Wcu@t6wsG8Da} z@P9t>cenrR(f%fJ0!;@&XX>kQ%S z`u&vucEkefFILr;lK-uBf8Mtu^@|x7Bk=4`iT(Y&e?2mW^^uLgB+lO!#HN4^!Er`E z$8W{>Z%1gbeNwa+U;o?X--3Pxi{AQHX3f z{m-ZTx500ggl&Go1yTQPLCXJs#q|G)=KoF6^iSdiL7dhL^%H{4MIQnMs%4UlCxJq#->3NhBa!DN->L*BvP8zz6;^l$pff>@bh zH>tQytG98Mi)ZiDC-|l0C>X_7C0URGDI%GBp4F9HkA&`tOPgvrW1)~G|*#mb_!19?`w(RjqV6l@LQZ81T{oD`q z)>HJO+e+`YU2@ZG_78QDSk3*JPCgr~re@*kkJ zG3bFzA6oYh-k)m&2|90c-+0f{GR!u+9k#4K_uPwF$LNXVfvokXs=ZyLyw}t-qz(En zsQ(Af&3%BIO+OW1gBeyE-pxO4O6#wk&3=B{euq@7(2e+o4K%@4=C8ku8_f>WA0&H#Ji_1|Un5i?9MP$#KaSPJanMA38*20wSf9R_W@W* zzJ)%xr`fsAJ8+)mv^$LjxO+l@xPRez{3l_de2V%@ecTR&n1~l{RBDwR8gO*Dt_T>q z*QN2M?dQpeuqSgBqTiyf_t9Iu9Vz6MXl&zW{2QEIQC(VEj?N8P$a*T0(^PRAERmPXNVZJT)Z_(w`1pY=$wPO z4e3xEc-0WVNYpCb{xl3eXXWPdyQnrks5<{ic>j9NKk4n#+V<(mP*YUPZ@ z2%Nxk7Y7K6C`jbvPO{CME?;4zxqO=LSG@jZgZAG(?>|QR-zKWLHMm4p`vu=&St`4o z7jMsE1Cv zEZyl+kYl`Ho4Ovz8Ep&?O}P#4E{nDhQQjWSj){_S@{CRR%fjqGNg(Xp9zuB1vF+mp z$q@JliY-_C5-*h!3MWX!LU-x`(&qkZ={+Jf?Ym%Zl%8ySbdMv0ZVNYB<%dP6{8$82;U0Jn{d57@lxC`4iIbH{`rQIZ%kooplZdB`aIUu%8AUYim zYRWLw4TBdEaviSRpVZZ~=r4!lIR18QzsQRNu3*GEkyK~pSne-#hTIVr0?Aw`OrUuR z&sJ_3(e2~zIIifmaN|2&Eabl*T2_Cf0eRdKwkAv;3JRDysl7) zRkRZ6>;DgG`fu+%f-~K4pAIt{1}m&^qGezp+*?5kOhEXB%6N=o3XO_J!?c)nRs~;HjrF5g(H2U!A7^E~3WF zu;rzKvyaSsOc)_@o@uo!B2J@7v%|}{NOE?)G8IC^5&XBP^Tn{fLQ$}W=UG5zO0EQ z+&q$UoQg$BS@GR!96YU0-8jtc@J+E=64u%j})F5!U8<3x6IHlx3rGi zMeP4ytUvJv*up%xIe8i$ib6aMyntnC$R6qZwoq!1bm+wDJoT~k(wAo!s1KorB|LeR zVHZfNkl3#=U;lONE(mRN{h}% z%A}~rq5Oj!9n7)=-tX2_W+)R+FE|fDPS&DbGw10z{q6E+mrLVR;i30P5j|3_aC)&D zq208L{XSxMj%AL|DhPa-$rf(gKdK;r!-b3gHKW#Fm637~=7x|;SAykM0^319oNbNJ zgYKEa;q=CkrvfW=%HxmUSD1evg@M{oS{&dIqO~(wq7c_j)qsTyz=MMx&9#_zsVG$4 zh^$?G;Rg4pq(x>(LPej z)~v|iZl>HU#}ML$0RGF9%!+(tCsR5RNrkP-Y2Vh)?VmVa3&E1yeAqC0TVMdO6&Lv{ zo9r+4%0F<1(jMmfk~&hF^WS$P61}6*Y4r9?eg^I(#KAG?tWcuJX});4J&dzR^BF_{ zBTClb`fF@G7Z|3^h=mEx=AbvXNf|m>^{b^Nte?z`tIryrt13T*Lv9Ct5^byWnev^v zJ0utQxKjCRnFqsAwwVgEsL z1VnZz9aov4mw%9VAa9Vj*I-@f1;+1w<(?w2m5*vi@A$!8aP5#76V-V)W=4-7iO2tO z=UcLndkeU(F^$tqk%6)8&J!fkf~}u0tB5#1yqc%B;1Wv>{$yR4Eaq+qLoEgjV&3O)(Bb~)&aA)0 z0#faz9P6pjh{f;G#j7G$VNrw-^A2X=moXg8M?YUKvVXMk^(>YrVvHBd zTWtYgByOPaBniKh>5XZeC~F++b(`<(rNiCX8o$VyeOn{WmbdeCc8fu#}ecO%{be~GW6 zPId4QAe%EZOa$Cz(b>bdn#m4c<*DF2KsbA(xxa!om77jIoq-&J_Jka#5%dZS77aX| z&7!}q%gc41SxJdL_1Q9>clYZx(sS!8Tg_YBn?c)n^fUWG3QH(G@BSjPULFtA(@0&K zk{)i+`!=LM`SH6AK~<3$r3O=Mc+Y`-x1HaEPm$u?p2Ad>Mv1Dfwa7&?hGz=OcBY3B zeRh3I?LTo>+~t>Qsw%)#^I{)r*8PL(*Tl8htVuEvNLc)gu5MDi%ca0t7u{@#jqzR3 zh0A`e^Jcd9^$9Gu9xkJ5y7+LLw#FMvR$F$1I+!bekv&pYr8lFEVJ+}F(om0Q&GCLK zP7OxrYMbEf-qDq06|%j6AY zf9Wzr7PJn|^pq0ONb~xLHw}xj(f6INe0SC*XXl!;;1wQpvUw!XIN$mZ(6yE!XaJ|V z`A=+07moQH=n}E8#jA$zTg$OjiF9ts#8Wg+qI#h2IDYr4#$pj?B-Zohp%Ipb>_dON zCa1+4hFaLt4#lToEt7nD6gYXQUUMxD*ep^8l;L!`C z?(y69SdB0D1c&!|$aTCT)SWB_J|w(emxoN$tM}aVTX*b;wbHx12;+W9H6X^QK+=2j!p| zg>=HnwbscH7y{nR5@Ay>@Q70fY}s>FD!zq!)vZJf2z_YH>l4O;YHP5)eN`=NR9d*3 z0bg_;LxrsehhW-5hhiH*(&2`&5Ld?9`|wX3r)>NMY}hI=V8bNhw*0|j*f7io!dR}$ zdPnyzS22q5-NuhPnaO7G`wrC6N~=@p#ny|w#p<3py2YMMJh4RMQ{8G=O@Y)pcTuOZ}dOIBCHqSuRWe0S!GXXn1 zj(idn?6g_XZ=8>5TrA62f0!d-2n49-w33O6p}!^<*tYgr7L~oU0T*xkz&+%i7rj}n z`#D!6Qfe`n8kfWD7t4%!C6l{8 zW-j3O@V2?JiZaQQfBD)AOCc+dg45t@4!GD<>uM@igtOfR<9?tzssDlfnYuz0Y~kQH zR5H3%5VAJX>yB7l%{*PjH|l-S6j!Uz#8qMeyid2&;Dgy&Z?k&mGt)9S-SNu`C1)_G z)3M+clfjA?-85YWSXae&8w3L8b@Fa1>wU2? zUR6wWFm{?lZu3RUt$aK%3tq2(CqR0$-$J|IWbVD>k5dAmpV8cV@^2pd9lBo%>9U6~ z%&7(u8{nbBx$Ap&GN*{7r)S&F<%df+r%whsrYt7vC2_`{Lzc&|lA2_RAYr(3-nP%c zS@i5tN{@R^2Bvx7a|0{^x*9a)PYjg+qipoFS4M;J_#iEOkT~$`Kla?j_} zgr2P7c&Izt)1%I#TTDmVACDoCzNXivZ~ zxL=QWx};zot4O2?Kzs~f!nNMpy6&l>KO6A518wFTf*WQlgK2qA4+=i+Qsu5E zIS}p{Zk`F6i!}EV&bycT_ zs5n%5OX~6zkh^e^ML3^z^?jHQl#w{h16UA^=EZIdY5dem6vaQQ-}vfTBSE1&{L!1; zu;GFx4KnyZuY!KvFy94O83C*Z0F~a)%`QO13~|Fhg_B%A zgrp^CPBIuU{G6+d9mTg&HXzvLJ&m>hp|R_Gs^5(pvA`Z7{NietJ z+tBTtPM)<3s67h*bxLl~>Cy4&`dm<0)Hp2N|6wo09q-f=%i37Te&?-#>jvzGi4vU! zZ-QqJd^XL4jN+7ua5tZ3!{?Fo^>*9fYx{4Ld$eHNLQ^!NvH!9)DX#x3S!a3@Y%PE# zy2XID!5$ii51xhNRG4G|ni|wvw{nM2R179?*irz`K$Vs=qX=MsG37u<8-0U3(R)e1 zzCweAd}gK80^8cbLe+X>)<?mm=XnOK z&-TGOk8S4LM+*$O^^2x%8Z3S1vh8l{Q?dBp3w407bRtdKl@jKx)5f(1lE}75m$vk! zO+q6lcYCM+R}bZ#DYio$vLt^y$$Hr`ylJ5RZGGi7=ODPM2x-iOe)`rdf~c>=Afo4F zwN#Jn;(gOj&g+Obw^}>Xn$r-iOEEd$8@nVsvU55u59^R%5Na&C&PT6Cxb z+a;>!hCIRDxpj?@Gu~Z6xk`&r{IPuCq^_sfIC^&cN$>?_I-DAc?fiSQAnak+C&$ZW_PDibo7h`KN1&((NBszangMRNjW>RrjaxX^rM8k+e>97Jm(nhxzg%S#-*4bn^_(T?X-L zjOKV zc1|jSj_l_uG<~OctlG)dtG@Tv2h>)qRSkWpjc74Xfr5<7NE^W=B1N04V)NyCMxLbPCx3$h|8(6##E5yZA}7<%z7ib=+4`_`UotnJ%rO^qm$>C>kO?=@g+O-+Hv zp#{$;uhqOw?j(={7XXLpFJFGfz{xR%N9zDi3nAx!qDH>>iU@!wc}Xn;qJg7MN4|Ty z4Y_=-i+s1p7YF+~%Dw?_&r=j{m7e{B8v*A)=m9y!ID_H=q9TqeR0^ zH{M-c`(V@JHo-*1?U?S(XFWbbU^`KSONLmx;zZQKD=I2#%?9eNeD;t-alt9NiD^YwdM7ZpbD%pV2MP4&eb~iNH9|v56cTi z<00r-q%mo+Shb2y6&el()&;#1y{j+4k?F)Tf@ncZb`mG3YW5c?x*4Ah?d%@<3|LLx zONUPlE$(a#nr14>c|>fw^_8y(>HU@(9yR-ZsQCSWr2`C_ke%K&YC52Zbs#jUNb_@6*Y;t+I@oq) zmYe9!F}v^FPh|G|(r|w4G1P*CY%tfTw3_a=aO3g0;pSjEowJ|Y!K)74x3H+atE;w; z(u>CBBr6~|IOxOct7G=XgM-O+=?nU!`ysBikS~w%0WUSPKM5~D6zYU}#V7>S+NzKm zwTRQy`qp|Y3sgZ>R@urbTIOktLWC#NqTcRD;yF6balN^${%`O~5>to>RdbEvAIA>A z6II~%fXV8Wrgy>y#pWxQ?^>FpI{GG2ois{ys&&!`po*9)u+`)n&-)PJ$RM!ck5+BGiUO+vkMjs{tE`I}&&(oP3DuIOWx zn63rE<0%4wGTX`FtZqP}o=nYWrsr|vq;=oVh}2}-xBxm{2++sa;t}^AaqV}NLD&aH z9~a&o5Y5pfRqt~q)gH}x5sOf^D8@0r(=RPxG8a4>67}iQt#m0Vo)8As_+jhTxqPAC zXl%KESE1`UL^`1?)OV)a1wj(hKoY0EENUC8rTFNl2~_R9E6Tl;{K68Wb(KR!GvL|v zfHiK3f{3=(@j-g`w4cHL=8G?u5p%~^e3#va{6*%~vs*+rsA~xgr@Q8Kt z8i0HkmRYxpTaD81b7R+{#W-im|L$kV}X?J12BmFj!w+)t5jPL65lNYyQ(rqReV&ja%o_Z~Pb^lSq zI5atWLxMZCJYzA5S@*aP-m~(ixEFBt_Z(azpUG)zd6h3_oY=b~#=7WGCK7?S<;kwCedspdeT;(Cu6L1zPhl2i$P zUfa#P&b;_T4hth{AM*{7_EKY#qFatp4p8zRSo;ZqQ~uNE5-g_~9gsnlbrt&7qEX|$ z+ZqgQSz{5=@Q3%;`BH*3KMvC(KqpHyiuWEI!7prw#*TXQ)c4S;nmWab$ea)*!v?%} z+2B81_Zp8Bn4gz(+FPcj-(Y)?@7+qM5}D6d+ZB_EO?f>GOT1i_MZ!eW+pH@}louO_ zv(ck%nFPYKFK-Yevz=ROjZ++$eR%X2UnrjC>4i>st913Y;gi^Av=W}2WjeQlt^C-d zlE}U1$DmwMj-ifYO3=%yB#yBhdHmR(MGRDCchvGeft|@int@3CBV?xwvNZO~CLK0A z&sc*GxyuP&Hy!hHgQE4VSVp338YP2-0G(|8K`jHXaN)6AulmBh$%cMbq4TN1De=v8 z2uLA>ezeJ=#+_6UD!6c*nb&1&*}Ypu0+xf?q@m&(t4!Ej?{6NSy-O|f6gCLL>PmTSxWz83Z~ zGrhQQdV~&$|8Nfp=S%sLtNK`J?G~&*O6}_StQ{?o$sm`kEs`Yy)2VLb1Wj0^po#Rn z9!I5&?F5I0y(~^CnNzlr>@lxCze_|5)#<6%3{u+e$9^Ld{Q1Rm&M|@S32ljJcVUrD zB+Gms=3)zW?-;W)M^gB}V-osw$(bOPP!Xw+$DQDK%%XI}yz#>P0%~0aw*7vrs&61n zyH(3Ui`SqIU!U81bv}y|#+|2rd0wr6naZZev9ssz`l~joNF|Zm`9i4;!8SvNo+?s1 zf@I5vuBw_ch9fv6B^IpN!`?|OF%8V1a!@i)uMS~o zJT)uDX)yFY0du==kN8udEI1qA0}Kx_)7$R2N`2@^T!s;xGTUx>BT!>y+hD>QZgmk( zGHXdb-^&3-XipLy^0uB0Ae_i)3p)9k`=oj4IXiPYJlw&se&bK(*yqShhrWgIJ7@JH zee!thELd~CGU^iE9fjXdzKHg5ykdx|g4ASG*7Dz_5T0`Z*gFd`Dg(MjrDX4@2|b7h zj*6QuC;Ku{N3d^Se|u)JR)*U*P z-JE%mc(S<&^Tr$G;A^wZvO)vUj|?s+-2ISKOCyWVWh~_DH@;_UJ!17QB@zq9uRcK8 zBGg3&oaW-%8XtIePO&dHY7=oGQuU{;nJ0m$;JmcAJUi#1>MUgE5V!!G2K1HVEfl|A z3c;5wqo>0YymcUYjX?*Xc zZxguKlGsFI_+S|P@+F_E?ML-RsZ4{o={)VZF~hD-&gYa*|M?5Wdx{DcePa$Y_s*@i z7Z2sG&DW60aME@V-@9)K_>w9UZR}f7mTz+G7YCSu(${Yks72lF8TD&GlzDcv0mjf= zJ3Y@D*$7+4=~S=ffYeOQ$JCTct`)eUw&3n+N|VCh2r{c3ZVVr16zOOXDZ>^I>iWj9_-4* zJg+jlC#s-HH#BY%)AsK6i_*`|c1Sf-aawqVQnKExyr*r!Pm#ceNMWQDjWkGvSg~zB zWyioWP@1jce`iSMXrp=^Ce=7LXD^2M(_|yL!n&ucbb(?-?|o;J!de}`5JRt2qXL$e zZLGR}9c#-t1jVa#=GjM=GlqyDPb8>ous5fKp{GSL49gY)+x8OqR$cb{7r}1If$sPQ zqvaVr3cKSKVmQRtU5ge_8S|U3li&M4g@O=Sx-}7ottKlTZ;3UiK~P`eLQbboFKpWi zs6Ka`I($<-Z2QE2HcY0q)f~ksfoF$v9OP@T?z*ptj@N42f^W#amF|l0f?HD>qP|S_ zOa4B`GKfp8P6g*BPvVU zVhyB8(fk2S%p!8NRbaOP%$stg=(M;srcSxP9c1Re)KKw) z9{E0z=n$nCtcuPjn?CY&6Py|8@k>Ibc9oLW^H9d{JrtrD&9FlzI(ii}MJK#X*=etF zXwX%-eeOHN8i(L1bAw|`H7(BH=FFUDpS_AlKsfSr-&`G(^66-en0M9_f8|n=@w`}u zLFA(6c)Wv`vK;IH2tV#^ZLk9y1A@K2N*Fu(+K7KE%uhWt2B|?^ddozGP<#D!{2hT&=Rt0)3a=-M{ z=WsNiCqUIAb&TIm&UvOcrcU^41O*KXwr z>qZLau~vNtY`S@GG3h**~eE( zS(G^ssl$aEL})5T(h<5DnY&M!bz`}ZyA~J$X+I+F(*zU-mO{VnMgMxD<@8ijLJQNC zZ$Jp!!AJDiW?0?^o$qgOBix&Kw^Dj$nzS22q;YLcUBv`%`&53T7C$k<%jui+#1ur> zQevtbS4EhOCfJYe`ZNy)W|%_nG@Q1unj{g?tT)x{?~nHzQjz#jS}vj#*dq-gFSSt#GDjTvQwR~+ z51CyLnHx+sPTBs!rI`u=s#5|8hS6yjYr?(Hc6=_ZO~y#7#!f#ow?ayWM2f)PoL9cp z4`>eGM+f)P<~;#$nWrLrRgo1tT9;>{6}wJ1?Nr8LG=y7lYDboYh*0%Hk1B1D$ItXt zA}UlWeuK#y+adi(aA+u|=Nfeo6$P#2%gnYH85$#B&`T*DU#p|UA3sx55l1!;Ul!o< zYUN&CUWuu4004s%R4@wAmoZJ0M~=T^PWVU66XL@WbPaEAN6?LU<;tAQN+Wk`E#42> z9*_=DE#ydXaoHIGuxaeK=j5gEs>oW_kO{J9i>-YbnA$CzbQ0}J%IwiYxfBUBWni5r@Pn2aDe;%5nH>y9 z_j{x37$0SLzYd1yQc%*C4` zT0|eQ$FMzZ*=+(x$WMAMwLk2Q&;CR(bVbhFCv2BP57y31jeezXGtUz!AejI)M*}N+ z;^E~sS7h@{Ke;40*jzmKAPu9v;_s`NWoVy2W)!HAlF_*pmi%@w_aI4Q_;}LQ^x0+v zC*M&KTW={PLJ)g#)TT=k)FHZ38*=*H23)g16E4y1grFO)HT;t10wrMM^R(cxdd zXPIrrgq)9PUy2If$1ru$5N76)Nm4AdhmtRQ=gsBdJlV0PeFELPf4bVo({+Mqk+y?* z)qLnScSwl5hFm>(Lxg9`;rMj1;3%{)!}K)$mTWPP=A4wDd@A&9P|WiSXFO;%61|CW zo6;;M^$Y&42n+o1eWCOAY5+OsjtLs((6;d_^x@AEAKIPEoq|RWszPl%H}+(RbBr@R zQ?nK(;&>y`2Ia`stirOEzWYeUd}X__mF|V>IQx50e+gsHcc6})-o(Cr zXnc+GvHe3Ki#8-=dg=;K@Cg2PH6Fr}wOFdGcSrk&$wcX&CG%_9Rz70@ z+J{z0pg->PnKDho**x4`(^5GYx>vfq+<|$=dUN6o*&;+Hh4fItFi|b>UW$yK6jfg9 zv-N(hB#>pOaax+Xky7Q?FzuSM-EtTa%_oZPvCeOH<-G(};6^gQtAA%3nXHY zza;SiZSFCHszF5Sg9(`S6=1>XTD9$2Yj5Gzs%BUmj(CTbsWef zy-Hf%IYUz2mbkB^v&!tHfH14YpyB)2#dOIrogE+3B-V$FG1rWZ=Ru$&#l@sHVT7(W zXAYThi5k^V6Of$W!w@oNynUu5izGLIXaOtL+a!LQB^Y^rGhr6LfXS#?O!(?-Iz3|E;NVo1VRb$bPCq)p@Om`Rfwg$$ z(G<(=0JO-#!0<%k}H=#_ef`)dG^LY6-3f6xS{^8)w-`P)%`bqR*El;i@xg#~rqmv3j=$S!wS9p+d*nLX{ z*(Q`(<$z#OdEBwOAo6o&4uOXZL`iFl^11eujUFNf|EKAT@~>5)*-s*`GK6N4FuuNG z&bjm7q!@gfNpC!?{FpjbJG7`h7glBozc7xR^!-qHjV^f8HhVEzZ1Lm#rW2(;l!5;P*WOclaff~tMz&c7VMy&;Zh#_0%lgZJ5j{!Rt zs>Xr6IK$ox_`^q#!W!F_y*@MG z%;ydT>3AFi6(=2*f#pGzbok8>7i& z9Oi{yRX(ZakTdm9Q+J=`0_N53w#EVJLr5plvZ1SQ_FENT35KnA{M{2>>h2oSM~)&V zO*}8CjNN|(f2AoC{#yKUn!dmtU66M<19POCc^pXb4Ex1xL3%t+z>;%WFj-JYsMbq$ zJ!$FNDI?cNZow?g>D*z)I~REiMtrw1Wi99_hYMoEZo}Qh8@>i7=XoR#W&v}wYr~A^ zWMz2N`z2FVZ?OtLnroEq3$7sSVD9)t3)Ps-4UMgLeR=vc59~Eb&2335m9HE4KG0P) z!njN5d8$Ya_{cV(3%`|5XgL-#d!rI$wpJft;BjE(v`$yB*yF1Ms3IvqPkz)Z*WK8D zLgf*;;%zYw>$>;#BB|bsWGqjXduAvC2~q`3{b#E51gm475%=;%EyrVD5DG+%WQZ<_M~{rg}o;BTu~e{zo6jXLghM=mjZt1qDBE>A+n{l#b2~=?GxtlGoMj)onK` zcPc1b4*Q%~Vcb4K#dLV*Cpf+Q0LKTASG8=#@{M9r)QO@Lq#qeP(r!{|hZWoE+=Ged z5cc^BD7*9NO)!AaGc5%`Me~^z;ZdU0*Q{01RA|bmQ#g@dm z4|imVz5S4uG)nwHev7w#-!f?P?QVDeKz?8E%R1l%O#r?L1WuV2(D(S#PlxlQN3s9tMjr zO%`ivc48=qfZu%HN8C)NrfBevkVQ*i|N7JT_Ttpty36|&7vPZk%T?J6+ln!P-hAVF zl~b?pghCppL=T0YA#f(#c7wioQi#wuRe)!*X&xqc%%<#Nj+VT4{@5v?9La{i*60=y~l*pwnqR+pd`s9Jou@bwAWsTqrvt z*i5En@*?z;EVAG<*UAh`m|Mf>NAI5=;>d25322q5>n{0N18U#bvQozmV-AYW3j$E< zxgInQu?Cu+NgXuS+t;-#%HEo~hljX{Q;(Zc42XSE3AFdyi6j}Qj~pX!D5u(yv^?;# zvzZED;@%`}eS1NER)$hb$h0&48FN;~vd@j_B#6@yynSxvz5s6AQnZ?Ch}7b#Mo*bJ z;_UFHVy8OU7F;m&)v5n}9SQ-SceL+085Jj!JKytauxk`)qkxO+NQ5)^5M(iY_0s4fcjmJ8@%UZQGw zJ|?^Rnp9OA8i3pM>m4!}Y_VomLR{qG{W^PN&gph$WaaZS`s~_@VSL*$;?SjHuKmMD zgiV4CJRr1yV4o{?N;i9diSIc=klJcqU24@4W#j(Mq{%`EvcdiLU?3PH6pBM%bHHD#pM1?Xv)JP=F&r&)zK(ysB-) zN@Z zeDXVsdglBh&xeaQJ_{|J)YH_P){g{Ye7mI*(`dem#}9n(8%*%Y%GEKu7vU>&$w^qbUbD+vY!vgp?-J9FN%G$~!D?afy44Y=*0 z5~_aor>opkX+E$--4Fb_J_6HZd_%gVD(7Jiv6NM1gIg|`729R9{P}vHNn-41Z@$ts zubIZ?>sJaS7jn%qeH5ClnfJl0)Zp6u49bX-xS53zUqSMbV8|kJ*q!a-(&jW$Vujt{ z9iF)}WZZe8hxLo^c;k>YgUgEVN68CFL52!J!6kYt&7!k&p|-G|(6rcixSO_RsD9`a z^8FX##_*OfB*Qezyh5*a4fT&>+rn-;(`jy)1J1;gD7{lQQ?LxP$|*EkFM?-MdVO`E zb~!wDAxY8(Vkxzev;D=!VWyov$ZgH-aj6aSp%d6nfQ!dw4@R0|>mszFZWmU!9$Dnu(BG1!!Pmcs-s@)>xYP6f#iFTDH|lNgL5Faix^J#|-5CEYIl zj=A`d_$0%r&+;jR@ITw>8m5HBl}um{n+_ZVfBl}(WgIq>@p+$w;@im9tEVc`$Zrfy zJoYcbEsL!f@+$7h$p7KIoW8YIS*_+>nBlXX%@z1wU4XRz78kLr0JnGeqHfRgP{T@e z_xS$AvFXxanLX=s$-wwb^{~oq>R~Z?`(~=flzNMJAWX=(#|XR6=T@tOfyBHHAL}LK=q3oqGzr-JNvN&7=G+?y`K7q8wui2rpluF8CBeew-3%#eZTCivie;fiG%;I`_{C9T zJeRZI{NfTp&KaIw5KZ6O#{nlR1&8DABGJBbdVikX38Bq_PwvXf8fu0+en}3c^tYkd zpGm1!Ntv}Njefk0#zTaD6tj9`IPe99IomK><)UHX9PAR_Hk8Neo$0Ilxn!PRP;2qp zrGX^(A~$?sy?@N6M#C1TOd$jfF*7^P=WbnvbJve?L3U?(?5cljLDmw!b(aQS)Ddx2 zVn;;t3H;jIe*7FtQhpN~yN^A`gsy_ck$JeSrK?ptfwMtdUmd$MR^Z!rM-rQGSHii_ zhh{`Y%g7P*1Gj=?e~tm)b&1;Nv52J2PnhPHdttWRl`E^BaWwO*=r-x0JjJ0dLIC>A@oQz zs7kG@e!s)t{acX2)Rt&}Rnar0A*0IPekt{;G!r+vKu-GtPqi^qH^OmkR4|ypEFY#r z5!*9b;~iC}E78@pMP?U<(o$uXZ8I4%3R9@UEjaW<)FrI_0K_sOYf z1I_5OYvJX#`#x<0IQhe$|CgCL;NT_PgV-QC?W=~R&J7U}Lumq>Rr>F!B) zelP2+y_fs!ea>(F{f#q*!|@L07&D&d?(4emTi8Ui{|4IvhwU5p0wb0Z2~4rQXXA{B zDi9b~-WZ^QGcuq}=YUuf^<6}m_%fcqio3|1dRy`BFJJra4`1v1=xbYa{m=+mWtxf3 zQp0kj4{fX36yu+vcP<#jUAU?LyNxReL73U-yfZeKKludRBH2_FU@DUA0w8ig!i5FfqjbkefSK) zOlvaim8+^)=!1kC9~)~`Fm^h*aMw>D?W)mU6b6Wh{CLSo=Bq#w4aC8pN_BWPx)P5M zqhAK4w)n%5Oe|b{7-*Smt%P+r4QF93U8L3B4L||gvwgc#B-QQji+e@i67EiKaX0MS za<6K^ohRHktKks1Hju22mD8vi)FpynNJmJ7xlk5J`Fsh&s@}8{v3cI`G6z^)*}!YA zwNM|qkyqbi{{poV^Qk-HnH&AmQ{SfZU0iH8e+wi3a_K zl&Q<-xRxgYq;aKJK+ZJXI*i@2C74fbq<$uyPhX=o+dE&vNb%DiH!WA|Jjcz6QSJ!e zsUeWISUER1QEE4QJ_9I~Ny&XWspSe3dV{q2MTn$&oacB!9o8@Ru{OtbLqjCpl?z%d zg7Lx_d-_nY!5jdolf_QLCMVpT$S=B?=rrZt!_nn49@3@(==~_i6%`CW3*qbF%oQX_ z=z_4aunOLpP1EiX^)v6DTA9~5eSVO(pH5S43B*Y2nO*CXfPl6_GLi*^H=}a5tEyEqu%N!@$xO}JC zFPla-+}_uvm*trvgQunazjm@=fcB5nse}-}<`{zWeA`HoilGUN3t6$4)2fI+OfF~_ z>^rtMCvce6NHvX{hKE!%&7~R+3rKQYRh5et)}D*|$rp+TIc*}W$2#Dv;bg!ZKRNrz zP;_C#D#AH8BqqhGxYPuy+>j5HoH`zo>y;EjxNlX**J{`<*9R~#x4ok^kX7yW>0Y5c z$LUN@f74b~B82_WJqWRuMDnR+*S0gFFr5Cd2(Bcmj6$w}B=(hM`P38D;9-h1aMxKf3=~V@hNu*&a*k!i&QOf`;=`N|O(>>3}Jy4eY!>jsHB_ zjrOrxN1gu;U7`NH>?2bOW3Yfpz+})3slIHFY`PQhl#Fe7pWlH5exMT~M?CrSA2B1$ za|@4%fk9vBj3bc&G-;y3qYI-ak&-EImBZwN*AvcH7V}uc3>u$VF(zaWx+Ci8UO~|GY4f&Y(&M?~{|CtXi%i%>1qE@_sG1IBWiN`?K zjKWDpj^X9V*zJzz%yJ`35&cg*>6Z^FfuRym|IY5oUrj#Pz2_($tZOOCA6dqQE;kz3 z7NJq=J};%u-ITTLz`V1Y2=dQgv7Vq$Y2;A|&SVBdohT*c%Ot5Qb;mGFXPT|egnAY7 zqXG<%o&A3H%0~R*TW5VrJ&Q^BaN5Iej`pXz(Ur9cl=h#a-CP4(1?_a;8s!6rh9kNU zIRy$OrG>)gWNtRvwd~YVKV@_XoeY$2(-uxyq0=*H6@C9qa#F=Wl|FK;EB+a+S-@P8 znN~mO97BznlEpxXNix<%G z&qraF`By~D6TD&D)yOk#?Dz4BMr;mSi=))TBl}g+xO^6=9({YpM)2wlekCbx?E-e% zI~UoE6dzDwxo#W8-x+qo*waDTXjeox)6+I|AzB_Ti$2Cmd5DFSF60VFfO(I6 z*z1RWO~M#v?3D|BSb=v7^+>bd4hNFKdoe)W#Pqyfx>m?Ih&<|hCEf}SSRb_1T6rKe zP^rNrdU^Xnq(n;YK!bocd1oByV%lNm?7F{nNWcZY{kG!VY*Qu1P^m0HjE+}Cx4Zm{ zJxn`D*BW<2*YFeGQS8ICg4C6tIYLHECIk=nJ}&=FqrsKimGV$N4g&FR%!Jgnm9v8l zd@taUWc`wiv?GU3L1)Lex_V>*KFFa(8Ge~xy$8=ipr@W?(J_;&sB9XUwMx2tiY_JJ zVI0)X7gr|UtwkS5vbk8TBsuisS%@^zrgCSb^ElJ?;tZj)baWTrR=Hu3TKjdgzejw} zdBs6qv`iWT)cPE}L^3%Vd6&Yzr(0*7y|u=?&Cgk`eA!6Ziks###s(upWq(XVnaloO zfVofx?4L44hgC3XUZ)Hx$FnHM9BMAP%5r@25{)$R%ez?8_B(GO*2vdKuaC(Yxdp9V0!+1q&*Bq2NgUWo~w1O0X9)DTOfSaeIk0`z+@Xg<$VvQ7(;%kVLu3%goo20GnZt&x$= zHrcpEr6znhV;N#lZqVOdHXRt4vOlxXzarIZ!Q_5LJId`5Sl#SdqL~hss#V znA3OSRAD;Ig%4)Q(+GB3KeW!w6hAk8yM1xo1LwM)TAo%YjOMxv;bGNCso_9Z@}-?) zI0zfD2^Mez+nS{YA47w};TUfWF0E&L2$8%@nF)CF3Z2T*bn)ROF<#HYaHO7&tP9$#)dlqpv?zca&r_T5^?W zg$=Kc9}xKV6wl&hbBMCi)9qFD54PC<(t2|%FIl4@bzKrm9lLMAsnv?7-wZJM?=wn? z!72|WTGoA~(GU2OGDt0rK0PJ?5=qqj3Izr9NTB@-l@9gspYIFj}8kNNySX{HkK@u zTK;JPOiwlF^xqUIwC5*!R@N>f3@2n&GCW*uN)iWMb{#O3%<6&UA`}a^u_K8MqaE8* zIJ|kyYVm`SV#d|Lk8t>fKX!+!e`@KE_gxH0N!un~dp4oe!FVxUY{V9MkY(J|h@5Z% z4h1JuwICVYOQ>{bzVbTZ6vI}y>BAUtoV>%ZCdP}r<+#iySbwXj#I7e?{%)jPR>3`q zA;&qJDfG&kGrtsU8$I6I8#bJ*{XCIkS$}c08t?dFCai-y5!=F2nt3k-r*{UzY&?vx z|1hl4DV3_?vBC$JI@;av?E*Ai%-x#VjB)A>z$eFP{8@Tdy$p3aI#2A@N*14ERY~P5 zievS@i@L(LSR`U^bAibW9gbLwoC%1Z=5UkzDI7qpUe+X-?x(za@`kZ}$zNG9%e!s2 z_C`}Vr@B{Gv)OKdhH`R6qs``(I%al1rn`@Du-> zN$M46GHBp3*8YYJ){jL8Kvyi6xutHT_FJIuqB9pPeyvJ70o0Z&(nlTsKoA0&u?ipi zt5zJL^{9qeeSjJ!yj?U8S|YumBhkf$58K*_Ssr6TMJmBEu_u(pCE*K0+AYFK=sFf` z8n>%jN2vq ztmd|Ze6goN#LI3o^{aVlz2LRufyp$N;d!pI)dbMOogh<*6-b<^vl}6p zn^U6`Lbxh$Q0V&5o23NK0m#BY)I58?VQhH+<8U}39j#eg>;$xF|9-1HF7>+a{%$#= zM}*J92kXkVv~E?D>xUn;MZ5iS0IgL_pE_Gb$N(#^`Xi6$%KB)g%(p|)BPXcz8mCUJq`JVC%jzq;*sd_A0m z`)$-=fH|x#^~llOX^NYj&%J%4kqDosm+V2}$c`wi^_($V7K1;cKMc72)$HtpwatqLDV7q=HLKJ5ZwfoFK+_8QU0IhsYfkm-?$n~z*`yD47D z8rA06lYirC+Sj=c`l>x?CDP?Wk?G6$Gp*%lnP946l7V$^mk@0KHSoY+^!R->CjLUa z*N~P)@J^nxzU5imY~dAk1^^&$1WrVOk|@{&L41p+9FgB1 zO*nt3TlULzwFYuMU{N_u%T_f~W&2^0FOt{7u(?&a7N|^ynNGb-6b^N*^MlohiP5GU zuY`#4qK)K<$wc_hJG3alg#q+yPdM|!Is;oTqhEVA2hMZDADWIC#4I~EhNbw<)C+T) zU-AI0Ku0Zu<9Re*$?f|tSMYYtfxF>GSSFt1Ncd$@)F?zl9sh+m-}sv&`}yfO)w;`L z9e0tEJ?F;KTdU1KzDc(qAk4^z6;66vsU4a`C2!1RgHM9lh6hZF4=pu>1{NC$L|oKu z*F}y!Uk06b|$$f!s;e3GXZmjQjXaJpBtg7Y@wa}x$W@$pxf`GG(j3Vz;EnskpgK90-@`S}@R9M3&AnQpHF^7?GODlC+hkqpEJcaCdGXr9-7Y-H-h^~i<;37jOl^U*Bn8o`>{ zIgz+t1T?gNIBgf%47|~bRx}4sPt2Rng60^Y z&lB4y*%~)L0JFw5E8de|Z5Mj#X0(!S-S{|74xki?;9(XmYXF_c49;1@67k@8m2!l zj;`yu?%gxA_o_zlAx~#~Ag^__^2&Hbnv)Ry4k#VYEhUi^w{S6DgaY{9hdReurm+mD z|Cgrg(UVZRo$+%9iWS$xZyQasMbI{~_Y|APR3b=|Ld;&-j$4~(Y6pd$`blF&6u==TmX?_qtr^X>VJRl~H6qJXp7%})aXYNM*p z&rLz-6XV3-3&*DZai7}L{-tFjGNJ{jTh4N%(Iz4qF6>)BfPP;nIG5tbPZaec<4Z&rm zA-+JyY_iLPt4e;^UREr2aIm%Av<=i($-0ft2zOiQ+sl31=?AXK;=&9b&= z8&e{jqs=qEn7ly^^RC(aERE)?iL5f|;sk4f^nCjhhvS5u)8VNfeHoi^5Sp%I>qsMO z8ki9lv-~YD^mI3KoDeX7t!RA{CBhY% zHrS?`#ahyxbx0q2_pNuFiUW(v;*yEAFruqR+z35`6 zAyXraF^N5*Pc1c6Pued5P4)#|lJQit*WFsX$8KhMg^j6>&CaUZd>kDqr@%Q2_J}f8 z0Cg1OaGSApE`U6x{+V6_Wv`H%x6kb3{tCPWUn4)F!z=(gyxJ*=aaOo|0JJj_aAO%S8-yY=2!i4Ntp?f}4QSd&C@RBOJL_rZ50L)i5? z?DwuQhpMr`+$6NM5D3j|hsE>4r=qc&3df;)tUfihF;g6((Rw%px!&C!@Wl%u)o(Sr zCA}<3*yc^j^c`Ene%DPQ0ipZjf?6#ORp2{hB5YkX`fKYVi>L@&p|$1%;KKeHIJ zwh^Rt(U`tGg0T#?yNarR;0ncmVD{=q?#mCcY`yX7&kaZZsW>Wy27`qjLCGXrYTc#A z!6QGzZf(#^l=|)l2WGwuyQR02(FgR@_4Uh%6p$AA1Ksq@8q8QomA-wg+Y9atB#G?{ z5<9$^Wr{IMiowJd4gO2sr4E?zW+_5Eh=hZfR9kqT&KR)N7~0uTIs z1Ja=$0r97b+;n8)hx|7`lNW2#bbvn3j1;2no412HWf?dxr!apJ90qdK=pP;j)^NN| zlJT}bN(x3XpG4#x+E;$s9EfuCMgR!gnFVqw{Ok|NoVS5~B$nM-FaGfxUGM^anaP3& zQr%rcAXgwcF>!LjN+kmSpT7 zo;4rNZCv_^6_ELM%I0JgY7e ze@hi?SpT4vumOf61fMy!dY6@#$jzTDW+gt4kY6rm&JHPW!%OqaV0QbpzH#4VF?|Bu zPaZwKE|y7b*GM7`>9jeyMi*Nsai}v-7D@SJevqZmZ7YIs9||5F9rdT@A}5Iz)ib(| z?RS2L1NDMkibjMY_oMOG^Tcasgfpbv2G=dDbMeO3TlItPTm$7dSL*Yui(0a|bXz#O z&WksDn_qn8WY!~ItkwF;Y{a(2`&zy!ddiF$ud6MM!gQK|ifbWDU6`JEiUQucY^>Nl zsc<*^&awdOXNni?i5Z~MZUyb~U&{?1#rwgxT*Wml@TvEHR3=urPcN8yvKFO4a?8m&%rGGCkR%JIS zS^C8URQo-2Y-0AM?nj0g2J*uM?K-ziY?xtLRFPcUng;Io1JNd%=`0M}=^wB3pzh!E z)U$}>&f?u?!7iETccs5DG zkf924;rvK7h>nMgX6VZ|H{)Ct)EzjDPG`p-mO{qPiGjWy<0kzxQ&h0%8DEb?OyJ?u z482M%?ejMca3ltP5$#&3=Y#jm8WkS`O-S_`o!V{oBb34Jbt{A(2SvKbCYw1Ne2Gd37KRB}WpWH;g|Z0HqSUILqCbzwbccQP*595j4&jk$ z3)cyOw(SySq@=E%KJz1kkxU^(%0wYQe~#O7oL57!AH*UpO=9!)0@1~cGKCIJ&oH`D zdc;^l6~_qgrs{pijKG7|(($VdVQd7TNeL6IlPq9O>Wqa3m$#$Xn+UvbXJic?sbiQj zZwd59(Yrvdyb2PudemivDO8jZXnbzY<*2ipT}&9HsGUpdemLr!#-(_6IcSD;Db)t_ z!64p~Q8nUZKi$l2a3c>4oWL}nrso8be~p(&d@afc_ymLS`sy$sIo1+Dk0-c`-3h%q*XZU#>Hof@5T{*~$j|F+UyPD=K91qZb z@Vb0IJ_E)m_}wh{o**+{7jQo@OXgROXVNZ(&0|m8q)Ed$spfC=W1*kcOD1@7bkJy+ zz&a_D?mTUjeVlz-KT~=!k0(Uv$9KKwr#N+ycT=xL%9=o-v_dzi{t(Y^pPqVYRrfK| zk!-a69u^TERxz@L0BBH1o1J=!fVm9nz8Val;9pMAe>MH1>Ca{yTLC=*)4vK8HmrYy zEgXRL;m2Us!}XWD_ZWRyVc3Uvw(|LCwAxI>B{V!pMg23A*`&hpCZ+?7x?*} zSOT30|DCLpX|9GGTVzHAdZ3D+NlF|XAAAwk} zMWM;95n-h1V01C^W+?gr#la!F&R5C%HYMaRLFQ21@X1a;vVUJd9WZ#7SUQ! zuR{doY>Xo>T0K+NwD3&+4l<>e8gvXO8fH(usvu0m=F;wqlL9S4Bt$;c zYk8|YV4p=CJwuCZKb<|w&)CKe#!iciL`w^>&P&h_D*2{>FKnTFwo|(14xU5MkMcaqVCZtF<#|9tva0wxUj9W#1(xtrRoEy4} zw=`HKWAD)XTaPy7h1kb|9>(QX@?LK8e34!56D%7m=xFcBi=}Zcy!0_+#+aez#Dok< zp>Lr42WZ;v3NPA~OA3REtJ0`2+Dt278fiJ6Wh#IThatn9=O)#F0#IB{U+jy_t!BhQ zK-f@2F#4CF%X`63=_Y}jSGltwp>{q@VUF;;sbTDK8IPT@g-x}Ir3*>^A4*XIF=yvUFG<&_*7a;CjRy{v=F5! z)xgNb(q;~&4`Io8)pvx7ech5I%IHhg>*b4eOohel#1C(v0k;X^+zx4?E9HZWHz&cLn6F z+HS^GueA!WpHdL~(q1#zpUJK>Mzr>y_r*T%m!}I#H>o{)Ro7rcA3)PEk@#Kx#6fcew zz$R{if$9Q$uPD#&B4lqaji}h5NGVWLcN=3SUH?==&U) zF{$zh6aC?4|JB3Hpa^B^bIc0t%Lox2=X@|g2$-wUuh)Cy__>(F=I zv`SwXl2k=za;}P%!87<%1#xgUR+=f6>NF17EZh3C%seT)(`2sh2B(hpMyOj+3{BVo4~Y~!kWk(2 z5^Fu*-1i>I8?hX)e~x7qKiu?y%svu3bnh?=i|TFda^nZbv&C2EG`=|^9myZi&0gTO zNG3u9<(!mS*;F&lR9EkaU)AKwU#Pgxz39~^ z_?gc^1X1q0l$sL-3YgQ#e=PNIcaesb@uwH1SD~c~ho7?LJY9wci#;>B3sdFt-0h#2}KP;(1h=Xkp#rr~Af8Hy@`nmbrvED*{rwbjx|R#ncvc+0Sba_N7Roeuvi= zJ)R4O>{Jzyx)^~(SIn4Q>Q;dQ23_n&Z;w4pzO-rhfdURd#gFO? zB{WL_H}ad1&e9)x&)2%<9+{|S>xLX!r#cDZF=(_p94gUk3wzDQjK2x&n0sTF2oZ5` zyQ^_2zS3=w^_u&k|75w~Q!JeUw|b$%>%<%}%PJ^k%{;JF*dgo04FdKE-)0rzm)-Mn zMOQ^?i;HuGIjo&8S;lhS5zr8+TU}*qk$;LKg-${~viF`xtTqsTi!GGcb*t=Ev6h7* zLoB)%Qu{Pq%jV}@IDea5{R4IEi=Syzvf&phCwAbW zp(4pAQ!Lzgk(IWkfrBC@!VV?za;0jt?`PcKW_+BTmWAPYMK`KuxD(@f$cHb? zRZNi>y73dmn$m9x;avQ0-%s1TZ}iDkARqV|Y@gK0@O4p=xZ3SdDahqpS+UE)a@}T@ z@>lSPOxxrUxV@>?bBz6jB<$j;ebj{=C_B7e_ z&)NCGhp-!H@(es_oD*%!7 zG!ZOPn#{X#$Io(=&r&bXY30tb%H8SAPvP;L8Smc1`=rKV-HqitY)0!H22i5Qa>ko0;T7{q$w z6R-H^Y_R{D5C;6;iuHwR`WYs2gkUGK&J%b9{Ps8Aw2V(NWoZ`f*Ff?wue>5xuU!Zl zMKP%nfAHy)NvQd8blo1t-xk#w>T;N1Xs>~CBL4|E0}p~u+)k(7pE= zR9zS!53;IbHJi2eU{%6n(lp=E@R|@E{U}oQ5>v$F(z;XfZSn^~UnN3c&M2XX{fpZ- z(S%R(aohyPRk28XKm6sHfk+n;@aUY4cMNbX$j6x!+Spa?=X7TJjyDE!Gd1i#0#&w3 zgO3KK9!4+z;>tXdW&|ezYAL&U8vefGIqjRJ>>9`1O^>-zH!>>sM=JY`FV8n4m;|*iy8(_T%KqMo?NYs?hxVYzgk%TJUD?z zBqHM%H&uiujMtzB*&`@2$P8M`;k%0|NWy7|ApZO*ZX)Tyv28`M!st$^=BUBSj24&$ z;jkIr_3N=T_6-s;kYjIpzw=ngk~dQvy$`yj31>V90c7l?7QT^j@opUEaOVRG_~UeU zu9EPst7Ufae+rT}oSxVtoj#7XP-hnwz3`t*qdy-6`+>?v=!;M6?_qS|jQZ86wB2tS zzW%@k57Prf&b~V|uK2DpP3pymZ7m&P>(ex7wM<$CN>1jF{?rN>vPd>|)reMNN=pBXke_(jc>7}9(2>bQ|3yd`xm(mdV) z^UU1R8DlL8DO`sZ?qG%{fZ=r#ukMt~-Nj9v7Pg~!oS8t?tNcy6V@`?Z7hXH?jcQJN z)08)C#*B@o5_&C)-;3odeOb+9X8qmy_j&qA{yB){@xccT3mCo!O9%*Cgi64_T=GB0 z^QmKVI?zF~xO#ooz>w~!C=79T_sM6mmDv3I^uGz8Al@UXxl23)c)Mr+cC5dv-fz!Y z$&X^*4V;hnFZ#a{ynnVY{ila*nn&{VJ3s)*%29s%0>8cOzg=qmW5Ve34Y>D@MZ*80 zX#eAfMp!+f;bZ`k{C_{^|8D31gzf)tx&y_28S|el-fzC*zignMD4AFhVec^%Fe0|W zQV4DAT&C&7(@o-0&uTu6HmBNcwUP=!BG*Ltk^ZJd`V}D-J{BqhG4|Wy=1Z#Uti`!LmKUD<*Rd zQI7N%HVm8f{AJe;*t22Y5xCj*AdK#PbX0?(&Hy_Aa>IoAn>JB3L~#GMBU^BLCQ7491>q8D@&V#&Bx>|SL=(|)K8@ALV$ zsP5lR8aVGTb|1IaeC!Jh@mH@%bG6Pbz$RZS8jI_*0Fv3Dj4QE|u0- zC#128M`<7iwt+p6#MXV`XH<=isyLmBnw=?{&2K#7|Lzffa~1}SFk-A7n?{ftbHBaW z^1(5#a+x|e`nj~UYNy$*1>nw~zG^@P-+)V_EcINim z4mnX&0U2w zoTwW5`WA0c6r4jK*UCu$1>~y7o|6oWFL; zB2xz|2mfC}yrzcIXPp`6d8%XwRagA!-A$@N=P>i?qCv^+kR494B}nndV< zjiL;BI~s_^I?zy2-1{*f%?*>|1fdz@(f2Okl!(UzGJRX<FvvEBc6Ju+KKAO+8uN}S?4u7;;>s^f|DEyaF z&u_l|FQfegImH6V%X1#S$(Nn=>}5T(2q%urQuO+GoMihMgjd% z?mPw8%8I+3KHJ~0B0kYypTN(ardt9Eo|yXC7rNXuyWW~26m^iI7Dbs6_^g-Q&Lwv* zok!9RZ~wJzHql26#vgy@3j-AapmHJEzQ_u%?v=7;@XP|!@-m%@5hQCjC49L`g?&~# z5XllxJmW4C_Dl1X?Lw4Lvp(=Yqg!YeF0RIoqlfwJQ$!Pp>GLIi~phkJq zc_wEIwCqoJzObI53<~Rx)a;3}5n}F9t*%?k3Mw9A2%7jG@9v+sxwHmU-PrFolYEP% zjc8+a7{m;qUudaK+pMDm$b;ObHX^dJC@VNJsuY^naeFkg8l}yO{z#gCLz&C^)uYsqS0AfBvxFeH_rsP5bzZ(13W>FmWraNi%UsGW%+>& z2MVs_vec|hz4X;zY2Pcn@kD*tSvFlooO5w7<&LV0sJ2Aec z$P{p&scf4=zFNEAY>vB}>mHDx{D(dK@Al@mzkgu^s(0J8pB~Q&2k>cW33MS-CD9}| z=br{^IdK*2Kc;wcBZNcd8!ozky>01D(Z>6j;lCnB<^@cP6+I`JrfqPtj$fHT{S+dF zFEOz*u@>Q02}B2Yde(M!6<5xehq{!LO7ybA^mxqVM|ESQ z!nfeCS|ktQD2W$wYji!qi*UahM^$Rlv)}k4-^TVt$itA@*ga*BuS~2noS4?0b|@~D z$hk)sS0DBHtMAJZ41I=ET1@MG%28{uJ;SyWJRFCJKP^WyU@N>HJR!-o^5+K^Ha~CQE}?3Lr~tm8p~gCn1LTZhUMv{7Vz&39A4w(mPe zi7UkTY&onns1Yw-M#wWLL{)SIUuLD$naOuzMhkrKdR~p~0=vk!W&cW{N@3hhBf%D^ zeX$INnMeH(w)0OrD(Liw@Eb=ws`F#dG*~zK^=zY1@N-6T!#-s;dULyX?w0N7KMQ+H zcFdAR?94bpo-+#z6)3YdCdwj3Pn){Pf0(jzV;hR&?|rJ@Z%6)%U&Y(Sf3RhC(1|9&FY&ID<# zJqWX>-m#C`^gxTNT2J&9%pu*|OU3{)u@*FyE`12e7YYkzM%=n0(JE>X~8jADlhq)h=crf;d%E=?#>BOJ0 zRlvN~vRB+3(590o`ap2c*8ompx9ix9bcaVVF5oM1*LybIWFJC2l1KI>MOG#=Xjn=L zhQRyF0ezQL6%xHEALa%1K449529`Ic=s0a{>xiGzWFx0%Ghs*pfgO-W$IbJA6Bs+! zgX3@EL#`LD+hA`D9v0@Ccf|@5^FtGbrDC`&wSN z0hwOU>jo6C_{MLs1z9n%YeEiFx?RNS-Qf>zo0eOQ2BsDZR z9h`fW_^y0>ru&S_=NU2481TO|$p$jkli7~p0) z7A7^^2B!ICyI0Et@z1X?z^P7`^G-5aPRMMGd6AIMjvXp6YczfvHy;Dz8y2IPGIfy#F+n6qzZ1$X2=&arrZ!WJLrS}$eR1T0< z?Vmlj7lo(rb8ihs&ku zi-HSM&X=FK>8?<5Cq|Atvc9{y;V~)AO!1e?&A{Oeq`iLlOlrw%H(ElHC!6(NwXU{Z zGb*CSdr?v401iML&f$3TAxjZ-(?)*L4roqCDyZNF2f?0x@x>%c2F>Qclmfr_u$*k_ z`VTmsqiPo>`y8|UbpRR=>Up0zUo$ebCigEPUANXBp^rOIfBQqoZ-8;&bq3{YUxpZQ z873llU5|s!Dl0rsn6C5|XjE-Kw&Qnoh^N6KX4#g{jh0xwdZj|wLRIjku%K815u+xd zuUOc6zrE+3;j&v|nO(TW*kL@^xO`1n@E0fpeoUZZNT1MveqmCvg-XjOu!S0Pb+2+n zZ%0U-Wrv&Ie!4(+tu*X{iqq_RVLH7eQ=ND-;andR`sIiY95Qkfj@v;K(wFZPbiweNAZ^Y0yMuzl{h29n{cef5_RWlJIoX${VPIQw zzyb`iX~e_TeEf@ziGB&KkHVf);faYnK=;wrV1H`Y-MszaC8B}mD_Yx{wkyn*nJb2l_S)_A zE~nLl&zKT}uX29^Td35Rt#tz$pP+zokHMmiBed#e^ELJ%?kxAJ_9T~ltcQCHl%A4< zC?U@@MUVwVNp^WLr^Lyk;64FG67fYc^(ki5nG}&5=cKRMbXY{`WCOEj7;0cOjYc>B z7uXJ7s!*h}g*e4z7p;F0IXZN}*|z5b;TUygF#WVqp$oV96$-YaY|3Os==jG^F~C~* zZUzR7k4k1yod~=%ifjuOX}@|S=j%q_38-7`kICp2c1c)~YS4oG)l^25Cb*xm>5u*> zKE4`s7q`&RT+t`rBaNT)HH)g_ljs}|iCZSw71xTTgMbY)_dZF-hZU=dt9{z8d+&LW zD9}4uEpfZQmKc90RF6r>I5clxu4Y1dI_tII=oO366m+$Y*ynAy>%6KR5zylKqUcMi zHeYqv?MC=ecd2$W6T{}6#ilxg*Y(u%v0jIEsFzIiQcLBLFxf}xtzogoibUJGe zdU6y|_kLJ5q|)$75v@9UK~n=5lBZtBBrZ0WmKQi01?B_}%=8Su<-prt|4{*?5b6-1 z%db|e)<^Vqw1E2s(gJG&JuMJDv}sc43r~X4`v&|XBVt~k5!RHXU?P`ZXW`I&)lpZ_ z=O{{`tZaVhe%}6mSXTK`x}UKitYSgB4P12aWJvnA3a(8B5V)eJ0~uU=KYfx;a(Xg@ z*i=!ZZzkkjp;^_Mn3#C76O@XnAgPhpxyB+aG?xABc&*=GB|qcGJ|W5J?MAmPR~5?# z1nRYJ(fQp^Ih|R2Vc)@>U~n*%LP%7oI%aQ3VFgu=Zli<5U?e#*vYaBL?dJM=_qX=) zsOU7x7E2u30V0~ddUPU#E--Xdk&%gLw_GuqHMaH|UEwAGjX2R?CApM0ZxWsMn~!9N z;)L1dIjun4WfmdODL>Tft9>gvxk2KV-+ke%jNUWI`#Qb(SWr-xQw9DksVZtM$04)bt8npHL+@ei`~ z`2<$kACbUZSmx;s>R{_(WQ2~738G#-meL=7l?Sne2C$Z z?3xI5zU8K8Fo{P4ASXyA^IfKS4dh%%gNqtCWIk#uN@ia;daB3kgP%ol6@hHY`vO74 za80DIr3wF>#P8R#14Q6N_f0@P5v2-D>BB5hA)no^m3*e~E7^7=R&KZ|-(h!H32dkk zd*LK1F@SJo=LL1im#+k`(fM8KcNrXmEsw=NRQ)3U8o5}*$)uRcmR79R8yuXjsPIHe zLAf`*q%Uq=_UkD3zW42`;*9syRD=w3TYDC+db3KZpsbv#p}v?9wT`}HV93eMq~+*( z^4C$lD_-&1YXtH7Q_Df@`#>j5W#=v?bIT(WkdRgvx;Dw zl7wh}!=6pYvYJ^BX!Wjib_E2ietLDlM;VeMd2G&6l5g851vAw^@Z{5CtuO|3c3m0c zg)Or9@l7s&Y=P``**jeErCjEF^M+V+NO|}vpT0(97bmLw!*)mo=*BI2B4cxV)N%uPHxVk25oUgLGv)}k`)?AEosMxGt+bV|jU5fG;Y&VP8i7dvw%h5FF%6e-@ z?oLw(e*g-J>lTw3&9)y}N$AzPHINsF?og`l_PyrK8F^`ufqH=R%4 z8rPy1@$d>qwH0OEc1F#e#tZ_EMRD|UEqESLA~n#ob6`y>)D-pUS#9u@&uH!9gJ!WS zC{gnTqLYLtQ(bz@$RkW(}z0kLLhW*PL7Kx5yZkjmjW;GlE&=h=Bd^EKB<g~Er%32GbIm>~D_vv6@uWqDG?^D=U~tncFL&RDgWG)fUA z%;N{&_%ihUCwfJpz&6cA@{5RMJv`V$J zq$FhcGs5b32gcv)-A_=)V{c1}cMTrWECZ3RU;Jt+QLQQ0m8*&D#8kq3Dw;i)k_mGG zRMtCdl|E~Hk(RlLmsB&is7Vtl9a81Ee)%hGp$1e)%xCv8%!nk8AhrML6tp_lbWBOJ z%2F~VXnNNNPQ7;J^J3Mg22lyN7Rqp!w<7d6MB}Aq<<}pE+Py7@E4kz-)ijui2)K!I?LLLpGP9XY#?!cI@9cV% zs43Da!;8Bt)Rbr!ETG2qVBa+xyySa5p@&1Iwd%QgXFifq>Y*uAP*y3i%Ew={xS=^a z)suD_N}~m`aE}_#Q^V~5v@yDG^;ou!LcYRW2u=lRZ;?gsIk1>?CyVeWr1F`wQfovf)(AP2W z!F-*nlhu(wODo5-Au;i1gI_)Oy|)>_yL@xz*Cb=klcq%nu7%!je^s85Xw_K6ZH`}~ zIPAFw)@{gGwl$b_WR~V1n76YYSeF88r_%pFzTPq_3b!S7I9cy{xov-^BOpo%R#+^6O*>-zQc zAVN#K1qxu_iAaF=*)pxAR3IG1y(!DZ_eum2+hFz+7)LhG%pVkdJpJSgdcqhGTiG`R z$xbGT2MaH;;?`?UIh&PT&xu(wfmU^Ljs8mu>KQ@iZ=ryVR}RMfl{R5VkbyX+$Ju%2 zU&ffXOdN(4Z*AV>ig_njtpxbOM)x&qow$6DGh7dLT7OWFjihcxhscqKZV1B>0%|1FI99eyf6B!PtH5S z`NY1R-IucLJ#(z;I*C>{NokV~Fn2cO5QGUQBd-jOF5$K2T#irIzYTd7hqCPo3T7{$ zT9BXaPH~1HT3+}(*QQhe;@b>VhF4i9-gjM+^ACb3X|{4MkENeCW=SR%8nzMh7|{rR>)OmNLcm4y5{B1KGo)DA4KN{ zH@pbhMVz-)>0IfAwF+$fT&_|T@Bz6jy|3lJ8t)~EL9>qU65Nv!{|Y|32`e{M@S1x8 z?dxiGeJb2tCDOEZxVG#hyq9g43?q^;(mwQYA5R z0wZTWqrBA%^FfSe)}mK4enQU{;C{&UgX{e~nR%~;e_UtHuLLxBx7!zvaw9`ckdb0H zlOoGldzq~fs>qNJx)sh1Nj4*ZOMo21v@Ona`NlB!g;9tFbFh0qE9M=UvUag8&-t6r znEEYieQ-foZoodgZ5l^qXt75m&simp{zNmxg6DVN6_l6CM?ayI)+loU8NB|k(9OSLfUkp_AGHC0?NPtC%b9Q)ai&b-a2Gn`n|}eoR5g` z2Dy%MpHGw3qCH-j^M5#*=D`zfLw&vb=LAAX;f6|VbDDct2yN9M2GHk?Bj5soUKgAJ zCdvWsXJcUJA1O?YzJtOi2V38?87f2fMAoWCyI2VHFw;Ir$0#baN@w*Gy(yH;a+$0d z()g}%14(ZJ;DYI(uKv%J3!-49wSm`#Q=UDd3@6eA3H>d+GyZYz@6VSL?y~-C>{L+o zp9hx2|9)U~yA)Oho}tI;!j{w%cNEh7@QWQgu2Ks4tb=n}lrkJ49K!LmOuO&{CRg?X zC+RE(#M6PUerG@z-U&pm{rZ4DTF5Ddb~-qtoxSyGsyK3Zzi;brv&Ze>uBDp_rUJtG z4-v&ocRB^cxGpgI;i%|jYhkj;4bqdSDbUpJpx2^S9VRr|v)RTEtY|krUNp8NprPag zdu?PVjh>52->iZY1EWXV=2u|pgroBaR6qWjBwpBvcvX#x%Nnth6m&cA!r?{BRcx zl(d>Mc^FWJ9f z8Ritr^cO`LpUL;U45Es-W14}l@zVf`7?oe}1`V*oc&jAnfA^SA+s+c;c6Il0pAieq zmtje%%d>HSD;hHldOpD3lki5S=W7$9IbfXwbxX8h`v2p|L5pg*p2bCF6_}pgb4W1Rzw5-cQf5H*}az;?6)i8ImykEY23s zXNP)>-!Wz?2yc$BRo920er97xiChHvH)6V^)pLAvQ@X&_nvC>eca~BBF5lC9Ekwh9 z*h8z|r$8eQC?Xc%l4PKGR0m>>9VzFh{^|G(#w)=JQu7<-j{6M&e^%y7r|$>L4Zqv~ z5@zTSZRKF=3`qw(r34~+u>LRvZQO=OeyTy5bz_GgN~(!ZEH!49z-c#)rs1@-^NM6d z#sJ0Wp!EWS?9JRJ%?6>>=LWnTBo5KWE)BlB^rseK&+broqXk(x^Cy$&!E(o)l}{Vj zHD=H&{87t0;S-Zb0_?A~Zt5bv1@tFk zz0n@C(p`*KF>^T_JMye7zn5G*Mv>26;~^B)=1_>1=pA~+Xmx&CIQuB*=VSrMVy&0i z7EIh=#LrvqvVhwvC0q-GgUr8wqf2LNZRGa4M>~UMyOOe=0hnV#s>KO;vj<2V7{UK1 zLAACjNG&I~nv??K{GY{n1^7>9Zd}tqOnvrb5a#W!|nNO{z-HT|%+J zBgRyxw!NZ)N?LrMKEL}d>0)*|D;Fh9#x0=AVbxv3>v(~Y=EqD5im{RjQsP8PXsrbDN?@w~q$*m2 zTCm*gpp%(zSh6_op{P}fv|CBY;I1dn>CDczhfe?-}K6oVoH#&hBF{1AP0w zmI!a<=GSrfM0x}Fy)@LJfktHy-}2U08!a=&S<*GGX}{@`#GzC@=;JT7fYC}kp_)$I zBsOMy|V{S^mO?Tsjq?BNXP5;P0PrJnn4?<}n>^p?ewiRMYv)x#Ar3W>1;7@U5B2A_bma53HoVn&!Q39YzFBM;Ej8!VfINoAK`iH3TWFDB zze0Shg&Th=`3Un?ixCnl_-cRJL_2^M7war-hW26x8;m(0BCE#%4rJxLgsZKx?R(H;jL-09HzBML-41)2B2eO(Gc8uo(KS_3YZ%vxOA$|lX3-7}THq@q zZbR%1a+Y8{*Zwo^o};p9&$bKW-mQ$fd1(j31OvF<=n*9y?Ocrl;2G)otN-LKuYKc^D?8Jq2q~u?eO-~stotkYJ%Tq?28f!9@M~Dfb2icMR8nlS*Kmx9 zqT|~rNrZ)-#D%>U<%AtwZet|W1_)_-+0E=@%3#FksZn|Ag!<92<6mja=%ia=1H^ix zU$RjdI2n$2&cV+URxhhXx$Glz10eF>Zq0aQ(u_5s@ zqA1JZJy>ogV2<&Y3l9zvyH4L)KJrHS^Ir%^C_nwb*XG{;er+zbxo_uZnsRF&2&ENu z338|6G>;jy2%X8{dSv)`dDU<(13!9Ei@d(2>=WV>GBBw8yVP#$7+aIa^wIk;rycWtyd_P< zY*w>)bJ?4m?sq>kxl(Qt?6-5WozetqI&_v@%w-mtgFxm)Z+~^}p5zgP^R-BdN)?D# zns)oBTB+Uk)N*4pyg;gGDs=%O9UNkNW0u*^`b`IZJt1eTO#$T?9`(Ho6}@0K$&eE^1Oy7Xb zC5%}*A3~g)>y)BA>z&yX0dZmwzjM;XHs1tiPm^WxOWUdTID%JA!g5}`qyJLW`p0L_ zMbQ{IjD0p4S&mDaXkwW$v=}P%oxY*A%{Pvt+Jl^jr0s`h-hvhgdf`oEPW`fKbzE!xnX7U#@37QuS8$dm7Ilm?^&2yK zx2cZcmbSaEu0TiwTB?j(x;86DzI4!b?FX5N1<%Q`B)@@sWW`|6Akdu$0;6!!=%)}j ziyX9*IzuWGZHHk+AJC71OM9C*2)@GMadqq(>Fs>>Q^$qH8a1u;_YLqoL+c&KBD$JjG zBo_0_+m4}i8I3HK@m*(TJarTLLx*&O%dbh^Us+L_&MTGN(r)I8-A_sXX#F{Nn=`5p z4gRA33hPp;4e35)U9eg0E^6V5dB9^8bRFtoBs%fx8tZ$g@y8;%`=``hM^`M&S090q z=d&>!v?q8uQ?zechM-VEysg^Ug1`5I|HB=@6G$f3qZX_fM&gvbnq1} zgE>i5hY?nZLgA8AI$>jf#Iw;^M4Rra1?MeldN^jh^N>Hw=Q-PNER5XUt4JsXIFOif z84lEx=k#DQn(t|-!4tc+SX?>zGV+J*7w1!2Iv_49mQjB0{#*3ror7`CJA|KQKfpF_kXrj`1CTBoaD`DJ#dH@qAn9w6IEaRcU$?t1UbV`1e62=sTY0~>ZrW`|?z)vg zY3O8?ExWxE#qm|><4}S?A79H9QWLMp?FY`AV(Pn6zx-C+P+eQ$#OiFXF zup4AuA?RBA&9dzR4P}?!wBRO*Rf#lsjDoSHupOORjODb$Iu|Uu5GRz-wj;IKKD%`C z%Aw;@+E5HmYj$*Q&?~sV>nvfuo6vpkwE1CX+@H7-CJ{~A`O z8rLbfIvVV9D!>M-pQN|iF{lVDch`$Ec6_gyn^_$m5>?~M4OIEwptpC{|wlZ4> zj{ksf5^C(Z7nuHEij$}3glj1e$zY@2Q5>i~&(Mysq!=#w=}FC*+|Ak8tfo!2&dAfz zw^YJi5&T)V75d##j~6U&4cvNFyFNJ0jtg5%GU*&@jyfk<%YlRC?7IddK2$)9n+yoN zo4qr4{EgD$Om+d{RTm5?;;DvU(z$J)?r=#~U_gsG*J}d74Q)g0$B|5DX{$V8y_VeI zqelkT7LogBGoPrDFM{7~l+M!v*to>M0o5msIn7H}Ta^cyP4e$B{OKZs5@zwqkHDaG-ZGy;>JNlhE%fKzWk3H4M0rhRvkZ?oiUvP3a9y2ox2p6&i3og3E%z zwv=?zpsjvtp>_!FxLJe|ejjln%5;4MzeL+gGQH}o%%b1EhamrRka^)$En-AnADsLRjX6~>r4E7IX%Z6BpQPC)I z_0LwczYnvlO7u|ZK32ZFF)nxC3fU^1dCw60`}a(i;`bD(D>u*D6^)9mFUsj<>;{oT zl5B|s!P=fwo*zDHryn7==M~j6%X}M{Y+(i@4hW_qXRbCt9JpSWu6u6UCLe^le`QkEaMY{T2AxRsDcEuOYY?k$ZA<#W@cOKJi4mq*siHLW?@O7#$n zVRF%nDPlQ$UhvgVLt5?Y!N>4CoH;{hY2QldlLBtD2zW64;P-tstBQjxh?q1vd9J%O z$MuD|k08%aCU1Xy7g*0$EA-JAx?C0$c7~UBB;ZNPrRJx0^a?!?^LK7|ebMaCnR&^I zSsy&FpqtL2jTy!dn_b+8TUBzA%GO4`g9m=pu4=g>Yzuki85~WsVa%Vyny6~1>iClB zSqzR7b2C6L2yEq+pD9}XUO0;6dQT5ypv6G_E|%)zYYk8R+A}U?Mzg=3KM4X11Feyw z`Wuu*JGuij4yIPN&YPW~Dq{xpWiD98@LNyGxS8?^EKgVe=0KwY5G_SNw3$&+VeH`|r-N3kD)Z>#lNTno%) zFV?!xV1)T~t5WwkFHOPieh4Rb35*Md;`^`avK%}spMIRUzOh%&fr!3%R+n?1)cU8g z%?W*3#=KTnzTK<~<`ORcL0+Fj)Iy$-g>j`mN@*`xD)`ZCdBDvTZFx~TpqO-m7KP@u z;F9TQHyr%#dED#0eA{e*sE%qdYGT*A8R!YJAGSE(C(D%Yi2Tyl=SCz&rzYu4zJU{s zHKR`cOO;~Q_h)S6-lN!`CMp5zQPVVBEY>#$i1rr_xx1XU!5Ri(j!gMS3MRE$K>0t8 z4?$SzK@Sg>i*1(GY;Jitu^GGgD#y1QV;@zes+=c4$Fc(7Sw0(QJpkGU5~dY(GqN8Q z?K}e&EbQNfbltQhE#HC<3`(4m$!w~0nS9!9p@C)kNtgNfVr>>W>syIPjTsumpkWvW z4~J!peb#--&w3ZuhI>^#A^NG96K%PQ5!3TLZ)k%O#K-*}w7W^t*D`jR65_(J(~@{a zlDTpoaiq#L1?>fdaV@=yb#6Ina?SoPn)mnDe+a;c*1wqiiQQbe^CuZ|f{L-N4m*X< zC98kVo}O!|In_?gCRA2Drji!>9kZ@6SPY{%+22S$`cTrJ*_4axn{$4Qo>73Nn~*_w87O|v{s)K2|e!7{`|bN4*tSa`ZXAR* zt^Y@~73cZ5?6?BaSv}ETwc;`qH&~8ZW<<;=PMiXVDEhLplO$h^)lo~v-jI~fv04L# z&9iCt=#ptWrZhmD;v1r-aQ!_|mcy5`o;al9s%^s&d%(;bZoe5#$z^Zm6z!SrUm;76`9!)r{>vS;M zG44R)`M}g7^f&S+>%gqg7JH*`JR0miI>owTy~?%__0ojsDw`xwqMm9k#;GI znKgXxriJ|_c+p-)1#tBErx&{ZK(4#7xj?a${}g?XJ~HnPwH z;&Mn{=IVUiYB)lI;gM#rfOYP^7Y>2ww=%nKIL$GzgrLFiD_G6RUq~yY-*@Cdb6kvG ze>`7I+(MSSWf|lg=K47d*$(94S78fwG*{2+_3>nHII$|;&Ludi^pYc{x^|#yr#X{# z*QYWAo##Z;OLtNoZ5XxT?;K<_1}{RO+^3D9ipDxPm;R-1?_`BDDr{2S<&5;Pn$^^q zoFanbinOw5ZnMSXN1vu{NTd9mmG6$4Ya*5Z8y+M?@~Tn6WN#MQzvv)WyQ`Hme@oYN zDhXL1^!P&=+&Vv0G}^4{Y`i2MTMPdfGhoV;Zma$6TLs^Tf`NRCiYfE>mWm%xx#Ey} z3x&E*>^nM>0Rj(|FgI%Ms$x5Y!QXHZr}rItM1ap=mqW z-QsD>kby3y@jxaJixQdhlcjl{E4xHT!gS$2*_!zh3|w%?nv=EICjbs;*n`|-MM|@E zc>ZDwQOzVgS~0#7zrL@De(7LX#{5N^PFVrES?$=*1*xPZ{+2`fXMA^Pp1D4?NLyWG zv|(n|QKYUG*=eodzk7wBmg9uGKA$ zdMuzI_^-v2`@~*>9;EX4@)9+41MuN|(F>A29LxViLN+w;vdd?QuEfJ*%xJnQk zE_m)%*UJb2@^Zl$7Bg9i|8!iQD~QAaO`4-@}O{K~(k{6qq}z&Akw9 zbj|&8yj-+#=o&jO(m;MXF*25JA!b8OM`j^)Ap>Xv2Ti;`? zzjl-F*z4OhQ*WPbGe%kYvgN#+;fd;k2705$E_lCluKra!^6cM!ZmH#dJlj=}{r0bD zD8aJoFVCuzdZaa8_xv+5Ygop3iuOhD3kh8C)L7EPMEbTdaFgR*_w=I+J;!Tdyz>k9 zZDNw3B>Vi(w+CN4;`hQsS@dEV%r>4Gp>`<3GAD#GOx_^p=-w1QS0qZ$43Ec+C(xB=1Do6+Ya-y0Ql$av&>{?MU=Iv078NyXIES5R*Ia33K zP@%?m%%-Bemx8{c(Nb+E5c#;|C23Z7$fiXfXQiT}d#0s*Id&n2SEIFVPVt&{1J3ZP z!V*rV1avHt^XG~Fd#qhPF-S;ka;`UN|Mbm0UD2J8cz3O=R_1JTx3=tlR8UH=4eF6M zH1-K8PFtJ^6x$=*pVKx6K(6b32Io<(+eSR3INl`bl>tK+bUHpUs?5i$)$z(q`rt z>^T#AYm@T_{fR#6<3kpq5eLzI}5Esk(Nf zf*Mfn$bJPy#`Pdqy`QSAo5AZV3a{kGgBhrA+53M{CEYg;(m#L+7)^bqMIJHd$DO4M zGk&wqij;i=ni+k&l3zOHLdaLJK;XQ-E^(oe7CLD%2k+$DED`j~>-FN5L(U6B8yH3| zr}n~yU;6;nvY3C_LgHjbg`Rs?)%3BDGp{n?$-r3P`i$1D8x>4Ly6 zbV(&(l}&uLGwP)Ssy@5FU~e5CQoJCq{PZQ){Wdp6vods%O6g11^{6#Fue!kYU5;zr z*9_J>`&9k@e7!)mqM}NYPY3-@$TJED-HzJVeOkB{u-7}xD_v2k=H}+J_wU0*(R$e< zxJG}F@}Xuo9oN*k8Xgo^e&H%Ax{9(mP`3#?|CjF;* z%jN5Sq@?=r!S|H|;|S;HU@Vn!XI~N0=Km8t^R-AiAA}f|P%P|Zd<8EP<&rn+lJfYI zAWyT=1hUh{XDzBpTV-j54)imPR*MB0HcgJ`+|13E8ADb~;;Zz^xH$lS+kAZ`!`JiC!Q9okq3S(cel5`iAe3<)It ze?Mt(n(t?s&n<&}Rdk$J8IC$UQ~M8QkMtt48fi*0bp2Z#lWRVGcf0TeCAT21lT{vl ze@L87d@M0pZ9hNYa30=3kK0;jrA>*r@$tQl)U_PC@@Tv6mLC1tcCi&6nO&?C&2874 z3L}?`;;xf=F=0K?Ludl!17F- zNJj$*j`zysmn_R-5lmWer?tiPA6ME7X}4bV{qC_1s^$E(L=sV-&J&UnYU#i z8K1Z=>BrH{#+=|^kX^BE4H9poxx0J2^Nl>CmYA5(HEOesd?{s zfGuqs>VW&f?eo!o;X@jvQasi#)g)k4CBj7xh{V2j)p2V#qV?~4_cBvsb&14d-(zx* zLn^%l5QkxkoOc}Pi167gSJRkeyb%N9ddDcl6tx2mGOfC_cb}$qFXR6Bl}Te>AAK7+ zdF*?I{Y8@aK<{w5h_pq7b*1EWNmFet)R=bOiWfOyjuT*uw>9T$A=rW2PXcBd1#1GG68BDe!q7zcVgO_1P zQOu)TH-(SqTaqoKStwmbDFh}CPZRm0-gM|L%D-5<;FE+*ZC0ymnD>Xi2-Dych15 z+J@V?!4I;Swwd=dLOW6SC4m!#LAS#_1-+%U67<=+T$f9P-j%u#I9+XLJ*mTF78PB9 z0N`ObpQZD41BmKm*2E#leLL60)h7@);3i*s^jCVGUg&tBg>#VJk_X2v6N+_i=|;Oi zl#K`}761j-Q44wO;8LN7aBhqnV4uC>D*Wr6uRYlI-a!aUdrsziZHb0H@}zbZM>S03 z$9D$P&RgMS`AZ~3$T2$`$o0~Qlu?LM(;WVaB5<~A@aNbUwA)RO{XGx-PWft4!egX| zj@@FR^Duelppqs!)27a+``>X+elvJtee%aMiq7A~4g_tPt@jFC$}TD1=Q2|Kig70* zrcg7(Uv@!Y34be0ao3;?pWHRQ4l$NU8wT1h``w!L#{F_YvQ0CNSLs)-U>$mu9wi)| z-!8Uz-Uz3EQu_1Do6KXu8VBObr#$ajQ#pfon-2h>b0%vP4&LHLofYX;>28e^ z-L%0-f()yGi@aFr_{VWY0$>dU!~4gN13{;1L<>JG6!B`9DVN*@x!2LKykFl@1+jSB ze`}Pkjb~_msH-B@CX=rv@e%yeTy`^0uN)bWz5Avkzi*|#vj?#D>cQ{0&(zjdWe%il z8oxf2-jnhzyX5=1oDjsuCZysz`z-W-Ywl!1bHAl7x2D1`<3vh&-y;tQ!Ee(}i4PY3 z5l@{ayDi`Z4vSqTwq4=*eTHWU7SWR*_hC5sYcX$cyGpkKX3{avDa>g>$W5FNf8@W* z6k>lnQ6a(=uDyETj-JoEQ(Y4AjyB4#CFao~^Gn{FI&s*av3~#eoG5d>{5jj-;u;10 zgWTN*gJLwDW=!Cy@%lxZzzb$#-7aacgw{EnZ;$N4y~Zk9hG3ec2(w`X;-B zE|UT`LkT9;r43XSByIj{$1uNvc+*rPr_x~|MsA9nhER^~DBB$wup4|BDMZEeG_4`% zo)-#VS@;m&pS7Sj68AN^^*}Iw`NNDw6fYdwqz$JV1THK!+9ZD#4baF7+;S3au(r-D z4kvpjq1PV?S4}YVOyM~8nG+V@y6QD${Vh!QAP)F`;T)i0Oyh6(sS9x;{$=z)9%Yn_ zby^)btF-oXI5yygAZq`~ei8!QLYuD5!el3Xk@=hNeY zud^BtXC}Uv)CHeRw${3LodaF}?X|@v20olu$I~3}UmSrD<49l+p52sef9yK~Y1UcG zfPa@xY_>Snztv;0JA^h<#C4Q;Z>0nvptiXgqvb4dHer?yKC9^JK&t&V$>lwGUk$kF z)}>nAp$&(3?_%*>h$Z&BN+q~0;AiB%i!^s#b~bddjuclwOMBL1$B5TgNcVP_BNA$K zeLxQ4aW{AwMOV$T@$#izoNorQlYWplol5au-9?XiPqS(EKJJupJRQ1k#i~j$0?hQ? z?~sz8Rsx#vyibrEvvvITIvK=ng{LS0S#CvIQsworn|*@Ue%{2WNxeIeMruV62*N)i z5J>v*(5aN;d;_aFn(%n?{;u)Sk>mG$sFqJ$jn0?~Db~(p&!V?X7PQT=dX3^ET_6}v zc<`m;jnP-rul)@PN*r;3IQxWG|0?YG<^$=yng@=jLorgmH+C*YGX&nMSxg)+)?rtQ zwYg<^Q1Sk*!n|__IJXBpK1q+&%!uKSwG6Oh@`woFRGVZs9#m!Q&FghM=U)Fx#_gLN zaH80QO8s38h0;X%R1!afbbl+6Br;W82{}{uCL_MAg7P4*`c@QOgZOeB-ygzxph16* z`+my-<^6Mh@^SupAuO&J*2Mo_zY-B;jqB42)GP)?f+2=E(l4P-m8<`~4jLmo3_$gzU70LQ#Lwp`s z7Q1FGj)=<=bn>+H2&~}o_4rduO30Pe1a$D^pLb&R!QF>A^pGM4nB%yIJr(!4 zbih^0;ZplJ_abj~t^t?HHgorqxF@;}2YHr!jw+KLhg?>~sH}DG+I$*eKHnLCa*_xD zb-Z1o!2V0?MFha#=pMiL1zBM?snzP8)*Ny)g7U)aw9NiUuSjPZ*bjg>B$(O{(BOOE zt5xcB4h2RTGmS0Z`qRlAw%BSxk^{wCva~{I%**w$Ge*hv-iI}fQm_N{GdguB?Dyk0 zb<|lu%E-utr5`u;W>vb7VXaT^>-UJ!I)=pQw1ziM*&vU>wCInpRq6Y>&@FE^^6lIL z&w>5!p(3CRAa7a+-)EJHsS+^9=dy@xh zY?jQC|7t||?^>had#}rhtj@pJ@vgF%%egwAt3BLQ^UcVzo42UP($r1idQ_XMVN^p0 zY_uGX))uZc`=*EqQbyneg&|ScDQoRYEyJ_=F=6T&Co0=Nw=&ohRPP=8UwD7Ldt<0` z!Z&^tQ1e>}C@(Hl^P`koNxG-POw?yaaEiA&e6jfnU_QV@Y^uvKPaMd0MS}b`uH!xp zv39=r>%VlmSQfU^UAifto%TkQ79TU8?2_ljTjgo*P9`8e{g+xkWPndd=%=okZ-id& zU%9Dx~pP9zwi74gHflXW$<+fvX)BsR5Ngxn6Q^PEIt>kZ*Ql z6Jzl$_MY?qbzHOA|9j!lk>xDCP2U0nMfGM`n=Mc_iT(QxcilwIoGi#vHp2i<>tBO? z?pOqMrh>2gs$E0jC&3MoZh2EThI%+Z9SX$W(vi|q_o=4b-p}zrL6a1ej08Vx z9llZ-j>y6z8yu+ng}0+d=J|AdmJ}~o)&Leg2qNdxn&-*g{zK4e(hx-4w&krp%wyWg zf^-%*)Md#+HXXqHt~;QE(Yh<+jyK>11<+64XjNuTkW~v93A1YjaY~5 zL2Y>&QV(fPSDuIJb|P(MITmj;UJcQUj_aeWSP^y;<8Vf&*GA=otjyU2&*oS$;Rw~r zUFGpf&W>{p9S)bt+v#1NWjRiaSIZt0#l7#eEGE&F!>VDK!-->+M|V>*T{j^OHNckY zbfmZ=IiW?u*bn}SPRiqXP^#GJM;=lTi_M%pUm>V!*0Q8$oI{7! zt|_ESzcl$PcXWI!mUqmlUr2;|zV8TKXO#k90cJ~J%w%)~cwpzqFWaZB)pRerfq?GY z(Lt2&YQ27Q%;Bp`eosWEv!vDaW)n;}-OH{VmqEx>UJCE>WT|_6(@D1$cNcgpj#0^{ zkzL{V!41dWh1j{RDJq7ra&GB24maB;f|^3EQ3GnK;aLwP{+sANID^ipcRw?;i_^#bT6l7~p;Ri{O<-+>JqJe`9pfhEwK(5i5JE)SXp*P>j3q7#k3sO)_ zpZ%&h)^RH+1ExxiIXO>x_#r6T#QII2)rW_{GaqLS%=dD;fhhJdSR>`|c=3<@CXwPc zOab#hnh)4xv~cD}$z7x?T-UFQYjxGMj{Hf7#o9R`7LAL@rW*NhzsBZ{uHGe`;NOs( zcbw7Om{sLp!d`zR0dCWWIkBJn8NtbPfswc;iYHQzEW>)&wVt~uRTf;)?kp=+3M`rOjwQwtlez zcNDVjI@j2_nwU#Wd3ZE9g6{3lG7H8>hmRW+vBdyfjOp$m!_^5MaE0PcLMT+oWjQ}P z)$&eDuiU&I?>F5eZYG@sXQh9Gih3eg0m2oP{RnQYk<_O=>Cxey0j{E*+tj@w0n zQtNp|rRMa$NqpyT*mz>m{X+kaiopWmBsuZ=0$(;5HS^ZDP4vUJ!F~cCD+RS`do>D0 zFzEyiXU6sM%3&Mz<1XN$S+XSY{JF9bBJUFaF59edza6d!LN z$N3EaJ+X3j;^I0{z$qkf6sF< zbH-V#5ZE{x7I_5<03at-qkjta$!ZZ?1pxn{hSYEa-i-jHJ3$Jabl`}W=f1-`pl5$| zq`yV05MG+vF92@ce$nnph9fKk-R^7d?kk7nSd@mOynFY$_shQ=JIWQFT5(8NSI(DM zHH@~_cPY} z&Sn`M4&+Eg?k!C6QtsCC+_3qE;?R7}q_xx_<0lVZ+L~t2WPELWmJN1i=x>JF57l=p zAMC$!2d36xO@X!WhC39youXa;Aop8FdTmW3C8%9j{K`AF_V(-s;lH%WQD=~wF~bgb zIQD0;f`{ZeI=)cm_j4xi29Yi{fq~v6Z2W7_V$v_(&e3sZ$0-rHel+sP&LnaEG^BUm zhwOZ*6ZJ&`e;yG`Rg8Maiu?qsU3>21@sVYm_~^(n>)|%Rr21QRnj?hMq+eLn_4I2E zJZsOM0qTp3I$k!RSnT8-UXvfe18XpHeB0(NReazmBXiCe5}`(Jqp2qMuh~8qn6Jd$ z9-sppk=9-FBRInJe=k3CXa@|f(b8Z~j?lIt~Tlu94#@w!@SJ6&JU8=__;bm*NJXVrk<&8des_p$>oXk-$^Fu znm8TvYRavi<3+UH_lAUTcv1>x!cP3TzDQzTA0sKq@09AKq$GlNv#ADRn~?8PK38gs zoxkttR6+wDJ!|oZ+(QIKCkpwmtG!Ix!=wI4yL7$YE_F>*qid*xU=uLz($G zQl@m&c-Ip-Em?@(#XjpLRnK<7SV-L66(>A1_}FRCZ+s-SN3Cc-FHr2V=SeU8{AGwI zT13<;J2`sx-_THz*8On9Hb5$B07o<&^Su%lVKm`U6W6Ct1l+qsJT=OohQ}3paTuFD z`04>ht8qQP3>Ra;Hb;ov_VhB#*A_a?PaActtQNYOW!h5f>v4rArSty9#T9EcI$8?; zqF^tI-1`F>c6hYYSWH)7Dqo%e+aumk{-HT;w-ivtlQ5N~$$JUFUNw~0w(zWc&St*A z5G3@H)0e09Shj&yK`(rHqoe^e30pS%trzS9;`3Sl2MV$~IavC0t;XQZp}5?3x~=mZ z{C0~rknz7JA@_(DbQvWG49D5ikpyQD(XHi?mhZ0dO*JpC0pz>R&#Gh^BL%BSEaups zy`X;7xu>;DAo~)A9}$ZDn5Js6YKyZcuwR8eC^<|~OhL=@HF(Zbx%&0N?-x#Kuq;Q3 zQo}i}jM=!--w>L}j89&Q6FA+5Tr+~gd8rzFKh$^p<1^6xYI0PizlT+OLaGmrJz!BK z^`@&S);3l8#c2lk#Wn3N&XDd*U+bNR%h)PIvFSr9_oKkUyD5iPF!j*bBmDU$AD*1o zQg<{e2O-SlEaR=JE`g7W_JrR>&P6aD@gT%4FoQu&7VU%Xt-S0t)q1_}m#);S#F8H*ZiAZj9e3Fr} zcU{?HoglNrL=o{FO&uePUc2ZQ;yp)gJ%iBS`I@Zj@U!BOlTHD!mLh7d5h~dZ7BkR$ zh{fX8{xLD6(!CY&@oOW%o_$u@WwG;y=_w1e!C^DrR0~ogW-~WpRa7p>MBuw`| zE==`+IORX$CiF?2m(88xX7$wL0yuSpIXDsp9IFJ3>wL=MTESq|fEzpi$AF3Nni5T!@^yRb68`j7 z)V=BTZ``KPP!zmk*&C4xb8NIRq+8OMjHBJ^hh|uVhG!aFN^hn2^}0=l0rTD_T4qA* ztk$29@!05bP`Zef^BoJxEi!91=_Vemkyl*<^uLuI)4?i6XE$2=uB3_GbID&}a=+XUE-DJg8hb2z(1G3?K#iW9`;P9=|3?Yv8_Z7U(%xvIiz!&7bANBC#( zwsxM%qW<(PChutBeo&AnCyWeZTXvYY9|ulOGE%1F^Te6l#O>U8U(1itC_J~zmOCjl z=$gvXE?@OD#ae}W|MOD;LH(jWgF`wp$0!c$MS>*jq$8BB_q4AF-o57+`6M_sXB!n-g^k?$?=4tU>QGQj zGq=f-ZEwI-s*I|>{TdSTE_x0sfVboF4dWR4nG2gXY5Y2eCMW(+Dxn%tPFNZ34jYHZ zCB&5pSNr}|tsqI5WoWFv4obNOv!T8#OtF)>{mmrxFMnhONhN{dnpdnezw5Ywh7{vg z&DlX6uvBXrw-zS79$7LtS6a+CZoRPGUFLBVkxql)e*9Zeflxs=r;G1(Hl0MkuJIk7 z5vy)#NXt8Oq2vN6+l8dUu?8JFoZ0;3*V_xSJ9!gF_^KU`a_(DZPCm`uhqS{DCyWB2 znkFP&O&)8NczpB(Jen>98H`1bo4qTvfD7nGjv`aR5MgDM4D{GbeHQe!B0;pnh*o<~ z0mlgpC7+^uC9B#T{$_#NJf{!72&Oc`am!41g_qn0KYhNj$r>Cm}6qvMezMsB@ z&d%tb_KeqZ#z*|V7;OS&e{}=|I@6jJ@?T&|>rx~G)p2b5W4lU4p4u-tl!Z9(N~E&(qSI9n(wnxCd+=xzrYEfLgM%0h5;i`PYC^ z274|bgTFw_u|M}55b)R+LZ`zrU|3}jtfJQ|vmVA8xtnE0Kc>4yByy=r9z2cuLrTj_U@z1M_}M)ud;Vp-z5H9Lj8SAK`~lO-?x* zzQXENTJ-tB2`-mL1KWm7oZP>e>AZ?Wx@n=eh)n$ ze;RrKfa%aqA(*$zOD_GJlL()6309v?k3oEKZe1)&ItJS}CdhHhBDGv_P+SEZfCBjb zH$eZ(#*TBvJ8}g|=!?S{N&y*HNt93m8m`*#oZ5X78r;u3w6vNR7W7>}^-2Fl7~TGb z(=RreMnr5Q8;1bselp>gzfD!c0cgvR8#TCg<6>Tkg*ECtY3OeJ zUIYU9CDhqw4~jsME4%|9q7?fwxRl&?jM7$6bSAykRi&yLDUesiQHE`M)+eWCn_GfR zSQ$|xjz= zknq41?e!4=Cb&~Rcc6y6>{6s*i6G=6mo}D*GOBKizHb7YNh{x} z*aP0DHrKZ(Dsh%m3i(F@w>!?`f2e7HQU%dRSyTcgmDSa3@^@UC<~gd-6SI|y3}Ewu zPTC3nCtJq&+wBPP+xLEBrgqpHh1lfqRbm$nCiI_+Lj-flpP|-?rkam6dZ*-US25@D z@l;WGIppoldMk(9eX}w0gmxYJyTQyA$xvbtotY##I##ODTw{fzMst+2+eX4s z#!rs}>+o6E<_&>L(XSWMLQLU2f6Qwl_Ja;j_OXR7tI(`10_F=g)|kd?fAG;$szCI# z5#CU&Kosq%JXA)tG%4we>DH>kSKHJmjmKp=S6a()wojRm_!{L8q27lBcIWsS08ZcE zX%oyPiHvrUK_VK8zYlcyIPGgW)5;`$a?;}Uz^-^{bgxAvMc`!QOqsyrW_ zmtRa2;4mSMeRKLrJwum{_xGy>UQ>|S>dVLNK}sH{Al{JTEaTE*>A(XTUAGOd&rg&E z{iaN#LiFpbO}w$I+v!e99IcLKj)aQlXrm{T`qw|A6yWOQP#`tZEm&3%CLC_MMJb)6 z9|P^|l2gV3x@D@xvxvoVuQ59Oz-~>NigkA9ue@|DdH=YS7#Apn1pB5EJvNY{a#eLEuijx%Mq%^9cz>(DAcSqc#SlJxb^1} zMP+>`t!aYD^MT7*wMb1KRrl1qEGromp7Q3hr-o2qeIC$!22|H;U2gQNAt2AFK}xK% zQl<)Z0}vIh^x)L~;O8fI5g%2(;XHCst9ry5G;IveEVwqS+Ert`O`_3u(v`CmM_?fx zty=izSP^3UN0?D?1g&q>WUwgLH^O6Fmh0TYxy_d&*U$zC|H=|T!0#^g3yBN6>yN|F zxsp8QwLhHRNHP}~>cp!J82sbnfge{;)Z@L?jmzc@iI{U*ek7V>nAoWK$L=RH8}+5! zJ1fmO7SbUmPXpzY|JaFZdjj7sdh#uC8*DmPqw>vh57bJf0*K-x7qIl{_kiR!-4v4K zi}i$J3k5o%FD}K0CsG>!#VQgRoY1P4T;!+I?(|m01((Zq_vTXO2Fi9t+}k}LjW!2r zXm~at?>OBtf!3QiRx72`oVw3c{}6&BswW1fPpe#59IdrsFe^y&>bJ-OY7J8Vq6N)T zE!Si~o(?IQF0>evBKw9l&L0x;PGb4Q`M(u*j5HLB>R!}25AP$PbTK*|SrcXafb$Kz z`RJfmm7zskU)h{`>1Pl7v2rG|f2KpwAmEjZ60M!%9ds-riq9iv#2^s2QVl-k)9qmV zz8&(8iv_dW4O?(eI@dgLCjs++Da%N~ZS>v&0Y<&SSxRw-lc7E_=TZ_gr=r-0U}@Vg zEj-mm2jywL>DZ}fb6a1H{V4wN0YFGw;pp7BHV3MW6xjGS-<8R+ac7kU_t zgl8L9J8f}~6^Mq^hW^i}%LWN+|of&Df z@65&}iF*y*Am=csCTMD;{~wP)Dy={HU8l-H`b%MrR~?3=g%V#CRgj<+kh2by_&rLW z7;?ZHLzOOOZzPS!9Xc zHqPF^Sd--&wmQ}ynk-V#AO7RsNF0n(U6Q7fxoY%7=dS40Yl`x4;2?l~P(VW-D$w)0 z%VN~=gWf^3Wp?7*g=~M_97FuC|2_&@eBbPbp7rR$WZ9?ie~coFG0FG6=X`)N)e(B1`JT)#+? zICp&zp4-?rdiRIM0f3DlPG6hN{DFhdGkJ>xFDGJR{0oB8v&r8Wn-D~&w@PuSD9Z-} zMb}9&IoyPQADIq#YXFRDsa~lDF5%N3p30S%HH(RJ{WiRJzzS?)w6l-P(%;QNHE1D) z12a8VsJ(jiiu@g;<_{!G+*R}X(0`g0iHsU}di6TJIGYRqQk+pP4b90=hJB?kDvxFR z;zk{3Et?5H7!-3ry`4fDU zYzI3u{#MxuBZP1wag=BfVv{sq@9dYdSle2CtxW~k*+2ht_Cd2BaFdS5?X#QgPm+S% z>m)e)7~s4b5sQ%qb|?si8gwq*72C}0f4!)W|MNLAv{8Dwl9*W97EEUqi*-}Za1>i9 z^`126yWjHZhGkht)EmvT#7HRdFI?bXr($alf5&Z?iZ4*6t5)38yBxJK z5EKFM|)H=ANV_^JWL~t6xef+r5hs9Etv}*?9 zP#xY;Y^7I^A6#Ub<1k6OIOlFDB&UdHiXX}!{M?T4hgtSjBz|kyFV;8I7Y~6@8n@(L(s5>bhaZL+{}=-3LBgm-c%HIj|MfUkna_XKVIx1%J{4giJ& zu)hD`kQxBxVj$E2WVF6?v0mE#NFdP6$#4t4PJJ{i{jsM7QK0!%1PunrXmfbY}kd^}ICqV0v5`cF)!u(1RB!of$ zV+8eO=0D&2uNMkpz#HQTul)R=5_x>e_7+=|xLtNg&v&Nc>+9>scs>*)MG&9|(-N(u zyl0EP{kyW4V*m<~LR|y^jk+ub(3wLl3gBkXJ1zg91dw5BGT@EU$alj!JVxUW_upC% zBk2?Pb#{~^;yYg4NQZ7Ra$%~;p0IsU0KnE@xsdorlSAHT*#$|Q5AugC9PWn_Hc%l3FF+t6L5w$V z-c($UEP_yCNwdbfLSR5b&vVI$C8Fhs1<}Slb`W83d2MwOCH7(4{Tsr$S z`8MCSB^KJ+Pi0aXlMqAue?mcldM^kE_x$Mx!F^Pe4)6se$$dEUXckcmob`Gj;2O{7k_?oii%-&~ zZ&C0izL!NH@x4R%P1@h-#FrO@*6LxI+QBzOf!RK^gdE`Jc64;)Z}Jf? zg*prTHOn-0VIel9H{az@9948dti}>5B14cfNev!u&hP&XMR$?aq-={}TZB6# zbmDZc7Xly#ViWNIuDvVfk5 zi#2lkFI(kEg?IuVC=Dw4QKpBEBeLY^d_1Y@(U<5^w}_(7P7wEF8z9r%~sPCuzeJMV|*TeSW13qq9V28$tml_uY0S^F)=aJS*0A; z8z$tWyl$sq~El$Xb4tDa>H z4Brd*knOIvYjP0zEhV7m@Tzw{r-5&^?0Nm&EMrnn7xjN6S{V?Mxg8ucw;=su(e8dq zztT4-c+R`E`qHE25+m=skI7>QlvXlkTlRLyQg{iErwRb#UKC=cGiV6;fn z)r8{tcP3Kqhg)wI>wECNBhYgGQEbh@NQ=F|!>Twl65D}^I)$l+YB@5A9%J{%nHP}~ z12eK6zY+}e4RtR@Q=y_v!s+?&qDQqJU~`?QhNRVERC5+N-|P91wADblaW$~Q(q}uh z5%vyohCO3)(e~P?1$J|Z>ykonVef%&KtA9LzSMmnY?y(WTx?EGMzBt2#pZ*pDVv(s zh0XS}`e^x9H`S?0wiDZ{O|+sGzL@jhx<&!egQ@{tkwO3)C;Xd@0o%`7$S9ELUoxqs zkPrvoR!@D!9^~g?`)o3kL3ns&jkETV_`6n}pvZ`vZB|mPXLxlWT|a_Uq|Y+;JdJ3T zhcb0kpms4OZD59wexF^X^V@H5_hSzKLwTzJvR4`sUTKKW&}6@$DFWX6 zR5RgNa^?J7vrEhnIuvX|W_5~iQfat_wB7+D8e>NjA+=^JM!`Xw8J!&E_e>t^H39QH zs%7$alBP$-1!ZL@}f+SF@f`sOHt& z5aPy+GEqF`!y9rW9?*JOb`l&I991LgU)!w)tu>eS+4bL7|Jxi+AU#L5Bmx1VnfCsLM=i17WnHvB;PM;d-!3+A(|XzOS7dm2)W_=dU(hhL}I2Q&vYMc@l&=v zP{cX3py!Hhc6{-y_bq;*)l(h{*A26;)A^N>$gGn8Td?Cl!GRl1i+BN1iFF;u2gbEL zBPWP=r-F>-G_LFOY9mo8@M-FOq@WCdhj4%Im78LLRo^X0S*?h-)cQ$7O7i=bh8ZuL0d*1H*0#-p&`_rdSf?e!E zpRtAzm7-~~BEHd%KE~`xm9fI!ncTkY5*1y$u)E~mG{Bz-g#-T(nsVugQzDjcHu|#j z1y*+fzHXikg|W<}3o_)h*SS|Wkyx3Q&Y!26Wode3QbXe3@aSe!hl8pHi#1 z8~LOkUj_fi1VBUp4uZ*_mmd_h z!4v`EC@Qtwh|tSi!HeMBiQbsaB4VyLX)7I$^N6{9iMA)s`M)#-lrb=~S;_DiTXjF4 zX8oE)i`m-fOjLZy75!|Gu4usiRb;~>wd`i<3ISori6^(NTycr;ixu2;c{ck~({#ok zodn%s*@Z+SJ8#uIw4vwBQ8hS!YXXaRL3{sWexE!CUv5B+mKwIJ{ro=P=Ca>a_Bn6` z3&a20Dw^vRbmY$sF^4v0jE&8VPnbLQT=Y5sW`FedIK*!o8N6&xqzbzHbH*XhCZc9{P-nWrM1N%mcl5 z3z?2bhW*X&A%LSm)7{i2#BE5sInWNE@+QaxTyU~pG$Bvo=a9RFj0$K6b&8a zz|Fk!v2h)fGR4v(;`DIK3^GSk`MEwdt{v~rldBo1_D zDQQhOetQKs!!P!YrCDa!nD*q{wXdK$<4n;wRwiAf_>pmN2w}bprm>AaK63Pwwzq{pR|| zwdu*?0%bWk&Q)-8jq-ML%4XP`vp|cfDusce*v*8*!u-mII-=1=S-i7)*Jnu_=E3z4 z&J9ox)JnP9iW$0D}|`DQy7&6-@dQ<$GS0C=!hEO0#3T#G3mvNXM&E~@}cN?d$^ z$5VSWT;W;n53fIO6~bf}--FOXbnU!2=2;I`X#!EJ!kr*Eu*xWxhYVo&A|17NqV=`DrTKm>kLw(n!_!?Mp=P31+?i4&G+d|3 zjr=8b@#P&gl@K_E)K-TEs?L9mB!25nJ0CBc97dRyRIP<{=oPO3Cl8Mj5e#+TZ~$y@ z({Ri~!lm0AFhbbMy0Xx$4NR`QvnY&gh?IPOXQGHM7Mj(7WQ7sxbgcPm9Q$i=QAf^P zBXAqLj1@dsTs~*T^gZoZfpt07f=@;p)+~Fd7|LYRyRo?Ph0j=vO8Kgd%{CUi0(L=B zjLQ5y=;N_9o!g0S)VVPenH{Zg`HqtexZ*!qK;I$@hb!6tk{-TrzT3d?++`8Pmx?Sw zT$7?m*&Y^4v|=;he1R5+{%t-!TXG!9!kPY4r)-yKjUQsrSo<4$aHaLu8;D6T_*GjcKO5Nddr{R7&jIAcoQa0w3XKdp2*<#d?EI?P?AQ6`j2zp z?k4dR#_-3Gi6cScXWRZg3*f^--VhvI_MQwmBrXOc9repE7xVBkBh;_irYv$)AI6F3 zmgPWTuX5~=DXep$lS<)VvtSBRvMhWLP%T8u3J&~rN5u1$;x}fR7RTp98~w}T2!${F zyng10lEK4s>LCA^w?Vtc*~IC)Tl+=qif-HMS_8+5?Tuwap1HX_dzINi zQfyTDYdncdJnYrbw?(MC(x(sP;+J?|?P{K}AKaISZW zsLA9L(|z&3T`P?^EUKEWbu3ReoiARL1iu1zvmWxge_AX)<8?1TS=nFn6$~Mb2uFA> zpd`-zAQzl2Dy4{N@9=6x{?JB5h8UN9GJ<(Cz1%SHTVzT?aP!`K=)h|lr=U*K7t2D4 zYvyAo_6VpxZ#CQ^PJg-cHqURH^h-Cm$Z6={h4n~sCi&$=Zy%9P>A17y!@S#)&-0tD zH`!KtQZ5QhKtN@&gpLlFP7YK{M8Pq;LJmKMQrF?R7NP(Pa3=>VcG*G9PC}Q;2=UEE zRSAAW{`fKuDipHZ2N{}hI*BWXJiYe_lAI1%@LWVMWQnDjt3k@@BHQ1DmqiRLX@YCz zh8aVSc4cn0$ESit*vo>8CyE*9a}EYpcGklDVpwsf33Oxp60@DF*W`aPHF#4;WK0YY zXhD(h&CXfAv7Bj3psd;~^$IoRy=-R-F}t2^Q9oLs#3!koYCOIJJ0!n!HU6#=^!l`p z|0^ERRV2C}P3b4n7#34z!-Zzk?=)F;~%ZHB3WVXYR@y<8# zXXXKthD^RhqBipPA1S6DoghHCs_}N?!aQI>M$?UV>$LXje&j{c$d_9)e5{aS*qY8E zHK$yrv?5&zh2%pty-?lTEnA@S*`5!)&-G>1V8CU@QSPm*rA?Mc{YpsavarAixaM<@ zoYLd&(bm#2H7!57=m&59$FF)5lt>(}Tj5@~*Sr-VpZkyOd_pO302CJY1FGd>&GV*< zgMg+8qIt8GQWp3c-mSGCY*zB!J%+dGyUW`vzQZlIbgR~armR`i-`O{Mt;n z%TerI6@$yg#b1Hxo9Q(wkmlI&$vedPIM(SL$w=~y0y(t>fc3j<5jDG6@`Uo8Xd#pf z)oYyU+T-RaFY6s5jO#xDVJ@`Buz2m=KB}e0{A`tT+c(8o?(T|fYu6 zzNGJylg9=a2)ZMDZ{;L+~GUZk||M)-glY-a0EGwDWezp>}(1bV4b zKu+$Ww;reVw`uA!%;@e#k;iqfFnQ|mEBO(1l^2VM+tiIXXd%p3bnpF+F*<1$4l5&Wh{)4=$723I{gAc;m5C zoqLp}7kN)@&rU_BRY-=1fhtB*+8-4i_tK|GXIHMLpW4YDM*RC26S#ruTWn(uKWGIb zNII%s`9)pi&1y_-q?q0`>R58Db|#?ek_>DZ9Gr}kS`5kEfWh(n z71Uo5pL!+M)1}@&Y%4>HiDmdH(lnjzJ=+qzwYUS68WQ$BSZcko!0LsJ$0jB3<$+?! zVvXKb@S}zC%26V`T9zKifTZMM^5Wfe-?}#(v6R3b;LNnmwuYTi z@c&K9Y@wgxAR*9#_+6!|<=hQbRkeeH2!e-3IRhQT_db6^NRtN^??C_0LTQ&P(Vp+0 zs~FwfZ;2ZvwUUr;GU>^l-#5B^=3!XnTT0Fb=3?$5>#q#PHoh-qgVn`w>vqz4XQ^z{ ziCSmGnr;Hx1~_o6S^>dp%J8VQt{hfuo(siGa<8yxh899enX`gel%3?oo&+vx9g65? zeGP1!oQHc9G)ycR94WQF4Uj~z-8(XiolAiK{Pw6Q9CEM5Yus{8cH$69?>TQadbI0s zknszohtNdkT!dz+arV(}sZqyyUliMITF|1pYQ%3Z2gK4oI=LCvVDDJywEp&1nF?Yb zvn#J>)8P_2h38#fhP#-G`QmIm6$|rC-16ee_z)9l=76VwK%Mi>;NVdGc!7P=&f-Pr zFZw)(+v9;Db!MN`+EDZKfZgE7CM1SAmGog=j;3d!#^v8P1tylb3b^?#fJ^*2=y43a4>DR(tx;dARI^beUCZaIgXUswb;7fEkf*;lh_1yE%PL<(rdaFlLr~eW z_rIOEzEqGsDZ(l&mc#h`mnTR41i&4NqWsOa0ns?foicp*7WaeqgKd^xbF{?U^X$gT z(NR#1R2B4$h6bD!ii=nfL*AKcP2*(ngEY4zc3R91XN{dOsUT`ChK`n4^pSy7vL`nU zJnHBuMkQX+PZ}ns>^DJbBe0q|L*h5X0w&7Qa}8G;>l1tA6>rFV zpxHCM&Dt`a%aU^|#FVBE0b?aQ6ZD0@XKpiVBs`+2Zo_loJNFFhHJTFc8sV>IREyb4{XmmYoqpTh8 z9LB}gasx4GjCy3&68RrFoRnjuu9qS+TE6;Q?f!`B$v$Z9nx((}OAF~o0&vGmA&rJ$ zeG3>73jnKOp#5QaE?O}JX+h3!)$#rL^DU>6`#Q^L#qiPDnIQaR)ll!Cpye7RdD+XK zv}TIhPw^s6Pe*Fg^1=F7%Kcf|!f=|yHycf~qAyu2W7(5va^takam zIvz=6&{~*DHHvMjE_~BEQ}7XsPHwqRN>2svaxJlNN$tX7_hr7KyV;4tkYg=4r~-Ti zoVr}%EnOV_lJ#yWO*E0FONP0-Uunx)!pr5P?rJ^U0EmRsD-MQ^DbV3JGtYqE>Aem)Q7xBLd>nT;mr{3j8uq`M9-0hoJ_3&*{7q=V8tAjiv9 ze7t+Og zrK?|ZGG5-n#_mg0i}g4RvqfYg8q1TK`0ZYmkrn_9BX|0Ji-z`Eq`7e->fGzsK1W{C zpnMyf;&oc@ytsS?TkHh$WvO*Cj7v7^#-=# zBJ|wq-Ftj)$7gu#Ht$7TIg@_cxu_NCNTjEtw13_F5k*__D?>iU07VRcqQ!FK z?R7`u&X#?bmA5%=NMU#xvgmRgD8@##iSp>zyk?-|q_H?0c$3UAZ#HFNmP4d70VT(H z-C*uuO}$z)H7;mm<)&z9Bq?J;b>n_5|KVQLb$?3uN`K|h5^U<#$lCqF@TDeXHOr4q z?Zf6K)`#`aL?jGkBi{pEIKNfuO&gnv(tOdOHn@iLInw9dfO#IcGEc%nUwvOSa~UJs zpgOhr?deQocEn|iip$(cuG^4tz?o3bsx#l&?fZ~jy_%`UmmDV>gk?! zrY9X16(U*h8b@JB68eo7&Pa)z129~f~e&zLNhsdOx-84binue(yffZf)rwZ z1Hx3SHP>Y~MGHT`s#6}Ta=&$7T~3RJ2-gbLmCTj9g{BxdUs>I=MwDK8gh zFC=FOPg9x-ZR=@xa!asjYW(DBW&({rW@6bW?DT08vC={a=RMHM`7RpHx8cIz+Lg%X zVP0xY4H$`y>)jwFnl)f<*&_bD#9UG{g3jrNf9awQ@z_a=i24?zvVp^^hAT(orSYtI zNHtZz>G-lmnZx<>4jLm#rCm)dL|w+oh$=iKGi31N=-G^mn6E|rEGYz76M^Y@-iJF0 zNh!Oj%Ea=$4a*t)xJ_e9m!pp6xn~1%xU#p&;zH6wi}>NXbBF}kx|z6PX=8u%oB27r z8EWptH@=EnX!erD(3HUQ+S`q{L5V2xVTeO1hb7mclUnybY&OTsPbbu8b zV=jAQp?O0q;>F3=SntE#H&i@_&q8g-3ZrdL&qTDx^P~`Gt5!)vx?q?K!25BfT0f~7 zkx-*X&!in_?5nG{u{O0a6haL3k{o-+Dl?Y#yO(B$-WZXesm5S*j1Op`+5*+jQTE(8 zgyf4a1N_^A%~!ZVVe`C29xlDNb6g&d9k5I>uH%HoUafu7ib@ouh^5NMqQh1ABD7?83URH>h}@ zIC#dIS2K>Iur|EhZBL8a&a*=OV0Byz=xn3Bi*x&(mBNwvpqJ$OT6Kp$w|F+*HSbRc zkS}U6Ek{JchVu(R0|m;M{(3%V+-Me)#nA}V?ssMRSgR6#8zBZ9A>5CfpPNu|KjOgX z#_I1DxCF!8B~y9_$%JXLPoXYS8VAI@biZRkU?VdoA`-x!M%pp8SApKqBD|5HXa|#% z+z$1Wi>p^Owz5vEZU*V?7MxMqWvah5O4-@Uw|_hHx7vhuF5u4gxjt!kqfo@Cm~Ge$ zR2po%z`?_P5m!LrEg%oqQ-DjV*)GXZ2tR_Jtu<2;WpZ-q)$LFXcK5Q)G#;8@PsP<= zt?pcw)5tHGJF%%#ydM@Q8LAPS#u;hhd081Y97Dp)m6N~zDSNYq^m%z}A*^+Va{W}8 zsB}1ZBBbkM$L>brj;U_8-~OS%W7sv(oiQJI4YXMF_$FJ-k4xEe?L;LgAkhB4uDUj| zu7sm5^BtV_$pp8(X9WF{-y3n((cF}Ia@NGj&&th>D-Hj#(%chMb}2I{d$_sx!SdE( zjimXp|1xi(e+1P9sePlf5kd~By6QcQt$j9EVOFpB$QINkxBJ5>G(Ej0Qp!q$annfX zsQa=NtSYB8-LdRP960|^nh|yx}ohzcZMpgH`a>IQ` zJn|=t*`&HQc0%%SfrR83tA~TVR;oZhEFtx}!87gV^E0)i(PI2uFXV*?CqN+&d0m;L zDT#1cqxyc4C0iC@WVcDP zX`uD5kOTsF&RTf-i47t87B7Wul%Tcvm?!6UL-m_3QfDBKx42zmBBZ?nLC}gEQip4D z=?AvCdN<64im(SZk(JhtV>;Co$5`KiXzjNqSw5ahcg-VTex?Kcr`<|H;OSPXS@K!3cM=SB=@wm!!k`9V zuHVmtdYiLn2-Ru&yS*-EKe7ZWj&6rA*G}Z(oe_@?syT{D3uME29wgiSw=k2P=>)i> zZYKi+RSq0>tmHbZ7G0gLJ#REjXNd>rEi3P7M323%t~C+x4rMZv+FEFK)RO*<`vdOG zP6*&*JBdCl+0mJ*Y~LX69u3{eqlh^0%WJOh9_)&vT4yTT=Ofrx+y5knU|DI^k%G4L zp6@IX?pP1#cEnlOdY=uC6d@qzIkuO3ahCOCG=&(oJ`O)iygWc3P|H zZHrW}T1cu3&iti+f1Oe5qjH-PcQYXW@bk^>;E0i3wCJ$IXc4+4m%#}T6n8}RPVGmj zS&JlxBhn5584(;jnz8ZbX(;rG7tIK8m_FsoA&NmKM9WY;>fA^>>!bD7nxFi#u zVbsXbo#zLNH5k&2RQ&e4KhLd!VHr6N!S)`QlV%SNr5m1;jz`DSHmamkvbT972Ab`j zk3q<+WNPVY_6SMf5atHj^oXVFC}U`Lan{rCFMx5Y``K%ormcpWwMNBgmiKopZ&wO4 zlP(Q$eV*rv>fT4++@iFYdX`=WZQW=i&v2hCuzvA;_1nMv^bYVZao0ZXQ}~s#p@w;( zTC!zevrYmo=ILB@RD~C;=vZ$1QV*6ldB1y<`tGi9dJJjegb= zI`nr^vRHR;;KiZvbJ2cX?kg$H+UeJFy5tpOMF8&H@dhJPD=t04F9pB*$7t1Xjd_CF zW31xMdUQ|32M&1fLkv>Go5|X9%F*e>2RaHN4i**yLX6-6ni#&>I>93&uh-w|935ix zZ?Pw{2*lXT&XeLQx?9nEbp24(iq)uQ$spb*LoWxf-}B9E;1=y`{rIJmWZ>gd z)W$T_xPN}h&&N~sWDf3U$pfJMbJ;eBCLyw5Enlqum3&ihd? z`Rt7nu-TsQMP%H!ubi~LW35BiDvF(ekdUc!JXXrXeE8L?i_KnC*Kcjj>BfsVB6l?b zz_ShnlgO?0kCt&IEP+J$EC?F78xDjX=ae;B?v*OFDg(|>s2MF*8Otqos?FlpSKuZv zp~_BKQo6+~QpBsSTF1lGMh+EGwj@vd`#zikpzw%C)w6CWuk4VlvPAlDGj{9l>^xmU zcDQVQD@^x=)@RX;Bvvv%2EE%YqWd!3AKH-hf^ErcW8!p7o8-E@;bH=2Y$$M<3rnxrE>tBfmpU+X|C;&Xz^ByBm7G`_=vEd&;%#UVn3h4 zv3jIpwB-pUMz}13)@q^FI7JEvDgXy!>=zo3M{t-H71O zQ!?nPU0;*m_^1O??rNJ*Qz$Y(b_F%AzDAS3 zB;xa9AJWQH8(9pp8cR@AgHas*h^EF;r4Sj5xMYfEdrco+kc(TN@usolhPHOV^T z11vn8puofWL7*n=zPqXvQnOaD1KCnWuNQK(&DHr!D!3M4#VL|GFm>X+MD*sB$#|2~ zvuj(dM(lWx{2CWA5IQ!^qHBkZ=IB_wRd;xkiI9=bIwFV`O{~9J{S8n^Q35nnn$r9v z(#60lG^@62O;jr`zN)5jl&@OXCN!AXF9D- zl(V!Y!C_7NV1aSpSR$N+zNwTiwk|ir*Tr6}*C0=-3j<~0X`HQFl!aZK=Ua3b6zdw= z?K);{tZHAJXLPsVd-c&2aJ|24OD4CU+T|nHYfG2oW{x3vX}_ z0$cQk4jG%VhFOv40StNZdWmB*Fm_+-5YPX)S{jY7p>oAS9m{hY{`1@-Cd`Uky-^{f zI`${z>to)QM#BB)=66;dEwNxgE?hPpy7IX>qm(vkj^3eT$ECN2&hrl4WKyRfj%nLUOboSCq;LRYsX5PnUV7eVR*a55rV98DX zF8!L?@3$kWqa>p0C~CayA{OiSR;5>V4vR$w;*|DDOt7#xL0(#-DY*p@`yw5W6NnuK z7S{Kk>3CI#O_FysQRZKu+v9iEFcp^ax&9)L~C}Y(* zB|FD3=V8z&^GwHf8Azplg^UWL{;VoQ+AbOjN3(2m2lkPYO5{wLowhCn&4f-Dg)cJa z@Ej1a2pUbJQx+F};MrSDS{=7xFR~5> zh9d9aif`G+lsU0rS;|wItp0%IuW>Fse)x(dmZh}oqgJ{L4-R*aA7eg!>#u01RRZpt|MGQMm!c-pv-s*T;{qchaBvS!oOsCgSbGmj{Hz;9ju8v$Nc01lTMBVU+% zuF8pp|MrUPs#--WE6Ix^{ z&I~{-OFys4VKF)g7{~ixlPk4^ot^?^cG#jS?C*WhusRFE%gAPfuatp$hgRe3RP~}_ z_qnct(NE@8t>*w%JQ}Y(atTz~kX(PH)OA~D36)+A8o<$8EDy@XgteT12cQwaPKRrX zi$f`ebL$YX)XRtRWtYk3V{J=Z_{P>4-S}ishx1T~&XwcMtJ5;`<{{F1@g)IeE~W`| z%LUWQ_B|V_-S8gJE`E#k!c&+Jo7ONjtKCqJb!^Q5VFc2t0^XGkC%of7*f=iR&kZNe zGh};Y)9;4w4Ht2IOj!F5KZxWRp+eAj!;xrke^d^>mo|oUG*k6UB8OBfPjfivrbE^js;b-5%r2*&Y`UL&*ptDgeuk&-30diVUKD-Rq zWHq8c0zoL%3M(%!l<-SLvA42G3)E2Y5mZqq12kV>`1yepHNQZixi}Pnt*nLkwHNq6 zx~d_2B{I;kFUcs`k>qOns}rCX=!=4z)(#2a@=m!O_gDd2u| z3HdHdm6?!j!NsN;dMnn+M=tRjaf1hM`lU|=g?eA16Vc!4IQ2&PSv`VminHFUyqGnu z|6pqpTA=tl{T}uT>|U6hUVr=QbxY07WK%>-1N1JKP!aUj$GZtR<@=QhW|614`7-x+ zZF$H9fLNYdyt_{F!S#wiBh|lku?e3hY#45qZUS%lG{IM6mRIi17s=h29lU@$<2j`e zQt`Hz`FBOtQx-!A$YRW9XrA&aU(hvh=ODotoXo^h!Dz}DRpbW~^hLMlXBRtNjWG4l}h z=Cye!o=sZ7HiA}ZKrz-9|uQpG%eZtv1j$B zmXwkK|MdYju&`CV75#MaR%Mc|8kfWDEoDR+%)vmjMt&0zf9*_?upiE)S$SW|u2uq( z)WJ%K#*)m~zV2b_;bH`-KGAfhT%) zE*^GR!nctaVgJRo-+%xsmfCXmDJ#eLuZk0SKPxjkc(C^cTljqqnh~oncakGiH-^xz z6kUSG*ZsL%yj6o$>eWetgWS>b7UTteN3oLlmJQSy}I6 z6ue~ALca4=qs>YN_io&u)nEYsh{;(?>_u~7MaMU>)-xk->|9PW)~)!+GByl_YFC!g82U|AV)- zJc)d~_I_HAnXy{w1LBewI8y5T>U;MH?7iI+^mC6j=t5>ge$!Zd<`8_LkY->F7N0=#I$2yk# zaNl(|e|a_0nfte2H@2`1sc93oZV-CIQ+fccqv{lBs%cfL2dV34hN%yjkC4;}P?_t> z5eHVXP_t+@h}O})S$^n3ZiWN(zr$7)OS{b(fe6pX zH}=ddk+IPw0hKL``(kLMNJhrS3dRfex3{;y2?aQnQ1B>|)Z-Od>1oU8mhE*?zCXH4 z9c;c=lQLHkLfbh2yNw2(?b$Ic8h18=3*|ND<&0KnY<5fgQd zJT2qy;ky|b5BJ9}fTF}}cZo&WQE9GUyPTei<`)ra+ul@-nSQn6{lL=^omK7Oi#9@M zo;{y8r}pi_)dJ$i7)NUX-e~n$gDf8Z*JbqqmI*G+blf_^U!7$Il=nxPA{!)C50l(= zGz;Z|smR#dda=QH|B~%}DtYlpP5+**HyqilzQ2i8XFgFHxZM=bEMZ)1X zI^+`ck|T-UuT-6}Kz)VfMTN~Mr)sLPzH1bwIBlUdjZbteU4y7G+d=aB^!*fxlj9bi zF`FgOPY`S^VYYRzco8TdU}2-Z*|uEftU0X~Mcd`Ux{;~^uKt<)D>3~-_jQg+UL+cOZUQQIcCJSpJIm(!GiX+( z9xNy+_6uec(rA1}BJ$cCjYzp;Rg03Nlg)|Zt4RySTK~D44oLwx-s8nI)-LZ|KTQuJc^0<;a@9Z)#zxnia%GoN6j4 zgoT8#rf|pRPnH|&*TswzfiFuqrm7KO5LMqSqoP`JLEh(88AR45SZvz2ZB?fxrXnyR zAt`@0vWfJEYvgt3aL*)-WjefTdye|@Fff!}VRgmu!Ebb>1q~tdyNZ(={2$&H=s&K; zAKy&`?VOm({*~7?ZuxjKbre22!E41ZTiJXGhSLcvo*Kf5pb zUfkz?V*&d{*=^73h$}2x`D(yP?%+@qt;2}hY3YsQKD)T+sj8dzI>0dgQ+#@B0;o5L z{*$9^JXj#f7vxne_W7^ay|XKYaZ)#>Nsw|Dh1q-sW|Tah_~0xItL0+CHZ&V%zg2^~ z+Z(Op=O>gCrFR7+Q=g}W@(0$61?9EfZgbXFV_Fwc!*Z!mDoy1J9)F|y(;y{*(3Q~l z`DWTIO}MK1uf$9}_{K78jRCd7fuQ=A#n!!usNA>{;i9*SF>5^NAT#+1w2I@O`4jvm z3VG8WUQM=qah|RH^HvpJ&lAFS3T4|E>~79hC{|a;l9q=IEy)|Ld48IB<8FCki)??z z>n-GrbI_CHhA;Ey*{@WOWqHxsdZ>t3U#OHrLNn(DvUZ&grky|Ygd}T2zT3BmqH8+l zIKEvVkG2Y;+ezPmroL|^YMWiJ%v%3`HnfmMC3*o(MOzax)aofis0{|o!+Fi2{O1OF zfPFy+c>awJ(9EhXBl;2&%-v&NKR2U(fJR*vBPm2Gv!z&zBelGs4q}hCm~K=`GNP19 z9ionr-jjbDSbChMD>Z4Q>qL+vC-+Iy1gAro6d4UaE1<$UMs+SU(`IRLDWp#nCxh;4}mg_V-z^RkfSeNnh!ULkla`uH9o44h=xuF^yWhlv%1b_yoK_A)agRQ|S1xwGoI;ty?uOk;`wX z1@zThKYC^J@*NzL4#V}DK9nS>w*1z=eNDKoY@fSlA1ja16Yu%e%ee4d&@gXI2w^Z# zcjBGC`o}G&;0q)1e^rK8zCe+(^Bg^pB_mDf!HEW43km$z{)JP?1rLc)zJBcc%C4B~ zSc=F(NHx6AeSIcqaQif4NOq@ijuwb*;iNp)=_csXocrB+E>`iva@(~&?b09pdnygF z6Pde#qym5C>DO3KQ-_v>Up$Ew4s!cjxM|k)(36}U@?_BsiM?GIa&X)%PEMxvsQbyc zv+lO(T8B56Kec?HK;khfW^92!Q`Jo2La}!?~_19GkYc34nJ@hNn$b z-n0w|{%zCzf(Ed`pbnKi;DIRe_Yedi=I4~1vzOs&O>IuQO8L|whsmcz3hV(Ela*fv z4J`Sm5@aQ1y(vY<8tdyx0OuFDapRMenu_3as+_c_lo*X%HpPa698C_dlW=*wz$0$~ zVq`oL6a;EjZpS!!_dvKPC#yiLlqc_VF1CWjI(3Xf%<9%CpI>`@!v1G9m*!U3T8}1H z;H{mNpDyxRPThv%(t3qqS4Z>kHvCR40PrX=+}B+-;rW>)dH6_PzW%+Pf?zDgKdp#6 zad>1xqnxnJRmP?4L|Q8>C|O)hm(eC>f`{dx>VkV%c49`t^@!}4GuD-xcEYsBcju${6)Jr3GcYl@}<7Rn$B~##^)BFNJwKtFf zJYYjM=vlqLzdwNq0y0XK_!i$LkfKqZBifZh!o^94N6)zbW8Ge@K7Km`G$96q6khK2 z5qG3otz74C#}AvLgEowAre>Ncnp#0v)!M@-`*=D+q2cgC&uTx1nELGBUHb2i9-h}_ z`vFX7?*K^Jk0b37^}(6^1%gzfQMq{iLR+ku(-VQ06if9AXVl3&Hf!g|28z0MmGI?S zz*mPUaY>f5nltX90f=1}6E?p7dDkR%t$xmWw;0+Jszr7|Yk7H#iW20P6Mb|ezQIjs zP}IIE>YreQAU{_3j^#Yx_5m6#Yiok>D*Ml>ia~wfY<=Fn?er%B2j{nzXcQ5sYGhh4z<<#h8)3G2Dq^#iRQZ*c7o*E&^;Za{uK2kA#ruZLuJ@I9jiwOvadpsL`gncsIBop#vLsOkXI^+ zQsYD?O`WLC^c-m5DHUq9#3;Tc=XLjBad2SY#VAhn0PR|IUpw`s z=u6YaC}161cUD21u>4}Vcy+2mLkPIUS|(dVlSEemba=X?;(n$_SPK7(WyT_JEQj7K zP<@`)lsuV3V+?&}tX)kH1o(-tce0aL)pwq`ZI}2@cMqJ-`eT}kODny4N^sdgth=;R z_Ku34QxAq{Vqn@k^)@5cPTT!0==yf_(if#-rxOElZVd$dx9p8`z(L#~2QoP~FHYco z4efacm^SH_P9mpo;Wippf-^NFrq~KS(srRh3(29$2@A*3%HQv3Vd`@s-^G^^ zHJ|~~j4Nx@=(KeJtswK05twYDuX;1RUfXucWuM3}q^>_YlV_t?ZI8vQ>qJm<5c{!< zytNoo>~1ydi3KRWeSEs$r;@q10&#yoWaeTx{YmVA>+$aUvDX^dHdICYg?N6@sdVSb z9fGK^`Q-W2_UNv_0nej*tD{=$Xs5=ymI^#qK&LYTPZhZEE$YN3Rd_$epj(=X8;N}t@uk2;X~Qc z!s%KyHH@vJ_*>Z8(lmmgF9%ZQjt%HYc@oz1r9AJ=Gwgio;O6TJbjGFus_n#mrWR;j z7ExtkFt0590JA~{dK1%WwrHU^5}7^#wW^Da1*YuJHeO**VmQmRcFY$adO`MZ0FDe} z*icP-1>vZPRVX@6p*o^UIWXxFJnWg{R6Gsq%BBlobpWafD~(aC<~ST#g4AmJL#lc! zL<``%I|_|?ly_LIaKd($@v|y%*~Ptu>zO_MjfS6i(<)rU+zJ|<)Y*6Y)PPb-T4HdoReSoeGLr9%jaFG zM#0-~KryxIVc3ERlPBB0>_<8UtkmcegKU!G22YE7-#De3VSyl!F7 zl52?|$|M7On6f9ozmSoqccdL@MMk9u+ncrrQ;fX=L>t)x8J^x|6F=YLi1v_lF(&N0 z)zj=nNlQypMa79MAHo}LnJ8p~-ZAf8Wb*W6jGiX1$?V1BPXUJ`j+6&F+)b@Ywdks) zO#75*>IuRjI&tYzB*D38ab!|43dJa{xL@N$pLw=67#B@;{U3f=_186E@T(swjw{c1 zmZx(N_q#XGRhmY%;)*>_MK>SV^S;6nFKqlxcp#wwerD=)HOsx@Q~M4Q)Mpao=T!S} zW$77OO2)0`h-6*L@b$R?g{-wFAwAa$tfL<$#_(Hx&DwtZX>d1~?BG%=cVo!zea`){ z=z0a~zX-EQa-d8+h-y7DtWrN8=FnTuW5gh(3m{>ZEO*RR zBcRH=ldo^1?7FiI%Of1})EOYqCW1rT&H5WI@*`j#Z3HSMV$Jr6%0S z*T>lWic;xVrBc3i`CEPoQem=LRbZpbI&{MD3@BSXx1%LLS<8&2B~Xex@yCb*)R4`&olzuo5RAeWza; z-t`ygiS(JYuo==U-$L(|Z@IvKdgN)H2iM?nj-TmB$sUM1s+A=F$N2lc)?LTNA$?R{ zFX#&A%BrNSNnhsUvZn#33B!wNXOhjm8tB9~sLpmA#xzm-rVY)GkXouq2?zz$!HS-x zZ?sxV@t?_76P;W0x{>ZQ<26c-Dw-I2%Llpl?n{=d3Cl+Av0d)E8~I(KZwHA=gWXh~ zom?3VF#n5?wsQgS$q|?EQMtFheI=9WG<3kq9Y?cSsU({#FdiUq;G$mfn$i^2o424A zl(!5~kb7ne3luKGD8XZIbrAMG>|`FXX<~!&OtAQ@~H+D(QkZCw?sMc+`i414#nCZ zk={z?Arl~n)P`!3aC72WGgy;N$0?u_hg@@pHLr9P+DhOJW(q8U;z!(xow9du^x4P>o{$Q9u*?ien7V z`Xcab2Nzd5Uw{q5{Xp;yuuAq~NkIk`x<}<61eMBlL=^^HuTm0~@2fZC;fl;3U7u`ury^YBadmZp@;x6Zhr&Sp;Ps0+SJ zQ{haT9n9Cg6N(@$3k7yH-}eyI1MPET2deW+pZ=t+V(~ z(>boa2Y-9nLLV@|A1wgX6zf5!p(!bg4*iH4c^|-4oy!6u&Q$e|&?TL>Z{?AFKo(K!2x^DPp5xYH7$Ue!$dPP>9iEMt!jy-fX{aE5E&p zSBQxT*;YV6M!|y8W7OkRP)%V*H6I+128<})xPdiW$_2H*Vt(Cq>QN+(5|J|iV{_;&eQ4okD>%or|5Mf- z0sS6;lBISN=p^3unc`L~FLPe)w+BU&j&wW)Jt~NJVqwWaV#G^KMU>C%wiSIcWaeSGV zTxe2KK-eO$OZ72)pM)}PTD}59!hF88shFjdQh|r;w|E(C#lHrqtfrtL|GG{gb)NmE z^|a{IFp)>{+uyS-d$LbX*)~tKNe;`tGZcpW*Y)bJAL^H5GSwDK$dL#OU)tLT@z`q% zNCCq_ZmS%niNTqFQH7fuFQ-nKZm>C4&_VB|;7;1`rFLQU3FLvZ_5KzKkH=keCVZly zb|2Y4a)VJ&=Jg;~-1Ljvd{LZ;lQ|? z%8za9O&|;i^qafY)H`P_?Yf2^E#FHD!Uf_^vT+8zNZ2&Ibo=(2ptYw^;f*wSWwZ-32FGmmU_$LC@H*qcjCH^0}{_s=W< ze*ci&zyq*c0q6GG?q%%D-`@3xh__l|sBO+js*JfRd2ZM3IX@#ZL9f@k z_X^E4b;OE(1_!~RAb;@f@p#A>{+$76*vE-o))E>@L8{iT>@R|2s&xqnO39q=qB!?- z>EDE*LflqhQ^*upSeia1iir5!lLm5vu>-b{ufTSpIL5HX<=II5m_EEqMB?DO_-5_MBk z(_5uWLh<<;GfX%}&0W`0O<*Vj5Rz0gQG$^fqQ2eeT!%l}zdUUOiw%>kN(CE_iW&kQ z7h^8hs5%b_?+3dImt-v8;f8v@dtR~eet5jObQrmt)Oe-8!l<^KgPyy_4Ss;H@D9Ec zx3P%dE${8H$G7^QWv3Hk6ac99ShaDr$Xoff$;mSR!;}oz7OQV)?r32yN6Jef2v;8oLctVBl1M$hoqYWf8;_&GFg}ew6Dh7 zqcKmM!+`owK-BSb38}?!Dk8r0ui0LH1<~H?gK2mG!E0$KvijGl{sg1_6Sz@JR*=#T z<~;BF#b=vbNCOepcKJ^gt1YGo5{*{M9a-$7|;GwOjsd-n%y# z!@9n)(sf0yX4Bj_@-1wN#+ZM*R{!s)M)@_3D&r}K7<7J7pev8PNHsnkzYlLWOl&UH zp46VgIK38a!>*oe*WC>|YkMeDottZ~u_p8a!%o}q6myRVodEWrqCZ!g)gBtS zH6Jlyivh5Kmv?bh5PN=LaNukqe8Db)WWQz}gvQw09Y5$yrfJnh@j~4E@k}3Oz09lm z8%ZGfUV@0l1m|r5gU9QHV@L>5o;WCcI{LU7g=n@!hk9&X8ibVR?YYspRXAVc{xN1e zz=Qut?klbYZ3)*;tbYlSh~7LY0XqP(;T<_Vq;tQXgL-T+M+0QO)K~dDIW>IWcf~@P zOb&I-ChPmXHpI3V{_sfeV0d|*oMNvMWOd&7-+NCGKgTPnBp<8r|M{OCMFDmGLtpTJ zt!%)+xYuGsLhXNfL+d``EjSU*TseRp1%K>*u}xJiy(^kZN%=NI{lUJibhsKZSoU8W zg3u}y0M3@YCg6^3{pAutUr=9<)#QBAksEsOS^e|35uL^i>G;yq8zkFySt-nyYQ+0q zxIO=i+kwZAkHFZPtDT-rsXyQ9>c#hY&Byv*;sz6#2Gky)0fR;KSy?-XGS59&mM0A7 zRJEzTo^!)o%6G^-=HCFqi*V}&nU^Ko{4?|eSUTD_AuzQb44`1UXz0#BwYtBDv3P6# zVIR!^E6_jeqe%JGD^e5UFA<+4&9QSmD^UkMSA3&THM?!fYd{3Pl65*kPQzIUX~fq5 zs;H2mFy8|o$QVOOe?$Ee2=%rw%H*?v#cOrEh{tetcbQ~bm$S@gu>d#@jxV!c9#;P! zt1bqW$n{pe))muJqY4_RFxk2n`aXJH?k~OpV140HIaxDQgAJl}hL=zHC%SC~fmwyu z-@gvoNB>z=xS)0b5+G&cf_tmXT$o)Czsyen1Aiv^)rg4u%Idwd^9)>&|6=i0~>`oQWeMZ z0qTD&#!k}94x(WGH$S2LQiTpl_#ff?=XY=fhHWiyLos&#E7iY*2HdwlF<|t6f3^QP z@CumdBL0$>NKcvn{7Nrd|DVpg{;wBt@QN_T|9*-8U5WpViT|IRj=M6LS}qsgS&vgP z#c^;%s@AvfnW(q-UprQ2&=5#|j5SK4YwPGZP)&M)T~!IB1_xqsVd1WSOt`p8zx5^W z>t|Fh9hq5py_|Nuvllz>q+y=eKt)^jS?)aVW@MssxE67!nPpcaF2y6x>e|6M=Vo?r zsPonY`zl%tl34diz^1-wYBb#!4zjcO$Ti?}ghEBj*z0|31Wc9{Wrr+uoZvs}d_Z3f zUHywt#2=a@>`8}de(2dVe;@D3ji-Gy*ppw!ap@c`I5Jr;+ifxK^~i`E48mp27P{=p z{8NLBOux`$zw$@%trM2}qPTQnTOz*T@=vT`2vg0a`yn+`HjW$fU|wSC*AL+oBrJKK z?(loNyRm;gb$#RXd3TrTk_E%blUnwCz5wpEf9VNifQ!Th>0g%tz>xy;bm(97;Nq(P zo~HvSimg2w+>6e)T<H(lI57t)?M{Zi%~Bc%ic5?u7LAafcowPX>$YuVGw(RUNs(zvC)vp>#M@#(7#!|Le(^^vr>R zX15I)^-TTE{#Yw)5*xhp?5brg!DoyqtRq|7mDNr1a6rku%1xho9#8yfc=+5te#5}=efyB*ypy}T*y!C&J#@OTQmZw4xCDE7 z(*s8Hn|0&1c-T2_uP`cJZbo_tBU5n+eWZJL1M-gxB`vyS!7ncHl!fq|gLj_L)bAfw zVxL=gukeM|9iOe~V^_fY2jB5p+?qZg?VO)%!^PTp)Y|~CZl_X|CHnuo{;s0`TwX6d z+W+yT(9It6Ld|<(zF#w31 z%VvttR0ugzFgl^v4kSeMDdPI74Ay}AL0try1R9>RvQIVRdy0^EsFFmnD8ow zgP}b&o8a0&x4pT?oSmIMTJK0mx>j;8y6zr{KVy1vqzgDRsu{=v(P>HYpBYd8R4Xq5 zn)S!EBl+*up_-*p_=Yg*`#UW&^)?v9C?z>)P8vN?c{a1WFH5D~&5%DpVRS`Ny*&!t92zhj0|qp?9~j#f32M5?Z9QC8 z+r;wgXs4{MYkTDW5bxE=5V=>?m7oXNT4-HGcHtwNXOD;+Oa zRsJv~k@F-Fv@JJ%-noUkGQQWw^IQ|6Ep3i-Dq!F{7SqpCmnp~L zV;gO7`(cux^5@E^A0$6TUIj*xnIgk}FMsA@QxcYKJ5Ee<;X66|dgFPTo0r$vc<-R% z&wZ1&psA2MJ$!f|TvC{$0*lEU3Q0X5bj!dIywf7J8@(S9i@BhO%Sj}c&2tTb1 z)*dfn21*S3yXkCj$F>9sZQnUe6^MdHSC%~c0_?af*DS8K>Kh`LX7UxK*g7FCB=?k~ z-3p6?iSNEl-5*)Z%MaGblvBHlhUXTdj3g)L6zbM_@&E2Rp_Jq{l_Q4 zzIj6b&bLfID|?3Cwpq{(@xuwKK7zi|Ctf`6Ikzcz5!^|uiSm{n zO(?3AZPJ%XpS_Fn>Llv5N%6y(Ec{v8Sl(a>Ms4B$_&$-j-hrLji7P+?weRdOPtO|J24QI(6!rV0fFRzBsQ1pWEF6j$JF0JYGBb|5%@Kc;omrj(wlt?mIC9K^ z=IdXPb8?l;Dp#)Tbp3>1C(GP<6(F_7&e?v)p#8$IVN0>rCi;)PCvKgs;Z$KCnIUOU zsfJ>nO;e-?%$VLo_3Wm{D1*xz#6&(IUY||pfA-=3?1}`&D`Kl?VL2Er!g^T!gV$u? zBpRXROW`otlq&>ifpMS!$#c)8WLGivIsajIx07$x#*_3V7I*9WwY2jKqLqjCs>D`R zbnSLHX;j2$Mch38^jT-{D3LHILsa#>D>zwOrqq!df1#-1qSS~FzV|5!xlrdLgS7G8 zJaKmCE6!hG)+p|LN^BqYymPF&XOtkq0nhV0C^^>|v`%{n*u>tuuDk18r_VSl7)zm_ z*XR_&dHANxvqWem#|f-p2gHD~2I6TBE$ga0#mIK+G9*58i}Kook<=O>Mx{u-On%hn zt=39?zkI_a>xA~%({iH9hXd^TQ%VRCp9KkX^*ZiO)5WKP31tIBB$^@@3JN)v?<6jr zx1*oTZe?0D!tlJ5;+-sulez+;Y7b0}u9Jmx^EWCvdT4fU0H>=u@ zl`cqT1Z~u4Ox}MuKo-1nq558_6TNS7)q@{lk05Gg{I)~2$7OO4{&LV;*sIWA4?p98 zPOCDa@n)VO?JD}V?K!8c`UgC0f8NP{mObe_5B7uoBA!T2sW*6dWwOfo=4#6*ddL%X z&QFe4p15&(5$X6->FxmRHXvb~khJhfP(B)~E#3c32O=}7obgW=)b&KCVBGt9<`qyG zZdyQQ#bTfxmeBl3HoZ!b(1b+s)UZtpz5ixD(^JLKF5V3GPI(IV#GUM%r+1<186VS* z=3qG&k;KxHT+tVY#UnC_mp0}mPH~(=XZ<8C^0!>JtrT)!u_agvQH%xw9thb9q^&0i z^wd~+keI9Gps(rA$2;J0v!wRAmDg`cmxawlwZ|FWveC_6bCeZ2Sd9Yvyv1mSMlcMM_KHSFQ1qth}xM>{zN3v6aUv1+Z-qyg^3f z9dTS-&lk&eCyL|Phonq1+e7rKz{I`HIS`phm=PB5l&$n`z$TtGR!R+T6SW)P*; zT3HqieaQdez-HmY1$61#yDJWn){k}iiR-?~!S|*G+Ic&y$c8-(KG%5;zb~z9Qu5R;eY&TO zd0nr66jW%I@yHY&&2?)+lo=L>gmg%co01dXaAK^#C$;TSjQ#_U%l?uvHQt7_7I?D# zda14G(FI(TX+~RTsaRK8mXegxu8s(+zMV$qx4={oNyvyAf@M_NX%WHCXLs$$g7y?m zN4!x>np|!yvZVZFluFBKOx&j7(+8oaj<4)6cSt+FTgoR*twr~b3+e7CwL@!MxC%d# zYfn_jsyMH}6akq+2`PnIEzMzFMw5U6Z9mCAtY<%iG4>msX=dEMo!s8S9#~Z*X{yv5 zVbs&8hZj!CfK8SEw@X{GT2n_f3EfVNkum<>Ua+7}yr<~$D2JbnFXEkv z9}HnWDV?x_M+=Nu2|IwW)bC)sZ4;isUMQo~0@-;RYvtL(PZM=yY_Pc|ft z_H{*@-ZZ;K6%fER(GH%8O-89szxCN-wmlEy;0$wJZ5QyetDd-lknG z?SZ|YLN2yPa_oSW#!I7=x*r$?%~;0$Xk}-qV@lV#_~{W-oo9!4(OT=&DF@*dQF+Bb zsQQb`;&V}^d60XW2n>vV@>4Vu9yO6F{Yu1B&}U&#vzx=o5_3f3_hO^f3*jl^kei89 ze%G5HknhEs`vV;?hdxOo&^BSy;-BAIaC>-A)flaH#^#!mK*6nAaWSPt<!PdiZrL;~3B>|=&n*1wx*a)S>> zA|@}YZnWP(-Bq)8bIoyD3Bk*Ql&T6=ryrcrlp6Z1O^WLHWKf}U{kr7c5Es9 zeIOYSjg?merQxQq;B~E~@N5~FELPOif!3Ivu-`tVL3Q@1^a;`Gmg|U9;1DC3kY^Bk>A4@cWG-%pr1rRjVd+7Bby<>q4nmL8F-@_e?qz~ni_OH~5)y4f zuVR?TxSdHsE6F)tK-Cgg=sK~$;P!yYk5|SHS}0P>p)|c5a9o(I*dYFZf|~2_*`8&) z1>!JiC2BA=*jQUw(zwchz{-zwmLzWZoylYFPIfYWV_Pg`EoJLsYdGiKC8&g^V=g57 z*iE=Ccr(-~&iH9*;Y?f1lz4&JFx}+Yp%0tM*!zCt+XMI~wfH)?y}Kk@kp$*`-U{z7 zsJ;IPg?BK@ioj=w7(C1ZVo!HZGYUc}domd4H|-$->ZAKJplF3)nbhF;d9Z)jr|wlg zUNp^5`#dpFO5p=?;=A~Tf5R};FY|tMPx)K4+r`B=KbpNw9*KUFRX=wP%!p03n5<=C z;nboM%pTOa_@AqUF62+J^Zw6ZpAL&Si%PrX9AYh!Y_}heaFUz>=G+wEP#dC=hKytL zn$+Gy!aFrPs(?Y>5*Ez&5efnNSJWynW6nsVZH6Nb5uTCnzIcPO&~s%`cZQ>-Rp@k- zj|6NbKz_Z&i4H}ItqInIS)}IHK1T!*Z9}3B*q~gduQ?)-P(f%}JScX8s0)+5RPhT8 zHf5asrXeVtCnV2|!}1J+&aEk>ab>WgT2C8EVTDlhvKPX$_KK04#98Jcsj&8Oj(Gg` z%Aj9Nc)aeDkJ${uZ&Z~;47frg`w7Dn3M5&dobJuJl+8s%z^Dm3VLtUtQsTNu-_NSa z0=lWr?!#0!7;hwWZmt%mL_bWhNYY6dhXC2;2HOg6lNxv1Jet?e?; z_~6kF9(s)AvfupNgu>RyBtudzhq~pgJEw5-+LHqVT|XIR!<{unAlD~VV4k%!*VQrK z29fk!67_mb&0qYgrs=_X9K|qFXzi_7Sli{82qct@t>0qd`)+Weoes_o1eNW{U+*%5 zjHDk#$P@3JiNtqxt=`h8=I>fat_-`~&h>3`lASXtg6NAEtx{%rp@&l@`?xK0OjO0VY`1RclCEUh^rVEBx=@4Dmf#hZ%`;vBln z9jo-rHzPq71cKr_p)gGSW0xdIOu%-l+ydNPGk zdOajV9#~et)V|%iKIE~JH_6@~{`ypTg$JCFuB3)$fm>IxH?*Z2UyahqJdXG#lp_FM5{PUAQC z=D!|UO3ruvyo`qS(nhW-i+qAv*c>SYdPiHdj%jEK0?|rT{Rj9=1KBR)O8dTd@3b%) z=no!i`2o$eF(a3Nt3POlF|a=_(R|tY=IbvO`OPl|mn-q7X{^Rn zJ5tm-(PihHCfd&@p$bV@Cipi(II+=9)?!?n;?QBgj|?u)UcZ(@4mpF-ipnSB2zYgL z7(`x8mP`LjreL$8Z{lWY@pJY^a@do-6^%jWr0dfZKFG29l5W%l2uDp^**29*C=Rt% zxaSEbaqlxaBRPJVcs7VR?xhZ6q|}$5vuu)I4&+U)$j;Uil^b@9NXWiu-{^CZZ0J!( zsSO$0?qUdyzMdf(FW2mjQjjIhkcWnnJ04%O7kMW-YtqH}3>sv(I`56Xtcaj`#LT=( z72EOK5x^p>nWv>$3|nr>6j!3J0kOjuGR}JtP0f&tP0RT%?sX+fv&{+ZAc&DrlG@4Q zVU#TfSZ*QVpo$$1`z!f1#Nnn4nKmf;u8B-wb=5yyb;n4b?8pbt7(6~_7iCNg9;rD< z*u0xfDa_{-RfjCs=sybtm==({^bO~;Ul*IF>2w>Y?em-c)H=vq===6n z%d|CPeczPDv$`3P_5#Pq@sMJ#EX3Ypy@bitjo{?sxtY`4eCccG>eb1IOM29T7?R`H z8VaxZXn-UuQLiyamH~Edg`Ekc^fuVWb<6R6_swYe2V#8B?1{)Hl*x55W z#aV8{yuwj|Fpt{6j@uD8VzFvoGoiUM5?Z}kZH~FXj|(EivE~^?I`MaqL+9aoIXhQ7 z`gAGSp0IfX1>pzUl+C2ZY-leh1y&!oLl|aZ*OPb!RlJ>1zX_L`tM=PsPOML~2NUO> zu_N%WiqZwm+kh7HR`e5$R-1%qJn(loNHf5RYV26IGzMC7><_jp!NR1QWMCp@8_h~~ z^J!+;dpoy*c7=|S1lbT<9m37Ek9Tb{*cbhh!=pWq`E6-%T*FVVHrej2kELW{{3z%p zzcSBHQ6rdLkM^}VBi{{Z*Y%|M&}Ru_=}3bKispLU=Og1NxF;UjE%t>Z3QB+L@vxQ^ zxPIxF8nza9NSvT?IH5@ug$*(pL3kAz53Lrwi z*+4&=EinhbPPXflyixqRXOt!?X0YNQi3<*h9Gwvm?&3ce+8MgzxavA;$vT&NH-)L> zp<^KM#k!NPjqtZZncvSZ*|?He+nI9HJ)`QGJ;N}f`}2+;QN!))oO}elD9vrjvzL_; zmFy0kgD0~S2OYpTsY(huV_Aty)t}BYfs{r+s=9t9Yw60kJ@UoPq9g4w zI^2WAfz3t}t~^6slf!5WN@b%AwohbC6MA10OX%z`j6uqd643AT`*o8M^at7NxoYP? zxKJu+x;$nTBjGKfbf)kC(2+}EN^GSRZYOpk2(y5^4kU7iQJ$;oo%nLTt1xY9Vk`OX zDwS7Wl-U%ub@3*By*>p)^U^ zuOHQw0`K|8_`TNnKn2XgQpA?qdxZ)z=z98tx-9ifr|*m@LwPckp^CvFFu9SOn@k_i z6An(gnZBk9#OYOFpl#{-Pz-1Z@8>%A-fO2ukW2M-6)uLB8@sUFCGCVvyjULHFR(-i z8EMuB5q-7pVqJfR#X^P$+qrZu-&KlJt4$weih ztyK?>_!m1ZnQ0s$p={Neb&JW4GoP$~MGhmg!R9iSfU}k!f6h>An}!Tifu&?+mHrP8WyOS z8NEXI&y`C~9g-pjY#)G9CrlcbW81(uo1<*Z0sV}5JKow|&Uh+A13_Xc4Vc(TlV0fB za=l~P;$ahlc_vG>EIR*6z-dIo_yfLO$gp0c?oP>;Gf!Ld-O`;T8yt82*kSXg-1+4- z?Lyw(O)f*BH#`Bpy%nv*di?puws>z|OPjhv%OV}=HJ8gZGaE4-oR?j^n8H46ST5}X zS8qY}DqV8ljZxX~cB1!#gW&d7=w&nB;SSV`q%tiTVF7DO#O4UBC464-0v6WAXN#U-`}lcgaK(`j~+ zOvw_)$yOcHY09A-uvTHc$fb{-9NB&#^Kndpq;HQ-ZVn1NHrkR6tuIX+d1#R;RcY1_ z$F);JH^q7EJ8o#yoOEAusSQ!6WNz$0lkGEvhKGwF1a9tN<8>4!y3T+s|A?ZP@$ezE zM^1|9rA$|i=|L-@9;E(b6{HzAlv*+dFkBD)GZz;0jOMYfl%+}@V zJ|#!Z?UgBACw_fqQq-o^Z}~<*=RpmLgph~8d^WM@*0VWfkASO)x)U5)8^VW4(lP`! zXhedsO#@Mp@D>7wgP81E(pkpiab){3%DzaV2ZO>g=^^t5>kBzqbY{X@{41&NNs-1^ z7BTXL((rh^8aqYCMw>N#CtBDpiA#s=83G^5m?+}O!G^lnq?yAdh;0Wl%B+LEgMo77 zKREnlE>s+!m+2=Prn2lR%aB@WD&8{{K2%zdps;>vc?*O>R@%wd|@qF5Y6T3z(f2kYAXvqH02Ui)mS=}u4Nq~mz8CKNx!QF(w)nXX_CRDe9(i*8=>f7 zRj1I)-R!Fk#Qrq8xFb%yl&&iA%bwfu}ME{}P7@4q&7x*=_Yn1A)^3%^FEvCrj( zMwBofXlN7Xycsprs52?zN7DKk<8V03r1J9D$iqFxJeW|69AKq7IE3cE!(} z56yEU?v<&7amBs23&l^jkO%`0_q@?immq`B<%NDXq}%f&k)-}}WaoQRPN-$LW1a?s z6*6?e9TgC(>Quu?_ORjfF+#I8!%|<5AFA*(#M>2Y(|?(F+xzdp&CVnurS#Os+Hsa8 zfo`!UZ_5uHwD?0Eju+H;I&VzNaYSX%)0_+8rifi zM|qudGIoVoW+WipXOu05PIrt4j%}tj!=pUnHy@_&Xvg6c8odai@GOYg#0~QY=i<`% z4QD#HT0YBYefIzf3G6fs_@dh#lHzg1qQJNR^fpeA-g5jg4Rs+_5#sT~&=iip&Soj} zNO)t-YKXR6py4fXSE0No(1Ure{$cQB{>|V436Vel@t|8jlGn`n=Hv~@7{qsQ<8zkk z0&1$`>3UZmis7{n1-OM9+>~g)J%L<11p9EJ#mHLpfwH|vCY&&K3iVBR*z z-)8WJtd*FPkMD!ty_ER9U8?MCX^(INaZ=&B@AoccUeZ@Jc#PPrJ7>6w>QB=Ij2C1& zpk#mlA;B!u0~Kq9VBjjZY10dlh|6(Z`1&TOMSiE!!x~#fvDV0a&uV*wR8rJX*%qZ) zncRS#ctb3gLNOjwzlkuK@Yyefku)MTGNssyOP7i&T-I`?y0Nibhp%NwpaMo~x_1Qu zW%NAdo4(hYC(YVcHdK$M7_SU8-w5^xF5_!^f~dH|$6hu{l2u7t0e0K$Fbgt;=S}<; z62{+J&d0(cV5+2)h0mVAkmk0Ys~xQDx`X^MBHxfi37ruR2w@)p2J-f`Vof^sR|9Dy zi$*f#)b-Pb$Z$zthUQxcNo*}VI^X%$nm>TG zhP|I>KX+aCbzl47L^7iow77S>35IOtN|+On98@12mmJ@=HC62{!e6B-XKG;0w7_LZ z@C+-+DN^5OA6F4wQtz3EYXb?w-WZH|T~G_jEn>C#JwDynLX~&%>e_U2?UTD>o>$EP z;9%3VL6TNs6Vl76FdCLYb`L{eokTMjDLypjdgd)B;7*K2B4ZMR6JqMKTo2_K{YC^G zD`uwOK!_prM0{H25yycKi?VCSrC*A3z2*K?OcH9&9;<99^ApaSE`GdnGi3?B6>;|{ zF`R#zE4g!ic8YvAz07$;;YbrP+#IFKbMoxpWpQ|C3J|@nf$sNvvSB=o*yxn!69DF!MrUz?FPAmd%{)%z zkH4ag`wevvapww=bBVy?_mp%tHhd8tMeS7HmSmFnF@}DV&$l|Y3(_8Qi_C4qrv^KY zRDx5Vm%lLV68V9eDtlZRKGmbQzaN(`hhyx*r@08U3_k6&T*UNGs58JY zJCdiLdAn?2gQ2jN@VvU=WcOdaA|ez;dQNT*)e3UbV<=czAbTI}N6yT%UQq^HuQdhb zlrml}Rv$Qk1S(HEnrx92V}@%vbQpm$f)OZm5vxlC0ODgSF@5!*H%AUAa%VjIjyO`| zT`-|(bfkOV_iRG>&7YMjhtGw~!MTt8pZ7NbnOYU^ z{ib{8p-2Ng9nYEwzbvNd#GfKHHk80~9tcAqkLDOsoaKAEi|n0K$|$4nh(BK1r+M~JeeU3XkeA*emO)KJ8QR0 zJAxw=$`{jFD6l>p)yge^XL`M)yixq~gJc{MJFmi_?6t1q2J-r%(j-LZ3OJ^;Q#(|m zb!iTxfq_2mT}hPf=Z~cxa)??ogLH1^nh9k;BJ;Bv&-;J`PwT~?vCuLA=g>m=94oeR z7PB$NsJvILV89IU5^DXb5W_w%4etifsyFucilGfsDsDD*nfO6zy`1nK zB%#6uzM}#rzmr-`WLH^8Vm2Te$q61;(eJmBsNx}$mB(wCpCT6S>Af^qcGa7dJ^rBX z(bNK&uToTD!E5_dCsPzy~a6d`^oMU72Gkp3~s*jj0J3%Tc zbb#wD<_C>k%*tfSvTomYI%K`j!{^^)Z@YX zmC71Hi4>(VM?46pth+SVlA5PI#8RX4kt6$O!-ug3*S9(YMJ&sk^v1#FO{ef zZLJff^fTCTy2wq&)~rqA-KQc0;`d&`p73w4Km)Nk4u}mlST;y3nNbhFSwfme9;NB> zr;$nY)4nDG>k91zt-P%A!8d2s8emj#l#%Z$+Nc$ebCzQ3pAOv1)lr<7-lC^ydOxvz zuBRtAe_A8-OFIZ=EH5*5>!2(v#rk}rUzUpU^spGjb@_%;L-|RQpkCbcy!Yy zr${Srq4vpV`M+sT;2fifupf-bs_rt2n$A7+DFUO{#H)NhB>XY1yI9gHf*IJ;DuStT zD;18~JP|7{)ID~3sfcje*r|cfgGruxOo=OjE8pQj-K91~+vw$;Soib8NBq04-JLKU z!qWof8U&0pU=DlDS-yR2C@^-P+AU%kukmkKy8%lKk zXJk5_Sa!YAb~*@uo*N~NV|}^Fo~Y~F+#F~%zEOWuYtGBi?@o{4F%L|+oO<6s){0Qb z8=o||9v`QCvq@7(2dR&9n=+$@>{TZ?Cw-_;zNtS^oR0nKLDKSkYtnSs3zY8bdl zSMV5Mi#5oPyZF;Qq}5jyz2U0Xm3_J=3E9AmCFO3Yqr*gg|*5RlfW?$H_BWH+qewlSDosnjWTY|6c8mixn z-}>*G1Ht0Dj#I2Fu7)PYf;7|#FB(i{c}9{E(Q}mV64RErhpHS~?8Ryw7u2SMF_ER7 z9Q+aspAhg86r7L&)nvt#pdJMhv`q>*t@r&WQ0Bp8xZI#Pe!DBDoZR3|~UnylS(!Ll) z8lPLoI+a{o@NuM!3}yKUsoTBAJf7YFS+r}jMvrvuo@_h^{KK!8*I{RuR~Q{MxP5z# zJQ|os-nLm`lBi--pA~i9l8|fKq86{lg#5-hVXWa#mc2&u`q1UB1ZGt&_ELTd9heQY zQDj(7zTs@o8a+&NmWe7d;dz`NCI7d_dN+RSib=K6PT}Xz8+#K8|K5)7|h+usk^%79mqL^r-v+T^$jjJx7uYv+D$ zBJ)wMcRXNN7Jlh!At))y|#A+D1gzl{!gGtagMsm&iS<>*M%Xu_h%5O2_t( zXNXMtfnq20mUjcCM+7s#6K^kj2s1kP9MTNA{Y48=hI!v2@iWNGABtYD8CqAR#uU^6 zI_HXy5eVc;vT?o*lXJ%dpRlAMwc>rh-CRaV4BH=|*BUi%5#kZ9PNXg(`ons?2P@;i*j1w>b5)&5GDnDgcX!t8N7Pm1wV zEB&s9yI9DryM{&Vp8o3icG6PrCvx_;%}{yglRTTV&%k?XOzgvJ2RRSCa^MHEBzO zO)r)d98~Pa;BQ~$)gy~f!~az9XLCf{br+q&W@>Q z#{5WND|39>JS8jL1J6{OD2m)^Ok*cpr^;2J_LH~vJ7p*>@!;wW$6g@A55>y!tj!Rd zDvOIrxikGp`c9&eXj>?Og}a>UIz_qfSYJb8iip;D>!}#1a0peA*LY#MF8XYaZ4_}91!1I*gy@*t&&G{JJgA%Q&xpT1YT7M?#velovUe2gSc<$PbIlEHy;q)i#1 z&r-pj^(q9i&`-;U-=JO6%;vedeTLX)o0)jj8%&@_w>JstqH{952amW^{(d5a-2BX2 zn+=8dlgH8#@o;(!KaWu(CR^eijO`hDl2Vyiombp0wfHx={PxEuMY3Y)j-#Ve@7Q(s z7VExA#_b1Vg-K7Vq+eoWhe-x{n!C}uS{rm%I?tAa@sxcm!jniv#%EV)*JSlpXt^eU z^n)d;V?WFFm=^OA`jpy(B=YWVX>A`oGk7p}`&_9log8G2*UuLbH-V9Kmmjo}_r1q5 zRtl8zyoQ!@C^%r1n%%BH34x3F9=7@h`zfDjU*lvALe61q<+f1J!#evs#eRVzZI$*3 zw*OZXpPh$MFagmY#QrL{196@QwFXKFF~d~X*82m-$T|k++dOBY#njeysN6&^MPm)Bv?^*ZiwrfdAacF zrp2Ao>V57WBVPN%_@3=o2^Gp_`Z8jb&)?7c5HH`+tR7lOzx=iuKUY`eV33ZXdil+W z@txqJ70@%bkrH^Va${Lf!o6m0@F*jQLPo?{kRF~@R0tO{^?QU8wfR$}eew&+VYiRO zZ1iP)T;;CBw8$k7-O@#n$x}9n4{Q3km0Np);eYss%mOCGoBMu(Do{VU9Aw_4&T+zS z$^tvW$YVAp`&18aO`#4PSs?kR#s^|C7K;l%R^6DP!|`=_QjfEPj2}E;IhB_Z*OaF) zz$AEr@TY?mPZfR1^V##_OCrwb(r@9C$yo3t1W7w?AMhCU6NEdFJ;)x8gpNHvqPJky zE~jiygqbC^9mUGX&xNhzc2&rSjM+!ET$U{`*)6DvAl@$7^YH9aDgVrf`B)jwudp#> zm>(9sNk=V-(UA2W=tN~zsSTnFw!bNP7`jkAs&Kk3vkbrvgc%{)yQ43mnS%%7o>(%v zsBwg;m;8*^+h*bW*H|$lT(L1c>_bA;bd+3q#WPXHDKqpr3Mp~%$fASt?y)5-8=sj? zvpixu>wp(*^|z!osSRf0rtVlQ=EYbcZwMKKQOtw1Mg%TGGVW$uD4b-GD>GgoX3n)& zNiS^TBFG-8z&5E+^+i9RnDhe-(oPn zd0BNko7R|?wfYK(@*Fq-pE&N3-rp4X(26zc@D9oSUlmTcpr;2NfjMb)Io-=v#BzOf zsb2&I?eb>m7~Xe|C-rO?H3bTtZrhU&inp9(O?{6ttEPQf&z4p}Td$BJy`Ihz_?rcL zaoj*u=(`m@$ka#j8An7+sx_(G zY?1focsvoKnIQ9rIlm!}jYcbf6N|hYX|L{j^4?;xY3l1P8i+g|nasW{g(G1TSwY^6 zs;0TDdeS3#SQLglEZgZ=F*Mv!^3<^@J<4(FGmJ$lsq{@&WGcC(@2hj6<44bT8BVP| z>c(NI#N2807h9=qwb$*9(aqW6968o@-|CIBM3HwP{HBfj|0+S!UUJ5?yQF3GgMHo7 zo6IQD{d2V}dUy~LBgM@}FCc2WCCIb)!tkr!9ptIKq)_D=J?MdVJ zm~-L9MUCOGOB8G8hcxVLtGM%Poo)9$`rYADCAu$WORvkJ!rl=r8g-##4A{F!Fro2i zt@KT`lKPaYNSsm|n5L8{vtBn)_;>XqBaa8MFr^bQke^C$ruJ}J*JbcpTxbR6)hu%$ z%dpfWFVG41!MeeLw=(PII8Ie@4=lPKC5#NU*p}9ywT#-AHEjo#H6)W)%3XFNZbQ@8 zjIzf{Davw?cddspzgH7cbiEs}v53PF$A=GSS*?CN!!o$7U;*nzXxjTU1*dqH000U! z*%tSGVVl45ndEfK35nc^y;KV2!^|`9r@<=g7r8U5iORPEIT+4H-INL`srtE1<+pR>*J`IP8wCX>~F-ib(DF9%%D}($H4H|AxdgrKYlUG zBUD5ql+%h6|2;tlL>0#N&4ZPmkcZ^k{tXO4=YssCxRkJ($f zeZ_I?nN*{`?{I>s9h+!M2JpkEcx>zq7j4=nDFmIMpQw`;OC5Q1oW~C@o=0;SQf+;#*(YB4wiKK$iX)j+moWX`RItw;7`{ zcoS7g^3;g3%PbwH{Eyf+4vyZ7pWjMKB;6-#c%K{f_o~ZOt7RrWXRF#5?1^9p=q{tN zBQ;#H48s!WNu#mgBce;97auJIg&t&~$x2HUBvlv9$dNnH}VE|kh7*#aCZ&rr~gN4&9%0=9BnunY&kjS5jw zAQ_Xp9XtBAV;ZdT1dJN>^YK^dn<4?WexatCbVnCr=NsvfD%JZ*0U1ydb$6$7^baq5 zHX<&zl%+ownpe5Vq7i2n)O2OtmUEl0IJ;?lc*P0Og;u{A=K8q20w2x}l`MWhjRod` ziUG<>ruO#+L&Rt!ZCGaEzO0E8Q^ZExMncz-69FB;jRFXP>zp4^z+sfu^OegjS+(_I zaY`g3cQOc6we<`tnETLCr~X9AYe+SA9~{8=LB( ztX>zsTr{EUHJb0fd3Ayy^2sfy;~Tgd^c01rv%*+IpTeSpg1XWZBT|ECz@h;HA)(_Z zinpl(dq5sUyb~ckeN4XgYOd}n(%`X^KI_}cz{F`H$=5YKv=w|?iiHt;99 zWrYI0Q`|L@o|7cx*FYyAk}&HxGxVkg4S~5+CqC@IHs8}-^0Mzh6t(d~Q$AW7rcF0?5%rfAi_d=+iAIU&qQ;YCK zs+evDgM!D>;e0!1*IvBPZMD&8{35RPsvSQe{^Z684vPMJ*qydm0-JAL7GOvoCj`>; zb4u)UxDiiQL-UjOep$*6@sz)jHW=jwkC-H}_nUD<$24laTz*LjCUn$`jXtW<4rHmT z?EU;3HrxiY!F@~{eSFnC9R6nl~vpt5(Pv_hk9rm>-M2-+Y^T}{@BE!k6T6#1Xl(P;=4*LA2ATPrq9SY~E) zZncq^;QBkS=V)BH}`7nOCxmxOtVL(_VC=|71kTxt7E8jFl`tW%M>9){0iO7j*G$0~} zl(m{6k3a`eWSIOU>U(|{)2GRMQXTHw9S+5m+ov?IxA;Y$s1P_AR`%-J?tmfnLoLH& z@>|eVA4kXR=}5V^3+9aF0}e+F&`$&s3$Jxus33c&dK7n$4zJkuV~wE)w*lMub3WlY zNJm>?Jt>I}*-1J>@J|3ih&bZf?L4z3^TPSoHf{_vCI?_X&d#oH2-qb>)hfMr-wVo! zp?MU|8$Fy4zib{t5kBALNoVfACu=DEqK4SK=ZHaDOUk;{C&yf*B$8J|GZ35t<*^cv ztab;93tJ2pDK`Lba)nAq2bNOCcGo0blFM8DfDr2eED*Bw#m_@O&48GG9V$CLD`iI0 zeLXgiXEob-d8M|!LhcviQN#Ng>phJbtfUewcJ_qA2LK1>K6s_u)`Ks9x2>d5zNUBJ z2{U1lCse?wE^pv>5Ui6Qb`{{a7rI?P_8fFSd1w2H=D2oJTrYjJ`Mi>D?1`WNk5=HG zJ`ViVPaL?DSgsUH=sN|exDxJ>Y};;vu!;y-p6ZtHKW@Ob`=B;*bUL1bcj|2;Swgk~ z&Btn{^d|nuh?;tXpnh*u#Ha2OzSlE=vU?N~EBqIN;`qpvoi-wv3Kj3xsJFLc581Hk`9;-)d`m;CI>3XEuJT)$v1-0#IrJ>ZlUDdSB6%#u8k9(+OjU_sfveU=Yncf$qwY8*1rYqlp`CSwGyRs58vsYcsH+<6;o2Fk58 zxF{D}XNUHy0L4Du4xwl!PN**Zx52p|;I`q;F!o`zoJj_o#%CjMxz_tk?+CKDS+50VCp=ZxIT!dgzAiQym(Nz1M$ru?SI@vB2S<2kbN5JHh*^hk9@n$U-VxQ# zvb2KUCNt`&5Stj2w__2kHzLe&yx4noVui7049{<#P<>D!c=07P#fERu(P3V{-d1nb zJ{gqS89DYl-8GYNJ&$|JdcB@bexMRcN5^(~&30Il5$r``jXb)9j$+xi$YV6uf-~gU zci`eA+)8gu_9(0Eb8zkl_Q*#}d@p64VEViaDJ^KREqaG{NfT)xFW*3~M@lBdg}1LV zDriNHx=h{oTT8NT-u>8|(I4-+R?M(kb7D1CI6Y~RDqL8^HL4)P*A?y13FM!!Y?>U~ z3iO(_EG)Y4OKSZ%=L7Rut_2Bqp^Y#14D&dO_wWZfuXQJXexyWu-plcQsW8XsBTAo= zWBUHnet}~h-yu4uvd=*G39Pr3`z~7?W7&K7nz?*qcUY5N`-1>1gAX~~lFqK~)?akS z5Abxe7cM`?kuKstwuzz$thosBj)VsDjaX8>&D4+amZNEUq4D&v{<~`6*KgcC){cN5 z$l7V*4|2;o@Hz8}&siRGJsV*}-QD|bxDi0%;X^a;2 zI5Hlvx$3BqZm=-cr$l`F_R$OoO5wSkRcUz-G4|;xfWZcBnVS(J*c7F@sdxBDZFp7Q zM4RK$2g2IX{$WuOK8Yg!wIXMvtUrz?Px*ZVE<9f+d`>^KK4HQhb-KklN{9SR9xwG$ zt>5^TYC@(v@GblBw;n-Bbp8t+l3~eaHk;yP-b5K_9KU58H=f&68+%xy4v6q#7(b0InXMA*!x{XDinJC+cDK}wp5

V`OW_0X77g_)-WQ`wl&bOM>{+ye23?;#v`wzl^v985)^ zRmAOMrjrX|!BAEr&;)|%#)o*m8dzpv$FVX885WtTH)X&h3d@vvcpl@|0aAGYV?VkD z9}_g#tfWI+`UCdn)c+Vd-ioQLKTdW$oVay}2eG)t48^1oo1^*tJJVH0M`M2;N6h8s zoP%6#b~&$}G`ntI=<-Ho72$lPLx&a5XC`889-lpR4ofCO?5)^EjC`+pWYqr% zz~!#$??_5utt7!sx<^-GjKiw22~$SLHST#D=i6V_G{@7JMngJ(0dsy*JxgC6Ib2F; zTv)lSj1ljkoyrRE0hT!Dbg}TrUL(11(r#f-a54_(h>EkD3m8ouV{tRALXcHd0`v_WqK)TyN+E3K=>6k2O`&z8=Fz*^N3t9 zeZmTHhMl3iRS0WW2y5T|aeWZ}Zq8>qiDGo~+_0lMZ`dG@I#s43dU z;&|}-LkhR4o21ktWADfS$BAtFg;Okh5u54U239+KIJiz8+Ni@+vE=;|7akw)wer2( zDGrZ+Vav_s)S_RG?=YTd%U)R-?;2|7Jgd~geLQW--&SVG^Rb+*kd=O_q}~=iM}9kO>e^AU zRaid3_v?x*p)nT^MwATEU7-x(Ko(iYcj$I)q1A~r{`Ripo!lTY#Q>AtA0>(JSr;}#>%)XV z0&*_VHS?(cLsC=8JoZ(M1WmPw0A`0cS+2ER)%AW(j`(nktHy4O`k5|lqyDPX^E7l= zJ|$tP_$gbSuM*~G)pdB&gQ`4m>`!8lWP#uB1$4Xd9G?%luLpU;lea>C`wrq5tjb`e zK#xQ?11j?L_hgM`%w@3dR#H_m2g7Bjp&c1LrPJQ5BSVabsU?>Dui;p2El?k8D&kMV5tlg9*Zt-%_#I^M{Q-=yH{269Uq#0nGZ3j zvl$yBeC1&9et!oy*;6+n=}ka_C2#M3(VF5H+a4qW#aV%v6P3`B&_mRM5+2Yfq(2~i zCj6JVR1J%rZPId8Tm`Lqdr12y$oGcQh6rol(31w^^KU!Ypun`rQnKEobIR4n^G{}~ z02CV!qjiNN=DPe_a#nbD-m7n?^)G1ZH})0>IZQ)Rd>Z64`dao4#HRo>RcO*9+LoGO z#Tmw&os>vZgy1(D5Fx5uK)$Gm3>oLpSdr`=p1^G|1PZ0Rxb|Pfid0@L;(KC&Wn-`$ zi4>aX7SV3*0!KhTArxOrm`HqhC)bAGQ9=XT1j4&YEP}Gl$|ZoS@nms2AYMHZ)N9u_ znrmYTutoP%iRGjoQuM={ms0vXohz~Vk972V%SbMWJaN2*A^(@5zuQWhPX)CyJ=95037B$&+CcL@@$Cx3HzOzaQ@`A@3 zR>Y^UX{i))(+%+0{I(!;^^0zcN%Jiu?|698hgSsmC>x9;uyo!~gz%+=1D@s})`zhn zt_O^ZxT~IK(^!g09xbK)$`&2ZqrXcqj{qY2~_ ze8a?vKe3OHqPN66UYItn&UPV>m;Tace$hipYc03})BV2NeU}zp+@!hug=gli|2C&2 zin6-(QKtBgvt?S(SAaSuxC9M{n%W8Ov1<$@m_$gt`~X2g9{fw%OWzx)}Amjz~om8INq3adP= zv|oprw8+RkG@xCgdF{DIp13S%CQ?dZkd#~%SRhq2tGtf9QN&y@bj#%6>7{N zomil2WGx_0LR$2RA{Q+ymv8(b>+08*`wZ$WXIVY`j4>H|Nby5#LnMm9LGv)Sw3D6u z_w;me(%xBaQuvC9n;NBPPOaNs4&D>m#xV~{jCu2m?JJn@TJ320%IhE9?p2eryEAuk zuTKnLeH=Ej&vYcoVt4aefyuK45qsIVP=uXagZXeGGg`C-Lq^n|CR48UiqdDVqxviWuo^4>_YwJp0p7_K$JGw8)yz-lhI#nP zgE!z&m&7_+$PD%jr41tdqE!5jyx`4*SVJntXXaHimwgTTWwP;K_K0%F`Hy+6TRYfO z)s&T@uolR%)| zMhA&n$=J&)5DCWLbjawxmf>Tn7k+^t7-Q`GBKw0HJjq{O7iW5pVPX9VZyJAvw*qvd z9S656U7)2@#r_bC5TRgy&* z{P|$Y7(#t4^7zG@%D{#upN$@BfDlqI{zJP$MKo~l{g-A>LFn_a9gFvP7*0bcRg7w7 z$)t1yihf_3NdikNYm4i?d=8-7DF@HlUdm=AS7q`rcA#>}WRLjo1GFW?eXqP;xPGzt z^AmNZApFRTlR6=?v8(TD&hNcKNv?lc4|^A)nPdhC-a5-med{V^6}(`leWNFl5qyrJ zncWpMQSci_HHS*M#j{tSxm3B0Uc#NDjvFLr=`4ohB58%rmWH7LLGNKFaeNa8$)CA& z4WkJ@J!6N;oy;DKXlSs{CMW)@b`V+O^I31J42Stz?g{YvdN#Y}a&#kJ410dwEXl-I z*>autkss$C{uiEEj#)_q3E1Uq#KAd6x_Z`4o%fB{Qt1qZ7lG3K{hm!xUsoBfJbf&9 z;>o$lJDAuv^@7aj>u{YRMcD}tC&w+^^phkHMR_&xYv&UiRcswA2UpeLH->E>0DP^9k=8;;qsYbRJvn zA#d-TbIQ2qOexh822%c)U%%7%i*RWmWvH?Nm$Pcql%XG)$T*f{$8yS%8%(K{8lQNyY)mgaDow)MmErANQ_|JUh?kh{W zq7+vLye{%yX%ffld1RUdd<6Wl@^qDLY=xH?UBeo_i3cC!aIeekT937EnFJaz4-tw3 z2k0p`q?emGXpWX7`Z_^21zcz6r5?YuHjwv`>MuOiUOCJP zFhKd4C?j$4UQTMmZ#HSnTV`nSsOLtpKg=tJ!E8asSo|F5ezJfd11`Rj@TzjhMu~-eYvyZ#o?bZ^06kr)T)?=VoQaO?upM!5$M9z*+K3} z6I3vBENbCWW={;Afh2=T_giRW%&v+tn68_#j`1nf%9mC-b0m;uEuTNg67mA{3!^dj z)jJU*c#26zrAo+pS=1L>O$iOg!pf7=(8rc|@ec@-Njf`%!AKdfWAI5%Rb^USpa{jhXlK2Bdl7 zGZ;v59ZlHK$c*5*p!fc5g+XmXJw{j$zqO?|*BOkcD8^=4b-PtjMBNujoZe`9@Xn!` zzJu`a65Y~tCY^?tG=W%_I^CBc**W9P5rNBEyiQuQ3i*SQ7WlNxiiIw^N7PTqaK2+OOoWTpsnX^J;zx&$;FUCbAV2AivN5}HJ0CR%>Q zBo_24?z-70XHWYGNof)h<3fOD&4bReF*&?gW-c&KWwAkB6_Z{|Af4X@)gCHH%%}D^ z{jH~|hgQ86vALGt+5JJ2C&ZgXp~g@IS;AOX?L!G1e(jXEj1bct{va68O0vQ+n1imAtFe#MC8NFsw&96QAQV#oECk;NHJC9 zWCT@1$2(S*VdktqJmqMQ1V^o-zpVIV7PnG!KkIb{1rNC6Qws-#RIG_CN=vnbE^Ro( z)UXCP$QEd>Kb}XwT>sFssMwyW@+>|kU){EuAUix1AMHYFc4%*}a)T~(z*=K@kf za{QPOQ0Mr%2E2lHQUmtmxvo$MZ_Wv^Q z-PziCq(+}}Q&X(2Ul%RN^-H#LqF5Q@nxq!;{_>u&d;y>78_DLeZ4HOesT*~9k$5R4=A2M8|w3kU`VZ6C&pSH@mhqFzm+yMD3vCP+3yHLjXB2JR?&gsPWFe9R7g6x_@2&1<$% z3INv7Gyp`KX`Q0)z4>+!H6>N|hS)=xww9QGpKCqT%WmllD!;Aw2KRAd<8^ZR73UZB zG*lx}%`A45_9G7H=Eapzit~_a(G#_wca4k~6Lv)AWRiEDr|9PFHyL1LhT%5xlju_GTbW2&29XY{#n()9NNco`omv-WVMaW~FZJ*#gF%%#{pT;=Pxi~{a~vm0lU=1b)frD?9R z$E;}&!%@qzr33O=a0>TmD2JguMv4R4_bDw|FsQ&Ki{#WkvUvi`Wp#|Fm zMh>hP1TW!Fv&hS=!v?ZM>#|L9-cYECYQ^e<*~K{gMq>=)roFcnY6ebJpSsY3avo9-QzQB{km+na#4NQJTl8)K zRITnxzI`u1|L}GZd(&~SMOGpn3)OoT64F}y#3?K`!v&F)4Kl%79@~;p2QtKN+de=(G%RkJ$M1jp66#fP&4$$x@%hL;_XQYF@j!!Y9q5D%|2= zTZ9UxM*WLIJ)9o+eUUm>_}B1F2o9X0t;Y&D3x7-g-v7pd1|+JSXulv|^#HZlWqIt) zXhLxn*xVPLqSy0%MY0EpNE1vGz>SN^P>FpA!3K0=U9~C|7@fDY$c^{U!&K=D&#d9w z92*x_pK1GyZKES83wICKKJ{9WYEnSZ_MJ2t)6jvCfdMSJ!S|Q!kQ;34(f4z zK?h`Jh5s5<`fGgg|FBm}(Mc>i1&(~YwuYRFz}v?jJS>#J={ZJaPQ5E8;dOUe#n55blk+hggl|U-wM2@QRy~-W%V1s`P87b?(ke@xy~)kq z(dPPlJ{)K}B~A5Ro;vO3~egPHHMPB9`sTG4X9noEfD?_WpB$z+T9iF}R2_x(OF)#Lv)#__*fO_kn% z9%HIBkUbzSkN}be#s>-q*KzunF&@%CzF(0m$-OMdeH$ClvHo9zozg=?mlyv^(*H{# z*yIu529@{07=Z9HKqK_>T~(Jt)x&;gQVVE1{k7W?nr{{#c^? zUxc{-^>n!bCFMUa5smrhB*gvy+@=4pc`DL-brmQ*K)L!aJ?Z~73YgaYoBI;u5xXDk zQ>psD9GHGvpveB)_4q-2{{WpPe*v9<7!gu<$#dj?%SQkw7>cLr;_XMZ4{%s7uu#nVrwM$w@XwZ{W&nPs;}G6?~oomxV!Tu5zzn7cfsvupu8iS zn1DyQmnZ74(p)THuui`VM;gP-PkB!D8D9c#6#rLTbQHJ-S>mAi!YcLKyOjlx1L@ZX z26r&oOjDQIYLbYl*GC>F(v2P)Lm7g@8RQ!X^Pzg`HG&D}QHj1F87uG)V0?Rco{zyPU`CyA^d98S>;SzLF^^wMNju)=H?`S9?AP6 z%l-XXN~TlOf6a0*gs^v@aC&NqDqM;U=; z>#LuGQG@3s5=J}W!XHXGRUpz2!D9dXsHyt4C%$=z7X9F_Pg@L)n9)uo^M}$$w&4}d z4|?;_KoFa@iqwDJmM?N@=z|Y7oPHZd|5)l05f$)t+gL^jxqZ&RzW$*UljwEa-`45$%&m;50fL_36p+Nx9eRiK_{#@($85@o%)`Yz!hWk^cRb zYF`(rU#TMW1nZyIjA3%o;eAvmE;eV=dMu`Wm!;7wm z5)DbMp*3pcbS;1k1JL-1i(FK_ZcDrN;Da5Xq;2E3+=EBGGkL6g*-*5aN<$rIy zWKE|))U@!mXRCb?)lCW^y?^!no_w1k#_$uXTY@I z-Q1R@CYUFnNG)RBm?&MaXAZNRVScbt%pi`$K;GWo2D8=m_~KGf(1pr7AUg)4jgOBj zhL8k8ag9IF>S$$H&HAJxH9M zW(bW8wQ}BQLjr7wOB4xR&(#qyF<(;PQOWTr>!wvmo9s>Pv>vAqS`gIU2%a5#uK(Ln zMZ&AV>zUN-b>wAB$dMR6fv05wF^@K`z=FhZgR;x#ojds7MY*4l3M`778|k54{6 zotb83kr!}POv25%mebZwUI~zdG8=pqKR+0ZY4^vIG|A7UQ)sM_BIYh@b=pkc{#rgc zUQtt{f9pD|*A*>jRulK4T)3GVvsEjS`}&=q&`D2l*R;p^7Biu~yGF4PHdccv-mjl= zAF3cDGArJ0H*EQea&mJ0WDK&VIBohyLuzzc92${nFMqfVi{2mbAI|`bSN?ovtcQ-E z)R}I{si>76+YFinLn_Vo3W`OJa>XeYtpiUL?1XpJxCMwI|K{xMrBLHF{cGMwZ9OW1=V0Bl zS%2N9Zq}@rsNJ|H#1J~GV~j}u{i&ih;~WI{Yd;V9EW9pQR#cQIyYHcQDAwN@7t|Yw zA5;UQ+j(u51Qe#E8~pCO54I-iPK+`fE3T~}FQ369aElgiCtp$*}=j5!;VbJp< zLQCbAi0*x`ZPkA}QF&`TxFe7E3&0YI&D(o))6h)0|7m)@Zy!e2R=@UPOW;nx%f92c zo}P&%%Gj*4aeSjO{lxXjVaM+hY(gU3icMlmPtJy1d8n2Dsu^Kli}1` zXNM@iA3IL<)V*arsgZpfGFn<%ns9RsrIpR09(;I-gf^Op{$Xz?(GtU9!}$D9CGimd;jv-rP9;3{R?y_@B!|jht`uSoAXt#l4q98{%yTtoOshQ z)v_&!nrR~Ox^bnH@d8sBeYNQ)2Q-XRwYL;^2Oj?1cWOAo9_ujtCJjmu_pv#XldCPl zt_HBD_+mT0{sV!}{m-qL`l5DTsdxQ9l)ZIOoa?eZ9DxuZ1PPGf?iM`32?Pxe!QB}o zxI?hu?w+8*Ei*U-x8N{?4++iy6J)SKzG3fk?%w-+w|;eQ75`H8&iiz)UcI{4^Y#r4 zUhpz0GAUu(bBv_hCyk5inP}1gw^gder4~Hp>I7_O?{eklL~V}Je{*0M-#EZ3ZExOP zl}dewmiHvUgFVFr8*Fk0nIl)76Oj2DApA$wb>AbngYvV#K{@d8V!U<${e|TP0SPh9 z*3*1eHT*;Y>)!ugk*j5TsRC(O&N9qzw%+}yQ6y!Cf$Sgs7S=7`wQ3#MAx(T;JGNcx z*~#g$(#LeEq-LP2%P}r~7`eVdNb10(M8dhogmX&zxCkzF*1-TIjU^)>rA;^Rj&d8d zhtKw-6!XfydaoOw#f~2yRfnnFr`zMCsMEC$U?-pSG5q;6d4<&>K8(P=i*)aXH2dM7 zhge$c-XB>NXNXG1gU!6Z)xJl6)IKqE@qt$%_=Xt6pT{^nt60c>R5Jb@=I;~O(4b+B zL~Vo+8Iu$a*+UE&PxI#9$egadWVR2qaBhNAUY(Jt8@;D8^xXiKD$3^D=m2gj(wq`i zptoILcc(imXgsSH6ZI|{a5u@cZbGYp4j%72M2@#*Wwg$Wa@Pw+R6vf7|2it&KD}|V z+>KyG6`{+JRs2Qrpc-qANeo3WY9CdyLv5Odj_!M%YA}aR$g;6H3RD+ge7W2w1dY9_ zo2~n^9BKTm98uek0s%d5y4SlWr|Cu5mp1Knl>SMmBp$>*%V_nEv>#b<;LG7YdJq{G z;pkUdI2YV4@T#_=ynG|*)^~K9ou5N3z~lJ!ePNJ7U2oB==AWSBwuR1{?(}-8X+|l# zrK43CuerVlrIqwMx;r{-n{pOj;H7C3b}bz zXHklmys~^kSC6kkcwE_y$1`EmR_`^(`C6;+kLGXRrWSz|Q#^L$r)24}TiuSSBJD-* zjrlL{Qq(()7_o4&Cl?f`V`_or)N<4E*!?j)k`F|MNkyuVKSeheVv1xgZKX8|_hu21 zp76n>W#NVxL{y!lv$=WqxnT98?OuFcDIjpR<>{|#sq4=*^+_&;R44ovUR?4Dae@ni zrx-bt<6{1!3;7i=mT*{yb1(*4LNytT4ao)u@Fvubj&LNUDheusgG5*cxroc2N$wt; z_rBN>{G9EwQ+^d!ozerWb)Tl}YF=xLjvkJ2TgxalE%YICg~4;w8VxiO($n6{X}T4~ z2vz4#KG|w=Mcy}8K7$W&gG+lw+;-A9ABLaQ!iFnW_A?aRR^IPz?Bmpo0Oz^Jk5z!$M!2|cXFxjfTW)7G|LlEU5AgPy~?9$xtP z%P58`m-Pp>vZ^ovwrOXt%PsX|0QVrTH+hvIEPcSdva<+DDPIN66hWpXY>?Bu^%Lx~ z(0zRvl#a-)bPQp;Pv@RLX^upa`GmCe?BlY7cD!moU5d5Gx$?J4+1sZSZHwAX)aLor zz-Cr6tlnybRxJXS5AvdrkUYbtQcAu9Zm-AXiV(M*;52IPP9YNxo_tDpQ;2TZG z9L8<(x1uA0H`fQ1TM>t!PiB$sdPs{k|Igxp_l^~vxPZd@A+2PtWM4%a6TeR~-Zdky z{>DmoxNwO`0Q!u%R(&a)!;$Lgd0Xk(J8u7&Um%A~Cs-gsXOYk!|b( zlTEGC^HgLkrv6~Fiuk!CxN^?!=?I)Hl=xgSfg-lv^GxzWq9(TcieRyaLfrc+dEhVA z&c*zIb*Uk>pr^0Bdbq}t5tkD8s`(9iZm=v)Nu~!X&ZABn=f4W)a7%`YpUn-(h_CTk zUSj$v)#$eyiUoM)VNL0cb35IRSmpsJASe1YKLjjFOM^CWELhcn1LYt5eh#U`a;)Cx zWM+KWHh_4gV`=m`7z4}5`_#1%vx6($(7znI`9e_VSL+89=R>w1)Y4HJolEoLYEmX? z-3W!W32nr1f3i4jq;L;IXXrnq2JU0^l6ENKRePX6KrV8nk>aY&0lPwQHQYs{WKT}{ zx*k%hK2M~vN044TqH4cStpaZ*6tx?B~eO=v70h_XbbThn@A_2IMxR3oomisoATWs#C zOG*rP`M5-L#|8T*zNyP`4VTStc-m-nC1X&b465IuutRl@OU(8Z67{xIQ(^lZ!Tv{x z%S$)QXTI@i2e!EmW1+ME(cRIn=6nZWizn?aknW_eDE1@B;eG>!6G^BFlR)!0q5lQ? zq@O>3_e)jXs(M)R*(QmSp9Zbd#9-4IG{@ZjnCP9(B5`6!M2rKJMwgB&S+t&U;_%8r zc&eK?(U$6K3}4~M%SV+1*kYKGbxHZ!>~dT7#1R=I)vrfk;Z`u*i-_uAk+@Blo-Bm77?&Bsq0sE?kASL#Q*zdPp^ zl__)?jaV#+8)CIrndFwTr=i6)!^R)9B^`}CeiKR^kRsa!s&En+nX{sJzOp9dhn#id z%X&FJ7Yd3HQ?^Z~jvyW#( zj*y6q5PB8VGH25EXQLW)pXDs{#NjQ2mqSOP>j;{BJ`mHN!fmjTIkdC^Ljq&IC>?aY$(}*r~>5oXZ zn)cttdoyr{&*8e2fREY!t1Vsr_tikU$YYVon24*e(2%(!j`KJvJN+$kmv2&~ge+4w zK1;5Z-DLPB33eTcU5d{g61c>5*LNt7<9+esVh63H+s$H~2@R~LxrDkRj0U!P@GIw_ zjZOQwX9|AC`13IYB`zco9@^NhXOjz7J6|RtTV>x6v2C8T_PA$yjVl@$Pj;#eU?OKP zmhwO34|G0n`ZS8c{K4>Do>2F>^6E;&g`@{sgx3%5gD|V1y-79B4wv$aNf_coe?U{W z$4I|uy);8LP-5;E^ue(y&QhRb^L6l}W3%OfOZa2T`tLo&?DP{;k5%Vdvhn{J?hEYz zi}`BH{_SzHFDk}wuQQB#HdFo=QbllXwr}uSHG_ktj>V-vftSo7kdI7tj#6nsoDw^+ z3a^B@Lmhni@IrTss%8h!iaixa%R|^bsz*(daC$h?5QqI@$9j3dFR&=AN^8?3XPVEh z94Z0VY>TiDR(;tgDX#R^?;wmRL+V5!(*8ZI*{=PDnIYW^7XHquK?Yu0Y#su&5jlKR zjOB@)bH%=y0x{!h$qnqWv8Mw_7r4ZXY$EPQWEfxF(ALbVtja`phQ^ICgR&K?b@(KG?^-g854|%p_#0-HKr*PM}Fui#d#%pqgNR5 z5K|u}Ag3nBI*11ddKId}XLGR`Itw!OZkH+9@Q9kP@K|g7u_$ z;nmAs060o&!)AgBgPV??kH+xzMchbrA)H5*tZlP?(gU>nMJNt3D!Ykssi-dr@xM)G zQBtTsN+RFMr145fLquXgkNx7Q8-9zvxioK(Sn&VyfB+X=Ct7Rn7fp0H+;>qDtz%)gSlF;ku%UP_UbNjh(M&G5VL=QJ9gSg`_>Ke`8 z=TBE@o*#E$Vn*8-R@n6E1#tAOq&pn1y1F{O883K{=VNfd4><$3jrjEW zPQ>k8S~8h*hmeo8O8Bjq$J8bdI$(H z@w=@&(|p+v3_}W2ev$)YX#WWIU2OGnDtmqM8*A5Dj44OtjZEymwI9_eD0&OP2dlia zc|T+533IFIQ1xsw9{^fBS`{w>%&qxGglm3aZ!qz*0%5=&;-9b3#PVQujQF3>aQPV@ zendZD;u1rYC3cW5j<}}b=p@Iu``pN9E`dX%} z7!TN5dJ%vZR{m?4T?hAYc1ui9YynfHVLzM8-=WeedfaMP!Bzj|z&cyGUl`E)T^nup z-q3BklXT*ng`i|0wH|C=+nP)(2%Pu!As~f)syU8aqtl8Fq+49+Brb=KOf3nN36c(- zIMJqFrSe~;Fn?AwKkoQ?z__8OI%F>BMIUJbo@m78TTi$OPk6ZE@zovGAI-pf4XrfW{@y=3EiNGl&IF$xY)-&OVjsl0YbiE?mCv^@wP z^e%$S1cmlKB)J)GH0DS~ht?d9kneLd`Z>AQ!{|P$%zTxHk$wh?9a4Dh{=^kYta@$~ zP=7Lk@$5%1lJ%g5IU)-KLzt!I-Qv%#Cxjw?AKJxMgWyD1v}O7JCvm*>zQ|*_h zrBpW)uH(%Y5Z*S*Z{Njqwode8Z)EDCuLK2zuGYSZ1A6PlC+#S!)u*?A8N|AO1rp#= zQ>)LigE1ofkeFcLfv-wfx7?i#;(Ep067ZNzc3ak!%#uQu1KHr`8G+ zJU4oCfE=j!B=@QIt#oCl84+mHlN4I>tn{f3Hmv)(BbMf!=x7!Tw71hl)Wun75-BrpbnD3tXyh0dVf$I zzZp~;*5tqvhLR`7(7>JRw|GZZY87;GAM`+Y3 z#Zv4aI2fKn`Kl<~!T7!DL-`mRtp*9V3|eyhp&)Sex8XS6@$A)EfeiC{Ed8sGfmKmT z&x>ZX4347CK*yE9)@2_H+<3iO1&oz)$-`=c&ky{wh-&KmHO zfk6A(zL+?S8?|&)8wR}#-0Ot|<9L4bM3J&67phJs{PBY9V%N#x1Q);PjLo9zF8-l0TSYc45=fp*1{`%9a zv^X5YwQBzB-x_j?^F@=oiQjyE*%^S-#a1n9C}i8K`8ikHcw zoUf0#lw_34V_oP`q|BolF~X`nvaX#);{3#gB?D_x{0ytz-~4QiqyR_(&gN6sIh{J0 zV$aT8&a~2Wz?$hjK-5nEr9h)Fex;Q@Q;qUvLv@IlB!n%`YpV96 z;hG55)me7GA1$nBw6o)TvYk*uEe;sy*dB-;rP?R2W9jpmKXDS=a$4i`&8xOQZtXLl z*4&%VbjK2(5$#pDP8YsS*aQ62tA(9p0p5AqSbp}_G(l-^?uJwERR2c}e1@e@_VPbr z%Vzp+hNc3Kx_DjhX@hfh56i+2;Vzm`$&5w&^2xq z!?R&7($Ezd=YZTmJn!HWD{v|@cO$U$EehqZ81wgRw;Oya?R#@Mo}MM;a8!W^_bZa> zKo7Ut*=n7K*^@lx@8bl~5Lntn9sQ=9rW-NBUc;TFlqjaaQYql(Fy z&G_q95Aq4OapM;ptrj4Ndps|P??oWCF3{oF$h=VN(IWy7khDDlNYpjN9`WR$d_cOz zNLrURx2#jM#0rJ;9pwN?xX?FZz77ri0Ch|K`0#B->88T-v0SY=JlJvZqA?^` z_#ay;aa2QINDGCwbRG>iSx$SoLn8`^-3fnwTe}jW z-Y)|~P|3|bf}wh!E$7=Nb*iH}HgF)EbY$h@1#c(3qgz17TyS7s(=-}+Qrxm)|JlW) zQ_SSZ>-r&MEld-gXjZwmw-XwUKYQ>}s<3%)xH6u2Fp2@el1O9Xq!o!rL}UtC`r24R*xwSn z=~E|1(Q>USUE+jcSxi)~GR<1(2GJb3vA_f2P%X>)oH@K$j&``gDhSA*K>*ZpWUek? z8170JG*tV!j~7V|u?Y(Z#jm8=B*9sUZreSLXau0xA@ma>n|JR`0ZK!=!jFy{a%+JK zL=6raMpdv+sBqYRhCc}PtJ6$aSu_r+42#(oe5vsWaKch_oydBpYpe=+Xw-su=)dY# zcAusPw)G02b1q;IfKWJriiCE4@Df715{9L(frbPCz`Bru6DIqS5!M*D%Jb@TS10f*)Bg|SEzAjoO2J^7}R zofI|>Jsshnn!6Gl_HjB)J??4&XS?J(Mb!eUNl?-qs-`3xYlQ88{vvu3h<$bbIeb1I zUcv9ss8v*$i}1BKRQTSA8^9QpCUJ)a?Ef7WH~~;u%8Jy4ICF58$3K-Jqzxqpr#I+h zPZsgXYFv(qe^X`#SM|1hi%pG(W-|f!cnHzUglX_p#U_2EV1tfsN0Wolx{^_3zcnS3~q7$FG~b&h|ZTlLBtF1K%g855tpu z{2|qqaaEkq2oi+SA-HKB)Dj8=w5ZDKi0ykqh$1XjfOI1fR^J>4e3zzGUU@ft>~wOb z)$u>WJeijdbZR?KO%!^iDjo#N71y|+@R4Ks1L#*$kbbo&2GQ^6VqacMQF^Ptie~5v zstdLx6q|lR!Q26u$-@23cS-@+d$FYaKsE$5e-s}6Ydja)4Sw|GKU=H?K2&a>O)sM6 zW2}bphrFpks~IcE0R`HQ_vi^Qc2YuZ#IO4Sgh*dg0x7)EfdP0S3`N^!GSM z*0G4M7e1_LI#G&z^7Cj60QK4|PREM8AHs{1xlJ~EhEkb$oW@wq-&IM@IjTBe-jKP* z96lvkQH;wMnel?3s1%hD#KlGOWC;_2z#WQ;!1`#d6yMHz(uih1sAsK8RRre$vQ;MW#)P#3bgfe`WI{1$TSHRwA{^2rGw5lq|=i z`}>--Ff+F{EXNPgJRU3Hbq@_U__Iz8zc6={FVy_j8`AW&68GT?iu0>FER9xoM}Ln) zA1eSK^mg_RIKmN@PzkU)Vn#7E=c_>U)S9Rikhg9U#<_6E*?_4Rs` z&2Wdc`;n-5*U@zLm_XKQ9G_FbbIp+ zxhm6Ws)WNe_bM4Np+xEz){e?w_TEc|CV|Ctd0J*lV;qNZFXjXjYW)ouT!Mxz2%$51 zGQ}GzC@1;rdGw=`9x77niPAvr*YID@IIO3?H9Ce?As*{&5#vWD$XKb|E1kR2<-%%DgJ$@@^-C)}d>@>2up+q1N4@m4LmLbbh6 z4v;9K6E_CVh_*7?nP*z0BsjfKi^HS-BHT{T0%~Ts1~#542e$L`5W|+t+7~6z6Wd|h z@RwQAu%^phL|pxLxI3w+@$Ki4KS^yrDI(~GTyy@mQX!Bquq^-KezZd?;y${FL5Qya z)`1~pJLDnwmvpV(qTuO@eBcOQ@MW|V{)|RRY}#Z1Z6KL&T(jtZX0BaJ?X0)+c_&UK zE}emU`^uJ3Nrb!6htZ!4<|s1u?hb(W{#yVh07bC-U;f06A*@OO%CXHCYJaLo7Azd2 z7RjwNMgE|p!jdK%E+!qFE7nKK#NY9*r&lR1gQJ{${dhLl3a$y@h?hkZ6sW$it_+ov z<`}}J`XvAtu@ksptXSgBIT&h0uLGE^_B$Utt9P9BFn0w+)S?zAX63pdF>X~6r0oab zo%?j?&SnYa3I5D@Tv`X3x2g-C?@}wO#e1sD zV3*C%O2Q&Enb(LPYi{iumzt{{6lQzJPk{qIQ$1RHs7(IXVb`tfNo5tx#cazKIs4r6 zHaFBK-l9a2eunLsOeV~F^eYtzj*NxfXa02jp}1}TN=v^TtyCh%!v{)}2Ax)d zo4Cg>zUt8Vg~#nVSa3=BKDLRlNkNUK>Drw?!(T1vPRpO|P3v+tozQE-Jk3i#iVsiV zw~Ih=3cI&dFli~^{v#Sl?8?`a6gwAt(zQOM!d`1d;;{B*+ZlvkY!fFN2jm_07nyP+ z-lHYfNB&f9C=KE-pjMtwBm_mQ_X{DIt$Hun#seHhUVdmAd781d#fC}#2Vr{r*C77? zMZKL+YclYTn<{E0#^L7YdDPdBJY4;M8T-}C(b)*RKw=Qk*?ctrHOCy`(|YrK`r)u# z;g_4bo3DY3RGgDQk)Bbd@M}Az$rzjYkwBqQkV+BBTY9Rg?KcE}5RFY$pOuoUg!qSZ zn2VxW)n^;lRwU-NC8;NZ%tcY3+A5f9_yigsnMMcE;+zdzX2){pSHhmgW7QtKTwf`~ zZ39$pU^lys>_7KHbD}myo>nx(0!5q?*lL8Oggg}Zxcs1l7i=eEcdVxC-p_8)Ce;Dn#$+_TSL>qr|Oi&i%5egpEE0r_5RB2(P5Efvev# z-fKWnyNHB<^_#}naMerPgKAiohd^AIe;}$io8lbxZP%W8{ycpLh=`l9EdnBbV%r~U zgB<3WoH|ZY>o9ROmWtF`t$Z8<_p8oyrIY9i$k8F+HApS<^7SqJP7UGHU%y>-om~xu zuLw?&7m~hdNzbDiE}#OF0u0x#smNAI(3aWN9me;f|5LeDfOBFkef} zy;V0vWN4xPVDj7p7=F^qbgV8^L0PVj80(=k#KPhZ}Kukb+##rx13Bg>W>~v1K zN$810@ANz`qeAC>9Q2o9xU?oo!KNzdGk35vxx8t#oJ^%TprrRLJ-K>HmYV+NE9$4> z-nSUKg@FBnlkHrZ=SBj3OYC<%TX-H*KW2?4_K9@Yi-eL{XjXSZe*{+8D*p%z>7igZ zK{H7u_m@EFX4*b>1#>e>2cy74#rZmS@s(kqxHtqx9u=jqF@ymX>{YX{2(2!CtxQEa z$hUBLQzyfxUr0E~nNa&SbYIYzoxi2$a+sGdYRLdLb@l?xm#3rg+-!o~n{`&~dKKfi z@C4#aI}A~(%fq&KhSth*Rdp?CB)PDr_nrSkkHc1^`~EKzOnq|R7v^?RwWH%~NlaP> zYXLz#%8)v-pA$l0nZ7ULP`~DP#A8*)t>8*rdi%-Eo<{x!KZJ)=sOMBTmxqHmb#80P zh$SS)%Ht=(E&$_@`rZ_?An`_2E>zXD)v%8Pi}sN-t^}zSwBBsTDiiV3uTV&Ub0LDh zQOu@ZjmpRyKGDPW>Y&VLoJ6Fu)Jaf1!Pwq!{A|BW#WIHPhunaDnt#@>^FArt9p_ks z0$j55R^!j2b06`eIx(K5u`f{@+xmP+iDbe_#$^cT zBR7SP#oqa>p64z+8Rl3ewS79B+3jxvG8(X)VuP8TB4(dvCB671u08IWS(3k8IEm7!721DU zPq+12Qk!CbiIuBSS9%!z0H5z2$(>|_XEQrHn^aiV46zfkb&b_Dh);)czkJj{K3Bsc zMpdJ77}=uM(!V*>0xro8zCaC*a7FMZGZtyG`iTb=C*ki=TTV31_;qm@n5tLu!zNgZ zCNX6!-Naib%aD;+7!_RY_o|#=ti3YC-5+;vgqwDEly5_d59|5abHYIO7@Y7M9r!aV z|IhCAqrie}o>H&Xjo0mzKfaCWsCb}uRr=d$m1`>6mfq+#xMU|<&6D?prK=ofqipc1 z4;N@3G-^XRr@m-J$)u!{n7Nci@gD1aH0kmD-g3j;e>m)F?A5{4MD>JZW!mdA+8NWb zy$F4SbUAK#i^JsNAc zXM%Ml(;&hNH=8jDvh@lwBq_n2^gjFf5evoC$RRE6DXVxbJJj z79zp>H!J#Y-_>f+W)DbdPG~m}`xe#f!jVzV`4#vk%f22*3o|JwImMjXG@7uz#+F{! zL8%JD?I#{X34zK5MWrN{L`ahHqT9b5Ahb7)c7B6JjRmSZmevHnGlb8vme&TN{&644 zfB9Q0RX5@Xpi)97r^Xh5|Js40ix9NkC}wu#D{0|l-p6VA;boY^%l;XZNMlaRaQZy! zsEP4A|5JP+Hw&uVo=dk`$GlC zTHex}n-^#e896g%1-du>C|@ulPNrqe`SN>MXRzz-d%8#(S~51l*7%6{h8_9Ch#V)x7rqQe;+FJ~`MUt6wG+QEgYiSU^ZUr1oc!xJiD z`T1aKy#{X6XffO~BqYVx?vH18^@&5XEE6lBmy(>R>LM;*SCcRPfZP*GMu zV#GI5s>4YLhm6Dx0y0m;nx92FL!q6;zvVtI(s^=))+u#d6O$Gj7Q&TNHOHlap(}Vc`rv2u zNxx1F@h?HuVXLK@gij<>1nN_bp`oATxcqea|<6|E6f6cK=m(W zyu)mEd>5Kudk19XEPCT@m4BG7Vwzpy>Jb0K@If84dS@~juS12+nf11xid=nnu)1ML z!xCQjKA#VVW|$;^Rjv#hKa8(ePCGk=9Lj!s%T#cV@&@3fv6My1w3r9hKPXGWK2|I$ z92N_N6@VU{zS4e)tHF|6S%7sk25oM6oo<&Zjy_!awYFD>jQGJTPO*MGvmogVZ*~p8 zOGTg^$oV+RnP!x;g9}r>E-5K#Ra?1rXK`O_l$%kmh{sTy*J!I(ukwKhYRgRl@~()b zkqZoT;+p+xKWH3?Zkvh!Gb-Y?C-zE8+Aa;tTDqlV*F72l8RFk?GSJ~AspkXWR=%3zkG-CB@r+N(P(Envk!RhRr?=?7BdCnOO3&+j0La z=`c-sABAt#WvW~bhvG}Wr42CiPAjkz=Q3>k3%#Z6kj`8Y;F&NT!v!jR584^o3G6G7DgF zoQ!m1=KN8kuak|5JQjlzk&m&H$8778KC4hGJifG``RB6t2PxD$!vS9Uqvj$FYk7CN z3$^GTTT2`(En&@V--%V^H^(8rEFJ;C<-y&KnVh_RV<*XM%>EFmx8MHwIOgC=me@s+ zhAb&eco8w`LqHuwCv|Ufd9!6#ZcEgBQ(kscVlNdf4)0ESH~FXZoPEg`9!G zl7NzgBeHIi)e80&mc}8x9`@Wg`6&gj#jdTjoQ+qgBX(-a+)H_-IQ*ik^D{awShr}R zOaIIeK`9bE6DDsU9p*NLuY%lBorAwA|&#?w*Be) z_WQJR*hvhh^mkSD`ZOuBx@C(%Kqr4v^ zfQ3sCuXuXu`@x2I|4Q4Bis&!`=;z5MFH6*Webs`tGNU=DlTOknPkLM^EJPWLM#_W= znpbpz9L)CDYKLWowTSyuq46l6%*WZ@5;?U7Pq>(Fhh4PW{-izuK@z>*t)LsygPY(B zOT3`d3TwRRO^(~p9*cFZsNt?A7`!9))08GDkCX{Jy(aawYx?kc9bK`tm3CQWdD=wn zhe@R=F%C7T#+-n&!d%WjoNXc~wjs)#b@izmG&I=s@D8GMG~8Ai*({fex~4ce%KG9P zi*fN-67NhC7BHbIW*tSZ@2dy>dJU7@iAfc(v;%G3R>#q&Ws?}EYSbQFw>x}m?Fd|O zV_(()GoEw;hjJm^6-iX@oI>aO z;S{Cp-gyCqzy4F%eTP@xfNM1(g?pvqgP>wA&GiowyVjwfb>~m|44Ysa2p=vP6}IfV z+@ESR7T-w#E0=2yn)xRuB&cFWMkEXmE3COTMJ?^_+LcvRq^gdVEfxFc&@=RT7i&N5 z{vc|YqLngov&25WWzrTI6_FD2Ev{?3{O!qou~iF>pI=O;fKt`~BIw_}kl#%1z?><( z8!Re(Apd~=!yX5)Ms4r$2BrIZw&a{Sqr8Lnw9H|zUK5rlox z1Fsy}b>X6RM7!u~wW!j(6btRD&~eQS+^;hYTESRhaDAM++|YRYmt%|>W#>fuA|xoR zf6xizjEquDA<d$}Kdu}-7NCif{ceM0-Q|X@IAs5`SVBuopx3HJ?Y9d_U7)evg zexj?du3mH-(k^4^m^-rzc>6X?GbL?1P?151QN{;xz!oAClkzmT^#x$Qgi%J$U8^|? zs=mym$yy=BpmZA^pzgPBD!ZaSCm?o#vWD@RVgL0qYC*6M*YA4;kNj{j=dGpgFQfZf7ydB|5fKSB2@HVU-0P~oyw~S6n zNtKhfD3Z1jG88e@)u@^TW)ZyR;Tir~qq^g30;ik@Iz&tFW&zh!MCALG#B?J@=scMVAY`EwEn@y@eRFeYA(hP%WlCVRD5TfaAl=$pSCEwK zz}Jd)2jFMwYin@e|HPl7DQrMNom98xuA@P#45(V4p|D>$L1RqJnAUtv+O9(DXm_Ep zrGrC#?F2q=l%(-X>#}7$_MPeC`8o>K#v(ZW_Gra-?p|>zRC3NctNe8msNZGdc$czP zs6hF*@%N5@IjhB{^b@7d5|k8ZrGMs^-YqBwtVcUNA1Z!6n(#Y8NVndmZf~J|M9$T~ zNQZv@^}Kqqi+~WPQGvNRy{2bnS$W!262a>xrKv;fQ1j|bto@58%6heP?DK6T`S!rQYig?RLo$$XQv zDa8L?uD%)EJ@(e8e-{|v9=mRO^ZmuFdNUH9udThkeSFUA zIN6Jsi@kGb-iKqdWCyFCAKB*h@E7x9|7m<=PpKyT_gw)0vO<2l^N1c;2mc>_;@I$T zqVMfln*raN-wv2T3X9L@eR?Lpf`wPc-h8|M`$`?oSyXFjP-v~l#!62^1RIr6w6!fG zv_&S=s>&+?xaypp`$>VRmK&_*6>j-1^C0gKdkyEs!0#p`LYJ>}o9*k?t*wXNY8%nz zwpb{f#dyiT6Kc~O++T8a-F|2NkUPbL@n&&)<=XzZ>TzT<@Y%@Zo? zTCsn6H4i+S%kul@E*`{>ovA|omLkRha_|ChlZ6V$v~_D$Ot;xP)?03kNUhIG;pfpX z)`jB*?$L78MLlvAWi#VQJI{C}ujt4`hkTkkJ)n|GZ}@!9c4&Act>*c7VjnDB(IX&k zW_zKlz4as^Ak*LCEhSH{+2xBFam&dTOC$F`t9YA+jQHjzc_-|N`90zBEdHs^pQ{!iS0uamta0y!H0Z2{?j3w$IvY)#e1)F5`DDdcg$S(@jX zNKel&q8D4e406bx0nf+*Zv?l*-1SgbJ;7g90SlXf zhgE?wu}$vIl%p*6x9-QeN7=W_ELyW#v2h}rkiPb{Ea;2GuQ#N03n#_8 zPQw7>Hahpq{C=zg72zUKdi<9E!R(3L<3%-}%7GPsFzl5F6`nJ4aR2OaXsuyp`-!jj zNv?HKQ)O?pe8}aovWQ}U$LWS-NcYkE!?5Z8EplR@Dt3 zh71f+RbLf{hQC&6UDC-%ZGZfax2h`aZqlFmuRiX7LhtUPlK&NQV@B+x-K&j&%6S2s z=*_=|0rVoY>cnIDTyL{>n@URb%+}VVA4+X}u2vGZ-+oCVZdwpEXU{S=o<27yG_<{7 zWaM`$?|nN8Vc_JHR2GMsy*>ynBcRBqCSrAl)aX`SkEYrw6$-nYydvttU|^-y>{k+z zr#;aD0uhNtUi+!@%0ljr&~@IrXCNBV8nV(i4XCfEHLZW_|Z*noz10|8`d?a%X zofbvzDG!@5EHC=Ck~A^^4!^u{O|hK;9F|0uE(k+$$ly9H0C?B|K#uV^{EjSsq2>(EUI9FYJrpm)-s+ui&g2U^B)?k6s^~pX4kgyaexLhFFwCHiYRG| zJ6Z^JcdNNQt061$l|inB$EAw-#L4?m?1SCitT{3`kS?db`|-G)E$fV#LYuvh5S4$U zh@iWX%Jq}~KEo~fY0aVjXXd&fv)rq7Ch^3ps|UK}u!Xzomg=Y|7m+?SWyZqJo{(Is zoSN5;9J*=OWi?Uc7j@B=2fGc;lgj&!L*Xf@Bk6LTl7$DYe9JlWpUtBpT zg!D=Tu&bN05<0QKBVDl6P`{!6x=Q>q z1H(qK5#s#AI7eWrr0AvZ>@8v^a3mP0*tYBAHk{IF;M(dob20{2SJR~l3_K9iZ7~f4 z>a}=m)5c$K8kNYL7Ifb=jDP+OJh-c84e$OB^(;LlZ3N6AOwZIP;c*~Foh#&)Z z6+ij<!pds6nU^!M3C-{f)b<9|&a*3~acZgQQ-@&SCiCnI3bATF!X;t&V)`>F zi;#hZMLsEokc-=yTS+APauWrxYv#XD9VDqtl9|QvdybS=%~zLc4U9RAf}>6S6_>v{ zuQa1HWAw2v10<24C==Kzq|;A3@AiZrka~E7LfJ&tIC#rJJWgC#)Bx01dFA$C`q5%S z3u>R(Iq#Bz)#&!9_tsl%4F`d1$$X$H#zs6qMH}2pYc5is$c(Lo&0jr`0gMh$$+U_1Vj(O79+EKw!2Ndtb zg1AIR#U(9;AU8}r(#XXR(Ox_59cGPz^xo>{p6uj)u}vr}{#NwvAn;sQxAsHXJE4He zoYxLn!z-jLEUY}V_S$xO>$_PBB(F>&QfxXSF}bH&$0g*Iqj(GK=nyZ$HL^73@`QKX zngcGi0>a}TukCcU7D(>?!jy_j76;5!>bhVZuSa#Rm;{`(8NJ#tXukZRD4OpNT_@TY zNeyf*>sqLneKTj)_M)*f_+&iLukB|`n;>(#Yf8Ls-t9WS_jQHmXna3_8sA>vDp2KG zk+@plE`ZM{96?F%3H1v9N6R9ik5ac_0iRg@)DHh0v3IX{V(G3Q9z|jH->-?94&A+g zjwd&+cqvw2&5vs}^^;A0LrM0q`LvXj7pQxE=4gprEWAPq*C|q}^aT}bR{S@XcAneN z+XrjTf)$XbEJ=9;9B{vviblRj4S9K`)Dg~1n#|l*8?1G+Az?2G0Y?L_Y>;DW)A@^? z*^2yAWA>e$vZ=Qa*3s<*`b<$CdOpqPL!vQeO!oNgnQ18t>v<|*gj!98M`&<-95n@v7q4>{4 z9Io1Ri(u=tdh>ef1W6kkw`WbjDEME#vCpG_bhmx~hu}nPBFNUeeBp^Z&ka$njFkdv z%Trof+6I>$Zw<~yt#_vSlQT0Hg(3IwD!KGYqGF#to{ zM&(i+Gbs?YG)gc0drCaI1-LoYjF5}TIG!KW%$e+OT@d>`0l!}?Qr6r;YAm$Dlr{Sg zd62{YjW^30XFIsY!%|NCin>I?+OWiaamos>m19AR= zd+`?CW#_ha>}uP)eS3Y!WtN0jG{5F%V0=TuF>UMkXB#FqPBQMzH4mgtlssZ7{oh@| z=h;6}-SYqNHr*}X7FX(kq#=1YsYUC2L=Bep7L#w35_4FV`J+6R7x?SVx0F%3Yf@78 zo5-iQ>C3{PVaC|B(Y;xH&Rp+i3%7kv%UM=e{wSb2q$L*ot)F``QC;gjClNz&y(dy& zzQa6woe)sus9X2s#VffYPR+jBZJ|a{estGwy}dH>Th+O4*Gu#i{)W%SzPH-CVlDbQ z-c&rukir7 zAVwU)9QOESSCj2EJ`_EdUuuiwIGfk3!K`a2FF+bf4Mh)ZQ?Q=D7C};?7MMgCB1!j0 z-~2_p2C(j`53kaHTYX+UpS85KB-J1*=mtp}1zgIbB&=)$|7kb_7ne#J7iurB5UilA z43ZADL$h};wg)pW=CZnAJfUQ@&hw5#X+w(L1qBT6!Z@c`wCw^J(9!FiAj+W~(W`RVrmvG-L`ac$eS5!~Hf0zm=<3&DZ}f(H*2t^o>n4-UaCKyde> zu)-m@LkPhw1a~Oh-(uf$?%w;ncU#-{|NYSTptYjb8gq_5dhfH(cJIHeO7%bLNcSJt z5dha48@07+ox*O8?{8%aMw^wdu&Eg3h&U3`<|&FxAc^z4PvdaNOJl3QuDcy0%`~~z z)yP?K&`U*pX}v|Vbh54)n9_bevFGmI5Lc?)P|IR}jE1Iur7;*oEAbXP8@DBqOm|Kp z4o{`lJ6%n4sv;GXYvg+IeG#y+&P-_4xEMCsPZ2fjiTZ-=_W3hhBh!SBYLHGR(R?j} zK{?RwWZTAb{wnV!#hpXbfg%})N{I7Lfzvw${>cw6)g0%4ibZ~t?;ZeP*+1q8*Evg% zdE(9rc5D(VSD5;1xH-N%^~{-;LrlqYtb&L>nt%;$UG~jSC7Et2-2yMAgSva7T0)Ynnp#<) z^xJK+2EvzKCi*f8f_y>Neh_k@;}I+JA%n~p!fS19%}ru0T9qI7R2q)Ad{d}}E7;Yi z?{@N$*XB$eg;%;#alM24L~Smr|JK_cpN7V{UcAm!!eTy*bm3GfF&sVvftVZ{sr48I@U# zjg5J7G|r2^JIml|k&_Y8#7+9 z+gRD=dt!@8r!fZ2N1K~!b(7Y+*mbUOl!;J?A>Q}mG00<^Y}0MENSyLH;4PqRs0A=)GibE0pyq=ZGQ&7zv(d+6*% z9>VhqNPJp=)>pEIcO4QEyyASa`K1us($Y~4H8oj7`&hN&KI^IM0H=dRT_gHjhU;Hq z#c^b$-=*n4;;RCKnd}v2UqavJJL849*{`p4pVk5CC4~k}!R&d9x>NW4)^$I)=~X*A zJ0fq}w1t4!x6@@L?*;roUhvpf-QaqEo8Faez@3DIIN%r2f5C)7%>ghZ`BmB*Cf8E# zhr>)Jwr6)pd&*-fLF_+h?{DswtiJA&RoIUTnFi}{?a@`d-U$J~s2%`D@vRbXR!`)3 z65;N8&NqL-LDuOHQ!6PDp7zg(!id4`0A$BC(dbrY2_)<<*)5(jVq$({s*;j>i+cza+*Y`D`_dpx^w4-d^_nu8l)AKW0mk5eX1|7ydPB2e+`j-#y}cr`Sr~I=20~7>Rfi(`m*9jWzre< zP;dZxP05G1Rn=#Mciv6;2cNR>O0B-zOxGy89LzE%Ca$qK7&FkZNbz83T5j_&Rt3Hb zERe+-A60MUv-T0oPAD0QRFaPo5%!ezB&?s9n0>(`*%Luoc544ZddIg8Mgz7t3!h|< zzxTZJDK08G@y!vbRc4vEcG_bst%DrT{)h{*)_R-rc}rhLQ4BJbeDruDK6bJ{X0?IE zs_tNEO;b@~SI_;b8}rN@@z3PH8s|S4@8o~Xc)uvMDzP$|sA7b}t4I42#$Uv&t`Yz# zU9t6DAGBVbduknaJ`q@}*@}ys)N^n+HaWPvjZ2L$w}_Wh-<^~xipA5)1HuZ&X{|~? zw-LOy+^=0?hF&Z%Jf{_tmHnKrqWX*;kH6Z}e2Y6PH87|FR57_^0V6aFcbseXOr1a7 zZHY_F+&fScb`F*8zJfiFx(|Hf&lLqZA{YsE*U19Mjr4%}9e=Gn#cM?$*Y5HwyEliB z%z`Mty}$IyhKF}31tk&?CT)JL?N-s&&asNqAh%kSl71_fgEpJcB^fq(YVC-%o8%Rl zFti!>T>0xZtV}1@W@W{+Yx6N)QWkEb7>l*c^b;8$dq0DP$;(n=-cXoAlv13Z@YUAW z3Sv34-WTvb!BHL@Sf>YeT$62cXZSuKg^uIoPs)~sUH_(x)-GN3o1%{A@KV7srd){L z_ns(CKb6RaSa|hQidJio9&o&NZ`5(_8A3WOn$C>R@AXjAu-4jfZE7394_1m<(s4mI zEf;-N_TTxcubw?TuS_!lYVFoD{aHMKI>f{O&}q1VR`l0SgOE+OQxt5eZCnlL1B3WV z%`}Ma0xzw%c~G&#Rf<9RVl}iXAXQdc!)!cKLRR&!9d$iLQ;$HmO66$tillqa<#XVM zdwt)eh>;ePf#(|}9d+8K2T;z4Xk6n8j{j5X$C09;6jFhT# zsi~1uzHKL2Ue#cT<^sUK5886HO_W0NQ9&3$#DgU3E>3{c}uc^Rh(L@T&=l_lgCV=r7M7=rfIVE2U z+R%^F6Ta@x@(JL@bV#YhDu1oD^^;NIY=4FweSIW}s!^D|CHM2JcH|IdB4j~u)3=Gl z$h8+{{nGpl{G5d?>Er~1loMKkK{Bh9lam|uEi}62g{|)zwN!6J*c&CSocEi8;P# zW_W4@N0Kl-MT+>r(-%ah1)|q&bdC`T@EBaj+*#Wfz1Ks+AZ0b~QJlmLBoVJO&wTNt zR+`vY7$m8zp{Xw8?j9typ&{ob-V6+T2<|oIZB6$rrwMFJH3K`6ali4_GC+6Rgr{I@ zs3^Z2q~#ih6kA-U?-4Ff%G*Di@RyPE6TTa&uDc&;h@Cn+92K9e(xhbMMl!i$vjW!o0CRrVjx zt9ckWt=hqt2jtPb({|&RQ+-;!nUh(qjRo3wm%n{Y7fXWl=5SK3hN!6%LhWSjIXM5; zU>`gr*D`tkw80MHmH<0VY)%ec|Hwe>0Gws(XG1_OBi}+i`I7{W>{Wkf5^1 zIpwo#6;}El?06^L+%Me%ejRai4JRWzc`(SN6;m0i*N>vGmu2S$q~BXADy@6(bm5b` z*e0DL!+O?7%fVZk{Q~idw(m#L{@nn9PUtrYon#$FgZ?E^x4sjb3e&+% zgT&eHEE5+Xkv-4N%_}IBb#uGGrBI&RCBr*QiPm%Rb`a)n9K5Z&)1{-Q(>-se{BuM8 zgrNQ6;oUk){L^_{~t9bmLC!glY`Kact>~9`+-hTHT98sB@c7!eAJ73SV~3>~Ee3N3fbeVp$M$j(;FZWIB71Eqkp0Wa-{KvHoAaVvJHC zM)W4kTiDdRQ`(qLO8$vEQ3k%&taDj*pIBg zy($7Q%A+ua|K5xqe#r{@BPEvW@4D{)bPV+$i;w?T?E1f~!b$%aF8mJ>2OR%+Q~l3W zjqe2ymXA!mf82}yGk88r;ScJnQ6>N$s<41;7N+}rq{0OcjR#PJ&XJH9d$vf90{s22~y}w>Cr8-`0 zb+^@EQn8}` za$EP(Z(y6HxCru7S|&6yX|u0LL&Rv#W$F7gO;CRKRaPu6ZX7|ghF}s7Ha0eS6?IQC)EdUeXt29+7d$Z2c}#uR zyL&-nxxe)9hZfGq_zMS|E55dBp*wdny@;hzZ(OOCv_Carq*BFLJ}POeFbft%1d$g# z2P|hM%0d3+h$Nz)U3Zt*m0Is}Y)J9&=zQCbY(zbd%26dVW<-6SFIDIZKn;%I2#yrfyG9cJe_SuVIFHY*8bsTl5*5DBQhlCL>$ZMnZ0mE{%C=B5Q2g8n``4na^&sm=lC96QbgVBV4lA6B?W$r zj?}I#`#WuAt;`9X`$JnhmqxIUF7SY?n}Arzp0X%xK6-dF9t4^U(d zmkG!DN>dbrd<0j6=OjCC_B^mdn({c?B*lkF>^ z%K4q#=3B>94>sf@{#0L+-*;GyD>8}=cw{|#L20Nms^OT8IMuv{>F4OLcDTWmxL7I0pxu&B zLKAM)s3yrr8atTIl)Mi`DPK%)c7B|n_1`n*&L9e84L;qPRSimN`fP+JCk}d4*bo7ofIrhS(!_ayv(f&K z54Bt4#C>>J7gceuQ|>QC7Q`%*K9KT3yw_Ub_e0Zh|JK_6xKk+#{G^GGxc>|9R z)VnWfK6|X%Scssd15q>>Uy3rc7Ih$p3=xFRS#t5l-tXqNywC~JSC0*JJ|w&s^yxDH zwc|7_sr1L|mCcX-><)B7M~lZ;N-aY*PU!*DAU*BxrM5*$Q*CL_59@>8N=prTyh=~4MZU;{Ttp7krhP;g5f2c(S&wgojD?Irc@gJ;?$)r8 zFC8JV^?n3JV1IZ>AWQmOQx6so@|dC1JPcqtu#=Feu48MqEL0Lw6}MhpDK9IID-`w8 zLhT>U{!tz!);>9x`1@}1*_(Dg&JO+2fyA%dNVh{m%R`HJWa}@?qzrlutp1~c{KETC zX%J07S@bhKDl_hdOmS?x@S9I9%Ft6v8bna)5cBjbf~j)kL*G!BZ=d`+99tFQzZdJk z*pewNjStoYYtdH>yDMdqG;iEFUD`6dcs6+*MpgD0yT`ZrSU)7$@%N#(n zxx-!(?1a#MHlX?fCo~1h9VIBENG8xubgiT=a#^9S=bqev4X!IN2#2n6c%SiM(We7W z|1&w;$(_YJnvFe2>b8PX+O8w&7nkbc&klU9E7^4F)RL~bxxk$ecKFTil=Jm^^SApc zI{g=jb41fx-+K_4r;(7nCVq?0w3LgxzBDjtG;ylq?`MSOR{aOe|I~(HS+czr!U5Y_ z=c-(Oxm70b+hkemLIC!bmTRAU#tl@8n3kGg9KsxcB`!7Aq5|54MG#9C6 zV6KICNt$UK7Gcl*ZycwWxT~8Wwl~G<-Zb|V7*9rT)Wc6+&r;0!*6a0BuU1E@G%)Cv zzh8sS<>~#{9~hj-us?K?xNFc$5mpmvj5S(IRMk+YMW4FMYZ~m|gowXb-*k3cV*Ah{ z2|HL~G)-KC`x4(*1#LvO^#*>Zw%mE`O#yvW-FW5EZ4m-iZ-yPrJzryCb4p53{7MWz z%zwtPa|Jv@Cx%)2gQfkO7L|%C1qFGHT~*#*h)oAyJ2twyxV)cm_ha<8&CWhZ6^EpLOcr54{s zpf^zA8?EHKYD7`tci}bpTdOP7vT3-#tShM`NFe{)(K_lD^6(AN+luDH)rq!pP$hc%YF3o^UFP(@27TpBe0q$<$g}Kjl3aJ) zxl4Povo*Cd`e|&kxlD7>j}=xndHyyGZQ}E_u-e**WUH-^Rmd4x(Lp$8qSg4syl|be zd8r4M^-`T2tn@l3tL$B4@u;k#6hCQRhI$wf!5+M_oYKVW8nW9r$F95_8^4S`W578m)(67|GfbI z8<~CYHENaokxs~?&l@AR6{0T~uc|2vCC5Rl5MnBaG*>G$*s;bPb2X7yc68#Ggd7p+ zx>r#<7Klst!RKt^ua@j**cIEz(PYD&2%@D<-9v75fIL#ZSW{6+B_ZI*q0I^<|QuC(NnzIxdFDGuzq)p0Z^oik9i-WZoX$ z^&Vp)VQ;fH%$?fu3Jo54qK-yqY&%Ae22nm8XC&9yG?%t8O<7-1y)D>IoRHYKc$;hy zLE7uDAYhi0ZllHY27p#ipSl^?*0QCzzHyC9Bci8&W`aCP3;OFxC;(g4u=wrmpqpF= zuix+QPKb(KVb`6Dw5TJm{SZI|5!3MTJ)qt|mj7ypE)1x!^|WdnO^ys91(D?YVlUsr zZW!y6<~Qj)Ud?GDW>tYy1b8&{zus2yH|-286>~EOKoEnI006IsyWCxU?SkW7_)i<;NY4tAGYO1L-n{mqNs50#XCT$(mo zJBJQWSVLJ3kzQ`Jc5z{ZtI$ncGRdD_{3hU-X!`&!_qrT+mEx`&yklWlN5mgh`5jxE z^oC|*{VdA{O&4)4xCiO-V>?BN+wWO~^Zo{W#U%THDCdQ>=^h5ZXmv$#6c#tbgZ{&u zD+qX^3o^4G~sZ^I{DDQDnv96vsp)3?ip9mznNjkIupI zGgaUK|I%<6Z(%ihz?dL2@!snqj!0Gax}6U|-G%Z=kn}S19I9Kw41UQwfh%NV5G1}5QW4{8oBcI9DzYipk~CKAArQ-^7eLECzB@ObGfLT=#L@ zu^p5im`OObUN&3hOE;Q7?$|B=JPNnSWg4W;^!;YPSpIz4==URs4Kg$HW+`2zK`nHV zBzIQgZI%=Z-PK8S-{s=QH4!1#!#Tv@FlF61L4gTOm_cf3RLH?&AyFYMad6ta+nKty zlXLlb-`ss{bB@=oPN!=-eAr4YliS(Gc&c$)3T0RBS>_Jcz#|c2?zZc$Bj6$(?5;zr z(RxX}%Nxpv>2)#EGj{Uop{I?wEt+5FHP>9WaRf&V$JLzFe-kwQ)1~=egrykM_xDRh z%~o}C-nx$4x%i5sF&B~tBg|sdp-EWJr#&98n(-ro_}|YHDg!a%-99t1Y}3EHTbJ3< zZJXrRDv`M`Imnl-&8JVoR4JdNiTblQFE6TbkZCeM{>d5Ipk+aN^$N!ra~Vs|X6oY@ zELvHe11MH7BO19G5I``r# zXpR_qC?ELksV#pe4WFrtY?4W0E;Os=z2|4L>z68mgB2q!u%J))5sutZ%hnb|;0NQM zff0!wU*}UIDnYkOFpO&ebajKTmLbMZ6@YW|i_4r3C7N{mt`t(P;eSC@%!?{t$ZCIQ z!uX>}o72q$f7MRDdDZ8jY3Ay!0Oa73#g`7w+&F8trVz9f?)e01885TgtsC{6Lud&j zK=b*&<4>+sEocz`Osb{$6A?$lY{S`j@^jr-_+*FqPbdT9_EIr|+)w-3%TgjszXhDH zmDE&uS_2@8jVLQ~l4thcj?vZ?q1|0r@`s!lqtQ09)7_GY5%z_RHaI7SznmtDiD8E( z=wA%1&Ng={KIj2Zy9er}=hJ#Y-iz=VFoJx1JipmBce|_r)on7)#Ucz3LkwQlLbp9B z=y|r6t>^LnU55|Kv-*8AZgd!MLPj})oHA3w?Zlj!w)DMj@9j4CM+)T8DDGax*rdcm ze{5*v9R=oV-e8S;iFQ7_t|nN*;CAL$-*JWl z$-$zqg(n9I!hb#K2KPKlElnSt>duj_DB4PBb>-T>(Lm(Db1@lH7#3drRm$rh@e2fw?#&7Wy|?%T(`lj zel-GYT+KfX{#Zo3Zta3_qqSwEv2M;#>O%vbjzT&#U$x5w;@P#t2idGUHJO>`tBTYrj?jm`tnsgNGtCZmB%cFA|U zfygVJwjx`HzrPlV`*)&GvGx7F`y~C!L9`RcZ0;sSEafsS!qetQs2PWAH4S=HAE||W z*{4t;m+xGg9focx(G=yuq5M#3eMY{_wbe^3uEXkX$F<&o<(|kMh(G&kk7wd}`7)zN z6rS-j4AR^ntz67NOE*NaoYIcTbU5@QH|!bHQy8wrOz(}0MrX2_q?Z@6z_&!%kY-Fkr`Sg=Hii?3t6Ua;DIe` zJCSkwYDF}b&nUU^(|f;#>w!n7yM7^@8JDfow-v(s$vSqqU)4S>k(L{_6M%>5xWzeE z9I^cfGj%%;h4200UebM5BpIx3t;xeU;3Lu=a}k|e#cy3))hISXqK86(%Ov-OT^@NB zoOAxX;cK_UAZJ_M_$3?U>I8WXpvzT`K3rD?pmiC1fRi?Ft)sDwzjSwJno)!RP4k@rm zve-%}i~ZRZi8Ea8U5^wLe}D3Otfvz_>^4jLqTPysD#k3}@Z`KM@Pi()Yk-Ppi|Oi@f+Tspx%o*o*9>0B8AXgK)9N zsD3WH+8oEdmdgYzUKHHR3eoEp_qwysfmtE;D~P+m4H*T;A+Ob6*BcVW*gq^UsQ7&=?EYS-gz>rlvZKrsK&g>k?;!Jk?G|&5k1u0{oTSy)`Ukl*^6uYi(Z$%}toj?TI_T$0qekMvSV_%V#W9ZYOYr!RMl1|mr$+#Rdey;iXKc1ey;{+%jg z4aeE5*4(V6tV8kO`!EevW)^~sFXr$5_=C2hREhVE_g8|Hy6%ml@B8Bo!tJ`0d@ri@ z2QBeJ>}jf{nKN?TGRVw`z{*IKX9X6bj-l*Q!ffVV+;VHgHW{0rtd-73@dwax^u{=+ znlswTn)Zd>`EqU{$EzE}OH)+@ZpJU1MTAjtuaEq=#u>R^Rc3lMvGdNq+}&Zs)Y53; z-P+^*5l;7ZoIMPspD-dY7o=gZHA#ucXU!&5TV9gNZ50$m%+x9;gj%1>^QfJ4lpuL0 z?@1l#C@a?M{C;f1h(g8AlKS0p()@*hyFK!c)TUH`gNac>vCy^odx$#->5q|0|uf`%lfSVSh zl4X7RVCqvmD|$c3={7AM6M(og?_|z*SC0mRJjt~pCb`Z#z+B=Xx%+Nwm7^ z<{i4$)x6Vir{&*>f;Eap7y}zLtsZGZNg*rtrtuXf_t)AFUlH%+6kksjLrM*<i7g%3cE&w#^CgQYG`y^%luOwwCCe=75Yq;so)jBipGH&)u zu#To!s0rEMm4$E1^q))|(mH7(7ru1&i7H9jeC-Ul_HU+=(T;fAm2FI zxEIbjKJ8&PT+1l6b#^mM0lubQpj1fR{kh2A1SS_z1O~U~Jm&V85=2>VY;pH`B3vzM zcGQV?iugL8MeWmSr+62@}+yR32mbi4j zE@WjS1AD^|;#E8HreNP%^#_#M};TfzvM#M<()7 z$K0sOu6kUvC6uvnhZ=9QN!CWR93COJPU^^Qo22{8L&kLD#XUt;T8B~ks?ZsK#_6xu zCpA%F3f${Hn|-AF3edMvHeMO!LurjUGQ|Fd!}sW$07i@7M9Q0tjJA zRyUxKkfIqqt}OIgSNF<)q)SN!_5T`6iAx~DpAUfY|D9WY3_{r6Au}ER-QsW8$9W?~ z?dm`r7KvRqac8HVW3VIW{wMc78_P1?h$ghJxWqQuuDV+9mz!4Njt|DwAf?4zb`MRf zfMh>Ue=S%atFMv;&wB9#v`!qoo)nr*n+^Zu;U1pW2q79W{)z}X{-6_W0Zv5(xowir zQTI4)IG$ToqEo%cey&98%a*)hc7Cz$`AaP^9Q*R3IYny~P9QQhj~z&af_)ex9y*&( zt|{Pdo`N`MaMX1)Y}}1*A6UsF)KN*jnAfJsajx5GW1I;;i`1lLMK*WwNG zXWu`NcI4SEG>u!<8CUfKDkiNOaq&Bh3!gbq3=?ajG@H*j$@+e^{i@Zi-3oeU3Aal-x~QRgff%_BK5)GHFp)|*_$~b9v(@l%xSG(hI5O6f^nc3`lmSN zl7|Lc)Vp~KT&j2s?1JHxL~g=Fslr`D{?>8uXU&7F3Lp0wl6!g3Vf$T=kL@dM7^l~h z2rO-te;yGG;9m=CagGj;+Yen2oqu~9pP1zAYtCWisB65yM(~Y$`*9*Z!J?sAX%U1V zly&YW`dPYcR`;O05`eh^y77Ctxw}a)u{n>gz5x{OY;lq{)+pPomIfU9G&=(K2MO?3 z6{@`ySy6laWe9UgBEFzW@LX1^UP*JglsihV)rr2AF5`LgN$8>z)3gz?kgKQ)RbTC? zvlMqP-cXgGsb%}en_pvi#P~bY#JhxUPde#I_!NV5Ga$|0x4e!cs+vk3$G6KB2I0*U z0G~aP5saf@cTaYn(!>Rf@q)G!;wh)M8y+Yc{?=K>uC6|Q3Cj(BcGJLpG20}x(Zgo* z=WhGo@CCHjGF)n-o=uB0^a^NBsBOu-S+{HHQ}SrTjunp!;jCgb}OcC^g;$*tPdJ7v*#}q3k-H- z3!P!lr;#$PbggsQZbkIbuzA`@I&fb$GRlsMS>O>aw3@?_Gm$+1rd0dEn4reS*90$(nCFl_c(azi^)b z^o#Jzsy4$nEkcMU$U>(wCBfXMMC_9<%)6r_DeA^g*Ja~jX-*1>;@&7cI1$Lr)`9{c?!<~{ z6^a>9I3<(&3`HC)PU7#5#uzpa={wr4pw;1uLVe(pGK37y8jpFT++HkYL&%3@fs2*` zae}9)yF$x7U0;zHW*WvW<36!{v$|=G34)qcHj5spF7Uz|=qgIv%toj^BhZLF!qCVq zlP~WM0dy;(?ZIacPfK+=xL{29^g#C0d0PD?nRd7dn${_k}`gV(p9N7qzGAZO}co;#J7 z@Q(ELGj+T;IttT0?+3O0uN#U~`=oFC*!A#m%5j~|m6O5P6uGoT=|^xCS> zg16#`0Tnke zb3l8sM5MwJy%R$$T*8U_*V6*c+W9^RaXqW139)v|(JO=V(r>`c!`Cf2924kyUc#vw z(fcp`@KjqxnF|bz0t$5kHU}pFdlTiNDnOeoUE9FUg1aks(I^3j75vxE{bc7c0A_lz zV=<_HB+Em!!#;Xq?eZQFHR;VLMuNd_n0>A~*ExHNe0GBPWzDo3BfpHOb6PxVa6g*y zZwS`pTcU0S92l-(g3$0_es)QBl(4??uOvy#W|_yM#J=?UC8%i7Gn#26tKF+W{~PmD zz-bHL;C8COPkiToCKl@ugvNb6n|AKhz;tjD#XQ|XetLACF|`r=6Txldn_eoAkg(Wu zWlg-mKx$bPZfMOo-C=x_$x_FOq1WoF;}On<0FraO`yg*pe=s|DdQ2QSJj%7|Eq&+e zJCruw#ES?LlE_TH^q1J};@$$R|M|8q99s#=+pjo)gIW>?cDb$$(b3@HG8seNrH>)6j(qQ9Sx1~R60VY+IV#-n67hI-(mNsj7 zonCi)r%jA{sXv{&0R0}4`9{||Ab~(l&QLFiqK};zoXTEk>yJT^0)DZLvjeEgZSsIF z^)lDM3P0g3FW~b+hrO|MvwU-SHCG$rAff#W#>R&Z3vj#|994q|vZ7CN1u#z2f!C-f z(BB6Vznz{&cD`HSEM4AlSUnG5MjU*%_xrF2ZL(o2%KC;29kvn@@#Xkg+H!5;4F2>@ z9A!qzIjcPelGsUsBjgK3;`Pq~ptl&ndC(nDLOhS%rvw6dbSivXkIRUhxujhEDF=K% zR7-mH7~Q6=D8=JHIb^~7Vt{U|;O5ft42zr?5uwJTfRae%) zU+j&4%ulkjgOt&owB*e>UfbM-l@!OE-=wF#gT8w__TRjG>znS@fp!va*G6teB&!o- z0H9Z}t^dOfJZbuzNrwn+=ZU>FeNk!SzRkb+uehyr!hsB^hU*fEY(L%T1zbc>S|{Kq znRJiFT_;`6pzXU;xBvK_Hh#fdZ%!5nz&P3kd>LvZ*_~{IerRl!2panvOjSlh$)=^&9F5Nl7aZU`WPl1IxnElH zkfrJ9fV^7sB3<-^>eXEtpUpO(tR9=FEoC=aLPv(T>mh3Z^N^9{s(T3%^LYmV63Sum z*^=^|)kKcPF@ml{6i@Q6fOXzU>;OEO%fVWD(LGJ5}I~$E61nC!3*-roI3RN#OkMXdM_2wt*h#TBWl30XVaY2nbm_DsJKcLR zJilCyiM=_}Z{d=QG*#j(YHb zQ!%92MV>%FQz1`4Poanl1k?baUg5OZ{g`=a_U+yAdm%_?>a}lX>srzAw^Ls=Tx2Zo z-e%!*i3ex@B6jq|(sNr6{XBx|4c^xl3hif=q@&Er!b;JEhO@Z8X9j@e3YLSC@BPrp z6X@;xwc?&G0+KH6P*?_ramO?Uunoj~Twp|;n_RQnZ)vVk41*EIHRY;UTBVuarS90L z|IN?z?wjb7lm#QkCe1V=@a;~vcMUL4T{~y}NmKz0f;^NrM6l+#>hP3fDSj<=YO~ak z=*_>%1r3(@;zqkwk5507SV+KDIU`L2Y3#ATNf=(-uh{FP(t9PNTw|wGV1}Ql)E#^v z#}!1y)^I7j%B*;MT@vwd_kC~eiv>2VomXZwQM7rz3hJc`FJh1?k;z((Zd=^4mbjS zcXy_$@?Iq`dgTSO^YLct{TH=_61zU7j~sRh0PAH|*_T?!EJSnQu}qsTM?kl>q!y~m z%E5h1a--#|w?I$+v*n4ztI3@Ly=S_DrXG7}Iq>k3z5M{%G~Dg0s6iVG+7gc@(J};3 zb&`O13>`snB5mNSeQGZkgAfoDbA7seMBuxFPTd3P=IZDVr#Z+Ety%PnynnqaF^rTJ=5byu?7G|$YcKyRI5uY3T?=oU%o6qFFU z&wc{o(x`s(aRg+$+w1<|`BG8UEDb*td=j4=!!(yln3&iXPu;wkAkkQh0CFQ+y4<~u zGG}hBTQM?Pz`|9gyE|UKH|cF%@bCpTtczCnlfA;zJbL-rhP@p94~k&1cN@KGx;IE% z4^val!_)*ys!%_;ye`S7sgROIv&t*W%Xk7IWd8Cu|HLOmKjVo$oh{~;FywOD8(zMvVCY11q&;(Yc zhBqM7bLf5kl9|9zAQ#xfG7 z4%1sTwc=JioBdLdd1CMJ&5m>1{+%0owWSTWlKaB2%AzZ$qtCWM6s7lyz-!-Ax-!cE z=?11ziQJ4jMoDI!%)AT9t&}lcg%d4nRs>gRLU8+2z2n0S{<-gZPfw3~bb_4){n-OG z0=f7x@Tqcsn)hjTngsNki)vk_TvfxqzA*wq%-Np}{G=lIekAL#Y?rmPR6yQuzp#Oz&`G5)tE$YE#Ir>fyxuMFEEeQ|az0XLLU>e^Tos zfND^CxB>t>h&QXj&EAt?2T~XZ-DL*6)PM zQxWG#*4ow8Rr5<%5FJN{sIIg%)HM5G-c1PEOqkJ%Zg9YbZ7IF4%fs@5BNkcjzK*_` zb3XvE;E!i~z%iiBvtF#$MUO1Pt}qJy#))#iOPwsHiwEo(O`0?`c5PTPzaKSAaiWYBSY z%oo(X=HuIx?((16k?@JFU8fho?~sh#_?qF}7`-hat(;m0fp|WznevOx<Q%@apPqGMJ z_oURDDlC>^*Hw9K#nA!CNkB(G2{I>xlaZS-MHeVfjl)yd&`r*w^|x6ruo34S_dB$k z&J2mb%cz+Iu6>}zT1e9#x?10oNC{qHsotKy$HSJ@VbjO@Ifb z?|hgEGrtl>JKyds_lrc}_%)wx^4%;h`2KtbRONClC0+WaBWdM&XX&8r7ekDZe|w*g zMD45OoQ|T-V`{2u!Lx(OCrw}!PEg|LnGGjGB43{UeCyN!BmdjS8k3%Poluhmm59GlsmHn+RZ2rl_B0098wiChg9 zKMs#P;3&;e=(6ai2m#cSH+gO7!S>&gqg$8KtMuRhuQgSP`FD{4aM@7-X8YFa zzsO(!y3m0lYPzY4eV!);$G!NCV@kH0C1H*Ro*!EJ@eortf_?x+2Nv#hvl}^OMe$R7P!S zE|L4a%^b-0Zw7N=iLY7p zwg2LL&&X?pd*J*7jTOuqs;WEX_x;h)_lfbLc|X7i8gGCeOWhz$PA0t3CowV+*4b0s zj}a~SjN1T1YUBWrkAV61RrDmD3Xbem>(t$v0n!*z_BducdasK)08STtY)w(pBRzZ6 zp{J80&Z0f;Q;BWk-7birc{yM2OX{dFZdBP;b6nlWV?;xv<6HRZ1Abz?+XXMk3+ytf**Lt3)je@2qqpv zNy5MuY!*5-@k>iB^clV$@@I!z%!eqwQb|O(y;B_yv{~pimO27y2~;nsW;*nz^Nj9e)%IkpnZ`YW~s7R{gp~ zht8Cw)Y47oKm;k2QSTsRibVq{Mo#}aP6!vIwiFQr<-H2whbxh5d{lC-{)Dnjs%L5b z9Gl0@f!xq*0Ts9^=bTkMQoLS@*;F&Y_2v_mca7^&7S*ketDF@otjEtT1AXc?PaL{I z`j-6*N;bOR8o_B<7z(y+<&w^?y}Lt(=^SeLvNzM3nz0B^+&yHOP6aaAfH8kZLYyrG z88FS|&I<@Ah<47tWT>*gF^Hh_Za{;H3f>y^3Xu20UBkXllDk-s4KG*T9alq6X4R#M z!1fNIKR#Vk@L6=Z`JERD0(|z{Rtq8gCtPkT9Gdu&tttX@!$x^lnOw?a4&eJ`?W`_u zo2f&JJFg@D0SQ<2@B^CMXcXQp{4Uu^a0D||0AG_gUs*!o`p*`4n~uk%8q zXoYqOI-`OgZ#wiT)*%iK3nBSDisX<-j*B{y=~fUy=@emu2W}@y@8~35S~@Ixo9r1{ ze~8et$`bfo)aUTyt?;JDhDDWi-%$o1{ri$@N~$;fgXbP9@z^ZIRC@|#b`CpUtB zOYS?NRNdR^w)Q{%FT3%uSTg63KKdL|Dh`eQN^V;<5DnTRA?{njnOQ?>re@0B zEc6#M^GEjs9B4#Y*TZ`Z#1gy`^`Hii$TOrgb;rAv%GU&&mRO&Tk*w>A3e@0I-=Q21 z5A~%GtBS)OZzV&rk_Fx)S%2t*V8t7kWp6~?w<>)bi!NF_q<+DH(o5$v35;)jGTw1L zsK0tnRF_)$fr)nqliXHG5x~@*LZoP1_IlX-6CUiOo2HaPmW{v~Yb0_Sai0kEPciYU z+fP@FXrFwLR4~#mWJo@(x)6W%<2uSpt%SY{FFOwy2a-Fug}vOT2u(k=tj!0lKnq5k zjSTBtJS@e%G%u%^1aIkp@33nW_1o(9CHED7>|#~KXjGv(a=dgmLOAeH4soM84g=#b zbzAG2`?ZAr`R|cAAdU4_;@iJYWB>vc;&sTM2(FFPYb%Cj9}QI>ReKQRlV@QwBk0Ps z?#useW5}5BN9l0uV<6X3<^dF)@GFhJvcNLvQo@_R$mHAOmjW&J4lg5b`mQw3w>J(- za0cd40AWdm6a5V#0>wegmVZdmFK3Z|)B#bE{=>|HV?iMa+@)A>j-}^C?nO^=LNn$e z)ibmv6?Y`_e)HiLWUqkUmyi7LNVkUJCS%|3&vkcFSYdRekd00)L&2ei!AbbuHBh(X#b5FMAK3d`;%MLfToha5nH<7 zbxVoAeP;3;@py7wb`l#QiI0bB@%l3C25cX%2Xc~+6hA(K1+;CNaWDUvek!&JC$c!~ ziXOJ2Y$t3zxTD~rxBl6I)P6GsXE9N4uO4tck|ddD3(Ze|a6PWqK0;U0SbqSFr>}A6 z)MaC)-=Zt~m$|d(APR)q6x9xirK2B^Q3uhi`oR zIgsU1%h{bXep=0X)Ni;Ew$Q3-k!x*!EeRB>J?;Ok$_qFPRPg~y2$%9@%BuSSpf4_k zHu-)=#Z#N^7f8e1NOnBljY`k!M-o6*OeQKU6m>?HYD7NeY&_uh_$(z{?0>Jd16pO^ zKkrMy|FkcENHhU-jJ$mBSQw>V*CvyUlmb;O1-hA%(zh&<9HFgs#=gTC5&+Q0_8tc! zSaAxD;giqc3M)o${nFm>`8Jls&qaWD^3N5Lew)_>lE@QE4MwWWj%3v>$-CG=pyA~|QuO}qZotNRc>;Bv@X&ZzzYzq_ z#j7L0EiQ0?G?L#+!O;G89TcCZw;A{K%(vfZDo-eH31Fv=gn&8>T|mD{--j3jC8}*@ zf4dGJ|GDC$y{G$68Tx0-G9=q)SrZib_4w@$^W?spUIwuF6)02I$#BmfMHfO;43;hzX-@5x(dzqjN6HR!|i_) zr2l{G|3BG!+U0J$Sa}(B6;eBS`7tR~O7XBT@T)$A-?9^y14)sP3ANw6L4JcnEe&&m z9Q)0(Gld2aFxvl8z3z?G5*rmoY_5cF9wB8Em3I{JOn>PY^DH+bV)$}FwI}Lq!aVv7 z#Ci^sU(5v!c!48qN}>Nwhd^OidsxIC<7njb4dOvn@-?7x!e6W>Anu-sP%&3##--Rh z6S;~3mrdDPdmT(%O0oZ)l-FRQo6eHnO&3M`C#r1S5)fJ$r4X~RDrc;&5>ru#@bL1c z>{*8VZbsUIxMgLdCCFq7GbZKY<3#j6do9`*WHGZ{>=Etoz7#Q3`nFeM-zpA#rYPTk z_n8r4ClKTgJFw)S#-)6XFZwye4o5UW%E~yW8OY11e2#b#C5S_^a| zQ`^w@^qdkE0tnH*p|*m`f=cPn2KzU*^ncW|G(Da5+=Xhxpb5q4kGsTr2BPtg47ENSVlARA$;#5JT}d*#tai1h<`V(0Yjy!EqB)(ZKh|C{D-k<+CLKne5j3>Ay2U zCZlzxOYXCrN3R5(T%8+i@i?k$t)z zA(064@Po^`=Zua*;OAc%9sjdS$?aBcO`%0~x@n*yV32jj^=KM*H~(Ah2sSRn-Bd|r zQ}y2Y58ig3>?3kAVL6`r6^ziZOu%)3_hrLAS0gGUy)`ZFouSOtGKoMj`CBw|EdcmQ zi>4xDJf&9Y%VL#62f^+h(WPjKsIp$6!d)t|KNjwvLAap~1Uou))M^U*g)|C11F-?m zU6}u~nkW5I|Nk4H{+qLDuu_+gEqYpqi|i(CUa)D067KDVZqm8@%cK73gOC^@;O*=x ztcI}j3yUV)?6F*mh#dwHRGxn91G!X3jKBDG!C);_Sw%`0QADB7PUSK3@o+Us6HkW! zbY_28r$}f%Uw$DqxzMamQsMYc#%i&Bp$-R3$``6+*zRWg>g6h@Eap>YvMv`f`_etv zlZaS@Dyjl)wqZv^yWN(^bE91 zx-cq!M;vT4UUDS!mxp7#w+83?mSmrQFqer=Nh#9q>AMjE#=9XCTsBuk*VI%idEk!s^`95)S{xYR+XH`QL=!&<28^BI1B1b{H*gqPWl&kG)~A zXZgVMA6-Y%yv;;O%|!u5yz5J284+v^=(N{=RKj%6~dgs1!R$lh@5kGG;t#~6)(+imvT1khoyG|665}U0y zHr>Cs98e%D)1RU;$}2{Nfr&@u&@Oft(?kH!4!X*q-7i9gBVM*pW|2g-*dmiA zE+JC$dSF*FeQI^?x9wc+B`B-bilvTV`$f=<;1Cr$V_AOYL7<+dU z@OEClp?H1Djf#-)d!`2Q$RiAX1oi1`yESQOwC~SzdnUu@?L_!>JCRLmac4;2YN#d+ z=&34OFN>-_QvVKu+ujI*X-A2DEoMFanb1KhEMh8Ch)p&k0o+Z} z@~EFFs#QDs5P$1>jf9S2{AuX#;oSE@XhtUH{(=OCi<6A#=&U31Xwd$QJp$n35lFV! z-kPR3DVYP&44;mPpdgZI?bcD`O;Ws&t8P&;^D>m`R+q?c#>bKvMJb{2GxLT;Jg$-Y zhHpzx&44TbUY_)3n{^Z3nwbo_OkS-=Kl|eU@GjyoMK{|-MtS*>$KT#zI8GUvIh$I% z%GBBmlNxvc4qWN2Q~{SljRx`qdVM^68FcNVr2MK=@k&&}xaPn{hyOS2{3ru6!8FlF zX3`paoAZ*@WJXswT-?+l7l?D7L@R7okjZC(NlGI}6S5?16lU!J=9l4b@?zF@wZvNiJC@%sce!>BIhzeQf*oDh_k zMbU#V*yV9S?i6WeccNIpXFRz?{fGD(0qFf&^Qi7M--J91oDs&&vI?{1c48$3mU z)EQ70pg)Gmk@vye{9uLc7UpJ2b)EZfBJt4~W?k`ZU#%*da6!K|yZlClnFZjbo+yE5 zdf1x+<4k|?KLJTV@by#z{9w&9n}TSW>@LC+iC)^q1|EOtxm-~L4)5MQ0N?1|s2#aa zF-NK668g17c*iS+>i0GQZEpmYJ0>-S-E^AOKHZ7|1BfjY4FrLw4ggu5|Lao$fd_hK z=?y$$-h7eIUu17mEO@<_U@Cof{I=HN$7Lp}rl_!dLh_V{cc)+%4zAEAir1QgQ z<;wR%QIgp?EebjC34|-@2OWi=%@O6W-|(qQN*f|5UfA3yHJMQ>S(n7Y=wj{08VoRE zBi1DVPm}Pf_BZ?Ro#>fE|Ye0oVIvjUDD~24qCM?0z~tduq}CwN07Vb`A|Mh{Rp;)D_>vP2VnRmxue=r1zimA>+Vg`ufV=&l9&E45#1w=K zG)d2C5h>U$$SS+_MAjG0s%TLQHbxNQPeC>y!Xjp5l#{9zcA8^mqKH?ycmndxjPlH* zIQx9E4Ze5?he#MWV>d1I!k)FT6=gb z5yf(_bN9iJ6^*t@`=v9*KzL>5gKQ?>yXKr9+xzYPcKKiqpNbKzG(vU2zR@O&a-qLRYV#9ze$n1?$3Op7=;0qV63X#Y#%5THW`b=wRTP)CaL zw(wWPhaLOJrL%y?=owTmy!Cfht^%6Q58Vm(V+CjDv1w*x5CLP4ULx;*mS$FS>hm|0 zoJGp+_V?#$@Drr&FXI~qPA|epsTbQJ(f6!YgvThYJdw= zApfT|awzVn=wBb5#{0^OrQhdC;6_YMA|JpO9u^LCC^UqDLmUUCryJ*YDj&$hSt$h7 z1Wb)G_^K4o8<*GIC=C*ppgAV-kdV{!zsw1bdNkrCCM>c$12Ho*3N2n940c%FV8tgB z!x*KgiPX=g!o;Aii}G6uhY*lvWdlPwtwXHQ{uPUG<3F#JV8nl~W+{NK&Cgd;6uyu3 zXu2$G;_~qKCG!(b`@E2CA`s{6=O=6`R@BMIFItDJSY2C0Fq0TJ*P&qd`a~f~1zU~R z$cFWFK11yR4h|-Ie@26z$}Kdj#{jt4TeX8iRAhZrl*S%(F>^K)E$iW)338({O@rF} z^pt#myy!yxl4YY|Pxt->dd+(S@PFwJ6wk8(IRC$k#@H$H&9q5G?-rMP5&h(pFt1pO z?NJf|M}wUrZjCfDDk=#u2LKtjgijR}K^d;n-=P@I=na~(XyssV5nCV)GoQ+OBZnc9 zb&?+l2_{}>Cy8F^r2{UBQMo!XRc||xo#}HMS)QfkqN^sD`d2@FTVQ;w=|iIoVAL!D z4jeLyA1H@L(=tVq1@bq4H=W@ke_Xl`T)(ziA}?+h_7j+SakC^iETYa^jApi%Q9!~$ zCT`te7wuaI6%-U6m)H9)2s*+L%`}z}v@Z>6Vr(+4HVtumg$PwVr8NDec#ip8wF)sp zN~0+XpSJ;<(oOc2u#9bg`pd(Yd%OT~jHhMi3GmhIZTzc9e`1GaXn<*)Y7GJ0_5aB% zDHNZEAoh09&Qpp`QOCW^kH7t@k`GfFmsRArGs>aLMv^UD1sjHqgOk}#6kt-0=3N-4 ze?cz?Q*4w!%9_yhJ@+-4v1_A(+of zx|8W0;|dNXB8g8P$5Jy=PgSbL>6;Y8b0bnID7C@|dHIEr1-leRhEhG0Mlm4*>O?)~ zxIoA~-o*xcMV;_aUUYK_LNjpRPcZ0TMj@;Iuf+Ngfb-4HtX~yvzjrBT=jN%2XlqmV z555Qs3#%x#Y^@h6)j@OC<# zkI9dR=W;n#+$3yve}Z@D^E`A@jd6(amUK@hqW$SUXjI1{+4`9@B6(S^`!}NJ=@~dh z;5>i$tdYEiGASaLL+O2;RXVbwNp_2{pCCehXyGRlf~oe>nuZ(^3JS{Xj3SZ#kix7MMmfEb17h{nifkKKe_gvn z3UxNS$P*m_a)OyNUu8FJETG5VoM$J+uX1SqeC`s`WkT>mwKS0LA29Nd)~iWfZ%qNQ zZITDThbyU+jC279;|Nmf5?$md=hY}K=ETIL2)~^lt_Y7<6D-|3tC@gmMSl2R>KR)8 zjV>7(>6~`FZXprZs4UVfp`)L;$Y{n7gw^Hw(!q$%TY`lq$R?-#R}M?suf{&V@)UxB zW`MD2Mq8A~muoH(Jcm&VZa6%SDJUq8qqu0tLCfdS?(XT_v1|1Bxkl%qAJQK@IdH%E zAt9e4%4aq)#suwPyDyIV_VeL}4(^#sxgQjEZuBC{a5h@#hQe9^*Ze?52X7 zGuS7(>65t~A3LG8SOBjp5?%sTSaWN-xeA%iQ_PHvBC@i96Voht25!wwXYC&A18JOJ z$0k1HTNI5x?egqp(dB4FHFOG#$W%B#k_yRusd!BB%;OtOkDMHrb~BooniO{8uaAj~ z6O~s^nTXFn3cvj*9QHFN)Ym*}fmN^}%P!8>7b++;Jm%Ysp|H%}0)4{_Mny3jkkMQG zo+i#swMNKEI(H{N?Z3R-TU) zxpx0eOJvJ{Q=2mdZ6@U7ATZxF!NrFNd}7uj;4swsW_^eAVpM~obf!UIF^NkRajSqF zT_mk2HNeaeNMww3GC}JPe`uuc`T92gJqj>ZRoczJ0o9z~oa6Rzyx{?+V3C}NjP3T+ zAuSWK(R4 ziq^TysVs^6DK{MX5j(b?2LcU%HY%PcG60f?!^g8ne;eCRW-~1$#8}hSDs7ii5e&HvpwP$c+d@|)!x>fw3 zTH7DYYNI>JVgvMui1niYZw7t;Ja$yKraOTlOCqv?V{fo+(Yz3rL|a9d1={zUa;i58vM8*w#5F9syG({6q;V}BvhWO<}!qZ zgv&1ujCzk89YZl=`EF23wzRE?>+GK?##~GcZ6}E?K?A*!s<0P4e3RYg^K00w$Y$Ch z_aYrqWpGzw8zQiVn?xFN^k#O4UEQoSA0FE^$xD?k{1ueHdlxr?zdm9TlE7i=8?%`L zil;T|KYBP~Vln4D39;_g$%cy42y3WYQ~cEnppEt!rnToZE$nSPykNImOHIjKKVR|M z`gCDIe5iV$R>vn|&n)S>4n{^nnvlpCUF0@6 zLT_{tViv@tV0=p=>?l^p=oiB1%Ou1r*W8)Kx7&+P(9gg^&nSR7z(Z0&BSF9BVi?Ix zRvD4yAQIoXP8=i}IGS4ZCh`qMXvJ-A29|Gtf8mk$hm8f*(oc?9dLAb z33PQ!FO4n+OW*|7mo2_eg>#qBmb*C zY-{Cm)i@P}wR_JA{ke?1KN=-94QFu9N2}3wz&PRNfeceU>(n~o(--g1Z6+oBA`Aru zc^bHBTKPpkQTcBj`X~0QBUZt8FaoH}jBqyRWp+H{n^-_!pqG{lM)ATC=cc7PfPiI0 z&UVB+BDE4=C%Qh~rMcIj^9q|twkLVt&_J=Q>%npJ8+o|Bk{2Z0VSUr8 zE9>{i1Im8c^kghsocV$A?i3nc7laAWCKr(WSXfgW?Xc;V)%f|H6gCSRy-3LLn|?@u zjDCEMJn>kcL95NQ@j|!yX(4-B~+ewBaO5^7a zPmmL`WTg0fg>_lor2TzxUz}sk@cl zbqcb)B|s+C-c3+mkjmsCjW5`8C^4O@l(1hnmv5z|kpDK1#A?2LV!irR*4E8oty*;| z&ikNdV_>7B2RC-?-nFq~{NjVdPL@eY>>6!TZ-u(Lc-YUntI`U+9hm{PMf=V?%W*}{ z^RK$+y9aWUK+deiG$NkM&-|8hZN;*Km<92;pN}(!n|3g`t*)0&!UN_vswD5c%|7&G zN(zYU-|Z*l>WvmDYYY$Ofmv)x=cdtc{Y*A`%NqBbtzY+7o=m`VQpOVv_%ko~KR_!} z6z*>dfx=}rJ!u3>#kbP11Hra5eM`w#HYq0K_67&vzqlZo;<+4Q#1_`bxqQ-a>+kYL zDp#m6Tas|P8Nfi03|SIymENjl+9f*2YoBSi4dj)T(2)F6l4~!pq;@ONmIAaW{?W>I zhgq6V3Mj_HP5tRUS?P{fR-S8Rt85x8`{jIYX`yAWi|u5ZWV1{KJI?88Ipqvt1pOh4 zq(a{5%FwlWT>p7QftLF7E?To5eVwMjN`_TgSWCjrp4u!|vP?f)ZtWMN z>ML@{?p&qje6*B&TaIiRk;E+S1nWT^n>~m^l!BQL4^*o(3Gb=36E|M2ncvMY49DcN zERB6p{00Bs)Y0oj4($4{lBM^S~XQ=!A;CZnkfcoEm6OskE znhT2k=_vStjeyCJYDFn&qeuigjKZdXRh`u=K>-%loFz+)S%+_(0zFmV)m5ZP)9}va z=`~4syXziPbq@(c%OuH4FTH7@dUw*HyCwgdq zHc@s)mP`W8WzzGr$NHkBdOX$6l}HQC)Wx>Xem$#t4a0w;`-@0}`oBnyzm|8f!-@KNc0t;R)G#*yd3Rj)f%uVnYF)SG$;eGA^lfVJrcFZCp= zzgabxBW|T$j0oK0kAM(34SuStH>qZ4(L8kCmRGKEj-Ox>5E3)y!bnr5imn}wiJEtd z!p=M$m}2Uki-NsrNLLGPidyuH?81(kmS(< zB5y7H@v+cC6T`hfKWehHv@s;xMv$uP_v09Y#>C2=X-qEPna*D zW^QvD!BnvtV9KfqqWnU@RN=Hunc>RpUepZKmZq1VkrgC| z_Ldq{BVr>vfS8KIw*eb(U4^r;ol{B{VaX@SYX7b1+G?RN^&TwWsak->CGD=Nbet(K z#OBKfcI{EQ#B$@3=%+o&W}fPPIh!gRHoI^B5_h8qtWYm>zk5kGi^&HoTAoM81}K7k zb^9>=Rc!fIO7GpeLjg#If7+dWjf}}rS;B3ud?-5Z70<2Qgs@LKO`-xXN+dpdsru%e zQM_E0VR+y^E)mkv32)-7dBm5FMHm^PZx#ZA-qe2#MjCZI{HdxHa+~mui}^4|1SW-u zP$XN=&f&Ggojo3?ln{AEHi1mNs$_8@rExCcJtz(RF=uMf*zt=D>}$lrv0Ty8sS{qr z!=IkT@?1S&4Y9g7=J~@cp4=8D?=sQ$W+}HOp{-7PbTK2NO_fGr zsn82w-y0hJ95Hj=R-;&HPLV=Om_Kf%^lEo_bKRw3-~ym(w z%pn9qw8&6@H8t85-Lo@vQux+sgLz{k7?$;YAmM}e`=7KNsD`tt6s?amH+mv8KeU{^ zIhk`_lvM|pQBCL3RbzheynpA4Y1Wg$&$zc&8agPq(MOhlL+O?>rznvuG|*$^rtK43 zq9{4Z!^Bu9J~8%?AuEXfJ~Rc={U-M7t`Y;KR^dSpJ@Kbxk!cI=Q9n3Y+jQ@H4nmHu zu5Ot{nLdxqgvrp!Zo}(+8@WasgYd-7GMSX(Zy!<>LLE}^iw@lFkG1>@^s2?H#mKdi zWVR}8`o1LIY{W}!1;TqsKrXJNT#1>Sq;gt%lD0faqQW1HMPfnCB<2&E{h^_NqPAs9 zb9)wBG{BWrrzZiLN~l~1T~>|MtzQYIYM{mL@$dz;`j%UMp^}V{d*sz{3x75&v0y?X zIEd5Cd8{AD#OSCTk_OVG4Xx}f+G^>2+s0~^N!!os)tlfE^OEUY7V37id{Gy8T<+;8 z!lGr!_Y9jUM`~jdEj?Q3qh-z=ya#wow*pI9Q=0c*@YPogbq48Q=w+liiM3`aFTdO3 zT5H)1_*~0~t~yW>#x4`!JcKm-dPYF6Pe3+)*cw9?(KMGTNmw?1aJ6@XPikwm$i$PB zBauT~a_anbo9%+`WEeye;^Ft%Jrtss=U|&XPHWo}*_E#)9^^Rsmbt_CKhS~Au2lBq zapW~C7xR(ubRIrN2VmRLmZN;9OFRnDkHwO44{u?vT#6gcY9>RVP`dkEJ6-=cCv9gA z_QjbODC@lmK2d^CZY$Z;L7zEfb@xOwQ~zWl&&Ci-m?6NhV< zmKN(*yas1_z7L1u&YA(%3Si9whu@1z@6NX>{fP=#tZ~$-+htozEr%fFN=@N;81rMn zt7sR>6YY;X(UKz;k+Rdc*l0PFi-WvZZrzjwyS*d2-O>}2jvr(L$oh)rnp2sryP?+X z1Z_QX*@~gLAEXm-X9(d>!&J)|&HLo+*y>vEs+^}_^7e+uamx6MXO5y41%=8#eJ{Rq z5lBP8XxYxJodBzOr-=unQS8W{dt18*rW%{?y+V5!ucn-dy5D{6IBeoPMI#@ZnkR=h z_$9-08Wy_jLWO?vGoh*5_+Y_w-#GeCtV2sKN^a@MpzmurMi=~M%(@i%WHy1FcWl

yxuluoAUa)Q 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 e$5dTdJUE8Vr11q@ZlFE?)zxY3T5MTxX diff --git a/docs/experiments/neurips-2026-plan.md b/docs/experiments/neurips-2026-plan.md deleted file mode 100644 index ccd614f4..00000000 --- a/docs/experiments/neurips-2026-plan.md +++ /dev/null @@ -1,240 +0,0 @@ -# NeurIPS 2026 Experiment Plan: IPW/IPJ for Local AI - -## Overview -Evaluate and optimize local AI models as OpenClaw agent brains, measuring -accuracy, latency, cost, energy, and FLOPs across 7 benchmarks. - -## Results Storage -All results stored under `results/neurips-2026/`: -``` -results/neurips-2026/ -├── baselines/ # Step 1: Raw model scores -│ ├── {model}/{benchmark}/ # e.g. qwen-9b/pinchbench/ -│ │ ├── results.jsonl # Per-task results -│ │ ├── summary.json # Aggregate metrics -│ │ └── telemetry.json # Energy, power, FLOPs, tokens -│ └── ... -├── agent-optimization/ # Step 2a: Agent improvements -│ ├── gepa/ # GEPA prompt evolution results -│ │ ├── generation_{N}/ # Per-generation best prompts -│ │ └── best_configs/ # Final optimized agent configs -│ ├── dspy/ # DSPy optimization results -│ │ ├── bootstrap/ # BootstrapFewShot results -│ │ └── mipro/ # MIPROv2 results -│ └── agent-configs/ # New agent configurations tested -├── intelligence-optimization/ # Step 2b: Model improvements -│ ├── sft/ # Supervised fine-tuning -│ │ ├── qwen-2b/ # Per-model training runs -│ │ ├── qwen-9b/ -│ │ └── qwen-27b/ -│ ├── lora/ # LoRA fine-tuning -│ │ ├── qwen-2b/ -│ │ ├── qwen-9b/ -│ │ └── qwen-27b/ -│ └── rl/ # Reinforcement learning (GRPO) -│ ├── qwen-2b/ -│ ├── qwen-9b/ -│ └── qwen-27b/ -├── optimized-eval/ # Step 3: Full eval with best configs -│ ├── {model}/{benchmark}/ # Same structure as baselines/ -│ └── ... -└── analysis/ # Charts, tables, comparisons - ├── pareto_frontier.json # IPW/IPJ data points - ├── scaling_curves.json # Accuracy vs model size - ├── cost_comparison.json # Local vs cloud economics - └── figures/ # Generated plots -``` - -## Hardware Stacks - -Run eval metrics across three hardware vendor stacks to show -platform-agnostic IPW/IPJ results: - -| Stack | Server-Class | Workstation/Consumer | -|-------|-------------|---------------------| -| **NVIDIA** | DGX Spark | RTX 6000 Pro | -| **AMD** | MI300x, MI355x | — | -| **Apple** | — | Mac Mini M4, Mac Studio M4 | - -Results stored per-stack under each model's directory: -``` -results/neurips-2026/baselines/{model}/{benchmark}/ -├── nvidia-dgxspark/ -│ ├── results.jsonl -│ ├── telemetry.json # NVML energy, GPU util, power -│ └── summary.json -├── nvidia-rtx6000pro/ -├── amd-mi300x/ -│ ├── telemetry.json # ROCm energy, GPU util, power -│ └── ... -├── amd-mi355x/ -├── apple-macmini-m4/ -│ ├── telemetry.json # Apple powermetrics energy -│ └── ... -└── apple-macstudio-m4/ -``` - -OpenJarvis telemetry already supports all three vendors: -- NVIDIA: `telemetry/nvidia_monitor.py` (NVML) -- AMD: `telemetry/amd_monitor.py` (ROCm SMI) -- Apple: `telemetry/apple_monitor.py` (powermetrics) - -Key comparisons: -- Same model, same benchmark, different hardware → IPW/IPJ per platform -- DGX Spark vs MI300x vs Mac Studio → server-class efficiency frontier -- RTX 6000 Pro vs Mac Mini M4 → consumer/workstation efficiency frontier -- GGUF models (Kimi, MiniMax) run on all platforms via llama.cpp/MLX - -## Models (9 priority + 3 cloud baselines) - -### Cloud Baselines -| ID | Model | Engine | -|----|-------|--------| -| claude-opus | Claude Opus 4.6 | cloud | -| gpt-54 | GPT-5.4 | cloud | -| gemini-31-pro | Gemini 3.1 Pro | cloud | - -### Priority Local Models -| ID | Model | Active Params | Serving | Hardware | -|----|-------|---------------|---------|----------| -| qwen-397b | Qwen3.5-397B-A17B-FP8 | 17B | vLLM | 8x H100 | -| qwen-27b | Qwen3.5-27B-FP8 | 27B | vLLM | 1-2x H100 | -| qwen-9b | Qwen3.5-9B | 9B | vLLM/Ollama | 1x GPU | -| qwen-2b | Qwen3.5-2B | 2B | Ollama | laptop | -| trinity-large | Trinity-Large-Thinking | 13B | vLLM | 4-8x H100 | -| nemotron-nano | Nemotron-3-Nano-30B-A3B | 3B | vLLM | 1x GPU | -| kimi-k25 | Kimi-K2.5 (GGUF) | ~32B | llama.cpp | 2x GPU | -| minimax-m25 | MiniMax-M2.5 (GGUF) | ~45B | llama.cpp | 2-4x GPU | -| lfm-1.2b | LFM2.5-1.2B-Instruct | 1.2B | llama.cpp | CPU | - -## Benchmarks (7) - -| ID | Benchmark | Tasks | Fast Subset | Status | -|----|-----------|-------|-------------|--------| -| pinchbench | PinchBench | 23 | 23 (all) | Implemented | -| taubench | TauBench V2 | 60+40 | 20 A+R | Implemented | -| gaia | GAIA | 50 | 20 | Implemented | -| terminalbench | TerminalBench | varies | 20 | Implemented | -| toolcall15 | ToolCall-15 | 15 | 15 (all) | TODO | -| livecodebench | LiveCodeBench | ~100 | 20 | TODO | -| liveresearch | DeepResearchBench | 100 | 10 | TODO | - -## Metrics Captured Per Run -- accuracy (benchmark-specific) -- latency_seconds (wall clock per task) -- energy_joules (RAPL + NVML) -- power_watts (average during inference) -- cost_usd (API cost for cloud, amortized HW for local) -- prompt_tokens, completion_tokens -- tool_calls_count -- flops_estimated (2 * active_params * total_tokens) -- gpu_utilization_pct -- throughput_tok_per_sec - ---- - -## Step 1: Baseline Sweep - -### Phase 1a: Implement missing benchmarks -- [ ] ToolCall-15 integration -- [ ] LiveCodeBench integration -- [ ] DeepResearchBench integration -- [ ] Wire telemetry capture to all eval runs - -### Phase 1b: Run cloud baselines (no GPU needed) -- [x] Claude Opus — PinchBench (95.65%), TauBench A+R (86.67%), - TauBench Telecom (75%), GAIA (66.67%) -- [x] GPT-5.4 — PinchBench (52-65%), TauBench A+R (81.67%), - TauBench Telecom (75%), GAIA (34.29%) -- [x] Gemini 3.1 Pro — PinchBench (78.26%), TauBench A+R (58.33%), - TauBench Telecom (77.5%), GAIA (47.06%) -- [ ] All 3 cloud baselines — ToolCall-15, LiveCodeBench, DeepResearchBench -- [ ] All 3 cloud baselines — TerminalBench - -### Phase 1c: Run local models (GPU required) -- [x] Qwen-397B — PinchBench (78.26%), TauBench A+R (81.67%) -- [x] Qwen-122B — PinchBench (73.91%), TauBench A+R (80%) -- [x] Qwen-35B — PinchBench (73.91%), TauBench A+R (77.27%) -- [x] Nemotron-Super — PinchBench (78.26%), TauBench A+R (86.67%), - TauBench Telecom (70%), GAIA (48.48%) -- [ ] Qwen-27B — all 7 benchmarks -- [ ] Qwen-9B — all 7 benchmarks -- [ ] Qwen-2B — all 7 benchmarks -- [ ] Trinity-Large — all 7 benchmarks -- [ ] Nemotron-Nano — all 7 benchmarks -- [ ] Kimi-K2.5 — all 7 benchmarks -- [ ] MiniMax-M2.5 — all 7 benchmarks -- [ ] LFM-1.2B — all 7 benchmarks - -### Phase 1d: Compile baseline results -- [ ] Generate Pareto frontier plots (quality vs cost, vs energy, vs FLOPs) -- [ ] Generate scaling curves (accuracy vs active params per benchmark) -- [ ] Compute IPW/IPJ for every (model, benchmark) pair - ---- - -## Step 2: Optimization - -### Phase 2a: Agent optimization -- [ ] GEPA: evolve system prompts for monitor_operative on fast benchmarks -- [ ] GEPA: evolve system prompts for native_openhands on fast benchmarks -- [ ] DSPy BootstrapFewShot: optimize few-shot examples per benchmark -- [ ] DSPy MIPROv2: optimize full prompt pipeline -- [ ] Agent architecture search: test new agent configs -- [ ] Tool selection optimization: find minimal effective tool sets -- [ ] Evaluate optimized agents on all 9 models × fast benchmarks - -### Phase 2b: Intelligence optimization -Training data: -- GeneralThought-430K-filtered (reasoning traces) -- neulab/agent-data-collection (agentic traces) -- GLM-4.7-flash SFT traces (168K + 57K) - -Training targets: -- [ ] Qwen-2B: full SFT on agentic traces -- [ ] Qwen-2B: LoRA on agentic traces -- [ ] Qwen-9B: full SFT on agentic traces -- [ ] Qwen-9B: LoRA on agentic traces -- [ ] Qwen-27B: LoRA on agentic traces -- [ ] Qwen-2B: GRPO RL on benchmark outcomes -- [ ] Qwen-9B: GRPO RL on benchmark outcomes -- [ ] Evaluate all trained checkpoints on fast benchmarks - ---- - -## Step 3: Full Evaluation - -- [ ] Select best Agent config from Step 2a -- [ ] Select best Intelligence checkpoints from Step 2b -- [ ] Run complete 9 × 7 matrix with optimized configs -- [ ] Compute all metrics (accuracy, latency, energy, cost, tokens, FLOPs) -- [ ] Generate final comparison tables and figures -- [ ] Write up results section - ---- - -## Current Progress - -### Completed -- PinchBench harness: fixed and validated (PR #124, #139, #140) -- TauBench V2 native integration (PR #162) -- tool_choice + SQLite fixes (PR #163) -- Gemini thought_signature support -- Nemotron SGLang serving -- 8 models evaluated on PinchBench -- 7 models evaluated on TauBench A+R -- 4 models evaluated on TauBench Telecom -- 4 models evaluated on GAIA - -### In Progress -- Qwen 35B: TauBench telecom + GAIA running -- ToolCall-15 integration: TODO -- LiveCodeBench integration: TODO -- DeepResearchBench integration: TODO -- Telemetry wiring: TODO - -### Blocked -- Qwen 397B telecom + GAIA: needs 8 GPUs -- Trinity-Large: not yet served -- Small models (2B, 9B): configs not yet created -- GGUF models (Kimi, MiniMax): need llama.cpp/Ollama serving setup diff --git a/scripts/migrate_savings_single_provider.sql b/scripts/migrate_savings_single_provider.sql deleted file mode 100644 index e6e42eb8..00000000 --- a/scripts/migrate_savings_single_provider.sql +++ /dev/null @@ -1,37 +0,0 @@ --- Migration: Recompute dollar_savings to use only Claude Opus 4.6 pricing --- ----------------------------------------------------------------------- --- Previously the frontend summed hypothetical costs across all 3 cloud --- providers (GPT-5.3 + Claude Opus 4.6 + Gemini 3.1 Pro). This --- migration recalculates dollar_savings using Claude Opus 4.6 only. --- --- Derivation --- ---------- --- Let P = prompt_tokens, C = completion_tokens, T = total_tokens = P + C. --- --- old = (P/1M)*(2+5+2) + (C/1M)*(10+25+12) = (P/1M)*9 + (C/1M)*47 --- new = (P/1M)*5 + (C/1M)*25 --- --- Solving the system {T = P + C, old = 9P/1M + 47C/1M} for P and C and --- substituting into the "new" formula gives: --- --- new = T / 3_800_000 + 10 * old / 19 --- --- Run this in the Supabase SQL Editor (Dashboard > SQL Editor). --- ----------------------------------------------------------------------- - -BEGIN; - --- Preview the changes first (uncomment the SELECT, comment the UPDATE) --- SELECT --- display_name, --- dollar_savings AS old_savings, --- total_tokens / 3800000.0 + 10.0 * dollar_savings / 19.0 AS new_savings --- FROM savings_entries --- WHERE dollar_savings > 0 --- ORDER BY dollar_savings DESC; - -UPDATE savings_entries -SET dollar_savings = total_tokens / 3800000.0 + 10.0 * dollar_savings / 19.0 -WHERE dollar_savings > 0; - -COMMIT; diff --git a/src/openjarvis/agents/react.py b/src/openjarvis/agents/react.py deleted file mode 100644 index 1cd478aa..00000000 --- a/src/openjarvis/agents/react.py +++ /dev/null @@ -1,6 +0,0 @@ -"""Backward-compat shim -- canonical location is agents.native_react.""" - -from openjarvis.agents.native_react import REACT_SYSTEM_PROMPT # noqa: F401 -from openjarvis.agents.native_react import NativeReActAgent as ReActAgent # noqa: F401 - -__all__ = ["ReActAgent", "REACT_SYSTEM_PROMPT"] diff --git a/src/openjarvis/intelligence/_stubs.py b/src/openjarvis/intelligence/_stubs.py deleted file mode 100644 index 9b729fd7..00000000 --- a/src/openjarvis/intelligence/_stubs.py +++ /dev/null @@ -1,5 +0,0 @@ -"""Backward-compat shim — canonical location is learning._stubs.""" - -from openjarvis.learning._stubs import QueryAnalyzer, RouterPolicy # noqa: F401 - -__all__ = ["QueryAnalyzer", "RouterPolicy"] diff --git a/src/openjarvis/intelligence/router.py b/src/openjarvis/intelligence/router.py deleted file mode 100644 index 6ab3d94e..00000000 --- a/src/openjarvis/intelligence/router.py +++ /dev/null @@ -1,9 +0,0 @@ -"""Backward-compat shim — canonical location is learning.router.""" - -from openjarvis.learning.routing.router import ( # noqa: F401 - DefaultQueryAnalyzer, - HeuristicRouter, - build_routing_context, -) - -__all__ = ["DefaultQueryAnalyzer", "HeuristicRouter", "build_routing_context"] diff --git a/src/openjarvis/optimize/__init__.py b/src/openjarvis/optimize/__init__.py deleted file mode 100644 index f1c5dd81..00000000 --- a/src/openjarvis/optimize/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Backward-compatibility shim -- optimize moved to learning.optimize.""" - -from openjarvis.learning.optimize import * # noqa: F401,F403 -from openjarvis.learning.optimize import __all__ # noqa: F401 diff --git a/src/openjarvis/optimize/config.py b/src/openjarvis/optimize/config.py deleted file mode 100644 index 84c7cf1d..00000000 --- a/src/openjarvis/optimize/config.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Backward-compatibility shim -- optimize.config moved to learning.optimize.config.""" - -from openjarvis.learning.optimize.config import * # noqa: F401,F403 -from openjarvis.learning.optimize.config import __all__ # noqa: F401 diff --git a/src/openjarvis/optimize/feedback/__init__.py b/src/openjarvis/optimize/feedback/__init__.py deleted file mode 100644 index 009c6a69..00000000 --- a/src/openjarvis/optimize/feedback/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Backward-compat shim: moved to learning.optimize.""" - -from openjarvis.learning.optimize.feedback import * # noqa: F401,F403 -from openjarvis.learning.optimize.feedback import __all__ # noqa: F401 diff --git a/src/openjarvis/optimize/feedback/collector.py b/src/openjarvis/optimize/feedback/collector.py deleted file mode 100644 index 273de082..00000000 --- a/src/openjarvis/optimize/feedback/collector.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Backward-compat shim: moved to learning.optimize.""" - -from openjarvis.learning.optimize.feedback.collector import * # noqa: F401,F403 -from openjarvis.learning.optimize.feedback.collector import __all__ # noqa: F401 diff --git a/src/openjarvis/optimize/feedback/judge.py b/src/openjarvis/optimize/feedback/judge.py deleted file mode 100644 index 1df46313..00000000 --- a/src/openjarvis/optimize/feedback/judge.py +++ /dev/null @@ -1,7 +0,0 @@ -"""Backward-compat shim: moved to learning.optimize.""" - -from openjarvis.learning.optimize.feedback.judge import * # noqa: F401,F403 -from openjarvis.learning.optimize.feedback.judge import ( - __all__, # noqa: F401 - _parse_score, # noqa: F401 -) diff --git a/src/openjarvis/optimize/llm_optimizer.py b/src/openjarvis/optimize/llm_optimizer.py deleted file mode 100644 index 8db1a0bd..00000000 --- a/src/openjarvis/optimize/llm_optimizer.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Backward-compat shim: moved to learning.optimize.""" - -from openjarvis.learning.optimize.llm_optimizer import * # noqa: F401,F403 -from openjarvis.learning.optimize.llm_optimizer import __all__ # noqa: F401 diff --git a/src/openjarvis/optimize/optimizer.py b/src/openjarvis/optimize/optimizer.py deleted file mode 100644 index 8270d06b..00000000 --- a/src/openjarvis/optimize/optimizer.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Backward-compat shim: moved to learning.optimize.""" - -from openjarvis.learning.optimize.optimizer import * # noqa: F401,F403 -from openjarvis.learning.optimize.optimizer import __all__ # noqa: F401 diff --git a/src/openjarvis/optimize/personal/__init__.py b/src/openjarvis/optimize/personal/__init__.py deleted file mode 100644 index 7cea95cd..00000000 --- a/src/openjarvis/optimize/personal/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Backward-compat shim: moved to learning.optimize.""" - -from openjarvis.learning.optimize.personal import * # noqa: F401,F403 -from openjarvis.learning.optimize.personal import __all__ # noqa: F401 diff --git a/src/openjarvis/optimize/personal/dataset.py b/src/openjarvis/optimize/personal/dataset.py deleted file mode 100644 index 223960d5..00000000 --- a/src/openjarvis/optimize/personal/dataset.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Backward-compat shim: moved to learning.optimize.""" - -from openjarvis.learning.optimize.personal.dataset import * # noqa: F401,F403 -from openjarvis.learning.optimize.personal.dataset import __all__ # noqa: F401 diff --git a/src/openjarvis/optimize/personal/scorer.py b/src/openjarvis/optimize/personal/scorer.py deleted file mode 100644 index 6db2e551..00000000 --- a/src/openjarvis/optimize/personal/scorer.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Backward-compat shim: moved to learning.optimize.""" - -from openjarvis.learning.optimize.personal.scorer import * # noqa: F401,F403 -from openjarvis.learning.optimize.personal.scorer import __all__ # noqa: F401 diff --git a/src/openjarvis/optimize/personal/synthesizer.py b/src/openjarvis/optimize/personal/synthesizer.py deleted file mode 100644 index 29c810d5..00000000 --- a/src/openjarvis/optimize/personal/synthesizer.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Backward-compat shim: moved to learning.optimize.""" - -from openjarvis.learning.optimize.personal.synthesizer import * # noqa: F401,F403 -from openjarvis.learning.optimize.personal.synthesizer import __all__ # noqa: F401 diff --git a/src/openjarvis/optimize/search_space.py b/src/openjarvis/optimize/search_space.py deleted file mode 100644 index 6e274cf3..00000000 --- a/src/openjarvis/optimize/search_space.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Backward-compat shim: moved to learning.optimize.""" - -from openjarvis.learning.optimize.search_space import * # noqa: F401,F403 -from openjarvis.learning.optimize.search_space import __all__ # noqa: F401 diff --git a/src/openjarvis/optimize/store.py b/src/openjarvis/optimize/store.py deleted file mode 100644 index bdd232da..00000000 --- a/src/openjarvis/optimize/store.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Backward-compatibility shim -- optimize.store moved to learning.optimize.store.""" - -from openjarvis.learning.optimize.store import * # noqa: F401,F403 -from openjarvis.learning.optimize.store import __all__ # noqa: F401 diff --git a/src/openjarvis/optimize/trial_runner.py b/src/openjarvis/optimize/trial_runner.py deleted file mode 100644 index 4dab8ed3..00000000 --- a/src/openjarvis/optimize/trial_runner.py +++ /dev/null @@ -1,4 +0,0 @@ -"""Backward-compat shim: moved to learning.optimize.""" - -from openjarvis.learning.optimize.trial_runner import * # noqa: F401,F403 -from openjarvis.learning.optimize.trial_runner import __all__ # noqa: F401 diff --git a/src/openjarvis/optimize/types.py b/src/openjarvis/optimize/types.py deleted file mode 100644 index fafadafb..00000000 --- a/src/openjarvis/optimize/types.py +++ /dev/null @@ -1,7 +0,0 @@ -"""Backward-compatibility shim -- optimize.types moved to learning.optimize.types.""" - -from openjarvis.learning.optimize.types import * # noqa: F401,F403 -from openjarvis.learning.optimize.types import ( - _PARAM_TO_RECIPE, # noqa: F401 - __all__, # noqa: F401 -) diff --git a/tests/agents/test_backward_compat.py b/tests/agents/test_backward_compat.py deleted file mode 100644 index 1d7a8e64..00000000 --- a/tests/agents/test_backward_compat.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Tests for backward compatibility of renamed agents.""" - -from __future__ import annotations - -from unittest.mock import MagicMock - -from openjarvis.agents.native_react import NativeReActAgent -from openjarvis.core.registry import AgentRegistry - - -class TestReActBackwardCompat: - def test_old_import_path(self): - """Old import ``from openjarvis.agents.react import ReActAgent`` works.""" - from openjarvis.agents.react import ReActAgent - - # ReActAgent is actually NativeReActAgent - assert ReActAgent is NativeReActAgent - - def test_registry_alias(self): - """``AgentRegistry.get("react")`` returns NativeReActAgent.""" - # Ensure registration - AgentRegistry.register_value("native_react", NativeReActAgent) - if not AgentRegistry.contains("react"): - AgentRegistry.register_value("react", NativeReActAgent) - - react_cls = AgentRegistry.get("react") - native_cls = AgentRegistry.get("native_react") - assert react_cls is native_cls - - def test_old_class_instantiates(self): - """ReActAgent (alias) can be instantiated and has correct agent_id.""" - from openjarvis.agents.react import ReActAgent - - engine = MagicMock() - engine.engine_id = "mock" - agent = ReActAgent(engine, "test-model") - assert agent.agent_id == "native_react" - - def test_react_system_prompt_importable(self): - """REACT_SYSTEM_PROMPT can be imported from old path.""" - from openjarvis.agents.react import REACT_SYSTEM_PROMPT - - assert "ReAct" in REACT_SYSTEM_PROMPT diff --git a/tests/agents/test_react.py b/tests/agents/test_react.py deleted file mode 100644 index 871c1590..00000000 --- a/tests/agents/test_react.py +++ /dev/null @@ -1,44 +0,0 @@ -"""Backward-compat tests: ensure old import paths still work. - -The canonical tests are in test_native_react.py. This file verifies -that ``from openjarvis.agents.react import ReActAgent`` still works -and produces a working agent. -""" - -from __future__ import annotations - -from unittest.mock import MagicMock - -from openjarvis.agents.native_react import NativeReActAgent -from openjarvis.agents.react import ReActAgent - - -def _engine_response(content): - return { - "content": content, - "usage": {"prompt_tokens": 10, "completion_tokens": 5, "total_tokens": 15}, - "model": "test-model", - "finish_reason": "stop", - } - - -class TestReActShim: - def test_is_native_react(self): - """ReActAgent imported from old path is NativeReActAgent.""" - assert ReActAgent is NativeReActAgent - - def test_can_instantiate(self): - engine = MagicMock() - engine.engine_id = "mock" - agent = ReActAgent(engine, "test-model") - assert agent.agent_id == "native_react" - - def test_can_run(self): - engine = MagicMock() - engine.engine_id = "mock" - engine.generate.return_value = _engine_response( - "Thought: Simple.\nFinal Answer: Hello!" - ) - agent = ReActAgent(engine, "test-model") - result = agent.run("Hello") - assert result.content == "Hello!" diff --git a/tests/channels/channel_test_helpers.py b/tests/channels/channel_test_helpers.py new file mode 100644 index 00000000..c0d53b66 --- /dev/null +++ b/tests/channels/channel_test_helpers.py @@ -0,0 +1,65 @@ +"""Shared parametrized tests for channel implementations. + +Every channel must pass these baseline tests. Import and call +``make_common_channel_tests`` to generate a test class. +""" + +from __future__ import annotations + +from unittest.mock import MagicMock + +from openjarvis.channels._stubs import ChannelStatus +from openjarvis.core.registry import ChannelRegistry + + +def make_common_channel_tests( + channel_cls, + channel_key: str, + *, + constructor_kwargs: dict | None = None, +): + """Return a test class that validates common channel contract. + + Usage in each test file:: + + from tests.channels.channel_test_helpers import ( + make_common_channel_tests, + ) + TestCommonChannel = make_common_channel_tests( + SlackChannel, "slack", + constructor_kwargs={"bot_token": "xoxb-test"}, + ) + """ + kwargs = constructor_kwargs or {} + + class CommonChannelTests: + def test_registry_key(self): + assert ChannelRegistry.contains(channel_key) + + def test_channel_id(self): + ch = channel_cls(**kwargs) + assert ch.channel_id == channel_key + + def test_list_channels(self): + ch = channel_cls(**kwargs) + assert ch.list_channels() == [channel_key] + + def test_disconnected_initially(self): + ch = channel_cls(**kwargs) + assert ch.status() == ChannelStatus.DISCONNECTED + + def test_on_message_registers_handler(self): + ch = channel_cls(**kwargs) + handler = MagicMock() + ch.on_message(handler) + assert handler in ch._handlers + + def test_disconnect(self): + ch = channel_cls(**kwargs) + ch._status = ChannelStatus.CONNECTED + ch.disconnect() + assert ch.status() == ChannelStatus.DISCONNECTED + + CommonChannelTests.__name__ = f"TestCommon_{channel_key}" + CommonChannelTests.__qualname__ = f"TestCommon_{channel_key}" + return CommonChannelTests diff --git a/tests/channels/test_bluebubbles.py b/tests/channels/test_bluebubbles.py index bb4f9664..1fe9a03f 100644 --- a/tests/channels/test_bluebubbles.py +++ b/tests/channels/test_bluebubbles.py @@ -11,6 +11,7 @@ from openjarvis.channels._stubs import ChannelStatus from openjarvis.channels.bluebubbles import BlueBubblesChannel from openjarvis.core.events import EventBus, EventType from openjarvis.core.registry import ChannelRegistry +from tests.channels.channel_test_helpers import make_common_channel_tests @pytest.fixture(autouse=True) @@ -20,13 +21,11 @@ def _register_bluebubbles(): ChannelRegistry.register_value("bluebubbles", BlueBubblesChannel) -class TestRegistration: - def test_registry_key(self): - assert ChannelRegistry.contains("bluebubbles") - - def test_channel_id(self): - ch = BlueBubblesChannel(url="http://localhost:1234", password="test-pass") - assert ch.channel_id == "bluebubbles" +TestCommonChannel = make_common_channel_tests( + BlueBubblesChannel, + "bluebubbles", + constructor_kwargs={"url": "http://localhost:1234", "password": "test-pass"}, +) class TestInit: @@ -125,34 +124,8 @@ class TestSend: assert EventType.CHANNEL_MESSAGE_SENT in event_types -class TestListChannels: - def test_list_channels(self): - ch = BlueBubblesChannel(url="http://localhost:1234", password="test-pass") - assert ch.list_channels() == ["bluebubbles"] - - class TestStatus: - def test_disconnected_initially(self): - ch = BlueBubblesChannel(url="http://localhost:1234", password="test-pass") - assert ch.status() == ChannelStatus.DISCONNECTED - def test_no_url_connect_error(self): ch = BlueBubblesChannel() ch.connect() assert ch.status() == ChannelStatus.ERROR - - -class TestOnMessage: - def test_on_message(self): - ch = BlueBubblesChannel(url="http://localhost:1234", password="test-pass") - handler = MagicMock() - ch.on_message(handler) - assert handler in ch._handlers - - -class TestDisconnect: - def test_disconnect(self): - ch = BlueBubblesChannel(url="http://localhost:1234", password="test-pass") - ch._status = ChannelStatus.CONNECTED - ch.disconnect() - assert ch.status() == ChannelStatus.DISCONNECTED diff --git a/tests/channels/test_discord_channel.py b/tests/channels/test_discord_channel.py index b293db82..1630c908 100644 --- a/tests/channels/test_discord_channel.py +++ b/tests/channels/test_discord_channel.py @@ -11,6 +11,7 @@ from openjarvis.channels._stubs import ChannelStatus from openjarvis.channels.discord_channel import DiscordChannel from openjarvis.core.events import EventBus, EventType from openjarvis.core.registry import ChannelRegistry +from tests.channels.channel_test_helpers import make_common_channel_tests @pytest.fixture(autouse=True) @@ -20,13 +21,9 @@ def _register_discord(): ChannelRegistry.register_value("discord", DiscordChannel) -class TestRegistration: - def test_registry_key(self): - assert ChannelRegistry.contains("discord") - - def test_channel_id(self): - ch = DiscordChannel(bot_token="test-token") - assert ch.channel_id == "discord" +TestCommonChannel = make_common_channel_tests( + DiscordChannel, "discord", constructor_kwargs={"bot_token": "test-token"} +) class TestInit: @@ -117,34 +114,8 @@ class TestSend: assert EventType.CHANNEL_MESSAGE_SENT in event_types -class TestListChannels: - def test_list_channels(self): - ch = DiscordChannel(bot_token="my-bot-token") - assert ch.list_channels() == ["discord"] - - class TestStatus: - def test_disconnected_initially(self): - ch = DiscordChannel(bot_token="my-bot-token") - assert ch.status() == ChannelStatus.DISCONNECTED - def test_no_token_connect_error(self): ch = DiscordChannel() ch.connect() assert ch.status() == ChannelStatus.ERROR - - -class TestOnMessage: - def test_on_message(self): - ch = DiscordChannel(bot_token="my-bot-token") - handler = MagicMock() - ch.on_message(handler) - assert handler in ch._handlers - - -class TestDisconnect: - def test_disconnect(self): - ch = DiscordChannel(bot_token="my-bot-token") - ch._status = ChannelStatus.CONNECTED - ch.disconnect() - assert ch.status() == ChannelStatus.DISCONNECTED diff --git a/tests/channels/test_email_channel.py b/tests/channels/test_email_channel.py index 0aa5e8b6..dd009f4f 100644 --- a/tests/channels/test_email_channel.py +++ b/tests/channels/test_email_channel.py @@ -11,6 +11,7 @@ from openjarvis.channels._stubs import ChannelStatus from openjarvis.channels.email_channel import EmailChannel from openjarvis.core.events import EventBus, EventType from openjarvis.core.registry import ChannelRegistry +from tests.channels.channel_test_helpers import make_common_channel_tests @pytest.fixture(autouse=True) @@ -20,16 +21,14 @@ def _register_email(): ChannelRegistry.register_value("email", EmailChannel) -class TestRegistration: - def test_registry_key(self): - assert ChannelRegistry.contains("email") - - def test_channel_id(self): - ch = EmailChannel( - smtp_host="smtp.example.com", - username="user@example.com", - ) - assert ch.channel_id == "email" +TestCommonChannel = make_common_channel_tests( + EmailChannel, + "email", + constructor_kwargs={ + "smtp_host": "smtp.example.com", + "username": "user@example.com", + }, +) class TestInit: @@ -170,17 +169,7 @@ class TestSend: assert sent_msg["Subject"] == "Custom Subject" -class TestListChannels: - def test_list_channels(self): - ch = EmailChannel(smtp_host="smtp.example.com", username="user@example.com") - assert ch.list_channels() == ["email"] - - class TestStatus: - def test_disconnected_initially(self): - ch = EmailChannel(smtp_host="smtp.example.com", username="user@example.com") - assert ch.status() == ChannelStatus.DISCONNECTED - def test_no_config_connect_error(self): ch = EmailChannel() ch.connect() @@ -197,22 +186,3 @@ class TestConnect: assert ch.status() == ChannelStatus.CONNECTED # No IMAP, so no listener thread assert ch._listener_thread is None - - -class TestOnMessage: - def test_on_message(self): - ch = EmailChannel(smtp_host="smtp.example.com", username="user@example.com") - handler = MagicMock() - ch.on_message(handler) - assert handler in ch._handlers - - -class TestDisconnect: - def test_disconnect(self): - ch = EmailChannel( - smtp_host="smtp.example.com", - username="user@example.com", - ) - ch._status = ChannelStatus.CONNECTED - ch.disconnect() - assert ch.status() == ChannelStatus.DISCONNECTED diff --git a/tests/channels/test_feishu.py b/tests/channels/test_feishu.py index a647a333..ed36ccb2 100644 --- a/tests/channels/test_feishu.py +++ b/tests/channels/test_feishu.py @@ -11,6 +11,7 @@ from openjarvis.channels._stubs import ChannelStatus from openjarvis.channels.feishu import FeishuChannel from openjarvis.core.events import EventBus, EventType from openjarvis.core.registry import ChannelRegistry +from tests.channels.channel_test_helpers import make_common_channel_tests @pytest.fixture(autouse=True) @@ -20,13 +21,11 @@ def _register_feishu(): ChannelRegistry.register_value("feishu", FeishuChannel) -class TestRegistration: - def test_registry_key(self): - assert ChannelRegistry.contains("feishu") - - def test_channel_id(self): - ch = FeishuChannel(app_id="test-id", app_secret="test-secret") - assert ch.channel_id == "feishu" +TestCommonChannel = make_common_channel_tests( + FeishuChannel, + "feishu", + constructor_kwargs={"app_id": "test-id", "app_secret": "test-secret"}, +) class TestInit: @@ -123,34 +122,8 @@ class TestSend: assert EventType.CHANNEL_MESSAGE_SENT in event_types -class TestListChannels: - def test_list_channels(self): - ch = FeishuChannel(app_id="test-id", app_secret="test-secret") - assert ch.list_channels() == ["feishu"] - - class TestStatus: - def test_disconnected_initially(self): - ch = FeishuChannel(app_id="test-id", app_secret="test-secret") - assert ch.status() == ChannelStatus.DISCONNECTED - def test_no_config_connect_error(self): ch = FeishuChannel() ch.connect() assert ch.status() == ChannelStatus.ERROR - - -class TestOnMessage: - def test_on_message(self): - ch = FeishuChannel(app_id="test-id", app_secret="test-secret") - handler = MagicMock() - ch.on_message(handler) - assert handler in ch._handlers - - -class TestDisconnect: - def test_disconnect(self): - ch = FeishuChannel(app_id="test-id", app_secret="test-secret") - ch._status = ChannelStatus.CONNECTED - ch.disconnect() - assert ch.status() == ChannelStatus.DISCONNECTED diff --git a/tests/channels/test_google_chat.py b/tests/channels/test_google_chat.py index 082cb7a1..522bf4d9 100644 --- a/tests/channels/test_google_chat.py +++ b/tests/channels/test_google_chat.py @@ -11,6 +11,7 @@ from openjarvis.channels._stubs import ChannelStatus from openjarvis.channels.google_chat import GoogleChatChannel from openjarvis.core.events import EventBus, EventType from openjarvis.core.registry import ChannelRegistry +from tests.channels.channel_test_helpers import make_common_channel_tests @pytest.fixture(autouse=True) @@ -20,15 +21,13 @@ def _register_google_chat(): ChannelRegistry.register_value("google_chat", GoogleChatChannel) -class TestRegistration: - def test_registry_key(self): - assert ChannelRegistry.contains("google_chat") - - def test_channel_id(self): - ch = GoogleChatChannel( - webhook_url="https://chat.googleapis.com/v1/spaces/xxx/messages?key=yyy" - ) - assert ch.channel_id == "google_chat" +TestCommonChannel = make_common_channel_tests( + GoogleChatChannel, + "google_chat", + constructor_kwargs={ + "webhook_url": "https://chat.googleapis.com/v1/spaces/xxx/messages?key=yyy" + }, +) class TestInit: @@ -133,42 +132,8 @@ class TestSend: assert EventType.CHANNEL_MESSAGE_SENT in event_types -class TestListChannels: - def test_list_channels(self): - ch = GoogleChatChannel( - webhook_url="https://chat.googleapis.com/v1/spaces/xxx/messages?key=yyy" - ) - assert ch.list_channels() == ["google_chat"] - - class TestStatus: - def test_disconnected_initially(self): - ch = GoogleChatChannel( - webhook_url="https://chat.googleapis.com/v1/spaces/xxx/messages?key=yyy" - ) - assert ch.status() == ChannelStatus.DISCONNECTED - def test_no_url_connect_error(self): ch = GoogleChatChannel() ch.connect() assert ch.status() == ChannelStatus.ERROR - - -class TestOnMessage: - def test_on_message(self): - ch = GoogleChatChannel( - webhook_url="https://chat.googleapis.com/v1/spaces/xxx/messages?key=yyy" - ) - handler = MagicMock() - ch.on_message(handler) - assert handler in ch._handlers - - -class TestDisconnect: - def test_disconnect(self): - ch = GoogleChatChannel( - webhook_url="https://chat.googleapis.com/v1/spaces/xxx/messages?key=yyy" - ) - ch._status = ChannelStatus.CONNECTED - ch.disconnect() - assert ch.status() == ChannelStatus.DISCONNECTED diff --git a/tests/channels/test_irc_channel.py b/tests/channels/test_irc_channel.py index e754f682..96b41412 100644 --- a/tests/channels/test_irc_channel.py +++ b/tests/channels/test_irc_channel.py @@ -11,6 +11,7 @@ from openjarvis.channels._stubs import ChannelStatus from openjarvis.channels.irc_channel import IRCChannel from openjarvis.core.events import EventBus, EventType from openjarvis.core.registry import ChannelRegistry +from tests.channels.channel_test_helpers import make_common_channel_tests @pytest.fixture(autouse=True) @@ -20,13 +21,15 @@ def _register_irc(): ChannelRegistry.register_value("irc", IRCChannel) -class TestRegistration: - def test_registry_key(self): - assert ChannelRegistry.contains("irc") - - def test_channel_id(self): - ch = IRCChannel(server="irc.example.com", nick="jarvis", password="pass123") - assert ch.channel_id == "irc" +TestCommonChannel = make_common_channel_tests( + IRCChannel, + "irc", + constructor_kwargs={ + "server": "irc.example.com", + "nick": "jarvis", + "password": "pass123", + }, +) class TestInit: @@ -121,34 +124,8 @@ class TestSend: assert EventType.CHANNEL_MESSAGE_SENT in event_types -class TestListChannels: - def test_list_channels(self): - ch = IRCChannel(server="irc.example.com", nick="jarvis", password="pass123") - assert ch.list_channels() == ["irc"] - - class TestStatus: - def test_disconnected_initially(self): - ch = IRCChannel(server="irc.example.com", nick="jarvis", password="pass123") - assert ch.status() == ChannelStatus.DISCONNECTED - def test_no_server_connect_error(self): ch = IRCChannel() ch.connect() assert ch.status() == ChannelStatus.ERROR - - -class TestOnMessage: - def test_on_message(self): - ch = IRCChannel(server="irc.example.com", nick="jarvis", password="pass123") - handler = MagicMock() - ch.on_message(handler) - assert handler in ch._handlers - - -class TestDisconnect: - def test_disconnect(self): - ch = IRCChannel(server="irc.example.com", nick="jarvis", password="pass123") - ch._status = ChannelStatus.CONNECTED - ch.disconnect() - assert ch.status() == ChannelStatus.DISCONNECTED diff --git a/tests/channels/test_matrix_channel.py b/tests/channels/test_matrix_channel.py index 298641af..cafccbd6 100644 --- a/tests/channels/test_matrix_channel.py +++ b/tests/channels/test_matrix_channel.py @@ -11,6 +11,7 @@ from openjarvis.channels._stubs import ChannelStatus from openjarvis.channels.matrix_channel import MatrixChannel from openjarvis.core.events import EventBus, EventType from openjarvis.core.registry import ChannelRegistry +from tests.channels.channel_test_helpers import make_common_channel_tests @pytest.fixture(autouse=True) @@ -20,16 +21,14 @@ def _register_matrix(): ChannelRegistry.register_value("matrix", MatrixChannel) -class TestRegistration: - def test_registry_key(self): - assert ChannelRegistry.contains("matrix") - - def test_channel_id(self): - ch = MatrixChannel( - homeserver="https://matrix.example.com", - access_token="test-token", - ) - assert ch.channel_id == "matrix" +TestCommonChannel = make_common_channel_tests( + MatrixChannel, + "matrix", + constructor_kwargs={ + "homeserver": "https://matrix.example.com", + "access_token": "test-token", + }, +) class TestInit: @@ -137,46 +136,8 @@ class TestSend: assert EventType.CHANNEL_MESSAGE_SENT in event_types -class TestListChannels: - def test_list_channels(self): - ch = MatrixChannel( - homeserver="https://matrix.example.com", - access_token="test-token", - ) - assert ch.list_channels() == ["matrix"] - - class TestStatus: - def test_disconnected_initially(self): - ch = MatrixChannel( - homeserver="https://matrix.example.com", - access_token="test-token", - ) - assert ch.status() == ChannelStatus.DISCONNECTED - def test_no_homeserver_connect_error(self): ch = MatrixChannel() ch.connect() assert ch.status() == ChannelStatus.ERROR - - -class TestOnMessage: - def test_on_message(self): - ch = MatrixChannel( - homeserver="https://matrix.example.com", - access_token="test-token", - ) - handler = MagicMock() - ch.on_message(handler) - assert handler in ch._handlers - - -class TestDisconnect: - def test_disconnect(self): - ch = MatrixChannel( - homeserver="https://matrix.example.com", - access_token="test-token", - ) - ch._status = ChannelStatus.CONNECTED - ch.disconnect() - assert ch.status() == ChannelStatus.DISCONNECTED diff --git a/tests/channels/test_mattermost.py b/tests/channels/test_mattermost.py index dd7d2fa0..ad684060 100644 --- a/tests/channels/test_mattermost.py +++ b/tests/channels/test_mattermost.py @@ -11,6 +11,7 @@ from openjarvis.channels._stubs import ChannelStatus from openjarvis.channels.mattermost import MattermostChannel from openjarvis.core.events import EventBus, EventType from openjarvis.core.registry import ChannelRegistry +from tests.channels.channel_test_helpers import make_common_channel_tests @pytest.fixture(autouse=True) @@ -20,13 +21,11 @@ def _register_mattermost(): ChannelRegistry.register_value("mattermost", MattermostChannel) -class TestRegistration: - def test_registry_key(self): - assert ChannelRegistry.contains("mattermost") - - def test_channel_id(self): - ch = MattermostChannel(url="https://mattermost.example.com", token="test-token") - assert ch.channel_id == "mattermost" +TestCommonChannel = make_common_channel_tests( + MattermostChannel, + "mattermost", + constructor_kwargs={"url": "https://mattermost.example.com", "token": "test-token"}, +) class TestInit: @@ -135,34 +134,8 @@ class TestSend: assert EventType.CHANNEL_MESSAGE_SENT in event_types -class TestListChannels: - def test_list_channels(self): - ch = MattermostChannel(url="https://mattermost.example.com", token="test-token") - assert ch.list_channels() == ["mattermost"] - - class TestStatus: - def test_disconnected_initially(self): - ch = MattermostChannel(url="https://mattermost.example.com", token="test-token") - assert ch.status() == ChannelStatus.DISCONNECTED - def test_no_url_connect_error(self): ch = MattermostChannel() ch.connect() assert ch.status() == ChannelStatus.ERROR - - -class TestOnMessage: - def test_on_message(self): - ch = MattermostChannel(url="https://mattermost.example.com", token="test-token") - handler = MagicMock() - ch.on_message(handler) - assert handler in ch._handlers - - -class TestDisconnect: - def test_disconnect(self): - ch = MattermostChannel(url="https://mattermost.example.com", token="test-token") - ch._status = ChannelStatus.CONNECTED - ch.disconnect() - assert ch.status() == ChannelStatus.DISCONNECTED diff --git a/tests/channels/test_sendblue.py b/tests/channels/test_sendblue.py index 8a707192..0217f09a 100644 --- a/tests/channels/test_sendblue.py +++ b/tests/channels/test_sendblue.py @@ -12,26 +12,35 @@ from unittest.mock import MagicMock, patch import pytest from openjarvis.channels._stubs import ChannelStatus +from openjarvis.channels.sendblue import SendBlueChannel from openjarvis.core.events import EventBus, EventType from openjarvis.core.registry import ChannelRegistry +from tests.channels.channel_test_helpers import make_common_channel_tests @pytest.fixture(autouse=True) def _register_sendblue(): if not ChannelRegistry.contains("sendblue"): - from openjarvis.channels.sendblue import SendBlueChannel - ChannelRegistry.register_value("sendblue", SendBlueChannel) +TestCommonChannel = make_common_channel_tests( + SendBlueChannel, + "sendblue", + constructor_kwargs={ + "api_key_id": "test_key", + "api_secret_key": "test_secret", + "from_number": "+15551234567", + }, +) + + # --------------------------------------------------------------------------- # Helpers # --------------------------------------------------------------------------- def _make_channel(**overrides): - from openjarvis.channels.sendblue import SendBlueChannel - defaults = { "api_key_id": "test_key", "api_secret_key": "test_secret", @@ -69,16 +78,12 @@ class TestInit: monkeypatch.setenv("SENDBLUE_API_SECRET_KEY", "env_secret") monkeypatch.setenv("SENDBLUE_FROM_NUMBER", "+19998887777") - from openjarvis.channels.sendblue import SendBlueChannel - ch = SendBlueChannel() assert ch._api_key_id == "env_key" assert ch._api_secret_key == "env_secret" assert ch._from_number == "+19998887777" def test_no_credentials(self): - from openjarvis.channels.sendblue import SendBlueChannel - ch = SendBlueChannel() ch.connect() assert ch.status() == ChannelStatus.ERROR @@ -141,8 +146,6 @@ class TestSend: assert result is False def test_send_no_credentials_returns_false(self): - from openjarvis.channels.sendblue import SendBlueChannel - ch = SendBlueChannel() result = ch.send("+19998887777", "Hello!") assert result is False @@ -261,7 +264,3 @@ class TestProperties: def test_from_number(self): ch = _make_channel(from_number="+15559876543") assert ch.from_number == "+15559876543" - - def test_list_channels(self): - ch = _make_channel() - assert ch.list_channels() == ["sendblue"] diff --git a/tests/channels/test_signal_channel.py b/tests/channels/test_signal_channel.py index 34c83606..acbca29b 100644 --- a/tests/channels/test_signal_channel.py +++ b/tests/channels/test_signal_channel.py @@ -11,6 +11,7 @@ from openjarvis.channels._stubs import ChannelStatus from openjarvis.channels.signal_channel import SignalChannel from openjarvis.core.events import EventBus, EventType from openjarvis.core.registry import ChannelRegistry +from tests.channels.channel_test_helpers import make_common_channel_tests @pytest.fixture(autouse=True) @@ -20,13 +21,14 @@ def _register_signal(): ChannelRegistry.register_value("signal", SignalChannel) -class TestRegistration: - def test_registry_key(self): - assert ChannelRegistry.contains("signal") - - def test_channel_id(self): - ch = SignalChannel(api_url="http://localhost:8080", phone_number="+1234567890") - assert ch.channel_id == "signal" +TestCommonChannel = make_common_channel_tests( + SignalChannel, + "signal", + constructor_kwargs={ + "api_url": "http://localhost:8080", + "phone_number": "+1234567890", + }, +) class TestInit: @@ -122,34 +124,8 @@ class TestSend: assert EventType.CHANNEL_MESSAGE_SENT in event_types -class TestListChannels: - def test_list_channels(self): - ch = SignalChannel(api_url="http://localhost:8080", phone_number="+1234567890") - assert ch.list_channels() == ["signal"] - - class TestStatus: - def test_disconnected_initially(self): - ch = SignalChannel(api_url="http://localhost:8080", phone_number="+1234567890") - assert ch.status() == ChannelStatus.DISCONNECTED - def test_no_config_connect_error(self): ch = SignalChannel() ch.connect() assert ch.status() == ChannelStatus.ERROR - - -class TestOnMessage: - def test_on_message(self): - ch = SignalChannel(api_url="http://localhost:8080", phone_number="+1234567890") - handler = MagicMock() - ch.on_message(handler) - assert handler in ch._handlers - - -class TestDisconnect: - def test_disconnect(self): - ch = SignalChannel(api_url="http://localhost:8080", phone_number="+1234567890") - ch._status = ChannelStatus.CONNECTED - ch.disconnect() - assert ch.status() == ChannelStatus.DISCONNECTED diff --git a/tests/channels/test_slack.py b/tests/channels/test_slack.py index c1545e0a..872143e3 100644 --- a/tests/channels/test_slack.py +++ b/tests/channels/test_slack.py @@ -11,6 +11,7 @@ from openjarvis.channels._stubs import ChannelStatus from openjarvis.channels.slack import SlackChannel from openjarvis.core.events import EventBus, EventType from openjarvis.core.registry import ChannelRegistry +from tests.channels.channel_test_helpers import make_common_channel_tests @pytest.fixture(autouse=True) @@ -20,13 +21,9 @@ def _register_slack(): ChannelRegistry.register_value("slack", SlackChannel) -class TestRegistration: - def test_registry_key(self): - assert ChannelRegistry.contains("slack") - - def test_channel_id(self): - ch = SlackChannel(bot_token="xoxb-test") - assert ch.channel_id == "slack" +TestCommonChannel = make_common_channel_tests( + SlackChannel, "slack", constructor_kwargs={"bot_token": "xoxb-test"} +) class TestInit: @@ -137,34 +134,8 @@ class TestSend: assert EventType.CHANNEL_MESSAGE_SENT in event_types -class TestListChannels: - def test_list_channels(self): - ch = SlackChannel(bot_token="xoxb-test") - assert ch.list_channels() == ["slack"] - - class TestStatus: - def test_disconnected_initially(self): - ch = SlackChannel(bot_token="xoxb-test") - assert ch.status() == ChannelStatus.DISCONNECTED - def test_no_token_connect_error(self): ch = SlackChannel() ch.connect() assert ch.status() == ChannelStatus.ERROR - - -class TestOnMessage: - def test_on_message(self): - ch = SlackChannel(bot_token="xoxb-test") - handler = MagicMock() - ch.on_message(handler) - assert handler in ch._handlers - - -class TestDisconnect: - def test_disconnect(self): - ch = SlackChannel(bot_token="xoxb-test") - ch._status = ChannelStatus.CONNECTED - ch.disconnect() - assert ch.status() == ChannelStatus.DISCONNECTED diff --git a/tests/channels/test_teams.py b/tests/channels/test_teams.py index 498fcc09..7e34ee6b 100644 --- a/tests/channels/test_teams.py +++ b/tests/channels/test_teams.py @@ -11,6 +11,7 @@ from openjarvis.channels._stubs import ChannelStatus from openjarvis.channels.teams import TeamsChannel from openjarvis.core.events import EventBus, EventType from openjarvis.core.registry import ChannelRegistry +from tests.channels.channel_test_helpers import make_common_channel_tests @pytest.fixture(autouse=True) @@ -20,13 +21,11 @@ def _register_teams(): ChannelRegistry.register_value("teams", TeamsChannel) -class TestRegistration: - def test_registry_key(self): - assert ChannelRegistry.contains("teams") - - def test_channel_id(self): - ch = TeamsChannel(app_id="test-id", app_password="test-pass") - assert ch.channel_id == "teams" +TestCommonChannel = make_common_channel_tests( + TeamsChannel, + "teams", + constructor_kwargs={"app_id": "test-id", "app_password": "test-pass"}, +) class TestInit: @@ -115,34 +114,8 @@ class TestSend: assert EventType.CHANNEL_MESSAGE_SENT in event_types -class TestListChannels: - def test_list_channels(self): - ch = TeamsChannel(app_id="test-id", app_password="test-pass") - assert ch.list_channels() == ["teams"] - - class TestStatus: - def test_disconnected_initially(self): - ch = TeamsChannel(app_id="test-id", app_password="test-pass") - assert ch.status() == ChannelStatus.DISCONNECTED - def test_no_config_connect_error(self): ch = TeamsChannel() ch.connect() assert ch.status() == ChannelStatus.ERROR - - -class TestOnMessage: - def test_on_message(self): - ch = TeamsChannel(app_id="test-id", app_password="test-pass") - handler = MagicMock() - ch.on_message(handler) - assert handler in ch._handlers - - -class TestDisconnect: - def test_disconnect(self): - ch = TeamsChannel(app_id="test-id", app_password="test-pass") - ch._status = ChannelStatus.CONNECTED - ch.disconnect() - assert ch.status() == ChannelStatus.DISCONNECTED diff --git a/tests/channels/test_telegram.py b/tests/channels/test_telegram.py index 0e348060..ce8f31c2 100644 --- a/tests/channels/test_telegram.py +++ b/tests/channels/test_telegram.py @@ -11,6 +11,7 @@ from openjarvis.channels._stubs import ChannelStatus from openjarvis.channels.telegram import TelegramChannel from openjarvis.core.events import EventBus, EventType from openjarvis.core.registry import ChannelRegistry +from tests.channels.channel_test_helpers import make_common_channel_tests @pytest.fixture(autouse=True) @@ -20,13 +21,9 @@ def _register_telegram(): ChannelRegistry.register_value("telegram", TelegramChannel) -class TestRegistration: - def test_registry_key(self): - assert ChannelRegistry.contains("telegram") - - def test_channel_id(self): - ch = TelegramChannel(bot_token="test-token") - assert ch.channel_id == "telegram" +TestCommonChannel = make_common_channel_tests( + TelegramChannel, "telegram", constructor_kwargs={"bot_token": "test-token"} +) class TestInit: @@ -109,39 +106,13 @@ class TestSend: assert EventType.CHANNEL_MESSAGE_SENT in event_types -class TestListChannels: - def test_list_channels(self): - ch = TelegramChannel(bot_token="123:ABC") - assert ch.list_channels() == ["telegram"] - - class TestStatus: - def test_disconnected_initially(self): - ch = TelegramChannel(bot_token="123:ABC") - assert ch.status() == ChannelStatus.DISCONNECTED - def test_no_token_connect_error(self): ch = TelegramChannel() ch.connect() assert ch.status() == ChannelStatus.ERROR -class TestOnMessage: - def test_on_message(self): - ch = TelegramChannel(bot_token="123:ABC") - handler = MagicMock() - ch.on_message(handler) - assert handler in ch._handlers - - -class TestDisconnect: - def test_disconnect(self): - ch = TelegramChannel(bot_token="123:ABC") - ch._status = ChannelStatus.CONNECTED - ch.disconnect() - assert ch.status() == ChannelStatus.DISCONNECTED - - class TestAllowedChatIds: """Tests for the allowed_chat_ids enforcement in _poll_loop.""" diff --git a/tests/channels/test_tier1_gmail.py b/tests/channels/test_tier1_gmail.py index c344eb0f..bbee911a 100644 --- a/tests/channels/test_tier1_gmail.py +++ b/tests/channels/test_tier1_gmail.py @@ -12,6 +12,7 @@ from openjarvis.channels._stubs import ChannelStatus from openjarvis.channels.gmail import GmailChannel from openjarvis.core.events import EventBus, EventType from openjarvis.core.registry import ChannelRegistry +from tests.channels.channel_test_helpers import make_common_channel_tests @pytest.fixture(autouse=True) @@ -21,13 +22,10 @@ def _register_gmail(): ChannelRegistry.register_value("gmail", GmailChannel) -class TestRegistration: - def test_gmail_channel_registered(self): - assert ChannelRegistry.contains("gmail") - - def test_channel_id(self): - ch = GmailChannel() - assert ch.channel_id == "gmail" +TestCommonChannel = make_common_channel_tests(GmailChannel, "gmail") +# Gmail overrides list_channels() to return ["inbox"], so remove the +# generic assertion and keep the channel-specific TestListChannels below. +del TestCommonChannel.test_list_channels class TestNoCredentials: @@ -119,14 +117,6 @@ class TestListChannels: assert ch.list_channels() == ["inbox"] -class TestOnMessage: - def test_gmail_on_message_registers_handler(self): - ch = GmailChannel() - handler = MagicMock() - ch.on_message(handler) - assert handler in ch._handlers - - class TestEventBus: def test_gmail_event_bus_integration(self): bus = EventBus(record_history=True) @@ -142,10 +132,6 @@ class TestEventBus: class TestStatus: - def test_disconnected_initially(self): - ch = GmailChannel() - assert ch.status() == ChannelStatus.DISCONNECTED - def test_status_error_when_connected_but_no_service(self): ch = GmailChannel() ch._status = ChannelStatus.CONNECTED diff --git a/tests/channels/test_tier2_twitter.py b/tests/channels/test_tier2_twitter.py index 182ac7a3..4d794454 100644 --- a/tests/channels/test_tier2_twitter.py +++ b/tests/channels/test_tier2_twitter.py @@ -11,6 +11,7 @@ from openjarvis.channels._stubs import ChannelStatus from openjarvis.channels.twitter import TwitterChannel from openjarvis.core.events import EventBus, EventType from openjarvis.core.registry import ChannelRegistry +from tests.channels.channel_test_helpers import make_common_channel_tests @pytest.fixture(autouse=True) @@ -20,11 +21,10 @@ def _register_twitter(): ChannelRegistry.register_value("twitter", TwitterChannel) -def test_twitter_channel_registered(): - """Twitter channel should be discoverable via the registry.""" - assert ChannelRegistry.contains("twitter") - cls = ChannelRegistry.get("twitter") - assert cls is TwitterChannel +TestCommonChannel = make_common_channel_tests(TwitterChannel, "twitter") +# Twitter overrides list_channels() to return ["timeline", "dm"], +# so remove the generic assertion and keep the channel-specific test below. +del TestCommonChannel.test_list_channels def test_twitter_no_credentials_status(): diff --git a/tests/channels/test_twilio_sms.py b/tests/channels/test_twilio_sms.py index 563f2da5..4406443b 100644 --- a/tests/channels/test_twilio_sms.py +++ b/tests/channels/test_twilio_sms.py @@ -7,31 +7,31 @@ from unittest.mock import MagicMock, patch import pytest from openjarvis.channels._stubs import ChannelStatus +from openjarvis.channels.twilio_sms import TwilioSMSChannel from openjarvis.core.events import EventBus, EventType from openjarvis.core.registry import ChannelRegistry +from tests.channels.channel_test_helpers import make_common_channel_tests @pytest.fixture(autouse=True) def _register_twilio(): if not ChannelRegistry.contains("twilio"): - from openjarvis.channels.twilio_sms import ( - TwilioSMSChannel, - ) - ChannelRegistry.register_value("twilio", TwilioSMSChannel) -class TestRegistration: - def test_registered(self): - assert ChannelRegistry.contains("twilio") +TestCommonChannel = make_common_channel_tests( + TwilioSMSChannel, + "twilio", + constructor_kwargs={ + "account_sid": "AC_test", + "auth_token": "token_test", + "phone_number": "+15551234567", + }, +) class TestInit: def test_from_params(self): - from openjarvis.channels.twilio_sms import ( - TwilioSMSChannel, - ) - ch = TwilioSMSChannel( account_sid="AC_test", auth_token="token_test", @@ -41,10 +41,6 @@ class TestInit: assert ch.status() == ChannelStatus.DISCONNECTED def test_from_env_vars(self, monkeypatch): - from openjarvis.channels.twilio_sms import ( - TwilioSMSChannel, - ) - monkeypatch.setenv("TWILIO_ACCOUNT_SID", "AC_env") monkeypatch.setenv("TWILIO_AUTH_TOKEN", "token_env") monkeypatch.setenv("TWILIO_PHONE_NUMBER", "+15559876543") @@ -54,10 +50,6 @@ class TestInit: class TestSend: def test_send_success(self): - from openjarvis.channels.twilio_sms import ( - TwilioSMSChannel, - ) - ch = TwilioSMSChannel( account_sid="AC_test", auth_token="token_test", @@ -78,10 +70,6 @@ class TestSend: ) def test_send_failure(self): - from openjarvis.channels.twilio_sms import ( - TwilioSMSChannel, - ) - ch = TwilioSMSChannel( account_sid="AC_test", auth_token="token_test", @@ -97,10 +85,6 @@ class TestSend: assert result is False def test_send_publishes_event(self): - from openjarvis.channels.twilio_sms import ( - TwilioSMSChannel, - ) - bus = EventBus(record_history=True) ch = TwilioSMSChannel( account_sid="AC_test", @@ -121,10 +105,6 @@ class TestSend: class TestStatus: def test_connected_after_connect(self): - from openjarvis.channels.twilio_sms import ( - TwilioSMSChannel, - ) - ch = TwilioSMSChannel( account_sid="AC_test", auth_token="token_test", @@ -135,10 +115,6 @@ class TestStatus: assert ch.status() == ChannelStatus.CONNECTED def test_disconnected_after_disconnect(self): - from openjarvis.channels.twilio_sms import ( - TwilioSMSChannel, - ) - ch = TwilioSMSChannel( account_sid="AC_test", auth_token="token_test", @@ -148,19 +124,3 @@ class TestStatus: ch.connect() ch.disconnect() assert ch.status() == ChannelStatus.DISCONNECTED - - -class TestOnMessage: - def test_registers_handler(self): - from openjarvis.channels.twilio_sms import ( - TwilioSMSChannel, - ) - - ch = TwilioSMSChannel( - account_sid="AC_test", - auth_token="token_test", - phone_number="+15551234567", - ) - handler = MagicMock() - ch.on_message(handler) - assert handler in ch._handlers diff --git a/tests/channels/test_webchat.py b/tests/channels/test_webchat.py index ed71a5e4..93849ac4 100644 --- a/tests/channels/test_webchat.py +++ b/tests/channels/test_webchat.py @@ -2,14 +2,13 @@ from __future__ import annotations -from unittest.mock import MagicMock - import pytest from openjarvis.channels._stubs import ChannelStatus from openjarvis.channels.webchat import WebChatChannel from openjarvis.core.events import EventBus, EventType from openjarvis.core.registry import ChannelRegistry +from tests.channels.channel_test_helpers import make_common_channel_tests @pytest.fixture(autouse=True) @@ -19,13 +18,7 @@ def _register_webchat(): ChannelRegistry.register_value("webchat", WebChatChannel) -class TestRegistration: - def test_registry_key(self): - assert ChannelRegistry.contains("webchat") - - def test_channel_id(self): - ch = WebChatChannel() - assert ch.channel_id == "webchat" +TestCommonChannel = make_common_channel_tests(WebChatChannel, "webchat") class TestInit: @@ -70,34 +63,8 @@ class TestSend: assert len(ch.get_messages()) == 0 -class TestListChannels: - def test_list_channels(self): - ch = WebChatChannel() - assert ch.list_channels() == ["webchat"] - - class TestStatus: - def test_disconnected_initially(self): - ch = WebChatChannel() - assert ch.status() == ChannelStatus.DISCONNECTED - def test_connected_after_connect(self): ch = WebChatChannel() ch.connect() assert ch.status() == ChannelStatus.CONNECTED - - -class TestOnMessage: - def test_on_message(self): - ch = WebChatChannel() - handler = MagicMock() - ch.on_message(handler) - assert handler in ch._handlers - - -class TestDisconnect: - def test_disconnect(self): - ch = WebChatChannel() - ch._status = ChannelStatus.CONNECTED - ch.disconnect() - assert ch.status() == ChannelStatus.DISCONNECTED diff --git a/tests/channels/test_whatsapp.py b/tests/channels/test_whatsapp.py index a4e118f5..970508ce 100644 --- a/tests/channels/test_whatsapp.py +++ b/tests/channels/test_whatsapp.py @@ -11,6 +11,7 @@ from openjarvis.channels._stubs import ChannelStatus from openjarvis.channels.whatsapp import WhatsAppChannel from openjarvis.core.events import EventBus, EventType from openjarvis.core.registry import ChannelRegistry +from tests.channels.channel_test_helpers import make_common_channel_tests @pytest.fixture(autouse=True) @@ -20,13 +21,11 @@ def _register_whatsapp(): ChannelRegistry.register_value("whatsapp", WhatsAppChannel) -class TestRegistration: - def test_registry_key(self): - assert ChannelRegistry.contains("whatsapp") - - def test_channel_id(self): - ch = WhatsAppChannel(access_token="test-token", phone_number_id="12345") - assert ch.channel_id == "whatsapp" +TestCommonChannel = make_common_channel_tests( + WhatsAppChannel, + "whatsapp", + constructor_kwargs={"access_token": "test-token", "phone_number_id": "12345"}, +) class TestInit: @@ -126,34 +125,8 @@ class TestSend: assert EventType.CHANNEL_MESSAGE_SENT in event_types -class TestListChannels: - def test_list_channels(self): - ch = WhatsAppChannel(access_token="test-token", phone_number_id="12345") - assert ch.list_channels() == ["whatsapp"] - - class TestStatus: - def test_disconnected_initially(self): - ch = WhatsAppChannel(access_token="test-token", phone_number_id="12345") - assert ch.status() == ChannelStatus.DISCONNECTED - def test_no_token_connect_error(self): ch = WhatsAppChannel() ch.connect() assert ch.status() == ChannelStatus.ERROR - - -class TestOnMessage: - def test_on_message(self): - ch = WhatsAppChannel(access_token="test-token", phone_number_id="12345") - handler = MagicMock() - ch.on_message(handler) - assert handler in ch._handlers - - -class TestDisconnect: - def test_disconnect(self): - ch = WhatsAppChannel(access_token="test-token", phone_number_id="12345") - ch._status = ChannelStatus.CONNECTED - ch.disconnect() - assert ch.status() == ChannelStatus.DISCONNECTED diff --git a/tests/intelligence/test_intelligence_stubs.py b/tests/intelligence/test_intelligence_stubs.py deleted file mode 100644 index 7f46cd2a..00000000 --- a/tests/intelligence/test_intelligence_stubs.py +++ /dev/null @@ -1,79 +0,0 @@ -"""Tests for Intelligence primitive backward-compat shims.""" - -from __future__ import annotations - -import pytest - - -class TestBackwardCompatShims: - """Verify ABCs are still importable from intelligence._stubs.""" - - def test_router_policy_from_intelligence(self) -> None: - from openjarvis.intelligence._stubs import RouterPolicy - - with pytest.raises(TypeError): - RouterPolicy() # type: ignore[abstract] - - def test_query_analyzer_from_intelligence(self) -> None: - from openjarvis.intelligence._stubs import QueryAnalyzer - - with pytest.raises(TypeError): - QueryAnalyzer() # type: ignore[abstract] - - def test_same_class_as_learning(self) -> None: - from openjarvis.intelligence._stubs import QueryAnalyzer as IQA - from openjarvis.intelligence._stubs import RouterPolicy as IRP - from openjarvis.learning._stubs import QueryAnalyzer as LQA - from openjarvis.learning._stubs import RouterPolicy as LRP - - assert IRP is LRP - assert IQA is LQA - - def test_router_from_intelligence_module(self) -> None: - """HeuristicRouter still importable from intelligence.router.""" - from openjarvis.intelligence.router import ( - HeuristicRouter, - build_routing_context, - ) - - ctx = build_routing_context("hello") - assert ctx.query == "hello" - router = HeuristicRouter( - available_models=[], - default_model="m", - ) - assert router.select_model(ctx) == "m" - - def test_default_query_analyzer_from_intelligence( - self, - ) -> None: - from openjarvis.intelligence.router import ( - DefaultQueryAnalyzer, - ) - - analyzer = DefaultQueryAnalyzer() - ctx = analyzer.analyze("Hello world") - assert ctx.query == "Hello world" - - -class TestRoutingContextInCoreTypes: - """Verify RoutingContext is accessible from core.types.""" - - def test_import_from_core_types(self) -> None: - from openjarvis.core.types import RoutingContext as RC - - ctx = RC(query="test", has_code=True) - assert ctx.query == "test" - assert ctx.has_code is True - - def test_backward_compat_import(self) -> None: - from openjarvis.learning._stubs import RoutingContext as RC - - ctx = RC(query="compat") - assert ctx.query == "compat" - - def test_router_policy_backward_compat(self) -> None: - from openjarvis.intelligence._stubs import RouterPolicy - from openjarvis.learning._stubs import RouterPolicy as RP - - assert RP is RouterPolicy diff --git a/tests/intelligence/test_router.py b/tests/intelligence/test_router.py index 83c5f4d2..68d430c3 100644 --- a/tests/intelligence/test_router.py +++ b/tests/intelligence/test_router.py @@ -1,18 +1,14 @@ -"""Backward-compat: verify router is still importable from intelligence. - -The canonical tests live in tests/learning/test_router.py. This file -verifies the backward-compat shim in intelligence/router.py works. -""" +"""Tests for the intelligence router via canonical learning.routing.router imports.""" from __future__ import annotations from openjarvis.core.registry import ModelRegistry from openjarvis.core.types import ModelSpec -from openjarvis.intelligence.router import ( +from openjarvis.learning._stubs import RoutingContext +from openjarvis.learning.routing.router import ( HeuristicRouter, build_routing_context, ) -from openjarvis.learning._stubs import RoutingContext def _register_models() -> None: @@ -36,7 +32,7 @@ def _register_models() -> None: ) -class TestShimImports: +class TestRouter: def test_build_routing_context(self) -> None: ctx = build_routing_context("def hello():\n pass") assert ctx.has_code is True diff --git a/tests/intelligence/test_routing_models.py b/tests/intelligence/test_routing_models.py index 9ff19ccf..2b8f0d8f 100644 --- a/tests/intelligence/test_routing_models.py +++ b/tests/intelligence/test_routing_models.py @@ -1,23 +1,20 @@ -"""Backward-compat: verify router with model catalog via intelligence imports. - -Canonical tests live in tests/learning/test_routing_models.py. -""" +"""Tests for the router with model catalog via canonical imports.""" from __future__ import annotations from openjarvis.intelligence.model_catalog import register_builtin_models -from openjarvis.intelligence.router import ( +from openjarvis.learning._stubs import RoutingContext +from openjarvis.learning.routing.router import ( HeuristicRouter, build_routing_context, ) -from openjarvis.learning._stubs import RoutingContext def _setup_models() -> None: register_builtin_models() -class TestShimRouterWithModels: +class TestRouterWithModels: def test_short_query(self) -> None: _setup_models() router = HeuristicRouter( diff --git a/tests/learning/test_feedback_collector.py b/tests/learning/test_feedback_collector.py index 976c2fd7..40dd9a0c 100644 --- a/tests/learning/test_feedback_collector.py +++ b/tests/learning/test_feedback_collector.py @@ -5,8 +5,8 @@ from __future__ import annotations from unittest.mock import MagicMock from openjarvis.core.types import Trace -from openjarvis.optimize.feedback.collector import FeedbackCollector -from openjarvis.optimize.feedback.judge import TraceJudge +from openjarvis.learning.optimize.feedback.collector import FeedbackCollector +from openjarvis.learning.optimize.feedback.judge import TraceJudge def _make_trace(trace_id: str = "trace-001") -> Trace: diff --git a/tests/learning/test_llm_optimizer.py b/tests/learning/test_llm_optimizer.py index 33375c3f..a3a7a966 100644 --- a/tests/learning/test_llm_optimizer.py +++ b/tests/learning/test_llm_optimizer.py @@ -11,8 +11,8 @@ import pytest from openjarvis.core.types import StepType, Trace, TraceStep from openjarvis.evals.core.backend import InferenceBackend from openjarvis.evals.core.types import RunSummary -from openjarvis.optimize.llm_optimizer import LLMOptimizer -from openjarvis.optimize.types import ( +from openjarvis.learning.optimize.llm_optimizer import LLMOptimizer +from openjarvis.learning.optimize.types import ( SampleScore, SearchDimension, SearchSpace, diff --git a/tests/learning/test_multi_bench_runner.py b/tests/learning/test_multi_bench_runner.py index 8e6b21bc..daceb5e6 100644 --- a/tests/learning/test_multi_bench_runner.py +++ b/tests/learning/test_multi_bench_runner.py @@ -4,8 +4,11 @@ from __future__ import annotations from unittest.mock import patch -from openjarvis.optimize.trial_runner import BenchmarkSpec, MultiBenchTrialRunner -from openjarvis.optimize.types import ( +from openjarvis.learning.optimize.trial_runner import ( + BenchmarkSpec, + MultiBenchTrialRunner, +) +from openjarvis.learning.optimize.types import ( BenchmarkScore, SampleScore, TrialConfig, @@ -196,7 +199,7 @@ class TestMultiBenchAggregation: class TestMultiBenchRunTrial: - @patch("openjarvis.optimize.trial_runner.TrialRunner.run_trial") + @patch("openjarvis.learning.optimize.trial_runner.TrialRunner.run_trial") def test_delegates_to_trial_runners(self, mock_run_trial): """Each benchmark gets its own TrialRunner call.""" mock_run_trial.return_value = _make_trial_result() @@ -223,7 +226,7 @@ class TestMultiBenchRunTrial: class TestLoadBenchmarkSpecs: def test_multi_benchmark_format(self): - from openjarvis.optimize.config import load_benchmark_specs + from openjarvis.learning.optimize.config import load_benchmark_specs data = { "optimize": { @@ -242,7 +245,7 @@ class TestLoadBenchmarkSpecs: assert specs[2].weight == 0.2 def test_single_benchmark_fallback(self): - from openjarvis.optimize.config import load_benchmark_specs + from openjarvis.learning.optimize.config import load_benchmark_specs data = { "optimize": { @@ -256,13 +259,13 @@ class TestLoadBenchmarkSpecs: assert specs[0].max_samples == 100 def test_empty_returns_empty(self): - from openjarvis.optimize.config import load_benchmark_specs + from openjarvis.learning.optimize.config import load_benchmark_specs specs = load_benchmark_specs({"optimize": {}}) assert specs == [] def test_no_optimize_section(self): - from openjarvis.optimize.config import load_benchmark_specs + from openjarvis.learning.optimize.config import load_benchmark_specs specs = load_benchmark_specs({}) assert specs == [] @@ -301,7 +304,7 @@ class TestTrialResultPerBenchmark: class TestParamToRecipe: def test_max_tokens_mapping(self): - from openjarvis.optimize.types import _PARAM_TO_RECIPE + from openjarvis.learning.optimize.types import _PARAM_TO_RECIPE assert "intelligence.max_tokens" in _PARAM_TO_RECIPE assert _PARAM_TO_RECIPE["intelligence.max_tokens"] == "max_tokens" diff --git a/tests/learning/test_optimize_store.py b/tests/learning/test_optimize_store.py index 6e5904fd..fa69dee5 100644 --- a/tests/learning/test_optimize_store.py +++ b/tests/learning/test_optimize_store.py @@ -2,8 +2,8 @@ from __future__ import annotations -from openjarvis.optimize.store import OptimizationStore -from openjarvis.optimize.types import ( +from openjarvis.learning.optimize.store import OptimizationStore +from openjarvis.learning.optimize.types import ( OptimizationRun, SampleScore, SearchDimension, diff --git a/tests/learning/test_optimize_types.py b/tests/learning/test_optimize_types.py index 4a59a40d..fdaa0f00 100644 --- a/tests/learning/test_optimize_types.py +++ b/tests/learning/test_optimize_types.py @@ -2,7 +2,7 @@ from __future__ import annotations -from openjarvis.optimize.types import ( +from openjarvis.learning.optimize.types import ( OptimizationRun, SampleScore, SearchDimension, diff --git a/tests/learning/test_optimizer_engine.py b/tests/learning/test_optimizer_engine.py index 1634dee6..c624c674 100644 --- a/tests/learning/test_optimizer_engine.py +++ b/tests/learning/test_optimizer_engine.py @@ -10,9 +10,9 @@ except ModuleNotFoundError: import tomli as tomllib # type: ignore[no-redef] from openjarvis.evals.core.types import RunSummary -from openjarvis.optimize.optimizer import OptimizationEngine -from openjarvis.optimize.store import OptimizationStore -from openjarvis.optimize.types import ( +from openjarvis.learning.optimize.optimizer import OptimizationEngine +from openjarvis.learning.optimize.store import OptimizationStore +from openjarvis.learning.optimize.types import ( OptimizationRun, SearchDimension, SearchSpace, @@ -619,7 +619,7 @@ class TestLoadOptimizeConfig: """Tests for load_optimize_config.""" def test_loads_toml_file(self, tmp_path) -> None: - from openjarvis.optimize.config import load_optimize_config + from openjarvis.learning.optimize.config import load_optimize_config toml_content = b""" [optimize] @@ -644,7 +644,7 @@ engine = "ollama" assert config["optimize"]["fixed"]["engine"] == "ollama" def test_file_not_found(self, tmp_path) -> None: - from openjarvis.optimize.config import load_optimize_config + from openjarvis.learning.optimize.config import load_optimize_config try: load_optimize_config(tmp_path / "nonexistent.toml") @@ -653,7 +653,7 @@ engine = "ollama" pass def test_loads_string_path(self, tmp_path) -> None: - from openjarvis.optimize.config import load_optimize_config + from openjarvis.learning.optimize.config import load_optimize_config path = tmp_path / "test.toml" path.write_bytes(b"[optimize]\nmax_trials = 5\n") diff --git a/tests/learning/test_pareto.py b/tests/learning/test_pareto.py index 47fa9979..7311d4db 100644 --- a/tests/learning/test_pareto.py +++ b/tests/learning/test_pareto.py @@ -5,8 +5,8 @@ from __future__ import annotations from typing import Any, Dict from openjarvis.evals.core.types import MetricStats, RunSummary -from openjarvis.optimize.optimizer import compute_pareto_frontier -from openjarvis.optimize.types import ( +from openjarvis.learning.optimize.optimizer import compute_pareto_frontier +from openjarvis.learning.optimize.types import ( ObjectiveSpec, TrialConfig, TrialResult, diff --git a/tests/learning/test_personal_synthesizer.py b/tests/learning/test_personal_synthesizer.py index 02bdc7ea..22ef06ed 100644 --- a/tests/learning/test_personal_synthesizer.py +++ b/tests/learning/test_personal_synthesizer.py @@ -10,9 +10,9 @@ import pytest from openjarvis.core.types import Trace from openjarvis.evals.core.types import EvalRecord -from openjarvis.optimize.personal.dataset import PersonalBenchmarkDataset -from openjarvis.optimize.personal.scorer import PersonalBenchmarkScorer -from openjarvis.optimize.personal.synthesizer import ( +from openjarvis.learning.optimize.personal.dataset import PersonalBenchmarkDataset +from openjarvis.learning.optimize.personal.scorer import PersonalBenchmarkScorer +from openjarvis.learning.optimize.personal.synthesizer import ( PersonalBenchmark, PersonalBenchmarkSample, PersonalBenchmarkSynthesizer, diff --git a/tests/learning/test_search_space.py b/tests/learning/test_search_space.py index 4d28b4ba..13aeef91 100644 --- a/tests/learning/test_search_space.py +++ b/tests/learning/test_search_space.py @@ -2,11 +2,11 @@ from __future__ import annotations -from openjarvis.optimize.search_space import ( +from openjarvis.learning.optimize.search_space import ( DEFAULT_SEARCH_SPACE, build_search_space, ) -from openjarvis.optimize.types import SearchSpace +from openjarvis.learning.optimize.types import SearchSpace # --------------------------------------------------------------------------- # build_search_space diff --git a/tests/learning/test_trace_judge.py b/tests/learning/test_trace_judge.py index 8a74edff..f28a237e 100644 --- a/tests/learning/test_trace_judge.py +++ b/tests/learning/test_trace_judge.py @@ -5,7 +5,7 @@ from __future__ import annotations from unittest.mock import MagicMock from openjarvis.core.types import StepType, Trace, TraceStep -from openjarvis.optimize.feedback.judge import TraceJudge, _parse_score +from openjarvis.learning.optimize.feedback.judge import TraceJudge, _parse_score # --------------------------------------------------------------------------- # _parse_score unit tests diff --git a/tests/learning/test_trial_runner.py b/tests/learning/test_trial_runner.py index fd0fc042..93d73596 100644 --- a/tests/learning/test_trial_runner.py +++ b/tests/learning/test_trial_runner.py @@ -5,8 +5,8 @@ from __future__ import annotations from unittest.mock import MagicMock, patch from openjarvis.evals.core.types import RunConfig, RunSummary -from openjarvis.optimize.trial_runner import TrialRunner -from openjarvis.optimize.types import TrialConfig, TrialResult +from openjarvis.learning.optimize.trial_runner import TrialRunner +from openjarvis.learning.optimize.types import TrialConfig, TrialResult class TestTrialRunnerInit: diff --git a/tests/speech/test_config.py b/tests/speech/test_config.py index 804af199..8f3658ec 100644 --- a/tests/speech/test_config.py +++ b/tests/speech/test_config.py @@ -17,3 +17,10 @@ def test_jarvis_config_has_speech(): assert hasattr(cfg, "speech") assert isinstance(cfg.speech, SpeechConfig) assert cfg.speech.backend == "auto" + + +def test_jarvis_system_has_speech_backend(): + """JarvisSystem has a speech_backend attribute.""" + from openjarvis.system import JarvisSystem + + assert "speech_backend" in JarvisSystem.__dataclass_fields__ diff --git a/tests/speech/test_system_integration.py b/tests/speech/test_system_integration.py deleted file mode 100644 index e0ef811a..00000000 --- a/tests/speech/test_system_integration.py +++ /dev/null @@ -1,8 +0,0 @@ -"""Tests for speech integration in SystemBuilder/JarvisSystem.""" - -from openjarvis.system import JarvisSystem - - -def test_jarvis_system_has_speech_backend(): - """JarvisSystem has a speech_backend attribute.""" - assert "speech_backend" in JarvisSystem.__dataclass_fields__ diff --git a/tests/telemetry/energy_test_helpers.py b/tests/telemetry/energy_test_helpers.py new file mode 100644 index 00000000..397ae65e --- /dev/null +++ b/tests/telemetry/energy_test_helpers.py @@ -0,0 +1,55 @@ +"""Shared assertion helpers for energy monitor tests. + +These helpers capture common test patterns used across the AMD, Apple, +NVIDIA, and RAPL energy monitor test files, reducing duplication without +hiding vendor-specific mock setup. +""" + +from __future__ import annotations + +# --------------------------------------------------------------------------- +# available() helpers +# --------------------------------------------------------------------------- + + +def assert_available_false_when_lib_missing(mod, monitor_cls, flag_name: str): + """Assert monitor reports unavailable when its native library flag is False. + + Works for AMD (_AMDSMI_AVAILABLE) and NVIDIA (_PYNVML_AVAILABLE). + """ + orig = getattr(mod, flag_name) + setattr(mod, flag_name, False) + try: + assert monitor_cls.available() is False + finally: + setattr(mod, flag_name, orig) + + +# --------------------------------------------------------------------------- +# sample() helpers +# --------------------------------------------------------------------------- + + +def assert_sample_result_basics(result, *, vendor: str, energy_method: str): + """Assert common sample-result fields present on every vendor.""" + assert result.vendor == vendor + assert result.energy_method == energy_method + assert result.duration_seconds >= 0 + + +def assert_empty_sample_result(result, *, vendor: str): + """Assert the result from a no-device / uninitialized sample.""" + assert result.energy_joules == 0.0 + assert result.duration_seconds >= 0 + assert result.vendor == vendor + + +# --------------------------------------------------------------------------- +# close() helpers +# --------------------------------------------------------------------------- + + +def assert_close_sets_uninitialized(monitor): + """Assert that close() marks the monitor as not initialized.""" + monitor.close() + assert monitor._initialized is False diff --git a/tests/telemetry/test_energy_amd.py b/tests/telemetry/test_energy_amd.py index 8e29aa8d..fe562529 100644 --- a/tests/telemetry/test_energy_amd.py +++ b/tests/telemetry/test_energy_amd.py @@ -9,6 +9,13 @@ from unittest.mock import MagicMock, patch import pytest +from tests.telemetry.energy_test_helpers import ( + assert_available_false_when_lib_missing, + assert_close_sets_uninitialized, + assert_empty_sample_result, + assert_sample_result_basics, +) + # --------------------------------------------------------------------------- # Helpers: build a fake amdsmi module # --------------------------------------------------------------------------- @@ -55,12 +62,9 @@ class TestAvailable: def test_available_false_when_amdsmi_not_importable(self): import openjarvis.telemetry.energy_amd as mod - orig = mod._AMDSMI_AVAILABLE - mod._AMDSMI_AVAILABLE = False - try: - assert mod.AmdEnergyMonitor.available() is False - finally: - mod._AMDSMI_AVAILABLE = orig + assert_available_false_when_lib_missing( + mod, mod.AmdEnergyMonitor, "_AMDSMI_AVAILABLE" + ) # --------------------------------------------------------------------------- @@ -128,9 +132,9 @@ class TestSampleCounterDelta: expected_joules = (2000.0 - 1000.0) * 15.3 / 1e6 assert result.energy_joules == pytest.approx(expected_joules) assert result.gpu_energy_joules == pytest.approx(expected_joules) - assert result.vendor == "amd" - assert result.energy_method == "hw_counter" - assert result.duration_seconds > 0 + assert_sample_result_basics( + result, vendor="amd", energy_method="hw_counter" + ) finally: mod._AMDSMI_AVAILABLE = orig @@ -155,9 +159,7 @@ class TestSampleNoDevices: with monitor.sample() as result: pass - assert result.energy_joules == 0.0 - assert result.duration_seconds >= 0 - assert result.vendor == "amd" + assert_empty_sample_result(result, vendor="amd") # --------------------------------------------------------------------------- @@ -180,9 +182,7 @@ class TestClose: assert monitor._initialized is True fake_amdsmi.amdsmi_shut_down.reset_mock() - monitor.close() - + assert_close_sets_uninitialized(monitor) fake_amdsmi.amdsmi_shut_down.assert_called_once() - assert monitor._initialized is False finally: mod._AMDSMI_AVAILABLE = orig diff --git a/tests/telemetry/test_energy_apple.py b/tests/telemetry/test_energy_apple.py index 4b1c0268..3c6e5860 100644 --- a/tests/telemetry/test_energy_apple.py +++ b/tests/telemetry/test_energy_apple.py @@ -8,6 +8,10 @@ from unittest.mock import MagicMock, patch import pytest +from tests.telemetry.energy_test_helpers import ( + assert_sample_result_basics, +) + # --------------------------------------------------------------------------- # Helpers: build a fake zeus module # --------------------------------------------------------------------------- @@ -112,8 +116,7 @@ class TestSampleComponentBreakdown: assert result.gpu_energy_joules == pytest.approx(3.0) assert result.dram_energy_joules == pytest.approx(0.5) assert result.ane_energy_joules == pytest.approx(2.0) - assert result.vendor == "apple" - assert result.energy_method == "zeus" + assert_sample_result_basics(result, vendor="apple", energy_method="zeus") def test_total_energy_is_sum_of_components(self): """total = cpu + gpu + dram + ane.""" @@ -168,6 +171,6 @@ class TestSampleUninitialized: assert result.gpu_energy_joules >= 0.0 assert result.dram_energy_joules >= 0.0 assert result.ane_energy_joules >= 0.0 - assert result.duration_seconds >= 0 - assert result.vendor == "apple" - assert result.energy_method == "cpu_time_estimate" + assert_sample_result_basics( + result, vendor="apple", energy_method="cpu_time_estimate" + ) diff --git a/tests/telemetry/test_energy_nvidia.py b/tests/telemetry/test_energy_nvidia.py index f9f4264d..986d0fc4 100644 --- a/tests/telemetry/test_energy_nvidia.py +++ b/tests/telemetry/test_energy_nvidia.py @@ -10,6 +10,13 @@ from unittest.mock import MagicMock, patch import pytest +from tests.telemetry.energy_test_helpers import ( + assert_available_false_when_lib_missing, + assert_close_sets_uninitialized, + assert_empty_sample_result, + assert_sample_result_basics, +) + # --------------------------------------------------------------------------- # Helpers: build a fake pynvml module # --------------------------------------------------------------------------- @@ -76,12 +83,9 @@ class TestAvailable: def test_available_false_when_pynvml_not_importable(self): import openjarvis.telemetry.energy_nvidia as mod - orig = mod._PYNVML_AVAILABLE - mod._PYNVML_AVAILABLE = False - try: - assert mod.NvidiaEnergyMonitor.available() is False - finally: - mod._PYNVML_AVAILABLE = orig + assert_available_false_when_lib_missing( + mod, mod.NvidiaEnergyMonitor, "_PYNVML_AVAILABLE" + ) # --------------------------------------------------------------------------- @@ -218,8 +222,9 @@ class TestSampleHwCounters: # delta = 8000 - 5000 = 3000 mJ => 3.0 J assert result.energy_joules == pytest.approx(3.0) assert result.gpu_energy_joules == pytest.approx(3.0) - assert result.vendor == "nvidia" - assert result.energy_method == "hw_counter" + assert_sample_result_basics( + result, vendor="nvidia", energy_method="hw_counter" + ) finally: mod._PYNVML_AVAILABLE = orig @@ -253,9 +258,9 @@ class TestSamplePolling: # With constant 300W polling, energy should be > 0 assert result.energy_joules > 0 - assert result.duration_seconds > 0 - assert result.vendor == "nvidia" - assert result.energy_method == "polling" + assert_sample_result_basics( + result, vendor="nvidia", energy_method="polling" + ) finally: mod._PYNVML_AVAILABLE = orig @@ -327,9 +332,7 @@ class TestSampleNoDevices: with monitor.sample() as result: pass - assert result.energy_joules == 0.0 - assert result.duration_seconds >= 0 - assert result.vendor == "nvidia" + assert_empty_sample_result(result, vendor="nvidia") # --------------------------------------------------------------------------- @@ -352,9 +355,7 @@ class TestClose: assert monitor._initialized is True fake_pynvml.nvmlShutdown.reset_mock() - monitor.close() - + assert_close_sets_uninitialized(monitor) fake_pynvml.nvmlShutdown.assert_called_once() - assert monitor._initialized is False finally: mod._PYNVML_AVAILABLE = orig diff --git a/tests/telemetry/test_energy_rapl.py b/tests/telemetry/test_energy_rapl.py index 2bb80b08..db0e8155 100644 --- a/tests/telemetry/test_energy_rapl.py +++ b/tests/telemetry/test_energy_rapl.py @@ -11,6 +11,10 @@ from openjarvis.telemetry.energy_rapl import ( RaplEnergyMonitor, _discover_domains, ) +from tests.telemetry.energy_test_helpers import ( + assert_close_sets_uninitialized, + assert_sample_result_basics, +) _PLAT = "openjarvis.telemetry.energy_rapl.platform.system" _BASE = "openjarvis.telemetry.energy_rapl._RAPL_BASE" @@ -154,9 +158,9 @@ class TestSampleNormalDelta: assert result.cpu_energy_joules == pytest.approx(100000 / 1e6) assert result.dram_energy_joules == pytest.approx(20000 / 1e6) assert result.energy_joules == pytest.approx(120000 / 1e6) - assert result.vendor == "cpu_rapl" - assert result.energy_method == "rapl" - assert result.duration_seconds >= 0 + assert_sample_result_basics( + result, vendor="cpu_rapl", energy_method="rapl" + ) # --------------------------------------------------------------------------- @@ -249,7 +253,5 @@ class TestClose: assert len(monitor._domains) == 2 assert monitor._initialized is True - monitor.close() - + assert_close_sets_uninitialized(monitor) assert monitor._domains == [] - assert monitor._initialized is False diff --git a/tests/telemetry/test_store.py b/tests/telemetry/test_store.py index 0e2ee3dc..8c332fe2 100644 --- a/tests/telemetry/test_store.py +++ b/tests/telemetry/test_store.py @@ -80,3 +80,14 @@ class TestTelemetryStore: assert meta["key"] == "value" assert meta["nested"] == [1, 2, 3] store.close() + + +class TestTelemetryRecordFields: + def test_tokens_per_joule_field_exists(self): + rec = TelemetryRecord(timestamp=1.0, model_id="test") + assert hasattr(rec, "tokens_per_joule") + assert rec.tokens_per_joule == 0.0 + + def test_tokens_per_joule_set(self): + rec = TelemetryRecord(timestamp=1.0, model_id="test", tokens_per_joule=80.0) + assert rec.tokens_per_joule == 80.0 diff --git a/tests/telemetry/test_telemetry_record.py b/tests/telemetry/test_telemetry_record.py deleted file mode 100644 index 51ebc085..00000000 --- a/tests/telemetry/test_telemetry_record.py +++ /dev/null @@ -1,20 +0,0 @@ -"""Tests for TelemetryRecord fields.""" - -from __future__ import annotations - -from openjarvis.core.types import TelemetryRecord - - -class TestTelemetryRecord: - def test_tokens_per_joule_field_exists(self): - rec = TelemetryRecord(timestamp=1.0, model_id="test") - assert hasattr(rec, "tokens_per_joule") - assert rec.tokens_per_joule == 0.0 - - def test_tokens_per_joule_set(self): - rec = TelemetryRecord( - timestamp=1.0, - model_id="test", - tokens_per_joule=80.0, - ) - assert rec.tokens_per_joule == 80.0