From 091b337fe8eb7479037b25f19584758cdff143d2 Mon Sep 17 00:00:00 2001 From: Tom St Denis Date: Mon, 31 Oct 2005 15:32:05 +0000 Subject: [PATCH] added tomsfastmath-0.06 --- changes.txt | 6 ++ demo/test.c | 6 +- doc/tfm.pdf | Bin 124818 -> 124995 bytes fp_montgomery_calc_normalization.c | 1 + fp_montgomery_reduce.c | 11 +++- fp_mul.c | 12 +++- fp_mul_comba.c | 13 +++-- fp_set.c | 2 +- fp_sqr.c | 12 +++- fp_sqr_comba.c | 14 ++--- makefile | 8 +-- makefile.shared | 12 ++-- mtest/mtest.c | 7 ++- pre_gen/mpi.c | 90 ++++++++++++++++++++--------- s_fp_add.c | 4 +- s_fp_sub.c | 21 ++++--- tfm.dvi | Bin 51612 -> 51616 bytes tfm.h | 9 ++- tfm.log | 4 +- tfm.tex | 2 +- 20 files changed, 161 insertions(+), 73 deletions(-) diff --git a/changes.txt b/changes.txt index 525e2d4..4fab275 100644 --- a/changes.txt +++ b/changes.txt @@ -1,3 +1,9 @@ +October 31st, 2005 +0.06 -- fixed fp_mul() and fp_sqr() to trim digits when overflows would occur. Produces numerically inprecise results + (e.g. the lower FP_SIZE digits) but shouldn't segfault at least ;-) + -- Updated the combas so you can turn on and off specific unrolled loops at build time + -- Michael Heyman reported a bug in s_fp_sub() that was pretty substantial and a bug in fp_montgomery_calc_normalization(). Fixed. + August 1st, 2005 0.05 -- Quick fix to the fp_invmod.c code to let it handle even moduli [required for LTC] -- Added makefile.shared to make shared objects [required for LTC] diff --git a/demo/test.c b/demo/test.c index bf1c288..d79759c 100644 --- a/demo/test.c +++ b/demo/test.c @@ -283,7 +283,8 @@ sqrtime: //#else monttime: printf("Montgomery:\n"); - for (t = 2; t <= (FP_SIZE/2)-2; t += 2) { + for (t = 2; t <= (FP_SIZE/2)-4; t += 2) { +// printf("%5lu-bit: %9llu\n", t * DIGIT_BIT, t2); fp_zero(&a); for (ix = 0; ix < t; ix++) { a.dp[ix] = ix | 1; @@ -343,6 +344,9 @@ expttime: return; testing: + fp_zero(&b); fp_zero(&c); fp_zero(&d); fp_zero(&e); fp_zero(&f); fp_zero(&a); + + div2_n = mul2_n = inv_n = expt_n = lcm_n = gcd_n = add_n = sub_n = mul_n = div_n = sqr_n = mul2d_n = div2d_n = cnt = add_d_n = sub_d_n= mul_d_n = 0; diff --git a/doc/tfm.pdf b/doc/tfm.pdf index a85837d8677169a4a772e51610bc93ac1d040591..1f6b759183b48335fa7832777872a97549bb70d7 100644 GIT binary patch delta 50840 zcmV()K;OTT&j-WM2ard9kj+lRFc5_Aeu_O7i7Z}w{dYqMxK#)+50Iv%6g90%0?*Id zO(Gwxd^4Hd@dY#z=yImJ>(xcwy)of;-5zCi!8faAj0IFDZ4k)Lo+mNF_~(uO9y0Y#4#^jizIZM z+{E6;%D4>k6MNj94ntkS3s2rdLrd-`)yHjd-0%DLaKvtkWt2gUiO5`yFWq?F)P5w& zQu_K3lIMMx2U@xntuV?%q&PvNwJY=~!>cOiA4XwrLX%Me8Ui;svuy!SvIap$T0}@q zv%<3~0)Gc|RMpnLVaVJ|hm2Pe!8H`0?ynM~O;lithBq%#Rg zAcQ7e5CwT6q5>*{(w?Fy%G)=dyyt&z5>Wr=^S$-{KeJZWn#s9y&)NI?zWwceW5;yw z#@N}}^_jP5>%t`~$1Yg8cJd_YgCXJ|J8^I~@qc-lCo%o3ZcDLm96ai-gE(aXX7s~} z{TZ2^-J<1N7X*jIgzfP4ix@I$!RR5AXU&>1WL}_m*bYzkpdl;WBmBGr-6QCmfFbLG zJ$HCV#7r16FCbvZTIq`LA#1(Ey~B2Sdv)A&L2zJ5WQ2Fvkd?t+-eExuqgu0KUQCeZ z<`b3kV}rf6ys;p}d+Vx&p+2i$50m}29ewy&|@ihkeppVmKPz~TX4Im~yHF}NmwXAD+9Kk@mz=RXp{gly$tW-J{!h zvq~mj$9z6au6iMX3?K`En;Th+i3tC+{5J-KFoPa@@gf9clmTz}$jE&D=@wAsNIGI1*2=Bv*i zHYI}J=pXmu@DBydR=Oe^3Ld&9RtIegm-=DMZ zH8Nl#VMu@S%y*-Z!{_R;cV1pHXj60=wN40{uq??3xQ$Z};B=hvdF#pC^LpP#Wd{n{ z>}c%U*2=^e=@;Yk=whwkQ-9mwWMjSb&bl!0gl*tSVZ^rRt&uc#$vRzsnu^HDY)8W5 z2AwHAhh_i@tfdDG^mu;S`QQx!u+rc|b5PEnhVr!XU|d0Lj$|fDPlyV1c@dl_Kn$(M z255%U(4?i8xfo(=pbTtD4p4`n)2+T75CX39^Jryvk&G!9H{6XVO8<%gLL1fCiDg1--OBdiH?#qdvlV^qYZcle#$tr$&Lg2x2bh>l< zuV2pkn8*s0E6H`94Cqt=tj5*scdZkaEZj6}L>GXdN_@s@2VxJI_?-9xpPLUx$lwZ7 zAx0oq+c%t}r6v{6g z+EZVpL`!$#&Qe*?sbT}SxkkEyEBIE2?+x9rJp=op*?6w*kj1vQ;S@ANYrM@hKbA%! zhI>jCymCu_CjL$Qf^UB3?TmU!rvh}I`Vb2FHO5d$r}mdbN2%0_8nu$lA{Md~-%QJ+ z0nc=@RAn5ZD&u16KsumfO~^%-h;>S1a8{%4%*$GL|!y2jR~MF0?Fo2m`-#s&~b;BnV z-@ShP7I{>R`Hpm-?Y=!SN~w5ou?swxv(?*wmF<2{gnN(Sgs~cG;CN@uIwk&9_Ngcb zT5x^`{!=beVqqL_HG$>34G$>xxrrm_@8^CRgDmzvgtGFyRAYLIPMxY#`i+b99xQs%ZllC^o`Js#c2Sel?^WHA{}rV$U~juXfvT!hPTEKWsNf!rit@ngwz zUttjz;EV6y_!5UNB)O!FJU?Tiv|;jpm8uJvw?xH5S!3HA{tui-H#xqF0*=DfxRwmU z$z+a_JoEPKnvyiE_R+&ROmtLq#NOX-fBEAMHP=dl3^5H;&HYddn5DN!*54@MV?oZ$G<5N zPvoP~^bswUd*Nef{IyPLv6RP(&KTd8<5U>B)fuR1nELC@&e^bGkK{AAR>|6ibok6L zG9h9^x%@PE zSW#oBFRoJN6jao<0QV(-jEo4;`^SeVQs(QDhS-c`GliSaQz z!H-k4K|rCmEoxP)zZ-aR3%*;AeX-|{$FDUe9N%0kY^+@aZ&0g$=mu#9|BPKWsD})w zC^d7aAiwZ0E;@el@ZRQwCgt1mTi6|@Z&38+1yX zn8)vk_SeuzY)(B~TxV(6cgpI%CSO9H;aq=;ydyR|+=0CHRXAK~a@t@CNCF;KOxga{Oq6nJ_n-&XOZ zatEl0coXC3uYro&=!F}3tLF1KSio)e^PD}y_sq>`L0hQLNCqwu(qfdvk&T74{7i$P zyj(CE!B|#)(EX6!LdBOo{Fe_;2JTKOQ0}bv%5l%(6j#^fFDX3xTx0eATi7jga)41V zq~ubpaD|Y6S+4w^l}cs04w4cDttL4|qxG)!fOyKWzTQjL`IQ9ML@Mh;YtXwJUTNHwTAAT4|zATJZ!mv$s%> z_H!P6Q$0`-ixK#k#{w2AXdht8GuD9_xI5TgLta>a6#g<9rF@vkKd8L+4qW5DA@VQC zNP+z24@B$to~KK+FpE_jLsniwjep~gy}s0FErDg=x!-%g?`idJ;I5T^UYiB^)J~+N zQJ60DiwT3Rka|4fe&VN&F&DNrtS^^Zg#L%9Ur8}zm`!}a=0Ho|OSk>&B`V16l>ve&&{doy|Y5P;p-Z80sl*?Jg5z?I~Qi7L}t&JUi zWlO`kzulcoMw*4++7(P@e`|;Q>o=SlMeWcVGeXk~)_3yPwo_x%Tn};Y`?i zc3z;j&l0#>N}E?ZUSbnfRqXTFq4n|W)Gpu0*Tpw@GDL#Kd%0>Vmewc9t~Z=AR#Kze z*qQ95n#_Gl#rGNFUcNre5*!d25*lI+wbfQx>bv@4YWXJBIzV;k1$_U)Mw*yGcGZ?W6MrJv6*clNmWt_}Be%ui0-mWgfR4}4d{ zCim0Mqg{tL%>C`Cgd~y^n8^O=ntxYpu^3N~;y+*Wn+C_e)!|y_q#;@ybe*5f;)ti+ z4K0kwl99g_yG87@ZHwp6&>T4-;LWbTTm$VCB^krchDkW?t%J4i)(M?ng}7UPOTH4r zI{*RqPW-ftLgHuiksvWny6|eQq!dF~*OckY(<7iTR4C3c7eNhI9b*m-j)@B0^j7eh zkKes;S5UOKP3T@1UKtb=9v&1_8D3XcSt;E`>IEp~W?67vvmI1n&TY)0_F+QXEWRD( z(H%y$2&We};8@z@S3{o8q5&0uL~t~QJ0M}0;29v_Z~6fa)7K-|Pvhgs4uhgSQe#b( zq^K+-pGs0Wtz1yNvxrRZRPi0uA$N9U%xxJ)N;x&r{OI=x1#jGMZ?p7SyVW<7-OYA zs9B#M0nw16(`ZyLkQ_(S9qZMFRNjqF)%&1~ibtS+oi5_nS=4#RP!|T^2!f7T3C8q7 zD1?mMjJz&8OM}POVJKDii!yA%5?*gi&jJ%Z(WJM=(06Lkr6*1zxsIc-UQ?i#TJD;CV5WBn(r?yiod$=;do;#7F+6F$SU#{CFzmUoIiQ@$0pj$IR`R_)Xr$`sIDM}wMT2WP-wXbVe1kT+Nwh6X# zFFy!7fAMh3k#ZpoXYwQ2aSL|1ZuMw9cDnTj&dQVG$%g|SXMdAy%564J8vp%nlH4Kj zjsIW6-U(mM%XfV`g8uk_ji5VAl*%lQ=$OG>yNKmC1}cu?T$2yW9R$B4 z^4XIx%VP#H?H-O~nvAE#AtSxO2c6s798D>vsN* zMcGDER)&yY(tPSOI002IIWZ+ZMlaaHDSoEHx+>f~+{-7_g{FAz$=J6|^k~$UHI!CW zR>oHCOz=x{nSN;uc1P}qZ%`qL5PnF7*Gy?=FT*O)#-s9Ld2U8F6gU;CisRCB5FILn z$Ev(nQ=BS3QI(NenySR1ONnx6bc!Yo zlALr9+92SN@8ij9_VIvWbi~j2N*1%Qf79{GR`m|65bp`D0hRIAlHIxc&TW5lCV7SoB0LFI zDt;zrb=hVe9N8nRRg=_T>@01*dl{TTw z2R74YXB%vZ^$lF*LhT#ZIRuz#!9y*0*ldRvTV&#RjODRjUQ`Zdb2KC+MXQF zPV`Wcia#rBqKqXDDRFxG15P>$=mg*tH%L#kmw$Jw<=x#)$q{D3L#GagIBsWkVtGYH z$?mt;x6YeDdTl0l0+Ii2TJ}eGz^ffOu!!$nEud%aeNQHah>!VPsj6EzqLGunpexjr zb7AtG#D9a@QBz6o`ND$itZTHEbLc5o#l1@GB6m(EgLV=nyg3&!{b9*ZX#e$%zcr~2dAADDmbkp-E!;?V zzBcwq;F|%p(MJN|4Q}4tO|zyic=yKH`U^LYNQ7LuVKuHgYX_4B&?0|AV&}4Z=ygXD zUm0HJ{aKPY++|Jd2IHO(;b2Z(sV%%XGA=O1Yso2(o3wECrM}glk`t|jeSgaOtud}{ zf`@B_JIv+CfUibl_jmTUo~@vo_ZlAuE)Z}&rWuaGQ8)!hEX_5?_7*nMo~B_(scV6M z#tLxZX6_g>^+}ih*baXl%W(Zk{tsHJ&IK6UwMOjw&x^>lKj_6oEiqYsUMFeyK$*C# z&6&@n#uSWPeoC$?L6e-U706%zF+V+#cF{T~Rc=atQAS>#NxCr7+UD5tI3wqVOmxF5 zJbaq|sozH~-^?m;hgC2?)MJAGqV(DD3e3%zynoJtm#;)g=lp-fa`5Z=OPSZ;I!AoT z72XS0SH*mzItTaQZMXmzb550Gua9%9paCw%l#j|=2XkNrZ4wr%mdB4<8|VsBd8CAB zwjHF*9r%$9kF-6*SAsD@Sh;*E_)C7wOuyHPE!Cz|OzJwO~`m&>i^Jgb( z^P9WopXk(r6R3Yow~d#zEx=Ft;wP%t{*Am#<%*T!*JLB#rHAp#_P@&GpXi^oo2&TK zPv29U@e^*pE2BkvJ|8Ae4@}#h9G{lDlr}~jSt5V@2q&R%?i4(9LiyxRNnc_=Z{n17 z$G}wDSg^l3rrIx62YRhg@!qNCv%uXw@bauzw!FH2rILTFCp%Trk&%diIkhIanWv6GP zt7gt2Jy%t_9%wA9sg`Qwe{)#}%Pu2_BPy`x_wQ1sVfUAQz*p|gc{ET#7(9SK@t@b6 z{ea@+^QnJtjeT*>syREY(RDVnweFZR#0$2g7Ymz!+kZN8a*}RM=yqk`wjJ6qeX2fO zmjWoCUx@U z#YC}M*i5=55gE11v-3%x)5QK9>33^c9&lM1rfg|?cXj4Xc>I|KFWr5gwr%$;kC#{+sU)Vt+W)`!D6q~ zaWQ`}G0LS2A}3PebEO7PT~G+QWrE`GEoAy1sD;EIe9k7in;o$H>cYzd72nt5EFR0J zN&mMnPuL}mS5D9du@z2sj90pzihTKyRou6Y6t_`=WyPgvrAZ|@*S^CZtDYrVIcmio z_P+}q&Zn_!MH3I#RM=-d+ONWX)89)5POX2@sHvco$0)xYb%sm@;tgbu4_Qe16Nki3 zq^dJCS$TKfN5$L1aqL!rGWbI3@fLS>NH)xr9;Knr#rt2%#P!nHleJNYz{zjFdF0R^ zK22-#+p})@qYdzy*gos9W^A_O7lOEJB{f7bY{kL{uX_s4g_~pL0D;v{;YXmP{N;pJ8WI+iyiCxjS#?3eE=Wh0mCE3l{{b$eF^UlnfnKR#g z@BZ$uT#^`NLXadm&dJ$vt%uWWJ6CrrYvT{*hH0e1%*60Ve?cTJ`CIHrj%kP4xR41b z>wV-r9?gG`5Rl|LXK%Zh*wpyQ@CdQ_Ogl?+tL4j=n%hK&#zzJRip*UD#Sx*=fnxqk zl(|PtaAc@Bb)LCRRFt{9@kD~TduT#vd{Su0tDD-zM8_tIL*va|V?sjXMFc@i6$SGj zH`vFACx|0Ge>|fCql4Bgo-=QOmGwe`*g)75pAl<`b;JTZvMYNuB z&V*hLxlu1JojiM1vDuBqng8XVTOb~!t@OLUkUevcWowcCyW?6C29e*80R6)tWHQ4b zD4{;Bf3ZQO&|g@4cm;lE-bZ)>p7hufnW8DJXlzAA9!PSel1vGgXzvy61+?3WV`vUq zacgg1*NOCy29B@&P#&ADHCU^Sm0Je|27k1TL5$^dOyjY0ER6MjoQ;HN^zaijfyLXf z9}@Z zUyUMrj5kuA6QE-wtC_c8#ZgK6fDSjHG5v`po`fepvP33>2l`YBZXJazDoyp2LvHyI z&hS^t>E%@hQbCfDm=F;p+5&VOCMwbAm#cfUyEt`QPg@_Hg$}>U9o1=21gXEl7pp>c zf3LdCJu5IwMCpuH2C8RX5AirGT=+454^R2aEF?fZDkAm3}x7&IMUeMNNGS)!^ld0I1dcr4+JBd(0v94<2lG0+v0WD z5--Am*dNWtR>%%HpqXeP@@4T2e3zMyf2TY~6{rYtLl2*#X^U|IuEA#WXYqqEd3^2| z=toTT8EeK;rF?pe{Tr* zav98U&%Nt%8Awam+`=9C5KD_1vg*|88eMB_OTZG*{FHoFiUdMD^*`{vMRo#OK?mPJ z1JB}Q%C@Mg^9|8(payxJ_+Eo#8glm~WOu3i2oE@NWDZ63Ko!t;FI>E?%kA3U&UN=3 zf>J0kzKXI73$h`L&Zx|+lPgQLf69!Oh)p5e(=*uUhKL%TURLWJR=IbCRpxM+>8T zW){M;1|{sR*KsO+Yo!M0+b~0%3PEYHT#6_7w+hp1rc2l zTzky!yn{I>vT7tv$;$MaM2MjS;9pj64d9y>4msd}_bP2L(nW?BJSX_&zv3q7_#E{Q_v-0;~8By{pE+(u!+Rq?TN zyUt!_zfAO`>_mYf4)CC!<*ST;8Nic=?m-iWdHx8Ht>GopoYW8#f0vjP8{L@F*rsgO zvY5qgyw=ZGK;!F_JFZEO;WLUD{B4NAie>v}+-S88%^EiZ4mY~?p z8T1r1$tvnf|fInUluE5r`R`?e55!0Smh_4xOVlels5MOG3!}ka;#8&8omS2PC zjp3_NnyTr$)4UyigMtPIwF1Lrq-OZw>GAK5X!le21HIhE%SoilXlSgjZ`>OW>0HCU z!^$3@51tCOf8v5E>?>Kl6jsqI@5i6{s<-E`iY@VJ3*Qg4reE=A?qs3|<(`n65emm@ zS*Ih6rR}x=@1V}ZXbM_Y-6`XVBbfj5ntw@EW3Y|{{w`RTLEwfRAsN@bv@ZX*ko_Ox z_}{{8@ElSO@}~K_Aw1GjCGwWOlJbVI{h{Z1(ooNae-VQw&V7Ofo<8w`k(|tn;Ta*T zs%z{#pg#h1>x)e6xjs8EA)HH&3Xa+WUJ%idru#y}yI}pBl;P(#Mr|-RzLTIuo$z4GIQ1cWKC?DIP ziFht{f50=b752d!kr`fzHn*RZscvw)<;b)HYH4{s>|pbS>AWP;bFBhq?y%#HYdvO= zHJ@P~$O6qkOVI~tjX9QD=g(UoRj{X(b2`XC3P>}=B7eWQAfRnF-a#ZH`|n)cb0~33 z8>dJDDWuS^S(v0l)NSOhM%=Y3HF;ErcH9)8e@TX~nf)0ZQa%lk>E$6sNl|HjQ4tj8 za2^R;C2`;gKI#;C-p(Sv5S3OD>c8Gx5Vm7wq@_3#y&U(&EE2~`jBF82<0#L z7{A2uka&Oouv2g9mC~XzX(`b4y2{-xDRuFwaXBGNE*hiX^ywos5smru>4)zA@iB4S ze`}>-FAZ8VOx{)t(56D>Y*KfKC?zp2R+ZRVTUB0K#_rr%48=gpAfv!JZiBxsS16J4 z4@?)77L-;DUPaVfn;a%#Sb$uPFgmd&UX(13k8Vn7&}lU->>E7PBU4{3C~|%c^F&t| z7%I3KJ{UA)r}c)7U@r<=7UPob3YdUdf91BF_T8&5B^-qxpzo-@zw?^x3G~xA0AFRc zgOf4^ky)ozrH8Yc-;V=eSM^sl?LX+0v zl>>8Wc$079hJRG&6~C8-y*J_usT1SmFwLwj4V&cT6HFfNFHy^G2)<-9uK4v=8 z&iB{7^PO|P^Lv~_Q~rJwP1BGG=C|?|+9}oJ@gfcDT*4O z8>v!iBY*PJ^L23r@!2UkvqRpYsFhR*6-`A@vD8#5j#@^=Q>&?;Q){T%R3x>CilTl* zjiG|5VA2)EPzE}f-a_B?TjbX%StYsRAMCI5zZZ}Ya8)`|x{q1Se9Sy%wNL5kUyL37 zl>X~&Ik-i+oxbWpX&#CAGjxvYFS(0H%ukI{Y=7m2M^ZeZI6%W(s3~73!|jaHxN`-s zVOlJ`;3nrdw3t{ov%*-}Ekkk4*Mrxt-?T1U$K$g9baV7mNlYLGZf~HQ9%>SWixQ;t z&fv-$1#*tXq`z*)6Mb0tU=SwmVPP$~`88d?ne+jBAv6Ne3 zl7AH}Rh6}<#5-Z4dH6GFVlhOJz*fsyXd`C;T77{L#c*6E9$}8x!8P8E$1?>W2<2OG z_VC?_1dL0L;xdOg%TB{()OJ}ShNDal1&90*)0hsKii7dE2h$LZ=m!tcI36eBWNtku z_UCtNk5>#rFC4R+aUX9w)P1m@bbCbGl7HU59+p8iq?uN#*Qqun7b<}zRqB$|We%ik zM2nvl+CfkcLI$p~5-d>5ei#2Gmc9}C79N8qd^7C{^6!1(tS$%B4#8wF^17vQ8EYUJ zl3Uch+5K<7w0t4(1nV-BQ2oduz&EJ{cXRxb$h)mr#-zo#eW)CzoY>! zvhId~M}MxGnq}e5J9i7afUSXDdt^Uw5>g%hCo_d9mSq}v0U;?4{5!zI|1&rF=qAGD z-6*VyzUM)_LxQG>Z*xfQ#&Q&?mzt)e&zx;yi|*kLrVy|{VlQ-@zsaA|$1)M>4Jo;b zrmy(tEfADnfBAlNQe42jRDZ*ACNy!;!mu5u&hY3CgGc$=I0~&`RP#haOj5B$(lo?D9{?7R z&24ByA>bfFvkH4FzySH|a5uB5qIeFk(n$Nvr_HC}6r2|N1lFx$=6_Vwb;-nT2AZMX zQE4@|kw`Qh8gp%U?sLt2dFoM_Q=IIkK}?f~lhFgNrrCbi(|?Gtez@|4?%A1f!d9D+vP&E%PqKnrT(W}PqM2soiW8@)M9O|05# zHq}54m@QR}#Cm?mqJOC(x0jS9o_Oe#h=-A$!>`Vo{nKA=Xg#Llv-*r5K_@Ftd@+QW zT+?cjH5*n#t}pX*>x^gc6hyy;STx}iH0fJj9Lo&$SGAGr`KA=|5G|Pj`M&EzuwF|P zKzUtbee;x1*DpcSz00|OD>N68Pwzj<$2a%vsL0-Q<5Mz{E`Op_&uyZhVN}n-73fUq z-gqdvHUrrCF_FtQ9xzqe_F4D43hTBQcM3v<%z5doqZ8QE14*H>BqrLlxGXm3gLHiY zDA`}!*Leo|+s`%gmZbfPUSOS`hEHXK`WPlkUA8?H&h+xDTew+~NpT5jhff@^dCni? z`&tJo4_XM25`X{TcYd&%e1i1OA%;3#`WX&fx_(2vo)@HsJJF6-;hWyX|%GqyBYvPM?AYI*D+ECM4*>NeMD*^}N zAUqapunPsO9Qys&_t2{-Xzo{UMkOkiXk{n}4{~@6pnnez-{^S!V9zOtI3#nVK`JCb zJSYkjy40-v4ZgkdOagakxFbPxdpOr-d%@;{BCWQm$l2tyyZ9H6vwJ5!+d9=`z0E;4 zIk+f1P8r&GJ=(Pf)wu^f|A9Qz<5${p&4YS3V--mgy9OfCK3ospBm`>hDDlf3( z=6a;EN^x=x;~wD&QGWvn#fgBE(drxoF*!Lhlkw^?21Q0h zT2n={DC;f)e_}y#M5(AKA~J)784~6x*T9^P92NdhE&^}YA61xxSE$v$WA{e63X`yit1`cWd0Xvhk;CISSv`84!Pk2R~i{-+>7pv`C#_*cq!k}R&*#XTQe@cl(BDd9BmqqSPlm-U|#f+W2 z?DerT7cBVO*d^fs(qMnTh_Rl2F+l<0elg@BZ0yEJ|KNa_#OY&~goTaWVERV%*bM>E z0n)gD-IiUKMTYNfO~#5+nRQmnKE--m+%d-T@z@W$8>FZa06P4QuV3E{iEr)-_NZQAxX#!Vl;!}ZO#W+X41`SvXNqS=#Q zr>Hlmag-0WmRe3tr^ZuTsddx}%9VPPdW~97xlwOXGpGsF25KcWlbT3vq~4`wQIjYy z%AJ}`O{O+c9@HFaGqsAEOHHA?snygx>OIPne_Bdyq1I5#sQJ`DY9Tdwa%bnVcJp=g+F*n{EH;YS@8IbI$SKH~3e^2os>-yK;p^173~(_*Ipr;|>fI_Eog zIDhN%s!Np1xlt=em5usl^rX?nW7sjf#{BxqqE}Qx-4LM;41(Ms`qYTBjbh{`oMtc4 zmHVNkH40=ro<}D~Ls)ntX!wq9`5x<&e=vwXP+Z!^cS*FM3l4(#IL-}cOU(9uGa%yw z5eOk-WE38-8HeSnFo=L;$OyoLyLHZTh=FWHT6T6iq%h%4P|f{9*EEnV;~|i*|IHrF zqwB}p2gZ}F8lZ;%g|2RbmWrHxsYQHtK`h9C!OMhb_GA2sJ$9zamN>y695jfke;yLb59 z`O3((9FE^DF|XTiTK9(SIvM@*d&d{P>l>VqVA?m^fIc;dz=)!|#KImVV)YS_ot&RXO%+*RF;%f7O1~O>hkl9sym8)>6hh_ zHXXFKNC_x6(z_s6o)N`Ze@+-@K)#0IH;qVU+)5%Ypg9D?Xc+xvooC3dQ1>bPYc$#v z$zHEJ@c~?A?yh-=#T<^K5$CKe-M7VBmrU%wu4T~ zHKBY7zJWXA;+1)j?0xK3i5&qiWD5QPzsrvHTP zu-){@co=s4ZW`)``hE938qQ%qJeOVKdH?A*H*Va%bKPUcbkD_0c(VyF1G;HI_J-la zj+(?qhW$ue|MLzY9!%|0y*z1sOi@1eZhYQ=q%c?vpHl})y~maG<6zw#6urX z`Tf$d{mptFh1xBbZ1kPKX!+XPUEkljaqD{LMlY_flAr)`;&mhkIxDZnThLJl4g5Hq zCO_wj=BMji8tQs7I^IfB9gQaA%l3GcRMPhj4YXR4qE&R?e^xgxp*RA|4Z~FJyMxilB7}C1Fu5lUo;XiUv)h`5DjS= zF%Y5PvtD+5@AyNr zqB7u5S?$*Ur?Nv^AUEa;8bQ3ggKBS!g@tG%tE+_$e?+hP5s$2-~EkuQ7eeDmS7-1Q~mT{lt0@`iMox;`G=P zd&cd>f5-7L-CpF0R@d!E$2hzTm$0)zs!KhadJZ1JMYsw#%T85XZY_TZ_n|#Q<5j+m z_^}2&VR_o7w2e`5v%u=WH6yAqimwQW?TMj=uj`h_(tS^87mb|0Mq|-jG-ocFf?aql z=|0U0^6w?c{t|Y<4DP?4#87OL<9p_#*OQ}re+gq*i*HE*+}`G0O&bWB>?WAG_w5wa z@8+qFdL55LeQb#FmKD`Lv>QU~2A>5BmU!HH{N$GL^ZO?kx%agsG>kBFobiW8Vx%T5 z5)H9wdP7drpM3%?TyE*^c5Qu?{>odB{MMrFbGXfuEZxUMgrD)%iL}gAG|jFy(3++m ze~~cJLP)gQfbtBY+eV}yLc$d(Ohp(mcOO4}y5upI@Hoc$^_FgVxJ}$xtFdreklX!E ze}CL<^X8pyQwbF<#$yd=hhaD|?qob^+(roT#}5Y9#)iQ6>XANtxM8itu^YuAC&?~I zZa)ZhwcOL5kCS(C*a_`Gip_K%?Cwg;e`T<{zs)&mo0g6S81C&!aWiq^2-Uj7~p z=2X$u@r}ULX{+{YQ;*GmZ&l)IFW%93&|(VrvlgHS_^PY*2~}EM#$vOENxXuVe0cE+ z+J0p?e3W345AT1p{*II5KhuyLEoV3Roj(8Ji4z}OIJRx`h8;V+`I$j%f#PsXeLR~gSYd^WkI#ufq7&3;(0r(Lo^Az zBc{@lGh)L>K~SZ%GX#jfXW!e;r4;+s%>-rzoe3$BnQvlb zYGqobQVaP|m|t1Ak3j?RHFnbCf8!@=O557Bd}CE9+y$l!*~8o&i+4^kW1ZLi)0U-g zVV>1gL#;agP+A?IS&?`!tKvjWO?&AB^#%9@PBDL_a77!a$~bk(`APY?C8=dlMaVG% zt!G2&nGml}zmRbbZo&n)1fT9ZQ*p6Q`vkf`pH${i`W|s>6X1Y&d8};feXcdI#xQG=_dDaK@kzRPYku470-VK({=^2H?}J zZ1bjjyZdmmYpNm4;NJEcn6(gts)bxk^Ds_ zbj$yXj{SeASW9Q!(i8pRH;l;L=x5XtdMBe9L_*x5pPX2?)yH@Je++&Zjl4qHk2`7& zaFqG#orib;hgaD4Y0~Zcp8l*DLTJacpV76@0&S6XaS#iB-~r*aq1EB~|z4zdFR}JWbLX>eyoYHdx@tIi!A2jw!+6T{ue*pua06A{2)JP~-ih|J z`s^>_VGiTHbKSy7pThnAoZtT3W6Bz3wX!C(2esJQ4BI+&Wm_qCB;1gEoxqm4^L5wt zz+6mx$(IGP})m zO$}WL2iiDP|5v`?QhKT}`tH%A`}7@L-{4AO4qZJ_e}696^+kOa-IqT!vil7hk{}=| zXm3CmnV%ydHD8ubMvi2wToOp2jQku)~(Aquj1}{L*o?xPSFDmqt|H-z0=Goy>}mB{8z}K3p?0H#`YqqzjY6PTY>uFB{b0VW11F4!UR^)5)X;Mgj!Id zgMULjzA6cf>)GOK3m)SjkVh*ej-6dcPamzXO!DBcT$0e+t?&P7(f?eMBhdn)XNB)d z*&WHr4o235Kq!REqhot2s}3RaeZ-f&_YtmwGmAW4A}rK&Jj9W{r)}gMJN=H55qI=o zCS1J5?ylr7BQe=2Q-=;4(JE7Jlwu*0aDS_;H((2GBm=zzf0el=%Uc=gqNKC0Z$myx zbw+&*WDo+xLpmYAHoPszlMn!kl(ktGyoIs0mxT*0>C!_fucGgCYm0&!2-IClK@0n| z1;rOoO5qVgghJm7I8mi2mNr2#`Md#&+D*}TtP@6&Mn3eO$x9WG1upR^iL!*U?20TNiPm9iU20ZJHpIK+ zLc|dc4ZWj?Qo2KgO9q4-H~Xiqg zDorPvZ+J1@)EUIW+82XaE9>0pkbkUu(WaqXrg@qs!Z&y*&t0c{~n{r^}%|CVKM&+0qN64* zefRJ?F^UkbvjwMvOHxRQjekfh*inIZIICm@ae8Qkq8e2-gEpX@|9ypt@x)Q`D@LDP zWjn%~LIb2>VS8Gl+736iwwjx~4vo8oCf-8hOri7<3;odF*uPsd;!f9~iS}o#F9PUF zBq{2M-X{Z>FvyKirpoYO=ht5Pc9GS)Pv}HE(cZ`U;(a<9J3uZdnSaE}BwcGkb9p{j zg@)Mw`jYo}B>IN^)okH46Nsku#&X(!3?=ayx%c@l*!|UceA(`00kNV=@O|OH7FVeN zN|+j1b$o1=EG3)6U;N80D_IGU>5`~P($*DgD%6}6Rpw2#|8diG-F9rsrho)lW_F%D z3zE%%tNZ=}vimr^Eq@>|Dl#~-I;gWx2AkB^`-El@rpu}|6Oa?`hwUbrZw=S{f}K!5 zWcLh>LZr+F;S%<34|0OZXrl3_dv|ZWjwj*C9(cgpycxLYtm#LD-Z8h+YL-CcNI^-> z;ji=Cfl+JK4TPnME3hbKb`r15hAj}u%#=VN$O4lCWm}X){C{W1XGe!ODEIMAN+in5 z-^5^7350|12NB0&E@qtphIIYbW~nNJ$72fM5VSIAt^^wMj(W8mYt$T2HJadfNhj>k zT9UU;NM_55D@sT$t4}CT&d5_{$T|EF`)6dQWI}=qq?DxX%R*n_0O!h#0ww9cRkh{y zwd8FvkB=aCdw+{Y7-IN^6q8qoTi1K;S`)HUQ**e0dERLWiezP+g192B$p0VWz2)OnT5l+&=jLhsDkTa&g9)ED?iKQ4c_1q66L~=NTzI^Wc z`^S%5yL9S0e9oXj6Yt|8c)-F1^Y-Y|s&)0%`tqELjABl6>U8TxU><(DefA2U_3mCT z%jsnn^l;LA2z$7Q6#w3upqz4@#BP;n$%QB}prZ%;zv_Mr_X#qUSzhe3W z4Ro#TLVJz=r0xG8h|weV(jonaaDlnE^b;(>gMU_Rbqi^fYfZta%-)w*z_qsCHmS3l zX9Io1WkGvm`Oqk-B2cj*R|XKlIR0uX#oQ_Sr*rSFU$b%b4F5%Cr=$3yqGB~@nT71Nfa8m{c+IQ z&36}HiUvlS9iJ&H%PPv_(R?h@;JM%dllEX9kDeh*&&&ZClc|nxY(_hgGb-hVq?HM% z3~wx@abmH=Fu*vF8(^0hIjFy3&>-WW!3Pxee?Rk~i4a*el%1p#6L1X+zJpO*nN0Th=52mw3>Pfu7yL_xPj2mu)Zf9p9jHg$2Z z)D+OEU6GlMx(z~{3v(h|N;jZgDeLA+x3U5)-b-jpyjHG%&S0$4Wwb_loKl`p zDNoW?();&csgA5j>i0aXe_xNaIe2R>qA99k_ge;w^`y;gYP5@649|$grKLJi-z?e8 z^>r&9VQWka4xF z>Lbea2?{^?*k{Zhb^ISzdvwp zK=TF8$-+_QD^eKf>h(ZZfu#nlf{C3B%m*S6gCD$uJ)G=dUkA^?nJ`CYltCWnlcg;3 z0h7I|Dm^ys_$WnRf1%(eUYMpa#{ck3A5X?$fm<$|dX}h)4O?qR%|V9{Jl@wm*I3=U zr3N-~gvP89GkC)vcQCruaAW_3;OcJ-wfA#Gcb`8tWEqDj_s#9-;?lyw^6gK*?eqEk z=RAU;g1>Pz0EyZ$=VUYN<6bSPePP>6bIJJZmy6eghdALBe;20UE{@!#l?!;02dr`> z4t>}3x$*joz!4{qF@pg}2s^P8aA;9OoMfIq1aFKxlI?SlggD%WABSc~67wUUzzj?s z3GN@R@f$!3deFNn9Ywp^>Vf;O4P@oA{8@;?o9@u~msBo4?(0eAwv}AeUm;;wz6e#enOLEcPNGYii%uhvmK$-DLCLpBlF04YZJeF4=#6vdN z{ec9M8Y(Oc;erb&uuGtWOiY&2r1_x6OqkFG_ zL4V{-c>M)}B1!eSBvn>+ktuCQYMvrcwMY>h5fQFX8V#njWL>5rMwgdrFzWKeLxw_= zm7HeCD_W{hW@IQfdS2uzHX3pbrUFCCKgy~sV|IR?!K8@EN->x+34)le$~Kr%^K`)> zVpGI?VgsQjG(;4!iHIb8i5H341WU+84}XM|s3rt5nH-fYlo%zqsSwH`RZ1I$={`@W zCFMk!8{%6b+6H$f?at>`t2D>oYgZyaybCYI0eCys!y>#0ET9G& ze8BslxwfRD0+n0&O1uQK@xdq>g&xwJNj;YSH3AOZZN4}%J~4U!^W$g|!34vG`>iph{S) z)wYdf@IFr@uWjE+vY}(P!pEdZf1O* zkQ1fZ$Srs~$#Z``0EU7T$Y-665DL?{((BwdJnjaOeLMXwieKoG|wZv>R5nl2=5n87>NT2mvh2cjNh>(aEfV zNr8bi%tu#nH|_sx-i1p;SQ$qRk0-%yQ)^A5^*n<$&MYl@l*3&pst=BMYkF7R-702&};G9 zC2{T&dv~90*p*?+sDI}MhR5n{h`BkmTD3AxrPuPk#sg@1&0|&mn z*I>4*kL(5s#DG5qU%)jMr0CV8t;in}1yQ?ul6ZGhb2sW@1~VOcU1p|k+5Js06Cy6( zxPQWQ3oq;Be((J5G`h@8s?J~@OCw_6+}ywOOGj_Zu)U(^!+%E3HFy>^Am%z!8;#Xl z()D~!T8_nFDYF(@t1adlRE4UU;s(_EoGQrNLbQl=*fY>~Aeg=5UMwhO9oBkNkp-2M zarn;T^yx|qhKkj3Kj7|}ju`=%oI;l?J|)+)nW8fmvT zkkdJDX?UxAS`tr_Tn?mNKBHFdLlA!hPqvQo^!A|itz%2YDL6C8*WCh zntbCBO}^$l{v~bSf*8}C-`%Twy#=)jZgJ1B&pvx2WBT`FWHOn_LdT76i`}djtZ;Ch zKF#=(vC?RnG^U^QrhF|)8`EFcouFtKGvWNEL#o7>`K);CSw=Cvw-D=@%{KR$( zXTR-!;Zc6Reb+7s*%lfZ;TLYPBE;7(JeXk^8>jifKJ?wjl?y`s+*Yl24EJBNXnTP3 z;)s91wUO(Vx@`5{x$PbMcX!R2KI3gWhOuSFF{_w`%v;QA#*ulCnaWIH)-a2h_nB$T zbjFfd%Pe7LFjmYuW-0SFGl_9wmN9nBdS)gwg?Wcr!8kA*nU#zgGm8Tn}J1d zEPvz0p!Wx*51v1`d@!24Ytm}+WJt`=5ks4XISy+uwKsJ#y{R0d+&_Hk@YI*GJua(F zUiNFKECx}!FUpX?ad=Ubcbnl+!JSQ96hmf^#lTOH?&D~Y^-Lu)a05@U1iv)i9hrZg z`-E|qu5l(W<$j?Ih-fKF%Zg;seN-+5ciRc^<$E9oLSSEFQZ&)^{4_E-HZ^fB@KNq; zo$jQ*66)b&IFZVWoW>3g=+bg@I&}vQR$wuEkyt8h=&`hi&KE<>-0C6UPTtYkTri(wzi6bJ6EB*sIQ|JT+mc#d2tc?aVWdnez~SN zYOacuF8b?%Jnp$my_NNPXV);5@(W}*GA~i#&UIyiubOnx9Az)ZgeEsgLmFg&!_fhU z$+1VW7NU1)q9B3ytlfFEvZ}c0F5xrQkj3)}M|fiXqYb`=?;J-yGk-Vijn;o^;!;#$ zPMdbR0#DR{R&5^xjzFRIP-^M{waLr=3tqS4jPx75LTbj50!fm}v;5fi|{*G|IO@_O~L zCNZZH&Ot*^NidgP837zDAFYQb1bksFd`N-MmBLXd->caNnv`U+id2jwp4g%IR%ExN zPJzwf1JfaZm!%m2Cjk_f%^3kKe_yIIO~o5Fz!n;08CM90w1t{usX8r0@;#G{(>zD# z6)#Hv6lue4rPOwLcV_o=;V@)JCulTDiK?ZmS9B~XTujlZC$?lV@h09#Ur~>%P=P~` zD@xME#3ewCR-Hsfk-;l1VK&$w*>K7I+@4$TJ$#&o%;nEM{p`Ek(-b7|e{gOIQKs$G zX-a`F*XhgEeW)PoMI398WSu?@bhsG`36?@*xS8@6hT>NO9MQsa zl#F%Uuxz(GoZYOBKL9#7%wHv+2z0bpa?JrPdmDkrDL;RYYBZnrBbhL7{nqFRwen&6 zYh?MUdvyPm8E7m+hSRx6W~XX=uWtepAIhaIbO1_n;Amy?&5a%E4-M-J7tyBK*-aqB z$f&1Na3;=ZesQR9C#1w^Qg$V)qc%AQEu$yKYSH|Zy1Ku5TziOT^j*Df2J2(P`Z?R-u*Vdshe%+?dyEBm3KGb-v!)CCgL~} zPNIpLOd=l=AG9FjaRB&-I9iY=di)RlN0?!qT&-?sd%@zRyD3-AeC z4QW_fw|xH`SPYK)W_T~!?BE#b0>;rY9rcXTb57qBj3Hy_f~i7Ve>3G{Y{E_f z9a-8A{ss=fev`f>@2PuczFI33=}+jmG{cj=fnhl1b6Wd$fsDd-9L?esn7d#h%pulB zxcnn+8oj7i#GEsITWlt+oqz8ZizKR$8Ds@5feqGnvX64S=Bq`lacAczcui5Q!yL3> zaVC^I6p+EZ$Zo}C#cwiWe-vNSD7sB)*<`m1(&=A6faBM78j<({P0Z+qI6FeL!v);6 zGBkOr(rTl3K`_6iYR9o-RmBZwT#jvU^x5bXp;ES@f+O$!X_Zif)#_UHZBR#RNBNer zEAcR(&7UYHh_Tu!b=3fE1l)W_%qKLeBn!8CiT6aS?C;TZsx-;qU80Mvy^nZEY7X zL%zBXZe%^$9&h;GAZd-Dv%(<;tVJuA${hg^0iu`N9RVR(R%l}&0=9wg1)gM83uMTJ zRJ4KHR4zO`asBk8y9Zn0EZp94@}0URX)|FpWp6UsdTC^}|CuGgyLtp}O4h~eQ`G2~ zEQH5zO9=&jT~bxv(PM|JD{A7MikDR$0W^PN30fGDRyyY(89Bs{WEQa`8S5?DSQI9SF$q z0e%~K3y7IdQD{+&x*?!0`HS7W^1dPYR@~}Q^QJ=N*sz<;dsHd;DX<&(?T{RyCNh6+ zCnOYR>fvCqiY||XY5KOH(@+F_CB6k{*}S7RphE3?EGT340sfWJ`h7{iV&h)9^;{w& zUdt!fHGYvQEk0oXw62wpdpiDw;QF5x8HLa0cqZNuE@GttEBp8Z6L5+J+WydCrrd=F z{7t}09LV8J{p^)%;axIIjn+{D^2dKqeF~rP&q%*-$ZA#3&_5`pZwEI~O6ik1Sjj0n zD17s2^C|Hf6;e!P)N&8+h3*I?4^ivi)3HX zCJq$kxJ?=>Q1MP@Zmm13wQ_%(G%1z$|B4*tEWV4p{(0-Uo2oPJuH53F?ICO6lTxbM zWOKvL^a}6$IL)*Yr;&k1z4ibjr1b)EFn0dJA7odlYu7iyaX6(h(7vzWl+SXcD?*EZ zjki}ofR|ToKy#C!rsa1jNM*;rH=9D6$78(ucuuRC@}^`d%@D}MN}qr1wKZ_byt$(5 z>6gy}$(T~r{_UW7H4?bIw+M+^?cR9RX3sTk%d$7oBG@dj9=EL8qc~FC?pBk8vhBR` z!M&Y_QcI!^#+Fe&<2QvZ8b6oV6yfAVm9`MlBVUcjvflB?*6TB~RBdgaxjjg31aq9# zg^Fh=fA7w;!|GSs)&GACt-~w((I;FZq-8gR*&I4%C`7JTz$#lM>L`}KUIS~nS+46H z=A@RLRpF2S={LJMi#w4&mEVBdZ7P%QMmlx3&&z1BlPLWpQtpZ9wikYz$wu|cfNWIc z+`$RJf6;TB*t)Z4)9B*3Kp*;Y)(CQ2>GtOwj)$E0a|qkVI*os$UzrRR$H}p&TS+aI zQM^v31n&WpdvzhQbY@t0u94168-1Si3QocrsAC19_K9gTLOdF1vQ?`+z4?2HKWx|j@z$e}Blu;s*V?_5d z;ZJPS%QaQhUK)SJLz||?$Tc+Rep3}Ej6MTb9Y50vEkAJwpe&%q;a|lwm(ILgDMq zmg_F*tD%1iS~b=5%tB*#Pr0oAv#0j%`!Z9u|F^#SyY{Y{k{xsYwXgnP59D#bxHe9h zwqc`3m}PBmWe+;xL*Xz7 z$QCze9y}tRHC&=Hr6#pB!apTC6t?k!r6Kk8N6LTey1XxsC1c2}nIv7M{3m>n{eI&j zaqj2auTdqXe)JWNLJP~AWN_qKnCq>6PA&@@AhbTQU{@8~ghC#NofSJD!aOTWm~W{v z##1b1;IO_xW<6`8wOsErmwJGZukpNOJX-QISW z^JM2!w{M?mt}QZVjM>x&N!R7lb<7qFJ=gvF+ER?e+70-^*p@LCbhcLEn^e9^qwt&% z$$>+{>e#>-U$4!JAR7Gj+luniPUJ%?UlUQ`>$^S7Z}BN-DtkxZ^lvbmw&e<79@&3O z#!Y&U8c5Yo^KeM5n0c*EMdVuq8@ToK34HnMh0^tV_p9?hqI)!ucM6+mZw!tSL$cUH zyD-+vHMlWj@0EEfWOn(R<#Qz5IWDugcK6 z*0QP-=UsC5=~T59Em@Vof1S4cqc|-w8=tJ+qS0tmw0pIhz0?yZd*Y*WpitGqQms1K z)g2~|58JT+_$GCAc3BxT@~uIYp56hWuG1f{qPSRm^XU(r!FTEQ?JF(HM9Hzp6dQ3E zVU3*dOj?7}gva6(X%>4_lO9+SrPapnQIVf}mMYw_k&=6Vcdjn&hu;6;efRtS@RSee zXQv4SSOmPRFp1CYcE}|e*|@owB_5faI1t%4R0I3l7Y!QFkU3}&vK4~{>js%H%zps+ zUIVq40W<*=mt!XZJq=GpRz*=yD??2}STQn}9}NM7w=pOI2LT8=d(wi*{;p=k&LHnwbyVuD1YnZ!hmTV^tvIF81QA(|7P{)$}Q z&4p;-MIZXS%kAHv9GGGD(?pZJ~WiR#FxWcNuvZ@PQV zo$KwsC^jNdy@hessFF-*3He_wjscK^j0@!>u@Bh~~YMkXbzgHl$+s5Zp@-etPy ztl3^N3lqyQ)0j=n8fFPIof*r7G6Bp|W*ig9_%bsYPbP?2&a7kBGbgDnpv;`b^uX8oSsuY@9*_cN*7uBbYKrdHk+kStujEF zT-qlM<_$*<9J&mgl~rpBe<2KZf(F*ohge+~WEK_WYl}qUNDh)=*ywQHsz}l-gLsI8 z07#&dF0<(0KfWMqZ(Ko^Tk6(m-=$CpS&(he>l(|Ug)=7^V`Gw1)tft2AKm@nR%f-~ z+UG#G?_`!;Lm6(h?cq3H;va{-N9=t3qZXQc=D|8eyTQbirllB$uMlkuT4NoZVV&R)LVW zYv=MAz!49?si!aLa0HGhzN9J8YPA}zSX7j`2NF3|b4H!9<#5+s!Wz~S-=%~jEE)ZH z22MoJCgh3**PrdDe|Ri>MMjtO%(hG;zRr_8>13`k7gE8Es44hY6p*6TCKRS?(zNNo zB`Xys{a*&Q`{lrPlUW<)N&DjtXmwD-N#}Je*7d(Qm~F_Z1h+~slpZX@#y-1|IvbCQ zdi^tKrsEmZ(}z8z-se`LW>X;-a#K0ipXK6*MzG@hW;EF}e=->VhNI=JeT(^5G6-RD z?wtqUJ)U!o3@QbI8(8WFS{wwhk$a?Y_k0xBf{%D-HacQ^@aTLj$ zD+#mJPyH5QMG7!jBxkb>q`7j*Pnyh^lz|=$TvZP2639Ol*<_(Zhr;lxv$7e=+waT+yp^MiT&l--9!Jf1 zLOhAL*H|)~jCeE+J<?^cll=eW?bJr@Nxr{9zM0f@=9l0*_5hn4Zc(qe{W2fP29=YCx1Y<^IcWuRxy}G zUxR~{_0NM=QIc39>wn0rR)=Ip(%C}*U;m7*Ueh8rUASa0K|6G&o447Rn3~OGSuwa8 zR~j+Q<~R>Y*CFrA>GR@Eus=mu=o55ydF>)9lYL}58BcbQFnp7|i5m1p7G2S)GGDhR zCkL{%e_}3~O88(;SP8R_1$`3L5`7*}fbT1Ac3rr9`)TP}xD7Z+)kv1;b4#EcI1}h= zMS5nk!HVO}HYeEpW}t}TNiv1^#dV6hl+MJDfWt8_zQPG8On*Q|1%#wUZx_$8WYMqw z>p%3L_VSh5`BP_mj7@WNl8pBWS*29ge{{u<J0*o_q@iHQ@Z0B<4PnOCgxR zn+#Cbn0I?im#FFpIvhxWoB4xXfD+=O+h~K=@6o}mmcAjD0bp06hrG{(-|`qm1e`z;NfH@D zey-1rwjPsrjT)<>1$%79dL6sylGuP3d7Q7nKYn}fM`WhnBXh<6 zsV}XjXwbg^3mq?@!RAyJe<$_wI0NP`e_H|GWQIsY?4hccUEaI%RVF_B5ji=AV+wCB z#@Xm7?9I;0fOIa*oKaV2u59lPJ|6nE+E=xg#-v<9=KN<&-lilq&_mSH^}N`Zh9X-| z;H*ctPhe)V4DMpmbHiOZ4#$=J*@O#FK?NY3|MTbFah9x7vEgX#fl7T*K~W)Oe{!iu zcD?)Vkt$*g zbUFIrTVH>0`|p7biRD6Q?JAfJiLea{bjsqa7N~+lx{9*H96B3#FSvH*3|zZ^AAGlL z0beii0tw}Bex4Z|6%|O8H8S!-f6L`hpn?iZcD9G126k_h!ByOSRW1#Z7VuS2yeD4+ zxqF1dqU^kaqWGgb4AhgcWHON9Z{U!WrUJ3Pz?^>o+H%_xLB-9V38^7|M|D$f+MHZLxhc`Ov2`*{r?Cq>iEO!L^O3#c zx!~jZ&yt^}lxu2I4`(*SLkOo#eVf?NCSoH_*e7U@!Tz*gU=4T)f2&ScQYw^{l^m|C zySU|UrY&=3e)jzNKl~pOS)KSYn7Qs>3jsctR{xsHA?$*!tLH5&tUE8@cP#P!m*8{Q ziC5xY)ZT(SRzdfc0vG)&q3x;iWhR=;16MQJ)1rjO`$q6+Z&gHUCW4BNi4aNq3)=Vh z5_=_U(LaR_I-Y`se}YE_UNAs|)Z0D4L2Tbj{@+va;sD~;DdP2T{g=}5v)vo_s7Nua z9=&YoC&w^b!BOHl{?X!(iANA|D)3gFNUv{fFt$|X9m^;a%q6wd5Zu-Fh`Hi+mX^5L z+lYK7a%tE8{9Z?AwYUS6KM36l;~}V_jbg9pr-P$l;)v`5e?QGTJ$h4^`OG)SG<|=N z3P&EOanCjOIa_6YQGE<=IDDY=7I2kTMU2J=_R-e11d?sVt_DuQ@$7=VBZ;a%io{4c z4&Pc8(V8g`0nsoC66u_WEH?bNb4gl>_9(a=g;FRn+7hsF0FqbbZQIL_yzd?@aF4>z z5&H?7mqqUue|FznRsBGVgzFbN}arS3#H6b{${CY33i$ zp}bml?hMA;h@UPU<(v1_)1<4V#o$VNQ`NcC6v2Z~o~6}5L5{Fx_onP1SPP+Ln=AA5 zMfxJ(vLGizB%M^g+0~_bUFjjA{D`IV9&nFf+S@)bf0hj1;dkUiwb*mGt;Uj2za#dY z^vzyhdZRN=?|pzn&~?szGG=?|zG$U5(0B2tb2rh&XqMf2hT&9APo;HyAsP3SMF(^$ zZ7Z`tTB8t?lbHkw+>ZLBX7h1V%lWMrClCdhswRVk35%4s$WOnO9R7q$**b$ZN+h>` z`>izne-|0kAfX>Q?z%A$B;oJGgoT-7S_gvUC3ck7{npNE87;RCa(vRq@(mh@78b1{ za!3Jgm$FK65_$}6hq?Y5A}ZMq{eM9h9nYb|W|%RrC;)WA%jni^D?4r&fWzdH9;4|m zl%mwUfIT_;^5(%FdV$PPw4C_ni;6Ooe|5DRf4<|;$^ANwdxy!Zrf#tAF*R9?XF6hx zF$aXUGd%~46!y-AKJzyCgegT5OVV<3X^l*G%aG>$N_;B{IP~P#IIP1WYeGBpw_VLg z@M~&$7#q43JP4DzVt;d}Xf3H|f<~@At|3en7pI!>bUkgzbHDuN>3fNf$&7m8@AZHB ze;B^xZu@*fL}EWT;H{0VyWed%S#`#g)4aJ@=xDzR2H+lmZ)|Mgmgq1sL7kw9&}3=T zw1t}dBFKY6F2g|U?JuaJ!YZw#u%596!BX_(d##hDMT$D@fy8tT?8y>HZ~qzxC7z;G z%am+`{t4|1&G2NP+fSxVQ;O%wbpotwELM5n;&M`4g4?PUWJ@t?bwZi5;AHPz?c&&6 z;^Klblgl8Tiz~zY5B`^kjh6v50Th?YLIDd4F$!gFWN%_>3N|&D!BGJx22fB&NK;w2 z4MPDs0e@6eR~~*b=J`}aYmFwYlVGP7m$9H?-D?%ASVVDO#tk6~2!cS^A&~XG{9ZyJ z5I|&!fJ<0ZtP57{IITJ^?MPRxORdX{QRl`B9dZMDH|z@dUf{H zh<|Cz=7i3j9{KLP8S`f@2wOO7(ULK5jvO^QgrY`JuTgJOzo#ZpLDcJ1Fg2JONxeah zq5`SW)DS9!8cL0!hEZ=(lf#GS!cgQUgi7R5wa3>LxnVC0b00E4#kcb+e?u zq@JEgKkBAsmUQ>){&9~jJp+1L{Q~?R_J6AA)$ad_e_8L~-rIi?MJ$T+cT2$K7P&+q z+z`7Z$RSOk6EGEzd*bQ9Orn!Aq0R~x>t^Lmq1ooLRNMx66K!*?XMC^R`)~r*G_Bf3jIL!o*t7)##T)-7FLN)F0)`ANya|yF*Mc|$x7JnS> zSyHyfT$BU3U^3})@Cna9Wa_BcO<~|$RmZqEt>o=Y4jl?ynW2Tj;X<+WIKCjk zYTExNajC2BDFr`9iqRu?pwzh4%zq~XgD29zP}x`yYf9Cv8VqtD!dCvUr5T)Xnsb?p zU9!{}@TU?>DQ_o)HA#3H{qA2PtHx630C^b{m)h*;vD;t9)5APpJSWJQu*-T5+Cbh0 zpTchTDc*E?c7Czb$`_M&-4J%#nu;9XfZR#Qm*7csDwv=k1E2Ankoo`A<$vQvk%ZV! zoT$wu5)R%IqhanTQe#3T?0_n>+{spPpoUKTq%ks6DyvB}X0maR0mcNG@G6Z0k?6_2 z8#r_JMjXR|Kkj1uxw;usH@}uumy}f??^kCdwiHG3p(w_y= zjv6E=f_|`NRCLg^Aly~i*?;X$V%4%6m1^ap%PmKVh3 zW(RQ^R-I{78xtVjThT7k{Wfxa2D@0YTM|)MhDB}B6hR$S?L-r8JAauM!0i#EyY3*V zZnK$BBVC{Htn1t8cGzNau)&^vGE<6f^m*6ZMj^x-6jrqF6 zb@EvL{Y=1iSFcka^p*-L;KiTyr8vnl~i{2S_{{NU{MuDX zl3yBr2lc>xPzYLumZIe-OW{#?21^4c+(1DsC1^wkqLhDq@LlUEV6NPsi>FOU#RDRP zl;OiBuAKp7k1qInfv-94zTb<{(BGnEibf023>1zwqS1k zP__w&O&+9NyMHir@f*Mld%@($-aD+pWR&(aqSIuQKKrK_HKTJ%F`l}75gtjN>i+`xgQ!Mwjeq`hr)F^mo6BY^8|VY5T9QKN z4NpoB0cJG47a46$w&Fu%j$fjYVn-Af6HERfcfLfHH-53{E|W?3U)|0<|S(5fZ3Q)+0xd$Ywt&8D;HV4 z&E-$_A$%Tkp>{8y!^EfwU66iDpWUfhlEr4TS%1$t%MH%h6a>szdLObsi8j!aGMKOwhWi6v zP7^ffmh`Uk$tUnVb8~119;m=)z1#e6srmd){@n0hlo=^N^728{jYbj((iy>6Fk5L* zaeq32H*wKGF1 zq*z1<+FVq}m(>=@OD#?0XlB0r0k9a$CM>|cNKxWG2Z?*3JeM%oXJCs5y-uK+#em-V z4)s)?y88EnSBOC|e|eo8Kxy6hf)XfsYEJE_Ue;-pX0xV1F?(9V-sSDVAjdIy4PJ&b z@Ju8n;+pvF#g?PHln!-Mw1X@ItF_AOIK!>M#BzhTi>`K{k`A$O^{ML`%v^z1v43iQ zdeh21glya^;5FP+ZHd~oTIpKXXtwOTO{Zxy&6~lhDE+35L^P@ zP3j633q_y;IRFhHzs!#0Jl^jP*?f+`Ny@Tjg2ECtOHKR zuNR54f7y8chsqwe@Fe0l&~InckZPjOIKxWSm)K9lz$vjPeky87_B@hZAz(3 zk4sKWOxu#SbBC+3MM26Sld;=%fE0i(i-p1Nm!+0c!jqM$(1J!WJ$xi2JWZ;Na0HGw zhIndZ#sn^Z1TYDm(|3)yx_mEO`&o;L^yGr)=MvfAJbL{2zDsoR30iYgETo`mBy@24 zjPSf{lgVT@ntxeX!$y<%F`f1*=E3Ltb{{)*@+|y~LE=##j=%#a;J&k>TaAvLJL`9E z%i5A;AVJlnXg>Rw-6w$gs(Hc8Y4HT&;6 zgXq>H)Q?241L&r-7PdqE#%gs*5^P|GEXTcu#!fCjlYgu@pl@!4UCh?p`q-=$g<)@9 zUVH~B5QQXCJPJ~;kOQ57%; zT2mLK7KTMHR;rf9a;w=)QlWt}m{}7Tn8FgM@zIW6aS2g`cVVGeNOK1~GkP3hDcyC3H5E(kG<6IgAa-0_{NCbpQ9;u7FFG} zlq>(~{kRLHwL*7kgr~a%bF{zO>7L@m+qR&M4jQj5@8;_9O;1ISu48Ncx;sn#{3z<* zeauW5mjN^Z6ql<}0SW>zIhVIl0Wk(qN>f8aLAUNv0eb;|XINC%);{CFoFgi>9F-eA z0~&iTu_Q4T6f26NqGFk$2uM?UQJO=USu@~Jr3gb2DWizMpqL<0qlqR)6E#JRUduIw zXgP>vThhUSUUhO_ea0J_+~#wE|WQ}baxEi6&>Q| z;~Qo_#&N9u)H!oz*)It64)OC;2iZHT!+gC1)nW8QfW2$5r=NFN^d$QQ0Ri@FrC)^F zuk{Y~4vFyg>fYHgIB-{Zn0JW1bFi0pND#v?(^f8jhz{~}UKkVXwaRgq_v%HvcepGL z@o@_ET@vQ!8oq8>L}Y+ED$v92&6%@iPntSy`n(woGm#n2Y-Uz7iI()+Rnvco-k_b|yh`4;&}t8rFmtQT8b z6b=fb;yZQ?TgP#nC)e6Dt><5Dl5HOMZG8n))Z5y(LrEh@NQ0E5Q>1i$MgOr1W zbV+xobfMWUR&Q~%@19`5-7F>KnA!=tW`T) zqN^Q-#N}${sqY4$Rrp+Z3B>p|zVrFlAL;TmPK-uMS^jmW>m< zq=r%>>~ikH6-spKOxX$1=iWP^)X5s-CW zhj-C{!L1Gc%GY+oWBpA?&Z+`7Oz+#-#yhn<^who~I9ON=G(qY1q%LCSDi&|T#Bhss z5jvhBu~nqVHFak@?exc9wF)sFyW%eWNh1_t>K5^x$SjAA`gx3!S)ya2h950WmVCAU z?e}wp&etZ8Jv=pB(-qmIL6)b>kaz5U?U-V3eRu!OH~Dcx9OR_tF|D2tsc3rAjx$m{ z@x)(!x}2T$zoFe~7~9tA@|dEhF+>dt$Q#)7)NJuM*ps)K*y;FkI8G3Gp17k$z4$WK zQ-GRWs4K$&LzEzU!jQ^U-q*p!b=txqRxoAZGFVg7!1t`PD6(56@dr-LGJS~ypM%z0 zuFlU{0&jaKxN1=v-*#LOeL2QH)!)bz^P;y=4o7s)#*L&;`b>qeA4ECw+XUJFr*pG% zPHl9P`C6w+2)Jubx9>LpXMI;KuwXF*b)??Z+eVF* z38NrA->B@#Bg}~LV@#&KNb>HB9m0)1aX~yAotuUvbpfN1CqCLXfJ`y#|el*^DxhzuRiia%45_+=WZ3 z_&OViwris!D9K!Uow`*?Wnn+Hn+Z9UcGsUXvb=Vv3&(oBs<$mF1oE18ekU)^n;z_H zrWG>M7iY`DLtM&QQjHS9EEY{yH5%CBG1JRM$07D3q(0u$Gse->jHD;KfDVPS+(s%=7OqJa z)xvH>@nj2L>E2Vh202CCRWe5a7um&zHd#Pt?$a%ogz)IQ^uZ|>%_HX5&Zf7O`|!)s z#P8;d>N+>uy&YErFsW(CIm;A^q_q)Z@inVdZ3bL+wE_-Z{h0Tnb(Vvgufa4bDpt1E zHj2e5Iyfa+Nl9QQT4KTd4EUpVuDkBjY+t@8vM(~BGHM5UUs*cSMqdId=FU2t^W`cdl46T(KqJ?JNxnzec#bJ$}M)?jrRr*AQAlxPx@2zM0em- zCZ9vQuJe2j;tgtUjL!Fju0fJRr-M1AuLTJ=uWscw%|_JQ3b}CV*L;gDmnzxaM}Z{0 zw8N`g_#5?d>_oY@b*vu95VBX;c{6(V+O=bb4&)J8EEUgb`jPf!bYi==GyL3{V2Ydb zp7t|`iP~`z$EH-gQR$w`UiDYDx=l{SHP#6#f0Fam>1YUpNw3I5u&TYaIp^4NP;tdu zq&~&q%A0OP-OQF;%1sI1aC-3yEA_kSY`7xSzdLvLBA4)9aJ>8Z+|DMiD7vv$5!3_I z08X;BOgDsuw@O&6^~Zl&4lOa;G3quNK!%f@FgepHq+3(gBa_f@^3jyz;K`gM4~FJ{`Q z3zk^m&U#}U!qkOPn6rtjBK2o*L%-XVf}tywZpeTzsf1SAI;P==o*;s518l%Ipn#Ut z$H^ScX4eq`*LXjo(KySW&YGwE3e;zmUWN8$CgeK!$FVO4;RZgk9Mb6tLZ_2#2-Vw~ zgFkOpZlnE*yOP;hn`_+WWTL$;RL}#7KAnDln;O9v(2AD)BIrBsFo=NQdv>o{eb>R^ z6?f64(n>6I|GvPF@04BCAQsqyR_GMPN?}g}4Y(mZYb?Ben+rAJw7@kZ071*WGpW3+ z4rQii=hYYVAxH?O1>2I|!AcK+n?m-( zU}B-U{t-ZR0bAMHyvpfC$+ix^W(f0f=^M)BhPHerT6z1|`hck-_)|D+Mh{g}FFt&c z_^(u#PXb%R{$MsZp3v$vy5XeO*&-JZ4_0@lwYjp7j?B4XvF=gxoBe#P>yJ>BJth~m zp)aPta-1QzX*UH*IP@APmrj;cX$P76Jw2jm<*)22hU`abE)lsh7_EQ(wHe@ok4}Tn zMb1R{J%%4j4818>e8B`GxR?Q7VHydNIpoE(k=0 zA%e}hE-=ca6xH$*V<4H-Mbt>s%gxGE?=}ZJFAS&~MGGPUYzUK`vHm7Gg33`AKAm{$ z3dd;QaMq~i(>m_l&D|{Pxlb}DH-j=9yhlTpXBzE8es2L16>MQTWbdAxIcVa+lBrtX zUJr^$Xu)+Z$>sH>>w`V{KGd_A&&KGNx-|(4IIr##4 z%c=DH>91dxbx|Gk)O-leJ+Ge!vy~vR$R@Laq!ethK{h=65qjR;Ek&YrHMTN$dfOKD zT?1pC>Ha$wGBnuTs>og9as(EruLF5Ftl-7X`I97MVojnviav=ix89M; zn#u4-oosZ9KO7uUBPDVv7~VD~%AxtP>++3?5fZsz_eX$pV?XLr8xvQ_G}u0$X%z}g zm=7FdksgEnQCOssB$c=xL)>VR>o;wC>fr1*ExK**=u@F#=Pg%EO4M{G?hz#GJnGKj z{q3$HEca|HRY4M9lPsRV5m`bk{DLLkG;kuqil`LghPs~|{`}2vGjTI>=?=DpS$VYq zCtj{CZpLBk1pdW1;U>^2)g}7eJ5MX3Lc}-mr?BrZzcEIC=Jiwkq1L{m=GfokIe2E0 z98wV!c(sK`(0lXszV42=`P^ZpIdOG0^`sx6>`#pxk)2$*>Ff`x#Sgiq<>NWpr|O?y z<8Qqz_d3^8b_#}HJpX}Eiy)unRUYev-nKL!zA&+bvDtNSb@nZ%XQKQaR#I}t1;&ch zPe%kW%qvK6Nv&pxFDmVvbzW0LJ()`&`8ffSi~}o2p1FB_$qbWO7`dN!Ns3+%7FGM$z*B|Ud5N@&Z{b;mDSsLx8*$N-~B(Kuu76zlVDiMGfy|E4)hl|wxhTQ%lFj* zaVtFD#~Kz_%dnx=`yHf>>mB;K!iK_zid>hjB!3jC#f)zq(OlLW zBH&>Ynb@{K$F?`Hv*|rQ*)vT6D#QdEzuK%fv48_@yjw%GeXiR2Sm6O_GYH+l^u*9h z*l&sOD~t^Haf23`kKWH^2ep!81D-L_(H-*d&wS)ymy%lD(~*e}0?Z0%;NLAutziLx zWmc2qb2VJ|7XtanTFjhn-1b#_zuStkF-ope{A?mfHs9HRmjT2EUL{ zJ>|)Uiq`vsjvK7O*oXQS~QV>I_`ml3y*o=DHX zIr!t|9!A7n@BE3ic}gPv(^dTdb(y%;q?fb0f=JF1=5ssldcg-Cp7PFUlfM38E(sf^ z%p5Ts;5*&*L)>n7cHg6{eSf@;Bb}lZ2@_^6U@PVAe#6f3!qtI4&agIcSZsudSAazB zCZ^Fz>Q0FYIWb7&!%Z>=+QnvBj9xUeL4JV`*zu!2fSNMb^cQ=VZ2$KPyQRI;$n{?n zMr*%tJBOYpc6-%iIbR=CYfsF#Jwo)Us=1(!^)yJWbcHc0-R^{aLcgduXGAexfyv*ljeLWv zxAs?x6@y%Qu@~KzO4putgrdH)MZ?_a6C50;_G31zLw*|8@6Iw1tU>dd_{~l1`0`2L zwh9B}Xqo#uv7!(HiL8-%d!L^$7CLEyCF83%HRH!*$+RxS7n5R$i)(Z>R&mzRh2QQ>_iIIJgADylgOf&LB-K1J@cYb170{P2_tH~ld-}xsUKPmsMz4)r zSAXi(>Hmy5^&zGzZg`XQj};%^?JXal)h#KBr4{K1S!SCTc`%jZT;p8LPzR=Ow!{o< z3M#u`;q2N920f}@XldfTH$OfkiFh{}6#Luo@MWBd*%&(F}l*bCp$I!u$a z(9kL>RA*X6NE&;NXI)|%cXr@T+w5i+8+U$?b7(UJyvIt^O+Nnn8C;7g{Cobugnm;1 z7)4H2Ls(iY-VAX4^!zm3{={*n&K#f$K$_zSCi{D~4gAn36fq46S#k0DatnY2fPDW2 znFv{!U-+>v5zEkLYneLZUq2_l4mGoAu13uz5Lf}gFi9#67PXDhoMwpIubbwu;o(+` zqGNrfck^pODMHTzI~_<``S&Yf!DxjJ;)|a!TiWqHK~K zTTA>?X_CWcF|n$(SX4nzrC(-%1wSrMg&^c8VTv*EOX#4C=;s~fx(xob&*TEsZwJ_L z<57P|hro8eB`fOoloQ0EDuKU*${_LjD*O>tQW+L-ePy-7W_Z267}6RSuu&YN%^}dk zBY%aq@!}Y-GUk2Kyl^g_MYrWUEC>I2i9dYNBKr&&E}-KKmMvY@cDF79(Bf$Y9+?j(+Fh)`)gG{x>dhb zf%ONZ|HPl4AIRkc-(RdQ7+8x$ogcFwV!oMu=ILvN;e(uNoHER+%3+zuG+3ydF)IUQ zC;1wmF}5!?DI>qXjIpKIb9Hn*>y~r58$V~Gw@byq6zDXU0REyPjibS9DifL(;>A8o zggiL|Lyto+2^W7$R2pmCWwj;0`o+Txy0|zc!rsaxpcbpFtk?Ml8{A*d5mx6ziNGJZ zv>E7Hm0_nG!bB3e9g*iW|`L{yK3Ro>;(1|GB*d05C2avW-iNz5rE-bPPY z4|(J-+aMrbl&$l2`qJ4#_C0eQ{8(Wi_pSMDj%%+Yzkxh3SjVMNQTa)(4&Ys_?qSH8 zR#qTCqGH#RC|3dJ_ie?FjuzB=*P6ku&D;FRs!nr%jcSFbumJX* z!^z(OY|$f8aS+B6gA$gD7Rz7XV^OO>V?MA=`ih{hIU3@&je`N0!^Iq6VyIE9TuFVF zI1+KOR7gKyUCq-WzIcuuH<(*KrGPvPaVH*Dqe^nd#$HQtQ?hC{yQdxo!-%WBd(#Q} zF6<}d)nEE*_NAI$z2&1Z;>bb%G6COChKZ)guB7a=w4=9CwsMUoO@fm-Lz&fcHuCh| zBmuh(p&zfo?W01!Wq4v(C8m~w&YwEj$(bJD(bsfoDvvc{pQHN zejrp*U-ZZd5z^=7c{g9-6%NtM> zDHlZYCk1q=mzubAE3=z_m7e;=xfe-I!xWE_*-S%gLjYkhqD{THGnLO4H%5UT+BrIB z4bG*HD2{lVzv<`iO*^46%Rv23SDx9)agIdrk!yFBa?H#Lvj!7WV1Ck)V32D`AEk{e zW4c-(wRz{BcKBl9mU0R zsrZK?y|vwYP<6{6t%}q6T<;1?*1?IaM?#fz=lE*ctc25Sbff|{akMXN8(1RNy)$>z z^YN2{y1qJP9DjZ6&!0W*K@B|n0L+W4s(FQzgm|&Ee7W-68TM<;h4;dmQz`(LEvt#D zP<^Z%)dPusBtI1iDQp!o-jJuln|tVQ5Omcyfs9hh(-&j;7Zu}|cGP>U7uF~HAIfHS zRrcP}C#4P!l{Fs0EZA4Zk#9_&%^{C%p&zLZK!rWvJ}9n2+`I0}QRPewpUTg?mc3&x&Tor|?`@m{1;~jhI+(0Ms^|o~rLkb}KKEVW@SzDc?@`KeGDoOeLNx-mhbHdq$FL2P2QOSrLR3i>jV~>@AbbeIpF& zyRV35mKz)5$JC1Q?OxfjKIqNQ5}Oz$I{G0;5I&>Va=yKF*fmX5iRAed>F7+B2>W~4 z;0Ln!C2LzZ#q}>c<#GUG^C_ayauTwh1_q29_zh4c^RUnJ-fU$bpBiy(`MOemVz6rl zymuzpuTTRNStMt4R^vYV*>0{fF+AlYQmo{MC!Zx5a33bW9(c^S@Au{tKZ`hT06+V* zw6j4`!A}+s()S%E4w|WvEkf-P-u=UN-jU0I&u#Y{roZQn{HPYQIA#s}GJzkr1W1ug zXO;tRBrsvJgf6?wcc%4YLJKR;UrpggkbGD{^%U|8&V~+#J1RtJ8i^(Re#zP;#Ke1$ zcJrE~@EbKx2r--O33lyblQnBiDS`Fc$DdC<^p7s;u`rzj*yPd$+|bB;*sV{9K^3)x z&l6dCdHsrCY#HaMlkFW~MO*}rZmCnM+YMw6%7lc%q;rqA)ZYI(^$lxI@2M0$Xep(> zzptY=cX02sIMfX7} z^GBZ@=8B^RqyC=4F=o_d0WK%mn4ZbBRhYBbpsgWYR8KhKL?%s8wfrA?!>`4azab-Y z^OvjZB)M9+daj>+iWla-|FBmw4L$Uw+240MhjITVyNYccn*H&EeJS}jgTOsWKbo6G zfS__|S@yPs%Xx^GNs-i-;_Pa>qC|6yZP;Ls_{?L66CyUkKjnisHo~EvnnF6$xgmQj2lBcbD8X|cNAT7Et z$eJh|ba9!c|8C@7_7!*V^PIftYDcba#BA0M|5#(=_7(i^f2QIO%yYQisYiNE{2wQT zvBion1US+NJR>rgP^wy9Iu?*GYOjVq?MQ=ZcC<_e*YO#9lN;wCKrTNS)HG!4DU2Kz za&Mk4EmI6yf{dON46^EUi+JODXE4{|1 zMe3`IdsbZsv)?cDDTKywju_6!?J>j|g!vBstp7M}GabLX3?GkWUZo$2-C;sMcF@)P zVajXS39&op@l54&erIFP!PhU^q9+i@c*gca|D@xxkPd^xl|`2f{v-YD9w3AkUJSp& z?0G_=8vqjn`p*V$F7V$Qyk%A7mE9z8^=zgOS*UQ3P_#q-uA_VNeN#(+iT&c;)lL^NtLc6 znZ_xG{0X^-Va!pFI*!K^BO}P^0y_jFL>6{XNpRg$7 zdG?8xR_fC5^s?jsgkG4LLR7odaoWHyVYx$+d;Jhs2Um4{t>ejPMbiDiCC_=-jpN?# zNKSd!0(b8QaLzEi%Qo;wrBPq( z?$?<-da;i-O!_%((3f!4GJna14yVC1lvZUO{bL2jtY3M2^y~yDw94Slf|a}^mUVL@ zZ&rMuP`{hwsXhwENu>s#mFR2|qLrq5(S{&;t`C@#6FE@8do8h&lixWhBziKihTc3- ztxz>h6$~R>)NcKTFr!d7VRg0=Ub@yRq39Y7h~bK*$KNw2e*rQ6 z@J(jFm@z_2r>%~gq$K*jzvh6|DuZ$urP{rUkc~MzJ@IXPeM;OnT(Xq05+xUaiTbgklxH#(%GGo~p% zX>o}%U1ZrW>n1}Xu_BdU1@(RMv!6-SJQ>0^hJEgPl}bfp2+LI1mb0N`TyPj~U+MUK zEm*>)*e<#3Ydkh@R#~?~Nb@3b&~&a4I?=vHH_0>btZmB~diD0DM#e;Jktf>hcJWl_ zMoea3w|0s}ElJUx)ZUbfCf%9}=8do}^(6K@cd=@nd^zt<{#MHc`ho?&PN0l2(eWAB z1m^I@t~76ny@#`b2Se|rls{R&RPV9;>o<5P!3XXG!?PCRSspg}A*E8U!o^4*W_iWGS1iGA3$H2>?FL6`v9R2E*u6827*M2cMcD?2|YduR)N37cRm z76R3a)$sGs#ab)lnZXM6>r&lP@8DfDSIP)xN%$L-=$x)Fz-t{O9E0cj+%`UkgR zb*wn`?=xHg3@ym7J5MWLuZ9zDHtzD(Trr%Hkmw-=SnNf`e!N*K9~DtJFi{EXSE%NoW!m&lUV$xX!Uqzt$v6iNUtBeHi>lQ*;Lgf zjlsC2@hNJnZ|~b%K;(Q2pP}0`Sa7d0%-^*&IpgP;0M_jay^bk+CF@~E(cY8qr>9Q9 z0J`*3!rv(DHND4s?Ed~U!ftx0s}fC+8VXiYmWmCdN|%??rdIF``W935xlOJRhP8xa zW&wHeobkfdwmE|S(`qmQw>uNR^`wpo(^b2zve(e6-i-UM!SuN`b+SuaC#KmN%*%%) zlAwR&w=$Y6qSG)!#qsUNN8>a0&_Bo4lP^gJtT^<7ZYwAq>CA1ZUaLcit{twly%JnH z{-_teU>x^PiKNUylc_);GWw8?(IHp!{wh**-kMd?2!EyJ=BWH#%_vW_SQv7oXx-hu@3 z==ep6aus}xlXp{_^0>HmkQ^Cb_RQ1Ucd;R56}z%%jt6a*yT5}kfn!F0vL*E2`{XKn z#*epQj0*3Rd*=%huoUNMLy=dOY0w-Itv7$ltR8LX6TPt$daCW;^JjSDBR9-X4L{VZ zuVJ$u^)@ZA1yxlbw~aY^bZ4ZHNg6C5!V{MgP(|lA2EXIHpI|tJxdLJoFPeq4R4}Kv zUw#uH;Z03!;(|-H|7@k<=CZuI-*5WX9F!bJn;N24jB4%hw#E>amQ~hL#GO6hW+d1S zKXvI`)VJ?GLirD_k0}395*Iy9@E! z+=OF^#ilHztq^N&T1b^|Zc|mrOA(i3I^d)_A>N?a+yNtvBdBY|X`n7YDnv!EC=8vB zgG>$go%Cuv-V4k(N%d`);zrT8W8Rz*^yD~YI~=uNF(3w%{vvhsU;)^GsA#6JzMjV5 z*-oX?db3tceqL4j>vB+B%Ev~Wsf|s;MY69LuZ>coTP-Uu!QYaU)txhnUft}em%)am=oN{0A)v-}b(>CIPC%N;$%*^U+ zrE%W_aZR}nbQ@V)Sn}CE+C@_gawoZftCbX++g>dtA_)!i5=o}upZ4rw$|>d!jy<8r zs)}*vjbFvlq`S6saUm!edd)WT^Np(;W0mWaC(@LSG<^9FtK)kuXPJ6MZM~ zdsD>IASMm`FYD99Q8G0pnCQjV-;l6`+V82XN=)kQYAJc-&9YdA`|^e^5n*vTdOf z#@bfGw^F?v``sNfj(rg%2Meekx00k<6b6rYq0(LFCVeOzL4|#vn|P0(4%oAu|3XxI zKkLx&jR#x0;QqD9sRYI`sreG;+@i;bmx;5sIWDkAL4&%mv@Go|;Y`qhuEgf> zyBhd4bW()8Xr-Z_3kg5TrRE#FJ6snh!D%M{=9YJUqI#e+ZR!yKr8Q>vQtgQ@Xo)A} zd&Sj{ttjf;ZJq-=XI#Qpr=$*#3=b;_t%c6aaXP#Q>&b`RI~uZ05Otk?cC*C%v8fwXzdjigDt&3YqF;U9{dSVJ zi>OIXYw=f3!fDzERYxfJhpST7i9w>)3?8Ol*iOWD*$@yGoNl|28e*J#*1^Bfw>fgg z-_ORV@I?l_VX}Dm%&&mWwk2sn=EivX7v??U;Q}jjKbbh5L%NJ7W_j~RcnO16-L_%f+d~UzBF2zoa3b>sUdZz+78UZ1V zyy@ayB&fSEbem;2=niVC?`l);X_!YelB|35hiBP=zL-M9^`Q!Z?c~0_0u}@OsRmZ@ zvDEd+;?VG6!f=J$l0juNJS*BW9KY$~Ws0I)*--1X7w*w^Hb~$3&fdSW!=0pt7GhXA zi;+B60k{jw8WX#cPQM~$J9(be!4rXW6t`PmvTkezllt;3mj?eU?XCDn6>>WNLva%m zrf$J}=_G~}pYsR}UlRQ5L9bW#mgatzoz^gumO&h0YCK`o>OI@4ffIu*-)N%`g8(sV z{7!(Z5FMoEC3j{nT8}ekRUsmK#W(K>mn$PyO-_|8+66GeJNWTSE<>tx+{Rnd(o$oC zz2%$Hu!z|gH*P&U4ZVd2J~;*|E?=KzQ0@&C;M{QjX8+BtN=w%71Ep7vrY5H~YP|t= zR1lLOgAW3@TqMV;pK&AgwwpUgmbTifm_2JprA=AH5Q;+i*trlA7Ga%M|-BH zHqm84?yISY+0>GASS5z{3OUW0q)e)w#UG9|>ig{Ay>>A*fKZod0G}TxP-by+Hjq|5JLWxPe?cMsnX_9w&3cka}QqAiZ^f zVDB%7v$!{bqlrUY-hxK`AcL@kLAztKoYfqY3O-sS52gkJzWthQ+z)SVwdA~<50s&h z49^a1?NHR#NWA$}VTG84@27S+WEC|v)B3PygSbUO^i;^vjD{6t+k=zVN)fRvNxW{q z@cQz;?cg)9`zIr_wqxHToBw9*!sa!oBl}^e!#sKj2qlsEI>wB z6p*unCHK3{z>q%X0d;4>dqL`}JwD)}jeH3X%L4L21r3#@Oz+c=HW=%&^OfulL^(GH z-;y_R&#!||&5AEdZj9`1Ic;xeKEd9MtTcp#8J8VjQHFV#=P$k1_#-EphElMDIJ(Oy z@b1l6TGoU^iz}iGlAx~6#N>>&L(r>9SaicD9~4+P5ok88QTrXj^G-LJdY{)wGkvuM z#FD`Q4&rNuz6*n-hhEy&2W374>g&V4xyp zm#0jL%!HzR#k&FLBRVe6_Nj8BaP}q9<2`9My zn`69f{`q-En$OZOCuD4x_^{5)6{esm=}oJi6q|AR;i%R(a#hbF@qh42g>yfrP%Pp2Oy}BQdm%*>=X!60Q(t^4_g6-$q zS=^`021uD-uQs}F{3)>U4YgyO%{eC$^LhKu8MV~x^}8t#4|7?4c#*2M_g&_T)ht!Wk;Yh*jnvfHocA?H;{qz{aEFG7 zv9+jW`*I*fkWdcg>S5cCgLl(M&v}nOkSqVj%C$fKXfmyW3$PLn7&agQYJUw40oyzhQG zf444;Cy9R6)FF6Z&zGZWJjD}IF}Rc%-mW#59mT}UVCMlE&S^Nm}eM( zA4OPEMGC%Cr!5SASTD>M=~R?{vEH0f)-swt3kC2Y*VjvuhLs7=+7hApfbAK2CA!Q3 zg~l_1BPRn9!Z;+GZ5mwytarTwl@`v)7T}3qMTsH$fz$oTaqWGh{Ny5mgA~tislVUs z{Q1!4`6By>8nX+DHrIqDA`(Uo;--f5{-zQ3NRICG&NZ8d{y>GP*9ffgjFOjOqV|Rr z9Mv9QDLpeJHeFY;$zD~k)M;}~(|n$E)k4oiPp|b{KNC_mHo`bfyOTJ#hweChLakq| zlhLea#+H^9JT^9$>uHw=-Q$TF)hHPv9ZD{I4a84!5tpsvmp5af^}ize?r~WpuIvGz zW;Etc5>gsKsEUG#MsL&l4bu(!v zdXC-iDa-|uFhTT9NMG#+^C{AqymgvbpH^Abd<+|&FjRa-b~l6(Ye={2 zX%(>zXqCz%r^_LD)wxxm_yKFyTUr-wmrUzJwOJ{xKRMq0%E>p9h-AN9%_Hg0A;z$v zGBH0Y-LW5a7`vEdbAd^0a@!w$%n3;qN1(9i@1oj+?MG6VKz*_hYNbjEO1Bj-4W~=Q zz$Zm`A^WbdTaGCX(icA83ROQGnETo80*G`zGk@zRZbzXHTs15QFuZn|v43y8WxFy< zo|5|Pf*QJC{w*MFGAEdwW{z=!=?&TC*4Gt#N}jEySV<8{-sx_FuHOoVu^6XP+%4ky zLfaHMS-4#qdkBQ+FK#wONMv@#PA)|JY-M}q945{UVQ1=7-p-YR4DClFKaZXur#?~6 z(f^3b6eQnW-DCoMyGPlz^lL``m`mtNq=d6^|02$_%2+F>Kuqc5r&hX!?-B%T6_*|4Ua>nVt|R|-hqtYN0I@Fefp2(o$` z{^|`#gx0;ME^7_<4MAD`9PkkC)8>BVl zB&38BEMoxsPtQY+oGzUw6Lez%Gf3ne3NQbaq^08ENm@fiO;K2}K0FTa0`N2x6%E4~ zeY(CR9?%Cs8tpoX|JTHjL;xqszdya`O9aFt{*&5`QUS?`|C|Pjmk zwUou`$7%twh!}rgcL%4dBK0@jkBtCt_=3N0w?k?LBq5>;iED{U%EIR;{WS%@zPbG` z)_((0FVqb%LHtMEl0LvY`2WaAi789h;|~ES00`Wm1n4k;697%H{_72#kUI=`3x7Kv z1_)q*s32T_|FA37* z^blPRE+F_JK@Lt%F7E$j0%r{Tw|4FSq)WPczakb{E@0@we4Oatc%f;?gZAm>Au;N$>u|9cGfAD`fa8~(vWI0j&@hxUX5p%3i|_eK!pp@2Xz zob~@I2jm0+AD9!4KPUX(BNTuT_J=4yp%BOesNs&x{#Q=>>-8T+;EW$RH4w}VexwK# z!VQ66Q~N)Qp>P==PJ}OpJ{p67*&i~7!Xvl%E<*c@xSo@5BzXV9x{Pz!v4sE zK~OO0AqpUN$fL;N26J;i^pC%s|G#6fe-|@&>3Sd`99GW%gvmc%4Fz#NayU5Shdu)Y zv9tew!t;@D0iiGu*CV^b7e8VQ;siemJ1CUvVbOu-M&M(+bAlh%2q1`y^IvQK!vFuk z54YX}r-38=D4T)ceE$pKzYqk1;Yr|8c(TKT@ew`9|Mic*;}5=={ei;)!H~yQj2jGo zRK>XAiy!y`2oCC_iVB72qX+ZgXu+VI4-*ZX@uS6HcJ_y%1NUGM_XD)x<%Rp9fFKYD zJdXbt1^7G;;J=~?uKz#q!v~?j2f~0r?A(tW4$2M}=YI*pHF?zK0O1+sQFwyk<>mkK z_!s_Ac6cRvMDSnn`9H-8zW5;u@Y=)PZcnCbi9|6Sv zI2FJ_e0s?dFWv|1j4)ON1Z8z3!caxhzVuqdW<`Sp3{7cM#`R#x7;p7HBO1JP*{-_y+_Zp8XB|LvTiZD2|kA#62vH#NqOZ;6o q;8pQ)&4)X|1FQa(7anHEzbYUHI6-I!Ab}456A7J;PE1}L{r>^Ya@7t1 delta 50697 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 > 1) { diff --git a/fp_montgomery_reduce.c b/fp_montgomery_reduce.c index 53d6773..b0c2305 100644 --- a/fp_montgomery_reduce.c +++ b/fp_montgomery_reduce.c @@ -64,6 +64,8 @@ asm( \ :"0"(_c[LO]), "1"(cy), "r"(mu), "r"(*tmpm++) \ : "%rax", "%rdx", "%cc") +#ifdef TFM_HUGE + #define INNERMUL8 \ asm( \ "movq 0(%5),%%rax \n\t" \ @@ -157,6 +159,8 @@ asm( \ : "0"(_c), "1"(cy), "g"(mu), "r"(tmpm)\ : "%rax", "%rdx", "%r10", "%r11", "%cc") +#endif + #define PROPCARRY \ asm( \ @@ -306,6 +310,11 @@ void fp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp) fp_digit c[FP_SIZE], *_c, *tmpm, mu; int oldused, x, y, pa; + /* bail if too large */ + if (m->used > (FP_SIZE/2)) { + return; + } + #if defined(USE_MEMSET) /* now zero the buff */ memset(c, 0, sizeof c); @@ -331,7 +340,7 @@ void fp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp) _c = c + x; tmpm = m->dp; y = 0; - #if defined(TFM_X86_64) + #if defined(TFM_X86_64) && defined(TFM_HUGE) for (; y < (pa & ~7); y += 8) { INNERMUL8; _c += 8; diff --git a/fp_mul.c b/fp_mul.c index 71c5f47..a8b42da 100644 --- a/fp_mul.c +++ b/fp_mul.c @@ -15,6 +15,12 @@ void fp_mul(fp_int *A, fp_int *B, fp_int *C) int r, y, yy, s; fp_int ac, bd, comp, amb, cmd, t1, t2; + /* call generic if we're out of range */ + if (A->used + B->used > FP_SIZE) { + fp_mul_comba(A, B, C); + return ; + } + y = MAX(A->used, B->used); yy = MIN(A->used, B->used); if (yy <= 8 || y <= 64) { @@ -31,11 +37,15 @@ void fp_mul(fp_int *A, fp_int *B, fp_int *C) #elif defined(TFM_HUGE) if (0) { 1; #endif -#if defined(TFM_HUGE) +#if defined(TFM_MUL32) } else if (y <= 32) { fp_mul_comba32(A,B,C); +#endif +#if defined(TFM_MUL48) } else if (y <= 48) { fp_mul_comba48(A,B,C); +#endif +#if defined(TFM_MUL64) } else if (y <= 64) { fp_mul_comba64(A,B,C); #endif diff --git a/fp_mul_comba.c b/fp_mul_comba.c index cf51eba..8aa99cc 100644 --- a/fp_mul_comba.c +++ b/fp_mul_comba.c @@ -47,7 +47,7 @@ /* this should multiply i and j */ #define MULADD(i, j) \ -asm( \ +asm( \ "movl %6,%%eax \n\t" \ "mull %7 \n\t" \ "addl %%eax,%0 \n\t" \ @@ -266,8 +266,8 @@ void fp_mul_comba(fp_int *A, fp_int *B, fp_int *C) COMBA_FINI; dst->used = pa; + dst->sign = A->sign ^ B->sign; fp_clamp(dst); - dst->sign = dst->used ? A->sign ^ B->sign : FP_ZPOS; fp_copy(dst, C); } @@ -1497,8 +1497,7 @@ void fp_mul_comba_small(fp_int *A, fp_int *B, fp_int *C) #endif -#ifdef TFM_HUGE - +#ifdef TFM_MUL32 void fp_mul_comba32(fp_int *A, fp_int *B, fp_int *C) { fp_digit c0, c1, c2, at[64]; @@ -1765,7 +1764,9 @@ void fp_mul_comba32(fp_int *A, fp_int *B, fp_int *C) fp_clamp(C); COMBA_FINI; } +#endif +#ifdef TFM_MUL64 void fp_mul_comba64(fp_int *A, fp_int *B, fp_int *C) { fp_digit c0, c1, c2, at[128]; @@ -2288,7 +2289,9 @@ void fp_mul_comba64(fp_int *A, fp_int *B, fp_int *C) fp_clamp(C); COMBA_FINI; } +#endif +#ifdef TFM_MUL48 void fp_mul_comba48(fp_int *A, fp_int *B, fp_int *C) { fp_digit c0, c1, c2, at[96]; @@ -2683,8 +2686,6 @@ void fp_mul_comba48(fp_int *A, fp_int *B, fp_int *C) fp_clamp(C); COMBA_FINI; } - - #endif diff --git a/fp_set.c b/fp_set.c index e8c849b..39f4cf4 100644 --- a/fp_set.c +++ b/fp_set.c @@ -13,7 +13,7 @@ void fp_set(fp_int *a, fp_digit b) { fp_zero(a); a->dp[0] = b; - a->used = b ? 1 : 0; + a->used = a->dp[0] ? 1 : 0; } /* $Source$ */ diff --git a/fp_sqr.c b/fp_sqr.c index da3c944..c95fe7b 100644 --- a/fp_sqr.c +++ b/fp_sqr.c @@ -15,6 +15,12 @@ void fp_sqr(fp_int *A, fp_int *B) int r, y, s; fp_int aa, bb, comp, amb, t1; + /* call generic if we're out of range */ + if (A->used + A->used > FP_SIZE) { + fp_sqr_comba(A, B); + return ; + } + y = A->used; if (y <= 64) { @@ -24,11 +30,15 @@ void fp_sqr(fp_int *A, fp_int *B) #elif defined(TFM_HUGE) if (0) { 1; #endif -#if defined(TFM_HUGE) +#if defined(TFM_SQR32) } else if (y <= 32) { fp_sqr_comba32(A,B); +#endif +#if defined(TFM_SQR48) } else if (y <= 48) { fp_sqr_comba48(A,B); +#endif +#if defined(TFM_SQR64) } else if (y <= 64) { fp_sqr_comba64(A,B); #endif diff --git a/fp_sqr_comba.c b/fp_sqr_comba.c index d5a39e5..443f910 100644 --- a/fp_sqr_comba.c +++ b/fp_sqr_comba.c @@ -1945,7 +1945,7 @@ void fp_sqr_comba_small(fp_int *A, fp_int *B) #endif /* TFM_SMALL_SET */ -#ifdef TFM_HUGE +#ifdef TFM_SQR32 void fp_sqr_comba32(fp_int *A, fp_int *B) { fp_digit *a, b[64], c0, c1, c2, sc0, sc1, sc2; @@ -2272,16 +2272,14 @@ void fp_sqr_comba32(fp_int *A, fp_int *B) COMBA_STORE2(b[63]); COMBA_FINI; + memcpy(B->dp, b, 64 * sizeof(fp_digit)); B->used = 64; B->sign = FP_ZPOS; - memcpy(B->dp, b, 64 * sizeof(fp_digit)); fp_clamp(B); } - - #endif -#ifdef TFM_HUGE +#ifdef TFM_SQR64 void fp_sqr_comba64(fp_int *A, fp_int *B) { fp_digit *a, b[128], c0, c1, c2, sc0, sc1, sc2; @@ -2933,7 +2931,9 @@ void fp_sqr_comba64(fp_int *A, fp_int *B) memcpy(B->dp, b, 128 * sizeof(fp_digit)); fp_clamp(B); } +#endif +#ifdef TFM_SQR48 void fp_sqr_comba48(fp_int *A, fp_int *B) { fp_digit *a, b[96], c0, c1, c2, sc0, sc1, sc2; @@ -2985,7 +2985,7 @@ void fp_sqr_comba48(fp_int *A, fp_int *B) /* output 8 */ CARRY_FORWARD; - SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); + SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); COMBA_STORE(b[8]); /* output 9 */ @@ -3420,9 +3420,9 @@ void fp_sqr_comba48(fp_int *A, fp_int *B) COMBA_STORE2(b[95]); COMBA_FINI; + memcpy(B->dp, b, 96 * sizeof(fp_digit)); B->used = 96; B->sign = FP_ZPOS; - memcpy(B->dp, b, 96 * sizeof(fp_digit)); fp_clamp(B); } diff --git a/makefile b/makefile index a9ad6b2..b74b0bb 100644 --- a/makefile +++ b/makefile @@ -1,7 +1,7 @@ #makefile for TomsFastMath # # -VERSION=0.05 +VERSION=0.06 CFLAGS += -Wall -W -Wshadow -I./ @@ -85,7 +85,7 @@ install: $(LIBNAME) install -g $(GROUP) -o $(USER) $(HEADERS) $(DESTDIR)$(INCPATH) mtest/mtest: mtest/mtest.c - cd mtest ; make mtest + cd mtest ; CFLAGS="$(CFLAGS) -I../" make mtest test: $(LIBNAME) demo/test.o mtest/mtest $(CC) $(CFLAGS) demo/test.o $(LIBNAME) $(PROF) -o test @@ -143,5 +143,5 @@ zipup: no_oops docs clean zip -9r tfm-$(VERSION).zip tomsfastmath-$(VERSION)/* # $Source: /cvs/libtom/tomsfastmath/makefile,v $ -# $Revision: 1.17 $ -# $Date: 2005/07/30 04:23:55 $ +# $Revision: 1.19 $ +# $Date: 2005/08/25 23:53:40 $ diff --git a/makefile.shared b/makefile.shared index 74fa873..2ccac42 100644 --- a/makefile.shared +++ b/makefile.shared @@ -1,6 +1,7 @@ #makefile for TomsFastMath # # +VERSION=0:6 CC=libtool --mode=compile gcc @@ -19,7 +20,6 @@ CFLAGS += -fomit-frame-pointer endif -VERSION=0:5 OBJECTS = \ fp_set.o \ @@ -81,12 +81,12 @@ endif default: $(LIBNAME) +objs: $(OBJECTS) + $(LIBNAME): $(OBJECTS) + libtool --silent --mode=link gcc $(CFLAGS) `find . -type f | grep "[.]lo" | xargs` -o $(LIBNAME) -rpath $(LIBPATH) -version-info $(VERSION) install: $(LIBNAME) - libtool --silent --mode=link gcc $(CFLAGS) `find . -type f | grep "[.]lo" | xargs` -o $(LIBNAME) -rpath $(LIBPATH) -version-info $(VERSION) - libtool --silent --mode=link gcc $(CFLAGS) `find . -type f | grep "[.]o" | xargs` -o $(LIBNAME_S) - ranlib $(LIBNAME_S) libtool --silent --mode=install install -c $(LIBNAME) $(LIBPATH)/$(LIBNAME) install -d -g $(GROUP) -o $(USER) $(DESTDIR)$(INCPATH) install -g $(GROUP) -o $(USER) $(HEADERS) $(DESTDIR)$(INCPATH) @@ -104,6 +104,6 @@ stest: $(LIBNAME) demo/stest.o $(CC) $(CFLAGS) demo/stest.o $(LIBNAME_S) -o stest # $Source: /cvs/libtom/tomsfastmath/makefile.shared,v $ -# $Revision: 1.4 $ -# $Date: 2005/07/28 03:08:35 $ +# $Revision: 1.7 $ +# $Date: 2005/10/06 23:31:17 $ diff --git a/mtest/mtest.c b/mtest/mtest.c index 02fd483..66a2621 100644 --- a/mtest/mtest.c +++ b/mtest/mtest.c @@ -38,6 +38,8 @@ mulmod #include #include #include +#define CRYPT +#include "../tfm.h" FILE *rng; @@ -47,7 +49,7 @@ void rand_num(mp_int *a) int n, size; unsigned char buf[2048]; - size = 1 + ((fgetc(rng)<<8) + fgetc(rng)) % 256; + size = 1 + ((fgetc(rng)<<8) + fgetc(rng)) % (FP_MAX_SIZE/16 - DIGIT_BIT/2); buf[0] = (fgetc(rng)&1)?1:0; fread(buf+1, 1, size, rng); while (buf[1] == 0) buf[1] = fgetc(rng); @@ -60,7 +62,7 @@ void rand_num2(mp_int *a) int n, size; unsigned char buf[2048]; - size = 1 + ((fgetc(rng)<<8) + fgetc(rng)) % 256; + size = 1 + ((fgetc(rng)<<8) + fgetc(rng)) % (FP_MAX_SIZE/16 - DIGIT_BIT/2); buf[0] = (fgetc(rng)&1)?1:0; fread(buf+1, 1, size, rng); while (buf[1] == 0) buf[1] = fgetc(rng); @@ -118,7 +120,6 @@ int main(void) } #endif n = fgetc(rng) % 16; - if (n == 0) { /* add tests */ rand_num(&a); diff --git a/pre_gen/mpi.c b/pre_gen/mpi.c index 132c1e2..4a8a033 100644 --- a/pre_gen/mpi.c +++ b/pre_gen/mpi.c @@ -1663,6 +1663,7 @@ void fp_montgomery_calc_normalization(fp_int *a, fp_int *b) /* how many bits of last digit does b use */ bits = fp_count_bits (b) % DIGIT_BIT; + if (!bits) bits = DIGIT_BIT; /* compute A = B^(n-1) * 2^(bits-1) */ if (b->used > 1) { @@ -1755,6 +1756,8 @@ asm( \ :"0"(_c[LO]), "1"(cy), "r"(mu), "r"(*tmpm++) \ : "%rax", "%rdx", "%cc") +#ifdef TFM_HUGE + #define INNERMUL8 \ asm( \ "movq 0(%5),%%rax \n\t" \ @@ -1848,6 +1851,8 @@ asm( \ : "0"(_c), "1"(cy), "g"(mu), "r"(tmpm)\ : "%rax", "%rdx", "%r10", "%r11", "%cc") +#endif + #define PROPCARRY \ asm( \ @@ -1997,6 +2002,11 @@ void fp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp) fp_digit c[FP_SIZE], *_c, *tmpm, mu; int oldused, x, y, pa; + /* bail if too large */ + if (m->used > (FP_SIZE/2)) { + return; + } + #if defined(USE_MEMSET) /* now zero the buff */ memset(c, 0, sizeof c); @@ -2022,7 +2032,7 @@ void fp_montgomery_reduce(fp_int *a, fp_int *m, fp_digit mp) _c = c + x; tmpm = m->dp; y = 0; - #if defined(TFM_X86_64) + #if defined(TFM_X86_64) && defined(TFM_HUGE) for (; y < (pa & ~7); y += 8) { INNERMUL8; _c += 8; @@ -2140,6 +2150,12 @@ void fp_mul(fp_int *A, fp_int *B, fp_int *C) int r, y, yy, s; fp_int ac, bd, comp, amb, cmd, t1, t2; + /* call generic if we're out of range */ + if (A->used + B->used > FP_SIZE) { + fp_mul_comba(A, B, C); + return ; + } + y = MAX(A->used, B->used); yy = MIN(A->used, B->used); if (yy <= 8 || y <= 64) { @@ -2156,11 +2172,15 @@ void fp_mul(fp_int *A, fp_int *B, fp_int *C) #elif defined(TFM_HUGE) if (0) { 1; #endif -#if defined(TFM_HUGE) +#if defined(TFM_MUL32) } else if (y <= 32) { fp_mul_comba32(A,B,C); +#endif +#if defined(TFM_MUL48) } else if (y <= 48) { fp_mul_comba48(A,B,C); +#endif +#if defined(TFM_MUL64) } else if (y <= 64) { fp_mul_comba64(A,B,C); #endif @@ -2444,7 +2464,7 @@ void fp_mul_2d(fp_int *a, int b, fp_int *c) /* this should multiply i and j */ #define MULADD(i, j) \ -asm( \ +asm( \ "movl %6,%%eax \n\t" \ "mull %7 \n\t" \ "addl %%eax,%0 \n\t" \ @@ -2663,8 +2683,8 @@ void fp_mul_comba(fp_int *A, fp_int *B, fp_int *C) COMBA_FINI; dst->used = pa; + dst->sign = A->sign ^ B->sign; fp_clamp(dst); - dst->sign = dst->used ? A->sign ^ B->sign : FP_ZPOS; fp_copy(dst, C); } @@ -3894,8 +3914,7 @@ void fp_mul_comba_small(fp_int *A, fp_int *B, fp_int *C) #endif -#ifdef TFM_HUGE - +#ifdef TFM_MUL32 void fp_mul_comba32(fp_int *A, fp_int *B, fp_int *C) { fp_digit c0, c1, c2, at[64]; @@ -4162,7 +4181,9 @@ void fp_mul_comba32(fp_int *A, fp_int *B, fp_int *C) fp_clamp(C); COMBA_FINI; } +#endif +#ifdef TFM_MUL64 void fp_mul_comba64(fp_int *A, fp_int *B, fp_int *C) { fp_digit c0, c1, c2, at[128]; @@ -4685,7 +4706,9 @@ void fp_mul_comba64(fp_int *A, fp_int *B, fp_int *C) fp_clamp(C); COMBA_FINI; } +#endif +#ifdef TFM_MUL48 void fp_mul_comba48(fp_int *A, fp_int *B, fp_int *C) { fp_digit c0, c1, c2, at[96]; @@ -5080,8 +5103,6 @@ void fp_mul_comba48(fp_int *A, fp_int *B, fp_int *C) fp_clamp(C); COMBA_FINI; } - - #endif @@ -5657,7 +5678,7 @@ void fp_set(fp_int *a, fp_digit b) { fp_zero(a); a->dp[0] = b; - a->used = b ? 1 : 0; + a->used = a->dp[0] ? 1 : 0; } /* $Source$ */ @@ -5707,6 +5728,12 @@ void fp_sqr(fp_int *A, fp_int *B) int r, y, s; fp_int aa, bb, comp, amb, t1; + /* call generic if we're out of range */ + if (A->used + A->used > FP_SIZE) { + fp_sqr_comba(A, B); + return ; + } + y = A->used; if (y <= 64) { @@ -5716,11 +5743,15 @@ void fp_sqr(fp_int *A, fp_int *B) #elif defined(TFM_HUGE) if (0) { 1; #endif -#if defined(TFM_HUGE) +#if defined(TFM_SQR32) } else if (y <= 32) { fp_sqr_comba32(A,B); +#endif +#if defined(TFM_SQR48) } else if (y <= 48) { fp_sqr_comba48(A,B); +#endif +#if defined(TFM_SQR64) } else if (y <= 64) { fp_sqr_comba64(A,B); #endif @@ -7761,7 +7792,7 @@ void fp_sqr_comba_small(fp_int *A, fp_int *B) #endif /* TFM_SMALL_SET */ -#ifdef TFM_HUGE +#ifdef TFM_SQR32 void fp_sqr_comba32(fp_int *A, fp_int *B) { fp_digit *a, b[64], c0, c1, c2, sc0, sc1, sc2; @@ -8088,16 +8119,14 @@ void fp_sqr_comba32(fp_int *A, fp_int *B) COMBA_STORE2(b[63]); COMBA_FINI; + memcpy(B->dp, b, 64 * sizeof(fp_digit)); B->used = 64; B->sign = FP_ZPOS; - memcpy(B->dp, b, 64 * sizeof(fp_digit)); fp_clamp(B); } - - #endif -#ifdef TFM_HUGE +#ifdef TFM_SQR64 void fp_sqr_comba64(fp_int *A, fp_int *B) { fp_digit *a, b[128], c0, c1, c2, sc0, sc1, sc2; @@ -8749,7 +8778,9 @@ void fp_sqr_comba64(fp_int *A, fp_int *B) memcpy(B->dp, b, 128 * sizeof(fp_digit)); fp_clamp(B); } +#endif +#ifdef TFM_SQR48 void fp_sqr_comba48(fp_int *A, fp_int *B) { fp_digit *a, b[96], c0, c1, c2, sc0, sc1, sc2; @@ -8801,7 +8832,7 @@ void fp_sqr_comba48(fp_int *A, fp_int *B) /* output 8 */ CARRY_FORWARD; - SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); + SQRADDSC(a[0], a[8]); SQRADDAC(a[1], a[7]); SQRADDAC(a[2], a[6]); SQRADDAC(a[3], a[5]); SQRADDDB; SQRADD(a[4], a[4]); COMBA_STORE(b[8]); /* output 9 */ @@ -9236,9 +9267,9 @@ void fp_sqr_comba48(fp_int *A, fp_int *B) COMBA_STORE2(b[95]); COMBA_FINI; + memcpy(B->dp, b, 96 * sizeof(fp_digit)); B->used = 96; B->sign = FP_ZPOS; - memcpy(B->dp, b, 96 * sizeof(fp_digit)); fp_clamp(B); } @@ -9652,11 +9683,11 @@ void s_fp_add(fp_int *a, fp_int *b, fp_int *c) c->dp[x] = (fp_digit)t; t >>= DIGIT_BIT; } - if (t != 0 && x != FP_SIZE) { + if (t != 0 && x < FP_SIZE) { c->dp[c->used++] = (fp_digit)t; ++x; } - + c->used = x; for (; x < oldused; x++) { c->dp[x] = 0; } @@ -9684,18 +9715,23 @@ void s_fp_add(fp_int *a, fp_int *b, fp_int *c) /* unsigned subtraction ||a|| >= ||b|| ALWAYS! */ void s_fp_sub(fp_int *a, fp_int *b, fp_int *c) { - int x, oldused; + int x, oldbused, oldused; fp_word t; - oldused = c->used; - c->used = a->used; + oldused = c->used; + oldbused = b->used; + c->used = a->used; t = 0; - for (x = 0; x < a->used; x++) { - t = ((fp_word)a->dp[x]) - (((fp_word)b->dp[x]) + t); - c->dp[x] = (fp_digit)t; - t = (t >> DIGIT_BIT) & 1; + for (x = 0; x < oldbused; x++) { + t = ((fp_word)a->dp[x]) - (((fp_word)b->dp[x]) + t); + c->dp[x] = (fp_digit)t; + t = (t >> DIGIT_BIT)&1; } - + for (; x < a->used; x++) { + t = ((fp_word)a->dp[x]) - t; + c->dp[x] = (fp_digit)t; + t = (t >> DIGIT_BIT); + } for (; x < oldused; x++) { c->dp[x] = 0; } diff --git a/s_fp_add.c b/s_fp_add.c index 3a874f2..7b882e3 100644 --- a/s_fp_add.c +++ b/s_fp_add.c @@ -25,11 +25,11 @@ void s_fp_add(fp_int *a, fp_int *b, fp_int *c) c->dp[x] = (fp_digit)t; t >>= DIGIT_BIT; } - if (t != 0 && x != FP_SIZE) { + if (t != 0 && x < FP_SIZE) { c->dp[c->used++] = (fp_digit)t; ++x; } - + c->used = x; for (; x < oldused; x++) { c->dp[x] = 0; } diff --git a/s_fp_sub.c b/s_fp_sub.c index 41cc6c4..ffabee8 100644 --- a/s_fp_sub.c +++ b/s_fp_sub.c @@ -12,18 +12,23 @@ /* unsigned subtraction ||a|| >= ||b|| ALWAYS! */ void s_fp_sub(fp_int *a, fp_int *b, fp_int *c) { - int x, oldused; + int x, oldbused, oldused; fp_word t; - oldused = c->used; - c->used = a->used; + oldused = c->used; + oldbused = b->used; + c->used = a->used; t = 0; - for (x = 0; x < a->used; x++) { - t = ((fp_word)a->dp[x]) - (((fp_word)b->dp[x]) + t); - c->dp[x] = (fp_digit)t; - t = (t >> DIGIT_BIT) & 1; + for (x = 0; x < oldbused; x++) { + t = ((fp_word)a->dp[x]) - (((fp_word)b->dp[x]) + t); + c->dp[x] = (fp_digit)t; + t = (t >> DIGIT_BIT)&1; } - + for (; x < a->used; x++) { + t = ((fp_word)a->dp[x]) - t; + c->dp[x] = (fp_digit)t; + t = (t >> DIGIT_BIT); + } for (; x < oldused; x++) { c->dp[x] = 0; } diff --git a/tfm.dvi b/tfm.dvi index 7766aaa15cbe13cee61470cfb93f66ea38ee4940..1b76490eaade3bd3f756b95e226f09bc0a539ee2 100644 GIT binary patch delta 378 zcmbO;nR&rv<_QX1h6Z}ZhE|4##s-rNH75p7XHvg7@l7$K+2jPqc=3+z-boA%GoSh= zm*gi+2<}TQn#TNUh4JQ#j3La7e3KjM)h16!6xp1>x?GX*-{e9AtI5y(`8EfrZ)RhB z0GGAXGh$-A1C-s(=m{50H{8p?$O_g{z{IyX*Q$Yo@h?nvasn&gWbruh&A!g@JdDRc zsy09Of6mL;3RhvL$G2HLE{K_NIZ)PP@}|Vuj7~7g%^gW4tc+@4ZRQzvY>ZdoG8^*d zvoiVtWz;4sbct^6F8RX6sIj@BzLJYE0wlUwq3b>i;L1v-KjUB&1R7$! zdD?<-c1B~kjOL1Y96$$xWSBQz=3-m`ml4|2%gDHX^Mbu$T#OZ)zaO8+$o8G-J`ex^ DZ*`FA delta 384 zcmZ25nR(7+<_QY?1{Qh-hE|5g#wOhi3=E8uAL^=144%$pY&h{vF{A0^1jcyDw5;Aq z46Ua=JC>%G7MDz8ezn3-XR?ujf$3zyMAOYeOcKnDoRbq4s7(&A5}B;)%s2VnUg^z! ztaXZvKPTrWT1|fA4-qO*pTWj>8?KTs4kDbR$H~Na9jMY{@;-xNMi-cZ%{hj9IT#s0 zMr=;8>f>Pi0hiHrZsB1(2$p%{|D2bx0WQNAm%z-p2q^QI(H1V)n^eNes0dbWlVQik zcmXc6HE%vEqvz!Roz|Ntlzic0R0hgeZ$40O$Hf@D`F|%XE8|(Ph(rHhcE-zKb(Pbf zaWL|1PFOIBoly@gqPJom2hcSjog5o4b1}{ai;C~*Wn^3h7JaZ+nv1b`^Pl7M7}-BD H-3I{xY5