From b4b31032d226e578fb3e841521ac1ad77a1fbc8d Mon Sep 17 00:00:00 2001 From: Nicolas Gramlich Date: Tue, 20 Mar 2012 19:00:41 -0700 Subject: [PATCH] Initial dummy version of the Generator class, logging pseudo functions to the console. --- .classpath | 7 + .gitignore | 13 + .project | 17 ++ lib/args4j-2.0.16.jar | Bin 0 -> 56298 bytes .../scripting/generator/Generator.java | 265 ++++++++++++++++++ 5 files changed, 302 insertions(+) create mode 100644 .classpath create mode 100644 .gitignore create mode 100644 .project create mode 100644 lib/args4j-2.0.16.jar create mode 100644 src/org/andengine/extension/scripting/generator/Generator.java diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..42c8965 --- /dev/null +++ b/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8ef16d2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +target/** +bin/** +doc/** +gen/** +.DS_Store +Thumbs.db +gdb.setup +gdbserver +.svn +.hg +local.properties +.settings +AndEngineScriptingExtensionGenerator.iml \ No newline at end of file diff --git a/.project b/.project new file mode 100644 index 0000000..c30539f --- /dev/null +++ b/.project @@ -0,0 +1,17 @@ + + + AndEngineScriptingExtensionGenerator + + + + + + org.eclipse.jdt.core.javabuilder + + + + + + org.eclipse.jdt.core.javanature + + diff --git a/lib/args4j-2.0.16.jar b/lib/args4j-2.0.16.jar new file mode 100644 index 0000000000000000000000000000000000000000..cfb6a291089fa564302b6a534c09cb9a271aaabf GIT binary patch literal 56298 zcmaI818`;GmNuMpY?~e1c5-6dwr$%^I_}uEZQHiZj{lyyGgEWtzxO-4&e^+auT}N# zy`IJQsUt510tyZEA0PiHV($OE_^%(Rzh@Z{WkFgASy6iV{}O`)^7$*4a+2xj`1f}B z-!JO_7LyT_l@JwCQl^s;eUO=)kd~sQn}d_0rJA0cX;5TXWZpe;q>-E+rIDf)f`m9M zR82;w?j><=%ZgG&ky2E0{!LYdiVK6B#H@(sjWVJ5@b``+vy)`+{@N?nP|;c$Vjika zO|o_TtEngWT_{<*MZ^#(Wtl|LS*LcVHqd{s5eUfp|2zul-!wS_xod zENx+HB5&a6Wa3C?WNqN&RHX^!t^D-+`}51GGkpvu7#0{j5EN9J3<@~dA2>m)fHNMH zA#y)nIx%5PIxA>keK}~^v$11ind-T=lvUG4BpIj(%~PW3rB2JHWnI;)t!m5ls!ogg z{qu7tlX#3|@ajB_{riRA_vO{kiKd12BE4v_kn!PVjWdyYOMjwnp{MUPOkf-lQhvaa4rv*bF{(T70 zT(21iw;^`1q!ClIEb&-#a^f1$A>0MkEkQ;P{UA=so{P;eXZpe??xtm&fHCE#QA; zO!AP&ogCe{cz6TwcTg2=>G$m-SbBzb*iJEi+;W5at%wJLt8R6sk+7e^@in#QYIMz)Wkpt_4>))J-{Bz>n(AiB?pl0%fasQ_X z=ESdnl=utyBZ z3-WY;HaHXaGhmHJ%<+pNxv^QZQX)XQuBY;LBphp>RNRDpex79KV=yc^R{5e-n8_*o zqA@*QfM->bd~;nvxui*o-!AbsV1Mbhlvu;oKg$*cBb?V^hyXa?-=RI z66rg!OBMDmX`Z?oOO|?_WUoH!7DjB5zlo3^MMCtTrzW%ct7P%m?=#^a7l2r%DFOm$ zGCeM=b11tg=ORzwS|oMPswSFDl!sC~_@{$O7l4_nX3d;@Wr=K#W&(Qxq?_2l@3MB6 zT#jGjZpHf%zm^V;^hkDXExZ2g!)2xypBTgpdwCK@w3B^UvTafm*NI!ADQTGC-!K1O z0e*=ruacg2xvQ>a0I_KS!=F;mCVJ!7T8fH`B(X!C;PxTS&Y5hYSGo<)%)9kp|sIk zMK4qo^PwxNAtS1kh)^Ki#C4=WX8xSL97TI^19O)2v0XW>e+^?ZjxPnydY>G}ub%I$ zx{x6jlTw5r%8fYs*Y8N-+JZepZ|<-uUrZ=>=$~=^m84)xcJ%DT@>Qi&r?@^`p(rCSc%EYj25tB_i-8sPcJ++m`p1_J50+zVUM0Z6?o z#l&-T)MyqzZ4$hLW18bc_FbyZl>N9uw)W(6o|(mXej^uQYyv%u<87scpW3r>H6SY| z2xa!yS!2)q4%)j3=rAi`hYDC@6;p;svnXdyXeg-PJ-*YBJXm!`mvGlWxv+#ULEO-> zkdnW?cF(6zMn^go8QOxl(%rQ9ZN)0uV-In0vl*-)fIkC(t9%m1YXGNgYUp2pcv zF<8y3;Lte=2h`LqAn%0N&r>Rj6lk0$6Hb@VwH~<~lfe^a=>@x&3rh_y z&wX=R$kbM!I~rL;274kI9lc>*d$F$&;htW3iKzNkGM!Oh(6|LaXWOKf=Nk&X+SI~!(`i2XE4!=8gcI#(&gv+S>{NDFerE zr|z^XfIGR~vmd7YYS@1dBRPy9VRq=zmk58hHYC~v2^@&1ybc3xLb^(1{pq{6MN4OZ zW^U>$7s|0##{99?8{H!?=Ns;yq=wB%iy!fm9~6xa)$HWTJffwDoAlvvxZ{4J?UNX& z2Tt<)8@k=_QBmtYL(j~lVAMd73GJrE)vo@{Ce660QhGVP8;*IdRv3{xtlYN@DYVMu zazE0q5FfJx_cp}YfY)uWKScToENOaHwMqYnf|tX3Lp`(Q%S<<03`8|~*Bv4d%wg*o zj7NgR&N1GpjpJjL1c}i5Agc_QM2YlUJx{lg9_yI~m(BdjDQEIs2nFhs)~*aI;8#Hq zhZT_Cpm46h6w4xKaYhkU+W3eiqBN`4R07CJ#v{aALEdr3V||8M>1#2U+!V7)Q8|-} zyb7}lntzgokzt+t__-T0)LmRzfpR@VvNT`yDvHFD>M3|fzcOpNDn5*TBT-_dIQf7M zn$MkZD-qaBb@&L^Kymp(f6{(a5 zpH!zIBq)+HS+J0HnR^HtbQ6bKhBufSp%Pq=2jfx*bhEZYbEwK`hxuuDATPDj)5fW~ z4A%g>QkAL|Y}2yxg}%3C*Sdav(wFJI@~M&y>O;q>a%!ol!J(p(PI1Pp0NS~EW&BS% zHRJj?a^nwMb8#fq3>n>CmrzSam5O!adt*B0rK8RP<;)`&x*28;JB zmKOA{oJ#Z3v=(>UtNcRWvRXaq?BaFlCD|Gr%c!#Ea+`3x4Wr_AA(ymsNta(`%@q|U z&M{@K4Aw82N+FA~Nf-}~#ThM1DNyv{4oQxCM~U+F7$&J@?ZRmW;qmNuN5$vhlDhOM zzSpOa^^uIqab=z!A-Bj#BrEBbsgW7w2u@UFajoaMnc&NGIkLqRJ(5g+U^C(dz7#v@wBrwW5{pp zhi%B~d|UktmlV_(?4o>Xd|6e(-M%eXDSv3SNAmqoA)RR*neG(ww9X{%q4=Euh^|-` z%{u+QK&0^nqIQKY=7!w5nwXJ-x9dhv)cPwpfDyEvDdv91DO_+%G_m@bWn(Kz#Q>H4 zg)vQ5`9?iftlKsPc^$`a-*6o~8$34$B|m0SKQ9ye`q?nj%c}=|2VeHGn^vC!yw=6Q zbX@bA&9rSn~Ux1sZvp@Vv{PmAzGrnE~#`%t0Xd<$Z|`yjU2JaR7uUY1WTg7Z0y0I&+K1Y1c#S-9;{hx1%CxVfvK zQ2h>Jb#fB(@M_*3iz#Ym5rATGMK<V=h<^)19nO+tf;>zlrlD}r*ddmSy^AcyON|~A+$)Stg9CrQ2ppBRIw@DD@@s7&y-OwkV`}PT;^_ zb3@?BoeAhqE}(D3NLFKGi~R0rFE}gAjv0j3TgetN(s&F_5kZwNjuB-~!q7JLcK>S4 z2O;c8{G1DSefa?a%~i>szMbAUCygWvV?!1ARPxAcY}Mi-Gsi(xeAJC(Kq#w4Q62Q6 ztnGF_8U;q%*^9ey@8JGMk=kK6Hs$b&6CUB%W&Bwt-2JuDz_QuE_-VIvs7K{!X|ou+Xep4Snose7_+G%dw`?F7bo5ihJ3*+g<7* zH02r3DkDR)#YP<=&d$zeYp%1nh`3|f^xH!08JoY%#y0sB()yOqU1t7Gmf=trTaX;7 zn-5Py{Ks>ys$2+B;&h4aw*70$@RSD9wYjaem6dfHCKP!`A}MRfF?gxG@=HLOJkhUB z^f})$ekNLa<&0>0<7|FmuY)cPXCfNGQk0~3!{3k%jK<$|I_4^eBLrUjdHjI9HD~fAlmx*dM>tVwy}`_U`n}Hy!1gcg*t5F^ zXU%WlnCyWY=Qf(L>v!;N1w=z{_~UMwoxX<-cdz&?b<%bk_hjW;P)@Gc#0SVWM}Qk5 z0`aKWC<@J*b8zQU$=K^5)V)DlDHn&h>8*w1@7#TO|1|q(GQKh-UxXRL*V|2SRE$|+ zO)zBD1sY9&(;0H5j-ZP(T2-#qsp5IzjnN5e6zUuBCv^h;C(b8gFjJQR{W@rm5Z#Ad zGI$6n9_!MG1@eLdRTX}4>LPB*nDo;$6S=t~K?zfF5R1gHcUCdQI-C8m+P&&AkF1i2 zzLVT+V=M|P5dDIb8LXm5x>LMqN_Nm3;S`r78hO=K(}+cLQ1g*`CIFwOfF=E{G;3eK zBqv2FkWDeslR}1ay-GvV5Gm7yQieaDAP5cXllv2NmP{#JH}DwOe?gEQ;3ix7o$PDM z{DIqM047`|XwNR@&WjP$CQaKkv&fD2RL!K8{s2r>LF+_oYYzcpYrT52AHZA_p-Wig z!AUuVL8*~ATE~P38NLmtvnBj+YFa*gL)89D)4a!Y4>>m{jF&&`a*HK`>Qv2MXf-9osGRS?{4 z{lU)u&dsR{j`(WxcDeqO0@sZO7rWl?U-CqMXlGVTV=tg~{dbM=+oPz?Ks=t+ejVjT z`XXeff1wyDjI;233-~pn4j=@oCu|B5mRZ_^XZb?&Nngp!vML2l$gu*i5H8{8CZaUv z6066o6ezo$GSI@d#x4+n(d%w1dS#d%q4@Bb|1y%Y4ulxRvBxhcqHVgSm-h)HUR~a+ zw7sxjYJ{7wS3>1k+)X_A@fMg=5YuOwW?SgiFLdq8iHVb^n(x&&?SnW; zP8j}<6u>6|a|)~(fmxSp6uxwI%&6<(JP75{J2}cUqIyp%nLpQ{eS@>esl3I~n;&IC*5J`2x`dMY*eO0dQCl z+oQD;K(aIJ`oWAI+GB;UwoYudqNQnJ1~ht4vZsn_4O-z5uL{rJp5(!%ZydpxreUGQ zI{=R}YXw9?w`O8hCBk#Xp##}802{kNRSeQ7D2l<@h-+;RrY*N{4(`^=D{cjDapiM} z&+#DC)LFf7V7Hi}3_Jg3(*&$GMQG!XM5v5c6@qkFnkA>pqZc^zg_`optO*&X4ffuN zy6w)%7z~j2cGd?;6e(Pb*?X?QS zm+qr&{LnS$+5#0$g~Pq;hyjRAJ@g(gQQOHiEd5D70j0r%vU+HkP^8Vbq5J3}Pn!2Q zgtACMNN?k?xG|@7c!sPucb`Q~td)&?Y#BRm@+6wxFv%e*^CUaUToTgaVF_A&|Fgsr zWE6;FmB;?LB*Z?t8wc8YEW(WT*RDrs=cKXFZWBYPXXz;sg)wbM8A^U!eb_wWhc4S0 zQ1BCjT;YPY5WhZuS8r02`i%%v6-06bWE=QWJ`v(ky9Jd{3&l!EXR^lCWHp-E?rZgQf^R+PL>1X}`z4a(iTn>%u9zp(ThS!t4R?jazcNc{*n7)riY z17sm=jbDoNS)AMdVJtnqXyw#VBu>GqYr>P#$z`b{h!xm)56&c9Clfnbf0hs39=~W} zVw362VbN=%6BuCj$6xGQAO~T#@A6XcKG_yOHv+g|vLfk|($ebIV2#;%EvZEt^){ec zPF%P--=RYpl&%c2S)J3^e_X8ErfC^_(*JB;kZTu^43FA`S6~A-v=p!}*lyT^fz_sB z-51#kr^(h}PNg=>k}dV%fls?HxhjO#rbIMp|Nfo~uU@JW18AR(dCTW1LxB8Wov+;Y3UmymE%+$qEGNvFPZ~1(AEk7R6T|vd%UN zi$}jq7_?gEk=n*Ko{j}9g@uA6>dNwU3pi;QTuo`_jh&na(-2QU|MHHiF9+@he?&L1 z>Cx$ER!-IB6jzgw_ATB%Ds@Y3o6ts(ck9(S*4@+xg{A2D_}R{(&ym}61-I?5mVdkS z)Xk*V*0B=KCycq|1wN{yds8;l%!Kf)@q}^-O}_#=9}8}@JE>ol_IvWi4KN2`iD1I2 zg8+wELyS-pmclNNrzbSgmau$V)R<0RK)V@SyCMC#DI{TAgj08e-mU%M2jXr=3NaJ5 z$=e9l-XuB!yvHNnA7$7Mulj&X!k*LI@2VScC?y{z8F4Hev0Ng>f+3lD;T%B*Ht|)- z^Wrp{a^hP(Tn_q$W8hOF@Sf=kR&1uul1I(3T9jxP)XY~?_rzJnHPfOKJ5o`_()@gv z2ZmvnXSgki@*2tWDLXOGEHgrwXQrvz^S5VJWYgv*?=T8u{)9uc$W7Pb<|KQ+)e=uei2IQ>5ep1;cA+IyWZm zqg#jBaMToSn}U#<5>sv`lud#6XATARI=;NA;}!I&SJR91M$kL~gg_)$l3>nTrYG3cRCFi2l^AsPks0usNtbsxsl2Z$0CaP}0QBLFoP-CbY*`e$XwsK_f}3Mi z=cby{3B;gE8n=YE{j;1RS%CeReAZtJWW&qfGF~!nfe)c$?pz^gp|B4qfY!0Cs|yEYO|3(Tb>O}3E1G83@0S;L;Wr(v^R zZDr_U&+k)vexP?lGxdaueshL@dz1@9wI%lmQZuxK_EZfuL7z@opxXtTXPMu8cr!}m zaVDT&NK+`7=`5$Ntl4DaP&G0cgev$T->ri^V>4e0x=W_+^J-|>R@c$mO34iGYFZjd zmYC}XHE5QnyTQ+Qz{giS$9HyWas2hyD*;l=e?Zn-@SbF!Xr<$Gd=2cy#`a%aw-;2*mt>f3VWKH0 zXN|i;-0Wf{VC?ESMGJwzch$z^iis$y-F@Bhw{t4%sw9t3#zRX+QBq?$jH@w!&Z39q zW@R8v*;|wm?7{+HuMjKu(1XLZ=5SWV)jynj0Q&mr7{r~gxbK??es)647tRRBdLDIWeAg&Cl^!m zPpOzF7ZuMUv$E39(H*%un-z*_F&H|BlFi@c*d(=tr!=+HTltM-ktW;NcTl$ukbQj` zuMO4bzQZ_+g$>BL<)1z&Noa*l$hrLt?EaQdinm*t=o8dbe3MJhOxuvN+>$QADmBJy zdlQ(-#VXGlUz)5$ov1sZ_b%G*kxr8F&~Qs9TkggavNzhER@?B@GP#(-%W??r99UOw z3e>hV$*$hi&}n;uD{m}YxrN7BMy|&;cAIqwj^3-K`%$^%Q543l<*Ci>`tUI`@KZ-} z=)Asx&6xyUf%^d#IvC zS=v0OxFo2x^b1vSgR-)E`Oz*^4eV~_etwK)<9WVnt!-(IvyFB9b}goQ{+y+w;rH

lKM1G`t4?oZwM@N??)GLCfv0&9s{A$>&DI9xnq}1bY_GBNVg~X@Zb_ca zA%o2G&88ED{XKShsfQZgHm#s%d%0oAgu!Id=K&OFcJFiIk<;uF^Sqqvr-c9`=N*H$ zQr6prk&j0Q-ao-P*DFDCZ)dsqJi8?jPsd@E0Xcj}C1FpK{;ao3nK}4#L1Lee7F~~N ze^m~A-=ec$EB{`h_;MARWjBKRa$S~`JWehw_sWTVu#}p`YJ%|NJuEozwmQZ0xkbzJ zh~!|%)S{2DmNrK01kz6ipihUOA1f9Kg;gFa1#!hKmq}VGsx*p#onfoU@Roc)7jQ2Lz13<86R1U<8MyHA=B3OsHYInLrp!H9VqBK0jYL867Cc06GHgfa3P{wD zeSiL+?MCtKKx~h{JEJL(KtM$Qdb?4^z+TD3+4;Y>8e>#+lu*o2eYdUk0ovVx;(3;8 znuNgupf*huiiL`bz?6jOv`td=!67C|*S7M0!ruZlo^x1sou$mIjV7XAOVf{HE^nQg zi2bS0L^s#jPJfSwr{f&IZ+AF-%pI{izG0l%keNe9q#+w=(L2uTQ6tGA3?yl>JR-cl zR7Gbsd}gFcQ47A3{cPdMia%75rZmEHk&VeT^?P} zq?A%^Ez=zS8L?mwwPW7uABD~5Uu~!Y!2P7^Ub@BHv0$hrn|0|m%sc(F+^hlj)83=pKub|D6>0DaBw)apwl^~C+!|;17yuCtEyMS7phgxx&xpMg7?Xt0I|FTA#Y~;`{O(sbijyAL1Eo(}6YywX2B_>jKk^=Nj)-Oy z%?~NKarhGog)-evl)EZWGLvA z!ag+fLi){|3^9ljyhG#-chQnlQA2JOfMBFpXV6)0+imj;!;rgR0rYSFyE5$TuBraah+-x4B2$t^yaP-}X?nDjL>}z6e#+zn@44UFV*UNhOLH<3v(SezA+j z&Mp>n&Lrh$Gkoc$}4vsv{h(`u-ng$3J)yF5}~0y?+CiF7UtQ zNywNuIT@IlIMLZV+S!{pI$M}HxlB($_cI`Z&H8j3o?^73YlC7-<^DD&2>%5pU zeJF^&I?9$%h0VCLyzKfLqK!y~B8yM~>bFJwl8Q1*u|D^146n#?@bbF%2RXQ#{?b zFPyDRynFh7y*=ag%2bj;*)mQtPBL$rwk8Q+T$9blcsbmoW1?e0!%D%vaGKDCnxG*l z^Pq;i$11RaFWId5#{Hh4OSX(ry`}{5{Ys%1BezEF^ZLvEK)p0$3aXy)y zUqR5RQ1w|Z)mASSnj@{SY@7Ij(ndHRsq+j!S+2D@i2;_pw9dwQso79|40EGD(Wr-| zh1Oo5o8~0i6KaC=OvAllg!j@7pWq=JiTRIC5afM^FmAYpPVv3Zoa?ht=J<%8>nOz+$zxfggg*p9cNBm)w`H?oNftiA z;!z0JN81FLwyNkos5#fRJ-GZgSA8N47XnZU*U8i1vUWw2c&?HFlH5++Ay}47W*OyZ z-lm%Gfw2V6M8>g5W6sStb+d{TTQr3em1{fy>_HcGFXIt^Bgn}QARzjGUH(W|Tbq~} zSPRmnz0rTx)+*AcFbh^K!LP&6tvMlG5m=Ku;orR=p2x*Zl?Rg`a(U@3R{q7A!LJ%|9Ue5RYuwzk!OE@OiwMmoy(({@{`z8b_OoZ18*E~976KI0G(Jeo z!(WyXmPm%xCZ9uk9NvO*yiM~H>9X%BT7Ht-B^r}7T9Ng2E`-R!UIpr4u(mP+ze3`Y z#iT}6&qw&2yiyvF1mFBP_YC#m$)NRXiz=$>u_5hC;&-#(B>_6^gl3i_^TN$PTUGan z;D`EOi_(Ar0a5&GtNs&*j)d_a(J@9z#|~K#l^0|*#idSMlizAcQmgw?s47PvB?vo$ zf`rA#I;&qYm5zJr+VDf6JI!3in}P4WAleO_g;wNeW_p{~O*-?*HuuBBO3Mw9q&xBe z?y~b>Ej|Dh3s2+F`A}ijUaVv_6kG|Q0EqaBjl1gGK3c1Yp}WF^3h}i&%ha~=)Z%H{ zv{SZGy>ysu=V2nGX1xO6jHSxFu(zfYDz4&86Y6p1%Y1sHwGF@HHkwo!#pdSPW;XGi zz)Up6;NMr;R(+&`cm0m;F|Q;il`5XSjQ&Y{jih9h&-Xpbh9ee0yP3Lq#ZlO{d$D>Jz|DAh6P>eJJc0Zle6oTmEpFQCRJmDj9it-r}pUWwUsgHnR!IoS_93e7# zBKC>N$O1*nne;jXNkFWKNjJjr;t+jSWhehOT!)NFxVqV0N z`W;{%FwEHKu-}C;c-J%NK(iMbIZ`LB3W>C-%&pW~w2Zb{%o@m|T9-Rtpjz7X2kxKI zxrT>P)$=#zu>Q^51pgYH|H#_^1xiINITS%mUI3+38Ade~l_Sdh@L)`Y9b%Gbihv@` z+A`m4NuD>IlBwCnG#!-R6oj8Yf8-yT3RPz#@6|QC8BV9}4d0H>d$eAh&d1s_gNcFW z-o^w*D4Lb?sesOu?i8~74UKZ?M)F;WszOrgTE&W&NK_a&qeN*_Dn^J$iDNDliW5~) zYiPD`$|Rk1=*i+oPBls$$Yjf>24uDUKT;NSEQ~$QC4n!RniJ0*QzS7T6^HZ3YKIdn z^>z^5cvL;C&XjS(EgI?;6{Djxa-26`JF4$BUo)q8S}I1@LM}zqI(1H0By#W0r7YZP zBj+pAI{K`WGR21HR29>#GGu)Z>wl_#yhhyu#z$MjAChZypjQrhib^6>KXF=OZV$qy z?<5FoRlSP_d=!Sqs|@*OQ5(!oOvUNG_Z((<5YsrJxWs7TsY+sM`v?R_yU?PoHamMi z20LB&a`|e!yBKzii8=yPd57XQI@qVa@y3CA%yt>MCd|v&e^5z(0MQ&{mVQBP4t(bH zV&OB~B0gO5{&-XGC4x{=H#B^WP3-%H^aL6A+BGnTQmh6gcLzJ8vkHi)4aK-tcN-aY z`)Avqnf!qA`)m8jztQR6uzN+^4Q%YKO=RqhO-Pvj0f7)j87UA(L?0t9H`)uer8kwP z$S~EurhUP(@LdQ<6@*9#ySf+~=Z>yGQz_(f90T{F>G75h+wryPf8uba$|5ONXpOn!otr2p;CI)B|6m3JYfda(#q zJ|4m9*ZtgbYsPITBO@G1d}x|Lcntt6CFDw)xg+XNgEt`=-ye_4xyS?olAt?q;xuLuh zi;82d^jghLtZQnRo2%2zROb5KGI!MBA0`tJ!?=N7+U6Rle$IgT@d}c3ogtkAAJ+H7 zQGNH+DQ6(<>?3LLtSWk*ruL7XV5vh=6yhjAnaZ|$)3w?kht82=f%{M^`$fCK1!T^; z>myRz3H}uawHtBTAmfBa$v@gy%{^T1u}0x1(~MiOVJHFkGBFPsn_Ne)5KLnZtUCJM zgRWs2vTi&ezCsdTUKed9K<}Ti&?`j#QSlcCcz>s7B>y^;1O9`a|G%mFzg47^P&6=k zF}SuQHlV}9WAaN&p%An%!H4~cf|&RWXCs)-7inx0t;`|+j(nLL>MYqBo)B8=#$!y{ z>MMmLt!UI#IWx=BW9U9f3wEx85%WM)Oda%gUh!YD-d(=FzK^Vc0IgL8XeEaXg+`b= z=9qJLw4$uhXYzNyV;96NF;gFcg|p@y&M}GIT8kAdzW=m&|ITQ62mMz zC!|WQw5lO*a{!DrsxgQ6%fP;HS|T?o)f?8p5*|hXU8(o=!R0-b(QUBr1GxvP6!cIdscEF4)$PbU4lUxW>S`hUH^)%9_A?hn()@N%RM24pm&kx5S`0U= zNyIQLEmYEOYMS+ogd@!L^Gjd{CJ9x0G31^I21VN31tX4nUJqE$VOlRvMkA>y&5K}8 zN&t@efGx<0gWy1P0D*l1-9o$>Tq>;gFj{EA&$Rh^9TQ4oZ#{P=SIGet5Q|CV3axOX zUF>R{KS)?`>@1rs3}HF2oBd#+L0UcZ?TezZnE7CP5SXFQ?nJ>mDR5%KtZi8sZA34^ z-HtF^m$Br{-Z1ajYnZNzos=UEK6L3um=ShV1>Fp~L7Er3$$OsOUI~Eqa)YV*OwZ=1 zQN)8+ZxN?Z<~&mICTgy*XZt2blXg5*D;e|9v6=`~D?_ZBD%rB!IPp@DJ)x>54Kom> zKNp(xp+ps&a`ri%L8#4UDN7$cnHPE} zU&(V5#W9#s;hoznGB>$WP=|L0Bt~buy_o6|t(lzytaPC_H2sDuN-Hv@8TFNwe_;)|^$6C37<*Zn(tNFKpEPty`%thOIPb2(3 zIDF^!+48gx^uGD2^z<3T7lgJ0`31m*Vv%|(A0JmCcmrwT*9QvfQ{u$3*Y^ScXJN1|ylL~B0B+cH!RHBd)@0>Ws zV(_l4F=S~W1ALIf%9=hgiOzo$r|GKq6P%eS=y2=BbB6aN``z~aeI`y1h-pg5_k$td3Kp1>7``;`{l!q*P4GnI;I%J%|)$<2CMtYMZWMe+?o zXPamOd68md%Wm~v{4%%Nau#v;fQo>bg7TK&U|DE0P*yAjH{)2YS_#2hW#*1f zZruKZZ|u~ZOF(z&9- zeZE%PY=UPtF$c3Z7ae!xk-R@iz$`M z=5=ea`_6^RBhMz+nEhXg8;?}S+)?bT^Lsjn##F@&RfcJDr{R&TohE6WIVvK!7rwYL zX7s>Rp@>&86XoF!o4Yyz&N^rtE~U47!u0@ehwsr!7V%BV6Q4gVg)W)B9hK|Luw5od zo+=?v4!Q&aY{NDr(^`Vre8CKn5G=q(&KaZ=e&b+2b_h2GKA`#V4)_w^jr&LLYGd>S zd;Qi401QufKJ1Y9{=L8bp){A!VdEIi-pk4wV_)@<0>1o{HPc!Hoqgq6gRykERmK>d zh#2BVc7K$_o2x04Fx{oZx|B#Y5!!HdODXD9p;FSwgYNJSF%u=#g}1T2HWNV5=mO}( z0R3pmQjdB7S}}-0YFJ$&+>Z!-jaC7_G8$b%?RMeakLHk|?s*3AQ&e)(JX+Ei(jC*= zVC!U8CbB>SB&uz$w)<=~XF!rw`vHR8XWCjL)h^AB|YR*Un)F~R!Q%{)xJsB$*I zGY(P|g|J9v`QbExim7A4y4tj%2@NJ(J;vHa+Xmy7S_LriFWrqh`v{ON;Xpm1r&>t2 zRSxAxMElHKyzxpcws5<8{+T1U{nGW~v3=sPee-Z}J@DP_1lGItCoYgBlIa)~lOsPD zObo41UQs?2>p;ILFVJj5e*h_nx`65+?FZV3k@-L;rffLz4CNnOzM5Sacik**$^$Sk zEqm?DPKpCkEWPM`6EOAzDWQ{8w9SAT;k(E{wL29?Z`#Nju{*dr9@2wM!>^R+1!&iN z%%PT{4?IS1wXBb9Ox>hAA1wZO2T`H-Tno+WW9*c4YBfpZ#Vm{SXL$)H+^xNXT%F1k zmxZUYad(ptR>vL#?CT(8&7>|RWFdg6V5B_PyFq>3DxR3O%9q&d8}HCYfQ z1`#+7_X|eISJ*#3P!zzMWtjUv5yp>h_&@l^=<{^92W%B7)qD+3%Zy5~y z?3s%RHHpfoyx^&ZPz{dU4kuNEO?<{jMZtchv5Ew%^>lli0UGejzmC54W*u?D6!hA8 z%>iD}xVM1*o)(;aaS(GPavg19;^X4K$a=pG{>^!;xYiLgL%AKzJN%|S`vRaPX;^MpHKl3(f0sgv>mgKGL9mC3hgf8|e1%@euE)L@Bou<$-a$t{GAt?U#|$7-(Y6+H=GEY8ao;*%{(wL5~ab$`1M}- z8MaARL>iyD7HmNMf{%A>sq03&YVJ<^7H5}MsdQ8@g{n=>UVNv&%Rw{iIq1k=1xh}vgp`XxdK%K~`F0uOti4ZcCi&2(sFC)l#EnVOIW=B72kp8!N02 zZM*$bU68S~qgZv7hIA2|>Kj<673^#?M&_pZaFbMxqr@&jkL7gOQl!e>2p52QfA$m1 z7x+->xN%P50BPKfCl#_6Uesyalfc(c&^#<RY<=(ZzDb=OOwPtxQwPhvetEBrytG{JR9~!cN|gMoO{S+xBnlT_4KTUs)PN{ z38Pqamz4{(c9W-U(<^a&jJ|;QgMGHp639Sp}`YVo_e2)hl7R-V;pXy z$+Bq(0ofws@N6U!lG=#SM9!bQ`6^WH9(ZmVDr!U2@m8$Y3|4Et2iqQS zKPS|O!;bPuzEqHH+PrX4}K%sdNDDRgI`@3&CA3Z9EF8 zWU4O*z;Xaw1jC#Wyb%DVa7Bq#PmPo(K9aD6)~X9sf;9zFJLD@i@aaZ_uv$hO(B`_(VfLg~%f& zu?(G3T05uTbBNdNkbVYiIXw>9S`Q%NhfXfI8Di!X7IHYeqdGp$NhlKZl}NZ?FV3)( zB6Wr;;O0V1E6igK^Xk#Cc-IO1hTx6D!0uKrea{!^WOMl2l%1f?%a-s7Kx}pMstnMs z&3bgk+scgCRpnKLZq)BJ_Q3Nd#k#$F-ECN{Cd7~sscjG8X|%b>H8PKfvB%2@a}~T8 z8%3y#`N8p;C8+mLpNVW@^;Co!6AkBu>du?shwBLK3{EIS_`@7U)cX6ShDWsE7@Q37 zhyq5iJi}&14qglcQ!_{e;vCJO<@OnQqAYwB<@QDReiJGGIELnL+3+}mx(*v%6Z@hZ z#Eg7*-**T#!0;$;!yx-Mat|~kE{r*#l#B;sfD@PVx|P_Dw9CaWEE%$*ILfg+bsv^W zMr4^JjQi2%d_&go2lE84@R2!$N!xDEyCpT55**Ro0*g5Q3*ny=awmD|4d&m1v-WR? zN&9cQOFLUr3o{bHf1X6FP5xun@ZWO=89QVJR9*y%ff0F%DuTu)s{D|=tHx$uk%Qv7 zLZ~?rI2aw?UEnx)W(U5v)Xi4LgtWBNda^HygRX%=b)%R}r|opNowgI*KVJtAYCvA@ z$zc(yz@+M&jT+XB);OyM%~-Bj&zRRtmpH9vyWPG0^3-O8@>kM_WsP`ev6lz4E7zxW z0+Qk7Ag(ORPYAX^8GYXSztCc)UKV^i~rqM zD}IQ1Phc2!5nM5f%oZ<}^rpGkBvY+bYJ|hyTY+{dmBg}-+TuWdw)XS5qx}gf#Et?H zZKihc95%|y#CZE>lJ9qg7MpL~ccv4sgRBAbFqtjsJClPz%Rc!(L#&rd;H&d5yo~?W zeLw#-#QtX&{XhR`AV%3n30n=-m(H%kT9px7P+nnyMVIcU$bxihopxIrv{=y^2hv9n%w# zjun#_hfGw5SyJ6hCha}sgkt+rCC)r0H>gZ*$ef^Tf()3p%vJa0aO5w3!Q8X4nwr-P(_)2Z9$c!}@&7-7OpJ2_Dc~9ci zw7ag&(tM=yN7ZezX`Fz@<6xw{VW6tHN$;%?63;Pwk5ZsAq9_YH2#J_{78z*y?so+F zW&4D#DmtUUs5=MXko*-IBIA#^qd^gpJwY!_!>JZMQw9Nsb*&g+ZtcIykY}ai&3hv? zxV9o5GUhF5pE85C%YyDcz(ogD7-?l$df8Q5361eHye&Bldy<|7A$>@AsP(g0$t)Ee=)Et#Hcn$ZsG_+@iMWs-m6hs<45W)LMgh~ZUk=s2O1rm z{XM{M3)R>y^Ch&PY_O)w)>=^er?}t;u@l!y^xY z7%6{jyAXVU;$OlO;`e(2gv%L)D!@4yUO}9_za6i?zn$Ab91-%&q8H1|+q&{^!7xav z@teXMMDdDcC6x!&_<3+aWm%f*v_=S!&w2Bx+!xf{!L>m;pMT@AZ}4d70RM}}rupAXU*FM1 zUrF^}Y&6aBTb4rv2*KCD9^m81B$m>hb?CM%f)Y*B@Y4Ca$`{KEZgx1;a-NHH7uz@@ zqs%*5m=8Qwi`;J|WQHW13A57E*hk4OdN0gb`n#L)XIg%$3PY6Uu(R@cu$y(>gOo{3 zhv@hNt$9dEsiK-yVij`Or0fNv+KqrmG4%}h`zP;EDc|}KilDNJM?fZ8`?5pbPS#sH zZ)Uxm%m)`$BL^eQW0jH~JitNet^k5*SY&>Zwh3Y3slRo&$F5{|t*4Y`2O|x)(4yZZ zJnW6Sn1gcX3}xNheGg%Xz=0u})fUB+ctE-zMFx%!4p0&#i@CG{csQPrnai7R1L(S{ zrZ@0kyJ&lT#`QlGox*Qs=szfW|Gc69n-n@%S`bqfAS!8)X!!pNk=Prx_PHDGBdbvu)y=eBvo0Ml-o%`uWunW&{5yaDHrj)Zq{F*JwcTVj)z zT+wN)dKoZAri}zb8EjZ&!6w|tS1e`SA9Z{(~xHPJWn0RlTliA5@P? zX6Gh|O6^AK>^Dl6T73j7YNER^^C9lQ?hnZgJ`N<%C$Ow$#e3>GS{vg|HNL@{hs-U_ zwNA7MefZ>HMZ^~6-gj0#d)l`wvPuCPM^RbMbA%icVetL*y{S7{^aAOlML?UhpR}ftc@&Fo5fd@)^Xyhg_ z3ocvbkfJXMjr7DGp|q2vcXkoBT7)h6Yd_Ho;a8wbZRT|8GQg=Kx_Lx_S7lk-BugNu zusjK*0PoN=AxOz2-nAro*=G59tbScjvJ(nNo`bgIdglYalJXG{!hu6cCA4sNEM}Bs zQBZ=fPTiz6VJrGoyT29!FM}=c-WyKk`k;rBKj)VX}*LICL3P?3JP;`r8uWPKEmTR ziE;V@splU>2N>EU({9(B+)oc%>8*afYasSeJID55W~f=p_ImxtP;@4YVf0CC%b`Ri z$*zhPsZ3>Ne@N*v)5eY9f1pm8GSnU>)7Z(F+Oq~)k@YY+==R;1Y@m&?<4xe3PABVC zwxEEHSFO>>X$NfE{f_KX~NjZlk?!@2KjK7j-BpgijnZF zUK(H1a)7 z0LY`6*wUk!a02C7icyNEZ;@VtSdvpc{T*27XWCralDWAIBu_BsE49o4Xw)It!dVOD z4Hjnc110TSC!L!@DpMF|)~8aY|i|c7CkkvE6wnF)MMzOmWGrRpc{l(Q2*Y4c1FCw6Je8O?FtVtaTTUF$< z*rEr0PD_=d2lpzLj<~;=VLrln`K=A;_Y=-jFwx{-|iYc7W6WJ)w-z$EwnH z4+51oN>Xv?hrrAsH*G+dioIT|>E19b1WVpYqtb~&me6~-TiX!bJEV3<>BIGb_t#pS zaMpSL`o7=MzTN%*VS4<3bS}w13-Vu7YGqxkf2h=rTPB%pvWxKi8NV{lEE8ofsGijj zNtzTOo9C3g6D_#5WIDOAUD*r1r1AxC`tf&Tk*=+!giK)@?60S?xsS8F(mo#EM&$wM z_mU0v6fy70QWg4Bwrw@ttL~7Ys3DKgc&aM1OJUPC(ejwBe$J+2Xfbo|P@xukuj{t!*3~7>CYyl^`*3+a zV!;(U^J7)qg-eR`k%N%ygB^}2J=IE^tc=i1zko$2=gHCg;lY4npp47qX)S{-ei`*G z(JAYdY>7|JgI9G{Bc^Rw`i1Vb)H1RMoYv$q2>sD^wFutl1p)yXh6cJT|0NEKRJoR( zZ)lJHcr2w)8a zdwJXHZ48K*Ze;+{jPoOF7aPE4!Gn@jI@#cmIH4fxF;HmScqhuPo2aww;ALKrW@0R} z-AOVL3DLzeiL^1)Xk$*(>(BT}0Go5$=#l1@=>}>W{47a{2{KT5pF*h|_V?|Nyp6Mi zpQE9zyKlX)`XA!s#VU}f%(W(beAfoG^@7*CR!?s?f71eMmhgMAzeWGAZ>@yj-(Pgf z&W4WvFEo>^{^o?DiTY{#gN)aLD@c~D&JYr2Rt66tRXpj&o{)qvZY2Q$VompA%9$)% zrXw^5k06Yqfhgj+Z*=19RYSLsnona35M5BjGFZ5_QsE z2`&*zu6*uB60}s6WltGuX6&Uj@Hr}=5$RSF^jM`UXqJ+rcJ~g7j^a5WfS#(YY&S1} zzT6!u6~$Y#UtOgt>31*H=}JHw&d>_!8!YIK3gSrXA*3GM{)V7V`~~&Gk{gP*x+pQ7 zq;c)Uo)=Y5?w&6JY;VPGC=j%l8}91z^7@YFt~q!g za7#jsZ9A|hk0}I-9Xsvf7UeGV3LM0<_63FdB$w>uiJUA9wp=eC4to(3cflyQ^JvoD zsc0{^B^hXn%eq{Z!zP|=$w;)=RyZkp?0mshTZnMtC*)QW2wG_9Z#;>0lqHqyUQ-dJ zm{YlyoG1*)l_uIVjl|X+#8_-b-k!F<)1lQB!XSp%VoT&VC+$;L9v?2k>|d69M4v`))uGH2;%pGawu72N9GIV5{b+^&2m ziR2aZB||2O6lqH5#=RuYWf$#@8S`!$)rRID63IK(=1l3~Dbsc?9jukiFDPDVr(Am0 zm(cHV3T8JdO!kE#`d0weTQf(yvm7KghV0>aqLA5Y428k@6D3Y92KTj3Dn4`>)8%Lq zCWc!lTc`W1Up{zH!>h3H*?VrtVgBZ0{&8wMkslNDVtk{aWtz3b$9*Ic#iooWmszt2 ztE48(Tx6(Ox7|$PE;|@|V+=^)t~)5tP`p?AoZgr7sYslZCDSn?Lb10BIp{zx%*xrH zF(*QG8bZ`^Ta0UiyXa3AtWBCl~TfV3M+#F)%u1vt9PdA?U8M2}b zkSa?HEBsBMC;}u%vcmQb+p_VIlU6#J%l%~S3cjzxN~6;OU18nqyLJx{zo$hTe%F;Y z80O)P+)Jx9hFto>|A-J}pHx@-ZH>>`Me9V!qTh(9!PF^wA(#HA>;f{G*4tc&xCGTF z4lo}Jmi>>He?~@J4h$)>*bok5w7EH#?C(Pq>iQpnA=+)Ub+3#a86o_;Eg{@(6Dshq zYw0bw0a+)D{qhr42Opn^ZXUg$TzMhGWjVr6h(Z-a#Gtw0>v$CR^^L&F2j@_G0*j|*!O6zmvEvC3x?KF8L zhcvd+3mH#zZ_$Zl*iHPKgk}?Am(E_aewREoCOh4rDGmjLZ>wPnXXExZ`QUYV(k$v{ z-PG_o;Yec4%IH9|XdHc;x79u>$G&HVUQsQaAFH;s_Dw+Dd3oBV;WAYZWA43$-~QSM zk%780zYk;60cTi6)w$-za0cd(_9VsbRgy%{C|95yQ##LkgCF%&S(DK@NtqI+iGz_W z#domK?kQ=lHTW$y$qD|~11y0>xFRphsLWyKwJDW}|r>Q2bLM}VH8vHQkF z+MLw;v*J1Mn4_0E79>Y+!2(+@VODr1;G;%%^)TF=mY4v1F=mp|bW?2)O# zYmHT3&RBlURkI#h9Vw86y5KC76fkK-g92R+I*b&HQjJ$?; zDPZ%s4yv$m;J1e;;eWYHk-79oH`vqW@u`yUXvE%qnsVOT6cENazvI zD#Ax-g~Q*!hLEI+c+rJoZEQ!Jdz;h;-s=zFDfmeqzWC|5?>n&WKxpCpZ%#y!-m*Ty zdKBOSuuu?r(iS6yi$28q&@@+=aJVjtjz5s}#b4pWJjCW6@W`)Gqsju?t$dn;`d~}6j$Qp#MTT-x+lNM4-B=g3~>VQ zNoB&15%S14#&HQ&_SQ}g#(;$Rji(z9&wi>;3%)vsVMXLcsKF>j!WSE{$Hd(&GWA}y zjS`_kOGZ+@dE+YIqhYw;gX#%Ncp9Zx?T z;jw-9`zzLBv3NGD{hpwgzrh9LzXulogWCTmlkz{vJy~_j30W28Ym4oaZE~T6vN}NH z6_G^JKMze&sS-n*G6ltk7J|wtljbyK+I9;bZ08+AJRTFz`=%cp-@A?(4xU3;Y!uVy zu>X&pBad04lk`&Igu-{;$%9RU5lCzLQpsWFCKv4Vi+;06w5BXgxO z+;yFo-XM=S-Tl7qBl>Fl*e}r*Dr?nMEfZ>_RE@4uL&?F0pJX=DuO;*h?ly+H+X9}`<8I; zjTOLDN;?YmgQW`Mg1&PGwvx{(6Lt|2B+6ryu^R$d*@v*zi+S0i(%4n}Kq==+DrpM~ zcB9vT^9QMQRmOIMPP6Qfg=(oxiRM*1aAY2Mhi2AWZ{tBUj(X~Xiy7yPmP)DVTQ4xG zyxHxVjQP$tEIMeIquYsK?5QKvNVX66dy8M^eKEH)x?Al$)eD%W*WENw%Zm{w(zYk6 z)0~knm*@7b3EUVQAzA)BH5l$-vrt6`3@|uDVIlCaI>W54aF8ZXOlkhH3`79Hv&KVx zh*4M=#*8ypAaIx*5$G)5Gz>2&cAdcc`)3`Ruq@t0_SUiTv`eHMC<}50E!*8%+=&1h}SW@m=KR;Ii@>6AwS6J2IUW(yWD0e8tuG zo`s$H17<9dwVw1PSmH@)j}gJ1>yF{gW$$f;=wXON(ZCPxwI*vkB@AAQ`0@#PtE`?%%3E37(o&?7RAp zzWFnze_#E74KDrHfB#zk8%m1`D7vMvkVS}8yUlt63eo~v2ny7C(3WOx94UriK0oL1 zr1E4f6Nn1+3+a2F^J2mZ3wz!aW8Q)kppn77Ptu*%ye^x6@o|2S?&t6T!eixgaklw} z5~9o@!xt48Vkl891~4lqI_eIDecT=G^rM)J`;2pM;?QW!(6LLAp9X30NIr)lQ3E{ z4Q+|E*fo=<_BR4_-LR)5!kVm`78``m<_*`B4wMe`+DQNN4SunIWeoyAN<05Q}Mi@j@UAj(C@BXK69pp9&3X5~m&{*s9`T59hEKLQn!Z_lXo}ap{ za=QJxuut~6grDjs7q?jS?obU_WDMndfOt?h;xNEp#KHO8B%9S4e7Tt(Z5(gzx8vREkRgqRC0Aq$ksWYEudUJ+^TqYT-k|wzf_nAY5qpd} za%|r+C0aQYJ7OyMs{uvgt#kMNvwVWa+$29y=LRCoO>uCoLCGz?II^LelsSN(nH8CZ=FJ@F z${6IV$QbVB%?onx4`5MFX^T!exq4`b(oT&nx#s~(g6@he!7WGxlt3c{uzh>s^A~>R zfk7ZTd;tg1SfEB3zXBDLr#yzK3?q8MC3C{=8@V_z-p9q?!{wo)pUME(#%&Q%6~4Lm zbgi7cfO+`;j*l(6=gvScF!}>Z`!cK0iul$}O;Eo?kgv)TuspU43)6rOi^JpshpBVR zsqUb?2Eyki(xP&CNLl+ zrkdv>B8>Y3Wr=6k1t-Zb^-{!_zsWm`v|2yf{=uYuS0>@Vugd?m?w1FLHlGWIeJbPjq z&?iZc8xTSS*s+1Qx-Y9(UQhE3GRgI6M#>uD2HL_i14F+(|4nYPz+f#~%(n5Fsh8rN zba>&%@VT!JjOr#1SY=`EmP}QP%8#PE6!Fb3ZOgCWFUW4w@&+c}S01cJx;lnkT@`Ul ze6d`+qixqy1&c?`sZ=XW3v`&WGj6Lfrx>zr*!5M$>`MOse1us)J_kc(hYwVc{H&9gu?=#rK19G zc`>V8f{KC9#6$E7x<(pW7Geev;Qw!Y~qIPq5wjO znG=)jCNQnPfHs^BP|V^lASyz|q)e0|B52fR5uyDbnN>)w;kavXH&9)WsRaI14*j%9 zwFB7p{?Bg4#e^J9DvCeMzO~c$Mm@i;ha+mltzyR%rY0&`#f$}%;?ou}Hx?$0Y0v>T z_fop|zCWAj+#6A=%3_PGv#>%}Auijek@uZLtxx>=pLLj~o}1#3g{T{M+P~sg;9kWC z_I;^Wd73P@N-o=s)Q_wQ-{KFr43ibN>)>CkY+c$m8Xkpq9JIBMxC&LKt)Rpj8_qO) zy$IfYeCGsBwjZ(Lh6&-`DAJ%d&PgT#nDZuC5fMJQA(!fwO=oF4tbK!t%UjgL{9tNpIHc3hD~ak%%j_eqmu8E((s z0U=uGol+UMb@%Ek%;RtvIThPm4Z9{;ikXpILNHw*$0f_G#XC6pqsgAg1*2HI?G)1+ z7_vhQOP2sby_4qCU~mONSoz|(uF^=>U^*??*a%m{_chjzQG)jQArPv zQA~YF4hb63AvEDRKUPzdyJU#N5wds^%EKv+O~evW$y1$>pAkquDlrqs44tr*MX-h> zWo?&oGfYXxSt32d6IvIztEz4O2-6V{%KO3)!p0uv}U$5ldk{ux@QLPy*mx% zl_6&YQb%DkC??VZXSgUv8mnYsj-mQc-C1Wk@23@I!qiEc>U~EHr>NaYn!2;#sH`Zu z3k_vQl`(0wc3XAd8`l-ZtA9)<7oSQfL~taQ6s3-sCM{E-stSt=D+UZL>4p|76-+ni zM)~2&WyN{zWS2eF)tHtqkwOepkyOut#AIfgi8*X>Vo6nekiWckiZhwaUdMtd#^#3N z4m0<-O{6;OW)JgF7CX%#wlN2LojlH485lYy60)l%QxiIj^vrW}fis%OJc(qBL26Jt z1&;8ZM4EybdqX;s+FH_#;6SVlrT3NRz#pvOG;E5ha4#Y|sLF)gC!E28ICvsOa@*yp zF6x%s13bvc9`Y@M(za_1D*rF*f}Av}N=(HU z5VIRS$_c43s_8Om#}+PRqX@5@A@ws3NFPg-+^Zvo1tWRN{@%&mV3GM>KeN?8tz!VQ z3dYo7EmBym?X3s)+9DcZv{MT<^f1^riByo<)4wL(+t3c3D z#+AR6n9)EjrXKDb-RwG5?cxPrj>+!Wlf1MQ){)5wgDg&laPSSFjp}+&&HcGi;qTczL4h6oi4~3(p__(c zb$sQKNn10Xz|Q3!nQu1x6C>urtvBhZ<~Or2Yo!D|1=-*@Ss>r4wFvy>7~N_MB`9e; z89(gY+7xne-$|}ByG&q>svmRa#&it#rb$EuVw z+6hyf!qOLz?gNL{McALO^M^pVxM#Kq5&rW6xh1Uf<|%azHnZ6kfk$}6DcBXnpEd^W zA-`ylnsUUEt_gw}oAz{HB>;4bN^RU>iTepJ`yD1;u-y|WIL-9uw@FTO;LMO?&Lf;NaY@%CaM@FVQm211G7b%MBw zH&OSFf!}#M&QHQc=r6)NA$u_T^yje4g|mE45o4DA+`3{&zLVpSqWpLOs3wWzAF8)0 z6259<@(fTn(paZF#7Ks?7o9YU=wOi*?Fw-46!?8YOl2Rvorviz`SFakQZKu3Z4caQ z2-s_k=x4-9@hYJ)BQ~GAPn%VoKz)VdQ2)~_v(3FPTIm33iDPbpA^?L`e)ta0QP9fx zzP&q2aNz;b2lwJ{g1%6f&g<>>9SHgD52X9|ci=ysFcLO5bo{4;_?H&b{B0IQQv8lO z#s%BRDiK#NEiHhmG|@;;6M6fG6oijpmcma5KvxaWHFl;wn7u+Tv#c+v?7S(;&gvrQ z12n_;Pi=QT@y&Y7w9mGGC!kt$0e;-5h>#Bu5v3t8oQ4Kb@)x9`F%U1fYX@PwJwH~3 zb+(Z!^=18h1Hxl)M`zV-OvPw$oM3>Sw<$DNZCx%iLaSPgv_b;-!ic_dzE znI_DhYu}#&qhAx`C_arMtP=9W`4bF|EjSTuSWT*73+H*G0y$-ul$ zrKNOoB`ry~q*_Y%0fn;T4t=Bn_hwB2HLI$L3fo`DV$H?<*sFUu^uiK+NJ;gwvh*}T zTE7{e%S4*1&e-gnl+gm)8Zwn}9aDaKgw!+FEw0hBnkg4pxn&T}%gJh~8$S$;$~3G# zCJjd^vO1krjAWu(JFcM2CfXzF0-=%6>=O=}zp1gPNNNZv^bteGA{s+vsSxc!?&G*= z4nV1aR!K?_P#Qw8V;tUP6K$GqcCpV(U4B2qGA_&y)>=F($)bZW2_E(_hp3Xk@ zWx~Sz90YdD`%9!$B4V%&z9i|qYWXim51jZ z+)aoS=+#dA;$3tu?kt97Pe*EfG0(E)w26|qIm|f$-vOz>bv0{ z`VeL8fEOd{6VvXi#<4>$qVjwHiXeSr*CkfIhX#r7`Bz;l>BpWJb+G4*Q#N0k9Z>Hjr_o2XBK=vO@t)mFv>B`f>Uac(-X?T&iLtWf=X|NP}aM#RMs}DpPwE5mssH z<2nlUVdn#_Nqw;O^w3Wc0hv^C25K~|NNu!_rl6vrq#=N%m)bGY42sU1Vz#4ew*k00 z%v&LDrrfP$_-loz#H6uytR~Cv(YTq+ zBP4RBWNni{S9&#{`L~@W-r$m9cxSP?Oy~B6qlI)Dj4^nl&(8K_8mC%?(CS$AS37CG zQ2}Eh(recSgx2OG=xI;$ur8H#3y1F0?IJtoQt>rgJIx8D2I&>-m9ho1`77yFrkAV% zhO9h#>$KgJ&SDdGd&IStYoJ64#izlpOb0glvl_EosF&QX?QO6?6WI>CXanWC%}3w4 z&=?;eV(W0qgnZ@(n~R<|=2%_yG*g;P?t9gAR}Pqi2G$--40196oC>j8rA{ zjX#&}(ETr#_N|*%6RM2TCphJBXEKLJTiN0rl#XlrvXoZ#UkyXTAwk#o5t)~4troTo zqZ8lW&hlPuA3J5{DGl*UCY!=eT97ZG$n76WV55$*@>*5c`2A)6A z5w})FRc5b<9y_PpQhqUZfEH0YVo9E06bWMZ`#T*jcRo4bp#ykyNVuf&K$0MOAZZk& zCAAY7z85q2M$L%|XDKs=z?UNxO65(#aCw+tkPu@r-9l{khP1(cU>4vGNsEC4^AqR0 zhBcO^qf3~MWou0L2=Hh#QP=` z#x)1JFctib9`zND44-2hSG9B_sl|msb$MqhyuxRMtYBWP)OejRgblKf7vCNW)Lmrd z-X&k>7%RqE#2BOLO=XcqIF~Eg@r6hg8bp+@kb3~#?)O6f*Y<$&)Bwf&-5!d*FW3J7 z-~VyBswzqThYo=(h`^f&of)Kx04Qin1OeHaN0di^)NVx}kwi5CZbcxhA>mrS6+N)? z49HhzDoI%UP4lJjCL(|$?G6`Nnw7M^-E(erclP@Fy#emh=>;i7_e-sBK^H(hvBCuJ z4hBlW7>f*+g@i7AQiL%^S-ImBxDW*aN%(=OeWrtyvX`D6?A2ldrhia@eemAYsc&x0k7D(=Opx|hl-pFcF_A8JwraG>< z81^2XV>T=eRm0|J9<>n8f)>thG2w(raPF#8L%&?yZOWKZfR3-J%3#{+SA}%ZqRz~D z_AuQ#Cqaa?K&vn<L5=FznaIobBOy6YJ?O|_hB}6F}>U2+0;HCqd z*j2xB)IzZi$vib*Xoh8$WfvAT7^swoP9?e18PP?dR&;i8GzzG@4G>r(CX@Gajyt@Pb7F(fcr?BJYA(Cc4MLLmOtbEX2ddj2_u5Ni$nD zlu{yT*dEUbmvGl@v8H*Y6nz5TEp$4{Sz!|86HEth#Odoz!9 za(a2r5AasRV|j{21RobGR?4;haQLARiw#Bo6O08ZWphg;@fL3ErTAHG{XE!f+MIZj zcHJuswA*W5aqI(6Fqm`goHuARa5#tl2Cu*Mmm9zrAr;S!j|P{JLG(rcEW}H1q2u(% zx#G+?tG@m%^*yl8i)5Jx92TMU)x*tVv!EvS__hcQNux3D^hwbd?!M?+WCYoKux&7F z1Orjfvanii1H*kmY)yh2f3;F(>+dshQt6T^g%Y@ABKj?DfJc;}Cu4!?dH%mv-(%Qa z7{E8R^ZNb7>3`tb|51IiF4oQ#YKGP>reYSR)+YbD2{&0yTOC;)V=GaF43qq)j)($- z(lA0;{V%KfW<;O`uqHC2{uXD65C)E^B4*^u#|}08SL}QE=LPT$Rbkr7YCf0h&$5~; z=5Rp9(<8#;Desk!%R3*l+hhIScd%U-??QrraflE`(v+wu3sB~^f;`|xrtRomUK7(P z%FSccu{Nru6_c)BbVZ%ic;%CnR0rWPbdyb$I(YnVB1V&LLPKdTRPv9b^hhWa7z5^r zxY3se&7`3>k*f{8kVd>>oMIA!);z1Ukh-gGXJN6-G*xj;P1QN5olrm%RlZ;7z`VMw zrP5-EEn2xD*fDsuMXqZAKUWK|1r_0lzW! zyXjy&tU@MfG&d-VZ8xlJk6LmTvJ$*Jd5=<}mvn~jqd=#tPJBbMt~@$~y%h(y)arj3 zcsol5=qz-w)(8%VjbBwVETq|M{<0^b;tL)eS$CX*w`}0zs#`3fJ-3V06qe)+nAt9i%w}L4Sl` z`B6KfvN?Ke^b!y>0>dt5X{1$!b|@WxNbOB)`2N+@9n_EZoBlp4AUJimn+BA-Hut%mE z-8ot;&05u&y2t}q)~e}F!i>#Zo!N@W)D(90uxU$B;=71wpQI>&?taT|X|1#l#^#d( z-YCTi$WG4zI^EcZj1jVu(FG(>_#bizS7H{u;T)=Uy!|<}!(n_xxQ~c2BZV+0Rf^2j zw>Nla7=x&Dfc3V=+rXCG@VB`bU!0W{u3$ll@kp^PG zA(U7Dv|-1OMw1Ae0GrUtxZ{GX3fl(;xhilsf8+5Zalg*!g~ zi8s$R#G6b|(6>s)g}=9&C4gR0U=>>DYg9#;W1t(%AxJ6Y zz%yq(@m=0A0O=`WTM1gfgci}1G5uq zo?l5WKsGwZXvHdj?mIBA_KEi9kiUn%MBc~vF$C{Wn0YKMjDlO;xdLh+>se?A++BM_ znt9S8^W&m24&?4{*IAfECI+vd^unpFNa-pfS(a1>P~|bg#j*emtgyT2?eVu&V1%zV zx<8a*ZWOSJt+BmLxu>@~f9MFd4evKbKJ4j4Zs z>kRx?IFs7@2iRL-GC@h&=c$m!i;R$h#2-DeB6}_8YVp|l>FV?K;{p7qm3u)UBJo30 zC!Q#zaHr|HUA0hIPJcjq7``n$*u*hJi^;h}B>6kElf+fH?Vf}{X0a>nT zbX_acSQgK}Fx^F5XW?NpAR3-?&-1YOMl{c0X!Rt>^vocTIr-N?@L0mLl9t1BF4ofJ za7(4Pyr>K<3iZ6S^@VDjdFWPftinNNOqD$92%!WKtO^K*$H~<>msARrdmcR0VOE0y z7Be&C)9BKZjnw1Am`WNpmXCplVUuu&8>2`b?Rl{9VgK{5HHXH(c!d?dWN#e}9F1G+4mWLZcou38xS`Ko1BKCMTL8NY%ZFyb9jzN?? ziH~BZRluoZj_HqpMuK(*I+RDgk!1r}SP;H~1V2^2$U%Auo7mbyZ_t-O5ji+^7Q)hF#zu}nKZyba2i5HHU1{Wa!LJMU{D=7h^ zs)7n-TE3As-!->!9+r1dsM)*xT9HV|k1#Dcr^1$pvWA zT``X&gCQ$fDF&*i^T)jN2q+$S%+o_n=r&HI+YFU`l7kMLP03w*MLj!thUx?w=%Xfrtu_-IvfPSv96z+^ zlcKYJk|TJN%~c#bUd8<6zp>?GvNV*~hZk)O4v1fYMqaBj+^D~97zr^>iAdNa<%9D- zOH!s*JJn8yKZ*ytm_lPu?*NftWF0IY<*wI+l&Q8!fMeC9($+lir=;Z4o$Xf*ugS;1 z!`vw;b_jo848Us$h?()Zl+E3EX#bg7&SA98eLFm}({c;)m zn8U8btLE{)lWl@Kq+wB0v}>H%rDURXP3o~#&`)8AZRbYNu~r!RkR@)g;iZT5GCTOQ zdN1Nli6}iiB~MFgR(edPB#&kUgr4c9G_3Xb6`9an(-;O090|LgZ%ciu@q>}ywaBib zlgT)DJW$&>dE0hQWAx_=pT=d&o=U|~l{X5|EJ=&hM1^9f4r@fEvM<7R4TgVCtMhs1 z-OQWM4V-MC#Wo0U7lZ^K&q>ns=tjQsV=i|CD5odo^(ep&diyIRl-tkqeBH3QIW{e! zJsWqScpG!461f zZD;u#dOF4!sg$s)o4dq1fSc(s@@>qR29ex}gr040j9`_3F$zS@OLNyZOa!yd`c}R^ zHAS<-D^yyl-u?gqszD6mlvaP<9futAW*UlrU=ARtH=$6TjhD3++41E-0SlY#2A0+` zWW~L~RCL#O8Qa2>Gn@QbqT_nh-!mlY3Y=*l+c|l~td8%UYo7IRGu@^={+!tC#eV_E z^|~>GSVvkLPX7oL)u7W$B#t}B8{rcOv2_3`VVJJ$Owi9L1!!1}rf3H9fD^QYQ+%Ro z9>fq0dOc{u7=f82>vxih|AJx7IRJy%6!Fj4xq;7*VtnuO3&nSsJ+jKGidryE!@wg7 z4adyi0l8Y-V0iiwhD}z%vsk?zZZ|KE|I)2TE5x6RnEHbK^*7^0u9C?j__uK)?fZ}T zKl7jeI#b!ib;}J3AOx8qBOiwf5D?5O%&)?tA)$sZh$w(6u1X2It&%&%)YI;82B;VA z0=iQSjiew9=s0ojTwO$8-JO2`_o2#JR5(nz77momLQCiVmo0`FXG=3t~z^Qxlx&AY1OGIu-!AWRmGSHC^l zR)g*MbMQ6i@A+an8$hLn@9!u0{T=@o9{K-mYWSb`4s50w?Y`qTA$#pFsJRVwEl5`2 z$}l2KlBg$Yker7Sn_R9Y+!AH`y(>kk6LZ+MoZYjgLN~0)q5H|HH2V9P*O2=~`tmC% z6N9S&;f+fbJ(vFW4Rks9wH65Lv3*#?;w7V2;YoM{lzAJQocvGmmzpxk0qSzkY?m1-z5Q&Tt8tALv^__ylov zq^e<}e+g2Hc7*T}>Ud)D9!=Bq!TZ?h=3y;^F0lH3#{d1x=&!mkhJJhM7EsrIL@(JdE-dd@I;;DLGJRz#X>QgaP)SodDw-7Y)1PG=Rq}zaQ{H6M~ zkimBkelO0-%WaJaQsi@D%jD!b^W<}!#R>lX7{VuTA0Qkn#p=Qh(nfznp&^v4sp^b!@I!`}~AZJrl7%Sxo6A9Rr+w!;4oWZy9VDIwb+P3-MYRbP{ zonT^Xt4^ne3XfF4v`WEdBF zyf|#r<~LTTb>Bcg0vl9%wJz$^DD{H}?Pmr?+k_)ZE35@8xc^SK*s_1YUPOwRH(3S& z><9UTft#3mah#;3axu~v#5Vy^%cX@iA!!hOGOc-@NE1ksQ#KI0i(oBJSS?EFHC!AhZxN|8hH*wNO?5^bC&nvq}MXh>3 zMZK-w1+DImTB#>|n*Q4m1iJcbLF)TFmVBSb|Ao?(v~~Ws$MK)GG35zcO?1lSU-AM1 z`S?koh4c$?7;&pb^<=DFb{nS+#alLyflGeH^itk8;LqRN=S!?8=ahWx+0)ary{_7y zHoZ1-dwaeB>O#@6PFacl!&*nQK5}f9+!5lOu7U`CPuMsI19rXfUC%e)%ztq^ zCswq)(5fJB5na9&MaF`G6v2O$9(!-Ed-H>T>mh& zz-(zCj?>y*i)qfqJ{XQ8c&(ev7WhAnodr}?OZ)H<0ZHkUmhKKI>F$v3?oI)zL$|ba zcZY(cbV?%)f;1A+@g4s6`f@!l-1plq*Ws*n=C@~NKQnvgnJ11<0f>Glb&E?(j5@+T zdJeD-wF~Rv?{E#Sfk7SNyJNp7;oXphcp3>vph}cX%#B$5G|)Jv^zo$>Ade-QZUwVJ#w$q@lDmx&&ca_0cy@@F0)5}XWjCt`$ z>bFV!JnURV<#nb7)oXSPWgiOYVFyb zNOHr>ky6LzlVFg(@)e|p}Y|Z2tvCL~HN1ruKDj-(g4yliscuvDeTu1Dg zU^plBBd&-^Y%Ai%9)2E8K?wBAd3Y>0xbJoCAJAy zSxfpoSAiMMo&gm>?Sa zf&c%1+G%L?k9JxO@ZUMA0y6{297Ha)mxc-$Amm`w?D?bY=oYb1#>&edn65-O`3h@Z zJpUP1`>DrLam!tPZSWgff5}1#i}5s7m;?%eM!V@D9J_k{Czb8ZCo}RIys>@7VUb}&-$SW1*o9@KNBw$CP6GBq1Tx?(=VhOScE;~gH6T8Fz}#Xv9OJY z2r|Jujm7?uWLxNR8(>4H^LEp(luq4IdGQ*UQZwOF3MDEAjQ1=m$>C(Cet*^@y%(6P z?Skta%-a_NXk)urLa+Q^^f)e&SqC7sS<$6zwl=!Tz8he#-c1x#X?+{Cupdac@{~@c zVMqYlC2G4huz{M8USIwT4>Cb;1O18tvLrDtawec6%=cXuSa>E^oQ%mjrox!LF=ax` zz9AZ*qN&KbAh@Xb1&o@@oH)Q)m_DUQqqg_^l|y&$w*|RDdjUJEc^X-nXmN(Zluulp z6}YjqjUQC2RX%Jb$IIPRzx{Mrc(5aUr z%>X*5lz45j({o6fxqFOrVqSQ7|~lsi%=jES90J4F}7dy@B+#IF-7LRev-Vo+oZ#9j;g!i1Wd zYVGlCpiD9nFDb&X1p$6~xzDUAmo7=z%CG6MlZ36t_)A;DOvnEOONTkrY{xu1e5V#p z#OvxDS8;ZxdREVRI7n8YNjhOGwo@-b`ig~8(pjzb4N7wtJAC%7p2Vj6E0|SyKha+- z^5tCNUB~7hdu-RIPxPV+^iEFTKUXH@d5$itSJf8In8kJMal587L2F+cOV0URai1=L z)u^T9x#-pOn5j76)()KS0%Lv;l)i6bNgeD<8pmBWorpzv>Gd*>rZG!_3e(^;*>D7Y z>{qNNN#IUX*ip4zvFHNU!Wme!lgR_r?O|X^(MfcyB{&?y3ZjvRphF3NQW%ubZhNwt) zSNc1itXcxh4QyhBjA!8Pj8etX$@p}{P_D%sy@~Z%KBqOpyncr18MR7$FS?Cl#X0ib`7w;1m0XO}eY)D9?q%_Zs>t=-n-4d*j9l(a$Jq2po-DL3-2(TddvV9rB!~ z{s(B4EMjiLjKam2?+;K843QKOjz1rFufvwb{6bo2W7QS8RWqp$mVa)w-$t&gx$tzesIUXv(P)hCU*1wE=)=gbWCwx zCsrPVD01<>3CT^oH#9mS?kxw_W_~^rwp`lE_%Jl@;U`@_^+f&gq64o(PTc|&HDt$u(UbBTM{+Sv z+wu63e0J#)z^fJr$pB*d;Aa(vsIH9j^O^ADv}TP$-qG~QV#JbJ!Og%tJtp5IFbvl+ zO^llzn)fx0FSbwX3Bckj%lNyc5chOdlAEBOLYjq8t$%-2uFo&Xj=`Fv3(P86S)w1{ zgU1kNiKmtyzp08adwk~8Vd3+UvO!VDKuqQ1glvF^ylu@W#T~N?KqC#o>{N-*kF(RXy#Ve z;%<0BPCQC`M7V^nocoP?`r1~Yi8p&hr4wLq&U@|=&@%4`E?@b9telx7tesb|uV_lp zUvCLuZTL0pt)f-gR78hWznfaI-J9_S z3%s&-&3Wlp645ADtUAHyE00IYZJgLdn*fXy)yFVNIdr5c+s(|K;8svkIQvXYSlcE| zuj%PNeSnDA5%!kt>i1L5!tb}Y65q(?B@g7`h~2@un*CWn%~*lcrc~TeCult9{#r3r zrllQ*L8Y42BJhk-FjIb{V6(or_v2VH33niG)wScd>>!BJ%@s&hyFFY9yBpkKW?wXT z{~D4R_!$~^fl6L@6ejGi4E}nAbK-6odxio5Cyw=Y$>{32^vYKuLU6tG2^aH3yjbR2 z@=_(ewulCd-n{G7!Ln0{*;Z0(F`N;Xj7Q89lw1_O1ILsOw2q$sm9)dX7~{pR#y_|e zJm6@LHD6!4iNq*yOZNg8!?{c457ls>82EYpnqtSVl(2{l4ikwSF^VbtJJAcl{D{fh zGmR+LpX}z?Z`!{lT`}n(BLIX;-GVp`G>BQF2m+O(S26VO5vKhOv=`IDA7SvMP*NQ2rtoDMe7}znN-SY zJ;h-c@p;MrMc(W$XOFI%46SO*n>I(Dz4&aTUzs+X&T%fppBF}$aOO@aIb6OVExLUB zKt##0_{@*Yg)e!KcRt5LrhkVZsf=`J*=UZhjvKJTvQmVKWUbW7HD-NE2}g<3r;k0k zk0E3#3Scgoql<`28*i&{50nE8D6^&qVum=|AeO#2=Q$c@xyYMGn20+KvMJMZvKm9w z%sM+xzeLmWGhHZos|pz0fyi2JjGw3dVGYGd62y&VJBxY!8M!?J??Y_^O~0aiLrTNK z&OyAaPi3_gx-h`cOks=7`^9=Q6Mo#r=>(3_cz9boeg5c&Q_2wWAGohmD4(V+4Ho9bL!4iLZ0ZEKCv;Xg_n%ihTBt3zL6V!5lto4m?{twNsiFGLAoBcfFpu<(dky<_5$rxo-y!`zl zJYvZCn@Q|or~{s%q`t<1L%WT#{}h<91~ZHIlC=43#gB{(ir@;&yW>{wG$|fRAMQ*y zh0|l0*QEUO$t$j-)w}d)7!@Dh0aAE+S~o;+)i&4M83LOC=NtnZ){Ks&-y-lz7~eBN zPE`*)bs0uP^zY^A*ZIcIZXV~m8*W9X(;>;){a;`G7A zU(KW!;MNeM%h^w%Y{QACdfzZeRU(J6SzMyM>BZUVP}+lr?eKs%X?Z=E8-b)~>n{nr zK)KVgpB}y&i5x_d5Y_`9%jb(WLkS*7LJlLB$r?}@6!kUBLKhcR$t&gxYlekKF)>eB zp*J?pal&vaUnRPXf(7{r`zQGnTZ!s)?75(w9S~{XCHt`M3Y7NEf7b_!m_0K2TKt`x z$(n!~dX$Qo5V4Z>J*4pXNEDX;bWTVf;7jC~vnobi;~;O?4LP5wzQD*AV9+b3g`{|@ zy4Nk!d0Z}gK<~Yek;gyEZTP@Smd#+rX~?2mJrO>#98%;Ubt>TWQ;=0;wT)EtA#4G1aAnhpYun-AVZjy?!~mYT1z{?y=`~Jxw;1@4MD> zPr!8DEE4?7m?P!s5}1A3@|o}0#SKo@`wqh~rxDB;xaz!u%fu^M{TRE)^bKPbl+Px{ z6cn)6%jg2Lv><^(*u)ZYtc(uN{N{ac6pv1S_oNz6ae|;^XCJcnFhaj_oRu~5n=139 z=ZFH4OE=zWayDL^ReBR6CTZAg0jMJ!7?*ufEIB^xkc{Uk=k^|GP2xf4Pr%>{QxTmq zb1rZu3&QiD#aIw`mvW)c)cCNw9M0?HQn>Qu5xDyqVOs3u;~l6Kws!4`wgB2%JzPe+ zYDMTUBhdotqEKp3*EUcHh>qM}KEb=@=m~ZkaA!`;)4p-WviGy5>u4w3DonsEe_ihl zU;T#dLtn;?^FDl%=0_V1=8xLtbD@QjF2O`?FTy>o16K$_K7WfYcqZhdcHtl);FYCY z)e`hNfA)#~F(gVr?%E2>G$y)Tcp7C0Seal41)!IzW|cvJm%;+g;0tN#3#>O^VK`aZ z7fCesoBEe9+{k(&me|h8?DAtT5ddiBSwGRE_k)@>Lehva+F$@O$dQC6;yyP)y-0Q{ z!M$}pT8yZP?JUv5QFz%$bl1j=qOwT^V)xxdp}+;i3ngD4%?a1wW#Te*H`w>ePYl+4Vw9o} zJ$;^F>Lq*&&Gn9JB2mFVd~#l(gQ<}V)$_uojaO@b?S@Z_uXw8IzoW;@B z6QwC<9e9~bTuR)LfhN^|9D!wCShZVo40k#Ai@w2{gZ5NfgWl zr600D(hV?^mCKStmX8kAM|4NKfelc) z>A>Kxj#HWp5NE5hAt#%6kLLf(@`|^d1zSa-vvN=0?}i60$mF@y+;aidjB>K}WAJDx zXZF+oXb|=PQfgmt2vt%z5v#T{nZZztBu3S&s1n`0tjhMGkAO%e>3zP;XeLMCI}Iry zrg8$6`C`B`9t&9`dd@#A1^&IwDsP9wVGALb)TQ}OBFhx`V0{f-Q%tXy@LAc)N>mn; zoKgj^oKjDHNJ7mC^FnLhT)h{FCdwbd`6d)-+mi}3Ent0o5g}`B^m_&I(9%{}!(mnk z?PfCmr5duh_%=(Fq`0I8S3<~ZGa^Q_RE-x~(`LKIWF1edgX<$uG!Dh=DO-Xt@!#ov zql7m4LFD`OZJ)ZX(I=C{`R(4l7T zGzi3z^o}&!4dhd&V-&i=-9_U2tf)|vPL><4tqf5vzzwkRbUy}9i#37UGyY4l>ACV} z^@zI@#-$q#`YD$_KND8C`$|U+=2#DCPFPGiorV30Ab&Vx)hL&fVF8SW6dFI0Ur{Yu zj0}l=o&6Dxx5s6VXJx+ZgUUd2ETQQv+*V$n(vHAIfp1?wnV}$5oQuS)xjP)v#DhM> z;KU|)2#$p^Q$Yo+hzENTjP>vZ7w#aIOT+~n*KuWihh9!no)_%8Z1wnzZ{WsUh)_3U~^W-j(y*d5WT*ak7#Snk(pugiOCkd<@MEeQJYJelELy;61MR z)d(a*Mjca8!vtqUh-}()^rpC81HSwPsu`q{5!*RVFGQX3y0!rI;8oc8l?6P>PrRyJ z9lf1VnG5p7!bOILln>GrKl;kp-nhYRqc6B+d&;^Y5Oc~%Z|Eiy!wF3iCJXu-gawJI zqY7>FBFCuOyc9MevtA+-mPV?gu{T7{vOZENNUf&2BwlBb?TOTw3~rkEm9Vp8Y6-~e zy_D6i+miJi!IBr`%d_de@JH%7&G!Zw-4`6T&mw@Mn-OTaNBa2a{(V01JBYOfFcAQj z*K-;gOBL}Zuocp9R^;&@tC+gN$&gP}gRqpLb>l;ZDpf=lwwo1_c{;N#BYZJSVRp%8 zDQ3Kmd3;o{r?{A+>M_vFKX~@9-RMnjJ&!Ka!Fbyu<;5C`mn3QW65m(m5C)f@RSvM~ zP^=}(zj}KnW{pjKu&DN% zJ^mzZAGPf6`Z3<1ZsJ@c*uYQ4YGCvqK%wJ0@yV$AYNqhoMx6n=df=r>wdLNFIC1Ff zPEmN5(fqTmJjH$-?J;Nb&?Gp2{E-*R)y)=cR`_2LsX5m(JDqOf#HSN1yHDb=S9qA# znH#_F^3)a973fXjj#;o$DliP9FN=n+XKpe|<)03nW1J$E6p5O87{+p#1KRLU;G=WR z=bt%jf6#VN50oUJ@k|1z0AQ^G21EC@3)bBz(5KD-vPBdtyd4vW{)&v@Hp&Cbc_GDT zVj|)JK2>3O=#6JGo$!5B&7#6xh*Y0*cov-@DABX8uvWV{_{gI4H}=Z{iIhs&aeX=8 z4;^m_PhCxI{Egx_-EQb6fuGoRN~EcJnW3ZJIA)7C&%p)U&5%Y1UIPV!$U!Z24G&?9->;JaWSWdTYm)LQAkUlm4ve-k4n z^aDoR=yIP87y zPV|Y=g@R;8!x*U0U8&MViRKG}t3zg{Qh4zuOrjv1KO4o`V7fp~4Q3U3=X@qn0U{~# zW8|k)aPK`&h%y3BbE8(9d6P5E5&8x2Kll9Sn^xmZz<~?~Jn$obd_V)Uk^+Nq17nmr z{57PlWcr^!;YTVlRvJ_x&s7L9P1#8W=H}%zG2YubB}i`pQ*EWj%WlYT8;=@A7ElL9 zRfDd=+1uU_l?e=ZhJ)d_;aad94G_jd=6qZ7l4=zdK^7Y-em5Df$q+iJkXX=lq7)in z+Ex}k748@Fv(B}b$gpN9{-fe|pekclmt(rt6OiP)tz7EqGG(&^7wVzxZ8vOo4lWx@! zXY~@ddV4Z#J|UFTOj^3Bh+Hz*GcCS`H-L|wuWeD`ni6bcU0jKwk%T|Me-1zQIz~@S znjL($61I*2%N6hg=MXCXz?W!NGJhGuIhqS0vtbCLQ2C`v*mlzpgXfcH(lzEAH6CJ) zNX#U3HhO^Nqi0`!o-De5Y;?GtJ8o)vr>+d45$N=)A~9)8Ov|Z(o?hV?SE$R!$_lHk33j}EkyGdxfC=3rJ2#Yw(wEAMCqBI+@& z+!FN4F^f7(;uo||{w@EM-4)nOqLAPL_G3J~?`WC3j%-Khp5)N%lqV*9dKu>_PGUyg z8PQi9L@}Ouo$t)%6i!f%TT0PTS=c4x6c}ezuHG>awW37lMB43Q`H2R75Lg@<0WV`W zV0g70Y1$HrR;Io_h0n(x&i+QA0GjsGM32C-;Fb= zI4zcy=-(Dqz)^;}$HWrKI$U4su+I`S6wv9(HO*Ol@@Y4DHKcwH(O(BYfMY8l;zu(Q z`O8Hpp6;Shh8)A}Hl)QPV15Z|PQ+|$#k20FnM|>=^;*~bHc!#CXKk*oTM+Q;sw*Sg zzxrF&ts4bddt_zBjZ~8?14q&%OjMg@aEP9+`RbYZN&~Kx>C@d4yqv9NfO=(5%dxf0qTZ9bIhi~**^Kl1kvxVOm#=e^~J_EA?z-|DIFY&kDu-o3v3*Z z!#qKQZUku5Fkf;Q+G-r+Foe?B_0Hq2qrVEk-IKck-(~i5;hf7AOFLnl%bxb+#u_gh z6*tZuvm2S+VJ!Y!i6{&d#w?&PK9UCg?)Xm8)W-f1TPGWoyV-V= zPOIKmwLr(p%7U68ceY4YAURQg^(iu{)FLL9F6B$y3l=N60auzU5vv#3XZuo(GuebBri2bg)1R~uGx0WuD!i)M z1l$#%I=X0IVUND)e2a61e0*p;rI0zw8kqN$dG|z2^B`y=-dtst?Yfl|une?x8bA~J zfnlVE?aUMlwphF4%*eIYf%I}KW7taP*tyS--@{{JiHTBHI8E;qW5N7${|jFZd#?=r z$V_fov59q?_USjq*(}u!>Vq(IP<)j_-YWUz<~kgka>$DEBbA7P-A|r7akmNrc64OP z{0<_|M{~5uxGyR{a9A%McgGn_r}4p~7M!sz=cqd~bLSYxHFsq^AJlFwrUk@FS$*oB z&bdW~T&V^lqwPbv%Vf=o`Q zM+%J^t%7pe>m6Xp^H!2rnBA=Er7G$3En%!iA?VGxme=3G;nGP(zNqBbNOVaD4kXwS zEHi%QBjS>{RL_$7uub&C;v1xP?^+A7d#atAuRJz0)if3})o~plzb1ld;Y<8nJ?J)u zk=6XqM^_N+mFid8(PL z5HyQf$R(K>avGSb9r|KSjW)PDwcc6vpO^D6cWe9%xGtVvkzS))rMvhI6uij53`ja% z{qO^r;VjbS=whEw`w7+;bzD3wRz~9`cU+ui^G*&jc&X&XkZgo8GUIXH;`i+8KZ(}I zH}iZn%;{@Z*wztfuo_+>^*5rwiGV2~g;Oqn@2NR|yd9ZZvKx0*tTEHO8}6%Nw>O=( z@A^_NC?MIfIF9m%e8FV-$C<2`q~VH^;1`BY9mpJ+Z-=Jpr*Lh)YEvtY$`_Q)u940< zOnB-P^h-}+Vp(pfx?AV6?75wcL503>Hp(85lPbnwz~FFkR1tdf)WIjMgPCL$F$Q^q zhgid>tX|Pw-6M8#WI6AAz+A82OW&m5IkzT#wFe8Y4sBkcGu|nZ*ZJm$H7il3`?Rt> z3EuRts-|7BOKD&5{FuU1D~NBtDq$YE7j=r!J3sO>=ael`>g(|Ur=kiD;K(MTOYKC# zGW#W5`~vXV=c9@aXzj1-dCGN`48|yC7y}b3AUaEFr^wnSVx+ z64?pXD&u0=vGgyNtp9)js9Cy*k>l5*l1f0__qZaI#$nr?)u1O_H1uETG@sXSG1io%B}Ww{qs zIA}tINty_4fjt~JfnK;A=wU56T}?2-q#xFXWuA?vLuHD=_3iRoK~gYu}zGOG)J0P=uCA?;|v|(wz>6P z*!dKPq%M~+sEdA2cwO4w1up*zdd4<$H}HD`Ear=vP96yjir8-(=_7l5fxPK^UOuJ} zoSvA*be}?l{TK9h+OCi*wcrm%s{&o=l7pIYBFs8O^1otV!sMfVm06V-8Xy_qsiEUz z{<6pC%@b;SZMEd0%E^;y!sKzbMEdQ-b_Md=%Z-~PsTCSM%#UmmtUk_Vg5TMsq$57b z_lfp!4WooJE^mvWu!f2cIOu#~S)74av5iICz~DyneQRNw8!loAE1!jc!83^RyvjB~ zwT$BWbcv}d>}_}&-)gUJ4JGj?zsGle50bJa2d40mOXU?}!#d%Jj^o>?-CN)AQAC`H z5l``XRtZN5{Tfpi+HR@wv|ErQY09pJ7jnQi+zH&j+LsGkJ6Sz6nW#v5pekc|$ujlk zY>o&J1<29mqKT!vhXy)^=bb<)jbWJ4UwA$Vj$@i4z-~FT+t|E+n#z3iqosu#$`)Mb*;l{;)K2G%a97k`LSR_Y zEcPHuP3RR`O<v$ss8Wq#4$>wuH5y$(rK};e2S}-rR@|w+%%kIq1%YJQoa7gk{2RVryGF- z=alQr_#&MRR}`mwxWYo@H8y2Vl6EyblUm;}wu(f0|3MC^TH=%g^QXAD%dN~68e=P; zy+Pve=tv3PA5P4v26EsupFYAlauX2L!j*k&^)WHX&D(89;W)#ci@9P|Rjr^(JB#-z ziQn$2_Cq*U`nA`zWUlgbVxLNFnk?ajh+47lMP5f1UTI47agXD16Mw#Cu-y}Rr0JXY z2ECBTl%I^8s=k(wBd@{767w6#)>SLm^9&~j)+5C@*ICw+Yv5 z%4cc1uW5Ny@OmiSo z*zHJRR|rQ&AQe)gv1kZJkKcz0Df~!ku<+Fuj-V%lz&waJZ>0_pX&ZPxVIo-MB{f-Q zdIpi+x6B-$dF|W?7`A)Ufq51)T8z`&Uh&$nxLz#7fm#Z7;PXbeoOZO}u$9b{a8H$4 zIDg_*r`ck+c^*R;Q;LJg3N5_(&pw%AQ)3DF3fMU8rMsL9}2CkNeTJ3V~*+F(sD9bb)_co>l55*QW2>yB(zgLF*w_q+P@#L>{=*_ ze(Q}1tD+NEai%&5pld?ry!fU6m0=9L z(!Iv&hV9Fi+q~xdFec+F%_sSDs*5p^2n3P}dM53BA9Ld;`Es0XL^ts@2R{Jx*>6cX z2$qKY{C?Wc%Y1x>$9)b3`}RZ1r|inKXGrsUYbLHQn{vMIi06BmFH8Kd$S=n$)B$`dfD2lj z_O0)pEOWm?FK@3Wj-EyE2;oKoYMe3p;gc6C*sT_9>Q&zB1k8!?aQ;Ikkj*}7!C5wfH#D(J;t#{p=HHj#ACXY(?>q{vR|S*?6y5{GstO0{8Tf40&X zU99&XX0>YxcM_W9GJE8@s17C4W&v-lAq4l*mKiougQ}ZU%5TC_a$(~Lxma~5J9f^k zp{>q0;T27|UgoT(=qB=ZlL~&XiL0;8ORcR|919-c^&X5(vrx*Zb)>0_{zll|{6U`W z3cYgkJq$4UB%;jCNdvnmVldPsk>j9cs{mKr6mKC_v0G9- z=m}n2D)42oQYT+V`%}lp_=mL_;e+ugPn_$^Cc1tS1WbkuJ=}!eW3@iCxd~fDN(8ex zlf;cVf-Q+3f};Xv)2#)7XNmDB_)Ij;=gEu%E@P;GBnQ!sjIV{}Jc^N78divki3t*J z+6RU&vdO`?0zBm%ua9O7J~NUANQ9{^b2LdU{jy$2@ZQ>V8yNYa;CBVt_B{xxm5^tb zSjd|YS0jWxqK)@FDAZ9I=7|86|7W3MRlGnV_)BiRFx~eJ->G~V3Gm__@~>djEy6$B zX=e72ls;{csHBt{Q=W_%)6xgu$!?)8KDme{YSB+68Y$?p4c8o3Zm}qsG)PB23)W?8 zM!WKr0~6hFi;Uj2k<Aey|X7JHFma})hFh*@I%kg&;}O~L=zt&3RN z=smJq|8141L4|>Sk*iV~56ow9bb8I~=wbMKzO&L38Zv{~=!5Ci^e zx1IpS!p#oct$%D{V2FGlQ4<00r&95MyY<|@h*_rLROWJTI;p+7rYWnVhFJ=Yy0ca- z*@knoAcCl5~Z|TF&vI|83vJ=9Fk(47&d;>Q^wg0 zwGAQ@n~hHLRfgU%v8c85saYe)Ux7vi1jcC3IKozl@ELP%-I=flyay7aSO;x!-@#9@eZ7#U8Dah@`H;BCvW$78lO)NnI+7u|F z>RsH~6wu$<6bN9|;M_UNX?5{bF$v;kHI%y&s|tlRC2o+Ky)SRT8fe#>XReoxo%g1ec9gUW6gC+BtyU69U<(Z zlp9s)AUF3maC8-fW3gI>VX?YvbTF$2V%z9T?#{M=$YgnIv%p<^?H1tr`d>_C|JtuV zw7R}i*vljF)R$Uns1&UU$~}P#y3QyuP4|yN8V@SeR~S2;J*lFxbV-?S^tvJ^U}0oD zTSELPiv43Dp32V5ty21QC^ePSVSONn&)f6%i7s3%4Sb0agU@BGYPX*_n!H4|Wrn`4 zpPqjA0q)2C5vs}S);gK%RfbpS7>GL+&icD9Tu$AnHm*n^x?FTC736q}9#j$fivXT( zb7)G+kK=}7yO(%vQHqJ>+18Q}Hg5f-vdw$-A7{V&WbZvSk-+C7>gdXCWwPaNlwE>6 zeMP678R4Ex)6sVZp!hbm2``zQlHDVB+E&4xClB}-I{$Vj)kWz=>Lqr@G--C1>M^DRXE9q8{m;2)90+|^wo9lNY=9<8y zQXbVB<$01x%Q8RmI_`T-0Lcos{TemV`NuMN=FZU;L+mt7m9_Swoi7%tR%h}f7{hqV zy1d4nY|6>OEKFp1j0U=6{sDndbyD2z1^`2c@*%nAi&3T$tpJ8zm-Fv|F^p(k<^#Gh zIUQUbmIs6?y`9m;?NRHgGO>-(a!B4!aO-4*G)5;gUf*&I$eZnIW)*;j? zvs7yF@%)M$dpw{3!62;0nP?byY1bgbYf2sX!auhprDuDiCK+OFIL7Mvg0w*dcYTkH zZrWS82A+cJm@6u3otqFLQa6AhxQQ5P)J0DAZAD_91aoqyCZ9nMaU@rRWI?E5{)T4O zBGcYiMdgCgLRFHZDPBY(@)`^Nj$h(r&uoLA41%j1e*|We`on*&wXlm@5qOlQ4HQ5tQ!q3$2ET<=iW6od3=gMX16!Uw}` z_Wq0^(y@iQik_uAb$4by&Yhy33Z;drF8bt4v??Y$CnaLFym(M2nf4+3)tr@`j=9Gc zOGh(2R%=w5N7~O~Iz({(G#=4&9*=^HHbV-_y;I*YA1#lS>`H2!alIBLZ&VG4}#ho!^fI z4D4O#OD^D(_|Jt1{7YI`iJw+nMugr<&)LZOKd~17`^Omn{o}tKP9DDj-lJteib8`K z0_(Q7F3vOp6q#+HKJxAW5~OZ_m-+j{*2ap?)ygteY0+Yq0m*A$NAC)&V#ut6g5M6? zGC-g@uJ(lob@E$DG|OJGkl5?f*xWM{CiRoN%e}FAmwc|TjRtB$tmZG@Yj!%sbRkQW z*%PrBpI!EQ+P_#dsu?v8oD+$l8KhcJ*PwkOp^{BfqW?BjXcK|kQ>()_M;d8Z6F+=o zISbZy}3evk_5PdeQA* zh+h;Fsx1;6ZhQphe>iA|2T(V3ksH@z6Ui0EG>|D^apG8wgmTI94oZ?zS01@_WQMO! zX`_|0WS=Cjl4s7pq`oF+PF76x^)dfC{UbQPjY9LVrZzy8Z2D;qB<}mj>L06EX~ZP- zCvF7B(8kr+13@pwVYQx)$eH3L^lT5)6T}A6pX$m@wNv`d1i;~q!v$6zF0lFCyyYr( z3DPd%toeBxa$;~uckqL$D-q`DWH{7dr9e_60ly=pvmAMqM%27EEZ0orK~x&n*gTeH zH^N8Kqh5O!)V}$Sv`=V5ilmva?f9n4q ziMS8qpy(_+C`l_pBQ7m3R;2V(8W=!(RpEIrg)+1ZtsDb`3Ij_$6H`4?tsJy1j64Gq zL&bM0Nm{C*f#GV_QRWe5mQ@M*K6=`pQkBv)67+1nD-twRy;71=bo@bJz;p8_;Al_p ze1-peoB-WU|GtpGcKPrA{Eryl7yGMq@jp`R?SVf462Z{!e);#6<8xGfZ)mEW8kAJ2y&f24l;>m>uq6kG7c zaRYW=Jn#&J_%{&vnd7qqoWUMwnY5nmKf|wp@|^nmZd!rmwShIdd-eUka(r@u_=k8v z#{oSPBZq%@R)aEex$w=vf#znAKy$M{>sSa367vA_ueG0$k@3TA-mX0D3kKHj2l!tn zk@t1n23Gk2p17r@k%^w=efB(IdwU!EhvC|51mLPbFb!~#O7WWv{LJxb1Act~{>MZ5 zy%qrNf*Cx_(iUKqS%KX^@CQ`~I5#{%{i_QeuHvQw0-kt9LzH)r5{+zNF4BO_w+B9@KZ%$?bL9t!|LB5;J7DL_ zprbrcKrMj@o{4`~5crwnbISf8@jo5#Ft3TcU>^%u!wO)#@03-)uN%#wv z1ICTeQBeMuf&Z~GdH+sGvw=_PPpM}VeUSWDA3WS@9wbc+QDCcCp#HLPyRYUei3eda zKwCG%|1p*HIclEW0^5!OoI?M6N?pwCJ&`?0!4#n zY`I6nnLmiWTbewQzXg;Hn$O~%EpGKF`>%oVheIhS7c>z5J=fIkQSQTG@j=m`QNHid z>yD42|0U)(C?7QH?LD8({ZYQM!b34|LD8V`JnzxAs*-#u2`_fhP> ztr0<^)7=B3{T>DWp56ZCbpaaN?Velg|0ws7NN=E>02-(3p3N2bDEr~4U7%>tXiN9# zk>E$szq{kl*h`>j&;UpG=!TI0js7Ft5hxlo*3dmVDD+YEZ73-K`x`VSK6-;kT$e%FpiZRs zZ10pu*^juCg0exq0q@x;X^*o1-8T^Q7N9Ok_qX_&`RFZv52A-(<)BUx_sF)~N0Fc| z5}@@2bu_q#w&y(x{lo15ln83%eNRj*e4O~O$u}q))ModdO~Z+N8e@Xq0@NDo{uXf6kKW=D+bmEvs5QYoJHO#kHc)%=|FOIQJ$$`Kk2OAue(Wd~ zwBDenX!mfF=11X=o~eP-L61J}=}2u4(*Los{%_^Sf2$bp^!9&UcY3@0_J8OKe{1m{ z*H7N*@$U + * @since 16:48:25 - 20.03.2012 + */ +public class Generator { + // =========================================================== + // Constants + // =========================================================== + + // =========================================================== + // Fields + // =========================================================== + + @Option(required = true, name = "-in-java-root") + private File mInJavaRoot; + + @Option(required = true, name = "-in-javabin-root") + private File mInJavaBinRoot; + + @Option(required = true, name = "-gen-cpp-root") + private File mGenCppRoot; + + @Option(required = true, name = "-gen-java-root") + private File mGenJavaRoot; + + @Option(required = true, name = "-gen-java-class-suffix") + private String mGenJavaClassSuffix; + + @Option(required = true, name = "-gen-method-exclude", multiValued = true) + private List mGenMethodsExclude; + + @Option(required = true, name = "-class", multiValued = true) + private List mFullyQualifiedClassNames; + + private final File mInJavaBinRootClasses; + + // =========================================================== + // Constructors + // =========================================================== + + public static void main(final String[] pArgs) throws Exception { + new Generator(pArgs); + } + + public Generator(final String[] pArgs) throws CmdLineException { + final CmdLineParser parser = new CmdLineParser(this); + parser.parseArgument(pArgs); + + this.mInJavaBinRootClasses = new File(this.mInJavaBinRoot, "classes/"); + + this.checkArguments(); + + this.generateCode(); + } + + private void checkArguments() { + if(!this.mInJavaRoot.exists()) { + throw new IllegalArgumentException("TODO Explain!"); + } + + if(!this.mInJavaBinRoot.exists()) { + throw new IllegalArgumentException("TODO Explain!"); + } + + if(!this.mGenCppRoot.exists()) { + throw new IllegalArgumentException("TODO Explain!"); + } + + if(!this.mGenJavaRoot.exists()) { + throw new IllegalArgumentException("TODO Explain!"); + } + + if(this.mGenJavaClassSuffix.contains(" ")) { + throw new IllegalArgumentException("TODO Explain!"); + } + + for(final String className : this.mFullyQualifiedClassNames) { + final File classSourceFile = this.getInJavaClassSourceFile(className); + if(!classSourceFile.exists()) { + throw new IllegalArgumentException("'" + classSourceFile + "' does not exist!"); + } + final File classFile = this.getInJavaClassFile(className); + if(!classFile.exists()) { + throw new IllegalArgumentException("'" + classFile + "' does not exist!"); + } + } + } + + // =========================================================== + // Getter & Setter + // =========================================================== + + // =========================================================== + // Methods for/from SuperClass/Interfaces + // =========================================================== + + // =========================================================== + // Methods + // =========================================================== + + private File getInJavaClassSourceFile(final String pFullyQualifiedClassName) { + return new File(this.mInJavaRoot, pFullyQualifiedClassName.replace('.', File.separatorChar) + ".java"); + } + + private File getInJavaClassFile(final String pFullyQualifiedClassName) { + return new File(this.mInJavaBinRootClasses, pFullyQualifiedClassName.replace('.', File.separatorChar) + ".class"); + } + + private File getGenJavaClassSourceFile(final String pFullyQualifiedClassName) { + return new File(this.mGenJavaRoot, pFullyQualifiedClassName.replace('.', File.separatorChar) + this.mGenJavaClassSuffix + ".java"); + } + + private File getGenCppClassSourceFile(final String pFullyQualifiedClassName) { + return new File(this.mGenCppRoot, pFullyQualifiedClassName.replace('.', File.separatorChar) + ".cpp"); + } + + private File getGenCppClassHeaderFile(final String pFullyQualifiedClassName) { + return new File(this.mGenCppRoot, pFullyQualifiedClassName.replace('.', File.separatorChar) + ".h"); + } + + private static String getMethodModifiersAsString(final Method pMethod) { + final StringBuilder modifiersBuilder = new StringBuilder(); + + final int modifiers = pMethod.getModifiers(); + if(Modifier.isPublic(modifiers)) { + modifiersBuilder.append("public "); + } else if(Modifier.isProtected(modifiers)) { + modifiersBuilder.append("protetcted "); + } else if(Modifier.isPrivate(modifiers)) { + modifiersBuilder.append("private "); + } + + return modifiersBuilder.toString().trim(); + } + + private void generateCode() { + for(final String className : this.mFullyQualifiedClassNames) { + try { + final URI uri = this.mInJavaBinRootClasses.toURI(); + final ClassLoader classLoader = new URLClassLoader(new URL[]{uri.toURL()}); + + final Class clazz = classLoader.loadClass(className); + + this.parseClass(clazz); + } catch (final Throwable t) { + t.printStackTrace(); + } + } + } + + private void parseClass(final Class pClazz) { + for(final Method method : pClazz.getMethods()) { + if(!this.isGenMethodExcluded(method)) { + final String methodName = method.getName(); + if(methodName.startsWith("get")) { + this.generateGetter(pClazz, method); + } else if(methodName.startsWith("set")) { + this.generateSetter(pClazz, method); + } else if(methodName.startsWith("on")) { + this.generateCallback(pClazz, method); + } else { +// System.err.println("Skipping method: " + pClazz.getSimpleName() + "." + methodName + "(...) !"); + } + } + } + } + + private boolean isGenMethodExcluded(final Method pMethod) { + final String methodName = pMethod.getName(); + for(final String genMethodExclude : this.mGenMethodsExclude) { + if(genMethodExclude.equals(methodName)) { + return true; + } + } + return false; + } + + private void generateCallback(final Class pClazz, final Method pMethod) { + final Class returnType = pMethod.getReturnType(); + + final String methodName = pMethod.getName(); + if((returnType == Boolean.TYPE) || (returnType == Void.TYPE)) { + if(Modifier.isPublic(pMethod.getModifiers())) { + final String visibilityModifier = Generator.getMethodModifiersAsString(pMethod); + final String callbackNativeMethodName = this.generateCallbackNativeMethodName(pMethod); + + System.out.println("@Override"); + System.out.print(visibilityModifier); + System.out.print(" "); + System.out.print(returnType.getSimpleName()); + System.out.print(" "); + System.out.print(methodName); + System.out.println("() {"); // TODO Parameters + + if(returnType == Void.TYPE) { + System.out.print("\tif(!this."); + System.out.print(callbackNativeMethodName); + System.out.println("(this.mAddress)) {"); // TODO Parameters + System.out.print("\t\tsuper."); + System.out.print(methodName); + System.out.println("();"); // TODO Parameters + System.out.println("\t}"); + System.out.println("}"); + } else { + System.out.print("\tif(!this."); + System.out.print(callbackNativeMethodName); + System.out.println("(this.mAddress)) {"); // TODO Parameters + System.out.println("\t\treturn true;"); + System.out.println(methodName); + System.out.println("();"); // TODO Parameters + System.out.println("\t}"); + System.out.println("}"); + } + + System.out.print("private native boolean"); + System.out.print(" "); + System.out.print(callbackNativeMethodName); + System.out.print("(final long pAddress);"); // TODO Parameters + System.out.println(""); + } else { + System.out.println("Skipping callback: " + pClazz.getSimpleName() + "." + methodName + " -> " + returnType); + } + } else { + System.err.println("Skipping callback: " + pClazz.getSimpleName() + "." + methodName + " -> " + returnType); + } + } + + private String generateCallbackNativeMethodName(final Method pMethod) { + final String methodName = pMethod.getName(); + return "native" + Character.toUpperCase(methodName.charAt(0)) + methodName.substring(1, methodName.length()); + } + + private void generateSetter(final Class pClazz, final Method pMethod) { + final Class returnType = pMethod.getReturnType(); + + System.out.println("Generating setter: " + pClazz.getSimpleName() + "." + pMethod.getName() + " -> " + returnType); + } + + private void generateGetter(final Class pClazz, final Method pMethod) { + final Class returnType = pMethod.getReturnType(); + if(returnType == Byte.TYPE || returnType == Short.TYPE || returnType == Integer.TYPE || returnType == Long.TYPE || returnType == Float.TYPE || returnType == Double.TYPE || returnType == Boolean.TYPE) { + System.out.println(pClazz.getSimpleName() + "." + pMethod.getName() + " -> " + returnType); + } + } + + // =========================================================== + // Inner and Anonymous Classes + // =========================================================== +} \ No newline at end of file