From bcd4641c91b46f9a9cbbad4cea62570d703ac9c1 Mon Sep 17 00:00:00 2001 From: M Starch Date: Wed, 11 Jun 2025 14:14:02 -0700 Subject: [PATCH] Scrub XML references from docs (#3718) * Scrubbing XML * sp --- .github/actions/spelling/expect.txt | 2 +- .../docs/ByteStreamExampleAppAi.xml | 22 -- .../docs/img/canvas-callback.png | Bin 17336 -> 0 bytes .../docs/img/canvas-poll.png | Bin 14758 -> 0 bytes .../docs/img/class_diagram.png | Bin 41268 -> 0 bytes Drv/ByteStreamDriverModel/docs/sdd.md | 5 +- .../docs/img/class_diagram_tcp_client.png | Bin 22608 -> 0 bytes Drv/TcpClient/docs/sdd.md | 2 - .../docs/img/class_diagram_tcpserver.png | Bin 22866 -> 0 bytes Drv/TcpServer/docs/sdd.md | 2 - Drv/Udp/docs/img/class_diagram_udp.png | Bin 21994 -> 0 bytes Drv/Udp/docs/sdd.md | 3 - FppTest/enum/CMakeLists.txt | 2 - FppTest/struct/CMakeLists.txt | 2 - Fw/Cmd/README | 6 - Fw/Com/README | 3 - Fw/Log/README | 7 - Fw/Prm/README | 6 - Fw/Time/README | 4 - Fw/Tlm/README | 6 - RPI/README.md | 4 +- Ref/docs/sdd.md | 2 +- Svc/ActiveLogger/README | 6 - Svc/ActiveLogger/docs/sdd.md | 2 +- Svc/ActiveRateGroup/README | 6 - Svc/CmdDispatcher/README | 6 - Svc/ComSplitter/README.md | 37 --- Svc/Fatal/README | 6 - Svc/FileManager/Model/Ports/role.txt | 20 -- Svc/FileManager/Model/dictionaries.txt | 3 - Svc/FileManager/Model/kind.txt | 1 - .../docs/GenericHubExampleAppAi.xml | 145 ---------- Svc/PolyDb/README | 6 - Svc/PolyIf/README | 4 - Svc/PrmDb/README | 9 - Svc/RateGroupDriver/README | 9 - Svc/Sched/README | 3 - Utils/topologyTool.py | 258 ------------------ cmake/autocoder/helpers.cmake | 5 +- cmake/docs/sdd.md | 10 +- cmake/required.cmake | 1 - cmake/target/target.cmake | 27 +- docs/how-to/develop-subtopologies.md | 6 +- docs/user-manual/framework/assert.md | 2 +- docs/user-manual/gds/gds-cli.md | 12 +- docs/user-manual/gds/seqgen.md | 2 +- .../overview/development-practice.md | 34 +-- docs/user-manual/overview/source-tree.md | 116 +------- 48 files changed, 52 insertions(+), 762 deletions(-) delete mode 100644 Drv/ByteStreamDriverModel/docs/ByteStreamExampleAppAi.xml delete mode 100644 Drv/ByteStreamDriverModel/docs/img/canvas-callback.png delete mode 100644 Drv/ByteStreamDriverModel/docs/img/canvas-poll.png delete mode 100644 Drv/ByteStreamDriverModel/docs/img/class_diagram.png delete mode 100644 Drv/TcpClient/docs/img/class_diagram_tcp_client.png delete mode 100644 Drv/TcpServer/docs/img/class_diagram_tcpserver.png delete mode 100644 Drv/Udp/docs/img/class_diagram_udp.png delete mode 100644 Fw/Cmd/README delete mode 100644 Fw/Com/README delete mode 100644 Fw/Log/README delete mode 100644 Fw/Prm/README delete mode 100644 Fw/Time/README delete mode 100644 Fw/Tlm/README delete mode 100644 Svc/ActiveLogger/README delete mode 100644 Svc/ActiveRateGroup/README delete mode 100644 Svc/CmdDispatcher/README delete mode 100644 Svc/ComSplitter/README.md delete mode 100644 Svc/Fatal/README delete mode 100644 Svc/FileManager/Model/Ports/role.txt delete mode 100644 Svc/FileManager/Model/dictionaries.txt delete mode 100644 Svc/FileManager/Model/kind.txt delete mode 100644 Svc/GenericHub/docs/GenericHubExampleAppAi.xml delete mode 100644 Svc/PolyDb/README delete mode 100644 Svc/PolyIf/README delete mode 100644 Svc/PrmDb/README delete mode 100644 Svc/RateGroupDriver/README delete mode 100644 Svc/Sched/README delete mode 100644 Utils/topologyTool.py diff --git a/.github/actions/spelling/expect.txt b/.github/actions/spelling/expect.txt index 5f9aa87c94..00a65c8ec9 100644 --- a/.github/actions/spelling/expect.txt +++ b/.github/actions/spelling/expect.txt @@ -633,7 +633,7 @@ tcflush tcgetattr TCPCLIENT TCPHELPER -tcpserver +TCPSERVER TCSANOW Telecommand telem diff --git a/Drv/ByteStreamDriverModel/docs/ByteStreamExampleAppAi.xml b/Drv/ByteStreamDriverModel/docs/ByteStreamExampleAppAi.xml deleted file mode 100644 index def70ef814..0000000000 --- a/Drv/ByteStreamDriverModel/docs/ByteStreamExampleAppAi.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - Svc/GroundInterface/GroundInterfaceComponentAi.xml - Drv/ByteStreamDriverModel/ByteStreamDriverComponentAi.xml - - - - - - - - - - - - - - - - - - diff --git a/Drv/ByteStreamDriverModel/docs/img/canvas-callback.png b/Drv/ByteStreamDriverModel/docs/img/canvas-callback.png deleted file mode 100644 index 286eb251632acde4e57517410010821e1523d86c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17336 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 diff --git a/Drv/ByteStreamDriverModel/docs/img/canvas-poll.png b/Drv/ByteStreamDriverModel/docs/img/canvas-poll.png deleted file mode 100644 index eedeafb3b04fb44508263d017ab1e8df42881751..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14758 zcmds;cT`hb+u-$j6%_;(5CH>LkS-uCKu|!DE}#g~l&VzeHQ`=G5D-v7inNO;9ce=7 zSm-Tu2rW_rAtX`~N`TBh;CIwP>^^nX>vw#T7RP)&3_QQlmk^kCxlRAs z1e{~t{FMt+_j3&HnBHc)qm|8OUDRcGNIKHj<{LsSYu~@OeUtJ$W zXm3c`J*PATuA4sD?|L1!wX^ewiOQcNBJ*n*$hyvrBuU+q_Z9Ht2$wgBeHa!nf&bqB z9-S?4{yf@mp&mFKZ;9;AGNQd>TiDm=ENvAwLpgmZ{hn5sRNt!J&4sM~$2-MQ7R{_B zh{e>#>6e*WEwP>A0s?)0>$exV6GOv(<}u zt_T=%TX~wjwCuQ=VKf{6CO_YrckpLz{IS@wMz*%6ryD9Qs6|ZyC}Z(3o1NUS8Fg%v z6xZuV4V&cx4V5<;7-SuS!m$sMVabjax>Q$YjHIAHuY_PMdvTQbz^yn-?J&KbXV$#< zpRSE;nlh}IA6LZ0_!=rlvWUoA)Foz2==g)h2l{!&#Ze*yb8*h5sXKYZDHwtEGQ)^PRnVV)mZorRk@Ia0 zOA7*J)C=UMxIA3BTGxVL`Efu?AofTxi_ySmJFOy*Xe7^HRIPhTG}X8z$)_ALZxa;h za?T^({N~&>*0k@d63R{J<8Upp3m$)kc0KgtOq((}49kc+0q;`Xy=O^eZ-__dckfw0 zwL1j!)f2n-1TgLn!SHVHp4#WTLmbfl|Ml2NJFk0*_}cQ^4tI;ss2R#pY#@gP?4N7$ zu|=U!-!K^6trE`>F&nyBfagC2GL^7#0#4!iU+xIfsZpEz*V3g_=YseHjE+nA-FLO_ zsSJp=ETx#$URs+uDBz2XbMBN9FiaG0u=Mx6t}))msK30Kuh9`|ULs%ByKda++{%hD7l*DvMd&F z+eEOb=Utsp&2!n86m3O?uJUE#R_mJLEsH4eHShnLil1)~6D!|DZXHhci|SeuId%fR zZRp%Kukf%e9eOlEQ+mc;QQFVxzE|c_Ns?K{#o_*yjRBLqzCU_J^`?Cbs>NKcWHux>3 z`c-#tSXGmlXeAaSG@Ag_XS$RJFE`egCt z04_cz*EMZC5YM_;yT0gzwpdzOVGVRd4SEv>k8&!OPK&L5E}z~hMfr~`-W#rG5|qg> z60E}~>wc!`*Wk9P%^y79;-)Op#E_Qyd1X8$u^fiu1KCad1f1rW1?gDz9jW+AFssef zx-CjEZHn}mw&km&oH>5MBOqKxB@^>TyP|{l@ygrO5#L!bC6be!tc8@%`ICdQGX6ii z8SnCPpYB=gMdj+dkMiPoJW+IX;MR{FA36h1^^nUm zChRe~mKiv{lB`}dT&bl|=zvTPsa%8SqHvYLo%vp5$#bc>7U_fUqn2}MF6TW62w=B9 zLLToCqX}jdURILB!18NGLdBR}OU7u<*GUAOW@3Ja*FQH^lGF>Y^B38?jQL>73oqS< z2UcV@T*BgwtlaU9AZImA0Q96jBRyGTTqOP1<;UGSc1Ihsx{k&Y3`6g`OJ2l zumQ>ut6DH(RkauxNH4*a^76oL>WGSG7(x0_NlJKI$ft*HU;$OByqnNCvnU{i1!xCnB_&(heK9 zW=f=CO^qBt`xjHAlT6l5)42{8}6>Be^{HWG$(NT>6=Hmp{v1T78`ssh?Pb)|AA+)BD0@7zi(808&t z%Bfh!CWV+2kOSMb1KZ;Y`QvMktXDas_3Pq3jn+|dJCr9gEE<$~7m7t>UCkm@h@=~; zR-oNx$g4TmhXihD$#5=9%o|6otD|GLD^IQ2dGRhd!L784hWhMuc7`V{aOHs!q+Sm8 z>?kMdk8}>OXuZHgS+v0YECK1`ndX|0fDtg0wQ{!9Fc(g2oAJ$Tb{#?aD`#&Gp@h&g zS!g<`phL9EVv3`$!frJ{>nRN3Cz^aA&7DE<7=khAvqxlaF&M^-O|?vedn zCr1}h*Md4s4LJqvAM{CiK;p4lD}Z$&RwXI5wVE<`uIOGNG1;9al_;bcr7oL*d)AMF zmUDBiJk{*Yfh@FBz=(BDb1H@;k}bf@5RRIn&zFxSJ zI&)s{l7lR%MmY#-OBPz^UJV^mmQueuak=EK$Mqm4wwPe%vc%nKygRGC`J`O+xz8k- zAD{hjy#*}tGboF`5P2aBiKE1>8H4D_nl5pHI)o;rs!qDflv1aT6izc(I{~k4FcCA$ z#$#dmDdiKq>ZAo}$(q0 zd5jjw`}tmXn>qL#>^LjjlNUrZAPz#4!WOk`q(Bu}zA!i!Uy=8dCD3JO8}iXK;JSp| z17k}GN?D`yhv^8(J5yc8B~{~TD{=k@3jDp<)27Du=I1Lx$nQltiwQmNFw#FQZKXZ| z{BdqTh`zQmzuy>7B5g!%q((e1kGw2W0c+9{Gfd@N25$XCsKbhOSpPr{UPzQu=AU98 zSla}mU)q!%d`#&==BKn3AM!n+z7f(RO8q@WTM;p$#HDT$YC_^~F{VxJ2$LZ9L0^74 zT`d}YlDNa7;GhQff&zxglQgq&aQ z=0q~73Z0y`oG@n2_*P*p@aG+~HqjIKzNVA#2yaLsSE66jgt0LTsOx{F;`&*B7|_vN zaFVVhgD1(CWNVQ-vikhSU8TpLjoZ{jKl4gZRr{ODz$}Ak3|`yN<|vG>mA2Yh_3^qX z&gSL4Jio>Qy9zSN@E@IZ!JW(bZ(S}0f~`%VZ;Oak(iQJ}MQj-%HUHMN#MGCgE_dy9 z!hdimc`8NG@nV5Bqk;;pGpNPnP4~v_1WP3)r6qh7X`A}`#m*-avrG`1+G`e>WNL0U zZC@gX_*c6PfRqwbE%#o+170neUBA7Mm1aO$Bsp0g+U9~!*&c`UK%z81mfXNQa}&s9 z0WB!S@7Va}8zfr!$cTafui2E$Vce7b4?V;0mk60`-@hLPa(73_1BZar={AKSoqqs| zpC;S2B8F&SBp=VA2H*PeR9Uckw>9x)j`XpRqmjZT!LYqegCg+G(AFpN7TLvDoH#7j zOuUMU?cK({k`{l~YLj|aO9_N@#=4p$kl^lyR(NE>CttIURC48-Ny@Q@B@@ZK_H(>CD)o%)e6E_7Rjm`&Wj$(bjmzWX4b`Ndo8PQ3 z2UY9YKfib};%?zX9R1^`tid(R^$wfVdw#Kc`paKxCnsejVGXldc12Qcdc2|!-*>-AZreyGE1B}*5q^zilH4`6Am-d&ec>{WOffP4LV7bV z*TqNnXkId7R5JH*xw(R3jF_U_Z9^}+jC3E**phV(6;*AgGAZ=j$eK5d&&McvuSBu0 zLh+K?ky{;093IE7_A89At~Jys;t1zyXL_Fr+o^kiTm7-u4aN*%EsFGamL0Lkmy$Rx zpf}+89e#WtWuI;yqwD$A_dVG^QB?PPP?PrR$_h;ki+{(&IWvQ{gKHW#Gsh1*x;uA& zJZDmT)S7pp-TT+GEAJUDwmV@1gLo`*a!`s^5ycoO&f=ubBgNl8Iu{xE%$FYH?1}Q7 z<=(5Gq>NWLYq0s|-0tdrg?+w7N(Wa176h<(6O~rCnAJF#Fa=9UufW^zuC>ejdO|Tm zs0@#O@q%^(RoI8zKjGSIlj?Fzpv}12#4E4Q&OiK&63bA03k9Ax47{)ET;V$+_H_y3 zHB69aD6ZoIZbzvYQxRNrZUs^JXBHuHvG^UL2>DE;Hb&=F|hS2LG&VqpR) zL*wV0bc>?`{~nYu;4~ZZvG_oPRT?V~+5{R@0@m4Ee4)XByUZ!@HPQW#d4FJuC*XON zHCJ4(KPO&W8nq0!Np(MVuGcug*y}GJ`{*9#xK;#1e68AUEt-=!QR8bj!w}Y#(k&-K zOIj&=xx74L(-g`t<4c~1F2?N7An&b+Fo0@La^HLSiM4E^d*_HmYa9KtypBS}{JdJ5 zb?N~v+}@7#=Zinr34c*82A(|b)lAwfA<8aIPxeM7y+JZxK}PKs#dl?PtKhush`o>K z;KRwZ3rAqOkF&apPGOJ0GQxKs+-yv4;9ef7-6_j8**YIWtkd*dv7L**se4iq&-bGK z!^PL}F&8sB-U%@kL|ybCd`(O%St!@8ma~3wc(G4CC@AO!>ET1mo;++&Bm;W#)=pDX zYipo}>?;#d8hKJ^cfzkrKJ}iG-9GTFzV|?Il@4zJ(PZyVvnlpD1M$KmeA=u}G#W6;&!p zDQNP4O^BdN)R}9(r~i$mG_HQv!45+-WXoCbxS;fJ{KB zMeXX0lm+B}&$AA&)fT(?fATZw%jrvM4w8Ca6X)D&;35eE#HdTSmZ?dX|5Bp@RDj2q z6km31)c0Q<{!APXmzh?}*XanopZu=Z)p6?x{ma>L!hy z@14l=ev);)#Myh;6CLG4M?SoAy8e}3I`@sa_Rl;@6_;=uHkIkCiBWE_R9y{ueN&2f zZ%w^310`m9Qh<%wDc31oty!uG~^ML7C+zI5{yec|)7S zp!{7l3thAN^<)UGM6%<4S>?&Til#x9pkT9~EKDb(YR{}B&@}I1>J)27!QJJ$+xIcY z0?_XXNZo`(NJp)rt3!ck8D+c1q~F1&HpFL3I+weQZ>d5b60P__F8PB8PB8prCe*XC zyl{rwLEro6v#)2F4t+l+7TRG}t9+X2(23#fXx)%blf)7?=2QhwEXnQ28heV|O53Qg z$&B4b9-19_|IUoKSDdC}t7kwOf{*6W5ZI?=LU9deo;BRLNv(1 z2z_V3HlFxt+KeVRt$7ns*N?q|SOiFb9cYdH>w02Wod=5h*(u^IUJDeP!IsblQd%!i zk7|5~c|>x^w@p;Hll_}sklUQQkQoDss%k`G?K`C4WQB)1>OUCG#5TcSyg=)k_Tb8k$h0(>QMCO+S?l5DnJ#r;>dxL3s$UZ%@7da6TTfDFVoZ|x zMX_e04?R=Lt$~fT_(#QNoqJ;|Ruli^ELve^SW_E_slBtBOVv5;f_`y0A~D%UNdESH zYR%Zp$@xxJTs&K@Q_IAbB)E*N!qieFa=XNr=B8uAmbxC>mA!o!2GE^7ngL$x@fGa1 zDr6VtiLr}2T5Xz3;V`}#`>m@ESVEY%+?cIC>R9q8gExYyzZLk2FL!+Ee!TN2F?H*} zGu46{8nwU*-i1(wJt^Dhmz860Tbq6O0s@shg0QkKXpw*J%pHzMM1 zZ_tVOi|zCqR5`p8`Y6oPL23AM-t!x!VG&0pZ6U3J*R4+;Tf3CGn9Y>jm);a0?O}MP zg}#1&ZcDHZ^sas1KG&p_-PcM{UXVclE6v9WIdeRaWn7)x-{RY094RbEq4Iq&;gSI zYhxSrl5xOStJd|)b5Hxh3W7RI8DCrYuMMP0o*S1>D|ztsDV}@9FyELrjU8@VVk~S{ zq)ddneWs@Mer!9o_K~Pvz?A$s$u#v?a;Sf#EF&fM4TE^(|$K0=E-Ibejj}Be48k)SMS@)@B z>Xfk2S?LcXwgf33?#*g;pZf*x}(n%1de)pbx z@*Nre#vthHgX0roYs>RpoM>9%1=qmNc{F+v6X@V>*a@6<_ElN|2V>NzYvB`mX@fFo$hB}87IRmHe{I;x@QgsY=%dKEM({c)fK|+_Y~3UV+;Xn3*u5D5Kh7yr&n7Y{72KXafDa-b1YbGLbe_8S5CMZHt|Z}e%_Su*o4)=g<qHxs1hS zn!A)t+~3!K(W8$ssw7Mom5H#`*euc)z4_^vld0=uosG%TTbZo)y#(CyLd`lsN^0lN z>+cs!ee~`{cj?i$6m`*bb0k(1>9DbV&P>!RYpc6-Rhz=0TkiCZ(vFA(OU+$H8^plmiFUbl-W5 zEp`{w@PTB)s0JAV!Vm3nNHU3>HT;IWwfx9@=?fyMGOD3}!RzqfftLzO+T7(aLlVdDxD^i? z8M1#s@x9iXaKavy+9q?WK=qt(>r!D);cM%|+wLAOTjt9$&AHvm2&Hnm)WC(Lg1|_S zlgf$*O!nJ(f?Ukl*JO+6dtN|5-6Iq^XobV4A)YlvZ-<2P(^y#Z(}Ph^HY}arW&GJX zbSTysjgHUcQRIUM2Z#M&hSis;gcSIzx2w0<|K8|7<8NjXz4hf9(ANQ{;fultpHspj7ek_6 zq`ZE8URKt~gN2dx>({TAU%p(Y>{R+4fknGfW^&e}CQVNp3O;guq@u zEp6(+Y+e%dt-ySf#=?r{yXDE$A`eg4JJOVdxuy3Zh>F0(#H}CDmePMfyZ| zfU4hzgs9 zH~gPJN>F-P*=ke9zI~hzpSl=@pEPh|_+OMZAC?Jg!RPzyIWP^*|E^kZ+ls((g&m)iG47mZ*z%t}FTIjN zQrY37DMUZ6>*b7}7Z#0$iAg0ikhU-}HEO!8h{gn$z1p+i=HZcrFq4Fvf&B8;S5q1` z&Yx9qt|qQ%ibW>LE(J;^UpkV|Imv6?)Se$}*;aQYK%SSm+5T7go=VZWle8Ed_|sU^ z%rxtafA$U4Q7Y}*)O(2Lywx+`X+lO$rX?`r&9M)o0mLy`Ia+7pah5h(=tQgF3F-IU zU1GbzLP>zbb+mD=Zjg@IeV#4U``qm+cf_X-o|ilinP0p}zP-{AQ6U!aXjg%HaQIuS--pR!I%RJtcXNMfhBCrP?P7%>a)82$NyVS%)-*$Ev zML&DX;k2Iehy>r_DB}UyJzH8Wz85XY6N5zjH4Al66i0D_k-UM%`rVE$Yrk)1bdh$}5|#Dc8#UIadrT8tX(FI;3;zmd{@Vb3v8 zjOV5sGNDZtqRYftm|gQ3o&V$K5J;C1KY5EWB8siDz7l8K^pcWhJW`^!6WdCX8qSZA zs+V8q|40md9HME%+t%*AM@+QF5P5M}@k`avgxn(yze!-?V%5~OcZyBY=G;#ONmdLo_x+HcJKeedxx?O|t znXE?wC0!{#kWrRcy!I2ctH4*1f59kGkJdK^#pxe;FvK&<{-|#*5bm1K>fMOb3Rwvv zKFV$rX2!o2&#r#iU@yJrnWH%kgvD+}V5OL{X*QG) zt=z6w{MY54DYbc8URizq6Rv93VDuY@mlCz?mW+X4z(r^%K8QmSCAas;Prr5k6kmXd z;vI#;s_)~~yBv!upNwgP+}2mrh}=IMj3 z(o@ZU_&CC;q6g2+{QmNBEMnaCvTgJ2F@U4R_v;1BP@*JCZ2rlp^h{ITodEm$heQ7G z9~|<(JU(m1S-HO{8hKgT-LT`Ad*6*7z`YOcqPFo^J#$nQ1ibi`{0ohweubsQU4Y1Y zImP&z>S$&$M$VkiN z{!f7IoHBmrmU5E;m!L=94KL6iV!7)^C?+5)qC%`F()5)+=r1ZuaW`ZyMQ%IY>sOS2 za_0tqsYDYx;G(P@=41_Ap5Oo7j6mOZ9BmGJ_1b`oI3M5=9Qk`b3rB7hO8Zs<&>vnBzIc$Jg;rdv4VFF|{W=L?>l)V$q4V z!T@qt@44x0-n>rM0MS<*yN<@7jx$(SVFr{$mD=ha@7QuXes+E^0J-XoG99^K@aH>_aVoGkJ9b*p-RsZHF9bVQr z@fOW;M&>Rk%*8ziOqDYurOB=3{$Ia6w+xs1p8j>Iv)mN|6*3`A+0`Pw6KpUQmFJ+^ z(Wrdh<;tDb`vmArws?>Z#MK}Gw{7Tz5eN9K65?kyJ}R|-fqlbc*oTs_!}3w7W;ql` z4ZuiO;E@qZC!`%J#^RGuZDe+7tL*KM>kW}}rH`@bqfnQGk^u!nH7QkW0!(7GJBNZ9 zMB+XsF2lhXToP^?#!yBLn(Qi-22ZQlb*<-KU-_EkJ2=ME=kV7pjY_U-=6;5m>OqlU z2S8b!r=xx%_Nj8z?;%`Q7rZjfylF4ia2%k{Vd9h;&Q!7cIe_%djbcwpOnxi`{fs0n zte@{N_j9eupX>cZcB?&>J8FMFmm zR%!QyF)-uLq_swVZ^SsYIPk%%!<PH=KQ)9 zo4Ks!+T)|o0-}0a(zEf{T1R5)W$?krooKC`$vmpk1orq+TWo0Gvk(INzggU~=0f>T zRW77uc4%*bfds%k5QRKSkG(7EJ8b3eF0C}f7#IOgp;F7XH-M>B0!;bbuJeUW$OueC66t(6{F@V78wMRn-DVW@% zo<`Z9rbBr)RM0r2nW!{8%MZRyGq)b~pU+UB_$zSBR8BSo^0T1{8?C;SGJ-NcgkBd= zE&-E3eM#h@?WaJ9=1DQP-4v!-Y74MI4Q8M@$`R2aix)5g62L}F+LL!dgrab zWQ9Y%ESC#Tc!PGTJEw17DW@5C1j09|e2fV3FM|;bPI5{ditYv-iwL4)E>eJlU0SF4Z8N?;uOdXk>#!6s*Uk zpW13?&l5W5Jq~o@4l<0s@0QiwC73f{%}6nwY1|KffQcSwO_*{R?czJ>QJ!*jGNWAoeda;2WqK-o202TV!#Q{R*RAf+l3k`HAujij{V_?~w?Zr)Q2JUBg0t-_(a6Y(gBnPHf@+&4ESSaq`v zQon+hGo8@Qp{&xX5|yS7VI-f|bVAc+Ji@@@y}pWC&8u>VV~}uD6@R7+U(ie49h3 zL6KpM7d?Wa7$-+mM6UdEY4d}@DV}v^3r^#tb4$d(#52bVYAT?pfTL+Ody~@K@vInA zDp>U0^!h8r?d5mo=~K0}ZRlwTA48xujex|kz${2W6H<8LwWA-dc6R9%eD__b5kLpb z+yA8XR-b?a_iT4{R>Zhc*i6WyFaLg>xzRGCJsZGTI2p{iZNPw?kZGP+P9~ro5!0{j89vIHDuK065hTYaqqW# z0BKJa?;O-AVmGS7e`USF1tMjbiov?})mxaX70)9uE4Ru;Tk;nP0mG3Cue(zr64=R# ze;Xgu$O$KuNRzd~>LzOCR%Ri{bUwHmpWpSk&!pOVeozWU?D=R(+d0tR*f^YA1u?R( zF!<;b-1})Za44d>-d4kPW6nDDQ@QBPMxuf>IAS_a_h=9!(4pzKcd7tn0uvIVcLQK~ zx9KQCS|CVA1r)a#jc4HYXM-XWjr~eSE^vHc3woJ=>H!*{fTicV6Sfj*Z;uw4A8NOlbfB`amdY zI>Fs}qjFgT)Q?(ChRIB+;*Yos z*3C{K&A0C$O+jv;w#j@#U0waWxVXB)sNIv9#jgcX$3X~fPfGkzM7}XM8UP4r_{;lS zwK)@Hv+XZmx}*8by!}@l3Lr;n=z{Bhq@4M)J;8!GCKef32v$xh!y1=Kfc58tBdnZp zTUT(90S+@_?zu{#Bs5!V@7D4BN+a}wI`d|{q%?BI2f?XaXih4!w^(!fUP0c_yIjO< z0{Ui>YoHcHcg?rFm1po|kK{LZpq?g39m|zSk%sw!&hih+cb!4vyJ@H?CggQ=E2Pm? zGPrDM4~PmAzv!{wEr9u5?O8VlNsA*zJVM;#zG{8w1Zx2zSJI2n-a0aAhhYUmc&|yU z;-MkLs>L;!PD>g?Kk+xUx2{9brT=+n54%tU$*Rc#b_RIKP;ioSzFdW&Xt8Tz!MsPJ z7V$;s^#x$K=opI{*@~^q{-&dt3MDW1l$C&fOm`7n*VK*v;OlpOT{BU)ih3yALW$@- z0NiBF4R@l6sd2lhom6mFwzHmtmt7q=v1sc*>uo|OM*N7Dd{*M;ctezj@PE6fI?L2nEW70OSR1NJn&193CzZK9qCoI)Q8yH zMTos^goeIfD_k<)FdrP4MqIf)_VhX9^EdDA<1sxgZl}WkGlAowt=cFCMQ-M`*DIzUo8+$&<8SJAO7#9k=|!xN1Wc!Z;Yiwd>pdQ_ zdo-VwR${;HS2W1T`(w~Z#jZZ`*+Fi17(VVyXF)f`6Kef|n%Daw+-A~Kyi?I&`IhH$ z?J4-*HS#W@W5${V#=`i6m>r-H2Kpihdks8NrT<4Cso&}kvcnIvv51rz?RGmPH^kX6 zgk?$#EIt7p2>o&yakjEAGNW09Rw zLBb&`F92cdLWPbceXOzw|F$aiOG@tt$sNoAzFq8qk-hE;eZeibOXNBypTl3o_=%N% z*?C5s`ZqN5ufIBLvU} zbB2R+gBwD3Ll$~VnP58d*ff2dwyx5BKH8AoChs0BXxT)TOUe|+xzq))ALo(3Pu&=J z1$tuM7OQ+jjF`=>FZDxBG5_vAA!VO4sCxwyqP$2VlZeX$sZdca@ZEJ%03vmlY_XlK z!2DhIUQp=wD99U57%8T|;I&rMOjhPUPi2Q%b&MMtdTkgq&B`vJe~t_)wYJA1+a+*cXbC_j+S87>pw)@0FbCT8j*$}D{(AQvnX-D zru~Th3H^`3;}fKf;H`*T2`&XVf|+k}hL}91uj?_Mm;2|qjHlUyg0CS5&QD4Zicd|r zX74}Yn*N(#qaq(IY55>n(1@^I3l02#Kchr8U3A1?x)~d9wytf4p1e)61JNcWz{<)t zl4upbL4Dae9%7wp&{Y&qi7nfGlO(L)cG&O78hGiXFG&wed$np6EZ$%*`3X~QLfzO0 z+xrE)h@w}NLDP=^iGwa2&21$qfruK}g77km#{GF+-g}&n7Vt+3bOCrFDTuh54C-{C4$?a z3*H;#P4uuB4t!{82&xU0k-UNpH^#_+x_zLLofF-3*)W`VAXchlsjq|_b|(g$cP}tw zn~sB5hV+EFw}RF|BiH_bAaSh3E$a2QcXPX<-O=;D*8E*&F>f|s?Rmzc!EW?nHz$_*R_T$|^Go`F;x7Kkc1*O3k zcO&j%-n-uF;34h@+C*vb_m$#}m9W&9y&4oo5WV&7IfwJjX2H|YW>Q_;_c}wR z)JGhRdt!$_=2y!kH`x;x&yIRl&)9v$8FV6!T(R?mavHcsJ?MsJz0ZzXVuc4!y(Fqo zZziWP8o5uY9(tQ)SosOW?H;*Gyg}VNYml(8KN$OY^zm*fDms>Z^I~|xoA{uv9kq2N z!`o2BL8jOzAJ@Lv*syWsLhX*w@r$dwCo<`GNrlKQ?H@RFCH*-Q>Np&`Z}`sUz+k*= z`r>dea(CAwBgxRaKoV^f1 z6)_j;etON0iCQ+jGa+f)@W`gWXxGZIUAD_zPsVQNbH4IpI|b%-zCo2m;nFIeir?|! zihZ6}*d#~7)caS%wYQ(tjpgelqb}MkH3g4`QIXM6I3v{pk6P}j#7P*nd0QZBKgqYbT(9q8+Fapbsq+3oee{*1kJ!f;7kMM6 zcuUNpis@6!Cd=h>v zysoGwjxk5I?^&u#z4)m0ESBBPOn;rAQe0?4*Rel}Jtv93Q`nsd|L5A26zMJc+q&<^ zzb4SS8^ANPNE~%$deL}L8Qt`x^)hCqA)`gUVRZ}MX6512%`xZ5UZ03=19``*z6`HD zI{p}`nN`1I-A>hX|7H>M*f!th_AHA2vIgUv(fHt>?<|oKiLckV<|Rr$ChxFCHWo)S ziKoWh#c){suE1!d`=wzzhe4n8^nmTN0G7qss~NMW)R``F8?}$EN*1(gy*jhqRvO3@ z%V}P@{hqGs92fZ3r?2(8D8E*`Kg;2_$2PhAnkDl)pKs2O9^Ag-$Q%@gpV94;)bq14 z6o)8Lg4#d@wYNNynNf6imx8qWhO_beo`**c8te}(ho5#xoR9=yxzrF*DbHu%AH?7iuik{0t{77%wROY-WSs73n&qYwcC88pgI*c{im$~KsEZ6B*x@lkq-b({^QXWG^TdiMNfpVUdsf`M1q znnGMpZ@6cOkiH*Hu)&yGQF>fchB69Y95$sxO-lS;9np|7p_}lJXb|An=CZ1P9myny z`2+L%4C-g25%VqaJ~vG97Adt#AMfai5vu9PJ&M5uZPCAjncShG(#i_^PFJq3&1F0p z)|b|fRM%eS>-}+cny4t3h}Hr98lI|L?W*9nOr}07=SONE_)n51N1!^n@|7bC| zI8RtOY5$Rd@{x!|>E6#H&wDj-t*V5=KMeclVpA1!M|a-Ol~}r9U&TLt^PvwutJJ9v zlAx<{Y?e);-r-P?T&j80V91@BeaO)*g~RkY#Q^_EpCZV<@I=C5mrWkes#ny_)|Z;- zMVfEg?`J0-w@y>>F6u46%=GV`@#YJgu}cpM-2pZ%8^LWOPBzlpGhCdHI$LL4qT(NiTJ>pb;n!XN{JVRQTlu+piHfQQ zckjI`YVryt_mwK!%AP28jm)buYOcv9nNZdrpHUb}l4s^H<>KmKQio8PTPS5(3yKq& zNQDd8n%;V*T8PUu78Q8~*VrdZ9aGJa^4yMOja-3|;c2i}1{`iCu13!PulTtABPKFU}I5 zC*<_=XN+#Ifc9+fNc^xYLNVNTWBB}`G@J}f98FfHftg9Zgcr}N%0%e|$`uM&XNfM` zP9H2&te|e@$LOr*>X6Du%}vewXtM58`8v1i@hp667h%c}{$Zf-QbOPQRV&e?OOpbg z))+5eR|$?4>HJMI%2@*Q*OW^h058;%PDOFJ63S>u{;e34IuuNf0y}6Zzk9qqOnuOY8j@MOj z0olaPW*>iQ{_cCUEPWgmZ&vH_Q)jK~_j?He2{Wdi%+Arq`eB(jEtMUlvtJ!3o=f&% zY~RA_I@L3bN{Gn$MwZx4MSd{pM>pHKJ2!Dj>=oOCa`J+gOxmiuKGr^(l1494=7lP3 z6RX?ntuBJK%;4)hXjr%W*cLiKUN;iw z$uc{IU*|>YZ4#PoT5`65fQN#_^Px(DY9J7nb&3I9pDByprA%ssWS{ERqyr@>svH@Q6R` zh8xB#zV(tkyK}i#^4J(CDs;NGAP^k&wAA~oY&2O;MH)Ym@(Fip!^)wDWiWO7h z(9LiDiFUPgDoKi&hcuxKi<6W1bW24(#F_Y3H=f8B^6S4+!%m!VP>-%Ib(Q5kZYRE;QNL=7JN`DElEA0pwu+GRkCc-Rp=GQB=fJyO;|epX$%!wT__UupVHES4 zzm%sQZG0s)Ei-!dJ7`PZU@MJc2JhLVR<69f{rJ>T*ZrA>`r8k;S2#ty<->^B>q8H621|n!IZ|)TfOGm9Ty_NbJ6|by@0spGS|&U zUw`x|-94eAx)1lM4eS?Ry|^`f<9X@81uvSF{u2EG-~KQ4oxPRzXS26)g`b#Qe-g*o z>vYWFmbdZ-rLJB*m?Nf5y?#mf)8!xr=RNaUbV6J`kL9&O-0%>0Z|8*cduip2wrqrb z(&5EzJ9}F6%T+743N<6$NU7!t77k}EFvzbBe&W=<(yLxc_b` z{`vx*agEhwt@WlfY0s9^!JD)A;b}oy2J{o@?SfnTnO}YI(YxtVkGFk!uTNaU`t6lH zQu^Uqir24=;VLrLFEIucZZoqJ^`2zub{eQ#t>T=AzZc@MZ=7TrkDRD7wbk3?eA{Dq zrj75)>r)$MlPik$o>lv<=CAv~2UU*2RuZBfbPC1}&C{PhQweg;q`h1)YwJWUkNn-{ z;qxE*=6xmCJ3EPY%P$G@_?sdXW9Q_pCw-NEsg^r) z@Jwk8Ey|R)oJD3eoAEvYMqW8be}dSL^4|8j>qq^!lB;M@vkSMaYxI3IEENi?uoUvP zNFVxJ+z)1Aw52X|`oSvLe@>}6(mRqoqLz{^8KUuECnSVLL*B#W7=M64ETcSIl$x{M z_PxJauGA!+0u&Lk;Fi@QrdWpT>Eu8Q~jWjTz*#COO6(Di@9PJ6;AohGEwxd z0V{;r`j};byurDTsdkbRIt$}%K1RG$Q>fgC4z_)yBw*yn(5XgGlM) zZ$G>+X>;i*eF(L9y)iM3*Vmo1ZiVsQe{tZ~HJn-U*-pXpdR4vO1e+F)wIm_G#l>FC z;SJy4-{rf-CN7PuKPd0=4`TQ85!s%T6o?~X9^4_y5wxsQzn3MrdY(#x7EV;wHT98) zcqBsyEsdO-P=~p`btxwBAtRa$XBAJ?z2{VE0M4fKH_Alg?9WrJohq=6euU!l%ug^s zUYWJK7?}0aJTa@dyR}a!?YCy!6kpxg=@Yx+b9F%?M}qne#%w2556ag_=1yaVpRmQD z*h-I9w{`DIIMef*pPWr|DyYFz=|Y!M{hkMD8jX{Lf?^o1<0-O!vg!0n%P(`)I<=-x zn3^~advgpk2xi2U6w*u*du96X^*3edjI#1GW*N(kF>yA|eUr)R?(%#spNqRSl<9ME zMo;4X{!#=*a@3rkbw?m&@@YpekmC?bY3YZG($fFt!oYyv`MefaXnRN=tfo+M4mTFfg*Rl&JLO^+SyLzkhR= zZZc0NUDav#nA?`VG~ePp3wU%hEKY`^2>$%!e_s`IDq1iJ)k_UXQ>eiY2V`OT2(`wB;oUOt5! zZKU=~%qw`e*s?Kc)W=;PaWXB7{hecQIV1f{?nKerRpEb!ud9^dl-Rd_xLYMkFzzL9 z=I&QVi4gx5u7_nJeW;3spK53qcOBl>p8lccIaBnielHv2-()*GU-zEu8EH_aA$VuT8nT(Cw#PTr7THAAD0<_^aMjG12B*98E`Xj0!n5Rcnk& zeb{_e#4YfG^Hw>U*u7&JHW6Z$4C45|_mrAW56rL0mI`?ZpiY&Sto(m92afom8}pdx zCvOlar(%=uSJLSW&}Ulu)63wx=fp%sMSt(B$8FlWxIf-rfv5bAP)jM;Rls_bfcpZo zron&ir9$6x^x#D@RSwxm70lG#Vz!Tu#b1(Aefi}~qGoctFDClK#R-$kTBtQch@vxd zRqhv3a~IQJPl>rD&@N6e<-`tqnv`cI{q9FT=zN?|(XAw`i&fC;eo-(_yU|{ICOltr zN?D_BG#I?~>jL}Q*N+D8E>k2bTMN-x8jqd|jviuqWyiKUH_4AMqe!+*O~z?6NAGEN zqOTSo=ER(-Q{3EM-b;VMafa_3Wr;yO6O^=Z&6;d`tSs+6Zl6^2gb|8^~2UKEVMM>%E z+T`bW=};o|M~|fL-@g=*ow+J9=P-)Ll|K|-x=NKXI$Qg)V4Nz|*s3eD9htbCmf1wC)H8qzvHvYB*V7R!s-7)@x$)b`XqoYGjM@Pr0UzadH|E#q6+{?+y zDNN?((y?~+yn_%9R-oAaPYq7Prgsb%hn>&O%@>?LTUc6VH8s&|YHoXoF|o47zkYpR zPjAwZBF&h}BE{|Tue`!rg@rme2P-zQUL*C5PX#>y?X^Ptiqp7_fbx)xkDxy`HnuwX z<=D=^Y_@!{VHT$H_G`oZYtDHepY^glqdDblvbhn@s@7p9db~$I#0S@7Gx_Ot#`#`; zLQ>N1S8m_eBZhuy<{3VT_*|d-fB$~I<|fL>$XKjjpZJiiJy$XQ(^7UMEGzOsO^pCS zTV`%tR@8;??2er)^71Y=)=vl;6I66PCt0 z4aQ77YzZ*UewHFYO+({(yqwR@&As>qpZogVyQ?4WJGSvySX*NlO*eRQKK&RpI;ve` zGxlX;s=lD0pmok+YgpHQ8~$E;sHGLsHkVmg7_q-PQt5rNa1?99%=A!@ZHPJ;7e zV&Z|kJhtJ*@yPa(_s`+so!LO*kM=VXq-12vo12S?x^{Eel82XCjb4Q^_$EIw@C^PI z&+5GNlGj9oh($)5YE{roV_`&G3%v?pAu)dc9xrLaec|@z7fW z4Y(GQWEN1mxn90AM{yT3GLVoAs{T7osq?wEKHe*XNq{p;5&;WEWmoqQ^^MA&cN zzD0wFkK8>+S%VZ4sqxCs0wyLVv>(I6a<;a&VGXga3kX~t;w#C-36|=V|65Nn9E3~O z)!qGthu~myCU$1i9G(u+c*?y0a6Ethe5+4%bJjr!dJ|k7pNdI$0=sgmKr~Wq*z_L$ zYil+U5fKWis(H=L8BtLL(8ky}I82}p;K~|b>^PY0#DcW|H+ zFg`uqxAUhz(~|n~<;yOvuDm841W*{?y1So!i({UAvDvsbRiD(3HRF5YWn4}C0=nantlN?0Ss;aAD5A@A{jeN^vj9yn-=`bgy z$3;2kkUTi}=x={U|2tu4Xo-9K`&WoUEv>B3uS1~}CPYL=9_=JGM`g1K(Gnqz|L^y= z(pFZtVB>JP&-e(!BVys^jx8*_B_}7>_5FMM!ge{F*==*WcWa9WIf~N2_+mV_{);=E>8>yNURRX`1@?MGo5HYo%;&pFQyl-N0`Orrv43 zNMD`u)OoFd32odmMGH-)D1YhQho!x+g9Ep8?;XW2b3EKlhc_iMV&6YVdZeKtEkq0B zfPw$b7d{miefber=yf5+Mky=;sl8qXE-yb!*};c=Ds6KPnQV9|dB#*&@Gp2DENTUg zn}*E`+-$P0%pWw$bw5C5e{!CaOb?kud@>zsD^cgVLwwdNZHMLI5)u-$ zosw7A?c^9@B~ZDVZ%U&td+t5+ld21vCm>D5IjA5@e^buD%tsKBh7xshv&nq7RAEvd zhxB{Yq%-UL1QxSS{=GL=JI&wemCV^JsL2B*nysI=apjiyj<4fD82SRJ@ zC`zYUlz;Utn)t@OTy~gS6As%<`!kA#CdhMESh1pkfGuUMYYB$v;j?zWk?ppAtr9=O zEh{s2_A4Y(pT0L5PaBo13!kZu8>Lgr^6+=w2-#CaVCC~4XT_(QX*{d9mL?;QSIV~R z{LoJvSf%5+zZ!aQ>DY9SrkU~dr58R>uecn#MX&c@vgye-tv4Az=J!w3T!)n9J%?}L z-kh0p+hk`jZ~N<xEkC|kbYE4}JGji@vhlUr`ee-?z> z)GqP3{CveQp&*z(tRj@^9u=+Idyc2)MVb4%>)4@&eBh4b9_PpedUb!Rs9!)MO~=L% zCB7Mfi6FK3lyaC*=G~^0(ov;`EH|fP!#1)bswdCr63}?i+tFk-jE+f@o2Z;_J*N|T z(bYasY2d`A=R`yP_};*-LoU&&K3moea`C;5>Y3i5pZv5%g~#i%Hjx=U^qbG`NXaK# z-+fCp9c<-Gp#PApe5~~vaRvJ;Ei8(p*5CLow@-`;pcUx)(YWxpI0(v26BZ9$yBX2? zx8{lf1MZapl{JB2sfV+XMtr`Vqo{f=NGrK1O@?>=}&Z_GK3sW)^mKEK~$aIk>o- z+siObXoVcmnrGAi2LsaiFi@0!3okr89FXL*$}u62t?RzchSVy^w|7F@laHajK}7&J zXFo;F*}d#?$8lbUTsEtyC=#0XHE&Az{-I?e0RaK%8gP~ytgM}Nyw(X*cC4bJG#UM& z*=&4#d?YxSx!cGsKbN)NrU;jTq19nl$txn#-O}Q(sd9AY>!Q!f&W@YfE2p7B2J?T= zV;&>^?Z&+HU4p>AK2eE!AZ59@0TOz1mi$^$370|){{(j5FR33*{nY6HqJaVsm z<0J0o)41Vt#%;EHYABQxj$v zqk)Tl=dw#&T-?hkuA-E~rQd8>LhH&yVk-wbuN7pdW&a<^JHqwNYHFI&#kCwCYLyQRr~?cE7(=Sf$}yoy(L58|YsN@R zG&D73YnwcO*y1Ea3-p_Wh9cDp+HYOIj3{>b*p z8DM=ZiD9X0Sh0Jo`fA|j{_*iK)Y0g=+hff)ZfFA0ZU*>0RNI>nevM;;nsa`YT&L}4;84T&{u!f1-2SJEaccO2vfzy4Q(5w zS}0Ppd`SikLxE}M?ORGRLd^oK{`8hXS33QX_q=8TRF6=p*_9=fY z3$SvANU}Fi6mNItQ|z$f9dF0_==5;EX~Y~3)v=tmm(?WyDw0h_hl+@fX6EI+lGL*w zfQrlCc{@yOQA>t{>9Jlt0=K5;wfr7b3!noMJ9lbpYlnXQl67+v03Nz|(x_TpBC!^7 zVQl!~<4AOwQci#PxjqoafO}}6ZTFu&yJ=8{V)Svp5wKq|=$Zzd{^o0(<>h722L@-u z(<64i-|hb~J|5BYCmR?Hbe5*mKinExT5?RJt#-90m18_ALn&wC=i=GU4FD2{s&eYE z-Rh@~4F)>lVK2L6uZl!ulMscLprR!FPMvd{v$K1y_?#VXn$%8Qqo$r;&d)Fd6bo&# zuD<@L`^kB@Y$R73oH>PsC=^3eGhF88FuM}q%ECT^w(@gPTA~~_JhytfHXaaqs6vd> zczK!#X^A==*U8os<&)-Q^xs=dSf#lA+>w>+S$5Hx@h5Dr@fGozO;kig&D7!MEtttpf<^W9sr=T% z57pK0o0>8kl#S>V#7=2gr^xyEhy#}V`ST~*)=v$!3e%peN)I0Js>BZuYsJtCOWD|P z1_uX2`?mgj+SP?)YimnDOdOw>D5s^BSlvoYNH{P!D8)v8^Y-oNsw%#sk0LHhB&|jy zv7OQ|h~eh_+d_$9l@x*2@DM{`T@GB}RTwGjUy?dvuqmx20TUZE$Ou@v2kv=vwJNqVw4KP$tj(`l-)ztw% zVdCef&>txYys4t1;^OWeA0IF6pets#UoVd3Ew0(%yyl8TDgwKKk{ zjPfzsbAsl5w1tI*ORK93?~@E}l7?%)>7M-T{8s#hz}eZE%|uN!Kmurz3J)ISG&InL zwzYzKgJ>@Ek=!gC9Fd?3rTZRRa((_y3PX0R#+C-u2qO!N1QWq03YxOChaIe zxYVo$wa&2pk5h%s*d1t*4>jM+%^6!+StSeF({m+7f|~Hr_sk0#Gk}`MPo5x5wZVYf zdZhF{+-Q5d3=~~>bo8GHj?zrn8vy~A3_Sl(U}0n921`NvM!4+SSY<(3*T77U?JW-}s;HR40XE}RxNSUC)YL#RxtdR%;1-vcmNIK<5&?C=RXaL5 zeoqrk`uOqVLZOP|vpXeojnwjp3JUveccrLoXQcW34V|bPkBErZBs=Q>SAPthsK?Qt zq@%Mm=0z}!m?lv?z`F-a6KoItH!G{k}0JH5n^yK z4}0x>K{%{W=CdRvV^KExRjAo;b}*5grwA1UY7d|{IeGaKC3_c_1bF1zlg|B!tPBgK zTVrE9Rp$yruEuUkNr;w(G#omv98_j)Z71HZ@o^o{EbHp1Wz{`)dj&1+?epO}&C@+Y zV2$$BGE`wJ#ft6V00h_Cuktx@LxdQ1cH@ilGvoqbk6T$=dxCfZ@Hh)p#JW0>;W9%t z9;)Xa9?5@tl0aYnP*^B6#AongogbD1VE#>z(-IQMLAiQ+$28(s4H`TLo9TwP6dYPx zJ3ZW>hIVyzmDeRfdm|?&N931}racx`RySeLi@!K1hs_9L!mnSy$SEkEYHk{y?@$_e zEi*$AB#U|8f#+@la-LIN(qrv>6kBvQ+ps3~@yQA7IRF&2C_PQhv3hrIadGjbI#pL! zemIYZ7(J*b$PGX*2Gtb}*`lFsxp{ejn%jUTgc$PxF@U}Y4GJ_jL|rLL)zQ-GfX)CI z2F}Z4JB8~I6(q*qbxOz20*&RhwdXyF zw~+z^%?V}#colis*)KEB*399;jZ;{Jg@yH;zA;;*gcKHn0{1#TJ}}Sn6y}hBagZpD#&?eQ+x1SYc+S1~gzjQb?V=sJa|CFD$peRuByBvv?pT0^f~qxKqTAUKP4jsWdL$*c*+8}|t%ysQ;n~U) z#Hav?ez(Z*EaKkvmdliS_u$3>%xNVx=H-Qa`69KlvZ7sWMFDfydx2&Ku?C8ZIa5+n zx_Wy7CBELUGLC$8Ib*+E%ZU30o(Hwd8Pn>TN0g`I*VFOK>xQskh!0eArU4s`aezCN>!$j(%IFe3B>0DT%TIednK_aSu(FA&?N238y4AAMxuU_3bn6Qt3^X4mfR%7MH7~nFnN@VnV%`DxKo0(a6 z)6m!N1r)~5&!3Qxz{AHE1QG!tY5*`r^idf_SAAkZw}2rQN<^2PlY^l$q@b)^HC|p@ z3o9Z3@Cm7wzIVcVDAX=kI9tEt)j*W!2d5~u@MCIfDtKpRpywjj0f@QWte3jGr{`&v z#T6L5h-waAUr1S58*)pd^s2$@L3k@*R2 zZ{~Qo7U>6Y9l6=r^HYqLc)(UTb!(zPDhCWBmpkwF?<_!I|KdVks@+WifkZ$KmC%1d zvVdR*)MjbZG19m|cNsPZ@c|J9E{H?hlvDV^;XF=Tv-g`&jhk~WA_IJc`9t6A{Z4f0 z{Z1X}y_RkO=A8QyJn4I~{#Z-v4uGLVF8yvg_sRPJ&CrmM0}orz_vjBer?4IFDJkKB zyTm-A?@k9ua#$PON$A_woVRsMnVFflBMnbqBCrOUaYx-GPSrSo7<$3$)RaTi@5+U_im@{Q20!l~Ym@4UP%5e^3zS`L5(eJoAG@qsp;l z0oxRc$Iw#X<02^zF0MQ{4u($B>5{zUJPcaX<-zx0Xz;)-_#U<~IKd_I!Z?7I@|`(J z?`1Zd-i!5WJ?CD2*pxi3E01BQ0LFm*3!__2;)p3NEiL!`d+@co;L5?({8KYww-D=h z%81y9@KE5XJ3%2h_41F9;01%u`Z&Z=d59CM=8}PB%mo;r0BXwXI5unVTnh=9+3cKi z(4NZM{)Nn73kw|Bf*eX6;AFdql<9UlW79Wxj^Nj&u0<8M|K6)zv+kr)=)J+b<>!9$ua$c)d_?Y!T0*iLuZx zt=7xL4igd+1J&E|Y8)0$uPfEfSVf&&yLRmcIUejAXo0LOEFD&&8U5z#VjynW)lPVA zK4g1NXB-8rRpK8vZ+145KhLys42)Ccx~(F$nm~tY<0-De$3zDuo|FKKmmu)dC!q#| zGFRJj;4?7c2VAG{rbb6c<4X;p`^jtiWH@s$mrpa61H0M@IPlt}uv<`bzb5(F>GVQA z@cC)M_0FaZnW^UOO+TBFn<88;*+(V=o~i?j(S9>zJ{yPMG8b4wQsf*PJ4k1_y|3qh23X5e0+b@)TeAyr0EX*MMFINPQTc}>G$ney85X69o-ne^>F(5 z7O#tzIIg*qpnmLag9VZWjHS^Iovxg(LSx`_=j@_)|t)3%;^?lzN*VB&~AEH$c#!*(Q7F6{0r<*8U`jc^uYqfD4 zHS|ODgP5#_>e>0u@A@i&Q7_8k#m^n1?Hgw3&s}`%Kty?>=NQa?aNy`Y&3XjC#Ntsl zvvX!ZBW}bfPt07ds^~H)Wp+KIiO#=s;dO|R>;P}ek_$d?{d5o|p-2Zw@?X=|T^QN& zpU?WgYVk6pkHto;(&Qi#hWw?scms^@KlUja`DEHDD=9_rCo)sKJY=eS3HS%#;j+{N zBOeEtqG0}6OFegKdE8O0dVA}=l!tw1-}DpmU|_Y^VqUczZ^6I^qTJru$>2ICj9U^P znV!$edXTQ8{WcF$0W6}T6LlsvLh0Yzj?vy|?LCeJ;RQXw-?duh>F1cg4nj+7Yq@~H zz_SO#QT1f+RptFXJW`-H$;nipZ9aYv$fGuL!L8m=h*qnbnPzUA#u$X_tgHaYZh$!b zFU!nedTU&+Fcet4Vj;=b-6Q3A|NcD; z?T1gEunJ;QfXe*+E)UN=Ah7_2fk+`_7aV5bVuQ@&$iIU51@zR+$jBeDLP0F=>+9fC zA)*su+8qT^RHzcYsHB7txINg(5!tU25@ev(KoWqxufzz-xTBc`0Q<_ycpxeO==>}2 zF%lCKbp&IC4)U`9(c%#i13Xih^s7~*^;4=^T32E1L9M?+fb~8LQMX-WH}%Agzko~d zYT4;C8ynkf*K0-?SPxA8k=_URqK}WgU~g?V8!u^zLIL6rpOIC5{8&D*4tBm_o=_OEY#%c@ zgK&9DYAPUlV4I-;(?Chm)LcDyHb7H=bO(qX1kP+q+7&+lv3a}VzIT9C!!)0Q7EVMj)&-F8TThP(O!MLQ z9w6MW?gNNmjAn%uVC`SnrhUTuK0hCbs{)v_(0B$F=Br-aci*lEGmz8add&%kT~p)Q z{g3q9f2|_^AF}QL7_$41uR)IbM{ocCcKH9bPX8ZY^ZzdE|Ht9~+ne}5xvKvgv*CZb zs&>|1J{5A=`|9MD1dciwJszl7lKfwQa$!VMOTFVV{>s;DWmHrZOfpX}VsjxQAs6eP z^}rc_+cTTZ$UUvkoli2oWd|jFBC%wPcEJ-QcW>l3Hu?PSRc%#bkNF$E=($N!Is@0p zwOg-P%n-krd1b&TW#*AJhmoru*&Ng(lEY^H5+Z%Qh0I$^B5C{oYTx@{-#vHWhyR)JS!TGD=J5H!H0T#I4Wea z__I_ZFBiAuo}n&?4hc{Q?w)uDuwkMzrCEymKWnQ%Y(aFeBF0~jO`MknE{63p;}kjanLPJadd3KmY645 z*m6asdG>uzaLp2)jq4jNvE|*+d_$5kBZ5y(A?-?{nkF-|W^Xj!*lzm*U3cC2l{n!? zrItD2_wFYa0Te_nb*!2Dwl|+%j!H0;x?bgiL>MEC zsWO(_&)Iq)f&T%dfqiu4gj#fVvprXmstC31+MHNzgM>I_pvMwokS(f?3X~4rkpO(t{ zf%~L89%vNE@c+c~FoCr8npKvvL9oNFmPUUBWcUoPWV#7e$Us_-v)fukWE)Xo`S|!C zDkzL$B-jYuvaZyxc*fIP6I`YcWA6_SdO?B(L<|&$iI;afsHcPt5A0HC+(1u?XO+~{ zSOo-zb+lyFL018|eVwEQU_Ve1*Rx_mE=XkpM}w>o#o@pVQ=JMhN97?VS|Y#f)rJB# zlYp$HcPp1oBzD@>$(Cp}x2DAC@E0uK{#KO-*fKW0MQ~9K2vqdFVj5gK%N~hYtvwsEMlSJltod z=0rnMXcM*ei@*)%fweNhIWs6r8ejuJKnlqU!iOZ`GFu*E-WMk``NhQq%`^7Z>sivF zh!MZOz7Cj815`?|xd9nMb_^ALE-^48K8`hTAS@7;V|&du)I@q~bW^O!Cuin1^;Z5u z^}xj@;59IdUcN*J#jlvo(cGL>x7O|}4*`HqSZ8<=2qu`alUzBQvG-Ix@YvhWuaOqo zryG;U=e&Fq@3h(zy)+Mkcc^){&rl4kr*Sal)6?mF&sGg9?WRP49R;*#vmXv+oF^2O z){^ zLbM<{;$Y5fE^gFs{_UW#hkW0E7wKA#7Bl+SYiCq_eI;N&fVA__MTi#kTpp^b#BX-B z8C%Xd95s2C!%hW-R+6R@ZW9 zRw^=9T|^MqELw1Sc2V*|*zjb0S#e4E;ejV=P3O&|ACN+1P4l&D6~x{1PlOxs!uDPT~5h!L`}Kt_JFDlpcKi)6+f-) z82>>D6d4$QE24#)M!03<^w8KAEm>#V(oBuX`03V9*;O0wy^u|UTra5GvAWX^LN?-( zkj)z2U%C**GY z*C%S7A#(fZ$&*fyuGry(9Z}anDu#66Ni!OfEr0tqd}z6yPX!{OYLFWR?qm#yKye|a z0q`F%=<*>z4OwWnjmdAYFaWKM{-t~Yi3h95e4@q{StZ~aa0GZ-xL?111$7)qAp8qx zia*C6=5Uli$$=q+7(hr2w7a_-Jby-T{=kc0wNmB(`@H;qv@^DZa=#rfv9D)yt_*%fJK$-;O zXD-csdhSP-G`Na9KF2N}D=UQ^X39{7RKk>G!HdaS9iz?uLz^K$)EUz5*?2S`AWfL(y|6A%zQga9Sj#h`J4ybmGf zR6%?2bCTZPHNRs!&Ig_F1hr`nwipr}hNW7qzH9a!;cKV+Wq#GZ7lP9sfg$ihq3XLX zkm}VnVJX@`32p(YS{qEj&4yhfa5%wVLAuq1eX|M#m!L^559LE@ThZIQVLuJo#o+3~ z6~F@LDZhOQR2v3Bv$~oZF?<=w#&~5TFLdgrfqjvq$ug4@RN9`1(puT%HZ;83?Gud! zs%dRXBZ)(En*uWW%j@gR;O~H#3-Z|0MlXJ77!0sddfwY#5pxJaqfTvvg0JG@zO)fb z+LVN;iSLu6!F@ogoFDvzZLs7rKyu7x!vpIT9(=gH?`|s8;ZuwX7!S-)B@k+jPfC)v zw&po+X`2upJR$|dy!%iX0je>gXo9-{_R2Phjii*6p{1)JBSU#5L(Sn+ za#f)hfeCUM|0<*wj@lT`@9FB&gcv)_wp{w>wFc0=$E&SNY9LWJyEWIQrOV99isT_2 z9eMx!`Gd&Akeqi0yG=t=Qx+UZWCX+gDrZQf!DB{bRclYUCj6_Mv!Eg}f~N|G+(skH zz^p%A1qu!g(N7`X4RIC76obWGtWzBU3>S6`Na;vAe=Ah7{MlE$aquUUP}46q|D;%# z8bkC8d8MR8_hM7I0+j5cc|F)B&5*7J&W*UGtA-aTC!5U~AejQ9gozIfd!W=Bb~}Xs z(Pl+wj)b0ObckG|-x}vTne> z`U3u2ME2In%tbnEb?~{+>fP4oV?;L)!x#+4O1N0?%Fw`LpOcq7zLKQxb`6`D{x@RZ z6c!GSkK-Y``V;K9w<4~$xEuFKV1|}z!AqE52oLyI!vgxz=0$%#qLCoc)oY*@c`arn=rr7je6rJ>1Ey*|4 zJFI$lTAa)hQE0S;1l6H8Li+-num#f6`^-60*?>RjefHF0mO%^y05&-D$mT-p7e~=j zP*Cs*2*iQ9045;x52W7zBsHHh7ddM1KJA zTD2}<+9R6yv*W#GCKeWOGqvm8Zo?Pn!Li6VhVtAQe88=4V9*DFdXL|)<(HP0kZs;@ zy3>Qa;&ZgSsJmddyV!3ImNxWASZ**lFu;id*VQ^_*Q*hP@=JhWN;dG3I{CcWbn>CJ zv}17>QeE&2jQ3Z5MMXtzm0cW{!Q<7QY6rQDt8woUVlu&w9<8-!;BG#>gOn^N%nf^k z4~h*MQ=q`_0D6KE)DO1=vkV{9t@667)z#Hny5IsMPMpk5I58y1zCz`*-@a`+n5zg< zGbnKF{k{ixkwzLp!2xh!_O(2{G5DS^1IodB1kb(Owsxumd{)oX?arsQc687&A-dta z6Q99z=gybrvx(*`OKQL4p$x<<21f=dl;KZ96$^Qw$3bEWLG*onEYKVQh(cZfo{a12 zaD{OjmR<9i8)BO+#7g#MT%4N2J}FM?I6c}$0w~BN1xN%MrQ_k2G5DXb)<*DF0%ED0 z!mBT{n|>FfBL**Sr{rySF~;)1`(x*)i;_rk;o`LaVhaq2z_>V42nWDiLCkA;de0z) zJ)ExF`~9;;ASZBf7<+*>TUx(?K09WfVTuf#G!cmHATgD=2VBPBj1+5EyhLyr^dUH| zE~h3QsSsi3zhFpgdo@C*1eG6I7g%jb6Tog$Cl3ZOwrS^084`+u`he3Sb{wMKLHG$G zG4RHkF;J!l+>HrHmxnpU3;z7U##B!ru>|sVko%+~c46U1r$0)7W4aKJ)4*U_USif+ z2fasznF^2hMr+&NwYx}q@b>NX+|U8Sw(DSRZu+9?wchW+dr^q54u}Wwc0G2!vA%`C z%L~-TA0RXcyt=`~6$7e16doGnke|c5FmUA{F$#Mh@}R-gz`!Qr;oL!URu%Wz1xKu=HE(vls52(XcWnSqN1PLIxuzNHX{Dc2Fl0a;3jaJ&|m=rL3L2m(7=ucr3p+%u(%O42BitF?m#YBo{l#< z#+{IWKzrf(0`c68_inEqn6|KNkSsy+3mqMCX=%Mbe!SA8lj$6TgvY0yZVpfIPDkrp zi+;I6Ux4Jz;PiBiWeS2l3=Ly}nB2SY5S(C*)Us9!XA(Lw|83Sj1V7L{y(rZB4D4;qv%;%XM_eU1a9-fPzOukr!hVV7J1eA_&1P{(52vST7uWee1Py zfGB`!igfr10wM7PFL1?brpd;}K&lQX43s4}`$)nAdO^wbeK1Pk6)u1pmtFz9(A0eM zD`bGT8fkdk-gEd!gMnA;kPO%o&*=3}ZU^G6 zV|r3Jw+S2fYJB_?PbQu0ohPbD=rfC%P1!A_Z{YI%colSyOo5hWQfNEET{rRhw{dsN z1D_3szD<|huD*HBn0?>$(9o{CyZ^1XFOSBuZTqbrgi=yb8ptD+v4o_MlFFEQNTy7g z$EZXZnxskQDTzDtoDd>Irew-kk`O|sbQ|~YtoK`c|FPHi$KGpw?^^Hk_VyUA`?}8a zIFI8uUGq^r)Tk-R@yiWY-(PLj)OLg)k4zqlJR7k#LKRU=c%Wddz>!t0;_01w&hT4& z$R+4oPVC=O4!k-*E-WBrGC)LtA9T>1*-H%3R zSLRzX)!K*=8dWY1HIg|%ju_G)03*jk>bbm0RF@B!a?l)~IeC)yj;yyV*NwIj+Oq+1 z&!5u-R?DKouYkJ=z&sJ`iMHv#MJe5~efu|*l-=wBYFKVPSMwEW$N&6m%Q=> zRPV+BIf5x|Ung2YPqPXQ4MagYUB1Ou{n8pe5DPBJJZwCtIV_aP1Jk! zfJvhzlPB783J4AxG5^~BRZmf$2~IHFvhP2{!9`2Uvsyo3vGX=a$JcEG6qjHU&WyT% z1uTojkByP7#qrOL6(}3qk6c;{vsG1JERY(~sFDgziYpFo$aqrdk|FL|fktM@UtjRl zsZ+OD{1>jgcUu@N`8Tk-9O6HB^pS@>7hbWj)gK?j`~#Upq|~)=2t%9k5gi>f*{|P| zi_`NR_sG=vFD<}_&ySjiG<=@&90O^C%JczRN)?rclpZVBn3A*DUW{)r`Wc=N5DJ@7 z)Joo*+$t{-MLc{)``>-|z)ZUOM$0D+*T$S72Hoo~5hTBX(QnJPZKS}boXfjUT)qoG zETrRJys*?NZ0rmb``M6nz2V>69q!Qyn=7~LYm3PaJU-cyX5gc`x?1*Yq@%=ydn6d$ zVpP?@YSRq8RDG|-89b5LwvmfAHm1;m5y2AS-&@++k{@-MXFHZoJ{H9auFE)w@G7(7`N?_ACXUSz9(SH@~^w^QRB#7Qmab_*b0fX1Vv^L9&dq zrR8l6UO#2Z+kU4B$OE0x&5&7~xNxyU;U`>PELlFZ{B!;C8}c#w(~EFuqavV8XtZ7s z4EcA$ssvLCPUt^ZkA^r3hVP`HLMU${l_^OU^+L}VQ~jPokxFKJsFbSW9!S+-73ZTZ z&BsaDIvaiMmo8RBX-mr{qE7W^6(}7AX2RrPkdP2e=y%#i;&FuG+kg>Z$Rp~ydUMUAn)tsstI==Z8VI6`0}mGG`#7I4WF`b> z^YQV)92t)#4Mh=zoeVUqOtW?I2i*dfeVXu3yq2-fz{bbToXKk&(KJg;Nr3_SA>@ny zQNvxdvwMbegl-Sms4^Z906%EhGpt&9XL|6RKdG3 zv-$^%)dF2S)(C`3FH)Z4I-o~;g-)F`wU~iTg|}ko;6nkITKQ$d9eWXnJ;um<{rhO~ zb!S`0;+uzbppAmxTU%ia#}uGwl+WkG>gUcBVVKj!R01pyCkC2Ld_t%mGl@*_)mKI! z-!IbBDM?B46-pONWAVLK!*OjRu)`A~8?*(AE#$-KU!cWrO)}zSKHKmb@T1&iGB0+&R+MIk;u_0j~)aatt;d-p;i^l70m zMW@McXLerwaexd-C^XdaJyJ6GZ0s_VK5H&yZjp;~)arh8X;g<_jE_#i-|@hfwJ*cfD@txd!(Q}i)*k0+qBGPjPg)e{ggzx`8bLH!VxK^?z)j7xFV@)(iVM6M& z0jI;e?@?uf!_DFa#1JXk@xi2XK(5-lza?P;^*Zrn)19z1?!$MhrdpbthljpRnXuu1K2IqgSNcjmrKzGi4`-`V4QVR*7OUhV zFxp!o?@g)~(^7moMPktLdW`aFxsl|+G4cFE?$7U;7Z2=dZ{g($l5cEls{%1ZhAXIL zA26CmTn&)risk*+uuh~|^Xg%0GE1ig_0hC*dh+5`&v@&o0sZ-o9Bbb`b8JSfFA+*CL* z?ZBZLgOL?fvxse*W0vPV{Dn*Yy*Ms&HBXOHW510Wb8+0HSS)bdt%WWU0~7(7(QZjZ zjfpmYTX-{=-(O$yQmm+US$WBRaLIG*Na)p6k68uJ70yfc4KGX1&hsxH9yD-ETf@1W z-FEeq9t~xzHTBweC8PaCZ>9K)wlcmpaxl5)d*Hdrw+|(~obyzPm1m&b8V2UC+U*gKne#0C zyquqQXm(k&t&*H^n%d{%x#}8Nw^OgQc@_@Oq<)_D=xUFcw_SIFYgJfzn1HVqo4EgH z<5J=9(n5O0o%A;k(A{dJn56TByN|31=}c%@P@UKR*y&fYs{X9}@jOpZhv$WrpEvvd8>wC#A0PF7n@*S-`$=8i z=({Ft;bP!Vx?u&%YA10CH={`LwVQYTZ1w34=ujSXlg(;nNVfA~5qjCTe5dc*y0w|i zhl?iasC7=3k(~6$*6lc4wBbCDUtbHKxN`ArW3F`qhu%KRU5?6|-VwpFDs(hs%*Wx! zq3^$>{jM&re>Wtom|ozY6GwB6hcoan-kNOxHhNqpAGf=&^?38fM83 zZNoz4`wa$f?wZ}cm9cKe+s}*Jw(nTJ6TiG)=f<{@b+u{N)U~h9tF>}mTNypi^Wz$0 z*28Hb9^K5FIn4_1ZK&hTw0^V)l7<@}eb`z(>=K&2b=vg(?U0-seiw9C7AVr4u%T-% zKae6>B6o(AKAYp(y`(XrLuYm`^~_rbbP^ZVT*JFZ-3*#GW` z{$3{0WS^~U(@$)8Y*a0fWc<$(6#D3 zm5gb+7j}{dIZ|zJ{afPQXmHw>bH}ZF-+1-+-VOS=RXj1>Lc4T#UFe!nmnVG=A!?F$dZUizqR3^ZQM#9AR|JrTdnOr;cVW? zvGx>|x}<*ZR^P*a0#zFd3WPgH_&&s*+8(~fOxbdUKU4SaFMH_%`V9oK-P(Wa+_lsjNU}EfxmahZdQNPBFg0IkFBklrqwJE+O_ohVYpu- z)|bWUy<7iSU0ofh@*AZ_Zw9AS&z`;BVN*FWqlR93dRktRgDPvdbi98Sm}XlD z6TO(R2s;^;25)I=Y2jE^;%B|!?yj?2hnf6BNn;NWeKR+(RA@b3T<}K2faV2f14cwN zzv+j6D>2Jv___rEV!m?qs-~L0KrK_`;Uw)^si@Q3-^a$HT^}cK-Zo+wXUDJtMm&K+ zfg|E+e*R^x&$8ly*Cd$f;iTJ&vBkvXc;t9l#K}FzRb`hS)%IgZG7UfUZrz7yEyl1?s~mhIBYHM0lM5i7YR+LZsZA}zl8QrQAGvA zZFRpBS{(Fk2vJfCdrI5Ol-2ew?A3)Zc1HUM)J)i3 zWU&4)?0;NZWf8||6vT!2S=ZEdhNx=j%ks0UQ#nukG2oW>Il?T1=CR5oGjfAK(K?k! zr_A=UlG}b>hSJ@}z9w>i_m!38~;at*?)JH|NBGz`P2XZC;RVy*`FKwzkg%tW8VM4 zTmFB)uocsD%XWGaQR||V_XKf89;%#m?sd-JE)jJfV1{6bdejN`@g4=S2u&}GY+d27 zdsnn4?+Zp22TH%VZB%puQ%lp32#|q^2}dl!+f{wsEDWs&d}s0FP95F32O0vgh{LYK zn;I=OKG)LvcG#3z9ottK)|SR__-Tji*t__Vt@B=Ge``a8K@ER)1uUoj^lPc+^ds^k0qgh180! znqM*KXQv4$mN0%uV93zn$0qNcxv~#=7N)|+`?ow-*FT0mmes+}6UdO=!9U)=DuN}U z`Qo$2y_latrURz)0Sy3v4TFPGuAWeiiL|XpiO2%s#MlBp{B`N=6qhBf@@7B{gM@ll+zkRaj2= zY!?rB|J->&EaE^!z14E8j*c@8UywX-Mf0dcZu+vTNCbFewEtnX>1j$cmrlCqiAPFx z-VQ6dlxHvVon*hsNuPdlRph|EoneYM6?y&*+NFQ};Ddvwl(wzCNjoCAq4aB=?zu#b zyY5GoMc8+TDL$?@?-w`h^=4OOqVthBS7)AWoTm+o4NMVw4;>vIs_%gbA4o-GjitKccE!jX+q*h<1-``H6bG#S`Lt`zO`DTPSt zU-kf?$an^?^wVe??bvL(k8wRZYZ7Fy<*&oQCagDKrxGP5EQ};E-7Vfl%!W7v%y6?o z12kH0dc^WM?`wS9NVTaj4o4ySMm-1bpxS<{y5SdVH}Lf?-Y+%601W_3aIU?AmQM#l zw{rPcmiz*?3SC!=T;*s+b^v;dzWjSuhTlK9b#6vZxnr|~*p^ z3Ca#wZ?ivD_+ey*SLms^WR$hmQ{W(S)Bcy^ugWlLEiu+^qZadQq7JwThP<^DiFQ+# zt#=Gpu$kRN%zK7m=Hzv<`J&T)C50^ zd3~CZYl^6hUE74i>U591Dm5|!yavb)uzw4E!kwEv$0(jTvkx2+m<&VQQzt;DPUA(he_JkfR$Z}(c-RUE z@?1Dx9MPJr9Vj1fF6ueDL=BGDVjY#B&O9Bh<3RLdzY}6FTiirqhhcStk-=#HY2Xl` zcEO~-cptIc?L3|wbfhG3&`ZkjeALM0oGTwCY>QugTh{9OC_I}-oo%T}aP=6?M(5)q zu>&DEex=Z1C`UtgUt{RT+(BWrQjy_twJnyyq06USN z6@JFwbih8adZL_v7Pc>Dtx?Os`S7maseSa9b3)!B_5gHLpaFXvr@yPh%|P6s1iS}p z3%E+3Ay}F6ZOfL6fs#kb#YbNQgi6X!{hOxEHlGDwfi3BPW= z!y5I-9u7>Rej$}UQ|H5w3t&Y;6&NnI8mgW<=Wmd1fx5WRgHM=0KUS!Dt7-W7#?Xa% ztK~FTgV7^{Ny*NVD#a@;FAs!S;DH^T{%~Rw z8{0uKv74Xl&`ZWPFV5=9I{Ud`tpnf%?|Mtoqscm7%{9VMd3zr`p}Jdj=O;Ffj zk&)%S4try7SD4^lH~`TCdWTfLvR(&(>GJS0qAiE_Fu4>6Vl-fX{72k#K^zAVzMcpQ zhy%6o)0;3`4T?&P`SQ{tcv%v-5VT~AiU^q=`665(N-RM|b#)Wz0&yJ(?hEL!A&oWQ z&%Y52K(L{FM&5x5;6`AoIBQ_){?VT417Y5UTs;dWX7v1IJwZ1EZm%j>;N0(`o_R?$ z^r%l$QsbDm@D;dRTr|!bLjCLTC)7N#k7W;#+mPfp_O@x&sOQpD3~2-)z_@5_{njeC z?ubB+UMeaX7Bu>vKQJi_JAw7)hrxCbt7N8LDsjURxd726^+5^n44hDd*U}WOo;W25 zsA|V>l(deCh+YXw{!g>j$E8eV3hwe^k9_$T$g{s0Y@nm zR)AGaM?SLYW|=aO&;!&MIO326)`0K}a^{oxLEvEP`LxrZ^M>K-4aO}{FrW~L+bCWQ z3&a_Y)unGLOTJ)uQLIsBbT@!%^BBL{gHdl4e%N}i-zV%|PsrI7&1jK0i=_#Ub9n8sdD zDU)>%@|r}vA~OQBX4t1fH)6JxnvPxHd#Ug;l48k!i8u~J>}wDc-4Lr`3rq#ZEcjxf zWVlb5pz9_2CXV^`Dx!J1Q(*!j%>JWC@4cpe)cCgwKrv_b2X z&b=jYLTjbyl)`#VlyI3kinJSc9=UXnu%JXshAwzvi5)+q5?w1?VJM&E6M^Re)BUa1 za7p;ogPmrmf8YQxyt@x4QrZ#CixpCiiPS}+Bj0%s^o3Tuk<#&N>3oRlpYU;bL?y_~ z2v11h!SGE~fw(O6lTd=OF8#7!Mk;Q;AKFl|8+Y#HiBcw{6=4WLWmwwUl57$@m524_ z)XuizO2V2Ez#R|t_po+J4aA;AgjsF+7);ntH?LVYgcT5(D)cVpP@e&0_87G`>{G!) zB}RP+Ob5wFfkSWr%pGTtJSiVz#q)MRq+_Uc7U;N*O-#IjLlDIfY6aYf#FLDZ*GPo@ z3{N1oZmw_$I?H%9t2fvPs2wCNm`EX0^FG&Ln-IO+uV2sFMu-#)I=MBh{(dFYh>}>; zY5psya}wH|XA2zR_GVC^UkBZm z4WTm5Xu~KgJ)k8RUEu4?It>{V!Z9%Spd3L|gYydb511qD6tu4xi7;MOR#raYP@EDy z8K;Ur>b!P8fCCMs2zd=BxgNn3Et`7ja*+WB9}tWf0e1gj|I4Eh_zHUrMd)wtk?u>I zt&jtP)?$fCzuVi}s~e_|tb`VgCiCpX^Gx_UsCkK?8d5P|baJDYHr|oN)CW#V4H8al zMuYSa4c?P~0rmg)iEkH#X z&I?xmlL4sjOkicLk(MbGqwE3Gsy zAf!N15Zw$%h$&(+u-WJ4NXpvtq$I1412dpH($ZURU4ks2JV`Sdpcg1O%zB}rp=W3B zSM`BO>_1f3@ASO+BCZSaW{B-Dc8f(QwU&S~=es2qLE<$kOjJ9}awI+;=bZEjZXOcB z(TEBLku6Gnjlk18PcVJBJ};VgKU!>5VJ#!^sowk`317l89t(I zfD}Uf+MEcHl0p<5i+m=+6hz&1RU!H?Dc7qk`# z&?l`lnDb|ei43R)$Of-3S*R_^z~{ss2L1t8&-v6}_2-pvRzWFDyfqZ*#ft!FJ4(Dt zoJ>Pdt}xXsT9(xJe0|nBh~M~AV}9sgW}k_Rvt?NK+x{J1B3d-(zIq6Cqs_rLKwsI9FjAAhG%1h{5PcKkNB<(~M6;3@3~hawBGkff zu;GAY1BprAr^^#qYAKSGcwQo^vTp)b@+t`MAiT6d=mSo7xZRBQV`xB+4dnzdtF1eB z#Q){4S?AaD=K{px4W5)CiV4tbASq?w>?LpO&W3>lF1Z{Dl`SOFCQN;f8EY;9aht4Im< z$}!HT-p4-K9r`Q#fp~^!5TICq(iJ4bDVQOExdVBIm*PcoGCWTJyh(wFyatMo-N%8B zV-(&U49OW$s9_T&`LWrad<7W;z%e{rJOXT}NYT@6=GjG~tLFd);BUjCqk*5KL*50JkQ&%eHsp zMW>M^_7l?EP&9Vx8XC{#-Y+~oUSHN2`KnXKn_4Vp`{>va9=EiUk2n;=O3K23cvP6+ znJDr!r<`71c%x{m7vHL|BqFdp8-Ch~)tmME3tjWh@f<(K!0PAGhooI(=Zm#G0l7iC zLWSP+9R^k?OcPm5QX@NEMV3`OxjjAi+jt&J`Q@RP4~UA9EmY`(MnqbFTZ6~=vE=k@ z*KVpwdd|pyjO?V-MOAtQ(KimwY|kUJpLkdpG*t$zvj1fEJU(e#@P#D|*Sp+$nW>w39kpFO>dk2QZo88XK|X#IGIE7RA=z z&XrSVo0ned@MmjXA53nb>i^^1Q`&7EsgyGie7^Ah%N1ysv94+;;HRxt<$pM_o%Oj< zQDEHLZsm>-AKswh@@*dS_!Kog-g0N{VAs2bT>6PipAJRT6Xz27w_T%Bg9r8vP8}WB zIR85AWyoo6;(LSAuZCT^=UOPvs3?P5%IQA-?HnavX!yL6-xV5Hydz$ zu{}0ohAj>GoV19Re1F%R&DVcra%+-@4VMmEhrg>tRJPU#P4A+_3hQ36HM?5dyf^U| z8K~e~UU#ccH2ISEPtOg!;?CW96(+GjTJt3Y%~@@@G_f|mYH~fg-C4(f>M}i>1a$() zcL1i^AD8C6+tae29+WQZ*!_ELEDfj?mBK6+ey+c|eH#$Z;BWZTCEmJv?_nl`;hp)o&sz~67T{%wAj5I_2lx^f2(Up>t% zc&s$||IQ`&=B?J2b>acVc0Rz@m}H>CKWxE1=VPc@PjKPBGWd1wZy}5|qu#=SR)36k)txVHNvM9S;%M z?`@;=KTI}5Vu(H`OwmMy-J(Aa+_|g#i$}^7k}?w{ud1Pu!`V6RUB7?~iLlU6z+5K6 zVb2fIj~`h(cd+9sP%}U!Ys$t8IBEHS{~kCHJ2_rmEYo{UK%dTsMPNgUe@j8r<#g_l2TR9fw*IYGQrQy=qCr3pLV7zdTNAoD25k>%S^Q;nI`*MtNpv*_@eIcpez} zX3nHXiaZTN8f_ypXk(g&rcX+4Q5YC(qZ&v=MfXoN$z>_>_@LeFb%@mN6JZYk5(eZ1 zd?Cz8Yw7;U)cN6U>!N3YL>~<5>Z+>HIu=?|{zd%L@mX`!9d@aZz$T;pq$j~_1WJ@U zN;y!GNArRWh9681@;W)z0~TMa*>(u9J^K{~d=g|KisC^L5m_jZ2d6SI6EAp{2#*gI zj&&zqXZ<13)>&;|9xnROi^(>~B~5dGUN@K^d`4x;1)wBwmNa49#_5Qjl31DuW;KxC zUmf$+^5Zejt%G{B&Lg}fcw9I11rLpUs-NwmD&LP9zdY5`qravau(~n@*3FeqU%%Eb zS_Tmdbu4ILWF?~Gz-U2o>hNBML>arZ(7I~|sh(35=kOp=DXI6w1V)a_`9+J(DTfX+ z`>!9lRtaK&xVjx2n2QX&K8o|F#-e4#ttPq z5y^CP=OCa&ARK0~nFE@pytVx>E)81}SQ^3RWfX_!GWL3U6HAHR4jxcGMp2Tblwm3sx`ya9A!0lv;qM zl*o=LF`nTB{2-_wkcZ>34|%mQq{CCiRWko+92B1XG$t<~<>=GPdVi)2*7rMM7{cFS zIvtKW$Ioh#xdo_!^zxMS;0ca7X0$Y5{U-7SW!Hdw!-!O=;x(rZy+28C!vKW_M>vc> zzuW74*EYdi>L`^^-&V8chxBc7`-a(+&+B%Ow^Hx6$2X( zjT~1prUCxJgiJ!%02J@Z-aAkm<8C!8BTJGm6B&4~IYynF@i4jL>xz55)} z%8;qE2Q;;{-BPCXK`Lv33nWO0^uk-|Z}1xK2b@JKU@p8B_X&2@SOE7BKtM2%td;r< ztszz@Jhcqh0jJuC9h8z%h9Q@@S7Eh*gJ&l`C;C<_4e~kL+h3FqK!A$XYa|>-@CqV| zg}oiy5K>UcD&?6WMkWBErHC;0HA11Ge#M$24ItF4@UXxp^RTubwUt<_R8>o1c_!*p zEH$X&Gq29tK|PC^6Y*rY5CGDH_)J8yiZ<$xV6tMf_KVUHgh3Mj*qbmHeSi|Uo8(Ty zQvi?!*}@yw(!sk0K!f~RV7`CYvA7fqS6IBET8&Og8|^LdhTj0L1S~%ulH7Xyd5_I3m7*<{@rY|4ipW12Z(T}M!bGmcvS*e@~trGMWNYBazejjh`@+M zQuDySO|^L~wvjMVa7f4@y;~do5a%&kpRZhx*=)d?P&N#P)J@?t2`p zi{zR~iM+p4@@~C3Bs!t6%VjTM#N8dGoDJjo&dc96n7J;YUH!tbJi&og4)x1aywJ5X zMRDYPN930L9fo4&S}4Sil$Dh;L}|1vw-EzZ+L|L0B>(6%w|VXwTlPZo^W49z1fuf_ z&cJqf>Pv7JNOtZC*vM3*7e$EL{R~2I!xSe8ZLt8yo3`t|>a*o#;kk-7Vk9Jr%#E$WN}WhEs$aa)Hr(-RIYac-vBSirD>ZRP9r{#WCH3n7i9&@H56koD?=L;@1Vn^NaA7P*@8_V)ruHR0QHlXI>D4jyiU=QSAUPWmDKhu)c0WcJB4CG!X=ZF z6{uPw{zJxv}NsNs{J*8&{ga4o(?D^K#9d-K8AX_ zs;`&SZSuMz)IFe|q=Nt;h+6IOXmP7P<%o4N9z9{ROWvE5qAQPII?R#{y6%qIcj6tT?_=>PdOWafO4O;X1&Reao64 zL;*wc3dLcoyuHZ;fDif(;IR+~;IgqG2wkP2;S0KR-Si&~0m-ezc#oEzcp1^09y}OV zY@ey~q^H3=yPoAzY8tjDKv1+2(2Ie^LL~(B3INi*X!9nv5MfEl)L|B+7_2~*#VCOj zocd%1c54kvJvuBrI`m>jMV>(R>p7Ey^Q#B9G3TD$ zJQ@zU4xmEpi;rmP-t;=4d%{?O@4=LeW*ul>aiy`4R0{3z+a^USfRO$WLuDB91w%%d z?r3^efl|etMo3&0&XD}M;ba6Zr%Qaw#+AMpm*d)iv!0aoC}p&)rMN<}bU>>CCm@=6 zA)!4XwNMWp1FDM0kZawRg=f{T?TqR5CF{iCq8W;+IjRj9>cy9+WN+9>! z86_Y3^PLYYw6sREQ@{4NwSF$TdZ(%n&~mQHB~V28T(DxThNkfwB3zKwS$CzxS$k{l zU@BtJ|0cv>o(nQO;HBwMJc+80$qb#Ts&}9?XOx1*$>_643k_ zH>6*JAmlYQjrA3}ZPXudU6~RHJLFcx2*K|t7GWD);Uor`)MT&aSICX>0rnA242c$1 z6Z6)g;o)EL%S~Xr2DXWgzz{D>085MYHaU;*4!8=y=8R`|{KuA0dE1umI>Z`-N%@@snH#QHIxjDd{>A`!|A3a3)Hjj7`D<`53|l zbP9;lVZwGy)T@s?l7ZF|R0&APuYWEPak|H~wL`MT$O(W=m8oN+_39X4d!Y3NxjOu~ zMN;GiH&93ueG1=u$6?jvB5QOXA;C6&-c zp!nem(Ov<;gIN(#Eo5;a!Cr?yShoS-W9wrom@9D0!_g?Zr@6}zL9O{h7SUL!fH=`m zAE0i-(?YJXh2J&H0~+`MRu!p#y+!!TGn8iBltc+ZAidbCkOiOz0VY?8{42bV1Zy0| zQXPJh360j)7*NdujE~9TJb3*Qs`GU{O{QCKA;dcituXwbxCnHLL_Gq|4%HAa0=kBl zLb##H`~eA2$mpCpmH%ENdkpO-EmLwU`9F{2FT5ruQ_7wfsuj4qCQCBZ1SDLe~2~&A*-# zDGB*FG&pxJ=YsWAiM33H+%5f+bMatn!Z>Crhycza z0uAo2<3|jyy?0x@JhHPR+*x%l<8$gfo)6A7(rF}Ub^2zn=RzaY4Z9z-N(dI89l0CE zI$@}$R)+i{jk-_NXx5~YGu!Uby}He|k?pxrm|}w4=$3W<6_AEq?NYwhsrB%GOWc_d?fOWTk$xP*lRqW9bkBE+js^hID<-if2 z8vzsE{CW>Pn}0=uZ7oY_!8`N<*iJ9@+RC^~L-U2m7b0_=ZU9K8KxszxdSQ_9Jf7`y zdb7Ok;0a^nUhj7buZ(6{hG(wi=Gj6vUqN$5ShM%|sjkp8=tUta?3;KoRV4Q1*KhdH>&kWW0HpL1(@v0fQCq z@>80J2Cpr*=H#lM%~d}^yCG$bK?=A&Y(id34PPr`dMzmBh6V&!*ZfsZoT2RYb~S!n zZ5kRK4Y1%QHUoRc$EWeV2HpPzeWU~HB*9UPkSMfEnJ@9-j%ET}8C@;mKNsl~ z;T|0(7~6rXX+yCF>3eoQ$aWhyASPZC+K1pHigMIf1m6&$G-B%zNDzBJ4bnEE$O2!7 zZ*`Oe#_v=5^uFQyKVujfvGF>I26S_1qLC`&jL1C_yJwu){;od@2mbVxB6+E&uG|9K zPmFX^dm5$Mw2tS_4@f6NVcGUBeYI`Z-QXpUV$+PyY5A$y$k99po&kZtYIMkG4-sv$ zI!d_;1r6m1m=#)Vba)HMVlo9XijxZMzYc=*5byT9xY&TYBX_X5Tnf)`-fAYL^@MO3 zQX3|T)G!hl6M4Zd@xX(`dYxueEpi@@Fe8INeNNxV8wvnT{2eQ%JVAM20;q=$%Nemp zQUDim!;yo45#h-eaIo+^%bY(S#X<+L05AP@azZq8nkU{)imqN!rS7zE_lgzkr_RXA zXsAp9

5Gc7xcFv$C8(%t5v1skwsbyNevKXE2jh@b=*LcG%#BjlvQVjFAlP`~m{_ zsf_TqLU9fR1iT$UpXHJwXa9gCtNGvd5`!Jt6z3m`4^HgkWt?8|_&)dCfE3`%G!9jGN5Q2+Byf=1 zf95fox4+gXc?gW{^1#DBQ!d(I7tNf~brUrM^D8m_TjdG^?u5Nu1)a1NQ}=DyZN_IC z!n_i6EKxmhMNSw-ayJ^ja<~EBGOpDM159jD(GCQ`{rJI;UJ4y?HXQosvJPX}K&MOO zp6{|0xmi?G1F<4Km#7wa#;v=4kvYq;PYxtL74~=Z61e__C0=Y9-K=jrF)AY-6WuYy zEjYsWK%InG9zfrY!1RtU3lTC*fJ+{)#>VW`mTpK4Jm>BJw*g8E;^zy1cLY6b(G3RVfBJDbRDHyBj`%n;K%fA`zs_92 zG>-j=@rJ~U{OO|*RFH?bD;@E%n)u;dJptf+!0C&r1KWz{hD(4(a5K}_T|F^aCA{g7 zOk5*2JUI6OI3VCDX+(Mk7}{YjtfvFmh$P1KkIWM?f0EY($R52iI%goXYJr=ZhjOe$ zqj1xZ%MQto4nD)dg9lNy9QtcEV}cdOJKp5tCLa85qhVLt0FfZNPrNVfH$p)1W1(2U zLH!#W9gNI#bn^&=M0_s!AgCUVr#KwPx({=o;Q~N|_=w>lAeG52}X7ia}0%L0(<{(Dp2}?=#DrLmGfQ<8?-mMO=nt9qO8Y0MY|=OzKfJ zIYLCvkmvwU`s}rQ4d5sg5AU)TC^lD7>i`UtlyD@sk`xF)5YUJG?7hVSis=D=EtFd% z(&ns&hAgr)^iqQjJ*j>ejGBjNjPO=zuw|GJs7U|AUDjym%O8x!>)RqB;Bi=-+kzJx zos4$>%81HQ``R)eEv7& z)macjGpGQh3F5Sp0~!bL5xx%C8ZH>rxT+g;*swzKMDoaNZHYP`8yqU>O20L1q%=J! z1Ud|*Ds&{nRJ-n1js^{((f?8_eHmn2{Xsfgoksl%r zwUBFB4ofXg2ri)O{uPJ~jlPfyS&VDBBib4r{+oX@64WWmnVySRu%0$Cq9}rI0+?Z{ zt0k~5K<)&JNT02|-^$(9stivDDKvZ6yyeZzF%`a3Z5rP9dFhBl)P+l8q81wJ9VL&; z9#xxas3IRyGqsgSX5aj?9@9%pAMaRtRw_%o_OJ9hv3CvrO;#AfSR_iy!10ZEupKYcu<<$wvK(sLcFwDQ}C8r-s zta9yBKNM06UkiLpE5Cqe!=Mh$Y5-DsUcJ%@D8-D(f-?(a4t8i$Q`6yKJ*1A2y?E&o zSFJEKdz9ug;2=n57#0qB?-kk@5q6SuNb+H^^&JQ5wxV`Hc-ruGFm)v4rGVz@{e`?y|u;n?5&D@ZZ3Y`er@+9|lUbd@J?7XUG$3(wfb z&JGj^F3?Ej!N@b;4%sE^t3Ydo^HAJ%coT%os9m|NnmEe;f}xN=X{YIzLaQ*ZCdV73 zs?{H)0%Q{03?xuE<}l7f9f#`%J^*1!5T7=r>S%T#7(eO#f;pw^Wd@FG=wIL!cp=jr zkxvhP1v=CJsA5|}o3Vj(A-=(1BMQn1@EC!kd&c)5COEIFRpXzC`bxy+=6fzm0LB8g zrV1@6_~6Ak!fSta?_)wX;mvAO6YMNVq0|ix8%WR$_^?K+T!Q2gjsRq@=fcD(2;(%8 zWz*Y|V}gdmP}`9abr2>1pc2R+A+l2(j}YF~Sf>|}-wEL)c{eCQq5|X^hg__b_L^yY zz>AxY98mx&O_Cx>4k}=ASf4Y%1rits%O0c3Gtk7jS90_OviLDQqbLCs0K!cLUPGL9 z2reg#)SvgHF)~;_$^*+ z30e=&IXgSsQiL5P6j$$o>_GC`wjW)241tpWdN<4u8IZ${XbF1p>6AJo#6ov@#?Q)N~(QcY& zZw2&*zD-va7T7kV6`l8lgHe#jh3Kdu^)0bvH=tp4r?*h z!q&k6`%f({8Fdn-UZ0{K++2Fh~PO+X83LZskAKeu3QF-gtw~{G`Js4 zyQ}g?9eEc3f?QmwNhZ1`zzOb0-=mqqYbaB-j#!*K^H?L950!+`4=xy>1*WiL(+|t^o>d8(?&}uz(W-i4igvv($ZB} zf#92_mX_e+(+!68vuI>65>`u6hr#F)|G}ppv|mOFg}+C~7*Vycik(fQsdf(#M$|U} zMPuu4)#8y=fQoT;SgqYt5{RvV6{6wKFa5>l4_uyfB)QxP`?T{>fLt7VpPKvvudPer zCs+<#PfM57%h!!n9?K!_r4#W6I!N5QVuP<6kluI5&eLI`($-e2D{_(V>&3jTK^y!1 zTkva~C490tDoh|-MdqU=mqj*xOL$gS#SVfENPBJH?)s%LQi zoM)9P$& z7%kG}cPMs_9&bOi@gX(s#L{7+aEFqa!2b72I$Vo&BWR9iFg6vaNz|l@Sr3kQU<=!H zWSvYkr+RfPjpxK6@g3W-z-*bLYN2qnC}{8;9Q{DRHE$FL&E9=_eQx}ddz1Xa_ZasY zUcM}T-~B@6j%<@MPdL~X3Rk_@*L2$|2fyI$4h`>~WsL=s*st7f=R5|qB(I~e%lT{w z?BM3--=(ugNJrl3+1^L|p(@i)O4n6$-C4s$W8F)(wABrrUfqX6S~wAPgYm4N`MyNa zl6egO$E|Sx-LeWgnl*Dzc0M>&e`e#R&`ifeF|X^*PoSd!Yb+OcJZCKH!?9wci@ACL ze3dCvY3wP?-mVd!a^#Ql;qXH&s9c;^Qrf;(|D5-Kop=JVGxaTOGM9GgN$DhwCOc z^QIN@#;476#dqmYndUAixBvK&ve%Fge+@toen4ePq1lw^_}(=NiQ3rs<)65i`8kn( z1VZTOPP9Wp?!%`_iBawCkPFx%yl2Q)@3s;rGyht&X|i#urn;3Tne=N$wRi&%+bfERLvd!~*ugUjL^*A;?&P4o`qN3t$;g|RVybdV;*SsjIzGsP7 z=^kI;Oj`rw;K8`TeFn!;5})uI8gH+U1qIVxyAvo0D6(+=3A|pdb(>9Im!E{CL$cyH z)U2sU@&&OV9&fqs8^8y~qtb1H~4m1GJR3wxa@u$!9s47a~wXAS4C6j@E-H`|+Bn z(wy`!d!)PmWPSPIl4oY{EOekfMF;Nuu>#%lGN1#J`5eX!Ro%${Zvev0lG^y%N`o{?cS%Zj!zs z|9{?{SLem;$Nk~j`BBCHAB0{R*XlH6+Z2|{J^TkMCA5)T!rq94YU%zjd_6>@on^H(fgp$6` zKzko)S9^DRe|v0_j?M}``U-+dCtR*#N4=Hcq@cYfp7GR3b#DZ&n{557bUHF(Rg#W%?0r%j9ltrYZz+Yt}M-vlUCv!Vz-U)LV@Te&Z z6%A(%Ss894I~xWAV>?3=26r2KSQR*4cW!WLW8!Q;>TY9g>%{HONB&OIk3Zx=-jwYmR4DT42$oWx7NlAGfjZL|gM8*GI9em>>H+Ocn=VoMdb8};G zV`Z>&G-G7u;^JatVqs)qp$8@Cojh!v4czH%ohbhGkpFs)sEL!2qlLY*g`F)a?70Sp zb}r6*-6t#fetdl?l3YlFfso3vq4o}*st6Q7Vak28lo09 zKs=xg{&!4Fy#JK{KkoeR7XMXK)yc$B#Lfm(bmspb^8Huk|9SKOU-6$NHUCGGod2ID z|Hqww*W_h{_56QG;$LF^=T{(SeiUBD{~j}bls}!POK@<4a8jZ|D(>+6>4+^VJ+r}j z*g^^lD$pnJ7}!q~yPuL9GG@)(;#tYOn@SSRWwzX_q`JVAK2sKW$KL+o3pvVLBpUz1 zkT72wSHYv^(HPAH6Su>q#n~UtJdc-`&2Db;$*iYCT&I~H1!+&)CX)I^1);G2Sy526 z!av8{I{$nVgc89chuA_f(BU!A{aTPD1y4G^ef?L_*Q8B||GGLMCx!1vO_jq0h2Sw_ ze7A{V#o;mf!hNBy8Lhdc{`D+K&c}bXLCOfhjA^OZdHv60K?4W>6#u_zK(MQ2WK4>j z6oMnNvX$w>{y^}~T!Go)0)uko86kTOj+%n*H0zrJd1Ohhji5Dhh#wN2R!yJjNSejz z<}hpP>0IV}?3kW#y!kNNGIQBf_S)Jht-%xyJK~TSe`KL7zYjDxklapmzZ0^fVUFdQ zpCmqe(16Z*0yMI0oIu|iyX6n`u`K;6$dbv%pL56{WJtf(lGtrhN?T3_$oy%Wnb0wH zw97y-iUf}=6tFm7ePGvR{M>0mq6$FBT!2fl| zpuvM+f1emBUbG+dx<8-3Sae%f{irm^?}ZstHA*g~0JWqREWMkzYb))GI+;_hzr&~z z-5g18zI$%-<_$cuq?E(1A-Mt(MBx7H>u&+{@ZTtksCf@g+7P8jk1YHU!4Bx=XeLSE z?c0~wB41x7Qx*$=mT!#8X~PAXAT|7N9Wo@y;Ly<@jL#(mAxb`bE+!a-9FQTLm+aO_ zKQ5O(hH~Cr{fTz%BMW}*U2uDHGRQbDMV($F)4^xZ2_@vPO(W!&(TkuXhD-_=Q)INL zyr-aMazE0a_t;7=)vPwvl#)qi>G8hb)tlc;wX;2Jdu+9-UvzanXxwUgxvN|tH|%*Z zXH{;qTi*7-QkrfQ#ntONV}O{-Y8K^n_FKYrx3qpvoX{qYjcC8*Ie7EGeG>V?Q0t*2 zW^q)5Wv|QHRjg#ei0z50e2qiZ2b#nOV@fZ~14NUAa z`Unyi`}NCpF9hy>c}ch{?WZ}7RI*KJbRlCn96?wd){t4{QCsd;xR{=V;ny^sJ#f^ zQ9FWb4~}}nlwgy{n_m_#`Za1zZifdb9^Q{fT`vxFxHsfESD_z4_h$F%#yhhD9Vb=Q z8*Ta@spK=PMS`EReKu|Pg}0qPTJ73Tu_|-u^erTETW|oa_JhX;j@5M8A`3l+ zIKASnSu;ng&-tYK0d?&?m{^PHT`9`Zd>2VTG~QFqZg!VH3A9HA9$N(1j{6 zReEbPS5wLFbu&{pZ) z+(C*Azi~#>EZu}-`BSx%0U7p8s$J{Og2gD`Wm;*~z}vFg0C$5L?z$yUtLE*TaO;(J zKRM@_hmAzNIYg3AD_V**dG?8HwhKwRRV=Twa3x=whUL75T%%|C_&r1~y3P;N`(?a| z&~;m!3_^RkcEh=?P+%9pj}?K7!rG#)=jE~$JLfzu%lf2x!8Hhz_50wZCK|!JzVlil zFc)q2-zLQWyfU7^?d({luU{|((>PVv`+B2pBSD+nf#-IwTDREbVsCb;%4Be(EdSYt z5Li&e*I62{MJOk5?>w!kt1VcN<{0L%7sYd6PS@_f8i+@bTbwjI?6`xy6oT?Lfi9u2IoF3 zjtjCdqWL_juR1x|M(rP8LeR|gnXVg zi|&6SFAjYkd0f=zmTSznXXH6*lK9at$gqog`Mc@oQS;F0L`S0c-aiv*3zrw9k6B}# z!V%5dhMpt`W|Z2?;k>xvG=CC7#5HCwwPAVIn1}UZFt;^9_TV`C_enh$e!`8(0Crt31PKZLFD0DXr->*LC; z3>`>-llC7<;~Lk%#<;|-J%3+PNkMSOycWhqTf@7}n;4G>^s>i#fFT*A1DPrGh1(0- zy)h19A)+z+_#a1|s0@+`@^6C3yoUs`d&pL4p00LwPB1NXUhP<8&}c(s)^b2K ziT*XPt%uUK#cN^EB(+~I`y5X781A^<@Vn=dF&4!V7VFpG;Q2!H)~aMMaQ$v5+Xu7o ze^2I0M2m`E$pv$l(QEQTUy~lM*DAe*Ji*fEe|kt`rn-|CD(zr085nY$4gbAWUoHJM}%cT<;1_Of& zSLQlALA|t#wXP7JI`sh*6__1*kvz z(LG_&LGgO~%dzlqRQ1G?8)Q1Y$ijzrw1L2eaCzO{qy;+QYBrqCGkw){Wz6n5{!Mn# zuI>VqmHc%}2rQY9)#2h!`dLd#!SLbXBR&C+W3&>8}}^Q}rH8i)`Q z)99b(!&Yso5}<;9xqN>?#A%vU!L0DytLAPXp=h?sW8Gkg=^hcA;iRr^UUJ9(ZrK3_3}!K6HfY z8U|0a9eQw#q-@F4pIH+7He~ujQM@qx=8*5s#^oa(>;8T( z77x!63V2#ZUOD!jRug!EHl?*wRYA}G6sAfG=KR=?KWf6f0?pctq;ZM+VHnv|m$ex3 zWHfP>G9N^<+stW% zBX0j1c!k3RVkJaKOmksmDJ&R$!Egce4Z+_h&x}>9M&9az{Wpohi4R|u0?Y3c5>px; zhk0!ZG*8P(ZRc$goCu2vxdIaWTarm$JxPdC-(t3t7-?wxXJjnvg$4(9;85IN%-emv zz~0&orOq&C{Bfof(@qV%5@3MqNUgnk-RS{cI}IkAtsG4oMbMj5UQ1#~X5X2kfz)DU zRT%hd6v(Ap@?EL7-Nf(LjLVH|$@+b|*(sR!zTH>f^|&UkIPN8!|65$1akz89i=wo4 z-A|o414`sCdWgVBBU0Xv?jEQ9a6{&b66jWF7p<)&8rHz|A&A z^ZAsvO>QK+)+YXaAtBfb7u|QZ`;aQEk)K$WfB3Q2j_{&JRZWwU*6(ywU^#`&%Csx^ zMLn2Yykw+U)N(bIMnC5)i%U&E?$@dtYB15q17~lT|KZAL-uSERg3G7O!H>!FrlR2udxe-ckMI2hGGrn@awQpu*g?$-Z1 zQB>AbHOxM*ae1(~$ozu$$d~ZjT^~hs!v;r^#i$a|QpoAm@t;!pO#Z1xC$nkcY^vy$ zlD3B%2L3z)AZF)#vGSIauv(k>De)+xowb&Zr-WBo|M+;FsEiH5&A{-n}m-*qT%XotYIvSPhHDk#f@LHtUOk3%08IkzR<=yj$6l z#r2+m(!_LRGXz157$m)>IUbb48D1<0u$Ghe(L#^j(~lD=2W~<{?;(Ew*2^T zd2!kHxQL9pMJh8hsjg>3o$eglu@NiHP?>7m)NfM|a1EwYUG)g}U?|otvFA2feRM)M z7{lGq7JV^fQ353;g2wr)c;qu8a0v&*b7PYIVTW zas3m?(X^j@;+vklwka2}ovB5NVNw^Xg%96*DsZ(DFk&-NYc*Ztr--lQ%j|qw?sH$v z6Et@VbD$>{l6729orFrP%S)B z!aTE4oNGwAOu(?rihRl1OTQN!z8Ua>zrrlTqxYco)^?hlEaE5e$DvojoWH6h*|fxJ zSkQU3L~FcZuHtPM$-{~kao*R2uKdIgf9qB;wan6876=SLubK&O7FxYNy1mlU(INc( zccwD;cPwdH+x4*Bf{Eq@LN2!GidMmSj`ToEy;mr#qR^^4h%c^<#}^*22Y}s1$m9cL)vx-De_T;@|ES=0-V|aj$J|*%%K5%&l!gBGxR`JInvk{c}xY5>)W}}uF~4>^_ZCvbHbcg%|Lv6U=lcaQHKcb zPL=L6`do(>ui62BjREb3kL6_`M=Ad2;8s*U!Lel_zqvLaA8P!GC5uJ<&(ftC@NlJC zwN<}!C7SsmmUlX-`JCpOzYeQ*zNMNrIUDkL5zrmW?V_k-Z2kI9N?+q2g5X6Ef;!JS zJZAcPfSAvd6XTQ~r&H{c<^)TsOW}@$pB`22Xh7>TEkk@SotlO1fER01LsW)__Qs48l&sCyH~2^akT^(8=hw~*Eq>cMw! zzPWWnAK43C#--9_c^9PE9?{8fwC$JO-B4cbfIaQUZ-I_N`WprNd7@889cB3esoND@ z&z)Y~I=7E6ul0m08q-Nfq2KMu`#3&nwTr)!FWYZZ=FIfiOdh$P%$H6S^+Y<2QU_W#8}v1(s`1tkp<6^ZT2QKy`)k+` zhc2>g*mth8)?Vw_FQ6sNbU`t5$7VSgptB}!^)}I9hPyk^Su4HaY% zy&W$~IzU)ZjRzi@80ub?54DHC!7!DsR~zL3ZtHr!k`feh_3OT{h#Xo@TAT(KAER>< z{T3$xny2I>cg%nc&mDhXm=>#}fLBBSsnJQk46rKKl7%Rhauqv2A@g--f{*$l$%0Xc z3J-mqm_6-+T)hw#?;EEbMZ<3*k>zo^*^6c(fZDW2UWgQr1OGXo^+iHR(dKjKEGv9F z%|*{J87?gSGPqrl-vrqv!UYZtPG|#MvSHe*&<4a7^P}`e{t`)@{WW+lWXaXbXyK3$ zIIO{>v!7aOGA-ea0qMeDH#Uz?x2lGuYL}=MuwjI=|RSjod- z0gkdeHA@)&5c1^E-K^2|#^2nJ$w<$(#Q(RN4jg7o*dU9T2J~+tT)B6TZfy^)c0&kL zg>OCE3BRL`c9lB_sjT%|<*NW}A}haRFfnO&C9yD|`v0k} zzy!a7dPX$oPWP02Cbb!>gr@mCSnW-?a<(C{9Y%E|2 z-KppPZ8Tt$uL=t?0nEb}`nf0z7MCKW0^eX;3l1!H1qO-~-ry|_EaVgt3ch_?P}35F z6$8+Uq+k-tdsux#807V)K3)x03=9nf6aAY%EUe|11il&mr*)HM8Rxs%wczP2Ap~uM zz|J}JXO_0UdSN7!8|D85wp%<-_ku~hD?GzGPrig1qjJar;M=BlQmuM(ICWb4d;evl z)7BjD4Xi*!S@}ng2;N9$J8(p-WmDc&)=q!mc@%Uu{edpXOM|MWX@a8-oF(04h3Swu z9YI_=4Sf=?voEwvl7d`QLAxlGn9&8jl94_e@#=NYUvX>XibuXri2#Q5$T#^+TY<;B z>SjcgQsnq|CrwF6D#-8ya1Vt;WaI!GFI6ti%Y(4^JbX&!^{8UAp854gFMeG}j5>f2 zQSoprKOF0;((52K#I@fI4u6z%$1LKd^qn1{B=r=AuL9{Xvh*} zjY=+wa1_dfh#k<$v?(iH>AWsPZ8JixpztbWYsA8;pbpLIeM8#!;THgf$O}4TDKTP5eC{e=AAC6(jvWYjX)A6? z(!(OYR8-xf;fzy;^qE3XEIQ1`Mhz3*Amp34_GALid0Qs$+f93|r;3t-e+4pe5HJcO z;qJ3dC`eK97*skGwWH!YyiwdvzT=BOB68$I^YEQh`w%ox-FVNz2>u-dj|{Q%O){(0Bh*0Jo?K~kM%DSdu7cBjt(0HMLuU_ z8&+g5*9n80GJfii;kN)nfS5}$2BS_145awdwqe+SF8K)XjC}yFlsMJM@g9qQ+{sV; z`{@G%^{@9{06oAAUSl*9HqaefKAas{CB_F%?CmY^`WqLrnLJO2Idqre4WX-!7&IME z2VNc^45aDs)QO0OqmUq2Syso=n?OF(*UjYAT{UR--|p9E+SL3OzW}h2Mz!hi-U!d( z(8rN>5O|4Ee;fq(k=f5zZfP!s$;Mmz!0mVVYMb;!)-z-a21mHzo%Ih3QM11o2DFCV zvQq#B%mKLMfaS#JVaulkm^2=`6nalRbm<1AoO4(S$^kh+GfJy!7v`V_-LXjHPWjyZ zA<-35nhym$- zBUd2KNmeqe*&F~HtbTmFtOM2+{&Dlo-(s6cwyC}ymWT~ALk(uMN=}%sef*Q8ek7e| z9_A!-@IC_9d+^%v!F$wI`1WG|l~4CmGFkS6TyVGE_9?IMNwm*h7cuasV&y|*qm;9k z#}}JLg3uh$XkILP-`c>iw|#$92AVUajuFOW-vyt?`-`=3#yJcLB7@zMYPnu08Zqw- z`>Zk6DO(i4jjUfDXPI;kPZY?LxSihkn%64eXH96^Hs-s4h}+@&Pvnv?42|z%rpqRm zN{nn+i2#wv-j~+BQ1%Bv_bzUB%jdxxTa{|p*Rf6Oj05;=cLWCDEx2{&xH^wXQ8xw$ zr$=Odo2myO+3Pa-765Zu0G&_<*a5?y=YKakS4rN=4=1|Y69q{g1wVdyr(piN*^5Sn zD;Uu{QP;H+L};5%If>aP(B^9_jCc+jjOIf9iqIDNDQ_eY?^V@xH}HwvSN!CNs&sE) z?j_{C(0MnOJm*r4 ziy*48eB&7j|AKfV!3Oc11c_Ii$Rgi#m5H=ER$eXSHc`)ewpL&A#i<30F7>$A5x|j~ zKjnPuzwh`Vk;V*N0b+2wq|R}L@lwR_bk{HVPKQ_-qV>GaRn>1LuFw+!QDtmj&+f;0 zM1yAl+2xPSmVU2J%-0`=!0@G|9&lR+Gv78$yKlzQa?mM?@}m2kJaI!xIPiAkv3&SF z01%=AowTBN1{1!?90_HQXMmUEcKHSGa<wLH2u=f-8dy}&{v)*R_U}u7=F(b@&y( zys4NG_Yik`yT%P%jR`0mn7j$`D{JtQZp{YwHW?`P$~fQkAL2;be-@UXobSM7Wpxz z)3-C+pJCpGWf5_Ls>r}ePY*;f80hch*io$B(mr^bEd!X$4#rt3j$8Hr<3av_{k%I- zjqc!;9kznJzv6RVS#XV2rn(Df}b2 zPG6=scb3%vQk+Dl3dE_E&~lkjXvl8tFTx-$ZjNapo zy4&)xy>h@e{Y`I4wv)6e)G~6r*|M)Y{3|*rGCE8u{`_}GBISIKM(FP{o{Y)dSn!!P70k$c2)1wr$=fBbC4|-rFpit`KlvPTak#w9cUQEwO3@$L zJv<^JSR5dnNf;w@_KF8P16vRul}UBb$^ahOJacr z2{~t=>nFmFF8t>&Q9_P0`43SagZu?%&%Y2L5{r-d7H0$Sr>rML`U@l+lIR4Bn5j!r zW~Qdt)o!p&uS9FTS)loRhY(KyNK-EytK2L2{#lo460`}ozHKV2W&%N0;R8Zd9_s2R zbu!ByL4}mcSIVe?dY32dTz-*sA>8!YsF_vDNYjxIhW8-}IM3Buqy(_yOJWb$f2;ZfZx`cy@1r)T$^w z{cOYU!dGh&`4>Ircv`Z?yq%I)6Iw;^`a}Wvj$W3-OLdE`+Ff29!`t^cvkmsd76m=R z!)dAMxbYmHTI~fz?R6EJ-{ZzOqun*;-@RT6A>nZOu5T8G$i|d(lbUwdwJ4Mln|hWe z->N7{MW{2j!Nz8+BL(6zw=$j+?_1(nbg1k`Yn5EFJX)*h&r?6Zh`aZE@yENn`?mM0Eg z#v&s<+)NN?HzC!T|L&YjaBy)LSN?S+Ohg*-X$_wxNsFzQJ!^F=tFGPS>b~I(vt{@K zK6V4#{ix5wpS!dxza48TUY3kG9$68z?A+vVrr!(H)v>4;pM$m17(Z?Abw|G+PD!Dm zhb*8jxL@gDP;1GyCUl7iDW^kXoEqK~eKBUe36MnHQb&0R*gM4iswTqhAH z`M~`&uQ@I#YkWt_%!DC`HtN&5dn08Y>ExMjl|}N zkf(4MbcT&b2BKclwUNhDIj#+Cbt%CJ57T?6q#f@95u*C%6ie<0MMC3RCqW9#g+W!m zW+APj8E+OAc-!&gs_fK9qHocf7IRV)1Ik<3M06U^n>v zo4Y$Mes6xFwjXt8c^O+i1U?f=FHA zhMrV{lLVWh{PO1#N;zAOVJ+Wl$aJQNtlylMqwMd)-0MDt-%Z#NpT+js7sKOel6EA^ zrQJgi{bSP9Y(Feu?^rI(UR*opdt*|sr49rIM^k;W5so9scpSdYW1Cc6yTm&|mevYd z*F)-h7QmRPCdnOu5&!g2!AYjBW%EG>w{V@wAzSg+4Lnx=?U>i7bNZ(fZr!V%xrBqI z;Y%&vwj=pkYqY{E(x*i^>s_Ss9(A#iEo9Nkg8|kXq9@m%3WjD3f?qAr^g2(kB+2X; z=us8Z^Cgc+yB(Txvt!9;a4hG%cUzvqY^Kxu*01Ndff_ zJbi-iO4tcS@`)^Et~vh8fasJC+5mdg{K?`vEoAUHhIuPbr8> zl~|?UUlEYMg|k5@tAs+W>48NW?Vc27LUw>)DGDgA@$T5PU&+xD!=6zHm`Ecl%*wlV zF)mi`)yE0~erV|b$Cn0G4y*Hsf< zDkbwh3Ob*=88@Am2L=ZZiegZZ8>hy3f|8mDd6*(EN zC&Y<3KFL(}rqYU1n|^uWa8D8$TNFCpW1_d6(CipCBIEKDW9P;&6tvQa4wXYztc2q` zSuWhGs8TuJ!j}|Nf`^g~_C`_?Rb#AGIG zt85f-K&zipLH^ zierTTpcQ9*WPVhNVv$;p2u_ zPI=VTrYx49gH_bGB`OGs#rj5x$ZQ!RM#jA4)=nZ`z-`C=HB=A{>du-$5;Pn>bLZ54 z>Sra5`vTznuTJLb`862Q&(A&N1NELw9Ttn&bE`n##`?BRYnH|%o3#jZUBZ9IQTn2p z;+98A%9Zoy2f_p2cx!J@(F4z6lm6>48R++9xWkKU;4JH4-v1a~L0lpYTb+CB-0zJS z^Pma^twhb90lrML_j9U+N`exO*6LO)FH#~vy|JWP(I#o38)&nLIa?d(w72O#P|?lFpIl+ONTWphkY6$Co1Ur|-wBKsaOY zMDiAO8m9}JdD&W?KPDL2$n{4M3)R=(mzLzd9|zB-2_QB!*t_(92h^z7!Mqo2 zZ-Z#7h8({C{sJhv-{iVgxNmfyL1Tj}#w|vaIE%zlyW0?TM}^*||Gm@2W&J()lD-S` zWk$#`dgLpfDKE2Eq~5nZKd+)>Gx-+*G-MPp0ba5eT|bGtYqD~E%hxP`GW72LK)0br z%@yeC?(GuG)huT^X+cO8UG#?ca4H95Wu&Qx<@l$y?$FTt2hbLx$tpSA0+C}fW=$Ld!TdAB+w+10AL@mnQXTLBW&-+ZnM zeVYN7TLO|K_NLn2UlJYFNi7$RI0@<*aJ$*{1Smif$Q0}b8yT^}QEof5G+@+|@N*%= zS8@1WN(TK3&SF`l5HxKcKs{MxSt-c$_7pPMSs!?vC3nVq5{XB899+p=E(0}u-Cps5 zF7r~dyRVpFoDRO9RsDzEw1B9`)7){Zc0)Q^7Zp*e8xB+nh2=r zXvTi*er6#4%kB(QWXTM-cJAGhKO-`);^WQixn-emqu@klnIGv?bRgKP{vZ-{BD%fh z!?e}KXp?TH@UH^pY)AJ#51NGyqBNaPuws1ILz%9#lR?T*M)vkQj6xZROi~YiQ}Jq3 zd~z_EAw7KmSMong+V!^kBNg0_ zo+gLm7e?AHs`dC(?h#Ezv>T^?1y+P~BYpebYO==F(#Jy_^jJ`8fNW*?vLoW`8OK6} zBY9cUQ@}ER1NSDp?>g~s1To*7yIsgXYa~9O*{HYSH92w13kh5pXWGwW8K6gakX)tS zXc9erb8cPeKq}l|&28-p0C-fFzNqen$pJ<b82QeovATgv1=o*O%|2u9gN;NJOEb=lFv}EsFLZ_kcCi@Nu!eWsor; zOz{m6D&*HUswv(L5NXsw*BM);VGK^ z@W-X4iwR}R}2ZZle9TZ#w#*slqyyR$#JsC-b9R9$ER&KIMN1j5z|%I)_`&ye5ze8*(^0FtYi9yjZLT+9uEWTp>MimGX%?HE@eH*7yU znAmZ*nT!~O6&eUVD0#_aqJR#174JLmZg&QFO6Gc>jssC$0Nzr+UpLRNf`c80^qH)^ z{YB7j)lz&n1=_gf3o(e2KapvXo283PZzubbyAcObY<3$91`Q%)h~+Z(sk*ie8_(G< zk;xO9;D|S;oRWg?l(mC}BLI5+h;0`_JP|`BNmR^ICy@rIKQ3w=ZOWNW5$D? zt1J0M|4Byy%rV&(0&I2MLD8cqi)1A1a5xHt#zX$A6$Cfr10Jnc`*XFlQXe4UJxXu>L)33$#Dh zHxACxCJ{y@Jrx^GX8rkU;N)lmMZ4Bgb-rkh5mJkpm3s%cv2rb82?PCrWM>GnsXR)z z{=#AOiG%$#QV#htpMU)-rygX2Y$d8atNi>@(Il}`wa2ol1U<5nuD{(6VX+wTJ6+Lx zIX;j-FoAGpop=Y_u0^Gzpf7mSlPyubs) zjTdtJW6pl)gK6lG5%j_r@2Vn}QQG2GktJf(EDtvm2u;-YcH?|nuO7xZc)3CJldsF( zVUxIDl=L-FCXy+BU2By56Xf?HFZ~NBg~RhK#=rTMe_MH*-VOj6V;I#Dmc>E&WSaVN zz%uekCd`QZC>oJNDk|jU?30t^L#AHJj z=b5~4W)C0@yrEk3H5l)Yvhq*f`}9){l5WK8v?;?;N77bb5BQVQ*DY+tGgw7s@>CgB+pERpt(GOm zzN?*kv(*Ka*r7om)z!V#g)Lu`#>Yr&uJxh%CcVA@;--$$0!XiJxM;2|rsUfP)O-E) z>P+kR{!K2so14g$cTFn+D7821uqz{>HC7GTf;1GxA8!Dm6KaUjzo%)z4IrK6@30 zQl>Edln3K}lc$$w#Y(;f!Xu6p&Uc+2OX^F- z>WoIN%_Y3ZpC0co**{&`e+2p=5(U23yxE)Wl#6}NoFcN0cGNnYT@5ql?a0j&RNRJ1 z@8sVjZY3~!H=qDF3$zXn1i)R3@H4BV#v?INg|jRNhx(=*DidGlY5dz1`F?i}lwDK4 zV(b>`FBF4yxoBcO8R?(XdUfMkd9@v56s@&=gzy;GHg&VT$lmuoa_YE#dq5-4UaL%g zxDlf%1Up!!ee^HJ&eU!E-?=>m(y5C>8wSSldIoS0bd_?&B8RUTZ9Z&UUIS{;`p?pw z(VTz;4DF(?7{}FafD4>6u7>>O5s=gu$0$B|j)!o8xfTzMStY4P9L};GDvB!TQwlFY zEyudDM2YHQws3eIUE+T!$FpxN1Bnk6%mb03=Hid)gzDyg*Xr9z74=s&r)+9 zjZa9*-agzlbK!@yTZI5^hQmh!UnmFW(chuzm7<)0^y&Pn29lu13^)0TUbQ`jmuds~ zlO4@kOjH&uv5^VEn^T;xZ`AX_o2jN$_DJHs+6Q}`b8*+r0|r%#q6P~FGrLg*{5=s8 zQji8yH3?YC!x;06=w_ajqz;=Og^El?F}jp?D2}_7l1D25bS+lt%qu+5q)O+xt;aaT z`+Pyw6H!{IK0&UG3A_}_V1;AY0f-0f=x{ughD5wGR3fT9vUFKo`9{EE9CCf>)TgT| z=a#poWC=68GW)D2n`JQL+H`LlA1=4~Oh$5ddg*8F)WN}Fd&15FkPwK;9RFQw zrOuHgc<}vgOHq7Y8f-u6%nPuj5X|fwmlv>6{wCuPJXRSc9V}cowh!!C$4+JtHA%#V z8i6QQJ=jVb#=d^L3KtXtf_Snz-d_Y=^4NMcUAbqq(*h0cOn5mHZ{FhMz5OdY6xpxk zS3V-aWYzmw1!J7Iy=cgr09?t6_}8ND}J@rFYi`VXk-8~BXQhBg%-Q~JB* zt=n5lJM7UDm~E2TQusZINh!1k0c`m_-IA1>k-z#s99Ri@fyI51`FKZN*c4Fn=PU0S3NnpzC|>!UZ|-^>#U|nV2Ku0E*8v+n8!z_IvQr1t z@H$*SxGw!n&%bZB#&YBh0D#KA)UE!!m*oO*5*!sZ0gGYZ7vXu#;CCVxaR(YJ&_>lr z#^3M-JiSi_(SU_+xJVOpV_VsSd!C?hW0};oh8J!ehr_^5g){)zWL01XH{QzqAx0|r z*qJ31fX3Y6d3msZ^D@l7s6=S(yC=-LC{Hr^fM`prCBXt%W^IM$ z=7xogcH2g+l0^xE2G5FtDaGmFr6okCsP}yr55CAB+bu#Nl+q92=)xhhK* zC0#tz>*A2>b<}})pyYLP#{2-oNL(l?gcqMr|0YL|@;#K?`tkCgENXG9z~;^qvfo=B z6^4w&GSB1O=|-irMM?2MUv+49l5#NGO}bf*ymgBJQ+M$LkVuYhv_TWyL&$N)<%b`h zIQv>C8qn|QU>lipYJiLdhcM+$k2bF8Qh2MV^le9jL}0MPZuxiXPL=Dm#dOfpVT8c! zz$QAzQD}7w@?c;EHg9j$&OFy=G+{j<{9ub0-)IV*uu8;PLn@Jn}E4sgX+&HgK>Rea8O`wOIo%tl8ipkFg1P%h)rBC0egTY;bs3cryI!r zVW89Epi?FX(*;QcFad*dg^^{ljDAMdfe3Yjg68Khcs!Gn+akxPoGfbtm*o>|M6Vbj zDTY^nL8^;em#=1Qdb~Gm zef{GyJXa4Sh=D8rx=~v-Gf|{mEyrZsJqeP27Aiv|!2DluyN7ihtQ5?QB4Ij+pY38( zqm(c79{3+7E&iD{BUVly&$hoDbM6D04NV%D0ro*C*-&T_*THnz4Iolj_eQ)N)QxYA z2Fb(AHp{ln`w#9)H-}RhV#~=vVU;|E(_|Q4L!M>dd=Gt$d zNyCEF;PJwJ@nQhkscCkzMjQ~54j85Z$J|g?Z55=|=Ar*$ipM6s(R_fKn^e5!+0{MH zq2Zpok3Dp*83fXQF9J(!x1UmlVCqMfTfD#x3Hg#N3bs1)ouTT9?aO6UohW>9m)K71ofRx=B z7?TwN--f{s(on3VCp!<06*!5iF{Fm50^?oDxc5^~7t7zE-t z(^Bhiha<&>_+~U=`c0X1Vo7@I(&tveG*Ld~ua!gs+I>owS}o)l%JH9*Eo>Gcvv?#) zUOdfH%7(lv+E&IK40CgoUO#d8YitNU5l{r}S=df=mxvKoN8Tja)CJED6q^cwO*rd0 zv?j^$m45vCuNNOUZZCJ(7#r|aV+U1F#0bh2{&fDW6BSguzIs+&zVv;49h>7o{;{h> z%BlMP!LaV9h3PXwoJ&s>J`{+hUz{?#fZNwuzJe6`59@}t_UCmM<8y>_Ip2z>?-IhP zbk!oY7J4_?%nd)j)8{Mc*?Au7Igb*)IsabI$CTEGdxYTbvbBoAYk1@;TC+O;)I29B zuX{@t>@yrq?bNOAsk5)z9Q;P~igUgASIBQGZH80N*XLiLagVI1r9GC`emds1V&3$l zgqu3FxR^FDjZE!D7A<-X%iM+<`T5C|dn8^qvb{LV$+THAy`9_om~PkhuEb%qPn49& z?;A;Eo$HIcUV^)pcIyJHp{O>tBOGiU8E`m3F_Gi#g8=uj#xFy@)W$76O5%+eYE^<@ z5^igwYBx>~slOkZy7s;ztEMPX7Gr~nlAo2fPf#tuLikw1W4M{IHMV zjw5vfZKr36plMzCQH=BjnESk0PxwrxVy7z^G^#gkJlS5<$w1!==?e`~+Bw&7kxbW! zzQZZO9x6U208YZlNTUXM9g;w0GVGd^ba0+z#H z{!y+iqFa!Cs1wq5Gg)4uUT(5z1NUsaWj_o(F_68|(>p`$55| zk*LrpOjLgl>*7z%@kMdJjm?99V42|NdC877IFP0moN+Q%`}D)7V=)oVLWhgp>CveV zA8p)F=tCdxmmdKY^y4r{r!pH(VXFpy_{2Am`U&Vv349M%f5e};ExJtC0-pcuZwZop zlkG*L5)42C)A4VRW5vgyQ2Ra9GX3B}Fu^A>DZtdX*ug zHTn#UpsH&HQV*hJPdC}5KThDUT>}=<9LyVUnT<(QUQPK!)aeCijxeaht+ZuQO?x=~ z^!{?0C!xZ8vB{-$i}!l{D`4hCzr3@5lm!PMflTJ@26Fsvzl1&j$k@U_M2MWHzL;mq zI}1awX|@?Xr)_1_sA%sY++5cLXd&xnYPj=Qo4DR+#bmEQrSV|9Q%#K&CZX4GI>?b| ztbY6Vi@@}mk&=e8FR^1ES>3E@D!m(Dcb469YuS-0^%J}{W)xLXU;pRX+5fAQbB||w zec*W3987Lm)=4am+j1M5+u^t@bWkgaq)95d+fJ_05*iC}iqK}2PHrdW(qe?UR_2nH zyG5ep;0TjT*zeiz&)>hlzrU~V_x1Wd-`DfJzR&0Ryx*ivfS`#0zHo7rz7$Li9Es_Ia+78nEEgNzzi2ntw&)e1tG@x#H`)B&(fqcwGWiyfmFV-? zqHuZnWu>W6V#88$TxQ(jc%!%K-V-5!u`}XFO70265vfvvM+K9UYa0R)7b;>~}W+*w{Z%v~k?mxrbgU zZ)Hzie3~$rlu0LUtfK>*6xJ9~qn(r!b7?rn;2u#DeWsbWIXl7OC>q~_PQ|v1Tt*Sw zhgnblZCpD)1d02YAVEk=_K?SYkuim@1IqAaPo7bmcgm=ZIt$GF5inb3Vnhv{9r$a^ zYQAz9y9IB(aXETV`5s=X6wJF%+dUC)~@w-9ljBu-dJ13W9t*~Pm!`a z+q39zORwBtA-}YJvZP@2RTkAX##s;YkgFgW52{(8= zHJ_}N#OT&6RbJ};q715wwW;^;s1^i-5z^02CW^f+KJ?_Tyu<>gV}gs=3TSe&ahXbD z;#ww`(`l=qs&$_vBdVruOq34rBqoDr*|;#!J46fuZP;|Lid9UdZrLniiM%W9D9;Aw z(~3g_Qx$3Ep>M5Wc9yL7zq+_1DOLuW_6a$=nRQ@_k22YxU_Rlf97QI$G*DSLjt z2Ri=N(T(AVR0~WvY~JaDI}FcTi-^=Fpv7WOo$ED&sTTl?>C0P zTApC?ArI6#0TFOrJ=WSv*qH&=y@|SPk}@Oa)9tXEyC`h4_%fkjtn?5%_Rb2)Urj@> z&**TPz*jK!5hj?~Jb`pv)-IRjH333yn1VQ;H+Dqw1+TAgGv&HaNEG<~wLYhT~BMSX}oGxQ|ECCHQ2H=MIY<4>b` zWbIxS`|9l@%NyS&y*dqEO>e&-7spd}FQ z+{WAvlzc~`PS;zH&3A@SR6rTxa+g5!?Ej+ z9RBGI`2+u34r?VBf5^gAF}I&|FJ5t`zP;rUT@D$~6l&;Kc50{|JTr8C#dppPdKGx9 zI`5yZ$_TE0>cMGEM5acHoB2NuNH}BL%qr75R`SrV>w(ZMAa?JX@?6Ezc*FzAX**l; zp=-9%v0R#qqe8i0K-;U|K*v)&=T5V8c(LI~qocC^rw20G-~B|-PA!I7zFe3$sOFhr zLO&bkq_?A5+#_%2N%aeKP2z+dn$Y@%y%?#&M(}G2Y=uhKH)H98>5<;Xa}BHS5p?~* ze`>@r?z_%PVIK)tCJgJSP9yS;_FUB{3NivVS=H}Q9Zj^1la^b~(S=%%8vKGY>fM-S zr%0KC1G+swx(N;x!P-}1jT7g0C!G;Ba0l+B9ya}Ww8>n2k+k0eqT)qO622;VqQ?Mx znqdgCqW*@anvP+K@+tk@p&iJeoLQg0uGFpjOjJd1nr_>wLa}lhasdt&;zI-898BD# z2f}L6QFvo}+>|qrTodq_w(mk<=^K&x@_^n}=U1O|exs7X?Y1%@>CE zst1Xui}p3=#+!7~3paz=)Lp-PV%2@hz1ZmPa$_Zz*wVPUp}bLFmxMlzRR z^!7*T6|vT;OnRfmaL6F`IWdTT)57TTuD93kKUNsu~e&M;P%lO=>f>Kvj zS31~absO8iQxJiN&T8N&+PM?e;U)qUx&Lzwgz(wsOEs;rWPz5;&4AiHnaBy%KQj(%daB%QR;JuFg82s`a z2Spov5jKDORzd3RTQUWE8xwO&V>mdvSVMh%97!g+J}6XQzi*h49@XAODI_F9N#AFn zy^pN3y{o;yJuXFCdzlDp8BwJJE?4n;y@k*(AzKYXqsbrDJrM*hvh~kXs~2ogC48O~ zxZ|}a#%ZRb=RLsL8Q2Req97s~BE*zw>ngz+)WgkChzUu+&u|LuIwE^ugnWiTN#ROR zQ0yO9eTADr=qC=P7dpo!)1pO@;(H#7QA-G!{um*H&PRdLkbtfbr>TgL^Z5jgA)I5J z^BvwZKk|ex%c;qwg}M4h`bK^2aHuvRe@29tZH@5eg0TkmI@s2Ttrq$hrJKiW5d*K-Xo6nDw-b=acAM-LC^y38(*y7%0bt| zgAeQd!^43=)>S<*(GwK}xQRjC4H67~Q81>e#_Ccgva)at;4?BDe6Tqj1bl)A@2B7m z2ZtCJ1cwCv|Z}xVW&m zaI)Cgo3gU=@bIv*aj(&D?1At>%Z#;xAMV$eWPIRYHX=4YHkIF z2RuXICEF{$f6D*=uKe#4|K9oD!Px$-jTN}jQQ&{a_g^>v=f(f~#(y5E@gI+T{qjE_ z`5#yQbtfMytmpqR5`TyJpI^Z^3!w6`{##}OsJg*L4sdWna8jbeDz5N*pOG3=x)*{U z$o#XikdaY;;yn_^tML6t^$p2TI@@hxP z7Ct;Sq`2em{5i*9mB;zwH`Bp|fF~Gsjx30z5!xxLJ(2#BFlwPF%fsukHEeNfzJbof2$;>CWH3V$+^+|(-bnO z;){RUfZaz2k0LE@H^BL~O(@~V|I{BMB#t7f&Jm`Z5&F;f2`mI`EWcIq!=0~fPknxU zdC%A&iM{!h>x25)pDzal+N<4<)H`sHLVIsGWZFn4vv9RKIO~z44ql(_ zSXB?ds($12N4+x$qfGakdteeC>VXf6$~a2g02+lt1H}9O$~2ABGzu37b;E!S8NG}p zAYUw;;KO%3{hW8|sBB|+M%cb^%n2IRCNl(DmWl~NSVT=dvo+?FcJvi^s-`A>)G7Xq z2w3XXCXp7!cqK(x5UnSBxBuuZ0Q$>bl*i$>m$e{EQj!JZ5Wbb?@ z-;tLqhl-PR5e5Vb{^zBa@RLmuMC=`{m#g7Lq>O6iHMnxG$*+0025%19Y<_=sS)_S% zoj|W_x!M(K{fX0%pMwHRH0!c35z?*cOrfw0d5rnO66v{P%&#)7`uUWh6!uQYWh8 zh*~OSKEL_Z6HRKPW%I4}Y;SJr)sm;f?*w8?!`>*T9c$1??w!dpEtS%gki*S1o2Clv zas%CD+>y!@pAyE>6lFC##t#UNru;X%)u3#BA3VLf-dDz@pZS?_G+(;R+XYvL-*J0gJCeL{EFu@WySZ>l7LR&n?y}&NjEmm2 zSz7%g>`mi(oOF6c1=93dwBQS``x^7{-9F0bnns7;v-L~f7QLiCEf!K@&;Lk&$59B+ z*N>NjC-lRBY{gwKf5a?xJK0RD(M}N)vw-)oxx62j7i`R|dGf;RRPlEZf1|G320rig zR<2ds-MNF$uJHN!oQ+4}nEbxsd=Lu6l776#TzO~lTeH*N>@T8^#TwNG3y$Nm)`P^F ztTpd0cYfxFfA&1?SM+gxl`~Z+PiiVr^0;zUAhm-gi$EG$m?@&S3ig#T2b{+A~QYVb4r5Da3DuE=b*n2~7|Lk=R%m!)P)CTUjMQr&cUJRQ1quS`yw~ey|1^eZCL9LdJp@VI3R&-!7tqVUbwAeH-mOref@TB zpX2iDy;`H{kB&gJGBD9lM&iU)V2fM#6MYwjKB1mxB?;A6 z+mGyX;fcGJ((>6+(`;}fmX#{#3mVAcH|KkMV0JmnVO0R#witv-y06Jt<7=znw`9shwHQId{bRrF!TV;!=N{LG{*arQj0O)P>t_-XXn`!*vhuWW*95&K(UELV&M}H4U?_`*481THP8rqg%?`kJRbR zvNv1nuwZe8^&&9a6G$v!L_$rB>;PGzb7XVBM}~isRS(_H7}X&qNwc*pd!i$IyC*+s zHO%HaZdQI=saEkaB_S4k0JWJV&9bV-1`60YGN=Ol$q|Zi^x-m6bD-5svK+g~cFDQKNkW@(+K?kQ4Yp5SZlh=0cu_6MJO){>aN7+ye^KPPZyj<`sHQ-!-u& z9ZrHJ){oDbpRCh)C*9+ajUwT~ap_~Ke_3^%-&p2HLv#CjB1ue{S&kbHQOqLp562bQ zvHVJL^)CzxUXORbf_4Oy3d&>BS%N*gLrySI7g8nX`~E&+?R0Cb(|N|2u%41V_+x*F z5CpB7?_y5mz{kGfV@Hy@X=3`>570A0Mn943G z91?C||K1oIYz zBAC@dLy|y4l7d>peUV=yc;8aBk}wfqDo1ZKuGdl)oq!+>^$uMa|0}bh9z&ouV5i-q`k6A|9l?`2eVs{fZdXY6~ZrMIhrM$rj2$j zT%Q_&+=Vl`-&6VWR0p&eTmSRG@x~x`_R+kdyPwLHT27Xx)>_VROlmHPk@@*PKERFX6Zva7JqOZq-0Cm;$D#r& z2t^tJN8_)xl?SGC+!OvrVDJH}NfK=8QbH7H|5!|Zj$jCXX4BUHHM3Aa(@`Xi$p0FA zPe3JaPS;icKEMwQ6MQJsU(4(#IjAH!V?OL3^NI>9rhY>CTUUa^x>=R@&I;`5`HPHGT1i9;fX%SJBMZv5$ewUMk~ z9X=czkUy=Ya)cu5JEJE<4Vu9QNm&G6fbE-FM2;19&OnpR9z+lNLlJU(3OhALj3gN{f$+(_w}M!UbZXEdf*PH)`%_ z+R|;$6TU;CsX{qnucL0lxiJY+o$Tfc?i!1!A9XV(X%#;{^P;METmgYhNAd2PaWA^& z@&jLxzMH!Y$#m=}OZcN@ICEVEWi+3Cd||p>5AkG)8f$&u8L+qOf=Runofn*@WcSCS zcYzUa6kX=Y!iHeEBqBUlro~P2+BVCoaU*G?XPMRKDjYbtQ!qcRe$m}RMZG}o^M|$G z==!qy#o6ogJ(AC@GJ__&)0MAGe>?*Y;ljMbZORYe4nRr0PGf%+EBCse@0x=Pp8@%o%>M!BT1!1Df&DJkIH0aRChVn&!)iTkIU*4>cZQ1p_~NK2pN#@H^6E zsRkzrFx}Bk$HPn;4^SO~3&LA#>E@VQNa$uJHWIx2ES$^mtv1xEU z-ySd2=62-ycD0$t5|!t7Fu?bxC^u)#NKMbH)~b204(8EM1AyS5!=Ja~=IVE*7BDa8 zPrR}|{%qGnLrrTd7!gJIgDP!Ak%mJf6dvgRyJ@Gq8kkx6H7wBXFnl@W_MpCbrzxFs z+gvu@ozm)@m#mHJIJ8V5y};q!?+OmbrID!+yj{U8-;5-ix9ffW0|S~Z^cF6|{SW=k z>9~BZw_?!~l2=UEX(AJZV4lF;-xVOPiYJn#^bbWDfz_Q@7XzA+D^>-=zc!Fyw5-rj8l zb$D{d8sn?U*>0cvn?uHbPxCb59GN5HJv@OxBbZ6-tmz$TGNNYJ~51MlB2 z2G41ciR?CbLKaYH)AcXr9inxB;wi_koYM8+i4~q_@1JiE;$LumG7`ewl~zM87eeXb z{ykZhaJ%|%G)Xi~rceb+Y9T7}R#-d|6(X>usSV{+|+ zf(u2^0|56#5tX4f84^7!WQ??aD%c>;7%Ow<&X0dNbm;ZL6&#e(+V1o&(6 zaQ(rR=NscWs&z(v-_*KwEZoQDNg;Cd*e=iZe8E0~{i@;$rFk)?pIvW8=$we2k%O@v)M0mBVC+h|ok+poVP=wF}Z{M|giT5==W8 zbx;$5#op9`c;0ZAK6FA^ec|VML>{dzy z62aU#+GmyAN`0IH4%gd-&CCLx7kHUN6mJzSJ+`ugcVi`9*coz$yp5-k-JP}g>cs5- zg5UkMAd#As3EhPG8JT26WL+{WVc->{ZZpR1#NLY2KBC`%n6YAV2zTI!Je#SC56D9$5g zrX{)|cDg6V&lhHZ=AI=EI66HH8QdjQ;8_eX=q6J5RdN_Mmmv5eI#iR6uqVF;AVaOT#k*3lp2OY z*2Tn@FeB+(E-JWYm1|}09bb`P(!@9k582ASsBS=D8GHvBpcdMoN<1pI=ckVg$4R1) zk`$x#LO?gU(Gc0bp&@-23dgK7$vh@Tmuq#Bh$Kq(4o(pYCFRUD63ya(U?r&(gsAn5 zh_tFPCyB`M2lB5$U`AAF-+4(Z=RKU8x(WmfuSa#7K?3oDBwlqqlDle@8#@F?zYOul zbj&@Qx>MhY!GbF1#g?=p4jHB^`wFi`;`E9}PL;X6wEC-!Y&`(!wEOcAa8^wbqM=H= z>1TE%SltmzNE$aM({)kYh-B!)(>{Ay5XWa%n=ftus!3@TQWVSKrJ^i3{Q4m9TNm3m zj|;hJo~*9wupCkeAwwoRp;KiL*@zX|)nH54p`b+AfZ@^-5>vpWx4gf-+MmbOWJt&9 zr;kThAN;>i7ZE4|qSkSBARq42*T2QYA#vbVDoRQZ;9ApCC>P3c)peVeh7zFh;uZ1A zq~`L0g>t;L^$9uQHGI@z{#*$_YoZ|FUY+=p&25T!Y(Fwkf{dXG#A9qBW~sJx1QuK^ zD~_^FJrf^}L{EwT7cqGT|D)n}1>2J5k@^-+u7xGA5N7Xt-j4mI0p5Mu@+c-~g1j#Q zN;o{vEcYT?$jFMBV=Us6aq(r+UytpDiVaewW`{?Vb2JV8gT~Z3hURA<0Jl$0K|J#5hTMb^!8F)zpW~m) z8di5d<$8rj5=p}Ce7@Eb>A)+3_8Hj~0f#_dBoo{b1xI3CwM`{~bbGV(P#!Y?%wdKW z3GM^}_&sZF&F!-3Frjyl%^#mFKx}7WeKGrOaMRM=_1RokE3mD5w$nI3aHXhwRcZ?+ zv3I`lFV}`cuqo%=lav-;31)c>3^eE5Zssw zh(qkZARS3iFlKpO<}VtP0)Uj1aLd17i3kX@1wd&36@L2;Bm_3NzZeTv94JWjn&)o> z4w(kDc$4B^&`b;{NdCS5ZxBw14Yc^bUHh-p{yQNCuJt+23t^`Bo3Q&B|({Y=I) zQIjKr50*fY*Wxp(sy}&=ytjpy@L*H~5c%mzEgP#dU>H^_0f2{MovQOi6DZjhk`O1R1UbUGp9`XlD5z`By zL%ht53vPG`02+(3lv0#I&>pMn({0sUag4$Qx1nYufAJuZ-MKoe9Z?!W?7~FPaxFZq8XAODh%GbCO| z5rYY$y(aT%x`8rj5ol<#r2ybDDm!2qhkG|B$T0z;sp~y_Rro$V@3)-e0qdhr4S9Nc_KR&nqC+Ubt{{T_u(xAiJ7es9O zzBf0&1s_sv86yPlPL-3L8&k$ouza7XEBuJTq;sfZ&&pszRe_|A#!JN~GVAz`1Ly>` zv!7u%H(Fp8fJSOJAaGj>rau6iq62kL4u7fX1wLJB+;7_11rhwJq}c9{i}Ri*!`AHB zCBH&3S8h8=@0VE%&!h^Vhv~`N#f2I6BW@?d+-35a0xW(HzkTj|!Q{vLLkuMja98Jv zB5E;pUIyTU_75ErmId#dy`Bjp)kmGzz$$ZjBqR0&3FGPd&?PZmnYjPcyVnSx6{_)cVizkFv2P)6~~{gx9s z*jiF{N4LOMKTN{-7?N(=fpY$*g#C-G7G9%1tX|*aLl^}ExTVv8;E}nX`=!fE zHDCk4C6xdLnUdq#z?%bIix;;%T>f4+XWg9oHQN)Qn}9UHOw6HivA>{GaQ@@b!WOVw+-)3vj!C6V=foUIX^qZpEy>Q1<+T&lisCu`E^j$-Gp=yaJQ(#{K8u6h1te6?`eg2U|JVHw{3^_Lwm7C z{JNLty0^=hcfX;Nod|%3xRJ*%ynag2@<8+9Joaj*p4n)!Mf_42H7F{6^8C#NfDLzk z;@qoN!rq z*abf?0XFDZ_6UMK=5}{BwQ%;_Wqu5~gqw|O=|-%09k-gz` zwq<^B*(YSAM1-G#*7!0C-Y$d`4`zwqj(SK~hExjJCQ>vm2wn`AvBqDe^`qny(Bak=9-#_``I})j*N5p49 z$LSf2&UTidxC6`Ij`h5DN_VGVurd7MPD0ogz^u)8l@*^}S$$G0q4v{gvxA`wrV3`U zzIe-yf=3;kY4nRRwk>)0`B&qa_eS;e_Th|FA(X5fo2@td4y?plg$iu*J`Z<4GA0kEhu-55>qtHEw99aqySTHv~fF`_R^_`aL7XiHrKx$U-_rC}LCO(T~v`XcmD*$hip^P3~C+uQG4meXtxtT&O#0fHIN7o#}<^GW><)JlVOLu3J8?cRByV?a97o z)g@V7S3I9=>ycYiOG|ig9(|(8qTRH6wrofRO>_e&qoE!|Jzo75N_a!-a19%Lyd?kChaOv>nI9Sk@G^R*mz5-g#ol6CE0KzzNdhF>+uE-d5l$p|XESt3fCp ziy7;`ogl-0oq5&bBaD7q`{gq4P(r16p@#sg5-RK)LhHXmX!Da=h!Ew`GfYiO&E-N3QY;(Yr>y7_0j!k-p@CIwB@2#W7VN-a=yq z6YIgMz!s0U7R`q^#EQ8MD{OE%~MaDSJ(a>_=DTq)8QDx6=S( zM>oHxI}mlhx`#{Z<$gB!p4BK}A#%`!?jR-5snDme(Om<* zzWECxt*T*VWNMfG)Qj8i!uOMCOE#BC!?xPF_thu%)G-ph@Z3XkRS2l}$v!5ss$=O1fS*cmS94NI%lRd8V{(a56z=tei zN%+o_$Wt zX<4q!@%M5YkxIg}l_*K}Y}fM)^xYw9>MMHL^>oRYz#@5<_W-N*gQ%Y-<1YKghR%Un z)$h}Tr6m{owV zW-6<`MOauth8;(Y3gw`@pm?lhRhuX+`hlZ{fJiGVNEo9(9Ayg54a9L8WrR(wvYTJR@6R(NJMn=R!a#8nYO|NPQ= zej4S`)iB9zj{V!&Yt+a#g45Jpp7}H;Qpgpqjf4v=KA9#76k|mYjK_k9h;HL{L0Y=n z#>PTeMxZ)7dGJLS$+4hL{Peg;Hiv}E(?=hGh|pqD5fa6haP-r|_XTZSS-1A1xLQ7< zPmb^SlB)bM`yTtae;`!-;%KQ~o-f%J$9sT4lU&7UD{^_k1RZ(oyMQiMi%)S^?-I!a zae|BC0l8<*;x_hoszK#-pAHP90eE%AbHxnRt~cjysrMQ9P$(Z+YY-vcAz(f?&vNOQ zw4mb&wb~-#aaJ}22NV)SeSebT7^%?Q{`@Y?NEN+Sngjh2dzPN(k=Ru9J3-Em^Oq7q zS#|QbxF6wuYKvEFy&}UlL?eWRYG$$~5EfS4@rw}>_J~O^2@31 zj;;qIni+>a<^E$~js3YHmV#Zl-r0DNJpgSn?NGoQJLl#dhOO$B*F+IWUdk53mdqTa+D>PwsIDfBtDl z#Ec*)I@*AUEHCLjgg)H!CPoahG!Hq|k3T(*N9gnE3TB~VC^}oz~ z`*_SUMdV`OiBXx~a^%LQkzsI~oPlvUer)KEkmFx0GoAhs{eJMW?y89C!%kXGaX{iG zJDHd8?t(&f78jOQ_34yZ5J!G3$0HhVMUp3P4#N=A;BN;mgNw-UD($G1#}}|w-m)Hi zidMU&g;KN}S-R41qZUbKt=^rq*~x3KHEZ9VISN3fq~lHp1G0I8D-krAg&&Kn(A*CG z;NQsSy5dxAFu2QOj6#@}p9uLzaLPa9(2?g9^Dt9|HqZ>s?7l&Ja8-VR$RHXb+M@0z zD5<#cuICH>kMS!tk$Hp4>&pww}qc@%t z4CdX6xM5aeD(5`NDAo5w)$e*U2L#kE2wCAZa~<6VL8K#`cHH=TP%$=1X6!llr#d`M zjw@N;m#fr+N&TV%S&x6UdU=GttHUXV+~s$4%BZA9Ld+mt&cAJ1aPGBw0v~M{!YR?T zp~S>;=tze~vgZi7q(uN8p*L=pzXn!EN0x2DW9t)MDO66!JdBT1Gk64#)vLFCpmAzN zVq|T|qdLP(zhqpvOk27UUKI>{h@fucP_Q(UOtVCv?G^ZVz)WfJmWU_;=9vp3oYIX} zV+r1{;F1rARb+XW<_lr`dL9>QG!Q|W_sCpi)~G262T$bFw2Waw17s}rGqTEacoWN? zcipQ8mMIbP+))@*ex?q>1(%93*sZADk+;_v`ud5iC1lpN)p|MXMq2JvEsuWfDh7OamdvCNx ztC4$BZ0_21QAh{mGhn#+3ZCnWY#E^j!;yGb^%4gCT9`>!RDZ34N}JbeAU{Ru(@#)f z!XQqp*NcP4hWb*kDEm_&6_You+G=+li6xF2T~G&aW=|6qciWENR~~%SK_yIDk4d+; z8@^t>pjM&sLH~4QX{LKmhAo3m{L{~SZ>As5lbmlr4>ClG%QmWgP2JsdPGT`Rg zx~$Rr=`$^nH6#!0H;eI-q8nMzsyJNr)cfLtlghps7Ro9QMhU*+YP8V7_FE-uhbmPD zv5!ydL>YeFZbpW27^z4{9Zw67D|eXZ!t`DHUkb!PK9z6oh}+arCiEGCz#WY*&uI-v)sr^tJ9nB4RqZ6%h1TogRDCnF_zs0B_A%YI1Wrs4Q#NZpjM zC>DBizI3v<&sa;e&8qz8H(c%uJ}Zw-SwGc}7b4?vz_T)R`PmT&PAci9r$}uVk|(=l zmM1<2_sP8BJPEuv>XEyhJZ@pD4Eik0E>oSys}B-kqP~?LP$(QiQqH(Q@0?>661eF|tt94vLG10)25Dv{e|Xco1wVWm*z^;+J98B>G%*V zgAXnSVA(w@VnXEQFs}N$EYl}#2TzE2?DKxyltXwIG}R%1I%R0s6Jh69K%&m;N~n7M z-pP!bDN)8RgWsd6l0Yu?8Na(Dwa$(+HXS;``W}F>8(Q|Y{sdy%2Xc^tC@DiK>co7L zmW8sqD8%zY#gjUK`7cLr`PkdhOaS7Cl(DtY&LMRX?G! zv!FWs00O%X$au&d2yHcD1cQvy&p7FLTu zFY9T-6Xh>rsGU^?QTpYpJ?RgonO>8(QXXD6=e1GKc{l$Yxkn+Zd}>eUao7bsG?$wt zat7K=&#E*ORrBa|A;>Ba#j0=KNxZ}NOpkq@8$hH?=jL}mt+=~b5`4}In4(o8z9_UZ zj3$C?q3=|&l4}ZalF(@dwf-oh8O0J8=rlW9&(bI-7>kmTB3FD_95I*&1jfBCTzM5~ zYEqnnkPeXBC}N<5<_Yk$VH=(w)25|Fm;spr{f~dW z7UUT>*c#0qqtxBTF>FTvft8HyXNj#}KykGXxQF)9WJ_c3%okhS>R!xMxpVqkhpHK3Xmr`5LqtON;~ z(BjpJb$x1Qag#xNL5twCM?=rnlwr&avNlh^WP9~tg09{_O#=>+jAp%(i9|-Gx zY_tbUFr(tmDW_|L%wQk^$Q^WA-Jcv$qCJGAEvDJDnu9o%Gu@U5_1E3X-WMPClH51@ zK3+*rH-hQ=)0 zReEUuT8)81lJcE_MWKxR{;!f`yMauZBit;5qkh`V>FG+t+-C04Fykr9$6F<8Q?c*5 zGtp34gK&}%B&)AZemB>moR)Z0cRt~55O6BXITsDviGNgUNpJ-g%Tr!%{Vmizko8wd z9bS-6sOCKC?V(BP}gexLED4C(?2lYDM5q@yjU#WEn&}$q-k4760+0Q==U-Q zgES8?=UrfZlh5`&tgNK|ZQez|XEj$>3l!-r!2C&;MN|WYmH`y+pp%&{d>{){v(8{b zcNDO!=)n94j8n2($ty7en@f2~7i)zP^ciQsmd{tUue#}IcSC9jGQ=jBjexN#@lg`( z)EDtd1z;nJ?wyK3P=UtDS5RV*dYwxC650XbHte%`y>+wN?6hN2x|s|VEG+dY@)^%h z0boMq=J-O-^$z;n6Lee_-d8^ybI#y>!2=Uc$yWur9>&ey%NRoSZZ-TcS!xdQKBI5e znq|DP$h;(J3lgeN5Q4-iO4SVfawi!#B;L^D!EC0E>OtvbkW=fZ)zww*lJ%=YCI_TZ zrPghIZ8FMrlG+JiR`=YA!+nPR0Au>ThkRjibgx1-f|+#=OeX`hJvwylG_s%Y_DrDj zf$@l`&^%cdhcxX{F@u8SB}MpqOJjLPG1DKvUooH7>;jc+lxdeJ;O7T5iRoso$|Lmw zR!jNMio}jikm{*b{|GH}(d=<1ZT5%(NXVw2Oo$9u8>Nu0Lx657ju*(Tff?9CLH@84Xfr+nNZ@uuE@LB^K{`~YB#Of9@ zbW7B}I@jN%>PF<7$$t$){^QOLbP%5M2UQN1i6UCL^sPyyiUNer(n>&jZ4w+Nlg6Oq zCAUqA(knvc790=9pfncEngCLI$J~v$I@pBT_OVL*$ zivwn7m9-mQDD`a2rpadiwWVVWt%6iMN5U8hbwczx}(urp0X}1(rRMQQ8b?aEP~n@8#6IcYQ=iaI6?o)m}Bx78Mf-2Z!$oI|~3k{uz;k zusT}^GB5GyUVgRWJ7#XWR(voJDxyVQUpYHNx2q$*Uv5{I_HND9+elfCMYmUdB}@~$ zHq6lo7O7AE(N2Gq{B}(K9q?!HB3Zg{ES(FK+adwWIq z=R9l}`>aj#Pgi;@30ndiY8S0?#cK}_*UtpqZf+sdTwosa_w>h9;FPdW{ zQwFJee|OU@({2cn1Mw@%6qt@(81fa+d5hN?XbsfB2E-VU%~%+ar7{J)O2OtC_<}1? z4`MG48pb)%eUa54PumP{rC0LXmH`#2nogLL3bO7op1*n7G#WcjVjj8u@`s3wY+xe; zXxo=KZ*0D_Uz>n7+H_S(D7pdMAntQgM!Zf^0V=5x6@us?-6-xewS6klPI z0g9$WroIK0i?eXr@d$9OBY&hDETDb7xoVXFf&anXZbH2X>w%dfMM~b|KFUaWVvv<$ z3ns%#L;rg?_`27`e6F^RP-8&x-2*|nfw^*a0$&OS@6S(eJSthlJn|k2W!Y9n0;1pjWZlYeq3xL@YQN{ruUosOcX|JGTa$mS{ zrzO`lj47_3lx}Q^XVCQY6wIJC1V9j2^REIKDbry8C@KHyDM=KVZ3bpr7!CaiD}~_g z;m2{C3!ZHuih`!z!JxHoqWTDCl?*kW1Jbw-Z|X8X|SiEwviuhH=ic6z|~|bFLDbZR`adr>3k7OzsIqMj6$f zcz%Ee2uq;(%!S~{U%Ak_MknB-6lDL^q?=ufEJ z(J`xJLd^@5j~XX$*Pum2dh+sz!^$$-`JQI8 zvy~aET{x+XO^;1o9JCp@Dp-E=fbX}SRG&d00g_W5ztV4qt1mG6?*FLAnGuR%4Ktr^ zbGW*knPEqFGy*5CpWlI>JxU1didIWr7fyASy8V7yiCht5myxWg@SD9h3_H>Lg#R(e z5FzfTTi6T8aUVN@){C$D>gZQ_i8EdSeOvZkDmC32&u*)l@vpmtZ%`&9sOTV70e8fM~7`mzGnf&GEkvUi zT05NWtgzMW1DP=BZ+od2Vt`x`tR7CloIVWf7R&S9nSEZZRR_rw7=U>XX6w4%Cpu9( z2<(sy(@y8>5VV5#C93<%uu(q-+3eI0KSjyID3?c6uYiG@OQP)F+@N&^qt#*pl?04h zynthr(LH>hE?dAy7;woe0dw^|(D6#fTW8BEC>7n|dV$d-JvxrNwqH&iGm+PU)Tu9q z&bqK5uZe%Af&8e+=g6BrJFqI-U{x~m<9(un7z9$+oyDy?Yk+ia6>>1Nu+A#eV$Gf5 z-|#z;Iu?TFmxJQ=VwxjT;c#=!uDF6RK-~18@1$S^uVSB|iammS`1J+^aP8eY-MkJ)QpvQsQN5`<&cJI9|5Q8thns7zwt417aH>`1`^sMRqd{ea*?=kr z+|82cp?e3rb>CR__rziTuFhqDV#_O@kOUYH@{p$8z04--(4qEwc8*y+do~o+I=NdR znDVPggZlgETj^ww*782_+=gHOd|k|BXQ~mabfF-%Y}T4kOU*Q`&&KHtLOqyrCTnG0 zJL{~@b&jS*>L@KW_g=4l_Lbi8XRD(<(US8ePh%^OPddjr8Viv-zVDvKQDowR<(sY_ z<YY%GTy&|5V-Jn zs&dcHlrnM9oP9UU$F=LOc?Z_3eW=eW$-eo{pNV=sO{c+)__I33E(Sv(b$6O3p%{KuEJcxv_9Z=7H_v_`wel9_Nw`i>YU zNqf_GBYa_e^4HIfT5SW?Gt;t?_b!P3wI#!<4@!St<2^jX8b#=TCM4%7iaH(!oD!?_ zqZc-H^Y+pfvoEWf-sEY31W(xvzM0n&-eB86+m?1tX9gz_wB8;|Tg*4uDQ1|r*>Ajq z(aB!Zz0Zvf}j>=kBu+t)vAa<^4lFT^>1Er?lC@+#QJ^-}?>Kq))n zyT_!aQyOmZOVtULbU<49Y(GGcBEJt#Z{a_dG;Q;c(|}6=1+|7Ur52k2mmuS_ z&;1p-=Rixm&)tsRIp7hDzn*&G0EkL6AR{mN3TdNH;^#rS!;eaE7|$S}#B@f%92 zaE|af#AEFO9efTF&8!WQ|6n@1iK_z##RvcrW?z1Qg>Lk@-DFBaW->De$&!rio=c0z zBJR$_om1s-oZ zvpD}}vdn_D?Y3$d5G7%(Hju6MMUiq58vGoVdEvaBpRCy%^<2kq*!nx3IAFAW^WdAx z^u9JH0We;z)!gKCfj8h_o^RzwKP{umI0FZ&OalWjo$VVS5bifD15|Ae>=D|p0fMmC zaSmvh4W_tBpf{q?_%Aq3BECJ`-_)%|@iyH6RK@C|lwP@DI#Es693asZCFM;6I)bYq zl<9hw#up$dwXuR(y`mk)D{*nBLg+t$WoibVJ=`BWM7$nDed}tT3T)g7@d%=o>4_4; znN=zSGkkuK4|fi8v1t|U&8C~2cG5|lWxWA!F~W9?0fsVtPRqJX_`L~Ka6RD1bYsPx z?M%%@5OY2obl#gK77-ybYlIb>Z1eGXOBRAjA?&$~yaQ0zS#Yw{ybA+jfCqrqCPA31 zL@_rA#!_P$4hGqNFwbbkC#Ja3D8q_>yA~t)v341=u0L5nOEqLVK#4{I@L_fc>D6jcG#t?vJHapuub^?w|H64}eeko*cGk*z_RQp1F?Bt`a#GGqx6rU=of zu};S5d9ubRDPi(V3kFHdBxHXK*$UZbI-^33%=4Yj@0{N`zrXG|_ug~A-}629-tT95 zz2Ew08XSMF0VEOe0ek53$Jg^H%A1GFfWW-E3T@HNRD2u&Q7*GJ-+WruB)WK&QS~z= zJiM&+JK$m!{M}GG-OiDr4|jJKz{QFhlprd-T>~3H5vc{|z+wCc4BEB!E*fxpB)T1e zlW2=|?IuqOHrKc@WoQFc;|q2wJ!xs)Ue@RiI5E(xtQWr~v=;(bRlA9LbpOZ^Kvs2} zLVb6gGw;8jks`UTO~GA=rhMb=E!vnR$F8VAYOhntva30Rz{Q=2pZt z*W;1invHeo_|r#_@1|Ue3%Bk#R-+HU(5>ca)7G#Ih|??<2fRsF*>KPbgTww!t`2{}YteQoC9mivp}29lTNl6A51(Jv1M&PCBIR zI%Ik&WPLq)$SbIR4zwNg7nQ-C_Uje^!}XXh|4c}K8ac26U#28~2yK3H$3M3AmB#fZ&C4R0uZb!K}zg@lpqDRh+o$0VS)3j_ZHK{YVTm#1 z=>d2)8Ei9ddAdbL#vmYmF#5E}Qtn#9yx8Rdzh1OxyOrSCztTz!Ct@)1am8g{62Z z#79&$y~;$p$$=J+n-lri9g*BEAyTA{T~dBh#ULAd4@>#>-X*)=^0kvf5f_$M(s+3yZb6AWeeS^=NO!969URnD6uxaZj z5tFaD9bnm)ScmeiC@m~T`5WOV{FF_U~*HLWu%EcOj3Svae&3V!_&b+r0c%H-~S9clYTloKF=Sdlry3t1gn~z zYZ_rYv8QfjMn1@psorxdYiJrES9=2Hy`1)=6I5b&{#LLb6-)4J17P%YAu~)qDb)3B z1RMW2Q2AUePRF_BY{;ni7Nyozjb)66U zL^5GxAz-1ZF)ZU{fN(x<_q-8$Ngp%=eWpvEUbi)XpAXi;u&#O6dVvnfed37G+y6{6 zqULEwz|WNf#Q9M~T-9i-09zZ*3AEAJCF2M7zB$^%<9Q3oR-$rSw+#w-&4G9uW+?#QX`>n8 zMxrS+vtb1b8J`@yZCvf<03YJp>k;c>xML&Xb)Qn^wHRt-)T*aYwmv?yeV-W!nA{YA zl~Dajf-Rgl%on`;d?{`OscoJ|(KcyK(4 zEfI{#SobiGfG0gO=B$LB=j#Cv?k$bTw|F&*(DA7)La_=gno3PW$ry(675asM9Q0a> zI+a!<*SqpAUCowvNh^1u&$qRz{C(2TeRM2tx~kH9 z+wmSbIt(`q2sA@i8r1xTz8J3!aweKa3uGC+A^PX@mYn9VF;A*T$wdC*^>{6%ZW|8N zgO4sosE*tf)KW~ofM%1e=<_TsTPpIJjE^t5Bx1F@wL9+D>{;t9-H9G|>SsC^5V`F3@2^JFiaW=Y2K zQsl#t9N9wMZ4=rKkc0zu?xHH=+>)u((#^4Sv<_Gnr(xsyV7ChvG~UyK>t@4YEmiGj zICiypU|p_lv+Arggb)h zIkHe(N%(KY+N}|!Zr0TQAMDMUs{NI*Lfs`A2C`dMC>Hfw$(ivNs33T{xbx(N&-kB- fCYY3>9zh^pQkP(3!0d*E-n#afQ`R&~-{gM*Muj_* diff --git a/Drv/TcpServer/docs/sdd.md b/Drv/TcpServer/docs/sdd.md index 5e494990c0..a31156a1a3 100644 --- a/Drv/TcpServer/docs/sdd.md +++ b/Drv/TcpServer/docs/sdd.md @@ -57,8 +57,6 @@ void exitTasks() { (void) comm.join(); } ``` -## Class Diagram -![class diagram](./img/class_diagram_tcpserver.png) ## Requirements diff --git a/Drv/Udp/docs/img/class_diagram_udp.png b/Drv/Udp/docs/img/class_diagram_udp.png deleted file mode 100644 index 707fb8c7ffa21c78f0335f66aa182980dcffdfcb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21994 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/channel.log` and `RPI/logs//event.log` respectively. * Sometimes you see the error: Could not connect to socket at host addr localhost, port 50000, or address in use This means that the GUI was restarted before the socket was released by Linux. Wait a minute or so and try again. diff --git a/Ref/docs/sdd.md b/Ref/docs/sdd.md index 1df7a76d9f..9cbf177d43 100644 --- a/Ref/docs/sdd.md +++ b/Ref/docs/sdd.md @@ -48,7 +48,7 @@ There is a set of useful utility components that can be used on supported operat ## 2. Topology -The topology of the reference example is the interconnection of all the components used in the reference deployment (a deployment is a set of components connected together and compiled into a binary). There are a large number of connections so it is not feasible to show them all in one diagram. The following sections have views of the topology that show the connections for a particular purpose. The topology diagrams will be broken down into the core set of Command and Data Handling (C&DH) connections that would be reused from project to project as well as the connections unique to the reference example. The diagrams were generated using MagicDraw, while the XML defining the topology connections was generated using the MagicDraw plug-in developed for ISF. +The topology of the reference example is the interconnection of all the components used in the reference deployment (a deployment is a set of components connected together and compiled into a binary). There are a large number of connections so it is not feasible to show them all in one diagram. The following sections have views of the topology that show the connections for a particular purpose. The topology diagrams will be broken down into the core set of Command and Data Handling (C&DH) connections that would be reused from project to project as well as the connections unique to the reference example. The diagrams were generated using MagicDraw, while the FPP defining the topology connections was generated using the MagicDraw plug-in developed for ISF. ### 2.1 Commanding diff --git a/Svc/ActiveLogger/README b/Svc/ActiveLogger/README deleted file mode 100644 index 52e238e738..0000000000 --- a/Svc/ActiveLogger/README +++ /dev/null @@ -1,6 +0,0 @@ -This directory defines an ActiveLogger component. This is an active component that stores events generated in the system. -It has the ability to filter the types of events for storage and for sending. - -ActiveLoggerComponentAi.xml - Defines the active logger component type -ActiveLoggerImpl.hpp(.cpp) - The implementation class for the active logger -ActiveLoggerImplCfg.hpp - Set of configuration settings for logger \ No newline at end of file diff --git a/Svc/ActiveLogger/docs/sdd.md b/Svc/ActiveLogger/docs/sdd.md index e93416293d..4dd0de2718 100644 --- a/Svc/ActiveLogger/docs/sdd.md +++ b/Svc/ActiveLogger/docs/sdd.md @@ -40,7 +40,7 @@ Port Data Type | Name | Direction | Kind | Usage ### 3.2 Functional Description The `Svc::ActiveLogger` component provides an event logging function for the software. The framework autocoder allows -developers to specify a set of events in the component XML +developers to specify a set of events in the component FPP. (see [Events](../../../docs/user-manual/overview/04-cmd-evt-chn-prm.md). For these components, the autocoder will add an `Fw::Log` output port to send events in serialized form. The ActiveLogger receives these port calls and provides commands to filter these events. The filtered events are sent to other components such as the ground diff --git a/Svc/ActiveRateGroup/README b/Svc/ActiveRateGroup/README deleted file mode 100644 index 77705120b6..0000000000 --- a/Svc/ActiveRateGroup/README +++ /dev/null @@ -1,6 +0,0 @@ -This directory contains the implementation of the Active Rate Group. -The Active Rate Group is a component that executes components assigned to the rate group. -A call to the input run port wakes the task and causes it to call all the components connected to the output ports in order. - -ActiveRateGroupComponentAi.xml - The XML description of the active rate group component -ActiveRateGroup.hpp(.cpp) - The implementation of the component \ No newline at end of file diff --git a/Svc/CmdDispatcher/README b/Svc/CmdDispatcher/README deleted file mode 100644 index 76fd4a64ba..0000000000 --- a/Svc/CmdDispatcher/README +++ /dev/null @@ -1,6 +0,0 @@ -This directory contains the CmdDispatcher component. This component takes incoming Com packets that have commands encoded in them and decodes them. -It looks up opcodes in a table build by component registrations. It also handles completions, passing the status back to the sender of the packet. - -CommandDispatcherComponentAi.xml - Command dispatcher component specification -CommandDispatcherImpl.hpp(.cpp) - Command dispatcher implementation -CommandDispatcherImplCfg.hpp - Command dispatcher configuration \ No newline at end of file diff --git a/Svc/ComSplitter/README.md b/Svc/ComSplitter/README.md deleted file mode 100644 index 9a76280df3..0000000000 --- a/Svc/ComSplitter/README.md +++ /dev/null @@ -1,37 +0,0 @@ -# Svc::ComSplitter - -This is the build directory for the ComSplitter component. - -## Redo Targets - -**Main targets:** The following `redo` targets are available: - -* `Dictionary`: Create a directory `Dictionary` containing a dictionary for the ISF Ground Support Equipment (GSE). - -* `Docs`: Create a directory `Docs` containing ISF-style component documentation. - -* `Interface`: Create a directory `Interface` containing a component interface. - -* `NCSL`: Create a directory `NCSL` containing counts of non-commented source lines of code. - -* `README`: Generate this `README` file. - -* `Template`: Create a directory `Template` containing an ISF component template. - -* `all`: Build the target `Build/$TARGET/$MODE/lib.a`, where `TARGET` and `MODE` are environment variables. The targets are Darwin, Linux, PI, and CORTEX160. The modes are Unit, Integration, and Flight. If `TARGET` is not set, the system will use the native environment (Darwin or Linux) as the default. If `MODE` is not set, the system will use Unit as the default. - -* `clean`: Clean this directory and its subdirectories. - -* `refresh`: Regenerate `ComSplitterComponentAi.xml` from `Model`. - -**Helper targets:** The main targets use the following helper targets. - You should not have to invoke these targets directly, - except when developing or debugging the build system. - -* `Table`: Create a directory `Table` containing the part of the table interface that is not represented in the ISF XML. - -* `default.a`: Build a component library target `Build/`*target*`/`*mode*`/lib.a`. - -* `default.ncsl.txt`: Generate an NCSL file. - -* `default.o`: Build target of the form `Build/`*target*`/`*mode*`/`*path*`/`*file*`.o`, where *path* may be empty. diff --git a/Svc/Fatal/README b/Svc/Fatal/README deleted file mode 100644 index 33213c3ac3..0000000000 --- a/Svc/Fatal/README +++ /dev/null @@ -1,6 +0,0 @@ -This directory contains the definition of a FATAL event port. -This port will be invoked by ActiveLogger when a FATAL happens. -It can be connected to a component that will decide what to do with -the FATAL. - -FatalAnnouncePortAi.xml - Defines the FATAL port diff --git a/Svc/FileManager/Model/Ports/role.txt b/Svc/FileManager/Model/Ports/role.txt deleted file mode 100644 index 2534c5c01d..0000000000 --- a/Svc/FileManager/Model/Ports/role.txt +++ /dev/null @@ -1,20 +0,0 @@ -Name -Role - -timeCaller -TimeGet - -cmdIn -Cmd - -tlmOut -Telemetry - -cmdResponseOut -CmdResponse - -eventOut -LogEvent - -cmdRegOut -CmdRegistration diff --git a/Svc/FileManager/Model/dictionaries.txt b/Svc/FileManager/Model/dictionaries.txt deleted file mode 100644 index 6a4f727b51..0000000000 --- a/Svc/FileManager/Model/dictionaries.txt +++ /dev/null @@ -1,3 +0,0 @@ -Commands.xml -Telemetry.xml -Events.xml diff --git a/Svc/FileManager/Model/kind.txt b/Svc/FileManager/Model/kind.txt deleted file mode 100644 index 584c84786d..0000000000 --- a/Svc/FileManager/Model/kind.txt +++ /dev/null @@ -1 +0,0 @@ -active diff --git a/Svc/GenericHub/docs/GenericHubExampleAppAi.xml b/Svc/GenericHub/docs/GenericHubExampleAppAi.xml deleted file mode 100644 index 0082f4f92a..0000000000 --- a/Svc/GenericHub/docs/GenericHubExampleAppAi.xml +++ /dev/null @@ -1,145 +0,0 @@ - - - - - Svc/GroundInterface/GroundInterfaceComponentAi.xml - Drv/ByteStreamDriverModel/ByteStreamDriverComponentAi.xml - Ref/SignalGen/SignalGenComponentAi.xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Svc/PolyDb/README b/Svc/PolyDb/README deleted file mode 100644 index 2a913cb86f..0000000000 --- a/Svc/PolyDb/README +++ /dev/null @@ -1,6 +0,0 @@ -This component implements a PolyType database that can be used to save and retrieve telemetry needed in the software. -It has guarded ports that control access to the database. - -PolyDbComponentAi.xml - The XML definition of the PolyDb component -PolyDbImpl.hpp(.cpp) - The implementation file for PolyDb -PolyDbImplCfg.hpp - configuration for implementation class \ No newline at end of file diff --git a/Svc/PolyIf/README b/Svc/PolyIf/README deleted file mode 100644 index a1c6e94eea..0000000000 --- a/Svc/PolyIf/README +++ /dev/null @@ -1,4 +0,0 @@ -This contains the definition for a PolyPort, or a port that passes a PolyType. -It is used to set and get values for the PolyDb component. - -PolyPortAi.xml - XML definition for a port that passes PolyType values \ No newline at end of file diff --git a/Svc/PrmDb/README b/Svc/PrmDb/README deleted file mode 100644 index aaa81e9938..0000000000 --- a/Svc/PrmDb/README +++ /dev/null @@ -1,9 +0,0 @@ -This component implements storage for parameters. It implements the framework setPrm and getPrm ports. -Parameter values are stored as a table based on parameter ID. It reads a file during initialization that contains the -parameter values and loads them into memory. Subsequent calls to getPrm will get the loaded file. -Parameter values in the components can be updated by command and saved to PrmDb. -The PrmDb component can be commanded to save the updated values to a file. - -PrmDbComponentAi.xml - XML definition for parameter database component -PrmDbImpl.hpp(.cpp) - Implementation of parameter database component -PrmDbImplCfg.hpp - Configuration for parameter database \ No newline at end of file diff --git a/Svc/RateGroupDriver/README b/Svc/RateGroupDriver/README deleted file mode 100644 index b9a8ad16d8..0000000000 --- a/Svc/RateGroupDriver/README +++ /dev/null @@ -1,9 +0,0 @@ -This component takes a primary clock tick in the system and divides it down to drive output ports. -Constructor arguments define the divisors for each port. -The dividers argument define the divisors for each port as well as an offset to allow the triggering -for the rate group to be offset from each other. -The output ports are meant to be connected to the input ports of rate groups to drive them at the -correct rate. - -RateGroupDriverComponentAi.xml - XML definition of rate group driver component -RateGroupDriverImpl.hpp(.cpp) - Implementation for rate group driver \ No newline at end of file diff --git a/Svc/Sched/README b/Svc/Sched/README deleted file mode 100644 index f4c15fada2..0000000000 --- a/Svc/Sched/README +++ /dev/null @@ -1,3 +0,0 @@ -This directory contains the definition of a scheduler port. This port is used to invoke rate groups and their members. - -SchedPortAi.xml - Defines the scheduler port \ No newline at end of file diff --git a/Utils/topologyTool.py b/Utils/topologyTool.py deleted file mode 100644 index ce957045a4..0000000000 --- a/Utils/topologyTool.py +++ /dev/null @@ -1,258 +0,0 @@ -import os.path -import pickle -from optparse import OptionParser - -from lxml import etree - -""" -This script is meant to serve as "sanity" checker for the MagicDraw generated topology XML files -""" - - -def setup_opt_parse(): - usage = "usage: %prog [options] [topology_filename]" - parser = OptionParser(usage) - - parser.add_option( - "-d", - "--xml_diff", - dest="xml_diff_flag", - help="Performs a diff on the specified XML files.", - action="store_true", - default=False, - ) - - parser.add_option( - "-c", - "--command_index_print", - dest="command_index_print_flag", - help="Prints a table of the command indexes.", - action="store_true", - default=False, - ) - - return parser - - -def validate_xml(xml_list): - """ - Iterates through XML list, shows an error if an XML file is not an XML file or does not exist. - - A list of valid XML files is returned (Not valid files are thrown out) - """ - - out_list = [] - for xml_path in xml_list: - if os.path.isfile(xml_path): - out_list.append(xml_path) - else: - print( - "WARNING: XML {} is not a valid file. Rejecting file.".format(xml_path) - ) - - return out_list - - -def recursive_xml_parse(tree_obj): - """ - returns a list of items - [tagName , [(argKey:argVal)] , [" " or [tagName , [] , []] ] ] - """ - out_obj = [tree_obj.tag, [], []] - - for att in tree_obj.attrib: - out_obj[1].append((att, tree_obj.attrib[att])) - - internal_text = tree_obj.text - if internal_text is not None: - internal_text = internal_text.strip() - if internal_text != "": - out_obj[2].append(internal_text) - - for internal_item in tree_obj: - out_obj[2].append(recursive_xml_parse(internal_item)) - - return out_obj - - -def tag_object_to_string(tag_obj): - out = "<{}{}>".format( - tag_obj[0], "".join(" " + x[0] + "=" + '"' + x[1] + '"' for x in tag_obj[1]) - ) - - final_line_break = "" - for internal_item in tag_obj[2]: - if type(internal_item) == str: - out += internal_item - else: - out += "\n\t" + tag_object_to_string(internal_item).replace("\n", "\n\t") - final_line_break = "\n" - - out += final_line_break + "" - return out - - -def diff_files(xml_list): - """ - Finds the difference between topology XML files, ignoring ordering and names in "connection" tags - - Iterate through root tag elements - Create a dictionary with file_dict[tag] = [list of tag objects] - """ - if len(xml_list) < 2: - print("Less than two XML files were specified. Exiting.") - return - - master_tag_dict = {} - for xml_path in xml_list: - # Create etree object - fd = open(xml_path, "r") - xml_parser = etree.XMLParser(remove_comments=True) - element_tree = etree.parse(fd, parser=xml_parser) - fd.close() - - # Internal Parsing - xml_dict = recursive_xml_parse(element_tree.getroot()) - - for tag_obj in xml_dict[2]: - if tag_obj[0] == "connection": - tag_obj[1] = [] - - pickled_obj = pickle.dumps(tag_obj) - - if pickled_obj not in master_tag_dict: - # del master_tag_dict[pickled_obj] - master_tag_dict[pickled_obj] = [] - - master_tag_dict[pickled_obj].append(xml_path) - - # Separate by XML path - tag_to_object = {} # tag_to_object[xml_path] = [obj] - for pickled_obj in master_tag_dict: - if len(master_tag_dict[pickled_obj]) == 1: - if master_tag_dict[pickled_obj][0] not in tag_to_object: - tag_to_object[master_tag_dict[pickled_obj][0]] = [] - tag_to_object[master_tag_dict[pickled_obj][0]].append(pickled_obj) - - for xml_path in tag_to_object: - print(xml_path + "\n") - # sort pickled obj lists - tag_to_object[xml_path].sort() - for pickled_obj in tag_to_object[xml_path]: - tag_obj = pickle.loads(pickled_obj) - print(tag_object_to_string(tag_obj)) - print("\n") - print("\n") - - -def command_index_print(xml_list): - for xml_path in xml_list: - # Create etree object - fd = open(xml_path, "r") - xml_parser = etree.XMLParser(remove_comments=True) - element_tree = etree.parse(fd, parser=xml_parser) - fd.close() - - # Internal Parsing - xml_dict = recursive_xml_parse(element_tree.getroot()) - - connection_information = [] # [{target/source: {attribKey:attribVal}}] - - # Gather connection data - for tag_obj in xml_dict[2]: - if tag_obj[0] == "connection": - in_dict = {"SOURCE": None, "TARGET": None} - for conn_obj in tag_obj[2]: - if type(conn_obj) != str: - attrib_dict = {} - for attrib in conn_obj[1]: - attrib_dict[attrib[0].upper()] = attrib[1].upper() - in_dict[conn_obj[0].upper()] = attrib_dict - connection_information.append(in_dict) - - component_to_cmd_info = ( - {} - ) # component_to_cmd_info[componentName] = {cmdIndex:index , cmdRegIndex:index} - - # Create dict mapping components to their mult values on the cmdDisp - for conn_info in connection_information: - source_dict = conn_info["SOURCE"] - target_dict = conn_info["TARGET"] - - source_comp_name = source_dict["COMPONENT"] - target_comp_name = target_dict["COMPONENT"] - - if source_comp_name not in component_to_cmd_info: - component_to_cmd_info[source_comp_name] = { - "cmdIndex": None, - "cmdRegIndex": None, - } - if target_comp_name not in component_to_cmd_info: - component_to_cmd_info[target_comp_name] = { - "cmdIndex": None, - "cmdRegIndex": None, - } - - if source_dict["TYPE"] == "CMD": - component_to_cmd_info[target_comp_name]["cmdIndex"] = source_dict["NUM"] - - if target_dict["TYPE"] == "CMDREG": - component_to_cmd_info[source_comp_name]["cmdRegIndex"] = target_dict[ - "NUM" - ] - - # sort by num - sorted_list = [] - for comp_info in component_to_cmd_info: - sorted_list.append([comp_info, component_to_cmd_info[comp_info]]) - - sorted_list.sort( - key=lambda x: int(float(x[1]["cmdIndex"])) - if x[1]["cmdIndex"] is not None - else -1 - ) - - # Print table - print(xml_path + "\n") - header_list = [ - "\t\tComponent Name\t\t", - "Command Index", - "Command Registration Index", - ] - len_list = [len(x) for x in header_list] - - print("| " + " | ".join(x for x in header_list) + " |") - for comp_info in sorted_list: - print_list = [ - comp_info[0], - comp_info[1]["cmdIndex"], - comp_info[1]["cmdRegIndex"], - ] - i = 0 - row_string = "" - while i != len(header_list): - if i != 0: - row_string += " | " - format_string = "{0:^" + str(len_list[i]) + "}" - row_string += format_string.format(print_list[i]) - i += 1 - print("| " + row_string + " |") - - print("\n\n") - - -def main(): - parser = setup_opt_parse() - (opt, args) = parser.parse_args() - - xml_list = validate_xml(args) - - if opt.command_index_print_flag: - command_index_print(xml_list) - - if opt.xml_diff_flag: - diff_files(xml_list) - - -if __name__ == "__main__": - main() diff --git a/cmake/autocoder/helpers.cmake b/cmake/autocoder/helpers.cmake index c871944abf..b4d951b74c 100644 --- a/cmake/autocoder/helpers.cmake +++ b/cmake/autocoder/helpers.cmake @@ -11,9 +11,8 @@ include("utilities") # Macro `autocoder_support_by_suffix`: # # This sets up an autocoder to handle files based on a suffix. For example, passing in "*.fpp" will support all files -# ending in ".fpp" i.e. FPP files or passing in "ComponentAi.xml" will support all component XMLs. It is implemented as -# a macro such that users need not do anything other than call it with the suffix to setup the system correctly. This -# performs raw ascii comparison, not regular expression matching. +# ending in ".fpp" i.e. FPP files. It is implemented as a macro such that users need not do anything other than call it +# with the suffix to setup the system correctly. This performs raw ascii comparison, not regular expression matching. # # **Note:** this will set the appropriate variable in PARENT_SCOPE and since it is macro this will be the parent scope # of the caller. diff --git a/cmake/docs/sdd.md b/cmake/docs/sdd.md index 1898f81782..df2e5c3442 100644 --- a/cmake/docs/sdd.md +++ b/cmake/docs/sdd.md @@ -222,8 +222,8 @@ this component is built as an F´ module. This call passes in the above variabl # SOURCE_FILES: Handcoded C++ source files set(SOURCE_FILES - "${CMAKE_CURRENT_LIST_DIR}/PingReceiverComponentAi.xml" - "${CMAKE_CURRENT_LIST_DIR}/PingReceiverComponentImpl.cpp" + "${CMAKE_CURRENT_LIST_DIR}/PingReceiver.fpp" + "${CMAKE_CURRENT_LIST_DIR}/PingReceiver.cpp" ) # Note: no MOD_DEPS needed. @@ -256,7 +256,7 @@ Topology `CMakeLists.txt` follow the same format as the Module files with two de # MOD_DEPS: Modules needed by this deployment set(SOURCE_FILES - "${CMAKE_CURRENT_LIST_DIR}/RefTopologyAppAi.xml" + "${CMAKE_CURRENT_LIST_DIR}/RefTopology.fpp" "${CMAKE_CURRENT_LIST_DIR}/Topology.cpp" ) @@ -375,9 +375,9 @@ Module functions are designed to create a library (static or shared) out of an F module name is determined from the directory path relative to the root of the repository. i.e. `Fw/Comp` becomes *Fw_Comp* and yields `libFw_Comp.a`. This library is added as an output of the CMake system. This library is built from `SOURCE_FILES`, which are split into inputs to the -autocoder (*.xml and *.txt) and normal source files. Specific dependencies can be supplied using +autocoder (*.fpp and/or *.txt) and normal source files. Specific dependencies can be supplied using the `MOD_DEPS` variable, but is only required when the dependencies are not detected via a recursive -search of all *.xml includes in the autocoder files. The autocoder generation steps are registered +search of all *.fpp includes in the autocoder files. The autocoder generation steps are registered for each of the autocoder input files. These autocoder input files are also used to detect all dependencies of the given module. The normal source files are supplied to the build directory. diff --git a/cmake/required.cmake b/cmake/required.cmake index abe7d10f6f..bb62e8b080 100644 --- a/cmake/required.cmake +++ b/cmake/required.cmake @@ -33,7 +33,6 @@ endif() message(STATUS "[python3] python3 found at: ${PYTHON}") message(STATUS "[fpp-tools] fpp-depend found at: ${FPP_DEPEND}") -message(STATUS "[fpp-tools] fpp-to-xml found at: ${FPP_TO_XML}") message(STATUS "[fpp-tools] fpp-to-cpp found at: ${FPP_TO_CPP}") message(STATUS "[fpp-tools] fpp-to-dict found at: ${FPP_TO_DICT}") message(STATUS "[fpp-tools] fpp-locate-defs found at: ${FPP_LOCATE_DEFS}") diff --git a/cmake/target/target.cmake b/cmake/target/target.cmake index d038c47a7b..5fef21a725 100644 --- a/cmake/target/target.cmake +++ b/cmake/target/target.cmake @@ -3,33 +3,8 @@ # # Functions supporting the F prime target additions. These targets allow building against modules # and top-level targets. This allows for multi-part builds like `sloc` or `dict` where some part -# applies to the module and is rolled up into some global command. Target files must define two -# functions `add_module_target` and `add_global_target`. +# applies to the module and is rolled up into some global command. # -# ### `add_global_target` Specification: -# -# Adds a global target for the custom target. This handles the top-level target for the build. -# Think `make dict`. It is the global root for all of the children module defines. This should call -# CMake's `add_custom_target("${TARGET_NAME}" ...)` at some point in the function. Also pass the -# `ALL` argument if it should be built as part of a standard build i.e. `make`. -# -# **Arguments passed in:** -# - **TARGET_NAME:** target name to be added. **Must** be passed to a call to `add_custom_target` -# -# ### `add_module_target` Specification: -# -# Adds a module-by-module target for this given target. Any subtargets for each module and their -# commands should be registered via CMake's `add_custom_target("${TARGET_NAME}" ...)`. This command -# is supplied with all of the modules knowledge. Add a `DEPENDS` call on AC_OUTPUTS to come after -# the autocoding step. -# -# **Arguments passed in:** -# - **MODULE_NAME:** name of the module being built. -# - **TARGET_NAME:** target name to be added. **Must** be passed to a call to `add_custom_target` -# - **AC_INPUTS:** list of autocoder inputs. These are Ai.xml files -# - **SOURCE_FILES:** list of source file inputs. These are handwritten *.cpp and *.hpp. -# - **AC_OUTPUTS:** list of autocoder outputs. These are Ac.cpp and Ac.hpp files. -# - **MOD_DEPS:** list of specified dependencies of target. Use: fprime_ai_info for Ai.xml info #### include_guard() diff --git a/docs/how-to/develop-subtopologies.md b/docs/how-to/develop-subtopologies.md index 6533d15d72..9e9c74f548 100644 --- a/docs/how-to/develop-subtopologies.md +++ b/docs/how-to/develop-subtopologies.md @@ -296,11 +296,7 @@ void teardownTopology(const TopologyState& state){ ``` -Lastly, since our RNG component has some telemetry, we need to include (or ignore) these channels within the `Packets.xml` file in this folder. As with any other component that is added to a deployment, you use the same syntax with the name of the instance followed by the name of the telemetry channel. For example: - -```xml - -``` +Lastly, since our RNG component has some telemetry, we need to include (or ignore) these channels within the `Packets.fppi` file in this folder. As with any other component that is added to a deployment, you use the same syntax with the name of the instance followed by the name of the telemetry channel. Now go ahead and run and build your deployment, and you should see that you have a built deployment that uses a subtopology. diff --git a/docs/user-manual/framework/assert.md b/docs/user-manual/framework/assert.md index 80486bf6c9..2ab19ca258 100644 --- a/docs/user-manual/framework/assert.md +++ b/docs/user-manual/framework/assert.md @@ -32,7 +32,7 @@ arguments can consist of any basic types shown below. - bool C++ Boolean type -These types are used in XML specifications. Note that not all types are +These types are used in FPP specifications. Note that not all types are available on all processor architectures. The types that are available is a configurable feature of the architecture and is typically set by compiler arguments. diff --git a/docs/user-manual/gds/gds-cli.md b/docs/user-manual/gds/gds-cli.md index 376a7aea0a..d5b7083d26 100644 --- a/docs/user-manual/gds/gds-cli.md +++ b/docs/user-manual/gds/gds-cli.md @@ -153,12 +153,11 @@ Retrieval Options: As mentioned, these CLI commands let you interact with the GDS through events and commands, and telemetry channels. Through a *project F´ dictionary* the CLI can understand what commands, events and telemetry channels are available. -Every F´ project deployment will have a `*Dictionary.xml` file that's created when the project's deployment is built -In the `Ref` example project, it'll be the `Ref/Top/RefTopologyAppDictionary.xml` file. By reading this file, the CLI -tool knows what to look for when it's reading or sending data to the GDS. If it doesn't know where the dictionary is, -then the CLI tool can't do much beyond printing out help messages. +Every F´ project deployment will have a `*Dictionary.json` file that's created when the project's deployment is built +By reading this file, the CLI tool knows what to look for when it's reading or sending data to the GDS. If it doesn't +know where the dictionary is, then the CLI tool can't do much beyond printing out help messages. -When you run one of the CLI commands, the tool will automatically look for files ending in `Dictionary.xml` in your +When you run one of the CLI commands, the tool will automatically look for files ending in `Dictionary.json` in your current working directory and use the first one it can find. This behavior is similar to how `fprime-gds` searches for dictionaries it uses to construct the browser GUI. If it can't find any dictionaries, it will print out an error message like this: @@ -169,7 +168,8 @@ fprime-cli: error: No valid project dictionary found Running commands from your project folder (e.g. inside `fprime/Ref`) should work to find a dictionary, but if you want to run commands for a different deployment or project, you can specify the dictionary file exactly using the -`--dictionary` option with the file's path. `fprime-cli command-send --dictionary Ref/Top/RefTopologyAppDictionary.xml`. +`--dictionary` option with the file's path. +`fprime-cli command-send --dictionary build-artifacts/Linux/Ref/Top/RefTopologyDictionary.json`. ### Using the Tools diff --git a/docs/user-manual/gds/seqgen.md b/docs/user-manual/gds/seqgen.md index 33a2605361..4ffe7620ad 100644 --- a/docs/user-manual/gds/seqgen.md +++ b/docs/user-manual/gds/seqgen.md @@ -38,7 +38,7 @@ Below is an example of how to run the sample example sequence with the Ref dicti dictionary will not be generated. ``` -fprime-seqgen fprime/Gds/examples/simple_sequence.seq -d fprime/Ref/build-artifacts/*/dict/RefTopologyAppDictionary.xml +fprime-seqgen fprime/Gds/examples/simple_sequence.seq -d fprime/build-artifacts/*/Ref/dict/RefTopologyDictionary.json ``` Here the output file is not specified, so it will be a new file in the same directory as the sequence but ending with diff --git a/docs/user-manual/overview/development-practice.md b/docs/user-manual/overview/development-practice.md index 21691294e3..d0c4d35670 100644 --- a/docs/user-manual/overview/development-practice.md +++ b/docs/user-manual/overview/development-practice.md @@ -96,8 +96,8 @@ It's recommended that ports are kept in their own directories, separate from com To create a new port: 1. If necessary, create a new port directory -2. Create a new port `*Ai.xml` file, possibly by copying from an existing port. -3. Add the new port xml file to `SOURCE_FILES` in the `CMakeLists.txt` file in the directory +2. Create a new port `*.fpp` file, possibly by copying from an existing port. +3. Add the new port file to `SOURCE_FILES` in the `CMakeLists.txt` file in the directory 4. If necessary, add the port directory to the deployment's cmake file with `add_fprime_subdirectory`. Alternatively, you may use `fprime-util new --port` from the fprime-tools package. This will @@ -105,7 +105,7 @@ walk the user through a few prompts about the port they want to create. Then the will be done automatically: 1. If the specified directory for the port does not exist, it will be created -2. The `*Ai.xml` file will be generated, with information and arguments filled in +2. The `*.fpp` file will be generated, with information and arguments filled in 3. The port will be added to the source files of `CMakeLists.txt`. If there is no `CMakeLists.txt` file, one will be automatically generated and filled out 4. If necessary, the port directory will be added to the deployment's cmake file with @@ -113,18 +113,18 @@ will be done automatically: ### Creating a Component Definition -The first step in creating a component is to create the component xml definition, which defines +The first step in creating a component is to create the component FPP definition, which defines which interfaces it implements, what commands it supports, which telemetry it provides, and what events it produces. This can be done by hand or by using `fprime-util new --component`. To create a new component definition by hand: 1. Create a new component directory -2. Create a new component `*Ai.xml` file, possibly by copying from an existing component. -3. Optional, create a commands xml file for GDS commands and include it in the component xml file. -4. Optional, create an events xml file and include it in the component xml file. -5. Optional, create a telemetry xml for telemetry channels and include it in the component xml file. -6. Create a component `CMakeLists.txt` test file and add the component xml file to `SOURCE_FILES` +2. Create a new component `*.fpp` file, possibly by copying from an existing component. +3. Optional, create a commands `.fppi` file for GDS commands and include it in the component file. +4. Optional, create an events `.fppi` file and include it in the component file. +5. Optional, create a telemetry `.fppi` for telemetry channels and include it in the component file. +6. Create a component `CMakeLists.txt` test file and add the component file to `SOURCE_FILES` variable in the file. 7. Add component directory to the deployment's cmake file with `add_fprime_subdirectory`. @@ -133,10 +133,10 @@ walk the user through a few prompts about the component they are creating. Then will be done automatically: 1. A new component directory will be created -2. The `*Ai.xml` file will be generated and filled out with all of the information provided by the user -3. Commands, telemetry, events, and parameters will be added to the xml file based on what the user chooses through the prompts -4. Ports necessary for commands, telemetry, events, and parameters will be automatically added to the `*Ai.xml` file depending which elements the user chooses to include -5. A component `CMakeLists.txt` file will be generated and the component xml will be added +2. The `*.fpp` file will be generated and filled out with all of the information provided by the user +3. Commands, telemetry, events, and parameters will be added to the file based on what the user chooses through the prompts +4. Ports necessary for commands, telemetry, events, and parameters will be automatically added to the `*.fpp` file depending which elements the user chooses to include +5. A component `CMakeLists.txt` file will be generated and the component will be added to the source files. 6. The component directory will be added to the deployments cmake file with `add_fprime-subdirectory` @@ -187,15 +187,11 @@ the project. The full deployment should be built at this stage to ensure that th To add a component to the topology: -1. In the topology `*Ai.xml` file - - Import the component `*Ai.xml` xml file. +1. In the topology `*.fpp` file - Instantiate the component as many times as necessary. - Connect component output ports with the corresponding input port and vice versa. -2. In the topology `Components.hpp` file, declare the component with the same name as the topology - xml file. -3. In the topology `Topology.cpp` file: +2. In the topology `Topology.cpp` file: - Instantiate the component. - - Call the component's `init` function. - If additional setup is required, call a user-defined setup function. - If using commands, register the component's commands. - If using health checking, add the component to ping entries. diff --git a/docs/user-manual/overview/source-tree.md b/docs/user-manual/overview/source-tree.md index 3cf22f090c..ab6e353a41 100644 --- a/docs/user-manual/overview/source-tree.md +++ b/docs/user-manual/overview/source-tree.md @@ -42,20 +42,6 @@ and port numbers to be changed without modifying the component FPP itself. The Types directory contains basic types and other base classes used in the architecture, as shown in Table 2. -**Table 2.** Types directory -files. - -| File | Description | -| --------------------------------- | --------------------------------------------------------------------------------------------------- | -| BasicTypes.hpp | Defines portable built-in data types and common macros | -| Assert.hpp(.cpp) | Defines macros to declare an assertion in C++ code | -| CAssert.hpp | Defines macros to declare an assertion in C code | -| StringType.hpp(.cpp) | Declares a string base class | -| Serializable.hpp(.cpp) | Declares the serializable base classes and helper functions | -| PolyType.hpp(.cpp) | Describes a serializable polymorphic type class that can be used to uniformly store different types | -| String.hpp(.cpp) | A fixed length string available for general usage if the developer does not wish to write one | -| InternalInterfaceString.hpp(.cpp) | A string class used by internal interfaces when a string argument is specified | - ### Obj The Obj directory contains class declarations and implementations for @@ -69,27 +55,11 @@ representation of each object. Components and ports use the object class as a base class. Table 3 lists the files and their descriptions. -**Table 3.** Obj directory files. - -| File | Description | -| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | -| ObjBase.hpp(.cpp) | Declaration for object base class | -| SimpleObjRegistry.hpp(.cpp) | An implementation of a simple object registry: This registry simply stores created object pointers in an array and calls their toString() method when asked. | - ### Port The Port directory contains the base classes for ports. Table 4 lists the files and their descriptions. -**Table 4.** Port directory files. - -| File | Description | -| ----------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| PortBase.hpp(.cpp) | Port base class; contains methods and attributes common to all ports | -| InputPort.hpp(.cpp) | Input port base class that is derived from port base class; contains methods and attributes common to all input ports | -| OutputPort.hpp(.cpp) | Output port base class that is derived from port base class; contains methods and attributes common to all output ports | -| InputSerializePort.hpp(.cpp) | Input serialize port class: Typed output ports can be connected to input serialize ports. The typed output port will serialize its arguments prior to invoking the port. | -| OutputSerializePort.hpp(.cpp) | Output serialize port class: Output serialize ports can be connected to typed input port. The serialize port passes the typed port a buffer representing the serialized arguments, which the typed port deserializes. | ### Comp @@ -98,42 +68,24 @@ of components. These classes act as base classes for components created by the code generation and are not directly used by developers. Table 5 lists the files and their descriptions. -**Table 5.** Comp directory files. - -| File | Description | -| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| PassiveComponentBase.hpp(.cpp) | The base class for unthreaded passive components: These components have no thread of execution associated with them. This class derives from the object base class. | -| QueuedComponentBase.hpp(.cpp) | The base class for queued components: These components have a message queue but no thread. It is derived from the passive component base class. | -| ActiveComponentBase.hpp(.cpp) | The base class for active components: Active components have a thread of execution as well as a message queue. It is derived from the queued component class. | ### Cmd -This Cmd directory contains XML and class declarations used to generate -code for command interfaces to components. The XML generates port +This Cmd directory contains FPP and class declarations used to generate +code for command interfaces to components. The FPP generates port classes in the normal way via the code generator. The code generator then uses those generated classes as special command input ports for -components that define commands in their component XML. Since the ports +components that define commands in their component FPP. Since the ports themselves are generated in the same way as any other port, they can be used by developers in other components that process commands, such as command dispatchers. Table 6 lists the files and their descriptions. -**Table 6.** Cmd directory files. - -| File | Description | -| ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| CmdPortAi.xml | XML description of a command port | -| CmdResponsePortAi.xml | XML description of a command response port | -| CmdRegPortAi.xml | XML description of a command registration port | -| CmdArgBuffer.hpp(.cpp) | A class used by the command port that is a data buffer containing the serialized form of the command arguments | -| CmdString.hpp(.cpp) | A string class used by the command code generator for string arguments | -| CmdPacket.hpp(.cpp) | A class representing an encoded command packet that contains a command opcode and arguments: The code generator does not depend on this class, so it can be modified or not used. | - ### Tlm -This Tlm directory contains XML and class declarations used to generate +This Tlm directory contains FPP and class declarations used to generate code for channelized telemetry interfaces for components. Channelized telemetry has historically been a snapshot in time of a set of data. Every value of that data is not necessarily stored permanently, but is -sampled. The XML generates port classes in the normal way via the code +sampled. The FPP generates port classes in the normal way via the code generator. The code generator then uses those generated classes as special telemetry output ports for components needing telemetry. Since the ports themselves are generated in the same way as any other port, @@ -141,63 +93,36 @@ they can be used by developers in other components that process telemetry, such as a telemetry buffer for downlinking telemetry. Table 7 lists the files and their descriptions. -**Table 7.** Tlm directory files. - -| File | Description | -| ------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| TlmPortAi.xml | XML description of a telemetry port | -| TlmBuffer.hpp(.cpp) | A data buffer class that represents the serialized form of the telemetry channel | -| TlmString.hpp(.cpp) | A string class used by the telemetry code generator when a string is the telemetry channel | -| TlmPacket.hpp(.cpp) | A notional class representing an encoded telemetry packet that contains a telemetry channel identifier and serialized value: The code generator does not depend on this class, so it can be modified or not used. | ### Log -This Log directory contains XML and class declarations used to generate +This Log directory contains FPP and class declarations used to generate code logging (event) interfaces for components. Developer implementation code sends log events to capture all the events of interest in a system as they happen. Other components serve to store events for forwarding to -a ground interface or test software. An XML definition for telemetry +a ground interface or test software. An FPP definition for telemetry ports is defined, which the code generator then uses as special logging output ports for components. Since the ports themselves are generated in the same way as any other port, they can be used by developers in other components that process logging, such as a logging history. Table 8 lists the files and their descriptions. -**Table 8.** Log directory files. - -| File | Description | -| ----------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| LogPortAi.xml | XML description of a logging port | -| LogTextPortAi.xml | XML description of an optional text logging port: This port generates a string representing the logged event. The code generator generates code to use both kinds of logging ports, but the text log can be disabled. | -| LogBuffer.hpp(.cpp) | A data buffer class that represents the serialized form of the log entry | -| LogString.hpp(.cpp) | A string class used by the log code generator when a string is the telemetry channel | -| TextLogString.hpp(.cpp) | A string class used by the text log interface to pass strings | -| LogPacket.hpp(.cpp) | A notional class representing an encoded log packet that contains a log entry identifier and serialized set of values: The code generator does not depend on this class, so it can be modified or not used. | ### Prm -This Prm directory contains XML and class declarations used to generate +This Prm directory contains FPP and class declarations used to generate parameter interfaces for components. Parameters are values are meant to be stored in nonvolatile storage that affect various properties of the software. Parameters are loaded at run time and given to components on -request. An XML definition for a parameter port is used by the code +request. An FPP definition for a parameter port is used by the code generator to create special parameter output ports for components. Since the ports themselves are generated in the same way as any other port, they can be used by developers in other components that provide parameters. Table 9 lists the files and their descriptions. -**Table 9.** Prm directory files. - -| File | Description | -| ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| PrmPortAi.xml | XML description of a parameter port | -| PrmBuffer.hpp(.cpp) | A data buffer that represents a serialized parameter | -| PrmString.hpp(.cpp) | A string class used by the parameter code generator when a string is the parameter value | -| PrmPacket.hpp(.cpp) | A notional class representing an encoded parameter packet that contains a parameter identifier and serialized value: The code generator does not depend on this class, so it can be modified or not used. | - ### Time -This Time directory contains XML and class declarations used to generate +This Time directory contains FPP and class declarations used to generate time interfaces for components. The time interface port is created by the code generator as a source of time for time-tagging telemetry samples and log events. Since the ports themselves are generated in the @@ -205,13 +130,6 @@ same way as any other port, they can be used by developers in other components that provide time from whatever sources are present in the system. Table 10 lists the files and their descriptions. -**Table 10.** Time directory files. - -| File | Description | -| -------------- | ---------------------------------------------------------------------------------- | -| TimePortAi.xml | XML description of a time port | -| Time.hpp | A class containing a time value that represents the time when the port was invoked | - ### Com @@ -220,13 +138,7 @@ port could be used as an interface to components that send and receive data to ground or test software. Table 11 lists the files and their descriptions. -**Table 11.** Com directory files. -| File | Description | -| ------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -| ComPortAi.xml | XML description of a communication port | -| ComBuffer.hpp(.cpp) | A data buffer class used to represent a packet of serialized communication data | -| ComPacket.hpp(.cpp) | A data packet class representing data from one of the telemetry or command types: The specific packet types are derived classes. | ## Svc @@ -238,7 +150,7 @@ ports, and other types are examples of how the architecture can be applied. The component example implementations are very simple; flight versions would most likely be more sophisticated. The way development is done is that the developer will define the components and their -properties in XML. The code generator will generate C++ classes that +properties in FPP. The code generator will generate C++ classes that encapsulate the features of the component. The developer will then write a class that derives from those generated classes and implement the port methods. For these directories, each file will not be described, but a @@ -247,7 +159,7 @@ instead. The descriptions are as follows. ### ActiveLogger -This directory contains a component XML description and implementation +This directory contains a component FPP description and implementation for an active component that accepts serialized log events. The input port accepting log entries puts them in a message queue for the component thread. The component thread calls the port handler in the @@ -307,7 +219,7 @@ component when it receives a FATAL event from a component. ### GndIf -The directory contains just the XML definition of a component that could +The directory contains just the FPP definition of a component that could be used to send and receive communications packets. The uplink port would be connected to the command dispatcher for executing commands, and the downlink port would be connected by components collecting downlink @@ -414,7 +326,7 @@ connected to telemetry sources and the command dispatcher. ### Time -This directory contains the XML definition for the time source base +This directory contains the FPP definition for the time source base class. A time source is necessary for time-tagging the telemetry and log events in components. Various implementations that derive from this base class will provide time.