From 70da19dc9b066da2352aba0926bdaa5543b2becd Mon Sep 17 00:00:00 2001 From: Sina Atalay Date: Sun, 3 Sep 2023 17:17:30 +0200 Subject: [PATCH] add render function to tinytex --- rendercv/rendercv.py | 52 +++++++++++++++++++----------- rendercv/tinytex/command.txt | 1 - rendercv/tinytex/render.py | 29 +++++++++++++++++ rendercv/tinytex/test.pdf | Bin 14097 -> 0 bytes rendercv/tinytex/test.tex | 39 ---------------------- rendercv/tinytex/vendor/README.md | 9 ++++-- 6 files changed, 68 insertions(+), 62 deletions(-) delete mode 100644 rendercv/tinytex/command.txt create mode 100644 rendercv/tinytex/render.py delete mode 100644 rendercv/tinytex/test.pdf delete mode 100644 rendercv/tinytex/test.tex diff --git a/rendercv/rendercv.py b/rendercv/rendercv.py index 2198cb8..64931cd 100644 --- a/rendercv/rendercv.py +++ b/rendercv/rendercv.py @@ -1,30 +1,44 @@ from jinja2 import Environment, FileSystemLoader + from data.content import CurriculumVitae +# from . import tinytex # https://github.com/praw-dev/praw/blob/master/praw/reddit.py +# from . import templates, sonra mesela: classic.render() tarzi seyler olabilir +from tinytex.render import render + import os import json -workspace = os.path.dirname(os.path.dirname(__file__)) -environment = Environment(loader=FileSystemLoader(os.path.join(workspace, "rendercv", "templates"))) -environment.block_start_string = "((*" -environment.block_end_string = "*))" -environment.variable_start_string = "(((" -environment.variable_end_string = ")))" -environment.comment_start_string = "((=" -environment.comment_end_string = "=))" -template = environment.get_template("template1.tex.j2") -input_file_path = os.path.join(workspace, "tests", "inputs", "test.json") -with open(input_file_path) as file: - raw_json = json.load(file) +if __name__ == "__main__": + workspace = os.path.dirname(os.path.dirname(__file__)) + templateName = "classic" + templatePath = os.path.join(workspace, "rendercv", "templates", templateName) + environment = Environment(loader=FileSystemLoader(templatePath)) + environment.block_start_string = "((*" + environment.block_end_string = "*))" + environment.variable_start_string = "(((" + environment.variable_end_string = ")))" + environment.comment_start_string = "((=" + environment.comment_end_string = "=))" -data = CurriculumVitae(**raw_json) + template = environment.get_template(f"{templateName}.tex.j2") -output_latex_file = template.render(data=data) + input_file_path = os.path.join(workspace, "tests", "inputs", "test.json") + with open(input_file_path) as file: + raw_json = json.load(file) -# Create an output file and write the rendered LaTeX code to it: -output_file_path = os.path.join(workspace, "tests", "outputs", "test.tex") -with open(output_file_path, "w") as file: - file.write(output_latex_file) + cv = CurriculumVitae(**raw_json) - \ No newline at end of file + output_latex_file = template.render(cv=cv) + + # Create an output file and write the rendered LaTeX code to it: + output_file_path = os.path.join(workspace, "tests", "outputs", "test.tex") + with open(output_file_path, "w") as file: + file.write(output_latex_file) + + render(output_file_path) + + + + \ No newline at end of file diff --git a/rendercv/tinytex/command.txt b/rendercv/tinytex/command.txt deleted file mode 100644 index 507b65d..0000000 --- a/rendercv/tinytex/command.txt +++ /dev/null @@ -1 +0,0 @@ -C:\GIT\rendercv\rendercv\tinytex\vendor\TinyTeX\bin\windows\latexmk.exe -lualatex -c test.tex \ No newline at end of file diff --git a/rendercv/tinytex/render.py b/rendercv/tinytex/render.py new file mode 100644 index 0000000..7f47808 --- /dev/null +++ b/rendercv/tinytex/render.py @@ -0,0 +1,29 @@ +import os +import subprocess + + +def render(latexFilePath): + latexFilePath = os.path.normpath(latexFilePath) + if os.name == "nt": + tinytexPath = os.path.join( + os.path.dirname(__file__), + "vendor", + "TinyTeX", + "bin", + "windows", + ) + subprocess.run( + [ + f"{tinytexPath}\\latexmk.exe", + "-lualatex", + "-c", + "test.tex", + "-synctex=1", + "-interaction=nonstopmode", + "-file-line-error", + "test.tex", + ], + cwd=os.path.dirname(latexFilePath), + ) + else: + print("Only Windows is supported for now.") diff --git a/rendercv/tinytex/test.pdf b/rendercv/tinytex/test.pdf deleted file mode 100644 index 11c51d25acd68aeb66b87868d2f7a269d4b198fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14097 zcmb_?1C(V;lWwVtUAC<*+qP}nwyiGP)n&8GwyiGPw)LuK=FRQ5=DvUKn)l8+JI>yD z;$*~GnUV2j+q2Hs3whzc|%50Lg|&i)W*64#~-hM1bsC`Dv-= zXe4N4U}I>6M$?-*w;9Z(T|uOfeLvN|oTNn7wT zhB zE`p|{c1?;A34jG(-^?024EAq?tz$Bp3${ZDfG)CsS)`L#Y2hYX>W-Q*QyWh;(OOR? znOvn=)D;@py)+QiTbbnLW*cQRzIBb@DQO+IP*JitA8|TSHHYjv9Fy3keOICVmCm$U z-lV}LF?w|DMi(;fR;qcC*k{Z(*3Y2dXuCK^Gm|31a>!^`z}pi$i*D!kv&mXIi)sgi zc#kDT_mt&j>K@3UwQC-E+(>P+;Wi>MU6CVgAE9zzR zWQ9WYIEy$N+9YE6+LHA~b-0T-671M1NEyJRKo3?c-Wb=`F<{f41oVP z-828uy@Hdzqnqt#U!M!(9Rt(9~1C9^Wu6lNQWxyHGI8=4w!7?y^19S^|6#xh8 zI+)VvtoJhE6q2P0d0Gg8KyTbK1`FlBDtwYhx|woz&OBre?`#Zwf0tUTmZeR-oo89Q zP(QfyhfR!b^qpEbg_gC2n_14R(oS7iCV}OatLSv@;0dawkIo}$i>RHHBe_s*uF5G; zX?}nK9*eYB{5RGv1K3_ZxLMtUsh`^3^SEZ=xg$b`k@=L_AcFW6Ioj(fEaOfRYxxvp zQey@9Kdg&PHHIsdZ&_}tf;mueXvQn4ouy&F#`VG``|s?#=uNtXtEez$N36=y&wk}% zBWpexe>ogE2A;9)reX3VT&RB-EN}~-@pUBWwU25~ud;yQ5dzqgvJMn|lM(O{WEP$( z7*D_zrNAc?7Zw)aT^I6)z;5tXriY@g#Rdw?Izckg@oYc83l&tmcg|}mNj>sVV0ihu z;+02Z?lMO9azbiYLpCtyKI|1qkiHm<^J7V@y=}#UPoU+p=Q&S`VMancZZ=oMhIp4Z zBnJ4!7t5|#OCS4Zw19XchS-8@xQr;fYY*|s6ip{g zt<-jgLgLX?Z;n_z_^|0W(ex%P$S(l_0^PB(q#7Xb*xH$BI8c!=&{095`8qjs)O~*w zP%M80)W6Dl49u*51nggd<0UT@9zcuKcA(P6g|r;N)KDElz;DrrXUS8%R-ls3+3J@j z8Ugn4MpDyIoq&uqnCdoxiQSHUtvfvbCEzKc2Oe|YJeaSA%A6jf0@;Eh!8l|n7S^)X zH$a(E1bBy0!$dwM4A~@ZO+6~$xZX5K1^)-a0}k4cORS9OkhKMp$5k99rJ+zz3a1@F zr>uBdma;b)(4>H5tVj5bV$7Ufpj`5TIqt_8PNl?^3j8fD+(3bCdC|%X{H<+*cvDbK zS_hH$k#8Dt3BAx7T~6i~l9;a7?3YXC^$tuGSdlRe>P-B(I1 z2~eO}9{~4yL!RvmmShSXc_gqhrazee%F9ZpiT4hCXliVp!6~azwrEYZ`8DX$9n>fC zR9~7o`s2L}`Xfr<1^VertNaG-e;q&ux_>x;^t6AB-~YMb>cYV(A#LjNeu)48BL~p^ z8zc0882O(pyL5~U41bybYxX!Lct|R!U=3ar1cl4Wm8|Jkt$P@abtj+*?c21bi5PV)1s!L;oDo2=N&0)OE}{9XOkbOF!T^H1k*^CA`BLX}o4Wjt`D4PZDgdv^Er?V{^$QG?|0>~y z9$&Qx8d4j~lRF=69cWK>(G)H%5KRcM-qnXys}KTC2UFS%TK&i=R@x#04o=N*{06?W zSg5O;F}2au-ZzM5_VCbTI1ge$AS2r{ae_d3M0CR_%>q2KFR_9+M7QknWrRQL6SVW7 z65+(y#Ig0V>zV^w7vjFjR}$8Ox3h=OAvnT_d8V}SgoPH&G1iErij_JM!J`PnvBweF zo2uVbDvF=f5+^Wgl-e#F=9hMcJIYVCR4;l#i0OH3=Ncf~4~ia6n(_0Qg;B;OQ7Eww z`%phc$MBln?3QM#DT1OW3zeD?TLrFOVbsAx2INnnm}1`I)M2)aI{-U|;O-vq4Tp?m zySZYYUS8kKTpG5OwGC$T__pi+Ttf$IwB)73dGsW)hEd%QOkPyZMgY`1BsjS7e%9Ne z`?@O9q#NG|*{q{u5AJi-=l6B(t}uN-p_9+=qqc}Quv3dzKINgrD5cbwGcE!W`RA#0 zG7Qgjx2i@z9_3q8JA|@m#JxJhYp)|p|)UfSCJ7*j!1}6o=K#$MR`9@EA_Cm zc$Do7Bu{^?a`X7HaRk3qtHd_0rz@^*o2)^FMAMuu|i0rOkn zvVl(NV6ZYm!2&d*k)E7^XyDGT=yv^3OF8f>C_pAi&gCKAuSmE<3lS_aZVm|@>+=jO zf!j2=!)fnRjM$z4GAwGg0|$fkjgHp<^^6@%rqQWmrX!Y8)oZ@WSC(YKY?)-KcWH@L zwncZ2adqffw*-r5pTYqrz@a^FNHakoAo(>E9I6ia^7E@%0lK~9Q0nuZeHl(--+;AD zZEO_K>#p5SELP1i)S4B1xc9DU(w1%hh8b zlOIiKHH~!!b3>{^n9sZG?ID#0)D_scXc(ntLP1q&DeMF4VW}gdl0n;fCQ#{^%g3i^ zjp+e`X(OvU>gClbh4j-EW0Uvir5z+-)EV@dC5;aexi@2&j4*B5kKu7HMZwmgnQhno z)hD^gt$R0In+&lyg&C{AUQ^~Hfgjy;_j`72>==4*{Rou$(%`J)50*GN&z>Yf2q?b4 zHbodu>>EhUpB=RHYYjMmr^mR4)hx2+Y~r{BCedt1>bodxy-u*Em|48>09*FJQtgso z;Y17YLyx#x)V7sm#N@$7M#jZOX2Ry-;Nap4|Kj@UN*oT!+@yv4{g(A~oVPtP(i-r1 zKs_B66dT5dQH*Uz!aX=nqG4s+T^Q-3}f}}#eN3_rH9s^m) z&)j$0biSIgpv5DrKc8?t?B5avq&I5alHJ1R4TtuiSgc`0$vvm37}BbmuO}6!G3D}3 ztDLa4p^v*PcF~R}rN)g{Ae($gt?1IeYdnOQlz$UlWv5-;@wmNe<0}6(J$j;?+>9}6 z8h+3)BqgY|qRkwX_>l*q5o}>}831EyUNVn0Kqy}Fc3Cc1D)A7{6vmMU_wY+b9%8mR zDDOsk;A`Nnl*s$AM0%3Ny4Er1sAMLi8YNx>#b^s1>cvY^A12|HsMBYbiC3<(C@bYP z0VfkffOGv>YbAZsCK##(lv=H{q**C^HCxxI2tIbhs=BYPtF?zERXHJw!VH?$rEgRf zn2peR%;<%Gfr&_%zEX<%UQVN7JZCkC>!v3@4;gk6ZOw;gaEa7_-gUECal z2l!1LIsRf{S(vj~YI}~H2w02iwYD({X>HQXTSVfJWi}$upLD0<2kigR_t!{R%Stgb#{gf71P+WbKk9MAvbsn&0wZ=Urpc;x6 zOLQHWOX}F)97apkBS(A{P-!x)mqBDG!4MmNT-MU2jDy8E!evg}`y6>582kni<8VB5M zfcXGGXf|D|1xrv59X~pmKGsYbal-q>6peh>E*8#D$}7t%9p;=|F)_4wue$=Kzd);S zOt4!k@6=E@Y_hMC5H4CCQ_Yh9+G#wHnO;hgRETXVDJU4$cD1w~sWS|BWsVlX4w07$zYL0d+1M0cQ&u(-qmU20*K2?=&`MNV(8!g&5E&vgiX+-*rn9 ztgghgJuzR2)6d8MBpodDSq?taX8jv9;!U4jckNEz$s<~ zXfqDDjvOgW8YI&!12<(uA!!6bz69QFVrfISD9O)y*wF`n_-UP{7X5N1kIf24s_ zz1LPw32j}oBt3x!y{zs)ykU8?9)2{$xOl?4E_%sO*sF*ki8jhnG>uEcr0rUx1cE$Q;keLJry7EW$7m*Ym__o~)x5Bh03E8Am znKgCXM0*`M%BdNt>K;3|oq!eNR%9m*7M_|kWhB}=IMYx+^z8VIw!i+ce<0_&^{2iZ z5G6vR1cLJK!$bus5w4Seo|G>JGNpAkY*Sl_moJa0MZC8#KGD>x_N$~1LL=&;8%CR#;f45aDGjQ}y$HZ!kk%Mx8df<~^{K~LM^MvUE zU}5?2gjjP(mM_Ev2OjN3@#t zSqQbw02Rg9yYOYLXL}V~Fb*sXbLzIL3Y$RYC{^5$a1ouL!b=|r@kj5hz-gP;Ilfq=&U z#t!5EV+y6GWBtQ}zfx#Wl7}kN0&@*Za3ujO+wu{ zQzKM0-7hY7E`ZZy*}kU})YtM6u)9ivn&Gm}v_wifz!s6wkLEMarq6fbzu;DcchK8j zr&|{lSDxz`HaIVuA2Mz@qAy0kgZyKL4gIdlyirhVIVth4v~ED#&BPU5BiJ~`IS@#% z_=w)S?GNv0!DRzGES)!{ z5bL;FrEvb&_=bXb-Eh(15Hu1ab5%;{$nfZFR#|LCUHW4~bysq+u?icv>n2xp@Sbhn zT1jjhX-2zug^b+X{xT7psOdLXI)u39%vUABl3vd2Hqr<2&=gOaW!?IF43zt;SSP#S z+-$R^dpF}rlsG(8!IlB*=At_eQf8n~HlvJ}cBAoePpY-U1EgpR=#t97xHuCx$^m|p zbxZc^Gv-#!=hnYq&^r z#l>@(v)>{eUK;(d|@{ld(cTQ>5qcs86})SLD=o z>~8LJSyr^F6`NE#V;b9?kRb&X7UH=PJ?`tgY$M7{;zwzxQXjq#WD#MS2MWVf0PsjX zM);RMD6HXnK?}Y#CYED3B{+-bu^VP)`?I2vB-7W(YQ@U7^>2|;8n7hpQcls6srs_W z+_LE*MUJuK^k$49Tl=j_kd*IGky9QD&~+;sGhYn&Do7 z=PwfYmdhjQJ54(Z%yWh0c6b1M!51$qlRNBoG))%F7rS{x*twL+9&*zK&&AfLiaS6Z z^adw3vj%q_C6eZq5yHqC+tM%BQIQb2(L`&*6u^(wm9e*}5a+$DNL+_S-u!l>J&`A~-1@cb2af+M{D&4% zAm3ux1+1+)S{~num`Y=9Sx)bR=^G8E(7qa#e1*OJarfOKIRxP=B+27O2;A;VptWC~ zpMEZq@btmdinh0xz$mWK`TC!g_rtq&FRE>-Z{1M zI8^Q&%}86sE^vo{slG(Rrl5M)r94jryjX&vN+F@VZ7S=jk59EUy9~6N|G}27|22dc zRtr%7B4AW*RXaj&_l*Fv<{)#OHtMNV21ecDyYhp3jYM73o88Y*yuE(p&pqCckWC?7 zo;$oVBzZ|q#N_&*x1FRWuke&=tdndB;{bJ|iZR*oEZ zL7}CKKnEq1_pS(Est0Yb-a(X?gxWynN8B$p7E5;w{sUA zBc6-q>6yXR=4_3X0c;)RWL9#~$aLu#jeV+2cG=+qWm*g0X>MVKsR%QhY+lA=K2}LT zbRYMx@09Xqzs8Vkb*8g<0bkFz?W-~=54qs^SL3Qo z&o6!a&6NDUyyjl7mSosxe)_hC}7cu!ZPPh6QXXzuE2GI`J?2vPJS zGh81LV%IXTVTPJV!oIw^ntf?anS4&lozB2`vo2<|i^<}Ag7GxdP9u~{i>H98%Cd@> zx9Ojbjc;N%em8NnHpsMcX+!=d9pL&M#!01D@zS6XCDD=^T-?dV+RP63aDeJo<7)&0 zKKaJS1>UTOZeYlHa&WikxY-+|`4*_cJ;IhaBGjO+e<%rWT$X)cB@8sxgH|-5H&}gq zw~G~v^<75$od65YF(D1Zx21HskJEn0@6LIP$w`&@`{i0#TrMV~=t(%x8?ufoWqJK` z`4ojFb2TjWt>>}Y^^Xd0c~EeZGphp z<3UU38TFT#ga!WI)H!=xq|C&x(pQjqTRXI&;6^1@ifQU zRnDmA!H@X6cx(4@&2%Hz{|4{;(^F+eMz+5y1ApKuuXq`oJX*N^i+7}Tf&5!uxPinza%9cjoE!#h8<;teZFz%?hyBy`qz%bV62TpOL z#gSUV7k*($R!H+II|EP_l|{bof+ReOn5a6j5~%myqEV5CeUwC6AR#xv8<-_QUHiLH)KabI$i;0U(5=Cc+%J-NP#!w-PwY}SgFA;=3ippu=>zSX8MUX+iNyudg z|I|uh@6STt9~)@#$VW0u-HCXWTxDIWc;w{ZMl*n&(82cMJ~zzwpIn(g{-yL()tNLq zx^?Iz@DB783fb^CGvc4_l>Pe_YGqw+Vb6NvR&VL zgF^?-8hP8iw{8{y3A4xAn%d>$2a-cnk2fx4*v=1AD4G!DunO^y$8{P=dUw5l);4J= zYmj2MdWd#$S@&8u>70CcYI}(jH2=mIm+w3Z)%u{QvZrKSRdYI@ZXxAf+g?oD8O*>c z>0X9aqoql{fBCH5()|rb+k-Px|3y4N6Gk%o(02CcLxTI9D~M_#cvWJj24Cqs$-Uf3#Bae)k!D~ zQ7irImKpN{809D;tyUFL6&6g(i!kB!k%{NZ6MaWknhYnjEDp-Q)<jXEgR zPad6uomz(Xk1#tpw@(|+zCDO{a%dRUoX@8-GihKnTa9NdS=YHB%mjrFf@8}GS`vH< zGv8LqO{9f~3EC}jECEkEwf=U+9!vC4M5eGT|DIngIW8S3TUPRekCV_YFuMCZ<J8kwUzr`9H7$M9FgQ3WAF}^l4B%I?UP)ns zp+N-02&CkVV5>&tFmBa3-f=Zaet2(CVg*yNd)Buv7mQ6Q+qL*T88H=6^hyyNh;(XIXW21npJ|0SeCBIN+W3xSe413J5mCr@^HbahxTcSEm_iK?yjeLxL za@4QJ*3^n&6I)eIG3dL;S1`DBG84COZ-co5Oyl+2XRmeOlen!h=ZEQMB?P4yYF~L{ z+xeQMSw3TJ&iRA;7Z4ScF=89Jkmt7!Z^qLLSg5h&ZJFZPZi8A0GD3J~Ng{7JVnn@1 zd0^=HM?hBu6}(qY>cJD+Jdp4XWSpKL+2CxTk!&>WR73j^Cf8l1jK&UtJ-vCLuR6NA zhnz@SPtecUhSvSS(DHuHgDGk=!vvtxVt8oDa@IWZi;|a? zhn>`?aXv(Jo>FxR?mU;_e8^uzu7a8o7ZN*pnx7k8nRg(X z;D}Ici(DTXwPFXuhnzW#KXBbyiE!U9?>4ee;-Ju!iqDw2oFJ`ioW5JEngl`DBtx+n zfvLCbvVc>bI?yY=81I@&i9ts54968>;oIttUe0${e@s!W$JI_Kl@rt}5*%YWxwc-3HRmYu*vxZ{n+u!l zdJ#d{7B&GNOd1fejCVyG0ohCFrRJA2>xss<-eu90uMs=|k4Q6UOl%25)APgNqsKTE zwdeyg9m6xdhmASox_3~Ht1wR%(SREnHzDN=^A#v^!^krS*?B3p6_Gsr;t(4wa$qWb{XR!|@u6m$P(ROC z=mMCIV4d7|m-Mq+;f*UZGnS-5J<{8rgSpkyf{t1;0q!VVxY%zh>{4L}PloMnt8^sR zY+v@fr_d@YiW!iL&v%qY^^d|w3B1Lm@iuY6!5zLS-9|#-J4(U@>K4m5eeeLBjRx@i zO(y-PL={H*zo+O$#&w(T(82{@xI>=dPvK}vh^?+A>6)&Aj9JgZg%~xmh@|BMY0&@l z99pT$57ST;FYXrpaqwe$j7F-%s&tnxjfW`#}p~{BS(H0Mv2?Akh%r z^2Tf=Q!bE5)%WX?xe+Z7yAmM=Q8c9=;W%5xw;@EQ0#(kJq~zZ3UTfv?I+Gf+zgo=A z&sZfIY_ZaoNho*E6D&L@RCebq4uzm2iG2dj5~m*$HfRT4qYILP%zDST#3sFF9W!>b z>*@~nkGLcF9}~ohS5voD>ekz0G&9}7tV&>mDNz{jILg+S6f!o`@@bU)m7WiwTjoks zlm!-;;97DccG(hbFEL#&emOxgLI)?zh$M1oIqwrXxE%XR6FOLGqd|D7Kvmas1F5+R zs7j+!eC&eMz0yq3TKMqZ`r8dZp&{7RLkB(P(ey259QYN&iZbLA&v4E}5E{kqo3sdg zi%E*553b`^7aA#ywf4c&8`l^ct=@n5dPF^#We}~`W@~gQMevAKYS>X4BGC9rX0j0T- zfg>3?jld_*+ws$PNj*g)RXi87Pb#?SC*#!K-pH7oM#9L=#m3&yfs7oFM%LcO(8=JF zK29d-^jr6nXimpMP5b%Hzja||V=ef}D#s%eWdA(KWT0iErK6{#qo-w{prt4Mbmdb| z%Es`&Q&F_nv$Zuc{A9c8Svq`jU}Y7BRH=oXEG_x;X8 zvXQ;Rr*XW0cjr^%^KVF+IUC{qc7vS!6Q%x++J9s5{sDS_vug2ZWc1Ay9IfzZr12P7 ze=}_D9USrKS?T^Y*_Mup?r*Ei^(j^|E240NpIm@@;$}#XA1+!s;&9?ykVt$-^+Ijn zVd?70i*l!-*Jl?zCw+aq;xNT<)2Hsv&d&FZ4BAiwsruq{wFQzZFO3EH6Qq z3#kQs>CV4FlM&b|k3|z-&#kC41}#jGNtu?!Jlu(8p0KjCseR1o$NfI}CH!HLIJa*J zJ^Z2eyH<_Mg@4b%irC2Z>^fZM8bQ@e+c!0NimU=7y7c>51b7JS!6UqrGn7u<@SRB_ zk{%+?Bn^RDV_ zbA;ykc8`7VEmsf^x`ABp$&#^!1N}kCOLoszrXuesBZ5`>0HYMe;yz46WS$5>bGcqI zD2lA4Ug^PZKn+fjAH84#-041bG>u+~%78FXZ77Rg*DJYcEf4=HYxJS81>)yx&DBH*D{ChUwm_ntSiIQi_H-Vx5Z99q6we$)L3hU}S=Fhy{S^H~aeI*w?1? z=miGLz|x{$9D!&CRJVor@{0xXwZqzArkNmvSs;UvkYL*($ZcV!p9@up=Fa@X?haqx z-%m&1hvhk|%a@8-w7%f21NkESOfP%@@yk>Ng&RllE&YP01BfR+jP2vzHjN&8S zhT>DU@CL_MfJ;z3R}23tHMFvl?<$~oO-hE8PznMI2Z2;1@lAw}u@i;CYxf`>1bnpX?pfg}By$?`s3#56YsF9O21{p?saZW{+5#g6F$Q-s3RM6-x}VKSRMh$QHmhg63eyw z?)#h7Men(ggZQ4!=+C^L5h@fJ8L~+$YI4mR2}Tj>N=bJkKg*rM^((Z)w~@=dK@4Bu z46U-DuS-oE8%0LHjHYEO=J9^ibAA}?q#)}hjoF2MyqLW}cM@ICFJB-_>O2+AMN4{0Yl5T!GM4Ai~c>asLC4|`LbGf@Tg z8AAQWr=M}W`*C8F%AhkzQI1Ab!p{gZ90BW4w-qml!?MC(JF+XfFE^i65ya37bREIs zLrxG=MKMN!=v5<@~