# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: kinkie@squid-cache.org-20120918142358-xpf8toe2rnr7nm36 # target_branch: ../trunk/ # testament_sha1: 3a929eceaada48c3f8451ac7a8832700a6e48388 # timestamp: 2012-09-18 16:32:18 +0200 # base_revision_id: kinkie@squid-cache.org-20120913113930-\ # cyu8k2mwqhyfy55e # # Begin patch === modified file 'src/AccessLogEntry.cc' --- src/AccessLogEntry.cc 2012-08-28 13:00:30 +0000 +++ src/AccessLogEntry.cc 2012-09-04 09:10:20 +0000 @@ -2,6 +2,7 @@ #include "AccessLogEntry.h" #include "HttpReply.h" #include "HttpRequest.h" +#include "SquidConfig.h" #include "ssl/support.h" #if USE_SSL === modified file 'src/AccessLogEntry.h' --- src/AccessLogEntry.h 2012-08-28 13:00:30 +0000 +++ src/AccessLogEntry.h 2012-09-18 14:06:31 +0000 @@ -35,6 +35,7 @@ #include "HttpVersion.h" #include "HttpRequestMethod.h" #include "HierarchyLogEntry.h" +#include "icp_opcode.h" #include "ip/Address.h" #include "HttpRequestMethod.h" #if ICAP_CLIENT @@ -48,6 +49,7 @@ /* forward decls */ class HttpReply; class HttpRequest; +class CustomLog; class AccessLogEntry: public RefCountable { @@ -274,7 +276,7 @@ class StoreEntry; /* Should be in 'AccessLog.h' as the driver */ -extern void accessLogLogTo(customlog* log, AccessLogEntry::Pointer &al, ACLChecklist* checklist = NULL); +extern void accessLogLogTo(CustomLog* log, AccessLogEntry::Pointer &al, ACLChecklist* checklist = NULL); extern void accessLogLog(AccessLogEntry::Pointer &, ACLChecklist * checklist); extern void accessLogRotate(void); extern void accessLogClose(void); === modified file 'src/AuthReg.h' --- src/AuthReg.h 2012-08-31 16:28:10 +0000 +++ src/AuthReg.h 2012-09-17 13:31:37 +0000 @@ -1,8 +1,7 @@ #ifndef SQUID_AUTHREG_H_ #define SQUID_AUTHREG_H_ /* - * DEBUG: section - * AUTHOR: + * DEBUG: section 29 Authenticator * * SQUID Web Proxy Cache http://www.squid-cache.org/ * ---------------------------------------------------------- === modified file 'src/CacheDigest.h' --- src/CacheDigest.h 2012-08-29 00:12:28 +0000 +++ src/CacheDigest.h 2012-09-18 12:54:44 +0000 @@ -1,3 +1,5 @@ +#ifndef SQUID_CACHEDIGEST_H_ +#define SQUID_CACHEDIGEST_H_ /* * DEBUG: section 70 Cache Digest * AUTHOR: Alex Rousskov @@ -30,13 +32,24 @@ * */ -#ifndef SQUID_CACHEDIGEST_H_ -#define SQUID_CACHEDIGEST_H_ - +/* for cache_key */ #include "typedefs.h" + class CacheDigestGuessStats; class StoreEntry; +class CacheDigest +{ +public: + /* public, read-only */ + char *mask; /* bit mask */ + int mask_size; /* mask size in bytes */ + int capacity; /* expected maximum for .count, not a hard limit */ + int bits_per_entry; /* number of bits allocated for each entry from capacity */ + int count; /* number of digested entries */ + int del_count; /* number of deletions performed so far */ +}; + extern CacheDigest *cacheDigestCreate(int capacity, int bpe); extern void cacheDigestDestroy(CacheDigest * cd); extern CacheDigest *cacheDigestClone(const CacheDigest * cd); === modified file 'src/CacheManager.h' --- src/CacheManager.h 2012-09-01 14:38:36 +0000 +++ src/CacheManager.h 2012-09-18 14:06:31 +0000 @@ -48,6 +48,9 @@ */ class HttpRequest; +namespace Mgr { +class ActionPasswordList; +} //namespace Mgr /** \ingroup CacheManagerAPI * a CacheManager - the menu system for interacting with squid. @@ -83,7 +86,7 @@ Mgr::CommandPointer ParseUrl(const char *url); void ParseHeaders(const HttpRequest * request, Mgr::ActionParams ¶ms); int CheckPassword(const Mgr::Command &cmd); - char *PasswdGet(cachemgr_passwd *, const char *); + char *PasswdGet(Mgr::ActionPasswordList *, const char *); void registerProfile(const Mgr::ActionProfilePointer &profile); === added file 'src/CachePeer.h' --- src/CachePeer.h 1970-01-01 00:00:00 +0000 +++ src/CachePeer.h 2012-09-18 12:54:44 +0000 @@ -0,0 +1,207 @@ +#ifndef SQUID_CACHEPEER_H_ +#define SQUID_CACHEPEER_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "enums.h" +#include "icp_opcode.h" +#include "ip/Address.h" + +#if USE_SSL +#include +#endif + +class domain_ping; +class domain_type; +class acl_access; +class PeerDigest; + +class CachePeer +{ +public: + u_int index; + char *name; + char *host; + peer_t type; + + Ip::Address in_addr; + + struct { + int pings_sent; + int pings_acked; + int fetches; + int rtt; + int ignored_replies; + int n_keepalives_sent; + int n_keepalives_recv; + time_t probe_start; + time_t last_query; + time_t last_reply; + time_t last_connect_failure; + time_t last_connect_probe; + int logged_state; /* so we can print dead/revived msgs */ + int conn_open; /* current opened connections */ + } stats; + + struct { + int version; + int counts[ICP_END+1]; + unsigned short port; + } icp; + +#if USE_HTCP + struct { + double version; + int counts[2]; + unsigned short port; + } htcp; +#endif + + unsigned short http_port; + domain_ping *peer_domain; + domain_type *typelist; + acl_access *access; + + struct { + unsigned int proxy_only:1; + unsigned int no_query:1; + unsigned int background_ping:1; + unsigned int no_digest:1; + unsigned int default_parent:1; + unsigned int roundrobin:1; + unsigned int weighted_roundrobin:1; + unsigned int mcast_responder:1; + unsigned int closest_only:1; +#if USE_HTCP + unsigned int htcp:1; + unsigned int htcp_oldsquid:1; + unsigned int htcp_no_clr:1; + unsigned int htcp_no_purge_clr:1; + unsigned int htcp_only_clr:1; + unsigned int htcp_forward_clr:1; +#endif + unsigned int no_netdb_exchange:1; +#if USE_DELAY_POOLS + unsigned int no_delay:1; +#endif + unsigned int allow_miss:1; + unsigned int carp:1; + struct { + unsigned int set:1; //If false, whole url is to be used. Overrides others + unsigned int scheme:1; + unsigned int host:1; + unsigned int port:1; + unsigned int path:1; + unsigned int params:1; + } carp_key; +#if USE_AUTH + unsigned int userhash:1; +#endif + unsigned int sourcehash:1; + unsigned int originserver:1; + unsigned int no_tproxy:1; +#if PEER_MULTICAST_SIBLINGS + unsigned int mcast_siblings:1; +#endif + } options; + + int weight; + int basetime; + + struct { + double avg_n_members; + int n_times_counted; + int n_replies_expected; + int ttl; + int id; + + struct { + unsigned int count_event_pending:1; + unsigned int counting:1; + } flags; + } mcast; +#if USE_CACHE_DIGESTS + + PeerDigest *digest; + char *digest_url; +#endif + + int tcp_up; /* 0 if a connect() fails */ + + Ip::Address addresses[10]; + int n_addresses; + int rr_count; + CachePeer *next; + int testing_now; + + struct { + unsigned int hash; + double load_multiplier; + double load_factor; /* normalized weight value */ + } carp; +#if USE_AUTH + struct { + unsigned int hash; + double load_multiplier; + double load_factor; /* normalized weight value */ + } userhash; +#endif + struct { + unsigned int hash; + double load_multiplier; + double load_factor; /* normalized weight value */ + } sourcehash; + + char *login; /* Proxy authorization */ + time_t connect_timeout; + int connect_fail_limit; + int max_conn; + char *domain; /* Forced domain */ +#if USE_SSL + + int use_ssl; + char *sslcert; + char *sslkey; + int sslversion; + char *ssloptions; + char *sslcipher; + char *sslcafile; + char *sslcapath; + char *sslcrlfile; + char *sslflags; + char *ssldomain; + SSL_CTX *sslContext; + SSL_SESSION *sslSession; +#endif + + int front_end_https; + int connection_auth; +}; + +#endif /* SQUID_CACHEPEER_H_ */ === modified file 'src/ConfigParser.cc' --- src/ConfigParser.cc 2012-09-01 14:38:36 +0000 +++ src/ConfigParser.cc 2012-09-17 15:12:01 +0000 @@ -35,6 +35,7 @@ #include "cache_cf.h" #include "ConfigParser.h" #include "Debug.h" +#include "fatal.h" #include "globals.h" void === modified file 'src/CpuAffinity.cc' --- src/CpuAffinity.cc 2012-08-31 16:57:39 +0000 +++ src/CpuAffinity.cc 2012-09-04 09:10:20 +0000 @@ -9,6 +9,7 @@ #include "CpuAffinitySet.h" #include "Debug.h" #include "globals.h" +#include "SquidConfig.h" #include "structs.h" #include "tools.h" === modified file 'src/DelayBucket.cc' --- src/DelayBucket.cc 2012-09-01 14:38:36 +0000 +++ src/DelayBucket.cc 2012-09-04 09:10:20 +0000 @@ -39,6 +39,7 @@ #if USE_DELAY_POOLS #include "DelayBucket.h" #include "DelaySpec.h" +#include "SquidConfig.h" #include "Store.h" void === modified file 'src/DelayId.cc' --- src/DelayId.cc 2012-09-01 14:38:36 +0000 +++ src/DelayId.cc 2012-09-04 09:10:20 +0000 @@ -48,6 +48,7 @@ #include "DelayPool.h" #include "DelayPools.h" #include "HttpRequest.h" +#include "SquidConfig.h" DelayId::DelayId () : pool_ (0), compositeId(NULL), markedAsNoDelay(false) {} === modified file 'src/DiskIO/DiskDaemon/DiskdIOStrategy.cc' --- src/DiskIO/DiskDaemon/DiskdIOStrategy.cc 2012-08-31 16:57:39 +0000 +++ src/DiskIO/DiskDaemon/DiskdIOStrategy.cc 2012-09-04 09:10:20 +0000 @@ -41,6 +41,7 @@ #include "fd.h" #include "Store.h" #include "StatCounters.h" +#include "SquidConfig.h" #include "SquidIpc.h" #include "SquidTime.h" #include "unlinkd.h" === modified file 'src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc' --- src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc 2012-09-01 14:38:36 +0000 +++ src/DiskIO/DiskThreads/DiskThreadsIOStrategy.cc 2012-09-04 09:10:20 +0000 @@ -38,8 +38,8 @@ #include "DiskThreadsIOStrategy.h" #include "fde.h" #include "mgr/Registration.h" +#include "SquidConfig.h" #include "StatCounters.h" -/* for statfs */ #include "Store.h" void === modified file 'src/DiskIO/DiskThreads/aiops.cc' --- src/DiskIO/DiskThreads/aiops.cc 2012-09-01 14:38:36 +0000 +++ src/DiskIO/DiskThreads/aiops.cc 2012-09-04 09:10:20 +0000 @@ -36,16 +36,17 @@ #include "squid.h" #include "DiskThreads.h" +#include "SquidConfig.h" -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include #if HAVE_SCHED_H -#include +#include #endif #include "DiskIO/DiskThreads/CommIO.h" #include "SquidTime.h" === modified file 'src/DiskIO/DiskThreads/aiops_win32.cc' --- src/DiskIO/DiskThreads/aiops_win32.cc 2012-09-01 14:38:36 +0000 +++ src/DiskIO/DiskThreads/aiops_win32.cc 2012-09-04 09:10:20 +0000 @@ -36,15 +36,16 @@ #include "squid_windows.h" #include "DiskIO/DiskThreads/CommIO.h" #include "DiskThreads.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include #define RIDICULOUS_LENGTH 4096 === modified file 'src/DiskIO/IpcIo/IpcIoFile.cc' --- src/DiskIO/IpcIo/IpcIoFile.cc 2012-09-01 14:38:36 +0000 +++ src/DiskIO/IpcIo/IpcIoFile.cc 2012-09-04 09:10:20 +0000 @@ -18,6 +18,7 @@ #include "ipc/Queue.h" #include "ipc/StrandSearch.h" #include "ipc/UdsOp.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "tools.h" === modified file 'src/ExternalACL.h' --- src/ExternalACL.h 2012-09-01 14:38:36 +0000 +++ src/ExternalACL.h 2012-09-18 14:06:31 +0000 @@ -34,6 +34,8 @@ #include "acl/Checklist.h" +class external_acl; + /** \todo CLEANUP: kill this typedef. */ typedef struct _external_acl_data external_acl_data; === modified file 'src/ExternalACLEntry.h' --- src/ExternalACLEntry.h 2012-09-01 14:38:36 +0000 +++ src/ExternalACLEntry.h 2012-09-18 14:06:31 +0000 @@ -45,6 +45,7 @@ #include "acl/Acl.h" #include "cbdata.h" +class external_acl; /****************************************************************** * ExternalACLEntryData * Core data that ExternalACLEntry manages. === modified file 'src/HttpHdrCc.cc' --- src/HttpHdrCc.cc 2012-08-31 16:57:39 +0000 +++ src/HttpHdrCc.cc 2012-09-04 11:58:36 +0000 @@ -33,6 +33,7 @@ #include "squid.h" #include "base/StringArea.h" #include "HttpHeader.h" +#include "HttpHeaderFieldStat.h" #include "HttpHeaderStat.h" #include "HttpHeaderTools.h" #include "HttpHdrCc.h" === modified file 'src/HttpHdrSc.cc' --- src/HttpHdrSc.cc 2012-09-01 14:38:36 +0000 +++ src/HttpHdrSc.cc 2012-09-04 13:09:04 +0000 @@ -37,6 +37,8 @@ #include "squid.h" #include "HttpHdrSc.h" #include "HttpHeader.h" +#include "HttpHeaderFieldInfo.h" +#include "HttpHeaderFieldStat.h" #include "HttpHeaderStat.h" #include "HttpHeaderTools.h" #include "Store.h" @@ -64,6 +66,7 @@ {"Other,", (http_hdr_type)SC_OTHER} /* ',' will protect from matches */ }; +class HttpHeaderFieldInfo; HttpHeaderFieldInfo *ScFieldsInfo = NULL; http_hdr_sc_type &operator++ (http_hdr_sc_type &aHeader) === modified file 'src/HttpHeader.cc' --- src/HttpHeader.cc 2012-08-31 16:57:39 +0000 +++ src/HttpHeader.cc 2012-09-04 13:09:04 +0000 @@ -36,6 +36,7 @@ #include "HttpHdrContRange.h" #include "HttpHdrSc.h" #include "HttpHeader.h" +#include "HttpHeaderFieldInfo.h" #include "HttpHeaderStat.h" #include "HttpHeaderTools.h" #include "MemBuf.h" @@ -45,6 +46,7 @@ #include "StatHist.h" #include "Store.h" #include "StrList.h" +#include "SquidConfig.h" #include "SquidString.h" #include "TimeOrTag.h" @@ -161,6 +163,7 @@ {"Other:", HDR_OTHER, ftStr} /* ':' will not allow matches */ }; +class HttpHeaderFieldInfo; static HttpHeaderFieldInfo *Headers = NULL; http_hdr_type &operator++ (http_hdr_type &aHeader) === modified file 'src/HttpHeader.h' --- src/HttpHeader.h 2012-09-03 09:02:20 +0000 +++ src/HttpHeader.h 2012-09-18 12:54:44 +0000 @@ -178,7 +178,9 @@ hoEnd } http_hdr_owner_type; -struct _HttpHeaderFieldAttrs { +class HttpHeaderFieldAttrs +{ +public: const char *name; http_hdr_type id; field_type type; === added file 'src/HttpHeaderFieldInfo.h' --- src/HttpHeaderFieldInfo.h 1970-01-01 00:00:00 +0000 +++ src/HttpHeaderFieldInfo.h 2012-09-18 14:23:58 +0000 @@ -0,0 +1,47 @@ +#ifndef SQUID_HTTPHEADERFIELDINFO_H_ +#define SQUID_HTTPHEADERFIELDINFO_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "SquidString.h" +#include "HttpHeaderFieldStat.h" + +/* compiled version of HttpHeaderFieldAttrs plus stats */ +class HttpHeaderFieldInfo +{ +public: + HttpHeaderFieldInfo() : id(HDR_ACCEPT), type(ftInvalid) {} + + http_hdr_type id; + String name; + field_type type; + HttpHeaderFieldStat stat; +}; + +#endif /* SQUID_HTTPHEADERFIELDINFO_H_ */ === added file 'src/HttpHeaderFieldStat.h' --- src/HttpHeaderFieldStat.h 1970-01-01 00:00:00 +0000 +++ src/HttpHeaderFieldStat.h 2012-09-18 14:23:58 +0000 @@ -0,0 +1,45 @@ +#ifndef SQUID_HTTPHEADERFIELDSTAT_H_ +#define SQUID_HTTPHEADERFIELDSTAT_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +/// per field statistics +class HttpHeaderFieldStat +{ +public: + HttpHeaderFieldStat() : aliveCount(0), seenCount(0), parsCount(0), errCount(0), repCount(0) {} + + int aliveCount; /* created but not destroyed (count) */ + int seenCount; /* number of fields we've seen */ + int parsCount; /* number of parsing attempts */ + int errCount; /* number of pasring errors */ + int repCount; /* number of repetitons */ +}; + +#endif /* SQUID_HTTPHEADERFIELDSTAT_H_ */ === modified file 'src/HttpHeaderTools.cc' --- src/HttpHeaderTools.cc 2012-09-03 09:02:20 +0000 +++ src/HttpHeaderTools.cc 2012-09-09 19:41:47 +0000 @@ -40,9 +40,11 @@ #include "fde.h" #include "HttpHdrContRange.h" #include "HttpHeader.h" +#include "HttpHeaderFieldInfo.h" #include "HttpHeaderTools.h" #include "HttpRequest.h" #include "MemBuf.h" +#include "SquidConfig.h" #include "Store.h" #include "StrList.h" === modified file 'src/HttpHeaderTools.h' --- src/HttpHeaderTools.h 2012-09-03 09:02:20 +0000 +++ src/HttpHeaderTools.h 2012-09-18 14:23:58 +0000 @@ -19,11 +19,12 @@ typedef std::list HeaderWithAclList; class acl_access; -struct _header_mangler { +class header_mangler +{ +public: acl_access *access_list; char *replacement; }; -typedef struct _header_mangler header_mangler; class StoreEntry; @@ -94,10 +95,10 @@ extern int httpHeaderParseOffset(const char *start, int64_t * off); +class HttpHeader; class HttpHeaderFieldInfo; +class HttpRequest; class String; -class HttpHeader; -class HttpRequest; extern HttpHeaderFieldInfo *httpHeaderBuildFieldsInfo(const HttpHeaderFieldAttrs * attrs, int count); extern void httpHeaderDestroyFieldsInfo(HttpHeaderFieldInfo * info, int count); === modified file 'src/HttpMsg.cc' --- src/HttpMsg.cc 2012-09-01 14:38:36 +0000 +++ src/HttpMsg.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "MemBuf.h" #include "mime_header.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" HttpMsg::HttpMsg(http_hdr_owner_type owner): header(owner), cache_control(NULL), hdr_sz(0), content_length(0), protocol(AnyP::PROTO_NONE), === modified file 'src/HttpParser.cc' --- src/HttpParser.cc 2012-08-28 13:00:30 +0000 +++ src/HttpParser.cc 2012-09-04 09:10:20 +0000 @@ -1,8 +1,9 @@ #include "squid.h" #include "Debug.h" #include "HttpParser.h" +#include "profiler/Profiler.h" +#include "SquidConfig.h" #include "structs.h" -#include "profiler/Profiler.h" void HttpParser::clear() === modified file 'src/HttpReply.cc' --- src/HttpReply.cc 2012-09-01 14:38:36 +0000 +++ src/HttpReply.cc 2012-09-04 09:10:20 +0000 @@ -41,6 +41,7 @@ #include "HttpReply.h" #include "HttpRequest.h" #include "MemBuf.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "StrList.h" === modified file 'src/HttpRequest.cc' --- src/HttpRequest.cc 2012-08-31 16:57:39 +0000 +++ src/HttpRequest.cc 2012-09-13 16:20:41 +0000 @@ -45,6 +45,7 @@ #include "HttpRequest.h" #include "log/Config.h" #include "MemBuf.h" +#include "SquidConfig.h" #include "Store.h" #include "URL.h" @@ -419,27 +420,6 @@ range = header.getRange(); } -/* request_flags */ -bool -request_flags::resetTCP() const -{ - return reset_tcp != 0; -} - -void -request_flags::setResetTCP() -{ - debugs(73, 9, "request_flags::setResetTCP"); - reset_tcp = 1; -} - -void -request_flags::clearResetTCP() -{ - debugs(73, 9, "request_flags::clearResetTCP"); - reset_tcp = 0; -} - #if ICAP_CLIENT Adaptation::Icap::History::Pointer HttpRequest::icapHistory() const @@ -492,27 +472,6 @@ return (range && range->specs.count > 1); } -void -request_flags::destinationIPLookupCompleted() -{ - destinationIPLookedUp_ = true; -} - -bool -request_flags::destinationIPLookedUp() const -{ - return destinationIPLookedUp_; -} - -request_flags -request_flags::cloneAdaptationImmune() const -{ - // At the time of writing, all flags where either safe to copy after - // adaptation or were not set at the time of the adaptation. If there - // are flags that are different, they should be cleared in the clone. - return *this; -} - bool HttpRequest::bodyNibbled() const { @@ -622,7 +581,7 @@ // Because it failed verification, or someone bypassed the security tests // we cannot cache the reponse for sharing between clients. // TODO: update cache to store for particular clients only (going to same Host: and destination IP) - if (!flags.hostVerified && (flags.intercepted || flags.spoof_client_ip)) + if (!flags.hostVerified() && (flags.intercepted() || flags.spoofClientIp())) return false; if (protocol == AnyP::PROTO_HTTP) @@ -652,7 +611,7 @@ bool HttpRequest::conditional() const { - return flags.ims || + return flags.hasIMS() || header.has(HDR_IF_MATCH) || header.has(HDR_IF_NONE_MATCH); } === modified file 'src/HttpRequest.h' --- src/HttpRequest.h 2012-09-01 14:38:36 +0000 +++ src/HttpRequest.h 2012-09-14 11:35:12 +0000 @@ -33,9 +33,11 @@ #include "base/CbcPointer.h" #include "Debug.h" +#include "err_type.h" #include "HierarchyLogEntry.h" #include "HttpMsg.h" #include "HttpRequestMethod.h" +#include "RequestFlags.h" #if USE_AUTH #include "auth/UserRequest.h" @@ -161,7 +163,7 @@ char *canonical; - request_flags flags; + RequestFlags flags; HttpHdrRange *range; === modified file 'src/HttpRequestMethod.h' --- src/HttpRequestMethod.h 2012-09-01 14:38:36 +0000 +++ src/HttpRequestMethod.h 2012-09-04 09:10:20 +0000 @@ -34,6 +34,8 @@ #include "SquidString.h" #include "structs.h" +class SquidConfig; + #include enum _method_t { === modified file 'src/ICP.h' --- src/ICP.h 2012-09-01 14:38:36 +0000 +++ src/ICP.h 2012-09-18 12:37:07 +0000 @@ -76,6 +76,7 @@ icp_opcode getOpCode() const; #endif }; +typedef struct _icp_common_t icp_common_t; #ifdef __cplusplus === added file 'src/IoStats.h' --- src/IoStats.h 1970-01-01 00:00:00 +0000 +++ src/IoStats.h 2012-09-18 12:54:44 +0000 @@ -0,0 +1,48 @@ +#ifndef SQUID_IOSTATS_H_ +#define SQUID_IOSTATS_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +class IoStats +{ +public: + static const int histSize=16; + + struct { + int reads; + int reads_deferred; + int read_hist[histSize]; + int writes; + int write_hist[histSize]; + } + + Http, Ftp, Gopher; +}; + +#endif /* SQUID_IOSTATS_H_ */ === modified file 'src/Makefile.am' --- src/Makefile.am 2012-09-01 14:24:50 +0000 +++ src/Makefile.am 2012-09-18 14:06:31 +0000 @@ -258,6 +258,7 @@ CommCalls.h \ DescriptorSet.cc \ DescriptorSet.h \ + SquidConfig.h \ SquidConfig.cc squid_SOURCES = \ @@ -268,10 +269,14 @@ AsyncEngine.h \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ cache_cf.cc \ CacheDigest.h \ CacheDigest.cc \ cache_manager.cc \ + CachePeer.h \ CacheManager.h \ carp.h \ carp.cc \ @@ -362,6 +367,7 @@ HttpStatusCode.h \ HttpStatusLine.cc \ HttpStatusLine.h \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -377,6 +383,7 @@ HttpHeader.cc \ HttpHeaderMask.h \ HttpHeaderRange.h \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpBody.h \ @@ -388,6 +395,8 @@ HttpParser.h \ HttpReply.cc \ HttpReply.h \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequest.h \ HttpRequestMethod.cc \ @@ -457,6 +466,7 @@ SquidMath.h \ SquidMath.cc \ SquidNew.cc \ + IoStats.h \ stat.h \ stat.cc \ StatCounters.h \ @@ -1106,6 +1116,7 @@ ETag.cc \ HttpBody.h \ HttpBody.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -1119,6 +1130,7 @@ HttpHeader.h \ HttpHeader.cc \ HttpHeaderMask.h \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpControlMsg.h \ @@ -1131,6 +1143,8 @@ HttpStatusLine.h \ Mem.h \ mem.cc \ + RegexList.h \ + RegexList.cc \ MemBuf.cc \ MemBuf.h \ mime_header.h \ @@ -1145,6 +1159,7 @@ log/access_log.h \ tests/stub_access_log.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ tests/stub_debug.cc \ @@ -1207,10 +1222,12 @@ HttpBody.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpHdrContRange.cc \ HttpHdrRange.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -1253,6 +1270,7 @@ log/access_log.h \ tests/stub_access_log.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_debug.cc \ tests/stub_DelayId.cc \ @@ -1349,6 +1367,8 @@ debug.cc \ HttpParser.cc \ HttpParser.h \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequestMethod.cc \ Mem.h \ @@ -1365,6 +1385,9 @@ cache_manager.cc \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ cache_cf.cc \ CacheDigest.h \ CacheDigest.cc \ @@ -1420,8 +1443,10 @@ HttpBody.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -1473,6 +1498,7 @@ $(SNMP_SOURCE) \ SquidMath.h \ SquidMath.cc \ + IoStats.h \ stat.h \ stat.cc \ StatCounters.h \ @@ -1593,6 +1619,7 @@ filemap.cc \ HttpBody.h \ HttpBody.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -1600,6 +1627,7 @@ HttpHdrSc.cc \ HttpHdrScTarget.cc \ HttpHdrRange.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpHeader.h \ @@ -1622,6 +1650,8 @@ refresh.h \ refresh.cc \ RemovalPolicy.cc \ + RequestFlags.h \ + RequestFlags.cc \ StatCounters.h \ StatCounters.cc \ StatHist.h \ @@ -1653,6 +1683,7 @@ tests/stub_access_log.cc \ tests/stub_acl.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ tests/stub_client_db.cc \ @@ -1748,6 +1779,9 @@ CacheDigest.cc \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ cache_cf.cc \ cache_manager.cc \ carp.h \ @@ -1806,8 +1840,10 @@ HttpBody.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -1819,6 +1855,8 @@ HttpParser.cc \ HttpParser.h \ HttpReply.cc \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequestMethod.cc \ HttpStatusLine.cc \ @@ -1867,6 +1905,7 @@ $(SNMP_SOURCE) \ SquidMath.cc \ SquidMath.h \ + IoStats.h \ stat.h \ stat.cc \ StatCounters.h \ @@ -1981,6 +2020,9 @@ cache_manager.cc \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ cache_cf.cc \ carp.h \ carp.cc \ @@ -2038,8 +2080,10 @@ HttpBody.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -2051,6 +2095,8 @@ HttpParser.cc \ HttpParser.h \ HttpReply.cc \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequestMethod.cc \ HttpStatusLine.cc \ @@ -2097,6 +2143,7 @@ $(SNMP_SOURCE) \ SquidMath.h \ SquidMath.cc \ + IoStats.h \ stat.h \ stat.cc \ StatCounters.h \ @@ -2209,6 +2256,9 @@ BodyPipe.cc \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ cache_cf.cc \ cache_manager.cc \ CacheDigest.h \ @@ -2265,6 +2315,7 @@ http.cc \ HttpBody.h \ HttpBody.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -2274,12 +2325,15 @@ HttpHdrScTarget.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpMsg.cc \ HttpParser.cc \ HttpParser.h \ HttpReply.cc \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequestMethod.cc \ HttpStatusLine.cc \ @@ -2326,6 +2380,7 @@ $(SNMP_SOURCE) \ SquidMath.h \ SquidMath.cc \ + IoStats.h \ stat.h \ stat.cc \ StatCounters.h \ @@ -2440,6 +2495,7 @@ String.cc \ structs.h \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ tests/stub_debug.cc \ @@ -2473,6 +2529,8 @@ $(ACL_REGISTRATION_SOURCES) \ HttpParser.cc \ HttpParser.h \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequestMethod.cc \ Mem.h \ @@ -2492,6 +2550,9 @@ cache_manager.cc \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ cache_cf.cc \ debug.cc \ CacheDigest.h \ @@ -2544,8 +2605,10 @@ HttpBody.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -2597,6 +2660,7 @@ $(SNMP_SOURCE) \ SquidMath.h \ SquidMath.cc \ + IoStats.h \ stat.h \ stat.cc \ StatCounters.h \ @@ -2712,6 +2776,7 @@ EventLoop.cc \ FileMap.h \ filemap.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -2719,12 +2784,15 @@ HttpHdrRange.cc \ HttpHdrSc.cc \ HttpHdrScTarget.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpHeader.h \ HttpHeader.cc \ HttpMsg.cc \ HttpRequestMethod.cc \ + RequestFlags.cc \ + RequestFlags.h \ int.h \ int.cc \ SquidList.h \ @@ -2769,6 +2837,7 @@ tests/stub_access_log.cc \ tests/stub_acl.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ tests/stub_client_side_request.cc \ @@ -2867,6 +2936,7 @@ tests/testString.cc \ tests/testString.h \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ tests/stub_debug.cc \ @@ -2943,6 +3013,8 @@ HttpStatusLine.cc \ int.h \ int.cc \ + RequestFlags.h \ + RequestFlags.cc \ SquidList.h \ SquidList.cc \ MemObject.cc \ @@ -2980,6 +3052,7 @@ SwapDir.cc \ tests/stub_acl.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_helper.cc \ cbdata.cc \ @@ -2991,6 +3064,7 @@ stmem.cc \ mime.h \ tests/stub_mime.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpHeader.h \ @@ -3001,6 +3075,7 @@ MemBuf.cc \ HttpHdrContRange.cc \ Packer.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -3090,6 +3165,7 @@ fd.cc \ FileMap.h \ filemap.cc \ + HttpHeaderFieldStat.h \ HttpBody.h \ HttpBody.cc \ HttpHdrCc.cc \ @@ -3099,6 +3175,7 @@ HttpHdrScTarget.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpMsg.cc \ @@ -3117,6 +3194,8 @@ Packer.cc \ Parsing.cc \ RemovalPolicy.cc \ + RequestFlags.cc \ + RequestFlags.h \ StatCounters.h \ StatCounters.cc \ StatHist.h \ @@ -3152,6 +3231,7 @@ log/access_log.h \ tests/stub_access_log.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ client_db.h \ @@ -3288,6 +3368,7 @@ SwapDir.cc \ tests/stub_acl.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_helper.cc \ cbdata.cc \ @@ -3298,6 +3379,7 @@ stmem.cc \ mime.h \ tests/stub_mime.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpHeader.h \ @@ -3308,6 +3390,7 @@ MemBuf.cc \ HttpHdrContRange.cc \ Packer.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -3439,6 +3522,7 @@ SwapDir.cc \ tests/stub_acl.cc \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_helper.cc \ cbdata.cc \ @@ -3451,6 +3535,7 @@ stmem.cc \ mime.h \ tests/stub_mime.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpHeader.h \ @@ -3461,6 +3546,7 @@ MemBuf.cc \ HttpHdrContRange.cc \ Packer.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -3530,6 +3616,9 @@ BodyPipe.cc \ cache_cf.h \ AuthReg.h \ + YesNoNone.h \ + YesNoNone.cc \ + RefreshPattern.h \ cache_cf.cc \ cache_manager.cc \ CacheDigest.h \ @@ -3585,6 +3674,7 @@ http.cc \ HttpBody.h \ HttpBody.cc \ + HttpHeaderFieldStat.h \ HttpHdrCc.h \ HttpHdrCc.cc \ HttpHdrCc.cci \ @@ -3594,12 +3684,15 @@ HttpHdrScTarget.cc \ HttpHeader.h \ HttpHeader.cc \ + HttpHeaderFieldInfo.h \ HttpHeaderTools.h \ HttpHeaderTools.cc \ HttpMsg.cc \ HttpParser.cc \ HttpParser.h \ HttpReply.cc \ + RequestFlags.h \ + RequestFlags.cc \ HttpRequest.cc \ HttpRequestMethod.cc \ HttpStatusLine.cc \ @@ -3646,6 +3739,7 @@ $(SNMP_SOURCE) \ SquidMath.h \ SquidMath.cc \ + IoStats.h \ stat.h \ stat.cc \ StatCounters.h \ @@ -3681,8 +3775,8 @@ StoreMetaVary.cc \ StoreSwapLogData.cc \ String.cc \ - StrList.h \ - StrList.cc \ + StrList.h \ + StrList.cc \ SwapDir.cc \ MemStore.cc \ tests/stub_debug.cc \ @@ -3765,6 +3859,7 @@ tests/testConfigParser.cc \ tests/testConfigParser.h \ cache_cf.h \ + YesNoNone.h \ tests/stub_cache_cf.cc \ tests/stub_cache_manager.cc \ tests/stub_debug.cc \ === modified file 'src/MemObject.cc' --- src/MemObject.cc 2012-09-01 14:38:36 +0000 +++ src/MemObject.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "MemBuf.h" #include "MemObject.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "Store.h" #include "StoreClient.h" === modified file 'src/MemStore.cc' --- src/MemStore.cc 2012-09-01 14:38:36 +0000 +++ src/MemStore.cc 2012-09-04 09:10:20 +0000 @@ -11,6 +11,7 @@ #include "MemObject.h" #include "MemStore.h" #include "mime_header.h" +#include "SquidConfig.h" #include "StoreStats.h" #include "tools.h" === modified file 'src/PeerDigest.h' --- src/PeerDigest.h 2012-09-01 14:38:36 +0000 +++ src/PeerDigest.h 2012-09-18 12:54:44 +0000 @@ -38,7 +38,9 @@ /* for CacheDigestGuessStats */ #include "StatCounters.h" -struct _Version { +class Version +{ +public: short int current; /* current version */ short int required; /* minimal version that can safely handle current version */ }; @@ -59,7 +61,9 @@ int reserved[32 - 6]; }; -struct _DigestFetchState { +class DigestFetchState +{ +public: PeerDigest *pd; StoreEntry *entry; StoreEntry *old_entry; @@ -90,7 +94,7 @@ void *operator new (size_t); void operator delete(void *); - struct peer *peer; /**< pointer back to peer structure, argh */ + CachePeer *peer; /**< pointer back to peer structure, argh */ CacheDigest *cd; /**< actual digest structure */ String host; /**< copy of peer->host */ const char *req_result; /**< text status of the last request */ @@ -129,7 +133,7 @@ extern const Version CacheDigestVer; -extern PeerDigest *peerDigestCreate(peer * p); +extern PeerDigest *peerDigestCreate(CachePeer * p); extern void peerDigestNeeded(PeerDigest * pd); extern void peerDigestNotePeerGone(PeerDigest * pd); extern void peerDigestStatsReport(const PeerDigest * pd, StoreEntry * e); === modified file 'src/PeerSelectState.h' --- src/PeerSelectState.h 2012-08-28 13:00:30 +0000 +++ src/PeerSelectState.h 2012-09-04 14:38:44 +0000 @@ -51,18 +51,18 @@ SQUIDCEXTERN void peerSelectInit(void); /** - * A peer which has been selected as a possible destination. + * A CachePeer which has been selected as a possible destination. * Listed as pointers here so as to prevent duplicates being added but will * be converted to a set of IP address path options before handing back out * to the caller. * * Certain connection flags and outgoing settings will also be looked up and - * set based on the received request and peer settings before handing back. + * set based on the received request and CachePeer settings before handing back. */ class FwdServer { public: - peer *_peer; /* NULL --> origin server */ + CachePeer *_peer; /* NULL --> origin server */ hier_code code; FwdServer *next; }; @@ -86,21 +86,21 @@ FwdServer *servers; ///< temporary linked list of peers we will pass back. /* - * Why are these Ip::Address instead of peer *? Because a - * peer structure can become invalid during the peer selection + * Why are these Ip::Address instead of CachePeer *? Because a + * CachePeer structure can become invalid during the CachePeer selection * phase, specifically after a reconfigure. Thus we need to lookup - * the peer * based on the address when we are finally ready to - * reference the peer structure. + * the CachePeer * based on the address when we are finally ready to + * reference the CachePeer structure. */ Ip::Address first_parent_miss; Ip::Address closest_parent_miss; /* - * ->hit can be peer* because it should only be + * ->hit can be CachePeer* because it should only be * accessed during the thread when it is set */ - peer *hit; + CachePeer *hit; peer_t hit_type; ping_data ping; ACLChecklist *acl_checklist; === added file 'src/RefreshPattern.h' --- src/RefreshPattern.h 1970-01-01 00:00:00 +0000 +++ src/RefreshPattern.h 2012-09-18 12:54:44 +0000 @@ -0,0 +1,61 @@ +#ifndef SQUID_REFRESHPATTERN_H_ +#define SQUID_REFRESHPATTERN_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +class RefreshPattern +{ +public: + const char *pattern; + regex_t compiled_pattern; + time_t min; + double pct; + time_t max; + RefreshPattern *next; + + struct { + unsigned int icase:1; + unsigned int refresh_ims:1; + unsigned int store_stale:1; +#if USE_HTTP_VIOLATIONS + unsigned int override_expire:1; + unsigned int override_lastmod:1; + unsigned int reload_into_ims:1; + unsigned int ignore_reload:1; + unsigned int ignore_no_cache:1; + unsigned int ignore_no_store:1; + unsigned int ignore_must_revalidate:1; + unsigned int ignore_private:1; + unsigned int ignore_auth:1; +#endif + } flags; + int max_stale; +}; + +#endif /* SQUID_REFRESHPATTERN_H_ */ === added file 'src/RegexList.cc' --- src/RegexList.cc 1970-01-01 00:00:00 +0000 +++ src/RegexList.cc 2012-09-06 11:56:46 +0000 @@ -0,0 +1,32 @@ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "squid.h" +#include "RegexList.h" + === added file 'src/RegexList.h' --- src/RegexList.h 1970-01-01 00:00:00 +0000 +++ src/RegexList.h 2012-09-18 12:54:44 +0000 @@ -0,0 +1,41 @@ +#ifndef SQUID_REGEXLIST_H_ +#define SQUID_REGEXLIST_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +class RegexList +{ +public: + int flags; + char *pattern; + regex_t regex; + RegexList *next; +}; + +#endif /* SQUID_REGEXLIST_H_ */ === added file 'src/RequestFlags.cc' --- src/RequestFlags.cc 1970-01-01 00:00:00 +0000 +++ src/RequestFlags.cc 2012-09-18 14:23:58 +0000 @@ -0,0 +1,96 @@ +/* + * DEBUG: section 73 HTTP Request + * AUTHOR: Duane Wessels + * + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "squid.h" +#include "Debug.h" +#include "RequestFlags.h" + +// TODO: move to .cci +/* RequestFlags */ +bool +RequestFlags::resetTCP() const +{ + return resetTCP_; +} + +void +RequestFlags::setResetTCP() +{ + debugs(73, 9, HERE); + resetTCP_ = true; +} + +void +RequestFlags::clearResetTCP() +{ + debugs(73, 9, HERE); + resetTCP_ = false; +} + +void +RequestFlags::destinationIPLookupCompleted() +{ + destinationIPLookedUp_ = true; +} + +bool +RequestFlags::destinationIPLookedUp() const +{ + return destinationIPLookedUp_; +} + +bool +RequestFlags::isRanged() const +{ + return isRanged_; +} + +void +RequestFlags::setRanged() +{ + isRanged_ = true; +} + +void +RequestFlags::clearRanged() +{ + isRanged_ = false; +} + +RequestFlags +RequestFlags::cloneAdaptationImmune() const +{ + // At the time of writing, all flags where either safe to copy after + // adaptation or were not set at the time of the adaptation. If there + // are flags that are different, they should be cleared in the clone. + return *this; +} === added file 'src/RequestFlags.h' --- src/RequestFlags.h 1970-01-01 00:00:00 +0000 +++ src/RequestFlags.h 2012-09-18 14:23:58 +0000 @@ -0,0 +1,236 @@ +#ifndef SQUID_REQUESTFLAGS_H_ +#define SQUID_REQUESTFLAGS_H_ +/* + * DEBUG: section 73 HTTP Request + * AUTHOR: Duane Wessels + * + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +class RequestFlags +{ +public: + RequestFlags(): + nocache(false), ims(false), auth_(false), cachable(false), + hierarchical_(false), loopdetect(false), proxy_keepalive(false), + proxying_(false), refresh_(false), redirected(false), + need_validation(false), fail_on_validation_err(false), + stale_if_hit(false), nocache_hack(false), accelerated_(false), + ignore_cc(false), intercepted_(false), hostVerified_(false), + spoof_client_ip(false), internal(false), internalclient(false), + must_keepalive(false), connection_auth_wanted(false), + connection_auth_disabled(false), connection_proxy_auth(false), + pinned_(false), canRePin_(false), authSent_(false), noDirect_(false), + chunkedReply_(false), streamError_(false), sslPeek_(false), + doneFollowXForwardedFor(!FOLLOW_X_FORWARDED_FOR), + sslBumped_(false), destinationIPLookedUp_(false), resetTCP_(false), + isRanged_(false) + {} + + // When adding new flags, please update cloneAdaptationImmune() as needed. + bool resetTCP() const; + void setResetTCP(); + void clearResetTCP(); + void destinationIPLookupCompleted(); + bool destinationIPLookedUp() const; + // returns a partial copy of the flags that includes only those flags + // that are safe for a related (e.g., ICAP-adapted) request to inherit + RequestFlags cloneAdaptationImmune() const; + + bool isRanged() const; + void setRanged(); + void clearRanged(); + + bool sslBumped() const { return sslBumped_; } + void setSslBumped(bool newValue=true) { sslBumped_=newValue; } + void clearSslBumpeD() { sslBumped_=false; } + + bool doneFollowXFF() const { return doneFollowXForwardedFor; } + void setDoneFollowXFF() { + doneFollowXForwardedFor = true; + } + void clearDoneFollowXFF() { + /* do not allow clearing if FOLLOW_X_FORWARDED_FOR is unset */ + doneFollowXForwardedFor = false || !FOLLOW_X_FORWARDED_FOR; + } + + bool sslPeek() const { return sslPeek_; } + void setSslPeek() { sslPeek_=true; } + void clearSslPeek() { sslPeek_=false; } + + bool hadStreamError() const { return streamError_; } + void setStreamError() { streamError_ = true; } + void clearStreamError() { streamError_ = false; } + + bool isReplyChunked() const { return chunkedReply_; } + void markReplyChunked() { chunkedReply_ = true; } + + void setNoDirect() { noDirect_=true; } + bool noDirect() const{ return noDirect_; } + + bool authSent() const { return authSent_; } + void markAuthSent() { authSent_=true;} + + bool canRePin() const { return canRePin_; } + void allowRepinning() { canRePin_=true; } + + void markPinned() { pinned_ = true; } + void clearPinned() { pinned_ = false; } + bool pinned() const { return pinned_; } + + //XXX: oddly this is set in client_side_request.cc, but never checked. + bool wantConnectionProxyAuth() const { return connection_proxy_auth; } + void requestConnectionProxyAuth() { connection_proxy_auth=true; } + + void disableConnectionAuth() { connection_auth_disabled=true; } + bool connectionAuthDisabled() const { return connection_auth_disabled; } + + void wantConnectionAuth() { connection_auth_wanted=true; } + bool connectionAuthWanted() const { return connection_auth_wanted; } + + void setMustKeepalive() { must_keepalive = true; } + bool mustKeepalive() const { return must_keepalive; } + + //XXX: oddly this is set in client_side_request.cc but never checked. + void setInternalClient() { internalclient=true;} + + void markInternal() { internal=true; } + bool isInternal() const { return internal; } + + bool spoofClientIp() const { return spoof_client_ip; } + void setSpoofClientIp() { spoof_client_ip = true; } + + bool hostVerified() const { return hostVerified_; } + void markHostVerified() { hostVerified_=true; } + + bool intercepted() const { return intercepted_; } + void markIntercepted() { intercepted_=true; } + + bool ignoringCacheControl() const { return ignore_cc; } + void ignoreCacheControl() { ignore_cc=true; } + + bool accelerated() const { return accelerated_; } + void markAccelerated() { accelerated_ = true; } + + /* nocache_hack is only enabled if USE_HTTP_VIOLATIONS is set at build-time. + * Compilers will have an easy time optimizing to a NOP otherwise. */ + void hackNocache() { if (USE_HTTP_VIOLATIONS) nocache_hack=true; } + bool noCacheHackEnabled() const { return USE_HTTP_VIOLATIONS && nocache_hack; } + + void setStaleIfHit() { stale_if_hit=true; } + void clearStaleIfHit() { stale_if_hit=false; } + bool staleIfHit() const { return stale_if_hit; } + + void setFailOnValidationError() { fail_on_validation_err=true; } + bool failOnValidationError() const { return fail_on_validation_err; } + + bool validationNeeded() const { return need_validation; } + void setNeedValidation() { need_validation=true; } + + bool isRedirected() const { return redirected; } + void markRedirected() { redirected=true; } + + bool refresh() const { return refresh_; } + void setRefresh() { refresh_ = true; } + + bool proxying() const { return proxying_; } + void setProxying() { proxying_ = true; } + void clearProxying() { proxying_ = false; } + + bool proxyKeepalive() const { return proxy_keepalive; } + void setProxyKeepalive() { proxy_keepalive=true;} + void clearProxyKeepalive() { proxy_keepalive=false; } + + bool loopDetect() const { return loopdetect; } + void setLoopDetect() { loopdetect = 1; } + + bool hierarchical() const { return hierarchical_; } + void setHierarchical() { hierarchical_=true; } + void clearHierarchical() { hierarchical_=true; } + + bool isCachable() const { return cachable; } + void setCachable(bool newValue=true) { cachable = newValue; } + void setNotCachable() { cachable = false; } + + bool hasAuth() const { return auth_; } + void markAuth() { auth_=true; } + + bool hasIMS() const { return ims; } + void setIMS() { ims=true; } + void clearIMS() { ims=false; } + + bool noCache() const { return nocache; } + void setNocache() { nocache=true;} +private: + bool nocache :1; ///< whether the response to this request may be READ from cache + bool ims :1; + bool auth_ :1; + bool cachable :1; ///< whether the response to thie request may be stored in the cache + bool hierarchical_ :1; + bool loopdetect :1; + bool proxy_keepalive :1; + bool proxying_ :1; /* this should be killed, also in httpstateflags */ + bool refresh_ :1; + bool redirected :1; + bool need_validation :1; + bool fail_on_validation_err :1; ///< whether we should fail if validation fails + bool stale_if_hit :1; ///< reply is stale if it is a hit + /* for changing/ignoring no-cache requests. Unused unless USE_HTTP_VIOLATIONS */ + bool nocache_hack :1; + bool accelerated_ :1; /// +#endif + +class acl_access; +class acl_size_t; +class AclDenyInfoList; +namespace Mgr { +class ActionPasswordList; +} // namespace Mgr +class CustomLog; +class external_acl; +class HeaderManglers; +class RefreshPattern; +class RemovalPolicySettings; +class SwapDir; + +namespace AnyP { +class PortCfg; +} + +class SquidConfig +{ +public: + struct { + /* These should be for the Store::Root instance. + * this needs pluggable parsing to be done smoothly. + */ + int highWaterMark; + int lowWaterMark; + } Swap; + + YesNoNone memShared; ///< whether the memory cache is shared among workers + size_t memMaxSize; + + struct { + int64_t min; + int pct; + int64_t max; + } quickAbort; + int64_t readAheadGap; + RemovalPolicySettings *replPolicy; + RemovalPolicySettings *memPolicy; +#if USE_HTTP_VIOLATIONS + time_t negativeTtl; +#endif + time_t maxStale; + time_t negativeDnsTtl; + time_t positiveDnsTtl; + time_t shutdownLifetime; + time_t backgroundPingRate; + + struct { + time_t read; + time_t write; + time_t lifetime; + time_t connect; + time_t forward; + time_t peer_connect; + time_t request; + time_t clientIdlePconn; + time_t serverIdlePconn; + time_t siteSelect; + time_t deadPeer; + int icp_query; /* msec */ + int icp_query_max; /* msec */ + int icp_query_min; /* msec */ + int mcast_icp_query; /* msec */ + +#if !USE_DNSHELPER + time_msec_t idns_retransmit; + time_msec_t idns_query; +#endif + + } Timeout; + size_t maxRequestHeaderSize; + int64_t maxRequestBodySize; + int64_t maxChunkedRequestBodySize; + size_t maxRequestBufferSize; + size_t maxReplyHeaderSize; + acl_size_t *ReplyBodySize; + + struct { + unsigned short icp; +#if USE_HTCP + + unsigned short htcp; +#endif +#if SQUID_SNMP + + unsigned short snmp; +#endif + } Port; + + struct { + AnyP::PortCfg *http; +#if USE_SSL + AnyP::PortCfg *https; +#endif + } Sockaddr; +#if SQUID_SNMP + + struct { + char *configFile; + char *agentInfo; + } Snmp; +#endif +#if USE_WCCP + + struct { + Ip::Address router; + Ip::Address address; + int version; + } Wccp; +#endif +#if USE_WCCPv2 + + struct { + Ip::Address_list *router; + Ip::Address address; + int forwarding_method; + int return_method; + int assignment_method; + int weight; + int rebuildwait; + void *info; + } Wccp2; +#endif + +#if USE_ICMP + IcmpConfig pinger; +#endif + + char *as_whois_server; + + struct { + char *store; + char *swap; + CustomLog *accesslogs; +#if ICAP_CLIENT + CustomLog *icaplogs; +#endif + int rotateNumber; + } Log; + char *adminEmail; + char *EmailFrom; + char *EmailProgram; + char *effectiveUser; + char *visible_appname_string; + char *effectiveGroup; + + struct { +#if USE_DNSHELPER + char *dnsserver; +#endif + + wordlist *redirect; +#if USE_UNLINKD + + char *unlinkd; +#endif + + char *diskd; +#if USE_SSL + + char *ssl_password; +#endif + + } Program; +#if USE_DNSHELPER + HelperChildConfig dnsChildren; +#endif + + HelperChildConfig redirectChildren; + time_t authenticateGCInterval; + time_t authenticateTTL; + time_t authenticateIpTTL; + + struct { + char *surrogate_id; + } Accel; + char *appendDomain; + size_t appendDomainLen; + char *pidFilename; + char *netdbFilename; + char *mimeTablePathname; + char *etcHostsPath; + char *visibleHostname; + char *uniqueHostname; + wordlist *hostnameAliases; + char *errHtmlText; + + struct { + char *host; + char *file; + time_t period; + unsigned short port; + } Announce; + + struct { + + Ip::Address udp_incoming; + Ip::Address udp_outgoing; +#if SQUID_SNMP + Ip::Address snmp_incoming; + Ip::Address snmp_outgoing; +#endif + /* FIXME INET6 : this should really be a CIDR value */ + Ip::Address client_netmask; + } Addrs; + size_t tcpRcvBufsz; + size_t udpMaxHitObjsz; + wordlist *hierarchy_stoplist; + wordlist *mcast_group_list; + wordlist *dns_nameservers; + CachePeer *peers; + int npeers; + + struct { + int size; + int low; + int high; + } ipcache; + + struct { + int size; + } fqdncache; + int minDirectHops; + int minDirectRtt; + Mgr::ActionPasswordList *passwd_list; + + struct { + int objectsPerBucket; + int64_t avgObjectSize; + int64_t maxObjectSize; + int64_t minObjectSize; + size_t maxInMemObjSize; + } Store; + + struct { + int high; + int low; + time_t period; + } Netdb; + + struct { + int log_udp; + int res_defnames; + int anonymizer; + int client_db; + int query_icmp; + int icp_hit_stale; + int buffered_logs; + int common_log; + int log_mime_hdrs; + int log_fqdn; + int announce; + int mem_pools; + int test_reachability; + int half_closed_clients; + int refresh_all_ims; +#if USE_HTTP_VIOLATIONS + + int reload_into_ims; +#endif + + int offline; + int redir_rewrites_host; + int prefer_direct; + int nonhierarchical_direct; + int strip_query_terms; + int redirector_bypass; + int ignore_unknown_nameservers; + int client_pconns; + int server_pconns; + int error_pconns; +#if USE_CACHE_DIGESTS + + int digest_generation; +#endif + + int ie_refresh; + int vary_ignore_expire; + int pipeline_prefetch; + int surrogate_is_remote; + int request_entities; + int detect_broken_server_pconns; + int balance_on_multiple_ip; + int relaxed_header_parser; + int check_hostnames; + int allow_underscore; + int via; + int emailErrData; + int httpd_suppress_version_string; + int global_internal_static; + +#if FOLLOW_X_FORWARDED_FOR + int acl_uses_indirect_client; + int delay_pool_uses_indirect_client; + int log_uses_indirect_client; +#if LINUX_NETFILTER + int tproxy_uses_indirect_client; +#endif +#endif /* FOLLOW_X_FORWARDED_FOR */ + + int WIN32_IpAddrChangeMonitor; + int memory_cache_first; + int memory_cache_disk; + int hostStrictVerify; + int client_dst_passthru; + } onoff; + + int forward_max_tries; + int connect_retries; + + class ACL *aclList; + + struct { + acl_access *http; + acl_access *adapted_http; + acl_access *icp; + acl_access *miss; + acl_access *NeverDirect; + acl_access *AlwaysDirect; + acl_access *ASlists; + acl_access *noCache; + acl_access *log; +#if SQUID_SNMP + + acl_access *snmp; +#endif +#if USE_HTTP_VIOLATIONS + acl_access *brokenPosts; +#endif + acl_access *redirector; + acl_access *reply; + AclAddress *outgoing_address; +#if USE_HTCP + + acl_access *htcp; + acl_access *htcp_clr; +#endif + +#if USE_SSL + acl_access *ssl_bump; +#endif +#if FOLLOW_X_FORWARDED_FOR + acl_access *followXFF; +#endif /* FOLLOW_X_FORWARDED_FOR */ + +#if ICAP_CLIENT + acl_access* icap; +#endif + } accessList; + AclDenyInfoList *denyInfoList; + + struct { + size_t list_width; + int list_wrap; + char *anon_user; + int passive; + int epsv_all; + int epsv; + int eprt; + int sanitycheck; + int telnet; + } Ftp; + RefreshPattern *Refresh; + + struct _cacheSwap { + RefCount *swapDirs; + int n_allocated; + int n_configured; + /// number of disk processes required to support all cache_dirs + int n_strands; + } cacheSwap; + /* + * I'm sick of having to keep doing this .. + */ +#define INDEXSD(i) (Config.cacheSwap.swapDirs[(i)].getRaw()) + + struct { + char *directory; + int use_short_names; + } icons; + char *errorDirectory; +#if USE_ERR_LOCALES + char *errorDefaultLanguage; + int errorLogMissingLanguages; +#endif + char *errorStylesheet; + + struct { + int onerror; + } retry; + + struct { + int64_t limit; + } MemPools; +#if USE_DELAY_POOLS + + DelayConfig Delay; + ClientDelayConfig ClientDelay; +#endif + + struct { + struct { + int average; + int min_poll; + } dns, udp, tcp; + } comm_incoming; + int max_open_disk_fds; + int uri_whitespace; + acl_size_t *rangeOffsetLimit; +#if MULTICAST_MISS_STREAM + + struct { + + Ip::Address addr; + int ttl; + unsigned short port; + char *encode_key; + } mcast_miss; +#endif + + /// request_header_access and request_header_replace + HeaderManglers *request_header_access; + /// reply_header_access and reply_header_replace + HeaderManglers *reply_header_access; + ///request_header_add access list + HeaderWithAclList *request_header_add; + char *coredump_dir; + char *chroot_dir; +#if USE_CACHE_DIGESTS + + struct { + int bits_per_entry; + time_t rebuild_period; + time_t rewrite_period; + size_t swapout_chunk_size; + int rebuild_chunk_percentage; + } digest; +#endif +#if USE_SSL + + struct { + int unclean_shutdown; + char *ssl_engine; + } SSL; +#endif + + wordlist *ext_methods; + + struct { + int high_rptm; + int high_pf; + size_t high_memory; + } warnings; + char *store_dir_select_algorithm; + int sleep_after_fork; /* microseconds */ + time_t minimum_expiry_time; /* seconds */ + external_acl *externalAclHelperList; + +#if USE_SSL + + struct { + char *cert; + char *key; + int version; + char *options; + char *cipher; + char *cafile; + char *capath; + char *crlfile; + char *flags; + acl_access *cert_error; + SSL_CTX *sslContext; + sslproxy_cert_sign *cert_sign; + sslproxy_cert_adapt *cert_adapt; + } ssl_client; +#endif + + char *accept_filter; + int umask; + int max_filedescriptors; + int workers; + CpuAffinityMap *cpuAffinityMap; + +#if USE_LOADABLE_MODULES + wordlist *loadable_module_names; +#endif + + int client_ip_max_connections; + + struct { + int v4_first; ///< Place IPv4 first in the order of DNS results. + ssize_t packet_max; ///< maximum size EDNS advertised for DNS replies. + } dns; + +}; + +extern SquidConfig Config; + +struct SquidConfig2 { + struct { + int enable_purge; + int mangle_request_headers; + } onoff; + uid_t effectiveUserID; + gid_t effectiveGroupID; +}; + +extern SquidConfig2 Config2; + +#endif /* SQUID_SQUIDCONFIG_H_ */ === modified file 'src/SquidList.h' --- src/SquidList.h 2012-08-31 08:48:38 +0000 +++ src/SquidList.h 2012-09-18 12:54:44 +0000 @@ -32,7 +32,8 @@ * */ -class link_list { +class link_list +{ public: void *ptr; link_list *next; === modified file 'src/Store.h' --- src/Store.h 2012-09-01 14:38:36 +0000 +++ src/Store.h 2012-09-10 12:49:35 +0000 @@ -42,6 +42,7 @@ #include "Range.h" #include "RefCount.h" #include "RemovalPolicy.h" +#include "RequestFlags.h" #include "StoreIOBuffer.h" #include "StoreStats.h" @@ -378,7 +379,8 @@ SQUIDCEXTERN StoreEntry *storeGetPublicByRequestMethod(HttpRequest * request, const HttpRequestMethod& method); /// \ingroup StoreAPI -SQUIDCEXTERN StoreEntry *storeCreateEntry(const char *, const char *, request_flags, const HttpRequestMethod&); +class RequestFlags; +extern StoreEntry *storeCreateEntry(const char *, const char *, const RequestFlags &, const HttpRequestMethod&); /// \ingroup StoreAPI SQUIDCEXTERN void storeInit(void); === modified file 'src/SwapDir.cc' --- src/SwapDir.cc 2012-08-31 16:57:39 +0000 +++ src/SwapDir.cc 2012-09-04 09:10:20 +0000 @@ -36,6 +36,7 @@ #include "ConfigOption.h" #include "globals.h" #include "Parsing.h" +#include "SquidConfig.h" #include "StoreFileSystem.h" #include "SwapDir.h" #include "tools.h" === modified file 'src/SwapDir.h' --- src/SwapDir.h 2012-09-01 14:38:36 +0000 +++ src/SwapDir.h 2012-09-04 09:10:20 +0000 @@ -30,6 +30,7 @@ #ifndef SQUID_SWAPDIR_H #define SQUID_SWAPDIR_H +#include "SquidConfig.h" #include "Store.h" #include "StoreIOState.h" === added file 'src/YesNoNone.cc' --- src/YesNoNone.cc 1970-01-01 00:00:00 +0000 +++ src/YesNoNone.cc 2012-09-04 11:13:13 +0000 @@ -0,0 +1,43 @@ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "squid.h" +#include "YesNoNone.h" + +YesNoNone::operator void*() const +{ + assert(option != 0); // must call configure() first + return option > 0 ? (void*)this : NULL; +} + +void +YesNoNone::configure(bool beSet) +{ + option = beSet ? +1 : -1; +} === added file 'src/YesNoNone.h' --- src/YesNoNone.h 1970-01-01 00:00:00 +0000 +++ src/YesNoNone.h 2012-09-18 12:37:07 +0000 @@ -0,0 +1,55 @@ +#ifndef SQUID_YESNONONE_H_ +#define SQUID_YESNONONE_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +/// Used for boolean enabled/disabled options with complex default logic. +/// Allows Squid to compute the right default after configuration. +/// Checks that not-yet-defined option values are not used. +class YesNoNone +{ +// TODO: generalize to non-boolean option types +public: + YesNoNone(): option(0) {} + + /// returns true iff enabled; asserts if the option has not been configured + operator void *() const; // TODO: use a fancy/safer version of the operator + + /// enables or disables the option; + void configure(bool beSet); + + /// whether the option was enabled or disabled, by user or Squid + bool configured() const { return option != 0; } + +private: + enum { optUnspecified = -1, optDisabled = 0, optEnabled = 1 }; + int option; ///< configured value or zero +}; + +#endif /* SQUID_YESNONONE_H_ */ === modified file 'src/acl/Acl.cc' --- src/acl/Acl.cc 2012-09-01 14:38:36 +0000 +++ src/acl/Acl.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "Debug.h" #include "dlink.h" #include "globals.h" +#include "SquidConfig.h" const char *AclMatchedName = NULL; === added file 'src/acl/AclAddress.cc' --- src/acl/AclAddress.cc 1970-01-01 00:00:00 +0000 +++ src/acl/AclAddress.cc 2012-09-05 19:54:09 +0000 @@ -0,0 +1,32 @@ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + */ + +#include "squid.h" +#include "AclAddress.h" + +//TODO: fill in === added file 'src/acl/AclAddress.h' --- src/acl/AclAddress.h 1970-01-01 00:00:00 +0000 +++ src/acl/AclAddress.h 2012-09-18 14:23:58 +0000 @@ -0,0 +1,44 @@ +#ifndef ACLADDRESS_H_ +#define ACLADDRESS_H_ +#include "Acl.h" +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + */ + +#include "ip/Address.h" +#include "acl/Acl.h" + +class AclAddress +{ +public: + AclAddress *next; + ACLList *aclList; + + Ip::Address addr; +}; + +#endif /* ACLADDRESS_H_ */ === added file 'src/acl/AclDenyInfoList.h' --- src/acl/AclDenyInfoList.h 1970-01-01 00:00:00 +0000 +++ src/acl/AclDenyInfoList.h 2012-09-18 12:54:44 +0000 @@ -0,0 +1,44 @@ +#ifndef SQUID_ACLDENYINFOLIST_H_ +#define SQUID_ACLDENYINFOLIST_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "err_type.h" +#include "acl/AclNameList.h" + +class AclDenyInfoList +{ +public: + err_type err_page_id; + char *err_page_name; + AclNameList *acl_list; + AclDenyInfoList *next; +}; + +#endif /* SQUID_ACLDENYINFOLIST_H_ */ === added file 'src/acl/AclNameList.h' --- src/acl/AclNameList.h 1970-01-01 00:00:00 +0000 +++ src/acl/AclNameList.h 2012-09-18 12:54:44 +0000 @@ -0,0 +1,41 @@ +#ifndef SQUID_ACL_ACLNAMELIST_H_ +#define SQUID_ACL_ACLNAMELIST_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "defines.h" +//TODO: convert to a std::list +class AclNameList +{ +public: + char name[ACL_NAME_SZ]; + AclNameList *next; +}; + +#endif /* SQUID_ACLNAMELIST_H_ */ === modified file 'src/acl/Asn.cc' --- src/acl/Asn.cc 2012-09-01 14:38:36 +0000 +++ src/acl/Asn.cc 2012-09-10 12:49:35 +0000 @@ -32,21 +32,23 @@ */ #include "squid.h" -#include "mgr/Registration.h" -#include "radix.h" -#include "HttpRequest.h" -#include "StoreClient.h" -#include "Store.h" #include "acl/Acl.h" #include "acl/Asn.h" #include "acl/Checklist.h" -#include "acl/SourceAsn.h" #include "acl/DestinationAsn.h" #include "acl/DestinationIp.h" +#include "acl/SourceAsn.h" #include "cache_cf.h" +#include "forward.h" #include "HttpReply.h" +#include "HttpRequest.h" #include "ipcache.h" -#include "forward.h" +#include "mgr/Registration.h" +#include "radix.h" +#include "RequestFlags.h" +#include "SquidConfig.h" +#include "Store.h" +#include "StoreClient.h" #include "StoreClient.h" #include "wordlist.h" @@ -247,7 +249,7 @@ asState->request = HTTPMSGLOCK(req); if ((e = storeGetPublic(asres, METHOD_GET)) == NULL) { - e = storeCreateEntry(asres, asres, request_flags(), METHOD_GET); + e = storeCreateEntry(asres, asres, RequestFlags(), METHOD_GET); asState->sc = storeClientListAdd(e, asState); FwdState::fwdStart(Comm::ConnectionPointer(), e, asState->request); } else { === modified file 'src/acl/DestinationIp.cc' --- src/acl/DestinationIp.cc 2012-09-01 14:38:36 +0000 +++ src/acl/DestinationIp.cc 2012-09-12 16:06:56 +0000 @@ -37,6 +37,7 @@ #include "client_side.h" #include "comm/Connection.h" #include "HttpRequest.h" +#include "SquidConfig.h" #include "structs.h" char const * @@ -55,7 +56,7 @@ // To resolve this we will force DIRECT and only to the original client destination. // In which case, we also need this ACL to accurately match the destination if (Config.onoff.client_dst_passthru && checklist->request && - (checklist->request->flags.intercepted || checklist->request->flags.spoof_client_ip)) { + (checklist->request->flags.intercepted() || checklist->request->flags.spoofClientIp())) { assert(checklist->conn() && checklist->conn()->clientConnection != NULL); return ACLIP::match(checklist->conn()->clientConnection->local); } === modified file 'src/acl/FilledChecklist.cc' --- src/acl/FilledChecklist.cc 2012-08-31 00:13:14 +0000 +++ src/acl/FilledChecklist.cc 2012-09-09 19:41:47 +0000 @@ -5,6 +5,7 @@ #include "comm/forward.h" #include "HttpReply.h" #include "HttpRequest.h" +#include "SquidConfig.h" #if USE_AUTH #include "auth/UserRequest.h" #include "auth/AclProxyAuth.h" === modified file 'src/acl/FilledChecklist.h' --- src/acl/FilledChecklist.h 2012-08-14 11:53:07 +0000 +++ src/acl/FilledChecklist.h 2012-09-04 15:15:51 +0000 @@ -9,8 +9,9 @@ #include "ssl/support.h" #endif +class CachePeer; +class ConnStateData; class ExternalACLEntry; -class ConnStateData; class HttpRequest; /** \ingroup ACLAPI @@ -52,7 +53,7 @@ Ip::Address src_addr; Ip::Address dst_addr; Ip::Address my_addr; - struct peer *dst_peer; + CachePeer *dst_peer; char *dst_rdns; HttpRequest *request; === modified file 'src/acl/Gadgets.cc' --- src/acl/Gadgets.cc 2012-09-01 14:38:36 +0000 +++ src/acl/Gadgets.cc 2012-09-05 14:49:29 +0000 @@ -38,6 +38,8 @@ #include "squid.h" #include "acl/Acl.h" +#include "acl/AclNameList.h" +#include "acl/AclDenyInfoList.h" #include "acl/Checklist.h" #include "acl/Strategised.h" #include "acl/Gadgets.h" @@ -49,14 +51,14 @@ /* does name lookup, returns page_id */ err_type -aclGetDenyInfoPage(acl_deny_info_list ** head, const char *name, int redirect_allowed) +aclGetDenyInfoPage(AclDenyInfoList ** head, const char *name, int redirect_allowed) { - acl_deny_info_list *A = NULL; + AclDenyInfoList *A = NULL; debugs(28, 8, HERE << "got called for " << name); for (A = *head; A; A = A->next) { - acl_name_list *L = NULL; + AclNameList *L = NULL; if (!redirect_allowed && strchr(A->err_page_name, ':') ) { debugs(28, 8, HERE << "Skip '" << A->err_page_name << "' 30x redirects not allowed as response here."); @@ -106,14 +108,14 @@ */ void -aclParseDenyInfoLine(acl_deny_info_list ** head) +aclParseDenyInfoLine(AclDenyInfoList ** head) { char *t = NULL; - acl_deny_info_list *A = NULL; - acl_deny_info_list *B = NULL; - acl_deny_info_list **T = NULL; - acl_name_list *L = NULL; - acl_name_list **Tail = NULL; + AclDenyInfoList *A = NULL; + AclDenyInfoList *B = NULL; + AclDenyInfoList **T = NULL; + AclNameList *L = NULL; + AclNameList **Tail = NULL; /* first expect a page name */ @@ -123,15 +125,15 @@ return; } - A = (acl_deny_info_list *)memAllocate(MEM_ACL_DENY_INFO_LIST); + A = (AclDenyInfoList *)memAllocate(MEM_ACL_DENY_INFO_LIST); A->err_page_id = errorReservePageId(t); A->err_page_name = xstrdup(t); - A->next = (acl_deny_info_list *) NULL; + A->next = (AclDenyInfoList *) NULL; /* next expect a list of ACL names */ Tail = &A->acl_list; while ((t = strtok(NULL, w_space))) { - L = (acl_name_list *)memAllocate(MEM_ACL_NAME_LIST); + L = (AclNameList *)memAllocate(MEM_ACL_NAME_LIST); xstrncpy(L->name, t, ACL_NAME_SZ); *Tail = L; Tail = &L->next; @@ -280,15 +282,15 @@ } /* maex@space.net (06.09.1996) - * destroy an acl_deny_info_list */ + * destroy an AclDenyInfoList */ void -aclDestroyDenyInfoList(acl_deny_info_list ** list) +aclDestroyDenyInfoList(AclDenyInfoList ** list) { - acl_deny_info_list *a = NULL; - acl_deny_info_list *a_next = NULL; - acl_name_list *l = NULL; - acl_name_list *l_next = NULL; + AclDenyInfoList *a = NULL; + AclDenyInfoList *a_next = NULL; + AclNameList *l = NULL; + AclNameList *l_next = NULL; debugs(28, 8, "aclDestroyDenyInfoList: invoked"); === modified file 'src/acl/Gadgets.h' --- src/acl/Gadgets.h 2011-10-28 19:43:45 +0000 +++ src/acl/Gadgets.h 2012-09-05 14:49:29 +0000 @@ -4,12 +4,12 @@ #include "err_type.h" struct dlink_list; -class StoreEntry; -class ConfigParser; class acl_access; class ACL; +class AclDenyInfoList; class ACLList; -struct acl_deny_info_list; +class ConfigParser; +class StoreEntry; class wordlist; /// \ingroup ACLAPI @@ -25,11 +25,11 @@ /// \ingroup ACLAPI extern int aclIsProxyAuth(const char *name); /// \ingroup ACLAPI -extern err_type aclGetDenyInfoPage(acl_deny_info_list ** head, const char *name, int redirect_allowed); -/// \ingroup ACLAPI -extern void aclParseDenyInfoLine(acl_deny_info_list **); -/// \ingroup ACLAPI -extern void aclDestroyDenyInfoList(acl_deny_info_list **); +extern err_type aclGetDenyInfoPage(AclDenyInfoList ** head, const char *name, int redirect_allowed); +/// \ingroup ACLAPI +extern void aclParseDenyInfoLine(AclDenyInfoList **); +/// \ingroup ACLAPI +extern void aclDestroyDenyInfoList(AclDenyInfoList **); /// \ingroup ACLAPI extern wordlist *aclDumpGeneric(const ACL *); /// \ingroup ACLAPI === modified file 'src/acl/Makefile.am' --- src/acl/Makefile.am 2011-06-20 08:51:32 +0000 +++ src/acl/Makefile.am 2012-09-05 19:54:09 +0000 @@ -19,7 +19,9 @@ Strategised.h \ \ FilledChecklist.cc \ - FilledChecklist.h + FilledChecklist.h \ + AclAddress.h \ + AclAddress.cc ## data-specific ACLs libacls_la_SOURCES = \ @@ -105,6 +107,8 @@ UserData.cc \ UserData.h \ \ + AclNameList.h \ + AclDenyInfoList.h \ Gadgets.cc \ Gadgets.h === modified file 'src/acl/MaxConnection.cc' --- src/acl/MaxConnection.cc 2012-08-31 16:57:39 +0000 +++ src/acl/MaxConnection.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "cache_cf.h" #include "client_db.h" #include "Debug.h" +#include "SquidConfig.h" #include "wordlist.h" ACL * === modified file 'src/acl/PeerName.cc' --- src/acl/PeerName.cc 2012-08-28 13:00:30 +0000 +++ src/acl/PeerName.cc 2012-09-04 15:15:51 +0000 @@ -3,6 +3,7 @@ #include "acl/RegexData.h" #include "acl/StringData.h" #include "acl/Checklist.h" +#include "CachePeer.h" int ACLPeerNameStrategy::match (ACLData * &data, ACLFilledChecklist *checklist) === modified file 'src/acl/RegexData.cc' --- src/acl/RegexData.cc 2012-09-01 14:38:36 +0000 +++ src/acl/RegexData.cc 2012-09-06 11:56:46 +0000 @@ -41,12 +41,13 @@ #include "ConfigParser.h" #include "Debug.h" #include "Mem.h" +#include "RegexList.h" #include "wordlist.h" static void -aclDestroyRegexList(relist * data) +aclDestroyRegexList(RegexList * data) { - relist *next = NULL; + RegexList *next = NULL; for (; data; data = next) { next = data->next; @@ -69,13 +70,13 @@ debugs(28, 3, "aclRegexData::match: checking '" << word << "'"); - relist *first, *prev; + RegexList *first, *prev; first = data; prev = NULL; - relist *current = first; + RegexList *current = first; while (current) { debugs(28, 3, "aclRegexData::match: looking for '" << current->pattern << "'"); @@ -104,7 +105,7 @@ ACLRegexData::dump() { wordlist *W = NULL; - relist *temp = data; + RegexList *temp = data; int flags = REG_EXTENDED | REG_NOSUB; while (temp != NULL) { @@ -152,11 +153,11 @@ return t; } -static relist ** -compileRE(relist **Tail, char * RE, int flags) +static RegexList ** +compileRE(RegexList **Tail, char * RE, int flags) { int errcode; - relist *q; + RegexList *q; regex_t comp; if (RE == NULL || *RE == '\0') @@ -171,7 +172,7 @@ } debugs(28, 2, "compileRE: compiled '" << RE << "' with flags " << flags ); - q = (relist *) memAllocate(MEM_RELIST); + q = (RegexList *) memAllocate(MEM_RELIST); q->pattern = xstrdup(RE); q->regex = comp; q->flags = flags; @@ -186,11 +187,11 @@ * called only once per ACL. */ static int -compileOptimisedREs(relist **curlist, wordlist * wl) +compileOptimisedREs(RegexList **curlist, wordlist * wl) { - relist **Tail; - relist *newlist; - relist **newlistp; + RegexList **Tail; + RegexList *newlist; + RegexList **newlistp; int numREs = 0; int flags = REG_EXTENDED | REG_NOSUB; int largeREindex = 0; @@ -288,10 +289,10 @@ } static void -compileUnoptimisedREs(relist **curlist, wordlist * wl) +compileUnoptimisedREs(RegexList **curlist, wordlist * wl) { - relist **Tail; - relist **newTail; + RegexList **Tail; + RegexList **newTail; int flags = REG_EXTENDED | REG_NOSUB; for (Tail = curlist; *Tail != NULL; Tail = &((*Tail)->next)) @@ -314,7 +315,7 @@ } static void -aclParseRegexList(relist **curlist) +aclParseRegexList(RegexList **curlist) { char *t; wordlist *wl = NULL; === modified file 'src/acl/RegexData.h' --- src/acl/RegexData.h 2012-09-01 14:38:36 +0000 +++ src/acl/RegexData.h 2012-09-06 11:56:46 +0000 @@ -35,8 +35,7 @@ #include "acl/Data.h" #include "MemPool.h" -/** \todo CLEANUP: break out relist, we don't need the rest. */ -#include "structs.h" +class RegexList; class ACLRegexData : public ACLData { @@ -52,7 +51,7 @@ virtual ACLData *clone() const; private: - relist *data; + RegexList *data; }; MEMPROXY_CLASS_INLINE(ACLRegexData); === modified file 'src/adaptation/icap/Config.cc' --- src/adaptation/icap/Config.cc 2012-09-01 14:38:36 +0000 +++ src/adaptation/icap/Config.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "adaptation/icap/ServiceRep.h" #include "HttpRequest.h" #include "HttpReply.h" +#include "SquidConfig.h" #include "wordlist.h" Adaptation::Icap::Config Adaptation::Icap::TheConfig; === modified file 'src/adaptation/icap/ServiceRep.cc' --- src/adaptation/icap/ServiceRep.cc 2012-08-31 16:57:39 +0000 +++ src/adaptation/icap/ServiceRep.cc 2012-09-04 09:10:20 +0000 @@ -17,6 +17,7 @@ #include "globals.h" #include "HttpReply.h" #include "ip/tools.h" +#include "SquidConfig.h" #include "SquidTime.h" CBDATA_NAMESPACED_CLASS_INIT(Adaptation::Icap, ServiceRep); === modified file 'src/adaptation/icap/Xaction.cc' --- src/adaptation/icap/Xaction.cc 2012-08-31 16:57:39 +0000 +++ src/adaptation/icap/Xaction.cc 2012-09-04 09:10:20 +0000 @@ -24,6 +24,7 @@ #include "ipcache.h" #include "Mem.h" #include "pconn.h" +#include "SquidConfig.h" #include "SquidTime.h" //CBDATA_NAMESPACED_CLASS_INIT(Adaptation::Icap, Xaction); === modified file 'src/adaptation/icap/icap_log.cc' --- src/adaptation/icap/icap_log.cc 2012-08-14 11:53:07 +0000 +++ src/adaptation/icap/icap_log.cc 2012-09-06 13:29:14 +0000 @@ -1,15 +1,17 @@ #include "squid.h" #include "icap_log.h" #include "AccessLogEntry.h" +#include "log/CustomLog.h" #include "log/File.h" #include "log/Formats.h" +#include "SquidConfig.h" int IcapLogfileStatus = LOG_DISABLE; void icapLogOpen() { - customlog *log; + CustomLog *log; for (log = Config.Log.icaplogs; log; log = log->next) { if (log->type == Log::Format::CLF_NONE) @@ -24,7 +26,7 @@ void icapLogClose() { - customlog *log; + CustomLog *log; for (log = Config.Log.icaplogs; log; log = log->next) { if (log->logfile) { @@ -37,7 +39,7 @@ void icapLogRotate() { - for (customlog* log = Config.Log.icaplogs; log; log = log->next) { + for (CustomLog* log = Config.Log.icaplogs; log; log = log->next) { if (log->logfile) { logfileRotate(log->logfile); } === modified file 'src/auth/Acl.cc' --- src/auth/Acl.cc 2012-08-14 11:53:07 +0000 +++ src/auth/Acl.cc 2012-09-12 17:01:17 +0000 @@ -24,17 +24,17 @@ if (NULL == request) { fatal ("requiresRequest SHOULD have been true for this ACL!!"); return ACCESS_DENIED; - } else if (request->flags.sslBumped) { + } else if (request->flags.sslBumped()) { debugs(28, 5, "SslBumped request: It is an encapsulated request do not authenticate"); checklist->auth_user_request = checklist->conn() != NULL ? checklist->conn()->auth_user_request : request->auth_user_request; if (checklist->auth_user_request != NULL) return ACCESS_ALLOWED; else return ACCESS_DENIED; - } else if (request->flags.accelerated) { + } else if (request->flags.accelerated()) { /* WWW authorization on accelerated requests */ headertype = HDR_AUTHORIZATION; - } else if (request->flags.intercepted || request->flags.spoof_client_ip) { + } else if (request->flags.intercepted() || request->flags.spoofClientIp()) { debugs(28, DBG_IMPORTANT, "NOTICE: Authentication not applicable on intercepted requests."); return ACCESS_DENIED; } else { === modified file 'src/auth/User.cc' --- src/auth/User.cc 2012-09-01 14:38:36 +0000 +++ src/auth/User.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "acl/Gadgets.h" #include "event.h" #include "globals.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" === modified file 'src/auth/basic/User.cc' --- src/auth/basic/User.cc 2012-08-14 11:53:07 +0000 +++ src/auth/basic/User.cc 2012-09-04 09:10:20 +0000 @@ -2,6 +2,7 @@ #include "auth/basic/auth_basic.h" #include "auth/basic/User.h" #include "Debug.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "structs.h" === modified file 'src/auth/digest/User.cc' --- src/auth/digest/User.cc 2012-08-14 11:53:07 +0000 +++ src/auth/digest/User.cc 2012-09-04 09:10:20 +0000 @@ -3,6 +3,7 @@ #include "auth/digest/User.h" #include "Debug.h" #include "dlink.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "structs.h" === modified file 'src/auth/digest/auth_digest.cc' --- src/auth/digest/auth_digest.cc 2012-09-01 14:38:36 +0000 +++ src/auth/digest/auth_digest.cc 2012-09-04 13:09:04 +0000 @@ -91,6 +91,7 @@ {"response", (http_hdr_type)DIGEST_RESPONSE}, }; +class HttpHeaderFieldInfo; static HttpHeaderFieldInfo *DigestFieldsInfo = NULL; /* === modified file 'src/auth/negotiate/UserRequest.cc' --- src/auth/negotiate/UserRequest.cc 2012-08-31 16:57:39 +0000 +++ src/auth/negotiate/UserRequest.cc 2012-09-13 11:40:32 +0000 @@ -286,8 +286,8 @@ ++arg; } safe_free(lm_request->server_blob); - lm_request->request->flags.must_keepalive = 1; - if (lm_request->request->flags.proxy_keepalive) { + lm_request->request->flags.setMustKeepalive(); + if (lm_request->request->flags.proxyKeepalive()) { lm_request->server_blob = xstrdup(blob); auth_user_request->user()->credentials(Auth::Handshake); auth_user_request->denyMessage("Authentication in progress"); === modified file 'src/auth/negotiate/auth_negotiate.cc' --- src/auth/negotiate/auth_negotiate.cc 2012-09-01 14:38:36 +0000 +++ src/auth/negotiate/auth_negotiate.cc 2012-09-13 11:40:32 +0000 @@ -218,7 +218,7 @@ return; /* Need keep-alive */ - if (!request->flags.proxy_keepalive && request->flags.must_keepalive) + if (!request->flags.proxyKeepalive() && request->flags.mustKeepalive()) return; /* New request, no user details */ @@ -229,7 +229,7 @@ if (!keep_alive) { /* drop the connection */ rep->header.delByName("keep-alive"); - request->flags.proxy_keepalive = 0; + request->flags.clearProxyKeepalive(); } } else { Auth::Negotiate::UserRequest *negotiate_request = dynamic_cast(auth_user_request.getRaw()); @@ -241,7 +241,7 @@ /* here it makes sense to drop the connection, as auth is * tied to it, even if MAYBE the client could handle it - Kinkie */ rep->header.delByName("keep-alive"); - request->flags.proxy_keepalive = 0; + request->flags.clearProxyKeepalive(); /* fall through */ case Auth::Ok: === modified file 'src/auth/ntlm/UserRequest.cc' --- src/auth/ntlm/UserRequest.cc 2012-08-14 11:53:07 +0000 +++ src/auth/ntlm/UserRequest.cc 2012-09-13 11:40:32 +0000 @@ -269,8 +269,8 @@ if (strncasecmp(reply, "TT ", 3) == 0) { /* we have been given a blob to send to the client */ safe_free(lm_request->server_blob); - lm_request->request->flags.must_keepalive = 1; - if (lm_request->request->flags.proxy_keepalive) { + lm_request->request->flags.setMustKeepalive(); + if (lm_request->request->flags.proxyKeepalive()) { lm_request->server_blob = xstrdup(blob); auth_user_request->user()->credentials(Auth::Handshake); auth_user_request->denyMessage("Authentication in progress"); === modified file 'src/auth/ntlm/auth_ntlm.cc' --- src/auth/ntlm/auth_ntlm.cc 2012-09-01 14:38:36 +0000 +++ src/auth/ntlm/auth_ntlm.cc 2012-09-13 11:40:32 +0000 @@ -205,7 +205,7 @@ return; /* Need keep-alive */ - if (!request->flags.proxy_keepalive && request->flags.must_keepalive) + if (!request->flags.proxyKeepalive() && request->flags.mustKeepalive()) return; /* New request, no user details */ @@ -215,7 +215,7 @@ if (!keep_alive) { /* drop the connection */ - request->flags.proxy_keepalive = 0; + request->flags.clearProxyKeepalive(); } } else { Auth::Ntlm::UserRequest *ntlm_request = dynamic_cast(auth_user_request.getRaw()); @@ -226,7 +226,7 @@ case Auth::Failed: /* here it makes sense to drop the connection, as auth is * tied to it, even if MAYBE the client could handle it - Kinkie */ - request->flags.proxy_keepalive = 0; + request->flags.clearProxyKeepalive(); /* fall through */ case Auth::Ok: === modified file 'src/cache_cf.cc' --- src/cache_cf.cc 2012-09-01 14:38:36 +0000 +++ src/cache_cf.cc 2012-09-18 14:06:31 +0000 @@ -32,11 +32,16 @@ #include "squid.h" #include "acl/Acl.h" +#include "acl/AclAddress.h" +#include "acl/AclDenyInfoList.h" +#include "acl/AclNameList.h" #include "acl/Gadgets.h" #include "acl/MethodData.h" #include "anyp/PortCfg.h" #include "AuthReg.h" #include "base/RunnersRegistry.h" +#include "mgr/ActionPasswordList.h" +#include "CachePeer.h" #include "cache_cf.h" #include "ConfigParser.h" #include "CpuAffinityMap.h" @@ -53,12 +58,15 @@ #include "ip/tools.h" #include "ipc/Kids.h" #include "log/Config.h" +#include "log/CustomLog.h" #include "Mem.h" #include "MemBuf.h" #include "mgr/Registration.h" #include "Parsing.h" #include "PeerDigest.h" +#include "RefreshPattern.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidString.h" #include "Store.h" #include "StoreFileSystem.h" @@ -148,7 +156,7 @@ static peer_t parseNeighborType(const char *s); -CBDATA_TYPE(peer); +CBDATA_TYPE(CachePeer); static const char *const T_MILLISECOND_STR = "millisecond"; static const char *const T_SECOND_STR = "second"; @@ -168,14 +176,14 @@ static const char *const list_sep = ", \t\n\r"; -static void parse_access_log(customlog ** customlog_definitions); -static int check_null_access_log(customlog *customlog_definitions); -static void dump_access_log(StoreEntry * entry, const char *name, customlog * definitions); -static void free_access_log(customlog ** definitions); +static void parse_access_log(CustomLog ** customlog_definitions); +static int check_null_access_log(CustomLog *customlog_definitions); +static void dump_access_log(StoreEntry * entry, const char *name, CustomLog * definitions); +static void free_access_log(CustomLog ** definitions); static void update_maxobjsize(void); static void configDoConfigure(void); -static void parse_refreshpattern(refresh_t **); +static void parse_refreshpattern(RefreshPattern **); static uint64_t parseTimeUnits(const char *unit, bool allowMsec); static void parseTimeLine(time_msec_t * tptr, const char *units, bool allowMsec); static void parse_u_short(unsigned short * var); @@ -208,9 +216,9 @@ static void dump_HeaderWithAclList(StoreEntry * entry, const char *name, HeaderWithAclList *headers); static void parse_HeaderWithAclList(HeaderWithAclList **header); static void free_HeaderWithAclList(HeaderWithAclList **header); -static void parse_denyinfo(acl_deny_info_list ** var); -static void dump_denyinfo(StoreEntry * entry, const char *name, acl_deny_info_list * var); -static void free_denyinfo(acl_deny_info_list ** var); +static void parse_denyinfo(AclDenyInfoList ** var); +static void dump_denyinfo(StoreEntry * entry, const char *name, AclDenyInfoList * var); +static void free_denyinfo(AclDenyInfoList ** var); #if USE_WCCPv2 static void parse_IpAddress_list(Ip::Address_list **); @@ -759,7 +767,7 @@ #if USE_HTTP_VIOLATIONS { - const refresh_t *R; + const RefreshPattern *R; for (R = Config.Refresh; R; R = R->next) { if (!R->flags.override_expire) @@ -918,7 +926,7 @@ Config.ssl_client.sslContext = sslCreateClientContext(Config.ssl_client.cert, Config.ssl_client.key, Config.ssl_client.version, Config.ssl_client.cipher, Config.ssl_client.options, Config.ssl_client.flags, Config.ssl_client.cafile, Config.ssl_client.capath, Config.ssl_client.crlfile); - for (peer *p = Config.peers; p != NULL; p = p->next) { + for (CachePeer *p = Config.peers; p != NULL; p = p->next) { if (p->use_ssl) { debugs(3, DBG_IMPORTANT, "Initializing cache_peer " << p->name << " SSL context"); p->sslContext = sslCreateClientContext(p->sslcert, p->sslkey, p->sslversion, p->sslcipher, p->ssloptions, p->sslflags, p->sslcafile, p->sslcapath, p->sslcrlfile); @@ -1360,13 +1368,13 @@ addr->SetEmpty(); } -CBDATA_TYPE(acl_address); +CBDATA_TYPE(AclAddress); static void -dump_acl_address(StoreEntry * entry, const char *name, acl_address * head) +dump_acl_address(StoreEntry * entry, const char *name, AclAddress * head) { char buf[MAX_IPSTRLEN]; - acl_address *l; + AclAddress *l; for (l = head; l; l = l->next) { if (!l->addr.IsAnyAddr()) @@ -1383,17 +1391,17 @@ static void freed_acl_address(void *data) { - acl_address *l = static_cast(data); + AclAddress *l = static_cast(data); aclDestroyAclList(&l->aclList); } static void -parse_acl_address(acl_address ** head) +parse_acl_address(AclAddress ** head) { - acl_address *l; - acl_address **tail = head; /* sane name below */ - CBDATA_INIT_TYPE_FREECB(acl_address, freed_acl_address); - l = cbdataAlloc(acl_address); + AclAddress *l; + AclAddress **tail = head; /* sane name below */ + CBDATA_INIT_TYPE_FREECB(AclAddress, freed_acl_address); + l = cbdataAlloc(AclAddress); parse_address(&l->addr); aclParseAclList(LegacyParser, &l->aclList); @@ -1404,10 +1412,10 @@ } static void -free_acl_address(acl_address ** head) +free_acl_address(AclAddress ** head) { while (*head) { - acl_address *l = *head; + AclAddress *l = *head; *head = l->next; cbdataFree(l); } @@ -1965,7 +1973,7 @@ } static void -dump_peer(StoreEntry * entry, const char *name, peer * p) +dump_peer(StoreEntry * entry, const char *name, CachePeer * p) { domain_ping *d; domain_type *t; @@ -2065,12 +2073,12 @@ } static void -parse_peer(peer ** head) +parse_peer(CachePeer ** head) { char *token = NULL; - peer *p; - CBDATA_INIT_TYPE_FREECB(peer, peerDestroy); - p = cbdataAlloc(peer); + CachePeer *p; + CBDATA_INIT_TYPE_FREECB(CachePeer, peerDestroy); + p = cbdataAlloc(CachePeer); p->http_port = CACHE_HTTP_PORT; p->icp.port = CACHE_ICP_PORT; p->weight = 1; @@ -2344,9 +2352,9 @@ } static void -free_peer(peer ** P) +free_peer(CachePeer ** P) { - peer *p; + CachePeer *p; while ((p = *P) != NULL) { *P = p->next; @@ -2362,7 +2370,7 @@ } static void -dump_cachemgrpasswd(StoreEntry * entry, const char *name, cachemgr_passwd * list) +dump_cachemgrpasswd(StoreEntry * entry, const char *name, Mgr::ActionPasswordList * list) { wordlist *w; @@ -2382,15 +2390,15 @@ } static void -parse_cachemgrpasswd(cachemgr_passwd ** head) +parse_cachemgrpasswd(Mgr::ActionPasswordList ** head) { char *passwd = NULL; wordlist *actions = NULL; - cachemgr_passwd *p; - cachemgr_passwd **P; + Mgr::ActionPasswordList *p; + Mgr::ActionPasswordList **P; parse_string(&passwd); parse_wordlist(&actions); - p = static_cast(xcalloc(1, sizeof(cachemgr_passwd))); + p = new Mgr::ActionPasswordList; p->passwd = passwd; p->actions = actions; @@ -2399,7 +2407,7 @@ * See if any of the actions from this line already have a * password from previous lines. The password checking * routines in cache_manager.c take the the password from - * the first cachemgr_passwd struct that contains the + * the first Mgr::ActionPasswordList that contains the * requested action. Thus, we should warn users who might * think they can have two passwords for the same action. */ @@ -2420,9 +2428,9 @@ } static void -free_cachemgrpasswd(cachemgr_passwd ** head) +free_cachemgrpasswd(Mgr::ActionPasswordList ** head) { - cachemgr_passwd *p; + Mgr::ActionPasswordList *p; while ((p = *head) != NULL) { *head = p->next; @@ -2433,9 +2441,9 @@ } static void -dump_denyinfo(StoreEntry * entry, const char *name, acl_deny_info_list * var) +dump_denyinfo(StoreEntry * entry, const char *name, AclDenyInfoList * var) { - acl_name_list *a; + AclNameList *a; while (var != NULL) { storeAppendPrintf(entry, "%s %s", name, var->err_page_name); @@ -2450,18 +2458,18 @@ } static void -parse_denyinfo(acl_deny_info_list ** var) +parse_denyinfo(AclDenyInfoList ** var) { aclParseDenyInfoLine(var); } void -free_denyinfo(acl_deny_info_list ** list) +free_denyinfo(AclDenyInfoList ** list) { - acl_deny_info_list *a = NULL; - acl_deny_info_list *a_next = NULL; - acl_name_list *l = NULL; - acl_name_list *l_next = NULL; + AclDenyInfoList *a = NULL; + AclDenyInfoList *a_next = NULL; + AclNameList *l = NULL; + AclNameList *l_next = NULL; for (a = *list; a; a = a_next) { for (l = a->acl_list; l; l = l_next) { @@ -2482,7 +2490,7 @@ parse_peer_access(void) { char *host = NULL; - peer *p; + CachePeer *p; if (!(host = strtok(NULL, w_space))) self_destruct(); @@ -2507,7 +2515,7 @@ while ((domain = strtok(NULL, list_sep))) { domain_ping *l = NULL; domain_ping **L = NULL; - peer *p; + CachePeer *p; if ((p = peerFindByName(host)) == NULL) { debugs(15, DBG_CRITICAL, "" << cfg_filename << ", line " << config_lineno << ": No cache_peer '" << host << "'"); @@ -2545,7 +2553,7 @@ while ((domain = strtok(NULL, list_sep))) { domain_type *l = NULL; domain_type **L = NULL; - peer *p; + CachePeer *p; if ((p = peerFindByName(host)) == NULL) { debugs(15, DBG_CRITICAL, "" << cfg_filename << ", line " << config_lineno << ": No cache_peer '" << host << "'"); @@ -2637,7 +2645,7 @@ #define free_tristate free_int static void -dump_refreshpattern(StoreEntry * entry, const char *name, refresh_t * head) +dump_refreshpattern(StoreEntry * entry, const char *name, RefreshPattern * head) { while (head != NULL) { storeAppendPrintf(entry, "%s%s %s %d %d%% %d", @@ -2695,7 +2703,7 @@ } static void -parse_refreshpattern(refresh_t ** head) +parse_refreshpattern(RefreshPattern ** head) { char *token; char *pattern; @@ -2720,7 +2728,7 @@ #endif int i; - refresh_t *t; + RefreshPattern *t; regex_t comp; int errcode; int flags = REG_EXTENDED | REG_NOSUB; @@ -2825,7 +2833,7 @@ pct = pct < 0.0 ? 0.0 : pct; max = max < 0 ? 0 : max; - t = static_cast(xcalloc(1, sizeof(refresh_t))); + t = static_cast(xcalloc(1, sizeof(RefreshPattern))); t->pattern = (char *) xstrdup(pattern); t->compiled_pattern = comp; t->min = min; @@ -2885,9 +2893,9 @@ } static void -free_refreshpattern(refresh_t ** head) +free_refreshpattern(RefreshPattern ** head) { - refresh_t *t; + RefreshPattern *t; while ((t = *head) != NULL) { *head = t->next; @@ -3294,18 +3302,6 @@ storeAppendPrintf(entry, "\n"); } -void -YesNoNone::configure(bool beSet) -{ - option = beSet ? +1 : -1; -} - -YesNoNone::operator void*() const -{ - assert(option != 0); // must call configure() first - return option > 0 ? (void*)this : NULL; -} - inline void free_YesNoNone(YesNoNone *) { @@ -3981,11 +3977,11 @@ #include "AccessLogEntry.h" static void -parse_access_log(customlog ** logs) +parse_access_log(CustomLog ** logs) { const char *filename, *logdef_name; - customlog *cl = (customlog *)xcalloc(1, sizeof(*cl)); + CustomLog *cl = (CustomLog *)xcalloc(1, sizeof(*cl)); if ((filename = strtok(NULL, w_space)) == NULL) { self_destruct(); @@ -4055,15 +4051,15 @@ } static int -check_null_access_log(customlog *customlog_definitions) +check_null_access_log(CustomLog *customlog_definitions) { return customlog_definitions == NULL; } static void -dump_access_log(StoreEntry * entry, const char *name, customlog * logs) +dump_access_log(StoreEntry * entry, const char *name, CustomLog * logs) { - customlog *log; + CustomLog *log; for (log = logs; log; log = log->next) { storeAppendPrintf(entry, "%s ", name); @@ -4115,10 +4111,10 @@ } static void -free_access_log(customlog ** definitions) +free_access_log(CustomLog ** definitions) { while (*definitions) { - customlog *log = *definitions; + CustomLog *log = *definitions; *definitions = log->next; log->logFormat = NULL; === modified file 'src/cache_manager.cc' --- src/cache_manager.cc 2012-09-03 08:42:58 +0000 +++ src/cache_manager.cc 2012-09-18 14:06:31 +0000 @@ -32,6 +32,7 @@ #include "squid.h" #include "base/TextException.h" +#include "mgr/ActionPasswordList.h" #include "CacheManager.h" #include "comm/Connection.h" #include "Debug.h" @@ -49,6 +50,7 @@ #include "mgr/QueryParams.h" #include "protos.h" #include "tools.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "wordlist.h" @@ -458,12 +460,12 @@ } /* - \ingroup CacheManagerInternal + * \ingroup CacheManagerInternal * gets from the global Config the password the user would need to supply * for the action she queried */ char * -CacheManager::PasswdGet(cachemgr_passwd * a, const char *action) +CacheManager::PasswdGet(Mgr::ActionPasswordList * a, const char *action) { wordlist *w; === modified file 'src/carp.cc' --- src/carp.cc 2012-09-01 14:38:36 +0000 +++ src/carp.cc 2012-09-04 15:15:51 +0000 @@ -33,9 +33,11 @@ */ #include "squid.h" +#include "CachePeer.h" #include "HttpRequest.h" #include "mgr/Registration.h" #include "neighbors.h" +#include "SquidConfig.h" #include "Store.h" #include "URL.h" #include "URLScheme.h" @@ -47,14 +49,14 @@ #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) static int n_carp_peers = 0; -static peer **carp_peers = NULL; +static CachePeer **carp_peers = NULL; static OBJH carpCachemgr; static int peerSortWeight(const void *a, const void *b) { - const peer *const *p1 = (const peer *const *)a; - const peer *const *p2 = (const peer *const *)b; + const CachePeer *const *p1 = (const CachePeer *const *)a; + const CachePeer *const *p2 = (const CachePeer *const *)b; return (*p1)->weight - (*p2)->weight; } @@ -71,8 +73,8 @@ int K; int k; double P_last, X_last, Xn; - peer *p; - peer **P; + CachePeer *p; + CachePeer **P; char *t; /* Clean up */ @@ -105,7 +107,7 @@ if (n_carp_peers == 0) return; - carp_peers = (peer **)xcalloc(n_carp_peers, sizeof(*carp_peers)); + carp_peers = (CachePeer **)xcalloc(n_carp_peers, sizeof(*carp_peers)); /* Build a list of the found peers and calculate hashes and load factors */ for (P = carp_peers, p = Config.peers; p; p = p->next) { @@ -167,12 +169,12 @@ } } -peer * +CachePeer * carpSelectParent(HttpRequest * request) { int k; - peer *p = NULL; - peer *tp; + CachePeer *p = NULL; + CachePeer *tp; unsigned int user_hash = 0; unsigned int combined_hash; double score; @@ -184,7 +186,7 @@ /* calculate hash key */ debugs(39, 2, "carpSelectParent: Calculating hash for " << urlCanonical(request)); - /* select peer */ + /* select CachePeer */ for (k = 0; k < n_carp_peers; ++k) { String key; tp = carp_peers[k]; @@ -250,7 +252,7 @@ static void carpCachemgr(StoreEntry * sentry) { - peer *p; + CachePeer *p; int sumfetches = 0; storeAppendPrintf(sentry, "%24s %10s %10s %10s %10s\n", "Hostname", === modified file 'src/carp.h' --- src/carp.h 2012-08-29 00:12:28 +0000 +++ src/carp.h 2012-09-04 14:38:44 +0000 @@ -33,10 +33,10 @@ #ifndef SQUID_CARP_H_ #define SQUID_CARP_H_ -class peer; +class CachePeer; class HttpRequest; extern void carpInit(void); -extern peer *carpSelectParent(HttpRequest *); +extern CachePeer *carpSelectParent(HttpRequest *); #endif /* SQUID_CARP_H_ */ === modified file 'src/client_db.cc' --- src/client_db.cc 2012-09-01 14:38:36 +0000 +++ src/client_db.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "log/access_log.h" #include "Mem.h" #include "mgr/Registration.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "SquidTime.h" #include "StatCounters.h" === modified file 'src/client_side.cc' --- src/client_side.cc 2012-09-09 17:13:42 +0000 +++ src/client_side.cc 2012-09-13 11:40:32 +0000 @@ -83,6 +83,7 @@ #include "anyp/PortCfg.h" #include "base/Subscription.h" #include "base/TextException.h" +#include "CachePeer.h" #include "ChunkedCodingParser.h" #include "client_db.h" #include "client_side_reply.h" @@ -120,6 +121,7 @@ #include "mime_header.h" #include "profiler/Profiler.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "StatHist.h" @@ -847,7 +849,10 @@ RequestMethodStr(request->method)); // TODO: move to HttpRequest::hdrCacheInit, just like HttpReply. - request->flags.proxy_keepalive = request->persistent() ? 1 : 0; + if (request->persistent()) + request->flags.setProxyKeepalive(); + else + request->flags.clearProxyKeepalive(); } static int @@ -983,7 +988,7 @@ { assert(rep == NULL); - if (!multipartRangeRequest() && !http->request->flags.chunked_reply) { + if (!multipartRangeRequest() && !http->request->flags.isReplyChunked()) { size_t length = lengthToSend(bodyData.range()); noteSentBodyBytes (length); AsyncCall::Pointer call = commCbCall(33, 5, "clientWriteBodyComplete", @@ -1267,7 +1272,7 @@ else if (rep->content_length != http->memObject()->getReply()->content_length) range_err = "INCONSISTENT length"; /* a bug? */ - /* hits only - upstream peer determines correct behaviour on misses, and client_side_reply determines + /* hits only - upstream CachePeer determines correct behaviour on misses, and client_side_reply determines * hits candidates */ else if (logTypeIsATcpHit(http->logType) && http->request->header.has(HDR_IF_RANGE) && !clientIfRangeMatch(http, rep)) @@ -1392,7 +1397,7 @@ if (bodyData.data && bodyData.length) { if (multipartRangeRequest()) packRange(bodyData, mb); - else if (http->request->flags.chunked_reply) { + else if (http->request->flags.isReplyChunked()) { packChunk(bodyData, *mb); } else { size_t length = lengthToSend(bodyData.range()); @@ -1447,8 +1452,9 @@ // After sending Transfer-Encoding: chunked (at least), always send // the last-chunk if there was no error, ignoring responseFinishedOrFailed. - const bool mustSendLastChunk = http->request->flags.chunked_reply && - !http->request->flags.stream_error && !context->startOfOutput(); + const bool mustSendLastChunk = http->request->flags.isReplyChunked() && + !http->request->flags.hadStreamError() && + !context->startOfOutput(); if (responseFinishedOrFailed(rep, receivedData) && !mustSendLastChunk) { context->writeComplete(context->clientConnection, NULL, 0, COMM_OK); PROF_stop(clientSocketRecipient); @@ -1736,7 +1742,7 @@ debugs(33, 5, HERE << "Range request at end of returnable " << "range sequence on " << clientConnection); - if (http->request->flags.proxy_keepalive) + if (http->request->flags.proxyKeepalive()) return STREAM_COMPLETE; else return STREAM_UNPLANNED_COMPLETE; @@ -1753,7 +1759,7 @@ // did we get at least what we expected, based on range specs? if (bytesSent == bytesExpected) { // got everything - if (http->request->flags.proxy_keepalive) + if (http->request->flags.proxyKeepalive()) return STREAM_COMPLETE; else return STREAM_UNPLANNED_COMPLETE; @@ -1763,7 +1769,7 @@ // expected why would persistency matter? Should not this // always be an error? if (bytesSent > bytesExpected) { // got extra - if (http->request->flags.proxy_keepalive) + if (http->request->flags.proxyKeepalive()) return STREAM_COMPLETE; else return STREAM_UNPLANNED_COMPLETE; @@ -2469,7 +2475,7 @@ // at the client-side, but many such errors do require closure and the // client-side code is bad at handling errors so we play it safe. if (request) - request->flags.proxy_keepalive = 0; + request->flags.clearProxyKeepalive(); flags.readMore = false; debugs(33,4, HERE << "Will close after error: " << clientConnection); } @@ -2649,15 +2655,19 @@ request->clientConnectionManager = conn; - request->flags.accelerated = http->flags.accel; - request->flags.sslBumped = conn->switchedToHttps(); - request->flags.canRePin = request->flags.sslBumped && conn->pinning.pinned; - request->flags.ignore_cc = conn->port->ignore_cc; + if (http->flags.accel) + request->flags.markAccelerated(); + request->flags.setSslBumped(conn->switchedToHttps()); + if (request->flags.sslBumped() && conn->pinning.pinned) + request->flags.allowRepinning(); + if (conn->port->ignore_cc) + request->flags.ignoreCacheControl(); // TODO: decouple http->flags.accel from request->flags.sslBumped - request->flags.no_direct = (request->flags.accelerated && !request->flags.sslBumped) ? - !conn->port->allow_direct : 0; + if (request->flags.accelerated() && !request->flags.sslBumped()) + if (!conn->port->allow_direct) + request->flags.setNoDirect(); #if USE_AUTH - if (request->flags.sslBumped) { + if (request->flags.sslBumped()) { if (conn->auth_user_request != NULL) request->auth_user_request = conn->auth_user_request; } @@ -2668,8 +2678,10 @@ * from the port settings to the request. */ if (http->clientConnection != NULL) { - request->flags.intercepted = ((http->clientConnection->flags & COMM_INTERCEPTION) != 0); - request->flags.spoof_client_ip = ((http->clientConnection->flags & COMM_TRANSPARENT) != 0 ) ; + if ((http->clientConnection->flags & COMM_INTERCEPTION) != 0) + request->flags.markIntercepted(); + if ((http->clientConnection->flags & COMM_TRANSPARENT) != 0 ) + request->flags.setSpoofClientIp(); } if (internalCheck(request->urlpath.termedBuf())) { @@ -2688,7 +2700,8 @@ request->login[0] = '\0'; } - request->flags.internal = http->flags.internal; + if (http->flags.internal) + request->flags.markInternal(); setLogUri (http, urlCanonicalClean(request)); request->client_addr = conn->clientConnection->remote; // XXX: remove reuest->client_addr member. #if FOLLOW_X_FORWARDED_FOR @@ -3146,7 +3159,7 @@ repContext->setReplyToError(error, scode, repContext->http->request->method, repContext->http->uri, - peer, + CachePeer, repContext->http->request, in.buf, NULL); context->pullData(); @@ -3215,7 +3228,7 @@ clientReplyContext *repContext = dynamic_cast(node->data.getRaw()); assert (repContext); repContext->setReplyToError(ERR_LIFETIME_EXP, - HTTP_REQUEST_TIMEOUT, METHOD_NONE, "N/A", &peer.sin_addr, + HTTP_REQUEST_TIMEOUT, METHOD_NONE, "N/A", &CachePeer.sin_addr, NULL, NULL, NULL); /* No requests can be outstanded */ assert(chr == NULL); @@ -3578,8 +3591,10 @@ fakeRequest->indirect_client_addr = connState->clientConnection->remote; #endif fakeRequest->my_addr = connState->clientConnection->local; - fakeRequest->flags.spoof_client_ip = ((connState->clientConnection->flags & COMM_TRANSPARENT) != 0 ) ; - fakeRequest->flags.intercepted = ((connState->clientConnection->flags & COMM_INTERCEPTION) != 0); + if ((connState->clientConnection->flags & COMM_TRANSPARENT) != 0) + fakeRequest->flags.setSpoofClientIp(); + if ((connState->clientConnection->flags & COMM_INTERCEPTION) != 0) + fakeRequest->flags.markIntercepted(); debugs(33, 4, HERE << details << " try to generate a Dynamic SSL CTX"); connState->switchToHttps(fakeRequest, bumpMode); } @@ -3889,7 +3904,7 @@ // commSetConnTimeout() was called for this request before we switched. - // Disable the client read handler until peer selection is complete + // Disable the client read handler until CachePeer selection is complete Comm::SetSelect(clientConnection->fd, COMM_SELECT_READ, NULL, NULL, 0); Comm::SetSelect(clientConnection->fd, COMM_SELECT_READ, clientNegotiateSSL, this, 0); switchedToHttps_ = true; @@ -3911,7 +3926,7 @@ // and now want to switch to SSL to send the error to the client // without even peeking at the origin server certificate. if (bumpServerMode == Ssl::bumpServerFirst && !sslServerBump) { - request->flags.sslPeek = 1; + request->flags.setSslPeek(); sslServerBump = new Ssl::ServerBump(request); // will call httpsPeeked() with certificate and connection, eventually @@ -4416,7 +4431,7 @@ } void -ConnStateData::pinConnection(const Comm::ConnectionPointer &pinServer, HttpRequest *request, struct peer *aPeer, bool auth) +ConnStateData::pinConnection(const Comm::ConnectionPointer &pinServer, HttpRequest *request, CachePeer *aPeer, bool auth) { char desc[FD_DESC_SZ]; @@ -4462,7 +4477,7 @@ } const Comm::ConnectionPointer -ConnStateData::validatePinnedConnection(HttpRequest *request, const struct peer *aPeer) +ConnStateData::validatePinnedConnection(HttpRequest *request, const CachePeer *aPeer) { debugs(33, 7, HERE << pinning.serverConnection); === modified file 'src/client_side.h' --- src/client_side.h 2012-08-29 07:29:35 +0000 +++ src/client_side.h 2012-09-04 14:38:44 +0000 @@ -259,7 +259,7 @@ int port; /* port of pinned connection */ bool pinned; /* this connection was pinned */ bool auth; /* pinned for www authentication */ - struct peer *peer; /* peer the connection goes via */ + CachePeer *peer; /* CachePeer the connection goes via */ AsyncCall::Pointer closeHandler; /*The close handler for pinned server side connection*/ } pinning; @@ -290,23 +290,23 @@ /** * Correlate the current ConnStateData object with the pinning_fd socket descriptor. */ - void pinConnection(const Comm::ConnectionPointer &pinServerConn, HttpRequest *request, struct peer *peer, bool auth); + void pinConnection(const Comm::ConnectionPointer &pinServerConn, HttpRequest *request, CachePeer *peer, bool auth); /** - * Decorrelate the ConnStateData object from its pinned peer + * Decorrelate the ConnStateData object from its pinned CachePeer */ void unpinConnection(); /** * Checks if there is pinning info if it is valid. It can close the server side connection * if pinned info is not valid. \param request if it is not NULL also checks if the pinning info refers to the request client side HttpRequest - \param peer if it is not NULL also check if the peer is the pinning peer + \param CachePeer if it is not NULL also check if the CachePeer is the pinning CachePeer \return The details of the server side connection (may be closed if failures were present). */ - const Comm::ConnectionPointer validatePinnedConnection(HttpRequest *request, const struct peer *peer); + const Comm::ConnectionPointer validatePinnedConnection(HttpRequest *request, const CachePeer *peer); /** - * returts the pinned peer if exists, NULL otherwise + * returts the pinned CachePeer if exists, NULL otherwise */ - struct peer *pinnedPeer() const {return pinning.peer;} + CachePeer *pinnedPeer() const {return pinning.peer;} bool pinnedAuth() const {return pinning.auth;} // pining related comm callbacks === modified file 'src/client_side_reply.cc' --- src/client_side_reply.cc 2012-09-13 06:56:05 +0000 +++ src/client_side_reply.cc 2012-09-13 16:20:41 +0000 @@ -54,6 +54,8 @@ #include "mime_header.h" #include "neighbors.h" #include "refresh.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "StoreClient.h" @@ -127,11 +129,11 @@ { if (errstate->httpStatus == HTTP_NOT_IMPLEMENTED && http->request) /* prevent confusion over whether we default to persistent or not */ - http->request->flags.proxy_keepalive = 0; + http->request->flags.clearProxyKeepalive(); http->al->http.code = errstate->httpStatus; - createStoreEntry(method, request_flags()); + createStoreEntry(method, RequestFlags()); assert(errstate->callback_data == NULL); errorAppendEntry(http->storeEntry(), errstate); /* Now the caller reads to get this */ @@ -225,7 +227,7 @@ void clientReplyContext::startError(ErrorState * err) { - createStoreEntry(http->request->method, request_flags()); + createStoreEntry(http->request->method, RequestFlags()); triggerInitialStoreRead(); errorAppendEntry(http->storeEntry(), err); } @@ -271,7 +273,7 @@ return; } - http->request->flags.refresh = 1; + http->request->flags.setRefresh(); #if STORE_CLIENT_LIST_DEBUG /* Prevent a race with the store client memory free routines */ @@ -388,7 +390,7 @@ // origin replied 304 if (status == HTTP_NOT_MODIFIED) { http->logType = LOG_TCP_REFRESH_UNMODIFIED; - http->request->flags.stale_if_hit = 0; // old_entry is no longer stale + http->request->flags.clearStaleIfHit(); // old_entry is no longer stale // update headers on existing entry old_rep->updateOnNotModified(http->storeEntry()->getReply()); @@ -396,7 +398,7 @@ // if client sent IMS - if (http->request->flags.ims && !old_entry->modifiedSince(http->request)) { + if (http->request->flags.hasIMS() && !old_entry->modifiedSince(http->request)) { // forward the 304 from origin debugs(88, 3, "handleIMSReply: origin replied 304, revalidating existing entry and forwarding 304 to client"); sendClientUpstreamResponse(); @@ -417,7 +419,7 @@ } // origin replied with an error - else if (http->request->flags.fail_on_validation_err) { + else if (http->request->flags.failOnValidationError()) { http->logType = LOG_TCP_REFRESH_FAIL_ERR; debugs(88, 3, "handleIMSReply: origin replied with error " << status << ", forwarding to client due to fail_on_validation_err"); @@ -539,10 +541,7 @@ return; } - if (e->checkNegativeHit() -#if USE_HTTP_VIOLATIONS - && !r->flags.nocache_hack -#endif + if (e->checkNegativeHit() && !r->flags.noCacheHackEnabled() ) { http->logType = LOG_TCP_NEGATIVE_HIT; sendMoreData(result); @@ -558,7 +557,7 @@ * request. Otherwise two siblings could generate a loop if * both have a stale version of the object. */ - r->flags.need_validation = 1; + r->flags.setNeedValidation(); if (e->lastmod < 0) { /* @@ -567,7 +566,7 @@ */ http->logType = LOG_TCP_MISS; processMiss(); - } else if (r->flags.nocache) { + } else if (r->flags.noCache()) { /* * This did not match a refresh pattern that overrides no-cache * we should honour the client no-cache header. @@ -652,10 +651,10 @@ } /// Deny loops - if (r->flags.loopdetect) { + if (r->flags.loopDetect()) { http->al->http.code = HTTP_FORBIDDEN; err = clientBuildError(ERR_ACCESS_DENIED, HTTP_FORBIDDEN, NULL, http->getConn()->clientConnection->remote, http->request); - createStoreEntry(r->method, request_flags()); + createStoreEntry(r->method, RequestFlags()); errorAppendEntry(http->storeEntry(), err); triggerInitialStoreRead(); return; @@ -730,7 +729,7 @@ if (r.header.has(HDR_IF_NONE_MATCH)) { if (!e->hasIfNoneMatchEtag(r)) { // RFC 2616: ignore IMS if If-None-Match did not match - r.flags.ims = 0; + r.flags.clearIMS(); r.ims = -1; r.imslen = 0; r.header.delById(HDR_IF_MODIFIED_SINCE); @@ -739,7 +738,7 @@ return; } - if (!r.flags.ims) { + if (!r.flags.hasIMS()) { // RFC 2616: if If-None-Match matched and there is no IMS, // reply with 304 Not Modified or 412 Precondition Failed sendNotModifiedOrPreconditionFailedError(); @@ -750,7 +749,7 @@ matchedIfNoneMatch = true; } - if (r.flags.ims) { + if (r.flags.hasIMS()) { // handle If-Modified-Since requests from the client if (e->modifiedSince(&r)) { http->logType = LOG_TCP_IMS_HIT; @@ -993,7 +992,7 @@ /* FIXME: This doesn't need to go through the store. Simply * push down the client chain */ - createStoreEntry(http->request->method, request_flags()); + createStoreEntry(http->request->method, RequestFlags()); triggerInitialStoreRead(); @@ -1008,7 +1007,7 @@ { clientStreamNode *nextNode = (clientStreamNode *)node->node.next->data; StoreIOBuffer localTempBuffer; - createStoreEntry(http->request->method, request_flags()); + createStoreEntry(http->request->method, RequestFlags()); localTempBuffer.offset = nextNode->readBuffer.offset + headers_sz; localTempBuffer.length = nextNode->readBuffer.length; localTempBuffer.data = nextNode->readBuffer.data; @@ -1040,7 +1039,7 @@ if (http->flags.done_copying) return 1; - if (http->request->flags.chunked_reply && !flags.complete) { + if (http->request->flags.isReplyChunked() && !flags.complete) { // last-chunk was not sent return 0; } @@ -1184,7 +1183,7 @@ const int64_t expectedBodySize = http->storeEntry()->getReply()->bodySize(http->request->method); - if (!http->request->flags.proxy_keepalive && expectedBodySize < 0) { + if (!http->request->flags.proxyKeepalive() && expectedBodySize < 0) { debugs(88, 5, "clientReplyStatus: closing, content_length < 0"); return STREAM_FAILED; } @@ -1199,7 +1198,7 @@ return STREAM_UNPLANNED_COMPLETE; } - if (http->request->flags.proxy_keepalive) { + if (http->request->flags.proxyKeepalive()) { debugs(88, 5, "clientReplyStatus: stream complete and can keepalive"); return STREAM_COMPLETE; } @@ -1374,9 +1373,9 @@ } // add Warnings required by RFC 2616 if serving a stale hit - if (http->request->flags.stale_if_hit && logTypeIsATcpHit(http->logType)) { + if (http->request->flags.staleIfHit() && logTypeIsATcpHit(http->logType)) { hdr->putWarning(110, "Response is stale"); - if (http->request->flags.need_validation) + if (http->request->flags.validationNeeded()) hdr->putWarning(111, "Revalidation failed"); } @@ -1399,12 +1398,12 @@ || (strncasecmp(value, "Kerberos", 8) == 0 && (value[8] == '\0' || value[8] == ' '))) { - if (request->flags.connection_auth_disabled) { + if (request->flags.connectionAuthDisabled()) { hdr->delAt(pos, connection_auth_blocked); continue; } - request->flags.must_keepalive = 1; - if (!request->flags.accelerated && !request->flags.intercepted) { + request->flags.setMustKeepalive(); + if (!request->flags.accelerated() && !request->flags.intercepted()) { httpHeaderPutStrf(hdr, HDR_PROXY_SUPPORT, "Session-Based-Authentication"); /* We send "[Proxy-]Connection: Proxy-Support" header to mark @@ -1461,36 +1460,36 @@ (request->http_ver >= HttpVersion(1, 1)); /* Check whether we should send keep-alive */ - if (!Config.onoff.error_pconns && reply->sline.status >= 400 && !request->flags.must_keepalive) { + if (!Config.onoff.error_pconns && reply->sline.status >= 400 && !request->flags.mustKeepalive()) { debugs(33, 3, "clientBuildReplyHeader: Error, don't keep-alive"); - request->flags.proxy_keepalive = 0; - } else if (!Config.onoff.client_pconns && !request->flags.must_keepalive) { + request->flags.clearProxyKeepalive(); + } else if (!Config.onoff.client_pconns && !request->flags.mustKeepalive()) { debugs(33, 2, "clientBuildReplyHeader: Connection Keep-Alive not requested by admin or client"); - request->flags.proxy_keepalive = 0; - } else if (request->flags.proxy_keepalive && shutting_down) { + request->flags.clearProxyKeepalive(); + } else if (request->flags.proxyKeepalive() && shutting_down) { debugs(88, 3, "clientBuildReplyHeader: Shutting down, don't keep-alive."); - request->flags.proxy_keepalive = 0; - } else if (request->flags.connection_auth && !reply->keep_alive) { + request->flags.clearProxyKeepalive(); + } else if (request->flags.connectionAuthWanted() && !reply->keep_alive) { debugs(33, 2, "clientBuildReplyHeader: Connection oriented auth but server side non-persistent"); - request->flags.proxy_keepalive = 0; + request->flags.clearProxyKeepalive(); } else if (reply->bodySize(request->method) < 0 && !maySendChunkedReply) { debugs(88, 3, "clientBuildReplyHeader: can't keep-alive, unknown body size" ); - request->flags.proxy_keepalive = 0; - } else if (fdUsageHigh()&& !request->flags.must_keepalive) { + request->flags.clearProxyKeepalive(); + } else if (fdUsageHigh()&& !request->flags.mustKeepalive()) { debugs(88, 3, "clientBuildReplyHeader: Not many unused FDs, can't keep-alive"); - request->flags.proxy_keepalive = 0; - } else if (request->flags.sslBumped && !reply->persistent()) { + request->flags.clearProxyKeepalive(); + } else if (request->flags.sslBumped() && !reply->persistent()) { // We do not really have to close, but we pretend we are a tunnel. debugs(88, 3, "clientBuildReplyHeader: bumped reply forces close"); - request->flags.proxy_keepalive = 0; + request->flags.clearProxyKeepalive(); } // Decide if we send chunked reply if (maySendChunkedReply && - request->flags.proxy_keepalive && + request->flags.proxyKeepalive() && reply->bodySize(request->method) < 0) { debugs(88, 3, "clientBuildReplyHeader: chunked reply"); - request->flags.chunked_reply = 1; + request->flags.markReplyChunked(); hdr->putStr(HDR_TRANSFER_ENCODING, "chunked"); } @@ -1508,7 +1507,7 @@ hdr->putStr(HDR_VIA, strVia.termedBuf()); } /* Signal keep-alive or close explicitly */ - hdr->putStr(HDR_CONNECTION, request->flags.proxy_keepalive ? "keep-alive" : "close"); + hdr->putStr(HDR_CONNECTION, request->flags.proxyKeepalive() ? "keep-alive" : "close"); #if ADD_X_REQUEST_URI /* @@ -1556,7 +1555,7 @@ { HttpRequest *r = http->request; - if (r->flags.cachable || r->flags.internal) { + if (r->flags.isCachable() || r->flags.isInternal()) { lookingforstore = 5; StoreEntry::getPublicByRequest (this, r); } else { @@ -1587,29 +1586,23 @@ /** \li If the request has no-cache flag set or some no_cache HACK in operation we * 'invalidate' the cached IP entries for this request ??? */ - if (r->flags.nocache) { - -#if USE_DNSHELPER - ipcacheInvalidate(r->GetHost()); -#else - ipcacheInvalidateNegative(r->GetHost()); -#endif /* USE_DNSHELPER */ - - } - -#if USE_HTTP_VIOLATIONS - - else if (r->flags.nocache_hack) { - -#if USE_DNSHELPER - ipcacheInvalidate(r->GetHost()); -#else - ipcacheInvalidateNegative(r->GetHost()); -#endif /* USE_DNSHELPER */ - - } - -#endif /* USE_HTTP_VIOLATIONS */ + if (r->flags.noCache()) { + +#if USE_DNSHELPER + ipcacheInvalidate(r->GetHost()); +#else + ipcacheInvalidateNegative(r->GetHost()); +#endif /* USE_DNSHELPER */ + + } + + else if (r->flags.noCacheHackEnabled()) { +#if USE_DNSHELPER + ipcacheInvalidate(r->GetHost()); +#else + ipcacheInvalidateNegative(r->GetHost()); +#endif /* USE_DNSHELPER */ + } #if USE_CACHE_DIGESTS lookup_type = http->storeEntry() ? "HIT" : "MISS"; @@ -1657,7 +1650,7 @@ return; } - if (r->flags.nocache) { + if (r->flags.noCache()) { debugs(85, 3, "clientProcessRequest2: no-cache REFRESH MISS"); http->storeEntry(NULL); http->logType = LOG_TCP_CLIENT_REFRESH_MISS; @@ -1827,7 +1820,7 @@ debugs(88, 5, "clientReplyContext::sendStreamError: A stream error has occured, marking as complete and sending no data."); StoreIOBuffer localTempBuffer; flags.complete = 1; - http->request->flags.stream_error = 1; + http->request->flags.setStreamError(); localTempBuffer.flags.error = result.flags.error; clientStreamCallback((clientStreamNode*)http->client_stream.head->data, http, NULL, localTempBuffer); @@ -1898,7 +1891,7 @@ HttpReply *const temprep = e->getReply()->make304(); http->logType = LOG_TCP_IMS_HIT; removeClientStoreReference(&sc, http); - createStoreEntry(http->request->method, request_flags()); + createStoreEntry(http->request->method, RequestFlags()); e = http->storeEntry(); // Copy timestamp from the original entry so the 304 // reply has a meaningful Age: header. @@ -2160,7 +2153,7 @@ /* Using this breaks the client layering just a little! */ void -clientReplyContext::createStoreEntry(const HttpRequestMethod& m, request_flags reqFlags) +clientReplyContext::createStoreEntry(const HttpRequestMethod& m, RequestFlags reqFlags) { assert(http != NULL); /* === modified file 'src/client_side_reply.h' --- src/client_side_reply.h 2012-08-07 15:12:08 +0000 +++ src/client_side_reply.h 2012-09-10 12:49:35 +0000 @@ -31,11 +31,12 @@ #ifndef SQUID_CLIENTSIDEREPLY_H #define SQUID_CLIENTSIDEREPLY_H +#include "client_side_request.h" +#include "clientStream.h" +#include "HttpHeader.h" #include "RefCount.h" -#include "HttpHeader.h" -#include "clientStream.h" +#include "RequestFlags.h" #include "StoreClient.h" -#include "client_side_request.h" class ErrorState; #include "ip/forward.h" @@ -82,7 +83,7 @@ #endif /// creates a store entry for the reply and appends err to it void setReplyToError(const HttpRequestMethod& method, ErrorState *err); - void createStoreEntry(const HttpRequestMethod& m, request_flags flags); + void createStoreEntry(const HttpRequestMethod& m, RequestFlags flags); void removeStoreReference(store_client ** scp, StoreEntry ** ep); void removeClientStoreReference(store_client **scp, ClientHttpRequest *http); void startError(ErrorState * err); === modified file 'src/client_side_request.cc' --- src/client_side_request.cc 2012-09-01 14:38:36 +0000 +++ src/client_side_request.cc 2012-09-14 11:50:29 +0000 @@ -67,6 +67,7 @@ #include "MemObject.h" #include "Parsing.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "StrList.h" @@ -386,9 +387,10 @@ /* * build new header list *? TODO */ - request->flags.accelerated = http->flags.accel; + if (http->flags.accel) + request->flags.markAccelerated(); - request->flags.internalclient = 1; + request->flags.setInternalClient(); /* this is an internally created * request, not subject to acceleration @@ -533,7 +535,7 @@ conn->log_addr = request->indirect_client_addr; } request->x_forwarded_for_iterator.clean(); - request->flags.done_follow_x_forwarded_for = 1; + request->flags.setDoneFollowXFF(); if (answer != ACCESS_ALLOWED && answer != ACCESS_DENIED) { debugs(28, DBG_CRITICAL, "ERROR: Processing X-Forwarded-For. Stopping at IP address: " << request->indirect_client_addr ); @@ -564,7 +566,7 @@ for (int i = 0; i < ia->count; ++i) { if (clientConn->local.matchIPAddr(ia->in_addrs[i]) == 0) { debugs(85, 3, HERE << "validate IP " << clientConn->local << " possible from Host:"); - http->request->flags.hostVerified = 1; + http->request->flags.markHostVerified(); http->doCallouts(); return; } @@ -586,9 +588,9 @@ // NP: it is tempting to use 'flags.nocache' but that is all about READing cache data. // The problems here are about WRITE for new cache content, which means flags.cachable - http->request->flags.cachable = 0; // MUST NOT cache (for now) + http->request->flags.setNotCachable(); // MUST NOT cache (for now) // XXX: when we have updated the cache key to base on raw-IP + URI this cacheable limit can go. - http->request->flags.hierarchical = 0; // MUST NOT pass to peers (for now) + http->request->flags.clearHierarchical(); // MUST NOT pass to peers (for now) // XXX: when we have sorted out the best way to relay requests properly to peers this hierarchical limit can go. http->doCallouts(); return; @@ -632,7 +634,7 @@ return; } - if (http->request->flags.internal) { + if (http->request->flags.isInternal()) { // TODO: kill this when URL handling allows partial URLs out of accel mode // and we no longer screw with the URL just to add our internal host there debugs(85, 6, HERE << "validate skipped due to internal composite URL."); @@ -663,7 +665,7 @@ } debugs(85, 3, HERE << "validate host=" << host << ", port=" << port << ", portStr=" << (portStr?portStr:"NULL")); - if (http->request->flags.intercepted || http->request->flags.spoof_client_ip) { + if (http->request->flags.intercepted() || http->request->flags.spoofClientIp()) { // verify the Host: port (if any) matches the apparent destination if (portStr && port != http->getConn()->clientConnection->local.GetPort()) { debugs(85, 3, HERE << "FAIL on validate port " << http->getConn()->clientConnection->local.GetPort() << @@ -698,7 +700,7 @@ } else { // Okay no problem. debugs(85, 3, HERE << "validate passed."); - http->request->flags.hostVerified = 1; + http->request->flags.markHostVerified(); http->doCallouts(); } safe_free(hostB); @@ -709,7 +711,7 @@ ClientRequestContext::clientAccessCheck() { #if FOLLOW_X_FORWARDED_FOR - if (!http->request->flags.done_follow_x_forwarded_for && + if (!http->request->flags.doneFollowXFF() && Config.accessList.followXFF && http->request->header.has(HDR_X_FORWARDED_FOR)) { @@ -725,7 +727,7 @@ acl_checklist->nonBlockingCheck(clientFollowXForwardedForCheck, this); return; } -#endif /* FOLLOW_X_FORWARDED_FOR */ +#endif if (Config.accessList.http) { acl_checklist = clientAclChecklistCreate(Config.accessList.http, http); @@ -809,7 +811,7 @@ if (auth_challenge) { #if USE_AUTH - if (http->request->flags.sslBumped) { + if (http->request->flags.sslBumped()) { /*SSL Bumped request, authentication is not possible*/ status = HTTP_FORBIDDEN; } else if (!http->flags.accel) { @@ -923,7 +925,7 @@ const wordlist *p = NULL; // intercepted requests MUST NOT (yet) be sent to peers unless verified - if (!request->flags.hostVerified && (request->flags.intercepted || request->flags.spoof_client_ip)) + if (!request->flags.hostVerified() && (request->flags.intercepted() || request->flags.spoofClientIp())) return 0; /* @@ -931,14 +933,14 @@ * neighbors support private keys */ - if (request->flags.ims && !neighbors_do_private_keys) + if (request->flags.hasIMS() && !neighbors_do_private_keys) return 0; /* * This is incorrect: authenticating requests can be sent via a hierarchy * (they can even be cached if the correct headers are set on the reply) */ - if (request->flags.auth) + if (request->flags.hasAuth()) return 0; if (method == METHOD_TRACE) @@ -952,7 +954,7 @@ if (strstr(url, p->key)) return 0; - if (request->flags.loopdetect) + if (request->flags.loopDetect()) return 0; if (request->protocol == AnyP::PROTO_HTTP) @@ -980,14 +982,15 @@ if (!http_conn) return; - request->flags.connection_auth_disabled = http_conn->port->connection_auth_disabled; - if (!request->flags.connection_auth_disabled) { + if (http_conn->port->connection_auth_disabled) + request->flags.disableConnectionAuth(); + if (!request->flags.connectionAuthDisabled()) { if (Comm::IsConnOpen(http_conn->pinning.serverConnection)) { if (http_conn->pinning.auth) { - request->flags.connection_auth = 1; - request->flags.auth = 1; + request->flags.wantConnectionAuth(); + request->flags.markAuth(); } else { - request->flags.connection_proxy_auth = 1; + request->flags.requestConnectionProxyAuth(); } // These should already be linked correctly. assert(request->clientConnectionManager == http_conn); @@ -995,11 +998,11 @@ } /* check if connection auth is used, and flag as candidate for pinning - * in such case. + * in such case.; * Note: we may need to set flags.connection_auth even if the connection * is already pinned if it was pinned earlier due to proxy auth */ - if (!request->flags.connection_auth) { + if (!request->flags.connectionAuthWanted()) { if (req_hdr->has(HDR_AUTHORIZATION) || req_hdr->has(HDR_PROXY_AUTHORIZATION)) { HttpHeaderPos pos = HttpHeaderInitPos; HttpHeaderEntry *e; @@ -1013,10 +1016,10 @@ || strncasecmp(value, "Kerberos ", 9) == 0) { if (e->id == HDR_AUTHORIZATION) { - request->flags.connection_auth = 1; + request->flags.wantConnectionAuth(); may_pin = 1; } else { - request->flags.connection_proxy_auth = 1; + request->flags.requestConnectionProxyAuth(); may_pin = 1; } } @@ -1042,9 +1045,9 @@ request->ims = req_hdr->getTime(HDR_IF_MODIFIED_SINCE); if (request->ims > 0) - request->flags.ims = 1; + request->flags.setIMS(); - if (!request->flags.ignore_cc) { + if (!request->flags.ignoringCacheControl()) { if (req_hdr->has(HDR_PRAGMA)) { String s = req_hdr->getList(HDR_PRAGMA); @@ -1066,7 +1069,7 @@ * SP1 or not so all 5.5 versions are treated 'normally'). */ if (Config.onoff.ie_refresh) { - if (http->flags.accel && request->flags.ims) { + if (http->flags.accel && request->flags.hasIMS()) { if ((str = req_hdr->getStr(HDR_USER_AGENT))) { if (strstr(str, "MSIE 5.01") != NULL) no_cache=true; @@ -1089,13 +1092,13 @@ #if USE_HTTP_VIOLATIONS if (Config.onoff.reload_into_ims) - request->flags.nocache_hack = 1; + request->flags.hackNocache(); else if (refresh_nocache_hack) - request->flags.nocache_hack = 1; + request->flags.hackNocache(); else #endif - request->flags.nocache = 1; + request->flags.setNocache(); } /* ignore range header in non-GETs or non-HEADs */ @@ -1105,7 +1108,7 @@ request->range = req_hdr->getRange(); if (request->range) { - request->flags.range = 1; + request->flags.setRanged(); clientStreamNode *node = (clientStreamNode *)http->client_stream.tail->data; /* XXX: This is suboptimal. We should give the stream the range set, * and thereby let the top of the stream set the offset when the @@ -1131,12 +1134,12 @@ } if (req_hdr->has(HDR_AUTHORIZATION)) - request->flags.auth = 1; + request->flags.markAuth(); clientCheckPinning(http); if (request->login[0] != '\0') - request->flags.auth = 1; + request->flags.markAuth(); if (req_hdr->has(HDR_VIA)) { String s = req_hdr->getList(HDR_VIA); @@ -1149,7 +1152,7 @@ if (strListIsSubstr(&s, ThisCache2, ',')) { debugObj(33, 1, "WARNING: Forwarding loop detected for:\n", request, (ObjPackMethod) & httpRequestPack); - request->flags.loopdetect = 1; + request->flags.setLoopDetect(); } #if USE_FORW_VIA_DB @@ -1170,17 +1173,17 @@ #endif - request->flags.cachable = http->request->cacheable(); + request->flags.setCachable(http->request->cacheable()); if (clientHierarchical(http)) - request->flags.hierarchical = 1; + request->flags.setHierarchical(); debugs(85, 5, "clientInterpretRequestHeaders: REQ_NOCACHE = " << - (request->flags.nocache ? "SET" : "NOT SET")); + (request->flags.noCache() ? "SET" : "NOT SET")); debugs(85, 5, "clientInterpretRequestHeaders: REQ_CACHABLE = " << - (request->flags.cachable ? "SET" : "NOT SET")); + (request->flags.isCachable() ? "SET" : "NOT SET")); debugs(85, 5, "clientInterpretRequestHeaders: REQ_HIERARCHICAL = " << - (request->flags.hierarchical ? "SET" : "NOT SET")); + (request->flags.hierarchical() ? "SET" : "NOT SET")); } @@ -1228,7 +1231,7 @@ debugs(61,2, HERE << "URL-rewriter diverts URL from " << urlCanonical(old_request) << " to " << urlCanonical(new_request)); // update the new request to flag the re-writing was done on it - new_request->flags.redirected = 1; + new_request->flags.markRedirected(); // unlink bodypipe from the old request. Not needed there any longer. if (old_request->body_pipe != NULL) { @@ -1290,7 +1293,8 @@ ClientRequestContext::checkNoCacheDone(const allow_t &answer) { acl_checklist = NULL; - http->request->flags.cachable = (answer == ACCESS_ALLOWED); + if (answer == ACCESS_ALLOWED) + http->request->flags.setCachable(); http->doCallouts(); } @@ -1598,7 +1602,7 @@ if (!calloutContext->no_cache_done) { calloutContext->no_cache_done = true; - if (Config.accessList.noCache && request->flags.cachable) { + if (Config.accessList.noCache && request->flags.isCachable()) { debugs(83, 3, HERE << "Doing calloutContext->checkNoCache()"); calloutContext->checkNoCache(); return; === modified file 'src/comm.cc' --- src/comm.cc 2012-08-31 16:57:39 +0000 +++ src/comm.cc 2012-09-04 09:10:20 +0000 @@ -59,6 +59,7 @@ #include "MemBuf.h" #include "pconn.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "StoreIOBuffer.h" === modified file 'src/comm/ConnOpener.cc' --- src/comm/ConnOpener.cc 2012-08-31 16:57:39 +0000 +++ src/comm/ConnOpener.cc 2012-09-04 15:15:51 +0000 @@ -3,6 +3,7 @@ */ #include "squid.h" +#include "CachePeer.h" #include "comm/ConnOpener.h" #include "comm/Connection.h" #include "comm/Loops.h" @@ -12,12 +13,15 @@ #include "globals.h" #include "icmp/net_db.h" #include "ipcache.h" +#include "SquidConfig.h" #include "SquidTime.h" #if HAVE_ERRNO_H #include #endif +class CachePeer; + CBDATA_NAMESPACED_CLASS_INIT(Comm, ConnOpener); Comm::ConnOpener::ConnOpener(Comm::ConnectionPointer &c, AsyncCall::Pointer &handler, time_t ctimeout) : @@ -203,11 +207,11 @@ /* * stats.conn_open is used to account for the number of - * connections that we have open to the peer, so we can limit + * connections that we have open to the CachePeer, so we can limit * based on the max-conn option. We need to increment here, * even if the connection may fail. */ - if (peer *peer=(conn_->getPeer())) + if (CachePeer *peer=(conn_->getPeer())) ++peer->stats.conn_open; lookupLocalAddress(); === modified file 'src/comm/Connection.cc' --- src/comm/Connection.cc 2012-08-06 17:41:08 +0000 +++ src/comm/Connection.cc 2012-09-04 15:15:51 +0000 @@ -1,10 +1,12 @@ #include "squid.h" +#include "CachePeer.h" #include "cbdata.h" #include "comm.h" #include "comm/Connection.h" #include "fde.h" #include "SquidTime.h" +class CachePeer; bool Comm::IsConnOpen(const Comm::ConnectionPointer &conn) { @@ -18,7 +20,7 @@ fd(-1), tos(0), flags(COMM_NONBLOCKING), - _peer(NULL) + peer_(NULL) { *rfc931 = 0; // quick init the head. the rest does not matter. } @@ -32,7 +34,7 @@ close(); } - cbdataReferenceDone(_peer); + cbdataReferenceDone(peer_); } Comm::ConnectionPointer @@ -49,8 +51,8 @@ // ensure FD is not open in the new copy. c->fd = -1; - // ensure we have a cbdata reference to _peer not a straight ptr copy. - c->_peer = cbdataReference(getPeer()); + // ensure we have a cbdata reference to peer_ not a straight ptr copy. + c->peer_ = cbdataReference(getPeer()); return c; } @@ -61,29 +63,29 @@ if (isOpen()) { comm_close(fd); fd = -1; - if (peer *p=getPeer()) + if (CachePeer *p=getPeer()) -- p->stats.conn_open; } } -peer * +CachePeer * Comm::Connection::getPeer() const { - if (cbdataReferenceValid(_peer)) - return _peer; + if (cbdataReferenceValid(peer_)) + return peer_; return NULL; } void -Comm::Connection::setPeer(peer *p) +Comm::Connection::setPeer(CachePeer *p) { /* set to self. nothing to do. */ if (getPeer() == p) return; - cbdataReferenceDone(_peer); + cbdataReferenceDone(peer_); if (p) { - _peer = cbdataReference(p); + peer_ = cbdataReference(p); } } === modified file 'src/comm/Connection.h' --- src/comm/Connection.h 2012-08-14 11:53:07 +0000 +++ src/comm/Connection.h 2012-09-04 14:38:44 +0000 @@ -56,7 +56,7 @@ #include #endif -struct peer; +class CachePeer; namespace Comm { @@ -108,16 +108,16 @@ /** determine whether this object describes an active connection or not. */ bool isOpen() const { return (fd >= 0); } - /** retrieve the peer pointer for use. + /** retrieve the CachePeer pointer for use. * The caller is responsible for all CBDATA operations regarding the * used of the pointer returned. */ - peer * getPeer() const; + CachePeer * getPeer() const; - /** alter the stored peer pointer. - * Perform appropriate CBDATA operations for locking the peer pointer + /** alter the stored CachePeer pointer. + * Perform appropriate CBDATA operations for locking the CachePeer pointer */ - void setPeer(peer * p); + void setPeer(CachePeer * p); private: /** These objects may not be exactly duplicated. Use copyDetails() instead. */ @@ -156,12 +156,8 @@ #endif private: - // XXX: we need to call this member peer_ but the struct peer_ global type - // behind peer* clashes despite our private Comm:: namespace - // (it being global gets inherited here too). - /** cache_peer data object (if any) */ - peer *_peer; + CachePeer *peer_; }; }; // namespace Comm === modified file 'src/comm/ModPoll.cc' --- src/comm/ModPoll.cc 2012-09-01 14:38:36 +0000 +++ src/comm/ModPoll.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "ICP.h" #include "mgr/Registration.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "Store.h" === modified file 'src/comm/ModSelect.cc' --- src/comm/ModSelect.cc 2012-09-01 14:38:36 +0000 +++ src/comm/ModSelect.cc 2012-09-05 09:41:45 +0000 @@ -43,6 +43,7 @@ #include "StatCounters.h" #include "StatHist.h" #include "Store.h" +#include "SquidConfig.h" #if HAVE_SYS_STAT_H #include === modified file 'src/comm/TcpAcceptor.cc' --- src/comm/TcpAcceptor.cc 2012-08-31 16:57:39 +0000 +++ src/comm/TcpAcceptor.cc 2012-09-04 09:10:20 +0000 @@ -46,6 +46,7 @@ #include "globals.h" #include "ip/Intercept.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" === modified file 'src/dns.cc' --- src/dns.cc 2012-09-01 14:38:36 +0000 +++ src/dns.cc 2012-09-05 09:41:45 +0000 @@ -32,11 +32,12 @@ */ #include "squid.h" +#include "helper.h" +#include "mgr/Registration.h" +#include "SquidConfig.h" +#include "SquidTime.h" #include "Store.h" #include "wordlist.h" -#include "SquidTime.h" -#include "mgr/Registration.h" -#include "helper.h" /* MS VisualStudio Projects are monolitich, so we need the following #if to include the external DNS code in compile process when === modified file 'src/dns_internal.cc' --- src/dns_internal.cc 2012-09-01 14:38:36 +0000 +++ src/dns_internal.cc 2012-09-04 09:10:20 +0000 @@ -45,6 +45,7 @@ #include "MemBuf.h" #include "mgr/Registration.h" #include "rfc3596.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "tools.h" === modified file 'src/errorpage.cc' --- src/errorpage.cc 2012-09-01 14:38:36 +0000 +++ src/errorpage.cc 2012-09-04 09:10:20 +0000 @@ -46,6 +46,7 @@ #include "fde.h" #include "MemBuf.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "URL.h" #include "URLScheme.h" #include "URL.h" === modified file 'src/esi/Esi.cc' --- src/esi/Esi.cc 2012-08-31 16:57:39 +0000 +++ src/esi/Esi.cc 2012-09-04 09:10:20 +0000 @@ -60,6 +60,7 @@ #include "Mem.h" #include "MemBuf.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" /* quick reference on behaviour here. * The ESI specification 1.0 requires the ESI processor to be able to === modified file 'src/external_acl.cc' --- src/external_acl.cc 2012-09-01 14:38:36 +0000 +++ src/external_acl.cc 2012-09-04 09:10:20 +0000 @@ -55,6 +55,7 @@ #include "MemBuf.h" #include "mgr/Registration.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidString.h" #include "SquidTime.h" #include "Store.h" === modified file 'src/fde.h' --- src/fde.h 2012-08-14 11:53:07 +0000 +++ src/fde.h 2012-09-04 15:15:51 +0000 @@ -34,6 +34,10 @@ #include "ip/Address.h" #include "structs.h" +#if USE_SSL +#include +#endif + #if USE_DELAY_POOLS class ClientInfo; #endif === modified file 'src/format/Format.cc' --- src/format/Format.cc 2012-08-31 16:57:39 +0000 +++ src/format/Format.cc 2012-09-12 16:06:56 +0000 @@ -383,8 +383,8 @@ case LFT_LOCAL_LISTENING_IP: { // avoid logging a dash if we have reliable info const bool interceptedAtKnownPort = al->request ? - (al->request->flags.spoof_client_ip || - al->request->flags.intercepted) && al->cache.port : + (al->request->flags.spoofClientIp() || + al->request->flags.intercepted()) && al->cache.port : false; if (interceptedAtKnownPort) { const bool portAddressConfigured = !al->cache.port->s.IsAnyAddr(); === modified file 'src/format/Token.cc' --- src/format/Token.cc 2012-08-06 17:41:08 +0000 +++ src/format/Token.cc 2012-09-04 09:10:20 +0000 @@ -2,6 +2,7 @@ #include "format/Config.h" #include "format/Token.h" #include "format/TokenTableEntry.h" +#include "SquidConfig.h" #include "Store.h" const char *Format::log_tags[] = { === modified file 'src/forward.cc' --- src/forward.cc 2012-09-13 06:56:05 +0000 +++ src/forward.cc 2012-09-13 16:20:41 +0000 @@ -32,9 +32,11 @@ #include "squid.h" #include "AccessLogEntry.h" +#include "acl/AclAddress.h" #include "acl/FilledChecklist.h" #include "acl/Gadgets.h" #include "anyp/PortCfg.h" +#include "CachePeer.h" #include "CacheManager.h" #include "client_side.h" #include "comm/Connection.h" @@ -63,6 +65,7 @@ #include "neighbors.h" #include "pconn.h" #include "PeerSelectState.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "StoreClient.h" @@ -370,7 +373,7 @@ fail(anErr); } // else use actual error from last connection attempt #if USE_SSL - if (request->flags.sslPeek && request->clientConnectionManager.valid()) { + if (request->flags.sslPeek() && request->clientConnectionManager.valid()) { errorAppendEntry(entry, err); // will free err err = NULL; CallJobHere1(17, 4, request->clientConnectionManager, ConnStateData, @@ -718,7 +721,7 @@ // a user-entered address (a host name or a user-entered IP). const bool isConnectRequest = !request->clientConnectionManager->port->spoof_client_ip && !request->clientConnectionManager->port->intercepted; - if (request->flags.sslPeek && !isConnectRequest) { + if (request->flags.sslPeek() && !isConnectRequest) { if (X509 *srvX509 = errDetails->peerCert()) { if (const char *name = Ssl::CommonHostName(srvX509)) { request->SetHost(name); @@ -767,7 +770,7 @@ { SSL *ssl; SSL_CTX *sslContext = NULL; - const peer *peer = serverConnection()->getPeer(); + const CachePeer *peer = serverConnection()->getPeer(); int fd = serverConnection()->fd; if (peer) { @@ -815,7 +818,7 @@ const bool hostnameIsIp = request->GetHostIsNumeric(); const bool isConnectRequest = !request->clientConnectionManager->port->spoof_client_ip && !request->clientConnectionManager->port->intercepted; - if (!request->flags.sslPeek || isConnectRequest) + if (!request->flags.sslPeek() || isConnectRequest) SSL_set_ex_data(ssl, ssl_ex_index_server, (void*)hostname); // Use SNI TLS extension only when we connect directly @@ -879,20 +882,20 @@ peerConnectSucceded(serverConnection()->getPeer()); // some requests benefit from pinning but do not require it and can "repin" - const bool rePin = request->flags.canRePin && + const bool rePin = request->flags.canRePin() && request->clientConnectionManager.valid(); if (rePin) { debugs(17, 3, HERE << "repinning " << serverConn); request->clientConnectionManager->pinConnection(serverConn, - request, serverConn->getPeer(), request->flags.auth); - request->flags.pinned = 1; + request, serverConn->getPeer(), request->flags.hasAuth()); + request->flags.markPinned(); } #if USE_SSL - if (!request->flags.pinned || rePin) { + if (!request->flags.pinned() || rePin) { if ((serverConnection()->getPeer() && serverConnection()->getPeer()->use_ssl) || (!serverConnection()->getPeer() && request->protocol == AnyP::PROTO_HTTPS) || - request->flags.sslPeek) { + request->flags.sslPeek()) { initiateSSL(); return; } @@ -956,7 +959,7 @@ if (ftimeout < ctimeout) ctimeout = ftimeout; - if (serverDestinations[0]->getPeer() && request->flags.sslBumped == true) { + if (serverDestinations[0]->getPeer() && request->flags.sslBumped() == true) { debugs(50, 4, "fwdConnectStart: Ssl bumped connections through parrent proxy are not allowed"); ErrorState *anErr = new ErrorState(ERR_CANNOT_FORWARD, HTTP_SERVICE_UNAVAILABLE, request); fail(anErr); @@ -964,7 +967,7 @@ return; } - request->flags.pinned = 0; // XXX: what if the ConnStateData set this to flag existing credentials? + request->flags.clearPinned(); // XXX: what if the ConnStateData set this to flag existing credentials? // XXX: answer: the peer selection *should* catch it and give us only the pinned peer. so we reverse the =0 step below. // XXX: also, logs will now lie if pinning is broken and leads to an error message. if (serverDestinations[0]->peerType == PINNED) { @@ -981,9 +984,9 @@ serverConn->peerType = HIER_DIRECT; #endif ++n_tries; - request->flags.pinned = 1; + request->flags.markPinned(); if (pinned_connection->pinnedAuth()) - request->flags.auth = 1; + request->flags.markAuth(); comm_add_close_handler(serverConn->fd, fwdServerClosedWrapper, this); // the server may close the pinned connection before this request pconnRace = racePossible; @@ -992,7 +995,7 @@ } /* Failure. Fall back on next path unless we can re-pin */ debugs(17,2,HERE << "Pinned connection failed: " << pinned_connection); - if (pconnRace != raceHappened || !request->flags.canRePin) { + if (pconnRace != raceHappened || !request->flags.canRePin()) { serverDestinations.shift(); pconnRace = raceImpossible; startConnectionOrFail(); @@ -1125,7 +1128,7 @@ #endif #if USE_SSL - if (request->flags.sslPeek) { + if (request->flags.sslPeek()) { CallJobHere1(17, 4, request->clientConnectionManager, ConnStateData, ConnStateData::httpsPeeked, serverConnection()); unregister(serverConn); // async call owns it now @@ -1140,7 +1143,7 @@ request->peer_domain = serverConnection()->getPeer()->domain; httpStart(this); } else { - assert(!request->flags.sslPeek); + assert(!request->flags.sslPeek()); request->peer_login = NULL; request->peer_domain = NULL; @@ -1254,7 +1257,7 @@ ErrorState * FwdState::makeConnectingError(const err_type type) const { - return new ErrorState(type, request->flags.need_validation ? + return new ErrorState(type, request->flags.validationNeeded() ? HTTP_GATEWAY_TIMEOUT : HTTP_SERVICE_UNAVAILABLE, request); } @@ -1400,7 +1403,7 @@ conn->local.SetIPv4(); // maybe use TPROXY client address - if (request && request->flags.spoof_client_ip) { + if (request && request->flags.spoofClientIp()) { if (!conn->getPeer() || !conn->getPeer()->options.no_tproxy) { #if FOLLOW_X_FORWARDED_FOR && LINUX_NETFILTER if (Config.onoff.tproxy_uses_indirect_client) @@ -1427,7 +1430,7 @@ // TODO use the connection details in ACL. // needs a bit of rework in ACLFilledChecklist to use Comm::Connection instead of ConnStateData - acl_address *l; + AclAddress *l; for (l = Config.accessList.outgoing_address; l; l = l->next) { /* check if the outgoing address is usable to the destination */ === modified file 'src/forward.h' --- src/forward.h 2012-08-29 14:27:18 +0000 +++ src/forward.h 2012-09-05 15:12:36 +0000 @@ -4,6 +4,7 @@ #include "Array.h" #include "comm.h" #include "comm/Connection.h" +#include "err_type.h" #include "fde.h" #include "ip/Address.h" #include "RefCount.h" === modified file 'src/fqdncache.cc' --- src/fqdncache.cc 2012-09-01 14:38:36 +0000 +++ src/fqdncache.cc 2012-09-04 09:10:20 +0000 @@ -36,6 +36,7 @@ #include "event.h" #include "Mem.h" #include "mgr/Registration.h" +#include "SquidConfig.h" #include "SquidDns.h" #include "SquidTime.h" #include "StatCounters.h" === modified file 'src/fs/coss/store_dir_coss.cc' --- src/fs/coss/store_dir_coss.cc 2012-08-30 08:30:12 +0000 +++ src/fs/coss/store_dir_coss.cc 2012-09-06 14:22:03 +0000 @@ -52,6 +52,7 @@ #include "store_key_md5.h" #include "swap_log_op.h" #include "store_rebuild.h" +#include "SquidConfig.h" #include "SquidMath.h" #if HAVE_ERRNO_H @@ -76,7 +77,7 @@ unsigned int clean:1; } flags; - struct _store_rebuild_data counts; + StoreRebuildData counts; }; static char *storeCossDirSwapLogFile(SwapDir *, const char *); === modified file 'src/fs/coss/store_io_coss.cc' --- src/fs/coss/store_io_coss.cc 2012-09-01 14:38:36 +0000 +++ src/fs/coss/store_io_coss.cc 2012-09-04 09:10:20 +0000 @@ -33,13 +33,14 @@ #include "squid.h" #include "CossSwapDir.h" +#include "DiskIO/DiskIOStrategy.h" +#include "fde.h" +#include "MemObject.h" +#include "SquidConfig.h" +#include "store_coss.h" #include "Store.h" -#include "store_coss.h" -#include "MemObject.h" -#include "fde.h" +#include "StoreFScoss.h" #include "SwapDir.h" -#include "StoreFScoss.h" -#include "DiskIO/DiskIOStrategy.h" CBDATA_TYPE(CossMemBuf); === modified file 'src/fs/rock/RockRebuild.h' --- src/fs/rock/RockRebuild.h 2011-09-06 22:32:30 +0000 +++ src/fs/rock/RockRebuild.h 2012-09-06 14:22:03 +0000 @@ -2,7 +2,8 @@ #define SQUID_FS_ROCK_REBUILD_H #include "base/AsyncJob.h" -#include "structs.h" +#include "cbdata.h" +#include "store_rebuild.h" namespace Rock { @@ -39,7 +40,7 @@ int64_t dbOffset; int filen; - struct _store_rebuild_data counts; + StoreRebuildData counts; static void Steps(void *data); === modified file 'src/fs/rock/RockSwapDir.cc' --- src/fs/rock/RockSwapDir.cc 2012-09-01 14:38:36 +0000 +++ src/fs/rock/RockSwapDir.cc 2012-09-04 09:10:20 +0000 @@ -17,6 +17,7 @@ #include "ipc/mem/Pages.h" #include "MemObject.h" #include "Parsing.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "tools.h" === modified file 'src/fs/ufs/RebuildState.cc' --- src/fs/ufs/RebuildState.cc 2012-08-31 16:57:39 +0000 +++ src/fs/ufs/RebuildState.cc 2012-09-04 09:10:20 +0000 @@ -34,6 +34,7 @@ #include "disk.h" #include "globals.h" #include "RebuildState.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "store_key_md5.h" #include "store_rebuild.h" === modified file 'src/fs/ufs/RebuildState.h' --- src/fs/ufs/RebuildState.h 2012-08-28 13:00:30 +0000 +++ src/fs/ufs/RebuildState.h 2012-09-06 14:22:03 +0000 @@ -32,8 +32,8 @@ #include "RefCount.h" #include "UFSSwapDir.h" -#include "structs.h" #include "UFSSwapLogParser.h" +#include "store_rebuild.h" class StoreEntry; @@ -76,7 +76,7 @@ char fullpath[MAXPATHLEN]; char fullfilename[MAXPATHLEN]; - struct _store_rebuild_data counts; + StoreRebuildData counts; private: CBDATA_CLASS2(RebuildState); === modified file 'src/fs/ufs/UFSSwapDir.cc' --- src/fs/ufs/UFSSwapDir.cc 2012-08-31 16:57:39 +0000 +++ src/fs/ufs/UFSSwapDir.cc 2012-09-04 09:10:20 +0000 @@ -46,6 +46,7 @@ #include "store_key_md5.h" #include "StoreSearchUFS.h" #include "StoreSwapLogData.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "tools.h" === modified file 'src/ftp.cc' --- src/ftp.cc 2012-09-01 14:38:36 +0000 +++ src/ftp.cc 2012-09-04 09:10:20 +0000 @@ -53,6 +53,7 @@ #include "mime.h" #include "rfc1738.h" #include "Server.h" +#include "SquidConfig.h" #include "SquidString.h" #include "SquidTime.h" #include "StatCounters.h" === modified file 'src/globals.h' --- src/globals.h 2012-09-01 14:38:36 +0000 +++ src/globals.h 2012-09-17 15:12:01 +0000 @@ -30,18 +30,17 @@ #ifndef SQUID_GLOBALS_H #define SQUID_GLOBALS_H +#include "acl/AclDenyInfoList.h" +#include "CacheDigest.h" +#include "defines.h" +#include "hash.h" +#include "IoStats.h" +#include "rfc2181.h" + #if HAVE_STDIO_H #include #endif -#include "rfc2181.h" - -/* for ERROR_BUF_SZ, BUFSIZ */ -#include "defines.h" - -/* for iostats */ -#include "structs.h" - extern char *ConfigFile; /* NULL */ extern char *IcpOpcodeStr[]; extern char tmp_error_buf[ERROR_BUF_SZ]; @@ -85,9 +84,9 @@ extern int DnsSocketA; /* -1 */ extern int DnsSocketB; /* -1 */ extern int n_disk_objects; /* 0 */ -extern iostats IOStats; +extern IoStats IOStats; -extern struct acl_deny_info_list *DenyInfoList; /* NULL */ +extern AclDenyInfoList *DenyInfoList; /* NULL */ extern struct timeval squid_start; extern int starting_up; /* 1 */ === modified file 'src/gopher.cc' --- src/gopher.cc 2012-08-31 16:57:39 +0000 +++ src/gopher.cc 2012-09-04 09:10:20 +0000 @@ -43,6 +43,7 @@ #include "MemBuf.h" #include "mime.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "Store.h" === modified file 'src/htcp.cc' --- src/htcp.cc 2012-09-01 14:38:36 +0000 +++ src/htcp.cc 2012-09-04 15:15:51 +0000 @@ -35,6 +35,7 @@ #include "AccessLogEntry.h" #include "acl/Acl.h" #include "acl/FilledChecklist.h" +#include "CachePeer.h" #include "comm.h" #include "comm/Connection.h" #include "comm/Loops.h" @@ -49,6 +50,7 @@ #include "md5.h" #include "MemBuf.h" #include "refresh.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "store_key_md5.h" @@ -1307,7 +1309,7 @@ static void htcpForwardClr(char *buf, int sz) { - peer *p; + CachePeer *p; for (p = Config.peers; p; p = p->next) { if (!p->options.htcp) { @@ -1550,7 +1552,7 @@ } int -htcpQuery(StoreEntry * e, HttpRequest * req, peer * p) +htcpQuery(StoreEntry * e, HttpRequest * req, CachePeer * p) { cache_key *save_key; static char pkt[8192]; @@ -1603,10 +1605,10 @@ } /* - * Send an HTCP CLR message for a specified item to a given peer. + * Send an HTCP CLR message for a specified item to a given CachePeer. */ void -htcpClear(StoreEntry * e, const char *uri, HttpRequest * req, const HttpRequestMethod &method, peer * p, htcp_clr_reason reason) +htcpClear(StoreEntry * e, const char *uri, HttpRequest * req, const HttpRequestMethod &method, CachePeer * p, htcp_clr_reason reason) { static char pkt[8192]; ssize_t pktlen; === modified file 'src/htcp.h' --- src/htcp.h 2012-08-14 11:53:07 +0000 +++ src/htcp.h 2012-09-04 14:38:44 +0000 @@ -79,10 +79,10 @@ * Don't wait for a reply or count in stats as sent. * \retval -1 Error sending request. */ -SQUIDCEXTERN int htcpQuery(StoreEntry * e, HttpRequest * req, peer * p); +SQUIDCEXTERN int htcpQuery(StoreEntry * e, HttpRequest * req, CachePeer * p); /// \ingroup ServerProtocolHTCP -SQUIDCEXTERN void htcpClear(StoreEntry * e, const char *uri, HttpRequest * req, const HttpRequestMethod &method, peer * p, htcp_clr_reason reason); +SQUIDCEXTERN void htcpClear(StoreEntry * e, const char *uri, HttpRequest * req, const HttpRequestMethod &method, CachePeer * p, htcp_clr_reason reason); /// \ingroup ServerProtocolHTCP SQUIDCEXTERN void htcpSocketShutdown(void); === modified file 'src/http.cc' --- src/http.cc 2012-09-03 07:16:45 +0000 +++ src/http.cc 2012-09-13 16:20:41 +0000 @@ -39,6 +39,7 @@ #include "base64.h" #include "base/AsyncJobCalls.h" #include "base/TextException.h" +#include "CachePeer.h" #include "client_side.h" #include "comm/Connection.h" #include "comm/Write.h" @@ -64,7 +65,9 @@ #include "peer_proxy_negotiate_auth.h" #include "profiler/Profiler.h" #include "refresh.h" +#include "RefreshPattern.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "Store.h" @@ -117,7 +120,7 @@ _peer = cbdataReference(fwd->serverConnection()->getPeer()); /* might be NULL */ if (_peer) { - request->flags.proxying = 1; + request->flags.setProxying(); /* * This NEIGHBOR_PROXY_ONLY check probably shouldn't be here. * We might end up getting the object from somewhere else if, @@ -294,7 +297,7 @@ void HttpStateData::processSurrogateControl(HttpReply *reply) { - if (request->flags.accelerated && reply->surrogate_control) { + if (request->flags.accelerated() && reply->surrogate_control) { HttpHdrScTarget *sctusable = reply->surrogate_control->getMergedTarget(Config.Accel.surrogate_id); if (sctusable) { @@ -335,7 +338,7 @@ const char *v; #if USE_HTTP_VIOLATIONS - const refresh_t *R = NULL; + const RefreshPattern *R = NULL; /* This strange looking define first looks up the refresh pattern * and then checks if the specified flag is set. The main purpose @@ -376,7 +379,7 @@ } } - if (request->flags.auth || request->flags.auth_sent) { + if (request->flags.hasAuth() || request->flags.authSent()) { /* * Responses to requests with authorization may be cached * only if a Cache-Control: public reply header is present. @@ -713,7 +716,7 @@ } if (!peerSupportsConnectionPinning()) - request->flags.connection_auth_disabled = 1; + request->flags.disableConnectionAuth(); HttpReply *vrep = setVirginReply(newrep); flags.headers_parsed = 1; @@ -834,7 +837,7 @@ return true; /*if the connections it is already pinned it is OK*/ - if (request->flags.pinned) + if (request->flags.pinned()) return true; /*Allow pinned connections only if the Proxy-support header exists in @@ -1234,7 +1237,7 @@ debugs(11, DBG_IMPORTANT, "WARNING: HTTP: Invalid Response: Headers did not parse at all for " << entry->url() << " AKA " << request->GetHost() << request->urlpath.termedBuf() ); } else { error = ERR_ZERO_SIZE_OBJECT; - debugs(11, (request->flags.accelerated?DBG_IMPORTANT:2), "WARNING: HTTP: Invalid Response: No object data received for " << + debugs(11, (request->flags.accelerated()?DBG_IMPORTANT:2), "WARNING: HTTP: Invalid Response: No object data received for " << entry->url() << " AKA " << request->GetHost() << request->urlpath.termedBuf() ); } } @@ -1383,18 +1386,18 @@ closeHandler = NULL; fwd->unregister(serverConnection); - if (request->flags.spoof_client_ip) + if (request->flags.spoofClientIp()) client_addr = request->client_addr; - if (request->flags.pinned) { + if (request->flags.pinned()) { ispinned = true; - } else if (request->flags.connection_auth && request->flags.auth_sent) { + } else if (request->flags.connectionAuthWanted() && request->flags.authSent()) { ispinned = true; } if (request->pinnedConnection() && ispinned) { request->pinnedConnection()->pinConnection(serverConnection, request, _peer, - (request->flags.connection_auth != 0)); + request->flags.connectionAuthWanted()); } else { fwd->pconnPush(serverConnection, request->peer_host ? request->peer_host : request->GetHost()); } @@ -1527,7 +1530,7 @@ http_hdr_type header = flags.originpeer ? HDR_AUTHORIZATION : HDR_PROXY_AUTHORIZATION; /* Nothing to do unless we are forwarding to a peer */ - if (!request->flags.proxying) + if (!request->flags.proxying()) return; /* Needs to be explicitly enabled */ @@ -1645,11 +1648,11 @@ */ if (!we_do_ranges && request->multipartRangeRequest()) { /* don't cache the result */ - request->flags.cachable = 0; + request->flags.setNotCachable(); /* pretend it's not a range request */ delete request->range; request->range = NULL; - request->flags.range = 0; + request->flags.clearRanged(); } /* append Via */ @@ -1664,7 +1667,7 @@ strVia.clean(); } - if (request->flags.accelerated) { + if (request->flags.accelerated()) { /* Append Surrogate-Capabilities */ String strSurrogate(hdr_in->getList(HDR_SURROGATE_CAPABILITY)); #if USE_SQUID_ESI @@ -1733,7 +1736,7 @@ /* append Authorization if known in URL, not in header and going direct */ if (!hdr_out->has(HDR_AUTHORIZATION)) { - if (!request->flags.proxying && request->login && *request->login) { + if (!request->flags.proxying() && request->login && *request->login) { httpHeaderPutStrf(hdr_out, HDR_AUTHORIZATION, "Basic %s", old_base64_encode(request->login)); } @@ -1867,7 +1870,7 @@ */ if (request->peer_domain) hdr_out->putStr(HDR_HOST, request->peer_domain); - else if (request->flags.redirected && !Config.onoff.redir_rewrites_host) + else if (request->flags.isRedirected() && !Config.onoff.redir_rewrites_host) hdr_out->addEntry(e->clone()); else { /* use port# only if not default */ @@ -1984,13 +1987,13 @@ int64_t roffLimit = request->getRangeOffsetLimit(); - if (NULL == request->range || !request->flags.cachable - || request->range->offsetLimitExceeded(roffLimit) || request->flags.connection_auth) + if (NULL == request->range || !request->flags.isCachable() + || request->range->offsetLimitExceeded(roffLimit) || request->flags.connectionAuthWanted()) result = false; debugs(11, 8, "decideIfWeDoRanges: range specs: " << request->range << ", cachable: " << - request->flags.cachable << "; we_do_ranges: " << result); + request->flags.isCachable() << "; we_do_ranges: " << result); return result; } @@ -2018,10 +2021,10 @@ Packer p; httpBuildRequestHeader(request, entry, fwd->al, &hdr, flags); - if (request->flags.pinned && request->flags.connection_auth) - request->flags.auth_sent = 1; + if (request->flags.pinned() && request->flags.connectionAuthWanted()) + request->flags.markAuthSent(); else if (hdr.has(HDR_AUTHORIZATION)) - request->flags.auth_sent = 1; + request->flags.markAuthSent(); packerToMemInit(&p, mb); hdr.packInto(&p); @@ -2088,7 +2091,7 @@ /* * Is keep-alive okay for all request methods? */ - if (request->flags.must_keepalive) + if (request->flags.mustKeepalive()) flags.keepalive = 1; else if (!Config.onoff.server_pconns) flags.keepalive = 0; === modified file 'src/http.h' --- src/http.h 2012-09-01 14:38:36 +0000 +++ src/http.h 2012-09-04 14:38:44 +0000 @@ -61,7 +61,7 @@ virtual void maybeReadVirginBody(); // read response data from the network int cacheableReply(); - peer *_peer; /* peer request made to */ + CachePeer *_peer; /* CachePeer request made to */ int eof; /* reached end-of-object? */ int lastChunk; /* reached last chunk of a chunk-encoded reply */ http_state_flags flags; === modified file 'src/icmp/IcmpSquid.cc' --- src/icmp/IcmpSquid.cc 2012-09-01 14:38:36 +0000 +++ src/icmp/IcmpSquid.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "icmp/IcmpSquid.h" #include "icmp/net_db.h" #include "ip/tools.h" +#include "SquidConfig.h" #include "SquidIpc.h" #include "SquidTime.h" === modified file 'src/icmp/net_db.cc' --- src/icmp/net_db.cc 2012-08-31 16:57:39 +0000 +++ src/icmp/net_db.cc 2012-09-13 11:40:32 +0000 @@ -39,6 +39,7 @@ */ #include "squid.h" +#include "CachePeer.h" #include "cbdata.h" #include "disk.h" #include "event.h" @@ -81,7 +82,7 @@ } netdb_conn_state_t; typedef struct { - peer *p; + CachePeer *p; StoreEntry *e; store_client *sc; HttpRequest *r; @@ -105,7 +106,7 @@ static void netdbPurgeLRU(void); static netdbEntry *netdbLookupHost(const char *key); static net_db_peer *netdbPeerByName(const netdbEntry * n, const char *); -static net_db_peer *netdbPeerAdd(netdbEntry * n, peer * e); +static net_db_peer *netdbPeerAdd(netdbEntry * n, CachePeer * e); static const char *netdbPeerName(const char *name); static IPH netdbSendPing; static QS sortPeerByRtt; @@ -116,7 +117,7 @@ static STCB netdbExchangeHandleReply; static void netdbExchangeDone(void *); -/* We have to keep a local list of peer names. The Peers structure +/* We have to keep a local list of CachePeer names. The Peers structure * gets freed during a reconfigure. We want this database to * remain persisitent, so _net_db_peer->peername points into this * linked list */ @@ -421,7 +422,7 @@ } static net_db_peer * -netdbPeerAdd(netdbEntry * n, peer * e) +netdbPeerAdd(netdbEntry * n, CachePeer * e) { net_db_peer *p; net_db_peer *o; @@ -1123,7 +1124,7 @@ } void -netdbUpdatePeer(HttpRequest * r, peer * e, int irtt, int ihops) +netdbUpdatePeer(HttpRequest * r, CachePeer * e, int irtt, int ihops) { #if USE_ICMP netdbEntry *n; @@ -1159,7 +1160,7 @@ } void -netdbExchangeUpdatePeer(Ip::Address &addr, peer * e, double rtt, double hops) +netdbExchangeUpdatePeer(Ip::Address &addr, CachePeer * e, double rtt, double hops) { #if USE_ICMP netdbEntry *n; @@ -1313,7 +1314,7 @@ netdbExchangeStart(void *data) { #if USE_ICMP - peer *p = (peer *)data; + CachePeer *p = (CachePeer *)data; char *uri; netdbExchangeState *ex; StoreIOBuffer tempBuffer; @@ -1334,7 +1335,7 @@ assert(NULL != ex->r); ex->r->http_ver = HttpVersion(1,1); ex->connstate = STATE_HEADER; - ex->e = storeCreateEntry(uri, uri, request_flags(), METHOD_GET); + ex->e = storeCreateEntry(uri, uri, RequestFlags(), METHOD_GET); ex->buf_sz = NETDB_REQBUF_SZ; assert(NULL != ex->e); ex->sc = storeClientListAdd(ex->e, ex); @@ -1343,7 +1344,7 @@ tempBuffer.data = ex->buf; storeClientCopy(ex->sc, ex->e, tempBuffer, netdbExchangeHandleReply, ex); - ex->r->flags.loopdetect = 1; /* cheat! -- force direct */ + ex->r->flags.setLoopDetect(); /* cheat! -- force direct */ if (p->login) xstrncpy(ex->r->login, p->login, MAX_LOGIN_SZ); @@ -1355,11 +1356,11 @@ #endif } -peer * +CachePeer * netdbClosestParent(HttpRequest * request) { #if USE_ICMP - peer *p = NULL; + CachePeer *p = NULL; netdbEntry *n; const ipcache_addrs *ia; net_db_peer *h; === modified file 'src/icmp/net_db.h' --- src/icmp/net_db.h 2012-08-28 13:00:30 +0000 +++ src/icmp/net_db.h 2012-09-18 12:54:44 +0000 @@ -1,6 +1,9 @@ #ifndef ICMP_NET_DB_H #define ICMP_NET_DB_H +#include "CachePeer.h" +#include "hash.h" + namespace Ip { class Address; @@ -8,27 +11,60 @@ class StoreEntry; class HttpRequest; - -/* for struct peer */ -#include "structs.h" - -SQUIDCEXTERN void netdbInit(void); - -SQUIDCEXTERN void netdbHandlePingReply(const Ip::Address &from, int hops, int rtt); -SQUIDCEXTERN void netdbPingSite(const char *hostname); +class netdbEntry; + +class net_db_name +{ +public: + hash_link hash; /* must be first */ + net_db_name *next; + netdbEntry *net_db_entry; +}; + +class net_db_peer +{ +public: + const char *peername; + double hops; + double rtt; + time_t expires; +}; + +class netdbEntry +{ +public: + hash_link hash; /* must be first */ + char network[MAX_IPSTRLEN]; + int pings_sent; + int pings_recv; + double hops; + double rtt; + time_t next_ping_time; + time_t last_use_time; + int link_count; + net_db_name *hosts; + net_db_peer *peers; + int n_peers_alloc; + int n_peers; +}; + +extern void netdbInit(void); + +extern void netdbHandlePingReply(const Ip::Address &from, int hops, int rtt); +extern void netdbPingSite(const char *hostname); void netdbDump(StoreEntry *); -SQUIDCEXTERN void netdbFreeMemory(void); -SQUIDCEXTERN int netdbHostHops(const char *host); -SQUIDCEXTERN int netdbHostRtt(const char *host); -SQUIDCEXTERN void netdbUpdatePeer(HttpRequest *, peer * e, int rtt, int hops); - -SQUIDCEXTERN void netdbDeleteAddrNetwork(Ip::Address &addr); -SQUIDCEXTERN void netdbBinaryExchange(StoreEntry *); -SQUIDCEXTERN void netdbExchangeStart(void *); - -SQUIDCEXTERN void netdbExchangeUpdatePeer(Ip::Address &, peer *, double, double); -SQUIDCEXTERN peer *netdbClosestParent(HttpRequest *); -SQUIDCEXTERN void netdbHostData(const char *host, int *samp, int *rtt, int *hops); +extern void netdbFreeMemory(void); +extern int netdbHostHops(const char *host); +extern int netdbHostRtt(const char *host); +extern void netdbUpdatePeer(HttpRequest *, CachePeer * e, int rtt, int hops); + +extern void netdbDeleteAddrNetwork(Ip::Address &addr); +extern void netdbBinaryExchange(StoreEntry *); +extern void netdbExchangeStart(void *); + +extern void netdbExchangeUpdatePeer(Ip::Address &, CachePeer *, double, double); +extern CachePeer *netdbClosestParent(HttpRequest *); +extern void netdbHostData(const char *host, int *samp, int *rtt, int *hops); #endif /* ICMP_NET_DB_H */ === modified file 'src/icp_v2.cc' --- src/icp_v2.cc 2012-08-31 16:57:39 +0000 +++ src/icp_v2.cc 2012-09-04 09:10:20 +0000 @@ -56,6 +56,7 @@ #include "neighbors.h" #include "refresh.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StatCounters.h" #include "Store.h" === modified file 'src/internal.cc' --- src/internal.cc 2012-09-01 14:38:36 +0000 +++ src/internal.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "HttpRequest.h" #include "HttpReply.h" #include "MemBuf.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "tools.h" #include "URL.h" === modified file 'src/ipc.cc' --- src/ipc.cc 2012-08-31 16:57:39 +0000 +++ src/ipc.cc 2012-09-04 09:10:20 +0000 @@ -36,6 +36,7 @@ #include "fde.h" #include "globals.h" #include "ip/Address.h" +#include "SquidConfig.h" #include "SquidIpc.h" #include "tools.h" #include "rfc1738.h" === modified file 'src/ipc/Kids.cc' --- src/ipc/Kids.cc 2012-08-31 16:57:39 +0000 +++ src/ipc/Kids.cc 2012-09-04 09:10:20 +0000 @@ -7,6 +7,7 @@ #include "globals.h" #include "ipc/Kids.h" #include "tools.h" +#include "SquidConfig.h" #include "structs.h" Kids TheKids; === modified file 'src/ipc_win32.cc' --- src/ipc_win32.cc 2012-09-01 14:38:36 +0000 +++ src/ipc_win32.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "fde.h" #include "ip/Address.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidIpc.h" #include "SquidTime.h" #include "tools.h" === modified file 'src/ipcache.cc' --- src/ipcache.cc 2012-08-31 16:57:39 +0000 +++ src/ipcache.cc 2012-09-04 09:10:20 +0000 @@ -41,6 +41,7 @@ #include "Mem.h" #include "mgr/Registration.h" #include "rfc3596.h" +#include "SquidConfig.h" #include "SquidDns.h" #include "SquidTime.h" #include "StatCounters.h" === added file 'src/log/CustomLog.cc' --- src/log/CustomLog.cc 1970-01-01 00:00:00 +0000 +++ src/log/CustomLog.cc 2012-09-06 12:47:15 +0000 @@ -0,0 +1,31 @@ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ +#include "squid.h" +#include "CustomLog.h" + === added file 'src/log/CustomLog.h' --- src/log/CustomLog.h 1970-01-01 00:00:00 +0000 +++ src/log/CustomLog.h 2012-09-18 12:54:44 +0000 @@ -0,0 +1,48 @@ +#ifndef SQUID_CUSTOMLOG_H_ +#define SQUID_CUSTOMLOG_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ +#include "format/Format.h" +#include "log/Formats.h" + +class ACLList; +class Logfile; + +class CustomLog +{ +public: + char *filename; + ACLList *aclList; + Format::Format *logFormat; + Logfile *logfile; + CustomLog *next; + Log::Format::log_type type; +}; + +#endif /* SQUID_CUSTOMLOG_H_ */ === modified file 'src/log/FormatHttpdCombined.cc' --- src/log/FormatHttpdCombined.cc 2012-09-01 14:38:36 +0000 +++ src/log/FormatHttpdCombined.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "HttpRequest.h" #include "log/File.h" #include "log/Formats.h" +#include "SquidConfig.h" #include "SquidTime.h" void === modified file 'src/log/FormatHttpdCommon.cc' --- src/log/FormatHttpdCommon.cc 2012-09-01 14:38:36 +0000 +++ src/log/FormatHttpdCommon.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "globals.h" #include "log/File.h" #include "log/Formats.h" +#include "SquidConfig.h" #include "SquidTime.h" void === modified file 'src/log/FormatSquidCustom.cc' --- src/log/FormatSquidCustom.cc 2012-09-01 14:38:36 +0000 +++ src/log/FormatSquidCustom.cc 2012-09-06 13:29:14 +0000 @@ -32,12 +32,13 @@ #include "squid.h" #include "AccessLogEntry.h" +#include "log/CustomLog.h" #include "log/File.h" #include "log/Formats.h" #include "MemBuf.h" void -Log::Format::SquidCustom(const AccessLogEntry::Pointer &al, customlog * log) +Log::Format::SquidCustom(const AccessLogEntry::Pointer &al, CustomLog * log) { static MemBuf mb; mb.reset(); === modified file 'src/log/FormatSquidIcap.cc' --- src/log/FormatSquidIcap.cc 2012-09-01 14:38:36 +0000 +++ src/log/FormatSquidIcap.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "HttpRequest.h" #include "log/File.h" #include "log/Formats.h" +#include "SquidConfig.h" #include "SquidTime.h" void === modified file 'src/log/FormatSquidNative.cc' --- src/log/FormatSquidNative.cc 2012-09-01 14:38:36 +0000 +++ src/log/FormatSquidNative.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "globals.h" #include "log/File.h" #include "log/Formats.h" +#include "SquidConfig.h" #include "SquidTime.h" void === modified file 'src/log/Formats.h' --- src/log/Formats.h 2012-07-17 14:11:24 +0000 +++ src/log/Formats.h 2012-09-06 13:29:14 +0000 @@ -5,6 +5,7 @@ typedef RefCount AccessLogEntryPointer; class AccessLogEntry; +class CustomLog; class Logfile; namespace Log @@ -40,7 +41,7 @@ void SquidReferer(const AccessLogEntryPointer &al, Logfile * logfile); /// Log with a local custom format -void SquidCustom(const AccessLogEntryPointer &al, customlog * log); +void SquidCustom(const AccessLogEntryPointer &al, CustomLog * log); /// Log with Apache httpd common format void HttpdCommon(const AccessLogEntryPointer &al, Logfile * logfile); === modified file 'src/log/Makefile.am' --- src/log/Makefile.am 2012-08-29 07:29:35 +0000 +++ src/log/Makefile.am 2012-09-06 12:47:15 +0000 @@ -27,5 +27,7 @@ ModTcp.cc \ ModTcp.h \ ModUdp.cc \ - ModUdp.h + ModUdp.h \ + CustomLog.h \ + CustomLog.cc === modified file 'src/log/ModDaemon.cc' --- src/log/ModDaemon.cc 2012-08-31 16:57:39 +0000 +++ src/log/ModDaemon.cc 2012-09-04 09:10:20 +0000 @@ -39,6 +39,7 @@ #include "log/File.h" #include "log/ModDaemon.h" #include "SquidIpc.h" +#include "SquidConfig.h" #include "SquidTime.h" #if HAVE_ERRNO_H === modified file 'src/log/ModStdio.cc' --- src/log/ModStdio.cc 2012-08-31 16:57:39 +0000 +++ src/log/ModStdio.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "globals.h" #include "log/File.h" #include "log/ModStdio.h" +#include "SquidConfig.h" #if HAVE_ERRNO_H #include === modified file 'src/log/ModTcp.cc' --- src/log/ModTcp.cc 2012-08-31 16:57:39 +0000 +++ src/log/ModTcp.cc 2012-09-04 09:10:20 +0000 @@ -40,6 +40,7 @@ #include "log/ModTcp.h" #include "Parsing.h" #include "structs.h" +#include "SquidConfig.h" #if HAVE_ERRNO_H #include === modified file 'src/log/ModUdp.cc' --- src/log/ModUdp.cc 2012-08-31 16:57:39 +0000 +++ src/log/ModUdp.cc 2012-09-04 09:10:20 +0000 @@ -39,6 +39,7 @@ #include "log/ModUdp.h" #include "Parsing.h" #include "structs.h" +#include "SquidConfig.h" #if HAVE_ERRNO_H #include === modified file 'src/log/access_log.cc' --- src/log/access_log.cc 2012-09-01 14:38:36 +0000 +++ src/log/access_log.cc 2012-09-06 13:29:14 +0000 @@ -32,10 +32,10 @@ #include "squid.h" #include "AccessLogEntry.h" -#include "Store.h" -#include "errorpage.h" +#include "acl/Checklist.h" +#include "CachePeer.h" #include "err_detail_type.h" -#include "acl/Checklist.h" +#include "errorpage.h" #include "errorpage.h" #include "format/Token.h" #include "globals.h" @@ -44,12 +44,15 @@ #include "HttpRequest.h" #include "log/access_log.h" #include "log/Config.h" +#include "log/CustomLog.h" #include "log/File.h" #include "log/Formats.h" #include "MemBuf.h" #include "mgr/Registration.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidTime.h" +#include "Store.h" #if USE_SQUID_EUI #include "eui/Eui48.h" @@ -88,7 +91,7 @@ int LogfileStatus = LOG_DISABLE; void -accessLogLogTo(customlog* log, AccessLogEntry::Pointer &al, ACLChecklist * checklist) +accessLogLogTo(CustomLog* log, AccessLogEntry::Pointer &al, ACLChecklist * checklist) { if (al->url == NULL) @@ -201,7 +204,7 @@ void accessLogRotate(void) { - customlog *log; + CustomLog *log; #if USE_FORW_VIA_DB fvdbClear(); @@ -223,7 +226,7 @@ void accessLogClose(void) { - customlog *log; + CustomLog *log; for (log = Config.Log.accesslogs; log; log = log->next) { if (log->logfile) { @@ -298,7 +301,7 @@ void accessLogInit(void) { - customlog *log; + CustomLog *log; accessLogRegisterWithCacheManager(); === modified file 'src/main.cc' --- src/main.cc 2012-09-01 10:40:00 +0000 +++ src/main.cc 2012-09-04 09:10:20 +0000 @@ -83,6 +83,7 @@ #include "send-announce.h" #include "store_log.h" #include "tools.h" +#include "SquidConfig.h" #include "SquidDns.h" #include "SquidTime.h" #include "stat.h" === modified file 'src/mem.cc' --- src/mem.cc 2012-09-01 14:38:36 +0000 +++ src/mem.cc 2012-09-17 18:03:06 +0000 @@ -31,13 +31,19 @@ */ #include "squid.h" +#include "acl/AclDenyInfoList.h" +#include "acl/AclNameList.h" +#include "CacheDigest.h" +#include "ClientInfo.h" #include "event.h" -#include "ClientInfo.h" +#include "md5.h" #include "Mem.h" -#include "md5.h" #include "MemBuf.h" #include "memMeter.h" #include "mgr/Registration.h" +#include "icmp/net_db.h" +#include "RegexList.h" +#include "SquidConfig.h" #include "SquidList.h" #include "SquidTime.h" #include "Store.h" @@ -448,9 +454,9 @@ memDataInit(MEM_16K_BUF, "16K Buffer", 16384, 10, false); memDataInit(MEM_32K_BUF, "32K Buffer", 32768, 10, false); memDataInit(MEM_64K_BUF, "64K Buffer", 65536, 10, false); - memDataInit(MEM_ACL_DENY_INFO_LIST, "acl_deny_info_list", - sizeof(acl_deny_info_list), 0); - memDataInit(MEM_ACL_NAME_LIST, "acl_name_list", sizeof(acl_name_list), 0); + memDataInit(MEM_ACL_DENY_INFO_LIST, "AclDenyInfoList", + sizeof(AclDenyInfoList), 0); + memDataInit(MEM_ACL_NAME_LIST, "acl_name_list", sizeof(AclNameList), 0); #if USE_CACHE_DIGESTS memDataInit(MEM_CACHE_DIGEST, "CacheDigest", sizeof(CacheDigest), 0); @@ -463,7 +469,7 @@ memDataInit(MEM_HTTP_HDR_CONTENT_RANGE, "HttpHdrContRange", sizeof(HttpHdrContRange), 0); memDataInit(MEM_NETDBENTRY, "netdbEntry", sizeof(netdbEntry), 0); memDataInit(MEM_NET_DB_NAME, "net_db_name", sizeof(net_db_name), 0); - memDataInit(MEM_RELIST, "relist", sizeof(relist), 0); + memDataInit(MEM_RELIST, "RegexList", sizeof(RegexList), 0); memDataInit(MEM_CLIENT_INFO, "ClientInfo", sizeof(ClientInfo), 0); memDataInit(MEM_MD5_DIGEST, "MD5 digest", SQUID_MD5_DIGEST_LENGTH, 0); MemPools[MEM_MD5_DIGEST]->setChunkSize(512 * 1024); === modified file 'src/mgr/ActionParams.h' --- src/mgr/ActionParams.h 2012-09-01 14:38:36 +0000 +++ src/mgr/ActionParams.h 2012-09-10 12:49:35 +0000 @@ -9,6 +9,7 @@ #include "HttpRequestMethod.h" #include "ipc/forward.h" #include "mgr/QueryParams.h" +#include "RequestFlags.h" namespace Mgr { @@ -26,7 +27,7 @@ /* details of the client HTTP request that caused the action */ String httpUri; ///< HTTP request URI _method_t httpMethod; ///< HTTP request method - request_flags httpFlags; ///< HTTP request flags + RequestFlags httpFlags; ///< HTTP request flags String httpOrigin; ///< HTTP Origin: header (if any) /* action parameters extracted from the client HTTP request */ === added file 'src/mgr/ActionPasswordList.cc' --- src/mgr/ActionPasswordList.cc 1970-01-01 00:00:00 +0000 +++ src/mgr/ActionPasswordList.cc 2012-09-18 14:06:31 +0000 @@ -0,0 +1,32 @@ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +#include "squid.h" +#include "mgr/ActionPasswordList.h" + === added file 'src/mgr/ActionPasswordList.h' --- src/mgr/ActionPasswordList.h 1970-01-01 00:00:00 +0000 +++ src/mgr/ActionPasswordList.h 2012-09-18 14:06:31 +0000 @@ -0,0 +1,46 @@ +#ifndef SQUID_MGR_CACHEMGRPASSWD_H_ +#define SQUID_MGR_CACHEMGRPASSWD_H_ +/* + * SQUID Web Proxy Cache http://www.squid-cache.org/ + * ---------------------------------------------------------- + * + * Squid is the result of efforts by numerous individuals from + * the Internet community; see the CONTRIBUTORS file for full + * details. Many organizations have provided support for Squid's + * development; see the SPONSORS file for full details. Squid is + * Copyrighted (C) 2001 by the Regents of the University of + * California; see the COPYRIGHT file for full details. Squid + * incorporates software developed and/or copyrighted by other + * sources; see the CREDITS file for full details. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. + * + */ + +class wordlist; + +namespace Mgr { +//TODO: refactor into a std::list-backed proper list. +class ActionPasswordList +{ +public: + char *passwd; + wordlist *actions; + ActionPasswordList *next; +}; + +} //namespace Mgr + +#endif /* SQUID_MGR_CACHEMGRPASSWD_H_ */ === modified file 'src/mgr/BasicActions.cc' --- src/mgr/BasicActions.cc 2012-09-01 14:38:36 +0000 +++ src/mgr/BasicActions.cc 2012-09-04 09:10:20 +0000 @@ -12,6 +12,7 @@ #include "mgr/Registration.h" #include "protos.h" #include "Store.h" +#include "SquidConfig.h" Mgr::IndexAction::Pointer Mgr::IndexAction::Create(const Command::Pointer &cmd) === modified file 'src/mgr/IoAction.cc' --- src/mgr/IoAction.cc 2012-09-01 14:38:36 +0000 +++ src/mgr/IoAction.cc 2012-09-17 15:12:01 +0000 @@ -5,6 +5,7 @@ #include "squid.h" #include "base/TextException.h" +#include "IoStats.h" #include "ipc/Messages.h" #include "ipc/TypedMsgHdr.h" #include "mgr/IoAction.h" @@ -24,13 +25,13 @@ Mgr::IoActionData::operator += (const IoActionData& stats) { http_reads += stats.http_reads; - for (int i = 0; i < _iostats::histSize; ++i) + for (int i = 0; i < IoStats::histSize; ++i) http_read_hist[i] += stats.http_read_hist[i]; ftp_reads += stats.ftp_reads; - for (int i = 0; i < _iostats::histSize; ++i) + for (int i = 0; i < IoStats::histSize; ++i) ftp_read_hist[i] += stats.ftp_read_hist[i]; gopher_reads += stats.gopher_reads; - for (int i = 0; i < _iostats::histSize; ++i) + for (int i = 0; i < IoStats::histSize; ++i) gopher_read_hist[i] += stats.gopher_read_hist[i]; return *this; === modified file 'src/mgr/IoAction.h' --- src/mgr/IoAction.h 2012-09-01 14:38:36 +0000 +++ src/mgr/IoAction.h 2012-09-17 15:12:01 +0000 @@ -7,7 +7,7 @@ #define SQUID_MGR_IO_ACTION_H #include "mgr/Action.h" -#include "structs.h" /* _iostats::histSize */ +#include "IoStats.h" namespace Mgr { @@ -23,9 +23,9 @@ double http_reads; double ftp_reads; double gopher_reads; - double http_read_hist[_iostats::histSize]; - double ftp_read_hist[_iostats::histSize]; - double gopher_read_hist[_iostats::histSize]; + double http_read_hist[IoStats::histSize]; + double ftp_read_hist[IoStats::histSize]; + double gopher_read_hist[IoStats::histSize]; }; /// implement aggregated 'io' action === modified file 'src/mgr/Makefile.am' --- src/mgr/Makefile.am 2012-08-01 12:51:45 +0000 +++ src/mgr/Makefile.am 2012-09-18 14:06:31 +0000 @@ -9,6 +9,8 @@ Action.h \ ActionParams.cc \ ActionParams.h \ + ActionPasswordList.h \ + ActionPasswordList.cc \ ActionProfile.h \ ActionWriter.cc \ ActionWriter.h \ === modified file 'src/mime.cc' --- src/mime.cc 2012-09-01 14:38:36 +0000 +++ src/mime.cc 2012-09-13 16:20:41 +0000 @@ -43,6 +43,8 @@ #include "MemBuf.h" #include "mime.h" #include "MemObject.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "Store.h" #include "StoreClient.h" @@ -430,7 +432,7 @@ int n; - request_flags flags; + RequestFlags flags; struct stat sb; @@ -453,7 +455,7 @@ return; } - flags.cachable = 1; + flags.setCachable(); StoreEntry *e = storeCreateEntry(url, url, flags, === modified file 'src/mime.h' --- src/mime.h 2012-08-29 12:56:25 +0000 +++ src/mime.h 2012-09-17 13:31:37 +0000 @@ -1,6 +1,6 @@ /* - * DEBUG: section - * AUTHOR: + * DEBUG: section 25 MIME Parsing and Internal Icons + * AUTHOR: Harvest Derived * * SQUID Web Proxy Cache http://www.squid-cache.org/ * ---------------------------------------------------------- === modified file 'src/multicast.cc' --- src/multicast.cc 2012-09-01 14:38:36 +0000 +++ src/multicast.cc 2012-09-17 13:31:37 +0000 @@ -1,4 +1,3 @@ - /* * DEBUG: section 07 Multicast * AUTHOR: Martin Hamilton === modified file 'src/multicast.h' --- src/multicast.h 2012-08-29 14:08:06 +0000 +++ src/multicast.h 2012-09-17 13:31:37 +0000 @@ -1,6 +1,6 @@ /* - * DEBUG: section - * AUTHOR: + * DEBUG: section 07 Multicast + * AUTHOR: Martin Hamilton * * SQUID Web Proxy Cache http://www.squid-cache.org/ * ---------------------------------------------------------- === modified file 'src/neighbors.cc' --- src/neighbors.cc 2012-09-03 07:16:45 +0000 +++ src/neighbors.cc 2012-09-13 16:20:41 +0000 @@ -34,6 +34,7 @@ #include "acl/FilledChecklist.h" #include "anyp/PortCfg.h" #include "CacheDigest.h" +#include "CachePeer.h" #include "comm/Connection.h" #include "comm/ConnOpener.h" #include "event.h" @@ -53,6 +54,8 @@ #include "neighbors.h" #include "PeerDigest.h" #include "PeerSelectState.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "SquidTime.h" #include "stat.h" @@ -64,35 +67,35 @@ /* count mcast group peers every 15 minutes */ #define MCAST_COUNT_RATE 900 -bool peerAllowedToUse(const peer *, HttpRequest *); -static int peerWouldBePinged(const peer *, HttpRequest *); -static void neighborRemove(peer *); -static void neighborAlive(peer *, const MemObject *, const icp_common_t *); +bool peerAllowedToUse(const CachePeer *, HttpRequest *); +static int peerWouldBePinged(const CachePeer *, HttpRequest *); +static void neighborRemove(CachePeer *); +static void neighborAlive(CachePeer *, const MemObject *, const icp_common_t *); #if USE_HTCP -static void neighborAliveHtcp(peer *, const MemObject *, const htcpReplyData *); +static void neighborAliveHtcp(CachePeer *, const MemObject *, const htcpReplyData *); #endif -static void neighborCountIgnored(peer *); +static void neighborCountIgnored(CachePeer *); static void peerRefreshDNS(void *); static IPH peerDNSConfigure; -static bool peerProbeConnect(peer *); +static bool peerProbeConnect(CachePeer *); static CNCB peerProbeConnectDone; static void peerCountMcastPeersDone(void *data); static void peerCountMcastPeersStart(void *data); -static void peerCountMcastPeersSchedule(peer * p, time_t when); +static void peerCountMcastPeersSchedule(CachePeer * p, time_t when); static IRCB peerCountHandleIcpReply; static void neighborIgnoreNonPeer(const Ip::Address &, icp_opcode); static OBJH neighborDumpPeers; static OBJH neighborDumpNonPeers; -static void dump_peers(StoreEntry * sentry, peer * peers); +static void dump_peers(StoreEntry * sentry, CachePeer * peers); static unsigned short echo_port; static int NLateReplies = 0; -static peer *first_ping = NULL; +static CachePeer *first_ping = NULL; const char * -neighborTypeStr(const peer * p) +neighborTypeStr(const CachePeer * p) { if (p->type == PEER_NONE) return "Non-Peer"; @@ -106,12 +109,12 @@ return "Parent"; } -peer * +CachePeer * whichPeer(const Ip::Address &from) { int j; - peer *p = NULL; + CachePeer *p = NULL; debugs(15, 3, "whichPeer: from " << from); for (p = Config.peers; p; p = p->next) { @@ -126,10 +129,10 @@ } peer_t -neighborType(const peer * p, const HttpRequest * request) +neighborType(const CachePeer * p, const HttpRequest * request) { - const struct _domain_type *d = NULL; + const domain_type *d = NULL; for (d = p->typelist; d; d = d->next) { if (0 == matchDomainName(request->GetHost(), d->domain)) @@ -149,33 +152,33 @@ * \return Whether it is appropriate to fetch REQUEST from PEER. */ bool -peerAllowedToUse(const peer * p, HttpRequest * request) +peerAllowedToUse(const CachePeer * p, HttpRequest * request) { - const struct _domain_ping *d = NULL; + const domain_ping *d = NULL; assert(request != NULL); if (neighborType(p, request) == PEER_SIBLING) { #if PEER_MULTICAST_SIBLINGS if (p->type == PEER_MULTICAST && p->options.mcast_siblings && - (request->flags.nocache || request->flags.refresh || request->flags.loopdetect || request->flags.need_validation)) + (request->flags.noCache() || request->flags.refresh() || request->flags.loopDetect() || request->flags.validationNeeded())) debugs(15, 2, "peerAllowedToUse(" << p->name << ", " << request->GetHost() << ") : multicast-siblings optimization match"); #endif - if (request->flags.nocache) - return false; - - if (request->flags.refresh) - return false; - - if (request->flags.loopdetect) - return false; - - if (request->flags.need_validation) + if (request->flags.noCache()) + return false; + + if (request->flags.refresh()) + return false; + + if (request->flags.loopDetect()) + return false; + + if (request->flags.validationNeeded()) return false; } // CONNECT requests are proxy requests. Not to be forwarded to origin servers. - // Unless the destination port matches, in which case we MAY perform a 'DIRECT' to this peer. + // Unless the destination port matches, in which case we MAY perform a 'DIRECT' to this CachePeer. if (p->options.originserver && request->method == METHOD_CONNECT && request->port != p->in_addr.GetPort()) return false; @@ -205,9 +208,9 @@ return (checklist.fastCheck() == ACCESS_ALLOWED); } -/* Return TRUE if it is okay to send an ICP request to this peer. */ +/* Return TRUE if it is okay to send an ICP request to this CachePeer. */ static int -peerWouldBePinged(const peer * p, HttpRequest * request) +peerWouldBePinged(const CachePeer * p, HttpRequest * request) { if (p->icp.port == 0) return 0; @@ -227,7 +230,7 @@ /* the case below seems strange, but can happen if the * URL host is on the other side of a firewall */ if (p->type == PEER_SIBLING) - if (!request->flags.hierarchical) + if (!request->flags.hierarchical()) return 0; if (!peerAllowedToUse(p, request)) @@ -243,9 +246,9 @@ return 1; } -/* Return TRUE if it is okay to send an HTTP request to this peer. */ +/* Return TRUE if it is okay to send an HTTP request to this CachePeer. */ int -peerHTTPOkay(const peer * p, HttpRequest * request) +peerHTTPOkay(const CachePeer * p, HttpRequest * request) { if (p->max_conn) if (p->stats.conn_open >= p->max_conn) @@ -263,7 +266,7 @@ int neighborsCount(HttpRequest * request) { - peer *p = NULL; + CachePeer *p = NULL; int count = 0; for (p = Config.peers; p; p = p->next) @@ -275,10 +278,10 @@ return count; } -peer * +CachePeer * getFirstUpParent(HttpRequest * request) { - peer *p = NULL; + CachePeer *p = NULL; for (p = Config.peers; p; p = p->next) { if (!neighborUp(p)) @@ -297,11 +300,11 @@ return p; } -peer * +CachePeer * getRoundRobinParent(HttpRequest * request) { - peer *p; - peer *q = NULL; + CachePeer *p; + CachePeer *q = NULL; for (p = Config.peers; p; p = p->next) { if (!p->options.roundrobin) @@ -336,11 +339,11 @@ return q; } -peer * +CachePeer * getWeightedRoundRobinParent(HttpRequest * request) { - peer *p; - peer *q = NULL; + CachePeer *p; + CachePeer *q = NULL; int weighted_rtt; for (p = Config.peers; p; p = p->next) { @@ -403,7 +406,7 @@ } /** - * This gets called on startup and restart to kick off the peer round-robin + * This gets called on startup and restart to kick off the CachePeer round-robin * maintenance event. It ensures that no matter how many times its called * no more than one event is scheduled. */ @@ -421,23 +424,23 @@ * Called whenever the round-robin counters need to be reset to a sane state. * So far those times are: * - On startup and reconfigure - to set the counters to sane initial settings. - * - When a peer has revived from dead, to prevent the revived peer being + * - When a CachePeer has revived from dead, to prevent the revived CachePeer being * flooded with requests which it has 'missed' during the down period. */ void peerClearRR() { - peer *p = NULL; + CachePeer *p = NULL; for (p = Config.peers; p; p = p->next) { p->rr_count = 0; } } /** - * Perform all actions when a peer is detected revived. + * Perform all actions when a CachePeer is detected revived. */ void -peerAlive(peer *p) +peerAlive(CachePeer *p) { if (p->stats.logged_state == PEER_DEAD && p->tcp_up) { debugs(15, DBG_IMPORTANT, "Detected REVIVED " << neighborTypeStr(p) << ": " << p->name); @@ -449,10 +452,10 @@ p->stats.probe_start = 0; } -peer * +CachePeer * getDefaultParent(HttpRequest * request) { - peer *p = NULL; + CachePeer *p = NULL; for (p = Config.peers; p; p = p->next) { if (neighborType(p, request) != PEER_PARENT) @@ -473,23 +476,23 @@ return NULL; } -peer * -getNextPeer(peer * p) +CachePeer * +getNextPeer(CachePeer * p) { return p->next; } -peer * +CachePeer * getFirstPeer(void) { return Config.peers; } static void -neighborRemove(peer * target) +neighborRemove(CachePeer * target) { - peer *p = NULL; - peer **P = NULL; + CachePeer *p = NULL; + CachePeer **P = NULL; p = Config.peers; P = &Config.peers; @@ -530,8 +533,8 @@ { struct servent *sep = NULL; const char *me = getMyHostname(); - peer *thisPeer = NULL; - peer *next = NULL; + CachePeer *thisPeer = NULL; + CachePeer *next = NULL; neighborsRegisterWithCacheManager(); @@ -577,7 +580,7 @@ { const char *url = entry->url(); MemObject *mem = entry->mem_obj; - peer *p = NULL; + CachePeer *p = NULL; int i; int reqnum = 0; int flags; @@ -608,7 +611,7 @@ debugs(15, 5, "neighborsUdpPing: Peer " << p->host); if (!peerWouldBePinged(p, request)) - continue; /* next peer */ + continue; /* next CachePeer */ ++peers_pinged; @@ -687,8 +690,8 @@ p->stats.last_query = squid_curtime; /* - * keep probe_start == 0 for a multicast peer, - * so neighborUp() never says this peer is dead. + * keep probe_start == 0 for a multicast CachePeer, + * so neighborUp() never says this CachePeer is dead. */ if ((p->type != PEER_MULTICAST) && (p->stats.probe_start == 0)) @@ -730,9 +733,9 @@ return peers_pinged; } -/* lookup the digest of a given peer */ +/* lookup the digest of a given CachePeer */ lookup_t -peerDigestLookup(peer * p, HttpRequest * request) +peerDigestLookup(CachePeer * p, HttpRequest * request) { #if USE_CACHE_DIGESTS const cache_key *key = request ? storeKeyPublicByRequest(request) : NULL; @@ -772,21 +775,21 @@ return LOOKUP_NONE; } -/* select best peer based on cache digests */ -peer * +/* select best CachePeer based on cache digests */ +CachePeer * neighborsDigestSelect(HttpRequest * request) { - peer *best_p = NULL; + CachePeer *best_p = NULL; #if USE_CACHE_DIGESTS int best_rtt = 0; int choice_count = 0; int ichoice_count = 0; - peer *p; + CachePeer *p; int p_rtt; int i; - if (!request->flags.hierarchical) + if (!request->flags.hierarchical()) return NULL; storeKeyPublicByRequest(request); @@ -814,7 +817,7 @@ debugs(15, 5, "neighborsDigestSelect: peer " << p->host << " rtt: " << p_rtt); - /* is this peer better than others in terms of rtt ? */ + /* is this CachePeer better than others in terms of rtt ? */ if (!best_p || (p_rtt && p_rtt < best_rtt)) { best_p = p; best_rtt = p_rtt; @@ -837,7 +840,7 @@ } void -peerNoteDigestLookup(HttpRequest * request, peer * p, lookup_t lookup) +peerNoteDigestLookup(HttpRequest * request, CachePeer * p, lookup_t lookup) { #if USE_CACHE_DIGESTS if (p) @@ -851,7 +854,7 @@ } static void -neighborAlive(peer * p, const MemObject * mem, const icp_common_t * header) +neighborAlive(CachePeer * p, const MemObject * mem, const icp_common_t * header) { peerAlive(p); ++ p->stats.pings_acked; @@ -863,7 +866,7 @@ } static void -neighborUpdateRtt(peer * p, MemObject * mem) +neighborUpdateRtt(CachePeer * p, MemObject * mem) { int rtt, rtt_av_factor; @@ -888,7 +891,7 @@ #if USE_HTCP static void -neighborAliveHtcp(peer * p, const MemObject * mem, const htcpReplyData * htcp) +neighborAliveHtcp(CachePeer * p, const MemObject * mem, const htcpReplyData * htcp) { peerAlive(p); ++ p->stats.pings_acked; @@ -899,7 +902,7 @@ #endif static void -neighborCountIgnored(peer * p) +neighborCountIgnored(CachePeer * p) { if (p == NULL) return; @@ -909,12 +912,12 @@ ++NLateReplies; } -static peer *non_peers = NULL; +static CachePeer *non_peers = NULL; static void neighborIgnoreNonPeer(const Ip::Address &from, icp_opcode opcode) { - peer *np; + CachePeer *np; for (np = non_peers; np; np = np->next) { if (np->in_addr != from) @@ -927,7 +930,7 @@ } if (np == NULL) { - np = (peer *)xcalloc(1, sizeof(peer)); + np = (CachePeer *)xcalloc(1, sizeof(CachePeer)); np->in_addr = from; np->icp.port = from.GetPort(); np->type = PEER_NONE; @@ -946,11 +949,11 @@ /* ignoreMulticastReply * * * We want to ignore replies from multicast peers if the - * * cache_host_domain rules would normally prevent the peer + * * cache_host_domain rules would normally prevent the CachePeer * * from being used */ static int -ignoreMulticastReply(peer * p, MemObject * mem) +ignoreMulticastReply(CachePeer * p, MemObject * mem) { if (p == NULL) return 0; @@ -974,7 +977,7 @@ void neighborsUdpAck(const cache_key * key, icp_common_t * header, const Ip::Address &from) { - peer *p = NULL; + CachePeer *p = NULL; StoreEntry *entry; MemObject *mem = NULL; peer_t ntype = PEER_NONE; @@ -1086,10 +1089,10 @@ } } -peer * +CachePeer * peerFindByName(const char *name) { - peer *p = NULL; + CachePeer *p = NULL; for (p = Config.peers; p; p = p->next) { if (!strcasecmp(name, p->name)) @@ -1099,10 +1102,10 @@ return p; } -peer * +CachePeer * peerFindByNameAndPort(const char *name, unsigned short port) { - peer *p = NULL; + CachePeer *p = NULL; for (p = Config.peers; p; p = p->next) { if (strcasecmp(name, p->name)) @@ -1118,17 +1121,17 @@ } int -neighborUp(const peer * p) +neighborUp(const CachePeer * p) { if (!p->tcp_up) { - if (!peerProbeConnect((peer *) p)) { + if (!peerProbeConnect((CachePeer *) p)) { debugs(15, 8, "neighborUp: DOWN (probed): " << p->host << " (" << p->in_addr << ")"); return 0; } } /* - * The peer can not be UP if we don't have any IP addresses + * The CachePeer can not be UP if we don't have any IP addresses * for it. */ if (0 == p->n_addresses) { @@ -1154,14 +1157,14 @@ void peerDestroy(void *data) { - peer *p = (peer *)data; + CachePeer *p = (CachePeer *)data; if (p == NULL) return; - struct _domain_ping *nl = NULL; + domain_ping *nl = NULL; - for (struct _domain_ping *l = p->peer_domain; l; l = nl) { + for (domain_ping *l = p->peer_domain; l; l = nl) { nl = l->next; safe_free(l->domain); xfree(l); @@ -1177,7 +1180,7 @@ } void -peerNoteDigestGone(peer * p) +peerNoteDigestGone(CachePeer * p) { #if USE_CACHE_DIGESTS cbdataReferenceDone(p->digest); @@ -1187,7 +1190,7 @@ static void peerDNSConfigure(const ipcache_addrs *ia, const DnsLookupDetails &, void *data) { - peer *p = (peer *)data; + CachePeer *p = (CachePeer *)data; int j; @@ -1236,7 +1239,7 @@ static void peerRefreshDNS(void *data) { - peer *p = NULL; + CachePeer *p = NULL; if (eventFind(peerRefreshDNS, NULL)) eventDelete(peerRefreshDNS, NULL); @@ -1255,7 +1258,7 @@ } static void -peerConnectFailedSilent(peer * p) +peerConnectFailedSilent(CachePeer * p) { p->stats.last_connect_failure = squid_curtime; @@ -1274,14 +1277,14 @@ } void -peerConnectFailed(peer *p) +peerConnectFailed(CachePeer *p) { debugs(15, DBG_IMPORTANT, "TCP connection to " << p->host << "/" << p->http_port << " failed"); peerConnectFailedSilent(p); } void -peerConnectSucceded(peer * p) +peerConnectSucceded(CachePeer * p) { if (!p->tcp_up) { debugs(15, 2, "TCP connection to " << p->host << "/" << p->http_port << " succeded"); @@ -1297,7 +1300,7 @@ * peerProbeConnect will be called on dead peers by neighborUp */ static bool -peerProbeConnect(peer * p) +peerProbeConnect(CachePeer * p) { time_t ctimeout = p->connect_timeout > 0 ? p->connect_timeout : Config.Timeout.peer_connect; bool ret = (squid_curtime - p->stats.last_connect_failure) > (ctimeout * 10); @@ -1308,7 +1311,7 @@ if (squid_curtime - p->stats.last_connect_probe == 0) return ret;/* don't probe to often */ - /* for each IP address of this peer. find one that we can connect to and probe it. */ + /* for each IP address of this CachePeer. find one that we can connect to and probe it. */ for (int i = 0; i < p->n_addresses; ++i) { Comm::ConnectionPointer conn = new Comm::Connection; conn->remote = p->addresses[i]; @@ -1331,7 +1334,7 @@ static void peerProbeConnectDone(const Comm::ConnectionPointer &conn, comm_err_t status, int xerrno, void *data) { - peer *p = (peer*)data; + CachePeer *p = (CachePeer*)data; if (status == COMM_OK) { peerConnectSucceded(p); @@ -1345,7 +1348,7 @@ } static void -peerCountMcastPeersSchedule(peer * p, time_t when) +peerCountMcastPeersSchedule(CachePeer * p, time_t when) { if (p->mcast.flags.count_event_pending) return; @@ -1361,7 +1364,7 @@ static void peerCountMcastPeersStart(void *data) { - peer *p = (peer *)data; + CachePeer *p = (CachePeer *)data; ps_state *psstate; StoreEntry *fake; MemObject *mem; @@ -1373,7 +1376,7 @@ snprintf(url, MAX_URL, "http://"); p->in_addr.ToURL(url+7, MAX_URL -8 ); strcat(url, "/"); - fake = storeCreateEntry(url, url, request_flags(), METHOD_GET); + fake = storeCreateEntry(url, url, RequestFlags(), METHOD_GET); HttpRequest *req = HttpRequest::CreateFromUrl(url); psstate = new ps_state; psstate->request = HTTPMSGLOCK(req); @@ -1407,7 +1410,7 @@ StoreEntry *fake = psstate->entry; if (cbdataReferenceValid(psstate->callback_data)) { - peer *p = (peer *)psstate->callback_data; + CachePeer *p = (CachePeer *)psstate->callback_data; p->mcast.flags.counting = 0; p->mcast.avg_n_members = Math::doubleAverage(p->mcast.avg_n_members, (double) psstate->ping.n_recv, ++p->mcast.n_times_counted, 10); debugs(15, DBG_IMPORTANT, "Group " << p->host << ": " << psstate->ping.n_recv << @@ -1426,7 +1429,7 @@ } static void -peerCountHandleIcpReply(peer * p, peer_t type, AnyP::ProtocolType proto, void *hdrnotused, void *data) +peerCountHandleIcpReply(CachePeer * p, peer_t type, AnyP::ProtocolType proto, void *hdrnotused, void *data) { int rtt_av_factor; @@ -1459,7 +1462,7 @@ } void -dump_peer_options(StoreEntry * sentry, peer * p) +dump_peer_options(StoreEntry * sentry, CachePeer * p) { if (p->options.proxy_only) storeAppendPrintf(sentry, " proxy-only"); @@ -1577,11 +1580,11 @@ } static void -dump_peers(StoreEntry * sentry, peer * peers) +dump_peers(StoreEntry * sentry, CachePeer * peers) { - peer *e = NULL; + CachePeer *e = NULL; char ntoabuf[MAX_IPSTRLEN]; - struct _domain_ping *d = NULL; + domain_ping *d = NULL; icp_opcode op; int i; @@ -1688,7 +1691,7 @@ { StoreEntry *e = Store::Root().get(key); MemObject *mem = NULL; - peer *p; + CachePeer *p; peer_t ntype = PEER_NONE; debugs(15, 6, "neighborsHtcpReply: " << (htcp->hit ? "HIT" : "MISS") << " " << @@ -1753,7 +1756,7 @@ void neighborsHtcpClear(StoreEntry * e, const char *uri, HttpRequest * req, const HttpRequestMethod &method, htcp_clr_reason reason) { - peer *p; + CachePeer *p; char buf[128]; for (p = Config.peers; p; p = p->next) { === modified file 'src/neighbors.h' --- src/neighbors.h 2012-08-29 00:12:28 +0000 +++ src/neighbors.h 2012-09-04 14:38:44 +0000 @@ -34,54 +34,53 @@ #define SQUID_NEIGHBORS_H_ #include "enums.h" -#include "HttpRequestMethod.h" +#include "ICP.h" #include "lookup_t.h" -#include "ip/Address.h" -#include "typedefs.h" class HttpRequest; -class peer; +class HttpRequestMethod; +class CachePeer; class StoreEntry; -SQUIDCEXTERN peer *getFirstPeer(void); -SQUIDCEXTERN peer *getFirstUpParent(HttpRequest *); -SQUIDCEXTERN peer *getNextPeer(peer *); -SQUIDCEXTERN peer *getSingleParent(HttpRequest *); -SQUIDCEXTERN int neighborsCount(HttpRequest *); -SQUIDCEXTERN int neighborsUdpPing(HttpRequest *, +extern CachePeer *getFirstPeer(void); +extern CachePeer *getFirstUpParent(HttpRequest *); +extern CachePeer *getNextPeer(CachePeer *); +extern CachePeer *getSingleParent(HttpRequest *); +extern int neighborsCount(HttpRequest *); +extern int neighborsUdpPing(HttpRequest *, StoreEntry *, IRCB * callback, void *data, int *exprep, int *timeout); -SQUIDCEXTERN void neighborAddAcl(const char *, const char *); +extern void neighborAddAcl(const char *, const char *); -SQUIDCEXTERN void neighborsUdpAck(const cache_key *, icp_common_t *, const Ip::Address &); -SQUIDCEXTERN void neighborAdd(const char *, const char *, int, int, int, int, int); -SQUIDCEXTERN void neighbors_init(void); +extern void neighborsUdpAck(const cache_key *, icp_common_t *, const Ip::Address &); +extern void neighborAdd(const char *, const char *, int, int, int, int, int); +extern void neighbors_init(void); #if USE_HTCP -SQUIDCEXTERN void neighborsHtcpClear(StoreEntry *, const char *, HttpRequest *, const HttpRequestMethod &, htcp_clr_reason); +extern void neighborsHtcpClear(StoreEntry *, const char *, HttpRequest *, const HttpRequestMethod &, htcp_clr_reason); #endif -SQUIDCEXTERN peer *peerFindByName(const char *); -SQUIDCEXTERN peer *peerFindByNameAndPort(const char *, unsigned short); -SQUIDCEXTERN peer *getDefaultParent(HttpRequest * request); -SQUIDCEXTERN peer *getRoundRobinParent(HttpRequest * request); -SQUIDCEXTERN peer *getWeightedRoundRobinParent(HttpRequest * request); -SQUIDCEXTERN void peerClearRRStart(void); -SQUIDCEXTERN void peerClearRR(void); -SQUIDCEXTERN lookup_t peerDigestLookup(peer * p, HttpRequest * request); -SQUIDCEXTERN peer *neighborsDigestSelect(HttpRequest * request); -SQUIDCEXTERN void peerNoteDigestLookup(HttpRequest * request, peer * p, lookup_t lookup); -SQUIDCEXTERN void peerNoteDigestGone(peer * p); -SQUIDCEXTERN int neighborUp(const peer * e); -SQUIDCEXTERN CBDUNL peerDestroy; -SQUIDCEXTERN const char *neighborTypeStr(const peer * e); -SQUIDCEXTERN peer_t neighborType(const peer *, const HttpRequest *); -SQUIDCEXTERN void peerConnectFailed(peer *); -SQUIDCEXTERN void peerConnectSucceded(peer *); -SQUIDCEXTERN void dump_peer_options(StoreEntry *, peer *); -SQUIDCEXTERN int peerHTTPOkay(const peer *, HttpRequest *); +extern CachePeer *peerFindByName(const char *); +extern CachePeer *peerFindByNameAndPort(const char *, unsigned short); +extern CachePeer *getDefaultParent(HttpRequest * request); +extern CachePeer *getRoundRobinParent(HttpRequest * request); +extern CachePeer *getWeightedRoundRobinParent(HttpRequest * request); +extern void peerClearRRStart(void); +extern void peerClearRR(void); +extern lookup_t peerDigestLookup(CachePeer * p, HttpRequest * request); +extern CachePeer *neighborsDigestSelect(HttpRequest * request); +extern void peerNoteDigestLookup(HttpRequest * request, CachePeer * p, lookup_t lookup); +extern void peerNoteDigestGone(CachePeer * p); +extern int neighborUp(const CachePeer * e); +extern CBDUNL peerDestroy; +extern const char *neighborTypeStr(const CachePeer * e); +extern peer_t neighborType(const CachePeer *, const HttpRequest *); +extern void peerConnectFailed(CachePeer *); +extern void peerConnectSucceded(CachePeer *); +extern void dump_peer_options(StoreEntry *, CachePeer *); +extern int peerHTTPOkay(const CachePeer *, HttpRequest *); -SQUIDCEXTERN peer *whichPeer(const Ip::Address &from); +extern CachePeer *whichPeer(const Ip::Address &from); #endif /* SQUID_NEIGHBORS_H_ */ === modified file 'src/pconn.cc' --- src/pconn.cc 2012-09-01 14:38:36 +0000 +++ src/pconn.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "globals.h" #include "mgr/Registration.h" #include "pconn.h" +#include "SquidConfig.h" #include "Store.h" #define PCONN_FDS_SZ 8 /* pconn set size, increase for better memcache hit rate */ === modified file 'src/peer_digest.cc' --- src/peer_digest.cc 2012-09-01 14:38:36 +0000 +++ src/peer_digest.cc 2012-09-13 16:20:41 +0000 @@ -34,6 +34,7 @@ #include "squid.h" #if USE_CACHE_DIGESTS #include "CacheDigest.h" +#include "CachePeer.h" #include "event.h" #include "forward.h" #include "globals.h" @@ -90,7 +91,7 @@ /* initialize peer digest */ static void -peerDigestInit(PeerDigest * pd, peer * p) +peerDigestInit(PeerDigest * pd, CachePeer * p) { assert(pd && p); @@ -137,7 +138,7 @@ /* allocate new peer digest, call Init, and lock everything */ PeerDigest * -peerDigestCreate(peer * p) +peerDigestCreate(CachePeer * p) { PeerDigest *pd; assert(p); @@ -164,7 +165,7 @@ * tell it that the digest is gone. */ if (cbdataReferenceValidDone(peerTmp, &p)) - peerNoteDigestGone((peer *)p); + peerNoteDigestGone((CachePeer *)p); peerDigestClean(pd); @@ -312,7 +313,7 @@ static void peerDigestRequest(PeerDigest * pd) { - peer *p = pd->peer; + CachePeer *p = pd->peer; StoreEntry *e, *old_e; char *url; const cache_key *key; @@ -369,10 +370,10 @@ pd_last_req_time = squid_curtime; - req->flags.cachable = 1; + req->flags.setCachable(); /* the rest is based on clientProcessExpired() */ - req->flags.refresh = 1; + req->flags.setRefresh(); old_e = fetch->old_entry = Store::Root().get(key); === modified file 'src/peer_select.cc' --- src/peer_select.cc 2012-09-01 14:38:36 +0000 +++ src/peer_select.cc 2012-09-13 16:20:41 +0000 @@ -32,6 +32,7 @@ #include "squid.h" #include "acl/FilledChecklist.h" +#include "CachePeer.h" #include "carp.h" #include "client_side.h" #include "DnsLookupDetails.h" @@ -50,6 +51,7 @@ #include "peer_sourcehash.h" #include "peer_userhash.h" #include "PeerSelectState.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" @@ -68,10 +70,10 @@ static void peerPingTimeout(void *data); static IRCB peerHandlePingReply; static void peerSelectStateFree(ps_state * psstate); -static void peerIcpParentMiss(peer *, icp_common_t *, ps_state *); +static void peerIcpParentMiss(CachePeer *, icp_common_t *, ps_state *); #if USE_HTCP -static void peerHtcpParentMiss(peer *, htcpReplyData *, ps_state *); -static void peerHandleHtcpReply(peer *, peer_t, htcpReplyData *, void *); +static void peerHtcpParentMiss(CachePeer *, htcpReplyData *, ps_state *); +static void peerHandleHtcpReply(CachePeer *, peer_t, htcpReplyData *, void *); #endif static int peerCheckNetdbDirect(ps_state * psstate); static void peerGetSomeNeighbor(ps_state *); @@ -79,7 +81,7 @@ static void peerGetSomeDirect(ps_state *); static void peerGetSomeParent(ps_state *); static void peerGetAllParents(ps_state *); -static void peerAddFwdServer(FwdServer **, peer *, hier_code); +static void peerAddFwdServer(FwdServer **, CachePeer *, hier_code); static void peerSelectPinned(ps_state * ps); static void peerSelectDnsResults(const ipcache_addrs *ia, const DnsLookupDetails &details, void *data); @@ -124,7 +126,7 @@ assert(direct != DIRECT_YES); debugs(44, 3, "peerSelectIcpPing: " << entry->url() ); - if (!request->flags.hierarchical && direct != DIRECT_NO) + if (!request->flags.hierarchical() && direct != DIRECT_NO) return 0; if (EBIT_TEST(entry->flags, KEY_PRIVATE) && !neighbors_do_private_keys) @@ -231,9 +233,9 @@ // To resolve this we must use only the original client destination when going DIRECT // on intercepted traffic which failed Host verification const HttpRequest *req = psstate->request; - const bool isIntercepted = !req->flags.redirected && - (req->flags.intercepted || req->flags.spoof_client_ip); - const bool useOriginalDst = Config.onoff.client_dst_passthru || !req->flags.hostVerified; + const bool isIntercepted = !req->flags.isRedirected() && + (req->flags.intercepted() || req->flags.spoofClientIp()); + const bool useOriginalDst = Config.onoff.client_dst_passthru || !req->flags.hostVerified(); const bool choseDirect = fs && fs->code == HIER_DIRECT; if (isIntercepted && useOriginalDst && choseDirect) { // construct a "result" adding the ORIGINAL_DST to the set instead of DIRECT @@ -337,7 +339,7 @@ break; // for TPROXY we must skip unusable addresses. - if (psstate->request->flags.spoof_client_ip && !(fs->_peer && fs->_peer->options.no_tproxy) ) { + if (psstate->request->flags.spoofClientIp() && !(fs->_peer && fs->_peer->options.no_tproxy) ) { if (ia->in_addrs[n].IsIPv4() != psstate->request->client_addr.IsIPv4()) { // we CAN'T spoof the address on this link. find another. continue; @@ -380,7 +382,7 @@ peerCheckNetdbDirect(ps_state * psstate) { #if USE_ICMP - peer *p; + CachePeer *p; int myrtt; int myhops; @@ -427,26 +429,26 @@ HttpRequest *request = ps->request; debugs(44, 3, "peerSelectFoo: '" << RequestMethodStr(request->method) << " " << request->GetHost() << "'"); - /** If we don't know whether DIRECT is permitted ... */ + /* If we don't know whether DIRECT is permitted ... */ if (ps->direct == DIRECT_UNKNOWN) { if (ps->always_direct == ACCESS_DUNNO) { debugs(44, 3, "peerSelectFoo: direct = " << DirectStr[ps->direct] << " (always_direct to be checked)"); - /** check always_direct; */ + /* check always_direct; */ ps->acl_checklist = new ACLFilledChecklist(Config.accessList.AlwaysDirect, request, NULL); ps->acl_checklist->nonBlockingCheck(peerCheckAlwaysDirectDone, ps); return; } else if (ps->never_direct == ACCESS_DUNNO) { debugs(44, 3, "peerSelectFoo: direct = " << DirectStr[ps->direct] << " (never_direct to be checked)"); - /** check never_direct; */ + /* check never_direct; */ ps->acl_checklist = new ACLFilledChecklist(Config.accessList.NeverDirect, request, NULL); ps->acl_checklist->nonBlockingCheck(peerCheckNeverDirectDone, ps); return; - } else if (request->flags.no_direct) { - /** if we are accelerating, direct is not an option. */ + } else if (request->flags.noDirect()) { + /* if we are accelerating, direct is not an option. */ ps->direct = DIRECT_NO; debugs(44, 3, "peerSelectFoo: direct = " << DirectStr[ps->direct] << " (forced non-direct)"); - } else if (request->flags.loopdetect) { - /** if we are in a forwarding-loop, direct is not an option. */ + } else if (request->flags.loopDetect()) { + /* if we are in a forwarding-loop, direct is not an option. */ ps->direct = DIRECT_YES; debugs(44, 3, "peerSelectFoo: direct = " << DirectStr[ps->direct] << " (forwarding loop detected)"); } else if (peerCheckNetdbDirect(ps)) { @@ -490,7 +492,7 @@ if (Config.onoff.prefer_direct) peerGetSomeDirect(ps); - if (request->flags.hierarchical || !Config.onoff.nonhierarchical_direct) { + if (request->flags.hierarchical() || !Config.onoff.nonhierarchical_direct) { peerGetSomeParent(ps); peerGetAllParents(ps); } @@ -505,7 +507,7 @@ peerSelectDnsPaths(ps); } -bool peerAllowedToUse(const peer * p, HttpRequest * request); +bool peerAllowedToUse(const CachePeer * p, HttpRequest * request); /** * peerSelectPinned @@ -518,7 +520,7 @@ HttpRequest *request = ps->request; if (!request->pinnedConnection()) return; - peer *pear = request->pinnedConnection()->pinnedPeer(); + CachePeer *pear = request->pinnedConnection()->pinnedPeer(); if (Comm::IsConnOpen(request->pinnedConnection()->validatePinnedConnection(request, pear))) { if (pear && peerAllowedToUse(pear, request)) { peerAddFwdServer(&ps->servers, pear, PINNED); @@ -547,7 +549,7 @@ { StoreEntry *entry = ps->entry; HttpRequest *request = ps->request; - peer *p; + CachePeer *p; hier_code code = HIER_NONE; assert(entry->ping_status == PING_NONE); @@ -611,7 +613,7 @@ peerGetSomeNeighborReplies(ps_state * ps) { HttpRequest *request = ps->request; - peer *p = NULL; + CachePeer *p = NULL; hier_code code = HIER_NONE; assert(ps->entry->ping_status == PING_WAITING); assert(ps->direct != DIRECT_YES); @@ -662,7 +664,7 @@ static void peerGetSomeParent(ps_state * ps) { - peer *p; + CachePeer *p; HttpRequest *request = ps->request; hier_code code = HIER_NONE; debugs(44, 3, "peerGetSomeParent: " << RequestMethodStr(request->method) << " " << request->GetHost()); @@ -699,7 +701,7 @@ static void peerGetAllParents(ps_state * ps) { - peer *p; + CachePeer *p; HttpRequest *request = ps->request; /* Add all alive parents */ @@ -759,7 +761,7 @@ } static void -peerIcpParentMiss(peer * p, icp_common_t * header, ps_state * ps) +peerIcpParentMiss(CachePeer * p, icp_common_t * header, ps_state * ps) { int rtt; @@ -800,7 +802,7 @@ } static void -peerHandleIcpReply(peer * p, peer_t type, icp_common_t * header, void *data) +peerHandleIcpReply(CachePeer * p, peer_t type, icp_common_t * header, void *data) { ps_state *psstate = (ps_state *)data; icp_opcode op = header->getOpCode(); @@ -834,7 +836,7 @@ #if USE_HTCP static void -peerHandleHtcpReply(peer * p, peer_t type, htcpReplyData * htcp, void *data) +peerHandleHtcpReply(CachePeer * p, peer_t type, htcpReplyData * htcp, void *data) { ps_state *psstate = (ps_state *)data; debugs(44, 3, "peerHandleHtcpReply: " << @@ -859,7 +861,7 @@ } static void -peerHtcpParentMiss(peer * p, htcpReplyData * htcp, ps_state * ps) +peerHtcpParentMiss(CachePeer * p, htcpReplyData * htcp, ps_state * ps) { int rtt; @@ -900,7 +902,7 @@ #endif static void -peerHandlePingReply(peer * p, peer_t type, AnyP::ProtocolType proto, void *pingdata, void *data) +peerHandlePingReply(CachePeer * p, peer_t type, AnyP::ProtocolType proto, void *pingdata, void *data) { if (proto == AnyP::PROTO_ICP) peerHandleIcpReply(p, type, (icp_common_t *)pingdata, data); @@ -917,7 +919,7 @@ } static void -peerAddFwdServer(FwdServer ** FSVR, peer * p, hier_code code) +peerAddFwdServer(FwdServer ** FSVR, CachePeer * p, hier_code code) { FwdServer *fs = (FwdServer *)memAllocate(MEM_FWD_SERVER); debugs(44, 5, "peerAddFwdServer: adding " << === modified file 'src/peer_sourcehash.cc' --- src/peer_sourcehash.cc 2012-09-01 14:38:36 +0000 +++ src/peer_sourcehash.cc 2012-09-04 15:15:51 +0000 @@ -33,9 +33,11 @@ */ #include "squid.h" +#include "CachePeer.h" #include "HttpRequest.h" #include "mgr/Registration.h" #include "neighbors.h" +#include "SquidConfig.h" #include "Store.h" #if HAVE_MATH_H @@ -45,15 +47,15 @@ #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) static int n_sourcehash_peers = 0; -static peer **sourcehash_peers = NULL; +static CachePeer **sourcehash_peers = NULL; static OBJH peerSourceHashCachemgr; static void peerSourceHashRegisterWithCacheManager(void); static int peerSortWeight(const void *a, const void *b) { - const peer *const *p1 = (const peer *const *)a; - const peer *const *p2 = (const peer *const *)b; + const CachePeer *const *p1 = (const CachePeer *const *)a; + const CachePeer *const *p2 = (const CachePeer *const *)b; return (*p1)->weight - (*p2)->weight; } @@ -64,8 +66,8 @@ int K; int k; double P_last, X_last, Xn; - peer *p; - peer **P; + CachePeer *p; + CachePeer **P; char *t; /* Clean up */ @@ -96,7 +98,7 @@ if (n_sourcehash_peers == 0) return; - sourcehash_peers = (peer **)xcalloc(n_sourcehash_peers, sizeof(*sourcehash_peers)); + sourcehash_peers = (CachePeer **)xcalloc(n_sourcehash_peers, sizeof(*sourcehash_peers)); /* Build a list of the found peers and calculate hashes and load factors */ for (P = sourcehash_peers, p = Config.peers; p; p = p->next) { @@ -164,13 +166,13 @@ peerSourceHashCachemgr, 0, 1); } -peer * +CachePeer * peerSourceHashSelectParent(HttpRequest * request) { int k; const char *c; - peer *p = NULL; - peer *tp; + CachePeer *p = NULL; + CachePeer *tp; unsigned int user_hash = 0; unsigned int combined_hash; double score; @@ -189,7 +191,7 @@ for (c = key; *c != 0; ++c) user_hash += ROTATE_LEFT(user_hash, 19) + *c; - /* select peer */ + /* select CachePeer */ for (k = 0; k < n_sourcehash_peers; ++k) { tp = sourcehash_peers[k]; combined_hash = (user_hash ^ tp->sourcehash.hash); @@ -214,7 +216,7 @@ static void peerSourceHashCachemgr(StoreEntry * sentry) { - peer *p; + CachePeer *p; int sumfetches = 0; storeAppendPrintf(sentry, "%24s %10s %10s %10s %10s\n", "Hostname", === modified file 'src/peer_sourcehash.h' --- src/peer_sourcehash.h 2012-08-29 00:12:28 +0000 +++ src/peer_sourcehash.h 2012-09-04 14:38:44 +0000 @@ -34,10 +34,10 @@ #ifndef SQUID_PEER_SOURCEHASH_H_ #define SQUID_PEER_SOURCEHASH_H_ -class peer; +class CachePeer; class HttpRequest; extern void peerSourceHashInit(void); -extern peer * peerSourceHashSelectParent(HttpRequest * request); +extern CachePeer * peerSourceHashSelectParent(HttpRequest * request); #endif /* SQUID_PEER_SOURCEHASH_H_ */ === modified file 'src/peer_userhash.cc' --- src/peer_userhash.cc 2012-09-01 14:38:36 +0000 +++ src/peer_userhash.cc 2012-09-04 15:15:51 +0000 @@ -37,10 +37,12 @@ #if USE_AUTH #include "auth/UserRequest.h" +#include "CachePeer.h" #include "globals.h" #include "HttpRequest.h" #include "mgr/Registration.h" #include "neighbors.h" +#include "SquidConfig.h" #include "Store.h" #if HAVE_MATH_H @@ -50,15 +52,15 @@ #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n)))) static int n_userhash_peers = 0; -static peer **userhash_peers = NULL; +static CachePeer **userhash_peers = NULL; static OBJH peerUserHashCachemgr; static void peerUserHashRegisterWithCacheManager(void); static int peerSortWeight(const void *a, const void *b) { - const peer *const *p1 = (const peer *const *)a; - const peer *const *p2 = (const peer *const *)b; + const CachePeer *const *p1 = (const CachePeer *const *)a; + const CachePeer *const *p2 = (const CachePeer *const *)b; return (*p1)->weight - (*p2)->weight; } @@ -69,8 +71,8 @@ int K; int k; double P_last, X_last, Xn; - peer *p; - peer **P; + CachePeer *p; + CachePeer **P; char *t; /* Clean up */ @@ -101,7 +103,7 @@ if (n_userhash_peers == 0) return; - userhash_peers = (peer **)xcalloc(n_userhash_peers, sizeof(*userhash_peers)); + userhash_peers = (CachePeer **)xcalloc(n_userhash_peers, sizeof(*userhash_peers)); /* Build a list of the found peers and calculate hashes and load factors */ for (P = userhash_peers, p = Config.peers; p; p = p->next) { @@ -169,13 +171,13 @@ 0, 1); } -peer * +CachePeer * peerUserHashSelectParent(HttpRequest * request) { int k; const char *c; - peer *p = NULL; - peer *tp; + CachePeer *p = NULL; + CachePeer *tp; unsigned int user_hash = 0; unsigned int combined_hash; double score; @@ -197,7 +199,7 @@ for (c = key; *c != 0; ++c) user_hash += ROTATE_LEFT(user_hash, 19) + *c; - /* select peer */ + /* select CachePeer */ for (k = 0; k < n_userhash_peers; ++k) { tp = userhash_peers[k]; combined_hash = (user_hash ^ tp->userhash.hash); @@ -222,7 +224,7 @@ static void peerUserHashCachemgr(StoreEntry * sentry) { - peer *p; + CachePeer *p; int sumfetches = 0; storeAppendPrintf(sentry, "%24s %10s %10s %10s %10s\n", "Hostname", === modified file 'src/peer_userhash.h' --- src/peer_userhash.h 2012-08-29 00:12:28 +0000 +++ src/peer_userhash.h 2012-09-04 14:38:44 +0000 @@ -34,10 +34,10 @@ #ifndef SQUID_PEER_USERHASH_H_ #define SQUID_PEER_USERHASH_H_ -class peer; +class CachePeer; class HttpRequest; extern void peerUserHashInit(void); -extern peer * peerUserHashSelectParent(HttpRequest * request); +extern CachePeer * peerUserHashSelectParent(HttpRequest * request); #endif /* SQUID_PEER_USERHASH_H_ */ === modified file 'src/redirect.cc' --- src/redirect.cc 2012-08-31 16:57:39 +0000 +++ src/redirect.cc 2012-09-04 09:10:20 +0000 @@ -44,6 +44,7 @@ #include "mgr/Registration.h" #include "redirect.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "Store.h" #if USE_AUTH #include "auth/UserRequest.h" === modified file 'src/refresh.cc' --- src/refresh.cc 2012-09-01 14:38:36 +0000 +++ src/refresh.cc 2012-09-13 16:20:41 +0000 @@ -41,7 +41,9 @@ #include "HttpRequest.h" #include "HttpReply.h" #include "MemObject.h" +#include "RefreshPattern.h" #include "SquidTime.h" +#include "SquidConfig.h" #include "Store.h" #include "URL.h" @@ -108,16 +110,16 @@ #define REFRESH_DEFAULT_PCT 0.20 #define REFRESH_DEFAULT_MAX (time_t)259200 -static const refresh_t *refreshUncompiledPattern(const char *); +static const RefreshPattern *refreshUncompiledPattern(const char *); static OBJH refreshStats; -static int refreshStaleness(const StoreEntry * entry, time_t check_time, const time_t age, const refresh_t * R, stale_flags * sf); - -static refresh_t DefaultRefresh; - -const refresh_t * +static int refreshStaleness(const StoreEntry * entry, time_t check_time, const time_t age, const RefreshPattern * R, stale_flags * sf); + +static RefreshPattern DefaultRefresh; + +const RefreshPattern * refreshLimits(const char *url) { - const refresh_t *R; + const RefreshPattern *R; for (R = Config.Refresh; R; R = R->next) { if (!regexec(&(R->compiled_pattern), url, 0, 0, 0)) @@ -127,10 +129,10 @@ return NULL; } -static const refresh_t * +static const RefreshPattern * refreshUncompiledPattern(const char *pat) { - const refresh_t *R; + const RefreshPattern *R; for (R = Config.Refresh; R; R = R->next) { if (0 == strcmp(R->pattern, pat)) @@ -156,7 +158,7 @@ * times. */ static int -refreshStaleness(const StoreEntry * entry, time_t check_time, const time_t age, const refresh_t * R, stale_flags * sf) +refreshStaleness(const StoreEntry * entry, time_t check_time, const time_t age, const RefreshPattern * R, stale_flags * sf) { /** \par * Check for an explicit expiration time (Expires: header). @@ -230,7 +232,7 @@ static int refreshCheck(const StoreEntry * entry, HttpRequest * request, time_t delta) { - const refresh_t *R; + const RefreshPattern *R; const char *uri = NULL; time_t age = 0; time_t check_time = squid_curtime + delta; @@ -265,7 +267,7 @@ debugs(22, 3, "\tentry->timestamp:\t" << mkrfc1123(entry->timestamp)); - if (request && !request->flags.ignore_cc) { + if (request && !request->flags.ignoringCacheControl()) { const HttpHdrCc *const cc = request->cache_control; if (cc && cc->hasMinFresh()) { const int32_t minFresh=cc->minFresh(); @@ -291,7 +293,7 @@ entry->mem_obj->getReply()->cache_control->staleIfError() < staleness) { debugs(22, 3, "refreshCheck: stale-if-error period expired."); - request->flags.fail_on_validation_err = 1; + request->flags.setFailOnValidationError(); } if (EBIT_TEST(entry->flags, ENTRY_REVALIDATE) && staleness > -1 @@ -301,15 +303,15 @@ ) { debugs(22, 3, "refreshCheck: YES: Must revalidate stale response"); if (request) - request->flags.fail_on_validation_err = 1; + request->flags.setFailOnValidationError(); return STALE_MUST_REVALIDATE; } /* request-specific checks */ - if (request && !request->flags.ignore_cc) { + if (request && !request->flags.ignoringCacheControl()) { HttpHdrCc *cc = request->cache_control; - if (request->flags.ims && (R->flags.refresh_ims || Config.onoff.refresh_all_ims)) { + if (request->flags.hasIMS() && (R->flags.refresh_ims || Config.onoff.refresh_all_ims)) { /* The clients no-cache header is changed into a IMS query */ debugs(22, 3, "refreshCheck: YES: refresh-ims"); return STALE_FORCED_RELOAD; @@ -317,7 +319,7 @@ #if USE_HTTP_VIOLATIONS - if (!request->flags.nocache_hack) { + if (!request->flags.noCacheHackEnabled()) { (void) 0; } else if (R->flags.ignore_reload) { /* The clients no-cache header is ignored */ @@ -329,7 +331,7 @@ } else { /* The clients no-cache header is not overridden on this request */ debugs(22, 3, "refreshCheck: YES: client reload"); - request->flags.nocache = 1; + request->flags.setNocache(); return STALE_FORCED_RELOAD; } @@ -396,7 +398,7 @@ if ( max_stale >= 0 && staleness > max_stale) { debugs(22, 3, "refreshCheck: YES: max-stale limit"); if (request) - request->flags.fail_on_validation_err = 1; + request->flags.setFailOnValidationError(); return STALE_MAX_STALE; } @@ -492,7 +494,8 @@ int reason = refreshCheck(entry, request, 0); ++ refreshCounts[rcHTTP].total; ++ refreshCounts[rcHTTP].status[reason]; - request->flags.stale_if_hit = refreshIsStaleIfHit(reason); + if (refreshIsStaleIfHit(reason)) + request->flags.setStaleIfHit(); return (Config.onoff.offline || reason < 200) ? 0 : 1; } @@ -534,7 +537,7 @@ time_t getMaxAge(const char *url) { - const refresh_t *R; + const RefreshPattern *R; debugs(22, 3, "getMaxAge: '" << url << "'"); if ((R = refreshLimits(url))) === modified file 'src/refresh.h' --- src/refresh.h 2012-08-29 00:12:28 +0000 +++ src/refresh.h 2012-09-10 07:59:18 +0000 @@ -33,6 +33,8 @@ #ifndef SQUID_REFRESH_H_ #define SQUID_REFRESH_H_ +class RefreshPattern; + extern void refreshAddToList(const char *, int, time_t, int, time_t); extern int refreshIsCachable(const StoreEntry *); extern int refreshCheckHTTP(const StoreEntry *, HttpRequest *); @@ -41,6 +43,6 @@ extern int refreshCheckDigest(const StoreEntry *, time_t delta); extern time_t getMaxAge(const char *url); extern void refreshInit(void); -extern const refresh_t *refreshLimits(const char *url); +extern const RefreshPattern *refreshLimits(const char *url); #endif /* SQUID_REFRESH_H_ */ === modified file 'src/send-announce.cc' --- src/send-announce.cc 2012-08-31 16:57:39 +0000 +++ src/send-announce.cc 2012-09-04 09:10:20 +0000 @@ -39,6 +39,7 @@ #include "globals.h" #include "ICP.h" #include "ipcache.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "tools.h" === modified file 'src/snmp_agent.cc' --- src/snmp_agent.cc 2012-09-01 14:38:36 +0000 +++ src/snmp_agent.cc 2012-09-04 15:15:51 +0000 @@ -31,6 +31,7 @@ */ #include "squid.h" +#include "CachePeer.h" #include "cache_snmp.h" #include "globals.h" #include "mem_node.h" @@ -39,6 +40,7 @@ #include "snmp_core.h" #include "StatCounters.h" #include "StatHist.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "SquidTime.h" #include "stat.h" @@ -207,7 +209,7 @@ Ip::Address laddr; char *cp = NULL; - peer *p = NULL; + CachePeer *p = NULL; int cnt = 0; debugs(49, 5, "snmp_meshPtblFn: peer " << Var->name[LEN_SQ_MESH + 3] << " requested!"); *ErrP = SNMP_ERR_NOERROR; === modified file 'src/snmp_agent.h' --- src/snmp_agent.h 2012-08-31 15:45:51 +0000 +++ src/snmp_agent.h 2012-09-17 13:31:37 +0000 @@ -1,8 +1,8 @@ #ifndef SQUID_SNMP_AGENT_H_ #define SQUID_SNMP_AGENT_H_ /* - * DEBUG: section - * AUTHOR: + * DEBUG: section 49 SNMP Interface + * AUTHOR: Kostas Anagnostakis * * SQUID Web Proxy Cache http://www.squid-cache.org/ * ---------------------------------------------------------- === modified file 'src/snmp_core.cc' --- src/snmp_core.cc 2012-08-31 16:57:39 +0000 +++ src/snmp_core.cc 2012-09-04 15:15:51 +0000 @@ -32,6 +32,7 @@ #include "squid.h" #include "acl/FilledChecklist.h" #include "base/CbcPointer.h" +#include "CachePeer.h" #include "client_db.h" #include "comm.h" #include "comm/Connection.h" @@ -42,6 +43,7 @@ #include "snmp_agent.h" #include "snmp_core.h" #include "snmp/Forwarder.h" +#include "SquidConfig.h" #include "tools.h" static void snmpPortOpened(const Comm::ConnectionPointer &conn, int errNo); @@ -747,7 +749,7 @@ peer_Inst(oid * name, snint * len, mib_tree_entry * current, oid_ParseFn ** Fn) { oid *instance = NULL; - peer *peers = Config.peers; + CachePeer *peers = Config.peers; if (peers == NULL) { debugs(49, 6, "snmp peer_Inst: No Peers."); === modified file 'src/ssl/context_storage.cc' --- src/ssl/context_storage.cc 2012-07-23 15:34:12 +0000 +++ src/ssl/context_storage.cc 2012-09-04 15:15:51 +0000 @@ -9,6 +9,9 @@ #if HAVE_LIMITS #include #endif +#if USE_SSL +#include +#endif Ssl::CertificateStorageAction::CertificateStorageAction(const Mgr::Command::Pointer &cmd) : Mgr::Action(cmd) === modified file 'src/ssl/context_storage.h' --- src/ssl/context_storage.h 2012-08-28 13:00:30 +0000 +++ src/ssl/context_storage.h 2012-09-18 12:37:07 +0000 @@ -17,6 +17,7 @@ #if HAVE_LIST #include #endif +#include /// TODO: Replace on real size. #define SSL_CTX_SIZE 1024 === modified file 'src/ssl/helper.cc' --- src/ssl/helper.cc 2012-08-31 16:57:39 +0000 +++ src/ssl/helper.cc 2012-09-04 09:10:20 +0000 @@ -1,7 +1,3 @@ -/* - * 2008/11/14 - */ - #include "squid.h" #include "anyp/PortCfg.h" #include "ssl/Config.h" @@ -10,6 +6,7 @@ #include "SquidTime.h" #include "SwapDir.h" #include "wordlist.h" +#include "SquidConfig.h" Ssl::Helper * Ssl::Helper::GetInstance() { === modified file 'src/ssl/support.cc' --- src/ssl/support.cc 2012-09-09 17:13:42 +0000 +++ src/ssl/support.cc 2012-09-09 19:41:47 +0000 @@ -42,6 +42,7 @@ #include "anyp/PortCfg.h" #include "fde.h" #include "globals.h" +#include "SquidConfig.h" #include "ssl/ErrorDetail.h" #include "ssl/support.h" #include "ssl/gadgets.h" === modified file 'src/stat.cc' --- src/stat.cc 2012-09-01 14:38:36 +0000 +++ src/stat.cc 2012-09-17 15:12:01 +0000 @@ -32,6 +32,7 @@ #include "squid.h" #include "CacheDigest.h" +#include "CachePeer.h" #include "client_side_request.h" #include "client_side.h" #include "comm/Connection.h" @@ -41,6 +42,7 @@ #include "format/Token.h" #include "globals.h" #include "HttpRequest.h" +#include "IoStats.h" #include "MemObject.h" #include "mem_node.h" #include "MemBuf.h" @@ -53,6 +55,7 @@ #include "mgr/ServiceTimesAction.h" #include "neighbors.h" #include "PeerDigest.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "SquidTime.h" #include "StatCounters.h" @@ -219,19 +222,19 @@ stats.http_reads = IOStats.Http.reads; - for (i = 0; i < _iostats::histSize; ++i) { + for (i = 0; i < IoStats::histSize; ++i) { stats.http_read_hist[i] = IOStats.Http.read_hist[i]; } stats.ftp_reads = IOStats.Ftp.reads; - for (i = 0; i < _iostats::histSize; ++i) { + for (i = 0; i < IoStats::histSize; ++i) { stats.ftp_read_hist[i] = IOStats.Ftp.read_hist[i]; } stats.gopher_reads = IOStats.Gopher.reads; - for (i = 0; i < _iostats::histSize; ++i) { + for (i = 0; i < IoStats::histSize; ++i) { stats.gopher_read_hist[i] = IOStats.Gopher.read_hist[i]; } } @@ -245,7 +248,7 @@ storeAppendPrintf(sentry, "number of reads: %.0f\n", stats.http_reads); storeAppendPrintf(sentry, "Read Histogram:\n"); - for (i = 0; i < _iostats::histSize; ++i) { + for (i = 0; i < IoStats::histSize; ++i) { storeAppendPrintf(sentry, "%5d-%5d: %9.0f %2.0f%%\n", i ? (1 << (i - 1)) + 1 : 1, 1 << i, @@ -258,7 +261,7 @@ storeAppendPrintf(sentry, "number of reads: %.0f\n", stats.ftp_reads); storeAppendPrintf(sentry, "Read Histogram:\n"); - for (i = 0; i < _iostats::histSize; ++i) { + for (i = 0; i < IoStats::histSize; ++i) { storeAppendPrintf(sentry, "%5d-%5d: %9.0f %2.0f%%\n", i ? (1 << (i - 1)) + 1 : 1, 1 << i, @@ -271,7 +274,7 @@ storeAppendPrintf(sentry, "number of reads: %.0f\n", stats.gopher_reads); storeAppendPrintf(sentry, "Read Histogram:\n"); - for (i = 0; i < _iostats::histSize; ++i) { + for (i = 0; i < IoStats::histSize; ++i) { storeAppendPrintf(sentry, "%5d-%5d: %9.0f %2.0f%%\n", i ? (1 << (i - 1)) + 1 : 1, 1 << i, @@ -1810,7 +1813,7 @@ { #if USE_CACHE_DIGESTS StatCounters *f = &statCounter; - peer *peer; + CachePeer *peer; const int tot_used = f->cd.times_used + f->icp.times_used; /* totals */ === modified file 'src/store.cc' --- src/store.cc 2012-09-01 14:38:36 +0000 +++ src/store.cc 2012-09-13 16:20:41 +0000 @@ -48,6 +48,8 @@ #include "mgr/StoreIoAction.h" #include "profiler/Profiler.h" #include "repl_modules.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Stack.h" #include "StatCounters.h" @@ -816,7 +818,7 @@ } StoreEntry * -storeCreateEntry(const char *url, const char *log_url, request_flags flags, const HttpRequestMethod& method) +storeCreateEntry(const char *url, const char *log_url, const RequestFlags &flags, const HttpRequestMethod& method) { StoreEntry *e = NULL; MemObject *mem = NULL; @@ -827,12 +829,12 @@ mem = e->mem_obj; mem->method = method; - if (neighbors_do_private_keys || !flags.hierarchical) + if (neighbors_do_private_keys || !flags.hierarchical()) e->setPrivateKey(); else e->setPublicKey(); - if (flags.cachable) { + if (flags.isCachable()) { EBIT_SET(e->flags, ENTRY_CACHABLE); EBIT_CLR(e->flags, RELEASE_REQUEST); } else { @@ -1965,7 +1967,7 @@ { const String reqETags = request.header.getList(HDR_IF_NONE_MATCH); // weak comparison is allowed only for HEAD or full-body GET requests - const bool allowWeakMatch = !request.flags.range && + const bool allowWeakMatch = !request.flags.isRanged() && (request.method == METHOD_GET || request.method == METHOD_HEAD); return hasOneOfEtags(reqETags, allowWeakMatch); } === modified file 'src/store_client.cc' --- src/store_client.cc 2012-09-01 14:38:36 +0000 +++ src/store_client.cc 2012-09-13 16:20:41 +0000 @@ -40,6 +40,7 @@ #include "MemObject.h" #include "mime_header.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "StatCounters.h" #include "StoreClient.h" #include "Store.h" @@ -790,7 +791,7 @@ assert(mem); debugs(90, 3, "CheckQuickAbort2: entry=" << entry << ", mem=" << mem); - if (mem->request && !mem->request->flags.cachable) { + if (mem->request && !mem->request->flags.isCachable()) { debugs(90, 3, "CheckQuickAbort2: YES !mem->request->flags.cachable"); return 1; } === modified file 'src/store_digest.cc' --- src/store_digest.cc 2012-08-31 16:57:39 +0000 +++ src/store_digest.cc 2012-09-13 16:20:41 +0000 @@ -51,6 +51,7 @@ #include "MemObject.h" #include "PeerDigest.h" #include "refresh.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "Store.h" #include "StoreSearch.h" @@ -376,7 +377,7 @@ static void storeDigestRewriteStart(void *datanotused) { - request_flags flags; + RequestFlags flags; char *url; StoreEntry *e; @@ -391,7 +392,7 @@ debugs(71, 2, "storeDigestRewrite: start rewrite #" << sd_state.rewrite_count + 1); /* make new store entry */ url = internalLocalUri("/squid-internal-periodic/", StoreDigestFileName); - flags.cachable = 1; + flags.setCachable(); e = storeCreateEntry(url, url, flags, METHOD_GET); assert(e); sd_state.rewrite_lock = e; === modified file 'src/store_dir.cc' --- src/store_dir.cc 2012-09-01 14:38:36 +0000 +++ src/store_dir.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "MemObject.h" #include "MemStore.h" #include "profiler/Profiler.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "SquidTime.h" #include "Store.h" === modified file 'src/store_io.cc' --- src/store_io.cc 2012-08-14 11:53:07 +0000 +++ src/store_io.cc 2012-09-04 09:10:20 +0000 @@ -1,6 +1,7 @@ #include "squid.h" #include "Store.h" #include "MemObject.h" +#include "SquidConfig.h" #include "SwapDir.h" StoreIoStats store_io_stats; === modified file 'src/store_log.cc' --- src/store_log.cc 2012-08-29 16:01:32 +0000 +++ src/store_log.cc 2012-09-04 09:10:20 +0000 @@ -38,6 +38,7 @@ #include "mgr/Registration.h" #include "Store.h" #include "store_log.h" +#include "SquidConfig.h" #include "SquidTime.h" static const char *storeLogTags[] = { === modified file 'src/store_rebuild.cc' --- src/store_rebuild.cc 2012-08-31 16:57:39 +0000 +++ src/store_rebuild.cc 2012-09-06 14:22:03 +0000 @@ -41,12 +41,13 @@ #include "store_digest.h" #include "store_rebuild.h" #include "StoreSearch.h" +#include "SquidConfig.h" #include "SquidTime.h" #if HAVE_ERRNO_H #include #endif -static struct _store_rebuild_data counts; +static StoreRebuildData counts; static struct timeval rebuild_start; static void storeCleanup(void *); @@ -136,7 +137,7 @@ /* meta data recreated from disk image in swap directory */ void -storeRebuildComplete(struct _store_rebuild_data *dc) +storeRebuildComplete(StoreRebuildData *dc) { double dt; counts.objcount += dc->objcount; @@ -294,7 +295,7 @@ bool storeRebuildLoadEntry(int fd, int diskIndex, MemBuf &buf, - struct _store_rebuild_data &counts) + StoreRebuildData &counts) { if (fd < 0) return false; @@ -316,7 +317,7 @@ bool storeRebuildParseEntry(MemBuf &buf, StoreEntry &tmpe, cache_key *key, - struct _store_rebuild_data &counts, + StoreRebuildData &counts, uint64_t expectedSize) { int swap_hdr_len = 0; @@ -382,7 +383,7 @@ bool storeRebuildKeepEntry(const StoreEntry &tmpe, const cache_key *key, - struct _store_rebuild_data &counts) + StoreRebuildData &counts) { /* this needs to become * 1) unpack url === modified file 'src/store_rebuild.h' --- src/store_rebuild.h 2012-09-03 09:02:20 +0000 +++ src/store_rebuild.h 2012-09-18 12:54:44 +0000 @@ -31,16 +31,30 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. * */ +class StoreRebuildData +{ +public: + int objcount; /* # objects successfully reloaded */ + int expcount; /* # objects expired */ + int scancount; /* # entries scanned or read from state file */ + int clashcount; /* # swapfile clashes avoided */ + int dupcount; /* # duplicates purged */ + int cancelcount; /* # SWAP_LOG_DEL objects purged */ + int invalid; /* # bad lines */ + int badflags; /* # bad e->flags */ + int bad_log_op; + int zero_object_sz; +}; extern void storeRebuildStart(void); -extern void storeRebuildComplete(struct _store_rebuild_data *); +extern void storeRebuildComplete(StoreRebuildData *); extern void storeRebuildProgress(int sd_index, int total, int sofar); /// loads entry from disk; fills supplied memory buffer on success -extern bool storeRebuildLoadEntry(int fd, int diskIndex, MemBuf &buf, struct _store_rebuild_data &counts); +extern bool storeRebuildLoadEntry(int fd, int diskIndex, MemBuf &buf, StoreRebuildData &counts); /// parses entry buffer and validates entry metadata; fills e on success -extern bool storeRebuildParseEntry(MemBuf &buf, StoreEntry &e, cache_key *key, struct _store_rebuild_data &counts, uint64_t expectedSize); +extern bool storeRebuildParseEntry(MemBuf &buf, StoreEntry &e, cache_key *key, StoreRebuildData &counts, uint64_t expectedSize); /// checks whether the loaded entry should be kept; updates counters -extern bool storeRebuildKeepEntry(const StoreEntry &e, const cache_key *key, struct _store_rebuild_data &counts); +extern bool storeRebuildKeepEntry(const StoreEntry &e, const cache_key *key, StoreRebuildData &counts); #endif /* SQUID_STORE_REBUILD_H_ */ === modified file 'src/store_swapout.cc' --- src/store_swapout.cc 2012-09-01 14:38:36 +0000 +++ src/store_swapout.cc 2012-09-04 09:10:20 +0000 @@ -39,6 +39,7 @@ /* FIXME: Abstract the use of this more */ #include "mem_node.h" #include "MemObject.h" +#include "SquidConfig.h" #include "SwapDir.h" #include "StatCounters.h" #include "store_log.h" === modified file 'src/structs.h' --- src/structs.h 2012-09-03 09:02:20 +0000 +++ src/structs.h 2012-09-18 14:06:31 +0000 @@ -29,11 +29,9 @@ #ifndef SQUID_STRUCTS_H #define SQUID_STRUCTS_H -#include "RefCount.h" #include "cbdata.h" #include "defines.h" #include "dlink.h" -#include "err_type.h" #include "hash.h" #include "ip/Address.h" @@ -41,33 +39,16 @@ #include "HttpHeader.h" #include "HttpHeaderTools.h" -/* for ICP_END */ -#include "icp_opcode.h" - -#if USE_SSL -#include -#endif - #define PEER_MULTICAST_SIBLINGS 1 -struct acl_name_list { - char name[ACL_NAME_SZ]; - acl_name_list *next; -}; - -struct acl_deny_info_list { - err_type err_page_id; - char *err_page_name; - acl_name_list *acl_list; - acl_deny_info_list *next; -}; - class ACLChecklist; #if SQUID_SNMP #include "snmp_session.h" -struct _snmp_request_t { +class snmp_request_t +{ +public: u_char *buf; u_char *outbuf; int len; @@ -88,13 +69,6 @@ class ACLList; -struct acl_address { - acl_address *next; - ACLList *aclList; - - Ip::Address addr; -}; - struct acl_tos { acl_tos *next; ACLList *aclList; @@ -113,18 +87,6 @@ int64_t size; }; -struct ushortlist { - unsigned short i; - ushortlist *next; -}; - -struct relist { - int flags; - char *pattern; - regex_t regex; - relist *next; -}; - #if USE_DELAY_POOLS #include "DelayConfig.h" #include "ClientDelayConfig.h" @@ -139,536 +101,18 @@ /* forward decl for SquidConfig, see RemovalPolicy.h */ class CpuAffinityMap; -class RemovalPolicySettings; -class external_acl; -class Store; -namespace AnyP -{ -struct PortCfg; -} -class SwapDir; -/// Used for boolean enabled/disabled options with complex default logic. -/// Allows Squid to compute the right default after configuration. -/// Checks that not-yet-defined option values are not used. -class YesNoNone +class close_handler { -// TODO: generalize to non-boolean option types public: - YesNoNone(): option(0) {} - - /// returns true iff enabled; asserts if the option has not been configured - operator void *() const; // TODO: use a fancy/safer version of the operator - - /// enables or disables the option; - void configure(bool beSet); - - /// whether the option was enabled or disabled, by user or Squid - bool configured() const { return option != 0; } - -private: - enum { optUnspecified = -1, optDisabled = 0, optEnabled = 1 }; - int option; ///< configured value or zero -}; - -struct SquidConfig { - - struct { - /* These should be for the Store::Root instance. - * this needs pluggable parsing to be done smoothly. - */ - int highWaterMark; - int lowWaterMark; - } Swap; - - YesNoNone memShared; ///< whether the memory cache is shared among workers - size_t memMaxSize; - - struct { - int64_t min; - int pct; - int64_t max; - } quickAbort; - int64_t readAheadGap; - RemovalPolicySettings *replPolicy; - RemovalPolicySettings *memPolicy; -#if USE_HTTP_VIOLATIONS - time_t negativeTtl; -#endif - time_t maxStale; - time_t negativeDnsTtl; - time_t positiveDnsTtl; - time_t shutdownLifetime; - time_t backgroundPingRate; - - struct { - time_t read; - time_t write; - time_t lifetime; - time_t connect; - time_t forward; - time_t peer_connect; - time_t request; - time_t clientIdlePconn; - time_t serverIdlePconn; - time_t siteSelect; - time_t deadPeer; - int icp_query; /* msec */ - int icp_query_max; /* msec */ - int icp_query_min; /* msec */ - int mcast_icp_query; /* msec */ - -#if !USE_DNSHELPER - time_msec_t idns_retransmit; - time_msec_t idns_query; -#endif - - } Timeout; - size_t maxRequestHeaderSize; - int64_t maxRequestBodySize; - int64_t maxChunkedRequestBodySize; - size_t maxRequestBufferSize; - size_t maxReplyHeaderSize; - acl_size_t *ReplyBodySize; - - struct { - unsigned short icp; -#if USE_HTCP - - unsigned short htcp; -#endif -#if SQUID_SNMP - - unsigned short snmp; -#endif - } Port; - - struct { - AnyP::PortCfg *http; -#if USE_SSL - AnyP::PortCfg *https; -#endif - } Sockaddr; -#if SQUID_SNMP - - struct { - char *configFile; - char *agentInfo; - } Snmp; -#endif -#if USE_WCCP - - struct { - Ip::Address router; - Ip::Address address; - int version; - } Wccp; -#endif -#if USE_WCCPv2 - - struct { - Ip::Address_list *router; - Ip::Address address; - int forwarding_method; - int return_method; - int assignment_method; - int weight; - int rebuildwait; - void *info; - } Wccp2; -#endif - -#if USE_ICMP - IcmpConfig pinger; -#endif - - char *as_whois_server; - - struct { - char *store; - char *swap; - customlog *accesslogs; -#if ICAP_CLIENT - customlog *icaplogs; -#endif - int rotateNumber; - } Log; - char *adminEmail; - char *EmailFrom; - char *EmailProgram; - char *effectiveUser; - char *visible_appname_string; - char *effectiveGroup; - - struct { -#if USE_DNSHELPER - char *dnsserver; -#endif - - wordlist *redirect; -#if USE_UNLINKD - - char *unlinkd; -#endif - - char *diskd; -#if USE_SSL - - char *ssl_password; -#endif - - } Program; -#if USE_DNSHELPER - HelperChildConfig dnsChildren; -#endif - - HelperChildConfig redirectChildren; - time_t authenticateGCInterval; - time_t authenticateTTL; - time_t authenticateIpTTL; - - struct { - char *surrogate_id; - } Accel; - char *appendDomain; - size_t appendDomainLen; - char *pidFilename; - char *netdbFilename; - char *mimeTablePathname; - char *etcHostsPath; - char *visibleHostname; - char *uniqueHostname; - wordlist *hostnameAliases; - char *errHtmlText; - - struct { - char *host; - char *file; - time_t period; - unsigned short port; - } Announce; - - struct { - - Ip::Address udp_incoming; - Ip::Address udp_outgoing; -#if SQUID_SNMP - Ip::Address snmp_incoming; - Ip::Address snmp_outgoing; -#endif - /* FIXME INET6 : this should really be a CIDR value */ - Ip::Address client_netmask; - } Addrs; - size_t tcpRcvBufsz; - size_t udpMaxHitObjsz; - wordlist *hierarchy_stoplist; - wordlist *mcast_group_list; - wordlist *dns_nameservers; - peer *peers; - int npeers; - - struct { - int size; - int low; - int high; - } ipcache; - - struct { - int size; - } fqdncache; - int minDirectHops; - int minDirectRtt; - cachemgr_passwd *passwd_list; - - struct { - int objectsPerBucket; - int64_t avgObjectSize; - int64_t maxObjectSize; - int64_t minObjectSize; - size_t maxInMemObjSize; - } Store; - - struct { - int high; - int low; - time_t period; - } Netdb; - - struct { - int log_udp; - int res_defnames; - int anonymizer; - int client_db; - int query_icmp; - int icp_hit_stale; - int buffered_logs; - int common_log; - int log_mime_hdrs; - int log_fqdn; - int announce; - int mem_pools; - int test_reachability; - int half_closed_clients; - int refresh_all_ims; -#if USE_HTTP_VIOLATIONS - - int reload_into_ims; -#endif - - int offline; - int redir_rewrites_host; - int prefer_direct; - int nonhierarchical_direct; - int strip_query_terms; - int redirector_bypass; - int ignore_unknown_nameservers; - int client_pconns; - int server_pconns; - int error_pconns; -#if USE_CACHE_DIGESTS - - int digest_generation; -#endif - - int ie_refresh; - int vary_ignore_expire; - int pipeline_prefetch; - int surrogate_is_remote; - int request_entities; - int detect_broken_server_pconns; - int balance_on_multiple_ip; - int relaxed_header_parser; - int check_hostnames; - int allow_underscore; - int via; - int emailErrData; - int httpd_suppress_version_string; - int global_internal_static; - -#if FOLLOW_X_FORWARDED_FOR - int acl_uses_indirect_client; - int delay_pool_uses_indirect_client; - int log_uses_indirect_client; -#if LINUX_NETFILTER - int tproxy_uses_indirect_client; -#endif -#endif /* FOLLOW_X_FORWARDED_FOR */ - - int WIN32_IpAddrChangeMonitor; - int memory_cache_first; - int memory_cache_disk; - int hostStrictVerify; - int client_dst_passthru; - } onoff; - - int forward_max_tries; - int connect_retries; - - class ACL *aclList; - - struct { - acl_access *http; - acl_access *adapted_http; - acl_access *icp; - acl_access *miss; - acl_access *NeverDirect; - acl_access *AlwaysDirect; - acl_access *ASlists; - acl_access *noCache; - acl_access *log; -#if SQUID_SNMP - - acl_access *snmp; -#endif -#if USE_HTTP_VIOLATIONS - acl_access *brokenPosts; -#endif - acl_access *redirector; - acl_access *reply; - acl_address *outgoing_address; -#if USE_HTCP - - acl_access *htcp; - acl_access *htcp_clr; -#endif - -#if USE_SSL - acl_access *ssl_bump; -#endif -#if FOLLOW_X_FORWARDED_FOR - acl_access *followXFF; -#endif /* FOLLOW_X_FORWARDED_FOR */ - -#if ICAP_CLIENT - acl_access* icap; -#endif - } accessList; - acl_deny_info_list *denyInfoList; - - struct { - size_t list_width; - int list_wrap; - char *anon_user; - int passive; - int epsv_all; - int epsv; - int eprt; - int sanitycheck; - int telnet; - } Ftp; - refresh_t *Refresh; - - struct _cacheSwap { - RefCount *swapDirs; - int n_allocated; - int n_configured; - /// number of disk processes required to support all cache_dirs - int n_strands; - } cacheSwap; - /* - * I'm sick of having to keep doing this .. - */ -#define INDEXSD(i) (Config.cacheSwap.swapDirs[(i)].getRaw()) - - struct { - char *directory; - int use_short_names; - } icons; - char *errorDirectory; -#if USE_ERR_LOCALES - char *errorDefaultLanguage; - int errorLogMissingLanguages; -#endif - char *errorStylesheet; - - struct { - int onerror; - } retry; - - struct { - int64_t limit; - } MemPools; -#if USE_DELAY_POOLS - - DelayConfig Delay; - ClientDelayConfig ClientDelay; -#endif - - struct { - struct { - int average; - int min_poll; - } dns, udp, tcp; - } comm_incoming; - int max_open_disk_fds; - int uri_whitespace; - acl_size_t *rangeOffsetLimit; -#if MULTICAST_MISS_STREAM - - struct { - - Ip::Address addr; - int ttl; - unsigned short port; - char *encode_key; - } mcast_miss; -#endif - - /// request_header_access and request_header_replace - HeaderManglers *request_header_access; - /// reply_header_access and reply_header_replace - HeaderManglers *reply_header_access; - ///request_header_add access list - HeaderWithAclList *request_header_add; - char *coredump_dir; - char *chroot_dir; -#if USE_CACHE_DIGESTS - - struct { - int bits_per_entry; - time_t rebuild_period; - time_t rewrite_period; - size_t swapout_chunk_size; - int rebuild_chunk_percentage; - } digest; -#endif -#if USE_SSL - - struct { - int unclean_shutdown; - char *ssl_engine; - } SSL; -#endif - - wordlist *ext_methods; - - struct { - int high_rptm; - int high_pf; - size_t high_memory; - } warnings; - char *store_dir_select_algorithm; - int sleep_after_fork; /* microseconds */ - time_t minimum_expiry_time; /* seconds */ - external_acl *externalAclHelperList; - -#if USE_SSL - - struct { - char *cert; - char *key; - int version; - char *options; - char *cipher; - char *cafile; - char *capath; - char *crlfile; - char *flags; - acl_access *cert_error; - SSL_CTX *sslContext; - sslproxy_cert_sign *cert_sign; - sslproxy_cert_adapt *cert_adapt; - } ssl_client; -#endif - - char *accept_filter; - int umask; - int max_filedescriptors; - int workers; - CpuAffinityMap *cpuAffinityMap; - -#if USE_LOADABLE_MODULES - wordlist *loadable_module_names; -#endif - - int client_ip_max_connections; - - struct { - int v4_first; ///< Place IPv4 first in the order of DNS results. - ssize_t packet_max; ///< maximum size EDNS advertised for DNS replies. - } dns; -}; - -SQUIDCEXTERN SquidConfig Config; - -struct SquidConfig2 { - struct { - int enable_purge; - int mangle_request_headers; - } onoff; - uid_t effectiveUserID; - gid_t effectiveGroupID; -}; - -SQUIDCEXTERN SquidConfig2 Config2; - -struct _close_handler { PF *handler; void *data; close_handler *next; }; -struct _dread_ctrl { +class dread_ctrl +{ +public: int fd; off_t offset; int req_len; @@ -678,7 +122,9 @@ void *client_data; }; -struct _dwrite_q { +class dwrite_q +{ +public: off_t file_offset; char *buf; size_t len; @@ -695,37 +141,9 @@ off_t offset; }; -/* per field statistics */ - -class HttpHeaderFieldStat -{ - -public: - HttpHeaderFieldStat() : aliveCount(0), seenCount(0), parsCount(0), errCount(0), repCount(0) {} - - int aliveCount; /* created but not destroyed (count) */ - int seenCount; /* #fields we've seen */ - int parsCount; /* #parsing attempts */ - int errCount; /* #pasring errors */ - int repCount; /* #repetitons */ -}; - -/* compiled version of HttpHeaderFieldAttrs plus stats */ -#include "SquidString.h" - -class HttpHeaderFieldInfo -{ - -public: - HttpHeaderFieldInfo() : id (HDR_ACCEPT), type (ftInvalid) {} - - http_hdr_type id; - String name; - field_type type; - HttpHeaderFieldStat stat; -}; - -struct _http_state_flags { +class http_state_flags +{ +public: unsigned int proxying:1; unsigned int keepalive:1; unsigned int only_if_cached:1; @@ -743,13 +161,17 @@ unsigned int sentLastChunk:1; ///< do not try to write last-chunk again }; -struct _domain_ping { +class domain_ping +{ +public: char *domain; int do_ping; /* boolean */ domain_ping *next; }; -struct _domain_type { +class domain_type +{ +public: char *domain; peer_t type; domain_type *next; @@ -757,335 +179,6 @@ class PeerDigest; -struct peer { - u_int index; - char *name; - char *host; - peer_t type; - - Ip::Address in_addr; - - struct { - int pings_sent; - int pings_acked; - int fetches; - int rtt; - int ignored_replies; - int n_keepalives_sent; - int n_keepalives_recv; - time_t probe_start; - time_t last_query; - time_t last_reply; - time_t last_connect_failure; - time_t last_connect_probe; - int logged_state; /* so we can print dead/revived msgs */ - int conn_open; /* current opened connections */ - } stats; - - struct { - int version; - int counts[ICP_END+1]; - unsigned short port; - } icp; - -#if USE_HTCP - struct { - double version; - int counts[2]; - unsigned short port; - } htcp; -#endif - - unsigned short http_port; - domain_ping *peer_domain; - domain_type *typelist; - acl_access *access; - - struct { - unsigned int proxy_only:1; - unsigned int no_query:1; - unsigned int background_ping:1; - unsigned int no_digest:1; - unsigned int default_parent:1; - unsigned int roundrobin:1; - unsigned int weighted_roundrobin:1; - unsigned int mcast_responder:1; - unsigned int closest_only:1; -#if USE_HTCP - unsigned int htcp:1; - unsigned int htcp_oldsquid:1; - unsigned int htcp_no_clr:1; - unsigned int htcp_no_purge_clr:1; - unsigned int htcp_only_clr:1; - unsigned int htcp_forward_clr:1; -#endif - unsigned int no_netdb_exchange:1; -#if USE_DELAY_POOLS - unsigned int no_delay:1; -#endif - unsigned int allow_miss:1; - unsigned int carp:1; - struct { - unsigned int set:1; //If false, whole url is to be used. Overrides others - unsigned int scheme:1; - unsigned int host:1; - unsigned int port:1; - unsigned int path:1; - unsigned int params:1; - } carp_key; -#if USE_AUTH - unsigned int userhash:1; -#endif - unsigned int sourcehash:1; - unsigned int originserver:1; - unsigned int no_tproxy:1; -#if PEER_MULTICAST_SIBLINGS - unsigned int mcast_siblings:1; -#endif - } options; - - int weight; - int basetime; - - struct { - double avg_n_members; - int n_times_counted; - int n_replies_expected; - int ttl; - int id; - - struct { - unsigned int count_event_pending:1; - unsigned int counting:1; - } flags; - } mcast; -#if USE_CACHE_DIGESTS - - PeerDigest *digest; - char *digest_url; -#endif - - int tcp_up; /* 0 if a connect() fails */ - - Ip::Address addresses[10]; - int n_addresses; - int rr_count; - peer *next; - int testing_now; - - struct { - unsigned int hash; - double load_multiplier; - double load_factor; /* normalized weight value */ - } carp; -#if USE_AUTH - struct { - unsigned int hash; - double load_multiplier; - double load_factor; /* normalized weight value */ - } userhash; -#endif - struct { - unsigned int hash; - double load_multiplier; - double load_factor; /* normalized weight value */ - } sourcehash; - - char *login; /* Proxy authorization */ - time_t connect_timeout; - int connect_fail_limit; - int max_conn; - char *domain; /* Forced domain */ -#if USE_SSL - - int use_ssl; - char *sslcert; - char *sslkey; - int sslversion; - char *ssloptions; - char *sslcipher; - char *sslcafile; - char *sslcapath; - char *sslcrlfile; - char *sslflags; - char *ssldomain; - SSL_CTX *sslContext; - SSL_SESSION *sslSession; -#endif - - int front_end_https; - int connection_auth; -}; - -struct _net_db_name { - hash_link hash; /* must be first */ - net_db_name *next; - netdbEntry *net_db_entry; -}; - -struct _net_db_peer { - const char *peername; - double hops; - double rtt; - time_t expires; -}; - -struct _netdbEntry { - hash_link hash; /* must be first */ - char network[MAX_IPSTRLEN]; - int pings_sent; - int pings_recv; - double hops; - double rtt; - time_t next_ping_time; - time_t last_use_time; - int link_count; - net_db_name *hosts; - net_db_peer *peers; - int n_peers_alloc; - int n_peers; -}; - -struct _iostats { - - enum { histSize = 16 }; - - struct { - int reads; - int reads_deferred; - int read_hist[histSize]; - int writes; - int write_hist[histSize]; - } - - Http, Ftp, Gopher; -}; - -struct request_flags { - request_flags(): range(0),nocache(0),ims(0),auth(0),cachable(0),hierarchical(0),loopdetect(0),proxy_keepalive(0),proxying(0),refresh(0),redirected(0),need_validation(0),fail_on_validation_err(0),stale_if_hit(0),accelerated(0),ignore_cc(0),intercepted(0),hostVerified(0),spoof_client_ip(0),internal(0),internalclient(0),must_keepalive(0),pinned(0),canRePin(0),chunked_reply(0),stream_error(0),sslPeek(0),sslBumped(0),destinationIPLookedUp_(0) { -#if USE_HTTP_VIOLATIONS - nocache_hack = 0; -#endif -#if FOLLOW_X_FORWARDED_FOR - done_follow_x_forwarded_for = 0; -#endif /* FOLLOW_X_FORWARDED_FOR */ - } - - unsigned int range:1; - unsigned int nocache:1; ///< whether the response to this request may be READ from cache - unsigned int ims:1; - unsigned int auth:1; - unsigned int cachable:1; ///< whether the response to thie request may be stored in the cache - unsigned int hierarchical:1; - unsigned int loopdetect:1; - unsigned int proxy_keepalive:1; -unsigned int proxying: - 1; /* this should be killed, also in httpstateflags */ - unsigned int refresh:1; - unsigned int redirected:1; - unsigned int need_validation:1; - unsigned int fail_on_validation_err:1; ///< whether we should fail if validation fails - unsigned int stale_if_hit:1; ///< reply is stale if it is a hit -#if USE_HTTP_VIOLATIONS - unsigned int nocache_hack:1; /* for changing/ignoring no-cache requests */ -#endif - unsigned int accelerated:1; - unsigned int ignore_cc:1; - unsigned int intercepted:1; ///< intercepted request - unsigned int hostVerified:1; ///< whether the Host: header passed verification - unsigned int spoof_client_ip:1; /**< spoof client ip if possible */ - unsigned int internal:1; - unsigned int internalclient:1; - unsigned int must_keepalive:1; - unsigned int connection_auth:1; /** Request wants connection oriented auth */ - unsigned int connection_auth_disabled:1; /** Connection oriented auth can not be supported */ - unsigned int connection_proxy_auth:1; /** Request wants connection oriented auth */ - unsigned int pinned:1; /* Request sent on a pinned connection */ - unsigned int canRePin:1; ///< OK to reopen a failed pinned connection - unsigned int auth_sent:1; /* Authentication forwarded */ - unsigned int no_direct:1; /* Deny direct forwarding unless overriden by always_direct. Used in accelerator mode */ - unsigned int chunked_reply:1; /**< Reply with chunked transfer encoding */ - unsigned int stream_error:1; /**< Whether stream error has occured */ - unsigned int sslPeek:1; ///< internal ssl-bump request to get server cert - unsigned int sslBumped:1; /**< ssl-bumped request*/ - - // When adding new flags, please update cloneAdaptationImmune() as needed. - - bool resetTCP() const; - void setResetTCP(); - void clearResetTCP(); - void destinationIPLookupCompleted(); - bool destinationIPLookedUp() const; - - // returns a partial copy of the flags that includes only those flags - // that are safe for a related (e.g., ICAP-adapted) request to inherit - request_flags cloneAdaptationImmune() const; - -#if FOLLOW_X_FORWARDED_FOR - unsigned int done_follow_x_forwarded_for; -#endif /* FOLLOW_X_FORWARDED_FOR */ -private: - - unsigned int reset_tcp:1; - unsigned int destinationIPLookedUp_:1; -}; - -struct _cachemgr_passwd { - char *passwd; - wordlist *actions; - cachemgr_passwd *next; -}; - -struct _refresh_t { - const char *pattern; - regex_t compiled_pattern; - time_t min; - double pct; - time_t max; - refresh_t *next; - - struct { - unsigned int icase:1; - unsigned int refresh_ims:1; - unsigned int store_stale:1; -#if USE_HTTP_VIOLATIONS - unsigned int override_expire:1; - unsigned int override_lastmod:1; - unsigned int reload_into_ims:1; - unsigned int ignore_reload:1; - unsigned int ignore_no_cache:1; - unsigned int ignore_no_store:1; - unsigned int ignore_must_revalidate:1; - unsigned int ignore_private:1; - unsigned int ignore_auth:1; -#endif - } flags; - int max_stale; -}; - -struct _CacheDigest { - /* public, read-only */ - char *mask; /* bit mask */ - int mask_size; /* mask size in bytes */ - int capacity; /* expected maximum for .count, not a hard limit */ - int bits_per_entry; /* number of bits allocated for each entry from capacity */ - int count; /* number of digested entries */ - int del_count; /* number of deletions performed so far */ -}; - -struct _store_rebuild_data { - int objcount; /* # objects successfully reloaded */ - int expcount; /* # objects expired */ - int scancount; /* # entries scanned or read from state file */ - int clashcount; /* # swapfile clashes avoided */ - int dupcount; /* # duplicates purged */ - int cancelcount; /* # SWAP_LOG_DEL objects purged */ - int invalid; /* # bad lines */ - int badflags; /* # bad e->flags */ - int bad_log_op; - int zero_object_sz; -}; - #if USE_SSL struct _sslproxy_cert_sign { int alg; @@ -1101,17 +194,4 @@ }; #endif -class Logfile; - -#include "format/Format.h" -#include "log/Formats.h" -struct _customlog { - char *filename; - ACLList *aclList; - Format::Format *logFormat; - Logfile *logfile; - customlog *next; - Log::Format::log_type type; -}; - #endif /* SQUID_STRUCTS_H */ === modified file 'src/tests/stub_cache_cf.cc' --- src/tests/stub_cache_cf.cc 2012-09-01 14:38:36 +0000 +++ src/tests/stub_cache_cf.cc 2012-09-17 15:12:01 +0000 @@ -31,8 +31,10 @@ */ #include "squid.h" +#include "acl/Acl.h" #include "ConfigParser.h" #include "wordlist.h" +#include "YesNoNone.h" #define STUB_API "cache_cf.cc" #include "tests/STUB.h" === modified file 'src/tests/stub_libcomm.cc' --- src/tests/stub_libcomm.cc 2012-08-10 00:12:23 +0000 +++ src/tests/stub_libcomm.cc 2012-09-04 14:38:44 +0000 @@ -17,8 +17,8 @@ Comm::Connection::~Connection() STUB Comm::ConnectionPointer Comm::Connection::copyDetails() const STUB_RETVAL(NULL) void Comm::Connection::close() STUB -peer * Comm::Connection::getPeer() const STUB_RETVAL(NULL) -void Comm::Connection::setPeer(peer * p) STUB +CachePeer * Comm::Connection::getPeer() const STUB_RETVAL(NULL) +void Comm::Connection::setPeer(CachePeer * p) STUB #include "comm/ConnOpener.h" CBDATA_NAMESPACED_CLASS_INIT(Comm, ConnOpener); === modified file 'src/tests/stub_libicmp.cc' --- src/tests/stub_libicmp.cc 2012-01-20 18:55:04 +0000 +++ src/tests/stub_libicmp.cc 2012-09-04 14:38:44 +0000 @@ -22,10 +22,10 @@ void netdbFreeMemory(void) STUB int netdbHostHops(const char *host) STUB_RETVAL(-1) int netdbHostRtt(const char *host) STUB_RETVAL(-1) -void netdbUpdatePeer(HttpRequest *, peer * e, int rtt, int hops) STUB +void netdbUpdatePeer(HttpRequest *, CachePeer * e, int rtt, int hops) STUB void netdbDeleteAddrNetwork(Ip::Address &addr) STUB void netdbBinaryExchange(StoreEntry *) STUB void netdbExchangeStart(void *) STUB -void netdbExchangeUpdatePeer(Ip::Address &, peer *, double, double) STUB -peer *netdbClosestParent(HttpRequest *) STUB_RETVAL(NULL) +void netdbExchangeUpdatePeer(Ip::Address &, CachePeer *, double, double) STUB +CachePeer *netdbClosestParent(HttpRequest *) STUB_RETVAL(NULL) void netdbHostData(const char *host, int *samp, int *rtt, int *hops) STUB === modified file 'src/tests/stub_store.cc' --- src/tests/stub_store.cc 2012-08-28 13:00:30 +0000 +++ src/tests/stub_store.cc 2012-09-10 12:49:35 +0000 @@ -1,4 +1,5 @@ #include "squid.h" +#include "RequestFlags.h" #define STUB_API "store.cc" #include "tests/STUB.h" @@ -115,7 +116,7 @@ SQUIDCEXTERN StoreEntry *storeGetPublic(const char *uri, const HttpRequestMethod& method) STUB_RETVAL(NULL) SQUIDCEXTERN StoreEntry *storeGetPublicByRequest(HttpRequest * request) STUB_RETVAL(NULL) SQUIDCEXTERN StoreEntry *storeGetPublicByRequestMethod(HttpRequest * request, const HttpRequestMethod& method) STUB_RETVAL(NULL) -SQUIDCEXTERN StoreEntry *storeCreateEntry(const char *, const char *, request_flags, const HttpRequestMethod&) STUB_RETVAL(NULL) +extern StoreEntry *storeCreateEntry(const char *, const char *, const RequestFlags &, const HttpRequestMethod&) STUB_RETVAL(NULL) SQUIDCEXTERN void storeInit(void) STUB SQUIDCEXTERN void storeConfigure(void) STUB SQUIDCEXTERN void storeFreeMemory(void) STUB === modified file 'src/tests/stub_store_rebuild.cc' --- src/tests/stub_store_rebuild.cc 2012-09-01 14:38:36 +0000 +++ src/tests/stub_store_rebuild.cc 2012-09-06 14:22:03 +0000 @@ -32,15 +32,16 @@ #include "squid.h" #include "MemBuf.h" +#include "store_rebuild.h" #define STUB_API "stub_store_rebuild.cc" #include "tests/STUB.h" void storeRebuildProgress(int sd_index, int total, int sofar) STUB -void storeRebuildComplete(struct _store_rebuild_data *dc) STUB_NOP -bool storeRebuildLoadEntry(int, int, MemBuf&, _store_rebuild_data&) +void storeRebuildComplete(StoreRebuildData *dc) STUB_NOP +bool storeRebuildLoadEntry(int, int, MemBuf&, StoreRebuildData&) { return false; } -bool storeRebuildKeepEntry(const StoreEntry &tmpe, const cache_key *key, struct _store_rebuild_data &counts) STUB_RETVAL(false) -bool storeRebuildParseEntry(MemBuf &, StoreEntry &, cache_key *, struct _store_rebuild_data &, uint64_t) STUB_RETVAL(false) +bool storeRebuildKeepEntry(const StoreEntry &tmpe, const cache_key *key, StoreRebuildData &counts) STUB_RETVAL(false) +bool storeRebuildParseEntry(MemBuf &, StoreEntry &, cache_key *, StoreRebuildData &, uint64_t) STUB_RETVAL(false) === modified file 'src/tests/testCoss.cc' --- src/tests/testCoss.cc 2012-08-14 11:53:07 +0000 +++ src/tests/testCoss.cc 2012-09-13 16:20:41 +0000 @@ -9,8 +9,10 @@ #include "MemObject.h" #include "HttpHeader.h" #include "HttpReply.h" +#include "RequestFlags.h" #include "StoreFileSystem.h" #include "testStoreSupport.h" +#include "SquidConfig.h" #if HAVE_STDEXCEPT #include @@ -187,8 +189,8 @@ /* add an entry */ { /* Create "vary" base object */ - request_flags flags; - flags.cachable = 1; + RequestFlags flags; + flags.setCachable(); StoreEntry *pe = storeCreateEntry("dummy url", "dummy log url", flags, METHOD_GET); HttpReply *rep = (HttpReply *) pe->getReply(); // bypass const rep->setHeaders(HTTP_OK, "dummy test object", "x-squid-internal/test", -1, -1, squid_curtime + 100000); === modified file 'src/tests/testHttpParser.cc' --- src/tests/testHttpParser.cc 2012-08-28 13:00:30 +0000 +++ src/tests/testHttpParser.cc 2012-09-04 09:10:20 +0000 @@ -8,6 +8,7 @@ #include "Mem.h" #include "MemBuf.h" #include "structs.h" +#include "SquidConfig.h" CPPUNIT_TEST_SUITE_REGISTRATION( testHttpParser ); === modified file 'src/tests/testHttpReply.cc' --- src/tests/testHttpReply.cc 2012-08-31 16:57:39 +0000 +++ src/tests/testHttpReply.cc 2012-09-04 09:10:20 +0000 @@ -7,10 +7,11 @@ #include "HttpReply.h" #include "Mem.h" #include "mime_header.h" +#include "SquidConfig.h" CPPUNIT_TEST_SUITE_REGISTRATION( testHttpReply ); -struct SquidConfig Config; +class SquidConfig Config; /* stub functions to link successfully */ === modified file 'src/tests/testNull.cc' --- src/tests/testNull.cc 2012-08-14 11:53:07 +0000 +++ src/tests/testNull.cc 2012-09-13 16:20:41 +0000 @@ -9,6 +9,8 @@ #include "MemObject.h" #include "HttpHeader.h" #include "HttpReply.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "StoreFileSystem.h" #include "testStoreSupport.h" @@ -158,8 +160,8 @@ /* add an entry */ { /* Create "vary" base object */ - request_flags flags; - flags.cachable = 1; + RequestFlags flags; + flags.setCachable(); StoreEntry *pe = storeCreateEntry("dummy url", "dummy log url", flags, METHOD_GET); /* We are allowed to do this typecast */ HttpReply *rep = (HttpReply *) pe->getReply(); // bypass const === modified file 'src/tests/testRock.cc' --- src/tests/testRock.cc 2012-08-31 16:57:39 +0000 +++ src/tests/testRock.cc 2012-09-13 16:20:41 +0000 @@ -8,6 +8,8 @@ #include "HttpReply.h" #include "Mem.h" #include "MemObject.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "Store.h" #include "StoreFileSystem.h" #include "StoreSearch.h" @@ -162,8 +164,8 @@ StoreEntry * testRock::createEntry(const int i) { - request_flags flags; - flags.cachable = 1; + RequestFlags flags; + flags.setCachable(); char url[64]; snprintf(url, sizeof(url), "dummy url %i", i); url[sizeof(url) - 1] = '\0'; === modified file 'src/tests/testStoreController.cc' --- src/tests/testStoreController.cc 2012-08-28 13:00:30 +0000 +++ src/tests/testStoreController.cc 2012-09-04 09:10:20 +0000 @@ -6,6 +6,7 @@ #include "SwapDir.h" #include "TestSwapDir.h" #include "Mem.h" +#include "SquidConfig.h" #include "SquidTime.h" #include "StoreSearch.h" === modified file 'src/tests/testStoreHashIndex.cc' --- src/tests/testStoreHashIndex.cc 2012-08-28 13:00:30 +0000 +++ src/tests/testStoreHashIndex.cc 2012-09-04 09:10:20 +0000 @@ -8,6 +8,7 @@ #include "StoreHashIndex.h" #include "Mem.h" #include "StoreSearch.h" +#include "SquidConfig.h" #include "SquidTime.h" CPPUNIT_TEST_SUITE_REGISTRATION( testStoreHashIndex ); === modified file 'src/tests/testUfs.cc' --- src/tests/testUfs.cc 2012-08-31 16:57:39 +0000 +++ src/tests/testUfs.cc 2012-09-13 16:20:41 +0000 @@ -8,6 +8,8 @@ #include "HttpReply.h" #include "Mem.h" #include "MemObject.h" +#include "RequestFlags.h" +#include "SquidConfig.h" #include "Store.h" #include "SwapDir.h" #include "testStoreSupport.h" @@ -139,8 +141,8 @@ /* add an entry */ { /* Create "vary" base object */ - request_flags flags; - flags.cachable = 1; + RequestFlags flags; + flags.setCachable(); StoreEntry *pe = storeCreateEntry("dummy url", "dummy log url", flags, METHOD_GET); HttpReply *rep = (HttpReply *) pe->getReply(); // bypass const rep->setHeaders(HTTP_OK, "dummy test object", "x-squid-internal/test", -1, -1, squid_curtime + 100000); === modified file 'src/tools.cc' --- src/tools.cc 2012-09-01 14:38:36 +0000 +++ src/tools.cc 2012-09-04 09:10:20 +0000 @@ -42,6 +42,7 @@ #include "ip/QosConfig.h" #include "MemBuf.h" #include "anyp/PortCfg.h" +#include "SquidConfig.h" #include "SquidMath.h" #include "SquidTime.h" #include "ipc/Kids.h" === modified file 'src/tunnel.cc' --- src/tunnel.cc 2012-09-01 14:38:36 +0000 +++ src/tunnel.cc 2012-09-13 11:40:32 +0000 @@ -32,23 +32,24 @@ */ #include "squid.h" -#include "errorpage.h" -#include "HttpRequest.h" -#include "fde.h" +#include "acl/FilledChecklist.h" #include "Array.h" +#include "CachePeer.h" +#include "client_side_request.h" +#include "client_side.h" #include "comm.h" #include "comm/Connection.h" #include "comm/ConnOpener.h" #include "comm/Write.h" -#include "client_side_request.h" -#include "acl/FilledChecklist.h" -#include "client_side.h" +#include "errorpage.h" +#include "fde.h" +#include "http.h" +#include "HttpRequest.h" #include "MemBuf.h" -#include "http.h" #include "PeerSelectState.h" +#include "SquidConfig.h" #include "StatCounters.h" #include "tools.h" - #if USE_DELAY_POOLS #include "DelayId.h" #endif @@ -530,7 +531,7 @@ TunnelStateData *tunnelState = (TunnelStateData *)data; debugs(26, 3, HERE << server << ", tunnelState=" << tunnelState); - if (tunnelState->request && (tunnelState->request->flags.spoof_client_ip || tunnelState->request->flags.intercepted)) + if (tunnelState->request && (tunnelState->request->flags.spoofClientIp() || tunnelState->request->flags.intercepted())) tunnelStartShoveling(tunnelState); // ssl-bumped connection, be quiet else { AsyncCall::Pointer call = commCbCall(5,5, "tunnelConnectedWriteDone", @@ -604,13 +605,16 @@ debugs(26, 4, HERE << "determine post-connect handling pathway."); if (conn->getPeer()) { tunnelState->request->peer_login = conn->getPeer()->login; - tunnelState->request->flags.proxying = (conn->getPeer()->options.originserver?0:1); + if (conn->getPeer()->options.originserver) + tunnelState->request->flags.setProxying(); + else + tunnelState->request->flags.clearProxying(); } else { tunnelState->request->peer_login = NULL; - tunnelState->request->flags.proxying = 0; + tunnelState->request->flags.clearProxying(); } - if (tunnelState->request->flags.proxying) + if (tunnelState->request->flags.proxying()) tunnelRelayConnectRequest(conn, tunnelState); else { tunnelConnected(conn, tunnelState); @@ -694,7 +698,7 @@ http_state_flags flags; debugs(26, 3, HERE << srv << ", tunnelState=" << tunnelState); memset(&flags, '\0', sizeof(flags)); - flags.proxying = tunnelState->request->flags.proxying; + flags.proxying = tunnelState->request->flags.proxying(); MemBuf mb; mb.init(); mb.Printf("CONNECT %s HTTP/1.1\r\n", tunnelState->url); === modified file 'src/typedefs.h' --- src/typedefs.h 2012-09-03 09:02:20 +0000 +++ src/typedefs.h 2012-09-09 19:41:47 +0000 @@ -45,48 +45,8 @@ size_t kb; } kb_t; -typedef struct _close_handler close_handler; - -typedef struct _dread_ctrl dread_ctrl; - -typedef struct _dwrite_q dwrite_q; - -typedef struct _HttpHeaderFieldAttrs HttpHeaderFieldAttrs; - -typedef struct _domain_ping domain_ping; - -typedef struct _domain_type domain_type; - -typedef struct _DigestFetchState DigestFetchState; - -typedef struct _net_db_name net_db_name; - -typedef struct _net_db_peer net_db_peer; - -typedef struct _netdbEntry netdbEntry; - -typedef struct _icp_common_t icp_common_t; - -typedef struct _iostats iostats; - -typedef struct _http_state_flags http_state_flags; - -typedef struct _header_mangler header_mangler; - -typedef struct _cachemgr_passwd cachemgr_passwd; - -typedef struct _refresh_t refresh_t; - typedef struct _CommWriteStateData CommWriteStateData; -typedef struct _storeSwapLogData storeSwapLogData; - -typedef struct _CacheDigest CacheDigest; - -typedef struct _Version Version; - -typedef struct _customlog customlog; - #if USE_SSL typedef struct _sslproxy_cert_sign sslproxy_cert_sign; @@ -97,8 +57,6 @@ #include "snmp_vars.h" #include "cache_snmp.h" typedef variable_list *(oid_ParseFn) (variable_list *, snint *); - -typedef struct _snmp_request_t snmp_request_t; #endif typedef void FREE(void *); @@ -120,7 +78,8 @@ typedef void IDCB(const char *ident, void *data); #include "anyp/ProtocolType.h" -typedef void IRCB(struct peer *, peer_t, AnyP::ProtocolType, void *, void *data); +class CachePeer; +typedef void IRCB(CachePeer *, peer_t, AnyP::ProtocolType, void *, void *data); typedef void RH(void *data, char *); /* in wordlist.h */ === modified file 'src/url.cc' --- src/url.cc 2012-09-01 14:38:36 +0000 +++ src/url.cc 2012-09-04 09:10:20 +0000 @@ -35,6 +35,7 @@ #include "globals.h" #include "HttpRequest.h" #include "rfc1738.h" +#include "SquidConfig.h" #include "SquidString.h" #include "URL.h" #include "URLScheme.h" === modified file 'src/urn.cc' --- src/urn.cc 2012-09-01 14:38:36 +0000 +++ src/urn.cc 2012-09-17 13:31:37 +0000 @@ -1,4 +1,3 @@ - /* * DEBUG: section 52 URN Parsing * AUTHOR: Kostas Anagnostakis @@ -40,6 +39,7 @@ #include "icmp/net_db.h" #include "MemBuf.h" #include "mime_header.h" +#include "RequestFlags.h" #include "SquidTime.h" #include "Store.h" #include "StoreClient.h" @@ -256,7 +256,7 @@ urlres_e = newEntry; if (urlres_e->isNull()) { - urlres_e = storeCreateEntry(urlres, urlres, request_flags(), METHOD_GET); + urlres_e = storeCreateEntry(urlres, urlres, RequestFlags(), METHOD_GET); sc = storeClientListAdd(urlres_e, this); FwdState::fwdStart(Comm::ConnectionPointer(), urlres_e, urlres_r); } else { === modified file 'src/urn.h' --- src/urn.h 2012-08-29 14:39:43 +0000 +++ src/urn.h 2012-09-17 13:31:37 +0000 @@ -1,6 +1,6 @@ /* - * DEBUG: section - * AUTHOR: + * DEBUG: section 52 URN Parsing + * AUTHOR: Kostas Anagnostakis * * SQUID Web Proxy Cache http://www.squid-cache.org/ * ---------------------------------------------------------- === modified file 'src/wccp.cc' --- src/wccp.cc 2012-09-01 14:38:36 +0000 +++ src/wccp.cc 2012-09-04 09:10:20 +0000 @@ -37,6 +37,7 @@ #include "comm/Connection.h" #include "comm/Loops.h" #include "event.h" +#include "SquidConfig.h" #include "structs.h" #define WCCP_PORT 2048 === modified file 'src/whois.cc' --- src/whois.cc 2012-09-01 14:38:36 +0000 +++ src/whois.cc 2012-09-04 09:10:20 +0000 @@ -39,6 +39,7 @@ #include "HttpRequest.h" #include "HttpRequest.h" #include "forward.h" +#include "SquidConfig.h" #include "StatCounters.h" #include "Store.h" #include "tools.h" === modified file 'src/wordlist.h' --- src/wordlist.h 2012-09-01 14:38:36 +0000 +++ src/wordlist.h 2012-09-17 15:12:01 +0000 @@ -45,6 +45,8 @@ MEMPROXY_CLASS_INLINE(wordlist); +class MemBuf; + extern const char *wordlistAdd(wordlist **, const char *); extern void wordlistCat(const wordlist *, MemBuf * mb); extern void wordlistAddWl(wordlist **, wordlist *); # Begin bundle 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 vXXzUGojmIQ2IuJ6GmlEXQ0miBdSMsvSLIgbt2Er5vJiJoozdvJZCzZCLXcuG7CUQm4/Gmw+sBg4 cbuGURdm6P0hlyrN0smiI5b0lZPTl0nzN3ejn8/KstMuH6tGlF1Hbd1HD1+LMN2zrrhRdu8cKJpp RPluw+rL9LuXOllXjt/4n8yE+Ie7XEZaoqkr6xPDLo6utzz4Ncel3qUpt8883fg2ZjSSK6fftXFk 4RYicRKDRnLjYIiDQI4dVBFuIMl+mo4EBKCFhRNZCyDcQsGCg5Z7FgMRXGkRuFK4ExJLv6mndDUS R63E1oqzOQVYSmhJOeuGqrJMNkq++8qLrKLvGeN3CjhNJRJ7bMu2E3D8SRhr1ZqOFGHLCyz6jULl AyNMT4XILb5F2h0pHR1GIRgixGfWLNGME2nsrpBz7lSSNkImg2RkRBpHSiOECsSgSiILlCIwpBEQ KDUxA2REcBgCOnAsXEG5VMxC2FCguKKgXoJShBiihDAu0XAqNDeNLBiEoEfn5aCiEDAshC1rb6Bs 3aqtVazZs1rxbSTaNIjRWUREaaFFV0ScLuFeLdunGAWq3Q2JKNPrvvhRU675WSOeHS7DlL65a8t+ pu+7MFW6hnLtV4/TtL4wso8b2VZfYijBNVu+q/2uEREKXwFRvUB50T/Cs0z6eBxFi8o0GYuuxx5D 9vqzuaXT2LLxO7Zlwq4JsPpp9aTcJmeFWk3a0cKKtl0m7VVd0knS9Gk2HSiz9frx6w9dJO3SjpVJ Zstu8PGAjvSc6SlJd5NNcQvSV9mfFOk7JJvPO127uTLtnjo3dUZTetJO2jtZNy5USZeqtHDZu3Ve myaat2jtls3XacJsusKrOVE7vffOF5OLpK7t008Y8cGWU2p0w8YTWNSjjxlw2XPVVklniTZWstni TZZ002a5dNKMMdMtm+Y4cupK1cqR0wmuseeYdlV16sON3rpPKiavq7lN62b3N5PXpEeeWYaa9my3 N3MbbcqOk2W7tmOUvXDTbxNZVhyyT7aYo95eKWzPJRV0w6VaKSUJPO++7tmFXaTN3SzxRQkq22zD tZ4zl00rNJ6LdvFnq66Xqar3lVw9eedJzo5FZ99u+Wnr1W+cMxVhpNR05aeu3W+ueXLZw2bPNPYo 5YYSdKmyayTxd2sqw98o5z/rEGnLfTxN8PVHqib1tNzlpVw8T2brwIzEEersOd5v6Ccc7UamLtDM M8F7EzEDdok51NhxhqgrmGLnjK/knSU2WG2XDdww3Xctll01ijuqMKuMOWWlleH3507YSbT5cu0n B6m3b79vGz16womsy5dpsodIiP9vxVoQ/2I8fWA/wORVz8Z5PEYnGbFDlA3lKXCJ1h4RDeZCnEDi akTecQdKFCuBceQ3gpYB5keM6QU9peHANgLAUNvcPmegbcB93fX3AUAD6e326Py9bLfv+d5gEW5c EZbG9xjL2vhlRtFDKKOMULRROciKlRXRhoLnRbM1y9Xx4vlb5wgQiwIExIASb8HRvrQ8xkJwO1Cb sOld8svEcd1V64cybuJa6pmYCjvJqIGkYVqeEzBm0sBSnnqUbyFkFQgWkQsEgD6VIWsOyBsdRgax AQESKWTc2aMObDeUutXA01ki2lKnCAOoApNE4hwpMIFpiSRjCLD8WG1doSRMShJYKMdh2qOvVDDS SBBYSee2lxBLVSEGQRxZgwCQdSSp4vfYAwaK6bMqQEGcAsMtBm4QCnyezKECcq+W4w0VpvHDh7ph s64VQg+oirF6aF3r5dXRnEJTh6qaCttccEENFAQE421UCqmbaOwXvPViYKEcCM6oaIvJUqdI14oG rozwrBM1MCBfRkqtdKLVrTnXybq0bHWzbvOzM6UUQRJCvrNQpbTJC1BtNnuy3E6n7kMxYOG4496C VYDbHL64KRqt8IQRiMObY5MwH+17NYDB/V+hi8W96NKrLzNRIn06Mx0JTkXerexe+TfGvSQCHbA4 EhJiQ6ZIsgRRHVVRRUQNE69lnWc/LTykSXMZ09tI1Vn0hRn9+dNETZ7nDtuwtVW7hTUaQirsNIKF AUJYYinMIhRCSomnAmK/bWW76jfp+hNK/IMzlmF6gA4BP4hwh+kwPQPqrM49g5BixWyH1QBLUykj H+kyJFRVIvAC1gRIhX8O44mbFpKoGhimsQOBYcbhNgBeJcwCxFVxMuYzmkMdEmFacxqMSkblhYCA t96K/w3Qg54befyxCm6UYgjgJoys7S+ok6SjXYcgCJjxEPFVTiuNJrpMUVA1BoykrB6kuPeiKF5R yMNt6xFpSl39hGAZPSBTeE28gTKQ8DsSFPrRNGGvWV0kUkTJ3TeKFbJryQ1MnCv6OKKGTdSCnCEh pWqSSJuUz9SRFbMUISXTIikiVZ0EiLPv5y+NdMbSiK9WFHioxEuJh7G2S8IuWJDEYoUVEFUWuo7i ZKIijp8oiHIrdaOOJrvHEYYlEnrDq1sIk1JLxu4Wf5oEV/19TVcvjDt+knhuos+8+MOUMEzuE55J GehhSMfmgCdGoaHc7lSydvl2+KfzFj4DU8/YcYqiRSOEAKRqoqpgjLftFg+r8NgXNmHJmHnREYw3 hYH4/ZAMMHv05ZE87rD4iWswnKUdHqBh5GWQ4uGGIfpKdZpRJHCafjbUbrLyVnyeEKxrSKJUcSTc zjhyaiEUXgRI7UUiChhCUkRLKBcj1ZysjqUpM9STjQkkyiRFj2BHJCiPJUGU3HQRoikXA0xPvDNe teM1Z536vLSMbzZ1vTis6VpGtaESBg3OTcTVGJOYIFMVYulQ3FbsKNYNwoFixvwK1u4uLyGLiYXR zFzjLNCJvo3lkdGgFLg3yCqbIayRGT2jCdgTuBZ1kCJgRwTkcUHPmIDfgibzE0me/PGSSTeUZiFm KHGjEaBD6CnoeC9JzF9JCUQpCnJIKTFRlEnYXu4ksyRhE3LkSCiblKdEzMqqOYYUIEgMMd5nNZA3 oDzIDYLi4h4k/ElGllXr1d9w+PHqi2WF9mlHXzP54ZdS3NlVm7EeodOrqYmwqiKL2Zl0ty5BRRZs RVVltCsFYZ1kQhc4rqEGCRcEqgZIIg+W68SJI4TKoiLKpIiPa9HekLIWkxIqqrwNpdux0500GjMC 0BqEDTQNFtuIUhYxz5Fw2uBTEqlHIYq8C2OiSTQWRiXiGVCOm03SN0tsI5Jros4dPyL8NSTYRGep pniLfFI9UTdJztCFEcsPkQhZ2S6aahlJgl+Jl/uXrZ9RBdCDZfTaJSSanOzZNkIllKqIcT4bIsq2 tGnAkOiyTWiKS+lnvwTs8hNHI+9nDEwnEzY1igckx1QVZlxkI4aIqbEWJluRT2ES2YLbnnfC2tpO Ft9rS3lnmU66UpGDUppeT3duda4HnGnnRHfMiz6+rdvrL8EePF/X0/z6yh7+ht+7s9f0HnQ7+VY8 9ex7NXXLT78L/XHN9H4/zj9fBm79IQb976k+vPXs+uuj6+ee17Xm+j5lZt+6O3hGT4vc/Xq69fPq 87H7tNrTjmhnXa+No4jC8NFeGtLD4gW2eLV1HjK9MZvXAug0zXOsc0jo16aWGe+t4Yxo+umb0lKO kJDT88z3Xlj18v1vt4hxfzveefXkPN5qC76f4HXtu05d+P7z0flVRynPu9VX8n5PuaVed6W5nZKj oPe/ngz6f6jdn4q9TufN9dE7W+lnzPrM9j0fq8+vb/PQf692b8HZwn39Faff1Z+j70/PXz61elfv 2dn56zu89V6MeO8o/Ho7Hv57mPr1brfpxfq/rs2s+g41ee79usXr4gCOORNLDlDAuj2IHXbchZSw 4bKfj9YmuC5uOMfl4OPJYTXzFVVGciQ7MkIMhlSKKJ1u7CzUgJAh4pGOaUnwLB7zFDiOEQTABHNx lCVmoihqEYZcowth+cCqT+HazkHBQ1NzW6WFFW6hUbjAgiMOipCIMD6OiCP3NBfgOkcxTmUWbDRW dgybaMr0uvhszACiJ+KpxuI5/e7PnBD2Igz7L0l3BEqZXWNaEWpDFKLobEHcVpBIYlIvKbDWX7SJ SkRl6qgURAqebqPa7yhzKySO1WlD4k+Nu6MvG6nCsRBP4kUmm5SiLyHIMqdc3GdpOLTWEaIGsi7y DYzmotIbZDx0zSPkhJK8ShHcbzRHrL7uw3elyhZ9Y7SZWdNPjDHaqUmznOn+R4WVdFMjmTQ17CkO VGMqANUV6vuRFLsxl3psYtAzUPBpkUMxdW14H3pDFwA2BvzbfACT4AgN8TIAgXCJE1AXVM6rdYcy kSCb0FEOAcw+y/AIRHATTbNpNV4OEQ0BGMRjC5EOrsXh+0g7RqcRCfxNBt2+argQiI3J53TzybKK glqIhK2gnmr+MNrQ5jPP6fxppnMNuNwUN0nLp+IYiEQ3RERCLktzuXQQil8UcZGBqopscOIcXIo8 vIg+dAsqWSiUqNIifEnDCaNbTNjKHj7wtwrxSN57UiO0lnrd1U0rbKEKmbTJSPjFlJOXXWLEpJSl EkZSY5PWTq2JGJSS7cqSesP8oEf2wI0o7bptPJvX4+ilBjwZOoixcUiXgdqiXOSBjjlKLV2FIqxA VpmaWEfEEBjQnAEQFFyfWCg1PcpmYJMfiWZRLbKUxGSvD+SisFYWcsIo3VX2I8dXllDWCltSrYck Sm7VeXCZwUTj4k5WSdQpEbN+EfHLldBZlOF90KpAjwKREaQzgjjh3ZIrDeoI+omGS1zY7lDjxzDl iz3hIFOhJgTb2ceBw+Ly8wJSz3DOhNa7zBghPeUNQ+J6F0nsboLyex357PCfDKHKclu4Q+BZJgyU vy9TvcU0nNh0nHaVnrZsk84dsruksUSnd6k8pE2WFWk86Yfj4rN2qy5+Wj/UON3H779pJDtLyrdo LEgkSQgHcQ/sXR/TMGD4bGPo2R+W/37yhwNSy4lEUlCUhwum9WIhypHxhMgVO8gJqCkCvZhsRrdt ixE7FqyRRU23QSEpIjjphchwjERJKlThN+OmHD6ypKDdbqKterwpI6ummllCaccpWEOWnFUX2jtT C+zhy5S7xEPJPGaeKsKt3Lx4u6VFUiULOwpqPQfUWxQzOovaBrGbqBEUWbIMmgwjbDMx3P+c1ONS WeeChsdhxgmZglTp+Pxk9WSeMWddYs0ma7Zo/cH80R+cU5/MD9iSHoIJm2VDEMDLek+dlvX297Fx 553jMGoml3UW7dlIIgihyLAWxuxMRFoJLQmacl5zpFOHs8iYBh40JTz9PASGBqkAp20TLJHjskE9 jZivvNcYcBsp5mikx08KNKYO6mhWw5gY7hpC8WRjYa+RrsM+3RgqKLtoiImvsLD10zQ4kiUranWz yiJtBoLJlBz8ZGhwIJiRDQY6Ci2UajjAuSIfJPG3iWHa0NSJSJJa3eq+WLSlJES5Zk6j++IHx/cs +N3nTps5fHlHLxNmr3D1KbEROvBD3+vj45F5Tts4LUm3MuXKEoj6EbPZx5WrQg8Sto4r50ERLgiR pY7KOiIotBtH8uJojt+q/td2unu08bUsraIRDvjys1JIe8p7jgptPIToSxnx7pghgnnqwkgd9/VF TM91PEo8fE3UGZxmUpLSMuGws5wCJpnA0U7bFBUTAi4ExMxTkXFOCWxKJy2Si6QfLJt5N5IOFJxD Lh43Ud9VxiPZBhKIXS4dCcpT+rvPMrqS3UTw3f5VTa2Uet02HbtNldRJPDEnqfpJ19HjRov3Hd9j 4sxPJC+ssDEahnm2B0znIleOqSxaeM1nKtkfpCiEXwc6QeLj5siEksdGDJ2IpoqzYmKm3IxM2Ri1 WRxaiAamXiqsjfeV7EVfpI2Sbt5+u2ftFrLo9QhNWUyXjoiyjyJRScxRCPjtTx43pHNgvZZ8H2BD +Efe0wfYiGQMg2gmoZ7DswF77ZBL1knIzhp5VID54WHXHJTIHuE+ZFACQEWBAFeMg7KNxjY2lYmR m2WL1V33Txr1RZV9MuG3xh42L50ok/pt8MCA7AUOKCpu2qir55tfHpNZW04gwwsZ6WcJJJvm74n5 +2IbuH2jJp+LP1zPhs08eKsY07bLMJOqrbGmGzlX8eN3azDrrpsy6dOHj1Ru7YdrKsuyjdX2h2/2 I/aOgavk4PrPlFFr8vHKir3Ualuy2abvHjd99afecuknDvuSUdOEu1JrNl13CaTqOXWGk31d69Tb Lt1l00lWmyi93Lpw7SXTXaVaYcuVHDSZJhdf9oQ/3Qrxzr/g/PzhOdW7GKZ7UdknT6yYeJNLOGFX 42X0qy9fi7Z33p00+pt035HL1J68enjRJ3wk8cMKPKnLlw5MJK3YKuGXJhw6kxswYjayjZjS9XLV M6s1VOzEG71ulRNRJyoj32avLfD1y8cvHbZd4ph7DRO6p6uuwm3SbvJnTpVZwXUf1dtl2WTt7728 7d6f0iIj8K65YfY0Vt/wq2UNzk7G0OsWORZHMSoxY0IGM/ktEscGCx3ybn6fpyx9e9vHxdLp9TcJ t9+2HLx0yok7MlzQIjj5Mj7GxRzJIiefFyQSOCDUhNlvbrGSYpEUmQIklZfmmpCREYYcmdxO3bty TLqNOG6x8PFWVrp8v0dJvXXV8K9Nyqmmyj1+pKrPxw9u9e8tl6FVO+6PcsT6r22dsN221nKTrK7Z N4k6R+4KI+GRwHgPSo/AXUZzpPRQyEeAGr0Age4wAO68VzGw4gOQTE95sE2jqEuFdW05zeoYnkdo ZIO0DUDxi3+hY2nw1APKqpoBTdwCcqju4g4LebxwRfMF+PVo79nLjfY7zo0Y4XaozHEzk7dFWHuZ tVCv8qLEhFoLBvwCGgsACWhMYa65NHLo73pzXpJCVA2JJDyXvnIVM4PVl3lR6zdRWvDzwutedPVA cXbTHMLJjiY57nNBRwvBRboqg44mfPnycMqJnoLO8zTOHhNcQobds2hbyZUzdDhO2dWcAlIARCkx ABZ2TYrBbgQEeRlRymweXwnKaTtNbS4l5OedSVDvuyvKHeZCMKAhgYcQbWh8gZuWOygtq3lDI2Hk Br18yns5apoHbPZY3RDbEwXCNralpu6e7znubCiJByGMvdbImgay6EUJW7ogJEbO60YJi6UCtwTs dzxC06Q/EIdC2s6pq6ISYVBi5CmyMsdQ4oh7CAp3KYO4tqfhalxWHlHYm50zNgKPY0bc5kZjrHdy aMrOuiIzqsuH46YunhsyKjmVubiXvM2Y1xVzhH3V9Q7AUDqyOxWi9DwjCUB6hd9HttY3jlx6eM3X jKid3Lwbc+2whmA0swbHTB2IHxkr6Lhm8/de2dIfMth5fHEGspDaTrVdtNqLbEmhj5OIJp47wJWQ UDqIbBLYF5FIFCESKbCKkM0ANTcQ7k9fhN+3xvi+XlVTVinks5BENDCA4mVHSqDvNn8K81gGWMGZ gBoaG/G8GAkVRkBG4gCb9JdYFIQVwAsUWiAXQRGHht3FVsQH14yZyEcQkiInoiDyKkyCZJVIQAk4 4umiTxVRrf9Rvg8SjgjD8aIiaFYiSnv/HD1ZrE4iEtIZfpUUV5fX5pf6wlCJFoRD2bgn7+ezqy4r DBa9Z/E7RCk93KFldJSJvLtpQ2QS7YUXVsRK0nxfjpqyMRHMQ8SUYx2xWDF4hSXVJkbqWoERv622 3Z8R15IiCMBSCAtrOq40HEZzkNwVJL1d+N13vxsn8YStlJwknZZww02afHLOUQsZjAo0xV8kTMbb 4E4G7dxR2aMKtUKphMwbYR4DvQgUgSRZFMvSUnd2qy1p3TXbYuIyhypTaeSIq5cBuX0u0whNGBdV IDK0BCpMQDtjTD9os52KvAEVTgH4VbgLcftrrl6Y7ctOvNc11lamjcrLhuca0st4zjFWemJmzzmc RscoyEIicQt4+dOnrpfG/TdwoAallnNNxRNx+IM2ji8vCSooIgqjWMEjU0jEYlzzFIDUoiI5d8vj 1uu+u3CG+3sfOo9k2fW92aqkUZru+fd3b/FN4wmycPjt1Z6yu/GXWlmPvx6/y5OmNKJKbOnDl/sh w6QRH77Np4BkbxhUcUJ0yNBJSIvvOMhh1qxBXErzt9U1qux+u9I85Q35CqOEnBGVoiFBflKxF4ir hctEY28uEIjlKCFkboyFkyIhEU4Qiqckfx/HL1Lt+3njhJl2s+JrfpdzHk090nEnx8fH+MQivdFT CJqrmYFIDZwJsQoAQU7jzF/ADsYNYaLhlEKkD9KU/KP+S8NWiNKZYnlv0s+2MrvllZJVWdw/s/TJ pd2w+rLpOllpuv4q7VXdni5snQrXMn2Eox0B5koHSBRxdBnZfD2jiEYaSrpQJwjfBEk/vDbSmz9P xZ4vNEXESaSUbzymntcjkcD8q7eOnfBmyTabmcRdZre+a3lDdEE2mlHa1lEos5VikolT+axCtXMn 1RhptapRJlTgIRHHfAa8akU0Z0zImyATOa6nEXGGA68s6reonE21cq8UmaT7Tcro2r5pWbxYq/du qOVEdJc5TizLxi3bCrpdN+na67L42Z7kqnLkqM1jkcypmhx3oalw5zQ0EY4TtrDFm5UVHU4UFVS2 w1okZrNcxeVe04XzbACUUQldybBzNPp+PfisW6nGzRxxd6YMVvESbJ9vrKbQhIUmGV4LjJchzIqV l2syUU6FaQ0sDKim13FKOYyfUX9fGN4kfpZPZxNy7EJuapnFOkqJq0u2VVsufFX40hBb8eqtMnb8 eptnLKXxL8xiOnqjtJ8dO3bvKb7xEE94AlpciLyOqKqF2B+GfVYlINpMukCC6jzuo9ctnjTPGFIq y4xhvlV45aivO2VfzlV0xG95NzLOyq0YOnL1a0pXRpQIswzU+4KO1/wzz7pLPbCSizWIu76oiGE6 0k2UeRurNLO6XqqtnDyjjmS3bdldzLJG9HOzCyrhZVpVZ1VRJ6p0xHK6Unjt6eGg5SxkyXY03PVN RAGOUma+DJ1KDOqGzspSPjyq9s07v5XWysRgiGwu31ClXbjdlv8cLcqvjDjiGpSCyXr8yl+9N2WG 7py2xFV/Dx4+OvVnksvdfjh1CN6sJ4drN1nThROyhQVNRU5yxIkMhCI2Ch4fJsrEiw+hC8umzyqt ol1npS0NDOz4qfXKTZ9ePjZ4oMTHLmg5M0FMDEBoQLGTk+AhxwqZVN32+6InEHP2VUo0saQeTQoK 4sSGAEj0B9hOZkjS/jyrpl2plzOU9ct67pIoRIrIg+MQrG7K6uyjlhUdcumnBumuJJXYiDpTnbDS r8dNNisRm31lP6lX4vDWuFN2x47k7tCXO0qqueE1Gyzt48q3fPf19fXzKV9Jt2+FHa1GVHtEnTlU +zSxGzTL18Re/cbBoTXkHVbMVdxXw2qBNoNIVkJM8QNLnHKrnY68EISHrV4JonInhzMZyMh7lVE1 eau2tJShGfs0HXWksye+Mqi6q3lbdMuRhZSUq2++PyrSIjSv3LUpXjjDGV72MDsOzX6YvASJhTVI zxLcmU2vFLLoCpsLvT7ysm+ze5bnNm7J9byScu2m6ijlV96+qOQPkGMC8QyvWJSic8GVY0nJJ0rF XeUYRpIwTyvrb9W3IgiJIkaGCUGQUF57wyQEsdsC1BYDlTHI6lyySogWGTCkXARmkfUsvxltKv4y qz0e4J7/U2kDTmOmHblhJ+mMO8dJRpzJpSsnTx6mlpZfT42r82lanDVHSt1k1XddKKP7YRW2dLOG NlXxVVJ9UfWL8PjqeVk2G13Cuz1xs9bqpJMHUFgA7dZszmAt5FQT3wQUejw+OW05ttcFH45KOX5l dOWek380klX19UZbJMvFZHiy+7LpV0ky/Tpl+klG/S6qifbZ2q8WbJkmy7mqyXBty8Ols8O3CqpV ZRwsW4XbKdWzXpZebhLhsrnnDlsq4YTYliqrvSb/AUb7peNmEk92+u0k1lVnizZpy3WuWdHSXatG zlWyrpld/bZusq50TswcdKpprqKRS6yc2/Krph/LntRVwm0cvG6ETTTUdO9N992zLZLeakvHb44b sMaup68UepKNl6LsvWEm8WcNnKrZNRy8irddssw5y2brquXMcOI4svRTZQqwo9WXWMt39EQ/2FOn DxJmJqxTtRV4+/ZS6YXZXYetKa1RVnTk8etK2Vct2qOF3mnTi744TcRJ9Tct1ElWqPr33nddNZdp 606VjyR4yo6i7+9EssLZfG7cxvk4DjjbBwXNXJil8DHGAVQ2LOOT2C7orOWMKLq7M5Y4eJru+/jx u8TUePDZfccoRMRMDlCLirsOOSNyBF8QalYyvYUdp7TlOdpWvsqo85cNNmc1cJNPTNDTLfpyk994 Zcp5UbOKLGXbZ5VpPtZU6eqstmV6LsE2FrbHD2z1ww3V6ZbKvXBnM4ZrjOZzOYl9yr6wXse4Cyim Jeq2QfMPb6hos8QQ7gOlzGcRsC6QvRPag5Rl/s8Rt+PoZP+CINv5xH9So0NiP0vAesTIAOgnOe01 HNnNxrAdgnkHTkaz23AdYOJ+ZhD7lDnXtxCUfDkJOxqp8YrOkowkw48o0jDfKb6pzkvF+RpWcJUz dlTMsx+wdMn1lQOCq1/hjW9T7YNZAJDe4fBsPvudUE2XiErCs2bOTW93c9ijJZnCTSWstEbpmRtp Xkw0qt6oHU9s87wu1N3VIdGiWtTWBZJEDQqQJ5a4CLDRN66jgHRGGuusY4qRIRA0dmDWbj4lgKqa TIvQTBBMIrBHvHsbXTMBGmCHJcw0yBb7FU0aciKnQ7CBMuDeqxkTZp5yoDmTrrEHNDbIiBALQMNW KkUMd6ixpFnFWwIYveYouy8vQupDkRau0OaNG6wM2S5lVMa4im2s27CDpoA4gAU6vLyBpBEroXLF j9jCbVmtyNa4c11ZuczyLD1xumnXlbUSXwawuldhUxwSnDw+jIoaRj5lxt0doaIL7fgDWQQWYYUU dGSRkyKt+9PhQvCqweTz3xraunujKlrx7u+mMhofn48e3nqlpaFDNaDRD839NtvwAKfFVO8g3Km9 Q3qNqIDYSGSDSMEUW8WCgnAUWRa9620t06SlnFb0n+REUjva5/QAIgehDm0IoUnjJv1lWBamPX6W /jM3AMNhOuYSzAkp1A7EUeTguiahN5ow6OGyIPqS8WTwhmIhRFJOFYZXXNJEMKVGiVKn1+uEoWDw VRnA6FIiQMFhyLko6TFLDGlju1yB+dLLzaIFlAXSowjm+hpvYefMREcO0xvyKSXTYhoi8RFl3SI0 5q/kzlmBgRYns+Nt3182jvJGiI5k9TmjZ5y9W+XZ0u4bPjx43fL6qo6dLuHr45IWeFigh+B689Sv uFzq4XiFAFgJCMMS6IeS2pqVtd5ltTa/mcagKiwmNYvm2BakIFC5zgkjqxzlmdLTa1WSKgIlkG5Z EREdDcUUYobmh+k9aZMSNiCEF6FFOpGd4Get4cyeHlcM/fnH5zpTjNp8vXcXiEeJ+NK3UcuoiCp2 7SZjusuGATru/OFmzMXiUfMUURZJWEUy3XUWSSn8nEIjlww0bs33jcVVnBR69Wtx8vhWThxNJZyy x6qCiTZlhl7ZKrRpR+vIy8WXo4cJppPG7dTejY+3958+h7tASTSAgCUBEM0nvZTRUQq+Ug2nJnWS WFcTzieKOdIQmkjw0t/CN2LrFPzEI7fi1m1uN9qu36ldhsw1SSTh2wTV1Mg8oEIibD42dOsy76mu wyWkZO/nfFnxkwJGgJqTIio+3JU2zctQvdVtBImMGpMiqtu0I+KunTHj/pu4ad/N3xz8ZYcuNa+b KUzTJ3bBKUDJyx0SGDBU+p9zKGm+3l3SFe5rrxSsTlARDJObq5LnRtoGkxuzv3eO5Ap2TwVqCCgi SUQqljU8SiaOPal0RA7EztMXVf1+2xnTzZZ0p8v1DKpd2zGXaUdYO3a9Ekt5cbuu4WKLJ5aq8dLQ Ru2wquTzfdy/bT1VaKJPVGFGYlBLhZVTxEmzD5hh+32LvHK6q/myzLPTGXD14dJ0uo4ccrFpkSIq lSRMgbmhB+tyDsyoqiIcMqqhh8iwKRzC9EYQKKSWc7LVayjbO0Co/6GBslDoKtn1mO7mE9tb2D56 qyVkxN3Dmym7x+ZxJly67mow2cNX01+btNhp10/XLZjKIw6ViEdvVfVe+HfSsGkoepI8ezKLJixq Mghk0KsaTHsRZyfQ8exAkWOeVWhckMz1dy2dMPVXaTv1Z8cOZrQqw/Ef3Ij/C3nyh+gSfX8te609 1KwDky+du7RThl3p40SaihJRReVnSDrTSyIXQN3aYIgXJF0IIHlaJuaGCDup3xpEUEy6mSkqkjsd yoQgQPAPLs4UjzIQiOlcqmkCkLuIDGF3d4ubN9IgSrws/jesd99qus4Sj6q7esdKumgrhwus8q4W 0wmq2Y7exR/LlrxRh3/Kj32XWXKr8g043Y8msp8+KuGKJ6hEMIegg1u0vBjHHYn2Vau6neLCKosG dUNIRHpu6ulgyR4QAO1BbO1dNsExxpeBvHSYMJDACiCDIgiDiUgds4gUEydoDd+w5LVcUUmGxfbv LUSYafptNKEnkpImsXSTw3T3XaGG/bTiz8Q4Tv3l2/Sb99wRu2et6JSeYm31mYFOikhRpUIFjVho sS4MFy5Bk4B87mGksm29TSUePjSrl+az77Z6PsfL15lP1fudiCwrNDow14gzzg5lwiEQgVZFmrvu J6OEVbh0GKoQxKqnElN4KaDcZjExNVjBi3p0tG96NMKZeeXdv9nDuWdrqR1HBWSloldNN3ZdasJf i74lpI/FuvFEm6salJb64rp9UXKxJLp5RSX1qnMVSaj6qw5csRvpSdLO3LMlk7S6So5duXjlN60u twwy8ZVrw6eefbMtLPE00mGXbl8ScuVXmm0nZo2ePuIe85evnzy+PoOGezFxgXqyukW6sxg9a3qS Y7y01o6DCG5hCcnR5E0Bz0jxEOTSd4kkhSo1udonjgxbgxgFUNYGCR2JcuZxl+OzT2IRCb8d3jpa IiIZdrunWcwkqm8jKnBse+c1QwcClTcibG4yTBbGhnu5npLwzlLmc9qJ2q9fXrCUXsjxfd+Pt7LJ xu9XfE39b/CIPOmF1Gm3K5d4su2TmwwSOeXNywQgxFQgbmDU8WaHOnBZ6OgGVI2Z3CWzDxmhCizB ntA5IrnDOwFABh10AVSJmBy2jmg9CaTG6HqKK3gmPBRjJsbEiK4lvKMqMPWV63nEonFF13b19cv9 xts2Qmv/Dgwk2ScYZlKabDd34q0omxhypDiSUbOrrO07rpSoo5ZXZSYtKW9X6aTi6Th8+z7ZTZS8 afU1lk3Sjpd6/sUe7vhyXPYT6oFsoAmDGmo/Jt5jlzBr57DHYqbnhlpVvsolZd2ns2aksuskswsw zEmmY5Y6bMs3WNK2ectnJ43fv97fp7hr1Nuoqko3qlZRV66SUa8Jtk2nKTx4sq2ezVacqMuFH02g 43+Sbtjo4brRjE2GPoUWScJOmU2j794Z5cvUnTRp6mw225VVbMvr4maUww3TW9VfVFPWlXjhWzx4 wWc1cN11E52VT54VNk1K3ZesurqoG7lyksctlFnW8y7ThwSaQ06cOVFHvummyTZh208PHabhz62e zXaKKOZNlmVXrhu02o4bpuUrulHpZnGumU93m7t22v53HHlFFHLo05axjUqpuvPe+E59rxL42Tcs LOG7t1x0orphRsu8fJJsJMtvVptLL1bVY+bvjtyo2vJmqrOJpLKN3fSS/bhs7SNYYbOnTNb8f02d Ol3SprMyMjGxqakZDESY5EqKbJgl71ZVgXSXXXrlJls+MOX1JV4+Jq0YctOV5qsvjCUUfpRx+Oky TpvRha9mWyzBddZRsq6HJccccHRINSZNb76q0qc5MuaXpZEWobDQvLxnZLdZp559irDbL1w0sUPO 1aqt9+HJxxeiU8KLKO0nyXKbDBwm5e3V9eJPOatOmFWWXBck3etLmVHKS6TZl/cj7A8omYTiKD2A HkFgO0xFDxRTV4g9PIqGkQf6k3I/tWH7PBCiH4+CPEDZedY5AewOoDwJn2l6vWPePICnpmMVXJAw M7UIEkkhvuHsD2jyHV6uzl7is/bbm13W5zG0OGCycILrhpmaOON+m+PzYVnlbFBVgxLEkEMjwnZ3 emvGYacu58u/Jly66Rw0bM3Y41WCdhtxV27C7CnD1NG6JDurdCAKHRl7zJpBkc2OZjjjvkzq3Olz VbgFixKVXKAxCUDAqsmnyQM1DhDyE7jJ5xMUMx8MHiIk8ltQ8ks91L3TixUVVJ7zo7OjmmIfLfpz qjLeBu5MM+ghazIxQrK1wHCa7WvuE6ZcDAZUHSKhrMGQJ2cUso2rFRV0QZnK2bmJTwNhbexmi08z e2pujmHWIVjcAUROmLg25rH0szUbhZeipzpqcyK16JZuBV5A3k2YJa4wqkHtDE+qKiWraFSNsOui eWYI4dtbVGkLR/mdWMcXzoFDZevNcSbpZFCiRPPINTsvKrUbw+gw52AoOCJb5VksTaka1nRj071p CGKe4186gqgomghUzrQwByDOqpYTSA0AMsqEEsQChJonjWt+e89gnwO3rZ1kkOcuNHq0bZa088zO WcJJwnbgo5nYTf408HkBTsPwqMhVUtL6/XsaEDUUURMCZK6mGFwzIwsNK6S+qP+ZCPGlou2IoFHj 8UJf8kFkKrorZCE37bP272vC6JCibx+fmFr8YfFW0ybj6oxKdacRER0mC75p6qxgfU/4XbGlsWKM tLmTjLxWhIOopM2sRuVRDOUXCWCCqpniKjsNBpLFGw3m03moxKDFYGgxEsIx+nD63PzQTlPKXRup TjqEARl6VDbDya4nu4odc0rJBReWb6576+jrXu4hIXJBugmHFSQoyIhg3wPopU0FRBGO9xnQhtTj nq5E/001VENQh2/G6K3lEpb3DwoIiHLtrmOMz3bXtHL2rpZ81jHjEYyrN8qSikgDQFtTIKcN3Lxn yXnBphKIiIXkboi6SELuHSXywVudpEQdoVR8ts7SrnqcYctsOXNyHSz4u+esXccOm2E5Pii9k4g9 aezSwcNLuWnartpYo+OVXq71kuRIlMGODgbaQpIkH4Igcp1ThOlVNy7CohJCWqSeyZCQQ9Wjt8uP fnTOnh5Y8XWmRAVQdYKyNOClZ1rk1JFCqFmOjAwWFLHKalSSu876uDmJ+X+vr/flmTU4iH405ZKD GmA0yVjNAsp2LkUAh5fES8NA416HqaFS9Habxhi9E8LV8YowkvKOxe7th4ycpShVoHgtkqaGCYp2 G7HPL6jvPU1vY2FuXcqJvXtXTxjSVnjPq6aTEZaVuq09ft7sTbu6j7jtKPDm/PJCjH1u3PGZDLTE VRAgoguu07I1aErDFkAI3BiDnHFxqi93rTrTZLtKQ316mxi8l/srPX1c9ZicUbpvfBsnhbebVUm6 m17mrvJ8psud/3tpfBjhR6q2U2/OVm+7T/eI+sn7TfXCSWNkQI+vr8aS6UtiUXfWnL+UCNn6fjd2 /FlJdJEhSQ6YNChnruq6m2clTjYgfMBIPnnyEK7r71oChngmKJqzCGRudx6SzsgVhCI0dTJxD7nn W0REQqEVUS+G1Fm+0REVH8dX5uu6pvvfiaKqLzZi9rZbUjTRvV5ZeNhZJSMNP3kIljxvxSLP5NIb eO11Yuwmok1+pdJ/qz9PVmKvR45dWiDDfFID5Jh/QHaeHDdhsumu+PSynUUcpMP4N318+fHLYqak ChEsc+DsdjjszswwqDL0vD6QZIdCtFhkUhZgF1ZnqLGyHN2eoW2TAiJARLJUJoXpvkMvqrx2bZh+ Muu/V8YTdcfn5Vh6E3T6nHT8aet34yyR4u06cVQlOkkrx7AnTDESFp9Jfk4JihAyLM4yPckHRIk3 BwYSa6iTlVlwtDiSHp4pHGXTmOZ23bMpPrMTcePOPVW7n5skePidEqdSUR40/3F4Ox5HYqoUMMjL aDZUHixEFO0GJKl1RIvODFUq/l7ac91/RlG8ETR+CXVvqj9MO0l7xts2xs3csP3KESEGoPIxcc2G VKPRLatwbCgWm+MzfplJjqNpas1m90vcqPmXr1JV8cE9b6acHaUMKZcUYZiTpgmls+P203bNPcqS 5She7dw7cxaeVKOmH1N/ogf3nKrCKPmxQUgSLEMlDrh2l2bXuhwk1VXVFFVQ7oRZDEOMwfiQjZ9L A7RKDDD+Rn3W1A6D4wymyqEMoZWOI2WSY5Ltn7UowuwsxnluiCrdymwtt1wwk2ZWOONQppd2o3bE 3Liii9+7TFODWW2IHckhcwa6kEOjV9haEGNzUsZMHdExPbajMOabC8cOUjclMwMOKbJvw6j3ji7i N2d8q6fj3hNlw8VV3W2S21QxxboUAQROOFVKdO1FTEIOwLyyJvFjeNSMNIx0CHQm5r5dkWQSAHzM zY/iARAvAPofYe3A063ja7497Y4McbN3zdlys9WapN8XjX5+VPzdf3UQc3fNn2L5dPG+USbRWrxn W1aePfqjh0k+OW6bdltN2sUmtO/3xtdSibZRdw01FWFmU2XbhNRwy4e/Ov+MXKrroaiF2kMx2IPq 9SicbxQOh5DlzbbcNNDsqnbB14cKmk5SFTc4ec38XxNyBsyQOgzjjxVpt+k/0/Vk2DMtlWgWxdr9 roQVcI/kpJ4dyRBFHIjHaRxWt/LBJMkYDEiRiODO5l6uZa6VWfcscZp7xOWY/hqyS7xJsyobvHLZ RRpJVs68ahuk4aTcP8CIuDaBG+e5KQIkIQhTQhA/c4hV18dVfidpS88cKnz9dNKUu+7F3rZN8Wem ElVV+N3L60y7VXXdqo+NN26a7hlZRld550o7bNkcYxPZpyyyq6eqqppoS9STwopw4aWeqrpRWqSb 1VhvFbKrvWXqz332y6zk9TNLKunjhdttzdu5ZW5du3jxppZzdhbSbDdu8z04dt2nGHmXHtmdnJRp OmuuUck267JyyrmdrqxPftPdNtNdlJukvPhlwwso3999b+SeO01G6TpvOUnqizLty8YaUXd7ML7q x/a+FEnCWyMamxrl6y7ZZzmVM5UbMNpyUcuVWl2+VHbEWPjpSNG7DN4koor44Ybt0dNnz5ws79Ub O25y6brMr+qJuVDTaLLnavHtk0nLb16yxnP8rtebtONUMpulmWFW6TxdzEuJzk5XZcMGmF3jCjjd hy6XdKreM8tPO1GnXaTtPlwm2KsKOXz54wpSjZVsuq9SZskt3KXjiyOHb1plPd7N8wyu3U410W3E cTmRuqsampga2K2teRA0uKkhy5NduHNHJjhlw2buGzl7xhUxpVTeSqUYXO3Czth2qsu9bfOZSlLl 4ZbsS7k9ePH9xcIh7DgIG0ROA7x6C8vOkARfQHie0cx6xTuExGxyidwBpBS8UDULrVOw2DyHWA9Z 7Bzj1g7zcDmOdRzjAB03Ct4rE4/K7cAO8DU9PPTnqpDthUxidV91uuYYpZwkxDbJDGBww2yhm76z pIxZ0VCr8dWTq9/oARCY97OIxoRJR9azczJ4XrFCrjeFPrZcuEYh+6whOS8CkzOAwibU2bvJ52ib eW1ATk7Dbsl4fHnsTiyHvbaAleUIOAO9ZVs3sXMqwwet0ttTWB1mdOsZt1N6IWqDRsEWWIw9CEYw ZganH26yefJ1hPY8dLxhkVriwpoY1q2INhOIfZiWlB0lkVs2LcVTAXgi7OJ2aYiSIncZwbuWFKXc XQgDEjYQrVhe4GzUW7SdpZgjHl7t7O4Ud2Q+hNqTAWQ5YpwdHTe24JDwZSAFWSDPcVXVtkPiAEzQ w3WigyzLA5S+Xyt2MUbGtA4AQ6nnwxTKUE8VMTiylci3y8QzZRfXuo8AlmBZpAQcksSST/Nz787Q as7xzpRZWepOnlKk/NYqdnFQU7AKGoDlsKfFlS7CEFZkxSyUByiCzCZhJSQBk0SU3e+t6iigj94f Dr49749dbB1JgOS8txhj87qBFTEQGFEK0tnLHIQzRePxgiNGGhG7xw/9x8TfpdCMptln9F1kt6RI +dpxD1Tr5V4tyOf+BGm9XF9TbCBAwYMlGNDSZ34YSJyV+mnFTIoKcbHTn45jkXkwjh/Plz9Wufn1 l2tKtlWfV1UGO1tsKMnS/TKT+wiP9RR2q4T/Xiv7/az1w/zQieAPTgOx304cdR1YUGUzFVfp4ajJ cpAjFn36eqTg6A62IsVtMZrBaF62sgiBaepWIG798JTYthOS5FEtTiCSREL/uzP3dfwi0xBEmpdc TbF+oaz2l1tDOuuYQzDC5x5aWncSo7IJEnnbl0ni6CyQOJ0QosWWbtP8kbsRERkiDPCrxZZ+S8Ub pHDhJsy5e8NmwurFgyPxyxpoZGsXGlwXMcmhwaiQFEEu9dPWzKSrhR2+bJ5bKL+OrtmEmGfFs9kD ZJV5MXYyLB0ZIAtZjvFFR5DOqGpFX1ppXM7avam6Eg1owzt6mnXCGs+PLPHfDO7d4eKqKN2qB98V Zb0iIjLt1u4pr3hEnKZ49bqs52YbvVWmuCbuS2IEufj54l42dZjcpCN3vKzgoks+P7kD6y9LJvr7 7wonvsuo7ZMPn5ps802fXjuy7CiohZzlAVeQ3ty5JmJqa5ZglHYXq7kZRYo4RdidI2SvwKQRNCgQ iMNb1q0aU74mEkMXrYCmvJRSxgUNc1y9rFBh72HEisw06fPnh8bO6N+2PVo+MsTB5E3CTYklzG4i kpEy5UvuazPS2DFiJAp0dFOtrXo5qCMR42+dO0lWHjbMkuVXnqb6/EnSizVFyASMcWFTkgJkgnzI kCJ2P0Dsgh2U4hhp2Zi4P4ScECPn2OianKCJRoW3yMyGB2NCenvuSGyLIeLA3432uqRNC2yEdr2t 8/SVEcc+uP1ldXNZbqdfj9Lbeur/FrNNGmG8r8CVmwRll8fSTLWo1luw+r3aWTvF08zoSzZ0n3Va 8mXT7JWpvZynd0sxH8EIhpIOjzOevH1fVrqEh0wFgsigLAikBQWApBZFAUFkUIpFgsjnT06CaSCy CkgsBSLIsihFJFgLILPze5n65hDTB+BRtixQUFBQWLAUiwWEUBYnZ8Ph9J8BPTO44p0eRqW6qTGK HclCZExidSp7jsnkBlUIRVCj65Pp9B3OwND6MBEkE7jflHwEaC3riZhE63vq+tfNqVSTRAy20wep NoaraEiINZjVvNiTujXW6HKF91HLo6q6giqGHEbmloJgyFjU4LsmA2pJEQDYWpfosGh6XcOV3eyK unLSSafJrdJ6uskW7Sirp+W+N2rYzLKHaT6vJ885UeJpKxU4cvVSm5vtIWZ2DUmOyWPCZtTjnBfJ 9xE7gidt9G5f1bZ8rMA86NDCPjSt/EO2PT0j0RuJmolJ0bz/MEQsoiFU4XVXfPlEPjTLTl3Wl/Xl 72n1OT5zJhPHbTrrpt3xBHmH6aeprOHT441XPTWcVcqo4WlLnrhN0u7Xdu5e7VSeesvWsm7GZN+H xuk7bS/kQ24fXLC6rps/yRcYU6IngyYOutiZEmcmhoaPFNSUBh9D39uysT9pD/pgIhfuLn4vBFTH r6tXE2tIEFxeR8/Fj9bZTxsokI8aVm9SUfhJhaNN95tIa6+KpNMw8kRtGE3TuJz7UghJ+flothON 0qJdMJlO3qVG+WUj5W7pOPj16pu4Tiz1PlZ06Se6Bejhlspnq/K/D542ZWdON10lFE34k3O2W/fT Z4um7dKO8ZdNPyOCft9/j+h8Q+T6lD7n2kDWU155Ti9BkRurcvBjVyV8UlrCSuQ2sWtPDh2o1a9V WHbKlFGENnKajlyxZtOENfHa7u9Ul3ijl6qHXij7Rh083aeOFfzVnrHOOFnxW3zZtY+uWl3uzZG/ fbxZNlx5ZOfrt24euUt1iQTIlzcifcTg4NNHKFeD2AD4gnePbZe/ZVLYfvztD/b61Ott1+OjHGji QAQkrCYMNcfOpICTBMBMw1Cp0MdyMkVVVJ3LXbuWMiInRHmzpCi7Sj85X5kk67UXcSXctlnElmUv V1H7eTX2fKvir4n8bYctN91E3F1Dgc2MSMExhHkZKljeTSanDGpMyxcj2ncicN2zT68WfEqvXHHC rBy9ctzd4ws+Rhx3SbDO7GUk6Snfnm7Ddy045buXqZld6k0qml0q0q2s3eKt2UstN27TCjzxJiWh aJALGBiIXIJk0weQ7W04F1csUNDWcc689u7O20tnpN43emW75v3HBw9XTcN2yqbtz6qdPXXU13bl uk3TcJ8t3jmjbS1VGnM2GGoerJetnKbC1fF3nnrn/FGuZdadJUK7YWWdOHTu6b5zHffi1knbDZ6s 3eLyXcq8SdN1HnE01Xayjlwy2c3VfMpt1m67Zyml6nFHCSt1HROUaZkpvXdVhXTDs32ihvw4TXbx 2ku6sdKJuVFm7GW6d3vuGzhwWt22a7evHfbly07bKRJ0uzHk4SeOHOWFV2k0njzyzdx49cO3CdXj XjxXTxw7cPPbf4v8wT94z2w+nDxjOM/O89N03xVPLC7hRh4om5TeUdJqMOLqiioqpM55VdCZAmGZ repM5iQWBuGTY3NOstN2WV77cHbp5w2TqlRu3eOVWyi70xuTKlCgtN9dWHVVpvJlrCOlvkIgTxvD g3InBK176bvjdVRRJNOfST4s3U6b98/GE2V3Cbr9IhwsunHNHeyysTSUcuFnCbk06VNk3STZ4q3W 8bYUUS7ZeLrt6vv2rUa+I2ms25nY3ADcAGBxPBVTyYj0lhAzcAO08UVA0AHuO7ITiE4AaVDmRTD3 AcSilhMh3DuPYKeKr7gXOcBPaO4g94PULymkHaD5gCLR6wXSOJcK9Aic6HiKBY5BNQ7VQ7jPo4xM A2Vw2zou7L5a/yzE0SBmIDuRTI1aARCOvfTm+c6Z5IfMfcPQya54s+R/SOAYPHqEvey7+1MCehRS mLeTas1T0pPhsEjGIJUK5zyWrAh5LibPGNIlXMQMmIkqRZ7YzGgzbGBL48KTtFS08yockwojfJyE XfREuWyCo2QRt7YkxXUBxBvqB3wdYN830CDICk6u820t2OXLjDmhbiBLSpUWNFaoRG5uSes5eTlc Yk7NogXcvcW1tD6QIjKqQMqqmUdnq3uQg3GAvU1J0ybik9DJXZJGdAmMepYJUsnrNKc7ZAWJhQBa sEHlpnpt3mHkFLSXW4moxpEkKjFIFQOmIyGCMD1obBycPM4dERPBE3YjM/2i/nZzvGjZVDoc9k6+ 5KnbOZsw9XlVoWBQvVOMmpS+ZZKLI/EEDJs/0fxh8s25htLX67QxjTTWm5IQmCIfqEoggoADiRRW wgXGsbCtxqEpWINwpeiXgphEDCgaIGGBqQkNXXlwb8eBKqPlUD/LrXrz9LNeABHzTGhQ7RgxTYHo gzFfZ3VIl/i0urVrz18m/GzHMjZpJKerSSay8zdG7kIREtneM9PGsn3K78dPj2TptpkVe8qNmH+v +s3qz5TQohGwsmjh8s/FWI/J4lvpZEQw7+0idSI12q8jxRiq+wmkNPnJqj8cN0kYJtITHdk1l31d TyMO2lLaXZs8+yls9a08ao8JJPE1I4VSUWfCBQddTU3LEBzcmZKmCJ9T6gnbRZ9tSjLHV6lAsEdq UGeyUmETu9AWpU89eXtla1wAD4Co1dpvvxLZvfeEFG7xPqUVQ2kjlJEE2GeqSrLPFdtey05fOMtO emd3Dt0Io2rctOwJQsMiIXDQiTTaIsRi9hnL2O3bEDg7G5nG6KbOnC0aXgrf48VfT4/3o7aT33bt PiqzDxTD6qTacO4yxRKumVn+6P5Jv2fJb9u/weDiDolgUu14wJ6h5xQedgoAQi72qTz1mTbO1L+t lYRCb3KrhcXslEbqPH10mtEV30xuk/FWnDp5txux425dqMOt13CaTzD91qk3SVers1rl+N03xjTh ZKIMto8pYdOXnW2cIl55+/H9FX4tbx0ks39drJNmn2v45ZSZWJvqTb8jVGHDj19bvwtp1+R+AW5P LzvPPT89reCGRi97H3AXo7tA4HTCqqiQ8dtn58ZcmYRP1J9KEXl/Lni/yTSzzbpu7u/Ey3NnKit1 H3pXOz2/lfWorEnjCyPOVtj8d4dpN267xVhZV8a4cu+m6bZu/H7SctnTST2cbLHSXdN5S7WWYdMP rjjOT5+K9JvsKGIe3ZjPw3ciEwlo0KxeAaCwbl2Old2WGGM16Xoo8epqxux4u5WcdwRS5yc94FyU 3EMEAc3GOFiZqpc2hsGlp5yR/P4iGVHblRNdVuPVpKvOkun4+LtPH1v+MKOH0u7dL4Tdv6RIjuIh 62Q1+pZmpJN0HW7DM76KwYsNHaMp0zHgeIHbtgpdZFzGXaSSTjnFGH1Q1NN32lhs2VUZZxpOOKEW blHxTC92JRp+KYN16XlHpEPxIae1YeuN1Z05Y2EK97YdJOnrVI72gid01knablu2eMPeWHizZ70q k8ab8uKr0ermuCXmBwIYD3/Y4zM3XrzaCGhCIu8SAPNLSamJVrHs8U33gdsWWaiWixa28n76WKVZ fGWPiTu0+muKbyjZLKWnaz9ddPrheK2Z8WdxymXaoqyo3Vasouv14/arTK67ZsrF6+mzdJ5Jp2so 2s/TZm6iR/k+MJMN3bUoSLDiqu+4oYKEx8Cu9yxcmcifQ/IQM/MH4k+xWFFIUl8KUHdQEew6EE76 +G9Zy+ZyVSkKvLPvEQu5C9OYHTF3hYm9uTuCnwA2PL1wZLlTuanTkBxSij+DQ3XgyU3hkqVIodXO R+VkTrkhWpY2sSPwRETczx0NqcWOCCmcCnBk9UpV4y+eKycNXY1dSru66z9tja31fnl17qZ0LizK lDkyRCeZUaVIbpEZZSGNHi6xVqCq0hZ0rIjA0prnh4lSopGp8c4oVtKfIZCuSJoLQGLmTkkJLKo2 5mm5YxI2Foljs1MkhpJbLRmi6i7xOavxJ8WZ/Pz3WXb4vftthsk3Jvx31us22s0kzhI6ScPizg6X cPbyyS4GODeEuCGlzWCZnV46RjIZoI8Eao0sDVk0CtWSlFhGyysPEkWNTUUL5KcmuL3qaTQ0XI1k sH1hyxaN0qJcy3PfHHC2EqYZeu+nEa1u03eX3nV27WiNmE2HKj86TerolOcunxR0ooy8bXUUcLnD Cb2/S7C7t02j8/J8uS+TUqMVLjmHPCCeEREQsB3pr8UAS6AhAz+Qh2t31+KtLfe9NMrpPHt1VV2T WVVFk6u7t6tODhyw4XcqOMstMrpaXlW80u9nDhuk6XYcJ0Vo00klddyq6c8HJ0nWZJNldspXKajb l+OO96OlVWW7exhY7bJODhlR/wdeLNumzp0j9fr4q4WfzI00+u3ibTXCaiT6syo6YfWGGjZd43OW WVm7dw3erNLLLvfaKtMsbMm4ndBEQD6oGNu1GsYZOQlJ5CqLwbucjmp2+vSXKr793cuYw7ZZcMJK qnJRd8XUZc9st+kRFW8myrhp9deOGyTl5a7x4mk2UWtl2u9jdsgdvX97tZYlF3ScKvknTK7dN4um 8e5fFO13CKNlWybxpjTTdNs0mu4YVacukjTCiT58o6Upd8eOnKnjs6dKOLKrtJUTy33m0w1lwok0 8csPHTlh/q+leda3UrpV63Vpi/+kv1+MPHRgoamTZICwHO0S5fArIvybaNzt2rg3KG5QZp50+OHq j9N/3GH03csNzE26nTXTijdscPPLbuklyUcOVmyyyqtXj79nR48dqvkr49pJ7Pa/wRyhCvKXblRj lJ1Yzsumyw/G7xOLvHCkbKq7udNNNLOW7jZy4VZenarhNVR0tE3SnEdPv3Zs2aTadrVbrqN3aqyT dhowus6aWXUZdt1soquMDjE7rzgcw3D7A5RT2WFfEN6poOb2jzgehsDuE7eIPaBzGBnNQD3igQ8E TQIagLh7k5AesSjoIah4+/2IvjrM2T47DU7FXjfs7jn6Nv1f52Ul+fTf5tMZpqPe5Y4lpSGHsN2i BeiJhv6RO6JNjrm5Ss+TWzJy9fy0HWS6uMHKKEPtg4aZw8RdGrtxEEOjW9gebnrw1fLL6hkqWl4g Q05Fka/OHI0EVh14QUbu45e6oZNNYkKl2gwcCU263Ga67JqlGCKmsEY0oiZLWqF90I7r0/HAh3Bh IkdgQW0HF3stFCTqeCIvdd7gGMFXlhWJ25BU2qi0dmFgd5iFsRtaJrJiMzRkmccCI24ZqD2+gq8R aSMe3ZnIsOoynyDlwIOFCxORMlQmUqxkurVqJ5td9E4dItYMHUSaGVjweubzrcVo2berLxODHpwv Glgr3fKhSdaTppHu9VzLfS4276QKTrLDfMFwCIOiCOGkCGkUuLLoKA0FCBZRKVYDsLFESJKonOIg qMQvO9u5c/6tSac0XvV8Y3VSCalpqfHm8sGKPaKhFZj49xHzoOV7H0J2klXoUiEcPdt7N7xLKcmK ukkdBzHSeGWZyT2yvO6a7Dpd0pWW846mzvVbhCzxU5jpNCSVRGUPVVHKvCzT/T/TaIQvsiSIFkQK Xad7N1PIypZZhywf8UZfVn1Juu3Vc2SbtlHnrSlGnLKhir6+fOmXSTtrGMZZcLOG6TlsnhdRzRmO FHrL+8qg3WgqnxE+MnrH0dSrPaOFTa1t+Rt4JnqnSCaQ0s+NOXCirfEVSUbIkRJH1NECjTwqxVc+ 4XYcpKPV03fFpVrx53fq202bi2rxvXSOYmhjSV8yHMBsOWBENWLGCJE2qicPPvifaWyjt222puiD ZER7re1HBFz9YZQ3bsR23cuk/GGneOGkYlDkmbStvGWZJJXkHHlED6zhRwMSeJNJ0RDeW11GyurF zd9cJOb/KNPr4o3bO1V3DJlA4FEqQODiZMsSDB6jnSnWp0+WgkMjNzFoIrYSZOWKKo5oVhO34IAn WCwheWhnk5GPJERNTW52uW1wdXJ0yEyBKggkybnGvAIuZpvJ+nnN1X6ScLYfG0ztJVy8tVsftPpp R2ziy/rd0404bt+mHKcQ24ez03Umx06Ufpspus2ctcPHq+WGF9PHx60mqy7bpqpwXRyJMwXLG9iu QmeET0ATXjq676nLMyD6qbxVTiZEfh5PCgo0KIQgkab/vCUlVabE7DCcHUDogazaMhsYhsL3uUTA pqTJljsSzquopN8YKu0R+28cFDdhTaWd9nD2z65mss+TZVi3j9tnKTi7QhJnZ0o7bZajD1om+/el nD68fXfqiT4ksqm7eky6jZ9hb634r8nCiAh4/2MBA049gyKO+g487bXLZNQLESY3Bsc2LFZWF5Sd zASwUZmSRgWIomxoOHt0rt9lOHuIxd6zRXiZRj16ZwjHaOGzV5RJp5TCqtU/XUzaSbvpPSqbVUsx BRdVt04WqocOUNbPjB7GXz7yy0+Lpq/0IFTNzYr0LS3I8XGR+MQgcDTGlyzkJykEiXN62n9OmPbK rp8aa2Y9lLEYzdOIiJtPKPXmOOm+UpOHXj3fJN489eLjaMpOPpwtT8Y0tglmlyo8EUzGuhA6PvNK iIkShSjnWiqoxNpjZ6u8bqOm936bu2OZF0YfHCbTpyuaF9TBEwAEDqi46vddpQVSzEFZJMhoshWi kJSR1GWNoavnaFbzHH13KQyVoZ2I3kKQySKuI2zthpLNGmelV3DVasXXWdOlSMJ5equWz5L46b7v PUlF+o9TcevFU2XTxaNRKWdPaPU6Pz8kklKbaLJt2TGUtuXRbDSa98lZYJFakuX2MkBHPAaJubnE 2dsth1d3JBr0nEeq+O8mxpr3k27hWzfdBw7QENGiJj7fhuxt9cJNOV9k13lFpsLqL9NTuoqj3iWl 6ffN2GHMYT7ipbriiiee2UloT4ScZOl35RuyX2S+NJ9N4o3Tyyq6dMOWaXu9KnLlhVd6/M1LO2y5 hgqwDhEMxF0RE7Mq9Gq3VRRtNrGLxJi0hIozDJNuUWLxJMrPFNmz5Z61txPek9dLqqeOsHHx2kuq c9pqvh41WL5fHirmTl5s9dJtprylxhsu9dNPWe5So3u4dLwddp0vsX4STfLu9qpLdPi7Prp1Q+PW XaaSpI81aUSu3XZROBSpoWvYYKkTB9gRN5x5tg4pCEVZSSy2uOG6ssoqxReHsSYYrWWy6rIXMzI5 ks/PaJAsz7vG9+XxPPrhQ92Tvhdsy9Zddbd67lLpJUjlV3wKYKEBDJOOpAoRNHgwtRTTF3O1aQlE n44eX8jhdd/hVux+3jf8NGz6kv+Px9XfFGEku3S/um6Td97/2Iy5WbvXbn3xdQ2HEeiPJTo6EBvQ UQsoGq/I0FrXGcy4UX/FU0zp8+VxpZP83et201lk3rttrNIcrby+L8KRwzsm7fl3DdVRs3dKPUl9 KpJOl1U2Dpgs7dKqsu0nTFnDayTle/Lplnq2GlHaTRKdFEm7DljtlJlR27cVMsrtyd2uJWd9KO3D p02cqMOGd+3eHCyza7tNvs6Zbrw6cz07bur5dKtO3cTJaQHShM9EBEuYMGpaxxxsFjiwpwegDmkX bx9ZjyL9KvjhJY+R5M4+MrvvTXLh9aaYRl7F3DpVRdVIsxbtaemGzlRsq8ijjhp0okvRbyjtRa7V 4R20uo4cOXj+yBEPubn0EJ524KHzEFIwjwUbkaRx0cjFyBwXeWTcPslEIOU3xhu6cUYTdNLNOF2l 3MZ3Zkk1+dsrJO+E2XHSWXDLlVLplxV2uwu4JMN1HLEmrpJyTVq/wQ5WbKkijW6eXDlJNVso7cM+ aWaZbtLKE9lk13ajhs/0KPFHO7Syjhduq2ZWYJcSrnUrWnZjLK95u4kuy0wl2xuoqodJLOHHVlEl Wz+f89vr4ms5a08bGeV1+WHjt4psqnmirxXL1hw2TXOG6STiUbJIkByRoYlQcsev3aAJ4RA9D1mX BE8gT0EA4CewA7UPYXiBvAC7nFLCIWReMS9yXMF96riKazugmYW9UHmAEXacFDpBD56X9fByeSgt tuiciEIMNGBBoDNIhLJFfwP7I+wsROejj7S/vq8djCS9mWv5vzuF1IGLseseo1Gn6Te5Kc1XS5Zh zoN0rYinJ0vsyboIwYeXVzcarVPodzim72H5xUXXHbzdNV0B0xKUyc2Bgvl7y1yMgu71NDG8nMWX V7Sl5Hwt9HNRvMQmHkjOYHkGzgzQBgchwErDTGk8m902dQ2Fe7tTYzocJF3jIDYxgFUtV68IzEjI aaGiyLaJJznerFXE1yPTQod2lxhi+p8jlwxZkQK2EhjhLrQgdVA6E12ZKIh62DF2RAfIdANWuKMO Iwzz7DC0mkjOydgAVlk4NtPIvrrl3bKvMEyUJl90aA4m857PZuAJsjBZmgiRbpb1zuy8TBy4pUop NAMrTW7FVO4p8A7wEgtSFRYEKgQA8/QfW2JRpRWZHpauM+0iuYR5f1ac7RhPmj7Sxtlr66awn4Ao gdIpRAhCnOb4YCvEOIGBgK2G8objYSYaMMpwAbAxvjuCeFFqVWnXx7O6Pp2+UObz7/eQBYmdqXun WOHNS92LedFBjYnclye31rXrIJREUSGKuVJMbkisIAIuGB04k5oiOYiOHJ/fdotEeSlghzhfdbld 6qzBRKKPWaoROa8QtOEeJ9tnbteEaC5MRGNYgOXe53JkRT66HJmguERGGXBFIsMvm7pRwqyu5k3P HjKa7Thssys3aClTYUwYyXsmRET7HReducXGTNjdN8yjCxB5tLeR0I7q0cWDfcGW0fYfceDZwaLH se3gFEELCgCcHEqwfXKzVbLVqS6YpTmMicY6Pa+p3XjPatYRw9T8dujLyURESI4lagZxejl24OKK zaQ4dJpu1pJOknSTl22Yafl95O0FXaezNF1Zbu0nNOVV48Tysmu7suTBoaG5LJoWfNyxIc+YFxET 6h6HfbjtumdNSXiTEIFEH1Yg/IAdFvisGbjMsfa++w8/A5sSYbNMiWFpLJ/1JN/xgRhJ0yvCT91L JpGvecAEuIKePpAtUaJslzGTcU+pxSJk8UTbKrPHqSzpNdq8pJVr0laIiONl8P6BCI3FyHtUDDUn C5wosqm/qTZ6caSJkWJp2mX5rciUJHBQ74MDH4n2NRNoRvA4dTIu/MeiLk5LSNHg0YOqpMrFarpP YRAcUsbl19mG2soQbr8KVScbP9zNpPN20kpKt3xv888/h5h27cLsXXerLOEt4Q5iEQnhZ6OXEnmp SbsuW9bRxHI1HLkvHN5wcpsKumG8cuWH+cF3DhNZ29deraTbul2KzaG4oh6suytxuvChHQupFR3Z 11ijwg8WJuLL3umJV1vlk2qcLKNMrZ6mhR42Ub3UWV5TWq8WR0bVYgIpdhRypFpIiJBJR4y0m7i8 L+riklYnI6ZeN2rOk2Y56uuiZC7F2zxRZ28dKrMt3WE03V3TxIspHfO9tG2WWXRpghhnSjDSVtyi oldSdIWK27VLoY0CLvSWDqJn4hYg/v+ChzciWPjj5FuIHBYmkqKCyZQBalvG3BYmWNiu8wsOlyJe 9ixexpVK6sWNNj6iTNjoqlMb7ODCweJIt6svKUoSrhDdTUmWFlMSSWcOt/vbtZE9m1bMMrOlnNWM MrPbdKOnbDZhy5rx18nLg2NvQ+wgh3+pmu3ZNG32YjBoKzNGIEhfAryThWB05g1LHeuL174fBgiD qnbgtM0JJI5KHR0XIHBpSh3Nixse7uTiSMyudHBk5qamjLccW5ATx3qQOw5KZgojmCMygo5ETGeV mExV4ZS/GaOGzZ+mFXDKTd7507SJLF3x6duHWJbqJJvDpNhRZZpd03fpvOXn37dzQxvaELKVJzmx 1ymGPIPyHr6uq1ljoDOkJUReLUXl7GM7uMmy1qF0nHL6/VYYx4y2soadHybx9TTVUxiT1p279UV8 XxKTDd2pUn3LrDSa7dJ2SXx053uw6Udtmz8ZTKbGSPBE5mbGTRQ0Kk6dDLZOICgpmNHfWr19IT+D LZIeaUhbcJ6U1akygk27nzu7vs/joSvjuWXS52zrablsk31ZSbbS3ThRZy+sXPsIX2NTHBM3NMKq 6bFMHaMkBUlg2GQy9m7l+PXTdyo4+XcZPyxmRRv+P1RhJRs8drLfOXTpJupNspy8j9dXYZYUfDCr hVoXNDAG7SrsjituOwzbu74gipJY00kLIWUZSxJa1uJXzbe3/FEaNjZ0+tNZ1upcq32Wd5C1Dkgw Q5YVT8TB21gkoClu9TsQJ3TCaljYotf80+PiySr800tJpOTWlk2klvJ3dt1tmzKjY7Zf5PGXrpSj FW7LdypZhsZaTTcPGXRa8If7X/rRSu0CK4/wgRrmWHq67KZa8nP42aSOdPxb401NwqseP3/VjhZN 06nH422fnDzH1Dt2utu0kq77+KduV2my7pu39o87Piqek3x55ZZwy2d7JS5UcLPiTp0s3UcZbuFu FGzh0s2i7raarbhJ05cNPBG83bL14dqPW3TivEpZYS654VTbbuXKzeMpt13Dzy667LSTPa/6tx6r GRTjKRlBrSJGg5TY4KDOYNzfefCRMAx9i5y4eOvHLpV6qu8evrTZtu0wmus/qIiqqjdxu06OWXLl y0scuGWXDTCSfj2R3fKuYGOurGDUybFqGNhTuB2kb6FzTTepg5XZTZeUOizd22fFWznn1d0+unbd u+JKJYS4UeJnrRpu0m8TSWy9ctSOJwLFLjpQcuQgRJZnuYKm22xgn4r+OS5wWtsbmhpY4ORjSxg2 KGpLfZmcdYt+bxdYAyMrMPS1Pz8culVjtJRy2XOF4+fO7tNMnCrd6m5eqFVVX1pxxy07fXTtJJJZ y3YdmnHFTgkTLFhjgcCdK0otczbjHUjPzEDkrGSf52ok3eOXD3lhNykoy+OXDeUoq4WZSuo7aTU5 dbvvq6V1m3DaE3jhl0qyy3duV26rNl3a7WGX531GznvLvxw3mn/SiP66gcxQnhxgBqR8jzdYL1AH kAXHmD2gobTpOIXrA9Ym0B1g6UX1gHWZIPKJcPgdoLdzgawznrMVD2GjAA7ww1r3AdXYJuDUQ+oi I4ngNkQQku/VUf5xhkhKTP4ZpMvs1HUV+9/yP2H7BWK9Xpcb5Lh/UDDcJfygJe0VB7c4VjOtF1mG 7HGbHZW8qQ2Azbxi+FDUqexymy+bGjYRcBFwQB2QKM9DjmSSgDVNw3GyC21NjaGq5Ndhnb6N60bd 9UZWARyG9z7uGpUDqkLZ22yQOuuVF7uauax8hPr7mS9rWfRoAwmnIwvBFMXiGVXMwe1AjZAW9TrY 3nDV6MYs7zLedPIbAMaeCKa1ZJqTGkZuU4d6l1cy+61KqiXIKpw+IprSBIZt1B8qiC4UFt2xqhxm Jry7t5Ac0ck4FifBFRgu5zsdpY0MZPb1AWdQDDOfC6QoamqqaVfZarFrxMQre72NF7712f1zEsD7 BTAklid/m87+thj9b+sv62YI+7+rxdmvxr0/bC7oQiHMESREfEUQmEKEUQmKPIg9RpE1SUQSgpBR CLlBBoOCE2BB89LriQ8mPnSxtrzzv19NeDMJfZbgfqxDBx6uZOQCC+5O7hDIEEVEeAMQts7oyo/1 w4imUFxCabuLG6UWiIiKjfScy7+pnUWRDAhCLpREQhJIcPrrfKjN8JIQN2cPuTw0xECFyX9aOua4 sTN26by7DD63acM7URdKIiHxpZy+L1Tdvj+sQxsu0oyw6n4fU02Ge3LI41TQiTsXIGwx9g8S++VZ uBe+qu7bDKzpGEPS78u+eiEWaTGmRkEN95TVCqAAHVWJTAGpEDtt24UTTurBZA2TTRBF0k42GnDa 1rNbemF0nNZ2nbrGFy2DH4VNhwJCoIImHb9O+3ar3KEZiCJGyXByw9hciHEkSVYYW8abqPFultkV cvWD/Xu6Ig3SiIvJJN2uotwiIvB2rNCBRCSCNk2vnTZy3dsuGy671zF2X6+N2D43d/nsrcYrs+II ZZ7FmibHBAR4yoIEYIkRfXca6uZ3Ft6fPnCvMl8oSZiUvqz8+LqYXcTdMvh0stsnHXXbhRNNux+P W7h/zNUfV7vrDtpX1A8+sJfy2wxjj6iI0yfXqjTFPgNYfHbzZKrZs8Y4TbrJtl5tiqkJTcJtmrqO eVXgwXGInBU6LXNTfUoUPmdzGeZ8nRyplZtGuzjqeCNMeKF7VZqJcQDN7HM5384PMZZoJdObnBjH VrrjY1NtC5sODJfUVR5FC5GIteu5cHLCTDU2HjtOzldh6q8eIQeRR7J43ugcJMsjPLhJVJStnD1l so/FFuGyTLtuu4U4iUvnzLtZ2m+JulHS7WtfNy5g8hRyCQNhbqOVJAfD3iCR75W0uezbMyyn+IDf peBQZBMfNsIEms1ezzVFig37hA/ISMGEt0RhCGz9PVLPu7Lh+Nn6Ymzw43Lq0fJJ3BJ++3iiqrxS Ij6TTdLIfWWmF1Wruo4Sc16fdkunDhJVy5w9co2SLvjq0pbqtOk9+XCuX31NJLPDxlw6YbumWEC5 UYkUqMJ8gRC22hfiDvBDlBEIXhuKuboEXJ9DI4P001NmUSqS2dC/P8xQsU1VfgI+zMSTxfb48fix wwDLGmzpi8iI+uXKqZ79aQEIFip6SC5IJ5MHfBNDuGDUqEztPsqqum2WTSW11+RQ/E0mPxtwr8Vb KKKNFO22DggdkwKMMlzBAcwMS5KDESgj8pmO5zxfloPK8mxKUSMmhCJGmPwK4mRkICCJoKIdpERS Q2VUmoiO2X1nvhy401u3TSbN2GzMlowy+fL2ryukqys04Tfm23TD81dNP8lHC6eMOXCT1Zy5fjZl jKSjZwtys65gUwZNR4F7Fy5Q6NChjFChQ4PefM3N+V6pDWva7aXnfTjD9bcJg9GOa4LqeXQwTGKw ABlaSH6rMQae+71C7bMsrKnHxE1YnaUVcqp7bfpWyxrdU5XUVX/wBjDZPLmt1WHX4q6cMes991/b Z05VftLpZ2w+JOGkqjcES8jzIx3MmyaCQGLGy4FNRTssHq+yuiCBYfoPsp419rTYa6xbYShJGkU4 IuEwUAGEkkiB+JIFGGUlWKJaVZi92VfW7fpHa27bffCtcvslV34m5XxZlZdstclhVhu0dqvMZxdw 9fN+1Hx8fGzfbWkv64iO02l8JSlE3jXPq/TE5NfGGnTlV0fLt4v43fWnjdJsky2TTfH6so5a3ZVU 4tHirU1dBNcbGHRE1jBBnCrPScbRjSE2Yo0ziRFI19jYbKTZouxEmGcX5wuaSjMSk62qtpyo5zN2 4w5SWOFk1GyjfD12y3dbPkkRAOuk6+TIRHbZdvyxdJJJIREdJOpqeqo9bdJPGnLHizuKMt3LOcpb MyXWYb9MJsOrrvXCyy7fafPPM/9IEcygRJu7bvX9Dpd27XSbtPGyPFnq6izZZZs48XWVtZ6qs3cL PU2T1xy04ScOGnDtlu6k1usks3dsU3bJHLjJNdzs4SduW6s01nT+cQu4zWZh1HTdpwxnd0us2dJs FV35+uVnx1u4Wb6XbqpsOllHKrF3SbZJNlutHXbbF3y6/fkqt2Xzdok8ZzauMtu3Lh2WTUS22ntt tsrHkSacpcKOnTph08TYeSms6WdJuHKa7zy+OVm7RZjGGmHPOTGLOG7t27WZc0bP+dbxZ497UZbt Y2eP0a7jNnvvxk7dNOnKe8SUcuml3Dn6s2ddcMS5WOeGk2n1uUWdvV1l3bvYlY8dOHDDCrdzy3fX bTXCTdjO7LuKnMzOCZoZHKWVYkSgxgYhlJGRScCZKnyE+QmV1Xrv+u06LJuXDBum+fn507brvTDf XPU0d1VkVR1GVYEiZUY3HMY0NNAkTOCc6HRy3btPVXLDZ+N97NobmXxJs8VSbKusOlmPF2U3NZpq 9OGfFl03fdHxxL50nOm2uNM0/Pc4JmAibzH2UVHFLDF2MoiJk0JECSr13Vs+N0nTl2pwuqkws7Sf Vl1Gmzhu6clrN1EmnjZh2qo+/e12E3MmX7iIzdw1rZ8afFrVfFZetZUZcPIiP7x2/uHKqZjN1jyG cOBcYKGlHSj7R0mwzKdwkA7EUz82A6wTxJpMQOVQ4Atw3iaRLABcD19JwVMwKGdRuOgeoDeqpnFg HIcgAdY7eUDugpUQ/j/MeW9KP/5P7o2xvr8HeUUf/YzUZkZdLtwJ2gDriPMgMUMAB/tkM0/2/X9z 2f5zJ+g5E/4v9rK/She5hwTUjlO68PRlaIomOkQ+sBUDIHUqfQb9JcZ3kTRfqCqow10I7G6/tuvI 17Ad3h6WVOPyob/XazSAb+x+f9acbP5bgV4A9yVoYPWHdrjEGxzBgBrAMUHEsFyAwsgEIIBL0BxQ GqiDmQGQBESBmQHNcAiBbBBFYIhBOcCNq5nm20CNYpCYhA2BkiQRRDDJAYgOZQMOGzb2bv+qX7+H v89dZ1a3o3v8qK0YJj/ByP6okeoxT2aK/waD340A3+0CafnvtmJefx96CvuX8KHOFdNh6ubppOi+ N6xltM+zW/sRNeEvvKoa/lEPX333iBI7WUQyUPiZXGer0mGWeuX7x9fbRnt0XO7YnDOFRdvP7YQk CPmrNdovU/E6iJskHwMS8HjCJNDfug87bUBI4aJ8CMZLcyMrbH5rXng7vp+LHgfoLsOi0L+C9T20 rNfqPscNeKXie07bUqkaoJtbw9OWgpBU/hTt5kzupJLqt5sLPvcHV1PEiTsi2gq6mWSL/HbKyfO/ cjQ+grsQA+fh7r33fLzxs9V4lZt8noX1jcz6q8da9ANfR8GT/AtCCBfy/OQ8/aQ+Wo/X2neD24J2 MKSnkJRsS/358/jmExJj9HvQqpJYnktaNr7PHqJqrw9Vi1tdo4WkF824/c3rmUcueQsCvCRxUXEO o6g59BVTS3pro8boa4kav1/X91IVXNfn58220vXOzXfJCrDzll2ZWfVor8pShBWLsscJ5xzne4t2 /lsQfQ32n0IhG0kr9V8Jd6B0EEWpvGDLRULzjl3lXX0u6xlP6K21b2grHLjJiH5EIh/55dic0NeN zBnzt5E15TXvW0NIL0a6rTwQWrACTnCrfWjIxxZCU22aT0995/JolBmTqjuklQg7Bo+vnDCYevtP WZAQJJNGYRNyCoxhUTGJlE0QCWBN4hvBOO3DI4cQJ1AlgTUCfX/2BNoJaG4gujdRdsolq47NHCbt 1KZoJ40GE2ZX5rtejde3HJHCzJ/2Ps/exCB/gQIQlgNZjQYGTuJP8YEIAyQmMMYL/v/GBSJI/7Wo LRQZFGRqLIgcBQ3AI+FAGIAiorGKEFhFWKKQIoKEUBEkEYKCwZAVUjFYKIgoChBZFWAkGLAWKKII sgxAVQRgsYqwiQYkEWJBYkSMIyKqirEYosjGAxYsRgCxRBUQixRkBUWQUUBEIqIkRSCKCQVUYoix FVRJFiCLFgESIEBUYAQNwi0tVIskIIhQIpAKEoRBCFssWyBayDIKhEIsgkGAsgqMhZCIiBVaElsW UgW0BklCIRVUYxVYxUIhFkIMSAqgKqh7SLIpISLIosFAWACyEWKRYCwWRVkWQWRZFBYRQFAUCKRY oKCwFhFkUBSRRSAxVVFWEUgsWEUgKEUiBKwBIwBjFgqyMBgIiCCCQVBBAQGMVjFAVIkWQijGKxhA CMGDEERjFRFVURjFZCMhERVUYiAMkBUEGDAVEWKqh6U4D1vuvXuuhDLirfnc/JyX55olSZzNzCpu ABGmKNMpWKL059n6chVC3IDFVEo0XUvb5aB7YDFCKSIqgv4H7D/wCfwzGZE/TZd/zBLAnpxmH+ws 5otmsS1kP5/6n8Pa0Mf/8mbC7/kP4Gr/wCUCaATHMQ/+aBIqfqREgjY38SXqZm9j06jMDxmBeHhd Hz8AsFeqwc5Lj/A5vh/nSS41P+vheYmg0E4rFImZvcMDR9v4XjnpgYWyyTI/UJf/cOMDC6YNWvJ7 vU+0bO22uyEBiSARcoEIVMf2vFhkn3nracOqF5DcR1lqyej68vyKLNVYohVJjZoDA4f+HR3OgUD7 iMRb4IgtMQJCBGAJBCSIKDIAMBIoSAjYe//hE/+nrRgJmHVbaaf4Vt+pcCVw40u+znRMQ7gTLzF+ GxNXtl/IchW99pyGJORKBLhb/7UjpINouigwbqATH1pfEIwZVgTS3kuBKesN8CA3gnmAv8vtY4H4 iJoKe8w+Kn0KFg/gqqou4yMmENgCQ07gxEYrFYoqKJEGCyShZKIIMlEWERAXEsWH5nSQGMlVCVyJ mYYQZCVkhIuGCp/2si9Wlnl7jpD0hgIN5hxTuQ/XN7HA7jhm4th/FX1Ou8441I5yaoSFQtwMrAjN jtIG/7AZYom30LKdD5zQe8Zg8T9JwHFU4SsBVVWRUM8H9cUS4IRTXN8yfgaDqsIrL6TTvyMl2BnT cnNhRRQFgs82UnIEC5P+/WCeBo/Du+68v/2T/8WAs5kfWqep72Fw5U5i5w/+8siQufchm9j+Lk3a r0DJUsFD7xg1FDmE72Rg7iHRPEs9XxebitiUS06pR6XGJ6hZ5DIfuTk3ydzU+8h1kSKiKM2ULGPi XD7Rq3kWSrjDN9wZ/CGc3EMsDTkfgfQ/E8HvnqBIdozuR09hYwnZgUCaMVSjMEGnrGjS4IQe+4uL 0778H5heGR9kheCXmI2AzagzGT/c6wTbpueJ+1JcNBeakvSzpxTBdTA1kVyZkTRBKj1dhyfcHfyq EIshGJ2EXpIn1DRGryun1aISBJHpoeM7NXjmSx/IH/YHAeD2Z0SNNAfKL90IHcIUCQFuSHc9t2/Y J4gr58fFy7j5+dGIfXME+6UCH9oiB1zUjnHXhmz++xruG6HMOACXoDAE2ddHKZzk4I6vYnKHK0CZ Ar4oY/Y/IvIT58TpyBWBrOMLajrPYCcT6xo9bEMCN6IWfcCbwv6CND2NUpIqmcKsaIct10LdSIGJ d6sbhLnZhcTE+4cJ9l5mM77XE/SH0zlE08iGSUeTJhMkxckmEDwv1bgIsUUgjBBCMLKUBJY8+Utx +sEp5TkrJ/bcCeAJr5KA6IAPtH4HzTSCWe0Enqz6+UNO+glfTiPo6XE89dEhOr9qnJqFvc3q142P sQvo0O3QrrBOIEuBLAmsto6/f0Z952nlyWwvL1uNr7j5eWAJw+utQyik0gj+xr05sXLZLWjLywJ3 SjiD0sHothpD1N6u4t6JH8uWEkqh7OXNOHwOnkOQdUkJGJIxkUhHHOd4nXvmr7ij5zR80pMPVSgz Kiz3sPYCbVMxZIPszX+y9mjXxmUkzV9lSiV9gJmVXPZUzji+x1gOZuvMsixsIk4/py9WwASfO86P mYenXaxaU1LVViISWsBayYIp7imjGgmszMj+9zWrcVEtpif0VEqRiNgoplpsggFsE/x5gOG7Ql6u h9yif4+71WdsxE0cRa+/7V2jCPTYE9J189z6DVyDZ6h7HPOtZ2vXDJHK6GIdpCHwPQAu6jtjxtgT 1lFe7D7eXkOBg54OBJn0BgJcOEhvkab1BuDmxH3XZI9M05rsg5PQY5uPteR5LX8vsBLX3DQmUfQ9 EuvI01vNDC5D5yEjATrNIREzFgSgT6grgcsIEFG+4EwHS9R1Q8gHy4HUvZox997aPkiF9Qh6IhHB Y9HPt4IdB0IeH4JYNRgp8BHnMXyC4M4UEaU9YJYEhZoEwQTMDDAE7ATCypATFcUwBOfQA4J5oeft 5t5v0vQNzY9+/dwkkJJw6KtxnAv8Za+TrgGXbTdcmZOYwBO0eZ/7j+cV/nFGkbuoNEP83m5C8W2N iHZDtGckwB7DhykkkI8fnJUDlPAldMmk9O8QZzSVnVPHR8EHRFaNAJEUW6COkvgyDQNln8MkUCGk /gfh+v1/WCj0eKcgHv7p2mo1+ySmFWMUTie/B4vOBnqGGBL8n7cbvfg0iYJhsiMhCEsCvR19Yd4K G47AtCQhBOiAnYCTx93fY+7SddkckngYAmrQKaFTnozOF7sBPceQGRAp1tJzmYcgTzBJXrgZR+A2 BOW4El20BNsuBMSlTQZMwcJzc2ad7KkofO3Pej38gL4mLYo+3s80zPSTpHqf3Un4CIzP3SeIYfqQ hR0LsYkLn6fbet88SqG3oWKOBrQy/wLnVw44yG3gHAhL7h+fcmRYQYue8hpC5TDCevFNc5SiQoZE ZHcpuapSkXiwQuMcwmfTIS5w0Bc5FrWJpo9O1+w6pIdt1B7ASdoJgCQEp+IM9QJ9PUCem14m9BMH U36FYHLZuFMAE5EvaAG5EoSr+aeY3h7fZoKHU+tvbnP9LOhCYkilRqw0Empz2ZWZWb0PgTmCHken p9j3UlKCCSD8vOT4Zn1h8cDI85dLeNtMhP971Xk1iJ2ezG17BBOKJs84CAUPnL20hhRIaaonHwN3 lxKNi/jOMC7KWT7EXvty6nWTGg9yMIsNQEuuo/+CP/7mD5VCN+LwNDbQ7KkcbY3XNAmJJ7tPZLvj 7D4esEwNQfUE+lesaxPaYXSSEcau8ICdV42DMmnaL8sT4p7XPmdBSQH3gmJpBPfrNmxTOYgnmbGS TS6AS8RzFtYJLyOIJkPny/EItB5DlghohsWNSSklItJZn8f9Ejo5stYJ4wFOi+vcUGHUJ5mjdmLn GpTxArwQ5j/5DP+SNAocAT54qr9CuXi8OsEpF/WK+UVxMz4onMLqBNPKcp4vuzonPai85AsUn4Be F1vc4PI33yg5k41O67I949waVc5h0qmewJmLh32RIqbAMpZqAmRANTqPRtfCC+L4wbnzL9Kpy+ez lBNAJdAS9s0HWCUXGPZJ7FyghE+RcCcOkOecHziXiAH/X+39cT/zAtso/0/t71U6/fNPh75Xj+Fv CboUTorG3yl0zWpoEoIgWKOl3hVox7LcEHFcJ4YWyNcu8Trd6y8997148WuJvrq7v6D+qfuGfsD7 P0GG1hI07C2Bc/leWIN8uVPNUooIEGKeK2qW9/uS7+jd6SdW8esy9a05NPSmlDpz8h94yRS/piiq XzJLwholIR/XgYS4qVghOUESohorzNRRbJSH9ypi71DlJCHWEOk8aWxbn5TA5zAekrBG+f16jPfe Z6OtJUpgBbNn+Pl8hxMgwV/zDoEBRBDW7CKXU/ygQWN5QqGBQLL/wP2XjUDXLBMv5/L28TO4EM+E euJ0HZ774FVDEAIS7RiZnA/uXgxJQJxgD7kLKHIQcPo373qB/ZJtdc9muZs9fa7/zMqjA3A8e7iB 6cHATT78FObSzEPgQ35mvLZz8etkEJEhEGRQIDASRiAxYgsBGQIJEjAZBYp7QCNJBgRgJBBRIEBW ERYKikEQgpACMZDXv9/wrff5nmHEf+Zm/M7J4kUeCqsRiJHQWXKIqIbxx0mvVomBocDK68CmBfAF GErIcE4L4lGV13iLLp6pGaNLRBskmxOwmY/3zVZ5FYLTE1KSlJA0rCilutkciwqqKE9XdFXX/UoX Jv/bJXDVFW7DCijENzal5SEkrq3Rfde+T3nHAGYjnjcMz1wUZuSGxDG4d8s0xkgcX6Ow1IB1N9J0 Xy6cAnI3Qd8KirlVCC6SKirtDEG68u4qMQz6DLXNA3TVU7Xsswq6TICaOB4UMqkh2SPkMI65jRVY Iz2EwSY8snXfEMDM3o61sfX3D9npLYsyVSWXdFfmuXqRkCLqXjJKgRQONET/Ks84mFahOU9huOF6 Ei5Q5SwLQRkAkEUVVBSCCekp8/7WP+v90v3f7o7NzK0a1KWn/r/3VpSjzzbWhsIf5bzfCqsrgjsz GRpJYmd0naXP/Y4F4dqLrPij4ZUVZaLNklFE7l2VVf+z/47kiQtDsOTO5/0gCYPED6GoxwIo/Axf A5uVSw5equnbSN3HxJ22P7yIOd+pOmzJyQLjDSnLJnsFCBCfD642e1Mq7ym/EKQhppMw1eON83tL W18pUrZN/ZBEIOFmmGFLsNm1arsrNm/b7GG6W7dxV31EQiIjl05WTk2f6uj66dOWm2pXScbOmGyS SS716w3cPFlj1J+/3Xjlymtbh25ZdNZl4wo3cLaVZaVSdunxNpijdw7ZPWGl2WtmOV2m6+Wzcqqq 4Xuq5y2dNlVF2Gdk3M2zKjCrp088v6smX7f4v43xza8N1nCpW97Vs7+vEjhRl33s9VZXbp/XTZdw z19Vuu+rPpua00u3aYeUSe9ukk10umlHbpJs99y/uQ3TetzTtpPg8Us8fufxL18TabM/JsPjlRyk u0ys4aYcqM3SZsndqOnarKccpuVWWFizSSq2H1wc6VdtlXEbMLsKTUbHTDtdRxNy0q2SspR9+61b f1qtrSN2naq81cuDbDvKbc4thpu8TWtN5Pt4bMLMX2csP6gVtKqrhzu7WbOllo6S+RZqMUdEpJru 2E22Gy7MeT2bt3iz/N3/UjS7Yy5TcuV3K3TjvB9UYepPxPlnLNFZKqtNZb/FHGnEMr5cLvvt3Tp4 7tNl2+vU/UuWzdVRssT3Wdt2mmxzzsw7bnbjh6so/kva3x42UwoyrJJi2PHxw8fG5Vu0xh64ZLpM tYSbKLsqzUtZzZdQ3YdpmkpKOKKRpVdw2cquHyzS27lVhmXD+aIfiI2rrvn/u/HJjp0zmusO1U1e 5Sy6af/guwyws2a5bVTuuv6qsmquu4aSXy1hpWKPuL1dONknE2yWVl7YWYmy6fX1N0s0utdNJddX dJD/5kc71Tj+P4y7SXcJKE3PajLXOHSjCrz1hphpdPBR28aOGm93LhuWN3Lhy4VUcqKsPigpAiaG hkmcOQNSpInCWZjmp7IiJ7hD5r/cnuZQQVBxUFJFNCttODg6KSJhwToPCrPBYpO3rTd6q+LvyNJW XcMJG3CqJPxpsmokooxrqWXPfKkUZdtpMpd7pH64600mwk5cuG7xwcN+0mFGHSsEfy/lO2WnbT1P dukmzntdZ0s5VbMumZq9svFmz+XzZmN2l2XJ0bKqOJO3LtebKTeezxlzuk5JqZuXImCpyKKXMlJj lyhAwXFKlyB7/AEDz7qE3RWn58XnZhIxhAIRxquK4hmFODkwPqeIjnJ2FCFCh2OxM5Jnjx4MWSRl RhzQ1OxRTQcqOaGTNTB4F/NEBSDliwuTQbtBeQ1kKKP9X1xkZGKdf9yJUqBa375YDjD+QQJIxwNB kc3oV+z4Wgy+AnIVwNpymHx4y45zm0nSZi5wT+ahJJEiJBIQiQZEUBWQgoAwBXMeDJogSH8AjQcd 1HmDbjBZyVRTTvIIcrc81QnM1U/zf70AwXYZTY8dCaMmYiIIInRaiSSSXn7/qfYBffjhyCJr4Em8 7qULjnCjqO48y/1+JIsWRj3H0KClT3hoH0MY0LFDIoWNAq0/x8cqS8bOnPN3LUnd2lnCzpdh06Vf 6ELzUXHHAhDtYUxYaI4kzmJ0nIfHlxNJqNFNTUgMQNhS5M1IGJHRMiVI6Hg7dt0/2SVW+2VJIHWM okk9f6zOGnlo4zdcIoUbyxzHEL/mT9p/ID85IIetgNV7+/GfYcdYdtZCn3LjHyJm56p7xy0ZDFxr h/NUSBgkZKjwPeRPgXMBkik5c5MqdMNMm6rHn9Gkm3CsSdNLafydsMtJptLKq+Wu5Yf6vWlY4xnv e/VP+yT/rIgroWJiijDoqm5dhyJEsObn0+jnRIqMKl34s/H6Vs+rJKPH6fenarDflpRXL1zNls6e uzlyouu32e+0s3Tbt3/Q3Zz4u4W3NJlRY1HEaRXcbDcfiUd49J4+rmQzC6/1MDs7oQhBuQHR+FrX UIohM4Pf9RTHxEaNSio+wDlB0IqBQnQg6Pvu5CqI723+kjVA0EbgQZYBo7PhCTWqHp0ocvUZvdCA GcAJnMgUNz0zYCsfwhaBGQkCMkjCPwCdPD/Cw5ofrAIGI0sO6kkAuEZD56QevF/1gkIMGAH4gncu mIjfE1ENu54rjZDBoCVIfnP2wscuPFleCdo5hNoJvQ5zDmARxDcm8IUmnbAgCbQBrvHWb1vFLhSw /0IDICABBGDUUwgh+ky8udAcgsG5mVMo57KBbjB6iBAx9V+QgM3ZkVzaRjmMOQ01dIT9lDFaoL3S /yMPvBNO/7TV7JoDv9Q/wAg5yBcCZKOCJpBNsv0IQqfjjV0AisQjA0Y7u+rzWhDz8AA+oljjQOWA qdEPfT3JAE8/hHrNypuyiCOyAkWAlYzEAxEGBABEDswzZseM6wXPrBICZnOkEjFjHOMkrD1Dd8QO TOd+q817NJVBESI82Ot9HTL1A0ME4iFv79w7wA+B8DQOrw5DQogSEZ+v532XU+sgoKqRAEBJEggj BBkhxKecbyMIQzHNyGw3GeCNqlGoEwshfFYQQkGJIqP5CndISRiySKSCKyKMYfd9uobh9e/TPR7M l2CERQQJ0uHruHBcCrlLAW9dxDA5gzTDCgZBwAziwpbwT1l9gTQH7AeQ5JMyA5kQhhif73qGwzyv 5s0Ql40zAkyBkSgFoZwEJUt79rbGBcgZpCECKsHlNCDpCCwIR+Rf7keRTMY+yBGHwlMk7gpKsEQt 3y5CFECELWWBa0nZ+YA9qKXsJvEerOa9wOsdydZBkQ5odSrA/YlhM4KQPZ7D5QPyD1xDMiTd8Px+ Xvuv3dWHj+zNr+d99vzu5s+jXdfpkfKv+X6ZTuCizu0XAJBBDeMGbMBHsSOH+eO0vh0yw4eu1njn 1pNwsmk9w3JOLOU0ncd4bOnaSjOkt3b/kSWWWmzTTDh4ZbuE0lXDHTzhTDtN/h/7s3bPhunFGzrx 2qIf8ndWZPG7Csltm71RlllRX7bfi1efntGtLOml9MC8SeMqaaC3IkiwxOxDUqQiLqRLk1myjlNh lthmfz5ijtd2vfDhyn03aW2bcPXLZ50kw04ZSaeqpuGmzl65btN2zd55KXfirTHiU48eLMB/REVb 68HHGnuE2Hr+ply2Ww5YZJvHy71X63w+mFSTdpJJ8dtnDTpJOLuHL327d24bcRMmzpRw4Xb79MP+ qPxy6dabLlGW221Uum6jirouEDjeZclHUkSsLwTsSIwIeHRETAso4IPBsskm/18bpqpYcp6kzNfS UfUnDTPDDtPlR2ty3cLOGk2GF3CaabZRx9cuU9KtmlHTXDlRuk3XZclN0nDKNLN003NXz5h22ZXi bZw5SdqKMP9ohD9qZjx8663eL44eOTT47fFV1WyqrlRdl6omyw22vu0o2PWHDZ85bLOXH3tlZ258 0u5ct26biThwy3ZUeFXDebt1FXCjKa6jvXjhSa6VmKO3/MhDhZ/MIrtxHXLta2Txd4qlG3ztV4+L uH9g+Olkz4mu5cJSfWmHinJdw78csrJvz3pVpxw0kq+PhiJO+HDCbl03VT2XZVXSddaYSVadpOG3 scJPWFbN9+jDSzdy6kom9UdFUnrLps29dOHuHPfd1nTdsxpdPTZhyvGXrCbxIndk1VLxRKCN3GFV yb/F/Mj/w4xw+t344UepvF2M4fjl8SXeKt0lz4ysS02aTizLdpy2uZVWUTslpV+fmOH4uu2VWcpO Hb8cqsukjD1hhp744JIj/rI4Q3lBlxTvhHSbq3xwy8WXyo5SWb6dLMNk1VqM9NsLvnyzpu6c96Wa 6fCzt5KzxMWfGFGz3n+xD45eOnKTmzlZk04x2lPLh8+Wxtk0om8YxZRh498TftFlFEu3iS6r1yqk oknHTfnm3167TbadJNJ/zO3qrCzOlmy3VTCzp8bPqqqz2ijDLSkW/8USQP2iSSJISR9+2ZbN35H4 xj16003dtbKKu3x8UZTWY52W+KrK6XN3xp+OlW7m67l55l5sw03bJJKPXDxhTtVPp6man4njwjBk wccUcIqLcY5OBjgwan+OioChvXDKTLL6tpuqkmr+kvrD50x+tNFlp3iyyemCbKkbKJqKSTTcNLpr lGWlmufPzDdGX6cNqN31l48eKTepN02tnqqt2VrH/GJIete+ylNw3aUcNlHkWZz22Siz11l2u09Y bbTab7pOmVXGc7tXjc+Jr3qrpii7tl284dstLp4XdnPPjlpuom86bubLOG7/GNu3bGvq1uG7T2tV HnmHfrd4TV+Omyrttt12v2uzQ3a4ZTj2pGWHMQ7STeKnDdvNVu4W+OFGWqpbxzGC6T9wiEA7Ih3V EE0jiRk2NCxpI8FK1idjQsdrCpyUTqsw+Pt1lVHazthJRh9OWHS7Cizh1U5YSTbpF03DyRSbDn4f Ik6dLrJ8K64T9XYcKOXj146sun426LMRVv+v1UzcmyKXNzJkUnNgoUKF+aJW7fZEF/qXO25cr44W vZ+MJf5GF1FWWHCf42fj9Mk1YvRZplR9aUTVTYTUf9BH1uq/MPxp0pVw3WUdOWadujZfLKqSqtHL swtJZVRlxaTAsaMjnG4O8yPA3nU5+led5go/pIMJCAw6JfnwBzEPyVklQVgRIhVYSK0CDUBOYRK+ YiF54H9z+JpY/gRUKgkhRALFqWQWVISiRm/1Kr/f5Cu1FQPQdYmsBPJAfL7e47R6hE7X3nKBmE9x 4D+84ZG8CDTFV+YcZrhcqZgEoDsUdCocELaDAUSjHgIhbX8CEGAvmeReVrDpBRECnWCBFAkiDFFQ vG+SSMIsiyEOPm87+X2+s9unHeb69uWF9pn8sLZsssdOa/Vr18qQjjUm32Y9ZK+gCKXiCJc3RJQ3 wBD7iAwgqHrgKnEXnlh2AmH8/4SjI+obTiIEIshCEgSDzc5wN5zHOfMtuHBFilCIpUrEqecCJEcy MehA/f97xiL5FjT+3ledru1GWV01V1Vn9rl20t2nVLZNh54ok04ZcvUlVMHBssdO+sZS4dJuNKOW 7Kz+sd4x/a009Z8crMNan2oevHa5DYuqLTe87KYtaOlKl57rC97C2WJBbkC5xI0JN2ptm3jd43ad pu+qGXGeGqKQo7YYXKbtmklWnkbN03DLhVp4y6WUSbssMNNJKuVaNi6yzc4FEI/6IP8/sEX2v8dx p+vz6s7ZzqPZOmtePNmEk33DZy4XbulX1s63cN3C/5pAs0k5aNK7NV2S77xhw5fjMZSeu+ijCRNl S6Th0p4su94KqN2Xhu88s7Sf+yba/yaTs+rOlZ/PH/aB+LPX82H1Z20k99u4fHfXKrlK7hN+v6Ie rLu1ncow2woskcXddWw6d7KMOl7tlaNrFlH7dNP0/3f2oI1cfW7h+1rNPrft/o7ffvq6r+bar9OH 6cLKL2evXpRRhpsm7eOG7C7Kbly9bLsMuElWxRwpRNY885Y8XSabNLv7VOoy8etmVVl2zxd44aYL DEz2BL4IFhbw2KruNUY8FRSiLUU5IJnmfWxV3y4YYaZW8TSSTMMNtTbqslWzTDTZpdhddJym610+ /aMZTcO0yj469dxJcy8cPGU223bu6ijlNazZR4nRezDmiTlNJFllHTLlSjdlpw9ZboZUyussq4Sc N2zvMoomm1y4bOlyzh26mxhJuyywqosw99oyk3b+J9OXqjl5gwozmCgx48AeqTl0TOi1jfejmpuW KhqGxTxrdR+PzZps6XScqKPxNp+NbNjLk2dKqtnrxW2WnXLZ4w6xucMR3z2pzVJ770y5u7bPHa8X eNtu/XZdh6iItZfc0xs4erO2dniU1Hj1ysyqo6bpN3NizlzlR2k6cJst3DhhZNJRt0qom2d6esPN 3DTTm7+25EUf1RCPxGog9Yevzujpp9eMKns3LWsN3r6/H1Z9SaSePx4vhhNNRpZyc88dNm7hysy9 dOTD1JhystJr1V4m4Skoxh43TNuEo5WSbuFnnnj+I/oIe9xvP2Y7DJ21N2mu6KMdHdNNOSJOsyBs YInIxIuOdr3pNILe5k7mChQ6HtCSZNCZkahUiR1MXGouSxoahZuxs2jyMEjVj7B+CgdxTwjCerkY WUAFf4eu668tjjzA2PxBoGgtC8hZMDQIdWWIn6dTgmg0DBgie74LIc5vNgdZywsdJwM3DExM58fj 2b4icW+fYPIJSLyEn7WiR9piP+MBsaNFkKNrysCS8vnPRz2MUPusfkWsk4mMIPefgdXwO85T1HaX 2NvV0nUTrPEuoznqMPaq6T0PR4jXgXXFGe4PI9RkeRrLFLOdmmzDv+G6zxajTDhu+PW9jpuquykV IlPTlQ9j+Xc1Ni5PpVwaHYYkMTKBQ+ie5Iqom2gpURD4HGcRwN5t25yxpNGrlLjI5GG7xrT4k/bK W8bRdRss3Zb/ydn46UVdJPPMuXTdeH1PpZXfd54o/FVOXKUspz68ZjRnMxyGYv4jUaxoyPtafviE hCIyCsAURBlEInJrrqh49yf3HxTx22PI4OlhHUudygaaKvJ3mcB5mTuVMjn6g8xyymhnNS5Ubu4p sVcvVVHqi7v47TccYWcPmVXHHDp06sspp0w+aWeJ8NLsyVcOMYyw8btaOU5psEhzRKFTbao+SQgF gRNk2BPX8kY4ZGBD90VVRw22InRNsfPggp2IHRg1HNhSwONgwdvIujk7Ph2eZv1B9WIoxFYj5Hg6 PBow/T6u/X6m5ZZcLbKna8aTTb8qtNmGMukjmi9lGb6OdHJwHG+xAUiaBX2ucGYpsdz9O/bu5cB/ CSCmUQ1F8fFPskI/AhmchEpngev08YSYAmKA4gr2RSHGdZoyETXyG04IgrjQIKdz3Hr6uOeR6zKs ep7EiBuYHGPb3GVE04u7oso/saUeKN39ixu01Vlxwko4Uai6j32bt4ktc4cNcqLpxEcO00nJeZjy B71FPjv7Oaq6EBx+wF8EcbyEwFfCT80If0QR/qEYoqxikVstq2Mgo1qtGAqLQoakhAkCh+T+u/yZ P1zqA+WnIfqQLQALHgHmKengeZnHbAL+76D4BY7T6Pt0azWRvkk5ij4x9xIh1DcgN9xUCs0NhbKP 5AZmQhslKmQnXLQkoRSMVO0BjSoESEYAxEbzadXRJCpIQUEVgCIhoJxT+tUVJFPqbRCoaPYoMPqk H7YZ1+s/e508gJXJDUgwi1CUIwipBIVIKa/J2S4zy+F8uKAgaFQQ+JwAPow5A+8FH2ncgOw6zRpZ Ok0hpQ53HQct7tE+fCqM9rSSVvQBJjYAVBDsi0VLKAxYyfQQD1xiZhQv6qP7WsZmv1NWEbr2wXyE B9DOZyxiEIkkfKHXBC++jGzZzD09OCbAdKtQe1aoqhoQYh8WZDzpNBkGixGIKIgklIUUUNBBB259 EYQ/99XAwRSkOMOnVQJdfi4Icoz16eFjszVwOrv0l0/NYOhP5+ykIR5gStRS3Mi/NWKshgCoJFnw +n4fvLjaipn7OdOixcc3FoyPsRT2CfkjOkWRjAISIpBAOWBIC3xUD0Is9hRRAQaUKSFAiSBRjbUN 0rFhAhzEtCIiRCB7EeZ0Bs8g4ijk5IECr5NpnP3fYNjjgmcV+0V7d4/Y/FQsChfnb5EIYk7yfsiE MTCxBsBksGgHnGbSLjGtFAnFli5N1ZCfMGEhok1Ssin7aVgvyuxDBMZbgQuOwskhKBBm95IZJojZ BQm9YGslhqQExxKwxo2BKUgZheEIJaQFkQYX+X72/l/L+lsX+hyv9NoRnX+EO0ar7Tad8rhf6aUf Jp2Q3CHggQWAHvEloUPNIImPsEdoYKLJ9+AZNHna/E6AnF5kACSa3nxzElOITeZ+n6gu6AlhQJsN iagGh1cItnYgCsOMA4hGbtQBB9v576mp0EIR5PHY/an7S3ftVNwkq2Vfw4XSay2yqtZyYVbrqbss LP4VUcunWlm6TCpg6iq7TyOnFW6rC2GGtKt7pN9l7v+G3XazZ07Q/2lowpMoMVMn9FzYri6AJY1N TguvHG0Ssty9itCmLPrXauGlWdN5WpNo6aPmulqkcGSbmxIgklMN0nPTZpumxGzV4vd31hhuWi6r Zhu0ouo7f4/eVWzY4ZZbJLSbpJPFjU2FUiRXLE1h+iPj9QWkNnxjhRaOXffrD3tRd65fFHKe22Eu E266aj2snx8+qsOk7u4u8bOsqMdppPOG7LGXLxphvyvylCjl8gw61rpJVZnSVC7TZyqj/n/qgi8K yFjJxwUMcwaiTIQYuk9yxyW4ucmTYmSOSpdNVRw1ZXvEUUPxbDLdv1324ZVZXcPWzpwfWnp03bOz Jhy2ZcvZOmXDW6nbTSkcquG6TK1kolQ9J9pRartw3raV1uXS6jDlwssw2bKNMnTDd8+cOsrb0349 esMuNMsvY6bPVHBZRwo668nPbvZZNlw2aYd8pXc8vXFnnDxrd0hB/rEQ7/hD/rmq/GnrZb1M39SK qJPHKz47Xs/UCOXr6s5XqlNp9cLON0/GnbDdZN0YbLNlSzVUpMvNfr9Tw7h1dV45SbrJRZ03fPFW mmXb1336q+oca8X64drvhymr6l8bVyjtZu2LJKpulvUk03+0RD6yw6eqtKMLqO1KOG7Jykw04bds Kv5QQgdvvzjFW7Lts6drR4lGXR8er+rrr3fjKSaqjYq3eeaUeoaZdOFF3Dlw+KpuVFF2WWHPPLpt bDmqbjkq2eWXesJvfxRNh9aacrJOVG7KzDyGFXdH9UEQgu+PsbOEstbLLJPu/x631lu9Qg+vG72a izlRNR64bvsc2pl9ibZVJR8Ubt2cV99q+L7Pjl1wsnw5fIvli522ZdOGVG54qym3bN8ptl2/NHrT hdtp+QIoswnxN8ZKR0o6dNnfZ3eiTd0u05VT/kiOdvbqO2GGyuLrNmzDvXvLhR4oy7dOF1fEnCpN N2u+/bniS6SblfbtRdZ0w9dsO9d+t2m7rrxRF/WFWU3i3aaizxy5ct28mybrwkCmT6FyGhMM/mee Pf+pGf4MuYsQ5VleCqCqp3TCV6jDDACKqAEcce9LdQQfEs4BCJECkSNqRBZdWyMKZNWwDG1pIKyN FTqc8dpgCCXkLNwkzc4roKMnyYQNvXBkZhBkeqdRzdl3ukPLs1gH29/i/FoZmPLoYlLYgep7Hqan coKeZ5WPMJkSw3sexhlixRLpJ2q4ZcLRfTZpvWzKz33x1HaaTLz1lyk6brGGOUmk+32EMJlP58N3 0z8hpD3MPWavd6Wj85+X3m8DGjD9qZY3r2ccAhIIZAQUBK4mgieyeA2OPIcgSmlyZI6kevr3L+VB mxc9iRAsZPcexqex7sGCZUXJUUc2kWbMONJuWF3W9nP9PsoCUpIbNmXjhN5u4bsLJOVnbps0urJ0 2i6iSr69aSTcFRtyhUkYkvgmXoXP3Fg7drWNuTJc1KqblrevULJYcKHR9e3VUWVi7d0rpdplZmjm NYdsrtl8MPXDrr6uw07q3Sy4besPV1Tlhuqo7cLt7vGIsu8SH7RB/yREX++29z7/fEm5yrl3qmca thNn4sznL14uq00k3aYf2n1rdiTtRss4abKrN1FLKrvrDlp1NZ+v1Z7HKJNcu1D2zdb5F3T/N527 evmGm7uTthK9lsujSqkuUpTXftu4morx6DJyBFgLFFYixEggIx/CAQDBkDKI+/unygAj5FtiaD2P Q9DDy5l2rPZ8jzCX8lDO2z19UVPi+/7X7ks7sty/f7xGlnrhy9btnrK0Vcv2u9VacJqOPErqTw+/ kohB2y/vOGT65cLP+5+zl2k6MGOe5csfhtFpIOCHCIOqcmIkERFOCZ48amhrL3tANNpvOY2r2f/C B8tRc3QhO6slB2ZX3T7MZK4zUZZjFD1gbAeEMASCkiIOqVADtM2as5wnRAqZwtWRAQfUhAUpOACv RmpBXjOY6CHZznSTszZuc6DuMTsIR0heaNPI2WZ5y3SKsOl004qonNWHJN/X+ulVu3jfbl23VstS aWH9zxzzRlysk5cKNGzD1lymoViruMMJxEG0mfDCy/URESh/kkCxjvBA4wEQOPvRJvOsB6wNo12X kh0ji5uvdmatXqT1md1AQDSTQRgRKYSBHEIrp/1Lr/vKPGBZjCSX7boEmIJeCZAu/ao6w9hzBsUP EeB60XMH0IUR9+ZHkJymK8wOsU+n6J6D7AXfx8kolTl1EvAb+4QPnKPo7cP1f1pQWHZ9pZ/IVjEV 0FQoZUKocO45/9ITsQqpIcyP2KPATmfp1AtB/OELOk3lyiGJ6Bf2HMX2Sx44ulDrcW829lXJ4l6A 48DooHI96KgQv9h3DQJbhDWTf9yS1FEkjmJqrtBfIuNAAX/Acwe0MXj2eeix59trsC8LywJQJQJb 7vdjzYAl/SgIFdZMMA/fowkneF+e0rAEyC4yMslCdFx4/ry9ebZs06QV4ohujqsCUIJhhQJugJ3W GtZDKZDCPkyGYiP6xDqi8iFV9q8zp9u+2cxchxxczaK6q71ikWxBCbrLNc7yxEQhER4Eyzsvx+OJ gCEgQnlyYotz/HYEIIYogmx/FiHWrR9l5bwhrmLI9tfuVNMxRxcnKOJZScrCE/8EoRFYzVx43/CG OnCSZDchawQz51QhxWnGXdZfZ+7bZIdk+E9+YQK2JR0IHMtDFz+Ht7/6G+r8+/p2jJZPzz2PiSV6 /tvOVLeXw+s9vh74Pwbhbjny1rSy0oRrRs1ZcFIgyWyxLZnxE+Q5sQyaZwa6PkvyN3Uwqo+pBbJK nz3YlCnrBSrAghO/o1asqkEkKDClwQz/bqSaRIWaQGcVLAg4v0/ssnu/kM8IOQDdD9qlcsgdW160 tA1QBIIkG6oVnTi1HGq0BXVkbw88GicmibOCQ2YBwCHBs7MINh1Wj2dUBo+l7L3GlGIdm8li4LAQ YELy8LGYEAVrMqKufkNnadm4sdJ0nbsDMex7z3kS4xg+FDIwo5P8hSJoUqlBTJ/SUMlXarls4adV SmsX2cOZNjuzdPMUbOS0E92yTZvy0o0tiTpus6ev+lENP6CNvfO1i42C5AlPgcyMSKDHDa8864a8 L4icPilCD5e855tHMKRptOOl/LX12PlCi+Xxt2op6Xi2mZ+v4djf5ddePc2duvb32+Pl4t7dzsbu Owp7HY7jEhz0Jnqe6gwdP71Yu/iOGxiO38Okmca005cN2ln9yzt05f9P/V20y/vcOGXx8YZUSXdK TVcqPG/jZ2qrxmV/mFFVnTSiWJ2tL44be+1VXVr2tSmHjxLTTv01zlw7YdJNPDftP1Xzxy69cxJw 2fE3L34q8eeLycMJsrvFEnqfH9iEZTbYPrDlV9Uct13C71Oex2k9s6DdD3tZy2ffu3a6ySeGfV3T CtVn144WKRsziPVcPFHqulKfWVubPqql3b4uqpp2mcNstnTxlsUcqpNM0advJnLZ2oz2m7ZXScOF mXfSmzZlNp5h8+dNJOnWX8H3ps+y7fWb99ddNHj/E2Zbru3Cz8v8UfXabddPiM/Vmzx7u4qw3y5Z TdNKuX126cuV8fL3V+MOPfLEX81p6Vft8j4ypFmz3FnL2nBZa7viMXPhG/whQk/L7Lrr8H4rloNh ziJjhTCi1w5YeTPwsYmnEepDRo+7fHZvNdJz2lF8L9n642rmt8U1u27eO+by5zN94Z85frWR58w5 v5Nw+3WL31PNtnVRrsOK8z6OW81avlxRdrSPNuoUfRZDK/kV9JYc3Fn56kdYVjKMCfpzzKMPKDk6 NhTRqd895QrzeX7ZQ28vVfTMtY7er9/Ku1fdb2ez+Wl+/leeaBI8eV9LnrPZYQ9W0xRPKXrHC1ks 5ejdtWjSbbL5dl9NdVtmfrmL38m2hzR4ey6b+Npzl5NLzgywv2rGKpvR97tbTykl4+q8ba1909JN fSpC8uuL9eUpUnvB/i3naBf01zWkvDN2y01GXmd/XDrKXqzY9sc3jxu2l/W728+09152nZ9dPGvu 8r/GfrvS8lhb3+kJ+lN8eak94EIM+H5hOkr6lDzND6/Xg+YufUPkQPeXHFuDkyBI+hMjMdpj/UQX w/wsHwMWCcpzlsYKhU+JImVJEhyiqr+m6y6aakUdxiVlna9H9KsJPriLKMsrLLNLEmzTplw5bMHb 1Jp3w5btnDdJ42XcOzN266O1HTYqePGVVmnVWqaeO8OX37KXTWkmzLls6VbOm+/Olfm7hUp49fjL l2uoy+qu1vj4k2dOHz6zxZrDhy05drOm6tr8vpKOGdnTtxFl3sZWVJBMwaljnnJZRbHkgUt7Gxk0 TJKSbm/BM60uk2XeqvjDdu1+OHq7du1q66zTZ+PiybfKjDKcZUcssrG67DuO3TMSd1omm0uWUZUe crKJrqquUlGGzhy5XZYYUZjxL5EHeWGzZXjLdpVKOzzCzOGHTd2ok2XbawtpVpukqxDpphZto855 V4lmPXbd/1CMbOTiSzxs7eJt3j82bqO3D+0d7W0m4i+mcLSx8YTZWZeqMOk10lSbZdw8Zfhlwx3L aODL10nZwmcsPv720nOrvztJy9bas8fV1ZKMssvWzpddu9KkyCkDY4KlDCIHqB3Pmvl9WZ/n4+EP gfl9O042+Vzd7YKjIAgFuOSAhBvoo1Tcf6f0mup89O7eXO+fP09I664SB10EOPPkpGDBtKgIkMdV XQMVRVxVFWFrF1eQiiLpc+Lq+ISB8kEGAENDBFUYMWRRYMYIyIMEUEQFgiSSAsIsBSgUgGp2up0D bQRdmSbC8GlvM5nxBcC+iMGMNKNYGIY3zbdn2UUpjo1gOZNMUHLPhWOmJeqAFwEQH9MIsIlx/EvG gCJLNPxJGyOwGUujZ0vIGKw5AvqKLPLutgeCEEnfi62tkDZ+HzzOOh+iBhDk8tZtO8AGESnVGZrI RCCd14sReilqTYvWtoycZEQ7Rkr3EECTj7F2TQYVQRVEVYEkSQGMYXW7u3DuObpDsKNJfjj2FjtL B2HR8SA5g+g5IU+n0bX6GZGDY1NiI5nBoUoLcqu7cGXXXii6yTlNy2aS5dsNZTUdf17ESJqfmcp6 TETl1VYnJcqaFzJUqLVkDJqTvEPoRIEWAoQRL0OPDI0GRwvM5hDSUYGsuN5sN57BXUL8IK9L4RFN RLD1cu+wh2quQJw5N2s3HKUXt9jfuIbzEyLZb5GHOUfGWn9TKb9pLpbOLLKrN1GW6yi7RyKevlY8 x3sfZSZJRTcLGpcuaG5oam8z4McE0mGGzNlU2zSyr33w/aEO3/wyh/BH+0iJIiJD/A/W6z8fw/H4 fj6z55c9fthNhRpZ+36S/aXDC6jTXTl+R40ksu/SuHrlJNVpu3du4m4ZafFlW0X+fP9s1YYfN+23 S2Tl76FUgWkULbHQiEbmRTI57zoQC5fcqeH9ZE+8R/LK5RT8elttiCgtNGZEKumSiQLKF0UNJQcl LqZkyFTSGBpprxvIFRNaZyRZGskIVPQNhyGzRMPD+HZWSH62/hsbmWhxzfK5n4Lhhe/VapjQ4Eug JG0xBLgNoJAS09te0yG54elYLuMxomXtKRhIAhKyAIWqZjfRGWBXClGFdjNSZDQd5Ig2L2jHEoAh REnVLjuxewMP7Dd+8fpPv2x8JPwjQghgXurmwlZn1gfMWC7sHpCjOhOcGrTjeC6Lbc3NHLl5yEWE 5KQJsiKwHBIsXYEMRKP9mH+SoLL5V80F9xi7rc/kdRzeBvN/WXdhCd3d3HcXnqI4nqNZwOeWCjff dau7mTpVy6MOlUm7p/nMy3dIECupYiOZKHPr38hlXsywVkVRRGTIjMeCRVifWvf6quq8x+b6+tbM ZSQQQLUYcULlJX14IHwjnK3RHvQQ7Gp5Dv8TtgoA55nY8ehMU9wrKqrwbMspP5WSm05fzcVf1uFW zuIvElDlRHhrvNB069ZRrOkclPJIC6bFIr+4E/qCFWcvW36fw/F1TBXPKz9O31+lGl193xhRd+4m 2bymo3JN37cWbtLOXXTZsy5sQUWoRIkxyJDnP8V9P5pBQf+oVfwf3LGTJ5zYUVXPX4aQiqzb4/Bq iGu55nmehA8g8iRA/wKXA9SUET2gWooqxPr9etNbmp6lj4f3ghBAE928F9ffSHi0sZ/D7a/f7Xzn 618vvf5fvnH5aVPT29to8Yp1p8Z/aHf5eqAIyIBgLzHWRscYf9TloCgUgB2PTCQEkiBFIoRQBFVh BYskBVVVVRYsABViICqEFFiIAjAWAsFFJIgqiCwYIhBAiJIJICjIgQj1YmhQ28NHId3d0nEdoKUn Rw+JE+Jc7xoMYPcUJngkXLFiRppIcyYND1FDBc+ZIYcwTFIn5JoUIMeZBUQDjxH/MSwoubvr/FZs 7dp299XWS8Smy8bN6MxsDamysDiIQ/L7JKICdKA4CvYTDSAZOaMIqRjAEiDcoPOCYF1x4+csCWgC QWHmFhb0yBLzNuH6HiBiAL5J9CYbUTMqcquJ1A9AJxCJe5wefhl6d+/p5r7fj8Db8fw88Y27/f00 l749ttZj+OL/Ol4bt19sz25p5oAkcE/Tv8htH7h7u9a+7fWyeZHzhEUObiazHkS6oAniMfdTFLeN TMNFj8/Zo6koQrtpZ6xziGZZbBtnW2mt2F/4oDiIDp5gNnIzyAiXe5VDpD5MEYkGwjL7+7HpCu6w dwCc3WH1eYQ0H6fn5FVVYVh485Cf2wQYCq52FHz++BQkwYA9gVhG/2BIGX8QSGa8+4HnNxoN5OBc XAl1z7P6ai7BuqZx2usMCQkkA+Nz0cbkV+tj+AIFw/8gV/A0Gox1HYAJinGae007KaarebCuKKFn nsAsfqYBPXEUjBlnWCM0CRS6K3BDBINKirELo5RVHRYOOyymcY0X7IoIamtDSlaDSQacKBM2hBRD pPr3ADqkjEDQfNDA6DOQDjDnuSlQOIKLEBjCLBkUkECKkTa7hGlNZxAoUXkSCDAIwYkSEJIApCAs CAwVBQWSIjBkIxiIsUH6aB487M4JiWCwwQHhEkBZKiqv2X7QuuC8Kr2vNeBdclpLeoDfTUOurPlk s6pUl2EMPLNBDxQhTWlYQ5GScWgLKo4m2U6P0R3zz3rVK+XOcGw2BhwJwIHW2LAOU1leLakQsDD+ +YAMskUEWA3a9EP9mjaWY7miwb/K9BCRkWKAPkEkshwimc73PBuQ4Bw9bRJIpB0FI2yoxMcCzLjO UWQW2tFcoiHQieU0oyIuMu9kPq26Ix0l/Q6iBrP6q3Bo58rZiQQR1MBNxzgnUhzvfJOvrd+0Dan8 TIMWPLDMWn5Vm/ONHhw4uggG4bV13UJcbCIU4Q2ccxxuS7BKOXAUkEeQgJ9g+CyUyAR5ANc/eWIo wUBTzP5yC/Olj3/GveTjmstAMIf/LX+AHOar/Wa5v6JgmWQzals9kP/phBm1WcKnjECOuLwI3U34 3b/5hCERBygHLzT8RwXZemMV1AxISQgdFJRi0YiB2MxkBUYkihBwEGfkS0JxwHeGqJIKkIHNuq0W RFEAEZCACwVEUixEggDBEGCoIkGQFSecoUhCINLJSFn0RmDDAqTN6ya8QCd6JmgAoe+Q+8QbghMy DmtEhRIbJDrySegQTAh6wq4uOLpaOMx6bXWExMihoIgRiEQikgwIIwuRC7SKDXZ3/4k/S4QOUcA3 CRaIZjUL5gcEJCQNWcx7TP8QU/EB4w0D7zNz2KGIQeUkL+sgC7s/OH4fceo3GgRyOk8eUBPMEuPX pdUtrgqAncG8Lg2hB6A+8UKMH5Ip0aveR4pBEwDXQd6PuKAmIiOiHmfwpKih7599wCEAP5giW0ez 2zO1UngOod8aIG0h7DvESHSgN50InUQ4yIVBgCQToYoIdVmkJIWEQRhAoSbv+TCwxCFGJq45AEhC XVdYkbWwFF/Xq8f17y36WqjRiX/sMctmOWr9U++MQMbaIH3GP53VFwIIUEmIgiV6iffgwQMmF8Sx bFGX/dfWWWmW8bJNjOHyrhJw2N80YuXKFRkgV4FPT/FQodgsZLCnY2GuZzsVsydrPHDSzx02brt0 km6u6z12s5XPBg2NmNQq6uaFDQ2NBhgk85tKhB4reeq7PrXV9Yt5vm06Vw86xVpqqx23ThJJZ0qy xHKtelmsqsMUbNk1FenSrphNyndzM6UfPnbttZHKrhy2buk3c7NNOpI/8Mz3G3uK+0byLNjrKVU8 5zKuJLJ7pduuFctnxJbdMxZum3SbOe0mlklFGxsik9tmxerlPxZdm5Vd0k6UTVbtlMJKOWHThzHX XbdtERH84hEP62sdM8O6OFr6VSVdJw7le7xhJkzqijaUuaH5+bnjH36bdHbpU+slHE/XiSTZO7C7 1ZNv4q5VcuuKKpm/Ci6ienqU+U2TddyVNOH9BD+1rzLW7hXa8/W/D16k8bO3L1JMsy5VWcbpSbqR wwoj5N2cuElfjf7Tx25eKNklGHjhvVz6st/ulDZLZ4kddWculi+8pfGlm5Jhw5U6YevjKbldp8+H T9OuWp6YYUZiq/LTn580wklFvG29Ulm7hVJxl0rwsmyw7e7qLvlFWW6ZRhVuu8bMqXfMussqOY0o 3NNl3aZhx+sbsaN3irhfhM0jLYq8VbNE3LCyq7LrDZ2pftNZwpl0qm33acNPFVWFkmzOFE8UbNqM uTppykoyukrl/WhDvphu/3f6R1768fFXDSd+XpcrZdRw5YUO49+LczfHvLLk/X65YZYWtjDsjTSa frxV6u55eIhs9aa2TTSabunjqjdu6YV8bMrqbJtok3dktNNN2Gz1hq2Fl2WHanblWqIi/jtdRdsx y7cx0unlaa7lfvSVGjdu2dWdSUdMvfZtnC6jTlsq5eJMm7kw6S64ok3eOS7ln1uy2b1bJSbNcv7h /zkN6zi6bLKi1Y7+tXUbuzjtlNum7drsOGyqslGtnFS67lZ9+2bOnXDhZn6k5eKrsfU9HairCTLT u1nD1sozymUa3VcfLpRJJJpp6+FvtHuzGXGrg963f43AdXeJs4bzYWM5rpvnAwLz6fElX5J0m+v2 0/ai7hJho4XbJbKrMP3Q/h/P+fe6xNu8ZVZeNaq078cwR6oxihMoQhIqXPWZofoiggfr3OjgoWoE 9zc/FP6sMftZIte3+hY/vAUj/2jCSEhx6FM4cxOY6RiBtA9fIY9TuepUqL4J3LhcYmSDwZ9cESZu y3UScNnD/Yhm6cQyq6cpv5cP5tLKu+92mE3/jQp2q3LPGzfDBN68f1+E396P/Ax+pOHmyjT9N31X M3STlZl/fZlu7btPGl36s5fFnTZsmy0y+Zws3Y/4sOGz8KSXPN1tJPZquKqJqquGnD5smzd0kqw0 3UXiDZ/4Gv59JxVLtl/Lrp9cvrts8bHjzLSrphss2SSXKvimXTJVx+Pqy6bmznq73t/X2ujZxN8+ aZdpOFFHnqUaeK5lf0wmkwND85gG7ENRkePMqi6y4oKIImvmB7vCRTvMl2LnBrzWvWpI5DcgeF7C tEmZJEi99TLpWvDBJs3iIMNOWmz8JKO3aaslln7VZetuG7lu9bM3cYTYUciED3hVpRZ05N2U3vtH Cyzlhsk6q5ZLeZdqloQIm5sVKFzeFChAoXRElNYfom+ZqoCqefg+okyI/w/Dm7CaEhR4ZKdd+/L6 nJQ3Oi5E7lrXUXfp2x+012c6cO3PDplQo4WeR/DTCIjVibqTDD5Hirh/2oI9Y9czibps+Fo8Ydqq MKHz5VRs/QhA9eJFH+6unLxhiZjeWN/9eBCsAT2VwD+z0GqwiHvHOJ1gv4JE4DrHcidnt8Br+MoD 5oKPgLbPp9FRVsCJwQHeUB96oq4HL7ZPvvVFX0rEsew8CEL7GcV5k2lhyl5XuHz4w5lH71D4Hh4C Z3P/MIa6li0kP6y4U+Iz7Yof2ihYRiF0uIlxF+yKyNoiB3QH6lSqIKGEBcxQHPDh9nLwFN4BzHSO 64A70Uc3xz6ULGtElJFBZBTiKohMvXC3U3deopAlq7JPEAmYiKib8wh7BDnQTYRFkrKOakKDzQq6 +XInfIEhNCoMADnZuLRX4Oy65QP8W4aVvQdRY65tPsHMcj1oOvZNR4gCfQ9wrsBLgBOVAfHmE8j5 9oPkAWATjCkNJ9r1iZAnn/Fr9Efkh6g60wLGCeClYDEVMBqBRPkz8TJg1mmLJBFyklIsBPxE0JPp pPpMJJIEm9/p5mKAvxQESgwFQBYpCRYEWE08swGE5YiAFAXVJIQxBLJT1I8QA/kGlU3Bk9Qkh2gf me8bDzD5gch2OSrY6jp2vEXtUVAKSSSL9bfogEQoGms9+GBgMUjFXLVD4d/fiCXPK/eD2lkN/uVc 9x1HPaEhILmIq7YIWhaFAVQKiEGhDVm8fZgjYDUCYWRJJJxIiYGXuH2w9/pf+NvZHywHwMOCRTUI 61R7E2vlNm3kHrGh/GKr9oHMJQg5ZfKWnvAJXMENRsP0APEDfcHqPIQ9APeOcDN6nyY3nrMTUqpi E9oARE/QgHSXKJ8DRkHGBo0y44bRdJoOs3CfvHjFiqwOQVfgO19LgHcgeyXMUDiSGJAgpAQU5iXR WxGiEjTGUFdarzh3ih8C86lT57gKO8MwHwUU9RsBdsT5jzJS+KDcdnpPhAvjmLgVKKIEkgJUtSKw m5DDEFE20iMiJP7/70FmcEgGiRAJsQIkEYQwj1Df9ER/qj6Rn5gYjygcRgP2Kh624AsPg5lDgZwX vCI9G1E0Hj7h38ZEhtlMrKxaEeNQiUomFowiUaBq1UVRCIWhKBcbWSLABECrCveJ5YMcJaS4/KJI oSZz/v2Tkih5eyikSfpLURXUqfsMxWSQ0B4xBvFS3qdaq+gHwEDgIhr5VVM95p3dx8aoPTYcAgJA GCr+6KAEgiFRRJAYxAYCoK8+hgUIou5XN+tCGYJB+ugbEbCyAGGIibGgfmiiIMEGwhSH1hrH6/2p uAHEAn9vCR2jcEVHOBLelBnvK3dphkwS8L/cd50geZ2DxD6h6x6Ec4poDaaT48zykgfkVCN51UPK HIalHMhyRgCQF6cIIQg/8HUBYh90TPA2XRE3gp7mgPag7uMT6mr7IqdAnALwX1lyD9PqBoTWCece KBhygzdc3QtPsFSXBdhJsIfcUDmGB9afMkT7U2J8gWJuTxIanyfNgSVrh+MkWoBeonRoPwQ8H9Cp HCFf/W6rBR7y+y6AdIMFk/9wh5/J445pOeUREYxjEEGMYMFX4FVRQUESJJjjeeepIhEkXE5X2nb8 z1AfcGAFKKfDwPtD1APeBp/BziJ4AaBu6wQEHiEPuQGPMMYP/sMgM0B35SMP4HHQEaED1GgeCA6v xGtXtHyPL8wcg5BTJGyKgfAeVAeo/Eh8D8wNXYUJsOT3cREB/gQ2FbSk/aNUohtI/SqLCX/bEPEM ATBLgViLL+FKha0Nwp5DR10+bGTyPja0l16GUZ1lO7+wAkM4atP58EB6NKHOw1ezZa1FFcUW6Fiq aunkfTbq3DoRLxygtoCyJYBIgJJASrRshYEAV8SCciDDvQGYGkxiqgBZEQ/KJzQUuRCChvRDQQRD RxglnjLzOeB/nymtAfrmBMjt4TRMRFEXP0psBIL1T+oKwQsKKZshr6kbD/mQIRS4tDnoiA14EkPH +R/h/FFT/9KFYsFSP+VNJiVxlyy/4JmtVRG2GhgLjm9TJoo2trdZlqxKtaQMRTEC+IsisD/vFA5T tEr011igiBqenGUhaJYPASA5wDEE+omAJhxgIPwVYv9kuhBGCQWSEIgQOTkH5Krj50lAJGB6gAdp 1fdQcr+yjki+1mDsE8bZk4wPPgPaYi/YeKbi6JQgRU+Z7slXjIKwiZKqoeURAAkbmKirgVGSUWP4 2sSfL2olZzAaAxVBntq41BsB/gJsUHBD9saGERSoiD3nlCNcaLzwiR959PUg23fPbb/VmaAFrqBb hqZPiTADgw9Vct+ksroMOIfi64A4Yc/T/toEOb1gghk8TATDmEUQ5wsdJLwgJegcZyaYW3Oy0sV4 +wfWP10NgPXdx8tcJSXydF7cacLHrKJRLo1wr7fpd54GjQaIkidWgvzy94OMYRMouCLIXqFkSJSi zIi+h/+JBOlMxDyz6deERyTgIoi4g6SQJCECDCK+oA7DgeUP6V/daCfvcMVaUalotSlUUp8rmSls GLf7MuFUoMGRQHCWkZET1ZpcJULBoynGXARlkjRjQS1Y0aqxkYoqtELUKWpaloLKVFiq2krbRs2z P1JpUb8pC4PeJFL2SvvzfGqLyRSGblsf2QH+SA+KA7w+IH17c7A9ajTqNRCHAMDpNa+EUgQQIiSK EkYBFCCADAIxVIqRUVYCjEBgEiAHMO0yMihP5OBpPViqGkMGPeGTTq0WNEJCTCVNus2HHyDv+wP7 56qAoIwOhgUiAiAxgpK6LFfFq43ieITZh4FAnIBGRFIyQCCrBjEGTS+st1t0CfyhTadVjuO4q4kI Q5s2vYkkCKbTj8z9widvoCc3YigQ6OxUUDn/KDAf28jFFBGEgoqKIIkFVRWILBIxWRBEZGEUBUYC iQiCiiMRRRUm8UIfQLUeBq+23sM4CWtnzd0qHGCS6k+yAp+S3PEEKKMLiCPgX0+cpmFcniCbXSCf L8FCrQNEccUH+P2ol1gThWx3gRc1xXFmz7LEEHoE9eQJi8LUKap+4Hca0wQA1ZUtJCNurJEhKrmM wJgIG0ExPqFbj+Ie5/maVcgPAD2q7zZqBPqHS7jKsQIBZjIIRUVYJACzYpCuQ4g93GJnROPq+f+5 9eKr/QUKipf62aupDfHAGb2KUoodA8Zd/TjUOhR8TiNqHMaQNoaANIcw8Q7wOpA/WCbgOsOk4lOS h9P4/yHSIh2omJyFI/Q40M/hmFcTkAbgTksg85k8ZY9ms7A6g5AAu7hpHpOA7uCJkPqOJU4KuRxB 1GfUo95wHaL2HYeChlY8EeIDwB5B4GfoDzRMgXvCyGoosJqOQzB39SOwvMAPYh1Ap3HX1G6dcIRL EuAuUrngcg9YcNlVREqqSiA0FxQJBMVg8+sARbnpLkB3D0LgKdTz8obTQA8Yr3neA9ZdzoqBzhxA 82xDiENA4idQtHLJvqqYpAjTE6LBQSJLVzgdF10qEKo40WQXnP8n1DnNAPIoaTmBd43D5KGrUkUM xiXgQ1NwMYOlYJsv9b9f4fNUzIDfkmJmTSjgP7XfVRvUNoBwETuA8QzF4Hobfw4twiiL7E6RAvPU axFEM/3iImYzARaUhQEWkSFKiwUWhUhQEWhIUwoiUjCgJYCBYCUgDACkIlBYo0oQoI0kKWDQkKEi FKQpGFASgMlgJRsEoDJQEoRkLCJQGSyJQGSkSwQsIlJGEsIlgIFkEsBAoRLAiBLJBLIkpBKDLIlg hQEsEKAlIMCwiUkYSyRKAyUglgIFkglkiSWQSxKRLICQKRLQpaFKNglGwSjYJYlglGglFiNCQpSC UsKCNDChYjQsKUIIUhCkYDQQpYNfmgPIbEH3KGgahkiWIPX7DWdIobNvGJ1PcBnr3PcNw6TzO0Cn WOKeaKgbUe5AuG8G9H3J3o8YKEHSZ8rt5cd4Jc9ndoxZ36OOj8LctisEknZ4SIQYoWWwLUpQkiRQ UMEKh4QNMAFiIApfInmkXU0yRJCEJF0Q1GorVffl4Al4VNFPw+HrjVYhJ9BOYhQ9vPWdXJqYaMA0 GjBIyVDswsQOouENgxhtjcksA5AgOZV7BNjiPMAe4UMxj7XUIHMdo/AD4gBioKh2KuI0Qm9Ae8Ts NRpQHORAcOgAoQHvDuV4+w4qKpvx5+c1wnNXbcmYFwRKIUKlZFKsGNgT3XBdbMB8OhvHEU0FLScH FmGaLzoPMQsDdDVC86PsPB/uqEOQ4J9M/eqDGCQEFQioqkgyRVSIJBQWEiyQGSFrH9IoIbE9+woE 0Ur2nATi2mwVh4kNIGNeoFzEtQjzg02LANCsGKMDeStYMGxyLjeamkCh+cfy+Gqh9QQaskAgMDCh QOEVM5ELKCgavHO98AqWhIOV4SMkwS8KW3oXXBYq4pUVYJntmmGc18jBGEFw1gpgm6GdgEIyFEWD TAJZ75yrUQJJIWpuCIEcqqwsilxBIDLdNH9f39oYzUlQk7zSUa949pusDpAJt2oDx+z+vWPXwBB1 HOOcFKBOUecikikZACAgFDhcCQxmvt4WM95Rx2BK6bvluaiyrqMZR+VSSf86k0fUoYiRJg9FUZrI /5Wn5LWnx+WP249vBUeVgsId4AcgFJ1nN7RTmUS/rBMMwJGgVlHHZhB/VAbrWKC4AsCNOggRjUYr GCQoLkBpk+B0CZxP2n7DUXBA5vQA7w7REtzsI++vWJ6kLoj+k3Sn5ALBAlIfdDRMc1f5XImvy3b4 +YFrGJVGQpd15SptQdocYJiJ7Z+wYyJYnvAh1wH6Y57zgRZANwOEERUiAexHAwWx8/cHzPeJQn0H AQxB+Dkop4lx+e+YQQgSySiokSCIpDJAoCPxHNT9PUAFY7UBsLU7DSqCF6nL8jCtwnsF8OdROLI9 I+YG9ByE5jQew0s4qrkosHxLrIHziKdolihGRSeZnAvuOk16gRPKows+SBC/6Mp9rKaAOOVGCqR0 XkO0ori+G4pIVuHMC7EIGGJC4usMYDQUWC7OGckIMh0mYHMdA3nWdAr2dOHIAaB5luURXIVziewc xeDgYKvcDvwBS5cUU/AO87fnyCcg8mXV2UibETnUoW8AaFoDpxbZBR2KHUcw/9sIZj1/SUoUpZBj FX8wfqCcB4O8H9QoKKKKiMhIatvttkIBIIJDAiEjNhQ4IZjS2xgdxoB06BOs94iG9zSB0MKFohJE EQ/J/egixPTNQGKJAgAqiKQh/5pHdDDDpCqsGwPn+/YPKMH/qX/mzjjzYYWtC1tukE86Q5NxzAmx KiGb6IDZAa/2Pt3QOg2BzGKAxRT1gG0XWC8mKp60SJ6CJChgKavdtyeNgScmvAkPKHUY7G20mGMo bPtEYdccuZAfK32HwN5+gjmPmJ5gUHH+XEIcpAXEGCr/owB9YH1A6jLo6OQ7ICWtJJzYKDyQinRz 9R35gHAfECBRJGCQ8THoViA8YvIKWxvhTTQMIhGEWPOCmYBEDiuVOCGcE6Q5CNgICZi5t837Abzt RIGWx4ixV1JxBwPMrc6T1HUIHaAfcBh0dMJPboDS9SpEHjD4BknxAg/hAx+ob9TxA8Q+0Heidir5 KnPt6iT8TvKTTIGqB5GGYB+lJchIqP24G2EXMNRyqMmguplhlmhlMumUzWBETR/JCoUkpsQmRurM ZKUo2MjYBbSjQgmbaGkpWSGBBpbTJJEzLnPSApFivGpuMGJsEWcMkOdS6dPwMqQTy5sAaqyXAQQf CCNxDGJdliQo2GBqAIFSwYgk8tRTIBLYChxbzSAnAcw4Cbh7hQ8QsGkUPQTacDqEDzXEHyNAB7+g FKN7wK4cd1i4lqs78aL+fk50OpYQWQgAJYyhB4vyZM3LQVSkjfErnRuKX9o01A6C8E+NY2EWh/H6 Xy6uzqBQLz47zUB3C4wN/xRBnBIfiZwvGKyDrIuUBLVtNTohu+amJou/C6xffhUVFWTA914dMA8w vvw9VP5+0vpmtQ9Qj7gU2h0AnSHzE1hjOXuSmgQfABtcqCFwR/2scwWBMDgOkUCgxYpdBzFsbAJq Bb0EQPiJERvb+kgVIQBOAVTIbyk7olKxA1KZUSIUgsomyyBRUg2ZYiiSjs8iHLKvLyIM9qrciAZd iAl1qE6i6wJcwXDlT3QLQ+IfaT7SnEAmj7VVVT8laVdQNwGQRLXEfD41mB2xDUgBn1J9ssbAT5FH hqDWEBQQQfXz/kIKfg5E9xqwPfqkttZ8BQt/tT/nY5A+7ALF9iga3O9BR39QQGAsgIxBaRIqvUKQ g1VG+NEHuD7VEsLYvErsKPWHDnBKQG/oG14YXaAkglo2BIZeYJAT1j8hENSJhgEJmUKBaEURZxcX UAWDPPtUTSBv8wDl+wD2n7YI/sRMQYIREgQRXWpvggW0AyAUNn2y8dgcR6iom6VCEidZAqBUlUw9 CgkXACX44BcOF+kb9+1VbghEAz86fWxnrlNUV1ailwn4xkfsRPqdgPWC61Eo50OMA2gGRNG0jUQb iqUyke8o/YfidobC5wgZgr+ZahyBWggJDOdPMxRSc2GCYIgOFEoq+zQRQAjBFirAikhESQQnAjGS LBsjSACrCyDVZGAIQWGRRlUYAjANWwhJAokxgMg5ZoJ97FIIjCEjBgsIhES9Gxet8JajwPeHSPvK MyXoiEwU+9ALEVIrIQIBBjMwUiZlJCIKIUCdioYfYOcvOoFmwxUdeMJoighNgDzFgecHDIgCQEe8 Y9RBfIfvM/q7hN6D6jQB9uc4V3UB0IDEDlgyBCB1VXD/nQjaKuNGSFD/kQuPS/2UFVSZItEIR5aP uNDkNwwUoo0mgD6opgGgA5TeG0MAPIOkQPvMjo/AW4AMVVN6PQJ16AXpAzegibfYdIGBQ8FHkXuD lF6iEiV1XCDciELItm4vYBzF7XF0lEj0GAGv+hATAT/cPceT2nnQcajiB2mSDWkNwwWhwbkzsGHy usHE8YJpmyMf6rYzEOJCIkfsUcUMbgyj/mHzNvYI4gFYxbEPtvyNCA3sEF80MQLKltwF/nb7uIuN 4CeICfQ6VOSBIhGSEUgxiwWEEggLBiRjFQFhCQS940KQsQbCrBX2PIbgU1ICHXvD3/0GEmAcAyA6 zWA+xUyA4HIvhtOgsgVEBYv73g2w/X0PHZebh8gJvdD3oDcf0WQYJgq9InQg4ABtI7KGoAPMH3wk R/peYkgdB71FLOIhFbxiCyKvcfjKBixRM0wCfUDCLIdFlJ2MJkFIwEuBJtgeEFQogwgEIAKiC9nd AcBnQHAYOWKiH3K2Zj/YypscOBmIqQIU3hcxXLoQHLYrnCAIEACIEhBMQTVPsE0GQezpzBtc5nRj AIkZIQiEVisGCQGIRFPoNxkORduqRRKjuSUqA8scmCRYyGH0E8hHkMhHzXigxhE+CAtoeGqMAgwS 3deYQYRD4a+SevuvH1jyWEhEPUCXAnuOW8n9UzUfv/vsIPtfVDfnBMW//HSvWwqm56Z/GaYIGt+Z Wf9v39yp8zwBKBOcuHiMgT4qnyT6BrbamBBFCT7/5hDDJAhqcF4SmwhSQ2zCrrNwDjf7gMLDe8/v AMRIpBuhFAUOAAeIJfh8gHPBb/aa5IMkOOvZRgJEQZB2UAihIkEgyIQIqSBIMatZEPYoAK5Alj8y ltMF6+vRjA3qFN4aqkJIEQGDEQIxV2JpFIbUAw1UhtFM7InoQoSpaBTaj61mBLRVM4xHiyQGRQGQ h4nMPGZdDriZw2DzsFoLw7iBGJJCLuP+Z3qG8VuvIfgCXBXC7+BkJ6dFFgYiRT6t22ynC5aMAG86 RcE3mWQHKh8gT/gE5z6qOfaI9kP8jOmk+QTsASHSPSQjJCQjAhBgBQ8usE7T1CjciaATre4lj1no fLlE9AJISIdIalQxBPoGcD1HBn7apUMVedtb0PvAzAo/QWfoInvQcTN+3W7kugu+J890MbYZPFJT MC2bMB+v75CI43nURubFZ3PBklX2X/GfWFx5FA+UTVFx5aK/Lx+v/K/ZMVh80qFRRRWIa0UA0G9G 8c6FAXLmIoHDeTTpyvrmlVUqoJmgjQ2GG8MTEsYmJbEuxg0UX4uHGEI9xxtlV7WnN2HAe8HiMRSw 6T94oHBdqEHuFOL9hzlA/A2jq5i4E0beVU5M1q3mBIRXjtQC7wiqqrnHfiDwVlFusrTrCl2SJQ8J cQuAxYAhxx1n3GgplkokZIB59+OIWdIRTgi8yJzlPGM6g4ui95F0kmKlplSTELg2AZHOXGSdpoUA /14jD80BvpUVaQUQgf1SQnIegX/7XHFKhyxuTSA8tRlth2gXF3SIhmD948gKc9hOgzH9P2Tyzjzf 22B1NuxDOhqARA0Ab0LAkEtF5xgVA3dRoC7AEiJeiOGk0mohGCVCeus8LJRPuBv87R/nfu4RgqIj GpShaKxX/ktFP+K2LzqvicYfSH1AhnHiYBoBkGILsnmlmRBUEP6DnXEqSsWeueiZXnnfNt3J2mNV /ZpNEmlbywSzCVNZSA47zjAOdHH0Hn1gdIqZnYR386Hjs/yNCl9gDkkYQnFaUnPDiJY+QVuXxfWj +9FQOQcnj2gm7NSB8TlKBLnB4fXmci5AHIDmRhnFaAxBOY6fgZBzPippgkIBRvBOfFEw5Whq+BQx NgZwgbhXSyvyP2IbQAxzZBRATN02M89Rg1I8DvpFe1AcqFMxtGoOIHcUWEulEjB7Zmu0NiCVJQU7 DadB9vlicMxvx+pM7dSe1ClCok/l53qp2HTh3cW17gPxPo/8hL+tUICbhOfoLHH3aOQcw8h+B96j vB9B5iwByeaJFTO3iUInAMgwLgEx9PYq8Xw8yugP5EHnPoKeZzhxjnROQUNQAf14xDyCAdxzAvj9 5+fEA9ge8FCxY6QE2moTk43ADIR1DzLnB2IwdA9R+9MRPDUJwEOVDPnuE60GmCfmPyExDcfimBoS D1nKK2TSAGoot6w0jzqJ9FHSfoFx6gLF6nOChqB5BDQA9QnKPeukTYGvwT1x0AqIV9ognKoAKyIw RQiK29RPWoQfE6hzBnPrr2YtVXQdh5ngXYAkBMIlMjCCAfkQAERFYpJFBIkURAVBBAUUEIyIyCsk YEYKRZAjGEUFjJEEBKTzGsy2KskggIxiL9NCFQQisgQRERVkIZRpYHlCDjDEiyCySKQgiKnEpPHi KKHhlgqCoCh4tIKhlzibGIwVBBE8SwPCB2LSjmnJoSL8aWVfooHyn3Kh6QP2mxD/bf2fwvXb5pBQ +KIyCiIREiJBIf7ZYWEboDCCZ2Q3m5I7qWpDfCpCRCECMkIkntEuB5EL1VMaOZrUBrBe0AuR7gPY oYID4gviXFwLB7BTsEMgDn0imsTPeybgaTVEN8DZCEWTE3dYpUNT7WUuswURRDQkmo4JbSA/bQIC JjRD7h0k2ydSBNyxkhooWaLChiNIMggoiIwUizknNAiPAaop1E2IEWENnLKE+378ULQRRDPSK584 qwP2oD8kBv7T4eVg0gm7OqaAAipctAleNijQRN4PqARTlA9DeZsxIIGKDATJUwIolwEQg6Aoe8MJ N60EMQgyOUIWEMSg1mEyAH3fl+v8tEVVltBVVmMW4UqKqP5TfzYvPQQsgT5xkIT42e2Gws1GzUkJ BZvBfwuLeNV9qGpCyvwIt0n5dslKmk2J0wRcDa1LtsJLWKJfdx3aPxzZ9E67KSImHcAnzBKqhOXN zc+CgchkdKgfOmTXI+81jsGLJx83F92VRxmUk+sDEMxmOouvPML74x2G7fu382d0x56rsOwqHQBg dIBUQHqIiIgXliB+zkzFoMI/EooHoIBEZpMrghr7H6jA/DQtP8CAYwDkH/o9Q1nXIsPtcDt1vHZP 3gyi8bYpwX/XmbNzgdGmt4ozbNGDRf/nN6KhSx2Hg5Njg+t2cJ1LF8Mqcc4ZvCYCWZ/s71yddCW/ 5tFmqjV1hgc9FWlO5TEr1c06s722kQi6XBA2A1CrjiED5CnvFr8FaQOkEVBiOBcHv75Oe1Tom4ge aoOeg6lQM0CmQwTaSLFIoKD8af7EMZDjaXqAPkgNCIga4Xn1Ozb60VAoX5ED9h8wfYgoK+QXB5G8 uPcXCEPkA4Jhdu0AJrnWmzONkwcYLt9oCX/th1GGNnTSUGnMFvfX0Bb5eli3BE3B+Rou0EgLFT8g NGmQD8FWaiDowBUIg/lBS0AYEhGCRkUiAxEgyCiSJIH8wlJZBUUJFRhAS4EzaFDgaucAxcaDiVUr iP8GHPiftQbPUbh66kq89mWGpgCUQE/MwU8lA/Cfh3YYwQclU5u2xc1+ZhVP+RN4J5++/IEyRIRI sIMVijCEZIBrXoB/MgHUmcB+DQJq6z1msH/nNUXMCY1O0pYxk2SMBUjA+58Po8DAKxSFkIiRkPvC S0i/iR3Q70jKJls0F1JFYAQBDtAvViNF90FaqUSilP1IYkfhrImSp+2QkKUclgEWoAhCaq1vHHPg NM6z9gdRYDaIqXx4jQg3RhnEA6vQBuLxD3iBBcQAwkQGDcRgVJPsAbAIxQjAJ7Gskwtbavdcd1TT sWRERz0gOfAfnRezDEgQ/2ghB6S+LDc+l8fsKHRgURZtozrXGvsephya1t0t5kDEi7E8j9JgHv0E 9wkNiIMAOkgfiSTDvdwhtnJ5TfjYQ2PFxLgbwzlkhNC9pxcYi9LXIcEJXRYhZOTGKznRsIOM4Eem yCFDyhDQQ1or4mG+tb8+8IiLEMW8zG91r1nSCZMhNvTOcPu8WzbKqHeB6UZt4R2k4xd6jTsxjQ34 +NYQQaJDEyG/UsILCA37A9oIQrbQujANEwNMVTWKkSLl5ljI4CnUmIFNTx/EemAxvTSGYO2Ehhpk A437wIbQkmYYSG0JSh4578HXqlMa9MTx0I4QNGxJwaJ0JOCdBwYdEkPB2UxgeIIy1awoItSMprx5 6xNCZ3d85hMtxmZSVbZypBMYtbUlJCYQTYhhDYcBwQmgYATpFhANCEDk2xGRcgeheDvo+vweDoFh 8FDWUHMfuH3AUOGkOkALH8BOIsKB2jiEAyE3LnOgOlFN2a/a0u9BiXY8e1XrKqJSImKk4DMUJHyD KMD0tEJ29K7kGYd5EBzWXFfpbkydrRd3ZGz+FrskAwmL/+P+wwNSYR/KVRzWG5G0IOKSkgu1pNjM j1D4eZwgAabWDA2Dc68RBj2BXib0GFyp2nuwEH+fquNBNQQ/dNSA2ig7xOrRpNpC3+KZD+yRCsCl aHqq3UTEQqQlfGGzrYyQmFsEdIYwDMRp5R13QXPocnAzkiq9wh/ma/XWaE+ZUtK8P02IbIQr3Y/2 hGOcwvLHw5ZhZjHsMOJyaIMCqqUNCHtUQqkk1tZrRifrV12NSInKlg5CswJqfzAVVWKq+8tFioqK etWqVolKUkkkhLhc1tZJIMDlETJ8EA9yjq/5c52k5wX6A6lPN6dhaBECAEgQjGMgJCCIRIMPeAeb JBYKAKLBYLBSERBSRSLFgCyCwRgLABEWRQIskihIoSLCAosVYKQEZCKSIwFkgsRAWMRJAIRQkGRC RTkVFXbfncUTGzcJfx0C3AWor2Q7B2hk4ZGNIC9xvUUw2pydYWSSAOZAYCRAYlUAiBXiQ6HPKBL7 BnUVX7/xYF1UWLg/SByjs0TwP7hotIkiczopPJGgTYeaiJIhGAoSCgKCkWRQIsAWKAsBSLIsUiyC wUFikiwFILCCgLBSKRZBYRQFIKLFIKCixYsWKKAsFBQiyKSKmNv5RGEUhAkEMSDcCaK/XiAoHQAE PgopOb5BzZdR/uZBPyFDd6hw+HufWwJAjGyd47FQ12hPdD8j5o0AlCQdY/mbzxPWL3g4HhtLWBP5 g6tgHLdQxzSCQfVPwE/4FVBbgSID9h2nIOw8Yic1oAQAuCqQRTgHTtAftVfM2iJeCJCAICKSCqCy DGMRjGLYJ9wIH6pqlICAiBoOZN4C7ayQhomNUQp31Ul0pwCrDat/doHgGpMycluASDjVnyHBQYFF ODkoHgg8G8PieR/AZIjqLvGNrJWpIlJFGJJBaGhGkhoQhWAYRlRBn/e4aQk1uysgYhC6PYwBSEMR Q0lJpoMtGUIykgMqCe5sURRjJWLKmkmZREISRQQQggorAUA4UQJQQRSRSKiDGAwWFsqyCICCSlCF fxyaMcOEizEOLmQusMLp0caDW8M1KgbYBIs5JEkODUs0mtkkpjNlJMA2XUKkdkGn1zjMTTQeDg0u 53UhsjigOi+p5XGJpA3JvSJC7AJ2F5zkLnOWHgfuU7SIl+QaFCbNobBt4TSfE1X4JAA1kCoISOYV 3xKHgIhQJpE7BFEN7W9po+Za1unZDdQSLcXkGMBYiaaii7EaUBjNY3H6TInpd+AsW44vLFksAl5u tsR0nJYIAmLN9nSjPSQjIShyeECedSho2MUUVSk4wKFIiWNAUbav3cvFh8D9B3HQjSLedGvV+Zzl rZ9bLlRMkdcdVgH46u3uOL4IfL0HqLsOPZz6ec+WYsrLzSbYXxYGRoMIFQCLStNPzSaEh6sD4JOU gaZMHOutKr0f00wKG7pw7NGBjBY40gmmAFoGXcCWLix7NRfGqJzPMIYb9C+QmRRCvHB/ZTwaNQee JcDqhSEE6EtpNBC1RQ2MOHP4WdM5E0MDzCDRmJ5BDLyKk8kMQmnYwqA0zII9sh4NZneFnkwSvYm4 Q76k4UnnZQ5eHxohQ0DKxEVQiCTyLYF6s0chCkPHFJoPGGRjJ0FqzzSiCkFgs8WwnE8zM6d4WcpP CGCHfV6d/tzQcLzzkvXOXylO5yRNBBnh6fKc2HIdFnR0ELUwIPISGbUhC66kMj3rOTfOsSiFEKRh 50rgrEamzyLns0BGBuaHZ0cb4TZY6VHZDhmrvx7a3eaHHnQ6QWdd0DtDEzGoZCqSGkE+P6dBSpVG sbx8zSaLEggLIAa3HwQJ49s9rQh7gGStYLbvMXxnLve65hKixVltDOy0hhApoiAhwUkwTYU4MA4E pzZMkiKRTm2BUNszKEqQtqgpAKJApSl6kP3ADgI6h5jBeYPeWHQfoJiax2iB968BsKBp7Dap1HkP zEuOk5TlLDrADgBnVODowri+o7c+xNunbWfQ7Z+k1YjiFem9Wp8Hs9fh2XKVTf8xcCvWIfigpO2X MFdMYe2nEl7EG3POrPPkOJJibLQheHDHcAmtOtT59xYKdzjW4CoGixPNHmhsNlBJITbRxOjDUMp8 jJJhJ9uikZhSCFIFnPfRwaK7geSK0LDbJvOeDUyI1lEsQks7BJmHtvUzUpJZ5IBmFAukRV6KHCGj YbQESRZDzzI8XZzoJgAACQ4vjOMp4SiuuaC2SEkjkkg3llRV0RC+9kDQqPxCCmPwRUDdoFBsYF8D 6wIkBhBB9cKIMSKiSDFgiwFERgw9rAJsPaDdKqkiRVVVVVVFRf8MhD+AfgeDwu2q6TELBB/1OYHa QNkSzCqKVq5xUDTQchbJM4JAsCU1VAlDZqqirt40Kw9yTBiwFEYQWCyRYRZ74HEQvS6qw40BpLli JdAZAjmvRMbg0goFfT5M+HgLDYqYBQj3H2AoZeglxBZRJmZblIipg3Mx1bHNKJbjiIvQ60kZC1AZ aKVJr08eowDPzQbSpXNWYElkBtrLi+9B1mdE58hTiQJBkRWAt6jTCLIEBaFJ+WSJqD4AGXxaZJKp pjEGSSMbg7AxC8VFWIa0B1gJuhgDtADzQdQm06R7TFXYgwAMpHpoLQVdSoIweQEyuikBIXWCJ/hA Q5S1+XoiYoOWN4Jz+pLjaMPQDMgOfgdZKFsqHGhYcc+CA/Iu9iKanrPDbUkn0Lj4BCipIkkWMgyU Sx9BAd7o1CHQ+Z6+660wv5w0qTktASxk4zFMKRzJTBrQYlCFCGYFMGkDVKQyqSFICEFkQhGAgaAS wQSQ9KXBcNUypRccSZqxxKMcSiHOfgG8D3DoPWKGc/6Gsl66rhfRB8xMtmcTiACgU9lf2+IeoGyf bB6F0xGRJBQOw+YBYp4IYAHu92QiHTATpLXTgAXdJ0kCcJjAuBBQ+ERjGEhFioRihEEKBCF2oQG0 QGHSdP93qApROmKQgLyfYDQJ7HRjZBDtiCmMkQE8DnpPTlD2CNCeAnSdwDw4x1mduosQkWIQX8z2 oqBQCW5S/XLNwcpBvBi7GCoGY/4IMkCQhBkSMIQI3KKYxei/SSjo6QTDAPGWoQ0UzdTNE4y0kPxp yak4QVtLJBRQJKUBEhNg6KmqcHP7TIEghgN4GAX/6ERkcbzIpAaBGhShJwiaTy0CIwRQiwiKEgfc 4mcB7w8Agfp/X4Z7S1a9oalRv/ZQaOnAf2oPWHcAJcBgdaP2BydEBOcEgL7hZkZIdnbtgETdTTOI r5qByJypE87u09OVHp1AJzXHacf3gdAFuAPAVsD9g4fAV8j7HOIc5E96r1Aa4/TYXClj5HYqGIKH yB1gn7TLgZCaxClH+QK2BXUBxKh3vLn3lf7/cTIS/IVA4lTkF6VQQxHqwPCm4MZHjgAVAkCHnv/7 lIWICoh+Aaw0EJ4PIPjV1ymPF94Fk4ubOOgVVAOuIr9cBANxbmBPqeoTpD9gwxD1AmlV6Hm/UAuA E/6PSBQg+s7QSBIn9/IsiWheTdQGMBNLoV5yiKFv3OtMWKpATuozPSXHusCfcC7nG8L+4IX8X8UU VZ/EtGNaAsGCIixGUq1jKNBWKTDyhAUk8QJ+qQlmP0E+RbRYoifI4ZvqjRyqts4ntuNIcRnRLlAR MlHRjmzqKkPsHJj+C4V12aH3/JYWSUesiIOBiRkocDQ17ybATZ26JA09JhYB6DTpkwRuOfaW+ocg fkWDDOa7w74hGA/7BvCADBDvBLwSPNwGz6D6CgUXTeYAloCWPMBPQoOUH8ASAESSBCJAIqEYn+HQ Jm+w5PaJpGEGjadSj94OwDy3ovvBJ2wP3EDweDk0aKy1VEbUaW/o/Aj7kNCFhGN1+FUxkqoVHE+3 2l8IhDucwA8xwF+h1FZRRO+8XWegGRXZ08aG4ARbg6DjNwj0K7BxLdGmdcr3WDqP744fjv5SEG+o lIUL8U4w3gDibjgJ+CjrR+pwUeQzrmdpEE/iaLFrkBognX2dpRUpoqSSEyQNLIhBVRRQE1mi3gCG hkhwBEONKYLJIZbjMHjcWETrgceYEzZj7LGPUPKGk0qhxAujEAJi3AlgTfge8w0CoCdRuRzgc+cN Qg+oHnMg2fmOg+kX6S0kfmoRZIDAaiyAlKMqrltNqjiH5nzD3IPsN4n4r7w2gL3KhyG4eAG9J9J+ c+Z/jN++K6NMUNJUS34aOPcv26XX3hDAykgwyoPgDsDWCmkP42Q40H3EDTtBX5qhynZRnPePFsFY mpIoSKfQPj5dvwIetYH5hyQYrziAbwBLlT2jQHebD7/wnIgDmQe0Bii/wCOjtR8ENStgHkv7vkFl carWU38oXWtEcy59YflhPeMOiQLvsgh7zl8UTcBv4S7CREg6XaSyKd6L8DqQPiAzOJ4g9Q2E8wO/ Mbj2c4B8RXsEp5OjzvET1m03gOg96/Hm55d6iBwPQ7Q94HuScjzHtGgYB6+7OKdGBVE6VVNAGKPP wDxR5gHJFO0NQ94huV2CQT0BOCPICXCvuPeB2jiJ9gOk+32BO98INx5x4s6imwV5hbHmOAaB6xOo AOwTaj1B5iaxQOApzA9IHQqpSJyquAvIAj5ht4yJCEFCCdyEKJxHoDADfcHnzH8T5x/oXxMxQc4b VXrBfjcjygXuHGD2nKBsOofeq8OkW4DxEDE5API5dJsObw6wU6OBxlYAdOoXWtkgBE7DQq6USk61 VInqCDsA51FKVDFTQRAQQ6SA+vpORDeAOJwO0FhoFLYo0ovmChf77ImcdgHmeJgeoE5wTlUcZJOr jps2DoBO/mxNXNfhzinRxM6HCBFShDxoIIEO4QwIYENB4oQs+f6OzWp2ex7KguAZDYlYVIBvXxNz FmHz9n3z+FEp0jIiCJgBS0NVNtGMAntdie7VJAwTDJiYiIHoGWANeEtNWYPADooB1KNyPK9ojicl /KBcB2K5AYODzgCLoFeU3O84jwDeJqG1c3FVlfx+Yc8fk5EMLOe6AyhQzdA6NAEA1Vi0/qAjeK4H 7AsOGOQdAZkyAvIUFGDZSiZuFiyKHyHMLeCnUhkBfpVzF5zHMBvCi/t3I+SpY6OySBI6IdgGy6xo A4irez3whq4PWPdoDvHvDgdonILxInaFD7QMx0WLkTjEwHct3pta8x5qE94CeBrPVoX+JGMkSRYE VHWPFuXuwEQxAS5yMCg4F/kJ6nOeHWg+ZuRO1V1B5BZE0b0HvOVkCEFRI/j9vNFFPcCFjM+fkOfc izs0aO+2EWEZL1C46uwDd6GwA6wKPWB6HPYDSaQzoPoJyqHSbR4ZnccewHQiYiJA+BxgBZPRfiqk aURhWVlFSNbG0sGSkRQKhIhuGHcajcPKXgJkOIJ4ulBu7jPeaNaHGhkq9xpD1CJxF4KaVXQPW3ID 6gMgMjUGYDWXmrvUL/QRNyiWBQzXCaM/IPWjoF9aGoelEyRLgD1A6kHWq84H1jCAEjIEkYyKyEiI oKkRH9zYjAFSCARZBYMIoJoirb/yoFIB+2Xw/tC+f+YAWLVJoGsNME0axIhNIaQAyYEP4osU4GiC wDADSD//i7kinChIXNedwoA=