From 7c2a2c2dfa99206b029c6b13639c0da14d56b42a Mon Sep 17 00:00:00 2001 From: David Drysdale Date: Thu, 18 Mar 2021 13:58:16 +0000 Subject: [PATCH] Add Wycheproof ECDSA p256 test vectors (#313) Created from: https://github.com/google/wycheproof/blob/2196000605e45d91097147c9c71f26b72af58003/testvectors/ecdsa_secp256r1_sha256_test.json --- Cargo.lock | 7 +++++++ p256/Cargo.toml | 1 + p256/src/ecdsa.rs | 5 +++++ p256/src/test_vectors/data/wycheproof.blb | Bin 0 -> 31508 bytes 4 files changed, 13 insertions(+) create mode 100644 p256/src/test_vectors/data/wycheproof.blb diff --git a/Cargo.lock b/Cargo.lock index ad443537..87140619 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -56,6 +56,12 @@ dependencies = [ "wyz", ] +[[package]] +name = "blobby" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc52553543ecb104069b0ff9e0fcc5c739ad16202935528a112d974e8f1a4ee8" + [[package]] name = "block-buffer" version = "0.9.0" @@ -556,6 +562,7 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" name = "p256" version = "0.8.0-pre" dependencies = [ + "blobby", "ecdsa", "elliptic-curve", "hex-literal", diff --git a/p256/Cargo.toml b/p256/Cargo.toml index 69f73caf..c83c1073 100644 --- a/p256/Cargo.toml +++ b/p256/Cargo.toml @@ -28,6 +28,7 @@ default-features = false features = ["der"] [dev-dependencies] +blobby = "0.3" ecdsa-core = { version = "=0.11.0-pre.2", package = "ecdsa", default-features = false, features = ["dev"] } hex-literal = "0.3" proptest = "1.0" diff --git a/p256/src/ecdsa.rs b/p256/src/ecdsa.rs index 3e0574eb..a0ab183f 100644 --- a/p256/src/ecdsa.rs +++ b/p256/src/ecdsa.rs @@ -179,4 +179,9 @@ mod tests { use crate::{test_vectors::ecdsa::ECDSA_TEST_VECTORS, NistP256}; ecdsa_core::new_verification_test!(NistP256, ECDSA_TEST_VECTORS); } + + mod wycheproof { + use crate::NistP256; + ecdsa_core::new_wycheproof_test!(wycheproof, "wycheproof", NistP256); + } } diff --git a/p256/src/test_vectors/data/wycheproof.blb b/p256/src/test_vectors/data/wycheproof.blb new file mode 100644 index 0000000000000000000000000000000000000000..625438fddb4a4187cef505a5407da9401b7dc2f5 GIT binary patch literal 31508 zcmchA2|SeR+y9uc?|WHd>|~q43@VI$Un5zQLUvL1wd~ntFIteSp~zmT>|0s0mFy7_ zqVRua=$!h!zjI9Q>+^q3r1U@;)8IfF>DZ8*fzf$cW~pCU;{OIdR?3^1WhHdma0Zte6_H#E+4w2gJTfQ zn4;w-t1C^QY31g2-o^@gYFX;MW`tx{Z`vJCx2+dJ=VS4o?uO0cn98WST7gs%Y@pg2 zKH8=%T=RUVw%YT&^yT$tf;P!6enDJw-*lfxF4IBnkMyj35Rg;;Ry#d)Ase;g0r3kG z{3Lqk>s?93!PFPYP~7|lw+n{cD>UCDGcUe787eYKoAgkj8`nfnsM-~^)yD=38-g3A z=HJh$#_=!=>+Ckq-+25!tNEBCV~)}+(oD|`>Vr318u~F>_ARr=ntK*|-}R7%X2Wjp zGmIBF*#dTVccI3Swbg>}g0H|?resyC+*;p1`yOH7-QD0ht(Q)Jq0SAeE$Z9V@4=mi zH~Gbacp~`rYM_5Bm0KW3R$Y)S2)LlUe2uL6LMU=Ets(VRnGQU~B&XV)$nN#=oZT4U z4!g`WdNpbk_vSS^s|qfRUQ!z~rsAnx1?8qbU^w{#N|_c0b(x*@H8^({Y1E!Gur>1I z5m-7eLO&`ya;4h;@-fI3-R6axx6eUx*P6aLXM*THm!0_3@a2f4c=eSSHV|-worNNW zie)ppa=4QIE%uZr>^YwYymI6*eUPOF6u2N=qkpvvi3G3+>u{tNh1 zq!=F>l9cz^e(l@EU7z%%n#V@-KaB~*yXa&GFCH)H2M zK%jVaG}o2sJ`5LUgqbe;^qDhR$2V=9wp%*M(BQ2$Zs^DcYJ2}8UZlhA`o*153%Fhy zDQ=9p@NSx8xJ+(qtCwe!I2-5{4vW*uOTiAEzPE3((u$p`1p-?*wKeqFms7Hq8>`LP zK#!Q~m~o~8tu7y>eR6&I{9G@*{o&2dyKphphLmPhF)zn@ocf3t5PFn6ejfmq&YcZw|J?&n#fr|ou| zb*4f`!BCBUk`OZmVUtrnRG%EQh-dW9%}{Pt<@AvrAY@FIdP2Z4uB4)&7-8}S7mSXfsPn2*MpJs$ase z1ng$#0xUliU;eb4os;Vjg~I~VWM@B^-=0yx+UcMv`KR3nL$Y(DJ%c485N|9Hxd6{# z2?*GY1t13&aKFSG0L=&0fI1FUnT#;?d~klv;fh_8op+Dv!A`)!1(=`%JlVO?Ob-td zyCCuHTY_ce0iFjlWaq(Hf*m9-ENDMD0}m-m`(+qVJv$cjEHIH^M>G(-Gz!E5?k|Rc z@I#$>FeXC|+#DRb$&iCRxMwo%{+vcGbU1cnltV6jm|%w#kv(Q2hskXB@W60kdkZN* zFfbf2OyNMuU?FOZ#n^3h50uMKtV82PeMn30{mi92EI5pz^oN9o2W%cOfQ*L(h)+nx ze#np@&<=Qifp=JDgMI=6+XC1juI>(N)3Tpyv@n%}r%o*LtRdj9P0%4tm}t$Yz_3`z zV#K8nyL2daU|}leew08LDCp1%0UGUKu%H7g)G&q{S|Zm#2jl$#+`(YiKv=?|TLWx| zuqnfsiUwmnOt6CuWyfyAgk3`viX9lR>jYzZdk53QG74zKgTXNO#1at-(*pn1Ej$?d z4^R&V`|G|~qM{egm>%R|Ne8P{_}(qCi#UcMx?}kNnIZa?*fGRt5kQ90vw%e*uby0~VtP@x#(B=oT^-e&GOC)L1p`u!8$D-yIkVJghqxSg`{i z9E!c&yB3TK9E7Ex(Mmm7ewYpr0E@LnSi%16HNX@PZ-oZrJI=xOU^zDeUtGQ+_>00%R}qPg|g0{K8@xQEGX7dtR?zG7P{uu3fOU(F+S zPB0EXnDwB84cPI-vcbv)#sN0@SXE`r?96va>@Z*lPd{MnnH>O@`Uk0hu#67|Gr`Ch z-N8F(pLa0U-u4)Sbx7{VuCsXHE)QcPx(UE`Xlp?1S_MJr)2)Ck}S0h!rpZ_qR8305R7Ar<)dko^GmbClpo14;?EEMbuU`oJJoV!zwfW zicJH6_Gur@S#F1VU~53N_Z9UW^?cFw{T*8VW$8-A9Y7!&&6Tv9tnoOJtDU}@ z5bfMSPfFG1D1cELmURHY@&>T7e_|EgIl6?WWN)CoaRrN=g_$x{B;&{?8XU=)3%Uv5S83SFu5N5YT7ZFr5V8uiELYq6bGZgIB9s zU;MbhrTZs?b^c_q-hUhX^MoCm(O;C%)D9Z_+c%;I)4~V=ClEmbcYZOR2uBY6Zx~PD z{OTj%#oxn#7k}Rm2gq+UfnN#zqmQr{{I`#=82q=7ei{6msc33HufKfs4}*XE#=m@o z^Sh65e)ZAruRa1^{Ou#)#os>K{SzNyG5BvEVKMk`AN?};H&cK52mSb$kN#osZ{PTr zk9L3e(eA#F&`ET#I`(~t?O=?Lu^o)DCvb1tL!0++D#d~-+TcS&!$k4W&@f^CW3=DG ziFVM>>wjhGuV}wM$E>pSVZ2y)_%9)07vVnfXum$kUT8XhCN!Nt5t`ng2n`sFz0iQcf8a2^Llqhp zXn!CyEYSWyXuqKSCWrr>(Eb7KH)OPIv8rf#efXum%HpB3%5fBjVq|6OSRJbZ7h z|JywK>)>CX|J*NOJNVy)_8-Ux2<`XL|5u^?A=&{#`$Mz?g!T_;zkT`Ffd9MDe*3n+ zXM$h9{Oj|77us(l4;I?*!++gWlH$P7w8>$3z`RF_xhXx2h!o7_MhbD`azpqw>V zn{t^sA_fe#Tc%54ZX}uRxrg8Tp5}d;hwHt~V{W|8+m}velyzw{0Y6DdEhd5#6PFYh z5!(Z$FMfFO-nx#Xvu87N{15*dV*_tf+=5lcSQzdsoF!SY21B_71}tevt!=tyD{GbC z_<2gQ#00+b?CFqb+=ZN+6>maLe$J25yw!1I*Ta{U;i_`5dxCk`S2 zEIk}1ijWi)g(Hy?du-jxTgW>kLA-cD7xgs9B6uJpAII+W$>b49rY(Cv&6fv5g>4=^ zoxn%hnp6%p5L+<^3cWFwJRSDr>(MAu)YaxtF*I9INij(=7+eI7*xyJr6u?rsc$Ld} zx5kAds!T%|1IWwc+(kWC{o|-^o7^7-WL4L%#i4bbpVH<<_u2Nxnkhj^?Vl=4kC(6r zK79H()&C?K7cMF$CL$>c6WR@}* z0fy?fPtv{h|G=m@*z;00{tF%F4_;T#3Qw!_4BpVguoZ_PMc{C8xX3=+Me7l< zHQmB%>r!gj-&iNwK=6mhXlTD7z&@=M%%Afi0Nb=y>JxV|XgV0w88$Kxm&RQjy~$s zR`{i_)jTrvm0&0|-)(m?a_b_ZgX_i-DN+uP{y6rT?$iO(63*sV@9mi}bP-4~Q86SE zCb|#1-GmQzcaB-4%56!%+~U?}m1v;j6D*bck>_3%RfJR(7%H_UmK=U3q*T0gzDvr^M%*) zT`^=$5*tt5r>_EDc$>8iIh9Z`aAfqfbFKOImtUFwnmwi4}s0w#yhdjrb$Xd<=epETbNBQ9mifd!K z{4MYkCAuz@X|1m|oGvvRoqPU#DB&!cE<#d5ToeI=iS47pn*9*d$Td_jD{YDX#OC6_ zZ3uPO-2y8InNpMO$>=UHRQb8F@wGSVSDTG(`TG}2K3zs-j&Uq?$Bw;YFZh) zVYm9hk7w<3usXX@NP!d2Re-CY$^-}0JQerYNLc;pnBHy1P(Q|Y`$FXutj~abR{y}-PILOgJyUd*`9gB(#gfliSy+(06PFVLG0-# z8WVndDZii;zsgwNV3I25mPo#?&3FN)GB*ZRLJWzJ6o*S9_LE_q`Wk+ih4vi=e0)3c zXd8W^YZFOVyBYH9;}W!rOhd`QP?4EX zNL#nq?+dLJjaCkX?-xz0_)l$_2VC~lzNN#4#uWjaD=r}>g81p(njYtxiZd16gVJ^$ zVI8(igl@)*;zvYWrI{~f0LfI}ZDB>NftodvG)&_nm^Ez~>EvbXb?+YnFs@5q~h$yX^A2 zxR9G(F0Ad}oRowi=12M_5g@df5)adj`ct{x_4#t-!8^;R|l z?cmMZXjCLn#U+7x=jQ~e7e7|QX_fW8cKYKBXA3qW?<)nv6&aJ?DP?bwsyf^RrgN+Q zAFIeWzD*rf*J`x1I@hiR1YZ&6`$F7sT`9rkj#MMY0|+rVMq~T>f_jU{1_@prQkK2_ zD&{-hEa;@@k0YOSHhXlf^Mbv;5CD$t_msbM>iCqRCul2PS zZ5Z*`0I)#y5)+p|NB}eMKCYGiWY)Dj1E@T2;m!Dy%S`pb^4AOVrZY^$1WB@QVx`v~x!q0q2F&Uuqjz*q@Ww9!ts7vp@fh8NkMQ4~a@*Wv=t@@XM zp#k~cyrs?T)%Rq*WRBM+lJve#MePt#94~xn6WS1;%#J}7mjISZFwy;0!kL@7-_&En zOnL0Kg=%*+&yQucK=4XR5k5)f@88LXn}eZbyG2>sBv<_cb;q6w)oqZ)OpKU%x;(pf z(xKhg=2mq!07@&0gu{@)s!nWgItM-zrI9?4d%NuM?E4Wd}a)Hn3d0Y&wP zUKC8ZV5qq=?&-YyXAiB4RLczy+B1 z^UiDKsdc$o@r=4z2=vxy%^%yTuQMJj%sGCCJ!+#WJsb>m^KCwNPEgpQ=jl-y>E5`> zFOo{OW%Hm?H$FviH;J8w zUdg-x&F|fta$8`ieQ8WF^1PkjsUk#t)*HsiuQfAwDcs86BeU%(rPrK}W5`M(#Suuj z$j`}9HJM8}lm1v?@9^zg(<=Hc(Fp<#Y&?)TEA8T=f}7QEz)-p89$n&38BXB9DWg+@ zGDmMpCR*@@sy$Dt&~9}f>QBUYR!mG>1R)9}+Fr3G{9+%NnD<@N`d%}>i9VAQ{A0uP z&Go0ZbiOm@JFmBtp{vYAgNeQ#j}#TdljoVM%+%O6ZDb*7;NU_T7q7n*X|T@+tl z;TLQ(>}!#KuI**32B~^AXRBvu8i8R8tPbFk5=hv7iqXwn3XHf;Uuub4m_Q8f3shXS zW4{fo8>ufuDH_+~$^)=7ng~CcHq)rn;&pb_vYw9(S}7;EKgc9YFj(Q=O^oM2!vdZK z=5b*8vA=CV2(_L5HZGuZLUA+L`9<_G_%zHNgO2B06-0`Hd-@(umsue0K{nwTPEY9(YY)Gh&a4zz3T{HPM?=fN&NSq%N-W&m7DV1t7I=3C@` z`7XlAy7KzwG3e4em&XpLhv}^#cRnW0iL8gSyN6fX8CnAOO%x%oY$c%NI;~V!0|$3> zd0ku*A_||OuEksW;J}cm2%yr6!$g4@S3+F;=K`THFgaK#a`aN8mS-o`=;g^L^7M7m z4FS7jm379_wMVZ5xNEJ#+8q5?bObd@LVCj3%#a^Dvq&cxT(a2i=Rbo~=Am&Bk|JUV z5mBIq?a9{0NAQGEY2>+0$x8A&U@pRl(GDM<+a8znAKyeKeoxo{s+W4+nW7mRpH&D! z8SANz`)0xyif382NeXOT+X<3}4bZ4?AR7>XcSZL0&`{;fV~e!4#ogi=c^@jJ;ByB+~#<72%(nn*>c_^yj(FPjLF!a{uWyf%G3Si)R*5GI`RXjtHb z)exe97GV494*Bu+?!~H!z@eO29C}TI#sR7i>ePj%s}(A!`9A79_rcI(^`cuh@)Sio zOjX5@CSr1}R97N0JeShpXaR0qhW>{5ZDij|*~d~8%o&d1yi?BDLNyQg|_>aI+MGlawDP<3?1Y@@Hg&=1l82M8 zUa9e?-vCgl#ej9P7%-Lp?0Cd$*nB@f%EHrZBN_8RM9{d>aasLUzV-FI_p8KaylyIh z3$_T9QE-)G?^I8JEMzeH95wH6y&%gk(cj|8yZ+Vm@UCNiksi-&mzS9+E$#9v3pnBYSRKwv6ifX6I zEpF(VlQ;hOC^q5nmK^7-|d_llDJ7EZ`SU{FkTO0GqgYL|uhfLg*0+ z^CH2?bzR!iJ38^&QY&Nn_b*%@kM4z_6d)yzeH2K(|G8)fvVrnEHuSwi zB<_3}Cet^{?$^0CR_RuB&Nvu}uV8)ao@x%@ng@*Qnp4zvYFgmR1VQW0n{=Jw*)4Aj zXoo1THM<(O7^2LST~EcL+$^4ael+d=nLAt-B} z&X>z>EcawyB(lbRnyNGuHu8gx6aL_be~$TLPv?p{@3QDI*nL;~RZHW`mihoP=?}3k z8D&@JR|urJVyAEB`~?Pqpp1RPxn|GAw|`ih(bv$Qk)bVlM%m^@BhM}HV8Pg9tw9d7 zhy z9DE#<`s9(o6p%34d_^o-It@Ab+Y>fP-N&I`j!(rD9*KXDL_xp6bl-pO=<3ugoTt#~ zSy67ywf&O#{4s%vZZV&u;F-NsU3dpc_3HOQAalAm#1o+6^d-IZ@_bv_(cD>daOs+A z@!KBPTYOe$obt4Mb%VafeQ~(bX|zVy?(4dY;FSRZf`-de6jCk|m(t;VW)9np^Z8so%3w^f=|{6i*lg3fqKSAj3n#aGen`%b}Ek5t2~J% z?HgAnUU%@6hFs;wy95&flTnIJ`-_+JD;NYeXra#y-MDh&3cAXnAJP9=&)62J(Z3xT zyv+A>?iiCMAgM<9T}qibYg;$3)iV#pS9Q)t;wk&X!gZhKfcwTfUde%W(h|qj4HGl? zqwgd&IC{xhK{a+D^=Zc7X){z*7&FN)&Rxo~&mQt6>V|u6K_BNAU9Ug2*>+7WENel; z<%fFEk_iNL44N@JCOGRsWGs1G61Pd?<=G+b37@A^G3LdFHZSRjKQ%Eolsu4LMxxy!d!?ltHQ2IeC_Wc^&D(`~U&%RXUoNzZ54IZ(VQOTEuB*|*cW$sWXKalI$9!7CTIYy4z; z2hLv*k7wDdcn1}G&OR{I0JzX@M?a!3>5aU}XoB&e+(h|geKt}Th@#Zqfot?X{@Xxw z3Bi6W2uPMEqP@0eeNSJ#_b{9?chYtC7YN@1OHRmG%q|d&x~znum}s=7qF!C+2|g1l zBifi}7S8IYCK-YwKXF^D1eCs`{7WSb1gQP2sAFz^XWriElJgpwI`0op0NS<(aRjZxlN=4}rD@F!}r&UkK{bf)ig%$pZ2j2oUYt_+a_ML)77oL1*OFZF=S-z`AWODb=MrW#+q zN+_e8i+|?Z4%TE2q6>JY3wPdQ&XS8`@Me|FnqVW?2cDD!so0W;n|d#IVUzuf9B5WA zw(=Q%dFrVf!JsK0t$`z`7pp1y64$8G>c@&(%jU2TR6cN_ivju(efcfvwlGpOKs33- z1oGsLegNnUdkaJ|K5?5$xcvg<@q}<-`g(5yPn!KZ=`7FTr42V7l(uZZ$(Fppt1sT? zj~dg!kHEToo9wQAVMNX^M>?e4!^eKrHpjx0OEEU=o^9WzJ3?|p-5)25nAi1a$d=iO zpkzzY6oAcG5mi%8d2*;QTZ-n(tHMP~n>Ux{YPyXd)3}@GkvOrUj(uFdNFMomu`8l$ z?G$Rls^%s^q?kBzoFE@^^hdylUF_Lx&!3gw{p4116Mi!LI@9SL&W*GwuF~1rW*?&} z6M5nxfK7L;vJjbX(5K?Jxl75Sqf zmlo=*%&6Nh23>pk)RZmd$iAL{-IEkT$=Ur{`TmIs@O6NU=J%I4o0mIa>Z0SrN4j^q zcQhEoi!a8I@hWeqdYo2`0LZkwpwf%$CVYIZ;#?7h1xEy56qg){hYmw8zhz@*WO5}+ z!sCr`VBiRND6G|u0vGQ^%kWa6(&jWyyA1x^Wl1-{Gnj2@z`roTkO4ll9L4F*{ARaT zYP-~rVv&kJHNpeW^ljdh>g7)lJ91htLr~_eEMH%QjgDA9t?gn8pS`C6I+`qe%G`hJ zdM)F*b%->|-0NkV0H;ZmV!_C4-sHQh(FwT(jRL&{3&ktK%!z83u?~}Gpvt0T&h7)B z@0MGv@7N8m@UNOt$CfK*9Vd;;oOO&Rs@x$ z;VyjH-hjp{ie6f7;Kd$?zP&u>!mdA8hI0{$SKj$9!CtP^vwjn6GRlte@NEgEAs|FO z=+Ck?;(W4bLPhUCdV}LE|EW@QAWSc|q1Dfv3{0LDl1^uq&O^VQU~SZ4j1jSJOG3-DdB`ljp!oXP?A+J28W`AQITP$n@WB4e$(lTe zMHHmdfF5Q4tt&N@$&j=GNiIP-q^RP0x*J%jMwJ~`QaO!kyX<`}Xq zM^S+4bHE1`uNl>1JHZHVy?($mx1LV1@Z=Pqv{bX`9}#iWQjHjf&eh&u{IIz3C^Vjm zRu1&|Ic~uz8-I0VzkyR^-x`N3F~iD)M}EY)S8nW&<*q7V&4$k_%9MN}tT$(Nx-xA$ z^y#=B7hjC?k3ioyE44g#at8r6_ooEt99zHOfh|eA3~KpNwVq2-XELcdURdf1#;RHz zN2x(2SD7hOz-n*XL#N!>#vmL9N@Ah(8ebA_s(Osm24GEw#AQXmlQKb3u$9q}YU_kC zt7}nDgWii>-(nSLImmMqAoC@|Ga(GxS3f)L@;wfRqSREpA^u6Eu3_WqGovyq^Kf7e zb75(*{H{hdvf{Qjg78196k^fT_35S{fm)qBA2%LwkRH<@J21JS^dBbAF0*k)n%opC z=JXjYJko42MUUr9p7pF1UT^DHklt9ZN4m=o4)*!B8DF2O6hBFwe% z5T8rP&Ce2DmHMW#<4!zi$$(>ro}fl)UYBc}Nfmtefpb}M{Edt{L(Oc|=NP@nDHb#5 z6Kn%=poSt1A!lxxsZU0&DVmV1XOoR$XA-`jhSn9UzkPgM@egLGpxvo+N1}6+%A!IC zALEyr6)S~H$_f8_hexI!Y=MhMDgdfljFEHqu%YWe1zmWk$8KeA?1H(}>6U2SI$-zKRLEzBy75UCZuL6jJkP<#@XD`i{o1e%UB*$|S3eiV=%&myNnnN6-#I-{ffIvBNMHE_@ zkEByANfVflzDsXNm|?qYNWRe^fA6!TXcVyM!*+(MIhNj{I(j9lo4;m8wGP4D=Oa;b z9wp_1ADZu@5f{P&u!*ml^gY89YB^v^biGU*H~5O$nCM60U~>p)pwH3nUXdbhyr#zoT#7F(F&QhfKE zHOMI_*40GYA|LIV)dgXi)@4ncgvSAoU%^=`dPnSuGXsTA^K2}b&rV*~1U6Cr(n>e{ z$e!BtFYE+OJlZ^c?3@4gV_zDHLJ`)bscaFf*%;g*&FUzwu@KQcb%#T%Yj-ZDUR8J; zJQJbtI(XX+eU3EB1jZKrzT3?`f2hzBpX>;ybHCL3WVJw zp&-CF-QSP24{q&T^CxBeVHO>TbmE83d{H}dfc2NH6Eb7vEF59=6{8elE2!o3k z9p}L?EOVCwr9YP6b&g|!HMxaey_V+7 zzrauWl$y*Pj9h(aQXkHG6>HsaTU%S7tf{G)1|HFuiFlk4Sf;=?7SAkns$KRgz$Rfc zt3E}#_g>oNjN-}1B3G!zA({)(uGPAbHqohbpP!;2Qr&Y@VohR4R3cVCbuoD}J~Oo8 zO$hw#?WOUle>yqk&wPU%cC5?>eoYDb53PftjE3WnXu@pyiL)srL;#z&COOgfaZ=uT zP9I&McrY>1Bd|LlT~mg8n}(!XUTry34zznc)#=jJNtSGp%Cp9*<+)A1HK&y0vtq7= zX?Q6ip1=7sI>+<#3j%M$u=4XDYl3s8RS}vYv;u} zQ~>}3^u8C(1bw|#c);RpMSJ$1&q&aAijz15I&As_Tq|0qL}B=Z$DBx=%T(3955=;t)8>_i6*FX_n)W-BL#$ z?grSyrud0nO&aX;e|v){sxJPGZ(7dK^N z%mRH*ISq{MX`Su2H^9)1ivPU8P*LDQe--_RzPOs&YV|YqW-feLGZyha@et?Q;PY^WdmCRS0FD!MbIgA&iDy^;F=%5t)nxUi-D_fLQey-xZ&u(GYF_NIeM%?i0qw zXA!m&9xF_UToRQZ%GPO~2Zsr$0>Tsi&1987AhpCgvxqMh{87*s zP9O)WJ*jSPRS@n|Cx&n>pE{p#e&+;%wD7j4tg!1Po8hyW`$g$MHf$jDFKz;gBiCMq zROPfZ8Mu?NppnPaG4yTQ{z5xICxn^5x;sXH!8?63OLZBk(7)hlR7SAV5^1{Uy)i> z>)znLQdp^D#OJB()sfyp-w1e69&A_9D}!~c(8~Q66$52Shn9`UXVTbwX~E$_8mu1) z;j$``BV84jF$l;Hh{Tr%O1fKrn}z#_u8yYh83~OT(?Y@lMVyslr-;^`r0#s0pG}Md zLj?sQq=Nn}TYJB1t76#r1_v1lzwXGur{$KNjprc{6j`Fl=I(R493HoGuD9~CTRA@C zWJjotlZ(+62G0`Kh@s#~_uYl(`4%PO`G@8mw8vZ;@dy*M#n0+=o*xvd7JY@aW9YMW zgm{8JFg6R+-ewt%N~H_#kv=NRBJ70g*{DGOu?A@F7_AWyUbLUhi9qPk!eT5cE`7Jb zNrpPe&ZtalX|}SV%svKuHchE5xvbFl*eF$4@ALfkaY%k!$&$nbjink6P-`%o(Sv@q z9To|NqR*;K5jiWrwJYpxqObTaQ@Eeq*?*IKxnYizQXM=TgYv0~p0;eND(%W(-?%q* ztxl;gs6X6usqE?bQuyHAew%&$9>@iYbVBhk58eXd$P?LH_RdYVh8r&lyKwYG?!Nn0 z`9vj^HcTHy%7{2*q(4<(<2>ulPQ0Ufi&_peA=p^{9CA%fTRb|s=utLd!IxVz z{gJtx+MaD}&iB8KV;!agb4d=A+Z(WZ_Xzi4Q?Jc?f)6Wr!DlxkSLv}Pb6_q3Z!Vk?5IE^>lE<5A z*BHd*de3CTY+W#{zzx<|S3UG;%M_(?Nl`)2I?;q9#IyIrg8oM9UCU#PE3&;8gh)I| z6Q}^8ajMU zH=DhU^J$X)M=d3Sw$%{<_UE1?Cv`Q5mP|WVkE}g?b1(OF4Ep0l2hCM(Ro*?nZLql5 zIsCPqlql@u$K@5d);X~zfqWVHIRNkH8I`aNdV@S-9CLv_g7?!Hcst&`u<297OuQfuT@F|vxBlPNqObi{1U zP#lAWZf5{*-k}=Ud=_QOlSus}m!*&+F((BEk`uphHFR4geWpTu1VixA+x<-jW@PtJHi$OK9DYO1wXH2upqoxlN z;JXHn(pT?^&H$&sj8>cUri5CRXx!ygiFMDAzONp!3DbYNA*6dRj+Xmw9R>^2XVK`E z%c!p7_5NSF-w(wSR@Of7 zX5;t- zcAszoz7jNNP!D}d6E|CbIYL|n`=k|n=yPfF3;pU)ju7Vn;T`;9c&*qOIPTerbbX*$FtFP;&O30YmL zoAt=o6ON2)FHZTL)nb-Wxywa^#DMLYSy}4j&K}y9tYDYdJ3V7~gIJ8wYh{#?o%r=~ zs}|>CC}8I3Yho8-nhacPW_>?`nn$ij0%;vL(%RR|4LG#gVySB($M{M1GhpzzFV7Kf zs<7twWYL=!b`b-~i$%ySwFZ5G)-=;Y(#Q zm&gdl>S)sVFkl$XnpZUkn@z`*N|`LpFnqNf@CXa!FIgp>voo#67tt>P)~^C!ySaLy zZ=o^iQ%G8a|sh)S;xfU1JHNoU30qI$|8={zo7NrxHR3`@cz^~Epz%SS=klJ zX@!uXg!F+*k%o_zpCW?+w4KFbo!3m=2hzbrnjX%6kOvBa}62tPbD`n!swC%Ss^JKjl z=T+dmuaTtwxz1igSh^i<;Y1yU3(c)qztBelrR`@or!$i~jDKOaG#suBou3~O%gSmz zQ}Ikp7N8+Kn zxZliXA}&c0*J4`u~bHP{VoP;FP^OrQr=mWLkq}El}X=`Aj@tdZuwOOAG3+S zGA#Bo#1LJDy7W(2u1K@-C`vMxT*X^eq?Y0i`F!%`F{$aHa!a|XI~X)fN%KEP{A399 z_U%BZyWv#-TPucIeL_X#%o}D=r$NwBBXl*ssq-uV%39o_er>#*eX7vLI-F0f2$AnP z!?R1mP@$9$q2T%%&Vd2avy5{e*BxJH2R1;wCuAa7)YyX3Zf)h!sCO(Hd(ImfeTgf`fhPZ#|p5 USlVb9pdr{XT}Gsw`VjK}0D5LX5C8xG literal 0 HcmV?d00001