2k2{{U3LTvoc~U{N
zB_hkft7Y#GF`dZIoR&S<7Dhzyma(V!glkSTlB;f3-(_DMGIJ
z^R@k63R7+E>*Vrh82lEbra3C?_N5ps(LtU&Q%Xkl^(Jo7Xh>CYPvW1tYw{&@bYteJU+?4BM4RTu6VZd+|M^?NaiZft819+x8C*
zmXXezq^_Mec?Is2TX}GzRfnhsM~~S;K9sBdXMNDD1%@C0C2sk_ec2+PpfRx;@tL!d
zdV9e;9qPV&r5bSiw1K)T6NvJ5)Brv9{#HK)FQ*k5{Tq<`ZC-`g~|n-{?^i4DsX%Z3eZD}F+v|MRN;Dn
z`11E4VHNIl?~2F0fW1$Pk;*uzet6DoI3%iHicmJ%k~m}vfqU!h=ZQ2I>Gc;{_BeY!
zenZS_ODAs4!_lUbfhweFe(lzTWX!(Ufv}b}>7WEg$xw`!hh3OZU~XsG5?R%rFSJlT
zM?}k{SfeSz<7G#W#>A}hgM>N~M#D09c}-ll6Zy`V9f>lwt3=wP9(iTlqq)2H{$Bq)
zE58~$6IZWihRJ&kwYM3e%@}h0BrH&1`zatjZJx760*g~1Z*-F>cm=cFcb1-zU^|YzdLmuEl&be|eLK;Gb(ex+GmI179_>?w5s%FOc!vJ
zzYiamxaJMvMmzc0v0pp)qAJ_6{8t)frcyN&^Y>dQcS4OssanR`Mnb|4T+ho6#D>4K
zp{sBHt0=x3{Pt)(5LJ4sLgkJrLherm6KWViHSm5(wOtz139q!cMPoa6_{SHp?Jux?
z74}2CW&u@%u`jfJ;2pT>rTK$vsn`BRJf@3
zIxBTtGjY64sZsVq{4+P&D{~m3(C9ZZgdCLgx-NO=OL;Dd??+tUJ`%(ibnl!q)M30yI;AAdc6PAtaz$q2V%wc#)d!YgTobF@Jg&|@u1)m~S&+=Fvyu3f;y3B9MD
z!woshmuwQ^g2^W)>&Lt*nMcM?Z<~&SulxGkk?dRHM_x$X-?azFJY@QM@cD0@LG-94?bV^t-|Jnq7VM7hNtp2d
zh3U(3fovN6jySc)${QG=w2$@7cdSHb!@8${CTp>x*J+bn%
z3=I_I*b4p~PUb7jZ?3$?!?)!h#MWRnErZHfISaj`ieaVE5j!Xnj>yK<>8e&elit|+
zPMJEz^ObzbQ~ePq;_uYyUt88|K0oiRSH*h2w`TiJj9{KmOuNfdY!;8)?=|_m=CNW3
z+SxLAS&x1P{v6iAgQnOQWFgGFM3xoRlsPr(7$?54&v(E5GFU4k=OD^Iy%7pmnt_0w)zG%#!9684W}vymiia(SL7SEd7j6
z`pSHBtf{28HTT*l7(CAlo
z9axH}I*+Az(esN5wA+&R4N(iA%>Btk^NgYOym%E`Mu4YatVbN=cnU$SHSW^4tv?Di
z2~(p6DRVV!FPC9AgEU+!Ze=JW41}{eq~*_?&^EL?`h!1gy_>^h6$KOO(zr*=90SyW=3nYv?xI+lXU=T{*af+z16k-_wsf9f2oNj$s>JKfB1sLmr^hqfh_bkMoX{EszJdSf%vfaCI=l~Z
z@dIgU{96JM(I6g0Sk;4gR6SbiWba%v*Ab(6D>6F$=kfD|xJ09%y8XlB>$t!YRK(IX
zm%wOSwMNF*`1tq+ck)U|S`{%kiX+fFlslNmG{)?&YZMJGNgOIQKVoPhoYPIa?zlFQ2CNd`*`*V%@Yu-ArNun6)w-xu
zMS%UfHI9H$T2t7jB!n{OENA+c_JkL!39n5(V^#Z#!R@85H__aS_48U!oUi|e?iz@o
zg@zqX!8zOk_J!@A*K>n?6(x%PXE1JS7ESah9I5^mnl&@Hlb#Mu@|m(f?%l>YaT=>^
zN)9=}8LEHhTFK@$LC(o&yUPUS9Q*XD!-vSL38b=ujTJiiYjgP@8>bM_ei9w@TkybI
zb6d(cos=_jv&sEWweqMo2xzV!_`|H1WYE0vp=l{`@UlbU(}8T&!;C6bW$DK+M(ZDu
z)Tg8eNJeLJi`_<7S*>dbSqSnwarTNNY`rw3c4s^uQM9yU+_SMqt8jUw+u?$i!phYLSq~nHN&W+X24^1~=oTtJCR5gzwq6Oyy7+DOj1y+Ld6=uE|MP|S
zqav*+Z>U|hT1x+9-79pOVS8EcQh3;Ws0Ntj3_>I3Dun!MqGqKEzj8Lg&p&z%m|-wq
z(HIl^;hox^`6fur1uURZgVgzIt0|+TD`W9GuBR3D$LOAB9L8%Qksm={gS}XXhQ#43
z7|S_^xOl}2sFQ)U__wkA_t!5ZwI>j`4&GCz3eri|bEgVo3`YB?oz~i8Obkl@4oBaX
zmz(TLbf3Wd^?(5kKhuSMwvjY+)dm^zMjq_PrIEPi$k3}cvlvP8hB~fsmz=#TQvB)vDtK8}*LD+f=rz
zXHPDK)ld3H+3Q{9h_#Y^cEY$F``ylVrPr=sBm2mHDN^FmyDOje$>O%SG!ccA-PN_sO8W=W
zuVqZ=Xe@&k3;aJBd~Q{rW-8VM=yN91pa~C1;uuJjeeMq>)(Mg*LIZwr;Rrxo-iu@9
zXl95(ZsxU`7AT;SSJrq}sjZcAC9agOSI~*P{A|y0`dN~o-2DmJnI6{<*7Y6MxWL%9
z9W9p{YXc6gO9!s#6E_&4COELr1N5nmH8dC03|4LQa_l)=(jb(eu2Zn_%Y!$>aKg)u
zaZr;my|p4VC(fMrj-l&tV*yAq{e>OV;9>lr)K`UFvl8n?aVR-b$ss>)m0
zLiXt_C;ajFXkT_|O{{OTZxpka0M?}w(KkM{{LpfH#Lk45Ty5*!_v-U`$VIe}#K-bMc5VI*swZQP#$V9`j#A
zC_Tr#(^N#v2M^&fOSc>z{y588_=*px#&V;TB*ViFb|#%KI-oQhJ~J&AlHolwQ!DFK
zNg#8wx!qv9pZcf|R0#y8t4ILqT+YavJsrSSvCQMpA29T;`qy7$y60^_V4I09^>A#E
zhZ|tYwYlJHjB2B~D@Z4+|8bB^@~hgE;TK8ePUakMyzBNKLVc=~Qjhj)H%UEg6~Z8%
z*G~C|7^W54pkFgm5M_2c?CYQvw3Y4y&$V@sfr0X$@L)R8m
zvyxI$^Zk5YlFw$fuj%sLry(n8T+n9yJ@w8Pl^^C6nnvJcHTFx_@Fjit
zfa)U~VrJr)=NSi{R1j7WiF-A%G9>y#-t<0E#(h4Oh^5n1e|I1%?8JvOa***mUgsow
zH6S+-xllm-8I4F0wVPbthcR3q7aIl1})9v_eX9r-pJ^Pgn0S?u3?c0EEMHLGEoV
zJoMq$a2IwnLU%=}dr8a){=bs9R|{v8J{R55N)CG2mfT}T;tO|Sjx`+)NnYmpTev(F
z5@9kNa%?^vqEQ-u@(B!$tLI#w+ARV5bk-OCokEa>oD&+dxxfv6RSt{;=&c&^Gd&rl
zs4z^N1a6O@vedEyG6+PbZI=F!y*|Iu;&7Ip7$0||UyZ#lcN#j8r+)jweGKn@XMgVf
z*m{>E-kgQu>Z6ac(%~e(gV0X7h)%3boaWl?IjYmeYfdiYhwc7)74~8i-NZRYi7fGL
zbl%eV_nQ*7FTT|o--h5UAgy>+Fk#l3PgeTf(7Y$xWi+x&)eecsPfBt1%OC&IU(?9c
zqyCTzUukoc@wMSi^~VuP8H6&WRvw`edn;|YR}Ks5wP!`CjVYAYuHSS)0-Uk6O?X38
z%y|EfSqnb_UqGi%R%9WdEp^`v_A;DjB~Iij@VPzE&t_jPb-mDmTt(9m>Ui$SB)L9A
zDb0R-bsN$ez|PXS`m|
zd0mgk{d&IK!bp8&hE`D!>nl&|1-2A67#frnBBh`!f)enc!~@qKYl-rL&maBGXj7mR
z;+bE<3oIyAXH@FN=A5|HaNIY)$)8KaX@h4>KK7xQgc1uuN(QIu=j!3Y>e})$kwTCIEHAd?R6wphJ>7IEm}FpF<;k3byL(=cER%$N?Ro7_8cY-DCa-jO
znJ4cDvmA+4Br)YQoWu3j!dvvvi`7v@GzoO;t+ZsNB)yVH{ztao#|}1J$vzoBG>3PU
zS!fz~sV90+L*>|dxwyzgr1U55&fPizRusLud*|~y`izBN{R^Sjg=7-fY-{DI`w$jQ
zWM+H!HPvi(9pJ!+ihJz8wI=c)5joQLxFoyJ{mjH
z0IfEx`9kK`4XqlAkcyZWLc}klsU^gErzVr|@cjezOYUChAdIELUjBOtT!mIya3JJ^
zfH}uuvW`Z2;B9{y3;9Hd;TQdmw)djVLE6V{z1~mMnGAQq@p{m7@`3Hzzkg!FXBSLx
z2Akho&w5+7-Vna|d1X;GRbjX84LEy?Y=#w(ArJSAlP}^IUjXps=Ts@>L=+{_Ymk{j
zA5>J>wyYv9^4>D=WoSjhFF1BT)3y0sP((~Q|KJj_cf8q#Lx4$TiNehvRilkK`gG&+5X-B&$@4~Qd7t08~%x=x$1SBsAr~J`*d}ef{HFOpZOKV
z@@|~MVx%EMmn0r6(kW)#)<}VM{PvEk*;#d@UD}nClLjvD-VIG$!Fhw?
zHXrj1hoi_7>#VUq_yS_+UeX!9iov8fQK)0v`>pn;6>oWfphpXn#(u9;#lftHVQyBm
z=qf=F?uqR_&K@Vni+c5v<_i>eIzC_y%S&y$_Frfj>`5<}vqKgS{NC9hT$cwUnj7R5DBPR`U*V4_~s
z(Zoa{G$bmnpuB#Wf4$)Y$h7V
z*`{W(cYt@ZINj?)b>B#1?ix&290517$mL)6z|EWuK4)Sn=X4@&c3+{VzRtp2vm
zR=gAfvtzkd&NnVnN%5KZL~r^WQmNvQ=em>uPB8E)rXkN9!4pRQ_0dq7V&>%bvbL}I
zzz^nI>e}ldy=#3=k9iju`qG(R@bTdeFvAxCP2f)|V2ur7<#WO2Wy4jH|Hw@yYJ)I1wW4
z%*^)}X?#%URv~3^pqJ|vTt8SfbDqT`QMwj1B}d&NT1u2
zFji-}2Iim~?L=CCn$`$B4IAwl4__@=N3GeeA!RptU?S)s7;w=l^)wVE!kT){S-g@I
zb&iY=$U9LG8;F~>=9r*JT!qMbkWeCm<7it4QF~&cA8E{3OEXv|hNf;<0US@=KjelN
zJ^(=5Zt2Z@G5~?_@EtHCWP-cEmrO&jr`*2bEQJJ^jXI;&v+K*P{Y967pjnOGISUVt
zpHurA@RIHvwlpN|bgrF<@Smx%=f;oIGJ*yV6=R(JtuNn8~_UQzj1(Usxey6EzuP8)U
z*!`^7T@dG7B&CK;SgD_(7_pM3A+z#_C|sH_4(2TF2$6>4zJpk3P-2|=FEgSzRYT23
z_u7O&^ELB%5nJl~p2vI%A7rcfn%hMTl4t82WZMlB(_JJaW%$9z`yfiDxP0dIm`LZT
z&>v#Tr@?us35Wr
z=dKqHK65+P;dW^&F-1U2P~XZ9EDs>(-5qen%dUi|l+hZ?OMZv#QdE>>>bQl)mw$gQ
z(Axtx2Z>VNoD1PWheimtN)D`rSdYE+ds)vIJa(?ziK~qid%UG+Rw3KXfm#*yJU$iy
z6z+385dfwVRc(3Rxe$w5{sq}DZw}-xdMca#M2b$&&@Uj~(LO6;zO|LFeL>UB*^@6}
zf~gw0CPGal+=I9@LvJuF-aeX9vu
zAJJf_9%5&yP1P0MxqAxDhS)TGDjDKgN#z$75LN~$#HC5{2gF6>TGY*H<&OK9gSfOl
zfctpOG!|CZa=UZ}V>r;YUtiGY#&c=lZch_KX#Ls6h}rtupV=K9BC`&@VSCp(ztkc4
zeuUAfdZbce_C^9`m5fN}l&SBUZzl4{BhkWKhYMR5nOhhT{U6LrcXE%=J+^w>E*l#??%p@5(+c#WzB%j*eMRxb3
zg!wlJnjv~L?HhffYzulL8))Jk)Grm=t$0AY_6!GgdN<~5
zkorbj+Ga&+6~gWBZ;tERI`Zs^PLbk_39Qo_ziKfZrXZrF(^%Ko0Q=%nf&RxJx<6NO
z`J>gD^=I{$sr&`&I!EswSTNj0MzHGKOYU__AzwlPZJY(5%zYuoF*hI&r%24|CI8L6
z9zvu+HjxD!pNWK}q`hQwaYoGnoJ?)jV~=nuQ;dbHeXML@pWBtf&I%ozD&WD)OV_H
z%a^|~4HnI`T$I;ZXI4>3bKjX;&pg*B$?z@@ynU<+WG3#;o*L%gUQ~tSaPtgb%VT#b
zDX0HLSn#{*TNq`y@;Ha=~R9iOkl1Wsnq6ES=GKkkq
zz^!HK*>%fk1`}0-J+q}x7Ib^H)F4SJGtC?OeQET1W`BKBep0ql2Vzx`n9+?
zInE~xnjBizUKq_}C$^=TBb+9*5a(8Ku7N6L^i>I>6PA$#S=%8!t{GeJTt*S+yC;KS
z2o|No$WHhX89M?C>@vN|ep0OSvchaK*Ln1gP3F29283IuuOmE@0Xc#bogV%oPv
zI{e|U7!q{R&a9Q~3@4W6)ook6ynMLy9yZI-5suH`S^rE`Mn5f7qtOo*6dYl!+`J)p
zV7wJ%#T4{8&@i_=sk+?Q=P~9s+pV`HKd17a>vzvlp(P*NE>75jExq#9n4_ZHWf5&+
zFJ0);{1(0XAyc3R=GE`=q}gv!EPOUYw1n!rCFzlDqt4$LL^()=dgw4%HYM#fbk;)E
zK=J{DASfz$Qj_zu6}AQAkUVglvDvcYp0Wx9&uj6MJ$$@sqtU7FC2iQ?P^mHBQ^FtO
zoQBDuR~{^IpZx~Z$Rf6s3vaHA&Q$X^(!7js)SPI^wiN4WplKmOL64AMp{|Z4Ej!k+4pLEO}M_sv+MEa+h|q30uAtum35Z1YC(7iendE$i6T??
z>MAS+xJX&Z1l2S1{z#2s$t07i+hPXPVD$SCYBOd=o_lRMK+&>`vx0r7(0X$<@8Gd%
z+$^?#*oaIKE}6XF1Ef|qM~z`pFgIU48a*?8xVJLdE5|WxW~RNTitT3c-D`iINE_@N
z`~d$12p!<*8Yltq(Xxey#yRf;LrZ(l`O+?0@*=ldcCv0gPIUzVO*bo+`DWj;;$(_)
zp>{i?r7214@y3&=+oc0p5@QX&bqjO88~J$N(eFtrO<3AHkBQ$(3LsQ!EsCv3hv0I@
zxon?d-k63;dpydMSrUuZzU}jRrw<_$B{?7uBVhXfM4`|1HeBF?(+$FjpuK`Q>hVOC7ieg6ha7|)L5@Yz&>#Rb!K
zTdxbDvev?A4cLl#_X+Vcn8dRfq=uFd;Ql_|aBr{JSW#>{H7m^W#mL;?vX}Vw)axUZ
zy1~EpUd7xr>MsOp%WFWumi4x!u)7Mld!ei_a8j4S!os|wlSRL$dKrrg8@EVH~dihx+WAyXo->|mh1s*22p-%h_c7?!hb
zXl$%%5EC?Dy!!YJpja0O^Z%OZ=ujxUIX^~_etj?)Y
z31{I0^(oj+tFfJc_@ZCKi)0|Q_8Vl`>@j3K6CCPiQoZA$E_T`!la>n0^Jd&0zHi88
z5|UuMizhoJsBUXBv8Ft}9wQ`TWx;e}FJEkM=Vkfx7*%6cwtMIUtmrlUSZ4AGTGu!1
zM*>suEbs>{>jU6HTv^NwT!7!?EdfMMFG8@3P*Jo#AF{&Vr;)B6qfuMVOh4C5Hc@P!
zY;WndFKG*y7X{0q?H@gK7E9#5u25(_U!PX)OJ>Zrj*?eO)T*Nl?m
zCGL^x@v0gPn&bjd+Jf#ac}-nFV7+&Y(fTg&hJE!)VpA0|t}&6;Bwqv~oe!yUrx+lr
zi=ww%{5B-Id)l?v&}F`N#!=E<{`T{ZW$jWjAIIx|w&0pq>@*fU%cF0G2-^qDJI~C3
z8t-%qtpIT+_I`u!fd=yvGalH7iV@Gukr?j15L@O>X}BQOTHDV6s|Zo5_cXQ@boeSW4z9f94tkx}3Ht60@!*9_Gj*~aQsh+_MAl6ob!kgu?L7lj^7kpZ
zOV}W0RO`y@*{_wvE;IDxq?5f5;Qh!oI+QqZFf(M3hgX-Q=iuwCou~gCNv97~Sk~(f
zr?BZ2rhAv#qLd1wM(XpB`2!tWS7|i9ol(9JrUNs?HxGx6Ir|RLRP94@gJ#n^)I9V>
zC}-bvgarvQu4oWlK)THZ#qZRaaW7YvDje+9{o#U8drnqz7#hp9=Kyy-q7rs{%#H2cBaI>_Z+F9KMwg%!EIidviJCU`RDTa$t6*7xtr3)W^L|e=L1a+=ll+G`>l>5s0w2V%^p|0wg~*s98+06giY#=Q^J7YY
zKRI>(zDuRCOiNRSMd^#p^f{WJe+Ku&TYxk2X=?SBabG&<&l+>S`Fpr7S*Ulwk%IXh
z48hG?NYM3D9=AExmUn5NKUt;CX(NEtf!ScB1?Ym`Vn%Yi4?X>B&uyW}BX*dl8t6P2
z0U8rkR%!J1y%7c5=kaU!VEn?j(iTrZs}QsW%$O;*JB4+RH(HC+H%yNs-m8~@g2aK~
zwXu|7C};=|XFIFhbLVipZ&~`rqyap$@9iz(YwBoEk_k>CNiOd!@(EqeBE_HD95a`#
z(1|k*Z%PlX83U0~Fxq0KcZ(DghYVHEAW2~vPMJO88=+bY`69=mWzB7w$kvn!>rjXJ
zb~2h~_OF2?Gwo=VlD4&-hq}+Mvm*P7Kldi^m@nxvmY}(hOP5)E(UL
zrz-E`s&ZD#_&uzIFEI)KaENbCyJIQpku2+Kt~wd}v>GR0
z`_xW{-nuW%ZUC+HOgsPnI00k1)s@umawhaJ+c`t6Q$KDcI5RWVS?t!nOY64`X!g*Q
zhmGETezQNRQtQlC4ce`FDqmWEH1k(L>>N11e2DcF`%aLGQVs#0PHTCF$l~H$`LrHo
z8x3@EI#`dnVfO9pC0*E%re@qde^938DseiLvuZ7L<>Rk
zuXXOW;tLMdWA@BT_<|b_XB%skB;`u*&A3I=(~hxxYsEg4e%({8?5NjfN%Qp-8C6l%
zm;3Hh5IM$xgwE*9OMw}Kt{GRMs3DZO=l!}(GlTP)%}L`o+o_%VyG8_w+`mmtRL*7O
z;k?F3u^J{_&*^7JN6sU%VECf`)9gDX%_h^6B&y~DKQssWI!;&CfBi4Prl(qi^+Vh{
zMD#mVJl`wTXXRWf|1_Nmd-lRQ!$v|3($>Z>Sa4IA`HQL8z0Nb)XoIUoAFF(ri8dpT
zX!I|F#mfENM0+h$K*WrCg0S39Z%*qxQmMURMOE}6mLw&EUo|7ljP`E9DxR*+B)we|
z*oNs)4ikRn4T4=j(>`2wG0&On+hE_uDGt4CHB#WP_@TQR
zf^Y2Hu4t7g-Ff@zRE4JL;zy49P|I|E=Vg-rz2KiE@aqr1Y-kNrPUGeu*ta|PDvy20
zigLX}GU0z{K7eZPEVpS9#WGNZ-V}0Q>ikmF21Yt&ficb{yV;oMr}a5GI>x@!Hr6_X
z0qKx_rX)On;oBQZgMWR37vl-PYr=r$N~Db0LQ_@QZHD&8FtvHPjH
zzYEf0B63AS1+c1aH283>P3=_|%eK(#-S*8xh6*V*DRBi9(*d)t_w)DPzHzMo8=SXa
z2_q!Bz1Lk^N$jF!(=swP0@WhJRW2U%Q@0JR+kIVJc6I!4e&q$0jw+u(m;*ch;;1PW
zZ;?BWlJBW5=e!;L3rEw$BrSzis&92RM(v4+J-Gi}hZ3m2d6|X|hqEc1fH_|-*5jtj
zn!Ml8+r-5hB@GZY5gPqiPp!~YV9M3JxQFP)#D
zb4%QCt}a~cCJ6z%b)7W8sJ#T{g?ZL5eSM8p;(_I_X?$9TkMj#YsqMGU4Dn0c01f#t
z%556SlZk&X-!5W5I0e+vUIHc6L46N)?~HN0X?%b=Mfr{JAWs(1o(=<#kIiO9JI9t1
zsc_68Hbw7b=UFky%RCnRMJ_rBHe9|%T@&-%6}Zvbw0l3?sd366%9MG8T%cb7>EY
z{MrWLYU+5&Md_O;l@ELPo|APC%~gFY2LnC{PW)ItY)WKE=COjtuxm`;^X*!r7W0)%
z4p_VsW2Fr68|B0~VYeeL!){NG)8Yef$=sGzOu#N&SPB~?w3(^=bl!=d;91v@U-Y~`
z$u=2Vc*)8GfZB?!_*(WM({mV}`@QM87(mQhiozmKc1}8kD0TqD>?WwrI1Af^`U?0~
z=XYz0qTKI!-97umvFAiFD(`;3HU256kV^ZUhT)B=^oo%TSG}AaZ|QejB#Gzj`(UCQ
zA(6HT?GD|PTTTubu8VP!_j#49Z?*x1Bx|rm|P50edumyaWI}M%_~p_3G^cDz7x}
z6SCT#r2f(xE5v3a;*rcU4eWrqEzfq`hwR9$P%<_KeVLs1yVkzgZfp!}=scR$XpfWl
zz}UX)XDB&U{>q?4^
zMGp*$yin`wd_~Ckj2p%LNmp-HMiKnyL3A{Yd>+I|<|)XcZeP-qJ|qe*MNMuK69cped
zd${!ywlB^22f60DOJQ*(>rK<-NW`R&Om-Gq--m;|pNE~)74$bi^@KyPlt%1DS+2`p
zu2M)mfRYhk`)05xk6;tTM^FCCz2qDvw_gWI*CbV>3QV{`I^?f38eH456JzxBZNL!+
z?JbOkn&0i?Bh~m5(U1Q+)0B`TuR!Xp%D|BvIDHB4lI?P2J+O1pTTN8g0U;up1b`dy&W`QaT77Qu!oa7RL~3PcctA!Opo8)4{AmSTQ;c
zbOmZwBsAq`uo8Z&MId4H;(exG>th
zO>@~C^{rV-h(OfgQ;Kc6vt82ONLgJp#I|XS57prFZiEHDdgIOI;y=RrD(nwY7Zx2|G{NSDCBS-l9A+27(s6wBW?qrL6mH6lP@EDvY|Q
zC5jkU*owGb*>ud(Prj@!iEpj)eb}S?tkQjugwl%UJ~NqY6bW?UfVagsMU2VY9d=D8
z_B?oOF?6RenfMfCF#qA}ox`j{TfJwL$U;aDMJPXU*%)4YQ94>KW%1Ko#rf#01el=Q
zZ$c5XS$N4EFK^cb(FGZ+Ne*dhaC{z8F76tOcQ-{-2|Ht!G?HinUV=gsbFdOQp66iI
z?_`cdoApe->RR5M8Nm|tvMOgEsq#-c`2J8azL!pV1m|C>mE7^P}hU9IepE*&y^;e{Zp~L?V#PAgzW|M7QwM
z2m71N*H&;3VNj&~+QR1L{o)E}-F@i-3OiQxo0$=quOyqAbA_Pr0>;KM=lI+v{}kR-
z(0%FBGxN8vYTBy{eE9gp_79&IXQ~+%M*SyAMc()f6wf>*{%8_(d`p(utv`R(%s5V_
zIPtQaEf>x2U-sSDNH5u<#{PlR=}`Z`e1E+16OH;<-Xc&^V57Hvlf(4i_tgE3GwIYr
z!O17=%p6ZwAM@N`hgf8b9O>_L>No$p-T*@3Ajy(7q2xQ606pei{eQfO5%Eh9HbD*w
ze>lKV8-HJr|KF!50$=nse1sJkjdBidR=!k!>Sz4%|I!O2DvtJ>C;OLRgkZG6+h-Xt
zEd8I4LH#>1!yhj#_t`xOh|-|w=;lbayV##sbY3|2$NXRAIj=?nwL#uDY3`i@AK^@e
z=W>7BSBK*-Gr<}6jR`Yk1))u64&6-gQ6hRdf75^v6tO+DIBq1JFaH_|1`bwGf`|-G
z5mSK?-#`vIKVNjW%c!+U=gEl%uxo%-A9`7i%QPn?{@=tc7)*C_|qzm3pI|L+!!-3|4o
znGr{Y)tsF8o5#c&U8iW>FG7lvd-ZSoXB?A|{wW1q0Iz8N_a^!O-jun%Z8)m&??0&j
z{=)$?uwj#M91Q5q>bZK{hX0M7H|m`#L541i-;iBFf4-2e6Ua+{JJwW5AZEeUMRa_#
zhv@jd$N3GNI=>pfv~_3)vzyi?zIV{!&bvo0KE@bnz|{2jy8m9u|L3n1/dev/null; umount "$SMB_MOUNT" 2>/dev/null' EXIT INT TERM
+
+stop_lo() {
+ if [ -n "${LO_PID:-}" ] && kill -0 "$LO_PID" 2>/dev/null; then
+ kill "$LO_PID"
+ wait "$LO_PID" 2>/dev/null
+ LO_PID=""
+ fi
+}
+
+# Persistentny watchdog co 0.3s — przenosi konsolę LO poza ekran zanim stanie się widoczna.
+# Działa przez cały czas życia skryptu. Fullscreen i Chromium above obsługuje start_lo().
+console_watchdog() {
+ while true; do
+ sleep 0.3
+ for _wid in $(xdotool search --class soffice --onlyvisible 2>/dev/null); do
+ _wx=$(xdotool getwindowgeometry "$_wid" 2>/dev/null \
+ | awk '/Position:/{split($2,a,","); print a[1]+0}')
+ if [ "${_wx:-0}" -lt 1920 ]; then
+ wmctrl -i -r "$_wid" -b remove,above 2>/dev/null
+ wmctrl -i -r "$_wid" -b add,below 2>/dev/null
+ xdotool windowmove --sync "$_wid" 4000 0 2>/dev/null
+ echo "[watchdog] Konsola ukryta (WID=$_wid, x=${_wx:-?})"
+ fi
+ done
+ done
+}
+
+start_lo() {
+ stop_lo
+ # Usuń plik blokady LO — pozostaje po kill i blokuje kolejne uruchomienie
+ rm -f /tmp/.~lock.kiosk-live.pptx\#
+
+ # Wyłącz konsolę prezentera — izolowany profil w /tmp eliminuje problemy
+ # z HOME=/root (usługa bez User=kiosk) i z cache LO z poprzednich sesji.
+ # -env:UserInstallation wskazuje LO dokładnie który profil ma użyć.
+ _LO_PROFILE_DIR="/tmp/lo-kiosk-profile"
+ _LO_PROFILE="$_LO_PROFILE_DIR/user"
+ rm -rf "$_LO_PROFILE_DIR" # wymuś świeży profil — bez żadnych zapisanych preferencji
+ mkdir -p "$_LO_PROFILE"
+ cat > "$_LO_PROFILE/registrymodifications.xcu" << 'XCUEOF'
+
+
+ -
+
+ false
+
+
+
+XCUEOF
+
+ echo "[presentation-manager] Kopiowanie pliku z SMB do /tmp..."
+ cp "$PRESENTATION_FILE" "$LOCAL_PRESENTATION" || {
+ echo "[presentation-manager] Błąd kopiowania pliku — retry za 5s"
+ sleep 5
+ return 1
+ }
+ echo "[presentation-manager] Uruchamianie pokazu: $LOCAL_PRESENTATION"
+ # --show otwiera bezpośrednio pokaz (bez Start Center)
+ # -env:UserInstallation wymusza użycie naszego profilu (bez konsoli prezentera)
+ soffice \
+ "-env:UserInstallation=file://$_LO_PROFILE_DIR" \
+ --norestore \
+ --nofirststartwizard \
+ --show "$LOCAL_PRESENTATION" &
+ LO_PID=$!
+ echo "[presentation-manager] LibreOffice Impress uruchomiony (PID=$LO_PID)"
+
+ # Obsłuż wszystkie okna LO wg pozycji:
+ # x >= 1920 (prawy ekran) → okno pokazu slajdów → fullscreen
+ # x < 1920 (lewy ekran) → konsola prezentacji → zminimalizuj
+ # Fallback po 5s: przenieś pierwsze znalezione okno na prawy ekran
+ (
+ for _i in $(seq 1 30); do
+ sleep 1
+ WIDS=$(xdotool search --pid "$LO_PID" --onlyvisible 2>/dev/null)
+ [ -z "$WIDS" ] && WIDS=$(xdotool search --class soffice --onlyvisible 2>/dev/null)
+ [ -z "$WIDS" ] && continue
+
+ PRES_WID=""
+ for WID in $WIDS; do
+ WIN_X=$(xdotool getwindowgeometry "$WID" 2>/dev/null \
+ | awk '/Position:/{split($2,a,","); print a[1]+0}')
+ if [ "${WIN_X:-0}" -ge 1920 ]; then
+ PRES_WID=$WID
+ fi
+ # Konsola (x<1920) obsługiwana przez console_watchdog()
+ done
+
+ if [ -n "$PRES_WID" ]; then
+ wmctrl -i -r "$PRES_WID" -b add,fullscreen 2>/dev/null
+ echo "[presentation-manager] Pokaz fullscreen na prawym ekranie (próba $_i)"
+ break
+ fi
+
+ # Fallback: po 5s nadal brak okna na prawym ekranie → przenieś pierwsze
+ if [ "$_i" -ge 5 ]; then
+ FIRST_WID=$(echo "$WIDS" | head -1)
+ if [ -n "$FIRST_WID" ]; then
+ wmctrl -i -r "$FIRST_WID" -b remove,fullscreen 2>/dev/null
+ sleep 0.3
+ xdotool windowmove --sync "$FIRST_WID" 1920 0
+ xdotool windowsize --sync "$FIRST_WID" 1920 1080
+ wmctrl -i -r "$FIRST_WID" -b add,fullscreen 2>/dev/null
+ echo "[presentation-manager] Fallback: przeniesiono na prawy ekran (próba $_i)"
+ break
+ fi
+ fi
+ done
+
+ # Podnieś Chromium na wierzch lewego ekranu (przykrywa konsolę jeśli się pojawiła)
+ sleep 1
+ CHROMIUM_WID=$(xdotool search --class chromium --onlyvisible 2>/dev/null | head -1)
+ if [ -n "$CHROMIUM_WID" ]; then
+ xdotool windowraise "$CHROMIUM_WID"
+ wmctrl -i -r "$CHROMIUM_WID" -b add,above
+ echo "[presentation-manager] Chromium always-on-top (above)"
+ fi
+ ) &
+}
+
+# ─── GŁÓWNA LOGIKA ───────────────────────────────────────────────────────────
+
+echo "[presentation-manager] Montowanie udziału SMB: $SMB_SOURCE"
+until mountpoint -q "$SMB_MOUNT" 2>/dev/null; do
+ mount "$SMB_MOUNT" 2>&1 \
+ | sed 's/^/[presentation-manager] mount: /'
+ mountpoint -q "$SMB_MOUNT" 2>/dev/null || sleep 5
+done
+echo "[presentation-manager] SMB zamontowany."
+
+# Synchronizuj czcionki z udziału SMB do katalogu użytkownika kiosk.
+# Fontconfig i LibreOffice odczytują ~/.local/share/fonts/ bez uprawnień roota.
+# Wystarczy wrzucić nowe pliki .ttf/.otf do $SMB_MOUNT/fonts/ — zostaną
+# automatycznie zainstalowane przy następnym starcie kiosku.
+FONTS_SRC="$SMB_MOUNT/fonts"
+FONTS_DST="/home/kiosk/.local/share/fonts/smb"
+if [ -d "$FONTS_SRC" ]; then
+ mkdir -p "$FONTS_DST"
+ FONTS_NEW=0
+ for _f in "$FONTS_SRC"/*.ttf "$FONTS_SRC"/*.otf "$FONTS_SRC"/*.TTF "$FONTS_SRC"/*.OTF; do
+ [ -f "$_f" ] || continue
+ _dest="$FONTS_DST/$(basename "$_f")"
+ if [ ! -f "$_dest" ]; then
+ cp "$_f" "$_dest" 2>/dev/null && FONTS_NEW=1
+ echo "[presentation-manager] Nowa czcionka: $(basename "$_f")"
+ fi
+ done
+ if [ "$FONTS_NEW" -eq 1 ]; then
+ fc-cache "$FONTS_DST"
+ echo "[presentation-manager] Cache czcionek zaktualizowany"
+ fi
+fi
+
+# Sygnał dla kiosk-manager.sh: SMB zamontowany, można przełączyć Chromium
+touch /tmp/kiosk-smb-ready
+echo "[presentation-manager] SMB gotowy — sygnał wysłany"
+
+until [ -f "$PRESENTATION_FILE" ]; do
+ echo "[presentation-manager] Oczekiwanie na plik: $PRESENTATION_FILE" >&2
+ sleep 5
+done
+
+# Uruchom persistentny watchdog przed pierwszym startem LO
+console_watchdog &
+WATCHDOG_PID=$!
+echo "[presentation-manager] Watchdog uruchomiony (PID=$WATCHDOG_PID)"
+
+CURRENT_MTIME=$(stat -c %Y "$PRESENTATION_FILE" 2>/dev/null || echo "0")
+start_lo
+
+# Pętla: restartuje pokaz po zakończeniu lub gdy wykryje zmianę pliku
+while true; do
+ sleep 5
+
+ NEW_MTIME=$(stat -c %Y "$PRESENTATION_FILE" 2>/dev/null || echo "0")
+
+ # Plik zmieniony — odśwież pokaz
+ if [ "$NEW_MTIME" != "$CURRENT_MTIME" ]; then
+ echo "[presentation-manager] Wykryto zmianę pliku — restart pokazu"
+ CURRENT_MTIME="$NEW_MTIME"
+ start_lo
+ # Po 5 s wyślij sygnał do kiosk-manager.sh — restartuje Chromium po tym jak LO
+ # zakończy ładowanie i ustawi okno pokazu na prawym ekranie
+ ( sleep 5
+ touch /tmp/kiosk-chromium-restart
+ echo "[presentation-manager] Sygnał restart Chromium wysłany"
+ ) &
+ continue
+ fi
+
+ # LibreOffice zakończył (koniec pokazu) — uruchom ponownie
+ if ! kill -0 "${LO_PID:-0}" 2>/dev/null; then
+ echo "[presentation-manager] Pokaz zakończony — restart"
+ start_lo
+ fi
+done
diff --git a/smb-credentials.template b/smb-credentials.template
new file mode 100644
index 0000000..2023a46
--- /dev/null
+++ b/smb-credentials.template
@@ -0,0 +1,5 @@
+# Plik poświadczeń SMB dla kiosku
+
+username=NAZWA_UZYTKOWNIKA
+password=HASLO
+domain=WORKGROUP
diff --git a/sway-config b/sway-config
new file mode 100644
index 0000000..410ccef
--- /dev/null
+++ b/sway-config
@@ -0,0 +1,65 @@
+# Konfiguracja sway dla kiosku dwuekranowego
+# Plik docelowy: /home/kiosk/.config/sway/config
+#
+# Nazwy wyjść wideo wykryj BEZ uruchomionego sway (działa zawsze jako root):
+# for p in /sys/class/drm/card*-*; do echo "$(basename $p | sed 's/card[0-9]*-//'): $(cat $p/status)"; done
+#
+# lub gdy sway/kiosk JUŻ działa:
+# WAYLAND_DISPLAY=wayland-0 XDG_RUNTIME_DIR=/run/kiosk wlr-randr
+#
+# Wpisz właściwe nazwy poniżej:
+
+set $OUTPUT_LEFT DP-1
+set $OUTPUT_RIGHT HDMI-1
+
+# --- Wyjścia wideo ---
+output * bg #000000 solid_color
+
+# Opcjonalnie: rotacja per-wyjście (odkomentuj jeśli wymagana)
+# output $OUTPUT_LEFT transform 270
+# output $OUTPUT_RIGHT transform 270
+
+# Przypisanie workspace do ekranów
+workspace 1 output $OUTPUT_LEFT
+workspace 2 output $OUTPUT_RIGHT
+
+# --- Przypisanie aplikacji do workspaces ---
+# Chromium (prawy ekran — workspace 2)
+# --app=URL generuje app_id: "chrome--Default" — używamy regex
+assign [app_id="~^chrome"] workspace 2
+for_window [app_id="~^chrome"] move to workspace 2, fullscreen enable
+
+# Prezentacja LibreOffice Impress (lewy ekran — workspace 1)
+# LO zawsze otwiera się na workspace 1 — assign to potwierdza
+assign [app_id="soffice"] workspace 1
+assign [class="libreoffice-impress"] workspace 1
+for_window [app_id="soffice"] fullscreen enable
+for_window [class="libreoffice-impress"] fullscreen enable
+# Jeśli powyższe nie działają, sprawdź rzeczywistą klasę:
+# WAYLAND_DISPLAY=wayland-0 XDG_RUNTIME_DIR=/run/kiosk swaymsg -t get_tree | grep -E 'app_id|class'
+
+# --- Wygląd ---
+default_border none
+default_floating_border none
+hide_edge_borders both
+
+# Ukryj kursor — niewidoczny motyw XCursor (1×1 px, całkowicie przezroczysty)
+# Działa niezależnie od pozycji kursora i bez dodatkowych pakietów.
+# Plik binarny XCursor tworzony przez printf przy każdym starcie sway.
+# Jeśli motyw nie zdąży załadować się przed pierwszym rysowaniem → hide_cursor 1 jako fallback.
+seat * hide_cursor 1
+seat * xcursor_theme blank 1
+exec_always bash -c '
+D=/home/kiosk/.icons/blank/cursors
+mkdir -p "$D"
+# 68-bajtowy XCursor: 1×1 px, hotspot 0,0, ARGB 0x00000000
+for n in left_ptr default pointer crosshair text watch wait move size_all fleur; do
+ printf "\x58\x63\x75\x72\x10\x00\x00\x00\x00\x00\x01\x00\x01\x00\x00\x00\x02\x00\xfd\xff\x01\x00\x00\x00\x1c\x00\x00\x00\x24\x00\x00\x00\x02\x00\xfd\xff\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x32\x00\x00\x00\x00\x00\x00\x00" > "$D/$n"
+done
+printf "[Icon Theme]\nName=blank\n" > /home/kiosk/.icons/blank/index.theme'
+
+# Wygaszanie ekranów przy uśpieniu (bez -w: ignoruje inhibitory Chromium)
+exec swayidle before-sleep "wlopm --off '*'"
+
+# Uruchom skrypt kiosku
+exec /home/kiosk/kiosk-manager.sh
diff --git a/waiting.html b/waiting.html
new file mode 100644
index 0000000..6a3a4f5
--- /dev/null
+++ b/waiting.html
@@ -0,0 +1,105 @@
+
+
+
+
+
+ Oczekiwanie na sieć
+
+
+
+
+
+
+
Oczekiwanie na sieć
+
+
+
diff --git a/wol-enable.service b/wol-enable.service
new file mode 100644
index 0000000..df79186
--- /dev/null
+++ b/wol-enable.service
@@ -0,0 +1,17 @@
+[Unit]
+Description=Enable Wake on LAN on all ethernet interfaces
+After=network.target
+
+[Service]
+Type=oneshot
+# Włącza WoL (g = magic packet) na każdym interfejsie sieciowym
+ExecStart=/bin/bash -c '\
+ for iface in $(ls /sys/class/net | grep -v lo); do \
+ ethtool -s "$iface" wol g 2>/dev/null \
+ && echo "WoL enabled: $iface" \
+ || true; \
+ done'
+RemainAfterExit=yes
+
+[Install]
+WantedBy=multi-user.target