From bbd0b2293961ade984e19d94ebd561445cf55ea3 Mon Sep 17 00:00:00 2001 From: Jim Barrett Date: Sun, 11 Aug 2024 20:34:44 +0200 Subject: [PATCH 01/11] add a small default font to the repo --- fonts/OpenSans-Regular.ttf | Bin 0 -> 130832 bytes test.py | 2 +- {src => wrdcld}/__init__.py | 0 {src => wrdcld}/font.py | 10 ++++++---- {src => wrdcld}/main.py | 6 +++--- {src => wrdcld}/rectangle.py | 0 wrdcld/util.py | 4 ++++ 7 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 fonts/OpenSans-Regular.ttf rename {src => wrdcld}/__init__.py (100%) rename {src => wrdcld}/font.py (80%) rename {src => wrdcld}/main.py (95%) rename {src => wrdcld}/rectangle.py (100%) create mode 100644 wrdcld/util.py diff --git a/fonts/OpenSans-Regular.ttf b/fonts/OpenSans-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..67803bb642742643c9525b6d25b8ade89383232c GIT binary patch literal 130832 zcmbS!2Vm4i_W#U$zq_eG=p`Y$$tIhg>~3~bsOcnhk^l)Hq!$QDOrc2!1tTB|B27S~ zcIg|+I;Lo9R^LifH6fv!3F&2=RFve{ zma!(55H<*{lob_c7SDEPr=#vsq-R&oFK>P}&9ssbpSRHFkChAB%p*s~A4mB`$iGn2 zTs!}h!Fy&9k^mmPw$_%nHk1Cug8K2u52|fgToXL)%}hcbI8ErJ*t+WSD$|``-G+R$ zNmA-S=yBZlN2F&V9Z@&GZBfyg?CFGzME%|;8k#E0JFZXrGa&&l6XN^T{PIQ3KIelD zqWlPyH#e5guda^2_DMqep}&6bG&i-jS?}Aun~;eY2#K28+)~|q{l)9PB*frEpZ5|< zG~!GANe|-Vc9UL66TOYxLI#jI#6TDcB1vQ?NnWw(OT2?IlV^wiv;+J0`I;2%)dEu>bej9fVyw`?e?ue(g-f{hqvwvF6g|7 z;|W_>)mBHrVPS1u8vw0uD{r77s9{A9jVQ$kqeDe?-VfeGMs zHzUV@u_x=VfU;9U_6l*ZTSW;Kog~biLCnEOMsw1bNt4FVV}!Ub%CY-iVmG1jy*y9P zH#`bpCc3d72>?ET2R$ESAnvaa&Tx2Xfcp~Y{egdt(sz@4$Ts{QBCGLxFR*LLUUD<} z11QJIe9{4#&m)`2F0zCiARFm0vKEy6pnpTICyQu4;w7N$K|2qL+SilKWCz+ffHpc& z?-039w6p~6%hou&6*>Emw}jjUt`CqkWCPib)~_Wi$vW`gMGlf>u zoUA8Xz;iK5@w~0zeAxJmw#491`nl8C9_=ufJ897=RFjG}SFAVWdU0 znA;+(k!cIG1w_-S-h=3RZ@nMst%vHNkP#(8%%%6#d+9-Xe|>;HP#>fZ)`#f9dWb$$ zH|ybgB-%7@kYeAlI@6hlB0;9ARi+>iC;=S!7nAJ@k_~P z4;0&0>sPMa>T1yC*lX$BZwbk&mn$6vlFT%YsrXRS~=qR z8Z1djO4Hgk@RIV+%_nPv;-KN~|*`}PZEvD=+w<*i?iYe3NHf5OZHH|jAO{2`Urjem;(}RD(mG8d$2A_R?4A-|AW~ch9K-4*#h>4&zihhfM8R>R)OsebxA_ zk&)6SvI5rnEzx00eh%NMnuAUCEoG&>*b4S7(}IYWkzt@m>E_PjxN%2)+=b&h{U*=s zr0Y8)i+G$dWk#oQeJ7bZV`j+_N;j2Wzi}fOnl-L-b5Y5IFx8=1rAHXco>Fo|*EW@A zwURgz7Z=wGC{Uh2Qc`71YwLq zjNwJYSD`d?bm;Y=dqTet{UP*c(*)DU<^XelbErAoY&F}=$>w3^5#}6ovw4Ymh51Hv zhk28ExA}niu=&0)Ls;Li0b%B_@GxswV%Y3(7H$mh72YSjfB2B_(D1nM{P42y>d2Q4 zKXPx;dHsCK`4Q(wozFa&!lk&_OF`6-Ky^K0v?12!CON)Cga| z2;apBiDpzIv}$WH!cE#;+UsJ3@VD@-ll3Y3HF}x8MqjUQ)^9a*VuVj)gs+8?&{3f) zF~WVJXG7145fXD>^FXs%jL>0DS0ijQFEy{k2sfB-Gv9>~-gCtWXQ~nQzHEe57~w-0 zAvqs=J`E$xIG=q!4vBKK0?^{`9?1Pa=*#)qbiK`<8*H{7?CQI`QPilfRt&;pB@aBTj~$9DH)nC(}>% zKH2jm`}=2qfA#M#e^^II$sFGf-zR(@_dV+SnD3*$k7)U9Jl2!{^z+=WGM`YCW53Gr z5bgtVzbElO!=+f&`A>(cDN`!(A3@dCb7?*;pcWdT8+9MuS8LP#bbmbnD>>G2HjDm? z{;2oW`(dT;16@ti7O`|TOk1qi>GgV*Uc(0J^Ym)HR-dm`uwZSoc8hl8GCnb64B1N! zw3@z4&#=C1Bx__F**)w}>>c*C7NTelF7;b~bo;3y;V~zR7+kC=& zrup3I^O0{)-(=q+-|fCn`kwIp!O!I9@|*9s%kLxqApbf3JN>^6@DFeW%n5iX;Nw6V z7!f!+usE8-hb)+L!aP2jeU0YdB4xazPWv;^}VC-JNUiWZ&bf^{Vwz$-oLp23;oXxs2=d( zfUgG9fqnz88@O@c(*w^83L7+U(8fV85BhPCdvL){`Te`}$ZzLrQ!s-?g((=y+( z!g8x+r{%i{7SS)l8j%(;HeyypUBroqlM!bl^~eE{(UHR=Cq$M-HbgFqyg71z0TOM)^h!kD3rQCu(lgf~Xs#c10bIdMN6n zXcpZs+8XVM9u++~x+1zU`bhN8F#$0{W0GPrV~S&HV~)kzVzXk4W6NS2VwcC>9D8T% zL$S}tz7zXN>^E3WddG#tMa8AZ<;JzfJskH!+`DmK#a)Q+8E=kv#^=Y+jBkwpOZ?yB zKZ^f0fhP1xh)hULC`g!@Fh5~M!sdiW6G`IS#2=GXY zqb=EXjcu##727}UN%rCP9QzdeZ2LU>Li<|#X8S?=AMKCWU$$Rz7#%$w100o(d5%`c z9gc&JKRVuYeBk((<6^Qic|>wf^6klclRtLGJ4ZVUot4fu=k?Cpo%gu>T-B~!t{+qK zQnsYLm>Q63OHE7Nl)5eTnY5TRds=PUeQDpP+tbU_H>ZCx%r$KBus4SNW7xlk`wkyG zJZ|`?;VXyVI{e+?Cx?GA{QL-Q#5E)KjCgg#sS!Vn>_2ko$jKv1MwX4-HS(^JAB;*I zRX(b9)b>$tj{0EKr=z|e^~0$1qqWfiqsNUd8a;FLiqZFvetq$ZE@4n)PtDZ+2>Ses*K_zU;TNf5~AvLvtc?5^~1o6z1HOb8pUTxir_B zTa??8`&{n7^HTEG<~^BrVvKc6+L%RSR*qReX4jaz#+=Jf%^#gVCBGtnZT`OeC-YC_ zpUgj7pcf1*h%FdVFtK1xL36>Pf?EqZ3tlaFx8TRI(PL+hts1*w>?>pcIrieXRpYjf zduZJ2G(ADa*|VdaF+Cyt!BYvQSiUrtJ#^uXk)lh016oATn6SEqbg z*tamEa7^Lh!Ve3-EDA45EE-l+Rn$>*Ptij~ZxkDfbBoK0AOG#&sRyV2JS|{a-)Wnt zotSQ$o;AIAdfD{$>32>4sboya`jXd6Nok+bh|-kO{L;Hhf0;3C#*!JY&NR)OGxLs_ z-_9C2Ys0MfuNisGp4r1@zcc&e*`Lj^&uO3Y@SN|<^s<3vo6B~W`;^bEuvENO@kzzG zN=Icw<=(2|s?*i!)f=i`uIW)TyXJV!_q9W6t7`vH`&C_BU20u+U2EN4b#K@E)Th)p z)$go-zW(f7)7<>I*UmjQ&u`x5hJc2F4VH#64Rae>8um84IlssJ?D>o5ADaJmV~@tH z#v2=7ZFD#JG}Sa6YqmD8ZQjtlr@8Z5pKB*xd+W6)S_~~CTjsUwXnC#Gw{=46hSsgE zhgu(NeW~@s*3+$LS}(QrYMaqk(bnF!u5D-AAKQ+#z0p3Py|jH^`?B`U?fcswX@9Z( z)%O2u|Em4Mf?f;47dRK>Eht?uZ^7~fw=6iY;L!!|EckJu-@=fE(F^A;d}!f?MXp87 zi}o$Ld(kh8uUY)Wk^xI9mfU+Cxo*OBH(mGg(mqRzm#$y>mt}pI1utt^c5K{@n_F#h?}OD>7CTuc%wGe8tuk`&Qhy z;;9v{t@vcc4=ar;2d_+6nYnW6%KDYdR^GDm@X9~0e0AlimH%A%^D4ut-m5IDT&wa| z&0N*AYR#(KSKYhnFRR{M_2nw}>fWm@t6i(dtS((WZ}qa(H?Q8c`ta(9R{v%7>#ILq z{jW7XYX+~0TQhRaq&4MhTGy;tbJLpJ*W9({ku@)_d2h{EYc8xEwRYv&|GPfn`kL$a zT>se(_8UrWSb4*S8@AtY;D*i{Ubx}Ibwk%ht{c8?(Yk}{&aKZ{U$VY&{o3_A*LSXe zVf}~e&)zuf#;hAR-FT*BLdVXIFK!CDDdeW;o18c0+*EwiA8tCop>d~Qj-CI6PK zw>*2R|E>0CX z-JX4W9^CV{J^$F_-s`)!_ue6UEqmkly7rFRJ7(|Xy`_71>^-*k{J!z~*6jQ1o#s1- z-FfGoKkcXc{rC6XAF@Akf8zes{TcfU_80D7xBtHVpWl^sSJPdO9O!i*_P~|{Umi?7 zIQrn2gOd(UKRD-L?ZKvl3lFY1xbEQQgF6oHKX~uKhY$Yw;0p&|J^1dyQwPr;>T@Xg z(1=61hbj*(J#_t{O^3D}`rz>7!zG8y4lh4^<6*o3#7{gMz~5o%e!%bZ;cvk>PDvjh zrf^1j8qXn3u?oYA| zu?i0$qx3Th4PKEcN;duKX`__{T1~hZJi`9mf2h#`(WV z<@b!@e;M)bA79sKeys;)^6ODtt(2$tSIfJy*H)qN|s`?vaQ4m7KcjOvj8> zVZQ3fbj3b7R#FKasYkjEcp^eQ^d?c*RxR=;kvuY<6r=Tefd zCkc6KNvSRbkA>*pd?BqSw76J!okWa_`!z22HpqqhvL-Lb%j?!6rwO*m``lHp7O6JW zZ$w@jLJ~d+s1}l`1x?Dk0^H2-m0VU`yv^X&Rg%v{HO4<5ZU4Gt_cpnVWyxQcD?t5n z^syeCYQeJruo5kH&8o-CcFhOp%>60v4X@pT&wR}2XAR;pfSxh)+2Ow2EK2baRiK6$ z<+*p`y2eMqQ@jlCfmvux3+Q~td3r8n%(c4}Ww=hYA?8xyn(pbNr-unx3A+2uD|Idz zb!_-e_SWQD%=^gg;_|v(Wrt%-lkhu+4ENUa)Vh-6HT*ACWJEY!S`?}_*Mo5x- zjU>@8x#miF#9#%d2>$FDy^I)g^2Qgl^_7cT8dykeOZ7Z@rmni8g+AF(-iBGC&BP~j z^5lG)m7Q5^ru_d`+bX#TR{ARjI#LGq8CgQmwo?X@0G@q8#w3JuUi4FC&Tn^4i)hr5%&>sAgZ=dV-s(IG__PUl3$vElXI=;2|3f+ zYO{;jK|TYXOim(plJ{HND_Y50t?kXN7VGw@Vf_}VvW#4v|sT18Ge^)iP`|omz~oFu>05^{Fbp%%t}wvowS$+kqhJ{{GFU4pOSxgOQEm&aHJ@-o@=-4e~N$x%y1}r z&wd+neo#3h<_@2jZPt!x z4}z-GIkc57r(3$&0+$cBX&ntQ?47vGlCGN1=TzoT67wbN`GaZ|Qf8<(iMJ&5f|uke zf={Qr(~<;@p9SisU)rtO!`c?@5mE92xk!z8!*f{)&!>pI1T|4J&cQTxD=`4?hPL8N z%Wc|Y+BWSdPQ5&iTwn46d6B$NK7dd8o+eXgw{f+=H`kHb*t?I#dzlpYp>X&Dw63{f zXJG=njskTC4Oj{{1BWSA>#=6y5;;nI=x5iR$jb+{%m`Qp)y`>xX zTfuofPIR^5#KbgsyDX9hI~c;H0I4w?Fk#SlqlVpx9;CJ4oKO(uK2gVsD4xr)54_lm z9*ianOxA7UxOQ!~y5D)qVU9elyr3|D@Q=o-`_MpWHX*-|b6DrTz=^XDv9`WOULwztr*IfI55P~%^+bxV z92zm>w+F0#3TV(~(u)Sr0Gy5ED@q^XvqP|Il)x4lJU`YPtN`N?r|RPnr|4r5yYvFY zPMktySSiLJcIbJC?RqX^o1TL>9c}Qs(-EiY(-5cVQxUuLV#H3p2ywDrh}fY|L2TD2 zBev<2(9;mH)&+CEWC-U=26Mh-5a&w zsr2&RU6RLVsa=fPHOW1b@`>E@aeszA)GgRWZN@$d-dyda{=&82v!l{m`8f-1Kl&Pl zvBY4kagapk^43J61N=huFb{0wYClN8xHx7g#1TieljtCSh+LC?%00&wskjL zzjn>)RV!C4U$*qRC5sm=T+rUu+H!4kQ{()Gd2{RQYHO;iDl5v%=FGlk*322DCDW%( zEiRfedD6rQF5d{If0D)&2?bZtT&l%fgLLR~a5uE;WO%8U|oZbzA@1xoQ{ zDVd+fTNHT;>txx*C7pS3po<)t9wX8yD3keDWEXg{E#^)#xuc`%2+<B9nR8F@Xr3#x-(rGTMDa}V| z!Xi7xU(r$GvMiE#S*N+uZ0=XuguR zQkITZrG1eT#B(0U0!bh`^jZEuN|?wDe?x|EhF?Y?>%lM=ob(_lPr&;9D0wK5_MpK> z&?ZIz@=?0-h+jr9dW)7M=?S_LB{^-SmxiA6V%-`7OF8hVT_cz}qvWALg7!s>5?TBw zAwKsAn;2*5QtK%tn84g4bYff?RC^qfT4b&nYTcPpRKm-a1w-el#Ecq}(H9 zVjRXc4mvm~Zt_eRDHn#hqa(+BBty5BSC;d1P8jUILuFZVa=6iYYUG+bIy1^E%TOY> zR1{8#M;AJBE#>AaI1daLk}IE9f4JrDhni>kOGEwSEr*7q%R}$7aH@LH*l>a_Vfv+;?jdE|nI8HH+j@=v+D3Tvlo>D+3ja zLRhf5(*S6$Dd)0a*#T|ryav{0i0s|br^B4y0k3rp9IkGyoK}Wq!5n1HGmEJ%hbD6&6!26j z8j=P5V6mb;n&7>eA9v&$pU5r>h>@L5ak8+lXcavxEa{xgnesm$@dxDExK1`O4Vip` zXd(OuyaFbQ3(pW)0P$u(^@4eAb0@=6CY*+>U%;ydD~hTHitxL9)x^3YyAUAzE14R3 z`<;Q}&o8pmHxd)wsiO}v+lLRw)26`DX;}wdLU-i=fP)oZ=lGu(NSR9Lkq|rD6H6l> z0H67ca#(%2CHScO*kt&~GNj5ZrKOxb{-AcehG@D&Hq6C^mVK`(3dKn>4~XmxKq)>1 zNszIBWGDVGDD;`E^iM}_CEoFaA`Ghq#uFdz6aNB|Da+*uTdMMR8kov2}jigOpjwUXvpNFH=ZA$Wz+ zNi6x4M+By2$?s%HdNIp`c<A z5if}IMSH)l)#3a5m_Zf9Y5N^1*l3((LugwPw2VI7KXta*D-p$w(+cufu-WGZ42o1z$SPwRUqtzS)aSanwXT?a6?ihB2`dC!~Xk-wEIjo~2 zz#^9v3wQsIN&nwmhT}daO1};_wYjAiZTcP?9PB} zzJI|4cKUHYl!*CV_B>ZNXoc8LbXyJu3ByvxDi_H?T=oz&szBmR!kO`c9=X*Bla|e0 zNi8l}1}0om&qEkNofObu4dWr0i%#fVCoH2Wu2gQhmT}!!Elg^4oY`EDeO5NbZVL+~ za5KCCO8Z)clk32Sr@kCZGyD+uJEeoLmn!7DV>|&^g3NRT86h8wEK=i&um0{=7VM8cd7r7F6njf)O#;T_UnAx{(hFnk^+!cekJvypX%IO5c|kQK%|NR8nw(nOyo>)0$(h%id8 zBc;fzWqn8y+XC7UvWqhO?Qz5FNPk9-vk?eZ_beT_oO8CbB)`5brZ!GWbu{R=F>*G*SqDv-N+F z2eh|I3t)@BoV2hbs9Qoz`WNH@W+3~R!M#~`3j6_|I`ROggEue#0K&CeF6zIAalTK? z$h!;gnTatO@5XE-O6PANkAWY)e6Cm1Gl1DbCS3lIJ#a3+9E8OPCSFDlAxreTXo~S} zQpMgRIoiL;B;?g{*>jps+`nk^@s5krj^n$`$4R6Z%USY(VI*0?^8fcmn3&C(OmofR7-2uD?vK_09vI zi|zq(5oyc?pAT=qT!=XX-a%Y3$xW*zp& zZ9u_g3f{(TlH0{^LfEUYnJb{MVa(g_h1}MKy>VOTbF6Hh+a0(4?vUMver_R88G5@f z@%iWa&UMZ+CQn~6o{-B z^(3GBI6gjO8T=jmo3WfU8Ap>z+$K3)|CF?7Z@^!3-}M-|TR#Q;2hE^k+yjXp{C_jg z*WQE9azFM2xmJ|pI+O1{r^AQf^8lj#4fBe*Hn{Mn|5b88`w-=!_u60aZXazLo~^j?|a;( zfUydj{0E?tmtipp#$V)tc&vC;(v;lc}j01Oew`{}E8FC)#r)hU=r@amW&Dfq^0K1G3X6lsw>*h&EObD}3?; z`cd%tfn*x@18*eZ!jHfQaNgQk$egb&avkD6V6*Wt(!*yc%A$WKH5F!!s5oW_Cs<~YlJ|{04{K#0;t<|fL-cQ=K-q2f~?jHU?8uUHnJ$wLoBTi1O z0bGUku0O&kgkcCy{t+xctmA>~9@r_;bQ)+|gv}BPT_^l*5cPxd#XN91bD8M>gzl|_ zy*)_=a6R*>!@Q}r1MRhAJj=L!856PAO~5T1y8G4d_ zK69XFKcSsU^kXsc@tF?Y9)k37GSJYM1p2_%jgMnK? zpx+^~%=aGjVI6!$GHLORBFmv)3%z`Y;?t?GFgG8Q`95EgIG;l#4)%H6U&{44ickWZQ+pCou7_bW#D2X3Q=)#%%`kSER#=?7q+ZzFvUbtw8Y z5_H}cx5FHyzajVYx}G`pK+n3s=Tgk$M`RJ;T!VrhUfdsXx#;)eWYITdDECWz&b`pH zW~#aK&LR8_w|VZL#F}*l^z;$3J+8qIa6ct{g_?uN|v zLuS9VKa%u>|C0afebp81dF1*Z;4H|y;J5NIXPe*?7XlvTz7f9Zvc1U_>9Q-*-aU-h zem!>l8}Q1#h{xXl8{~TJ-II9sCLCh#i0h+pgUcM+55YFo{^-gv zaDC+d#-|-~c8E5^=f$XC!Fv3@3NHhm5Nk8v3#fqg`$fLLGyDPPy9n-nl3^a;JpB-P z#881}phsoEJ};C9!#?taA>93$VF-Da?;}NhIj?+8FX1wRPn@oeA!&f)Iga3mFpS;f z{tz$*!HU4?B4BUfDKFC6ZtS0A9_olP!&H0IG0%7&b8m*(3X&F`T?G6AI7sq683nb(3T&G zHyFX!2LWewIgWMwAU#9&V{H!CPLe!?6y1%z*1t(5y-2EXil$xv8)=06M!+sh^<%KD zk8wJt9rpMv)^s=8yqgpn`r&(c9NtaFD>zy3=KQbP2lrFV?0!-5cRza>fAIG5RXnf8 zkB z_TI_*T*z`gnXd07Ho)cjX6!fn;MB~+cy``QYJPWn_hCOAL1J;%Wh%}r4A*bM{_i?G zi|@exFO7tWJ;x4GA>b_Rzh{x#5#}I_L-0W;LnubbLKu&b_j`Hs=Xv@!GFgR@fFs!- zN&aO4?<|b@o=gr9xuF4Y@5YI!tNiF~*zYiW3sb{3sO!|bJcrZ+ zCysjIrEy6++ztTB{RrO zG7I;7&4yIW9KKp{)fOEw+kvqsA$N_2~9n?tH;Jz{+>WiDx{K$Ip zEcuxFi@VbPh4WZHlKte5Sy$gAXK?EX&RR3jBn!ww@)f=- zxr8hx*Wos`rFe~aC+=@rPF9jt;@tBSIMKzA5cH(IaO(OZxkP*8#8_Y2kGOFptv?+= z2U3btWP|At8cajzP@E|l*;aONzI;$vr;NR!0vM-G}y ze!*!S7fz(5(lnY*htc6UpEiT3nxG(K9@;O~V4&m0cMYzvr3B8UkrOW7Y@-8`r zlYt+Q56MU5Bzceg9rrh_q^sy^x`wXB3C0`fI-I+^k#^9V=mxrxZlbu!kKTeCkhajR z^fsKzyPa;QJ8+JD7u`+opnK?Ex{seHr+4AZ-a&eZ9;SEGKhS&Vz4Si%M|wZ*P3oja zaH8)a`Y?TjK1v@WyKsNj2vgX`T~8C9;biBd8fb8 zm+31w5BMs5jlNFbpl{N*=-c!i`hU2W<~{m8{Q##0KcXMgzvEo}Df$Whl%A&lpr6st z=@;}%oF)94p24kD-_UPyZ`1emEd7C=<9FlGf8(U#&-531o?f6A=_TA+MR1yiF^%cW zz>LfXXJ!1DKMP>|R7y|Qiv_XXtPgI&>BsuB0c;@dfEvt(;I69>Hk5@j6As#hv2bQ# z5iF8fSrm(AF)WtFkq5~`ES@EhN6BO4IhIHsCXbNk$!dH{VjXS;e1Rn~8+nTSh1toI z%t8Lml9>~C+okZ+(PRU^wTBI7BXIxDD6*Z6#iYW`xz{g zWwC6Q!*W?38^iKh0dB?{$HwDkyotCMZ!(+03Rw~E#+%BfvFWS?_jAo)GubS54V%s8 zurgN8Dp)0}V%4mM)v`KP&*rjutbxtPy+2K?nO)0TSSxE|?Q8*C$QH51Yze!LE#)`t z;a0SjY!z)8!#9b3 zF?N(a&Yr+sL{G9mv!~c!*fI7rdxkyBo@39m7jW;`aoo%G68jr_nZ3eJuvgh@>~;1A zdy~Dz-p2h!|A#xf-ed2x57>vepX_7ycXpDUVxO>2*=hC<_8I$}eZjtDU$L**8TL>1 z4f~dT$G&H0*$?a-`xpC>{hR&7erCV0^Xvk<$SyHA96Z&Srs1YD18xHI(R?*O&0h<^ zy=OhNp12t-Nb9Zj(fVrrwEp-`$Utq7Hdq^?1#2PNP%Tt5X=W`<3)d`Kgchk;wJ6+^ z7Nf=DmZf+t0pB7?(rlVtbKt&0CvGcD(NeWEEnOR?4cA6!BehZ5Xe~p_)Uvc}El11M z^0YBpzE+@()y8S#wF%lpZIU(__cax2MOv{oRhysb zp;c;CTD4ZA)oOKGy*5{yr!|NZhD}kIUS`XYU?zC^!H zU#c(DCr%wd9>?)~+8gU_woIFXIetwGs#{tsn_8+RCCi~;vVtxJ(|t1MmshqlHTslG zXw0l=sa{ZREEm8hv#GYJv3j0Qxr71PmGv!^?el9Isuu-RcHw$XSwz{#Qys@gj(m1}nvc0X^*dTx^ zlBHm_al9OMg8=$?KD-7*#)-04W4BsPIjeSOigBW>)hLD4SkA9VZfR<+tJZQGYqjde zTAxX3cui_}ljQK41n4oTuD!9gyrq49LwS2!kEZS^W1-}XuRx;PvY#$BG*_yzP;zdO zph%W&6(FFfOC$lUUASn&Vb4@B%UCQcw+WyZ^9gF>6Esy$P`jL@f1O=P=-0n@ws6|k@yUfK;`+=Uxw$Pq3Pz<&m&Myc`= zFKTFLYOHPb&*XiP#mc>?PiC$l`IJ`+7%-`|p}e(D;!Rz+l1-X|>4vtZ#-`RDRrS>^ z)vfidBITdi&|Ft8P`~oVrnc&a>iY7)+~(GLbU=`ObK6vY0s1LOfs^Lfa|a+3Q@a)R zpESR^Ru<}AkK&i{G6-IJR&`ssVNCh_`Q@Tx$>~lX#ZRAsEDih&#dW}R&d@Nfyt%m? z3O~Q1s+>(|XA|35Nj+3i^ngvS*9z;J3`O;|^UJm3@^&B98*Or3y_StIxwT%h$xILA z?Rk3COBM8_{mZ?A2(0clB42bwiieL!VEyndS}q<>RY5d}`g#S58*2IB3{}+)ZRI|y zEqw_xG@jWehQ=E+%o9Uv5JQul%*tks?QBuKPm>&<)>79bbFv+VRx!vn3{rJKYsLU8 z5zrq)6PJ7-Z`aeWURU%pP&F#2O=XINzo;xw!Ody2D=2-T(+E|(#vUGcRmzIMgeuK3y&U%TRKSA6Y?uU+v~ zj=^bHeC>*_JxB3V{OyXrL-BVg{%Q?yIuw70;_p!W9g4q0@pmZx4#nT0#_dr29g4q0 z@pmZx4#huN@lRI#lhyc>75`+#KUwit>w+^`@lRI#lNJAD#Xni`PgeYs75`+#KUwj2 zD*jHz->LXJ6@RDVua*m^Q;pxL_&XJUr{eEa{GE!wQ}K5y{!Yc;srb7TUzg(RQhZ&C zuS<23 zqDojiO3AvZd4AXd~+J
iJ5qXgqqT4sSgkrPrp94Qm0h%@iYY-_Oo_v06Cwr_Qwu1j7EnwrpsKHi zXp^o4bk&Z{(~g*0(8bgOimA=Z%@b3ZmzO7|7*MK~Jx@-pBTG(wa*kB3;&IAKHm6PLwM*%hOQlm( zIz{Psiqh{CrQaz^zf+WcrzpEhQTm;t^gBiAcZ$;Q6s6xOO21P){FI)jC_PVA{8JVG zRK-74@lRF!K$zcg~2Ge_~yQT%fh{~X0XNAb^5{Bsol9K}CJ@y}KKbJh5B)%bH2|6IjCSMkqP zJ! zmvrVxOa3mkFLWtC>at1xE}I;`OYIL`YJccb`$Lyp7wx&yJ^_V%0EK)2MgIVWd;o=f z07d@*g?s>od;mrN0EK)2MgIWB`~Zsi0TlfM6#cX3O8W#<{H1*&t@um(L|XBe_KCFO zFYOa)#b4Sd(u%*dPox!pX`e_d{?b0}xzauX)%c}-BCWbxzeCBG*%2W_qgzdG>`ozoELOt+$6zfn6qOQ>C-AtIdpEZDwE%ViAT`DyYgS zr{-{__u$pbEAXa~_mP*f=gCI`d!C$9>>q`z1r#C!Oz+E=_T;Q|+$o=ifQM0=?J6|; z6||JAl;bp2E*sA4%Jwd!U0JSMd){)QJzu;ZOT_J4b`Rq4Aj!Q%*KKyN;ziR`8k^wD z(mbCJt9!modqh8{scn9F%RH@SPK^O!PQ8f5GlV@??p88WrMCfe3O@GatVDii81BiF zX{XDZRxfEq8h7XQQg2SZY4xtsn^v#9JZWP=BEN6UI97mw0-;$77fL7apn@)C6@;Dz zp2sLvRw$jo1J%1zl_3;VWyrT|BGFIvYYrb5`YnjP3cRn)MB1l7b}Ojct5w+)S2*~( z?uks1=*eFViT58O>Bo}->&>ytIvvQT6fZu!jUbWQJ<-*?&6#ZzIl>+s@?jm*Bb-oX zmMb}cw}ltYTzk}%WeX8^O<9UJt=^}5rl6O4$?Z+6*UH|sdOPV!8*4>Zg1Wu=7KDJ> zE?N8Wx8Ram)6j$$j*0vZIngs`vR$-(9eqMhNgv{^~08|Ucn`MUcsda(b$}6 zl8G}-3=L_?+@&6+TeR>QTz29;ICBQOczrrCjP!%B3EqTeR>QTz2 z9;ICBQOczrnOy3T$(5bz$FE*YjIVSi-LlKC@A{e)LP@iJIx{I0O%*X z4a`^cTOho7UWT{M%gDw#CfnwPMAJb0Ma$xo5jl`Hp3AuigtOs@8VE<_KqSUFiE^Bk zC?|OdR5B9<1vidyZFXR9p`fs3q=hX53WWp|3JE9_7EmZGps)%+sj1O$rz3vdYV8Qjg* z7bk2s;Z)mdoGe>_b7ymLer+~R$ra+3r#zgl8-|m2i8z%>F zPcQz7$L@a{9tFPF7={)#qZx6tz6wO8plKY(ji_n3KQ&D! zB=r))PY7ob&ZsoL_m+AR;eC~U3-AQOqX;;qnu_mkq~g3|D*lfs`F;OY)FVwkZ%ZK| z3P}ZGWnnuQ2p=O2*}5QG7i8;t0kmTXPar(3!u^2w zhJr}%2gKQV*EYZo1pJ>>R|7`jEC1)L`0uRp_CHPNrw;uL#kVEQx*6w)!}0AEe##{h zr&|5^2#GJBd0>F97RM9#r@^O5Ap72Nw`0Epdwa6uoQ>Q5i76=N2p_vqYugj;=hA&60!ecKWG0&U|-ljv41GAckHj( zU$Q@k+^6hE?GFmtefC54eFEEQ-)i4vUyt0?_NDd(iq>r3B(S+?h3f{f&vs`w7qYG9RfRHJ8pYM zU{Bf}wZR@iyT^9GhV$aUw%cyCZLr+{Y^809txeDxZFRN^fz7f_vrQJ*SX+*5lr0VA z9JY8H^h980g$=Rwv-K3TAvRwdOS(Wv(vL~sC4I$dNvD%OPI^~hZ#asRUQT)ev|~w6 zBt0x>_b1(*1e*hGcha_`%>wI4TAQ?7V2hGkk{Vzwyp=N5$_)Hhw}~P*KPf9o%vMrL zk}XNhR#HS#Xwo2&+b1b7$tW@tLy7xTxt;by3fpSm`YUXcm$u%Et@dI|6NLt$_sw>v zs@sLl_0p=m*lgPwRj$OoRAGgQ;}w=?JN_#y!%G|H#hhL&(ThbVhReFPdlH3iqE`cK zOH_MZSdf?I@5S_lORAg~OZdq{OE~Mr&Ln&$%O#vl`dDG_dt{o>g}vpao$zAEJy_Bk z3D2myPbQW93VYN`>-1vxB!#MS2NL!uY`d3st4AXeHh83waD$h&(o0*C&?f8JP9!v{ zR_Ywf6;@$8ps-n9+B7e1vX?g2OS@XR97luV0h^XsqF2`vMkT;@`A>qwBaMW3&nzTZ zy)?6zHpENo=b<@fBnT_#-XZ~O0{=l-w#a{4WHb?w1RpW{HhZT0e{hY)SezKV*X8$7oZi(53 z#4Fp6-)-wBY4O|auPJP^O^wa|PJD;A##)Kl;pIKFu5!PR7QftM@d;0Q#%8}Sevxc1 z>2!RH#Nr#gNMy|nwhv_oFnJ`b(S+hPV)d-h>*J7vpBr{lIN9-Hhz3R|D#k;ZC|2aa3n@gQ*v zytHQ9`>Mv=q(FsLd1lUld%U>xfzaPj>SI1cQT5GeVC-#v6qrGJ9b|Zi{0bxJ$7Fz7rQT& zyFFIdS5<59|tjf*t))*C=7VF^D*!Wm$tXW_~V*7E3e?Pd}+g{ID z<*#Cyr{$Onw)bOxj!+!HYm ztK9oz?pE0TnBA%zc6f@mEoQT#-R~JuOh=6J0x`>D7R3l_jcJIfQ8mh9W=JgItf!|j z#ooFTy*Q02V(9Q|SRJF14#XViEt`Xxz=elGec ziP?8XD~*kQ(2L#Y?ZKhweX5*SvmMG7;FZ0$a5a5);AuzI_3Cr?3+XbhDz(jjmGI?C27O6-JL&SYC97!iGgV6_)7nNc@>Z(V{&oXLNXU zh@uUMRz4@%KU$YG{&XU-s7p~lDeP>N@;OnTMV(Z%_dQt58&Pj5+KDK|E$SK1ek1Bh zPhYxpJnGS?PFaILok)y7DXCWOiBcGU!ceq5QQK7wJbx(Ktx+2kc0<%kg)NC{`xVw0 zRi|hbQL_{_Eo!pD#zy5RY*bX5!W>cY5=->%pQEfEi;psUq!u;AQ#T3EQL+YqYLi&k zo*Fc>q($|MQu{jmM{lNRR*y|vFL)$r{n0aW>vz_#WI5|;>&FUv*ZPLSUiPeh))zdh zpY>|AW8QL4c*-SupHmXL_TJt-ob9aSfY%rgd%V2${-p0D)p57=Zi(4WSocfJzSFb5 z#oTXI{>nZqR>?H!v~`;-*Y*5n-R!Z!uBRAlN7PAK&brpBEXumbDtsCG(qL8I%vxqu z-ppETov3Q$Tb1{*j<6~(Wwm+MeQT^WLX``(4pLYjYoNl69*eS)$X_Ha@?50yLy=!Z zD(@5dVWjdjUF%VokL{8{*Ar0WYaV|U`BLO_s^zD=w4+|ygOT^C+(VK3Bo-4Jxl>}% z10t2Th};ypUeY30M=Ea-xgfGx(dOF273QTS-Jh^W(W-3y6gJzV#gQeEg^D&lGEZR{ zk;5dGv^mnLXo->03JZ@^9t8i%K1kAHmPh)lT-~#NL|pRdvtx$G$430*=|S{|5lY7* z&UkY_i#RD;iFz{PeThZ96>-8t^Z1g8;}OrO+$SR*Raj@lJqkMzby8xEwGnFMwtFI! z2eB7M+$wXU?upnSG0)C}kcb;1R{l0E^0kO1GB=_vqETUW5fu`P>4;GNC1P5H@-Go% zBb0xM80GQu5or+)Rkw>4A7NEAbHosZ#Yd>wis%{Pt7y!#s#z|0{Ilgpi?Yiohede{ z%V~@97Os5DyRxo*nB@(LMLlYHS+(btc+xS;3yL<%a!g{DCoB&u?0$=~c*}l^vTn;Z z&ra2{*|X04KgQkzFsds1AAk3~H#5nkXVOTYOe!G>$)r+3LK0dCkc1#T1gW6}CK!4r z^cso?SQZroQL3QW5E~Y-`(0fty6Uc2Sao;R%*+3C&YKys;O_rtoI95@=bhWmJ@=e* z&%H16h8M@jE~(E!z`38c&AD(~A8esZaq8Ukb8wq^2}uNUb^t^ zOW5bi?egTdCb%S0!m5NNu3uXcToNgvF=3JmHa=mbD_4^+*p=&-P~yt`q8Xh<3rk+?Gf}pnFZZp`$056I30~s#*W7=W-sh{zK1ozhb@S`t>U}?^-`| z^RD$n5A5Cl3A^IKyX3*U=z%@uhGkxLmz!DQDfg@g?}QuA`bV&%9=r!Uc=vcN4ntN6G4vj@kRH#rnu(z3qO&TIjYutsY;RwVMa#@umGCEZ&3X@vm7! zJTQNEO*6N;%guP#Q?8d)*6R}A?q18Re*laBrw8vxH(vbTJ+Lo5uutM$5;*?tc$eJG z?h)^jwpm}sUvQOnKHIg{#-GWW;DS9G?~=Rm2jg9GH~x=cdpvmCJ$M^Eur(goviJoq z%8vM%danCF;$71AhQ=K~!L2vNk9Nze_~9Pd5H~ElCVqfUC2K)^Up<$-FTR%x_O{!P z*=>j$)@^_r7N75y=<(g-yXsHGC%SFZ|DRl}r+5E%E+RhIRV$A-FWxua=qgQ$`%TZ? zurz6p%JoDK_jttp9QS?PHw5jvH|}aSOTf5~;#}Hcr`-D<*qff*tDf8op4>B@+|O~3 z>!qO#ckYz?*X-1|W3FEhxnaP&Plu(x5a*J`R6iHqjdK4dEbT}498CMsZJosJircDF zx#2y(;eWp2{k`FRi(4PJRo_#(@od~GH8F%SA3TE)}_ixahbr(v{-^ku%3Zw#RC5(Xs!Ig+!0N7W2H1>g5Xo9hOW7}dk$F4WEnuv*3@$ zBkji+hdv(2x#lYNq0O`lkCgW1WAKJCfm=BCBHciF={>_Z>{ut^ZfapDQQrmpO@;?k zD(d9@NHtJJ%Fhmw_W@@b|LQINg?s`1ig$$({@>&zN*Qy4QU!QD|5{HFyweP+T&9dh zI+yd~2wxt@IO7;Hl}ePSFn%bdVyt`sDd{3e8G@HEArAnh{M3AYYChAM&(G4k)C6uY zA^IyAzJlRVl!`KL*N;r$M}}J%K8ee^&hYCDk7W2bhX2NpFiy?N2DIp(l*j!iRA-DO zr3_h3BrB4BT#M#LsTxEqE&=Y40x{|?pPrTtNGUmN<}?GRHmsiMB=9o@>2&H zGn(Pcc|^FqxVw~|y^5FzA>T%MWf#R8;JzlRTN~x&dIO?TkbX_6Isj<{MQh0Q#(1P8 zorM^|JTt=d1t8P3q}7`8rCCZ*snp(^5{ia=HyE**HR8Nl`KabA?jM%WpCK zEzaYHG(g_t{HNMtK2gPI8^?oC@3^DdgTJ)I=7D zp`kq0yf?K%KCGwwY&hkWaHe*co>Id3sl)UX^7PbUuGL|R=25~a4>(#R&tuBh7-uBY z{F+mTo-+M7rXR=j9ZWxt={uNy96#$|%5h9Njwv^q0#Qn=*F==kXvCaC9&gV@9zCzb zn%?3()i9PQpa;+j+zv~r%(bc@3i4d0P(c)sCkhorL7vMLD!7;Ca(ycJskvOA2Cn~P zPK!)t;J11qibXCm896_a^2Upt#~Wb*r?OhPtRgO}mCGvPvRb*UBBtNU^oyACc229c zxp=mkx$a%gzsr4f8>e?M{C)2K_ZhO8d)2^wWgv+1AVE|gf~YOv7Sy4=LxwZ=V<&1A<96RIR#reA!z6h7B`I2_#%}zF-UnC5+=p9niR)8=J4%Tk7J_Co_rM~C7csn* z;PSt@-~P?N-cM~&?$_I*wc^(%ruGuI@m|JUtoZ_d4U2@3YZ>w(|N0?6Rj3h1UF2Uc zGUPgyrHtb`NQ94T^k`mxtgQfM2iLhnhwxZ@%uh{Y_%ywAhRo;s%xB1JT;gjC|CDJq zam||;lA)~y|KEbQ9NstVp3m6CI_6+M=`&Tpd6y zQU@@7=oWbDADmyWw}?xZ7&4d3)z`0B;xRdxArAgElk0YfOFu*q@dL}Z9~h^OYf?vW zC7LO3V#=HN**NaoIL6$|J-nAGoM%WR<4oWZq2Hj~ISkp)?cL9#;Lp_jP4y`E7nY^l zC{;&jnCW;!D7Ew*&cDOYdXwyuS2HJjGfgv>wUEpGfn+#1b0~1?G)|4+f7M2qxB-c% zeav}%OgHeee`Pvpj?3-An5P)?I6?5{S)%DjaNL8Aydj1$H!{vf zLkj9}hVy5bvX%0RmGG6LoIlF=n^+o~xka}z{v=L|obQ0bc1o337-t{hD3LtZPSX5R zA{l;?;DX}=#ghhT1v2xD9Bri4WGVOdQm((?Sr*Jsk>)Ivtz4hcoF7ej@f)Y-2?r|< zaZ4fBr;stL8I$Fw_>J=7B*A4~CFQY>>4r^BOcbp%> zGzQVezGJ!FlVG7T1 zzL{~FIsYxg7cyia%hj0PPIoe$@0iYaOlJz?Pceo8 zlUD@Uhp90qtFu{m{fTi{r>D!yfSBtsTZiW`Zkx4UzHR`9Pn z&bJK7V@Mw78#%3ENGPYX7_x`+dnk`v)RE#gY3etbN>{l4$`pbtTq}hoymANOD9i~; z8|Uw2952p?FrB|qjI zvi4qMA`Sdg*6?dsWB-(UyN0RtX01RlW^clT1dB&{lJfFMUTePQbRI>q%hyc*L^_Wx zg=?hqBi}%9(njzr^lg#NV`t}bPjV~ll#0J`J%cC}f8!D>80T+Xp9+?lpD}y^!6hd@ z^%?)VfPPh830DOA!^iZ4G^$)oA3!~tYR=`V0!M)%Uf=p$csm2)YA7}!YDZs%!!qh)9V^%PQ z3VybNA$_@@S$--jcr1#T8;cmTh$$B_ei7p@<5HHfe3;H0(wkd-jk*0A_r^7XD6xd8 z#1jtqr<7ChF!D4;v5cdzeZ+Qz{0&o^%XH>4ow-c;SFYhAruG5jwCZ*fW41DdR>p57 zd@*0~L%P~<8R=Lh6zO=%D-LR%_>Oyn<*@Q0L8Nn}amj-6xNj1v+=bg1MtLJ^TuK<1 z&b+F;PjJ!BblMqzBzu%lBa~v+5O3T|dE6xn`syA%&p5iCGmq%V^9W+{qEvZ`Aj&J0$924TO6(`@5;DQn zWahL;E?uU)lukV?KGNr!4(Hi1k4qfP_$>@qDX&(lWbMY&Q*t1cB5N!a?Tph-dA#AC z;0*+kD>&cG)S8&u2!UOC3U_GL&VL_0LWp6u)Qp=(&0qM7{vK_qNBu8-tY-S*h8f#ls9=Zgmn^SALVgZ zGM<%x=RA9R1X~;`>o77~)-vnZ!bv#LY97RxhEiTU!72Mdgzhc*nW!1`XIW#EeS0wPP5oBR6!8c~8n1c`23IVH1U~Zsol7MCgI!*a_s1f*b$Q@dk3E)%TDZ$y3_V(E%?3-lB!PWa@YV=>+<M(l-=R_JypQug zDR$&pmf~$zgric5x2Q2br@RU{H*%h}V&}J%cj~^WTF$d%21QVohY>^`g;bUd|KrqF z5>CU((w>el#TxLqf_D~#m6(Mvnf!blvh0x3({qCCOR~CWm)hut>U?`nSZIjRmXIte zW@Wzeak)LGq9Vs$F7~MLzn$vWvuD4GK7HuC+dActe1s{Qq`?yJ3_tk#Y#*M^A`^jR*3FBNCC zLG)Rw9TUURXUjV_sNt}#67k-KJSnv#Bq}pAwVQWzhM!S{1P3K~dD$?gS(ojo9@60O zB4oN}SL7upr{sl&g$HHIdAa%d1$p*R{L2JrP^^qzHiZV|=jY|(-zh=<0EC6f#^$&B zR{VMTnny-7oM>4z<3wd{`8~tdJ~sCK=N2!_Y8 zQ+CuCA9+|wi{BKLY|<)IMy{ILcG~ixnC)9Xq;No9#G7KBA#;$u=g_eaf3HnRpRxPEp8Y%a?%3-B8(#b2!w-M@ z>BA3yn1AHRkz>b>Jaly8Z-c-ufPe7QPak~v!-9v79C`T2!w(&ylbcN)*9@;ft4fl( zOTDD@k}js$0!0e$9^jR1@bQr{!h9ToW=FOJ(=0uQn7b$|ya*%0jUd)G35QGe~PGIdc1&PljuspX@m*d+e!| zjeA=Pb7w3bG->PL_Fpna&K`2dmeD0@dVSsC6+M3zmq{NUicTv<-B zhXn`A=F--wcTZSZ+IMBcy;ECDW&2_6dF{*j%SD1HxbJ?vJ|l7YV(nAyIjZ3(d97-O zCgm?hl>{2RO{&>P@e{JIkI`!d4i!RN@YpCxczv5mQBo{P1qMallq@zyYHNQ!_}HO` z{-Ldp7Og495UsiSc#8JqC^1PpFiKRU9B&p|P{LH{D>YTU0FL%QWA^qo7^N(lh^RT_ zLy#>9av{hrZx#o%NgK3D;=l$aY`r#8JhWb5eUNIke~U%Z_c+t+d)lxdJ$rs98M~)E+upCAJ-d9GN3seDo(P$&4Mp-fgQ3TpS^Cg0 zV5-Rl`?L{BhD^x*6AeUmK@Dd+$u)%>> zb3_Xw27zyyiDI;dDsM_DmeD4f&zQ)eR@K(tSFD@0d&tfO(+}2->apSOQR`lq zG4@cCc2WLzlh`u**x^Y_RuAYqCwp+W@sBQ;_ww_zwC7DUMq|;3ktjD)iYo~)sL|07 zfQj7<4vVj=Cm}$v0+IZnvLL{zO!O;Bc3lc4+iZErkw8S%P`7;QZ{@qe>&HHNeEu)b z&U2${FHCY2kA58^-3`4n)9?(qG>qzL35Mt!8t{L4XSZ~5^@{-UkMTMmSmCA*8(ThwZgh}zA{r|s$DlY&uI{Ss0~ z*_o(GDHd9#^Ydl< z?vEC(`uV8ig|dNfPHZ|n?(}oTySfiAl>g6pE-86|vTX8&4SPPgBQ^D&Zn^z;%x=3k z#J50xbg$OmD+ukMhuU<pMP(>$tP~YhA}Iioj&J{Z8Ofa z4ieYaKhU;w(yp46VT*n`xnX^&SQqyy(@lu6*Hb@ zbQ;lXuTdN}aM{Ow<1A-w)5(v7=>R)5t`>bZ@B zr&q?uS2Yf5gh4RUDG#<&FqyT;9caqGlII^Tx)D>wKjxWIN}b++fkx>}*nvrJh{ zN*cBIulJ_Uwk1vK{^a}PjlQuB8^-bXX#eAMl@;)xkW=r#N_*!(W4HBOW64uLZNPL#6EbyVEh5kn` z#m82b4H=WVcG2zo`uC{0(DK~7y=GVT?H73xms#Qd$K1YRPwuehNrk0j#+FWN%CW6Y z&wuvtxYe_I7uJm`wrX#CR$p0a>F94fXE=lRt__vaN-P5h4-T^=6)O(!ii#M6!FNSw z9@-fBI@UMTlC)!d(b~YwngUS^cA$!r1X4)G&>{h0C@0zyRMyE<01840F_G8iM0<`J zEEuoA!ZOQfJeNLl^{8>PeY}%*&Ny&n#`CSC9?A(3a#caunC|nDzD*PooQLv(p{ z(bZ8SKU{rXJ9>8h=c4qL{}Yu@|NedB_<6Iud}C@erY`Rxe^~$6juA5l4W0VNv9)i^ zj}6vlC8hYxtek#w=Ci_o>+DywYlmOguI|oHSe2CZm>B;3bE5qF)hD$lw0*5h9^EDk z-hLAgV8rmB!4E!VlN1b1&d*N?hEy}i4!kXiH4a*Tf-vw6WcUd?0-iEu$R3lTjyvN# zd-|B%>n^!aoBpsdD%#r|9_IC^cvI_ccy@%)3zyDzZgYNo z*Q(lYFST4=#mbN`U3;mAXFjS*A z%($y2@LZr#b_5yp9@lj|)n-LA)nF58b+#aTJkZZ*5C5b!izhx6eUG1B?L7C(8}!0E z`EUQy9)oM}e(kyIFQP%e&l2Rwp%N6b#(ktNCB8;)Z}`e&hgrA^p>ZYMD~Ob7{wV)! ze_P3PE|Kea7k~ht1Hzg*-b{NrtI-X!?Nb=nUZ`~RDbh@sChCYZI>-)m-de*&S}^8ga?WXu9g@m z7KHo63$9Tgbi8nPysJ;p7HC>_q;^B}QKxkDs3IMePdbOfKHDKTx#$Sm9aJRW#{^iH zIu*)%GoHG1l=OIbfyQdfMI&&6B;PZzx}cS2wz1a+Iun7}a8=5)hsruC` z&g%z`9xYnXQ#|~#^Su1>X6K7&KuYP#zT!RSTKBk;|JNY-pG7NR@G$G^?XZSkIx25K zTdwYP;Towm;Zk%-fRAseP`&)kvLiguiyz9t)TQ;ILD(=~sUE0<9p7Xq*o0E4g?i!b zTlch!H%#LF-yTwpikB8(@K0;mG@yNw;q31v>V@A1DG!ydz9ap&pY=8y$Ukl&o|ApO zEj}11Zx{2jgg}FDlm#;%qt)ky_Ak5?FT*|0E0HGIXt+;(J$vbvf$fi@fI{2K-6aZK z_cG0S!&9)Yf^_@JUvY%FnUO@kZeOv1#WLJuUIvM?MoZPo39}|Mk4~j9Tl@* zxOelD3pMY>uz#tOVc6o1*B0HI5{v-3h9>G#i%C6C=OrM zC6Snu$tjJ1?ylXnB&+hzEwlFy?R(dnaa$*3 z&wppb9WU4B4Lv!2{L1puZ7nO$j2Eq|&P@o64ZA-suV>Sc%E`4^)}fQu)ZKA-RJWuy zYqx?)6;)G)re{sRlWH1_6|)xoVlpZ1EBc9$kS6GDI$Ie@45m{q^A&Us(GvifbRT{~wz~@;{YF z+pEsM+HkyCIRmQrPlfz|3_@MJWr!h%tn(_554guJVrAGO1wwt%`P0MBpH7Jpq1H&V zIWi$s4A*@d?Y(<6PRz`_eMV2^0%&4C*Hi(TY0y0Uy}}cffV9{^&<${nzRM&6?Mx-b zUm+H?TVj>)Vud6eW#j^jsX|-$u=a^xI2IMzCn(%c`|4qB$;oehLxcQ{hCoZWpD-O4 z!Tu4J0HY}+DiGl!5Hx@8T36LGAfU(K5#8F;(B>JLqlOPlPN^F?Iz!piK09mdZ9{F@ zGh6x~o)miuXgfvb`H=jT4L)9~Fq8aMUG;R!U(^rv!vE^t=d?StrpLtBTFJcP9WX_EXOBQ?PYw>LXyuq^Y!F3-?dOZBN2BS=);d^wS(}-;w7!e zdBZpBe?^B2X_%a(mK&Z!@1suGHVOju%QEXa~dx%1~O{=PMhu%Ls*oe^vcJe2wS>U)WSWsB6*37vxk|Sb_gvm;zG@miYh-sE5zhJ`W3WBw*46}X*V`T4@+wkh)DfiFC>Fy1S3((3w2 z`$yphN%PZ-nnoPxXCHJy3^;uGA;n_Nq?nw{_M7C%nAMwmNbWmL=yq zFPgksW{w|y@E~e<9FmTrK*F%YkyH{ACOJaQj$lh%T!4?mpoWKgaUIzWM+tc&As|e4 zvT}l1R6tj;nZSYMRq^Z&h&q$(opE%{m0#w(zG>Cr48Md0;;Z?adv82@*IjqQox8Yf znQhP%?F;SeC$v=!{dO8doKKB=a+~)XfBEdqci%_vJJ54&I2jNF2^D}!giGv0rKPCC z8rskm+!u4JVGCKk#hmScf&S-L2LLwsc!aMguMS>g@7>p`} zh1=nOftJR@mIC`jA2C!(&U^Exe_y$6)%bW{)$7pOE~dEp)qPI1Z8~??-aA9^zUl}p z($>tX?6{c;;@q#-4rC9@+IZ>3*tb6W_O(|(a@ER$J_v_T2s1azXq3DIeH;-kzG1f) z^GsN1sMXT}v>=h+7n?OEYo;vMZNAj#^ij?qnRefZ+WVXC`F7R(4|cTP6Cjt1o(t5m zOFrE_^|@D*liHFJR{r+bNug|B|LB2Z=}VB;Tq1aOmR2ngetCOixWusOwfgMg%D@wf9h78dflH<0Ca; z{;Pc~i&qb$y`4BMM9osiW5w+wRZ1BpVF|t^CGp0hqO>$AGCaJW#pLKN1@L?!vs+*E zUxE@uHDI&5fZbqv3g*PXSVK+hvb80o@XQIb0~{KnCh1BNY$o;uhFRQhL5!LB{Lg=1 zJukg?S;dGM6VI=S>6srQ7Q7mp`pL!2?%DQ~LAlSJepdUl_TBo^qk7F7{>-4+J@=fQ zzhKdP$KoYg$e(shZHovQmfLGgSKHyHmct_r-o_bSQf8Mu@SImv-}Lz8pgr5qUR+f$ zwSV8T@XXO=qsA#S7c?(kynNA|1?cbNkkh5$!bs}xNXZe<#q3ZG7K`_dIp~>xF2^Ri zUiUncJ}v50gHOWrwUuj5j(T9}%0)Z+9Kuw~O07=lF*I%XiOtS@`PmKY$DLW_d>*C9 z(tQwf(-3n*JHvtJRI_4q$UL;<{V4@Oi`&VCu@!ZP>e71lOiM39D9rEJ?iTy<3JajQ z7v^CGb!^u{m{y<^O{;%Mq>mBij6PuOO!AmCE{n#}$%mG19~>Q5l3G6eP|2ErqIA6& zEhNCa&g?UIlKSiKK9jZ$HZ>IHafz;;N<TH9a9lyseX#^jmr) z**pI!b?nn`IdkNfT3a7K?c6WFG^(ZN=#wj*PpJd;7Y#`rS6>fjw2QA$yHMh*0Hed; z4-p^aP4#ncu~0|dR3WZ~eD?WEV5PIWs9f93wd&Ys-_hCV$_vhm>VSK|SuRO60VU|x zQY`$NVFr)9)*WQ}CM(TLgD$LDTgD7jC-htMWXtSxtpgW*ard6jp=tJOYj*7H*RO5f z!}rR`>)vgvs%m?8-5F==TIcCC7aJQdu37!;w5urfxE6*Owy}^;skC+l8y!LZ4j=G^9(HPVIBAU7j@yixy;qyR#uHvA=VpUh=8SKhJq><85ok$N4JWhc|?I#gA<* zc5EtR9b7?XOR2t1^dVrp!*$ijBDKwl;h7$m46`H(i)C`^6O(|B4#U zMGbRNL-*?H?+Aqm4aVwf!pz3%%AM4CT`7e%OuIHVtS>HsYA>({Vdnxd1U%JIO`It( z_+%bk`^wLAE^kY%%Sy&_Mz z?Zj%^yMOuil~+D>@r07hJkh1Z4?MvvVKUw5GMytRV!=i}E_YAKf3gmU4vp#?)Ax>% zIfpj}n-V50SI3%+`%GSWw{NO*o>2$9+IuqXC}TfEnTHa(l1A(woD!z0@m)*~AJxSe zoh_(N8)_-cDBu&lXkOZ3Jt_01KfkW|p+05j8@8^nFKC>8SMBHLZhxe*uzcUJ=EX(J zrcT{cExJwLHXzY@moY)F`IU$SX*OK2jkTTJyMdZ5ppV|_>ODx!-$e( zi_$;XFElhT0L&wSZ7?6wb1q|Fi!7GOZf7km@L1sr?4hLSVqp(T8xa*VHT$-$bqDV5 zJ4uvk&(_cLH?Q;y?%lRh-dJ7wy|&7^cA$Kkm~eoVwm6*KG1F48ML#t5*j&rH5LivgQ-1)p#q>8_l~c*i}oRmDVpUkh|%JM1ot zD+j|1W={I^e&Ln?gGu$bg!#Yzr1ti)djexZ4PM3oOPJ5Ar=Jgqi7pVp9^Flj-tJPwsaEmN>!dZX1o zA*)OyxXbS~3PF0u%0;*8e%jIfIMr?ghF{Tc1D_S#c&wj8dF7KfaF zbG{*-)u=yZ&4M?=4}ks&?ls0l`>9eyP=Lc%auH^_wR%hSKGk;t^qt}Sf&%%}KSC3u zy-fbOv41_S*^(!3pOQ5oGOSNR@tD35z0k5Xg;U3O%elW!Ui^FbgcM?t9ZBqFWc87Gqm(>ja9!B)u;ao~CzNJ91u2n?gjfuhpILIczHoMR_3Xk) zr{@ovUeGvu&b0jLm9W|RZ=E4>`rnqiQKXFMFLGyW>9=0)I-*>AXWFt5U(2%T+U4@P zR4}Lz*R()+zA==oE(pgg+USAaEUs4wrAPuCylSMn8_NbwE0{5>X?p&&$|a}j3!AE|n+hkL(w^EVr`45< ztm(@vz9Gw|iS896(!_evZ_7;W%>igd>WF^YtBqU9`ksnYtZ7QE)CK+L8)C62=I|A; z!2-i!Fxs&b6nI&Wbtq*&k10>re>*GUa@YP7vx=76a~2OQzGLLT2^l??<#b;(s8@^J z7T={jcXwWXRB~KodG5~KqDZns_GlZ$8pur2$SmjJ`Y`#K9Ox<18kSOckKJOk@U|l~ zGRVkxn=)Vfq#}pn^l~cXBfo!c7)twD0%YKDh^s&Mr2*_Mj3U zz9}?r!n519J~1XCaz|9W{POF;OaFf6+z%^*AE6qQV}6$7Jqb3f&%xmqOIWOrPmI66 z6y^)%P~W^KVeN1IOc>(zUA?ZRaw#ZpU?m56q! z_xQY*U!MH9;gzg}wJ}*MwrZa*|73VmS=in!{^bkCe70O^f_D zN>c0SP2F2c`Yy`aIA(o9+KPco2M<{`Xwb5%s-*+vclylF-ZFZvEhWXacJ$`%^Giz> zW^Wv|HX$V?aowm*+4D<)G>9IktXxKYkC+X04(3vr)U6~`3JD1^gPQ`;xS$|k5vn?T z(K3BXQFtY(rT7C^Kvq)M;}2^-oFeoG_tF5d@VGWscxf++p4y8CwHHJ$d{k}1N%^nx zTkX!pk1p1(ivWBniX?ZM>$Iy3S3b>P_Op=3-!-1Z(kvatvfayevW>iKXzo-Y|A zvUy6`;1O?Jn0rs9y<*FRr89FEPM)@>y1sZ|_1ACBJyMb}Z$-)e`Q7fAHGOZ*wjL`R z^KT#gT3gbrVVm|R#%&Kxi5Oel zwYYa`%JBI!^M+NVT4L(^GXdDj_9j`v{octQO6rss z`MGFKUP^MVSdp8QoS&bZlxuM0WM<;+&)M0oZ?d2#A-c01v)zLDk-k{9{Su;z%!(s5 zWJQ+5PHXI3>mi*L35j}W7;RmI1&6}5uPQgTu3ZMazAFuniYbRS;xnc>CwZOEKg@zDLk^6H$quW8>OJg9y5>Ku{$>zl2Y?}(3?7a4VO-+jj-Ll=cb zUzl+GyDe+~er7U%e|vf|IHX*$$g>SE!@^9#-mt$hF)=tsG8nusgy|ulv^5Wh09e^= z&FIq)?hq`|ojhq4NO7pq#2{kYsx@Q6Qyf(#_4a<-XU(ZAE|{8`p1bPZiAzQo=S>@D zczO1Gt@yU|qHd$h%E#uYYF0&IOhkR8Rl8GFOM2vG-(HKF4V4xt4=XRi59uc*mIV9w z`Wn2wyo`Q|Suz=M%7;QKUe5`qs_C<=R)ixETO{dUL&fm<+UFu}K7x+7icxoHS4Hd{ z+F`kyxT{>dSG%`D+!=Kvi@7~jnAAj^55lh88ANt4eLZl3=d7Bzw*3_)%z0g`TaT#r z8a-MO?juClBR<~EDSnU*U8Q33O!|8HD^i$%3)EqjR-}h_W*9x_2s_Ob@nW*r6zs0+ zbIWG4`~fSa+{7<(A7Qxv!0jd9J@CfHrrP?EV`r`T0|q*H6RU`5W$EfQ4RgC_cTmu$ z_^_s5Rr&9i|A>L6+`=oO<2Pf7YBcU-T|*{MHCO_IOf~-gv+8RMSx#%g9m*K_-cZD{p5)a%9tTr z#*W)Ebm*3GW48=(%tAY7jU71)S!)A9y?=|Nk zGRz})gX~k4=e3D9VprF#Q=&RWujVMjaenU|c#9D817mlAIcPrCsxNi+x8@c6QTU9> zDmOcy{jO%Dbx7adQ}fDtZ62{|SHX;`qhg;jeA+j|rqpEh?Vpu4DyP@VIpvOd19A9O zNJ&bCyagrE9*nQi6cZB}8RECVCZV{TFLQYNjl6I=e~`+^8p;iuPLGl7@ zQ&w7%ZX1=6Pj%|-oflrdH+knnVUmzGTOhs;sTf|D*c3l_K!nj65>q{DSWHCnjJcUa z<2ZbdWvt^{ORy;Vs7geHZkmO-)O^yr@E<9v9t$nSy`y}?Oe76isY4wPOsb1K) zICN;m$|YNSldZNlzbY+1Got^fJnf`0*V(Ie!?@EcAhKd zu<^S_sWh74iIHU5wTXsb?qSS&yu0Z!OQ2b~5R9m^*K=G!t)!di77Iov1#f{ztlh(V zcElA1S$f4*4x3Rsswp3_j@s3RStfP5YV4L=<`Om+1XvjCqOzO(%A5(f%fWxr3@*#BqSs~J=$jRb@=-Qm{m1U zh`>%Yem#fvmS(-Cm}~k-Q%(Pi=m~vOY1-DlBN?IKBFxULuu)urFiIF!T0AAMZ_h1t zt9BJOk}z^tIx0IeBh1p(UF$!RQ1j92R=jU56?TS#dKV&ouTM!_c8?ypxmm>p1v#0D zlIiP6Nreg=ek(Gl}F1qyk!|v}qH*OYTP(Eof)P>z24$UNLYulwkYkHS& zf`nV(mTY%G2g6HP}IklhSd{%UhBVS7}0AC3xFyK9-`+MiXgqG=&Pn**Ib4 zhzzXGhNWChVU=T3)-B|)%4g>ztg>lPSw-Z@(mV>Q%qx|T7M-uI4$DBf5F-2rh}UizGj@bTj&h- z;8aUbGEU+xIHhhJsZq)Wj_;Y&XdS6@jm$chWD-!(a1vCevwg;um?N;yaRMpS;_V%% znEe#|8L-{&FI<6QaMC~%&B`Kej~CU&&h$;1j7zhdR4)m8Dq3&og+D~M0R*HB^7(^6WNe%}D5z%lVv@!@mmh#F^MA`8( z+ELsivwy#6`w;O`1FJT%#A5OmikFXU@G@g?a4twy zDKZ=rffC&t%chTOg*`T2yGJzCYX`LZZx;>PJ-3Sq>K=S+_cVwJ+I+l!-eps2z#L=T~;S{0l^tosIlVi`l_PpXh9^s1Gvxc)B(#OtU zd#`KSNoW2jV&!f`CG?U)OMEhmgd^ANhz!=ZZuCe+e}%U4uxUig9jmyVok4jxBc$6R z@DsC+ip4xkjqFiZ*CS@=paG3Vt}%b!)TFxpwG+D*4zDfT(Ok7+@S%CH zu3ULxhWc~=DMR{}rp9&eo!x!n{MtEf{cZ7gh9*bcK0I$oWoG`!QH7fsF!4k~NKD04)R(TbjjZ13x7`?0<2Mp!cX5u6(z!P4JtYklIHNE5om1pA`1DtdkkWH= z$^V2}8<)a&osD}GDkOVJq<3IoM5!^U8+O6*>Q19n6yf8@!f_bat~2=_u|l$PqB})k zL57)bie%}0PPdZ>hn#<%BckBQp>UV{(XHWIefl2$SYwn&r;ogO*8BKd< zOuBn?)2D~eFPm9?cfZ_0FHc(eU`pPj+L61TyKmN*(VK^fOAFh41=nNz2S&$Zz!+gf zU6_UmEA;JLm%tlTI=%)@G}T4Nks39+rN;M67e5^dWkHI}MemHk9YTq?AHZ5-Nm31o ziq#k!ALktwCS~|za?>6NwhC~(9&!Yen|injUa#Labivho+df~`@_#!j7uCmm$8Q*={nG#I^a5yIpoVau4g2aih?#KrJn=zioEE-=%zQfK798RO zrUO2BmFZ;MjKlTOajKvN_ zW02ex*a^Y^uCrq7Le?!K-JPuG$&D48SzMgit+=?G>s#Kse!bRI)Vnk{x3qVW{7g~r zlHA;q-bEcbN$IcF4xUx;YKK%G;mm z5-r|Mn$QDrD0?C!wQjbCA_S($$!9v&B_%DaTvK^@mGBp-smb#Pt{M31@|q2~@`|X~ ztCxnZwL6zbMK@lgna>dbJmMo=BaSY{Oo~M?fP2Jm#%U4YCE&!}ftbuPT8vbExNicdp(nKMV0sao} zloUOJ111hfGkJPDxszuM5uy~K7Ob$#ltOE0wO5 zXPJ&^gojQQ0&a;;_$_q4_Ry)4uzd@hjLvklVme2s(}7JnOu<1}v}L?jtZ3?J{aJ#` z4GiaVXRLoE>mwzXaky&rTsq!BV5XoS<5PPd!r z>?2uD>lXTHkaU>q-}M$c)gC%SdAH!7-ogt!)>HM$yREjA~C;q1T?CDgWO6h*4 z6Wggim&mST3lVW3sB@(#W;&s;#5?tmVU95b_32MIa<2S4==hwKvjgx=$_tHv%Rm$74#;@*uV*AE(cip)s1mVGbcoA!I#tq3OegUcI>aS9ogv~GrqkIYq1T7FM5i-E>|{Ef zwV_Lx6*!xy)8Sb$6gXHPv|^Q_qC;tQz&YIzTX0ZNTwHQ?baa?vPWEwRhOvg3{yN8t z=q4bvh6>&3#iwswJA(eQ0;S=91Wzj=IT_aM!04is>63em>~`m{QMPCQS2*?ctZZ*} zrpag0=pM7iS%XS$uQMe4*8pqx*f9s|eN`!u|H6FQ_vSw5nV|PorSt&zReYyDC%-`< z)1hOXn7!g|rjv<7l*iMT+gG(0RsDJ2#k)nxJ);lUvx5^i|F!r1938bT>((})g8!hwWqpRD+> z2*6=cil?}A=@K0lMd}1MJ0&%5!@u$0hTmVK^P@`t?_uMHP^}<;5+v-+B1Q#UynYFi z!xDp2BfOSlC!ddv=sqhB*MK|Pecc6_wH#tX1}@bC*Umkm_2=mDb%R%*a7Tyl#|@27 zE_*t4C<4U0)}7q!94+rhfcWWE&ac$JEPE2Y+<`D2c^7-FbT3?W#~6$w`bQN)>~@V& z#|B`{Ax+a|2~>9!@Mwf~vIKqt&LEakI;FuKf6^%#L1~wp()+;5AW5a$C1UUz8dYN_ zI$r~$j^&h2r>bMOPR9#$^bte7-vL%BajA<=6-+7fX|Ee}B;187aQ+x04?2=j3^Ni} zWdpi|*RR1k^izU94c=%q5jX2)4v}W)WnvRoJm==rOWJbfkl`$Dq9%$aDMRkXoO&N@ z!dZr^fD=uVR3&4p4|T-pUwJz7XNHUST0j+=Ar5)EW-Z0lyKJlzE*#y)ia~t6duCtK zdeYfn)DGL4G(#lp_@UOv0Y{WP;6tb_>Rg%zY^5Zs1F**vMYrDgi6Db1*b9NFCRb=D zJLv|>?z6(gSJ=lBs;o7L=U&pbZ#!|qWKcsgEMhCJ$d7g&5WgS}+N;G|s`a!ZYPH)UT^JyO}z@6Hr;QTRgK!@5e zhg!B8C(V{}%kU(%xFdjDj2V9en^t?Vy5k^mYcQ-8&uV`h<=*9fS{UVAsE5D_qxbg~)*rRD5Jhjjb{Wrafu(3!$Ors-`W zn&=&l?EMdlFmHk$m|cGA(7Jw?<>3``nw13Sz;SanIZIJ%l7xMDG}!knwaB`r6xqr5 zjFv&>z}}bGdW9x=3jJX|9n)!@0jJT4Yv6zm%VI>7P_KZ~O4;jyXPE;r-8|)z=E>zk zLu+6z=%O%Z|%N3O_yC$qtxfmJsB4$d1O@2#Nwe#RxE5QJ+wB;+cv$mvh~EM zKFd6(Vid=QwPR1Ma$e96Vc>XA`#PMGpDZG^O=y~`6Jlk)fR&o&VB`k^Io$l}mN={Zna~m?05a$DOp7S+%Z2K?WCgy&j zy|;6xNcnE%(~Eo0_~dBel+?6|hS$tK`u!Jsyv$FD+N)Q^u=9Ir4t%otymozOP=MMJ z=ntVF&FQ#i>WVXaVv6XnByx_wu*YmTc|ShnCG7+av{m`mbuNZ&2RF~^l;9@{z> zj+MEDjug0YXcfare{c!tunfT(LfowNq?0Ou<5`yV*xS}+3(6(g!sSA4e8}Z?=~V7+ zl$*~wFP??YTUkcD8P=&(KIzZ3r?4WjpI0%J0vz^t*NjiHaP3F9aIj#2P7aQ3s_wl5|7|8aPx|^XY=lR3J%k?|@E)y~kPH)~V1SaF#}YlHn$X-&|^? z^dOho{eP5N2?O7JI=xe=!RUD$>IZew+OWo!Q2)kjJ?WGTpttGJrwJMiNnFdl4qV8V zN@)j|=*8!?b$JF0OVw#*=U4?>Vsfm+D+nX0$g@9bAE$< z<{J@l`i8mqm;;aVaEXCk6lpKZf7&dr@7=2fYD zJrmMt-;Moz?2*-dc-0d0Ym7!jCqEz4Vd<^Y8BCW004MAgI^?y|=?vz#znM=*-b{z3 zw@#-@G%}rtTj-GV*6CD9(9%&>^euG$`ofo{37;E2i@hQ5(#2PN!Cb+oEYTi0h_TO9T2Y!DX`=j17NuB?h?Set0YJ?i{^W*o%P?2Rs%N18>Lx z9KI*aqd{^ok4^zDw{Xi8K7+;5YqX9dmh$Knbdp~HV2_sQz}6r-(mhNk)V)WGvUHCx z$sP8Uia`@;j1%4dUSQ}{O5IeX#*S+|Cb7Xf8GTG(MW_`lE3p;CvT_TT71YTOIt&uG ziN|f63kRApN((aFkn}novZk00bZA{a3A~vO+hI%xIIxjGC-4?J)OMXtrF5L@W4@UV z_aV{23IJ5>V!5f1_6G6s0rryval?^h#+6O1TXO_(rw!t8M8(U&qi#Pu^1fNU8&bN) z*BW-sUGsZ`df$d4RpI_?d@LX@Jp=je5A7rgc6(sF)#?-L?~j{_BP{_gjkJ?XO4mqS z!S;OI!o6F~5eR(ZkYclx(&A|;X$dvm#@!}DwI8Z>HKq=XiYrYRS@Yg|L-!e8i}GLP z6FOye+p6}QC- zu=@hMx_2)qNHQTtgCaEg^l@*p-7egxEGW=T*l@QS?$yr3#cqnp(kT{Np)gxJ1>DMV zSWb^64GpV%Sy_H=c}aY1S#j8MJHUJ0_P+=<<82XwzoPUB&T;(m}SU!u+ftQC8BUsJOVOs8p;APPlD!N?=6a{$&v` zfY@tqdPt&sHF6Q}S0&|^L>iNlEU~e4xrV`9R#i2yfB&?+tX{5LHa?;2`Z&g?4?+@d zs8{fi{QqCKp>(?UI)yxj?s!yzgK~PH@&C(>9AD&?_bJNlTb@%gx##kRiA$DExUEBNEGZ}`EiEW0sn4zNJEhq%Ws*ar`bJh&MFvFo9~cLZ0>;|7l4t08 zefB94JR_oRc)av|dY+*V={WLvo>^7csCP>qjAqnNA@BZQMA#PseodJWB)J zFPVpJIycUAXcjm08E6(UB>Sd9qr0Ka0Qw6EP(-)g`yz3}q?#z@h+mwQW$%$d9Gv{Rd z2W7;sdrST*P5`V3zz=+#3m<)=_;v7ho*jG0aCU&7W!O!TqZ^VO`OP^fpe1F}=q~C9 znX_l4bV-_8SU5GQOUjJdc#8q*{TJMZ-vCYD_ly!C3mn%QN9G0`fASG0epyTJ9H7=+ zz#Dl25v?ESwZb<*6)Lxk&l>1wN9`P@l3yTSFjcLeu=7r@X~vw9#RVe^O@^J^hB)NLS=VI^hO3@y8f4Vs|D)_X0HV6G zzvsR(4Q60~q4%LE(z_ICBBCHtRZ#3*EMr$xtca*sv3CV*u^VGzPohbT>CH{DDVyDm z=_Z?v$~?c{y>A9F$?pH#n4t`B-o5YKbI(2XckXhI%9Z#Wtv_;7UbUw|TwA>ZJ|#zN zpQ?3;8eThp#Ly*m!xM6H(Gj4BaF;TkdBoW1!zeFOo}@E^-)t8o4A8#M^4hCT1_%^( z-vNJcyCd!NFR_vIgiVp%>Vtdr?d&)o?B|<_z!;_3$2{!?MC&hgt~#A)sPpj9Iv5CU zJ_O>57GOrv;4=mNWwfK_X-p~@(LL?ZgiMy)T(veam*5bRFkbkUoyIyChQuGyRWa4 zU7gY%IsS1Ud)}s@4>nh;j8b)CkAO};^S&+_eS(V}P5zqiL*n8>@FHIZB_;-SiHT93 zb?G*7O0-+pgeg&9JXLds+A~>mK#Wzu8BA>=6+oq(A8*9_&HNBlvW}1|5%{^XY!bF1 z9S|59ES86BEx*!h*$H)p{iWL<|H1)z4W9{Dz#63Yw|xfLMh5%^J_VR|o!-Z3_YC_) z8cBHS6Zat-la)##gv^9uN%%W_ z4M#sCEMQkVQgk0Xil|BiM@Jb{6}eG3r|?k%Iilepo2W$M4v`NZwUG}1v-Q18kguJ+ zcYw2W56SW;$BYyEJ^YOKPcu)5iW)z;d;5ph8L}9f5;Uj3GtG<57;2FG1QhEMPXO02 zBpCDf0QHcEMjb?F#dDk{07BnWW5vCrXD5501ksvD`5(amg>uUp{_cMTLgZsMZ7Tb} zu@L2%QZ!A>6uxyU?WxaO$$Z|}I-urTpeDnfQ*p@c<#cjXMy4Y0;bam5O8+Wn0I0n& z#9ycN4KYfm&vFj5-he-sZXOTfO-pM>w;_29if4&2qHSX`@28S^KY8TtDTE-5Ns*Ho zTBs-p3Yz&yItPRh38Hmf)>jVydHZ(moAw)gQ*$$Sdh=#(a&t4rvQi#n#oBmD)ZpIe zu=1=DK6Bg{rz#v;G_b@fa}BqItTu~*&Rq0=_?eX^W7vG-*gbk`m@Tf&6Qhzxxdt=uSS6 zT>3T_aUrX@sa(XGt%O)UwKQ|hbVZnFfQ=4oAHUNT0d^gp2$l(G1Yd>tFXp)mU|A)O zfrNOtx$|a|RvVzRr~JjFtNfMnn5zIy3v5pd(vh+WJu|`DE5*&(z^dCq_@)0OPIEHX z{dB7B-2Jub*&Ba6-g0x`@K<)U?Y&h!@TU0MSz+D%ZR1|tHI)DSbAH6`>!YUJ*gSwg zE4?6$JUM6Kv!g{mvi)sw+=be?Cx+8mD=}-}_+i#GD~2ehK%RUL8v0QC64}P6)KdGn z!NnwJx5hGsUY4^4n%;_ij`K$bPek{ZI66;*_SUfNJ zO}@UdT*@JrDmGo4NWPQ;mK`rA{FwIbq~h3O+M1OpiZJ?p>_=Mf>Y#Ap&HmoretzhZ zqqVLcP9xd6&9bJuxj|e6(DHqn*344b;SR)mR&x0r`e;Jl&PA58WpmH#k9WRGx*pgkefZk0$BG*{%_}S4{CV~M zf7V(l^?&8w+qi&b=rjBDKUkL3_j^-04KjEE9$QIDP1H(@cX^^o4uVf~~=EMGk@vKHX6C1X7ye_E)Ph-=Oet2n(9ANWISZpMJwvh9=Vq8_vy! zAIBhB;uzirE6Rc9NmG_haE=vCZ_I2wv!i+A(%ZlO`pLWl@%Cze*JTcFy4YaHV68T& zn`^;PXPw`mrL!uZTjTilho8Rt_WP?CuAGsC4y*_%^N(D+x35&(D_JGXLr!+VsObLD zIC&_gT43?IL#}nrG^$lyyM~1+TpY|!z5xNi{qs<;dV4za?kvg-0fGG}8$O-eV1U_S zpi=N8qd_)WDT)XJ&dfgKnpeIxd-vw^mu7#uYv#e+)&(E08nCWBfA{z^t%LSYom{nV z>t3bbfa8ldp72l`Z#~y|V@wy5S{x?T8W^7vAzP3yB{!NqC^jx!jN!=1GhC+jR z+aYr4ra;dTgI4K=7^sp$jImT=dRBsrCR%i81ET>1jbJBD@{e#o>lNiIzrFHoNOQQ76Qd1)sul?W-8!*R9Kf&ymD59gRa5ng*#XHwjzI7IXu1NFYaFRLpluI+s&S=uS+OI}6!7^jzc0mrHv0J2H0oki>bT<{clr;LGhB zKChd6V`0(sj5p6$o}1He!`!gr}DzhJv^M_3?bMfT7&EWWuU?GY8qMW zNluWJq08xv8K4R%NJ9%9PZh`A*)U;Eufi4OQ;+xTakBOwpEixEo;>k|IWyXdd*n1# zFRDAbfvZ~?J}|pySxCJ9M*ptoR?eI2t@WNiyn1mCP%Zqrl=UA{jQN?RY5aafG+8CF z(Zj>jGsK?vQUF#us?#Zy3x@;x@6c!lLxY0g$EJW>Lt>Yl)Jp-O_7=t-3P>>pO`Np! z)SzKUKC82@T9_?8;_kowczI;WuBqedQY#1U%<495aFBmon6ul&XIE^IzPvjF)rYGV zpu^1Clc%A9N^^S9LVtj94F+Dx_j#352HRj{^%FUaB!!}GDmD~*}Fx{t)` zSpw)fq@bw0TeYY6gt*F8{e<4_55|shP%qXQQa3K;?I7VHLj~j$;KY1DPt3=^VCVF~ z6GkX}5eYYtE`koQFJ@5(p(4B1tYO)aB-9F=LsLazcmo_5k|Rl$fFYp_TZ&e>+LMpE z2NqQXB^jNFa0JY@2eW27VAZo z*lUBi-7X~BO~u!uD#gEd3V9`{w5-58XM2HV51l(C3M#-c_u1^U#~0Y;y-__438PXf zfF@`|d}2tG#a6&4bi|5tp}nz=-7|Cx)u7g_ffWPgD)qJ9&IoO@3#8nLLK8!z&!7KawiEvYfrm985yesZFlYu3P&0lTsy zh7Jz)i|OX#Hl~H1{47$7Xq1x1eDQQ1SaI5inc}HA+8d0#qa)zdC{maeQ4J>vg*<$M zrrb$5u|Jp3{`Y3URPPI(!xOfquWpemSeKQ*^Y58e5 zyAEQ-s#*45AVzaQ&6ZgQ=c=ctkB==a8K>j_&bE3wl0#Aa%#u z@e7g)!?8GlL6as8*i@6Y>|0@QfP15h-{0@fTUX+TrAQsPH$8ml;1K`VZZ3x0S*I4< zCaOBngs#UK#uawxyLJc^))`86E>jsF1g#!$u}FodM-r2=I17X!(?4(7 z^4Yv5Vt0Z3ApO>VMEkX#8)h8e-36UT-hY!kX#T!o;r(Y`v&?EN`fS;(^W#1^T)BU3 z`YWJ>%j0|eI*f0mqq}g<&d7aGqQ@k&S6D7w7NU5a{Xh^a0I1;CNoA9&B8K|=OiCTP zbBOd2+6=F;Y@9nvr&(a{lCp6*x2P}^_h&j8?(YU$h{h4LzrzB?)?qitqlChTW<;OK zsi$5kZP~Q9^+14MtI@|nl3Z4Ny$Kj;$IspV;o+LU%`4t|Xq5D#^fslQtr9me@nmL6nol#yI3*3Z;Srq~?HTFhn$mT^ z)IR>(rLCvQol`zJ02|XA(}ey>;|rzb+%Stma>^|2D)Nh!cA0a_$p*_Xz8AUKe}GcC zl=j9(tjk4QrF2sGfsRgUwL9=Q9n8SHCIBsFIuj63+2&+;8ti}%g~PQI3E4`*Y~lya zKRrCq|B%1`M$5kayMJ79aAfNkrPIUl+Oan_uKB*P{->31NS1{fDVY34IrHB)Ie*K? z+s~J&#BEd_O^2m<3H%a`D2%~ma)<_QvAtc_u4=U}v|A7hvtYoBh;?8^pVSF5+)cTf zNN%D?H;CMVgY6Y;7A{oG2}|^>I9g|36QJ>Hnp%5&kXK^Z;mq{f3Auy1?TH+ekv}du zJxl0aedglCeGgU-tEw8-@b8w17f%meCp|jw+8e#*7m*a{I@{S{n-#t*));u7q$=BRm?U~ObDRYLk$8*Crj~Uy_o@+Sl&hanWfvX|-L(R@cv)ZE>ef4y5W!=hnaS zGM$r8aL%2 zL%vp_i2)=?G;9OMP%pJP+Q~`bgK)ELDVT9UPtE~PRw5}8-9M910MA675P-$d3qX(v zww@d&(^6AUFSqXgJ@UI5^noE=ja+NvoBx{dSRwr&JtM8R_dr)gy;s2^e%Z!r&kj1f za+aH3+oaWx*j17D7GPGw_gXegxH$L4e~A8ruHSgRC8zPm*u#x$N6v`FoUwAMfta&1 zWHWX$x?A{Q%G4X?^2C1y-2&``{Y)KWtRYY5$r_$a6s>BO9BX*HCF%}d`nuw{DpQ@bEO@N)SMNH;x@~E0R9B+StNHX z(nzr{yLnzbYHl+K|2P>h0PTyTPkoz z;^}1uQ3ix|Fvcyu%2M>@JKqogN&4FI&C7@SA6t#|u4bvrxQp{&{oG1onZKWS(dFN% z7hS2O`xUdW$CLHJEF3Tk&rEyP`vpb%f=Y?*sISv}9`=A)csBZkNTy8m}((n;h8P>$U@W+{>0U?nU-WwK#BJS-j{A;}v1eQ{gRTy-5Y$%gfW# z&eV-JJKJ>d3VRnd6g0}1pa+AFD}{On(HSTAdV(>JrcAHy z;n0Re%||}JM-Y{0$Nd%pDeY&Xr%f8@F1!j~d``mbse{}fMboulqcHwIW##|(8UK5- zVW>xr#a@KZFcU2}RmZ8cyg(~6{?LAfvIkuk;j=rIVMmT|O*braxxZsKo@Z;2f;&M{ z3LoN5KG;ciyf@N`sc)KYc-j3<`G>wnkjT9<*Z(2b&=Hxz-=B&P$k)^T4koOz zof5QH6y!a8|MK+=FGfjg{_y)#-g!JFlPT;ep|iU=iawAf04r+OCb{P_1IJqpua{D6Li{?x!mD0gcNq`9P=;PHdR2y`MosCgr z%Z1GLHylE{x;S(JN=Xu(k2M;A`9n3t@4xrEQ+aj)^FwSCJ%O>5h+fF6c^f;Po>HUP zc9$i-c;UdKGgO{6TfVgkw1=Nj4u$zG+`xU91UKl>nnzU7jz`u7?KnHIs!UCmJ@@p4 zH^d1y4$pkM?u}25EZ#8x#+<`kby)nBGl0!{ckcX%FpgS2^n{`klFiZ%88BwG00?SI zMLJ2$5^`6bBEG9;KPW!J4LHILJSNLrDtGB!q$O&5+y&LunL0gvScj*cR=!i`=cPAQ z+aGu^^a$7I7}xhm=f}o9@#q}xh9-Krt5tft;lY6u_Iv3q=ULjM_mk5Sn2Se=^ux`2 zV}Fw#NWcB-{IRmbb$6jzSvE|3e)fz1u*z@5bwC60A)|p2k#jtO5jmZ15Q(n#@jjJLq^A&N>>)?y>3uR;4A_)(bM=))C_R@(&Xw3D5Kn@j8FL^7ta@amPR%=Y9sH z?`lY2rVsl1_^8}y%SRP&+a4?iiW~#h?pcOVm4z?eE7&142E&uPqmSnHDu3U6g78Pm zc1kzDS#+wb{M4uwudT}GEfL&Xntsd9hzXJYOD$k%rJ2_~zVh|!hXcuU&?&y$6^=L+8E4ob(7s`%8LqMV&2s}7ZjW$N=$UD z4VaY=Y`ws!#T*2M5@@1US9Dw)H%(f0lWgnXSWXP6tY3fR^SP}R7cPCljkN6ImUs*~ zSa<7fpxKS&t|!kK-iYYEoC${7X(g@S25-#5%9Q{`I1q7E;2uYYg}K7X23!#ne2_Y| zT2MjYFbj|d4HlqrDf6qJub&j^4q-YT4%gw61w7HI`7x-kX zS~V}Ke14wF-gn%(%C(n=&Hoe&w%*qar5o7l-qER^nE4R6z9A_?!I~O%Vt6oQ^Yegv0@sDarT7tmOO# zIE_0pC7}Q!zoECJZ-ob^Jr~z-ico2}Kr!s~&<>Dy<)~L`iP5MM>O`#~1Bo=CJIbdq zd#r#>af7V^#SM>KnrD`6 zfNT4QG2jGh`JyfuoX{Jbz%(}TE~BA;rW4UR>Qn%PH8{|i5wBq+1P$c^AzJK)IY3#n zDsJK#DVh9mS@Pc@1zd(VEa_Qtbq9eL-|`J$_QNgjvR52uw0z6C&=jnexxY6 zUMc`l1q3ME;rWnZS1=YWMUhWdCYPYKb$A}0SiYSDXxJ81!jMuAkMK$$}Hjpw+E+dI(4 z&~of`5TeK>BQMLy?|XEC+v`7SxL5lyp*L26a_%Vj+C#`&SOg^(hlF4tCD8U76j#PN zK8@lrO-ByEA%P!DGiYK=pQNOK$tpf7`b@I^DRiV3*W|P2hGIL7n zP3iWNZzklnS}x#Dk1p`fwdcueDfidGjw)q38t%%ljg%B40`u((&&qaoS9E+LqNqd> zsZ4v8cSdCb4nlsrwB?|*lb^;v-=51qzlLgi*6td(GcwX4@20|Yn1}d?5gCLbh>^JX zxw;ZW)BQCXUwb>V7C~MbCc!Bu>s9Rj26_9~yswCu7=D)?!iOKYzhd!EhxZ@&X~p9E z#}*wd>VI(Iu7wAR&MRG{p87TSTMz!SRxbsSkL}m|(%Sm-8XbATa?x(W`9+JKonX(G zwI9<>I=|rZ2bggvD2PrYm~j<*_7jk9RJyRW(g@f>_){Hwd{3K(nnfuqYkzUV-Tm#e zTe;kpZD>0(pUN?i1Lr%TxLrax?!+`ybZ4}8aL{U;aYHL9ZQc!AV2+7PtFB5ir%f7n zWI#*H;M28-p934r8apC0iF^!J_$IaI$!5|_N5JYUYuH?&E!nBj=1U`rtkaiGOU>$- zC|WGnJj`w(U$v6IQ)aNv6tiV_lIm5o---kEhd9`SlXL{o#dVCG*mKLes!gWbRA1$! zU9ArbZFg_WbAwuXJIsZ za9k&y6+sgnlOEKTf1OQO#uXpaH5rjuRb?$z;m0VzY;_3rd5ljd;GkXCu7zR z96P#5Qc@~X&4lj3eCwE42Lt3HwzrdYds}yR$53D#Vmri11?j)~;*hFKnY(pCR*@%3Ks5meH;py7CHfN`a#X~u(B zu1HASVcjH^(HPwo>j_;|uh9r5bnZhm3hU@)4M;tut3on|*i=_C;hg132~I(shdXbIONw2-F*m~?gA+oF_g?3OJy9>M;Jm8 z^brDtqF<@Ez7q-?cBTuBKSSEuBp&p8-iieq&+93xzytADvh^<%? zM%pu_LwRMz#E}u%9$rcQDSc5)ygsvS$Bq`VS(+&Dn!pM5v{PV@`Lw3E0iE_n@ckNA z$mkEB)IR@w?Um3X6M!MgPBpe4AHA+XKHd4=H0Ph(#xv1s$z(`F?HPdIcAW3@lsE<+ z@TdD2J*O13eW&LiIFRMXz#6m$NtMjCF311T#B=WUdrKRB*jlSj#`a4F3lr9j>zWGsLF~@q`@JG?aAr`XQ4R{__AroOFIlvj>1D18p+OCNrLv zQh(4tpijw8QhqCJ39v^MyXGN3L2>1zn7&r ztEsT=n45qWTI((h8gO~LG+07=d+2>ze*Ssk=0;2>CAWdfRJc?1_$`sVYMTY9ZAC5t z-M(hjr&7<3am+hbj+w+bh9XYbVo7p+8gxdvK8=fej`CEXtv-#OU{bw6Ef411M%Q+; zR)e0m^kj&=&GbCmIg1_3MM-s#k}Xohe)))bbU~`eJ*d~fUil@{fjA1xAg5>FmPx_1 zAi>@;<_LF4`K6Rfle7s!C$iPkS8T9-&Sv&>{v2A@+qII1VuO_4o`TMpS(NYO3O`!) zp2D6yhm#R7qW@6gM==*F9AjiPhfHe8Gn$}y4R^9Xn;9?PO1=tjJ%tRLqmZK(4u7aRq|XK& z53(Xhafr>SqwWy2MQ0NJ8Ez_0Wc4XR%O7BeBji`Y4<;XP+C-_3D^!1Wg-X5xbhcgr zp~2z)9C|ya^L-w_fP1RYd5CaI+I)p|G{sp*|M7j=PxJlgOG=-=Y91ZMi@!#);knQv z*OMsfz#NKhX!MNPgu`Yaty;E{_z&w|(fp+{g*ZkJj-i4=6m4Gog}$#5%AKJNS9Ksm1g7bW48sB`X#tV)j|mZ)BX}I{{3s2z``fol8&a zTr@%*L+J3N{klp~{$xTHd(vHPU{~Y(fShC}y?8$FkLlH%WV=UWky+kiv);qR24*p3kEPg39NRH`yl*^#+~i;(pD{<_OI+XrLnVKn2$u zc>EI`z%#fn18~Q!;i+Jh3pUzDunmJZ;13@v?Tfe^F13-4d6e9HmyD-pw5l1u{BMJskl&$jwTOJPamEv zf91X%Fg`kZLPgoc*w_i+o#w}X6Avi9Mhy&zjggq>)Tw-<{g{a z8zlt=C8Z_B;%h(Lz5Daeckli%`|#nz$BrFtJ2C=A59cj-|D&IO{^;%xbJ`9cK6?0Q z+u=EXcn5Uu&mTs#iPmXo&!9dJo8fhA1KJ?I@`&{O6x`@%@HMXD5kX;cLw`=C;8@LM zER!5?3!w)ZA*YDl5$U27O|(d z&W)Y$S@b61+-;x52O+V**VfM>m79?3q{7;L1St<4El21n10LXk-2fgygc55nkT>w1 zNXsA&7PF_ZJIgtl@q8IHdkN3XEpA`GmY+G(VH*ti1jMd2P!ZjVeYZ40ay6bP?F z7*k%LypPXeNpV85v{(8A@M_?fy0K`<#Nx79!zK-IR0hry?oD4Lm64W`lG<5P8@FL- zJe6kEI4MjR2c3a49f+f&pwqx8QHy9K($Rm8b)SQ?h9T~=gb%2(^gGd?Jjoj^>$rT& zvm{fxN*rs2ux88s%|F#jKT_EXKZMW=eLuQVU$0$ous+bq*ViE+z{Atk)x+M}Vlad5 zU|B|3N5bRSa`WVoi~%qyZFLe=%LheQm%wItPYHLPP{1@L~ zJ99Wt>%%-fBi$S{8aqAkzU-_3$8qS-NCl1@GCA9?$kn|fz3;@7J^NC`^Pk)q+FIA!f|%F_%dw_| z8`nyY->Z}Ii%acQwRX*%8( zli2E(q$#&hU#OLxkN_4(kJ2Psvw9$ej)BIMjfxvXlTd|k^nHOm@Mtv7Zpc~ z^jYZ62F?X%Dx7@Oi)aMVsmX|m)0ua!P=4tJ?im$g16wXw`l@+A(?xSiseRze!h`Du zuI$&+SXEX!xT>NYA?ft^RSmIxpND;fn~AF%liDvWT}qt#@0i+py8pJRZD*#=nLfj8 zo-v*Fi}K^X5|?A{6ayLj@8#x(ln>rrh32ISqr1p)?o8o{iUZTI{R(7q*{X_jcBTOh z>I~-b57UKR#S*v;+=eqR-+pGEKveIHc}30fmT%wUeBPn`GcC8dcuN%7?KZ-P{%9(9 zkp^<($BnaWfs8MLZwysnh?UQTZ08hX9)BXh4uj_^klNURn3FI37)~}Dn<_-WI|-zf znX*p>vXn*f5#8dPfpG;URvEat$G@99WakUjTYgyG{!;k9!JALz_Ku!&>{!UI38Obg znf4NH9DqCS%v+2_AD%;`|kH`u_UL0^t2LBtuZdEYg*yNrPI1sWV&^!>^Es<&E$en{()1= zrZsTR?s+N6J$fW3!>uDKf*=2+bhmb%N>!98hM_ZwZ+t>dQMp)^pBBmUX;8F6|9k5x z8!=eZuP5Fe>`RD88`OpzYo@$!>pJy66N<#}Q`WX`Soh~$_o|!ZrhL3Gs2s$L$_l6$ zv|&$JA4B_h%5Lt@(!23$i^zRy$ z+_R6^zekLT=VNqc7o*W&K(fD`;Oaq$tK5%_5>P(i>9NTqIAyLs(vt?%oN*edY!dK) z=Qa|?h&Ur>ZFq7+^3W-hN5>cXrU#I3q-8Fi=|K(Wj&tplfS%DHVCBX?5U^hnxKAcv zl8l%do=1yfQ@Hx^6M5OCIx!{ zWXnTm)+iDCM&D3&);Zp$S#uqfV%rdH=~TPxMx4OXBg$4!k)PWP*>U3doaDa{r(@eTt$uPzwJ0qF&cVFEII{Jq%}lZ za08P2^~vA$x$j0scw zudN=qwru?Lanqh@7+p1`q-g4pVWl;LM~$eS3@V@omHRim20mCXR|f_3VB2~<5!_Y< z%gxB9hLR8$<%Zxso^Dxz!%F*Y7!{D~=9=c8Q5bkiaM?N2SitLc6}*(83d$+BI2HZ=IGwJQ;*iiq`W z{0N{Pz?|eR<@f>GtQ%FvdHM>aAs=VFcz*sA;vpSbN7S%xk<^WI5xMUF zte3v8m;RRYRXuU4r*nDy7#%=pCm}yb8xq+`nuB zx)wDEuX8i8iWGST>VF+fb-4R*WB}L&PB99QuDp8IoL{+>uM-7B~j^C=c01Wd$q! z-2x}i40jHhG95l*;Gd+;BS+&=BNKptdfc zJa-Na?^)MR={`?eex4EnUYA=$TAO=HNbV+z9(*>}sJsTxH1KVFyuCd<&<)<%eh%j= zHxBMJN~a?dqVq|QSSmI{ow*UxGG}_&ojrCiXLV%qs-&S)Yepv)_@xCXuTA(`RIkM` z=1mW`ipt_aj_MH7M#oRVQ*OZc@R6Js2~p1BX|q^aRLO_W0knWi^K(?uC62H4N(V(ma|Ew}4X4rO5vosy}Ia`m;WN71f8RIOy% zBN=VgYU+nK--G+@pchl$n;){cLV>Xog(pY?vP1^F;d#ia7z%ueIY2aChnv1flE;uzhF80y@A3Cs30DQE0dVfG>|mh4k#EFG625mV=k=XZk(P z`hEg^A20Dg*tW<3?WAL(!M9ZbH5rZ8pGcsM9WaWEvW!Gs74MMfng@z0S4I7e8cRMg zJo=pIrTauLJX?eR9$hDn?a@=FaB$$vCWeP?Q}CZs!XNf5s;^%}U()pK+`P=pyxeT^ z`LW4UBEutk)KtGQKRYrgEGo56OmIj%sgCw{^mhr4SujPoOrob;yEa97^V$Po^jxp0 zxh}m$2U1E?raWvz-ZDoV9;VjRkQPj#4;`&Nia5?C4wiAmF~7d0rM}_d!G^)(#}6Jn zZrm$5r7_uRwWfP+|4K3<&_B@U%kABQ{llb(+A+Ks6bo27^XMV;>?)J4sg6Ku@CsVp z3@>y*Fz4pbtsCMFQ8)yvUjbN>oZ-Li)7+snU17GctM?q^DEqL^0z_Ddr)6659?Kt&fL6Mgivn`3AO_n>A{I zsEHDPLzM-zsynFKP6b~^W*Ysxz5PvMPL4X>gnx<%q`#)gCml7^7oeRZ<4m@9vw*$j zhN@(0n6X?dxo#O=VkRwYPj7V|JK_D%kRTTRl|9O?Zjn6KbMmo;#ZFDjI4-;X%{AlK zRs=ifLjpYF9D__l3w)RfVSdv%{O(i9zH(9ANpkLw>bab}MpD;kK)9ry08{IqLx%NzPP3@PcqFrTYA zGBXWQ3I7Ro;tibWsQh>LQt+P0`S(1|raZ!9d zr8=_km9?68DO%p?+#QK4 zB|yl={i`kS@UPjrBcb}KRB;oZbv(y&QFeq}c-#yOb_zkuDP~&U;SwG%Vet;fv-XOs zh-}p27ZbpNrNIR|ubgG$Pp@QF`Vo`+dgg7^NH)zGR6I~0Z1V?IqaN@=C z!w(J}wX~LOBH@2)wUj5PxSrM%v-%hpyc{*~qeT~`A2-o7Y~o2WH%Rv}Q{-QW?!u4Iuqn!h&c#XZE`-{t%zn0d zaF_@3Oj#0{tvwo>CX}C!!f;yx4(pD#;fqCRj8=0lD>cpKq~5W|=z_rD_RF~&r_b1s zo4aA=vE8gGTK(g*v>#fZp3cRydK;@ZjPc3ZKNOJRNW)omdBjIl2LSr7at`R|2R%ox z68-!L00Xe!fZ`6vB{N;3*zAn*gs{sflRu5nD|%+-dY#bQM->~pxT-37f1*;C<{@-pdoPFlu|u?6VMS|XPg$>#`wn~CDy(oHme0iY zaBuk7uIVx;Db2&xwv@Rg*gf|A0yaW z5^OX2aznHn6nak_E)ZO<0aZ5yGFF8 z|JbITMf2BboSrwqqd+I^7g!|SEv>G+>%yFyN~ofcBVv9jrk2*J$CO)Xp#K!cvD_}Fi9T$ zmr-rfN$KVKnWP)3x(pdWvvAr$V^|Z4ARw7&wF2=05V3gS@#C{*7i$40^%GkGEr(MD z5~l@}$c_@7C#9TZfOLuE93uy%!LPsd^SB4nH{X14{bc#6hKoXJ)4T6BN&jLsL8#Li zF+G-^YjpfQVkpM2i{!zi%l@!5+m%-+20jrDTzH~0$OjKvekmJ3C6#KqMCnQ~gKk0`2;9;MO-$R7O+h(%`9 zQ@;@0`cEfJ{%Hc8P`~kW07|^o+Dc*!t3Pcl-I^4gRF^twQ?VWAYxzuBw0ZKt`n2R_ zE>r&YjO2_guDF)>#sqjEovv^5w6*gNS<~rgMvX!o%zRDmG^-4auk7udoHWRCfvP8W zPiKM>*%GocNE6_p7|}#{Dl}CAp>TpLxWQ+oZ@2B(E`5E18(ge3dU)CQCj$rCxw)c5 z4c@>Ow4TCCJb&0Nt9NhTJD>WbrDsr1Qh}2uKtrNA44ucPIqXWgjN|v?^K5(`2!qQ|kJcI5Nabvuq4N`x3EAZK z;n&Q~=G#Z^NOun$AR}*#S83e69Mg$Q4+k&gYJ+h1Bv;!DJQPXZp5d8W7_xR}m%JXB z8_K`L6QG|j>?OqhP>JE~4dh9qzc1<}9UP1@>0~LuCP+mAK%m^5O*}lbAX*^wCf?)> z-J2wc0YnUw2G#ExY-%{(;F~jZ!qM^5vwT;cZSYL5TscY_&R@3Z2@oe2N_Oh11JjY1 z_|k})Zk8yvVj`Q-Ov-9&&vf0U0 z>ktu)Vt+n6WB}3G2@9l?Q)_$sFKMmwO06#4UQwOov*gg?fZhuxODB0Rq%Z&`Ym~HA zTezrPIzjsME-_giaH_!4-qLweT)L>A9T_*OLArvuQO=`Pt0s6!Gcx^1U|_JxA9L<7X)Vk8UF0 zgThHx-aHNp)2B$u^nUUb6o1s;%L|$pr8FL)gF~%??tgy(Wfw~PJpUyvjQHEihIRK| z(z3)Q!c)3(-~g8_oyH2BC&6?DnzaQB*$U(pn=FseK&K>+u0VXbhooZ(tz)nZ2woFK zrc@*(Dc?eNW_qSikiUPF!4ZJh9#QG(+HO%0O(kV@1N!yL)3U-)=!`VS4k-F4^P<^f zwAzb43DyATiR=xAe%%qmgLJZ4YE+@K`HMT;SF*y#Vu17{v|7_iP%RivIT9xZ_{SP_ zAx<$d>6YIV0ZKKYmh3{*c~FX2$d^GI~_SL@ijGKYdwZ-l5g#a@1?hg!OZqT9?i# z-qb%eb8fCruUwzGv6GWS2aXX7)#79k;Yp9x6GzVWR2#A;^dG#oRN#DK0;8jpqS1M^ zi>p$ZGa)s%CP&~y%6es$hBoxCE-4N&E%ypi2N(76^avW298;M>ZQUu5N#C>R&G_z6BUtqWzbe?K=j(FrjUX)HCY2sgp5C5`ExUk?Kdw+(Hl6LGyzjEj> zw04Kpop`yp2<|XB9c(72ZC0HvPS;LTQUS8IlbzZ8`2tBZX-yxcWs(!B0AS-SWd}GSEH9$6js3VRtOD*gVXX;qD$SCZ^Vodh``g zDsp;G9T^+azoI&h^V@W~Sg%~Iwv$H}dI)9klI5;6_Bhe{bXBS}0d8AN*+YafrMOg71{b8Z{{^Lwfu#%m zyRFG3Z;qc81+HPwO)Wfb8nwCvd*Kb1*&P%kr(-|K+3rDYGbFCaSB=02?au~AVXAP# z;3~>tlCx$fs?7~Jvomlmx@L6g$_J*zIYcPUfl9M4c+J(uYu&nK&<{eL;p(uK zn+IEg6Jf{2{SH?mNh~bd@%ODe|GBMiJ#l&K7I9qt==16uTee-Ts=C^|^~Irr`NVI= zATN#DF46ak6H;i%n02FLdV9I2n|f5`xTpOIkA7wIid-VPbsMCgPg?2{$5e;M?knRK zJ#rh}Tx_RWE~=v{du*q6t>mmeEDS~lWeMn^QVbSa@tt~nRs+|*3-p6z8m9~h@Xz>INxJ+9m9)EnxEq*7X01#Od}F9Q;U%5+y(Cx&5-u72_xR6KEV zAXCn9apiLp^X%4qu%XX#LY}wFONh(UossGb*1uD)>;1eTCq63Iu;iJ6H?KMNii*#1 zTza~y^7M?DWS80-M6u;n()}f`~zxVw@VnZWC zLnAzP{-9~8ORIXKYI&&A-TGDpUAi;2;y*oL(}4mHy7baZ*K zYuMIhaI8+&NAu-W6rolA16{sbdUgD< zB=aC$N=#geUH!s^EA3KZqtonH)N&!azFqGY6A>Qo+VstyZ-{?jT$e5ht{eWjW7^Tl zE?ojmU47qu=ER4-T>}C`{5}MiE`)t|Se>bGg^z2ZA}7;SFh*l8AIzKWbvkEdovW+K z-7O`KH;>Qn)hj12FDECAxtEX^N6%yE>NL|V3a2%GlTlr=ZbjZ-9{(Z!WllHudhqlkI+Xjf0>YK4PaPA{-l)M5Q$DbOeyobAW`(<+kErkd*t z9bGCKr;mu}o-#DGhfk-EeJg(U$bAsEKJ6^+TeEzR;L6BmQW@ z?A*rZhsF$9QIS3|Dl2_U(Y$Lbd-q!N_L@m2^Ln39_3=(DPVx?l4w@Yp8JM0XJ)h?k z@9p9YRWUfYXKKR0tOxI2CzXI2bG$Y#CaliXwPeR9jn7NpHOF)%m!<4(QO(5p`NmIn zlyo)Kg~g1!CjHoUMEb|=DH-Y14&xQG;kUa0jmHTTA4~Ic3P#wOODk1oVEFnw*O^QT zwJIe}WgeZ~t5SZx;l7xg#>>T6d5$v6lqG$@JTFA^!n}FzU$v!ae*jS1bEfCdVc)wh}~0C-nqH&0j=crwbe$EH~2`D;V;QS;-E~2)>p{KcL z+UFYvMDVFfze%G*{1EMD*(w-c77p9yMa3vahNzK0RCA{)+9dg>kreg6%ip!<;f<$wD#aZW5!p|pQL*O$4n?oHucQ5Hy9YnRC2)%^XK`Ccv_dSp{ zn2V^H{^+B@e0a_D#H>CCrGoOS`TBx$MS|MSIma~EwTqS$4PJ?HE*X)N!rLPwCq@i5 zbSd@|{vJ1dWlb$uZa@6Y@~!G<_R4XSi%KUT$p$k;wWjEUOdTUuk!nt!b-u1DM>P=p&CV#& zQ_~2`9d`1PQqv%A4 zgCOXE@94_BdN!}C9FBV88K)?i%tZ~So*Y>vX3|T#_|p6BlYwA$PnxoGCt2{$CzqeA z1kTshP14`TU!3>q=fa3hSKHeyf0do&97a_DsmKMsayq`=+0l^*f`f~zD7raNmktC9 zoCvnkHk*t5&wb=WNvQM@$=r0Udhm@MK&{zWg2A9gFB`2EfI|#sibcdQ7pgsV{>OAf6*d-5 zUh1z4@D~Ub?x9Ig0;$WwBupPSedfrf_!+&PKSCObJ5jekJ{Hk0c-(|#X*pM3zAf0z zzMa0K<3)7iNaOY^FA=x?PmBa1<+H-~rY77-RE zgoe6%c|iw}J>^&s_CF?x|0!Mw^}aBdxeb+thGKxIkIf*@o2MqBHA>zwZ|<1^%c}kC zMOABqyUKsavdY(g8B#WFWSyy`m$@;MOJ6hFGum~|xP`GXTU;XhMTVRGr5?)I{jsGn z(%+@8j{ewdXTM`Q2mWsZPb>{+ygEvw-res|;_*4}zJqfs66>x7)paxiiqu>Hhp0J_ z+1gOXTB!ue(wGQdpeyow1TAt`4od@$Y~N0SL=~GYv$=-N+*W!LIzmB1kI~=V5xzBR zD658S%+I+dJJGTj&tsFiM0YtVC7}%u@hC^Ft!QVR7OmhFPDg^UzcOw%$;#_ zLE-e+s9C*MtUYzXRAd4Q&Kl{AQZrAw_2PqBzTTTWOmDpN$(tGgbYpxVOFt*DKxiWV`KG#7k)Po2w0;1FF?E^Dqz)sL6#nQ%T(}CN`xMPKo z0gC9sv1p-&Zfe+9W_uhrte>m(xM9u;c^McCC=MBZ??4JIMLwi3Q%g@uE66+>z!adp zevm3G52!Z)9(jf@%3}oZpVCgxYfwu{)HlIt-UTpA35f zmc{?tKAzuF@)Tkg>Y6$|2l^+_=TIxiQx9=RUIki+Z@V=dW`3Lxcksyr2veJzAFX@p z0k8_FKL*-^3$+q6U7ZwWI}rt0S}oX-0GkQO(ah5%Cs#16Tw0ULjy8-S55`W`3Q{9& zl$V4df9>9_ba}qkGJvj#6#xtfC6upp@cGREU)dwq1uawvue7Hf*m&mkLn6J6qZo}4 z<2Dd+5cp~T>y}|hrBmb~*Tfjgkv)m;R*C|PyN2L7J^(kdyV?k7 zQOd4K_6JY^-cA4wW%w&Jd!({2JP`=wxNtqELrm zj$N@c4RB~dkLnWAl`{u*QR8TU!C*s6luw5LbWq7&8!P374?<@q?fh#?xckfz}=>9bEvkDl${X305%2OFwV4L){%%Yk28NU-!t%jog`4U$KNcopULzS|*c$(_&Cb_U z5VYZM%O*WHD}Qoi_{8k_OWIEO7y7kWKE>fBg(x*MEq6MfU0ORSjN-3h9@MjW3>C?* zqic3QS~s1Yl41<@<>A+iG-}L!1pz3&w2DC1p|HX<1`4E1rtHx?Hmc#tO?qVKpREI= z)lc)pB}N@MRNDglCJo8RwKg;(PCS=4tCxRCY)GEBQ*@&D(A{~li+k?*SKENq#OI@) zGlC;L$HdM(F)eZKC(S;It|=v9NuyU5k8c}sEMj10Y~MJ~i2m`tMxwp$^3U7i49@o2 z&A`u1h;niof1NnA{6GdhXVkCLI+yPGvgu{%-^*3Xp3mGIxA@Y6^ihAkJiWCtapcO< zQD-(LMQpkVYM39tEZl~UNo{*ndM3NOD>A6C3Xifg`vnGewKa7CJ)R_BQet%SOUX20 z>E=*^wCdT_Vn!_`<(cH$wB%5T-VeZXlH`z_H zyV>0ckN>y&&A^~$KfixWg46U=S65Y6S65e8tx@a#^nTm(Go8f2R~9WgG^+66l8tZn zch+k(tF)SaX1#Hz^vLoL_KucTrq3vB*dH5xaPIKwJpb}y?B6$N|0Z2W`?r9f+#8<7 zbNq$#9DlU0FX#KWo3vcS!!3%#$aX@KV>qWA6g;gfojAG0MY4%KgHrJbTh2>K;t(n6 zEKe{Wuy^m>MNm{&4Uy7n*Da$7Z?l{U6Yjd!)Sw4j+>CAt1H$ zZ8Ap?=>shBk6mp^-2A}*BN)&k(kTw$;|M(MN z+cA;W3nek2Kq}hJl9;@){Tbm(iIVXdwt}s^Ecvi_oXqNWB`H^TnS{?emkrn@Jxt?R zXW$9@$PGF5M7^6IS0XeLjbnqr{J3mqO zCfJN7?9cMNU^R&YYo!)x&PDc}G~jtQi_N(p4P+0U;hWP#UG2he!gF0u3;A97U606o zw@9nR9PnKp%USIps+=f&AdSV1)!!dWd0>omQ@ZgS+bFGkfrYT(=a51%<`J^g*o#t* zkRW(V6WH;t@1;tz)nJ9dKF7%$W8s7aS#^f6>hLFznH zT#T1Y!jGq(>Xlq1)TV6~kRiP)l3rKhlCugx`BFfwI2bm_;1ES{Xip^la1V6xU!6_T zHKdB#BMd%qgf?5q^7_tOln1h_lc1k~eJ}@jdlPgo4-Z&QYCPC(QZm_^p#{=&?!q8+ z;^ykbE@`=V{jtO6?Xs35h=>@lzya`}lf$;}x&L;D8gH10G&DFh3lf zc-C||+J;}!5E1!b2m_iY9W&`l0KY)&E&dO`mLAg`wym_K@odY0(`z4TDcwDUM@>!e zk9I^3$k^D*^%E&!`@)6D$8%EK&sVrf^9DA7n76+oF5BBkwG%uckPgmTt+O-phfAHO z7L$o>k4q0Gc!Fg|cdGKraS1#zuqCe%2I#5t$7f7y%xTNyK~jH>%y9YdUm1I92ND_2 ztDT}`G1BMG>5=SH;PM7=!KE^Jp|V}9`RN@!aGW6B(i41ycRw@+ww9hWEFi}lr{;Y& z|K{gsI<_ym-g*l5$l<7@7tVJ*D?~3`6dT!>tn)iIb>4QXdalb!=uyNm)v7 z?CzS7WI_4Y514wv-47jGzdBj*=(?=3&ko*}ZXeLa&fTDQ+N^OIFd*2y_Q)6Oryp+{ zs#UhUth#wYdj6xSkNv#VJIwQupr{ip<%6a5kwd)Q2BMVb;s2f)wqU8wdT{};-+>1T27v;{l(L%^0e1>1?_2Mqz9STqn z4_5|kdab_8QM`C^-Xmj6kItU|;@U!STwA7_(;AH~9pwify3zK~0i7^(z#?%%`<)%r zZd^5+x0*xq*1WNTB}^$WXM4G2ge0aNc)MoJ$wSpUaG?x}OC6lz(TWtDiVPtk5fO=r zKET=2gJ>ROqxnsW8X^V%V5*b&hll@v5WeKqRYx!Wd!@4-;azKvePtv3bE=!?r58V# zW+gm=%cL!=#p4MU_R{Z=pXiS~d_@09MFM;u9?s4l9x*XuK!A5-u)^Zh5BJD$!@zZU z(|#&>51=?VlI+-m*&#B8GeP*n;)}KRR5z@6v)zs_!?#u*&a-mC!Q-Jjd+jOz$lKF< z_!1fm}j$oNA9CI zhE;?<*q8ac6|7+R%2bHeL_9mV+s|SV~)pvF^o|;q&{QJ{>nBiJ_WJ*Em*w>@V9- zprhv*BP{pp37?z*l6_-$-@dpi3QX<~TM#0cmbdc*uKowu|B4|Jk z4`iJdI%MAwu2TA90`sqzDso2gudl2=wd@J$NhI-HR&L8GJ}};_6IN~P`i-`FO5KUn z;_9VJ<%m6hW&@!3W!XWM7vyZf4(z4Zdl(IG{4!~_N1v}iGt3S>P^xfeVcIiF#hMa(x zr-#MLSgw-oOR|b!!CtQi zpUY~zaiCdOWZJo#Enbz)Q00}-ipk|c zzx|Wwd=A$14_qGMQT24zD&4&e&_p8KcpdI^C;%5RAc##zkXm`*dvok3=~X|hKE3?F zeTnw(@P+rFRQsKIWEtJNA3(9IbhIBR!hjrAScATzj8T;MxaYFq)SOkl#AVvw1)|Jq#i3Md0;7CnF@y{9NLsU zVCB*2XPD}V31g1`BQx7}OndYi&=5ys(Qng9pZJH~nI*(IzKpe-DVi#@S zBC6827&2~ueow}2^bz^44@ivf`igqy${|_&G{ zsqxca+q#N<+cjEsX_e&WaN|bDt8-AVRgl3JsCM;T{q#fU_TJiTIZO;wKeR=-O!xLt_ zxT2Ze=vpTZThP^|ZFp__*3TA)hwKeb8S`kvyzP1O1O=}S@g}H0Qhf__eUj+P3fVy} z*~m@YBiZ1dSfiSPKJQxl_;Sn4)ArI3l;?0be>faS%}vgqs2~}T%taXz@tPokKUgZx z7b5&+Kyn{meT^XD)FjKpTO3kqKg7fKaGJ+K^HmMQpCB0tQomHW_^KTw%H<}^;gW5Q zoyO<6{Ifh#7$hCP=aTmp8x1Jw(GMJnzC|M;`!D5|N6d8(HoS(F29VgRGNkVJIHdkD z8ateMy#OwqWFC?XQ+*49g}MPfuz0mN&XMP+7dRr@%E7h@l%O`x;!PZp^F6ad1$hn~ z&j;J`c%u)8!#Tp?fFrq_j!707kW3>P5;!8~16S08Ma~zJEHWUuj|_=ktjZXTX2Uro zbK-rF_?y*Aj`wKAMLs)oqCG6c`-;~&R##;jD5i2)kpZ|#>Y)L74Wc=vzCbU~9GL)} zFGL35?XcVj>j!%)zuR|EpbDpeZ>u_#^4%cWkkF&tJ4#zP-RGY^bRKu!cNcQ=l)p_z z?jF1M`^uq`+ks<;diM!`*WQ_c zoT~YJCf``+`#h%#dfDazSg}$g%>|MOg#{1sOvN_*M6?0wo>R0z5Lrj?Sa|vP=xEhx z6uvro$3sapd#t0Jo{M)RBfz{VQweB5|M7SvrZQ(4^eI6>(cUNa?-%yTAql$^>!e1# zX1&JQJHfn-MJE3Z$hmdGQvIHP3dzPBMUIX;RaR}Y#A55 zw}CJsqHv7l_e~rjIbi;OBUIKylnM8HJ`=Yj+9Pz23$$1!5on}>yzT*w5Xqm72i6Lm zgI+H|^3*W{&eBoj@*7b1>{g)C!9(me9)&b}x$vi{Nw?Ae!yIG5OS z(pBXsVS3kPWaZtnt7{mi$Q6wq+L3iqJpL;mUZ><9HMj2DO#KX@G!pv51QT5pQ*aB325W$&?3^6cUKG)2xQ zem3BzIDS+BJ}{?}dTQVCE~27s_O!N>uUuPvAUfgrLp$D_p0obry$?TvgaX+elQy@* zlD^#D)ZWVONIoY&s3<9%H0jxO)rVTLgxQ^)13IQpSdh7X65)s}vFe9#4cx=3Zs9XshLO}WAxR;ae;(O8>Pzf-cXu|PE!4xX!-Q3Az(zd{O%pd zQz2%t2ocRGWQ}OF;o-=??y1oGIyA-FoMxQL_f=K%<`1@Q6o>nXBJ!bo>_Wz~1U%k( ztKssd#(kq1^Gh3_)jH?+t>-Ft&CFowGxyiM@$$;2CLCD0;KHb~v@K^;Hzppb-~G6c zR$sBLwxE7U(Bd`hO)31g3T@}O6Y06{?A|<}?Be_Qss2iY-wG&Z&7p6hEZuHCwt1m=?2vd%c)9QxrU`lPgn1l8sD#U zQAzIDzO~^Bv48ym6px^YNUg>fu6l*5vtAn_(|b_T+q9ngq745kbUE#552SMJ?ssRu zu=B|m&mX>+*?MO7&G%6j_W0_h&yOxk-~OabS1L7pe!J93`yktwKYd6rk+X5h@MKO- zq9^<_zVJJS6J8pvj}P#2)44ka%fx&jUNB8Pt$5+?nRDNIiH?UE?An6!)iWyxHw-#< zo#Uhq`DO#-#=_#7bfeugrvbipAf_+yMt$wVZ5Es>hJXzxTIn8sMPP~6<-uYT- zxP!qHv6xPNBbQDyC;UM zUToVrf@DwEdox-Z>QBT^-Z-&pYfZ9r?S79}3tO^s*~--{omTqPg!rjDYlXb~-CwYl z@QSAbH1x$PG588iMh`9ic%qbqr?!WXHbr`mcCyiudqYC>;y>m#HDUo@n)g&qmjy4D zZ-Y#4tzKwbr$vu%VQD?CFi-_~7u2wxxEI90e4X*f9}mC%9h|oWDoPV7WzugC(UuuGzDm^0@4>3igK{W#kv^)72zD~&RTlyp{J!~ z>zV5-3tlYlpYvGlrmIt5yt#1iFzJ*qc<9nsR_Cpe9zVy}hG@%*!1x*0)?E8*(bj6< z;07H24r%a$oFat8)63D(6{4Va?K%J2PMslkyOd21Qb6y-mgdHm6CYk~xin46R$bcL zS-pDUlGW@jQq;6gj_swnMq-=|V1W-G$7u9%bkxJ+t46XdS`OCD5bFUp>I0TUigLYl zXjV(Z>|+U2HdR$_t4)!Ph{M))y|jASl67pLoy_O2#b~oJ+IVo8R|So*xVpN#D~!Po zOE87N$A7%)(tnq{d7*B1Y4azl8)1VY7p7z{Y8lg(vvJ+#%^SS?`R|Xg)IHm= z=LK(#+qliuGmlS#l`|fmtqtUHVavFc&!k4xTyP^!;g3px5kgat(E-+MM?W3KrsL%t zZDAl%A4B$co%FJ?FRnM+4DHAMr@ubI-u(Yv$Ng_#$;LORtb_GUdDJ2}wg?LLGa!?b zqQk^bB)^O8{pw9dRJn%?aGVIDz0W+bQt0kJXMzXR4ejhN+u@+BLONuh*GzN~|ISbP zRnno}yk-gw+Hu09{y3fKG+*QN8wPRJ2<75`ac*}!kEHVuQ2F#L`yscYPp-Ak0esEz ze5}p0*8}HW8ysb|_%-0@E-M8;B;TAPCrv{?z!J06OKq^wZ!2I?KU8aFOMCjsc=f`o z5${;x1@(c4J6iZid*Rjez)QIwo_2T-ezoE!R(QdE;1Pa4>VNm(S1Tguo#U7K0C-b- z;MMia*XLe%${QND9(Z-)7Aw5CzVL`|n$0pig+=BYd>;jh?{KDeJRfDx58@?dT;x@# zE$9PY;w83=xEZh=&!^tY7p+*y-;DnSPowU^Z-#jAf51aTxGc}gdhwgz$4}$f1F!z~@Z)?LE5lP* z*hnU_Ih@v5SDip`YJA4`Lc-jwfEe=j=sN=zXMtXJ0N(66d+h1P0}G= zSDO3Kc{}`RXos%_{&!lZ=+D>b4a^H!Ht+Ml(>kRspVsord|b1gJjiegZE#qL;y9Nt z#IE# z$yd6JTdnw<6`oHYc!XUTU+FS-wc-&gyqJ68DSy?{N|)i)iBDVMx!(uRgRgWMUY$s{ z_k=o$Nqr$LkP7g`UZOVPH=SHU z@YamDkGH)fAyoRrrpa6Jn{U;S5GA~FyiXH{vzGS{w1hZx-ig)0DuBv1*T2PE(y z+GnV~LVKaLy^gmp#tK1r2igBQGfE-04?KCEwA;w=YJ1>O zzkA`449f88RIOHcmiysx8IDSed@}Ea zLt0aY1I@ah<1@e>j&z9fy2@~9ZK)R8)(T}&mA}ii{%gGbY4FLHuf=r0qW;hWSc^x% zlXTPv4_B1S?IK*FXh*(Nl`q!;=+D@5A$^ zaz2i=@-dvx*TRcC%4>#aHsyRo^-tn8-Eo3P{p2f(2f`VGe3!(>@c#j42s3gxk@vwN zK5~4($MJk#=KJ6fA2~kY;~zPki2L9WA2}TGF_`0%a4#IrM-B&kgw6%d$@Xx-N92{2 z;c&i`*!V)(US%9OA20KESmiu|JRG%BB>Hn6 zo#69zkyGq&+RAloNk{VACd{{n<7u+H0h8g-ZqMOhE{%M?zW2i6yFJ0dZl6N4jkAN& zB;6Em(QFl18Q}C_#ZP>sIQ|S4(x4DJ=Zd$x&#IRy+;O)L|EbZ#tHVEAbZ}SdI+!c& zhZS)XQK7)Qzwf8MZ*d=_3Eo~@^P~C!N}j?I2{#!Yu2YNjepS+}q?CrFNv2VSL5~HE z7-cGo>>qq0YDUUr@wRDfLc&;+F??)gOibn2@N0<^vOP0qM8OYzcb|yZ&mJ7yyo?=w z9w-Cos8lIB@RkUrGvW|v0vv3wz-?oDT9L8POMN_4_x9|Z7dmQW(7E6dBTbW&>r;|v zCfE0$7JV!@BSO6GWgFW|#^rj{j1150iX>0q!0E6|{cq4ALJ^Z~Fo%Zv`-FR3^~-i} zS9gdmE~uHoa|%$*%S}#=#Qy!|mk5+9z@93MCoZ`+7jM^ph#>Y9V)H9%Mx?5X90m?b zi}kYTT>7bgCDIt}NX1xQe#SuOl4TCT<}iOzStN>t?F>-tJB=H#jZ&Di-J+uWP2Lef zLEaAT&K+ts6$u5!KI{J~)$T#=R*KKP4@=oM1@8f+K%g)~^3`|!7F;;WRGHF{k~}A= zGPG!95Zk4WD@rvF9Xu!?GDcVKG`To@*pMv$$Y^KPKVmA&!o5sm5)#Ikyu!;WV^~0T zby}b$Fd=19dtgLhVlv^{0$g8LU&Bi-iYRk(H6o~6r_*#eqIxB{2;vfveOpexExQq| z83*X`5X21PCB5#nbHnB>+B$7@c~OI7NWkFyu!)v|fvPVTZd$*%ETwj|rai6pXiHM4m0HIr_Y$m2a3u) ziAGVX4-lSc{H$5GzKbA7Hw_sG5>Xl{4p#lg!Z=*l$cNR474bS`Q7U{pysqZ*2K z>?+i*c!#&+Wt6@3%!&nAWa!_77gKiDGb?7Rdizss1h=*=h>bWv=TUrb6xYcndy9l% z@E8ehxgkb^o|T|4!GexA*(^8Q;aOv#5EsaE>gjyou+%y=>G`2gzFwe6Vt#YP!$VQw zF+|QfgQdkn__7xi`+r#8dVBkZH|m97#ivhCJ2dG0S2G>e^fU`iz1Qn-Ag%N+S>gv&&8kU zA}FqOciM9Cv$^8i$_?r`RJ8GjZgBQT@@XHvUM+So()!>h@?;{=on}CaAc<50eB1DB z(jy0QdLx~fu)sUj^|E15L3qd98EJ7*8E*dJUMV@^=RO0E=6Uw3n-Q;foxH%9@urfa_rd331wrH zx!-^O$zT6`=i|S%9XoUS*s;e>9kW6{q<&Wsh;x`vwo{O^ldG%6t4(7qL&I;=IY(@n zJT=Jf$EU-WBERyb{EOVZ%QJ_tJ3&K@-udBkmSw250gYt~c8yp!apLx|mMN#b2aHdM z8k<#IU9Nr?$)L4PW4BjE58S+>YHdN;xfRo%-8x1Z8J%ZInVL0aa&aZFGhyEQ)F0qR zgDMm_8$83pj7B$yw!mKW_zN{zVn`j>>iQt0k|PM>_tbc%L_lfm|HDk&%#wYeGQ-4r;X4SOkca&+>^BkNjc9louY+JeVkAJBKTeP6%6 zec!qV?yBxty>QKa`@Vfo-<9@oQOMK|2dWVu&f)mN7fSdlKJA4Y0XJPQzW4QAZQnQa zfA?Lb_@ozZ^#AU=(jIO&`qo%!2A%nuvKdSI!rh5MtD)64h$6{( z8RuS>r^v;eQJf6n#Bxp)y2!=CQ?5uJ=^tDan>r=)=+oODD>%I>z`?xqz?g@>Y)`A( zAT4syZE%BTezTv{W?+I#)J z!dse+*iU^B|C&G+SFo?IOH_Ec#!>80C{Pd{yASjf?e&RqFI#V*Kt@~gB(+*)r&L1h z{?529OL~oM*|5vC-levDb3QA zbK_I9=C1!GAt5O?HVL&HtUuWY-XU4Jkp^=?uKxpYkIMG&4GuQMhiCVTj^-8t!r~1w z`qsq6Fbu3S=wlnmW-asq6hH{KTjakhxn)Uqlkk??;dQ-}kQM;@aLj@o0rugT#T$mm z7~iU};X?w{*XFL5ryzZ3k3G$T{VOszE5zGBx4>+`3>rZFmq2~FGP8v&8aJ3%7L=wF z1f(Cb;_i0mrWI>cxbn8c&mLC~*`~zNMR=*}^vrwliznJv5tY@`)~tEwe#AIcIekek zY?x8CIX?x*EYu$_0~I=*v$L0%+kKc3k?73isiLeIc2dwsA~q6%P7tZ24q>e1b*~(# zPjk|6BHdWCM*7vpdfQK0OBcmE%I{Q1A+y+5nX|LX!9mxd)M%VIQk=!|>BST2%}mz+ zQk35n2FG5H4T-%P8(g3|8hpGC{~Qm-S`Ebg!Heo3LPdp$d6s<#E(k9`O4j`aRbXKdQz-M?@*YvppS}wi^zpJA^Xfl; zqT!iQMb|2xIB@Cwe3oS_X)9fPr08VZFRB|Q+iIj&lr>jYEPK7t6uB=d;o#=A8y2(D zlo63r&Ng?BP+r>m^Lki8f07I;SH#SRD^S5iXE68xSmRBl1!UYikadC zG37HDe>{m3tr8J-${thg<-D?ifuFMWOL!a}8kUr5)+hJ|7KE2f9v=U(6ii`urnFR# zgrESt+l-w$s_T2_`LFxDqwR(w@E_Yjt;MsXZ^bl&xE45Bbojl;aS6qkHixd?+ zyO@PX^Eh~V2BPwxhr2d_hd(C{l3yJ1%jeP%sx*(YJ|d7fJrUR7As664VlQhcj&Rd; zc82+M=PoIqwrTi7KkS#@Mco3!g~OLFcd>}`PmDgcRCVdfrEx3Ax@q0UY@EL7*-B6< zdP)0|`CaR}-rupgeEvXrcQ7dLa*I5Uc2`*BbQ9%tiFrc|6tt^Zd+|La9D14e65{1v zW@gt*0c%~SdJfii7)dWI>D^q~UPm4xyW1SJH}LjyoK=qSv7-T1&5B_&Vq|y<6oIyp zp9V}jA0NK^cl?^sIYB@@4_KCX`-uE4TBHL2*Bw!F(FrBzY_aPQsfds(k&g;(79*VI5WzF$ zDo!5?Dxq89?fknzV4yvnOEmBq${6GR=UMJE)c3*okUhq@+qppS>Gh9th*}ga`0g)U zvP-*u?cQ#~nrthAiqHQiF4$!E|MOc`$;7uX%X`O$HvofB~q=nj9Gs;T7W4<{EO zvMV%}9A>5{Tk_>m)FQ6i<*q5hlcEJxR~vq=ohb=+pL|J4mdo z&#_E#83uZ?MQhyYD zhsaoAdwp&HN&S~)Pl!v34oT4aXRxJId2QzE!sSm;<+X)dvuUOobE+*)36;NaPmD4{u+4l0tk?+jkbwtIqX=hvh z@b|y{ICb^Vhj)%^A8F3rELN74?YevT;ddLtObE z^-27cZBr7qKRaILi@nT~9(n=%aXg=6C-r=ODnvo>b)i8N1f6Cb&!^wl=c}GRqZss@ z{p!I={;vB=sK8W zk1xq@&Yk!&OL>37q1tnM4xKGrrw-ia6P24CojEu$XXlH{_TFxu_1@k^FRU_~3#;=> z8jDi8#(Gs9Te0`TljaB40lk+#nlB_c(iJVcK5|Py*vz2$2Le>8YSgZYH;xWOk|=ocs7KsECHLb$(mJh~d*GHjF69 z9~(Y%oSWJ+rzEy`wvXDhh}~{lES0d+#l>?PkmUkD)9Ob`M}=(@Lt}l?`}a?WqL--; zybR>qbJrtZkir!>ak6lH9)JrxC(z2*mo5j{=TD|VLl?5!%}ZsXx6hYO3fm?nQ!S(> z$y4|S&^-}jYsz+WbO;Dgd$@afp^|C4iyDKx{f#_`-K=?uW=n74+EjASQLb8gAb`qv zFRk2va8=o?Kn+vR9PgqEs?VP@NvLe8uAa(npFVZ!+`xX`gMCmE{L0jroH4EQ4U1Q9 zoi}eC&2>n3oG=L3L_*TAa`oY!q3R%GyQ7k3`%NMVL7qH%&!LJ6TVQSU#vlU^FDxHn z(4G||W<^FV%$islQk0ulow}_xXKq4ROigk@v3c~6!BbQ8Ra3n@DhfO3?-?a6&f>L+8gZ^2 zta8GQ4l;}TIt6G&g}cLoCVzRG=FhX5dD3jC17#8txFgYoY@lHGrMfNnKg6$57ZT!M zk==cTU2`!yrpF!g4KP;aFyU!wVAy!04|_FhMpaC|3|Drr%cyeJhR&^Jf0QE1mL>KZ z?k-IbeiTx(2G5aTyfKP2K|(cDL{%8F9UR;iHu*6I$N3;Ed5W=ZMvytxOy*VqoaMv< zPI|n%@GKSP&79$r9T~Twx?t{rlr+Jq{i&T;0&UAx&O3KvJwDbNhsd zpg!-H6Ydp|88WIP!Y?p+v}sgad3kPiNL<8fPe-qK&!`ryM!iR^8Icz|Zz#J}R_Exr z(IYr8a#dNU>1~udjK+bEQB0Ha4)~!*Rd^?)gIdr8PRJYW6z~BEpr|p96rAcpy|0I7 zxNlds@~OlzKGDjhsTKag7T2|l+!MpI8ah{CrNJf@r(kwebsh8bcMJ>!1r|0DMG0&i z<_Exb1jP_mnvx5Y;{27DXUs5;h#z!wcie=2#Y^KGH)dsxHoEFMN1aseYyn->&bkdM zwNj-r`1%$PiWr;H*`N&S{F3HFHt{&jN2zeSz%UsaR?d(4_(_%1Z~vk`S@>T!`gkey zm#uTQVn;oDCk^KzC$y*ja%g}t-beb5z2s>Q(YbkRkVfP7*uAOIgT2oPgQtkI|Z5-HaRY6a+ecx z!*-I7v+#bvxeF5GdZ$OgdWPyFBQ~E6) zW{C9kPxBqxo}60h9~@#d236;#t}yrq1x?N?zPVgj*0pr^N7=E-Y4HVLFIw<%LH}fx zxIrZb1P4{;6~4Z>?o9rK<&nW5!2B?KpN#-NMBEr5-8Hc-3hJ1)!X&-s@TmptePw#r zq}?>jP`r^ZQUxl4ang100$oX3u}#SYwD465rqQid9|{XcgF^MOenm@SM~8b4^Yj@U z*{?FO?m~J%tb0fZ&K%E8+?f%S;GT+w;%cpwwGuW(b}`B73cG`qnfGEsucBZ=aH(P|Dj&`dsYSViX{OL57gz7tgqYQ3 z16s4(yi~#ImdHsdbr;k9V?DeAT>SjJ2gl|eH|X_yoji460se)Sh&fqL&VFJ*N~&J3 zQnM{i&TxfugyUv3XFoZ1+n|)vpe#HIWsnDja*H|uD*^gVt5mAg)@4CT9gEQe0A z%7C14eqKH*5jpBGgKCUD3}dIjN9|?~b4>PdkB#+N*yL)R2XU_q@gsfo1_$jXt;WmXksfTCkkYj(v2j{R z63GF*sHwu(CPYv{zv-M45`aONZ8dP4F)x(n#IKW6)6(S3C8TfguTAU}wHs=OH-s2{%p=m3dn->qGIaFD{wbrOR6IO_W);?Nh59i^=?k(iMvN_q zPcXNj`u3{HLm#W1|Kg5hrDl^#BSu7;X5rK$;zO30HxpD22DQS476_>oZjFpfF++rq>C*$Z8y-nGn`qR? zq^%yvoc#v`Nbeor+g7!$QkQx#RU4HbUn>1_dBVZe^${xM^PJc9yrhiX`_@7ssq4Kl zd)8*Q?e}x>CJv5=#>oT~<3K}4GUXH+=oEQS@>BFEG;%%IXyc7a53me4T_Mwb#ag*N zAwFWkh!JZe!~4a>1s28y`uSGuPKrWZJ>QWbX{|Y4x-}5q{wjF_9q?l9Lu0M7W06Iyxry zi(XR@QL$&I%d{{xH!EBl(i`tu-o~RSTMY zppY3v0?LgnQGQVXW7L~61$bjjk0h$Q!?zL*gC#m+Dc1 zSHRFn=CM{_F9@%8T`nuWv50BABMS0DA_~m$(rzZn?!by{-%FADOuJbeHA1DXAW(y1{*&f2!F$K1w@_w}u)n_%?AfPcPgq`8v?N*cunJG#cTXGiZf68Uc4 zD=2#5;>-qP|6t3!w%GAIGTX>b@^R5Acg}Bg#g3st;ENh|VNo`>3u%PWxMQor?D!kp z07pkp4}&{mAYo_V00{3O);Zq_o0Un}KS+MD&Sk=es`*7snq3nPKQGQYlsRN!L|mMM z|D*o8ftl$?T2L6r$h_D6FtSjevOm>na7yZ?so7gcshqlk+>kr?=tLGLy|?Pc{M=## zlfKxwdhJ;uq3dSz8{^7X^$Wr2hbbbuJH_c-CwOK%1UiO=xi4(O^$2+{c}_|?6{OIi zAcfMg;(8k-@$#0nDtAW6#t)Z5h{Y;Htbcgau!68*VYQEK$*63v=$A3VTjzXo_RQE( z=89BTci-r+YTTkMS659{W(sNng)~);Mi0MHS*EhY&S}b>t&Og*7doFws|?Qw_4k9% zgi})O0zcJPKv^T2RC>ia_!=U)%_he|;|@esrFQP=6Q6C)@x6!T^LnLZNj60o6(E5(tsu_(jt#&V&o$ST1h8AE^TIz#){RyaqHF@opn1y9~aJ9q+F3}j;W zCCIJVD~p{z;_a?;>JU+*7;=}tNa*T7oVO=$nco#lK6&X0@ir?_2aE6qOI6g;X%s(| zx>cW{rR46byw3-CZ5geaf|f#Q1#fv1-%3|~hnA64U=Px;U!_&lslGzXsBWw&K>k+c z#(Y)pVf6YgNEZ5-#g7$VtJk1Ukpym|MGZKABz)LtiQi>OkE5lS<1<2TMt*K2P{H`&I2*dt{%*TV$%`lj5t=>dbrPBjzv*gQcOL6lbF|_+9g>vY zi*To_eNsVz;I_L6=r)*&UHkiGWb}*5K)2Mi^puqJG|H;nohBI+pd;w8u-lK%xmN+PKT$}`Mis=0~HmJ&JfUhA{=3Ld3(kRUD>&5(TRcKfdeu} zHKeMp^v{n7_w{x4@bph~A7&T?Co${F1*`-sEVmAX0#isVV39oy3%j>Ssg#g919dL} zEh#E(uY zCx!5nEBB0dIjbV#5+WiK*_*1Un1p`rk)h&G(TT|k$&t8NNi_9y2h0iL*WH6ux8cul zzod6_b5wNTc>%>tae7i!C{GhPkq~uAi8!(ZsXT4$fS|S^aj~^68_L{WM=fh^RNeMV zElv#@kzk55EkJ2ag@Af0I%I)4!(%yJFF51vyjp>na(*<&ZY297fu_>#@2U`!DZ~^O zhX3)OKf&OOh=9>2b>aUJ5oSw-LM0tUrm2zLCjr?DrejWatjk|U0@x)hgk$+7IFlYG1~z(+uRUCh0Ppf>ct$^l7}7keNcOk zO*=s7gqp)l)}L>W9xeURHZTn+qX09hXG9I+v*BaQcGM!s491S4Lx~}Mjc@e~IwZw} zVPTg2&cH|4vAT7v9}$MQW&J5le{=NcH>(~nTh{$dw+?&ADV#MOop%rHJ7zn2k0 zt|=reEbJdv(m~I3hjzOw-swJTl^+EjP`FzO!+o4RJhbQA8qO-SS$Yl}3I9gY9oU%wXL^yE7H%yElXTpankaWDOgoId7Df!c<}1&#D$H^3_IASNo)jtUf}%he9luvq`lWo(Tvb`E|Olir*u; z>mkrU`y{s$;ZLxeuE=HDY!<(l35YK#yCb@ORD9cg%t|+}%f>(=8ei7Nn~8DsFEO=u zX?y?9-*;HK(_$rFtM%uvw!t<>$SWptll&Jfd%~G@Dhh?&_OmSQouvp7GMUY+lh4x3 zzi~@SMc(-)P?>1RKto_S1RRc^D5WCd2kJ%jP{NLO_d^xGx1-%Npxw~Ew6hl#AvBZ= zvmNbNcd7KLVsrPi;HLXUHHtggExBHJmY|1v?r@yr&8IX4<+wm>@j`uO)TlZg0o;V&iiSI zuhT=rxLx*lQ8jt0bn@*j?Rj!eBDoMZc4>DNB`0&&TPw|rX{qzBEL(K3HDl8Ik01YF zdgs?$Po3J9wXV5&U8eBaQ_`QW)z-emjOYK#iZ7m*9{&MH)>|x&CBMO3*RGX*25}J2 zp%8|vsOA;2I668wsGP(moih+X{U6dfI2huDrp7_rf`rKIxS&)9r9~Vc$JVbGod=ZV zn}cIQRyDGO-wFsCS(DC)YvkT|2feDvm-+cA2pnxLvd@fhPZW>xkWW>#_2Nt&;#tI2 z&)PX^du#oXG2=7V?4Pje<@(BFbERv-U)QsZvmZNA)4pQZ;JFEf(N*W#=Dl`(7RnXx zp;56DmHeS$Seq^)t)2Zf`w4ZpYI3XG_Nv|7qJ7Ux-t-Kk29S zy0C5O%SbW1FD7Z&%F0PCX`6;F9XDq|UV2m31RPxi1ulQYxvCei5 zlFqX4*`49@D$Nl!rmpQok0qdoH+UMN2+4N!_3`oY3PO43KtIt{+e;Cyw;^KuO$|4O z>2QY(ZO-E&iRn^*K>&_@zY=3xck%A(T9JQPMmvU z%L&Fxm*xy!GjAv;r^j|jS=`mQpHrihj-V8QrF@NqG`|RU{!l3I{95@=*JG-{JsrQj z2~D{W)Xu;RgTUo1@?AwlYK;l1bT?HnR@ESsh~QVu6zAU?bwS<)F86Xw1{}0p4lPJQ zNDfMPKV?~@4?@)=e{3w3^DrFfw- ze`V+GW0j6hn{}>-nBiP}Ny7A3H|+VeZS;|!Sozr}wj5_Aiw6&0)0|HlU&s*lt6rBi zzVs_;e4&7Ssk$s{eBP2M6bQ|#H)M^^Tg<`$VIyyW#^)`b=yOr^ysYtgOO}u>tS306 z@p%i4bx8G^tnqnE2EMh8_kqUeEy;kqL-nex@p+30-`a=TV_f4)zk!>EVy+=YD)(;l%|5|MibU4?lX~(MR_gwld+= z8EIq5?psTccJ8$eAAk7%M<2a^>kHBY{h)g4Fp^H;e%T2nk5E|?whk}s2F1>!#ci5h zs5>dB1dl?ip9!#p6JMOq!9 zzp`4l)1R_@tGq*$|LL5_b~kin^luz9?y=JHX`ioH^yK7W>uRKr1mTg@ETnK+b#8V= z!r;8-aU(}gPo(o=0X_3-Me z(_$<;!}~wFX?$bqhSUW$b6PV7Hsud{hV*)@bX=Scx{zKEL`@?%l=)Iax1+ik!!6NG z`B(yqBc(rOjg)meuEemXa>XuA|K>>7Na4(xZ=?mdm(#cnjFD!Wq!n!OY~{_)LUv`) z%o*uHlLvP_4|*(+_KKc}G`v@@tD8_n+eVT9yIzml_SvF`{&l+f>d>m^r#2n0c=569 z4Y?!JgwMM!TLv`??vtL|`0zW^qa*glCFgCZ-?_)b5G!2TA>}%|VCM57#i^>dflEB@ z30>Xv5fPp^{sibyVM8U`FBAjH_q5VvcZBo&UzEEyl>7XOv;TQCt}-UFD(#U^7dklg zo3m=f+N-s*-`T$8nMIlGht2zUZXCCJBI{SuD$M$n4gGKib8=ko?6g+;;k~T#*oHSY z?)+@wJJoRHnUrLuPayD+%(C*@mR zSERElhi&!0y#xI|4Kt18`aKR+Bz?18qK(=#Q4!{*Yl>G`rz!{9_0{Rnj`kW~2~Eyp zI_VP9#i}5wJ|yH+7}jxp&dB9ORlCbuKiu-j?Z&a2#tdJO-}uV4p_}S!H;ov+cR}T{ zTsCn2uHj2Y70e&HQ+1=SR`09v@1B5SCp|xVVhq&0as^lJ!Lp(U@1{x*i)Kh|FmA-K zCnLHMtPAniSWB_+T*2+!27^+9&ya985#lU8C7g;)*qE zXjdy{pRkQ;vaPgFI^mfAG8vEVsBi|$$=%x&E)-9#=$KMdJ+-5}Rw+HkT&B;GzT3A) z`gZPA<_Q`UOEqkxa7wMAj3u2EBbEt>i>wgoCElz2uARE9 zVyei_Nf`(&x9>s*L?L=4V>hHVi=wT)`>$w0}cGCqKeaj94tf$dUQ8T2<-Yw z2vmMuUHxTE4aOhV?IYB&!I;x@8lShU7wQ!6pk;=&g-*4|6pI)Sck)Xs&f%u#Fl=4a zQ6|5%o12RZ>h(5hweIdgLAEoSKB-+c7#8DBvKeoqV7Bt>uW(a{-UERwWZ}U-fFqnK z}VCj-|+> zLO<|FR=j$|3sCxFT$q}a_(Mp-6=&63P_Pe(=d?yc3twM&^{ulD5upBl?VB1w+4W<_ zY;)w?%#yM(rHQpewzLkM9upW|l{~bdbWHw~q@l}&Z-sZe-V&0#;@E!gsR8s?Q<*_3 zcQLrvxdmh-CZ`5@#Fyqxo#O2=$>5Wcl$sD^OexIFt%?U%aF0OmLl6Zm-zZq$i{LZf z?jTRwJZXS1yL$zs25&Glst&w!^u0+5H}ZO)e9m@^&k3t=H3g~`>n(GeV~nA*TA~3v h39l2DP*x^_t-$MqFG(_wB5&HPo>t1IR*&B*{vTkkZ!rJ> literal 0 HcmV?d00001 diff --git a/test.py b/test.py index b057d73..0086b44 100644 --- a/test.py +++ b/test.py @@ -1,5 +1,5 @@ from collections import Counter -from src import make_word_cloud +from wrdcld import make_word_cloud with open("dancingmen.txt") as f: contents = f.read() diff --git a/src/__init__.py b/wrdcld/__init__.py similarity index 100% rename from src/__init__.py rename to wrdcld/__init__.py diff --git a/src/font.py b/wrdcld/font.py similarity index 80% rename from src/font.py rename to wrdcld/font.py index 5dd7022..bcf2293 100644 --- a/src/font.py +++ b/wrdcld/font.py @@ -1,18 +1,20 @@ from pathlib import Path from PIL import Image, ImageDraw, ImageFont +from wrdcld.util import get_repo_root - -FONT_PATH = Path(r"C:\\Windows\\Fonts\\Verdanab.ttf") -# FONT_PATH = Path("/usr/share/fonts/truetype/liberation/LiberationSerif-Bold.ttf") +def get_default_font_path(): + return get_repo_root() / "fonts" / "OpenSans-Regular.ttf" def find_fontsize_for_width(width, word): fontsize = width / 2 step = width / 2 + font_path = get_default_font_path() while step > 0.5: step /= 2 - font = ImageFont.truetype(FONT_PATH, fontsize) + + font = ImageFont.truetype(font_path, fontsize) length = font.getlength(word) if length < width: diff --git a/src/main.py b/wrdcld/main.py similarity index 95% rename from src/main.py rename to wrdcld/main.py index a79517b..94c8701 100644 --- a/src/main.py +++ b/wrdcld/main.py @@ -1,14 +1,13 @@ import random from PIL import ImageFont -from .font import FONT_PATH, draw_text +from .font import draw_text, get_default_font_path from .rectangle import ( Rectangle, fill_remaining_space_horizontal, fill_remaining_space_vertical, ) - def _fill( rectangle: Rectangle, canvas, @@ -52,7 +51,8 @@ def _fill( def fill_next_word(word, required_font_size, available_rectangles, img, canvas): - font = ImageFont.truetype(FONT_PATH, required_font_size) + font_path = get_default_font_path() + font = ImageFont.truetype(font_path, required_font_size) word_length = font.getlength(word) suitable_horizontal_rectangles = [ diff --git a/src/rectangle.py b/wrdcld/rectangle.py similarity index 100% rename from src/rectangle.py rename to wrdcld/rectangle.py diff --git a/wrdcld/util.py b/wrdcld/util.py new file mode 100644 index 0000000..39ff2bd --- /dev/null +++ b/wrdcld/util.py @@ -0,0 +1,4 @@ +from pathlib import Path + +def get_repo_root(): + return Path(__file__).parent.parent \ No newline at end of file From 5b54413ebff823cdc0a638f2cfa326ccd065374d Mon Sep 17 00:00:00 2001 From: Jim Barrett Date: Mon, 12 Aug 2024 10:47:54 +0200 Subject: [PATCH 02/11] start hacking on arbitrary rectangles --- Untitled.ipynb | 561 ++++++++++++ poetry.lock | 2394 ++++++++++++++++++++++++++++++++++++++++++++++-- pyproject.toml | 1 + wrdcld.ipynb | 2 +- wrdcld/main.py | 1 - 5 files changed, 2863 insertions(+), 96 deletions(-) create mode 100644 Untitled.ipynb diff --git a/Untitled.ipynb b/Untitled.ipynb new file mode 100644 index 0000000..00426b8 --- /dev/null +++ b/Untitled.ipynb @@ -0,0 +1,561 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "216783e4-03d3-4b5a-b5da-873b230567b2", + "metadata": {}, + "outputs": [], + "source": [ + "from pathlib import Path\n", + "from PIL import Image, ImageDraw, ImageFont\n", + "from collections import Counter\n", + "from dataclasses import dataclass\n", + "import random\n", + "import math\n", + "from wrdcld.font import get_default_font_path\n", + "from wrdcld.rectangle import Rectangle\n", + "import numpy as np" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "48ddef6a-bffb-4d81-9452-4780fa5eeab5", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": 99, + "id": "06bee73d-4be4-4ebf-8197-f5d841effea3", + "metadata": {}, + "outputs": [], + "source": [ + "img = Image.new('RGB', (500,500), color = (73, 109, 137))\n", + "canvas = ImageDraw.Draw(img)\n", + "\n", + "text = \"hello\"\n", + "\n", + "font = ImageFont.truetype(get_default_font_path(), size)\n", + "\n", + "bbox = font.getbbox(text)\n", + "\n", + "text_dims = (bbox[2]-bbox[0], (bbox[3]-bbox[1])*2 )\n", + "\n", + "tmp_img = Image.new('RGB', text_dims,color = (0,0,0))\n", + "tmp_canvas = ImageDraw.Draw(tmp_img)\n", + "\n", + "\n", + "\n", + "\n", + "tmp_canvas.text(\n", + " (0,0), \n", + " text,\n", + " fill=(255,255,255),\n", + " font=font,\n", + ")\n", + "\n", + "img_data = np.array(tmp_img.getdata())[:,1].reshape(text_dims)" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "id": "092895d1-e52a-497b-9b4e-ec6aac022a2a", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(0, 10, 68, 33)" + ] + }, + "execution_count": 100, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bbox" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "id": "ec79e1a9-f152-4c78-a948-f1f0f1de470d", + "metadata": {}, + "outputs": [ + { + "data": { + "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAuAEQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD5/orurvw9pUXwSsPEKWuNVl1k2rz+Y3MXludu3O3qo5xmuFoAKKKKACiu6+EXh7SvFHj6DTNYtftNm0ErmPzGTJAyOVIP60vwj8PaV4n8fQaZrFr9ps2glcx+YyZIGRypB/WgDhKKD1ooAKKKKAPadHudHsf2fLS91ix+3pb6y729ozlElm2sAHI52gFmwOuAKi8H3+hfE66vPDWoeEtF0y6e1kksrzS4DC0bqON3J3fj6dOeMm//AOTbtM/7GFv/AEVJSfAX/kp8H/XpP/6DQBS+GPhG1106vrOo2FzqNlo8AkFhbBi91K2difLzjg5x7V2OhQS+J9Yi0TxB8KIdM0y6JiS9sdLlt5bYkfKzSEYYZxnOB3OelY3wf1FrjSfE3hW11JtO1bU4Ek064WUxEypn5Aw5BOR07bqp/wBmfGc3ptPM8XeYG27vtc3l/wDfe7bj3zQBp/CLSX0H453GkyOHazF1AXAxu25Gfxxms74Cf8lTtv8Ar2m/9Bq18FWvG+Mp/tGWSW9EdwJ3lk3szgYOWycnPeqvwE/5Knbf9e03/oNAGd8OfDWlajDrfiPxBG82kaHAJXtkbabiRs7Ez2HH6itHTfHvhrWNUh0zWfAmg22lXEgiM1jCYriEE4DeYDlsdT0zS/C6WDWPDvivwW08cN7q8CSWJkbasksZJ2Z9T8v5GsrQfhV4tvfEdvZ3miXljbJKDcXVxGUijQH5mDnhuM9CaAMfxz4Ybwf4x1DRPMMscDgxSN1aNgGUn3wcH3BorT+LHiC08S/EbU76xkWS0UpBFIvRwihSw9QSDj2xRQByjalfvpq6a17cmwSTzVtTK3lK+CNwTOM4J5xnmiw1K+0q6F1p17c2dwAVEtvK0bgHqMqQaq0UAKCVYMpII5BHath/F3iWS1+zP4h1ZrfGPKa9kKY9MbsVjUUAWrDUr/SrsXenXtzZ3IBAmt5WjcA9RlSDRYalf6VdC6069ubO4AIE1vK0bgHqMqQaq0UAKGKsGUkMDkEdRWpdeJ9fvrP7Hd65qdxa4x5Mt3I6Y/3ScVlUUAFFFFAH/9k=", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEQAAAAuCAIAAAAeHijZAAAEFklEQVR4Ae1XWSutYRTehjIlU4YbFCmUC0UiQ5Eryo3coPwAQlEuFMkFSigulHkuUijlQrlBSUmZkgwXkgyZycE5D8tevd9k23t3Tud03u/i2+t71lrPet/nHbfJJB+pgFRAKiAVkApIBf5bBcrKyn5+PL9bAS7k7Ows1jLCxRiLtqPFiH8oQHbmbx0sOTJyZP6AAopphs0ZJX18fGpra9fW1h4fH19eXk5OTqanp3Nycr5oTWZm5vj4+PHxMeLv7++RW1dX5+/v/0WKVa7U1NT+/v69vb2np6fn5+ejo6ORkZGMjAx9Etrm0Y6YmBi0ic4c1bujo0Ob7OLiMjQ0pIqkz/Pz87S0NFWK0XlihLu6ug4ODuryAxwbG3Nzc1OVMBHX9fX1/v7+xcVFeXl5REQEiDBK2dnZm5ubRAdblQmF4Hp4eKiqqgoJCXFwcPDw8MjKytrZ2QF+e3sbFhYmphg1WhcH2+TkJJVGl1JSUvz8/Hx9fZOSknp6egifnZ11dFTMr8/OUPnIyEixPOzAwED0E15Qiy40GuDr62t6erqIw8YcOz09hRe9FV26jUaALp6XlwcGPFBKJCG7pKSEvEVFRQovczU0NCgc5o++vj5kHhwcmIH33/n5eYCq5nJAfX09vJjl7u7uDHKh71xnlpeXwbC1taXW3ky3tLREAQQoB8hkmpmZMUcqfnd3d/GNIWbU09OTlsTU1BSDorG6uopPLKqoqCgR/6aNWgkJCQgeHR19e3vTzRoeHgYOfprMitseHNvb27pp2EOAOzk5sTc6Opo+u7u7Ozs7GWeDtRclYK9FA/xYMwgjUXTj2YV9C6td3ZmrqyvdNC0YEBBAIFa81isiogQi/rWNtU4BZ2dnRpFYluSiYHVnjAZUS8fzGJNhZWVFG2AnQsMCEja0hOyixqjXjDbBCLm8vCRXcHCwUYw9OKseFBRkxMMuGj3bO4NNBjsJymD7NypmD47DjaZJXFycEQ+71tfXEWN7Z3C2YusERUFBgZeXl1E9m/Gbm5uFhQWk5+fn814ismGOFRYWAoGsh4eHMGzvDJKbmprwxuLD8YwtGLb2sbg9aFMYaWxshB0eHl5TU8MgG6WlpfHx8fhsbm5m8N3gs0yBCh8VFRWYVHd3dwL2bg4MDADHs7GxgZMYlyDscqGhoTiCKisrFxcXW1paxBQupBLbCO/q6iJ+XMOSk5O9vb0xCxITE3t7ewmfm5vjreizEHOJhUXbqDNoU1tbGyY3UWvfra2tIg8X+mZnENbe3q6lJWRiYkIcebumGVqJOz+GOzY2FiWxZPGvAWXwxnUdlTBW1dXVYmestcFfXFyM3R9DgWPxx8eDFYJrAf535Obm4qZvLaeMlwpIBaQCUgGpgFRAKiAVkApYp8Avtum4DL8+7aEAAAAASUVORK5CYII=", + "text/plain": [ + "" + ] + }, + "execution_count": 101, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tmp_img" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "id": "bbd03f30-2a0c-4a37-ac5c-4df4fa242321", + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "img_data = np.array(tmp_img.getdata())[:,1].reshape(text_dims)" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "id": "56bc00c8-0ca4-4eb3-bf26-aa5c372133cc", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(68, 46)" + ] + }, + "execution_count": 103, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "img_data.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "id": "efe20592-d6ab-4017-90d2-f608d14f417b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " ...,\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0]])" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "img_data.T" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "id": "a35fc5ea-bac3-494c-b1c7-52abdb47aded", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 255 0 0 4 0 9 0 75 0 0 87 0 255\n", + " 255 112 4 0 255 0 0 0 70 117 0 148 12 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 112 0 0 255 0 0 0 0 0 0 255 0 112 0 0 255\n", + " 255 255 0 0 0 14 0 0 255 197 0 255 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 255 0 0 4 0 0 0 0 0 0 253 0 255 0 112 4\n", + " 255 255 0 0 0 253 0 0 255 143 0 255 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 112\n", + " 0 0 255 0 0 0 0 0 0 7 0 112 66 0 255 0 255 0\n", + " 255 0 80 0 0 255 0 0 131 0 0 255 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255\n", + " 0 0 4 0 0 0 0 0 0 164 0 255 0 112 4 0 255 0\n", + " 255 0 255 0 0 129 0 0 0 0 0 255 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255\n", + " 0 0 0 0 0 0 0 0 112 255 0 255 0 255 0 0 18 60\n", + " 255 0 255 0 0 0 0 0 0 0 116 255 112 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4\n", + " 0 0 0 0 0 0 0 0 255 255 112 4 0 255 0 0 0 255\n", + " 255 0 53 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 112 0 0 255 255 255 0 0 136 0 0 0 255\n", + " 255 0 0 0 0 0 0 116 0 112 244 255 255 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 255 0 112 4 255 241 0 0 0 199 80 0 73\n", + " 255 0 0 0 0 0 0 255 0 255 0 255 4 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 112 0 0 255 0 255 0 255 222 0 21 0 255 255 0 0\n", + " 72 0 0 0 116 0 112 244 0 255 0 172 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 255 0 112 4 0 254 0 255 237 1 233 0 214 255 0 0\n", + " 0 0 0 0 255 0 255 0 112 4 0 11 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 112\n", + " 0 0 255 0 255 0 0 0 0 255 113 174 255 0 2 51 0 0\n", + " 0 116 0 112 244 0 255 0 255 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255\n", + " 0 112 4 0 255 0 0 17 0 236 37 255 166 0 0 0 0 0\n", + " 0 255 0 255 0 0 4 0 255 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255\n", + " 0 255 0 0 0 0 0 128 0 63 8 255 0 0 0 0 116 0\n", + " 112 244 0 255 0 109 0 0 98 0 4 0 112 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 112 4\n", + " 0 255 0 0 0 0 0 207 0 0 17 163 0 0 0 0 255 0\n", + " 255 0 0 4 0 255 0 79 0 0 145 0 255 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0\n", + " 0 0 0 0 0 0 0 247 62 0 76 61 0 160 0 112 244 0\n", + " 255 0 33 0 19 255 0 255 0 112 254 0 255 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0\n", + " 0 0 0 0 0 0 0 252 161 0 213 19 0 255 0 255 0 0\n", + " 4 0 255 0 254 32 0 255 0 255 255 112 4 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 231 220 0 255 18 112 223 0 255 0 55\n", + " 0 79 255 0 255 0 112 178 0 255 255 255 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 178 248 0 255 58 255 0 0 4 0 255\n", + " 0 255 100 0 144 0 255 7 112 4 255 255 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 79 250 112 76 158 255 0 198 0 55 255\n", + " 0 255 0 112 0 0 255 0 255 0 255 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 225 255 0 255 4 0 255 0 255 79\n", + " 0 54 0 255 0 112 4 0 255 0 255 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 112 0 166 255 0 255 0 0 214 0 255 0\n", + " 112 0 0 255 0 255 0 0 0 0 255 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 255 0 67 4 0 182 0 189 0 0 244 0\n", + " 255 0 112 4 0 255 0 0 0 0 255 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 112 0 0 255 0 0 0 0 2 0 255 0 112 240 0\n", + " 255 0 255 0 0 0 0 0 0 156 255 0 54 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 255 0 0 4 0 0 0 0 0 0 166 0 255 240 112\n", + " 4 0 255 0 0 0 189 0 0 255 144 0 158 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 112 0 0 255 0 0 0 0 0 0 166 0 112 0 0 255 240 255\n", + " 0 0 0 57 0 0 255 0 0 255 0 0 221 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 255 0 0 4 0 0 0 0 0 0 255 0 255 0 112 4 240 255\n", + " 0 0 0 255 0 0 220 11 0 168 0 0 250 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 112 0 0\n", + " 255 0 0 0 0 0 0 0 0 112 246 0 255 0 255 0 240 2\n", + " 79 0 0 255 0 0 4 0 0 60 0 116 250 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0\n", + " 4 0 0 0 0 0 0 0 0 255 120 112 4 0 255 0 240 0\n", + " 255 0 0 77 0 0 0 0 0 16 0 255 223 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0\n", + " 0 0 0 0 0 0 112 69 0 255 30 255 0 0 59 18 240 0\n", + " 255 0 0 0 0 0 0 0 116 15 112 244 166 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 0 0\n", + " 0 0 0 0 0 0 255 171 112 4 1 255 0 0 0 254 244 0\n", + " 52 0 0 0 0 0 0 0 255 57 255 0 68 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 112 0 0 255 229 255 0 11 243 0 0 0 255 255 0\n", + " 0 0 0 0 0 116 0 112 244 159 255 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 255 0 112 4 252 245 0 75 40 86 132 0 125 255 0\n", + " 0 0 0 0 0 255 0 255 0 255 4 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 112 0 0 255 0 255 0 245 45 0 216 0 255 255 0 0 69 0\n", + " 0 0 116 0 112 244 0 255 0 255 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 255 0 112 4 0 255 0 207 229 0 255 0 255 248 0 0 0 0\n", + " 0 0 255 0 255 0 1 4 0 185 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 112 0 0\n", + " 255 0 255 0 0 0 0 130 255 8 243 0 120 10 0 0 0 116\n", + " 0 112 244 0 255 0 202 0 0 2 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 112\n", + " 4 0 255 0 0 0 0 21 255 163 34 0 0 0 0 0 0 255\n", + " 0 255 0 0 4 0 255 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 255\n", + " 0 0 0 0 0 0 0 0 255 255 0 0 0 0 122 0 112 244\n", + " 0 255 0 57 0 0 213 0 162 0 112 47 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 112 4 0 255\n", + " 0 0 0 0 0 0 0 0 255 255 0 23 0 0 255 0 255 0\n", + " 0 4 0 255 0 197 0 0 255 0 255 147 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0\n", + " 0 0 0 0 0 0 0 0 255 255 0 241 0 112 241 0 255 0\n", + " 32 0 61 255 0 255 0 112 255 0 255 212 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0\n", + " 0 0 0 0 0 0 0 0 255 255 0 255 0 255 0 0 4 0\n", + " 255 0 255 79 0 236 0 255 212 112 4 246 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 255 255 112 174 0 255 0 107 0 77\n", + " 255 0 255 0 112 15 0 255 96 255 0 254 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 149 255 255 0 109 4 0 255 0 255\n", + " 98 0 83 0 255 0 112 4 37 255 0 246 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 112 0 255 255 0 255 0 13 255 0 255\n", + " 0 112 0 0 255 0 255 0 22 0 0 219 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 255 0 255 4 0 255 0 252 34 0 255\n", + " 0 255 0 112 4 0 255 0 31 0 0 171 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n", + "[ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n", + " 0 0 0 0 112 0 0 255 0 168 0 0 96 0 255 0 112 255\n", + " 0 255 0 255 0 0 0 0 63 0 4 95 0 0 0 0 0 0\n", + " 0 0 0 0 0 0 0 0 0 0 0 0 0 0]\n" + ] + } + ], + "source": [ + "completed_rectangles = []\n", + "active_rectangles = [Rectangle(x=0,y=0, width=img_data.shape[0], height=0)]\n", + "base_value = 1\n", + "for ind, img_row in enumerate(img_data.T):\n", + "\n", + " print(img_row)\n", + " \n", + " new_active_rectangles = []\n", + " for rect in active_rectangles:\n", + " # rectangle isn't done yet\n", + " if np.all(img_row[rect.x: rect.x+rect.width] == base_value):\n", + " active_rectangles.remove(rect)\n", + " new_active_rectangles.append(Rectangle(x=rect.x, y=rect.y, width=rect.width, height=rect.height+1))\n", + " # make the new rectangles\n", + " else:\n", + " active_rectangles.remove(rect)\n", + " completed_rectangles.append(rect)\n", + "\n", + " # find the new rectangles to start\n", + " new_left = []\n", + " new_right = []\n", + " new_rect_active = False\n", + " for col_ind, val in enumerate(img_row):\n", + " if val == base_value and not new_rect_active:\n", + " new_rect_active = True\n", + " new_left.append(col_ind + rect.x)\n", + " elif new_rect_active and val != base_value:\n", + " new_rect_active = False\n", + " new_right.append(col_ind + rect.x)\n", + " else:\n", + " continue\n", + "\n", + " if new_rect_active:\n", + " new_right.append(rect.x + rect.width)\n", + "\n", + " for left, right in zip(new_left, new_right, strict=True):\n", + " new_active_rectangles.append(Rectangle(x=left, y=ind, width=right-left, height=0))\n", + "\n", + " active_rectangles = new_active_rectangles\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "id": "cd111b81-758e-4bff-a61b-afd10567ec17", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Rectangle(x=0 y=0 w=68 h=0)]" + ] + }, + "execution_count": 94, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "completed_rectangles" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "id": "68d51d69-0f27-429d-9292-53d177d620cc", + "metadata": {}, + "outputs": [], + "source": [ + "for rectangle in completed_rectangles:\n", + " tmp_canvas.rectangle(rectangle.corners)" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "id": "7054930e-1c3d-46a8-b19e-ed53b95c542b", + "metadata": {}, + "outputs": [ + { + "data": { + "image/jpeg": "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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEQAAAAuCAIAAAAeHijZAAAEHklEQVR4Ae1XySv9URR/D2VKpgwbFCmUhSKRociKspENyh9AKMpC0csCJRQLZZ6LFEpZKBuUlJQpybCQZMhMxt+H653ud7ie917JT/e7+L7z/ZxzPueec+899z7j29ub4c88fyqZPzMrMhFZAVkBWQFZgV9cgdLSUpyeP3CAUiAnJye+HiKct7EoO1i0+I8MZDK/dbLkzMiZ+YEKKJYZa83e3t41NTUrKyv39/fPz89HR0eTk5PZ2dlfjCYjI2N0dPTw8BD2t7e38DWZTH5+fl+4WKVKSUnp7e3d2dl5eHh4fHw8ODgYGhpKT0/XJ2FtHuOIjo7GmD6OHPWrra1N6+zs7DwwMKA2/fg+PT1NTU1VuYjOExHu4uLS39+vyw9wZGTE1dVVFcLAuC4vL3d3d8/OzsrKysLDw0GEWcrKylpfX2d0kFWeqBBUd3d3lZWVwcHBRqPR3d09MzNza2sL+PX1dWhoKO8iGrQuDrbx8XEWGiklJyf7+vr6+PgkJiZ2dXUxfHp62sFBsb4+k2HhIyIi+PCQAwICkCe0oOZVGDTAl5eXtLQ0HoeMNXZ8fAwtsuVVuoOGgS6em5sLBjyoFE/C5OLiYqYtLCxUaImrrq5OoTB/9PT0wHNvb88MvP/Ozs4CVA2XDGpra6HFKndzcyOQAn3nOrO4uAiGjY0Nde3NdAsLC8yAAcoJMhimpqbMlorf7e1tfGOKCfXw8GBbYmJigkBeWF5exic2VWRkJI9/U0as+Ph4GA8PD7++vup6DQ4OAgc/W8yK2x4Um5ubum7oIcAdHR1JGxUVxT47Ozvb29sJJ4Fqz5eAtBYF8GPPwIwVRdeeVOhb2O3qZC4uLnTdtKC/vz8DseO1Wh7hS8DjX8vY68zg5OREZIltyVTMWJ2MaEK1dLSOsRiWlpa0BnYibFpAQoKWkFRsMOo9o3UQIefn50wVFBQksrEHp6oHBgaKeEjFZs/2ZNBk0EkQBu1fFMweHIcbWyaxsbEiHlKtrq7CxvZkcLaidYIiPz/f09NTFM9m/Orqam5uDu55eXnUS3g2rLGCggIgKOv+/j4E25OBc0NDA97YfDie0YIhax+L7UHrQkh9fT3ksLCw6upqAkkoKSmJi4vDZ2NjI4HvAp1lCpT7KC8vx6K6ubnhsHexr68POJ61tTWcxLgEocuFhITgCKqoqJifn29qauJdKJCq2CK8o6OD8eMalpSU5OXlhVWQkJDQ3d3N8JmZGWpFn4GIiw/My6JkMKaWlhYsbkatfTc3N/M8FOibycCstbVVS8uQsbExfubtWmYYJe78mO6YmBiExJbFvwaEwRvXdUTCXFVVVfHJWCuDv6ioCN0fU4Fj8enjwQ7BtQD/O3JycnDTt5ZT2ssKyArICsgKyArICsgKyArIClhXgX+e9L4HJXzfaAAAAABJRU5ErkJggg==", + "text/plain": [ + "" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tmp_img" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "0dbcd09f-518d-49eb-99c3-d6d050a99af8", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Rectangle(x=0 y=0 w=69 h=23), Rectangle(x=0 y=23 w=2 h=6)]" + ] + }, + "execution_count": 29, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "completed_rectangles" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "6e7ea5b5-ecbc-470c-b5fa-1c68f5776f88", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([255, 255, 255, ..., 73, 73, 73])" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "np.array(tmp_img.getdata())[:,0]" + ] + }, + { + "cell_type": "code", + "execution_count": 11, + "id": "41739495-9053-4ea7-b36f-cbc0f7dd5339", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[ 73, 73, 73, ..., 76, 73, 255],\n", + " [ 73, 73, 73, ..., 73, 73, 76],\n", + " [ 73, 73, 73, ..., 73, 73, 73],\n", + " ...,\n", + " [ 73, 73, 73, ..., 73, 73, 73],\n", + " [ 73, 73, 73, ..., 73, 153, 73],\n", + " [ 73, 73, 73, ..., 73, 255, 73]])" + ] + }, + "execution_count": 11, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "img_data.T" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "bcbccb8e-f8ea-40ce-ba69-83a13d974ac3", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.11.2" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/poetry.lock b/poetry.lock index 985f2a5..fba1b9c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,5 +1,114 @@ # This file is automatically @generated by Poetry 1.8.3 and should not be changed by hand. +[[package]] +name = "anyio" +version = "4.4.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.4.0-py3-none-any.whl", hash = "sha256:c1b2d8f46a8a812513012e1107cb0e68c17159a7a594208005a57dc776e1bdc7"}, + {file = "anyio-4.4.0.tar.gz", hash = "sha256:5aadc6a1bbb7cdb0bede386cac5e2940f5e2ff3aa20277e991cf028e0585ce94"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + +[[package]] +name = "argon2-cffi" +version = "23.1.0" +description = "Argon2 for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, +] + +[package.dependencies] +argon2-cffi-bindings = "*" + +[package.extras] +dev = ["argon2-cffi[tests,typing]", "tox (>4)"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] +tests = ["hypothesis", "pytest"] +typing = ["mypy"] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +description = "Low-level CFFI bindings for Argon2" +optional = false +python-versions = ">=3.6" +files = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] + +[package.dependencies] +cffi = ">=1.0.1" + +[package.extras] +dev = ["cogapp", "pre-commit", "pytest", "wheel"] +tests = ["pytest"] + +[[package]] +name = "arrow" +version = "1.3.0" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" +types-python-dateutil = ">=2.8.10" + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] + [[package]] name = "astroid" version = "3.2.4" @@ -14,6 +123,92 @@ files = [ [package.dependencies] typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + +[[package]] +name = "async-lru" +version = "2.0.4" +description = "Simple LRU cache for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, + {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "attrs" +version = "24.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2"}, + {file = "attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346"}, +] + +[package.extras] +benchmark = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +cov = ["cloudpickle", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +dev = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier (<24.7)"] +tests = ["cloudpickle", "hypothesis", "mypy (>=1.11.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] +tests-mypy = ["mypy (>=1.11.1)", "pytest-mypy-plugins"] + +[[package]] +name = "babel" +version = "2.16.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.8" +files = [ + {file = "babel-2.16.0-py3-none-any.whl", hash = "sha256:368b5b98b37c06b7daf6696391c3240c938b37767d4584413e8438c5c435fa8b"}, + {file = "babel-2.16.0.tar.gz", hash = "sha256:d1f3554ca26605fe173f3de0c65f750f5a42f924499bf134de6423582298e316"}, +] + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.3" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.3-py3-none-any.whl", hash = "sha256:b80878c9f40111313e55da8ba20bdba06d8fa3969fc68304167741bbf9e082ed"}, + {file = "beautifulsoup4-4.12.3.tar.gz", hash = "sha256:74e3d1928edc070d21748185c46e3fb33490f22f52a3addee9aee0f4f7781051"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +cchardet = ["cchardet"] +chardet = ["chardet"] +charset-normalizer = ["charset-normalizer"] +html5lib = ["html5lib"] +lxml = ["lxml"] + [[package]] name = "black" version = "24.8.0" @@ -60,6 +255,213 @@ d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "bleach" +version = "6.1.0" +description = "An easy safelist-based HTML-sanitizing tool." +optional = false +python-versions = ">=3.8" +files = [ + {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, + {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, +] + +[package.dependencies] +six = ">=1.9.0" +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.3)"] + +[[package]] +name = "certifi" +version = "2024.7.4" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.7.4-py3-none-any.whl", hash = "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90"}, + {file = "certifi-2024.7.4.tar.gz", hash = "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b"}, +] + +[[package]] +name = "cffi" +version = "1.17.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9338cc05451f1942d0d8203ec2c346c830f8e86469903d5126c1f0a13a2bcbb"}, + {file = "cffi-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0ce71725cacc9ebf839630772b07eeec220cbb5f03be1399e0457a1464f8e1a"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c815270206f983309915a6844fe994b2fa47e5d05c4c4cef267c3b30e34dbe42"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6bdcd415ba87846fd317bee0774e412e8792832e7805938987e4ede1d13046d"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8a98748ed1a1df4ee1d6f927e151ed6c1a09d5ec21684de879c7ea6aa96f58f2"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0a048d4f6630113e54bb4b77e315e1ba32a5a31512c31a273807d0027a7e69ab"}, + {file = "cffi-1.17.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24aa705a5f5bd3a8bcfa4d123f03413de5d86e497435693b638cbffb7d5d8a1b"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:856bf0924d24e7f93b8aee12a3a1095c34085600aa805693fb7f5d1962393206"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:4304d4416ff032ed50ad6bb87416d802e67139e31c0bde4628f36a47a3164bfa"}, + {file = "cffi-1.17.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:331ad15c39c9fe9186ceaf87203a9ecf5ae0ba2538c9e898e3a6967e8ad3db6f"}, + {file = "cffi-1.17.0-cp310-cp310-win32.whl", hash = "sha256:669b29a9eca6146465cc574659058ed949748f0809a2582d1f1a324eb91054dc"}, + {file = "cffi-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:48b389b1fd5144603d61d752afd7167dfd205973a43151ae5045b35793232aa2"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c5d97162c196ce54af6700949ddf9409e9833ef1003b4741c2b39ef46f1d9720"}, + {file = "cffi-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5ba5c243f4004c750836f81606a9fcb7841f8874ad8f3bf204ff5e56332b72b9"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb9333f58fc3a2296fb1d54576138d4cf5d496a2cc118422bd77835e6ae0b9cb"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:435a22d00ec7d7ea533db494da8581b05977f9c37338c80bc86314bec2619424"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1df34588123fcc88c872f5acb6f74ae59e9d182a2707097f9e28275ec26a12d"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df8bb0010fdd0a743b7542589223a2816bdde4d94bb5ad67884348fa2c1c67e8"}, + {file = "cffi-1.17.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8b5b9712783415695663bd463990e2f00c6750562e6ad1d28e072a611c5f2a6"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ffef8fd58a36fb5f1196919638f73dd3ae0db1a878982b27a9a5a176ede4ba91"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:4e67d26532bfd8b7f7c05d5a766d6f437b362c1bf203a3a5ce3593a645e870b8"}, + {file = "cffi-1.17.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:45f7cd36186db767d803b1473b3c659d57a23b5fa491ad83c6d40f2af58e4dbb"}, + {file = "cffi-1.17.0-cp311-cp311-win32.whl", hash = "sha256:a9015f5b8af1bb6837a3fcb0cdf3b874fe3385ff6274e8b7925d81ccaec3c5c9"}, + {file = "cffi-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:b50aaac7d05c2c26dfd50c3321199f019ba76bb650e346a6ef3616306eed67b0"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:aec510255ce690d240f7cb23d7114f6b351c733a74c279a84def763660a2c3bc"}, + {file = "cffi-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2770bb0d5e3cc0e31e7318db06efcbcdb7b31bcb1a70086d3177692a02256f59"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db9a30ec064129d605d0f1aedc93e00894b9334ec74ba9c6bdd08147434b33eb"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a47eef975d2b8b721775a0fa286f50eab535b9d56c70a6e62842134cf7841195"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f3e0992f23bbb0be00a921eae5363329253c3b86287db27092461c887b791e5e"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6107e445faf057c118d5050560695e46d272e5301feffda3c41849641222a828"}, + {file = "cffi-1.17.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb862356ee9391dc5a0b3cbc00f416b48c1b9a52d252d898e5b7696a5f9fe150"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c1c13185b90bbd3f8b5963cd8ce7ad4ff441924c31e23c975cb150e27c2bf67a"}, + {file = "cffi-1.17.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:17c6d6d3260c7f2d94f657e6872591fe8733872a86ed1345bda872cfc8c74885"}, + {file = "cffi-1.17.0-cp312-cp312-win32.whl", hash = "sha256:c3b8bd3133cd50f6b637bb4322822c94c5ce4bf0d724ed5ae70afce62187c492"}, + {file = "cffi-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:dca802c8db0720ce1c49cce1149ff7b06e91ba15fa84b1d59144fef1a1bc7ac2"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6ce01337d23884b21c03869d2f68c5523d43174d4fc405490eb0091057943118"}, + {file = "cffi-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cab2eba3830bf4f6d91e2d6718e0e1c14a2f5ad1af68a89d24ace0c6b17cced7"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b9cbc8f7ac98a739558eb86fabc283d4d564dafed50216e7f7ee62d0d25377"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b00e7bcd71caa0282cbe3c90966f738e2db91e64092a877c3ff7f19a1628fdcb"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41f4915e09218744d8bae14759f983e466ab69b178de38066f7579892ff2a555"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4760a68cab57bfaa628938e9c2971137e05ce48e762a9cb53b76c9b569f1204"}, + {file = "cffi-1.17.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:011aff3524d578a9412c8b3cfaa50f2c0bd78e03eb7af7aa5e0df59b158efb2f"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:a003ac9edc22d99ae1286b0875c460351f4e101f8c9d9d2576e78d7e048f64e0"}, + {file = "cffi-1.17.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ef9528915df81b8f4c7612b19b8628214c65c9b7f74db2e34a646a0a2a0da2d4"}, + {file = "cffi-1.17.0-cp313-cp313-win32.whl", hash = "sha256:70d2aa9fb00cf52034feac4b913181a6e10356019b18ef89bc7c12a283bf5f5a"}, + {file = "cffi-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:b7b6ea9e36d32582cda3465f54c4b454f62f23cb083ebc7a94e2ca6ef011c3a7"}, + {file = "cffi-1.17.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:964823b2fc77b55355999ade496c54dde161c621cb1f6eac61dc30ed1b63cd4c"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:516a405f174fd3b88829eabfe4bb296ac602d6a0f68e0d64d5ac9456194a5b7e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dec6b307ce928e8e112a6bb9921a1cb00a0e14979bf28b98e084a4b8a742bd9b"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e4094c7b464cf0a858e75cd14b03509e84789abf7b79f8537e6a72152109c76e"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2404f3de742f47cb62d023f0ba7c5a916c9c653d5b368cc966382ae4e57da401"}, + {file = "cffi-1.17.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3aa9d43b02a0c681f0bfbc12d476d47b2b2b6a3f9287f11ee42989a268a1833c"}, + {file = "cffi-1.17.0-cp38-cp38-win32.whl", hash = "sha256:0bb15e7acf8ab35ca8b24b90af52c8b391690ef5c4aec3d31f38f0d37d2cc499"}, + {file = "cffi-1.17.0-cp38-cp38-win_amd64.whl", hash = "sha256:93a7350f6706b31f457c1457d3a3259ff9071a66f312ae64dc024f049055f72c"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a2ddbac59dc3716bc79f27906c010406155031a1c801410f1bafff17ea304d2"}, + {file = "cffi-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6327b572f5770293fc062a7ec04160e89741e8552bf1c358d1a23eba68166759"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc183e7bef690c9abe5ea67b7b60fdbca81aa8da43468287dae7b5c046107d4"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bdc0f1f610d067c70aa3737ed06e2726fd9d6f7bfee4a351f4c40b6831f4e82"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d872186c1617d143969defeadac5a904e6e374183e07977eedef9c07c8953bf"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0d46ee4764b88b91f16661a8befc6bfb24806d885e27436fdc292ed7e6f6d058"}, + {file = "cffi-1.17.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f76a90c345796c01d85e6332e81cab6d70de83b829cf1d9762d0a3da59c7932"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0e60821d312f99d3e1569202518dddf10ae547e799d75aef3bca3a2d9e8ee693"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:eb09b82377233b902d4c3fbeeb7ad731cdab579c6c6fda1f763cd779139e47c3"}, + {file = "cffi-1.17.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24658baf6224d8f280e827f0a50c46ad819ec8ba380a42448e24459daf809cf4"}, + {file = "cffi-1.17.0-cp39-cp39-win32.whl", hash = "sha256:0fdacad9e0d9fc23e519efd5ea24a70348305e8d7d85ecbb1a5fa66dc834e7fb"}, + {file = "cffi-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:7cbc78dc018596315d4e7841c8c3a7ae31cc4d638c9b627f87d52e8abaaf2d29"}, + {file = "cffi-1.17.0.tar.gz", hash = "sha256:f3157624b7558b914cb039fd1af735e5e8049a87c817cc215109ad1c8779df76"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + [[package]] name = "click" version = "8.1.7" @@ -85,6 +487,76 @@ files = [ {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +[[package]] +name = "comm" +version = "0.2.2" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "debugpy" +version = "1.8.5" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.5-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:7e4d594367d6407a120b76bdaa03886e9eb652c05ba7f87e37418426ad2079f7"}, + {file = "debugpy-1.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4413b7a3ede757dc33a273a17d685ea2b0c09dbd312cc03f5534a0fd4d40750a"}, + {file = "debugpy-1.8.5-cp310-cp310-win32.whl", hash = "sha256:dd3811bd63632bb25eda6bd73bea8e0521794cda02be41fa3160eb26fc29e7ed"}, + {file = "debugpy-1.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:b78c1250441ce893cb5035dd6f5fc12db968cc07f91cc06996b2087f7cefdd8e"}, + {file = "debugpy-1.8.5-cp311-cp311-macosx_12_0_universal2.whl", hash = "sha256:606bccba19f7188b6ea9579c8a4f5a5364ecd0bf5a0659c8a5d0e10dcee3032a"}, + {file = "debugpy-1.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db9fb642938a7a609a6c865c32ecd0d795d56c1aaa7a7a5722d77855d5e77f2b"}, + {file = "debugpy-1.8.5-cp311-cp311-win32.whl", hash = "sha256:4fbb3b39ae1aa3e5ad578f37a48a7a303dad9a3d018d369bc9ec629c1cfa7408"}, + {file = "debugpy-1.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:345d6a0206e81eb68b1493ce2fbffd57c3088e2ce4b46592077a943d2b968ca3"}, + {file = "debugpy-1.8.5-cp312-cp312-macosx_12_0_universal2.whl", hash = "sha256:5b5c770977c8ec6c40c60d6f58cacc7f7fe5a45960363d6974ddb9b62dbee156"}, + {file = "debugpy-1.8.5-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0a65b00b7cdd2ee0c2cf4c7335fef31e15f1b7056c7fdbce9e90193e1a8c8cb"}, + {file = "debugpy-1.8.5-cp312-cp312-win32.whl", hash = "sha256:c9f7c15ea1da18d2fcc2709e9f3d6de98b69a5b0fff1807fb80bc55f906691f7"}, + {file = "debugpy-1.8.5-cp312-cp312-win_amd64.whl", hash = "sha256:28ced650c974aaf179231668a293ecd5c63c0a671ae6d56b8795ecc5d2f48d3c"}, + {file = "debugpy-1.8.5-cp38-cp38-macosx_12_0_x86_64.whl", hash = "sha256:3df6692351172a42af7558daa5019651f898fc67450bf091335aa8a18fbf6f3a"}, + {file = "debugpy-1.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1cd04a73eb2769eb0bfe43f5bfde1215c5923d6924b9b90f94d15f207a402226"}, + {file = "debugpy-1.8.5-cp38-cp38-win32.whl", hash = "sha256:8f913ee8e9fcf9d38a751f56e6de12a297ae7832749d35de26d960f14280750a"}, + {file = "debugpy-1.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:a697beca97dad3780b89a7fb525d5e79f33821a8bc0c06faf1f1289e549743cf"}, + {file = "debugpy-1.8.5-cp39-cp39-macosx_12_0_x86_64.whl", hash = "sha256:0a1029a2869d01cb777216af8c53cda0476875ef02a2b6ff8b2f2c9a4b04176c"}, + {file = "debugpy-1.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84c276489e141ed0b93b0af648eef891546143d6a48f610945416453a8ad406"}, + {file = "debugpy-1.8.5-cp39-cp39-win32.whl", hash = "sha256:ad84b7cde7fd96cf6eea34ff6c4a1b7887e0fe2ea46e099e53234856f9d99a34"}, + {file = "debugpy-1.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:7b0fe36ed9d26cb6836b0a51453653f8f2e347ba7348f2bbfe76bfeb670bfb1c"}, + {file = "debugpy-1.8.5-py2.py3-none-any.whl", hash = "sha256:55919dce65b471eff25901acf82d328bbd5b833526b6c1364bd5133754777a44"}, + {file = "debugpy-1.8.5.zip", hash = "sha256:b2112cfeb34b4507399d298fe7023a16656fc553ed5246536060ca7bd0e668d0"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + [[package]] name = "dill" version = "0.3.8" @@ -101,117 +573,1004 @@ graph = ["objgraph (>=1.7.2)"] profile = ["gprof2dot (>=2022.7.29)"] [[package]] -name = "isort" -version = "5.13.2" -description = "A Python utility / library to sort Python imports." +name = "exceptiongroup" +version = "1.2.2" +description = "Backport of PEP 654 (exception groups)" optional = false -python-versions = ">=3.8.0" +python-versions = ">=3.7" files = [ - {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, - {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, + {file = "exceptiongroup-1.2.2-py3-none-any.whl", hash = "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b"}, + {file = "exceptiongroup-1.2.2.tar.gz", hash = "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc"}, ] [package.extras] -colors = ["colorama (>=0.4.6)"] +test = ["pytest (>=6)"] [[package]] -name = "mccabe" -version = "0.7.0" -description = "McCabe checker, plugin for flake8" +name = "executing" +version = "2.0.1" +description = "Get the currently executing AST node of a frame, and other information" optional = false -python-versions = ">=3.6" +python-versions = ">=3.5" files = [ - {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, - {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, ] +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + [[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." +name = "fastjsonschema" +version = "2.20.0" +description = "Fastest Python implementation of JSON schema" optional = false -python-versions = ">=3.5" +python-versions = "*" files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, + {file = "fastjsonschema-2.20.0-py3-none-any.whl", hash = "sha256:5875f0b0fa7a0043a91e93a9b8f793bcbbba9691e7fd83dca95c28ba26d21f0a"}, + {file = "fastjsonschema-2.20.0.tar.gz", hash = "sha256:3d48fc5300ee96f5d116f10fe6f28d938e6008f59a6a025c2649475b87f76a23"}, ] +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + [[package]] -name = "packaging" -version = "24.1" -description = "Core utilities for Python packages" +name = "fqdn" +version = "1.5.1" +description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" +optional = false +python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +files = [ + {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, + {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, +] + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "httpcore" +version = "1.0.5" +description = "A minimal low-level HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, - {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, + {file = "httpcore-1.0.5-py3-none-any.whl", hash = "sha256:421f18bac248b25d310f3cacd198d55b8e6125c107797b609ff9b7a6ba7991b5"}, + {file = "httpcore-1.0.5.tar.gz", hash = "sha256:34a38e2f9291467ee3b44e89dd52615370e152954ba21721378a87b2960f7a61"}, ] +[package.dependencies] +certifi = "*" +h11 = ">=0.13,<0.15" + +[package.extras] +asyncio = ["anyio (>=4.0,<5.0)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] +trio = ["trio (>=0.22.0,<0.26.0)"] + [[package]] -name = "pathspec" -version = "0.12.1" -description = "Utility library for gitignore style pattern matching of file paths." +name = "httpx" +version = "0.27.0" +description = "The next generation HTTP client." optional = false python-versions = ">=3.8" files = [ - {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, - {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, + {file = "httpx-0.27.0-py3-none-any.whl", hash = "sha256:71d5465162c13681bff01ad59b2cc68dd838ea1f10e51574bac27103f00c91a5"}, + {file = "httpx-0.27.0.tar.gz", hash = "sha256:a0cb88a46f32dc874e04ee956e4c2764aba2aa228f650b06788ba6bda2962ab5"}, ] +[package.dependencies] +anyio = "*" +certifi = "*" +httpcore = "==1.*" +idna = "*" +sniffio = "*" + +[package.extras] +brotli = ["brotli", "brotlicffi"] +cli = ["click (==8.*)", "pygments (==2.*)", "rich (>=10,<14)"] +http2 = ["h2 (>=3,<5)"] +socks = ["socksio (==1.*)"] + [[package]] -name = "pillow" -version = "10.4.0" -description = "Python Imaging Library (Fork)" +name = "idna" +version = "3.7" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] + +[[package]] +name = "importlib-metadata" +version = "8.2.0" +description = "Read metadata from Python packages" optional = false python-versions = ">=3.8" files = [ - {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, - {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, - {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, - {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, - {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, - {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, - {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, - {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, - {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, - {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, - {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, - {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, - {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, - {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, - {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, - {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, - {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, - {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, - {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, - {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, - {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, - {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, - {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, - {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, - {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, - {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, - {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, - {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, - {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, - {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, - {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, - {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, - {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, - {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, - {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, + {file = "importlib_metadata-8.2.0-py3-none-any.whl", hash = "sha256:11901fa0c2f97919b288679932bb64febaeacf289d18ac84dd68cb2e74213369"}, + {file = "importlib_metadata-8.2.0.tar.gz", hash = "sha256:72e8d4399996132204f9a16dcc751af254a48f8d1b20b9ff0f98d4a8f901e73d"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +test = ["flufl.flake8", "importlib-resources (>=1.3)", "jaraco.test (>=5.4)", "packaging", "pyfakefs", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy", "pytest-perf (>=0.9.2)", "pytest-ruff (>=0.2.1)"] + +[[package]] +name = "ipykernel" +version = "6.29.5" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.29.5-py3-none-any.whl", hash = "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5"}, + {file = "ipykernel-6.29.5.tar.gz", hash = "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=24" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.18.1" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.9" +files = [ + {file = "ipython-8.18.1-py3-none-any.whl", hash = "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397"}, + {file = "ipython-8.18.1.tar.gz", hash = "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +prompt-toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +all = ["black", "curio", "docrepr", "exceptiongroup", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "matplotlib", "pickleshare", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio (<0.22)", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.22)", "pandas", "pickleshare", "pytest (<7.1)", "pytest-asyncio (<0.22)", "testpath", "trio"] + +[[package]] +name = "ipywidgets" +version = "8.1.3" +description = "Jupyter interactive widgets" +optional = false +python-versions = ">=3.7" +files = [ + {file = "ipywidgets-8.1.3-py3-none-any.whl", hash = "sha256:efafd18f7a142248f7cb0ba890a68b96abd4d6e88ddbda483c9130d12667eaf2"}, + {file = "ipywidgets-8.1.3.tar.gz", hash = "sha256:f5f9eeaae082b1823ce9eac2575272952f40d748893972956dc09700a6392d9c"}, +] + +[package.dependencies] +comm = ">=0.1.3" +ipython = ">=6.1.0" +jupyterlab-widgets = ">=3.0.11,<3.1.0" +traitlets = ">=4.3.1" +widgetsnbextension = ">=4.0.11,<4.1.0" + +[package.extras] +test = ["ipykernel", "jsonschema", "pytest (>=3.6.0)", "pytest-cov", "pytz"] + +[[package]] +name = "isoduration" +version = "20.11.0" +description = "Operations with ISO 8601 durations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, + {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, +] + +[package.dependencies] +arrow = ">=0.15.0" + +[[package]] +name = "isort" +version = "5.13.2" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"}, + {file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"}, +] + +[package.extras] +colors = ["colorama (>=0.4.6)"] + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "json5" +version = "0.9.25" +description = "A Python implementation of the JSON5 data format." +optional = false +python-versions = ">=3.8" +files = [ + {file = "json5-0.9.25-py3-none-any.whl", hash = "sha256:34ed7d834b1341a86987ed52f3f76cd8ee184394906b6e22a1e0deb9ab294e8f"}, + {file = "json5-0.9.25.tar.gz", hash = "sha256:548e41b9be043f9426776f05df8635a00fe06104ea51ed24b67f908856e151ae"}, +] + +[[package]] +name = "jsonpointer" +version = "3.0.0" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jsonpointer-3.0.0-py2.py3-none-any.whl", hash = "sha256:13e088adc14fca8b6aa8177c044e12701e6ad4b28ff10e65f2267a90109c9942"}, + {file = "jsonpointer-3.0.0.tar.gz", hash = "sha256:2b2d729f2091522d61c3b31f82e11870f60b68f43fbc705cb76bf4b832af59ef"}, +] + +[[package]] +name = "jsonschema" +version = "4.23.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.23.0-py3-none-any.whl", hash = "sha256:fbadb6f8b144a8f8cf9f0b89ba94501d143e50411a1278633f56a7acf7fd5566"}, + {file = "jsonschema-4.23.0.tar.gz", hash = "sha256:d71497fef26351a33265337fa77ffeb82423f3ea21283cd9467bb03999266bc4"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} +rpds-py = ">=0.7.1" +uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +webcolors = {version = ">=24.6.0", optional = true, markers = "extra == \"format-nongpl\""} + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=24.6.0)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, +] + +[package.dependencies] +referencing = ">=0.31.0" + +[[package]] +name = "jupyter" +version = "1.0.0" +description = "Jupyter metapackage. Install all the Jupyter components in one go." +optional = false +python-versions = "*" +files = [ + {file = "jupyter-1.0.0-py2.py3-none-any.whl", hash = "sha256:5b290f93b98ffbc21c0c7e749f054b3267782166d72fa5e3ed1ed4eaf34a2b78"}, + {file = "jupyter-1.0.0.tar.gz", hash = "sha256:d9dc4b3318f310e34c82951ea5d6683f67bed7def4b259fafbfe4f1beb1d8e5f"}, + {file = "jupyter-1.0.0.zip", hash = "sha256:3e1f86076bbb7c8c207829390305a2b1fe836d471ed54be66a3b8c41e7f46cc7"}, +] + +[package.dependencies] +ipykernel = "*" +ipywidgets = "*" +jupyter-console = "*" +nbconvert = "*" +notebook = "*" +qtconsole = "*" + +[[package]] +name = "jupyter-client" +version = "8.6.2" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.2-py3-none-any.whl", hash = "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f"}, + {file = "jupyter_client-8.6.2.tar.gz", hash = "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-console" +version = "6.6.3" +description = "Jupyter terminal console" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyter_console-6.6.3-py3-none-any.whl", hash = "sha256:309d33409fcc92ffdad25f0bcdf9a4a9daa61b6f341177570fdac03de5352485"}, + {file = "jupyter_console-6.6.3.tar.gz", hash = "sha256:566a4bf31c87adbfadf22cdf846e3069b59a71ed5da71d6ba4d8aaad14a53539"}, +] + +[package.dependencies] +ipykernel = ">=6.14" +ipython = "*" +jupyter-client = ">=7.0.0" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +prompt-toolkit = ">=3.0.30" +pygments = "*" +pyzmq = ">=17" +traitlets = ">=5.4" + +[package.extras] +test = ["flaky", "pexpect", "pytest"] + +[[package]] +name = "jupyter-core" +version = "5.7.2" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest (<8)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyter-events" +version = "0.10.0" +description = "Jupyter Event System library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_events-0.10.0-py3-none-any.whl", hash = "sha256:4b72130875e59d57716d327ea70d3ebc3af1944d3717e5a498b8a06c6c159960"}, + {file = "jupyter_events-0.10.0.tar.gz", hash = "sha256:670b8229d3cc882ec782144ed22e0d29e1c2d639263f92ca8383e66682845e22"}, +] + +[package.dependencies] +jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} +python-json-logger = ">=2.0.4" +pyyaml = ">=5.3" +referencing = "*" +rfc3339-validator = "*" +rfc3986-validator = ">=0.1.1" +traitlets = ">=5.3" + +[package.extras] +cli = ["click", "rich"] +docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] +test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] + +[[package]] +name = "jupyter-lsp" +version = "2.2.5" +description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter-lsp-2.2.5.tar.gz", hash = "sha256:793147a05ad446f809fd53ef1cd19a9f5256fd0a2d6b7ce943a982cb4f545001"}, + {file = "jupyter_lsp-2.2.5-py3-none-any.whl", hash = "sha256:45fbddbd505f3fbfb0b6cb2f1bc5e15e83ab7c79cd6e89416b248cb3c00c11da"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter-server = ">=1.1.2" + +[[package]] +name = "jupyter-server" +version = "2.14.2" +description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server-2.14.2-py3-none-any.whl", hash = "sha256:47ff506127c2f7851a17bf4713434208fc490955d0e8632e95014a9a9afbeefd"}, + {file = "jupyter_server-2.14.2.tar.gz", hash = "sha256:66095021aa9638ced276c248b1d81862e4c50f292d575920bbe960de1c56b12b"}, +] + +[package.dependencies] +anyio = ">=3.1.0" +argon2-cffi = ">=21.1" +jinja2 = ">=3.0.3" +jupyter-client = ">=7.4.4" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +jupyter-events = ">=0.9.0" +jupyter-server-terminals = ">=0.4.4" +nbconvert = ">=6.4.4" +nbformat = ">=5.3.0" +overrides = ">=5.0" +packaging = ">=22.0" +prometheus-client = ">=0.9" +pywinpty = {version = ">=2.0.1", markers = "os_name == \"nt\""} +pyzmq = ">=24" +send2trash = ">=1.8.2" +terminado = ">=0.8.3" +tornado = ">=6.2.0" +traitlets = ">=5.6.0" +websocket-client = ">=1.7" + +[package.extras] +docs = ["ipykernel", "jinja2", "jupyter-client", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] +test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0,<9)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.7)", "pytest-timeout", "requests"] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.3" +description = "A Jupyter Server Extension Providing Terminals." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server_terminals-0.5.3-py3-none-any.whl", hash = "sha256:41ee0d7dc0ebf2809c668e0fc726dfaf258fcd3e769568996ca731b6194ae9aa"}, + {file = "jupyter_server_terminals-0.5.3.tar.gz", hash = "sha256:5ae0295167220e9ace0edcfdb212afd2b01ee8d179fe6f23c899590e9b8a5269"}, +] + +[package.dependencies] +pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} +terminado = ">=0.8.3" + +[package.extras] +docs = ["jinja2", "jupyter-server", "mistune (<4.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] +test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] + +[[package]] +name = "jupyterlab" +version = "4.2.4" +description = "JupyterLab computational environment" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab-4.2.4-py3-none-any.whl", hash = "sha256:807a7ec73637744f879e112060d4b9d9ebe028033b7a429b2d1f4fc523d00245"}, + {file = "jupyterlab-4.2.4.tar.gz", hash = "sha256:343a979fb9582fd08c8511823e320703281cd072a0049bcdafdc7afeda7f2537"}, +] + +[package.dependencies] +async-lru = ">=1.0.0" +httpx = ">=0.25.0" +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +ipykernel = ">=6.5.0" +jinja2 = ">=3.0.3" +jupyter-core = "*" +jupyter-lsp = ">=2.0.0" +jupyter-server = ">=2.4.0,<3" +jupyterlab-server = ">=2.27.1,<3" +notebook-shim = ">=0.2" +packaging = "*" +setuptools = ">=40.1.0" +tomli = {version = ">=1.2.2", markers = "python_version < \"3.11\""} +tornado = ">=6.2.0" +traitlets = "*" + +[package.extras] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.3.5)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<7.3.0)", "sphinx-copybutton"] +docs-screenshots = ["altair (==5.3.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.2)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.1.post2)", "matplotlib (==3.8.3)", "nbconvert (>=7.0.0)", "pandas (==2.2.1)", "scipy (==1.12.0)", "vega-datasets (==0.9.0)"] +test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] +upgrade-extension = ["copier (>=9,<10)", "jinja2-time (<0.3)", "pydantic (<3.0)", "pyyaml-include (<3.0)", "tomli-w (<2.0)"] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +description = "Pygments theme using JupyterLab CSS variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, +] + +[[package]] +name = "jupyterlab-server" +version = "2.27.3" +description = "A set of server components for JupyterLab and JupyterLab like applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4"}, + {file = "jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4"}, +] + +[package.dependencies] +babel = ">=2.10" +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0.3" +json5 = ">=0.9.0" +jsonschema = ">=4.18.0" +jupyter-server = ">=1.21,<3" +packaging = ">=21.3" +requests = ">=2.31" + +[package.extras] +docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] +openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] +test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0,<8)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] + +[[package]] +name = "jupyterlab-widgets" +version = "3.0.11" +description = "Jupyter interactive widgets for JupyterLab" +optional = false +python-versions = ">=3.7" +files = [ + {file = "jupyterlab_widgets-3.0.11-py3-none-any.whl", hash = "sha256:78287fd86d20744ace330a61625024cf5521e1c012a352ddc0a3cdc2348becd0"}, + {file = "jupyterlab_widgets-3.0.11.tar.gz", hash = "sha256:dd5ac679593c969af29c9bed054c24f26842baa51352114736756bc035deee27"}, +] + +[[package]] +name = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mistune" +version = "3.0.2" +description = "A sane and fast Markdown parser with useful plugins and renderers" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, + {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, +] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "nbclient" +version = "0.10.0" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "nbclient-0.10.0-py3-none-any.whl", hash = "sha256:f13e3529332a1f1f81d82a53210322476a168bb7090a0289c795fe9cc11c9d3f"}, + {file = "nbclient-0.10.0.tar.gz", hash = "sha256:4b3f1b7dba531e498449c4db4f53da339c91d449dc11e9af3a43b4eb5c5abb09"}, +] + +[package.dependencies] +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +nbformat = ">=5.1" +traitlets = ">=5.4" + +[package.extras] +dev = ["pre-commit"] +docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] + +[[package]] +name = "nbconvert" +version = "7.16.4" +description = "Converting Jupyter Notebooks (.ipynb files) to other formats. Output formats include asciidoc, html, latex, markdown, pdf, py, rst, script. nbconvert can be used both as a Python library (`import nbconvert`) or as a command line tool (invoked as `jupyter nbconvert ...`)." +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbconvert-7.16.4-py3-none-any.whl", hash = "sha256:05873c620fe520b6322bf8a5ad562692343fe3452abda5765c7a34b7d1aa3eb3"}, + {file = "nbconvert-7.16.4.tar.gz", hash = "sha256:86ca91ba266b0a448dc96fa6c5b9d98affabde2867b363258703536807f9f7f4"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +bleach = "!=5.0.0" +defusedxml = "*" +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0" +jupyter-core = ">=4.7" +jupyterlab-pygments = "*" +markupsafe = ">=2.0" +mistune = ">=2.0.3,<4" +nbclient = ">=0.5.0" +nbformat = ">=5.7" +packaging = "*" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +tinycss2 = "*" +traitlets = ">=5.1" + +[package.extras] +all = ["flaky", "ipykernel", "ipython", "ipywidgets (>=7.5)", "myst-parser", "nbsphinx (>=0.2.12)", "playwright", "pydata-sphinx-theme", "pyqtwebengine (>=5.15)", "pytest (>=7)", "sphinx (==5.0.2)", "sphinxcontrib-spelling", "tornado (>=6.1)"] +docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] +qtpdf = ["pyqtwebengine (>=5.15)"] +qtpng = ["pyqtwebengine (>=5.15)"] +serve = ["tornado (>=6.1)"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest (>=7)"] +webpdf = ["playwright"] + +[[package]] +name = "nbformat" +version = "5.10.4" +description = "The Jupyter Notebook format" +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b"}, + {file = "nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a"}, +] + +[package.dependencies] +fastjsonschema = ">=2.15" +jsonschema = ">=2.6" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +traitlets = ">=5.1" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[package]] +name = "notebook" +version = "7.2.1" +description = "Jupyter Notebook - A web-based notebook environment for interactive computing" +optional = false +python-versions = ">=3.8" +files = [ + {file = "notebook-7.2.1-py3-none-any.whl", hash = "sha256:f45489a3995746f2195a137e0773e2130960b51c9ac3ce257dbc2705aab3a6ca"}, + {file = "notebook-7.2.1.tar.gz", hash = "sha256:4287b6da59740b32173d01d641f763d292f49c30e7a51b89c46ba8473126341e"}, +] + +[package.dependencies] +jupyter-server = ">=2.4.0,<3" +jupyterlab = ">=4.2.0,<4.3" +jupyterlab-server = ">=2.27.1,<3" +notebook-shim = ">=0.2,<0.3" +tornado = ">=6.2.0" + +[package.extras] +dev = ["hatch", "pre-commit"] +docs = ["myst-parser", "nbsphinx", "pydata-sphinx-theme", "sphinx (>=1.3.6)", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["importlib-resources (>=5.0)", "ipykernel", "jupyter-server[test] (>=2.4.0,<3)", "jupyterlab-server[test] (>=2.27.1,<3)", "nbval", "pytest (>=7.0)", "pytest-console-scripts", "pytest-timeout", "pytest-tornasync", "requests"] + +[[package]] +name = "notebook-shim" +version = "0.2.4" +description = "A shim layer for notebook traits and config" +optional = false +python-versions = ">=3.7" +files = [ + {file = "notebook_shim-0.2.4-py3-none-any.whl", hash = "sha256:411a5be4e9dc882a074ccbcae671eda64cceb068767e9a3419096986560e1cef"}, + {file = "notebook_shim-0.2.4.tar.gz", hash = "sha256:b4b2cfa1b65d98307ca24361f5b30fe785b53c3fd07b7a47e89acb5e6ac638cb"}, +] + +[package.dependencies] +jupyter-server = ">=1.8,<3" + +[package.extras] +test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] + +[[package]] +name = "overrides" +version = "7.7.0" +description = "A decorator to automatically detect mismatch when overriding a method." +optional = false +python-versions = ">=3.6" +files = [ + {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, + {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, +] + +[[package]] +name = "packaging" +version = "24.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "packaging-24.1-py3-none-any.whl", hash = "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124"}, + {file = "packaging-24.1.tar.gz", hash = "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002"}, +] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +description = "Utilities for writing pandoc filters in python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc"}, + {file = "pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e"}, +] + +[[package]] +name = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pillow" +version = "10.4.0" +description = "Python Imaging Library (Fork)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pillow-10.4.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e"}, + {file = "pillow-10.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b"}, + {file = "pillow-10.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e"}, + {file = "pillow-10.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46"}, + {file = "pillow-10.4.0-cp310-cp310-win32.whl", hash = "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984"}, + {file = "pillow-10.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141"}, + {file = "pillow-10.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c"}, + {file = "pillow-10.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe"}, + {file = "pillow-10.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d"}, + {file = "pillow-10.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696"}, + {file = "pillow-10.4.0-cp311-cp311-win32.whl", hash = "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496"}, + {file = "pillow-10.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91"}, + {file = "pillow-10.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94"}, + {file = "pillow-10.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef"}, + {file = "pillow-10.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b"}, + {file = "pillow-10.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9"}, + {file = "pillow-10.4.0-cp312-cp312-win32.whl", hash = "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42"}, + {file = "pillow-10.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a"}, + {file = "pillow-10.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3"}, + {file = "pillow-10.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0"}, + {file = "pillow-10.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a"}, + {file = "pillow-10.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309"}, + {file = "pillow-10.4.0-cp313-cp313-win32.whl", hash = "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060"}, + {file = "pillow-10.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea"}, + {file = "pillow-10.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736"}, + {file = "pillow-10.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b"}, + {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2"}, {file = "pillow-10.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680"}, {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b"}, {file = "pillow-10.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd"}, @@ -248,28 +1607,135 @@ files = [ ] [package.extras] -docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] -fpx = ["olefile"] -mic = ["olefile"] -tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] -typing = ["typing-extensions"] -xmp = ["defusedxml"] +docs = ["furo", "olefile", "sphinx (>=7.3)", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] +fpx = ["olefile"] +mic = ["olefile"] +tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] +typing = ["typing-extensions"] +xmp = ["defusedxml"] + +[[package]] +name = "platformdirs" +version = "4.2.2" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, + {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] + +[[package]] +name = "prometheus-client" +version = "0.20.0" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.8" +files = [ + {file = "prometheus_client-0.20.0-py3-none-any.whl", hash = "sha256:cde524a85bce83ca359cc837f28b8c0db5cac7aa653a588fd7e84ba061c329e7"}, + {file = "prometheus_client-0.20.0.tar.gz", hash = "sha256:287629d00b147a32dcb2be0b9df905da599b2d82f80377083ec8463309a4bb89"}, +] + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.47" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.47-py3-none-any.whl", hash = "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10"}, + {file = "prompt_toolkit-3.0.47.tar.gz", hash = "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "psutil" +version = "6.0.0" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "psutil-6.0.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0"}, + {file = "psutil-6.0.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3"}, + {file = "psutil-6.0.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c"}, + {file = "psutil-6.0.0-cp27-none-win32.whl", hash = "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35"}, + {file = "psutil-6.0.0-cp27-none-win_amd64.whl", hash = "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1"}, + {file = "psutil-6.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd"}, + {file = "psutil-6.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132"}, + {file = "psutil-6.0.0-cp36-cp36m-win32.whl", hash = "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14"}, + {file = "psutil-6.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c"}, + {file = "psutil-6.0.0-cp37-abi3-win32.whl", hash = "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d"}, + {file = "psutil-6.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3"}, + {file = "psutil-6.0.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0"}, + {file = "psutil-6.0.0.tar.gz", hash = "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0"}, + {file = "pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42"}, +] + +[package.extras] +tests = ["pytest"] [[package]] -name = "platformdirs" -version = "4.2.2" -description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." +name = "pycparser" +version = "2.22" +description = "C parser in Python" optional = false python-versions = ">=3.8" files = [ - {file = "platformdirs-4.2.2-py3-none-any.whl", hash = "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee"}, - {file = "platformdirs-4.2.2.tar.gz", hash = "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3"}, + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[package]] +name = "pygments" +version = "2.18.0" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pygments-2.18.0-py3-none-any.whl", hash = "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a"}, + {file = "pygments-2.18.0.tar.gz", hash = "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199"}, ] [package.extras] -docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] -type = ["mypy (>=1.8)"] +windows-terminal = ["colorama (>=0.4.6)"] [[package]] name = "pylint" @@ -301,6 +1767,590 @@ typing-extensions = {version = ">=3.10.0", markers = "python_version < \"3.10\"" spelling = ["pyenchant (>=3.2,<4.0)"] testutils = ["gitpython (>3)"] +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-json-logger" +version = "2.0.7" +description = "A python library adding a json log formatter" +optional = false +python-versions = ">=3.6" +files = [ + {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, + {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, +] + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pywinpty" +version = "2.0.13" +description = "Pseudo terminal support for Windows from Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pywinpty-2.0.13-cp310-none-win_amd64.whl", hash = "sha256:697bff211fb5a6508fee2dc6ff174ce03f34a9a233df9d8b5fe9c8ce4d5eaf56"}, + {file = "pywinpty-2.0.13-cp311-none-win_amd64.whl", hash = "sha256:b96fb14698db1284db84ca38c79f15b4cfdc3172065b5137383910567591fa99"}, + {file = "pywinpty-2.0.13-cp312-none-win_amd64.whl", hash = "sha256:2fd876b82ca750bb1333236ce98488c1be96b08f4f7647cfdf4129dfad83c2d4"}, + {file = "pywinpty-2.0.13-cp38-none-win_amd64.whl", hash = "sha256:61d420c2116c0212808d31625611b51caf621fe67f8a6377e2e8b617ea1c1f7d"}, + {file = "pywinpty-2.0.13-cp39-none-win_amd64.whl", hash = "sha256:71cb613a9ee24174730ac7ae439fd179ca34ccb8c5349e8d7b72ab5dea2c6f4b"}, + {file = "pywinpty-2.0.13.tar.gz", hash = "sha256:c34e32351a3313ddd0d7da23d27f835c860d32fe4ac814d372a3ea9594f41dde"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.2" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, + {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, + {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, + {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, + {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, + {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, + {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, + {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, + {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, + {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, + {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, + {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, + {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, + {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, + {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, + {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, + {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, + {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, + {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, + {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, + {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, + {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, + {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, + {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, + {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, + {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, + {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, + {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, + {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, + {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, + {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, + {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, +] + +[[package]] +name = "pyzmq" +version = "26.1.0" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyzmq-26.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:263cf1e36862310bf5becfbc488e18d5d698941858860c5a8c079d1511b3b18e"}, + {file = "pyzmq-26.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d5c8b17f6e8f29138678834cf8518049e740385eb2dbf736e8f07fc6587ec682"}, + {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75a95c2358fcfdef3374cb8baf57f1064d73246d55e41683aaffb6cfe6862917"}, + {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f99de52b8fbdb2a8f5301ae5fc0f9e6b3ba30d1d5fc0421956967edcc6914242"}, + {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bcbfbab4e1895d58ab7da1b5ce9a327764f0366911ba5b95406c9104bceacb0"}, + {file = "pyzmq-26.1.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:77ce6a332c7e362cb59b63f5edf730e83590d0ab4e59c2aa5bd79419a42e3449"}, + {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ba0a31d00e8616149a5ab440d058ec2da621e05d744914774c4dde6837e1f545"}, + {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8b88641384e84a258b740801cd4dbc45c75f148ee674bec3149999adda4a8598"}, + {file = "pyzmq-26.1.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2fa76ebcebe555cce90f16246edc3ad83ab65bb7b3d4ce408cf6bc67740c4f88"}, + {file = "pyzmq-26.1.0-cp310-cp310-win32.whl", hash = "sha256:fbf558551cf415586e91160d69ca6416f3fce0b86175b64e4293644a7416b81b"}, + {file = "pyzmq-26.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:a7b8aab50e5a288c9724d260feae25eda69582be84e97c012c80e1a5e7e03fb2"}, + {file = "pyzmq-26.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:08f74904cb066e1178c1ec706dfdb5c6c680cd7a8ed9efebeac923d84c1f13b1"}, + {file = "pyzmq-26.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:46d6800b45015f96b9d92ece229d92f2aef137d82906577d55fadeb9cf5fcb71"}, + {file = "pyzmq-26.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5bc2431167adc50ba42ea3e5e5f5cd70d93e18ab7b2f95e724dd8e1bd2c38120"}, + {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3bb34bebaa1b78e562931a1687ff663d298013f78f972a534f36c523311a84d"}, + {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd3f6329340cef1c7ba9611bd038f2d523cea79f09f9c8f6b0553caba59ec562"}, + {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:471880c4c14e5a056a96cd224f5e71211997d40b4bf5e9fdded55dafab1f98f2"}, + {file = "pyzmq-26.1.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ce6f2b66799971cbae5d6547acefa7231458289e0ad481d0be0740535da38d8b"}, + {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0a1f6ea5b1d6cdbb8cfa0536f0d470f12b4b41ad83625012e575f0e3ecfe97f0"}, + {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b45e6445ac95ecb7d728604bae6538f40ccf4449b132b5428c09918523abc96d"}, + {file = "pyzmq-26.1.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:94c4262626424683feea0f3c34951d39d49d354722db2745c42aa6bb50ecd93b"}, + {file = "pyzmq-26.1.0-cp311-cp311-win32.whl", hash = "sha256:a0f0ab9df66eb34d58205913f4540e2ad17a175b05d81b0b7197bc57d000e829"}, + {file = "pyzmq-26.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:8efb782f5a6c450589dbab4cb0f66f3a9026286333fe8f3a084399149af52f29"}, + {file = "pyzmq-26.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:f133d05aaf623519f45e16ab77526e1e70d4e1308e084c2fb4cedb1a0c764bbb"}, + {file = "pyzmq-26.1.0-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:3d3146b1c3dcc8a1539e7cc094700b2be1e605a76f7c8f0979b6d3bde5ad4072"}, + {file = "pyzmq-26.1.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:d9270fbf038bf34ffca4855bcda6e082e2c7f906b9eb8d9a8ce82691166060f7"}, + {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:995301f6740a421afc863a713fe62c0aaf564708d4aa057dfdf0f0f56525294b"}, + {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7eca8b89e56fb8c6c26dd3e09bd41b24789022acf1cf13358e96f1cafd8cae3"}, + {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d4feb2e83dfe9ace6374a847e98ee9d1246ebadcc0cb765482e272c34e5820"}, + {file = "pyzmq-26.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:d4fafc2eb5d83f4647331267808c7e0c5722c25a729a614dc2b90479cafa78bd"}, + {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:58c33dc0e185dd97a9ac0288b3188d1be12b756eda67490e6ed6a75cf9491d79"}, + {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:68a0a1d83d33d8367ddddb3e6bb4afbb0f92bd1dac2c72cd5e5ddc86bdafd3eb"}, + {file = "pyzmq-26.1.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2ae7c57e22ad881af78075e0cea10a4c778e67234adc65c404391b417a4dda83"}, + {file = "pyzmq-26.1.0-cp312-cp312-win32.whl", hash = "sha256:347e84fc88cc4cb646597f6d3a7ea0998f887ee8dc31c08587e9c3fd7b5ccef3"}, + {file = "pyzmq-26.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:9f136a6e964830230912f75b5a116a21fe8e34128dcfd82285aa0ef07cb2c7bd"}, + {file = "pyzmq-26.1.0-cp312-cp312-win_arm64.whl", hash = "sha256:a4b7a989c8f5a72ab1b2bbfa58105578753ae77b71ba33e7383a31ff75a504c4"}, + {file = "pyzmq-26.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d416f2088ac8f12daacffbc2e8918ef4d6be8568e9d7155c83b7cebed49d2322"}, + {file = "pyzmq-26.1.0-cp313-cp313-macosx_10_15_universal2.whl", hash = "sha256:ecb6c88d7946166d783a635efc89f9a1ff11c33d680a20df9657b6902a1d133b"}, + {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:471312a7375571857a089342beccc1a63584315188560c7c0da7e0a23afd8a5c"}, + {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e6cea102ffa16b737d11932c426f1dc14b5938cf7bc12e17269559c458ac334"}, + {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec7248673ffc7104b54e4957cee38b2f3075a13442348c8d651777bf41aa45ee"}, + {file = "pyzmq-26.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:0614aed6f87d550b5cecb03d795f4ddbb1544b78d02a4bd5eecf644ec98a39f6"}, + {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:e8746ce968be22a8a1801bf4a23e565f9687088580c3ed07af5846580dd97f76"}, + {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:7688653574392d2eaeef75ddcd0b2de5b232d8730af29af56c5adf1df9ef8d6f"}, + {file = "pyzmq-26.1.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:8d4dac7d97f15c653a5fedcafa82626bd6cee1450ccdaf84ffed7ea14f2b07a4"}, + {file = "pyzmq-26.1.0-cp313-cp313-win32.whl", hash = "sha256:ccb42ca0a4a46232d716779421bbebbcad23c08d37c980f02cc3a6bd115ad277"}, + {file = "pyzmq-26.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:e1e5d0a25aea8b691a00d6b54b28ac514c8cc0d8646d05f7ca6cb64b97358250"}, + {file = "pyzmq-26.1.0-cp313-cp313-win_arm64.whl", hash = "sha256:fc82269d24860cfa859b676d18850cbb8e312dcd7eada09e7d5b007e2f3d9eb1"}, + {file = "pyzmq-26.1.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:416ac51cabd54f587995c2b05421324700b22e98d3d0aa2cfaec985524d16f1d"}, + {file = "pyzmq-26.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:ff832cce719edd11266ca32bc74a626b814fff236824aa1aeaad399b69fe6eae"}, + {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:393daac1bcf81b2a23e696b7b638eedc965e9e3d2112961a072b6cd8179ad2eb"}, + {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9869fa984c8670c8ab899a719eb7b516860a29bc26300a84d24d8c1b71eae3ec"}, + {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b3b8e36fd4c32c0825b4461372949ecd1585d326802b1321f8b6dc1d7e9318c"}, + {file = "pyzmq-26.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3ee647d84b83509b7271457bb428cc347037f437ead4b0b6e43b5eba35fec0aa"}, + {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_aarch64.whl", hash = "sha256:45cb1a70eb00405ce3893041099655265fabcd9c4e1e50c330026e82257892c1"}, + {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_i686.whl", hash = "sha256:5cca7b4adb86d7470e0fc96037771981d740f0b4cb99776d5cb59cd0e6684a73"}, + {file = "pyzmq-26.1.0-cp313-cp313t-musllinux_1_1_x86_64.whl", hash = "sha256:91d1a20bdaf3b25f3173ff44e54b1cfbc05f94c9e8133314eb2962a89e05d6e3"}, + {file = "pyzmq-26.1.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c0665d85535192098420428c779361b8823d3d7ec4848c6af3abb93bc5c915bf"}, + {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:96d7c1d35ee4a495df56c50c83df7af1c9688cce2e9e0edffdbf50889c167595"}, + {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b281b5ff5fcc9dcbfe941ac5c7fcd4b6c065adad12d850f95c9d6f23c2652384"}, + {file = "pyzmq-26.1.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5384c527a9a004445c5074f1e20db83086c8ff1682a626676229aafd9cf9f7d1"}, + {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:754c99a9840839375ee251b38ac5964c0f369306eddb56804a073b6efdc0cd88"}, + {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9bdfcb74b469b592972ed881bad57d22e2c0acc89f5e8c146782d0d90fb9f4bf"}, + {file = "pyzmq-26.1.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bd13f0231f4788db619347b971ca5f319c5b7ebee151afc7c14632068c6261d3"}, + {file = "pyzmq-26.1.0-cp37-cp37m-win32.whl", hash = "sha256:c5668dac86a869349828db5fc928ee3f58d450dce2c85607067d581f745e4fb1"}, + {file = "pyzmq-26.1.0-cp37-cp37m-win_amd64.whl", hash = "sha256:ad875277844cfaeca7fe299ddf8c8d8bfe271c3dc1caf14d454faa5cdbf2fa7a"}, + {file = "pyzmq-26.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:65c6e03cc0222eaf6aad57ff4ecc0a070451e23232bb48db4322cc45602cede0"}, + {file = "pyzmq-26.1.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:038ae4ffb63e3991f386e7fda85a9baab7d6617fe85b74a8f9cab190d73adb2b"}, + {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:bdeb2c61611293f64ac1073f4bf6723b67d291905308a7de9bb2ca87464e3273"}, + {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:61dfa5ee9d7df297c859ac82b1226d8fefaf9c5113dc25c2c00ecad6feeeb04f"}, + {file = "pyzmq-26.1.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3292d384537b9918010769b82ab3e79fca8b23d74f56fc69a679106a3e2c2cf"}, + {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:f9499c70c19ff0fbe1007043acb5ad15c1dec7d8e84ab429bca8c87138e8f85c"}, + {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d3dd5523ed258ad58fed7e364c92a9360d1af8a9371e0822bd0146bdf017ef4c"}, + {file = "pyzmq-26.1.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baba2fd199b098c5544ef2536b2499d2e2155392973ad32687024bd8572a7d1c"}, + {file = "pyzmq-26.1.0-cp38-cp38-win32.whl", hash = "sha256:ddbb2b386128d8eca92bd9ca74e80f73fe263bcca7aa419f5b4cbc1661e19741"}, + {file = "pyzmq-26.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:79e45a4096ec8388cdeb04a9fa5e9371583bcb826964d55b8b66cbffe7b33c86"}, + {file = "pyzmq-26.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:add52c78a12196bc0fda2de087ba6c876ea677cbda2e3eba63546b26e8bf177b"}, + {file = "pyzmq-26.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:98c03bd7f3339ff47de7ea9ac94a2b34580a8d4df69b50128bb6669e1191a895"}, + {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dcc37d9d708784726fafc9c5e1232de655a009dbf97946f117aefa38d5985a0f"}, + {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5a6ed52f0b9bf8dcc64cc82cce0607a3dfed1dbb7e8c6f282adfccc7be9781de"}, + {file = "pyzmq-26.1.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:451e16ae8bea3d95649317b463c9f95cd9022641ec884e3d63fc67841ae86dfe"}, + {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:906e532c814e1d579138177a00ae835cd6becbf104d45ed9093a3aaf658f6a6a"}, + {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:05bacc4f94af468cc82808ae3293390278d5f3375bb20fef21e2034bb9a505b6"}, + {file = "pyzmq-26.1.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:57bb2acba798dc3740e913ffadd56b1fcef96f111e66f09e2a8db3050f1f12c8"}, + {file = "pyzmq-26.1.0-cp39-cp39-win32.whl", hash = "sha256:f774841bb0e8588505002962c02da420bcfb4c5056e87a139c6e45e745c0e2e2"}, + {file = "pyzmq-26.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:359c533bedc62c56415a1f5fcfd8279bc93453afdb0803307375ecf81c962402"}, + {file = "pyzmq-26.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:7907419d150b19962138ecec81a17d4892ea440c184949dc29b358bc730caf69"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b24079a14c9596846bf7516fe75d1e2188d4a528364494859106a33d8b48be38"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59d0acd2976e1064f1b398a00e2c3e77ed0a157529779e23087d4c2fb8aaa416"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:911c43a4117915203c4cc8755e0f888e16c4676a82f61caee2f21b0c00e5b894"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b10163e586cc609f5f85c9b233195554d77b1e9a0801388907441aaeb22841c5"}, + {file = "pyzmq-26.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:28a8b2abb76042f5fd7bd720f7fea48c0fd3e82e9de0a1bf2c0de3812ce44a42"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bef24d3e4ae2c985034439f449e3f9e06bf579974ce0e53d8a507a1577d5b2ab"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2cd0f4d314f4a2518e8970b6f299ae18cff7c44d4a1fc06fc713f791c3a9e3ea"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fa25a620eed2a419acc2cf10135b995f8f0ce78ad00534d729aa761e4adcef8a"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef3b048822dca6d231d8a8ba21069844ae38f5d83889b9b690bf17d2acc7d099"}, + {file = "pyzmq-26.1.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:9a6847c92d9851b59b9f33f968c68e9e441f9a0f8fc972c5580c5cd7cbc6ee24"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9b9305004d7e4e6a824f4f19b6d8f32b3578aad6f19fc1122aaf320cbe3dc83"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:63c1d3a65acb2f9c92dce03c4e1758cc552f1ae5c78d79a44e3bb88d2fa71f3a"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d36b8fffe8b248a1b961c86fbdfa0129dfce878731d169ede7fa2631447331be"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67976d12ebfd61a3bc7d77b71a9589b4d61d0422282596cf58c62c3866916544"}, + {file = "pyzmq-26.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:998444debc8816b5d8d15f966e42751032d0f4c55300c48cc337f2b3e4f17d03"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e5c88b2f13bcf55fee78ea83567b9fe079ba1a4bef8b35c376043440040f7edb"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d906d43e1592be4b25a587b7d96527cb67277542a5611e8ea9e996182fae410"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:80b0c9942430d731c786545da6be96d824a41a51742e3e374fedd9018ea43106"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:314d11564c00b77f6224d12eb3ddebe926c301e86b648a1835c5b28176c83eab"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:093a1a3cae2496233f14b57f4b485da01b4ff764582c854c0f42c6dd2be37f3d"}, + {file = "pyzmq-26.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3c397b1b450f749a7e974d74c06d69bd22dd362142f370ef2bd32a684d6b480c"}, + {file = "pyzmq-26.1.0.tar.gz", hash = "sha256:6c5aeea71f018ebd3b9115c7cb13863dd850e98ca6b9258509de1246461a7e7f"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "qtconsole" +version = "5.5.2" +description = "Jupyter Qt console" +optional = false +python-versions = ">=3.8" +files = [ + {file = "qtconsole-5.5.2-py3-none-any.whl", hash = "sha256:42d745f3d05d36240244a04e1e1ec2a86d5d9b6edb16dbdef582ccb629e87e0b"}, + {file = "qtconsole-5.5.2.tar.gz", hash = "sha256:6b5fb11274b297463706af84dcbbd5c92273b1f619e6d25d08874b0a88516989"}, +] + +[package.dependencies] +ipykernel = ">=4.1" +jupyter-client = ">=4.1" +jupyter-core = "*" +packaging = "*" +pygments = "*" +pyzmq = ">=17.1" +qtpy = ">=2.4.0" +traitlets = "<5.2.1 || >5.2.1,<5.2.2 || >5.2.2" + +[package.extras] +doc = ["Sphinx (>=1.3)"] +test = ["flaky", "pytest", "pytest-qt"] + +[[package]] +name = "qtpy" +version = "2.4.1" +description = "Provides an abstraction layer on top of the various Qt bindings (PyQt5/6 and PySide2/6)." +optional = false +python-versions = ">=3.7" +files = [ + {file = "QtPy-2.4.1-py3-none-any.whl", hash = "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b"}, + {file = "QtPy-2.4.1.tar.gz", hash = "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987"}, +] + +[package.dependencies] +packaging = "*" + +[package.extras] +test = ["pytest (>=6,!=7.0.0,!=7.0.1)", "pytest-cov (>=3.0.0)", "pytest-qt"] + +[[package]] +name = "referencing" +version = "0.35.1" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.35.1-py3-none-any.whl", hash = "sha256:eda6d3234d62814d1c64e305c1331c9a3a6132da475ab6382eaa997b21ee75de"}, + {file = "referencing-0.35.1.tar.gz", hash = "sha256:25b42124a6c8b632a425174f24087783efb348a6f1e0008e63cd4466fedf703c"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + +[[package]] +name = "requests" +version = "2.32.3" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.8" +files = [ + {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"}, + {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +description = "A pure python RFC3339 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, + {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +description = "Pure python rfc3986 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, + {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, +] + +[[package]] +name = "rpds-py" +version = "0.20.0" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.20.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3ad0fda1635f8439cde85c700f964b23ed5fc2d28016b32b9ee5fe30da5c84e2"}, + {file = "rpds_py-0.20.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9bb4a0d90fdb03437c109a17eade42dfbf6190408f29b2744114d11586611d6f"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6377e647bbfd0a0b159fe557f2c6c602c159fc752fa316572f012fc0bf67150"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:eb851b7df9dda52dc1415ebee12362047ce771fc36914586b2e9fcbd7d293b3e"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e0f80b739e5a8f54837be5d5c924483996b603d5502bfff79bf33da06164ee2"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5a8c94dad2e45324fc74dce25e1645d4d14df9a4e54a30fa0ae8bad9a63928e3"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8e604fe73ba048c06085beaf51147eaec7df856824bfe7b98657cf436623daf"}, + {file = "rpds_py-0.20.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:df3de6b7726b52966edf29663e57306b23ef775faf0ac01a3e9f4012a24a4140"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf258ede5bc22a45c8e726b29835b9303c285ab46fc7c3a4cc770736b5304c9f"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:55fea87029cded5df854ca7e192ec7bdb7ecd1d9a3f63d5c4eb09148acf4a7ce"}, + {file = "rpds_py-0.20.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ae94bd0b2f02c28e199e9bc51485d0c5601f58780636185660f86bf80c89af94"}, + {file = "rpds_py-0.20.0-cp310-none-win32.whl", hash = "sha256:28527c685f237c05445efec62426d285e47a58fb05ba0090a4340b73ecda6dee"}, + {file = "rpds_py-0.20.0-cp310-none-win_amd64.whl", hash = "sha256:238a2d5b1cad28cdc6ed15faf93a998336eb041c4e440dd7f902528b8891b399"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:ac2f4f7a98934c2ed6505aead07b979e6f999389f16b714448fb39bbaa86a489"}, + {file = "rpds_py-0.20.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:220002c1b846db9afd83371d08d239fdc865e8f8c5795bbaec20916a76db3318"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8d7919548df3f25374a1f5d01fbcd38dacab338ef5f33e044744b5c36729c8db"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:758406267907b3781beee0f0edfe4a179fbd97c0be2e9b1154d7f0a1279cf8e5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d61339e9f84a3f0767b1995adfb171a0d00a1185192718a17af6e124728e0f5"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1259c7b3705ac0a0bd38197565a5d603218591d3f6cee6e614e380b6ba61c6f6"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c1dc0f53856b9cc9a0ccca0a7cc61d3d20a7088201c0937f3f4048c1718a209"}, + {file = "rpds_py-0.20.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7e60cb630f674a31f0368ed32b2a6b4331b8350d67de53c0359992444b116dd3"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dbe982f38565bb50cb7fb061ebf762c2f254ca3d8c20d4006878766e84266272"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:514b3293b64187172bc77c8fb0cdae26981618021053b30d8371c3a902d4d5ad"}, + {file = "rpds_py-0.20.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d0a26ffe9d4dd35e4dfdd1e71f46401cff0181c75ac174711ccff0459135fa58"}, + {file = "rpds_py-0.20.0-cp311-none-win32.whl", hash = "sha256:89c19a494bf3ad08c1da49445cc5d13d8fefc265f48ee7e7556839acdacf69d0"}, + {file = "rpds_py-0.20.0-cp311-none-win_amd64.whl", hash = "sha256:c638144ce971df84650d3ed0096e2ae7af8e62ecbbb7b201c8935c370df00a2c"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a84ab91cbe7aab97f7446652d0ed37d35b68a465aeef8fc41932a9d7eee2c1a6"}, + {file = "rpds_py-0.20.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:56e27147a5a4c2c21633ff8475d185734c0e4befd1c989b5b95a5d0db699b21b"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2580b0c34583b85efec8c5c5ec9edf2dfe817330cc882ee972ae650e7b5ef739"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b80d4a7900cf6b66bb9cee5c352b2d708e29e5a37fe9bf784fa97fc11504bf6c"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50eccbf054e62a7b2209b28dc7a22d6254860209d6753e6b78cfaeb0075d7bee"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:49a8063ea4296b3a7e81a5dfb8f7b2d73f0b1c20c2af401fb0cdf22e14711a96"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ea438162a9fcbee3ecf36c23e6c68237479f89f962f82dae83dc15feeceb37e4"}, + {file = "rpds_py-0.20.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:18d7585c463087bddcfa74c2ba267339f14f2515158ac4db30b1f9cbdb62c8ef"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d4c7d1a051eeb39f5c9547e82ea27cbcc28338482242e3e0b7768033cb083821"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e4df1e3b3bec320790f699890d41c59d250f6beda159ea3c44c3f5bac1976940"}, + {file = "rpds_py-0.20.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2cf126d33a91ee6eedc7f3197b53e87a2acdac63602c0f03a02dd69e4b138174"}, + {file = "rpds_py-0.20.0-cp312-none-win32.whl", hash = "sha256:8bc7690f7caee50b04a79bf017a8d020c1f48c2a1077ffe172abec59870f1139"}, + {file = "rpds_py-0.20.0-cp312-none-win_amd64.whl", hash = "sha256:0e13e6952ef264c40587d510ad676a988df19adea20444c2b295e536457bc585"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:aa9a0521aeca7d4941499a73ad7d4f8ffa3d1affc50b9ea11d992cd7eff18a29"}, + {file = "rpds_py-0.20.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4a1f1d51eccb7e6c32ae89243cb352389228ea62f89cd80823ea7dd1b98e0b91"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a86a9b96070674fc88b6f9f71a97d2c1d3e5165574615d1f9168ecba4cecb24"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6c8ef2ebf76df43f5750b46851ed1cdf8f109d7787ca40035fe19fbdc1acc5a7"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b74b25f024b421d5859d156750ea9a65651793d51b76a2e9238c05c9d5f203a9"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:57eb94a8c16ab08fef6404301c38318e2c5a32216bf5de453e2714c964c125c8"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1940dae14e715e2e02dfd5b0f64a52e8374a517a1e531ad9412319dc3ac7879"}, + {file = "rpds_py-0.20.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d20277fd62e1b992a50c43f13fbe13277a31f8c9f70d59759c88f644d66c619f"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:06db23d43f26478303e954c34c75182356ca9aa7797d22c5345b16871ab9c45c"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b2a5db5397d82fa847e4c624b0c98fe59d2d9b7cf0ce6de09e4d2e80f8f5b3f2"}, + {file = "rpds_py-0.20.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5a35df9f5548fd79cb2f52d27182108c3e6641a4feb0f39067911bf2adaa3e57"}, + {file = "rpds_py-0.20.0-cp313-none-win32.whl", hash = "sha256:fd2d84f40633bc475ef2d5490b9c19543fbf18596dcb1b291e3a12ea5d722f7a"}, + {file = "rpds_py-0.20.0-cp313-none-win_amd64.whl", hash = "sha256:9bc2d153989e3216b0559251b0c260cfd168ec78b1fac33dd485750a228db5a2"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:f2fbf7db2012d4876fb0d66b5b9ba6591197b0f165db8d99371d976546472a24"}, + {file = "rpds_py-0.20.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1e5f3cd7397c8f86c8cc72d5a791071431c108edd79872cdd96e00abd8497d29"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce9845054c13696f7af7f2b353e6b4f676dab1b4b215d7fe5e05c6f8bb06f965"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c3e130fd0ec56cb76eb49ef52faead8ff09d13f4527e9b0c400307ff72b408e1"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4b16aa0107ecb512b568244ef461f27697164d9a68d8b35090e9b0c1c8b27752"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa7f429242aae2947246587d2964fad750b79e8c233a2367f71b554e9447949c"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:af0fc424a5842a11e28956e69395fbbeab2c97c42253169d87e90aac2886d751"}, + {file = "rpds_py-0.20.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b8c00a3b1e70c1d3891f0db1b05292747f0dbcfb49c43f9244d04c70fbc40eb8"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:40ce74fc86ee4645d0a225498d091d8bc61f39b709ebef8204cb8b5a464d3c0e"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:4fe84294c7019456e56d93e8ababdad5a329cd25975be749c3f5f558abb48253"}, + {file = "rpds_py-0.20.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:338ca4539aad4ce70a656e5187a3a31c5204f261aef9f6ab50e50bcdffaf050a"}, + {file = "rpds_py-0.20.0-cp38-none-win32.whl", hash = "sha256:54b43a2b07db18314669092bb2de584524d1ef414588780261e31e85846c26a5"}, + {file = "rpds_py-0.20.0-cp38-none-win_amd64.whl", hash = "sha256:a1862d2d7ce1674cffa6d186d53ca95c6e17ed2b06b3f4c476173565c862d232"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:3fde368e9140312b6e8b6c09fb9f8c8c2f00999d1823403ae90cc00480221b22"}, + {file = "rpds_py-0.20.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9824fb430c9cf9af743cf7aaf6707bf14323fb51ee74425c380f4c846ea70789"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:11ef6ce74616342888b69878d45e9f779b95d4bd48b382a229fe624a409b72c5"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c52d3f2f82b763a24ef52f5d24358553e8403ce05f893b5347098014f2d9eff2"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d35cef91e59ebbeaa45214861874bc6f19eb35de96db73e467a8358d701a96c"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d72278a30111e5b5525c1dd96120d9e958464316f55adb030433ea905866f4de"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4c29cbbba378759ac5786730d1c3cb4ec6f8ababf5c42a9ce303dc4b3d08cda"}, + {file = "rpds_py-0.20.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6632f2d04f15d1bd6fe0eedd3b86d9061b836ddca4c03d5cf5c7e9e6b7c14580"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d0b67d87bb45ed1cd020e8fbf2307d449b68abc45402fe1a4ac9e46c3c8b192b"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ec31a99ca63bf3cd7f1a5ac9fe95c5e2d060d3c768a09bc1d16e235840861420"}, + {file = "rpds_py-0.20.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e6c9976e38f4d8c4a63bd8a8edac5307dffd3ee7e6026d97f3cc3a2dc02a0b"}, + {file = "rpds_py-0.20.0-cp39-none-win32.whl", hash = "sha256:569b3ea770c2717b730b61998b6c54996adee3cef69fc28d444f3e7920313cf7"}, + {file = "rpds_py-0.20.0-cp39-none-win_amd64.whl", hash = "sha256:e6900ecdd50ce0facf703f7a00df12374b74bbc8ad9fe0f6559947fb20f82364"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:617c7357272c67696fd052811e352ac54ed1d9b49ab370261a80d3b6ce385045"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9426133526f69fcaba6e42146b4e12d6bc6c839b8b555097020e2b78ce908dcc"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:deb62214c42a261cb3eb04d474f7155279c1a8a8c30ac89b7dcb1721d92c3c02"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fcaeb7b57f1a1e071ebd748984359fef83ecb026325b9d4ca847c95bc7311c92"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d454b8749b4bd70dd0a79f428731ee263fa6995f83ccb8bada706e8d1d3ff89d"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d807dc2051abe041b6649681dce568f8e10668e3c1c6543ebae58f2d7e617855"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c3c20f0ddeb6e29126d45f89206b8291352b8c5b44384e78a6499d68b52ae511"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b7f19250ceef892adf27f0399b9e5afad019288e9be756d6919cb58892129f51"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4f1ed4749a08379555cebf4650453f14452eaa9c43d0a95c49db50c18b7da075"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:dcedf0b42bcb4cfff4101d7771a10532415a6106062f005ab97d1d0ab5681c60"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:39ed0d010457a78f54090fafb5d108501b5aa5604cc22408fc1c0c77eac14344"}, + {file = "rpds_py-0.20.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:bb273176be34a746bdac0b0d7e4e2c467323d13640b736c4c477881a3220a989"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f918a1a130a6dfe1d7fe0f105064141342e7dd1611f2e6a21cd2f5c8cb1cfb3e"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:f60012a73aa396be721558caa3a6fd49b3dd0033d1675c6d59c4502e870fcf0c"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3d2b1ad682a3dfda2a4e8ad8572f3100f95fad98cb99faf37ff0ddfe9cbf9d03"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:614fdafe9f5f19c63ea02817fa4861c606a59a604a77c8cdef5aa01d28b97921"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fa518bcd7600c584bf42e6617ee8132869e877db2f76bcdc281ec6a4113a53ab"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0475242f447cc6cb8a9dd486d68b2ef7fbee84427124c232bff5f63b1fe11e5"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f90a4cd061914a60bd51c68bcb4357086991bd0bb93d8aa66a6da7701370708f"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:def7400461c3a3f26e49078302e1c1b38f6752342c77e3cf72ce91ca69fb1bc1"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:65794e4048ee837494aea3c21a28ad5fc080994dfba5b036cf84de37f7ad5074"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:faefcc78f53a88f3076b7f8be0a8f8d35133a3ecf7f3770895c25f8813460f08"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5b4f105deeffa28bbcdff6c49b34e74903139afa690e35d2d9e3c2c2fba18cec"}, + {file = "rpds_py-0.20.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:fdfc3a892927458d98f3d55428ae46b921d1f7543b89382fdb483f5640daaec8"}, + {file = "rpds_py-0.20.0.tar.gz", hash = "sha256:d72a210824facfdaf8768cf2d7ca25a042c30320b3020de2fa04640920d4e121"}, +] + +[[package]] +name = "send2trash" +version = "1.8.3" +description = "Send file to trash natively under Mac OS X, Windows and Linux" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +files = [ + {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, + {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, +] + +[package.extras] +nativelib = ["pyobjc-framework-Cocoa", "pywin32"] +objc = ["pyobjc-framework-Cocoa"] +win32 = ["pywin32"] + +[[package]] +name = "setuptools" +version = "72.1.0" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-72.1.0-py3-none-any.whl", hash = "sha256:5a03e1860cf56bb6ef48ce186b0e557fdba433237481a9a625176c2831be15d1"}, + {file = "setuptools-72.1.0.tar.gz", hash = "sha256:8d243eff56d095e5817f796ede6ae32941278f542e0f941867cc05ae52b162ec"}, +] + +[package.extras] +core = ["importlib-metadata (>=6)", "importlib-resources (>=5.10.2)", "jaraco.text (>=3.7)", "more-itertools (>=8.8)", "ordered-set (>=3.1.1)", "packaging (>=24)", "platformdirs (>=2.6.2)", "tomli (>=2.0.1)", "wheel (>=0.43.0)"] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "jaraco.test", "mypy (==1.11.*)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (<0.4)", "pytest-ruff (>=0.2.1)", "pytest-ruff (>=0.3.2)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, + {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, +] + +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "terminado" +version = "0.18.1" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "terminado-0.18.1-py3-none-any.whl", hash = "sha256:a4468e1b37bb318f8a86514f65814e1afc977cf29b3992a4500d9dd305dcceb0"}, + {file = "terminado-0.18.1.tar.gz", hash = "sha256:de09f2c4b85de4765f7714688fff57d3e75bad1f909b589fde880460c753fd2e"}, +] + +[package.dependencies] +ptyprocess = {version = "*", markers = "os_name != \"nt\""} +pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} +tornado = ">=6.1.0" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] +typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] + +[[package]] +name = "tinycss2" +version = "1.3.0" +description = "A tiny CSS parser" +optional = false +python-versions = ">=3.8" +files = [ + {file = "tinycss2-1.3.0-py3-none-any.whl", hash = "sha256:54a8dbdffb334d536851be0226030e9505965bb2f30f21a4a82c55fb2a80fae7"}, + {file = "tinycss2-1.3.0.tar.gz", hash = "sha256:152f9acabd296a8375fbca5b84c961ff95971fcfc32e79550c8df8e29118c54d"}, +] + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["pytest", "ruff"] + [[package]] name = "tomli" version = "2.0.1" @@ -323,6 +2373,52 @@ files = [ {file = "tomlkit-0.13.0.tar.gz", hash = "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72"}, ] +[[package]] +name = "tornado" +version = "6.4.1" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">=3.8" +files = [ + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8"}, + {file = "tornado-6.4.1-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842"}, + {file = "tornado-6.4.1-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4"}, + {file = "tornado-6.4.1-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698"}, + {file = "tornado-6.4.1-cp38-abi3-win32.whl", hash = "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d"}, + {file = "tornado-6.4.1-cp38-abi3-win_amd64.whl", hash = "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7"}, + {file = "tornado-6.4.1.tar.gz", hash = "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9"}, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "types-python-dateutil" +version = "2.9.0.20240316" +description = "Typing stubs for python-dateutil" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-python-dateutil-2.9.0.20240316.tar.gz", hash = "sha256:5d2f2e240b86905e40944dd787db6da9263f0deabef1076ddaed797351ec0202"}, + {file = "types_python_dateutil-2.9.0.20240316-py3-none-any.whl", hash = "sha256:6b8cb66d960771ce5ff974e9dd45e38facb81718cc1e208b10b1baccbfdbee3b"}, +] + [[package]] name = "typing-extensions" version = "4.12.2" @@ -334,7 +2430,117 @@ files = [ {file = "typing_extensions-4.12.2.tar.gz", hash = "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8"}, ] +[[package]] +name = "uri-template" +version = "1.3.0" +description = "RFC 6570 URI Template Processor" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, + {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, +] + +[package.extras] +dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] + +[[package]] +name = "urllib3" +version = "2.2.2" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.2-py3-none-any.whl", hash = "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472"}, + {file = "urllib3-2.2.2.tar.gz", hash = "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "webcolors" +version = "24.8.0" +description = "A library for working with the color formats defined by HTML and CSS." +optional = false +python-versions = ">=3.8" +files = [ + {file = "webcolors-24.8.0-py3-none-any.whl", hash = "sha256:fc4c3b59358ada164552084a8ebee637c221e4059267d0f8325b3b560f6c7f0a"}, + {file = "webcolors-24.8.0.tar.gz", hash = "sha256:08b07af286a01bcd30d583a7acadf629583d1f79bfef27dd2c2c5c263817277d"}, +] + +[package.extras] +docs = ["furo", "sphinx", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-notfound-page", "sphinxext-opengraph"] +tests = ["coverage[toml]"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "websocket-client" +version = "1.8.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, + {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + +[[package]] +name = "widgetsnbextension" +version = "4.0.11" +description = "Jupyter interactive widgets for Jupyter Notebook" +optional = false +python-versions = ">=3.7" +files = [ + {file = "widgetsnbextension-4.0.11-py3-none-any.whl", hash = "sha256:55d4d6949d100e0d08b94948a42efc3ed6dfdc0e9468b2c4b128c9a2ce3a7a36"}, + {file = "widgetsnbextension-4.0.11.tar.gz", hash = "sha256:8b22a8f1910bfd188e596fe7fc05dcbd87e810c8a4ba010bdb3da86637398474"}, +] + +[[package]] +name = "zipp" +version = "3.20.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.20.0-py3-none-any.whl", hash = "sha256:58da6168be89f0be59beb194da1250516fdaa062ccebd30127ac65d30045e10d"}, + {file = "zipp-3.20.0.tar.gz", hash = "sha256:0145e43d89664cfe1a2e533adc75adafed82fe2da404b4bbb6b026c0157bdb31"}, +] + +[package.extras] +doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-lint"] +test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", "jaraco.test", "more-itertools", "pytest (>=6,!=8.1.*)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy", "pytest-ruff (>=0.2.1)"] + [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "6d6c54ca1d900ac5d5216db246dbf03e74b976dc77f279e50f217c99ce181bd5" +content-hash = "97c391ad142e40a53b2cf4a89be811f7f91afd8eaf80415ad2291ed36abdf1ce" diff --git a/pyproject.toml b/pyproject.toml index c4a8358..8f89715 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,6 +13,7 @@ pillow = "^10.4.0" [tool.poetry.group.dev.dependencies] black = "^24.8.0" pylint = "^3.2.6" +jupyter = "^1.0.0" [build-system] requires = ["poetry-core"] diff --git a/wrdcld.ipynb b/wrdcld.ipynb index 48d319a..ff908fc 100644 --- a/wrdcld.ipynb +++ b/wrdcld.ipynb @@ -501,7 +501,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.4" + "version": "3.11.2" } }, "nbformat": 4, diff --git a/wrdcld/main.py b/wrdcld/main.py index 94c8701..9d06fad 100644 --- a/wrdcld/main.py +++ b/wrdcld/main.py @@ -49,7 +49,6 @@ def _fill( return text_rectangle - def fill_next_word(word, required_font_size, available_rectangles, img, canvas): font_path = get_default_font_path() font = ImageFont.truetype(font_path, required_font_size) From 9eafff9c28266f74a73c383e405e7b3b4fac54ed Mon Sep 17 00:00:00 2001 From: Jim Barrett Date: Tue, 13 Aug 2024 20:57:54 +0200 Subject: [PATCH 03/11] add the new space filling algo --- poetry.lock | 56 +++- pyproject.toml | 1 + space_filling_experiments.ipynb | 444 +++++++++++++------------------- wrdcld/__init__.py | 5 +- wrdcld/main.py | 10 +- wrdcld/rectangle.py | 188 ++++---------- 6 files changed, 292 insertions(+), 412 deletions(-) diff --git a/poetry.lock b/poetry.lock index fba1b9c..cde71b8 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1444,6 +1444,60 @@ jupyter-server = ">=1.8,<3" [package.extras] test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] +[[package]] +name = "numpy" +version = "2.0.1" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.9" +files = [ + {file = "numpy-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fbb536eac80e27a2793ffd787895242b7f18ef792563d742c2d673bfcb75134"}, + {file = "numpy-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69ff563d43c69b1baba77af455dd0a839df8d25e8590e79c90fcbe1499ebde42"}, + {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:1b902ce0e0a5bb7704556a217c4f63a7974f8f43e090aff03fcf262e0b135e02"}, + {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:f1659887361a7151f89e79b276ed8dff3d75877df906328f14d8bb40bb4f5101"}, + {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4658c398d65d1b25e1760de3157011a80375da861709abd7cef3bad65d6543f9"}, + {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4127d4303b9ac9f94ca0441138acead39928938660ca58329fe156f84b9f3015"}, + {file = "numpy-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e5eeca8067ad04bc8a2a8731183d51d7cbaac66d86085d5f4766ee6bf19c7f87"}, + {file = "numpy-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9adbd9bb520c866e1bfd7e10e1880a1f7749f1f6e5017686a5fbb9b72cf69f82"}, + {file = "numpy-2.0.1-cp310-cp310-win32.whl", hash = "sha256:7b9853803278db3bdcc6cd5beca37815b133e9e77ff3d4733c247414e78eb8d1"}, + {file = "numpy-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:81b0893a39bc5b865b8bf89e9ad7807e16717f19868e9d234bdaf9b1f1393868"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75b4e316c5902d8163ef9d423b1c3f2f6252226d1aa5cd8a0a03a7d01ffc6268"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6e4eeb6eb2fced786e32e6d8df9e755ce5be920d17f7ce00bc38fcde8ccdbf9e"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a1e01dcaab205fbece13c1410253a9eea1b1c9b61d237b6fa59bcc46e8e89343"}, + {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8fc2de81ad835d999113ddf87d1ea2b0f4704cbd947c948d2f5513deafe5a7b"}, + {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a3d94942c331dd4e0e1147f7a8699a4aa47dffc11bf8a1523c12af8b2e91bbe"}, + {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15eb4eca47d36ec3f78cde0a3a2ee24cf05ca7396ef808dda2c0ddad7c2bde67"}, + {file = "numpy-2.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b83e16a5511d1b1f8a88cbabb1a6f6a499f82c062a4251892d9ad5d609863fb7"}, + {file = "numpy-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f87fec1f9bc1efd23f4227becff04bd0e979e23ca50cc92ec88b38489db3b55"}, + {file = "numpy-2.0.1-cp311-cp311-win32.whl", hash = "sha256:36d3a9405fd7c511804dc56fc32974fa5533bdeb3cd1604d6b8ff1d292b819c4"}, + {file = "numpy-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:08458fbf403bff5e2b45f08eda195d4b0c9b35682311da5a5a0a0925b11b9bd8"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bf4e6f4a2a2e26655717a1983ef6324f2664d7011f6ef7482e8c0b3d51e82ac"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6fddc5fe258d3328cd8e3d7d3e02234c5d70e01ebe377a6ab92adb14039cb4"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5daab361be6ddeb299a918a7c0864fa8618af66019138263247af405018b04e1"}, + {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:ea2326a4dca88e4a274ba3a4405eb6c6467d3ffbd8c7d38632502eaae3820587"}, + {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:529af13c5f4b7a932fb0e1911d3a75da204eff023ee5e0e79c1751564221a5c8"}, + {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6790654cb13eab303d8402354fabd47472b24635700f631f041bd0b65e37298a"}, + {file = "numpy-2.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cbab9fc9c391700e3e1287666dfd82d8666d10e69a6c4a09ab97574c0b7ee0a7"}, + {file = "numpy-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99d0d92a5e3613c33a5f01db206a33f8fdf3d71f2912b0de1739894668b7a93b"}, + {file = "numpy-2.0.1-cp312-cp312-win32.whl", hash = "sha256:173a00b9995f73b79eb0191129f2455f1e34c203f559dd118636858cc452a1bf"}, + {file = "numpy-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:bb2124fdc6e62baae159ebcfa368708867eb56806804d005860b6007388df171"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfc085b28d62ff4009364e7ca34b80a9a080cbd97c2c0630bb5f7f770dae9414"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fae4ebbf95a179c1156fab0b142b74e4ba4204c87bde8d3d8b6f9c34c5825ef"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:72dc22e9ec8f6eaa206deb1b1355eb2e253899d7347f5e2fae5f0af613741d06"}, + {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:ec87f5f8aca726117a1c9b7083e7656a9d0d606eec7299cc067bb83d26f16e0c"}, + {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f682ea61a88479d9498bf2091fdcd722b090724b08b31d63e022adc063bad59"}, + {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8efc84f01c1cd7e34b3fb310183e72fcdf55293ee736d679b6d35b35d80bba26"}, + {file = "numpy-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3fdabe3e2a52bc4eff8dc7a5044342f8bd9f11ef0934fcd3289a788c0eb10018"}, + {file = "numpy-2.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:24a0e1befbfa14615b49ba9659d3d8818a0f4d8a1c5822af8696706fbda7310c"}, + {file = "numpy-2.0.1-cp39-cp39-win32.whl", hash = "sha256:f9cf5ea551aec449206954b075db819f52adc1638d46a6738253a712d553c7b4"}, + {file = "numpy-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:e9e81fa9017eaa416c056e5d9e71be93d05e2c3c2ab308d23307a8bc4443c368"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61728fba1e464f789b11deb78a57805c70b2ed02343560456190d0501ba37b0f"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:12f5d865d60fb9734e60a60f1d5afa6d962d8d4467c120a1c0cda6eb2964437d"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eacf3291e263d5a67d8c1a581a8ebbcfd6447204ef58828caf69a5e3e8c75990"}, + {file = "numpy-2.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2c3a346ae20cfd80b6cfd3e60dc179963ef2ea58da5ec074fd3d9e7a1e7ba97f"}, + {file = "numpy-2.0.1.tar.gz", hash = "sha256:485b87235796410c3519a699cfe1faab097e509e90ebb05dcd098db2ae87e7b3"}, +] + [[package]] name = "overrides" version = "7.7.0" @@ -2543,4 +2597,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "97c391ad142e40a53b2cf4a89be811f7f91afd8eaf80415ad2291ed36abdf1ce" +content-hash = "a1364de59de22bc2b6dbcbe251564ddaabaf6b7285e2db81f4878bab46bf07e2" diff --git a/pyproject.toml b/pyproject.toml index 8f89715..e8a16a3 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,6 +9,7 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.9" pillow = "^10.4.0" +numpy = "^2.0.1" [tool.poetry.group.dev.dependencies] black = "^24.8.0" diff --git a/space_filling_experiments.ipynb b/space_filling_experiments.ipynb index 7f5c5b1..0d810c3 100644 --- a/space_filling_experiments.ipynb +++ b/space_filling_experiments.ipynb @@ -20,7 +20,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 2, "id": "06bee73d-4be4-4ebf-8197-f5d841effea3", "metadata": {}, "outputs": [ @@ -33,7 +33,7 @@ " 0, 0], dtype=uint8)" ] }, - "execution_count": 12, + "execution_count": 2, "metadata": {}, "output_type": "execute_result" } @@ -71,7 +71,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 3, "id": "ec79e1a9-f152-4c78-a948-f1f0f1de470d", "metadata": {}, "outputs": [ @@ -83,7 +83,7 @@ "" ] }, - "execution_count": 13, + "execution_count": 3, "metadata": {}, "output_type": "execute_result" } @@ -94,7 +94,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 4, "id": "56bc00c8-0ca4-4eb3-bf26-aa5c372133cc", "metadata": {}, "outputs": [ @@ -104,7 +104,7 @@ "(46, 68)" ] }, - "execution_count": 14, + "execution_count": 4, "metadata": {}, "output_type": "execute_result" } @@ -115,268 +115,237 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 5, "id": "a35fc5ea-bac3-494c-b1c7-52abdb47aded", "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "[Rectangle(x=0 y=0 w=68 h=0)]\n", - "[Rectangle(x=0 y=0 w=68 h=1)]\n", - "[Rectangle(x=0 y=0 w=68 h=2)]\n", - "[Rectangle(x=0 y=0 w=68 h=3)]\n", - "[Rectangle(x=0 y=0 w=68 h=4)]\n", - "[Rectangle(x=0 y=0 w=68 h=5)]\n", - "[Rectangle(x=0 y=0 w=68 h=6)]\n", - "[Rectangle(x=0 y=0 w=68 h=7)]\n", - "[Rectangle(x=0 y=0 w=68 h=8)]\n", - "[Rectangle(x=0 y=0 w=68 h=9)]\n", - "[Rectangle(x=0 y=0 w=68 h=10)]\n", - "[Rectangle(x=5 y=10 w=32 h=0), Rectangle(x=41 y=10 w=4 h=0), Rectangle(x=49 y=10 w=19 h=0)]\n", - "[Rectangle(x=5 y=10 w=32 h=1), Rectangle(x=41 y=10 w=4 h=1), Rectangle(x=49 y=10 w=19 h=1)]\n", - "[Rectangle(x=5 y=10 w=32 h=2), Rectangle(x=41 y=10 w=4 h=2), Rectangle(x=49 y=10 w=19 h=2)]\n", - "[Rectangle(x=5 y=10 w=32 h=3), Rectangle(x=41 y=10 w=4 h=3), Rectangle(x=49 y=10 w=19 h=3)]\n", - "[Rectangle(x=5 y=10 w=32 h=4), Rectangle(x=41 y=10 w=4 h=4), Rectangle(x=49 y=10 w=19 h=4)]\n", - "[Rectangle(x=5 y=10 w=32 h=5), Rectangle(x=41 y=10 w=4 h=5), Rectangle(x=49 y=10 w=19 h=5)]\n", - "[Rectangle(x=5 y=10 w=32 h=6), Rectangle(x=41 y=10 w=4 h=6), Rectangle(x=49 y=10 w=19 h=6)]\n", - "[Rectangle(x=19 y=17 w=9 h=0), Rectangle(x=36 y=17 w=6 h=0), Rectangle(x=46 y=17 w=4 h=0), Rectangle(x=54 y=17 w=6 h=0), Rectangle(x=41 y=10 w=4 h=7), Rectangle(x=63 y=17 w=9 h=0), Rectangle(x=80 y=17 w=6 h=0), Rectangle(x=90 y=17 w=4 h=0), Rectangle(x=98 y=17 w=6 h=0)]\n", - "[Rectangle(x=41 y=10 w=4 h=8), Rectangle(x=80 y=17 w=6 h=1), Rectangle(x=90 y=17 w=4 h=1), Rectangle(x=98 y=17 w=6 h=1)]\n", - "[Rectangle(x=41 y=10 w=4 h=9), Rectangle(x=80 y=17 w=6 h=2), Rectangle(x=90 y=17 w=4 h=2), Rectangle(x=98 y=17 w=6 h=2)]\n", - "[Rectangle(x=41 y=10 w=4 h=10), Rectangle(x=80 y=17 w=6 h=3), Rectangle(x=90 y=17 w=4 h=3), Rectangle(x=98 y=17 w=6 h=3)]\n", - "[Rectangle(x=41 y=10 w=4 h=11), Rectangle(x=80 y=17 w=6 h=4), Rectangle(x=90 y=17 w=4 h=4), Rectangle(x=98 y=17 w=6 h=4)]\n", - "[Rectangle(x=41 y=10 w=4 h=12), Rectangle(x=80 y=17 w=6 h=5), Rectangle(x=90 y=17 w=4 h=5), Rectangle(x=98 y=17 w=6 h=5)]\n", - "[Rectangle(x=41 y=10 w=4 h=13), Rectangle(x=80 y=17 w=6 h=6), Rectangle(x=90 y=17 w=4 h=6), Rectangle(x=98 y=17 w=6 h=6)]\n", - "[Rectangle(x=41 y=10 w=4 h=14), Rectangle(x=80 y=17 w=6 h=7), Rectangle(x=90 y=17 w=4 h=7), Rectangle(x=98 y=17 w=6 h=7)]\n", - "[Rectangle(x=41 y=10 w=4 h=15), Rectangle(x=80 y=17 w=6 h=8), Rectangle(x=90 y=17 w=4 h=8), Rectangle(x=98 y=17 w=6 h=8)]\n", - "[Rectangle(x=41 y=10 w=4 h=16), Rectangle(x=80 y=17 w=6 h=9), Rectangle(x=90 y=17 w=4 h=9), Rectangle(x=98 y=17 w=6 h=9)]\n", - "[Rectangle(x=41 y=10 w=4 h=17), Rectangle(x=80 y=17 w=6 h=10), Rectangle(x=90 y=17 w=4 h=10), Rectangle(x=98 y=17 w=6 h=10)]\n", - "[Rectangle(x=41 y=10 w=4 h=18), Rectangle(x=80 y=17 w=6 h=11), Rectangle(x=90 y=17 w=4 h=11), Rectangle(x=98 y=17 w=6 h=11)]\n", - "[Rectangle(x=41 y=10 w=4 h=19), Rectangle(x=80 y=17 w=6 h=12), Rectangle(x=90 y=17 w=4 h=12), Rectangle(x=98 y=17 w=6 h=12)]\n", - "[Rectangle(x=41 y=10 w=4 h=20), Rectangle(x=80 y=17 w=6 h=13), Rectangle(x=90 y=17 w=4 h=13), Rectangle(x=98 y=17 w=6 h=13)]\n", - "[Rectangle(x=41 y=10 w=4 h=21), Rectangle(x=80 y=17 w=6 h=14), Rectangle(x=90 y=17 w=4 h=14), Rectangle(x=98 y=17 w=6 h=14)]\n", - "[Rectangle(x=41 y=10 w=4 h=22), Rectangle(x=80 y=17 w=6 h=15), Rectangle(x=90 y=17 w=4 h=15), Rectangle(x=98 y=17 w=6 h=15)]\n", - "[Rectangle(x=41 y=10 w=4 h=23), Rectangle(x=80 y=17 w=6 h=16), Rectangle(x=90 y=17 w=4 h=16), Rectangle(x=98 y=17 w=6 h=16)]\n", - "[Rectangle(x=41 y=10 w=4 h=24), Rectangle(x=80 y=17 w=6 h=17), Rectangle(x=90 y=17 w=4 h=17), Rectangle(x=98 y=17 w=6 h=17)]\n", - "[Rectangle(x=41 y=10 w=4 h=25), Rectangle(x=80 y=17 w=6 h=18), Rectangle(x=90 y=17 w=4 h=18), Rectangle(x=98 y=17 w=6 h=18)]\n", - "[Rectangle(x=41 y=10 w=4 h=26), Rectangle(x=80 y=17 w=6 h=19), Rectangle(x=90 y=17 w=4 h=19), Rectangle(x=98 y=17 w=6 h=19)]\n", - "[Rectangle(x=41 y=10 w=4 h=27), Rectangle(x=80 y=17 w=6 h=20), Rectangle(x=90 y=17 w=4 h=20), Rectangle(x=98 y=17 w=6 h=20)]\n", - "[Rectangle(x=41 y=10 w=4 h=28), Rectangle(x=80 y=17 w=6 h=21), Rectangle(x=90 y=17 w=4 h=21), Rectangle(x=98 y=17 w=6 h=21)]\n", - "[Rectangle(x=41 y=10 w=4 h=29), Rectangle(x=80 y=17 w=6 h=22), Rectangle(x=90 y=17 w=4 h=22), Rectangle(x=98 y=17 w=6 h=22)]\n", - "[Rectangle(x=41 y=10 w=4 h=30), Rectangle(x=80 y=17 w=6 h=23), Rectangle(x=90 y=17 w=4 h=23), Rectangle(x=98 y=17 w=6 h=23)]\n", - "[Rectangle(x=41 y=10 w=4 h=31), Rectangle(x=80 y=17 w=6 h=24), Rectangle(x=90 y=17 w=4 h=24), Rectangle(x=98 y=17 w=6 h=24)]\n", - "[Rectangle(x=41 y=10 w=4 h=32), Rectangle(x=80 y=17 w=6 h=25), Rectangle(x=90 y=17 w=4 h=25), Rectangle(x=98 y=17 w=6 h=25)]\n", - "[Rectangle(x=41 y=10 w=4 h=33), Rectangle(x=80 y=17 w=6 h=26), Rectangle(x=90 y=17 w=4 h=26), Rectangle(x=98 y=17 w=6 h=26)]\n", - "[Rectangle(x=41 y=10 w=4 h=34), Rectangle(x=80 y=17 w=6 h=27), Rectangle(x=90 y=17 w=4 h=27), Rectangle(x=98 y=17 w=6 h=27)]\n" - ] - } - ], + "outputs": [], "source": [ - "completed_rectangles = []\n", - "active_rectangles = [Rectangle(x=0,y=0, width=img_data.shape[1], height=0)]\n", - "base_value = 0\n", - "min_rectangle_width = 3\n", - "for ind, img_row in enumerate(img_data):\n", - "\n", - " print(active_rectangles)\n", + "# completed_rectangles = []\n", + "# active_rectangles = [Rectangle(x=0,y=0, width=img_data.shape[1], height=0)]\n", + "# base_value = 0\n", + "# min_rectangle_width = 3\n", + "# for ind, img_row in enumerate(img_data):\n", " \n", - " new_active_rectangles = []\n", - " for rect in active_rectangles:\n", + "# new_active_rectangles = []\n", + "# for rect in active_rectangles:\n", " \n", - " # rectangle isn't done yet\n", - " if np.all(img_row[rect.x: rect.x+rect.width] == base_value):\n", - " new_active_rectangles.append(Rectangle(x=rect.x, y=rect.y, width=rect.width, height=rect.height+1))\n", - " elif rect.height == 0:\n", - " continue\n", - " # make the new rectangles\n", - " else:\n", - " completed_rectangles.append(rect)\n", - " # find the new rectangles to start\n", - " new_left = []\n", - " new_right = []\n", + "# # rectangle isn't done yet\n", + "# if np.all(img_row[rect.x: rect.x+rect.width] == base_value):\n", + "# new_active_rectangles.append(Rectangle(x=rect.x, y=rect.y, width=rect.width, height=rect.height+1))\n", + "# elif rect.height == 0:\n", + "# continue\n", + "# # make the new rectangles\n", + "# else:\n", + "# completed_rectangles.append(rect)\n", + "# # find the new rectangles to start\n", + "# new_left = []\n", + "# new_right = []\n", + "# new_rect_active = False\n", + "# for col_ind, val in enumerate(img_row):\n", + "# if val == base_value and not new_rect_active:\n", + "# new_rect_active = True\n", + "# new_left.append(col_ind + rect.x)\n", + "# elif new_rect_active and val != base_value:\n", + "# new_rect_active = False\n", + "# new_right.append(col_ind + rect.x)\n", + "# else:\n", + "# continue\n", + "\n", + "# if new_rect_active:\n", + "# new_right.append(rect.x + rect.width)\n", + "\n", + "# for left, right in zip(new_left, new_right, strict=True):\n", + "# if right - left < min_rectangle_width:\n", + "# continue\n", + "# new_active_rectangles.append(Rectangle(x=left, y=ind, width=right-left, height=0))\n", + "\n", + "# active_rectangles = new_active_rectangles\n", + "\n", + "# completed_rectangles.extend(active_rectangles)" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "id": "8fe01b43-b642-44a5-ada8-57ab77fc9d7b", + "metadata": {}, + "outputs": [], + "source": [ + "text = \"hello\"\n", + "size = 30\n", + "\n", + "font = ImageFont.truetype(get_default_font_path(), size)\n", + "\n", + "bbox = font.getbbox(text)\n", + "\n", + "text_dims = (bbox[2] - bbox[0], 2*(bbox[3] - bbox[1]))\n", + "\n", + "tmp_img = Image.new('RGB', text_dims,color = (0,0,0))\n", + "tmp_canvas = ImageDraw.Draw(tmp_img)\n", + "\n", + "np.array(tmp_img.quantize())\n", + "\n", + "\n", + "tmp_canvas.text(\n", + " (0,0), \n", + " text,\n", + " fill=(255,255,255),\n", + " font=font,\n", + ")\n", + "\n", + "img_data = np.array(tmp_img.quantize(2))\n", + "\n", + "\n", + "rectangles = [Rectangle(x=0,y=0, width=img_data.shape[1], height=0)]\n", + "base_value = img_data[0,0]\n", + "min_rectangle_side_length = 3\n", + "for row_ind, img_row in enumerate(img_data):\n", + " # find the gaps between the letters\n", + " left_inds = []\n", + " right_inds = []\n", + " new_rect_active = False\n", + " for col_ind, val in enumerate(img_row):\n", + " if val == base_value and not new_rect_active:\n", + " new_rect_active = True\n", + " left_inds.append(col_ind)\n", + " elif new_rect_active and val != base_value:\n", " new_rect_active = False\n", - " for col_ind, val in enumerate(img_row):\n", - " if val == base_value and not new_rect_active:\n", - " new_rect_active = True\n", - " new_left.append(col_ind + rect.x)\n", - " elif new_rect_active and val != base_value:\n", - " new_rect_active = False\n", - " new_right.append(col_ind + rect.x)\n", - " else:\n", - " continue\n", + " right_inds.append(col_ind)\n", + " else:\n", + " continue\n", + "\n", + " if new_rect_active:\n", + " right_inds.append(img_data.shape[1])\n", "\n", - " if new_rect_active:\n", - " new_right.append(rect.x + rect.width)\n", + " new_rectangles = []\n", + " for left_ind, right_ind in zip(left_inds, right_inds, strict=True):\n", + " # if the rectangle is too small\n", + " if right_ind - left_ind < min_rectangle_side_length:\n", + " continue\n", + " # if this is a continuation of an existing rectangle\n", + " extended = False\n", + " for rect_ind, rectangle in enumerate(rectangles):\n", + " if rectangle.bottom == row_ind and rectangle.x == left_ind and rectangle.right == right_ind:\n", + " rectangles[rect_ind] = Rectangle(x=rectangle.x, y=rectangle.y, width=rectangle.width, height=rectangle.height+1)\n", + " extended = True\n", + "\n", + " if not extended:\n", + " new_rectangles.append(Rectangle(x=left_ind, y=row_ind, width=right_ind-left_ind, height=1))\n", "\n", - " for left, right in zip(new_left, new_right, strict=True):\n", - " if right - left < min_rectangle_width:\n", - " continue\n", - " new_active_rectangles.append(Rectangle(x=left, y=ind, width=right-left, height=0))\n", + " rectangles += new_rectangles\n", "\n", - " active_rectangles = new_active_rectangles\n", + "rectangles = [rectangle for rectangle in rectangles if rectangle.height >= min_rectangle_side_length]\n", "\n", - "completed_rectangles.extend(active_rectangles)" + " " + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "id": "68d51d69-0f27-429d-9292-53d177d620cc", + "metadata": {}, + "outputs": [], + "source": [ + "for rectangle in rectangles:\n", + " tmp_canvas.rectangle(rectangle.xyrb)" ] }, { "cell_type": "code", - "execution_count": 16, - "id": "cd111b81-758e-4bff-a61b-afd10567ec17", + "execution_count": 119, + "id": "2122fd47-0adc-4dc6-8934-8ef3427ceb86", "metadata": {}, "outputs": [ { "data": { + "image/jpeg": "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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEQAAAAuCAIAAAAeHijZAAAD7klEQVR4Ae1Xyyt0YRif0chlyC2XjUukrFghIpIdxYqNYi9hoWxkY2EjJrIScovIUvkD2MxKISWXlZLocwl9he/3eZxnnvc1x8x3fJnTdM7ind/73C/ved4z7re3N1fUPNGUTEzUdAWJOMnYtZtOZ5zO/EAFnGP2A0W25MIdTZfmRwX6+vqQFT2WihKukuHk76/UMaNLmZDYeWdClihCAk5nIlT4kG6jqjMemS5Gitsd+WGtDToZ4ddY6czT01NpaenFxUVQnenpaaSqPfHx8cvLy0Hlr6+v6+vrNfn+/v6gwkyMjY2VKgkJCUtLS8zVwNraWmJiIst/cOmeub29PT09RRBwWVxcjEDT0tKam5sPDg7oHgDWzK2srID1+Pg4ODiYl5cHu16vt6mp6ejoCPT7+/vCwkKpYnahkX2sHk/gsMDa5uYmsRYXF2trazMyMtLT06urq2dnZ4m+tbUVE6O0xMU+4L6kpES6B87OzkaeUIZpyULQIL68vDQ0NEg6cGZm5uXlJbiULTnWVqnCLJlMW1sb0VEpKUy4p6eHuF1dXQqXkxkdHVUYxmZ+fh6aZ2dnpC9XhGtIKb8jIyMQe35+xsoMqchEAEnX8OHhoV57Q3N3dxfCEDAI77+cjGZI21J/SDM5OZm47e3tii1j09rayuoGTQmaiQAsCUB0HCciDg0NSUmJu7u7SUY5zDIZKc2YdB4eHthZZWUlE38Fe0iYZDQ7GhFcokh6TU2NJH6NW1paYCTwtrG/MEFWVhZJ4o0PU+WfxPCuszwmAWMJCgoKcPJBIWF1DkjBUJjPMVrEwzEogCWuayirAb5ZAgEJl4tlKBjrydzc3JDd3Nxc6eAzlhmGvGdYHcOQsRnIyckh1tXVFYD1ZHiGYPybOfsOHZcbq3NjNYBpRjJ7e3sA1pPB3UqGOjo6UlJS2PH/And3d2Tq5ORE+yygVuNo+f1+yKCs5+fnAFaS4fKQM7x8uJ7j4uJoq60WxoNmv6ioaHh4WDOLbW9vb3l5OcDY2JjCDX80K2ou18LCAvne39/HTYyPIEy5/Pz8urq6gYGBnZ2d8fFxqWLmiBOQXwBQnJmZIdbq6iqGdWpqKk5BVVXV3Nwc0be3t3kUfTgy88FxkCauDqYQgG+fz/f6+koCn9eJiQmpYuaIFbVksJ2ammKuBjY2NoJ03swHx0FWPidDAmVlZZOTk2gOvjiRGNbj4+P19fXOzs6kpCQ2AmDmiKPUkiHdiooKfFni5fn9/uBuwTdUY2OjtAwc+X8vWkDf2qIk39K3k7KVaWan+JVYnGSUctho43TGRs1QQnE6o5TDRhunMzZqhhKK0xmlHDba/AFtDpqzz4oVmwAAAABJRU5ErkJggg==", "text/plain": [ - "[Rectangle(x=0 y=0 w=68 h=10),\n", - " Rectangle(x=5 y=10 w=32 h=6),\n", - " Rectangle(x=49 y=10 w=19 h=6),\n", - " Rectangle(x=41 y=10 w=4 h=35),\n", - " Rectangle(x=80 y=17 w=6 h=28),\n", - " Rectangle(x=90 y=17 w=4 h=28),\n", - " Rectangle(x=98 y=17 w=6 h=28)]" + "" ] }, - "execution_count": 16, + "execution_count": 119, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "completed_rectangles" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "id": "68d51d69-0f27-429d-9292-53d177d620cc", - "metadata": {}, - "outputs": [], - "source": [ - "for rectangle in completed_rectangles:\n", - " tmp_canvas.rectangle(rectangle.xyrb)" + "tmp_img" ] }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 120, "id": "7054930e-1c3d-46a8-b19e-ed53b95c542b", "metadata": {}, "outputs": [ { "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAuAEQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDzvxp408VWvjrxDb2/iXWYYItTuUjjjv5VVFErAAANgADjFYf/AAnfjD/oa9c/8GM3/wAVXpj2Ph/W/hJrPxDvvDGnya2b0s4E90sLs8yBiVE2c/Ox4IHTivM/+Eh0v/oTND/7/Xv/AMkUAH/Cd+MP+hr1z/wYzf8AxVH/AAnfjD/oa9c/8GM3/wAVR/wkOl/9CZof/f69/wDkij/hIdL/AOhM0P8A7/Xv/wAkUAH/AAnfjD/oa9c/8GM3/wAVR/wnfjD/AKGvXP8AwYzf/FV3nwm0vwz488VXWl6p4T02GCKye4VrW4u1YsHRcHdOwxhz29K1PA3hnwn4m8eS6Fe+FbGO1XRbfUA8Nzdh/MkigdhkzEbczNgYzwOfUA8v/wCE78Yf9DXrn/gxm/8AiqP+E78Yf9DXrn/gxm/+KrU8QX+i6VqUVtB4P0ZkeytLgl570ndLbxysOLgcbnIHtjr1rL/4SHS/+hM0P/v9e/8AyRQAf8J34w/6GvXP/BjN/wDFUUf8JDpf/QmaH/3+vf8A5IooA9V8K+IIfDHwEttWka7Lw6s4hgt7l4BPIVICyMhBKAZYjuVFXvB/xK1P4nXV54a1BW0y6e1kksrzS7maFo3UcbvnO78fTpzxxV//AMm3aZ/2MLf+ipKT4C/8lPg/69J//QaANP4Y3vibXTq+s6jrniXUbLR4BILC21CcvdStnYnytnHBzj2rsNC8aeNfE+sRaJ4g8J6vpmmXRMSXtil3by2xI+VmkJwwzjOcDuc9K4f4P6i1xpPibwra6k2natqcCSadcLKYiZUz8gYcgnI6dt1U/wCzPjOb02nmeLvMDbd32uby/wDvvdtx75oA6n4Zan4kt/jTc+H9W8Q6nfw2n2mJkuLuR0cpkBtrEjtmrfwk/wCSvz/9irZf+iLOuX+CrXjfGU/2jLJLeiO4E7yyb2ZwMHLZOTnvXUfCT/kr8/8A2Ktl/wCiLOgDmPhlfapNYavrWseIdc/sHw9aqwsoNRljErHIjjGG4X5cYGO3atXTfjxd6xqkOmazpy22lXEgiM1jdzxXEIJwG8wPlsdT0zWB8LpYNY8O+K/BbTxw3urwJJYmRtqySxknZn1Py/kaytB+FXi298R29neaJeWNskoNxdXEZSKNAfmYOeG4z0JoAn8c6p4y8H+MdQ0T/hL9eljgcGKRtQly0bAMpPzdcHB9waKp/FjxBaeJfiNqd9YyLJaKUgikXo4RQpYeoJBx7YooA5RtSv301dNa9uTYJJ5q2plbylfBG4JnGcE84zzRYalfaVdC6069ubO4AKiW3laNwD1GVINVaKAFBKsGUkEcgjtWw/i7xLJa/Zn8Q6s1vjHlNeyFMemN2KxqKALVhqV/pV2LvTr25s7kAgTW8rRuAeoypBrvnv7zTLzxBeWF3PaXUfhXS9k0EhjdcjTwcMORkEj8a83r2TXfBWpWPgPU/GEs9odPv/Dml28Uau3mhgbIZYbcY/dt0J6j8ADxwMVYMpIYHII6itS68T6/fWf2O71zU7i1xjyZbuR0x/uk4rKooAKKKKAP/9k=", - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEQAAAAuCAIAAAAeHijZAAAEaElEQVR4Ae1Yyyt0YRg3TLnnlssGRQolG5eIlGTDwsoG8Q8IRdlJLFBCWCi33IuUlLJQNihZUG6RS4rIJfdcwvebHvP0zjlzPmeOb/iazlnMPOf33N7n8j7vO2P4+PhwcpjHkYJxdpiqIBA9mP+1mnpl9Mr8QAb0NvuBJGtyYXCkQ/MzA+Xl5YiKHk1JUatkdvJhNBpBs5oSzgJqCH3PqMnSb8jolfmNrKvxaZQLiftSzv0ZRNsaLNoMJgwGg7+/f21t7erq6tPT09vb2+np6fT0dF5eHlhKT3Z29sTExMnJCeQfHx+hW1dXFxQUJJevqKj4Mh1yrYyMjIGBgb29vefn59fX16Ojo9HR0aysLInkp2UazQ8PD3FxccfHxzwoRaKzs1O+DldX16GhIVGM6YuLCyxCosJnwF9Gs6ji5uY2ODjINiXE2NiYu7u7KG+iycfNzc3+/v7l5SXyFxUVBUN+fn65ubkbGxtkBbREc2RkBCxUo7q6OiwsDKny9PTMycnZ3t4Gfnd3FxERIarYFAysTU5OkmuElJ6eHhAQgMZJTU3t7e0lfGZmxtnZor8+gyH30dHRonvQwcHBiBNcmBZZWDRAtFZmZqaIgw4MDDw7OwMX0Yosm4LJz8+HBTzIlGiE6NLSUuKWlJRYcNlHQ0ODBcP80t/fD82DgwMzYPqem5sDKFkuC9TX14OLjefh4cEgO1LTZktLS7Cwubkpzb3Z3OLiIgkQYFkgJyfsdbOkxffOzg7eUWJGvb29aUtMTU0xKBIrKyt4xaaKiYkRcZU0fCUnJ0MYe/39/d2q1vDwMHDYp2aWjuatrS2rai8vL8BdXFyYGxsbS689PT1dXV2MM4HcEy2mgLlfErCPPQMxSopVeWZhbmG3S4O5vr62qiYHMXkJxI6Xc0VETIGI/53GXieB8/NzJUlsS2KRsDQYpYLKzXEfoxmWl5flAt9EqCwwwoTcILNoMdI9I1dQQq6urogVGhqqJPMdnLMeEhKiZIdZVD3twWDIYJLADca/krPv4DjcqE0SEhKU7DBrbW0NMtqDwdmK0QkThYWFPj4+Sv4047e3t/Pz81AvKCjgWSJaQ48VFRUBQVoPDw9BaA8Gyk1NTfjE5sPxjBEMWv58OR7kKow0NjaCjoyMrKmpYZCJsrKyxMREvDY3NzNoIvgss0CFl8rKSjTV/f29gJlI3P+A41lfX8dJjEsQplx4eDiOoKqqqoWFhZaWFlGFHak5NKHY3d1N9nENS0tL8/X1RRekpKT09fURPjs7y6Po0xH7EB2LtFIwWFNbWxuam0zLP1tbW0U77EhlMBDr6OiQmyUEV3UrlWcfomORVgqGZOLj49vb21Ec3DgRGD53d3fHx8eLi4u9vLxEO+xIZTCkm5SUhJslfgLg7MaDWxXuUPgJIFr+ZRrZ5RWINIO2Et8aALY6s7e8Hoy9M6zVvl4ZrZmzt55eGXtnWKt9vTJaM2dvPb0y9s6wVvvS/wC02tGo90+uZOz7DxQ8DmFu/JCpAAAAAElFTkSuQmCC", "text/plain": [ - "" + "[Rectangle(x=0 y=0 w=68 h=10),\n", + " Rectangle(x=5 y=10 w=32 h=7),\n", + " Rectangle(x=40 y=10 w=5 h=23),\n", + " Rectangle(x=48 y=10 w=20 h=7),\n", + " Rectangle(x=33 y=20 w=4 h=5),\n", + " Rectangle(x=16 y=21 w=4 h=8),\n", + " Rectangle(x=48 y=21 w=4 h=8),\n", + " Rectangle(x=5 y=22 w=8 h=11),\n", + " Rectangle(x=54 y=23 w=10 h=4),\n", + " Rectangle(x=0 y=33 w=68 h=13)]" ] }, - "execution_count": 18, + "execution_count": 120, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "tmp_img" + "rectangles" ] }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 95, "id": "0dbcd09f-518d-49eb-99c3-d6d050a99af8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "[Rectangle(x=0 y=0 w=18 h=10), Rectangle(x=5 y=10 w=13 h=6)]" + "[Rectangle(x=0 y=0 w=68 h=10),\n", + " Rectangle(x=5 y=10 w=32 h=7),\n", + " Rectangle(x=40 y=10 w=5 h=23),\n", + " Rectangle(x=48 y=10 w=20 h=7),\n", + " Rectangle(x=33 y=20 w=4 h=5),\n", + " Rectangle(x=16 y=21 w=4 h=8),\n", + " Rectangle(x=48 y=21 w=4 h=8),\n", + " Rectangle(x=5 y=22 w=8 h=11),\n", + " Rectangle(x=54 y=23 w=10 h=4),\n", + " Rectangle(x=0 y=33 w=68 h=13)]" ] }, - "execution_count": 9, + "execution_count": 95, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "completed_rectangles" + "rectangles" ] }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 96, "id": "6e7ea5b5-ecbc-470c-b5fa-1c68f5776f88", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n", - " 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255,\n", - " 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n", - " 255, 255, 255, 0, 0, 112, 255, 255, 255, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 255, 255,\n", - " 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 112, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 112, 255, 255, 255, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112,\n", - " 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 112, 255, 255, 255, 255, 255, 255, 255, 255,\n", - " 255, 255, 255, 255, 255, 255, 255, 0, 0, 112, 255, 254, 0,\n", - " 17, 128, 207, 247, 252, 231, 178, 79, 0, 0, 0, 0, 0,\n", - " 0, 112, 255, 245, 45, 229, 255, 255, 255, 255, 255, 255, 255,\n", - " 149, 0, 0, 0, 0, 0, 112, 255, 241, 222, 237, 113, 37,\n", - " 8, 17, 76, 213, 255, 255, 76, 0, 0, 0, 0, 112, 255,\n", - " 255, 243, 40, 0, 0, 0, 0, 0, 23, 241, 255, 174, 0,\n", - " 0, 0, 0, 112, 255, 255, 136, 0, 0, 0, 0, 0, 0,\n", - " 0, 160, 255, 223, 0, 0, 0, 0, 112, 255, 255, 59, 0,\n", - " 0, 0, 0, 0, 0, 0, 122, 255, 241, 0, 0, 0, 0,\n", - " 112, 255, 255, 18, 0, 0, 0, 0, 0, 0, 0, 116, 255,\n", - " 244, 0, 0, 0, 0, 112, 255, 255, 2, 0, 0, 0, 0,\n", - " 0, 0, 0, 116, 255, 244, 0, 0, 0, 0, 112, 255, 255,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 244, 0, 0,\n", - " 0, 0, 112, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 116, 255, 244, 0, 0, 0, 0, 112, 255, 255, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 116, 255, 244, 0, 0, 0, 0, 112,\n", - " 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 116, 255, 244,\n", - " 0, 0, 0, 0, 112, 255, 255, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 116, 255, 244, 0, 0, 0, 0, 112, 255, 255, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 116, 255, 244, 0, 0, 0,\n", - " 0, 112, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0, 116,\n", - " 255, 244, 0, 0, 0, 0, 112, 255, 255, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 116, 255, 244, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0])" + "array([255, 255, 255, ..., 73, 73, 73])" ] }, - "execution_count": 10, + "execution_count": 96, "metadata": {}, "output_type": "execute_result" } @@ -387,88 +356,23 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 97, "id": "41739495-9053-4ea7-b36f-cbc0f7dd5339", "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "array([[ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0],\n", - " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0],\n", - " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112, 112, 112,\n", - " 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112, 112,\n", - " 112, 112, 112, 112, 112, 112, 112, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0],\n", - " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255,\n", - " 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,\n", - " 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0],\n", - " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255,\n", - " 255, 255, 255, 255, 254, 245, 241, 255, 255, 255, 255, 255, 255,\n", - " 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0],\n", - " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 45, 222, 243, 136, 59, 18, 2, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0],\n", - " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 17, 229, 237, 40, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0],\n", - " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 128, 255, 113, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0],\n", - " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 207, 255, 37, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0],\n", - " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 247, 255, 8, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0],\n", - " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 252, 255, 17, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0],\n", - " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 231, 255, 76, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0],\n", - " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 178, 255, 213, 23, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0],\n", - " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 79, 255, 255, 241, 160, 122, 116, 116, 116,\n", - " 116, 116, 116, 116, 116, 116, 116, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0],\n", - " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 149, 255, 255, 255, 255, 255, 255, 255,\n", - " 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0],\n", - " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 76, 174, 223, 241, 244, 244, 244,\n", - " 244, 244, 244, 244, 244, 244, 244, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0],\n", - " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0],\n", - " [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0]], dtype=uint8)" + "array([[0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " ...,\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0],\n", + " [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)" ] }, - "execution_count": 11, + "execution_count": 97, "metadata": {}, "output_type": "execute_result" } diff --git a/wrdcld/__init__.py b/wrdcld/__init__.py index 6d5f09d..8b34b79 100644 --- a/wrdcld/__init__.py +++ b/wrdcld/__init__.py @@ -32,7 +32,8 @@ def make_word_cloud( word, required_font_size, available_rectangles, img, canvas ) - # img.show() - # input() + + for rectangle in available_rectangles: + canvas.rectangle(rectangle.xyrb) return img diff --git a/wrdcld/main.py b/wrdcld/main.py index 9d06fad..57d641b 100644 --- a/wrdcld/main.py +++ b/wrdcld/main.py @@ -4,8 +4,7 @@ from .font import draw_text, get_default_font_path from .rectangle import ( Rectangle, - fill_remaining_space_horizontal, - fill_remaining_space_vertical, + fill_remaining_space ) def _fill( @@ -78,7 +77,6 @@ def fill_next_word(word, required_font_size, available_rectangles, img, canvas): ) options = [] - if horizontal_option is not None: options.append("horizontal") if vertical_option is not None: @@ -114,10 +112,6 @@ def fill_next_word(word, required_font_size, available_rectangles, img, canvas): rotate=True, ) - # figure out new available rectangles - fill_func = random.choice( - [fill_remaining_space_horizontal, fill_remaining_space_vertical] - ) - new_available_rectangles = fill_func(chosen_rectangle, text_rectangle) + new_available_rectangles = fill_remaining_space(img, chosen_rectangle) return available_rectangles + new_available_rectangles diff --git a/wrdcld/rectangle.py b/wrdcld/rectangle.py index 52089c4..0a787c4 100644 --- a/wrdcld/rectangle.py +++ b/wrdcld/rectangle.py @@ -1,5 +1,6 @@ from dataclasses import dataclass import math +import numpy as np @dataclass(frozen=True) @@ -46,143 +47,68 @@ def __repr__(self): return f"Rectangle(x={int(self.x)} y={int(self.y)} w={int(self.width)} h={int(self.height)})" -def fill_remaining_space_horizontal( - outer_rect: Rectangle, inner_rect: Rectangle +def fill_remaining_space( + img, + outer_rect: Rectangle ) -> list[Rectangle]: """ - Returns a list of rectangles that fill the remaining space between the outer and inner rectangles. + Returns a list of rectangles that fill the remaining space Args: - outer_rect (Rectangle): Outer rectangle. - inner_rect (Rectangle): Inner rectangle. + img (Image): the overaall wordcloud image. + inner_rect (Rectangle): The rectangle containing the new text. Returns: list[Rectangle]: List of rectangles that fill the remaining space. """ - # Calculate the remaining space - remaining_width = outer_rect.width - inner_rect.width - remaining_height = outer_rect.height - inner_rect.height - - # Calculate the x and y offsets for the inner rectangle - inner_x_offset = inner_rect.x - outer_rect.x - inner_y_offset = inner_rect.y - outer_rect.y - - # Create a list to store the rectangles that fill the remaining space - rectangles = [] - - # Top rectangle - if inner_y_offset > 0: - rectangles.append( - Rectangle( - x=outer_rect.x, - y=outer_rect.y, - width=outer_rect.width, - height=inner_y_offset, - ) - ) - - # Bottom rectangle - if remaining_height > 0: - rectangles.append( - Rectangle( - x=outer_rect.x, - y=inner_rect.bottom, - width=outer_rect.width, - height=outer_rect.height - inner_y_offset - inner_rect.height, - ) - ) - - # Left rectangle - if inner_x_offset > 0: - rectangles.append( - Rectangle( - x=outer_rect.x, - y=inner_rect.y, - width=inner_x_offset, - height=inner_rect.height, - ) - ) - - # Right rectangle - if remaining_width > 0: - rectangles.append( - Rectangle( - x=inner_rect.right, - y=inner_rect.y, - width=outer_rect.width - inner_x_offset - inner_rect.width, - height=inner_rect.height, - ) - ) - - return rectangles - - -def fill_remaining_space_vertical( - outer_rect: Rectangle, inner_rect: Rectangle -) -> list[Rectangle]: - """ - Returns a list of rectangles that fill the remaining space between the outer and inner rectangles. - - Args: - outer_rect (Rectangle): Outer rectangle. - inner_rect (Rectangle): Inner rectangle. - - Returns: - list[Rectangle]: List of rectangles that fill the remaining space. - """ - # Calculate the remaining space - remaining_width = outer_rect.width - inner_rect.width - remaining_height = outer_rect.height - inner_rect.height - - # Calculate the x and y offsets for the inner rectangle - inner_x_offset = inner_rect.x - outer_rect.x - inner_y_offset = inner_rect.y - outer_rect.y - - # Create a list to store the rectangles that fill the remaining space - rectangles = [] - - # Top rectangle - if inner_y_offset > 0: - rectangles.append( - Rectangle( - x=inner_rect.x, - y=outer_rect.y, - width=inner_rect.width, - height=inner_y_offset, - ) - ) - - # Bottom rectangle - if remaining_height > 0: - rectangles.append( - Rectangle( - x=inner_rect.x, - y=inner_rect.bottom, - width=inner_rect.width, - height=outer_rect.height - inner_y_offset - inner_rect.height, - ) - ) - - # Left rectangle - if inner_x_offset > 0: - rectangles.append( - Rectangle( - x=outer_rect.x, - y=outer_rect.y, - width=inner_x_offset, - height=outer_rect.height, - ) - ) - - # Right rectangle - if remaining_width > 0: - rectangles.append( - Rectangle( - x=inner_rect.right, - y=outer_rect.y, - width=outer_rect.width - inner_x_offset - inner_rect.width, - height=outer_rect.height, - ) - ) - return rectangles + img_section = img.crop(outer_rect.xyrb) + img_data = np.array(img_section.quantize(2)) + + base_value = img_data[0,0] + min_rectangle_side_length = 5 + + rectangles = [Rectangle(x=0,y=0, width=img_data.shape[1], height=0)] + for row_ind, img_row in enumerate(img_data): + # find the gaps between the letters + left_inds = [] + right_inds = [] + new_rect_active = False + for col_ind, val in enumerate(img_row): + if val == base_value and not new_rect_active: + new_rect_active = True + left_inds.append(col_ind) + elif new_rect_active and val != base_value: + new_rect_active = False + right_inds.append(col_ind) + else: + continue + + if new_rect_active: + right_inds.append(img_data.shape[1]) + + new_rectangles = [] + for left_ind, right_ind in zip(left_inds, right_inds, strict=True): + # if the rectangle is too small + if right_ind - left_ind < min_rectangle_side_length: + continue + # if this is a continuation of an existing rectangle + extended = False + for rect_ind, rectangle in enumerate(rectangles): + if rectangle.bottom == row_ind and rectangle.x == left_ind and rectangle.right == right_ind: + rectangles[rect_ind] = Rectangle(x=rectangle.x, y=rectangle.y, width=rectangle.width, height=rectangle.height+1) + extended = True + # otherwise it's a new rectangle + if not extended: + new_rectangles.append(Rectangle(x=left_ind, y=row_ind, width=right_ind-left_ind, height=1)) + + rectangles += new_rectangles + + # offset the rectangles to the correct position + rectangles = [ + Rectangle(x=rectangle.x + outer_rect.x, y=rectangle.y + outer_rect.y, width=rectangle.width, height=rectangle.height) + for rectangle in rectangles + if rectangle.height >= min_rectangle_side_length + ] + + return rectangles \ No newline at end of file From 5d7ae949765599e031234d751b5baba127d7701f Mon Sep 17 00:00:00 2001 From: Jim Barrett Date: Tue, 13 Aug 2024 21:54:56 +0200 Subject: [PATCH 04/11] get rotatioon working --- space_filling_experiments.ipynb | 421 +++++++++++++++++++++----------- wrdcld/__init__.py | 5 +- wrdcld/main.py | 16 +- wrdcld/rectangle.py | 168 ++++++++++++- 4 files changed, 453 insertions(+), 157 deletions(-) diff --git a/space_filling_experiments.ipynb b/space_filling_experiments.ipynb index 0d810c3..2995f5b 100644 --- a/space_filling_experiments.ipynb +++ b/space_filling_experiments.ipynb @@ -115,64 +115,260 @@ }, { "cell_type": "code", - "execution_count": 5, - "id": "a35fc5ea-bac3-494c-b1c7-52abdb47aded", + "execution_count": 126, + "id": "8fe01b43-b642-44a5-ada8-57ab77fc9d7b", "metadata": {}, "outputs": [], "source": [ - "# completed_rectangles = []\n", - "# active_rectangles = [Rectangle(x=0,y=0, width=img_data.shape[1], height=0)]\n", - "# base_value = 0\n", - "# min_rectangle_width = 3\n", - "# for ind, img_row in enumerate(img_data):\n", - " \n", - "# new_active_rectangles = []\n", - "# for rect in active_rectangles:\n", - " \n", - "# # rectangle isn't done yet\n", - "# if np.all(img_row[rect.x: rect.x+rect.width] == base_value):\n", - "# new_active_rectangles.append(Rectangle(x=rect.x, y=rect.y, width=rect.width, height=rect.height+1))\n", - "# elif rect.height == 0:\n", - "# continue\n", - "# # make the new rectangles\n", - "# else:\n", - "# completed_rectangles.append(rect)\n", - "# # find the new rectangles to start\n", - "# new_left = []\n", - "# new_right = []\n", + "# text = \"hello\"\n", + "# size = 30\n", + "\n", + "# font = ImageFont.truetype(get_default_font_path(), size)\n", + "\n", + "# bbox = font.getbbox(text)\n", + "\n", + "# text_dims = (bbox[2] - bbox[0], 2*(bbox[3] - bbox[1]))\n", + "\n", + "# tmp_img = Image.new('RGB', text_dims,color = (0,0,0))\n", + "# tmp_canvas = ImageDraw.Draw(tmp_img)\n", + "\n", + "# np.array(tmp_img.quantize())\n", + "\n", + "\n", + "# tmp_canvas.text(\n", + "# (0,0), \n", + "# text,\n", + "# fill=(255,255,255),\n", + "# font=font,\n", + "# )\n", + "\n", + "# img_data = np.array(tmp_img.quantize(2))\n", + "\n", + "\n", + "# rectangles = [Rectangle(x=0,y=0, width=img_data.shape[1], height=0)]\n", + "# base_value = img_data[0,0]\n", + "# min_rectangle_side_length = 3\n", + "# for row_ind, img_row in enumerate(img_data):\n", + "# # find the gaps between the letters\n", + "# left_inds = []\n", + "# right_inds = []\n", + "# new_rect_active = False\n", + "# for col_ind, val in enumerate(img_row):\n", + "# if val == base_value and not new_rect_active:\n", + "# new_rect_active = True\n", + "# left_inds.append(col_ind)\n", + "# elif new_rect_active and val != base_value:\n", "# new_rect_active = False\n", - "# for col_ind, val in enumerate(img_row):\n", - "# if val == base_value and not new_rect_active:\n", - "# new_rect_active = True\n", - "# new_left.append(col_ind + rect.x)\n", - "# elif new_rect_active and val != base_value:\n", - "# new_rect_active = False\n", - "# new_right.append(col_ind + rect.x)\n", - "# else:\n", - "# continue\n", - "\n", - "# if new_rect_active:\n", - "# new_right.append(rect.x + rect.width)\n", - "\n", - "# for left, right in zip(new_left, new_right, strict=True):\n", - "# if right - left < min_rectangle_width:\n", - "# continue\n", - "# new_active_rectangles.append(Rectangle(x=left, y=ind, width=right-left, height=0))\n", - "\n", - "# active_rectangles = new_active_rectangles\n", - "\n", - "# completed_rectangles.extend(active_rectangles)" + "# right_inds.append(col_ind)\n", + "# else:\n", + "# continue\n", + "\n", + "# if new_rect_active:\n", + "# right_inds.append(img_data.shape[1])\n", + "\n", + "# new_rectangles = []\n", + "# for left_ind, right_ind in zip(left_inds, right_inds, strict=True):\n", + "# # if the rectangle is too small\n", + "# if right_ind - left_ind < min_rectangle_side_length:\n", + "# continue\n", + "# # if this is a continuation of an existing rectangle\n", + "# extended = False\n", + "# for rect_ind, rectangle in enumerate(rectangles):\n", + "# if rectangle.bottom == row_ind and rectangle.x == left_ind and rectangle.right == right_ind:\n", + "# rectangles[rect_ind] = Rectangle(x=rectangle.x, y=rectangle.y, width=rectangle.width, height=rectangle.height+1)\n", + "# extended = True\n", + "\n", + "# if not extended:\n", + "# new_rectangles.append(Rectangle(x=left_ind, y=row_ind, width=right_ind-left_ind, height=1))\n", + "\n", + "# rectangles += new_rectangles\n", + "\n", + "# rectangles = [rectangle for rectangle in rectangles if rectangle.height >= min_rectangle_side_length]\n", + "\n", + " " ] }, { "cell_type": "code", - "execution_count": 117, - "id": "8fe01b43-b642-44a5-ada8-57ab77fc9d7b", + "execution_count": 127, + "id": "e11a1dab-6e34-4055-9cf6-2b91b558f257", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Rectangle(x=0 y=0 w=68 h=10),\n", + " Rectangle(x=5 y=10 w=32 h=7),\n", + " Rectangle(x=40 y=10 w=5 h=23),\n", + " Rectangle(x=48 y=10 w=20 h=7),\n", + " Rectangle(x=33 y=20 w=4 h=5),\n", + " Rectangle(x=16 y=21 w=4 h=8),\n", + " Rectangle(x=48 y=21 w=4 h=8),\n", + " Rectangle(x=5 y=22 w=8 h=11),\n", + " Rectangle(x=54 y=23 w=10 h=4),\n", + " Rectangle(x=0 y=33 w=68 h=13)]" + ] + }, + "execution_count": 127, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rectangles" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "id": "68d51d69-0f27-429d-9292-53d177d620cc", "metadata": {}, "outputs": [], + "source": [ + "for rectangle in rectangles:\n", + " tmp_canvas.rectangle(rectangle.xyrb)" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "id": "2122fd47-0adc-4dc6-8934-8ef3427ceb86", + "metadata": {}, + "outputs": [ + { + "data": { + "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAuAEQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDzvxp408VWvjrxDb2/iXWYYItTuUjjjv5VVFErAAANgADjFYf/AAnfjD/oa9c/8GM3/wAVXpj2Ph/W/hJrPxDvvDGnya2b0s4E90sLs8yBiVE2c/Ox4IHTivM/+Eh0v/oTND/7/Xv/AMkUAH/Cd+MP+hr1z/wYzf8AxVH/AAnfjD/oa9c/8GM3/wAVR/wkOl/9CZof/f69/wDkij/hIdL/AOhM0P8A7/Xv/wAkUAH/AAnfjD/oa9c/8GM3/wAVR/wnfjD/AKGvXP8AwYzf/FV3nwm0vwz488VXWl6p4T02GCKye4VrW4u1YsHRcHdOwxhz29K1PBfhnwn4j+KfiHwveeFbFLHTftPkyQ3N2JG8udY13EzEHgnOAOaAPL/+E78Yf9DXrn/gxm/+Ko/4Tvxh/wBDXrn/AIMZv/iq1PEuoaLo3irV9Lt/B+jNBZXs1vG0k96WKo5UE4uAM4HoKy/+Eh0v/oTND/7/AF7/APJFAB/wnfjD/oa9c/8ABjN/8VRR/wAJDpf/AEJmh/8Af69/+SKKAPZfAFwbT4BS3JsrO/jjvnL2l9JBHby5KhfNab5QoYq3BBLKoB5qTwakfi2bUtLvvCXge0nNo8ltd6T9huGhYYALR7pMjJHOMdu9Ymmf8mpaz/1+L/6URVn/ALOf/JQNR/7BMv8A6NioA2fCugzre69daqvh7Xo9BDRz6XpegRCSW4yVWMk2q5GVbJQnp6dZvC15e6z4jj03W/hJp2nWF2TEt5BoG1rYkHazGRGUgHHUAd/aneFb/TtTvPHmm6L4utU1LxDcvd6U1v8AaIJFbe7hWZ40AJyowpP8VcZ/ZnxnN6bTzPF3mBtu77XN5f8A33u24980AeneALE6L8V7/QG1S3lvbKx8y5S38PWlpG6sIyAJozvOC6HBUA49hWJ8LP8Ak4Xxr/2/f+laVn/B/wAUa/ffFMWGrzQSzi2kguJmtIfPk8tQAHmC73xsXksc4HWtD4Wf8nC+Nf8At+/9K0oAPDGjXl5rPiLUNel0HxE2jmT7ZY6doUTT3FzuYbCzWylslWyVJ55zjrBouq6hda9Db6t8FrK30yeQRmWDw+wkgBON5LIVbHU8Cr3gzUtBv9R8f6Xb67Y38viaSeSytYjNbyMH83KF5Ygqth1xjdzng4rktE+G327X4bO58E+J7CFJAZ7u61SJYYkB+ZtxtgGwOwPNAGP45u9W8H+MdQ0TydEljgcGKRtBsctGwDKT+564OD7g0VT+LHiC08S/EbU76xkWS0UpBFIvRwihSw9QSDj2xRQBoeKvH3iDSdc1/wANWMmnw6JDqM8aWA0q1MO1ZTtypjwSNq8nJ4BrG074keJdHuGuNLm02xnZDG0lrpFpExUkEqSsQOMgcewqn47/AOSh+Jf+wrdf+jWrn6AOhHjPVVYMttoYI5BGhWXH/kGth/jB45ktfsz6vC1vjHlNp9sUx6Y8vFcNRQB1Vh8RPEelXYu9OfS7O5AIE1vo9nG4B6jKxA1Na/E/xZY6jPqNnd2NvfT7vOuYdKtEkk3Hc25hFk5IBOeprj6KAOhHjTVVYMttoYYHII0KyyP/ACDWpdfFnxnfWf2O71K1uLXGPJl0y1dMf7pjxXFUUAdB/wAJlqn/AD66H/4IrL/4zRXP0UAf/9k=", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEQAAAAuCAIAAAAeHijZAAAD7klEQVR4Ae1Xyyt0YRif0chlyC2XjUukrFghIpIdxYqNYi9hoWxkY2EjJrIScovIUvkD2MxKISWXlZLocwl9he/3eZxnnvc1x8x3fJnTdM7ind/73C/ved4z7re3N1fUPNGUTEzUdAWJOMnYtZtOZ5zO/EAFnGP2A0W25MIdTZfmRwX6+vqQFT2WihKukuHk76/UMaNLmZDYeWdClihCAk5nIlT4kG6jqjMemS5Gitsd+WGtDToZ4ddY6czT01NpaenFxUVQnenpaaSqPfHx8cvLy0Hlr6+v6+vrNfn+/v6gwkyMjY2VKgkJCUtLS8zVwNraWmJiIst/cOmeub29PT09RRBwWVxcjEDT0tKam5sPDg7oHgDWzK2srID1+Pg4ODiYl5cHu16vt6mp6ejoCPT7+/vCwkKpYnahkX2sHk/gsMDa5uYmsRYXF2trazMyMtLT06urq2dnZ4m+tbUVE6O0xMU+4L6kpES6B87OzkaeUIZpyULQIL68vDQ0NEg6cGZm5uXlJbiULTnWVqnCLJlMW1sb0VEpKUy4p6eHuF1dXQqXkxkdHVUYxmZ+fh6aZ2dnpC9XhGtIKb8jIyMQe35+xsoMqchEAEnX8OHhoV57Q3N3dxfCEDAI77+cjGZI21J/SDM5OZm47e3tii1j09rayuoGTQmaiQAsCUB0HCciDg0NSUmJu7u7SUY5zDIZKc2YdB4eHthZZWUlE38Fe0iYZDQ7GhFcokh6TU2NJH6NW1paYCTwtrG/MEFWVhZJ4o0PU+WfxPCuszwmAWMJCgoKcPJBIWF1DkjBUJjPMVrEwzEogCWuayirAb5ZAgEJl4tlKBjrydzc3JDd3Nxc6eAzlhmGvGdYHcOQsRnIyckh1tXVFYD1ZHiGYPybOfsOHZcbq3NjNYBpRjJ7e3sA1pPB3UqGOjo6UlJS2PH/And3d2Tq5ORE+yygVuNo+f1+yKCs5+fnAFaS4fKQM7x8uJ7j4uJoq60WxoNmv6ioaHh4WDOLbW9vb3l5OcDY2JjCDX80K2ou18LCAvne39/HTYyPIEy5/Pz8urq6gYGBnZ2d8fFxqWLmiBOQXwBQnJmZIdbq6iqGdWpqKk5BVVXV3Nwc0be3t3kUfTgy88FxkCauDqYQgG+fz/f6+koCn9eJiQmpYuaIFbVksJ2ammKuBjY2NoJ03swHx0FWPidDAmVlZZOTk2gOvjiRGNbj4+P19fXOzs6kpCQ2AmDmiKPUkiHdiooKfFni5fn9/uBuwTdUY2OjtAwc+X8vWkDf2qIk39K3k7KVaWan+JVYnGSUctho43TGRs1QQnE6o5TDRhunMzZqhhKK0xmlHDba/AFtDpqzz4oVmwAAAABJRU5ErkJggg==", + "text/plain": [ + "" + ] + }, + "execution_count": 119, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "tmp_img" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "id": "7054930e-1c3d-46a8-b19e-ed53b95c542b", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[Rectangle(x=0 y=0 w=462 h=26),\n", + " Rectangle(x=0 y=26 w=141 h=24),\n", + " Rectangle(x=369 y=26 w=93 h=24),\n", + " Rectangle(x=299 y=71 w=163 h=3),\n", + " Rectangle(x=301 y=76 w=161 h=3),\n", + " Rectangle(x=0 y=77 w=282 h=3),\n", + " Rectangle(x=302 y=79 w=160 h=3),\n", + " Rectangle(x=0 y=80 w=283 h=4),\n", + " Rectangle(x=303 y=82 w=159 h=4),\n", + " Rectangle(x=0 y=84 w=284 h=8),\n", + " Rectangle(x=304 y=86 w=158 h=6),\n", + " Rectangle(x=0 y=92 w=285 h=12),\n", + " Rectangle(x=305 y=92 w=157 h=20),\n", + " Rectangle(x=0 y=104 w=284 h=6),\n", + " Rectangle(x=0 y=110 w=283 h=4),\n", + " Rectangle(x=304 y=112 w=158 h=7),\n", + " Rectangle(x=0 y=114 w=282 h=3),\n", + " Rectangle(x=303 y=119 w=159 h=4),\n", + " Rectangle(x=302 y=123 w=160 h=4),\n", + " Rectangle(x=301 y=127 w=161 h=3),\n", + " Rectangle(x=0 y=135 w=141 h=25),\n", + " Rectangle(x=0 y=160 w=462 h=41),\n", + " Rectangle(x=0 y=245 w=143 h=3),\n", + " Rectangle(x=301 y=245 w=161 h=3),\n", + " Rectangle(x=0 y=248 w=142 h=3),\n", + " Rectangle(x=302 y=248 w=160 h=4),\n", + " Rectangle(x=0 y=251 w=141 h=4),\n", + " Rectangle(x=303 y=252 w=159 h=4),\n", + " Rectangle(x=163 y=254 w=54 h=3),\n", + " Rectangle(x=0 y=255 w=140 h=5),\n", + " Rectangle(x=237 y=255 w=46 h=4),\n", + " Rectangle(x=304 y=256 w=158 h=6),\n", + " Rectangle(x=161 y=259 w=56 h=4),\n", + " Rectangle(x=237 y=259 w=47 h=4),\n", + " Rectangle(x=0 y=260 w=139 h=7),\n", + " Rectangle(x=305 y=262 w=157 h=19),\n", + " Rectangle(x=160 y=263 w=57 h=5),\n", + " Rectangle(x=237 y=263 w=48 h=16),\n", + " Rectangle(x=0 y=267 w=138 h=24),\n", + " Rectangle(x=159 y=268 w=58 h=24),\n", + " Rectangle(x=237 y=279 w=47 h=5),\n", + " Rectangle(x=304 y=281 w=158 h=6),\n", + " Rectangle(x=237 y=284 w=46 h=3),\n", + " Rectangle(x=303 y=287 w=159 h=4),\n", + " Rectangle(x=0 y=291 w=139 h=9),\n", + " Rectangle(x=302 y=291 w=160 h=4),\n", + " Rectangle(x=160 y=292 w=57 h=8),\n", + " Rectangle(x=300 y=297 w=162 h=3),\n", + " Rectangle(x=0 y=300 w=140 h=6),\n", + " Rectangle(x=161 y=300 w=56 h=5),\n", + " Rectangle(x=162 y=305 w=55 h=4),\n", + " Rectangle(x=0 y=306 w=141 h=4),\n", + " Rectangle(x=163 y=309 w=54 h=3),\n", + " Rectangle(x=0 y=310 w=142 h=4),\n", + " Rectangle(x=164 y=312 w=53 h=4),\n", + " Rectangle(x=0 y=314 w=143 h=3),\n", + " Rectangle(x=0 y=317 w=144 h=3),\n", + " Rectangle(x=166 y=318 w=51 h=3),\n", + " Rectangle(x=0 y=320 w=145 h=3),\n", + " Rectangle(x=167 y=321 w=50 h=3),\n", + " Rectangle(x=0 y=325 w=147 h=3),\n", + " Rectangle(x=169 y=326 w=48 h=4),\n", + " Rectangle(x=0 y=330 w=217 h=7),\n", + " Rectangle(x=0 y=337 w=462 h=41),\n", + " Rectangle(x=0 y=378 w=141 h=24),\n", + " Rectangle(x=369 y=378 w=93 h=24),\n", + " Rectangle(x=0 y=402 w=462 h=52),\n", + " Rectangle(x=0 y=454 w=141 h=24),\n", + " Rectangle(x=369 y=454 w=93 h=24),\n", + " Rectangle(x=0 y=478 w=462 h=43),\n", + " Rectangle(x=298 y=559 w=164 h=3),\n", + " Rectangle(x=0 y=562 w=144 h=3),\n", + " Rectangle(x=301 y=566 w=161 h=4),\n", + " Rectangle(x=0 y=567 w=142 h=3),\n", + " Rectangle(x=0 y=570 w=141 h=3),\n", + " Rectangle(x=302 y=570 w=160 h=3),\n", + " Rectangle(x=0 y=573 w=140 h=5),\n", + " Rectangle(x=303 y=573 w=159 h=5),\n", + " Rectangle(x=0 y=578 w=139 h=6),\n", + " Rectangle(x=304 y=578 w=158 h=7),\n", + " Rectangle(x=160 y=579 w=123 h=3),\n", + " Rectangle(x=159 y=583 w=125 h=6),\n", + " Rectangle(x=0 y=584 w=138 h=20),\n", + " Rectangle(x=305 y=585 w=157 h=20),\n", + " Rectangle(x=158 y=589 w=126 h=11),\n", + " Rectangle(x=159 y=600 w=125 h=5),\n", + " Rectangle(x=0 y=604 w=139 h=7),\n", + " Rectangle(x=304 y=605 w=158 h=6),\n", + " Rectangle(x=160 y=607 w=123 h=3),\n", + " Rectangle(x=0 y=611 w=140 h=4),\n", + " Rectangle(x=303 y=611 w=159 h=5),\n", + " Rectangle(x=0 y=615 w=141 h=4),\n", + " Rectangle(x=302 y=616 w=160 h=3),\n", + " Rectangle(x=0 y=619 w=142 h=3),\n", + " Rectangle(x=301 y=619 w=161 h=3),\n", + " Rectangle(x=300 y=622 w=162 h=3),\n", + " Rectangle(x=0 y=624 w=144 h=3),\n", + " Rectangle(x=0 y=668 w=462 h=16)]" + ] + }, + "execution_count": 161, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "text = \"hello\"\n", - "size = 30\n", + "size = 300\n", "\n", "font = ImageFont.truetype(get_default_font_path(), size)\n", "\n", @@ -193,13 +389,16 @@ " font=font,\n", ")\n", "\n", - "img_data = np.array(tmp_img.quantize(2))\n", + "img_data = np.array(tmp_img.quantize(2)).T\n", "\n", "\n", "rectangles = [Rectangle(x=0,y=0, width=img_data.shape[1], height=0)]\n", "base_value = img_data[0,0]\n", "min_rectangle_side_length = 3\n", "for row_ind, img_row in enumerate(img_data):\n", + "\n", + " img_row = img_row[::-1]\n", + " \n", " # find the gaps between the letters\n", " left_inds = []\n", " right_inds = []\n", @@ -234,151 +433,77 @@ "\n", " rectangles += new_rectangles\n", "\n", - "rectangles = [rectangle for rectangle in rectangles if rectangle.height >= min_rectangle_side_length]\n", + "rectangles = [rectangle for rectangle in rectangles if rectangle.height >= min_rectangle_side_length and rectangle.width >= min_rectangle_side_length]\n", "\n", - " " + "rectangles" ] }, { "cell_type": "code", - "execution_count": 118, - "id": "68d51d69-0f27-429d-9292-53d177d620cc", + "execution_count": 162, + "id": "0dbcd09f-518d-49eb-99c3-d6d050a99af8", "metadata": {}, "outputs": [], "source": [ + "\n", + "\n", + "rotated_rectangles = []\n", "for rectangle in rectangles:\n", + " rotated_rectangles.append(Rectangle(\n", + " x=rectangle.y,\n", + " y=img_data.shape[1] - (rectangle.x + rectangle.width) ,\n", + " width=rectangle.height,\n", + " height=rectangle.width\n", + " ))\n", + "\n", + "for rectangle in rotated_rectangles:\n", " tmp_canvas.rectangle(rectangle.xyrb)" ] }, { "cell_type": "code", - "execution_count": 119, - "id": "2122fd47-0adc-4dc6-8934-8ef3427ceb86", - "metadata": {}, - "outputs": [ - { - "data": { - "image/jpeg": "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", - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEQAAAAuCAIAAAAeHijZAAAD7klEQVR4Ae1Xyyt0YRif0chlyC2XjUukrFghIpIdxYqNYi9hoWxkY2EjJrIScovIUvkD2MxKISWXlZLocwl9he/3eZxnnvc1x8x3fJnTdM7ind/73C/ved4z7re3N1fUPNGUTEzUdAWJOMnYtZtOZ5zO/EAFnGP2A0W25MIdTZfmRwX6+vqQFT2WihKukuHk76/UMaNLmZDYeWdClihCAk5nIlT4kG6jqjMemS5Gitsd+WGtDToZ4ddY6czT01NpaenFxUVQnenpaaSqPfHx8cvLy0Hlr6+v6+vrNfn+/v6gwkyMjY2VKgkJCUtLS8zVwNraWmJiIst/cOmeub29PT09RRBwWVxcjEDT0tKam5sPDg7oHgDWzK2srID1+Pg4ODiYl5cHu16vt6mp6ejoCPT7+/vCwkKpYnahkX2sHk/gsMDa5uYmsRYXF2trazMyMtLT06urq2dnZ4m+tbUVE6O0xMU+4L6kpES6B87OzkaeUIZpyULQIL68vDQ0NEg6cGZm5uXlJbiULTnWVqnCLJlMW1sb0VEpKUy4p6eHuF1dXQqXkxkdHVUYxmZ+fh6aZ2dnpC9XhGtIKb8jIyMQe35+xsoMqchEAEnX8OHhoV57Q3N3dxfCEDAI77+cjGZI21J/SDM5OZm47e3tii1j09rayuoGTQmaiQAsCUB0HCciDg0NSUmJu7u7SUY5zDIZKc2YdB4eHthZZWUlE38Fe0iYZDQ7GhFcokh6TU2NJH6NW1paYCTwtrG/MEFWVhZJ4o0PU+WfxPCuszwmAWMJCgoKcPJBIWF1DkjBUJjPMVrEwzEogCWuayirAb5ZAgEJl4tlKBjrydzc3JDd3Nxc6eAzlhmGvGdYHcOQsRnIyckh1tXVFYD1ZHiGYPybOfsOHZcbq3NjNYBpRjJ7e3sA1pPB3UqGOjo6UlJS2PH/And3d2Tq5ORE+yygVuNo+f1+yKCs5+fnAFaS4fKQM7x8uJ7j4uJoq60WxoNmv6ioaHh4WDOLbW9vb3l5OcDY2JjCDX80K2ou18LCAvne39/HTYyPIEy5/Pz8urq6gYGBnZ2d8fFxqWLmiBOQXwBQnJmZIdbq6iqGdWpqKk5BVVXV3Nwc0be3t3kUfTgy88FxkCauDqYQgG+fz/f6+koCn9eJiQmpYuaIFbVksJ2ammKuBjY2NoJ03swHx0FWPidDAmVlZZOTk2gOvjiRGNbj4+P19fXOzs6kpCQ2AmDmiKPUkiHdiooKfFni5fn9/uBuwTdUY2OjtAwc+X8vWkDf2qIk39K3k7KVaWan+JVYnGSUctho43TGRs1QQnE6o5TDRhunMzZqhhKK0xmlHDba/AFtDpqzz4oVmwAAAABJRU5ErkJggg==", - "text/plain": [ - "" - ] - }, - "execution_count": 119, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tmp_img" - ] - }, - { - "cell_type": "code", - "execution_count": 120, - "id": "7054930e-1c3d-46a8-b19e-ed53b95c542b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Rectangle(x=0 y=0 w=68 h=10),\n", - " Rectangle(x=5 y=10 w=32 h=7),\n", - " Rectangle(x=40 y=10 w=5 h=23),\n", - " Rectangle(x=48 y=10 w=20 h=7),\n", - " Rectangle(x=33 y=20 w=4 h=5),\n", - " Rectangle(x=16 y=21 w=4 h=8),\n", - " Rectangle(x=48 y=21 w=4 h=8),\n", - " Rectangle(x=5 y=22 w=8 h=11),\n", - " Rectangle(x=54 y=23 w=10 h=4),\n", - " Rectangle(x=0 y=33 w=68 h=13)]" - ] - }, - "execution_count": 120, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rectangles" - ] - }, - { - "cell_type": "code", - "execution_count": 95, - "id": "0dbcd09f-518d-49eb-99c3-d6d050a99af8", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Rectangle(x=0 y=0 w=68 h=10),\n", - " Rectangle(x=5 y=10 w=32 h=7),\n", - " Rectangle(x=40 y=10 w=5 h=23),\n", - " Rectangle(x=48 y=10 w=20 h=7),\n", - " Rectangle(x=33 y=20 w=4 h=5),\n", - " Rectangle(x=16 y=21 w=4 h=8),\n", - " Rectangle(x=48 y=21 w=4 h=8),\n", - " Rectangle(x=5 y=22 w=8 h=11),\n", - " Rectangle(x=54 y=23 w=10 h=4),\n", - " Rectangle(x=0 y=33 w=68 h=13)]" - ] - }, - "execution_count": 95, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rectangles" - ] - }, - { - "cell_type": "code", - "execution_count": 96, + "execution_count": 163, "id": "6e7ea5b5-ecbc-470c-b5fa-1c68f5776f88", "metadata": {}, "outputs": [ { "data": { + "image/jpeg": "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", + "image/png": "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AQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQj8P51lrwIbA67KAAAAAElFTkSuQmCC", "text/plain": [ - "array([255, 255, 255, ..., 73, 73, 73])" + "" ] }, - "execution_count": 96, + "execution_count": 163, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "np.array(tmp_img.getdata())[:,0]" + "tmp_img" ] }, { "cell_type": "code", - "execution_count": 97, + "execution_count": 164, "id": "41739495-9053-4ea7-b36f-cbc0f7dd5339", "metadata": {}, "outputs": [ { "data": { + "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAHOAqwDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDzvxp408VWvjrxDb2/iXWYYItTuUjjjv5VVFErAAANgADjFYf/AAnfjD/oa9c/8GM3/wAVR47/AOSh+Jf+wrdf+jWrn6AOg/4Tvxh/0Neuf+DGb/4qtzXfGniqHR/DDxeJdZR5tMd5WW/lBdvtdwuW+bk7VUZPYAdq4Oug8Q/8gPwn/wBgqT/0tuqAD/hO/GH/AENeuf8Agxm/+Ko/4Tvxh/0Neuf+DGb/AOKrn6KAOo8X395qen+Fry/u57u6k0p9808hkdsXlyBljycAAfhXL10HiH/kB+E/+wVJ/wClt1XP0AdB4E/5KH4a/wCwra/+jVr1Dw7rusSaf4RvJNVvnurvUNKguZmuHLzRm81IFHbOWXAAweOBXl/gT/kofhr/ALCtr/6NWvQPDX/ID8Df9hXSv/S3U6AK9h4s8SP/AGBu8Qaq3m+GtTnkzeyHfIn27a555YbEweo2r6CsO18aeKm8C6tcN4l1kzpqdkiSG/l3KrRXRYA7sgEqpI77R6VJp3/Muf8AYqar/wC5Cufs/wDknms/9hWw/wDRV3QAf8J34w/6GvXP/BjN/wDFUf8ACd+MP+hr1z/wYzf/ABVc/RQB6x/wlniT/hev9nf8JBqv2H/hJfI+zfbZPL8v7Tt2bc4244x0xR4W8WeJLj/hCPP8QarL9p8SyQT772RvNjH2PCNk/MvztwePmPqax/8Am4X/ALmv/wBu6PCH/Mgf9jXL/wC2NAGP4vv7zU9P8LXl/dz3d1JpT75p5DI7YvLkDLHk4AA/CuXroPEP/ID8J/8AYKk/9LbqufoAKKKKAO88aeNPFVr468Q29v4l1mGCLU7lI447+VVRRKwAADYAA4xWH/wnfjD/AKGvXP8AwYzf/FUeO/8AkofiX/sK3X/o1q5+gDoP+E78Yf8AQ165/wCDGb/4qj/hO/GH/Q165/4MZv8A4qufooA6D/hO/GH/AENeuf8Agxm/+KqTxzPNdeJI7i4lkmnl0zT3kkkYszsbOEkknkknnNc3XQeMv+Q5bf8AYK03/wBIoaAOfooooAKKKKAOo8IX95pmn+Kbywu57S6j0pNk0Ehjdc3lsDhhyMgkfjXYeKfFniS3/wCE38jxBqsX2bxLHBBsvZF8qM/bMouD8q/IvA4+Uegrh/D3/ID8Wf8AYKj/APS21roPF/8AzP8A/wBjXF/7fUAbFx4s8SL8UvFNmPEGqi1h/tjyoReybI9kFwU2rnA2lVIx0wMdK4f/AITvxh/0Neuf+DGb/wCKroLn/kr3i7/uOf8ApPc15/QB0H/Cd+MP+hr1z/wYzf8AxVdxb+LPEjfFLwtZnxBqptZv7H82E3smyTfBbl9y5wdxZic9cnPWvJ69Atv+SveEf+4H/wCk9tQBseFvFniS4/4Qjz/EGqy/afEskE++9kbzYx9jwjZPzL87cHj5j6ms/wAWX95ceDLizmu55LW1/sH7PC8hKRbtOlLbVPC5PJx1qv4Q/wCZA/7GuX/2xo8Tf8ixqH/cvf8AptloA8/ooooAKKKKAO48SeLPEmmahZ2dh4g1W0tY9K07ZDBeyRoubOEnCg4GSSfxrH/4Tvxh/wBDXrn/AIMZv/iqPGX/ACHLb/sFab/6RQ1z9AHQf8J34w/6GvXP/BjN/wDFUf8ACd+MP+hr1z/wYzf/ABVc/RQB0H/Cd+MP+hr1z/wYzf8AxVbmu+NPFUOj+GHi8S6yjzaY7yst/KC7fa7hct83J2qoyewA7VwddB4h/wCQH4T/AOwVJ/6W3VAB/wAJ34w/6GvXP/BjN/8AFUf8J34w/wChr1z/AMGM3/xVc/RQB3mu+NPFUOj+GHi8S6yjzaY7yst/KC7fa7hct83J2qoyewA7Vh/8J34w/wChr1z/AMGM3/xVHiH/AJAfhP8A7BUn/pbdVz9AHQf8J34w/wChr1z/AMGM3/xVH/Cd+MP+hr1z/wAGM3/xVc/RQB0H/Cd+MP8Aoa9c/wDBjN/8VR/wnfjD/oa9c/8ABjN/8VXP0UAd54T8aeKrnWLhJ/EusyoNMv3CvfysAy2kzKeW6hgCD2IBrD/4Tvxh/wBDXrn/AIMZv/iqPBv/ACHLn/sFal/6RTVz9AHQf8J34w/6GvXP/BjN/wDFVueE/Gniq51i4SfxLrMqDTL9wr38rAMtpMynluoYAg9iAa4Oug8G/wDIcuf+wVqX/pFNQAf8J34w/wChr1z/AMGM3/xVH/Cd+MP+hr1z/wAGM3/xVc/RQB0H/Cd+MP8Aoa9c/wDBjN/8VR/wnfjD/oa9c/8ABjN/8VXP0UAdB/wnfjD/AKGvXP8AwYzf/FVJ45nmuvEkdxcSyTTy6Zp7ySSMWZ2NnCSSTySTzmubroPGX/Ictv8AsFab/wCkUNAHP0UUUAFdB4E/5KH4a/7Ctr/6NWufroPAn/JQ/DX/AGFbX/0atAHWWuralc6p4a1SfULuXUB4X1NxdvMzShl+37TvJzkYGDnjAq5/wlniT/hD/P8A+Eg1Xzv+Ea8/zPtsm7zP7W8vfnP3tny567eOlY+nf8y5/wBipqv/ALkKP+ZI/wC5U/8Ac1QBHrvjTxVDo/hh4vEuso82mO8rLfygu32u4XLfNydqqMnsAO1Hizxp4qttYt0g8S6zEh0ywcql/KoLNaQsx4bqWJJPckmsPxD/AMgPwn/2CpP/AEtuqPGX/Ictv+wVpv8A6RQ0AH/Cd+MP+hr1z/wYzf8AxVbmheNPFU2j+J3l8S6y7w6YjxM1/KSjfa7dcr83B2swyOxI71wddB4e/wCQH4s/7BUf/pba0Abl1408VL4F0m4XxLrInfU71HkF/LuZVitSoJ3ZIBZiB23H1ruNS8S69HrGpomt6kqJqfiVFUXTgKsVorRAc8BGOVH8J5GK8rvP+SeaN/2Fb/8A9FWlegar/wAhzVf+wr4r/wDSJKAOD8czzXXiSO4uJZJp5dM095JJGLM7GzhJJJ5JJ5zXN10HjL/kOW3/AGCtN/8ASKGufoAKKKKACus0HVtS0bwLrdxpeoXdjO2p2KNJazNExXyrs4JUg4yAcewrk66Cz/5J5rP/AGFbD/0Vd0AH/Cd+MP8Aoa9c/wDBjN/8VR/wnfjD/oa9c/8ABjN/8VXP0UAdB47/AOSh+Jf+wrdf+jWrn66Dx3/yUPxL/wBhW6/9GtXP0AFdB4h/5AfhP/sFSf8ApbdVz9dB4h/5AfhP/sFSf+lt1QBz9FFFAHQeIf8AkB+E/wDsFSf+lt1XP10HiH/kB+E/+wVJ/wClt1XP0AdB4E/5KH4a/wCwra/+jVr0Dw1/yA/A3/YV0r/0t1OvP/An/JQ/DX/YVtf/AEategeGv+QH4G/7Culf+lup0Ac/p3/Muf8AYqar/wC5Cufs/wDknms/9hWw/wDRV3XQad/zLn/Yqar/AO5Cufs/+Seaz/2FbD/0Vd0Ac/RRRQB6B/zcL/3Nf/t3R4Q/5kD/ALGuX/2xo/5uF/7mv/27o8If8yB/2Ncv/tjQBz/iH/kB+E/+wVJ/6W3Vc/XQeIf+QH4T/wCwVJ/6W3Vc/QAUUUUAdB47/wCSh+Jf+wrdf+jWrn66Dx3/AMlD8S/9hW6/9GtXP0AFFFFABXQeMv8AkOW3/YK03/0ihrn66Dxl/wAhy2/7BWm/+kUNAHP0UUUAFFFFAHQeHv8AkB+LP+wVH/6W2tdB4v8A+Z//AOxri/8Ab6uf8Pf8gPxZ/wBgqP8A9LbWug8X/wDM/wD/AGNcX/t9QAXP/JXvF3/cc/8ASe5rz+vQLn/kr3i7/uOf+k9zXn9ABXoFt/yV7wj/ANwP/wBJ7avP69Atv+SveEf+4H/6T21AB4Q/5kD/ALGuX/2xo8Tf8ixqH/cvf+m2Wjwh/wAyB/2Ncv8A7Y0eJv8AkWNQ/wC5e/8ATbLQB5/RRRQAUUUUAdB4y/5Dlt/2CtN/9Ioa5+ug8Zf8hy2/7BWm/wDpFDXP0AFFFFABXQeIf+QH4T/7BUn/AKW3Vc/XQeIf+QH4T/7BUn/pbdUAc/RRRQB0HiH/AJAfhP8A7BUn/pbdVz9dB4h/5AfhP/sFSf8ApbdVz9ABRRRQAUUUUAdB4N/5Dlz/ANgrUv8A0imrn66Dwb/yHLn/ALBWpf8ApFNXP0AFdB4N/wCQ5c/9grUv/SKaufroPBv/ACHLn/sFal/6RTUAc/RRRQAUUUUAFdB4y/5Dlt/2CtN/9Ioa5+ug8Zf8hy2/7BWm/wDpFDQBz9FFFABXQeBP+Sh+Gv8AsK2v/o1a5+ug8Cf8lD8Nf9hW1/8ARq0AdBp3/Muf9ipqv/uQo/5kj/uVP/c1Rp3/ADLn/Yqar/7kKP8AmSP+5U/9zVAHP+If+QH4T/7BUn/pbdUeMv8AkOW3/YK03/0iho8Q/wDID8J/9gqT/wBLbqjxl/yHLb/sFab/AOkUNAHP10Hh7/kB+LP+wVH/AOltrXP10Hh7/kB+LP8AsFR/+ltrQAXn/JPNG/7Ct/8A+irSvQNV/wCQ5qv/AGFfFf8A6RJXn95/yTzRv+wrf/8Aoq0r0DVf+Q5qv/YV8V/+kSUAef8AjL/kOW3/AGCtN/8ASKGufroPGX/Ictv+wVpv/pFDXP0AFFFFABXQWf8AyTzWf+wrYf8Aoq7rn66Cz/5J5rP/AGFbD/0Vd0Ac/RRRQB0Hjv8A5KH4l/7Ct1/6NaufroPHf/JQ/Ev/AGFbr/0a1c/QAV0HiH/kB+E/+wVJ/wClt1XP10HiH/kB+E/+wVJ/6W3VAHP0UUUAdB4h/wCQH4T/AOwVJ/6W3Vc/XQeIf+QH4T/7BUn/AKW3Vc/QB0HgT/kofhr/ALCtr/6NWvQPDX/ID8Df9hXSv/S3U68/8Cf8lD8Nf9hW1/8ARq16B4a/5Afgb/sK6V/6W6nQBz+nf8y5/wBipqv/ALkK5+z/AOSeaz/2FbD/ANFXddBp3/Muf9ipqv8A7kK5+z/5J5rP/YVsP/RV3QBz9FFFAHoH/Nwv/c1/+3dHhD/mQP8Asa5f/bGj/m4X/ua//bujwh/zIH/Y1y/+2NAHP+If+QH4T/7BUn/pbdVz9dB4h/5AfhP/ALBUn/pbdVz9ABRRRQB0Hjv/AJKH4l/7Ct1/6NaufroPHf8AyUPxL/2Fbr/0a1c/QAUUUUAFdB4y/wCQ5bf9grTf/SKGufroPGX/ACHLb/sFab/6RQ0Ac/RRRQAUUUUAdB4e/wCQH4s/7BUf/pba10Hi/wD5n/8A7GuL/wBvq5/w9/yA/Fn/AGCo/wD0tta6Dxf/AMz/AP8AY1xf+31ABc/8le8Xf9xz/wBJ7mvP69Auf+SveLv+45/6T3Nef0AFegW3/JXvCP8A3A//AEntq8/r0C2/5K94R/7gf/pPbUAHhD/mQP8Asa5f/bGjxN/yLGof9y9/6bZaPCH/ADIH/Y1y/wDtjR4m/wCRY1D/ALl7/wBNstAHn9FFFABRRRQB0HjL/kOW3/YK03/0ihrn66Dxl/yHLb/sFab/AOkUNc/QAUUUUAFdB4h/5AfhP/sFSf8ApbdVz9dB4h/5AfhP/sFSf+lt1QBz9FFFAHQeIf8AkB+E/wDsFSf+lt1XP10HiH/kB+E/+wVJ/wClt1XP0AFFFFABRRRQB0Hg3/kOXP8A2CtS/wDSKaufroPBv/Icuf8AsFal/wCkU1c/QAV0Hg3/AJDlz/2CtS/9Ipq5+ug8G/8AIcuf+wVqX/pFNQBz9FFFABRRRQAV0HjL/kOW3/YK03/0ihrn66Dxl/yHLb/sFab/AOkUNAHP0UUUAFdB4E/5KH4a/wCwra/+jVrn66DwJ/yUPw1/2FbX/wBGrQB0Gnf8y5/2Kmq/+5Cj/mSP+5U/9zVGnf8AMuf9ipqv/uQo/wCZI/7lT/3NUAc/4h/5AfhP/sFSf+lt1R4y/wCQ5bf9grTf/SKGjxD/AMgPwn/2CpP/AEtuqPGX/Ictv+wVpv8A6RQ0Ac/XQeHv+QH4s/7BUf8A6W2tc/XQeHv+QH4s/wCwVH/6W2tABef8k80b/sK3/wD6KtK9A1X/AJDmq/8AYV8V/wDpElef3n/JPNG/7Ct//wCirSvQNV/5Dmq/9hXxX/6RJQB5/wCMv+Q5bf8AYK03/wBIoa5+ug8Zf8hy2/7BWm/+kUNc/QAUUUUAFdBZ/wDJPNZ/7Cth/wCiruufroLP/knms/8AYVsP/RV3QBz9FFFAHQeO/wDkofiX/sK3X/o1q5+ug8d/8lD8S/8AYVuv/RrVz9ABXQeIf+QH4T/7BUn/AKW3Vc/XQeIf+QH4T/7BUn/pbdUAc/RRRQB0HiH/AJAfhP8A7BUn/pbdVz9dB4h/5AfhP/sFSf8ApbdVz9AHQeBP+Sh+Gv8AsK2v/o1a9A8Nf8gPwN/2FdK/9LdTrz/wJ/yUPw1/2FbX/wBGrXoHhr/kB+Bv+wrpX/pbqdAHP6d/zLn/AGKmq/8AuQrn7P8A5J5rP/YVsP8A0Vd10Gnf8y5/2Kmq/wDuQrn7P/knms/9hWw/9FXdAHP0UUUAegf83C/9zX/7d0eEP+ZA/wCxrl/9saP+bhf+5r/9u6PCH/Mgf9jXL/7Y0Ac/4h/5AfhP/sFSf+lt1XP10HiH/kB+E/8AsFSf+lt1XP0AFFFFAHQeO/8AkofiX/sK3X/o1q5+ug8d/wDJQ/Ev/YVuv/RrVz9ABRRRQAV0HjL/AJDlt/2CtN/9Ioa5+ug8Zf8AIctv+wVpv/pFDQBz9FFFABRRRQB0Hh7/AJAfiz/sFR/+ltrXQeL/APmf/wDsa4v/AG+rn/D3/ID8Wf8AYKj/APS21roPF/8AzP8A/wBjXF/7fUAFz/yV7xd/3HP/AEnua8/r0C5/5K94u/7jn/pPc15/QAV6Bbf8le8I/wDcD/8ASe2rz+vQLb/kr3hH/uB/+k9tQAeEP+ZA/wCxrl/9saPE3/Isah/3L3/ptlo8If8AMgf9jXL/AO2NHib/AJFjUP8AuXv/AE2y0Aef0UUUAFFFFAHQeMv+Q5bf9grTf/SKGufroPGX/Ictv+wVpv8A6RQ1z9ABRRRQAV0HiH/kB+E/+wVJ/wClt1XP10HiH/kB+E/+wVJ/6W3VAHP0UUUAdB4h/wCQH4T/AOwVJ/6W3Vc/XQeIf+QH4T/7BUn/AKW3Vc/QAUUUUAFFFFAHQeDf+Q5c/wDYK1L/ANIpq5+ug8G/8hy5/wCwVqX/AKRTVz9ABXQeDf8AkOXP/YK1L/0imrn66Dwb/wAhy5/7BWpf+kU1AHP0UUUAFFFFABXQeMv+Q5bf9grTf/SKGufroPGX/Ictv+wVpv8A6RQ0Ac/RRRQAV0HgT/kofhr/ALCtr/6NWufroPAn/JQ/DX/YVtf/AEatAHQad/zLn/Yqar/7kKP+ZI/7lT/3NUad/wAy5/2Kmq/+5Cj/AJkj/uVP/c1QBz/iH/kB+E/+wVJ/6W3VHjL/AJDlt/2CtN/9IoaPEP8AyA/Cf/YKk/8AS26o8Zf8hy2/7BWm/wDpFDQBz9dB4e/5Afiz/sFR/wDpba1z9dB4e/5Afiz/ALBUf/pba0AF5/yTzRv+wrf/APoq0r0DVf8AkOar/wBhXxX/AOkSV5/ef8k80b/sK3//AKKtK9A1X/kOar/2FfFf/pElAHn/AIy/5Dlt/wBgrTf/AEihrn66Dxl/yHLb/sFab/6RQ1z9ABRRRQAV0Fn/AMk81n/sK2H/AKKu65+ugs/+Seaz/wBhWw/9FXdAHP0UUUAdB47/AOSh+Jf+wrdf+jWrn66Dx3/yUPxL/wBhW6/9GtXP0AFdB4h/5AfhP/sFSf8ApbdVz9dB4h/5AfhP/sFSf+lt1QBz9FFFAHQeIf8AkB+E/wDsFSf+lt1XP10HiH/kB+E/+wVJ/wClt1XP0AdB4E/5KH4a/wCwra/+jVr0Dw1/yA/A3/YV0r/0t1OvP/An/JQ/DX/YVtf/AEategeGv+QH4G/7Culf+lup0Ac/p3/Muf8AYqar/wC5Cufs/wDknms/9hWw/wDRV3XQad/zLn/Yqar/AO5Cufs/+Seaz/2FbD/0Vd0Ac/RRRQB6B/zcL/3Nf/t3R4Q/5kD/ALGuX/2xo/5uF/7mv/27o8If8yB/2Ncv/tjQBz/iH/kB+E/+wVJ/6W3Vc/XQeIf+QH4T/wCwVJ/6W3Vc/QAUUUUAdB47/wCSh+Jf+wrdf+jWrn66Dx3/AMlD8S/9hW6/9GtXP0AFFFFABXQeMv8AkOW3/YK03/0ihrn66Dxl/wAhy2/7BWm/+kUNAHP0UUUAFFFFAHQeHv8AkB+LP+wVH/6W2tdB4v8A+Z//AOxri/8Ab6uf8Pf8gPxZ/wBgqP8A9LbWug8X/wDM/wD/AGNcX/t9QAXP/JXvF3/cc/8ASe5rz+vQLn/kr3i7/uOf+k9zXn9ABXoFt/yV7wj/ANwP/wBJ7avP69Atv+SveEf+4H/6T21AB4Q/5kD/ALGuX/2xo8Tf8ixqH/cvf+m2Wjwh/wAyB/2Ncv8A7Y0eJv8AkWNQ/wC5e/8ATbLQB5/RRRQAUUUUAdB4y/5Dlt/2CtN/9Ioa5+ug8Zf8hy2/7BWm/wDpFDXP0AFFFFABXQeIf+QH4T/7BUn/AKW3Vc/XQeIf+QH4T/7BUn/pbdUAc/RRRQB0HiH/AJAfhP8A7BUn/pbdVz9dB4h/5AfhP/sFSf8ApbdVz9ABRRRQAUUUUAdB4N/5Dlz/ANgrUv8A0imrn66Dwb/yHLn/ALBWpf8ApFNXP0AFdB4N/wCQ5c/9grUv/SKaufroPBv/ACHLn/sFal/6RTUAc/RRRQAUUUUAFdB4y/5Dlt/2CtN/9Ioa5+ug8Zf8hy2/7BWm/wDpFDQBz9FFFABXQeBP+Sh+Gv8AsK2v/o1a5+ug8Cf8lD8Nf9hW1/8ARq0AdBp3/Muf9ipqv/uQo/5kj/uVP/c1Rp3/ADLn/Yqar/7kKP8AmSP+5U/9zVAHP+If+QH4T/7BUn/pbdUeMv8AkOW3/YK03/0iho8Q/wDID8J/9gqT/wBLbqjxl/yHLb/sFab/AOkUNAHP10Hh7/kB+LP+wVH/AOltrXP10Hh7/kB+LP8AsFR/+ltrQAXn/JPNG/7Ct/8A+irSvQNV/wCQ5qv/AGFfFf8A6RJXn95/yTzRv+wrf/8Aoq0r0DVf+Q5qv/YV8V/+kSUAef8AjL/kOW3/AGCtN/8ASKGufroPGX/Ictv+wVpv/pFDXP0AFFFFABXQWf8AyTzWf+wrYf8Aoq7rn66Cz/5J5rP/AGFbD/0Vd0Ac/RRRQB0Hjv8A5KH4l/7Ct1/6NaufroPHf/JQ/Ev/AGFbr/0a1c/QAV0HiH/kB+E/+wVJ/wClt1XP17BZfCDxB408HeF9R0680yKGPT3iK3Esitk3M8n8KHjEg/HNAHj9Fewf8M4+MP8AoJaH/wB/5v8A41R/wzj4w/6CWh/9/wCb/wCNUAef+If+QH4T/wCwVJ/6W3Vc/XX/ABB0p/Dt9pPh24uYJ73StP8AIujBuKK7zzTAAsoz8kqHp3x2rkKAOg8Cf8lD8Nf9hW1/9GrXoHhr/kB+Bv8AsK6V/wClup15/wCBP+Sh+Gv+wra/+jVr0Dw1/wAgPwN/2FdK/wDS3U6AOf07/mXP+xU1X/3IVz9n/wAk81n/ALCth/6Ku66DTv8AmXP+xU1X/wByFc/Z/wDJPNZ/7Cth/wCirugDn6KKKAPQP+bhf+5r/wDbujwh/wAyB/2Ncv8A7Y0f83C/9zX/AO3dHhD/AJkD/sa5f/bGgDn/ABD/AMgPwn/2CpP/AEtuq5+ug8Q/8gPwn/2CpP8A0tuq5+gAooooA6Dx3/yUPxL/ANhW6/8ARrVz9dB47/5KH4l/7Ct1/wCjWrn6ACiiigAroPGX/Ictv+wVpv8A6RQ1z9dB4y/5Dlt/2CtN/wDSKGgDn6KKKACiiigDoPD3/ID8Wf8AYKj/APS21roPF/8AzP8A/wBjXF/7fVz/AIe/5Afiz/sFR/8Apba10Hi//mf/APsa4v8A2+oALn/kr3i7/uOf+k9zXn9egXP/ACV7xd/3HP8A0nua8/oAK9Atv+SveEf+4H/6T21ef16Bbf8AJXvCP/cD/wDSe2oAPCH/ADIH/Y1y/wDtjR4m/wCRY1D/ALl7/wBNstHhD/mQP+xrl/8AbGjxN/yLGof9y9/6bZaAPP6KKKACiiigDoPGX/Ictv8AsFab/wCkUNc/XQeMv+Q5bf8AYK03/wBIoa5+gAooooAK6DxD/wAgPwn/ANgqT/0tuq5+vYLL4QeIPGng7wvqOnXmmRQx6e8RW4lkVsm5nk/hQ8YkH45oA8for2D/AIZx8Yf9BLQ/+/8AN/8AGqP+GcfGH/QS0P8A7/zf/GqAPP8AxD/yA/Cf/YKk/wDS26rn67j4leG7zwjceHtDv5IJLq10o73gYlDuurhxgkA9GHauHoAKKKKACiiigDoPBv8AyHLn/sFal/6RTVz9dh8MtHuNe8YnTrV4kmn0+9iVpSQoL20kYzgHjLjPtmuw/wCGcfGH/QS0P/v/ADf/ABqgDx+ug8G/8hy5/wCwVqX/AKRTV6B/wzj4w/6CWh/9/wCb/wCNVYtvgp4k8I2+qa5f3ulSWtrpV/vSCWQud1rKgwDGB1Yd6APF6KKKACiiigAroPGX/Ictv+wVpv8A6RQ1z9dB4y/5Dlt/2CtN/wDSKGgDn6KKKACug8Cf8lD8Nf8AYVtf/Rq1z9dB4E/5KH4a/wCwra/+jVoA6DTv+Zc/7FTVf/chR/zJH/cqf+5qjTv+Zc/7FTVf/chR/wAyR/3Kn/uaoA5/xD/yA/Cf/YKk/wDS26o8Zf8AIctv+wVpv/pFDR4h/wCQH4T/AOwVJ/6W3VHjL/kOW3/YK03/ANIoaAOfroPD3/ID8Wf9gqP/ANLbWufroPD3/ID8Wf8AYKj/APS21oALz/knmjf9hW//APRVpXoGq/8AIc1X/sK+K/8A0iSvP7z/AJJ5o3/YVv8A/wBFWlegar/yHNV/7Cviv/0iSgDz/wAZf8hy2/7BWm/+kUNc/XQeMv8AkOW3/YK03/0ihrn6ACiiigAroLP/AJJ5rP8A2FbD/wBFXdc/XQWf/JPNZ/7Cth/6Ku6AOfooooA6Dx3/AMlD8S/9hW6/9GtXP10Hjv8A5KH4l/7Ct1/6NaufoAK+y/hJ/wAkr8P/APXuf/Q2r40r7L+En/JK/D//AF7n/wBDagDtKKKKAPj741/8ld136wf+iI64Gu++Nf8AyV3XfrB/6IjrgaAOg8Cf8lD8Nf8AYVtf/Rq16B4a/wCQH4G/7Culf+lup15/4E/5KH4a/wCwra/+jVr0Dw1/yA/A3/YV0r/0t1OgDn9O/wCZc/7FTVf/AHIVz9n/AMk81n/sK2H/AKKu66DTv+Zc/wCxU1X/ANyFc/Z/8k81n/sK2H/oq7oA5+iiigD0D/m4X/ua/wD27o8If8yB/wBjXL/7Y0f83C/9zX/7d0eEP+ZA/wCxrl/9saAOf8Q/8gPwn/2CpP8A0tuq5+ug8Q/8gPwn/wBgqT/0tuq5+gAooooA6Dx3/wAlD8S/9hW6/wDRrVz9dB47/wCSh+Jf+wrdf+jWrn6ACiiigAroPGX/ACHLb/sFab/6RQ1z9dB4y/5Dlt/2CtN/9IoaAOfooooAKKKKAOg8Pf8AID8Wf9gqP/0tta6Dxf8A8z//ANjXF/7fVz/h7/kB+LP+wVH/AOltrXQeL/8Amf8A/sa4v/b6gAuf+SveLv8AuOf+k9zXn9egXP8AyV7xd/3HP/Se5rz+gAr0C2/5K94R/wC4H/6T21ef16Bbf8le8I/9wP8A9J7agA8If8yB/wBjXL/7Y0eJv+RY1D/uXv8A02y0eEP+ZA/7GuX/ANsaPE3/ACLGof8Acvf+m2WgDz+iiigAooooA6Dxl/yHLb/sFab/AOkUNc/XQeMv+Q5bf9grTf8A0ihrn6ACiiigAr7L+En/ACSvw/8A9e5/9DavjSvsv4Sf8kr8P/8AXuf/AENqAO0ooooA+YP2jv8Akoen/wDYKj/9Gy14/XsH7R3/ACUPT/8AsFR/+jZa8foAKKKKACiiigD0v4Df8lUsv+veb/0A19aV8l/Ab/kqll/17zf+gGvrSgArn/Hf/JPPEv8A2Crr/wBFNXQVz/jv/knniX/sFXX/AKKagD4gooooAKKKKACug8Zf8hy2/wCwVpv/AKRQ1z9dB4y/5Dlt/wBgrTf/AEihoA5+iiigAroPAn/JQ/DX/YVtf/Rq1z9dB4E/5KH4a/7Ctr/6NWgDoNO/5lz/ALFTVf8A3IUf8yR/3Kn/ALmqNO/5lz/sVNV/9yFH/Mkf9yp/7mqAOf8AEP8AyA/Cf/YKk/8AS26o8Zf8hy2/7BWm/wDpFDR4h/5AfhP/ALBUn/pbdUeMv+Q5bf8AYK03/wBIoaAOfroPD3/ID8Wf9gqP/wBLbWufroPD3/ID8Wf9gqP/ANLbWgAvP+SeaN/2Fb//ANFWlegar/yHNV/7Cviv/wBIkrz+8/5J5o3/AGFb/wD9FWlegar/AMhzVf8AsK+K/wD0iSgDz/xl/wAhy2/7BWm/+kUNc/XQeMv+Q5bf9grTf/SKGufoAKKKKACugs/+Seaz/wBhWw/9FXdc/XQWf/JPNZ/7Cth/6Ku6AOfooooA6Dx3/wAlD8S/9hW6/wDRrVz9dB47/wCSh+Jf+wrdf+jWrn6ACvsv4Sf8kr8P/wDXuf8A0Nq+NK+y/hJ/ySvw/wD9e5/9DagDtKKKKAPj741/8ld136wf+iI64Gu++Nf/ACV3XfrB/wCiI64GgDoPAn/JQ/DX/YVtf/Rq16B4a/5Afgb/ALCulf8Apbqdef8AgT/kofhr/sK2v/o1a9A8Nf8AID8Df9hXSv8A0t1OgDn9O/5lz/sVNV/9yFc/Z/8AJPNZ/wCwrYf+iruug07/AJlz/sVNV/8AchXP2f8AyTzWf+wrYf8Aoq7oA5+iiigD0D/m4X/ua/8A27o8If8AMgf9jXL/AO2NH/Nwv/c1/wDt3R4Q/wCZA/7GuX/2xoA5/wAQ/wDID8J/9gqT/wBLbqufroPEP/ID8J/9gqT/ANLbqufoAKKKKAOg8d/8lD8S/wDYVuv/AEa1c/XQeO/+Sh+Jf+wrdf8Ao1q5+gAooooAK6Dxl/yHLb/sFab/AOkUNc/XQeMv+Q5bf9grTf8A0ihoA5+iiigAooooA6Dw9/yA/Fn/AGCo/wD0tta6Dxf/AMz/AP8AY1xf+31c/wCHv+QH4s/7BUf/AKW2tdB4v/5n/wD7GuL/ANvqAC5/5K94u/7jn/pPc15/XoFz/wAle8Xf9xz/ANJ7mvP6ACvQLb/kr3hH/uB/+k9tXn9egW3/ACV7wj/3A/8A0ntqADwh/wAyB/2Ncv8A7Y0eJv8AkWNQ/wC5e/8ATbLR4Q/5kD/sa5f/AGxo8Tf8ixqH/cvf+m2WgDz+iiigAooooA6Dxl/yHLb/ALBWm/8ApFDXP10HjL/kOW3/AGCtN/8ASKGufoAKKKKACvsv4Sf8kr8P/wDXuf8A0Nq+NK+y/hJ/ySvw/wD9e5/9DagDtKKKKAPmD9o7/koen/8AYKj/APRsteP17B+0d/yUPT/+wVH/AOjZa8foAKKKKACiiigD0v4Df8lUsv8Ar3m/9ANfWlfJfwG/5KpZf9e83/oBr60oAK5/x3/yTzxL/wBgq6/9FNXQVz/jv/knniX/ALBV1/6KagD4gooooAKKKKACug8Zf8hy2/7BWm/+kUNc/XQeMv8AkOW3/YK03/0ihoA5+iiigAroPAn/ACUPw1/2FbX/ANGrXP10HgT/AJKH4a/7Ctr/AOjVoA6DTv8AmXP+xU1X/wByFH/Mkf8Acqf+5qjTv+Zc/wCxU1X/ANyFH/Mkf9yp/wC5qgDn/EP/ACA/Cf8A2CpP/S26o8Zf8hy2/wCwVpv/AKRQ0eIf+QH4T/7BUn/pbdUeMv8AkOW3/YK03/0ihoA5+ug8Pf8AID8Wf9gqP/0tta5+ug8Pf8gPxZ/2Co//AEttaAC8/wCSeaN/2Fb/AP8ARVpXoGq/8hzVf+wr4r/9Ikrz+8/5J5o3/YVv/wD0VaV6Bqv/ACHNV/7Cviv/ANIkoA8/8Zf8hy2/7BWm/wDpFDXP10HjL/kOW3/YK03/ANIoa5+gAooooAK6Cz/5J5rP/YVsP/RV3XP10Fn/AMk81n/sK2H/AKKu6AOfooooA6Dx3/yUPxL/ANhW6/8ARrVz9dB47/5KH4l/7Ct1/wCjWrn6ACvsv4Sf8kr8P/8AXuf/AENq+NK+y/hJ/wAkr8P/APXuf/Q2oA7SiiigD4++Nf8AyV3XfrB/6Ijrga7741/8ld136wf+iI64GgDoPAn/ACUPw1/2FbX/ANGrXoHhr/kB+Bv+wrpX/pbqdef+BP8Akofhr/sK2v8A6NWvQPDX/ID8Df8AYV0r/wBLdToA5/Tv+Zc/7FTVf/chXP2f/JPNZ/7Cth/6Ku66DTv+Zc/7FTVf/chXP2f/ACTzWf8AsK2H/oq7oA5+iiigD0D/AJuF/wC5r/8Abujwh/zIH/Y1y/8AtjR/zcL/ANzX/wC3dHhD/mQP+xrl/wDbGgDn/EP/ACA/Cf8A2CpP/S26rn66DxD/AMgPwn/2CpP/AEtuq5+gAooooA6Dx3/yUPxL/wBhW6/9GtXP10Hjv/kofiX/ALCt1/6NaufoAKKKKACug8Zf8hy2/wCwVpv/AKRQ1z9dB4y/5Dlt/wBgrTf/AEihoA5+iiigAooooA6Dw9/yA/Fn/YKj/wDS21roPF//ADP/AP2NcX/t9XP+Hv8AkB+LP+wVH/6W2tdB4v8A+Z//AOxri/8Ab6gAuf8Akr3i7/uOf+k9zXn9egXP/JXvF3/cc/8ASe5rz+gAr0C2/wCSveEf+4H/AOk9tXn9egW3/JXvCP8A3A//AEntqADwh/zIH/Y1y/8AtjR4m/5FjUP+5e/9NstHhD/mQP8Asa5f/bGjxN/yLGof9y9/6bZaAPP6KKKACiiigDoPGX/Ictv+wVpv/pFDXP10HjL/AJDlt/2CtN/9Ioa5+gAooooAK+y/hJ/ySvw//wBe5/8AQ2r40r7L+En/ACSvw/8A9e5/9DagDtKKKKAPmD9o7/koen/9gqP/ANGy14/XsH7R3/JQ9P8A+wVH/wCjZa8foAKKKKACiiigD0v4Df8AJVLL/r3m/wDQDX1pXyX8Bv8Akqll/wBe83/oBr60oAK5/wAd/wDJPPEv/YKuv/RTV0Fc/wCO/wDknniX/sFXX/opqAPiCiiigAooooAK6Dxl/wAhy2/7BWm/+kUNc/XQeMv+Q5bf9grTf/SKGgDn6KKKACug8Cf8lD8Nf9hW1/8ARq1z9dB4E/5KH4a/7Ctr/wCjVoA6DTv+Zc/7FTVf/chR/wAyR/3Kn/uao07/AJlz/sVNV/8AchR/zJH/AHKn/uaoA5/xD/yA/Cf/AGCpP/S26o8Zf8hy2/7BWm/+kUNHiH/kB+E/+wVJ/wClt1R4y/5Dlt/2CtN/9IoaAOfroPD3/ID8Wf8AYKj/APS21rn66Dw9/wAgPxZ/2Co//S21oALz/knmjf8AYVv/AP0VaV6Bqv8AyHNV/wCwr4r/APSJK8/vP+SeaN/2Fb//ANFWlegar/yHNV/7Cviv/wBIkoA8/wDGX/Ictv8AsFab/wCkUNc/XQeMv+Q5bf8AYK03/wBIoa5+gAooooAK6Cz/AOSeaz/2FbD/ANFXdc/XQWf/ACTzWf8AsK2H/oq7oA5+iiigDoPHf/JQ/Ev/AGFbr/0a1c/XQeO/+Sh+Jf8AsK3X/o1q5+gAr7L+En/JK/D/AP17n/0Nq+NK+y/hJ/ySvw//ANe5/wDQ2oA7SiiigD4++Nf/ACV3XfrB/wCiI64Gu++Nf/JXdd+sH/oiOuBoA6DwJ/yUPw1/2FbX/wBGrXoHhr/kB+Bv+wrpX/pbqdef+BP+Sh+Gv+wra/8Ao1a9A8Nf8gPwN/2FdK/9LdToA5/Tv+Zc/wCxU1X/ANyFc/Z/8k81n/sK2H/oq7rt/DnhbXdXj8NS2Gk3U0LeG9Rt/O8srGJHa+VFLnCgkunU/wAQPSr+jfBDxlc+EtS026isrC4nvbW4j+03AYFY0uFYZjD85lX9aAPGaK9g/wCGcfGH/QS0P/v/ADf/ABqj/hnHxh/0EtD/AO/83/xqgDn/APm4X/ua/wD27o8If8yB/wBjXL/7Y12T/CvxivxkGvDSlbTDr4vTOLmLiH7RvztLbvu84xmua0LR9T0W48AW+qadd2Mx8UyMI7mFo2Kk2QBAYDIyDz7GgDkvEP8AyA/Cf/YKk/8AS26rn66DxD/yA/Cf/YKk/wDS26rn6ACiiigDoPHf/JQ/Ev8A2Fbr/wBGtXP10Hjv/kofiX/sK3X/AKNaufoAKKKKACug8Zf8hy2/7BWm/wDpFDXP10HjL/kOW3/YK03/ANIoaAOfooooAKKKKAOg8Pf8gPxZ/wBgqP8A9LbWug8X/wDM/wD/AGNcX/t9XP8Ah7/kB+LP+wVH/wCltrXY61oGr65cePINL0y7vJW8UxsFhiLcA3oJyOwLLk+49aAM65/5K94u/wC45/6T3Nef17unwm8XXXxK8Q6o9lBb2F6+prDPLcIQRPFMkbEKSwGZFzxkDtWR/wAM4+MP+glof/f+b/41QB4/XoFt/wAle8I/9wP/ANJ7aug/4Zx8Yf8AQS0P/v8Azf8AxqtVvhP4vtfib4f1JdPin0+xbTFmuYrlAoEEUKSEKxDEZRscZI7UAcV4Q/5kD/sa5f8A2xo8Tf8AIsah/wBy9/6bZau6Ho2p6Lc+ALfVNOurKY+KZGEdzC0ZKk2QBAI5GQefY1S8Tf8AIsah/wBy9/6bZaAPP6KKKACiiigDoPGX/Ictv+wVpv8A6RQ1z9dB4y/5Dlt/2CtN/wDSKGufoAKKKKACvsv4Sf8AJK/D/wD17n/0Nq+NK+y/hJ/ySvw//wBe5/8AQ2oA7SiiigD5g/aO/wCSh6f/ANgqP/0bLXj9ewftHf8AJQ9P/wCwVH/6Nlrx+gAooooAKKKKAPS/gN/yVSy/695v/QDX1pXyX8Bv+SqWX/XvN/6Aa+tKACuf8d/8k88S/wDYKuv/AEU1dBXP+O/+SeeJf+wVdf8AopqAPiCiiigAooooAK6Dxl/yHLb/ALBWm/8ApFDXP10HjL/kOW3/AGCtN/8ASKGgDn6KKKACug8Cf8lD8Nf9hW1/9GrXP10HgT/kofhr/sK2v/o1aAOg07/mXP8AsVNV/wDchR/zJH/cqf8Auao07/mXP+xU1X/3IVZsdNvtU8IpbafZXF3O/hbCRQRM7Mf7YJwABnoCfoDQBy3iH/kB+E/+wVJ/6W3VHjL/AJDlt/2CtN/9Ioa7W7+EvjbWdG8NC20Vk+z6e8M3nzJEY3N1O+CrMG+66np3rc1v4C+K9Yvbe7ivNIhAsLOBo5ppNyvFbxxt92Mj7yHHPTFAHh1dB4e/5Afiz/sFR/8Apba16B/wzj4w/wCglof/AH/m/wDjVXbX4E+LtI0TX0EumXk17Ypbww287BiwuYZDkuqgDbG3f0oA8yvP+SeaN/2Fb/8A9FWlegar/wAhzVf+wr4r/wDSJKyNc+G/jLTfBekWM3h69kuV1C8maO1QXG1HjtgpPllsZKP19K19V/5Dmq/9hXxX/wCkSUAef+Mv+Q5bf9grTf8A0ihrn66Dxl/yHLb/ALBWm/8ApFDXP0AFFFFABXQWf/JPNZ/7Cth/6Ku65+ugs/8Aknms/wDYVsP/AEVd0Ac/RRRQB0Hjv/kofiX/ALCt1/6NaufroPHf/JQ/Ev8A2Fbr/wBGtXP0AFfZfwk/5JX4f/69z/6G1fGlfZfwk/5JX4f/AOvc/wDobUAdpRRRQB8e/Gk7vi5rp/2oR/5Bjrgq7b4subn4r69sBZjcKgAGSSEVcfpXsHwp+DEGjwwa74mt1m1JgHgs5Blbf0LDu/t0H16AHD/Cz4SeIdQ1rSvEd6g07T7S5iuo/PU+ZPsYMAq9gcdTjrkA1794e8DaD4b02zsrW0E/2QKIproCSQFXkdWzjAYNNLggD7xro6KACiiigAooooAKKKKAPN/G3wZ8P+LIIGtP+JRdWsPk2/2WNRCq7mfBjGB952ORg896+cPGXgDXvA94ItVts27nEN3F80Un0PY+xwa+16qanpdjrWnTafqVrHc2k67ZIpBkEf0PoRyKAPguiu/+KPw2uPAWrrJAXn0a6Y/Zp26oevlv/tDse4/HHAUAdB47/wCSh+Jf+wrdf+jWrn66Dx3/AMlD8S/9hW6/9GtXP0AFFFFABXQeMv8AkOW3/YK03/0ihrn66Dxl/wAhy2/7BWm/+kUNAHP0UUqqWYKoJJOAB3oASu98EfCXxF412XMcYsdMJ/4/LhThh/sL1f8AQe9ekfC74HxxRw654ut98pw8GmuOE9DKO5/2e3f0HvKqqIERQqqMAAYAFAHB+EPhD4X8JwS4tzqNxPEIp5b0B1dQyvgR/dA3IpHBIIHNd7RRQAUUUUAFFFFABXnvjL4SaL4l0e5ttPxpV1NJbyGWNSyN5ETRRKUzgKFcj5cdutehUUAfE3jDwDr/AIIvBFq1p+4c4iuovmik+jdj7HBrma+9tQ06z1awmsdQtorm1mXbJFKuVYV8u/FX4RT+DnfV9IElxobt8wPL2pPQN6r6N+B7EgHldFFFAHQeMv8AkOW3/YK03/0ihrn66Dxl/wAhy2/7BWm/+kUNc/QAUUUUAFfZfwk/5JX4f/69z/6G1fGlfZfwk/5JX4f/AOvc/wDobUAdpRRRQB8wftHf8lD0/wD7BUf/AKNlrx+vYP2jv+Sh6f8A9gqP/wBGy14/QAUUUUAFFFFAHpfwG/5KpZf9e83/AKAa+tK+S/gN/wAlUsv+veb/ANANfWlABXP+O/8AknniX/sFXX/opq6Cuf8AHf8AyTzxL/2Crr/0U1AHxBRRRQAUUUUAFdB4y/5Dlt/2CtN/9Ioa5+ug8Zf8hy2/7BWm/wDpFDQBz9FFKiNI6oilmY4CgZJPpQAlej/Cr4f+Itc8TaRrcFkYtLsr2G4e5n+RXCOGITux4I44z1Irv/hl8DIoo4dZ8XwCSU4eHTW+6noZfU/7PT1z0Hu6IkUaxxoqIoCqqjAAHQAUAcJ4b+E3h/QodMe7U6neWFnJZpLMMRskjys4MeSDkTOuDniu4tbW3srZLa0git4IxhIokCKo9gOBUtFABRRRQAUUUUAFZ+qaHpetRGPUrCC5/dSwq7p86JIuyQK33l3KcHBFaFFAHhXxE+BE+qXb6p4ZuowywRQrp85IASKNY1CSEnnag+9+deA6ppV/ot/JY6nZzWl1GfmilXaR7+49+lfedc94t8FaJ410w2er2odlB8q4TiWE+qt/Toe4oA+IaK7Dx98O9W8A6mIrsefYSk/ZrxFwsnsf7re35Zrj6ACugs/+Seaz/wBhWw/9FXdc/XQWf/JPNZ/7Cth/6Ku6AOfooooA6Dx3/wAlD8S/9hW6/wDRrVz9dB47/wCSh+Jf+wrdf+jWrn6ACvsv4Sf8kr8P/wDXuf8A0Nq+NK+y/hJ/ySvw/wD9e5/9DagDtKKKKAPG/A/w+kvviV4h8Za5ZyRompTDToZ4ypb5ziXB7AY2++T2FeyUVl+IfEGneGNEuNW1ScRWsC5PdnPZVHcnsKAL9zc29lbSXN1PHBBGu55ZWCqo9STwK86uvjd4UR9UFk13ex6dbfaJZ4IQUOZY4gFDMu75pQewwDgmvn7x/wDErWPHl+3nyNbaYjZgsUb5V9C395vc9O2Ky/D3/ID8Wf8AYKj/APS21oA9x8U/G3U9Oi1/+zNKtkm0nV49NJupDKkqkXGXAUIVOYR1ZutchL8Z/F154Q1HUraW20+7h1C0hDwI0gZJI7hmG2ZnA5jX7oFc74v/AOZ//wCxri/9vq5+z/5J5rP/AGFbD/0Vd0AdB/wu34h/9DD/AOSVv/8AG69IT4z67b/EHW9DlsbF9PsX1FgU8wTMLeOV1AZnZVJ8sD7uOelfO9egXP8AyV7xd/3HP/Se5oA900n40aLdaPBfanZXVgXsDfybMTJHH9rNqPmGGJ3YbAXp6mvQNN1Ox1iwivtOuorq1lGUlibcp/8Ar+1fJf8AzJH/AHKn/uaqj8PfiFqXgPWVmhZ5tNlYC7tCeHH95fRh2P4HigD7NoqrpmpWmsaZbajYzLNa3MYkicdwf5H2q1QBj+KfDll4s8OXmjXy/urhMK+MmNx91x7g8/pXxLrGlXWh6xeaXepsubWVopB2yD1Hseo9jX3lXzX+0Z4cWz8R6fr8KYS/iMMxA/5aR4wT9VIH/AKAPNPHf/JQ/Ev/AGFbr/0a1c/XQeO/+Sh+Jf8AsK3X/o1q5+gAooooAK6Dxl/yHLb/ALBWm/8ApFDXP10HjL/kOW3/AGCtN/8ASKGgDn6+hfgf8Lkihg8Xa5Bulf59Pt5B90dpSPU/w+nXuMec/CPwL/wmvi5BdRk6VY4mu/R+flj/AOBEfkDX1+qqiBEUKqjAAGABQAtFFV76+tdNsZ729nSC2gQySyucBVHU0ASyyxwRPLNIscaAszucBQOpJ7CvM7z43eH28VaboGjRvqct3exWr3Ktshj3uFJBxl8Z7DB9a8W+JvxW1DxveSWVk8lroUbfu4AcNPjo0nr6heg9zzXMeBP+Sh+Gv+wra/8Ao1aAPbrP406lrVz4Xa10yG2g1XW2sZ455mlZFU2/KMgj/wCezcMG6enFeYH42fEJhg+IAR72Vv8A/G6Xwh/zIH/Y1y/+2Nef0Aer+Evi/wCOtS8Y6Hp93rnmWtzqFvDNH9kgXcjSKGGQgIyCeldv4G+Ner6wqLqml2TiTVbHTYvszPGU8/zcuxcvux5Y44zk814j4E/5KH4a/wCwra/+jVroPhx/y5/9jXo3/tzQB9AeB/i74d8aulojtYao3/LpcMPnP+w3Rvpwfau/r4BR2jdXRirqcqynBB9RX0v8GfixJ4hCeG9fn3ami/6LcsebhQOVb/bA5z3HuOQD2eo7i3hu7aW3uIklglUpJG4yrKRggjuKkooA+QPiv8PH8C+Id1qrNo94S9q552HvGT6jt6jHfNef19u+OPClt4z8J3mjzhRI677eUj/VSj7rf0PsTXxRd2s9jeT2lzG0VxBI0ciN1VlOCD+IoA2vGX/Ictv+wVpv/pFDXP10HjL/AJDlt/2CtN/9Ioa5+gAooooAK+y/hJ/ySvw//wBe5/8AQ2r40r7L+En/ACSvw/8A9e5/9DagDtKKKKAPmD9o7/koen/9gqP/ANGy14/XsH7R3/JQ9P8A+wVH/wCjZa8foAKKKKACiiigD0v4Df8AJVLL/r3m/wDQDX1pXyX8Bv8Akqll/wBe83/oBr60oAK5/wAd/wDJPPEv/YKuv/RTV0Fc/wCO/wDknniX/sFXX/opqAPiCiiigAooooAK6Dxl/wAhy2/7BWm/+kUNc/XQeMv+Q5bf9grTf/SKGgDn6+j/AIJ/CxNPtoPFeuW4N7KA9jbyD/UqekhH949vQc9Tx558F/Aa+L/FH22+i36TppWSVWHEsn8Ce44yfYY719Z0AFFFNd0jjaSRlVFBLMxwAB3NADq4Dxd8YfCnhKSS2e5bUL9ODbWeG2n0Zvur9Mk+1eTfFP40XWszz6L4ZuHt9LUlJbuM4e59dp6qn6n6cV4xQB9VeEPi5L4u1DRrY6SbNdTvruBWS4DGNbeGOX5gU+bdvI424xXBWPxz8Tatput3FxY6Yj2FitxEIfPjBY3EMWGxLyNsjHtyB9KpfB7/AJDngn/sK6v/AOkUFef+Hv8AkB+LP+wVH/6W2tAHZL8efE6NkWOn595bs/znr0fS/irr194+1vw61vYR2lhfJbxSJG5lKm/htzuLOQTskY9OuPpXzNXsHh7/AJLV4s/7Csf/AKd7WgDvov2gNMgXSJdV0W4toNRtTcb4JhMYsTyxYIIXI/dZyPXGOOfTdC8RaR4msBe6NqEN5B0JjPKn0ZTyp9iBXxp4h/5AfhP/ALBUn/pbdVT8P+I9V8L6pHqOj3kltcJ12n5XH91h0YexoA+66K4T4a/Eux8faYVKrbavbqDc2ueCP76eqn8x0PYnu6AM7XND0/xHo9xpeqW6z2k64ZT1B7EHsR1Br478f+B73wJ4jk064zLayZe0ucYEsf8ARh0I/oRX2rXJfEXwVb+OfCk+nsFW9jzLZzH+CQDgZ9D0P1z2FAHxbXQWf/JPNZ/7Cth/6Ku6xLm2ms7qa1uY2inhcxyRsMFWBwQfoa27P/knms/9hWw/9FXdAHP0UUUAdB47/wCSh+Jf+wrdf+jWrn66Dx3/AMlD8S/9hW6/9GtXP0AFfZfwk/5JX4f/AOvc/wDobV8aV9l/CT/klfh//r3P/obUAdpRRRQAV8n/ABr8dP4p8VyaZaSk6VpjmKMKeJZRw7+/PA9hnvX0N8R/ER8LeAdW1ON9twIvKtz3EjnapH0zn8K+KicnJ60AFdB4e/5Afiz/ALBUf/pba1z9dB4e/wCQH4s/7BUf/pba0AdB4v8A+Z//AOxri/8Ab6ufs/8Aknms/wDYVsP/AEVd10Hi/wD5n/8A7GuL/wBvq5+z/wCSeaz/ANhWw/8ARV3QBz9egXP/ACV7xd/3HP8A0nua8/r0C5/5K94u/wC45/6T3NAB/wAyR/3Kn/uarz+vQP8AmSP+5U/9zVef0AfRH7Ofil57PUPC9xJn7P8A6VagnohOHX6Bip/4Ea93r45+D2qNpXxS0V92EuJDbOPUOpUD/voqfwr7GoAK8z+POlDUfhhdXG3L2E8Vwvr97Yf0cn8K9Mrm/iDaC9+HfiKAjJOnzMB7qhYfqBQB8ieO/wDkofiX/sK3X/o1q5+ug8d/8lD8S/8AYVuv/RrVz9ABRRRQAV0HjL/kOW3/AGCtN/8ASKGufr1DQPDo8TfF/QbGRN9tHp2m3E4I42JZQsQfYkBfxoA93+E/hIeEfAlnbyx7b67H2m7JHIdhwp/3VwPqD613FFFABXzf8ffHr32pf8Ilp8xFrakPesp/1kvUJ9F6/U/7Ne7+Ldej8L+FNT1qXB+yQF0U9Gc8Iv4sQPxr4eurma9u5rq5kaSeZ2kkdurMTkk/iaAIq6DwJ/yUPw1/2FbX/wBGrXP10HgT/kofhr/sK2v/AKNWgDoPCH/Mgf8AY1y/+2Nef16B4Q/5kD/sa5f/AGxrz+gDoPAn/JQ/DX/YVtf/AEatdB8OP+XP/sa9G/8Abmuf8Cf8lD8Nf9hW1/8ARq10Hw4/5c/+xr0b/wBuaAPP6ms7u4sL2C8tZWiuIHWSKRTgqwOQR+NQ0UAfbvgbxRF4w8H6frKBVklTbOi/wSrww+meR7EV0VfPf7NuvMtzrHh6R/lZVvIVz0Iwj/nlPyr6EoAK+XP2gfDI0jxpFrEEe231WPe2BwJkwG/MFT9Sa+o68w+PWijVPhrPdquZtOnS4UjrtJ2MPphs/wDAaAPm/wAZf8hy2/7BWm/+kUNc/XQeMv8AkOW3/YK03/0ihrn6ACiiigAr7L+En/JK/D//AF7n/wBDavjSvsv4Sf8AJK/D/wD17n/0NqAO0ooooA+YP2jv+Sh6f/2Co/8A0bLXj9ewftHf8lD0/wD7BUf/AKNlrx+gAooooAKKKKAPS/gN/wAlUsv+veb/ANANfWlfJfwG/wCSqWX/AF7zf+gGvrSgArn/AB3/AMk88S/9gq6/9FNXQVz/AI7/AOSeeJf+wVdf+imoA+IKKKKACiiigArofGCs+vWqqCzHStNAAGST9igrnq9d8HeHh4h+MuipIm63stK068lGOMJZQbf/AB8pQB7x8OvCieDvBNhpZUC6K+ddMP4pm5b8uFHsorqqKKACvDfj94+extV8I6dMVnuUEl86nlYz92P/AIF1Ptjsa9n1PUbfSNKu9Rum229rC80h/wBlQSf5V8Oa9rNz4h16+1e8bM93M0rc8Lnoo9gMAewoAzqKKKAPYPg9/wAhzwT/ANhXV/8A0igrz/w9/wAgPxZ/2Co//S21r0D4Pf8AIc8E/wDYV1f/ANIoK8/8Pf8AID8Wf9gqP/0ttaAOfr2Dw9/yWrxZ/wBhWP8A9O9rXj9eweHv+S1eLP8AsKx/+ne1oA8/8Q/8gPwn/wBgqT/0tuq5+ug8Q/8AID8J/wDYKk/9LbqufoA0tA12/wDDWuWur6bKY7m3fcvow7qfUEcGvtTwr4js/Fnhqy1qyOI7hMshOTG44ZT7g5H618M17d+zr4qa01u88MzyfubxTcW4J6SqPmA+q8/8AoA+kaKKKAPmb9oPwiNL8RW/iO1j22+pDZPgcLOo6/8AAl5+qsa85s/+Seaz/wBhWw/9FXdfV/xQ8OjxN8PNVslTdcRRG5t+OfMT5gB7kAr/AMCr5Qs/+Seaz/2FbD/0Vd0Ac/RRRQB0Hjv/AJKH4l/7Ct1/6NaufroPHf8AyUPxL/2Fbr/0a1c/QAV9l/CT/klfh/8A69z/AOhtXxpX2X8JP+SV+H/+vc/+htQB2lFFFAHhn7SerGLRdE0hW/4+J3uHA9EUKM/99n8q+c69f/aLvTP4+srUH5bfT04/2mdyf0215BQAV0Hh7/kB+LP+wVH/AOltrXP10Hh7/kB+LP8AsFR/+ltrQB0Hi/8A5n//ALGuL/2+rn7P/knms/8AYVsP/RV3XQeL/wDmf/8Asa4v/b6ufs/+Seaz/wBhWw/9FXdAHP16Bc/8le8Xf9xz/wBJ7mvP69Auf+SveLv+45/6T3NAB/zJH/cqf+5qvP69A/5kj/uVP/c1Xn9AGv4UnNt4w0SdTgxX8Dj8JFNfdFfCGg/8jFpn/X3F/wChivu+gArN8RIJPDOqoejWcw/NDWlVDXP+Rf1L/r1l/wDQDQB8X+O/+Sh+Jf8AsK3X/o1q5+ug8d/8lD8S/wDYVuv/AEa1c/QAUUUUAFfTnwd0cHxHqetuvK6RpVpE31s4Wf8AklfMdfaPw1sFs/BOmzgc3tnZzn8LSGP/ANp0AddRRRQB4t+0drJtfCumaQjYa+uTK4HdIx0/76dT+FfNNew/tGX5n8dWNkDlLawU49Gd2J/QLXj1ABXQeBP+Sh+Gv+wra/8Ao1a5+ug8Cf8AJQ/DX/YVtf8A0atAHQeEP+ZA/wCxrl/9sa8/r0Dwh/zIH/Y1y/8AtjXn9AHQeBP+Sh+Gv+wra/8Ao1a6D4cf8uf/AGNejf8AtzXP+BP+Sh+Gv+wra/8Ao1a6D4cf8uf/AGNejf8AtzQB5/RRRQB3vwY1E6d8VNHO7CXDPbuPXchA/wDHttfYVfD3gec23j7w9MDjbqVuT9PMXP6V9w0AFZPinThq3hPV9PK5NzZyxD6lCB+uK1qKAPiDxl/yHLb/ALBWm/8ApFDXP11XxGtxZ+MpLYDAhsbGPH0tIRXK0AFFFFABX2X8JP8Aklfh/wD69z/6G1fGlfZfwk/5JX4f/wCvc/8AobUAdpRRRQB8wftHf8lD0/8A7BUf/o2WvH69g/aO/wCSh6f/ANgqP/0bLXj9ABRRRQAUUUUAel/Ab/kqll/17zf+gGvrSvkv4Df8lUsv+veb/wBANfWlABXP+O/+SeeJf+wVdf8Aopq6Cuf8d/8AJPPEv/YKuv8A0U1AHxBRRRQAUUUUAFfU3wd0gLe6nrTLzJp2lWsbem2xhZv/AEJPyr5Zr7W+Hdmlt4E0aVet1YWkrfUW0SfyQUAdTRRRQB5Z8ftbOl/Do2UbYl1K4SA467B87f8AoIH/AAKvlOvcf2lNRMmu6HpgbiC2e4I/322/+0zXh1ABRRRQB7B8Hv8AkOeCf+wrq/8A6RQV5/4e/wCQH4s/7BUf/pba16B8Hv8AkOeCf+wrq/8A6RQV5/4e/wCQH4s/7BUf/pba0Ac/XsHh7/ktXiz/ALCsf/p3ta8fr2Dw9/yWrxZ/2FY//Tva0Aef+If+QH4T/wCwVJ/6W3Vc/XQeIf8AkB+E/wDsFSf+lt1XP0AFa3hfWX8PeKdL1dCR9kuUkYDuoPzD8RkfjWTRQB9/IyuiuhDKwyCOhFLXM/DzUTq3w70C8ZtztZRo59WUbSfzU101ABXx54n0caBYeMdLVdsdv4gtFjH+x5d4V/8AHSK+w6+cPjlp4sr3X5wMfbbvSp/riG8j/wDadAHh9FFFAHQeO/8AkofiX/sK3X/o1q5+ug8d/wDJQ/Ev/YVuv/RrVz9ABX2X8JP+SV+H/wDr3P8A6G1fGlfZfwk/5JX4f/69z/6G1AHaUUUUAfI/x1mMvxY1NM/6qKBB/wB+lb+tecV3/wAazn4u679YP/REdcBQAV0Hh7/kB+LP+wVH/wCltrXP10Hh7/kB+LP+wVH/AOltrQB0Hi//AJn/AP7GuL/2+rn7P/knms/9hWw/9FXddB4v/wCZ/wD+xri/9vq5+z/5J5rP/YVsP/RV3QBz9egXP/JXvF3/AHHP/Se5rz+vQLn/AJK94u/7jn/pPc0AH/Mkf9yp/wC5qvP69A/5kj/uVP8A3NV5/QBoaD/yMOmf9fcX/oYr7vr4Q0H/AJGHTP8Ar7i/9DFfd9ABVDXP+Rf1L/r1l/8AQDV+qGuf8i/qX/XrL/6AaAPi/wAd/wDJQ/Ev/YVuv/RrVz9dB47/AOSh+Jf+wrdf+jWrn6ACiiigAr7f8Cf8k88Nf9gq1/8ARS18QV9y+DoxF4I0CMdE023X8o1oA2qKKKAOd1fwJ4X1/UGv9V0W2u7plCmWQHJA6DrVH/hVXgX/AKFmx/75P+NdhRQBx/8AwqrwL/0LNj/3yf8AGprT4a+DLC9gvLXw9ZxXEEiyxSKDlHU5BHPYiuqooAx4fCfhu3+z+R4f0qL7NKZ4NllGvlSHbl1wPlb5F5HPyj0FV/8AhBPB/wD0Kmh/+C6H/wCJroKKAMODwX4VtbiK4t/DWjQzxOHjkjsIlZGByCCFyCDzmpLbwn4bs9v2Xw/pUG2VJx5VlGuJEzsfgfeXc2D1GTjrWxRQBx//AAqrwL/0LNj/AN8n/Gj/AIVV4F/6Fmx/75P+NdhRQBydv8MvBVpcxXMHh2yjmicSRuAcqwOQevrXWUUUAFFFFAHxx8XlC/E3U1HQRWo/8loq4eu5+MH/ACVDVf8Arla/+k0VcNQAUUUUAFfZfwk/5JX4f/69z/6G1fGlfZfwk/5JX4f/AOvc/wDobUAdpRRRQB8wftHf8lD0/wD7BUf/AKNlrx+vYP2jv+Sh6f8A9gqP/wBGy14/QAUUUUAFFFFAHpfwG/5KpZf9e83/AKAa+tK+S/gN/wAlUsv+veb/ANANfWlABXP+O/8AknniX/sFXX/opq6Cuf8AHf8AyTzxL/2Crr/0U1AHxBRRRQAUUUUAFfb/AIE/5J74a/7BVr/6KWviCvubwigj8F6Eg6Lp1uP/ACGtAGzRRRQB8n/H25M/xRuIyf8Aj3tYYx7ZG7/2avMK7/42OX+Lmue3kAf9+I64CgAooooA9g+D3/Ic8E/9hXV//SKCvP8Aw9/yA/Fn/YKj/wDS21r0D4Pf8hzwT/2FdX/9IoK8/wDD3/ID8Wf9gqP/ANLbWgDn69g8Pf8AJavFn/YVj/8ATva14/XsHh7/AJLV4s/7Csf/AKd7WgDz/wAQ/wDID8J/9gqT/wBLbqufroPEP/ID8J/9gqT/ANLbqufoAKKKKAPrb4E3JuPhTp8ZOfImmj/8iFv/AGavSa8m/Z4ct8Npgf4NRlA/74Q/1r1mgArxD9om2C+HUuscyXdnHn/dS7P/ALPXt9ePftHKB8P7Bu51SIf+Qpv8aAPmGiiigDoPHf8AyUPxL/2Fbr/0a1c/XQeO/wDkofiX/sK3X/o1q5+gAr7L+En/ACSvw/8A9e5/9DavjSvsv4Sf8kr8P/8AXuf/AENqAO0ooooA+PvjX/yV3XfrB/6Ijrga7741/wDJXdd+sH/oiOuBoAK6Dw9/yA/Fn/YKj/8AS21rn66Dw9/yA/Fn/YKj/wDS21oA6Dxf/wAz/wD9jXF/7fVz9n/yTzWf+wrYf+iruug8X/8AM/8A/Y1xf+31c/Z/8k81n/sK2H/oq7oA5+vQLn/kr3i7/uOf+k9zXn9egXP/ACV7xd/3HP8A0nuaAD/mSP8AuVP/AHNV5/XoH/Mkf9yp/wC5qvP6ANDQf+Rh0z/r7i/9DFfd9fCGg/8AIw6Z/wBfcX/oYr7voAKoa5/yL+pf9esv/oBq/VDXP+Rf1L/r1l/9ANAHxf47/wCSh+Jf+wrdf+jWrn66Dx3/AMlD8S/9hW6/9GtXP0AFFFFABX3P4TYN4N0Nh0OnwH/yGtfDFfcHgYlvh94bYnJOlWpP/fpaAN+iiigDzfxR8bPDfhPxHd6Hf2OrSXVrt3tBFGUO5AwwTID0Ydqx/wDho7wf/wBA3XP+/EP/AMdryj4625h+K+pSEf66KCQf9+1X/wBlrzegD6f/AOGjvB//AEDdc/78Q/8Ax2tDRfjx4T1vUxZR22q237qWZ5p4E2IkcbSMTtdm+6h6A18oV0Hg3/kOXP8A2CtS/wDSKagD6zT4keF2urO3a+kje/uI7eyLQPi4Z4oZVK4B2jbcRj59vJPpmqafF/wJJp01+uu5tYZY4ZH+yT/K7hyoxszyI3/L3FeMP/yHPhx/2FbL/wBItLrz+z/5J5rP/YVsP/RV3QB9P/8AC7fh5/0MP/klcf8Axuj/AIXb8PP+hh/8krj/AON18gUUAfY6fF/wJJp01+uu5tYZY4ZH+yT/ACu4cqMbM8iN/wAvcUJ8X/AkmnTX667m1hljhkf7JP8AK7hyoxszyI3/AC9xXyxZ/wDJPNZ/7Cth/wCiruiz/wCSeaz/ANhWw/8ARV3QB9XyfFLwbF9p36zj7NaRXsv+izfLDL5exvuc586PgcjdyBg4kf4keF1ury3W+kkewuJLe9KwPi3ZIppWLZA3DbbyD5N3IHrmvmzUf+Zj/wCxU0r/ANx9dAn/ACHPiP8A9hW9/wDSLVKAPcz8SPC+SY76SVERJJnWBwIY3tpLpHbIBIMUTHC5OcAgVTuPi/4EtILSafXdkd3EZoD9knO9A7Rk8Jx8yMOfT0xXjFn/AMems/8AYKsP/TBd15/4h/5AfhP/ALBUn/pbdUAafxWuoL74i313ayiW3nt7OWKQAjerWsRBwQCMg9wDXGV0HjL/AJDlt/2CtN/9Ioa5+gAooooAK+y/hJ/ySvw//wBe5/8AQ2r40r7L+En/ACSvw/8A9e5/9DagDtKKKKAPmD9o7/koen/9gqP/ANGy14/XsH7R3/JQ9P8A+wVH/wCjZa8foAKKKKACiiigD0v4Df8AJVLL/r3m/wDQDX1pXyX8Bv8Akqll/wBe83/oBr60oAK5/wAd/wDJPPEv/YKuv/RTV0Fc/wCO/wDknniX/sFXX/opqAPiCiiigAooooAK+5vCLiTwXoTjo2n25/8AIa18M19v+BOfh74a/wCwVa/+iloA6CiiigD4/wDjWhT4ua57mA/+QI64CvTvj5bGD4pXMhH+vtoZB74Xb/7LXmNABRRRQB7B8Hv+Q54J/wCwrq//AKRQV5/4e/5Afiz/ALBUf/pba16B8Hv+Q54J/wCwrq//AKRQV5/4e/5Afiz/ALBUf/pba0Ac/XsHh7/ktXiz/sKx/wDp3ta8fr2Dw9/yWrxZ/wBhWP8A9O9rQB5/4h/5AfhP/sFSf+lt1XP10HiH/kB+E/8AsFSf+lt1XP0AFFFFAH1N+zuhX4bzn+9qMp/8cjH9K9ZrzX4D2xg+FVjIRjz55pB/32V/9lr0qgArx79o4j/hX1gvcarEf/IU1ew14j+0TcBvDUdtnmO8tJMf7yXY/wDZaAPm6iiigDoPHf8AyUPxL/2Fbr/0a1c/XQeO/wDkofiX/sK3X/o1q5+gAr7L+En/ACSvw/8A9e5/9DavjSvsv4Sf8kr8P/8AXuf/AENqAO0ooooA+PvjX/yV3XfrB/6Ijrga7741/wDJXdd+sH/oiOuBoAK6Dw9/yA/Fn/YKj/8AS21rn66Dw9/yA/Fn/YKj/wDS21oA6Dxf/wAz/wD9jXF/7fVz9n/yTzWf+wrYf+iruug8X/8AM/8A/Y1xf+31c/Z/8k81n/sK2H/oq7oA5+vQLn/kr3i7/uOf+k9zXn9egXP/ACV7xd/3HP8A0nuaAD/mSP8AuVP/AHNV5/XoH/Mkf9yp/wC5qvP6ANDQf+Rh0z/r7i/9DFfd9fCGg/8AIw6Z/wBfcX/oYr7voAKoa5/yL+pf9esv/oBq/VDXP+Rf1L/r1l/9ANAHxf47/wCSh+Jf+wrdf+jWrn66Dx3/AMlD8S/9hW6/9GtXP0AFFFFABX218P50m8AaAiHLQ6baI/sfIjb+TCviWvq/4P6sJk1DR2b5rey0u4UH+69hApx+KfrQB6hRRRQB8z/tIaeYfGGl6gFwlzZeXn1ZHOf0da8Yr6h/aG0M6h4GttUjTMmm3ILHHSOT5T/49sr5eoAK6Dwb/wAhy5/7BWpf+kU1c/XQeDf+Q5c/9grUv/SKagD0B/8AkOfDj/sK2X/pFpdef2f/ACTzWf8AsK2H/oq7r0B/+Q58OP8AsK2X/pFpdef2f/JPNZ/7Cth/6Ku6AOfooooA6Cz/AOSeaz/2FbD/ANFXdFn/AMk81n/sK2H/AKKu6LP/AJJ5rP8A2FbD/wBFXdFn/wAk81n/ALCth/6Ku6AOg1H/AJmP/sVNK/8AcfXQJ/yHPiP/ANhW9/8ASLVK5/Uf+Zj/AOxU0r/3H10Cf8hz4j/9hW9/9ItUoALP/j01n/sFWH/pgu68/wDEP/ID8J/9gqT/ANLbqvQLP/j01n/sFWH/AKYLuvP/ABD/AMgPwn/2CpP/AEtuqADxl/yHLb/sFab/AOkUNc/XQeMv+Q5bf9grTf8A0ihrn6ACiiigAr7L+En/ACSvw/8A9e5/9DavjSvsv4Sf8kr8P/8AXuf/AENqAO0ooooA+YP2jv8Akoen/wDYKj/9Gy14/XsH7R3/ACUPT/8AsFR/+jZa8foAKKKKACiiigD0v4Df8lUsv+veb/0A19aV8l/Ab/kqll/17zf+gGvrSgArn/Hf/JPPEv8A2Crr/wBFNXQVz/jv/knniX/sFXX/AKKagD4gooooAKKKKACvtb4dXiXXgTRoVxm1sLSFvqbaJ/5OK+Ka+pPg7rAbUdT0R25TTdKu419c2MKOf/HU/OgD1uiiigD5v/aT04x+I9E1LHE9o8GfeN93/tSvEK+pv2g9FOo/D6PUI1zJpt0sjH/pm/yH9Sh/CvlmgAooooA9g+D3/Ic8E/8AYV1f/wBIoK8/8Pf8gPxZ/wBgqP8A9LbWvQPg9/yHPBP/AGFdX/8ASKCvP/D3/ID8Wf8AYKj/APS21oA5+vYPD3/JavFn/YVj/wDTva14/XsHh7/ktXiz/sKx/wDp3taAPP8AxD/yA/Cf/YKk/wDS26rn66DxD/yA/Cf/AGCpP/S26rn6ACiitHQNKk13xDp2lRZ33lwkOR2DMAT+AyfwoA+xfhtpx0v4b+H7Vl2t9jSRh6F/nP6tXU0yKJIYkijUKiKFVR2A6Cn0AFfOfx1vxd3WtwA5+x3OlwkehMV7J/7OK+jK+QfGGrjXYPGmpK26ObxBZiNvVFjvFX/x0CgDz6iiigDoPHf/ACUPxL/2Fbr/ANGtXP10Hjv/AJKH4l/7Ct1/6NaufoAK+y/hJ/ySvw//ANe5/wDQ2r40r7L+En/JK/D/AP17n/0NqAO0ooooA+PvjX/yV3XfrB/6Ijrga7741/8AJXdd+sH/AKIjrgaACug8Pf8AID8Wf9gqP/0tta5+ug8Pf8gPxZ/2Co//AEttaAOg8X/8z/8A9jXF/wC31c/Z/wDJPNZ/7Cth/wCiruug8X/8z/8A9jXF/wC31c/Z/wDJPNZ/7Cth/wCirugDn69Auf8Akr3i7/uOf+k9zXn9egXP/JXvF3/cc/8ASe5oAP8AmSP+5U/9zVef16B/zJH/AHKn/uarz+gDQ0H/AJGHTP8Ar7i/9DFfd9fCGg/8jDpn/X3F/wChivu+gAqhrn/Iv6l/16y/+gGr9UNc/wCRf1L/AK9Zf/QDQB8X+O/+Sh+Jf+wrdf8Ao1q5+ug8d/8AJQ/Ev/YVuv8A0a1c/QAUUUUAFez+AvEI0L4yaXFK+231HR9Ps3z03NZwFPx3AD/gVeMV0fiyaS38RWc0LlJY9M0x0ZTgqRZwEEUAfblFc74G8UQ+MPB9hrEZXzZE23CD+CVeHH58j2IroqAKGtaTb67ol7pV2MwXcLQv6gEYyPcdfwr4e1rSLrQdavNKvU2XNpK0Tjscdx7Ecj2NfeFeJ/Hf4dPq9p/wlWlQl7y1j23sSDmSIdHHqV7+30oA+bK6Dwb/AMhy5/7BWpf+kU1c/XQeDf8AkOXP/YK1L/0imoA9Af8A5Dnw4/7Ctl/6RaXXn9n/AMk81n/sK2H/AKKu69Af/kOfDj/sK2X/AKRaXXn9n/yTzWf+wrYf+irugDn6KKKAOgs/+Seaz/2FbD/0Vd0Wf/JPNZ/7Cth/6Ku6LP8A5J5rP/YVsP8A0Vd0Wf8AyTzWf+wrYf8Aoq7oA6DUf+Zj/wCxU0r/ANx9dAn/ACHPiP8A9hW9/wDSLVK5/Uf+Zj/7FTSv/cfXQJ/yHPiP/wBhW9/9ItUoALP/AI9NZ/7BVh/6YLuvP/EP/ID8J/8AYKk/9LbqvQLP/j01n/sFWH/pgu68/wDEP/ID8J/9gqT/ANLbqgA8Zf8AIctv+wVpv/pFDXP10HjL/kOW3/YK03/0ihrn6ACiiigAr7L+En/JK/D/AP17n/0Nq+NK+y/hJ/ySvw//ANe5/wDQ2oA7SiiigD5g/aO/5KHp/wD2Co//AEbLXj9ewftHf8lD0/8A7BUf/o2WvH6ACiiigAooooA9L+A3/JVLL/r3m/8AQDX1pXyX8Bv+SqWX/XvN/wCgGvrSgArn/Hf/ACTzxL/2Crr/ANFNXQVz/jv/AJJ54l/7BV1/6KagD4gooooAKKKKACvWfCfiIeHPjJok8j7La60vTrOY5wNr2UABPsG2n8K8mroPGJI122IOCNK03BH/AF5Q0Afb9Fcj8NPFi+MfA9jqLOGvI18i7HcSqBk/iMN/wKuuoAoa3pUGu6HfaVc/6m7geFjjpuGMj3HX8K+GtU0250fVbvTbxNlzaytDIv8AtKcflX3pXz7+0D4DfzV8Y6fESpCxagqjoRwkn8lP0X3oA8CooooA9g+D3/Ic8E/9hXV//SKCvP8Aw9/yA/Fn/YKj/wDS21r0D4Pf8hzwT/2FdX/9IoK8/wDD3/ID8Wf9gqP/ANLbWgDn69g8Pf8AJavFn/YVj/8ATva14/XsHh7/AJLV4s/7Csf/AKd7WgDz/wAQ/wDID8J/9gqT/wBLbqufroPEP/ID8J/9gqT/ANLbqufoAK9j/Z58MNqPiy41+aP/AEfTYykRI4Mzgj9F3fmK8m07T7vVtRt9PsYWmuriQRxRr1ZjX2l4F8J2/gvwlZ6PCVeVB5lxKB/rJT95vp2HsBQB0dFFFAHMfEPxAPDHgPV9TD7ZlgMcHPPmv8q4+hOfoDXyPZ/8k81n/sK2H/oq7r1T9ovxYLnULHwtbSZS2/0m6AP/AC0Iwin6KSf+BCvK7P8A5J5rP/YVsP8A0Vd0Ac/RRRQB0Hjv/kofiX/sK3X/AKNaufroPHf/ACUPxL/2Fbr/ANGtXP0AFfZfwk/5JX4f/wCvc/8AobV8aV9l/CT/AJJX4f8A+vc/+htQB2lFFFAHx98a/wDkruu/WD/0RHXA133xr/5K7rv1g/8AREdcDQAV0Hh7/kB+LP8AsFR/+ltrXP10Hh7/AJAfiz/sFR/+ltrQB0Hi/wD5n/8A7GuL/wBvq5+z/wCSeaz/ANhWw/8ARV3XQeL/APmf/wDsa4v/AG+rn7P/AJJ5rP8A2FbD/wBFXdAHP16Bc/8AJXvF3/cc/wDSe5rz+vQLn/kr3i7/ALjn/pPc0AH/ADJH/cqf+5qvP69A/wCZI/7lT/3NV5/QBoaD/wAjDpn/AF9xf+hivu+vhDQf+Rh0z/r7i/8AQxX3fQAVQ1z/AJF/Uv8Ar1l/9ANX6oa5/wAi/qX/AF6y/wDoBoA+L/Hf/JQ/Ev8A2Fbr/wBGtXP10Hjv/kofiX/sK3X/AKNaufoAKKKKACug8Zf8hy2/7BWm/wDpFDXP10HjL/kOW3/YK03/ANIoaAO1+CHj1fC/iNtIv5tml6mwXcx4hm6K3sD90/ge1fVVfAFfTHwW+Kaa3Zw+GdbuANTgXbazyH/j5Qfwk/3wPzHuDQB7PR1oooA+fvil8EJGmn13wjb7gxL3GmoOQe7RD/2X8vSvI/CMbw+ILuORGSRNL1JWVhggiynyCK+3a5vXPAnh7xBdSXl3YrHfvbzW5vIPkl2SxtE2T0Y7XONwOKAPBH/5Dnw4/wCwrZf+kWl15/Z/8k81n/sK2H/oq7r6H1P4S3n9veGLnS76A2WkajFcut0SJDFHDaRAAqpDNi1J/hHzCvJ5/hb410rwPqdrcaBcPPNqVpJGlu6TsyJHchmwhJABdOvrQB5hRXQf8IJ4w/6FTXP/AAXS/wDxNA8B+MCcf8Iprn46fL/8TQAWf/JPNZ/7Cth/6Ku6LP8A5J5rP/YVsP8A0Vd11mj/AAy8aX3gvVbKLw/dR3MmoWcyR3G2AsiR3IYjeR0MifnW5ovwP8YXPhPUdNu47LT55761uE8+4DDZGk6t/qw3OZVx+NAHL6j/AMzH/wBippX/ALj66BP+Q58R/wDsK3v/AKRapXpFn8EbN5LuTVdWmlS80q006WG2jCbfIWD5g5znLW47Dhj9a77TPCmhaPf3l9Y6bFFd3twbqeYkuzSnflgWJ2n9444xwxHQ0AeL+HPBuuazDfCGzeGG703TkiuLgFIznRp4CQcZYCSVAdoJGT6GvOfiVoEnha50DRJrmO5ltNMZXliBCkm7uCQM88Zx+FfY9fKfx7/5Hiz/AOvJ/wD0quKAOM8Zf8hy2/7BWm/+kUNc/XQeMv8AkOW3/YK03/0ihrn6ACiiigAr7L+En/JK/D//AF7n/wBDavjSvsv4Sf8AJK/D/wD17n/0NqAO0ooooA+YP2jv+Sh6f/2Co/8A0bLXj9ewftHf8lD0/wD7BUf/AKNlrx+gAooooAKKKKAPS/gN/wAlUsv+veb/ANANfWlfJfwG/wCSqWX/AF7zf+gGvrSgArn/AB3/AMk88S/9gq6/9FNXQVz/AI7/AOSeeJf+wVdf+imoA+IKKKKACiiigAroPGX/ACHLb/sFab/6RQ1z9dB4y/5Dlt/2CtN/9IoaAOo+DXjseDvFX2a9l26TqO2KcseIn/gk+gzg+xz2r63ByMjpXwBX0f8ABH4opqFtB4U1ufF5Euyxnc/65B0jJ/vDt6jjqOQD3Cori3hu7aW2uYklglQpJG4yrKRggj0qWigD5Q+KXwkvPB11LqmlRyXOgyNncPma1z/C/wDs+jfgeevl9ffrokkbRyKrowIZWGQQexFeQ+MfgBomtSSXmgz/ANkXTcmHbugY+y9U/Dj2oA4D4Pf8hzwT/wBhXV//AEigrz/w9/yA/Fn/AGCo/wD0tta9v8B/DPxL4W17wyb23gkgsNQ1GaeeCZSqpLbRRxnBwxyyMOBxjnFeTaX4W8Q6Z4f8Uy3+g6paRvpkaI89nJGGb7ZbHAJHJwCcegNAHE17B4e/5LV4s/7Csf8A6d7WvKF069dtqWdwx9BEx/pXtnh/wvr6fF7xPePouoR2s2pLJFPJbOscijVLeQlWIwRsVm47AmgDyrxD/wAgPwn/ANgqT/0tuqxrKyutRvYrOyt5Li5mbbHFEpZmPoAK9wtfgRr2uWHh6PVbqDS0srFoLhMiaXcbmeTACnbjbIvO7v0r17wd8O/D3giAjS7TddMuJLychpX9s9h7DAoA5f4S/CiPwXbjVtWVJddmTGAcraqeqqe7HufwHGSfUqKKACsLxh4os/B3hm71m8IIiXEUecGWQ/dQfU/kMntWteXltp9nNeXk6QW0KF5JZDhVUdSTXyL8U/iLN4814C3Lx6PaEraxHgv6yMPU/oPxyAcZqmp3Ws6rdalfSGS6upWlkb1JOePQe1atn/yTzWf+wrYf+iruufroLP8A5J5rP/YVsP8A0Vd0Ac/RRRQB0Hjv/kofiX/sK3X/AKNaufroPHf/ACUPxL/2Fbr/ANGtXP0AFfZfwk/5JX4f/wCvc/8AobV8aV9l/CT/AJJX4f8A+vc/+htQB2lFFFAHx98a/wDkruu/WD/0RHXA133xr/5K7rv1g/8AREdcDQAV0Hh7/kB+LP8AsFR/+ltrXP10Hh7/AJAfiz/sFR/+ltrQB0Hi/wD5n/8A7GuL/wBvq5+z/wCSeaz/ANhWw/8ARV3XQeL/APmf/wDsa4v/AG+rn7P/AJJ5rP8A2FbD/wBFXdAHP16Bc/8AJXvF3/cc/wDSe5rz+vQLn/kr3i7/ALjn/pPc0AH/ADJH/cqf+5qvP69A/wCZI/7lT/3NV5/QBoaD/wAjDpn/AF9xf+hivu+vhDQf+Rh0z/r7i/8AQxX3fQAVQ1z/AJF/Uv8Ar1l/9ANX6oa5/wAi/qX/AF6y/wDoBoA+L/Hf/JQ/Ev8A2Fbr/wBGtXP10Hjv/kofiX/sK3X/AKNaufoAKKKKACug8Zf8hy2/7BWm/wDpFDXP10HjL/kOW3/YK03/ANIoaAOfp8UskEqSxO0ciMGR0OCpHQg9jTKKAPo/4ZfHG3v44dG8WzrBeDCRag3CS+gk/ut79D3x39vBDKGUggjII718A133gn4ueJPBYS2SUX+mLx9juWJCj/Ybqv05HtQB9g0Vwvgf4q6B46k+yWaXVvqKp5j2ssRbCjALB1yu3JAycdRxXdAg9DQAUUUUAFFFFABRRRQAUUVQvdZ0/T7CS+ubuGO1jBLTPIqxjDBcF2IUHcQMEjmgC/Xyn8e/+R4s/wDryf8A9KrivY/FHxUi0e31aWxtY72CwWeN3jnaORZ4preJ0IeIgY+0ghhuBxivCfi487+I7MXNxJcyxxXURmkChnCahdqCdoAzgDoAKAOf8Zf8hy2/7BWm/wDpFDXP10HjL/kOW3/YK03/ANIoa5+gAooooAK+y/hJ/wAkr8P/APXuf/Q2r40r7L+En/JK/D//AF7n/wBDagDtKKKKAPmD9o7/AJKHp/8A2Co//RsteP17B+0d/wAlD0//ALBUf/o2WvH6ACiiigAooooA9L+A3/JVLL/r3m/9ANfWlfJfwG/5KpZf9e83/oBr60oAK5/x3/yTzxL/ANgq6/8ARTV0Fc/47/5J54l/7BV1/wCimoA+IKKKKACiiigAroPGX/Ictv8AsFab/wCkUNc/XQeMv+Q5bf8AYK03/wBIoaAOfpyO8ciyRsyupBVlOCCO4NNooA+jfhf8b4L6OHRPFlwsN2MJDqDnCS+gkP8AC3+10PfB6+4gggEHIPQivgGvQ/A3xh8Q+DVjtHb+0tKXgWs7HMY/2H6r9OR7UAfXlFcv4a8e6J4l0W21FLmOyM8RlW3u5o1kCCTyt20MTt8wFQTjJ+tdRnIyKACiiigAooooAKKKq3+pWOlWrXWoXkFpbr1lnkCKPxNAFqs/Wtc0zw7pkuo6teR2trGOXc9T6AdSfYc1wPxG+L0Hg2FYtNso9QuZJJIFm+0I0Mcse3ejBWLbl3rlSF69a+afE3i3W/F+ofbNavnuHGfLj6RxD0VRwP5nvmgDrfid8V77xzcGxsxJaaHG2UhJ+eYjo0mP0XoPc15vRRQAV0Fn/wAk81n/ALCth/6Ku65+ugs/+Seaz/2FbD/0Vd0Ac/RRRQB0Hjv/AJKH4l/7Ct1/6NaufroPHf8AyUPxL/2Fbr/0a1c/QAV6T/wsfxZ4V8KeFrHRdWNtbSadJKyGCKTLfa7hc5dSeiqMdOK82roPEP8AyA/Cf/YKk/8AS26oA6D/AIXb8Q/+hh/8krf/AON0f8Lt+If/AEMP/klb/wDxuvP6KAOs8capd66NA1nUXjl1C+00yXM6xJGZWW5njVmCgAkIiLnHRRXJ10HiH/kB+E/+wVJ/6W3Vc/QAV0Hh7/kB+LP+wVH/AOltrXP10Hh7/kB+LP8AsFR/+ltrQB0Hi/8A5n//ALGuL/2+rn7P/knms/8AYVsP/RV3XQeL/wDmf/8Asa4v/b6ufs/+Seaz/wBhWw/9FXdAHP16Bc/8le8Xf9xz/wBJ7mvP69Auf+SveLv+45/6T3NAB/zJH/cqf+5qvP69A/5kj/uVP/c1Xn9AG94IjSXx/wCHI5EV0fVLZWVhkEGVcgiui/4Xb8Q/+hh/8krf/wCN1z/gT/kofhr/ALCtr/6NWufoA9A/4Xb8Q/8AoYf/ACSt/wD43TZPjT8QJY2jk15XRwVZWsbcgg9QR5dcDRQB0Hjv/kofiX/sK3X/AKNaufroPHf/ACUPxL/2Fbr/ANGtXP0AFFFFABXQeMv+Q5bf9grTf/SKGufroPGX/Ictv+wVpv8A6RQ0Ac/RRRQAUUUUAdB4e/5Afiz/ALBUf/pba16+PG3iTT/GllYwatMbe88a3tjMkwWX9wslsBGpcEooDtgLjrXkHh7/AJAfiz/sFR/+ltrXoF5/yUPRv+ygX/8A6NtKAN7Rvj/rA8O3+q6po9ncC1u7a2jitZHhz5iTsSzP5mceUOmOvWt22+P+mnQLXVtR0i7tFnu57ZYbfbck+WkTFizNHj/WgYweleCWf/JPNZ/7Cth/6Ku6Lz/knmjf9hW//wDRVpQB78P2jvCOOdO1sn2t4h/7Vpj/ALRvhUj93Y6yp/2rWI/+1hXzJRQB9L6j+0DaWeiWWp2eiz30V1cz2+JnFq0ZiWJugMu7PmjnI6dKx7r4/apc+GL7VdN0eC3lgvba2Md3MZ0KyJOxK7FjIIMQ6k9e1eQXn/JPNG/7Ct//AOirSiz/AOSeaz/2FbD/ANFXdAHp0vxL8Taq2kj7WlrDeeHtRu3jt05SZFvArpI+6RT+6To/bjjiuZvr+81PwpJeX93Pd3UnhQb5p5DI7Y1kAZY8nAAH4VX07/mXP+xU1X/3IUf8yR/3Kn/uaoA6DxL/AMgPxz/2FdV/9LdMrn/i5/yM8H/b9/6cryug8S/8gPxz/wBhXVf/AEt0yuf+Ln/Izwf9v3/pyvKAOf8AGX/Ictv+wVpv/pFDXP10HjL/AJDlt/2CtN/9Ioa5+gAooooAK9J/4WP4s8K+FPC1jourG2tpNOklZDBFJlvtdwucupPRVGOnFebV0HiH/kB+E/8AsFSf+lt1QB0H/C7fiH/0MP8A5JW//wAbo/4Xb8Q/+hh/8krf/wCN15/RQB2Hj3W9R8Rx+GtW1a4+0X0+lN5kuxU3bbu5UcKABwAOBXH10HiH/kB+E/8AsFSf+lt1XP0AFFFFABRRRQB1Pw91C70rxWb6ymMNzBp1/LG4AOGW0lZSQeDggHB44rX/AOF2/EP/AKGH/wAkrf8A+N1z/g3/AJDlz/2CtS/9Ipq5+gD0D/hdvxD/AOhh/wDJK3/+N1oaR8UvGXiOTUNJ1bWftFjPpWoeZF9lhTdttJWHKoCOQDwa8vroPBv/ACHLn/sFal/6RTUAc/RRRQAUUUUAFdB4y/5Dlt/2CtN/9Ioa5+ug8Zf8hy2/7BWm/wDpFDQBz9FFFABRRRQB7B4E/wCPvw1/2CrX/wBP61e0b4l+J9G8KwXJvjf+V4fN7svsyF5jqhh3M+RIcIcAbscDiqPgT/j78Nf9gq1/9P61z/8AzJH/AHKn/uaoA9Gf9oO90zR9GuL/AMPw3dzqFo1w5guTBGmLiaIAKVc9Iwc7u/QV0Gp/Hvw7o2uahpl3aapJLZ3Mlu5htY8ZRipwTNyOOuB9BXzz4h/5AfhP/sFSf+lt1R47/wCSh+Jf+wrdf+jWoA9+b9o7wkR8un62D728R/8AatR3Hx/09dAutWsNKubxYLuC2aGcLbEeYkrBgwaTd/qiMYHXvXzLXQWf/JPNZ/7Cth/6Ku6APbrH406nrE/hc2umwwQarrbWE6XEpldFU2/KMgjA/wBc3DBunpxXHWnjTxF4i8PW0up6pLIbiPXY51jVYUmVNPjZN6oArEFiQSCRWF4Q/wCZA/7GuX/2xo8M/wDIsaf/ANzD/wCm2KgA+I//AC+f9jXrP/ttXn9egfEf/l8/7GvWf/bavP6ACiiigAroLP8A5J5rP/YVsP8A0Vd1z9dBZ/8AJPNZ/wCwrYf+irugDn6KKKAOg8d/8lD8S/8AYVuv/RrVz9dB47/5KH4l/wCwrdf+jWrn6ACug8Q/8gPwn/2CpP8A0tuq5+ug8Q/8gPwn/wBgqT/0tuqAOfooooA6DxD/AMgPwn/2CpP/AEtuq5+ug8Q/8gPwn/2CpP8A0tuq5+gAroPD3/ID8Wf9gqP/ANLbWufroPD3/ID8Wf8AYKj/APS21oA6Dxf/AMz/AP8AY1xf+31c/Z/8k81n/sK2H/oq7roPF/8AzP8A/wBjXF/7fVz9n/yTzWf+wrYf+irugDn69Auf+SveLv8AuOf+k9zXn9egXP8AyV7xd/3HP/Se5oAP+ZI/7lT/ANzVef16B/zJH/cqf+5qvP6AOg8Cf8lD8Nf9hW1/9GrXP10HgT/kofhr/sK2v/o1a5+gAooooA6Dx3/yUPxL/wBhW6/9GtXP10Hjv/kofiX/ALCt1/6NaufoAKKKKACug8Zf8hy2/wCwVpv/AKRQ1z9dB4y/5Dlt/wBgrTf/AEihoA5+iiigAooooA6Dw9/yA/Fn/YKj/wDS21r0C8/5KHo3/ZQL/wD9G2lef+Hv+QH4s/7BUf8A6W2tegXn/JQ9G/7KBf8A/o20oA8/s/8Aknms/wDYVsP/AEVd0Xn/ACTzRv8AsK3/AP6KtKLP/knms/8AYVsP/RV3Ref8k80b/sK3/wD6KtKAOfooooA6C8/5J5o3/YVv/wD0VaUWf/JPNZ/7Cth/6Ku6Lz/knmjf9hW//wDRVpRZ/wDJPNZ/7Cth/wCirugDoNO/5lz/ALFTVf8A3IUf8yR/3Kn/ALmqNO/5lz/sVNV/9yFH/Mkf9yp/7mqAOg8S/wDID8c/9hXVf/S3TK5/4uf8jPB/2/f+nK8roPEv/ID8c/8AYV1X/wBLdMrn/i5/yM8H/b9/6crygDn/ABl/yHLb/sFab/6RQ1z9dB4y/wCQ5bf9grTf/SKGufoAKKKKACug8Q/8gPwn/wBgqT/0tuq5+ug8Q/8AID8J/wDYKk/9LbqgDn6KKKAOg8Q/8gPwn/2CpP8A0tuq5+ug8Q/8gPwn/wBgqT/0tuq5+gAooooAKKKKAOg8G/8AIcuf+wVqX/pFNXP10Hg3/kOXP/YK1L/0imrn6ACug8G/8hy5/wCwVqX/AKRTVz9dB4N/5Dlz/wBgrUv/AEimoA5+iiigAooooAK6Dxl/yHLb/sFab/6RQ1z9dB4y/wCQ5bf9grTf/SKGgDn6KKKACiiigD2DwJ/x9+Gv+wVa/wDp/Wuf/wCZI/7lT/3NV0HgT/j78Nf9gq1/9P61z/8AzJH/AHKn/uaoA5/xD/yA/Cf/AGCpP/S26o8d/wDJQ/Ev/YVuv/RrUeIf+QH4T/7BUn/pbdUeO/8AkofiX/sK3X/o1qAOfroLP/knms/9hWw/9FXdc/XQWf8AyTzWf+wrYf8Aoq7oA6Dwh/zIH/Y1y/8AtjR4Z/5FjT/+5h/9NsVHhD/mQP8Asa5f/bGjwz/yLGn/APcw/wDptioAPiP/AMvn/Y16z/7bV5/XoHxH/wCXz/sa9Z/9tq8/oAKKKKACugs/+Seaz/2FbD/0Vd1z9dBZ/wDJPNZ/7Cth/wCirugDn6KKKAOg8d/8lD8S/wDYVuv/AEa1c/XQeO/+Sh+Jf+wrdf8Ao1q5+gAroPEP/ID8J/8AYKk/9LbqufroPEP/ACA/Cf8A2CpP/S26oA5+iiigDoPEP/ID8J/9gqT/ANLbqufroPEP/ID8J/8AYKk/9LbqufoAK6Dw9/yA/Fn/AGCo/wD0tta5+ug8Pf8AID8Wf9gqP/0ttaAOg8X/APM//wDY1xf+31c/Z/8AJPNZ/wCwrYf+iruug8X/APM//wDY1xf+31c/Z/8AJPNZ/wCwrYf+irugDn69Auf+SveLv+45/wCk9zXn9egXP/JXvF3/AHHP/Se5oAP+ZI/7lT/3NV5/XoH/ADJH/cqf+5qvP6AOg8Cf8lD8Nf8AYVtf/Rq1z9dB4E/5KH4a/wCwra/+jVrn6ACiiigDoPHf/JQ/Ev8A2Fbr/wBGtXP10Hjv/kofiX/sK3X/AKNaufoAKKKKACug8Zf8hy2/7BWm/wDpFDXP10HjL/kOW3/YK03/ANIoaAOfooooAKKKKAOg8Pf8gPxZ/wBgqP8A9LbWvQLz/koejf8AZQL/AP8ARtpXn/h7/kB+LP8AsFR/+ltrXoF5/wAlD0b/ALKBf/8Ao20oA8/s/wDknms/9hWw/wDRV3Ref8k80b/sK3//AKKtKLP/AJJ5rP8A2FbD/wBFXdF5/wAk80b/ALCt/wD+irSgDn6KKKAOgvP+SeaN/wBhW/8A/RVpRZ/8k81n/sK2H/oq7ovP+SeaN/2Fb/8A9FWlFn/yTzWf+wrYf+irugDoNO/5lz/sVNV/9yFH/Mkf9yp/7mqNO/5lz/sVNV/9yFH/ADJH/cqf+5qgDoPEv/ID8c/9hXVf/S3TK5/4uf8AIzwf9v3/AKcryug8S/8AID8c/wDYV1X/ANLdMrn/AIuf8jPB/wBv3/pyvKAOf8Zf8hy2/wCwVpv/AKRQ1z9dB4y/5Dlt/wBgrTf/AEihrn6ACiiigAroPEP/ACA/Cf8A2CpP/S26rn66DxD/AMgPwn/2CpP/AEtuqAOfooooA6DxD/yA/Cf/AGCpP/S26rn66DxD/wAgPwn/ANgqT/0tuq5+gAooooAKKKKAOg8G/wDIcuf+wVqX/pFNXP10Hg3/AJDlz/2CtS/9Ipq5+gAroPBv/Icuf+wVqX/pFNXP10Hg3/kOXP8A2CtS/wDSKagDn6KKKACiiigAroPGX/Ictv8AsFab/wCkUNc/XQeMv+Q5bf8AYK03/wBIoaAOfooooAKKKKAPYPAn/H34a/7BVr/6f1rn/wDmSP8AuVP/AHNV0HgT/j78Nf8AYKtf/T+tc/8A8yR/3Kn/ALmqAOf8Q/8AID8J/wDYKk/9Lbqjx3/yUPxL/wBhW6/9GtR4h/5AfhP/ALBUn/pbdUeO/wDkofiX/sK3X/o1qAOfroLP/knms/8AYVsP/RV3XP10Fn/yTzWf+wrYf+irugDoPCH/ADIH/Y1y/wDtjR4Z/wCRY0//ALmH/wBNsVHhD/mQP+xrl/8AbGjwz/yLGn/9zD/6bYqAD4j/APL5/wBjXrP/ALbV5/XoHxH/AOXz/sa9Z/8AbavP6ACiiigAroLP/knms/8AYVsP/RV3XP10Fn/yTzWf+wrYf+irugDn6KKKAOg8d/8AJQ/Ev/YVuv8A0a1c/XQeO/8AkofiX/sK3X/o1q5+gAroPEP/ACA/Cf8A2CpP/S26rn66DxD/AMgPwn/2CpP/AEtuqAOfooooA6DxD/yA/Cf/AGCpP/S26rn66DxD/wAgPwn/ANgqT/0tuq5+gAroPD3/ACA/Fn/YKj/9LbWufroPD3/ID8Wf9gqP/wBLbWgDoPF//M//APY1xf8At9XP2f8AyTzWf+wrYf8Aoq7roPF//M//APY1xf8At9XP2f8AyTzWf+wrYf8Aoq7oA5+vQLn/AJK94u/7jn/pPc15/XoFz/yV7xd/3HP/AEnuaAD/AJkj/uVP/c1Xn9egf8yR/wByp/7mq8/oA6DwJ/yUPw1/2FbX/wBGrXP10HgT/kofhr/sK2v/AKNWufoAKKKKAOg8d/8AJQ/Ev/YVuv8A0a1c/XQeO/8AkofiX/sK3X/o1q5+gAooooAK6Dxl/wAhy2/7BWm/+kUNc/XQeMv+Q5bf9grTf/SKGgDn6KKKACiiigDoPD3/ACA/Fn/YKj/9LbWvQLz/AJKHo3/ZQL//ANG2lef+Hv8AkB+LP+wVH/6W2tegXn/JQ9G/7KBf/wDo20oA8/s/+Seaz/2FbD/0Vd0Xn/JPNG/7Ct//AOirSiz/AOSeaz/2FbD/ANFXdF5/yTzRv+wrf/8Aoq0oA5+iiigDoLz/AJJ5o3/YVv8A/wBFWlFn/wAk81n/ALCth/6Ku6Lz/knmjf8AYVv/AP0VaUWf/JPNZ/7Cth/6Ku6AOg07/mXP+xU1X/3IUf8AMkf9yp/7mqNO/wCZc/7FTVf/AHIUf8yR/wByp/7mqAOg8S/8gPxz/wBhXVf/AEt0yuf+Ln/Izwf9v3/pyvK6DxL/AMgPxz/2FdV/9LdMrn/i5/yM8H/b9/6crygDn/GX/Ictv+wVpv8A6RQ1z9dB4y/5Dlt/2CtN/wDSKGufoAKKKKACug8Q/wDID8J/9gqT/wBLbqufroPEP/ID8J/9gqT/ANLbqgDn6KKKAOg8Q/8AID8J/wDYKk/9LbqufroPEP8AyA/Cf/YKk/8AS26rn6ACiiigAooooA6Dwb/yHLn/ALBWpf8ApFNXP10Hg3/kOXP/AGCtS/8ASKaufoAK6Dwb/wAhy5/7BWpf+kU1c/XQeDf+Q5c/9grUv/SKagDn6KKKACiiigAroPGX/Ictv+wVpv8A6RQ1z9dB4y/5Dlt/2CtN/wDSKGgDn6KKKACiiigD2DwJ/wAffhr/ALBVr/6f1rn/APmSP+5U/wDc1XQeBP8Aj78Nf9gq1/8AT+tc/wD8yR/3Kn/uaoA5/wAQ/wDID8J/9gqT/wBLbqjx3/yUPxL/ANhW6/8ARrUeIf8AkB+E/wDsFSf+lt1R47/5KH4l/wCwrdf+jWoA5+ugs/8Aknms/wDYVsP/AEVd1z9dBZ/8k81n/sK2H/oq7oA6Dwh/zIH/AGNcv/tjR4Z/5FjT/wDuYf8A02xUeEP+ZA/7GuX/ANsaPDP/ACLGn/8Acw/+m2KgA+I//L5/2Nes/wDttXn9egfEf/l8/wCxr1n/ANtq8/oAKKKKACugs/8Aknms/wDYVsP/AEVd1z9dBZ/8k81n/sK2H/oq7oA5+iiigDoPHf8AyUPxL/2Fbr/0a1c/XQeO/wDkofiX/sK3X/o1q5+gAroPEP8AyA/Cf/YKk/8AS26rn66DxD/yA/Cf/YKk/wDS26oA5+iiigDoPEP/ACA/Cf8A2CpP/S26rn66DxD/AMgPwn/2CpP/AEtuq5+gAroPD3/ID8Wf9gqP/wBLbWufroPD3/ID8Wf9gqP/ANLbWgDoPF//ADP/AP2NcX/t9XP2f/JPNZ/7Cth/6Ku66Dxf/wAz/wD9jXF/7fVz9n/yTzWf+wrYf+irugDn69Auf+SveLv+45/6T3Nef16Bc/8AJXvF3/cc/wDSe5oAP+ZI/wC5U/8Ac1Xn9egf8yR/3Kn/ALmq8/oA6DwJ/wAlD8Nf9hW1/wDRq1z9dB4E/wCSh+Gv+wra/wDo1a5+gAooooA6Dx3/AMlD8S/9hW6/9GtXP10Hjv8A5KH4l/7Ct1/6NaufoAKKKKACug8Zf8hy2/7BWm/+kUNc/XQeMv8AkOW3/YK03/0ihoA5+iiigAooooA6Dw9/yA/Fn/YKj/8AS21r0C8/5KHo3/ZQL/8A9G2lef8Ah7/kB+LP+wVH/wCltrXoF5/yUPRv+ygX/wD6NtKAPP7P/knms/8AYVsP/RV3Ref8k80b/sK3/wD6KtKLP/knms/9hWw/9FXdF5/yTzRv+wrf/wDoq0oA5+iiigDoLz/knmjf9hW//wDRVpRZ/wDJPNZ/7Cth/wCirui8/wCSeaN/2Fb/AP8ARVpRZ/8AJPNZ/wCwrYf+irugDoNO/wCZc/7FTVf/AHIUf8yR/wByp/7mqNO/5lz/ALFTVf8A3IUf8yR/3Kn/ALmqAOg8S/8AID8c/wDYV1X/ANLdMrn/AIuf8jPB/wBv3/pyvK6DxL/yA/HP/YV1X/0t0yuf+Ln/ACM8H/b9/wCnK8oA5/xl/wAhy2/7BWm/+kUNc/XQeMv+Q5bf9grTf/SKGufoAKKKKACug8Q/8gPwn/2CpP8A0tuq5+ug8Q/8gPwn/wBgqT/0tuqAOfooooA6DxD/AMgPwn/2CpP/AEtuq5+ug8Q/8gPwn/2CpP8A0tuq5+gAooooAKKKKAOg8G/8hy5/7BWpf+kU1c/XQeDf+Q5c/wDYK1L/ANIpq5+gAroPBv8AyHLn/sFal/6RTVz9dB4N/wCQ5c/9grUv/SKagDn6KKKACiiigAroPGX/ACHLb/sFab/6RQ1z9dB4y/5Dlt/2CtN/9IoaAOfooooAKKKKAPYPAn/H34a/7BVr/wCn9a5//mSP+5U/9zVdB4E/4+/DX/YKtf8A0/rXP/8AMkf9yp/7mqAOf8Q/8gPwn/2CpP8A0tuqPHf/ACUPxL/2Fbr/ANGtR4h/5AfhP/sFSf8ApbdUeO/+Sh+Jf+wrdf8Ao1qAOfroLP8A5J5rP/YVsP8A0Vd1z9dBZ/8AJPNZ/wCwrYf+irugDoPCH/Mgf9jXL/7Y0eGf+RY0/wD7mH/02xUeEP8AmQP+xrl/9saPDP8AyLGn/wDcw/8AptioAPiP/wAvn/Y16z/7bV5/XoHxH/5fP+xr1n/22rz+gAooooAK6Cz/AOSeaz/2FbD/ANFXdc/XQWf/ACTzWf8AsK2H/oq7oA5+iiigDoPHf/JQ/Ev/AGFbr/0a1c/XQeO/+Sh+Jf8AsK3X/o1q5+gAroPEP/ID8J/9gqT/ANLbqufroPEP/ID8J/8AYKk/9LbqgDn6KKKAOg8Q/wDID8J/9gqT/wBLbqufroPEP/ID8J/9gqT/ANLbqufoAK6Dw9/yA/Fn/YKj/wDS21rn66Dw9/yA/Fn/AGCo/wD0ttaAOg8X/wDM/wD/AGNcX/t9XP2f/JPNZ/7Cth/6Ku66Dxf/AMz/AP8AY1xf+31c/Z/8k81n/sK2H/oq7oA5+vQLn/kr3i7/ALjn/pPc15/XoFz/AMle8Xf9xz/0nuaAD/mSP+5U/wDc1Xn9egf8yR/3Kn/uarz+gDoPAn/JQ/DX/YVtf/Rq1z9dB4E/5KH4a/7Ctr/6NWufoAKKKKAOg8d/8lD8S/8AYVuv/RrVz9dB47/5KH4l/wCwrdf+jWrn6ACiiigAroPGX/Ictv8AsFab/wCkUNc/XQeMv+Q5bf8AYK03/wBIoaAOfooooAKKKKAOg8Pf8gPxZ/2Co/8A0tta9AvP+Sh6N/2UC/8A/RtpXn/h7/kB+LP+wVH/AOltrXoF5/yUPRv+ygX/AP6NtKAPP7P/AJJ5rP8A2FbD/wBFXdF5/wAk80b/ALCt/wD+irSiz/5J5rP/AGFbD/0Vd0Xn/JPNG/7Ct/8A+irSgDn6KKKAOgvP+SeaN/2Fb/8A9FWlFn/yTzWf+wrYf+irui8/5J5o3/YVv/8A0VaUWf8AyTzWf+wrYf8Aoq7oA6DTv+Zc/wCxU1X/ANyFH/Mkf9yp/wC5qjTv+Zc/7FTVf/chR/zJH/cqf+5qgDoPEv8AyA/HP/YV1X/0t0yuf+Ln/Izwf9v3/pyvK6DxL/yA/HP/AGFdV/8AS3TK5/4uf8jPB/2/f+nK8oA5/wAZf8hy2/7BWm/+kUNc/XQeMv8AkOW3/YK03/0ihrn6ACiiigAroPEP/ID8J/8AYKk/9LbqufroPEP/ACA/Cf8A2CpP/S26oA5+iiigDoPEP/ID8J/9gqT/ANLbqufroPEP/ID8J/8AYKk/9LbqufoAKKKKACiiigDoPBv/ACHLn/sFal/6RTVz9dB4N/5Dlz/2CtS/9Ipq5+gAroPBv/Icuf8AsFal/wCkU1c/XQeDf+Q5c/8AYK1L/wBIpqAOfooooAKKKKACug8Zf8hy2/7BWm/+kUNc/XQeMv8AkOW3/YK03/0ihoA5+iiigAooooA9g8Cf8ffhr/sFWv8A6f1rn/8AmSP+5U/9zVdB4E/4+/DX/YKtf/T+tc//AMyR/wByp/7mqAOf8Q/8gPwn/wBgqT/0tuqPHf8AyUPxL/2Fbr/0a1HiH/kB+E/+wVJ/6W3VHjv/AJKH4l/7Ct1/6NagDn66Cz/5J5rP/YVsP/RV3XP10Fn/AMk81n/sK2H/AKKu6AOg8If8yB/2Ncv/ALY0eGf+RY0//uYf/TbFR4Q/5kD/ALGuX/2xo8M/8ixp/wD3MP8A6bYqAD4j/wDL5/2Nes/+21ef16B8R/8Al8/7GvWf/bavP6ACiiigAroLP/knms/9hWw/9FXdc/XQWf8AyTzWf+wrYf8Aoq7oA5+iiigDoPHf/JQ/Ev8A2Fbr/wBGtXP10Hjv/kofiX/sK3X/AKNaufoAK6DxD/yA/Cf/AGCpP/S26rn66DxD/wAgPwn/ANgqT/0tuqAOfooooA6DxD/yA/Cf/YKk/wDS26rn66DxD/yA/Cf/AGCpP/S26rn6ACug8Pf8gPxZ/wBgqP8A9LbWufroPD3/ACA/Fn/YKj/9LbWgDoPF/wDzP/8A2NcX/t9XP2f/ACTzWf8AsK2H/oq7roPF/wDzP/8A2NcX/t9XP2f/ACTzWf8AsK2H/oq7oA5+vQLn/kr3i7/uOf8ApPc15/XoFz/yV7xd/wBxz/0nuaAD/mSP+5U/9zVef16B/wAyR/3Kn/uarz+gDoPAn/JQ/DX/AGFbX/0atc/XQeBP+Sh+Gv8AsK2v/o1a5+gAooooA6Dx3/yUPxL/ANhW6/8ARrVz9dB47/5KH4l/7Ct1/wCjWrn6ACiiigAroPGX/Ictv+wVpv8A6RQ1z9dB4y/5Dlt/2CtN/wDSKGgDn6KKKACiiigDoPD3/ID8Wf8AYKj/APS21r0C8/5KHo3/AGUC/wD/AEbaV5/4e/5Afiz/ALBUf/pba16Bef8AJQ9G/wCygX//AKNtKAPP7P8A5J5rP/YVsP8A0Vd0Xn/JPNG/7Ct//wCirSiz/wCSeaz/ANhWw/8ARV3Ref8AJPNG/wCwrf8A/oq0oA5+iiigDoLz/knmjf8AYVv/AP0VaUWf/JPNZ/7Cth/6Ku6Lz/knmjf9hW//APRVpRZ/8k81n/sK2H/oq7oA6DTv+Zc/7FTVf/chR/zJH/cqf+5qjTv+Zc/7FTVf/chR/wAyR/3Kn/uaoA6DxL/yA/HP/YV1X/0t0yuf+Ln/ACM8H/b9/wCnK8roPEv/ACA/HP8A2FdV/wDS3TK5/wCLn/Izwf8Ab9/6crygDn/GX/Ictv8AsFab/wCkUNc/XQeMv+Q5bf8AYK03/wBIoa5+gAooooAK6DxD/wAgPwn/ANgqT/0tuq5+ug8Q/wDID8J/9gqT/wBLbqgDn6KKKAOg8Q/8gPwn/wBgqT/0tuq5+ug8Q/8AID8J/wDYKk/9LbqufoAKKKKACiiigDoPBv8AyHLn/sFal/6RTVz9dB4N/wCQ5c/9grUv/SKaufoAK6Dwb/yHLn/sFal/6RTVz9dB4N/5Dlz/ANgrUv8A0imoA5+iiigAooooAK6Dxl/yHLb/ALBWm/8ApFDXP10HjL/kOW3/AGCtN/8ASKGgDn6KKKACiiigD2DwJ/x9+Gv+wVa/+n9a5/8A5kj/ALlT/wBzVdB4E/4+/DX/AGCrX/0/rXP/APMkf9yp/wC5qgDn/EP/ACA/Cf8A2CpP/S26o8d/8lD8S/8AYVuv/RrUeIf+QH4T/wCwVJ/6W3VHjv8A5KH4l/7Ct1/6NagDn66Cz/5J5rP/AGFbD/0Vd1z9dBZ/8k81n/sK2H/oq7oA6Dwh/wAyB/2Ncv8A7Y0eGf8AkWNP/wC5h/8ATbFR4Q/5kD/sa5f/AGxo8M/8ixp//cw/+m2KgA+I/wDy+f8AY16z/wC21ef16B8R/wDl8/7GvWf/AG2rz+gAooooAK6Cz/5J5rP/AGFbD/0Vd1z9dBZ/8k81n/sK2H/oq7oA5+iiigDoPHf/ACUPxL/2Fbr/ANGtXP10Hjv/AJKH4l/7Ct1/6NaufoAK6DxD/wAgPwn/ANgqT/0tuq5+ug8Q/wDID8J/9gqT/wBLbqgDn6KKKAOg8Q/8gPwn/wBgqT/0tuq5+ug8Q/8AID8J/wDYKk/9LbqufoAK6Dw9/wAgPxZ/2Co//S21rn66Dw9/yA/Fn/YKj/8AS21oA6Dxf/zP/wD2NcX/ALfVz9n/AMk81n/sK2H/AKKu66Dxf/zP/wD2NcX/ALfVz9n/AMk81n/sK2H/AKKu6AOfr0C5/wCSveLv+45/6T3Nef16Bc/8le8Xf9xz/wBJ7mgA/wCZI/7lT/3NV5/XoH/Mkf8Acqf+5qvP6AOg8Cf8lD8Nf9hW1/8ARq1z9dB4E/5KH4a/7Ctr/wCjVrn6ACiiigDoPHf/ACUPxL/2Fbr/ANGtXP10Hjv/AJKH4l/7Ct1/6NaufoAKKKKACug8Zf8AIctv+wVpv/pFDXP10HjL/kOW3/YK03/0ihoA5+iiigAooooA6Dw9/wAgPxZ/2Co//S21r0C8/wCSh6N/2UC//wDRtpXn/h7/AJAfiz/sFR/+ltrXoF5/yUPRv+ygX/8A6NtKAPP7P/knms/9hWw/9FXdF5/yTzRv+wrf/wDoq0os/wDknms/9hWw/wDRV3Ref8k80b/sK3//AKKtKAOfooooA6C8/wCSeaN/2Fb/AP8ARVpRZ/8AJPNZ/wCwrYf+irui8/5J5o3/AGFb/wD9FWlFn/yTzWf+wrYf+irugDoNO/5lz/sVNV/9yFH/ADJH/cqf+5qjTv8AmXP+xU1X/wByFH/Mkf8Acqf+5qgDoPEv/ID8c/8AYV1X/wBLdMrn/i5/yM8H/b9/6cryug8S/wDID8c/9hXVf/S3TK5/4uf8jPB/2/f+nK8oA5/xl/yHLb/sFab/AOkUNc/XQeMv+Q5bf9grTf8A0ihrn6ACiiigAroPEP8AyA/Cf/YKk/8AS26rn66DxD/yA/Cf/YKk/wDS26oA5+iiigDoPEP/ACA/Cf8A2CpP/S26rn66DxD/AMgPwn/2CpP/AEtuq5+gAooooAKKKKAOg8G/8hy5/wCwVqX/AKRTVz9dB4N/5Dlz/wBgrUv/AEimrn6ACug8G/8AIcuf+wVqX/pFNXP10Hg3/kOXP/YK1L/0imoA5+iiigAooooAK6Dxl/yHLb/sFab/AOkUNc/XQeMv+Q5bf9grTf8A0ihoA5+iiigAooooA9g8Cf8AH34a/wCwVa/+n9a5/wD5kj/uVP8A3NV0HgT/AI+/DX/YKtf/AE/rXP8A/Mkf9yp/7mqAOf8AEP8AyA/Cf/YKk/8AS26o8d/8lD8S/wDYVuv/AEa1HiH/AJAfhP8A7BUn/pbdUeO/+Sh+Jf8AsK3X/o1qAOfroLP/AJJ5rP8A2FbD/wBFXdc/XQWf/JPNZ/7Cth/6Ku6AOg8If8yB/wBjXL/7Y0eGf+RY0/8A7mH/ANNsVHhD/mQP+xrl/wDbGjwz/wAixp//AHMP/ptioAPiP/y+f9jXrP8A7bV5/XoHxH/5fP8Asa9Z/wDbavP6ACiiigAroLP/AJJ5rP8A2FbD/wBFXdc/XQWf/JPNZ/7Cth/6Ku6AOfooooA6Dx3/AMlD8S/9hW6/9GtXP10Hjv8A5KH4l/7Ct1/6NaufoAK6DxD/AMgPwn/2CpP/AEtuq5+ug8Q/8gPwn/2CpP8A0tuqAOfooooA6DxD/wAgPwn/ANgqT/0tuq5+ug8Q/wDID8J/9gqT/wBLbqufoAK6Dw9/yA/Fn/YKj/8AS21rn66Dw9/yA/Fn/YKj/wDS21oA6Dxf/wAz/wD9jXF/7fVz9n/yTzWf+wrYf+iruug8X/8AM/8A/Y1xf+31c/Z/8k81n/sK2H/oq7oA5+vQLn/kr3i7/uOf+k9zXn9egXP/ACV7xd/3HP8A0nuaAD/mSP8AuVP/AHNV5/XoH/Mkf9yp/wC5qvP6AOg8Cf8AJQ/DX/YVtf8A0atc/XQeBP8Akofhr/sK2v8A6NWufoAKKKKAOg8d/wDJQ/Ev/YVuv/RrVz9dB47/AOSh+Jf+wrdf+jWrn6ACiiigAroPGX/Ictv+wVpv/pFDXP10HjL/AJDlt/2CtN/9IoaAOfooooAKKKKAOg8Pf8gPxZ/2Co//AEtta9AvP+Sh6N/2UC//APRtpXn/AIe/5Afiz/sFR/8Apba16Bef8lD0b/soF/8A+jbSgDz+z/5J5rP/AGFbD/0Vd0Xn/JPNG/7Ct/8A+irSiz/5J5rP/YVsP/RV3Ref8k80b/sK3/8A6KtKAOfooooA6C8/5J5o3/YVv/8A0VaUWf8AyTzWf+wrYf8Aoq7ovP8Aknmjf9hW/wD/AEVaUWf/ACTzWf8AsK2H/oq7oA6DTv8AmXP+xU1X/wByFH/Mkf8Acqf+5qjTv+Zc/wCxU1X/ANyFH/Mkf9yp/wC5qgDoPEv/ACA/HP8A2FdV/wDS3TK5/wCLn/Izwf8Ab9/6cryug8S/8gPxz/2FdV/9LdMrn/i5/wAjPB/2/f8ApyvKAOf8Zf8AIctv+wVpv/pFDXP10HjL/kOW3/YK03/0ihrn6ACiiigAroPEP/ID8J/9gqT/ANLbqufroPEP/ID8J/8AYKk/9LbqgDn6KKKAOg8Q/wDID8J/9gqT/wBLbqufroPEP/ID8J/9gqT/ANLbqufoAKKKKACiiigDoPBv/Icuf+wVqX/pFNXP10Hg3/kOXP8A2CtS/wDSKaufoAK6Dwb/AMhy5/7BWpf+kU1c/XQeDf8AkOXP/YK1L/0imoA5+iiigAooooAK6Dxl/wAhy2/7BWm/+kUNc/XQeMv+Q5bf9grTf/SKGgDn6KKKACiiigD2DwJ/x9+Gv+wVa/8Ap/Wuf/5kj/uVP/c1XQeBP+Pvw1/2CrX/ANP61z//ADJH/cqf+5qgDn/EP/ID8J/9gqT/ANLbqjx3/wAlD8S/9hW6/wDRrUeIf+QH4T/7BUn/AKW3VHjv/kofiX/sK3X/AKNagDn66Cz/AOSeaz/2FbD/ANFXdc/XQWf/ACTzWf8AsK2H/oq7oA6Dwh/zIH/Y1y/+2NHhn/kWNP8A+5h/9NsVHhD/AJkD/sa5f/bGjwz/AMixp/8A3MP/AKbYqAD4j/8AL5/2Nes/+21ef16B8R/+Xz/sa9Z/9tq8/oAKKKKACugs/wDknms/9hWw/wDRV3XP10Fn/wAk81n/ALCth/6Ku6AOfooooA//2Q==", + "image/png": "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AQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQj8P51lrwIbA67KAAAAAElFTkSuQmCC", "text/plain": [ - "array([[0, 0, 0, ..., 0, 0, 0],\n", - " [0, 0, 0, ..., 0, 0, 0],\n", - " [0, 0, 0, ..., 0, 0, 0],\n", - " ...,\n", - " [0, 0, 0, ..., 0, 0, 0],\n", - " [0, 0, 0, ..., 0, 0, 0],\n", - " [0, 0, 0, ..., 0, 0, 0]], dtype=uint8)" + "" ] }, - "execution_count": 97, + "execution_count": 164, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "img_data.T" + "tmp_img" ] }, { diff --git a/wrdcld/__init__.py b/wrdcld/__init__.py index 8b34b79..7a8d19f 100644 --- a/wrdcld/__init__.py +++ b/wrdcld/__init__.py @@ -32,8 +32,7 @@ def make_word_cloud( word, required_font_size, available_rectangles, img, canvas ) - - for rectangle in available_rectangles: - canvas.rectangle(rectangle.xyrb) + # for rectangle in available_rectangles: + # canvas.rectangle(rectangle.xyrb) return img diff --git a/wrdcld/main.py b/wrdcld/main.py index 57d641b..730ba68 100644 --- a/wrdcld/main.py +++ b/wrdcld/main.py @@ -4,7 +4,9 @@ from .font import draw_text, get_default_font_path from .rectangle import ( Rectangle, - fill_remaining_space + fill_space_around_word, + fill_remaining_space_horizontal, + fill_remaining_space_vertical, ) def _fill( @@ -112,6 +114,14 @@ def fill_next_word(word, required_font_size, available_rectangles, img, canvas): rotate=True, ) - new_available_rectangles = fill_remaining_space(img, chosen_rectangle) + fill_direction = random.choice(["horizontal", "vertical"]) - return available_rectangles + new_available_rectangles + # figure out new available rectangles + fill_func = random.choice( + [fill_remaining_space_horizontal, fill_remaining_space_vertical] + ) + new_available_rectangles = fill_func(chosen_rectangle, text_rectangle) + + available_rectangles_around_word = fill_space_around_word(img, text_rectangle, fill_direction) + + return available_rectangles + new_available_rectangles + available_rectangles_around_word diff --git a/wrdcld/rectangle.py b/wrdcld/rectangle.py index 0a787c4..2644b72 100644 --- a/wrdcld/rectangle.py +++ b/wrdcld/rectangle.py @@ -47,9 +47,151 @@ def __repr__(self): return f"Rectangle(x={int(self.x)} y={int(self.y)} w={int(self.width)} h={int(self.height)})" -def fill_remaining_space( +def fill_remaining_space_horizontal( + outer_rect: Rectangle, inner_rect: Rectangle +) -> list[Rectangle]: + """ + Returns a list of rectangles that fill the remaining space between the outer and inner rectangles. + + Args: + outer_rect (Rectangle): Outer rectangle. + inner_rect (Rectangle): Inner rectangle. + + Returns: + list[Rectangle]: List of rectangles that fill the remaining space. + """ + # Calculate the remaining space + remaining_width = outer_rect.width - inner_rect.width + remaining_height = outer_rect.height - inner_rect.height + + # Calculate the x and y offsets for the inner rectangle + inner_x_offset = inner_rect.x - outer_rect.x + inner_y_offset = inner_rect.y - outer_rect.y + + # Create a list to store the rectangles that fill the remaining space + rectangles = [] + + # Top rectangle + if inner_y_offset > 0: + rectangles.append( + Rectangle( + x=outer_rect.x, + y=outer_rect.y, + width=outer_rect.width, + height=inner_y_offset, + ) + ) + + # Bottom rectangle + if remaining_height > 0: + rectangles.append( + Rectangle( + x=outer_rect.x, + y=inner_rect.bottom, + width=outer_rect.width, + height=outer_rect.height - inner_y_offset - inner_rect.height, + ) + ) + + # Left rectangle + if inner_x_offset > 0: + rectangles.append( + Rectangle( + x=outer_rect.x, + y=inner_rect.y, + width=inner_x_offset, + height=inner_rect.height, + ) + ) + + # Right rectangle + if remaining_width > 0: + rectangles.append( + Rectangle( + x=inner_rect.right, + y=inner_rect.y, + width=outer_rect.width - inner_x_offset - inner_rect.width, + height=inner_rect.height, + ) + ) + + return rectangles + + +def fill_remaining_space_vertical( + outer_rect: Rectangle, inner_rect: Rectangle +) -> list[Rectangle]: + """ + Returns a list of rectangles that fill the remaining space between the outer and inner rectangles. + + Args: + outer_rect (Rectangle): Outer rectangle. + inner_rect (Rectangle): Inner rectangle. + + Returns: + list[Rectangle]: List of rectangles that fill the remaining space. + """ + # Calculate the remaining space + remaining_width = outer_rect.width - inner_rect.width + remaining_height = outer_rect.height - inner_rect.height + + # Calculate the x and y offsets for the inner rectangle + inner_x_offset = inner_rect.x - outer_rect.x + inner_y_offset = inner_rect.y - outer_rect.y + + # Create a list to store the rectangles that fill the remaining space + rectangles = [] + + # Top rectangle + if inner_y_offset > 0: + rectangles.append( + Rectangle( + x=inner_rect.x, + y=outer_rect.y, + width=inner_rect.width, + height=inner_y_offset, + ) + ) + + # Bottom rectangle + if remaining_height > 0: + rectangles.append( + Rectangle( + x=inner_rect.x, + y=inner_rect.bottom, + width=inner_rect.width, + height=outer_rect.height - inner_y_offset - inner_rect.height, + ) + ) + + # Left rectangle + if inner_x_offset > 0: + rectangles.append( + Rectangle( + x=outer_rect.x, + y=outer_rect.y, + width=inner_x_offset, + height=outer_rect.height, + ) + ) + + # Right rectangle + if remaining_width > 0: + rectangles.append( + Rectangle( + x=inner_rect.right, + y=outer_rect.y, + width=outer_rect.width - inner_x_offset - inner_rect.width, + height=outer_rect.height, + ) + ) + + return rectangles + +def fill_space_around_word( img, - outer_rect: Rectangle + outer_rect: Rectangle, + fill_direction: str, ) -> list[Rectangle]: """ Returns a list of rectangles that fill the remaining space @@ -64,12 +206,20 @@ def fill_remaining_space( img_section = img.crop(outer_rect.xyrb) img_data = np.array(img_section.quantize(2)) + + if fill_direction == "horizontal": + img_data = img_data.T + base_value = img_data[0,0] min_rectangle_side_length = 5 rectangles = [Rectangle(x=0,y=0, width=img_data.shape[1], height=0)] for row_ind, img_row in enumerate(img_data): + + if fill_direction == "horizontal": + img_row = img_row[::-1] + # find the gaps between the letters left_inds = [] right_inds = [] @@ -104,11 +254,23 @@ def fill_remaining_space( rectangles += new_rectangles + # if we rotated the image, we need to rotate the rectangles back + if fill_direction == "horizontal": + rotated_rectangles = [] + for rectangle in rectangles: + rotated_rectangles.append(Rectangle( + x=rectangle.y, + y=img_data.shape[1] - (rectangle.x + rectangle.width) , + width=rectangle.height, + height=rectangle.width + )) + rectangles = rotated_rectangles + # offset the rectangles to the correct position rectangles = [ Rectangle(x=rectangle.x + outer_rect.x, y=rectangle.y + outer_rect.y, width=rectangle.width, height=rectangle.height) for rectangle in rectangles - if rectangle.height >= min_rectangle_side_length + if rectangle.height >= min_rectangle_side_length and rectangle.width >= min_rectangle_side_length ] return rectangles \ No newline at end of file From 7bcb6d42c464308ef8bdb1c53deb0017c1f126ec Mon Sep 17 00:00:00 2001 From: Jim Barrett Date: Tue, 13 Aug 2024 22:18:43 +0200 Subject: [PATCH 05/11] fix the bounding box issues --- space_filling_experiments.ipynb | 555 -------------------------------- wrdcld/font.py | 7 +- 2 files changed, 5 insertions(+), 557 deletions(-) delete mode 100644 space_filling_experiments.ipynb diff --git a/space_filling_experiments.ipynb b/space_filling_experiments.ipynb deleted file mode 100644 index 2995f5b..0000000 --- a/space_filling_experiments.ipynb +++ /dev/null @@ -1,555 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 1, - "id": "216783e4-03d3-4b5a-b5da-873b230567b2", - "metadata": {}, - "outputs": [], - "source": [ - "from pathlib import Path\n", - "from PIL import Image, ImageDraw, ImageFont\n", - "from collections import Counter\n", - "from dataclasses import dataclass\n", - "import random\n", - "import math\n", - "from wrdcld.font import get_default_font_path\n", - "from wrdcld.rectangle import Rectangle\n", - "import numpy as np" - ] - }, - { - "cell_type": "code", - "execution_count": 2, - "id": "06bee73d-4be4-4ebf-8197-f5d841effea3", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n", - " 0, 0], dtype=uint8)" - ] - }, - "execution_count": 2, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "img = Image.new('RGB', (500,500), color = (73, 109, 137))\n", - "canvas = ImageDraw.Draw(img)\n", - "\n", - "text = \"hello\"\n", - "size = 30\n", - "\n", - "font = ImageFont.truetype(get_default_font_path(), size)\n", - "\n", - "bbox = font.getbbox(text)\n", - "\n", - "text_dims = (bbox[2] - bbox[0], 2*(bbox[3] - bbox[1]))\n", - "\n", - "tmp_img = Image.new('RGB', text_dims,color = (0,0,0))\n", - "tmp_canvas = ImageDraw.Draw(tmp_img)\n", - "\n", - "\n", - "\n", - "\n", - "tmp_canvas.text(\n", - " (0,0), \n", - " text,\n", - " fill=(255,255,255),\n", - " font=font,\n", - ")\n", - "\n", - "img_data = np.array(tmp_img)[:,:,0]\n", - "\n", - "img_data[0,:]" - ] - }, - { - "cell_type": "code", - "execution_count": 3, - "id": "ec79e1a9-f152-4c78-a948-f1f0f1de470d", - "metadata": {}, - "outputs": [ - { - "data": { - "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAuAEQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD5/orurvw9pUXwSsPEKWuNVl1k2rz+Y3MXludu3O3qo5xmuFoAKKKKACiu6+EXh7SvFHj6DTNYtftNm0ErmPzGTJAyOVIP60vwj8PaV4n8fQaZrFr9ps2glcx+YyZIGRypB/WgDhKKD1ooAKKKKAPadHudHsf2fLS91ix+3pb6y729ozlElm2sAHI52gFmwOuAKi8H3+hfE66vPDWoeEtF0y6e1kksrzS4DC0bqON3J3fj6dOeMm//AOTbtM/7GFv/AEVJSfAX/kp8H/XpP/6DQBS+GPhG1106vrOo2FzqNlo8AkFhbBi91K2difLzjg5x7V2OhQS+J9Yi0TxB8KIdM0y6JiS9sdLlt5bYkfKzSEYYZxnOB3OelY3wf1FrjSfE3hW11JtO1bU4Ek064WUxEypn5Aw5BOR07bqp/wBmfGc3ptPM8XeYG27vtc3l/wDfe7bj3zQBp/CLSX0H453GkyOHazF1AXAxu25Gfxxms74Cf8lTtv8Ar2m/9Bq18FWvG+Mp/tGWSW9EdwJ3lk3szgYOWycnPeqvwE/5Knbf9e03/oNAGd8OfDWlajDrfiPxBG82kaHAJXtkbabiRs7Ez2HH6itHTfHvhrWNUh0zWfAmg22lXEgiM1jCYriEE4DeYDlsdT0zS/C6WDWPDvivwW08cN7q8CSWJkbasksZJ2Z9T8v5GsrQfhV4tvfEdvZ3miXljbJKDcXVxGUijQH5mDnhuM9CaAMfxz4Ybwf4x1DRPMMscDgxSN1aNgGUn3wcH3BorT+LHiC08S/EbU76xkWS0UpBFIvRwihSw9QSDj2xRQByjalfvpq6a17cmwSTzVtTK3lK+CNwTOM4J5xnmiw1K+0q6F1p17c2dwAVEtvK0bgHqMqQaq0UAKCVYMpII5BHath/F3iWS1+zP4h1ZrfGPKa9kKY9MbsVjUUAWrDUr/SrsXenXtzZ3IBAmt5WjcA9RlSDRYalf6VdC6069ubO4AIE1vK0bgHqMqQaq0UAKGKsGUkMDkEdRWpdeJ9fvrP7Hd65qdxa4x5Mt3I6Y/3ScVlUUAFFFFAH/9k=", - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEQAAAAuCAIAAAAeHijZAAAEFklEQVR4Ae1XWSutYRTehjIlU4YbFCmUC0UiQ5Eryo3coPwAQlEuFMkFSigulHkuUijlQrlBSUmZkgwXkgyZycE5D8tevd9k23t3Tud03u/i2+t71lrPet/nHbfJJB+pgFRAKiAVkApIBf5bBcrKyn5+PL9bAS7k7Ows1jLCxRiLtqPFiH8oQHbmbx0sOTJyZP6AAopphs0ZJX18fGpra9fW1h4fH19eXk5OTqanp3Nycr5oTWZm5vj4+PHxMeLv7++RW1dX5+/v/0WKVa7U1NT+/v69vb2np6fn5+ejo6ORkZGMjAx9Etrm0Y6YmBi0ic4c1bujo0Ob7OLiMjQ0pIqkz/Pz87S0NFWK0XlihLu6ug4ODuryAxwbG3Nzc1OVMBHX9fX1/v7+xcVFeXl5REQEiDBK2dnZm5ubRAdblQmF4Hp4eKiqqgoJCXFwcPDw8MjKytrZ2QF+e3sbFhYmphg1WhcH2+TkJJVGl1JSUvz8/Hx9fZOSknp6egifnZ11dFTMr8/OUPnIyEixPOzAwED0E15Qiy40GuDr62t6erqIw8YcOz09hRe9FV26jUaALp6XlwcGPFBKJCG7pKSEvEVFRQovczU0NCgc5o++vj5kHhwcmIH33/n5eYCq5nJAfX09vJjl7u7uDHKh71xnlpeXwbC1taXW3ky3tLREAQQoB8hkmpmZMUcqfnd3d/GNIWbU09OTlsTU1BSDorG6uopPLKqoqCgR/6aNWgkJCQgeHR19e3vTzRoeHgYOfprMitseHNvb27pp2EOAOzk5sTc6Opo+u7u7Ozs7GWeDtRclYK9FA/xYMwgjUXTj2YV9C6td3ZmrqyvdNC0YEBBAIFa81isiogQi/rWNtU4BZ2dnRpFYluSiYHVnjAZUS8fzGJNhZWVFG2AnQsMCEja0hOyixqjXjDbBCLm8vCRXcHCwUYw9OKseFBRkxMMuGj3bO4NNBjsJymD7NypmD47DjaZJXFycEQ+71tfXEWN7Z3C2YusERUFBgZeXl1E9m/Gbm5uFhQWk5+fn814ismGOFRYWAoGsh4eHMGzvDJKbmprwxuLD8YwtGLb2sbg9aFMYaWxshB0eHl5TU8MgG6WlpfHx8fhsbm5m8N3gs0yBCh8VFRWYVHd3dwL2bg4MDADHs7GxgZMYlyDscqGhoTiCKisrFxcXW1paxBQupBLbCO/q6iJ+XMOSk5O9vb0xCxITE3t7ewmfm5vjreizEHOJhUXbqDNoU1tbGyY3UWvfra2tIg8X+mZnENbe3q6lJWRiYkIcebumGVqJOz+GOzY2FiWxZPGvAWXwxnUdlTBW1dXVYmestcFfXFyM3R9DgWPxx8eDFYJrAf535Obm4qZvLaeMlwpIBaQCUgGpgFRAKiAVkApYp8Avtum4DL8+7aEAAAAASUVORK5CYII=", - "text/plain": [ - "" - ] - }, - "execution_count": 3, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tmp_img" - ] - }, - { - "cell_type": "code", - "execution_count": 4, - "id": "56bc00c8-0ca4-4eb3-bf26-aa5c372133cc", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(46, 68)" - ] - }, - "execution_count": 4, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "img_data.shape" - ] - }, - { - "cell_type": "code", - "execution_count": 126, - "id": "8fe01b43-b642-44a5-ada8-57ab77fc9d7b", - "metadata": {}, - "outputs": [], - "source": [ - "# text = \"hello\"\n", - "# size = 30\n", - "\n", - "# font = ImageFont.truetype(get_default_font_path(), size)\n", - "\n", - "# bbox = font.getbbox(text)\n", - "\n", - "# text_dims = (bbox[2] - bbox[0], 2*(bbox[3] - bbox[1]))\n", - "\n", - "# tmp_img = Image.new('RGB', text_dims,color = (0,0,0))\n", - "# tmp_canvas = ImageDraw.Draw(tmp_img)\n", - "\n", - "# np.array(tmp_img.quantize())\n", - "\n", - "\n", - "# tmp_canvas.text(\n", - "# (0,0), \n", - "# text,\n", - "# fill=(255,255,255),\n", - "# font=font,\n", - "# )\n", - "\n", - "# img_data = np.array(tmp_img.quantize(2))\n", - "\n", - "\n", - "# rectangles = [Rectangle(x=0,y=0, width=img_data.shape[1], height=0)]\n", - "# base_value = img_data[0,0]\n", - "# min_rectangle_side_length = 3\n", - "# for row_ind, img_row in enumerate(img_data):\n", - "# # find the gaps between the letters\n", - "# left_inds = []\n", - "# right_inds = []\n", - "# new_rect_active = False\n", - "# for col_ind, val in enumerate(img_row):\n", - "# if val == base_value and not new_rect_active:\n", - "# new_rect_active = True\n", - "# left_inds.append(col_ind)\n", - "# elif new_rect_active and val != base_value:\n", - "# new_rect_active = False\n", - "# right_inds.append(col_ind)\n", - "# else:\n", - "# continue\n", - "\n", - "# if new_rect_active:\n", - "# right_inds.append(img_data.shape[1])\n", - "\n", - "# new_rectangles = []\n", - "# for left_ind, right_ind in zip(left_inds, right_inds, strict=True):\n", - "# # if the rectangle is too small\n", - "# if right_ind - left_ind < min_rectangle_side_length:\n", - "# continue\n", - "# # if this is a continuation of an existing rectangle\n", - "# extended = False\n", - "# for rect_ind, rectangle in enumerate(rectangles):\n", - "# if rectangle.bottom == row_ind and rectangle.x == left_ind and rectangle.right == right_ind:\n", - "# rectangles[rect_ind] = Rectangle(x=rectangle.x, y=rectangle.y, width=rectangle.width, height=rectangle.height+1)\n", - "# extended = True\n", - "\n", - "# if not extended:\n", - "# new_rectangles.append(Rectangle(x=left_ind, y=row_ind, width=right_ind-left_ind, height=1))\n", - "\n", - "# rectangles += new_rectangles\n", - "\n", - "# rectangles = [rectangle for rectangle in rectangles if rectangle.height >= min_rectangle_side_length]\n", - "\n", - " " - ] - }, - { - "cell_type": "code", - "execution_count": 127, - "id": "e11a1dab-6e34-4055-9cf6-2b91b558f257", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Rectangle(x=0 y=0 w=68 h=10),\n", - " Rectangle(x=5 y=10 w=32 h=7),\n", - " Rectangle(x=40 y=10 w=5 h=23),\n", - " Rectangle(x=48 y=10 w=20 h=7),\n", - " Rectangle(x=33 y=20 w=4 h=5),\n", - " Rectangle(x=16 y=21 w=4 h=8),\n", - " Rectangle(x=48 y=21 w=4 h=8),\n", - " Rectangle(x=5 y=22 w=8 h=11),\n", - " Rectangle(x=54 y=23 w=10 h=4),\n", - " Rectangle(x=0 y=33 w=68 h=13)]" - ] - }, - "execution_count": 127, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "rectangles" - ] - }, - { - "cell_type": "code", - "execution_count": 118, - "id": "68d51d69-0f27-429d-9292-53d177d620cc", - "metadata": {}, - "outputs": [], - "source": [ - "for rectangle in rectangles:\n", - " tmp_canvas.rectangle(rectangle.xyrb)" - ] - }, - { - "cell_type": "code", - "execution_count": 119, - "id": "2122fd47-0adc-4dc6-8934-8ef3427ceb86", - "metadata": {}, - "outputs": [ - { - "data": { - "image/jpeg": "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", - "image/png": "iVBORw0KGgoAAAANSUhEUgAAAEQAAAAuCAIAAAAeHijZAAAD7klEQVR4Ae1Xyyt0YRif0chlyC2XjUukrFghIpIdxYqNYi9hoWxkY2EjJrIScovIUvkD2MxKISWXlZLocwl9he/3eZxnnvc1x8x3fJnTdM7ind/73C/ved4z7re3N1fUPNGUTEzUdAWJOMnYtZtOZ5zO/EAFnGP2A0W25MIdTZfmRwX6+vqQFT2WihKukuHk76/UMaNLmZDYeWdClihCAk5nIlT4kG6jqjMemS5Gitsd+WGtDToZ4ddY6czT01NpaenFxUVQnenpaaSqPfHx8cvLy0Hlr6+v6+vrNfn+/v6gwkyMjY2VKgkJCUtLS8zVwNraWmJiIst/cOmeub29PT09RRBwWVxcjEDT0tKam5sPDg7oHgDWzK2srID1+Pg4ODiYl5cHu16vt6mp6ejoCPT7+/vCwkKpYnahkX2sHk/gsMDa5uYmsRYXF2trazMyMtLT06urq2dnZ4m+tbUVE6O0xMU+4L6kpES6B87OzkaeUIZpyULQIL68vDQ0NEg6cGZm5uXlJbiULTnWVqnCLJlMW1sb0VEpKUy4p6eHuF1dXQqXkxkdHVUYxmZ+fh6aZ2dnpC9XhGtIKb8jIyMQe35+xsoMqchEAEnX8OHhoV57Q3N3dxfCEDAI77+cjGZI21J/SDM5OZm47e3tii1j09rayuoGTQmaiQAsCUB0HCciDg0NSUmJu7u7SUY5zDIZKc2YdB4eHthZZWUlE38Fe0iYZDQ7GhFcokh6TU2NJH6NW1paYCTwtrG/MEFWVhZJ4o0PU+WfxPCuszwmAWMJCgoKcPJBIWF1DkjBUJjPMVrEwzEogCWuayirAb5ZAgEJl4tlKBjrydzc3JDd3Nxc6eAzlhmGvGdYHcOQsRnIyckh1tXVFYD1ZHiGYPybOfsOHZcbq3NjNYBpRjJ7e3sA1pPB3UqGOjo6UlJS2PH/And3d2Tq5ORE+yygVuNo+f1+yKCs5+fnAFaS4fKQM7x8uJ7j4uJoq60WxoNmv6ioaHh4WDOLbW9vb3l5OcDY2JjCDX80K2ou18LCAvne39/HTYyPIEy5/Pz8urq6gYGBnZ2d8fFxqWLmiBOQXwBQnJmZIdbq6iqGdWpqKk5BVVXV3Nwc0be3t3kUfTgy88FxkCauDqYQgG+fz/f6+koCn9eJiQmpYuaIFbVksJ2ammKuBjY2NoJ03swHx0FWPidDAmVlZZOTk2gOvjiRGNbj4+P19fXOzs6kpCQ2AmDmiKPUkiHdiooKfFni5fn9/uBuwTdUY2OjtAwc+X8vWkDf2qIk39K3k7KVaWan+JVYnGSUctho43TGRs1QQnE6o5TDRhunMzZqhhKK0xmlHDba/AFtDpqzz4oVmwAAAABJRU5ErkJggg==", - "text/plain": [ - "" - ] - }, - "execution_count": 119, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tmp_img" - ] - }, - { - "cell_type": "code", - "execution_count": 161, - "id": "7054930e-1c3d-46a8-b19e-ed53b95c542b", - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "[Rectangle(x=0 y=0 w=462 h=26),\n", - " Rectangle(x=0 y=26 w=141 h=24),\n", - " Rectangle(x=369 y=26 w=93 h=24),\n", - " Rectangle(x=299 y=71 w=163 h=3),\n", - " Rectangle(x=301 y=76 w=161 h=3),\n", - " Rectangle(x=0 y=77 w=282 h=3),\n", - " Rectangle(x=302 y=79 w=160 h=3),\n", - " Rectangle(x=0 y=80 w=283 h=4),\n", - " Rectangle(x=303 y=82 w=159 h=4),\n", - " Rectangle(x=0 y=84 w=284 h=8),\n", - " Rectangle(x=304 y=86 w=158 h=6),\n", - " Rectangle(x=0 y=92 w=285 h=12),\n", - " Rectangle(x=305 y=92 w=157 h=20),\n", - " Rectangle(x=0 y=104 w=284 h=6),\n", - " Rectangle(x=0 y=110 w=283 h=4),\n", - " Rectangle(x=304 y=112 w=158 h=7),\n", - " Rectangle(x=0 y=114 w=282 h=3),\n", - " Rectangle(x=303 y=119 w=159 h=4),\n", - " Rectangle(x=302 y=123 w=160 h=4),\n", - " Rectangle(x=301 y=127 w=161 h=3),\n", - " Rectangle(x=0 y=135 w=141 h=25),\n", - " Rectangle(x=0 y=160 w=462 h=41),\n", - " Rectangle(x=0 y=245 w=143 h=3),\n", - " Rectangle(x=301 y=245 w=161 h=3),\n", - " Rectangle(x=0 y=248 w=142 h=3),\n", - " Rectangle(x=302 y=248 w=160 h=4),\n", - " Rectangle(x=0 y=251 w=141 h=4),\n", - " Rectangle(x=303 y=252 w=159 h=4),\n", - " Rectangle(x=163 y=254 w=54 h=3),\n", - " Rectangle(x=0 y=255 w=140 h=5),\n", - " Rectangle(x=237 y=255 w=46 h=4),\n", - " Rectangle(x=304 y=256 w=158 h=6),\n", - " Rectangle(x=161 y=259 w=56 h=4),\n", - " Rectangle(x=237 y=259 w=47 h=4),\n", - " Rectangle(x=0 y=260 w=139 h=7),\n", - " Rectangle(x=305 y=262 w=157 h=19),\n", - " Rectangle(x=160 y=263 w=57 h=5),\n", - " Rectangle(x=237 y=263 w=48 h=16),\n", - " Rectangle(x=0 y=267 w=138 h=24),\n", - " Rectangle(x=159 y=268 w=58 h=24),\n", - " Rectangle(x=237 y=279 w=47 h=5),\n", - " Rectangle(x=304 y=281 w=158 h=6),\n", - " Rectangle(x=237 y=284 w=46 h=3),\n", - " Rectangle(x=303 y=287 w=159 h=4),\n", - " Rectangle(x=0 y=291 w=139 h=9),\n", - " Rectangle(x=302 y=291 w=160 h=4),\n", - " Rectangle(x=160 y=292 w=57 h=8),\n", - " Rectangle(x=300 y=297 w=162 h=3),\n", - " Rectangle(x=0 y=300 w=140 h=6),\n", - " Rectangle(x=161 y=300 w=56 h=5),\n", - " Rectangle(x=162 y=305 w=55 h=4),\n", - " Rectangle(x=0 y=306 w=141 h=4),\n", - " Rectangle(x=163 y=309 w=54 h=3),\n", - " Rectangle(x=0 y=310 w=142 h=4),\n", - " Rectangle(x=164 y=312 w=53 h=4),\n", - " Rectangle(x=0 y=314 w=143 h=3),\n", - " Rectangle(x=0 y=317 w=144 h=3),\n", - " Rectangle(x=166 y=318 w=51 h=3),\n", - " Rectangle(x=0 y=320 w=145 h=3),\n", - " Rectangle(x=167 y=321 w=50 h=3),\n", - " Rectangle(x=0 y=325 w=147 h=3),\n", - " Rectangle(x=169 y=326 w=48 h=4),\n", - " Rectangle(x=0 y=330 w=217 h=7),\n", - " Rectangle(x=0 y=337 w=462 h=41),\n", - " Rectangle(x=0 y=378 w=141 h=24),\n", - " Rectangle(x=369 y=378 w=93 h=24),\n", - " Rectangle(x=0 y=402 w=462 h=52),\n", - " Rectangle(x=0 y=454 w=141 h=24),\n", - " Rectangle(x=369 y=454 w=93 h=24),\n", - " Rectangle(x=0 y=478 w=462 h=43),\n", - " Rectangle(x=298 y=559 w=164 h=3),\n", - " Rectangle(x=0 y=562 w=144 h=3),\n", - " Rectangle(x=301 y=566 w=161 h=4),\n", - " Rectangle(x=0 y=567 w=142 h=3),\n", - " Rectangle(x=0 y=570 w=141 h=3),\n", - " Rectangle(x=302 y=570 w=160 h=3),\n", - " Rectangle(x=0 y=573 w=140 h=5),\n", - " Rectangle(x=303 y=573 w=159 h=5),\n", - " Rectangle(x=0 y=578 w=139 h=6),\n", - " Rectangle(x=304 y=578 w=158 h=7),\n", - " Rectangle(x=160 y=579 w=123 h=3),\n", - " Rectangle(x=159 y=583 w=125 h=6),\n", - " Rectangle(x=0 y=584 w=138 h=20),\n", - " Rectangle(x=305 y=585 w=157 h=20),\n", - " Rectangle(x=158 y=589 w=126 h=11),\n", - " Rectangle(x=159 y=600 w=125 h=5),\n", - " Rectangle(x=0 y=604 w=139 h=7),\n", - " Rectangle(x=304 y=605 w=158 h=6),\n", - " Rectangle(x=160 y=607 w=123 h=3),\n", - " Rectangle(x=0 y=611 w=140 h=4),\n", - " Rectangle(x=303 y=611 w=159 h=5),\n", - " Rectangle(x=0 y=615 w=141 h=4),\n", - " Rectangle(x=302 y=616 w=160 h=3),\n", - " Rectangle(x=0 y=619 w=142 h=3),\n", - " Rectangle(x=301 y=619 w=161 h=3),\n", - " Rectangle(x=300 y=622 w=162 h=3),\n", - " Rectangle(x=0 y=624 w=144 h=3),\n", - " Rectangle(x=0 y=668 w=462 h=16)]" - ] - }, - "execution_count": 161, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "text = \"hello\"\n", - "size = 300\n", - "\n", - "font = ImageFont.truetype(get_default_font_path(), size)\n", - "\n", - "bbox = font.getbbox(text)\n", - "\n", - "text_dims = (bbox[2] - bbox[0], 2*(bbox[3] - bbox[1]))\n", - "\n", - "tmp_img = Image.new('RGB', text_dims,color = (0,0,0))\n", - "tmp_canvas = ImageDraw.Draw(tmp_img)\n", - "\n", - "np.array(tmp_img.quantize())\n", - "\n", - "\n", - "tmp_canvas.text(\n", - " (0,0), \n", - " text,\n", - " fill=(255,255,255),\n", - " font=font,\n", - ")\n", - "\n", - "img_data = np.array(tmp_img.quantize(2)).T\n", - "\n", - "\n", - "rectangles = [Rectangle(x=0,y=0, width=img_data.shape[1], height=0)]\n", - "base_value = img_data[0,0]\n", - "min_rectangle_side_length = 3\n", - "for row_ind, img_row in enumerate(img_data):\n", - "\n", - " img_row = img_row[::-1]\n", - " \n", - " # find the gaps between the letters\n", - " left_inds = []\n", - " right_inds = []\n", - " new_rect_active = False\n", - " for col_ind, val in enumerate(img_row):\n", - " if val == base_value and not new_rect_active:\n", - " new_rect_active = True\n", - " left_inds.append(col_ind)\n", - " elif new_rect_active and val != base_value:\n", - " new_rect_active = False\n", - " right_inds.append(col_ind)\n", - " else:\n", - " continue\n", - "\n", - " if new_rect_active:\n", - " right_inds.append(img_data.shape[1])\n", - "\n", - " new_rectangles = []\n", - " for left_ind, right_ind in zip(left_inds, right_inds, strict=True):\n", - " # if the rectangle is too small\n", - " if right_ind - left_ind < min_rectangle_side_length:\n", - " continue\n", - " # if this is a continuation of an existing rectangle\n", - " extended = False\n", - " for rect_ind, rectangle in enumerate(rectangles):\n", - " if rectangle.bottom == row_ind and rectangle.x == left_ind and rectangle.right == right_ind:\n", - " rectangles[rect_ind] = Rectangle(x=rectangle.x, y=rectangle.y, width=rectangle.width, height=rectangle.height+1)\n", - " extended = True\n", - "\n", - " if not extended:\n", - " new_rectangles.append(Rectangle(x=left_ind, y=row_ind, width=right_ind-left_ind, height=1))\n", - "\n", - " rectangles += new_rectangles\n", - "\n", - "rectangles = [rectangle for rectangle in rectangles if rectangle.height >= min_rectangle_side_length and rectangle.width >= min_rectangle_side_length]\n", - "\n", - "rectangles" - ] - }, - { - "cell_type": "code", - "execution_count": 162, - "id": "0dbcd09f-518d-49eb-99c3-d6d050a99af8", - "metadata": {}, - "outputs": [], - "source": [ - "\n", - "\n", - "rotated_rectangles = []\n", - "for rectangle in rectangles:\n", - " rotated_rectangles.append(Rectangle(\n", - " x=rectangle.y,\n", - " y=img_data.shape[1] - (rectangle.x + rectangle.width) ,\n", - " width=rectangle.height,\n", - " height=rectangle.width\n", - " ))\n", - "\n", - "for rectangle in rotated_rectangles:\n", - " tmp_canvas.rectangle(rectangle.xyrb)" - ] - }, - { - "cell_type": "code", - "execution_count": 163, - "id": "6e7ea5b5-ecbc-470c-b5fa-1c68f5776f88", - "metadata": {}, - "outputs": [ - { - "data": { - "image/jpeg": "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", - "image/png": "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AQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQj8P51lrwIbA67KAAAAAElFTkSuQmCC", - "text/plain": [ - "" - ] - }, - "execution_count": 163, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tmp_img" - ] - }, - { - "cell_type": "code", - "execution_count": 164, - "id": "41739495-9053-4ea7-b36f-cbc0f7dd5339", - "metadata": {}, - "outputs": [ - { - "data": { - "image/jpeg": "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", - "image/png": "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AQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQgQBDAGIAABCEAAAoESIAgItONxGwIQgAAEIEAQwBiAAAQgAAEIBEqAICDQjsdtCEAAAhCAAEEAYwACEIAABCAQKAGCgEA7HrchAAEIQAACBAGMAQhAAAIQgECgBAgCAu143IYABCAAAQj8P51lrwIbA67KAAAAAElFTkSuQmCC", - "text/plain": [ - "" - ] - }, - "execution_count": 164, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "tmp_img" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "bcbccb8e-f8ea-40ce-ba69-83a13d974ac3", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "7541a693-24e0-436c-9530-e7b694233739", - "metadata": {}, - "outputs": [], - "source": [] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "b6598d1d-ecee-4e6f-b643-606d72fb0c83", - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.11.2" - } - }, - "nbformat": 4, - "nbformat_minor": 5 -} diff --git a/wrdcld/font.py b/wrdcld/font.py index b3d2b52..24f0df4 100644 --- a/wrdcld/font.py +++ b/wrdcld/font.py @@ -28,14 +28,17 @@ def find_fontsize_for_width(width, word): def draw_text(canvas, img, rectangle, word, font, rotate=False): FONT_COLOR = (255, 255, 0) + text_bbox = font.getbbox(word) + if rotate: text_image = Image.new("RGB", rectangle.rotated_ccw.wh, (73, 109, 137)) text_draw = ImageDraw.Draw(text_image) - text_draw.text((0, 0), word, font=font, fill=FONT_COLOR) + + text_draw.text((-text_bbox[0], -text_bbox[1]), word, font=font, fill=FONT_COLOR) rotated_text_image = text_image.rotate(90, expand=True) img.paste(rotated_text_image, rectangle.xy) # canvas.rectangle(rectangle.xyrb) else: - canvas.text(rectangle.xy, word, font=font, fill=FONT_COLOR) + canvas.text((rectangle.x-text_bbox[0],rectangle.y-text_bbox[1]), word, font=font, fill=FONT_COLOR) # canvas.rectangle(rectangle.xyrb) From b8a91182fd55547162c2fd62a10a9993d468e0ee Mon Sep 17 00:00:00 2001 From: Jim Barrett Date: Tue, 13 Aug 2024 22:22:27 +0200 Subject: [PATCH 06/11] a few docstrings --- wrdcld/font.py | 4 ++++ wrdcld/rectangle.py | 15 +++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/wrdcld/font.py b/wrdcld/font.py index 24f0df4..7c881d7 100644 --- a/wrdcld/font.py +++ b/wrdcld/font.py @@ -26,8 +26,12 @@ def find_fontsize_for_width(width, word): def draw_text(canvas, img, rectangle, word, font, rotate=False): + """ + + """ FONT_COLOR = (255, 255, 0) + # text can sometimes have a negative bounding box, so we need to account for that text_bbox = font.getbbox(word) if rotate: diff --git a/wrdcld/rectangle.py b/wrdcld/rectangle.py index 2644b72..2bd6979 100644 --- a/wrdcld/rectangle.py +++ b/wrdcld/rectangle.py @@ -12,10 +12,16 @@ class Rectangle: @property def xy(self): + """ + Returns the coordinates of the rectangle as a tuple (x, y). + """ return (int(self.x + 0.5), int(self.y + 0.5)) @property def wh(self): + """ + Returns the width and height of the rectangle as a tuple (width, height). + """ return (math.ceil(self.width), math.ceil(self.height)) @property @@ -28,14 +34,23 @@ def bottom(self): @property def xyrb(self): + """ + Returns the coordinates of the rectangle as a tuple (x, y, right, bottom). + """ return (self.x, self.y, self.x + self.width, self.y + self.height) @property def area(self): + """ + Returns the area of the rectangle. + """ return self.width * self.height @property def rotated_ccw(self): + """ + Returns a new rectangle that is rotated 90 degrees counter-clockwise. + """ return Rectangle( x=self.x, y=self.y + self.height - self.width, From 7ba4a53186f2d083c22cb58925416ac2c7c6bed6 Mon Sep 17 00:00:00 2001 From: Jim Barrett Date: Tue, 13 Aug 2024 22:39:17 +0200 Subject: [PATCH 07/11] refactor for simplicity and lint and reformat --- wrdcld/font.py | 13 +++- wrdcld/main.py | 12 ++- wrdcld/rectangle.py | 185 +++++++++++++++++++++++++++++++------------- wrdcld/util.py | 3 +- 4 files changed, 153 insertions(+), 60 deletions(-) diff --git a/wrdcld/font.py b/wrdcld/font.py index 7c881d7..ad59bee 100644 --- a/wrdcld/font.py +++ b/wrdcld/font.py @@ -1,7 +1,7 @@ -from pathlib import Path from PIL import Image, ImageDraw, ImageFont from wrdcld.util import get_repo_root + def get_default_font_path(): return get_repo_root() / "fonts" / "OpenSans-Regular.ttf" @@ -13,7 +13,7 @@ def find_fontsize_for_width(width, word): font_path = get_default_font_path() while step > 0.5: step /= 2 - + font = ImageFont.truetype(font_path, fontsize) length = font.getlength(word) @@ -27,7 +27,7 @@ def find_fontsize_for_width(width, word): def draw_text(canvas, img, rectangle, word, font, rotate=False): """ - + Draws the text on the img with the correct orientation. """ FONT_COLOR = (255, 255, 0) @@ -44,5 +44,10 @@ def draw_text(canvas, img, rectangle, word, font, rotate=False): # canvas.rectangle(rectangle.xyrb) else: - canvas.text((rectangle.x-text_bbox[0],rectangle.y-text_bbox[1]), word, font=font, fill=FONT_COLOR) + canvas.text( + (rectangle.x - text_bbox[0], rectangle.y - text_bbox[1]), + word, + font=font, + fill=FONT_COLOR, + ) # canvas.rectangle(rectangle.xyrb) diff --git a/wrdcld/main.py b/wrdcld/main.py index 730ba68..16363e5 100644 --- a/wrdcld/main.py +++ b/wrdcld/main.py @@ -9,6 +9,7 @@ fill_remaining_space_vertical, ) + def _fill( rectangle: Rectangle, canvas, @@ -50,6 +51,7 @@ def _fill( return text_rectangle + def fill_next_word(word, required_font_size, available_rectangles, img, canvas): font_path = get_default_font_path() font = ImageFont.truetype(font_path, required_font_size) @@ -122,6 +124,12 @@ def fill_next_word(word, required_font_size, available_rectangles, img, canvas): ) new_available_rectangles = fill_func(chosen_rectangle, text_rectangle) - available_rectangles_around_word = fill_space_around_word(img, text_rectangle, fill_direction) + available_rectangles_around_word = fill_space_around_word( + img, text_rectangle, fill_direction + ) - return available_rectangles + new_available_rectangles + available_rectangles_around_word + return ( + available_rectangles + + new_available_rectangles + + available_rectangles_around_word + ) diff --git a/wrdcld/rectangle.py b/wrdcld/rectangle.py index 2bd6979..67731fb 100644 --- a/wrdcld/rectangle.py +++ b/wrdcld/rectangle.py @@ -2,6 +2,8 @@ import math import numpy as np +MIN_RECTANGLE_SIDE_LENGTH = 5 + @dataclass(frozen=True) class Rectangle: @@ -62,6 +64,24 @@ def __repr__(self): return f"Rectangle(x={int(self.x)} y={int(self.y)} w={int(self.width)} h={int(self.height)})" +def _remove_small_rectangles(rectangles: list[Rectangle]) -> list[Rectangle]: + """ + Removes rectangles that are smaller than the minimum rectangle side length. + + Args: + rectangles (list[Rectangle]): List of rectangles. + + Returns: + list[Rectangle]: List of rectangles with the small rectangles removed. + """ + return [ + rectangle + for rectangle in rectangles + if rectangle.height >= MIN_RECTANGLE_SIDE_LENGTH + and rectangle.width >= MIN_RECTANGLE_SIDE_LENGTH + ] + + def fill_remaining_space_horizontal( outer_rect: Rectangle, inner_rect: Rectangle ) -> list[Rectangle]: @@ -130,6 +150,8 @@ def fill_remaining_space_horizontal( ) ) + rectangles = _remove_small_rectangles(rectangles) + return rectangles @@ -201,11 +223,87 @@ def fill_remaining_space_vertical( ) ) + rectangles = _remove_small_rectangles(rectangles) + return rectangles + +def _find_gaps_for_img_row( + img_row: np.array, base_value: int, image_width: int +) -> tuple[list[int], list[int]]: + """ + Finds the gaps in a row of an image. + + Args: + img_row (np.array): The row of the image. + base_value (int): The base value to compare against (the image background). + image_width (int): The width of the image. + + Returns: + tuple[list[int], list[int]]: Tuple containing two lists. The first list contains the indices of the left edges of the gaps, and the second list contains the indices of the right edges of the gaps. + """ + left_inds = [] + right_inds = [] + + # find the gaps between the letters + left_inds = [] + right_inds = [] + new_rect_active = False + for col_ind, val in enumerate(img_row): + if val == base_value and not new_rect_active: + new_rect_active = True + left_inds.append(col_ind) + elif new_rect_active and val != base_value: + new_rect_active = False + right_inds.append(col_ind) + else: + continue + + if new_rect_active: + right_inds.append(image_width) + + return left_inds, right_inds + + +def _make_new_rectangles( + rectangles: list[Rectangle], + row_ind: int, + left_inds: list[int], + right_inds: list[int], +): + + new_rectangles = [] + for left_ind, right_ind in zip(left_inds, right_inds, strict=True): + # if the rectangle is too small + if right_ind - left_ind < MIN_RECTANGLE_SIDE_LENGTH: + continue + # if this is a continuation of an existing rectangle + extended = False + for rect_ind, rectangle in enumerate(rectangles): + if ( + rectangle.bottom == row_ind + and rectangle.x == left_ind + and rectangle.right == right_ind + ): + rectangles[rect_ind] = Rectangle( + x=rectangle.x, + y=rectangle.y, + width=rectangle.width, + height=rectangle.height + 1, + ) + extended = True + # otherwise it's a new rectangle + if not extended: + new_rectangles.append( + Rectangle(x=left_ind, y=row_ind, width=right_ind - left_ind, height=1) + ) + + return new_rectangles + + def fill_space_around_word( img, - outer_rect: Rectangle, + text_rect: Rectangle, fill_direction: str, ) -> list[Rectangle]: """ @@ -213,79 +311,60 @@ def fill_space_around_word( Args: img (Image): the overaall wordcloud image. - inner_rect (Rectangle): The rectangle containing the new text. + text_rect (Rectangle): The rectangle containing the new text. + fill_direction (str): The direction to fill the space in. Either "horizontal" or "vertical". Returns: list[Rectangle]: List of rectangles that fill the remaining space. """ - img_section = img.crop(outer_rect.xyrb) + img_section = img.crop(text_rect.xyrb) img_data = np.array(img_section.quantize(2)) - + if fill_direction == "horizontal": img_data = img_data.T - - base_value = img_data[0,0] - min_rectangle_side_length = 5 - - rectangles = [Rectangle(x=0,y=0, width=img_data.shape[1], height=0)] + base_value = img_data[0, 0] + rectangles = [Rectangle(x=0, y=0, width=img_data.shape[1], height=0)] for row_ind, img_row in enumerate(img_data): if fill_direction == "horizontal": img_row = img_row[::-1] - # find the gaps between the letters - left_inds = [] - right_inds = [] - new_rect_active = False - for col_ind, val in enumerate(img_row): - if val == base_value and not new_rect_active: - new_rect_active = True - left_inds.append(col_ind) - elif new_rect_active and val != base_value: - new_rect_active = False - right_inds.append(col_ind) - else: - continue - - if new_rect_active: - right_inds.append(img_data.shape[1]) - - new_rectangles = [] - for left_ind, right_ind in zip(left_inds, right_inds, strict=True): - # if the rectangle is too small - if right_ind - left_ind < min_rectangle_side_length: - continue - # if this is a continuation of an existing rectangle - extended = False - for rect_ind, rectangle in enumerate(rectangles): - if rectangle.bottom == row_ind and rectangle.x == left_ind and rectangle.right == right_ind: - rectangles[rect_ind] = Rectangle(x=rectangle.x, y=rectangle.y, width=rectangle.width, height=rectangle.height+1) - extended = True - # otherwise it's a new rectangle - if not extended: - new_rectangles.append(Rectangle(x=left_ind, y=row_ind, width=right_ind-left_ind, height=1)) - - rectangles += new_rectangles + left_inds, right_inds = _find_gaps_for_img_row( + img_row, base_value, img_data.shape[1] + ) + + new_rectangles = _make_new_rectangles( + rectangles, row_ind, left_inds, right_inds + ) + rectangles.extend(new_rectangles) + + rectangles = _remove_small_rectangles(rectangles) # if we rotated the image, we need to rotate the rectangles back if fill_direction == "horizontal": rotated_rectangles = [] for rectangle in rectangles: - rotated_rectangles.append(Rectangle( - x=rectangle.y, - y=img_data.shape[1] - (rectangle.x + rectangle.width) , - width=rectangle.height, - height=rectangle.width - )) + rotated_rectangles.append( + Rectangle( + x=rectangle.y, + y=img_data.shape[1] - (rectangle.x + rectangle.width), + width=rectangle.height, + height=rectangle.width, + ) + ) rectangles = rotated_rectangles - + # offset the rectangles to the correct position rectangles = [ - Rectangle(x=rectangle.x + outer_rect.x, y=rectangle.y + outer_rect.y, width=rectangle.width, height=rectangle.height) - for rectangle in rectangles - if rectangle.height >= min_rectangle_side_length and rectangle.width >= min_rectangle_side_length + Rectangle( + x=rectangle.x + text_rect.x, + y=rectangle.y + text_rect.y, + width=rectangle.width, + height=rectangle.height, + ) + for rectangle in rectangles ] - return rectangles \ No newline at end of file + return rectangles diff --git a/wrdcld/util.py b/wrdcld/util.py index 39ff2bd..648496f 100644 --- a/wrdcld/util.py +++ b/wrdcld/util.py @@ -1,4 +1,5 @@ from pathlib import Path + def get_repo_root(): - return Path(__file__).parent.parent \ No newline at end of file + return Path(__file__).parent.parent From 365325309c01a1c392b8e4e40c21c80d782429ae Mon Sep 17 00:00:00 2001 From: Jim Barrett Date: Wed, 14 Aug 2024 11:51:44 +0200 Subject: [PATCH 08/11] remove numpy dependency --- poetry.lock | 56 +-------------------------------------------- pyproject.toml | 1 - wrdcld/rectangle.py | 27 +++++++++++++--------- 3 files changed, 17 insertions(+), 67 deletions(-) diff --git a/poetry.lock b/poetry.lock index cde71b8..fba1b9c 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1444,60 +1444,6 @@ jupyter-server = ">=1.8,<3" [package.extras] test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] -[[package]] -name = "numpy" -version = "2.0.1" -description = "Fundamental package for array computing in Python" -optional = false -python-versions = ">=3.9" -files = [ - {file = "numpy-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0fbb536eac80e27a2793ffd787895242b7f18ef792563d742c2d673bfcb75134"}, - {file = "numpy-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:69ff563d43c69b1baba77af455dd0a839df8d25e8590e79c90fcbe1499ebde42"}, - {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:1b902ce0e0a5bb7704556a217c4f63a7974f8f43e090aff03fcf262e0b135e02"}, - {file = "numpy-2.0.1-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:f1659887361a7151f89e79b276ed8dff3d75877df906328f14d8bb40bb4f5101"}, - {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4658c398d65d1b25e1760de3157011a80375da861709abd7cef3bad65d6543f9"}, - {file = "numpy-2.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4127d4303b9ac9f94ca0441138acead39928938660ca58329fe156f84b9f3015"}, - {file = "numpy-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e5eeca8067ad04bc8a2a8731183d51d7cbaac66d86085d5f4766ee6bf19c7f87"}, - {file = "numpy-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9adbd9bb520c866e1bfd7e10e1880a1f7749f1f6e5017686a5fbb9b72cf69f82"}, - {file = "numpy-2.0.1-cp310-cp310-win32.whl", hash = "sha256:7b9853803278db3bdcc6cd5beca37815b133e9e77ff3d4733c247414e78eb8d1"}, - {file = "numpy-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:81b0893a39bc5b865b8bf89e9ad7807e16717f19868e9d234bdaf9b1f1393868"}, - {file = "numpy-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75b4e316c5902d8163ef9d423b1c3f2f6252226d1aa5cd8a0a03a7d01ffc6268"}, - {file = "numpy-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6e4eeb6eb2fced786e32e6d8df9e755ce5be920d17f7ce00bc38fcde8ccdbf9e"}, - {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a1e01dcaab205fbece13c1410253a9eea1b1c9b61d237b6fa59bcc46e8e89343"}, - {file = "numpy-2.0.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:a8fc2de81ad835d999113ddf87d1ea2b0f4704cbd947c948d2f5513deafe5a7b"}, - {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a3d94942c331dd4e0e1147f7a8699a4aa47dffc11bf8a1523c12af8b2e91bbe"}, - {file = "numpy-2.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15eb4eca47d36ec3f78cde0a3a2ee24cf05ca7396ef808dda2c0ddad7c2bde67"}, - {file = "numpy-2.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b83e16a5511d1b1f8a88cbabb1a6f6a499f82c062a4251892d9ad5d609863fb7"}, - {file = "numpy-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f87fec1f9bc1efd23f4227becff04bd0e979e23ca50cc92ec88b38489db3b55"}, - {file = "numpy-2.0.1-cp311-cp311-win32.whl", hash = "sha256:36d3a9405fd7c511804dc56fc32974fa5533bdeb3cd1604d6b8ff1d292b819c4"}, - {file = "numpy-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:08458fbf403bff5e2b45f08eda195d4b0c9b35682311da5a5a0a0925b11b9bd8"}, - {file = "numpy-2.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6bf4e6f4a2a2e26655717a1983ef6324f2664d7011f6ef7482e8c0b3d51e82ac"}, - {file = "numpy-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6fddc5fe258d3328cd8e3d7d3e02234c5d70e01ebe377a6ab92adb14039cb4"}, - {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5daab361be6ddeb299a918a7c0864fa8618af66019138263247af405018b04e1"}, - {file = "numpy-2.0.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:ea2326a4dca88e4a274ba3a4405eb6c6467d3ffbd8c7d38632502eaae3820587"}, - {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:529af13c5f4b7a932fb0e1911d3a75da204eff023ee5e0e79c1751564221a5c8"}, - {file = "numpy-2.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6790654cb13eab303d8402354fabd47472b24635700f631f041bd0b65e37298a"}, - {file = "numpy-2.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:cbab9fc9c391700e3e1287666dfd82d8666d10e69a6c4a09ab97574c0b7ee0a7"}, - {file = "numpy-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:99d0d92a5e3613c33a5f01db206a33f8fdf3d71f2912b0de1739894668b7a93b"}, - {file = "numpy-2.0.1-cp312-cp312-win32.whl", hash = "sha256:173a00b9995f73b79eb0191129f2455f1e34c203f559dd118636858cc452a1bf"}, - {file = "numpy-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:bb2124fdc6e62baae159ebcfa368708867eb56806804d005860b6007388df171"}, - {file = "numpy-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bfc085b28d62ff4009364e7ca34b80a9a080cbd97c2c0630bb5f7f770dae9414"}, - {file = "numpy-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8fae4ebbf95a179c1156fab0b142b74e4ba4204c87bde8d3d8b6f9c34c5825ef"}, - {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:72dc22e9ec8f6eaa206deb1b1355eb2e253899d7347f5e2fae5f0af613741d06"}, - {file = "numpy-2.0.1-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:ec87f5f8aca726117a1c9b7083e7656a9d0d606eec7299cc067bb83d26f16e0c"}, - {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f682ea61a88479d9498bf2091fdcd722b090724b08b31d63e022adc063bad59"}, - {file = "numpy-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8efc84f01c1cd7e34b3fb310183e72fcdf55293ee736d679b6d35b35d80bba26"}, - {file = "numpy-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3fdabe3e2a52bc4eff8dc7a5044342f8bd9f11ef0934fcd3289a788c0eb10018"}, - {file = "numpy-2.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:24a0e1befbfa14615b49ba9659d3d8818a0f4d8a1c5822af8696706fbda7310c"}, - {file = "numpy-2.0.1-cp39-cp39-win32.whl", hash = "sha256:f9cf5ea551aec449206954b075db819f52adc1638d46a6738253a712d553c7b4"}, - {file = "numpy-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:e9e81fa9017eaa416c056e5d9e71be93d05e2c3c2ab308d23307a8bc4443c368"}, - {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61728fba1e464f789b11deb78a57805c70b2ed02343560456190d0501ba37b0f"}, - {file = "numpy-2.0.1-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:12f5d865d60fb9734e60a60f1d5afa6d962d8d4467c120a1c0cda6eb2964437d"}, - {file = "numpy-2.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eacf3291e263d5a67d8c1a581a8ebbcfd6447204ef58828caf69a5e3e8c75990"}, - {file = "numpy-2.0.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:2c3a346ae20cfd80b6cfd3e60dc179963ef2ea58da5ec074fd3d9e7a1e7ba97f"}, - {file = "numpy-2.0.1.tar.gz", hash = "sha256:485b87235796410c3519a699cfe1faab097e509e90ebb05dcd098db2ae87e7b3"}, -] - [[package]] name = "overrides" version = "7.7.0" @@ -2597,4 +2543,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "a1364de59de22bc2b6dbcbe251564ddaabaf6b7285e2db81f4878bab46bf07e2" +content-hash = "97c391ad142e40a53b2cf4a89be811f7f91afd8eaf80415ad2291ed36abdf1ce" diff --git a/pyproject.toml b/pyproject.toml index e8a16a3..8f89715 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,6 @@ readme = "README.md" [tool.poetry.dependencies] python = "^3.9" pillow = "^10.4.0" -numpy = "^2.0.1" [tool.poetry.group.dev.dependencies] black = "^24.8.0" diff --git a/wrdcld/rectangle.py b/wrdcld/rectangle.py index 67731fb..03a7f26 100644 --- a/wrdcld/rectangle.py +++ b/wrdcld/rectangle.py @@ -1,10 +1,8 @@ from dataclasses import dataclass import math -import numpy as np MIN_RECTANGLE_SIDE_LENGTH = 5 - @dataclass(frozen=True) class Rectangle: width: float @@ -229,13 +227,13 @@ def fill_remaining_space_vertical( def _find_gaps_for_img_row( - img_row: np.array, base_value: int, image_width: int + img_row: list[int], base_value: int, image_width: int ) -> tuple[list[int], list[int]]: """ Finds the gaps in a row of an image. Args: - img_row (np.array): The row of the image. + img_row (list[int]): The row of the image. base_value (int): The base value to compare against (the image background). image_width (int): The width of the image. @@ -292,6 +290,7 @@ def _make_new_rectangles( height=rectangle.height + 1, ) extended = True + break # otherwise it's a new rectangle if not extended: new_rectangles.append( @@ -319,20 +318,26 @@ def fill_space_around_word( """ img_section = img.crop(text_rect.xyrb) - img_data = np.array(img_section.quantize(2)) - + img_width, img_height = img_section.size + + # get the image data as a 2D array + img_data = img_section.quantize(2).getdata() + img_data = [val for val in img_data] + img_data = [img_data[i * img_width : (i + 1) * img_width] for i in range(img_height)] + + # transpose if fill_direction == "horizontal": - img_data = img_data.T + img_data = list(zip(*img_data)) - base_value = img_data[0, 0] - rectangles = [Rectangle(x=0, y=0, width=img_data.shape[1], height=0)] + base_value = img_data[0][0] + rectangles = [Rectangle(x=0, y=0, width=len(img_data[0]), height=0)] for row_ind, img_row in enumerate(img_data): if fill_direction == "horizontal": img_row = img_row[::-1] left_inds, right_inds = _find_gaps_for_img_row( - img_row, base_value, img_data.shape[1] + img_row, base_value, len(img_data[0]) ) new_rectangles = _make_new_rectangles( @@ -349,7 +354,7 @@ def fill_space_around_word( rotated_rectangles.append( Rectangle( x=rectangle.y, - y=img_data.shape[1] - (rectangle.x + rectangle.width), + y=len(img_data[0]) - (rectangle.x + rectangle.width), width=rectangle.height, height=rectangle.width, ) From a7f34b8c6797ce69e2749b36841faab6cb29e3b9 Mon Sep 17 00:00:00 2001 From: Jim Barrett Date: Wed, 14 Aug 2024 11:58:02 +0200 Subject: [PATCH 09/11] add isort as a dev dependency and reformat and stylecheck --- README.md | 2 +- poetry.lock | 2 +- pyproject.toml | 4 ++++ tests/test_rectangle.py | 3 ++- wrdcld/__init__.py | 3 ++- wrdcld/font.py | 1 + wrdcld/main.py | 3 ++- wrdcld/rectangle.py | 12 ++++++++---- 8 files changed, 21 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index cfe99dc..fedfd53 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ A predictable, interpretable wordcloud library Run `poetry install` ## Development -Run `poetry run black wrdcld tests` and `poetry run pylint wrdcld tests` for styling and linting. +Run `poetry run isort wrdcld tests`, `poetry run black wrdcld tests` and `poetry run pylint wrdcld tests` for styling and linting. ## Testing Run `python -m unittest discover tests/` diff --git a/poetry.lock b/poetry.lock index fba1b9c..eb1723d 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2543,4 +2543,4 @@ test = ["big-O", "importlib-resources", "jaraco.functools", "jaraco.itertools", [metadata] lock-version = "2.0" python-versions = "^3.9" -content-hash = "97c391ad142e40a53b2cf4a89be811f7f91afd8eaf80415ad2291ed36abdf1ce" +content-hash = "2820c343d9516a52df746e6e993cf7f6c587e724360d4c4a858ee0d14ddc58b3" diff --git a/pyproject.toml b/pyproject.toml index 8f89715..2372fd4 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -14,7 +14,11 @@ pillow = "^10.4.0" black = "^24.8.0" pylint = "^3.2.6" jupyter = "^1.0.0" +isort = "^5.13.2" [build-system] requires = ["poetry-core"] build-backend = "poetry.core.masonry.api" + +[tool.isort] +profile = "black" \ No newline at end of file diff --git a/tests/test_rectangle.py b/tests/test_rectangle.py index 82f8d0a..ae4b67f 100644 --- a/tests/test_rectangle.py +++ b/tests/test_rectangle.py @@ -1,6 +1,7 @@ -from wrdcld.rectangle import Rectangle from unittest import TestCase +from wrdcld.rectangle import Rectangle + class TestRectangle(TestCase): def test_basic_properties(self): diff --git a/wrdcld/__init__.py b/wrdcld/__init__.py index 7a8d19f..19dff1e 100644 --- a/wrdcld/__init__.py +++ b/wrdcld/__init__.py @@ -1,5 +1,6 @@ -from collections import Counter import math +from collections import Counter + from PIL import Image, ImageDraw from .main import fill_next_word diff --git a/wrdcld/font.py b/wrdcld/font.py index ad59bee..74b28a0 100644 --- a/wrdcld/font.py +++ b/wrdcld/font.py @@ -1,4 +1,5 @@ from PIL import Image, ImageDraw, ImageFont + from wrdcld.util import get_repo_root diff --git a/wrdcld/main.py b/wrdcld/main.py index 16363e5..2aadca1 100644 --- a/wrdcld/main.py +++ b/wrdcld/main.py @@ -1,12 +1,13 @@ import random + from PIL import ImageFont from .font import draw_text, get_default_font_path from .rectangle import ( Rectangle, - fill_space_around_word, fill_remaining_space_horizontal, fill_remaining_space_vertical, + fill_space_around_word, ) diff --git a/wrdcld/rectangle.py b/wrdcld/rectangle.py index 03a7f26..ac844b3 100644 --- a/wrdcld/rectangle.py +++ b/wrdcld/rectangle.py @@ -1,8 +1,9 @@ -from dataclasses import dataclass import math +from dataclasses import dataclass MIN_RECTANGLE_SIDE_LENGTH = 5 + @dataclass(frozen=True) class Rectangle: width: float @@ -319,11 +320,14 @@ def fill_space_around_word( img_section = img.crop(text_rect.xyrb) img_width, img_height = img_section.size - + # get the image data as a 2D array img_data = img_section.quantize(2).getdata() - img_data = [val for val in img_data] - img_data = [img_data[i * img_width : (i + 1) * img_width] for i in range(img_height)] + # img_data = [val for val in img_data] + img_data = list(img_data) + img_data = [ + img_data[i * img_width : (i + 1) * img_width] for i in range(img_height) + ] # transpose if fill_direction == "horizontal": From ac5f98cf2cf4d386b5aafaaf4e2e184a7012ceae Mon Sep 17 00:00:00 2001 From: Jim Barrett Date: Wed, 14 Aug 2024 11:59:23 +0200 Subject: [PATCH 10/11] add isort to the CI pipeline --- .github/workflows/main.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index f86d4f7..3c0dac6 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -39,6 +39,7 @@ jobs: - name: Linting run: | source .venv/bin/activate + poetry run isort src tests --check poetry run black src tests --check poetry run pylint src tests From e716ef562e7d7cde34c0940820455020c03d02b4 Mon Sep 17 00:00:00 2001 From: Jim Barrett Date: Wed, 14 Aug 2024 12:01:23 +0200 Subject: [PATCH 11/11] update module structure in CI pipeline --- .github/workflows/main.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 3c0dac6..aec16dd 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -39,9 +39,9 @@ jobs: - name: Linting run: | source .venv/bin/activate - poetry run isort src tests --check - poetry run black src tests --check - poetry run pylint src tests + poetry run isort wrdcld tests --check + poetry run black wrdcld tests --check + poetry run pylint wrdcld tests - name: Tests run: |