From b2c566976d901c3780c8af1a23075f6368f1080b Mon Sep 17 00:00:00 2001 From: "Roger A. Light" Date: Wed, 8 Feb 2023 22:31:20 +0000 Subject: [PATCH] Fuzzing: Broker config file testing. --- .gitignore | 4 + fuzzing/broker/Makefile | 9 +- fuzzing/broker/broker_fuzz_test_config.cpp | 67 +++++++ fuzzing/corpora/broker_conf.dict | 165 ++++++++++++++++++ .../broker_fuzz_test_config_seed_corpus.zip | Bin 0 -> 46383 bytes 5 files changed, 244 insertions(+), 1 deletion(-) create mode 100644 fuzzing/broker/broker_fuzz_test_config.cpp create mode 100644 fuzzing/corpora/broker_conf.dict create mode 100644 fuzzing/corpora/broker_fuzz_test_config_seed_corpus.zip diff --git a/.gitignore b/.gitignore index 12c8f647..1569c73e 100644 --- a/.gitignore +++ b/.gitignore @@ -48,7 +48,11 @@ examples/publish/basic-websockets-1 fuzzing/broker/broker_fuzz_initial_packet fuzzing/broker/broker_fuzz_second_packet fuzzing/corpora/broker/* +fuzzing/corpora/broker_packet_seed_corpus.zip fuzzing/corpora/client/* +fuzzing/corpora/client_packet_seed_corpus.zip +fuzzing/corpora/db_dump_seed_corpus.zip + lib/cpp/libmosquittopp.so* lib/cpp/libmosquittopp.a diff --git a/fuzzing/broker/Makefile b/fuzzing/broker/Makefile index 0b7e9583..f571d024 100644 --- a/fuzzing/broker/Makefile +++ b/fuzzing/broker/Makefile @@ -3,7 +3,8 @@ R=../.. FUZZERS:= \ broker_fuzz_initial_packet \ - broker_fuzz_second_packet + broker_fuzz_second_packet \ + broker_fuzz_test_config LOCAL_CPPFLAGS:=$(CPPFLAGS) -I${R}/include/ LOCAL_CXXFLAGS:=$(CXXFLAGS) -g -Wall -Werror -pthread @@ -22,5 +23,11 @@ broker_fuzz_second_packet : broker_fuzz_second_packet.cpp broker_fuzz.cpp install $@ ${OUT}/$@ cp ${R}/fuzzing/corpora/broker_packet_seed_corpus.zip ${OUT}/$@_seed_corpus.zip +broker_fuzz_test_config : broker_fuzz_test_config.cpp + $(CXX) $(LOCAL_CXXFLAGS) $(LOCAL_CPPFLAGS) $(LOCAL_LDFLAGS) -o $@ $^ $(LOCAL_LIBADD) + install $@ ${OUT}/$@ + cp ${R}/fuzzing/corpora/broker_fuzz_test_config_seed_corpus.zip ${OUT}/$@_seed_corpus.zip + cp ${R}/fuzzing/corpora/broker_conf.dict ${OUT}/$@.dict + clean: rm -f *.o $(FUZZERS) diff --git a/fuzzing/broker/broker_fuzz_test_config.cpp b/fuzzing/broker/broker_fuzz_test_config.cpp new file mode 100644 index 00000000..0eee3bcb --- /dev/null +++ b/fuzzing/broker/broker_fuzz_test_config.cpp @@ -0,0 +1,67 @@ +/* +Copyright (c) 2023 Cedalo GmbH + +All rights reserved. This program and the accompanying materials +are made available under the terms of the Eclipse Public License 2.0 +and Eclipse Distribution License v1.0 which accompany this distribution. + +The Eclipse Public License is available at + https://www.eclipse.org/legal/epl-2.0/ +and the Eclipse Distribution License is available at + http://www.eclipse.org/org/documents/edl-v10.php. + +SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause + +Contributors: + Roger Light - initial implementation and documentation. +*/ + +#include +#include +#include +#include +#include + +/* + * Broker check of config only, the config isn't used + */ + +/* The broker fuzz-only main function. */ +extern "C" int mosquitto_fuzz_main(int argc, char *argv[]); + +void run_broker(char *filename) +{ + char *argv[4]; + int argc = 4; + + argv[0] = strdup("mosquitto"); + argv[1] = strdup("--test-config"); + argv[2] = strdup("-c"); + argv[3] = strdup(filename); + + mosquitto_fuzz_main(argc, argv); + + for(int i=0; iqKwG3g;dDMUKvR;FUj7~Mplusqi7(hXeyCNWslT{5|Sbb z6=kIQpL5ZDzwdBw{l4Gtzt7`*9`z{a`C8|7#`~P-%UF+&o{nYGHvr2x-K#C=)pn*= zerYL2<3B=;1EF^H#GTv(1cFVNyin6}x_Wsc1mmD2n39wXWx?=06AQQfwZp`EAQ)_` z(8A$Nh5uQ+xu8_abDK+wv{X1d;kzUj=TZ5JBl18L*j5sYzq!R!9>t;+P&4ns7e!%qy)+X`2Tx3@2POmlxzHtK{i8X(pm) zRrIRqQG#;l=QvuiWs~j9cYMw!1xlHPMSdPQHYVgGT;XnS{E;W>Q5oa>JcoNLM}mr< z^ES#aX~`WiF3ZmOAb}46jY#3-lq%8UOW>i~DD*()>T=0gj&Bp72bC|Kk>RWEsTVA*3Gc+dX=kL*8 zd$1H^8Km)|`c#qW@{qmWTiH5IRE5+IrKv6JvvOrnm%q!TQg-)>fbB)tAPI7HcgI^5Mg^(J zsF7xT2qUAza{NdlO)wxuI-WW!GNo7tP5-j|x#q-wfE zmoCRnXndKB&N=4ug^VNr{WrE!W*}y*n9&Q@Us~&ZCGi0OKSU{gV}?U|v*`fImihfT7`&v{w2G0ch9+(eOd8o=#ptei(OGPb>!O>E!C^ zLXZS0r5hHK60jiRkoJbQ#i^u?>l6UIJ!pJr5kj!OUKn?*r;Gn?j4NUsuL0hIjbI$F z)5gR!R*OsM)YHktY}3<~8F_Y$Q#VF;+daDq#t5$D-ks4(N)zwDL7&KYJIfE$r9U-POa@pI;hbBp4?7KbHBJ1BoI*0wNzZWR{3)2*wnmONopSKF9hS1*aNSSu=K@V>_2N>pQ=UTw90MkG78k~QM=LIfJIe16uC*@Xyh&PN(i2Db`v^>lW3b=mDtXi6v(g>Wac7=g3v zY_GOB2k}dqFTvN|DkaDFnA>(1 zhXtBUpkVY8{pP`lj(O@GG5AQ-n z5)%||-G(yNj6eNmh5}xytK2*LXQjfe0Pw~lk_v;}>+R}`SeQV;DEN`wAVvC-K)C6d zh$&se!Xo=^859nBla$Fw57hUCosMt#h)lNbns{7e-8vnNm|mTU)H^sRCB+Re1_p>B zsmf&lMkHez505wJJMN^lJUg~;_nwCsj?j^5YLW6AfJCt2avFije6jxauAUetS3i3P zcjSVJvM-g$EOn>5w6zbkcXfxI^5d5vcvoJs`B^aQN@8oFN95lG7&)Ql3b1J(LTkOl zUZ{gBiT$AArerzHjDZ|?V;$YVlpNseNDxyb0$#q(gz=FSGhNf~jMd!QFSAw+x*lJ& zXL;`ip+KJdKWi#}(Vyx(s%2VtE=cMwcL&B(JR+X;9k;w9w@`j5R>Ny$_o1jptQFm{ z=L**?erDWmPxa<{6~n)|S1x?C=b3lTeO6oiA_$7@aB)eZ9}u|;v^8+Fk`x=`4d*XE z#EODUI*A41S4gqZH~rqEDZ!SxSoNAGs5z+|ZJ?U9gPS?Y}Wuh2`vVOOpk?TdG;h4=Jgv zC_BI1a`Az!Wy~E@We(iFrA>%M-4CD-3v+iqT$}y|4Y#P9Qy&n#&dwNbFJFXa%fMiV zjUW>x#g)T#s>bmC`6`F4>iJ$52vl(i{kP@S(w;88N`voj9=AKmj5v!GJ{4zte)RC3 zocuNpt-7B?#=@w@2xQfpJHfW@zuFUJfJiO<=15Krm$PB@u3HPFC&jon9 z_}V*RF77Vm4OguOtd^jWdiV;p>4om{XO2N?%nm@Q_v@i6b=#aaPGf{j2dOsv}C z3NSwnA3Q2F6wl8|pPBcpa=xC<3WuU$k)+F|Lv>CT7j#$ttldO&{<&`Rb}@-FEs@SF z+1Su{QxWsgvA!3v6JsK37D)*sd{=RQ^M9V**Y zoT^bhVrX;1dm?QxAxs5tYZ|cH#4vmw3#L{n8N5=ffI_elD+LER{cy<9tg-cr!|(n) z?z1ABvn|;zFZdAqLcfle)mOBVHf$K)q*&~xVS=Vprv$ft%5G(e1z{)W6 z{_G=W;n)`W1FyZ8{CKm_{J4VQmnoCi4i=%0?zCZexKCwv(_3Z*Nb8(>WN6dqJ#l)l zh2{`mt9d}Hq^ZTR$v~@C(yns1_s7njxq!0_yjH7$Mz9fRW!_LeJ@)rKa45eo92)aW zzb(glk>JbJ4zr*8tn(PsdYDh>m?SdFds_}L=TsVYNeeM{u*6xs|$CVX|6KSWf{QjyQu-R&aV9*o`SE}6y>aLy#H%}nlp`(*P z<(UkQ*Bp);5(@$I6U~O|0?ZM^!Hi1_(h8kCN3h!6qp8BGCzB1jb~UcQkP|f6TK1DM z+ToG?qnE2#5-VC4#7qxh*;V4rSVHKTj5SFZPoc1=iT%kCfrhD6}pkMbZ+!W6= zXx-a(FssohIro(v@4Bmr_Q#go-?BvRgq-o?SMm+QvO0W;pH-R|*11T0301$N@bUh~ z_iqmMa&CS*xI26c|9|NZj-*>XxnG&7wKFg4o8-`g!DpLUELEF-#uOi6d>*JLgP09q zPWg_p5t#($DFx=i9W0>DT%Akhq=vNP^}z?hvTSR9@2$!>#BO&S0nQY1iACgHIpG%F>$aUzj|d{e3Cpx7`d;p<2Ng?J~u&?QK=_ z&fj09WG!|5ZAp5^cJHiw>#v@J_rD#Dy{~%Z?&tQ~UDtk^d2o$?`|r$qvlhjhY>RHz zJU5T}z02geP_mzpdEidN?-QQ`ybpAHi8nY|@UDG`QBGT>B9vqNe4Ws{%YkE6>&jnr zi3CT{JEU)Q6bIop$;5T<=avomy8>e;=PYSP@^kgj7A z%Vg=_nln#VXV=-7M5AP#=8u&$YP#KaCX9jd--EvE2J16FA4@WCzTJ1=W?ctY?R@stWnFUlTFS5H6MJutoxm(OL0dY3SewCPOBUU+ zyf?sDuE1F0sO0PDj8V*Q4LPrjORYu@!qxr?3J#y{oewlq_@byZgyjXFJ79kj1`V!A$2vn77@wdxnF zRY|WIn!_`=WHL>y;(u1ZT>AKYmg`0N!FP9_ooM*MWVKpms_(>;ZA+5YGS^PB3&$zE zcrO&b>QPis+lJ7qPd{3ZvEV}v4zaK&&x^Z&757kOMI~t>E0P&&=JEB0l~T;%!@)7y z8TZ{)-w$KOy*{pHQjmzYelzIPu6cO%`_J`zH%5EQikUfvgc#1#9HlGVJ#pIKwfW-~ zfjYBx&szU@6&fwBn7+s%)8M_?5={2}ytkk1D87<($4-^s(&&*;_?2wq^(j5lbS$}6 zYu`wjWghDv`r`jRVb}g!tU0nSMWGUb``CZR^>h3BJb7$l(sNSQvl5yvyAs$*bto#y5E)SbgduDM2@4xv4vnZW{0nD9E{yop@%IKc z9NkZZe3(Ee-d`xlAsVS5`(5x5s&4Du+gGynb_B0H9{%a$xiVTo%+Z8C33U z;$*ZWU+Llg!~|;-m-}T*2P4Os{Ctv+T{xc{nX&uK>k8FpJe{c`r%DQc93R-SwBe23 z@yqAlpKNt?Y18f6Ff7SoAUK}c#cO14kiaN0V02gUK{|$2`WKJZWaZU0lOcP$7j~fo zQC~rN(N17PAJ8ZdXC+x%2U|F@@xvJgB8i=d!EqDDaFFzW?~B=$b$;QovpKiEUFC3C zt%H5per&R*ONv?j1uxIXNLN0a)u(Lr#izR7Np+1L_EUa7bmfh-{~M>(x#&D(t{!Hl^%iFuQseGmFqiLW|r^|e*d zZ)Asy?=@qObj-8Zsd-Yu!d)r>DW@Y8KCWi(y=LO3YzOl~r;qk`!JgkGX3vc> zY*x2f>Wancw=-Cu_NjY`ltlO)@)r}*yct>-a;R_cdpCEEyEsw%q)WU)d^7 z*jE^}S%k7Y?A=G0kFGobOD5{WK%Qh6keK@oj;nz%V51)n*4)h29Cqx1u;6t|+MeTe z8p%IPFL8TmnsAuA*x3R8TzzDW6C0QSVh3i#v*)+ z_6lZab43o5ojs{NM>|e+EW(EYoR@Y^_UY`PUW4^S8jzWnpazHGHt&F@igEL?4{o~F zmZFs!OEssU{9wj1Z!b6QVsRW^dNKpZf4j#1U@KjNhw;9fp^Z}-8SBc64pi;PosSRW zM#bK7J6UWHVvz}x*~XJ!&-{h_ibV30NoG{a-}C1GL4G(4^S}18QY}9?$|sVa%rHdB zZ^9Z{AnIY0&Bm_7@n!7%t`e3IW3=lQIe7+N+V=u5l8#{*{@>%wB0hZVP1-l??w%J3%f zsQT|Vn>~EC_w*{vil1D?Vr-t(?2}%4BR}^GZTu|`!(QLJ&V|h-3+ZAVzwL}-HOlQY z+W+MPO^%+Sr>4!|FNyJ$Zzby&l>^SRtzVzPF=!?=N(vpI~j$_MOV+EPtoZvB6 zuazD4pj&alE8R<{StIoK!lHUT^OlRD?Z3FMH4HnqD?M5DNI!G$6^&J@n9b<5tbfTSe-i>#Wej_@H z^4a@=#4MkG2rTtn3`9Sn!5A%bDKT9otKX3r{34PDpYNg zsO#qaQ1uC41e0oFhUn$yq25I-xfS$^%rEvgsBBynvi$c)+lH;iqN1nes;-O$HQX5~ zv#W{7b~olSaE!Stte~)3AvEZGC|DPsF|~>BSoA5%;YF6~dHF$l>;BS_A*bl7?p4<} z9Vpm&`I1I=;T2o^cmC!!ah<;x3QsXxSKEzUzsHAM)WDVD@~xk+e=&|oXJV2QGBS^a z{jZIq{FpNd*J}kpSO~mmb8UNeF)y9Dhq~_Q}jP^~5 zmeunfP3b$ChKXlOw-s?tZR)HFux!_5$^)9qU}8{@W|H%; z(>0uZIezg1YQml_KJ0cy{_Cw4PC4%?^~h_wB7|{oeAZ7Zp8hMr$lsuG>rzgE69?`h zvN`nPwX=?kFZ_)aC~u=};&9t&4cvM}^;r1$PGOlmwd7|!pIqk`iA=4pQf?gC$nE2e zJ@)h9p@jl&S2F~5^i(_D{p`CVbY=NoGw&MByIUg45+lmnHhoX;xa`)l>W6v}Q&avs z$>LoaXPTIg=7ogWE^ezlC-zP}ZI{If7qJF|K7RGkS4wg0oGxvz)G(&nSZg{4#RbXE_Ahlqyhje){iU%nVyLUD;%0P1 zo=^OTBg%EUjiX}%CQE!jy&=ehTTd_Yp#`haHqdb2-2NyIzQBM>71Ouaz)soUAAPd| zs!r-yp-In^P5_+4ZOT>M6Lhjh|JmgeZcZ;azp{zkU`(}3$SIQ45i!?tKmPN`8_Del z1WoEn+03%{v*q7DcklM#`1j4cQ76kbIW?$6x9jV_$&g;_b7xz2$GlQiu_Y{@0y#B5 z-931Kcam3S5+muXl@*hB$;;}M;JIhvfvhG?Yq=S}mz&-Ri(SEA>{k0SCYrOa<%K%ea7Z!aw%)#m;`0aQAWqw+lg_;e(3@SQj>e z;4+Av8CP(Eo*q}=I8M{|?Na6Wo<`QHTRLOA(z`EdrNy{4rZDl}+_=%XxWuEXkmlZZ+PO7|P0)prOX&W!%3oT$q+|6DAF$PaaXYf*T3SJ= z1Y_!P>HW<=pXkVshd3@t;Qy414H(i3y4l}0^=nb)!P}dBH3C@Zh3ht)5Fb5!h29Ge zsp+q#a7f7xZ2LTWxdL~ztAM-AG{>z9G9zj>2*H&hvY+JVzM2BX`5<51Dhr&j88qDG zg&A>>VUD*y8Br)*-H9N$x??PaIIbK8QUv-u=DP?a=mBjhoN*K}etzyVAFS~3%)s@q z5x8GIPR+AI6-+LhA8XriyR@-|r0q^sEPqz%>2ZQBq)qv?xA4liyXsiP zzR@5|W*cJC7TzR7&l$aOnc#LrXJznH{k7a_Fjorrrxe? zd9TvU6o08j{MP=w&B@pF&o&)4#FwfMx8FMqHqoRwpFhf4hG#rT;Jdh8*O@7fbUz2!hX-1ls9>P_ES zal+v4HY0Cikn>=i+R{+CGTJnsyXk}OMuXgBnq^y*1@jhXbjHN(OP&}mo3J;16#i`I za7w!0luG-Z0O`@nwuh-M^wo5Xmo!qjWk1y3G2wk^%wo2Tc0@G7kHc@t^NXmF)s@-%bCoh+Wd3i$UwKXiP*A6dA7RJvZLF!=A9-b+ zO~*tQZDg%FtkSJA@o+$Kir?4WX64xMj&xmv#L>keh(QM<)Zk>vIJ|faBXmw>e6fLE zZb;XWjZ(G6p;Bx(*TtJ~YZ=f|I^w-g5v@*yv0fMr)0Kh3mKoT+kI((cSL)Eyeak-W8|B57^i_V zaaw!OCn3Y`vPn}}ZVy|S!hV&7!)rbLf2dC1NS*%d50%XOo@xj^_J)$jf?WM~qvlp} zO4b7cQib+_y*OCwm=G5&YTeT`D4B z&XIO@fcZv1_{rrhC7Q+_KO}0k=dt=)ie2WGSZOU7@pw^xA@?T{k&?zothy0bqr1P@ z=y6IMS@B;yV$l5r%4i(OmOlg(p#dISfu9y;)1)i7A@1+$AB>MWJ`i=V5lj$C4Y!)c|Yhh)c7VTnYis_%)=9| z^aFCLFXcuQ@B8%+hJ(l&|?Z*ZboN*a(=0UDH8Z) zQ*PD#OZ{3#Vdp=1MSDBgD`$Nly_(9iy|`@HM|x}6lP~LS)E$x=H_5xYC3!aAUPJ%O z^~rAoLqB_s5bgPS;>I%dX0}6eV;<`~1R|Bvq*q4j8LC^bF8e5QQLU?~V86pAR#uKc zv~IbCX{7l(n9=B5sy%Z?TSQzb*EpQ_>W z?9+AMk7}-LTh{gYRf6#;SeKDzgDN~-wKf5~DXt~>}F zk!yG56i@@sO1$_1vOB;V@ktwRekL$9U?UtJvE?jbU=i{ATIhn~)slHnZq(7{@+==} zh|Zd%(WTpHdEupwU<|V-U%@q5Y39VHyLolqJGBbg<2-kncNmYI`TBw5yrJN|_*1dx zVy_5?ev1%&!#Xb0)i!i2(uv1SC_<%0&X_qy>t2P~kz7729fehutJ3{afBP?5-BnRq zcDbX4uPE^Hu|XY&>SZSF@AqvPK_qVY@m_EB#bKD!VnE}X*3#eI5996UMzlgC^S$2u z&-Z$8hP~5s(CsqUYq>oRVS@{sTiNgWSPkx$f0fMb&Jl_`IswBDjsh>_E_SH`N*c`Y|F!^>Z5fY1!UwLT5(WvpEGOM zVOF${7W1EuhT#T3$FrlQ2iJrtI>-FD+G6lQntr$>l-0OM;VZ9(SY#HD{&kb2k_Wen zb~&?NIHO%T%(kxe=4ZD216i)V;TZNEZTI;74cpWv*=zJT@A%l<6E@~JdV56reTTA; z&&Y>Y+r9i^&xyxy-ajyoosb{f`QqRg$x;DBwZ@3`OVbeI!wo|A`|cVuAi5)HxOAn2 zv3GO_%@J%aFoE{IuJ)*hUt|t|r$WJKr{`roVrdFW@5DU`1CeeQ`}w%41xR zT&#M>bC0K*PPT-$25Z&(=_eET6~k&fr71rk*=f*l%OWLk?;1SPa{^Bi;7o*>wjd_J z59NLP*5y>}l9UQ*A0vXYc#_#N2-YPwCMl1k{(6QDSYh)Z)D;UJfTJ&0q*|r2*;bEE~wj> zy}II<>L|%7QG>?1ZQB2Befv1qf+i{ZVoqgWa&Mv&*Sm`!Is5#kuW#e+doTa<8C@WW zDQLKN3uL7MC#vYFpG-6$g(C9=gp{P;awteDe>svD1EhrSd2q`uLP@EVZ(Wt7mgNw_<`d#Dh3SFMBo-JIlpnc^k(;w z^jf;4#cTKsKo2zBxrh?R+daSq+_Q(-kIJNilHxs)6e7ZXl_D;Jz1g`iZiIT@y-Rs2 z()+&8ytg-nYh5BoQjRZSFd6atzJy^7MVraSvtq%a3S~o0Dr6R12*Ko}-Vq6wl156P zi$c8|xkM7J=cxZpK_c)1>u&~{oD{Lc{zjt9hQ~i_1@$p6<6*xl+Cl4 zcY=jibX)rCr7>-EmvV+(yMwp-=&nM~2ow8kUucsT5o~b$K@JA5)O_td5Ld>@idf46 zMQqxaYe%c{<(*u(+$Dpxa!0i~I`fCWU))>h8yR4GM`MkIyG+CR_`WWw^aUzMVmFv) zzFr#L7JD(r>vp$yykah5;)hvOW3^uKtYdMDe6$&zu+HElJiyaC2t08DpN0O$!|>r6 z;gI|r4`<)(>sJNla{>+bfr`9negU|J%3n!$i;Q$V2@15eedtk2JSawh?GDK$md<7m z+;M80JN>vGr#*5-(jT1X<1^>O7sg5`sCWS!R_E@Jy&-#^wY@|F& zSvEPTo`3cz6pGzTxL{T&-030OVADbo`H~vBh|?~$kp|@|WWAF+hg^X&Bu4;cxeDco z7ZWMV`bqeZbb$F}pYxcNi^SmkBiBEetne1`wEZ`t(e2j=pB0USD+6W!*<>VKxr|iU zlQx;HEZf&vxk#C8R<3_BnH-6X@fV^!6Em%z6^)e16?#z$1}A*?wlPiKGi4BM)L?B(-34$@$x*^*f99 z_$@#n9njEAYbUI`eeld~7;h&si!qd3-9(dO?!{g~i<}(l$Kbo{cgvwznxNr675=dm zHqak4^OPCmig*@AImp3ELTq*y8!7d6TdnR}zir2kvA1mNksTQYyRxNzzF%v5*hjvO zi204^&CoC)wrbFcXI(81LMLj0hF(V?1w(yephmLy)1y|jyxav2mOv~>HG?}A zMcE9V8@gc;Uk%7an0%ey;=}ylTa{A2-TZ^j#it`u7er^X?U4JlD|$nSh?lo4R~CQF zl&Z0OA$NZE`3Wy&$pI%B^Hpu0JxmX`3DnMGxTAKe|218H?9~%K8vV3SqpkJ7t?R_^ z1fUgVPJhUOdrWw0#f=&Y(2D-9j&AsfBV)d~4~Mw8l6THm%I;4KW~`oM)7rnsN@u^0 zv+tc9Cfj5*rH)o!tD)-6TOE2}jB zqgCf3kS2KP}jr)o3lY=(V-qTvujmDGBSJ5l((6PF9Ap^Dg>5E=6!dkgsd_m@Uevwob>qs$Nn;yk1$%4BMuVCh=`3h?Lrb{-j4Yb?e`k_}D zNl!m7HnWLce^ET{#*(MspPHGfB>g|tu z^Grr^gxd?j_MMd5|JJyf;ZB!lrGrc*;EW3lh72_n zRTbrElau;?vC{P9@fD1Pvv1cgpCt{1M_SS{I153R9#@Y550J7UlNbg^Ugh8muBZ6o zeYp_KzpxSPY6xZ$Qe2CWQf0bl9DNnP9Fk}einUMfYdDfTa8@kvEeKF)fn^jCc_2k$ z6qOW+HVHTaAx0?8pC0+wBgq4yEX55!j=-f7WYU83nY1h>2^73^B2lN!} zqWPqp1{t-# z{Gp2N^!^QB>pLEGEnH`5@>b-9aLL1KpAp}kpn$vk7q5Wq6xTt68!Tx#j8m|uAJ!3` z%Tp8!8#hhB2S4=QjV<~nA8uF9yF17=+TPad{6O`HzVJ33mSy+Lt_{>b-tnGuHB+Oo z`hhs}W{&_42Ub?sg*J?VO=q(Po#UVSuyK!XU>vKyZc@B9r@2~KuK7TGS~&aBRXfZY z{NwAvn?tiLIWd`OWzWBw*^eP6VyHyidW-Im871I;1EB<3r`wihmVWwXPftu_5a$k&Yt)n=yZPlg&>+aIG8x{6ZB11R)>eO93jqSFd_0EOtF zLUI1_FXmQgNFZz*^hzOU@JkLtAwbQDaq;yEKzs+JMwu6347TbExvm@uOiAYX{!O^} z?8ZhXnWX3O*MHOw?hm+b5qz|&;%2q6*MThSfwh%RdGGToh7gx5p>s}58II0I z7+jGfbO9UkzYDP!mB$JM=$Zagy|1Uo{3C?j#^|hzOq%YVs zCl}w?pn(!>t#`ejU+w9@cOtEQygG37qFbI<*wE>}k?xg%b?J zvS}CI@D&tc7ag^-HP*leuH>?|e^mHoyN-kI#7)WV4~#_5e0*FOcV>U@weKt5UGo+j z&vOb{uc{Dv`PuHHTF0Lb*otk^7b+phz-NOED`4`f01daI{F8x^I-svykQ?#f76Y9C zo5tAL3MP$3PA4;RmTZk&>``<*sl2^U;m8qHkC?5ctDm1$l;8KDQ$m=ndcl#SE+@~e zXL#l$7R&i^L!a#g*SFet#!_eH9yb>n*=nq!+sECuWGa5!%a#1M)j1mOZqd@sY*k6R zpa0p%BP zDd8SL&5(TzD=jO!Hu9A;I>m)rm%MIhHBS9DU(?LF)&4r?dggT}jtb@^jvXlfdO)|| z%qSwj{he&k?LPjXqw3{GLM<2O6>l(0(qfWxm@4^|{p^uh1;JqH84J#w&0Ofg0zM?# zgZmgWH;V8oP%~IwBzz$^O}=ihTsZfF3Iy8=H2{YJpoJ{u%x_ zE&eSb2b>_6kOu~f@zZ3{=B9sMi9w$buf$41uiBH=#={Hndc}s~J&%7YNj``o6_}8Br4xiNpotkIPQ;7}=sZpoCbCgVKwk`Ny zO#*(W4ZqK-gI**5y-#A#l2hV;d9<9!{N+h{v_K{PEs@23IsgCDXnD1+ZJje%lEs3C zJExSNJ*S+>VHkKL2HdR!mjk3Rh}Yy~0!_Ck)@>rT3d zGTD|h?z3`^#F{<|tykH$W2bYn|PgJ`EjxQh%6P*cjt-=}wnJBF6`7&!FcPN8?Ueml+*!=WJwkkjF^jXML(PFlMZG z3s+BCZ7kk?N_67DmKAG1VbfM7>#)eKS1IjF(X0C!mMAow?*Hw-4aF5d^E?&5_C*XTfMcd{M#3cU(Y*=I>JW6L(SO=39 zNfp2sJKzUApgf4mytfAmMn4OW4(%QPL!b8;t}YMgi!nqO7xzgZxqYJBfNyu)WJ zJE127pN7M)AGn8j699EdS<~+_tBdHIx;TNy5QK3>ohHUriFVp;m3hL(0A=Lxl%Q)33jA#N*ex_@PVQjc=cYTjPhpSSsz%(5p2 zw*qC@@6KapGxJ<^k!L^G_UJDgekj|!+YTWv=$gA#Qj#P zLd(M_IM(};DSZsqT1KeMD2ncAsrb!DGI{n-dNW5xeWR@o#@~2%AmLi)j;)q=4~hO@ zdz)q=$K@V!ne{42S?pKO)X{swl-154x*&7Dg+ochFGHU8BIE~Ls7TDH{fpVW3#p0c za0e=BQKLh9c5aE5q6Q1?V_)&KXI%=F5f!_VU)rZVFSHwJ6cS2Fdrx;ydxG!T3+sUo zVq<4wSOs>0asD_bWwI%uT8i(yi-_!zMRtd?WDdmdDZKhw_{opyagMkt3svZQ@}+3j z7r4aVcQvj}F5-{1mHEe_DtP+nwsEuB0WjT(^DYmZp6;$k@rBjV za~)n3TJu%yboqnwbe`WXMeM!b-yg(JchK(0DI51a0x$W@=XKoo3Gh(e6$_pLQK!ZK z?W_&eX!5!&KN~){9U)$gSyp&B)#2xBYC>N*dyeRN&{zFGm4^aqB!*{)FG1|j2>&m! zzq~~cte4p2XVyzy$n{cg>nX5aVg>7^ecIFOr694*;d`+hv7G6FFF8NOM@{^WZ)R{er7#ud4kZN6&@8d^Ql-|q~9WM_{`3cmj5Zk zAB?m(GHZB(yovf$NN9ej18j3Gkka3hH@}Ll9vHuyD$Xn3P=;ct-2y_2C0`oulwxfU6{J3L7eBh&1KskY$ z=udCrJ56paaWJG&@?TeY#RMz7R@=$l`{`+D(wL@iA4#u=Bq0dLJ{^I(`GuwJ^h%l;IJA@vl@qIfr>7i;QVy!8I+RR&(gPUDNmFsFuP@;(?Hv_pu~l9^!0k4#yHjN#c$&DPY!C!p8k5e zUoExuVP;;~!;3kcx8l^D4?Abm*2FGuSX*oibm!JD8Czw%etF$MnviVk1qmXfXYaM*7-uS^AIfl?CTVk3ZYO^fv5O+(ygO zwx?*toz|%5F5vAkWY?YK;L0$1F~lS#&=h9&p|XB(P&ZLFLZ*!-)%XT)^|^J-M-|rD zIC~9L=t?(-d1-z<{eY)TX&~#`%C?g_ocHar&UdMAb7fDy%3xyW_3R<$h1Ow*T=7pv z2RR-ezjMb|-|qMAb24q!&F;zjk3LIJ-DBjql5>UH$zvU!HJ9c!Zpb|5bNgNgx1;3A zXF4YK?M&TLj5kW}?(+ETwJ-9>u14E2O|Be$D}%SKstf1wF5jJhz&d2eY0E z*f{c5imm*p&Xvz|b*tMDJpQZai+yyL(OB(|$lPNc2Pay`GHY|6 z{-{mQm$m0j?7AjVT~L;}w#JkrXRUr;h3URGR|k0W*Bo5$pDrrPvrZ}5@W#e{o4h{c zy)GIlwsHyWj34K4C>JK$uU>P^VL12XuV=cEf%l61 z9Qo4eJl<8O*VX*GkrEXqvxS9s;CC*qqJ=~^pB7hSu8Zg@tLNj-mmf?nt@@;1+1C>o zV4~q~9JSz~f1ed=ei|Q>#C%cCl!PN2=;%a0^QJ1w?p28hx-H7a@=ncJs^;kGZKpC9 zjZ3)6^49NKcGYlGr`!U`qGp3g&%nx5fqGv4pX!Z;bw4b7==)d2A1R7tYGKQ8^+`P= z8tL4x5uqE&d*X#wwAtyXeg9Rj>AZbrf1FhA*~A4dLDt(}SVWz^?y|76NWObuTwQtc zi^F>ZNhh{FZ{M*feCHQd&Ae3f5G!s{zccg7L2m8wj)C&e30IemOPYQ$SN~$J zm^@giU#|9`JJm_I{LCcd>kYSWG;wU1EZO~DSy?zT=I-8|d|p`qTeDW@M3f zE9}kDVoc%dOOIEtSa9lWtER1q%&tqCtoF@2`N|g`yGg^D6Rj;a_~r6Av(@H@UxqR? z^jyw577WHjS(#Q|Jj#wexT4cZ+V@Mt&)Dw$4WC3$DjzPN_-L0==_$NOeNT_N0`2e{ z=4%|q74w!i^twi^lU`Y){h48_YQVZ@2cws5uG(W&#Caut*Y+M-opqIEa49u?wF9m} zhA$58SppV;u;D&H|4C%7o{sJT;GL~2VgW*C4w?C^O2V?rKAJ*5`%hwMBp3PHS>UdP+UTV*8+Lu#BpZ7SSCF;540`-%E9ItmVe4ae( zD!3tIK*oH}=Z()Ft`@4$eaNu$w1~~#gT34Kgk*l+-g3UC?$uN0;uai1JKhMlldsfs z1L0u9O{ruBgzx$(3OQZM#CDdbf#1*H7d#Bb83li*W*65b9}$2z-N5#TH0BHw3feei zzSbb`)W|ZzNATYMw%{t0zn7zzyDhj91Bui92%Ph2@#g)PfE@E_XTGc|z?sY+oaEu| zIR3fli0}=WD0m!?BV*AV16(XLbkVvSS(b^+7h&G!evIC*fZdTTl*v-!$06IVI~Ml7 zJ$HjAyvZ^rNO$+)%DpEXv9u9+kB-=$3le8LZ06HYdr^er)(7(-cB_Eg?B(4RyRF%F zd8|;lHUHGBVB^V{mAfkzXvp%U;TGWp`cEG-Q`TOuUQfS9 zC)TK;ah+&QW3-WYl^L$y9l^D*h=sjQTq)q0F_$RM4&LpcvQ}b_ORuQlfJkz(Q>FUe zFW4NZoA4?**!It(<)fPp7|0BQu64@;#Klq1(A+u#e@9K_+xgR#ZwVHFNE}$o4qd($ ziIYSg2VdiLW^@2767>NIvC!3MkytW-Gz6g&xP1k~5?1zwG5l8`=o+&~kaA*>KUch{ zfS7(W0&Rva9gBo80K*EQ2Zchil&uCM0bSV@iME1{1RA=|>s&#AR|s9f6$z0-3W9V! z*SWO8L!m3IBB30>0-MNo1W*L^R_B789!k(%=*p-_$d&U6APMWFQU`#peToFgKm*KC z33V={Y3mV}I7K3@T7Xi8WWiH_L890x;V4DdEk$BngBZwCmt?D$Qq~4K23?C3iKM|m zghZm?;an(q_oGXQB2h*NQOFh)1xO@{i4t0_990$+i4?t%Kp%8TLR68^xv-`q0T$^) zSNcR^tzHDM@O2r%gE&;(PtZMynx9BjVE5>XoyhL*p}Qxll!?!zBuW_)!k|lVB4Lbx z0})yf!JrFr0;R~JP1}sPrX~{Y6A3iZ0S7B=&M~Dz+o6kOB4I+o`2nF)Gbd04B{Szz zXgahZ61waq5{Z|Y5D6V|RCoy=Yv?+bNSHzhL$aLWUjd*iP9gzZSjYj)ezwH}kqzr< zO^8cDB7qbZQvxC?3<-QhqA28ah)+Wj*JMOO3a}y}=cv#KfJjiVBY}vkEFyvKLZCma z#>M1VAL}Eh2%4D<2|(V%aDF$>6<3q6Q)oh`1Ob637v3ULKw0*op863x-jKAg(fpgm?mC6Ja~z8f>$d9sm&Jup^o6 zrsEruvZ2enA%X62QUF3k1Egx31Bke;8WJdniwKB>(O{LeIUwLt8(obI3DE)$3-Csx zrZyR{9%O2q0})yeUAYU1xNI3EM8Y~=0Fi4 z6cX|La*BuqC88+nNL<7TiRiR~A|gQ{5r9adoD-pr=!!>3#JrUh5ecepP}UK~D!M`u z648y1A|gS(B7jICR*7p0AraTDqKHUPVF(~nh#cZ7KuE*^N{B=?fvEE%x^52=F`u7; zjzm>_DEkqP4s@9tB;t?&MMUCQrH}z2BDy9F5>a*yMZ~|3RfveL;(|mRK_OD8=|Y`B z(Zy1bU=xB!^~iuxKPf@Y&{av0U_XVBVBjX(blvUgm(4C0|BO^fJ9sh1Bqm@7Kuc@Fb2ROQ50iZqv?GMv>Lkb1QN$s6yVHVhJvyx5CUCH z0twNDfIymzYM($t19X)LWcOGxpusea^YoVie7}&?V23c0)7HBN0rbi4f5I^ORMiR}=XCwRWp6;6(CT;4V(4^K#sGEv7HPBFm6xY;&pt-7% zAZki;fuNbIsl!6EO(U@eNMWJ4r>R3glSv~HJU5Wg21PAR9Rivq8i_DAjWF|q3XY9` z2wfzZ;Bvr}2Y-R@so;Bb93aTXv*zJw+93vNP*Yehz_EcQZ$<*}0~RY10O0N*e(Ir+ z>L37`ix~-UgDe1=nVC9Apb3?cIOc%Bl0Xr7`GSaEnK~RaDKZjgf*6MkMKX0rXpUnf zQX(L5B+v+ngl3kc36L38#Zk)#3l zBtfu&ThIUK9yA3n5~g|%n14|S&8Uk+a#AN&XqLzJuRVk&$VI|T%>nZ-3XzZO6b)j9 zW?5#@3PCn23WF3m;|QW=97#>`Fw`qFeH;PP0h)~#X}TH|68MykpK+)NWi+=evR^YT zqy~gcvy_JVdfa)gnOW)nsBUp&)4 zd2UgFKw&WoeTt?4MIyN9)6mRK2ufK8h=3;XL?SR400c6Wp49b?=Hf*5oiW`v70jH} zA)#qAkx15{$`pD2M|>KkB1xdxFOeVU?@&!}sB6W=Le`F5pu2EFmMfy*oEgBmjeV z+DXp;crY~IBNFTv0*nm%<6IEai3I9{rg20<#DEf6bCWt!hk)i`L?W!)1`z&`0)ZVf zK6=O+2QN9A8WGv=XLP@$h!Uw29Zgnu4^>S99V zxcb>U07jgD2rM+`84{uw1%V`{qE2`;4;ixOD?5?GlVT;K4gt*#hC~RlK_ZZ13Zo7I z&DVuQ&<5{#@IEHN-bEb%nnDW+z-3DU072eFUH@oWD`fv~QT>x7xuOmNO*MstxNe73 z;jd*!(?20Q4zwri_@6Q!lHLKm&)0AO0Qkq^GgPLe_?f7)5t=s%smemfxsdSh(kbJ> zSC(jUBP32OSsXG{M*t8$DxYK0fPiQQA|zmn6FJ2oAQ2xCWjJD*AS9eUb}l#)q(Rgf z6wT#>1jIPc1&AU=psX7-C7N&t2{l3m6rO&EIy5vZ4ic@zWlqIVAxTAqpt)<1K!PY%NG_9_&GBGxL4}M^lDh!c*ZA zG^Gj>VV@f*gnw`en)n0>q3BK$0_74C^dZRW9B{Ot*-4N9qi6usu9Hv`DuB=&B1oVj z50oZoAe25-_ykS#frJV61TcRdZ6jzu<_f3j%`7w&`r$pY<1K#3j)|V(gYKy?5BkkL zvilrV_heq+Q>O#^-8>Rxt3Of)LJ-6&ddfg>enCH$M*`g^4@CTQ9)MBUNkh+|U&JH9 z)B}K41nKQuJ|A2S^m A1^@s6 literal 0 HcmV?d00001