From 7a559b2cdf3c9060af1645ae73420c4b91b19cf1 Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Sat, 27 May 2023 23:19:38 +0200 Subject: [PATCH] major fixes and better tests --- http.c | 43 ++++++++++++++++++++++++++----------------- webroot/image.png | Bin 0 -> 49064 bytes webroot/index.html | 8 ++++++++ webserver.c | 14 +++++++------- 4 files changed, 41 insertions(+), 24 deletions(-) create mode 100644 webroot/image.png create mode 100644 webroot/index.html diff --git a/http.c b/http.c index f0e53af..fbd18ef 100644 --- a/http.c +++ b/http.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -221,7 +222,7 @@ int add_entity (char **buffer, char *entity, int size, char *type, char *encodin /* Content-Encoding */ if (encoding != NULL) { - sprintf (tmp, "Content-Encoding: %sn", encoding); + sprintf (tmp, "Content-Encoding: %s", encoding); add_line (buffer, tmp); } @@ -302,11 +303,12 @@ char *trim (char *str) int processing (char *data, int len, conf_t *conf, char **pdata) { + char *saved_data = data; char location[BUFFER_SIZE] = {0}; VERBOSE (DEBUG, PRINT ("Start processing\n")); /* check method */ - char *line = find_sequence (data, len, "\r\n", &data); + char *line = find_sequence (data, len + data - saved_data, "\r\n", &data); if (line == NULL) { VERBOSE (WARNING, PRINT ("Unknown received data\n")); if (pdata != NULL) { @@ -333,13 +335,15 @@ int processing (char *data, int len, conf_t *conf, char **pdata) VERBOSE (INFO, PRINT ("%s %s (%s)\n", (type == get_e) ? "Get" : (type == head_e) ? "Head" : "Post", uri, version)); /* analyse uri */ - char *filename = (char *)calloc (strlen (conf->root) + strlen (uri) + 2, 1); + char *filename = strtok (uri, "&"); + char *variables = strtok (NULL, "\n"); + char *path = (char *) calloc (strlen (conf->root) + strlen (filename) + 2, 1); //sprintf (filename, "%s%s%s", conf->root, ((conf->root[strlen (conf->root) - 1] != '/') && (uri[0] != '/')) ? "/" : "", uri); - sprintf (filename, "%s/%s", conf->root, uri); + sprintf (path, "%s/%s", conf->root, filename); /* check header */ header_t header = {0}; - while (strcmp (line = find_sequence (data, len, "\r\n", &data), "") != 0) { + while (strcmp (line = find_sequence (data, len + data - saved_data, "\r\n", &data), "") != 0) { VERBOSE (DEBUG, PRINT ("Header line: '%s'\n", line)); char *field = strtok (line, ":"); char *value = trim (strtok (NULL, "\r")); @@ -369,46 +373,51 @@ int processing (char *data, int len, conf_t *conf, char **pdata) } VERBOSE (DEBUG, print_header_values (&header)); + /* body */ + char *body = data; + len -= saved_data - data; + if (len != (header.content_length ? atoi (header.content_length) : 0)) { + VERBOSE (WARNING, PRINT ("Incoherent size (%d <> %s)\n", len, header.content_length)); + } + /* response */ char *buffer = NULL; FILE *fid = NULL; switch (type) { case get_e: - VERBOSE (DEBUG, PRINT ("Read file %s\n", filename)); - len = readfile (&buffer, filename); + case post_e: /* fall through */ + VERBOSE (DEBUG, PRINT ("Read file %s\n", path)); + len = readfile (&buffer, path); if (len < 0) { sprintf (location, "http://%s/", conf->servername); len = error_404 (pdata, location); } else { - sprintf (location, "http://%s%s", conf->servername, filename); + sprintf (location, "http://%s%s", conf->servername, path); len = generic_response (pdata, location, buffer, len); free (buffer); } break; case head_e: - VERBOSE (DEBUG, PRINT ("Read file %s\n", filename)); - fid = fopen (filename, "rb"); + VERBOSE (DEBUG, PRINT ("Test file %s\n", path)); + fid = fopen (path, "rb"); if (fid == NULL) { sprintf (location, "http://%s/", conf->servername); len = error_404 (pdata, location); } else { fclose (fid); - sprintf (location, "http://%s%s", conf->servername, filename); + sprintf (location, "http://%s%s", conf->servername, path); len = generic_response (pdata, location, NULL, 0); } break; - case post_e: - VERBOSE (DEBUG, PRINT ("Write file %s\n", filename)); - break; case not_supported_e: break; } /* cleaning */ VERBOSE (DEBUG, PRINT ("Cleaning\n")); - if (filename) { - VERBOSE (DEBUG, PRINT ("Cleaning filename\n")); - free (filename); + if (path) { + VERBOSE (DEBUG, PRINT ("Cleaning path\n")); + free (path); } return len; diff --git a/webroot/image.png b/webroot/image.png new file mode 100644 index 0000000000000000000000000000000000000000..c4a5f3c58bd49b50a1978485cae155379c63d6c5 GIT binary patch literal 49064 zcmcG#WmH>j+bxO|x8hQuI0Vqf&6}D7OWN~?GO8jT{vP5MVi`144io^Z%j$xV>LHd4ze_tfG zrC7K(o$_3Wpwapu5hIXXVpDKkn`d!xoo9U@=ZL}EUoxC$olm>;Ia|!*d;4b$IHQ-< zC^(e7QU|YD!*?+UUd1-hFhpLUBQItY zoqy(Xv@C-7uiOoDVrmkdM%;bCkh(rdO!A?hBLBpVU_c}zDGtQ$-QfKF3 ze}vVNK5>WPu%2XMsojC6f0nUHIW7%w6cj(l}OI<``?nzR`a#AyvfBPtdDbuE( z5LY%NzT5N7?CJ~8n2v2ZydK$`;3NUdgs-!8^j|WFY-N5NrJK*uk~YL^a=M&SJ#yB} zU^ZOVG4GIK7RmKXFw?ayDlyX=&-z3Y6BT`vH=B@A;rsRXS$IG2J*>D%9zzc(u|x~_ z^AP2%16$HOo6@}sdL#ic;HNH^z&4*r8#TQWMve*fNh<69ThqMANTI?DCG>sbOVz7o z>hpG8djch?Cc+Q4$#jhwC2Ua!%4?6WvMC1~H7X<02;cw-=N5T(J?Q#bLweaN!oG2>*wo22eHDlXReh3LKMoJ@mi*n_w1!@NFn= zmHc=fr8-@h_dB0OCy>1pLk}R_N`seMv_#YGi+;{!ywlg>@N5`0z|z_r;ZUM{Xt;kz zg5Q~)mw~}g6k#(|d(NDa-l*%K7s#k-ixi!=@MOII;j-7H@^HF*)Vi;2=7 zciGc@UdlWo`9wceyS@d+)sPNvwW+8(C0rgYo0>>-*?va8&sAG1#LszC5qxVtu`MiG zd1BLzaV1`O+b7mwm-RSlUG#-UW#=xR(T=TeW`2p$uF0>3!agNr>nL#h^m3t>BT!5K zYB@PRnJgr5I|*WVIpcywEBbijuyU=zDRS|#5!uuoqj!EJ3PNJK;xCU>t!%2C?o~~U zc-41Ugc^&rXJ3{y>f`_W=NHHq&!krq2@f$Tho3SocPdh7mnna2UY?XN({$~hm3<4a zjgL2b$2=9$3Pt0hI1OdYAT}$*PmZ;cKxJtwF&1%EM6PcXq65>Deyd?JM9-biZTSXe~aoXDSV>U_mmmg4QD!ord(203 z#^i*a^-h@*6JG|MeJP&1gpXBY__#n}gI}_7tc4F1Nf8k=NX zIMrnzU7ve4eI+4T+e@3Cl5dh&z* z7Lthm-?CCVGL@O+#Kh;W3?mIOlMMNv3r`Q12Uen(Eao9*X>n%%H-7|S+Ii!?B|-tt)FK|v@u z8Tsz0YSJY|jxqj2oc=Qeu6ROIdD>q4q=ym}F8+?>M58+bK{~tX*di=wLOJ3IA1JKJ z`o9*tAYa+8)xM7}8>!Dc27)`p?gAVb=Ddb2icXrTcupOF@CV0sTX-eR*4A@eAfp*o~0)IbWb~`r5_CvWir%Sn}eO=?|qyA)&P1|&fg<1BPr=dzj+zCA;!x#XJ6VOf@ zIS1`|WFeT0l$V2j%Xh#yJ1sDxu)8q7-AS~X($`=|U8oCY ztcRxB)*?QQLe3C{j*?<+%~g5Z55VXqUgSdm zk{w_vvB1EE;yenx34cbh#sKGql*V{AXX8)IGgU}4M+jP^M^PAV<9^N?kfiZ19Ge`w z2BsLxdgT?_O6Cuw9B3aXR3(Lve_Sp;IMF%;?vrK2X0o!e_5GY5>21%f zK+Jhm5w6GCKfo z+Ja2sN8jCy!v&93{B%U9FKLKA{)xt4$Z(`vN_F^ZMq-WF|E~`Ie*%&dJzT~>%5d-Z z-V9vp)cZFf$UPUCBJc2ayocjI^p;JON~xY0szUCIug~h72wm%U<-H0>O)E9qlKe`7GG3 zfR&%lH7g`ZBQ!d1-_JwIqS%)D@tu_Ek=MUElArVET*CcOWpd>zJ7+0uoH`VU4G%E$T za1oU@%4LCBZZboTh)!)r@lw6#G#4F9;_Rz-ZHl`;5D!b9QTKU{fg?R)&^$zfavZ^ZL>qlIj-bKNID7<38@A zbTD7j*BNFWN;D_C6}~F-_=D?A+c>kf$BU|Qs6FXYuZHX=JNr8a?}2Z$mfjX9qaN`2 zkNkADT(2IHacj=Z1_ugjo@R1tXuYr43doU0#}DF6)bEaTf3U$_Q!(r7Jyu<|YJk&M z11Dsec>hepW1YFE!mt zyB`#+IiucDH`ovC-IEv^=C^g4=WogTBXJ80Cf8y-P;#A9sd`?2YI`PRAnc_%rJpzhfk zJ;+lvYuRkKR_M@H z6S>KnvWmKTw~=h`(bcC~VuGM$e{gah*d5`drU^-|f5>|UqcfG(SzHZtQ$UsMdWGN4 zz2W#YBn(y`Jl+Ame9E(O9o18Ax|_C@l|F#AaXp9b8I8fW-Vpga70JO%%y%>M(|vb% zo>cKmi6E4_mHEbF1zm@>8ik4&cRrw#HFE!eICYRRt)V z`v$?*TQaHmZH}$}xBLU4NOudb4>;qWY{~7{9)`Rt4@+~A3(+Y+Jz8+8;EN5XkFrJ7 zZ=v$RzCCo%Ypz4Inx}E$zH!FdN`Tr^{AI;*?ugso5ejI!p@O9}%1%_OJW+WO^jN22 zQaWw+^vWMg97R0vK~dUMne&7wtGy|ID6zqNZ@~pE#9t>0Fy(05+9S|^UTLv}44uho z>^AynXGd=GdDSnLyCHo0c?b31ylwf_|1?wt_D3OR1HA2r4}`fS z46C*Op^(e;iku6x=v98ZJDmjS2VTLmm|H6^G~$r3v(aLD zN@|eXkPHjc>kRh0xnfdqHqsSv;SRK|3kltuX01h;A(V;`xf(i8*^h_7+t%P7q}vuW zubFa?e=`$U;dxaVNy?x{1J2MRd;3)k;-|oZ$yQ69iB@tid+83ElC^UuWsf$TN+jGk zu$*Hnhk8n&Fz_yf<_c>S?~1}e+2z(X<5?#({VM}#bEZHbpVo5Fivp<1Z=aD5HpQdj zLvd<52wp8fJkeP~Lwa;_;6d2E-EMOf!EI5CAC7+KYG)A=&N-_-xa;R~Z7DuUc^V8H zK!5XXBdB2}08(~k8jPeBVq^Az3sJ|GEd8A&4PJD;ri)sjAU=xjH?MyNo{zj`9utRO@=^NQSYqE#jTk#fCtX_hsdJ&5;3m&pzT=p`yZ*N-+td(bB3y8 z@wR+=6XA5%IPlTS3p?42xHY=%vf(MNzDO2B@gX1U1sgPqgAx+X4XfkvFDZTY$uWJX23})9Y~vF2gQm*Sy=m2btG6scQ(6*b zib#sJoRI+#G?c|wluSz9zL5Y~lZZGDxq7i3AjxS}sD9&d)o-$ZH1^D_ ziS4oEN%~eMnV6lH`X+toVa+9Ljuk1AQ`X{_Yy4}eckZ|x_0lq8jh2}m zrg_8%_+G9jfc_VyXJ@yS-ae-x?LFJ2hdk`tlJu3UGPrd1%P$MwE z@Rn#(EIBA@)qFK*d=2A+yjE=iTUkcz$N6gfdh28i*&NS~IGar)71H_ppoV_yw6cCx zko%xf_<5;J-keZFI-VqYme~^GY+cv@Lh1dkEfDO;bfh3Bd4Q|ak2#P;sWUhlJTE%_ zuBFh$XRwp&i*uhfNeOwa!`GEs*dKikJpz~jg{kTPldtdZaO{X%qxrk97G(giyLL~1 z3}$NbZ6bNbxw1%MAwm8T8v|3KB1S6T{-m)^d!1i3TeN4@8WFhSoAirDEW)f5Iy;O) zvcV_LEe2>R-d}JkqB9v$Teu1{W@;wa5PSLrTvlvjyB*kap*P~-`3)o`*WaWtt~blTgd>3j7W+czrYt#qf>#b2XFghI-B3cVKWhEPD97l zQ5m7AP0^@)IqZd+f{#lLgXNvyS?zsW+NpoBny>I{L2mGCz&9G$CD+p9vPu+ZJ?2zk zS&DEWY!AF+BNa791&h4a1%OAH=6OHWd|}Um{LM8}PR6+mrv1SJAgN~4jX*N>yoCfZ zrpvsub6&brQ}ok^-A1tN2kLk#0)V`|tjsHU+QFMX_&$>OBgl=qGi6y-Fl`Q(REAYJ z<~XRRg5SgFm|SJv?D*F`p^4y87H>T`nLH&M!u;njq|NOs&Q||#I@2R<~(G187%M-*rQi+NhnYw67&3Ta~P}rhg`x_%WRTh)0EY)ZF zg0&ni*Aux*+~Ps%R#i7fj)MIPuxs|8V?^kw6jKgTp&)wTK@<}<6>^V>zm^19lFlX> zoI73{?^9nD8)M@^u7vahOfC$t{kA&50KyjLw{0H32(XK#h@z`Gm(j>92);w-Hx=;Mjppxfa#)_Eg?C3mKAtqmIe8b9 z4?iG=dHt)>kSh)Z!NOz~=2VjfBr$aH9ZZlsQw~sLCNUsEVwElKFcE=Jje|s2xudv( zB9UjppuxY-E70{2kokgzI0U6d)?oi+p7(ep0^~l1bj5C~l4M!Nb8GlGcss;tcFZEn zexL3k3@DB=IbLxV?93~bg+2)*FEXAiy*TwroIwK2E?9D5Jh7>#YzDu!{EVG+^H=`k zfkp z{`)*%7#{qU%l?f7|6xRzKEdzM-|~oaV>WdETMR1(RZg^A-=l{hUD591*M}V~mGKO> z%uzc-3k{FylALE^KUt(HD|r)etv_qp2iL7Ih0>(_k)IbGfOs~YktC4pi4J29RHoYk z%-a*c{>DgIA_kCYqseK}OZ#iIrzXvSfD#Hpl$2D{_$oDkJTDy6IOzDp`=btfsP~U$ zMZv6NnT@H^X@ZZ?Llt~zr*fBx{QHQ5>q!OiQHb}7l0n2R6M<@#IG<`lP?d*uHZH|m zE&zuQ0-9)d6f!B&{pqz99vW8f6$ukNmINW$B#wn%AJsf9xTutIclO*$+|K1jD|=a7e@ z&|RpA$#$j#nl@J8rVyLQ2$9>{ZPuF5*guiZ_kBt!e61l?dYwh(5SNrdw#l)$!_j5X z&jM@?P4#*OmRHqCNZ|%6>$m|pG%z(0#tXyjdgV^uBd?;#yeFH%ikeX5rVv8MdI4)5|RYUYklVow{zs#bf2+1i1 zYMJ_U6KI{J?#QHb?imsV9C?S~*>ijshAa{V<=$T4!CZ>hvo6YU+EVlCrHq9WGJu{G z94zblK@6ZBO7ZEE0e0zT+nBBbk}|i((`ZnMD*mQyAB1V?mk`zH zvfn7TPyC;wDLjW@@5aCI<^_E4br1EN_KN}f8A~7`KP6*)^Nj{}^B&zG^bFKu4YY8M zF5@hiCy+yk+F zAA?xA$qr9bElElSrAPR1iBvRAjuhhNEn%gE*H6R+Fu$qh`^svT@%&&+1#@x%2>*6; zs?q*8E%`J(}gKO`Yz8kBD@ zqm0osy;563W$+utHV5CWx%T))^0i@)x?c<%P&SNlMg=EyFpSb{03&`55cmkk+#^14 zcK@1>)I7&wFX&$?DL!s|%(1xB7oi*8SCo!?$U$to`c~M3yG!wzD)n4DDV6fF7Nw^L zlK9Khyawt62-WP8dpSg@u_Xp5cc3D)I)wy6JgD%&U>QWi2{BV`MP`|dz3Q$b- zh86dya*&TwCgcO@?!m)qno65Ie$FA|ic9zV5p^8mO2*5N5wgzsKFA-EahI zng~vb4^9^ydTt2{rq$;a&{^H(eqw~9s-B#XXx z((y0VB?te!07-S+x@xHw-XLYKp!F?>h^5~~?AJqfw3-`oUXx?*zzxo?+;2F@`w$`W zMXs}`t|Ffnrw!#uN~B>WS_q*5=OM2%uge4>u#p(|$X76wJ8+U8edne_DpCR2#m$~m zE!4-=FPYtRLQYf|&E|4w5}GOLXNl&PHwOgo7wb#Ildc6ky{_UL*>{Zf^X$ zphb;Vo5Wd0>{YIrBprrNu8>O2TKJ1w<+$!@!xs{fc9dupD=+n?s9ZXF; znq69d-OiPrz|U?$C+w@t!6VieS)1@z+ujygeNVAwLdUj4)1UH};zBLEQ8+meMSzh) z*g~`TCKLHAdMzSgt%olQAMb)JNQiL+X^4x)o2HjxmmqrCMx2VJi>ra4oJNyFW49D`@=tH zG1VSM5bXSsIiH2Ua5y90JvhUY_g^#pSQ7ejmkZ|~i8$}o_X_-A^+nj#l+5+wapw)( z%gPt;yk9Th_qG9`Sa2GYWWHadn||jJZMrAYZCyVS`hq?k*#hznaU+BH@i1=6B%Q0? zEz1*04cEXuy5df#F4@D8*zIhBq9cVgFAb)d`Qdpt!?|~4_Lrfa%KMQAbvfct2a!)K z%*IMmOC!p{T5Gt2#34e4Nj`F{W9iaD4YODaaE*uFj6 z83(yJjC2^ssyv;pz2cGJR%Kvi>?SEAx@IcR;|MO7(Srw70;|9<_|4({j%S29_H6AFU|uyFX^-xpRYhyx2mk zO|8f?o-5>1L)dfI%qfQAmkOia5+vn(tco-8zko4V#SX5?VH(M`Wm`pp55x})$gA}q z8AIqX8##-e4BOEVvsscD0Me`MGSG<+Y6QoeaWwHg#lChEi!Gcp-rw;w(vn7MI7huq zu3!V*y`rmJpF;X!XXC5IGo$MjWiewS04=b-#^ZquXIv2Y1!fL znFDkAwo&y#jhr&w3b%^fn3@JOI~l0>8Na{JdwHx*Dx{gg2sV-H(!qCj^4aS&kj@CF zlJ~zo=F<#QSdi+!@*G~q^%TDYHSc2oEOJl2|MD;E`7aQSZ24Pc_GDLFz&{q1ecmUj z4|^LTdcj~Y1az)T{9x^z+ri22^Eie1Yz+FWpr8-JZ15bn#GQwmd8xyTd1q*rY87x} z{P+qr1b_>xuP%KW%NBBp4tg8lbe^^+C1LZuBjRGa{_r%;mW?}3?Yc$>#`O6_4kL>% z@WfkQ+g+(s)8g8dJ4~#;lf)wr$1B88n<{5V*12MYX-gXpOL2ed-~6}+*|Rx z!-EQm03F>c$P9*FtIBgWNs&C-~u{($@!u z2S??vd-}B^yq8{$-M&c51dvWNVF-r-CX6qr2Gw2J^L{NsHokiMqxMLQmBo~&^h8;8 zAr{|}TY!tM45m$1m6zT&4J}_jytxpMO3Ss#B6|EI=wFg0-gl?L@SRxWmrXS7^|XPw z$wVJ#AAbChQ2pMh6BI6VA+-O!ey^(Y7H<9I?>-VC?J~?_u*CuUz~p3Epy@nyatKx zh=X8fb0(T7R*W?c_kQRO?!D{g&1n-kEDbbX6n0L0O#Ns2K5n3htEk$1c^d1LBzA~# zGvni&A&cAijFvm_{o_d(*2J22Iyva&7stmin@*>U@1s-{y%nATlEW|H<2gj(Q3e^X>+ghjq!WlEtS8CdP1tYJ6CxGC)7D!wOe@@{>EfV z+Q*CapA$M5cct@a%s!+eV*R}Fw@kh6xYAu>p3lhDvqhjVful9C6k+oF$i*hpyn>elIl9mYgW# zq?8Dz_P^K%_~-#+&eC22{o1Z9gL}dwh7u_2DX#n^_9I=b*>^xmpHEQW#N%-cuH&8i z+*%hVM9Urz^9k;ifT`z*NzTO28zo`EQ3U5fx&%nai5)R!m+BZN;5osNgHNU_DuSYl zsvUZ2h9X}+nAKI+u@cu+u81u7%pRv5UoaN?S-&0lCiBsEaCl4B%AFKt8$iBQsupiF z4D=GmwkFT@+!0X2fy){RRC0AyGNc0EaAF@5Y8kxuArb49^YM8vGMP#cf{R0VgAQz7&xr_t@`!}K;zl1CK*u7&&o<_SU8WI}1>Xr)5EX-Vr z-AtiKxUq8(h5y(hHNOP(hyKh=$Sy`^eldC%E1KdEE2<@cqJ=cYnfV36WDbGq6VM=k zh(eC6Jb9C+y|wpC&{ks46~zgQ#56IJ@AG%r5XcUG+zgp`-};7W z=A0xXJj}ryo=uJ{vE!P*eS35xIOzV^Dwhb4*&t*5w=HK+`;O)jfw?mHwJU4uU*RMg z!DMh8Mn@CRm%~5Vx#A-UeNoUe7$8~>Q=9r|#=2_N&-o@b>@IAvkHe3s?A31|OC-V6 z5RC~gpmZ{p0zW0gRM@{waeq7Sqpe3SQA7kx==+Ei=^7<+l!sno)5^=))u9EITM+~v zp*qZ0;Cbu}@Rad#ZHnTo5sxwj7|wZZ)1IUlsi`d0vT_)cfSt#b&5XP_D}h=eE2w`d z$&62h9olny?`^B9Kh^~_75@1-6E4)?^3x{-EmrtPVHGQJt<5MGd5p4`}&4gO+1@(l+3gQI8@X3Znh?ygd>EhDxE~d=;BR)E|;<>O_ z{SLJHl`q8GT(KP-SrKLCI{=e*aMvh60#D!r0Ksr8e%vt@he0Da$_58hli+`Xxr7-( z0rbMI4?Car8iD6!0fGtHL7Wji7{7bGq61Eb0Z!m+z_N6G6~50HUV_dQ%&TfX@=Ud7+deRv-<0dKmY`o_Js3kjZz>L@ zTl7USdyRj5Iy6mGG5xtacw+n1kk79an+Hj`dqahv9stvDpscHslkBYU3rpek6TF|* z?XNx?v-QsPS6;G(HmQ_N+8-5x1chxgvksYdnoUR! z?L$}V#11)G_puNE=54FtQ)RM+$iI!4{pMA67dA!p2u0E|2|_fUsdv#ST1KakiWF#W zx{mTnJ1>}QL78GF54^ShZ}2AS0*O2)2xe!}nf};VWmX6T*$+L2V{?P<6q=iO5)F!3Z{55|I z+%JL;8DM1)#drq6TDYFZOSL`-6<@+cjqA($%mgWm3(v0aOpa#7z+Ba2a+Gu{#vxv0W zX0;cP>LZQt#(ckk5R=Q+(6jmXO!u&4k8Z$XB=zZ$up|vD)Vl8@ehVqO z^JBlulJl?kD3YMEtJQAI2C=XZ2O2(vl0GlB%yEY8JUep(w%V^@<*rx$6JO&gG`C;9 z3pV+;$D3>bjLgPolbz}3Uw>U5&!s0B=`U{W2r6UYH(5(HTSCFT#N8#x-R~AyJpJv6 zufT}*A$xteVBv1Xf0O9v#Syh$f4Dty)kcK@Yxq&~*k4AL$^vP`6aR_Dw$GpY&)8^Z zg8-IC(JoR%1SbYdKz&eRNv304Xg>*5epr5Grq|2IC&>TJMVB|Rw7*_W7kv@~9$?U7 z?&Scx(Qjclns$IOzt9;quUPT!2|2IA3OD3lD8k*M=ziN)_AMqX9TyKj6#H`>OZHfr z{40clEOhl2-ql}RLKP=!w#~d`3kF~49X6=LzJ;~Qi8BwT4JX2m}k%;pfjJg;d?8hzr8qy993uxKVzPrkpk5* zZ$=|G0;K&|kedJfDy^>Tz_1lIVM_YT@MfL<#m-}&BtSG|g;j)_cDSO_`Rlq2=m=&C z!;k4SJ`dJ8<{%vpJyun|rkRc^GyPl!(Z4EcSNWX+3HKVd5q^fv$z4o)FmF7z08bUv zfxNO>KKM@M)H6yr*fo{Qi73i&lj>wvzx#TDuBaBza1JhXFDDTkW^O~+vCCA%?G@h}nezkAjOOpKW}tl~Fvon7PmN1VWQ)1;6KDs= zR;cZedCOL_llSS*MDZ+5m$iIs5|CUDiM7<-_*Yn{EWR!95Gs_wzezK${-x3v`)DN` zX#UAX0l5k2ITS#X42)!tMbgg`?cAvlO{t?8BTGsj-g#Y$JZ0&-+`#d;ph&G|ogn__ zghXrTEI9clVURS?V1$dg!D4A&iQa0GW@&?6$qo=pqa##}sZ;S0snoixXGdEhluo*| zGbM!3&r-XB;_nE(@{>7Q=5d`>Ne==Wq5r=D9U@D7UV0X)Af2bfqKP3o=g(e4Hr^HZ zQ`ONLyQL-~64jOEW4}E4D=jJh%@ z(>aPq2%RyHDEZAnBg<`wq?qmyl@=B9c^D zo+bf{?a=5TmGre1=o41dnrEb`flumVQi6_xYVTJZwIrhMMKaz5UN7?{OAXd-F@WUI zD`=1%v~i(mt)k;Hvo{GL-u3>ornb`a8(onjd0)xy?phd02H#YM^Ln=-W73FVnx~Jdr*8NQSmcz zo>I6o=C3^%`skfhDwb9J55VUoyJsQKD=lIdTc|iQBJu~m$t&zlc9-n^XLaXC`K z1Qj9ek`+k91p`ES&^zu)H5f(E;>>L# zkskU6gtwqJ%+v!WWz1YZb_|yCU_qvq3z)!yCW<{H12;7Xp7|8K@oB#JeX1p~q_79De(B zk#U#PcO5lLy=>gLn_-?(^tKD>xMk#^ugBQ|7|}zGp$f?J$^m8o8zR-S?Ts4lBSE=< zOYO2YuyunU5?55JzJ6e_pd+zU#c|!Sj5lcSaF}}#*1a=Eb1DaVR2}-wri^j*C z@>;a*TP8tATv;4g185jCl_3{p{hO2z0f?W{{@v&bYYZnz2V6${;?=^p=2R=2@45+5 zo;rM{MV^wPLp=QZ7 zizs#^;=&RU6^RK9e`o)>D|nk8v+`r*jik|F?@d2}Vv!O4LcB-hz?i*G)f;F!!jq1y z=s8iS+7&&9?6V4m(Lchmw@I-70YR$T{QQ+>yqh}d*Zr)&*%_8g4UT$8dl%+XX|@`} z&vFYQfHIv9rGtlIeuvJy<3s&R-5O%a)E`x63y}69vv=(A8iSVFr-QXPi27u)rg`vt zOI+oNs%Cku95e7(WVV0I;*MrFrAV&-=7~74SOs0Onf{X}I{2F>LYIT@jxa+WnE2Qm z=zBx6j?29_p!!)Y=bO?W3QWr;#nC6=NU;bvCDJ%8D%sHHW>`;x`2&dLY~mZv8LbY- zY9R9I$K}hQvsOwM3DQfKUSbjU*nF^s;Ct_}^N%q*het<{Q7?M~f`}i>N1s$ivX6tO zX1O9*VhIyeMTsoqAmu=|QnDge=&=mWU2bs}Hvw~vNq`R-+|=r6jEsB;?P^W;y91*`-(*25m5)$ zV8MTdnqtlOF!1a|6Pn)Zyji4XCYFUPM(RGM@K<^uujG#2GdLKg7A8H#u6TWG*3&&E zyfWUY$*IA_BjxxG%PqFoj+TqGF)7Hv08r8|j9ulGu`evf^I|bBW$8QENYjHDD{W4et8(0}9W%anSE_>2VZ5&pOcue4xh~Q$b4u?wAZl zzm&^E5em%!#at^RZzbe(_Uz?pC|VMVe=WJ8!{;*imxd%w@zUkw4N4V=dK~xnvl7Zr z6Y~xinj9L|LN%17=Ne)?XA@=?A#!IKahjq>x{1#%=IbQ9$t9aFa6tz4_tgdW;(*td zD|qcS%NVd=k(i9ZcB<?lt!%49$T}QP~ z|N3RF3Eis% zmA11EZ{_?I-bew`8hfYKW4D1JqPG56? zaoVbO$2S9f%SK7WipvugnZ2-cn!9-{6XEVNMZZeOIpM=K}{E0>xbz_hJZWC?<8Yc5rhSCf6BR0wKZ5Ne3Vto z(@kmJZV_do6wM0UiPu)Rp&`Vjo~QD@PEW5EzyQ|AllwbgV${QAAx3}}hteL?S+>XZ z`3G=^VJpqo)ZOds=QF}ha2@{mr}24!s4*pMcm0CEe@gx+*Mwu*0=7+nG57g_DrjE3 zDa)Qp{}9yeqmD?iygRYgB)TUqign*briv`oymX)7){(4;lT^x13wy@T891Ia!8c^8 z&sPQ<ChxW4yXViZeLa{ci^0kN46c%Q z$sBT87zven_1(WpT7y>ySp3H;4oHy~Vi%va$Ni7#DRF~+%zSY-%#FEV9B9EV8&aGn zHWCj@F_n$Vp2>`-?V+u{RN{ee3VL6eZX<6~Bw8M+?SO@Dzdw(pQNi0xMPRg$)GU4d|{Sm;I0VC>xx@hs`OF3w zNS}~P1606yTMUtgdAx_YCMu+zNvY3*VEGZIYX2+*3f&iIygm+HVNOnx_VBEgC&u-g zh|=f6&EpS;^psETu;v{Y9^*j6npNUCmrPX} zqy*i%HGM~28HVC#Gd+5TJ>OG z+>+h)bVv7qYQVbj9{I?nK9^*%`nj;Sp7z@N#q|rDq4ZCi4VIm6%U+ZBMSBrHYmJQh zuZ}4sm5N;KTUcy^b5Zkt6lt`zEKI*qN3}!_Bw|_&%A{BDHp;K^#N17U=nbAT>AKU4 zOs&NiM6Wv82G6c9adg=`-K-~V1@GckCQ5OvvYB)A24cMII|9(I$3-yoCAw9_)XSrOr9Brh~t1T$tG{H^SXb#tb-ovF{^K zxOwtuiC^qavC)dRP*%@_Ufr3hR!{^UmF)mBQ}R~lHzw?`YT`%56^6&%FH+6sw5q#IRa`E1e0Ft`q_LGN!*^lu@erv2f(+jlAO7k}YdE*= z2o{oDkwdk5&^b)A#v9&pIPN zHwixpCIj>fPi4*eK~#xKYqn z%@b^7@S};QoHGGAL2q~+)?TgF%*_ z-&AKND57ZZc3~WYx>N>e{HHHtPIt`eYuraKjMn|3nB<~v{`7r!=FwFv{p&jI7E30} z)09pW9e&HXn>60O7MET;0JiGM`jEwgQ^7%z)tF!OltLr(fnpNC>~fLu(sg5Y+tiqHE$qcbong=EB}?L{%y;w$Z~*X zidJ?_%hZizk=AA_uWLfS2ig1~0KRMyIGKC$^0zydeebp8j)!KD!WZu7n&C3I!x-WG zhiD|-xbh$N@@-d2=7vDf)i3ece7uN2!qeQfy;Gg>_};i*BY;|a{;QgP6uS^aiV8mV)02`pc};V21o5M1nut%^-cN2_67Uiyup2MC z#PIThipJjPZjGw>M*2v?y@19@>(!ug(s+3)rarV3N-UQi96ZQdC87pLGH?Rg6cmk( zs6vA86Bf-=Hm&movS}uP9{f}{rg4b`N}8hSuXli-E7!K}lkTV!*2x^$(?86hL zA92}8?nwWTzxldDfJ?Vt@@-Qm4;**-^~)aHXulneGllIj?lbFIfBUT95#@#1(_TT# zF#Tlh01#1uqfP{jYf@lnHTEcjZmN^pK$Rej4^sypER9z?>U|%C3OGWKb^lMIgrVL~ zKK)}s6TFn^sqn$OLhettwwIbHJ9ETGU}KQ?VU&Th`nB*1ELSUYX`Cv$4T9Y%FQFRi?W)~yNET?<^|m-)tl&n0$n2)Te?Yc5u%8T)-$Dx*+KILJ9*FTV zXx_u-+n2&N@FyG=Eg5+Xtkh^vtYM}0)0~WxVDQRLa>chantH&vAoxd!k%e&C7vVBp zAHZYDGSGRVHl+Pz4v8VpgF5#_9-o^D_ANI46ymTQucT7<(=R$~B zMK*f1@P;p71s-qVpE;<#%p=#YzXryC{=h15H!y0zDKp=)ekC6qm+yiXh@R*rJXNS< zne$<%K29u;Mz}(@R1Tm(f-5!rANRfkOU#DfkXOG%P;Lw{2tKg2zS#}nGW1<{FQ-E> zX6F^++3D2xmE%!B{@-j^f8NDM0MT98y#(v5%j2+&)1_eF^&hN#%Wh+zPwN!+SSQdnf#ZbT%6K(rmZ`@GUC7m`7l0dWe*o^ez7ljo~{C4OxnF-ET^!c z=97|p0|)v)%Cy0&bzno{AYb5$(9c&a3#eCBk;p-td^TwPwmqv64Fp(DSbVWorP3FC z@vgUQ@-}E`_S2GCkAuZ3z~~+GoTi|dsOWpzJkDGK_eR}VolK+L=$B^ZRsP2(p^8{E zA&ZRG0BATd7poI!;7b$ZCJb~Dsf564+MJeft`7{IZ@a)(srP2b z+P5F8v_nJ4DNVz~(xh)=`;J5(IsdF4;3~MW#be`>V?^(C~A~`hR6a#XggH z$Fz|N1-P_U#D6Z}d$x33DyO77BXQKwfgJ10Erb zneY{^Ak2Oi)D>83G*m+F&%NZRNR?shY)NwY!QeLvUiG|5L-2I^Fa+DDs~@xw*kBFY zedqmWHAk0ly@cTbpJd2?r8EC&1vzOjWa2@aK3Tq9;BUY!#T(z_)^GX-?cL}#Fv86B z-&;F%MwzG5xN{boL3LZ}Iyx7&H-zV&GYA^Tq>BymBz{SPy<8Pn^O)TyHLBNo70o8f zgrUF#8I1=sa%*EE&&l|4lY4 z1`1OxR*XO<3rZD|1B)6>;w`p^I?eds69GPQmZSNthIa4fmmMa{VsdJ@iWKosD>t4~ ztKLT9a`ym)yIXozd9c}pfxRXTFxhGp@E1MM7Py@#qUNcR=Y%YCG<3;SgD>%MX87)_ zF{6R_?YZdwyC-DDZZ_u(yPjt3T|TC)i_>E9Xnn0V!R&l7VAvvU*SQyPkfTD}*sCK7 zEFZW!1E0nRHBmnl75Ewd?P0vC+bF}`iDG`5om58UKM-^sA0kBybs%kv>oZTJ-7>15 z1~G0_3=cZpdWoa)njA0```=ZLOmq9*4C#i0_`MIZiVgFSxtVJZmw@OC@C?0a&<4l( ztI<(-Om&9txok8=sh9?TGoNuMW_T5Gb?*qq!38l!H+d3s`)%MkiJuT3rz*NRxeoqM z1!NDlM3lz~c5O3iBe6_rL>tgRRuD>00Zvi}aFSVwt@YKr-SAVk zvuvJGbEPP3+A{pX%bJ8Ci>GgliA&M_icB&af6Hs-D8pyCF0#C*imvt61pPjOZfdl{ zmvJF0sjxrRw!(}q`FNtHcNbPiw5t)`R0>aO>a^4S35&?j`x^2xD0yJL*NG9AG|SNQ zJYX}2^zjO;7vYv&GaOZA6@LUrT;}eizpLxin5i9(`SuFivGz)&kcxiLoK zEb91~XjkxdnelJWZRGI*J6w+Xe_KYUHZaiIGUv0EiIHqT$|@C*IJlLQFjq~u3gR+E)?6BF<>SV znkOqMIy`L-%MSOGGR#WPZ(*_O-Ad-%6_XT81A8U>ce!#+E)2kpBd@kt)lNMfB{-C9 zM{`2w*J^uzcPz!i6Q#9*e*Yk&q>*RO`qUJ*{FQpynK|LS`KL_)^D-mn*MR;L1ylkb zCf(BUtt(pf`f66IU?;-u(+3_pokDrfJ0;YHB&>N7ZG;A1DedlNfkH2x9P>xIc+W2f zbk4L%pT7*)M>y(+Ds={rVulsICtukYI0NCjL(N)nQ+H$E*MjhBo@A38j`6!I$7N-NyLlz(v zfU^hqzd5M>^)g^T!(eOt-Yc6#^SiI1z!cZ&7}sKY(&yh0HPB*4EzA%6d?dMVqk$MFQzbfNe zMs757A;dnGyn+H>#Ed6iLGf5DArCTly=9mV&@(et?nYP~lq;LN{s|WpVbj>U26X}K z?P||sn#`N=g2%lG`E}&uqoO^K5@5UqdK?EjjIVA$9%>)SsgY54;`d{f~IyqDeh2tjNBg;6g;_q-?06`^bDz?N+k+6fSbaqv=vnc1@v#iou3!9ar{Y z#KyHLu7hw)zH_2a=avuE$t*A{{shPAI??v+CuNWK%I*9x_epv9cq-o7sE%RbpkqdU zy77)cG3cezX>()XcymJ!wZY|kGq;MUhFB9!Afv0USQzRWf?u_xf`v3r zMLyAo0K=-vKc;$x01v?*HSfkSTt90b5HG@rF9GauZjE4<1qqiF&qSzzBAR)60KH zbKe-aN>=3B^$@(vsQUbe*ULaA+W-F>YSWqKX5EQa*scFFUWaIqYIIhZ2dwWt+a0-nxqK_Ga0w)E!s zQ$1ouo_z=iXJH-bi{3-t1UC${b+kZRko(kD;I>_LaY5E2etda#5QCRlR;ro6-Kk1h zeCA#J^f@?cpa9e36M3a-zLWhZ=%m~g2?dMPIIg>Ju3;SJ6RE8v|{sXFA z-5%k9N9{c7e|pq-{}5R8iuunWNQgtp)2Mp5CBZ?HAJKXf(NoF#7V{m z`yZSbWRQrCeAij*kc#SSc$rEyNum z&D@yU;&0i>@qDIh?!`V6VQoHELfx-NlNZ+SVPDOZseUpt$MfFX|VAsh?2w z0Kl6^+0y;xU9u4FsVBOJ)V0r1j|<7XTnv?<)ZoO^cKib(P-YQoWUxexx`pZsgi-Gg z>oPAzOKRZQRKiwBX>oLAKKMo$4SF z_YKzwHKM>hBhQflJZIo>YdH%UYb(|>akVKkxzDbhZ~lk&HmQSusV#%i6jfe1?Ken! z)P0*TCGKAIUMRtD`P|Q5an*Tt%%OFXiyeeBbH;%wRfBkZHlL>x={F=dp)n&8f4s!2yi4YOGtwhVgLZ2;Jj0bu7$thnbU3`DLhHS%)LvZHE^ zIOsFFS&c|q##fwc(%Ior*6Ts)XTtRKs@YpSwNCz> z&hiGePaIRqlJN02fg4kSgzrtNr7A3tpSWK8rv;(+7v%YiqSVJhs7D9Bu3?-s;zbW> z#HKYSbhiLWeg^U(fF!5>XtGJ}+zd25(mN>!r;VC!*Uz`Ig-o&`^=;K?d&G5Ew3v{K zeOVs$Rk3FyKwMn?bH$~O>$2kY$aT2`-P6S)h0k=FU@$Y*>0IyS$6A|flGqa>W~R1^ zol*wK&{5peNa|u(J6r^ySp(M%y4jK{AwDD(X6}nA1AOpAIL=^qMVum>%>mg)RsPDt zA=Kpb(iV%@cPb-?z~)f<-&-C7R6^-)EW#`Hp!}nSWzc6Tpq*?gPXUWw#Y9hQ5bP*( zR@TIn*KyURx37k?bn^+E8hOvh)2yhq&YT~5uG$=);Gy#iewyYPlwC8KZ%!HVh+Jue zn&0)QYv1WEzgN+vQvV9-m8XS2tqoT3NVrNf8E70ne#FxBB^Iz=#azx4d&g(NBYiqr zSMhPV7RhN447;V|+Ru=&PiQjl;0ef+iU!rUtoktm%We(iMY8vh<<NIx(# zKb7-*mW>9E=zbCmUEQlH(J3WV^d7$y4>FqKWlhEtgBTd==vH)Ys>3^|VGrX7PQ)hf zLx!ZbpTl((g8N908{IEg|BSO|OG~$ecf5N>)%k7#i7MTD(j#`TD*CRLP5bc#selc& zP4aeWx+&=p;e{P1D3g?cbX+H0;2ONa3BoF%YG_&4U2~ZRHaR}EH*rS?bo|UqTBc&9 z>xqCM6~A`u*&QxgjHDn4C}QGLuo8&oC6oH9t=vxQ3vb)C>_T|3DT;7`>MobPE2)W) z;ZlUu+e1v7TIL50+?CwB(pIGCeY)YulgG94Z_DqG+vC%Y{lmjr_9sDO^z)LREp=O2xPOUbn!zf1(^Y6~!l*XenO_}+`A$a=Z@gqqceom{ zUhp>g0%!JxEWc)2zIy}yScTbKb_qKm6ewF+`GyW_Qs)!$s^33PXdCdb2l^<_etM1d zEYn@L+H8aD^vfz2O^z-wy9-9@B144xpaDg02wxSw#WN7jEs9QMg13UGpWylP+kwx2 zPI3L*rk`Q~+Wi#%|8dj(->QHAZ{LYf3B6A6Xq!6XvKA=sjr`z%Dw^%lH!O&k+n_A8 z(>1q!Fks06^s-ES{{2KI?685lpH38x3i*XxjX$JjDOh~L*7IKoA2~%z%E%78%ct&LP;PN&r<^04sb(;2e z_4>~K8rwq&>c;5$-a++5s$UHH8Vb&DMx@fe%@M?ey zW!+YSNbIE^xB`tUqT226emlCU4bGO;L>2}g>bLwp&M?+p8F~6;0o*)JO30p1Gtl&R zL}07T6&Q1B1ljXN@;RLhIWr=+X>_HCxHL*~6mZ3|`=&BgiNF0ju&WsrG*^a#Q(b>+ z_i7_5PYOvY`@n@8b=hv4dk$^aMRMgRt%p=C6b2+7oVm9BMT6+)(rj!8`4JZK)zu7k zagHlDt)4pbSzvb^3?R@kOiU5*&V+pAIz+l40?M>GZ zr6Dcf#0q7f|EM21Q)Hy6D?;wGhuG6>l^ifwL?3L%pVk2vN9*5D76>=J{y=m^!#6tnwY6?T4!NdqfxBiCnA?o@ba#TgAr(^oAK)0wc01oDQx_H(~p8)aN|=x~~o*EKW`Jkr<_Nkke{Wwwu6z-Up%0k0xpa|&_H^#% zrvJvu^07oShy1}Kyj$mp(K^H?v-L1=ljjzheq0>VMlBvP~ik{BPMWpzq z58sb!3O`E3zIcc`+!gSHXwd!{^t*qB$o}lX3sQsOiNb3skA86ta}$_PS6k0W z=YA<5U3jxGPYp!bYT9sK%F17cdnF`k|0cO1_rv!Ql8qNmLb)Mr%u=?%dz|FRe{4$m zqr-U{BAc)QC)#eWfmt1y&!*E1Z!eHP7F6__{%npn-hGByD;x+ijIs2;Z4)$A0G6*& z!3TfaKD?ldhE8jL>0$1&T(WwnAypm~LzbRdbD5?)ES+Fz?} zYFg$ynFT5T2WlWMP~%$Q>!QM>1V9ZaDFv?K9jXEIB-vVRyWxnMDz^Oo2YG~OA%g?* z$4zQ&q&RN&XQa`uK%mYea$&#_l+_PN*_` zXn?asoX1oE!dbjAaB)n|PhWnD3q_=}Rad{lKl2GSjs6`75Gl*>ED=l267Y8#_>Rxf zr_`&PrNuSXjYT-Dp2W;6$3anQN-@)&DsFNSdY>$mNNs}gB046F0W4#OE)~&Qb zryW(Vl(~~0r17*4YfMQeHWO4eTEpF+s(ydR(gal?WZ{g3UH4l+>OL=6ZlO5pBQ~iv zjMNYKEJP7)V#2Xg4BYr+oRGUyJRr9aW5|^0LS~^I;F>BusD9oUQMDO}aG1Dkq;P_) zrofPsX%OwadwPJ!?yq!$O4-tIH{Op@^>N-6QAt{(_kXNn-rCrTuf)w+|B+BAr(OE1 zdqUXA3O_)lp=S<;!+?=N@~(;@BUaSF9hC8zcvGzFR*~SZ?)D`loYNskix-YO3YPPx zzi6iPf|NbZuGmvR<26wb8^d30%V^U$pvzq1O&ADa5?_&tpdMyY;kC!&!7O3c+Ty5)qw2W|NJa;HaU zDdSN4C%-&?^*LADAsNHQys4m(Rn21vBI{{?0_iM9f0NhbuCFoRd4rLQZEvAcfk28TxRCFvBi zN0~ql4uf3M7v(+~NzD&oMY4Eclr-5D2*4WT88l}Z1P(I{1A@F(=6NR}msAT)yfgZy z)dsO2oA|Ohr_yK?dN8L$(iC;Sn3p4&PVzd$(FtFb&+HH*3rT%yGB%$V!;u^nBiEi; zYT|Ex*(d$OYVlEWQlPH=1R?r;H`B^>NcL-)??q!m!#9k%0Ge&ypb!IPc2LTl;`icp zl@EvvD>!G}XnQXmR^!j6GXy*mu?U^wGKp1^PGIouL0`iJ`a=O_a}e%pr`6~@7h?8q z&@_q&23HD){SBV+xBnf>{H2>ljhm+9LqB{mEjsGDRG7DU+v2kHhVF9BSHs` zteRZa;q2?C=^ZmxygJ;GjbgTs)+SJNjSOE}ve;@Q1&sc|w;$A!KgN}qaDMCH{EKf= z%0)Z!Tuq~9eURDUv|`SUs(9hpvbtxv60n@ul#lL7AdV*N`)$sE&ZScWy!QMv^jw_q z?8U&-;bYzXu06Hy5W5xkMt}*I-F^7yh3G8MC*6SCfXQCY=1pLERWfuX5M2!x1@c$s znSbO7RRMbCoc%+fvB5^6+bS?>r|PeD{t6Z$wuMU9GvuWzVTXU$=AJOV&Fm0IVrU*j zH?8B7Q^`Vwf3!;HD*fCSbTt24;?L+$xm~7@IZ&yq%@~WnkXzO4_xz7s6dm zgP6K@lVSv}dm?ci3QW`o`>^!*Q<6OSpr-DRA$6~$NQcz+XW$t}iv($RJ*Gc)1bq4F z*-1RgQuC(9bWt_`fpRmBk8_BqylIpk!SQ^d^BguhVa`j+=2Z#ZASrg8R>`$AT2{T9 zkpXRU>}d^VJbV@`!(?teIs=oPd}vLppiX$4NUsX*=y>A6>Na1W3R5Lfg%e(Ho}jNW z2d(xR!njG+vdGEDLAPInr3lq7iL&kTXKl5kCD$x{{1S?8syp&|IToIxtI(RguO>R9 z>#w8t^xSFkuPrD)+^`~b$9}h9K=b1>)0Qec@Oa;!#W?qy?9M~(xns&e{;`Wo2>G1I z%67rU-i8x&r@=x+ z5nws)leSxsld6%+r}kgDAyZl%8qGZtDeZJ%0g=VqeakM5utVgvQQzvxb+q1J+77}w zOOdtTah$G0*!bdZ*BIGVbK?4pj`Yvy=n41k1s&OS_whdY)vUe-0t8#r4Ho*KN%*y* zQ|JUNdmPy%r=kSM4PKzW>_dOED(9T}p)_&EuAE0mL2I7b-?di@R^5A1FsbQzlg|yu z<)cwI6_WY;tOfqy0}`5!(mGw|4noWq-6MOL3Ez0#Ccod533pOoH)#2=h6@0n?0@*5 zTHexleEDnPv*G}N3KuTC;VU^OU9USPx{-?|$C&P@1|BvG7$i z(}r@t?I^~7M$j3tmoqY6hRsSxEOpNP4xJxz%hk>ODr)?1N+u{J#JPB0_gU}+&58q? z^SD5ZDlt8W>Ph5S;lH&gb1xtN4?mP{k}Fwa@A@3RyTp@FU>3<)ax%;tq-PJ1M42lZ zWf{_9fsbq)4$yn6A(b8&dE>86M8UdY!aw?Nt;Jj4N|kM}q#$>wQny&F&N1h75pvNx ze^9B-%4L5e{re(fnYe^CBBk@&tP8odC)AL3S`I)Kli5{fLwEYB<$^x+|HxsR3=iB* z>>3eO-?VYSrz@I#o<$4lfLXMI<01Qb7M0v|6%Ga>S{g+_8}6<@n>I71ITy8YgvBR%ZvSY@VM#rifiD_9qnay%0 zVa|TOkLf)Nin?95i_7r%Nu8ZelVIcgKCg}(7*7l1)y3IR>!mJ`-faxzP5UEaY|!0& z!wn*1XGg8*Jh6OGp_+^2Nd8(=4zR~TH8RrLu6y!Yjqe*55^ZiWKXLEFxa?TsaSJuQ ze;2fRCH=%+#-ro`N(I-n)QXIp4HyjbxOCfBP>8Dv-hDIBME-!H0LOwCTo?+_NvwAE z`=(o7c$8KspcfTl}IXBq7xi~Z0EJRJ-0 z%^?PD(#-{$0zvYBR!Bz<(BG!-%@((W%?O6{^pHtI5O>`x4&Fvj5{#r6^A3LYeG8lz z^V=*rB*XskQ#zV9;ou#}N44~P>Bphbf*17FS{eo57c8&RO_PLeGtqm9 z%Isw0ARK=)MD^#KV0S*?hrl1x0bCpqFH`>IbNe#KM&Zb-btS@$*hZ)b;`d_3+%lED zu!W}wXG8NOla;7`-4?tlxQD90h*!s(45&|x*V;#r9Ho?~@AS1S_Fl35N|2OwT=ytq zE6=-o7YUPNSBGClCNrO7ssgQ66{i1Z3Jo*XlR2aCnWtK92h~?OvG&p!05dmr;YKWT zsDA@F%e!$FU_B0|&&CT69S3B8=7&6`C6T1Mc;`3c?>vhZr z1o5p>`zk(|SI2yNu3FOq%7UJ4MMgl!6Nan<-F(?7MmG)P;lg9zQlBUB429x68a#iH zgX1(z^iD_zFn$|l-Is<=utr3bKu;+7Z17_CnQs$W`Uy@Vb{s`Libl+bZz)+st~%k2 zzO`yPCzMchhZd?Nd6D;;s3rfe^4-rn@|!l_|#fB~ot@K1x{-)JjY zB`qaM*GY@?bw4$K2X@m_mT}}ve zmDjeM&qBWRC*O-+<_Xj_9{_-i*85|uu1jFmgDD4N zw$06j)Y1P@L*d%}!X32|!#NwH+t-uL2$;FK-R;%ZJyC-0@(&P|$2EN=X40b&HXT2p zmb0PpK3twBM_*@5nLKyK53_Ico6|CBJmB~zIw9d@gA;DEVcXb7v)z-gY$mjr2aWRw z`BuMdZx0ACsB^vmVD5vYlcMXqY7FCk`}I^;S$o=MCZAo;Xq3~PpyV+$m!GvU4e6`kE6&TKswFHNjkGD zTz%hEXAaMD@p-xqd=>)Dj3gSSOn8m|wv!uArrMs6szGxi2ZMIpdJVL zhEDN&1zi!dhdtJ9x4|gi-|FK;Us#MB z4xEViM2QZ(JQWDW^mtK#KZ9y>E;gPWL+T5X#b8yJEKd0;x+bppt@yvB=UD(*P(^6I zjrJXHC5Y-FQfOuL6&6A80#;9?uR4@t7!CoSG$%@DmgF)d`9G{Nu{5Gg@JS8Q&&^oE zV{j!3Qw`L_|Bx(etWu|zjVr2ZQ`IEor(1mgU%>TJEYJuC02e|gJ~$2IFxl3Uv&@CT z#`n@H*0CR`(0dUF4}%yd?AJVFKP}VJl&90+>9j+Ebb(3{G~0$?CyE&MBI<+*dZL3Q zzpO4q5cw)WRwLBq)~rgrVt4hTl)M6H;}B0m*y_&uy9`mL2|@Sv!m2sR-U6&dnGH#1 zuKYDn0*H@S8ShL26b%Rw>T)08J@*VamjZC*t=#MEyN)!>=9sVB=-TD(dRBAvoeMo! zj|1=ioLy`%4d(#BD6cQwoX^-2u=YL*12kzPjP!|fBfd1?D<0R-zvXo-H=2!@qnfcA zAa!+#j#-krrgmh-H$YvZ_j4qpb;Yjpy5siuheHA6Dr0~udg+nA2!NJyBAO_DW6GwH zt%URv!W0u|*6XJ%gPVT;^Z?LQkmDo(%X_$3xuH675v*BbX}Pi*dB?I@uRcfTCzg?S zNv4WGlZgkSsD{|kC<`pz+u-g)HzE=#hfu*u!J5F|WW&({21!5UR<$qGa@4((UOa^M#*BWIeRB*x8+W$J2i8+ zmull^gUR-b^~;sCL2~~Y#*Yhf-rGvVqO~)Z3e$kk2Ru?FX|NwD)xI{8RfwAzXExVC zVGJ2R?ljAXN5orQ#DK^l!U^Nd-cBUORj!*wxIQ3aWiLcr8}Rb_BUyIL-|d2UFO_kG;v$>&FiNHgUxf zLe4n!LC2WoZf@;y^4^;;0JnTueWU~wRv?Ny957l-Fagw(GqV5fMyy2hXG6x~R�W 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 l;Vk0cML{qiC + + Test + + +

This is a test

+ + diff --git a/webserver.c b/webserver.c index d74145f..2f54227 100644 --- a/webserver.c +++ b/webserver.c @@ -206,12 +206,12 @@ int main (int argc, char *argv[]) // test: webserver.exe -p -1 2>&1 | grep -q 'incorrect port number' // test: webserver.exe -s 2>&1 | grep -q 'missing server name' // test: webserver.exe -r 2>&1 | grep -q 'missing directory name' -// test: webserver.exe >& test.log & pid=$!; sleep 1; kill -INT $pid; grep -q 'Listening socket on port 8080' test.log -// test: webserver.exe -p 8000 >& test.log & pid=$!; sleep 1; kill -INT $pid; grep -q 'Listening socket on port 8000' test.log -// test: webserver.exe -c iso-8859-1 -r webroot -s localhost >&/dev/null & pid=$!; sleep 1; curl http://localhost:8080/index.html > test; kill -TERM $pid; grep -q 'Test' test -// test: webserver.exe -v 3 -p 8001 >&/dev/null & pid=$!; sleep 1; curl http://localhost:8001/index.html > test; kill -TERM $pid -// test: webserver.exe -v 3 -p 8002 >&/dev/null & pid=$!; sleep 1; curl http://localhost:8002/not_found.html > test; kill -TERM $pid; grep -q '404' test -// test: webserver.exe -v 3 -p 8003 >&/dev/null & pid=$!; sleep 1; curl -I http://localhost:8003/index.html > test; kill -TERM $pid - +// test: webserver.exe >& test.log & pid=$!; sleep 1; kill -ABRT $pid; sleep 1; grep -q 'Listening socket on port 8080' test.log +// test: webserver.exe -p 8000 >& test.log & pid=$!; sleep 1; kill -TERM $pid; sleep 1; grep -q 'Listening socket on port 8000' test.log +// test: webserver.exe -p 8001 -c iso-8859-1 -r webroot -s localhost >&/dev/null & pid=$!; sleep 1; curl http://localhost:8001/index.html > test.log; kill -TERM $pid; sleep 1; grep -q 'Test' test.log +// test: webserver.exe -v 3 -p 8002 >&/dev/null & pid=$!; sleep 1; curl -v http://localhost:8002/index.html >& test.log; kill -TERM $pid; sleep 1; grep -q 200 test.log +// test: webserver.exe -v 3 -p 8003 >&/dev/null & pid=$!; sleep 1; curl -v http://localhost:8003/not_found.html >& test.log; kill -TERM $pid; sleep 1; grep -q 404 test.log +// test: webserver.exe -v 3 -p 8004 >&/dev/null & pid=$!; sleep 1; curl -v -I http://localhost:8004/index.html >& test.log; kill -TERM $pid; sleep 1; grep -q Content-Length test.log; test $? -eq 1 +// test: webserver.exe -v 3 -p 8005 >&/dev/null & pid=$!; sleep 1; curl -v -d '' http://localhost:8005/index.html >& test.log; kill -TERM $pid; sleep 1; grep -q 'Test' test.log /* vim: set ts=4 sw=4 et: */ -- 2.30.2