# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kinkie@squid-cache.org-20140412145051-sxctuzq75dgtk9k6 # target_branch: ../trunk # testament_sha1: e41ae7a329291a8d8d51c52087b966ba72ef347e # timestamp: 2014-04-12 16:52:38 +0200 # base_revision_id: kinkie@squid-cache.org-20140410080255-\ # cn0q2mjkb9c80o19 # # Begin patch === modified file 'src/ExternalACL.h' --- src/ExternalACL.h 2012-09-20 11:28:21 +0000 +++ src/ExternalACL.h 2014-04-12 09:11:20 +0000 @@ -80,7 +80,7 @@ /* when requiresRequest is made dynamic, review this too */ // virtual bool requiresReply() const {return true;} virtual bool isProxyAuth() const; - virtual wordlist *dump() const; + virtual SBufList dump() const; virtual bool valid () const; virtual bool empty () const; === modified file 'src/acl/Acl.h' --- src/acl/Acl.h 2014-02-21 10:46:19 +0000 +++ src/acl/Acl.h 2014-04-11 16:00:36 +0000 @@ -38,6 +38,7 @@ #include "defines.h" #include "dlink.h" #include "MemPool.h" +#include "SBufList.h" #include #include @@ -121,7 +122,7 @@ virtual void parse() = 0; virtual char const *typeString() const = 0; virtual bool isProxyAuth() const; - virtual wordlist *dump() const = 0; + virtual SBufList dump() const = 0; virtual bool empty() const = 0; virtual bool valid() const; === modified file 'src/acl/AdaptationServiceData.cc' --- src/acl/AdaptationServiceData.cc 2013-11-12 14:48:50 +0000 +++ src/acl/AdaptationServiceData.cc 2014-04-12 07:10:39 +0000 @@ -9,7 +9,6 @@ #include "cache_cf.h" #include "ConfigParser.h" #include "Debug.h" -#include "wordlist.h" void ACLAdaptationServiceData::parse() === modified file 'src/acl/AllOf.cc' --- src/acl/AllOf.cc 2013-10-25 00:13:46 +0000 +++ src/acl/AllOf.cc 2014-04-11 16:00:36 +0000 @@ -17,10 +17,10 @@ return new AllOf; } -wordlist* +SBufList Acl::AllOf::dump() const { - return empty() ? NULL : nodes.front()->dump(); + return empty() ? SBufList() : nodes.front()->dump(); } int === modified file 'src/acl/AllOf.h' --- src/acl/AllOf.h 2013-05-28 14:28:15 +0000 +++ src/acl/AllOf.h 2014-04-11 16:00:36 +0000 @@ -18,7 +18,7 @@ virtual char const *typeString() const; virtual ACL *clone() const; virtual void parse(); - virtual wordlist *dump() const; + virtual SBufList dump() const; private: /* Acl::InnerNode API */ === modified file 'src/acl/Arp.cc' --- src/acl/Arp.cc 2013-06-03 14:05:16 +0000 +++ src/acl/Arp.cc 2014-04-12 07:10:39 +0000 @@ -41,8 +41,8 @@ #include "cache_cf.h" #include "Debug.h" #include "eui/Eui48.h" +#include "globals.h" #include "ip/Address.h" -#include "wordlist.h" static void aclParseArpList(SplayNode **curlist); static int aclMatchArp(SplayNode **dataptr, Ip::Address &c); @@ -203,15 +203,15 @@ { static char buf[48]; node->encode(buf, 48); - wordlistAdd((wordlist **)state, buf); + static_cast(state)->push_back(SBuf(buf)); } -wordlist * +SBufList ACLARP::dump() const { - wordlist *w = NULL; - data->walk(aclDumpArpListWalkee, &w); - return w; + SBufList sl; + data->walk(aclDumpArpListWalkee, &sl); + return sl; } /* ==== END ARP ACL SUPPORT =============================================== */ === modified file 'src/acl/Arp.h' --- src/acl/Arp.h 2012-09-01 14:38:36 +0000 +++ src/acl/Arp.h 2014-04-12 07:10:39 +0000 @@ -58,7 +58,7 @@ virtual char const *typeString() const; virtual void parse(); virtual int match(ACLChecklist *checklist); - virtual wordlist *dump() const; + virtual SBufList dump() const; virtual bool empty () const; protected: === modified file 'src/acl/Asn.cc' --- src/acl/Asn.cc 2014-01-11 01:35:50 +0000 +++ src/acl/Asn.cc 2014-04-12 13:29:42 +0000 @@ -50,7 +50,6 @@ #include "Store.h" #include "StoreClient.h" #include "StoreClient.h" -#include "wordlist.h" #define WHOIS_PORT 43 #define AS_REQBUF_SZ 4096 @@ -551,20 +550,21 @@ return asnMatchIp(data, toMatch); } -wordlist * -ACLASN::dump() +SBufList +ACLASN::dump() const { - wordlist *W = NULL; - char buf[32]; + SBufList sl; + CbDataList *ldata = data; while (ldata != NULL) { - snprintf(buf, sizeof(buf), "%d", ldata->element); - wordlistAdd(&W, buf); + SBuf s; + s.Printf("%d", ldata->element); + sl.push_back(s); ldata = ldata->next; } - return W; + return sl; } bool === modified file 'src/acl/Asn.h' --- src/acl/Asn.h 2013-10-25 00:13:46 +0000 +++ src/acl/Asn.h 2014-04-12 13:29:42 +0000 @@ -56,7 +56,7 @@ virtual ~ACLASN(); virtual bool match(Ip::Address); - virtual wordlist *dump(); + virtual SBufList dump() const; virtual void parse(); bool empty() const; virtual ACLData *clone() const; === modified file 'src/acl/BoolOps.cc' --- src/acl/BoolOps.cc 2013-05-28 14:28:15 +0000 +++ src/acl/BoolOps.cc 2014-04-12 07:10:39 +0000 @@ -2,7 +2,6 @@ #include "acl/BoolOps.h" #include "acl/Checklist.h" #include "Debug.h" -#include "wordlist.h" /* Acl::NotNode */ @@ -52,11 +51,11 @@ return NULL; } -wordlist* +SBufList Acl::NotNode::dump() const { - wordlist *text = NULL; - wordlistAdd(&text, name); + SBufList text; + text.push_back(SBuf(name)); return text; } === modified file 'src/acl/BoolOps.h' --- src/acl/BoolOps.h 2013-05-28 14:28:15 +0000 +++ src/acl/BoolOps.h 2014-04-11 16:00:36 +0000 @@ -23,7 +23,7 @@ virtual char const *typeString() const; virtual ACL *clone() const; virtual void parse(); - virtual wordlist *dump() const; + virtual SBufList dump() const; /* Acl::InnerNode API */ virtual int doMatch(ACLChecklist *checklist, Nodes::const_iterator start) const; === modified file 'src/acl/Data.h' --- src/acl/Data.h 2012-09-01 14:38:36 +0000 +++ src/acl/Data.h 2014-04-12 13:29:42 +0000 @@ -32,7 +32,7 @@ #ifndef SQUID_ACLDATA_H #define SQUID_ACLDATA_H -class wordlist; +#include "SBufList.h" /// \ingroup ACLAPI template @@ -44,7 +44,7 @@ virtual ~ACLData() {} virtual bool match(M) =0; - virtual wordlist *dump() =0; + virtual SBufList dump() const =0; virtual void parse() =0; virtual ACLData *clone() const =0; virtual void prepareForUse() {} === modified file 'src/acl/DomainData.cc' --- src/acl/DomainData.cc 2013-10-25 00:13:46 +0000 +++ src/acl/DomainData.cc 2014-04-12 13:29:42 +0000 @@ -38,7 +38,6 @@ #include "cache_cf.h" #include "Debug.h" #include "src/URL.h" -#include "wordlist.h" template inline void @@ -140,20 +139,20 @@ static void aclDumpDomainListWalkee(char * const & node_data, void *outlist) { - /* outlist is really a wordlist ** */ - wordlistAdd((wordlist **)outlist, (char const *)node_data); + /* outlist is really a SBufList ** */ + static_cast(outlist)->push_back(SBuf(node_data)); } -wordlist * -ACLDomainData::dump() +SBufList +ACLDomainData::dump() const { - wordlist *wl = NULL; + SBufList sl; /* damn this is VERY inefficient for long ACL lists... filling * a wordlist this way costs Sum(1,N) iterations. For instance * a 1000-elements list will be filled in 499500 iterations. */ - domains->walk(aclDumpDomainListWalkee, &wl); - return wl; + domains->walk(aclDumpDomainListWalkee, &sl); + return sl; } void === modified file 'src/acl/DomainData.h' --- src/acl/DomainData.h 2013-10-25 00:13:46 +0000 +++ src/acl/DomainData.h 2014-04-12 13:29:42 +0000 @@ -46,7 +46,7 @@ virtual ~ACLDomainData(); bool match(char const *); - wordlist *dump(); + SBufList dump() const; void parse(); bool empty() const; virtual ACLData *clone() const; === modified file 'src/acl/Eui64.cc' --- src/acl/Eui64.cc 2013-06-03 14:05:16 +0000 +++ src/acl/Eui64.cc 2014-04-12 07:10:39 +0000 @@ -41,8 +41,8 @@ #include "cache_cf.h" #include "Debug.h" #include "eui/Eui64.h" +#include "globals.h" #include "ip/Address.h" -#include "wordlist.h" static void aclParseEuiList(SplayNode **curlist); static int aclMatchEui(SplayNode **dataptr, Ip::Address &c); @@ -177,13 +177,13 @@ { static char buf[48]; node->encode(buf, 48); - wordlistAdd((wordlist **)state, buf); + static_cast(state)->push_back(SBuf(buf)); } -wordlist * +SBufList ACLEui64::dump() const { - wordlist *w = NULL; + SBufList w; data->walk(aclDumpEuiListWalkee, &w); return w; } === modified file 'src/acl/Eui64.h' --- src/acl/Eui64.h 2012-08-28 13:00:30 +0000 +++ src/acl/Eui64.h 2014-04-12 07:10:39 +0000 @@ -57,7 +57,7 @@ virtual char const *typeString() const; virtual void parse(); virtual int match(ACLChecklist *checklist); - virtual wordlist *dump() const; + virtual SBufList dump() const; virtual bool empty () const; protected: === modified file 'src/acl/ExtUser.cc' --- src/acl/ExtUser.cc 2012-09-01 14:38:36 +0000 +++ src/acl/ExtUser.cc 2014-04-11 16:00:36 +0000 @@ -85,7 +85,7 @@ } } -wordlist * +SBufList ACLExtUser::dump() const { return data->dump(); === modified file 'src/acl/ExtUser.h' --- src/acl/ExtUser.h 2012-09-01 14:38:36 +0000 +++ src/acl/ExtUser.h 2014-04-11 16:00:36 +0000 @@ -55,7 +55,7 @@ virtual void parse(); virtual int match(ACLChecklist *checklist); - virtual wordlist *dump() const; + virtual SBufList dump() const; virtual bool empty () const; virtual ACL *clone()const; === modified file 'src/acl/HierCodeData.cc' --- src/acl/HierCodeData.cc 2013-10-25 00:13:46 +0000 +++ src/acl/HierCodeData.cc 2014-04-12 13:29:42 +0000 @@ -3,7 +3,6 @@ #include "acl/HierCodeData.h" #include "cache_cf.h" #include "hier_code.h" -#include "wordlist.h" ACLHierCodeData::ACLHierCodeData() { @@ -25,17 +24,17 @@ return values[toFind]; } -wordlist * -ACLHierCodeData::dump() +SBufList +ACLHierCodeData::dump() const { - wordlist *W = NULL; + SBufList sl; for (hier_code iter=HIER_NONE; iter *clone() const; === modified file 'src/acl/HttpHeaderData.cc' --- src/acl/HttpHeaderData.cc 2013-11-21 13:05:47 +0000 +++ src/acl/HttpHeaderData.cc 2014-04-12 13:29:42 +0000 @@ -42,7 +42,6 @@ #include "Debug.h" #include "HttpHeaderTools.h" #include "SBuf.h" -#include "wordlist.h" /* Construct an ACLHTTPHeaderData that uses an ACLRegex rule with the value of the * selected header from a given request. @@ -80,15 +79,13 @@ return regex_rule->match(cvalue.c_str()); } -wordlist * -ACLHTTPHeaderData::dump() +SBufList +ACLHTTPHeaderData::dump() const { - wordlist *W = NULL; - wordlistAdd(&W, hdrName.termedBuf()); - wordlist * regex_dump = regex_rule->dump(); - wordlistAddWl(&W, regex_dump); - wordlistDestroy(®ex_dump); - return W; + SBufList sl; + sl.push_back(SBuf(hdrName)); + sl.splice(sl.end(),regex_rule->dump()); + return sl; } void === modified file 'src/acl/HttpHeaderData.h' --- src/acl/HttpHeaderData.h 2012-09-01 14:38:36 +0000 +++ src/acl/HttpHeaderData.h 2014-04-12 13:29:42 +0000 @@ -54,7 +54,7 @@ ACLHTTPHeaderData(); virtual ~ACLHTTPHeaderData(); virtual bool match(HttpHeader* hdr); - virtual wordlist *dump(); + virtual SBufList dump() const; virtual void parse(); virtual bool empty() const; virtual ACLData *clone() const; === modified file 'src/acl/HttpStatus.cc' --- src/acl/HttpStatus.cc 2014-02-21 10:46:19 +0000 +++ src/acl/HttpStatus.cc 2014-04-12 07:17:08 +0000 @@ -38,7 +38,6 @@ #include "cache_cf.h" #include "Debug.h" #include "HttpReply.h" -#include "wordlist.h" #include @@ -50,14 +49,17 @@ acl_httpstatus_data::acl_httpstatus_data(int x, int y) : status1(x), status2(y) { ; } -void acl_httpstatus_data::toStr(char* buf, int len) const +SBuf +acl_httpstatus_data::repr() const { + SBuf rv; if (status2 == INT_MAX) - snprintf(buf, len, "%d-", status1); + rv.Printf("%d-", status1); else if (status1 == status2) - snprintf(buf, len, "%d", status1); + rv.Printf("%d", status1); else - snprintf(buf, len, "%d-%d", status1, status2); + rv.Printf("%d-%d", status1, status2); + return rv; } int acl_httpstatus_data::compare(acl_httpstatus_data* const& a, acl_httpstatus_data* const& b) @@ -69,13 +71,11 @@ ret = aclHTTPStatusCompare(a, b); if (ret == 0) { - char bufa[8]; - char bufb[8]; - a->toStr(bufa, sizeof(bufa)); - b->toStr(bufb, sizeof(bufb)); - debugs(28, DBG_CRITICAL, "WARNING: '" << bufa << "' is a subrange of '" << bufb << "'"); - debugs(28, DBG_CRITICAL, "WARNING: because of this '" << bufa << "' is ignored to keep splay tree searching predictable"); - debugs(28, DBG_CRITICAL, "WARNING: You should probably remove '" << bufb << "' from the ACL named '" << AclMatchedName << "'"); + const SBuf sa = a->repr(); + const SBuf sb = b->repr(); + debugs(28, DBG_CRITICAL, "WARNING: '" << sa << "' is a subrange of '" << sb << "'"); + debugs(28, DBG_CRITICAL, "WARNING: because of this '" << sa << "' is ignored to keep splay tree searching predictable"); + debugs(28, DBG_CRITICAL, "WARNING: You should probably remove '" << sb << "' from the ACL named '" << AclMatchedName << "'"); } return ret; @@ -184,15 +184,14 @@ static void aclDumpHTTPStatusListWalkee(acl_httpstatus_data * const &node, void *state) { - static char buf[8]; - node->toStr(buf, sizeof(buf)); - wordlistAdd((wordlist **)state, buf); + // state is a SBufList* + static_cast(state)->push_back(node->repr()); } -wordlist * +SBufList ACLHTTPStatus::dump() const { - wordlist *w = NULL; + SBufList w; data->walk(aclDumpHTTPStatusListWalkee, &w); return w; } === modified file 'src/acl/HttpStatus.h' --- src/acl/HttpStatus.h 2012-09-01 14:38:36 +0000 +++ src/acl/HttpStatus.h 2014-04-11 16:00:36 +0000 @@ -42,7 +42,7 @@ int status1, status2; acl_httpstatus_data(int); acl_httpstatus_data(int, int); - void toStr(char* buf, int len) const; + SBuf repr() const; // was toStr static int compare(acl_httpstatus_data* const& a, acl_httpstatus_data* const& b); }; @@ -63,7 +63,7 @@ virtual char const *typeString() const; virtual void parse(); virtual int match(ACLChecklist *checklist); - virtual wordlist *dump() const; + virtual SBufList dump() const; virtual bool empty () const; virtual bool requiresReply() const { return true; } === modified file 'src/acl/InnerNode.cc' --- src/acl/InnerNode.cc 2014-01-11 01:35:50 +0000 +++ src/acl/InnerNode.cc 2014-04-12 07:10:39 +0000 @@ -7,7 +7,6 @@ #include "ConfigParser.h" #include "Debug.h" #include "globals.h" -#include "wordlist.h" #include void @@ -64,13 +63,13 @@ return; } -wordlist* +SBufList Acl::InnerNode::dump() const { - wordlist *values = NULL; + SBufList rv; for (Nodes::const_iterator i = nodes.begin(); i != nodes.end(); ++i) - wordlistAdd(&values, (*i)->name); - return values; + rv.push_back(SBuf((*i)->name)); + return rv; } int === modified file 'src/acl/InnerNode.h' --- src/acl/InnerNode.h 2014-01-06 20:55:13 +0000 +++ src/acl/InnerNode.h 2014-04-11 16:00:36 +0000 @@ -24,7 +24,7 @@ /* ACL API */ virtual void prepareForUse(); virtual bool empty() const; - virtual wordlist *dump() const; + virtual SBufList dump() const; /// parses one "acl name type acl1 acl2..." line, appending to nodes void lineParse(); === modified file 'src/acl/IntRange.cc' --- src/acl/IntRange.cc 2014-01-11 01:35:50 +0000 +++ src/acl/IntRange.cc 2014-04-12 13:29:42 +0000 @@ -37,7 +37,6 @@ #include "cache_cf.h" #include "Debug.h" #include "Parsing.h" -#include "wordlist.h" /* explicit instantiation required for some systems */ /** \cond AUTODOCS_IGNORE */ @@ -109,27 +108,27 @@ return new ACLIntRange (*this); } -ACLIntRange::~ACLIntRange () +ACLIntRange::~ACLIntRange() {} -wordlist * -ACLIntRange::dump () +SBufList +ACLIntRange::dump() const { - wordlist *W = NULL; - char buf[32]; + SBufList sl; CbDataListIterator iter(ranges); while (!iter.end()) { + SBuf sb; const RangeType & element = iter.next(); if (element.size() == 1) - snprintf(buf, sizeof(buf), "%d", element.start); + sb.Printf("%d", element.start); else - snprintf(buf, sizeof(buf), "%d-%d", element.start, element.end-1); + sb.Printf("%d-%d", element.start, element.end-1); - wordlistAdd(&W, buf); + sl.push_back(sb); } - return W; + return sl; } === modified file 'src/acl/IntRange.h' --- src/acl/IntRange.h 2012-09-01 14:38:36 +0000 +++ src/acl/IntRange.h 2014-04-12 13:29:42 +0000 @@ -46,7 +46,7 @@ virtual ~ACLIntRange(); virtual bool match(int); - virtual wordlist *dump(); + virtual SBufList dump() const; virtual void parse(); virtual bool empty() const; virtual ACLData *clone() const; === modified file 'src/acl/Ip.cc' --- src/acl/Ip.cc 2013-10-25 00:13:46 +0000 +++ src/acl/Ip.cc 2014-04-12 09:11:20 +0000 @@ -62,20 +62,7 @@ void ACLIP::DumpIpListWalkee(acl_ip_data * const & ip, void *state) { - char tmpbuf[ ((MAX_IPSTRLEN*2)+6) ]; // space for 2 IPs and a CIDR mask(3) and seperators(3). - MemBuf mb; - wordlist **W = static_cast(state); - tmpbuf[0] = '\0'; - - mb.init(); - assert(mb.max_capacity > 0 && 1==1 ); - - ip->toStr(tmpbuf, sizeof(tmpbuf) ); - assert(mb.max_capacity > 0 && 2==2 ); - mb.append(tmpbuf, strlen(tmpbuf) ); - assert(mb.max_capacity > 0 && 3==3); - wordlistAdd(W, mb.buf); - mb.clean(); + static_cast(state)->push_back(ip->toSBuf()); } /** @@ -115,6 +102,16 @@ b3[0] = '\0'; } +SBuf +acl_ip_data::toSBuf() const +{ + const int bufsz = MAX_IPSTRLEN*2+6; + static char tmpbuf[ bufsz ]; + toStr(tmpbuf,bufsz); + return SBuf(tmpbuf); +} + + /* * aclIpAddrNetworkCompare - The guts of the comparison for IP ACLs * matching checks. The first argument (p) is a "host" address, @@ -528,16 +525,16 @@ data->destroy(IPSplay::DefaultFree); } -wordlist * +SBufList ACLIP::dump() const { - wordlist *w = NULL; - data->walk (DumpIpListWalkee, &w); - return w; + SBufList sl; + data->walk(DumpIpListWalkee, &sl); + return sl; } bool -ACLIP::empty () const +ACLIP::empty() const { return data->empty(); } @@ -561,6 +558,6 @@ return !splayLastResult; } -acl_ip_data::acl_ip_data () :addr1(), addr2(), mask(), next (NULL) {} +acl_ip_data::acl_ip_data() :addr1(), addr2(), mask(), next (NULL) {} -acl_ip_data::acl_ip_data (Ip::Address const &anAddress1, Ip::Address const &anAddress2, Ip::Address const &aMask, acl_ip_data *aNext) : addr1(anAddress1), addr2(anAddress2), mask(aMask), next(aNext) {} +acl_ip_data::acl_ip_data(Ip::Address const &anAddress1, Ip::Address const &anAddress2, Ip::Address const &aMask, acl_ip_data *aNext) : addr1(anAddress1), addr2(anAddress2), mask(aMask), next(aNext) {} === modified file 'src/acl/Ip.h' --- src/acl/Ip.h 2013-10-25 00:13:46 +0000 +++ src/acl/Ip.h 2014-04-11 16:00:36 +0000 @@ -50,6 +50,7 @@ acl_ip_data (Ip::Address const &, Ip::Address const &, Ip::Address const &, acl_ip_data *); void toStr(char *buf, int len) const; + SBuf toSBuf() const; Ip::Address addr1; @@ -85,7 +86,7 @@ virtual void parse(); // virtual bool isProxyAuth() const {return true;} virtual int match(ACLChecklist *checklist) = 0; - virtual wordlist *dump() const; + virtual SBufList dump() const; virtual bool empty () const; protected: === modified file 'src/acl/MaxConnection.cc' --- src/acl/MaxConnection.cc 2012-11-15 07:35:32 +0000 +++ src/acl/MaxConnection.cc 2014-04-12 07:10:39 +0000 @@ -39,7 +39,6 @@ #include "client_db.h" #include "Debug.h" #include "SquidConfig.h" -#include "wordlist.h" ACL * ACLMaxConnection::clone() const @@ -104,21 +103,17 @@ return clientdbEstablished(Filled(checklist)->src_addr, 0) > limit ? 1 : 0; } -wordlist * +SBufList ACLMaxConnection::dump() const { + SBufList sl; if (!limit) - return NULL; - - wordlist *W = NULL; - - char buf[32]; - - snprintf(buf, sizeof(buf), "%d", limit); - - wordlistAdd(&W, buf); - - return W; + return sl; + + SBuf s; + s.Printf("%d", limit); + sl.push_back(s); + return sl; } void === modified file 'src/acl/MaxConnection.h' --- src/acl/MaxConnection.h 2012-09-01 14:38:36 +0000 +++ src/acl/MaxConnection.h 2014-04-12 07:10:39 +0000 @@ -52,7 +52,7 @@ virtual char const *typeString() const; virtual void parse(); virtual int match(ACLChecklist *checklist); - virtual wordlist *dump() const; + virtual SBufList dump() const; virtual bool empty () const; virtual bool valid () const; virtual void prepareForUse(); === modified file 'src/acl/MethodData.cc' --- src/acl/MethodData.cc 2014-01-11 01:35:50 +0000 +++ src/acl/MethodData.cc 2014-04-12 13:29:42 +0000 @@ -37,7 +37,6 @@ #include "acl/MethodData.h" #include "cache_cf.h" #include "HttpRequestMethod.h" -#include "wordlist.h" int ACLMethodData::ThePurgeCount = 0; @@ -68,18 +67,18 @@ template cbdata_type CbDataList::CBDATA_CbDataList; /// \endcond -wordlist * -ACLMethodData::dump() +SBufList +ACLMethodData::dump() const { - wordlist *W = NULL; + SBufList sl; CbDataList *data = values; while (data != NULL) { - wordlistAdd(&W, RequestMethodStr(data->element)); + sl.push_back(SBuf(RequestMethodStr(data->element))); data = data->next; } - return W; + return sl; } void === modified file 'src/acl/MethodData.h' --- src/acl/MethodData.h 2012-09-01 14:38:36 +0000 +++ src/acl/MethodData.h 2014-04-12 13:29:42 +0000 @@ -50,7 +50,7 @@ ACLMethodData &operator= (ACLMethodData const &); virtual ~ACLMethodData(); bool match(HttpRequestMethod); - wordlist *dump(); + SBufList dump() const; void parse(); bool empty() const; virtual ACLData *clone() const; === modified file 'src/acl/NoteData.cc' --- src/acl/NoteData.cc 2014-02-10 12:58:49 +0000 +++ src/acl/NoteData.cc 2014-04-12 13:29:42 +0000 @@ -51,15 +51,13 @@ return false; } -wordlist * -ACLNoteData::dump() +SBufList +ACLNoteData::dump() const { - wordlist *W = NULL; - wordlistAdd(&W, name.termedBuf()); - wordlist * dumpR = values->dump(); - wordlistAddWl(&W, dumpR); - wordlistDestroy(&dumpR); - return W; + SBufList sl; + sl.push_back(SBuf(name)); + sl.splice(sl.end(),values->dump()); + return sl; } void === modified file 'src/acl/NoteData.h' --- src/acl/NoteData.h 2013-10-25 00:13:46 +0000 +++ src/acl/NoteData.h 2014-04-12 13:29:42 +0000 @@ -17,7 +17,7 @@ ACLNoteData(); virtual ~ACLNoteData(); virtual bool match(HttpRequest* request); - virtual wordlist *dump(); + virtual SBufList dump() const; virtual void parse(); virtual bool empty() const; virtual ACLData *clone() const; === modified file 'src/acl/ProtocolData.cc' --- src/acl/ProtocolData.cc 2014-02-07 13:45:20 +0000 +++ src/acl/ProtocolData.cc 2014-04-12 13:29:42 +0000 @@ -65,18 +65,18 @@ template cbdata_type CbDataList::CBDATA_CbDataList; /// \endcond -wordlist * -ACLProtocolData::dump() +SBufList +ACLProtocolData::dump() const { - wordlist *W = NULL; + SBufList sl; CbDataList *data = values; while (data != NULL) { - wordlistAdd(&W, AnyP::ProtocolType_str[data->element]); + sl.push_back(SBuf(AnyP::ProtocolType_str[data->element])); data = data->next; } - return W; + return sl; } void === modified file 'src/acl/ProtocolData.h' --- src/acl/ProtocolData.h 2012-09-01 14:38:36 +0000 +++ src/acl/ProtocolData.h 2014-04-12 13:29:42 +0000 @@ -50,7 +50,7 @@ ACLProtocolData &operator= (ACLProtocolData const &); virtual ~ACLProtocolData(); bool match(AnyP::ProtocolType); - wordlist *dump(); + SBufList dump() const; void parse(); bool empty() const; virtual ACLData *clone() const; === modified file 'src/acl/Random.cc' --- src/acl/Random.cc 2013-01-02 00:42:43 +0000 +++ src/acl/Random.cc 2014-04-12 07:10:39 +0000 @@ -135,10 +135,10 @@ return (data > random)?1:0; } -wordlist * +SBufList ACLRandom::dump() const { - wordlist *w = NULL; - wordlistAdd(&w, pattern); - return w; + SBufList sl; + sl.push_back(SBuf(pattern)); + return sl; } === modified file 'src/acl/Random.h' --- src/acl/Random.h 2012-11-15 07:35:32 +0000 +++ src/acl/Random.h 2014-04-12 07:10:39 +0000 @@ -51,7 +51,7 @@ virtual char const *typeString() const; virtual void parse(); virtual int match(ACLChecklist *checklist); - virtual wordlist *dump() const; + virtual SBufList dump() const; virtual bool empty () const; virtual bool valid() const; === modified file 'src/acl/RegexData.cc' --- src/acl/RegexData.cc 2013-10-25 00:13:46 +0000 +++ src/acl/RegexData.cc 2014-04-12 13:29:42 +0000 @@ -101,28 +101,28 @@ return 0; } -wordlist * -ACLRegexData::dump() +SBufList +ACLRegexData::dump() const { - wordlist *W = NULL; + SBufList sl; RegexList *temp = data; int flags = REG_EXTENDED | REG_NOSUB; while (temp != NULL) { if (temp->flags != flags) { if ((temp->flags®_ICASE) != 0) { - wordlistAdd(&W, "-i"); + sl.push_back(SBuf("-i")); } else { - wordlistAdd(&W, "+i"); + sl.push_back(SBuf("+i")); } flags = temp->flags; } - wordlistAdd(&W, temp->pattern); + sl.push_back(SBuf(temp->pattern)); temp = temp->next; } - return W; + return sl; } static const char * === modified file 'src/acl/RegexData.h' --- src/acl/RegexData.h 2012-09-06 11:56:46 +0000 +++ src/acl/RegexData.h 2014-04-12 13:29:42 +0000 @@ -45,7 +45,7 @@ virtual ~ACLRegexData(); virtual bool match(char const *user); - virtual wordlist *dump(); + virtual SBufList dump() const; virtual void parse(); virtual bool empty() const; virtual ACLData *clone() const; === modified file 'src/acl/Strategised.h' --- src/acl/Strategised.h 2013-10-25 00:13:46 +0000 +++ src/acl/Strategised.h 2014-04-11 16:00:36 +0000 @@ -63,7 +63,7 @@ virtual void parse(); virtual int match(ACLChecklist *checklist); virtual int match (M const &); - virtual wordlist *dump() const; + virtual SBufList dump() const; virtual bool empty () const; virtual bool valid () const; virtual ACL *clone()const; @@ -161,7 +161,7 @@ } template -wordlist * +SBufList ACLStrategised::dump() const { return data->dump(); === modified file 'src/acl/StringData.cc' --- src/acl/StringData.cc 2013-10-25 00:13:46 +0000 +++ src/acl/StringData.cc 2014-04-12 13:29:42 +0000 @@ -37,7 +37,6 @@ #include "acl/StringData.h" #include "cache_cf.h" #include "Debug.h" -#include "wordlist.h" ACLStringData::ACLStringData() : values (NULL) {} @@ -90,20 +89,20 @@ static void aclDumpStringWalkee(char * const & node_data, void *outlist) { - /* outlist is really a wordlist ** */ - wordlistAdd((wordlist **)outlist, node_data); + /* outlist is really a SBufList* */ + static_cast(outlist)->push_back(SBuf(node_data)); } -wordlist * -ACLStringData::dump() +SBufList +ACLStringData::dump() const { - wordlist *wl = NULL; + SBufList sl; /* damn this is VERY inefficient for long ACL lists... filling - * a wordlist this way costs Sum(1,N) iterations. For instance + * a SBufList this way costs Sum(1,N) iterations. For instance * a 1000-elements list will be filled in 499500 iterations. */ - values->walk(aclDumpStringWalkee, &wl); - return wl; + values->walk(aclDumpStringWalkee, &sl); + return sl; } void === modified file 'src/acl/StringData.h' --- src/acl/StringData.h 2013-11-12 14:48:50 +0000 +++ src/acl/StringData.h 2014-04-12 13:29:42 +0000 @@ -48,7 +48,7 @@ ACLStringData &operator= (ACLStringData const &); virtual ~ACLStringData(); bool match(char const *); - wordlist *dump(); + SBufList dump() const; virtual void parse(); bool empty() const; virtual ACLData *clone() const; === modified file 'src/acl/TimeData.cc' --- src/acl/TimeData.cc 2013-10-25 00:13:46 +0000 +++ src/acl/TimeData.cc 2014-04-12 13:29:42 +0000 @@ -97,15 +97,15 @@ return 0; } -wordlist * -ACLTimeData::dump() +SBufList +ACLTimeData::dump() const { - wordlist *W = NULL; - char buf[128]; - ACLTimeData *t = this; + SBufList sl; + const ACLTimeData *t = this; while (t != NULL) { - snprintf(buf, sizeof(buf), "%c%c%c%c%c%c%c %02d:%02d-%02d:%02d", + SBuf s; + s.Printf("%c%c%c%c%c%c%c %02d:%02d-%02d:%02d", t->weekbits & ACL_SUNDAY ? 'S' : '-', t->weekbits & ACL_MONDAY ? 'M' : '-', t->weekbits & ACL_TUESDAY ? 'T' : '-', @@ -114,11 +114,11 @@ t->weekbits & ACL_FRIDAY ? 'F' : '-', t->weekbits & ACL_SATURDAY ? 'A' : '-', t->start / 60, t->start % 60, t->stop / 60, t->stop % 60); - wordlistAdd(&W, buf); + sl.push_back(s); t = t->next; } - return W; + return sl; } void === modified file 'src/acl/TimeData.h' --- src/acl/TimeData.h 2013-10-25 00:13:46 +0000 +++ src/acl/TimeData.h 2014-04-12 13:29:42 +0000 @@ -48,7 +48,7 @@ ACLTimeData&operator=(ACLTimeData const &); virtual ~ACLTimeData(); bool match(time_t); - wordlist *dump(); + SBufList dump() const; void parse(); bool empty() const; virtual ACLData *clone() const; === modified file 'src/acl/Tree.cc' --- src/acl/Tree.cc 2013-06-04 03:55:55 +0000 +++ src/acl/Tree.cc 2014-04-11 16:00:36 +0000 @@ -48,28 +48,25 @@ InnerNode::add(rule); } -wordlist* +SBufList Acl::Tree::treeDump(const char *prefix, const ActionToString &convert) const { - wordlist *text = NULL; + SBufList text; Actions::const_iterator action = actions.begin(); typedef Nodes::const_iterator NCI; for (NCI node = nodes.begin(); node != nodes.end(); ++node) { - wordlistAdd(&text, prefix); + text.push_back(SBuf(prefix)); if (action != actions.end()) { const char *act = convert ? convert[action->kind] : (*action == ACCESS_ALLOWED ? "allow" : "deny"); - wordlistAdd(&text, act ? act : "???"); + text.push_back(act?SBuf(act):SBuf("???")); ++action; } - wordlist *rule = (*node)->dump(); - wordlistAddWl(&text, rule); - wordlistDestroy(&rule); - - wordlistAdd(&text, "\n"); + text.splice(text.end(),(*node)->dump()); + text.push_back(SBuf("\n")); } return text; } === modified file 'src/acl/Tree.h' --- src/acl/Tree.h 2013-05-28 14:28:15 +0000 +++ src/acl/Tree.h 2014-04-11 16:00:36 +0000 @@ -2,6 +2,7 @@ #define SQUID_ACL_TREE_H #include "acl/BoolOps.h" +#include "SBufList.h" namespace Acl { @@ -14,7 +15,7 @@ /// dumps tuples /// action.kind is mapped to a string using the supplied conversion table typedef const char **ActionToString; - wordlist* treeDump(const char *name, const ActionToString &convert) const; + SBufList treeDump(const char *name, const ActionToString &convert) const; /// Returns the corresponding action after a successful tree match. allow_t winningAction() const; === modified file 'src/acl/UserData.cc' --- src/acl/UserData.cc 2013-10-25 00:13:46 +0000 +++ src/acl/UserData.cc 2014-04-12 13:29:42 +0000 @@ -37,7 +37,6 @@ #include "acl/UserData.h" #include "ConfigParser.h" #include "Debug.h" -#include "wordlist.h" template inline void @@ -97,28 +96,28 @@ static void aclDumpUserListWalkee(char * const & node_data, void *outlist) { - /* outlist is really a wordlist ** */ - wordlistAdd((wordlist **)outlist, (char const *)node_data); + /* outlist is really a SBufList* */ + static_cast(outlist)->push_back(SBuf(node_data)); } -wordlist * -ACLUserData::dump() +SBufList +ACLUserData::dump() const { - wordlist *wl = NULL; + SBufList sl; if (flags.case_insensitive) - wordlistAdd(&wl, "-i"); + sl.push_back(SBuf("-i")); /* damn this is VERY inefficient for long ACL lists... filling - * a wordlist this way costs Sum(1,N) iterations. For instance + * a SBufList this way costs Sum(1,N) iterations. For instance * a 1000-elements list will be filled in 499500 iterations. */ if (flags.required) - wordlistAdd(&wl, "REQUIRED"); + sl.push_back(SBuf("REQUIRED")); else if (names) - names->walk(aclDumpUserListWalkee, &wl); + names->walk(aclDumpUserListWalkee, &sl); - return wl; + return sl; } void === modified file 'src/acl/UserData.h' --- src/acl/UserData.h 2013-10-25 00:13:46 +0000 +++ src/acl/UserData.h 2014-04-12 13:29:42 +0000 @@ -45,7 +45,7 @@ virtual ~ACLUserData(); bool match(char const *user); - wordlist *dump(); + SBufList dump() const; void parse(); bool empty() const; virtual ACLData *clone() const; === modified file 'src/auth/AclMaxUserIp.cc' --- src/auth/AclMaxUserIp.cc 2014-02-08 13:36:42 +0000 +++ src/auth/AclMaxUserIp.cc 2014-04-12 14:50:51 +0000 @@ -146,19 +146,14 @@ } } -wordlist * +SBufList ACLMaxUserIP::dump() const { + SBufList sl; if (!maximum) - return NULL; - - wordlist *W = NULL; - - char buf[128]; - - snprintf(buf, sizeof(buf), "%lu", (unsigned long int) maximum); - - wordlistAdd(&W, buf); - - return W; + return sl; + SBuf s; + s.Printf("%d", maximum); + sl.push_back(s); + return sl; } === modified file 'src/auth/AclMaxUserIp.h' --- src/auth/AclMaxUserIp.h 2014-01-11 01:35:50 +0000 +++ src/auth/AclMaxUserIp.h 2014-04-12 07:10:39 +0000 @@ -54,7 +54,7 @@ virtual char const *typeString() const; virtual void parse(); virtual int match(ACLChecklist *cl); - virtual wordlist *dump() const; + virtual SBufList dump() const; virtual bool empty() const; virtual bool valid() const; virtual bool requiresRequest() const {return true;} === modified file 'src/auth/AclProxyAuth.cc' --- src/auth/AclProxyAuth.cc 2014-03-23 10:28:52 +0000 +++ src/auth/AclProxyAuth.cc 2014-04-11 16:00:36 +0000 @@ -99,7 +99,7 @@ } } -wordlist * +SBufList ACLProxyAuth::dump() const { return data->dump(); === modified file 'src/auth/AclProxyAuth.h' --- src/auth/AclProxyAuth.h 2014-01-11 01:35:50 +0000 +++ src/auth/AclProxyAuth.h 2014-04-11 16:00:36 +0000 @@ -65,7 +65,7 @@ virtual bool isProxyAuth() const {return true;} virtual int match(ACLChecklist *checklist); - virtual wordlist *dump() const; + virtual SBufList dump() const; virtual bool valid() const; virtual bool empty() const; virtual bool requiresRequest() const {return true;} === modified file 'src/cache_cf.cc' --- src/cache_cf.cc 2014-04-04 16:36:47 +0000 +++ src/cache_cf.cc 2014-04-12 14:50:51 +0000 @@ -72,6 +72,7 @@ #include "PeerDigest.h" #include "RefreshPattern.h" #include "rfc1738.h" +#include "SBufList.h" #include "SquidConfig.h" #include "SquidString.h" #include "ssl/ProxyCerts.h" @@ -1287,15 +1288,13 @@ return 0; } -/***************************************************************************** - * Max - *****************************************************************************/ - static void -dump_wordlist(StoreEntry * entry, wordlist *words) +dump_SBufList(StoreEntry * entry, const SBufList &words) { - for (wordlist *word = words; word; word = word->next) - storeAppendPrintf(entry, "%s ", word->key); + for (SBufList::const_iterator i = words.begin(); i != words.end(); ++i) { + entry->append(i->rawContent(), i->length()); + entry->append(" ",1); + } } static void @@ -1308,11 +1307,7 @@ ae->name, ae->typeString(), ae->flags.flagsStr()); - wordlist *w = ae->dump(); - dump_wordlist(entry, w); - - storeAppendPrintf(entry, "\n"); - wordlistDestroy(&w); + dump_SBufList(entry, ae->dump()); ae = ae->next; } } @@ -1332,19 +1327,14 @@ void dump_acl_list(StoreEntry * entry, ACLList * head) { - wordlist *values = head->dump(); - dump_wordlist(entry, values); - wordlistDestroy(&values); + dump_SBufList(entry, head->dump()); } void dump_acl_access(StoreEntry * entry, const char *name, acl_access * head) { - if (head) { - wordlist *lines = head->treeDump(name, NULL); - dump_wordlist(entry, lines); - wordlistDestroy(&lines); - } + if (head) + dump_SBufList(entry, head->treeDump(name,NULL)); } static void @@ -4880,11 +4870,8 @@ static void dump_ftp_epsv(StoreEntry *entry, const char *name, acl_access *ftp_epsv) { - if (ftp_epsv) { - wordlist *lines = ftp_epsv->treeDump(name, NULL); - dump_wordlist(entry, lines); - wordlistDestroy(&lines); - } + if (ftp_epsv) + dump_SBufList(entry, ftp_epsv->treeDump(name, NULL)); } static void free_ftp_epsv(acl_access **ftp_epsv) === modified file 'src/external_acl.cc' --- src/external_acl.cc 2014-03-30 12:00:34 +0000 +++ src/external_acl.cc 2014-04-12 09:11:20 +0000 @@ -930,23 +930,20 @@ } } -wordlist * +SBufList ACLExternal::dump() const { external_acl_data const *acl = data; - wordlist *result = NULL; - wordlist *arg; - MemBuf mb; - mb.init(); - mb.Printf("%s", acl->def->name); + SBufList rv; + rv.push_back(SBuf(acl->def->name)); - for (arg = acl->arguments; arg; arg = arg->next) { - mb.Printf(" %s", arg->key); + for (wordlist *arg = acl->arguments; arg; arg = arg->next) { + SBuf s; + s.Printf(" %s", arg->key); + rv.push_back(s); } - wordlistAdd(&result, mb.buf); - mb.clean(); - return result; + return rv; } /****************************************************************** === modified file 'src/ident/AclIdent.cc' --- src/ident/AclIdent.cc 2013-05-13 22:48:23 +0000 +++ src/ident/AclIdent.cc 2014-04-12 09:11:20 +0000 @@ -103,7 +103,7 @@ return -1; } -wordlist * +SBufList ACLIdent::dump() const { return data->dump(); === modified file 'src/ident/AclIdent.h' --- src/ident/AclIdent.h 2012-09-01 14:38:36 +0000 +++ src/ident/AclIdent.h 2014-04-12 09:11:20 +0000 @@ -70,7 +70,7 @@ virtual bool isProxyAuth() const {return true;} virtual int match(ACLChecklist *checklist); - virtual wordlist *dump() const; + virtual SBufList dump() const; virtual bool empty () const; virtual ACL *clone()const; === modified file 'src/tests/stub_external_acl.cc' --- src/tests/stub_external_acl.cc 2013-11-07 02:59:49 +0000 +++ src/tests/stub_external_acl.cc 2014-04-12 13:29:42 +0000 @@ -13,7 +13,7 @@ bool ACLExternal::valid () const STUB_RETVAL(false) bool ACLExternal::empty () const STUB_RETVAL(false) int ACLExternal::match(ACLChecklist *) STUB_RETVAL(0) -wordlist * ACLExternal::dump() const STUB_RETVAL(NULL) +SBufList ACLExternal::dump() const STUB_RETVAL(SBufList()) void ACLExternal::ExternalAclLookup(ACLChecklist *, ACLExternal *) STUB void ExternalACLLookup::Start(ACLChecklist *, external_acl_data *, bool) STUB void externalAclInit(void) STUB_NOP === modified file 'src/tests/stub_libauth_acls.cc' --- src/tests/stub_libauth_acls.cc 2013-10-31 11:14:45 +0000 +++ src/tests/stub_libauth_acls.cc 2014-04-12 13:29:42 +0000 @@ -20,7 +20,7 @@ void ACLMaxUserIP::parse() STUB int ACLMaxUserIP::match(Auth::UserRequest::Pointer, Ip::Address const &) STUB_RETVAL(0) int ACLMaxUserIP::match(ACLChecklist *) STUB_RETVAL(0) -wordlist * ACLMaxUserIP::dump() const STUB_RETVAL(NULL) +SBufList ACLMaxUserIP::dump() const STUB_RETVAL(SBufList()) #include "auth/AclProxyAuth.h" ACLProxyAuth::~ACLProxyAuth() STUB @@ -30,7 +30,7 @@ char const * ACLProxyAuth::typeString() const STUB_RETVAL(NULL) void ACLProxyAuth::parse() STUB int ACLProxyAuth::match(ACLChecklist *) STUB_RETVAL(0) -wordlist * ACLProxyAuth::dump() const STUB_RETVAL(NULL) +SBufList ACLProxyAuth::dump() const STUB_RETVAL(SBufList()) bool ACLProxyAuth::empty () const STUB_RETVAL(false) bool ACLProxyAuth::valid () const STUB_RETVAL(false) ProxyAuthLookup * ProxyAuthLookup::Instance() STUB_RETVAL(NULL) # Begin bundle IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWbtsxHIASDHfgGRUe//////n /+6////7YEMM4iE9aDu4bgAaMd24Yed5dKNgbfXfdWDHXNUAALue9Q6+T6AADvvveUAAG53AABYs AAHcdwKAOdtAALMAB1oFAHZgABuPKIffZ69sXwBuMwugKJANCEADWbrl6z3ucR12bgAsCQLZ06KA 1bBrEEtsG20NFUV01BJIIBMJpppNoE0NNCaNJtRlMgybSZDJ6mg0xPUEU8TQASIAAAAAAAAAAAAB KaARSSp+J6KeRCeQnqAaMCDATRkaYg0aabU0wk0kkTQTymSbKeqeNSPQm01DNRiAAGgAAABEpAIa BNBoaZEYjEmjKntGjU9BM0p6mIaaDamnqBVIEaNATSITRMhomU8VPIj1NBkA9QAAADXKH1GpyQiZ hAAy+PEaBw37H7+mNLzpk4Oc+MJoS6Mh6Sx9FGPJP0iZrTId3TiJzkktUVUKnhFpjEPzI3X4r11d Hyjfr9CX+buIEhH0keGrdG2IiRGAgyKRQRIszlhMmqUsoXVzKVFqW2sMSjXvFJ/WyTTBGKKh2U3s AwVVQ2ZKoigjP1efrSbzXs9fqheyvOqEW75bx52bBfD5sqY4+Tu+2tSpPIXCiPE5Btx4ekZ4hZB8 xel5XeRpVI8POZfjkbKipLiI5Wwzhh8HqcAgTMUcBuIf92rl2KZiKIIKqMWB6iz37hrQSVN2b+jW bBe0buu3RTcbEsirWSZ2BTFopWcqXEa0KNW2idNoqOLVplo40tuNZhbRXBMEMEYMelbd+ryi3vT1 Ex1VD5XM4WrjFd8nIrJpO+8zm8yyXFPq7s2uj8orkDyWXq7kXndXOcKL7q7LcLi+rPLMLlX+kJmF RugKVQBMkQZvJHhFMLC3OOODOhuIANQzMwTVUhKqtKNSsLUW0qyKxUUbRccBCGZnh48tcgUQ5DMF a55YnE3KtVPcq45y9kmcwyeDzysiK4phneG5ynh3UupuMVtMalyd1Pd1NvNy3Rsjt8lcFquJ7zY7 hyeO5izTcXMm3RxbejwlyXOWKCxQTs3pMZsvFvb0TJYaiCG5ccRM0N0ahvb6fnshIAgkCR/fxR0b EtqY/B86+ERO+Hl+c2r/MnU8wnf2WcGD55XTYaAEdICO0BGLISBGJEBGIkgCxQUUFUUIxjEgoisF ERESIixIsREQQRjAVgwZFEiqMQEYxBYosFBURFYoKooDEFFRgzJj8vPBAkGzc5AG0Zt2+G9mhJF0 6vc/fKzrpBWNr6UJdWESzFkOJHBDIEfGjxwdnLc8ceHh4ujOcoLh2lUmtqd3fjvaiKhljlLOOQO6 Q0olTarcolFl3AkDgpUoVuIWrVSNKHIFqNTS2u+vCHRhOQPxy0QSnJRQrxzLcy3ZEPSSlUrWVaap LQ6hCRgjcLgKt20RKpXDzrlrkveXyW1WpIdi1im36Axagjhtzq5feCd1tS8GubF1uxZTWIalidWX WNIZo967YZCgTuKciIuNpyeBN3fNjJ5zvJJNvZ5b7zR3VvDwQU463NhqQkNcOzdYKdXcWjY1nV3d 8TIx2DqG6jheJoGOHHa2QQtCHDpWRqTPEMas6w7HUBkOOEOzQilaCsak1GFE4IVHVOdYzcu1NPAQ ecu7fS1XXEP2AVOUuISMRAicyLlzEhN2ZilS6S7Cq4L12dd6Thb52d0O9Z2SxGvMTL3TtKqXErSW 8HKx+I+Rv1eZ8T+bHpG9X7r+MuYtMTYvDg3aLYvmGNTOIHQ2af8gSmee5l1tIuo67+PEg4ldYZrJ mX++p0XSOj4Vf4+LuWpJTJigZMwknYRsMHCEQkVl0oCFlznF7pf0ZX7HU6dMCspqoHq010GEapvA R/ShzZ8hdrcbwEca9Dq8bBUZs0wlh4CIni6eH/N29FBIjFBEGHtezeHhopAEL9aXm+6eqNtstjGa BFpzSHlrQfuO08e/1P9HjHyVf1XEzj/1lI2PrTEXVKlZt3zK5O7FYiIt95cXlRO3WWPxapd3d1k8 2KrI28iL5JS+VjMrR7zS0wmQm1ukQlaOkM4mUHHCRuJQYQQcOGkktkNoaZmNg5beX8qSQmSECCjF ViqgoqixERARYIoKxERViykk5mCgoKSHQoybIQcyk9/1ncNG1a8LcpQYNKWNXDMynS4mRRapaJp0 4g5dZa0URIgAQEhS5R9NEn1gdxWjZgjpk6xgMbeOsxobZka5vnAnBBi4GDVvUkTm55AJSSiim8wo +kXiSzfMpOhRps0r67KaqIwrlswEaUeS9/l1672lp7NzkfSxTE3pISOjp3beau21RCRbliBGlEFG hEED2oeRlr4x7yqBIFQMYkMeoQ19vb1U1we6lBkYAZgB8U5Oe4624R4emlPihTA/LR3dxks1Ge1s yEPrTOrHVBePHDjx3Q36XjebDcWz5IlJ2Dwe5ppC0r718ae3NIAmZCX3jjk2eCdf0BjAi0LHN+kO rPMQksmiTwHDLFjFtLKDVuK0w06L/Y58/e9HenBRRSbtt+XRWKcU183Vm/VtSnPwpw4E4/c+R+h4 89jfQZfImDoYgwmkczFlP1trWgTslG2GNpdLB2jNAeEXDDQcdD1M9ziW+BsD2ALMhHyHD4xjlV8d r/HufGOiR7P9mmLOnnlUSiYJlTVSVelAA6SIN3blMaUKaEzjzFgllCMHAWvHGFCE9Npz5nPxtZdj bNhN2g6z4YcBBIgkRERBBJEiRBBJIgRE9spKJEPdkJDpMDA5qURPskmTDAQRPeQoghQyakmgTYM0 gYmLYQIHzB09HLvzOvWmmaMmTNCbA6Zi6o5hkvXXRmYONrTOCwQkIh7CGtGwl3wkDkAeBabdBe7a bFdddB/oclCTKVmj4UPVCyDeaEaQEKRIglfE1lmwagrBKHKMsE4y0Vaqus8BtiKv+C6LsBf97/TT MfmiQzlu3S+4zZvujRCoecbApaLmuEcxWBRSsV1nUY5JmwuyXHazyladr2nc303xp27VeLji9e8z XNRy7ZdMID2ye7n0VruGjOYNY1mEDNAhtAsgKDDRE0NWGF0WLGE2Ig+USopOUghW5y6zsOj4n8oY 8O8U8LyQ6YJ9FeXy9JLClk0Ks0TNUiyQuiqihhsmMNmbqE2Ngoe7IDIQIdAdPKilRVKzcCZPqT1n nD1QITh5J6aNaoW1bxoW5mXMmTuTSquClt1aqrbVxjWmmjFxHszxQgW2QlthbSW2QltHBiaNp5/M neh9DPPPAfQIV6rVlJuVILF1RTXSmUSvjyMHuj0gDDc5sDbLkIwQMdTGJmYpCRiBmNFxMx1A3UHV FuNxNxEoO3zmdLaWTMYjiZrTMECEyO8dhoQrXFQpAXJC2BILkiLVBcmEutstKiTVRu4GFjjXXu7C PqMYxgMQMu+OARz5R2TyiIwhu3WaygDYQiUWfsTQzkh6bqJqbRqmERo0XfdVH+AjLNGm8NKGjbdU lBwuvUgl1QBnLS8w1XZLlVrVtG4qqISIRBQsou1aM1mq7dZdfSNJJqKRlKhEwYI3FZcBUKOCilR2 FplNBblWOo0FXGrBOModN5pH/MaP1/0T9MkpS29QBJTlN6piJ2on0oIRnm2cNLkQbbYXcM3aTi8R ZKJSlEcNZZt3C6zVTIQgtck0NLJbpVWdqv8w558dsl3TZRhNvsN0Hi49CkRZmmRkqibfefbLdNPV c3acO31iFryi6TfjzDeGqqFK3Qz1aLnUNhxPXJLBnZjVRds28f69WTfpRy8dapKIhnKG8rKQiDdY ThCzzzDle70oGzTVsycrrrN6ukzPSXMIYKRNWF+RtZOrJEVzZNWyybtkwzVelV03C61tUm0pSUlE JwiISlAkQ4bp7hmLOau+6IR0wt26cuU1Elc2bTS0CG0ogawj6f4s2yzDZNu5ydpKslHS703WdJqt Hj0kaKujZpZoavGGGGrGW+yk6cKt2bhduu0k0TUu2ZssksyrNs3aOXCjNNVu3TauaNE7ML8rE00c o3cuZrp7MMnnnarnnNnsB9J6DnRM4vSRodIj1PwIZk5BHKUI8lzJUEZ3kJAvLuu7dfbdnld5AM3W FN1k668F3DEJhISGgmSZdEJ2i3I94UIs2myH3Z9NzJjFzs0zv1dp42nnwzB1kADd+Ty9E5zOUrHy sespKALmkC0FmYaLOjAMhfcQFnTIyOYZ/jRHotF8tSH5KxPXt8EQViGRomsyHm43k0UQXFCHvRLa 4Io0jis7gXCQLRj9EftX1hzGp3KO5R8WlOdonHsoir3Pss7RWF0ZNxCMsrkMrl2r77fTz6a76I+V IYxEJJozzyUj8ZRMQiUDiWi6EzhhOEfV8vSSPoj0q+jqhJNjeVPjUV+KZ7srEOM0VSzgAmUEJQg2 Amt2HMQm0JJQ0FAnEWbJl0SNUkXZJvbqZE15xDVJGsiqgMBKxdb2X0kjIOtrL2EayrCCA0QhEY2J GUjrcdI0kILWxy5RU2JypCFCKdFqe5iRUwKNa9bXuOMSKUzHniu+L5zxlim96bxGZm2cLuUn0Gir yOPTSRtlK0Vq45oSgMpRkhFk0Ioi7hWweZw0AzERXk5LQywNBM+KtNJdUNhnLCyLVC6N3w1SXZtX S6NY2lKJSZYpZRDmIM0LqEIgk+CERpdlEIickeOYy44N2a2BvEPSzVBk7XViFIXkTlGT+qPoj04X 3TfLdsw5fRZ6fsRx8EnS8msTaTibzI04PC7ZClzQK5fBy5aItd8NN9XbKyVnCZhpXlOpofRJqm4d LF2U5TnRZOghHpYJ7J7qWlNZjFmWaIj9a3fSPjNJnXDxRN4wzyJS9IhkhpQ9LpqLs/E3ts1VeKL5 xLn2HVVWpSaGkQiHaayTbZJVhV2yZPTuLOyjGtWfTh0/PxVJoZDONkonLR4iIzUVoIo7Uws3ab2q 0knMwlR6TSSfbHyM0kavR8vTh+58pUUenZDkiQhGz5VSo8e3pRZRV8tlnBoszaJKuOWaSjhq4ZLM PbJqsqzYOUmbVsybs0mTlrms0ZLuGqqbJRTNpy34XZN2uVXNEv4UcP2Ltu91nBwu/LL0IRtv0zcp Rqq3MMlG67dqw2RGOQ3RWEQd/0P76kQfsQ6d05eLWntkihx7gIZoym3bTY7PJIwQgoAJh2GhM10o iEwrfM90BqYgaI1+nIjHd5HyUtI+iZokYvhSkD55dD7ynYcTwaskMzhJK0rNIOi3QQEuy1KgFUK6 yghutKCo6B00YiCsiEQTfsXY+6ZikPpJk2e9dlE7uUoRBSUIUnP7uU4ySQMl+os6YXTSXRcJIwtx yVFCNDQQRxL9lvHjVei3AFgFAGqUWSQrz0pCe7VZVIKxumhRTZw0WUWdunTeKttYunwJilVMMCN3 an2SRdEIzRrYmVFYhEJOFFbTS0SNJ8ySGZsSqF2NtC4jtmrs1REig5Zt5NW9OGjvJObdo3aJMnbd w6fx/zvM5Q62pLrRDx1hL9M3xT2vjGSKIj4evWzTFntLd6Zto943bxSl4iMkT4GidEQjmM2qqqM4 m5101sL8fuurDtN21T1Y0TVsNM3yr1ouaJHymv5s5SSWSauXEaS0SiSyQo7a0iEQo2Umu9s2rNVh Jntq9NBswlH0P4Rr2SPXJ6LzSeJpnyyomx153TlVkk2SaxJtBjZlPTNO0QiGnuERG7LDLddvsw9s uFYRET+qIqxomqZKKNUn3waxBnCERnOTNOfyososw+rls+VFazWeLv86T19dXw5cOIw3b6pN0uXD RZ2+DZd2z4ZE03CbC8mW67xk2YowuowsukmUXYWfzyVdJqtlGrZk2MZNlRosyNmqzXhdduszVcfn iEVGxd3u5gjMAXFm0K2EzDNhuB7Z3utg9hmCGPXTsewdxLg5cHwIrKNrxKfhRyuYX4d+Li4pequB FVsvxFkybQyzCWT4hUXL+GHI36eLNy5AHghwIwiQkJCSESAZAN+ZJiQxs6isqJXy4lkzOc+ks6vz sRER1Vh+OTOEH0SySjM2/BKiEUWaKpLLacS249rENpMShv419uq2Rj3r3npk1XmyUdbqwNXbgO0m HTZ0z0ad2qvvDVo5ZLxFhVocbLIT0lVSERGrfOyU1V2TBs0WYpRO0xFdKMmrRwo/Bdyqm69SxSUJ yVZPV3LZhzvpN1zG0atw1Ui7RPTVusoFdoznRhHa27OUSdtjVeYmtuzsjjbRZl69OMmrdsscMOtG TBhxJvKV6db9RCIYEItEJU5/Hly5a5ZZTZdu3K9GqyvaSbJR6Zd2nPZKSXFKTST4SbOhNq5mlVpu Zs3CrPzZ3ROMt9h3Ob1NpdlEO0mGbxazJ5msksxBaUSkcwiDqTQ74y3UuyVeOjEk/HaqrtyojKIL klFnbsmqmzaumHjCfLR2o0ZLmGGbhGvLGbrulDtkU/E2T9duVWTZJJ9UKMmr+yjC66/tdJ4yduut mhb39Rm6aM3bxNI4dKrMOlXLb3Z+cK/l/KPaP2jHRWopzUOWaprCBmlAug566BTpdk9cZClfSwOH tz385V9dXCYDDcloWLJ24iWYweJKhBBfiCDl+7mbzbR2O0V1GRkmwNVqqzGhcuZuyudiN5Phgo8m KN6ec0MeGJNGOeJNG5MW9QgWwZkqUL2JyEL8CgoIU5D8qK5Lsk6TPqk4ZEIj5YdrNHKajX+cNmnN UjzMp+P48vaSwhHckIiG7dbvqtJ+Js2utnMdsaOmedXjZuYeJroD1+bHkIiOWjtmo6m843RFa8Sq XSTmkjhNrm/NhywyctF5q3VzcMGbh63Se2mg2VnENWajTzz8kdvi7R48Wbm6x4kEokl36rysnTtX +kk23xmad98ODR6cOmyzx+XXyjdKUpF9MPdkRRhyPlST4Uk/m6m021Ok1llGj265xzRnERINJKwz Zr5v0PT373nPl4qfeIRDg7dx30TN5+ZXiNVOX1fSr5aKutp68yae7JT9t1mjpkh0dSiNM8fEp7dr sskqKtmHWyXPk3LiUtntq2av8MsSO0irWKpOeU2TZxqlu3ndN4k1aLXVdrLJI+mCKxBDJHtEQjZ7 TcuXL0kk3dKKrPd1nKkctWteF6OFGEs11lmy7dhde2aidNTDVZZNq7SYbLuWzRhrRyw0VauEl2bv 3kws0bJucOZvnSay3TN+GcLvFbvSrDVm6zcMrsNllpIUFA8zl1rM85ERSYgb0JLpM8NAkukA5B6R jR/Z75+FvZPT0fTZCQqsh19AfYJkdZXz7qt5EyGjTEttfBAuayT+45U4hyFEGZPNvh1ZoZFN3BPn V2XxVZt+GLDwx3nw549efwjN5M4WIFBXqWoNCwtwLBxV5tpgXCXUKirKVpqjKIiqiDhBn9pocMmT DYvJGmYynZznOmNNN2spmsR6WTTfgm2RCLGrM0bM8M/yWbaIkiUltJXc85tH4sNxbpy3arsiSTRV rw/nEGHaj5cLrNnrjx43rOUohPq3KLKC26Terezxdlk0Wooktw1des3LRny+3xXBzKUoSSv8TUTa MaJMfDulPE+VLqsjXpNJecaKbIISLIEjCwsNJsMC8po12HaJb7x0iI9I3byYf10ZukzJtf1hLxkn a3Lpso5VYSbYwo6iNjMl1VCNmizDLCk4laqjZV6DTaquG+cRtVTVs3488XdfC0/3nTl6fR8tVvhu 8PHknpJ1HlJ9qCb27U2T1VV9eZskmS2zbaDbL3xnRKvT1rKqTNPffxbpWupqs6SmznJNdSbZ6Zpq JqrPGF1nomqaLu1FmqiS7xqs1atU3OSartk1NGbRzw4UZteP2rNXSz0qmw6Vd9KjespdbrKE8MNH bJOzNVsrdpV673YOGqZSVjyokHlZ1hvrPRaFATJFAuXVxxtSXUBvQkmPQc0IhfmGFV1F7ZDnadxm gSNnxc6SM6fKM/KPl5WsveilQ52iY5bdVZbycjKzl7tmd6RSuUr0pPPK0sF2yvvbX8bfxEaREZxA RKBdqgTwUTgoWJW22TxAQnlQ+G4YkArQRDc280TayQzXWSZsg/TRJRk9Ol3GGm85JSbaS9d68/pZ D4ZN2jly3Sw/NH3Ig45yxtGHb2o4fmpL0yWJo/cfKzt6bKP2hxSNZekoxCOHjlR07ZYaPj4yww5f MDS/CWFE6Sl9N/2ok5SxHwo1x21+Xpf32mw3+G75RVk6Zd121SXeJMMkRGnurqTR8Vu5XywT9cSn 8UlOcc441ceRdy0PbNmyXNlmrDVKTufjUulhdJR69cPbp48VdqPSiW7iHO/fpk0XqrPVJxiVWDVV 04UTb7yjGzZn5Obhdhx6VeptV03Kq6btqr8ZfCLxEQjsP9nG8rs3B6fJy1XXbvaiyaqiaTVrKXj1 GGRZhnDtdozc+mEaKWZtD8IQom3XZvwspCIhZJVq6cu27NwvejRufua56tJ5P4sPGarNRnz1v6wl PNwzVXScKrJukk32/CjZy9s2zls6jbzAWUiEdOsEaQELMhHHAkrXFGWqzF0W4Ppp9u+zt77LnlF4 2ZDKTDSuJF3Si8WK+3ehtig6+tx5MMdWPfPDF1RwTMgPBgiq7pq+ratFtVFGrNtCHyo5KsN9u/tb mGxEEs0XXccVtlG6Eht6UpCGysQiGy7l0s5VcLXcq7RhZOntH2+11d27r00vq/eLR6dJ/vz86l3O kJ7Y2uZLKOVEnjxu6ZijT1o+EmNeFON9fiilM6+VqnS6aybR7d40sHjibW7Vq9HTlZ21dN5Ja41j SrVuyOqMtFX7B08XvtLm7SOXT0/d6ZOHSzz3Vuxk9M9aMnWyTNs8JqNtrueXpMlzGOPXq6c27GO3 tftwypo5Sd5uSrLXjVVtm5cReTpqxq4drKyVaJO3XjVxhwk/X96KkIirdsze3LLlm9N2hM3e3C8U VdKNVUmGvbDRdM9e6ulmytWbdZjdw6eJN2iqbDNNkqX0TZ9YVbtHTt23ck38qGTlVRe/WWS6eTI6 arChaZnMZzMQ0lZnMo+AHSr3qKRRTtBc3Je4REbjgV+53Fo6nt5h+Gmsps88rROtFPq9dvJZmTUd mCu7KT8wVSRYQ3owXFpCjPKtLSlPC5bL180nnr8bXjEIeKBqKFacya868/K8Tafy1Pt9soj7SukO Wj0kk5vN26ZJ3ZrLOUR6jTP5rwrSnw9JlktvNNPNq1vfqiZNaZPJqYYZFdUm6rhxCtJVlo12b6Cq IwzQssr+39otEIhms2zXevebiRKJJRhOMnhOjNq6a8xDKSbl6eMRzmks9TwmwsaGHCDSfI6dBEm0 SaaYeengwwdzgbLTcJxOT3Wai7Voom5bL8M54u3ZqZcJX4KFmkcpNrOVWTDMw2Z35S/Z25ayql3R vxM4eedvTpZ07dsNVVHpJmm/RFu9ZJaydPE3PPV+XTvho6SxW/tu9UWar5OdkpSvt7k552YcuUnT N7bOXtNdvN0yWRX+CLfmjRs3bFktmr2ye2zJNm77rdSlPb0+UlC1pSwyXZJt1F3pu8kzbtvGS3S7 Jkq1aLsmjRs6uum6NTDJJNu1IgzZM2GklXblmzwlH4jpsum5cNlk0mjVhvH7kfohxYBuESd0h4HI OkoKpSYHaK6sJHOue7bIhw9h0roRHvjayVrY7zKUEzsTDs9vTeduTYQEQnnam6MVzkz0Pb8EL3AY DMHW8hPsyx7yD0ehmPolEIhVy5UjNsnBky3bPw/DhsxtqRHblNvjps1cLZ9Js13SIjnndsk1WcNX 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 I/h1A3x8W9v/xdyRThQkLtsxHIA=