From 7d152a9d82d85d84395be5d0d8c44eb83326047b Mon Sep 17 00:00:00 2001 From: sunsets <845944018@qq.com> Date: Mon, 27 Nov 2023 11:29:19 +0800 Subject: [PATCH] Device_Machine_List --- resources/icons/X-MAX 3_thumbnail.png | Bin 0 -> 44420 bytes resources/icons/X-Plus 3_thumbnail.png | Bin 0 -> 39002 bytes resources/icons/X-smart 3_thumbnail.png | Bin 0 -> 32519 bytes resources/icons/arrow-left-s-line.svg | 6 + resources/icons/arrow-right-s-line.svg | 6 + resources/icons/printer_state.svg | 11 + resources/icons/refresh-line.svg | 8 + src/slic3r/GUI/MainFrame.cpp | 120 +++++++- src/slic3r/GUI/MainFrame.hpp | 7 + src/slic3r/GUI/PrinterWebView.cpp | 360 ++++++++++++++++++++++-- src/slic3r/GUI/PrinterWebView.hpp | 190 +++++++++++++ src/slic3r/Utils/AstroBox.hpp | 5 + src/slic3r/Utils/Duet.hpp | 4 + src/slic3r/Utils/FlashAir.hpp | 5 + src/slic3r/Utils/MKS.hpp | 5 + src/slic3r/Utils/Moonraker.cpp | 123 ++++++++ src/slic3r/Utils/Moonraker.hpp | 5 + src/slic3r/Utils/OctoPrint.hpp | 4 + src/slic3r/Utils/PrintHost.hpp | 3 + src/slic3r/Utils/Repetier.hpp | 3 + 20 files changed, 845 insertions(+), 20 deletions(-) create mode 100644 resources/icons/X-MAX 3_thumbnail.png create mode 100644 resources/icons/X-Plus 3_thumbnail.png create mode 100644 resources/icons/X-smart 3_thumbnail.png create mode 100644 resources/icons/arrow-left-s-line.svg create mode 100644 resources/icons/arrow-right-s-line.svg create mode 100644 resources/icons/printer_state.svg create mode 100644 resources/icons/refresh-line.svg diff --git a/resources/icons/X-MAX 3_thumbnail.png b/resources/icons/X-MAX 3_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..071cfdf091e3e1d3bade756fd940ce2a569565d0 GIT binary patch literal 44420 zcmbSS<8vlHwBFk8*52CQx?9_}-M6-FevD{p=0<o>iM(&X zhs{$_(ZNao2;;Az!X|`}hgfgdJ8f@uiw$Of_sDES#H3|FxwLeYg6G~Xdf$@SZM-vW z_vq_#F%n?MA&i9X_dD*kI{ZJUr2>^FP=1G-J(K>v+Y+paL9vXw)1j%OzY+52N%-mCTkg7HpOk=l@Tig^b zcM%uyq8NF;;pDAbEzVl2De2@$_?jWdj-&Hb;hi07$r5!UzZ-lwk7CJixqN0R>QxnP zRu-&V=darpZrbH5>4^h8iT=I8t7A{?MdACytv?ZqdOH5BGXEKSN2dMAx?QwcR-{%_ zsIDbyW`);4l{-A)zx%uHI4Y}_)f+v>4P)_+%zA>&l4IPG!^U#C!g6W6j8Vbl>4B~F zmar$5KW#hYwS0gNDBcxwx5u4wJYCT4gZy~Mr!9wPK-iRud(nQ8N{wXi{&!*?Y8vp9 z=Tg0U-R?jqR(cD-akpvL06Wd_LlRtn>A6#2;tm05mWm$f(kDe8^-%BAF>||N+@;Q- zrmk@p>-DqT#mmpZ;b3%U6qp>^cU!dDf8%3iI+F2qt7kFyI#)j4zk1cXVuu+<$z1P@ z9<9>A_0&~kJdtaYa84{@WQeFD=$C!$Wq1yjBJS4fu9y8fD?*KIFHvm|+4iNR-%<1Z z&pyANFIMlr8`b56-xNvM58OQ%#awn0?03{0ob!7=Z~xN38(OKJU~WE#ubdX&Z9Y}0}J8O$}m&ExWFWUnM@3)}~9^w*8l%af%x5z<-cxJ}jP*ixpB@eIY7 zQN0u$UX=2f@+`Jn7n10^z7VvpHf0xw3g7*!^A=rx2ZVHla($%I}ep07pB5^)~ zBFBJhC6W^GXH1;TKF43>Ok;|bH@gQ7K#=g+oe>L+tvx)r%pYB-6Sv| zld6pN15Q^z?Aw9g=yCq5hiLR6P_)4V}8eU{#rhJ)jf=F z`YqFUU4_T4?|dyP_4JqkO)&(&+4>6s-rW@GA=yGbfn-|-LRVX=%avw`iTVULf|XUw zY*BFF<&WA|XFUII&Apzx#23NbYc@8FS?}BlZM^OZ+`ebIy@#gyQkyxUXNITL1WB$k zN_5NSHA@Idi~3PBHiwSQS@{a?c6M)ggyXo|uFfk$Ny>&x+wDKx8Dn{p76{=DpQak#5y;xxpCm>$@lYsD~%GHe?!0%N64R zjG)(Pr$0Q0dZ6?!jVTaIuntr^?IxY&044--Bmdq?-s;@7g$SyDVJ31a8=M zNX~W4S7PzEELwmKnJ8@NpETofZ@W7Kug#6Lv?j!->azKy?AGhhk=gXYUsW@gH|qIT zq{1_1-QekGNh6gcoe{cI%1&jKFzWmw!-HY4hVPu;(k9Yw`HbD(Cim#j3+N~f3)7aB z5c9u;`!`Qs2UUw5onFb%$H;Axy@~>zK;!;w8Hi4=;D$eU+K2>;2yDh(yLR2o99uit zePfsH>VQs?!Q5^PiBnUi_n`8s;jAXxuN6bz}lL@?@Dvmu4Y6s^#B^ zREc|!AH=UOG`NFFNwdO~ff7B`BSUu zr!lQ3=0EL9H;-L)e5==SU&AnY3}LX>bvq-Q8*OTsiZn@vbdi2Vp}u|o zdU^h)Em_tCS&mel_`RlyR9qA3LX}vjs0`{o%4U=S=2O#1<4@VJ}IT&IQ(t%=9SiXcKp>#gez;J`nG*zH4Xi9D7|TJ>k` zkEF+tZg_qkEz$u_5dF0V$1u7Gutt<>lwLq6Hk2`;@l}c!AMff z-u(gOv`L>dd7?aM@P&^QwwThT)2_5;-ujW_e94NbUpS=mr~H7RZE9^tCEq>jW?DpQnfi_9E(pFsr+KWUqkzt${00Mb^XcBe10mt zbG+Q2enSV7w630uj-Zgl^6c-?d&;lR*GPh`8EBx)l? zx!3UGAJs<>QGyXnXUv%qz6&%}e#GTQ3XwzaWqbR*ir2jVpo=hMYHO0fkTO*;TUnr8 zWqh3bd2)U}vdTuKq@^cRv?a`$EJT?_%0_M9i3sSiyTHR z{Ps#8!l!^Ryte_N4Y3G>m zd(>n&l-$%D^X+`JW2O704JvpB;Au}YdkQp7mJ}{_=9`|YolM@ML`|e+_yOAWdDXY( z{R-7$emn7)&JI(Br=^l8`^@d2X7&6u*o~ zmYn{5ULldWc(@;_`X))1p+9vXb7^bz<8_Xjc7pAO|Ji^!I3eUQlUHy1ZMv!CnbWP^ z1Mt#}Igak637zw%JdQ54+Wi{(1!jZ(mRH&Xd?6TTRu4g_LX%v>D552*+rb%7#p_G% zX@FFslafLFRU-pgb@N-7nDM(~LcEGfw9T!7mJ1ta;Z7e2!d3PJLGB||NzP?N{M+@62T4*9o#;=*eatkE~$Fp+sBA#LGl1oo(n z^cg%r{e)6qRo~toa(70{bIFN?b;K;#5@2iqwr`@7fjdD*m!6R$PMaZ|*(gUDu1Y(` z0udA_Jh9e^rIqnJY2ixoSZ)3z4MtMD;ru^+$Ch$#M@HjVg>&(5SwD34C@CH;m^Lr5 zaJZQc7Yg=$SsP3`*j-1h7o`|lFI++6#^mdfY!BK_{hTc>Q^z1bx;^7Q;UAroDu zKAxVJBh;W|Vy{6a)-0WQJno1tX~uf7C11Zu-PoM#Z_qDgW`j0BRWC{I4A#Z$@?i1DOE6 z*832v%Ep7~g8b#>u%7$Uxw-2&>pX+Qn}f_o%>rWuZXi%( ztex%_Yj$eEi5+Js-&7w}K40oEcBmmKb-^|uyau2zw&fMIP3nIjg%k~64j{?-RXx~a zweZ*WIOPpyMbqBh_hXm%lV$7s{Q5A@e!C4pf&bOl?+E4V$-V&0(5*Qr^^k&SeX@;> z%k>OX9SC%=J7bq8;Eg&2K{e{gg*oYIFhjIWtKbHOS(!F)heghS&ua8@visqI7>pW{ zWt{}TW)-LKFr81`cHGv>G&Cy5?=GfZ*_bXK+5zPAp5!#B7vy*uy4%8JiTbi;2ot4w z?@PCLA7e!sdo%Zus&;>81mAwO%vZy(zp)vklHF8Wd`h>iy|%7DCP9{ zc)$ppHe9Jw5p4|w$X~O%tfFeU ztRsQTZcqfGFL<))alu|)<0d~@vICS>AFWqU8nvlws`EEb_xP{h1I&?m^u0bS9Hy7M zW9<1IP`=)-zu|hG@O#G3IaoR4BFCh3-4@M!H1=NQu`L(q%2G7y>UH~8=c(#inZs8z zoVi^0aDdp@D^kqAe+R#|Y0bfd!&6{%>YHAZE5q$J$(DEmI2vArN#Nv|PG_Whu5oa?)NDF|KR-M z{cT~D5h?&y3ro9ds=_*UO3))a&Fp;W>98N&h;!_uLaoX1YHYivlCem;d~YurrLd-l zI71bFRTeA57VGo#^MlM*MmA9vghPDn%zc0Wh3qst0nB9r8zX1a!ouLT!X+D4uZT2n z7+dMmuPKuHwqu`l>p1aXT)U)X6D^$=t62QG7Wus?)G@zn0|$++9jIHVVliD$iAzX$ z=!ja7$LE<8>A2nu(A3i#I-M_l<(AUNX2Xq%i)8^r6Y&ga_UxbBtx!I1*8dG+^ z>t*H;hd8hI>EY$t@A2Gwv}!pzSRnhFw=mCF(Hbj5XT84r>f*4A7%W!38TQx5$> zKR{F9n{@XI_r=QYrfDK%rE36dwG1d!&lvenN9anB{g0ynFx9@x6u&#~nMT|UZdXC& z1N|j@2GCMw?>HUWz%*Sg%@4ZmhB-(^deyH_4AIn=*Fv;CdovtO|JnWL{DJ0|NiIo2vg@i;md1Fx0*+xa(VAM z`6XmB_d+z{K^+4|C0skJ-5y<5jBb7P#623e6&2}RnaZ4nhDWE%px$H+#d77U?QNI- z=UYqddDkI0E=*aoudJ->-VP{j|5k!{uz!Qy?(2c-rr`U5idqA`fV!vN`2>W!8IU;M zrbvzDxVo|^*>wOi&e1Dyg#%R5*BJWQgoAp#y22yjY^9o| z^c^_d+TZa(@sW@SOT|9+y!~QT7evI>&12}1^q?gY0|N6C&%5wvJ+{aG7QqIt$G{e# zxZB6o&0zOHN^lF&h4uhRMt4;uRFY+Px5|lbeS1B8p!vY85i7lwlC3$i1g~Tyoy{Z9 z*5i~rt1~?l15|(*0oVp-r5k>neNi%Fe+w`)JRBmszeFiBI6?tr@$qW#0j2M@>B^V8 z-t!{%k%i(Dz_BhN@TQc_<%XE|wNRR_we={|6EYMErRy^WYJEGaxE;s0>rG6iavUoV zNndG>ZPH;(n@2PpVh-n#q(+R5F*2RNS|UtkooBoP^*(Q7MGY(W^NXw8K zEz#1~9n6@gs^t=le|^=;7Vrc|aAu?T(a@lE=;(**6{b!!g@G1wFs3xCIL)t=a8B>< z1@c>}18+~N{O_K=ZgZHtR@c8a?SaE?+d^8nUFoJs!CbFO`I~>%^1Kl?Q@}l&udO_O zT|nV)%Imaa5DsyGJ9`s3tbFeN39c@ofpEKn$j*c1g9 zEq;fPg~)2#eEx^5+sU&FQ&8bPMsn-vKYNS5qenB5;~AfeO@FldS8$mV5Qy97Y@c`_ z{QH54I~Jz9bi}qVAc0jAPgJ5HQl$%1`UZBYdA%$-m@)_uQ8s2yqOg8)!j*(w>gc;i zxm)bmQJE7NNWJ5EwV_2nHO+Fbh?>%fW`#c|a4>Ag5n7RTsWOs?CpnmsGzK0<^)_3{ zblLr!-17?J*XVf_yzKrc*{;L5rD3tbDHeDp_*|X)&E)`~%{dxUGA|I;GF~DDghH$Tk6?QMKQd$)EeG_0w(R z>yW8I^eb=s)9zxW4P#p19#MgvoA3k&hhR_a7j(yUAdJJui(^b|{Jp!0iHXNo+wsg1 zAB~OgQ9_86+j8@mUZqswq>!jc-h4EuwGU^FD~*WOi-|Cj6jofjlus~Pqw@=Zv)v3q z$5v{jRYdyDw^(z*@4yl@M5e9|Wa&1;C;D9ae0dT<*{4|63(v@~3d_v=fvByF>{F$c z5|?a(*e7JrChnUGMa!2FL!N2*8=qQcxlKUt3S_NOS5`g^Jnr36s|JdotUEOQJS|P@2&y7jj)-`*TguuU3r?rRRy?|HD2< zwPb&}ANm6ix*$?I-<3hJJ^kbGqJ>igpA~j^j`ZLPsgqVzm#Omxyt?NJM9+fB_JVG0 zB}WD!u_=!omllvVRk&_Rl699jod^@X;Dmq>UExFI89OW?Lw#_6!L6m8Em7V>T+@Bp zG?{=R_yEYxDJNlZ$CS{qTDT{=J1*Jfu(p(5RA{K)Nu}HUiS~8X<-O|t^wQGv&t&58 zj(+yo++x)kC~P=TwfBu4NHtyA_MYZHF|I1;=8Ppo zEO)zHkGB;V(f)&bC~blor*~&1h=;E9IutLM{$p@j%nF>*k&$p8SJxlN0uKc!yQfrngTLbW z!@7Nl-cbk)xlsAp3m}ywtH8oWh6hfWSvdj?31gFY60NdrVgc){w41=Xa*|o4o3v?e zc-5TOzwTYwyl%w3C_V4g1i={#Lic}^?&!zsX&6_#{j_s7XaL z!!w5JR_U5u*U2fV-0KpInDQHa$KdY!wm*IlweQy$G#u}w8t^y_Fnt^RAi5YM2@P}< z?yM;!7s-#6<%xAG>eKzZPuv~hA3Q>3$W7LFM?iKx3PiZ3=;dE?*8a;|7be zAhul7SF?-*&cUBQloWT1YXm%RN=6kk-|8Bwwv zzHtC*^&`H~gyy=nh1<`mVWa;gcPR5~lPwz>Q-j;_gR9%)yy_*irH62yjqSpz>+ooL zf1}O0^=zDORgrQak?Nn6;d5@+%Z-FUkiFkMQRlVB_5iw_hY!JjoRB<@kT|$q>xcG3K_H{Lsn!#K)4-; zZ}84p$;c>~wJJOsm$+Z#{CvS15ZH&-h(}n=W)%}_-$&Tuhqc_Zx2PMl$f`RA6ng2F z?`5w``{`vq#7stvYy@FYgqg~2ZE6NtK+FOIWbvXKB{#%dT-`G46Uq;~n+~X@`SWV3 zL)p9^_}(2j((_5p*mkBZd!TNg?)|m(4bxkYi>QpZ%^S98;$0>m1TEp`X#g^SDHQUe zAmCgws<7sEgf@%L<@d&-Qpo8)I3O2+*$&XMtz~)c(2k-?M30PhVc;Eeg?tp3J77a& zXHB+puZ{Cz~jsFMWg;rkP;Nj6Xq>MM3$2&DSd*#MuD7I=) zji?RZN@a?@`jhx=2gdR4#ZlMqFcpUof9T)<84(3(_oQzBWyt-DEcbnPeua}WZ2P@y zd*J%JkJ!-44vdMwGq7kxXJq8HP2Y21!c$*7JltikkW@L=A2zn*y;o>yjsYr}ywP}l z+F7YW-4(0RbA}ylK!qTxQz)YEU6i@uKLq>ueU?`Dycf*n{81b+C1I;%<~8pV9}DP< z)AM$Gc_k*zkS9r-*c+J^i0$ZcgV}oS=_VeDQ~l3FVF{yVg4)Vzc2{mjZVByj*2G*V4&i$xSH89d)hzUs$E)&fBxYlq-O@-aYTU zwlx>4ZG<#a*2jD@|CbBEbXUvejMwt<;u&KO@T(pn_D$*1Qsq{X20LvGUOJ1J2}A0Y zQfkx!Zkk8gbV?hp7X=q2DsfKfh#nL_G05O|MivinE7G>WC(`RnOH?naa|Z|F2pM@` z_%-RcV!laxOz`^0o(3bn1}J^P=DiS97PH7*twa*@zo$sHxT6!CeD+%iMlN^VGF*Tv zQYPxAaI08SQ#gMujWa$Y?xkg{2G$XU*=D=u&y@$G9QwwPD^(TH`{v|#k1T8i_MQb3yF~@tuiA!PLZu4qjNwE`Z~Th0<5+h{<`k*$>Ka3k?kQJ2pBs`H_Cc@W z6dlrSnSgV~w9g;4rA!`qSQT3-=NlfOx@~^q=CefE=SBGGVs3HJrQ2+>LRnAXQW0&r z41DFc0{ZYo=B&5W=QP&W2gRKmS$f2z-51uej~GiXUv4Ft<4+!@|FGf<=eKt&2`Et2 zcaS7Qs!@}8eSP0qO5=XPLyaC(BLPmQFnVoM@THNa;2TN=Tjdlnz9xNfw z&Z`tKvsb}E64vuo(qjDIVk1XCTp=Y5&5ZJvgH#y{Hi9C_tzYcz0B;-|JoC~~LW53R z;upa$1@nYliEKwZA|O*k`2ZNE!J1rdeUXpa$$t278Tew91bB`0gP+@tw?RAR0ZKXW zd$Js(^}U+uSL#&#@ztJ4nvtt#Mu^{NrS=3#sXSumC;q8k#+H1h z6K;7`T0!k2dd4GyUbOH4ad8S(+S!3hZL(EdgQ7LWG3TqEOW7kT)G z^70|*Pr%gn^t1IONv4kZH{IMs(QvC03szNyMv>}d{$H%rW%-7nIcntr%dmO8@kS9< z76ro@7$~PcSG95o-1jygqP*_~K|?olyijAfqJ13}R@Sink+=Y)YggPs$EOI(u4xP# zUV%q_;VSh&u`jEEa5=nCc0{xu`@gywrD|16A%yh+{AG&XT3*%6-^X@J8v|n#3l4ck z7(>w1a@l+`?D1x2sfz#;pL1$tU6&sNzkX%csL&tO+DzL`=4OdkY>E|$GagweJ<@Ys zQr6pct|1=u?Ka* zF!udI*_?PH-^@dFk>>l@`}ZBP{k`9__kbAs!lEiCM&h*%)>z1xv0jWT&Ad!?ChRaYO#@N&*3$&*ZE zsYViu8=pa*GgZ4VN6QicS+_o!HtX1=*_}=OcCm2UpxNdUTIZtSRhQ0UimAsUSs?iD zur1|teK}2-G*7H+w@A0#aqA}(flVwjkWLRVPS)7cmI~{*)N%Xw^@#5?e^hz77JU_` z;{X!VfA$lS$n#_!2X8BKpK8i+M@IBZERsg;iZoH=@?rj@`-a(KM!DV1|C>ZSNvai& zI8+!d{=eX5b=RA8Wo60g#AD`i4{|sP@o>l13-rf4)fbxJbG5v=DMgb${FI{+csVZkMq4!hWJPGq8$WV%0^L~l;X9hnYWl@@DJIT|! zIp!y1Bd(;~-_6#8ziEyRRTD_mAE+{wV1J~ql)^D4hCyitq2WXyCDbU*VxZ%f7c4%X zZGMk4@A&~F(+lN_r7e%geer37-GjH z)NHbr8^G^xj1duW@n%D>H~RlzrLaMH-flOsQl$+JdD^rE9^E`<`D_zHN{MWGx^6ic zHkBlkr1Y~fwTc>Yc97it{XLhjIlRuWI2Y7fnt(eYJ-K)9lM+QIK&xz7XQhrm{!1B* zt$}droa{X$e`(``RX&@i6o5UI3)&;g+L+*x1siyBg`K3Du zenl$mD12WFjx1kwMql4P=Y7E1d8{`5$5i@nPRcCv^UwYihKNjssAGWoNMjUaZ`za~ zve{WdiV0XUP7t9t9HU+G0{-&Tj@c2Aq4L)xlxsX~(NI~(HF;ZvWPnKYX1nb;;p)+5 z3)WOa2reRl8MwM`zVt_TqEL}Blh_iwYD^Tp8jX_mm|@0=G;8RG z`QDpfai91MSFmi@S0Jg+@$CEU;C_7J%I|!caQExgX?eWrr-%NS?%}SvZ9&W5s|*!< z@`c~%hZpx2#oeazSfzc=%#?lD8ecAI)qg1gZg#+3EC%ghxb88$(E7mhN4(O2%F1d7 zTJ}}$=^h90c)l-8WMbY>c^TEiNO0PC8>UfjO6#Wi(WCnhd@oG{^TTSO4c}5^RS}|= zsI-&@TM5<3s1-~Or;JmOjf4Wh$i)M@`h*z)zZ0bYgM@!b9m782vA)Yc4v(|)(wp4p z&hUMb8s7nYu6EgI;oG1uQq`ZSk_;G92>RowZ;Aw#Q=%pL-;Z36^ zDBJPjM6D8~8|fx7CCec=Ff(g&Eir~+QEyfj$xi#wvLyzY7XAA4ObfLlQ4TVCgL{8R z7E_^oUYn<#RZ!s#Cjb50n=#Ya8Mo073w`C@|9#FpI&%}Dz?CB7YpTwWR#+lRiY^DN z5+57liZdh{!hxPFytkUwP@l+dT>%bBA9(KdlU47dE(TwKocNbuF_EZBlxCv*B?P|B z@nglK`Sr+tSNyu`deKdrF2%QCv$|q${eu@0WOfNG6HiI5tdB^Y5BQpU*?MVT-i@NG zHU!5d!W-`Kd+w-fYz=wtI_~nA$l4C!|1Wr=x%GMFZnEB7g+qwDyE0ZFgR;9rfxS=X zz7@%P)f&93#(o)u9Ay;~6SLO~N;_>0mrQkVNrqNp+M2t84|BVH#rwI$M~j74=p3Ao z;)Vu!Y(-^Ni+sh%>9m=%O* z&oqw7qEADIlf>3n$F~wG!-cwOT3$Y`P#3X~t^1T4&WErR81v zLx1OteFxRJhLosASCo=MFTTq!;Z?g3kPfG+Ttvkap=s`c`3IzYNUu8{Ss>v6`un(A zG#_xuy;5&O$5Talbab3B@pIOW9aoxsW%xFPcfL6xpPVh#az!c8Gj(&l@8GGbY~d_D z&)`qcU3!^Y@#d08p2}G&!b*Y5RqZiD1$hv0jI;Qqs> zS4V8$mml!x&^i{OggW3gW7?PKQ}ss78I-Fe?M`-PUK*`o;LU&Rrlz4GLR6+oJJfIJ zXh%7BB+;i)J8a`HNls7}jb41GSl4?uX$~)>CmqpWTr=k%QPXG0?F&37BqAx`Hv zTogVL?!M@-j^Ok3%aDO5Q%T9xAUvcX8S_79;apt~Jf<6Etu+V=LAJ2UrUdMm&AH}u zt8@f=qEuWJqNSXc?a3gnG&weY#gE{-mcNTpCzKd(z9`V7c4T{8zuBmwd`VOp+YGFP z#H31#>WFuB&H@q>&hh}*kk(16s#WS30=^nc@T1pOU}GL7YjGfur`x6Sq?sjid?Z6~ z*%BTix7*c9RJpVB1qct1wyxymb{B*CcV?%<#@~ggmVYv^#4JVSGXzm07t zVL3i?spnEmnOCtB`k9E`&x071iPRcaW}X>T318@a7+@+u>c><(0s>KxwpkemC;Q-_ z!flK|o4(Q!3AA4IqQgH9ralS{{UO9OX4~Ih=1y+1ghhoF(7a;(;uW=WqYYyBLsHR+ zzcQZ(t7v@K1Sn$nTkCBX3&eyOj1|Y#TMuSZ3Ao5F&m7D^FAQy)W0&5?X?A@`HGT|f z2r%d#Rh9-tu!Y|VZiT1cXo!bUR1-}I>6FxSbD{rewvkA1VB6kCbxhvlaLN!n9hg~C&0kXT zpV)0bBu~xPD@!bnj%sb3c#k*K`J{r;Lu>q4yYou78xd<`Iv#=n#;(#swQiFB>oeu* zJLNxtiK#5qM+Di7#B~OATz{Z%J==f%&gS!D#d@L{o{s}xB$7m9@0X?P07|8xTLA%3 zr!=~I*5!USfdR}=2qK4xN*^z)r4HNt28SNG4(X(!e+&D(Z!5Hxw@3G#rqCx;l`+G9rvD+M+DV2 zC9qEqZ8Z8MoW{F#|BTo|&I`rB2JND=gkSU))ru#!(Sj3qQR0p@Z3CFv3Olh_hx&eR zgpZ%xBb9*)0xlwDL1+7>|?c2~|eSp?eh5FS;6V%ABH% zBWhvO{P&INzt)pt$p<~#biv#=-ncuz7zD!u1BI?c485c>oK%@-TD#1?7LP<{1{FZ8 z<+mQJn;}^+w0jLP=VBE#2YjYw4OG2r!P!i0#>4|Iw4|CjI(@M`~-Rfa~Dl`Y3>TgLUrO&#BwuIOg891J_EY2kS%aHYd+)*+KYmKUGQAT1l$4M%TVj^4*d- z7;YfKi>O?()>gHpJCH095@7u}EbB}ScaudFpPnmR2T=I?~3 zU*<=cu77{oH@CLN-7O807VXXjsXhHzbs+bcOqW^+C170QBVUyXodlvb;lEFIc+-6=E=&KLvbs%EH+^~Ebh!fHEMlurU4)l5!cYi_ ziGBIE_^B4LVl$vu`u%*e;YV^6cLbP}CPsGG^;HdP7o`ertmP7W8di z9{C@ujoO^(wPNcyOrL?%aq&f0< zbm&{WA=ji?2FW(dw*J9HnIis7zQwe->b90&uuNi**{KPx!jN^3DcIz#nt>VT&5Z;p~gB##MoIY(bDHOgY(`l-_&a}ti>I+%D~R4;Lx+_>K3hj~%>RpqcQg9W8v z{8|d-`qb!O?$-6BJPCidG{FVWo|Qq7=89JBJ1Fwro|x)985?RMfx}ML{_7jsk8EM|9-lTE{A$7Ez>h;g)-r9LBTN z#&eAJt3gOL+JOybi6tUdXz`jH@25gV`dS-3L)Qk0x(QHwyx<+f#}04&{y26Iq%+(6 z2S4bXfY%EWh2KHY0yn`u&cu2Q5`IYF;ini6GRHj0FxfSYmC7P>7SErfD5z8Z)GMFW zuZY~_Z0Zd^Nia4A*g|EiAEgRJLlDn?ImfZ{#S3g+!atDXrIx5Z2#DL*G%39Gyfi~Aiu=OO~F#Z?@JQQEx{PA|r!|C|U6 zjK`khjIPZgP5AumY(PzlpyiUuQ>!qm;-735`ukadeTrTdq}ScpkV5sJtuvLSuueO1 zo!OLzd?;w0nA-GaVQ1}+!*Z(sQ{q~t2{8*P^~L1#MC|w)UA=@0R&9H^CO9+w43dx0 z(+c0u%QEkfvyCOqZ%@XoG8)qdsM2i=GN(;AtWyXho|>YAzR;z8KXsWz@M168DXAu+ zUdd17Gtai{eW2!#r<~>iWdiW1sUhqoIUUa@^%sEH?q5NZV;6mXdG3}7P6h) z=_FH8;!|hI8nK2SLnX*rp~`p%r?AlAw~w(*xc%$XC#C&SLNv%ZAWq!Dk2C{0E0AsH>k zxK=g=FBe}76_GbiJf8!T{@2;EV<;6jvADQ|<9>w!2Iiz==ih(LS{0iIJ(vUNT9~;f zVIqf1-JuPo3j34u(+;+l`8|3565#0@w=P{WjNB0#U3aP3cLTQ^)sHy6&I;c@Py}z} z+|I3KjiCC0J6l6(`crT@cuLY0+s~Zrb5*^H%gGj@lzFyDcVp*J>g5!FWyL(jQlS&z zH}BLGN9Mep6QEh?hK0T8iti@*2*wD2fv=z}4tU;1B*WrhoxgpY3x>g}@K>niL<=Yp ze_{h~>y>Uy`ilKC!c68x5d!nqY((txdNp=?%{6S~)#yxchaD9YEpWEc{^6uq7fvBv z=%y|g6Lj~iiwJy5e5R?YT*T=217ZfvlJ z0naVlu`F8_o3Rg|wtSZX8$`hIW^PUh1CfeFYp8HWe>97mC2n#!Kxn*1AiQ-)P)pJqwBvt^wluFcb&#{b0Q4cHIo!mYd`!)vRb&d59pY}i`;^N1 z(CoEtfkkKa?CH?6X{i(nEvFKrhQrN{5c2S>r>JbnZpUl^)`o1O$^IguRESx;Uv9#$ z0A32WL}J>#BoU3>bAwlOXlJO+p4B`024i64%hoi-D4ex_CKZNCFQpXc>> z%gX}OY^G4I&nJrIZh{P#IHU&>3Nik=MP_qK0p!A8I4tPn`;E!uBchfTWO1H2ulxmh zn!?^QqGtu;^lD4&wDvN6cmnvY-u`j1^$uXIB_*n=Y zUlSEA7Q3$<9t<+kAf25DuJ$85{>=jR`NpcsMcdv5{0NZSFmS7Q$N9ULWcelnKt^Jv z{tvUqfY{ix&PznD_%8aT)0-C1o|hm;=<&|@IwK|F64cVT*1SSlr{@2w&CdE86^*6E zbc5oCy8H+k$R}~E(1!vZ!n~d?O{Uf%>`9wm2FtaB z)qsC}J_K-NAZBpxTM89#yD#mjP*h}sh}L?kP!-n3O?!pAd#!d}jLKVCrvNT+`#4;z z^v^0Ag#mYYQ1c}JQ%HPxxYqs~%;!7ux_9cRNzc6euYk-$S)ugIX+!DlznbkxgYTB_ zIPbHyxuYl(b0`b30lvCrM5}q8XFRUp#90>hbv=6idv>Q#G7DFX{Z9pZUwm=#u(sNm z5L`7OzprYh-GxXDK6?U_g4Pr)St4(Uu_l=+xib)g=Zd-Hs;~3cHI;q*!K%n%4ShPu5C%|9wPH#K1r(!n>Npx|u=o-! z7TL3pN-o~oazapevs;s=*Tj#c03yKhu#&S57fNvy3ZJ&!4hJi>;{TT6eu~G;oICTB zK^htw1~iS#7D;HSAei{3;+p6-|2{0Nj9`!JM#-@;L|lfoHtdpGyog{{01GLl@D^k?Esj~)6o`r$$5 zylxje3o!j#XFgNpjA?B=DgY)_?S=@)s<}6aTEoWvNZg>O88JbP`{~7KI7)i!5$iF+ z%E1Fs5`{>5}PpNDu{Cll0n^`>{*sQdw*cHr4U;@=y{ zp+EGCG!%Shv{o@(j;5BVjSS!*1PqP&e|vazSr~+$x*dPK!P{R%q-;Q7whfmFLNi9o z0Ip9yWbyP{l<5;vg3pQng4g_Vlh^-BHpXEEiT5*OoaXQvxl#UAt+hb1M!HDZQ3xT` zqg_Ivw!yS8vpFTRms?V!%>=Ds&qbRLYSV^+PmTJ`axCvvulMus{3eKsNO*tU_vDYA2<)m8Q zRo7+X>D*1rg`q1$NC|_N+Xjz|g7<`fSX_0fEvxfQOx(*l|N!S_h8wt z*zSKe{`tAaG(M>$mp^U$aXDooQmbr8vmd@kL6u> zJSE`C%QU6i_P6|yro?*+=TYSW>eKxqLPrY^OcwVdQ7h_zfMM!`c;5b(*@x+nDRtmF z8tMG>0O#|DK|DbG`8v{S9)S~{D`ab?Xru#dG!Zt3Lv7U7WB9MMoOROYuDleiXX3`g z%{&ZhAiAbo+xGFeouIZvw~e>wg&S<&@){>&s+twvC!X; z9}{H19_Iwyq#7x~{`#LE2)+If0DC}$zge%BseR06K@5aZOr)62GMW-74P$<<2w64q zCIV4=9Mb0mrwBfg{n2i>LmJRL=yM_{I+w1!Wy=;>tM3MhjC!1YP-=@nllUr19(G;n z=TwqB#48Y9FN$*-vjwQu;?ali$HNcYgX?a*$w)ydFx{{h zk=xJ;Ekthl^w1Etj*X)0x!69j16SH=o&p!nP~<$wtOhBjmGy@{vR!s3R+Aj1QFNTwXd zev05|!N|ixTL&m9X%c3XKw)gtWqz-S+mz5ztgQ|OJ$h*uws$(BrK#H5O>Ndme@VsD zU-NT%Z~j|-X8twbn_9{bWf}(>>wJ%EuDOO`R$bP##6c%WxV5mbz<-B^hC=6z&nGwCI=t4ZYtb(At z#5(H{7E=B+0&|SR8F#aL-q7ligN2GJ9Yx4b%9@ z4A?%o3+YS_?eeOACIQ841ffqf*JTium zG#TqbqUd`?bgJXJ-sDCSd)wG-Q@xLV7DwRbzfC4FKhs;W{RBk)(;hT$eSLjwgp-gl zw@&D#O%*(&>P(Jw4-ILd5w*vnDLO3Q?I5u-I9F+rmA`?%hHH{GVQRL7mr%xfbt6XK z(E?qBZ1QC%M@!7oQW;wE< z!C*;s>ab)+XJ7z7_uO+KsjO6foLe&rxnM{qbCIJj(I`b!knVI2+P%Z+2``3PSD}5IG^9$NQVJ_F!q}ga}c+R}$FbEx`f_8`T)`W{&k74N>>9a(l)>yr}oj^svQgsJK=1b(N|z z)_Irl2tTY%D~gU6vS~K$0eJCcS8_^8rCQ;B09-w)iq$nzkp*DBsJbln_2cGGf0CQD zQK>FB{|IRaPsDCi;*FWmA^*~bu0un^yc6$3_kJCPzCKi{H7)~Jo;wZ@`_R`R&l%OF zTz=Ix97*?O28WtgOM1GrJrddZDn^3@^lmPUCgEYj^4Db=_VJtYxAaBLY?7TZUAY zglk^GiwK9P5Dc;we6f?(@HlrnA?=`Z%oL#*)QFgxO4t99^KO^o|nsdN0#ZR`1Q1`F$KDihD%^d1e4Flu)>iri&w% zUe9k?;V8QKSud#{J!idRP5x5k->QueBHBqUr0*-|tC78LoFa%U$Ulh+4Kt66zE7r8 z*tT;Q-%l9n%A=}`Z6n!Hrt#4C{iOli{k1RS#IYk785s|p1Zp20qZ=vzRVhVsj)sTE z@SR7#g{Qv%II@(N)oKTHshC))F!>R6x)~lG<>k1j7A;>Uu!_xOmzNju<=Z~TrLq)Bw`J1}U1scyS{=pE z1mS2~xm|k?@c!#TZ?vFnNwga=PgEnAUZyzL zZ`^&<{iFZx#T4eadlBPi?T(FXlwQy*j;PP?2OVsL{9EEgZP$Vq`Np)+WA;_4ulxo=P>* zX$F3%9wZiGncX`4HSDr>@uP(J(`b^7UQuWj=ax0yzNY5zBZ0*@gE>yCtoQk5jyQ<5 z9)vRqy|-41H_|n%)Ax|isqF({2(Q0^bJ+HX-itQnzv$A-xoovoE_3xHyGT_^uYCEI zLM%brM~WMCuiz7Z`?a;P_gL{60}1_Vr@ zcJigF*YWWQ)*#e2Dg1oq+6TK@g$iYQLoCA$W=v171&conDstFOLzADRCw0zaA z&Y76WZYdV~x!ZcRydt98=IA6JyRs1K`DdTTx9y^5ZSdosc==~#QJEzFp#xsbab%IG;-;j-iG`%Ez^lu!ouNTLNUL&e8He!Na zDJ7e+LwaeTD9qVNyTmyOqQ|;{#0XEC(Rp=(AaGAFro!gYoC^KUM|9EU_~Kpr6aeh+ z9}vd2(FI0nB<4+9RtxH+dT_}zxqYAh!T0gNH@}XNv2nH!Gz8?{ViuAK(FW*_TR+RT z1eMZurE6Dv!1VaNP){)57h4BX4U5Py2v44RCO?`|5Si+pZeGg@yM@>D(8OW;C}YGi zfT>+f+aY>Rlrf?~KQm#lSFB^RwuPRDUh#$)cWzX(Z1&i!CoFbMhQyDKL61{)vRAzV zEEsK=jPrFPIV1BoN-2?p2%7Stwr<HH6{JUMZt#q3sK|G8Ha;=?kC5 z;@lkiiX~%TbkRirGX3#3h|(bHLap=;*}& zQ7PW*eJ|U=)DF?}He#q=gcn`-^%y4#$D+gi#>ZU!oc9L5i?O^66dO3zP2Y~6lz;2OZFBh z^$+6aPk$WG{O||dGL(zhJj&l1#vQkO22cIqJLoG7a1=agwh+}flJL$Bf}yrF&}mP1 zf^shRAX7pNx{E#xyUf?lg^j#ehWktzE^&!$8!g~^-$jWxj-aD|dwm}#aijO_b^pz3 z50lD-X+(wGo@SMz8C_3ln+ZpBL>?J)H&;?9OBv=_aNG){-`ob|J

