/* Compiler implementation of the D programming language * Copyright (C) 1999-2019 by The D Language Foundation, All Rights Reserved * written by Walter Bright * http://www.digitalmars.com * Distributed under the Boost Software License, Version 1.0. * http://www.boost.org/LICENSE_1_0.txt * https://github.com/D-Programming-Language/dmd/blob/master/src/doc.c */ // This implements the Ddoc capability. #include "root/dsystem.h" #include "root/rmem.h" #include "root/root.h" #include "root/port.h" #include "root/aav.h" #include "attrib.h" #include "cond.h" #include "mars.h" #include "dsymbol.h" #include "macro.h" #include "template.h" #include "lexer.h" #include "aggregate.h" #include "declaration.h" #include "statement.h" #include "enum.h" #include "id.h" #include "module.h" #include "scope.h" #include "hdrgen.h" #include "doc.h" #include "mtype.h" #include "utf.h" void emitMemberComments(ScopeDsymbol *sds, OutBuffer *buf, Scope *sc); void toDocBuffer(Dsymbol *s, OutBuffer *buf, Scope *sc); void emitComment(Dsymbol *s, OutBuffer *buf, Scope *sc); struct Escape { const char *strings[256]; const char *escapeChar(unsigned c); }; class Section { public: const utf8_t *name; size_t namelen; const utf8_t *body; size_t bodylen; int nooutput; virtual void write(Loc loc, DocComment *dc, Scope *sc, Dsymbols *a, OutBuffer *buf); }; class ParamSection : public Section { public: void write(Loc loc, DocComment *dc, Scope *sc, Dsymbols *a, OutBuffer *buf); }; class MacroSection : public Section { public: void write(Loc loc, DocComment *dc, Scope *sc, Dsymbols *a, OutBuffer *buf); }; typedef Array
Sections; struct DocComment { Sections sections; // Section*[] Section *summary; Section *copyright; Section *macros; Macro **pmacrotable; Escape **pescapetable; Dsymbols a; DocComment() : summary(NULL), copyright(NULL), macros(NULL), pmacrotable(NULL), pescapetable(NULL) { } static DocComment *parse(Dsymbol *s, const utf8_t *comment); static void parseMacros(Escape **pescapetable, Macro **pmacrotable, const utf8_t *m, size_t mlen); static void parseEscapes(Escape **pescapetable, const utf8_t *textstart, size_t textlen); void parseSections(const utf8_t *comment); void writeSections(Scope *sc, Dsymbols *a, OutBuffer *buf); }; int cmp(const char *stringz, const void *s, size_t slen); int icmp(const char *stringz, const void *s, size_t slen); bool isDitto(const utf8_t *comment); const utf8_t *skipwhitespace(const utf8_t *p); size_t skiptoident(OutBuffer *buf, size_t i); size_t skippastident(OutBuffer *buf, size_t i); size_t skippastURL(OutBuffer *buf, size_t i); void highlightText(Scope *sc, Dsymbols *a, OutBuffer *buf, size_t offset); void highlightCode(Scope *sc, Dsymbol *s, OutBuffer *buf, size_t offset); void highlightCode(Scope *sc, Dsymbols *a, OutBuffer *buf, size_t offset); void highlightCode2(Scope *sc, Dsymbols *a, OutBuffer *buf, size_t offset); void highlightCode3(Scope *sc, OutBuffer *buf, const utf8_t *p, const utf8_t *pend); TypeFunction *isTypeFunction(Dsymbol *s); Parameter *isFunctionParameter(Dsymbols *a, const utf8_t *p, size_t len); TemplateParameter *isTemplateParameter(Dsymbols *a, const utf8_t *p, size_t len); bool isIdStart(const utf8_t *p); bool isCVariadicArg(const utf8_t *p, size_t len); bool isIdTail(const utf8_t *p); bool isIndentWS(const utf8_t *p); int utfStride(const utf8_t *p); // Workaround for missing Parameter instance for variadic params. (it's unnecessary to instantiate one). bool isCVariadicParameter(Dsymbols *a, const utf8_t *p, size_t len) { for (size_t i = 0; i < a->dim; i++) { TypeFunction *tf = isTypeFunction((*a)[i]); if (tf && tf->varargs == 1 && cmp("...", p, len) == 0) return true; } return false; } /**************************************************** */ static Parameter *isFunctionParameter(Dsymbol *s, const utf8_t *p, size_t len) { TypeFunction *tf = isTypeFunction(s); if (tf && tf->parameters) { for (size_t k = 0; k < tf->parameters->dim; k++) { Parameter *fparam = (*tf->parameters)[k]; if (fparam->ident && cmp(fparam->ident->toChars(), p, len) == 0) { return fparam; } } } return NULL; } static Dsymbol *getEponymousMember(TemplateDeclaration *td) { if (!td->onemember) return NULL; if (AggregateDeclaration *ad = td->onemember->isAggregateDeclaration()) return ad; if (FuncDeclaration *fd = td->onemember->isFuncDeclaration()) return fd; if (td->onemember->isEnumMember()) return NULL; // Keep backward compatibility. See compilable/ddoc9.d if (VarDeclaration *vd = td->onemember->isVarDeclaration()) return td->constraint ? NULL : vd; return NULL; } /**************************************************** */ static Parameter *isEponymousFunctionParameter(Dsymbols *a, const utf8_t *p, size_t len) { for (size_t i = 0; i < a->dim; i++) { TemplateDeclaration *td = (*a)[i]->isTemplateDeclaration(); if (td && td->onemember) { /* Case 1: we refer to a template declaration inside the template /// ...ddoc... template case1(T) { void case1(R)() {} } */ td = td->onemember->isTemplateDeclaration(); } if (!td) { /* Case 2: we're an alias to a template declaration /// ...ddoc... alias case2 = case1!int; */ AliasDeclaration *ad = (*a)[i]->isAliasDeclaration(); if (ad && ad->aliassym) { td = ad->aliassym->isTemplateDeclaration(); } } while (td) { Dsymbol *sym = getEponymousMember(td); if (sym) { Parameter *fparam = isFunctionParameter(sym, p, len); if (fparam) { return fparam; } } td = td->overnext; } } return NULL; } static TemplateDeclaration *getEponymousParent(Dsymbol *s) { if (!s->parent) return NULL; TemplateDeclaration *td = s->parent->isTemplateDeclaration(); return (td && getEponymousMember(td)) ? td : NULL; } static const char ddoc_default[] = "\ DDOC = \n\ \n\ $(TITLE)\n\ \n\

$(TITLE)

\n\ $(BODY)\n\
$(SMALL Page generated by $(LINK2 http://dlang.org/ddoc.html, Ddoc). $(COPYRIGHT))\n\ \n\ \n\ B = $0\n\ I = $0\n\ U = $0\n\ P =

$0

\n\ DL =
$0
\n\ DT =
$0
\n\ DD =
$0
\n\ TABLE = $0
\n\ TR = $0\n\ TH = $0\n\ TD = $0\n\ OL =
    $0
\n\ UL = \n\ LI =
  • $0
  • \n\ BIG = $0\n\ SMALL = $0\n\ BR =
    \n\ LINK = $0\n\ LINK2 = $+\n\ LPAREN= (\n\ RPAREN= )\n\ BACKTICK= `\n\ DOLLAR= $\n\ DEPRECATED= $0\n\ \n\ RED = $0\n\ BLUE = $0\n\ GREEN = $0\n\ YELLOW =$0\n\ BLACK = $0\n\ WHITE = $0\n\ \n\ D_CODE =
    $0
    \n\ DDOC_BACKQUOTED = $(D_INLINECODE $0)\n\ D_INLINECODE =
    $0
    \n\ D_COMMENT = $(GREEN $0)\n\ D_STRING = $(RED $0)\n\ D_KEYWORD = $(BLUE $0)\n\ D_PSYMBOL = $(U $0)\n\ D_PARAM = $(I $0)\n\ \n\ DDOC_COMMENT = \n\ DDOC_DECL = $(DT $(BIG $0))\n\ DDOC_DECL_DD = $(DD $0)\n\ DDOC_DITTO = $(BR)$0\n\ DDOC_SECTIONS = $0\n\ DDOC_SUMMARY = $0$(BR)$(BR)\n\ DDOC_DESCRIPTION = $0$(BR)$(BR)\n\ DDOC_AUTHORS = $(B Authors:)$(BR)\n$0$(BR)$(BR)\n\ DDOC_BUGS = $(RED BUGS:)$(BR)\n$0$(BR)$(BR)\n\ DDOC_COPYRIGHT = $(B Copyright:)$(BR)\n$0$(BR)$(BR)\n\ DDOC_DATE = $(B Date:)$(BR)\n$0$(BR)$(BR)\n\ DDOC_DEPRECATED = $(RED Deprecated:)$(BR)\n$0$(BR)$(BR)\n\ DDOC_EXAMPLES = $(B Examples:)$(BR)\n$0$(BR)$(BR)\n\ DDOC_HISTORY = $(B History:)$(BR)\n$0$(BR)$(BR)\n\ DDOC_LICENSE = $(B License:)$(BR)\n$0$(BR)$(BR)\n\ DDOC_RETURNS = $(B Returns:)$(BR)\n$0$(BR)$(BR)\n\ DDOC_SEE_ALSO = $(B See Also:)$(BR)\n$0$(BR)$(BR)\n\ DDOC_STANDARDS = $(B Standards:)$(BR)\n$0$(BR)$(BR)\n\ DDOC_THROWS = $(B Throws:)$(BR)\n$0$(BR)$(BR)\n\ DDOC_VERSION = $(B Version:)$(BR)\n$0$(BR)$(BR)\n\ DDOC_SECTION_H = $(B $0)$(BR)\n\ DDOC_SECTION = $0$(BR)$(BR)\n\ DDOC_MEMBERS = $(DL $0)\n\ DDOC_MODULE_MEMBERS = $(DDOC_MEMBERS $0)\n\ DDOC_CLASS_MEMBERS = $(DDOC_MEMBERS $0)\n\ DDOC_STRUCT_MEMBERS = $(DDOC_MEMBERS $0)\n\ DDOC_ENUM_MEMBERS = $(DDOC_MEMBERS $0)\n\ DDOC_TEMPLATE_MEMBERS = $(DDOC_MEMBERS $0)\n\ DDOC_ENUM_BASETYPE = $0\n\ DDOC_PARAMS = $(B Params:)$(BR)\n$(TABLE $0)$(BR)\n\ DDOC_PARAM_ROW = $(TR $0)\n\ DDOC_PARAM_ID = $(TD $0)\n\ DDOC_PARAM_DESC = $(TD $0)\n\ DDOC_BLANKLINE = $(BR)$(BR)\n\ \n\ DDOC_ANCHOR = \n\ DDOC_PSYMBOL = $(U $0)\n\ DDOC_PSUPER_SYMBOL = $(U $0)\n\ DDOC_KEYWORD = $(B $0)\n\ DDOC_PARAM = $(I $0)\n\ \n\ ESCAPES = //>/\n\ /&/&/\n\ "; static const char ddoc_decl_s[] = "$(DDOC_DECL "; static const char ddoc_decl_e[] = ")\n"; static const char ddoc_decl_dd_s[] = "$(DDOC_DECL_DD "; static const char ddoc_decl_dd_e[] = ")\n"; /**************************************************** */ void gendocfile(Module *m) { static OutBuffer mbuf; static int mbuf_done; OutBuffer buf; //printf("Module::gendocfile()\n"); if (!mbuf_done) // if not already read the ddoc files { mbuf_done = 1; // Use our internal default mbuf.write(ddoc_default, strlen(ddoc_default)); // Override with DDOCFILE specified in the sc.ini file char *p = getenv("DDOCFILE"); if (p) global.params.ddocfiles->shift(p); // Override with the ddoc macro files from the command line for (size_t i = 0; i < global.params.ddocfiles->dim; i++) { FileName f((*global.params.ddocfiles)[i]); File file(&f); readFile(m->loc, &file); // BUG: convert file contents to UTF-8 before use //printf("file: '%.*s'\n", file.len, file.buffer); mbuf.write(file.buffer, file.len); } } DocComment::parseMacros(&m->escapetable, &m->macrotable, (utf8_t *)mbuf.data, mbuf.offset); Scope *sc = Scope::createGlobal(m); // create root scope DocComment *dc = DocComment::parse(m, m->comment); dc->pmacrotable = &m->macrotable; dc->pescapetable = &m->escapetable; sc->lastdc = dc; // Generate predefined macros // Set the title to be the name of the module { const char *p = m->toPrettyChars(); Macro::define(&m->macrotable, (const utf8_t *)"TITLE", 5, (const utf8_t *)p, strlen(p)); } // Set time macros { time_t t; time(&t); char *p = ctime(&t); p = mem.xstrdup(p); Macro::define(&m->macrotable, (const utf8_t *)"DATETIME", 8, (const utf8_t *)p, strlen(p)); Macro::define(&m->macrotable, (const utf8_t *)"YEAR", 4, (const utf8_t *)p + 20, 4); } const char *srcfilename = m->srcfile->toChars(); Macro::define(&m->macrotable, (const utf8_t *)"SRCFILENAME", 11, (const utf8_t *)srcfilename, strlen(srcfilename)); const char *docfilename = m->docfile->toChars(); Macro::define(&m->macrotable, (const utf8_t *)"DOCFILENAME", 11, (const utf8_t *)docfilename, strlen(docfilename)); if (dc->copyright) { dc->copyright->nooutput = 1; Macro::define(&m->macrotable, (const utf8_t *)"COPYRIGHT", 9, dc->copyright->body, dc->copyright->bodylen); } buf.printf("$(DDOC_COMMENT Generated by Ddoc from %s)\n", m->srcfile->toChars()); if (m->isDocFile) { Loc loc = m->md ? m->md->loc : m->loc; size_t commentlen = strlen((const char *)m->comment); Dsymbols a; // Bugzilla 9764: Don't push m in a, to prevent emphasize ddoc file name. if (dc->macros) { commentlen = dc->macros->name - m->comment; dc->macros->write(loc, dc, sc, &a, &buf); } buf.write(m->comment, commentlen); highlightText(sc, &a, &buf, 0); } else { Dsymbols a; a.push(m); dc->writeSections(sc, &a, &buf); emitMemberComments(m, &buf, sc); } //printf("BODY= '%.*s'\n", buf.offset, buf.data); Macro::define(&m->macrotable, (const utf8_t *)"BODY", 4, (const utf8_t *)buf.data, buf.offset); OutBuffer buf2; buf2.writestring("$(DDOC)\n"); size_t end = buf2.offset; m->macrotable->expand(&buf2, 0, &end, NULL, 0); /* Remove all the escape sequences from buf2, * and make CR-LF the newline. */ { buf.setsize(0); buf.reserve(buf2.offset); utf8_t *p = (utf8_t *)buf2.data; for (size_t j = 0; j < buf2.offset; j++) { utf8_t c = p[j]; if (c == 0xFF && j + 1 < buf2.offset) { j++; continue; } if (c == '\n') buf.writeByte('\r'); else if (c == '\r') { buf.writestring("\r\n"); if (j + 1 < buf2.offset && p[j + 1] == '\n') { j++; } continue; } buf.writeByte(c); } } // Transfer image to file assert(m->docfile); m->docfile->setbuffer(buf.data, buf.offset); m->docfile->ref = 1; ensurePathToNameExists(Loc(), m->docfile->toChars()); writeFile(m->loc, m->docfile); } /**************************************************** * Having unmatched parentheses can hose the output of Ddoc, * as the macros depend on properly nested parentheses. * This function replaces all ( with $(LPAREN) and ) with $(RPAREN) * to preserve text literally. This also means macros in the * text won't be expanded. */ void escapeDdocString(OutBuffer *buf, size_t start) { for (size_t u = start; u < buf->offset; u++) { utf8_t c = buf->data[u]; switch(c) { case '$': buf->remove(u, 1); buf->insert(u, (const char *)"$(DOLLAR)", 9); u += 8; break; case '(': buf->remove(u, 1); //remove the ( buf->insert(u, (const char *)"$(LPAREN)", 9); //insert this instead u += 8; //skip over newly inserted macro break; case ')': buf->remove(u, 1); //remove the ) buf->insert(u, (const char *)"$(RPAREN)", 9); //insert this instead u += 8; //skip over newly inserted macro break; } } } /**************************************************** * Having unmatched parentheses can hose the output of Ddoc, * as the macros depend on properly nested parentheses. * Fix by replacing unmatched ( with $(LPAREN) and unmatched ) with $(RPAREN). */ void escapeStrayParenthesis(Loc loc, OutBuffer *buf, size_t start) { unsigned par_open = 0; for (size_t u = start; u < buf->offset; u++) { utf8_t c = buf->data[u]; switch(c) { case '(': par_open++; break; case ')': if (par_open == 0) { //stray ')' warning(loc, "Ddoc: Stray ')'. This may cause incorrect Ddoc output." " Use $(RPAREN) instead for unpaired right parentheses."); buf->remove(u, 1); //remove the ) buf->insert(u, (const char *)"$(RPAREN)", 9); //insert this instead u += 8; //skip over newly inserted macro } else par_open--; break; } } if (par_open) // if any unmatched lparens { par_open = 0; for (size_t u = buf->offset; u > start;) { u--; utf8_t c = buf->data[u]; switch(c) { case ')': par_open++; break; case '(': if (par_open == 0) { //stray '(' warning(loc, "Ddoc: Stray '('. This may cause incorrect Ddoc output." " Use $(LPAREN) instead for unpaired left parentheses."); buf->remove(u, 1); //remove the ( buf->insert(u, (const char *)"$(LPAREN)", 9); //insert this instead } else par_open--; break; } } } } // Basically, this is to skip over things like private{} blocks in a struct or // class definition that don't add any components to the qualified name. static Scope *skipNonQualScopes(Scope *sc) { while (sc && !sc->scopesym) sc = sc->enclosing; return sc; } static bool emitAnchorName(OutBuffer *buf, Dsymbol *s, Scope *sc) { if (!s || s->isPackage() || s->isModule()) return false; // Add parent names first bool dot = false; if (s->parent) dot = emitAnchorName(buf, s->parent, sc); else if (sc) dot = emitAnchorName(buf, sc->scopesym, skipNonQualScopes(sc->enclosing)); // Eponymous template members can share the parent anchor name if (getEponymousParent(s)) return dot; if (dot) buf->writeByte('.'); // Use "this" not "__ctor" TemplateDeclaration *td; if (s->isCtorDeclaration() || ((td = s->isTemplateDeclaration()) != NULL && td->onemember && td->onemember->isCtorDeclaration())) { buf->writestring("this"); } else { /* We just want the identifier, not overloads like TemplateDeclaration::toChars. * We don't want the template parameter list and constraints. */ buf->writestring(s->Dsymbol::toChars()); } return true; } static void emitAnchor(OutBuffer *buf, Dsymbol *s, Scope *sc) { Identifier *ident; { OutBuffer anc; emitAnchorName(&anc, s, skipNonQualScopes(sc)); ident = Identifier::idPool(anc.peekString()); } size_t *count = (size_t*)dmd_aaGet(&sc->anchorCounts, (void *)ident); TemplateDeclaration *td = getEponymousParent(s); // don't write an anchor for matching consecutive ditto symbols if (*count > 0 && sc->prevAnchor == ident && sc->lastdc && (isDitto(s->comment) || (td && isDitto(td->comment)))) return; (*count)++; // cache anchor name sc->prevAnchor = ident; buf->writestring("$(DDOC_ANCHOR "); buf->writestring(ident->toChars()); // only append count once there's a duplicate if (*count != 1) buf->printf(".%u", *count); buf->writeByte(')'); } /******************************* emitComment **********************************/ /** Get leading indentation from 'src' which represents lines of code. */ static size_t getCodeIndent(const char *src) { while (src && (*src == '\r' || *src == '\n')) ++src; // skip until we find the first non-empty line size_t codeIndent = 0; while (src && (*src == ' ' || *src == '\t')) { codeIndent++; src++; } return codeIndetv!MRЊVF(LNAbhqH0?3Yy`è^֚i $f{|{p|5ҭ P@#G?nܣ4}8ƍR%7H%ʃxhrEuLMb#CB Hq5ʏF'DA.D$+SWXB2R@>d珞~TT^A}},J {}B FM\ !< [,(C=|f3r>?kh}*-!NʣW#l9*2ٗ/72Ȑ(λtd|6tG )ۆ 6TH[_*#׉./ue[),GpLb]+={4R%XHb5t3p/9t%,YT󔡥9.]eM'|&HX7~Lx g1J eMDJ V,"_y?RE&EDH E9)B=[ϕu(u{ŕX+"DbR ,]@~~> Bg*˥&)Ơ~.l5V{ⰊT .]e00ucR&RsaF%b>%( ye!V=9f.:>+↷k1PO$z]}Iq6AWz;gkP dR \(< OC `<)*rX# lxP̡V^2a"9HInw9  jUB74,]ս'C5=Р.XҰ*@1Jou]YݬӼDPc\ec<:ʑ0&] 0EƶB@@ ą kDFʊ0uy 2{^@Q=VT$  ;DBd++)!q1A\VE% p/P0!BȰ nsG6RC7sNkZ$6<*XBIcNI ^Z\f\wyXBf&Rir-J,%ӽNNq1t!d F^$snM4eV 1 ?y|^!^3"Mi[-DF3ji7+d,e{)fIxkQ\ߟbC̕׵ԨH $ |_{Daiޥe+~2w}#'!#IaG}83l +ԻwGZ)}=b1h ~8Ppf hoC"XU0ۖe/̗ǚ/(LH;~|KUM3~`1#؏Ҁ z]P :u /S4 (Ӭr{X^LܬnY=:ʓ*=COy3QS<BnUQyT미[sH񙖤B[iY%%ϗ1*?T`Z}aJ,K߈M1>I$7mxuv=vָ~wa50 T1IK~ZՅ@%@hD(|hr4?|TJ6YR G>OiZ) =!d鑁bJ|Çe` K v,X "+=1]c WFH҅cD)m*++u ÒUI{6nT`D|[jnfs;8ֳD JP 7UaOjW<eRN-M_{qJ)5#׮-^y}u϶ޓ E `뤟P@WD N놈gq`q#޿Zƨh)R(  YćoqF buZj?lPgc!j5$ ,B $Xp`@>_Q0C(0DlR^UǕ?[p{ðbDfP UCդ:ކ+3<3NTluѲcf{2CJ[.NbUZ .zP?r1>iXa?% [R   "tKh=~σI!ř?~zl|~&)2}CzAiWJԦo0)nI$K"Scao(?1T,T`OW,M,J)bVf3h7|UUZ%/T+r":}.aF^~H2҇ЂA Q yfנBCÃ!rZM JſS c}U3@X,7!f*}m#7F 5 hBbe,⺎~8ݰ2  IzW>aZ"H0Kr+0hMlrΝz7=ٔDKN7m*@I8e@|X`EF_cIu ={ߏɴ$DQXT/èaxء XɕT/q "`4m/SLŽʐGtS33 ='͛_^]`fYĿHD-B°4-h'ssf,c΃ I?I<0  N"$'7͹"sYӒI@(凤Ugi A2TBvui3O =r?(ʥ3WФǿ|\'$,,hD'rV*6_CtpUtzR eV9"밎2S~; 0K~뱻M4a[Hߋ`%A^ك;2AZH,n%hԨڀ'=qOa?!~C0&Pʒû5AMa"ٗZ5"dw_}C0)%`ꠣL*|>q6 ˮq%1;'si`2Udg$Q`]=+>/>oP,p,Fe#O߄W$BQt~_B,jV-|7 EUO}X0v ֻt1ZyƩB P R'ȴA#3xىפ颤U@vT)1>Щ& Px1%˨'ӑjx_`1E,9[t8I"vRl(;Vҫ)evNus16cD9f{vZV! u:3)IBxB{GB@'=/j/:$b}X~nƽdb3 S(),Hȅ((&OO.Wߺ)訿B/yI?2$ p+_U6c]P1a,.H {Mր|Kt_ Db}R꫻:ol7:| ʷޕE2Am=.B!ل33!YA$E!.>PPa+A@$VUL ןgBIQq r\Vl ✪Vǰy!ŐC$x*Pha X@c;'>S`PJ糿v,$B$TRA@@* koxXf'Gx ^pIw0zǶ ko2g59_堎d{1"*xG̾~C6UO;hu"Ͷ0sB WD,GnCrYIFE u|m߭g%7GwGÿ-&lh&/HßJ8JGx=[:ɺ[Pŋ cj^A Xv{py_ҍSMyuFE O(u]΢i K93H.zZy½1/ފ9 hy~P|29֔qy/L\.)~ TlIv\WŌtӠTP(#r mJX%HPa YY,>?ώx$pQiRgj0BCAU^n ڨJ>2F޳aY*)0en`@[۸ToiK ?}u/ʜ!/1PE+]2#h\Qu# P#'oQcF^dYio1MdeKSn Q P326X&6;q9Ŷק 'x.n@2u>]髮l_/OswUU^[UUUUT*ĩ@wq @W Ie}D B6+K8M!LJ}I}}/CYDo^OXJ2jH @@0J1E  *5`7tځd 7 tκSa29HH3 i*OeHݡu D+Ѹ ȕ.@HiD$7I@+ ?D dM@Ss0 7m_:?cxtfy,J<2^CMciy!<=WRAvA{=Dž $H2緪 |bkKΣ(޷b2ǁ H!P-6|9 rJekܰ'ĉE \dgj1G-U'Ux|A@~ N>0")3m.|L4& NQ8^W@? &swr?]21(F.;` *C )t^ vRy*b5_N1Jk{"8=ըb+ޑ̧$!B ?H ).cy0,G#LAY?ģy}ty =G}![tYAA'(=A)UnmQ\Z`PZګ4[,Nn-~L$+0f -zYddUKa"2h??|1]Š 1*}ox⇈HvtY~;NAŠ <#FO%1&%s|d=4]%bυ+īsۛsJ: d! (1U)(Liҳq"C,=~C0c "Aq04ULOzfz$řo+XDhT! 0+] X97ڏz4 %,+ )Lm=eW(?:u. YBP \GbpA׳23ڷޛȅׇSKn0 (@4$GŧL}xfb7U2R9Hs4RUvqdQ)] SxtR00c?nVs%~b,hR% J (H5""&#OӰ|ӰGxUzM:]=W`@P ( G/uW0&>]5گ^VB0|| ,8!X~N' ~bu'jB.ڭ}ihr.ʒ)QCB M}І[So K@;A-d4TՇ!>F^O 3,}AGXJez3)Y&ًEun %V˯p&H O<Q[pÔ8k~!^;(@n45qo$;}[ʠϟ{^h/G/OYdPF"4jm*,R[C@wiF_m*cvw,kS(bEwbEK,H)Gr "WAj*jd)22WAFTAifۉO#yȂ7yhNXAVI#؈=~XҔP 2NHI+A x B=+ϓP4aT#kq @C[+<Ʉ/&AOXKL!38{/]xuΫFcS2&oU7h*(¯+,]jBA{ؖ{†) Ts$0a 4#̷DVl='x¼9U0ׅ<1Ѧ@Q C~31i?%c 2e$7RX_Qdj3"tݨ2 50 ?"!5ƯB*cb c [/[) ; 6[wy^ `~?s>p'?ר2uw(?N%0{nREeEGBaQ {u[Pl=GeaQHUCBys-G%{*%ra{2(, }ZHO"x HX_l)1KuNQ37_{ wF94@F*LvTCM~;F]zQlx2ʢO^k" 9A)z S=sM5fCa{k"4*L WGP< ~o6F_gaq)0 I0Y^  ~ @?ư 3tDe茌Jo)4,)Ӳ0)="5iaW %9EX(0-V@#‰`&|}"'BT,os])湐? ]}GNDQ@eG\n-vUrY@n6Kvto_HFc RER0WT"[}1H cۅ8)^iJOX}H˜"߾# 0!j ynMe4.eaCeO 9^e +sdل^G;Bz+H Iz3hd1b,(3˰J:jgP @Y/,%^=*2a 4};!" cF(L:v^q4M IdFKtm/c+^pBK P؅'k%4`xC;! fߛ& A+o`ŠŬ_T\BN2ݔlӜֆ$ ]EaNr**F;ɃuH $o!\Bj36VQ#6 ndiqŔùqtD8Y:ejڢtDL=kUW?e`p`(0Yt㎦JytU^:⢴:8FDW=$ @.NES+޻[Qr%RkJ:*ePHшiimru/RW,a+hz]3˸ b P#I!w8֋G\aRrt{,K=" M^h)BmlzG b͉ ̺p&HZ[|nEx# 06\]abz%lĂ*)Z?e l$4}Y=nOf[YqPt^ j<2B)qg9*# /TC\8fZ34(ef"HF#EE8VAVTAd4.! @袲$c\ށ.ݼn:=BWqu|ò,.XI)xPA;u8a%{MUz,sYUd ;p iF̎/C+b>*ׯؔxyHKN}>'uߕQ^n [O$0ݶ(*Ѡ8f)vܗ^e/$Hv+YqYSu} o~w|ڦva?kN3ͩ *aA@İpI>EhAjgR AULNLD L60. AĐR}̘U$:cYs)vX~;nȑ(Bz?'CBL3zlcEq3U؀q^BQX-i{jdP֩exdoS꼅lkmdP`3P ( *靆Up ,˯GU,0e qeh%G;S5pR]wTX0Xc6C[615 )%Z On ABZ?rDG{&f k43|y˰@ BEOd6W+lcpG=y ~/u"HR^:qع|b&pZtX|/c>^mRE5p.Sh-Bm:4Fz(d8U '{ɘ =SFHƣr'\ASDyó\ː_'$ H|dvA9R̐& ʌ~s{ռL-ҰH\o;ov O:zsb G Op ]w# J#%d3(7AJ oe_82Z$%Lz믭_ 3i|W:~::vheIȘe*8VU,1$ 0"sa"ٱO\ @)BxB<.>N6ϿN'&I/S`ªNʓ()ׄt0Ed33 !eAmHQM?ZrFd0VQ/%(#h7ZޛHIP=UK qHO_s"t}}uƐ(0^(#o{$RI k :J\odmHoᖡ{!0vSH,Pizt ,pn HDSͥƅɟC`nK~_3hD=]S+t 1"N <;XBe)4㖰OiJ ) T^X;EL|Rg[SGeQ}¡잊C|H8Y\,V|MDEo~ km*jm.( SW5wi _=Whq,PLUG՝J.$"cAvn! BUR(ISe%}K'E^rc~pUl,wۍL)X:MyW] oI}zP>6P@Q=髗(s Q3OAp9X'wYFf2CDH GT5i߻Qv+BVd Oiۃ##U?ӺBHvQ%_'?zmyO;HuZV=Yl\:uUuooDe#aT==X9D]ַaU;'YC?bB#*|y{ 9^ :Q;_a\UtFH=o?(jkǯ?Z JWzy2S952bAriP i4NI@C%kBU(A8PS]?{qѰt;ߝȀʢ\ i"#xXV&89$Pح8HEq8h)|~t(M^G,e"~zE|i&"$ǽ6he zoʾ8Pݿ9qS1hSh#O1?( f#숏WW,Ogk%~eOݟ拓l_?[F Vު1|حqx$ǁfmo h?ܘ)FDZro|d]vJ%{H`@`3`>Q/>O|W@0/?Q R~M!?ӧ%~AR~!?NBӦg~?p1}s|{t ~ksiY)+-HV Yk""{ u5TK fk1_Н14a#V5j3nT*/V}q: >dB(wXG1fB$ Y":fbzrPw;_/_3ПD}(=qI s[}F Svh؊a >> owx #?nG ԏ^ʜ`VJVxҨL}482$&E$A&ӯ÷eؙQz,觌6~djzgg1^î}.0%CtT퉖-겁xROMHֿdVx@j%HhUDjeV pdcCTgYN{w6:b+wP O }CxhSO3ƭ~1!;:!P[b7,9^.GidJ #91G5$"E+_)XegO\pÖ^"?#n@1Qղ£)HQ&b]JX\0X5Ul^vZ6|&}po:r|of1]]1+#so. t Ypcj/}880/ 5B?1NXť'w(awqU9SPo5xz 6G㖕\ [iVefdbOC@?7yuE3'p{v?Nr[Ƽ8mڻYHRTR _wGYEwKŒh:z>6_=5pp,@$3[= E"+Y 8Lo09|ӝX5 h77K;|*jUna$I8!%02ÃmqwZ3k, jX mBN"`)T((!Tnc+gv r^ּ\ &UϿY[_I!3QvVo|o^ć4}O$ 9q-A+Ԡ&ּA=Mx= ͊ߝLb+OTG'6@H$(@Z2GTzv.a;@RODuI9 rJ{e%SaQG^C6h)(1&`@ouф{=8 (3z tk~:\7 !=Id"8I`E^9'l-m4OeϱGtty8pntoq<+J B!* oE UQ9w{?{6 8$.Qn"@5kAt#&jw0SluZxG=Dh-yd?^Q%xu*ꄚ~Z}ԖxO.>]ab6=Q˵iκN"|v/[FcOJ)8 :BM xZ ;CWr"}2GWjj?|oB2(?9  KJr6Y_WOAz%xfƥW9N_u*0F]S1Uah$& hVl$rHd`mT$M;UAXiXQ`iY*tE VcU lf$Ib*&2pk;}Wv)C:YJqfY+ByjC˼hG [҅&+k:Fm}Vxw]~ȉY=[$ _S7XR1aIG-X mPc泍eH+~vY@mWG D%SDf8Ek$QNJ&ry,j=cKk)='x$V*gx X 8Xffup} 4,{VΩZ7fU~ h=Z8"AԻ4jgUE6ZScArWd&_`tM"k*TwvfѠ|9`5z@.)~_L#2TsK%ىP!GWbSӧ6%ʉ0A(k,@P?e3͡UAM?Sݪ"3?6KZ+6ɯ+oǙ~:?ulgI!/rh?lIOUt_gB0~hgQJRM'Ck8TtQܶi_2V0&0q/ -GPї+C?M:xKAdV cE0"XVGTWS6^^j7a8)KW^XZ xXڬ#oZuv*3L\鮴iUT*G9ٰ 3(}F=n}{i5 ^5ONw[< [QvT1@AA?# lձ$PN(<_ۖa~^~g[ 3&"sk=;zn=*Ғ (8_8fBT %_ROb[KadD'8BON}R-  h#B@R>q.:uG$1v ;~𷮃B =cQzuƑc:(iyO{؀ (#w;쐘0Y $G/za>T2z̾RI$z|Xd[ƧdLz_- E# $n(@ &=^Ѐz4'}/y9cw߀Ph?" HOB N_f<ˆ~7#}?f[ya|u߆GOb_hߧ?CQCF AP%t$ Oq  {߫>WCSsx(uv 8`<(T2DUWnGvp}wgO!Ϸm:óSצ>~J3%)Og7+c!]P>H3aIߞTfɦZ@iҭX镕hE%`b/Z1(e>Dl{?b+@owa#u9{w?oo7={ws0ڒ=mhA,fd4 4- JP% @nԒN  L b &7a1#1\Fe Y0QRW&LPRd۠v*Y LYp ee̮Y@YS2 p,ʅ+eec@Ys+ \X\ʖe+¥oFtFp!T@>߿ Aͭ6SS5UTH/ `E3Y%x=r=rXFWD;gQDDXdba;,"3C 0|]O=oȢH/.xCIPA 90wAsaۢcMMַrMAsuF<=aִA7u uAvj &΢ "wP^v{6 ؂zPطv^z07"%׺BZbޗW=ͻ5C^h*/ ^mXDA9vzF[Da<  wPACs1kb&"PT*Yﻀ7ʂARC=<7#2lHČHČ'8o"F$bB플rErEpDrEHČ9kb"kf][5Z62uz 1JI!V:ZP/L2b:ͤe+Aj 9 V.C0%Pg D, ERRTrmw-" m !qƶmt1J(JR14;)Ff vA&P2g2ll,tiቆ6un/[Qfb6|l7QCk]^}> @_:v5\vez&9^Pwq_nEnUDT~ud3Wh[YLXQXO:RՒP]tZY%evrozuDFf^6k]Ch!n!x˓[9x|[>~?ϋDO_^dQ΢# QM۬#onn誸I)rI'k':almn:{es@[4;li HČlH$Vs:|l]5^fYDA :A$O<^ov?S_߽ ۢ YDA ;tAm 6 :FČHČrEἉQ#1#n HČFČHČHȑ>?Q#1'޴ k9tof9cm=Pnx7)8w&yKa"b9fbۦu3S5λy55o}+9ߝKo|K4Eܚ"@żYdd:n\l>NN]\g*Zh4%(WAv{՟Z7Oe"/C0T 9ke 3\*U9\#Pf40=yIY\V& s&fLRP +!B 1Lqq" Z(r, !  KfmbDyS* DNuz O\:*}>Oњnާ[juZֹ51kkn׽, Y]v4A_zq{?5<3׻>Ll۰Bfݸ-KhbРKim~|kL^Ӷ#ճM-i[@/ZD+nm@=lӠ'\ngImI̅7/.XQ2"0( ÇJ q# 8qYEo E^C  %*`Nㄘd,9Nj0 "!)\ϱ {Mh8F25"uL&<'L ӕ@D1ۓƶi) Z !kY%샄$qZ!+%+Vޱ{ӌqMJf퓘s/~A6Nk_+B 4b?>/Sz*z}WU^O|PQӬe.Vzߏ;|m܄5 &ǜ`CZkJQˮA;~` 4zny8k/Çu@ݠ@ON3zZ-Zp(GP|UU'HU!CM:z}pazQJ:Pi)̀KNIH!!%%c&CBM׆ kLZ=ჺ4K6*I}|~&?}؞/~U\<SBG/Pζ/ 4;`V,*L%?H 0ml7z|ǙKƇPՃ07oC%Z1րF !PA,+K$JZgXvc ei@o`*Y05֙!e Ɵ xa6x 6|3T@Ӟv2ajw0&HٷBI#wp,1/ `^Pִ½^gӾ ik[9Ɇ譚py Lo3 r fF[ZdրFZg'033fk˹M"/ˆ{ˍ̐I#;g!9) AUzrﮈ^vO݅aY0uUn8:? TRe`,$0Z$ZsuL`ٿ 3&ͦ2C$e 7A:H]b;뵗WO[Cp~K-1a,Ć2C L^ϠyZc %6Zc %6Zc3>;.`X컦Xa6nh>]1[[3h{q9q?}g}ߡKV9 jր3V"fVV ل1|Ŏ)զE0Zb V!զ+0զH`i-Zd2]-L:?ml~=q^s s_P qV/_o0"F1SLj0Z|x|Ƙ-YLVS VS-YLL»e|>y<595vWvs8t6zpaZc ƀ-Zc bS՞$8ES@fK5Z! % #-lֵ<o'vna O0S\-ܑUY>x[hۙe0 e K0EF,B-kJzMtw3;>;c/a T ,YXR뷇Φf1ٴ&3avm12LaLa݆avm1L]KSw;c/7`B e 6Zc3%E_o/_y1#1#1#3y9y1#67#1#1#R3w HČlHČHČ9y1#1#1#3y9#3h69"bF$e HČHČHČH HČ6$bF$bF^NpDHJARzg׮Gxqc\KrARPT' HČ6$bF$c- HČ6$bF$bF^NpG$THČHČH HČ6$bF$bF^NpDHČHČHČNpDHj!ْd&IynmDNfלUUUUUL̓$2Lw7@r2vn"'6nm;ugHHH7x鰐*텎us0 s|sǝ9W<րF hgڪYw3wt\ؙ[v;tM%^Cl.gX}ݫQaݠeր[h) :m2C֙ 6K-2C m2C֙͹K88WV N{ڗ_38u93qpjGL Ž0=3s3-2L$fh, 0- d @%e}y!Dt&Vz^u8u-ͱ|f_??6&eHammgoϝ9 4Z,0l @-LL@-qL}0}{}6l5򖡭c]4!oͳ|k"F%%[h XS d Yh[hUUU]oS30~>oWozzc\CBw4UUU J*Ipݪ֕V} kQֵjkZq)JV\Wvc9ֵw|Z*C0Au[hjK`%i$V +^qDtm7}g}ig{ +sG9k=U>5z"57y:cl.Ӷ(s|W +(op=gOQ=>~uu|=cޮ$||QO""|oMdkiz1yJ3/ig{Д\Omlvʬ9Rii+-뼥umYWJcXQ >k\jl3FZ2m4>{ŷNm:WhT'!5Do8X`TR0+t4_J9m[7{WotYuU1u7u5}^u~f{P|F )w$5ߏqQUEDTb>~v[T:2ץ>/|WpU%uzLF1Ui_Yj6²n+z:{J* $UQU?vMUg9ƍns-5+:Vuge*QU>([U)!UUIy m]N4Fߟ^ұEV?<3XȪUb9y0>H;yneeץ`*TRxȊz^_|>=}ZqI Vy֪JRUU~Ԁ8 A뮌ǖ9|WX'_J"*oT,TRXDGeXdTױREDJ3}"=}zGy|hQ8f H+*\Fwxz5ZK5-Ǩ>FH B F/`< "?!`2~<>;pFL++m#wæo-i߻WgtP"0qpjE U?}.ajv ֭ 񎙋taL6ߗٌY*1ρ&UHV*3*^koAVsy™/^yUUUUUTlXfcUQQQQQQRTTW+eő,kmw {1A͢_~ΟgΕUUU}>0_mUQ_iEErQ\+eʢ6"j7@K0^W~ޏo=vI$UUUUU]FV,Y^֪{cyM楩wՆ!p3nB,8F/MUUUUUUUExκEqQXq^G!μh8pI<SSj{Dn+F]f>=ak*PU8A[=>kRױj M΂۾7UPRJ)U`Cf0̊ƌ3%)^) H86]]5bU⻮dP(Z"9=yvm337^jx*ꔦwwwwwֵ|͈r)68EbG>$O=w/$O$U?An3ZuAP|l93\%^8RַY9̱o][|.gՙjC)]硇xwq|گw\S*G!_}X]ymT~u{RoΏ#Q6wz1$N+L=ϣ 4#br&e;9Kwfy9Σ[y/ j(ƌG}25y=i/}w[UG59-usjy}w{Zх:h5 HAA!H礩zJ2]qӧIbkJnzw[EGu75}zE]WΨ|&񳜻嗀jrjo~<Ϊ|cW5]g=^; 1<""{;OcU^x~mMm).:|/E*qc,vlc0c *0ǍuǍ}_zj`o|]͘TةRRUB*o߯.w+)L }͎1WsWn_^}+`u5X1UUU`1\ω^=xMqjmGAz(UTR*JOxu;rFEI1}F؆/ƹVt3mqy"PIvaH) IDK -#qul9|V+jRԭ*ԅ*B!JR)gu0d0c0c1JVф琀0 !:Us 6{fMSX3@% % vC~۞e"j,#c[2 Y뷋bgtl^3,j# "~fgֵkJT*TRwd?GO+Mmfz3WcPH'*ܰ@.$$$$C iBPm(m顶k׮4[rzsKVka\uf$$$$$'t\TWa6m44M ~[ζaXMwzfּ%bmVoDWEGli߄Td_0c1T .^/Ց+xag+k3|Lh g[օ c1dunf Ա5U:݉mI)ۭƀ3A#"HRJJ7AUZխkVZִRe@LtfxuUVŨ0jT TRR]>Nի9UZRr6^8KZ֥cT)^޷x1sִX UtN_@ y [D%<2ɥ*%/F7rqkZs*Ʋ(}W Yʑ5}Fs^UL,[Z|MH6[WjbC0JwVggJiIsWɽ[No#+FxDϝ_M֌`ІFsZU[>W⑾sK/OwC\|F~$*B*T*u5Z֭kZѭ*TUZPHQsY3/W P={||Z5֍l5[nY6ѭkakF߷9ׯ2_yiZW8mGүkfEA%JT$ddOҟ3,#EHđR1$TrEr1]ξ~y|ٽ#8ŧ[p *THj"bH*F9"V^ss>=zlVr|.5]^ B!J*B*TF0cc1,yS~|̎܈;*T*T T\Pn$_xm#7<Ӽq6>BzQ]Y홷ֵfbs5\UUS-eee,IUf%XkriK0UbYiqC( v(=_b?WAxčuzx@_bUTU20UqQ^NOj]֥k'6X7 UEU ⢧ۀ⢸+*URӌ$dwKǃBY6V ޽zQ\TWWNEqQ\TV2O '>ܾ'}uEEEZ8!8]Nw8fjQMqex-MCvl:p=|y\EEEEEEEEpKǶm"kW㬬5 *QQQQYƢU獻-eeʵn. o~o^ϩ$IKeUbUUUUUUMe j춑XYdZUUUUUUWTuw|;ֹ<ד]kZ1:)i>ŶQWw/)"D".xJHw#SԎu+lfV7ZoCn[Zכּ}ιnz:EUUUUUW庆yUҭdyŰ8n-Zsԩ*IPcwZ숲"ȋ",=*'O/d%B*IUuV%B*IPJ&ƴUu/~}zyI #ƢUUUUWr]*G7{{Zweҭ-5okZ( I$*$I7aetYmu{vA4e;&G9eO/<ʕ~iJ_)mgPc:_Z#G΄ZFKZ{V7 Swj\#OGrFT*."bOꬕUU6޺?__$⸸~/bȸ*'5z-s_-¶*_qǥEU^w[jkLL_5گ <-q\C0b:gK+ZQJUUUUU瀀}Чj 2 ȱo7^,5Qa1QUUUU[v[ \ ytw֣h'՟Ŋ=}X⪪UUTݥ)41Z-Ď]LKYh26xUUUUUUU*ŊQbWdHh]|:h2wy7),)UUU$SS[ѫ'4]2Ѐ4sjZnZV9UŭcYZcth80d)&+)5e=gn`#cYήuħj^t5{ȄpXڸW]EfWyEwfT!֫xveų cSxVO|mJJey }/}:VE**Vئ56e9|q;:{czxFwpIxaXjv<ZwuX^kknVνr+lB96gIֻB'%%Ip!Hַѱ~!$_d@mY#4LekdzgFU2ֻwwֆuøp"}kw߬kwεq3)5=n9cW=~^/F?UUUUbzâOҮ]G5oLK&ty6IkIŊU.dtek1FU`ΪI*U])4䏍W'P.qJ|S~z늪gpmY$I$̣9냜EEָnȳ][BR$I':=: cfn¾%^[NP_G]ӵIghW=Q^"_oxs[b*+@VUmtwh 91K8o[|,UUcb_IX&Djl%@mx3 Gy $uAs㗦**U s;N4s:=q^/dzy⪬I$wn~v&ι󮝺ϛ[Z$$o]|y"ڪ^@|e_~m\UUUUW@5dU_I7-Iν}}zD+NƗM}nDT^qUUUUUUU>;]p:~<αabo{mWڲ48^UUU0UUUVI$USǎLu~{zGJUU3Zϛufwyfs|k9.Ƚ̵^5x_{3E#z@ִ0BH$$r1}yu3TRf)8eޅkA=_:Ӹf9"ݗ9R VF!o}VJV,Y뜿U|xjG+˛umʽZ6m;R'{^ WמuR7Q44:%xhU|G3z1}\INs#k<霻5WwG"&7C9sw{n*zXB-9sG]V^&ۜ4%[O7kv;R)M'Yp8z4M%9ףmfhSuU*V!o___ }x?VEQUV)U*s+O\acFȪUXI$znæ>O/kLcUG&qX^}tׯceF9RNYBU*TU*Y.viqkε{UUV*17:=Z;Nfb:W$d]*ȱUUU:緞mPqskRfR(=N dL?NNkשg:cSk\Rr͈Ag/kZֵ4jokB|(`r s^{k⨫j6URIu}\Ǹp3 L|%j߻Ga?gTEUUUUUVJ*OQ^hZ=kG|j?f믷t{ZcW<55$I$  j3-.=%;gUij UUUUUUXsw{|Y[7y,_WƵV{eqNJ锒I$vFyMauвk_yz`I$I$I$I4Ĵ OZuJq $IYI$I$&ٖb乞Ƿ=Zδn=u/l5_9I$I$A xD8~y?`ހ&xMFWU_P֧RI$O9..oƷ|}; ҭxZtf1S-n2͈CYγֵkZ9sF6N*@$`c2VVCfj.k->=Wy殊s5w~xsҼٻYw2eu^{ᘘV}W-u|mXW/J2l'KOQws1L^W1XĨ[O]GZGMkg5ueGi_Z xճO֩mQmyVلe8ܛyjgQ*Ȇmolx7xC^7oaSxg:^:Du)<MNk''y˳ycq3 w^ 69ړ7O[uk=^g%1{qGmߧ:юB^yI$I$-=:ҪԲkZY4-@UTI$I$hBu޹"JJկifKenI$N1I$I$I"!_D>|WwRk}}~W>~~}[/ZG;7{I$/wI$I$Hgr!Vl;cSI$F2I$IYhj^ֳ'o>ЄsխVR/kcc~׽780@3#9ӰjfwYޢ2ei⨖eVJeoJ';S^ȷ9/k,XbŎu<ߤ=)awֽtrfUUJU*ljbwuzb1+sZ;J*{/Jz|MEEUUUUY/g}^\MWo̞WۭY=y I$UUUUVEG^ǿϒ{wE Y0f$g+zaZX;VVp%Kգ}?yIn&^"'(;"z߫}_GS 1ض|35^M{*)++x/~Q+*Q ?HHV@?=~o~oֵkZֳkZs9s9ͥ)Zww}kOi9s9sBYk;:{§Qg6Z(ZZΟN0TUUUUUWUUUuYwsig9ΝkZֵ\9Ρ:ok7γ8ꪪw}}}uUUUUUUUUUUUUUUUUTo޻xuwwwwwwwwwww)JN]g9s9s9sUUUUUUUUUUUUUUUUUUUULUUUUUUUUUUUUUUUUUUUUUUk^n"""f^bfTL>k]s}oXִwwGQ~=^GԢTX*t~'_zfHxfS)_pM>|ER(,)V rgZЕ8am{G_f]-@< =jBcpkDAQBXbD3kc(.WIu) diu Gsz=}jH QAӱI&"H1Z)l?gtz )Dk-Ae?C Jb!B щv1Ǚ яLIāK̬%PĄ@@L,J DHD6b(d8T )dY)1RA!dR)"YHT@+B4G?1*C/ޑUT@z\DDDdLKA-! $TU#daBJ²K bHJ2aePPP+T?2D"'_w`?3L5f ` 0=@$ɓ&H,@(R$R. dd֪*̸. C0.( RRBEY$y3$`! $RJIf%R`!AF1(2DH%AF$PcPqYT$ bTQ!YHP4 bD``S#GzXaf*01HٔĐ B!NHXAY`xo~$Ŝ^4ha(]qH$:MY `TRВ*B%"0 $"2?`TC`Y$T4puœHV/op7@swly!4aÄNPā;q3g<)]AS0N|! Nsq&HdibbE@$hLҚTj *T̠fQ$Y%"""I2Y%"$QELО.`- }ƊD]9$30$E"+/@$ F_D JP}$0 _$_ % (o2 % (fh$` DP@kyo7?sϰ?mvrnDzG%=+ѹ+\]qʮ<{zCGG s}6lٳf͛6lٳf͛6lٳf͛6lٳf͛6l>ϱs[msE!EFH`RΏ> 6lٳf͛6lٳf͛6lٳf͛6lٳf͛6lٳf͂,ٳf͛6lٳf͛6lٳf͛6lbō6lٳf͛6lٳf͛6lٳf͛6lٳf͛6lٳf͛6ls4}͛6lٳ&L2dٳf͛6lٳf͛6lrƍ4dѣf͛6lٳf͛6lٳf͛6lٳf͛{y"` hagFHJ]V#P6 )L {HT@TQ%.f%JvV0Xji.p Pu NF5If_ )zUKf 4v0W[V$JR^ ti >Ugȥx[C/铩Ri!쾇2S) ݤk<;l$x`!3UJc@]!:0p߼/[Lpl^% Hե[mngn"""M}5zP!|ꪨ|>SBVI "ʵ|3k6 [2"Y ´{z>7mu֌apKiM7tM4Wwtc-RJ3ki¸]󬻻\I$1 EoE+0ĤHG.*m|LrUJ9նz7o[v}=7ww}Fn&www%4ỦҚn馛h馏S}O>@ȰG9_Nwwwwwz hKm^T 3 c|Ԡ$G.k]s0"9껍Tk{K"'\y;s{>νh&HEMGd;axK?9ժ+Hwoz(@ Cs~Dּߙ%JxRJ1XQ9 v^$_j٫QsIX\jqVkZ=ޥVKc=;v^KeVfk }EΫO1&bVÊ[ծUm:㺻We鴬5wC<ƍy:_PT8T2@DD"1* @ @,a(d,BB*dJB"P$$ %IX$Q<Q}y :%Z@Q9R.֍z4ir\# Ld@1J4 Td2)Hl0DiQ)#,"nYg "H\ @ a"Q% )X`$hi)DJUT6WL!0$@*2Q).ړ  %  S E e!`J)BB TIi`Iߏ;̫=b!` D)bP`ЧhM  \MHiP@`wWG &Z2T$u ơt2hbR)̕E?_ێE82 FbJY/׫bƯ+p?Y5y s->^oWW۔>[~Si{}s:y,xRzXsZ]A,0gjR/[3S\ڸ{F՟{AXV z\=mϽ* ˜;Kk9u>u^ ԍ{Z=Bxb5)nˇEe ֽ}>t{w7|<םyY|3t(}'mC 85dL0);F6qaoW[9ehYpul5a 3s&w EQ ЍMkW +PAHkt3| ZɹhN&* .S{]A"&2(‘YL^j7I:ݞṢ+o(ԡhh:ޯ6!i֛|0,(#huIɢ̃=.L_~{3;tyyoXUml֎1^TRa[N]wb:uig|KUt}^V{R {ί}J*3S{1+ʘ4qXUaQwiӇT눵zWFI^Z9TlF0[Nֵ+mAh>5]߇N[Xh ŖT5I6Ko|GP1]={>b)^WDYa~0kE#V[vl-y3_npl5H6XEr[]>3=Ζؾ/[7خ[ckzm1j{y5;/nsZ-ΰֱ,}=gsLnO R^zy;Z+*^49}R|Zt/-}K9m=WQ֤41Ͱ|ȭ2{X@D\hT8޺][k6Q_*3Kߣ-qv]f:kk_bvґ@Q לqu3Y6E[iw $VYh!~zԍ^o=Ldxc_:XnGJiolǜw謁QOs3.Mkw~)}=y4aI7&M֣2VIx'Qhyd%un]K˯MF""\q+Qy@ou#g/sӧN:tӧN{wxxu_~V J;|U>2=ܜXoGq`XAJI(0U`9(;o"6SE(#C $v$\3”(\>Cg L=;޳ >ٻR =҇] b '˴xiw1\ W[7Wn:5NN \r i0̳:3 v|8’Hu` ! d{, =;yzMD$ދE>e @!Utt-^x'ӧ^HBl@ک(B 0%in֌,<+ @ehb\'0?߫a qhlKdP"ó#ۮγ |97aM INӓazz$ Sfè0 zM\5;z\/suq㎺-$&`%t>۰v"ɟlf~!CEPE{={y|~/?󞝧drDSq~clNaa 3F 56}c%0@\)%C}xN9Q+ GK_W=ߏDZهx!$(3aEr߻Ӈ&$! U$L ЩckIun~.8QW |aЍ>WNK}^Esz[W6e;1pjڶu-;zFWu{j-Yvĭ-ON-{_9vO5Ã50 nGNam-YE!P9RXmޏ[y۲*71J۾wz»p-aҋ }9Eﮪpyg~GOsI1.k{Z{>kJ.|Q^ J>5K渞' ff1|UfDz9y:|iPzO[ޢ0'Zfҥ4{Flr]rubeJ2sF-C&Ng)L*VQp޿YJ*<@D$9?p[!"R戂̈=ׯNc 4BDlwhD.:Q3m(w?_Ƀ$H.Vnd董<` A% tp^7|#Cq0H@B" ;AcnI!Bu286_XHP~wUcty;V3c7#g=-`J׾$:N[J)jDT}k 6)q+uTA@*PHtZj$#@ 8}|/IZ"}/^iŋPE|Oo*;)*Ԡ ܴ$$2:C||^E7VN.j$Po]QKXxSdBG:(T2ĥ9m>;4yJs|~:?g]~ϳ?OYffffbUSfFN^fffffffffffffff`ٙeq333333333332 ˻wwֵk333333333333333333333/ffffffffffffffffffffffffffffb5**z333333333333330ffffffffff|̻/0!2fU^fffffdfef.]fffffffcRkWky_dʯ^|5毬ӽjj]ʶZt( 놾ґ͟55׊γX5_gj'48mkZf-]=Mt r7^Xp8|. xk$RY1ڈ#Oawn$6R " 2%2JZ7n)H Ր#E"Rn܀S .;fk!`(2M3R3B(, XҚ.lvoGeϱ{W}u`vv`Vmc#\mG T( &D`C0b!LhÐ)uAPc3 }:(d[Dl9d~g3ؽiGW=uM_oo8cRַ+Ti|A8D\#IΝȸwpeZ\WR.8N2kfVcKafK0i.Vհz吏Fγwwwwwy_Ӫ^G.kηKZSνm>ֱ(:=dI I)kh9gdM% }äa(D%¹D>_&i4$ga{WH;!̙$qڝF|F/\-w@5%-Ougp)Ն#D$w~R=H&ǯ>ul!=ZT}h)I+KkQsn.g4ΡWq7Ɍx̰-[/V:p0bՊB1\bL-^ձ64[)| 春Sd>E3Io[qjk/lA=c7β5s|jbl5q{;Zyql}` '-]%60Rh -jC`Xuk*o$ʆ`O@=@;cyK˿zߗlU((DIeIp* S[hX ƑP@D䈂$=WB(¡f'!;."k·b,J9TDt"p! Pr1auw؈gnGv[}qҍ @H+ia1FHjIB Dq:Lw>]KGI "]5%ks"p=Otyo.KZ3wߌбyGxZŴi_2]Š8[kkVk][7l&sk6=nsoWVjU5Nt_9ΛPUjӫ49}R|AEyO/]>*;g{ʶUo14%ٵ*Am]^: COC1w(.%g@A^.᭜bSxZg6 @ѡ+a3J`1FפX5{iųi^QOqp]Ye3G4oKx֋ί7֞8/)qxcyvVEຮide+ί:V| :>R5B,]7_2hwRp2PG03 ]7Epol.$>ܫR'G^̧,kYӻs_/Zw8\:j~-+BLA{W DtwͨXQ;6qQ}O7Z^(#;_PRa9D"]X !)JD!E@")JЅ+LըP=[N,}_<>o?yH2`E*c!{(ퟷm:?gww^ƅ@la z6OBLz'>vz;y~Mqc9Lf᛻}oH[J1_fy[m쯯6l=S? s hxhOR@wE#?W]$ܹrޑ᯶_PbGYҴwҺ=GFG z\0=[UYjd]3NUsRIM$%/62~Iֺ=Cڋ@=,Q˚ \ɒJj-e|wH荳OY~Rx6Y ᯝ>9p oƜÉo^};щv"Hfv iR-wV#tDiavv`X]H5Y^ P3_cLA?Z,HgK\= B֒ `EC)m *TO9S~Oo}K[WÕ4?ki[t߶  )17YJ,kKN#PBj" b?-BU"&BI23'W2u~W덌$&I)%V2|׽+-Ry&IQH@KRK$4P (`EEL"əAJbaDQQJEC,Ȕ?7~o]9𜢄I$#4D@ױtf{~<n !W9!xǯqs|r߈ђVkmt$е2ha< ^o}4k:g >$88{T>Ǔב*J@ (ysOx\x73.wVj␎di|\>|]~F(Wo{<':^2>;')z?7ǯ။:ه|[x]xE 4R/CRßGɼ3~3߿l|?nﯯ1OɃ5w"آk ?Ѽ۟o?S"'?`? #/.>ho=yɯ߀(?5>nQ/g\.SP9o9Q0}s4;?WlS ~z]?x|3Mrܰ =H&zبF6 }e;}~`=gO{3'`L'A#v Dž*H-W񏧳V|tj7NzzΓ>?׎a<&Aj\7_wH'ȫdq@;9 ,z]v{[I;w@|q!HGЧ[X?w|wVϲ}{puu|}+}pJ@DG~oxG}M@V[oRx' ׻W%OǽFxQtV_^zxuXxpVA0*JHS^y93vs#Gxb"sm.[ל~N]g8m;t B䩪d\lMuRz(vȬs,H]HsZ@2sXQP Tqk02`ֳ ZcTU.0TfNгQF oQ-Q;[Ûw+Nn.-X[-MVst!\݈3$znelAYshqkDa`dMjDTPraV8rh]b*Ps&pNA4HqaW\pѐ4aOw712P["V\ܷ,d[XY^.L5o ~ʣRb!-@w*YH3nEV2LńD[f500Ha)#þ`dDLR%,3$@J$@0)p$*" dyAd5u*pp)(`J035xCN"j+&@0RDM[IRke"gj"eeX.:E?v"CJPYl!Ha`hZJhKdA'MK(PU5irÓBdY:2BPj( \5訬9,Uqe(%2W4%TP20 %-JDFsaD_-Ud"QI&\IZ[`H298Id!1@` f L5R0!f Y D  d!dATBR8Nh!xwhcv-v I3A @~\/?ܦ$"& !q qBA ?o~Cݞ@{;Pm=0/D}U'#?RP$BBU%"s2DBl DަQʳ&,)ƙc<CqDίi8`țܙd(1%-Q()(B(L$D )BJ312q 2S%$rZE@lݲB4!IAHXe YQLfP!HҔ%uBqW4@deP HSF AYD *F#4JPQIH^B|P2(D"R2{u$GpMLYV-s@iw{HvPQfWnw黻mmRUEEAUa"\raqUE\UWY m$-qjHHH&EU`U(fۥD   jT &ha7E%$Ӏb9Na9% d#QIl`PPHE&Neڦ U[jRڦ1LrĖ$(b̤r%2 (2S (C iSL3c!ɉ IuZ%4:2&dba `,vJm#j1OI ӘfRA&@Q5nAğf! .$Q)TR1=EȜ̋0цRĚȱ J1 E!"HX$ E֨Z9,TQLY.f!JPjYjZ̀-26jl"pg0L3#(pfbdL"˚ CanZ-ŒĤ2*mY5a&&كad QBL%U4*)H E+@ HSђو@d K 99&JU"aMP䵓C PP}sD ]fQ4(N53ALT+ ,L)LH&DE@DUXTXTeUeyqH&Tea%J%Gj @"@UJVRJB)fALdB)((I"dfHdc;k#1C' < JLDs1w`Q,M$p|T7 \?tD$cX` "Xb%%u J+8&اPcQPc`6u)l-p@ ;wL(W%R.9lq.am˘-s%`Tea&Gi! TGm\*kdSBրӭhcP%:HPj`(Y%0n.%mXI4%09k- BBL$$(aU!gBTeRsA\2f%1Rɘe˖G@qQQP̶Ұ Jed!'6虗34i!$-WfaR#\L`! j*FB)[ےF;eh̷)W33as\n`l 2(f*S2@ nes 0!$TIV mek\cC7 \4ܒKm-RLHV܊Pۦi1Be H'gt;d]͐ͯlOEeA?D@pXRݛ'~JM.dǸd(!]Aj[06aX"(bPnft"y[NBjf/~Ĉh(ioN_|ڳ~>ugθݤ5,@v^ɡO3&nCFF(.Gߌ}? իJVi[9f!kYZֵfֵ)O<|0A)B BP4_q^/9k?!ib"OgM8KGU#E&fffkmmmmR\'Zh%>?(wq׺}zqyd-E9UVۻjmwyym.9sv[˦웼8synSyKmd99srڼ^ $s )U  6/ k*$$PPMCҭUN}ŏp$l0^h{nDŲ5#Hd$Ҫ**ɡ!"OOCnVnQQUEUUQQUUUUEEU8%Y)(W j`GT|%s?&) hd TȨH~&ȒH$I> ?e5E>KWg:|v( BTKA I8$sf[- 3:GI']" $I$EOYYkD)u|R_7I$$IE(&:1z>r++Z'whH]JIb#|ε5+oU:֯>_$D*@j1q8Y⎹lֵ(r $E(I$˶_^u$I"I$]uGYq/]=w:ZQx? @ ^]@JʒeHպ|$=y9j22)LjE$,H$<ް϶/.1~Ez:]u_a7##'o.8hkŸ\'"v7핋mvw=%Cx^ ^ [=p88'߅Ÿ^xG-3Go]ݜW7u핋myfܶQxKD5U(8^$!.TN$8<0ř>^ߏO˟|}P^*^!HC:Z=ג$U%UW@ x͌D6 줧l0 շ؂),cԾIffzvtU_#0zRR ZꕬqW̡qKk\Xq~2֓%hh"2"~]>>?g?hiܡ{( k؟{_RxzYb{kΰ#SOVoaA\?X B$; @钃>Gj̬H0A!NmR-e6D]`_N>f sӴɲ""*|r!ဪ**ݮݭ) HJH$$lONU7wraFTBSvpls}*$=<Dp%ꃄ+Ȕ y>Ήx/WpM ==Ox&=]\?7> UQUUF[e$)TDQ BaPȦۙY"QD@|oۣ. OSZBɨDD C晴#-1DEy<:I|vyM!U8 ,,#<,`Q,` &$1%H32`20D_MQ7 <gV&BE!@R $u0=}{7sn]<7H!l_caڹy,{VӔu֟[wso #8≿H@z^r3S ѓ\Qe"ݝ:"q(nzA~5UUUU˿d8]|} aC@<;"Ё}8L^9blD3@@iP 0ETB\ pdzr!d(L|n'ܠT  !9=|Y`}D]Jo= *+QOa;E3ފoޠzM`Ѓ|vy>u޷m#?6}@= %zhuew `84z`e%@pێ7{w 5r4`Dd%@Y?` P;P4ohJeqb=}ü:Dїiw^~{j"&E5AD&&ྺﺝ>]ړEA83+^RHp >eaiL߳dMD{E:s)'?ox32^i!;i'ZoJ٘뫰.8w61h 7yvޯgͿU=BG!{ (AF7i}xL"^+$WRDD@h)r8*S}v8oS!QGsI@æ.+d@&@#VYYfQ9.0I$$wd3,c LFf([7~w;>_}Z)8\\4 L⋲k=~H0P(0T"CsJH$O0Mr 1j^9ȇ??}yh9]693؞G $I:PxI$I$љ v zB6[$I&l$I$c;F0JIiզ^5w ]8@ w`/<^\>A}n: P-!$C^fۮ]z57޼?i0 hù$PI'٫xԬ4j<ʶ-8I$uĐ`%gѕb4^:WEq`5x*H $Nwq71oo:I^h$I$J¶^vfH[n7A :}wT^)JfK:[ww|^{ޑ/ i'I&K"qƦKK] )vVҭKwٮvs+y6Y{țnu-پRkFxZC ww旽=}36˃}nrW|W+-eFkGB_WkV! cwK_O%+nk,bI֔~25m^7֣[/(כKO\mZ=Jn=klV[-9N9{^zD ;f31֐,Z 1.oSАH uZy~'& ZoW9о(\kUa"1\A""[A0"028ltWt:jr/ۖi=JR+1~_}{:wHK/] p4(# .8Ä&n_S@p`*I"PRe%1 XH@b$BR ``" BP) &,+'*2+5j,1R"Q2$`<*u}>D>xM2qTV .Tpa[A Q7 L&9@<[W`OC 8 *o @Mo{ɠ1l̸-@ZҰh*/!|>W{2{ߍkZ|;Ӧ1kb͘CZֳֵkZ918C~1*j,X1`A';x;C `*,B""@!$%Ti;\ ?<"R#KC@4JR%%Ĕ(R"$M*RCÌЄJ""L\MϺ>zCۤZuq3vx{UDdaûꊬ[į}f-F}P}o/>]9+;+ޏ*1kV$I$[JI$I$ˍS%XJW5ƵCDk/ԒI$I$I%5xE,]kkhW o//(-į<<-^6P%!`o/#LmӦLbzIZ~B;9Ԏvgo1$w,V={Sk?h$@z=5gnf!hCT{M}0}Vv{-/'EUzi7wSL|0oH3FB (rܢs:UMM EM"+01ɰ̜2 CB`ɧ3 9PSS @3 (Ba՘3/fAVvV6 a ߏQQ=߯۬$`IT'QP€.;D+d4hA0;b9V@0P7mѨrp wf";P!rqPu }c=\$7QLf`.󍺵SF]?0゚>?+E{7(aEPսuAO7}_tjR ~Ǽ5 ,-1&'fibr< @?d4% IIJ*