summaryrefslogtreecommitdiffstats
path: root/Python/mysnprintf.c
blob: a08e249b42b1ef25a268c6f6c500d7aacc6227ce (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include "Python.h"

/* snprintf() wrappers.  If the platform has vsnprintf, we use it, else we
   emulate it in a half-hearted way.  Even if the platform has it, we wrap
   it because platforms differ in what vsnprintf does in case the buffer
   is too small:  C99 behavior is to return the number of characters that
   would have been written had the buffer not been too small, and to set
   the last byte of the buffer to \0.  At least MS _vsnprintf returns a
   negative value instead, and fills the entire buffer with non-\0 data.

   The wrappers ensure that str[size-1] is always \0 upon return.

   PyOS_snprintf and PyOS_vsnprintf never write more than size bytes
   (including the trailing '\0') into str.

   If the platform doesn't have vsnprintf, and the buffer size needed to
   avoid truncation exceeds size by more than 512, Python aborts with a
   Py_FatalError.

   Return value (rv):

    When 0 <= rv < size, the output conversion was unexceptional, and
    rv characters were written to str (excluding a trailing \0 byte at
    str[rv]).

    When rv >= size, output conversion was truncated, and a buffer of
    size rv+1 would have been needed to avoid truncation.  str[size-1]
    is \0 in this case.

    When rv < 0, "something bad happened".  str[size-1] is \0 in this
    case too, but the rest of str is unreliable.  It could be that
    an error in format codes was detected by libc, or on platforms
    with a non-C99 vsnprintf simply that the buffer wasn't big enough
    to avoid truncation, or on platforms without any vsnprintf that
    PyMem_Malloc couldn't obtain space for a temp buffer.

   CAUTION:  Unlike C99, str != NULL and size > 0 are required.
*/

int
PyOS_snprintf(char *str, size_t size, const  char  *format, ...)
{
    int rc;
    va_list va;

    va_start(va, format);
    rc = PyOS_vsnprintf(str, size, format, va);
    va_end(va);
    return rc;
}

int
PyOS_vsnprintf(char *str, size_t size, const char  *format, va_list va)
{
    int len;  /* # bytes written, excluding \0 */
#ifdef HAVE_SNPRINTF
#define _PyOS_vsnprintf_EXTRA_SPACE 1
#else
#define _PyOS_vsnprintf_EXTRA_SPACE 512
    char *buffer;
#endif
    assert(str != NULL);
    assert(size > 0);
    assert(format != NULL);
    /* We take a size_t as input but return an int.  Sanity check
     * our input so that it won't cause an overflow in the
     * vsnprintf return value or the buffer malloc size.  */
    if (size > INT_MAX - _PyOS_vsnprintf_EXTRA_SPACE) {
        len = -666;
        goto Done;
    }

#ifdef HAVE_SNPRINTF
    len = vsnprintf(str, size, format, va);
#else
    /* Emulate it. */
    buffer = PyMem_MALLOC(size + _PyOS_vsnprintf_EXTRA_SPACE);
    if (buffer == NULL) {
        len = -666;
        goto Done;
    }

    len = vsprintf(buffer, format, va);
    if (len < 0)
        /* ignore the error */;

    else if ((size_t)len >= size + _PyOS_vsnprintf_EXTRA_SPACE)
        Py_FatalError("Buffer overflow in PyOS_snprintf/PyOS_vsnprintf");

    else {
        const size_t to_copy = (size_t)len < size ?
                                (size_t)len : size - 1;
        assert(to_copy < size);
        memcpy(str, buffer, to_copy);
        str[to_copy] = '\0';
    }
    PyMem_FREE(buffer);
#endif
Done:
    if (size > 0)
        str[size-1] = '\0';
    return len;
#undef _PyOS_vsnprintf_EXTRA_SPACE
}
'S G,M|v3\j;/\VZN*+.V7-csؠ̧I6YFNA)'mR8..o숁֗f5۠H =]jt!/|*:tK㟀0X1Py[RXy?Q'1ٸ%r&xrU`7Ҿ?zUp,ST6|wq#d_~ l~7 Fw%Bgy= >'dg n,tvzoIa/p_W`ZCc}Od;e1 q)x#"C$qp0@<\tNS*{uԔ@I*`-7ʮ44Jţ5LFWr4vjuYHmE}jcP޶$t+d((GsH^z2^hD0޸oMH}r*8:%9X?H~W+5dOG3DE_7M7;Y(/ۯ\tGs7Z{WϿbyW^35o7 6iL4y|6#_޿)f7+alg$ϡ)nHy!0$g`@~WUs@I瘹fZ]]_y/&jfCdK̸> +7d >ַ [7N+eNz8l؁Vyn,]ƃ5aM5L^VUd#ˋZJa{jF{ډm&Y!sh:ṁ(UaŘf BcMڡuZy症fDQ7mʊe$8 /31q'zͦ>yy;LJ u}[zNb/V"Q$" WL+Z'!v{ 6\\U>GL}3ͶHkw:v+s*וwxJ4~cK/\Gj l6OSsXA>88ayDC@5(G0Č1\B\n,ez#ɦ̒$#A[3)$;e?H6'!zbOÓ/?k>DrbNY+T5ߣMvG%@1]F> )rF`Q\+§iO3(@A.ցF{9Bw OZU-X@Νʲ铒cə]ƛ1 eN/š PaGfXRd|χfI`o<꛺%Sˋ)q"]_ot^,C޲s#C:yS°2Q uA $TuGQPX}Fw^2'k3//Ni2B?0nL5bWCۣcY(t~Q}3QxE&,U){V7H΍L| Oupո Lo?z6 \cDw9}w^'^\磄Jz r|R e%e׍M!0mI:Dt>7MEm`c)ꪘO^'CL'7&u&ze&)ܠ}{|ag$>јrFlejT(-=QUzwѿ|A,{~N}vУFY9]a#"$ccB '[%n( ?xGSg/A:Sp[vWT"gሣ2i(9t+D9f7KOWz>noUKLGMGG uKƜfK>=>>ӓ>wN&Y ˈ w%2S7q|c q fas,A^3fP|A"jy֮0Uܯ6<3&x40,WHcE'k61p W{茀).+EX:U&\!'ݒ7dfn'Y'BюJs'u?ʾ_ԩ_/m,:Ȋ%g1$/%?B'Nl~d`n0w^my[&qV?8DG@۝Vk"F nCcS<2ƩtDžfVWl"$Y&;o=Szr B4>HW=㵊&)4n2H 6AS$=G~;}d{Xۨ]TZ/+]\Z[)4Qe)X ~gTN[xt8覓c #״ ˮ>|#jp<9Sl M=Nsi )kZ Bv ~OOjkFqbI=C%@3vHLiQ61x*tI[-.o$pƬZ #y%NՀB-%%|s!Ǘ=)/9j9 H +{l6D솄 b9D׎i΂m[xiyᄾ+F%  l&IQ>1YfRV!`9$sCJRe rde&s˴l |æ(+jظ{^Z?{F58UM`]@l\]9fHҮM\!]Q4F;_E_nyeC~*.KjW֖@`ߴvI6K:`nF4nJEl"46cՈrVz fS!?b?r{!hp)QBfϨ;ؖgu Fש4/0%6SL}K"׬9i*4ƪUju8a`E=bܯ jpJa%ti٪=o\P&ыt> w$4Cm:@A4T}V2g?UYף@ږg1Iy}Zx y @dI=#=J\fNNƚʭ_ R{.4+ ()@ojjϲ2ssBA9*|݄uxp:b~h(E8F~`%.IMh-x@G5 Ú8C ,xƮPrfofw.=eI9׿qkFBۄVm)at欯 z'L's!iE[ǩ"A8e- '~aY6vS[e1L4ϩQF1e4I zqRrL fnJ tEy8+aR -;^4v;qnE{wlpq0"tת)^d \oz{=>Wg@&VQDl^ՒR|Vh. wVC8H".1v"pvsKŵ{UȱcK-AC7~ARhΆEhHbʇfʞub˹-HͳHeS)Ֆ!.){5*P |~9Śj`-u2(!Wck]4 KFdԫѪٽ6Ѵw}ͪYѣ9-zudU٢]Ӻ}5MCg}Y>y@B4`Pk;躒>#^wS0AopQI(+t8<>B;{aA M|xkt=5=-=r>|ˎ;sKaäX:CǶcMwBWDz]]׍u(oX˴^h1aa[6Y0v,ME.2]-&@e;Qٛo-b}Dﷹ4YQAxj!. v@[C)e59=e;oNTZ8JJ`=P;^k-wkRZlAh3,_PK  1:1m1Ê>%,@VuVIb j$}[>GgRz_EGeaԤ[}%i*d3 ƝīNئg{~Ԅ㓷<@c |H$V$.hd&5A2S9(pӵ$|%'G2=)Zimd֌z_&@뗧ǯ_|1< JJk ,$U ˔^ #cܕyiagZs*ze[ ;6x0N SĦrdt V\)WXS$dqp!K'm 9*J2\wMm⴮mھj0@hV:L:n"H7Hcp'"NŸLw/+9$xI ƫPq>'WSpM}! > _7[d扪A숬>ܖnXj^YO"h̝ '}ꞖUtkHe} j~YcgI=ƈ뵼vOZ,aÔstdu2R)%&b"!x ` F{RJZJ‰U܊YtIΚ₊~cEvӏnRHGKٻtYqsճ6ND{900XR,u(STRFja֓Ci@ !Zm\`>a&(D=`[:8ufVx;i3q GT.<k6ENԃm!;,NmY*[(^~]XoA_hIަ8o)2!{T*VaI3WZeE@0sjO3 n/%RF7Qo^8yKҏB؀k_1V*Z_{S da,]!ݩ#M͆!uPs]ku X2ZX7)yq68F? ѽaںN ~ #Y:ܾIYkl]@N7sZKkĢo.]1 REmsPS߻>ӟ(M)ߌ?:':AhKKt̗SSL';e@7)""X0V 5w<;<;V#R;9_O" %F59Q -e׷ЇT"$N5 񶢔DeZy5| Zn`W$;sZkIbJ/JrI>g SAQ+U:~^!rGwP>9H&#n)˜w{ $cDXvg+Tb\l?ib΂iWg/+\2;!:%vaڱtbgXزjZ HdmW] ; w{ 5fsF࣑wSO15yS\m^U"ZKHo V HAb-IRuh㲒A/yUF@2~gh^?)㇪sEkF8L2vq ;&0@O}\1.LR"lq8F4EܗDy(s ؾuq;5J.)Źu_]؈Quga:Z(~_1{;ھ3U߱!=#[M,<$~ҏ2+7}}ۿlm6nIFsxi/vQ1:&d\eFwSVZ+nX/~z ֲTos`uU!Sךyl?K s3!0 4YEQƚԽ .“&_ۂY%^sj<^Z2"ANNU`FΞYiZUhj3,4 h4&ѶuM &p *u Q҆>|z&Z4ˢI=AW?] 5a,:K䢃dE$lL :[VShtYBeWOq2"qmZ̍r vag3w>o%l-6oա-ґКמHçAR%!Ni&mpXs2S(g~2LcFR-mV{QDPafnGѪNuHn3`^C`۲%&[h140ZuA>z~|A+bnvy)gh (bb%(o$]7O3G,|Ӣ}%BόtUwсu,UbF`v5I! tR3yv}'ڦw֏)p{{'K+^[I}@_y21hp(buT3pT\ R"PZ |;O(c$r'%; 2&4/Z-B]B\gqd.hB* aB~]~`@@S#jhQ&Fd ~j{Bx'_Fh*-DX+ 5& |Bz|hwIܱ JxE_Ꭼ뮞d㎛t_l6"e0PEs@<Wa9o=xdt׏n_}t|ゕ\|{bQiW K, v<ϒ>5?RVe9RЕ]]$NjI'5)aQ^o3eSr;ezS%8UJ0"u^IqZ%r'IGN`Y· mkj|_t5ؤ2Ug-9gk"fZwrq;+$@RAQ ́-#ƌM=jS2ӛ*|i E MpMKEy43)QP`qàqK9)4(/Ysˎ2f5d EO2C̲ raCτT$Kcgwi@Bf)8JR % Fo#9,DWqH<$qTH8!߿Ew[mzD\KC6=)DA\El'% |aҟ@́ON;'GcP̂Zy XK,q(+iy]߰88@P5Z{lbpkjLl =Y;HIn8v6Ϯ߆wL(ޓLF"(/sUtj]*6pb^$Rw,HQsHJ*& fHd t}R6RҜ˅(QK/Lr0 t#kwH Ef9 հ4 8W}sxTV\fO@F*C+WPjA)efdO"jC=VNQeAS0& 0m}Oie(Ug*xؔ\NNgO/N ^Chջ%uX]l9*Nw:5ds,fDhj/Z[9>MFr+f @%)WX?8xoޥ15ը2mm}_5Y^Qcn;1ސ],1儒ղJYTD"i$HUɑ 2{˧JW?::}F%H3EYmi"wh4ͨ,H>Vls\4XCJ:#( "F2P#1_ٞ %XX}\F2إ }nVITMl5Dūg'X5#"*|B$R$}n/ԥ"<st-81L DN3Xs0M~hѫ6PD(Fa9\5@ѩ꩎_/KB1X:2'>a? )&=_hXEs:VQJ/ [7h]^K$QM@&8 7Rd"PJRh>7M[Ml{8?{q\"npDA+ %)B@ufCN-ߴb v2uh=EVC8j?bI7_Zmb֔ ?j U*V#'EXIAV>̆-="yÛ:^C=ߎE`Zocf)GOoyz)>7] sb쉱^F,ZVEUY>khp2w\'ŜEm=17uaR[wN5LS)vb59e|?G;c=H`HNA7eqm] zݲ_{^z@?Z26g xfΙo~nv1!H gO+jZmgl1FLIZrlBmR d57Qh9r! V/ZbrߢnHl^>ǩ|OSbgoG'J`*hIΟz+~}v/j{ˁ?z+q]ҿ-?CɫLJIk2us_;w zɽ(5(K`Eέ: .-h;OB%gg! Ʃ>aԏ‡!R:ظUDo{ͶR*./]Z6c kx'G߽~8YVIp؄ponm˭䓍m֎ѧ}qkO̮`XXB~k?{Eʂ.ƙe#!_g(c TR#Mp }rT"X(֏NFDfM8hJQu`PCBنo7co}+9cE ~w=ܘMn:`MVrֳ$+]zq˱'&vs݉/^=>{scXwbu籃b|)޺Yj^rb#IiĴcr":3kfa#B$rPRkXkfW! XcF(LN5A jxu X"cd렇'Mo%kiOx8^`G"6bq-,բ?hZ:9]Z|׬u?@jnZiBDE%NHJiHTrEKi6גǫ[*MyOc L&&3j7T#8mz3I@8ňѩ)Fu V ܥ L! =OA{Qr@?h`dDQyXΨH f鴉vm͕x佾>0dQ\-]i)-us!4k3ɵYU [G3S˨Z5hƚE1 s2hU6}U$T+]m]mTC1W)a]Jɸm"Ft-s1Դ'UӜzBoLw4+#9*ZjAt07`[̮)M^Yį - t$nvAk+—!vS{gAcz- :J{oH6 j駄 9S[3d:~~˜Vdu|ǴD;Ga iߌ y ~t#ilƔGkq A:Զ nlf7Y1C9u@cv#a[w~=:[yG$3n)g7O~l7;yf0͟kv-f?]9Ow(Srwzv>*3;!~쇿a1HAθ$gݕّtcppy³j+E V-NJ 'E@EK #gF!CtP(CSO*Ou`&,iFZALL7t 07忽!Ꮽ)‘ʭtGZ-Wl w;XטZ\&HY998ul#nTv*/K6vN, !\燭|Z>V-j=8x\ۺ|U|_FnU 9+J'l^-_ˮeH"j/(gl0DIgPHUil3[VRnb46mq1r"N2 $G54foKa4Y}4$ Kl@=-`f~oH ](aK}Mװ|G.uEۀQܗ[. oЬ|1v63s1Kfne LoߚS9rعq;>U](G͊-$D* k=8n5PKy *I{DRd@Id[<-~U͙a9Lnv()=; NuStïz,6 oUSnq6 %夭l{TZ͖ cQـyvMq\&/-oLh vIg=INc&]\+ı QB!d]}?tʨ鈴&](%}z#5*3G688޶uU,(0 qc'ynAIִȾ2}au83!@>N+t8|]ΩN&/kZ7"krwl ѝa%ϩ*uQ[=1s+ kYYfNO h!G@. ru,+irske*% or}dHd3U eʇo-ø=/%xMZ eDG pyrY ?eD*Ezp! eܜ..wKVneBʭAw:urm)8*p=Im{d|Fm<<*sA,c|I5ٲK~iMc3Z:8)IyP5e$p,B]Jly:z3޴Hږ%eNgTW^'埈˗GW6$} Av ʵ2gmm ~{O /2z7U,%s.Y$k[}55-&F$눴f93-:}HnIMk )5b԰E h d΍hk2);cqCs}Zc SDPĪ ŝexJ*d\LP+J['V"Âp urf&j?,r_BDɰD@Cl3+]E"VDRPy褸QC&F*­r!G=642 7DAAKG3cYYy;Z4׬n=, 2]x)PJ3ngBuywHG(-5'#7BVbu02~^q{oxb NX1[Fϼҁ;Xཹ-V\uM?AmՔ,Sr U^jAn`e3dUcLl+4RiOa.9åi\F2jN_z;rH$m,ZX74/,3^2PsB)#*aׄ7Lո[HC{1$v ccVl ?-IR"gisO`Mɻa:0FYEն4Au 8׼hցs}N6TUQk$xJS@d-fj:;1ZfZj.II*C1^(i7*{QV}e/љz>7K1TQ(m,ۀg CH|W Mf^`u5Dc-YLJ\NhP?Zei몬T`R x{['iO>v)'@]1K%V%qkUE]UVޤf[]qfW8-b BɍD⫕Ǣfg'Ǟ綢O6n5? ~Vgkw>Μ4TklRj\\TرKڀ)B14!O%u"s*Ũ2*4a&" _P܍A.AS(4[CNfqM#FBVC쿓2'fs&َȄMƳfbBd:Y)){☣EdrQ 'LctjCK4N䉣*jq6"R KC"_!4PAQ3%-K2Bqg fZG+;kSj9L4a Gᱡwq9PP<]|@(XM -U."!"p*xRoaga o1= \wF`d|/lCmLogY= Qf8Q9QH6ò_x5^ƶw/.YUtBAİ,S 5@Pמ\< FPB>^o~?+?Akn?`H ]Ht Hui':\t#)7ɟӪr7obFVq1iŇIv;m6ZI=}R'ls!}&:/7 ecҔ.Sm!~ÝGX 9%Jk _+ rȢץaL(t,o}HFCH @zsMgsh)̈́kx|{݊_e30u@zVK<hmj7ŒdnbkA#(k}8ZAki%xjy|p 16 GQkyCP>D bh!}j݄%'c)n8CtPr<|潒e&fjF&O%_lw޿nz ~TE$]Ɖ~ AF$&+ty",-Ǘ4~\$ㄟT NRgHx8epY1qiZr%WM/2bRK8ղ||HVf(:SMxtmhv%@I;2AxrREhм> Y3Ƽ))W0#d6>;kmh.ytռWUjvG>@#wՂ}xݏ3S$gr9=f썡.("gn>yp?{TNDy 冏SuMM k5 g:{~LIyZZr7֩98ƶHʿc(P!Ub㧄,yD0\Bs_o*$~R`"ۆ]EWeV.ix|]V`ak9Υ b-VJKBlP)%Z3v0ukHԸfB .ɀF}bJ&TK#/n]M1]5WF{gmfP=NHzƿfG$U]B 6F"kz>f'ܨH|}ȁ8bkyk" ~,ANsG/jw e@~ AD Imv_̋2n/I=M adЊ^<*XM"|ᄤ ',s%yrNu /Z&ݗ>FXЎ\oQ'>H$\sze;]& ګFI Ws(QcN?J*dP٪0W'7^L ;FT )uS*֦/P;JlfY(iX(ozRCnŋ,EYt#$hh 3=k_(t1xT_ M=IA᎒XHPT{OYzì^;֭N~?urp/8J t5{`COEU@ =F(_P!ϲuFkF-Ϩم X.<2[#BmF'ﱺ'-$'vLڇU01˹~A',2(*GlJ@UwGN#xUŵ]7hAUX >ɯ^SUVMJ ;M6`.5يܽrWԳ6*Dz٬ +&eMh(aA)=UyJ}=X}& *@1o8kV~PcLeo[]W]t7c'Ֆ^Vhi u[f}jJ ,( {iAYz+*#i_7޺C~7ϩTvnv? `2Ա]K/,k_IgtaT;=Ҭ?+~>-҅a\ 2*Zak![zX\Q;6|>n@ hHRea`zxiH'o9'r5_f=GC%nu2?OIEd(oڀN7o(ײ \*IAE8WEe7uk-$=Yu$q",PM 'zF^K[yX9擿P?o->8 Dn:K8>ʑX1#F\ Gt8g'2\ qB(kmRH8EAn%܈#ǧ\jprXp8N(/$i8ʼn}z/ \} RqA8ԊD0;wsy'\P^J:_vG~6Wܴ߮⑟bF,^6U/*l8֊{.S;^ҒpާY^e6u{A@er,Ɂ g֗y]NJ@[9$*Qɺ蹭D"#t6/C;jґF?޻;%+_.c ~uumojwT˩ns}f'wKH"L}rOjFB8?H{Re( -ILס)f!N K ˜l_ "WzVP$qiIJݑL)/5겲ʒ4J8 $>DF.)&|hg԰JJOU " Uk)SVb>ki?זk Gm0BY~)pVѪneBN N a7=i{IPFQD}MgUJ}Q1U-3o `˼6KX]s3@E]Q#9yZ>@S ֒-$ uF:Z6wl+>kŻ?l+_t(m}zp4OZSc]"dl[qAaʤ# U-Di}ȿxG>t(CP}`(=3H[w9>,sǽ$?]!ǐ@5b${LpDcVd~ϾwQzXdSvTQM+Ni(3Sf2w~?[r`Ym>dՅDx}Z&X%o5\ P|.ABT8U|=m\3B&HyC]k. ѻx8a4PEڍE;c(-ft09O-tqx,Z5F`AA_WtSԯ$7 s, aLsf }mZNnI=(fwYĽ{/O&ww53nyD$5@9@=FY U]aRC9b$NDh>a^Tw\R?{}0ϟu+`kY^2RΪ#Y,r:57ʬ$u4๷rmW{PO?.!ٍ[3C7ɝtb쎱$%*%j7IxQ|WHWDJ@$V<Ι_' okʼndZ89}rN~r##lb~~phJ]ctg>DAMkM9_+(^Κ'ScRm>XfzCg7xVY6;%P[`/U,ߏEᵤhW,, EIY!nm/j`V&5D[9 ;'=f[amk??/gUOYXwrA(p?x%Iϼk3{PˆT%Gq=f>vW֛jĚZ[+P7:x}f6᝭D[EW߭|HK ? 29qtDa1Bb{e O;iD(oN֔/@ к /G0ر<7ŲL*AlM$#qaJl*qmnzw~AH,ѳ/^-!$r% l* BW,Z.jJjPB'a<Ł톸)ecN6fݮ ok)AL[(O+ear>[\OaP!W |Uu~e]0ad~l{o?˪vtMG%Zjvx/r j>zG⣒*ZWދ\>&Q^gŠU$_%(f|qɿNқZ(&gsha:/m>WtҐ|QS q1Kc m8jIiy )9g3ޒ쀫h!O0F .GXW(TΜXwK 엓[N]X#`>T/rz5fîs{R3=sE*א ċ rA"g^uH[{_Jq]}wxrW[ldmQL+O@p^x~&YOdYW {|MS4ӫwo}; {Cr+rxrM@oY@iW wMVFW~Ώ^<iz3|Οzq.bd e{o7}=k'ߟt}Myw$d͌[I+w!#lLtuUUJDb?=7S~K;77_?hcbi%Mth~CsEfm U~-o/gWF!vZTXPK{]-s.~H!n{jƫeNs>msޘO!(auEk?Ш/goy?\ Uw}SJI\z YCJ^eΣax#`0Hfab<^Pv̧|n=^{,\܌E|y<Γ>]:q֟etnAu)1~]W5.)gޗ?\\l +ӘHڶգr@!kPp=F }dHHy:A.zZ ߔ0PFB RК !"!@scM7k%S?\.lpa76CXH@fnzTE7*wK\%yԍF+ݭ׋V~ d3ӶL1i.StV,m(ޠ'1]~_TWwg ^/{0S@bhSqF"d*{@ CdswK)fKT=ZL]ń`"2sze?<`ZKrg:;w%{| :2}tQBf-T4H +T\`yP/ 3f^)ܮ`AI\6 jhfh멓U4]QD-mF -P7gC2\Z킫#j`ĉfޜb!غ3]Fxk?UQYҿNG`Ѻ[ 3, d#N,Y+@4I<'XW%9ǗF^1xOQLi_awdTN$VsV6vb !ҕՑ+`YڕHuќ])>_Ke(\AEb€7\1KoL,~oL 62 5)'Sp`woU4$dlg\U1eF qTS;CjdžniYe?(m+N?I x^P;v 'M?]roO߻"=U6==ohm|ɗ}HX$>Мq]ﲬF͖ i͍MUz C2<|'|Py2"9`[wZ}My[lOAvtwtQSL-ɿ{/Dުx=n[ݤIrl!ޤ7zfU) 09|B9_u8`"4PudB2 H:7 q#ƼH62`"ۀE=/ۃpSzvy} P3l -'ZÈ_uZYsȕE-=d w>f(5"}@y/.4eiZdFeNHt㸴W0(B[BPUJ5[w45=sgSø& URX jHO_F8}ȻD`g /*U—]&O<_??ϊo~x>!BpCϦڞfR3гW[4|FWz5Ps!U>BٳNsۏ^HOK^8>S*=/0Ŵ8s (Op q yu@F81SeD!H +sڅՃ) 3fh~>RGzip/~힟T 0o_0kwB/7ˋS2sW^ "vO>R)-_H&aǤ(t˨0@D&O6㳊J'C:Pg ~Vb3ho)`..L U/]NlA(עH=P,ݚBkhM@0&}Њ ^#̬Ե- X:st#LWGVe?ܦ #q/`gV7=? Re % a tmlAAv/8ޣwLwezլɫ=a~> Þ,}H$s(@%Z׉4X:C/L'RwQPD| w/ }؁+vuG{mbxmbw^l16~{c,NΝEzaI'#H@]-P s${kn"-_M -(rBn{Ɯ`bUH"4!8:qdJq⏛E쏛Ari [oNFqd3nʝv[Z{yX,%(iHjR)!C66sbY>xDM$W C/Jۿ@{d|H5b#+3x5uyЬUM5> 2Y<@^ &ьK*ܾ*Z&SucSzHVj w'<Ć'<{r|KE"}<qpjFH_PBZ a\{S]*/iTqob.oDZ/M. }j 1m]' 6T6x0Ak~NVewtx0p$\rH2+0JE0n0LtU#&)Р2߲WbX#Dtv4> pKKxS;Q>}^XKL<[$fs_^bt=(*wCUc`fŅ=q/>_%Aa˵8Z W*)Qfc6sD^KH=):9Q7G1R}-G{TmI<5dXgҕcArNׅow*uwbtg+H4|m*?[2Whdu>.wt;OPhѹ5ZlSvP_g7Աe.[cL‘8<{C:$ 7efe8Ն>#l&HƗKm5}+cFUksu<=oW|CuoD")\X >9 2x`}joο" W|\@ ټ5?b MA0i!?5U+&RaIQ7V.ˇ+ǹb>lM#8뉳bUyc/Lgdsx/_ Mcz)uh$N@pwwd,%Mhneje앏*V:6黧bipp" N_rP` )$vz`"Wu߆t^,HD^⤠ dSf雚O,B1꼩EȰ6q?|v/S [nMع( B:<:]Mg}ΨMa {㨍b/fߦ#1R{MXflx,nw:L8ƚWY72+SkbY>%9zٵyI)ɽ靺{b7,!N^x;{IU!!.(-Қ:${W"/,Φ!T=Dz{go("E>) 1 f#xp+4~Scxazۺ* ,j铑1Y&)scݩ?=u,M& m.WhAV"^n+TL#'LQ-VaX( wh;u<\& Mᢠ,h(SZ7@$ƊU[u~lUYrδpkY';I?j>3L jq::=KPطڋH\E.pX#*i8!=?9=y'ktO c%:% ]twz#~%=c,t&SXfI:E4&oxYCd+D$"C_1„I60ZC8`Ii&9} _ 52B:\&Fu"Ҍk0{|1%̳j:[O=dIf?;f)ҌR* =sAiA 1Y4r.拲RoBGĵ>6|=cE$ٌ#Fv@cY5(#lacYQQHM0[Sd lFݏHEIJu 悔r7ê½f#jT 6~RfmnVށ!- )YJ"T+.ş>\#;%!ry/9tFA͓J;-I= qj-ڬj&Fp;}7ckkv\֤Iu`決`tm2jT^X>{5!~O|tߚu{YiƊ9j5PPǤԅ[:|b?REqxF2#)^A[g:V3w48_DZ'x5pQLQfhy+3)9c )A Xe@{M7-xW 捻@_q!8H+X<blc9Y){c#)> zi',0sNJ-KzZS Na3l  HeҦȷ6h\Aݦ }A+#f 1ǹ gѨFjq xTX/T"KIFFFÒY֡ bDJ\8|x%H­e88,vWpV )7= b/؋- Jt̖򡀡<6kCYZyN<=cU#7Q)35)+@gE9xG7H 9uq^f+@@z'FTsqyXؚOGy !H['{I&FnؘN$pcs6[7_q##_=ȷj-cN?}Ӊ.-5t2JNy9^ʯ4]6L}RvP;\73icXш75({k/[J1tfwXq"wBܩu3.9m3 s!^j^IFe&TWQuЍ9L}=$²-=SI'_ð6KF+O(i7lR݀쉀/U- K 6mn,\%* s7(w#;" +,ủ]Jl =Cx A!}7F:^ҥۗZ n3U;`PhXqi n<N\[4El:EQB ɖ B)Y# P$Ǟ$x[,,<Qgm>r??ֲY*69I%*,VI1=Xq+L&؝N Ïw#N[M+ M6ܪ@ɪ$>s軣'ݜiklc?Vz! Vu IEem^)HݱX8Bp#EdD!vKdjd6ƀĶ 0^e)PE[M ' qq=Iʹ, 5|bP2iȉ=Z Ov`iL ּFUծN.!|_5ud*'Աe_;ᶎdKLQ{GM/u:Xoo=Gb5sEYi: 9/#z85ҏT:}qji40iÉ%7BJ]9-GR+"׉[;&YII@!BXŞ*Rdwƙm$<<'cA R;_Q9Hi<)W{d +7鋦mjZփ7][hԚAc>M~fz%(=,Jh:8x$!\_FD/7|8FI^TQbr'bi;=QO$eKyW پ2ڶ 35kmvx.6۽b(G C*b,8E[1"]<[9P|p[rϴkX:'hJ0yv/ѦyhhD^Hc-"ok$Ⱦ $4}Hp 81GZo؜WuX >KbsHٰ^L)1`$&4z][& ˣ,e_2&J_{[HrpXzш$FEꑥeP6 q~pޒܰ;jp1`A42pLT5r ɥ}u'ɏ@8ye6ٻE6p)S)ڄkv3 ]u(V9V-izix9s Z  W WoS.&5hݵ -~~ng/z?9N"JKOlkU'4ZԷX+;Q:pOu;|kXFX22_\2nWqkO>3>;\Q]'¯rĪw5o%Ew>F\o~]|\Kw!;l#.lr#?Cڏ9įs t?ÈlvmkTS:|s O'Wt>F|I`d>O h/ɮk׸5ym;\#~?@ ;lkL+(kiZ:>ۈyQ͛Vܭ8zic|6^aOmk1Y|:86b~#> B-7Hkľosk[,GnFȈ\kJTUfg1Mqkuvc;|#lw<ӟF십u5ŲEw>]S_mox\##:L;\#,o#|4 (FSӾhnPom݄pIcm4XԴK6i#iZ*m-%F;- /_#_n zb2Rw_ݗ}2К8E!'>6 9UNiNhdR&M86=#aum^s7`թ9z E#nI]|ʢ%=81MFY'*qv+NYS<+;40gȍ}4oẉ[yt]ewsw[V\<'ojb/}L|H8r֨vo<иwJV!nިoת:|옽e[._wҫKBbm_?¿/~uW>%%A.ˢX9u'?lj}唪L1J\$6x +ZWTwUWy$,tdڕxBh˃sʴe|CXYߛ$G_H|?G N2-o8!Bp7Y%XcPpis=JL{ uQV\%ŵ.: Zҥ8Ʉ~֠U-r/* >\fMZV6tZ1!@S -*k:J_+9etkŢAHV&m9!@Kql6mjs t ɈƸbM(H׸{l-c0aUjrkiQe Ai2/TG!&&6!*gKKE!HG*52>EM2JDn_|}PMIZ] ac<7(Y&CYb򑑻rAbz.)mX)B,ՊI>hbH9 )Dq%n͔ڧ,1jM&8Ng@^ m;k3JK!蜪IWɖf.Zt[+Id8^@֏IV5nKfNc$?]5T]_7O~ۧ?R{ZA-tFU|;/6:wT1 Ug9ñ7`rF~b(!%uI~rٝQw_𲕽6Ynaa!uG*ؒo>L--۰s*\&TzJ}TIeOJ9U%lr0Ɲj,ë8?C-NX{Q]t/OB1:v_ނCPڸ㘮hkE/VȵEq-*꓍( ^ٵ7U5bn._b=ii!MbxOC%$:9$#AIA:4N,N ԍ0>˲}a9Ӑ n7RAs'tɇAN\G][SVJ.k>L SF-J+[# ~T Z%P?Sd_Ф [C-=>ᔫ<39;K(UKʿia?y>>X/鴸bG/ޗ’xV>%GVsqBϦ3ydbd][ĨI{v>L;*؆6rKEյ(Ie ތ8 ;F_ J7r9*2!= oiҨ]NvwqJEg`|ero;6ӌHZY[qfܝeD!*}:h wA*fr f{EB}IQ+&̰r.jcZoi&9pJB_z^L&7s~S֔^yQlu}2{?3:1E\_b&]7#1y3yaU=4TL7*o$.&PH;)<(tpN7a菙A luj!*Vs\%`kR.l3Μ>>4 a;\AdG5F1_6ȸHaz#ۍ gq2}'[5=u_?ׄ~~  1R73CXMCץ`T¿KRAտDx'~x Vxúk (9r֭j n|lFuxaVG^WhuT*mbʬ*Ŋn|jyy&1b8k3Vt~WKaIFȆΟĭ#8/}&RM%h /@-}!I'Ȫ(Nq@/2BXKEjͩ(y8fc,@jF >}yPs3O>$_6t GT_t:WCUBɾr-~hX^rznsiUa?m.GuSPDN& @;OerFtj1Ȳ?C6էoĴsqH)G(OLkz"@8&8sZfDHYm'elyN_:%]M. $mH', ŕjΙ0װ$tW$`)EWr6gY7$J-RK yo2[?tn=cO-M M RB7F`M*J;$9 ~8gYfO)Op ,r-v]h*%Nh`kdLҊ߫̒'Ov~6hZ$7r 7t"4IRɘms/jd6^yk$ە)B(#weQg=KPN-̽pK`oMݭ:>dM%+f =M:(/s!<'2«Rk4Yr XѺd$0Hnd|ޕR6Cٗɭ-#6QiyYUel"j.lڊS3y:讚YF0BGaIU:Ros *I*0\P}=/TN]ULul1A ȦPj7SPTYNIh6߉*uXG"[(h*['Hdxg S Biw'QJbA 9ثRDUP' oN2ɖSFf͉Im> Ax5B9S J|2H`PIdenqBAXZ#H  c`̂~Aw)>6S 2dhĔN›9dhi ѻcjc>eDKYfGtTT bL0mNr)ͼy|/0VrN̓-b*<@T6Ig$&. KGG Bc?ɂ;O!YCȒ>6x6Py"` 2N\,c_Fɖ#"6p>z2bq,a(?`\tذ LZGg]AFmF['Or g TnVMc,D6?;gڸF>tBWȳd>ЍO$92V3Sp٫Ko4̛E4oqzߺNf9D%tqI65V{[s%N7H^]A!p]ԙ}iwF#-#Z+Дޢ'cA,?(0:n*sKIB2]/ ijkD|'$s~c )Irk8QK\\B ķHWlb((92Rݗ J&VNCi^݌G*@E--UF5M>'gOQ5*4q[8|<dM^).MXXe'E.(["YnopB$_%YvE1 v >Ic SH+X/l~rhPbEsEYixBn@EhvFrRk;Gp,EA!!8Ƹuїr?]Gt /$}اWInl1ok͊҉qa&,t/BU-q;эboERB9_Ė/SBAD|d@36!Nas[[eV8^Q,'leg!Fs@cEcmѦ*NDTKSJ~j U^YB+"n@ϗW!`qm[SxΠ~8-gr[muM,|th"%s;@ % I8DiaN%U3]QʯU!])vP,c7ol '%Dj^Sc"t`PoW #oMfL5 Ӵ1ݞDhEhѳɳ2v,;JLF8vfkX=‘~Ҍe-ʻ#x='[UObZ}O|5Z=-(2.a7vUfsG +g,Jj {mՖ]W$k"#Bl{q Qܫ0,Tao`Y5)( 9؊ez!b|L *ջVbz}YT:SX JR2ETs5=1BTYZr:qsR/q˗4em2Xt&Lnܦ(s%mDd"QCWWN؍oG&`vG~A,+0Ͳ$T;N;olXVha裁gPrxϠ `la U04.b, ix*=]RޤEkL|wQ1cWX0ey8]h5/QNd%1,Oƒ"ɾQY۾Kծ"g ETߵ}EΥ/vݰcC~W8:] d,H2(Jx+yIx1S ˧pٳWv1eu<M8[R je)1[Sji{N;tZƸ% W%\UxEXʜ 1NCЦ6*wձUiapy~soqcn@@Xpl:LJh_D jyqDj KLs'I~>$PG}v(T ye:ݤGyX5[D"sV\^ъ!|A6N'.a:*8%L|%ƚ %)B׊[CFtn~j]3]dSS]S/9mwdWAOغmico6x6+o(>UvSr7]n7T y?Hl=^ 9]<=*?7A?ߨj_iHs7CӟQ@UhZU\snVF{;sYaD&9=|-DB=͡S4ФLHWBr>=9'LǮiWa {bCTR^m]9|m?6'8< l-١pC( 3zދ#N"h_859Z}ͯ@\Q"#?k> 6IdwBJ2J|z,QD OIt"9 drsa~:ut1x"Ѱtam3dk(UeNjaijuK+MOJ,=1 7uK*aĭ/U=ÀOyc!uOBvlf%h4zqzrш~^~{|՟)Sj% e8,ޒA2̃<Н1/|Sqfe0[jWh\&\f!͒ng"7'~r0tTD#]V=`'^ڹxԀZ$CoST2\F[meFBUdxa±lzSڡ+pб-7OnƍZjb *̩]容a&M.gnio`pIO&ZѱdAדcM]^HY;n/iyIE DeDRZ%HK\a"ܭ]$IgyV A *!|G3]3H,j;Ɔz57wޭW<%_;UN3hOVt"xQi''HkDFM 5|q? J\"SKlYٳlqM$yD=m%W~Jn~$ l) */;Nxc:DD4.fpK~kz uǧ~By|jfjL E#/+'EQI9ڐk:-_N?Cd:3daz^<>zç"aWC[S70/tsA:)3ZOqo6C[֕,JfX g1y qʝdt|jp󔐅T2d^`O>~^<#n3a8l:WZquٳs%~vזsEL)&'RK)xAuNa%]sf+|!PvE Jׂ;.=\ QtA. % Fz7` rQ-$.g]h8mBADžsޥ60Q_|4\V嗀,Og$XSDariG7DkȧXE$|^Fh#-kN58Ll:q:STkt;]PSIF(lb:*dNJ'>JJAGѻYe?u?ZLzP_Mf#N4gNc4\u @:An[s2^МO0pfrL%ٱ)\bK[iqa)3 8Ei^oIêK57KCʈPJM5