bo3+xUR2VzN-9HTv~XaGF;bD##g^|3uh$za$ALkxjB68 z%U_VS=nc`_!%|g%ey}C3)`(K;Sw6QSrNAI%@6y(Mp6Z>f56^J(h82JnsRvoBLCnoK z5f1-j6A})_!k-Vu@5LOweiLO96LM^Z0eX!)?sw5=@gm8Marsr|JVf7{*If^m_0&+2 zdzjg=8e1znL+vTfsKARtY(8|OKQq_M58p#HC=ZW~dgzi1mY@t3N2wAA)%<`@w^aa8 zygW;7tD#!7`s}H?|DLN30EEL2c9?^=fQh!fkZkW(Wc6FcM-2aJ}D0 zq0;$6Fe@hCDmtc(&g(VK&A_VAxskauONRC5ns5}nQrngV#=0NAiC*YlHjaTf`aBxIyV{JTv$Qo9Lxn!*{*4)Sj5m?bPlE*e;iC!8a?!36~ z)`M2jbD~fs`o0&T_ljrq(rmr1wVoE}6)}&FyVtpK|Bkz-I!ASMAp(aUgO@4mgprI>?K zC{!h(ZiWXS)^0RD3OlkwB3_RvWcVw$t%13Hnf^|2W^Btg96x#(4sGJ?g+2%^i>dQeMwU@Cutwa37cowvuSY=9_vfR5*0T@d&OM)3 zuisimZ!HC9;?9qbYyElZeQxxKb0_<<8;WOS1MBagB&zJxZ%A2fU0T7$o|b{h6?9Yei@Y0EoHZ^5Db2fqG|25M>}Cf{096Vf}9ZsgPGN&N|q zjbK%jNO}=^+`pr_RT~lMMn^ALwHXZ(rwP_`_ihYa*UpJ=l-Uw!y9+ zDWTD}WVaEed9>vBA_~&hLcG;#V()&Lz3Zt$w7>}0_L$OPTB`(3jmVYPEQ@RvZ%I|S z{zCSW;8=$_5JO<=O05{eG$m>D^NsA0xch7tj;-euh(_0YG1K|p*SxOH`_9)HR;iq% zxcO3E9Zg_<;5pK^vUzK>OMY~$0sR^&8o}6UBO1!dn%K63w}YU%aidvm0NvJj$JG6T zraNlKV$ZjXp9Uqt;(R--5oKN(_oDVK?A^a#?v*IFX)wHKfuOg!-A|xNlx7RheGG%B zBmu*k`xze_VeVeXdRk(=Yx*&DAL|ikl;GmLI_m`r5yKSbwKo%NjE+Mw2Q|nbiETEQ zize^EShnypYOxL=LJK`|t}LUERv4ZH*QfE2_81r*VeLT0P@YU0RBd~Fz}K@ag+hapF?V*^XTCIk*gJu`&)~(zZ zOSJQkvBgYAko6kAey_g>?1acOMn)7nPM7zLNnz)neZ2JmGc2`mVu>8ordtL`g4(c1 zSFMIiVFSG*V=I=KRzmFJ2HHt#lUlvbnrw2%9KgF@;$PtI}&4r4>74sY~+9+)UqK;mBv){+XZPpV8(Fpl^*Iw_iWQ$dTRn+}NU6)+D z!^6WkaNs~J)P%Mo<$M@!THA_{iYkK$`iZZ37RyrZ(X~t>m{)9Vmf~&D#2)j$-u*XV zN@WWR#xdZV+-xZj%8~M2SbD#E!50BmRAZ*yqjv7v!|@Zf*^cS0imZVAtG3y&6ja+F z4&q16y3HNEB=OqouhljidQKvro9{OZvEp9Qajd6>{22FbuSj?_<`Qcotkd4pJe1}j z22ln&F$Z;Hq;1+DOIgiep(bc;dl>eEzL~)ce(;Z|9kSlMnMbGHSckJRoo!Xb2 zgBfZoYS{wbR(qECmT_-O2dEVk^dn>SrG2cT;bs_u>WUX#Bj+U897nqc)(BDc zy=1&-+DN>c*R=Q}lln6}e$u$b`P6cRAM5-*TG8J{8EL&p`T0c0dySPOF=-95JCr7& z=cj(RyLRo;J5EKfr^l&+b}ELTi0LQxNruO0GC3L7)cW(l#g{R>q4y#tXhWsSS_p_d zsLoX?MEwDvHiA3nYlHNJtsc*j4(>5E8eIxCoU=-~xr9N}z z{*YvMP-0)y@eqAJWx%Shm6ym;5<9Z4YsT#dpZC%#>hL_VMfjG938Yd9*?%_}gWeff zVl1_wuzpjYifP|W^`F>td(yOY7i9xy@Y~Q{MrTzhqp(seGw1)~L`q~;d=3PBc zNUe$^Hq|6_q7Nfwdi`TP*tF(8o5bKzLXC?JZ07fyz2`<_j(*=e&asvWHe;BZzb9yA z7KIVh&=v_)q8c}z5HpKUbV8sBp@6kQ&kv1TeYTdF{fND2zW2N?wr<;jLb1dJRSwr~ zMD>+X`YTnMwsjTpD)^)!Q1DQJ5)jFkzNAlz=+jo!h4AYTpl!!;WeYBLHYw)|&HsJ%`pF^534^(tuh5aZ_pD zJKt!EpsUhV5K~^qw-6bQ9B0r%G~kcGD7K^vnbO;7@4}tC_wzoOez+&R@z;b{e#o|w zm!}3_E#t?%+Wtt+_Jh`$8%a>}-@UMT=srJzTQ=@H(+25vZZErIy>a_SAy=>a#2N6> z&o>LJ%tIO9%gf7bpi|Nw#Xq7h?Owr4RapnU@Y>?1~!NZu{L|eG3R>6 z`4IWfY7SJnv8kEVb`R?b1SoB0Da>v_EJIp`fWZb{m|)w4IH3};FkBaXrGDPTGjQ+9 z-zwKLyr95It*^2#jNqHnIZ(u`imePtMDAUB-W|L5@(#R|JZbK(Woit;sJ8x{nTKU* zh6_(d&p3#|2B9eAX6=UPcfFv|da69m2JvFLt;gLf`ifQouBS!Jdu+yAwHZON8AgmA z(Q8HvqvGZ;xR0up2;v}SxIDVSr%C3D@b!Bm?I;=@3+xN=9kmIiU1=vLck_GNKEpR# z5m`~jPzIB}fgX;fa;%IREYV#w(2wK{C=^QAy=Nbq&AQlzjmICPw}+oI0C2t^rt6qg zthhLc+UCIsw`x^%e#b@xu^A?b`?q<-)q}(xaj7PoITu(9Y2rRxkAc>+7dFE*(coif z3_YUT0a01n&8a`2H}SYT)=)v(?yRS*}Mo8j%q2{ z<5*7;N00S1NA$BOA(+xS4)UFk7b|Y8(R)V&VWAo7v8_QIBdvFA7P_tXTo&S8u)%I1 zkdVgL9oQrEw(k0c<^}QVV+@ARpuIcDqeRWE+s!8DY5Be@jd8i>pt4;Mc&~zcD5@4~R@0&O_j?wWgtW6L~xD3+beM6H5n!~)0rIRboqo)mG>691k3+cH?(MjFt zh?Dr6k+N}w-0S>a5NosJH4Wl8sMl+(>uH&v^w^98B6L4ZSTHOO=sphe?3fE~xXjwi zWsV{G{p!jxcI@1PUAyt*$d|j|IYXK+83kX zv7$NI2Tc>3Wu}sE?s?+ATVsQnwhe6&Uav9C%H@gzk?4(fpmUxK1rfj&GmBh#;xywT z$kpA)xo6SJ4jqH** zo8x@oRh*VsPm3VJeCFS{?|aS5PYbQ0*IVx%erWubXeg~U3!obY`eEXLLEIbJj{bT% zZ`zw>NiAV<0%0PVPBPfMmKg4D*+G-u@eA60^BK5BqfS7mN;RL#|}lJZ@urF zd(QdJ#!Rp7IA18h{M-!8&rd@kUr3l6<9`vc=Vk^q|E8`V2(MG&IQoBNZng`=2OQ#o z6at1e%+TpKB)q`As95dprJMWXk)-Om|F+j_rd_8U#N6&4j1vr64U3corklIc*Yo1n zcHw9AF<{~7(JL3IiH$7i8IlU6ygEkWc#eb6w=1;UMm3mnsmct%W;!b?%W(Sj*C_wQ zjv-?;(_S=;J?*v3i#Cfo^(YkD`4d^9F8#%~Tcwls<&lN}rP&~9*K?0clN>I}<@!^S zY>gy_@5WKuZVvWhS9Hzz4kRl?{JVv-+GP~o3mScl zgh8_SxmX1?iXl&r`_2+!UOqJDAljo2-RZ@4BQf@J-cAzBWuzokts9BZ?R~!;$WSPR&MX@>r>U$Gkg~|{G&H; zy(`}6sajS5j7%Gfj957n5fn+ynuW#rdCEaCPt@uIiU0OED$Q(5FwRmtOmUQ=HoUr2 zA8b9f-6XgBbpNfL?a=K?+l@4`x226v9&<=wj=e4}?tQq=*&;Q`Fm_h?SjSnjpM2x0 zERU^)#qK}d)=QgfVf|YqLh30xc7J4 zI(Z!stfb$2ITs{23fnQ$Ua$X)*cwUuCoxVtCQHWeJA)qj7-iQ+_WqH2ua>irmCf`F z`qp#DR4{E%cvRtiXKNFt#>c3`6Sg6sA`W(?PIZ)xsInu|>Z%y;QDUo++AhKFRawf1 zAHOzAmEuhg&Lrt?R4k)rsgz*P6o0Ts%bY~2PnT}G*a;KtKzwP;;lB7zHi)e%wUZiY zjM2`x*3a%3{AtJ9D|t5roW_)%9)@U&~CT|-!1Zb4UOx8~W7ud*~7VV$d;O_nzI zp6dCxv$X{?)00GALDW=&z_5VO-aIQtO9c%2mXfdgq{qE-h9HHY7H!RX6Ruvq2tgE* z6amXXH!NwOUZFt&HK#l$LbObB>Y|~8*|fg4_t9>3OjEP=GWN2XCJ}85Q6&Het{vc_ zOWof0+YS5L=QTgfSDTcCaD2p=M`85`u}30vd)9Y*yZihYah%V>>gozCEzXmhK!YK= zKM5G3^?hwu#BE>eA*|CIC!vsrz9%hqY~?m~`6A3sPeQrU3%0C^`~8FrVq`<#Gtf8f z?RyBdwQqj_EHxrFirN#vUI_&fn4+D;a0xk0mFo1DcFwfu;I#8~+w(B3P+i(z(r_0N z;n;UB^HQf-h^q=hhiF*2-5$gnA{I)Q-^Bc>K4h#&z#dD`&YjX<%ArUOk zGg*S3uv!b=wD(OXkG(RBxo$EMyMK_tD4mEosfS|PA0#k}UB%FrG7NRv z`@8=RZ8}o%-~=g8^&sazuv%>6IWlB~CKQ;qBvhmtRJICz)31ZnE@8o+Zo(AA&!1Qz zJ3-||r(nHSgUc7rK^QirtH78PV4JlRnH6~^55$sr?A!y+{m=|-3fy_h7lI{9eJ@MI zKR$XD>hG$PV^TuPMvAa+i0aA5=+ly|WdFxQO%mH5sF|>A`2IHlg!2o7j2(q`ru5zeHKLwY6trjGWXx+YFFoLnJ+meSDe@@9y8y<0FCbv)OFy zI8CIy3@RUmP%E(30qD1{h%=I?jZw+9Uqi2?x@w3mIc&W?evdpb%>Au%X9!U$mCCTb zxv6XdZZ=~{K`^Vhr~D(j4YZvSrPVBU68bvkjC~xaHeu7xvC%8Ay|qb(JA@5YFAMa& zoBQRZ-(JjxsxuTxvTml(xAEcKH(kFJej`8ovK5G*-}sQh?p zYr^wMqP4Hlo;jGw7UpJPdwYvwue=z-W9f0i3SnYSX7S>g=ZW~%eM_ndtEilg7!c$n zoSB-0t*s5{9~go#&}&AE!OmHQLWG*h%sj@Qv4ug*4RHB<+x~AINzx%{0@Fs4TI88-Qy^z$#n;?9m@1QGM3+s`Bo_(<6^ynw_< zD}#Ww+F1JI+d0}XR402PNoBHIM%%5U?cZtp;U`xM!O`2>OP^RQq1)ls;I*X>Brp~v zFbY;9(qbiPoV2#L_%9_deRorfBx45~gBR#X{ zL(mN1%Ej}f?(FQ=0JL##)w$AqC#8r`{s+#y^%S$jz%e@-7c6@QIG5c6KZ|W4w&Bg! zUxVjgdR5(D6ibc*he

