From 2c44abc320438098e237508483a103ecca330d91 Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Tue, 14 Jan 2025 23:23:31 +0300 Subject: [PATCH] Feat: added export as image btn --- bun.lockb | Bin 143805 -> 145659 bytes package.json | 1 + src/App.tsx | 94 ++++++++++++++++++++++++++-------------- src/components/Tier.tsx | 2 +- 4 files changed, 64 insertions(+), 33 deletions(-) diff --git a/bun.lockb b/bun.lockb index eb74852dfd8365e5f2460a9f10ac38b0f5aa2a2a..a987da259b9e5e991ad07ee0f215b51979f477a8 100755 GIT binary patch delta 26646 zcmeHwcU+X$w)X5-Mi>-9MS&3z#D)qAQbopIa0CnD2#Pv1gCZcsh*3d}i5iV%t6PZ; zdxha;vww+E73zKy8%9&-U zTi7I%$&B)_*XfEz=jY~GGgEX<$S{Dn&c&Fz8HaeXLs5AJgg-9IND+QBtbMp$aQ*}q6PzUl)L2H9f z1f`D29q~)g?P;r2WCuzO&qqEr5ND^;)dXFo^3y>nKN7t~V?_mOJy|NH`U>+O;@OEhQtHZMg`naJ6T#2lwAB8rKsmWgHngeK&ir<)ZDC$k*T_S z=v7_tS3#-V8Bl8AEo*Mp+nG9DLnu>6--8@|E-J7N&p;n^Wsp<-Cu+j~RB$_5flkp! zpfonAIXPK5eyO82pjT9Is+!*s<53TMD^MzT2o+IG#K9b*T|ueApFpXBt;nZ(_n_nM zpvPSmPqcDVJh{9O3H&RnXH>?#3Mjc|8iYiB5D4TMPw-UnK~z8u8BiO=$k5!>++72xxuKE}&kZ zJ}R#VrTnW9`sj3pMf;E-mzIFiSWZxB3MeUd1tr({s&WUFe+*^vz;#fvC_5`R4>L$7 zd=);^nwgcJqSK}3CgrDRr0AlXDHgW^#i$fD1a(II6*;RJ6p0jUcbY1mI1fsS2S8~E zHiJ?SE(9gL_dv;GIV#^Dl!mO6Dh~vu@}6pbRZuGbtcgUe5yeqK7FJ~eklerisEZi7iFmztZMlZuYafF60caT~>QYjRc& zxn^Rpmts+mwo1k*wZ|vGQ^gJ1@ubQP3x~9Sv#$7|FGB`^r}mq7P-1NyC^^bHRPLV6 zwxcpRob7woRGjoE7}B#C8+3TH>Kh~hfGv=#gUa`l#X@>rC3YKu_mX&0|!;P zp@-tp{-BgUJT+%XYG8TD{2Hwo*rO*5tObP|s$ew)Rlx`L;zm2q!sh4?#<1uK`a{dm zr|3BK?=pC*cP<=O1vEE5Imeots^fhWM`WkxAntN?!$(5_uhck2FYm3?%=EMZU4qKX z@r``mSDA|wLCNu*EV6!K(I^P0ftwJ>hNNevXIpb~vmhsaT|cG3B2XIIdGU%o9TcNk z6q2A)@MPE5;As`v1xoe)dwq;d$^gZaS^+IKr@~U|KrK+J@Ia!Xhc!~(GHfBQ2Kg_s z>goeZ`r00O2RwCf>L8`#--9Rpz`=?Z9pj`eL!hHs08W- zdIR&DM*c7;h4ROsls^}g>>dqD`$Q5b)e{9u^#rQ<$G_let%>vMg(hMb0Ri@;aRr`Q%s&C^<9=lpGnVmQ&^`uU*Ah zczT4g>>LIqSMCC(pjfU_cT`v#JO9P-?ImD2=fMN*#KZ$IGg8ZhUcKztmkRSED45UG2 zZZw(<{VVHq@ozLgt;~y!CaI<^F9S)m<;FTDN!aoPkc+mw7{tYnmw~)x$BphLX`3BS za5otq;}jk)*J3q?*+H`EYTU8jpdRweSkw6Ho)@G%*xV2WVI z((rkNN+W9UG9Qz)p$0eBH%X6c@C1;SHF|I-%09wRl-WlayAQ8ylGn zM-kvu8A1tpb}qaaLMx)bErfDBN+mAb*w|#a2O)K$689buW`_yWLDoP7>eIm`aF0e2 z(q&g}^fgJ{+;{@WE;n8b5^3aRz9z#AOhSs`O1z|gsC3cD6PlO|VOUf;LkQ2*3Dt9O zt$Ctvg#I{Et>jdFtY`hGa>FE~DC}j|>bHSwD>wR^J2y5n8Jc6gqHG&^w5{Npfs?qm zG1M>}9EBp2-E#q)5~VaN!aaF{pUE%=>n9b52T@=nI4Xd)5Ro?6{V6^XIzFL>ba3Qd zM5|}0w7D)X_BZJR>*;j;`6B-a{dA<_<kCrvJ&)w#Y-moBF^ zA!X%@nzy!Tpot2QQq;~NHAGg6Y=});PAx-fkep(TDCL2oNGJt%Bc=4Dc4JK~A1Oul zEm9ULDmC!s#Vt+JU|(L=(qvfStJAfIdGe4LegPMxIHF0Y)UpXL4l?Nn!LuFtqM!)< za-=%TsoO|(l~VzJT5dj4iflJh-Q`?^zgD6LQr%?P0;H7sE+M6qXwY0MF#;(?wgagc zxr8l-L#ZzoDWwMskW%!nAf?pTAV8B1M@lKN11Y7%YowGOL}BQava^s<^e(-THE5~U zC#ARK#t4(tB8Vq|6a?{NkR~C#EW%{qA*e%+i;|Y1(sv;|p*5yH);yYE${N%~u z=Vd07z68P??$J2HP!q+`8=Apb4r0MkQF(dQ&j4rQiIEY8V@T21>NzbFEJ9f(D$Bb{ z8*o&Eo|Y`b2WpX0fC<3P}J+vF`0Y?t9lk0SfRC;B@ zVUWH%xDcM`9U)DKKeLy|OMHR_uU z4pkP}atyEG2XM4-p&Rf)U^`{bU~L1J2aY@!a)*w4 zM}!*YfrCBZXvaAZ4wVzvAXKW;h318!Cw6i2CWa8+Tn;Wq=4eTM4Ni&BD@kE?hzc@S zF=;qB%!Q(AEysMnLi_}0l)w{b+*GEpRLJENu5n;H86!lgfQK?xpPv~hfq(y7P zOwRro9C-i(i6E8#n4o0Y}9U zP6(OB;HVge5hHU791S=E8ME7|CpX5L^hrH+x=#F3bcA6mQV3hLXzdwlcnpsEjq^%o z7{fcmJ|^k?UOWM0XD?pd$7J}Umr^;p5rLTiS1F!(AE}OQ=ok%IOpMv5c$>pBW{4w>_ z>9F3?d^CpY*Mh?cG>*{!ffSZrZ16oTTAb6_=|c-Q#+wWeA;fw^#bQDYP5UX40m2`0l!5gqS9I|Ua5NZ|W%svD(AEkXj4|NIhgggHgc>e` zL#HszG&Di|m0l^URt`9|1*~WvgHs0>+%1*E3JR`1W+2rm527IloH9XZE_@D-JY(Qi zzfi+3Dpy%P1O+CNQHgaT3>ipKKOn~naRMCGfDi%aIZ%r;>SJ$kln2{T`#f+o(=Z?4 zq-)?>(bB2+9E4*G_pn45VvuUBXqdw6z_bUW%)X1@F!PHXWg}V-Rutuvt6>zl7P2NS zscXO?e6XZGL&^lX;;;~_(ixePCRurz)nxb_LVu_rN^!ip29DZ?EwJA!Ng32i{7Q#V zLmD`;1EP9m_~I8!4-tdV*BCoEq?!PM0jF_9B%kr|PF`dXtb+>iZt4L2_=y zP_5=UNGUZxKuXc;JWR`7f>feh;w4gwo+U$TZ6{JnuFG)wO!ro6Hk>EC)y57iEfR=_ zwqbUeIH!P7!XXJ9xk+*F$Kc3?m>9dDD}za#tf5TD}j+*9;nfk!LWwsSSh5=DaN}^i z$;jaeARBUc@od>2%``hwz23gLV)M2EsxIpGUN=s!U)mxSwKnih-+!_UR);`Bn52^hJRzr5p{q{*fIw#h>JC%_>H-Y#QmHp6y@-;$9v}hrRlb2r z8-mh{DCsoq{L0MSJNy(&_wVKG2-2|zER)RPs&;8l@QPu7r-FUqUii)#It zIJ_!Sa_B}`s!*zZlgd}5q_+jI1-1ivKD;QjkfdJ%^r}dywZpPhp;T+B$`d922ta*5 z4p2QO0eTT7{xskSTm|Swv=;CiF?fM0@l!#dW&A&)O8XUi^rm6*zzdoCN9qPyO)~#~ zgBJd8RrEisr;se6F?3ZcAnF4?0+gn5J5^4U#m)8T3N~9 zkrQ2*j$eAax$KZ=D3gAST8Jnmd*DHp^-|?TDcM`){}rXIST&z04QpSOCrU|+%7fOB z8;Dmk5Q$s9%24G*X^qNf>TE(nwrZrRP?3`8Z9K>eqt*P1lo}kP%8AlyJQ zPn41yRlXvna+@KisQp}}yHq`*wIM$RN~T;?w6Q$!! zuqyxGqw0$PzgMB$Z@Hu7sSvfpM2Qbosrt(%U6>r_$ao`A3smH(ApMw$Xe&?(*>fa|;IOFdVE1m!7^&eCDjPu_q@ZW9VztI2t#7YjrNmYJ<{(WNo`^1V^`1{2A z_lZ?r68<|UTUtf_KC#jXm^@K_VtwVPy^n%;Yu1!ZsqL7jt!#4Bx7PFCbo7(JIo~vQ zsxxcZF6k4Nlh(Dfmw9qn^62&Fm-T&je!wcHEt!K(g&hhtHePKI*N&v@T)(~c4SX^@ z&9!jytr@*%>^F`a{rlo-TQcIOoSd-bY-{V5u*fEfCg0olLZ^M!KDxfq@als(QGv;x zUGtl~(`9J?F5+3Gt=9He{l|r(mrSR0j^2rDFPk$5%5HqHVDjym$2$L%`5>-1@X3-s zRR*|buk8HAtW#&&ZkpO*cF`}>v)uUHu)%Nd9W=P)-mi@sJlz=IW^U%a{&ft=@AG5m zozIw+SNHa`o!2Wl|9*pBj$@CBNqlFr?WEQ-<}7>Ia>;`>lXl-~w06jmuO{ULr_c2H zA*AU%LeC%{re(3`< zbKt(yEIjN(2R?n8nK|-{;BJA7oNi{-`IPAvK7WP-{~26O9**zmy3Taqi#{~7TKqP+ zXW*h|n3)S-FvG&v%yQs=fOF$fGcCN|YzMw!rkT~@&%xPo2c9^~%slwoSr)z>oWpE0 ztIOkOTliaZ9QbZ<-rT?~+;y%4AI{CphwlJ)7@Wr(Gi$)p=UDitc@F#-xJKM-2xXm-^>E|l=-l) z81{i{$-@`GzK>wv0y7Kdx4}IF7hP;-p?pCx>{|%?z=iXuk6_;-*!Pi{Meyg~>=whm zg=QAX*Di#8;2aj2SsNa|2=*<3ec;-0!(!OC6!tAPvkrU*xWnK)mY7*5p1uV3mB2o5 zUAWs)*tZP!Ej68hCuy2)__2`|%vY z-PT*!TYLnb>AV!rq1^jp3me7@@XX*R@f^;5H&|FEACG4izldix57=m7Blr|NbNCfJ zb9wkC3(MoP@XY78@f^w9ZMLwt`2svg@ke+T@Te^oHky~<`3`@M=NR7W6AK&5*Wx*j zv#l0Z$m8)W;#=?>&kdhi*aU9Hb0Xh?=exZ6XBIYzr{nn^-;d|}-0gD-|ZImAs>(D41N*MnLJ>Jh0Wqq@SM%B;K_OTPK?7YjKfYd zo6B#5dj>B03o{dZ!50{Z-53XO3wYEnjKdy`!!9%Xh(8Bsw-<4?+sqd6wYw2#;2idt z*%BVV2XVF!aR#o08}=g3_9M>rn%Q!`1KeS79{bE}B~RanI6Hti1Gk#H?MIv)M4at6 zv$ebw+y!uc2h40eFF1fWJA^m`w}JZ}M4WwzI6G)&oA^a=x4=anGP5mw$|1zrSBNuk zTY31Gu;v~T zcRLFEzJ+~9&8(D{g1Z3D@0gi=!wZhVzT>bD+%fL^E$ll1`@S`^c zXLlC%oi?*eeC=u22hQP)nf<`y&%nNOun*i7Za543&cnX5X7&@`0q!t3k8@^rou{9J zeHUOKxSQPVJnXv&`_7y3^Wsu)7r^;lFtfY7-~#L`gMHwB=DrtU-*>R@qM1G57s1^E z7g=UzkNA`_*!Ml`1NVf7e+T<6!M^Xz>?ywu?isk~@6GHtzTkV_ap4PY-WG(wU=QZIENq1>@|=70rp*ieLt8b#<=~DeYxvZ82F=Es>JwC zu!q5VTro2}Prm{Se}aYJY`NQ2Sa=NxJKOVXV~`u_WdmHWZ*7<^SdwaWcOj;L)Zt-kNZA=eUD(@19>L{cMDwPLwP5A z2>TwxK5#90_#@c&1ol0Wcd|zo7Q)*-wy;pX0M9V~2+wdH^~Azj@e({E_;Wm4^IpGL zXb1ZRcKr&wp2|DeQ`q$z>;l)08-BI0_S}kR2fhQ(j=cJB7TUe=?9BJ$*@e43v#_pw z1fEg66whwl`?-boEj+vPlXymR-xsjuC2V;i?^@t)fs6cI-nD**Eq}lkaIrl6C2V;G zTVBe$7Px2NqW_S0tv@hUuQ68O;(637%iMm5gAK3bUF(%a*fFq)ug$b^y|#$$VCOn8 zGaEEFo?-8ry9H0HFffoLVI`6*b`VJs)g_QrkxnE{>?blrxK#pqON=0rE=q|E72Y-= z!$bj*3~`dkaN(;5$rR&>WQmJJvPD2;kP%`^WwxBH+vaD>hE)=6t6{I4>0%=m+A}-- ztm^n0eB1t7>-3_i>^hyYLag@g8YjL$t$nABWk zHLq$=E2)cbjH$xCOx$y1c5XL(l|RX#k7KpJ7i`?*A6o4xTx&2deFlDf;-K_p8~W0W zQLPTz-;04oo@85qEnF`?WuisCcRnF=^AH?4(Y6I z;j7omi)8erBjsve=W4uMr&3Ips_M{3-*r`4nku7Dl^dwCA*zf%f!?Fa=u1pW(#Plf z6cc!RmEyZ&zB`S-3V1iKSsEVG`(^_$tzC4&#Ej>)k9e8 z?yEBG+f@1?%mY6dAn!qpg%{Wy&3Y7Alfk#MCfdW-Vzj}DA%IND>{L}TLp5oPU zr06z+H55hZ%tmAkWBtNiAjR)}=%;-0*E#eRPz2B#hy+YP8-NDc4KMA zLNXW#0q7lL7!VH7uPmMe-Y8lR@B!)r4S==Uh&=?lgQNK6FY1ttOS0q+A8obLbufFFQ`MAsB( z4g>;?018$tI`pG7`G-^$XOm`p-=mo?AF+dNX56~OvNnh}p0s5Y;Jqy@Q zZUHv|`q{!Z$Ug@@1wI1~0*BDP{1dYh&}Be06juTC!-_iqt%mo2p8;C&XoaI6hphxw z0e^sh3H%DsPY>2WMhjRLkPZw6s>A9fpi`085%>{lTB1J!TG8VZ2$us-k^TjE0{jL% z0%%nvp7Mxh)7pyHnL=6>>qVbOx*9+;hrB|wf`&65lx79Zj<>ju9-PT@@tl0NPgURZ26Qb^@G9=ub=K*-opw5pV(MM_)C7>VSjr&S7;5 zsaI6Q5g?V?0BxUCtP%jP$b2nOXMl7_pS}y%nyc6p<$D1*J?YdPT_#i)PET^Zq(ef; z3gt?){!*iqNu5y@WJ(Qcd9=Dww0o;MnjQsReZU8(2T&Q}Ntbw94I2X$8pk$_$Ra^= zpg%yB`U6yed``XA@~Pp9`BWh-zobK+A!-IlU+WC%2LUaCKp+5U0cahGpvVpe!hld9 z1PBLc)9eOx224OC&>H9fv;*1#ZGiTG9_R#6)OH1EA&CO|0NsIjpr6Xef?9xRfa)sj ziw7xEMlT=+=n3=ydaIOVq!R~FBbq){kN}XI2LgkDM1VXY0VJceMn@z4Hjo5Z0Sukk zmdAYEMyi5*&^#a)$N@%(>v=4~qX0=Va1_9S*}yDdCNM)p=CjzsS4dt1egftJbAc1blJZ=M2u~vX8A#V^*={o?q_gCN-;0f>;xCh(^eg+-@ z4}nJjRs0-y3j798xo5x&Kx>0Kfi??eODgt`6es}6qKa}l#)blcKmgDJpw3euQG?CF zHvp(p{-Az9C#2s7e35Ph)CYV3FCZ9l#^C>6NYsVE4rqh44QM4m0&Ia=km*4ytGsrc zA+J@1%pNcRd%;%$rF;jVIzUIBIzTPJ4X6pY0(1mA4EoR? ziaq1;7&nd?-L;#>MvfV~f9a@*GpHmK<^~4n3T(vX3CvZRXd}KI$6VdDyUK2Tlic?F zgPD=g43Ryjn{Ok=y$j7%Hp0CSn%b>s?=BsDF0!8OIA{jJ{fNFJHlimqr0X_fXd!DN zNqRAP0&6AJ)r(W$-6g$p8wSl5103~^Ys8E6_xq$dF=)CLu~zQdO>DcT{nFX_LBUrN zYa)+5wgMZGS;SoHXm_qni?ytnziGixo=f(Cz`C@ErYWYDf67Ra1LyBVyuO^AOB zHKV7ks6QU@gPQsgjk6Qe#-rZia z_)p%}Y7#x)V>QT4ripMHXupYY!e0-XI#^n9>9}58ov1WNHPq9ZbB5EZ!okK`4XTg# zi9PBJ2P>`@+2dI)+W-o^KULfpWAHrSQ?R7c+j{}om_uVXO1hl}! zNT?zvOu|s8nv&X(yLRtgc9((UUM`v0j=F*nL!D=*1^4%uQFFsTd2!r(%!@LY zqO&2|)pkR4rjvIXUvw@vOS_Wo;FW3fhRcifLhr`)2MyI17w`St5P zvIead)bo1p!}Fc1iJ15Qqt^byy+Qsh)Yd}&U2Dq9@|XUQW>gamC$ltZkE8ey{?V*= z|1U>J8&s*xQ8-P3zqG6V?%pacj%|LhyKFP281@}U`5a&LVaX?Pe~djIhaB{ta%wt> zfha4vJBd+Klqm+^JBxi&n2q#ab@3I1A==%5%ZHB4FL>481I4jCVt(qh+XE+VPCecv zyvGi?$rk>h*yO7V|EVm{yiQ1E2=@eSTJJhvhM@EpW~x*v@Q?!c4yK31FS6CRfE4~&YR$Dzsd(1 zEwEN%WeFFBA22s}?asm6DP3QEy0ZQlwVSZNV{KtVq)T00#J8v_M7xdf-m|1jgKF9Z zK~weAPuP8E>APFi%dN_U27$;yC&-5fU4_?l_^ib=`0Ti=2${yZON!7{@^ll6r=eo) zmcjNt;(A0+=M<1w&x8HLb=rl7cZa_7o}pF95+w&qxDFn;Hw~WnQ(f-b4Tm4q+IGh{ zY1c56z?MYo_;NS#a5}3U7Oc~5LmV8HT&3QWxH7rB@|LFEm-xJT>abTq#}*(*-h_j6 zK6S*d>6rF^rO`sI-&O08yLOjigD+RbHmWn!M(I0Qr8%~ubKJG77#%xw{?0M-=df~h zm^$slH|t5DyLPAI_R{7F{T#nNrgk4g+Q?H>o1yIzx1D>}RgM(1nkP(e_*rDQGYhIK zOf#`}CDs+AXR>dl>vcu9S*ZGPT`_JJM#8~Me!E`u+3S0c?Ttqo*svh~mhwL2iyTx} z)T{XZ{kBU_zADe@>Lre%ta}PHJfTrJ?^H_0w@;*UjR{`!W~1^FwTiHZ@ARnV^gh15 z(JJ4EoO&qw!Hho^Zu6;rr#$DXmx!UVdT*uj8|@m{J?+r(P`QQ=a_XaOV(ExZ9lMP^ zRi4wuTP#Fb_aUmr?D6jL<3>JhT(0qfw>UwyuZ4yi>S$xzD=lYoX-c`q0pxff$76I4 zc74p*qVk*{yoD!6?a!g%4h_evCj*+j{N`o3My-0HH-~du)fW5KU>*ryu@ogjv(>e#tE8Ab56WCPjp|aZjlV*BLa(9Y#K=bMTT zsjPPMW?=QPeXs27om8$t+aOLAMLgo3&(P_`lgo3Qn~CqKXUcV+xCZXmqPk;N#PM>C zR?URdJk+jT02?ZuenvgF8%^Bx_*X!1@s^#t2xgT^!je zz}&|;{)dmDf#s2U-aA-qCJpU+RMS9d*O>=)Kd2fZ_%dA9^=nJ8a9@C#v_Dw%BziPhybBtl-5A=} z*!5)HM_WtF`>EY2n)y8ZS@h7}b&wO}A3|HJU5Hq^6s=Yd5v@x=y+VXnG3rbU5f6)T z2FobMI}GhE(|y%$uI;ilg$97$P+=D-2ocMm?ylX2I%>z$P<^W?>MRDxpB$i62d2(gb!6h(-#k8sM@ZZ>Vc+O+S+q@=Ov1qx6bl_N#_g&2lUBE`&wD6zpL)-6O0 zjoXOJ#KY;&7P2PxJMf`_5mTT?ThVNhqBpplc9%}H6&s0f&`um)gz^L0ibUsF2ZvuI+2EfsR1Jn-wygXfAi&gs3?>=5v*$vB{HD# zrUcC1xfC<5ZZ~mbDf4pIF7!MU-{Lp>X`jzPN!sw?z?^Yz`9Hh$MII zvd~%E4jxRe7cjYezB`$PJJr?PEcTR?&v$oizH9fQrd@3FNt|EUbtl%tEIgOt1ir~E z+Ac%Mf2_e(`r0hKR+rbLmunK<%b17wWf=>SqPmNRtI;RzBGtOm)q%b4-={ZqSPT5I z&S>`isRglaIjiwzA<`~zy}7YqmgVY*-%wm#h*0du<#4@rsc-z=`}&2Ke{Kv7b^O(+ z4$-by{UBw|mR)6~v{aA=rlNKm>)vJ`l|{t4c0&%$GE8_(^f49zSzSp?H z_g=r4Y5i5MgFXSl&9CAW%^mILSDSu;eU4RL_a!vcchLQNh`^PY2|ap>qLo-WwX0s= zxAk2dz5J8aa;pJ2mg)Yvr_@ozmM*ZD_;w}w^N-F7lvF4Fo8b70H~LFsMdoT)u{l=kT8*Bl1FSBIZo+2`Yw5l-Ryl`{a!)^TW%9tsFil-S6-VN5 z8Y`yZEaI-+sya1i=aJU+;6rVbaK5$ido6v#M4fF<>nguD>{@qwLf^;?Py~rg-EyA?MkPciuYCZ_Y}IwTFa01x$|@ zOE)mrp_9SW2X`s)2M;WET&kB?E+n-e(JuduJAJSI=q#srxmnqitfo^8?G=jvRDG8THLyNW3^febufW_NaHoXP==Sz2C*#U~+?Y8F2zz z_+97Ume3-k&Q0{y6MYTQZW+Fpk`Q;P^}ddBkL0r2#l;_I1$>%uKY1~7)VG${i84^u z{a^Y>-hot4xc`gxsb`1{RYTg9Anv0sDP@4L+lb&hkSJPj1dnj-yAiW)XRKI3bm}1S z82Rp=gB7o=oU+uXNz5`6dZl_JaIk2*3Gb}1f;nwQ@3iZPJ34M&oj3i&RGb3Tk54fb zJ8s7QxGqWlX0|A0+UI@Kzh8VGb0om5u|`jFpn>x$ zd1+{h7y}JyOp4gN1+8dT7Khy0?(uSjSAY!*@DGz$W9?F7m!8r6HlJ8jr#$CKig-n3 zwQG<|8#Z_`f1HDS|fYBt^JUasMjCVE06M7wADwEKa|>r*Z+ zE7#C&qJB93kjU^}5LTX(ohBBetkf%0Y~RX8nH)yQU&Ow-w>fM6amR6!y9=!bR}^w>cEx(8}jswc;RyrTTY2SFHr&%t8X zr!27NKi7UgN2y)ADf(`N)mj=DLnpZa|6u>nmOAY&>20oGet+V`t82)i=ne?SuLOnZ zGeniL;nb>&Ak}_Ms2S$O-pf^XwDoyn)n}|p{ZI3hAbkdE53?=@_bNy0@7}yzIbP{@R_~lSb0v5d@%rJ z-G`v8D_VIJ6_dEGYMY7W8in~{Ce^N8c^y~v_N3JK(Ot?lv`evv$Ana!kQ;+9|4rX{$4;G@Fv$7M7Y2%Tf%b!UGaO40bbG{G z+gMv0N{cnySPQ9skSN>6JS9u4c%f3`cIMftSs&%Ypzq?|Sz%f4aT~+ScY}_e?XKM*!s(Dt z#+<}zIkBmlLCi}Dha-2wnC#I>BZfF!M7ZHuDM`triCzXT1rH~+=;vGUw}|tF4=mzv zR7Lv1#V*0e;V6ep&dwe^J~PG9n)pC?II~Z4OtJsw%zALpBc?>D}?nj184Yv{~ zi(HKqPad%hnpl$hr>AB+9Gy$516pv78ykPj=Hlf;$W&xSi0NO z%I$#^KeAG?N2ZTWaSWx*YVdwYN!JO9N$#+u?2%85a5$DzH>r-)P5d37l#z}*IgTFW zCIz%dO2S6uDt=T%N)M!DWsS^gkTR|=rAtB|EB;-04fr;sr1OxTy5}CE_9FKorNI7l zkL2Hgc*!@0S_L5!@Vbnn2N@8cQn^(tI~)PX#YpMeX-H|AqLy4jq_oTel#+3Cq!jd2 z71KT~J0&|=ddOcjEfQQ~GI268-a#eiD=3sIa3S^Antsg(;Ej66>x*Fx?^qRL%j@f@VY_e0i1HbqMF1S0v%{hdgWXOUvJj|=7H z0qc zDe1E;-VZ5u2}rSvL`uJfSn(yS_?tN7$L!4grk<+e3eI^s(i}*4kTM?9Q^qoG9gZ88 z{+uNXkZ$6Kq@-jr(H+mj%fP2v`YTZ;?;369_Xv_Pmphht882OtwUMdW4IWP)IoPp3 z#<0uDZA*lV@YKggjLb@LIN~fmGxk89!DWdZ?Lc7lfTuJSBU~=+yKc*>vfsF)3N&9d(C;pGY3ptxJ_>teq?4Lmvuin`#cs)`&cxY1g=u!Bd zl`Y~=9NAxT+B2ALJ8m1N%5*e47blA4v7 zG-7;4(&*%2Nm-9eaz_=?$rzbVSX!`vrQ08Q1Sws;V+idpqj(7lxdBZ=h9CzaWlXd} z%IL3S#g{=!20wGJll#OOq-3-oDfz5NO8i_)KLIH>v?MFOHB#~ov-D-U5|E5;4mL9w zo0OG0Vzk5Y4ZJ-1kJC*L&&Qh{XN{A^z~MMeyfpb|NNLjjNa>QzgH@xFb#gjpnuEU; zQW`c2DMO^HCFe6ED#7W_r1YdADKp^GKx2^7Aq^=){Hjf1Qp`ZAB=v5C6o2YlvOH4! zzKxy8^GMRw&&@Xjxm%FZAd8Vw;B=%Paw1YHl$EWVrP^-IEH$pAR$5*3Z=v;7p_N;> z)@cq$W7VK?oOV{Ng-1Ibj;5+XtvGFz3JqxCUJq|h`l2eLa@PRe{whC1bf`mP)dRdDxy}j`&}4qn(I{8 zgQDG6VJx#&<&)j2pc>`5Ral6}S+#^pLkujT@(@c)sDcoW>vOs|PHm_h=PX}RrB(Mh zhm=%#)jjS7^lbteIn?IL(eCpWGup%zM)S5%8P(&oPgH947S0e~RZzp@9!obrK@v@E zt{&~Y;;YhXdYsEktGt>X_Zdb|QzLFvm1t+BGAgW=$32uqw1b%-B-*_N)(KWb875^_ z0VdPRIvhg{6MS`EDy!0Jdz^L4sl3`WTsem$k~lmMh<0u$r^4!Z+}BWgP!=0e&u z)$zDqWV{<)?EZ)lx9MD$QO8FrsI4*K0((8!@CLKZlB_ z8tu&VQ)%@)&U1b$ub#)gR+bgTI`X0BN@!#IaA)-#SvwMIl zK)D5FTcdC)=JI9gG*ef?;#>)Yni`>{gnCQn?t6q9*;Q~wuqwnGg^mhTc?~@7wJ0Ro z$LQ(bN{f*EbLa9b5w5G$6WQ3k0Wa@4ZGVQw5ayTA0Vz(1YF+xFX6$cujC+~+& z5i(Om*O8h?on{j)@8{;CP zNwm8sOva2ujS7f%PlL%MGZ&)07BiaId8diW^LU)mQL4b>ab-kF?O4j(TM0EanqDT% z?@=nRg~#2Oh1ASwR8ou&q_w&d5a&D{tu0Y0Rmf8>+=blN3^vs5c?lHw7lE_$H zU2ev{M_uv6x!Vzv&UG1!#FL_j6_rWt-T{*gT(Um9TvWs(>w)_b2^m(hZcl;9TrjNM zJ7AK=TqJ(8ENOu%(e9WyvvrCa>-}>usS%SkG}`q6EJ|Ie(M*d|X{|l(XriQyB1Y^O z7%dVQ=YEHfSMXu zi`*N-imOr8qun!L@djhbcOQX?B`rsOrFdGAsuWYwseNFwT(QRD{Cb$olp+SZ3X`TV zmyCEaG?x=;%&hxN(!F9aN~pt14Qp+bK&iyN)E<~GSuN^D3^s?};$lQG5As!ZcVs*Hd*cLze!GcqXJRkNqj{-JTMCkU~;vQ`}+WR7&%GZpWp@*eZJ z(|WO`Gm~|RcE1XffkKnjiFSPnV<*%l&Ka4g^7^uAOEg=wxUqCK?QOU3^>#7EA<_{= zji!IwVrEC&gh?B+3iXV3_wGXj!OZEr5hj(A^(v+~M0$+;Lt~0RW_PU&;lUPTZva~g zlN^mMbYF&_|GjI#4t4`aU*6zBeqkkkS_p0@8t4zj|#7Z8%p zG;8;X=nX5$xom%PikaK70Wi8UFwV7rP(!t$cbxkpLedJxdh0GX;K9YDJB%5dTgLF< zO_*5Hc`Q{w!5YFC;w+~%1{wp0JLgnFrrjPwW^6#3Y{@pHHPg~mL0StRs98|taEXwt<`6P7 z{gIGSNw+uM>~e+z>qHK$gE17&5MmjVsZYz+$uL`wvB~Gz3w36k>pMd1`w4l**rEA^Si;au%`&A%TiAk@vU zYxaaOVu^i$PzTYuzaSJx)o6pjXlI3SDlgmP^o~;n*-dl&9meCh!v`4%ihy9Cfohfv zLCPlth`u@~57cpWrL<5skb<8CQoz$dDm=}S z&mc>JIY2&tC8ee3N~T5Bk}>`{lFb4jav_k9NU6?JA$%T`l5(Y?{d+0tS6OwL^sz0_|g3z@<;?{v;U<;5sYzLy>0p#t?Ylplc7SKR-HHkVf^-?Um2c@WnT6&SP zw2id5NC{?Y)?!V-_=uF?C@$jXXiNW~lmf?EdXch-PesbYG6N|Ey@V9Ixk&kll;Au| z%5M>b>l(|w48X-ONw8G3mXx6Uh(Y9XORf;Y=Rql|m0TqKE0$a>O10!kf3@?;;>J)| zBN{#;#WD{mLwu7Z-?ZXIRzm*?Qd~M}=^vERG$+tY)aRD`!m<-7`JS~nGRG+JoTU&c z75LiX4@%L0W9daoMg>SI@Cs6*uFA!dqQ7qO2c_tLw(Nh=+$-gP(HeANar>vEaNXfSxQdAWzJ<=%OPy`Y2 zuodzDpES$=w+a@I8d?<=DO`T$BeIdD|CchyO3>Jnkw_V`aaIO@B&Dlb5HACvm1Xxw zQleUO@kMsE?EX>a{G;OE;o@;O3J@uu|HbAt#}PsTNmw2Hhjy>zWb9&%!Pb(n)jgWc>Z-cduqa|D(-oZ*2eLyI1o3@8#)24{lna z2A4JWznjxHMLexRFBU0RlW&duuv7S2>)P{7J0S$DjzoNW&B(0)f%Yr zi}7y}{=ptrp-b=&Hgkzri%=(F;}+xJQm@un%~*f9RF5&wH9jaO8i@af2+J&OVwu;{=s&^ z9#QUB@NXslz2eo{s2#B0tMKntuhvebzKVaZ;2$hO1+2zD*re57&8zZZ!(PR|*SuOs zHU2gHTaACP&MI^b{=sIh@oHVwN!Ym8@NcbG>#k<3#lJQ92kWU~^Y9P0B+siQs*AAc zYw>TLSL>q|uEW1P{DbvX3F{NJerg5R{^~Z@0jleUL~Wp2%XN^_HYRFGst?z}YBSel z<$gU;8={i9rl=iUhpKX$61B%wD%W9ZFV|ERusM+zH>0=?SNUAiRrM{2T80|Wb%gqi z>qr&4HBrk{Q@D;&C%I;+h;4~lwwl3pv^vjqjEa3DQ5&n~aD75uw#r>f0dpHl9(6Sb#R64z;J z2iIp*xpxw^XH_cK>1r?687g3BqV}8`#r1iW&-DdWeOID3Q;p~PqWX;MEEW20qBdJi z;W|g1#S6imm?q{6sW1PL`)mErJ?=j9`yI`x7`+dgQe#Y7R zUhP%21J?UJ#@Pp6?KPG90psj_#u;p_3iyz52AlMuS6ip@VZ%OPoPFfgHmLC*G0r|@ zoWWjKq4|t6*vx#dwppEojr)jkcEGD`RWlCYUq1f9-cYe0;~#9v$6jr_x(J(o0RKMm zYCF`zPw?+!{DZxt5)R@YY{NmXwoBcHE%*fgKJ{w5)!I+-?;!pi@@jikpF{Wu+XdUN z+=ub+Q~W#Z)!tV-V7(9F-)CO!LzVg&{vF0YSiTB4f`70{N4(m{DjzoNGyFU1)efrh zNAd3n{=p8Z&|~-qn|aKueWp&r#vR4K<6iBknsFTej^Q8dxQac2f3PJdyxQmLB5e9` z{QKOiom2}y$G;Q!2Rp42zQ8}&hA+I@m+Cfb!RPpQ(yM)?)}F+_FYxb_S39rzoWeiY zF4zU-K8=4T@$a-(`&R9M^*)7vXS~|?D)kKhoyI@dMHTQR{=p`F>D4Z&eAuuv_;=Q; zT~XuD;@_9}2fL<1zrsJ*%&)xKb#)Rp?kxVD^J+KLjC1(+75>3~QL*Ro54PmISNm06 zgiSw(e_wmG+iKz0_;()vzVN+N&;?)P;Wu9AJ%`Hsrk8s3 z0xo{*)il-TTU>Q?fxzr9=?{9JOd#_eZrGAf#-{B(6tpa|)McAYt zj9VFO*!Q@2(YTde#Kj+Q5mrWp7T_XmW`S`lgN?h0ioz(rU^6?+*MVM{I> zw=&rDOSpK&xRqVO#ml$|3sebL=|b3stH!Miwt%0r_P=J_%C6CcSMl#h<5u<~{=s&^ zYAW}2{JVyK*Ns~ltoM)j_mgoe`w9Q9;~y+k1>C?t*rXfAtqeBoC;a=_xRw2ke>d!WHf*8~-CH&JV^MsfA3e6Af-^?QkO+q#D@ck$&Ox2<`h+=4#3>pO3z z#%*ifN!Yl1zIt;F+FhTaX^HddX}$gR*pa_coE))axwJwdDnXVN@BrO5JU7N z5h?l(5kvKI#SxF|sUn8ydqt$`0d7Q^K1#%JJzqq+UcH32N?W%5{Sw;nA}S=n$JhQ3 zzLI5mmAk!qHSJeT5AoBwxMlx#i#K`|^@srWBiQN>mD7s5ZdTzvhK}KO(UlmRIyyzR ze%V#^yXCYxu0YY2aKHy&%Pe;!+j&MH%F^7qp-gEb$$awRRu z^<5*rWGSr8k491UKOS}T=-~m{)Dm^#&7b}^jNcwyO?%fUPoEe_9f!B2u)^do7_~1O zOiWrAG8T`zOKIz!YkEl9qE6R~{m4urS{TOZ)wP|jp9fOELRYi-*A#Jez+g%9o6$~Y z))Q-!^~bzDFMB_S0Q)};lG9Ve5?p+e4$;<(hatB@yL;1pr8 z7pEm!-jB^BAogjZlP53vT0IZQXSiipn(#}8#^Fe}bn^cETf*|mKuW7Hh#lWsI{Qst zIdnf*I{PJ_d?9|((#Z=wNm~K5k~c__aW+!o{lFyxl0e?{iB4YBU$%5(EZs1vDWCXJ zdZ)2k4LxIoR!r}ksrBjD1g-pHMBXIGTZkqg3dlcn#DG{J9b5tUfr>ynw=$3ptpWl; z5U8qO$<+E5m6!ZC9QwPXv?@8(NnQig1hqh2P!EKHFi;=V26ezgpaGD7dzN=aexM?# z1pGl|5CEzGdDpic$XM9{-Uc#8-UYkC9MFl> zI0W7YAAt9O{G?G@nR1xy9}{>M=t)CILbZ4e3`0@Z;G!VFataf zUH~tGSztC84ju;y;8E$$<^-ZaH6SnLRwG{nGOJ}R>jx4+Z_pk{1GE7xKs;Cq%8+gq zawU*=usZ4GcRX){cfc9+C&3rsOK=*}-i|srM>(MO%*Wg#d6>uF~0##&v z6NN;I%#`WDXXgZCed{RUBft%0#>niDnK1`0Gow4`2D0Fh$iE?_pQXS1f<#ak$TY64 z?;5McHDF(1{FqFBMN}F116lVgg7QF?V!1bz0>$;%C$zvEDZL~p0mMX>dLJOkj_>sdC^GGf~nh$Q_vi^Ks;yx9s#XDYtR|A13f@@i+4hH11u0mUO8PKi0D8#0eC@sAVXB7 z=p?f)KnjttWF(d83B=Pr;4#n}NJ}_@=p<~*F@&=~f6x!mbNaFIS}pzDc+KS+C0f1Q z1T9W}tn5evgTO#A0E`ClAX`tJpmoogKyW-52c7_9!ENvrI1AbyJ0gi$r z;4|1F#3Y4W!|u*WLnefNfw4*ev6A6M=Q$RqzT}1y+LPU>R5nUIq)n zOF+izeB=V4gLz;sP(bv;MJ@tMz+$ihEC;e`uLiP!t_68AZr2mo2sVJ%!B(&xya}YX z65atsFL)R10`GvGU^mzg_JV!jJ@7ur2jbjE;6rc#90rGgR9IT52jv^h@i|gFmvMR= zh{wmk2_VgR3iJS?{}M>Ii2ZNi0+80Z4Wx^1f%D*3Aa>GyUja$~HL&B(5zesAHh#R(%q2$|Al~E zh*Uxf6;I9qyK)jQ15i9V2W)*~jo;yb2H+u3A4uh894!Z7@DL!C3Psif@r1KLEy6YA z?plpNFp!;XLn3|$GJ~tYi-4wt?}5AE4sfC?i*z70AlwZ~0BN;iNEh${Z^MfsCB8T) z1xkWSpe*o{yK8A6TW(*lp9B&ix-yoOEqOT*03@LwsA$Q`NPkcj1OahEysM5B&t3Q^i>wXAQL#&?1Cjn(4k9E1NMD8{rOEmcei$kJDG*&(&;@h`oj^y>LBBIuYd18O zU<`-`Q9yQ?vQ61X(mp_XPS6LP?3ZNU)CD*2t-cP1UMsF1^iEZAxHk;{4g?Z*3i1 zcg>NUQ+}GKc|>@l@P>~0`uV9^fVND3_$e(w_j`&oW;oD3qv?k=&y_iGqG+a53w9b~ zA=fg#`;^wndC{qNdRnU-bc47Oln^#|>8qtK{Jz<#4TuVF93H_aa_X7SXny*h>6(wT zSP^|O=Faj(^fS*QLyG8!;ZgR1PERi%bfS5UVv|W886FwlgnLpEV{4GRd`HpPaVuZD zRG9I=B6{#NEzCKwh~8|v*3`MMi2e*bXd)@9QWY7Nv`p@kmE(R(eYVHYvKp43Ow*c1 z*~d!ldg14`e%Ho-;MBs5w&ONT+R~({bhk#E-LD^gk|3K>*Ct%Skv%ml1Y{2aI<{GV6Y6k6Wb-C39 zR>#^Mn&6|)pYgA$%Tq1Ma(NAH3Dy+s$|AYvspb*)Tj-j#k;~)@Q#+f&1Nh(DTS+Zha|I@ASM@#c4(U zMM0LivvWy(&rFgXmSk3IdF)31qt-GN*8BxQ==fC^g8#j)Yz29NvF=!SOBlATj zMrtX2#0xlVpI^2A{0s9lW;HHqINZ3<;mXdrrSzRx-go2b3tIW&drBGm^IW~(JhOKH zoU?rr*`7_gt%7^BIVw3vgh$YrW>fxC&bG%+x37L`rZzOlKErFk$sfZzEw3_z9HPS+ z?9oh{LRW(Rbx&9Y2HB^XE#C6{3lXJU<;ajFL!5oQw0@R8i?Yu@dvV2WKvv z77P1?v~M=GTd;NS)2+oFGwuA+`a`qK8AmJd-AY+~g78jd^^Nc#`>eF5Hl-X2i|xF_ zNZAlCI89Ce8p|O2)U-tl4^$bI@m5JIZ^lxC@_NJB)XP5h?ChKC$|QGtbvYJ|Sx;H+ z>;u(?H5s`2;fJowBc_R2;~wSp$+M}4PX&DoGRQt^E$+FMXBt(%y%)7694eNNkVT_zOi*mL1_(ng0jY7!pn zuuo`PSH1Vj-=^KGMGQ?Y#U84tFD7k}eRkWWQXv5)r`B$S1=SLZ=KlI&ESw4cdchnP zF_ZfhWvO>8@Yk=tMBJqnMK1t%{|ic*{`Y8+&*-!_WP^5*9}bbF@2I&{qy#=+APREz^=?AZBLhJ zeuXy^c8|~=@pEYpYc0}Wn5$I@dOpZ_9L{|!|KZ1am-+M{<}x=JVJm|4eVB7^|7EUr z(eD%PbtPF~<~;n^%sOv0kM+|wR@Hx+$3p#iRXu#Z_NjAVuzq(w1I|8U?j65M<@?WC zIMqjs3~$^}vV1mJ@1WCy_NjDTU%q-Ze)(s23oZ5q>$zA&*$3Gb9erd-`lmOXg%ho?B?qhnOnFO!Y1serauq4uvtXzxu~lWqme$OFtvVSS-G&r;k`j`NpAml=4xrE_&M^ zGWPjsO!P>(dD+M2b@LpqA5^v6YlSf(q54kJ2H6MgEe&k=_R)*Uj}=-Zgz7&^?)K4q zzW%K*F5Nix!$J%D@VWQi=7KCE{E!SBzODJ!Sq2Z@12;lqh+CmeJtVN zO250yRP(!87!wwzmtI6#^CUw@?nA@7o z`*cJVce!TT%$KJZTD%yh&z9Vmvm<2r&Hd^kiu z@3MFHT({9#<~jp~K_CmSeJI}f>8D3;?sTBI5fdR}XkcS~<6;W4kJAe%npi8a-q^WV z$o_}4IgRzN7c>3s^Z2qm4DUJUk*U)R3+_0qD2?@oOK^H4;b7{~G{W1X%9O9xV@>)np( zwV%l=#`Mx1sdrk+M#DZLG2o*)?k}fpT8D+Keblagq<(lQOJ!W7{_X}ISgI~#FWxp% zk6DJYYowmOjHa-Ud>nB*_EyKVZh<6^WJgXTPmR=Y7Gtx%L2IP@wz0?Xkun)1!pE*h-*#tGvwvWjni+!gY5GsGeUz0=gl45*{R7* zUGl8kTpzHKJne%f7tD=+@7Pzh_l+4J%G z0pV*~>UV|TYN=O#1s)WscX)-eGFq9_^5pb7cRhWlyUD4c+~RqE)k@FBGUyLSs@j&inh(^DX%~MDtX$2p+sB#2t3F>;PRu3k?Y57I(wPCqoswKIF_~3LsmbKg60^p zn(4dnQT^rBJi_!&(04MNg6yLwKdty^%U6C*wEqAHCk0?XnXykwS{>EnI}$iY+~?@ z-N(PE#ZM>fg{WnFJ!bv=+?}%<>C@L}J)Ha7>u1+6hV3&nt2w_O(Dmw7dD>)231{s8 zxvT$BxISPlW5%wwHIVEY>g(6C)%k<@Aj5-BwdR9!PzU{Y9160J-rW7rqEm4_E4QaU zGV5qe7KDa*bWv^xeF!qjKHRhCpv(7uo1Jvi=nCWe2>Y1N<~R0iK2WyFFk*O$keQIvvK4hy@2q#CbAs%nKc62mck|9u`Co}e zL&IWyXMO5A>ht%l(daLRh&42vf8QndTh7j?USoZ^++6;reR@BGD&6!N8(0^@y6Kr4 zsF~Hr)>7KR8QD!QwULZ-`8rU($+?vA-lE>$cm0_5kw>l=cK_YyoWAsK^-#&M<;mAV^=lD-*f<;6V+OFaK6FLLe=6tpB`#1PL(a4?FAJI)e zBe_rMX5I|@tgBhzJ8kSvELgi`v6$6OFZ((k6s@cec%6Ro>8_7^9Z$^1CH=kEwa6gf z?&bnf&^7tVF3;C9pAsV2pmRE^K5-MN_(CRJlC7N2}+ah&LZkIz7B^Wx#>`ek8J<;5U&iUt8qfN!K=I)@Xgoh%vIekf<-+ zg6sA=F`eo7v*=N$O9~rSN{c7@3(pnF(+-pL% zO78z${-5V=HO{8q`Upw;2jyE9_K~)ihdkEv%VvAzdkMaUlI}YDn7(r>!?jsI{YUa} zn!~xGUTvEeEwiupHpaHk0Dbi~ZbqC?YwSN?ow2-TSf`a9qj8LJvVMU6^EU0%Ap1Dt zrO&+c$eKH)S39-IGQ}w9$RPdf8x+8Nz4ZnK)=JVJdXpyk!!^;^vwYA&AB2UZFlPAX z!NwcO+>mp1yOm6gxFk?kL>ZSR%cyOMM zmrZS({mID(>)y!1g1e4%(KmzjhTE~QkDkq+adyqQUvBa|7!e+0tkGqX^~u|5X8W{S z|1KSSZ#ujru+XA)viZaoTzT!$-E;R2D~w4>);}R_kbMGfhe;#vb&bD%tk7a^^8B~R z+&(h5`9%Hw%wyMIE;QIr=5lwAsx@Iu{hg&fg)wK6^-hx3K880(RXOt1sLh88E$oAO zk8aEy_`847;=-6ZL-fU@4YH5+eKvnnpU`P)OQFS}A^Ks--98NX=)EbC73#koRA^xz z7hF9vW75uTZ=5KM*)c>9-a%UXgyA2jyr-vEUl>zpVV^*)UdPj>0}W?{_7>3aGO zZCr_GM;h;dIjmQ|DtXz5_cnehdBWZ$%h|VuW||Yd6;i%*Xt!s8{$$1a(z$$>AY0gu znR>Ig@$wHJhm9G!V1S3YqV)*LLf$j{cxl1G$v9C7aTgiihQ zO0{^Z(84~jxN4PU7uUTL5?mNlezZP7(%MHHXLO1xH8r~<52tqd_94jI7VZB0%y+Ad z5o^|L;Anll)P3S;b4~rY*ZhM=j!hltcmK_X>0P4|Yqp#3iH5zU2kp}0^+CI|hB-@F zHDoD%I;P1d+PKnpM<=DGKf(F;?fM?6bG82Fx}SA5XS;s4ajW!A-tzO<14;L{zm=cv zy0)svKgQc9m%sUbX30ezD`u_kX4;?b`Q$5!>p}uH!==0_{yj_I^NS2Ty9-5G6z|6l p?A~H*)6W;YW!AEG#P+avwffrjLA$kmn*P;Cnrr*YeOjNf{|6heP_F<0 diff --git a/package.json b/package.json index 5872e64..5b2ba76 100644 --- a/package.json +++ b/package.json @@ -15,6 +15,7 @@ "@emotion/styled": "^11.14.0", "@mui/icons-material": "^6.3.1", "@mui/material": "^6.3.1", + "html2canvas": "^1.4.1", "react": "^18.3.1", "react-dom": "^18.3.1", "zustand": "^5.0.3" diff --git a/src/App.tsx b/src/App.tsx index 8fca888..bdd2da5 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,5 +1,6 @@ import { DndContext, DragEndEvent } from '@dnd-kit/core'; import { GitHub } from '@mui/icons-material'; +import html2canvas from 'html2canvas'; import { useRef } from 'react'; import { useShallow } from 'zustand/shallow'; import './App.scss'; @@ -15,6 +16,8 @@ const App = () => { useShallow(state => [state.images, state.addTierImage, state.tierLevels, state.editTierImage]), ); + const tierListRef = useRef(null); + const uploadBtn = useRef(null); const clickUpload = () => { @@ -35,13 +38,32 @@ const App = () => { } }; + const handleDownloadImage = async () => { + if (!tierListRef.current) return; + const el = tierListRef.current; + const canvas = await html2canvas(el); + + const data = canvas.toDataURL('image/png', 1.0); + const link = document.createElement('a'); + + if (typeof link.download === 'string') { + link.href = data; + link.download = 'tierlist.png'; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } else { + window.open(data); + } + }; + return (
NwTierList
-
+
{tierLevels.map(tier_level => ( { ))}
)} -
- Add photo - { - console.log(event.target.files); - if (event.target.files) { - const upload_images: tierImage[] = []; - for (let i = 0; i < event.target.files.length; i++) { - const url = URL.createObjectURL(event.target.files[i]); - upload_images.push({ - url: url, - name: event.target.files[i].name.replace('.jpeg', ''), - category: '', - }); - } - handleAdd(upload_images); - } - }} - /> -
+
+ Add photo + { + console.log(event.target.files); + if (event.target.files) { + const upload_images: tierImage[] = []; + for (let i = 0; i < event.target.files.length; i++) { + const url = URL.createObjectURL(event.target.files[i]); + upload_images.push({ + url: url, + name: event.target.files[i].name.replace('.jpeg', ''), + category: '', + }); + } + handleAdd(upload_images); + } + }} + /> +
+
+ Export as PNG +
-
+
{tierImages .filter(image => image.category === name) .map((image, index) => (