From 26571dabd09acf4bc2b6ddd5c52214f552e973df Mon Sep 17 00:00:00 2001 From: OMGeeky Date: Mon, 14 Apr 2025 19:50:37 +0200 Subject: [PATCH] use canvas zoom & a bunch of other changes --- assets/fonts/arcane_nine.otf | Bin 0 -> 100560 bytes src/logic_sim/mod.rs | 167 +++++++++++++++++++++++++++++------ 2 files changed, 142 insertions(+), 25 deletions(-) create mode 100644 assets/fonts/arcane_nine.otf diff --git a/assets/fonts/arcane_nine.otf b/assets/fonts/arcane_nine.otf new file mode 100644 index 0000000000000000000000000000000000000000..30a2785622280b12cedb6bbd26ed28c26f8a7ea5 GIT binary patch literal 100560 zcmeFa37nP1l{Q{=_l9ohy&Gtx_XTd#-S_s!1++E2A_xL1xQ3(^_n^^?aR5#q!*u|j@GtzlWyKY)&zXd?U*)o#%n7) zr{VidTvX68b*+_Ab5T z{3|bitLwcsV;0pK^M~(U`i-y8dF}k)e_-sDpvUgGY|b_Fd=oQf8haJnE4+NpW#^wT z`m00m9ry2fd)_y`dDW+9Z>l!-Z#Ln(XWo_P&%5}=w;nxOgpIv)&Q+J25PBE?9LN2YbRmyD&9@KN@-t*SLtkOZbdzzVX)xu;{V)9IyyMJw z-ooowcn6*5ohzMv@!vbYIU;{%B7cdKhO#s8JMd6KoR6LD&h1VvYWjh5p402x=iK0Y z)j8RD*ZID4d;E{iUgf{;+?vS$k@G`mxw8=^Z+6x?U3#73G&rrS*ZG!PyYqddf9~vY z{=xZ?^D5Gp9xdNl=Uj!~TAUvUcRPH2!Z%BUg43NQd_L?P2VCfU%LzLt9xLB@-?<;< zcj0%Sv!MT_x-J*Ko}lY3=L6iuD=2%z(ej;JoGYB)Iv0X=;;;1j2>21M*zTNfOnjrW z)wx*T-f~_-T|Z6aFFPXtO4RiW^wM?2_fOH z|A6-^&Seg-+3kGf{5?Kj24$#A`R^W@k8dA<=3j#z;){5FA9do5U*2}6B6k~TdKG=N z$KkbagX@l!e~xoLdSoU_6W`J66Cij3^@zVXa`E?^N5IuD#ea+5ACT|(o%PChkbhVF zo46`n_n4j-M~xOMFbP zt-!6g;x(rLz5bT-W9JfmbNT+0W9HXGD*XZ@@w9Ll#$||e65qJ`JVY@Fo5z;-t`vI<^Pi(iNkV!5_ZV^V#aqrF4$%XDk2&GWd+Hs| z-GTBxA@wDn-gN$@Pu?Gz-=_yq1LxTr(qTz?|2s%H%KKx;^}hVW^Z>4K<^89avwvNA zpD8Zl?1o&AzXN$sx&E3H8<_8S6Zu!f9h5v$-XBD6zg&NRpj>xg6XRFt0rc*>(3iYd z=mFqQ@cyOx=WR%PyzxCbkKZ|lynpRz`I7g~{#E4t#{Uv|zx$~2z7_I*ALR3OxbN4% zf3$PnLyGy-0|WCvaSoODP0ldM`|uaY`)?jq53C(1@8cgk`54pL@dM6yjSJg7n!JZJ zSN`h*^}rX%`>OvVdH;t)>g=Z#zA(q!&0BA2a_xlw0on4Qxl^V7!JnrF^5V zfqKaAJRkoLNT`g%)*VBU|4t%*i8B;d*U{G<$+~ufv(jKMZN@dZ1L`_Fe~B~Vn05UI zqx>Q2`3Ub5VQ-uPT2Dt^hv%0i@|QSevLxOilBWj#b2S@Ez6@^vwetZ|ugC(H#ydP8 zeZ2yC7fV`PObLzG2Ye&<4bXE^{O=&)*FbK4jI~57WK~vQ{;!q)dSCt?X9ej0DdZ4w zZvP8)CHsqOKKAiH9kuT_$3KE?@GrRY|MR}zf?2oE@u;ppx9@-Ki~z0d`wtEq6ZUiX~L`%e;me|R4!^W8Cd_lUlK{fNHzU_D=ICW1#=%{gYcxdg9zb1hyCW`S8{8qI36 z%}g=d&5Pzzv)k-3SHlNTYMudlj2C_YzX_NiYVn&CcoPQ0(?CCh$E2AdW+MwvpS^YL4eDK;f&X{0H`tK3wW%0sR{^h?#D zUl02>THnWjW(#k}7*h>uy?FP(#v<(#Y13))BET_DOm_=PWe zr$UL>VEi%?JWz@^u?$H1+}BXhejMJTMEMZ>!WW!#;4$}=hhOqg;y?4xgL*7390dA~ zJHj{S*68(qXqThsjsI?c6mGE*?x*)PbAbnTorgaq|9O)Mes)eSEHo{~6c6*?9lyZr z3SMd-KsMV0!};MQR8PS%h!o%KBm4t+l`25750O!iaz4$ek!GRUV4g5fniq^?>+B5A z-+6xOdC$ABFuQPg;cAg?v zeQfXDd+YX&{$Tt2=em@mt+9BA+3273&kLy$@C;&E+%^6m@{hdl{!4xy^7DW%?v(>& zRB~1%Wm8fvCAmE*i;|KkDT9*or^<|m^aw+KjDH#5vkbDBBboMC2}+2%}h zmN^@e_*`?I`Kp2L3%^i@&cbWC(K65`tZG(BhY%-h8L*`-ghvgi_x~5`w?k~69c3%*OuN}` zvEQ@5vhUf?tm7H%DfEPc6({}(y*v#)KM7;djuH6^M&?9}(FBZF4CB^}F|5aE)?jo; zLspkTViiL(`Eai7r%*@5; z4Tb~`m`}jH)PQ$j1Ss3m%}3@}=(qE6Exy~ywgI2Trp&Ihl}MGFVtcp!sy)}vw$w;P zrrchEI!a8HU168n+w9HubUV?Gx6P<+tSPYz?6>VT_7c=rYQ}mhJw^79_7C=->|XnK z_9c{wng&mWr`R*nlWqUQzGi=6U$D=CqDFJP{f&Lweh>Fok8kPdo9Dqb_n_aQ{cOI? z1wDh!pD+gVQ6^v<@S_LierNvCdRPW!kKkt){rFytMer3R_-ORz5FmtBOiWtFAO-OG-<|mM$_4 zk!YkLx~R!UkFSl+GmXdB*EU{x0;aPU!*NkTeqQE@LxcX76yLBc&)|S>@Z3>0Fg!ce zo01+#nOk^VjyHYeh}?`JX@i0xPkQKL{)cyaCTQP&DD6cH#WMdF5T6I)pZSZ3k3^4O_&>t!WuLH*+6V0Y_71zu-fC~L*V~15zP;A| zjs2Fr++J!gwinuNJI9`F&$QF*6x(In?FsgH8?_M|wxex{EwaPyFq>i1ZJHfqLpET& z)|!LnfcX#e@8)04XXXR*9(3p%(49Ynj{OO=;`gD|zY8t@IJE!$xTCxDUJEV01iJMG z=;Uk7x1kxYhJOF1xe}Uv9`xzu(BBtB-=7Yx$@g)vz4Ku?ra})OK#o4if`t+=xnpd! zFe`VYP4@@J*g|jlM4MjLXrsQOsHdVFIl+LYJjGyqxS{NkuR>Cs+}z zXeuuW7FRUoH5FIX=LPY5L;X;j8;vy8`=fa|!Sa#-u4;_t1%l-bjpHqvi8e%YN*YRX zN}BMQ6V1s+T@^V|{8G};7)7nQs2|srphjJgJKjc`8k+K=O?f$>u(*O1q0ZcBBd;zm z$*E91V{8r-NFLs~s2Nq{l$YSLhTNP$NnQ}umE_=~p*~vCRMMD-OL>7y0%~pGo#Doc z8_G~|LwQ9>pbYg*wDl!<_{4ox*c_13I1y#*qxDTW0oGaHgf0q)4}huUnkf>y^^j6f5bsjnyw)|Y^kM2-HO+#(cd zY$z=O^}J=gbJ>rPypjr3$r~+iXv)rOs%PW;9UYCKL*<|@rv$m6C zvA17!?oV!8Ul{+acb2E1pwK@ekXumT1NaK_xvnTE80JMT5`o+a1;{HH?g`|^=cN{e zatEbn5BH>|<<*B~Wrqs*@4}XFI1~zHSB56r8|y=%^g*87K}CbFNey{ZLVnzEHl8|IY3Vl~z`UL(QR? zwWYq6^iaGdkeiJr(rqO^Hu!P_sRuTsMJuz@C#RpB6H4)BXBVcnbmnBGFQ~|$kX4jF zYGm}H37*Nm!a>Ca88yE2g36M#mi+L9s-darrOlPCq4dhu+{V;Uy>I3jRt!?khi38OY5KWv5rx)@FyY zyHisueKuHFkX?}KOHEDpP4)!_f!fKbA&{CfqBK;R9||EOJv9(WEtr*xzQNmnRs78t zepng*$-YH4jD(HtTXgV%&xX2Zet3mV!|-rqI5r%l;{xb#4v_x){e=ad;l99V3{hZV zD3t2+WoHC20D+W>S{p1VJ-e{*?EKX95V|te2GeJTf@Os^7#I}t!EOpx=BL)_Bd&ClJ7uAzwH>JrIb$ z8EPGro1R_i_xk?m%MO;6rZk0O!+lRQJe^vaJ0vImAEDH&t2uh1@J|M%PFU;<1kM>1 zsz@o#PcPhHgT4{NvM;7`{^p{iiM@9scqYwF(G@A!WAN`cSUitbFe!3nA8 z?2s=V75P%Uq0|uC4%OF((zE=i+UF|(Yo&%#(+krBxuJq)v=+hz>7LANaAhioAm4pM z!g{!Vv0?u;u!VzWR7(Li>3GjGUT?+}1Cf6oie#EoGBPsKeZk>lib^>DGNLxztAAbu zuvCZlQ_rkK9eFL;9+<=SJg5wt(SNPwb%|?vz4ueQJU$PO3YP}oWL!T2UX#f!U4E~} zW(*C0B5URjNl)_zQwMoMDZ$WOpY?b$rVO?zDVZs!6d(v%FsfkGaU*fzh~dNX^B|P7 zK&$&NGdOCD%>cz2iB}F<$2;+Au*gr|hq_5`ld#EZtwp1 zn=`JqpItqnt9QQ*&$v3Cdi4bV*&p`yUOl55x3T%^2_xMvxDR}xzor`S0{VO~d{Iqi zcFXBy@PAcWZ?M67yxz%!FowRM@m&PA@OpyYi*OVEIRWeUv;RGw(AQFID3lpGB`wvO zrpCIOF;x}iMWaRx%gRX2OUnylIcf)|2BEh}XL$*!&mEZdLU)!o)I-%!m1ae)n{soT zye0PBoRK4Q@U|x=65nY5+J!4uUU=b3d(#K;iUD7IlT{Ff56n-dJO@u?(Ulht8f1qY z7~l6L{s)d9?yU#+9yZfjrj%j)>}1#&@KD-CLBGd_e3%5*Gj}lhV9*>hXb?uv>rI(s z#CFzw47e@t@LamFReJNII~z6;xGObaA8F2I8MB7<@F%%%XC zgCX~xYR!<;!6`nNU^dIok;Lr5ZDnLjO=Ivf>KpB6-Q6>;2A6ej-nY;HF8J-h-WgZ- z?%V7w+`P}FZD3pAJCF5xz)Wa!Hs{G4G;hrjZRMfY*m?D^E0D@Xs{!;+UsK&^$y=zF z4(vrs)|}}r^!x;4nqkUYN;1-i4oOQ*;lTL3beUp+`@1DSL*0UD1k(^^A%>?3W?|5N z)_ZyPWtVkd?tXaJFI;%SQzzhm;?un!yWF!Af^RU}fgi-B^R@U;!BDE2>*D7H<&jj z1?vRw3kOgA!1J{Kn*B@A^U@{$cM~$Dx@9yu%L`s|m5FDLA95qpBZ)CkN(9JT#Sm>K z8o~51xUr0MQzY~jCK%q9VQ$3Vk6!>MR54y~Q2Tn^>B9M7%l~fzbm4&|zgy6cNrn03>b0i_h6ACiZdx|xK z2c8UA`ZLF zr6M$L>y#bwkL<|!>z-}#cb9)-W&9mU6ll5l+!2?rqP$T*Q7Mp)G=q@?I|lnH6tq;$qj?c^(nidLRW{CErC`+)u%B(-2Z2H90g>UE6`wcz8<1D~HZ!M};4SPu zP`__;FNK!)Sac47ul0nM3Axt#NGZ6<2QdjLd0tS4NC0H{=eYfnKGd4R8 z^PUlZd+G1vZ+~FRm;N5j9DD@-B{#g%m9))hC)BVv$|>z88!v9&dd)@b3H5=v)Hla9 zacC8UM;9J9aGtX_Y@c4NFZT{eXSqB(P(R8r@XT_xW6ykQO1xidssju6YsvXN-a=PH z&hN3yRRqQ2|5jKl)*hfMd*+`raBK&|gAVP-G4)!QIrvQi3b*0)VsfXY=4NMRqz+FT zURoTW7EKy4;4-gfc}ZrIYr=ST_VL!{eFy*e@!rJ&jF9(Jm*1|o|G01Sh66k7n_hO9WH0mr)dr+6 z*l2HWFL>K!9?8HzO%uI-^0@St7hIl+n0A?ow$u*G1YcM$M341M#?W{Znv9IXbqF-s zh~Y(}hL?>fD=zbsL%fZ7eh49Wn~Gt$)2CDfaw^Iz4%KLD)~t!|m~q~DGfwI5UVhoC zTRm^xy7Kbn-G?eS@1pqlv(9>R)TnQJI|?pa^=j{(clN%z>av1A%|1fSd8DhJ!5j_2 zZw76J)e?*ms1c7Aa2Zp4&?Yw1Qg$PVjb()&N-qkBUx}xr*qa5qBX&6$ptpO?n(qCe zj~bl|An)RMYBzcZqXLvn3_%VQnueB0hDC56W);>12o7_7kW{T$_;3k{NtBCxO=1_FZOzajgHo^%3fYiaQwuOPvSj6yz}G4>CjNeJugjc4)`^-S zn;=k7wP)7BN8E}Nb+V5#O{Ap;8iNvU5ywS#jP$zitFE%pLc_JBGHs^JL25}^gs?1< zLxXP8;-|Owu%YqHI6 zKN&0=HNmxZ4tfiG1dgGNN_Ryz{H|OVfjU?LFbwQ+@23ayY22VycO0JpeW|9fWn^j! zw+&(C;~MZ@_r5dXAfYRV!xzm!7?XB9wTsVw=hOJ5guS*T{+|DugA;=g?yUz~?Y|`J zCJ(xHv}nXVe-%uEdxlaVjalfzoFdF#aTvv`7Bb%dh3nEt6YOPJClDLp1I$fu1+UJ| z%q%2LSrt)OlR;26802;PsV4lr`}gIEop=M`N(hjp2XIDMiaAd`A+1{tY`WE!k@ui`ag@49!dG zpQJ|Ma>1P?*l;lkRYMzrM9 zgDZR9OQQ#>vm~oTVk3)EhzqR-i6hv*^u)*yvw5E@jkKJSR1$q$N7FV5u-*V>Ck0ZX zc1X8`tSKQzvM|lF zT#so})C);sO9r#n5!M^^?2PoTyI?XHd`wo#?TXC08=0P{{Ntk<83Yc5aG?&84Wl7vhh|vi`u%ia!D|25Cw` zD(lxZzI9(oKTF796##!XI5sI7U5?4jlxc&mtcr z>vFyL$T`AY0Va?aU+X`}X?Nv!aGNLhz@y*;S;OF`gugCGK2`^#ld&|xoaZut%w;`O zLH+=?N*EYeSc6+3Ro`W0ftEw=(Q9146WB_9=eo9vFh1TFK7bnu!>jU#w2yfWYX^Qc znpoIfZoHUP=%+*5&uf5zgLgNl4Lp)G^Z(-qoEzRxW!D5u&6YrSYfCAVAO;cq0*P@3 z*~XlQq4Z$G8|+vU$OMn)kJ%D1tq=(q%q*;d|M~LE{}~D!p$cF8fE;j%IVYc8q3S(` z-;Nd0H{&k3lJl%DRx(W2azCfN3GIK&?Gd$(5WHvB>+$z(e!^+{rH!AIb=3D?+W24E z_{sI?mp1;FHvX43{+BlXmp1;FHvX43{-15*!!CZ;;B;L}Y%un&*vay@!=ZZ-96Uac zAO3|Sb^~CeO#!x5W?}(bYD?vMPXx2LDFp!>#<%E7E#`hbY-?2HtI@MlaeMeDQW6^l zxL|ZQ3v_S3It4q#uHFn^7F}9EEON21)j9-w8s3HH`3vLX-CAn6*9^QbtPc^VG9E12 zE`lozjuX16VMw|=4;aAW&VwWG%iVo|n`pvT$qL<#yA6SN$h{qm+_~Ek4!UM9cK=jUM$I-V~a;B6k!GLrXn6AJimKFaUd z$CQy#ddNN|cP9|p1p6=0x!S>m$oqc!ruO&t-h9!b?fkqTfRBe^}keXgx94PoZ7pwg6ZS4;cIg5kN@S%|}y78ea2;s^Il9+BhmOe#t9c)JqI*^A&h#(EZGjs-0o zEQWh+D$0f>c1_7Ot~px=8jrMH{g1-g6DIavEA=6ul9 zwp7Duk6D0VwvX*v?6cuOlM$x+eB7Sq~RMV2NcFi1kDheNQSX0%B#ne*HzS&7FCuO zm8M|VLl#*j3eMp+YK#g;#EoUajR&crxPHBVz$h*$-M3k8y;y_4_0$!+O7UIJz47(> zZqGe_)~w_4_ReZM8B7*y=qTK^;YyGXW(JQ_7Z;Yk*3O=rrIW%AVQy>pt&doQi=0yfD8=; zBtrvp2H|W#;M7saG2UNRa$MD@s$qH9=Q|{IWZFn~58&WFnWcD+Vqd|;{7Y^mt8dII zJjR}%E!_(Kbu%t_?m%bp;roAj6$?~c_dxzYuQ4xz9E_NkJd1IL_3Jocm*JT{dSdwn z_ABNjoJx49(6oT9DHT1_Ar-fHY|l%Qj*_2dzkdnh=*2kgz`l9|0+1|-2mb;Cq6;ia6RAeO_^+)W-LO7V*b9sAjWRUBrPsG>< z`0?Wxcnc9feX|>pv$YeJcEjVT9UGssQ49U)!%hy&QLp(zpBf#Qu1^h)KFx3J{d41T zd3{`)#B9ba6sho-Q^~6X_oXmU;c8V)YR=_A#ekV>mmjtVrGLkXcrFox z7LOU;1DeWlbuSnO{wjRWb$O=G_cuzT30E_eC*yN`z8VD?ch-@X5w^&7ziad3@4Ne? z@iU4-_WdB%5)3HP*`D0n!-ySO)k zFp@p#Lqr%DUOjC{>2pjem;!clg({W3ZE5Vcg()c`Yp$#MY6;+?% zEUJ&vXb~uJ17VPN-r2O8=D?7$r)DF*lkUfE1C6Oh6DCq(e;BtS+m~o+z_xIusSWeX zt`)BMO^%zzo-5>`r^OHm>yAvnSSRlgO+( zcjJop)8vM*Xa95pm9OuIxplL&pL+hRIt&RUGh<8Kv+BjZmX4OzR8WmAEuXuLKzulgM!CtCs39LTWc88>f3)&lq0gc8G*t^ z({6;|k{dEyauH(yjR-@n_Flrh8Td~cF>m5a6`LE${dYOs8#>tpeF2z1iwt%+2mA}U zyz%+Zr?ox@m%v8DHdUCGjNQ>fD=IB24}r2WbR##{QUOyRYq?etjCe{aBK0Nq*R!YW zqVDY91=D#_`RbEbPnxuPS}lIk&fDaMnA9`kZ>>IA@)u)Y7`zlV@K9RjFsXt!fv~_$ zpuK;uN=SzX2CNF{wjSK}8=CgAOC2DXYj1B*GQShtdFz?Z%(oKFH)cV5kk? z3_T7{25rC}0v`<|B<1j)5FweVSgQ;mW$yZ+!|G{K-iko=I*!Nk-)`o7LNoT4%aYg&|tkd&}42XxUI*_o1~ z#;PkEFZ1{5gkuP{t{bt>`Q$;oY=B+NC&HbJv;mQ7wf0~{&neaJ9Z!)IM{mhp6#b1 z*|W(VL(r$#Mm=!nklU%^JL&B~kY9~0QEbP>XZr2XyHUX@pK67n57<_#@)sWV{G{`25dSbg84Ogv6Fb@}F zTvFgofGkby$N{&}#}wdMA`FTN`Y+}}C1c8<#3r4=gYZBil127U9W-q4u!KWD6=8Mk zEKh9O$vVvIk=(=+8Q}aFxS=O7zt0ik@}B=)@g5{TdCx9CLeGKs4k>dLc48c^3lA^z zJvolnJX2)GaNlbV_7{~5g9|V<#bf+l z?0ffl<|H(r-*3LgvBTbn%96~A%yJ!Yf$NVtrMMzkLU$R{a8qDs88*T~$>imx@US(k z#ENp?6ZJK_$Tr_RKmCL8NK@M|eK2TyCY*#7#i~5d{P;8^vHvsQ=aiwiPID9%ej905 z0~HqjX@~cUq1p z8I7UaR?;rANxKMb$+x1maKZw7cSKtW-NCqaD%K4+ePOVuhVK%qJM1}ut;@~n63tNN zX=!OWY1zdvz_FKq1a{nE>ns&HG-nAm=eU*=+$rwN#ac}pYAKAh1jC-ggO6|@t!r1n zgy!DNI^1izjGFBi^KLjM-tY>z@5*&$*?dE zZyz!~*}l*3y9ur_11gRnAT13iWzy3?MS_UX;Y3*27KafLe?W`AL-${k3fLHj(vfAb zI}hhh1ER$3Nn%nCCnm$)@p2eFN#!@NQ~dAtTNsDZ zRA5eS=}h#^QKWuSfAbI}Fpyl| z@A}jL{VL)m=<5(>TRPTvv6iL;#q@Ea2mJ$k5GpLeO+0lpfTND+KOQ=uEp!-RFnze3 zJ#0W1(jrRs-Ir^oFV{?8u9?1EGs(Jlm;L^0T=U+w4Y(fC`VCsTe{JoqF5E@+p{t9d ztf~jDEU>pQxwz?DQ76_mT2O0E(bwjLmT?2t)5mJ`m@Dc2hPjeXHr%(0?r&Fa?=RPO zIu-Ke+U_q{+d+>e)?}C?d5D$3KBF@XhN0JY6CI9ngu#x5CtwcN$H_D3JlZfY4&a_o zr7^9=ih-k=OBo?NdGJLYJK%AqjK}2BgkuFd{O{6XbvV7S;|vW+Ol7bCSOn+iGi;GR zA|F%_B$~&c?JVa- z*mi!x3*~wv5{ugYyG}$kKtMiTqJW-=qujeIKL*}@xhpS@AR}R7YjJG(WUQ2^_ zF&~N{IpM#C&o$wGwghd7XIgzRZ5aQ=h9ZR<|-$ETcDSFKZgST?`ig4&mvE^_F5TxZ#3GX9jJ)--P^av zYJhqq7#+ZQn94>5G_?a<(n#NtScE_Kl zxipHWKJD9Y_n&&kVc*`Lp!tihcj-fntrzs|O48@)rw?O}Zs-0formIHFg(Z(tTq=~ zLIJ?OOq?=RgS z#D2kjFUDESVrXjv4$R=A8ZheE2b#EtzvMYMyyyP%*rIdnXV)a!cK3UMibQ|mtS|OZ z;whF`FbuNXsWdmm`mna+{#h(R%^a-b7|!7iJ)@qpro61QgvK{FPtwbbhhYStrFGErTBB=3sm@HZ|h8V%@K<9G+`e#B)+o>~G`W$Q{1& zRqVxkf7k5jLl*}E7e5r8y$jKxmBR~qYwPQ4dkcoG>fJT_;@-Mww66E!+2Ael`o-R6 z>~{*n{=t3@c)katD-awCP=4L)$MX@fmOg`@cti+&aebI&8o-^lNai)J#ywL8QHf^%+#TR`C-?X>BvMa7X zIV!s(_)GD1shQd`IUDh*VmzJ9!zVT(SQVV>9|Vo#or811VDu2f{c}ES-39llQ%~;t%84f&KdvcSS2MP% zV${g|l3@sV_CIShgA4Bg8^;Ew-N!l@0 zz}bq#<3~NOB@*$Q5{dT)rFFTFBei=5JdRY)ChbZamNOD=!AbYX(4ixdGBY(Kj?mTPjxPi z&kOz%D>xo!M_K*DCmbN>n)gHX_?wyG;4k}rNfa>e1X{?GsQv)na8conUAwdoVM{Eg zJz>V;j0oMs%I9xzkKvh{ZeHIf%CRoUU|tu&b-Z>$;#2jgPUN#LzEwZ!NwmYmJS>;I zw%a#3@f+w+nsuVQXkeQ8Q_NS{M&jDOPu1ztuR6h>thXBPv3w`$a6efN??m2zOZ#lE zuMZM^!u!xYO*T#5PfT_4chaT4ea1xmzjOOQ_e;9jfBz;;D7smeeUcnA-518h*KN9W zE!%MWnB@<7qfYnUS?|C%+i>3zezI=TN*WG-Bfna-x$USN%i_&`clqkDc9AbS{)^fd zA12y7qJ7c9dr911V$9vKNamAH{DncEG1D;9VDR?yEXya~$vQMnyvG53CVpLKx=5>>OEnJ9Cn z@GMbvwx~KsR9)gM!LQdkX~4y*=O)#2v+x$-65*|?`8MHFQF6P|%kbAHOU)fBbEj%p zE?gm8DO@F7EnFk2)(Y1N?-JfEs_s!e_X;Uw zD)Y2z=n-xaZWV45ZWlhI)}Iyb5I!e-Ui7@6dUh)PqUztRtM&lPOey}lIsR%P{@yPB za+tFnSfO;Kuu3>u`D2t0g7a12MCW8+t7vP(->NS&?f4tgWu`;vPGOgDlJZYhda`Jn z68|Ggo}!$o!fDQ4^h~8sQ~Gq#c7|x1g}>oiW@bCL0?!nlCECswZRd!# zOPn9!*K6??=E}?h(Ya7~op6!xdf^SuDJXNJ(u>s_H>o#n7TzLUBD_`f-zHq@EXP&1 zE4>VVH@*z~$uYW9H7pmd5Uv!i60R1mQQxi=t`puRyj%3&qk8UD&V8b4z0-i2?^k+* zaHDb_z~2}yGY=|flltl*_0?wK!@@^|kBZL6gpWHnobY*3{(|b+sWkqkA8OvM``v?U%fZRJf#uG(fTM*GVZE?XWtyFz ze|Nkb9Kte-MeQ=D1?fALUM^fATq#^7 zTrFH9O4bV33GWi#ElTbMSC^anRP%b_{lX2xjlu`i`h!Yu(mg(@)}L0oN4Q0}Rk%&K zUHFXJdRDkY_?+;0wZ2ohTXgP0`3j8D0$@4Du>xa63_GU-tDPobL^<`sM(1JVG&#os z$2kjuG2wXBR)O&f11CBs0$WvQyRMofoUA&hsLtuinJGM7b)KO*XREd|g=eYGvsLFg zs`C>39rp^1-TlA?svm!?8R_eUi-gw;ZxG%nT&z}ZRqMA2mkMteF2i3QufUk{u9pi} z2v-VM30Dj67A5zo&h^6kg&Tw$g%1cH6mHU0kE)f&gpUiK5I(7PpH`V3;TGXm;WpuR z;qz*Dr|?BxyIc8tfRz}#UjfUV%YmbXwV0cg7&Ye93pvXwA=`fr90!e1iBTht$KPSD z#HjrcI1zsxyb`0v+S(ykD>2K6(^T7ZrDqB`*D4L?S|y}0>p4?+mTEg&wVk8dE^%(b zuh%+P02ip{g~IEEi-gw;Z@^!muf$wq>x)J6Qs=iwFLN#g-l?4B!WF`m!d1f6Le98K z!x>j;IO8e}XI!PZTlCxup0C7=WBu!e_X{@&HwqsR4G${4Nq73VXn0aIJguA_;TGXm z;WpuRA?IDC;k>IfoOhLm^RCi7FB*0VcZ=FRC|_ktAT6sfg69J(l&%z32}dh` zjMCNdjVLo#=^A0JvlTgYN=H;Os&u{54N5m+Jz0g(XDb~2Dvf>>M*k(GIr>!?{htC` zMNgYbwyTB?r8|XP!b!?MS?MY9Ww`1TrKbv~iJnuHp01KJl%A>dX-c0idS)q2{;3lG zRGG6x5BaCcoFjTJfyG-T{;4txMBBpnC&;-@=|#fpm2-nL0r@v7XR+G4N%h|>yhXS~ zxYYRtN-l%;tb*=lpWLbP%Y`e1D}}3stA%S+a;_tIFJ?^u5k?NZ%(K){Cn9 zmEIuSsGJ8x=Yz`Gq?#YnwVQ&f z6Osd~%nM4B538V~$!~jrqaj1y2bMXn0n42?fE7wt3af;pl|M#lu4_hv4_UrOSnIrr zbe+->m5eG~uXKabjnK%W!H2tn&f6Fx86UQj(dmENuLdw^rWSMLJLFfL=jQN&7Nm2ix(S~yl%Bc%Qs172eJsIWoU zBy7g0je#6{9~cwTN*n_&`UKdj7TcUpk?s(73cG|S3#X`_QeKiK!jb(09oi___5iSuf zQ$2Smy+$pr6|NKBC8YH@2GWK-Lrxe2jmA3H3-1?h5N;Gc;QS81KB)9Vx}(j)hlP&_ zpVUY_rSvmuKT z(mP@4ov^Hqu=Gw?R!3M?M_5)zSXKxA;*)Bl)e(jlf=H_)EUP0dt0OF}5r)?I0QuA! zVT{NtKw2GPX^pU~jxfgMSID8&5jM0s!iH8y*wE?-%jyWr>IfTJ9bs7=VObqv*o3@0 zS{-3St0Qb^b%YJAjIh?QGKW@2*wE?-8(JM=(O z#A)E+YR%AU&CqJY8Cq@5P`k6#?rgPqrtoaFdyd+@793IyPGIW`!9~^J1f~}WuUF0u zm<83~1m@qQJGxnTi*SkXR?&8wa4BYAHT(eVrDf0^)vzVlCu>B>TH!k3UBbIX&pj%0 zFJwqHxPoo1SL^pHy+OE9IS+`Q2bIH_TWvUVs|{yvwc*UIHjk?H$ApiIo+p%kQuJ^} zSA#b=BF_qU2%i%^FM2qmtHB{0qZe`QSn$R>z%u7;V7W6DSfO;Kuu3>u`D2t0qusIK zlWoAU%Bd039vBNgVLcI*k1AcSbc523SdWjzT5>zE8G3mvIOknpOgKShCW7C_f^$e! zn{wJ!Lx<9x!Y<(?<)5tdWKlImRGp%nsX|%^W5GqFYP!nLPx6d+?^X@>2=CRM-Y2To z3-1?h5N;IG3o#bbiIi_r%@66?&BBL;j|d+XosS707v)bV{iG;=N@bo_4L!mw!mYw> z!tKImMCY@@9m3~?&#Q(Pggb>Vs{Y-&Y7ekRTB$~MYz?^gTgaguTLY_uNISMhKByW) zJGMp^Y>h0~8tAWAkV6Z$1{}+4X~EV&moZHXw#GEUZm$8aJ^~yE&vp%XmB^J;4Se#y z1x|##t&v8n0mt&HcGW;@wgwW9NNctRnvONonyrx?TO&KR2C|Nn(2lJEm$D4)*c#|T zrfJ94K<@d0vz+z7*`nc0A=gkf=IpowJV%sV;@pMwwefEPxdyM1Hms30tdTaXkv6P> zHsr5dgV)I4RRc-LwrJVb7+SV9hL&v&xG^0_%eDsGNUG=!tAUmz(i>I-ElH#|tOin% zJ+@Z3PI#B_ZuJ-~+Zx$3HPV$e(v>yRl{M0pHPV$e(3PZ(y0Qk`$eL;2)<8BAY2VgB zHWHr{g|u&LphH=*N4Q0}Rk%&KUHFW8@>$^y;d8?0)swVuYs^li={Ku^CjFMF1;2d= zEOY(|SRt$wRtd)lt06aP!D%d0Bdi5K*MifS6BRZH8xakzg*;^WX6Jtc$3f22g2#vx zoSy+()nXfDcrA1&u~XP3JXttJHJqaKRN*w|A5rpDrDq6F6P^zFUkhGhi?f{ffV0)s znZmQx;qS_^LB{jSk{tre~l-X*+SZQY|X z_rhme3r=9)t{2`f+#uX2d{Fq1?qaj>Vc{dfC!zOivASXZJfr)1R=7j>obY+I_=3vp zM7j>6`7V&Fl{$%E(rny?FgRCHOwNi(1{0)$+ zl{$XKD|L_qY?rH*I>-ScS1Wap14OP?>L3T0=4z!5 z5`f6nN*yEsk*k$Dj49Jxt<+(56S-QcgAGjNYNbxAl{(GtI*cjnR|V>UD`HvTCGGd zvI}scnEvgE{M!-vw!g1>f-$-u zNdI;OV??BXJAyGH(!U+S7!m2;jzCtk75cX$hW_mcRxw2Sw<8#-T|oM`Bl2%YAf=h6 ze>(yxO{9N2g7G3H^lwKnMnw9zBN!th{o4_Y5t07w2qZACqJKML=--ZDEDiG?7D!Aghnxf+kuRPMlm;u zjD$uprp#v~G>VbE9mq&%6!VlhjD$upPu~JE5*o#bvpgfAQH(p&jD$up`ab|N5*o$K z?FBLt8U+s!83~Po2fhkqBs2;hAZ?6FrSgoC^&?)F%lZZ zjAqVMAtRwt%xLB?5*o$4W}1=EC}ua)jD$wPMdtw-35|l6ZUr(D8U-(rHbz3D;3d+= zNN5zi^g|#cp;7P>k&)0Sc!|hJXcWA33XqY|D0qpz!ANKnv!2LEXcV)a$Vg}uJVsI8$?DzqmUa!Mna?DQX(UvQAI+d z;L^27GZGpFud)V4LZjeSA|s(u@G6m!&?saMd!CWdC}a+ik392%z{97_y4n}F5MJ-~=^>V=J1k=26_n}Fjm*XqH6#PQ0X;GBT; zMCUmmS4Q>VJ=Qi!I9YX0QJvG3GgElFu02C_&Q@(_3eQsh*{bs#)p-ddXFWJ)1CZ;Q zdTzaCS4w37cdTzaCS4r#bmt=}eG>O6>?+m)sist0ed%yQuh;Y#5u;cDUC zqJ*oGdW<`ftCD(*JCUoBdW<`ftCD(*JL`N@tvn`tTM&V+$a;sXuO}JEeyKouS(G3_o-t}_f3gJrOD&cD3-J;|^ z)wy1Hzi@+aqwoRYgThU^>QS}wnDBAo6T&Ce?$avMBitg~D%>XAE_`0??i9YLYj-Pu z53mtq_ZYC;c?dXK7oB%1>h#B`ZuvN9S ztNbM4WYtEWRU@P~Ynv%NU9~a7)hJ(OBcwEIqpz|NQku10;yeSq*0~LlJ*~f z_o?Rf!uy3Agd2qqsPzYx-lS_ERa=hpdr9HR{|HPuNFE(kiJgoMZ)WqbAxjd@^4hmVztF}eUsMpOh zaJ{IyU+E3PjmmjIbUvt@O{$rz`zEdKo3y%b((1km8k}@KDLT2vZ-Rs;ojt-W!mYw> z!tKImRPtHj4&ie`@?jHnH|rrcHbHB%wmraR@ZpOLAid?yur`VGmN!E?>;^VNvou56{5_D~@@DYc%RqX|o562vmutgj ztqq&CHf+|~uvu%vW_in-vEpF6Tp>1Vh1e`_d9zlC%~~NgYlYYh4Z?P3sa<-@o55W~ zddr)^S8SKw@@8-pTc@|Y863qlz2(i&`^=%YycrzD9D2)}!AnGX%bUSVM0(4cVJi}s zqHmiaotUP#ycyiZGW3==!ww{_6VhAW3_FnY&|BUN&Uqh5Z+SB~hpp3F-VA$yNN;&F z>;ck4Z+Wv;j?G#*Hf!bBtd(Q4yyeZX07=8+qKDq{W^fVd;fk_Z-tuO7%bQ`{krH~# zn_=CN9>W2grk)|M(Hs6e;g#$uYhBfQzNVe z4dcKktS6%KQKjpZZcw_>c?!RhbH;&lSaLk#MB~6S`+yU1N8`XVq^C{4w(Hssr8|XP z!b!?MS?S5DZHnkQMLAQ2(?rjyN>5k$8A{Jo`ZT3a7d_;tao{M@bC&2iTlAbGdM<&M z9|w-w0$d>47CPW~a1`lWB)ncZH#oDAbE9$=tCgEn=gq=fgiD0Cs>R!cOGW4HN^`gH zIPeuIxl=VP7p@Sl6s{7k7OqjrwZe76yM%X({(F?Z*Lf1P-6yKni_ZI%-XPqloCiet zgUZ>Ynjg}&n}rVx9}zw(Iv*20F3O)!n)`~!fdfhT)2g9IxJ9^CxJ|fSNRQSya4C@< zt#RN|;`5^X1*LZ?{i5pMt*iC`W8&DDI5sAZjfrDpkZJGXS8{9&T9qZqu`x)t-9U0| zOdK17WMe)#HYSdZiDP4sZ_Fph#vtXGCdbCau`zLMOdJ~%$Hv65F>!2692t3D1S$Hv65F~~qjXK`#y92EekZE#kOdJ~%$Ht&%7a)fm8^fxZNREwR)l4ME#vm<;c5HR!<9nE%W+FK@hE+3>92*nI#>BBPacoQ+8-rZsujJSm8^g>a>Cm2kCilkiEEe_H7t;TGXm;WpuR;cnp`-~{aVI{++0 z+-(BxYa*~h=}KXhaJ2HrC>@4xVFG5~%fPY9sS(z~Up)b{kM%@UKB{!R(hW*C;{3$~ z^bBigR?bAMh9+Q-A8BY)PP@u?DBUUS5>8V7$x2UF4O2wJDax5DoF*DhReHM0&ro`% z(x)kXx@b5nsB<5IqZFYfZquKGL>Gc)fCNfWK=3_VqD;v1-0a z_1rAHMYu$Gt6I5DxKwz%aG6t$Ywu8*J5|GS;R@kO;VR*3;Tn}(D_keMOL&j)UgsOA z?LN`7UKHN1^akNZ#zgVY zMDWjtNOK)D5fYo%wyVq};bdJqUFn%Z`YR?v(!LIyrE3{|m|QEEHZR zTqL|+cmrZ&6Cqt$X0htLRju46TnejfBBUs3UIvfNM9f@LzFfFMxKg-ExLUYIl&lr5 z6W%4f7qN_qkeO_2z3_hF2H{5G1ES|ar8lXzN7edc!pB9=6G}fRdY)F99^n?@R^c|` zcHuK>{aN7-;d8K%P5m1&=KO^4wV~IEVG{ z+*vF1GLh%bTA`PTJa^U#y-eh}vsQ2v)6~nYkQgk(b7!sKDludG4$o9Kw2d?yMag(h20bvvzO@>*Tq! zc5n!h=g!)}Aw=#LYX^rgO@CcGBvK2IzPNVz;@TmLn5HkT9kPf>UtBw65h>v*n0Ck_ zB2U4zV~s#cc)jT!mYw> z!tFxtL~X}-5qAiA{-qsuK3m@@q;IVq(k5g&Fh&c2jLUamjEG^xe>x!t2gZ)bxO@j@ zFWL&-jqef(0z5}C1 zWL&-jqek4MyJK9w19OnbxO@lZAdwNV4vZ%Ip+~qyxK+4KxLwG&dA4p?--)qf{XBQpiLoPc2Y4sOj>sM0oftc&H>pnU0Pn;|k%p(0(<9s> z+$!8A+%Dw2>(spK)V%A2#%B&a+npFeB6omyV(czAT{?G$^W})ecVPt22lCum7qmQ) z=gzt?rp)KLvo7fOWk8-g>w7r2Yab7x)PE+V|Ev1Xn->w*~IRe8_yRZYF76GfC^3Nm|!T0v~>ge6DLIfe%@d>zYZBKTLC7^ZzmS=FySm<(Xy_ zVD^12vy_X1+NjlKmU02p#se6XT2fM`mMEo-ZEUa$iZ)()THT68yOhdQEE9?dl@yEC zkW!h7WkL}lg@zup*n{cDE*q>c1=v1jHRI`n=k)RTc&g@oA8=3q;W;z*;pK8O;>J}x z&-aVFefM^06zV7+)-Q6G-20x=eP>;A@2`~ZJL{5r-%@^%clo-?F1hFQb(LLm&r9>w zm0j$`bjdwW`|8Rrx%We*udeKpdw!*_vFwt2p7xcNU2@Os;J&ji`Q~+S-&vP@^E$Zi ztV_QAk4pEQb!ohEy6>z@AtfrdF6E9S(m)>a@=>;C9k}+ zj`EzmdP;e_*5{mza^6MWP2NNLO3rg~$^ZHQ>9cj`nl0W$rh)tLU^bAXwCFjU_@`^^h zbF#(DU*T^|lNmBgdh79=Oz>-L!a14XW%^3ab27o{D>=`}1gEd$JSQJKz0JFJ$X&8T z`by4o8ezOlU&(n+l%2kk^PDIHiSJ$AFz(alyzH(MRuY;|ks? z-E4Jq^Sjf{?@l*c9o_uybhFjb%~nS@TOHl1@yE4%Z*_FD)zQsXN4F~XGn(Tq{BC|V zy7|@UW~-x{UyW|II=b2F=;l|Wo2`y+wmQ1m>gZ;xqnoXcZniqQ+3M(KtD~E(j&8O( zy4mXJW~-x{t&VQCI=b2F=w_>gZ;xqnqD_ZniqQ+3M(KtD~E(j&8O( zy4mXJW~-x{t&VQCI=VIT|E>N;Z*_FD)zPim^mpQ|j&6hxD2B9?qoqs5bq|2S{&Q_NX>J z=V!=wkUk&UBi7$i`b>I{SUY_ty+@S4p!Ava9@VDb>z>dajqOhNo%Lu`cXso+K9k;~ z3iTXcYuzIszOD4N);+3Fr~A%&wAbLz^_lb@S>aFgne-m{;Lr7$^d6b;O{LGI_sE3L zD19cqM{~lqssNWd?vj| zJ~(|Qy+=MceI~s}mFw56kv@~&BP;yrK9k-fE1W))-Xkl#K0cG)qssNWd<}Mw#&D{~lql)%x+;`R^H=I6`-Xk}hK9k;~iuP-KCcQ^{7GDbV z%8jon-FMcj>h4pz@2pqjw$puQy{dQ5ci&mB_7nd^>AtgGdEzzO!EW z<8~p@2poAd5-(edS#K<%6(_O8e9B&_nq}>gz>cd&U!V@d|Bzf zvtD`SwQ}ECue@@)@2po|d9B=c)+@VyP3h}1du5l?*Jt+1E~l^0?3G>LQTqDKUX3&U zEcc!D$}y+=&U&@Y;B?iU2ao<_5#wDlw&U!U2Io)^Gt8vNc zzO!C==ycy%uRL_R@2poII^B2HtI^48y?d8_nr01Mz5#)&U$5|*W7()y|U43?!L2Ljb>hg`_6hbnmOHf)~nIX>AtgG8SC|Q z-&wDWb-M4YSH^k??mO$1u}=4$^=f4EyWDry$FEYK?EMo>-|@^VmA+Q3Pxd<9ch)C+ zJ^vo2eU+N})kyc9^~qSzd5G8eDz!ct>(~1#wLZD}6Uv8mWnEw3XP^F>@)6Q|Qhhom z|BTXoXMOyl^~qSj>x0ke?6{2ewENEbWURA``RADS^=bMGNcWxf$x_c5;5EKJtxuME zIlexvPkwq$+;`R|KcB4(lHP~vqwlOwmU>Md)82QV`p&#=-UsjF*RYRY!#;iu`}j5N zlcoMw?}PWrQvcPyKCMrdI_F6Do%PAamn*L_z050PWSmTpNis#Qu%2l$LuScU*2-6= z^~px3_t5+Jt?c8svX9@&K7K3vWaIy(fAt=EpKSEE;VaYnWTSJJbl+K@tn(WBnzTMy z=U0}=3Rxvz{);W(^Ltm5DN8eeWeDgQc(Ywyex4%)|t`YUTOmp5v z-c8;^y6^0~#zz0^1LTA10y{6$Jm+V~caZPY_SJbg=GQ;0t;+Kn55KK+-`RPMhhJ2_ zU*?~eS6@^5T+ewK<@C9p^BVn}?mIiLanI8}zjI#WUPtNkJLfgxIekv&yv90zqWjLy z%cbuq-FJ3gE;-$Ic3$J#7nJThJ1=vb?mIg#bDZuwJ1=LPGyD~^Z>3)}o!(pN*SO*I-b%lI z>HbXVy_J5^bb4>4Uo<`Ky_J5A6;AK1^o!%)E4{bUFOE*{t@LY@_>R(hEB&JB`QBUU z7fq-4R{BNL>AjVH_E!2u({sEn)GwNz_TEarXga;O(l3tRQ+jWuUmTs@Tj|$m;7|14 zO226ObG^6HFPcv8t@Mkg(|arZV(Mw{t@LXIaC&d0U%yjM@2&KUsi(cS(l4e?@2&KU zsndHa{p_vui|MyC?Y)(LF?D)xrC&^)-dpKcb^CL@x6&`NUb6RA`bF01y_J5E{Zpm) zR{BNOf2sFY`c<<|@2&K+x6;qvO25c{HZUNv6G|W79?@$CUo3n_hkdqDdvzo+!^?E$fSpVG&-2Q;=nsr2#f0gi7Eh?ke?(>rjKtAh>O$5w+BSW%k=T>0gct)Q2O}xfEaoCKE6F5Mou5!9uOm^k8cl%k#m|g z_wnrkj&BcW%fZt=zC9pP|554V+XLEWaQgW6fVLT&KE6GmZ3d^0Zx4u(m+9l%17hU# z@$CUIa{Bo8fEYP_e0xB@`~DOk-yYEKzSGCI2Sm!B>*L!48hf2SzCEB{e5a3Z59k-) z>Eqi2BIWe)?E#IkULPOd)}2Rn1Z+@M`EBJL+BP0kZF<^gLI+iwPM--KRE2ulXF>-# z6FR6m^&Iz|4XRH6Qt30HgCg$N`%LJdxO>`XLI*|vKPY`BbWoM+IX)ArYph702_2LJ zA5r>DsLlqnZaxz_C=rN(`P~l<&vkT`9z-y9aPmjeI|5JRqynf&_Oxo^qJ5>Ip%4f2_4jE z;Me#}=%7q<`b_AcOmq57=%7q<`b_AcMhvIVgbr%NaQaN>phgT&`%LJdZ1h_BOz5C& zbh__sP&PV!CUj6XdU}f``%LJd#to;>gbr%laQaN>pe%LzOz5C2^|a4~4r)B{YkVej zP_8JWZ;C-ePAtfIGRHYhy6^0Q3~^q5rlEA-*#$AtfI;_g>^ zujGQbJH1zOLEN40JG&t6&Mp2r_nlo3U#I)dE{LzEJqleAS${uevO-qL8d)dZcXmPS zobEfjAa-7UNB??J?21bFom~_=r~A$>irs+HePug-`Pd6YbhsKXZM|56g#hfgmmB8MX_^EF~@yp7ggQik;JaXBWlJ>Atgzs!e~2`_3+k zozs117sbw>>%Oy#V&`<<*+o^Q(|uik;`X?`%ly_Lc5C8xlLG z`_6{M?vqOQoehbd(|u<{qV`p#&yWs@+BcLwM>ZsChf4RI4T+jx@4mAkQS;J#%u2sq z%yHk@kf?cSKEpL6UQYL&4T+bR=DxEb@j6nv?`%lCykz&C4T+c2eP=_eHK+T|hQ!O$ z?mHV2FMqE4&W6P6GfMZJ4T)Dy>Atfe@p8KFY)HJE?mHV2FQ?C54QZr3Q@ZbLNYtF} zI~x);r~A%^M9rV>zOx}w^LyQQHY93J_ni%iny1}&HY93(jr-1qM9t~GvmsG)y6UFf3~CQhHy0SnPD=8T<0X?8^_cFF!1rp6`A6Vg2HNU+F#i zVfN^U^^1R|Y46bwi?UzoJ^Ep>_O$othebTBbl=%9+=t;lEbhOrIp#hr?q65FUwvD{ z?9mU4zL(%V`eF9yhuNbamJgoqJ^Eq&%70bq{rX|{>xcC#|2a*2zkXPr_?6zTA6AWf z+WYmxa>nc9zO!M>8OEGpnd9}bIm0sNJ4*MR4a=NQD<}A_+;=uCbNszUNcWu$%bcHA zPBCYi&+>l#F#Gkx?AH(L_uX@RZgg1wyhQ1}`(at+b&HX4GC?NE6zRURVf~sr-FG&u zUvsDJ8rHA5r`>lpEXVvE=Cq|ZEXO=uAdAd#-`TJn^ZYHA?7jP8_U?z-yC2rCx##%Y z=&(%ldU_v!SiX5Z%VdSDk~OkUy6`_h zeYAW;20DGTd_)F1eYAW;QYpjot zmXF9HuaA$Gk7(=8pYEgOBQnJ4qvazq6(?X?O9AYNYy#@_y#Hi)U1x{JGM7XQLXa{CaosjB2Fvw7YmlHB#MB z+MH3D<2mj-8s^P9KRHm3vMfi5iuAPIvK)$~{lJi)U2s z-K@+#{ZGm~(*?4~oQ-GRt@)eG+2Z?g7tg2+bh?XYR0cZT#WN}co$lfp)i0)}eO>XW z4D@RbSwfktkX5oq)=78qjLK4HlXTzNs4VrGyNhR3mU`Mu|bRtVr&p&gBTmc*dWFRF*b;? zL5vMzY!G9E`c?HB+Snk*1~E2>u|bRtVr&p&gBTmc*dWFRF*b;?L5vMzY!G9E7#qac zAjSqUHi)r7j16LJ5MzTF8^qWk#s)Dqs4?*6T0u|bRtVr&p&gBTmc*dWFRF*b;?L5vMzY!G9E7#qacAjSqUHi)r7j16LJP^0C| zS}PkH)M)u`rHu{hch=vzjSXUK5MzTF8^qWk#s)Dqh_OM84PtB%V}ttT^>S=%P+NLV z8ynP?p3}w#F*b;?L5-`PV`GCD8^qWk#s)Dqh_R2#(s1BWIq7uY*`xB!)9yQaRE~XH z>Atf^<#p6|Z1F;$$G;J&jlRh;Lz?`%vJ z=XG%3*_gg(zutXkWBRr|?Y^@yRh-ws{YPV}IL~q4*_gh6UDvDc|B7-#PL8R{-lz;S z9UdWcAvoY0|*V%n%V{*((aNpUO>dWcAvoY0|(|u=S zsxQCNeP?5;FQ@y?##C8O_nnQYrtF6M&Ms-2_M6H(boA_!d~>?*?2=sa^xH`v$GC() zm*mgiXxis2E@{N}d;R>EOY+3&zOzemz|(#T%q4O6d(Hilxcj}{XSpQqQ%ZBcq%BM@ z$9-p)w1w$(-`ORNu1@!zUD6h&r>9vT_nlo5U#I)dE{U(F-FJ3LWWDAwGEOGQB$*=J zcXml+o$fokB(hHTon6wH>CbZC*(HscPWPQ%(iW!EeP@?6W_sFBfw?4h{&e@9T@pL5 zkNeIpiQT_a`spy2M9t}^!(0+Ir=JdUNz|O~JG&%mPWPQ%5;dp$&Mt|U{~|vZ<}vYF zP~M@V2ak!D^Ijb>cueDAzw#mGyq$dKGdr5|u4i;d8|_(KS3W|%TjTI!`sGz;wK!_a zOdP$;5Av=qvYTc0u*?DGTp)*7<}k|~Wobe3QIZOnm)U$H+LDAd_T@TxCtxS!RyRlLfL!ZjhVg z7Vp~QQ}#*Uk?b*X^ygmZa}RkM)ByL85XTs7-CKl@Bs`3U)LoplKg2EIpB5kbv5HM!OQV=HRJj%aQeEM zan-oz`?{KORl3)$hjsIHHRJj%aQeEMas3u}dVtsax|(r~27a%vs~Ojr;B^~j-A0%* z%31}Ej#Y8Y}dCJB<~dKg}ol>Y8!= zMmT+S&A5IeoC~b~BI)xN<8sV@(UoWZjnY@wjLS5ybBv6W2{K8h$Q53hCNpG~TxI=z zbnqOzleRa*a#vHGCnXHgivPRa)BVO4cn`DbTX3c$d&A7J2Y{)6gKjU2;<%Asm zn$q2`de#%ucaiRXosh$x@9V=S~*^Pbwc)f+TE`c+LH0KyI&_{uczJpIw5;srgZnK_Na8_&qN?d zy8CrP`w?C%cfU^Pmu_A;&gkdsb#zfNeo)amZm32m1;-TgYDUpJ?_UnlhI=3Hg1-2FNsC!OwoozOOkr+w|j zgiLe#+KCC7=1+I`>x6#Sygu%Josel>A74{3A=A7BcfU^P*Ujnf*9rZ)Io!=4p4oPU!c}?{fER2-8BCrYD=}l_8CmPMa3Ov=F9+ zFfD{>AxsNlS_soZn5H|tvP_#6!nBY^OHbRhkW71?(x!zpT7FvT=X-{AxsNt^z+|q(?XaQ!n6>k zg)l9IX(3DtVOj{&LYNl9v=F9+FfD{>AxsO=XC2aZvOnFXg)l9IX(3DtVOj{&LYNl9 zv=F9+FfD{>AxsNlS_soZm=?mc5T=DNEre+yObcOJ2-8CJS%)w!M4xpC(?XaQ!n81^ zg)uFRX<VN45SS{T#9m=?ygFs6kuEsSYlObcsY%7RIzNriC#rjA>y^ z3uBt@p(3WbD~U`CV_F!~!k8Auw6K1Wy-bg3VN45SS{T#9m=?ygFs6kuEsSYlObaun zg)uFRX<y^3u9Us)54e* z#<5lo9_3^J~M8BT?#{BCU z!L$gbMKLXkX;DmzVp!Nv?!)UF)fN|QA~?6rbRI=ifK_yi(*<7({!IyeQuQP zv?ya*l!Nv?!+OEIMoD?X)OkT9oayDBEdK#!Nv?!)UF)fN|QA~?sS`^cwm=?vfC}UcbF)hlN7G+F}vYi%X zOpCIe7R9tErbRJL&!bkgPGZ`mO!M?zlQPZoZQ7(vd!O=Qo%x;An5MJZ8q=Kb(G`P}IHr4n@OtkHOv*98 z_e11|N$(3x$}!LHW_`RbFe%48r;j|(`t&pHEi_$K$F%naCgqr4X~!ltnt6RjSf9~n zZr5~>9AkYvj!k0Mr0nv)dK{aSU7kNn&XM!v0_(F#`mENZ?D99}y?{yC<#%~6U=q6~ zv1<~$Cb4T0yC!9qzn?UjA+zKvYxM-n@wV9{c1_AIFL{UDB}?QUpT1A}T-BuP^7?o$ zU{ZGZUET|r#I8x~n#8V2?3%=`N!jJ~X^>5_MIN(0CoHGU^eM~tUce-FP3g$VR{~SA z>v5&;Y%ry9=}F~7O#99TQ*z@o%7=ASc}iA%Rq5+?rZoP1Q|aqBbf+tw3z*We4lm75 z)Sc33<8+VVltvOy``LC=BI~8O$8d_PFQ&xQOY@x#rZjGNX}+_;l*rC0eP@Fy9i8x! zeP@Fy9i4Fc&IVIDlIirF4W@K-!qdL9!IVaizg7Cq22*0{Ili;Ol$bhwXM-s*b^6W* zQ)24%@x4T*G-5b?FOeyY7+xPAXPDA)1~1=tHki_J2B+_AFr}lHPT$#JO2-*I?PuFf zX~g(jrF#sg#L;v7Y`ZCObo$wLQ{w3Kv+btD(Vyr$icD#gaQe;$QyL|_4!&w)N+W~U z*3Y(^7P~X0pZzo~c1}ObX$PzU#}h zcsbpxH7#DA_S43vMe662e!kMQNICs{rD>6J`uR%JBIPuxX-G{&Y8q10BIUoxcYT=_ zDKFV~eVG<1r|kLxuiH3O*`>T8DjnxVdCsIM97 zYlixop}uCQuNmrVhWeVJzGmPx1FsqCYlixop}uCQuNmrVhWeVJzGkSe8R~0>`kJA> zW~i?j>T8DjnxVdCsIM97Ylixop}uCQuNmrVhWeVJzGk2{1GO2b%|LC2`kJA>W~i?j z>T8DjnxVdCsIM97Ylixop}uCQuNmrVhWeVJzGkSe8R~0>`kJA>W?(l1yBXNcz;1^6 znxVdCsIM97YZi91u$zV5EbL}sHw(L2*v-Oj7Iw3+n}yvh>}Fv%3%gm^&BAULcC)aX zh21RdW??rAyII)H!fqCJv#`?}Fv% z3%gm^&BAULcC)aXh21RdW??rAyII)H!fqCJv#^_m-7M^8VK)oAS=i0OZWea4u$zV5 zEbL}sHw(L2*v-Oj7Iw3+n}yvh>}Fv%3%gm^&BAUDc5|?sgWVkL=3qAmyE)j+!EO$A zbFiC(-5l)ZU^fT5IoQp?ZVq;Hu$zP39PH*`HwU{p*v-Li4t8^}n}gjP?B-xM2fI1g z&B1OCc5|@PZ=ilt=3qAmyE)j+!EO$AbFiC(-5l)ZU^fT5IoQp?ZVq;Hu$zP39PH*` zHwU{p*v-Li4t8^}n}gjP?B-xM2fI1g&B1OCc5|?sgWVkL=3qAmyE)j+!EO$AbFiC( z-8}5(VK)!EdDzXvZXR~?u$zb7JnZISHxE1A3s%3C^RUzX5%ulO!)_jS^RSzT-8}5( zVK)!EdDzXvZXR|zyUxuL0_+xGw*b2Z*e$?r0d@=2ozBE+%v^xo0_+y3 zy9L-Sz-|F{3)I~L>=t0R0J{a)Ex>L8b_=jufZYP@7GSpky9L-Sz-|F{3$R;&-2&_u zV7CCf1=uaXZUJ@+uv>uL0_+xGw*b2Z*e$?r0d@=t0R0J{a)Ex>L8b_=ju zfZZbO7GbvtyG7V7!fp|Ei?CaS-6HH3VYdjoMc6IEZV`5iuv>)PBJ37nw+OpM*e$|t z5q68PTZG*r>=t3S2)jktEy8XQc8joEgxw)PBJ37nw+OpM*e$|t5q68PTZG*r>=t3S2)jktEy8XQc8joEgxwVz7e=AcDfE&?3}*NgKCC^> z%VPIUXvUsUx z#4E1!U7jwBm(zE7x-4E!-{tADczI2Hucyo6<p($Sk?anyfwZ1^uh<<8)c1oW76KWs!3FK2DcK%AfALIb9YhFY`K|e#ms0 ztdLc*M%KwAKC3}C$rgFcr?*L8VRBiFbY(X6wM2a_QC~~c*An%$M13t$UrW^267{u2 zed*rqTF)iwYl-?=qP~`>uO;ehiTYZizLu!3CF*O5`dXsCmZ&dXk;l^fyS7AqEm2=f z)YlUAwM2a_QC~~c*An%$M13t$UrW^267{u2eJxR6OVrmA^|eHOEm2=f)YlUAwM2a_ zQC~~c*An%$M13t$UrW^267{u2eJxR6OVrmA^|eHOEm2=f)YlUAwM2a_QC~~c*An%$ zM13t$UrW^267{u2eJxR6OVrmA^|eHOT@gE-Ef%|{lF(w$BB(QeBItB?v+e<}E)3lfT*tMph@hAGLEh!3YF^P1GcVKK%~!4ahik;KXy1l9+s7^oY_NtE6JN>NNtK#VNvu>~IsHxM(!LI74si*y{+p9WK z>hwJauBt-6r}RAsu8ObIM^vtg?01y!=M&vma#hDjo$f2Ss^joZ_mx}~WiQ7aC0BJ^ z)aiQ;T-C96PrIY!s*Z&^eb0fbs$zel?>TT)^qoHTa#h^@iQ~Gy?y89UFZDeKu8O$R z_Z+w?;!Z#7_Ns_`+RwVZs$-;1KkN3Yj=($ptlO(P7V2p~>-MVZ)R`gutlO)i?9Y9I z*Z7ViS4G^*^gRczin!DF9JngtPTzCjs)&2qog-IuEY#`Fk*hk=?({teuIiYlr+v?X ztEx?>?>TT)wdwRRma95i?$`K8%Q98DOjRyZmCID+GF7=uRW4JN%T(nuRk=)6E>o4u zROK>NxlC0qQo4uROK>NxlC0q zQo4uROK>NxlC0qQo4uROK>N8G~I6b}`t+U>Ad340bWt#b6hMT?}?H*u`KM zgIx@EG1$dm7lU04b}`t+U>Ad340bWt#b6hMT?}?H*u`KMgPpDg6T2AfVz7(BE(W_8 z>|(Hs!7c{780=!Oi@`1iyBO?Zu#3Si2D=#SVz7(BE(W_8>|(Hs!7c{780=!Oi@`1i zyBO?Zu#3Si2D=#SVz7(BE(W_8>|(Hs!7c{780=!Oi@`1iyEyFPu#3Yk4!bz);;@Uu zE)Kgm?BcMC!!8cHIPBuEi^DDsyEyFPu#3Yk4!bz);;@UuE)Kgm?BcMC!!8cHIPBuE zi^DDsyEyFPu#3Yk4!bz);;@UuE)F|w!)gSG!!8cHIPBuEi^DDsyEyFPu#3Yk4!bz) z;;@UuE)Kgm?BcMC!!8cHIPBuEi^DDsyEyFPu#3Yk4!bz);;@UuE)Kgm?BcMC!!7~4 z1nd&9OTaDxy9DeKuuH%$0lNh360l3aE&;m)>=Lj`z%Bv11nd&9OTaDxy9DeKuuH%$ z0lNh360l3aE&;m)>=Lj`z%Bv11nd&9OTaDxy9DeKuuH%$0lNh360l3aE&;m)>=Lj` zz%Bv11nd&9OTaDxy9DeKuuH%$0lNh360l3aE&;m)>=Lj`z%Bv11nd&9OTaDxy9DeK zuuH%$0lNh3lCVp{E(yCN?2@oc!Y&EBB{75x!7c^66zo#4 zOTjJ$yA{75x!7c^66zo#4OTjJ$yA{75x!7c^66zo#4OTjJ$yA{75x!7c^6 z6zo#4OTjJ$yA{i6?G_ayQh#xBbT+|iqK{)+f)D`VP zINhJVBATC6`njkp+K+Jh-eoJ=kMOjgi@Kuy2&cP@SF|7TEv5U@S47$A{`3{`{esf{ z=_|V8;=4-kN35_PvBG}D3i}Z&BJR(1fBFi06D#aZtY~lIDb4ZT#0q;8E9_0I$N_(@ z`_orsfhg7195u(*5ZxqW>AC`_orM-|7DJ7194wrTf!Yv^U|u$j?Px z(cXm9&qZC44_-I-r?1F|KT*0reMLU}xzf)?UC~~K*TntlE85F&x<7qICVXD$=c2CY zn7}ub?oVHl75;Shr?1Egr~A`aWQEtq{pl<0WvsB5vBF-)3VRtV^2DF+{`3`j;`MQV z`iea9`greSMSCCqboZyPXz#=6{`3_Y@_D8AK33$3r`?~P#*H*?q;VsS8)@7~<3<`c z(zubvjWlkgaU+czY1~NTMjAKLxRJ(p)NaIEtH`2I~#*H*?q;VsS8)@7~<3<`c(zubvjWlkgaU+cz zY1~NTMjAKLxRJ(p)NaIEtH!`@9!Ho=V zWN;&c8yVcl;6?^FGPse!jSOyNa3g~o8QjR=Mg})BxRJq)3~pp_BZC_m+{oZY1~)Re zk-?1&Ze(yHgBuy#$lyi>H!`@9!Ho=VWN;&c8yVcl;6?^FGPse!jSOyNa3g~o8QjR= zMg})BxRJq)3~pp_BZC_m+{oZY1~)Rek-?1&Ze(yHgBuy#$lyi>H!`@9!Ho=VWN;&c z8yVcl;6?^FGPse!jSOyNa3g~o8QjR=Mg})BxRJq)3~pp_BZC_m+{oZY1~)Rek-?2D zZe(#IiyK+o$l^v8H?p{q#f>a(WN{;l8(G}Q;zkxXvbd4OjVx|taU+WxS=`9tMiw`+ zxRJ$;EN*0RBa0hZ+{ofa7B{lEk;RQHZe(#IiyK+o$l^v8H?p{q#f>a(WN{;l8(G}Q z;zkxXvbd4OjVx|taU+WxS=`9tMiw`+xRJ$;EN*0RBa0hZ+{ofa7B{lEk;RQHZe(#I ziyK+o$l^v8H?p{q#f>a(WN{;l8(G}Q;zkxXvbd4OjVx|taU+WxS=`9tMiw`+xRJ$; zEN*0RW0fBERk`uyz^b+w->Y;F`>G6ax`%yL+mN2`9`;pv@}$x|?5py`bKJweDo?(s zbPxNgwlMvA_pq;OJJZwdVPDnOrp_qK952B=?5pzRkCg9!`k$2UVPDl2reE(K_Ep*9 zbPxNgwmCiDJ?yJ;#!GMy`>LGr9QUxV${DYNd)QaCMe5hPhkaGsrJi;V`>M81y$OnLx`%yL{y5#kzAAtG8b3RARa>e~KRb0*TdGb!J9SlCs!sQ?ugWo} zd)QaynA1J%tFr4;%5~P$J?yLMVfQ*0NcXU>$}X?-CUe}wzADH3UiYxC$}y*V*jMG4 z*U&xet8&cg9`;o^=5=-t`>M8by#)8LuWBpT=^pk~ZRI-M!@epH{Yv++ugXKGd)QZH zpwm6zKgt@d>ixcVftR(UFr#W_y@}Snezbo zptdERkcVE*L%jZHn0`Cc?_m0!&uD8e@UEwyQTo21PiO@DxbhM5-MUZI6B@^!t$gn@ zuTs9Bb^8GC{UFQv1*ShlewgfH{yC<*S+^e6t(Q4{r0>J?g#7fn4e-Aq|2{AHGCdee2B7I-bC*-Zu_XT}I-a1!V|0h_E z?+f~b#zxc6k$JK}7Re2AliXs-+q`#&+$Bro9_zVJUSrJ*NvNe1mL~E%KN(KVdm-rcYV^8Sm;S*JQGu9VL^$t-M3~3u`jj)4s#)nnqNo?{K@O z5!KVa!|j?({s*P+aJ!}v)#*FjuE}Ii`wq8j8c{v%JKU~mMD?`qaJ!}v^_P@3c}*s- zD}9ICHSNVuDt(9BHJPku%*bS~o9}SDrjgdm@f~j0G}1bKhubxcw4U!f+^%V)^}6{E zw`&?{J;!&rUDHVGb@Lr=*JQF^?>pSCX{7bE?{K@Ok=EUz(9d6e&4m;f;zNT^5)4s#)n#N(j#&@_~(>Uz(9d6e&4m*8^+ck~DPT%2n zP2;e$N%{`AYuX<0n)?p7YuX<0wC`}crZL&?@*Qs1(?hs#>!=85E?z$Xyx*ud+ z4tv@i;_KRabh<-)T@E|lA-*n$J?(ywbvf*5_k*mvV_sy6p9| zyFzrwWv1N~vMzf)-(4Z=ve#=hqQ16ubsl|786@4~wywV2zgN09WL@^^3OU*9*Sj}l zU0VfSjyuHH<)m|-bl>i}oOHTFd|gg@+Pxv`a?-DKZ^*iwbh<-)T~0dPA-*mro$e4{ zmy^y6=??LAIqC1pJ#MNqa*Nk*GwlxXb(!WYk?s&*muXISh_A~uPrEl{U8eb!?hRR& zX-;>Dugf&2JH*#zn)8TnsX;c$7J1CKGVOkE;avCSSOq-^= ztLodx$uzH(JH&GuCqJ$9lelvlC%sng+s$E`?!_Y0ax(2DN}HC$v>c}8FfE5^IgNf^ zvQ5ijS`O24n3lt|9H!+kEr)42Ov_+ zavIZ|HZ6x~IgM#v6PuR9v>c}8FfE5^IZVr8S`O24n3lt|9H!-Dnm^t5BFJe>bNXHc zIr?^U8q@rVZPv}EK%VSy|)ATG{t$!ZV@|c##v^=KeF)fd2c}&Y= zTAnd2k7;_^fGFfKEstq=Ov__h9@FxemdCU_rsXj$k7;>K%VSy|)AE>>$Fw}AK%VSy|)AE>>$Fw}A%UX$6^f7ARm^0n-YYR=~6Z zrWG))Ak$u=SGq&IAk%h~?hr3vT0y^_uhq1FJqwstz_bFU6)>%UX$4FxU|Ipw3Yb>F zv;w9TWSZB?zn%q5D`1-LE-$hLOef=qk4GDvz%D`?yASxWzU7BEeB zyHSUD0n-YYR=~6ZrWG))fN2FxD_~jy(+ZeYz_bFU6&TYBm{!2F0;Ux(tsv9%UX$4FxU|Ipw3Yb>Fv;w9TFs*=T1xzboS^?7v zm{!2Ff=u(b)F7K=i#+CA@|af8cACF2k7)%=D_~j?(~6i@#Iz!&6)~-dX+=ycVpZU-rWG-*h-pQ((~68~MYhw5Y^N15t;lv-5z~s8R>ZU-rWG-* zh-pPkD`Hv^(~6i@#Iz!&6&cftm{!CzJ=;OwLlM(-|9htW>se$wt;lv-k?pi1+i69{ zv?AMSMNBJVT9NIvBBm8Ft%zwwOeZU-rWG-*h-pPkD`Hv^(~6i@#Iz!& z6&cftjA=#2v?60#k?pi1rfG|wzs0|vMNBJVS`pKVm{!EJBBm8Ft%zwwOeZU-rWG-*h-pQ((~2@}N1x^Gw4%l|r?=CJjA=!-(~6i@#Iz!&ZOF9m1vW5kL#BD! z9pW1@&FMXY4VmU?cZhFb+J;Q?9CwIs$h2=M-66h#X&W-l)7~T4kZGRw9>Io8d!O=Q z-DQ14W7->(kC5&V-@vgAIrdFWdkbwtj(Pe+(;m$>A-*YF zo>IC)d{c%v-NCvkEB;974)IM{;q+DOn;L)q7o|JIH+8JTOZy=2@>6IxHJ&`F9ANqa z=??KtG4;~?WQR>Lb^5CHO_BA|+>Nyb#&re zN_Wz2$^n0_JH$6d_Tx%-h;NFi(;ecQV(N5<_@Ntbf!5!k8;_hX-Lwr*-y$*-W@l$9w#nD+M{S?|wadf)- zcvBpm?hxM;N2fc)H}y;8bcgt+*gYQD61y|y9Xi^)C3en-$hVWGwgt5qU$?v^M*b^0di^%_wM~6(Q(xQE*EaRFO?_=sU)zw{roOhRuWjmUoBGVO*S5w_&oQrUcx_W(+tk-K^|eiXZBt*{)YmrkwM~6(Q(xQE*EaRF zO?_=sU)$8zHubeleQi@;+tk-K^|eiXZBt*{)YmrkwM~6(Lv0&s+fdu4zP72aZR%^A z`r4+xwyCde>T8?&+NQp?sjqG7Yn%GoroOht&fkFRYn%Go);Q^D*Vi`nwGF#%*lojZ zoBG2X;HK(;aFxHtxV~2X;HK+ku_#R;5vB2X;HK+kxE<>~>(c z1G^pA?Z9pab~~`!f!z-5c3`&yyB*l=z-|Y2JFwHSIzG{3;|}b!C&aYJ#vR!0z-|Y2 zJFwe<-45(_V7CLi9oX%_ZU=Tdu-k#%4(xVdw*$K!*zLe>2X?!#+lAdO>~>+d3%gy| z?ZR#scDu0Kh21Xfc44;*yIt7r!fqFKyRg$U3FXx;>~>+d3%gy|?ZR#scDu0Kh21Xf zc44;*yIt7r!fqFKyRh4Z-7f5QVYdrAbqnb?Wfyk4u-k>*F6?$;w+p*n*zLk@7k0a_ z+lAdO>~>+dOWp0lZWngD)ZH%Zc44;*yIt7r!fqFKyRh4Z-7f5QVYdsrUD)lyZWngD zu-k>*F6?$;w+p)x>`JgJ!L9_m66{K_E5WV=yAte5uq(l?1iKRKO0X-zt^~Uh>`JgJ z!L9_m66{K_E5WV=yAte5uq(l?1iKRKO0X-zt^~Uh>`JgJ!L9_m66{K_E5WV=yAte5 zuq(l?1iKRKO0X-zt^~Uh>`JgJ!L9_m66{K_E5WV=yAte5uq(l?1iKRKO0X-zt^~Uh z>`JgJ!L9_m66{K_E5WV=yAte5u-k*(9_;pDw+FjD*zLh?4|aR7+k@R6?Dk-{2fIDk z?ZIvjc6+efgWVqN_F%UMyFJ+L!EO(Bd$8Ms-5%`rV7CXmJ=pERZVz^Qu-k*(9_;pD zw+FjD*zLh?4|aR7+k@R6?Dk-{2fIDk?ZIvjc6+efgWVqN_F%UMyFJ+L!EO(Bd$8Ms z-5%`rV7CXmJ=pERZVz^Qu-k*(9_;pDw+FjD*zLh?4|aR7+k@R6?Dk=|54(NX?Za*# zcKfi~huuEx_F=aVyM5U0!)_mT`>@-G-9GI0VYd&vec0(qXxdiUhuuEx_F=aVyM5U0 z!)_mT`>@-G-9GI0VYd&vec0{8ZXb60u-k{-KJ4~kw-390*zLn^A9nk&+lSpg?Dk=| z54(NX?Za*#cKfi~huuEx_F=aVyM5U0!)_mT`>@-G-9GI0VYd&vec0{8ZXb60u-k{- zKJ4~kw-390*zLpan%I3Ka82y=WG1n5xN(Q|S)zYohig zr8~s0iJF(=4)JTE=5&YnHSuz~L;RZd%Do(Sh+h*mFTow+*Tl=qafkRd@zNa)#7kW+ z;^k$!L;RX}Io%wx+?puP^M zuLJ7qfciS1z7D9b1M2I5`Z}P#4ydmK>g#~|I-tG|sILR+>wx+?puP^MuLJ7qfciS1 zz7D9b1M2I5`Z}P#4ydmK>g#~|I-tG|sILR+>wx+?puP^MuLJ7qfciS1z7D9b1M2I5 z`Z}P#4ydmK>g#~|I-tG|sILR+>wx+?puP^MuLJ7qfciS1z7D9b1M2I5`Z}P#4ydmK z>g#~|I-tG|sILR+>wx+?puP^MuLJ7qfciS1zOIX%?%yqTPbu9YeqBe~^rS`|ZF`sU zA?CP4{JIEg+eo!`i_#t9*G16j4)Nn1~uZyG3yNIKg?+)?n;^=gT_;qn~xmukiafkSIv2(gZ z{JPjV-64Km?40fpzb)auJUB|(k?hwDO<6usAh+h{?zotz3`PbJ))9L45Ul&cM zdr_~8n$sQP*Tv532HXy=eR@shRA+a=??K5BI{4|Q|WK$7^%}wrN5!$@Xm9j zJH&73xTxp&sq{Bgzy3r&mHvi~h&ugL`WxczSGq%7&x>P@JH&5@yFbw#;x|P6>q>Ws z-w<)9JH&5@xYHftH$?mgN_U9g&@oak!B3^Xp<|>@Kb8K5SpTWgPo=-1I`!Y^r_$e0 zojUzg`WvF`&wYZ|_^I?aMBK}ChxiQ}9}Re4BN9#WNuROKO6c}P_rQk92PE5oh~yE5#`uq(r^47)Py z%CIZLt_-^}?8>k!!>$awGVIE*E5oh~yE5#`uq(r^%!pcsT^V*|*p*>dhFuwUdIF3_ z)H3YKuq(r^47)Py%CIZLt_-^}?8>k!!>$awGVIE*E5oh~yE5#`uq(r^47)Py%CIZL zt_-^}?8>k!!>$awGVIE*E5oh~yE5#`uq(r^47)Py%CIZLt_-^}?8>k!!>$aw3hXMd ztH7=Ty9(?ou&cnX0=o+ADzK}-t^&IX>?*LUz^($j3hXMdtH7=Ty9(?ou&cmMPsP;l zU?*LUz^($j3hXMdtH7=Ty9(?ou&cnX0=o+ADzK}- zt^&IX>?*LUz^($jD(tGTtHQ1dyDIFeu&ctZ3cD)os<5lVt_r&ot)nQkMT^)9H*wtZIhg}_Zb=cKmSBG64c6Hd*VONJ;9d>ot)nQkMT^)9H z*wtZIhg}_Zb=cKmSBG64c6Hd*VONJ;9d>ot)nQkMT^)9H*wtZIhg}_Zb=cKmSBG64 zc6Hd*VONJ;9d>ot)nQkMT^)9H*wtZIhg}_Zb=cKmSBG64c6Hd*VONJ;9d<`zcN#d- z9>jN*canFJeuDXt_8^?@5I+*lPb%+cj-OzD#6JF!_9Hy)Czu~;Kf>t_@gwa=d`syL z@gq@oxU6Hf0<9BFUD z)4t!-k@hB>?hrrH-h@BbUBE{&!RZe1BRSyDb%*$o==;;%A$}zKo_2@$k?4DlJH(Gf z-*aYIvY%jnq`e8}Jn0VcBl+NThxn0v@U%O`kF=NJSGq&|NP8JhcZeTpFT?2$@gwbJ z_%(il`H`&fXSqZCNLF~-9pXo_!gJgqek3bAXPejiK2%5A%W(QWR7di}pY9IvBYEQW zafkSkJn{OtL;Og4AO3WAh#zV1!|4w3BN_5}r8~rrP1^25vNPqoKXa?`po? zXy8TzHyXInz>S9XG5xQ;)}nzM4cutpMgun*xY59k25vNPqk$U@+-TrN12-DD(ZG!c zZZvSCfg26nXy8TzHyXInz>NlOG;pJV8x7oO;6?*C8o1HGjRtNsaHD}64cutpMgun* zxY59khW0f5_u7pHZZtGj_}jA^4cutpMgun*xY59k25vNPqk$U@+-TrN12-DD(ZG!c zZZvSCfg26nXy8TzHyYXl^_tj?25vNPqk$U@+-TrN12-DD(ZG!cZZvSCfg26nXy8Tz zHyXIn#Em9yG;yPe8%^A3;zkoUnz+%#jV5k1aifVFP26bWMiV!hxY5LoCT=uwqlp_$ z+-TxP6E~W;(Zr1=ZZvVDi5pGaXyQf_H=4N7#Em9yG;yPe8%^A3;zkoUnz+%#jV5k1 zaifVFP26bWMiV!hxY5LoCT=uwqlp_$+-TxP6E~W;(Zr1=ZZvVDi5pGaXyQf_H=4N7 z#Em9yG;yPe8%^A3;zkoUnz+%#jV5k1aifVFP26bWMiV!hxY5LoCT=uwqlp_$+-TxP z6E~W;(Zr1=ZnSWtg&Qs0XyHZ+H(I#S!i^Sgv~Z(^8!g;u;YJHLTDZ}|jTUaSaHEAA zE!=3~MhiDuxY5Fm7H+g~qlFtS+-TuO3pZN0(ZY=uZnSWtg&Qs0XyHZ+H(I#S!i^Sg zv~Z(^8!g;u;YJHLTDZ}|jTUaSaHEAAE!=3~MhiDuxY5Fm7H+g~qlFtS+-TuO3pZN0 z(ZY=uZnSWtg&Qs0XyHZ+H(I#S!i^Sgv~Z(^8!g;u;YJHLTDZ}|jTUaSaHEAAE!=3~ zMhiDuxY5Fm7H+g~qlFvCbci3zjV}j|wZ(Y1(jDT*GQ{Z)@nda6dcHfvkLAgeN_U7K z%M;IWhxoBP`J&Pt;>X&;^y}Rreyr_GPrF0>SX-OA-?z;165JtvEKmMO>8G3@%M;IW zhxoB<@w7X{k7bL~9pcAw#?$T)Kc++cSk8EkJH(IWjMu>(;>X$|_3Paseyr_MPrF0> zSX-xF2X}}c%OcNlhxoC!MSnr*4skvA^67t4xebPIrhO%OAhSPdPu3i|{gm@#ZO8iCaEJJ@ z9CNxu{8)}T-64J~$DHmEKbB)ocZeU$F~7zg;>X&`b-F|RSX;SHcZeTrE7$1`@nd=D zbcgt{JaoE4{8;XJnSRRov9^2P8#vJz^)cn`I>LM+55KCslj*z2yUDjP{~o5@A$~%K z_=!C9yB;7P)b`bhJoFrQh@Z$qPrF0>L>_wD9pWc+h@Z&ACpGO3@e_?;PIri(XdHXC z(jDR_8pl4S`~dHDhxm#7^m0B#ewgfH{yC=IA$}r1|3KNxoIdirwti3Kr{C)i@e}#! zX?KX9$WKqZL;NJ*4)GKD`IOQf;wKvAobC`m(OBnobBFkeyzMA`_VYv|-p7>g5I@m~ z=X8hoiM(~XL;OS|p3@!TC-U|?%2{%boG0BOej;z3?hrqbx1M%~_=&vryWAmuB5$4U z5I>Q(PIri($Xn+M-))-AkXh0l;wQ4#%UNTNJH$_9uhSjkCmI`_?hrqby-s(CpU7S> zd7Jm{kh^4wbcgtf>~*?B{6zM8+8yF2viCbmcZi?JUZ*?6Ph_vt9pWdl*LlP@-yoZ0 zi*$$hi5&KF+#!AT+Ga#;GorQ`QQM5DZAR2K zBWjxwwatjyW<+f>qP7`P+l;7fM$|SVYMT+Y&4}7&L~S#owi!{|jHqo!)HWk(n-R6m zh}vdEZ8M^_8ByDesBK2nHX~}A5w*>T+Ga#;GorQ`QQM5DZAR2KBWjxwwatjyW<+f> zqP7`P+l;7fM$|SVYMT+Y&4}7&L~S#owi!{|jHqo!)HWk(n-R6mh}vdEZ8M^_8ByDe zsBK2nHX~}A5w*>T+Ga#;GorQ`QQM5DZAR2KBWjxwwatjyW<+i4o*O?D*#hYiwatjy z);%{o-y>?95w*>T+Ga#;GorQ`QQM5DZAR2KBWjxwwatjyW<+f>qP7`P+l;7fM$|SV zYMT+Y&4}7&L~S#owi!{|jHqo!)HWmPsYcYV1Wsk(<4Rv|f6BJpsa*23ueU#yKc7+h zdizt2fnQbndizt2f!|d6dizru^(CdRw?CCjewVKYK9w6!Dt%qzseEwy8kE>+Mf9YI(`N-u_ghmebdip2`iUueU$dsO4#2Z+|N8 zf2;I$iKk-iIlkWhRIHr|(%0LcinY^Mai5B{)7RUdinY_%+nFe!JMbPWu>+Mg)>ucPsPsZ>w!+Mg) z>vzPc@P_eZBpu*gYONgWVbI&R};Yc28=)*`2}e40dO*JA>UB?9O0!2D>xZox$!* z>?ZYIKTYopc4uPeX+KTx40dO*JA>UB?9O0!2D>xZox$!5c4x3VgWVbI&R};2yEE9G z!A?&|W6jO(40dO*JA>UB?9O0!raJZCXm+~4puVLu*qy=d40dO*JA>UB?9O0!2D>xZ zox$!5c4x5DHTe9cW_Jd=GqLmE?x*RUiJj9=(>oJ8r=O;$BUr41*`2}e40dO*JA>UB z?9RkaPeX)V2X-CUb*Q@z>^iXPz^((k4(vLx>%gu9yAJF+u%gu9yAJF+uOc>^iXPz^((k4(#-dKC$RfcOBSuVAp|N2X-CU zbzs+lT?cj@*mYpnfn5i79oThX*MVIJb{*JtVAp|N2X^WLVI9n_1G^4&*P-q@)Lnri(c>aGL34t3XoT?cj@*mYpnfnA5X3j_ks{m761fAYB-&;7^ejXm!#p8xaD4?aKk z{LelAA6{_l3m$pFg%|wh3ua&N$1nK73vYelM_;(|!tcN6=U()$Uv&23*T49Y7k9t- zqc2{3apA>({gR)5$?v@6b1(VFmp=5;UwP@$OTYNi|MIfiUiQJ4{m#o`FZ-Wg_U)HH z`0|gx{By5(&MSWI6(4;?>=o5l{NR38{P-(luPnXtKfUrFUv=}V-u|jzf7Q{e ze(>tIzWTzeL$7YX`n#`r^=lq}&9A>^@-^kxoW1t8*9KpE^xFUOx`$pj^t#E{ZN2Ur zH^2PmcitSl`QYX+{N&9)dHyFq@{>oe54`?YUcdADC*Sa%H~h*Q{_G9^`3?W{#(Uqm z^~T?S({uIzFMZQ%-}KHmee_K$Zz{j(`)~T;Eib+0^|!q3miOG!d&@^|`SdN*xBTT# zJ@iwPKlS^!KIhi+x31h;y7l9+wQ;ZBe(tGZGUmw z4{m$CV5q z>;Aib=dRzs`}KGK-raxkwyw98-uAhB?!D*N@7cQN`}e->-jCi}xc4vad+vP?-S><4 z{rme4?)&2XFTKC({>l4e_ix<)Ki&VO`~T+t|KovIKk)Vk-v7Yk59~bfA0GJQ2fq8j z(+@uP!QXta{L`=h>FI~w5x7a{zV@v90&fi56?jhIS%JmCcl6YTz_adr>1zVd=3if= zd76683-rp5>pwr5zA5lp{jVQQKP&LkKt9}YYocr0+grXJGzJQVn8rr#I%g#Q25 zz(C+P0w2@6ekbtT{I6frfBU_^$GhLBsbAG+Jg)zBYoJ%J_0)j=^D%wKC-g6$4*bin zc_c8TSAAMb`;EY-^sZa^+y}J=|MKhq-(LN0ed?!Jn@{R*^b-Ad{A}P}{`*IN&$|O3 zIUisgy&p-c#|Lwg0 z=kNai^DY1Ad;Jal-9P%PyYy*YTBA>Dy?$HVKCaL7H~s5BUgKK>|3?4nIluZ}*ZoJ_ zephq-eSb{<_W$+wd3m4K5jF0ielqa-z#CLeZwlNJ_$jT~n*+B6-V%6g;P${Bfjd=WcL&}UxJM-K z)A~IiLO(4wKO-{l5TADi9v0yfu9qppBLfx2R@+h;}`UIepuh^ zIsKJAa-=VCKF}{S2lX9alzYR0k-%sm7Xjn;K}|7+k6bPd<9=v$1b zrv6AQ|1j{yz?TDG3jD{we+qn0-~OKl{y6X_x}NA`f&Z*~^M5t)XMwMX!QTe{H$CI+ zH^tyFvH65(7R2GVRJ*Q>-<5s8C;s0L{0|xt{%zpj1ttRjKA_{gfw0Dqh@MjZgTUYE z*v6l0o8hl+`ia2T0#60L9{5ZBc70RVB-H-z&aVBrjiZk5>FxL14!Mx7dX{UfmExvp z>LiZi-s!BSrXV{G+@%!mEIAM;eFOsL+43j^b>JW2m+#5V)TJ}fVSwp>6+YixNwrfO z2J9JqKfB-0?tWjpdy+L{{6*(O@elEVcqIOb|DgPL{8z?5i@%D$Svf0@a|hp*5&z0R zc;nvkvU{;BpXKEJa34C~#6 z9cKDii!Vt@61M|ClydV>jBagG?$(`vF4?pgMt5cVc0j38{80hr)NDGtcCm=>H<9q1 zS_k#!MQ(*GMKZcup_FopPO(C1C0hsS=^5dAH08-Ca+B1w=O(4JM=5V-U(&Dx;KeP< zH1<2GR0`8jaqnD_dpn~umU~VDI&Npmnu5+D(Fpd!&aB1E3S|_f%QWK!ydKSZUYB6Y zmZVP_lv%jbS+qtxzv)xX4~mp7h1;(NAlvOgQlo*c_0X2I!e}K7Wn$Q{Xc1lAmZW9Y zFEjI#Mj#Q5b}VVI5k%;btQ%x>nbGCQj>0gs5iJ__n)q^9Kw^{0MYQcrI?w3*W_&m< zn#?%Nirp}5#UWYcFzk8|$`<@_+^|AfC4EVmQVgH+UL&Bq<5IzKkpT>eDwNaVMkHh_ z$?v+7mF%u<%;#51MShdAOGPL>*_Lgrl`LmVh|pFLHSBmh44kkSN?N}aKxcDYx~5bp zuV}z4cW|ias29+5TnFXixG|-6?~>JoA(UUL(14O`?I_&Jh+R-%?|Kw6C8}v_2UTZa zRCvC-RO}bdkUCyS!)6w%3==%K9!bCL#GF(eY+-XkNZK&6XC+eW#5J?T$SK2V9-}b0 z@7mEpqg?-vdoVIA(mqmTJH>DbMLedGRLZATT&vKyf(ug8nD;V!27nCFIJdUZ8rS)n zz(nIZC=xMf!f=}KBH4~4O(1L)npB%RL6T|J!g(6mbM`AVr8c*M&0D6^E~0-*_fM-t zOnSG2WOC9YD|Tt3%v%nn z!G;gdoUw52ObOR@ITF(_1iECpP^S0G_S2~ISvWgWuF#xHES6^wc$QyKNt)$Zm1J1j zD#@}ur;;4YFRCQZ^1Mn4ET2-z0L!vMSWF@)7a`=1tdjK_Z<`9KBg)yn@@=E698oUx zmG_NODnVoA(;Q}B9~ocS(WCwq;h%(EPs2Z!4*X*|5C2$};2+Bc_{Z`Y_{VY){;~WL z{A0NU|5#R)T-7`3f)LIkW}U3T~>6VOc$^*pT(Z2qjXQ)nNGao@CpAP z8K}z&UF_vL8O`}zdi3m4lC@_10H-5o@wp@6IgN8k$>+7@&to<-kN^4e0>{va)^fj? z{Q!5C5VbXDCAnnHu&)k*m1-Jom{Nid_v88zvB5*e172ClI8}JiCuY&nbSOkXf*_^{BMl!M}I9w%9 zSb`a2zP8wiG+w($>St@ASXO(nkgy=T(2a$&iZEU8t7s5sh?E;nofqXSuJv@<853!I z{W_@1Rov`seaduV(tau^S3>J1RQ-n-lf=(gUgUJMg)5*!H+rk-=y%f<@srMzF85Nr zj`O3+QQV+8FKF1fT;*z5O_r@`?AsTQX}9ghF|B({+Z%gyz9&a`imsNA5_*Gr3)U1} zE4NX8Tw`tQ^wVrZLaVe46MgM6m+^v$e2gbG*SOB*>|m!=vGa^W8!8#ZrNh;)EB}8h z>H0|p_Wx8d$D7ZwRcFO69;ugN*tN5c1NdsW7nPULx>hc7&NwbzZ~7s)i4e?~ZI8zk z?C_~7UB)hd`IP=mOlM6`(F@>wS!229@rjd)*4{+B4 zGUtZ|GUtKju!1>1!r<%uS%0isdc?kgJmMz?GX1BR=en8lX9hCi=LRz27vQe-=li8@ z>G|FIl$n;-fG^(VAk%+uAk!aWo54@F@n~uN3D=!@`}bBN z^6r5+n-WWm9zB&AE2IVuc2aXWjR)M13-|~EZyJW68FD`s>-go?NBC?))RKAY;TGN; zJPf$qswIouJ}d~+A!?zWJi}doDZGmh^41?VcQg|U{&`ePP2^IeONZ9u_bBs6+|#v# PY%3>fH8vWX06+f*RpzRF literal 0 HcmV?d00001 diff --git a/src/logic_sim/mod.rs b/src/logic_sim/mod.rs index 1a62286..ea53787 100644 --- a/src/logic_sim/mod.rs +++ b/src/logic_sim/mod.rs @@ -1,17 +1,42 @@ -use bevy::color::palettes::basic::RED; -// pub struct Block +use crate::camera::Canvas; +use bevy::color::palettes::basic::{GREEN, RED, WHITE}; use bevy::prelude::*; use bevy::text::TextBounds; +const LABEL_SCALING_FACTOR: f32 = 0.2; + #[derive(Bundle, Debug)] pub struct BlockBundle { - // name: Text2d, block: Block, transform: Transform, global_transform: GlobalTransform, block_visuals: BlockVisuals, } +#[derive(Bundle, Debug)] +pub struct BlockLabelBundle { + text: Text2d, + font: TextFont, + text_layout: TextLayout, + text_bounds: TextBounds, + transform: Transform, + marker: CanvasText, +} +impl BlockLabelBundle { + fn new(name: impl Into, size: IVec2, font: TextFont) -> Self { + Self { + text: Text2d(name.into()), + font, + text_layout: TextLayout::new(JustifyText::Justified, LineBreak::WordOrCharacter), + text_bounds: TextBounds::from(size.as_vec2() * (1.0 / LABEL_SCALING_FACTOR)), + transform: Transform::from_translation(Vec3::Z), + marker: CanvasText, + } + } +} + +#[derive(Component, Debug)] +pub struct CanvasText; #[derive(Component, Debug)] pub struct BlockVisuals { size: IVec2, @@ -32,11 +57,18 @@ pub struct LogicSimPlugin; impl Plugin for LogicSimPlugin { fn build(&self, app: &mut App) { app.add_systems(Startup, setup) - .add_systems(Update, render_blocks); + .add_systems(Update, (render_blocks, scale_labels)); } } -fn setup(mut commands: Commands) { - let size = IVec2::new(50, 40); +fn setup(mut commands: Commands, asset_server: Res) { + let font = asset_server.load("fonts/arcane_nine.otf"); + let text_font = TextFont { + font, + font_size: 100.0, + ..default() + }; + + let size = IVec2::new(50, 80); commands .spawn(BlockBundle { // name: Text2d("AND".into()), @@ -45,37 +77,122 @@ fn setup(mut commands: Commands) { color: Color::from(RED), }, block: Block { - inputs: vec![Connection { - size: 2, - values: vec![false, true], - }], + inputs: vec![ + Connection { + size: 10, + values: vec![ + false, true, false, true, false, true, false, true, false, true, + ], + }, + Connection { + size: 9, + values: vec![false, true, false, true, false, true, false, true, false], + }, + ], outputs: vec![ Connection { size: 1, values: vec![false], }, Connection { - size: 1, - values: vec![true], + size: 2, + values: vec![true, false], + }, + Connection { + size: 3, + values: vec![true, false, true], + }, + Connection { + size: 4, + values: vec![true, false, true, false], }, ], }, global_transform: GlobalTransform::default(), transform: Transform::default(), }) - .with_child(( - Text2d("AND".into()), - TextLayout::new(JustifyText::Center, LineBreak::WordBoundary), - TextBounds::from(size.as_vec2()), - Transform::from_translation(Vec3::Z), - )); + .with_child(BlockLabelBundle::new("AND", size, text_font)); } -fn render_blocks(blocks: Query<(&BlockVisuals, &GlobalTransform)>, mut gizmos: Gizmos) { - for (block_visual, transform) in blocks.iter() { - gizmos.rect_2d( - transform.translation().xy(), - block_visual.size.as_vec2(), - block_visual.color, - ); +fn render_blocks( + blocks: Query<(&BlockVisuals, &Block, &GlobalTransform)>, + canvas: Res, + mut gizmos: Gizmos, +) { + for (block_visual, block, transform) in blocks.iter() { + let size = block_visual.size.as_vec2() * canvas.zoom; + let center = transform.translation().xy(); + let half_size = size / 2.0; + let top = center.y + half_size.y; + // let bottom = center.y - half_size.y; + let left = center.x - half_size.x; + let right = center.x + half_size.x; + gizmos.rect_2d(center, size, block_visual.color); + draw_connections(left, top, size.y, &block.inputs, &mut gizmos, &canvas); + draw_connections(right, top, size.y, &block.outputs, &mut gizmos, &canvas); + } +} +fn draw_connections( + x: f32, + y: f32, + available_height: f32, + connections: &[Connection], + gizmos: &mut Gizmos, + canvas: &Canvas, +) { + let input_count = connections.len(); + let input_spacing = available_height / (input_count + 1) as f32; + // println!("{} -> {}", input_count, input_spacing); + for (i, connection) in connections.iter().enumerate() { + draw_connection(x, y, gizmos, input_spacing, i, connection, canvas); + } +} + +fn draw_connection( + x: f32, + y: f32, + gizmos: &mut Gizmos, + input_spacing: f32, + i: usize, + + connection: &Connection, + canvas: &Canvas, +) { + const CONNECTION_BIT_SIZE: f32 = 10.0; + let connection_bit_size = CONNECTION_BIT_SIZE * canvas.zoom; + let connection_bit_half_size = connection_bit_size * 0.5; + let connection_pos = Vec2::new(x, y - input_spacing * (i + 1) as f32); + + let rows = if connection.size > 8 { 2 } else { 1 }; + let columns = (connection.size as f32 / rows as f32).ceil() as u32; + + let half_offset = Vec2::new(columns as f32, rows as f32) * (connection_bit_size / 2.0); + let one_size = Vec2::new(connection_bit_size, connection_bit_size); + let half_one_size = one_size / 2.0; + + 'rows: for y in 0..rows { + for x in 0..columns { + let index = y * columns + x; + if index >= connection.size { + break 'rows; + } + let pos = connection_pos + + Vec2::new(x as f32, (rows - y - 1) as f32) * connection_bit_size + - half_offset + + half_one_size; + let value = connection.values[index as usize]; + let color = if value { RED } else { GREEN }; + gizmos.circle_2d(pos, connection_bit_half_size, color); + } + } + gizmos.rect_2d( + connection_pos, + Vec2::new(columns as f32, rows as f32) * connection_bit_size, + WHITE, + ); +} + +fn scale_labels(mut labels: Query<(&mut Transform), With>, canvas: Res) { + for (mut transform) in labels.iter_mut() { + transform.scale = Vec3::splat(canvas.zoom) * LABEL_SCALING_FACTOR; } }