From 2d2449d9e88b769140362da2d9051fb09227eba6 Mon Sep 17 00:00:00 2001 From: Aaron Parecki Date: Sat, 27 May 2017 14:01:25 -0700 Subject: [PATCH] add option to provide custom tile URL --- p3k/geo/StaticMap.php | 23 ++++++++++++++++++----- p3k/map/images/mapbox-attribution.png | Bin 0 -> 3427 bytes p3k/map/images/mapbox-attribution.psd | Bin 0 -> 64616 bytes 3 files changed, 18 insertions(+), 5 deletions(-) create mode 100644 p3k/map/images/mapbox-attribution.png create mode 100644 p3k/map/images/mapbox-attribution.psd diff --git a/p3k/geo/StaticMap.php b/p3k/geo/StaticMap.php index 8339104..ec4918f 100644 --- a/p3k/geo/StaticMap.php +++ b/p3k/geo/StaticMap.php @@ -242,7 +242,7 @@ function generate($params, $filename, $assetPath) { ), 'stamen-watercolor' => array( 'http://tile.stamen.com/watercolor/{Z}/{X}/{Y}.png' - ) + ), ); if(k($params,'basemap') && k($tileServices, k($params,'basemap'))) { @@ -251,6 +251,9 @@ function generate($params, $filename, $assetPath) { $overlayURL = $tileServices[k($params,'basemap')][1]; else $overlayURL = 0; + } elseif(k($params, 'basemap') == 'custom') { + $tileURL = $params['tileurl']; + $overlayURL = false; } else { $tileURL = $tileServices['gray'][0]; $overlayURL = false; @@ -258,9 +261,9 @@ function generate($params, $filename, $assetPath) { function urlForTile($x, $y, $z, $tileURL) { return str_replace(array( - '{X}', '{Y}', '{Z}' + '{X}', '{Y}', '{Z}', '{x}', '{y}', '{z}' ), array( - $x, $y, $z + $x, $y, $z, $x, $y, $z ), $tileURL); } @@ -300,6 +303,8 @@ function generate($params, $filename, $assetPath) { $mh = curl_multi_init(); $numTiles = 0; + $urls = array(); + for($x = $swTile['x']; $x <= $neTile['x']; $x++) { if(!array_key_exists("$x", $tiles)) { $tiles["$x"] = array(); @@ -310,6 +315,7 @@ function generate($params, $filename, $assetPath) { for($y = $swTile['y']; $y <= $neTile['y']; $y++) { $url = urlForTile($x, $y, $zoom, $tileURL); + $urls[] = $url; $tiles["$x"]["$y"] = false; $chs["$x"]["$y"] = curl_init($url); curl_setopt($chs["$x"]["$y"], CURLOPT_RETURNTRANSFER, TRUE); @@ -525,11 +531,18 @@ function generate($params, $filename, $assetPath) { } + if(k($params,'attribution') == 'mapbox') { + $logo = imagecreatefrompng($assetPath . '/mapbox-attribution.png'); + imagecopy($im, $logo, $width-imagesx($logo), $height-imagesy($logo), 0,0, imagesx($logo),imagesy($logo)); + } elseif(k($params,'attribution') == 'mapbox-small') { + $logo = imagecreatefrompng($assetPath . '/mapbox-attribution.png'); + $shrinkFactor = 2; + imagecopyresampled($im, $logo, $width-round(imagesx($logo)/$shrinkFactor), $height-round(imagesy($logo)/$shrinkFactor), 0,0, round(imagesx($logo)/$shrinkFactor),round(imagesy($logo)/$shrinkFactor), imagesx($logo),imagesy($logo)); - if(k($params,'attribution') != 'none') { + } elseif(k($params,'attribution') != 'none') { $logo = imagecreatefrompng($assetPath . '/powered-by-esri.png'); - // Shrink the esri logo if the image is small + // Shrink the logo if the image is small if($width > 120) { if($width < 220 || k($params, 'attribution') == 'small') { $shrinkFactor = 2; diff --git a/p3k/map/images/mapbox-attribution.png b/p3k/map/images/mapbox-attribution.png new file mode 100644 index 0000000000000000000000000000000000000000..c17900f46a40c8051f151486dd637318a6e1d425 GIT binary patch literal 3427 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 literal 0 HcmV?d00001 diff --git a/p3k/map/images/mapbox-attribution.psd b/p3k/map/images/mapbox-attribution.psd new file mode 100644 index 0000000000000000000000000000000000000000..86d433f311e52a4774dba79d8c65fea66b3e2d6c GIT binary patch literal 64616 zcmeHw31CxI7U)gVowiU46cIF(9i>V4MYb+L3xqCd%IaW9(>69uYLZgG4R=On6wy%; zjanEKP|+~9N-Gv^rJ%^LsKvG5D4+#fwSa}@{d4YHl5`^l=Kq;L3G}`D?sD$g?z!hK z@4keTEF}>U_U8q+aQMq1eni4XE&V7VB}3sghCU5o;~ZC-HX5I&teZS-MX6d-thGp& zX$y6RDdE3VzaK8ujB(y7W~ht#Z}8T+OOtO=5odw5b7;S0t?{DJ{`j z)Y26tdV@J>#guS$zHym03BnjH3zyO?mf|Vl$(SHrpvaP@8ckYhY((@VjXW|^8W$H4 z850{97kRTZN*);{lf(bGNs%#0v2jUJ@lx&=J~aSBlTG;rNjYgVx$59)N_dgQQko=_ zm6w-Clt)JxO@*?^#Kc4d6BRWHa!fL>G+5LtCK=45SRg!{G_6@<(v@0tMuQaLs+Sqd zEK|b6u_EEe(N$6^RAewmP#PmN#uC{Ib*U^eLM{^^L&3?wlcZFWR&6nwa*am)RF?9r zBBRAy_(}5ENm22+k&db4>EJHRsv7O2k zIo2uua^lF>2+}AmGwG?&^EEQ9UR$CySj-@iNLPvEYmy3#rV_Pfs=BmPuhXbe=(6R8 zd`^_5ylf`R99ge5)lRL~c7F(oBAo|;>Q!nvqJX*jTHMok&oBMxjnf{k$x ztW(i0U^7iR=%Lkmr#y&tU%+<*qDwXDIy3ZND_vEdHgu)-4%b-ZBwFykHgqb%B((;O z@l*|VnA-fwGM88fT8>7|X3%vbw99h0OVOU;mltUby>+)ND4MHhAZBBMrCe>&CKrMp zT;300VY(LT4E);KBDO|e1V+Pht*I|U0Gkfh*@7KHfyr1R)s?6VwX#w}q10lOUbd@c zD|dqNf00(RdihlUQme&%t0LxQ}zzTN)9(K9IB_WT8T>>lI33%A$4wr;H9(D<= za3|nlmpfb%@_5)Ku)>{yhh6S)Nyy`2m%s{l0v>j`!zCe)hg||I+zEKtk?cDchPA&-Y$0xR4Jc-Z9*mxMeX zb_uL-C*Wb1J6sa-c-SSd!kvJJUG8v6$m3y`zzTN)9(K9IB_WT8T>>lI33%A$4wr;H z9(D<=a3|nlmpfb%@_5)Ku)>`{uj~qNynL-Sz#G@)@M<-EH#>>GtNjC9@!f6qJ@0;{ zCU|W)v&>RjW`Rg=%#vlcD3`&D#xzHU!J^d~%1ST+!+1~CoA9|mEvwY6z#J($3zorT z7N*vOZ(8QgSda@*Y-MZ#cy-iRpwwE*N;8+;u7Sirl0{6!2>%L*lqiXoSV$QuMNlN5 zRLBia6ikZVV&E_eTvn#jTXY5r64L!??o`FXIfPPt3xW_&f{TOVfld@>(zmtEkRFCP zQ%fxdo(LdvnMruaDKsmDhg6dx)$w4kI3DIM)0>5qd4-nc!o!RbeVXt9d~|?L(G(YQ zj9|G$;Fa1`z=pnbpOY_@<{QhFO*b|nhV(bfWatu?qVJk7#gw0`GFWDg%F&~2gJ!=n9LR6Z-K9fSZsXHAixW#et;5T?GHQJJqVOG%c8`6mHX26RK~LvotO! zFxR9unBheASr|zCO)m4q!8545nn16iVUt@1|b@r#raxNK`bgF$!~` zYp>;_)?0Gbg)X^*HCnwMUt`ZOr{^l>@^;aWk9NuIUt~0`O4jQN`EIK}OME&X4V3%l zYYWt6)K2^3OS9c%&*P(Av-ew8NKbKaVr~cvKV_DX07b|=qXBvCZ!wlae{a@08^QoR zSj;Z5fy=0c?GoP)#9q`XJ8doFu^#Bpp&3kTp<%Y2^{3J4kd!`GXE2JPZInPCh-XJE zShz^)`zf?ie`t50=W30)RH2-SP6L5+C8T)31Ph5?p=F-?oVHJLWKw#TRO*!GPB27M zYJ$#Clm(fi^Wnr62tNp6eYvF+;}PpY%Zf29#uhio1PDTSD25B!@Xa(28=j8g{1OA` zw-|9Q%`eHva2o+d>NOcmMqr^+c$rh!0tyIuNvg4QB^8Nuyk>$Fj;l$KrfbXfT8m{;7M#MP zHs!+^IVGiP1N1R0%~*;I>~eSqjb<;sCOYNoEr_yZ(|^mRG7}B?#1ZEx>4-B{fNh0- zNV3imw`>C;RSyv|^h-zF=$F9#e2|dJgHH4eL49#LzDK9kL?Ayt#ndnCBEWNNyHH`~der4eMn!9hfF<`d!-+K)(lma|#B@a9bdNPjYjTt{voqsVyhJEBND zxrIz8GstX`2|m_B@+a`Bibx6ct>xq{avyn^tR?Hn-^g?1MY5S}C2tTLsUkIG5BZ3E zO#VqeBVUmw@&oyqw2*V;A~*%Uq99SI=sMAjqA{YIL{Xvy(Nxh4(OglEXrbsfQK85n zDihr$dO);Rv|jX_=w;DX(OaT-MSDd1M2AGjM8`#^MZb#L#S(F#c#wF6c&u0^P7o)H z=ZJH~w~7nJcZgSs9~3_(epXx|eob5{-Xs24{F%5({Ij@CLL~hpLnI?5lOzd}R7s{} zk)%LklH4PCRPwZ>Lh^=Wmt?Qxh@?rNUyh7O!+Km6yir4zGK>{^IqV z*Q;KYUUgnaypDUdc-g&!yoY<=A+3_eu9z=ySWzoj!l@dBJCgPp!`(pYMIze0_bd^S#M;if^W`+SlUyugi zJ?#5~?*+epemD9>`OWlOUf2M!F|4RSI{WtsX z@;~VRga5^VkbrRkQvz}WZV$LG;MssT0_p?44*0EKzkcEU68mNM)Ad{3@7aED_G{>O zyx$*z0|O@prUotvEDL-r@Rh*Yz+-{G1qB6-4VoUbD994@SkTs>4}-o9x)2;191)xm zoF9B|@W$ZE;KRXZ`}_AF(?7ZYpZc%r|8)PI{SWqU9^gMH+r**f`+b0bdMg z3keO049N^B3HeLNwvc@xrv~~C96NBv!2E#^4%{^G!-3z2Nt89O9nhz=r->bh@+c@3L5EPGh_ zFzc}TVa?YMy8f2yHP=6Sz3uuhhl__#9G)}$&f%Mee=@vn#0?{6jVK+lVZ?_cnr|3# z!}J?&zu~DHcHeON#?Tw5-l)6rsT<$F@h9nEX|hx=eO6j0Z5cUyWctXmkuQ(@bmYbG zap9`)`@?sHe={mzRKlo&QBRHfU{uTK8%HZf-!*#s=r70kk4YF)H0GHxd&is~J8ta! zv5$NG{*QOh1`C zA^G;?*OJes$Wu%yZ>OA3O-j8xwKh$XHY@GXv`=RYoS~ZW+>CE$hR-aVxqW8Ktk_w1 z&Z}*Yn2A zGt8^XB$*kRPiB6TH7@IptmLDR~f2Ys@$eLmz$FNcoO%QBWdzpO=*s(D89bN=-F zr}9s0r)bw}PZmrmSYL3ea7y8mg{OQ}eER3;KX3T6{n7kK_pg<&eR}Pszi9rl|F4mMefF=+V+D_W`gq*q z)^$GX4C_9BV%ih0t`AwiYW??5DxR!-O8V5JPyPP4rGMM^bj;H)J`?av*)vVg&VBZs z4Wl=#+i>Z*qUS!_n6h!l^TVJ2^YiCl$baFmb-MM97e~Cf_Qm#>bT2i&JnQAkim??> zZ}Qo+eAADc^EU7Od&1whZW*>^?Us&L46ii3n)7Pi*7&Vkw+-L+_;&I3vhAl|Tk_gJ zUr&4eoi`@E@$!x#JJ!BQ-Yk3br?+l<>vP*2+Xp)ncE0hCG5>h}?a;R$trS(RtZb<& zs%m;?;X8-ko&D|yyKdR_c6CJcD>Wl)HoiCby~lS4?0#@J^Zu&$+iFW|oA(s%`Tm2Y zAAI%Uf)9_@W!HULKc~LoqnRIlxHoz4`wdeXYW5}Vdv|}r{;H4TKCb*E_LH{{#2$G2 z)3{G755^yS=bwrH+;wR3q1}h49o};!?Z`(*Gmd`z*}TsVeXjbv@rxy2G&SZoo;s#K z*81i0FE4(z`fKm6AN^*)H&1^%{M(A}CVaP}DX!_g<7vk~IiWo9)%Tk3fBu*GUzdJ( z@W-GZpFVlx$*rfNPSu>AdHSC}E&l0;pG$wf*!=LBkTcJp9e?&8zfAw-la>W7KeU=! znP30%+jYOa@_WqhAGBq)eS5Ct+{N>cUbybUtA8Z?vA2DG`^k&tmwYch+cBYImwk@? zYo>%@=vZSA^#;%x7(k!VgC^cf;DY`Hj&{T04}5GX`1Ib>$xtF<8ksXBke+0-G*to5 zXGt)9BKfN!uZa1IJV*ll{QUg=0{#61L;3~u3mM!$FtGpNp`oFJLqms#1kxXOV;?$S zMM3@g1qBBU2o4@FC^$HH5MF`@u|-1M0l?If5I;aZMp^O%@6(KZ*@oi_50u7uK(LLZ*?n-1Qk_ z63f3@xc9o1LGi2Jcy#=W`Ws)K)NwNY>rJXHn=~8eA8X$G$l^J3-)eht^N)`oxHD(p zM_WIO4x8}f(>a-c*WbD1$nVMJKfbq3l|6Is_a_p+Na~O^B(47L)AJo8zT0>EY(-)A zTa`oNDql1|p#4{vzI|!a$Jckf@@nw56WE(>)XEmm*Swu+9zGAdu>mH_I1tlw{{d? z|4z)?uLs>xUj6$!c|L3V>0gd5wqAIv+EO%f z_vgbZFWy-F+xvHqiTmz}R7ut3p!=7MO_waKnDX888_&d?EgpX6@zRK(@_&4&S$Y26 zg`)Q+%h&IX@n3iNSjg#}H|oyc`ToXqOGm}9mP3^vl?0u8_}I>`7MI@{*Pb!K_SM!q z9)9nQ(dp!YiU(}18()6Qw&>*Qz>gRH&X5C7`C2}|Wrge(eaP2Co?LpYYW^>c-xXdO zmU+7VfMv4pf{%y(799Okz_IG@G%uX_ec>OcCqzd_etYKSOOcfWlO@IW$KP$RzMXUE zJ=>W@ql>5Q+J4W$K=TW#haURZGk1Nx_l)82f!DrTy5*&BU%bt{U`bF(vG&l`@Pmts z@Ba3?pGR+L<V_Mdnaj?lb$hj(+8*&6m9~$Eckh36_$;tR+|?v_btzGRcRfn`JPG zDTTpZ5ri%9XQrW2$Ps#(98!`Bi#~A(kew|;yG=w<3I&-60YBm^8c63(aUPzChS5bT zta_Q~dLewfXgrrk40$4P))&wr#3YKMVeBo|Kcb_vs95$@_&Z7hF0Cd6X2ZGrWzIMw zcv^0fJQj};hSPHCNw)xoNL~^-@Ow!t)RFU&L2T8?2k*ixccOWnH3gG zs>>==z&tohd$~5dObs*V)OrzI+UC}wsD;AiZ|7%RB6ohyH5uq4JXYLaTe3`>?>L8= zUqcSS!>eb~BfR+qshL6yl=IG-H!CUz0s*l0tTpLj8aJOW8)z^p)E0}DF0SyA*IS&H zeA9H6BCRP|UkK}CmLfQ_mu{cv-zgfP^J_9gyD41)OM$`?4YlkqV+k^;1eR{#?%=H# zx4wu3`@$-b8P2~I7Vc=t3M@$cO3X2^27&$IBOsl{mzYa5o`r?*vIv-Y$Ux)8>ri%Z zh5X`m2*&^nW2oRnur5J=<3Z7(#O42d>B-tsIl|GG8DRYbW^b`inhR^-E9nZTl*rkY zRXF+|*F(MZ>Xjy%f29t!0mpiDRaT>4rpIR_7}Irzf)!jkeJ(Z>8=ar^=F$R}XN?}= zQw@YWEn_Y!!8&MviZC^0X5=#dP!Am3_QMYm;IZ`(iwO7wmReJ;u0)IbG?G7`y((b* z{bCBUV1=m^%T5QnI{k2cAAjf<77oY$0btAz=H){Rg#b51o6axDj3^$Z5 z?l0h4q-Y~e8cSs|mg>e>q!zW}RjSCNU!yttpaDTHhv2gskh@Y@M98QtBAWL7$mh!H zZ(Yhk6>fa|botY@7&(2ia`UrwvQk)oac(6fcg0+xjpeSeNVyg9U|5?er8{1fFigO` zFSy%F0X6`&4rGsOnzKy0{Cwyp_>Be5ahQo)$tIa5FwWfGGz?=}x@naG@5u&BGM|=g zVAGNfsfbf|y9~HENJT5-*u#{?mc%&x3453zzIK9cLKBT;_gS!8rwo?qiwf?l<>GNa zh7dnEw1|uENB4OEg(=1rF3rg~0YG%YWm+o-7;Y}OjA;TZ&HixDhfwFD3D?zf@h-Ud zuI8MB*+LDi^PFfrgFnMx-zl=-JX)FQ$7y&V`(r7e6 zh(7wu5T10ro#{o=K@%YR)TvlH3y%CQG^tCAa>@)27~EPa#32e0&jEMJuPlPEH(&~% z|XDP=5u{xYB;*<@0$lrF{sT*VHuuL&9cve|&Qu7LXz2~W1a zY^Kg+w!oGPZ3YO~U_l&NwEbmDi`r!A8a>01-!)Q+>)0t;_~wb$1q4PX7l4E09GeW= ze$rQ#!p=R|_aiM(>&;reP9ZvfzR{Gg)UDD=2}(Lk z5A-b^9>f%mT%m=We^$_Pp=!z&jH1K=+K(L=Ws{> zpQs8)#zx3vqZ1N&(Ku^@lTc9CSoMgCjet)|CAt)tqcs`2s01I$N!>-P>;rF4{&NYk zn979qe|dU((kqy7>#AAU$XLxnk0HZQV1x*kBQhFe&NMihg-lswEXQc4D12mPn7~>M zT27Etlv5=2mr=w#%W0EF%j z?8-MW8Isni!}gc;P!kBjQ5SFCS;k|M(O9hG)R03NVzc|oI> zDX@RnNzT0a_m^P;2S*^Y2T0%};cNkZLX5(c13*+3=RODObIlaV)hcKeDqiPIQQe`& zbAh*y{GE%ZB+xKk@K5-}QJRyR$8|$6gF|J>H8b4GOr5>1Gyij7;D(#rjieY}=ST+^ z-$e4!@$;9>Gg9vZ3(7@uF%!rH%P%s+nCqDv8Ik-F>|wc1I)d?+4`!w?x61wH{p3ON z{_+rchukiIL2i|M%ai4)@)`13@(j5~{($@;`6Kejh`Vk8|Z9nSd42QjxW zi{*au0C}K1SU!L(8BZ3IJDDFCFS3b|l2_yd83|i*j#gVr3l5f!VPp9IoudybycrWH zll#gzB`~mnSa>9RVcg}I#)IgUPBv5DNJ0&gDU7%4=D^0*P6`6=xuD6%upt^!unHG~y?4PnIyuqYFAi?s8=Dya32{+wDvnUElimmC9} zPJ@X~0uUHKk4~tRKs&_AlpHdPq+sPe4x2g+ns`g!-AJRyaYnbJ3>ZUp9%IP58)2}K zuHy^pW(&gzzQY0{gt*Q_3n0UFU;%c#)35@%haLtMGS?x6>~aGNH-;0JA53&Rl;E95 zr#?x>n;D0bDeHC+A?s!cA?sxTA#?`*R4E<0*k{#p6y?2jUX7?P&5n|&U(I@9oWljK zwz_OZiVxBucjCsa?X*#YIyh6Q4Jr%WkMf74^E4+NLSz(Y*YGD)um=07ShgV<>OT7aba0! z+TatFI{1ig5xjX*Smc~AS68UEl$pTgbl{Tah;(8aUys8xK34dN0tU#F@4mp^rIcjr}E?>?1(qMjdYWQw2=pfi7mg$|^A024+;CA8cIKEA& zgg(DNX&|ks-eSt$dvFM<0388OOw0xO&nW0G64E=sLKrV@kR)9 z{>W9rSHQ}T381QB3kmxU@FeJ%w4@OH06oN-u80cOXqCZ)ANxUOYFZ*<6Qa>gQ99y* z-|RaQFd@XHE$g-f7uz*Ibkuri*lY#yob$|oNR$6gD2!mJ(c`UfPe#<^K{Md^dpu~5 z2MucnT^mDBqXdr!O*=}D2Ti9?SZ~7PL3=!Cu2pzEXk4U)-xayz9uN8|JzS3mO?~dZ zc+gX)(p@eCVB3O-Ze8$#PoCrM5O4VN$1okMa+^CG5s>PKsr)$y7^dqoxG#$WVlVwM zAqxfvrMOf9pY3){9@Hs06Zi6U$`gQja*VJ!fr$untWj5f^5nN?6ll=d`Q7Oi;HO_h2#4!_2 z)$G4ylhU;!Mp!`s;$7Es_*DryH_koupiYs}$gT?I*`EY!Nw|r}vp)$3;GX?S7SH}9 z&;FzyH+8X#ee;Z-{YhXfu41o~XMa-XHz7RxleitRZVVzk`;+Jh&9gs=-O9vo`*G}s zaf}vlw~l9j5~_=5b;Ywk$?aWMp8ZLl9sbU*MtFAk^ZPun#_RR$@F$)f{@mVX&klcd zNjy9J**!p>9sblq_3ZHX?C|H_r;rIRg?aWTfuU5E{crD2a@w7Qr^1MECku`1c^8u3 zf5k4O{YzYSA=T#8(mf;7W9SVj4T3Mfg~8#Y$xi>KLwFn+0*7q{br5lAY`R?`iXCwP zPPXjloutakQ!4ZFR7nB*Z zp;(|)WUEGyaoNgjRrWNcYW4{4BnT-o)0N6hl`3@{lvJv+<=(-ma7&u4%9JY<=^}Za zU6HgPQ?Wp$!0R-Ul&6B6e^M$IWTygL6(%goQ)Dm7R4MQ|FKIU37AcjB6pNsy^gM+k zGf$DH%2O%w6eA_yyhx;#kE#K*h^nYU#xh>e6) z_z&;_AO-`H0NYgf1FRP)vxiQDa;m)9LsOxsA}@Aap2D6NkUBI|1<(}>(!IT~6i~q| z=#PkGQUFN+BuQac4MG4=PL-Dq002^V0FVTgT`@+PsaOP|OdvtU0#HFEivSA%KygM? z?0LZ|&XJ3Z=y>M$L>!ns@)xK_G^fSR_#9dH zZVS_r3GE?_$^Hevh8?jpek%eAksV=tcj0~W;ww{pswZx}B zyYL8*RR#dI!D+hBZwq7KAmri9tZk3Mv10YBebzA#;I2jh@R*&9*kU9;?=me80Hi+K zfB;Mgz)prdZ|wm9kg(QH;&1LxG65GjDwx9n08DII5jN!r0BGSzsG2zZvHF1vTc(69 zX_2ucco7W%=pf!aJcQsIv>^Wwrxxc@UUf#z{4Xv54}KyOr3qLXxni+ zNE}4S3}irNfI7$t1Q{3@M%Jzc5!#7Y7z(e01aKlGK4HF8GyY&iEtx+PX6;EQ-T8?y zF(-M&I!+aJ^JX;M~^;w?4!p%_GTZ&(7E>VZwGU^f3(-{1p-399E=@c-Fw4= zP5ZBdG6>#8m`?vqfomWMgkz1P&k#{`NHbx=f#&FtbHpopgKAAdEAa{0rYesnYknnu zYX~XdMnaghb7aT{IJR|LNc5U=IA%GmygYNq*Ksx`s zrnzu*2tvYdT)9PNR|6MNCe^AC%D8Ri1gL@p`ndz(Qgk^v3we-tpI{M?S~O8@ z0J(;PIN^I4)oaSPfvVsyIt_DnhcOYKCtd&jTXF&d@Qw#PcN&q2S`8N*(`Uia<`{ut zIJXzxeYwe3DuXYIPM$24$))kqsZ;TePmx^QV(yM{iHTA?Y)y~nOwcV9TwXanB&_Gt zDx|U~sT^Um|Jlke53slCt1AR~`7!q?-4vt(Zi_-EoE>L5x1=Og{P@}H})X2_IodndG0}DZ#c-CDBJtD=EByWYihIUg0=tP*=@mIZ9c~25D|KNC{(u6c;ua zi$Z3DagHE0Q*1Mc>9HB$a;br6odg5t^}$ml+A6q5arbEM9@D*r>Ph>%KmX97`A`Xa zC?R(sAxu2r@q`u9L3og#RE`G};^~NR+995R7(h=z9Ng{6hj79nJr}X36A&-TFX7pV zjEM1O{PDC!?yN;PU6H4kJKvCOBCp^9h>n8~g1pF4)&pIgh#3TA01WngYU4(;7ek7O90a%OJq|b*@IwZk@!xLEE4@98JvEMSF}K~NPqy>IC_oe z$|P{mBNO@hqU1s-QV0oXMG1IC#R#dfLMToM#S5VXAtclh4X6T%0{mzJJ{+;mGeCeJ z9SiP*EE*6;lB4746Qw*FNC&eaU>p;PX)%=a7~YSGpr&3H6GPJ|te7}(NM$j=1h`U2 zF^SSil%uh7J`jniu>xkXEIf2nmAaBry*5h?$NKUa&q|kz7k*EbOUqXPm1c<}x_&=mK z5#o3`;T__@q(Eg+LUWIzdIzS2#RV)0l0k(7pGcG$bb5FcG$ty6j}jCa><7zcv>`0M zU_$sPN=S4JHgPZ=02)jO3lwYzJ_;5|uphm2+9}{fn_&p1fx~aJAdIIb7Sd}eDFT1M zBM?xh9t8r!c+{Gsl#R^NX zsxDUeN+Gb;m+gA+9DUZJvsWB$6hmXj&rIdRUja0Ku<;O{M@Q*edibaYK0${En_6HN z#sVX6J>5_+^eN4Eshy0mVdob#7`HvS65ex`cfBl3|+K|9g}x2`xJV(EK1qZt4!#00zmDx zNwDNm@v*^PW+?)T6hbjL7bCsSi3G|xjKqwci$KP1iqM`6Ik}xL zLaHIuTP;8XD-8FGfJ@ENasyurrHZX(n1C2iB}fWt*2WB?Ot_YoWbGdemj6sN#Dx|deDb@1U+z+xtxiDfl(LS9AzA) zz}c+9Fsc{6b>FaIti{#izV6^at*_PqM{;bL?s(9H&E@q#F6gKnN(-hBMjk9oc_42t z<LgQ`@ar?LVQR2vUiVawpa<^r4W=FYEFYMf>=`#{_iZ+&PkMm9 zC_hnwoqjs_viR8t9CN@&k|}R-YFHR)0Y1EM#d=s+s^?GeqHD>+cP%HB7IN^jIOzE~ z#z{~ibbAoj+q9S~Fwg>i_KYe7|2;)?-MH~R%=U8MOhnM^|4ud0DIxG6SlFN?QS7vo zkeN;3sp1yOAr~8i(}-EANIgZz5jhiBPG?E!j57{#5fEn2LA+fayJVRQg>m#76%j9o ziDMLAY(!LCLL!wqJLx8*;y9j91wlK*RyxTYy$b4N^Ru!*p-bjjkQwkoa02W|d2B?S zJQ8NmoN9=LT#+#C8YfSX#vp1ilO6?)G7e_Z~PfYu6-hga(=iABjZmz=;QLel*I# z1DqP=Ys9%s$6g6qsK<*?Ig0|eAUqiK8nhHTZoG0=wAb05H5H`@rb zxh@T$4{aneA_0^PO*Lp;M50_Sr(FuKJbW^$5}({lD*-s}HxeFpBz_w>F)`k`0&FBv zG2rra)%xCwIkaBL1)ms=O-zJYJdQY2Ti#w>mDYEw^nA6b^?Z$e)Ospj!qa#fA1LgX_lI5PH-Q75MY3Vb=R7hP-oWGcoP_9NrfYOAk0aTemm`}efl8Q<1pC)=6!J++q@pSI?9rnMO&#cj=P zmzaR|=2oWJ#?&8dZtGygt<7!cnO3OM)(XDaLA%Yjs+DQ0I>9tvvia27Y*i=P>o3_z z)g_x(O(T@D+aw3uTWjn#|N1JM?I2`ept$JZemgVyn9X+JJzG^fbF`MJKib^PoUCbO zzO~itX=9p?HQNpzJHfO;3Fa6)SJhYThua=o>p|O5KnH*%L#<4EmF=TnPrhe6L2+zs ztEy@{S+$4RQ`LUdR@2sOYh>zed)hy;F|Ad$6V0}d+V|KFwpZheY3^Fsew))2AnwsXu8e4Py$E~)LwFd#niK>$|-=45BAMFR4_MA9YbJEs))OL(H z3djQ{UI^rv-ImyNz-Bwiv{NAU_05g-0OX(xkZ*eig5)#;kX>)v_8?9SV8R2bYCmYJ zX$4F`x|E!gRW@MJN9{GXdS`OH4gysmiui+o7-j3p`udYc5f2;3*2WVj7=UJLKPs@b z)tRkcAX=u`-Y7cJW@iSVXph=#NB7%ojUe6=^%rf3q`0OTMBG)hpiuRD+W%n0pi93p z0iZ$fPGw_bZFB1-s!zNIxhmutMzX)Uy8cIp`nG}k*0wb>lGet?)*qQOjHr2k2dm=z z+b->pxNqN=yO@iNPi@ul_l~Cd}%$nR$I5bDG%)?_v(AyudK8UpTe9p@CtV z8X7JzQ1(L8ZaXuo>G6gOhZ-7M8vq7g@VT<`LStnk(})=%tWFEiJ*ud=GaEM_x0S*le)VGPf!1JcYL%SOr;PqU{({PB{ z1mpnvr}r@rUBK5wIe?R)?gl`vX;VYPZYT{8%mo020GpV{8-Ox;L4ZtUB_ucQt^|Nh z_#f$gjse!~V`@*^nZQb@gMv78sI{_#8GvD6!G+g3aGN@Shz@2j0IOsw8(O&v0TPx3 zK7U!o9NO1Qh^{V@LHT6&I~!`x&cfdquOA*}`Dpck3mqZ*^5g-6uOMKIyP}ZLix| zTh(gyso1x(X1lfaSF2yG)mpR9TJh};%-1d%4&A(sI%4pI@T?9*3T<;)>vx~RavbE0EZeY)OUcr!1IBfRkb^7>{frsQ&VL< zu*C}SytY?ck5$+m04GD;HGtfX12r|ZP#PYr6#xnW?y!Dd1C-GV0<_lELGsSpIsmu> z|0BJJtiZZzYwdQsHLwoqpdhNMw$yc42VfXjP_d5#cc24^=&%k3V0G5Ink`&~00~P1 zpLf<-tE#u`fU^B6YHMn@TLCQ~%3d>O2L-&n4jBdsP-I6fP(?5Be89Q|X}8yS19$3b ufW;TB-a9|3t!}722gKGKw2EqWT(bUQ6>r~B(FSs@f|#o9m#7|~F8m+FulV5r literal 0 HcmV?d00001