A+N+ywi$`RyM|a!-OBQa1`(
zQ5N}Fls%XTm4tbh|2s+cae^F-15Kgqs8RNUf*fg4{Gp@9e4`DVHSfNGv#|VAwm9r5
z<@uT$I9GnmTwG&!ujI-qEsXdhE4e_WgAs3<&$(L4P8?+yDUvu)VV@D-Yz1fLD!Xx%
zJ*JeDkR3f9pE|5Ub>-!BC5Lqe+vXkfIZJ+4K6WnI<)Z8q1(l^?U5v|Oby$(?Mnz~=
zun5@=r0j(SIb`GzX)Ef`<{9-e1*-wkqkt<#s{v?9X
zk?cuQ_Vprlgk}5p8;9()O!gB)VjGHbM_1(6OykUysTFzW>73aB*}x3ai%%Fbv6NrWMIiX3#EDZ8-|T6L#cko|d@WIwHLcKedNGr)pn
zKbo?u8=*B9=g#OzcC{&c!;v~dj_h<(_KTzBMl=z3F4^s->={SNp}6pvROREx!iu$3
z`CVf_c?u*((
z1ZmUwn~l}QRUtd)lpXbm(}XiyA-nmMUH+7`COZO^odSt=9iD-0xi#5i&vdD`@0`aPJYu(=ti&-3~Gh(n4r5TVG2RMe99Tv
zab50Ul#murxQg#Jo(pu(lu9gZFvYlBi-^FIHa;MS4npt6HMiBAu%QWZXe-B%C~Wv!
z)Ox6mxV%oyNeg~)a@0zxgsZ0_&xXf$zc@YXax$
z-pW>ZvCg!+GHHMA(qSZ_8%{IyBKtfoDsCTrzjD3NCH)uJ@!u!FWOmu{)h5DZj@a?-
zCSrVi?YGXI$XRlfv1QV~ZTw$tyOFpm$+l}w{!eUM>1582LrHhpwW-Jc$y?^Myn9wq
zK^Q2(8!FWITmIy`Yt8r%lKNPeuj=qGCv#@*e^Ub6x9m7Ix!v}c4X!z@E>VAOUEXI3
zXIA}hRv&LOm8)v6_O*7Qok4c2+Tq>4g6>&^t1CGpd@g~bA=9Nkzh?^PXzv5w1pL2V
zGv%DC^?9SIoMZR@{e?6lJOX{c?k#_x)4c%>{KD
z)5RdW0Y7ajX0NRie`6|UHQ0&&IF<8P_H^QXrg2T(WtXn&V^&{2Rb>yh5aE!84arVl
z|GF7`H0Fg>sE{LEL&PJ=Rk_!Rzk{R6@?Q@g`Ti&!B9^jOo7r+Yd>o)B|ndN=kN^
z(U32|vF85AHiRQx_5^BWd)IEC%62>IO1t%ehWt;eD|?we-+k4&fcJ|Y(Bj6107H=d
z$qw0TddJkH>K92n^lR+G2WG*#K{JU~cI7u^ahayCVH~tBXEY3%T6?pvmnnDCm2W$P
zvsQj{~RrmptKkWJw9xfv(k%4%~xbmorOpuDS7Q20MB0
z#&>7X(zPkSZ!LP0T;XQczq};*{J;&pFp_lEKue7`zYjIsWf!x@%68;iKaM+~j~ksU
z{^9c_yoBLk&FrK;SKrdgWJO8NcyGSKEYy|V)-J5kXvf7T5g{cdWXHCRT4aZ9EmKih
zl5^0T?}fUSvMbyJikEF_KT$R-De=Oa&!X04=egHM_iODkr+9x!3DLhU+)3t-81T~2
z;X+AHZ6E#?)s;Q+p3kjhb*S!>4kaaIpS_Ni>o(>l-_I?{>F>igm<`EfFTZ`OeOFbi
zW%{wC#0($44@$Vpet{?GuZa#bX_{VALiQZYyr0_*n3_GIB%Xrivajhl6|EGv^H%&~lvH+V#lM_O+P3Bs=b`OC-oJ&m
z?OXFc^Ek(HajnId1gVC*>{Qsia^=`Ab`>w7FX`1&_Fufu!lBI0us(N?<0`%<;_YY;
z+H#-SM)beHk`|^CJ{>>6J$4Zf(oj^94E32`--n
zr?p>9q6YqSJ3S92aGGGw6qk`hJ8H(8&DXB`?HYj`!S>t~z8(0V|E{i^BBP@?mP-Z<
zO3V1!(+YKQZKXvvz9S#F0OK*EBj0ZUBt03-XA=#o!k?jZSpH+;+xYXA3%P#EN1gdG
z3$bct$Ir_qF1B-QpGWrr>Ha>w3x8oD&MNuTZ_|yBUj)r$*U$RhUAvqvv+6Kv(5DVq
zU9vN1$A)dcf9`4e7CF-Roze2U7NPek-TBvO!&3J4ytl#pV(+eI?NE|V0-SZ&E9@7e
zWJiC#JJH@f_$iBV3zq#oPmY{bxU2a1Z6!zV@z^sIvS;Y=W$P^rTC!n<(3Xp{7d~|l
z;Va}~4WrFoxfp}RJ^4YoXcODaDx|y1p5(jsdH(BbR`^HMgguZZva{&ODONWmnhL>y#DWprrJBP
zsV*i7b&c@xliA;u;3uu%EZt>i-1{qge+Ublc~X#8xUtCYxVr_PY#&}}(^2F|SI&cx
z{EZdZL`28jcn4jf-uG~9-{C@CVRH-U$NR6uBHi1MFUW_culw^S@L`#9Ks5i8cwxe-
z@=mL`s^z{#i$}za7(Q^7ST?hSx?28W3&l1>MmB8#e`XcN?{DTEW6)+GZ@C(6h7aW3
zSHqM>#qncSLk=8I+g5Yg%E)-W%NmUD-_L4dyzm{6%nobM4}NjgoL*6BzR|Wx0>5hw
z=3DmG{rq#^n_*Q9-B3c>fYv1NuTcWp^5xdzJ%FmU!U&v{S
zEmi*Nb;8`U6-P`6fS{_an|5xTsK>OaSjQmFH0NFI;;o
z_G_Q6%SuWZrHKbuSEDCmqk0T!QEgvV(Igi$zaX@3gL2QbKltUgycl)1#{d
zO)AMrO5?wiWU|xrP4o9&z435Kc1ek4X?&vsl=vIHu`?88@HaNWQqE<}DFk`^zZ$#x
z*eH%Go>><#klF@cAm+~a<9s189sGg8aZ{y0X_KZjYDuF0QN?uccF$hCcelA+V_yt)
zkfNwmQ6nOi7q$5#^ec*zwl)=PXxbFq(DWlX7}`KXl@f{m5f$u4pekt_x4)U$`-~&i
zmTu>L%$qlF-n^Nex2w%j-BDa`e3n*K_u;1guARD0E)B3HGvj8v`{~N3))2TA7KCOJ3TK9PrP*nV=k6f
zoL8ORM-#_N+Ag!fj)E=v_tEIlLiZZz)KRuElK+1DFCV}DxzJqhHyUe)ZsM;J7sB>yS-^xA8``qPEBJ{*5;=$7&3OpdHJ#mJX4)=$29
z@s{)K+xOv+OKe)dcm8PId-~RoLR%$)Y
z?i@ex8MWDe^!81!vC*1&Pq*w5D{b8M)w8$EuAf{t1Nt)5qxp^7?1?X|d;?kux%a&H
zJA2XG_wTQyyTggB?wU6oJLN3@?iX*${u(zsg8$+JV?X%H^UV#@fJFvk|LO;7{u}BE
zzx5^%bwHfz+jZZk_k8mF=)CIq*dzYGj%#l!aWDK4fxpkD2xa#&J_-cEIFWGwDLqZkHRD>j?t)a*pYG
zRyxP6^d3EH>1j`-E^#Z-ymxPNKizhQeWE_dyh4Sb#Czz8DHe^ER|LHr!LbpcgHx=9
zHneNu(Ctd+OnkSAY^mw=kuq9PFgM(2~;}#28+_WSJ>9}qTXOC0vuBl
zOH*%;u!c&U(#2O;TU3>~ld*G2%eF-&-5cyS3K-r^C$F>U3WYAxI|aI}SLSVjRS8^<
z9j4fypph*p-HB&LJJK0LnA_w7Imfk94varwdc@AL$d&>K0Y#e7Rhhsr6PXn1x-Q1V
zbuww!4A>ILyy{9yL`hMYqM(4|=$%AA%VSQfdfH(K5pjJHaBKU%+BQN{IpCDRQq2afay$
z_dp&rG3a@YD;#(<$Mpd?GwnOcVi6={Q60Y=QA%|v>2j6Oq)QiABRw6{!b^lMiIhQg
zF>P(V%AksV4H;I}5$(~X)2uZVB*mgQptNmn$%5tM=Rp9bA
zPe{?>sv{=%22B)lrUyB022P8sm(AGR^|Draz;#WJ$L&mF2!M3vH6;j$Eu&BVp2c>{
z)GH|R3Lh6o{%8-oDBL2;C?a-Eor#Q{$#QqtaWYwNPQh|?H
zhBqk64%gGJ1<>TWoevh9i!d530vJ-HKng8)iAT+xUv`s@
zrD2_625N($P?qsP_DV$*$CJ}oz6=XK@sI~slW~Pg_yVa4FsBIX^ynWj(my}R-mA|)
zMgo?6k;WSkJvYR(I<}df!5Y)|p-=U?4xM9$im5qo5SR0=tn!@|nYv%CC;&V&2uzzHZZLX3_hF^P)
eEnDmlz0aPk^?vMj3Pj6a^+vmPApLoOa5oyBD{G`{`dRVyVk${wKB_R_Sw(bXP>suxn~AA
zvMDydp0a+=ztyL!^!1*#Z*|&XRrF|wv|*=)d_Cyu=65c;HnVv%u(Etco1`|9K(A4=
zlRb+4vP4-?-s%ZL$wm-%kZU0Ika_7TsRhWkpcLhcwG@6dbjok4^7fGS&_6}Fx{wpB
z1i=O}7m~{Lha|o!@(qw_#1|tGj|34~hNhdq*C)f2!V&psz#J580NtUE;%FcwRq%-_
zuR~IPL0)JWb*BLK?$8HAIzon^wGNO!Sqp+QWGwh%G6+x|uZK5sV25T>&k9r03oLMy
z2b~)7NR@*i$Aj#2?G$T2=>2d=s`F>;bF_gPp6@DWm
z#rj4x92J%9cN2t$kf|xD)LvnXr2sR?>ep^iyv9=ykXynaQL1E&st<%jH%g)*@vp=K
zZxmF|JOrUBW;<-=9JDI`r|eN}(dQkjg4
zki;K=Y$(JFC1psEXFOx{=ZNsweX5|SE_1WD_ygPPw)&39Jy+AZ0LI_|}WAjMs-
zB`>8QJzvNw66Dt{@Dv0E8R=L?g~Cx)zW_-C^E6Nij^UX(L#e>F5XC;rl5NRN$mbRo7F2(ZPAzJ+==|KMIMRY|DjbrZUExYY
zwy1J!h9xxv4YcH^kE4B{XN1y_rjb-%F{U`BAj5BDdf|Qah+29U5&>H>FiHuj4v-WQ
zJ0XepgQS7YOV7{A9Fs0Ij#fg;7Lp=Egrt2cBPBm)EaJV7N$J>d)$e2Il#j4V&o4%V
z_eTa1T_77m7N%s$`-}vg8q^Mw9GACO9QmvEmRN<)rTM`t5jsUiGvw3MIjVMb)$&90
zQc^L)f>%eS+;GTZs(2F;RFPKU2#dVoV#xgD>0RDQDex#jaa;jO_F3t9!_$KWLF31C
zR;FNBN`Ap8G$=29bUwAs*hT4BB_wS`ow_PhFsw7i-ws4t<{0XLa0QO3r>Pk^BQ0qu
zd3flhrCIWFi{g|Kvg)P;T}pOgR!Tu?1~xdk+)771qGJ$yl=tMl%?lqTCxiS
zp+~&px1%bbLXv%Edhr;{kRaSsGY+cq6eMjYY1rBQEcrqxbX(|uj^>U%6~{ivuZR3v
zkk}wfM&$d+vxo-frsUElZR-$SPX)OlEyhDGhevSThWJEveW!V
z=L%`BCB~@(;rg_2>q48o@kER$dAoe%kW0;*U8I|}A2;HiTtsX2Kx)SrN-k*eEY=9`qv0zpxm
zmXlhLXUR^-tY(gcq4fZ^qHc@gGXs?Da!41Lje|L@!U2%9fyY47R6l)9*}&UErvdPW
zlm}#>(vI_xRPX#jihK)_wwo4%mG;$xJ`UDtsr*pL=8y|VD0cbjS!2@k(1=i_
zVTCD~nU?$lIb?9dehtjhh2`p<}$t;oa07aHZc*4FaMn;50!+N>$yO0;J)a+{1d(=@{CAVA}UWXO6G3i%uJqr9b2e+^m(Xd*RH@-?uc
z2$Oy?B9^8BB!=W$Xjm4g5ABwo8dzkcNorG{6-AnK*?467vMrub(){|YD$=As3c_D5
zI=PKeFJX6VFBhf8b+Bb+Q6_x>$To^UjLH&dG)7iTY-^Ox+Onc{CcOc>70t2SD!myR
zwHOURfe)Zj-{d)#_S>k!z%WtzZqUeQEjdKiL&JuK8YYJu_0OvFU^xhD
zl3dqfqPtPQ8d`T~O0|{HXk;;^n6FOQz!ggblk|Q=7U^%&{Q$BJ+tM^je-Eix7|U&x
zLL69Cj7gV{Eh&mcyGH4kAf?Qi=xdbDIk2+!CjCI1oT!(G-J#*uP^dPv8SQexE=Vm=
zv@~dap(*om0U8Z4`id!Ybz+enO!@`b4MRZMv)D+Z-U@phwZ@U5vHH%?0-@<>i1nkP
z(VSROas5STG*q?aPPW8esRk^%oC+-oc?eioZh}UwwU)I<(5Qh3LJUW&3oGhq(!YT{
zJX|hN-qfhy28|}lnoUj$w}wI?RYxuzgQpbv!qB!h>feM$F(?O^{x~#h1Lil%C^c|p
zk)2KY1Xravs`E2SGhA62$ipC&z@#D5;Xy$)Nb=f`frf*UG9S7(pmkx-+@kb9Bb5MN
zS*QN)EV8Rf%5Y~zT}}EO?n?9F0e#YYu&S;m-9GH*ud-)dqjW93a6FY$B}ggU8KnBi
zoPSe6NRd;skQykbZXuN}r+PONgu!xZ?TeIcbFzz$YiEUolDQWtrHba>f{;uF^y86I
z_NU1mjnX&XtjuiETeZ-ZEp@#MG-b#zQPO)YSW&!5I@p4h#hY}8d<3Br+Y%q8b7)0_
zK&b&p#mT9Uky3JheZl$rYIX%kDY+YwQc4J|5vOw5c%&5WeWVg(?$V1~e=KpOwgRLS
zyUj=`{scdbi$hBB_dZfeiPK1Rm;E(IpetoFky7k7zTkua)t}TWfR(*slI8`lDu`u)
zEV7SD@(N-_eN6hiAVCO|ryQH1ZaK6zY+{=z{Uf9(2oY!q?^uK?Sz*Qb8Fgc!nOJn|
zC}~45D|0tVkAhiMUz5~3gheKrq&*?5DAA;EhUlYsufrxI-d}}A6J;Z>;Cav}9Q6!a
zpZ)^0F3{u<*M;EY9mc^kNhjtKY&C0O~H&kom!mXjuOk){g
zXKszB8)?eo9S)5awvN&2+W?Jvr)RNvOx}mq37Wtr$A(*@&6HJJUMZuY(Mmzbu~!^X
z^RPZpfqjHxSx4@~IB2w>u?W$w6)!Z}9nL~iI|wZR&F>)lq`XnkXqe<0bYDP=WLw;$
zbeECp&L&1iNn@f|*{de$Y!s_{)uazVpJ;D^JvvedjXW#+{hoHL>@|}<
z7#fWO_QzI6{b^{Op-F5qI^=<#V(`^Q4}nGv6Unvov57?vGU@8XXw#916d5Z!-b~`5
z)n=1hghGjvchAG-QXi9z9AoRDPDP5p;w(h9pAzq-3
zhDPOZ9)Y$48ns&9l66l>W6@qwQfwy{nQD^qI)r^V4n3O>yOC=gBp6^Wx
z_*c%lInc<7{Fv3PB8^2ikJ8^niYivDn)Ol2Ada!wq(M_EChcQrv@O+U<%6SiG+t;P
zrXsL!jrf+*`m(a-Cfyp4anw!SBcuZ57Pd@eWu7MetBG1yu}4cRkrlNt>Gy)9s^o*7
zq)%c+xh8$5B!xt4Fpg88(RiU&d=S_Oje-#8M1;z7H4ov6V{K?MD;tGlZL%^A=vr%|
zv^JSV=9%=jL1NCx%PU5GR6k|GX?{Oe1(UrXX~M7!v4|Y{D<&8?L}&suOouXz
z`o+*_@RVhL99poPN4sRB0m>X=r^X-+fJT<`@Jn+Bu&M%+{x^`cK5^2<`fT>9HZIh^
zSD{fwa)jzuLVJz&0)3s=@ZkfzycBgw&=P5wrIoL-vN0yT^FTpB1kk$mG>R5hXo=A;
z21otD)`-}B1}%X__itxCNTJbqbnH`AQyO?>5R1fA1q{}r8v!6$2D7Sh*ndDGXs9dn
zF>8n*pc~W&oOHe$!paIUaVg5=UzP%oAM%c3aOs#891L|G#-?i
zh!oCzNS%Jc1q>JHY)EC1>Mf^^yx>}7;8O{4(x?npHp!%44uXykm;!{@WoX#o5EV2%
z%Pes9LaT&EyQPvBJpxs0n(i}b?d5~Z{SmCHnMrCnl0`N*=~G5(%Rd&IBZt-&W$MZc
z?*uf8Bqgr&nOc;Ik>S=*B9SG}lkRnBSjUKq9Y|pfsZDUos;Mo7_M&-`E}IoiF-h&S
zS=khmetNbNPjb_xW7#Zns!4LrVMSB1fO51IN1u^afbcR%HuF
zdXXf)B_IK<0D6(M27*YzizMZTkb+lDN&c~o$bN7JE2ezi*c$QN$UA{
zfXYt*r~#7zdc91N9lP^}D|>COHDFgvJ(xz;c#$NBGf2UUB;~(N3SK02z-)jTG9RE<
zO-bcH0H~rx0KNW3HuyJ#TFfxhiM>A0lYKeQx|rN7mu>!4Qa@Lyd`(F+yg}tj+5+FJ
z`u{>Iq58ilD39ZhYQ-;;PRKj2=Kr-+>i-W66;FTd=zp27*8jH+XawKC0~8TYlzRR}
zQbarlXe$3urK}+RGD#7pgE399V;w4mS4}Ch59d3v&GYSwY5Cg2f~s(UBx6Ul1WDqZ
zRsCg>s&G;BNs_%ABvI}vPm+=zs$N4XqeBE0Yzj#Zo2!N|lVsOY&95nm^1&O)R%$*;
z^4D6`Yf9q%MAT2qGe|Y4Dajy2C1dbLv)W1JNm8;i-l(FksvbuqUL=X{uJUG;|FbNvNm!#mAGJVVRVJzhNs_~4
zRezbJtbTZ-2i_#rjwHp{>#9zY{7i?$zhdDHHRJCjnasc&6?{{*f0?ALx77UqM2Z4i
z{Xrvo$_VeG7?qr*%J)<`n@GG!Qj&gEheB|!s?UR@{w<N04LPjZ)s*D#2zUeJ&uad^
zOQrt5F+l0Ra6mpUs*Xw0EMJABim$6YNm?~`A&I)D%KNJPojv}ruDr)qQ8r#ADfvXz
zYfAF`3_Nwo1`2s@K;)k!Z3Ir>$%Qi{4N()-?j^EVZn7H;$f36?{UE7K0KKVFP127L
zWzZaW0aQVAfGYG>B`tD#ktDt)K;>Hj^dd?11*tLcKRMn~`TySOmSTW<5DQQXI|B5o
zDQQUK0OfeA*!{Oox5epH8(t)-0mD^ETLJ0+cDw~gL;7Dj-TME}j<@Xg8y^3hZU3V)
zud=&*kEx>9|3p$e{wSAvx%}sBD-RB>0(#Yuv{L^$+bU;V+B{mTV^dQS|IgX>pR?^h
zXItTAXImY@1oMWp|}&orI<aZ=@{h@E`AP%(1)3KN+Lg@ueQ98GcbUaz>>@PlRcQ5Yv*^uc?@neL
zp*?`slEv;xW*Mu|>OE$$6}t<~c@0{<*DSVXOZTFG&~*FEq95zM5B*zbv`T1ge=>_PZ1PX&-#4%s$1%6um`WM;3Gh
z{o9D%9x;oZ*+pm@p>;lL7Q3?9N727c=q~dc9ff&1SAg|DfH5)`vxWh5l_Zun)g7i;3(DScY#kFvCf+
zn9Ta0ME{^|f!3etPoaO?Ft?}7;;U>Ew7Bh<+tX%oAhVoC|Df%MHkdU&gZ`Bp*u*nt
zF@^1h)^CS_`JFY3sjToU`uClIor9LnTAf4xpuKa>EDmR5f_rhOg07w@B3w~NVQ9$Sj{eD)ac1+4d_WN|e6
z;u89_8-2QL7RR#wm(eF^Tc8y({T1|S5BhY)ERJWJt|W^SnEfxw;zVY_`y^J5_hQ!g
z*JQDTjl%n6wj1wLnAg>0aVjgs`|Ip5-lwrv*OJBQY%<>8V5jgtg9Tkr7H6`Vcz=^!
z#QR$;;zqLgHk*z2ci45jzsq88CX2J!0=&P+?&5tm>vk(yoWqvlow3KaFgHgGY~XFP
zIG25K8~r$nepHx6&iYrNAJDcyTfp?cp&!T4kKfGV2W%6xxZ{YuWoGe1W`75B18wvj
zv-lA!hqn9#V)m|CT*^k>#oU}kBtrXydELX@oWi`VF^kJsA+(Lq&fPPMpR-o?F*m0%
zQ}@l{7wi-?=QEh8-_7DmHuHDH9<C9#cAr#&-EKML%pXGzj7f%!g9l6DJh3dA0Porc&eu;4$EqEQk~{7K*oNgfgSJ(5QS-d%z`Ch(6*9v65O$rA#9r55B#
zfv+HWO5lq(v!xQ!0-oWO@dvdUWqzEdZfr3(UYP#eVZ+Xg{LT5%G(_n_7d|2x6Kwh^qqsiHM9l2HsW=;<~`6=s`H&
zHSk}ExGC^p8xXrd%(Ve=Ti}<77tkwz#kBC7b8&*#7Pj#>VdeA
zp&(+$?*^V|0Pz50VE_^Sz`%9&K|I1>)CX}5#0DZBV>E0*%ztR$>9(R-e8McN5!H{d
z$E-Gs&sgI%i0VfMz6F`m9~dJ$STCOBXpnVSc0p}lD){vR$&03x~(=#4Mle8b9Da?Y~;($lB3A>tVx<1j_0i3TC?ON
zvZA#~bFabaZSvKaM>GViytniSXl%-9U`91~JhML;&ASgpVGCpF4;kUg!?uBoXI`2;r?fK+LcK
z@s0R;Rxa#Ul57>6cOQ#Kt#6&k<4ed#@jUzY|EEsslUi
z3UqFR0t5N%HXtgActFHp9_t5Ud1DaE{6M7eyF~PJ0g>nrB9$-o2Vva=gf0L?I`16-
zVj~e7h#1brKoA+OAkqUtSok_3oZUb;27wsKQ-VP3B4Q^IS=>Gt#5i{lqk}=@@Ny!2
zJV1Ddh+MRkZV3^;68Vq_aaZY*cH$w4wQu6Xa+_H3f*8@qp#5E`0blsomc~Zl*S9EB
z+U3g6w--m~2D;-rNj|wP&X%AJc{!Px_zNbX3bbsFhbH+t)IqdvGzDM9))(*_GdRR+
ze?s|vi_(e?;zFv`LAHFmvuLf0#jh6FQEkO?al;_|rhpAfWOV*HC7ZAGeWCHV!H`KrLqly|K!@s&e%0nf4=s*T7LZ
z`oYE@R1y6+Zm?=dKc2a)kirm^qp$OS2I!Tda`c(`vdrL*y;TmOB>bjwsVYZbtm8M>
z?^6N1#;P1mk%TnWRXk25U7%R0hJ`BE1Y8n84JcAMSETi-
z-FQfvOZw?eU8E^*vTBF@La3*5Q&i3aoI&NLDqM)*3DQ<2Usp)^M?iKeHw}`8I*!H-
zue34Tf1TKrJFF1L6;ou<52P9cE&%;7>p4KtB|?{gT7VUx18M_xfJ?}yV56V!eFuCG
z>;!%Qegt*_^n+!JY>H%x+=0L#fC82R6aiT*M<7L4Ixq~NsLB8=00k2T4+RUYItma9
z2%2k}+X8^*j^>KyhNgmso`!V-FcF}y_sKVM0@r}+zzyIw
zPyx`AxC7h;?g96K6~LFkDqsdM6L=GN3z!T{0lER*fq0+?&=bIpNxv~kztTv*b1TFG
zCT!F4(rE?h3()eQjDK;xUgHE0W&H?9vy}&+T
zKd=ed4A56i$q1@Jq{KLBVIKLRR&$3PYE
zBd`nD4eSB-(rD~MVn1*II0zg94g)^{M}VWiG2l3G0yqhr0!{;GfV03kU;|JJYy>s|
zWx%(3fW8eU=
z1=tF71G)nA)BlfQyAskJa0BSK7#Ki%(YwG5U?xx;iMPIh5oif`0G@ysAOIpz3$Oy7
zfO-l%13m?o0iOZ00S3Ge%mwBF9GC!11QLN{pdZj57yv{9RW$$G;J7>R35bs%X8}=w
z56~274CnzH;5lp-1M`6eKrS#47z7Lkh5)Yt?SN>2epiD7^MQrH2f%wkJ0KJJBWV6p
zkw^m;gLDLFw~K>F06GJ$0eYTz0rU)M2voqX2M`PR0i$4(2jl}a(-F{(KnM^D1Ob64
z-vXdVMV)~tECIC5hXHkvo(quF0Xg96Le>KeKz)FAYucR~0Sl4u0BH{_L3%0h9&KoN
z^(~fn>f(`5hXcca6rc~#8K9+j7j`rnv`vi#egkM4X*!1iv<-CuXdr0Y@c`U`CV&gz
z05k;j06pQ+CyE;R7Xj$G3XY#yCwdn*fMO5W0ri0T038u*06GB~Ac?mHv^3dL+7W03
zI00na7}6PV1E^AJjH{Y%57`l*QEv-SgW;o?{+33rpgm*^piK>pIvLXRcmgz4UO+Gq
z2($#efo4EcfcDiEKmgze(BA6jAL^!bKsJyCWCA0B5r73K0t$g~z#L#U@E$M=co%pFcpG>N
zcoUcj%mCg1rUTO`L|#W?Dli3@43q#gaFc+EzyzQIxD8wbt^&UTXMr=oDc~e<0{96y
z3>*TeVbte+z#ia7;0NG4U<)u8*hn>%BC#0w5SR~eU>@)Run1THEL8P1kjsFNfhE94
zz*05+3FN21=fG#cN`PkU3xH;AInWl9$R1pm+DKvC6L^M2M0F4Uew}lJ`=(s|sL8_Fd
ziV%x*dmsid0fpcwuqd90?*w!NIsnPwD4)u70fy21zk)<>pcl{+NC4<5Pe)NR&>iRo
z!~tCaieM@;1V{vufWAO`IHm>>=LwM1_*app;QJV$PdLc{L%KixX7T_ig8@1f(56DY
zr|5nSauA?7qM)Qo(}AIY=3EOXiWki}J?*J66wGNrDp0e*WJmc)H2>tRJrrsck;5TJ
z02Uwv$OQiEEEil3kOgSYNY4hy*UNfL`7|<`-3(M-8@9rfjitlB6-y-UvQ?b!WQRRC
z>YHhPm+$1-OX8p~|KMQ%5W$`w-YPc6N6?#F#UA+5F1B2B;0L#fI&n1bvrP=CNj1@~
z_`A0JP21zgYv)ShT}gh%meee$xa1YvL>I|q#nEcLhI&q+_iw{C|;
zXIJeKz)9Cm#r6JiOe0AQ@(=b8LgOb`@%TMrysLIS;E71zHk0<5=1bzFApan`aSA@a
z-lO=uMwZ(Bf0Lu?oGc6bC;^=e^$#S=fpvJVy{Pq*I{eFBu+(k@{M7gSTcf+R!p~a<
zg(#LkS@Xz!V!RZh=QH+U=z?u{{R5&iZ@OO$b)9OXboOp}zaR7R?k1sFuu=@&%G)mn
zyK494J$|%kWUtjr$5uN=6SnV%W7VOnc4c4G68DYnGuF3-B|1foU2nrX9DpzFw!wY#
zM)$tGcgk|rA~+n^|MB+@z}KL<{5%>b<<;etC?P$n%M)l&wfhH8oleNO+@RIeYTrW*
ze8@qR$TskzgD5f1z*irHr{4^vPY;T&B4xN7uHj0%Ik3%{h@t5>Vpm9FAm#_Hq|u*3
zmVcU2Dc6eMAby%XcmGLr4%6-!jQQ;P(_r`P2l9{v`G?{GYcHQ-OAP*@9WFlT)EhZ8
zUqOKax96EC>#E&HnAd$%MVpg;E2}%wy#ZeW3$1n@d{}g-h0xe-hnXwfhKr-rv5q
z-+N=7B+=DTJ|&mLI&$kHqHptf=&1h1WtQWeqpB=#^c`j=YB^UOc@iw8XO7&n95q2M
zIwE>X8yoShN1*@Mh@U)ySkkT%OdN9SkE-`l9-@s{R}{jNoOt`AVkc>a6Q6!mjC56R
zEi74MS$S+x#QIegmU8Ro>#9)-_aPW<6fOucqLV)XDsX%pTU(VQ$P=!1j}&ivgU
zF*4ho=FWYeB5}?cMft{IY`mcFOQ)X#fPH~5izj|{~1)6cGu$J
zek%@j`~9O|)CG$P*KSoT+UD@HgT3QpxKq~;zOeT{j-Y`YN^-v&pLbj=aaidtf3PW;
z9WdaX78{}?9K`wV-1h{g;Tv}ze*z2CsOzB!27AsKLNl3#M3!q5eS_5lzIlJ-sXwsuS9
zimUVIw|%%WcuRy8Em-`+nWQD(3}3F=wTrKq4z+f5v;Vx>qC-o52Nq%4MU9J_1eP7S
zo{AqYYd*BA90NNn99&x47C(U2awfIprqd{^UH-U3sOZ|_y41efLc1Q)vZ>wj(ArtQ
zR_Bzp0MAx79g=eE4f9>#E(A$)avG
z8}ZJ<8PyikeE56hUAtX#*TWKz37;miY76cDO>28o>y6_3`>J!c`tb88D;*8sm1nRE
zUkTt{&LWnz+YEzZKJ}h3)!qfO8-gtbv->E3zke2+j)b%x5i`!!a_HiWLHFd9BtI1E
z2J)w8;nOjY*S`kYERYADgH$7j4?TycvVS0-1Tsv!$Fa#5#TQmz-GC#rvIFB7hYA{^
zf}W4R+pyVc=)&rp{(*cSIUF9ye?5n$XqQud;8=RYW!mPEuna_F5peeddBS-F?bAR$
zajb*;C8xcdd{+il^u9@_QSKBk87
z%nO(@^*Yaz?JnN6za2c}XZWIh8N2PG5WWPy!j^@|U%QlO7llrfy?oG0aee{SUO!qQc{6!lixfW&j{ws(R>1a>I&O7$Ua3Fkwui}Ism
zS2%xo5s}g}g8N<)#%k9;1we}U`+Pm54Nj8=y8
zlM!P^7e0U04LLZB(#o@q=Khy40F9%0+-0=1kBLtp`PjtQ5|7oehjb~BKff#vlgiuk
zVOOw}6JwR3T{d$`Gv9=dP4K9mNiDJb>nmc(-<%)3I`Uq>puKb}DowIgzu><6Yp>V|
zA8nPv)~-qQ4TyVM`KkkL1L~7|c_+U37t}wjvl2pYrMNYc1@98J
zl-j?d<=8kPNgBKG>|e23hjr$gf5mueSERmCr`6&fpRE5J9_T0%fscS)`5m%^2h&w}
zDvIO%uEGPhp0}@J7GHWYk`MRVt*L2mf0JZ6ySPGa74{r$+Zye}eXhY*MR)!hwlP=j
zGR%uJ&J?Um*kg?nq5cR?EHpEJ4;EqCHJgoe{oNAWrtX%+aR0U#4Sa+(EAt(lkXz_B
zZAUwlMW~_^p##kPJbBlyiQU%bgVRxo&h&YJ9;e~>3e3zKTt^?3V2zh%nfdDLD4|^%
z`oV(cTYIq2e@6+U65eaf{L*!CnClMIYKvKGylb}p+_bfHcEza>pSXm>W}bEfeZ#oT
zCwbA#_mR9|o_7=CftiPrtQF5QNczO{MK@8UcGIhNNu=r!D=IXeA0ms6@$y%|C7xrt
zug!Dlz8w~U{t;BAa!hlUdc<@0TbQbY@jUz%e4mQvnWW!~=hLBwY1hz>+w{Pwi|j^?
zrV|?W2kjo(uXY#D=`j3DZ{*MrVFFOL0zO>-+Tu_sU$PUmsC%Nbc1Nvty(N99pv{B3
z-xgh^3%z-}+wiAdFq_nSZ$gUQ*FU00+G8-GX|M3y+nAL8efU;bN;mrOleaPC+SRhd
zlHaLt>7URUC5+0Dzu%Wz?L-M|{jcm4gYC4-XLs(sv0>8S_)&bu4zW2Ov;*Is*7`wo
zlOmFM`wDm-k<15FV4SWb^LI(d(`QQxJ@|fW5Rbo$vDNOJy;V8%+~9`Rp|DW5r51yE2`s3m3-5}){j7#4i$}Y-
zcvIh!@oVgsSK5h%$caRN>r#|Qa?bpNwv%SWbJF!b#4
zP2sLM$GWzKPK#t>u)oKShP9faECPX^66$$HN{ry
z6ZG(bkC*;oVd2`vx24WI&mKDT{0ed?nz7MO8p?0Mt9B}K{c|7e#Ov@*C#(~xyzhOC
zwsx0omlc0};kvGaZFNh%(v($qzHRTqfi54a+Y22uTBq^N_t8u3e%!m=5(ciQ7cr)sVzx)fUs?y)oL6Snv9@^!`O%t8+d|a*Y8^2%>R$7eOT|HZX)*h?QOID7qF-!ilKzDF22?T+9&3FF7+
zwyNk*-Fv0o>aHH3!{=Ugf955XXtmabuPepSFzs&V{LP6gS4*~c<))&s_)$of@;PqT
z_0TUzuRVVYIrL}`3KlA}xI0GG^*A@LS;z
zlIV*mq*q!Fi(vihTw%t`wvO0W!gB6hMll&hRrG=92;?|6a})t^Fu
z0*T7~eISuV^XV4lgTHik`h@v2L$W1NtNYMKQSRxTP5jzZvAz7IDZWJWeI~jG>+msy
zj@loe*kHHri0dR*=yjpbKC@||>!O(sEulAretV^LgHc((Jc+Ewi=K%lsZ#(iLwV`#
z0DfAPRgjUBFsW4jOyc-YlUI5+o(UZ;N+vrc*8jsH^!!}tcF=c54DJ&%Ch~-5nbNj|
zHl?pT7q5sLVx)mmX)h>Xc6Kk*+jNme^P769Id7tu9Qf)k(j@%4t`zSe@4fy7!;5gQd {
const [mode, setMode] = useState('list');
+ const images = useMemo(
+ () => blobs.filter(b => b.type?.startsWith('image/')).sort((a, b) => (a.created > b.created ? -1 : 1)), // descending
+ [blobs]
+ );
+
+ const videos = useMemo(
+ () => blobs.filter(b => b.type?.startsWith('video/')).sort((a, b) => (a.created > b.created ? -1 : 1)), // descending
+ [blobs]
+ );
+
+ const audio = useMemo(
+ () => blobs.filter(b => b.type?.startsWith('audio/')).sort((a, b) => (a.created > b.created ? -1 : 1)), // descending
+ [blobs]
+ );
+
+ const docs = useMemo(
+ () => blobs.filter(b => b.type?.startsWith('application/pdf')).sort((a, b) => (a.created > b.created ? -1 : 1)), // descending
+ [blobs]
+ );
+
+ useEffect(() => {
+ switch (mode) {
+ case 'video':
+ if (videos.length == 0) setMode('list');
+ break;
+ case 'audio':
+ if (audio.length == 0) setMode('list');
+ break;
+ case 'gallery':
+ if (images.length == 0) setMode('list');
+ break;
+ case 'docs':
+ if (docs.length == 0) setMode('list');
+ break;
+ }
+ }, [videos, images, audio, mode, docs]);
+
+ const Actions = ({ blob, className }: { blob: BlobDescriptor; className?: string }) => (
+
+ );
+
return (
<>
{title &&
{title}
}
-
{mode == 'gallery' && (
-
- {blobs
- .filter(b => b.type?.startsWith('image/'))
- .sort((a, b) => (a.created > b.created ? -1 : 1)) // descending
- .map(blob => (
-
-
-
-
-
- {formatFileSize(blob.size)}
- {formatDate(blob.created)}
-
+
+ {images.map(blob => (
+
+
+
+
+
+ {formatFileSize(blob.size)}
+ {formatDate(blob.created)}
- ))}
+
+
+ ))}
+
+ )}
+
+ {mode == 'video' && (
+
+ {videos.map(blob => (
+
+
+
+ {formatFileSize(blob.size)}
+ {formatDate(blob.created)}
+
+
+
+ ))}
+
+ )}
+
+ {mode == 'audio' && (
+
+ {audio.map(blob => (
+
+
+
+ {formatFileSize(blob.size)}
+ {formatDate(blob.created)}
+
+
+
+ ))}
+
+ )}
+
+ {mode == 'docs' && (
+
+ {docs.map(blob => (
+
+
+
+
+
+
+
+ {formatFileSize(blob.size)}
+ {formatDate(blob.created)}
+
+
+
+ ))}
)}
@@ -75,28 +225,13 @@ const BlobList = ({ blobs, onDelete, title }: BlobListProps) => {
{formatFileSize(blob.size)}
{blob.type && `${blob.type}`}
{formatDate(blob.created)}
-
-
+
))}
)}
>
);
-
};
export default BlobList;
diff --git a/src/main.tsx b/src/main.tsx
index ba2e335..d6519bf 100644
--- a/src/main.tsx
+++ b/src/main.tsx
@@ -13,13 +13,20 @@ import Check from './pages/Check.tsx';
const queryClient = new QueryClient();
+import { pdfjs } from 'react-pdf';
+
+pdfjs.GlobalWorkerOptions.workerSrc = new URL(
+ 'pdfjs-dist/build/pdf.worker.min.js',
+ import.meta.url,
+).toString();
+
const router = createBrowserRouter(
createRoutesFromElements(
}>
} />
} />
- } />
- } />
+ } />
+ } />
)
);
diff --git a/src/pages/Check.tsx b/src/pages/Check.tsx
index 615bcab..c0ba2c4 100644
--- a/src/pages/Check.tsx
+++ b/src/pages/Check.tsx
@@ -16,7 +16,6 @@ function Check() {
servers={Object.values(serverInfo).filter(s => s.name == source)}
onCancel={() => navigate('/')}
>
-
>
);
}
diff --git a/src/pages/Transfer.tsx b/src/pages/Transfer.tsx
index c9b76fa..239ab05 100644
--- a/src/pages/Transfer.tsx
+++ b/src/pages/Transfer.tsx
@@ -29,7 +29,7 @@ type TransferStatus = {
export const Transfer = () => {
const { source: transferSource } = useParams();
const navigate = useNavigate();
- const {serverInfo} = useServerInfo();
+ const { serverInfo } = useServerInfo();
const [transferTarget, setTransferTarget] = useState();
const { signEventTemplate } = useNDK();
const queryClient = useQueryClient();
diff --git a/src/pages/Upload.tsx b/src/pages/Upload.tsx
index 134c09c..1d97d27 100644
--- a/src/pages/Upload.tsx
+++ b/src/pages/Upload.tsx
@@ -1,4 +1,4 @@
-import { ChangeEvent, DragEvent, useEffect, useState } from 'react';
+import { ChangeEvent, DragEvent, useEffect, useMemo, useState } from 'react';
import { useServers } from '../utils/useServers';
import { BlobDescriptor, BlossomClient, SignedEvent } from 'blossom-client-sdk';
import { useNDK } from '../ndk';
@@ -9,6 +9,7 @@ import ProgressBar from '../components/ProgressBar/ProgressBar';
import { removeExifData } from '../exif';
import CheckBox from '../components/CheckBox/CheckBox';
import axios, { AxiosProgressEvent } from 'axios';
+import { formatFileSize } from '../utils';
type TransferStats = {
enabled: boolean;
@@ -129,6 +130,8 @@ function Upload() {
}
};
+ const sizeOfFilesToUpload = useMemo(() => files.reduce((acc, file) => (acc += file.size), 0), [files]);
+
return (
<>
Upload
@@ -190,7 +193,7 @@ function Upload() {
onClick={() => upload()}
disabled={files.length == 0}
>
- Upload{files.length > 0 ? (files.length == 1 ? ` 1 file` : ` ${files.length} files`) : ''}
+ Upload{files.length > 0 ? (files.length == 1 ? ` 1 file` : ` ${files.length} files` ) : ''} / {formatFileSize(sizeOfFilesToUpload)}
>