nYC27ERvvN0od}wx~;B;tG?Kin)bWXza{DZF6?T5XB)*; z(cJUfx;?8gww~YZa6|3)Qb59e?lg&tOoB|5JWu$XLE@Z%3e5mJ0gm_M^FZvC$5dJO zdivb9PLJ_d@uq4KV*)qr2JNEq9NLs6ro*3?K6g^#Q3PLKIz5cGP#hpfY^$_%nwxQA+)zAhP!jqcVQ*3BV`7z`z#&E#BCapOW&=iq~WnLxg6T%Xqv71OAE)n6%nAStj z#nD}r$llJA#Re+=w!hoNE;{%)Tw5l|N5T*=+afNC1r9^I25b^!oaA4zk7xgf`)~HS zTs6`4g#arN_Iq-TP7gHUSep_?oGFqPF#9_;?p#@3f|bPuI+okR3G4bot7XF26ta1g zb`W~pg9KPYL^9bbGKQ9sG4_h>UNgzIVM0X)5tbjs{q7DSS{-;v&zrOz zk3$0-RfKI7+{b7Z+C;d}Ane=U-%tBTZb1osS{Vx!MWzBeugC(dR>u&l;F&a|#v1Kl zPa+|s&tvM^C`?UFP%b*un+9vL&?;kY8)#R4a9?+zGCrkJk>-DTY6fytzto(ETOWYM zDEb^8K%rQK3vZpK7SI`T7&2n%VzI_H@f0Ya!suhuk|IICoXi7@>)VfZ#OF?KJNuv= zoZC(cBuSFA3LC<_}|3}^VrXA z?}sYs=Egew-H*Qy#c~;TcIv9Av}bZYlwliz72?8Zk}6V&yJ4Y+S3mp-*j!tL<;8h8 zeCQyIjcsXz9Jqxv$n*K0RIb$B&~s%nS=id#gfnmc9PYgPepp{y1F2CmQ!$HfR@ve7Fn>&^1A7O!SvJFZ>jN}2R#UG0$Y2G)MrTplK` zjl$aUGK8oii2$;G#M0`gM%V^Xp*LPP zeh?%$y;2))Y4`G(810we&KDpY4|bCJ`FcglfU+B@42KEUegGJNXSeuM0p+wZ;~PMo|QrY1(=(BVU{w!SXw`+5vi zaI6`lb?oPnOo#V0H!}^(OA8bqh6tN_N-ND)m<&g&5}fcl1SEF_b+O{o(;~}^IJqglH@}}G8NU}kaY=pG$o%XkX+o3D=zPKIR8=%+Rg>>yd>iw6{ z6WtyWud*5_GSv)4%lc@B3wb6nwEaB1$Y2KH{M;ms3}QjNT^i*WPdm z(cae%6}Ke_Gs=I6k<=EN?+=kG?g4_|QJOGQ;BT~1xa$;Hi;4Z5bUu_gQRDzNapztO zkuvi*Ozqlo?)yW1e|L8W=BB5paZM0JgdADkNyVHI#PCy&>{W#scDJ|S#rJ&(dVBj| zW@d_>`Hp)ZfP3zL1kS$kGdMJI7}hs7WK0$psqlo39rF|b;Hl@p&Q`Ot(^ORjTT^@N z4~kQw){;!49xo6=?Am)JI0|i~z*zk4h~74k-4~WL+UfJ)NSh=ka@D1F|DJSCNLcM% z^r#b~yQAHCKoe9ZraswflzmT3n8%MFhf}9c!O4>+3F37fnC@J&j&AOorHRl4l``Yb z9K~(Aq<4kedaL~~J2OdynDz4}0>cUq0l~kmLeh$?d_M!LOG|L?gAY-F;p)l?Wc(}@ zduY~b@SgX5g!0T0=|x+l*{EAjU_FcHT+Rb17t8S4Pk#j4TU$y^wU04qm3hS;PehE9 zl2dLyj+yChWwmj6aELl>^??MUP5U?ZIQzQo&XshIwBO(m-Cjl-Be@dMRjX{KviC1Q-PHG-a35;cB))Hq61AUIkV8{${7C!W!FjK;K!XPp zSFezY6bRMqM=-51#4A*Ap|6@I@+PdzUZZ~MpZLr_gi=o#>h+p5+I=53*EitiQ@6o0 zFTMinYb!7^a)>0BbUq6WJV+mkB4d^+5kRS2hOyDhFf}=*!cK%m{~QKmjC-A}=&T|s z)!l_99$Q~_8X4fn5-ct*l8TjN ztLb^s)~|JKA>XCXI=V2BYwJT;t`eRz>$f{l`fYA(z}VGGkVo(UD<}HgTt={Cn!U}c zV7BGK_W_m{7vTPf9)-K_eUNh4^?O#tzq-5(4?X%M3=AG1&p5U@z>s?TIR$V4BPf+k z9*Z7$R9VMIM+s@OX4!HOT63bn3)iejuB-?q1+!guE}{Gpb~c|oq3)`jL`-RF5jX_y z?we-Eq%lR(acNS_m4a!b8#o*Gz%=%K4Gs=!qnxD*GK~#5=;JhUWf|2rfvdVw?8LKu z#^%qX8hd=&l^8Zk8 z4<&hc5y!-_g~Tb$dxJ@U@h0CDU%yw+kui8r<%Ak`|7nYq{6Oc||6{U`6eF$Ye;>nwXf7C|Jf7n+?5cjkoicJ4=5m)Cn*4K$SPTh6~*%@pu zQTbHQs;H=Fetmrv?z!(FxbLCIU~6*?4h#)Kpqk|v+sp2%B`;JiS72^#4z7(}(fRz= zQ(Ee%;JHHnh)qeW4dOX3vkToi$t&J&fA@Dgf^0|l?U>0vHqGv6N6=~KwD)ai%XDLF zBwfS3Cq6f(+9ETsGZBe&W@ZM)#>NbDsvHL`QCNGhDwcSfo;)XQ)%GVRtD2w|!)pHk zTsnUSE}TC@@mCpcj-w0!PZ{MVrq9HTo{$Wf?KVFjyBuqs|H?I%Ct!1Z4UQZ+LXJb@|BHLc zK}8jm$|ab%b`>@@)(KJuU`g+^*i+%f0z~_aLSRl7))T%>qn$lq69YKR&Zq40@>dKEJpMaG!ak0>dG?Qao0WYo|ivBPC@mywB@9M0|mG0dr=w` z*1UT1*_UAW&g%gg?z={lEfkEkH1wS;E-X+mCDqH)iBbm1VkQ={dP;j6M5rt< z1D{#-mD-HGuKwMw%|i8@IS``YcKNg6}6Q>9$VkVfd96Qksg zr0q%eh5L-I$K5@iL-%`nddzker7JvB4wWOac~Oppy;3XNpyL|FE3BCtEHApYwhWWw zW7PM<_x!lt&o+g&dLs$fE-t}6_dfv7yzpLyZ0sTpv_quh5kh)k$=vPjlh;{kZlAUIUpjXf$B#%0;L*>fn1BBRw?4D>RxV@5G0d zr_dY;1t9)5YR7(m&m7cj73!I{K1wyEj8UP4(#3AZ<6?wAXgV zuuW`fMI>6h(av*pbKl)CLOaH5r^Y2QjE%yfe*~MzL@LBR-fctQwb{nkvRCP($9J|N z(G^Q2n4O)1<%I^&st{z>OZ`}cOLP?`asWV6_Y=w4K(wEer0 z44tlJujcMN*~7PL^m4enQ2E+w6A`1Y!y{N+B*VT*b{_7S%jIEdVICG1=0V0g`Nr$* zIk8)j06*)&>cSGd^!^XSo%h^FtGGvw%?y-_1;}J_q%I-xhd~o|c6TW+J-}#X1SO&n z7U!1fdMnGzu(q}ak3aSV3?Ce(Jou5LH^4)WKLg+V%AdpFzyQq8FF-M0#3MEDsym`Z zWPE%Sc55{$2?H+TVCkXMJjZL_AH*2-R!t+(-74A5=)^d`sAO@^(T%zV7PG)F2>06O z>jt^%^nBf@W-ay-`zVx8LGXgeU8LN0Ay(XzrPRdE4-PZ3s=c!Og8rC=~MWp7*{A&03w*q+C`8wocE^!OHRqOwUZg+}tdL%_cERv0Q?~BO`Fb z4aX_Pczbu3BAKzW3ED2-{C8i6&;H8iU^lx98yjoz*ptu0+1FpwO*|<^4fD`F<8}m9 z?PToAWy&+j=5zMb>Zen+kz#!)5^M9a_SkBsrH{1LE@{{+bvNhj=FfehN!L%ZmpVy+ zZam_hR3vxbG)d*6a!Kb%daihZI8WpJy7m>RV*)ao`ILjyYWCEkB(TQ8(YqPxpuBMY zEJPtzlMz%9n=2hkNuul{RSaQ$c?CZ5%fAA*-F*+$?aivl?+X_%!PwX+G#fQag39Nz zFm!kXt~+`i6>h-VR=G@;82;uPZiL%U-a-t59`rx>!{3ANe*Zi0)VrUC#id2^i9Gw# zEAZ!k^hFqKh9pG_nAIq2sHlgK=o^+4nw}hoTW-G-8djZS>8#|`WD&E=6KxQylyFdK5vCr4;Je~gZ{weq7R!MXvU?(ZqZn%Wb=e2Xv?R)CR264BU z4eES)gVhFE>sn?cVg49O`<)ry#@^-uD4G zG;)NBzaiQdL=nNX$BrB(bqk$+7y`1mxIn>|=z!eZ+JG?N!WsdDR7+UUu^4VLc5Mvm zjT)RedlstIe(H;eHq8^yyac_yJy7lMqx^V;omr}}(TN=Y?&oBw9}i zcef_?-+!Us^Kco@9(y5JPZd>ClbWP*iFM|43KY*drj(X`6lSq~lr{ighFbu2o@< z<#Q?g-#w?*lf$kOA}A>?L+I1Y)HSH>*0iLub1`fovb?+iCr+NCJ{_2Kh|-~4F2U%v zacE+3JXIKdb9)EY*Ea}(!Vvx+{rHDO+!rpKgV%ocw{Yg%Sy)(FfJWG)aF(8)3c<^F z-ti8YTbQFbGz?lqyXdByPr*Cxe*}v8JZ)=oAfsohsbCuJ;=(M{}2cMdwi$Y~NLe%}Bl zY}Q&(l$Y3+A;#F?{SEjOsY1>M_A~>-HL$hW!u%Xncg$vd<-=fwoWTJzukZixFHz12 z8q&R$UWzgW}?j0SbH0Tb7* zQKLa>a+>j>($@<&pF9b7-F_#WId_^Q6OOHo4S49Wr(x*80jQKq91Nx&SKYus`4l|*)b zR+m>ux?pt^M73@{aWi@7C#NRq{8)bI*!9OLPOFg1K&eMAg;rpJ?=73p!}Qby6=Ta|Jd+hI zYuhoX*3|1e@UdV1EDRku2#s1DDwSS1{h>}L@BjcH07*naRK^=HJ2MTZZoL&ouUv(o zS%=-7U6`9+q%eJ~d4=Kc`FxR#_7lf%hP&>(8!EjOc;@NnVEDix7&&-|icj=cs!+=3 zNp-&Ku6Mx9>>!u8SPfjB$cg``jvEi5+kx2C2P1^0fa1j z(?OaEg(1@JZLboh8(<^p{&{$IR78wdM7#zRuW+(|neu@cluGZDGVq=6Zf(KEvuDVY zj!wLcPBJom4{@noU0i~9J^nO2_T;l90eDV+{No?OqmMmK1V1`9O6Pd=(Z}gNtCZv7 zLAk#Q58Qtr6bd8I(@7h?`v8bzR?QJHWw2W#sq6yBcC6%Aaa znsDMuzr3^v&%O9E-21>gVR2!eLP|R8UGSAFT!lerriAhijtgNh3HF!jvuof>y z`JyC18)0K@nF>MVGdUPOc#z5;9UMMH8I{>wR>pD(fc~S`k&h&7a?1w^4I|)yQsn%Z zH>f`ddE!YelciY^8lIXQr~9xS;zGk3W+ZyjH87_7Kg`a}Lw|pjF2bSK_OMHi@=GJN ztW72IB%*k;;V5LI5l0LJf?c!qxrd5B?GnWTdK-V2$0I zZaM+K{V)F)`0AIx47q%c;<>Inc0Js5<8e4La+o4*dwR-bi=Z!78c?7@tf$TlAKUi&+$@QxuYxDRGD zPL7WfbFgbjdY!Cn87>ha5);Yk*3phqw@ zJ*`h*6F7=elq@I$k$I$^8SfR?dYRU0==N_{f+YQ=5m-9|9~|az3DCXAwC!#`L0d)S zKfAp&&l&%hr5+)=DghHS|J2Y99H1ElN7Wr?PtPdOOD{$k9TjAaZ9wx7Q7^&y? zJ?e`%KQ{}K+&+7 z$NmF{T8INLjRyNPN|B)1CZphaS_ltO00KV&kNN^DE8 z1mo}gyB(C>4FlThRj1x63<8WC9)UtWPkt$1p;w>@-P2(e9-ElLF72$yz(RFxuREFa zQ3SnxRrs6lev{sDE?3Zf&v9S;_toVk_}u6J3pjN62ux2;sA6q)29^aXu-wvMf=mb2 zsaBeycp@z0$Yvg=;++>ui%LdDar?&F3Je`M3{O7&9+;dMCl5Q)%j)JP72rlQVS8t@ zB~BNT7-Vs7PMz2!;0V>XKt81{ZxC~dXUM4Al2nX3Iq((_QLy!+ewO)>tu`VQ( zXMf_qA>n3x`H7Q-pD4b=h;0+4KCvVTTbp(Ay`s9u3=wa2mLcZiZ8n3U6vI!hq+TEl zKBKp@I%zY9aGHPe{RD~unF*PZcpKYpZgWuztW%i3JJ=w{`xqG+p{UdbH~h5rmG+Dw zd)?=SnM8#VxoDP6%34|o0aq`cCuC}1sHD{@JOGjHECK z#{HujWw1BHtyE=ueGPv7AO8~=9_)ute)==;{qKK=Y?l6kLAfHJbIHqC9(hwM)wc?m z3D4vcF!mm)x~Yb_lm{5s0+oIlgiWgIEm!k~*7+mKR%;Ry(F(0>7TO*(={(di7LN@j zvuWv*z$|>;w{x({$A1M?(gwfdC;lBgco0@rR_GaUJKi%g2Qm*bos2DF8no6ss}?TW zfT&6~b>6iw`4Ir7oV#A~V<0avEqa<~rl%l>p(V;mm&@c}YHA!FfAU#)*W*vY(vl2k zPg-$^bX7N6c3`sl<$B^{gsG&6R?eLIs2)2E?Mn0xz+iu3g?A(&)GXH5m*I|k?uU0i z@)&&gTi>K^xR~pLy$m0E^a)uGsFR}*1INt7v#KTGN1U*G?!OP7eeP*k+6v)7wG5y5 zQ#}IC!cJRxjgf`l@~Ksn7m8;QQU&+65sB@SgX-4<@H);mqqlm(3h8$-ZHX-w0J4 zT+N%fve!s;!d0A$2zwrTdL-jeGLEOz8Bk^OJ$BAzB(r%LNgpKRc6XN=o$S=Mp}s3i!e~1p3L#JgNcIG9OpvM8 z%{r;Pca~f}LCl_?ah!0%62si5-1vL=9e9dq5pdw|V6A(goqQV2p zxMzr28|aLXq3zXd!ra^p^!1;Bdk;wef*V224l;A!3={|@1tbc%w!8>4lVfoFw!5{u zWqbxUqZyS4;dfNCFJC-QDhQK!qgI1Lz6h^=_!AUAh3|{hD@LW*-gN8=`$`NG%aWj~ z>`)XLNoen*(Jt#?EesT->p7hV6j9jk*Z4;adWx=$cRlemeCwNEB?scl@*=5}g?u3# z8t89dIF7Mot;Bd9tgkJ@;iK2VOYi>}Y_20y)Io?0ITJDM5p#{Pw2P-uE?U(y8OjhN zqV%P7@U)?;YO{h|6&P93p(!e8jg4)RO88f=Q6&t7VnbzvpxS{RQ*>?;LWJm1qpqY@ zK!zko2cVi1D3vKvh*_kpM^CK?zQ>L(`8%WTS&(l@F_`aZX7SWEJ0IMZ(L$BM!7nHY zZ2t&fmzfUdXM1x4Zn^a~c<6~|p-?EnpZ@FLp%rd$_@J({tKN)8i42p-?@=hPfpc=< z^lNbYy${p8(F#p9qx{%ivR#PBRVr2Z&JVvrB}Q}Eyo|-mWnpf13O@Fk&%wP9J`B@S zxbHF)C5XW{xAjSxd^<^tGMmMkYjDBw+ zVPMCYfs|~nHyGoBFeLoJ$DSeI13vG2Kllmwv)}(+SX)_wzW%}3+zD4jV?t0y9p+%4 z`}vRIsrP;as)GlhsR9M<@-_@E@jc=5U%qe-YCF5oSC!6R49BPr48r?A@G;ohTyIhJ zw5=h8b_Uu~N$0i3P%JASg&{7_v!20=-Jkh4bpp#~iQR{$HKTsU=}ul}Wn~c_e)Qe& zgYSI{e)NOy!^FfG)V4RX5H;Huj_c_^{3i>SfBH}+U&&^D0gYONT3qU5d;@O*0D%R z#X{H;Q#i3CrOaP8qSs^eEHZ@+=$@2+21BPCN&-oV6)0wDk{T!_*EWUdV9~Q6Ldn;J zW<&W*kjd(GVkQCx5G25VuW@lSCCxk!1_y@V-iIH9o^pi>qTyT*4jqDz{PI75Fa60E zDO(OBZ0!{_wnEyNt?)=1OkKMQKm7Jr;X|MKJOsNt1`m!=jU-k?(biX&VSIE9S4!PK z9BW*C?(_cyZajVxu3otqi`)ji(sKnBJJ8i2mcRx!BU!95MRrV<@xB`u0cdT5oXKpO ztBUnnz2s*SCUel19PCeH^%J)qJ$55}=5zlDMz3Cmsfh`=aQ;mw74z+FkbxtozJ9U3 zvr+P3kTMEam*Ke=WKX%p`B~YC6!p2#r+~1G$`O{vU7*UxSdpR$C3ZBz;fUhcHecz`unIu~wVI(rQmHC( zPE-&e%GOX&XtjCZitUad~BvsK4GaW){TOi>5}2M)rUfBSuS^qKcUwXYu_tjGFZs_CM+ z!<_T6sR>$5v8FDmX|)<0zxft;?xj~?Zg#pQt_<`ma%*jg7KvfI@2RR`6d8w~7iTyD z#ti_Lq+oTB!+7Iro~#qhQUrHI6&dqDilwshM`a)g8?-pBudYx9mir!f7{2$7zl8Az zp8xtS_dUMUmO<7Q#;^7ryy0RL)E?Px2snD(_3+SR@21F3R9~>N1VkByG(-?-Cz^a< zk&?3N{*DwnkrsBL=QAZPszvHp45Rnu-#&+3$Q8!(!H8>}i7Ft3P{&#|MI2p^sR%Y1 zFx+ajtkXQij>SSztB=HVAk{~9D*Bl$Y^*NB=;ceWv9SudY=PiyjLpG)5Fj~t@Cdx{ z{*S_!zw}2k`KMGO>Ep5P4@MfZYK;G(9k@6<1Lt1<3B2&?FTv{k6rqora1|j+A58%! zu8qOs!VC-_JVG&7V^ibspZ?}Qg`>xAfZ3Tzy?|&HNf;??v7C`|8tkwQc_UsT6>R0H zHf&lo^NcMVlS+|{>yi#)DGkZ5lrQOwMQp5-AqT94b`f#I6kCh{86Ue!@mEVr3otb? zMrtkQ(pLu$ZdMN6{>ALTiJ0En!XUlF*F(AQ;1AYjE<7SKIe6#0o`C-TA+q!(6ZpDL z6zQx@lNW+F%nF>HYU;v~z)+q;_#EnBRs<&>!>!|_Kde|Iolk905EjQQLG0rgDvWQp zn9zgRy+IPwY9EY2iEy(W5Xti(!&A%x0Lo6mkPfta$i@*82F?(SnkA-MUc_pJx54x8 zeHFg(mA{~KpqE>!hM;Ym$OjGe5*~y_r^5(-^4+h&Q!l;>rER!I41u+MYqciPXucrh z_t2iMZLh$wllTASz|g^oxywI^@k0xP^bJvd!5d-FfWe`IaQ}nvqOf4;x1d*GuxC%I z0UWL@9a;RK95u>#w6pwbb;o7^0k&VeH9y@ZUkBa;p{19(gr$br?=>dLtcYb-733EM zpn88h*Nwe+3q`U5FI`=jrG|mf*_fAbbfYfAXo$fw(iZYXhRASbX#wuM`$5=PTZ12c z|67z!pnX=602Y$GWOxcZ=|6A)E}nfIe*B%U!}BkH2zJ+(6k`}2NJj52P!dtG*h3N? z8T@mf|IeY)Qz7IE^G;l#MLs%5&bp|PXOJpqp#v}oCc*Y9UJsqkSt>SHAZdV-fMVma zISN%;Utg8ILROZjLLwHYLr8k^+Nl0rtL;D(00e4EN~JuhuGruGfP%~=A}C!4xk4F6 zj^FcpOS7ZUsBOh)u7yF~`py@yIpURUp}c$&$a_$6X zj2y-lYEoTQF-|PWQichM(XH4~nkm_i6O@%8GRmItrAmQlAw~o&EzH3K4?jV$`q?*M zqeYA`eh@kz)ngk?*QoZO(l-D<`p(zj(I=jTVxiblX%S0tj$OG#>8C}C#hQV4-1km+ z;_3HLM6aL88fhuaT=V=ytda`*9V$D?%APbX3Mn~|G0WvDIhoO+ix)t&5S_|9n_I9t zy8@Rko`tE2ahRW*gNd;#luM4i(h;6*gsKx&&Qnz!3((&`sO*ibRtd2$$nNGE)U&AW zLXh#jnS8!5Q|cXA&t#h4z2~Wqf3HxiP*FR3v@l4q?*LN5*|4_x^OLvU@l;beg$zN0 z#w(;To(J$M@U5@^73p^e505B=C{MZ_)-%EvQtIh}p58u+=kc>LEfb{=X*tMDLORtj zB*M--lzx#=M*vI4Q^AYuJ+)L8b{=U$)-hkLOp(YyG5tE_-`bW1QpYAZ%%o&-uMZl< z@-x2r9nyWHy(ia>2!w*Zn*mlO+=M5dd4bek^iT8;3{i%od@UXb1sdoWt0rH z6?}@Ujqezvk8>1jRv(7s8#{*&AH8z$@W@lB8#BQoR0(PV za6WJnkKS@S{QmF#4*ZY*{GUPA11Oh@kj)n;2rNS(N#O#y!3Tl{xF-^;CZLz~xC1bIiQ6Zhi7NYybX9aeqMbtdsqfEFB=y>6~K zLr%FMQgQl`31{(Ce3i%WDM71wD3yC;Sb4cjD;ZbULlIi(tx~0L+>XqM6Id#iXY+=}d`c91qIZ|atGr2v0o$3Gp4G&2~K~!RxFZQfw^QFt#LitQKUpcotec{^X z${LbaX5`R`>0`IPtFigl(-1+O<`|_zvU;38S{UT=_%hwVUw!SHKmO})e}jq-mn#(* z7#M`ZM~*>tU>J%eT-l2x;{UHN{O{Cj?%<&jRph~^;sKD&Kvs$Tq9^?fyk-go3(`wh zl8LHvU?gsU4!QtD7*Jr@hH~IZ>E)@!DVeoMY6wLQOW3rKE0B7CF+`}(V%se&LRRYO zCEo!Wn;5-GExz)3VkUgPzP^4b-H6$;WDrsx@_b&}1{_-Ac`5qK~Y5_p0>{DLE#Mmgkmydnw*Wkg2A0;FR9jv%0 z5kq9N^uB^d2({WaEqoWo&%#^h--M;b1xnAIymp2BI7>@Qu(`FPnIMyqFfyJmr}AJp zgoocLg%s6y)FLH)Box4!$!%ovrSZyv>nDpn{Z|Ub-qWSZ!1;Wk=Tf#u6J|go4pX$ zdI~wen$Kn{>uZa>D@zNNf&OY=qqbf0{mh^==0Y8oOe-{nT>B(DJ=O4+VPd(_CsB%T zGMmE(D#li6tFf;(Mri_lauu-umAu{*Ra>va1`@B3#2b*!5@;U>khGG_jM6GYnT7^K z&lYlIH=(MBwo{4JKXf(~pob~}N)@nJlxhU()H1)LM5+ZYD0m)^BZnE;(bAh0lKU*ZypAb``d_H(_IC8D=If!|dcmSehC2*H`DWL9v)0x%q~i zC&GMC->EIlT={&XQTv|=M^}-iC~1m4)hl7p7;V{Fv#Zdjh$)lnNzR|5{y!j)+aA zhN+h)(@IQgFG><(q&()s=ZV2kTA_-E41%j9qA~?ahAKb-8LOvPt;8i#0gFZKgrpd- zT+yA8%9UP9KohE<0}(rA(?!z3=(8V6G7H`#Iu76Y@VjXhM+mr7sSqR@&(HQ%bg_WG zYCrA!xzGM8{BQsAx8eQ=AAzx}mr12Pa`bxmtAG3F@Y5gt4JN}Uqm(J#k zl{bo&f%#mqvg&8^jpptKsl~Zcg-o^D))F+aQ*%T{nz9%0Wv3V5c-t8SlxG+9wbg}9 z*j$~5I^xRB8okv1>HtLbgHbW-HyS&oM%3Jb=I$00dWYbK`%eAOjoR*_h@!mj`y!Lg zd4-;;D3{8AR@+)yDU|xNL9^Z$293TjX!Zq-T3^uE>TT4wt3jh)5kWIAAnX&77>J^v zD#D;&L{YyGQ8kL9eh9;XP&E5c>_kzJ4TFa7>Bw7OAsVVNiqEA9d|4!kR$di{ML#o; zMLjUV!zOYdSn13i@r z#eh}&eGNxzfP?a48W7cGm{CNzE>dGa?{+p{uIKWl$!wu~K3}SyDfJ$hEcEmvV_Xqo zaK+E&q0m#M`Pf;V*9agIf3vN3g8CLT>YEVY>b{*UP)C?Qgr@TbcershK!e(943H3p2(z6KCo72l7{f8V~Fi7X&sb-nT@qt1L zXwt$gF7=R!0%hFol6`|jA=FAs+c49xS%VN6A_`QXV1_0U>d^Gp-}@F7&$#>U`^f00Y(iCu#Us^AGBQdz5-!Rv zLr~+^+wUTzYVz7usPy$i5U2l}Zy{IgrRy{syHML+l|(P3 zoq#lgBg5e?Z@1C#HjlT3LEhG(b^r7~+J{8&HUx-zAfq*RiNSD1ifDyv67v;%2cqi1 z6RVBgjaAZxg9g30Mr|7!yXz2OO<`oX{zEW)!(FhuwF1rE%~GSbRSJW88KSTh28~j) zS<5$TTg7a#(pN0^4+f3;KomBH!l2PFqHs`%U_c0g<p10$38$Y3gUSVt02QHsfM>+i*EXL^sxZu=w zGgL(o^ENg%HdIZkkU$3{+MV59DyoM*1Q0TuKMZ!IL=d4;L8W1xD^<3N<^K76v2Q6~ z?z^1Lmwukjm(G>@hUap{%7W*?Tw`Y)vV~sAVNbwD9d6H z@iEBTIHY8ga34t)R1KBXB4$#Ignu&Zp#Yg&0a2FSY!vQ#zP}>K<1FFmdKf^Z{|Fqt z^>L{0tkO9flpefEs$xJTivp-`ujfjYgQebqqt*J(Mt>O8`lB%H7g10R!$!XdoBdH3 z6{4tF1_2fD{Jtm*t3rg;Fc7_-@AsFA#p;Fgr+cTT#=KLv+zx|-!-$+y5orV>GE|+C zi|J)0yq&Ko6={UZ+kE}2|CWG(W|(Kgpqu%T%iZ@rC#(aEM@bhw+iKf z%jLe|sa&~tqEPBP?R(xu0p3QTr=K1JPoG5&_jLL=@lVDlq>sjQ?LV$espC zt{_2bMLM4u2&GYyOR0uNVwq#ZpwY}1%FTh1QyV)Q3zH$Lo&n|{)Jb}w>K8WZl!M>X ze}p90&c<@FS>Ngj>f7b8*{DQO)RQk)%iEi4xgY)DhdsGsuD5?+cmSesz|UlcGQQvM zXZ%6m^9M3nzm(174(E%-quAXQVOA<9lt(7&fuOz(ORK98G(*T0d)9gn+^~=<_RQu> z)i?5`%Gqqbe63LFU&!UllVPK_iYtGv)Jy1LeS4MEUqq=eLLn{@ezEE<|6dyW4D$Cd zDAHL=u9}ioO;R~XS}}1cP#~8tLpHx%6H&7!!eE(93N%sWqg01lsc2zJ&N zp@BUB>$}iE#>9-pja}H;njLO7cE1h)C-{j9xhxzwFaXuVw@e=$x%W$jo`KgvL~nT+ zf3nmww2jiTzO@4N+LkuxnTZiO%J?~x4!b}0$NtzK`(uCXkNvSf_Q(F%ANyl}?2rAi zKlaD|*dP02f9#L_u|M|5{@5S;V}I$5;CMnhj+2} zKKnW6KIcC7-sAJ*%s;bc{VTrp#rwTqthS~y0WLKz1Og#=qN1P+UO(OaVPk^-s|>62 zzzdF>ijgM-f=7DyhXTocLj{3gDmv&JdKqe{i&?qCxhaFe&OcTn;7u+j6^)VK0?vJ$msl9qx>_=$lI z;5J?sP(Qe{i>H{MB-20o6$9_@KIUP9{-cSPlO&Vu-2$zg#dH;v{`D+yC&^^* z<>e;E!{h7g%kBG^+ttI4hfh=#^uf==&(8%~aCyFP@v`vaa`9yTj~*0kJgqz&+`JrI zU7&Y8T3EVzdr2~Zk^XZEaJPSV>*D#ZWdaMv<7eTH0xw6^+pJ2!6+=YKrh z+KR`<*#>Uo;^hh2^8LH5o4u=-tEau||Do%DfBjz`0G3um`Q^Ch#0+0VoQy?g?(P z9t=kJ_&6LnKvP-q|GG;5 zY3lz^9c@H5{K~5OfA2_1%w(gvar|R2%aY&Hf=h&7#KMYS)Rte!;-At1ey`wa<$ZTz z{^R%7|DV6t@^Ane%fk78+|QjJyE|%P|Jw9_X&OBn_kX=}c7XolbctD5-DwR;Cab&S zVq?wpua6!6$1Cv9Zhh@-K&SszK>o`y`e!pwS6eS%3lAGvJFr^+*JH{92G4V+-~Krd zp8tJ{|M>1d>B9eL4ixO&+kb0zaPx25VB-P|f(Ow2_35(S5J+nK69rj)zc+g~FWy)y zd$Y#9T(5rNSrddrED2XUbL1)~p0nXnd5%VpR&R$NY?Z7`l{~b*mpF7RwLV63bu4xK zSje^3Ze)bUSsD-j6b%g(2OYDpvGGHb%SqRCE-d3J&o_RV!HAgrzPGDw6OqtN(7W9) z9cl|PEq2nZnnbFPs(Z*=P(K!2%loe2nuIdgw#Y%BuHbrwa-e%)RLfBQPi|4F^5ZwN z7Lt~wFf4U&$VFACupb8X9HY!*vco7n8(8bw0#VwCSK*{`5J-+XWA`aH zuU`)7st?~+S2Lx3K0Fp)4t(s=edF^+-1i=6hlht}Xkya8ut2+X)^)ZzNaNanv_4e# z;X}m5#f$gv->>}nHQBO}`Rs7tx0}Z9>l<02*8`xj!PBSitGyWN8XBvM2f@OsB_weJ zOq*LzV$-NDa z`;Eo~>AJg%?UWPt`bNgasu{x@`X#zgcG~iil!`03o;AID_1Su^X-`(}Q%E%uEz^bo zA0IzqcczZHKHzLWetms?NI*lJJW*+^0^#3gRfP1M#d-=yU}8u_|wHI zpr-5USHiMOaV7I**ICe3qh0*e8(YW`a6a%=dD2)_y=W83}( zdt3>-*^6KI6B4!7=A3FU7^S{!pnln4dG*;MAt?un`yA2f-pzyBih6^_h>k#b6xp=8 zlsd>wdk2pkOZ2(ZHcUAx3TVWGp;qcvJaB59BP#Lgsedm!T#qTBL4!`@Ny{oGB}G49 zZ==>>Ts8P*!()Uu!LQXs2rn|sl`2XL`-oie2#4{{+CY3TOIqR9Sbn#^v-9qyHUATm zSOuXR^{)>}VoUVdz4=mAXffOdc@y4LBVVXK!e)dPWXDy?Ppnmj3Ne zPmhehmzURg{re9Nxh#wdbkx+}m{MaX;s-t$a+VrrmguP#A`q1bgk5f_9aU7o&i6;I z?(TK;iAo%CMIl6}8k5`9VS4jT4g%B|j1fPNFB~iMb-_df{ zlhoAI3qOfqxycU=5h-{GMBbFZUQwxoHmosxeyUgnOq#^OmE$q#{69g` zw(~yvu&J5tZF}e8Os+b60ct&%;475}&vQ!&dsrj<5D4&;AaJQx)HvkUu*GRTf}FO)%s%04GAN)PY-xDK);%aJQw@!PPNWs0`t_ z#EZY|Z7Py!fcVu`jUvO8>gH{F zCNXyGJnthpb{x3ObJ1mf7?h8?t=*mdhcTjH*17jAsMZObsp1J}1QAK1(*2LU-lqMQ zd<%icqayBW=$dcEFkrCN7xa*VDaS&y8X)nzOPw@*eSPEJbj8KR+OUk4YBg*|sSt{i z4~!uztVSxKC_E~u z^OJDdTWl8wofQF{sZut%-`^jRukzs9USKDu^cP3m8rtD>OII0NoEo-+U!Jn*^oi+o zN#2(GgJ#ZnzdWoVcQL81gK*O_q?kTzAeVXoPIdbB#+D@ci8uu4A8-L_BaJ9^;ME{) zf&)PS>I<5q&Xl2gH~*%+dtb-$3LW73;{u~7&q?J}yAC*-;FY7cdX)y1>y?$2k0JB| z8j}s29Hg-d{B6}dip3Lp>EEmn2s2$W8`$*8`>hwy2pJtRDF*4d!{jI#wi4Redvs!d z#A`Z!f8nV>7^{`&syrZZ6rhG-Vq%h+PQ&J#a3DMs@vWIQFTfRL(Skr2JSr*i@l3Da zB7?}=@3e7KCt@O|*og^d8<9_le)DM&>4nc=LAE;bwq$k4G$FfvbGAFAkgt0j8Ms9g zY{1Bjbv}U>wZUi-#Y&&eNP{2Wf2ahpIiD1)$K=~+K-rLTp6lICfv>D zuqmWItW#^+dyF?h^#Mt%VTHctueM;6o)^n!TH9?>U^(&oR>mx>a6B;2yP_E=C_g4c zL$$$zulYmKX$z@5-blRoomEy^8tgrmCut+6qBbdjK(^H&#S#^mZs($R+B5@~Db2~; zX|eLQK6;yeT`i$hfjG;oKx>j?zRS|4Kf#$`v7C-We-NCNulPu@a*8QdA&e|u5!gxu z8?MAyNtf26l601|CyF{`HhZE{?KL$yW~{bMBB+p_Nr5WITw4rCVLGB3=~#`Vt}<{k zZ#C)CnG_Hti6#58@jK2Tx3aA|AH!|oxMSMO^raqcGJe;A>;+?;YcM*F0?@0x>S@eS z()DOUhTBiortQJV!f5(0O~zHKCAvCb{ef|!9g?jxj6k;aA4{xVNntZSKZ2M}i{txF z3RqAnMIUi6mByUEuX3R^W??F|jXkS7R)577CpQyaVGIEWzr2VouhfB_F+!S zRz5mUS;`z*>c9?FaCd&4K1?1>G%zVZ9zg`tiP4NHs;+R8VvN9fqWPzY%xc}n9nXgz z-V1f|T;+(fY_E2jZ!)z*lp@7%SF@ zo@0|4q1VeV4d*wN<76bpLQ9ov?GB{y@0IFQ{itngi!b-qX#d>EeS z(P~mLK>;cTU<2YNivF zis`GSkw6JLq;rr5h&IR_bX{?u++H0B_+;$ z2TN+@JMu)g(HNHPGPaP%WM`Mh3903bR}Kh09d3ftjM|b`BR!@a>kLEITRx0x;NbT~ zR3qc6o%(t46^eD<={=IBj=uoQ;X)IrMCLTcQjO$DvI19SmBBD~7DttB!>>kT4UweE zDM!HugUUhh+GbG6(P&&XYyW*wsaTe7T1Rr|v7l)K?a&h&eznqdk@6{|KtuY+tL49> z){~_gft<|DedPwoCqs3<78;U&BwtSX?3y&p$~8Ih}U74-;c05{7%cW^65S2b`s+JY)wcPB%& zWOr?C?UU!2C$27a-vxAO2vMsvv#hdwhb?TkINJ4 zs5%ttR*iI_8M4GlPx{4j5 zkO5MSbWd~44Zp<=gqc;stlFv{qI`RA;8f+`xi6liVa)Z+Rp_-r!>sCzj}tIa0+*_&T_l0;&myC>13fJF7TOv!&L1QV@ScTrl!J@R{Nf6=Y%>ZC-38* zKekfTW5?RuS>ukgz&8c^MHO{Vm9Ge~qr!iGXk`Tg;g^z<;@7JYEJu>|xp%y=n$J;c z*cW=8=vTbtCb2w5dR|@4!BSESLF}~2!eE7at)V+F=wk;gfmH5)wtAT}Obr2E7H|%` z+G=ZgZx=krZjL0+7LGk*71lPuNrjv<@=1zZW0R=RFcIU`bY1Qc3?(!C{T@yzWlt5= zWx`284x1WJstSeZ8y$1%G*&h15v^4q))0tI;vyLxeV`Lhf)Eh>!VtM2t+T+Lfa+=c zM&oKAhZFXQQQJl5Cg)0>nzCo3Q5fU4Qu)4L-$<$f#aw36AyB#DQJE=seg5f_y_d5y z?PqI}wy#C|WD(Cte>enqGZCZ3D!geo!ni_3!PpFf{rMjHDclT!5M& zAvw8*F_2~sd#;I&iI}uYYxRXxv#-gtV#6#dqr$W|v!nzGT>Ku{L#5FBJ9_72Zj#;K z9GeWB8WHo(vlF((vj~_|d?I*t7AgkXI&VvmlVi;&v+O%k@GTKlToF5@uuDtQ^r?|Q z!SI%DSy@@u*5;;C-iyr~>DH_L_LoZnqr&s<1q|G{7pV_Y{3MbtE?Omdy05?e4Z7NE zCeTz*;K@+6d8J+|p~$GOqpylxhqA^VCnuRtGVM)1cH%YfQ~tg=#+Lkdi?|0*cnW!m)fvIPvu!Qa#r5ML+E4sDyH*0s-u5O7(P&JaEQBF1xyBjzMpM>#99cn)r#GjV4 z48jMgi%Dv6c=f@G#wsaZzje1CH*(5)xGAmCSkj2oKsQ6xyTycE-K@jQ!>-CqtG_5# zwN5+RWtMBen|8ocVzjt=Rgb|w;CdeW3AVmzWHpj^6#LsRbf!&Sfj%$?xTN`1fdl-f zHrVXQ`{ie%%ubGhz0!JHesI;aeu-E=cXJNtny@ExZg<%B7pS+1ci&889-6FH`#VPC z(sG+6s8QLnPpJIo=8A=A3=1Dk8^V#%8={puPCg(PF$-XvF2xMgPp+YT=mua|zf}g(mpS-$csxxfd z^v?P4qadiGg_h8>+b!0oTg%V5#q~Bk2FhWo{;j&- zsYj!h-al2ToC<*puZrvm5VTJzG|Yw|#oQKz)|_xdEy|&Bao~W_ie8dn>n9|ZxZj*i zGg2oO%{o_gI-|(?ubaNKqF|zc4na)(3h#aqKWvZ}UlS_h z_QB9uxr;^RgbyFhwd;aKNlA%UNGJ-(pQ6r+$UV;CuDTBWW`w#mZWF9czDsaHdz=@tJK3eFSPTEmh3+^(TP;!&7ZD>h4{m@s?|)-^-&`4 zslv9~PwF$dm*G^Txi?zeT&7YSg1N{ZN|chKt4$8=B0NX$ za_vjNFD!)*#S!-%Zt9%dCCR#G7C5rA=|h&Nhn}5Xe?sBTEc(`@_I=!@M7E!()a9Zp z*^o18+WaM5ZmET(CF+U)+vWq2dmt8GJMvS0HbTl$mK-yS%Kx!8V8D}~7~|xbOZ=?3 zCCx6+u*maizWF%QK3c)u%Tqfp$AhLQlWtLTziB<*-lwuL#%HuuMI4tHu*X^ss!07} zo#B=|VOOJ;0`?Y_PX)-fhYFme#B|#x3iS8Dg0Yw=J_@b&d#cC`Uvs0SoSl+TQf4L6 zVo5bMjf8Pp+1nHOR1O^AsjAKJeoSxj)>NGze7ki-`)J60j+T}TU5a)nia3@rGp0Ar zuvXWhC+4H4vtLs~sR88h5jO34fg5cNS5-No2CSfhI&eA)k)!Q;BRu1~)n4Etc$k4s z^!H@>;|$GmD8k_|sHTbno1Mb5CJwsk#^Y0>lSsWCg4A_BiAR5PcV6U=P`>@0e8bu;+0e3usLaB|oUGL0kQC?V_ns4o=6<)f z^BVFMQ?m^M*2t!cS*!%2vn{3Q&@OmHEA)E>r%ll2o5UZa9b8e-(F*|(D;oSqtl-qr5S{NrEFR_8M=$@xN-qcm+gqkND5k~?fr}`y zq&8qIw2$yFGCxRp8l_MRm6#j@S4MB!?6lpGv&gs#0P%8@a|z_Pa?hlZL?|gQJt)FE^Xg$M`H7rYoc$&f-xN%623>)tiQI4*5;LPrgr+s@m_}R zei#C!OI}8%_EefoarJ&L6AAxGTq`VG|NU^CG`2(85rcFvt-QQEfUejm;_0w|Ufp7% znU3)P@a~i!wS3_qo5yj~x_0$^sP`Sg)$kyV5?hfM(K4T>8~P%pLPz}<7ErIR5I4Ia(e-=A>U;(5puZ;Y`XySy8lCX&kn(Nw zvdokL@qO_S@#?((9eva>S>-h+bJ>2lviG9FR=kx^YKxc_47T5C`Ptw3{SCA@P*RQK z^VYGUnb{zL@B)PIIKy-uEDL2#j6gl^1G$u38ZYydpH_3BelJskNCgaX#tp?~`Ep&@ z^R79gl;esDwArBa$?IKL2SdVL7aIMZM*T(Zh6ZGxze98@yu9W6P{y-f)UfSeDtp5e z3-xw?L`Gt0tBRKCl3_T-`?l0IE@}EUv$Qi9<~w`B7qRluwTa|b+cbzCM{O=VNolAF z+d<#rwsAWO#GDPpp+71hCdfnfo)~B6Q1zSyG_Q}e#-H!n{l$f7SEa9rdQ-(Zh`e_F z*mGOOdrDY*|ERz~jhBF2+i>~ERRtTa^L*60NJsa3p>&5_x=5%sb{dpldyX6GzP})< zz(kyolvFfpqSZ&#+LWC*vY9lRvz<%eNnI=Dmltiwi8)+wXrD!ti$M20tA^h-kPX${&o!(eLl4Pmf-~j+GKQB z)k{&TRSCu=bD6wdggYN<;q&(-{QkZzH=yyme!bjlmHd+QS@X!s)KfG0Ma*xi#AriO z@yhw^C^&?|6^bKQWIN+T`a9v@zWPC!iN=ma_&$&l3ePdD87iWa6U-GH(L{v;RBU$E z$a%KDB)p*kDLDr6G#^)1o)2BUDruCMmPO!|z?O z4_F3lWCae?2jw%N2vY;`#CRGklzs%){5a(SWdWnTGMQ#(`;y7P`1BI6KiGXo6-au`EaAsYfWa4s5 z=!!W@?o4ZTxQ0M^6iUYX0sH=o6zq3zdo4ZsUzv6=McY`BZOQ&TkFtPL#9LTfql4^a z()x3M|J+K1*Tzr14szjTMB%vpYFjzuD!U~@GIcnGW0FR}$wRJdF zQV?Mp$>KZZY^xAcX62m#QJmg9R_S?fQ-d52I9v)Z`&2n0XbuXmSh+%v+SG6`ZZFGF z#n|x33D9OMc_RZdpDzelr{QYQO~q6kC9}^%m=uXhtu0$`T)A9!TDfD2p1*KFNuN6` zT=}(S7Un?BmdUQI(yo9gDu)&nNJUoDlpAo&bXkc9BVYc72c89J_1*r-DtxUYvdMUu|BJ2vvoqFE@Kq#^SIu<&e8Jdq&FG)?K1@ z+AM(JwXiGL?vBH-8IX_wv2MplObaM;F0!qo=WW6}kbr7}n|M#bvR}Vmf2cDM!Wt>3j4NF^!E2G%;VB;1AM1-=lOb`>>a8ytbn{do2G* zvCgm`MBLop9R&gMDuct+E#69SVK^Q@cx;Qom%$sr^=Xxn-fpk0I{xU$eRsK=0i;y1 zN~G*Q+{nB{FRFe5VbF%{V$6{|O#575Tm>X7!Z&G_0OYkxbYsh8V#K_J>5MYj)dw8S z+l77=*f-_6NyHshILwTS$vld}iju*W<)pwUkt#3hZKM&o{z5a;1;^ErzMx9k3k;%wGg~FPcnd)k1zDCxbGU${IA%Zb7q1$ zdoOPbgL<23nvz)6=cwMNztv9hS3hTHf$xJ;lwMdg9p$<)*JT&L=fNp#}iR%C*UlXK<#XkEnb z5c*VW zEoa+pIz8~C>KPw^nQR*xqx4*h(H&;R0&$7PQ8?DL8rClYyX5n2F1geKK5ZRCezZQC z0B1c{P#GXik4PJf;ikJ$8R-J&u^zhm?&P!{f{-?fXRKn;RuIqr_|4y zZ?hPm0g3}tYKV;Wv!D}L$I&1SV1Dezw3z!YdixEDFNK2LWKLD-ISWc3 zw)yEH3b4c2Se%a2Ij03}0B_QCSia}UErr)g_s>L7J$%r@~EWi9EPN20{2#4U3_v?vECMMD9NSfFa5Hm)3s{8QN=tW2BUdUc4D$(VeDgVpiK z18l}m)tj{kh_`+v!T7Vf1c=g)$3Y(`U;4B?C0CRcdkcslTRT(z{pcY1*7c`^XLX^~ zGw`;_c{VH@i*OAD#e?VPB5d%3&bs>g-g&@?0NyE3eSQ}kS?| z0)(88KuL3(wDc4o9Qn}#Rs@iV{_o$(zWova^I&MPF`|1@$Q7!8o)_*|g4(D0e0nL! zu*Hu8fv~g;L~Y&0-8o^Qoi}6VC2!i3W5i`@!#pRG`q82LfzC@`0F`d9U=8U?tK4NM z$0Ug@KP~%^kcKfLU<(rq%fg5Pa3fK>erMFUeHIlEh`3AVwE&5+pu%))q|PE! z&*kSa7oZ*(A1As!PyS2QR&9m+Q3cTb(0$8-&W$jK+)xf2#glYC=tLTJL2-2kc0D?d z7{vp@-Z>mkDs-R3Fuhc^p=NyDyQ&Cg*W^z4C8QuWAqLi2+|0I-cVM-@>MmFMk zbKB_(K<jGX>suz5fyAKAS; zwevd~pgcP4BRpoBmZeQ4Cf7TniaDj3uZ@0!v+0d2F+;C-Bs=Z3etXkIs`P*f{YA$m zMrw}0YmMF61}tF3_kP!#y~H^HVK5wdDA^O||13wjOq;F8{S5(uU)L z3JPFPwE-~-DF*hIPf{}RnM*5hdhUZY^!xpp^+@>TvG93p{yEMaeStdBW1ns37Nqao zO|>ZSc5F+t5v?fuM7j%80_;i+u2=PoK$%{M8k)b)fmZi2M8a3WB^Uxe>&Pet9Kt)wQ(N zhXCvfHfX}}g!0M37$zf`0){|_vt^?$B?Uzbt1?+m*8%feO?em$gdx@qMk8Zm>nk6_ zuQ6Jy<5f#~&kkEIcPfvPd^^xyp839v?u#b0ns0)4BqVkmDo+ZwB*jl{Nc>JD!(R&{ zA-EHuBvZ6d!lH6}0b^bbIt3l=mlwQba;XW*#1rJ_U1)KFjT|Hcv+G$h0tBBG(5sB` zp7izGv!f^$7Uba;oxf4azGaA2s13UEc_S4>y?ptjnJ9UP4;(~r7S1{kg6@PL5Mi*! zj{QQh4Awr(Iu{vKer$pRh6cBy^q)e)JG4)UC2dx_A+yt2NdN%+z?D=Ipf-J(<8+@O zA|7{mwJ9?Y6JeW~?N!_XrIFeugNcm@-p65lB_-x1d&PM_}?5IN+*lM7!Y2 z0Ef1%sp*eycr}8T8Q!iiNk)~6qai#uGzTM_-_plWV03e){LX4f7_MEttfi^B_Ny#^ z&?;Fn%1bQKkaG~83{Vg9<=fL{9rg@>6B}1i_~yG%5r)9$n^yZ6Zh4iIl~X@kL%cTO z824*AXGFxsLDm^XQ3oiDSl|xk5fFsbJS+V0_S&#=3Oe0K@CvgtMe~|NPTL};z>aU5 z1xI0!%1dkJMiyQdT*rRtTKT$}OYnL$BBb5V==1%$w1^LQ_tn+apWE7EmTBeR*%x3R zlcjGar3d;5r4y>2HUFl3a4(`&?x1D;9&l}$NMfOHHGQFEq#336Kk{5(D--kS+qX?r zOO!uPbgFlLiUEaNnY`!U(R-N~z!rGn+RpG!(!q&6W4*;*hz6?g=Xs-PGB6X#(zhaA zw{HW~1AD{0?r3sll;J{m}6R(4zIL0Jem=%hXB zM`Yzt8vrJ-7l;GARNab*CNfEr|8;pfT zNdHq^4F>ype8-awAqvxHpZXZst6#wTb5{{!u>+&}gQUZ2Q_g#Qu^6ZO=}cJl&;^)v zzpi8zh2Cc1^AWQ)Y>u~Jvh4heb*D)O+p8_riCpY(+>)%t?3l}xZMuMXQ zU}ym&h=P)mPe|xTsKoAz_cMG~i%Yl3xZTsNMO=@>JcIj_w|`rA53K(dY=WA4V{YJc|A$EkKwobuf{npkuU%^5xN_^D?FSgiieK+X>#<0_GFm)7KTRBiObd z=QK;B-lx|ss91t&NnMZy<}+mtqd<7F2W1pioQ2})#C`6h9Prr|T*u6sKDiG_3LC=W z!3M|`_Fz%;Pbv78WQX@xTYOs7kj^NHj-j<&W4t1O)EOoyzY{L)MZek){~BvWf|C-I zC0#@S%)yrpe!w>dY9m#%Y_*LWSgkszY3`BH(beVK`Iqs4WR!oAlP_DLk6N-P0xQu4 z?|R3_wWD*%OY>raGPd~DZE%_26d-w`q1F`>gnXz-Z}guwXm_D5pN8UJt?sLrrZ)k9 zw_f&KEu94eyy^D?QJoRrIDUqUK>AD@0G>#=c_eB%bM*a zHoBJ${BNtX{YAgyQQ@P??#s$MdqZyy`>~JR5B)hF|aHf!`=MoRA*sWn;Uv~hBIJE47rmKaQN@ept#R& z&s}0yD+tgl!llpA9+2SVNe}7H8EtZhL!(3dOs)wcDpm2VpUD_ZUN&keq};Dp!Ilkz z%u%b=87crUs@myrSrZk-ZL0e`CqLG_&5bNR9xp~=?$=NCF$!Wmg%zkZMRNS7`+ta2 z-?&@kI1LZo77_{IV;j{x_|y@cTY5w*L@{nPUAw;9Z2zZ$6XUdV*4Yw>RJ+d}Y6*Pm z>~OX3&V@eQE>6Dt7=R*NOM%B4fxpzud$n$VYI&eq1PHN^#Ezrl-}qO}1a;Cf$WF(* ziK3Hk;y*uUBdw}Nf^Z1rG!^)BBH+TpA862TNK~$SBja~CqRj^i<)aG_V)*h~W>kZ+ zFR4ynlfv&$^pL~ph;asPQ0|A-ukXGIq`TspQ;#6JeJa7zG-|fe(*pq~TTGukhe+W{ zxg&o-AJF8Y0D9NjDhinMDE2jL@6zw!3f5Oi$;m(&uREDvQM+^;DS^-##Lf1(Q68-c zfB<&}%i7Y32u|?uF;n^m?LRmX#||TsR%weFvjhAuv9EcO!)lF9xhHvJXqT)h$2A=u zGpgeFxlBW^ioi;*|P4pSyn_R^nldf#?U64 zjXjtFIe1z}D2zI1-5rWRN%fAvK@h355Nvrj?BiMiabPx8k|G zJ8=XNP=J81p4WMK=k$Qjwb`D(cyT}a9$hb%)FFx{G*Jl+pl5dI=1Hti4BmE`Z%?xj z$tIm+p;*NZ(j^gQu)Y2} z5zbrPI6w~q54tng)bYigyG`A8r;5<@-cDq-@5{}azn5eC2?IqjN>)@13`5G&mpW{5 zVZuv(;j9CE&wy5WQ-i?!eGg@&`WrC1fcm7V&4e0{X0vSL(z!JD)h?!ga`Yk9yXG%F z59r5RMU+`gjIh36Kt5-!KbExR_7X{)sPv*OMrGl>h^g4y%?tR*spTV5*{H|N znM%c>{+;)xz4>@~LjW3b2LiO*oX)?{i2|JM)!!LIOvua5%n`Hd)f=BD`7TRUz)CjQ zjR7IO4@lZh=O;qczmg?yB?J~tmg<67DK%makrF62l{OS|KF1DiJX)8-My z$T)@gSC1BKMiI|V{NEQ6mUUFDEQ1;Y3In{!ac{b~D&>E_i+v@-(!q;LI@Yk>X%-i# zbtg|9z=sxbTY<2Z1QN<-_J95^+mtD0uknKD)B4HHX`H5_&f)d(*!t#cSCB1Rbu{75 zk{5fsui}y}%6GM-R@F*7rQXG3Uwvs|vbdS^aFSl!C*d(g!Ls^$DVzsc!@a!tZ*>`* z^Y7X6W)9l`)h-8vnRNIOgK(!B`5WILla00egUW-jJKW62C(~1(xK4oy2TkW4rn~O* z;u^Db^j%|B@u$@oty}}gmiKbE(Vq{^oz-5KoCZIrMjj#++6Ucf0p|*^){ajEou?RH zn^P>{z6zB6oc#929&NZ@%6o?l9NK?aMF)pi8YC!!0d83pV0 zV?JpqSbonnkxf4NJZv9tCo6Elo%W6NOL|ZMq)k>5&f6Q($T%&%AL$GhvZni147f_I z!%tx_GF%L>!!B+YKI_-~>&UZ(d5pzfX^2Ge<@Q7|z;CkOyfNWG#s1Uo^z5b6Hv%*S zLZ^uBP~xS0G*uz+5{;`c6?Iy^a%8nzGfBQ4mDBk#e1t_{7_2#C-96>`yJ6;l_W|DJ zJufk|{w+`{gr^fjE@mC^7#|HpQt|Qep!c6D?9w$f^*(5+slaI7g^Q7tW<7vU8@&G; zF7z7ITx4fwZ?`mO{oJO|CUcjUT8cmCnf{8KOS72+%q~^U$%3tf>avnbKDwpcq?a;G zkT4zbUQd=MoP z(}mIR7fnC<1T+A&_tT>_iOkRFiy{*-xC3Ld0(y=vpfVy++`g+{D*nb|h)huy;5K*u z{k&^8D4+@p_|OZ~-GNN7orTYH9!ydN{F^z3`tKC;e{N1si8(kpM11#Yizc@Hr9+#A zrxbMX*%132aeydW!(Tm~_)RfD4kSk^XTmQ-r!+)>@Qw^lsfm^(pca_u2i@0_XaE-)87@0fufyo_&m*b zCd^EmBUKiFc7Uj((36uHvt3g&neri1J8Oojg^SC*n$A<|yRZ@z+W`Kbf9F!_eNNJ- zk&vHFHrNf_y|heg7ramI3)r^iM|_}@0P=IkA-Z$5MMT&}H|ABKh-%p>Z$fCERuJ9H z%p+p!{a#G+_<`qCn72DMx48K?yLRqt{WuW#(*?kR91?Tp!~H5XviDg={bNc^+T)Oc z6ABONcKeoL_~-muC&=N9Vu|j@R?n@&?|NFR6=iw7cG6cy*Ptu*{Wc^wpx_i5SNT9= z%j3Wi1}WIDzZ98pbQNvL`S9x$`X{{UGHq5fo|=8!YhJ!LT;Ed0`FiyC^LOf0^|+51 zkfocaUy!e2*|2LaB{4%-+w#P`;~tlsyguM7x`aZZlEM5BoydY ztVmx+{|)KBc-_6aC3Sn0ybcNxcFMmJN5uRVJ@OSsB|tMOqx|c`9E@4NGpMUFqxu=R z?UQ9%>#vuuS@MD}9j<@#{N<+)KDW4D2&HdC;qHM(gH_f^-k>{Q*kz z{!lcm7L?%~9M-hY+G}`LGM&M`Rw9epMl+rKb#YrvP7)5%SO6O3^x-Dt9LW#K1E|VhtT_PGtvSM1fUiLbcP(-!?R-u zE|>Ow54N4D7|~mkHUbpBva>#DGUfsrQ(M&?#J|_4u78E3PAarkE!nPgd#A;tcTvhkDW{cdYJ?pULI?pPHiWpP@f_?=l@V%eLz( zEMEF_e)mFluXe<8+WRiU4{9(2&-)k#L0yd7&rif1=WFpDs3qrXiqBgeWwCjdCe;QA z9pul? z9>+5MAvux_3gm#FdFIFT1N7X&0_B$%HKEiw^e)4A=PJ0nrz-pQg}s%HtPH>Wu4NuJ zNS3H{)QiXS9Qez?YXr$R0QG}4aHB0Nt}mR)JI8UPoH2A`dQW)sM{s*q_Kfe$g*&V7 z*JRm6l3iQ%@wKeH@a2+B84qfqHcB}eR9`&^TP^(g7Vx3~iRtiXnii^IvW&Uss30^V zg1gqg5}mZ)y^Yw7$Es;sa`EfuZlgG{wCq$BbfBDRP~nS2N(MFo_uCisX#h{LPn{+F z4#)w!edn=t9lt#|Y-Ht}<=MVp-*#;9aPV29S}zpj)B!mNY-ER*9*`kWD|vK%91Sup z0#)4_USJtvdIdYV%K8IV554@|`BmrZLY#$$#{%-A0mKF%GM9q5>9gUSt5$9mL1I}0 z@wQq1UBhf{`XBiP{P`n9wnmtiCJ$mJV#f9&%RTa~+aF;YHXR~sx|0BAz?vUO0!BXW z{q|`FPQ2Qup!S6e3uw*RFN~r#4tlg7Pm_Rh!v(&0djJlj(?R%?o#u&n8!BpiJ#QH7 zsQdu!op7`P83ri-Ep@O280_^qz#jpmXEE^4qh$f_)9o(%%ha zfHr()MEQEys`pZcSi{~2M?Q(-EuDf_v%#NcNe5qxB+*O8G5kGZ*dm8E%yNPdz{2Q9 zRC(~YXSj1o@YKR^Dn-%vjAguMmhOMHb-I3kKbwE(;=8{PyEot5>_jGhL!N@v3o9QN zSgVZi`+f$Q`-Qxhi+$Q|TvcRdZvI!Cm$$YMk?(gik8wkyJLB2@>&N0;QM!-*OFK_y zgbpV);217bta`v{eN3A#4hCk8%z-R`JkMQhf`)bPP(|$7D3xtAdPTSeyT!~*+ey`Y zP`&A3@UzTF;1L3dxUJZQX8zC%uqTqN&N}Jebq9T$XP`t+YW`9GhJ_nV+^lj6WYq!2 z6lE{)r7{7_X7&~u^DZlxBVg&$;W3Chi_L0$t?!{BHEhX7$zZ;x$&v$eLP+77iI0g!0KyU@0U!eF^8W*=D**dm+Is9Ts_A8F6Lv*vY4;6r)XvKZ- z0V*W%H|}KAofgD9ANnY6P70-YGF^IjWyoP=d0Uv89oKY_EP{z$A^|Q`HE`uH~`@7H+_4Wg#p`@^s2gFzVFX+vEU;g}* znw0ofNNCAd_>!4O4h7>7Mb&6XAGWCdL^}b|5c(;naczk_EB@ULb>Pj12@M$TdW7tl zg$nUcK|DD&ceAi;^^|I^0Qk>?|HaZ(Mpc!6Z4i|1?v$1mQIL?7kWQ&fi3mt{NQiWZ z(gGr)fV6ZeodO~aQqm>TAo%Vx@82~aX3ZMm-gADj_fz|i?<=zn-JuEp7E^qQq@H;| zMkGhWI*6tya1OtCo|O-@Vsm~BLLGOn8Zo6}>grKw+&v^uPDx2rX1|jCmMf)8_e|uw zp3KNRm%N8bP(Y2Y4;8zMxsxKfrG802dQbvS@~6^cHw|e_N{-j9Q(K2KWk-g^f|JP> zs~x+pg8be2>tmdr463jEp>NhI9fxN0G~km(o$^7&z@9#PfnurmKLeQN1@cu@}Jq)%NiBlCq5>|`Z7jVrky6-<-<#Msz1s)nUECU z^t#$+O-cB$?eV0!?T4Pz$0(DV{c(vn<#gqOHs}5Y2SDqYDeiKGO2DjrWgsJQz}Cm(puAitYnfNz%$Jw( zbIzr(M`;sbL9x9)4+WH)D1dR&)WTEb($ms_8=C$-IT%O@)pgs%grNq9?`^m5Ou?VI z+ebu4k58kC^vhFU{gxCM5@5{RF(C|#+}kx!*tjN~LX?ClE5Na)&_jrSY9zbyaiW^< zamX3(w~^&qU2ezK8|783uzOd;tltgK%eQ{Ft8a=oQ|5__y)LH6N|M!KQaUaKS`|P} z08P&^;m5EmRbyaac#fim7k2V@RXYAdmM^ZAl~rb1STk0X=V*4bZQk6?_3i4rS3342 zqdaqLOigh~_bO@>Kg-n@TxC6A4P$!6F!HoPm=&w(6|>@(Jg)QU&A_9(%Gy_jxICN9 zl@v6C017t?JhefX1LgPHT;#am8v=Y6cyzjuOj*asi-fMhv-UhpRUGcuDuzZzU!jJJ_OmH=EDJVcjiD*#EL3CS#LU+oQ=j>b8U4?R#~-h5{!;vB-(YMJ=l zwz8**`HyNc=Qb8MNyx#U-4EM+EJIH8jTu^VrEw5|P&X~fmA&c8K)lr?n6lg2dIeb- zW+c!R1HjfSL7~d>GKnTMHN2KSrMM41DS&OdJSh0Js;a7)Txug>HbzLp>Gzfo#4O+6 zs~Vb_DZbU5=f0c!Yt4^;?whI8X$S4rQFYH|7LR`7n`O$h{2sZpVLNxZR|dK*feH3n z($_W~3R(KeN;_Vi#7Dj4Si9QrpYjQ@LqQc#yPlsRwza!=aYe_=%zNP~xD4+$vNrCX z8yXw8&d)Oo5V6-ED->L}$LB)_4=g}#qoaE8KADqxm@@{z3j!Gu_=JSOcBfBE0;*ia3Vr??Sd_1(}(@OdEX;Hvh!)5NZ2MIBBD?s3_2$=y#R#wgyfYY;dm}*~4HiTcNJSgP z#u4%f_`=s@79bqAF`AJg867CQdEd0lo2GyRA=qn<(LXTrx8dn4UR_hK`cr?nYcPNs zBKT?(@VEH$xa!$~c1C$XTgUQ9YYc|b_9rpRpffZbxV(TlMc}-dW5bg^^A0U~kHCT5&XTlV2 z+YexZ%_0t^QI`Lo`!gQnrs6@Dk_L`uKFbuKT5yIP&ua@Nz;91ly8YPIsPun}99lVp!jKKm=xP*7; z<`uc|fW-5|d&EA(FFnwPlxbVo_#n+@bd}QKuN?RL?d>964~DM|ED~=2q69uMwWFBb z#Hz#7DY^(7E{p5$_?b?Z=BEf3mfE5>p|eCVe@H92mbjDv|* zs@p?KxQ&zAciIlzr09iDfs!G`BT{jhd{D6W;GeCXWSXb5X2WcPfc<|)%o^SRRu_+b(8$~bdL-3slD?`AR5 z8b=}&$3&yg{&JVXJzyRq(@BWY>PvKj29!DTTHHx)6W)7#QjKbY?E;qv-i=DDi<$9w zjGSr1GufYkQzWH0!ZU4+R)6-Kv{|>Bx*xnWD=f!W!-JhI4|FG0%ZUQAy1l)rvsT|~ za^)EET|v`8C)rjTW8y$TRT}>|qOT^+_}b^lC!jyVBBcM~STh?=_p~u_9RHiOaAt(4 zI;78wxXLf z88Lg$8H>|ix>=zrwbHI<(^?DB{&F87`f1>i+TLZ2{pP`y&KdAmK=%URj{re?j8DF8 z&xOU2T)E*dPweR{aoSM;`z$@KF9Ey4PMea{ACeiDE`}M^l)hyU=hP)BsWlDSRw9Zp z#Ne?2R4M2U8toJ(8V@l7NViqKbvsm zT1w$~rLRKfv0n|BPt7MY`le~aU!!5KzL)IN#IrL5Nr$UbgDmyYg$Tb3e zr&xwUfo{l>IQV61kAM2@!KWeinhUrE{jSd)Je~Inj~C9jTjv*z*~hTLoeI{JjmRKx0#8TWr_2jx%ar2bY09S#1T z4<%Zx-z>oxic12jB~fYG=u5(Vyz;fIn1^U5H{npd35qu%35f<2n~{{k(enTc9S1MP6*Qe7M0ZFg1U0OSuBreP2{Cht03!;=!nhkJ#wuI@`T$|Ze-2y^CiE{ zw0)X&n%OC4wzze;%rEFY(e#t0#8R*@b2*Y^5H$dLNvcUQI2su z<3{9Ew@iu9W%-X;vj>-c6zI%kq52-Dg<0_Gb^PiQlu*eOn68G9vXc4@9?7${ch06Y z?`ZKh&0B_o=<_c20yeG{>i%hK!*6G%P;IQqcrd_P#kUJz3DZf2Ou$|} zpx%ASF#^=&Y0h~_3CT3ReQEY36zTWbvL0pea@?S%3i|yO%LNX$`EWWX8IZtMPPYH~ zBV2PMHJZw>=21t5ri^!1wq0M(_o-?}huQkqA6m)`2OgGp@h8bds0Vyf`0n?pPdIMS z)qz^+)uv_S*9xaEtUZ?N-_7ieYOI7YT{g=O_fdmuVpNMaQPuZbE-2rJVzbI(PCiY+ zXxgzdmX*p@0%?GaQSC-ykuzA?=93>feLdQqMn?nvK?=X=Vmo>JaKrt2CuYAPAS8}uAo5lNv{06&ku*g&FY)^ zs(f80oH_{G=N5(LjzPB?zcy7JV5Cf$T=-KU>`=fVu*0wQhw16rE*AAM94g(mm8t3J ztq4QIe*@YxIH90Bu1k`e3FcjUgZZAfXG15|lq>7qXVXJ#2M2rvL3913+)e#cQ6L#b zE694yUCzsY!_gas5{Ob)Odw!2=ai$q=dlzuyOm?M-8)F^G4FKInCWRWz2)1pHzW?wV*?Vaz?mW7$p{)bF>y>_CeNb_{P7$tP}iv&(KBr0kT?42d$N z+xnu->$I?Cq+D$0KdeL-%08NA**TXTV{XSEnQJ4?r*l2Faw|Kkzb|ei>{+RG7O*mn z6C(}~wGc?mq|Ym*+u$d=oE@waK4v+V`@s&ib4p&qoL=cZYcK#upm8-!zK%(G&g5kt zWyntYxD-cB{lyu%108RoTsMPl0lLG>R6l(aIo2YYS!^|@7A6W_d{nD$Q_iDWi`rlF~GpwkYMstMK~XOB?f=9-fKZnUqm<(;6aBgw&8X&OgB>OQ-SFBK8tTi|}t zSSI*QATVWB!P7Nj$L;pIMrIdt0mF}Ge^Y5I>?eI5rij!FdD%|&>l~2WQDH^5DHu*+ z>(=9BoR}6)vmm=qeL#r)m?{!N-9$u0=)@fA>HXISUvcIIT-P#&hm5N*SzGt6mPYN) zoACU{bSCw$z7t&S;y=C`{$|(nhTrWJRkhg?BGwqen=IWUU1pv`O|E+zfq6>QCULqr z_U3weaHS!q5g_!^&zF~%HE$Z(hPg6@M7ek+t)bL(1G|LDoT`k6L=l_O&oa@;0$9Ez`a_3Ll^)8Pn1ux% zDdVuYPA;&xt>>JdT`$SmG~8M@{~H|?39yMg^k=%|?skQQ>bD#;ZIwO|ne?9~az1;{*+(kp*;KxJ@li&0y!o}2 zY_`*}`}vKQ+CW{xx?;2TuB@+(Pf*z8d1IcN2Aa~7N+Y5`3M0{#-z0YBq3(Pghl&s& zQ!-=PHxdH-3i{czE?$t=^`v?c6Ew1hcf zxAMdQ-gvP_g$oZO)imBqC*co-ex1j7+omX-pZi(I&PxX2PBW69c3E|7z||h9EWk)s zN>xP#zB-`4Ea4BvWkG;`##WLHzFj@KsR(^5M%ZR%f{kT`Y#9!*Be_Mu-H0u+U4vWA z^oKHk18x&{2DfFkeG~EeVA7FgI;~#y@_odXENSrTs`d9J2eekVX0sV|$ghI*9%|p4z3~_iv>Z*}A2v$?>zh2U zpV?t*MiQyW1~7$v63|2~>XVnVdRg;+X%)9D6<02``g8l5tci-#yA=B$n^Jp5z@kt% zG)3^nSp4!+2!k-t(9lpgOzp%n{5jv}9QiS9rj$X_9a5p=6A-*L;eYB}dm!>nP>-j7 zi7MZ-$Bk9Q=JZZ=mNmE*kO05gD=gdA(}APKmkz}0&+`j3Z;s~YINxQGH!`Q|zq2m> zE&Se?8kUWK-jB*Q4$Um~J;Pgi@|kM4o8B?C;#%j zI#K1lptyJhP`!j#NX{n*lGnwqkr-My14w^77bFdNaD&Gb?6*5wDqgK8Cl2gvKJTtz z;E*2iFa^0f8*OZ>iwPHQ((j7_^`J!e*^q*V5!71QGQqobcDrPxCI7VR8Fyjp0*^=~ zPPt$CvoPul_Pt-VsB8ZoUY&eCwQ2mH`1%(6qigrM_xy-+F@>&-dn||(?ttbP={Vsg zUU$DE_(<(9W0;IA^HC%*5|IK;0txhuGE&)d#K*XQ1fN%3AJnTkO?Y$LwPDev?nWXu zx8rm(1_nl>a1_T6-8HPU1Ix!?kBusvcARcZI%^fDNMc6zp33u--jq;zS)gE!ne&ML z^d8`)6d7No89)s>R2c`1UTj={9n#Dj6#}pT^pHpw;Js6~3SA>O7Q_w?&(ZH;-}=S` z#hs=~-NCK_0l~%#zQj-mQKL$1;pWgYUMV@rZ-2^;wkAWZy5dkMl#An=v*`lM0?a5} zJDxpRY{#cY_==VOM)_==ef`GRx?B52!X^Kzc*fpQ_HQb zXcH`M$i}d)8R4TKq6Jwvh_Mm@oV|^%pBk4lxjrkW%Z1Mi$QN>`-kNnMn`3)JTp=qQ zJ|H(yYiRy!Gn8HNRwU^WWBc)-XBjj)z>%L%h2K>b#Aiq!V+uZaJ@6!*BsKr4h~;fG z|G{JO>UnuJIueP2Kao(2kSlyuzcm}?w)$=FE{D88iX;oFosI07|C?McSk??eR5T<; zaXJa(3V~u00xDrnVLi>qFA4u}uAR!-V-HmmNDj6E>V|x9L}_5i=Q)r^F-^8ahO&>@ zJqKfF?Pf`XAn-UK`||vROORg4{Q5&i`}(p19^0!NPhTO`YBmF~XMnhoc0h5CNB`gY zPCdH1h>51=oSOu@?gZW=r)rS1;>8GQ6>s{EJGRxkY~(Dd-9W53paqZ|l&dmcKEGaZ zRTFZkSS_3Pz^|Rt(3Lms8`UZk4dH;J)@javhWhRXb8_V3t_X@uo zzx}$#rjHWt3Nso>Mns?KW@$qwEk;WK&JO@J=OJXbjPHpY$$DSpt#0i+s_rGc{m!u2 zz8?n3RkZo}Wt%pO1a}4#ZbOOx({Hx}$n3Jl#+eZ#7FAvsf7zFU{di+|Atg8!R=*yV zU9Sb`xZ7G7I@-07E9(t*q1W_Aa|+Tit_)IX<5^>p9!iJDB-^++5u!~xBtPAykhh-Q zx;j?N3p<)IwI zUMIeMFBJV8pNPl`0)8DGv4?iWYAz<33&$?kAbR+1$@sSpOAJefmlFN*GrxZeLPzJa zH6esH-zQ@9ATi?CtV0O1heD?2;C`*vQHfU*9#GSOtzry~&EDt>DJ(?xHFDK~XXc#= zzZKZi0oQ)3=vvc!aD~RDwUcb+J&tyH`(@mMRx{(Gkc$-l zY3LS_&lW2ifwn-XOrRn$TXGkNh;ipf?)M1#0(geiv|xWM1yyK{z}P+VtM(E`kH}<5cTr@kK8&UPDc~Ai|9%}rIpBCeM+4n9 zWL_h>B7gvr#?`?I&5-fZb7>L9+B4vl~(Eq1tHbLfq*rP#l=i$&(vH0e>pGRA; z7M2s;lE)bHe|Be8FmqGCN|+>QO}*dZ#%nfswk%G_nP6Llt`I=yR<3Irnu{T?_fdn} ze=s!n6WjGodCe}m*lUQ|-KvWaZF@iq05X72tKT{m_B+~mSqKPRV+ot4Lbx9grhu~* ztb(n_qqezeG&`PmgXvzyd(~ywv&@C>A0Sr`~3Ht&u4e9$XL{4KGC3e9`}#B?HpBT`|ApXh z1m5-nxrD^eJwoIN_MeM4`>vZzh$1!E35^gyEp4y3Y<(af#+m+^nn-^w zfJC`YSBAwrY;`Itzp#0?N{`Pa$MVC3SMowV#FGNh`uD8#-yP{7AcGOi3;Mf8hVoeE zZ)8Um)UA-534$Bs8me6gr-MXCgtY?S6QV^Nlse~Q^xG0b#H7f-gG$4DBYM^6tqp&} zUFna~vggne)b7@JJp+ffzu#4t3!elYa(BM&ZQ2#|Eycz#;;d^2NYFZ(x6os)`tbXt zo+V6+#OI8nUZ5^-o^Bx8d?7B)m)mU9x8hkgwXMN(OoKI?vren4x6dUrZLcR-B}`1< zbPpTxI0B_b1tx-)s6qb~k&n7O|KW|Wa#3^50gaZ5LwT4qKCFV6AXNlQ`-{zb;9sce z=$78|(~y+m{{mkO;@N=S6M?h*?jLA7hGgAfdpvZ=dIc^wW%kxLeBn2@J zvd5Lj?;g`4#EIjynB>WPDBMMK)Y)4`FG=b$er>LZCNzcp@sR!YtZe_!ZIU4RuHcf* z)U-+bx&4LH3rCCzrr@Ui)Ojpe4$*!4n0h1pvUq zQNKHs9F!gkMR1ZPM)1WLrmOvX09C5rL1hzntQFD9}=hLLik7{ ze@os>L&uyn-)f}R+wJV|3oa}Kp%DUOG#&qpZu#5SB7f&iC!#iAtN&RZ?JTgE(8Y5s zn`~V{OF`~Kl=SV-ep~7@Z}p;4uy0bscF`=o<@=4mIqf_T!uW74A*;7} z6Om974(=l_8bOzLe>Ne;36RZgZ1BKoB#+Y}hJF)2G|1ibDOJTo9Ubeq_F4t%7nCG1 zu?xl4^VeJgT%_dr2|wTU1^+Gd0n2HaIyyRUvB?x27OPO@Bx!UnSmJZJfQ&_uOe9Bc zKVV>)6-!o`=?4>JGfh`BFxmdS%1=N&>ZqkDSi<=q5_EORH`I!ihQtdBLZ8N^d|OOz&7E9BJw-1 zwp)UJ?Ugp8DsH_%KaEQrv8_%ovx@Ag-%!;j$J1LQq`G>hmHz1lYfOSA5BE-^KIKCJR#L)qUfR^$ z5>OixM|a$D4WkYg#_7z{02CKqT$9-<#q@G4vqEk;U-Yz$+8Yt|%6HVE4j7S{StR63 z%}`9hW`~2$`&Xh80__4|Ng;i?Bn|IUqFQz*-!k&MY@@#a-k&33u#cViVeNI5T;M-yI4Jv0`odUAN!jSj zACM=df;0iRN2q7#PQQ5}R;MdyNMjRpynD%jm{kXCPXn4lUdi5mDqE=20_+}?$*`G! z!)y;K=(LKy%(`FZNOgDp@(Xczo#WZzSx<8;+og~Y+D|v=w|47IjWmVoQx=N&`6`2~ zrlYMik(0@wOXB?eeCL&Z8UWppi!JCkR?ssr&_~XZ#VW!kISDE7ZTjZL?hBJW?o4U0 zlfrui76Qp301G!~=GU*XuzX>WgZdo_U|DBVVK^c&xDoaJMS&)q(0ktgp^st$5$VfcXT`uhJlGVZ3U_oJ$eZzNz;C?iG- zpoDjF@>w8<2%OQXZ{EIT0rUXn?oJLxyuU1rPk?9eS3$)3k@kxMgHQC$k_8S=osQJf zFv|Th1~~rpVMo>_3YgZ1fr=X03COeh8v38@-di%xP83&t1p3=M#Hw3(=Y0`ox^LvM zdjmFCiY*;0SB2@8g0UE%>er zIZlLut`=hOp)6y`d5Sa@W`vJGd4@|#-;)9FcSidp%kmkQUWX%`kp3pF#tOV%4v!d~jnYfOh?{9d4P` zs@}Jo=f`qd=;Mxb-VVXBOXB}!J7h}}q0OAAvy=L7+J?6;);p_kE72d3%r@jsePvzl zN8*5?)TtPivLeh8G?N1j}fe;whYl3LDB z_Xl<6Zn)uVnD0*9txP8Gz~>qWZK8#>b)MCLPpQS@Tct(aVc=aV9$N{GH zi(r5A&bmg(n&WGmuIjYRT+O@@IfUdGcBqaPh#&>ab&h_KOI76Pn#~ton!XA+?`n%J zjVMda*~j*6m{t-Yr2enKbcafyEbEnV2q&_?+5gSyzz>p%;XG|$a)Dec=Y~hn4EI=9 zv>gelC$Uk<`76rjGO(8zZ`mY7t+wh$2p+2FyI5P9Wj-Y_l&#g}c@9z5@mw+nz`NiSPwX5$9nl4vlwsJ zJocqE|97?oQy$>d&h+cF6oQ4n_t~Y>BaN!itQ0(fAl-87(J2~51TW~Y}LqjUz6O#(3zZYxqVAz#~@XOHEXx)89{vtP)S|0UURWce#bzmy-*RT zD;5kPN@D)A%N#1TRin%`JC!6W$w`*}I6d{v8wF1fiig!(GtN(m4-}a3RBviBDYFlZ z{A-au!BkZ0g4^RdAhXcs^DDI9x8*$tB`eUZ5X=iUY=OQWNeC8fMe7EDR=$ z5XOBh$#~C=5yJ%Pwv9pOgC)1wPnw9RamM!6jkSh%HGA?fdMkB(1s?%!?Z~d6lUnh}R`GA7G!}ZT3m=N5^3WdQGzh zZ$>q#F-WdAsbS{cWn)SzB|B#&)f%FusE+&wZ6QQEhdYIROTxbJDUTB4!d6*6n|w1} zV<5esCLNu9*N>1$`fn)!26qa>BSK3@?HR5Kh`8dgNLoq(3JIF+K%xvo4hHzJ(B49m zTcZI9F93DzG9^iVk_qGTF+|h(ERgERQW)N!jKXGr(0oEV5e?-N`~wUXPG%*XVG9c= z{(w{}C%Eqb0|W(MV<{v96opPYRI_RJntkT-X}?X`cUJkNjUDTuTeI8h14I%**BjZp zM?HL-d3>03mn56lAUqLAP2Sz7g}8jTLYK6wb%#QPV?x9x|LY2Oni`0>7OKY0o}~C} zj3lo|%Y4G#q)r>;yRmF5_B3vHqMQM$N<`E1ef=Q(zGaZj+#SE+{u1I8Py6)F>qHMl z;IWr^Z0eh>DC)jX{e`N2P-UzDY_V9zwz8D<2JL=f`R8N!DsX?51c^BDPf2dk^skV- zxfZk5LDdTfMGc7lJ!7)(fAyC9i8>c#P0!412YM3HOWtc6Wn}z@kWsBOIBWs4L#zbg zLR*ALA%;#L%`=snU0EKzTUMqIMsfc5_IzjV_asYuz7>J}QW(rVU`#VKOnp(+nQ#^? zH8MM{O~e)T%(uXV-{}Fz2%=a6xpyN=L9ABwN80WJ;>BMP+-!WzUC-{*S=_B~G@|sX ziV{eEpDM@+2@Tr`o;ua}gA*oa_&>YPIL5)235lZYlx2(&){0U( zv(I9y2jL4G?aW4lm>i-aORL^}^%zfy48M;}Q!d~3hJtuplmKdS0S#P&skf;tZyeN) zU5lc+Kk%$j;kYaVq;*unDLAKXF|l2#7@Ts!6imzxmubhTq(TX z8wDSn*G}ao%H25OCFncMHDlEOBwQ&M!n*%RtVPzuL{AU+H_O4SyGR7q*IR8k+9@H) zOfP6IWshEb!tKQ*>)h+Oth{uul>4=7nX%|o{rMEBV>b@3b#^Mstb;qOWO_xoSp$vX zgWh*Wi|I8dI_drsNKlSJB@Xj< z;@aHGVW$B+XHX9BM&|QdwUJ-j!W8_J(JZf3WXC;rhRLpLJal}LGij0{RkE2o{4taZ zGnqn8GBIqV!sYLY(69ZgAV38#6%iCtu|pYXQ!!xCemY^MCQs|akN5n_&x;)|Hi-TF zd%8d4abr%PNV~#45l2SRdzd6 z604i8R+Cj$k-ya7wC(+f#g{WsVE|p>rThL-R=$4Ga~NJ08S$C`Kr=~odONIl6ZPbK zZCg3e<_F7uULAJXy4hM#Orn9uOrCBF!Fuy`t66OeZ7)FADFqcnhJmCt?+pdLI3b!b zCTP{7JIcz+kT{u{pnn%L;*XR$-MkZNdWO{BZ`xu+9AlC^J88C=&SkPtQ?<^4*-efM zX^*l%pl@aM?nx2*c~SJ}TnM*~qhLE0muU`pV3WQc@+F0YzNrR8g;FJE(##-p@(c~p zSi&~X)jUv7MA~2G&}} zbXd927Bfjd$-d2M{Q*q6N<6QfRznJSjGsJIg!mVkaSuR~El?TQdzI0ngLrA#VH zFH57b!a``9WJW}RpZ$BF@lOTdLs7qWf$ncF2p~cbci1Snr+2!ixn;>Ks&P2cx!y-NmwvnXaA2UV%?hMq?VxP! zmbekEnX@g6T>L-1mk1uL!>KVNV;!s*E*gUojhA8l&Rib%_90t@NUuEa#)|7bW{JTN zm>wpf^Cq?J8RRFYds0%{l&3-~U?qWga-1tC9h4*$)e0Vc{VvaneviC;NhphdB-vW8 z-O|Nr7cp>x+4{2Vr1NxtwH$Ca7>fpe;5s%Qye63{}1#gR?V-_jqCb56ice-_- zy?0=B_r3*Te4FTUGfQ| z)j3ian*!nY#kA&Zt3GkPM*@hesp!}?pMb&o#}8dBbfH|7Kow*u85jRi!$?e+gP@6@ zO8Q%}Cf9F+c)?$4PD`>?qQ2P&>BsQbs1(P zUo}qVK=HiB-jdo293HdUAkC0aBv!ky>DP>@EZ>dForfy}2urv@e_!1E?kzDMTH9Dw#HT%nakb+cgT(aVgK=E9NcyY-h}4K~)ThWWT%m1RijzPx4%xB?*^+uJKo<<8 zE2t}@RejD;KEv8zn}0qb-*C_Wt7W=ULOMsaz_jcikJ*hANV)_hz1%+W{ZRDs3uqK> zyF@>}9m8AkDFouJOuJpR^9u_bu^BVSl39a(&&xti1%$4^fGxzZcWuZF@9Pi4+udAo zoO}bJ0Yt)Mq1c7fmV$M6#{@jzEQ!zP4JK0vuC$*iV=q*vZn0Yiq-A8_8RA!?)`Eu~ zRpc@=_+QDk96Owvao%4UfJziBy(VEjnfZwAs6p6t53xo{{aqm1kB}JIgkA~?6hPGw zptULqN-@jw?oh8>uSj*lq&s}oUv)*x6EOB`d$K;~yvef;5Le?&CQ1B6 z!#Bu<_^le-)#tlINkZ{o9#2x!Fm!+c1meto1Ur9v7b6iBp~FWhBq9=uBzGa&eTdRD zNq&8BpCbw6v&+4oz|Kc=sYnI0p5TqKf>L%!mkE9=Yh=4fpt zwKNiiJ7q4nKS^S--l8Za8LtDzE^gyxe*;SPpo(N!JHV+C7aEmqEv>4P)W7Rs>So_)$O*EVy!m z6l;KZ8)P=&t3I&BW|sSOW5AsK)wKQ0aAafzIl7*z#-PBU4k2M~xmKh~2mBuRW+UQ> z)ZxKkPrGa1Z)Yn&xn@Gj8>g4dhx&%Tx7_B@16WN?&>fJ8!nu%t^&PW>;K~@|5SGQ&5 z2X%*LDjr1);+>Tg@*t@V0QN&IcLfb!?!{x;-+%SZpE#ZKPR&Q+SYZ-&f7*QOFg@@U z-3oKM=IQF8$t3f{FJS?)j87mA2F>V`lDhoRk!Wqjg9t%u)R}NJhlrCdB>Adwl!L4p zhJ;x{NCQmFOF@Uxg^~-2lj5iTkWL)My^Eh3h6-y7j1FTfal3{8?j3G)KUZsvURs}U z2=VpUEgLIrn7;>b&&tY*4EM6zq@Cz*m^~(=r}uZ+{PH?N=0ishLnt8*6*{m@gPnNl z^MvcsTsR7Jv8KF*uhiTuUIyFf^<7VU7E2m3%S3MX>bh~ND8?7Pb)cF7BKT+%%!Nxo z{uNvlqBjzin1&wl>wge}S2smy1bGR>c77G^rbPYQiF$m~)d*^91!1@b22`9Gvvgs~ zi+KKxMqwC8VOesA{ z_fNxaO-MxFtUN(kS;^`pa>)~sRWcY#%j+fGElsH(AD|?SuiP^2a&cbSGHSPS`LRL3 zC-4ZO1F@gYoB!SNW5NkYMGMGJclYewAF{tKP8f3GC>NmW=QpbuN@Zi)$vJWhho$k` zCTQfk-iLHE*u1{pebJrJ=Ryzk;ot897o^ZZ1#XWA5`CHGRO6_V zNVvKU1uW?AAuJRAI71{J8rm^E1@6_7l42+bY;2yZ(%XtVrMBN(v@jFZ`YwpW&Whz1 zx%iX0;%%RdXL*GW49smk95;{ucV_;N7ZMAgAasGmCI~8@hcHA=a2-N%*^;&VUMP}n zuwl*R<-4_h9rnTqwJM6cYL;e<`%_o%7c#>P+@IU2YKFO1G7esV^TbP?ahZv`V>6SF zs?gwS2@2oYoAL`>eAIl}YppNCR-npCc z=1m98+JRfHj;vKwJrgn%!3Z~wv9oeYqQ@a7#=$b-wPzaXiM8owSQruU1BK0RKCRkh z9N)*4nm!elJlmT6w}%NaVcBt+&a~`y3aC3y9Vv*A`dIoqM0rk!n1o$c2Pfyog`veM ztvXJ>*cKHM6^}v^^I$;ouZVuLXY|X>E9p-_%ToK5+b>%FQ0{!3-4wwiI*u zCbQ?O#RBSU*MJASvFyQ(W}c$b#glaO=+6U1mxQQWoX`#un2 z0pL44b6J3~s|ctgx^1biA;&FvZ9x0uBLY)`9qxvHHP>?W%pv0`l_uiYPVP!`8?VDyD$5v=qjs{gPwK>#rNB`NP58YCJRUBkBlH zwoYTI$nQrZQ%lH0ilbWYWl9wty{&x&BSt&HDund);Iaxusi~g>$qZ4J!9@P^7zjOT zTM5GrfjvQ+YDcyk;Mq{%fMXmEZ16fjWq#c9?*g&(EX7O5C2?w4LQWM~)k&)%ZuhTW z>;@9;_5v{$fDt{&l8hwdd|&~CjG=a8kY~j*RXFbu#D}vV9{axAqQ@uA6Zk0b;M7Ji z-*4A9^s6TKSl9Y?OT{Er?qN3J8O`Fke(uhc>gJ+~?{hNI+TLKt4H#hjGwdK*mYLQy z^OqHhh^1xirJ`!pe=WXk0(m2BzXPZSY}tO4A;vc1+xv-VnmBfKYC*Rtj3U*e-&e?>l0HirOEAI88xoI#{$Wnfx>5)a{L zq2Obp?^^I9fvWi5AM;B*5MLqb1aLzkcQyD8TMi$#JVy*pT`(zRZ-FR?8Zop%O&12~ z>IjK|99u}3Ct$BcG7T%gcQ1bKvOq;{XBR;x_ArID%Z0iX20F)~ap9#)fz;m{Xp}P0 zcJSZ-#SD51jr4r5~SP`hdQ{N`2_J_-$b(Jw%^YV2BY3oeSZuVT3b4m%UJ z(~)Kd6LXlhTW$OKqhZ$P%ZlLJ72leKadSvar)`j)G{Kp;{Cvp7l^UXTDs`TFh zQNX(++3CUg>rZ_2$eRVcKgx))$M+<0Us;-f;BLgbhzy>8lpR2c+_Y~p+}hw zE-Z*Bh5(Ae|B_xV_k%76PxhGpx%hABWN!$T8MR25yPk`ymZp&XdD+7rxU(8a2x+r$ zl7aT8&!(<9B{_L&SB{l9JfXhCOMbw^6ehpJ0G<#C$$s*k`+ehDjp4$ZL(cA^?oJNr zTM-LaX;v4#Pke}Bc&Ng4!Lc**V)F9F%&)DM`PCIBe|_IA_^S_-#_JSPeEK+AE&VaR zCYa++jt1LZ>WC{J3tcM`1TH>p`koUu@0Z*-&217$8DPMCJFTn0FybEI;O~!Fo{B#0 zB%_7x&-7a|{{cGVp=_B@cEOTSD;{`z;Q|DCB(msK;YOdkn4Rm`{dc*$6w36MnK9_E z%ijg2OBScvg=^r2vji6cr0pasF@7b}kc5C*=iR2`5aRDzTj_QDdU_of$8+&eS3!G? zgogiv=LR$#4tO)`+A=tNrwsqK#;E%^^po8L!CW?^JkKjiO`9uxd;QWQs7)}T#~R2e zi*(yA&&O!B>K!{aEig9r1;(?0Tk1)iQNo-`2~)hyNrdej3yD6=;@6dI`M3RVGsvUU z9`Ynp@}pcHQ>69xZdTp7c?XVw>_Fhrb#K@f!#3?~|3WsMMZ^6R+l6{-H~ z#3s>|UOjTS4Kbhv0m}}D9{&ugy-SNvpRQq3L`OsA{ zS!F-dE+X2WlvmKv?vZ~sCYbPai+%XmiQV$epMYasR-rIM`)gElCuY754*U7?md?k$ zz0c{;{`rmwR@0@6*~qK)Rb>p}Gw8DuDzNS*pxy0y27JFrM*lZ_3BZ|5ApI>joF7;GyniUycOb zgDDz7JUBxL7J};l?hf7SPYdtx^%-HW*N00WCIZf%jWQajF@!l|tIDWiE0h2qZb}~< zO%&j2U>L-g)1_=7PLZs90)|gu%^}yd?v`-3H|2CnWI0utU%SfLj}IU9qYX{cyA~I5 zD~evH(B3$Nd6b()d+lqdsc&9#ljzpGd*{C>z1Ef!&3CBqWAJ@N^YTTpHn1{^5#QVA6XC=(^Uv9 zTxYg+EGObpRGebus`lH0uj&0&eB8rF{xtsINqi#M5tZ4&kqAK-P}IX{fDlL-Awe#L z!B9sa>Jd{VTfAgQe885K_sPNw7a-E{{?3ug0sR=`>xB4*$DY$ z4ty?0s#rQOH-ZHQA{w8!fJ0knu3UGJQ-!cl z1-)?~yu;=TQJ73?PI0A#^DHI#bDMSA>nh#RXg)69?sQS_>G@5?g>T-j3%FxxJe`uV zI#*D*5okKz>25mdKpnn3p$>Bgd1!;SFcV_Fa!iwsJJ0;~(i zItU<^kOl}kNR#mn^S>SDFujKsaRR`p6^z^#$W8EV7lzX#COw48Uqa&1phBO+egtC#Q*Q26!_aJ@J#zZ?sL1jj7irUlq(N-)A~;%i>HqUCW==)@bD^crRF#5j2vv&?>s2v zdA=!1QoaboWyznTY5JV0vR7o`y?*ckzP~dV)REW%SOBGse{jKB|JC%XQaob^vRMEG z#@^rGKS`24C95sznFU)P3H@g;`uQ$!EBE}G-DvHFsVZHB~BQH9pQdv zB!xzM9ig13r-|oY?~;jmz6>Oq%Wz{Wyfc#%Ylx|sWS0N;D@}oKlVM;A5t@BnQ)Qgy(pxLw{ksGY|oW@sKMyB!^4)l ztCk<`mD1aRk#4(tXd+=l&EqbIg`V^Hnr>B-cjxi+IXk3vmW0Q|#^o9py&bhjsBDPj zMhw76Xhv2PM6FTRmPn{+M=-D4jMOY0FMl-1h{zkEeFY6B265&{yQBt^x+Ru2gSAJa z7JzH~l##q9VGxUEIgCs5)uG2i+-z&F>$SeVB8c9QEzy)Fynbn8%5YJUZ(vrQt0gl$ zY_Gp}?C9J=agxZAAn2S)=|31;$TOr%QJ8P~TXOXtpIB6n`nmJU58mOg3u!o}w`%$a zvl_o0IR~_h+VVVK)E^P$KxfL4X|KrHF!{l5?OAOz4PQEirT&P^ z=VBWhgTDVq6|LDeLlG|A7oCf(tQDsl_H_=@jtVcNRfP^_-F@@$(QY*0tK5BdRKxi9 z1$y8w9Qm*#yhGWDD|22869mNfHWMQ}oGdIBXTC3Pd3{QKK9F&2akMyT`o4AX^6T54 z8?nAVL3P>$PMi#_BpnrPH( zfeK_yTbAUZ*d<7qSUu=I89z|o&O<5A`;a$33Qb^Q$R%E2q6iL?ZD@Ri_l#(+a=}kb zSMM&t{K3Hi<7av*r8)0A<$i;)a=2PY*%Ied>fxv@mZ+8{FGJwp0_T=(&B3W=p0vr3m!$ARt9+hx~Y?XX z+QVF9tk9;Py?@bd-eoB_M^8h4SEpZ~)g$9~z>C3c>1!vP%FJJf;)W;694Q>}+Og1! zeX}llzs%p&Q#g z+_z!ThPf?{=wXgSNl~PzOp}OQGBGBEWpYXL?U5m8A(woQ`=uDMIiEewe{ep(eSZ7g zAMeNG_4+(teHffc;3UVJj7^9))*I@LB<7-Or?s37^_aU^#R4zXa=sB#p*=^ut3x7w zZR*0#oC9KWDzKT10dmxT9@}X`xBbKpKISk&)!B{Pmd&o7ZtFW9PO7;rbu5%8ov8zQ z-Nnd~K50~Xc|r(p5ncZJYpZ_JVwZKN`u?wZS0)V5tpGpkOy4CKmja-FhW(6Jn( zG5Dt(`sZjXESYaXT)%M8H&&*mlD8Tf+23&wC03*@cPt8^ddRA##dp3(aTlt80pdl6E zkXTG7^nd7zs;3&8yz{?gk;Z&NYs5`V1%=Ljy=rKfQOnBy0-R~?%2>!ZWNUv)jY<+~ z+p-=%I`kz+lc3$aVCRyhw$gN}YvS`05Oxh1DVlk(=KPSPC#Uz2pY@p^7yh!#nqr2_ z=;v}tCE{zvb%oum;-B^KoQe*hx@ymxA)V#Lqny18N>5Ddo`SUWzkopuTt2V+wFbl< ztk*2&MR*(6l2}Vr?apy{2buT>UqSFf@``_1ipBDznfBxaGrbIfa}p|IDt9=>>PbOQ*o`Euw4J7)Oyp~ss?=(Q|@0b?ldg0e9f zG!Ts~FK77gc@=uk-NF4yDbmJ>DBOPEGzt*LPSGsV=)&^SbKe&VmYN>p9mht#mT)yX zwy%&DvAQ*om6`0=YlPCeqD^kd#*4XMv5?OL^X7z`MiU?AtuWYN$6Ytt?}BJ0Qu`6I zc@sQ4HK6shcdDEyoCbO$S1dugZabKDo~of?UllJ#H;8m z$RAmdpJZ7ui=|aho>3_3gdbGZyabDUa6(OU4K1UidFxdo%D0F=oa0URozEwmBz~VK zTDvV64<$TjB-_Y*^TQx{Of`BMpvkF(5%5=|yGz86Y)iEQM%EZX^;qouU_^LY$C!Bh zrYJosFr!%zT|O{395-%XGO6jID-G3cOL`M(?BzuI`+n`UX^)?;Wr; zXi4qMrd~XL-s|ne`=GLQaQIYB8>ZB!zI9^8mL9qqQ%47dCyx0kDu7+xuj93(s?P}! zNPI*y)F74?6a}3=(7(=Zm;)q=IPR=D{VQ2P$+n5a7IGl!4zta$+t4=OFY zT7BG!bC3Y~s4TZ=^_<2D=g!v(8h zjkA zj4|~t(IU6Pv4|5gO=RKVyQ8T0s$kxy6;uouKj~L^#Kn9fR%nRB-RXVHnIW8bIFl67 zD9ufa+O12-az2EE>vUS`eR@C5J;UV@6|iC zNir$orPA+Ci+Cs^Mw!E>@)1h)N}l=ZWP>{>hH}II>TYf+Ueb1nIcI^wD}Z*^0cX## Hqa^(cEpRrc literal 0 HcmV?d00001 diff --git a/resources/icons/X-smart 3_thumbnail.png b/resources/icons/X-smart 3_thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..decd30871773dcf783659191d638d776b69e37bc GIT binary patch literal 32519 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 + + + + diff --git a/resources/icons/arrow-right-s-line.svg b/resources/icons/arrow-right-s-line.svg new file mode 100644 index 0000000..12db6f6 --- /dev/null +++ b/resources/icons/arrow-right-s-line.svg @@ -0,0 +1,6 @@ + + + + + diff --git a/resources/icons/printer_state.svg b/resources/icons/printer_state.svg new file mode 100644 index 0000000..b0ac56b --- /dev/null +++ b/resources/icons/printer_state.svg @@ -0,0 +1,11 @@ + + + + + + + + diff --git a/resources/icons/refresh-line.svg b/resources/icons/refresh-line.svg new file mode 100644 index 0000000..402400e --- /dev/null +++ b/resources/icons/refresh-line.svg @@ -0,0 +1,8 @@ + + + + + diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp index 53f115e..f67127b 100644 --- a/src/slic3r/GUI/MainFrame.cpp +++ b/src/slic3r/GUI/MainFrame.cpp @@ -55,11 +55,17 @@ #include #endif // _WIN32 +//B45 +#include + + namespace Slic3r { namespace GUI { wxDEFINE_EVENT(EVT_LOAD_URL, wxCommandEvent); wxDEFINE_EVENT(EVT_LOAD_PRINTER_URL, wxCommandEvent); -int count = 0; + + + enum class ERescaleTarget { Mainframe, @@ -886,6 +892,9 @@ void MainFrame::create_preset_tabs() else #endif m_tabpanel->AddPage(m_guide_view, _L("Guide")); + //B45 + m_tabpanel->Bind(wxCUSTOMEVT_NOTEBOOK_SEL_CHANGED, &MainFrame::OnTabPanelSelectionChanged, this); + } @@ -2097,22 +2106,129 @@ void MainFrame::select_tab(Tab* tab) page_idx++; select_tab(size_t(page_idx)); } + +//B45 +void MainFrame::OnTabPanelSelectionChanged(wxCommandEvent &event) +{ + + m_printer_view->PauseButton(); + event.Skip(); +} + + + //B4 +//B45 void MainFrame::select_tab(size_t tab/* = size_t(-1)*/) { bool tabpanel_was_hidden = false; // Controls on page are created on active page of active tab now. // We should select/activate tab before its showing to avoid an UI-flickering + //B45 + auto select = [this, tab](bool was_hidden) { // when tab == -1, it means we should show the last selected tab size_t new_selection = tab == (size_t)(-1) ? m_last_selected_tab : (m_layout == ESettingsLayout::Dlg && tab != 0) ? tab - 1 : tab; //B4 if (m_tabpanel->GetSelection() == 4) { if (const DynamicPrintConfig *cfg = wxGetApp().preset_bundle->physical_printers.get_selected_printer_config(); cfg) { + std::string select_name = wxGetApp().preset_bundle->physical_printers.get_selected_full_printer_name(); PresetBundle & preset_bundle = *wxGetApp().preset_bundle; const PhysicalPrinter &pp = preset_bundle.physical_printers.get_selected_printer(); wxString host = pp.config.opt_string("print_host"); + //B45 + const PhysicalPrinterCollection &ph_printers = preset_bundle.physical_printers; + struct PhysicalPrinterPresetData + { + wxString lower_name; // just for sorting + std::string name; // preset_name + std::string fullname; // full name + bool selected; // is selected + }; + std::vector preset_data; + for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) { + for (const std::string &preset_name : it->get_preset_names()) { + preset_data.push_back({wxString::FromUTF8(it->get_full_name(preset_name)).Lower(), preset_name, + it->get_full_name(preset_name), ph_printers.is_selected(it, preset_name)}); + } + } + m_collection = &preset_bundle.printers; + std::vector missingPresets; + std::vector m_buttons = (m_printer_view->GetButton()); + + for (auto it = m_buttons.begin(); it != m_buttons.end();) { + bool foundPreset = false; + for (const PhysicalPrinterPresetData &data : preset_data) { + if ((*it)->getLabel() == data.fullname) { + foundPreset = true; + break; + } + } + if (!foundPreset) { + (*it)->StopStatusThread(); + + delete *it; + + it = m_buttons.erase(it); + m_printer_view->SetButtons(m_buttons); + m_printer_view->UpdateLayout(); + } else { + ++it; + } + } + + + + + + for (const PhysicalPrinterPresetData &data : preset_data) { + bool foundButton = false; + for (MachineListButton *button : m_buttons) { + if (button->getLabel() == data.fullname) { + foundButton = true; + break; + } + } + if (!foundButton) { + missingPresets.push_back(&data); + } + } + for (const PhysicalPrinterPresetData *data : missingPresets) { + Preset *preset = m_collection->find_preset(data->name); + if (!preset || !preset->is_visible) + continue; + //auto printer = preset_bundle.physical_printers.printer(count); + + wxStringTokenizer tokenizer((data->fullname), " "); + + + auto *printer = preset_bundle.physical_printers.find_printer(std::string(tokenizer.GetNextToken().mb_str())); + + + //wxString host = printer.config.opt_string("print_host"); + wxString host = (printer->config.opt_string("print_host")); + + std::regex ipRegex(R"(\b(?:\d{1,3}\.){3}\d{1,3}\b)"); + bool isValidIPAddress = std::regex_match(host.ToStdString(), ipRegex); + + DynamicPrintConfig *cfg_t = &(printer->config); + if (isValidIPAddress) { + m_printer_view->AddButton( + data->fullname, "Name: " + data->fullname + "\nIp: " + host, + [host, this](wxMouseEvent &event) { + wxString formattedHost = wxString::Format("http://%s", host); + if (!host.Lower().starts_with("http")) + wxString formattedHost = wxString::Format("http://%s", host); + if (!formattedHost.Lower().ends_with("10088")) + formattedHost = wxString::Format("%s:10088", formattedHost); + this->m_printer_view->load_url(formattedHost); + }, + (data->selected), cfg_t); + } + } + m_printer_view->ResumeButton(); + if (host.empty()) { tem_host = ""; host = wxString::Format("file://%s/web/qidi/missing_connection.html", from_u8(resources_dir())); @@ -2124,10 +2240,10 @@ void MainFrame::select_tab(size_t tab/* = size_t(-1)*/) host = wxString::Format("%s:10088", host); } if (tem_host != host) { + //B45 m_printer_view->load_url(host); tem_host = host; } - } else { tem_host = ""; wxString url = wxString::Format("file://%s/web/qidi/missing_connection.html", from_u8(resources_dir())); diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp index f3e257e..6af9a81 100644 --- a/src/slic3r/GUI/MainFrame.hpp +++ b/src/slic3r/GUI/MainFrame.hpp @@ -196,6 +196,9 @@ public: // When tab == -1, will be selected last selected tab void select_tab(Tab* tab); void select_tab(size_t tab = size_t(-1)); + //B45 + void OnTabPanelSelectionChanged(wxCommandEvent &event); + void select_view(const std::string& direction); // Propagate changed configuration from the Tab to the Plater and save changes to the AppConfig void on_config_changed(DynamicPrintConfig* cfg) const ; @@ -220,6 +223,10 @@ public: PrinterWebView * m_printer_view{nullptr}; //B28 GuideWebView * m_guide_view{nullptr}; + //B45 + PresetCollection *m_collection{nullptr}; + + wxBookCtrlBase * m_tabpanel{nullptr}; SettingsDialog m_settings_dialog; DiffPresetDialog diff_dialog; diff --git a/src/slic3r/GUI/PrinterWebView.cpp b/src/slic3r/GUI/PrinterWebView.cpp index f23cfcf..0bbe1f8 100644 --- a/src/slic3r/GUI/PrinterWebView.cpp +++ b/src/slic3r/GUI/PrinterWebView.cpp @@ -17,12 +17,128 @@ namespace pt = boost::property_tree; namespace Slic3r { namespace GUI { + + +wxBEGIN_EVENT_TABLE(MachineListButton, wxButton) EVT_PAINT(MachineListButton::OnPaint) EVT_ENTER_WINDOW(MachineListButton::OnMouseEnter) + EVT_LEAVE_WINDOW(MachineListButton::OnMouseLeave) EVT_LEFT_DOWN(MachineListButton::OnMouseLeftDown) EVT_LEFT_UP(MachineListButton::OnMouseLeftUp) + wxEND_EVENT_TABLE() + +void MachineListButton::OnPaint(wxPaintEvent &event) +{ + wxPaintDC dc(this); + //m_bitmap = get_bmp_bundle("X-MAX 3_thumbnail", 80)->GetBitmapFor(this); + + if (m_isSimpleMode) { + dc.SetFont(wxFont(15, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD)); + dc.SetTextForeground(wxColour(230, 230, 230)); + dc.DrawText(m_name_text, 10 , 10); + } else { + dc.DrawBitmap(m_bitmap, 10, (GetSize().GetHeight() - m_bitmap.GetHeight()) / 2, true); + + dc.SetFont(wxFont(15, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD)); + dc.SetTextForeground(wxColour(230, 230, 230)); + dc.DrawText(m_name_text, 10 + m_bitmap.GetWidth() + 10, 10); + dc.SetFont(wxFont(10, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD)); + dc.SetTextForeground(wxColour(174, 174, 174)); + + dc.DrawText("IP:" + m_ip_text, 10 + m_bitmap.GetWidth() + 10, 40); + + wxBitmap m_bitmap_state = get_bmp_bundle("printer_state", 20)->GetBitmapFor(this); + dc.DrawBitmap(m_bitmap_state, 10 + m_bitmap.GetWidth() + 10, 55, true); + + dc.SetFont(wxFont(10, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD)); + dc.SetTextForeground(wxColour(174, 174, 174)); + + dc.DrawText(m_state_text, 10 + m_bitmap.GetWidth() + m_bitmap_state.GetWidth() + 15, 60); + if (m_state_text == "printing") { + dc.SetFont(wxFont(10, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD)); + dc.SetTextForeground(wxColour(33, 148, 239)); + dc.DrawText(m_progress_text, 10 + m_bitmap.GetWidth() + m_bitmap_state.GetWidth() + 77, 62); + } + } + +} + +void MachineListButton::OnMouseEnter(wxMouseEvent &event) +{ + SetBackgroundColour(wxColour(100, 100, 105)); + Refresh(); +} + +void MachineListButton::OnMouseLeave(wxMouseEvent &event) +{ + if (m_isSelected) + SetBackgroundColour(wxColour(100, 100, 105)); + else + SetBackgroundColour(wxColour(67, 67, 71)); + Refresh(); +} + +void MachineListButton::OnMouseLeftDown(wxMouseEvent &event) +{ + SetBackgroundColour(wxColour(120, 120, 125)); + Refresh(); +} + +void MachineListButton::OnMouseLeftUp(wxMouseEvent &event) +{ + SetBackgroundColour(wxColour(100, 100, 105)); + if (m_handlerl) { + m_handlerl(event); + } + Refresh(); +} + + +//B45 PrinterWebView::PrinterWebView(wxWindow *parent) : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize) { - wxBoxSizer* topsizer = new wxBoxSizer(wxVERTICAL); - // Create the webview + int leftsizerWidth = 300; + topsizer = new wxBoxSizer(wxHORIZONTAL); + leftScrolledWindow = new wxScrolledWindow(this, wxID_ANY); + leftScrolledWindow->SetBackgroundColour(wxColour(45, 45, 48)); + leftsizer = new wxBoxSizer(wxVERTICAL); + wxFont font(wxFontInfo().Bold()); + + wxBoxSizer *titlesizer = new wxBoxSizer(wxHORIZONTAL); + wxStaticText *text = new wxStaticText(leftScrolledWindow, wxID_ANY, "MACHINE LIST", wxDefaultPosition, wxDefaultSize); + text->SetForegroundColour(wxColour(255, 255, 255)); + text->SetFont(wxFont(wxFontInfo(18).Bold())); + titlesizer->Add(text, wxSizerFlags().Align(wxALIGN_LEFT).Border(wxALL, 5)); + titlesizer->AddStretchSpacer(); + //wxBU_EXACTFIT wxBORDER_NONE + wxButton *refresh_button = new wxButton(leftScrolledWindow, wxID_ANY, "", wxDefaultPosition, wxSize(20, 20), wxBORDER_NONE); + refresh_button->SetBackgroundColour(leftScrolledWindow->GetBackgroundColour()); + refresh_button->SetForegroundColour(leftScrolledWindow->GetBackgroundColour()); + + refresh_button->SetMinSize(wxSize(40, -1)); + refresh_button->SetBitmap(*get_bmp_bundle("refresh-line", 20)); + //leftsizer->Add(button2, wxSizerFlags().Align(wxALIGN_RIGHT).Border(wxALL, 2)); + titlesizer->Add(refresh_button, wxSizerFlags().Align(wxALIGN_LEFT).CenterVertical().Border(wxALL, 2)); + refresh_button->Bind(wxEVT_BUTTON, &PrinterWebView::OnRightButtonClick, this); + + arrow_button = new wxButton(leftScrolledWindow, wxID_ANY, "", wxDefaultPosition, wxSize(20, 20), wxBORDER_NONE); + arrow_button->SetFont(font); + arrow_button->SetBackgroundColour(leftScrolledWindow->GetBackgroundColour()); + arrow_button->SetForegroundColour(leftScrolledWindow->GetBackgroundColour()); + arrow_button->SetMinSize(wxSize(40, -1)); + arrow_button->SetBitmap(*get_bmp_bundle("arrow-left-s-line", 20)); + // leftsizer->Add(arrow_button, wxSizerFlags().Align(wxALIGN_RIGHT | wxALIGN_TOP).Border(wxALL, 2)); + titlesizer->Add(arrow_button, wxSizerFlags().Align(wxALIGN_LEFT).CenterVertical().Border(wxALL, 2)); + arrow_button->Bind(wxEVT_BUTTON, &PrinterWebView::OnLeftButtonClick, this); + + titlesizer->Layout(); + + leftsizer->Add(titlesizer, wxSizerFlags().Expand().Align(wxALIGN_TOP).Border(wxALL, 0)); + + leftsizer->Layout(); + + leftScrolledWindow->SetSizer(leftsizer); + leftScrolledWindow->SetScrollRate(10, 10); + leftScrolledWindow->SetMinSize(wxSize(leftsizerWidth, -1)); + leftScrolledWindow->FitInside(); m_browser = WebView::CreateWebView(this, ""); if (m_browser == nullptr) { wxLogError("Could not init m_browser"); @@ -30,40 +146,240 @@ PrinterWebView::PrinterWebView(wxWindow *parent) } SetSizer(topsizer); + topsizer->Add(leftScrolledWindow, wxSizerFlags(0).Expand()); + topsizer->Add(m_browser, wxSizerFlags(1).Expand().Border(wxALL, 0)); - topsizer->Add(m_browser, wxSizerFlags().Expand().Proportion(1)); - - // Log backend information - //if (wxGetApp().get_mode() == comDevelop) { - // wxLogMessage(wxWebView::GetBackendVersionInfo().ToString()); - // wxLogMessage("Backend: %s Version: %s", m_browser->GetClassInfo()->GetClassName(), - // wxWebView::GetBackendVersionInfo().ToString()); - // wxLogMessage("User Agent: %s", m_browser->GetUserAgent()); - //} - - //Zoom + // Zoom m_zoomFactor = 100; + leftScrolledWindow->Bind(wxEVT_SCROLLWIN_TOP, &PrinterWebView::OnScroll, this); + leftScrolledWindow->Bind(wxEVT_SCROLLWIN_BOTTOM, &PrinterWebView::OnScroll, this); + leftScrolledWindow->Bind(wxEVT_SCROLLWIN_LINEUP, &PrinterWebView::OnScroll, this); + leftScrolledWindow->Bind(wxEVT_SCROLLWIN_LINEDOWN, &PrinterWebView::OnScroll, this); + leftScrolledWindow->Bind(wxEVT_SCROLLWIN_PAGEUP, &PrinterWebView::OnScroll, this); + leftScrolledWindow->Bind(wxEVT_SCROLLWIN_PAGEDOWN, &PrinterWebView::OnScroll, this); + + //B45 + Bind(wxEVT_WEBVIEW_SCRIPT_MESSAGE_RECEIVED, &PrinterWebView::OnScriptMessage, this); + + //Connect the idle events Bind(wxEVT_CLOSE_WINDOW, &PrinterWebView::OnClose, this); } -PrinterWebView::~PrinterWebView() -{ - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " Start"; - SetEvtHandlerEnabled(false); - BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " End"; + + + + +void PrinterWebView::AddButton(const wxString & buttonText, + const wxString & moreInfo, + const std::function &handler, + bool isSelected, + DynamicPrintConfig * cfg_t) + { + + wxStringTokenizer tokenizer(moreInfo, " "); + + + tokenizer.GetNextToken(); + wxString Name = tokenizer.GetNextToken(); + tokenizer.GetNextToken(); + wxString Machine_Type = tokenizer.GetNextToken(); + wxString Machine_Count = tokenizer.GetNextToken(); + tokenizer.GetNextToken(); + tokenizer.GetNextToken(); + wxString Machine_IP = tokenizer.GetNextToken(); + wxString Machine_Name = Machine_Name.Format("%s %s%s", Machine_Type, Machine_Count, "_thumbnail"); + + MachineListButton *customButton = new MachineListButton(leftScrolledWindow, wxID_ANY, buttonText, wxDefaultPosition, wxDefaultSize, wxBORDER_DOUBLE, + wxDefaultValidator, wxButtonNameStr, isSelected); + customButton->SetMinSize(wxSize(80, -1)); + customButton->SetBitmap(*get_bmp_bundle(std::string(Machine_Name.mb_str()), 80)); + customButton->SetBitMap(get_bmp_bundle(std::string(Machine_Name.mb_str()), 80)->GetBitmapFor(this)); + customButton->SetNameText(Name); + customButton->SetIPText(Machine_IP); + customButton->SetStateText("standby"); + customButton->SetProgressText("(0%)"); + customButton->SetMinSize(wxSize(200, -1)); + customButton->SetClickHandler(handler); + customButton->SetStatusThread(std::move(customButton->CreatThread(buttonText, cfg_t))); + customButton->SetSimpleMode(false); + + leftsizer->Add(customButton, wxSizerFlags().Border(wxALL, 1).Expand()); + leftsizer->Layout(); + m_buttons.push_back(customButton); + } + + //B45 + void PrinterWebView::PauseButton() + { + //BOOST_LOG_TRIVIAL(error) << " Pause"; + + if (m_buttons.empty()) { + BOOST_LOG_TRIVIAL(info) << " empty"; + } else { + for (MachineListButton *button : m_buttons) { + button->PauseStatusThread(); + } + } + } + //B45 + void PrinterWebView::ResumeButton() + { + //BOOST_LOG_TRIVIAL(error) << " Resume"; + + if (m_buttons.empty()) { + BOOST_LOG_TRIVIAL(info) << " empty"; + } else { + for (MachineListButton *button : m_buttons) { + button->ResumeStatusThread(); + } + } + } + + + //B45 + void PrinterWebView::DeleteButton() +{ + if (m_buttons.empty()) { + BOOST_LOG_TRIVIAL(info) <<" empty"; + } else { + for (MachineListButton *button : m_buttons) { + + button->StopStatusThread(); + + delete button; + } + m_buttons.clear(); + } } + // B45 +void PrinterWebView::SetButtons(std::vector buttons) { m_buttons = buttons; } + + PrinterWebView::~PrinterWebView() +{ + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " Start"; + SetEvtHandlerEnabled(false); + BOOST_LOG_TRIVIAL(info) << __FUNCTION__ << " End"; +} + +void PrinterWebView::OnLeftButtonClick(wxCommandEvent &event) +{ + m_isSimpleMode = !m_isSimpleMode; + + if (!m_isSimpleMode) { + leftScrolledWindow->SetMinSize(wxSize(300, -1)); + arrow_button->SetBitmap(*get_bmp_bundle("arrow-left-s-line", 20)); + for (MachineListButton *button : m_buttons) { + button->SetBitmap(*get_bmp_bundle(std::string("X-MAX 3_thumbnail"), 80)); + button->SetSimpleMode(m_isSimpleMode); + } + } + else { + arrow_button->SetBitmap(*get_bmp_bundle("arrow-right-s-line", 20)); + + leftScrolledWindow->SetMinSize(wxSize(260, -1)); + for (MachineListButton *button : m_buttons) { + button->SetBitmap(*get_bmp_bundle(std::string("X-MAX 3_thumbnail"), 30)); + button->SetSimpleMode(m_isSimpleMode); + } + } + + leftsizer->Layout(); + + + leftScrolledWindow->Layout(); + + topsizer->Layout(); +} + +void PrinterWebView::OnRightButtonClick(wxCommandEvent &event) +{ + for (MachineListButton *button : m_buttons) { + button->ResumeStatusThread(); + } +} + + + +void PrinterWebView::SendRecentList(int images) +{ + boost::property_tree::wptree req; + boost::property_tree::wptree data; + //wxGetApp().mainframe->get_recent_projects(data, images); + req.put(L"sequence_id", ""); + req.put(L"command", L"studio_set_mallurl"); + //req.put_child(L"response", data); + std::wostringstream oss; + pt::write_json(oss, req, false); + RunScript(wxString::Format("window.postMessage(%s)", oss.str())); +} + + + +void PrinterWebView::OnScriptMessage(wxWebViewEvent &evt) +{ + + wxLogMessage("Script message received; value = %s, handler = %s", evt.GetString(), evt.GetMessageHandler()); + //std::string response = wxGetApp().handle_web_request(evt.GetString().ToUTF8().data()); + //if (response.empty()) + // return; + SendRecentList(1); + ///* remove \n in response string */ + //response.erase(std::remove(response.begin(), response.end(), '\n'), response.end()); + //if (!response.empty()) { + // m_response_js = wxString::Format("window.postMessage('%s')", response); + // wxCommandEvent *event = new wxCommandEvent(EVT_RESPONSE_MESSAGE, this->GetId()); + // wxQueueEvent(this, event); + //} else { + // m_response_js.clear(); + //} +} + + +void PrinterWebView::UpdateLayout() +{ + //leftScrolledWindow->SetVirtualSize(leftsizer->GetMinSize()); + leftScrolledWindow->FitInside(); + topsizer->Layout(); + if (!m_buttons.empty()) { + for (MachineListButton *button : m_buttons) { + button->Layout(); + button->Refresh(); + } + } +} + + +void PrinterWebView::OnScroll(wxScrollWinEvent &event) +{ + UpdateLayout(); + event.Skip(); +} + +//B45 void PrinterWebView::load_url(wxString& url) { // this->Show(); // this->Raise(); if (m_browser == nullptr) return; + + for (MachineListButton *button : m_buttons) { + + size_t pos = url.Find((button->getIPLabel())); + if (pos != wxString::npos) { + button->SetSelect(true); + } else { + button->SetSelect(false); + } + } + + m_browser->LoadURL(url); //m_browser->SetFocus(); UpdateState(); @@ -82,6 +398,14 @@ void PrinterWebView::OnClose(wxCloseEvent& evt) this->Hide(); } +void PrinterWebView::RunScript(const wxString &javascript) +{ + // Remember the script we run in any case, so the next time the user opens + // the "Run Script" dialog box, it is shown there for convenient updating. + + + WebView::RunScript(m_browser, javascript); +} } // GUI diff --git a/src/slic3r/GUI/PrinterWebView.hpp b/src/slic3r/GUI/PrinterWebView.hpp index e79cc3f..97f75bb 100644 --- a/src/slic3r/GUI/PrinterWebView.hpp +++ b/src/slic3r/GUI/PrinterWebView.hpp @@ -30,10 +30,166 @@ #include #endif +//B45 +#include "PrintHostDialogs.hpp" +#include namespace Slic3r { namespace GUI { +class MachineListButton : public wxButton +{ +public: + MachineListButton(wxWindow * parent, + wxWindowID id, + const wxString & label, + const wxPoint & pos = wxDefaultPosition, + const wxSize & size = wxDefaultSize, + long style = wxBORDER_DOUBLE, + const wxValidator &validator = wxDefaultValidator, + const wxString & name = wxButtonNameStr, + bool isSelected = false) + : wxButton(parent, id, label, pos, size, style, validator, name) + { + full_label = label; + m_isSelected = isSelected; + if (isSelected) + SetBackgroundColour(wxColour(100, 100, 105)); + else + SetBackgroundColour(wxColour(67, 67, 71)); + //Bind(wxEVT_BUTTON, &MachineListButton::OnMouseLeftUp, this); + } + wxString getLabel() { return full_label; } + wxString getIPLabel() { return m_ip_text; } + + + void SetBitMap(const wxBitmap &bitmap) + { + m_bitmap = bitmap; + Refresh(); + } + + + void SetNameText(const wxString &text) + { + m_name_text = text; + Refresh(); + } + void SetIPText(const wxString &text) + { + m_ip_text = text; + Refresh(); + } + void SetStateText(const wxString &text) + { + m_state_text = text; + Refresh(); + } + + void SetProgressText(const wxString &text) + { + m_progress_text = text; + Refresh(); + } + void SetSelect(bool isselectd) + { + m_isSelected = isselectd; + if (m_isSelected) + SetBackgroundColour(wxColour(100, 100, 105)); + else + SetBackgroundColour(wxColour(67, 67, 71)); + Refresh(); + } + + void SetSimpleMode(bool issimplemode) + { + m_isSimpleMode = issimplemode; + //if (m_isSelected) + // SetBackgroundColour(wxColour(100, 100, 105)); + //else + // SetBackgroundColour(wxColour(67, 67, 71)); + Refresh(); + } + + void SetClickHandler(const std::function &handler) { m_handlerl = handler; } + void PauseStatusThread() { m_pauseThread = true; } + void ResumeStatusThread() { m_pauseThread = false; } + void StopStatusThread() + { + m_stopThread = true; + if (m_statusThread.joinable()) { + m_statusThread.join(); + } + } + void OnPaint(wxPaintEvent &event); + void OnMouseEnter(wxMouseEvent &event); + void OnMouseLeave(wxMouseEvent &event); + void OnMouseLeftDown(wxMouseEvent &event); + void OnMouseLeftUp(wxMouseEvent &event); + void OnClickHandler(wxCommandEvent &event); + void SetStatusThread(std::thread thread) { m_statusThread = std::move(thread); } + std::thread CreatThread(const wxString &buttonText, DynamicPrintConfig *cfg_t) + { + + std::thread thread([this, buttonText, cfg_t]() { + std::unique_ptr printhost(PrintHost::get_print_host(cfg_t)); + if (!printhost) { + BOOST_LOG_TRIVIAL(error) << ("Could not get a valid Printer Host reference"); + return; + } + wxString msg; + std::string state = "standby"; + float progress = 0; + while (true) { + if (!m_pauseThread) { + state = printhost->get_status(msg); + if (state == "offline") { + //BOOST_LOG_TRIVIAL(error) << boost::format("%1%Got state: %2%") % buttonText % state; + m_pauseThread = true; + } + BOOST_LOG_TRIVIAL(info) << boost::format("%1%Got state: %2%") % buttonText % state; + SetStateText(state); + if (state == "printing") { + progress = (printhost->get_progress(msg)) * 100; + int progressInt = static_cast(progress); + SetStateText(state); + SetProgressText(wxString::Format(wxT("(%d%%)"), progressInt)); + BOOST_LOG_TRIVIAL(info) << boost::format("%1%Got progress: %2%") % buttonText % progress; + } + ; + } else + std::this_thread::sleep_for(std::chrono::seconds(3)); + if (m_stopThread) + break; + } + }); + return thread; + } + +private: + + std::atomic m_stopThread{false}; + std::atomic m_pauseThread{false}; + + bool m_isSimpleMode; + bool m_isSelected; + + std::thread m_statusThread; + + wxBitmap m_bitmap; + bool m_isHovered; + wxString full_label; + wxString m_name_text; + wxString m_ip_text; + wxString m_state_text; + wxString m_progress_text; + std::function m_handlerl; + wxDECLARE_EVENT_TABLE(); + //wxDECLARE_EVENT_TABLE(); +}; + + + class PrinterWebView : public wxPanel { public: @@ -44,7 +200,41 @@ public: void UpdateState(); void OnClose(wxCloseEvent& evt); + //B45 + void OnLeftButtonClick(wxCommandEvent &event); + void OnRightButtonClick(wxCommandEvent &event); + + void RunScript(const wxString &javascript); + //void OnScriptMessageReceived(wxWebViewEvent &event); + void OnScriptMessage(wxWebViewEvent &evt); + + void UpdateLayout(); + void OnScroll(wxScrollWinEvent &event); + + //B45 + void SendRecentList(int images); + void SetButtons(std::vector buttons); + void AddButton(const wxString & buttonText, + const wxString & moreInfo, + const std::function &handler, + bool isOnline, + DynamicPrintConfig * cfg_t); + void DeleteButton(); + void PauseButton(); + void ResumeButton(); + std::vector GetButton() { return m_buttons; }; + private: + //B45 + wxBoxSizer *leftsizer; + wxBoxSizer *topsizer; + bool m_isSimpleMode = false; + + wxButton *arrow_button; + + wxScrolledWindow * leftScrolledWindow; + + std::vector m_buttons; wxWebView* m_browser; long m_zoomFactor; diff --git a/src/slic3r/Utils/AstroBox.hpp b/src/slic3r/Utils/AstroBox.hpp index 72ab273..c6d33cc 100644 --- a/src/slic3r/Utils/AstroBox.hpp +++ b/src/slic3r/Utils/AstroBox.hpp @@ -21,6 +21,11 @@ public: const char* get_name() const override; bool test(wxString &curl_msg) const override; + + //B45 + virtual std::string get_status(wxString &curl_msg) const override { return "1"; }; + virtual float get_progress(wxString &curl_msg) const override { return 1; }; + wxString get_test_ok_msg () const override; wxString get_test_failed_msg (wxString &msg) const override; bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const override; diff --git a/src/slic3r/Utils/Duet.hpp b/src/slic3r/Utils/Duet.hpp index 2a91aa8..24c6c92 100644 --- a/src/slic3r/Utils/Duet.hpp +++ b/src/slic3r/Utils/Duet.hpp @@ -20,6 +20,10 @@ public: const char* get_name() const override; bool test(wxString &curl_msg) const override; + //B45 + virtual std::string get_status(wxString &curl_msg) const override { return "1"; }; + virtual float get_progress(wxString &curl_msg) const override { return 1; }; + wxString get_test_ok_msg() const override; wxString get_test_failed_msg(wxString &msg) const override; bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const override; diff --git a/src/slic3r/Utils/FlashAir.hpp b/src/slic3r/Utils/FlashAir.hpp index ba60644..cd77e7f 100644 --- a/src/slic3r/Utils/FlashAir.hpp +++ b/src/slic3r/Utils/FlashAir.hpp @@ -21,6 +21,11 @@ public: const char* get_name() const override; bool test(wxString &curl_msg) const override; + + //B45 + virtual std::string get_status(wxString &curl_msg) const override { return "1"; }; + virtual float get_progress(wxString &curl_msg) const override { return 1; }; + wxString get_test_ok_msg() const override; wxString get_test_failed_msg(wxString &msg) const override; bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const override; diff --git a/src/slic3r/Utils/MKS.hpp b/src/slic3r/Utils/MKS.hpp index 79143fd..0c445a6 100644 --- a/src/slic3r/Utils/MKS.hpp +++ b/src/slic3r/Utils/MKS.hpp @@ -20,6 +20,11 @@ public: const char* get_name() const override; bool test(wxString& curl_msg) const override; + + //B45 + virtual std::string get_status(wxString &curl_msg) const override { return "1"; }; + virtual float get_progress(wxString &curl_msg) const override { return 1; }; + wxString get_test_ok_msg() const override; wxString get_test_failed_msg(wxString& msg) const override; bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const override; diff --git a/src/slic3r/Utils/Moonraker.cpp b/src/slic3r/Utils/Moonraker.cpp index d2d6ba4..7266b23 100644 --- a/src/slic3r/Utils/Moonraker.cpp +++ b/src/slic3r/Utils/Moonraker.cpp @@ -142,6 +142,129 @@ bool Moonraker::test(wxString& msg) const return res; } +//B45 +std::string Moonraker::get_status(wxString &msg) const +{ + // GET /server/info + + // Since the request is performed synchronously here, + // it is ok to refer to `msg` from within the closure + const char *name = get_name(); + + bool res = true; + std::string print_state = "standby"; + auto url = make_url("printer/objects/query?print_stats=state"); + + BOOST_LOG_TRIVIAL(info) << boost::format("%1%: Get version at: %2%") % name % url; + + auto http = Http::get(std::move(url)); + set_auth(http); + http.on_error([&](std::string body, std::string error, unsigned status) { + BOOST_LOG_TRIVIAL(error) << boost::format("%1%: Error getting version: %2%, HTTP %3%, body: `%4%`") % name % error % status % + body; + print_state = "offline"; + msg = format_error(body, error, status); + }) + .on_complete([&](std::string body, unsigned) { + BOOST_LOG_TRIVIAL(debug) << boost::format("%1%: Got print_stats: %2%") % name % body; + + try { + // All successful HTTP requests will return a json encoded object in the form of : + // {result: } + std::stringstream ss(body); + pt::ptree ptree; + pt::read_json(ss, ptree); + if (ptree.front().first != "result") { + msg = "Could not parse server response"; + print_state = "offline"; + return; + } + if (!ptree.front().second.get_optional("status")) { + msg = "Could not parse server response"; + print_state = "offline"; + return; + } + print_state = ptree.get("result.status.print_stats.state"); + BOOST_LOG_TRIVIAL(info) << boost::format("%1%: Got state: %2%") % name % print_state; + ; + } catch (const std::exception &) { + print_state = "offline"; + msg = "Could not parse server response"; + } + }) +#ifdef _WIN32 + .ssl_revoke_best_effort(m_ssl_revoke_best_effort) + .on_ip_resolve([&](std::string address) { + // Workaround for Windows 10/11 mDNS resolve issue, where two mDNS resolves in succession fail. + // Remember resolved address to be reused at successive REST API call. + msg = GUI::from_u8(address); + }) +#endif // _WIN32 + .perform_sync(); + + return print_state; +} + +float Moonraker::get_progress(wxString &msg) const +{ + // GET /server/info + + // Since the request is performed synchronously here, + // it is ok to refer to `msg` from within the closure + const char *name = get_name(); + + bool res = true; + auto url = make_url("printer/objects/query?display_status=progress"); + float process = 0; + BOOST_LOG_TRIVIAL(info) << boost::format("%1%: Get version at: %2%") % name % url; + + auto http = Http::get(std::move(url)); + set_auth(http); + http.on_error([&](std::string body, std::string error, unsigned status) { + BOOST_LOG_TRIVIAL(error) << boost::format("%1%: Error getting version: %2%, HTTP %3%, body: `%4%`") % name % error % status % + body; + res = false; + msg = format_error(body, error, status); + }) + .on_complete([&](std::string body, unsigned) { + BOOST_LOG_TRIVIAL(debug) << boost::format("%1%: Got display_status: %2%") % name % body; + + try { + // All successful HTTP requests will return a json encoded object in the form of : + // {result: } + std::stringstream ss(body); + pt::ptree ptree; + pt::read_json(ss, ptree); + if (ptree.front().first != "result") { + msg = "Could not parse server response"; + res = false; + return; + } + if (!ptree.front().second.get_optional("status")) { + msg = "Could not parse server response"; + res = false; + return; + } + process = std::stof(ptree.get("result.status.display_status.progress")); + BOOST_LOG_TRIVIAL(info) << boost::format("%1%: Got state: %2%") % name % process; + } catch (const std::exception &) { + res = false; + msg = "Could not parse server response"; + } + }) +#ifdef _WIN32 + .ssl_revoke_best_effort(m_ssl_revoke_best_effort) + .on_ip_resolve([&](std::string address) { + // Workaround for Windows 10/11 mDNS resolve issue, where two mDNS resolves in succession fail. + // Remember resolved address to be reused at successive REST API call. + msg = GUI::from_u8(address); + }) +#endif // _WIN32 + .perform_sync(); + + return process; +} + bool Moonraker::upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const { // POST /server/files/upload diff --git a/src/slic3r/Utils/Moonraker.hpp b/src/slic3r/Utils/Moonraker.hpp index 09a231f..509de27 100644 --- a/src/slic3r/Utils/Moonraker.hpp +++ b/src/slic3r/Utils/Moonraker.hpp @@ -25,6 +25,11 @@ public: const char* get_name() const override; virtual bool test(wxString &curl_msg) const override; + + //B45 + virtual std::string get_status(wxString &curl_msg) const override; + virtual float get_progress(wxString &curl_msg) const override; + wxString get_test_ok_msg () const override; wxString get_test_failed_msg (wxString &msg) const override; bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const override; diff --git a/src/slic3r/Utils/OctoPrint.hpp b/src/slic3r/Utils/OctoPrint.hpp index 3377cba..9577e7d 100644 --- a/src/slic3r/Utils/OctoPrint.hpp +++ b/src/slic3r/Utils/OctoPrint.hpp @@ -24,6 +24,10 @@ public: const char* get_name() const override; virtual bool test(wxString &curl_msg) const override; + //B45 + virtual std::string get_status(wxString &curl_msg) const override { return "1"; }; + virtual float get_progress(wxString &curl_msg) const override { return 1; }; + wxString get_test_ok_msg () const override; wxString get_test_failed_msg (wxString &msg) const override; bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const override; diff --git a/src/slic3r/Utils/PrintHost.hpp b/src/slic3r/Utils/PrintHost.hpp index 1e00599..cd05e17 100644 --- a/src/slic3r/Utils/PrintHost.hpp +++ b/src/slic3r/Utils/PrintHost.hpp @@ -50,6 +50,9 @@ public: virtual const char* get_name() const = 0; virtual bool test(wxString &curl_msg) const = 0; + //B45 + virtual std::string get_status(wxString &curl_msg) const = 0; + virtual float get_progress(wxString &curl_msg) const = 0; virtual wxString get_test_ok_msg () const = 0; virtual wxString get_test_failed_msg (wxString &msg) const = 0; virtual bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const = 0; diff --git a/src/slic3r/Utils/Repetier.hpp b/src/slic3r/Utils/Repetier.hpp index 00bc929..02d6015 100644 --- a/src/slic3r/Utils/Repetier.hpp +++ b/src/slic3r/Utils/Repetier.hpp @@ -21,6 +21,9 @@ public: const char* get_name() const override; bool test(wxString &curl_msg) const override; + //B45 + virtual std::string get_status(wxString &curl_msg) const override { return "1"; }; + virtual float get_progress(wxString &curl_msg) const override { return 1; }; wxString get_test_ok_msg () const override; wxString get_test_failed_msg (wxString &msg) const override; bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn, InfoFn info_fn) const override;