From d34e546cd0f521ce35770dbf02527a4985b7aeec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A9lien=20COUDERC?= Date: Thu, 31 Jan 2019 22:00:35 +0100 Subject: [PATCH] Add plymouth theme for moonlight --- Makefile | 8 +- moonlight-theme/plymouth/background.png | Bin 0 -> 23398 bytes moonlight-theme/plymouth/debian.png | Bin 0 -> 1744 bytes moonlight-theme/plymouth/glow.png | Bin 0 -> 28367 bytes moonlight-theme/plymouth/logo_in_circle.png | Bin 0 -> 23542 bytes moonlight-theme/plymouth/moonlight.plymouth | 8 + moonlight-theme/plymouth/moonlight.script | 1167 +++++++++++++++++ moonlight-theme/plymouth/password_dot.png | Bin 0 -> 277 bytes moonlight-theme/plymouth/password_dot16.png | Bin 0 -> 1075 bytes moonlight-theme/plymouth/password_field.png | Bin 0 -> 322 bytes moonlight-theme/plymouth/password_field16.png | Bin 0 -> 230 bytes moonlight-theme/plymouth/star.png | Bin 0 -> 251 bytes moonlight-theme/plymouth/support.png | Bin 0 -> 8731 bytes 13 files changed, 1179 insertions(+), 4 deletions(-) create mode 100644 moonlight-theme/plymouth/background.png create mode 100644 moonlight-theme/plymouth/debian.png create mode 100644 moonlight-theme/plymouth/glow.png create mode 100644 moonlight-theme/plymouth/logo_in_circle.png create mode 100644 moonlight-theme/plymouth/moonlight.plymouth create mode 100644 moonlight-theme/plymouth/moonlight.script create mode 100644 moonlight-theme/plymouth/password_dot.png create mode 100644 moonlight-theme/plymouth/password_dot16.png create mode 100644 moonlight-theme/plymouth/password_field.png create mode 100644 moonlight-theme/plymouth/password_field16.png create mode 100644 moonlight-theme/plymouth/star.png create mode 100644 moonlight-theme/plymouth/support.png diff --git a/Makefile b/Makefile index 989a437..c4ce287 100644 --- a/Makefile +++ b/Makefile @@ -221,10 +221,10 @@ install-local: # Moonlight theme ### Plymouth theme - #install -d $(DESTDIR)/usr/share/plymouth/themes/moonlight - #$(INSTALL_DATA) $(wildcard moonlight-theme/plymouth/*) $(DESTDIR)/usr/share/plymouth/themes/moonlight - #install -d $(DESTDIR)/usr/share/desktop-base/moonlight-theme - #cd $(DESTDIR)/usr/share/desktop-base/moonlight-theme && ln -s /usr/share/plymouth/themes/moonlight plymouth + install -d $(DESTDIR)/usr/share/plymouth/themes/moonlight + $(INSTALL_DATA) $(wildcard moonlight-theme/plymouth/*) $(DESTDIR)/usr/share/plymouth/themes/moonlight + install -d $(DESTDIR)/usr/share/desktop-base/moonlight-theme + cd $(DESTDIR)/usr/share/desktop-base/moonlight-theme && ln -s /usr/share/plymouth/themes/moonlight plymouth ### Login background install -d $(DESTDIR)/usr/share/desktop-base/moonlight-theme/login $(INSTALL_DATA) $(wildcard moonlight-theme/login/*) $(DESTDIR)/usr/share/desktop-base/moonlight-theme/login diff --git a/moonlight-theme/plymouth/background.png b/moonlight-theme/plymouth/background.png new file mode 100644 index 0000000000000000000000000000000000000000..83151dd426ebc7eb1abf202985d545697003ab24 GIT binary patch literal 23398 zcmeIaRa8~q7dE`23t1I|M075fG5BLmwJM2}Pt+P?S=-51@1kijs$JICR6i z0e}CC@9G=x)qCL{L&x4LW<2wmbFF>OI>hK`DdS;NVFLhwr>dgx5CAZs0Dvlni4L}` zjI_!F026_|yu6ORwKV`h#!J%dbjbQ^w)}0Eaj8Ybp9`dCcnpZE;}eUB+o3XZM(4fG zkAAJ7BP&aartm=V0VLW?7cL7hY?N-{zkH=V`7^A6SD1z0+pyioC-4xabCqLu5n$N+ZTk);5PBR>k0>j= z%9p?V$#Jy;A!nO6b3y_#DRyN%VOK*TxjVW*bnQkQ`9)3S6{mg@jz?+Xf{78BlRPYri@GB9!_7AX>FYP|gU`dvJJ ztSvgf{9I~ZIAHr!n5<^TS|QDB5+bb9Za!c8TZ~s;Uy-JjKemSl+hCoG#+YgZM4tz9zh$6L zU`>bfwxr8Szowj{r=%eH_O$Dwg8a($tYt5Su()`i9*2nv32HL_=Y$mJIyJFD6NFXTmaGZ1K6;Emi119RW09Adj?KhqVT?VRe&{{Kd67M2Sban=^ z_aUAMNCK@v33%?ZJY6Vga6k+b`vK8C^r%)M9pt!>`5e-u5NsW+PqM-v(Y$i#grG{U z#6lr@Ih2)9gCX?s2N+^F5)a752uJ)f}tP?`@+x=6jDgBa7rWO!B!juaU*hBD>dRyaflBbJkNSWwJY0tmy-f}h4J0xMD1;a>a(u%dX3&bpnG1n1 z2B{F{$+sn7GNZ@Hza~U^9r=_|Tm|W2coHL-3f>Q>5Tla{#*Z*u2Kg=ufrvf^oG$FI zk^!iP%j|)%1tNmR+8^VAv3a)B1g#0>M)byeV299K~6$tkuMsOzK1eS zVDms+hfW`$4S$g%KVN^XGng?+;ZweIM2}h@Ji$yhx}LW z?qi)I2Zo8{WDnih$2i47p@>Z6L+@xsO+nSO}I17Qs<~a=)CQ`vxW$cbNovnIJBjW8bJWTnU3@!1qwiRdt0 z!s(fSR)ugTCc@!pF$E?jv@ZmSFjOe1oN##bQE zqjp2$ht`JIhEhCu$=E?uL*zqrL|73W6^-^y@0-9J%bf5W_uTy_v^!*9LXKmOUmeGW zC*EVeqbmC_L7y3~J7Pf|n<*mki3<8dboO|CrB95)iS;Td@A-ew*hf?_3$a$S9IfesTiqO&*i-t1{wVmF1j8p zkS$>DO1LA7$7Co?D@!ZzFpwt>CUSN?T990j*yVIbIl-xWg?x`0JC-Tu-aQdgj29Rz zP-3N+T#9?fNla>J1tC8kQ0BbUUApI(biW5{@x`vfNglFJ>qkC)QV#sL;cD_WdG0zV zALT}^M)~!{KT$o3mxysts>+wpUDhSnA=j1vNHpp-syRwKdViG0f$o5`>ZQqplDz4B z>D=c0puEc*B&wK>yqITqge22&`lIg1#pY5zGp=MZAuEabB~P8(KVi(JT>mH((8qbhq8ayw_4+4SJD_ zTS8jmU!q)Mu_fC>+C!@d`O~&xnP^0l9A5B5{7ZllW3iY46=(dTR);4CS~gSFj^SCmGYPQ->Mt;H&8aL zHv|sJyzv_1E+Q{traBm1jcBlxzq`#HyS0g7W#DQNeTW-rrJUqXx zgwMHl*Ls@bZvmwgJ~W0gpWB6JP2B9JKAj(vvoVj5M3!0-gv`S$Jv9OLI`Ig$~4(_#8D^4{N0_MW6}UtX#$IA-qv^X zj)+&scLFe)sb!!op)HXuG1+Z{v*ZZ%W5Z*gW9?(Sa~EU<7-2LjM@TG#EFp^u(E`>d zRHsnJ)(lH^S5^q&Ip%|KS2-@m)Px6JETqJ0n2X^iZK`sdxo?KlDVT9doC#U61jCiX z72DL?sAfs5!Vu}0MEnZGiLbge-;;cg5l~>sL)VRerdG)+K|B>L{f*&?7=Ln#1{fTo z*l6XLx8MBc*q=!5NPWo`Q=qv!&7?&_Pn=C`K{!J^7DN4QhB-Q%B~ev~m{&ELS@reZ zqSuwGO3XN~@7oh}r<2NJ-~FEOT9xv>)I*|GilWz}vJR|X34SW%s_pOHe$f8lTIIJ- z-H+T4*?(237zvj8RE@iPuOqr~ze*XuDpnU^e4I$zz4cVaolpFAhU~QR03-Qp^)9jn zzg>HGjJhZ(6*|`VH`}k5yR^G_yIi`nyV4h&uwTpN=&(4eK zCd4My=B-Vp%^RC^vhQk7ZR{3p$gJKzdGzGxQ{ksomR^=#)(6&jRL1l|pg+JqKtJF)KssReia5^m)1_QrfzuJC%|263S)+xj3#U{}N@dS0XSG8s} ztv9Y@MCO~!0iNzsSZS+smvi@4*H$+jjBX$cmNk&o8I;nL(UjE`(G(j94NM6Py`Vdj zI`cTJ*|7K>Jj_6qrBtxJ3EhSY}GGp3_^N6bewM}k|Tli77O5JD+tI(#~bc+z-*c%FF5c$9cH zZ3b;pZES7)LB=fiED|Xvsryp$Qu9(HQaDn)zS4;2hz-OXj;KQ7&wn)UCh>8t5D%G~CaNzU#W?Bs1N>niJa>Dh*Dchi5P zZ_nCAdF8)NeE4-PDoA2PpHv})@d9H%4N!R&sECB&kf4e&25m| zljDt$#=am`!qyA-4gVfa7VZ_^ACVaz7||Y15>XKz8^IZo9^Md+5mAOSLlVSvu5=uW zpeHKEOpnfqPKy2%og4isx!j4A4U8gptM65F9BMvS&R`f|=V9XEE#-FR+2Yz_qhris z%Hj>uXf$s$Yt#zi(jM2tv` zbc}9H193cyxq3k2@8oal?kX=-dej}%O;qYtw%)#ct?@>R!I;BWZnt*=w$n(PUIP+zs4_>IN>8t6g zY4@o0XmY4OqPb>yqI&Dc}X#RT_a zcVu?~_cZqJUBBHQ?9(Vz~1tMqkyC{b7-T{i9XGx>AA9yQYh8da5~e z-zvY&{Z#5uxRyutk*X}M#81EKL6x4D%0cy7=-Q{XNUDdgG&NN;A81WuB+Ml=DHJOFT4-0eM@Y+l|C#AX%CONdqp{z=m>qT<)Eph`O&sbSBcByM zqZ=w7dj4x;q_I@|^NHME?46;!XIKv1_Nxwm9DE%WpA|UL{`mA$B47BUm%5|5<0D5s z>JrV7J0k|eBE#Ol@JHju27XGHPQ9Nhx&P^YepB&<>RB1Sv9hePfwEzzLFZ$(hivj6 zj6P^B7Z2EEs%ElDYKiK&#f=2kEs7y?^I9j<+3)gUb=QU)V|`j zrn*wJp1NMQ8nIHaLOc5ThvP`YM;|>GbC*ZkQD6jlzkd9fld^8TKU1FH9?p6I~B|5LcS&T$q^}o1%w$je4AV zOZcU5AHS3{q^EogQ9qk8%h|rIbnk9jVr^ntVqIdo?nm8Ex{10ax>3Uk!?gK|`SD5< z9Z#(vSo>O|SSwox&qL;==H2IQ=Y!_4=6&ZM&1bWUk6?B#eI!^ zO#K4=acP-C>-^M$>4N??)%J1x%K~;Oj_DIAXDQ0*cIot@GB(q8($1G%=Orh+IE`r8 z5ycVB5n&N6ilK_liUo@4-&tZ+V-;iL??@(dCATH_Bo`)^Cg&!fam8{|a}65Df!m={ zBWI)BlG@_;#g!$`OU{euirq_kN=!<4Os1;+91eyZI@7+J{5JVM-Zwra(I+u=8ts+u z6@TEh9`)<m;?`bV{yZVhuH^VM^Q?X=rG@X{6MwXH3>)vQhPrRk-h zKY`;H1!s{M17S1rt?l31r|!1h?alAY@1OtLS=p%`uc@8E*770mL(zvQyZ3h0c6D|Q z%VdL;gN9i$O_=7P<~`<1=H}-7=Dy~S%3ZonX^reaX%^`Z0q6l+$6RLtd*4rYPdJX#j{T06PL@s$PQ8!g zjt5RkPcL_@cS!a|_AB;q5b8Uehmxyf%RUp^sWW3uD@~35i$`f2UNh8HqCPH*(-r>8 zhtj_rs(mK1*LY{kHn-t}`!mZHbHU@mL%}^)5m&YVBa|+O%90XJoj|BVF+?~-?J5Yj zhb_zMGic`os7k`mTyZ7sE4c9f*#Bj-rn8kjhY4PE}5e zh6rm|QKzSEq<~J3sF;tWbts>wS6!Vr;TCxkbqu!4Ys z=r?g@p{Kzr#$Blivk4fCj*ODI8@Ug2Pjmg{+T|T0TFYHX@J`D`*^(oaetOVpfw znrWI>TKrNaz~g-J_-w~z-iKI>_$l#A5-E~7Vr&vB5_IB1Vsn<~EMHmGSl8IiS)^Fl3M2|77j1hU_SkZ;KjM1C_LD`JNm#T>q>Ampdu?wt+dfGs zMyN?>ta7C?v@)`?xw65Y)4t{C%jTPLyUIZii^=A^K+QAsqy7#5bo?LUBa0*bBNsp3 zjHv&3JQ6iRUr=V3BXBIJFZf(Ag))_rjM9v9o-&qlMldEdFI6IyCp9tkB=sOQFjX(L zOt9u?*3(nLG13Ho=-h%1NCnYq}B~Z97XO< z@J$FxN}uT*u5RRRVEmzXPY^#B|0M1$-YRY^{z!aEyvE&p;k>6{No|p8*>90`iEhBD zn|2^D>5QG=jq>0~pGP0gU~li|-u2$}9{1avF z-N^08gQ3TvbKoxiGg>^hG%bvdP$I_*b|SkF5{klxZz{#-VY$f=kZ_dK^I#&35u<|O z7tO|f$TIwM*hEA|1a?Gn1X9Fm1X;u~w#yx9-bs!poUhphICnYKxFyUzt5=kU9}dUM zb49(!r=;H%PYPIB$rX(1z~`nLzgI}AeutXOpNx&{9cc}DJedslw3vo8m+$YD^0C?X z?aBl-^mLMq5Xd~{BIbPbFwyqiZsj;yagT-5L_6i6r1E5ycPUB7$?ubsl0B0(lB9V5 zNc4E?AAUU1y~Cdrnjc+l`!xx-u}J+rKWRsKA`hwoFq-W zn7M1?&T+xKN9UOOmx4BsHO>WY1>Xxw3i1oI)mq-^_E6Zc+BDk~+1S{a+0^uyCtt8H za~X2guoLhMvX^nv-^*qXwg~x@WBAN)qbRyWOn>+xzsb(~C;6`*vOlsn0e5U=U-P~; zxPRUCBKtU3^037H1Ld+sGj$#vh!-%g|XQ)S5Z%Odkn6zl5+}6G! zV%XS3sEny?sJN+6s4J+}sW7PQsK>PDv|eNiNv#G796UYg-g@JsRVu=mhMHcPW|}^i zu9hZ|#+qg>i**X zul>pWeM=cjB>nHw>4k%x7;99jQfg4EpH_`l;Z{pMJDF5_Zc~|7eOj~SQsPAWEYtB~ zRO#89=YsYV6Ul!JMnr~0CJu`-hj{)t|Ja(z`eQyJJtRGLxr)1kJO6Su6)Jc(IGRZ* zwFmEehwmPxALXm8qwK9L-?B|+^jvc1t=VK^u)ewP2HNiTP#TCj1? z(#~VKYM@|X#>~|0lbMzozgbknfTyNsNe0UD@t}RChvYj*>Hg%2htFV1rgAp9xQpxb zQNZcR+TO+T@<8wwtCzahV^6^bj|S?7GH;pH%VGI--8HwBm^Jayk!iu{iXS+BXns}x z_x;}Z_xk($Z65^HLR%QzTKDB(5gRycJh*0%0IQ1lChelZX5LR_wPj5%dE1XFldAZRI0D4@gV>IWZ(?ZOTfr(@H|r+8S+xEg+Y>`Z@;4-0?L zk#oY}!RJzL@A?$+2fnR7`A&$Z&Rnfg->>NG$9_TlJFIt<@A`Q$ECyNv)^=AG7kek< z8|6*px8%F!$>hl+w+I58<(irNzn`idzis0zG3+QSHjOCzQMP7rP?zRbwY6688OKmG z%D%m)U8~)#T{&tHPaCg=zBQgtsZTjn8Cxk$xkJhPWvFheZjTtHC?CNV(03z-L&D)wr$pM^aMSPD2+c2 zE2TSAT-YPfc2Rn+c_r}8S>GAj(c>-c$zZ|Q)VC?Z*?5`U8TSSK{ST*Tg0%bwY=~VzkBx4DZw?E$`hSY{ zenxy+`Si!(x5JLZ*jnG(Sj~pZ&l$f)&0znz&6SC_!lP*mX+KRy$A_z?t1uj8rrlab ze3#F7md*AWVtgF8v9=edC7ZP&7AKcK&b}W7%U}lboe-YquE;M(`O`NCJ-zyPIlO1R z)cJIl?|TBhz8PK zogd=N#!ixV^2S(vYQYUOKE)0syKvYMo^$LT%PJ#ixjgSU)4X~Ns|j_nYo59|JdvF6 zsoKt(5o{3+Y}vWkM7NR;YPY}Zn{PY6*0HC#Q24Fzz_!nJbqTgK-@i#OC!-M*ekpdI zf7Uq}PcP#eymoWDKtwe=9i&Ry)c1Y-bT<@}t_;4#6*Ibr5ZxifKfhbN%0>kBf? zi*$P@8-|2?dq-#mpxoXmP{3|)03vk0+dJ9tf5Wbk_y@=hAO11q28Mqra|6S_;&21Q zzv6HU!@uJ2uQ>e6g@3sK{970PtqZ`vJ<<&c{^i2IT=I6eJDezd@lX&yAf|?bDxaBhyrW|nn%RBJ; zclQs2e>}KJg@3v5uO8eG;a^SsR}=r$#D6vM-yZ4z(MmYi4*tOi0QMQTJ>km3re&Q~ zSaY6U8f@Zay#Bggf346+Vk2l;vt^D}<_O;M^XSqF5iIx}04Tby&jRSbx8Jr{5=LKH zI?SG!+}-0M11Eh<1is- z?BvV-UKtJmlzStC2LZ|g?0g zgLy!EA7aA5{~gUzJ~oj$@Wi z9^bE(zhPY4MB$_P3t2sQt3j$ifS+rI@U1r6TVBPviiGC^lmJkBW4)srm7VrrS<~@+ zp%apAu!QtUTT1L;WlQ+NNYTPbbbw#nSJkHgU_^jK0RVTFT(OTlk&m9q8N$#o&rMvV z-Ue(}To}trr}9Z>$chAlaP%^Pc*4?63F4fhP(D0?}obx zMt}}PYXaziH^h8pacid55TL)=8|@` z`g(jkIcMJnk$LnSO&9>muK9%!C1>@{{EPz>?|xlbnVegfWuEGIyIuFM2 zmPxk@V+h!yjz+#Q@dGf9Yb=mr8UVntZY#ZX2ftlpm0N3t|H$ zCxIXVMhjjWml|`c^#`6Wj2O^?kD*{1@Ck;H1JFn27&zYm;L$ZcTS8eCl9-L4?So$X z@*xl(9)19*AqIPR?&*qVhZvZ+NaHvWf&$^GV{lQ_xux~8(S>^%g@c7rNH+ zd$I3&xv^mdFz|q*j4IU=$3EEt0Q@Y=%BRfr&yIt=8`vxj_I=Fi0uxheGid(9&mVJq zK)Ec4gib`hpzpQFoXE4J$MfZaQAp4iU@F4aH`=#I{W0uzk->9CO-0#O4s6rh3xiUjRU zSwaIDzAfT#+V-0={12O zigzxLd#F~WxTQ+sM7VK*JrFebj^rQvyfJ;yM_@8QGO)c8v9*l^Jp(;=?d`We`LuW` zd7QQex&=+$ZYa~hp+~hEX#)_Fpa%oa5(EZf+QXoG0Hpo?>1-w9{htU+&i6=gCL{`| z*NlqRmoaQRu-B-kDWEwx+gsVfgpnH?rQ971tYe*|r}?$o@TN@}BgRcrE5JYtKxddU zo6+6yy6Gt%99+hZZ3Dis04U}A4dP#}HP!xsl$PJal{E!r;MB{L_=88rpeHeHfC5-5 zb+-ErV;ToGKzjl6Z6R#>O!mpRY@{3|aIn{;e#|utvftwdNVht+Ng|N0mmJt*=ain) zr6~@(8}UXtj=Hts@bfxaLlqPlCy0a8nbyi#-?Z8BwNOll0Q#q&S{v?7R-f^0NLc|{ zU?sF%O3&DSH1Oow8`zfAZ1F_!3`Imq9J*x?s5gG5F-ce%qjikq8VYFoOWorDFHiio zqAwCu&`wanq>r^g%GR~?l!+j({np1kXY8}9pzPWR(7c26I2vD!k!#C=?ec8mtc}9( z5z=r?EELxmup1&jy8#jrfPUKi5MD90_RJ3K0I6rRJk{og5S{{a1}ImN$z*9vzk_aR zhH42Fp2WP>W)wj`NG!sFTMp)#>^Gc?=4_rrG>dClRg&q%(`d7+TvosnA}G?GV6>~I z4qx)1>(hDgv_QhF4LO8!U}e=X(8~&-aBU(7VmC$2UPlL@do=B`R(~-=9|XI#&QG+&6f{aGD<_JAVC4^-<#{#$%sqUCxj)X((3a&2ZI7?wx?7qJy< z*Lu?&K@^U(1~Q=Wbj}EIjS>R|IGGNa55~z8gmF9OKn$l%Q&4G^9Tx=w)?U~oc@1m8 zjkPM22`lwU^? zXL;QLR7jYSPgSRnR{E+z=39~O$OGtW&G7LO&+1>`)&`8)7lG)9$pp?VV~X1Y1n3`= z0NhcQGE>UaG91oZYoUG{V~RdA>v%N<4&Y%&5nS9H*}Uw7H}Z^sdS=Ok z%!goWe}JeOzwrj{y%_j&^uuI$=cD0GX>1fJa5q3#dvCQv)k3fNS_M!+VW{ZC?loWf z>~mg-G8PQRZAfPzd2M4R(=?ZwtR9!4z6Fd9DXlb#gS`9Jo(Dak@<>W?cHz?kn7n# z0S&ZRMsH68r$mxpxM#V@WUa1CU8g1hMGOq$Wf>^Owi0FmxVjdT>ie4=5vYOyVrl49z?=uCJj~nk_=M4ZKr3h#diqX|T^G~bK8#iXyead|SfwcHb#k1KrTCVa5Z(XHiR z9oBz-?B_;%`rxk?CwyzyIG9sRD>VVGz8VnOv#>IuJ#s5W=gs-Fm*I5F^ov#4ynJ$mQKo0~n5JMSx&QrT#U*1bha| zh*T>duKls!1J0eJ^@$r#%Do#XCWZP*Lq!)Su6MpEF}E{-7S8PtK4xl}6u2O9+GorQ z9$FYk`TP|>xhjS3@-W>{A+{C4heSc=`(UkM^uNwNo0qKuHV@YyPkd#n&-|r;(n12A{Xm|=ew-Y(dc$7myWZ^)9~&{p z^zi@#*O=B44D?b$=SP7nzSUIK;K|7A3B6im)1AzTdvB38fvS zgo;b@LaY^q*6#upuk8Xjvu3f;IkkDx7GUGf#9;kn1hbN1Po4@>BA! zBIrp#S+rKs)N?gl5wgA?m@uvt)tdBQQt5{`P61h*1bK_`ZXC7Tj(JvCsFt5ZO3hX} z?q8oZ2QS{k`(%x@WAZK{i<6cg-vSy1+J*CmKNrB=()FbiCQyEOkci@HPUOUqLWKp> zZ?C+Cqa3x)-gCl9fK1~Rs^#<*v;Fuj8bpuAQ1YWRD2Nz;o zW0g)0Ez%ljdtAtTdp#q~f!U|d>tAjL0Ah(4%k=_MHJY1C`QI${TKiN1+bp)vx%7jF z!hiL;zLC;-r#-}_*LqS6FFeRW*dg-;2RvEp`Lx{FPIn^)dbU{@nqJ8MIk(ri6~Ta% zf{_&wNgTA7<#(%PDG_5UQh=;cbCU=4F+qPOs-<)Ak8ZoO!(V^nDfQS{;3U5|${CE+ zq#Uqx#75zGO9)`P&F|S33*fQ%=Udt>AD|{i1pOtbmRea-r}lGW|Fu%lmPAcIe>ehm ziXx>jl|guB|JSD|W=dct=jwQ02pQ3nO%^$N6lhF#Ya2{p5vj#F-G5M|Dm{L*y5wMp zlNBi2SG9C)z73hISfDtY*jta#^sjU#nC8?-5XD_8C{1AI_HA4UA5)@EW|CxByRK)z zs|cZnu#?;R0<14&zz>L^D80jD|21V~k~9*9<`YBbFD4`-EtdaA+qD&aIKm5MU0t(26jHZ50M3o+#5S6xcbQ$WT1z}a->CrRlP!?8TL*!`H%_Vuv z(hR_Kxka&P+y8ds1?~X%qZn(Q^c<)N)ND}UX$y#SwxF{C>zf=0WUD#|GafcP#^Xjc zlm|*f5Vt_WkQbZZ%7nwgBD>A}*8oB&p(z2|wz?h;Md};2L8HK4Zc>2>*L_mP4GQ!dw3L zJQxl?!Gy(MGWN~ZO!zU}x^BsOM%Z{lAK><6uT+DV+B_KiwFW;9GSpIc%N0cgz%gM>G(zNcBhQWe-UXk+wz|BPEWIyx?5}i zn4kv@8S#fcBPin-d;|OYU9G+?ZfiCR@Gb_fgelDo1YfDDno-i;?u)^^QD-X=IwL)TQ8sy-HeclD|M#^c9K>{g4WOY;0W)>R|dD;u(rjJ z!SlpH3?4>EfdM5nsw^0B0)2Md$&f4sq{)cT(-+x~k%tje&OIRYdswhmuf7#4<1X!d~<(cq@rz4dm>e`5fUzwGRc zV-zckieuIQya)ag-1W1&G(u$h1jdM5?(sJ;P-O*4ddP4K%KzqiM1!N4P!N3kHfv+z zEq`&yI9x^vUZ@)C1xFhriEYpRPbxxTF#tZe69DgDx?6yjNzj-AJfFH^#6v9(6Yzb3bFle%=2I zhPuwW$%+HAD}Kwx7z*mGm~zyHsv%!uF>TZ__~sR_JK1*i|Hk(U(YZ|&Xl9{1&otaQ z4MY+fLkQfNIwQGFJ%G!cF2HGA+G$tFb)<3es{JuC!U(2$ahvYImj$HXPFH2c;RBy@ zEj9~~AQY$Wzg(sx@NV@IKC-B0^eO6h%uPSExoX(t3=TU1p6=W(VSrKCq>{(oz(wzc z_~olYjsIk>zm4ze2gUK@osR+;?JhGumob0UeXdSNcb?G1Y8~87vJf9zcRpLqX8Ma% zh?MNa)%uU6`IgbjJ#CahI;h8SKlrA9b3uFE4f~PAqTu5F$w?mjQ20) zVDQ{uTVxg8+ovx1@B;2Y_eQsyFtGkwf{>_NU8?qXpuf((iQp?v49vehIyIBt>hrYC z)Gk;sU#VKqdd&Z#ui@O(@OFqkv*JJB?{Jre)1C5E{ihAKyLdPOeg=1YJ-Pn4@8$~q z|K45BWYKnAcj4~VG1~2)EP)G)V-Wi4yh|84*O#)UV_9K*Sz+w6ddh#Ue@k{^2WYOk%Y}njw)9D| zEISDCO)R~?zYpMQlT4kK0o0A6Xde=Ad7I*AA$c#`prnMVNlg9Lu{RY8wy&kIqsl{d=bi$><6C<4CohIIl_YRmk-Z8DOb zHRzUbS~N9a1b*8fe@FypL?7_oEM&6y6+u6oXxv4U%n9II0k}8l7~)SsyQVwPfNu@p zty`xz0lZAwW{MGrZ_v+=-Wu}wR#E&#$Nk@T9BRBu6~hxp9tA|2-+onE~}0}_lyBwi_euwibmLGh4O7J zh9;0_Pch(41$~0Nk7XsXW9SGfQa25Oog(klu?YZ|K{8bZc=`Mky@4W-Z6u%TsotUx zSM@6l`kFWZZ6au!OCD5B|6p?t2U$ybf0vMBjR7>iZ3uAS`J)2hC8gM|iif*yh32R< zJ#m{?1TOJZ&s5n{(8uy@iI`QkeJ6lJtc8*Z(_o7OfNN2sKw>hcQmCJJ-4lFM6i_%= z^r+&v2D-wr>Q@liyq?EAS@@T^k4;}=roD+SFbb%&anMg+4ewKG{sYT52>ZzFMhQa% z$qYZuwE1i)pIyuQKL+m^I4F3a$N=MBqq6&!2s1P&tZ?yQFc3NBjUpfP3!!?c&((@! z@-DJfJ6JIQdJQ<8BfpJ=@fVtuw zbM)8`Z?qU_?s))Xh5CC&x%P~KJZOobNfC)|ghvNWBfi!Q*yJX8Wb6u2XiHkm+6D#%xs(MTa_|Cv`1fp|={# zI-gu7tr@X&xw25vqQh8th=U4=>)P0{txZ`c-4R10AB%>{*Nzd(3G`D?QnQLx_$mVG z4VEQPUBJi3h#(>8tL>*3=Qt?G`u8{JZ6Vxnp#X>4z^h)(#HsD?a|FG~IcXE>O_VdB z36WcvO4nyWamA%p8$2@!wM0daHSv2nSHNwcUj*QPI769}fJ;>BWX$564Ie?)px0RfndI0y6iw0q{dj>+WyG0>0zWCilrLcM;uK`+cVBa3sarF;B?0=W4>~6- zW~LlnItWF1(5aRHkxMI{R^IF9+(NH^Pye zB{R>CP>_vqtDC2WB@7kTa*Qa@|B9$yl~u1bMy0eO;MAG1RaGyC@hD^D*5XsF#~0`X zsTLvXY$$~TU9ouE?vOsuQHFA%g?KQkIa+#`2=xHW(6Sj)ShCqZw%;pCq>dm~xUd0^itf7f zjWXRk_I+=ePO>T?-;xU@F5&$*@RHdt^cYiUG`)Yd*Vf}@SX~+Te?$~i>`?sqf*}=E z)E5Ts%3MHv{&y)Z;eveN)!{&9nP*ThJmk7}!%15y&rZ>qK6dE)$Y?nW7ql5V6y8iqzXhLr9aa_Ej1fB!G< zhr4FYx%cd|_p_fJ=dN?3)KvkvSQJ~6`v5)004yAyw9Z!0O>zJ?-9-)9R5algvWZsYb$RD!mQc}dI zveI(WC?r}aBqZD>C?s+m@Mm%D-RTM+$)!?AQPF+suNK{^y}QdsG^w}zJX|b@mWZ@0 zBHSy3OOeON>mU2skl9R-i968?9*~K?7UuP6c0Kb8&>+IH{Z+5B4c4C7F{DRAr4VQj zE06KMeOFtW34w6(Gjee~cAQ#i1 zpyzx`|2TwTb@ru&wJm^ zzD{lQeE2}Lr-&6@%HuY*T(dV8#XX_iVvfa2OUD*pB8RV{{B7n(3K%cO5{+ACBXuMc z!O~ng+Q39Pu~i_Ge4FNViQMyU1kqEf)ky$Fe_TE!G@Nmq{rmU5->2MNrjX%7fBA4! zo_wO8(ia6VT1&CzY=<|{3pE@i%gOI%d3j&+h+yGSQKzPeAEQjUCu+uWpH7u~2C6Zb z4E0ol+L=WJm?WG*HKQGRupiIFY1Ln>*8(gs9|WTelzk%~0@#yiY2ujD*El=Ur6hik zZ_tpF5&bbAc&sITcDnC4|M{xC{DKCXo&qsYe_{TX2@RnLC-BHjRJ0@A!=pj%=&Tx} z)9NAs3Kqr;?CYxxIP4IgkVklTi-5CqG%9hZORgKx`*u>Q0DHH%cIF4l*4rl57y!EA$_Mhy{Tc97--y z)b9>83vsjpS=7-fq=>8#?Q^g%0wuWSwxMJ{5vB|Y*#jA?kpwzl&msD(H7Wh#bwczB zq;x{3?j-U=rdh*&2z=&94Wh+Bf%8zb3|s!;fN0QC{0VF_G$QgSQ9*l8OHvTz7Kg~w zO)jJk#(gn=bZ@D44ai$EPIHfS@4I57xI9kW!5zZlg$hng=?-ieSe=u-}P zU7*f5+JZE?5VnXksStjPG(HT~FNX#vFlLRg2`9XhgbPQ$^Ia2KUnedX9#f}^6Qy#n z=o-gQwChfsCj6aFc}lqavtgFtJ@Hy9E@&^7EE zwDu5{6XXY!FKdExXaQY#DAHV^q3W;Dx<7bEBE-}3$Oe6;WBG$OL8}^xy%FR|=dbW8 zPo_H#<1Jd0%#T;dKf=xFgcT4qLlfyp6mTa4`RMEw&?iH1Xk`Y-c)~_#u?Mhf!tLmM z1`u6>4RXZeD7O&3KCHxX){&k?Aki@qBZYlfSAR>4+biX)j+BVPC{r>n@eX+b-$Ghg zomvZlDl|GrX56$GMFcJB!?rr37V3Wg45WS(#Yeq zZsaXUxH9?UWNyf5fez9Mv~AMEPXGGJ@yYX~2a)f{)$(p&Ek?O{rV68ix&?wR@?orvFH_xF5s!pcAc zcHXbQ5yF>1AnoowA-Ewkz|!s1c49Zc7wlGX;$6bZ4uW>?t~uNwE#c#L%baL?5>tot zuYWmtD~7rn0$h(c5qm)KN8{|_T-QBedBA%@2ng=zraZy-#9j#pz2ZU&>!d%yAPh$B z3eTZydew@7h(bjd{0hMJiU&hDl>P&1ZtVC682tr-JjSO`)NTsX2q)PlS_1-V498F! zdW0_7PYq=4cs3X}_&3-$#J^IVlKc+3iMsiI6B8Q$ z?(OT3QkrpEZ*d31wq&sA!{WaxplPDL2W!cf((%W)C?FSbPrk7ZtCJI)*D$`Wc;?r+zs4t1@zv)X?-*9q$6}QP`CXdY;Tg zJnXX@y$Eh*)R;7B4t}oEcp;3%jjDxU`I`d(l;<=42vdTYUXXbs`JwyaKO(dR8p(D@ zb;x(fRONT%1>^*nA)rNdnJSR6gd_LF5d4Y!`j)$fOzs ze4j(pIp#Q)aG-9C^ojb?>-Wd6_wkSYrm5I# zweH&W=2Ik34KZX+ux^*_`sHbnCu=M63JE;yx*vU$;q>%|*q2EH-#C)9D`nI6~82f>50;f?hWWh?FRS35lOc5RU`^aPz@|i3t@kwnO#1KYn1%O&C`qdy7Nl@QMkOHxv*m*R9k| zu})+fa*~cgz%5G{|9wEEfT%Z$N0u=UO#^JDSjQwnxEv|*hxV%wck)l=7v~VfL;|9c z{&;V^|0;Sa_B&fh_6@@dy($q6VK$-ht5w3;D9S&pZzDq)<3I8da(;|_`|$@u$&b2^ z@^7(!h+E?irV~qHG4#g$_()zLrb)0zR`O$7%7)23&Rc=>V^4weB-JF_9=CPsMfgR~ z#rHb7@RwAds?2cyBWw_-MojN}xsm|gmw2kdV{=ItF5w>;QY(NlI?^9X10-ACXVxz0 z%@JY>)J)(6_>bKIwE@ln$HDA@^eua=A0Kkm-!Bo1$OY2_Gzwwr-`?vG1ENKH!Gy|D zd2cl*-!~`H4{S$uGgdoVjr0VnbvzW&6!m!luWD{#o%e%V&zuX?kNd1}4oTJbfrLEE+|4e{a818ks#uPivzv%_>yPO}7e>63 zFOd#j9grQoJzzU9`%7AGTb`{KpovJLRH!ao60C(;`bPVEDS$tJLE~E8uUOfJm_I7* z7FucFy!dQ5lCB4;dR7XBiY3;Tbv^V;L(M%41ez#A9}2^kbT1-ea%F zTr)_80m6>1V=fZgzP-2c=jfzs-Od`#p3Sn&TTRo=I8AKL8BMLtKMf`f-Wv!TL^KUG z?KkT;kGbNye0N@6_wKC!Q$KW>Y8yk@rLwiN_Ik_GiPhQGHQi;=8RB~H3UFd}f$vHT z_+>znA*qm1A3)z#wE5WnY zGsbh+lhSk1)5kNyv)>DTDzRg@{y1GHbIK;uYb-*qOOQ!+Vw2-?rtRW(pG>No`Ngb&jEq3Ox)%kDSs zHXaR#?udD&f98LJJb-VEPdav2Um+lQBBllA1SSSX2WABp2G#~vNfk>4OBG4wN~KDL zNI|5kI<XGWLLeayjuvdxv=^x~8VoqoX$}!R- zb0QNXOCxh5zehq8aumJ|NW>%4_sdbpF38=<%F7-{iV=Ffui-dTB4!+-A7W;CU&>a> zX~VwHLP1Nxp2nn4>upeHRA*SH<|ca)3u}c%!&+d;WcuG&m}vW6eInr{t|d8tWft8V zZ4pTlofMNvd_YV|451TXXn5Daa;0Ji$eV3QY}72(6NBlC6==`lAsg5+x8N5v36YAp|oT zDf!0FCI3-!QHWL;QnFFfS7=ck&}Z0(w8_7Ty;(&p9j&COrKq8(Hl#SD!lJ;U z%JOMHPAf^PRtr3>UGlNSt3+4RxZp`~vrxEDu8^egvY?`HxiEF|bW(3JqR_VBOMy=z zpa8BYne5N-sDk!`Zun$KVW@bBY;bPab2xPH?eNy%n*?DxR~<`rO9M+COTC@^kz_Xc zWJ4VV9U~pUU(LVT0ty1E9vybS?Y`TU9iqPSiRiNN{yI71Wa-d- zDh$?GS0~Wc(Banlt$V5+rS(zwy=IAywf3HFb0tsNnZb6#Py>rb5+EtJw9=+%KaZlA zqAIPzTdQ8W{*$}HWy5~(e(8QVh30n^6$KS(72{FW(J$;D?6dXb^^^3=^g9-C>xJt{ zZL()PrU&;Q_IdUf_LKLI_v!Wr_fhw^_kYd!%v6;?i#f}x${cN9@q6+Y@bU4p@h$NM z^Z(#G;~(NvwZ5=2nEE;K`S0i1xxa61&TJHIZLIZeT5Q9uima%|%g62h9!|AZ3YXn} zIFETfo@a$=GibeMGjHQ%D`!<`OEpMWUFoaiLydv>h+Y)gusNyU%ctq z*|8ak%H@LP3h`3${I>GPkM~u0dH^Ya4nVhGr~eDHCbP`1&%ac6%f~D-KV~wEz}@`! zHr$%s$y?G|Ubh^#AD?kZ{r-6rxTTbj&)a@`CcZ3cHGj@{Mwr zilGYq3J(3{25+0o37h`3Ui~@!-i48cWswn)<-17te0T7r`$5FtvcDa6Cj!0#E&^x* zsshpig92d!^#Yj!Jp#M}oc8UDdG^irh4$|DNA{2QM0VJAWp>axqu-egeh&9Dc-H;a z{nb+qwe{zl3-2!aT`2wgnMH_oxXv1hU2u^h2RFqUcZybfj zL@R}#ob!Y*MN5QIMZHAige^pqMCyfbMV6iQUG6r%x$QVv3LOY7ilPfK3zLe>3TL~v z?>uyR&3FxmZG8Y~cyPO(Iz_n+y1aL{b|!ag-mKX=bH}&ApQYXt_x5>n&2?RH{C>st zs~R-xR2G~bS?o{D?FT%HvMukD4=HI%g?Kf~LAG18 zn=+jt8v>gR8&^G4aE`S~n8W_@G4)>7k}{Lp7-9J-Ll-I-FV-~-|pP$+E_{P;ih|W z3G1K8HXG;m-+(zkvP$0w$1 zB}`|!@mjyP=1omxODoSjOnj4-kzkPND{*Uirg{9-`0FxWoxR2$u?b2zLqV z32O^43pctLZ9NPX?kH|k?0RoA?NE=|4^oZ!CEmZsPXIutMqEd*p~J&v!w19ZLq3_; zg4w*rbgT5Mk^#p4dj7zt?+?J+bkszoL8KleXz)$&#!DAph6=`#pz5T4C6eRbc`LOQ z6pYM_XCTJqYH~#D8+V;EB)u3yhhB^S_syZW=k8ir$YNMV7*<$v7-HC77)jVJmg8#) z&Lx(wtUuoKu%59hvWpnGHNfO2G$+6^Y!L-`5Ds0M0N7h@}#C-MWhh z0{j!JlNC~aCf+0$Bqt`jB`YV2an6ejd1ze~-)cPP?*Uk2vn0LmVM7x~W*Pm&U_BZ$ z>R}NbpK|!z#qY-c^-bUYnOM;`U?C%?*3+B9P1pWerQe0!FRXDWbS~^ItSHPcR8#Co z(HJ7LV6tepD6z1xFtlhKGD?1Yzssh}*7zQu1Ny#-mF8Xc`vBvh(i~kY-NTZ|3L&it zO>X_ug0J~MG~a7m>%VktRW*4v5SN-Wcaq|b3e5_a;^<-#^%*UGt;^zlCH~*~c?-o0 zzeEaK>RQU~bS@PyS1FDuk|^%ePSS$Y68L5K!8YyFgtm+}-);PCr)-98p|h%g+bfaX zeckunRoyk*!`w&R8Qj(O1@`q0EcQnakPohBXQ!`cq0=3XoqQOAFab}#w*qf$g%-Ic zPHIf=QLZtQi13){Ro{p?@BcZ8VrCYg(4(}VV5dN)tfe@hK&Jpw&Z=#wMrZPg?fLOs zn%@o{CxBEd1?bXH((BR;(l^o-(?rsk(v0}*vo|CPy@yVRTww94By*f&-eK~1HEZ5zQDR(T z_Gu626le3>UTPrkJ#;#gT>P0AB1mK5* zwYpFV;rslAwokcJ4ZN-ACP3HS`mw^XRYL>AQbSckZo>%3n45}QMF#Tj4b(c*RW!x3 z@?z=M6$Guw1Z0y6J36gg``+E|pFi&Ijs+YuxhuJUapQ%!LMS0s9+G=c6EX)H`_8ba zec|b;72cKFNo;Ra?|L6`?*yM=A0Kb{rGHak2d#70#fQ$YLu_Ua979iE(^_zwS_!nB zv$U$Is?9MEt}VI5Iajp^pUM7fJij_Cx%liAC`QX`BK(R+oy*C4ZK3n5^Ga?dCXIBN zgUOH$GUs}_(hCj=mF~;ArFG?UthRPCKbc>HD=nq)aWoq#wrY8o+)rKSV4$Wul+ z(T&GCeD}{_+uOs7GOaTDGRHE5G9)sj;m7!X?H}6deR}T{Z<4xMD|Gv+$_>J*Cad<1 zFPqbx>yP&f%dm9?BdmLddQ^LydjJtoTs7Pdnl3Px{0JZzfF+*>=#w}47Oc^w(WU{P zxR_X&P|C;7m#mzqEHQ9xe;sgiQ-5rGU0DH+?=$Z!@9*x9?px@0h;3_*ZQ<}IA$jyIx%5+*ZqH>TEm16$kX? zF^J#Y)#V~5^ZLj2k3Aos2QvnX1}6r0L7h~0R3W1NpqgX874qg{fiS{gwbcN*r;!AxO(S3k>biH&xcU&8&!J?izBW3{CK-k8*+pZwXlnd}+jygoix z%WwQuy~iv$T#g3}W|uCO?vRI&!_e{YH>eXOV18WJYxgo&5vBNsG(}?N-aoD?m*kMI+s4E|{c<2R(_BmXU)<~x9W(2zwPu-%37?v84W9oR|Fr&#Ni9_kU(7zh`+g51*PVBmxBPWv ziMe z|8~|jYgYv7mkktm^!9(eJs^dV{@^S(l5H0{+jxk%=WK5)XwwSVJ9SwdzDw!h%&zKW z&11D>&1H?y5z#HumFUQ8*Yw)HW4Y8mDr2omHj=55GfHpA^D?}+J3J_v&0bYsEpB!8 zOSmdJ9-R>!E;}iOmCoDD*__(U?vL!xHXb_8ta`Vq1o&(m!4{MFr_;95X7r~QChAw} z(QPGHoI9qxcJDcM4bLG_AX_*le0xQ-UCq<@_G$9I_c}ll!;kCs)k7{!W;eozrrqEC zx%g?~+-#>mfu<_Jw=LE%#i;QM_zS0TN7IwJ-#yV|!s)LyHMwjN$>sZtOWvc}K42B} zUQ*DH`uX7sdp%}}w4XD|xU>VuPwx)PkL1zjlz+o^a5k$7zvJnl?_TBkOJ`%SBd~q> z@#zxlG>I1Ha&z3c!4blinJGMx9Xt4(I7N$Nhg&dJ;JHrO|AHnKKyI&waSJu5!c zKT)1HKET&jd#S1!8qAuB>OZycR-d~8cUOHFAwf64gvId#mCz6bJ|Rp`BhgYLA@tq{ zAR7J5v}*Xxr}%P01k*`D&lLdyoABR-IJxZq@G?l{t@YW>)ZNX>(dFNfkztn6L1p&$ zAGI+)j;Nv_ye&n=_*ydyLO`HJ_$Vu_<+*T_sqtg0{6~51r{)+hAs=Dv?6#4f`LM+2 z&*{qzi+`uI-(y^3;Gb}nr6^+3q4;{f>fAJ~owpN6AGQ4dKNX$+O&E3p_V-oKPuaQ= zzE8WW&mxcYb^^#NmbLuBjp#@M>4=WC^8)Bi>yEYLCj#lx4!k$^|8Db+AYK7i7K5k8 z8|QI6(<^w#A-GJ6xwf!HJG9o(B7}3p28u4ZB2Rc zZ^8kxJ9Ofjj4Z=ukK#WG)zFYkL}|#yEE!6MqV@mAig!btfuJYVHA#|5Uf4eaOm>4N z7iTCQV0;l%JpYZ@7!tLYasjuLNMv_etjYhARo~vXW`YjxoPS6K%2A;G)3^e|gOLmv z=new;|DuJs&HYb{YO_hFxMk`!Nz_TM|H*g6aPMiwzflW%SW@lD`KP>lweE*`U^nGW z`9=Bue>yl~UE*;8cYh;m5$`Nb9rOR2X)jm}618{G#_wuYpdJebF1kDNuGtR<`7sxZ zMz^o>s?FTvc)y_g1@mwy{v54Y;)c~kP51IY-Hxz41nh9nv)14!J|QbF?lA9a$C^$u z@qa6Ez;iMz?Ku0-f{C?CyepEwO*GhAB_myd3wkHOZrA^0+M-@j#l{(;t__{&>M?U7 zd&{f@Hj*D^cCM^r%=hrCAU({WPmukCoe32rSIsK3%mqh&98z&s4ZFbgesRXkSfE9c zJ^;xOb%*3u9ivWWC)Y+M!)2WE>>uP+ND#tlUg?%-<~5s}a;&-RnHL|vSZv=^h2nuS zJs;;Dm+5~uf3S)B&p_U}kJr382VP#dCxEHZP`~#uTrcF62AU<3O1V{Vc$Mi2@?HFe z4no^Z>%WI1s^CtcY*^jlw-n=5!G75PTeH-V>JWpB6{*byVo)FZ%%aL*#*mSaNE-5= zVT>lL1p8%g^gm&SmBF4Wa|E|=J-^5_@h+W~nt+jniC_}={`UX#a6`Eb9LYmq+Ap-6 z`lf2jheV)@`{n7y@KQs>!!oHCAkZIKPbHXOQ!}k}j-88lJ$@wByg5dg7yDg*n%B;2 zO;#~4bk5OQRS*uX$XJ66QTNH!4M(w^1pLO5oYeSX6+5_|>Dr<=^5iCf51E)>Am?5u zfTBh6ixQiaIKef0cPC@=!y$FSfrDJIVgjzu-<8Xf5X66WTxuODSL>FzZ=Y}5d%|?P z{8|6Ay#j2b`w#H4z)GGtp>#>ocvZpwf#US5N1XCd5jYIrLKR9EV@T_>$pIl`{X?;^ ztJ10RfrC~z_*u{QS+1qw>p5lFKiFR_k#riB{G~E)e0{-c3PotEN&62if~B&ChEXI4 z(loBCJuF-9S|{X5tGVw*V_c9}BC8feWDYVixG2!VU1u&uY9eq*dCn^Gm(!dOP+UMEbG$a}tyqL8~(h_YRBSF{KUBku?yK zXQPV@(TrPuQ8Fx`fz^K}i)9>G@=vbd5@qR?cIQ}Vi*zOOqq43qKa6*#b$1)rvqu~w z#c*wfY9GxT9|r7d$A%3XUWLE#rpYz&nZpDqB~A&miN7bwJo~anHJ4+oH~NpU>nmFI zRd^l(C|ch5Q6ET~YmdM+!@O9VZBTSu7L( z+6LtN5(giaX{$o~Ne*%U1(M)WMAf`py>78P@pMwqlcLt7O=ke{JN_#Y01G}>j@09r+ z2PjX%@AI61ftgYWE_A@&v|-X zB7)sc`4WpSA=>1Kc~z+{8JaFX(@A?@CxklAFynjK`p+6id=P(1Yp|$4@!?BK5r1tj zqIUuf^Mv15%~;#Kdi5RpfzvH~aT2fb`q&aiM7T5sCyvbDR%zf+iz%ww$x z7|8>n$5%g+x{p@zv?6tMIBc0+U0W^aoNxr2Hq|zyeE&d# zc#SnP_AfN4v{K3j2==O%uC3&<3wM$j4%Ny$k^Oa>%1S-7s~JoTaNQDtl`SEyD3j_4 zetjPuhvKqTL7;!`hVU%ac2c9dppDP`n&J_eEW7dVi*i;N&!2AndXo9#0LtT#ano$i zUpO9e#Z?qUJ^LnAc|H^OeXOOov2mdBOvDb9CElII_)e_^Yi0W$4S1~A}^km zSrMHlpljk;0(d~ZS4N-%-go3eV~5G%3l>M0DUyxscByYrSIOF38F)BQxdWfIIM6j{ zTgTz`n+~8w)|*cK>&$hd+y!8+QSLOWC}G{NTo(YO_T4k7a0jT;2YKpinOE|UYl_=G zs`&NT5D4KMK{LHbmXNq{#aG+b;P`pQqNo;i-7RVL5_?& zurF#&jQ=tEB`-xeJs)3_tglGd(-hcF{F~}EE=iO%iqsaJRu%e?db_wE2O@sVataWy zTa%!W6DPbBBch}Fet0zxci$GcKjPUZ&ZEi+*3Cc4CNa$3mo^ly@h_tl?QZqaZDQE} zLlhVLC%|@Mk)BY?!tAK%Az7axEcbzjUpVYqecu zZa&AIxQ*jb?;l;g(vBq19hHfw_}74csuns ziYx(#ln9Q=&yN&lDiJ*1hSmm+`L85B;OR>1gF@E))t-?ILD#n+q?5TWkYW(1)@zv_ z=AehlNvze#x-{{x1S@xn4B({*=xcxrVthR=TYX6xJ1%`&XS-b2B^IsWNY@b8q=DNJ z$!w}1W^dJ7&x@>d;0{gFigcx#9`xx#)W*oa;XAKduFU1K@l*Sd@52uc@9tJn3O5ob zW4-!X`twv9?_a{V$mIhBmA-Wc57%xJ4)=;FZD|nyokn~7EWI(gY*?D$(yq3TV09Vf zM7O$32siwIdanWMH2;DvWAJecWIqL|b-f*TNitu8GCBAOE&&cPyv)!I#}wcVWEe1S*1exbQ0~PN{o;F)pJr(epEKUc06I zk^)BU*!k)3NLR@2vT^8{SXx(GnGF~rS6>_i+N62Q?~gJm8hlN+GYBsNiQSx^E$?hi z4DU9ifsMQ6I5%E&?q98;z_Xwdn)AeSu!mpG?n_}Wf*jNvHf zX8bs>8tCVDA%XIywtU0jhILOO`QQnqfWS|cuRCkKQWsqA2ro6Bkb72C=H&fqM1GvD zHG10FnOQP!Ib#;Cs2i0RK)lUxus9;Yu)u7gY%RxdsO@n+vb0y(R@PpT{ab_w$6xhIwjU>?dMH-*m09sew*S)`$Noz-uF zrH?^)>349iS4>vD9G+NI;Vi8J6xPO6rr=op=i|)E0$;YhQsY6nXF|{9^{3~6m~Ov5 zs(|a35h+O3Mn2ruRiXC`2I@I^Z!2!fUZTD0SS;BlQ>s%J%}+s14C(wd;YX z3l^*whe6#*C)BCv6W>~n0ZUgJAdy82sLO2rD#(K<U7! zCR7Hm#{!DTzt;fe=b$YI+VlsF9y9Qk36;N=0yx^xK%Z%gVhoVS#l`9|AX9r~J_$S) zaAhfkUg9r~bOaw`Nm9t}cACu(BfMK~aGGgE^xYtb=Ucy*8dnsA+5g3P1oK`*HAVZ>Fyv6AJ9Ax6J>)*qBv-i!=pY`GrWEkFUG-&Ac1Q9~ob1{hPr^9VgJSQV z{$(26^Q~BiUuP!Y8WC2^?-bv@P8pJ8aw=+(o06|w)mS6IRbDKgFrU~zE&8apdJbCX z%NEC0EcVc%OgZ^p?;sYs{4=pGTph&YVr0QNK)8HPJMswc5Z$@e+=#8^A{q8sYW!tY z(dB3T-eDx_&k955$M{Y?Uo)T?sMl=uiSCc9CYC)Z@!cQ*t}27Q3c=X`u%y&;&x4)Z zJmuBr6k&MQcA9R8=p-XpUE$D{mBMcZ;W6_fV?L1auQU&+5`elkN?p^9)hff8EdzJ! zHxilUS*uKlkr?LBjtBNo<$G)46_~PK?ve&1J<7{xSq>*Q&ub*7f$PNkQ7)nXofNgovG*1Eb z(eTMst=O!Zo#lyDYwadoIBTrV0ZXaar_=nz$NVPhH(RUlI=KtP&$W;Cmg9zfzG4L( z6?jbv`|7gD2Rvvju$-2p^-6@RN-1685wy#veB_Gg5cA_V#0kzQwMbjMp}H2v?7}rG za%~{@Q8)rfmRTq*#VjWy-vo&GNcLd%>yz-B=|2|UgD$+tYyF5c<7m-2$hi$%Sd7q4 zh{8IlP2Dp)W9^crAo@{aeWnM*sv_xlm-38t$qD8PJqb|p5X(T5w zi`DC;)DB)PACyCk;wlen-x&mJ;tM^Sc9w1lqBE@X)59S2FP)XhHynXq_oX)l$w<9Ta)5>k6BOR^DZ;0YHw*P1ryy?a(7d=6TEKnRrtaV~-TDw4 z2PbyYO&Zh0YESUiW&g!c!XV{lp!a2wr;8dfE#&Ydgb5ACJLV5W>H19zHdoPpm_B1^ z$2n1%_R*d7C2azTdL-Kb%Py0Gvbf2<220#MC=TQ|LglXlW;S*Z#PbycIda#G4b2p9RmHB*KRQFJu z&X-g~gM zx?^CpShimZ3?e=NpV99EX~0V>z0Ci#vMj+{w&J7xc0#%92z78;&35)M5=AFJx$f2p zc=!Rm34S8ch2RzkLcWbUDr)(Pto2U&Y@=c7ogcGyiBFQ(YKyvlG$1wG%Ea{6>gX0@ zk43y?%Z*zv1>k<2M%mNEdYUP4(gwd85pk0yKh`d7b9n>_!hl7ty9*lpG>8D^0pP`V zH7Os5s*U+88QC_5C&{}Yb%q&-O0PbFWMy4?!sFrzam7>}+y{yIq-jQjkJqbh$Hxy3 zB7Qts-ad>RFG|7@^ zFqOEPp)gldC$t&q+BoMROOWo_nsN@F)w|I0y6y2$IY<9jAY=llXeS;MtWxA%K z5)ofE+}T}{0w?p=bThtnN0evHNRcHQtd*R)x!O=m@SJ*5S-P!6?I&q>Vztgj$$?8u zOxLTx(@%GBle@#r1Nq8lx6x(86HBNG;4nI(iMebQh_>_{ttZ!`QD&G#v^oueB+n*go;JWUIZIX~!cuvw;>XIe-DO@9 z0P%4#FNC+Voql=(F1mp!9l-fg!*Rw%QI|@}Zg|{RFZqPsVY>cWmtG)&rFaCBKyl=K zbQmY{6^=IeVGM9WRnr(QUlehyYAuI>i1&5^Grh8t6bqVIR6%Ti}&xX0^)*=*_Jihg&uMP)&T2B ze+OaK@3d$&^k%FzYlrW_VD*xfc_$!F2K}PB1Ts`snwIhq;-D>By8n`9`EFFH&g^s_ zqgk@L=@ZklUL5YU%tM2naXn-vU;B3{Z!K0U$gaAo$&j7!Dm8@9@?;r%j+%E-f(3WF zra9@R`p}e@1oh8TF*F#zY%L9r273F-vTF?Kj_BeS%00n2(4Z&K_wVr!fF@1PmQ+J@ z)m*g-{)t?ddt`J!+XL2RB^TU3Zl4M17|R4GEoPRZj_OnJBIOpKnJ%9p0wkePM(&zq zL+v2ED4T|CXn<>}25f7LFstP#hsaN;whhsM%NRS7s`5j31T{A( z$Z1};7*tQ-dC`_#;1~njdhzk(m zE^y`!&06cdvAJIo&2%d`9}qHltJ$Y^dKE5oe0B};#ZTVkzxj3@!I$4(Gxp~G?jerz z;&-0$HnMx@q3*2(b=#fqH!6*X#ySGPAbq>`0(VW4qO@E|Rl$n3;kjt1xDOCAOB(Ra zBieTi27%h4zWE3)+^XH(q}lQhnP;vl*q9YkiFHo4cZHR~%M($r6{yU+9>>BNaS-Hk z#?ZXv{8@&*+y`n?#(oQSn4T(%tK;n#1u(fGrCQhKZ|Q!5>(Q!*h-%jJc2%OdF`cC5 zR0WH*K*g~Z#eL>8cp|^B-UCg6ahKgXaQD(R?UPZSwK09>s-j7aPGFD``B`oJCHZO_ z%bF_c&WMUn!2&zV3F@&|(!{dOzM<)g_!);?Q*BqQ&D1~#)|_NQ2Y_^dRk=jF%rlA6 zm3`>~I-<-`JUuhxv+aNNlJJ(0+)<*7Z*8xG1RuSN&D0hvTbfRBv_8OW$UG~ zQslC<0zj9Q=4fa0rpsoF8f{Ag>>vP(2aP+91MveDeHCha3BQk9T-iDc&~Ac!7o z;+!+y<6R!DZ8mpYrGWtGT0g0)=gh%-29HrxO05t{ zyZHKB&=gU|FP5fNL=uKbyE?nL0Gzpesh6G+3UDw`s4w$pB+15|^>DaT-#zQ?AznIX z>2iO`{H2aV;rFMJ_;@v4V`yg~C{G&W4AT#G6yF4bL&f&z=Yyri=NvEv{fdHh$#BYR zGC3gJERY>NCvY9n*25`=9V>1;zWJLF`Yl$&Gm>LZEeaOt@#QRCtQ)Ib^X}%dviG9h z{FKKqTsd_oV6Y)7Y$T{31IDnYbr|<~ue3`2ltpPr$9d|RhSGUTl9&32n74&T==||5 z-hSKJ7vA+J%-6-j8bdny0;`vs51qU!$+oj26;dHzW9B{d?cF%EG208jX2b-}xX#R!W_SJD+0h7d;?_E?k?R5(-8 zgOdl&ny|<$ybxIMRHWFKWh%V@rCAtD@ON^3UOQkw2dyX*EQvPzRGdf4xA!vjv4N#b z^X$@KTaIE&$#l7RVMi#{Cc<4pkn(WZj`)gU)+5L_xl97`UH3v-ku9A>!lLz)%LJG> zHrU5#8zF?DIle>oV9E|X>)-aK(vAAz9SpGI$UFejJ}rB9ayX-}gp|e4Gg6K-)W1?$ zzLFh!2X-1`AD1-LOTZ}NwQm&Yh4zTaT{?wI+CY(GZI<*fR?DKjK zkiU_talrt;v_^0P28K#FkOXq5d5ei$DYsCuVgy z=1|K?V%-hEdE)}2|2|`pWS1O5*d=WR@v9E=0_?Tubb|dYObi8HIBAFr%l9$~G{QX7 ztGs(D7df3Ny5nfAk~;$?MS1zAAc}XF!3GT3h&j8mSvpa9051SBEtrCgOWXI#r2X#a z%#7JEj;H2)`9>C?;GRt#P9B}7X-J=R1{yb~(m&7emHfM={yU&d{S=TOaJ#2h*5~ux z$>QDku?I34PW2c6+b(lP@icK;?aQ&id*;uvot#LQW-r^j>m2E9T(7blU)0L#BhNax zEkFJ*6{ClKi5+h$~XFL8as_D>N%fO;OZLDKl3hnV~imbC&}bj%;eK%1X_V zmYTSdoH(#)E}XfAj9ek8;KcDh_J7|m@7D+JIOp7Z?!D*y&hPEa zjBeBE?)CP7Cl{ag6C;}!OCN=iypL3*5rRUgSZv|+N`dj)cH4C0xWG0VbDyxLaDLAG zz5T2MQJhARz`!A^Z56SLIiwK0#B!YZwG7ig9kB7MH-6S4vvbfH=LiIa#=#Dex=T(f zTjr%yPht2=9}OuE&{un$mt;IWk=W;~Z#Ew?DyB~lL8|C+a%fpa{=w0GApPz0O`xo& zF|@t6Mv?>kcWD z3qMK4zWf2np?E(W%_>HJ)-QV_X;Y4!an<&_{#u4PP#lt6efz%4t%q*);z2_%lGl>2 zN_sA2Bt`5Q##~L$T=_pNz?+Su2G*Jphtm&N)ng1_X*RVN?~sfElEAT=M}D>k;ChhT z+0vq2N1{+&@*gaH|7MNJ9_b@ls>fjvjJ^_oxU4YQ@9a$Kw@IcFckNuMfxHa*v#YV( zQ~|!1pmLT%`JBU@Ei^>x@EuO9`Hkl?tB)C`yvJ6-awiEsa(DU4Xg!`RJtcg@KC( z^J?fKA2+(49(9+F!;Y#l%kG$-uhI73?_-!vQK#&|$xothO5VYt^_Bgmo81Rg49Y$h zAq`K<{B-E4s77R+@oWj%(+3)tjDu?3Tum+jwf)vzN<>-%Zb7tot|BEk1j zAK>)qnGMor=(bFd&(KFXxMyChZCvM}!0%MPi|~L6;T>t3rYkqUs|~v+H-@qBqFh9; zeC&zs+Oz=WMpR4-N?k~tzdYbAtzpi%w{|sAbcb-GVmmV$}qHE5jOv*Ue(V}W$99d zxM}zSalK~<<~x5afBdRh*iUi8{b|2%9*avOqCzY-6e1|oHLm1F*3zGuBUH-RP>(3! z4bc@ZOyHgJ+M8wbD{64Mg=6ESURXdDuClFiaav4NyZXZvL9$cA+wPUdwK{N@X2M;* zcom*)w8Qkdt)6m2;M8wXS*=b}XDL6^A2`D+J1-~qs&}N74Ig`EuPGO`ZeCBa4dcP; zpK_hkU<%8~>g#6tE)JRPFW%Q@`=X=PNgv6IG?`_4=|NXfF~FNv6|ERP87c0tx^b7t z(>X_|>(W4{6&(UQZk%Qdc~(w?cb_JM&gWOpI|YsitsBT^_({C@5jv}1>@1@NyP|is zG0<6<6BSz&g;h|Up?Lc-E69Y*xR|VPNLWi#kJYJ;V%?{sKVM(4+?VQA#=Q}MB9st? zyKQe>BDai6WyKF~f|ng}zf}TdsWoenBrvyg(D&KOY-Cdol z)C*hsezz7GG^8ea)l%kYQ1ozmrq>2?^OgC8I+a7+kSd`mJ4PlMk+o}YZ}!^^P|nn3 z*RTQxKY?mDq=WLLo0NZ!p+O_>(~-+G!Kbbb6{!(5rMQ(ZMY?x4ywR<%jW<9|ej-eL zYPnSDV?u_Oc2hwJ!SgEGYI;3oHr-TI$$NKdK+~t@NP^;^9^>do`5!X_(I=PY)ORHK zda{{U<=UE8NbNJk-zXnp5Ard+)H!FWYvPh;3yr~1)*8!A_@)u`85WC#iOqV8YdO>s z<66@<&Uyc~q*AI%xYQA1t!iCcTzJZSkUDQI?{7uh);{uf6*q>HZ6W=N>&~{g4TmhLj!?z%QH7afNCfhd-c~*${o~`MjZ`5xAsQez{ zVWKQet8beE_1|IsGeZGGULzIi3_?a43Wpiqsdif6vEW*b&XFI54<)5ORwrymjOzgS zC)q~^K7wmHV){Y{I3eodZs0b%EQXg|S-!<^Al-DBr%Vl}uze7-WUni7V${%slkv1T z^Ssg8?G3#K8&BAwo_4d86j39tY!Bspuqk*ZF?}U%&0?QI$pdQ^lCn0;c>x+VzMBu1CFp5A*rjc*l3zBsoQQNFOD<1kRQ_sMKirg{{w!4cJ?)9n z;5pCFx7;WZw(`UMCLA-bzi)nSZ0ku_l8?v)Vpy*uu4a0%mw4u&S-ZvlW{#;fcEe|k z5O)TZ-BWVDDq;Lbh0oAQQL(}>tpWip?R?0)wtF;l{msMGBdwCBt%5%e4MB!a_!Kg5 z_B=&x4JT;{_t>*tXz&bNWCtQ(eK*tEdKGIEO5EMjml5^4zJJ~CWGe+6{?@n9!V4oi z0!uXAGr!Z&Njr0W$FKAH??l?T-qC zu9!5cUXky}l0VOZyJK75JziuN3D3;v={gB+^w|-#ri_gJeA#%g!`G#HOv83ft#yx~X4-e{YE;(fXR{$!>TXf6{& z#TyjTx#Holqw~_PhH;lW3kvhzm>UxJiPs%4_)U>ND>9LH_DmDF-%@j(B}Um5BLuS6 z*!zxP#lAc8dwfRRNt2234gTkzG^&Jn^i!rHlH2pvY7N9|BLY;uGmtKy?n@A!hhPVm z^INDPXZ_DAPv%@;9#Fj|?4vp@b=iGM=#R8;a+4lQRx{#pIG0ZUB^ySAFv_$l=RQNg`LKp37Z#PoTCL zGzRm<<+a_uOm)1LML$Z7-)SU|QxaVWK{k0i8KU)Ig?dj=vB87;Zgk7sGm9`drF56R zdnMx-47fD*P|Wxrj(Ll$4R+W`ud5!|GcWRD1h)3t9%|qDrlE1Ab@0H1;0wx`&_|NC zEJpxBBq&jQDeJYF|D6i$Y{)#qOxL)GPJAimKalqObz?=x?MSxR#)!b?SDR|~&JmnHsJ>zMGAi##N8pl$<4=Whp^WGN%%u{vXng9{89v zlbb1Bc+)sTc(ufkxRjvJu(4wUm)x0^>7LE%l6|7JUKiaE$wI3Ak|PZ1#0G~4@TdSW z05*v9IAL8hT5_Ks-x~5mDyMfRPyS_-^lW)#iHJ8Y7{#Uc2t4%iNofg89r7ngze%P9wCE-`oCG<|IoH78!QGI?_5DA*8m@ zjgiPatoyh4z=9Vu!ugj4vDLq&uj6ZuNNwh34NxT(6dBJ`@3>R|?LXcc@ZPA%nxpR^dtS zg7Pj8mAI1z9-c}65zr03CrCwT)mkqK9-)*=-8zALc4T4K)SjHsCZ{h;KZd_bF4Pik zr?iLt6<;X6Bbakn)KJsSGR0s&6)ZSYW4~}mC;40O-T<+tNXinEuNe6SwRh1+z%+7M zqJ0Q#^#b>+_@gXYgJ(^&a*>x!kMJQeFujXFm3$9O-Qg>~YI|cQ#dqP z`|Wkf^tl6nHllkQGO~0#qO2pmik(-9{i;jWX>eWQIN3OZ81V*j1RP;Sd zL|4TH4-S{y(`|9%4ji^)SH!x>GWKOW#QJt)ZEJwogYe2gd5c(6&hz(h7Jg)vK!^Q$ zY7jf<63}3ENL+)D!7SCbu7xJw#V+nIMX`HJKV;k1-g)@r-rA$o5HGj-&OHkayk z@(B0X;$Ws=*yrFNVePur`~&aC=q7O_$h^2_g3ZE!>?n&LCvMwM7rX8BAjBYcb(^US zi89eL-w`Z{8oEe}$wfaAO19N2yFoFeAKgB$)ifGn#xJQg4wKfW#hSgb`W#2- z<-CKCGXCECsD>WI35n%KK(76zroHeq^TNV0{5)*rxyXlax@E6ff|ZXc5tI1#k0*04 zY(?n$!oI;@xDDx@zvUmB29Kz;@S9D^YdHz60wO0zX0eoMl461#*R!82+Gk#h{uRE& zkUwO7Z6SWsF=;LN`1g9`X0gDs=W&6*!EjOiQdsePuBLet5W>5zU+tcV^IzXc*ZL-z z8@hY&Y;p)%xFkE95AEu2)~5;9erj>0Or@+K@5^w^qt8;Nk9TRu!YSM&@M=R;`GrK; z-7FxX^m+XBNJTBqwC90|v?`Eg)wO@brDhf%=s?Bv=H7v)^U%<2HE4o}Iph;xJR2HG?h7k~uNC=~} zPf(RdU2di-Yn;3BiI{7lh~r|^L!k@Bg80W6*K5?+swqsDN&YfqA@1r}G-?t&k`iCA zk{|OLM8x*f#-*hjB2Sm9*vOLtNye2opbL(j3HX|c_t!7GqzuEoS0%w|(_$-y5@*X4 zXd>&G3|qnQQ%*UTq^0Tb-E6X#qnF=-+z>SD>dTqMyiyNSbF4skfVO_N#{0H6${4+z z&nvbftl*W-_z7|9hL3aGUDR|6;v__xei+6E?o*J;b+c()N@y5$AIm+j%);i{k74t7 zt^K>h15p{}VQj%L^xM>gf>mTk!*=GAoSSG-&HT%c&8leQqDRHleUT(P4$@Hmo5j0y zmc_4x?%*F+-(7G#G|5(HcDjd)@LHoza>avskZ&43r-Ke{XHNzb0@G$nYb_2{S&ZsC zZ3{|9bOVsaJD<1noTGO7@0%&@MAw_%ZSSXIqgLH?-n1v;CHLchW&BE|^)uiObwm0z zA-&Fvv;#+7M2Fr`6U_1kF|@m3ybbL)mmcN2xG>OMEy$wyOFdwyMm{U44xp^C)3b%` zFnq~nCJ&ZYd92}IoG|Ou;bQ~up#6WvGC9NW;zymDmz-NW7?-2wLkRZfi;JTUOvp<5=`c{HbY zEr0ARoNs+71GJDrkU3`X#iquris08q0P@uiqc&ZR3swD)S2^Qj10X{0LtN{NYnn{F z?OC2DFW%v&={yQ~qIr1{?n|5GYs{10j=Cg=*q*|J>VKy$!=X;SzGO+_we%@s<+FIt z7(~u^grznl)P$itzi%$+Z1;@FlKT!>GR?+@Gtd~YCmJlr%*C4+l&M}NKojhkF+kR8 zMJ;(%){0C`2xqghM9V?#BX|Hwl>Sn@ueO(RWEpXn#jd?v=}hSa3QWdayW}N`V?`)& z<0}+Kg&SiyU5|coLSN_dM%@h~Aw;0>gwr+-0mQWiElrb^tmq%F_tm`1N|0(v@teg} z%CfS?RrWp^q+l=emMD8t%va$I^A zK2nZfRBU1|?Q0W%4wDdvwb8Lg*D)Xh!sre;DuCQzBFJHfbyMhJ2dy}B`2*F((W$Zd zA19HnMfv%6DcK&57wfPBmzApGiy2=bb!K15U^X1LU~RI;dS044pOa`cT5TaQ-I@+c z8cmgDWSpd){VMyJWTN1ZW`dMSvQnakvysoz=!#wtX?a*=Py#sq3?PY6LUGIf(i5VXPQzy8);-ss z-{RXwu;Lth`R$!xz1xqgc&L*^u>avM5ODILZHfCBIf0ch**z!gjcv=Zjdergrw^a2 z!&b9~A~y#nf0yKsS$2vv^;2qO=HXchfi)yg4AMab;qvIRS*6S{LA>xr!O|>Gp|wSLlo@DcfM`uWemDZc1RBW5#fPrscl$J4Y~by*g( z=1^Kle%Wa9?-cMaPMNOdYnA6OIg`Sky8}3Yn@Du^7ItJ;cgd|tC)=+CNYxDi;A%){ zkqvM>eI`A}aNrv0$``%{@-IbHbmSI!1fUQ}rC+RD0?K+2Py?>H36}U(Kmj~|PBTG3 z-+ky8YsNi=_9XYd-HeZ6=BK;-=#HO>zVhYLRmby2?b$2-)MuEmUQr+*E*EUT3)6$m z=LZKrPemWOxcB+-E_pvHwLXGb<#aal%e_#$FM3z{kA&#H#B$&e)aTt+w_nVe1znzg>(YUH1&2C9H3gu9Lt`v=-z=weZz9&bZIZd%-6nkm5NwD}TJw@|MT#)c{ z;P%2LXEj99{edzyH~Z|7xn^HH?;4qQX7MpJD&Rr^L6b_Fxj1}`A*t_PbT5pTwf|#k zCMIcs%Sw^L(`X2`G-jsRw?S;(`T@gQywJg>Zu6r&X2-@>VPQi$e|^NBQ4+P8kjw22 z9u+-ekU7s2$_+4I(@GmuqN}GSYB2%oJWK zVc)Q{&&XPWnH@H+BOP5H_*85&m*=K~WANb6bGa=UMUw-~^{@_dMWJlKcNqKjaibUb zDE&vCMWYu$I}S8vL255iapRHi2HPI>+i8J$NY2%lCreX6eAsY;|9xali6M!=+;y|3 ztm>y9rvQQ?b&v$v8WX><(R$f_Ft5uwiH4l3l`&^%mpO7Eev0j;(uYGSJGpKlH3%t%y!LVOxsSkiC}23MBx?tMEYK&j*h zEJ2)~#mA^6p~>SXUK<1~PJ#>{9KN-Nce520jV|# z9&V?DR{ERcuJ6!>hljXmj+(3>8Z+Jv?#xQZ3_`fgrhp#;12BbZE`EK~Sqp^=IIi7%(!;1>YDrT)O0!6h$CbzF5Ga^Io+bkjquKZD3Zb&xik%+K(9``E) zcCrLQU>e$()wO_7Z>*9)gp}e{$waiFj4bn>|Ip^PJqKCzgawK9dh=4{zn8I9SW8tq z%D7@_u`TCmq-FmnEe|0(eRR7|eV(?rBP+x8^2)@Mm}XSk97Be+=#%R0Zl=?`#`xT_78IV2~!+B5VveM$P46 zy`1KexU&^bZ~d`p1ShT1V$$8?>&~D<34xYJkFK1w*#A3EtzF;iOXe=9IL{T1&k?y>PjiYs=og-!7wGzF|`GSMm!=?3Qr47QD!K z9kJH_mN)K+8Nvh-5akF$KYcgW8O$$^O8;VUxB7`>(Kvq3l?MfzY1j3&Z$&>MWE@=@ z2rZlT(5^y=cweB7KUBrTIY8_rFPbKhf+< zQK9}r4kE*y#LTh~pKBw~Pm}f>1pZ^h!Vnf8AE6t2fM~JCPm3CC4ILrA!@&yNqoc`BG%s~MX?(ZM zj+!)L35Bz3TRjZq)Eh7v+F8o+#Qs`;IT`S1M2SL`C7zB4{}st{{{2Kl{@#Q6_aM_e zfy>3z&iFZa6`K;ebBS|DZVk+9&*vu<;9Tl)5^S{{_g{x#%jMHGhOE9utV*PC*k<9j z19HMsE~?yiv&~%>{wiIKt&Nv9#|kg?j*kpgjXS`XeIPag;MZ|CZnH7#+XmndW{H~g3JOzjuMBDH?Gfdvr=gnxu71e#~$9D(zM)bYOj%KsPI|_yu zl9uAA=e=-YrdQHu{?%9nYF9<9dVRZatuIVKpiG5TfPXTsyz;2(?@o_D$LA4BW@;Y9 z1;VYFJ!vG=19g9+bcAKfKwQ0Se-t4%%$-)kuwY{L`N zWoZ4w{8h+)Qsk!lY~cmQ>h46zF`XD+017^!8A0xTsSU!e6B=kDPfBIF(t1ul@weJH zsnd&&4ktK?@QNQBnAW6lbV84FDKK`mFItuN2e(40nM`sR2rr;EH3364$joz%T@pE_$ZoT@>fKm`HO;lHh>$O7q)lefw^NTVs2{Kb)9C`^THFW=JPlgVZa zwRn{iZjAm(pK7&duW}URgZrc}D~>E$8`@=P<;_2VJW}qa?U%aQUJhKqOv5XD+m3Gw z0v`E{tJ~&dvgGGbn9qZL>{Tm#ByJlUz~dJBsfiP^j}fkVj)kqApFCUqNo2qNE)B|O zq-dsnfZkN*E!L@t42)I^x+(rkmcnnVSKOHq28t`^!1kWtGJ>JtI?dniiL~i8t1NV5 zIG&;0*QMOuBog|<-3iJ*8k*vd-SU_P`aj%K#Lovt)m)=W!78c0t!KXP%osq(;kJiV+ysbtth{i(K{v_e;~ z)U>sUEE_@?k9;sESJZ|axE3C(c9eAG3}J%bU?48I^THIn{x2u}+sTenbVhk>mOjl zm6v8gz%?Z-2dnPEK3Y+gr#7Ec5 zEQ+9LyKk%LXF}fq#Sc3h&=z0)tZ)ELBIcOlq`J)t3b$Lr@v#V95j<-pJCf<*yR&2y zvDs;H?VWSYG$A4E*^`jyLase`#(_%Q$N#`>i9MD{vYjX8uh`!|VBOn#`bDvOrjDD= zGw#=`m+0rqj|(r!_8=*K)1Krg_s&Q?pcs>xZaTji`jA)KIqRqmn>?p4D^Z$OH$k!x z8puTjXVH)#)N zEKKt6XcBA2AzD37Q|OoNPt-6n1IW;WZb!=`b<1wXRu9kA&S60umY&JWpC%1EbJRz@ zM3sq&zr4wJoveOD*gUo8&Z}u=zMo8L9!?u%l00wf9-g{l(p!IUm|(}rkM}(s%jULU zIkQBXGkMWDLTnIaq#7V=CJZNLWmxB2|DL`cvC`6E8LgwCFI);^KcGOvqGC9O%;a9Z zOP$K1WN|~j-ty`x%drKhb3^Dw|5O?vxuL zdlecqCRL+eueZk3aXV>xKbC6GPbt&xoEQd38vL3{vc?gHv`8XexISByVO~`N?$7bX ze-{R{wPv$b*RFd81?IVzYV){tg7_|?<kaX669}o_&UL3s20prsdL4c(^&h)Zs8ENO!k-_1bRah-7 zycUy%{yf@2<4Wcm1Dyi;Hx3Whq>0q&0?r9V{v5t<+)uj{sL@$F@OdOso5@x5>6j2` zK&+8<$14r%q15{4?m(;MUc*e#3S{f$3+=}XHe5fE)$yzT{-}ouuwq1Ni=^gpy|o&X z1CW)e)Z@ZD^L*N9^qud@n5{_;?TyyE(ngBTkO&1E$d8Nd_>#gaOvdml`=nVSYwC#& z+f&S6>dWxRhchu%W8`rlEwPE5vmZb=!6R|j|Cz>8(7z%TD@;7xPmmX=jm-$%J3^OW zrTA7}0LU4b(T3KxT6yL9l2+V1$O2xI+-su}(`uy- zd=3^}&K#RUbDXyQYoQt$R*~wojfZolLpSiBCltG?9`(W40N;wc zqeWZ7Xg74RSt_ILnR{LstiBjnfkl4hYsehKrDV#<&E_rYCAl>aYiofs+8ohe~6BUj- zL^|$VOy9HAJ{qYy=eYQ@>ae1`-3-9+VyxL9Gf9s0nd}RdEM|rx7HbX2-H5G??4(JT z1>|jjt*K`DLPtsj|4C%ume)ubQ`j$5xFgE45G7zWxm@z;RQua9L_a{0W8~AZ+lW|| zd%pirq6Pln;%Q6FiwYO+hb^xI7}|j75da$`zM2bc{srfFGp>2Z^2jqH%%5tAjDS2-pWxH@Iw=}2aH4Q^1OgOU$LMFY&p$-?5E2C zQohG#Sq0=j5`h2!$U%~aDUg%k%l0f4fFCz=|Ins+5`h2(P6z%78;+p~*1sv4f}W1; z*2QF8`{!Ni!IMbpD1-K}8q)Kx3&f=GwM@_&j+&`y83B2Bs}x{J8q&(5*)FJ^#`;K; zPD|yBmm$A)>G!fv0;)>$5}6+`bC6hschJ9D{NmBx;-y(z3`iaOzylq94|K+)@neX8 zJr6+umHN!~eXiX#EkXe(f24U|OG`v%3uX<{4ESn66^-5ioK!?#`h|N3riE7R7H+W+ z`kz=J9=z1a-em}BCHkKlUkI$50ea+zino8_KV)le8Nlms2X@C^@pY5}IyX)C$ce3Q zMTp5{!#0sE)!xy}hy6FR*r-#xo8q(kLL7fksm@y@NT2IPUPGkpq{UuuAAjTN>%1j& zno)@;nld8cZ@gtUPf!QKd0K&@Z>SFbUrX`>wxo%?YO(OY{dz=_1;43E3bYGn;Pd|x zOIi1mKvlZ(W*tu*5I+At6=}1ub|aJ!@R_OqTD6E0wVp_iEaG zHMDK@Lh3c|e?(l3K8gRBwpRo2ZK&B=SS- z;YToxR_5_{e+_55+g8 zl{mioN$%s?>>U2d4)e`C?C;mOm%hQ}+m3qT=3(XjD!Rl(299+3i+kV!?wf)IP~rXe z6;NT?Q0N}xtx(85qhIKMLtV(y0lh%{L=5^63zm;hza{@Q^;BM?+19}jBvNxMY}r7* z^bo*%ISAZm#4itH(+saTu#0P7EvZjZ79O$GwD%Cw^O7F+GsOH<=hK%(?&wLEm-q zeIzN17Q6C3=(}~UbRFp`9)FIH{h>|w<^Mwi~Cao(Rk{QMQByK5{C zK?~)!-Ba<2wn3BK<5);0BgCqsQ2eu^up=iebN0mvCwj(Fd#BvuWQ(F^qQ~8g1JkU6 zj)o~{$}0g2pN%lkLJI)lVEo;keeG_tacW1!po*_l$Dba;Co&KlRmpC%dbAnil_ zMyC08B*wt)@ZQSvB1gJT9dYtkM9^{0rr`4UuUMG1&_4pby(Auz-k62YLF;$E|BaXh zvBmkfID{6xmkL&RNX88etu8*6bRG8mk}U12g#f)_fQdfrMw1$Kg)#z}fgW%Y^JgRk z=^aVkFORQXQW)jl?7g@>bsHv0#N+p1WF@yTkB7|g2PXB)2EURFOwQ|g70&kc3eS1y z!k{#{S6)aa4FG8wUKs}J6LM-vBy0lIAPjgR&txE2WVroXD*mdKy_I;!A$5cXU;2yT zTI5~pU7)T&BE;s$ir-LiF9sa;Fl%wx(OQ~R1XXn9jmr;$5QAvg51eW~Kr$pf=S`@R zTyKeIPq3Yjvn2faM);l%Q+P(X*QR#haWHvUF`g=d)#S7oVtsQ@`iwe~CZTu~SM74) z*$>X^HyU^pNQD&J#6UOtGW{=bg}`1zA-Ir?5Nyz6)NNRWnbAzfKtJXq^H}&8r)&kd zCIeO7L`_9@tfx^D2`OES)YGs!%p%JF9&Cg4(KZ8m%wFN;{Wgo#A?)|_T(U1#QuYFP z99rSSqo%{UF9RZLI^Tu{)s;YPfe_w*--9E9YB^?2zT`w}qzH%b`v$z2+QPP(ge7B4 z39so3+qdjF9PFPpjF8}1orAT$(}oN4+XWHCPKrkUt>Uc_hn=pZdyjTONE1mQ|U^-w(`7- z?G2vGaAvxt%H;dG!dII`Lz6!YR-LpUzG^AnvmalW!4jI;`>I@6QX}hZ`ziXpO*@{^ zebL7QTFU%kTvghf`I}|;!*8_~>wh(+=tM*U2t}97Ul-EQqX_ZFEiu@%lhg|8-GXM8 z76!;=(Z-G9&YhGKEk^4zLxDu4HTGtN&xD-Y`vuCqmN3tuB;RKN$Z`+&MkYOb3d(I6 zduk3c8gWZ6t~ORywEElkWxON&DwAdUoNVT`~D9-xbnCddEB@HRBSTH50Slgtn1 z$s&*PpeCzijjxho(Mob@Be6rcQ4zH=CtRQ6y}GlkNf2G4SC3VUPMm#BVLn;Y!<s z`b{_X_AADa=$Tj&ypZ|eYa5a`^1&f;8imz=u4E5_T5~eQ{8TqdEHIGq0UZqd^IrdC z(nuz}>bNlOy>wKPSz|JL!`G9}F5J|V>L^W3xr1nUqE_S>bkxJeI~n!;5mM}vLB*ZI z6Im>Z4iyGd!v?Jpqdd|46#~IPh21ZPtcm(2HGp)tOrK8=^H@Qs3(XLdTpMqpPssuYT z%D*DT`s7cSM@|qM){gQNTZU)x?O8+?ZxGdG0!(!+c~yJDg4_m=q@zmqOV$htrN-9D z*s?&=g@+gaha>iIedn>!JnX*itp0)#H-qW+05?P5PcIe%jf5xU-)&$!A2EJd z+4?1u^wrTAtOjR3`1k$R5hXI!KI}UzuwVR|dCg5yukRswD6!&QMI=f5sE*UP$woV+ zg}jiC9P7@%l3;gBH6!)cPYOD8;Z}36Z0{X;^Jr|c`6jEGcK?<y)nG42N%|?|@pR&H4CEV=Zw~FVE_M$`O z=oxq8le7_k_Kfj_Lv3hp8@zloV#~aw*C}WNCpN_-NvEvZE(%CcDWJOaYy-_0-?tz3 zMxT@2n0Nhz6+%-~h~I6<+@N{~k@QID(kP?;Q&=ATnd2x(Q^n0oD4-ksMhCRJTT*uj zfjK0}M4LQ`Eqg5=Lzkiar0U&QSNQwS$9Mf-!@eF%`SksSVtG6`&MbLZGAaPUlR{!5 zJoJFfIWJR*V;nL5TU_4lMxutkRkjLOI$SNymA_=u9)H~OlL*rXK3PXQqOlB{f^Fr`4Z$|qvw)WRX;z=R z8^_0Nk%g21cLt4t+Oa@CV3m`Oj1em{O=7U_qTaWF%7emOiC0xL|LA(m5V4~pBgiTG z_5t)8jF2*vxAumB^-7`MCH`Fg|xq zhq+~o5=}U8s^D7?<)_jTPYSp3zlZ=qB6@m;R)5hZtS9M)ZBOq@Pl((Y{J~$i3se~@ z9jQ|olTv3b59DJ&Hk*1pK{d!ykUAax^TsZs$6>F2kC004XY$#C?#T--WADsFdFfRG zhr_nFikaZDqVC#~`UJ>x?2_5{d(QFhY61ir@v)!6D=Vc;vr!`7x9r|?)iBmNyk!^! zEXf*;Ei^W8yy#4_h_A#}rG)LVq@$H;OyCG_CNudZhFV$i!=$mx#xUm{7L|k9bVyk6 zxHq?T3eLh^zNTDdI0afoRkdN6#FK0(_vO!#q6F&iF-AM3dM9S!I+)5)Wm^-fjPjYK39t;UK^x30|O6qq_td9X;=u$_Qvy5cNQIb=TrIkVu+Xy>vf=_@tU zrY(Eo7%+v0_=c-qea@(dXfd48EFq1(`E_j*Nbr3%kNbK-SDts8B0op*xui&|wPzGM zrcUha)zU-V$dKrrHA#u>rndRTimU5%5FS4H0lRBG@GTTPq{=2^;%FN_;Y6luKSKM$ zU5cxi$zJUiM?`OqCA>c1#+B(pj}Q*@qZNjbng&m13;=ZT5#PY-1}TmX=Mf+9C^BVV z1J$3A;mJ>KJYk085toenp6B#y3Wn>yPC7h~22;ee5B+F3=PVDyls$D?pi8ODNj&I2x%!I2+%sRQ*Kcx>!wuqP7+3XVNNS`9$%P>ct=P*ZgAK^#VzQ(8L z@GZSnDr%8T_6vduER(amvs7$-z`xNg#=@Gu&grxt_Yu3qfGKpS{A0-qN~{nk#6alM z!u`*kKQRE4ShSj9pIU3?3kYO17d>*Ytku&oKV(Pi4TVwLdG z7rOkGVu{v!m0xKp@MU%dd&TTEbopGVD zb>;&n73v(owvU#tmy653TRsME_d`0OsHIeG)<~+XI_G{<9GbwqhF-m>vzZvu-K}A@ z=S3-$2C>f)c>9_&qAUB}y!8a@Oh_?Klcr#%0y2q3e%G{f=Wa+zP2$Z>GbC<;=|bIr zcpXmF?{>>Qr0vxpQxEuFHJR43%hleQauE|w1RpnA(>*rii;SNBZYW%SC+j#zmV%sR zEdvY(S;|KyVcx9}0 z8u#rUB~A#zT@J8zh4mD`MS((U=mCqVU|_tjA<@P<@m*7@&Zd;lvWL8(;^2&%x3o0* zIjVV6F=6Lx^*QY==n8V|(&Ts1St!MG{r!~M{4E8jLkwKXTa)s~xz%CvYp{9}m;f<_ z`!;CeOm_g|yueMZpmGVNE$4@G%K_2eq1!1IgfR+i@gwH7sh???195f&1jM|=~W9V!2*r#TInVy1@HGwGH_o*cY`C5k4aIxWHsDYkj8`?D8_d z9w#f+f_p-=1Jod&?&JGD1U5C0+qF%O^&~Jdapb;j^ ztH8!({zp1Q5?wc~c?q|j?zwG?SEknBTRt;n8WMQsjX6Y55f60|2!Jcskyv}Ls*x4C~d-ViB{Ifn~ZNS&Y4 z8a`sTl?pO1f9JRDG0D?1Y=aGeU_$V0oLvzdee=eR0y(zzXF!I1+qxpWqRhn~<*do! zOztg46H`wT|Glj=Y(%}#6oUaH*wt@r|H`1SKSN6U`B z1!oIF2W|*hK8mfPTAPPG2pakpW-5G4(LrA~qPByF`K`WB{))~V&9i#P;>8^(mZwzX zV~X%Y8hAq4i|9r$)ci{C?~&tg>V!q(F#J-(YBcs0Go$o-dcDX(QapTgJNJC@g zuGush3NY4AI2AHWnwb}`jwK1uLQjhJDM|pgCR)|tI-n25`siMFEh|a(@{SW*Jv^#Q z(@f`AM1Hs&bJr*Pvw8jD_oY}e8E%`5&yE_vM*T4!_^4|@y~A@;5-rZBC`X>%ack%> z&JGzYm0GJtvL$cQ3Zz+oBlmMO1vXEciq$xnb2f6Q9r~dlPajY8Eu(Ehjy#KgT=bp3 zqffju%Qrqr%n|PhZzK**kvgozo)A0_W)`eHr|+AZ zm01<4_)naO@cG4|zMvbrh>{uHX3_ckN zX%xMW@Q3(iB6$eD@~i?B3(+E$)ju>K|_STtq{m zO8e7x$~kZQ_bTtf0C|P1)4uD$g0r_3?7N>vlP#7i9$XR2ni=~3wkO((AemS_HI@H@ z32vHeF8`xC&Vg(0PXal>=#x=0aDrAa)JUtq^7qgfq`OFn`|QhIs2N&D3kjxiWx?&f zj_q~rUU1GJ(1rz2Ka6ejHj1;lp}Zyy2EGN|V%}mugR}99=v#EMBeX&4*6Qn)2gURb zr$HZ0A^EXY9e%;itgN z)=suR?>mAXCN7=0(9fE%^ODN9lYhSRZ)&DJc6|Ldelp}znf{M5rITnr{J`-7ziofw zA~RXF0$ZIG06u))eM~utOVIuJE|Mh(+y0jSN)6A(WWxf~757bOS!lkNv}k!3!{RA#Lt#kjmf$gCE5>5B@3LSFWRSe z#cjL<@GNx`7FvY5rWwI0V)m2X=D@g|Hrb52}?7iGF8)6B2DyvzBU!I zmfww8Sdu3B81t4&>t{+QDW;xo_%M`nr@Z+rS??ANf<%iPn=1EvKR5bZP|>zf5v*RJ zWu14@gk*(U6rWM&&W29{>Ioq>xDa-G4YwQ=lGFccX!Mw|lzVL@?yh&Rd8O0tQOdN% z#han|EMHto62F?FtJD73Icu(v{lj6YqF|E2iWlh#`v942WbrdS+!`+sAA>DGT^03} zb)tnFz@>?@D&jX96)|dH;-6;oeHf6DQrxe9ObozGa`j@Cp|A;6W;P7epV{wqN>yV#^%IG&WGN#D^4mATCIyj#Q3Rm)c@Rb{(%!$+!8 z?FqnMQwoYmeH2k(V?Zf`rr2d|f1a*9Y_KpY=ZZL}FuV!f#So)DSrb`t<8MAS(n(0Q zMm~?M(?`rlPN}TT$yQ|@3t27M86=Fb;;HR?9)$f&DrO$)<->sN#sqPFGa%v5=Q4E` zr)17gd{00U>pY0Z;w5PIQO}(0#0Yh9-kPX+GiBg?r<}&00vcNsWNZs?klo{hm1&{s zL$?(uiLS@q`wMz){$oE~S=!Ivabmb~BQz^N$7ZAM&Z=R4AC!abC46lDgdbIyo{y`m zDMJ@!*DY=U7P};$EX8gv^#AP4biVje$!){%%Fpi~Ax9(Y6HWa~ReoW^gD_3sjYi_b z8@HRF5*uSn2WuS<;$tjZ<9W=A!^4)kg01X4ZBTKAZP(f58X|m6t^^Bq@LOM~|9M~W zWt zuK^JKO|{FV?~cX1{4Qm9Epaa&=^G{}ld&419H=DRvKvSciP&rJyVda)sj0}Y<>C3h z_xTOB@hKjie&;7dCMJpw+s~`8$L=m+GxRqg3U8Bo02dBwBkA@g=Pnn z?sDd-xs(9-oj!U+o<%F`gQ%%y5+1s+xGIO71f|p%W+oW1d2rrdX*rmcuAjC}&wuB88aooO^d&%-<%==v6zNj%YIP7XNhxAHSS_6!abcip`ZmrCK> zJG7U?$ZF~Pv8Aj&bRIfC;VBwp?0fH8DN||~)Nwo3_Q-Z$b$c|`=y=F<4zgy1|3uOa zYKFf6PK^;H_M4kJfw?Wd<` z2)m5Vk`=&ow;=EdGA;0V{=j6}QgmN5SCM1)h@__*FF5pTTe&5ziN%qHn+ z0N>;D$UqSP&?bwm0Fg@#3qq>9+XzrX2$X}Yf1J#;{t@qk5YuVYN zu731M9gr&}GASf|aDgXJMl*geySVC1+Xtz|cb@gqH{dE@PLR!62isN2IHALshbs3rUuAcs%?N zLORQ;_g+yVSQk#qe|-uJz5;ERU!FNI3ei4$XZfX7%^pFN1{}+BY6@2UNQ30V5wP0+ z#e)$P?QDm+=1G>|`R(K-rq6}beOlv_)r-ez32`;`6u|fG*TmvXeg{tCX7Io&Mxg#s zeTSFwi3uiU^o$z0w%*htF zB{bP(XGdl1(x%E0G=BcwF$ebG7hM?{(L@a0fR&o0V2Qng-xv`-O~6y<}sW92W1+^z4p_Iw1P9061E@qx7dD_=X*CfqRaay(YN zLY$YhsFJZ%7xwTbczieXd_K80@od- zvyS^iZ-q}RofVJkv$^co5C1q|4y|5EB2jaahRKrQ+FGT0C1e&ODQ`pf!Z!8o+A_K} ztzKZ+hyl1LDPP-77;;fC&d&4`5va4LK>atD+w|=zg~1O^S{l z-u~MS6e54NgX#vI8^DKu}0<&ViVeuM>L>w9?4y!6x= zdaU$@ znTQw({0B4;fhmAf?D6xj6Iz7xchZ*Kw8pc4*MA^y*)C|6SJA-_>dGmdu5g%uldQ;;W}n*;wBVb@mQeWrmmXz0thj@ zR|j%LVancPE0L0oGCc$J@tObHH5VHA>bm=np7jRx>$%pL&2M+Q=nBpa6q>NtVOFcVmiewrwx79a( zoBwQF9hn-;O}tw2{}k=x9P_tg$4nQ6SI#K?xyY)5#ywvBBm4N}N!DBci`C12(`gO@ zY1Bf3ubf)WI}vQ*)t?Zy@#y*CVULVmV(b|Nf^t;KzvrG~S|5IQzv^Bq(R^nGkz~(* z!(Tw6ru<4K0XPed)csNd!ENC+X%{qHE{|;vj@48n(Qdud16qs2N5ACAj5pw>LPA7u z?l=3H%ZOa%DgF5IUu*+2T@Gde>_1NPobE9FAKyy!Mjfw5Wb3f~-91uc{!4z;w5fpc z?QjzS0q>#%G%qU_#NhK;cgd5J!$yyObX9gNx|cIN7$(r2kc;$S2zpI zx6)8|yUQFDED1j|3Vzeh5SZ3kq$zgMtI z<5ejlV+mD|A)Yjomjw)B9=e_ng&(di{aoTqsV)})STEH8nJ&LfsZPFr!oH_A`E0`g z)TKJST$@!{8|0ZYS5oTz2z{S}bLzzG#cs}9hyjtJdh)cuv!w}afrWhU*e#0}y!^Y2 z;=qGEUqtsq@skhe=5xwKkf#95VKc#KL|5t>YC(Z4%3549>)OJR5Dt!N?e)XdyH$Tz z2#6?Dz}UTH8xofW+CI|%xE?oYUkncx;gjUI zdqHoG!3XK1?0Uf~ClCJSgHV?Mo?p6U;$7U08m~N&t;(hT+8Y_XoTGh}eJ!|}YNy|T z>Q_mz5r?-Csa7BCV;l|{CR+TX-&Vy)Up>b_gkn!+SNU3stIp30hMExOI`6Y4LZXY$`%@Dp z|FZ}W2$uD$f|o4*k3X_|`gUJ;m5j?XG9Up((U}f11mJ0GHo$QpSN5Q|ojq^pq35mg zYjXcV!l0cWouoHU=7K3XXRIn|c}&SsF(B22MQb@JNbV4gVmW<(C9E#0KImB6R`GZQ6oJwq8`zH`r}ko}Hbd4R3lb@V$Z+OKvMA{PC=cp|@fGVYB0b9|PI6 zXk`4eK7aM5{?a6doBr?fYd~Q&v&~*02IezKB}Rp6OP1Ri4+@jWKYw=FcNpL^9t|YA z--2^=zWC4E$78cw(_$eVC6kF%(MkigZOFTc_*>SDzizN`XoQb^U%^N! zZR`=-lC(~9FQL9Q(TsA0`g%Rm{${7p2g4=KBC6J1$X~gx!KiM+9-Y6Ea>MmI-(X@; zUqhN6wcosrL@?VCdH;C(vPTh^=}Y`ni{sez4&&kPPT;=rkl)#2&0@pKr(x|{B!kl z44YRv^aDQ2*B6Rq4}YcN{dV_9H$MDK+B&^GY)+9e@KM}@uU)bKBf%ozr4>*dl(fZw zR2RbI#lkKDacBrgHIn0XG^j(T7~?}wUHX#iJ+j#$rTxiBma@M>et=T^#C_0`N|vqm zTh~)eNXaY^OsO86Y2s`dn$xzMOR?$A5x{2PmLIA%>s0p%XiGZ?_1zqUkIzb+bkc@v z#AKgJ-VDF3-4FKtQ@KC33bW#t1H%SztPh>)(SZV!Ejm2|08&@~aSi!~iEP+JOF-lM z!I}wYY;ol`v~ZjDDkG+h1`|nLbjv=TeZdRs6llD)WgricWByCA*jgl$ky&9blg}S^ zW4rloEk2mPKos$fXd*>>fsSs+y-r#jab~dMPdHbo`zX*deh=PkQNFQ zftjlF$rJ4*BxSq94P2T}>jhRgl4-LP_A^V9%#L&kk(@!0_s#SB%7JIsx%7hm%MG_= z$qYEd^k0=3ziP}jU#*zkJP$d<`Cd;A>r_h1p`JPyU~`Si#VHLPKK~LqN0G*@;@Bx5 zQ$9I5h1YZrhMZ2mfEF-;kg@8FX~gP0z$pmf+B~c66SwUwiu`&HJRdusSHyA8r=*Pm>7$H&x3=$u-Y}KO(qZd7WtY1NrDklm_)Tc$3EX3ZAxZ{t9m2+`Tpwa z+kLAu1!DeDn?ItMrs$S2-B+t4f8f(U*`E$f>Dw*eqiD=1-6>)GcKzl%517!9Slw#?ODcXAWaZ;FM8u=T;}q#JzS<%qkj@I-ik ze1A5a$MxCA9mUOGEc6h`#_wdu5t?a&-%!F@sChssmD;^Vw-FK7Eb-u5l5!!H#7uL) zBJJueQ6#CMAG!5s02b9Uw?QJNS&ziQoH1=nfe@l-Vh{*^eAw;O80$9gZ&-G{eqMJU zSeXdOq{YEUkv+vpfkmgL6SIhf%xZukEke`c&ryRhA6HJh6N3N;4mvWre(pqG5nYB< zae-&Q$3D%v`(Exv@u7j!JK5FP4rj1*2}yCiIZfVf6FgY-6{?R3E7@APxo+vk2a)4Z zFual;IpsHM3kX?pTA0`RqxdY+v3X7EWGLW669h4j&5zv-GU`mrU*Cu* zw5+Kw^4Y?e@*CcVR={<40I$H_P5co}0>AzF4ET6r%0oNxz3S5|GvS@%?7 zFm@12-< z#?7GsEMc?Ds<^6ZSD2%L0eyH1GrFi62`di@%?W^G2?JRwT!O1w~qS#rk0@XvpFv$k8H&>h%HYU$Dflw;ylG z{I-WhaHB)b6n<|4#JtQvzGs)0+$E$~)*u+3&{5ZZs0w#c-RA_Lg^EV9jf*dPQPQTucB*~#SrZw1 zgk`JH+}z^?aNxfMB}AjT#WYA`kWEecPEB4!DU3$-A1^|RfDdxU=!tlz)HAmHczgHl ziFmCuAM?`x-pgcCJkSeXrf0Tg1B>DAZ4sC1|y;Lzk*x) ziqq>z>%<12-sH5lWl(_*UXWBKAfE1lF#|2l=r4*vetT1P2IQoR{An$e$ZJ@ODxN_s z+immF=E!A-YnC8$pS9DQ{K-?63G9H6>`Gs;__}KD)_O0g{V#5XW4TZy0KNo)tguX5 z4OA&ryZNfGWoK)^rwz=}73xeGhWq;}o`{f#`P(YyixKhbza)MOSv*YcFWMnko@ksC zlik-+nX?av-6z@2F{`WEQGoo9LfsR4->h|NSlib8!o?XnnH(`k1811DY#B4DY-4#z zF^g8{enZQkKqlvFt3CFLDkrAE7?N#HJ zp~~XlT4RQ_0Vbr<=m9rXao<&Eaw;)Zuaf}Y>-6^4XakqN?*ItaSK3+8Yn|vae3VEA* zlbsb#s2cReV=eCyC<=X{!t&A`gfs^3b_eR;T99FV?8zj^XQlV|OmB9obyc`L!Fx}E z`b86KSmUD6Z^Dc&u?g0Z47Ys?eQ`NALVkPKA9m=lwjUpcjLh3oDkPjgftGGds=z;= z4SuM(hH_!6lB>5o5r>`DKw6Ic#Y6osRXTzm*UCoo3ju90-!Gqv^xrPm6tKY#n90t9 zLyf3jx?>`Z0VOX;9H0rC4wH2<6@t#T;u;#NwYciK$1Zd3>o#uzU~IiBgXM3-!RI+k zB7GRdehmH>NA$fWcTvRo4hFRx)MW22{r2p-mYpQxPVL~Qk{pA-fZ&&bZW}8PFZ{#u zr0?-@-ljGkp?MUGEk73x0!_^ztDN zG+sOC0sFV;e}W9xyP4iP=z@{A2%Vl1YK#BMz5dgxH0FD8lp}Mw;!Rt;ym;Fo$p|im zm=#~Y3<*|&B><4kvvQ*&c?{y-ko#j3AL7ReCyDRnbG)vWHzy`57N98tyfK3xFJGP+ z^6tZRK*dj(U}G$irLH?xd#lY>geW{J;dg6Fp|ZrEiW4Q)=RWrsdTW2X_?5i#`|7(; zR*6+etnwxZLa##Nx0M4er2$;ae4HM;r3@$!Q=JYBkB85w|u9^TSXzQo5HFG z*3jPA1KRPzw6lc6Sm<)ILz|u-g#kPx@)Vx1HSk^)=f;kq3G90(?If^~3*ZJ=Kj_|@6EBMZvcCWv z26$Y0L-cM1fyoBslF7@2UIp0@Z5Y`0Y_VM@?fb>OZ`FF7-#_eiK9~bWyx;m^V*+hu z8$j&e>IOCMIZ`w))z#CSEL&JCB96Gq_^KnI>tt_GAWzV!A>#XE!{E-tE}MT58RM9? z3bYzv>|TL7eVxEdBNb9IfKECdqkFJ+6KZ4*QmlC^$)ahQK2K90ik1^HM)JoT(Pt~{ zF3dE~KE`9kAI>*N0QgQ#ZnvKCAZe@GUh050nPF-6-o4MyDtI2AfA(21Jsa*d?k1tS zuOMELdAM3O7;8y|em-6eZ?@_CvCXiORW(l_VjifH7|a3~mZOucU195)vlpRja%=;h zj5~APa$jYe4s)?#TE9lrZIOg{Ysd3OAIzBkw^O%Y~=Xrc)`M0?dK~cMyyI34^Y3FH>_as zcoul}uQ^!zG>W$UK65eKN-1LIA^1z?Aa&X$rqNNikxD#>%?Vk0nsM*M=`Hc&%&Gl~ zx&18Bc%qqGpB$aI?Xw%XI}^8j>cu`QiCdC-U%I_ku$@Y$!u*GoipbSMF@9B|oXRyo zm{|2Swynk5yQ@i^NG)0%St$tn0=s{GjT2vdi`uiu$=wjSfZ}b%FX3?XcB!3a5Z6~y z7~!MNIs97=wiI=~tC>=crL{khWi48d6pMv^)_EDG0a7T-Su*;${6X_4Ys z?YOSVHE*hEV4bVwJ+J3Z3hxlAa3)O3UFMljLv}H3gz9>q8kkDxH&rTOnzQNn@?X%s zQ)zUu-mItS*o2+rTwlrBW(*CvvQn8Hh?){p)Y==38zq$$f9$LWu#GgY>YeL)(n-<7 zMg?gZw^-WAU?rYK+@b>`6@qXg6r&LS7#(yFvxM1;3iY-pF_U)owQ^ymengL+2(F-E z5b55CqFWA3ohSaV`Fet4<+jXY$s7$Q^U|_nBkEEC{AZk^0FKDSgDLYYl^#U^hc1|} zVBPSj#0)TOLXMZ!rm~v`O9=59#44HGqJ)2?G*Zp8%oB6TxQ_f~%0luKeP9Ec0dJ|v zrc&v3OaHoL4{bYL(n(68;g>l5Yf49O^KHMI7F}ziGSR(n4gq-WQs&uWBE6I`Kd3l$SesuYtMmh#@>J*9~H`Hj(Q{Wxq+k@HEY zZK}}pZ)2hCu@OLbCIM=U@-S`L*UkCzXot;j9f!xXDdJ}&Vx3(ISy!A27!CtB{qqZ1 zb?t$wmL|v8<>2gm>l+2558j3U$jrA~Dt0_l{0t45o!I-V>rIOKIa%+t^Nh1+B3LY3 zo0I6pJI)#`^|GOonXC+@Qgc_~4}9eCBpWcR!WV-TzYtP=(_f<)II+0y7YwVISo@|O zx}-1+KOi7-22_m4m8^x-?dy@LMdvb_BLe_0dd+P~4&1_kDMCaGaN?(xoyoGy(r32t z_ruv$={AHwH6~n|Aw==HyIe)NMJ;0LueFTcE8dJ(U8WN48x3Xfu}nz zd(geT6oL9p>>S`1CVA`TqCS8^_TDEt86-<0Q>(05z(Yx|UIG}FcphF@sX33P#|Q%T z72{h{G^I*2VSh8qUa3_x77;N-WyUKNp&Jysa;*3n_727cK~vZ}=1Q;0ZLPj)-CrzJ zy>1asv)aqM+|IqLI>If{%xpOaDO(cAFfb>Kv|MZgr#J&yyV(elTe8u$8bYSx-_yBn z-l8Ku719!hICN(!A!U;^wz21mH`DTVtD zw=8&QDNrE*BRCD_jYm$FT1=eZAMFn;)AP05xc_8I2x?jeHApIe6H*ANP=!KGg+e#= zp%iXxRT1pWT>Ed53fcFOfJ~)*%N+1bh&~=l4+~sfX>y*G1a5||1${L;-abJy zZVMeS4)adi8yVp=PhET!gRQPd`4WPJfTsLRyglL`&=9w-Tue}yN*<5@{#PNy*3>-5 ze;EuQx6~qw!-}_u3{A%#^C|ufeWwvPF&Tp2iB1As@(@f=eqd?F{h79s*=ItOW4E-a z83Ac`X#bE7hT7J^7o@pVIM38#Ap;k0RzU*HE0cckEMG1X2(dSk>0)@;Y>cmT8@KR( zRPoMz)ymD~;vI!>7rFo;NK0##xnT!m5l58d%r6)~bk1#e{e;z_vYZnd>+>H9Hupp!=aZ zsiK(@jR3%YxPQYp#{VIzEll>}9p=@#%SOLvMH<$)n>6|a2?1HgzV&1G-{YW4tL?HP zk9US4SL@$t7ldAQoSfhpYoiK5kmXs@)PDz!#*&ULYl#+u%O35QOb-{AsXSE#V0I-6 zHY{j@4ETx+u$NQ|7@lzqG%z-16w}r0#O=v{X=lO>BbQ(DF%XV{`=|+G%B3Z|&`HS2 zl;3ycdrG=q!xy9&h|t>9LuD^8bq$A^eO=paMqyVR0 zVkW~$6BTxYIUYg*yBfV84!fnP%xt=Hz!e;?S3W8vhpU5&lAFn7G7Nn2RCxmG=n!4r zy<2V{1Wf;kpN<}O)Uv@3uB;hhogJu`&+wf=OSuXlHp9}=&?w6T#S#oIPXGLt8BUc_ zbS+aYAA~sj(U0W;%?$6QrYkD__5RnZ@wpA0ZL~ft{hIptK0r9qtIygYZpupoZx|{v zi>3Wkf~Olkh_&Oo2-U!+$xzuDv&Rg|OtQdh+iZ#Idr_6s?Q(j&C;$}~=Hr#5*rjXV z`!+0uu!SIP%G3$gBmEdgSYos>to;^=!Ap#Cr8I@J0hz~AFDiwpf>`{9m>(i*6VaE6 zR%iUAY^bB`+{+=)2q$=wQ3`$iyLAssxx-V2p0MrbHg}6`WSe{+q|bOQ<^sIf)vAA% z8}W7BEtbt74Qa2&Vho)xcQ3vJ|_uII($;rzu~@bA1k9p^?4Y zP-PUX0?Y#BGf@j*(vtria#lnqH%Fw=59$68lYhFQ2rN#cDB;(>nqy2eynd5a`JJ4g ztn`#oEC2qiSD>hyP0Xabs*cPAR(amQ>@{m2%VFn7T2l-!!zy+tWK*v$VC@;-X%=$5 zPYHUlyps?=7i04dv4x=xaGDk1p|j8JZ@mq|#)Q03uJZ&IY(ePdT@ z>T?lhl~k&BE0)?bI`aPMJKi^Z-koJz3Ve@dq$$B~B(@cTf@X^pt13RoC)}{#ZP;K? zfFLxq9&csyG!d03_~ROngv|2i!4tWW$A>?RcMmI9fgkNXcMS<^G5g=Dipt|o{pUDN z|FOWIw*c)JQ#9bjPfvn?q(3iCD9~)m^F$`BU&MQ2851!_3}56~7olvQsy-DdMg7Mf zEB%l^E#(^iD+-I1tg`9sEJx<8rFssC-Tt=kpP8ktKmpbAUz?QpURTD6}{R?h` zi4rx(e6BRw`CGS4O?vu9-^joD4Npgyf<-Fq#~^( zsi{#z8siR?ue{#-qPknxR&aK{v%fo!0RyfBPMgzh>w;M%A!#kS5d=yO-NpQD;H0QR zARj|`mN11HUs>AA7SE3u%@3vceR;E^$hm77q8BTV!K_-S6zeu))YfN*>A4>Ok$9yI5pv-Qj0^?a*Z89bwT(ac%z!L99twW5Z21(y-;C80SCYsmp;5 z(1z0@{nezpLM z+38~=W2W>D_Y0D$+hhN$41*Nu84ps*yz0zAp{n*BT|T(10*LBv2EZ{*coSv-bjH1T z)>{WukU;#vqKLCgw!kc83toFop(iE6z4wfv>44YO-V>Bt8~JbY$_2qC^b?lYF6#N zcVmxQC27&xd$wwo+FMaEYVW;*+N0x*pww!FplGYMQX^=o`dr_?;QM>-z31GVbI)r$ zpAX{1hp=Gb*PlH;Jp4AA^d{CPN06;+Z8x6$VHR_-+OulpvboUsw|)JXGh)oV~@E2zsizT<5zPRC~LLC4ozC zGaiS|^ZFV-H>uta`~7FNRY$x*xTm!K4#l)S!cr8myMU6XNCDwqgP?-M$s*-^KaE() zz0te+^ZuDs36}0af!)i&D>DXpYsYFwX>pDTs~s3Xey297%~J$nNsAByZ&`xI+43Q# zx^rzY%^(SV5K~+Km#HQ1p8df0JAy544iqm*DO0d#SD|$QY?k}M6&VMOt7U^1V8Sd&sTvZ!H zw;rw{6QyBG8`Fp&em>8^IcpwA$160?(h0JH6@eIN=`vc`vD6```@8s&i{C{7_Rbw+`R*Fn`VSXK%BQWYDiE?IKHoA3FMt=82vWx03+x>Ut{ntDS<+}_>0Es7+fdCryh$ZPmmlzPunhA2FM2=<>~}y$wa-GZhTZo&V;PC@-XuOL0M+Dk`a??^BHNG= zs>j;GNBBet!I`?RWlf!1CU#C{*jJ8ZM`<(X;ggbiPdS#rYuno4vT09wN>SG;WX#h{Ar63}H$ZR2c@>OpgWi2#?eq`8PeZ=SCvQL8K zE-p!5J?~br?{RWrl1HWA2QlUfBaolWm9w(BTT4AEj6NGWWf|4R1d5%FI2l_Gz8YRp zIbryA{04rcYu!?ks?HWWpG$>poZjoA~e2mvw( z46MX@N|7pkCAu(6PYHKOr|M{@xro3XTB6Lv}Xft*=2|vOm__MN^7% zZ!={0m&zPx=0nTAIqN#OI4>^pHVhJ{1wC|*c8hI_M*kZCl)TZzo+R!=8l|!uz_D0C zoj5xBv5>?~GWHe)e;XmXs9c-|R@6&_dj`tWWmzp{=Cis%U7{Y_ZISgU&wXW-Kvp*U zs)dym6Akwt#e_fOsZwJTRQ}d&27>G)=&Rdg8(+I0cnc0fl9=#~QK1#xfacBkQ^pGQ z4xf7ppitt+0!7JepX0Ydh}eHM4>*MJo4(hZ71NJR%8j}JVcKr^m#aVaQSe`T?N}#8 zO7|4qn{dHi8o;^=e6qcxVZp7Uy#Dqzm0;p#=DGJ<3M79+B~r@nA!7oLjXYa*Vl!e^ zD<$gD<(R9}k}nk8vugg--+Y9kW}e0x%Ww2#IfC1E(-GO^i+plr-IY_TtD?~;-^ZJJ zkiwV>eZQofCO|Q63HSH6Up=hX9z1AmB(%JfOq=>7(r-gmGDUUY0WyA`^ncskZ}77QoXRz{n;d3Ws#|a+R0;}Zm zIj>R}8piZpbesX-Uk!(fq%V8U42hqN7T`%{wMbK>nz9rG>JU*Ezc%=A-h}A91=6ZO zBjdu@A=UA{(O$^?4y)kc%PZ`Kcee8U$v}q0?pT?-{MDB8Cn-sx#94ycn67FHAF&*{ z2D4g_s7=s8pFHC9QBZE)qj7>`XBIMU20@X-=51~r6b1*t8)dprIcRmN%!VA(l0z#& zB7VDKA2@}hJuE~JtRwABcMyesyAMe=r}>!MdKLxW%vVUusH}o-oIys}A98L#xb;-b zei`e-4|jHYQU|0KbgYFrDE~+t;F6Y&;`S#kG2#bev5S#fEsQlNR-b8WY|CdeVd(dG zNKTyz;laXFNLfR+lG9S~ea7nQN&F{F69f_H3DpmyDwo(^FdlQdhVmsZu_mw02Vux7 zgup}&o1BI($GJCHR^-p4J}%Lf<+Hf0&+rTXf;zE!6J9YbtXcKd4G05!(c9oI>#O?7 z5ARD}(jHCRcMEYr5-!WGGCane4+QcK_f+s)}6EA?bR@EKKu zj$f9K*1Uw-e`SxtjmE|B-;Cw&I_{kh*nw!6Cp+oNFY3dJk=Y(uNI-o9$~%|zP)B!Y z^0c*&DACbq>E5<&EliDR*S%^vYOF zW1wIA?CnQ30=fheSE(pz7_9X34W>c&bE_Gq3cKxv)X6%)pZA`J`f_f^*WKz#?0jvE zyp+<)oC&_p0%vJ$U;D0Gt|Pk=v?VElV826Bz_HDMcVsWV_rNl`ZMzI2~)dX|LAFaea{dSO-CVBzXo_$Y1HYpK;&I2Sp$mv!ypW?gS zH5Yvj)r?Y9n7z8m7X|xA}ZAF(s8@!Nh+3kI(P{T z^)YcH;+rX)@5~2uW$o}u)N6{!jQ%S)TYMdBhgqyZzdTRL>acwmNa5X1TJA$b2PE>G zDC#L~6JT@TWgo!YR1x63)36QX-!zR@PsjKEOZ)E*7WB9&s?!30s&%e^l%lvV4!xfP z?V)(H@WhWw7h0U>{BHE@ItFJK_zWF16TwKmWmuWFq znOmVvYkcSUB!Z_cGW@IKm1G>?RM1Ry$7sLbU)0=gJ)gKU4OeP7H0P$e)-xMUtGrMZ zR|CNfz$(zS*MnB@Kvb1HzNsw@*Gd;|X}&k#|F;cH{mtvunI<2ymia1z+<^c>DY0a1 zyK%@1o_{~5NX(8V*QN)ipL5af?jl#&&O2DGc2vOkKVjm}8kdR`LZdR#Rl`!kk$5s2 zeL0kyu0^l>S3sBpyE>vliZ`Z{DZ-x0{^{l@yeBG-R<>*j58$=VG-D^>$0E3xM#+e| zpa|3<-niJC$e=qouZL{Xo~W-i<)66QT9ckaZ?TWc^>(2LB1XIjx_>JC^qc2d=jE~E zUl$j~vF;I&$<|n|gXZC2TIbI`OR?ym3P2V`tf|z#@vGn-m*|9{{k!(t{S3N&_L(6R zeCdiHI%h@HkCj$3(`t~V2l~CAV&l@~oa^6D6jeCkLDeLXAAQg#+xhEN3+^pHUOL|^ zdYj=$5-nU6$!rc0m@|JYV-;dy9<%_6%>dJy2N>sjRCmxF>X1lLB%gl^Gr;|##-maCUwogOJ*YQ4~mNaE$3qUK9fzasqrF=-%4DQ+E=EW`W`%ydJ5A7 zydmYBT1C%xRLF4ZIrcI4^KAr$oGpdWIIaPz9^XIic#()KKtxy6ap)+q*X`)((5kn# zI+dUUhMu_Dl4f+O*5B>`G;rS^Re$xZ&Z7fgVORiwN*X`Zdd{gh;qxFH_~5WH;^uv9 zdQ&1sCG4POoJ%jT#6fxNvKUC!{S2hGAyXk99%*Fuj$dZxnf9rF*E&cX3*9Z$-{r8z zzkQ~cr^l0XU5sJ_E$1cXF~ZY?fPv0R_>8+Drv7G^!7DBf&SoP&mbV#8mX=Qf!u70Q zGIBc603IxWnemRWE}6=nH(rqIB4yDghpGg~LLAG$=F&-`%ih*3er50+@eiyr0)Y&&1-M7{M}vOz$L?dJJ6CLRp6 z`2C{c4naXPe*)7a3}I*{u$fc#t)F&~0OOYbVZEqV8hw>0SDZ_X#yV)neDM511*uxMwx+WiaCqOK3` znloS(;u%})Vm4pQ@5LXVbf|g_R0ZG>vn-kWL(SYoZO77#I{YUAfQ09!0(RFp`ZiC7 zFtc&=6n%jrnDdr@;!7>m>Jfh_E~^~E|83~2A=h@|R?VDHxjrC&T-x2LUz~!iX2?2s zTnl({$JZv&^j)(Qr}YeTdPn0?;*uT9b-&-5fU>di&y?S&yjrP3M+qD#Hfd|{kKYhh zqTa$%UO}NK_~$NQCGl@tTGQjnPq;F7qrU!H5-RL@$nwlI=*Naz`(>217;nL>BwaxK z5QC!fq0O(v(f;7N2c2zy$hrojUq+l+!nnvj#qr;y2(=#pwS(O*&s|(HcyFZ|S0gOS z9L%=jOmjSPa}kPx6G_wZN%Pi#fYnSNZ(0sANyvzK8&-)}x8B)W!c+Q~dizTX{S&~N zRVx=ET4-kP^-TKO*jq1Hc*rusuG#GT`2@MACn3wsh@%>$)VUCze7Z99Z7oB;<~?Im zu@+om_kb+j%VfxpLr6s(fWtBA#tZ1GC3+wIb-JA(IN`XC?G|v1=~v5wEBiWp3C-4t zi%+eUc< zLV$l~vi*WnSZbV7q4_gN#+V^Y7z?VOJQ z!#|_*Pcz~m+#oaxc#LYD`Ud>FEnNM(G;%0xo+aH(KDU6rdf0!(ECkDprtggNU#fib z*&>LDr&K>wI7(_e7$e`zjqBE8T|+b^t2pjZz>V`Lui!uOa@3-#E23efJ$tQYR8E_7 z0tKIS(l+l&@0b3AKsLX}DF&wai389$cong>E2(Kg^gUWHk%#W^K=}QzvA|f+T^~PW zvPcnk`jhu++o}&G&BgxZ#+{RRwvo2z7dL8JTS~MsFyAd7*UfNYZf?}q7XSI%7g*V{*FrinLSCv94y( zc-4`fZNBs=`?ijNEw4hZy=}sT6SGSdzp~4)!Av5nss)}1@`3|*g=GH=!wXB`%C?c& z%~@3NG~MjaK>xPfE6kc3wMLUUvbplp@o`RJZogt_otd8WAGGuh1W=V=(#;o|Z_8uJ zi%MgU)XZGQ!KJULg;-pl0M7u?yPj-_i7xqbX37?lr2UH`1@fL@AS! zjsSbB^3Vu)l&eS9;N6F!P_`0xG7>K6j4o3h*PsVWxT_o=52K(FR!W_leV`UkGRDpw zRp1`s|7A&hbBGv0$dX&9!?5Z8YDNllJ`>}#I@X{BQO)T@!Z}rK$n?@}#QPFjRvftspm5f;4IMH1+y96EoA;KN4P^H=ipY zzuKGas7rjV5U+!X1-#auMmSG1rGgC@0jAy;F|>B>%Q-juEf?4aOaOhtNx>h#Y00^k z`@(xM>&vqC9u}E$uoVu;BIsXV*reH~|314)UdK2a8x9a>AC|qYF)ez!GCM|oFgbZd z#t`q?&I##cUtbJ70Kl%ALqCddmA#6BtyGv82a9mfcpKVY_c<-p$m~5`?0Wr#k$Awe z_a0#Io))oo9(om5A^^-Q*LL2EaOTj(KAq_NVVV-EH?}u^%W$R}N4zvfFbXVl(W0IdnJGCmq zU;hO@WV_KoGvY&??z7YGQ}p-y5HP%?637gE;>Ac}l_2BnKnE9l)9U{NbM3)%ehIk= ZQhxa?Ic)D5BLMOS>1i2hHmci3{ST>}f6f2^ literal 0 HcmV?d00001 diff --git a/moonlight-theme/plymouth/moonlight.plymouth b/moonlight-theme/plymouth/moonlight.plymouth new file mode 100644 index 0000000..80854c1 --- /dev/null +++ b/moonlight-theme/plymouth/moonlight.plymouth @@ -0,0 +1,8 @@ +[Plymouth Theme] +Name=Additional Theme for Debian 10.0 Stretch +Description=A theme that features a dark debian logo in concentrics circles with pulsing white glow, on a blue-gray background +ModuleName=script + +[script] +ImageDir=/usr/share/plymouth/themes/moonlight +ScriptFile=/usr/share/plymouth/themes/moonlight/moonlight.script diff --git a/moonlight-theme/plymouth/moonlight.script b/moonlight-theme/plymouth/moonlight.script new file mode 100644 index 0000000..0460b36 --- /dev/null +++ b/moonlight-theme/plymouth/moonlight.script @@ -0,0 +1,1167 @@ +# moonlight.script - boot splash using script plugin +# +# Copyright (C) 2009 Canonical Ltd. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +# +# Written by: Alberto Milone +# +# Based on the example provided with the "script plugin" written by: +# Charlie Brej +# +# Moonlight theme scripting by Juliette Taka BELIN and Aurélien COUDERC + + +#------------------------------- Constants ----------------------------------------- +NB_SCALE_STEPS = 70; +NB_REFRESHS_BETWEEN_ANIMS = 3; + +DEBIAN_POS_PCT.y = 0.60; # Debian image position in % of screen height +DEBIAN_HEIGHT_PCT = 0.04; # Debian image height in % of smallest screen dimension + +LOGO_CENTER_PCT.x = 0.5; # Debian swirl image position in % of screen height & width +LOGO_CENTER_PCT.y = 0.38; +LOGO_SIZE_PCT = 0.28; # Debian swirl image size in % of smallest screen dimension + +SUPPORT_CENTER_PCT.x = 0.47; # Logo support position in % of screen height & width +SUPPORT_CENTER_PCT.y = 0.4; +SUPPORT_HEIGHT_PCT = 0.4; # height in % of smallest screen dimension + +GLOW_SIZE_PCT = 0.3; + +#------------------------------- Globals ------------------------------------------- +# are we currently prompting for a password? +prompt_active = 0; + +# Globals to share progress time / percent with intersted functions +progress_time = 0; +progress_pct = 0; + +# Variables for glow rotation animation +anim_start_time = NULL; +anim_status = "stopped"; +refresh_iter = 0; +anim_iter = 0; + +#-----------------------------Text-image functions---------------------------- + +# Set the text colour in (rgb / 256) +text_colour.red = 1.0; +text_colour.green = 1.0; +text_colour.blue = 1.0; + +# Tinted text #988592 +tinted_text_colour.red = 1.0; +tinted_text_colour.green = 1.0; +tinted_text_colour.blue = 1.0; + +# Action Text - #ffffff - RGB 255 255 255 +action_text_colour.red = 1.0; +action_text_colour.green = 1.0; +action_text_colour.blue = 1.0; + +# Orange - #ff4012 - RGB 255 64 18 +debugsprite = Sprite(); +debugsprite_bottom = Sprite(); +debugsprite_bottom.SetPosition(0, (Window.GetHeight (0) - 20), 1); +debugsprite_medium = Sprite(); +debugsprite_medium.SetPosition(0, (Window.GetHeight (0) - 100), 1); + +# General purpose function to create text +fun WriteText (text, colour) { + image = Image.Text (text, colour.red, colour.green, colour.blue); + return image; +} + +fun ImageFromText (text) { + image = WriteText (text, text_colour); + return image; +} + +fun ImageFromTintedText (text) { + image = WriteText (text, tinted_text_colour); + return image; +} + +fun ImageFromActionText (text) { + image = WriteText (text, action_text_colour); + return image; +} + +fun Debug(text) { + debugsprite.SetImage(ImageFromText (text)); +} + +fun DebugBottom(text) { + debugsprite_bottom.SetImage(ImageFromText (text)); +} + +fun DebugMedium(text) { + debugsprite_medium.SetImage(ImageFromText (text)); +} + +#Debug("Window.GetHeight(0) = " + Window.GetHeight(0)); +fun TextYOffset() { + local.y; + local.text_height; + local.min_height; + + # Put the 1st line below the logo + some spacing + y = debian_sprite.GetY() + debian.GetHeight(); + #Debug("y = " + y); + + text_height = first_line_height * 7.5; + min_height = Window.GetHeight(); + #Debug("text_height=" + text_height + "; min_height=" + min_height); + + if (y + text_height > min_height) + y = min_height - text_height; + + return y; +} + + +#----------------------------- Screen/window setup --------------------------- +# Compute screen/image ratio and scale the background accordingly +window_max.width = Window.GetX() * 2 + Window.GetWidth(); +window_max.height = Window.GetY() * 2 + Window.GetHeight(); +screen_ratio = window_max.width / window_max.height; +small_dimension = Math.Min(window_max.width, window_max.height); +#Debug("Window.GetX():" + Window.GetX() + ", Window.GetY():" + Window.GetY()); +#Debug("Window is [" + window_max.width + ";" + window_max.height + "], ratio=" + screen_ratio); + +debian_height = small_dimension * DEBIAN_HEIGHT_PCT; +debian_pos.y = window_max.height * DEBIAN_POS_PCT.y - debian_height/2; +logo_size = small_dimension * LOGO_SIZE_PCT; +logo_center.x = window_max.width * LOGO_CENTER_PCT.x; +logo_center.y = window_max.height * LOGO_CENTER_PCT.y; + +glow_size = small_dimension * GLOW_SIZE_PCT; + +#Debug("Logo center at [" + logo_center.x + ";" + logo_center.y + "], size=" + logo_size + "px"); + +logo_pos.x = logo_center.x - logo_size/2; +logo_pos.y = logo_center.y - logo_size/2; + +glow_pos.x = logo_center.x - glow_size/2; +glow_pos.y = logo_center.y - glow_size/2; +glow_anim_scale = 0; + +support_size = small_dimension * SUPPORT_HEIGHT_PCT; +support_center.x = window_max.width * SUPPORT_CENTER_PCT.x; +support_center.y = window_max.height * SUPPORT_CENTER_PCT.y; +support_pos.x = support_center.x - support_size/2; +support_pos.y = support_center.y - support_size/2; + + +#------------------------------- Background ---------------------------------------- +bg_image = Image("background.png"); +bg_image_ratio = bg_image.GetWidth() / bg_image.GetHeight(); +if (screen_ratio > bg_image_ratio) + bg_scale_factor = window_max.width / bg_image.GetWidth(); +else + bg_scale_factor = window_max.height / bg_image.GetHeight(); +scaled_bg_image = bg_image.Scale(bg_image.GetWidth() * bg_scale_factor, + bg_image.GetHeight() * bg_scale_factor); + +# Display background +bg_sprite = Sprite(scaled_bg_image); +bg_sprite.SetPosition(Window.GetX() + Window.GetWidth() / 2 - scaled_bg_image.GetWidth() / 2, + Window.GetY() + Window.GetHeight() / 2 - scaled_bg_image.GetHeight() / 2, + -1000); + +#------------------------------- Debian ---------------------------------------------- +debian = Image("debian.png"); +# Target same height as logo +debian_scale_factor = debian_height / debian.GetHeight(); +debian = debian.Scale(debian.GetWidth() * debian_scale_factor, + debian.GetHeight() * debian_scale_factor); +debian_sprite = Sprite(debian); +debian_sprite.SetPosition(window_max.width / 2 - debian.GetWidth() / 2, + debian_pos.y, + -80); + +#------------------------------- Logo ---------------------------------------------- +logo = Image("logo_in_circle.png"); +logo_scale_factor = logo_size / logo.GetWidth(); +logo = logo.Scale(logo.GetWidth() * logo_scale_factor, + logo.GetHeight() * logo_scale_factor); +logo_to_top_edge = Window.GetHeight() * 0.3; +logo_sprite = Sprite(logo); +logo_sprite.SetPosition(logo_pos.x, logo_pos.y, -50); + +#------------------------------- Glow ---------------------------------------------- + +logo_glow = Image("glow.png"); +logo_glow_scale_factor = 0.85; +logo_glow = logo_glow.Scale(logo_glow.GetWidth() * logo_glow_scale_factor, + logo_glow.GetHeight() * logo_glow_scale_factor); +logo_glow_sprite = Sprite(logo_glow); +logo_glow_sprite.SetPosition(logo_sprite.GetX() + 0.5*logo.GetWidth() - 0.5*logo_glow.GetWidth(), + logo_sprite.GetY() + 0.5*logo.GetHeight() - 0.5*logo_glow.GetHeight(), -80); +# logo_glow_sprite.Scale(glow_anim_scale,glow_anim_scale); + +glow_step = 0.02; +glow_minOp = 0.25; +glow_maxOp = 0.6; + +logo_glow_sprite.SetOpacity(glow_minOp); + +#------------------------------- Support ---------------------------------------------- +support = Image("support.png"); +support_scale_factor = support_size / support.GetWidth(); +support = support.Scale(support.GetWidth() * support_scale_factor, + support.GetHeight() * support_scale_factor); +support_sprite = Sprite(support); +support_sprite.SetPosition(support_pos.x, support_pos.y - logo.GetHeight(), -80); + + +#------------------------------- Star ---------------------------------------------- +star = Image("star.png"); +star_sprite0 = Sprite(star); +star_sprite0.SetPosition(0.2 * Window.GetWidth(), 0.2 * Window.GetHeight(), -80); +star_sprite1 = Sprite(star); +star_sprite1.SetPosition(0.8 * Window.GetWidth(), 0.3 * Window.GetHeight(), -80); +star_sprite2 = Sprite(star); +star_sprite2.SetPosition(0.7 * Window.GetWidth(), 0.5 * Window.GetHeight(), -80); +star_sprite3 = Sprite(star); +star_sprite3.SetPosition(0.1 * Window.GetWidth(), 0.65 * Window.GetHeight(), -80); + +star_step = 0.01; +star_minOp = 0.05; +star_maxOp = 0.8; + +#------------------------------String functions------------------------------- + +# This is the equivalent for strstr() +fun StringString(string, substring) { + start = 0; + while (String(string).CharAt (start)) { + walk = 0; + while (String(substring).CharAt (walk) == String(string).CharAt (start + walk) ) { + walk++; + if (!String(substring).CharAt (walk)) return start; + } + start++; + } + + return NULL; +} + +fun StringLength (string) { + index = 0; + while (String(string).CharAt(index)) index++; + return index; +} + +fun StringCopy (source, beginning, end) { + local.destination = ""; + for (index = beginning; ( ( (end == NULL) || (index <= end) ) && (String(source).CharAt(index)) ); index++) { + local.destination += String(source).CharAt(index); + } + + return local.destination; +} + +fun StringReplace (source, pattern, replacement) { + local.found = StringString(source, pattern); + if (local.found == NULL) + return source; + + local.new_string = StringCopy (source, 0, local.found - 1) + + replacement + + StringCopy (source, local.found + StringLength(pattern), NULL); + + return local.new_string; +} + +# it makes sense to use it only for +# numbers up to 100 +fun StringToInteger (str) { + int = -1; + for (i=0; i<=100; i++) { + if (i+"" == str) { + int = i; + break; + } + } + return int; +} + +#----------------------------------------------------------------------------- +# Top background colour +# #489291 --> 0.282, 0.572, 0.569 +# New background colour +# #0a3649 --> 0.039, 0.212, 0.286 +# +Window.SetBackgroundTopColor (0.282, 0.572, 0.569); # Nice colour on top of the screen fading to +Window.SetBackgroundBottomColor (0.039, 0.212, 0.286); # an equally nice colour on the bottom + +bits_per_pixel = Window.GetBitsPerPixel (); +# TODO need to handle 16 colors ? +#if (bits_per_pixel == 4) { +# logo_filename = "debian.png"; +# progress_dot_off_filename = "progress_dot_off16.png"; +# progress_dot_on_filename = "progress_dot_on16.png"; +# password_dot_filename = "password_dot.png"; +# password_field_filename = "password_field16.png"; +#} else { +# logo_filename = "debian.png"; +# progress_dot_off_filename = "progress_dot_off.png"; +# progress_dot_on_filename = "progress_dot_on.png"; + password_dot_filename = "password_dot.png"; + password_field_filename = "password_field.png"; +#} + +message_notification[0].image = ImageFromTintedText (""); +message_notification[1].image = ImageFromTintedText (""); +fsck_notification.image = ImageFromActionText (""); + +status = "normal"; + +# use a fixed string with ascending and descending stems to calibrate the +# bounding box for the first message, so the messages below don't move up +# and down according to *their* height. +first_line_height = ImageFromTintedText ("AfpqtM").GetHeight(); + +# if the user has a 640x480 or 800x600 display, we can't quite fit everything +# (including passphrase prompts) with the target spacing, so scoot the text up +# a bit if needed. +top_of_the_text = TextYOffset(); + + +#-------------------------------Progress Indicator----------------------------- +# Implement in boot progress callback +fun animate_progress_indicator (time, progress) { + progress_time = time; + progress_pct = progress; + + #Debug ("mode = " + Plymouth.GetMode() + ", progress_time = " + progress_time + ", progress_pct = " + progress_pct); + +} + + +#-----------------------------------------Label utility functions--------------------- + +# label should be either a string or NULL +# Images for n lines will be created and returned as items of the +# message_label array +# +fun get_message_label (label, is_fake, is_action_line) { + #Debug("Get Label position"); + local.message_label; + + if (is_fake) + # Create a fake label so as to get the y coordinate of + # a standard-length label. + local.message_image = ImageFromTintedText ("This is a fake message"); + else + local.message_image = (is_action_line) && ImageFromActionText (label) || ImageFromTintedText (label); + + message_label.width = message_image.GetWidth (); + message_label.height = message_image.GetHeight (); + + # Center the line horizontally + message_label.x = Window.GetX () + Window.GetWidth () / 2 - message_label.width / 2; + + message_label.y = top_of_the_text; + + # Put the 2nd line below the fsck line + if (is_action_line) { + local.fsck_label.y = message_label.y + (first_line_height + first_line_height / 2); + message_label.y = local.fsck_label.y + (first_line_height * 1.5); + } + + #Debug("action label x = " + message_label.x + " y = " + message_label.y ); + +# message_debug = "msg_x = " + message_label.x + " msg_y = " + message_label.y + +# "msg_width = " + message_label.width + " msg_height = " + +# message_label.height + " message = " + label; +# Debug(message_debug); + + return message_label; + +} + +# Create an fsck label and/or get its position +fun get_fsck_label (label, is_fake) { + # Debug("Get Label position"); + local.fsck_label = global.progress_label; + + if (is_fake) + fsck_label.image = ImageFromTintedText ("This is a fake message"); + else + fsck_label.image = ImageFromTintedText (label); + + fsck_label.width = fsck_label.image.GetWidth (); + fsck_label.height = fsck_label.image.GetHeight (); + + # Centre the label horizontally + fsck_label.x = Window.GetX () + Window.GetWidth () / 2 - fsck_label.width / 2; + + local.first_label = get_message_label (label, 1, 0); + + # Place the label below the 1st message line + fsck_label.y = local.first_label.y + local.first_label.height + (local.first_label.height / 2); + +# message_debug = "msg_x = " + fsck_label.x + " msg_y = " + fsck_label.y + +# "msg_width = " + fsck_label.width + " msg_height = " + +# fsck_label.height + " message = " + label; +# Debug(message_debug); + + return fsck_label; +} + +#-----------------------------------------Message stuff -------------------------------- +# + +# Set up a message label +# +# NOTE: this is called when doing something like 'plymouth message "hello world"' +# +fun setup_message (message_text, x, y, z, index) { + #DebugMedium("Message setup: " + message_text); + global.message_notification[index].image = (index) && ImageFromActionText (message_text) || ImageFromTintedText (message_text); + + # Set up the text message, if any + message_notification[index].x = x; + message_notification[index].y = y; + message_notification[index].z = z; + + message_notification[index].sprite = Sprite (); + message_notification[index].sprite.SetImage (message_notification[index].image); + message_notification[index].sprite.SetX (message_notification[index].x); + message_notification[index].sprite.SetY (message_notification[index].y); + message_notification[index].sprite.SetZ (message_notification[index].z); + +} + +fun show_message (index) { + if (global.message_notification[index].sprite) global.message_notification[index].sprite.SetOpacity(1); +} + +fun hide_message (index) { + if (global.message_notification[index].sprite) global.message_notification[index].sprite.SetOpacity(0); +} + + + + +# the callback function is called when new message should be displayed. +# First arg is message to display. +fun message_callback (message) +{ + # Debug("Message callback"); + is_fake = 0; + if (!message || (message == "")) is_fake = 1; + + local.substring = "keys:"; + + # Look for the "keys:" prefix + local.keys = StringString(message, local.substring); + + local.is_action_line = (keys != NULL); + #Debug("keys " + local.keys + " substring length = " + StringLength(local.substring)); + + # Get the message without the "keys:" prefix + if (keys != NULL) + message = StringCopy (message, keys + StringLength(local.substring), NULL); + + # Get the message without the "fsckd-cancel-msg" prefix as we don't support i18n + substring = "fsckd-cancel-msg:"; + keys = StringString(message, substring); + if (keys != NULL) + message = StringCopy(message, keys + StringLength(substring), NULL); + + local.label.is_fake = is_fake; + label = get_message_label(message, is_fake, is_action_line); + label.z = 10000; + + setup_message (message, label.x, label.y, label.z, is_action_line); + if (prompt_active && local.is_action_line) + hide_message (is_action_line); + else + show_message (is_action_line); + +} + + +#-----------------------------------------Display Password stuff ----------------------- +# + +fun password_dialogue_setup (message_label) { + #Debug("Password dialog setup"); + + local.entry; + local.bullet_image; + + bullet_image = Image (password_dot_filename); + entry.image = Image (password_field_filename); + + # Hide the normal labels + prompt_active = 1; + if (message_notification[1].sprite) hide_message (1); + + # Set the prompt label + label = get_message_label(message_label, 0, 1); + label.z = 10000; + + setup_message (message_label, label.x, label.y, label.z, 2); + show_message (2); + + # Set up the text entry which contains the bullets + entry.sprite = Sprite (); + entry.sprite.SetImage (entry.image); + + # Centre the box horizontally + entry.x = Window.GetX () + Window.GetWidth () / 2 - entry.image.GetWidth () / 2; + + # Put the entry below the second label. + entry.y = message_notification[2].y + label.height * 1.5; + + #DebugMedium("entry x = " + entry.x + ", y = " + entry.y); + entry.z = 10000; + entry.sprite.SetX (entry.x); + entry.sprite.SetY (entry.y); + entry.sprite.SetZ (entry.z); + + global.password_dialogue = local; +} + +fun password_dialogue_opacity (opacity) { + #Debug("Setting password dialog opacity to " + opacity); + global.password_dialogue.opacity = opacity; + local = global.password_dialogue; + + # You can make the box translucent with a float + # entry.sprite.SetOpacity (0.3); + entry.sprite.SetOpacity (opacity); + label.sprite.SetOpacity (opacity); + + if (bullets) { + for (index = 0; bullets[index]; index++) { + bullets[index].sprite.SetOpacity (opacity); + } + } +} + + +# The callback function is called when the display should display a password dialogue. +# First arg is prompt string, the second is the number of bullets. +fun display_password_callback (prompt, bullets) { + #Debug("Password dialog setup"); + + global.status = "password"; + if (!global.password_dialogue) password_dialogue_setup(prompt); + password_dialogue_opacity (1); + bullet_width = password_dialogue.bullet_image.GetWidth(); + bullet_y = password_dialogue.entry.y + + password_dialogue.entry.image.GetHeight () / 2 - + password_dialogue.bullet_image.GetHeight () / 2; + margin = bullet_width; + spaces = Math.Int( (password_dialogue.entry.image.GetWidth () - (margin * 2)) / (bullet_width / 2 ) ); + #DebugMedium ("spaces = " + spaces + ", bullets = " + bullets); + bullets_area.width = margin + spaces * (bullet_width / 2); + bullets_area.x = Window.GetX () + Window.GetWidth () / 2 - bullets_area.width / 2; + #DebugBottom ("pwd_entry (x,y) = " + password_dialogue.entry.x + "," + password_dialogue.entry.y + # + "), bullets_area.x = " + bullets_area.x + ", bullets_area.width = " + bullets_area.width); + if (bullets > spaces) + bullets = spaces; + for (index = 0; password_dialogue.bullets[index] || index < bullets; index++){ + if (!password_dialogue.bullets[index]) { + password_dialogue.bullets[index].sprite = Sprite (); + password_dialogue.bullets[index].sprite.SetImage (password_dialogue.bullet_image); + password_dialogue.bullets[index].x = bullets_area.x + # password_dialogue.entry.x + margin + + index * bullet_width / 2; + password_dialogue.bullets[index].sprite.SetX (password_dialogue.bullets[index].x); + password_dialogue.bullets[index].y = bullet_y; + password_dialogue.bullets[index].sprite.SetY (password_dialogue.bullets[index].y); + password_dialogue.bullets[index].z = password_dialogue.entry.z + 1; + password_dialogue.bullets[index].sprite.SetZ (password_dialogue.bullets[index].z); + } + + password_dialogue.bullets[index].sprite.SetOpacity (0); + + if (index < bullets) { + password_dialogue.bullets[index].sprite.SetOpacity (1); + } + } +} + +Plymouth.SetDisplayPasswordFunction (display_password_callback); + +Plymouth.SetMessageFunction (message_callback); + +Plymouth.SetBootProgressFunction (animate_progress_indicator); + +# Plymouth.SetBootProgressFunction: the callback function is called with two numbers, the progress (between 0 and 1) and the time spent booting so far +# Plymouth.SetRootMountedFunction: the callback function is called when a new root is mounted +# Plymouth.SetKeyboardInputFunction: the callback function is called with a string containing a new character entered on the keyboard + +#----------------------------------------- FSCK Counter -------------------------------- + +# Initialise the counter +fun init_fsck_count () { + # The number of fsck checks in this cycle + global.counter.total = 0; + # The number of fsck checks already performed + the current one + global.counter.current = 1; + # The previous fsck + global.counter.last = 0; +} + +# Increase the total counter +fun increase_fsck_count () { + global.counter.total++; +} + +fun increase_current_fsck_count () { + global.counter.last = global.counter.current++; +} + +# Clear the counter +fun clear_fsck_count () { + global.counter = NULL; + init_fsck_count (); +} + +#----------------------------------------- Progress Label ------------------------------ + + +# Change the opacity level of a progress label +# +# opacity = 1 -> show +# opacity = 0 -> hide +# opacity = 0.3 (or any other float) -> translucent +# +fun set_progress_label_opacity (opacity) { + # the label + progress_label.sprite.SetOpacity (opacity); + + # Make the slot available again when hiding the bar + # So that another bar can take its place + if (opacity == 0) { + progress_label.is_available = 1; + progress_label.device = ""; + } +} + +# Set up a new Progress Bar +# +# TODO: Make it possible to reuse (rather than recreate) a bar +# if .is_available = 1. Ideally this would just reset the +# label, the associated +# device and the image size of the sprite. + +fun init_progress_label (device, status_string) { + # Make the slot unavailable + global.progress_label.is_available = 0; + progress_label.progress = 0; + progress_label.device = device; + progress_label.status_string = status_string; +} + +# See if the progress label is keeping track of the fsck +# of "device" +# +fun device_has_progress_label (device) { + #DebugBottom ("label device = " + progress_label.device + " checking device " + device); + return (progress_label.device == device); +} + +# Update the Progress bar which corresponds to index +# +fun update_progress_label (progress) { + # If progress is NULL then we just refresh the label. + # This happens when only counter.total has changed. + if (progress != NULL) { + progress_label.progress = progress; + + #Debug("device " + progress_label.device + " progress " + progress); + + # If progress >= 100% hide the label and make it available again + if (progress >= 100) { + set_progress_label_opacity (0); + + # See if we any other fsck check is complete + # and, if so, hide the progress bars and the labels + on_fsck_completed (); + + return 0; + } + } + # Update progress label here + # + # FIXME: the queue logic from this theme should really be moved into mountall + # instead of using string replacement to deal with localised strings. + label = StringReplace (progress_label.status_string[0], "%1$d", global.counter.current); + label = StringReplace (label, "%2$d", global.counter.total); + label = StringReplace (label, "%3$d", progress_label.progress); + label = StringReplace (label, "%%", "%"); + + progress_label = get_fsck_label (label, 0); + #progress_label.progress = progress; + + progress_label.sprite = Sprite (progress_label.image); + + # Set up the bar + progress_label.sprite.SetPosition(progress_label.x, progress_label.y, 1); + + set_progress_label_opacity (1); + +} + +# Refresh the label so as to update counters +fun refresh_progress_label () { + update_progress_label (NULL); +} + +#----------------------------------------- FSCK Queue ---------------------------------- + +# Initialise the fsck queue +fun init_queue () { + global.fsck_queue[0].device; + global.fsck_queue[0].progress; + global.fsck_queue.counter = 0; + global.fsck_queue.biggest_item = 0; +} + +fun clear_queue () { + global.fsck_queue = NULL; + init_queue (); +} + +# Return either the device index in the queue or -1 +fun queue_look_up_by_device (device) { + for (i=0; i <= fsck_queue.biggest_item; i++) { + if ((fsck_queue[i]) && (fsck_queue[i].device == device)) + return i; + } + return -1; +} + +# Keep track of an fsck process in the queue +fun add_fsck_to_queue (device, progress) { + # Look for an empty slot in the queue + for (i=0; global.fsck_queue[i].device; i++) { + continue; + } + local.index = i; + + # Set device and progress + global.fsck_queue[local.index].device = device; + global.fsck_queue[local.index].progress = progress; + + # Increase the queue counter + global.fsck_queue.counter++; + + # Update the max index of the array for iterations + if (local.index > global.fsck_queue.biggest_item) + global.fsck_queue.biggest_item = local.index; + + #DebugMedium ("Adding " + device + " at " + local.index); +} + +fun is_queue_empty () { + return (fsck_queue.counter == 0); +} + +fun is_progress_label_available () { + return (progress_label.is_available == 1); +} + + +# This should cover the case in which the fsck checks in +# the queue are completed before the ones showed in the +# progress label +fun on_queued_fsck_completed () { + if (!is_queue_empty ()) + return; + + # Hide the extra label, if any + #if (progress_bar.extra_label.sprite) + # progress_bar.extra_label.sprite.SetOpacity(0); +} + +fun remove_fsck_from_queue (index) { + # Free memory which was previously allocated for + # device and progress + global.fsck_queue[index].device = NULL; + global.fsck_queue[index].progress = NULL; + + # Decrease the queue counter + global.fsck_queue.counter--; + + # See if there are other processes in the queue + # if not, clear the extra_label + on_queued_fsck_completed (); +} + +fun on_fsck_completed () { + # We have moved on to tracking the next fsck + increase_current_fsck_count (); + + if (!is_progress_label_available ()) + return; + + if (!is_queue_empty ()) + return; + + # Hide the progress label + if (progress_label.sprite) + progress_label.sprite.SetOpacity (0); + + # Clear the queue + clear_queue (); + + # Clear the fsck counter + clear_fsck_count (); +} + +# Update an fsck process that we keep track of in the queue +fun update_progress_in_queue (index, device, progress) { + # If the fsck is complete, remove it from the queue + if (progress >= 100) { + remove_fsck_from_queue (index); + on_queued_fsck_completed (); + return; + } + + global.fsck_queue[index].device = device; + global.fsck_queue[index].progress = progress; + +} + +# TODO: Move it to some function +# Create an empty queue +#init_queue (); + + +#----------------------------------------- FSCK Functions ------------------------------ + + +# Either add a new bar for fsck checks or update an existing bar +# +# NOTE: no more than "progress_bar.max_number" bars are allowed +# +fun fsck_check (device, progress, status_string) { + + # The 1st time this will take place + if (!global.progress_label) { + # Increase the fsck counter + increase_fsck_count (); + + # Set up a new label for the check + init_progress_label (device, status_string); + update_progress_label (progress); + + return; + } + + + if (device_has_progress_label (device)) { + # Update the progress of the existing label + update_progress_label (progress); + } + else { + # See if there's already a slot in the queue for the device + local.queue_device_index = queue_look_up_by_device(device); + + # See if the progress_label is available + if (progress_label.is_available) { + +# local.my_string = "available index " + local.available_index + " progress_bar counter is " + progress_bar.counter; +# Debug(local.my_string); + + + # If the fsck check for the device was in the queue, then + # remove it from the queue + if (local.queue_device_index >= 0) { + remove_fsck_from_queue (index); + } + else { + # Increase the fsck counter + increase_fsck_count (); + } + +# local.my_string += local.message; + #Debug("setting new label for device " + device + " progress " + progress); + + # Set up a new label for the check + init_progress_label (device, status_string); + update_progress_label (progress); + + } + # If the progress_label is not available + else { + + # If the fsck check for the device is already in the queue + # just update its progress in the queue + if (local.queue_device_index >= 0) { + #DebugMedium("Updating queue at " + local.queue_device_index + " for device " + device); + update_progress_in_queue (local.queue_device_index, device, progress); + } + # Otherwise add the check to the queue + else { + #DebugMedium("Adding device " + device + " to queue at " + local.queue_device_index); + add_fsck_to_queue (device, progress); + + # Increase the fsck counter + increase_fsck_count (); + + refresh_progress_label (); + } + + } + } + +# if (!is_queue_empty ()) { +# DebugBottom("Extra label for "+ device); + #} +# else { +# DebugBottom("No extra label for " + device + ". 1st Device in the queue "+ fsck_queue[0].device + " counter = " + global.fsck_queue.counter); +# } +} + + +#-----------------------------------------Update Status stuff -------------------------- +# +# The update_status_callback is what we can use to pass plymouth whatever we want so +# as to make use of features which are available only in this program (as opposed to +# being available for any theme for the script plugin). +# +# Example: +# +# Thanks to the current implementation, some scripts can call "plymouth --update=fsck:sda1:40" +# and this program will know that 1) we're performing and fsck check, 2) we're checking sda1, +# 3) the program should set the label progress to 40% +# +# Other features can be easily added by parsing the string that we pass plymouth with "--update" +# +fun update_status_callback (status) { +# Debug(status); + if (!status) return; + + string_it = 0; + update_strings[string_it] = ""; + + for (i=0; (String(status).CharAt(i) != ""); i++) { + local.temp_char = String(status).CharAt(i); + if (temp_char != ":") + update_strings[string_it] += temp_char; + else + update_strings[++string_it] = ""; + } + +# my_string = update_strings[0] + " " + update_strings[1] + " " + update_strings[2]; +# Debug(my_string); + # Let's assume that we're dealing with these strings fsck:sda1:40 + if ((string_it >= 2) && (update_strings[0] == "fsck")) { + + device = update_strings[1]; + progress = update_strings[2]; + status_string[0] = update_strings[3]; # "Checking disk %1$d of %2$d (%3$d %% complete)" + if (!status_string[0]) + status_string[0] = "Checking disk %1$d of %2$d (%3$d %% complete)"; + + if ((device != "") && (progress != "")) { + progress = StringToInteger (progress); + + # Make sure that the fsck_queue is initialised + if (!global.fsck_queue) + init_queue (); + + # Make sure that the fsck counter is initialised + if (!global.counter) + init_fsck_count (); + +# if (!global.progress_bar.extra_label.sprite) +# create_extra_fsck_label (); + + # Keep track of the fsck check + fsck_check (device, progress, status_string); + } + + } + + # systemd-fsckd pass fsckd::: + if (update_strings[0] == "fsckd") { + number_devices = StringToInteger(update_strings[1]); + + if (number_devices > 0) { + label = update_strings[3]; + + progress_label = get_fsck_label (label, 0); + progress_label.sprite = Sprite (progress_label.image); + progress_label.sprite.SetPosition(progress_label.x, progress_label.y, 1); + progress_label.sprite.SetOpacity (1); + } else { + if (progress_label.sprite) + progress_label.sprite.SetOpacity (0); + } + } + +} +Plymouth.SetUpdateStatusFunction (update_status_callback); + +#-----------------------------------------Display Question stuff ----------------------- +# +# TODO: Implement this if needed +# +# The callback function is called when the display should display a question dialogue. +# First arg is prompt string, the second is the entry contents. +#fun display_question_callback (prompt_string, entry_contents) +#{ +# time++; +#} +# +#Plymouth.SetDisplayQuestionFunction (display_question_callback); + +fun scale_glow_img(source_img, current_step, nb_steps) { + + sin = Math.Sin(current_step*0.2)*0.2; + glow_anim_scale = Math.Abs(sin) + 0.8; + + scaled_image = source_img.Scale(logo_glow.GetWidth() * glow_anim_scale, + logo_glow.GetHeight() * glow_anim_scale); + return scaled_image; +} + +fun update_glow_anim () { + if (global.anim_start_time != global.progress_time && global.anim_status != "running") { + global.anim_start_time = global.progress_time; + global.anim_iter = 0; + global.anim_status = "running"; + } + + if (global.anim_status == "running") { + # iter_img = global.logo_glow[global.anim_iter]; + # if (iter_img == NULL) { + # # Generate scaled image for the glow behind the logo on demand. + # iter_img = scale_glow_img(logo_glow[0], global.anim_iter, NB_SCALE_STEPS); + # global.logo_glow[global.anim_iter] = iter_img; + # } + # global.logo_glow_sprite.SetImage(iter_img); + # global.logo_glow_sprite.SetX(logo_center.x - logo_glow_sprite.GetImage().GetWidth()/2); + # global.logo_glow_sprite.SetY(logo_center.y - logo_glow_sprite.GetImage().GetHeight()/2); + + op = global.logo_glow_sprite.GetOpacity(); + newOp = op + global.glow_step; + if(newOp < global.glow_minOp) + { + global.glow_step = -global.glow_step; + newOp = global.glow_minOp; + } + else if(newOp > global.glow_maxOp) + { + global.glow_step = -global.glow_step; + newOp = global.glow_maxOp; + } + global.logo_glow_sprite.SetOpacity(newOp); + + global.anim_iter++; + + if (global.anim_iter >= NB_SCALE_STEPS) { + global.anim_status = "stopped"; + } + } +} + +fun update_star_anim (star_sprite, speed) { + if (global.anim_status == "running") { + + x = star_sprite.GetX(); + newX = x - 30 * speed; + if(newX < -star_sprite.GetImage().GetWidth()) + { + # loop from the left to the right + newX = Window.GetWidth() + star_sprite.GetImage().GetWidth(); + } + star_sprite.SetX(newX); + + op = star_sprite.GetOpacity(); + newOp = op + global.star_step * speed; + if(newOp < global.star_minOp) + { + global.star_step = -global.star_step; + newOp = global.star_minOp; + } + else if(newOp > global.star_maxOp) + { + global.star_step = -global.star_step; + newOp = global.star_maxOp; + } + + star_sprite.SetOpacity(newOp); + + } +} + +#-----------------------------------------Refresh stuff -------------------------------- +# +# Calling Plymouth.SetRefreshFunction with a function will set that function to be +# called up to 50 times every second, e.g. +# +# NOTE: if a refresh function is not set, Plymouth doesn't seem to be able to update +# the screen correctly +# +fun refresh_callback () +{ + global.refresh_iter++; + if (global.refresh_iter == NB_REFRESHS_BETWEEN_ANIMS) { + global.refresh_iter = 0; + update_glow_anim(); + update_star_anim(global.star_sprite0, 1.0); + update_star_anim(global.star_sprite1, 2.0); + update_star_anim(global.star_sprite2, 1.5); + update_star_anim(global.star_sprite3, 0.7); + } + #DebugBottom ("refresh_iter=" + refresh_iter + "; anim_status=" + anim_status + "; anim_start_time=" + anim_start_time + "; anim_iter=" + anim_iter); +} +Plymouth.SetRefreshFunction (refresh_callback); + + +#-----------------------------------------Display Normal stuff ----------------------- +# +# The callback function is called when the display should return to normal +fun display_normal_callback () +{ + global.status = "normal"; + if (global.password_dialogue) { + password_dialogue_opacity (0); + global.password_dialogue = NULL; + if (message_notification[2].sprite) hide_message(2); + prompt_active = 0; + } + + if (message_notification[1].sprite) { + show_message (1); + } + +} + +Plymouth.SetDisplayNormalFunction (display_normal_callback); + + +#----------------------------------------- Quit -------------------------------- + +fun quit_callback () +{ +} + +Plymouth.SetQuitFunction(quit_callback); + + + diff --git a/moonlight-theme/plymouth/password_dot.png b/moonlight-theme/plymouth/password_dot.png new file mode 100644 index 0000000000000000000000000000000000000000..3e429db73edce7421f2743da114309022f90a221 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^q9Dw{1|(OCFP#RY*pj^6T^Rm@;DWu&Cj&(|3p^r= z85p>QL70(Y)*K0-AbW|YuPgfl9!XI?mW@Sctbjs`JY5_^EKa|@a*&HLQGnq={#N%R zjuSTvritf%O`n77B!Mc#VNh7-+?)pg4akFvU8P*7-ZbZ>KLZ*U+lnSp_Ufq@}0xwybFAi#%#fq@|}KQEO56)-X|e7nZL z$iTqBa9P*U#mSX{G{Bl%P*lRez;J+pfx##xwK$o9f#C}S14DXwNkIt%17i#W1A|CX zc0maP17iUL1A|C*NRTrF17iyV0~1e4YDEbH0|SF|enDkXW_m`6f}y3QrGjHhep0GJ zaAk2xYHqQDXI^rCQ9*uDVo7QW0|Nup4h9AW240u^5(W3f%sd4n162kpgNVo|1qcff zJ_s=cNG>fZg9jx8g8+j9g8_pBLjXe}Lp{R+hNBE`7{wV~7)u#fFy3PlV+vxLz;uCG zm^qSpA@ds+OO_6nTdaDlt*rOhEZL^9ePa)2-_4=K(Z%tFGm-NGmm}8}ZcXk5JW@PU zd4+f<@d@)yL(o<5icqT158+-B6_LH7;i6x}CW#w~Uy-Pgl#@Irl`kzV zeL|*8R$ca%T%Wv){2zs_iiJvgN^h0dsuZZ2sQy$tsNSU!s;Q*;LF<6_B%M@UD?LHI zSNcZ`78uqV#TeU~$eS{ozBIdFzSClfs*^S+dw;4dus<{M;#|MXC)T}S9v!D zcV!QCPhBq)ZyO(X-(bH4|NMaZz==UigLj2o41F2S6d@OB6%`R(5i>J(Puzn9wnW{e zu;hl6HK{k#IWjCVGqdJqU(99Cv(K+6*i`tgSi2;vbXD1#3jNBGs$DgVwO(~o>mN4i zHPtkqZIx>)Y(Ls5-Br|mx>vQYvH$Kwn@O`L|D75??eGkZnfg$5<;Xeg_o%+-I&+-3%01W^SH2RkDT>t<8AY({UO#lFTB>(_`g8%^e z{{R4h=>PzAFaQARU;qF*m;eA5Z<1fdMgRZ+l}SWFRCwCl(yb2lfIwHMNk)NfZ*Ibqb0-+yx!mP4ewz_MZ*8cTdgl(0W{i`1%F%G71ujrlXTn zMOP$7270!Z=0#k8n7nIZtYdFx<9r+AHBAlmHMAV0Rx$lH0T-EtwvN4pEbjSCcc#|& tXYGnKsvbpZN*DUynOhlv0H002ovPDHLkV1gnu%c1}P literal 0 HcmV?d00001 diff --git a/moonlight-theme/plymouth/password_field.png b/moonlight-theme/plymouth/password_field.png new file mode 100644 index 0000000000000000000000000000000000000000..c23f5b8e5c30d873328d74df198a07d4635989a6 GIT binary patch literal 322 zcmeAS@N?(olHy`uVBq!ia0y~yU}OifH8|LSFSZ?7l{G6ga)T;z9d7UmIr;ld=6sL|-)JXxCM(X0f)*YA&1bB4Xm`&ajl`N8>2 zE4_BZV-ZEqn>& iifng=+eNebPV@7a^8A5}D^2Q9H6k|z{UoeBivm0q3PLj8~3quF1tOt<8S>O>_%)r1c48n{Iv*t(u1=&kH zeO=k_aELJ)%RTO47Xk_ec)B=-L>zv5!%*;mfdI3kIAemx%s-!xKRG3_rsA8xn-y0i zF4>X3f literal 0 HcmV?d00001 diff --git a/moonlight-theme/plymouth/support.png b/moonlight-theme/plymouth/support.png new file mode 100644 index 0000000000000000000000000000000000000000..5705987f356d0f93958bf74e59d5b2de4e23aac0 GIT binary patch literal 8731 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 Qw+E!FWvKZ`-S*P|0lPe-DF6Tf literal 0 HcmV?d00001