From a5f06257535dcabecdc074af3f3591179e1bbfdc Mon Sep 17 00:00:00 2001 From: JustinAJ Date: Fri, 22 May 2015 03:19:05 -0400 Subject: [PATCH] Jupiter::Socket: * Renamed bindToPort() to bind() * Renamed connectToHost() to connect() * Adjusted classes as necessary Updated some copyright years Incremented JUPITER_VERISON for release. --- Jupiter/IRC_Client.cpp | 2 +- Jupiter/Jupiter.h | 2 +- Jupiter/SecureSocket.cpp | 8 ++++---- Jupiter/SecureSocket.h | 6 +++--- Jupiter/Socket.cpp | 14 +++++++------- Jupiter/Socket.h | 8 ++++---- Jupiter/TCPSocket.h | 2 +- Jupiter/UDPSocket.h | 2 +- Release/Jupiter.lib | Bin 267928 -> 267778 bytes 9 files changed, 22 insertions(+), 22 deletions(-) diff --git a/Jupiter/IRC_Client.cpp b/Jupiter/IRC_Client.cpp index 840eb4e..e453883 100644 --- a/Jupiter/IRC_Client.cpp +++ b/Jupiter/IRC_Client.cpp @@ -1269,7 +1269,7 @@ int Jupiter::IRC::Client::primaryHandler() bool Jupiter::IRC::Client::connect() { const Jupiter::ReadableString &clientAddress = Jupiter::IRC::Client::readConfigValue(STRING_LITERAL_AS_REFERENCE("ClientAddress")); - if (Jupiter::IRC::Client::data_->sock->connectToHost(Jupiter::IRC::Client::data_->serverHostname.c_str(), Jupiter::IRC::Client::data_->serverPort, clientAddress.size() == 0 ? nullptr : Jupiter::CStringS(clientAddress).c_str(), (unsigned short)Jupiter::IRC::Client::readConfigLong(STRING_LITERAL_AS_REFERENCE("ClientPort"))) == false) + if (Jupiter::IRC::Client::data_->sock->connect(Jupiter::IRC::Client::data_->serverHostname.c_str(), Jupiter::IRC::Client::data_->serverPort, clientAddress.size() == 0 ? nullptr : Jupiter::CStringS(clientAddress).c_str(), (unsigned short)Jupiter::IRC::Client::readConfigLong(STRING_LITERAL_AS_REFERENCE("ClientPort"))) == false) return false; Jupiter::IRC::Client::data_->sock->setBlocking(false); diff --git a/Jupiter/Jupiter.h b/Jupiter/Jupiter.h index 46ba2d5..2259922 100644 --- a/Jupiter/Jupiter.h +++ b/Jupiter/Jupiter.h @@ -35,7 +35,7 @@ #define JUPITER_API #endif // _WIN32 -#define JUPITER_VERSION "Jupiter 0.14" /** Version of this program at compile time. */ +#define JUPITER_VERSION "Jupiter 0.15" /** Version of this program at compile time. */ #if defined __cplusplus extern "C" diff --git a/Jupiter/SecureSocket.cpp b/Jupiter/SecureSocket.cpp index 38d3891..9051358 100644 --- a/Jupiter/SecureSocket.cpp +++ b/Jupiter/SecureSocket.cpp @@ -81,9 +81,9 @@ Jupiter::SecureSocket *Jupiter::SecureSocket::accept() return nullptr; } -bool Jupiter::SecureSocket::bindToPort(const char *hostname, unsigned short iPort, bool andListen) +bool Jupiter::SecureSocket::bind(const char *hostname, unsigned short iPort, bool andListen) { - return Jupiter::Socket::bindToPort(hostname, iPort, andListen); + return Jupiter::Socket::bind(hostname, iPort, andListen); } void Jupiter::SecureSocket::closeSocket() @@ -165,9 +165,9 @@ void Jupiter::SecureSocket::setCertificate(const Jupiter::ReadableString &pem) Jupiter::SecureSocket::setCertificate(pem, pem); } -bool Jupiter::SecureSocket::connectToHost(const char *hostname, unsigned short iPort, const char *clientAddress, unsigned short clientPort) +bool Jupiter::SecureSocket::connect(const char *hostname, unsigned short iPort, const char *clientAddress, unsigned short clientPort) { - return Jupiter::Socket::connectToHost(hostname, iPort, clientAddress, clientPort) && this->initSSL(); + return Jupiter::Socket::connect(hostname, iPort, clientAddress, clientPort) && this->initSSL(); } int Jupiter::SecureSocket::peek() diff --git a/Jupiter/SecureSocket.h b/Jupiter/SecureSocket.h index 1b70828..d65d5a3 100644 --- a/Jupiter/SecureSocket.h +++ b/Jupiter/SecureSocket.h @@ -1,5 +1,5 @@ /** - * Copyright (C) 2013-2014 Justin James. + * Copyright (C) 2013-2015 Justin James. * * This license must be preserved. * Any applications, libraries, or code which make any use of any @@ -96,7 +96,7 @@ namespace Jupiter * @param Address for client to bind to. * @return True on success, false otherwise. */ - virtual bool connectToHost(const char *hostname, unsigned short iPort, const char *clientAddress = nullptr, unsigned short clientPort = 0) override; + virtual bool connect(const char *hostname, unsigned short iPort, const char *clientAddress = nullptr, unsigned short clientPort = 0) override; /** * @brief Interface to provide simple binding to ports. @@ -106,7 +106,7 @@ namespace Jupiter * @param andListen True if listen() should be called, false otherwise. * @return True on success, false otherwise. */ - virtual bool bindToPort(const char *hostname, unsigned short iPort, bool andListen = true) override; + virtual bool bind(const char *hostname, unsigned short iPort, bool andListen = true) override; /** * @brief Accepts an incoming connection for the port bound to. diff --git a/Jupiter/Socket.cpp b/Jupiter/Socket.cpp index fca30e3..eee7a90 100644 --- a/Jupiter/Socket.cpp +++ b/Jupiter/Socket.cpp @@ -148,17 +148,17 @@ int Jupiter::Socket::getProtocol() const return Jupiter::Socket::data_->sockProto; } -bool Jupiter::Socket::connectToHost(addrinfo *info) +bool Jupiter::Socket::connect(addrinfo *info) { #if defined _WIN32 if (!socketInit && !Jupiter::Socket::init()) return false; #endif // _WIN32 Jupiter::Socket::data_->rawSock = socket(info->ai_family, Jupiter::Socket::data_->sockType, Jupiter::Socket::data_->sockProto); - if (Jupiter::Socket::data_->rawSock == INVALID_SOCKET || (Jupiter::Socket::data_->sockType != SOCK_RAW && Jupiter::Socket::data_->sockProto != IPPROTO_RAW && connect(Jupiter::Socket::data_->rawSock, info->ai_addr, info->ai_addrlen) == SOCKET_ERROR)) return false; + if (Jupiter::Socket::data_->rawSock == INVALID_SOCKET || (Jupiter::Socket::data_->sockType != SOCK_RAW && Jupiter::Socket::data_->sockProto != IPPROTO_RAW && ::connect(Jupiter::Socket::data_->rawSock, info->ai_addr, info->ai_addrlen) == SOCKET_ERROR)) return false; return true; } -bool Jupiter::Socket::connectToHost(const char *hostname, unsigned short iPort, const char *clientAddress, unsigned short clientPort) +bool Jupiter::Socket::connect(const char *hostname, unsigned short iPort, const char *clientAddress, unsigned short clientPort) { #if defined _WIN32 if (!socketInit && !Jupiter::Socket::init()) return false; @@ -180,8 +180,8 @@ bool Jupiter::Socket::connectToHost(const char *hostname, unsigned short iPort, sockaddr *asock = ainfo->ai_addr; Jupiter::Socket::data_->rawSock = socket(ainfo->ai_family, Jupiter::Socket::data_->sockType, Jupiter::Socket::data_->sockProto); if (Jupiter::Socket::data_->rawSock == INVALID_SOCKET) continue; - if (clientAddress != nullptr) this->bindToPort(clientAddress, clientPort, false); - if (connect(Jupiter::Socket::data_->rawSock, asock, ainfo->ai_addrlen) == SOCKET_ERROR) + if (clientAddress != nullptr) this->bind(clientAddress, clientPort, false); + if (::connect(Jupiter::Socket::data_->rawSock, asock, ainfo->ai_addrlen) == SOCKET_ERROR) { i++; continue; @@ -192,7 +192,7 @@ bool Jupiter::Socket::connectToHost(const char *hostname, unsigned short iPort, return false; } -bool Jupiter::Socket::bindToPort(const char *hostname, unsigned short iPort, bool andListen) +bool Jupiter::Socket::bind(const char *hostname, unsigned short iPort, bool andListen) { #if defined _WIN32 if (!socketInit && !Jupiter::Socket::init()) return false; @@ -212,7 +212,7 @@ bool Jupiter::Socket::bindToPort(const char *hostname, unsigned short iPort, boo return false; } Jupiter::Socket::data_->rawSock = socket(ainfo->ai_family, Jupiter::Socket::data_->sockType, Jupiter::Socket::data_->sockProto); - if (Jupiter::Socket::data_->rawSock == INVALID_SOCKET || bind(Jupiter::Socket::data_->rawSock, ainfo->ai_addr, ainfo->ai_addrlen) == SOCKET_ERROR) + if (Jupiter::Socket::data_->rawSock == INVALID_SOCKET || ::bind(Jupiter::Socket::data_->rawSock, ainfo->ai_addr, ainfo->ai_addrlen) == SOCKET_ERROR) { i++; continue; diff --git a/Jupiter/Socket.h b/Jupiter/Socket.h index bcd40ed..958b76f 100644 --- a/Jupiter/Socket.h +++ b/Jupiter/Socket.h @@ -1,5 +1,5 @@ /** - * Copyright (C) 2013-2014 Justin James. + * Copyright (C) 2013-2015 Justin James. * * This license must be preserved. * Any applications, libraries, or code which make any use of any @@ -215,7 +215,7 @@ namespace Jupiter * @param info addrinfo containing the information required to initialize the socket and attempt a connection. * @return True on success, false otherwise. */ - virtual bool connectToHost(addrinfo *info); + virtual bool connect(addrinfo *info); /** * @brief Interface to provide simple connection establishing. @@ -226,7 +226,7 @@ namespace Jupiter * @param clientPort Optional parameter to specify the port for socket to bind to. * @return True on success, false otherwise. */ - virtual bool connectToHost(const char *hostname, unsigned short iPort, const char *clientHostname = nullptr, unsigned short clientPort = 0); + virtual bool connect(const char *hostname, unsigned short iPort, const char *clientHostname = nullptr, unsigned short clientPort = 0); /** * @brief Interface to provide simple binding to ports. @@ -236,7 +236,7 @@ namespace Jupiter * @param andListen True if listen() should be called, false otherwise. * @return True on success, false otherwise. */ - virtual bool bindToPort(const char *hostname, unsigned short iPort, bool andListen = true); + virtual bool bind(const char *hostname, unsigned short iPort, bool andListen = true); /** * @brief Accepts an incoming connection for the port bound to. diff --git a/Jupiter/TCPSocket.h b/Jupiter/TCPSocket.h index c4a9608..7a130d6 100644 --- a/Jupiter/TCPSocket.h +++ b/Jupiter/TCPSocket.h @@ -1,5 +1,5 @@ /** - * Copyright (C) 2013-2014 Justin James. + * Copyright (C) 2013-2015 Justin James. * * This license must be preserved. * Any applications, libraries, or code which make any use of any diff --git a/Jupiter/UDPSocket.h b/Jupiter/UDPSocket.h index 7ecd0a5..72acf11 100644 --- a/Jupiter/UDPSocket.h +++ b/Jupiter/UDPSocket.h @@ -1,5 +1,5 @@ /** - * Copyright (C) 2013-2014 Justin James. + * Copyright (C) 2013-2015 Justin James. * * This license must be preserved. * Any applications, libraries, or code which make any use of any diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index 5fc6d9ba2ec6895196da0b73a398ff996a709d04..83b6234f06a6221d0bf9a03103984a2d1f3301ee 100644 GIT binary patch delta 27705 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 z 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 delta 27548 zcma)^4Sdhl`~T19oDXJZHfE$Xvsg33+=MhNNs?ws(vp_sD_^nHS4;94Nr*M3y|pyA zNfINuzZprA7)g?5Ns^e6zw!X?(-h~AO9YY=ib}-oSW-h*LALQo%8-^+>(%) zpM+#bdfT>Y)y^u5S9N_Y+uRjJ|D^>AQ7K=@SJw#n+EF2Wb%m-QVUvd^h-B*FchCTz zYf#<*L^1d*3S5ja{Jl~r;_7&ta6CbIlJLM6wxf*&^*G20?Z-;m5AFW8*W7dBBF=k zR?LPdXl7Uj=`{=S1fLWemSzY=Bn&bXY(sqrw5PibCa?#*n_%NBz%L-LnMSp}Dl~md zg(4ohXgGq7h<)b`Umg{T=ycdn4092mVqjv$Aw$!lLJ{#LHofr#ANMi%7Vi{__z1Jr zV3r?&6@4{wWiO$b35f}7u?+;az|2(|b@Y&sXXgo-IYgt{#0o-Y4bZ5c0t6w)!(_x8 zD>XhjAz5hNoGzp$7|&p#8iyHn_ZNzo(cT8a&H!)a8m7burP+-qIJVO8YiFS}`|t$6 zMH!A~2u1u>K=_3Gd$(cQAR&Re1r9>gn{K$bmrz6(*qr#JpYwpLjHk)h|}<1;;S&j zj>$q2U#&3gyegyy1MdWz(hZw2GvbYAhMyoDP^S*qbiosxhDkLjKMgkc`rrpxztyne zF#ZM`QIR;0M#TFg4YQ63MZAC6P#dd+cr4P8<`qga6VI7gy1NYTMGHyfVd)X?%`*5t zJt!oR+u8=}G8gRbXxK18NTLwxBQ|d^Obi#2*jCx_`A8v&w*oX?Raa;N6NQ(kyuc8U zF1&>Iu*TBV5j?@B6i-kc6ClE7 z7=keYBBb0VR43_65$Q<;YWCap*B7wYNZ)!Vs=FB0fsP0PSnJViO`*fni!A> z@)|t-gqIKyN|T8v@Sr{sG{PXlgx5zuY82Y^#5Z&OMME?_pCj*2c{#SziA3xOpIvZXJ7D|K8Ujics8w!(! zBDNq{5rxMLn;`&Egz!q7Ni&q9t_A{^f{ptPs~ZZX*?=eLybt#8jG*vYl3`YekeVz! zvoKhx;Q;mpqG*R<<~X5jJH;?C1eyVTMjQGDr1W+YzEFpN8l!43;`SCpYG`Xg%5`mconYK0p% zSB67@`_nb@?JS|mJ}RUp1y2k<4MGsplMFf8LJ`wX7%XT&a}ZDPTA0m3Ji(X?Hoj#1 z0;ZlbWQ`MwI4Nw<=}GVhB-gCK6PwY+RKwImLK1IHH%x&hHIaCNsa-Yd?V7@{2v0B# z{S&@ycqH-82tzJrufagMU{t2zRm^}GJ=pLn5)EQ%f5VB+LTTW{#spL`oQz0; zS&7sMhDrHC5zl2AhEEr2_;lERd^?R?KSpSlEfEr^Lmds7g*b?S@$h088)G4=t8tWh_S$@ng ztrUrBsZbB68lHd#h{@dyLogvAH(+TK1+6t|9VS5>?PUmqa6bA`8+IW&V^HFr3_}a3 zkw}2F#9wGktjslhhKQ$Wk0{hIx1r z^IKSih8N%@#9(wz4C`Y9^$!D2=NlebDHP#_Kt$kTgTkzdN>DFRb%?=JEEFN~ zH1gsJ#1G)RTp%P+!B8Jj`KU%-IVUvN5omx4h%r=yutatI4P-gOH*u|{VZ|UJiJY2- zca{oCd=q7Z@xB2wW@&u#9dtr`+Sjl#PDo-4DiDR24U@VHNlZjzV&iVZRzyEdBA#F} zl2Bq&v0?8BA&Gp9p_zv#*!L2F{C~|t!&(eR>0WZ=`V5a&gLTBUDI)!Fv^E1J!(8@B^rIhRSdvA`s3(NH`4P zL1Q2>@wi<%Q2}K}5C1m*ygYO#t0O}`52;}8> zjS7Yn5@oPGF%l*fACd8j%LS2uwnS&>|(BE*SB~o@!zQM2+tBLqL%MjiRcSqnw z{7tOK#DH9#0Q;|o&1PpA<^&_10)L|MyLpBk7qRBST9}3S5Sk+5A`JT%3Z;>Fg70=2 z22B=%erp>z*nIHq1jG69NWCz7;@v32 zQz#?WbTq7MgIEvNZZIs$7D^M2C-@qHjqrUv5x;kAj zT^E4}^zLIw9wQX-E$R~cMi?H-zy%g~{*dAEbfGk*c$UKc53UlLy(l1l*kIEJPjC>y zi3n|G_+W=n8vOkMSded6UL=&JH=bboQJZ8u!58S4*f!551kVt}|1V%4qWcU(7j#Ix za?Pw>dOKfSo5kBM_-eou1|`H`q;*aNG0ll zhz9tbh{E3>=AsfS|5jrBRVBhfQaL_D*{U)r&dpJxeWns~d`c9BD^apSiiJ5+G@Kzt z{w^uD?Uo|`Eb94wRANz{61$o!k=_i0;CU`WiOIL2{8lA;;P-lXHY>m&%am9Mia${z zW2q8@5|r46^6q=2C;|!ZN>KosKswx{5~a)eyPOaPD<1*M%z!7 zIJ80u-_WLzE?$Y=pwGuj>|Bh2Kf<7(FDmp}iH>JVvDiY#U=@BpbX19XkbX#}6tQiT z7?34Jz)uivyc8?nkRo}46w}|7A{c}O6!U(7it%j!qZH#0OHq#JfD$QAfi_3+8JwuzuTm@krN^Zh3^t*> z+b___F)4z;$lu^-C#2~9JN&?hU*=$tekY~ahl0y^b~%Mce?Yybp}w!An7l)Z6?k6V ziN+v(69(H1b3oNWKS^=mltLTK^t2KOK%WgtY+VmqMCVuRKjicX#hr)4Y;d$^=DO%^kmY^d%b;1S+SSZB?3>rRBiptv{$mg*6 zTUaT|D-w}HEvW1j=>cAG*y|NpC|ilL6Zku#idXcigwLf{Y_IASm+^Nq)E$g^?IbS7 z`l4_O3JX!`DjIIP3~#-v#K3DxEWQH!hj>Li7#Qjm-Ku-VgkapZftC1uMi>Ub@8$S> zM=h_2!`~&ipGyeG-?hCW4P}>Wdc^?zeiffJ!|yxM&kQ{29+a$hMr2KzU{yH_i*0qpAx&;3k_kXce>fl@Ra zbO6qYM&o8Gv91JbcZd>G{;Na?gc;oj9bv8aeim&Z*pPmR39rBxAlMoR*7pH8^M9bx z!O-YxDJIUr(wqx(17Fu4u{g`MV+Lz5aOL-<$OFBL;E?;^V0g}Jq(tlj3~&L< z5=(CAmrBInu0%&fyNRWUmS^Cs=cFiu({{!3&G-d@<`|afUs5c^XSw)nW=CkGK#I=e zq*yc-{xeqk#HewczVno12dz2V;7^@A-dj?ien=jC(Z#&jD5Ln|GUqXEdrNfF5a*sd@Slcs; zG20X+CZsBnKM6B^4l81~679w-F=o9KOO|1Y9#Wz(6CI;$&_p;M>aBVcj`#-Jj)kD( z5OQJv3!@Rw5dXnsJX3Gh3kJ1PJjL;`>TC=Vw?U;M}Kh&Q%CRXW+DJ5OD59v;}#M zG1kXm9^(Im`RHty5`iFfA$Ba#>^;l|4BU&Ql?OXQpvk?U`kwG$kO+;WVs;HN%Lx;( z>|R%52^g>ggFb*g;Cs|b$Exa$h=)~i@&ye3B7_}*y&(gCkHqSE85(&3_CGfmA#)gJ z0P>%PhdzRiycj4DgDXf}3EHWO4aWn?1%!cr6kNtC2!>rNqx}_V?79>&0qD3IR9zjm zFPEa_HEd$o_iJL`U-}N5_ZzeWvycPC;P1YOvT?qRDA9cGz`nRqed45>sL%yj%EDSBXL!)n0Msz6;= zr8tjSZpAFe1wl)g`pV)4%BYgt>FCbiA!D=Xn5L>YVK8F*A;|Y5v zuZN=|qGh37FrwNNw99)JJ_J8VT#MO$h?&M=-S1b()!|d$!H)*P2Vmk^4Y9pP!~Tn) zia4k;6_^11MK{9CqoIi=SRK&9 zZmfuIW6>Y_-hr6W4chRfJ&MY3q^=(#d@h9ZfkON~Yrhm1G5gA(*#g)dq>f zJFJ8RkLv(%n{yiAV@1`~OQ(7oW%+mQKELouC1iD6gq-2md(6KaNdD#c!2?!W-KD;) z+0UFoLaKP{hP2WrkSKgPs0UVF>fY7kUX|q@Q=w?Q47c)LlOYo2OJ0+K{^dnuWJsmd zz5O5k&RX`GtiRgplV1Dtke5|lRr)Ad;6H2mI9baYwn4^P1&?_Gt%NsZwCO){lB{Dr zKS0&em2q<`Jf?D4rtITa&d!wK zrV@0dn_V66hzxmjvj@-4RxrDuB=D%Hent+^$h zrWHleWA=Ir3|->4JLUx?WDo z{94wN*-(MYI(4l2)685KO_hDkDEL~Oo@+vu>~BiQWl2q&vg9yR0t@Mqes9a^rlbJ+ zpgNJ+a)2p;@&7SSK{gvl7xSpCr}3!S(@c*WrpXbeebQ>vWB=*0m)+xhQ>SD)+oi0! zZH1=T|_tQzmh+J2@^Unq?`+<{8brc#8Jw%p|pS}d{`O=8FlR=Fds)@NIE z(9n8ehP>U1d`C8O=BZ~s`W<%igxU6h38)`~0kisf8d(XsytI?n+EO>h=XaRTZ?zIW zb9^V)%=2ol>|w@8`@@uESUd&<)1#I}Hqb!irDjNfUN#>gq)=8YS!r@w-ZxcUOa=} z=fzXRVpGrO-*@!r_3E+G^JP~fPr^Dg`tg5C?5Xsd&3fX=9iGjTBkk)5(*_E;8xf}D zttQsg>2Apmn4S;M;h15BLb%dRo1JV;8IHFd{zo#hE~ee`OdPkLqPTd4gu^uksq*9oXL=e^PS>M z+ovKIRXVzs-SSU3?z(L87?hfph^Vn?EH7+Zaky$RdDv>}w{3Ew5wV;T4Vu2TI!*sc zte2Esclbp$l3#DJQ#?dMb4zCpxgGmfBim~P@ct_+K-V``c zOa|UlW&K^;my{Uy(@r*RzmF7wTF` z8)Qu_#UtqRMMzQOKb~$@$Tru4qMBi?okU)U>(_U*M-x~kZ_j>I=3^_+xFKm$=tfW1h zKRAg#bv$HC#cl$(ayPmnW$wDK9_Z^eD|D-DKRvQ4P1@e(3(wifMG`8E!Fri9B#uUN z<>lmtn?JWVqK>HO(-m9!^+O4nHdrrwoJk97_Sz(C$u{1DprJa}nQeB0I|Y@-no5~g z(g_yEHMf#4cy3y|V|FW@;Ad|4)9ybBY1c0u7odQ~soCx?dCQ|sP-~(+#-3p9-6><; znsBAdZ|VwG)GMA!R`yU&9lzs7=0RiB%&+7OV?tN3o@83C|AP-hE>GRLlf|SASSyT9 z1aFZpHeJ8dD*E2#jjp!GzUH@#!jm5APVR$U6he>+CSk9ey5CD2<2tQXRPHY@Ev`80#FE1np?8PF8905rwf5FoTYvi*N% zNL}jBDOa3>&&$$1O-Mj{!4}zh;?)CAp2(Kg&1iYf6W({yalV8%*{#U?wOHi+^GU2N z*F24K%2KLYQNMB}_Ut7G{XLufC;bPWpH?EB$8>L$S}nADYhvXmD*xPs)6Ox6cn$IZ z0Y6q8VAqc~44`L211yFTTD<6quh{>bX2zio9hRAPEGI1-EH zXnS$kf%!x+536HL>Jig)*bzRb@*EOMD$ZeDNyRyg`I$R&l%xX=&EZpPONorlNlC6; zaTYwnl%xJ5=!P$$;b+#*zo21J=X?F)BrnH9zuYh)Su5=r2MX@|#Ic)pzScT(Og70q z!Dn#lSC34gU>$uJo0Hz#YhC}5cWP&5G|qhiblSB*>6S>Z8Mg_8tn6%70>xl0 z79B|TkXU=G$VQebWsB1ZO;>1!3PpB>aBKWIPDqMuagLs2aX8aV{gV?wK0WRKlaDD* z4y^lbh`#qz-_ruHf-C5R^WyF2c>tbo$G>>Ky1Utb*($yr-F;8poe4lLfbQ%(lY5H2 zz&$zbv_oCsRGh9WsU+-gb~@LdGV5>N68QEj_9AbvPTHlto6@eI;N4?KdG5)*#DSKQ z%y-I^$wvF4N-?Tz8RdD%8g_;2@Md%Q5^pxVfsVP%8>mieH&r!>QN1g2q_L?MfiEiy zukdB1t9I&Du5Bk1xz~6T)>EZ)Pn(AJlV2&s-&5Vw(&|(TA^x8`LH7QTa`t|{*vlC>nrOjoIFWwBOINxS>pRYu;4N@d(cp9x-9hphdbUha@bPOs#u$Rh_e5X%C>I!uBziw9uv*uJ+_7x{bl!#zuUq)gmJ$PQQvaf_gY8Xo<)=*>Y zecwN^J6S{7cjuIIk$@vZR3B53vNS5W8lvo1BPpS#v(ceyys1<6v8roD)HDv2P?L*8 zC42+keL+5)6wgawh?VB z+D58*aEP7Yxr>&Ko#+{bKWT&-SzC>=UD&=SiVA0Su~GBG*{DwcH1T$Il>IVeP8~Dx zU3HZGGKW1(?~@e1LaoqSRLh)#Z*Q?uTJZ$~{)I z1kxi=1gdQ{h)}oXq%{i2ITIaX4U2Hk7Y?SY(#bxYs>WF9Q8F|qDjILgB3vOwD~MNZ zy$E()POA$e*mX&M-Dwg!y@fh$U}fH>+Wq4o`cq2d>sefYq8s?VRX)%I$rCm?c9*O(-}O{Iva(-BW?+>YDK9= zMm*Qx^|=NHkK#U@!K40t@CMYdftB4r**D4BFm!z$PSbwKPXlYp?cA1^Z1L^9 zWO-TlZ|J|QbsuE4SoG1cISyYl@_EzMyF6la0 zJzJ=F#J>nD^Bz~UanwUI?bbrsuV$&W?wqdpI>8Ui-u86;*S5MQsW!>fjLS*+)@v1h z=^BZHG7VJTlDB;h!V6omgYm}MrZum7zJXlXTG{VwDXr5hfDUK(!Jby+?Xsbjc_$mt zKQFTm-pQ$p>k93D>&Ts|PEMzpO|8vsSZz*fs@Da52ces;W+k-cot*>IlC~_MD`dyD z|U(Rl7rj>+lUnYEL!@=YOYqa{fmtr(QPq z!OSmOp%1HiIkB6gt)7EfFKp<*huP4aFVB3K^JO+d`(A7Wz79Lo%Rdm4MFu{?tz6;b z6(}U(eT0ub4>=2k{E#*&?f-W}z)@tDCxyghbs>? zbn6{y?AAP3^3yyRYwhIItTk;}`s$sQp(kXRPGRoNF4mp_6%`Ww3@b!WpO4Um&+w*3 zn$!Kz_x;|%Twa*(xz`$>$r-AvnfF<4#{2x@XE_3}_(buvEOR z!UprY(zA12Jj^0{@BKZ=DjUX&!m%akv*U9W9p}Vz>^M3oI5+e|)HoB9*~*FkWh*<& zMSBM&3UkRj9i9ccR4bBPbUqZB7V1f~+CI+~an2MZ^5o~8 z?1R5Y=@|0^7&GK#7n-gA+YLuA)PCVGRwo{;d-n7Xw@XA z=Zc`5=F95&P0OiD0uFnXjjW6Lv{837pEk($+Aj2_caz7P`-!KGl|Rkjo9NC_S9uIo zHtQ-ac}zd2 zp2>!CEs~3wyh!v!T~}P&$v4j4iz}`Q2Ov_vUc$7Me`(jc(`sPx>v5XF&A)K5W*jHE zuG4S7*V*A+hCJ~)8Ca}|y@w7vb@%C69CaA_a z!AEOYA8g>{ODm(-n?|t;O357YQLv@+T-y1oTrz^S~XUCLdZJy;ZF}l0Ylg9hnl~c znkiP%46fvKr&Ukgoj{x|SbmqEW?f$TyY;rEV#zKMewuPQ+eC{eMINt5r+niN8olT1 zoh!al;BRyl&Ez8!zn$v-E}xcksCT}0^DZaY9JKr9@zUcpR-DIcjMI?O?{NtaSZ|gy zp#M7j(^~#MCbxMl5`hYDj7Tu;Gp#V6^HlG)oFi$~{cdg$)3l#0exJh`rAk`452DQl z_-)iW4_>P{|G>bRnpPBD#QaTxtRMtm&cF0eExK3WORXNWIriw|{1>y$asJS3HPg;` z?6<`8=5QLxE3o}sb}!e>!p^yT6F~7nOG1}N*GQ5ry=3E@`iJn3BCc~(g1Jp4`aTx^ z5sI$VwW4A9Me4!%d}GE=p1gpia56DkI>ifk``{&(@c}O}Hf-QRHlyo42>HlDb&pjt zk6#eD@{z6|az4Vg-~J)no{w!wi`c6;#P3|hYSycSw6Bd%uMDbMdl#t|R`y5Ecw`{g zYxqEk%iX7?r=1nM*tOjF8{(rD^Ik(E>aOXHRgg7yu}Yw>UEi1H8wzb4x}m6!e=MDo z`9l-ytB-jf#!DmZeGyC4MB@qiHB#XcI|w|7W;M{vn%hS{X?^`R+tX!*tWVeqymVrh zIy%R_r52R#Eo)lMm#WyD;#6dFki^p-y4snx|2J$)SF^_W5HnQE|H;YD=v}aYb!31^mV*M zTrXG3*Eug&u+M8f--~%Pwn8_m$eTu1N}_Z%6IDyt%1b?3-qloVhc=rt3%N??m`FmMP@;_}W`qpYM z*eZP&zPtO+t&^6F&+!ZPaX{yDRs6S{+}#*%A4P91zVURaxCkjh(L+*#(#KS~-|vjg zLSEd@Lb|rV(ckeF$QBJh;Mfmek=35r4PB?wW?H`{?tYNaxvq?CN9*xDI~oV-;_um8 zc!FsMd4gPW+$rH!Lx12_E<2X~z-niQ%{ask>*W7r@C%3d+{5Sac|WqEIp2vp%)#8r zcc|$ar5y3<{J~(yf^DPu(M5ieSsEIWt&;Mj= zvF#@xW!q~fas4~!7p!SV@%@PFIdRtie&I0ftQEa1>FZP@Otmxb-EIXRzj&Z1?)Lqx0oa-g75ok3(!D~~m3%X>})#!Ux|D$T%t(@2GuWWFF z5qq2y49>KQj&r8P@jdM~c3Fz%x=Y%;U$Gkej@QsVSNM|?KoyTX1l1_37OH_1{C88Ziuj|ej3jdBhC*k9^*6iP0OV4#&&9p*K z|Nk83#!|h1JIn>1=52x8QBO4%0=^t z?0neX&-mOJa)yWEoqfs~UeHdyQ^xrYoo2K;8l&e)2yiXrxG68i(SJHi(SP{2VU4tBkli`2R6L5nd1CQs=Z(Fb-Q-JWtC`(@qc^J!SkidJQvcuHZyr$z6`LI9mGFZ3%J4& z0{>Gv-6Hi0_n`%0rEI^#9qHow_K2;ovV4x%dXV}UWF7|b{NM?*eyQ%Yzf*`oaKN?O zhFx=w#9d}y<1X2s%dW9Mvyel}{hDgA50?e+ukE$mePR_Jkh@=8#lL%!J}SU#Z_iF=T4m%*8?EJ4ykXX- z0bcv-gDwRHROQ}z-Xp7W?;LSXRdw}F-ljb@3cYWEr)K|%d^LK!^A^*N5&HwZc8uVu zbgjmNammUXN}_|fj`sMT)lFo{4)WSx&SW>a7{rEjRUBB|uVNi*wcUPKb+7-j=Wg2s zbM1l}X4&Tld)wS3K6q=mM&pH;?i6$T!!>T&zHs3W(X*ju>Z3xv zt&K!nvDm4|C0%N|nqCVtO&7b1o7=@9wRqOZ#=@-uwY*{EMH#ic_GP~wpH+9LmP>Wq gNtZD0goRiVc2gm0)^-(h`;6M$-etd%+TQ5@12CGgxc~qF