RgoogleMaps/0000755000176200001440000000000014522154762012501 5ustar liggesusersRgoogleMaps/NAMESPACE0000644000176200001440000000062214521730435013714 0ustar liggesusers# Default NAMESPACE created by R # Remove the previous line if you edit this file # Export all names exportPattern(".") # Import all packages listed as Imports or Depends import( graphics, stats, utils, grDevices, methods, png ) #importFrom(RColorBrewer, brewer.pal) #importFrom(PBSmapping,plotPolys,calcCentroid,addPolys) #importFrom(sp,CRS, proj4string, coordinates,bbox,spTransform) RgoogleMaps/data/0000755000176200001440000000000014033034346013402 5ustar liggesusersRgoogleMaps/data/incidents.rda0000644000176200001440000047503013047107225016064 0ustar liggesusers7zXZi"6!Xɫ])TW"nRʟt<3n2o_&u?T_J-9._&tv&%p AEcjipb~PDNGZu݈;t;ĪXq Yۦ5␅:D2D޿;`A+ڴp^iVdQ&"4p`::E4I,mZ_I4魽 *G^{lў hwWm֨c6T;EV5ψ)Bvv sWv1ʦJޡ%7SWdI>`tQ'ANORh1m)Wy]%hqM `jRz_1|'he%,9)m>{h䨗u>TfMD|ܑEPf&O~'2)N| Sm"WB X桻\˻!:F4ť=p[Th鑅 ּ_pˮ>]/9u8v8q&&z0=Āb흊W}|B&[Od>"ZȝY* ϟB]5u9;[3PxGW飑7S RV7Xڍ$.J;c\~n #gbz +}y5ihS|'>[<?Čo5a: Z948$ѯI42IXƻl*j" \I7E'{46R6d%SR>Tv1"(nJ+v㳸S%Qζ:{=b2szs}Jg0S`0W9,)N@IM  ӥ*,̺/T!0x\C)Z~$~D2dRVsô'OO2'6  w[S;<2Z9r# ԁ *’Wdd~_e Di!O7ؠsQ к10z\l"r]ĨfƩNF|LV|_r29H U)l].MdISfLPwD~ҷ=af<~ɻ]ߗ?i Y+K_; VҵcELG:MnO !ȒSm*_Pی s҂eg~bdaL/q}vs)6cCR HJ=|Rr4‡څ5Hn2y}$'ꚝiǝ7uQVA`_&k;癄?p̫1DOc)n>fɨlr~Lf/ !X4tWPbGCOU|܄D}6$q2| 'sU3.7F“yTܦpU`Fu,Z)X抏z&sI`$o$b8l:tq]NNAؠ_*A~- Kke_tH\!tcD Ts K@qv0ez݈bqDvmGEMŎD_ypǘ#~Iu/OVw0אv+߼ x+KwQd8UDwkRfFu(~'$% >v "Th h!J^|@Upd.{:.H҇VwFBĥFN{H񀽹֯t+YBT`':F_'{+^}9 mSl|,xfn̓!SW|Urܸ;syb8n[ĿF( D>~r_}$吐8,?@G0JBi+z:h$&ׁsB#ލvCʑC,&U^Y㰂~Ǯɷwig̿[[Bw7HgVDm*oP mo5ZT%1peGJӅ2?X;jIZط`ʢ$^Q+gAխ.W%>2(M¨Ë}rG "!S%}҉(PexAP F{-EB GHiQ'_W{ti~7 ]mbH;F鈨&wG<^V\X[cH9"RPT B"蔇Uy[ Oq+w /C!v^ Pu 3 +#AIqc^8_ &ڠn(^ .Jh\EF%fv6V,&\4Pth"7z(#T~;l$ۙA.ho]hD+_ mSD1ڀϾkg<Sqy f3k37B{"ix;󓫈C ufu,cZus 0.; @z뒴[uRvd[t&v,z;n5 ݤ 1}DCSJKo =k CʹF6D^$NjO-2cТ Ӧkz)џWzjb ۽*mTT E^Rf*kP k@l+ !y׹ I?q ndGI? =1qQE7GZC H:v~CӍg}/ }% i,*3tEx:XaDSKOf}*y*+2>a8QL8Ϙa7]8l | (Rx0nYJzD}3R[u¬:J4.w_!Mznp)+A2TE)Y SJa\7.]MUJyԧ7vP*S'8}Ӌnʒ4?pX2蝝OiugHcnYIBHqvD71iJ ȣf,k@a 4v! :B;(B>Ȕ Մd݌3a1ޟ K;3j?M.-?"'!J#w5sMը-,mEن87 h5*=Rꭸ‚QEFyneHbٯ\d57 Mc  W>;LM .Xu#qF 叩H|[oa,gGG ]=4ƫJilb9,Fk&ϣt?SwIU^_^_?bRp"~e$ cʯ DLI*vat*>EԤ pky7aF8/Ll㳉rD6 ӷPkkϞ} qȎ ec?Xe1)y/씧Hjb <>0r;g'$R5XU@V 0UA=*ɭ{zwbwm;E=ݔ4r_?3U=.E0P Rh~5~TrHҏ[CY649j0gZ.`EԀ|wԺo[h,rܯO ~7-5fՇpjDYi't1pv";ǜv3IT/7 } `q^^.M;r{Nsζl biJ=zRqOM K~^TӷLw#$v@k[TUTkM9ۊؚC  |%P C^ϐV@LSu/v>`k` ϝneG?=Y̢ΐ*ҎFB`R4ȋ/\3o.i# tsbw Ļ_m2K4ݲMj? Eo|0bjn(/aȜll1pؒe7æc:3HMl6[rRa2ONKg?%]Z2oqrIe>c<*!p󺡪:%w-S,>P?0룈C%edI li;^!_wRF}*D8-S~F(DWވ4P|E,hFâu> ʂG0=I@XTVt_"1Y2+7ҩpN=Ũ* C9s,35>zyXobEԍxR ׼ /7i2'u{pk뫾h <`'UIq-sz*qGQ p5M P6߯Br#u$aSkWI6W`IS`֓6:Y !3TdqXnb u70E~!P.x9*;RbƦ!XWMM|y"W(D)XfĈ;aQ/O!{&6G%W}j[A{垖pt5]Eh6XZBت\ a`o@I2ți,Ix@pCCqq詫j{f&0 ]vR.~\lɝ xLL''*AK.Ir'jŽ;[.#6)BK4+0V l&IRoVo(&] V4ۖlwؗ΢(&,{?۷"]ٲݴ%s7`*߇~O'${enqH)2 ^ /PeBTΫ8Ė@I-oPoBH2ӎ*7˷@2pb\E9ƺsQG f-Do3ӭmXiPnt,d= ˌR^NN+pKh>[E7}/GtfdB3w /Q/ S8@G.d+:wL0Ӣ師DЃZRQsb:Ajی B.],tQ P>T[܍ WFW4k6eG:}>#!l\xUE^o]渧F Sq.(5 s:Չr3GZ6p/\=7㼧TϫtIRb.3e4b.Eg W]b/"eP-1@cgޜ)P&V%@|%݃\:5AQzcRO^vnw7myDRZ 'j-sePBbaU֝ ~wЭb =ު6>,Kj5+;?GY74#4 qx˕}򪬡%ﲬ8YgLw p.r:FB#-z*ֹӁhF4Fr ,'pTT+ղU2j+wkF'<䟍]*Ä:W*ѿ@#E?!AE^32iIPU%o;SlYinH3~o=g}Ge- 7e@ _Y,U8rn͵ڧbdBo6?O'磩u ܙd^YW'0y)e^K:NVYo6ql !Vן]#vWV(0MbTzp3I7W|ٙ%eBbrI0g@;X$p5#WMlߞa-ܫY3՝.bJi l=gqT=pԱPF2"]WWv[&_\,tʀ[/ 9D/qΒxBF1i+A t'"~oW"z]s`t> vIJ(;cd2j|e>;t&Jb onTM,$|<&^4VVBO`+픃$>ֶG\ kO㓹8\W1P9IUӱ˾X ;x_IX^*OteQhQ3tBqqd@ͯ"SF2y9I1h#Z6f!XgםB+,v *Y7 [Bb\ˍ3z֫QOJ^yvZv|~,3hXgy?4j!/!('W s Tž}eO!pxɎ8G|bn")lraϿ3֜9lQ)4qj_n*qin=bImL9 2\|O=c֩iJڜn?=e)Md3׮ b9@*&MMJ;><§Z 7E]`w;JL$9at".qCp:.rhds h"QD`loRGo^h(tm{if!~ZK/YdňZOii]?/*c9bsefЈWޭ+[vH^+gW֘+jn~]AE-BJ,8F#xRlURl YZR Lt;'NGjQǕ'~@^˳R-i`mߨ_w7dQB ߈=gz{Z8x^n8DEJJA;Xx+$,p6 ԓR{dw^BUz/ 4 S-X^+S/P祃pqke/7QK_񲸳Y F8zBCnV2bdlY-H P>zg&uHht x:H:2Ku.%)?gM9թTr?؂`z&/Om1d̘ZJapټQ?/R'YԦ_+*{YC.j`ԑ1*[t m2xkDy vܷ+ܒz* }"knݦˋE'whݐ - ;CZ9(_v /Q"V)|w23v4;{A}f~Yab$8 }3NF(i,qKjxU` vB!)%db Ɏ>_XΜ뚨E9=0dtڤ$bbTW-4,YQ{0ۜn1zCe0: ܾVGAjI_kqIRɑL$1!B gTtKH(l;uO7BC}Wզ[^Cg~ۂζut*(ǡYXW%ʅj崌O庾!Ѫ nxw_[B)\4fȖ[2< Ve^S/Fj`q^X`-s@jpLg( rSpW2&m\UrW,L*&64^}ɐ(:i@WWp\G.N~Ү++p*77BI9@ըp(]PЊiwK.7r , Z%)Rכze@HKynˠ\ #gyNw^zI !<0o^ˆgCNe' Q"TyAU=Cs)W3JeD3 dNOQ4I' DʙC3m~W=|]T!OcT7+B<ܢ3w+74jXUvd-#0B8{e⧗U~d02=$\"Ι?S[A=Kj Z$=Lw&ƿ{ryV%q7SBh5_tvLFCI~R|8*T2U?8„$^2߄qX:\%*1tLV) "s>V06˴c.NJBozO8.٠ǵ.݈9+|m - q[#:sߞ,>PEvm֜¤SHI9o5I[f3ma2`[.6ccfXNN. 0* !y 00mO+.گ/=+oFSbES=E\9dٟ071+.GD Qν7= 78NCYh@X)o""(?v1tH@.zk1 d]?f=23K`s(Ziȹ!}oӍȲSoi:[>كHkKL֍qQ>{QODwBvîh{u г\weVaޮ|\ WNP 6yⷐ I!r9bnr C zB{f49R@t(ѫ|"p3`ׯcKy)dBXs{9KkZfp>Yo3ۘep!W:e(˟. e$rh`cmU+Czzv[r7֪M@)I4R_)|0ִ;On:[dg|k5~(-+rٍ PEVBv)R :wOk&Jb: ߭cOtr[3Yyy`@xrT Uo vKN_K&͆K GK#fR 3;X}xcRnxw7D [5C5/7W9hiQPjXwvyw Rxv0dĽkXqtP`+M 6v$$dRI=dޠҍ~PߔMIW#<$g,v aulO`GudBfuOaJ]od:b&5!ڬ< O4EΪulڹ0* Mh%V;XIKk).RhܳՄhNԡ[/=!5˜+Ц)3n"/1w-=]C$G?=ܖ]H%]ێr$,> r3~r rmMfw0W3a0׍5vN/| &74~o|JGQk X #EQ B1K b1`uRU #ovs7{3џ_u?|m]G=or'ddjY)"IDYMMU?ě,"16!)T^'_g~/?2nW|ZBxoș!awKօm>1=~k,pZֺ 6/HNnq%Nf_hv( e\k3Aҗ2 w;F ːP `%BKE ,+e}}b#sDpumko˯_kg+]u>X:k,2j>o}׊^B~3^9G ϗsWsZЌzEe1$?nr="מ po>H{pЗ3A|D3n8 gj!*rpVCEQTE4)M*d CԞ~ҁ\e/ gC`a~KkMTmm䞾Y(nJwYtcy>RY9gv!P !2vl-b?mIdWnEm ۅz./zQRM7&%IjoP&Xmk JCeum=(Y}[88|N@vD6fH xᚁsnsu\HKoѽ؛ R9T˹E/U#mRwPьdb%~#̜ J4,N=vcʲ(kOUu{Ό&gL\vDRi mժcONElwFP -deH3O\ oc$1ޠb)*Oaó|~99Q)hН} \y2:u&Yeb3Y2QK~ӤoEj_*:bzPa2]o 8#\HV:={JXayh(pm4y!] ; H؛In!S6# Z,+_Df~{"Aw!8ʻ݈Ő?Ŝ4-NVsx먙[c YwO:^TlՀjmh} A= PqOBbV<n y$0,jv`neŶteFN^͛56$k~{Tbsm,E/C;ZSPy D-p:y),X/hTL;gt~,qY~M.@5MngL{We4X`1έqL~NR '}kE׆,v~Ym=x9K/f*T9+2Yeg7iϐȈm떸k=M"x^8y' fp﫚jUa8vK}G;QW&p59 ٦.5o&`^.|LPe3X @^ =^H/\* ;^MKؖo7;|Sn׸ytq ԌMpAf@%}%C-~˙kv=@ j<WQGܯP'Uq.MȳsPvʻ,.}s<1Et!Wh 0gf@f=aj0[ň 4h&rHo鄴wWpw-/eT 6(0Z&b+.g)9g퀬TZf pu',$> opHa23b5K3G_&1~+C,wXR;-"Bk(6O4 -7浧 69=y xAR))H^WTF[D h ʈ2g w[ˡ5# ^}pf)Ta|F^{M)W}f(tQM. "枉CIek1 I,t>O (z%M;/\n6+e +Hƾ(og@#Ms!75pjG`tެ 8H/+h%aWLV B/B֜=L| xuGTۘ* !{t"xg$H B&UxlZP>M4 Ak$B .Q͌cviR[_zGЕPY)T),Hg@Hj}$ O ʶMږ/XO:Fb,p[XV 2 p ,([ ?z?KccXܲ5`ŋ'&Y_l /3y^O[:}Z,IZBo oAE6*O׵v9ڧUaB3>E?ˈmNt'Ri #C6 >OB["fvȹFԵXiֳ?Һ4K\-250a=8M fmzA[HZlm]Qw̡H2(I_Le6=^*$uqO?<dEŌ%%tj=` \'Lu, ޒu##DI|@^CѦ/Jvxk 1;Aq?n1rGN_ %Ck7TPidTξ[JL\plC[9!IdW#mW$(Áۜ|pAiy~jEX0uj Q65BMC(fz3[T)[NzE%<1 0ڕB\=KזZlmaqFR+SlWӽ)# R*ejr<YM6bǓvl*_6F )R^XP;_˓d$.[n1CQvKҬ8WΆ֓$7շ@5p,z\0K؋uiu-,Fh,_td۟=,P;+C2w^ ,s V_HЦUba4a-*dn[ ~\JbUЬRPtzeƒCԣ{ p~WndaSJ7-Ӈ^ʏ?p)Zpƀ'MPryn 4$8I=S[mQ0BqZy-8Ƶ;F9VCGHxbTa'`hqzf΄%2>ՑjK۹"y1wbC!gl:3 Z.o#5?ZuҥVI00M*T yeILUeyaڊ`yFCd]KO/1z○, 3.ӎd 44m},hW Sf8\@$4驊R EK-PoxVkKûq-XDY*qr˱دZ]n.MkT3`D#>Ȇd[9a:eζTsM ޔ*badtL9O!bW[b۩p\-$)4?7tɁzdDs1M]Si3Xg 1yܝF@s6E8|j^$Ed푭=ʜ;LTys\b\ Y:  R2H<'lTm| F)o)ܱ*& WWl&)Ʀ=5p< 1/Rp헧>쎔&两.+,χkE]~WmK/>Upí`_\?zH"K;>YP{ !RٖکڀLZR]) 5h1/ {$O_#R<%a D imn+ .'z(^~X <l$Ag=b15CYt1>8`F`tOHj-ܔq,8*jxmIv˭?,c(P +EZ@ȨQz][8bAr~EۆTSl: c kt}0o\\j"HM # h_"}%#iMa˪qjHgK8`C >O79aW0pj$|`k|L<3aIFfQEE*vYiu+D~iNCiT1в2/nu\xU:wpȹBQv]M4uUY ^5K(2aptd-7#BaNݏZcIੱ,A௨|dxo+s_Q-PT zE3 $9 Rk&["yAW=|/|*-RYVYa^qꈓXB;'q")u>EX'vZu^ֹVGq=SWISe25i:oψ~ڟ9 ^ό{`)?lLN *!;1AF~m?[q2rk^!JJ:g@L\?yؒ& b2Xrg|sCf%I|pw:qᐠ\m`~zr*VWfU]&a|p˝C36Y|:aJ~<+,mR'7S{d>*$q~2EGvŒO` "̥1ݚoxxWǵX٘'/~p (h7B݋-qMyt6AR'TKRI+_az`WT+#Sr׀Ԉ,MaJ<+{YHTQ4`ua #T{#kΠZk'dgFwpj1md>K1=2"ع9QqmCD>GEf!!QŽvzCU''ZlXr"ݶem* 2'#3U{R|eI=MD`YQR r2:ZRnR M]gY6vMGAbQ6Kz;="o *UQh[5A5GrD{ݙ6OR"={>[g ̠QB꟫!Chzp0Kb=|pŨ^Ol+.lyAK'q~|$`i-m0e>@ >t_ҺL9}S ZPv=QڟnCt~OC1ìyꊩOL{Y8aw#[*cN.NgN mawJCDN2=T>՛cP,Z(n6n>9v)wik_򪐨{a˒8֮1ǯ|ދ 񧗵Uv?WӻoICWzbh,XKeZAؑ`reuWkHrxn 2EEG/l7Bߌ9x;aAm ߓ^E ȮK`( ')-Rh:+i:d7ۻNf>08G?k_ߠɆu`*Rf$YnKoHN [۞XpBbi G++<NR5)rdzh!U;Ơ-ZrʪېφZy"pn% 3_sCu?gЅ^RnL Q~4x*9UvV ŕXJx!=mpJGpx [M cπމ%_G$;=H`^ܙw˘!PQߛ*Cy,u%KSybfe1x(֪7)s~'aּjw^rYH=zz6EeE?`8)ӂ2=4/ 86]6>]X~M,a[Qd]0{3)=;, ?9[no&m1僋2.OVJ]:;CNdzxuC+%RII$a x6800D2T,"bX[=ZHG>*[=jT,\IHI 'Väg3]4GE[?a(-}PSAa+ˬYcg@nJ]f7Ŭ+nO"͎~p6jXT9]G ò琈4aPW KT#Yǩa08|­PDr ae]&Q=Bh7 6# I8I.=JVd -b]nYi9؀1}KQP1WNDwI+ax @~VrZ2R;!m,WY{uEi%y_ihݟD"dyHq F!sJ_'#(B/ý8↧VvT[sfC<d"j}44@Hk}A=<zsӘX@Z7S,ElaDJ-#@g@GXx\W6Z\gIOgqH0Gt ~b !D]/->xl<@xSqY画ɥZҼM-.kQ֏/tkPy@CX8AC|GQH3W0$).I &\NXE$s"]z$~abii%yke6Ip%(dwR {5ڞctcY3Vo2RB@4?QqU]DeȍO.wr| $ľ\?0Nh8D痶VOߦavImd1X \?TFÿۮ/R|GݲZnGoy7tuN[킗ѐӽn׭,Df:*jUuLZ("ol69J=;Zm}}e%"° &Ll&ɒrI72z Pm! "U86a<5Pmh5` ;bu lr O7kkzliӖZIg]iKk0@0Z|݃'{ \½xgoͭ}ǡVe7ECBbG[z||}nXkM9I WV9/\6rge Up7RTKɞ՗F@54)!=TN껼B$׫!J7*PR6֞ZPz]Oe8@D8jȨ*fְL^̳x73oHt`9ٟȋnd:`:1}k'?LҼ,}5,tdd R584pQD-T-?ik-{G(9߬,³@ǨfUmZ_k_d!A=f ,"Nӎ\SU\Zy`9ϩ^gWdH|Ő&ici!Q|\]|@bF7 G75/ڃuIFĎoV#4yfLW`&R[(Lk&Cb'48eW>sP["Tve3~jfVZvBN@kn9neCuiԮZͣ)R>ϖV*],!}BmlE>Mh-gtJ-@Ġ\-ntŭ羰ig c2#,Ж#CDYqҲ-XuP4 T-b(kزc~k&?sv]YT)7fEqK}z-ɰ˦][Fy mshBȢ|T.W, | CnoFZ!pq#R'y߻f f6P,֩R:u\'Tyє%zetyPރFD!;(W_FE?}0H1RղI`"ᙼ>{6O t5. Qր(խ=M*EF&䟤.fQ  W)1^>< bSRؿzqL_!5Tc`@w = j~K-pdk b8T R:tS͂W'NxM6M<+ƑV7E/#l$5j( 鋰,8(M̙~9BƢUhe+*F%MKɇ/2_c(1D/__yŒ &kA9&#:NJ9MF1$Dg]`s}a Bq'9G2 }wb'|,Zwn̟ou=goG SN81_9Fz8o uk7+eb"jnim,m7~"0Ї~Bzr_YN4~T:aQY&B4ܰ $9%:\p&CI-.+ݧN 1eju8"S d)jit/NhL#-/hfByx9~};DNUjs/-HeD荷ѷ閤.X>!+j]Hs5O&c4 RMP/*mYH>t3hvlD#yqNre"3R`-w?E#H%vXu4 >|X_AE/1m(-U01oՌ׌2^p !K,,gz΍[Lx&l!Oqs]9WV,|I}e/,(}L;@/%ט6L)C_퐚2o sXY qQWpq^cev{U(~1=^DB$/4LE̸TvFGɋkmEj,>#PBTS%'a5=tTFz_QQgU4/ͦ~ ^͜ 3IO?T~$/I0cQoѓ.iJ<!) Pz(Cꧽ2<-u5| їH#,z{o.cZ~d:IU~잎N}FDmpgŵ/DK"B vOH.oXPpGùP7LY"siͲ;7! w__F($y8|j.'n3  ӡ9A U {sƉxR@|D(_2NWS_/<VQSw_$`AW‚zAXgjgy |ng=*ݜZ.b6WU~Qu=p` {腈r*K'zkQ$CvT dƓ%GJ/&Ⱥ  X ٴg=2%p?b,2n21sG@h@Z+; /Xָw10GktW{.zD9 Q7!z rye3_sB(ֆ1ac8کk_SEHH}XT8Y:%"52j<8U2\Q=.94=[mca!!?!p%L?YjgOԬL#*6_6M 3cO CGîaNv+5MS<;9%ňA$ R9[F(mg-Ԁ+rR簊r. :ŇoxL׾8=t*J+V[`1cϞ&XAЃ8MBܧhw.{oS +5SMa01l_=B6zjx3R(5pcFpPvDjϮK5ek N>5+VhH uW n[)7ڜ?TZ)?rnU `kpe}/ Hb?Im-P^ƛBP6k6Xi y_%_}ce$uZr!6&C7fctvNVwE^DyLCV]]2$:hZeS 4 >6XŦnGn8 6k>fuL j!E4HƯd^ B*]ǢmGG)Wr'V׮ߨQV|^Vxxyóv@^ ׃q4ǁ&6jW~:NG_>k{t ^:1W?j[̟fr(W÷xM_}yOEqS S67񰞔 =TւUKgWq D{"nllgciǒ^>L 6ktQMߚ: G:ETo!Κ(4歸&4i&N֙nQ ۆKXTzφdx^ WR;I/0sK{׌ǎ"F!FS9.$gl.29Jad߶;S_aww@$TϬ*_ ~A[Sj $ d/1ZĜY=ՒLLSUuܱS-V6K+M\YuS;ТeJ1JdS\IjPk\DXgn)uNTWϲ(9&yr3ه/U*-T 49-{/&O&C*°L1 =p0D/yPqZzJ{>ٕgS3DW8N = !!tMS_ TCb=q Q'g+fz+I@<-'N*gpl=g-ɚqu\0%B,A+yl 4N؆~a|_1О1>|1 'fR I;hܛM+c`]M]ch4JL :"zu3戙EvAFbmtTsTnڮq~!+HIAlw_RPZ咧i$U@ O|_C~!B#4P yҸ;< X]zҊ»&p3N8jӘ=A?X>V);Q !lGl%#݇Ө EF8}$Nq{+S7KǦTWƌY0$*@[K B?<܅Þlћ((_&>`Û_4@y"_VU1,QU^C:͈v&)%mzcId1ɽq=J mpPZ=8ek0-,99GNb?G^$vɃ̪GD__珽D u vWK@e׸H[| Ē]FBeQPfłRomOSfU03* $9SqOH|k4|jӿ\ `-P`ש⬫ I4O&Km=hT 7HcOT {> A F (]|v޵g  8ƿ t k7sABl&(1(.E # `wɗrÜ!ܢFc,'XB &~i$maV.l '4ȝЍM_(lx&E۪`]Æ;N0|!,(R)K@\azK't"Ul]( >Bߛ^Y;g@>/"HJG)Dn)l}bo:ʝB?Zi$Tjv*?BY;j~)iD.i >yj}SfWݍ9.T肞3 w]E jaZ{]M΅p'Z9&5W}&WzsrMM Tr-sJХaFFH@E;i @&\A-CM˾I_dvUE[2mGȦ%[s>g3ikՕ' ~N``~/6ĭ%՞%+ QgÁ%R j鈘LT?LqX.gJH$.w^MY}|%"WyBNwEə ݆^)YibT,5leAiCqp tw UɁ\Wz,;pKʔaAN|S d5#p B ~zR~x0pjc }:G!~ݬ[ms|^ 4!W>N5Mq^XE7^KLhu#! %M1jVw61]bs.1gIj&W+=Kdž.?/7GMN_\RV-Lˎ3.+R$ZUb̥7 |hrjj:Jx?z[hUŸE-='+C< oZnNDG \hp;x(9ɲq#>0q䢧/1Oᓯ.M og_ .5`P5-MABNo6B)sz{%uwܵNft'Q-΃E D;o{md+86Q+o]H{v-w lQ.J NX ޭRw宊ZG9@ƪB^hتa$K-Ɲji"ېo lq"A7L~E%x(%62\<<C܌HNL<ݭdzkɺqm^Df8a7^[mybrKa@/cM[cĭG욐gU!Y1smnU)aP2$}y3/aLO久%ڰς[4S6Z%ÕWw2$BIg(8~n(=G-Hk\o/&* MJ=,Lkq]W8i8Ap{+٘g6J0 #ގOc}2KyȁXq HhZXu1jRd>pc.KRĐ7oo2HTOh,y{@uJg22I*qH *V  k[eIqf_ZHI{20LϮݫO]N Ho_ЊX#~ֲ㉄`t{Rɉ?r@b7|f2$slflGӯt_\-uB d) E"-A\۠ѩlJJa-Zc|put P4Yц,yFPlxFQDңT:JTA!\yu:;xDL#]g9}\pkl5nA3Cq {Wu֙"[8%67=emMmQ=ljeoju eHNϦF$~>3'N\NҀ{wkбݚ j╽su<31ҐoUrϕ,bxn2ґh?OS KKEWzJ^EԘED ~2 Ac_gig)T *+"i6e4/v2B ()%׏j8bP i3qOyU)8Vw6 MlORo H&M=DV\4~S{!%DF*KX+>tna TdVl#"cF%ńn?7KWbY-%JpV/e \tZ#pKHzI"Or׿G:M{_d t5$[kc/xөt \?"k4$#Qn%.Y:esAY}LnOB?W!1Mk} U:;=ѣ|n~Ea c$ :V}85~$[1ZiCo :"Ryj3ymIeڅ'U^ix^A;0t)Fm i/ܓb OIN!5נfZuTfWk|6,]U?aג{Ɋ?s(U ?#%j @d>$i.4iU[W}0LrDL1 "ǘX Z9x!X |L 螜zim-mqZMl Y}O%݀IDvk1GI:qj~T6~lRGvb֘>$Z•PF0XUB<ҳ.+ E?n+ud|ce%l;9Z}K1451̇,ټ e|# o}u&?Fpֶn{"ti{n巣W>[oNh lo5-bM^K|xB$WǗZ+ݻƀmeTDp:W'6 8jpCiD@Iܣ& :%5)TuDn(,FDDe]:,* 3"P-4cƋ//\=1բyv?DsitaEB }!ujŮT֗f o^.R yƗP!,1' M( hO5<@zA<}^Z  :{N:qr|@I OVKpq]ʙf庥rOh#K}nX~ |ú}.7 I-E썸 +AK/ 9C\?FƗ׭^=TN>Jtq^a-QP~ʖꈺ2mSd0C+Sg\Y9+:vIǘܔd3>i}EF3)#G0b6[|oo2c(ٮ9F1VcjhlCA?cv7oen4<KT£6NFڗ]OMIҐ0lߞ_H`}$46N} .0'[%z]ֶdbrEF,I9O:6K̸ 5N?Fl־G3v?hC.xMr3nUvmb ) t?ihڃt$i!л[s=֩`>u8&bZ/SR'c7ktgPl= ȔZ$ HT{4xpȺ\'{].!ANI3&7EĤu_aFJҧ v k)ԐYU|J!ڭβAt!ÿJwNZ7|*{0σ.2Cd8)O06cV! ;xTLŭ1^b g WqyJUb+h(vIh;ΌIn,sٖTZ5iv9B)sQGGB8Ӗۆ]ﺁX!<}G蛥aV;߷1(JkXCN1A]58^sNJ P0T!ܖ`f 4gl EIk \K(}<~"UڊKT}N/.ćn pgD8:b*YƄkh R4zBsKU "[:BhM(閾l"vC#glzݽ62+sA|:&;-QG4JGROZf~h4vIWvt}Mմ7ec@QCppJM{` GSjv@8 ?3:zү~>isSEYO!(١S .n-j2o2r:ǖ$uAbd+0wk+ZyE^_>m`& sp3KUnB_;TR1ٓea6 ֨騰5kTI9.4gp5+щ~♠*u@Բ])t0gq"W5g.e!ᙇq 9vtG#N~|tjɨ?VUڍt\ST .K.%Rb-`3?R7LQWc:Kqed(bgjD6Q!vkM8cF%n=k#}Dw?B$ @Ya= sx"P6-U+V! lY8v0ՃQ Gȑ0zXn 8F4_ -,&N_{E <8oI!|!bg֑S]N}jV>s$06+T^ީk: Oq(̧ 5t vy";gayoYLkg8/Z;,U^#,r'ϓ9{@񢼨<ˉi=XY v F?:>/$ưDn_ۑSZ h"*%7Uga99%L˔@Mն^_-T]ĆӋ*g8m* ^.>Wi ya&*>;ad@O>M8K?L}ƘEiYBd7 )ndk. 7drdƾ:6;l-9uG_$ $zG#s*^ZI_=г3fHJH#"h7K$Hx@F ]a0x ֏Z뿙^S&VP<3L=T$D骉y"N)ZH)&OBbrB}S]@ݪpql9_gVSkD28Ų.tnɧ;5u݀2mttz`uRc K^? =RK]ic ܜɛ9GDmƺNȩ\Hȹ'} ;掞* 2]kz#ݟ yHv.ޕ̸)v\9ЙE0ʰ' 'n)ڄ7^Z]n󴷨z􄎌bB(~g( /#A)K~qACvŬvґ#DgN68.οgbp2mKr&i1E@\8zj ^)!>,̟9"%؄XCX#%\qyC\9a )E#.҇O.e &Ru @Z9V޾-xѧ/tB>\  [;jVϮSH$Ql ֗Rڠ N؆!̎F E|,{D:KS'̮%<]Uhitp3)lG"U90Q$ 6r1(6+XW=+owKnC/n9 ]_`ƪ2遥IH_:?P:{d(5&mCm SІ1 eYH$ldhj %OM ǯՇYt/ G.y4;O+*zOt~_UidvuE6ɱ1͟WU xg^A"#wm ?y*:"`|w:^ 2R!Wat<8-N'c5Ьn$cm{m@۬I븾b nqBZM\&_kômh-XoYVrss]=KhD &䋿fdUQ&'Wb к%+ԧ .RcWRj8DXDBdtq.UH 7A_cR4pUY[EoݶtS-z݅'3w#2biD2|AnWvpHڵ'AQP3;@T?d+S"J10wwDFx+Lcܘ(n(Pi{~)0m3Ѱ2y5Knꓱ򮺦=bv |qgh eVfpJb(.$ Hu'z`:&e 0zuast(T|N†`G d&CB9|C|M ag+*7[obT*֠|WfB>T'o|`pqL9å P"+I`[-l:0Q¶ `pdi;؊e#3G,7 hJWiN<,Z.j~>;~P1% "uP<;`%A [Lf\Rv /;QpXJQ3NCqeyNG6흜8HjFLQz+jǧ[]O j<ȇCDPPaՃMU MQZ_7@ES,FxQKX^*b>UK,;Thij$U]9O*HܽA -:&PX^&~fm;? Z8V$T!fTy!$NSѠ;Oct,TǪs{dbOp ~#{&6 tcZ'-%|Rz|Y3IV6W_ŭ%U:*u!]EQ7@I'fW9_js8O#: H q働GN()gW5RY,vQެC򅝏IdQ3q`~Q!tW:dE(xn̼9mKN{Mz`/J^e7kqlP G,@Lv47,dx۴@ yAEgSzpAG#7E[s 連 JjAȴV`]C r\L"+[ipĦjI3.\$DŒz(lm,^;7Z|d[<'hODNyz 1GxbS_ϔ4 x,WiCxN"%YZ@'?_dsyZx*08>g$.EgTE~.uUњ!A:E^mH [g-HSZcgQgq8N]O =F5p婭Oн 7E Y=?PM GtĐ[c |vn`mw+qD8NɋE[6ϋF@q!Fœ'kVQsSTb@N',޵GLDGiE> UՁegw,EOc loiH"ƺR2% {RLe|4f'Y˛ 9=*~NERBFOuA qL!dLpGP" u~o~-Jd-B{x6WXuR=;m˴;4l$i܍m͋ BQlve\= ,I gX 9ϤBE<A'nM a ކXBx0~[?n764;K|(Gu9xI+a.˦n눁/D>ܭ]E5e{(T'֍fOAJ*P96cy$$ӉhdR4k '&: ǂC ,犇oißݲN^w)`8O\JՕe\9aRhfvz ֜MG(sO<6Y'` 8W_0_r&2t"(ja6@jд ; [`ֱ0˨])PȑѼ.fP|3nW@q؆-.<2Q۔?KNQdqU\NSJF^x4 U7$B\.p[[HP!thД. %VǼY$U$r/Dq\kPjFg?#JO|wJ+^S)@e:w%-FG6Tn#_Mxv.+X+GRS@qLmBVg; X#QyeհyaEe&+}FAzvkW'dPxaR2E BF{6rۄ.!D$v6(}k*uB͓sEK#HrՀ-#- x=9 ~"zMiXxCJo9 SH]]X֟d3-Ʌ)*S1-ԭO0FIi[3kf;Ҹcd\  Z> cbBROƥ8ZER bTޖCdmu'A=/ջ9ɼ6v*GJ9.Y8ƍ ZBa 堯R`jA%qqX+/_F"t4!\X7>-`K`uѳM$f;׺tIE﫰wMn%V&Bzٮe$bᮽnwǛfhη&+qg-4sg?d"3R]Rċ=ىṅ[Ȟi%ჱp~=P>9~X ya7``(Ey dpvۏ~1#e]Zs&a:0f觢Io6!Zb;|%2Yl,Hi+e8{;{_&EP@njw5P#Z`R{W‰ +|©w "D䙇@chTmQdz OVsы&%_ed9W-Hd6ҺG2-STdH~# eTEG"JA\nkD::bQp!dE++~;EG UHNY f@p]J<CsZ !|OsS)C4by(9!eb;AHLz).Ob%m7fV:% s }g(^GSx4Ժۢ^(I SpR*0_w̭[zO׾#eADcdHEzyDž :p+ϡTΘ6ϔX=SfT v­ {?-*P[UwI zDNq_ɔc:foemq/%pÜ}  ņ +S$*4dUˀBidv#=ԢU! H; ;jZ$]:u6'W-kJ܃) \oÉ4[$2GDg;gb0-֕ A86EͣW.#rPd[?Y(s43,!j!۩) Kr.p0b?1YAV zU`J8dP8Ni_ҽHv} diaQ:,O Ym 3zߑut5L7/R79m׽˟ۮaN `IPIn, :N)fPę7/SX|l ZhMj;=7U.QdKOb1/4am?NĆq\#1{bK5L,$jf)}W cr@\r߰kۏ1-+w 5 (.C 6Q,#ێlVzPl7͡e\~\1]w?/۪`.]_.?\O޶u[b]6ZQJ`Sۺ54~JP؟x59H1ڸt5aJT"nHF(CIDSGjX@}E0Hmݩ8x1mMLUgf73͑*(dzWϼ7EǏLpcp =V9qIŠiS;qSV7a*JUrVc_na4*eZmXd{jRH_Nִz! k@XBێtUd"M'f n$p1By`;ד D1Rq x7;R|_XGœ4ͧ-R˒X*i֌|:x bzIIG^{V( bkw97dZ&f(f*Rjq"EI W_+4? 1P"#2 QRsKNfwK86? ;|~jA%FY9╒rdSO~D4('@oRZt;Vc$fLk;MCYбZegםz#u44[|64H&dO}ѻpHx(GC)gO<(R@BD.Qco[%+I= <9'NA-S^mYɂ0QhrR6Ƚ\$]gZ+؁MWQP0j7;,*n= j8ow΃NY;zc4[Dl=7vPYk ja=_ !W4 0 NZ[YI 8`Ŵ_6|TDB-S\{є[byAo>P$@&3;hKE\edDbqY@xbq@"EZ|f|_{vLo9Y](!p>6#ؚ \ؽ, :9&uvKv?\]SӐAaڨMzs zdlOٍ0 d/FLiMPI#9ےNj+otk,įutB8/̓b$;@˲l sݭ׊5$=g+ $ZʭY~N+h/?iX8Np=hTv: ']xɳ8v3{qfqJZ/Nv-E|V iعgō3O7\h{~Jɟ,_m 7 Q/9uh* 3כֲ?#!9|+'kE<͊^YKhCzu2&QCSr4 0*l%D*4f SfK[ #ZkxG1OT2o} 6pFkf>5^FEX?1,"d=.vA@: XogF"*nYߛFTWnzgUi=8luH^*DCRoϞd/d x'N=8ssx1pgWRҏ;Yqs?$#,PNBXE-r$L&(]n|EكGJ?3Zvflן7=m}Ӿ-Ɛ>F#f[żTmȔKF(-&r b MKdA~bjVf1/!$1G֭#11z {}οz8 e/z{]kjHOҎR,,nC.21 I)5n8{p-+]ӭq U&"S4r$dky E>˳JX窆)󣄑l䟀2>egKi91~Aze4إbt'n'!.Wrͦa>-+?/m= cXZ\8ԫ#pyoeapr6._&=^EgTfYzwef/z㈥e`W4"1f1oNgRDzpgVRr##L8>G|T;dQ֑Yt8l6Y"loR- =9jj* &eeMl : T2X_lJ W -G_m+DuJ""i,-xuIk1}O+;S]s''l/6 8rlҴ3{GPM/AZc=KRsUYٽJjT]\($yvgR6]RSÔa:7fC@*QPƇ!DN#=A"[Ms'EF[#5no0aS%'k;q聏$^$x jxsg }f eb,y2ᄷ~Bga)al>E K"XGj_ՐϤA[ZWŴlZ=W7J҈˽m{z3$ڴDo&j)0^2lƒjZxJi!gЁ-ٖuYhQAt 7oSTv-}hdFx!sibj4 ^s$uO I|q@T;0 x)hL%`54{Sdۍ,+2a^Em2r{B; 9Q:ѨgAU ZJ"} x6#8[>ϖZb52SXY]D9 d?z :4$OחJ,~neک5[ܕ[v?\WDKy{&xuу|zR ꇯuj[Ej[O ύ2!ʹ|/`'K9r?BD+qC87Jrg!0y.B Ae_xbᦔ4'mU乁trt`)1 DbsGwvS.%[\z; !xSuKGtLqD}Qֳhߘu^ '(&ѰmR}"G= ǭw7زB 7 '4Zx.Q !k6Uʮ_2f5ޭ//}ٍ$_PA&"!p;xoJA7Vв)$aZ9uf`448b"T] }e !3X.xqpǑW˺j?:"*F?da-&"Uv ^AҊ1.֧eA鎝S׹7@8p{H%C~5S}*A`wKG t> aywG :MXo d>:xd 09QM=x8\ P|V逺-: ųZL Q!~$,=݉^w"} RBӋywͣ_ɕڂUM&m0v`X)[ZT,a'M8H(kfuBY`{B㓆#![Br#>e1/}M0!@yyQj+\`5@ Q) 3dV n 0k;7"[^+w޻ǃ^93Mnj4jDQƃArsΊu;,:7Ivݨ{9ҙɚUK^_\~(twh?R3 O˳+z#q;Wy4YʓzW$Ѭ~x!"ǦCh}|V7-:[J?ϗgi}h\Rf^Gk0uչp'Kwdj1M(,VۓKzsfpRyQVHj7K>wɥH h:;`#o_= (t |78ՋխUyHf*A*!I),PB­fdnGAӾi!^re/LJDu.'4d_)wʹe+%.sѰ ]6v5~n!O:gW^q@scJHI}{wzOwX_?p/U1@*HYxYCU&;7b䐙8@(r/w2CB reLEJb}n5$j *p+.B0c5CKr,ʑ(x R×<*fyI>> $;EVfɠ*37W~bi]Y}I=tB]ia۹zCpj{y)4_Q:("k;pqmF7W &nQ);E> cf2g}Jf%#ߔ]Ikw) Mg4!YN+]yqL.uFAabC#$>*D2ΗY7Ȉ<]umXU!*-aVP0& Wb`'xbOl <__jt+>d'\f4;xU9 =n~0t,`ͽJpeVhi(TAl]M0Dzbtԧ\Ɵ=W%zz +y|DŽ\1`x-pR@-VTL73!':k+bMx mO,rTP+cfof7*B4oۛ}?4 W`SA@=H<F4][e g|ٳ44[YbOȝ)b@&$Uy ~az#JYIR$=OvDU(3\ҏ7Ű@,#4/yw[2ُ]t0kZS # lz B}_mTeɣ]¸$\ɘ^X.)R[kJHmyXj$c6wLW MZ۹ܤ]\f8ԹG {8$-if%f6[@. $4IQVuVZkftҵ|蟟 0#7>b_f6ku8 0gt*gxOK-"ʏ{ Z8UK/)a&L=GfЩtnA\oԤ£|vqǚ%]U#9wxD9HER*^?hhFʦu+˶~.@A˺$,TD̕j 3{m5qٸʐ<|9||љ@А .89ņ.I!?fi"/18K&Se>ϧÍza3i_G-{yQIdKw 9?3$-7Y7(-kwIb ߖ~0t_CDet^\Tfo*:; "%Kqu7~R\@OkTL3dCCP`ӎ{ٍ,堩xo7 ,U49㩑2ևNHԒ&Hg] ȶ:J]Y#$ {ʑe}_\}mp69!" xB/pYd7ͷeAusJ21Ք#bC v~u,`f隒Q)ڨr vt!=k2D!f\z"fyBYƹg[˺F*;IbS4~R$OW)d /vT< vnku*c瑲Xw$ HIx[JG-@rav8@ϭ˴Ms:P~fuMɅ)rjިϚ`Q8)ymh%F.i4nG%ȳ+?ZT׋pi{~meJ'֤M=H'Uj+[ 7NkG6?(MoRwdgvo#f!-WjML3^NP[ѷc \߲OAX$nw(3jp^UOgY׵KZXoiQ3 {(޲xMܷ%7 _u܂ӵ].3I(rCp _@'rNfºGhZ>$ӚX*o0#oNӑWfuIJ&z/tNn<}qѭļpvyC9tiݖf6iҩd4tfk7+`ksz_ p,{cdΖΞ}͐kn΋5'B 9Ѡr?&#BomҝԚi5i5I=BSD/`fD`jNK5Q)=mx8BɩlaƂ^S|Ůfb[bb7io ~0'I4- ɶ tXyٴz?sm,4_\=3r Tȏ9z]FH' dZq#%#1!Qe({!,X،"lqbʶk8͐Y{"a34UCC5,Hp|I2re]HSB YGMjs5"X !Ʈ?AoD*R+Sh!B7|ˋ轆w*?pټ$Uo퉮2̠WEKe3-;RO4iXZ=mL :q45A{+潙.:] kp 3ʘ2u!zQOe:&E TxbP8Ji-}z}4=DVbY(_R< PՁSX/G{@[Pk!u.^\/ŒHJ.#6f";^]kkӰcK]:R1/T7 ű.ZHleS|Ay"Y!ahgOO2  x% ʻ= Ӛ7Âx}q~'?fO'ZcITo!3W8J;ˤԔ(4k6֔FO!5;y`Y@>?;_dtOR:!$z 0!}`̊n]X d7X 91o~Dr(j PO5O :#IFȺԖޡԃ|B(o|qu (Mo*渾]I~TYKwHu{heӢ@}0PI2)|rF'ڑZD_VcPq2$„T>XAJ@O 2-3:z0ԲB`tk7U"ZԣދQCO65irzeԾӰ< 1m#!d딲*Ƿcĵq % _IC͚>F0UkPedX!FPvpcN`*Fpy6Bԅ|J5Yl;N'iA 2Af@ azx3@|Q̊rGRd{AS0|7bw.T#/ѹ:oY" b!t GmF} 8=^Hn#H>ŠKE>T"֦/ T*̫HaF9lZA^N[,A@4b)"r1ܨ\Os%GU3-|mqMsU;N5^~,vw؄r)s6~oIi(*M2_~ѼkO<%h,޴n|8ERܻCmN^3Ow^Nܭ\1{`Zs>37|wzf1FkD9x}<4tp'_ƒ{\B&o59Ug &zB EjCXI$'2Cg{2P2ZŹF mhE!RPm\NC= *SNHwfxBFG @^Iz`í\l;(!.8'ōݶʣdBdF.w/NF _ߎ)gd%2ܞ-!Qdcj6DOxwE!LqZ?ǥØ' VfZЁ=Ėd%k/P%C*NӖGC(d6 (GꍩҘȋȰjpUz9XkL5pkXR$\Rҥ'k !YX)AcolqggK>0jPE:+QYMCGo;8NXL=*q/H88/ d>:K![SO=)sOiKBo[!7K0̰62` hB)If蝁KGb'|P1 +7XMArũԚr0r B0Č-8)zy7!(ө@۽IYYNR&Vƣ_ dZ75cZ-&{c >?,R.eQW5M#.Xq:S9@ *k̃i "<BьE kEAV]Z5֖%lhz^G񄚃3Dы(,&ߕy˔n1̢-cҦe+ɹKs3zM(O+yjgK( `C~TcF9ޔ{[}=ܴAع sH5ܨf)J'#T&~p>Q}vuIf,V-u~RQl3Lv&߲WcN_z7|u"{fgaă) J02-ش~>!|XipO5S!y]G :1O# I,{[͵Biѻ-uta4|ԔהB$w@%Gs }2~`#d{) flioC셞|O~z5vnQrNŕ"= e3 /;u;)B^L) (E>ͩ,Ho{u~|$/w[ֱO-z&bCA(zz1 /j i0T@bwjCoA]-j=B+xf||S0N۳9Qٴt(+|aVC8%_8"Cmr}dPwΞ[c%(/Χկ]'g(Їht\G46~4Q>gvF \lu%Gp (f~qa 6܍X"O:ذ2)W۬_2AA1=:X+pvK7ڝO?2 8qAf0 &0ɈST]FA]`̩Z 9= .Q~ua{s,0n zbNy 5ybQ2G\T?)i^3h^畎9=9T-sK=S_̱7E\MY16%b`3 i[sx {+Rmַ=J}UA”y-_%Ӣ-R% 4޿6+-w Gކ0 GǠ-4'+4%|/O;s7ݡhN 0?Fq;y3 [F-3YR}1ʙNyk՗Ȝ^|7V(TO˨O܈T?1=Ւc>4xr$|{HB=Ӥ ~TX0]9=jmOb4)9EsUc&|bhgn֕˙,Dԭ 7 ׂG2߬Iz~ wBTiT -Eu3yyhmAc_֣ ;WME$a-I LG:#E;A9h%XP;}G=Clu֖ ޲,^#H k}&/ p}Qp&<_i5 mx|:ONcuOӪsu|< ;W>Wh4ئIҕAF X>|֮ͪMNE f@NI1TkF[~`T 5i{DLM.)fCVl=Q3)k%6)ZƩ9>m/QG&>cja#%338"<64 6 2^d,[Nim83q$wEm+;j`l=دjC~ lؖƢept7#ݬ?_^ix9$*,.@[*EK8򤗨IEcYR?LisUfڃc>ĠDh~dej\=w pl:ݾ(p0َnށe}8Ցp:lO5Eg{s_x0{g?xZmQy?QIZrq'HÔ<8YUX aszx;WW)V 7\zG[CXgl2u.&hd{Kj&zB.t3t*{ fE\)IS2{ģͪSɩDћ$DbhG^$SA`JBJp|$|(yCiM"x9~K!EKhҶ¬.i-{I%_O!sYŔ1,YhU!xrY؆_͎Eγ(D~A§悺}NɁJM4u"vB%jкgG;Ǔ>kdU}^HI!bO.M²ޛ[jaReXvXt ݻ!d=vlo[R SNR5d,KKfJ*-/ɁpC"7cچj;۾PQ[+Mޘuv#АMՁ6s%a=2u臧p+$Df̥o)~;\"ҋ1Iy%@o^ҸWN/&=gA|Wt''ӡA[ y\W:A}?jOE |Q ׅ+ Rxa܊P]$K7Nm cLWk:TydZMODw ۛc@@qp}'ffE9a{j,mej~{SqJY8H ǵ|Q˚~2y^*X) bB ƜZp *h^)ACBp*~uK4{sI4MNUA pl+>m% RDs9! C`׆z-BXKH['tԂrEzgH*<m^ Yc~Θyf0LZ{V;s`|5Mb87uMPЁ_" 4]O]L&=r.:Yu P)uTQ3P -Ģx4xn?]_@^2E7=[@,4?Q `s 49BMV'ߢkH.G> N ˗3+b iй: [WƔ2f(v5p3)f; o98ނ]ɫ_2Ld$} |"ox?q9y~"1ٝ&K\[!]{e>63vT!E0~ \y.H)5HȲ]lhZ @0o |wFq t'Rtqh1rb"':}=>Dd//RDm]unZyd8.|>X"뱘';@lBS{Q I蝹HGwqj,)}HKFoUrMsSW1OlV*,?PmԌ,OgFTsr >J+ .e;gp8(RUw,1sF`~BTqh6<6-*}HoqcR]Hdz1*=}5. Y0T_bZZ!Hi{iTw8E|}z=UN|%`Km-zY(ߝxUS9^7L JF溽hXsu7٥җV7$'Zm6*igaU+HpUX$$k<_;}P!%jV`\,~k|dLөΒN"(4{_6,oPEƀ 4xrf^Э0~ E)Z4UHMcm&7ހpk8!~MBx,?+vom8q2X-'6*±Md-԰-';H2:{];(^  Z/Ӗ+qr`ϾzvNp5$ srERˊ{#w*٪ VFp>eGA#Rf== //:||{a%D=Yw N}uvRv/uyZ3XRfP)\@R!k N Bv  [ӗu! $R3]piE0 $C>IJĢ.x痧6suA'h\DSX%KS:0i~(5|QcɃO`8kuP14MҒg[X("~5Fݹ/XODgzZWf݈-И` c_QG5(^=P_r(C2Bxc>7qJ^!F b%HSi"?+kӚ"wC:n7& 7pDȨ֣"՗q&enx3sm/XF걖 &qė3pr4肭ВqfH-X;Iz*5HL xhèQY׎(Dy4SAҝ &K1}M~qnlS!sRh^{zPv ܌h8[ϡ -eC&OWFNnW%!Pҙg;vDNGLcq~Յ r B᳽mXƥIV 7гDI8 :  Uiۋ:YAC!%l7 !l_`*H?^};t ]_bvMsD^6U/f[5$B & VuA$č#*^r:_%{u3 '"B?RPMbT̡yE:x]cC:pYb0 ɏ{&xi:tjW?ewWo:{H b0Oۥm !FЊs*OBOE..N}uR\{(†bL ׵;Q!ޱ.uK]tD$Xʽz4S:2K.zذꬽڏɳUSdAirƒK!$zTrSԠIYq tqW;e7w`CQ-u]l&fX,o\{oƦ$RG*VI\O qsE4}敘Ӟm~+v .SIQ>}}hY-eݜBi1֥uwů;%dW+BRMwCi2D+\P'Z䳀lmf'lه[L3+H>M<P*vQ;?Bh7I=xrwF {4ńŨF mXZ1991,\=:6 n 4tMPJzv&baHC/,/t)强nޔT9Ϝ1l< Y"˅ZwqL*'ХLx.$t?qkɂH9 bh"niܑ7tC*}MpdpgLAq "NVae I0)wuJb u2XS(H'F^h~}%6+ 7qL TUIzKd9Gl"E<ao(9L;ȉs1E~+OEm\:Z(]9)_Ta,V]`h6mp6(KqYp{Rs*`|mW#U+RI1m& GvC*(cP_}CWt5nѕm5kLc--E/' LA㯴kE횃>~;/d$@jF(z;1>]ó.&p8 ǧpYgMQADKE8lIf8‘%m ~]DcAGLoФS.f}W3Gmʕq@B Mւ Qvt۫h{dV5_/;dNJ$+Z>Ř~Ox+H'z՞AMaie/7a)O_ m4a4sYIR")i$TWR1Lfr[`968=ab r<)( Vr&=7hOL+7,.J\las6961敩 1$VCE\HW˙-RϘƩC-JnijIW\y {AAVypP{Kk1Gd?4G -Iat T$M.[NDc$۴ Rvp$qmǙZpvS3`Ne8m2tf,0uj$RxbFǥIkϚL ṀaA/M̛RVt&-ih%ubISQax)[*N^#2uCܭ6Ă~Q7hJ]B9oࠦ3+(]3u p`w!Owh1&-zCx`X/}ƀ]1Z24*UMM5ř RYsb䮣FT9tv;\"{y"OoU}f %/mى zq?|0\ĝn\ڨV%1VqYoxgiO mZI%3"}uzqE;|Ń@} L|TFZ^l뼚\P3xL?lBʿ +> ^n V=@9%ZVۧEg%$^I_cN_!]ofEFWKr*}GnpAAĔh9 ߁=#V6 MYSF 4 ^ S転$cot~c4}9RrNAՖ"e7S3tW }GtmcP2G٫KUÊ?FĿTApl8EZB= \ (@Yg>Nm &iEy4RZ1c돂8sӲL TyoTm 4t__KZa=۲("$]&8noł>dUNwWQ ߷;G]V8RrofRh:Ymo۬Nߜ~"B,xR?G\]sM͇x~˟ -tb2o}ǎMPƈɛZ'B/d9-Yh\FB ԡ0wqC|G@_9h܆5P"NmRбbiʋy=*ֈ9QSl ]Lwor:\h^ТEe45qf `bM}Dϐ^Bzf. "$i#_TZ>†uF- >hO{$׺ +i >ms]L% `ЊG!46mxk=gT&{i`pS;Lb=Ѳ+7?Edn/`#f]^vZ4 K0Uف#<2ISUpmX9. g{SFQAnRΎBCϢfT+fz57,VGKGq/C'$!tsX%@7l[4WvX$ߙߠw0|r\`z)%< svm&. qa]l%ϼ/oOa_Pt+.Wz^1!NahzW] ܹ .wZF s˥݁{6d8lsu);-IXÎ`S>x IiL| K+#J $r{/oQ,\٦)Ύ{\7Vc+Q [0:)ن}2$HbAX}rYUL '~|@.JdO#Dz+5<rVQ,}!c0_yL-F8΀OEs #rAJjc5ON^tK ; ;Y4fW/ :ۼS^FX)2C*h.us,=@{vF+~UI`Oofrk %#a|;1 +kx zw$)/{YD֣|-A3Xؙ6b9^;el5-@D&iVl'Ԕɔ;KB#`{ }#ĻIT 5~B#4,>KڰԽs@ ɰۅ@_Q^֪'@rSP ETܢcS'O Ϥ5%7ܙ'Sr?WrRbRox)| O{^Df˕Fi|9]uj1䰙C Ϊ0ʷ^gҥ BLWG`.I_A^|/e\l)BS{LkDȡXl}h뷡&:XE8X7a{*Ѐ5mh%E渥mu§L#Bab%+C;^@Huya~S]XGen_')5w=2Gww<{@~|>9/Jqe6hVKGGf  M;T|IIg94 !HjBaऻW"o~G͗Ɔ/? }GM$7\ݣ7(k:dKi>ף t}9+ef_$?o$o>a9՜wHt/%9ࣗo7QztZ욊rLI@lxZ · ՕHWg5$LNŏΣ_Y hR1x;)2b yOjV۾ҁ\OtB`H*{%j;5=f(ʆ^_J4w'he~ i!l3/~>j9 !XZ4]◱iԡ8hڄYFNh/Z"S8t9j8j*Q!1[u 'smgqM_rt+aͬJ/fE+_qA[pŬ* ’Wup$Җ6(+k`K>/^T Cc2m+ǖw&8'eZ5lD]jiDM5QٛZ5(H̉>tvD}lHz\q"2pt/HW`IiCVIY9Zu @SCO`tOTF3f AEV]$ҊWF8a >}Ҵ8;ԒTI״*TĴ3H3tC]tZO.gF̄F_Z9x /!?LZFv-Z P̩.FhxbNxix4QN0T"uI !v :z$U}Lah$%_9 _&f# 3('0(0]˴ÙLi 뒔N7۰J_LTң8U &4 !yPߺI*=3U Jz=v'7ߠvD!Ox`e"VE+ݕx&[nC0|0%4=o '^~}BuOk0m4/&\Rs\Ȃw omùU+.cO@(pZPX ,.`Nxt%oP&EL?^d\eDb'AWsQmGl;EZiod%-vZ$Z.|ʀdLjI4Ğ!&$X]<qx@"& yԱIe% CbDQ?L5JA a sG\!YYDg' /5-шN+PgHHwN:YzP55~ E{dlfޓuԮ4C 2&A%y+lwT;I_K%(Ui_68ԣRR,mGfȣHcelʖ*`7K~|`#J+h:L:Na0aK}w;YG ,rA[\g_J]ݦEm<hZ>i+-U  IJ"=e kT y-|{}w$6#p ~~*h>:A 46Awɰ+u$Z9)z*c~/<3p @a.Sw=F?lyk;8|F3y~DGxF`w?ʉSp#FOH&j2_O>a& w'RJH%kYrÃm< #+pFfKlwYY-v;."*잜 qpVpW!Xl4-qH[w&#X N˩pu8)\3 $(+uG3 8IۇTUdʜuhhjZCjHC^Y5 ~4TUuKū12>iJ7Dvxt-Yp9IӦY?RO\GlҊ-^Ql8b~Ls[? VE|F@zP9P'l{+XDu`A5!]cb8֫%w%+P}$B՜ά29gc_)_}oᔈ*AyI:{]Y} [OY\7JŠ(3uQdfWT zHֽ C&~G%"~y.OӠ ەo{Y* x~QIxU &֋9 6ps$0A3jȤrLHf}.^lr^AejWڕ>Z!!(͞]޵ s(c3vBCexAhӝ hB) Ih7D <Д+`}@ŬZ'iW3 Vj`-5Q<+@nztk@_hPfd8qtZmZ2*}!)BhD2!ꝭGAS;8рܫ~"o)%N6D|%r̯_o&kEk0H{l_vu" [)ųmٮ3i2ur[(OįdB!m|f_*A Ak3UI09>=VY ѵ+5O떑q!Tg`̓xh;'A%nt1U"ѻ` >&F^sNAx뗢 Wj;O!~љҀwxꖵKN3T"NVh+/~"AG[2k1/9f aɍnڞi k}1~"u|Air Et/d%SV{#1贆7b~H#yW^ 1Fh4zK`!MlQ[Eḣ7('`ʿ6M޼05W)SuS&tt|^D.zn2 U7&"QTKYoiiSrWSlt+2f߿F)5>)eSX&YC8F3bg$4O ѐz 5r5iY@@IhL;D bÖEo LzCۨ?z)Ph|Q72(%r2q%OW?IQfO1lCG#~l NgxCmaKŽMeޙ2gR u m xWa\>SJ*2R.J. vJە`b7D#7JȂ(g%%v?aJW "?ˀMyG}'a 9-}mz+qaˇKNAth.^L\KZ /m{'ȗ|'q@hųN+۹iOG 'JU|ha:mlu%5u6W!xa!l߫ _YgӲx*UYE# 1f梥WP?cjnۧ-WUYkvcCoRMm&ni 8I?~yZp&P;}%`%UN"wN6 =qjՆ=e΂8q:f!ιZja&J6yY1ۿ~u8lDG;0s{"<( _T LZſwAi)_ζwtSX5^tuQ贊 YtDP)a;[_WMO%x[y[ÉY L}^# HE&dzZe56" 3OG0P鬯_?M`#CI":GYF'nf|fr!4;F/TBC]+qрM& /r*όJO Et |skmES5ksKݶw4'XI%c5ş5$ q 1m*Z1>z8/y3_Je}8iO,N?_O=~2?ͮ˲˴qSA28`RHJF1Cb;ذZ> dcBF0]W_ic@'DDXT]XƉ~Dl>QL!Q+&^sp* N1ZJcwݻpAӞ8eXVA#'z^G5p#_|]dL (W\C_t8g/OimtPyCw@x̴mtM -B 郟&/6ϲ $fjcz$3X BeChig"!FBTäX9>7I-hre8]1Y<7fC*Ap"r\R~l\),w͵OX]!t2ؤ$h! ,. v4uY,*h \|md8Ϡ(;]UtMI"VbK絯~"Ixc2@0nDi,2sZP2,vOE2)'B!|2BQ%UנLBlIuH'Eqk e6S SՋk67h`[ş,Hr!A&sj8_?kq4ְҤ-Ą;[L5v߂?A:cS¬tRLu _ FH7] W!q>2t}z,D}N/ZVHtg-bH@5aTdXdAI|X7z, ɾ>%T)V~k!k6`xlRy hs-jӚhBș\ k}i+ p+Tw ^^HIV6HJGI 8&^4۬˩ID R()bкK{ Quly3݀z"NQ@JFbY;xp ߹vVDFieVlARǞ#S%8[H%2+IN䢌-c)>A .kٿ,Gʗ"3ė9&<]xpe w5|<xs8.bS_ MVqg]@FX{zģ }JoחJ\B♕K x3+p]TCy$֟nONEBZXu]΄?})v4=%w_S$Ȫr^_#&.eG[[/h ^Iag/KRے&VI^8i>?kM|_!N E-ߐ{qyAUWݓ\LĎ>iou>:U|˝W)Zh$qo2SiG A5s Œv򦥌vԜE!RjݧGsZSB7ey+V$x%'$_ll/kךF&CS<dAjK{[k h`K9@}RdEp%WVE`$0ͺl>w &c90oƃlM*ퟀ4Ve߳gZè$ x)QANUk:vSSiA-ږmd4(J/EݤfL0 %qU=;=/a@ⷁfr9TxQudg~b2JQ1,˫fpVEٚĺ=#]q;!Yvt*xxEO^U蘔8~I]*[ IwwlqRj…ǥ/X}yy؍ p/Eʖ`"{ZZ}c,"2]?~+MHYxLn-5RY5%>(+_}x5s߯3EQiZfҶFnagFFCǛ:{S;txp;IoڴPa?ھj5<_(Y5Ν5uL!A elK|m$EqH)U =?&mCʙZԢ7~l$ۥI h .8Օ4$ p+ozVXt_ֶ@ 9/bvXKx;Q@ = qoSkM7]S A.pE+vO*x lbxb(?+%XP8&Qr>k@ylfb*nsO*\cVM :]cP#bAmq+/";O.Q2;[Mr*R^mIp|Gqix젰 Snq[)v1heݨF 3C+}Msh5`(憠vO/[>tμYW)Jy{3#Keꍴm_X2T^ 3"ԁd^-1kW?}edSW=zMĈD@dxzn$i|9]yx(aV?`>Sr6qS1b̾Bͼν?;8V7K݁>bC_u*m U*:$t|6ϒl>:Ex J"(č.v"-'HԻ @]/ t"@RmJî: iк2+OgcJ`SG"Mθ!n(`d$qʴ]&8jE7{X? "@"g Ģ[.W[M\m;Svw X#fWG8ӻrsJȑ98YǓHX#V?}f$7^wZX^Vy;$uyl#о458Tr&>{G2^y~H]R C~ق{F-L OA5-wzcp!}'DJ^г&, ny=E{ֆތsISճ؄ʹK.REIy!|: 1IHyEȄ1ͼ$HR/[ 6P_>g< L5DወU&D{ bp4+_L~NG 'opR.l+kK.``BqV&$)no[0jwPh$]Ou \i|y`NAJC 5{kĂV}bU_<8O!/z*q_K]Y*ћ]HDXnJ":ehGd#.GAXaqGI)WOO p87GTWcM4j y8J.)nɐCN9POJ|@`YQ-o,WrZ/,4[ؗp]_Ы01Okq>v ӏ_ Z켼j9Ē )n018ݦo#5uz}hbƸ8*#91|M-gl]#YBHK#ށj“ ӿ%f#*8ME# I Dd_a#ܙN*Y*|)uOR;GKU;w}.!j("Spm҆E.j6=IZ}(T9D1lVrD!N]%~cNV4e+x3>Ff|-ǿ`qm*yۂkFQ'ow}m2LQѼY4S;nTvO-)'0=r{|+GC rw 'o Ɂ)g'mJx@+8z u8M$XN(ܱ%37iF< pv 3+f2 3mO]!97hrt |DYQJu$jTq)k@/n0BE} mxR$kc+M]4 3),(j1pԌEE Sl4vPGBK _\ooR-gi$ _Rx{h$\hf;`&XvH` urr;,f^^/l)l_((cs=ZoLAFZs,vOǯ KR y2vBOȪcRr tpnݤSN OZBp8Q:hjč%W+R8.}Ѽ(]ߛfrCst/2ꤸ[$~jݮrޘQC۬Qٵ1N*f`Ŏpt41ňӐQ@~1Ô ^VJf嵧Z8"3 1M%{T0N(V+)$=l\_ƻ…l[m#ap9\:@Zm`Mn#lN+&sP"{̸C2wKcY0[a YgLNXOo8[cT*,qb'[zJ.?intTJF޺Zņ'r+DO/!Qbsxu蚦޼HC H _t3S>,]b!a[JF9&˓0];ttWܩT/Ewps s, vC-C U*fL KשSU.}EyL+!4t9Y'Ge+swh[ eY7`EglJl K,erܝl(u;#ge$pI9 WPJ҄m8ԓ$(1,h*l`;ceُ}V2;jSy&zZY]^)!lL*-ʩ[Lֹ=prsrW2U uD?*Xmmg$>_ z3"aslh%JwWz!-J=F.6C8{]Kz>2:3mU>^#Թ/A*}oE+(Y2y9? ];dup3 G.i7Opxa;^_t.BIU)F}S-MlFAvE&1r}.9(J9*Hſ)}m 0Q0Jht8DX%!}[e& )).zȳ|iC~#`\vG$\Ƌ)^,4N2 ,lŁ|VO39p"ewe'͗JH>$YXJ(K\=i;@dLJu9QMYHj~FKȇ^6"37C'hYn3̀3M$&'p0 04#O\Lf4q?|tk,G4Vm/(u Vn޶MiN_*6$0g]~7_‚"4).b{SNɝNױ[-M9vmIHz^JdQW(bnaQ@rW R񼒁MVm]m3:Y#&`mJ޸"OFnKҗzdQH R2"@.kB 69I*nlXyqr.1@?lo?f1]p#XsX!`Gp1d+#4vR @"ЏvfO; uC|>%_x){ڧRjfo:rW_ &wX/|\F_/AkdVW#X1 сƗ_β ^;G{ZO'1f6U V5`۝:ä,iѓܩxRiU /ɟK. i%]@Ӕ"}7eT2o=AKS$ E؄:?LYY-D*/}gxu9vY5#,ٟ#ڛ5zWgۡ/J 4m$FcA,ep:UϗđWrVT%δN"KkR(]L~:f^{{E08r;(mtΝBSCvѢ|+n@躟ksVdar)PcCVxW`&]x>Hs,(&Do69:U'ALrJI{ը,Β H:@…A&;AZjeI?P OWjXo!|SEXH=v,zOZ|^ $An Usi(]\3}Y4k +Cϖ.?|7( 8S}J4vW/t VK:m]kZCn#~M~@٨U[hQbi3eCyTW/s{VmZµ:B2 8RlxYmV%#9Up2d%A;:f%}nTeRj=)Uwt5 id́"N"+$/zuGRl^Xw$PԵn<E:]a(/˚~Q O!&Eu?sgM/Y/^Iͪylr"U͑W(ӑѢ.Z{ rNLbQHMXz<~/Q%V(*^RuRxV 靈\ؙzc/62Jh938fwHZkV+ <ͮ"92J{l} 0:{ez;!RYIK^}Y՚!/(Q]ktLu%i'PR L.Ϭ'~?K5ײ8=c'[Qs v>YkiHkn&)} ^>ͧ{}ʊ\ B'nzwhT{m .'=OgHjMop?[+D>#d)7FWb9,b32JiE1È X6!fm SZ~Vi6i υZ /|kjm+X%fжݭY*Þ)6g@xhӝ< /~i6:IRO2tg0t /ʔ/E,PykqS0b ~梅%7L[<"+@x(ĩnUXsͨR$4o;kQY`)`wj[kye0ewҌ0ؑH0J/2;T>.\J0^l!Ȉ;8lAHDgUk5SEGw:3BWl(/$$-*E'!y0ۼ/y K.=T-[DĔG-(Y?+y6)8"@2}:B?@/͍|Z2sQ1RN[Ր}OXQx^\ [s~PψK#moS_SWu gGŎ2pwKkw}WuÃ$R3ʧʢU QRU42<+z[igʊTe8H{XT/'8N;$Xlx}C`L͓8) BJD\u[$9 o M_ ] qN%};}G(U j=2II13ŜFV4sh մש6T5=b9΢Jү?& b]t@6|bS;Ydr+ѩ38% } |M a E\6rB=ۅ[r<~u#CRK6  ^Lg*'jWj/U}9'Pફ|b0.,5ݡeU6ՙr6{ n F1WK8,Sg&1 cѧ: ȓj:)p_4P`}Y8Js] fbT_Q, q&_o7 ឲO/1xovЮw> 8X}dKu'mwLgSd>h&ݮ$A@3]6Nl4ZeD/{^t3J.}& Ȧ93i>҃tlq4Yuˆ[=X>W&I~_-%!S)A2Q[b,)/A@^K>ّm +{RH$O*E@oIOdɱDU\rQE߱]lh RثYXGOWj-ۋ 39bN f kͨGH%PGK찆ZBub+ƺ$Fqa|n YE'/D>{yBҙNúGa=F)`+tp-+u+4?]^}XvP?E _on40(+0>\Ȟ嗢$Ӆ,OT:2q¬ Үl>\g4v-jĔU~5QҎ|#AV7*?;0R2'*s*<ϵM<-S¢K '&$Sk#B^)>T͠.gѷLIb7wS. C3&>ELq_bn _ZHOw!|#%^8[a[>K5FT>#;_ I{+.@`ʎY6?'N*dV"UK@ k|DT@3%ĹVKiJ|w9,R9^C_N6V{=哣l^wq/iο 7,QZ9!.)<>doRP 0&6Hc&{o'͗a`[,6D)'򘵲o6ӎOf4ƫOÁ[?`_iwczLn ۪2O4v:=̫IEo R v+uQQS9^ot4(F0(y0S ]yT7hv W[R\6?o)D5ȡNL#=$ A\ #:{S"u ZeLV|n|1T8L;N@C 8;< -a{t8f67!FTpl[uf/)MZTnRw&4A6`}AcJD{ @/jyj"#xIΛ[sׇ#D 楣='I J} ab%IAL}J=FPvϺM w ьNRO2+C cl0f-${ƫco)F'C_Ѡ` h|DzZ:4kPdtL* "Y<buKK2nN2f \C+E}=~4E/6MΉ%D8g}c' [Dct5@LX;kqM?q-E &HT=694>z_.1TƂnSLxf,3z@ά_ caw59I^f6MX}K۩[X}nj}ߏ.ГLs:?!Kh3 \=V0ITwF`g"~0eCb_ h'UmwI̾ixXVoۋK*3˸yS!b ?rK& I/n|*=2wqN(?8-( 4ޗ5KR97rY΅)RGIPNV=D.0wQ @qNG`}A#A3~MϽ_Lv+n)A0;dItHf͗\˃ J`0Eܭe:XK~3 Mya>62aS&Lٴh itxRW9s '1EI~;c6F.)E\!~ʴm#[oČoQq@L*,T}c_N"n⁹86_٣t9':]mjA" ʋ젻$b2 N(󋝈}#^ky꼏o(x(㝴m HKM$N8ȬUO`gMjw{c~] YξΚ:798SQ&f?oި>O=]/Fk󔓋2"1cv;eg!)ض5k{2J# iK?!xgE%7Lׁ|ޚv.B!xuQȊK9{fNgJ5p8q``c>C'_,YRfႫd|/^nTտqwkD?'uC:%l!Q̷k*!M͸fJb(5{jBMJkYյYYUK4cdD%6:?̑ OOe|eS-|aD)aKpHg)m5 ֪Z{}M~)Gq 3c'ͻ!NԊhf=3. qĬ=`lFwN|RM{joZ3I#<e!8նa̤$:`3s!&RM$@#3a~^qz8 fx=:*&zH}p*Z$n:ʸn)в ϶e(¿Sb\^v#'M)z~bB@݇a"I4ƺceYDݓBzA66B/SQ4ƫQ[}:y9Ե _IV5sC4jlE0_ >Z-3DeBҿ2r7NM||*ZCO֝iG}jB1N %53$.86VucA?° / cU<Vnz8I`}4Q[x? j]}6jq]^4rPD5 ƹ Ck[qy2zqW+w̌n˄\C#zkެ诣e JሾtCŶ8ھVG#qyK7M_0/ i!BoU"l{Ɩz<27EEQTέ$h F*pUϱz$^/)(qE0 O8 ;riK7eȿBTcKߩA&l[LumIqD#T|wKD (fBX4GDQ'jet 6p!$%[)0%LBA,a"SP\3iZ~B ոVbHDa>7NcȯhHc <*|H.]q*D(aZ$Q6fm`FKo:XI7o*˾.{4+kQx\thՕH?XW~9#[b+ZW%R1Ԗ-WaZle6V+6;p]gb-.lKIcil),ͺxz>ny廕t,=ΑY'E. J:Izt -{!LՖc(Ԕ"rϤy:E 湽els7MPtm@ #=>i]C+;z8 pAryۯZGv94 :Uqo)AC܎ۺPJ\rƁcc\㲐ojbF#4 I6`8i,zq02/jrl1% 2 QO F&juqcz"o}$&yS쮲‡rzdG6vZqcxZ%ݙ[_cR\sWb@S6Fb6(2>)M%`#Qw"S9#z_ڨ~Td@=$(uډvkԢNl4#_%G>,ޛs$Êc>nm<\ɕObjwl$*`0~5$6Mׁx`;=EL{R̵\gK0<{JGӦARXbʡơrB6l{ȐZ惖=*H5-8(&H&,׻)rP&7ڀƁA`_[oH:[}Eq͗`G[j̨TFEZUXi@c-6kڏ)9KF黜{U]\P %|-hN5GIk«=z?= P'whL~NWi(ԝk t'5I" ɖM2k,M$lhTW7~LӦ{7fP͍ݐYsM vm;d#`8 Hr?[ʸ^vglZ+d7^'_գ{ZNW!(qh,tL䂔bf3jhgX-JaZ1_C0v>꒎y={ԥ%<P0.e޹9n(7Z'C 6jtUGԵЧAzzXc tf;g&2fh 'yvG|;oF䚪ẀރCekJz]~3-wC4 *uO:>.Khe8E?>S, (?m7S~y{-8o=X-@>IjA:0 JܵjBܑ-wHxe:S6n@{a͏N?B> K487_V, KĀs5sɯrESOOS(E@t`I B$fPNtބL'i1]ȋ+-bc0͗ |5ʃUY ߪ&mLI0d}V!AF"q٬d~tV.`t<ʈxG?,^9m+ZRebilE"8fy}0m1|f3nFQ>`zT݆]]/ ?OSFQ4Mܜw^ zGA\1iڽ,0B 9nWO:4Zݧ%ڼ %miMTaIcAcÒ3X1ҍ XZ?7TD4OѠC|_ܥl3UuOE%rUF9KVg%z!lZ"3h~WU} nOIf5ˁ(Lwr[5k#tkQC+ִxھlno3@V XQ˕B5y2MQJ:m'tR˗6pɻ2`ۼ[W!ꩁ#n7 ²#5yE_9ӮC/<m5=[;]v q >Pf__YFJh ϝ֖,GKkND[gZGt39k:  G3$YtαFX81'!7C4$ObNFԜt?ʦn|ZkK.Ueun_3'2VR%W}݈w Zե¿\MD DZDzCȅX>O0bdj|R|:5߭ByG@rsn79q̚ GϺ;z_h7Fb ^m%k d9 GJ^ضv2K, 4vF}{|TQ. K}}JڀPwC+dĠO Ͱ&:r|UOs|9S+lr&11@/Fb^Z~pDJ{U N$;O }Jjf^L@&k,5Fs;~nyAAДoQ}2|F)+@8.eHC_\ѣK6U| IA)z,&u"9mqhot_Hyo<|rIZB͡PedK' WͿm?| (,Zzz߉D{y :aQrOE6ך QxUJ~멵x5?HU: ;S`'򮟣7@ٚbi "ݲ$eak͕}/) Cb&$"J[`Y '{h\^ L, j5@7<[W'9V, /pԙ(8Lp}u!*PD!̵(A zHOĿ?[[i̎@G`l#q aKyry : Dd#-4~kP[.}6HQ:z4F8 8+k%N5_t|`$+E~؇<ļƪ6xx@gY'%a|KpF4&W^v)CH:\ǶMqٻl_1o`t\ζ$hLYE=an\xp,F[nK0߆ހ ~.j/ӗ/d>~Ǎf6e3ȏ*֎-` ijIU("xB@UsB4їriR/=dhU $8@&ТwVZ:y:].i(ww1՗=Ik&dmu]5Bg&$)n=ҟ<-r2!ڐo5:gQ.LARdiPF`c q:b4?*Fjf1DSKImU4PE)ĻqvǤh>sAۛҁ8Lc}0 㨙^ kz@"Aږd3휷Xя !jM>d$!=LJ57()]. ]kBIY(؜`_w>\~vB]=7ʆbx*{v5X~VB۲3aO% 3}){ȒC9-jQyH+/ç M$VsA,,nL p͋ fwUpl^K[PJ>+2qޠқI1*͇DzaSʏ9HC&Uy/u|2zʚf)B[F+|#_|KR/NrQZXR:iJ0" Dt*@o$0ls`Cb8fluHT +4ͤ^-*Jra J8H88U\#TWpE/RH?jM>'G/m%IU' pX/t.}5ק/Ta( a=$ NӶ;E^efy*WƷDN8cCVlx1m7cy~}J 5/kaA˼U L %bd]J/GNN@u͇8lzF=@%qC+*p;rP}#rBS86y ۂ(#!.۔e8#s_}̡\/a=:P /, 2)[O\#ذWgOǰyIY1^ide0cÿJMn qSQBq&HQ/c\|EnO˽z\-QBC)*|TUvNXq"&<.tR/M^,`TRQF]7.m9h06T#XKtWQo~\n3͊NGE ,)Q~Eƒ}Zev( b^3DX< K%, ! Z`K<`-3{nFO:*n8QAҗMD:Gc=p+n5H+FTt3=_'YrY`i2\VE:n"cXslЊ~n<\<,wC _p/U4er?0]c()P{*Q~.^4H;K#& 0E?G، d$AO(?mFP/ +mkcA׹hk5,5 4ZYޘ(&p3aT,gMW4il)[c {-uaiwG&7˭7>ހKԏA7蠾AjnWZM1YgH-hzeC$D.Y!/?ArmjCqAcX̚" %֛U^=_ @!&LJ5oO(P>ݒޠ͘u;|Aٕ-AbzSS)'$Rh :풏&g$V+SJ fj7.P#&&-gZ˒'q"…E6RciRusgHyYݝ=} YuJ$%j/E&[V["Ev{u !&tkTUn)#D5#t|>Xy.i l+{\)gJkESP{f퐉H8!wV"EuYiMݺB+Ȣv- E8FsK=yuŽ }`F.̚_>2k֠П*.Ⱥjj$yЬA.]Jલ т^>vl9Fɷ4r"c_uU8r :\;\PbwԀ )uT$KO*RB:+/ˢK- š]jPۘ -2"iG3g\]TqFө"]Rʔ]K+Vk-RS6n %vl7ߙIwzz~/+#;Ṉ46s~9D-¯xTw(~3Aޑ}4^X4iw'"fO~*T\ܶ5ioI đe&#ppZÖ*cς ~KVk-|V* 92XpA@~I2htƺ>d< 0Yo5\ʺ6fCd2CcN+^n|fx"[qZU VZ:N̈sB J5Z93I]8,9'`v^RkzƆW S%~xevLpGWF!-=h;ARK>9a/p o+z{`lٱݧz)5{۠PQsKD_7E +Ьz8x+X*7]j/!NS!!,V?dz=+#BZM~! ߂2IASėriUm\UBŮ^cS 291/ j`o|5u~0&YȒ޺Z톗$c%b[(! I+ PBE1\bf뇃%?jI6X8qzاݴS}?RStN-}Bcj5LB+v % TsxBW%xgrQ,>q6av,g.+ 0,ESgv mi]0's=`BsV0<Uyug=rFX\;c{Zz:7c@ؖO˟v%݂tob٘ܭ.9APqWSI": ڃ* ^>1>B Ҕ&sNm]f {b=Ljofٍ08VM_{}F}?TT m!!ZϣYڒp)`ɻI,gRFUҾ,hy9kY#Q.J' :*)햎kuHcL \١}`I&n['ΗXB cQꮮT5-1(|a>SJy L~"#J苸YEzGP\@uRv)mDz#vo@Dż|dOAH Τo Jiz"^ "z1B"_MG4DSkV ~Qw6+rq)X r l)et]W>VRmpbO)”꽸hwvfJ& BpaeWt݄˥0m( $ӷ#ßɞxSP9o,pʢ;XWtVFƞ'D]7ΘF64ϑ̏.仾uq(6~A Ѱ7x`ܦi(ZT"BGI. x1f'K1B4Tʡf phl5z?~]ؾjzV ^TT7zH jB1nO'Ȅ O^غD _e9 &|m֙[X /킙#߮~ ^_"Y^Ž `~M?joӒTKV_EzĦ.]{XY~ t݃vj<\I܅b0)}|TPОŶ/x/CvH;!aHQ=yod센ƚWC߼q9q^ɤDwrjMEcMcf_(eᇠ\o6o[╔eQ9-k5lÔc8p߽!4Fw.+|4}p;RbHp{6D׈o+JI:wGB0f[j.l,6 g]Tr„ #Dp3.~Zi*SrG]/YZӉ}k/ѓp~SYxP$Pׯ눾+蓘cC'r: LC%П8P HæAG j{۽46u2dpqĉOi~sL%zx\^-5ZYm %#5&7-YU`@y#̍A#џ-ݴ8;FF0Ll߬IsϋL0/]'7L(1uB;pHn7{u_H:BS헣ۓoTWg(^F[oZmMY)?ԍñH%b6XĉMGQNOmS7/%D]=oSkaMi8Gs$"ZjƠg ~>֙+Ϊ!V2v(Xϝ0cy@jaZEP*IyM25R(J (ucr' gACkOjZ8dgP >>w0:)/odH$I|Ll9d!,MG񯜀ؒ4лX x`B*UİZ'LzҏᯀWxhaIV{p/*9FYM@8.]sac3 GՓ`(*_Y 'y[~؞ukKl%i[:8$=@-*ZK%9C%4XeWNjr$:0FgH뗟 ’b ꧅')0^y ŬkDi+J{I?ٯ0 mE >e6C9܂Ѱp,{Sډ|@i;Qbn{߯"Qb|eYAqV i02Ke-ٺse+UY|I6Wǿ,V]KFfs,b!ornykd.q Zjz_8_3PdyuQ_٠q㨸 .s, ;ƢؖQAlꖣE[RMq gO7i2PY\=.[R9l}]FA&|TikTUX\ ~+=x`bƝҜGl/ 4)i !~`d X`j C|`4 P /лg/kSn2rr+k+rIo9UӉ&u@BTx-bOaH ]hc֝HjcG C>g qrX!BJ̰+J1jFKq޷SǏ/$޹?S7ܼRg~ԪS1c֞ȋzv6|Pgrݦ2^T6ILe|ʿrKMDQa Sy_\}Ԑ>2Zs~8mc86Y[VܮuSa4YGy9i(mKn˲kYi7+1{*m@uưԳ|!z[~0jq4%.87GҘFСÿ'p f|X #|nhx U6 ^<*U{ײ7(GNRs3}:|0YZktxsӽ4>ګ *c] ?H-sDuKε'g`t'+`gϊZJeb_9SZ}YJ#=B&207,Z"<֒Fȥ5A[ -dA{pRNrld̀wx:dWRDKy%u?_~,&/[}C̿}Y0Џ`+I%[j#5PB\=)n , 9.+8DdTx"皨bmLJlURefޣsxZL!5W2&3ZɈ\,1T /zc 1 bVĄr;J: IkhO'VJ̺B+~ٱn,ja- P O%[ -WAqUV@d$>o| 8iߦS+ oFH7D1-#(1ji O\9ҿmPJ(+}lȐWF- cQ[Ա(/ilI ~rϯ2}\lR> Me vFZ1|C/B" %Σv ,CwBՠ8с I)Dϐ~8M+>n@&VN"sV:d ^ClIe+.ݰV3/DMWRJVsEt|*XHk`<˗oWpEÜz_\nb" ܖQ28d7no[/o U&m^rJǻKqWbBJ'RlglGd FĨ|?ow>mMa!0٨0af 1>;8E=cBcCrEigϔ l9$ÍЫ'3;,sTVx, Vd]:\B hC;Ȝ;YA_tt%ŗsƃi Dk#wNin;%$%1ΡRTV"ڪ=3w'n"h7 4)X>[X2ځ7PrUb1&#Eg9U=2)odF4;-u_Hpkl\*{<^Y&1<ǵHOf_n,Ṫ[".[g? Np6YxHH ༇ ;< ^Y/Þu$mKڪuዲ>*ҫ1;F#EH'V]+LN(ɶR> )4OeׁPY76Td@f(n;U>}„ r+ULfDS7xsDӐ+2rcm6,ގJjhsûmx7nL@Z;{¥Ϊ$%1:\ij=9 DriR%0mz<{wUOSM3G=5S5P13Br›~Y_^'N(Qs䜤mO4MGjCm6?ʦQg˒Yae.똭?ꓣ숰.]]Jz5qMq~t$3]?qo2P9V[I7St5De!)LLU%zP`|kZ'%mң[GrrdpI.NV=46\I(Kݰۺ*9TBnĩԢvz |hM֚ 5JsNoK:7"-͝a6є仮}$DI=`HbaHsR.6 g}׆ ^1Qflt wa9]Yw˦xjq+pPJۛ?1Kr?bd}u>>y3qDILFeo hʢt,a"|kt3<ѬIcԝ9Aʸj -Nghj;qhA`K) j5QFN9cOUۅ䭐"?{E?A2_dx޹ghSn wCSe}{ӃwϏ{2Q71${#yП 9Zp7niG1/#ͅEVK0 v?E@v$?L#%=0T|xM| 6GQAKjG敌U kq z_OUδ&faD2'[I]g:[tG j@@ ,vM&d݁ IAAH֮U"8*͋;rpWnyQZzCAg?!>G|:(ǡ.3<˾F\o^˸>?k8XwBFO$|䱱/ֳsDI2t+=Z]X[=?12-ešq?ECGolO` 1+kaX3M4(tsJ\#wgMP-':(i6cLC΂} WzUCs3*Ն(AgsƭsO4]$v:RpKR; і3N!+]<"J=?VȋdgўK^BA[kJ&^:0!? FX`gޠK[@Vu‡łk7Sb92U/+mm[^y'Z9z_kci?K$5LCU$ӂSȿqxQ.MwmB5^@10f 4  u=H́TF{M9֟(}%@K $>1j_U ʗ< ]ōԒ0ErӲ174.vj\Y9>k"{.yb_mtVAQ/MތoV-5/4H8fGPQf&ܙdҖ_z2|L)Z5'~@GnDTxi# TC)EiCD yKư8s§3A'+TYv v8e^,bK}50M:ru \ʗ :V9530 n TYvwY;gXv#- Cw ^N@ƞm(i<'2=T{Fph u}+ FMʻ8T(<2b`9b2b_̩I _mG;Q!,,hg,cHR4 h]ơċ@ނ<*ҔyZÛQ=IX!DkjUp&_kC u!66M(s1)RA }VO4f@Z5o1y><.oPd}]?R825I$'oe& 0'XY{\^5 4k+n a ~Գ=j?f33x ;#Ҍ;<}} ͉pݹ_سXI4ԝt1~ .X~&B@Z<'=(F!WGU|K+Xr'-vk z٘HĖC.5 n 6bC;_C,Y$qBwd  =\vI&U2y6u=a3,y{]Zpz~#BI6$.+f[:T8WMb*5!``k_ 2%!w鯴Ǝmc V+ԍ`v- oR{.i" U"Br(oT(*ZSdU*Lbx'-1gP#C j>mUF gFM"!ܣorqa渦 ~ i['C~S{wT9Ra2\ϦU{$݅GjJă 0v])c4eU1ϰ ZJ5 ͢CXQCqPl+ I 8LT6Сw?X|Jue~A!, \vp>uIg<3_ 6ڗkHcbt_!ȒN3ww+{~>zp!M\4;q] [_m*Kh`"M8iˀqech|G=r602$˩UҮDuZ|At> N:E)~qy£V+bvL/%Ը*$YuI}7sOI2tL"?ބ)F fVES8y:t-)̷"Þ`>=bDOl?8kxd`feuުE*}US'õu؀)!-梌{`JC˄[k}ڲ>(nKev"?it#OV]nT*g E- m~ ܫRepr6NT6(ȭ|NFO"jE\$ƊWK%~Ƙ$|˴dE.}:ŝm4i"hkAi0:O-E< $\P_4[L] >&"Bcؗ Tu@m{%ɵj q(V57AK.0@+d %S$lZ=tDE+NL.aiOn%Z,l*jrmf4$z3 \'+ Qdf@E`._c?:=1KHg]C;=l=Oi_bӨqbU{Xtuk{c`9̞ dܳ x h cDADʋFDÃןkޞb8*S3hf8]"W{%~qgjҖs/h ݲ{_:9qՋhQ۔ql ^8FSdyZ2f&lRO!9gBojOMe첼DeB})(4V(8p}H7hT("/uQŃ+eD2 k=-(W`|B;ʱϬAlOqqLICʽpMSTH͵V;9r}aACɍ$j]DvY!_6ǵq)|dIPuaxjMi ԔrRĐv nd;ӨiqG!0[92nKU2 Y3l;)E`)nHq_[#"qIQ=(L3~E9!po-^P,*_k-ꄈDaw0 = ' ¸Hy/"R fCEg1APB{.ZVR0=r1EiэCēu?h!\J Vm{L@%CK{++{\I1DơWoJ475dnl-ʯeGFBë˾.|icJeFo{$VA˹P ," ruԳ`O97C`O)Ug.\:˸DV hQde567?ϷΧԨU2 T@, 5Zhz>Kʉ,u?҇PX5éT mE14h$\ 1l3]/CO˒`6;4})fб!NMy0g u`^)Zn9` 66F\o֟c@aѾ.SsT+b F7 rXa &x/"v`h۵bz'Ԅ\[:R4.HJH&.*e |v#<ٳOz{}/;;5I5Z cMH:AYIpVz tʛi4y$`o_N4qRݱ^տaEiw,=SbJM<* bE]6~4"~$?ok7C8P>m-?Ȧ-93< J7 uGXz<}\eݔz~i:mo.{0jW"}9F<nLu֒`nJ wξ _KF `@8q]_cuy.]|x%W)/$%%OмU(XY?f$T* 3~E\9vjߛd `V+䖎{oȑe,i49hXጩ&3[]v%0{ijy.']IL!u]YhSԁ\5s f,6{K‰z8}mt+!rȴ=B JJȇZÍrG)^j!:Dap@:"SBE1wl5648'*ڪ ^@M34e~`g9k}[DuEƂPM>Nd!` ~ fԾZV ^UA=}t :Z}Į btQ] G%[ @IS$ˣd gUj{0}adK]BbjĔo{ylƖY7.pNkY@:*PQ{׳>AOY۪~ɝE6Cyt.kyCA{~ol|'a8$@>ajn1XFۉ6OfX)Ct%PWXGJ* h1AR<3? =5-8!(M)ãcǟPVw͹_nEDZs92^Z.9Խ(w+|<3%Zwc-!&a>.>}k{를ZoIS` G}7_GXmH\fMYL*P P}Pnr'|8T#gr`пtkxbA$┛0;1g<J [ '%Gx !K.E@0](w@Db BJ#U[Ujb_ No*9~z/M +"1ltYD [꿿^!O\& TDoۭn4QlLIV:juSҲ?Tkr;g"*ii $RD%pݚ@5Ui%O]ϚY5M'01} !/.ǒc(\ng6O˒tz%#`j{]*6ngpYNn3η $=bGux., }Y3۹R2s(ۥV\k(+ϞWXUp.(Vw/BWQ_KQ(xa7a1V-gT$`Z$͇j zQkSS~*^Pe#'H(huF赗rǧU*_w?1$\+sm;ː(;bI0EI`oOӍ{}^)f(VK4p(Zhdl ,Om'> nkXKH_d; 1 PH14vߐZf^6B]Gyc !9^}3WK,5 (?5i[-8Bj#f퐈yù'b5WdZ) %gcޙN }Yj86?)g4XGfS'`MWFx(uǒ< =r-Op#I6"W U]yl<,X G}è i\s+o=xCVl;|,mrqG߯݊VoW'aQ1&8v˺FZkU& d*>U 9n3/,l]{2;Wh~y* dnzI}Y 'Pq,h9Ԗ"  \&4T 7MDS U 2I}) `v,;4 z|zMA5jQ%xoP0(hhm/,tp)^)<%esm)%m6zI& QͼNv#09VU7M&Z[jj@pUd$̧9we%Ш³{sȶ[yh`%KlT^`@%ĐQ9?ؗ;I -1q5F֕Z7a.IUCܯil+.xxxS`wPh^aAmNjW j _OXVM-\>A/׳O$Q3,|fA ywN@\tdIEl,~lu6Y?Hl;92I*"Y@hG̓}K=Q+ZJ"zADmiEOr4UEfrRBj^+&? >!JIlw.BPoᵊ-֍]) Yf+Ħ6k3I5ob(؟C фUK`NGrpoufi{JV&A|'z̗1QLhR`jjҿT py3@yCHS=-p'kw ?#Kϥq4~0(MoyNbR\?kh&|ʷʓ4T a?E@kʯe[ 鬩2[w#gnHYd\)ˁZ>Ijb6PEb E59wPd. 2G-Ibm0rRFk8^xAq Ns_g$71MxTk>W|b)d\|;֚t .sF*k%3cEukDuD,>#pe(h̫9Es5 [ l&R6î7e ;oS{5b!;C.[EFUH>$H=QΌ/$Jb~?fv9Lkwl ׃Jva X1d_̙ > Y2u6|/le5,UI<n2hhL;F@l1Y K,; Wcb\kKjN9zC豤o^zTG_o$W_8j5g?ɥ D$X ft28esfUlz^1mxW.(om~#Ĵnş;,~+EkڅL'}źH1Q.#"NXIJVyi #[:v2ΫԂW "$Ol&?~!zL6[PJ@hx@qT!l(0lI:Շ9Mv/Ziv&J4@6V`xdq~3"Ǎ^Gw1#/= |{!K ;ww7B BHhʱu| Gf}N8:'<{[aq@vGt}@A.\ݦl~ſH{ yc@!K:J&_0 ?]+!nQҦKO*TX\XgtptlC_>p bGyICJh=(9A?cdjmӏ3}rV'vN\mAX:[lBl\<$*֧: v5`ss{P|C䒛yMĿaŝlS=8Ӕi8AuN"u;@fN9|r `TLɸU->ǨfX*u{}x Ft/~Meb̝mܗLb.Y"OʖaM gpo1 91/@U,:s%t&WF< vOWxp(} gZy:rk|~+}R҄htnNbGàQ>84P/3#&ĵc}oO\mR>*5esj{Cm v/N~o^(ӲF+!U7i%_I1eUB1@(約7Ա又q# :{t;b u7=Pɍ#@oaT,~ճi%p!Anns}u~<*t@C\9b~I[ⅿ0 qOZ OC$UJb0 lW:-S@o90 akXuIW- z{r2) UY@؇_@ yr )Z"rVu5-dla05P_:W m@0&y4<(xG{L 8¨įV r wVf!+ONF,?yJU|My{0IƌSy)vO]:+&c$ r4Kj$][ݹ9:F,s4K뎱{ߌUy|2,q#ʤ b72tAXw]SyW z?'j]PW9&o QB%"Nvp6m #3lj*&-MV,Ph_8{Yb@mjhOhZƦ9GWç;% h ك< _]o*{h΍i {ȷM&C )-Za,eX%ANq!<֬&%6#I4+ɠWOS/8M}N&SuȂyJ}ɹkFq<1Gqp4 Gwu'hmQ <+Щ"JM QKG՗S4=Q~hhSfHo5tF?M-0HK伐/)+@;P렎w:XMv80^3W, 2R֖]pOpc&NlmOM['9P %$@5}+WCHQS:-F?Ma1wjc6Q,'n+Y#<<_mbfޢgs1SSWh%bqs ag3ѓ#y^i-eI1(3 '"cjj'FtbyvxlZ նJ2&@%W&9٠[|ZnDõGh.L@Cŭ[yPR9h+a.~dd2r(J7YtnV ȂfDG!ŵpy1tsϙ18x.umD[Wacp`H )aI-kLo"o/uPgROEϑ_'ypP&fh¥Ъ%&wބQ%wqNpso_\:⊹vb_v[x!Vt0~q"|TҢ$q!<ϳg-pIk/92* .Rc{}8tl8ĥ(J4n(&D  C[&v}=~#]ڍU[eϞVeځ1M#;`Z)}¡VlYyar2 D-E|4Ɖ*㚛ve]6Xd{iX/;xeֲõ'/.?GcCa-M@9GfioD.@G+J IyLG\U`BN3u!qUOPxCTpc'v/_,+дs U6U:Q1B'6ez qlOVTTY8oM?•^Kޗ&3/Pe}P;-"J }緢2OdB{OV& v*A.hkGoDzPncl*>==j$RDL#($ "C&#_Q@3#ʊpAؽ?eI i%r俔<3(A~aT^_߆sT1k94phJwnE 摪*:m.׎ XtSTbީ_Pu1u >0@ rbLr}\џWy԰'w3Wu +ڐJPi+?4~7Ҡo#yP^ht_{GE46[$C<Z"Pz"-8cXfĂsH&JٓLLo[,1Րzrz,"fHtFes0H^/ĭ:ajEwvEn(`пbEiaxH+-#x7wnQIν,4H9M*G0u zW1Jx=ڱv<%c<5+E6"eeH3QSeȧ+7P)kf2\GXnKH^!O1xv2;E8WXۖ&oڧEr wCm>IYb+GPNcQ0’B1xԫ6h !3 BPU{sBv?E%&cnU$DjŘ?ka{]Vlןչ45/FF VY5멶:{?!0_D ;Dm[AuV܋Ns-1G4#@1+HP՚%r%]#l'ֶ2W]Sn/&Wcːf`  0J)zǓl+zR鿚?gXl{̒PkDOta5okmc.ut^v tewT9 ފI8[:>cQrOk.םNŇDlsc[x~6DEdjRKDc :|̟wXU w]\{ljK-QD"(`i%v >jV/&^c, kWm3̪Nf|ߌ"Kȯ:01=t XChGx ~oern A@Nk%FZPmyKH(K tX M=0ǥ;zu%#2)$`;{3+l 4!@,Kp$G=W" >-Yb+"o>FB X}Qdc0%d:R_F0L"Oqpڏtb5ҬioFO ⶷ &#&Rk/1Ɖ14 C llt&+2eG@ת`nf k oQcoxSx󍇯+׍^KRB% q~Y َܳ\RðiT74ΰ-5QQPJN=~w&pK XzM c%!2CaAo:Ef$!dtofB5-^Lq7ל-*ӫIPf[!1|(e *B k/όdxb31M1S)QB@#V!붽HڔnmI%vy+ր#+ ~̈e%]Q`snuzu Fn{wYY] muJ{@hMI`cz!NY;Ӓ:#CQE>8@0SYiD*H5/ͼ$ CGM5̤B:#+`Oo&ss^-&1)&H OEJu+@34~Egnup,߂_q nfTVq[!|f}ⅽXg|!\lA\]ov(Kߌak0 6n`KI3QOtٝ{Iק)ɞO5OҚs1˨1? emw1Z1Lih%L+-KuSƍ Q .yC㏭So8*k,)%t$?P[LD yMt*@;j٢Nݬ1n"'!i:.4l d UU܇"Q q]hԩ/LX~Лi_MȄ!Xmx"oS@f%FZ5kTPU_؟SV2nͯo6ͫt*V&= 굘Q`ESـ﻽8EЀ8 QX)lƨ㏬[V 7}XfR5* &~mdat־wyPθj1-pPJ 8psUJ)  q6{u3³>:Hk|j&gSL{PؚߴRqvD@} \K&dڭ@|.;iF-95o sb5vp FzPqr} w="վwW7NI+.kvF:eaG2j ՚ +y3kԐ߀gɶyԧy! k zd4 N@Lנ62Dԁƒf;3fEN3v~u o 5!zh&hu3IdA+hP@sv7q]&& k0G}0a 91h'~NC}$GS ~`}#ac~V:g]߈uv+<6kB⣮+VOJAg'vē_c{<%-tĪxkʢQ{,e, ^9AFSma.1kt]`&̫囹) ~[ہt4 ދVk3?Vl3(\Zi8c ?GuS̡f,?F ")cDɓTI"$P@TKDP@њa +(ګQ$Cdyf¾zTq@nLc!jc>F5P$*gSgj8<hGR{2vrdV΄)6KGդci@u{ghm% 0ECqM0"-@5^G&unn(<:>6GKߌ.T'Ec_Ir 40lrb mzCkփȨ!D"׿/Oe4? ąs z8@`P$?xqWM6]4 8_C};aIo誴Mk1fd(Go`D?-z_hn H A}QUUyDVLIvɘ1Je)lΨn䵞(ퟱU(Z_yT&qT(Y'6Hgի !CdJ2]|1@sQuC:/M)_!C4y-SH 1ҿP6ǂaP Nd9NZYd4~3":ء/ ɝH]eSRHa`OO';kM,sѧLY;lqG z4DR%)}frZa-NLP5h$E}.xp )opzLrT$ˎ-^vط> 0Nޞ54n+{tvPr ߛ 5zK}/fN-k9EtpNJ_w58Ei1QO sjAPzQe!1xMngڳsza$F:Mג2pF|ϡ)T^ .*(H.D?uCG[:R*11M7ܞ:}P= 5M4p~gSNIx\xn.6~<}g}Q6<EiJEKJ ljWA_uϋvJLa=Ish,VllGSBOq[.xv+VeA;=_zkCJA:'XS.yth!rHTH?? }jpב­eyc `rs2:1㜝T\,v=Y;ѷ7!0`z9s[hY-&pP@x`ȶiU-zF,-'_iU7xKZu]ta1 61vY8lTF F)~s ,=, L UU1{ͻ9fӸ'ay A(jmۙl8D=5@i)#n7h\L3sǸI!&WFک@.X=$ӏ3'^pG`e[Y/b0mQ"$*,vmEzֱD`d=aԇv|Sr/_+-|}6@[+=ՀxB,!:IGp E\ T?9}&"']q~K8C/4ʢ !!q=B1'Fړ)h 2mBɳdw{(XgӺ`cMU~zYT@)@ [`V]#oŶFH:`T?q`Y AAYӂuMPwSKU>1r)*ϙP< 綮wFo)53}+"OmYk>n#:o<8sR#!BSş[ͼU(Wl e' Axjьu%:yD!'N0mJq74$ Ad؛a) #(J i#yjw bi܊PsSt57/q-jtO2V}r4 5-lk{Pa:"Ro͜6q58ˢŠ`%`/PE H2EG ri){\m wLp!< BJ\_0}z}J%1/yJ=2複q!dzn_evE<-he#zl@6 ''Ż lSn5 zrҡk%:mKD|ґz F`,d iG a>_e<W88m´z;ZYƥ " n\f%kޗ?)Fg*tWkž]lN˲$pMN`1dXh\^מ⇅$60YJj=#R|Td1$YQ%}/pkf֬68(jYv'h&@KkM` V@q64JpA~sj:C.%4cӳཱིJS&GX^Ҷfr=mHw*|l//)/yZa\~SmMҭ%\lSF]Of`Jw5J^h zޏܞ"GhCfMǺT pתY̯W d`D'D=óT>"=wM*&mhc,bK$q niT"S$ SC;9-⻢&GrpM1 BcBƹ A.c1 h(E9R@UV@ߠ, %L&2kgB"Dί&ݮ:gSvSk4fjR J}*T֓P?I=+O,1Jh$Zs^ۼ'͍Bl3N],0I7nrjעlya K 3X\\Z.br6uIHD\< : x?]-`e3Jձoi,:vWqӟV)ff m}o$f4N ヌHVxa9Q(ɚsw3 ciB.xO#wY !Lx31A (Ceua\bwaРWpg]֢ʀkQDyDF٠wz "FD*;QgHfZCp>T*dce0m'U.gh3z^c)HؚZ~oN<*mE MxJ +&Dn%u w-P?2ӭۨ$-+Y'jL ͙!>L֕Ζq8߶݀ t_)xxM[숑L߉ɗk#fN$wTEºU oI=8 YsM0X gDcxg'ȩBRQn3~Tin+!^ M+E1][3_Q.e F)G*Ť"_-Ex㈦fg.Z1TA0hx #zc u ` _;Tܛ D->fw = ,o?rA\i6m$trq۵X ,gj_#Dcfw߁e9CSuϩ#yp-sؒϡ̶ R-M8%5; }NF45zX#>X"T׉ԻHEҰ^}%) @E@["0 1 !E$ C +0F E `㧫Kq{K?OK|)4084qNnu. GI@>NϗY&` Wkңa,L>g-66CEx1X1=xF* Z[[gX|dBP=vLX 6>HZ9$׎ji#Pq皹 Z2xHzFP5kpy>HzdWP5=G 7D4FQ KtbMi HctMUӍϳ~0xE`Ƴm61c n,T` f! :g4sE~ix&WfWJiD@SFx<|3~oL sDcY n~IFCu.P42\5e[PF 6(`7h.Dy3Um``8]j>h40%-Wv/-8@ λlu"{'*{PL'A.ԨH( ) 90C_DsD (*]C)*65dfQ9E1gͣнiH_S `1fx3hsJrcǦ&_!}hFONx?F9+ {c)Wg+?-X/`ճ㼩 aZL˜]~zEI|mIl@FS p] JEuCm'4DDC@M;Qe* Xabُ25('&7kw 3.EdtCo9~tG_Ey2Gws}f*%uG8D.sqW)S\1-o*qkh$Qqh!<N1hM:p>k#]@ ~s !k_*2bjtV{b!H5H}+⼜w|p#\i|r{G8Ş~'Iޔ j8뽕pڌR@В>St@&߳5(|LH !ʷ\2ʩ{XK13G0rV -é@SUhԊZinx j[\Xl0X1z2u[aI`>3{ČR,PP\ȇ `@.~OmoЕFyd(dߴdy_sύqd9޲D#&G>/ƥBHœ*#aq%U%gA4<8di/.r%‰kN;dx 2ܼ$0o`Bt{ڥ%.|sx5>6tjnVYB}v6MrqSnF ̞2$1>M8驙]]Ps a\bob}=MT(1-[&5%6 sWFM7,<]H~a;D\c($sP 3l|'0'Z&3yӧCL]6eډ'"r(cG%Qq/D>&ޭrFOvJÿ:=8]Y>>O={hx3|L7.ՇW }Z&5/oJ+)鰔oF0(}.Yﷻp /GUI7}hIV" KS4`DK(,f.ászDUrYce;'DEl/`QLagse_ {ψ9T^%JZO1IPq~J~2Xtvb@}&U=lѮJJ^ڬnsU`lRTa<84Α;/=)mokat~_M#2v,g02Ez wg󥜍6:L7=0'vE8{TF*"kcQmc 3ͻ73;x{^wR%տjk0+1.w .b]t{uk5~p]ho+L3Nŀ+hBnm!2SQb E4+ŠdİS4.^;<EiSPŽekJԖ,!ú+K9@&֔,$2Ge\-zV2Ue#JQx78I\98:M ~W *} 9 L3&g!@uѕy15RY8©uCȒ0rn*$L h;U5 F`!\ " V"'u !۞WOj BBNƾ4 x8D6/ǒfr"[ d"u?iX5CD7zwN\*O;ZU2ֳWrYCb(?. l%`<޸Ej[ O)77-*oY: V1^(lwNYdUYRd.(}`xmOt{,o<P nC ":Z%$!S3a ;OEYBʚJ\( gDZa,)%|%Œc\mY[GbF$cgdf_6znt6p}_YbA x_qsbw7;ZαޘTz?Qrqw #F3ȣwmi1`{t~Ɛ!}_DAv# =Z'Ŗp%ap$ +XBs5*5εM#.RXw+R,[ e|;@t0I $P@82\\ʙhYR @MM=9I(rQzo:-gc?tPXGj!/wurAz1RNop4|_ oEYE"O8OWT`{á8?Żfg& 5됴e2t拣XXNֶ5'0`T.FJ< 1ZcѵN ȢlGv13jKӮ 0cw sc5LLT* *NcMݲ/!ƌeMk|T oM^2@|&XgP5B$N}vl[Sj>(*xUCa.Mgc@Dva;y8}Yߎ7~IM&/e4OZg{a"&3)>T8P}jζL.@a>vWކwF >?>swuVoqz.գJQ*Xz+1-BzB$"飧|b-DŽ`|4e1`)CGlrga!*:RJMM|#ڱUqUK;WL0/?EA;YEÆR<Hrwa?LM-JAW!I1v%M ]Br/+WA]3z%U8S@@.)&2Jf|xKFa[h%NZ.hQfuE!e@zʒX +1d;T@DSHM@ XqNV2t L ՙpsPi^lث7p'M eF%k0OM8i׸Œ(Mn\(`{dMӟu:YϝeQ_^/;줼 WQgtӥoNyx!rEֹLSd(փh?I_\E̅1|0tkT/5&:ڬhxYrhjUO D.ROCuR9f_hdE$É@iJ/4ӽz'dl04rK.֝ly~JKKbF_.qAMXY T{?ڬWf#QnuoaGv<~2 !WiPrV9p?uXjɝ,St?N՗O @Wf}q z8k]A=DgbiDLc: q`7\¤@7͉AچU˘ L^H$.*FoQk9J|!u sxoLX,e;avh#<^7!Gt8G aNȭ:͖ۿqu0QҝV^)cxd6 $yS:*.~(v\k&B`MPOV&پTj q\PO>wS{.[R?$z0ri}|a.- etӴ*᱗,0>#49H1 .Bh{ϴ{\&\O23,ЫseTavd pNj( xOUk 8ȁuғ‹<ҰY[nVx'w+7ƅ>Szr.kZO6=As /CsP@1z" 1иgf7 vq u\f/!3oCf/86Q_S-p)`K*A Y%DpȒ?51 5HNKމwy (U Z#YIuf͗4R*(6x3=7.u{(:}+dVƺ]wn*rI xԯQje0ng>-e쐅 ʣytfsR=Qzn4-5+@ iS=;j屉 !ӿ*Mp$F{weÄP3xS ] nAѸI{z = =żX~K2)5ON,\Ą{R5.!v|b shhq5Q;p#Ydc2lI^ @֖-x=<1 ?4/>fIӌg(P\?+, y<{xU%8x8U8e{Vv'Prt|S5R!yCc3¹Yh5ΫOοzF&O#+OT$5걩<7;ekne+DbAIJl0tbj)x@u#JKi#x*q/>4tz & Q+qy;p;O}E[&LNu;//& /X6Lc6|㘇UEoI"npҗg%%ΠeY~ֽ'emLE%xZAB`gIN9Y5 OJ!*1'-.RB),tՄD: ^4ΦIab|o?qfk90AM 8w,27<V2RPi@*0sd>g-BP Ř{RUK"̕.v~Zr2gͽZiJNpyMbtъ8xl(f h*uCxy8c"{upB1}ʕLV?_/I{3pBo#('+ޢ(uT~)r+b d^?d BO"LԵNuO()미x'Md(ďlLY. 5#Hܕ@oNbOL؇>RTVPB8(,P^e`Le7VH=|ב6ὢ!guuge:r-)sOOywXF+Q oLþ sg%"{$N[E/URFYҨÔks2œj@ rDƒHM86L=oj3*=Nd.cR:Z֔z!ǎlb6Xk7)O%:L h 6:Op!=䪻缗*x$uz|ȐЃ_dqq&! 3bzcjlfL6fAje{6:{Ef"ZK3eik{$N}kcH'ae h3Vh*ɛ}F^]tR {Y>z<;9 7tȓق֧GM];X`M)Q?9PpdVl#h#ЯK%}wzYYNItD&T,3|EJfi>9ӊֵ R&=MtӏFV_Y0$ϤQ+o$|ܙjPٰƜq 2o$=!ƴwmQRXk S|AHEuDO*&Nc;HM'uгKQ#qh"FLis 8+ù_Dqs80ť8"63J=ya2) ܄T\=Yi<zSf1Y -вl?>lIZD7'kCvk 2Z{uEePύL4cϹZJ,da9Ș%ǚ-F[yT-Pǡm?ͳX!תj;"(󺻾VG퍭z PJ7JEd s;B8u~v_{&nF0k 瓶<eeʞ+87mYK?8?؅ʙM#lq#մnsR*]Lb NfT6ZudEbI^xƴtCh2N'o|jh!]M}ҽ{jAD*KL1UCg0+֋Q?Ysa0XiX7 #xrvZ-T0Ч:.A7-bH"u3] zWl[7:yChJٿګcVHkXLSMHxцӭxY(+=M |PvR4^cr-6_&3 [u^ CP!\gNJi80@GFXJmcd _"yN .0{$0@ZW"2.y81EmqYrsiiޒn8sAltY oX7Ibajw.qtBe,;\*nL{5+Lϓߟ9YLzO8+xe"UJfLQO4’xM)­_16`/2O%:bzWH{2B.sB*ȼpTsZ`Ϸ"H*s}Tjq z- z dWXSFRF)|D?"-sk'sXKH]a·҂*Z,/qNI~Mu)>=(T:IGOi:2?74Q,H"oJ )˳9bna["ZJ2}hң2$uطjXѶΙssҼ|v;cDb/r4el)Hh{|jz˸."5Z-\'ƷwnCZekJ+CŒ sF!5hvf,Qzoy:rP+>KVXݨ~^8= ^`^So.`M/OZpGV$9P^m9Җ=ܑWPX$oKA X=Xvh(x tQ>G*ѿH"Wt13$Ax<™C' qh%]8VtAm(3ǣ] u]_D}_=g,L-x #ҿQ2.ݸG?k_ oZXv|MF}^uhW'SS켎;SE | >cl#}8Q  |MHc/!;}Y(f|{ܐ^-.?>V <0yH>  dj N`ݓu ;OXj\ef*'|\"/Irt'9+J{& ĀHJ Pksযs4wy/!^Fbuk'şullK\(˅ZCq4U[^]=$e3,teuu#"S?3iжGK zvyA]=I1QO7JqT e6ovmXKʆR>4х' ISZ{:Bsj>zB ZD15.X]/647cF!B9 nfخqՌ )8 ciC8h9@0Xڽ:K~񫳺1at>ȫ妆}$ gP>'U'Km^AgF0=><GEKtZn碁wi_p^0]r!Ǝpo#&wh75ެZu)Fig"9Kwg'8|@ᅢ4)V#vwə)DSQGT|ٱMfzʢ>{LS,5T.rl'bԳo7y<Y 죰u ӳx!#7 ( OJK}2s^B9׎ iKWIh'h\HO3/{!a+@C_ qsF& -?9G/HSg+#Lc֯C3v~;z'~u;8~f&Fz-dmA(as%be &|tJU!sWx|wOԳgB?:$nO?b.L%XV\#V󘨃qg i#72&m$Ā.b⫣*AQT*gbP/%czƽ8K/wR#饹{(J^ w Ն4L3\L RɄHq02qLMI3@=kAVh>HXAvX]h?ޔ[pfØ'Ut];_$"qH\o$\o+lqEXr$wNк'F+JT :t 4>*QvĀ,*CGsXkl6N;r-Ι@hkq"/|lG/>^j0Xt:&g:M{|?EP.<pyIZ_ǫ* ϊGьq-tv,Jg!^ :FQ_:|YGUHUV?r;]r^}Aeu8M"CV0fH2s+ez0NgQ5li2yӷ'fBA[ ĺiסE<+pOZ>N"K% !c,tɬ*8#7Xd_MXniM/I{X\Ą^$! )ކ3p3HωsxȺ'RoaYU"+7C D.*9J; jBv:VHCF ԇ@z]Ulر9R]P-S{EN-βk}ʻX# cc=I7ڍsIBn(I/YX#! 1W*A ff Pҕ(n'oF: ,JZX](1q30cis@[%J B2įQ9}eHϮ۩xs'v!X]$X ǎ'儚]Z*TevkOox}|:%nfʊ`u˨7NT A';l J=: ekOo|*NZYb%8+Sa<>+{Nִs(\h!ۏGrCYG2=T/vORv:SRM/-o 0o'=ylTlc,z*a<?HߜV6=ZO 2Q% 9W>%$B׸8a*ofMd|xW,'*⏒htObbsuHz~dM{SH³G債faYg6dm=u%@wE$ #mQq+@\GOBH{&v !pD55n`H8ˎU|~pNkt2fEq3`iINFMdP!HA,rDm+l|A6' ,&@N̥K233+": 594Tr@4֑Ql [U}Yg@["7E' }Ö8Ʉ\֧QKy;)hž\C,aÕTSgE7#8Eq=w\+;{Z$`}\M!t⺄v1*m҆`c>#Lz9cC'}8xXV|)X$'~%chh:Eq-{JϔV ]QV'"٠RO*la&-4h2uVeǻHӌw H]. 0u,{MF +YXܙۨ6{^ 䦅~3#V4-B9 lQVqkt|bb]Oig-ԏyK9RkF Җڈ$I,:( T2Po.ÝeG+MxWb,C ?S!|13~5fO[&Bf"fi?f3/=9p.u|Tȣaw~exuϜ9Pv7ZKg-KYif<[e?$xqBSU-q52zONɪ7b d1>a 秚MyF{,ן+{Ja+nN#yǛ̎CnI<7og<;6K 6& Ϲ$!0 RjB+ɢrc ]ĝ.30G,ځ3c*x"wi5ivs&-WQhA(;-CiErĽ?E80$2wꃛg9UGxEmuQ"nXABF i e< :csj-sW`-8Лfصe1nZHܖHWx0kAOu=6 :ncor)z- _B z6g]6A9Ϸ)Z2۷lZᆪ$ 7rlLA$V=莳7 8.Q_{bg\̘Yu(;hye۽խLҏ MraDeOɩ*rO6RUt|:1h-`PRzhFS^cHȻ)`L&z{>"!m {t7FyQj T,K߉ z\f}&ڝ1,po&\be}UQa 6ФW*yRrxKFy/wᣲXw7S5U*l4 V%?y7ۯtzdRYt^uZOK tߟq!.sE@ HˠFV%[F\273 gI|Qu5|O>S>K_ $N5O|ا$ɊU._!tGշE{e/#,NwJe<5jqXIϺ$g_0d?Z%x4l 蟦n0fV@R;+-F2H: WIQ ,O_F-B8ܴ+2\P jC:t ˓FbnMq}Ȳ0&nW<./[5"0A¥ 8/L?FYU'f~ EHC ))oX\A)ܽ r\E7yhmn?C!Kg@IqU 8ϻ4y*,/5K~yK۾ºW~BB7YYנ]̏^;FߏQ 8I.ƒ^iI̚5/`3+XtBh H/7ȵ;୸>NE(y!b *aAzǧZwʜDyC0W/$eD&_'!=:v 3)~{;~,r_lU1C2YUX^F8]NI4) MI eCXf/@N &|ow>Ԡ$>.Q;8V96lG6ѧ8YZ:S-5}ߘ gd&hz d>K`|ȬiW]]T ,H)WU rtv[!IwZ( xBjvZ)Pi&.|SౕۨNj892J?P<[ >~Ds%N4z(j-f1YʗC7<8,5LA$<4||69.x^{Qt*ԚH 3)E9PVZ+V/pIS!0^)~ b*jlqA<&ĭKh<ʌWvۜaO~:/>)QVKׁ}n's9d>o3aFv|[|F,;"Ei 53 ~xAe@ ]>Rzfǹmݠ՜+6lǖu7 tL;O]cX/[_A[:w -b"ak~ 9?Kbj%X>V,(pJt lL6^ kv_ G$5P/>]fb#_by Y9+tIXnxUh"&>vD9v:H!WBKIr+`S2mk0Ww爟? 6LQhM~-hO4E3$Sˊw=Dl|ADZ`lBD4=qWuŊ-57ԇX2ĵ<[gSM #7H pӬ611аqu*VɭyG9sܰ0+[Y-ӪT'F³ a0@9Yk#tܳy!ጰq6MvjIu1aΜ,ͣItFY1o!thAŐ@\]CJ[c:6e!a&*W\z  !j3uIG=I ~ШӒJ' MDzN L ߞ\2>m6O3&@Y>,zOt(ƲQΉKsRW^}VCb7q}NhlRwwn4'͆>z,uUXږyM ڇ[E?k8C`ϩ,\S.--lhZS1kJ.[L@h8zK"9e$b NXs iՁ ͶwvMz\uSL,weAx&%2fKl+Lj3}uL\*пpvlY*r-M^v],"")TXkrY,)nuGgN+b l!1yNU" K*# ,\p\敹B E3Ї(W4X 1YZ{U+IVp?4-8˱_~hJ91\pgAm+S`*TO~Z9?dt|9͐ɥ=8zK=PE(R7[u"`GWYk9 ZSy0 b2yJn_"'uG8gNJSJϝDkq豈ˮ[z['fX[%nO>*Xiq,Q#0"_r9G)JL!}Gs3/C'ƚ G4(_Ɏ!l]ᷘq ϭ翼z-2D;b1}@7 tm3q;|ŐsKqreͥTԏ2ob^̻5fY4`M427d^q@4C}5nD/޿/ls#vJ Cp(*lNd.,$ȤY'(r$sۣ:ĉs,RTtj<^lS꤫sLK KKGw_%if:.ˑt;ډ_ez5cCL,&fx'8@+m`bu83\,iE0`",0Â1N'qO9/)k˕=Wp/'q궠BBT`hz/$|G*_+0s`,S;6#hFO_&*7NcʺLiuFze~6V/ $ζ#wXT L17mtGW,AѓNUQa鑿ca%AjkM"Pl/vv6r{YpQEbmG[\Д3k>pI2D5#6+F?ݢzzT}Oc㻱t+7CCmݽ)~~Klj s#3} 1y!Xq [8рY{Q`1pi@o/ /*MBYW )W{s:q&qX:#cʹQqj#9vF4t;yK[%qQIȖKov2tm/S庳\1"Ij.7bt$^@w=o\C|JRXynk[kH3KjZ)>ozRRUU(qvf 8 bJIKxߡ)Av1oLz2xvg/ e\XH<7@c?DvoaRƗ]NoG,ˈ0yr3?HAhMdnfGn*0H /jmam5,VRi"(4*a/attwNm2}ጣf؅ob%BQ=5 jB1<*tL͉q}PR0?C_u7 ѫzwZH< Eh` 4 x"C\Qa {K$nG.Qz,Mm8u0㵐9kҪ ATF KChY_WIfBk{c[*u 1 3뜀DmKܩ& #ө8TLWۂg#̠ۈ>1<sRP-,14vGII͞oSf-Gҭq +tD7{\yJ$.D'ٱ| HDgRk Ruq!5ps.JtSLhFZXpD}l %e_3øs&=Q5GBqqbOC Rb\/ E*TUp_ׁ}|&=cV;DFKvf?{.iWBnItr蝕"-x@8v-?|;KF?ʓY[.(_H~7)-80%0ھ0Wd5,|׺tZP霰 n4 7!8)Y OR֨]2 Ia{Y^sC/>$[̏;/nD Ul~h"pyV(ul}X"4@;C(JvA>?ń_d$ s3])Snó,0 .^QYЁ/Ec4[q 5n"ڢVo MǬ 7 97F{Њ2N{|x'sГOH.QPUwՆ lT9ݞէo [˟Dž~crH] [HeaL )OPQ>[ЯAz2Л2B LbPEO59޵qZ4ۍh$"f(̰X~a7|<l"tjfy5P/vd3)`qg4x0fU#g<OSw2;_4Yk]4 [:&3z:H*holZ@bue= .dhYhôu ^7ҹYtvVf9|# xTIncs7CG,Lo!D״٠P!G& +|HP!v@^`چ:Bp;)oE2A6լM pϏ,sq5VIάO*t=ο[`{|bj]aD8%Xm!0>s:"#5O7u$Y ;QUdBdUZsz+2wt2`7؀U :jĝHπKs#B]!~7 |Ev0 DhM8~" 0>&A ?,J>0 YZRgoogleMaps/data/NYleukemia.rda0000644000176200001440000016157614522123306016153 0ustar liggesuserswxU)"$`%[$DDK! %"˱FcD(b==;7׵Y+k͚yIm6 _`~|"#:;G|`JW[ 37V|._3]Wn-9"a7G sD9JR(c(gdbfsT7G s4G-s\ccgh`hdMkhfha8s4u7Fsds6ǭhcs5mhgw94GGst2G92G9w91GWsknq9z9z̍990Gs 0@s 2`s#3>#+ Thr[.ջZY\&-4iۤ{if^jz).RKׅ^>iȥdž>6 }lhcC{Ć^jzst}\rlzWlnw44+ib+ib }c7i\ƐK! ,tBجY]B va7 v6m:fcl:clC'yhyp W^(˗^jzyrycKׅ^>RlhWcCЮƆv56] jՖTmJՖTmJՖTmJՖTmJՖ!Tm,/5 ,RK-B/Ņ^jzK]uKot4Xcrifm5 <7mE-B }cKׅ^>C˗ąqnA\[ąqnA\[ąqnA\[ąqnA\[B:j:j:jJ覡jگfjگfjگfjJK *Kfj:fj:j:j:j9C<-B"-B"-B"-Bi"-Bi"t@-B:ؐ7ņ1.XGK*6TYņ*PebCUl UVb ԽBKBjzWre.5w/'yhCWz W. Յ06TƆB7 aBc& XB.>TcK\hE'!B{1P$.4 EBCP$.4 EBCP$.4 EBC˗B{1cC5flƌ ՘-BeE *P%Dc[(TcƆjP1cB:q }\JĵD\Bw]h[ׅu}]AIKjir.5 ,RK-B/Ņ^j|z7.5 ,RK-B/Ņ^ʥׅ^>R;] }lhcC{dž>6 }7 }_ϰCz$ ߻輻./d/U+d&oy)I pfٽSݑtf gܛt{qf&g]jo.ě|TmW~-Դ[{Goi.+bW/NnikX`'uL;>8smΘ4zd&xs/Li ֚ëZX:3Op׷*t?m1;ƹ[3v}{oQ'|Zg~3?v{z/L:1sJͣwv뽩3*.YfRovmvfW.rq=_9OoLa0AS2v)L#:l8d_8ܖ6&>mf`‹+~hk'6CLxoyq?/xѼnͶ{Wo}J4q32Cu_){Om6/3mqGfrI2lbfrޝzޯ7\w1/l<*3Fʔ%LPYkd&M?q˷vN,4kfrvc+>\>3FiC4׷v~`6d&ȿ҆<~Tgf&~iжof&җpjo?i?d&7/U3.3⟴]}mw,|𩖙EvIsʈ7LnҶ̤i1Qg&#>kɷkEf&eMC ,Kmh_j_K`Ü tz_ cxϋ5Lڳc䮆liS}+e7ۿ]Lنo-5c?*<\p380f<;?tWUJM1|Pėk6xc ΘE fGu~2?㻏[f؃=\xF 6\ֽfob"#^赒۱ӟ\;>hpغqLx`kr˻.gQEk3ۿ婁}*eZJ?7|T{L_ފL7fm7tHFû?5&֜k5srKz;6S5u|"G^.sj=m[Tܱ{<=%~c>It.[]wx4cRW}&gGZcp-/0.4M "fme镫/c:_jf"{#ћJaYG篝\3M2+v0t7~s6Ĕz~O7t/ ߗ垧eΟDN[y:o_YծfO5 Y䪍kn̊޻cc_=N~LBG48|zӢ 1Ͽk4矼|[k{Yc#c>dv=~l ]zk>XYm1یQB/?x'(ԯиe+YRy/y %w=S#tŸEV ~P9ﻳ6x!yvo9{G\ V\cN)"?L=O.˾ ]r?Vy N??{ڟPvܴ?'|~W vxo~m~>]oUϞ~:B_,9㇏qQsC6m՟5ǺsM;G/7tea'~3~Sfܓ#y\oڠ|_2_Z]Zg~MV :nw#v y_Ǐ5j&֌6z1sϯ'4O?\w|vL |H_?TŠ{ZVן0bwOX?a]9Ec=<|dAk̟0vt:O]{G-~ş^BA+q;p_υmڟ%'5Z[O“~1fޘ/ 8t3[ӾvQ?wOYO^~sS 76vf~_<\3f|YrU|//|)Ŝw*[%W^Vy>O M?ڼ'~w#'_7q6O5o&}g/OkcZ?!cSzZ~ v)쥕Fs|k f<Յ?б=O4 Ha€޼1^lp>e7xs3<'cF컟iiڛGOm qx4s}˿Yk^m/nsǚ}5D182EI}G6`1jo7͏J};4׿cSkt.7۴Z|3zí+ ӧSm'`2بvR{Թco6.!>_"_W=tXg㝗^vߺxv|<|ǀӿi:sswx\q{ Sz7 w{ƭl7IV7M#|6~L=vଢ଼ |gU,Pd۷6|>bgn$ggU:}!q7Oצ w__7>lV%*4s}_KV39o b T+aLzpAK-}J9l-'2`˯K}7U;b UW7Tf/4ћƞ58ZQ>Qx#-|=F*av4zb5|P./h^Ƙv,/xZcZXn:gX(SQ}6򑑣F;qoLi.O1x1{wcN(_QaFLo oȥ^o oХ6o s5^]o .W[ëKkxkxu5[RKٮ?xuwU:Hn?vW$l~u}=k|y/{9/~g ty𦍊w)X}G珚2rϵO+&~?S7Fƿȑ/~ž%-R>>qFӥ׬0K$}ħWm>)Sc'⏌sQ>ٴ,z3V?O5>ܦ-^W^{CWG/\oc|;^GK{U7q_#G{uQT^Rb|+s];5{glu(3?휶bw+?֩mV}߾|~OXC[b;G{Ꭼe6hU>*:PϺkhC_omz ~ߙ߸DR_6%g_/Z;ۢJgnZ݁sGovG=K?9 }?ME̒6(|_O)Vmr;|cohuO2 #f鰴go? ό?*k{ޝ8_M//kV)/ӣpǟh:̿&_b54Grf+tɋQN*0oa {'(ޟos!.GrW׷WȃUUS%,uOMUZ#O.|ZDoѻSMGo5kg?/߿^w/ğ'eK4߮\7mҐ[K6-PI'L_XVh3k䏟⏺K>i#%>Қ_S?'IT/\ѮQ}_o|>4>+|Edw{ɉEnؿN;鏪1Fl۷ u/hV7?:WJKbÇeZ>NOJ?_^Sw{/>7O߸oNcOku:=~ %/Z:}om̸xRM,</n֮w}6}}Io?ϪVCgm_׿*ƟW_UY Z7^L.y O.)qfvh3_sJGϺ$7w_f{ע߮x}=<⳶ŏǯߐSz9-㟝x{8'gEjRh[o+w=~_ʥ>~=*m[;#WLjyo4kJ.Nn\VWW)yqƯ=خlVa7웶#Hu6]eiZo ~%~֥}-6Nz5p~?=33R~_l_\R$Ӱ =oF\0-/=W^OKůױ;FkS kSf:Kjfx}D5M+Wf[jS{=};Z7Iv~_עbx7}sM3ߍGJP_>ev޾okkdKRkڼ*o{eWG㳶|m]Vw7}F{ ^2zk%F?zk ڥ\~X0~c7R|V22ʼ='}$܍K>_J/Ƀ._["_ڬH?PGc^Rs\8f 5gkZc9߷XҵC>֧on`-}n+?r{7u?>P#Tge篲G/7䏺޺/ŏNz隸gܩMԂ|-& (nƶ}X졵g4-Yn.=⏄=sSWON?Rk^?d[PtolXyzu5z|קӗ'~=Srn7833/l_/n8pMYΓ<\ù>sWy8?ÌCW=|6yN7çgxp7TH{W8]<|sߺҿ팃v^cko?ަ\_>ᜧya ~kfy])^O}.d=;؀O]ۘ8<|{9 o77~yz66<|y[ ]>+x_I^=Ÿkol=|/ gx E:5zѿ硏U<3Ki~蹬 d׫?{{]3=\?#ڱw!O5p!f?5<.9rB+=8gy9_T[ü~5yeO1e=|yy(9Ly/zh-gkܿo7z1ҟWϡ'Wѧ@yߚm Zp5z}C÷𥏹Bς+%u{FG>3?_Rj_Wc|:G_Uki{p}WdzKO@.7qyxmpU @؁Zz!vI{g=tH>w/2/p ك^{D<}9ح;ù>ɕ) TַFr1 =jCüf.5J7*t_-tR<w??Gc@/O(]g=,~.rG 4Ty=rMs+λ;t=S{oQ? A6c|8x`< ϞOsa45xvCfp-8:^;ޠ YyUyF΀4@ %x.׀8΁{2p=8=gKALNdhBi4h2%F} "LQ)&}@я[6k.@.Ɨ e&&$||%x0g jZp;~>ˀrԀo[?<º)[B$T )*uߊ|j{ *F۟uXVܝ@ʴ,q]%\Ud#'Z#C" E'J}^.*b`/ TL""P,JDi!E؍]m] _w @L$0Lv@j\a#dvZ ^f VހmS!"Zx؀sꓗ.1AckhҎ>fGA&qc>π8:xxyG@ V J™yE} XnT)5d g.sQ֗9I@RL-s? .nTcvW evJ ',gO5NLw$SOr>ރUoa5k7@2KUѫ<_4S8:Pck מQ{[wIhw!I]] s<nVǀUNɅ9/3 7pp(0a`*x+ `/6~z&>P]ÈbL12c"Y^>pnAo7dFKr* $1 `29 jąa ,2Ym]D_ ƅ&-詁E$29V<}# UBڵ7Al H|P'+9X9o{kDsD ˝=,/W`e`2</ZMHuB9@N"Tf gҿĪ7?W~VƇ0 uqf0 k* v%F*2v) *1=0 ,9'h2-јhLe4>]4 MZ 2Be4esb,M'F qblC:9o<0H%_2HK{{=Z0L5M2IO8e0ivIK%CiXb4Z} vTTLLLLLL4$^CDEFGH dĤ".I, #|?p0DżdIIsӚ$ 5paSDo'0qxJŔ0+#UO27I8vֺqf_EQv`‰"% 'p?N\ ay,uYL0NT9n<1(^aYj\ZW(DZ $T߼R,|tf>o*H"p_G{v Q+D Q s PՋ8%Qсe LS{NY܇C&ݗuBPϿֵYsdxco @*!~#Yo >~ƹ~A}IDhj ^J0~ES2B򃏤3׏w=AJ))^q+[ݔ/E!dQ9ai!љɕܡ sNs8K˥ 9@)DrWO񇢨e^bsBEQJIII Zd ) 9r!3lCk*3i;e;܎b" ߿(8¨[YvۺAJۃ@GJDDjmg 3;;Xq;Ql?}phglc7VV` | ҿ=AJv^A}@ƿj#}-` H|o=/aokB貗/ ^52 RP3A* {p!?l3aA\/ *!>Ї;_B \<>_='L(v;1(L ^< ""p#P,?GvpsN<ElpQ+b#-XJeOC{)?g9{?~p g?=g aLTcv> ݂:xMdM~F5-P^޾T=ڊ}bۏO <ϊ~~҄n FQ`= 5&(J<U0$+DH$B8wvσ`lpcloK(wn續 q/IkLdۤ_1e'xYAՂ RPP bp So0 '+XA L`D"TEYU]1Q UbdQXDnś(GiZ(ڱ^0^z)_J/#`)N jtvb.6_iˊ`H@wT\t?~OI짬gX;u8f)W?^zA`Gd9KQs?#v ad0L!!Qx| b WW"ー A蒃d=Rz]{p5qb; 8XK21q #ۅq ge"dc zυ!a$~è#c-54YX&Âuoa>/rW/O| ń킱 (HzW"qEmND^)>"GGJ=l1/ |lu0ckAaUfN-|;|hËAn0OO1Vb~49M:Y"XF tX qA8`E0H1^~k(+'h ĀʠZgdUwڻLEC!'N1LZ0Cnqvò<, s ǀa$k?+,H*vg׏_@ABC1,!u։#@c C DGDXGIC|-nO#O# o>RէHQ}PhJTlth8V8kL#a,6jEAy͛5!I1G\EsUA.Y!>,OG+L[+ARtx C|.~SG%辄7YvShZߣt(Tt 'J-DdA[Xʏ_e׼0nYlQQ2_VvF_#p<=gG"rS+pN4/aZƫe"gSx'Y&u7~+(a8(!B‘B:B>;~xJsyґ#\ Q/U u>D X}/dG5gTzn0+pR*EsM?\1!&0D1. %B.e:5|yX!`,훅ejiݞv.EI|}`\/ #OmcTȑN0tm_ڼT@6z?L)9Eú䫴ةj0MU'{j/139шPUŪYmyP->'\Yո@Z::ٔ:g.oīY Vr%D/Rr}E.znne|KA>7 #|~OJ,Sw |وbgqJŀ,=9U(y(ŋ%q3h'J CDDKxTY*dXHZǗ 0+g.},wUHvsW/(% g 2*jL 7$\ iT͸,CǸ/ Z.v/.N£8&*%Hd&8fMJ'$_! 6sI:DL (2p(Êвv0 @crF dJ &]zE=qp"Ę'N&ʝ@&6R!"16 ̄tT{ͅQyI,LS zs50>(JѼG,GT `id sDD_j#vCfrAoU%`o5p z9(yɅG=^ql0;tp<ȄL[7==[a$:~HZGwvO#V銢;&Eё2)o]_"uߑb./:T[o0֒WElM.P x \ n/uF $`@12.r}ROɹ>Aw?lrḙX8X[ M{ cS3$.'Q"?IuF+F-mS!'X=bx B"q))A0b bMli)6C% maa(hb<cښ2y˄  @iaz{."āHq8R A B>| l26Z6uW8MU' {hm<6_> _a͓ olƇa aS 11&rplY+ YgM,ٟF{ް0g6UC Q!1$}]% -GCD(@ %8AI6cln`{W"fJ+-4J+ `Le(Pkp,3e-ChYB&*eeY[RO?Ǖ.W\t^'Wz^P|7 F--WJJJXU4p\0Le_2L}Yٍbcp"xsE7pNM˗|e7=`g1>=,B& B0 H7X (/#P^A!/@B?SIZT"Qea7qw>}̨W\YL-L*Pg"5hMa7ωQ80+EEς DN _Ȳh'01Ի''\ XT p^j|4N'%p|W;1"\}@M lcʀ5< #aA⒰Ao1P 1z $5RϣFX" e@X,zi"j[3e LMa4RY On OVw<|n#E(+BP:&m4q>+JVt> )Abb/6-9?Z  &s&SଝP lZ .   &(*ces\\eSuB> Ujͷԏyۭש_*JtA|łe=K$VP$8$ 'A`ZAEp%Ve $rQȅKc@wES.2"M}y()up7N1밅x]}DS1,%7nƀ-Hϑjk6&BpV3P Xl 6bF_~"hTl sB6! I6ox |d=}w릂OA,q]Ruoگ`༌%]@Pq=Axh5Wu)JO^$(| E]G.A| @e|K<|֒vYKa-_^F,z.A<P/`alz @ G ƉKE]{ {^#վ~lݍq#l}dk6uyJ~_* c4by˳p))))pU,~g@~* mArW?5P5X+`\-kQ| ("oeo{5=\ J`$@( n KDUK8[[4!@ 0|\EXE}x b8sa.f\ Tr#J+ )) *K##K$Tip1F $Ā!aP˰b`\?) ) AMesSAR!%̈IO˂ʢ2RYuy=Sdi6qdmX>8=ȝw_=ñK?"!d-x?,MDRXɴ795TtڙU䜯0 k0c*ʩMS3BLjWCyp 1kA}sq )IRj.]sF;j޿3 |ݟ0pLD,c 2&jD6_7D!Ƣ^j ܀j}SaT9]7)jl@8`06DnQeb A|?9ICWE<< Q{6;g=dg~یVacb÷{yuaG}*3xXUzs4Y#24mU]i@Bԙ,lbˁ9N"9Ii%<`}J:pPijmp=k%gLΙ':-81rjI9IGO;-oYY8(BΕ#,yu(C;΄Z|k`hkQ<22I{YIId Tu1TMrU8U_#&*PLMNOPQ2 IuLGLV(lD1Gy85N K)mIN|+py<'QPgf~Gr#Q^#q'GF#Qj#7UFY<2yq>L0 8%605#qwG$a\QrQ:QVQzQVIJi^]0Z6U XVZV[V\V]V^V_^8^ +:|4UiRѬՑՐUՑ/PVMVZ=ZEYIYMYQYUYYʬ @z 5}yS5TɽESJ4˸bd{H( LuO#Ɍڅ+gZ`$S""ScM5ƤƄԡ}y!kT$u+lMã=2ʬ3GV*0}F 5 W#JE9J+2(9q;7w $d68ޘhc|Ƭ7fq&z{c֣P+$Z9J[M$?_c{~2j/*ɕ IJh(&v̓ ueh Igo C< eC&em(.CC;uy0ao#2`0].KXyN.F8L~lC) Ίp2o3/cWr\?`$|fpVe Tr9 "D.\%RX//^>b>5?rר泠b pȠFr \A\ % [X|gR,A{ *} 8>hʩs DuF|=hc4JwP5X~Ż|AYLCŒ26S5fG A=XC$ܽc^WP7"&*.2/+ F,!g9}@wesߵe[<,2x|eXFP蒙\A/THnT*$cIpIJR#_*Dds>IPe C.Gֺ<ry*@DU\LЅqVBUbr/}8 㼟\~u?~ INz( $!C{}0 }Oҿ&>+f(|yփGi=Py <OWBFJ 52^bfjnrvk}c "iѿ.=ʗ¹\ @_l :/E ``a!r=d(|$" E1LCuW{rʀ]:9 Ԅj5ֳD!$D(ڙ0݉,a-nŤ(WOv1 ƕǬrRVQKq#RR/?[̤Mh[m-o_lV律ˋ(uOx>?X8cXF v8IkŁWG8=ALJ;F^~lo z^I;%wo;y XL7I~p>;0>ƳoW;~ ܿy1$؃(,`U͠<_ybwr Ż+4Gv NYwNn{GExPH)$c|9Dz6d{P{O=E{O G"q79;y]P]hqutaƳ ;Cd G2}w1D&:wR*zvwB;wcwJws'Lb@߉NG~<$ RЃ38+w7uQJ~|3腺IS̗zeE WFt>8{n%`<'10èb<1eLU+FcW Ɇ0#Ht'6PPP\wrWyx;poCAB9-~DcQ$ ǧO ǫUxISX-z$C3   8 =xp'/ y?d7nV&Vb[ɹ1[cq[ðք$`Z31xdJ2UARJV D,孋}]E=h={/h_WrOKq n&ou&kwO01Ũq} $ &<؄v8õ;+Ԗ5FH9d hc 2 D9խ6m(MmA`XAaH1V , [0S'^cQ402Oc0D]`  12BL &`{sY1bPŤ6FmbXŴqm̫8TL̬Z1bp+WL@黿@Arߝs:8/23 贈dqp7wQ߱w㴈EW8831:|8g~G܇ xGq]yEN/P0;4x~uD.0 /<XĵPGr8?}t_4u r[L ="[聭wdB6 6BBmĶ6b9m%;l# dmBm;O80?y%Ln =1wkBRVZ^bk^ &: ABB<ߖ\M[Vm8"NHԞNB:6g8QG9倔RH9#lN)Cs6'ErXvUy9/Sރzj0yB]Snu/TvA{7Ig|; u&=,%y&C $B$"Xt]M@!D<&W< w"JT;ۉXWNrv໎OGv`\wwPf՞P=oOdמAߞE%9߷Cve;RG;Ӯ1 vAHeBгp7h<AE[-|-\j[1ڷ~Anlw tV 㼕o- LY0o_܂>C?Gf9t̛R;~æS+R9࿛ifJ) H) n<;K@/f)vp02 52^bfjnrk: mٶ/Amo8phpp5HC#&aR4 Ȭ#FF>a3+J1$ $bV貕r6޳ipCArA2>]2mw拀`;v,im߉c'z$W ts ?9{7Ra7Z8@);Zy>77s@ص *څچ]ڇ&-kmŮ6J|*̨2eRmfUVwJ+EΗ6TRJU+uʠ*-C@F$ ] ZIX܌x3z3ͬL?of1f) Doaڿkpp[8@-G -x TU!jA%6w3f5#`hJ9`S8>Moy-ѵZm:d5QnL҈5b28 p(Z ]V+4%PkFOs8͖Y?g:6m8WSk5q'%_K{=f2,'=Ԛ`I*@К05Ny5Pj5UƊïC8B*P1+l/p8C*=HPbA%PbB %.l"PP"D⮰hƮ hHK}ZS\}y?ǡ!1:=$swCy+M:xCtCՁx)=EUE%*2QT̠;A8BOB*P1Tb oC*e.gE9hr#$"b G@ y3F  !`-1-d[v>WqETt`ThAE *jPfxh#^`A=*P?2hC U V W X Y Z [ ʆP@5 c` $S5TUF?)tO5%xDzv}X-KH!HAXAR(R0R8VAED1)"_P$F|D!*bTFD@*BUĪFB"#A",lgg2;dw>M={7c#"e~  8bE$dY,!Y_$z,qf1?Y3kH",2TG<94.AChæxBHYheģoB""b/C C!!C""C##OWi(P$F*\Wcp a&_u V}`H_ug,[A<`lL?н.Ǹi|=2C,6mD (4@~ap{vSOs1#|po5(ؽ 5,~&"k^W(!pEYqs> pP_˚w~Ļ1{1{I? f]N)ދ&Hڧ \VڹO(l/:CNo#@"_d/^\2h< jBB~Cڌݤ~f~n. .jnvQvavaXwQñڅ# ~ 'X2ىIwvp۩9ٞ8dO\"[8dfO"kb7xXTZ%teR1 UHVAWzURPP1(<(Oue xMZkj1Κ :RL/"(yyhBt̅r|̷v8~ƹ}-cT:K$ݼ'Gnl/j{IK~7p^? "Y68s58qo /=3 d$ IA(9sGX;¸Fe$*?}(وcicdS-1Ҏc5X8+8zdK/}ۻ d9?vi vl=Jpqe##ѢR}dHt:;_6x  >(XQ`F? )XR`J-_ "8݅-Y818v{X]JP|V<_:M@JkUPu/ HHa1*ĹFWAgmC/*FUzz`wCNg]_!Im]'} ׯEpW|M_&Nl[U s5{ ՙW}- 'B-j\q |{M/HG}u'%Kݘ g]FA)(R)d٠+y))TP QAZ]d|7,最t6Ȝ R{f=ɂ^>ca[@I?dߗ}:o n>o:?S<,Z`mp'd[i ;dahQ~W % =@*= d[/"X)8}CKrz)+l"e(80qd_rsd$4W617 7ހ(V 35 oC1BU0wp:;@('0`0,P+.M2*h`uaY =({1>s_ "f =QXIA1e/I_/dv?[e_rQpPuL.yE䈦 Ex}Ef^Z>9VP ,M'AJp%l+|EAg+x h \ax(ˆ E > ^^`o"#H",`7<X<1e(L 'CAŰah1^ XA0uXLLV3$mQxp@:l@ap1 "$F >z!Wrdp% (>a7| 9B,{`CsF5?[uc?[_Q$t8@Wx{cߨ<s> :x=xR]/E E!a.,]Xr O;j+Zo,foM{c{opntP7hoB>*!wȸ6tEۗP/!d_7x:(pwEf}4^]-ƀM@B6}G CO. v_*@pB z$2BF(~Q6,:L׀(¢A~3 DC!czIr 6 vkr?  Khm5ueRׁ p;s ߉%#tX;Xjw vgLUto HҠ6XJ8XfxRdRlRtV)+"(EⴊTE+k1YZ[*v U$R,()\?㰃nub: j_$ik_sqZ]G0v= 73#74곎Q 7p&f< CD+~#]l?~3ƛmleRH#e]OF%f;Dl¸ACntv$9$p0X5_2؈Djb5њx1C" ZvY|X[a= ,8#QV z0h H<ʹGe=,,h,cb$4E!QxVСC" yhĈA1W,7 ^c!e1eAeQeaŕ+Ŗ!c!B笆GX iѹ> β4m)%[!|Q\\ 5"To7:Ajtv)A:PddOу|Gr <|js>>4<Că:փUݟ0 f1aN 6'ѹ 6UA%Ml62{s#t9 v,m`iYlzB:94P6XVH#yFn q!xi(9 i鞋5w.}8G]wtM^׃iG0qy/Mұ0T:>,}H&; M "" DEPX ;a'Xy WZKť~xe%Av W*5 d߽@6&yWI&A}0>_3MŴt± c_q뫍}mN:5ѹy,L ^`[9xs.Ģ qP5??x?t=4 |sCP?O ^0y+G[@LqpP坃"#c I *,):ڱ N O ĒEgҿ3G8EɲLڛ figol bS,=s:Ş2T\T>H%RSqAH3dQ*H埖 Iix&ӆ4L%J(2v2OSOCC. r>ɷ>?[ARgg@BhLYw r,EȹȾgb@BsAv/;08bҟÕ?7 : ѯs,dy>?if.4E@.0o5/d&Rgc_6a6 _d2e"AgyM6_d9^#٨" Ɇk57!܅8R n\ lqN6 pwu C.tux^ 5`sNůl6FN8^doH.1ER3ˋ) rqTER7EIe]d>.2_dl6X WꭾB"as9OZm!)y>f)E4P9O2&ɛ;bShN*Dtixziir vv-uOLⱥYHѥ㹦ѥCt3ކ&x\EVmcx?3@z7=ͩLp[nI ܷڹ-y| dfg& Mj`6xvqIIfڇ.2Rs98sXCaø:)\"6 ˜AmSYfb ̠]:PJyPH9~?̃Gys?>~a<$@ , H-w&A)#P`@QI9I ?!R ?Uu @XËBOCa:I#l 'ß|n 9/G:28&J٤dǙ CUYh{g $g9$ 3dYT냤-89HChph-cΐޣg LY(y^s-؏\hXʡaq"2IsT_YKc;  ϥO>Řw}tLJ 6?ͺiҶ Nwr}Ҿ7. NԞig \~[-3qng032@ =K6vA 830z3oe|>uFť|k\ixyWCr;|yh:HGNi2n)8M.4k + E@ 'O}p0$DRP<|0Ǥ`io 7F#H F#{ޣ ###R0фI匦`.Gѿ;t-ӯ ~Ir'(>InbpPr8H4O}OvwhZܡ3@2NV\sr1)7tjGC'fccU e2Hc>F.148?3f\{5(4 hAhAf!xQ(ok M4 Ni|Әӟ,Wmy^A2&ʰ(KV,xbMak g?ŧxmÁd^@d 0(3c:ݟ ?ik<ןk5}P 6p՟s gя1M?eIdɓ!PG@z"`Pva]*!-CN50@b F??J*4"/ CD*T6p';q@B`B"ʶ pX=YG0"xڕ`36nT،JLpT7䡾Ae3oXfIT7L7Dm!YSʃ-|T-8m[Cl!C& ӲMmM8;3MO9 BMMu59j'D~m5؛ۦ7oq79t"JMTl#M8ۛ]JMnb:;cDw*6ps`7#+8>s0Y\ Jr'џЗU.G?-cK^Nj"bC>Aj$Hv?^\޸XI_tNi^1`c0ÞA=r.!=D!kpɆ dagаDaiC ƆҿT EJCI ?C Fʼ CI }CH A ;qBg}CH a^< ,>ԃ ?H>A}v 2yL`t*r W} |=PRj`;c<C^ B̓uGߟv_yoB,'p_~н/yK+8L|ӥ=Ԩ䢞N., > zgNAld=O 0Xf:دS_io1.9b=}K;.ۀ@q F/y}23IgR^59dP3YmO'S*}W{E΀3o{ p2H㌵ X>` Rd+BE܌p Hi+s$[3ICmp9?\+"VL0/9E]< vɊpY_ZIDe XN~.  !σGӬH"rE I`3pPccfΒJ$o4EP#NZzKT1𾫝e6JH=DD?S/M{xkPF 9]#Rm !^f`f3fĀ3 Č gY%XR`W[F($Mg$@^;9JQhCce. ^;W;-Z93-K.oKvBAAEn`'I4sX6gwk2CJ`V s=sC{r!h$h!+r %wq 1 hD*N_}^ؼq34` DY[Yagq(o3d]8w3|k@dq 5pF,h`4ĴnAQEy0[{==w P1 CXi(  (M NOU^qPj[VaE -_}6s:(ob(Ab0Vs30pRDyE1V ljgHD,aQP<%KXeH ~s=M^m(C? C‰ @fT!V&c %%;DD[vsCkߖ 05w*R[-E~Gt')R+\x^; gǃ d &Z\E3}%BXBU13DDHd9h%>nR nD^!XW,4qY @P֕׀EJ*R~Tm?Di*Sh*qNL(DwEG,OhUh}8Bp`iz9>֏lu(>< +Sܧf+iraD0"AE`nУfu ` #B]RUH!]dyxxxYaf\ }yaLsaaB;LD31(Bn=yed&r6\~TS7Lp3R4eb? pn. P!/y._@Z)o R睿#y0FdHSrExHFBrqܭ#4Ƌ9y(U|O:NL M!2e,mr1 )j@$p0Dżd-AT)MspM &BA9IdTdlՔ(02xm ׀l8|!s]t羹R#kU8 #n9`M)gOՎk \pBIKuOvwخ"ۂ 0wBY" Є|\)pKY<1yX.ڇhB\In@&ȌHmJC8Re\; dĜ#0կDDg0%x"w.hbf)$'~'X!\`$QE J\ DVWxn+V:@@W٭@`"bZ   6WQbD 2$3(M"+c uɛ\gAQL}ɀouנV@ߡ}zW;ho |~9'A`Zœa[$vvX5)i?-JGxR6C*?A0b PO| H-@P@g00YpW!IQye 2{!uEk*WUkM< PvI[<0ү UR`YԤ_2l[A?v7w@sa 8L8>z}uƯ7_(ӏs _A,q~BxFa~a׃at <LJ!BB@r-jZSfp`!? gp lh"`~su -<8d:e@b3cKH3]}A1l&QǣKB9Y C?a)qX,|^|-.FfK)\GfLUAd ob'~X$#9bV1"%  X$)tiPeNPD@\6#.`6* kY|Y|(>s @ l79؈jurvIhZh.%ۿ2/ CE|]Q\?`ծ#19 ͢Vel펞2ƈDU7sDJ! bKXY\!,F+DV"ޫ]4"z)Z2B?OLmʚ+~XD^yA^z3u'N0~b?CPVz:+"F<L*_2@~_:juiN|jB5D(dkKb[N}*BuE)En]+a?>S 9>@޼/֩|K_Qx[< 8v1JC7#,FF1?QX (㋿bby:+xO*Vaeǟb%)Ixɺ"?I< OX9XXlGg9" M=|>KX0jX'h  nJ!HAH@b-,Pe<%X+*(:[Z"~[sBhf c~ĂDqIpD)K&`-CZYYY Y$,kEœEĂʢZ 'O 2H ,&#.N&dx6q 4@4B1UYW :ÒX"K#˃%er-,t|`YAԸ$!lCL `,4!@$H0Fuhb3` Mqa˰@4eV wA,]!|]ee$1 [_y3 +gOe> X蠮#BGk 3x> @\ᜳL8_ZK!ඪK˗7TFZe+%LP0e,1Z(FcQŸbd1]/A`#A`.Ln4ͥqJ\),B)bRlԥ@rα4%eIbTM $ĀbH1V ?1P"bXWM˸<ՇrE@gtEl?_H\/rV汚d54j6&j>iҜAavK[b=T|$3*rUA+~%!+D`eJ)^0V?X#D@ VAH"Uū}*(>cD,層Y")ϒL(#*'X+Gyj90ʑ$GJZ+ , F[Ɨ "HP "Kg:kFbH5IGgel\$!r\RV(PXkQ`  .⾅c!.uB+KԮMv$ɟĮ ͸(A0d,y|Bk[*ɈjlP EP TscUbW5ͪT=(je$Z_~,)1R@^YLYi8+#Vg96G?BG ^X{ΆQgV6QCbYgq6=Kd1pH2D! Ag{J?g,??WXB=)_js\pQpQXޒXT5,IE\I>.I$._IbR\/ If’YWJcJjf4R2IJf944IҸ̥Y/E*&Mv4YI>B\*TG',GS@%䢏rYF0?dR2li4<n5 P&$K[2(2T!(|dY2da˱$"cxnӳ`_Lix3$9f5=|& l&̲ B TK(T`*G* *P*ICH$e)_AAM  ? Ec3fROM4vMSLA1O.v],\H?dpSf9'g4jus 0yԶc@B3lsg<ɮ cșh=G <ع?$gmiDHѭDKѯaENJM+V]0A(*or E8J#QR4cE;~ ):RDd)؄騊8OQ% m'^&&_xf[Ly%gTaOzXb8i`b0R$ BB$5,H#/Fi'\ʓX|8 $n?eBhs>ra9؈tOyHQ pNiIII303Hh aT {Ű*O?٭a&gmn(M&26;r;,z>v)H$RJrJ1??}8ֹ&d^N $)Fu؆_jb 6NYdԋB8+ VkO8MdOY$a`$U$ H~4zjs]*zwDner0ӣ}pA p.sSNKV^˅b|yH)"!g:Ob1I TQ3y!/|MelY,L&R<b1ND`?v"VA$ٚI44Ο~!h6~/&Mz"# V$ylj8 a 9=!5vWжʃpU}{'X3aL@1M+1//owsJA95< BY\wj&_M ` lR *j*D1%_/A&e¤(V䝒+J>&v[ ͅ(M&2%"U5U5U%sϖidgF٭ ([+W;)#Akگ}OI5U;JD/PDQ碭f3aHA*bUTTlÞ`($"IjKEyTTTU%~Pu0l WH'ykUN+x^!E P &e !-14i=y:x"b tCH^xnE D#yl6~NFCχQ&jNEUa^O*OLCִm!PZöU$cﳅgϧOשR1 $'¨++tH.86hGBI7%zA zh,x*p&PL&T$J4&H L `M2~,„E2Bḃscط$.⤋_9,4I?r.X?߷yX,p!\v; | ]0Y|}0·q?V38ɟ2īS'hh$1- ʷJ+{S~uPIN?S&A)IB`d:)LRv2iɿ:)9?8'TnWG\/nu`b81R \F% H5~` 62g)ۇ 9>&>\|0 ~G›ߺpLow?Y8PF:I1IQFIYHI+H)E**E"YZ D #ctBaG9dKv( W,K(u.a ;`*MjQrl:h:ma*AU* ĩ(u Φtm)DSDoGR )h)^B /` khdz8rURF2墀^jDHx# lV˂M`)Xչ.d_TP*/W.,p?['}tu(^ J1L`p.x+I私6.Puq6X#TLdB/{2_WOOa>SPcJqγAD~"҉[vRbZ( Uۘ~M R36% ' rby: Y!Ɠ IoRbD~:0NɤM'&Naehj00DMX]DXCo+N5TI,P|f_# )tHAe *T D *)) ) )(),)0)4)8URRRRRRRRYЁ"—6 1(2028 R6u8<͏ ߥ/g+; [H $  ɹ<&OP 6%ܔSbĝ]üh[e : V2Nw lل8Jg.Z6'4_J$i$Q)IJ%ْtI~ 8=Ɓl u+N!'0x=b"rPóU@ =缑(>Ą^2P(kμiz;6`<2돀G6&ںJw桋31̳B\ {\o/Wt98ys`sC~m9{n(f@9 V\xl6n6nTRjG~H>< ?A] lC[K$F|mZFRE\ )gve)l ݘ_~0vֹe!-2IK{,1L݁ډ9A*\Vx*!~\ ID\p(ȊЊ8c<@o2JP63Q}j Q2!Tvyf׼ Đa+O&x49:A$t4h#-F0gs8&gdfZ|c Odoȴ@cDwyH Op_-$$EI5s$$s"). A{ ~wr|CpJ2&WX`WpsYbHQP)Q,) b ڛ堶i! 0A,--H}|VSASԿd| ,$S0YOۀU`FvVmZ> z])fayMŐHqHRS,Hx!@(;-Bwi"g:8M3Mgj³ ˳kf|)83\jJB2 7(p-Aj!r* D/ x@SKbEX9<W=O1PQQi%EHόah_#>Em7 3h|dq8R$VPLhmkaaaL$plh&&&+FP8*}-$m;Ns q CUa'p&Xh̵vu2K){σd'$Zg@ -&n D'?<4.F@i |V/0\0& UV8l&Z$xB6F!qUk R ZHPYEť wiJZyW*]Iq^E~*oyV 'qtWC9/[DNq[qY93ПOw@OLQ?b ~1,lB>q?.~ [V`񏁢dP8#G?o5V$Jj=Uc 9`^ '*Z&>^5e/oY Ou/Q*%"%έ (A%KĪW!0+*sAp+0vy\omh#ɠȵA=,p  */ f b+Nn0 `N))BBii{ra@X Bb ϕi! {fDﳼfy̡? cΓ|S 3<99*3zXa"n~P0z<ۘ j#g# x#o^zob^7)d7<𹝅ߎ6r}cPd`dpdddd0`2hbe e`E2@`ˀce?qrB9`pp@rHAaَLײZd59# eaZ*F"Q"(e( ,FyN=g5Qa`#_I'ȅ%0Id{$$I$2Ii~GPE[MdNO`'1*Ʊʠ!Aaȁȡ`p)VS5ԕ{>B 122< 122zð1L |_uܯ%w;vw!kxk (FLAΏnYhю F`0EM* &Wu| <҂fRKp x /#0Mvq( >KU: Oq @ 'x9Ù*Iͤ&Iٵh]éղk;!V0a)# !CCrTC5բjBu` E I ZR#c0+6R.i bW 4KIJJ!Fa r $y?ҿkֽ7+A{_I*iI4<'ulDDl`3ܱc=+ަ0Bn4]4Y(oqěʻz[A67R▀3bC803Ҝ}Bag1Y@I~((hɃlɏaq=dYahZOg*cZe,{CXi$KzAAz7H_J9kLY?`U%ʳ\9mlmPr| \}N3 `222ri?ui|Ͻsf`:0OVT+ք-8 u6㈤i ͩRT*;8D>AaM fA'@ o|$׈cm2v']IR͚PwWk{mDo'$4Hwsq֗L=;:Փh n?52}n8H&&zښ>a}&D7ET`luҜƯ桙maWȫE뼇 v1K"[[E-2uyA?2wd}UO?ܩU|y tT|#qH%ь~A_4Jx %Z ò # (Ԗcye/v}K_vDo]^{-;j !Mۧҍ4t3\AJ|J.*6*٨J<*JDdf@2I8I'J&98Bmٍ<_#6xTOso 7_&g̬b qW+{4,蘩EۥJ4*٘J:*_DTd) t~֒U"RW%c\Qu{[M&GGq1ȧQq|6CAk*Ect"]0qڋSґ],CW.[<1:Ż2f|gp|seA@Mh 4r|O?U4J^|6JY/X+y<QCc聱WuRÚAkTu2ǭ7槈S>A,of7?"1] {dpJJS߹ZbZZwo-W2xU\[0ԻZJ~?_q ,k˳b!f'ᐈȓPɓ̓x˓S<_ bZ!LI !t "W E GF_\Q""$HH-" Y r*0NĜC!q|qx:~D1*Bp{H YƑeLC GdHȐ%b'sgX$b={%HB-{ e!GY zTdfKáJ d*G_KDVc宴>crl[_Z,3yج#'~u۠H,ڐ@R~BFzh*Sy*)1\++{AIA" ȏ]$Fe6䌠<ȭoL݀!nXEq 4ik)A8"9?'T\:e}cRFJ3n#+yUDo*!  Ck9_%b^B$Á_>o} *bc2"i@׻`Vp}&zk0&j"m:ʜ^K0 »Ns"wqCDZ_s:ֽr-+<9xzG ] 4( "-s$H_@HR>E6Ob$N?*& E1fV&` LJs;$ wd]5HWws 6+/ `4dp"{YQ{e/ܽN?Zo ~:4J|C9m"fЄnjdS/2<Br0)yc~Be &58Ca8xY O҅}>,I坾 A&v 5WpsG1 󐅸{fKK؋9zqAҴD{I=ӥwbYOy0O&&HdȜCe(i<-Hy28eb[.ϕ0BELy.C=<ӜΉDtjW^]#b6:5GD}>nGeƅEW0}M.:8* GsȊh]zKkBApfIeg@z$D2BN[X vG&av wW%r%dzv-jR@+ wT j&`%B[1Jd{uM?&,rE&LFIf4! ܦHO{C_'H*Y*Ye5Zs%܍ Z\p ;d/^vS%:=||1^n%k-,QzV @D~Blo> St| %X ZDt3Qݐq4J7d7ak7&B7Kq]q'(gۯ s4%p5'48A9صA"ssr྿ fMmcwS0+d2(`#pM&DDjIMbԝrOXK!W@X(**j U5E:J(Rxe]vXp͘H) $2 &O;NLQ eEEIEQy vh ɄS K3R jVd+Axs_.OY&n`0JH)vJf;0X𰋕EI\!oQ)IgDi|#3CSb'Jg&Rfe)wʤ'Ggʇ2Ǟ'.wR,jPR)ȸVLLL+(DZ*Dp lytxxp? Hhxh4Wq V|G+B7?x2L;, F8,MWN>Xzp 1i( |BPF&B"wR&%<iXtﷂԅ*y_)}.ѓ"X =JBHA0X3њx)*XLߞypCR0ݘ=t*)K|_x?rĝ;ر_.+(l[h sy{8R E#EbITVV HP޴B"1$B;0RDSȳ=gM5(BufՅUWgɎi5`M(D #By_A6ܳEBddd4XWHuJn ٝvi7omvf\ jDR@<σT$Vl*EV>NK]M*C ЮfsJ&R`jSLmYQU,y0^oE,- nt"3]+vI֮fe\feمjvijglvyfA]Ik- jARhyi4 A1ҫenD?f7ڣjZ$YSjJm^,ՓMl R`mBa sv`h:@ ZBB}mibE߷gxAT_êZb&_bFa8 YN#,:LGݪ[*yM`osɃfڝDsAG>vZP35զ*԰z=T/e$%2q ıhU3N7WƉ:2hN=wCVrUݜn}:^Rpa6pr9N9>ONq*:3;>:qfbzie1A+v^:ba*/s6ˋk/h B׸Ĕ}ws{Ơ6߇Gg6n-'NLX\mS7poۧg'ǜcs]gO;z{8n>t݀{ago;wl۳sGwg;/x[oƛ f ێY>frC.ֹS:|̎O11zQZ>.96~=Ҷ;{;wlھ}{<>991sfzbldw7]jIs93|C߼H5)n2:7=ܶy3s#S_t;C'Fu;wY@Dw>  ɸq8n>ԓIZqrdr]'ebgnmjl|oj k"~43RgoogleMaps/data/pennLC.rda0000644000176200001440000004301414522123264015254 0ustar liggesusers}xTEMO *% "%Hf6(H˒,!F 5Ek}] (6ł ߙ{7wdggr29s̙s3}3$L6 kz7k$/ MΠMDaHb̰Sv7D.r ɉRD )R5 א\#rɉrkF9ZkE5ȵ!ז\;rɥ@#u"י\r]u#ם\r="כ\r}#ןr "7rC #7IFInəƐc`Ae  ˤ')PP[,ZJ KPȂ``YTs梬%eSGwʊ2~AEySfNpAi~  mNtA/XT^TIC *櫴9@`A \%H).(\jN) ,isrK E@Eɢ|U@n <,X" f. OUPQ@ђUfŠy`r&/(*/U E" iqp`i(?P@jqzDQi(G5 P4 (?o8+XڗX"0œ%JӚLVa…!.,.*-V%_y^1eXSHqr/ 8Cj3W,Uԣ+ФĖ/Q3SR\DrY΢K _V"2ɲe)eeK+BF;<8OyhjZ, &*dy.l 5:Rb3tFh:(0S^\J6JfX)ۭU-'St}FXYWm+KCY>or1z;e[[};-K~0uŎz.-^~n+% z~+ǻG\qŖWl^sr-~_n[XY -.υ-]nEFf[֬z/mgeyW:e7wͳ;Xf_sgZ++˻+,yC/}d륖sg$//ܻ~kW~S/xqy'vj*?2_9`ef?gYLp_-5}nV˨ +g4}ͮ=3A v>3\mݝޙմ*3@V-5c) FLp W=0c Ib-Lwok~mI6j>>}%icw~;?0}};^雺w媿ڙ oLL\:7ӷ3M_5}S6Q4}k376ơ.qY6}K\=7Ϛ>fw.7|Aoiʢ-"4y=]fQ)ۭȣ:/ 'xMc=_K} O-|Sײy`1?hf^iRK\"Anb~^L[LB˜TZ 9rNsDcɹ0ȴkg0FbtQ(]|.!JK%GRtttQQQFQQ&QQfQQQQVQQtmtmtttiQQQttt]t]tݢtݣt=t=ttt}t}tttttttCtCtâtãt'EFDFFFEFGңtfnLnl.#:Vꡤ"֋غ7?uDyBX!UJS.>J4&lG\!&![O2jDi `JxCƋb!cBHM~hKa^ I!nGqlB)~bH>t;F"'ʶ7 )WɼH غU!yPBd`+:Jô#&]?t[yCmnB{#ą#}M>!=Z<ľM Btq2^ꏑ}7hOQ;C҇d|EqG)mL> G{Y_s}X!IF ?;B@Cb~~JaZ~ԗ(>$4Dĺ{  ~1!$áAxчǨhsz+H8cEZ_w/p(ƨIH>}k+,Fzo+FbM~x-N?CBCqY\cQ8p5[F(?p&?  M11s ڨieW$חe{h ЏE Nă~ }2BPO$2=!iCbnBk81v#i]2mxC4./pI-H4rV;eҟIwGi(} 7NXzk1&O ,O?Eh[5x?淑q_h8:~:+X@E[mY~u4k"! wŕ8[fJ.ELW\4{a-Ҍۥaam߇ֿd/ #h XoolxƎ\ófa1!I5-댘çތs ^ѿ#RAzd\BLJߩi6Q]&M[8#VByi>RvxM74&1(oN>|x.~2 oF ~Hϥv!3x'>Aml>'oxmm!){Mza=UGB:P?cl r~ϥvmBmh➠ ri~G@C@C9 _k7ƱCB JC琑ԧf&c ɴΘCmGt#p{1VCMyq|<)ha%QRڧ^xS{_uj!OwhH)OT#G})*Ư͝1uj'o2%ԧiſ;k"bW[.9V=/Ck3_&BCIBxބq(jCK ͦv G5E|4RiΚ8ƈ~a_yF3E6S}M gbi&k]{Fs3 ¯%OcKǬxFiZ:P*ehTQd[^6AzjڃlxA2nQ=SizLm[C.ڼG3_Pۍ {"qT>?hG1l 7S|O} \C4i_),6VKE}HMBm<КL׾PۈmI)װ /TQhbwRx0^_JiGj0jKJ7 FHn 59hODZiM݋1>cDeN1kNmg)%7~ZQ >Rգ1nCҶ>\hIM5Ӹnuт7$A7PrgSi5G8jI<-S<bnmXLMTVRWZv={Wߋi҈$Ի( s K~({|5 ڳ?M3OuzP,%SuvNj=>M޳wx۔Ky2ƥb…T_RBZ3IT-'-v$ђD3Ѻ!ƙS47nuZP$.4z @yDQYMilE6@|q5|Z ?S) ? O A!4&hњO4wm!DC؟)'2iD&>_GohˋiHoiDKc.w&}巔RZ? 7'ўׁ%;^ENz#% 2C i=6H{rO%_*w&TnC'*^߲ R^1c uMjE#0k0<[Akb&{O9O1b[D, f'3L:S;-i< G%r©ԿDo=>%s=HǴ?.Y{!3l4$1Dc$'Z Jjd©64C)ᆘ; G.D0#eL3YrѺF\sZ Dg,&!/ntkAR I~vhF4WY#tyhF?r;(9^Dt+P*x\C'ٔx8.g}mW.ӚLqoH} IBmnO;ho1F{JB1Ki׃%e^4wPi,=3$܋hoRTMiИ ~gG瞝','҈/93¶Q}#"\ %lCt퇱xq.}K )hK|HZwBsLt+?BGI:m𓈶Fk+)|B⩶B5삣!uo#b[H>!}vE)U< C?sO%sS-׮t!}Gɝ$Z+ evwwzU;dҡݪ=2=CoyF9nU>Gz5O_K'A7>VyFq eKߔHEY9,>״d0ku 1ܜ)gp ۪l8n7C_N ͧ_j3,-;,D| GfV͌[1<,Ϩ4m?'cU.?|G62~d{i.CJ~8?چL Q>pb4&7`05_.Μl>mӦynge%Mif[#GesJH ۔rW }\yy-/9_~v{g` zJ+\~ MiS\^4b8y=IWs~^?=1 AW30{lعg ;d~ 4|iUm]UʗmNsc 7j ,^#y=xη 4~ \vX{n&?rͰqJW+߾Dwy_/7]p*;pA_qLW?}DIw~P?v+a+24}<1N\81}OT8 \c-gr=XCXS'W/tW^6]I7\=Wma\N??ϻY?w_tAxYA5KB;̚kjle {5[M:DN +L\s ;yL TZ;}?re5w$c9]9o_+ oïNtNas_.yw3ܮ. 9=&ta?4:֚˝7ە{G=ƙ*mC lq/9}-ֆf< ?oٮ~<%qx֌9﷗'ʸ~4)S9h>np y<7u9:۫Jw<\Km =\rwT_q{ 9ݭs[$]C}7ss?6\UUHM߼w3?[g~f'9's95;1|h _f=5={23qw 9mx `L˞k^P?C*T.3!7ch^wܞMU!g;ǃo?b++(]3m yi.cpmv L文>~5bg6 3oa?'So|~x:tuO=N#>s}3oE?G$#쫜8t-E^y{N1]+ZX6\բ҆T+.txK)R_ryYn0ӫ ~֨*#t >0~pJ'!i :g?YcdLsk~lhi7o2݇+:ƯOrA]v J%m,vYÍ]]WYJV_^៿d`<a)?iVetߝR- ^ { ޷wsyO}I;βj+ٝ%\G)|ZH9B.K9Wp~>5ګ%qNk5ۨ5378VÆwZgK?0N2VNBoiqֿ?w26ߦ ;f?ݺp.}tyak^ q-8=L@Kra?!d5tAQ軮xK۸0 N7jZY>޻FKu61#\U9=CF 0\GPq_7䳣;TV3~KhkJݶ{xqϻvSlˆMߦ\T+m]d6VGKC:szP >T}d1yU}+x g;9~YI+\?;o{9ÓvsΩ yz9Cwa'Flp4(( xRhO@E' ۴0N7UGvtf x!3 NHs_Wz/kݓy Y-0ktQkt<ݳ{6cK^XfÁ!8 /!ptsrӆxt#Ffr}ry 5?ҍ&kfx_prxl{"OeϷݐi8s ] ̵S:n:]V2NH? wdz9$q7;v@]tO&q}#Z!ǻۣ%rwvq!JW\GAyi6>p ~9.ǽ PCɯ|Og1oj>,sto4␓]/\5Gw`'920 # 24ԠKBss=wrWsK{t:?/O\9tyt=]ĭ/q, g.lk 7raЧ =@rd%apQ8K,[,& .\e^'m#syq>; 8km",:;Lw}&1tS2L\0ao+m`7æc8ߖ 6X'`~6NkʰC9uari^sx~un8j鳘'vs;uqre}8?cx ;?v#~R8I{|xcŜo[=9͞-~؃ӽw}g2P pO+>x ^.3uU6VG0os:mcMcTϗc?<38+aClBHQ+(urIWY0r88w(3׮qsr<ןc1_&0ah(viF?{6p2㷬mؿzNzV j.Z(Ú+}h}ގ;w2rV1|>=;ae-ϱ܂埗stQX@&Y d6Bd-܍N$dWap,ͨ]dmswx{p,C)瀃P(p8G=Q={)̩/NQ!79me ;pu_`X60_2:΀+C* |2OM]2Wg:Vg#z2x{,oQ?tӡc;{R~A x \ɽKGE}gmlnϲ\ovWH "I.^a : Ϛ"ׅ{N V⽱U]w=(o_'AY'p8dhu0q{~=-]dxit^<x G؟_W~kQ4!/u9og1ӆ/񯬩~ؼqxm2okYb߼ٹ̲8wH yO8Y_6tCyN{G9JGm#9{5WkxKۡ'Vm9TPы/9pdA{8[6yz98-p_8/ :d쐹Cepz`Wý:7qӪ]oqLJ+]W.)z]ۓwWgInt޾}'w킮03 3j&8z*[ Z]WUS, oo9Soove2㡣۪p* Yvwvegqqq)l:+Y޼rGȊpޏk upFAx\h'vq#m&! dT }f]nѕ^ >QN1H1hStav>^~u,.Yx.c򏃝> @u#cxÀ1d|W}?2இ^C36A1 ̒>3 rWW τ3]D~-jyN;o62o<o@&o9lW^F 8^%oIt^ 8與-6o.Kɷ㰥7jqsd-ކx >mp>K^ o^ x9vDzX-`0.x;8]sq}/۸~'\1q=>q&?>qBgEMYX%2tSB߯\Nm\V û( ԥdr?sw#8p=yt|kLEaye74x[Ɂ-F{ҹ=8ܕ|Zqm`7< x7ƁW9)JN6Pf`e:5tR]1Ae7.C;:5| pֶ]]3ޠIQ߰Yp ;^_XGxsЁQaƴA-t~lB. 9N!rP%ָcw$*qw]'>QFqWߡָcpd;\/a57^lNJ!o䡐B^l.s~<7 q-Fo*0o0Fmg8K~X/cOv 8ݛ6OWy5ldsޑ!B ;W!΋8O꼿%9r\e_KyqD]ᙜ~sg.G `cV o6 2DÛH6Ԁ{xbm` 6pl آ\][r_v[)~\k=o>J)1c.wx;5m.ŀ>ml+@+wÜs/!eDzKq,M"_ٮq.ێX8)(緾M;uW~n궴t[:WڛT٨A/GnH۠TD[Ymua={$LSǪ=I і+4WDWT)[eŪD)}juw :<>!|f E!Cu'9>wC_2_]G 䰵٭=\; ,8쥥w }DO@oE@;R;?CG=*{A~fpwf+VYzor3Ӕ _[/sOs`Z*gh_>l" Izl2JO# uq-We5t=Q-.Kp a4W;AK@[JKrA0^GO!~EJ[س`~ ŀ Ȥ![lԚq@_ j`l`n kW6rm.H;Ky l')(ˎzbA~2ALK06;ϟ*7#]. U1 C}+'ms"؁-^n_?8vTt;0|'S߉r(ȝt}a^;q;. !~㤾-m Oˏ]A#?}HSpgew$~ߩ:Yn?Qoΐɰxdžrܟv[)Y}GRuߡ]~43Dv+2Ɖ^]^Nos=2ӫowsGOgq[\ngP?dݐ!b @ƈ5sջ8X#9ls%}MR/Tv|;Q5 >z!pzF lB!KU ߛJ!RIU~_ i!f2jw4%/۸x]Ow5L  H<.;9A 9~QzJ$A n~һ@{J/>-Wַd.w B|z8̊3,δ8x|/FڜoN3 )g#+9pu"}6ҷ ~P~3#qx?096vKC؟]h)/Wt,P>kB[J~}/;jϔ6{&nlޑ+پD@x Gq{:x< 4=-:u:2mCyC&M{l=X{U- cGM~K 7Md7-|L~묆f$lDFe+R~cAl?j7M||@vjڙssV׿ ; z=@6IVnD{U|;A5|Af޻tRip 8 ]BoH[Z܃mqP#kؘsul8JumP"٨l]ݶکybPO̬%^pm8\w]8W~CzP/Gp_5j:΃_cQ͡Sl?g\a70N|wee/wqx~>ez?B pρ{܃xC흪Γ9p`Wvq GddAdlvA&=.mAi: 谑8:l:l}Tjž~,_rrU+\юroda2.΀7w1=ruo$c"d>d\zuxۀ7(G/ X#DWLY?> |t7S6tt ܵA7:AnnXz\ԣd{`wT%@]L1 X SHݦ"l-m6B~$#]hёͫoI!|Zm~`>2 .zVK57d@ fOÌyZlGF^|N XYvܣlqA` NpzGCW\mF9M]6xGoY<5'87AAϱnKяp=>ݾvPロq|@櫜vܧo"_طH瑾30gD\2:la9r85HJ*) 'ՎP?W Ϥ"DX|^ ܡ"HqX4)eY_WfaL'wwIkcrJ$jY,)-^<( P?nLEKu앜F?ߘSfw< 7m|87X_QV,L?| NM@uꑰR8sM%=@}}*"`\*Q! s.Ÿ۝Ks_am# (Ndh%Qa&6=ww ggVmo4axָY6j9VR>Pk=&_Z@"K7F#@Ze ]]=al̦:ݻ28*J-ZkaVY(QJ 9_o+Ľ}5{]_~4'8VX?cb*{+ wpY߱;&MR21e upyEG_ثPeOF <"0;.!zIq<`H2J+{ D8.hR{\\=!;F!8(ҢqY`]V3ɘ(5%兢<0]spi!fTR˧d{ܓDZ:4b1֘>Oe?XC<*fܢ<.w։BZgq 9,Ѽ;,?}]^dY1AC_{A͖h]R Waܒ(X)9kwè;̨HFF]W?0kFvZP[jBvY2K9(fg4\ݐ 'zy2CK݋laݥL?3 |/mLb9֐bJE}|r&{v7Yŋ ^T+D=~@ oUhM7riH&RQ ^ QLůtF["rNdz (Ѹb#aڂ bj*:^š>}H\5QK*'Am= X6nуiB /'aOʱ| J{W 9n1/A}ޮ5Y YFb@VX(Ӝ;Q̮R2νdHЊf6z937ut 9Q-&!o?I [xM11WJ:lfLW<ul9L5 Z!wYBLOuEe3W9K{IÌ S6+v˭hE$?3#ASl"A4֧hWV3Ua2SQkg9WY^3S^P2( )G4Eȕk}Ub)^ ЃC /Ik^_1H3*Kn;#CuDAWZԶTI)3$1Lh=ŘlϪP)$:ɝ.Dk#U*3l^2$ gӂv܎&Xjώ@{6'!5B<@46u3w1DXsTw:tA)be}}Z'L8U1Oa7o{|+:߃%SL#C{;^#EỎQSX|EҲ'ȦΊ58Zks7NoXAJfXVW,.]$m`TN>9a5ثQ/g`nW͙+6Ğ.}J!,=J+= P:cǤݍW7 )LCLHg OQY[2)ZHU{z0+i@'sAr!3Q6tηy\2|V%5,`!csx}ASHmlAXQ]_y0!}.dƢaP<'5 Ff ?0d2=bxscB&Eś^dkJ@+D׽${[ģacHu}[sމ$<_7umH&c7pkRݑS=/uA`I؊\m{݆K,46̠5Vd66`3/$ M*HE@Gt([!ȖS)_f  hor{Ѯ:}S DWRFS"ECz*UgCۙ9HLfM=mLNrK: f<^~(otP p.tղS^& ZLSL;(^?6㪍>bV7|}Y ed@ga+W!R]g%NN0!x.(!,,Ikb0s2W,D:A?!lxNBD\-#ŹЭ-­Fpy t>ݩ Mp-"0d&=},#PDak3񓔒Q;r e6'ޑ\ fn&kI%FU PYvGrM\(3\5DH N@-~k#ߗEr ۿ\u\&HaQ'V"ށAojz%6T\lPG;{0xd$>b$N;ʰ8)L18JeeTEWNHGxFwSBdϹb< ' DD!TmA՜%ה @yW g Zf`'NqP!vkE 'Z| T~U|kq ,PKwJC8_R0cS#Es;*˸BS$;}j?ڑp,;^џ"4Jڛ6UX- e- 6^nn /Cq膹b~j1'1) R$+>f$R Q'|)Hv"QƨZKgRf"*7s/dNЖ.CMi K{v*Ղk!ZltUsq.3*U eZޠ…@VN~6Cz}j˔)$:|^'Tّ B[j!%KlU+H(7[Ds~'8;,{FܬGRU,.e9O!ayZLSvG PhW~[P5@^ ųk$)63~d7k0y ~XɌ1wYi gpvOf2ɸAM2#1nJ#~f:DU(񠶬'zTpQ\Csz2 *Sml%X܅|И@+>8tݓ$wvtb"굎ke\j˱׌*LeBĶ ` N|:,sQ.B>|F+dUdn($>ZXS>7I[tf1wvI& `D=GeKҝHvffcRhI "]lq@&O4S2-Y_Vk#PIg|:@_ R4ElhcKm6\ǒ3-cRc-?_Fv\E UlǦϐ 7`zj2X鳤OnMD7/:Vjh* 5p[?9U4800R'ۦLWL ܄7q]mJMD ~{ie,Cn5ʻ\ocTНAcZlD4ЀίNYwkcazHݮxiy !S$mĮ6A'ȴA1T2 hJ#&{OW;k4ȚTW!FuWjd6M*5Y(Y9&mXgm2n k<6|d,sBZ|d>!' &0}Vna%7UZyC|_QigH37M5Yf3ӱsphbwn "0.A~dkryyq̌l[I3XWγ)xȵƼ]B͚.YV Nf*?S 콨D]oQ$߿*}ǵg R8tU!UTP `E'OI1HT?=).udXwDvG7Z|eQ&6LL:BiFa)9Կ_Գ,loz=ί:^lgJ@ H%qaRk]ʁX<ڷ}WMaBht}0 fG[4R!%az0V3Q[hqkEǕ_EMؒܘ-,cp_0I" WexəÏI\hpM7NKK%0YԿWJtMfۘ*9ZiōE{\}|sY.OI@45:=.9,ye,g#u/1NOIK0Qu%x# j= &S\dDUb;BpF|}uz+p;_!ǟ-9MpqN5TҐ*6:|L6f[0Y*c=:BQg4*6sVW)\ H'.$\Mv+1vwrd{F|?G*Ѓ6w4F:6ۡgsn`&?(p%41WdKgFyԉ9dL`d58d*i3SFuĐTZU["[7I35xGJ?ȧogfGW[[gIkG#r$:"oGUr1ˉZ]8A|圶*M6(]{!LfC;[:I-dhƸ(XDkZ?Dy兟!ϺXSr5엺@^gj9oZǎE`4M2է yۄ('mbblAV`Rr>d,&.,-s. ZoFV<{q#pwMu8U,Hf"74V,*a9÷"Af\#,ЁFC 7oV&PRq)*t٧?#+de0GRÊ^7;0ra}_usY|?!x-rl>,tULt)jl[d"ajPXDlʲB (%g8Tf'm_p@Πޭw妼)d3/)rKcpUxYibn0@ȝfZ v]{!XCq!B!.$DZx+ TSPWV͚ 3^ZuDxBWPx$:Qqh oOwl0E,]鷨84[@4bb|afn<ɖh:SJxdr`}:x]`kսSp$T.}9L'_4|i=驘T\ KjmO$` հnVC[XBb) Mk{cOfFW^f ^T` ./?*'+kR.D--HiH{CϼO\Җ PfDW+3)-C/8ou y@'i˛ύ)#d}Mjv S'ƭVqvώ˕QӸB|nNL!_R[#4DOgB>E/^~Ig7Hoky\ϥAaDެEMP>-Pu[ lMꀒ0cN˃VEnZe'u{p+HE#+w 75>aL0E[s IJd'҇pAL7(!U?UW{:qe:% ^C33g]Q5,~E@5[m OS5d' hDh/u%)g@Β(Z׫LpoW?}]+Wk {fޭ]ʼnD.BhfzHR0y Fɗ݈s % ,inTVZo2 ە s7ArWDѕ$ -͘#|Xtk)ЖF7P>KM e 4ϩ>V~L^?,y426ECN FGAgJTμ]gZBoo]+rX&_74-Ӱ£`e1Tե=tC@N2r52"|~)G#yG 3U}(Ă+g˛뜍ⵑ^n~e"W)k*8sy 0D[bi9D"d`iO6 9pQ_!Ics 'Z;|j !]-_Nt˥6A#t{ϒs^(VjQLu(3.Q*Ą9Ŀ8Kc5xqT.FfQ}Q+36 PŇu.)ȓ?>.:@NLlZHJϹy}OpdoD8cg˷?>tRA;n1<1JesJ<|r}G &蛥atnED98U?,d_VgV\ɐB.|vaqCws%:P|fBHo)u~ X]|: YE@bׅJE!B[ZIcvשs?H &24 ۦ5mBNQ`AbUe`8j'_ ierR>c˓.dvBfw/2'Dۅvy[F#a:wfAaΌ \a4VG23F:.~kX|h=l2bHjo\2瞝MsR&ɕ 9!25,YdÎءLx`F8TT+t񷶷gyN8ԈvAnּOX8 "`",Jt-L`2 3VH}aL|Ε2 55lZYYaj % ;M~vI]RK\ZS(%FY[GtSg0A%NEzwiJ{Lj ̲0?^Ȭ+ jPjzV.iQz zvB85h"u3ŊaC./T5.]R?JWUSI*h=XX߲ rhfIRԽUk)Ǭ(cS%AxOu5}ҁckwc˴c.+?@QuFT.ZU:Sfq ML UDўWN@A Иa8w ّVkǐ*vI I_uA:}cHPs} 'j"( D],Y]v-ӊ""ySd+=+D3jT Ɇ@D%xY (R`鞃moJܳM pcJ[rX)5<]OBFkVY)m_mZqy:S$2/l9cB>ǹ+ y@|([Oy`]hvc~ggJ7Gķ4lƭ\cq`D3yp ĵR`9_i 9mx轴\n%2m}ͅm^p]+)J{jlkLVǢ„귲B\7 dkd$<;ɗKLJFZy{0cq.<$uK蚨8PEwn<0Ç\hL¬ ^/gk} F4JwMt\I.lI' y*mYяx݃{1෰@DgkNs1O,> \lhbGG/M5Vm&kϹ^eZE!E'ё9%VhFƳrU"=\Q}p/R])FatlSV_:G&S_SaJ?K3HF5 x'vRhFŁh)XEd f/9BqK#>S,H&UhlN~H~`g$ʐ.e8iؐqi׍%Ldwwtr"w QVG/ XjnaP|h\E GJTw===W{3W|V[O,*rvDE/D77MT"e(! K8 9աD&&(z+S7?ʻ'XM(WYwsv-x{aDm(ӼV'wڷ3cui3HT]$%C/`4Z=}OZ>TnjAnoN~p Gv)zSY:a'!(F1ka:92ӳ C񩫼ck Bɫ8a5ߔC-3cV'2/}m\6UV@'.ݴATKct,٭65ᄔ; #Vjk +5{:yJ2ewç%} #a(*I1UtO(?2aP?3 Ot`(խg`x5 1B^bHPtnT7>o4"m5Ҭ09R)ZhNSbA(7"yL>(MS/5@AKr]=/g8 <[4,)@.cNюmqmL}0MPnpx P9+m kzrGHKr')b{ Są_|f""ecMťEY*03W1^{|ҥ#^tL*vO_$pT"b άgĴMߜq=Bb`]EwO> ݳDòFغzX#"ʪJJ-.!dLp</GmnK#\'3iVw\Ş޸ls JW;[ll).(3$REP<9a?(>48ſ=dP>ͷyUAG$^v7wܘ{%u0Ne>]J{qo@d619s,Q8_7pt*ɷ0 wTl枾6 pBߪz .vU&gjz>0 YZRgoogleMaps/man/0000755000176200001440000000000014522135346013251 5ustar liggesusersRgoogleMaps/man/GetBingMap.Rd0000644000176200001440000001246413636633236015532 0ustar liggesusers\name{GetBingMap} \alias{GetBingMap} \title{download a static map from the Microsoft map tile server} \description{Query the Google server for a static map tile, defined primarily by its center and zoom. Many additional arguments allow the user to customize the map tile.} \usage{GetBingMap(center = c(lat = 42, lon = -76), mapArea = c(45.219, -122.325, 47.61, -122.107), size = c(640, 640), destfile, zoom = 12, markers, path = "", maptype = c("Road", "Aerial", "AerialWithLabels")[1], format = c("png", "gif", "jpg", "jpg-baseline", "png8", "png32")[1], extraURL = "", RETURNIMAGE = TRUE, GRAYSCALE = FALSE, NEWMAP = TRUE, SCALE = 1, apiKey = NULL, verbose = 0)} \arguments{ \item{center}{optional center (lat first,lon second )} \item{mapArea}{A rectangular area specified as a bounding box (ll,ur). Required when a center point or set of route points are not specified} \item{size}{desired size of the map tile image. defaults to maximum size returned by the Gogle server, which is 640x640 pixels} \item{destfile}{File to load the map image from or save to, depending on \code{NEWMAP}.} \item{zoom}{Google maps zoom level.} \item{markers}{(optional) defines one or more markers to attach to the image at specified locations. This parameter takes a string of marker definitions separated by the pipe character (|)} \item{path}{(optional) defines a single path of two or more connected points to overlay on the image at specified locations. This parameter takes a string of point definitions separated by the pipe character (|)} \item{maptype}{defines the type of map to construct. See https://msdn.microsoft.com/en-us/library/ff701724.aspx} \item{format}{(optional) defines the format of the resulting image. By default, the Static Maps API creates GIF images. There are several possible formats including GIF, JPEG and PNG types. Which format you use depends on how you intend to present the image. JPEG typically provides greater compression, while GIF and PNG provide greater detail. This version supports only PNG.} \item{extraURL}{custom URL suffix} \item{RETURNIMAGE}{return image yes/no default: TRUE} \item{GRAYSCALE}{Boolean toggle; if TRUE the colored map tile is rendered into a black & white image, see \link{RGB2GRAY}} \item{NEWMAP}{if TRUE, query the Google server and save to \code{destfile}, if FALSE load from destfile.} \item{SCALE}{use the API's scale parameter to return higher-resolution map images. The scale value is multiplied with the size to determine the actual output size of the image in pixels, without changing the coverage area of the map} \item{apiKey}{optional API key (allows for higher rate of downloads)} \item{verbose}{level of verbosity} } \value{map structure or URL used to download the tile.} \author{Markus Loecher} \note{Note that size is in order (lon, lat)} \seealso{\link{GetMap.bbox}} \examples{ if (0){ #for bing maps you will need your own API key, #sign up at https://msdn.microsoft.com/en-us/library/ff428642.aspx apiKey = scan("bingAPIkey.txt",what="") map1=GetBingMap(center=c(47.619048,-122.35384),zoom=15,apiKey=apiKey, verbose=1, destfile="Seattle.png") PlotOnStaticMap(map1) m="&pp=47.620495,-122.34931;21;AA&pp=47.619385,-122.351485;;AB&pp=47.616295,-122.3556;22" map2=GetBingMap(center=c(47.619048,-122.35384),zoom=15,markers=m,apiKey=apiKey, verbose=1, destfile="Seattle2.png") PlotOnStaticMap(map2,lat=c(47.620495,47.619385,47.616295), lon=c(-122.34931,-122.351485,-122.3556)) m="&pp=49.28273,-123.12074;22&pp=44.05207,-123.08675;22" map3= GetBingMap(center=c(47.677006,-122.125526),zoom=6,markers=m,apiKey=apiKey, verbose=1, destfile="Seattle2.png") #plotmap(map=map3) m=cbind.data.frame(lat=c(49.28273,44.05207),lon=c(-123.12074,-123.08675),col=c(3:4)) PlotOnStaticMap(map3, lat =m$lat,lon=m$lon,col=m$col,pch=19) #overlay traffic: #Get a map with Road imagery and traffic flow based on a query. #This example gets a map with road imagery based on a query result Bellevue, Washington. #Traffic flow is also included on the map. #http://dev.virtualearth.net/REST/V1/Imagery/Map/Road/Bellevue\%20Washington #?mapLayer=TrafficFlow&key=BingMapsKey #note that we are using the extraURL argument to pass any extra parameters: map4 = GetBingMap(center="Bellevue\%20Washington", zoom=12, extraURL="&mapLayer=TrafficFlow", apiKey=apiKey,verbose=1, destfile="BellevueTraffic.png") PlotOnStaticMap(map4) #Get a map with Road imagery that displays a route. #This example gets a map with road imagery that displays a driving #route between the cities of Seattle and Redmond in Washington State. #note that we are using the extraURL argument to pass any extra parameters: #http://dev.virtualearth.net/REST/v1/Imagery/Map/Road/Routes #?wp.0=Seattle,WA;64;1&wp.1=Redmond,WA;66;2&key=BingMapsKey map5 = GetBingMap(center="Bellevue\%20Washington", zoom=8, extraURL="&Routes?wp.0=Seattle,WA;64;1&wp.1=Redmond,WA;66;2", apiKey=apiKey,verbose=1, destfile="Seattle2Redmond.png") PlotOnStaticMap(map5) } } RgoogleMaps/man/PlotPolysOnStaticMap.Rd0000644000176200001440000000546514521731236017621 0ustar liggesusers\name{PlotPolysOnStaticMap} \alias{PlotPolysOnStaticMap} \title{plots polygons on map} \description{This function plots/overlays polygons on a map. Typically, the polygons originate from a shapefile.} \usage{PlotPolysOnStaticMap(MyMap, polys, col, border = NULL, lwd = 0.25, verbose = 0, add = TRUE, textInPolys = NULL, ...)} \arguments{ \item{MyMap}{map image returned from e.g. \code{GetMap()}} \item{polys}{or of class \link[sp]{SpatialPolygons} from the package sp polygons to overlay; these can be either of class \link[PBSmapping]{PolySet} from the package PBSmapping} \item{col}{(optional) vector of colors, one for each polygon} \item{border}{the color to draw the border. The default, NULL, means to use \link{par}("fg"). Use border = NA to omit borders, see \link{polygon}} \item{lwd}{line width, see \link{par}} \item{verbose}{level of verbosity} \item{add}{start a new plot or add to an existing} \item{textInPolys}{text to be displayed inside polygons.} \item{\dots}{further arguments passed to \code{PlotOnStaticMap}} } \author{Markus Loecher} \seealso{\link{PlotOnStaticMap} \link{mypolygon}} \examples{ if (0){ #require(PBSmapping); shpFile <- paste(system.file(package = "RgoogleMaps"), "/shapes/bg11_d00.shp", sep = "") #shpFile <- system.file('bg11_d00.shp', package = "RgoogleMaps"); shp=PBSmapping::importShapefile(shpFile,projection="LL"); bb <- qbbox(lat = shp[,"Y"], lon = shp[,"X"]); MyMap <- GetMap.bbox(bb$lonR, bb$latR, destfile = "DC.png"); PlotPolysOnStaticMap(MyMap, shp, lwd=.5, col = rgb(0.25,0.25,0.25,0.025), add = F); #Try an open street map: mapOSM <- GetMap.bbox(bb$lonR, bb$latR, destfile = "DC.png", type="osm"); PlotPolysOnStaticMap(mapOSM, shp, lwd=.5, col = rgb(0.75,0.25,0.25,0.15), add = F); #North Carolina SIDS data set: shpFile <- system.file("shapes/sids.shp", package="rgooglemaps"); shp=PBSmapping::importShapefile(shpFile,projection="LL"); bb <- qbbox(lat = shp[,"Y"], lon = shp[,"X"]); MyMap <- GetMap.bbox(bb$lonR, bb$latR, destfile = "SIDS.png"); #compute regularized SID rate sid <- 100*attr(shp, "PolyData")$SID74/(attr(shp, "PolyData")$BIR74+500) b <- as.integer(cut(sid, quantile(sid, seq(0,1,length=8)) )); b[is.na(b)] <- 1; opal <- col2rgb(grey.colors(7), alpha=TRUE)/255; opal["alpha",] <- 0.2; shp[,"col"] <- rgb(0.1,0.1,0.1,0.2); for (i in 1:length(b)) shp[shp[,"PID"] == i,"col"] <- rgb(opal[1,b[i]],opal[2,b[i]],opal[3,b[i]],opal[4,b[i]]); PlotPolysOnStaticMap(MyMap, shp, lwd=.5, col = shp[,"col"], add = F); #or choose an aspect ratio that corresponds better to North Carolina's elongated shape: MyMap <- GetMap.bbox(bb$lonR, bb$latR, destfile = "SIDS.png", size = c(640, 320), zoom = 7); PlotPolysOnStaticMap(MyMap, shp, lwd=.5, col = shp[,"col"], add = F); } } RgoogleMaps/man/XY2LatLon.Rd0000644000176200001440000000304113636633237015301 0ustar liggesusers\name{XY2LatLon} \alias{XY2LatLon} \title{computes the centered coordinate transformation from lat/lon to map tile coordinates } \description{The function XY2LatLon(MyMap, X,Y,zoom) computes the coordinate transformation from map tile coordinates to lat/lon given a map object.} \usage{XY2LatLon(MyMap, X, Y, zoom)} \arguments{ \item{MyMap}{map object} \item{X}{latitude values to transform} \item{Y}{longitude values to transform} \item{zoom}{optional zoom level. If missing, taken from \code{MyMap}} } \value{properly scaled and centered (with respect to the center of \code{MyMap} ) coordinates \item{lon }{longitude} \item{lat }{latitude}} \author{Markus Loecher} \seealso{\link{LatLon2XY} \link{Tile2R}} \examples{ #quick test: zoom=12;MyMap <- list(40,-120,zoom, url="google", BBOX = list(ll=c(35,-125), ur=c(45,-115))); LatLon <- c(lat = 40.0123, lon = -120.0123); Rcoords <- LatLon2XY.centered(MyMap,LatLon["lat"],LatLon["lon"]) newLatLon <- XY2LatLon(MyMap, Rcoords$newX, Rcoords$newY) max(abs(newLatLon - LatLon)); #more systematic: for (zoom in 2:10){ cat("zoom: ", zoom, "\n"); MyMap <- list(40,-120,zoom, url="google", BBOX = list(ll=c(35,-125), ur=c(45,-115))); LatLon <- c(lat = runif(1,-80,80), lon = runif(1,-170,170)); Rcoords <- LatLon2XY.centered(MyMap,LatLon["lat"],LatLon["lon"]) newLatLon <- XY2LatLon(MyMap, Rcoords$newX, Rcoords$newY) if(max(abs(newLatLon - LatLon)) > 0.0001) print(rbind(LatLon, newLatLon)); } } RgoogleMaps/man/PlotOnMapTiles.Rd0000644000176200001440000000316313636633236016423 0ustar liggesusers\name{PlotOnMapTiles} \alias{PlotOnMapTiles} \title{plots on map tiles by "stitching" them together} \description{Counterpart to \code{PlotOnStaticMap} for map tiles} \usage{PlotOnMapTiles(mt, lat, lon, center, size = c(768, 768), add = FALSE, FUN = points, mar = c(0, 0, 0, 0), verbose = 0, ...)} \arguments{ \item{mt}{list returned by \code{GetMapTiles}} \item{lat}{latitude values to be overlaid, if any} \item{lon}{longitude values to be overlaid, if any} \item{center}{optional center} \item{size}{size (in pixels) of "stitched" map} \item{add}{start a new plot or add to an existing} \item{FUN}{plotting function to use for overlay; typical choices would be \link{points} and \link{lines}} \item{mar}{outer margin in plot; if you want to see axes, change the default} \item{verbose}{level of verbosity} \item{\dots}{further arguments to be passed to \code{FUN}} } \value{nothing returned} \author{Markus Loecher} \examples{ if (0){ lat = c(40.702147,40.718217,40.711614); lon = c(-74.012318,-74.015794,-73.998284); center = c(mean(lat), mean(lon)); zoom <- min(MaxZoom(range(lat), range(lon))); bb=qbbox(lat,lon) manhattan_osm = GetMapTiles(latR =bb$latR , lonR=bb$lonR,zoom=zoom,verbose=1) PlotOnMapTiles(manhattan_osm,lat=lat,lon=lon,pch=20,col=c('red', 'blue', 'green'),cex=2) manhattan_goo = GetMapTiles(latR =bb$latR , lonR=bb$lonR,zoom=zoom, tileDir= TRUE, type="google" ) PlotOnMapTiles(manhattan_goo,lat=lat,lon=lon,pch=20,col=c('red', 'blue', 'green'),cex=2) } } RgoogleMaps/man/GetMap.Rd0000644000176200001440000002040313636633236014722 0ustar liggesusers\name{GetMap} \alias{GetMap} \title{download a static map from the Google server} \description{Query the Google server for a static map tile, defined primarily by its center and zoom. Many additional arguments allow the user to customize the map tile. documentation at https://developers.google.com/maps/documentation/staticmaps/} \usage{GetMap(center = c(lat = 42, lon = -76), size = c(640, 640), destfile = tempfile("staticMap", fileext = ".png"), zoom = 12, markers, path = "", span, frame, hl, sensor = "true", maptype = c("roadmap", "mobile", "satellite", "terrain", "hybrid", "mapmaker-roadmap", "mapmaker-hybrid")[2], format = c("gif", "jpg", "jpg-baseline", "png8", "png32")[5], extraURL = "", RETURNIMAGE = TRUE, GRAYSCALE = FALSE, NEWMAP = TRUE, SCALE = 1, API_console_key, type = c("google", "google-m", "google-s", "osm", "osm-hot", "stamen-toner", "stamen-terrain", "stamen-watercolor")[1], urlBase = "http://mt1.google.com/vt/lyrs=m", tileDir = "/tmp/", verbose = 0)} \arguments{ \item{center}{optional center (lat first,lon second )} \item{size}{desired size of the map tile image. defaults to maximum size returned by the Gogle server, which is 640x640 pixels} \item{destfile}{File to load the map image from or save to, depending on \code{NEWMAP}.} \item{zoom}{Google maps zoom level.} \item{markers}{(optional) defines one or more markers to attach to the image at specified locations. This parameter takes a string of marker definitions separated by the pipe character (|)} \item{path}{(optional) defines a single path of two or more connected points to overlay on the image at specified locations. This parameter takes a string of point definitions separated by the pipe character (|)} \item{span}{(optional) defines a minimum viewport for the map image expressed as a latitude and longitude pair. The static map service takes this value and produces a map of the proper zoom level to include the entire provided span value from the map`s center point. Note that the resulting map may include larger bounds for either latitude or longitude depending on the rectangular dimensions of the map. If zoom is specified, span is ignored} \item{frame}{(optional) specifies that the resulting image should be framed with a colored blue border. The frame consists of a 5 pixel, 55 \% opacity blue border.} \item{hl}{(optional) defines the language to use for display of labels on map tiles. Note that this paramater is only supported for some country tiles; if the specific language requested is not supported for the tile set, then the default language for that tile set will be used.} \item{sensor}{specifies whether the application requesting the static map is using a sensor to determine the user`s location. This parameter is now required for all static map requests.} \item{maptype}{defines the type of map to construct. There are several possible maptype values, including satellite, terrain, hybrid, and mobile.} \item{format}{(optional) defines the format of the resulting image. By default, the Static Maps API creates GIF images. There are several possible formats including GIF, JPEG and PNG types. Which format you use depends on how you intend to present the image. JPEG typically provides greater compression, while GIF and PNG provide greater detail. This version supports only PNG.} \item{extraURL}{custom URL suffix} \item{RETURNIMAGE}{return image yes/no default: TRUE} \item{GRAYSCALE}{Boolean toggle; if TRUE the colored map tile is rendered into a black & white image, see \link{RGB2GRAY}} \item{NEWMAP}{if TRUE, query the Google server and save to \code{destfile}, if FALSE load from destfile.} \item{SCALE}{use the API's scale parameter to return higher-resolution map images. The scale value is multiplied with the size to determine the actual output size of the image in pixels, without changing the coverage area of the map} \item{API_console_key}{API key (formerly optional, now mandatory). If missing, the function "stitches" a static map from map tiles} \item{type}{choice of tile server} \item{urlBase}{tileserver URL, alternatives would be "http://a.tile.openstreetmap.org/", "http://tile.stamen.com/toner/","http://tile.stamen.com/watercolor/"} \item{tileDir}{map tiles can be stored in a local directory, e.g. "~/mapTiles/Google/"} \item{verbose}{level of verbosity} } \value{map structure or URL used to download the tile.} \author{Markus Loecher} \note{Note that size is in order (lon, lat)} \seealso{\link{GetMap.bbox}} \examples{ if (0){#takes too long to run for CRAN check lat = c(40.702147,40.718217,40.711614); lon = c(-74.012318,-74.015794,-73.998284); center = c(mean(lat), mean(lon)); zoom <- min(MaxZoom(range(lat), range(lon))); #this overhead is taken care of implicitly by GetMap.bbox(); markers = paste0("&markers=color:blue|label:S|40.702147,-74.015794&markers=color:", "green|label:G|40.711614,-74.012318&markers=color:red|color:red|", "label:C|40.718217,-73.998284") myMap <- GetMap(center=center, zoom=zoom,markers=markers); #Note that in the presence of markers one often needs to add some extra padding to the #latitude range to accomodate the extent of the top most marker #add a path, i.e. polyline: myMap <- GetMap(center=center, zoom=zoom, path = paste0("&path=color:0x0000ff|weight:5|40.737102,-73.990318|", "40.749825,-73.987963|40.752946,-73.987384|40.755823,-73.986397")); #use implicit geo coding BrooklynMap <- GetMap(center="Brooklyn", zoom=13) PlotOnStaticMap(BrooklynMap) #use implicit geo coding and display labels in Korean: BrooklynMap <- GetMap(center="Brooklyn", zoom=13, hl="ko") PlotOnStaticMap(BrooklynMap) #no highways ManHatMap <- GetMap(center="Lower Manhattan", zoom=14, extraURL="&style=feature:road.highway|visibility:off", destfile = "LowerManhattan.png") PlotOnStaticMap(ManHatMap) #reload the map without a new download: ManHatMap <- GetMap(destfile = "LowerManhattan.png",NEWMAP=FALSE) PlotOnStaticMap(ManHatMap) #The example below defines a polygonal area within Manhattan, passed a series of #intersections as locations: #myMap <- GetMap(path = paste0("&path=color:0x00000000|weight:5|fillcolor:0xFFFF0033|", # "8th+Avenue+\%26+34th+St,New+York,NY|8th+Avenue+\%26+42nd+St,New+York,NY|", # "Park+Ave+\%26+42nd+St,New+York,NY,NY|Park+Ave+\%26+34th+St,New+York,NY,NY"), # destfile = "MyTile3a.png"); #note that since the path string is just appended to the URL you can "abuse" the path #argument to pass anything to the query, e.g. the style parameter: #The following example displays a map of Brooklyn where local roads have been changed #to bright green and the residential areas have been changed to black: # myMap <- GetMap(center="Brooklyn", zoom=12, maptype = "roadmap", #path = paste0("&style=feature:road.local|element:geometry|hue:0x00ff00|", # "saturation:100&style=feature:landscape|element:geometry|lightness:-100"), # sensor='false', destfile = "MyTile4.png", RETURNIMAGE = FALSE); #In the last example we set RETURNIMAGE to FALSE which is a useful feature in general #if png is not installed. In that cases, the images can still be fetched #and saved but not read into R. #In the following example we let the Static Maps API determine the correct center and #zoom level implicitly, based on evaluation of the position of the markers. #However, to be of use within R we do need to know the values for zoom and #center explicitly, so it is better practice to compute them ourselves and #pass them as arguments, in which case meta information on the map tile can be saved as well. #myMap <- GetMap(markers = paste0("&markers=color:blue|label:S|40.702147,-74.015794&", # "markers=color:green|label:G|40.711614,-74.012318&markers=color:red|", # "color:red|label:C|40.718217,-73.998284"), # destfile = "MyTile1.png", RETURNIMAGE = FALSE); } } RgoogleMaps/man/getGeoCode.Rd0000644000176200001440000000213313636633236015552 0ustar liggesusers\name{getGeoCode} \alias{getGeoCode} \title{geocoding utility} \description{Geocode your data using, R, JSON and OSM or Google Maps' Geocoding APIs } \usage{getGeoCode(gcStr, API = c("osm", "google")[1], JSON = FALSE, verbose = 0)} \arguments{ \item{gcStr}{adddress to geocode} \item{API}{which API to use. see https://nominatim.org/release-docs/develop/api/Search/ and http://allthingsr.blogspot.de/2012/01/geocode-your-data-using-r-json-and.html} \item{JSON}{use the JSON protocol. If FALSE, we do not have to load additional libraries} \item{verbose}{level of verbosity} } \value{returns lat/lon for address} \author{Markus Loecher} \examples{ if (0){ getGeoCode("1600 Amphitheatre Parkway, Mountain View, CA") getGeoCode("Brooklyn") #You can run this on the entire column of a data frame or a data table: DF = cbind.data.frame(address=c("Berlin,Germany", "Princeton,NJ", "cadillac+mountain+acadia+national+park"), lat = NA, lon = NA) DF <- with(DF, data.frame(address, t(sapply(DF$address, getGeoCode)))) } } RgoogleMaps/man/RGB2GRAY.Rd0000644000176200001440000000141413636633236014725 0ustar liggesusers\name{RGB2GRAY} \alias{RGB2GRAY} \title{translates an RGB image matrix to gray scale} \description{This function translates the rgb values of the array myTile into a scalar matrix with just one gray value per pixel.} \usage{RGB2GRAY(myTile)} \arguments{ \item{myTile}{rgb image matrix, usually array with 3 dimensions} } \details{Gray scale intensity defined as 0.30R + 0.59G + 0.11B} \value{image tile} \author{Markus Loecher} \examples{ if (0){ BrooklynLatLon = getGeoCode("Brooklyn") mapBrooklyn <- GetMap(center=BrooklynLatLon, destfile = file.path(tempdir(), "Brooklyn.png"), zoom=11, size = c(240,240)) mapBrooklynBW$myTile = RGB2GRAY(mapBrooklyn$myTile) PlotOnStaticMap(mapBrooklynBW) } } RgoogleMaps/man/PlotArrowsOnStaticMap.Rd0000644000176200001440000000272513636633236017773 0ustar liggesusers\name{PlotArrowsOnStaticMap} \alias{PlotArrowsOnStaticMap} \title{plots arrows or segments on map } \description{This function plots/overlays arrows or segments on a map.} \usage{PlotArrowsOnStaticMap(MyMap, lat0, lon0, lat1 = lat0, lon1 = lon0, TrueProj = TRUE, FUN = arrows, add = FALSE, verbose = 0, ...)} \arguments{ \item{MyMap}{map image returned from e.g. \code{GetMap()}} \item{lat0}{latitude valuesof points FROM which to draw.} \item{lon0}{longitude values of points FROM which to draw.} \item{lat1}{latitude valuesof points TO which to draw.} \item{lon1}{longitude values of points TO which to draw.} \item{TrueProj}{set to FALSE if you are willing to accept some degree of inaccuracy in the mapping. In that case, the coordinates of the image are in lat/lon and the user can simply overly points/lines/axis without worrying about projections} \item{FUN}{, plotting function to use for overlay; typical choices would be \link{arrows} and \link{segments}} \item{add}{start a new plot or add to an existing} \item{verbose}{level of verbosity} \item{\dots}{further arguments to be passed to \code{FUN}} } \value{return value of \code{FUN}} \author{Markus Loecher} \seealso{\link{PlotOnStaticMap} \link{arrows}} \examples{ if (0){ MyMap <- GetMap(center=c(lat=40.7,lon=-74), zoom=11) PlotArrowsOnStaticMap(MyMap, lat0=40.69, lon0=-73.9, lat1=40.71, lon1=-74.1, col = 'red') } } RgoogleMaps/man/LatLon2XY.centered.Rd0000644000176200001440000000151513636633236017074 0ustar liggesusers\name{LatLon2XY.centered} \alias{LatLon2XY.centered} \title{computes the centered coordinate transformation from lat/lon to map tile coordinates } \description{The function LatLon2XY.centered(MyMap, lat,lon,zoom) computes the coordinate transformation from lat/lon to map tile coordinates given a map object.} \usage{LatLon2XY.centered(MyMap, lat, lon, zoom)} \arguments{ \item{MyMap}{map object} \item{lat}{latitude values to transform} \item{lon}{longitude values to transform} \item{zoom}{optional zoom level. If missing, taken from \code{MyMap}} } \value{properly scaled and centered (with respect to the center of \code{MyMap} ) coordinates \item{newX }{ transformed longitude} \item{newY }{transformed latitude}} \author{Markus Loecher} \seealso{\link{LatLon2XY} \link{Tile2R} } RgoogleMaps/man/qbbox.Rd0000644000176200001440000000256314521771401014656 0ustar liggesusers\name{qbbox} \alias{qbbox} \title{computes bounding box} \description{The function qbbox computes a bounding box for the given lat,lon points with a few additional options such as quantile boxes, additional margins, etc.} \usage{qbbox(lat, lon, TYPE = c("all", "quantile")[1], margin = list(m = c(1, 1, 1, 1), TYPE = c("perc", "abs")[1]), q.lat = c(0.1, 0.9), q.lon = c(0.1, 0.9), verbose = 0)} \arguments{ \item{lat}{latitude values} \item{lon}{longitude values} \item{TYPE}{absolute or percentage trimming?} \item{margin}{relative or absolute margin around the data. Set to NULL if no margin desired.} \item{q.lat}{latitude quantile trimming, the tails will be trimmed from the bounding box} \item{q.lon}{longitude quantile trimming,} \item{verbose}{level of verbosity} } \value{\item{latR }{latitude range} \item{lonR }{longitude range}} \author{Markus Loecher} \examples{ lat = 37.85 + rnorm(100, sd=0.001); lon = -120.47 + rnorm(100, sd=0.001); #add a few outliers: lat[1:5] <- lat[1:5] + rnorm(5, sd =.01); lon[1:5] <- lon[1:5] + rnorm(5, sd =.01); #range, discarding the upper and lower 10\% of the data qbbox(lat, lon, TYPE = "quantile"); #full range: qbbox(lat, lon, TYPE = "all"); #add a 10\% extra margin on all four sides: qbbox(lat, lon, margin = list(m = c(10, 10, 10, 10), TYPE = c("perc", "abs")[1])); } RgoogleMaps/man/sp_bbox.Rd0000644000176200001440000000124514521731161015172 0ustar liggesusers\name{sp_bbox} \alias{sp_bbox} \title{computes bounding box} \description{The function sp_bbox computes a bounding box; it was copied from the sp package bbox function } \usage{sp_bbox(obj)} \arguments{ \item{obj}{object deriving from class "Spatial", or one of classes: "Line", "Lines", "Polygon" or "Polygons", or ANY, which requires obj to be an array with at least two columns} } \value{two-column matrix; the first column has the minimum, the second the maximum values; rows represent the spatial dimensions} \author{Roger Bivand} \examples{ # just 9 points on a grid: x <- c(1,1,1,2,2,2,3,3,3) y <- c(1,2,3,1,2,3,1,2,3) xy <- cbind(x,y) sp_bbox(xy) } RgoogleMaps/man/SpatialToPBS.Rd0000644000176200001440000000267013636633237016021 0ustar liggesusers\name{SpatialToPBS} \alias{SpatialToPBS} \title{converts spatial objects as defined in package sp to simpler PBSmapping type dataframes } \description{The PlotPolysOnStaticMap() function currently does not take sp objects directly but instead needs PBSmapping type data.frames. This function converts sp objects into such. THANKS TO Fabio Priuli for a major bug fix w.r.t. holes in spatial polygons!} \usage{SpatialToPBS(xy, verbose = 0)} \arguments{ \item{xy}{spatial object, such as SpatialPoints, SpatialPolygons, etc..} \item{verbose}{level of verbosity} } \value{list with elements xy = converted object, bb = bounding box, fun = plot function} \author{Markus Loecher} \examples{ if (0) { data("NYleukemia", envir = environment()) population <- NYleukemia$data$population cases <- NYleukemia$data$cases mapNY <- GetMap(center=c(lat=42.67456,lon=-76.00365), destfile = file.path(tempdir(),"NYstate.png"), maptype = "mobile", zoom=9) #mapNY=ReadMapTile("NYstate.png") clrStuff=ColorMap(100*cases/population, alpha = 0.35, log = TRUE) NYpolys = SpatialToPBS(NYleukemia$spatial.polygon) PlotPolysOnStaticMap(mapNY, NYpolys$xy, col = clrStuff$colcode, add = FALSE) legend("topleft", legend = clrStuff$legend, fill = clrStuff$fill, bg = rgb(0.1,0.1,0.1,0.3)) } } RgoogleMaps/man/PlotOnStaticMap.Rd0000644000176200001440000000646113636633236016576 0ustar liggesusers\name{PlotOnStaticMap} \alias{PlotOnStaticMap} \title{overlays plot on background image of map tile} \description{This function is the workhorse of the package RgoogleMaps. It overlays plot on background image of map tile} \usage{PlotOnStaticMap(MyMap, lat, lon, destfile, zoom = NULL, size, GRAYSCALE = FALSE, add = FALSE, FUN = points, mar = c(0, 0, 0, 0), NEWMAP = TRUE, TrueProj = TRUE, axes = FALSE, atX = NULL, atY = NULL, verbose = 0, ...)} \arguments{ \item{MyMap}{optional map object} \item{lat}{latitude values to be overlaid} \item{lon}{longitude values to be overlaid} \item{destfile}{File to load the map image from or save to, depending on whether \code{MyMap} was passed.} \item{zoom}{Google maps zoom level. optional if \code{MyMap} is passed, required if not.} \item{size}{desired size of the map tile image. defaults to maximum size returned by the Gogle server, which is 640x640 pixels} \item{GRAYSCALE}{Boolean toggle; if TRUE the colored map tile is rendered into a black & white image, see \link{RGB2GRAY}} \item{add}{start a new plot or add to an existing} \item{FUN}{plotting function to use for overlay; typical choices would be \link{points} and \link{lines}} \item{mar}{outer margin in plot; if you want to see axes, change the default} \item{NEWMAP}{load map from file or get it "new" from the static map server} \item{TrueProj}{set to FALSE if you are willing to accept some degree of inaccuracy in the mapping. In that case, the coordinates of the image are in lat/lon and the user can simply overly points/lines/axis without worrying about projections} \item{axes}{overlay axes ?} \item{atX}{numeric; position of ticks on x-axis; if missing, \link{axTicks} is called for nice values; see \link{axis}} \item{atY}{numeric; position of ticks on y-axis; if missing, \link{axTicks} is called for nice values; see \link{axis}} \item{verbose}{level of verbosity} \item{\dots}{further arguments to be passed to \code{FUN}} } \value{the map object is returned via \code{invisible(MyMap)}} \author{Markus Loecher} \examples{ #The first step naturally will be to download a static map from the Google server. A simple example: if (0){ lat = c(40.702147,40.711614,40.718217); lon = c(-74.015794,-74.012318,-73.998284); center = c(mean(lat), mean(lon)); zoom <- min(MaxZoom(range(lat), range(lon))); #this overhead is taken care of implicitly by GetMap.bbox(); MyMap <- GetMap(center=center, zoom=zoom,markers = paste0("&markers=color:blue|label:S|", "40.702147,-74.015794&markers=color:green|label:G|40.711614,-74.012318&markers=", "color:red|color:red|label:C|40.718217,-73.998284"), destfile = "MyTile1.png"); tmp <- PlotOnStaticMap(MyMap, lat = lat, lon = lon, destfile = "MyTile1.png", cex=1.5,pch=20, col=c('red', 'blue', 'green'), add=FALSE); #and add lines: PlotOnStaticMap(MyMap, lat = c(40.702147,40.711614,40.718217), lon = c(-74.015794,-74.012318,-73.998284), lwd=1.5,col=c('red', 'blue', 'green'), FUN = lines, add=TRUE) } } RgoogleMaps/man/AddAlpha.Rd0000644000176200001440000000127613636633236015212 0ustar liggesusers\name{AddAlpha} \alias{AddAlpha} \title{add alpha level to color that lacks one} \description{add alpha level to color that lacks one} \usage{AddAlpha(plotclr, alpha = 0.5, verbose = 0)} \arguments{ \item{plotclr}{color to be modified} \item{alpha}{alpha level} \item{verbose}{level of verbosity} } \value{modified color with alpha value} \author{Markus Loecher} \examples{ #example: #require(RColorBrewer) if (requireNamespace("RColorBrewer", quietly = TRUE)) { plotclr <- RColorBrewer::brewer.pal(8,"YlOrRd") plotclr = AddAlpha(plotclr,0.5) } else { print("package RColorBrewer must be installed for this example") } } RgoogleMaps/man/GetOsmMap.Rd0000644000176200001440000000426213636633236015406 0ustar liggesusers\name{GetOsmMap} \alias{GetOsmMap} \title{Query the Open Street Map server for map tiles instead of Google Maps} \description{The querying parameters for Open Street Maps are somewhat different in this version. Instead of a zoom, center and size, the user supplies a scale parameter and a lat/lon bounding box. The scale determines the image size.} \usage{GetOsmMap(lonR = c(-74.02132, -73.98622), latR = c(40.69983, 40.72595), scale = 20000, destfile = "MyTile.png", format = "png", RETURNIMAGE = TRUE, GRAYSCALE = FALSE, NEWMAP = TRUE, verbose = 1, ...)} \arguments{ \item{lonR}{longitude range} \item{latR}{latitude range} \item{scale}{Open Street map scale parameter. The larger this value, the smaller the resulting map tile in memory. There is a balance to be struck between the lat/lon bounding box and the scale parameter.} \item{destfile}{File to load the map image from or save to, depending on \code{NEWMAP}.} \item{format}{(optional) defines the format of the resulting image.} \item{RETURNIMAGE}{return image yes/no default: TRUE} \item{GRAYSCALE}{Boolean toggle; if TRUE the colored map tile is rendered into a black & white image, see \link{RGB2GRAY}} \item{NEWMAP}{if TRUE, query the Google server and save to \code{destfile}, if FALSE load from destfile.} \item{verbose}{level of verbosity,} \item{\dots}{extra arguments to be used in future versions} } \value{map structure or URL used to download the tile.} \author{Markus Loecher} \note{The OSM maptile server is frequently too busy to accomodate every request, so patience is warranted.} \examples{ if (0) { CologneMap <- GetOsmMap(lonR= c(6.89, 7.09), latR = c(50.87, 51), scale = 150000, destfile = "Cologne.png"); PlotOnStaticMap(CologneMap, mar=rep(4,4), NEWMAP = FALSE, TrueProj = FALSE, axes= TRUE); PrincetonMap <- GetOsmMap(lonR= c(-74.67102, -74.63943), latR = c(40.33804,40.3556), scale = 12500, destfile = "Princeton.png"); png("PrincetonWithAxes.png", 1004, 732) PlotOnStaticMap(PrincetonMap, axes = TRUE, mar = rep(4,4)); dev.off() } } RgoogleMaps/man/incidents.Rd0000644000176200001440000000231012710225423015505 0ustar liggesusers\name{incidents} \alias{incidents} \docType{data} \title{San Francisco crime data} \usage{data(incidents)} \description{ The \code{incidents} data frame has 5000 rows and 16 columns. These are 5000 random rows from the 2012 crime data recorded in San Francisco. } \format{ This data frame contains the following columns: \describe{ \item{IncidntNum}{incident number assigned by the police} \item{Category}{Category of crime} \item{Descript}{longer description} \item{DayOfWeek}{day of week} \item{Date}{date} \item{Time}{time of day formatted as hh:mm } \item{PdDistrict}{police district} \item{Resolution}{was the crime resolved?} \item{Location}{location as address} \item{lon}{longitude} \item{lat}{latitude} \item{violent}{violent flag} \item{HrOfDay}{hour of day as 2-digit integer} \item{TimeOfDay}{hour of day as decimal number} \item{HourOfWeek}{hour of week as decimal number between 0-168} \item{censusBlock}{ID of census block} } } \details{ crime data recorded in San Francisco } \source{ URL https://data.sfgov.org/ } \examples{ data(incidents) table(incidents$Category) } \keyword{datasets} RgoogleMaps/man/NumTiles.Rd0000644000176200001440000000224313636633236015307 0ustar liggesusers\name{NumTiles} \alias{NumTiles} \title{computes the necessary number of tiles from a bounding box and a zoom level} \description{computes the necessary number of tiles from a bounding box and a zoom level} \usage{NumTiles(lonR, latR, zoom = 13, CheckExistingFiles = TRUE, tileExt = ".png", tileDir = "~/mapTiles/OSM/", verbose = 0)} \arguments{ \item{lonR}{longitude range} \item{latR}{latitude range,} \item{zoom}{zoom level} \item{CheckExistingFiles}{logical, if TRUE check if files already exist and only download if not!} \item{tileExt}{image type of tile} \item{tileDir}{map tiles are stored in a local directory, e.g. "~/mapTiles/Google/"} \item{verbose}{level of verbosity} } \value{tuple with number of tiles for lon and lat extent} \author{Markus Loecher} \examples{ if (0){ #US bounding box: for (zoom in 4:15) { cat("OSM, zoom =", zoom, "\n") NumTiles(lonR=c(-135,-66), latR=c(25,54) , zoom=zoom) } for (zoom in 4:15) { cat("Google, zoom =", zoom, "\n") NumTiles(lonR=c(-135,-66), latR=c(25,54) , zoom=zoom, tileDir= "~/mapTiles/Google/") } } } RgoogleMaps/man/geosphere_mercator.Rd0000644000176200001440000000123013636633236017417 0ustar liggesusers\name{geosphere_mercator} \alias{geosphere_mercator} \title{Transform longitude/latiude points to the Mercator projection. } \description{From \code{geosphere::mercator}} \usage{geosphere_mercator(p, inverse = FALSE, r = 6378137)} \arguments{ \item{p}{longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude)} \item{inverse}{Logical. If TRUE, do the inverse projection (from Mercator to longitude/latitude} \item{r}{Numeric. Radius of the earth; default = 6378137 m} } \value{Mercator projection of lon/lat points} \author{Markus Loecher} RgoogleMaps/man/ReadMapTile.Rd0000644000176200001440000000113413636633236015674 0ustar liggesusers\name{ReadMapTile} \alias{ReadMapTile} \title{Read a bitmap image stored in the PNG format} \description{Reads an image from a PNG file/content into a raster array.} \usage{ReadMapTile(destfile, METADATA = TRUE, native = TRUE)} \arguments{ \item{destfile}{png file to read} \item{METADATA}{read MetaInfo as well ?} \item{native}{determines the image representation - if FALSE then the result is an array, if TRUE then the result is a native raster representation, see \link{readPNG} in package png.} } \value{map or tile object} \author{Markus Loecher} RgoogleMaps/man/pennLC.Rd0000644000176200001440000000233012767451541014724 0ustar liggesusers\name{pennLC} \alias{pennLC} \docType{data} \title{Pennsylvania Lung Cancer} \description{ County-level (n=67) population/case data for lung cancer in Pennsylvania in 2002, stratified on race (white vs non-white), gender and age (Under 40, 40-59, 60-69 and 70+). Additionally, county-specific smoking rates. } \usage{data(pennLC)} \format{ List of 3 items: \tabular{ll}{ \code{geo} \tab a table of county IDs, longitude/latitude of the geographic centroid of each county \cr \code{data} \tab a table of county IDs, number of cases, population and strata information \cr \code{smoking} \tab a table of county IDs and proportion of smokers\cr \code{spatial.polygon} \tab an object of class SpatialPolygons (See \link[sp]{SpatialPolygons-class}) \cr } } %\details{} \seealso{ \code{\link{NYleukemia}} } \source{ Population data was obtained from the 2000 decennial census, lung cancer and smoking data were obtained from the Pennsylvania Department of Health website: http://www.dsf.health.state.pa.us/ } %\references{} \examples{ data(pennLC) #pennLC$geo #pennLC$data #pennLC$smoking # Map smoking rates in Pennsylvania #mapvariable(pennLC$smoking[,2], pennLC$spatial.polygon) } \keyword{datasets} RgoogleMaps/man/MaxZoom.Rd0000644000176200001440000000110413636633236015134 0ustar liggesusers\name{MaxZoom} \alias{MaxZoom} \title{computes the maximum zoom level which will contain the given lat/lon range} \description{computes the maximum zoom level which will contain the given lat/lon range} \usage{MaxZoom(latrange, lonrange, size = c(640, 640))} \arguments{ \item{latrange}{range of latitude values} \item{lonrange}{range of longitude values} \item{size}{desired size of the map tile image. defaults to maximum size returned by the Gogle server, which is 640x640 pixels} } \value{zoom level} \author{Markus Loecher} RgoogleMaps/man/NYleukemia.Rd0000644000176200001440000000310413370566156015610 0ustar liggesusers\name{NYleukemia} \alias{NYleukemia} \docType{data} \title{Upstate New York Leukemia Data} \description{ Census tract level (\code{n=281}) leukemia data for the 8 counties in upstate New York from 1978-1982, paired with population data from the 1980 census. } \usage{data(NYleukemia)} \format{ List with 5 items: \tabular{ll}{ \code{geo} \tab table of the FIPS code, longitude, and latitude of the geographic centroid of each census tract \cr \code{data} \tab table of the FIPS code, number of cases, and population of each census tract \cr \code{spatial.polygon} \tab object of class SpatialPolygons (See \link[sp]{SpatialPolygons-class}) containing a map of the study region \cr \code{surrounded} \tab row IDs of the 4 census tracts that are completely surrounded by the \code{surrounding} census tracts \cr \code{surrounding} \tab row IDs of the 4 census tracts that completely surround the \code{surrounded} census tracts \cr } } \source{http://www.sph.emory.edu/~lwaller/ch4index.htm} \references{ Turnbull, B. W. et al (1990) Monitoring for clusters of disease: application to leukemia incidence in upstate New York \emph{American Journal of Epidemiology}, \bold{132}, 136--143 } \examples{ if (0) { data(NYleukemia) population <- NYleukemia$data$population cases <- NYleukemia$data$cases mapNY <- GetMap(center=c(lon=-76.00365, lat=42.67456), destfile = "NYstate.png", maptype = "mobile", zoom=9) ColorMap(100*cases/population, mapNY, NYleukemia$spatial.polygon, add = FALSE, alpha = 0.35, log = TRUE, location = "topleft") } } \keyword{datasets} RgoogleMaps/man/GetMap.bbox.Rd0000644000176200001440000000621013636633236015653 0ustar liggesusers\name{GetMap.bbox} \alias{GetMap.bbox} \title{GetMap bbox} \description{Wrapper function for \link{GetMap}. Query the Google server for a static map tile, defined primarily by its lat/lon range and/or center and/or zoom. Multiple additional arguments allow the user to customize the map tile.} \usage{GetMap.bbox(lonR, latR, center, size = c(640, 640), destfile = "MyTile.png", MINIMUMSIZE = FALSE, RETURNIMAGE = TRUE, GRAYSCALE = FALSE, NEWMAP = TRUE, zoom, verbose = 0, SCALE = 1, type = c("google", "google-m", "google-s", "osm", "osm-hot", "stamen-toner", "stamen-terrain", "stamen-watercolor")[1], urlBase = "http://mt1.google.com/vt/lyrs=m", tileDir = "/tmp/", ...)} \arguments{ \item{lonR}{longitude range} \item{latR}{latitude range} \item{center}{optional center} \item{size}{desired size of the map tile image. defaults to maximum size returned by the Gogle server, which is 640x640 pixels} \item{destfile}{File to load the map image from or save to, depending on \code{NEWMAP}.} \item{MINIMUMSIZE}{reduce the size of the map to its minimum size that still fits the lat/lon ranges ?} \item{RETURNIMAGE}{return image yes/no default: TRUE} \item{GRAYSCALE}{Boolean toggle; if TRUE the colored map tile is rendered into a black & white image, see \link{RGB2GRAY}} \item{NEWMAP}{if TRUE, query the Google server and save to \code{destfile}, if FALSE load from destfile.} \item{zoom}{Google maps zoom level. optional} \item{verbose}{level of verbosity} \item{SCALE}{use the API's scale parameter to return higher-resolution map images. The scale value is multiplied with the size to determine the actual output size of the image in pixels, without changing the coverage area of the map} \item{type}{choice of tile server} \item{urlBase}{tileserver URL, alternatives would be "http://a.tile.openstreetmap.org/", "http://tile.stamen.com/toner/","http://tile.stamen.com/watercolor/"} \item{tileDir}{map tiles can be stored in a local directory, e.g. "~/mapTiles/Google/"} \item{\dots}{extra arguments to \link{GetMap}} } \value{map tile} \author{Markus Loecher} \examples{ if (0){ mymarkers <- cbind.data.frame(lat = c(38.898648,38.889112, 38.880940), lon = c(-77.037692, -77.050273, -77.03660), size = c('tiny','tiny','tiny'), col = c('blue', 'green', 'red'), char = c('','','')); ##get the bounding box: bb <- qbbox(lat = mymarkers[,"lat"], lon = mymarkers[,"lon"]); ##download the map: MyMap <- GetMap.bbox(bb$lonR, bb$latR, destfile = "DC.png", GRAYSCALE =TRUE, markers = mymarkers); ##The function qbbox() basically computes a bounding box for the given lat,lon #points with a few additional options such as quantile boxes, additional buffers, etc. bb <- qbbox(c(40.702147,40.711614,40.718217),c(-74.015794,-74.012318,-73.998284), TYPE = "all", margin = list(m=rep(5,4), TYPE = c("perc", "abs")[1])); ##download the map: MyMap <- GetMap.bbox(bb$lonR, bb$latR,destfile = "MyTile3.png", maptype = "satellite") } } RgoogleMaps/man/degreeAxis.Rd0000644000176200001440000000170213636633236015626 0ustar liggesusers\name{degreeAxis} \alias{degreeAxis} \title{axis with degrees} \description{add an axis with degree labels} \usage{degreeAxis(side, at = NULL, labels, MyMap, ...)} \arguments{ \item{side}{integer; see \link{axis}} \item{at}{numeric; if missing, \link{axTicks} is called for nice values; see \link{axis}} \item{labels}{character; if omitted labels are constructed with degree symbols, ending in N/S/E/W; in case of negative degrees, sign is reversed and S or W is added; see \link{axis}} \item{MyMap}{optional map object to be passed} \item{\dots}{optional arguments to \link{axis}} } \value{axis is plotted on current graph} \author{Markus Loecher} \note{decimal degrees are used if variation is small, instead of minutes and seconds} \examples{ xy = cbind(x = 2 * runif(100) - 1, y = 2 * runif(100) - 1) plot(xy,xlim=c(-1,1),ylim=c(-1,1)) degreeAxis(1) degreeAxis(2, at = c(-1,-0.5,0,0.5,1)) } RgoogleMaps/man/mypolygon.Rd0000644000176200001440000000065113636633236015605 0ustar liggesusers\name{mypolygon} \alias{mypolygon} \title{simple wrapper function to plot colored polygons} \description{same as \link{polygon}, execept the value for color is taken from the 1st element of the exra column 'col'} \usage{mypolygon(x, ...)} \arguments{ \item{x}{matrix containing columns X,Y,col} \item{\dots}{extra arguments passed to \link{polygon}} } \author{Markus Loecher} RgoogleMaps/man/plotOSMtile.Rd0000644000176200001440000000104714521766612015762 0ustar liggesusers\name{plotOSMtile} \alias{plotOSMtile} \title{plots a single OSM tile} \description{Adds tile to plot} \usage{plotOSMtile(osmtile, zoom, add = TRUE, raster = TRUE, verbose = 0, ...)} \arguments{ \item{osmtile}{tile object} \item{zoom}{zoom level} \item{add}{Boolean, whether to add to existing plot} \item{raster}{Boolean, whether to load rster image} \item{verbose}{level of verbosity} \item{\dots}{further arguments to be passed to \code{rasterImage}} } \value{returns nothing} \author{Markus Loecher} RgoogleMaps/man/columbus.Rd0000644000176200001440000000476014521741334015377 0ustar liggesusers% Copyright 2001 by Roger S. Bivand \name{columbus} \alias{columbus} \alias{col.gal.nb} \alias{coords} \alias{polys} \alias{bbs} \docType{data} \title{Columbus OH spatial analysis data set} \usage{data(columbus)} \description{ The \code{columbus} data frame has 49 rows and 22 columns. Unit of analysis: 49 neighbourhoods in Columbus, OH, 1980 data. In addition the data set includes a \code{polylist} object \code{polys} with the boundaries of the neighbourhoods, a matrix of polygon centroids \code{coords}, and \code{col.gal.nb}, the neighbours list from an original GAL-format file. The matrix \code{bbs} is DEPRECATED, but retained for other packages using this data set. } \format{ This data frame contains the following columns: \describe{ \item{AREA}{computed by ArcView} \item{PERIMETER}{computed by ArcView} \item{COLUMBUS.}{internal polygon ID (ignore)} \item{COLUMBUS.I}{another internal polygon ID (ignore)} \item{POLYID}{yet another polygon ID} \item{NEIG}{neighborhood id value (1-49); conforms to id value used in Spatial Econometrics book.} \item{HOVAL}{housing value (in $1,000)} \item{INC}{household income (in $1,000)} \item{CRIME}{residential burglaries and vehicle thefts per thousand households in the neighborhood} \item{OPEN}{open space in neighborhood} \item{PLUMB}{percentage housing units without plumbing} \item{DISCBD}{distance to CBD} \item{X}{x coordinate (in arbitrary digitizing units, not polygon coordinates)} \item{Y}{y coordinate (in arbitrary digitizing units, not polygon coordinates)} \item{NSA}{north-south dummy (North=1)} \item{NSB}{north-south dummy (North=1)} \item{EW}{east-west dummy (East=1)} \item{CP}{core-periphery dummy (Core=1)} \item{THOUS}{constant=1,000} \item{NEIGNO}{NEIG+1,000, alternative neighborhood id value} } } \details{ The row names of \code{columbus} and the \code{region.id} attribute of \code{polys} are set to \code{columbus$NEIGNO}. } \source{ Anselin, Luc. 1988. Spatial econometrics: methods and models. Dordrecht: Kluwer Academic, Table 12.1 p. 189. } \note{ All source data files prepared by Luc Anselin, Spatial Analysis Laboratory, Department of Agricultural and Consumer Economics, University of Illinois, Urbana-Champaign. } \examples{ #library(maptools) #columbus <- readShapePoly(system.file("etc/shapes/columbus.shp", # package="spdep")[1]) #col.gal.nb <- read.gal(system.file("etc/weights/columbus.gal", # package="spdep")[1]) } \keyword{datasets} RgoogleMaps/man/updateusr.Rd0000644000176200001440000000470313636633237015567 0ustar liggesusers\name{updateusr} \alias{updateusr} \title{Updates the 'usr' coordinates in the current plot.} \description{For a traditional graphics plot this function will update the 'usr' coordinates by transforming a pair of points from the current usr coordinates to those specified.} \usage{updateusr(x1, y1 = NULL, x2, y2 = NULL)} \arguments{ \item{x1}{The x-coords of 2 points in the current 'usr' coordinates, or anything that can be passed to \code{xy.coords}.} \item{y1}{The y-coords of 2 points in the current 'usr' coordinates, or an object representing the points in the new 'usr' coordinates.} \item{x2}{The x-coords for the 2 points in the new coordinates.} \item{y2}{The y-coords for the 2 points in the new coordinates.} } \details{Sometimes graphs (in the traditional graphing scheme) end up with usr coordinates different from expected for adding to the plot (for example \code{barplot} does not center the bars at integers). This function will take 2 points in the current 'usr' coordinates and the desired 'usr' coordinates of the 2 points and transform the user coordinates to make this happen. The updating only shifts and scales the coordinates, it does not do any rotation or warping transforms. If \code{x1} and \code{y1} are lists or matricies and \code{x2} and \code{y2} are not specified, then \code{x1} is taken to be the coordinates in the current system and \code{y1} is the coordinates in the new system. Currently you need to give the function exactly 2 points in each system. The 2 points cannot have the same x values or y values in either system.} \value{An invisible list with the previous 'usr' coordinates from \code{par}.} \author{Markus Loecher} \note{Currently you need to give coordinates for exactly 2 points without missing values. Future versions of the function will allow missing values or multiple points. Note by Markus Loecher: both the source and the documentations were copied from the package TeachingDemos version 2.3} \examples{ tmp <- barplot(1:4) updateusr(tmp[1:2], 0:1, 1:2, 0:1) lines(1:4, c(1,3,2,2), lwd=3, type='b',col='red') # update the y-axis to put a reference distribution line in the bottom # quarter tmp <- rnorm(100) hist(tmp) tmp2 <- par('usr') xx <- seq(min(tmp), max(tmp), length.out=250) yy <- dnorm(xx, mean(tmp), sd(tmp)) updateusr( tmp2[1:2], tmp2[3:4], tmp2[1:2], c(0, max(yy)*4) ) lines(xx,yy) } RgoogleMaps/man/ColorMap.Rd0000644000176200001440000000375713636633236015276 0ustar liggesusers\name{ColorMap} \alias{ColorMap} \title{Plot Levels of a Variable in a Colour-Coded Map} \description{Plot Levels of a Variable in a Colour-Coded Map} \usage{ColorMap(values, map = NULL, polys = NULL, log = FALSE, nclr = 7, include.legend = list(TRUE), round = 3, brks = NULL, legend = NULL, location = "topright", rev = FALSE, alpha = 0.5, GRAY = FALSE, palette = c("YlOrRd", "RdYlGn", "Spectral")[1], textInPolys = NULL, ...)} \arguments{ \item{values}{variable to plot} \item{map}{map object} \item{polys}{an object of class SpatialPolygons (See \link[sp]{SpatialPolygons-class}} \item{log}{boolean of whether to plot values on log scale} \item{nclr}{number of colour-levels to use} \item{include.legend}{boolean of whether to include legend} \item{round}{number of digits to round to in legend} \item{brks}{if desired, pre-specified breaks for legend} \item{legend}{if desired, a pre-specified legend} \item{location}{location of legend} \item{rev}{boolean of whether to reverse colour scheme (darker colours for smaller values)} \item{alpha}{alpha value of colors} \item{GRAY}{boolean: if TRUE, use gray scale instead} \item{palette}{palette to choose from RColorBrewer} \item{textInPolys}{text to be displayed inside polygons. This can be a column names for values} \item{\dots}{extra args to pass to \code{PlotPolysOnStaticMap}} } \author{Markus Loecher} \examples{ if (0){ data("NYleukemia", envir = environment()) population <- NYleukemia$data$population cases <- NYleukemia$data$cases mapNY <- GetMap(center=c(lat=42.67456,lon=-76.00365), destfile = "NYstate.png", maptype = "mobile", zoom=9) ColorMap(100*cases/population, mapNY, NYleukemia$spatial.polygon, add = FALSE, alpha = 0.35, log = TRUE, location = "topleft") } #ColorMap(100*cases/population, map=NULL, NYleukemia$spatial.polygon) } RgoogleMaps/man/TextOnStaticMap.Rd0000644000176200001440000000411113636633237016573 0ustar liggesusers\name{TextOnStaticMap} \alias{TextOnStaticMap} \title{plots text on map} \description{TextOnStaticMap draws the strings given in the vector labels at the coordinates given by x and y on a map. y may be missing since xy.coords(x,y) is used for construction of the coordinates.} \usage{TextOnStaticMap(MyMap, lat, lon, labels = seq_along(lat), TrueProj = TRUE, FUN = text, add = FALSE, verbose = 0, ...)} \arguments{ \item{MyMap}{map image returned from e.g. \code{GetMap()}} \item{lat}{latitude where to put text.} \item{lon}{longitude where to put text.} \item{labels}{a character vector or \link{expression} specifying the text to be written. An attempt is made to coerce other language objects (names and calls) to expressions, and vectors and other classed objects to character vectors by \link{as.character}. If labels is longer than x and y, the coordinates are recycled to the length of labels.} \item{TrueProj}{set to FALSE if you are willing to accept some degree of inaccuracy in the mapping. In that case, the coordinates of the image are in lat/lon and the user can simply overly points/lines/axis without worrying about projections} \item{FUN}{overlay function, typical choice would be \link{text}} \item{add}{start a new plot or add to an existing} \item{verbose}{level of verbosity} \item{\dots}{further arguments to be passed to \code{FUN}} } \value{return value of \code{FUN}} \author{Markus Loecher} \examples{ if (0) { lat = c(40.702147,40.718217,40.711614); lon = c(-74.012318,-74.015794,-73.998284); center = c(mean(lat), mean(lon)); zoom <- min(MaxZoom(range(lat), range(lon))); MyMap <- GetMap(center=center, zoom=zoom,markers = paste0("&markers=color:blue|label:S|", "40.702147,-74.015794&markers=color:green|label:G|40.711614,-74.012318&markers=", "color:red|color:red|label:C|40.718217,-73.998284"), destfile = "MyTile1.png"); TextOnStaticMap(MyMap, lat=40.711614,lon=-74.012318, "Some Text", cex=2, col = 'red') } } RgoogleMaps/man/Tile2R.Rd0000644000176200001440000000167213636633237014656 0ustar liggesusers\name{Tile2R} \alias{Tile2R} \title{simple utility to offset and scale XY coordinates with respect to the center} \description{simple utility to offset and scale XY coordinates with respect to the center} \usage{Tile2R(points, center)} \arguments{ \item{points}{XY coordinates returned by e.g. \link{LatLon2XY}} \item{center}{XY coordinates of center returned by e.g. \link{LatLon2XY}} } \details{mainly used for shrinking the size of a tile to the minimum size.} \value{list with X and Y pixel values} \author{Markus Loecher} \examples{ latR <- c(34.5,34.9); lonR <- c(-100.3, -100); lat.center <- 34.7; lon.center <- -100.2; zoom = 10; ll <- LatLon2XY(latR[1], lonR[1], zoom);#lower left corner ur <- LatLon2XY(latR[2], lonR[2], zoom );#upper right corner cr <- LatLon2XY(lat.center, lon.center, zoom );#center ll.Rcoords <- Tile2R(ll, cr); ur.Rcoords <- Tile2R(ur, cr); } RgoogleMaps/man/osmtile_bbox.Rd0000644000176200001440000000104613636633236016235 0ustar liggesusers\name{osmtile_bbox} \alias{osmtile_bbox} \title{compute the bounding box of an OpenStreetmap tile} \description{inspired by \code{osmtile} from the package \code{OpenStreetmap} returns the Mercator projection bounding box} \usage{osmtile_bbox(x = 61, y = 41, zoom = 7, minim = -20037508)} \arguments{ \item{x}{x tile coordinate} \item{y}{x tile coordinate} \item{zoom}{zoom level} \item{minim}{parameter for OSM projection} } \value{bounding box, Mercator projection } \author{Markus Loecher} RgoogleMaps/man/plotmap.Rd0000644000176200001440000000453213636633236015226 0ustar liggesusers\name{plotmap} \alias{plotmap} \title{easy to use wrapper function} \description{note the similarity in name to PBSmapping::plotMap This function is the workhorse of the package RgoogleMaps. It overlays plot on background image of map tile.} \usage{plotmap(lat, lon, map, zoom = NULL, API = c("google", "OSM", "bing", "google2")[1], maptype = c("roadmap", "mobile", "satellite", "terrain", "hybrid", "mapmaker-roadmap", "mapmaker-hybrid")[2], destfile, data, alpha = 1, col = 1, apiKey = NULL, verbose = 0, ...)} \arguments{ \item{lat}{latitude values to be overlaid OR string to be geocoded OR named vector (lat,lon)!} \item{lon}{longitude values to be overlaid} \item{map}{optional map object} \item{zoom}{Google maps zoom level} \item{API}{choice of map tile API} \item{maptype}{defines the type of map to construct. There are several possible maptype values, including satellite, terrain, hybrid, and mobile.} \item{destfile}{File to save the map image to} \item{data}{data to look up variables in} \item{alpha}{opacity} \item{col}{plot color} \item{apiKey}{optional API key (allows for higher rate of downloads for Google); mandatory for Bing maps} \item{verbose}{level of verbosity} \item{\dots}{further arguments to be passed to \code{PlotOnStaticMap}} } \author{Markus Loecher} \examples{ if (0){ #####################Google maps############################# mapBG1 = plotmap("Brandenburg Gate, Berlin", zoom = 15) #####################bing maps############################# #for bing maps you will need your own API key, #sign up at https://msdn.microsoft.com/en-us/library/ff428642.aspx apiKey = scan("bingAPIkey.txt",what="") mapBG2 = plotmap("Brandenburg Gate, Berlin", zoom = 15, API = "bing", apiKey=apiKey) latlon <- cbind.data.frame(lat = c(38.898648,38.889112, 38.880940), lon = c(-77.037692, -77.050273, -77.03660)); map3 = plotmap(lat = latlon$lat, lon = latlon$lon, API = "bing", apiKey=apiKey, col = "purple", pch="X",cex=1.5) #####################OSM maps############################# map4 = plotmap(lat = latlon$lat, lon = latlon$lon, API = "OSM", zoom=15, col = "purple", pch="X",cex=1.5) } } RgoogleMaps/man/GetMapTiles.Rd0000644000176200001440000001135113636633236015725 0ustar liggesusers\name{GetMapTiles} \alias{GetMapTiles} \title{download map tiles from specified map tile servers such as openstreetmap or Google} \description{Query the server for map tiles, defined uniquely by their X and Y ID and zoom. For offline usage, these map tiles are stored in a local directory Example OSM:http://a.tile.openstreetmap.org/10/549/335.png Also see https://wiki.openstreetmap.org/wiki/Tile_servers Example Google mobile: http://mt1.google.com/vt/lyrs=m&x=1325&y=3143&z=13 Example Google satellite: http://mt1.google.com/vt/lyrs=s&x=1325&y=3143&z=13} \usage{GetMapTiles(center = c(lat = 52.431635, lon = 13.194773), lonR, latR, nTiles = c(3, 3), zoom = 13, type = c("google", "google-m", "google-s", "osm", "osm-hot", "stamen-toner", "stamen-terrain", "stamen-watercolor")[1], urlBase = "http://mt1.google.com/vt/lyrs=m", tileDir = "/tmp/", CheckExistingFiles = TRUE, TotalSleep = NULL, tileExt = ".png", returnTiles = TRUE, verbose = 0)} \arguments{ \item{center}{optional center (lat first,lon second )} \item{lonR}{longitude range} \item{latR}{latitude range} \item{nTiles}{number of tiles in x and y direction} \item{zoom}{Google maps zoom level.} \item{type}{choice of tile server} \item{urlBase}{tileserver URL, alternatives would be "http://a.tile.openstreetmap.org/", "http://tile.stamen.com/toner/","http://tile.stamen.com/watercolor/"} \item{tileDir}{map tiles can be stored in a local directory, e.g. "~/mapTiles/Google/"} \item{CheckExistingFiles}{logical, if TRUE check if files already exist and only download if not!} \item{TotalSleep}{overall time (in seconds) that one is willing to add in between downloads. This is intended to lower the risk of a server denial. If NULL no call to \link{Sys.sleep} is executed} \item{tileExt}{image type of tile} \item{returnTiles}{return tiles in a list?} \item{verbose}{level of verbosity} } \value{list with important information} \author{Markus Loecher} \note{Note that size is in order (lon, lat)} \seealso{\link{GetMap.bbox}} \examples{ if (0){ #OSM, Ireland xlim = c(-7, -3.5) ylim = c(51.35, 55.35) Dublin = c(lon=-6.266155,lat=53.350140) DublinMerc = geosphere_mercator(Dublin) ir.osm <- GetMapTiles(lonR=xlim, latR=ylim, zoom=7, verbose=1, type = "osm", tileDir= TRUE) map = plotOSM(ir.osm) par("usr")#A vector of the form c(x1, x2, y1, y2) points(map$bbox$upperLeft,col=2,pch=20) points(map$bbox$lowerRight,col=2,pch=20) points(DublinMerc, col =2, pch=1,cex=1.5) ir.stamenToner <- GetMapTiles(lonR=xlim, latR=ylim, zoom=7,verbose=0, type = "stamen", tileDir= TRUE) plotOSM(ir.stamenToner) ir.stamenWater <- GetMapTiles(lonR=xlim, latR=ylim, zoom=7, verbose=1, type = "stamen-watercolor", tileDir= TRUE) plotOSM(ir.stamenWater) ############################################# zoom=5 nTiles = prod(NumTiles(lonR=c(-135,-66), latR=c(25,54) , zoom=zoom)) us_google_5 = GetMapTiles(lonR=c(-135,-66), latR=c(25,54) , zoom=zoom, TotalSleep = 2*nTiles, type = "google", tileDir= TRUE, verbose = TRUE) PlotOnMapTiles(us_google_5) wtc_ll = getGeoCode("World Trade Center, NY") wtc_google_15=GetMapTiles(wtc_ll, zoom=15,nTiles = c(3,3), type = "google", tileDir= TRUE, verbose = 1) PlotOnMapTiles(wtc_google_15) wtc_google_16 =GetMapTiles(wtc_ll, zoom=16,nTiles = c(4,4), type = "google", tileDir= TRUE, verbose=1) PlotOnMapTiles(wtc_google_16) wtc_stamen=GetMapTiles(wtc_ll, zoom=15,nTiles = c(3,3), verbose=1, type = "stamen-toner", tileDir= TRUE) PlotOnMapTiles(wtc_stamen) ###combine with leaflet: #From:http://stackoverflow.com/questions/5050851/ # best-lightweight-web-server-only-static-content-for-windows #To use Python as a simple web server just change your working #directory to the folder with your static content and type #python -m SimpleHTTPServer 8000, everything in the directory #will be available at http:/localhost:8000/ library(leaflet) m = leaflet::leaflet() \%>\% addTiles( urlTemplate = "http:/localhost:8000/mapTiles/OSM/{z}_{x}_{y}.png") m = leaflet::leaflet() \%>\% addTiles( urlTemplate = "http:/localhost:8000/mapTiles/Google/{z}_{x}_{y}.png") m = m \%>\% leaflet::setView(-74.01312, 40.71180, zoom = 16) m = m \%>\% leaflet::addMarkers(-74.01312, 40.71180) #Quadriga: m = m \%>\% leaflet::setView(13.39780, 52.51534, zoom = 16) m = m \%>\% leaflet::addMarkers(13.39780, 52.51534) } } RgoogleMaps/man/IdentifyPoints.Rd0000644000176200001440000000123113636633236016513 0ustar liggesusers\name{IdentifyPoints} \alias{IdentifyPoints} \title{identify points by clicking on map} \description{The user can try to identify lat/lon pairs on the map by clicking on them} \usage{IdentifyPoints(MyMap, n = 1, verbose = 0)} \arguments{ \item{MyMap}{map object} \item{n}{the maximum number of points to locate.} \item{verbose}{level of verbosity} } \value{the lat/lon coordinates of the chosen points are returned } \author{Markus Loecher} \examples{ #The first step naturally will be to download a static map from the Google server. A simple example: #identifiy points: #IdentifyPoints(MyMap,5) } RgoogleMaps/man/MapBackground.Rd0000644000176200001440000000244614521766361016271 0ustar liggesusers\name{MapBackground} \alias{MapBackground} \title{get static Map from the Google server} \description{get static Map from the Google server} \usage{MapBackground(lat, lon, destfile, NEWMAP = TRUE, myTile, zoom = NULL, size = c(640, 640), GRAYSCALE = FALSE, mar = c(0, 0, 0, 0), PLOT = FALSE, verbose = 1, ...)} \arguments{ \item{lat}{center latitude} \item{lon}{center longitude} \item{destfile}{File to load the map image from or save to, depending on \code{NEWMAP}.} \item{NEWMAP}{if TRUE, query the Google server and save to \code{destfile}, if FALSE load from destfile.} \item{myTile}{map tile from previous downloads} \item{zoom}{Google maps zoom level.} \item{size}{desired size of the map tile image. defaults to maximum size returned by the Gogle server, which is 640x640 pixels} \item{GRAYSCALE}{Boolean toggle; if TRUE the colored map tile is rendered into a black & white image, see \link{RGB2GRAY}} \item{mar}{outer margin in plot; if you want to see axes, change the default} \item{PLOT}{if TRUE, leave the plotting to \link{PlotOnStaticMap}, highly recommended} \item{verbose}{level of verbosity} \item{\dots}{further arguments to be passed to \link{GetMap.bbox}} } \value{list containing the map tile} \author{Markus Loecher} RgoogleMaps/man/genStaticMap.Rd0000644000176200001440000000356613636633236016137 0ustar liggesusers\name{genStaticMap} \alias{genStaticMap} \title{generates a "static map" from map tiles by "stitching" them together} \description{necssary because the Google static maps API requires a key now} \usage{genStaticMap(center, zoom = 15, size = c(640, 640), destfile = tempfile("staticMap", fileext = ".png"), type = c("google", "google-m", "google-s", "osm", "osm-hot", "stamen-toner", "stamen-terrain", "stamen-watercolor")[1], urlBase = "http://mt1.google.com/vt/lyrs=m", tileDir = "/tmp/", tileExt = ".png", verbose = 0, ...)} \arguments{ \item{center}{optional center} \item{zoom}{zoom} \item{size}{size (in pixels) of "stitched" map} \item{destfile}{File to load the map image from or save to, depending on \code{NEWMAP}.} \item{type}{choice of tile server} \item{urlBase}{tileserver URL, alternatives would be "http://a.tile.openstreetmap.org/", "http://tile.stamen.com/toner/","http://tile.stamen.com/watercolor/"} \item{tileDir}{map tiles can be stored in a local directory, e.g. "~/mapTiles/Google/"} \item{tileExt}{image type of tile} \item{verbose}{level of verbosity} \item{\dots}{further arguments to be passed to \code{FUN}} } \value{list with tiles} \author{Markus Loecher} \examples{ if (0){ lat = c(40.702147,40.718217,40.711614); lon = c(-74.012318,-74.015794,-73.998284); center = c(mean(lat), mean(lon)); zoom <- min(MaxZoom(range(lat), range(lon))); bb=qbbox(lat,lon) mt = GetMapTiles(latR =bb$latR , lonR=bb$lonR,zoom=zoom,verbose=1) PlotOnMapTiles(mt,lat=lat,lon=lon,pch=20,col=c('red', 'blue', 'green'),cex=2) mt = GetMapTiles(latR =bb$latR , lonR=bb$lonR,zoom=zoom, tileDir= "~/mapTiles/Google/") PlotOnMapTiles(mt,lat=lat,lon=lon,pch=20,col=c('red', 'blue', 'green'),cex=2) } } RgoogleMaps/man/LatLon2XY.Rd0000644000176200001440000000153713636633236015310 0ustar liggesusers\name{LatLon2XY} \alias{LatLon2XY} \title{computes the coordinate transformation from lat/lon to map tile coordinates } \description{The function LatLon2XY(lat,lon,zoom) computes the coordinate transformation from lat/lon to map tile coordinates given a zoom level. It returns the tile coordinates as well as the pixel coordinates within the Tile itself. } \usage{LatLon2XY(lat, lon, zoom)} \arguments{ \item{lat}{latitude values to transform} \item{lon}{longitude values to transform} \item{zoom}{zoom level.lat,lon,zoom} } \value{A list with values \item{Tile}{integer numbers specifying the tile} \item{Coords}{pixel coordinate within the Tile}} \author{Markus Loecher} \note{The fractional part times 256 is the pixel coordinate within the Tile itself. } \examples{ LatLon2XY(38.45, -122.375, 11) } RgoogleMaps/man/plotOSM.Rd0000644000176200001440000000147714521766612015113 0ustar liggesusers\name{plotOSM} \alias{plotOSM} \title{plots OSM map tiles} \description{places tiles on plot} \usage{plotOSM(mt, upperLeft, lowerRight, lat, lon, add = FALSE, removeMargin = TRUE, verbose = 0, ...)} \arguments{ \item{mt}{list returned by \code{GetMapTiles}} \item{upperLeft}{upperLeft corner in lat/lon of the plot region} \item{lowerRight}{lowerRight corner in lat/lon of the plot region} \item{lat}{latitude values to be overlaid, if any} \item{lon}{longitude values to be overlaid, if any} \item{add}{Boolean, whether to add to existing plot} \item{removeMargin}{Boolean, whether to strip margins of plot} \item{verbose}{level of verbosity} \item{\dots}{further arguments to be passed to \code{rasterImage}} } \value{returns map object invisibly } \author{Markus Loecher} RgoogleMaps/DESCRIPTION0000644000176200001440000000146214522154762014212 0ustar liggesusersPackage: RgoogleMaps Type: Package Title: Overlays on Static Maps Version: 1.5.1 Date: 2023-10-31 Depends: R (>= 2.10) Imports: graphics, stats, utils, grDevices, methods, png Suggests: PBSmapping, RColorBrewer, leaflet, jpeg, RCurl Author: Markus Loecher URL: https://github.com/markusloecher/rgooglemaps/blob/master/rgooglemaps/www/QuickTutorial.html Maintainer: Markus Loecher Description: Serves two purposes: (i) Provide a comfortable R interface to query the Google server for static maps, and (ii) Use the map as a background image to overlay plots within R. This requires proper coordinate scaling. License: GPL LazyLoad: yes Repository: CRAN NeedsCompilation: no Packaged: 2023-11-06 10:07:34 UTC; loecherm Date/Publication: 2023-11-06 12:20:02 UTC RgoogleMaps/NEWS0000644000176200001440000000324314522123471013173 0ustar liggesusersChanges in Version 1.2.0.3 o Added full support for Openstreetmap (OSM) tiles All functions should work properly with both Google and OSM tiles. Changes in Version 1.2.0.2 o Added function ColorMap, which plots levels of a Variable in a Colour-Coded Map Changes in Version 1.2.0 o As of version: 1.2.0, RgoogleMaps only offers support for png files, no more jpeg. The maintenance of the jpg ReadImages library has become too tedious, so I removed all dependencies. Changes in Version 1.3.0 o bug fix: NEWMAP had no effect in GetMap function, fixed now o bug fix: spatial polygons with holes were not displaced properly, fixed now o bug fix: boundary condition problems at lon= +/- 180, fixed now o bug fix: dataframe markers argument to GetMap did not work properly, fixed now o new feature: added full support for Microsoft bing map tiles Changes in Version 1.4.1 o new feature: added full support for OpenStreetMap maps o removed dependency on RJSONIO o new feature: added functions to fetch individual map tiles and stitch them together. This has the side effect of making these maps available offline Changes in Version 1.5.1 o removed dependency on maptools: the respective examples in PlotPolysOnStaticMap were removed o removed dependency on sp: (i) functions DF2SpatialPointsDataFrame and bubblemap were entirely removed, (ii) copied sp::bbox into a new sp_bbox function, (iii) replaced xy = sp::coordinates(xy) in SpatialToPBS.R with xy = xy@coords, (iv) replaced data sets with sp classes with sf: NYleukemia$spatial.polygon = st_as_sf(NYleukemia$spatial.polygon), pennLC$spatial.polygon = st_as_sf(pennLC$spatial.polygon) RgoogleMaps/R/0000755000176200001440000000000014522135346012677 5ustar liggesusersRgoogleMaps/R/ReadMapTile.R0000644000176200001440000000234412763212520015147 0ustar liggesusersReadMapTile <- structure(function#Read a bitmap image stored in the PNG format ###Reads an image from a PNG file/content into a raster array. ( destfile, ##<< png file to read METADATA = TRUE, ##<< read MetaInfo as well ? native=TRUE ##<< determines the image representation - if FALSE then the result is an array, if TRUE then the result is a native raster representation, see \link{readPNG} in package png. ){ fileBase <- substring(destfile,1, nchar(destfile)-4); fileExt <- substring(destfile,nchar(destfile)-2,nchar(destfile)); myTile <- readPNG(destfile, native=native); #if (exists("rasterImage")) myTile <- as.raster(myTile) #attr(myTile, "type") <- "rgb"; size <- dim(myTile)[2:1]; MetaInfo=NULL; if (METADATA) { try({ #load(paste(fileBase,"rda",sep=".")); VarsLoaded <- load(paste(destfile,"rda",sep=".")); if (is.element("MetaInfo", VarsLoaded)) MyMap <- list(lat.center= MetaInfo$lat.center, lon.center=MetaInfo$lon.center, zoom=MetaInfo$zoom, myTile=myTile, BBOX = MetaInfo$BBOX, url = MetaInfo$url, size=size, SCALE=MetaInfo$SCALE); class(MyMap) = "staticMap" return(MyMap); }); } return(myTile); ### map or tile object }) RgoogleMaps/R/GetMap.R0000644000176200001440000003713113602610701014173 0ustar liggesusers`GetMap` <- structure(function# download a static map from the Google server ### Query the Google server for a static map tile, defined primarily by its ### center and zoom. Many additional arguments allow the user to customize ### the map tile. ### documentation at https://developers.google.com/maps/documentation/staticmaps/ ( center=c(lat=42, lon=-76), ##<< optional center (lat first,lon second ) size = c(640,640), ##<< desired size of the map tile image. defaults to maximum size returned by the Gogle server, which is 640x640 pixels destfile = tempfile("staticMap",fileext = ".png"), ##<< File to load the map image from or save to, depending on \code{NEWMAP}. zoom =12, ##<< Google maps zoom level. markers, ##<< (optional) defines one or more markers to attach to the image at specified locations. This parameter takes a string of marker definitions separated by the pipe character (|) path="", ##<< (optional) defines a single path of two or more connected points to overlay on the image at specified locations. This parameter takes a string of point definitions separated by the pipe character (|) span, ##<< (optional) defines a minimum viewport for the map image expressed as a latitude and longitude pair. The static map service takes this value and produces a map of the proper zoom level to include the entire provided span value from the map`s center point. Note that the resulting map may include larger bounds for either latitude or longitude depending on the rectangular dimensions of the map. If zoom is specified, span is ignored frame, ##<< (optional) specifies that the resulting image should be framed with a colored blue border. The frame consists of a 5 pixel, 55 % opacity blue border. hl, ##<< (optional) defines the language to use for display of labels on map tiles. Note that this paramater is only supported for some country tiles; if the specific language requested is not supported for the tile set, then the default language for that tile set will be used. sensor = "true", ##<< specifies whether the application requesting the static map is using a sensor to determine the user`s location. This parameter is now required for all static map requests. maptype = c("roadmap","mobile","satellite","terrain","hybrid","mapmaker-roadmap","mapmaker-hybrid")[2], ##<< defines the type of map to construct. There are several possible maptype values, including satellite, terrain, hybrid, and mobile. format = c("gif","jpg","jpg-baseline","png8","png32")[5], ##<< (optional) defines the format of the resulting image. By default, the Static Maps API creates GIF images. There are several possible formats including GIF, JPEG and PNG types. Which format you use depends on how you intend to present the image. JPEG typically provides greater compression, while GIF and PNG provide greater detail. This version supports only PNG. extraURL="", ##<< custom URL suffix RETURNIMAGE = TRUE, ##<< return image yes/no default: TRUE GRAYSCALE =FALSE, ##<< Boolean toggle; if TRUE the colored map tile is rendered into a black & white image, see \link{RGB2GRAY} NEWMAP = TRUE, ##<< if TRUE, query the Google server and save to \code{destfile}, if FALSE load from destfile. SCALE = 1, ##<< use the API's scale parameter to return higher-resolution map images. The scale value is multiplied with the size to determine the actual output size of the image in pixels, without changing the coverage area of the map API_console_key, ##<< API key (formerly optional, now mandatory). If missing, the function "stitches" a static map from map tiles type = c("google", "google-m","google-s","osm", "osm-hot", "stamen-toner", "stamen-terrain", "stamen-watercolor")[1], ##<< choice of tile server urlBase = "http://mt1.google.com/vt/lyrs=m" , ##<< tileserver URL, alternatives would be "http://a.tile.openstreetmap.org/", "http://tile.stamen.com/toner/","http://tile.stamen.com/watercolor/" tileDir= "/tmp/", ##<< map tiles can be stored in a local directory, e.g. "~/mapTiles/Google/" verbose=0 ##<< level of verbosity ){ ##note< 0) print(str(MyMap)); if (!add) { #require(rimage) if ( all(is.na(charmatch(c("png","pdf","postscript", "jpeg"), names(dev.cur())))) ) { #if ( is.na(charmatch("null", names(dev.cur())) ) ) dev.off(); #dev.new(width=7*size[1]/640, height=7*size[2]/640) } par(mar=mar);#par(pin=c(9,9)) if (class(MyMap[[4]])[1] == "matrix"){ x= seq(MyMap$BBOX$ll[2], MyMap$BBOX$ur[2], length= size[1]); y= seq(MyMap$BBOX$ll[1], MyMap$BBOX$ur[1], length= size[2]); image(x=x,y=y, z=MyMap[[4]], col = attr(MyMap[[4]], "COL"), xlab = "", ylab = "", axes = FALSE) #image(MyMap[[4]], "ind", col = attr(MyMap[[4]], "COL")) } else if (class(MyMap[[4]])[1] == "SpatialGridDataFrame"){ image(MyMap[[4]], red=1, green=2, blue=3, axes = FALSE); } else if (class(MyMap[[4]])[1] %in% c("nativeRaster", "raster", "array")){ if (exists("rasterImage")) { # can plot only in R 2.11.0 and higher plot(0:1,0:1,type="n", axes=FALSE, xlab="", ylab="", asp = size[2]/size[1]); tmp2 <- par('usr'); updateusr(tmp2[1:2], x2=c(0,1), tmp2[3:4], y2=c(0,1) ); #if (require(grid)) grid.raster(MyMap[[4]], width=1, height=1, y=0, just="bottom") else rasterImage(MyMap[[4]], 0,0,1,1); } else { #myplot.imagematrix(x=x, y=y, z=MyMap[[4]], axes = FALSE); } } tmp2 <- par("usr"); offset = 1; if (TrueProj){ SCALE = 2*MyMap$SCALE updateusr(tmp2[1:2], x2=c(-size[1]+offset, size[1]-offset)/SCALE, tmp2[3:4], y2=c(-size[2]+offset, size[2]-offset)/SCALE ); } if (axes){ degreeAxis(1, MyMap=MyMap, at=atX); degreeAxis(2, MyMap=MyMap, at=atY); } #browser(); } if (!missing(lat) & !missing(lon)){ #if (TrueProj){ Rcoords <- LatLon2XY.centered(MyMap,lat,lon); newX <- Rcoords$newX; newY <- Rcoords$newY; #browser() if (verbose) { print(range(newX, na.rm=TRUE)); print(range(newY, na.rm=TRUE)); #print(list(newX,newY)); } # } else { # Rcoords<-transfXY(MyMap, lon, lat) # newX <- Rcoords$newX; # newY <- Rcoords$newY; # #newX <- lon; # #newY <- lat; # } FUN(newX, newY, ...) } #invisible(list(newX,newY)); invisible(MyMap) ### the map object is returned via \code{invisible(MyMap)} }, ex = function(){ #The first step naturally will be to download a static map from the Google server. A simple example: if (0){ lat = c(40.702147,40.711614,40.718217); lon = c(-74.015794,-74.012318,-73.998284); center = c(mean(lat), mean(lon)); zoom <- min(MaxZoom(range(lat), range(lon))); #this overhead is taken care of implicitly by GetMap.bbox(); MyMap <- GetMap(center=center, zoom=zoom,markers = paste0("&markers=color:blue|label:S|", "40.702147,-74.015794&markers=color:green|label:G|40.711614,-74.012318&markers=", "color:red|color:red|label:C|40.718217,-73.998284"), destfile = "MyTile1.png"); tmp <- PlotOnStaticMap(MyMap, lat = lat, lon = lon, destfile = "MyTile1.png", cex=1.5,pch=20, col=c('red', 'blue', 'green'), add=FALSE); #and add lines: PlotOnStaticMap(MyMap, lat = c(40.702147,40.711614,40.718217), lon = c(-74.015794,-74.012318,-73.998284), lwd=1.5,col=c('red', 'blue', 'green'), FUN = lines, add=TRUE) } }) RgoogleMaps/R/GetMapTiles.R0000644000176200001440000002615314521734231015204 0ustar liggesusers # tile2long = function(x,z){ return (x/(2^z)*360-180); } # tile2lat= function(y,z) { n=pi-2*pi*y/(2^z); # return (180/pi*atan(0.5*(exp(n)-exp(-n)))); } `GetMapTiles` <- structure(function# download map tiles from specified map tile servers such as openstreetmap or Google ### Query the server for map tiles, defined uniquely by their ### X and Y ID and zoom. For offline usage, these map tiles are stored in a local directory ### Example OSM:http://a.tile.openstreetmap.org/10/549/335.png ### Also see https://wiki.openstreetmap.org/wiki/Tile_servers ### Example Google mobile: http://mt1.google.com/vt/lyrs=m&x=1325&y=3143&z=13 ### Example Google satellite: http://mt1.google.com/vt/lyrs=s&x=1325&y=3143&z=13 ( center=c(lat=52.431635, lon=13.194773), ##<< optional center (lat first,lon second ) lonR, ##<< longitude range latR, ##<< latitude range nTiles = c(3,3), ##<< number of tiles in x and y direction #size = c(640,640), ##<< desired size of the map tile image. defaults to maximum size returned by the Gogle server, which is 640x640 pixels # taskfile = "Zehlendorf", ##<< File to save the meta information to. zoom =13, ##<< Google maps zoom level. # maptype = c("roadmap","mobile","satellite","terrain","hybrid","mapmaker-roadmap","mapmaker-hybrid")[1], ##<< defines the type of map to construct. There are several possible maptype values, including satellite, terrain, hybrid, and mobile. type = c("google", "google-m","google-s","osm", "osm-hot", "stamen-toner", "stamen-terrain", "stamen-watercolor")[1], ##<< choice of tile server urlBase = "http://mt1.google.com/vt/lyrs=m" , ##<< tileserver URL, alternatives would be "http://a.tile.openstreetmap.org/", "http://tile.stamen.com/toner/","http://tile.stamen.com/watercolor/" tileDir= "/tmp/", ##<< map tiles can be stored in a local directory, e.g. "~/mapTiles/Google/" CheckExistingFiles = TRUE, ##<< logical, if TRUE check if files already exist and only download if not! TotalSleep = NULL, ##<< overall time (in seconds) that one is willing to add in between downloads. This is intended to lower the risk of a server denial. If NULL no call to \link{Sys.sleep} is executed #format = c("gif","jpg","jpg-baseline","png8","png32")[5], ##<< (optional) defines the format of the resulting image. By default, the Static Maps API creates GIF images. There are several possible formats including GIF, JPEG and PNG types. Which format you use depends on how you intend to present the image. JPEG typically provides greater compression, while GIF and PNG provide greater detail. This version supports only PNG. #RETURNIMAGE = TRUE, ##<< return image yes/no default: TRUE #GRAYSCALE =FALSE, ##<< Boolean toggle; if TRUE the colored map tile is rendered into a black & white image, see \link{RGB2GRAY} #NEWMAP = TRUE, ##<< if TRUE, query the Google server and save to \code{destfile}, if FALSE load from destfile. #SCALE = 1, ##<< use the API's scale parameter to return higher-resolution map images. The scale value is multiplied with the size to determine the actual output size of the image in pixels, without changing the coverage area of the map tileExt = ".png", ##<< image type of tile returnTiles = TRUE, ##<< return tiles in a list? verbose=0 ##<< level of verbosity ){ ##note< 256) #} if (nTiles[1] %% 2 == 0) {#even X = (tileXY[1,1]-nTiles[1]/2):(tileXY[1,1]+nTiles[1]/2-1); } else { X = (tileXY[1,1]-(nTiles[1]-1)/2):(tileXY[1,1]+(nTiles[1]-1)/2); } if (nTiles[2] %% 2 == 0) {#even Y = (tileXY[1,2]-nTiles[2]/2):(tileXY[1,2]+nTiles[2]/2-1); } else { Y = (tileXY[1,2]-(nTiles[2]-1)/2):(tileXY[1,2]+(nTiles[2]-1)/2); } if (verbose>1) browser() if (isTRUE(tileDir)) tileDir = paste0("~/mapTiles/",type,"/") if (!is.null(tileDir)) { if (!dir.exists(tileDir)) { if (verbose) cat("trying to create dir",tileDir, "\n") dir.create(tileDir, recursive = TRUE) } if (CheckExistingFiles) ExistingFiles=list.files(path=tileDir) } NumTiles = length(X)*length(Y) if (verbose) cat (NumTiles, "tiles to download \n") #http://a.tile.openstreetmap.org/15/9647/12321.png DOWNLOAD=TRUE;sleptTotal=0 if (grepl("watercolor",urlBase) | grepl("terrain",urlBase) | grepl("lyrs=s|lyrs=y",urlBase)){ tileExt = ".jpg" } if (verbose) cat("tile image format:", tileExt, "\n") k=1;tiles=list() for (x in X){ for (y in Y){ if (grepl("openstreetmap|stamen",urlBase) | grepl("osm",type)){ if (grepl("watercolor",urlBase) | grepl("terrain",urlBase)){ tileExt = ".jpg" url <- paste0(urlBase, zoom, "/",x , "/", y, ".jpg")#not necessary as the stamenWeb server automatically converts the png request to jpg } else { url <- paste0(urlBase, zoom, "/",x , "/", y, ".png") } } else if (grepl("google",urlBase)){ url <- paste0(urlBase, "&x=", x, "&y=", y, "&z=", zoom) if (grepl("lyrs=s|lyrs=y",urlBase)) tileExt = ".jpg" #satellite or hybrid } #browser() #print(url) # we need to keep the x and y coords to 4 digits! #xFake = x #yFake = y f=paste(zoom, x, y, sep="_") if (CheckExistingFiles) if (paste0(f,tileExt) %in% ExistingFiles) { if (verbose) cat("NOT downloading existing file ",f, tileExt, "\n",sep="" ) DOWNLOAD=FALSE } else { DOWNLOAD=TRUE } destfile = file.path(tileDir, f) mapFile=paste0(destfile,tileExt) if (DOWNLOAD){ if (!is.null(TotalSleep)){ sleep_a_bit = round(runif(1,max=2*TotalSleep/NumTiles),1) Sys.sleep(sleep_a_bit) sleptTotal= sleptTotal+sleep_a_bit } res=try(download.file(url, mapFile, mode="wb", quiet = TRUE)); if (inherits(res,"try-error")){ tmp=RCurl::getBinaryURL(url) if (tileExt == ".png") png::writePNG(tmp, mapFile) } } if (tileExt == ".jpg") { readImg = jpeg::readJPEG } else if (tileExt == ".png") { readImg = png::readPNG } if (returnTiles){ res=try(readImg(mapFile, native=TRUE)) if (inherits(res,"try-error")){#download again download.file(url, mapFile, mode="wb", quiet = TRUE); } else tiles[[k]]=res } #browser() k=k+1 } } if (verbose) cat("sleptTotal=",sleptTotal, "\n") mt = list(X=X,Y=Y,zoom=zoom,tileDir=tileDir,tileExt=tileExt,type=type, tiles=tiles) class(mt) = "mapTiles" invisible(mt) ### list with important information }, ex = function(){ if (0){ #OSM, Ireland xlim = c(-7, -3.5) ylim = c(51.35, 55.35) Dublin = c(lon=-6.266155,lat=53.350140) DublinMerc = geosphere_mercator(Dublin) ir.osm <- GetMapTiles(lonR=xlim, latR=ylim, zoom=7, verbose=1, type = "osm", tileDir= TRUE) map = plotOSM(ir.osm) par("usr")#A vector of the form c(x1, x2, y1, y2) points(map$bbox$upperLeft,col=2,pch=20) points(map$bbox$lowerRight,col=2,pch=20) points(DublinMerc, col =2, pch=1,cex=1.5) ir.stamenToner <- GetMapTiles(lonR=xlim, latR=ylim, zoom=7,verbose=0, type = "stamen", tileDir= TRUE) plotOSM(ir.stamenToner) ir.stamenWater <- GetMapTiles(lonR=xlim, latR=ylim, zoom=7, verbose=1, type = "stamen-watercolor", tileDir= TRUE) plotOSM(ir.stamenWater) ############################################# zoom=5 nTiles = prod(NumTiles(lonR=c(-135,-66), latR=c(25,54) , zoom=zoom)) us_google_5 = GetMapTiles(lonR=c(-135,-66), latR=c(25,54) , zoom=zoom, TotalSleep = 2*nTiles, type = "google", tileDir= TRUE, verbose = TRUE) PlotOnMapTiles(us_google_5) wtc_ll = getGeoCode("World Trade Center, NY") wtc_google_15=GetMapTiles(wtc_ll, zoom=15,nTiles = c(3,3), type = "google", tileDir= TRUE, verbose = 1) PlotOnMapTiles(wtc_google_15) wtc_google_16 =GetMapTiles(wtc_ll, zoom=16,nTiles = c(4,4), type = "google", tileDir= TRUE, verbose=1) PlotOnMapTiles(wtc_google_16) wtc_stamen=GetMapTiles(wtc_ll, zoom=15,nTiles = c(3,3), verbose=1, type = "stamen-toner", tileDir= TRUE) PlotOnMapTiles(wtc_stamen) ###combine with leaflet: #From:http://stackoverflow.com/questions/5050851/ # best-lightweight-web-server-only-static-content-for-windows #To use Python as a simple web server just change your working #directory to the folder with your static content and type #python -m SimpleHTTPServer 8000, everything in the directory #will be available at http:/localhost:8000/ library(leaflet) m = leaflet::leaflet() %>% addTiles( urlTemplate = "http:/localhost:8000/mapTiles/OSM/{z}_{x}_{y}.png") m = leaflet::leaflet() %>% addTiles( urlTemplate = "http:/localhost:8000/mapTiles/Google/{z}_{x}_{y}.png") m = m %>% leaflet::setView(-74.01312, 40.71180, zoom = 16) m = m %>% leaflet::addMarkers(-74.01312, 40.71180) #Quadriga: m = m %>% leaflet::setView(13.39780, 52.51534, zoom = 16) m = m %>% leaflet::addMarkers(13.39780, 52.51534) } }) RgoogleMaps/R/sp_bbox.R0000644000176200001440000000072314517264241014461 0ustar liggesuserssp_bbox = function (obj) { is_points <- function(obj) { is <- FALSE if (is.array(obj)) if (length(dim(obj)) == 2) if (dim(obj)[2] >= 2) is <- TRUE is } if (!is_points(obj)) stop("object not a >= 2-column array") xr <- range(obj[, 1], na.rm = TRUE) yr <- range(obj[, 2], na.rm = TRUE) res <- rbind(x = xr, y = yr) colnames(res) <- c("min", "max") res } RgoogleMaps/R/RGB2GRAY.R0000644000176200001440000000333013370571147014203 0ustar liggesusers`RGB2GRAY` <-structure(function#translates an RGB image matrix to gray scale ### This function translates the rgb values of the array myTile into a scalar matrix with just one gray value per pixel. ( myTile ##<< rgb image matrix, usually array with 3 dimensions ){ #Gray scale intensity = 0.30R + 0.59G + 0.11B stopifnot(attr(myTile, "type") != "gray"); f = NULL ##details<< Gray scale intensity defined as 0.30R + 0.59G + 0.11B if (class(myTile)[1] == 'nativeRaster'){ # comparing nativeRaster values is not easy, so let's do write/read again f = file.path(tempdir(), "tmpMap.png") writePNG(myTile, f) myTile = readPNG(f) } if (class(myTile)[1] == 'array'){ # if (0) { # tmp = matrix(0.7, ncol=dim(myTile)[2], nrow=dim(myTile)[1] ) # for (i in 1:nrow(tmp)) # for (j in 1:ncol(tmp)) # tmp[i,j] = .3*myTile[i,j,1] + .59*myTile[i,j,2] + .11*myTile[i,j,3] # myTile = tmp # } #or in vectorized form: ncol=dim(myTile)[2]; nrow=dim(myTile)[1] dim(myTile) <- c(prod(dim(myTile)[1:2]),dim(myTile)[3]) tmp = .3*myTile[,1] + .59*myTile[,2] + .11*myTile[,3] myTile = matrix(tmp, ncol=ncol, nrow=nrow ) } if (!is.null(f)){ writePNG(myTile, f) myTile = readPNG(f, native = TRUE) } return(myTile); ### image tile }, ex=function(){ if (0){ BrooklynLatLon = getGeoCode("Brooklyn") mapBrooklyn <- GetMap(center=BrooklynLatLon, destfile = file.path(tempdir(), "Brooklyn.png"), zoom=11, size = c(240,240)) mapBrooklynBW$myTile = RGB2GRAY(mapBrooklyn$myTile) PlotOnStaticMap(mapBrooklynBW) } }) RgoogleMaps/R/XY2LatLon.R0000644000176200001440000000470212763212520014554 0ustar liggesusers`XY2LatLon` <-structure(function#computes the centered coordinate transformation from lat/lon to map tile coordinates ###The function XY2LatLon(MyMap, X,Y,zoom) computes the coordinate transformation from map tile coordinates to lat/lon given a map object. ( MyMap, ##<< map object X, ##<< latitude values to transform Y, ##<< longitude values to transform zoom ##<< optional zoom level. If missing, taken from \code{MyMap} ){ #X and Y are the centered integer pixel values, i.e. they should be zero in the center of the matrix/image ! if (!missing(MyMap)){ lat.center <- MyMap[[1]]; lon.center <- MyMap[[2]]; if (missing(zoom)) zoom <- MyMap[[3]]; mycenter <- LatLon2XY(lat.center,lon.center,zoom); #first transform to original x,y coordinates x <- mycenter$Tile[,"X"] + (X+mycenter$Coords[,"x"])/256; y <- mycenter$Tile[,"Y"] - (Y-mycenter$Coords[,"y"])/256; } else { x = X y = Y } ytilde <- 1 - y/2^(zoom-1); yy = (exp(2*pi* ytilde) - 1)/(exp(2*pi* ytilde) + 1); ShiftLat <- function(yy){ n = c(-1,0,1); #print(180*asin( yy )/pi) #lat = 2*pi*(n+1) - asin( yy ) ; lat = 2*pi*(n) + asin( yy ) ; lat <- lat[which(lat <= pi/2 & lat > -pi/2 )]; #convert back to degrees: lat <- 180 * lat/ pi; return(lat); } lat <- sapply(yy, ShiftLat); #longitude is easy: lon = 180*( x/2^(zoom-1) - 1 ); ##seealso<< \link{LatLon2XY} \link{Tile2R} return(cbind(lat=lat, lon=lon)); ### properly scaled and centered (with respect to the center of \code{MyMap} ) coordinates ### \item{lon }{longitude} ### \item{lat }{latitude} }, ex = function(){ #quick test: zoom=12;MyMap <- list(40,-120,zoom, url="google", BBOX = list(ll=c(35,-125), ur=c(45,-115))); LatLon <- c(lat = 40.0123, lon = -120.0123); Rcoords <- LatLon2XY.centered(MyMap,LatLon["lat"],LatLon["lon"]) newLatLon <- XY2LatLon(MyMap, Rcoords$newX, Rcoords$newY) max(abs(newLatLon - LatLon)); #more systematic: for (zoom in 2:10){ cat("zoom: ", zoom, "\n"); MyMap <- list(40,-120,zoom, url="google", BBOX = list(ll=c(35,-125), ur=c(45,-115))); LatLon <- c(lat = runif(1,-80,80), lon = runif(1,-170,170)); Rcoords <- LatLon2XY.centered(MyMap,LatLon["lat"],LatLon["lon"]) newLatLon <- XY2LatLon(MyMap, Rcoords$newX, Rcoords$newY) if(max(abs(newLatLon - LatLon)) > 0.0001) print(rbind(LatLon, newLatLon)); } }) RgoogleMaps/R/NumTiles.R0000644000176200001440000000432613526735724014600 0ustar liggesusersNumTiles <- structure(function#computes the necessary number of tiles from a bounding box and a zoom level ### computes the necessary number of tiles from a bounding box and a zoom level ( lonR, ##<< longitude range latR, ##<< latitude range, zoom =13, ##<< zoom level CheckExistingFiles = TRUE, ##<< logical, if TRUE check if files already exist and only download if not! tileExt = ".png", ##<< image type of tile tileDir= "~/mapTiles/OSM/", ##<< map tiles are stored in a local directory, e.g. "~/mapTiles/Google/" verbose=0 ##<< level of verbosity ){ nTiles=c(0,0) if (!missing(lonR) & !missing(latR)) { XYmin = LatLon2XY(lat=latR[1], lon=lonR[1],zoom=zoom) XYmax = LatLon2XY(lat=latR[2], lon=lonR[2],zoom=zoom) nTiles[1] = abs(XYmax$Tile[1,1]-XYmin$Tile[1,1])+1 nTiles[2] = abs(XYmax$Tile[1,2]-XYmin$Tile[1,2])+1 center = c(lat=mean(latR),lon=mean(lonR)) } if (CheckExistingFiles) { XY = LatLon2XY(lat=center["lat"], lon=center["lon"],zoom=zoom) tileXY = XY$Tile + as.numeric(XY$Coords > 256) if (nTiles[1] %% 2 == 0) {#even X = (tileXY[1,1]-nTiles[1]/2):(tileXY[1,1]+nTiles[1]/2-1); } else { X = (tileXY[1,1]-(nTiles[1]-1)/2):(tileXY[1,1]+(nTiles[1]-1)/2); } if (nTiles[2] %% 2 == 0) {#even Y = (tileXY[1,2]-nTiles[2]/2):(tileXY[1,2]+nTiles[2]/2-1); } else { Y = (tileXY[1,2]-(nTiles[2]-1)/2):(tileXY[1,2]+(nTiles[2]-1)/2); } fNameServer = function(x,y) paste0(paste(zoom, x, y, sep="_"),tileExt) fList = as.vector(outer(X,Y,FUN = fNameServer)) ExistingFiles=list.files(path=tileDir) fExist = sum(fList %in% ExistingFiles) cat("still need to download", prod(nTiles)-fExist,"tiles from ", prod(nTiles), "requested files.\n") } return(nTiles) ### tuple with number of tiles for lon and lat extent }, ex = function(){ if (0){ #US bounding box: for (zoom in 4:15) { cat("OSM, zoom =", zoom, "\n") NumTiles(lonR=c(-135,-66), latR=c(25,54) , zoom=zoom) } for (zoom in 4:15) { cat("Google, zoom =", zoom, "\n") NumTiles(lonR=c(-135,-66), latR=c(25,54) , zoom=zoom, tileDir= "~/mapTiles/Google/") } } })RgoogleMaps/R/MaxZoom.R0000644000176200001440000000142212710215416014405 0ustar liggesusers`MaxZoom` <-structure(function#computes the maximum zoom level which will contain the given lat/lon range ### computes the maximum zoom level which will contain the given lat/lon range ( latrange, ##<< range of latitude values lonrange, ##<< range of longitude values size = c(640,640) ##<< desired size of the map tile image. defaults to maximum size returned by the Gogle server, which is 640x640 pixels ){ SinPhi = sin(latrange * pi /180); normX = lonrange / 180; normY = (0.5 * log(abs((1 + SinPhi) / (1 -SinPhi) )) ) / pi; MaxZoom.lon <- floor(1 + log2(abs(size[1]/256/diff(normX)))); MaxZoom.lat <- floor(1 + log2(abs(size[2]/256/diff(normY)))); return(min(c(MaxZoom.lat=MaxZoom.lat,MaxZoom.lon=MaxZoom.lon))) ### zoom level }) RgoogleMaps/R/TextOnStaticMap.R0000644000176200001440000000425313370571211016050 0ustar liggesusers`TextOnStaticMap` <-structure(function#plots text on map ### TextOnStaticMap draws the strings given in the vector labels at the coordinates given by x and y on a map. y may be missing since xy.coords(x,y) is used for construction of the coordinates. ( MyMap, ##<< map image returned from e.g. \code{GetMap()} lat, ##<< latitude where to put text. lon, ##<< longitude where to put text. labels = seq_along(lat), ##<< a character vector or \link{expression} specifying the text to be written. An attempt is made to coerce other language objects (names and calls) to expressions, and vectors and other classed objects to character vectors by \link{as.character}. If labels is longer than x and y, the coordinates are recycled to the length of labels. TrueProj = TRUE, ##<< set to FALSE if you are willing to accept some degree of inaccuracy in the mapping. In that case, the coordinates of the image are in lat/lon and the user can simply overly points/lines/axis without worrying about projections FUN = text, ##<< overlay function, typical choice would be \link{text} add = FALSE, ##<< start a new plot or add to an existing verbose = 0, ##<< level of verbosity ... ##<< further arguments to be passed to \code{FUN} ){ if (TrueProj){ Rcoords <- LatLon2XY.centered(MyMap,lat= lat,lon= lon); } else { #no transformtion Rcoords <- list(newY= lat,newX= lon); } if (!add) tmp <- PlotOnStaticMap(MyMap, TrueProj = TrueProj, verbose=verbose); FUN(x=Rcoords$newX, y=Rcoords$newY, labels = labels, ...); ### return value of \code{FUN} }, ex = function(){ if (0) { lat = c(40.702147,40.718217,40.711614); lon = c(-74.012318,-74.015794,-73.998284); center = c(mean(lat), mean(lon)); zoom <- min(MaxZoom(range(lat), range(lon))); MyMap <- GetMap(center=center, zoom=zoom,markers = paste0("&markers=color:blue|label:S|", "40.702147,-74.015794&markers=color:green|label:G|40.711614,-74.012318&markers=", "color:red|color:red|label:C|40.718217,-73.998284"), destfile = "MyTile1.png"); TextOnStaticMap(MyMap, lat=40.711614,lon=-74.012318, "Some Text", cex=2, col = 'red') } }) RgoogleMaps/R/Tile2R.R0000644000176200001440000000206512710215416014120 0ustar liggesusers`Tile2R` <-structure(function#simple utility to offset and scale XY coordinates with respect to the center ### simple utility to offset and scale XY coordinates with respect to the center ( points, ##<< XY coordinates returned by e.g. \link{LatLon2XY} center ##<< XY coordinates of center returned by e.g. \link{LatLon2XY} ){ ##details<< mainly used for shrinking the size of a tile to the minimum size. X <- 256* (points$Tile[,"X"] - center$Tile[,"X"]) + (points$Coords[,"x"] - center$Coords[,"x"]) ; Y <- -256*(points$Tile[,"Y"] - center$Tile[,"Y"]) - (points$Coords[,"y"] - center$Coords[,"y"]) ; return(list(X=X,Y=Y)) ### list with X and Y pixel values }, ex = function(){ latR <- c(34.5,34.9); lonR <- c(-100.3, -100); lat.center <- 34.7; lon.center <- -100.2; zoom = 10; ll <- LatLon2XY(latR[1], lonR[1], zoom);#lower left corner ur <- LatLon2XY(latR[2], lonR[2], zoom );#upper right corner cr <- LatLon2XY(lat.center, lon.center, zoom );#center ll.Rcoords <- Tile2R(ll, cr); ur.Rcoords <- Tile2R(ur, cr); }) RgoogleMaps/R/GetBingMap.R0000644000176200001440000002712113636633001014776 0ustar liggesusers`GetBingMap` <- structure(function# download a static map from the Microsoft map tile server ### Query the Google server for a static map tile, defined primarily by its ### center and zoom. Many additional arguments allow the user to customize ### the map tile. ( center=c(lat=42, lon=-76), ##<< optional center (lat first,lon second ) mapArea=c(45.219,-122.325,47.610,-122.107), ##<< A rectangular area specified as a bounding box (ll,ur). Required when a center point or set of route points are not specified size = c(640,640), ##<< desired size of the map tile image. defaults to maximum size returned by the Gogle server, which is 640x640 pixels destfile, ##<< File to load the map image from or save to, depending on \code{NEWMAP}. zoom =12, ##<< Google maps zoom level. markers, ##<< (optional) defines one or more markers to attach to the image at specified locations. This parameter takes a string of marker definitions separated by the pipe character (|) path="", ##<< (optional) defines a single path of two or more connected points to overlay on the image at specified locations. This parameter takes a string of point definitions separated by the pipe character (|) # span, ##<< (optional) defines a minimum viewport for the map image expressed as a latitude and longitude pair. The static map service takes this value and produces a map of the proper zoom level to include the entire provided span value from the map`s center point. Note that the resulting map may include larger bounds for either latitude or longitude depending on the rectangular dimensions of the map. If zoom is specified, span is ignored # frame, ##<< (optional) specifies that the resulting image should be framed with a colored blue border. The frame consists of a 5 pixel, 55 % opacity blue border. # hl, ##<< (optional) defines the language to use for display of labels on map tiles. Note that this paramater is only supported for some country tiles; if the specific language requested is not supported for the tile set, then the default language for that tile set will be used. # sensor = "true", ##<< specifies whether the application requesting the static map is using a sensor to determine the user`s location. This parameter is now required for all static map requests. maptype = c("Road","Aerial","AerialWithLabels")[1], ##<< defines the type of map to construct. See https://msdn.microsoft.com/en-us/library/ff701724.aspx format = c("png","gif","jpg","jpg-baseline","png8","png32")[1], ##<< (optional) defines the format of the resulting image. By default, the Static Maps API creates GIF images. There are several possible formats including GIF, JPEG and PNG types. Which format you use depends on how you intend to present the image. JPEG typically provides greater compression, while GIF and PNG provide greater detail. This version supports only PNG. extraURL="", ##<< custom URL suffix RETURNIMAGE = TRUE, ##<< return image yes/no default: TRUE GRAYSCALE =FALSE, ##<< Boolean toggle; if TRUE the colored map tile is rendered into a black & white image, see \link{RGB2GRAY} NEWMAP = TRUE, ##<< if TRUE, query the Google server and save to \code{destfile}, if FALSE load from destfile. SCALE = 1, ##<< use the API's scale parameter to return higher-resolution map images. The scale value is multiplied with the size to determine the actual output size of the image in pixels, without changing the coverage area of the map apiKey = NULL, ##<< optional API key (allows for higher rate of downloads) verbose=0 ##<< level of verbosity ){ ##note<1) rect(x,yr,x+tw,yr+tw) if (!all(usrNew ==par("usr"))) #if (verbose) cat("placing ", k,"th tile at coords:",x,yr,x+tw,yr+tw, "\n") } } } if (verbose>1) { points(XY2[,"X"],XY2[,"Y2"],col=2,pch=20) browser() } dev.off() invisible(destfile) ### list with tiles }, ex = function(){ if (0){ lat = c(40.702147,40.718217,40.711614); lon = c(-74.012318,-74.015794,-73.998284); center = c(mean(lat), mean(lon)); zoom <- min(MaxZoom(range(lat), range(lon))); bb=qbbox(lat,lon) mt = GetMapTiles(latR =bb$latR , lonR=bb$lonR,zoom=zoom,verbose=1) PlotOnMapTiles(mt,lat=lat,lon=lon,pch=20,col=c('red', 'blue', 'green'),cex=2) mt = GetMapTiles(latR =bb$latR , lonR=bb$lonR,zoom=zoom, tileDir= "~/mapTiles/Google/") PlotOnMapTiles(mt,lat=lat,lon=lon,pch=20,col=c('red', 'blue', 'green'),cex=2) } }) RgoogleMaps/R/LatLon2XY.R0000644000176200001440000000312312710373526014556 0ustar liggesusers`LatLon2XY` <- structure(function#computes the coordinate transformation from lat/lon to map tile coordinates ### The function LatLon2XY(lat,lon,zoom) computes the coordinate transformation from lat/lon to map tile coordinates given a zoom level. ### It returns the tile coordinates as well as the pixel coordinates within the Tile itself. ( lat, ##<< latitude values to transform lon, ##<< longitude values to transform zoom ##<< zoom level.lat,lon,zoom ){ #The int part may be used directly to obtain the Tiles (Attention: Illegal) using a URL formed like this: #String.Format("http://mt.google.com/mt?x={0}&y={1}&zoom={2}", c.x, c.y, 17-zoom) ##note<< The fractional part times 256 is the pixel coordinate within the Tile itself. #double sin_phi = System.Math.Sin(this.lat * System.Math.PI /180); #double norm_x = this.lon / 180; #double norm_y = (0.5 * System.Math.Log((1 + sin_phi) / (1 -sin_phi))) / System.Math.PI; #this.y = System.Math.Pow(2, this.zoom) * ((1 - norm_y) / 2); #this.x = System.Math.Pow(2, this.zoom) * ((norm_x + 1) / 2); SinPhi = sin(lat * pi /180); normX = lon / 180; normY = (0.5 * log((1 + SinPhi) / (1 -SinPhi))) / pi; Y = (2^zoom) * ((1 - normY) / 2); X = (2^zoom) * ((normX + 1) / 2); x = 256 *(X- floor(X)); y = 256 *(Y- floor(Y)); return(list(Tile = cbind(X=floor(X),Y=floor(Y)), Coords = cbind(x=x,y=y))) ### A list with values ### \item{Tile}{integer numbers specifying the tile} ### \item{Coords}{pixel coordinate within the Tile} }, ex = function(){ LatLon2XY(38.45, -122.375, 11) }) RgoogleMaps/R/qbbox.R0000644000176200001440000000430713463001573014136 0ustar liggesusers`qbbox` <-structure(function#computes bounding box ### The function qbbox computes a bounding box for the given lat,lon ### points with a few additional options such as quantile boxes, additional margins, etc. ( lat, ##<< latitude values lon, ##<< longitude values TYPE = c("all", "quantile")[1], ##<< margin = list(m=c(1,1,1,1), TYPE = c("perc", "abs")[1]), ##<< relative or absolute margin around the data. Set to NULL if no margin desired. q.lat = c(0.1,0.9), ##<< latitude quantile trimming, the tails will be trimmed from the bounding box q.lon = c(0.1,0.9), ##<< longitude quantile trimming, verbose=0 ##<< ){ if (TYPE == "all"){ latR <- range(lat,na.rm=TRUE); lonR <- range(lon,na.rm=TRUE) } else if (TYPE == "quantile"){ latR <- quantile(lat, q.lat, na.rm=TRUE); lonR <- quantile(lon, q.lon, na.rm=TRUE); } if (!is.null(margin)){ m <- margin$m; lat.center <- latR[1] + diff(latR)/2; lon.center <- lonR[1] + diff(lonR)/2; if (margin$TYPE == "perc"){ dlon <- c(-1,1)*(1+m[c(2,4)]/100)*diff(lonR)/2; dlat <- c(-1,1)*(1+m[c(1,3)]/100)*diff(latR)/2; } else if (margin$TYPE == "abs"){ dlon <- c(-1,1)*(m[c(2,4)] + diff(lonR)/2); dlat <- c(-1,1)*(m[c(1,3)] + diff(latR)/2); } lonR.margin <- lon.center + dlon; latR.margin <- lat.center + dlat; if (verbose>1) { cat("old/new lon range:");print(lonR);print(lonR.margin); cat("old/new lat range:");print(latR);print(latR.margin); } return(list(latR=latR.margin, lonR=lonR.margin)) } return(list(latR=latR, lonR=lonR)) ### \item{latR }{latitude range} ### \item{lonR }{longitude range} }, ex = function(){ lat = 37.85 + rnorm(100, sd=0.001); lon = -120.47 + rnorm(100, sd=0.001); #add a few outliers: lat[1:5] <- lat[1:5] + rnorm(5, sd =.01); lon[1:5] <- lon[1:5] + rnorm(5, sd =.01); #range, discarding the upper and lower 10% of the data qbbox(lat, lon, TYPE = "quantile"); #full range: qbbox(lat, lon, TYPE = "all"); #add a 10% extra margin on all four sides: qbbox(lat, lon, margin = list(m = c(10, 10, 10, 10), TYPE = c("perc", "abs")[1])); }) RgoogleMaps/R/mypolygon.R0000644000176200001440000000054312710215416015053 0ustar liggesusers`mypolygon` <-structure(function#simple wrapper function to plot colored polygons ###same as \link{polygon}, execept the value for color is taken from the 1st element of the exra column 'col' ( x, ##<< matrix containing columns X,Y,col ...##<< extra arguments passed to \link{polygon} ){ polygon(x[,c("X","Y")],col=x[1,"col"],...) }) RgoogleMaps/R/updateusr.R0000644000176200001440000000550712710215416015037 0ustar liggesusers`updateusr` <-structure(function#Updates the 'usr' coordinates in the current plot. ### For a traditional graphics plot this function will update the 'usr' ### coordinates by transforming a pair of points from the current usr ### coordinates to those specified. ( x1, ##<< The x-coords of 2 points in the current 'usr' coordinates, or anything that can be passed to \code{xy.coords}. y1 = NULL, ##<< The y-coords of 2 points in the current 'usr' coordinates, or an object representing the points in the new 'usr' coordinates. x2, ##<< The x-coords for the 2 points in the new coordinates. y2 = NULL ##<< The y-coords for the 2 points in the new coordinates. ) { xy1 <- xy.coords(x1, y1) xy2 <- if (missing(x2) && missing(y2)) { xy.coords(y1) } else { xy.coords(x2, y2) } cur.usr <- par("usr") xslope <- diff(xy2$x)/diff(xy1$x) yslope <- diff(xy2$y)/diff(xy1$y) new.usr.x <- xslope * (cur.usr[1:2] - xy1$x) + xy2$x new.usr.y <- yslope * (cur.usr[3:4] - xy1$y) + xy2$y invisible(par(usr = c(new.usr.x, new.usr.y))) ##details<< Sometimes graphs (in the traditional graphing scheme) end up with usr ## coordinates different from expected for adding to the plot (for ## example \code{barplot} does not center the bars at integers). This ## function will take 2 points in the current 'usr' coordinates and the ## desired 'usr' coordinates of the 2 points and transform the user ## coordinates to make this happen. The updating only shifts and scales ## the coordinates, it does not do any rotation or warping transforms. ## ## If \code{x1} and \code{y1} are lists or matricies and \code{x2} and ## \code{y2} are not specified, then \code{x1} is taken to be the ## coordinates in the current system and \code{y1} is the coordinates in ## the new system. ## ## Currently you need to give the function exactly 2 points in each ## system. The 2 points cannot have the same x values or y values in ## either system. ##note<< Currently you need to give coordinates for exactly 2 points without ## missing values. Future versions of the function will allow missing ## values or multiple points. ## ## Note by Markus Loecher: both the source and the documentations were copied from the package TeachingDemos version 2.3 ### An invisible list with the previous 'usr' coordinates from \code{par}. }, ex = function(){ tmp <- barplot(1:4) updateusr(tmp[1:2], 0:1, 1:2, 0:1) lines(1:4, c(1,3,2,2), lwd=3, type='b',col='red') # update the y-axis to put a reference distribution line in the bottom # quarter tmp <- rnorm(100) hist(tmp) tmp2 <- par('usr') xx <- seq(min(tmp), max(tmp), length.out=250) yy <- dnorm(xx, mean(tmp), sd(tmp)) updateusr( tmp2[1:2], tmp2[3:4], tmp2[1:2], c(0, max(yy)*4) ) lines(xx,yy) }) RgoogleMaps/R/GetMap.bbox.R0000644000176200001440000001036313557571022015135 0ustar liggesusers`GetMap.bbox` <- structure(function ### Wrapper function for \link{GetMap}. Query the Google server for a static map tile, defined primarily by its lat/lon range and/or center and/or zoom. ### Multiple additional arguments allow the user to customize the map tile. ( lonR, ##<< longitude range latR, ##<< latitude range center, ##<< optional center size = c(640,640), ##<< desired size of the map tile image. defaults to maximum size returned by the Gogle server, which is 640x640 pixels destfile = "MyTile.png", ##<< File to load the map image from or save to, depending on \code{NEWMAP}. MINIMUMSIZE = FALSE, ##<< reduce the size of the map to its minimum size that still fits the lat/lon ranges ? RETURNIMAGE = TRUE, ##<< return image yes/no default: TRUE GRAYSCALE =FALSE, ##<< Boolean toggle; if TRUE the colored map tile is rendered into a black & white image, see \link{RGB2GRAY} NEWMAP = TRUE, ##<< if TRUE, query the Google server and save to \code{destfile}, if FALSE load from destfile. zoom, ##<< Google maps zoom level. optional verbose=0, ##<< level of verbosity SCALE = 1, ##<< use the API's scale parameter to return higher-resolution map images. The scale value is multiplied with the size to determine the actual output size of the image in pixels, without changing the coverage area of the map type = c("google", "google-m","google-s","osm", "osm-hot", "stamen-toner", "stamen-terrain", "stamen-watercolor")[1], ##<< choice of tile server urlBase = "http://mt1.google.com/vt/lyrs=m" , ##<< tileserver URL, alternatives would be "http://a.tile.openstreetmap.org/", "http://tile.stamen.com/toner/","http://tile.stamen.com/watercolor/" tileDir= "/tmp/", ##<< map tiles can be stored in a local directory, e.g. "~/mapTiles/Google/" ... ##<< extra arguments to \link{GetMap} ){ if (missing(zoom)) zoom <- min(MaxZoom(latR, lonR, size)); if (missing(center)){ lat.center <- mean(latR);#latR[1] + diff(latR)/2; lon.center <- mean(lonR);#lonR[1] + diff(lonR)/2; } else { lat.center <- center[1]; lon.center <- center[2]; } if (MINIMUMSIZE){ ll <- LatLon2XY(latR[1], lonR[1], zoom);#lower left corner ur <- LatLon2XY(latR[2], lonR[2], zoom );#upper right corner cr <- LatLon2XY(lat.center, lon.center, zoom );#center ll.Rcoords <- Tile2R(ll, cr); ur.Rcoords <- Tile2R(ur, cr); if (verbose>1){ cat("ll:"); print(ll);print(ll.Rcoords) cat("ur:"); print(ur);print(ur.Rcoords); cat("cr:"); print(cr); } #return(list(ll,ur)); size[1] <- 2*max(c(ceiling(abs(ll.Rcoords$X)), ceiling(abs(ur.Rcoords$X)) ))+1; size[2] <- 2*max(c(ceiling(abs(ll.Rcoords$Y)), ceiling(abs(ur.Rcoords$Y)) ))+1; #size[1] <- ceiling(abs(256* (ur$Tile[,"X"] - ll$Tile[,"X"]) + (ur$Coords[,"x"] - ll$Coords[,"x"]))); #size[2] <- ceiling(abs(256* (ur$Tile[,"Y"] - ll$Tile[,"Y"]) + (ur$Coords[,"y"] - ll$Coords[,"y"]))); if (verbose) cat("new size: ", size, "\n") } #if (NEWMAP) return(GetMap(center = c(lat.center, lon.center), zoom = zoom, size=size, destfile = destfile, RETURNIMAGE = RETURNIMAGE, GRAYSCALE = GRAYSCALE, SCALE=SCALE, type=type, urlBase=urlBase, tileDir=tileDir, verbose = verbose, ...)); ### map tile }, ex = function(){ if (0){ mymarkers <- cbind.data.frame(lat = c(38.898648,38.889112, 38.880940), lon = c(-77.037692, -77.050273, -77.03660), size = c('tiny','tiny','tiny'), col = c('blue', 'green', 'red'), char = c('','','')); ##get the bounding box: bb <- qbbox(lat = mymarkers[,"lat"], lon = mymarkers[,"lon"]); ##download the map: MyMap <- GetMap.bbox(bb$lonR, bb$latR, destfile = "DC.png", GRAYSCALE =TRUE, markers = mymarkers); ##The function qbbox() basically computes a bounding box for the given lat,lon #points with a few additional options such as quantile boxes, additional buffers, etc. bb <- qbbox(c(40.702147,40.711614,40.718217),c(-74.015794,-74.012318,-73.998284), TYPE = "all", margin = list(m=rep(5,4), TYPE = c("perc", "abs")[1])); ##download the map: MyMap <- GetMap.bbox(bb$lonR, bb$latR,destfile = "MyTile3.png", maptype = "satellite") } }) RgoogleMaps/R/plotOSM.R0000644000176200001440000001413314521744522014362 0ustar liggesusers osmtile_bbox = function# compute the bounding box of an OpenStreetmap tile ### inspired by \code{osmtile} from the package \code{OpenStreetmap} ### returns the Mercator projection bounding box ( x=61, ##<< x tile coordinate y=41, ##<< x tile coordinate zoom =7, ##<< zoom level minim = -20037508 ##<< parameter for OSM projection ){ sc <- abs(minim) * 2 p1 <- c(x/(2^zoom) * sc + minim, -(y/(2^zoom) * sc + minim))#upper left ?? p2 <- c((x + 1)/(2^zoom) * sc + minim, -((y + 1)/(2^zoom) * sc + minim)) #lowerRight? bbox <- list(upperLeft = p1, lowerRight = p2) return(bbox) ### bounding box, Mercator projection } plotOSM = function#plots OSM map tiles ### places tiles on plot ( mt, ##<< list returned by \code{GetMapTiles} upperLeft, ##<< upperLeft corner in lat/lon of the plot region lowerRight, ##<< lowerRight corner in lat/lon of the plot region lat, ##<< latitude values to be overlaid, if any lon, ##<< longitude values to be overlaid, if any add = FALSE, removeMargin = TRUE, verbose=0, ##<< level of verbosity ... ##<< further arguments to be passed to \code{rasterImage} ) { map <- list(tiles = mt) map$bboxLL = list() if (missing(upperLeft) & missing(lowerRight)) { x = range(mt$X) y = range(mt$Y) upperLeft = osmtile_bbox(x=x[1], y=y[1], zoom = mt$zoom)$upperLeft lowerRight = osmtile_bbox(x=x[2], y=y[2], zoom = mt$zoom)$lowerRight map$bbox <- list(upperLeft =upperLeft,lowerRight=lowerRight) } else { map$bbox <- list(upperLeft = geosphere_mercator(upperLeft[1L], upperLeft[2L]), lowerRight = geosphere_mercator(lowerRight[1L], lowerRight[2L])) if (verbose) print(map$bbox) map$bbox <- list(p1 = c(x = min(map$bbox$upperLeft[1L], map$bbox$lowerRight[1L]), y = max(map$bbox$upperLeft[2L], map$bbox$lowerRight[2L])), p2 = c(x = max(map$bbox$upperLeft[1L], map$bbox$lowerRight[1L]), y = min(map$bbox$p1[2L], map$bbox$lowerRight[2L]))) } map$bboxLL$upperLeft =geosphere_mercator(map$bbox$upperLeft,inverse = TRUE) map$bboxLL$lowerRight =geosphere_mercator(map$bbox$lowerRight,inverse = TRUE) if (verbose) print(map$bbox) mar <- par("mar") if (add == FALSE) { plot.new() if (removeMargin) par(mar = c(0, 0, 0, 0)) xlim_p = c(map$bbox$upperLeft[1], map$bbox$lowerRight[1]) ylim_p = c(map$bbox$lowerRight[2], map$bbox$upperLeft[2]) plot.window(xlim_p, ylim_p, xaxs = "i", yaxs = "i", asp = T) if (verbose>1) browser() } #if (verbose>1) browser() k=1 for (x in mt$X){ for (y in mt$Y){ osmtile=list() osmtile$tile = mt$tiles[[k]] osmtile$x=x;osmtile$y=y;osmtile$zoom=mt$zoom plotOSMtile(osmtile, verbose=verbose, ...) k=k+1 } } par(mar = mar) invisible(map) ### returns map object invisibly } plotOSMtile = function# plots a single OSM tile ### Adds tile to plot ( osmtile, ##<< tile object zoom, ##<< zoom level add = TRUE, ##<< raster = TRUE, ##<< verbose=0, ##<< level of verbosity ... ##<< further arguments to be passed to \code{rasterImage} ){ xres <- nrow(osmtile$tile) #look up: 256 or 255 ?!! yres <- ncol(osmtile$tile) if (missing(zoom)) zoom = osmtile$zoom if (verbose>1) browser() bbox=osmtile_bbox(x=osmtile$x, y=osmtile$y, zoom = zoom) bbox$p1 = bbox$upperLeft bbox$p2 = bbox$lowerRight m=0#0.5 #margin xleft = bbox$p1[1] - m * abs(bbox$p1[1] - bbox$p2[1])/yres ybottom = bbox$p2[2] + m * abs(bbox$p1[2] - bbox$p2[2])/xres xright = bbox$p2[1] - m * abs(bbox$p1[1] - bbox$p2[1])/yres ytop = bbox$p1[2] + m * abs(bbox$p1[2] - bbox$p2[2])/xres if (!raster) image(x = seq(xleft, xright, length = yres), y = seq(ybottom, ytop, length = xres), z = t(matrix(1:(xres * yres), nrow = xres, byrow = TRUE))[, xres:1], col = as.vector(osmtile$tile), add = add, ...) else rasterImage(osmtile$tile, xleft, ybottom, xright, ytop, ...) if (verbose) { cat("placing tile at coords:",xleft, ybottom, xright, ytop, "\n") rect(xleft, ybottom, xright, ytop) } ### returns nothing } geosphere_mercator = function#Transform longitude/latiude points to the Mercator projection. ### From \code{geosphere::mercator} ( p, ##<< longitude/latitude of point(s). Can be a vector of two numbers, a matrix of 2 columns (first one is longitude, second is latitude) inverse = FALSE, ##<< Logical. If TRUE, do the inverse projection (from Mercator to longitude/latitude r = 6378137 ##<< Numeric. Radius of the earth; default = 6378137 m ) { .pToMatrix <- function(p) { if (is.data.frame(p)) { p <- as.matrix(p) } else if (is.vector(p)){ if (length(p) != 2) { stop('Wrong length for a vector, should be 2') } else { p <- matrix(p, ncol=2) } } else if (is.matrix(p)) { if (ncol(p) != 2) { stop( 'A points matrix should have 2 columns') } cn <- colnames(p) if (length(cn) == 2) { if (toupper(cn[1]) == 'Y' | toupper(cn[2]) == 'X') { warning('Suspect column names (x and y reversed?)') } if (toupper(substr(cn[1],1,3) == 'LAT' | toupper(substr(cn[2],1,3)) == 'LON')) { warning('Suspect column names (longitude and latitude reversed?)') } } } else { stop('points should be vectors of length 2, matrices with 2 columns, or inheriting from a SpatialPoints* object') } if (! is.numeric(p) ) { p[] <- as.numeric(p) } return(p) } toRad <- pi/180 if (inverse) { p <- .pToMatrix(p) p[, 2] <- pi/2 - 2 * atan(exp(-p[, 2]/r)) p[, 1] <- p[, 1]/r colnames(p) <- c("lon", "lat") return(p/toRad) } else { p <- .pToMatrix(p) * toRad p[, 2] <- log(tan(p[, 2]) + (1/cos(p[, 2]))) p <- p * r colnames(p) <- c("x", "y") return(p) } ### Mercator projection of lon/lat points } RgoogleMaps/R/MapBackground.R0000644000176200001440000000667712763212520015552 0ustar liggesusers`MapBackground` <-structure(function# get static Map from the Google server ### get static Map from the Google server ( lat, ##<< lon, ##<< destfile, ##<< File to load the map image from or save to, depending on \code{NEWMAP}. NEWMAP = TRUE, ##<< if TRUE, query the Google server and save to \code{destfile}, if FALSE load from destfile. myTile, ##<< map tile from previous downloads zoom=NULL, ##<< Google maps zoom level. size = c(640,640), ##<< desired size of the map tile image. defaults to maximum size returned by the Gogle server, which is 640x640 pixels GRAYSCALE = FALSE, ##<< Boolean toggle; if TRUE the colored map tile is rendered into a black & white image, see \link{RGB2GRAY} mar=c(0,0,0,0), ##<< outer margin in plot; if you want to see axes, change the default PLOT = FALSE, ##<< if TRUE, leave the plotting to \link{PlotOnStaticMap}, highly recommended verbose = 1, ##<< level of verbosity ... ##<< further arguments to be passed to \link{GetMap.bbox} ){ #library(TeachingDemos);#only needed for the function updateusr bb <- qbbox(lat,lon, TYPE = "all", margin = list(m=rep(5,4), TYPE = c("perc", "abs")[1])); lat.center <- mean(bb$latR); lon.center <- mean(bb$lonR); if (is.null(zoom)) if (diff(bb$latR) <= 0.000001 | diff(bb$lonR) <= 0.000001) zoom <- 12 else zoom <- min(MaxZoom(bb$latR, bb$lonR, size)); if (NEWMAP | missing(destfile)){ if (missing(destfile)) destfile = paste(round(lat.center,3),round(lon.center,3),"png",sep=".") #GetMap(center = c(lat.center, lon.center), zoom = zoom, destfile = destfile); MyMap <- GetMap.bbox(bb$lonR, bb$latR, destfile = destfile, verbose = verbose, size = size, GRAYSCALE =GRAYSCALE,...); size <- dim(MyMap[[4]])[2:1]; if (is.null(zoom)) zoom <- min(MaxZoom(bb$latR, bb$lonR, size)); if (verbose) cat("center, zoom: ", lat.center, lon.center, zoom, "\n"); } else { cat("no new tile query, instead load prestored ", destfile, "\n"); MyMap <- ReadMapTile(destfile, TRUE); if ( !('lat.center' %in% names(MyMap)) | !('lon.center' %in% names(MyMap)) | !('zoom' %in% names(MyMap)) ) MyMap <- list(lat.center=lat.center, lon.center=lon.center, zoom=zoom, myTile= MyMap); } MyMap$BBOX <- list(ll = XY2LatLon(MyMap, -size[1]/2 + 0.5, -size[2]/2 + 0.5), ur = XY2LatLon(MyMap, size[1]/2 - 0.5, size[2]/2 - 0.5) ); # if (GRAYSCALE ) MyMap[[4]] <- RGB2GRAY(MyMap[[4]]); if (PLOT){ par(mar=mar);#par(pin=c(9,9)) if (class(MyMap[[4]])[1] == 'matrix'){ image(y= seq(MyMap$BBOX$ll[1], MyMap$BBOX$ur[1], length= size[1]), x= seq(MyMap$BBOX$ll[2], MyMap$BBOX$ur[2], length= size[2]), z=MyMap[[4]], col = attr(MyMap[[4]], "COL"), xlab = "", ylab = "") } else if (class(MyMap[[4]])[1] == 'SpatialGridDataFrame'){ image(MyMap[[4]], red=1, green=2, blue=3) } else { plot(MyMap[[4]]); } tmp2 <- par('usr'); #updateusr(tmp2[1:2], x2=c(-size[1]+1, size[1]-1)/2, tmp2[3:4], y2=c(-size[2]+1, size[2]-1)/2 ); updateusr(tmp2[1:2], x2=c(MyMap$BBOX$ll[1], MyMap$BBOX$ur[1]), tmp2[3:4], y2=c(MyMap$BBOX$ll[2], MyMap$BBOX$ur[2])); if (verbose) { cat("tmp2:");print(tmp2); cat("par('usr')");print(par('usr')) } } #browser(); class(MyMap) = "staticMap" invisible(MyMap); ### list containing the map tile }) RgoogleMaps/R/PlotOnMapTiles.R0000644000176200001440000000731313557566446015720 0ustar liggesusersPlotOnMapTiles = structure(function#plots on map tiles by "stitching" them together ### Counterpart to \code{PlotOnStaticMap} for map tiles ( mt, ##<< list returned by \code{GetMapTiles} lat, ##<< latitude values to be overlaid, if any lon, ##<< longitude values to be overlaid, if any center, ##<< optional center size = c(768,768), ##<< size (in pixels) of "stitched" map add=FALSE, ##<< start a new plot or add to an existing FUN = points, ##<< plotting function to use for overlay; typical choices would be \link{points} and \link{lines} mar=c(0,0,0,0), ##<< outer margin in plot; if you want to see axes, change the default verbose=0, ##<< level of verbosity ... ##<< further arguments to be passed to \code{FUN} ){ #library(png) if (mt$tileExt == ".jpg") { readImg = jpeg::readJPEG } else if (mt$tileExt == ".png") { readImg = png::readPNG } par(mar=mar) if (grepl("osm|stamen", mt$type)) { plotOSM(mt) if (!missing(lat) & !missing(lon)){ stopifnot(length(lat)==length(lon)) XY=geosphere_mercator(cbind(lon,lat)) FUN(XY[,"x"],XY[,"y"],...) } } else { tw = 257/256#257/256 #tile width and height X=mt$X;Y=mt$Y rX = range(X);rY = range(Y); if (0) if (missing(center)) { if (!missing(lat) & !missing(lon)){ centerXY=LatLon2XY(mean(lat),mean(lon),mt$zoom) XY2=as.data.frame(centerXY$Tile + centerXY$Coords/256) XY2[,"Y2"] = sum(rY)-XY2[,"Y"] xx=XY2[,"X"]+size[1]/512*c(-1,1) yy=XY2[,"Y2"]+size[2]/512*c(-1,1) plot(xx,yy,type="n", axes=FALSE, xlab="", ylab="", asp = 1); tmp2 <- par('usr'); updateusr(tmp2[1:2], x2=xx, tmp2[3:4], y2=yy ); } else { } } if (!add){ plot(rX+c(0,tw),rY+c(0,tw),type="n", axes=FALSE, xlab="", ylab="", asp = 1); tmp2 <- par('usr'); updateusr(tmp2[1:2], x2=rX+c(0,tw), tmp2[3:4], y2=rY+c(0,tw) ); if (verbose) cat("user coords:",par("usr"), "\n") k=1 for (x in X){ for (y in Y){ if (length(mt$tiles)==0){ mapFile = file.path(mt$tileDir, paste(mt$zoom, x, y, sep="_")) tile=readImg(paste0(mapFile,mt$tileExt), native=TRUE); } else { tile = mt$tiles[[k]] k=k+1 } if (exists("rasterImage")) { # can plot only in R 2.11.0 and higher #if (require(grid)) grid.raster(MyMap[[4]], width=1, height=1, y=0, just="bottom") else yr = sum(rY)-y rasterImage(tile, x,yr,x+tw,yr+tw); if (verbose) { cat("placing tile at coords:",x,yr,x+tw,yr+tw, "\n") rect(x,yr,x+tw,yr+tw) } } } } } if (!missing(lat) & !missing(lon)){ stopifnot(length(lat)==length(lon)) XY=LatLon2XY(lat,lon,mt$zoom) XY2=as.data.frame(XY$Tile + XY$Coords/256) #browser() XY2[,"Y2"] = sum(rY)-XY2[,"Y"] if (verbose) { cat("lat lon become:") print(XY2) } FUN(XY2[,"X"],XY2[,"Y2"]+1,...) } } ### nothing returned }, ex = function(){ if (0){ lat = c(40.702147,40.718217,40.711614); lon = c(-74.012318,-74.015794,-73.998284); center = c(mean(lat), mean(lon)); zoom <- min(MaxZoom(range(lat), range(lon))); bb=qbbox(lat,lon) manhattan_osm = GetMapTiles(latR =bb$latR , lonR=bb$lonR,zoom=zoom,verbose=1) PlotOnMapTiles(manhattan_osm,lat=lat,lon=lon,pch=20,col=c('red', 'blue', 'green'),cex=2) manhattan_goo = GetMapTiles(latR =bb$latR , lonR=bb$lonR,zoom=zoom, tileDir= TRUE, type="google" ) PlotOnMapTiles(manhattan_goo,lat=lat,lon=lon,pch=20,col=c('red', 'blue', 'green'),cex=2) } }) RgoogleMaps/R/IdentifyPoints.R0000644000176200001440000000125512710215416015767 0ustar liggesusersIdentifyPoints <-structure( function#identify points by clicking on map ### The user can try to identify lat/lon pairs on the map by clicking on them ( MyMap, ##<< map object n=1,##<< the maximum number of points to locate. verbose = 0 ##<< level of verbosity ){ cat("please identify ", n, "point(s) on the map with your mouse:\n") ret = locator(n) LatLon <- XY2LatLon(MyMap, ret$x,Y=ret$y) return(LatLon) ### the lat/lon coordinates of the chosen points are returned }, ex = function(){ #The first step naturally will be to download a static map from the Google server. A simple example: #identifiy points: #IdentifyPoints(MyMap,5) }) RgoogleMaps/R/LatLon2XY.centered.R0000644000176200001440000000377613557370210016361 0ustar liggesusers`LatLon2XY.centered` <-structure(function#computes the centered coordinate transformation from lat/lon to map tile coordinates ### The function LatLon2XY.centered(MyMap, lat,lon,zoom) computes the coordinate transformation from lat/lon to map tile coordinates given a map object. ( MyMap, ##<< map object lat, ##<< latitude values to transform lon, ##<< longitude values to transform zoom ##<< optional zoom level. If missing, taken from \code{MyMap} ){ # transfXY<-function(MyMap,oldX, oldY)## only use for non proper coordinate transformations # { # xlim<-c(MyMap[["BBOX"]][["ll"]][2],MyMap[["BBOX"]][["ur"]][2]) # ylim<-c(MyMap[["BBOX"]][["ll"]][1],MyMap[["BBOX"]][["ur"]][1]) # Rcoords<-list(newX=(oldX-xlim[1])/(xlim[2]-xlim[1]), # newY=(oldY-ylim[1])/(ylim[2]-ylim[1])) # #browser() # return(Rcoords) # } # # if (MyMap$url == "OSM") { # return(transfXY(MyMap,lon,lat)) # } lat.center <- MyMap[[1]]; lon.center <- MyMap[[2]]; if (missing(zoom)) zoom <- MyMap[[3]]; #account for "jumps" at longitude boundaries -180/180 #browser() lonLeft = as.numeric(MyMap$BBOX$ll)[2] #["lon"] lonRight = as.numeric(MyMap$BBOX$ur)[2] #["lon"] if (lonRight*lonLeft < 0 & FALSE){#sign change ! #print("fixing the jump at the boundaries") if (MyMap$lon.center < 0){#subtract 360 from all positive longitude values: lon[lon>0] = lon[lon>0]-360 } else if (MyMap$lon.center > 0){#add 360 to all negative longitude values: lon[lon<0] = lon[lon<0]+360 } } mypoints <- LatLon2XY(lat,lon,zoom); mycenter <- LatLon2XY(lat.center,lon.center,zoom); Rcoords <- Tile2R(mypoints, mycenter); ##seealso<< \link{LatLon2XY} \link{Tile2R} return(list(newX=Rcoords$X,newY=Rcoords$Y)); ### properly scaled and centered (with respect to the center of \code{MyMap} ) coordinates ### \item{newX }{ transformed longitude} ### \item{newY }{transformed latitude} }) RgoogleMaps/R/PlotArrowsOnStaticMap.R0000644000176200001440000000327313370571107017245 0ustar liggesusers`PlotArrowsOnStaticMap` <-structure(function#plots arrows or segments on map ###This function plots/overlays arrows or segments on a map. ( MyMap, ##<< map image returned from e.g. \code{GetMap()} lat0, ##<< latitude valuesof points FROM which to draw. lon0, ##<< longitude values of points FROM which to draw. lat1=lat0, ##<< latitude valuesof points TO which to draw. lon1=lon0, ##<< longitude values of points TO which to draw. TrueProj = TRUE, ##<< set to FALSE if you are willing to accept some degree of inaccuracy in the mapping. In that case, the coordinates of the image are in lat/lon and the user can simply overly points/lines/axis without worrying about projections FUN = arrows, ##<<, plotting function to use for overlay; typical choices would be \link{arrows} and \link{segments} add = FALSE, ##<< start a new plot or add to an existing verbose = 0, ##<< level of verbosity ... ##<< further arguments to be passed to \code{FUN} ){ ##seealso<< \link{PlotOnStaticMap} \link{arrows} if (TrueProj){ Rcoords0 <- LatLon2XY.centered(MyMap,lat= lat0,lon= lon0); Rcoords1 <- LatLon2XY.centered(MyMap,lat= lat1,lon= lon1); } else { #no transformtion Rcoords0 <- list(newY= lat0,newX= lon0); Rcoords1 <- list(newY= lat1,newX= lon1); } if (!add) tmp <- PlotOnStaticMap(MyMap, TrueProj = TrueProj, verbose=verbose); FUN(x0=Rcoords0$newX, y0=Rcoords0$newY, x1=Rcoords1$newX, y1=Rcoords1$newY, ...); ### return value of \code{FUN} }, ex = function(){ if (0){ MyMap <- GetMap(center=c(lat=40.7,lon=-74), zoom=11) PlotArrowsOnStaticMap(MyMap, lat0=40.69, lon0=-73.9, lat1=40.71, lon1=-74.1, col = 'red') } }) RgoogleMaps/R/ColorMap.R0000644000176200001440000000765413370571026014551 0ustar liggesusersColorMap <- structure(function#Plot Levels of a Variable in a Colour-Coded Map ### Plot Levels of a Variable in a Colour-Coded Map ( values, ##<< variable to plot map=NULL, ##<< map object polys=NULL, ##<< an object of class SpatialPolygons (See \link[sp]{SpatialPolygons-class} log = FALSE, ##<< boolean of whether to plot values on log scale nclr = 7, ##<< number of colour-levels to use include.legend = list(TRUE), ##<< boolean of whether to include legend round = 3, ##<< number of digits to round to in legend brks = NULL, ##<< if desired, pre-specified breaks for legend legend = NULL, ##<< if desired, a pre-specified legend location = "topright", ##<< location of legend rev = FALSE, ##<< boolean of whether to reverse colour scheme (darker colours for smaller values) alpha = 0.5, ##<< alpha value of colors GRAY = FALSE, ##<< boolean: if TRUE, use gray scale instead palette = c("YlOrRd", "RdYlGn","Spectral")[1],##<< palette to choose from RColorBrewer textInPolys = NULL, ##<< text to be displayed inside polygons. This can be a column names for values ... ##<< extra args to pass to \code{PlotPolysOnStaticMap} ){ if (length(palette) == nclr) { plotclr <- palette } else if (GRAY | !requireNamespace("RColorBrewer", quietly = TRUE) ) { plotclr <- grey(1 - seq(0, 1, by = 1/(nclr - 1))) } else { plotclr <- RColorBrewer::brewer.pal(nclr,palette) #display.brewer.all() } plotclr = AddAlpha(plotclr,alpha) nclr <- nclr + 1 if (is.null(brks)) { if (log) { brks <- exp(seq(from = min(log(values)), to = max(log(values)), length.out = nclr)) } else { brks <- seq(from = min(values), to = max(values), length.out = nclr) } } nclr <- nclr - 1 print(brks) if (rev) { plotclr <- rev(plotclr) } colornum <- findInterval(values, brks, all.inside = T) colcode <- plotclr[colornum] if (is.null(legend)) { leglabs = function (vec, under = "under", over = "over", between = "-") { x <- vec lx <- length(x) if (lx < 3) stop("vector too short") res <- character(lx - 1) res[1] <- paste(under, x[2]) for (i in 2:(lx - 2)) res[i] <- paste(x[i], between, x[i + 1]) res[lx - 1] <- paste(over, x[lx - 1]) res } legend <- leglabs(signif(brks, digits = round)) legend[1] <- paste(signif(min(values), digits = round), "-", substr(legend[1], 7, nchar(legend[1]))) legend[nclr] <- paste(substr(legend[nclr], 6, nchar(legend[nclr])), "-", signif(max(values), digits = round)) } if (is.null(polys)) {#no plotting, just return the colors return(list(colcode=colcode, legend = legend, fill = plotclr)) } else { if (is.null(map)) { PBSmapping::plotPolys(polys, col = colcode )#hoping, this is well defined by the class somehow ! } else { if (inherits(polys, 'Spatial')) polys = SpatialToPBS(polys)$xy #if (!is.null(textInPolys)) textInPolys = as.character(values[,textInPolys]) PlotPolysOnStaticMap(map, polys, col = colcode, textInPolys=textInPolys,...) } if (include.legend[[1]]) legend(location, legend = legend, fill = plotclr, bty = "n") } }, ex = function(){ if (0){ data("NYleukemia", envir = environment()) population <- NYleukemia$data$population cases <- NYleukemia$data$cases mapNY <- GetMap(center=c(lat=42.67456,lon=-76.00365), destfile = "NYstate.png", maptype = "mobile", zoom=9) ColorMap(100*cases/population, mapNY, NYleukemia$spatial.polygon, add = FALSE, alpha = 0.35, log = TRUE, location = "topleft") } #ColorMap(100*cases/population, map=NULL, NYleukemia$spatial.polygon) }) RgoogleMaps/R/plotmap.R0000644000176200001440000001421714521734323014502 0ustar liggesusers`plotmap` <-structure(function# easy to use wrapper function ###note the similarity in name to PBSmapping::plotMap ###This function is the workhorse of the package RgoogleMaps. It overlays plot on background image of map tile. ( lat, ##<< latitude values to be overlaid OR string to be geocoded OR named vector (lat,lon)! lon, ##<< longitude values to be overlaid map, ##<< optional map object zoom = NULL, ##<< Google maps zoom level API = c("google","OSM","bing", "google2")[1], ##<< choice of map tile API maptype = c("roadmap","mobile","satellite","terrain","hybrid","mapmaker-roadmap","mapmaker-hybrid")[2], ##<< defines the type of map to construct. There are several possible maptype values, including satellite, terrain, hybrid, and mobile. destfile, ##<< File to save the map image to data, ##<< data to look up variables in alpha = 1, ##<< opacity col = 1, ##<< plot color apiKey = NULL, ##<< optional API key (allows for higher rate of downloads for Google); mandatory for Bing maps verbose = 0, ##<< level of verbosity ... ##<< further arguments to be passed to \code{PlotOnStaticMap} ){ # argnames <- names(as.list(match.call(expand.dots = FALSE)[-1])) # arguments <- as.list(match.call()[-1]) # env <- parent.frame() # args <- as.list(match.call(expand.dots = TRUE)[-1]) # argsgiven <- names(args) #browser() # # if ("col" %in% argsgiven) # col <- eval(args$col) if (!missing(data)) { lon = data[, deparse(substitute(lon))] lat = data[, deparse(substitute(lat))] #for (v in 1:length(data)) assign(names(data)[v], data[[v]]) # browser() # lat=with(incidents,lat) # lon=with(incidents,lon) #col=with(incidents,col) if (is.character(col)) col=data[,col] # #attach(data, -1, warn.conflicts = FALSE) # bad idea! } if (missing(destfile)) destfile = tempfile() if (is.character(lat) & missing(map)){ if (API == "google") { map = GetMap(getGeoCode(lat), zoom = zoom,maptype=maptype,destfile=destfile) } else if (API == "OSM") { map = GetOsmMap(getGeoCode(lat), zoom = zoom,maptype=maptype,destfile=destfile) } else if (API == "bing") { map = GetBingMap(getGeoCode(lat), zoom = zoom, maptype=maptype, destfile=destfile,apiKey=apiKey) } #browser() PlotOnStaticMap(MyMap=map) invisible(map) return(map) } if ((is.numeric(lat) | is.list(lat)) & length(lat) == 2 ){ if (all(names(lat) %in% c("lat", "lon"))) { lon = as.numeric(lat["lon"]) lat = as.numeric(lat["lat"]) } else {#assume correct order print("NOTE: Assuming lat/lon order in lat vector!") lon = as.numeric(lat[2]) lat = as.numeric(lat[1]) } } if (is.numeric(lat) & is.numeric(lon) ){ bb=qbbox(lat,lon) if (missing(map)){ if (missing(zoom)){ zoom <- min(MaxZoom(bb$latR, bb$lonR, c(720,720))) if (API == "google") { map = GetMap.bbox(bb$lonR, bb$latR, maptype=maptype,destfile=destfile) } else if (API == "OSM") { #map = GetOsmMap(lonR= bb$lonR, latR =bb$latR, zoom = zoom,maptype=maptype,destfile=destfile) map = GetMapTiles(lonR=bb$lonR, latR=bb$latR,zoom=zoom, verbose=verbose) #browser() } else if (API == "google2") { #map = GetOsmMap(lonR= bb$lonR, latR =bb$latR, zoom = zoom,maptype=maptype,destfile=destfile) map = GetMapTiles(lonR=bb$lonR, latR=bb$latR,zoom=zoom, verbose=verbose, urlBase = "http://mt1.google.com/vt/lyrs=m", tileDir= "~/mapTiles/Google/") #browser() } else if (API == "bing") { bbM=do.call("cbind",bb); ll= bbM[1,] #lower left corner ur= bbM[2,] #upper right corner map = GetBingMap(mapArea=c(ll,ur), zoom = zoom, maptype=maptype, destfile=destfile,apiKey=apiKey) } } else { center=c(lat=mean(lat,na.rm=TRUE),lon=mean(lon,na.rm=TRUE)) if (API == "google") { map = GetMap(center=center, zoom = zoom,maptype=maptype,destfile=destfile) } else if (API == "OSM") { #map = GetOsmMap(center=center, zoom = zoom,maptype=maptype,destfile=destfile) map = GetMapTiles(lonR=bb$lonR, latR=bb$latR,zoom=zoom, verbose=verbose) #browser() } else if (API == "google2") { #map = GetOsmMap(lonR= bb$lonR, latR =bb$latR, zoom = zoom,maptype=maptype,destfile=destfile) map = GetMapTiles(lonR=bb$lonR, latR=bb$latR,zoom=zoom, verbose=verbose, urlBase = "http://mt1.google.com/vt/lyrs=m", tileDir= "~/mapTiles/Google/") #browser() } else if (API == "bing") { map = GetBingMap(center=center, zoom = zoom, maptype=maptype, destfile=destfile,apiKey=apiKey) } } } if (verbose>1) browser() plotclr = col if (alpha < 1 & !all(is.na(as.numeric(col)))) plotclr = AddAlpha(as.numeric(col), alpha = alpha, verbose = 0) if (inherits(map,"mapTiles")) { PlotOnMapTiles(map,lat=lat,lon=lon,col=plotclr, ...) } else {#if (class(map) == "staticMap") { PlotOnStaticMap(MyMap=map, lat=lat,lon=lon, col=plotclr, ...) } invisible(map) } }, ex = function(){ if (0){ #####################Google maps############################# mapBG1 = plotmap("Brandenburg Gate, Berlin", zoom = 15) #####################bing maps############################# #for bing maps you will need your own API key, #sign up at https://msdn.microsoft.com/en-us/library/ff428642.aspx apiKey = scan("bingAPIkey.txt",what="") mapBG2 = plotmap("Brandenburg Gate, Berlin", zoom = 15, API = "bing", apiKey=apiKey) latlon <- cbind.data.frame(lat = c(38.898648,38.889112, 38.880940), lon = c(-77.037692, -77.050273, -77.03660)); map3 = plotmap(lat = latlon$lat, lon = latlon$lon, API = "bing", apiKey=apiKey, col = "purple", pch="X",cex=1.5) #####################OSM maps############################# map4 = plotmap(lat = latlon$lat, lon = latlon$lon, API = "OSM", zoom=15, col = "purple", pch="X",cex=1.5) } }) RgoogleMaps/R/SpatialToPBS.R0000644000176200001440000000520014521726006015262 0ustar liggesusersSpatialToPBS <- structure(function#converts spatial objects as defined in package sp to simpler PBSmapping type dataframes ### The PlotPolysOnStaticMap() function currently does not take sp objects directly but instead needs ### PBSmapping type data.frames. This function converts sp objects into such. ### THANKS TO Fabio Priuli for a major bug fix w.r.t. holes in spatial polygons! ( xy, ##<< spatial object, such as SpatialPoints, SpatialPolygons, etc.. verbose=0 ##<< level of verbosity ) { fun = points if (inherits(xy, "Spatial")) { b = sp_bbox(xy) if (inherits(xy, "SpatialPoints")) { #xy = sp::coordinates(xy) if ("coords" %in% names(attributes(xy))){ xy = xy@coords } else { warning("no coordinate slot in xy!") } } else if (inherits(xy, "SpatialPolygons")) { res = matrix(ncol = 5, nrow = 0, dimnames = list(NULL, c("PID", "SID", "POS", "X", "Y"))) for (i in 1:length(xy@polygons)) { x = slot(xy@polygons[[i]], "Polygons") isHole = unlist(lapply(x, function(x) slot(x, "hole"))) x = lapply(x, function(x) slot(x, "coords")) for (j in 1:length(x)) { n = nrow(x[[j]]) order = 1:n if (isHole[j]) order = n:1 res = rbind(res, cbind(PID = rep(i, n), SID=rep(j, n), POS = order, x[[j]])) } } xy = res fun = lines attr(xy, "projection") <- "LL" } else if (inherits(xy, "SpatialLines")) { res = list() for (j in 1:length(xy)){ res[[j]] = xy@lines[[j]]@Lines[[1]]@coords } xy = res fun = lines attr(xy, "projection") <- "LL" } } else { b = rbind(range(xy[, 1], na.rm = TRUE), range(xy[, 2], na.rm = TRUE)) } return(list(xy = xy, bb = b, fun = fun)) ### list with elements xy = converted object, bb = bounding box, fun = plot function }, ex = function(){ if (0) { data("NYleukemia", envir = environment()) population <- NYleukemia$data$population cases <- NYleukemia$data$cases mapNY <- GetMap(center=c(lat=42.67456,lon=-76.00365), destfile = file.path(tempdir(),"NYstate.png"), maptype = "mobile", zoom=9) #mapNY=ReadMapTile("NYstate.png") clrStuff=ColorMap(100*cases/population, alpha = 0.35, log = TRUE) NYpolys = SpatialToPBS(NYleukemia$spatial.polygon) PlotPolysOnStaticMap(mapNY, NYpolys$xy, col = clrStuff$colcode, add = FALSE) legend("topleft", legend = clrStuff$legend, fill = clrStuff$fill, bg = rgb(0.1,0.1,0.1,0.3)) } }) RgoogleMaps/R/PlotPolysOnStaticMap.R0000644000176200001440000001137414521727655017111 0ustar liggesusers`PlotPolysOnStaticMap` <-structure(function#plots polygons on map ###This function plots/overlays polygons on a map. Typically, the polygons originate from a shapefile. ( MyMap, ##<< map image returned from e.g. \code{GetMap()} polys, ##<< polygons to overlay; these can be either of class \link[PBSmapping]{PolySet} from the package PBSmapping ### or of class \link[sp]{SpatialPolygons} from the package sp col, ##<< (optional) vector of colors, one for each polygon border = NULL, ##<< the color to draw the border. The default, NULL, means to use \link{par}("fg"). Use border = NA to omit borders, see \link{polygon} lwd = .25, ##<< line width, see \link{par} verbose = 0, ##<< level of verbosity add=TRUE, ##<< start a new plot or add to an existing textInPolys = NULL, ##<< text to be displayed inside polygons. ... ##<< further arguments passed to \code{PlotOnStaticMap} ){ ##seealso<< \link{PlotOnStaticMap} \link{mypolygon} ##details<< #print(str(polys)) stopifnot(class(polys)[1] == "SpatialPolygons" | class(polys)[1] == "PolySet" | class(polys)[1] == "data.frame" | class(polys)[1] == "matrix") if (class(polys)[1] == "SpatialPolygons") polys = SpatialToPBS(polys)$xy Rcoords <- LatLon2XY.centered(MyMap,lat= polys[,"Y"],lon= polys[,"X"]); polys.XY <- as.data.frame(polys); polys.XY[,"X"] <- Rcoords$newX; polys.XY[,"Y"] <- Rcoords$newY; if ( !( "PID" %in% colnames(polys.XY)) ) polys.XY[,"PID"] <- 1; if ( !( "SID" %in% colnames(polys.XY)) ) polys.XY[,"SID"] <- 1; polys.XY[,"PIDSID"] <- apply(polys.XY[,c("PID","SID")],1,paste,collapse=":") if (!add) tmp <- PlotOnStaticMap(MyMap, verbose=0, ...) if (verbose>1) browser() #browser() if (!is.null(textInPolys)) Centers = PBSmapping::calcCentroid(polys.XY) if (requireNamespace("PBSmapping", quietly = TRUE) & all(c("PID","X","Y","POS") %in% colnames(polys.XY)) ) { attr(polys.XY, "projection") <- NULL; usr <- par('usr') PBSmapping::addPolys(polys.XY,col=col, border = border, lwd = lwd, xlim =usr[1:2], ylim = usr[3:4], ...) if (!is.null(textInPolys)) { text(Centers[,"X"],Centers[,"Y"],textInPolys,cex=0.75, col = "blue") } } else { if (!missing(col)) { polys.XY[,"col"] <- col; PIDtable <- as.numeric(table(polys.XY[,"PID"])); SIDtable <- as.numeric(table(polys.XY[,"PIDSID"])) if (length(SIDtable)==length(col)) polys.XY[,"col"] <- rep(col, SIDtable); if (length(PIDtable)==length(col)) polys.XY[,"col"] <- rep(col, PIDtable); } if ( !( "col" %in% colnames(polys.XY)) ) polys.XY[,"col"] <- rgb(.1,.1,.1,.05); #polys.XY[polys.XY[,"PID"] == 292,"col"] <- rgb(1,0,0,.75) #tmp <- by(polys.XY[,c("X","Y","col")], polys.XY[,"PID"], mypolygon, lwd = lwd, border = border); #if (0){ pids = unique(polys.XY[,"PIDSID"]) for (i in pids){ jj = polys.XY[,"PIDSID"] == i; xx= polys.XY[jj,]; if ( ( "POS" %in% colnames(xx)) ) xx <- xx[order(xx[,"POS"]),] polygon( xx[, c("X","Y")], col=xx[,"col"]); if (!is.null(textInPolys)) { text(Centers[i,"X"],Centers[i,"Y"],textInPolys[i], col = "blue") } #readLines(n=1) } #} } }, ex = function(){ if (0){ #require(PBSmapping); shpFile <- paste(system.file(package = "RgoogleMaps"), "/shapes/bg11_d00.shp", sep = "") #shpFile <- system.file('bg11_d00.shp', package = "RgoogleMaps"); shp=PBSmapping::importShapefile(shpFile,projection="LL"); bb <- qbbox(lat = shp[,"Y"], lon = shp[,"X"]); MyMap <- GetMap.bbox(bb$lonR, bb$latR, destfile = "DC.png"); PlotPolysOnStaticMap(MyMap, shp, lwd=.5, col = rgb(0.25,0.25,0.25,0.025), add = F); #Try an open street map: mapOSM <- GetMap.bbox(bb$lonR, bb$latR, destfile = "DC.png", type="osm"); PlotPolysOnStaticMap(mapOSM, shp, lwd=.5, col = rgb(0.75,0.25,0.25,0.15), add = F); #North Carolina SIDS data set: shpFile <- system.file("shapes/sids.shp", package="rgooglemaps"); shp=PBSmapping::importShapefile(shpFile,projection="LL"); bb <- qbbox(lat = shp[,"Y"], lon = shp[,"X"]); MyMap <- GetMap.bbox(bb$lonR, bb$latR, destfile = "SIDS.png"); #compute regularized SID rate sid <- 100*attr(shp, "PolyData")$SID74/(attr(shp, "PolyData")$BIR74+500) b <- as.integer(cut(sid, quantile(sid, seq(0,1,length=8)) )); b[is.na(b)] <- 1; opal <- col2rgb(grey.colors(7), alpha=TRUE)/255; opal["alpha",] <- 0.2; shp[,"col"] <- rgb(0.1,0.1,0.1,0.2); for (i in 1:length(b)) shp[shp[,"PID"] == i,"col"] <- rgb(opal[1,b[i]],opal[2,b[i]],opal[3,b[i]],opal[4,b[i]]); PlotPolysOnStaticMap(MyMap, shp, lwd=.5, col = shp[,"col"], add = F); #or choose an aspect ratio that corresponds better to North Carolina's elongated shape: MyMap <- GetMap.bbox(bb$lonR, bb$latR, destfile = "SIDS.png", size = c(640, 320), zoom = 7); PlotPolysOnStaticMap(MyMap, shp, lwd=.5, col = shp[,"col"], add = F); } }) RgoogleMaps/R/degreeAxis.R0000644000176200001440000000403712710225423015077 0ustar liggesusersdegreeAxis = structure(function#axis with degrees ### add an axis with degree labels ( side, ##<< integer; see \link{axis} at=NULL, ##<< numeric; if missing, \link{axTicks} is called for nice values; see \link{axis} labels, ##<< character; if omitted labels are constructed with degree symbols, ending in N/S/E/W; in case of negative degrees, sign is reversed and S or W is added; see \link{axis} MyMap, ##<< optional map object to be passed ... ##<< optional arguments to \link{axis} ){ degreeLabelsNS = function(x) { pos = sign(x) + 2 dir = c("*S", "", "*N") paste(abs(x), "*degree", dir[pos]) } degreeLabelsEW = function(x) { x <- ifelse(x > 180, x - 360, x) pos = sign(x) + 2 if (any(x == -180)) pos[x == -180] = 2 if (any(x == 180)) pos[x == 180] = 2 dir = c("*W", "", "*E") paste(abs(x), "*degree", dir[pos]) } USR = par('usr') #browser() if (is.null(at) | missing(at)) { at = axTicks(side) #if (!missing(MyMap)) atLon = pretty(XY2LatLon(MyMap, X=USR[1:2],Y=USR[3])[,"lon"]) else atLon=at; #if (!missing(MyMap)) atLat = pretty(XY2LatLon(MyMap, X=USR[1],Y=USR[3:4])[,"lat"]) else atLat=at; } #browser(); if (missing(labels)) { labels = FALSE if (side == 1 || side == 3) { if (!missing(MyMap)) atLon = XY2LatLon(MyMap, X=at,Y=USR[3])[,"lon"] else atLon=at; labels = parse(text = degreeLabelsEW(as.numeric(formatC(atLon, digits=5)))) } else if (side == 2 || side == 4) { if (!missing(MyMap)) atLat = XY2LatLon(MyMap, X=USR[1],Y=at)[,"lat"] else atLat=at; labels = parse(text = degreeLabelsNS(as.numeric(formatC(atLat, digits=5)))) } } #browser() ##note<< decimal degrees are used if variation is small, instead of minutes and seconds axis(side, at = at, labels = labels, ...) ### axis is plotted on current graph }, ex = function(){ xy = cbind(x = 2 * runif(100) - 1, y = 2 * runif(100) - 1) plot(xy,xlim=c(-1,1),ylim=c(-1,1)) degreeAxis(1) degreeAxis(2, at = c(-1,-0.5,0,0.5,1)) }) RgoogleMaps/R/getGeoCode.R0000644000176200001440000000772313556645376015057 0ustar liggesusersgetGeoCode <- structure(function#geocoding utility ### Geocode your data using, R, JSON and OSM or Google Maps' Geocoding APIs ( gcStr, ##<< adddress to geocode API = c("osm", "google")[1], ##<< which API to use. see https://nominatim.org/release-docs/develop/api/Search/ and http://allthingsr.blogspot.de/2012/01/geocode-your-data-using-r-json-and.html JSON = FALSE, ##<< use the JSON protocol. If FALSE, we do not have to load additional libraries verbose=0 ##<< level of verbosity ){ #library("RJSONIO") #Load Library gcStr <- enc2utf8(gsub(' ','%20',gcStr)) #Encode URL Parameters if (API == "google"){ #baseURL= paste0('http://maps.google.com/maps/api/geocode/",ifelse(JSON, "json","xml"),"?sensor=false&address=') if (JSON){ #Open Connection # connectStr <- paste('http://maps.google.com/maps/api/geocode/json?sensor=false&address=',gcStr, sep="") # if (verbose) cat("fetching ", connectStr, "\n") # con <- url(connectStr) # data.json <- fromJSON(paste(readLines(con), collapse="")) # close(con) # #Flatten the received JSON # data.json <- unlist(data.json) # lat <- data.json["results.geometry.location.lat"] # lng <- data.json["results.geometry.location.lng"] connectStr <- paste('http://maps.google.com/maps/api/geocode/json?sensor=false&address=',gcStr, sep="") if (verbose) cat("fetching ", connectStr, "\n") con <- url(connectStr) data.json <- readLines(con) close(con) iLoc = grep("\"location\"", data.json,fixed=TRUE) iLat = grep("\"lat\"", data.json,fixed=TRUE); iLat = min(iLat[iLat>iLoc]) lat = as.numeric(gsub(",", "",gsub("\"lat\" : ", "", data.json[iLat]))) iLng = grep("\"lng\"", data.json,fixed=TRUE); iLng = min(iLng[iLng>iLoc]) lng = as.numeric(gsub(",", "",gsub("\"lng\" :", "", data.json[iLng]))) } else { #Open Connection connectStr <- paste('http://maps.google.com/maps/api/geocode/xml?sensor=false&address=',gcStr, sep="") if (verbose) cat("fetching ", connectStr, "\n") con <- url(connectStr) data.xml <- readLines(con) close(con) #browser() iLoc = grep("", data.xml,fixed=TRUE) iLat = grep("", data.xml,fixed=TRUE); iLat = min(iLat[iLat>iLoc]) lat = as.numeric(gsub("", "",gsub("", "", data.xml[iLat]))) iLng = grep("", data.xml,fixed=TRUE); iLng = min(iLng[iLng>iLoc]) lng = as.numeric(gsub("", "",gsub("", "", data.xml[iLng]))) } } else if (API == "osm") { #baseURL= paste0("https://nominatim.openstreetmap.org/search?format=",ifelse(JSON, "json","xml"),"&polygon=0&addressdetails=0&q=") # https://nominatim.openstreetmap.org/search?format=xml&polygon=0&addressdetails=0&q=135+pilkington+avenue,+birmingham& #https://nominatim.openstreetmap.org/search?q=17+Strada+Pictor+Alexandru+Romano%2C+Bukarest&format=xml if (JSON) { } else { connectStr <- paste0("https://nominatim.openstreetmap.org/search?q=",gcStr,"&format=xml&limit=1") if (verbose) cat("fetching ", connectStr, "\n") con <- url(connectStr) data.xml <- readLines(con, warn=FALSE) close(con) #browser() tmp=unlist(strsplit( data.xml," ")) iLat = grep("lat=", tmp,fixed=TRUE) lat = as.numeric(gsub("lat='|'", "",tmp[iLat])) iLng = grep("lon=", tmp,fixed=TRUE) lng = as.numeric(gsub("lon='|'", "",tmp[iLng])) } } gcodes <- as.numeric(c(lat, lng)) names(gcodes) <- c("lat", "lon") return (gcodes) ### returns lat/lon for address }, ex = function(){ if (0){ getGeoCode("1600 Amphitheatre Parkway, Mountain View, CA") getGeoCode("Brooklyn") #You can run this on the entire column of a data frame or a data table: DF = cbind.data.frame(address=c("Berlin,Germany", "Princeton,NJ", "cadillac+mountain+acadia+national+park"), lat = NA, lon = NA) DF <- with(DF, data.frame(address, t(sapply(DF$address, getGeoCode)))) } }) RgoogleMaps/R/rgooglemaps-internal.R0000644000176200001440000000074014521741717017160 0ustar liggesusers.onAttach <- function(libname, pkgname) { packageStartupMessage("\nThank you for using RgoogleMaps!") packageStartupMessage("\nTo acknowledge our work, please cite the package: \n") packageStartupMessage(" Markus Loecher and Karl Ropkins (2015). RgoogleMaps and loa: Unleashing R Graphics Power on Map Tiles. Journal of Statistical Software 63(4), 1-18.") #packageStartupMessage(" R package version 5.2.3. https://CRAN.R-project.org/package=stargazer \n") }RgoogleMaps/MD50000644000176200001440000001051114522154762013007 0ustar liggesusersa48c683dc7612753b8176821dd6ebfa4 *DESCRIPTION 1640a3da3826e393c1cea5e9dc770f93 *NAMESPACE 3a9889baf4e575fd6d2edba072db7d46 *NEWS 89631468828312caf7657e01c20b4afa *R/AddAlpha.R 42ba5f758927c3744bbb2aa4deae3e06 *R/ColorMap.R 51498fb383c624b704212ebff6e7c9e4 *R/GetBingMap.R cebd9c9ec9bf7e78790fb134e7f791cd *R/GetMap.R ef3397e4d77ce9144669877a66aea9a3 *R/GetMap.bbox.R 084ac342e8bcdbf51f82fbd2c66874af *R/GetMapTiles.R 99926cb65f82161b406b25831440cd07 *R/GetOsmMap.R 0a0eccaae1906d1b036be61b13bc1f2d *R/IdentifyPoints.R ceeeeddad62483b612395ab6efae312a *R/LatLon2XY.R ee38e82f0b4537bc76bab99bd845b2f3 *R/LatLon2XY.centered.R eaf7d73586bdf8d41c20360e93820879 *R/MapBackground.R ca736be33c43b543d1a0114406426f17 *R/MaxZoom.R b4c1736c35021cc841d9ac3f72a23915 *R/NumTiles.R 7526fa19d48c51eb8b6f6f1e3061ceb2 *R/PlotArrowsOnStaticMap.R 02433dedcdc78ee9e5828a52856f1183 *R/PlotOnMapTiles.R 968f697aa7f3d2c9f68ba584ca187018 *R/PlotOnStaticMap.R 95eba8d2855278f226f246c0b4fd6741 *R/PlotPolysOnStaticMap.R dd21f4525460d90b8ebb32e7da3be5ba *R/RGB2GRAY.R 516a44b4573aa55278458c470aacad50 *R/ReadMapTile.R b32a7cd63c2487be7c4d3b4eb7336f9d *R/SpatialToPBS.R cb1db91b47ccc84d934f882e3f78e246 *R/TextOnStaticMap.R c9266b92fbee256ffaf5ded75eab9d5f *R/Tile2R.R 559ff54dedb229d3acb463aad59a62db *R/XY2LatLon.R 3533c87c584f5084a6a53a0fec2c60bf *R/degreeAxis.R dd81e2274a3fae13eba68bf8ee131c59 *R/genStaticMap.R 41405ba01ea57c24a61e8964d07992ba *R/getGeoCode.R ad9b2ce342ef9218a4ebb26923b65f4c *R/mypolygon.R c4b2989f2f2cc753cf7d7e6fc0b196d3 *R/plotOSM.R 4eaf363ca92e267b779b0bcb323fd085 *R/plotmap.R f9bbc4277226d7c77cc69e96f002fc36 *R/qbbox.R 525cd451a06ae0738c63c6378f193d15 *R/rgooglemaps-internal.R caacea8914c24c50057324d2159f32a8 *R/sp_bbox.R d1e1139b42060b20198eb66688f533f6 *R/updateusr.R 6712bd356662fe0c26bb4bd4ea6b8973 *data/NYleukemia.rda 5f2362f39e9822f14dc3a7752ec5d44a *data/columbus.rda 0de6431245ce91bb131c07fa52d7e943 *data/incidents.rda 6db631d07c92ef376f36709de51a0544 *data/pennLC.rda f333f05f65259fbd4df542fdc8112a61 *inst/CITATION 33327f2934f801ca2410bd38249cba43 *inst/shapes/bg11_d00.dbf 916ea4e6590eb10198eb2971c70c3cdf *inst/shapes/bg11_d00.shp 07ba4f7c7984bd3d9254566f931672b3 *inst/shapes/bg11_d00.shx 739845e11f7e69826b04ca22a7d45568 *inst/shapes/sids.dbf 32ef63f29fdb9eca9733dc5feb3a707d *inst/shapes/sids.shp 2085b2c4715f1f58c64bc410166371fd *inst/shapes/sids.shx 8cbfa63fc98947dabdd53e2444824b48 *man/AddAlpha.Rd a01bc610ee6aed13f9d07506a1a11293 *man/ColorMap.Rd 1b950456c9df866ac14c488701ebfb61 *man/GetBingMap.Rd bb7afe11e05bd2d16235f0968d02a36d *man/GetMap.Rd dc17886cdf02c6edf6a904d8805017bb *man/GetMap.bbox.Rd 41f5ff35af3027a6744bd6333c553bfb *man/GetMapTiles.Rd d04617a805cf2d05c747534c07043715 *man/GetOsmMap.Rd 39605e8b3336414ea60760169b691750 *man/IdentifyPoints.Rd fe87004611a0caf7c92eb84bb25b7e0e *man/LatLon2XY.Rd 1c9d772d9cfd1d651f2e4b26b42b1594 *man/LatLon2XY.centered.Rd a78a57674016fefb8cb33c7e98e283ae *man/MapBackground.Rd 3bab789a93c5a6864ca88158edeec82d *man/MaxZoom.Rd a861dc0520df7e14d6cf691e53cf6e15 *man/NYleukemia.Rd a2264194111dca64296cf699c2ab769f *man/NumTiles.Rd 57959c211a8e8e6fbe747e07cd34b1b6 *man/PlotArrowsOnStaticMap.Rd f7b5bf8dc48d5679ed810569ced5b9dd *man/PlotOnMapTiles.Rd 49f3fd264073830a6dc0afefc1d3417f *man/PlotOnStaticMap.Rd a3a05ffcfd57c3f299f6f0493c35fe2a *man/PlotPolysOnStaticMap.Rd 81ca16589ea7c227d37583f4db7d3c99 *man/RGB2GRAY.Rd 8df83e01a622f91e71e869e4d584d473 *man/ReadMapTile.Rd d86b245da4b6c30e215d8fef451b42bd *man/SpatialToPBS.Rd 5165a14dc673a382419cada536284374 *man/TextOnStaticMap.Rd d386057d08fcabedee1e25ae6d3c0e38 *man/Tile2R.Rd 8fa7fe23feb386e5f29b5ae65cbb03b5 *man/XY2LatLon.Rd ccd887b6f33886ab2ca5ed909a300105 *man/columbus.Rd f1640e3a9f568b52028d38acb94b0dc2 *man/degreeAxis.Rd 320c289bfa3a153d085abb718f884e22 *man/genStaticMap.Rd 5fbb592a0f8ef35d670abc349093080b *man/geosphere_mercator.Rd a8dddf80e8c200e283db4e8fe3577f8c *man/getGeoCode.Rd a566ebf39da78a8bfd9403e0f8eee0e9 *man/incidents.Rd 301bc90dea71d7bb2eda97fe2f14d486 *man/mypolygon.Rd 5bf8f72ef25db7775fdb81ea940e03ca *man/osmtile_bbox.Rd baa8fdefb48757ca4dd46668c37a587c *man/pennLC.Rd d0f6db5445e48b9d1f85957695d22b7a *man/plotOSM.Rd 31851d152c6526e9950fdb4ba85a0389 *man/plotOSMtile.Rd 257e1b40f14b17c0a5dadf0785cfc49d *man/plotmap.Rd fc281fe3ff8b62b95a58824e269ce255 *man/qbbox.Rd df836b14fbe0476f351d854c0e1adfce *man/sp_bbox.Rd 00c07c942af684530bf133682d3ce01d *man/updateusr.Rd RgoogleMaps/inst/0000755000176200001440000000000014522135346013453 5ustar liggesusersRgoogleMaps/inst/CITATION0000644000176200001440000000145614521741717014622 0ustar liggesuserscitHeader("To cite package 'RgoogleMaps' in publications use:") year <- sub("-.*", "", meta$Date) version <- meta$Version note <- sprintf("R package version %s", version) bibentry(bibtype = "Article", title = "{RgoogleMaps} and {loa}: Unleashing {R} Graphics Power on Map Tiles", author = c("Markus Loecher", "Karl Ropkins"), journal = "Journal of Statistical Software", year = "2015", volume = "63", number = "4", pages = "1--18", url = "https://doi.org/10.18637/jss.v063.i04", textVersion = paste("Markus Loecher and Karl Ropkins (2015).", "RgoogleMaps and loa: Unleashing R Graphics Power on Map Tiles.", "Journal of Statistical Software 63(4), 1-18.", "URL https://doi.org/10.18637/jss.v063.i04") ) RgoogleMaps/inst/shapes/0000755000176200001440000000000014517261020014727 5ustar liggesusersRgoogleMaps/inst/shapes/bg11_d00.shp0000644000176200001440000026265412710215416016660 0ustar liggesusers'  qGSHLPeC@W 3:S_C@pڍZCS_5}C@.rOBS_C@ .rOBS?~C@ݒBSѮBO~C@ݒBSg?~C@$BS_5~C@7ǹMBS_5}C@)ʥBSL}C@ڍZCSg܆G~C@ EBS_C@)x RBSގpZ~C@.rOBS Y~C@.rOBS?~C@XwIQBS>}C@K(bAS Y~C@.rOBS?~C@.rOBS Y~C@K(bAS}C@G +ASq}C@%AS>}C@=xASt}C@wIQBS ҌE}C@.rOBS?~C@mUBSSg|C@.rOBS?~C@.rOBS?~C@wIQBS ҌE}C@ۦx\TBSa|C@wIQBSSg|C@bBS@|C@) BS7',|C@>&RBS^2}C@mUBSݰm}C@QH2BSU+~}C@ABBS}C@7ǹMBS_5}C@$BS_5~C@ݒBSg?~C@ݒBSѮBO~C@.rOBS?~C@Idf(DSHmzC@bBSg܆G~C@ 7ǹMBS_5}C@ABBS}C@QH2BSU+~}C@mUBSݰm}C@>&RBS^2}C@) BS7',|C@bBS@|C@feBSSg|C@ZլBSc AJ|C@SBSPC|C@>9 CSԕ{C@bCSHm~{C@(BS4 {C@mUBS-`zC@RC CSHmzC@09CSV {C@'MyCS,`{C@ gCSszC@YİØCS W{C@`#ICSUMu{C@|,GCSdX{C@XCS3.|C@&pnCS/|C@*kgCS6Ko|C@mqdCSǸ|C@Y32]CSS c }C@hCSĬC}C@Idf(DSĬC}C@'MyCS5{~C@ڍZCSg܆G~C@)ʥBSL}C@7ǹMBS_5}C@`G +ASp|%}C@;(AS}C@ G +ASq}C@K(bAS}C@;(ASA})}C@5-}C@G +ASq}C@(AS2}C@:AS^2}C@kծASG)}C@xBS(}C@%AS>}C@Hۦx\TBSa|C@%AS ҌE}C@%AS>}C@xBS(}C@ۦx\TBSa|C@wIQBS ҌE}C@=xASt}C@%AS>}C@h?{FDS6Ko|C@Y32]CSĬC}C@ h?{FDS|C@?vDSCs!}C@Idf(DSĬC}C@hCSĬC}C@Y32]CSS c }C@mqdCSǸ|C@*kgCS6Ko|C@:dwCSB˺|C@ RςCSs-Z|C@!oCS<|C@i:DS^G|C@L:DS~!<|C@h?{FDS|C@ XoAS1%|C@5-9 CS4 {C@T !BS@|C@T !BSFj|C@T !BSg{C@M1AGBSdC{C@)x RBS[='{C@UBSN],{C@(BS4 {C@bCSHm~{C@>9 CSԕ{C@SBSPC|C@ZլBSc AJ|C@feBSSg|C@bBS@|C@wIQBSSg|C@T !BSFj|C@H\?S{= {C@ek?S{= {C@>?SԌzC@?S|zC@)%?S&pnzC@x>@Sg67zC@*8 @S>DSszC@ gCSszC@,u6CSMuxC@)x RBSDzC@UBSvyC@UBS NyC@>UWBS-xC@T=BSMuxC@!^BSpqxC@;BS*xC@u6CSxxC@/CSۧ1yC@!^BS8*yC@ CS_yC@$BSu&zC@vk BSȓkzC@$BStA}˜zC@ EBSzC@KBS;TzC@QH2BSDzC@^ zBSC9zC@L…>tAyC@0' ES5!yC@uES5!yC@QESQHyC@5;NESu&zC@{DS70zC@w-!DStA}˜zC@2`x>@SyzC@Ur|Q?SԌzC@ >?SԌzC@Ur|Q?SgEzC@80Qd?S|\*zC@g?SdF zC@;y?SyzC@x>@Sg67zC@)%?S&pnzC@?S|zC@>?SԌzC@3X_BFASL2rzC@ yASvۅzC@ASvۅzC@AS.=zC@ yAS.=zC@JyASzC@_BFASL2rzC@_BFASO}:zC@_BFASMzC@ASvۅzC@4XASyC@#&@SvۅzC@R%@SvۅzC@#&@S ^/yC@ yASyC@JyASzC@ yAS.=zC@AS.=zC@ASvۅzC@R%@SvۅzC@5HR%@SyC@ ~b@SvۅzC@ ~b@SvۅzC@ ~b@S.zC@Pi@SyC@#&@S ^/yC@R%@SvۅzC@ ~b@SvۅzC@6XPi@SyC@ȑ@SvۅzC@Xl@SvۅzC@Xl@SfL2rzC@Xl@S|\*zC@ȑ@SvyC@Pi@SyC@ ~b@S.zC@ ~b@SvۅzC@Xl@SvۅzC@7@;uASg67zC@_BFASMzC@_BFASMzC@_BFASO}:zC@yVҊASg67zC@;uAS|zC@_BFASMzC@8HAS70zC@yVҊAS|zC@;uAS|zC@yVҊASg67zC@AS70zC@-AS:TzC@AS|zC@;uAS|zC@9@b+:JFSZ_$yC@R'ES&pnzC@R'ES70zC@R'ESZ_$yC@b+:JFSX`yC@`"ES&pnzC@R'ES70zC@:Xl@S8*yC@i8en?S&pnzC@Xl@S|\*zC@r9>@S&NzC@(%@S&pnzC@*8 @S@Sg67zC@;y?SyzC@Q ?SgaO;yC@&?S ^/yC@Eh?SKvlyC@i8en?SYyC@[u@SBOyC@x>@S?,yC@ ˟o @S8*yC@ӅX@SQHyC@ f@S-yC@~@S ^/yC@ȑ@SvyC@Xl@S|\*zC@;xUBSۧ1yC@cAS:TzC@ .5#BSyC@T !BS˜.yC@O@ASyC@!AShyC@cASb yC@?4ASۧ1yC@q BShHKyC@`BShHKyC@UBS NyC@UBSvyC@\$BS:TzC@.5#BSyC@<H\$BS1%yC@ AS:TzC@-AS:TzC@AS70zC@ AS1%yC@.5#BSyC@\$BS:TzC@-AS:TzC@=x&?SYyC@ϭ ?SgEzC@ ;y?SyzC@g?SdF zC@80Qd?S|\*zC@Ur|Q?SgEzC@ϭ ?SyC@0E?SsyC@.KR?SvyC@i8en?SYyC@Eh?SKvlyC@&?S ^/yC@Q ?SgaO;yC@;y?SyzC@>HyVҊASeyC@^DASO}:zC@_BFASO}:zC@_BFASL2rzC@^DASeyC@&zASeyC@yVҊASg67zC@_BFASO}:zC@?HAS/yC@&zASg67zC@yVҊASg67zC@&zASeyC@%AS/yC@ AS1%yC@AS70zC@yVҊASg67zC@@HR'ESQHyC@QES70zC@5;NESu&zC@QESQHyC@R'ES NyC@R'ESZ_$yC@R'ES70zC@5;NESu&zC@A`؀qDSyC@\CSu&zC@ ؀qDSzC@؀qDSu&zC@"1DSu&zC@]-DSJzC@]-DSYyC@\CSYyC@\CS˜.yC@PoFDSyC@؀qDSzC@BH3DSyC@PoFDSzC@3DSGyC@;MfDSeyC@|DSYyC@؀qDSzC@PoFDSyC@3DSGyC@C@_BFASeyC@ yASzC@JyASzC@ yASyC@^DASeyC@_BFASL2rzC@JyASzC@Dp.KR?SxC@rkFZ>SsyC@ .KR?SvyC@0E?SsyC@ϭ ?SyC@rkFZ>SNzyC@Q [>SxC@LL?Sd .xC@0E?Sd .xC@sDK?SiUMyC@P?S"[='yC@.KR?ShHKyC@.KR?SvyC@EH.5#BSyC@O@ASyC@ AS1%yC@%AS/yC@O@ASyC@T !BS˜.yC@.5#BSyC@ AS1%yC@F5"ASk&xC@b@SvyC@#&@S ^/yC@Pi@SyC@ȑ@SvyC@b@S8*yC@e@S"AxC@YO@SHmxC@g@Sk&xC@ASz1yC@5"ASz1yC@h@Se\yC@UASZ![yC@ yAS(ryC@ yASyC@#&@S ^/yC@Gȑ@Se7ixC@$?SvyC@b@S8*yC@ȑ@SvyC@~@S ^/yC@ f@S-yC@ӅX@SQHyC@ ˟o @S8*yC@x>@S?,yC@4D?Sͮ{+yC@$?S[~lxC@0?Se7ixC@/:@Sk&xC@[@SwxC@D2z@S0 yC@b@S8*yC@HHi8en?S"[='yC@P?SvyC@i8en?SYyC@.KR?SvyC@.KR?ShHKyC@P?S"[='yC@MM7?SKyC@i8en?SYyC@I@^DASKToyC@ yASyC@ yASyC@ yAS(ryC@rfBASKToyC@^DASeyC@ yASyC@J[u@Sͮ{+yC@MM7?SYyC@ [u@SBOyC@i8en?SYyC@MM7?SKyC@we ?S(ryC@T?S(ryC@ ʼ?S(yyC@h?S(yyC@[ ?S0 yC@)?S`iyC@+?Sz1yC@4D?Sͮ{+yC@x>@S?,yC@[u@SBOyC@KH%AShyC@¾DASeyC@&zASeyC@¾DAShyC@!AShyC@O@ASyC@%AS/yC@&zASeyC@LP&zAS/iQyC@rfBASeyC@^DASeyC@rfBASKToyC@rfBAShUyC@¾DAS/iQyC@¾DAShyC@&zASeyC@^DASeyC@MP F%uFSQHyC@R'ESX`yC@R'ESZ_$yC@R'ES NyC@ cFSQHyC@ F%uFS^yC@CiqFSvluyC@b+:JFSX`yC@R'ESZ_$yC@N`h?SiUMyC@sDK?SKyC@ P?S"[='yC@sDK?SiUMyC@[ ?S0 yC@h?S(yyC@ ʼ?S(yyC@T?S(ryC@we ?S(ryC@MM7?SKyC@P?S"[='yC@OPۊeDS>>tAyC@G 6DSGyC@PoFDSyC@G 6DS>>tAyC@{9yDS NyC@DDS NyC@ۊeDS>>tAyC@3DSGyC@PoFDSyC@P"l>9GS)wC@y)FSvluyC@ cFSQHyC@C6FSۧ1yC@C6FS鲘xC@_vOFS:xC@C6FS"^FxC@C6FSg?RxC@|?5FS\4xC@|a2U0FSMwC@2ı.FSwC@y)FS`wC@OnFS-ӾwC@ׁsFS-ӾwC@lV}FS)wC@lxz,GS]ʾwC@"l>9GSczOLxC@lFS2,xC@ FSM#yC@CiqFSvluyC@ F%uFS^yC@ cFSQHyC@Q`rfBASiUMyC@h@S(ryC@ yAS(ryC@UASZ![yC@h@Se\yC@5"ASz1yC@oASiUMyC@rfBASiUMyC@rfBAShUyC@rfBASKToyC@ yAS(ryC@RP!ASb yC@rfBAShyC@¾DAShyC@¾DAS/iQyC@rfBAShUyC@rfBASiUMyC@cASb yC@!AShyC@¾DAShyC@SxG 6DSY,ExC@u6CS!<8byC@ .m8,DShyC@G 6DS>>tAyC@ѭCS>>tAyC@QdVCSo l`yC@}.PRCS!<8byC@u6CSxxC@}.PRCSY,ExC@.CS XxC@XCSn/ixC@mrDSxC@i>"DS=E~xC@.m8,DShyC@TP cFSCԷxC@R'ES NyC@R'ES NyC@V-ESiQxC@V-ESCԷxC@H.ESCԷxC@C6FSۧ1yC@ cFSQHyC@R'ES NyC@UH.ESy xC@0' ES NyC@ QESQHyC@uES5!yC@0' ES>xyC@uES>xyC@CiqES3.xC@h"lxzES@ŊxC@R!ESy xC@ESn/ixC@H.ESCԷxC@V-ESCԷxC@V-ESiQxC@R'ES NyC@QESQHyC@V`0' ESiUMyC@.m8,DS NyC@ G 6DS>>tAyC@.m8,DShyC@,zDSiUMyC@/$ES0 yC@0' ES5!yC@ۊeDS>>tAyC@DDS NyC@{9yDS NyC@G 6DS>>tAyC@W@>UWBS-xC@`BS NyC@`BShHKyC@?s֧BS-xC@>UWBS-xC@UBS NyC@`BShHKyC@XX?s֧BS-xC@WAShHKyC@cASb yC@WASFxC@:ASۅ:xC@?s֧BS-xC@`BShHKyC@q BShHKyC@?4ASۧ1yC@cASb yC@YXe@SWyxC@[@S8*yC@b@S8*yC@D2z@S0 yC@[@SwxC@c@SWyxC@w@SԗxC@D2z@S:w^xC@e@S"AxC@b@S8*yC@ZuESǵbxC@XCShyC@0' ES5!yC@/$ES0 yC@,zDSiUMyC@.m8,DShyC@i>"DS=E~xC@mrDSxC@XCSn/ixC@ YKDSǵbxC@s߉YDS@mxC@zmDS{xC@rhDS{xC@0' ES>xyC@uES5!yC@0' ES5!yC@[hCY>S@TxC@VX=SNzyC@ Q [>SxC@rkFZ>SNzyC@VX=S@TxC@; >Sj0 xC@Yk(>SǷw xC@?2:>S;Ug$xC@Z>SpGRxC@-Ӿ>SnxC@CY>SzܷxC@Q [>SxC@\`4D?SM^ixC@UC?S0 yC@ [ ?S0 yC@sDK?SiUMyC@0E?Sd .xC@UC?SM^ixC@$?S[~lxC@4D?Sͮ{+yC@+?Sz1yC@)?S`iyC@[ ?S0 yC@]XoASsѓxC@YO@Sz1yC@5"ASz1yC@ASz1yC@g@Sk&xC@YO@SHmxC@ٗl<@SxC@QiASsѓxC@oASiUMyC@5"ASz1yC@^XcASFxC@=ASiUMyC@rfBASiUMyC@=AS?tA}xC@-IIASCԷxC@-{؜AS"^FxC@-{؜ASFxC@WASFxC@cASb yC@rfBASiUMyC@_`-IIASsѓxC@QiASiUMyC@ oASiUMyC@QiASsѓxC@Ά3ASsѓxC@Z8AS*xC@=AS*xC@-IIASCԷxC@=AS?tA}xC@rfBASiUMyC@oASiUMyC@`h"lxzESxyC@rhDS{xC@"uDSsxC@SVDS 8xC@ES3.xC@k DS;?lwC@rhDSxyC@0' ES>xyC@rhDS{xC@ax_vOFS\4xC@ESۧ1yC@ H.ESCԷxC@ESn/ixC@Q0c ES$pxC@eES\4xC@DlES\4xC@|?5FS\4xC@C6FSg?RxC@C6FS"^FxC@_vOFS:xC@C6FS鲘xC@C6FSۧ1yC@H.ESCԷxC@bPc@Se7ixC@0?SwxC@[@SwxC@/:@Sk&xC@0?Se7ixC@+2@Se7ixC@!hUK@Se7ixC@c@SWyxC@[@SwxC@c5-Sd .xC@ LL?Sd .xC@Q [>SxC@CY>SzܷxC@-Ӿ>SnxC@ʨ2>SX6sHxC@y>SwC@>S<3pwC@ ?S)wC@;Ug$?SuxwC@=)?SX6sHxC@LL?Sd .xC@fUZCSiwC@>UWBSxxC@>UWBS-xC@>UWBS$xC@0h!BS\5wC@ CS<3pwC@u6CSiwC@'>CSulwC@,BCSwC@ḌCS;?lwC@`L8CS!wC@UZCS xC@}.PRCSY,ExC@u6CSxxC@;BS*xC@!^BSpqxC@T=BSMuxC@>UWBS-xC@ghWAS[~lxC@=ASCԷxC@ -IIASCԷxC@=AS*xC@=AS_&xC@&LAS_&xC@XAS,oxC@-{؜AS[~lxC@WASFxC@-{؜ASFxC@-{؜AS"^FxC@-IIASCԷxC@hh=ASiwC@'|AS*xC@ =AS*xC@Z8AS*xC@Ά3ASsѓxC@QiASsѓxC@ASW;xC@'|AS'xC@Z8ASiwC@5-UWBSJ wC@5ASۅ:xC@ :ASۅ:xC@5AS !xC@5ASJ wC@`BS!wC@>UWBSiwC@>UWBS$xC@>UWBS-xC@?s֧BS-xC@:ASۅ:xC@nH:AS !xC@릔ASۅ:xC@WASFxC@-{؜AS[~lxC@릔AS;Ug$xC@5AS !xC@:ASۅ:xC@WASFxC@o@-Ӿ>S.u׃wC@Z>SnxC@Z>SpGRxC@Z>S.u׃wC@ʨ2>SX6sHxC@-Ӿ>SnxC@Z>SpGRxC@plV}FSYUwC@ŏ1wES$pxC@ESn/ixC@R!ESy xC@h"lxzES@ŊxC@ŏ1wES\*wC@ $(~ESMwC@( ESfKVEwC@lESwC@ESDf.pwC@}гYES<\wC@H.ESYUwC@ ףp=FSYUwC@lV}FS)wC@ׁsFS-ӾwC@OnFS-ӾwC@y)FS`wC@2ı.FSwC@|a2U0FSMwC@|?5FS\4xC@DlES\4xC@eES\4xC@Q0c ES$pxC@ESn/ixC@qXs߉YDSwC@v1CS@mxC@XCSn/ixC@v1CSwC@YhCS!wC@s(CDSwC@1ZGDShK6xC@s߉YDS@mxC@ YKDSǵbxC@XCSn/ixC@rH$?SwC@UC?S[~lxC@$?S[~lxC@UC?SM^ixC@sDK?S,wC@X?SǚwC@6h?SwC@$?S[~lxC@sXCSwC@,BCSn/ixC@}.PRCSY,ExC@UZCS xC@`L8CS!wC@ḌCS;?lwC@,BCSwC@'>CSulwC@ACSDf.pwC@}.PRCSwC@5z5@iCSSٳ25wC@<>SpGRxC@ Z>SpGRxC@?2:>S;Ug$xC@Yk(>SǷw xC@<>SSDf.pwC@l)>Sn;wC@..>Sٳ25wC@Z>S.u׃wC@Z>SpGRxC@u qGS#^LuC@Q|aFSczOLxC@lxz,GS]ʾwC@.RFSU gvC@B>٬FSavC@Q|aFStvC@ F%uFSMMuC@lV}FSƤuC@&SFSx_ uC@zQ}ʸFS#^LuC@&䃞FSj2muC@sAGS!sePmvC@_vGS>vC@ qGS _>YwC@ qGSwC@"l>9GSczOLxC@lxz,GS]ʾwC@vPʨ2>S1vC@..>SX6sHxC@y>SwC@ʨ2>SX6sHxC@Z>S.u׃wC@..>Sٳ25wC@&v>S1vC@<3p>So'wC@y>SwC@wXESUWBSiwC@UBSulwC@BSX%wC@76;R}BS/IewC@feBS/IewC@mUBS/IewC@h>nBS<\wC@ @tBSDf.pwC@apBSq_wC@u6CSiwC@ CS<3pwC@0h!BS\5wC@>UWBS$xC@>UWBSiwC@{`l)>Sn;wC@=SǷw xC@ Yk(>SǷw xC@; >Sj0 xC@VX=S@TxC@09n=SqڲwC@=S?"wC@l)>Sn;wC@ &B>SDf.pwC@<>SSǷw xC@|@>UWBS|?wC@`BSiwC@`BS!wC@?s֧BS|?wC@UBSulwC@>UWBSiwC@`BS!wC@}PASJ`swC@Z8ASiwC@Z8ASiwC@5-^HvC@uES\*wC@ ( ESfKVEwC@ $(~ESMwC@ŏ1wES\*wC@ڬ\mES;?lwC@QESwC@uESulwC@48ES>^HvC@EJES1vC@ݓESavC@ZڊESYwC@SsCSK>v(wC@XU/CSo'wC@{BDS.S wC@? DSYk(wC@s(CDSٳ25wC@s(CDSǚwC@s(CDS69|wC@YhCS-ӾwC@YhCS!wC@v1CSwC@H?s֧BS LnwC@5AS!wC@5ASJ wC@5ASuV 1wC@)狽BS LnwC@?s֧BS|?wC@`BS!wC@5ASJ wC@xɮAS1vC@Iv|ASNPwC@ AS<3pwC@ASNPwC@yVҊASJ`swC@&zASJcwC@&zASA"LwC@2SZAS!wC@Iv|ASvC@t~AS1vC@ɮASg)YNBwC@ ASA"LwC@^?ASq_wC@AS<3pwC@X5ASuV 1wC@ASJ wC@AS<3pwC@^?ASq_wC@ ASA"LwC@ɮASg)YNBwC@5ASuV 1wC@5ASJ wC@mASwC@AS<3pwC@Hlxz,GSavC@ ףp=FS]ʾwC@lV}FS)wC@ ףp=FSYUwC@B>٬FSavC@.RFSU gvC@lxz,GS]ʾwC@lV}FS)wC@ES'uC@48ESfKVEwC@ESDf.pwC@lESwC@( ESfKVEwC@/$ES^HvC@=|(BESLRbvC@JCBESUE vC@~8gDES[uC@h|?ES-uC@[vES{ڥuC@SES uC@R'ES'uC@Y8ES>ɋLvC@ES>vC@KY8ES.S wC@ESDf.pwC@`yVҊAS _>YwC@ Y2ASwC@ 5-YwC@-aASiwC@&zASJcwC@yVҊASJ`swC@ 1TmASJ`swC@ 1TmAS,wC@5-SwC@ ?S)wC@>S<3pwC@y>SwC@<3p>So'wC@QF\?SgRwC@ ?S)wC@)>Si^`VvC@=S?"wC@=S?"wC@Cܥ=S9mwC@=SwuzwC@Jó=SiwC@yUg=SiOwC@Yk(>SgRwC@6!1=SLy vC@H>Sl@vC@Yk(>SF}vC@ X>Si^`VvC@)>Si^`VvC@&v>S1vC@..>Sٳ25wC@l)>Sn;wC@=S?"wC@HsDK?S=E~vC@QF\?S)wC@;Ug$?SuxwC@ ?S)wC@QF\?SgRwC@Y,E?S=E~vC@sDK?S,wC@;Ug$?SuxwC@X6h?SyUgvC@lC?S,wC@6h?SwC@X?SǚwC@sDK?S,wC@Y,E?S=E~vC@lC?Sڑ;vC@"5b?SyUgvC@?SyUgvC@6h?SwC@HP:`DSٳ25wC@s(CDSǚwC@s(CDSǚwC@s(CDSٳ25wC@ #DSg)YNBwC@ңDSnBS<\wC@mUBS/IewC@feBS/IewC@76;R}BS/IewC@BSX%wC@UBSulwC@`QES/vC@ңDSwC@ rhDSCSulwC@rJ@CSiOwC@DׅCSˆ5EwC@膦BSo'wC@̛õBSLy vC@A_zBSl@vC@H,CS1vC@H,CSL$wvC@ḌCS /vC@o4CSiaiuC@aCS!sePmvC@'MyCSLvC@C8fٓCSwC@5z5@iCSCSulwC@pc@S-svC@?SwC@ ˟o @Sٳ25wC@͕A?SB͐*@SkzvC@c@SavC@֥F@SܝvC@ ˟o @Sٳ25wC@YR>SD+guC@"J =SwuzwC@=SwuzwC@<l=S/WwC@qJ=S"#wC@S{m=S!sePmvC@"J =S#uC@:$P2=S֍wuC@q{=S`[?guC@Rd=>SD+guC@`->Sx_ uC@.H>SƤuC@YR>S >uC@=S!KvC@6!1=SLy vC@Yk(>SgRwC@yUg=SiOwC@Jó=SiwC@=SwuzwC@Q|aFS'uC@R'ESDf.pwC@ESDf.pwC@KY8ES.S wC@ES>vC@Y8ES>ɋLvC@R'ES'uC@_vOFS'uC@Q|aFStvC@d`TFSw vC@_vOFSLy vC@2ı.FS!wC@'1FSٳ25wC@H.ESYUwC@}гYES<\wC@ESDf.pwC@rJ@CSLy vC@GBSDf.pwC@u6CSiwC@apBSq_wC@ @tBSDf.pwC@h>nBS<\wC@GBSiOwC@GBS+vC@.BSOvC@KBS1vC@̛õBSLy vC@膦BSo'wC@DׅCSˆ5EwC@rJ@CSiOwC@'>CSulwC@u6CSiwC@p48ES!sePmvC@eJDSulwC@ #DS/vC@eJDS$ΊvC@A ºDS>^HvC@rhDS!sePmvC@rhDS>^HvC@p_ESwvC@>yX5ESl@vC@48ES>^HvC@uESulwC@ioESA"LwC@#DS/vC@xUBSvC@)狽BSulwC@ ?s֧BS|?wC@)狽BS LnwC@)狽BSr0vC@)狽BSӹvC@ۦx\TBSvC@ۦx\TBSr0vC@UBS!KvC@ۦx\TBSd8vC@UBSo'wC@UBSٳ25wC@UBSulwC@?s֧BS|?wC@X&zAS!wC@n-ASiwC@ Y2ASJcwC@n-ASYk(wC@2SZAS!wC@&zASA"LwC@&zASJcwC@-aASiwC@<FzQAS _>YwC@ Y2ASJcwC@h ^DSLvC@'MyCS _>YwC@ C8fٓCSwC@'MyCSLvC@ ^DS!bGvC@? DSYk(wC@{BDS.S wC@XU/CSo'wC@SsCSK>v(wC@ pACS _>YwC@5 ;CSYUwC@C8fٓCSwC@`B>٬FStvC@H.ESYUwC@ H.ESYUwC@'1FSٳ25wC@2ı.FS!wC@_vOFSLy vC@d`TFSw vC@Q|aFStvC@B>٬FSavC@ ףp=FSYUwC@H.ESYUwC@h.BS!KvC@ۦx\TBSYUwC@ 76;R}BSYUwC@76;R}BS/vC@ۦx\TBSd8vC@UBS!KvC@~9]BSavC@KBS1vC@.BSOvC@GBS+vC@GBSiOwC@76;R}BSYUwC@H76;R}BSd8vC@ۦx\TBSYUwC@UBSٳ25wC@UBSo'wC@ۦx\TBSd8vC@76;R}BS/vC@76;R}BSYUwC@UBSٳ25wC@x#DS>ɋLvC@VDS>ɋLvC@<DS>So'wC@QF\?SgRwC@<3p>So'wC@&v>S1vC@^?Si^`VvC@k6?S=ƂvC@lC?Sڑ;vC@Y,E?S=E~vC@QF\?SgRwC@Ht~ASr0vC@pzASvC@Iv|ASvC@pzASavC@Iv|ASvC@O@ASr0vC@t~AS1vC@Iv|ASvC@Iv|ASw*uC@@SvC@g\S ASvC@@SvC@@S=uC@Y+@S?̔uC@Y+@STuC@߇(ASj2muC@BvfASw*uC@OsAS>ɋLvC@Iv|ASvC@pzASavC@OASLy vC@<FzQASLvC@Ά3ASvC@g\S ASvC@`b!?SWXp?vC@^?S=ƂvC@ ?SyUgvC@"5b?SyUgvC@lC?Sڑ;vC@k6?S=ƂvC@^?Si^`VvC@W@>?SWXp?vC@ oB@?SkzvC@b!?S-svC@?SyUgvC@H,CSQ(vC@~9]BS1vC@ KBS1vC@~9]BSavC@ZլBS-svC@~9]BSZfvC@BS /vC@aN"BSQ(vC@>9 CS['.+vC@ḌCS /vC@H,CSL$wvC@H,CS1vC@A_zBSl@vC@̛õBSLy vC@KBS1vC@H^?SƤuC@&v>S1vC@^?Si^`VvC@&v>S1vC@)>Si^`VvC@)>S7uC@)>SƤuC@^?Si^`VvC@ #DSN;PuC@uwCSyUgvC@uCS0!vC@f|CSQ(vC@uwCS8ӄuC@߽CS#/kbuC@kCS#uC@mrDS}uC@kMGDS/fuC@3`DSN;PuC@PeoDSFtuC@ #DS'vC@<DS>ɋLvC@-_?DS>ɋLvC@ލADSyUgvC@? DSyUgvC@uCS0!vC@)>S]6tC@q{=SLy vC@)>Si^`VvC@ X>Si^`VvC@Yk(>SF}vC@H>Sl@vC@6!1=SLy vC@=S!KvC@YR>S >uC@.H>SƤuC@`->Sx_ uC@Rd=>SD+guC@q{=S`[?guC@F=Sl%uC@'H0>S)tC@Q._x>S]6tC@øDk>SOtC@ǚ>SD+guC@)>SƤuC@)>S7uC@)>Si^`VvC@`BS'vC@ۦx\TBSavC@ UBS!KvC@ۦx\TBSr0vC@r۾BS'vC@aN"BSQ(vC@BS /vC@~9]BSZfvC@ZլBS-svC@~9]BSavC@UBS!KvC@L5@S#/kbuC@>B͐*@SavC@ `@Sr0vC@c@SavC@>B͐*@SkzvC@/:@S /vC@ \kF@S=uC@}w+Kt@S#/kbuC@`@S#/kbuC@`@S=uC@L5@Sw vC@`@S?Û5vC@`@SSvC@`@SZfvC@`@Sr0vC@@O@AS霟8vC@OsASvC@Iv|ASvC@OsAS>ɋLvC@!AS霟8vC@O@ASr0vC@Iv|ASvC@Xr۾BSTuC@)x RBSr0vC@ۦx\TBSvC@)x RBS'vC@~ϚBSzuC@P,BS\1еuC@QH2BSTuC@r۾BS'vC@ۦx\TBSr0vC@ۦx\TBSvC@P)狽BSƤuC@^?ASr0vC@O@ASr0vC@!AS霟8vC@^?ASuC@ BSƤuC@)狽BSӹvC@)狽BSr0vC@O@ASr0vC@p}@S#/kbuC@`@Sr0vC@ `@Sr0vC@`@SZfvC@`@SSvC@`@S?Û5vC@L5@Sw vC@`@S=uC@`@S#/kbuC@}@S#/kbuC@@S=uC@@SvC@`@Sr0vC@Pۦx\TBS'uC@ BSӹvC@)狽BSӹvC@ BSƤuC@ݗ3BS'uC@ۦx\TBS'uC@)x RBS'vC@ۦx\TBSvC@)狽BSӹvC@hp_ES>^HvC@rhDS!sePmvC@A ºDS>^HvC@eJDS$ΊvC@~8gDES[uC@rhDS>^HvC@ p_ESwvC@镲 ESF}vC@rhDS>^HvC@>yX5ESl@vC@p_ESwvC@p߽CS@muC@o4CSl@vC@ aCS!sePmvC@o4CSiaiuC@JCS1uC@Y32]CS\1еuC@ pACS@muC@߽CS#/kbuC@uwCS8ӄuC@f|CSQ(vC@uCS0!vC@RCSl@vC@aCS!sePmvC@`/:@S0!vC@we ?SkzvC@ >B͐*@SkzvC@Q ?SL$wvC@we ?SL$wvC@ۈ'?S!sePmvC@~įX?S!sePmvC@Z1 @S0!vC@ ˟o @S /vC@/:@S /vC@>B͐*@SkzvC@P0?S=uC@W@>?SkzvC@b!?S-svC@ oB@?SkzvC@W@>?SWXp?vC@ù?S>Si^`VvC@ W@>?SWXp?vC@^?Si^`VvC@)>SƤuC@ǚ>SD+guC@4e>SyZuC@?Sߥ%tC@@@SAEկttC@@S3#tC@u?SU-(uC@0?S=uC@we ?SDuC@ù?S>?SWXp?vC@`!AS#fFuC@BvfAS>ɋLvC@ OsAS>ɋLvC@BvfASw*uC@LjhAS#fFuC@J.ASyZuC@J.ASFtuC@-{؜ASTuC@^?ASuC@!AS霟8vC@OsAS>ɋLvC@Po4CS}uC@V|CBS /vC@>9 CS['.+vC@K3BS$vC@V|CBSJxBuC@CS}uC@o4CSiaiuC@ḌCS /vC@>9 CS['.+vC@H \kF@S=uC@Z1 @S /vC@/:@S /vC@ ˟o @S /vC@Z1 @S0!vC@ ˟o @S=uC@ \kF@S=uC@/:@S /vC@X>9 CS'uC@r۾BS['.+vC@aN"BSQ(vC@r۾BS'vC@̛õBSJxBuC@'BS'uC@V|CBSJxBuC@K3BS$vC@>9 CS['.+vC@aN"BSQ(vC@Ph|?ESj2muC@EDS'vC@EDS'vC@Tt$DSj2muC@46٬DS-uC@ h|?ES-uC@t!ESK %vmuC@VES)tC@>٬DSz"ntC@>٬DSfsC@镲 ES CsC@ŏ1w-ES ސFtC@w/ESИI tC@1ESȭIuC@R'ES'uC@SES uC@[vES{ڥuC@h|?ES-uC@LjhAS6tC@g W@Sj2muC@߇(ASj2muC@QiAS({K9uC@JyAS({K9uC@R@S({K9uC@@S({K9uC@|(B@SuC@SY-rC@d`SerC@>S`9BrC@>SI?sC@l)>SI?sC@ٳ25>SSͬsC@n;>S MKsC@D>SsC@i>SsC@_>Sk6tC@Q._x>S]6tC@'H0>S)tC@F=Sl%uC@q{=S`[?guC@pޒDS^0tC@tѐ(DSFtuC@ PeoDSN;PuC@PeoDSFtuC@3`DSN;PuC@tѐ(DS^0tC@;zjDS^0tC@XjDSTƿϸtC@O DS*ltC@ޒDS)tC@:FvDS)tC@K6lDS)tC@PeoDSN;PuC@f\CS-@jtC@BS@muC@BS2: tC@>CS֥tC@>CS-@jtC@F1CS-@jtC@`L8CSz"ntC@09CSwtC@v4ECSuXtC@f\CSkv/uC@ pACS@muC@ECS^SuC@ډCSD+guC@rJ@CS@ CuC@v=CS߆uC@v=CSOtC@BS2: tC@H?S۟tC@ǚ>SD+guC@?Sߥ%tC@4e>SyZuC@ǚ>SD+guC@=)?S۟tC@?SStC@?Sߥ%tC@>,?S&8sC@øDk>SD+guC@ ǚ>SD+guC@øDk>SOtC@Q._x>S]6tC@_>Sk6tC@-Ӿ>SVzm6tC@ƒf>S&8sC@f@>SB#ظsC@>SިtC@5"?SUdt@tC@=)?S^9StC@>,?S-@jtC@=)?S۟tC@ǚ>SD+guC@X)x RBS2: tC@ BSyZuC@ BSyZuC@ BS2: tC@Fn1BS2: tC@)x RBS2: tC@)x RBS@ CuC@ݗ3BS@ CuC@ݗ3BSyZuC@ BSyZuC@` BS2: tC@Gp#eASyZuC@ J.ASyZuC@LjhAS#fFuC@Gp#eASOtC@!ASOtC@5AS2: tC@ BS2: tC@ BSyZuC@vASyZuC@J.ASyZuC@X|(B@SytC@`@Sq:VuC@`@Skv/uC@`@S2: tC@}@SOtC@}@SytC@٬DSfsC@>٬DS;sC@>٬DSzsC@t=5DS|)csC@BESsqsC@Y8ES{נ/sC@H.ES CsC@zFSOItC@7dFSltC@FSU-(uC@1ESȭIuC@PLjhAS)tC@(7AS#fFuC@߇(ASjJuC@(7AS)tC@BvfAS)tC@BvfAS~TtC@Gp#eASOtC@LjhAS#fFuC@߇(ASjJuC@``@SatC@/:@Skv/uC@ `@Skv/uC@/:@SU-(uC@/:@S)tC@H@S)tC@]pX@SatC@oJy@SϺFˁtC@Xl@S-tC@`@S2: tC@`@Skv/uC@h]pX@S{&3tC@u?SU-(uC@ /:@SU-(uC@u?SU-(uC@@S3#tC@@@SAEկttC@(%@S{&3tC@oI@SA]PtC@]pX@SatC@H@S)tC@/:@S)tC@/:@SU-(uC@P߇(AS)FtC@=@SjJuC@=@S _tC@nlv@S)FtC@JyAS)FtC@(7AS)tC@߇(ASjJuC@(7ASOtC@=@S _tC@>CS^9StC@KBS]RuC@ )ʥBS]RuC@(BSwtC@$BSwtC@KBSο]tC@r۾BS^9StC@BS^9StC@BS%ZxZtC@.BScgtC@f CS-@jtC@>CS-@jtC@>CS֥tC@BS2: tC@)ʥBS]RuC@PGBS$tC@)x RBSOtC@[7qBSOtC@)x RBS2: tC@ۦx\TBSHMtC@qBS$tC@GBSvťtC@76;R}BS2: tC@[7qBSOtC@h5AScgtC@UASOtC@ !ASOtC@^?AS]6tC@^?AS3#tC@UAS-@jtC@AScgtC@ASwtC@:vAShqtC@lpASl]j~tC@5AS2: tC@!ASOtC@P!ASztC@Gp#eASOtC@Gp#eASOtC@BvfAS~TtC@;uASztC@yVҊAS]6tC@^?AS]6tC@!ASOtC@Gp#eASOtC@X,?S-@jtC@3J?S/tC@e?StC@^0?SQ [sC@'d?SB#ظsC@(%@S{&3tC@@@SAEկttC@?Sߥ%tC@xVES]CsC@YhDS)tC@ ޒDS)tC@O DS*ltC@XjDSTƿϸtC@;zjDS^0tC@YhDS]MtC@pDS3JtC@3O)DSPPVsC@xDS]CsC@>٬DSfsC@>٬DSz"ntC@VES)tC@ޒDS)tC@p^?AS_FtC@BvfAS]6tC@ BvfAS~TtC@BvfAS)tC@BvfAS3JtC@DeÚAS_FtC@UAS)FtC@UAS-@jtC@^?AS3#tC@^?AS]6tC@yVҊAS]6tC@;uASztC@BvfAS~TtC@P@SB#ظsC@Xl@S3 tC@Xl@S-tC@`@S{&3tC@L5@SPR)tC@@SB#ظsC@@S)FtC@@S3 tC@Xl@S-tC@h$BStC@EBSvťtC@ ۦx\TBSHMtC@.rOBS%s}tC@EBSިtC@wIQBStC@UBSިtC@KBSο]tC@$BSwtC@GBSvťtC@qBS$tC@ۦx\TBSHMtC@HBvfAS)FtC@JyAS)tC@(7AS)tC@JyAS)FtC@,cC7AS)FtC@BvfAS3JtC@BvfAS)tC@(7AS)tC@L5@SʅʿrC@(%@S-tC@Xl@S-tC@oJy@SϺFˁtC@]pX@SatC@oI@SA]PtC@(%@S{&3tC@̷>7@SsC@S{/@SsC@}O9@SU6sC@*-9@SDN_rC@K@SrC@S@SʅʿrC@j@SݳrC@WV@S(rC@Xl@S}$%= sC@Xl@SsC@L5@SPR)tC@`@S{&3tC@Xl@S-tC@P;zjDS>,tC@? DS^0tC@tѐ(DS^0tC@t%DSϺFˁtC@? DS/tC@YhDS>,tC@YhDS]MtC@;zjDS^0tC@tѐ(DS^0tC@`(ϼ;SvLݕsC@vZ;S(otC@ (ϼ;S׆qtC@H:Y;S(otC@vZ;SU7sC@CS-@jtC@f CS-@jtC@.BScgtC@BS%ZxZtC@ @tBSިtC@KǜgCSިtC@YeCSsC@|}KCSsC@YeCSlCtC@Ku/3CS%ZxZtC@F1CS-@jtC@>CS-@jtC@` BSmsC@lpAS-@jtC@  BS-@jtC@Is AScgtC@5AS^9StC@gAS)FtC@lpAS)FtC@lpASmsC@'BS&8sC@eVA BSfsC@ BS-@jtC@h3J?SsC@ƒf>S-@jtC@ 3J?S/tC@>,?S-@jtC@=)?S^9StC@5"?SUdt@tC@>SިtC@f@>SB#ظsC@ƒf>S&8sC@_}<>SsC@?SfsC@3J?S/tC@hr۾BSOv3sC@jQBSο]tC@ KBSο]tC@UBSިtC@wIQBStC@jQBSOv3sC@iBS'y3sC@[7qBSnWsC@[7qBSE~sC@BSE~sC@r۾BS^9StC@KBSο]tC@h(CS~42sC@|E{BS%ZxZtC@ BS^9StC@r۾BS4esC@|E{BS~42sC@̛õBSXCsC@̛õBS@sC@10&CSqssC@(CSYfsC@ @tBSިtC@BS%ZxZtC@BS^9StC@pBSHsC@hBS^9StC@ r۾BS^9StC@BSE~sC@[7qBSE~sC@[7qBSnWsC@iBS'y3sC@hBS)1 sC@BSHsC@|E{BS~42sC@r۾BS4esC@BS^9StC@r۾BS^9StC@`m=S xarC@V'g٬DS`-sC@f`XCS]MtC@YhDS>,tC@%}eDSsC@f`XCSmsC@f`XCSi{sC@f`XCS`[?gsC@V_]DS`-sC@|DSJsC@쪋DSB[sC@t=5DS|)csC@>٬DSzsC@>٬DS;sC@>٬DSfsC@xDS]CsC@3O)DSPPVsC@pDS3JtC@YhDS]MtC@YhDS>,tC@H^?ASk6tC@BvfAS3JtC@BvfAS3JtC@BvfASk6tC@^?ASk6tC@UAS)FtC@DeÚAS_FtC@BvfAS3JtC@HLjhASǴ6sC@,cC7AS3JtC@,cC7AS)FtC@8ASgsC@LjhASǴ6sC@BvfASk6tC@BvfAS3JtC@,cC7AS)FtC@@8ASgsC@Os@S)FtC@JyAS)FtC@Os@S;sC@8ASgsC@,cC7AS)FtC@JyAS)FtC@P;>SQ [sC@_>SVzm6tC@ƒf>S&8sC@-Ӿ>SVzm6tC@_>Sk6tC@X>SQ [sC@;>S5sC@_}<>SsC@ƒf>S&8sC@X}O9@SU6sC@'d?S{&3tC@(%@S{&3tC@'d?SB#ظsC@t?S\JsC@'d?SU6sC@}O9@SU6sC@S{/@SsC@̷>7@SsC@(%@S{&3tC@HYhDSmsC@f`XCS/tC@? DS/tC@BZc DS&P"tC@f`XCSmsC@%}eDSsC@YhDS>,tC@? DS/tC@@e?S{נ/sC@?S/tC@e?StC@3J?S/tC@?SfsC@ި?S{נ/sC@e?StC@V_]DSTV?rC@|}KCSPR)tC@ECSPR)tC@ѭCSsC@|}KCSsC@ډCS4}vsC@i{CSJ`ssC@ iQCS5($sC@`#ICSi{sC@hCSt&sC@ډCSSYvQrC@DSTV?rC@mwNDS XsC@V_]DS`-sC@f`XCS`[?gsC@f`XCSi{sC@f`XCSmsC@BZc DS&P"tC@ECSPR)tC@XOs@S5sC@Xl@SPR)tC@L5@SPR)tC@Xl@SsC@@SsC@}@S5sC@@S MKsC@Os@S;sC@@SB#ظsC@L5@SPR)tC@H^?AS^sC@BvfASk6tC@BvfASk6tC@LjhASǴ6sC@yVҊAS^sC@UASa/sC@^?ASk6tC@BvfASk6tC@`PPV>SU6sC@D>Sk6tC@ _>Sk6tC@i>SsC@D>SsC@n;>S MKsC@gI}>SnpsC@PPV>SU6sC@69|>SCsC@X>SQ [sC@_>Sk6tC@hډCS" lsC@ @tBSިtC@ @tBSިtC@(CSYfsC@10&CSqssC@A}˜.CS" lsC@Yd:CSHsC@ډCS4}vsC@|}KCSsC@YeCSsC@KǜgCSިtC@ @tBSިtC@pwIQBSm3sC@ BSިtC@ EBSިtC@Fn1BStC@,BSsC@ BS;sC@Ϟ$BS|F"4sC@Fn1BS|F"4sC@Un2BS>UWsC@ka9BSm3sC@jQBSOv3sC@wIQBStC@EBSިtC@ @^0?SbdsC@ި?StC@e?StC@ި?S{נ/sC@,( 4?SbdsC@^0?SQ [sC@e?StC@ Ht?SdsC@^0?SB#ظsC@'d?SB#ظsC@^0?SQ [sC@?SdsC@we ?SSͬsC@t?S\JsC@'d?SB#ظsC@ Pި?SCsC@X>SfsC@?SfsC@_}<>SsC@;>S5sC@X>SQ [sC@69|>SCsC@ި?S{נ/sC@?SfsC@ `}@S(rC@Xl@SsC@ Xl@SsC@Xl@S}$%= sC@WV@S(rC@YO@SQrC@+MJA@S}$%= sC@@S}$%= sC@}@S5sC@@SsC@Xl@SsC@ ka9BS R sC@yVҊAS&8sC@ BS;sC@'BS&8sC@lpASmsC@UASa/sC@yVҊAS^sC@yVҊASаusC@lASOsC@_&AS2p@KsC@sJ@LASKsC@TOBSbg sC@`9BS R sC@ka9BSm3sC@Un2BS>UWsC@Fn1BS|F"4sC@Ϟ$BS|F"4sC@ BS;sC@LjhASQrC@+MJA@S;sC@ }@S5sC@@S}$%= sC@+MJA@S}$%= sC@YO@SQrC@@S XsC@`? ASU6sC@ ?8ASjTsC@LjhASаusC@LjhASǴ6sC@8ASgsC@Os@S;sC@@S MKsC@}@S5sC@XgI}>S`9BrC@>S MKsC@gI}>SnpsC@n;>S MKsC@ٳ25>SSͬsC@l)>SI?sC@>SI?sC@>S`9BrC@gI}>S}$%= sC@gI}>SnpsC@p`#ICSRd=sC@A}˜.CS4}vsC@ ډCS4}vsC@Yd:CSHsC@A}˜.CS" lsC@e9 /CS:A>sC@_|CSRd=sC@<͌~CSi{sC@RewCSi{sC@`#ICSi{sC@ iQCS5($sC@i{CSJ`ssC@ډCS4}vsC@H,( 4?SU6sC@69|>S{נ/sC@ި?S{נ/sC@69|>SCsC@PPV>SU6sC@W"?S?2:sC@,( 4?SbdsC@ި?S{נ/sC@oH;S rC@1M:SU7sC@;SQrC@Hi6;Sl)sC@&;SߣzsC@3.;SQ [sC@S}$%= sC@gI}>SnpsC@PPV>SU6sC@gI}>SnpsC@gI}>S}$%= sC@Sͬ>STOsC@PPV>SU6sC@TOBSbArC@,cC7ASǴ6sC@LjhASǴ6sC@LjhASаusC@ ?8ASjTsC@Z8ASt&sC@Z8ASsC@,cC7AS/rC@GAShxrC@GASbArC@s`BSۂrC@TOBSbg sC@sJ@LASKsC@_&AS2p@KsC@lASOsC@yVҊASаusC@yVҊAS^sC@LjhASǴ6sC@`#ICSSYvQrC@,CSi{sC@e9 /CS:A>sC@%/CS<sC@,CSާrC@v4ECS2RrC@ UdCSDN_rC@xܙCSC9rC@|}KCSTrC@ډCSSYvQrC@hCSt&sC@`#ICSi{sC@RewCSi{sC@<͌~CSi{sC@_|CSRd=sC@e9 /CS:A>sC@pzOsC@A}˜.CS" lsC@X$S;SrC@0$'q:SEnjF[sC@n:SrC@kHc:S}ArC@$S;SDN_rC@1M:SEnjF[sC@x~:Ss\rC@0$'q:SrC@,σ:SrC@n:SrC@GAS#*rC@}F@SjTsC@@S XsC@R%@S(rC@e@S(rC@}F@S fhrC@ٗl<@S#*rC@ "AS0*rC@GASbArC@GAShxrC@,cC7AS/rC@Z8ASsC@Z8ASt&sC@ ?8ASjTsC@`? ASU6sC@@S XsC@|&;SQrC@gED;S﮳!rC@nl;S\=rC@QJV;SSqrC@߿yq;SDN_rC@ђ;SofrC@dY0;SQrC@|&S?2:sC@`?S[^6sC@W"?S?2:sC@PPV>SU6sC@ C>S'H0sC@a?SDN_rC@`?S[^6sC@ @we ?SEӜrC@`?S[^6sC@we ?SU6sC@`?S[^6sC@a?SDN_rC@we ?SEӜrC@we ?SU6sC@!@}O9@SDN_rC@'d?SU6sC@}O9@SU6sC@'d?SU6sC@'d?SDN_rC@*-9@SDN_rC@}O9@SU6sC@"`|?SrC@0Qd?SU6sC@ 'd?SU6sC@we ?SU6sC@we ?SEӜrC@we ?S(rC@0Qd?S)rC@`#I?SrC@|?S4ӽNrC@'d?SDN_rC@'d?SU6sC@#`5>S }rC@Sͬ>SU6sC@  C>S'H0sC@PPV>SU6sC@Sͬ>STOsC@ʨ2>SXrC@5>S }rC@`>S5&rC@5>SI&rC@5>SW횐rC@ C>S'H0sC@$DSmēlC@S'H0sC@a?SDN_rC@ C>S'H0sC@5>SW횐rC@a?SDN_rC@'H5>S }rC@gI}>STOsC@Sͬ>STOsC@gI}>S}$%= sC@/Ie>S }rC@5>S }rC@ʨ2>SXrC@Sͬ>STOsC@(X%/CSSqrC@6X8IBS XsC@膦BS XsC@6X8IBSSqrC@Y4 CS prC@# CSt^crC@,CSާrC@%/CS<sC@bCS XsC@膦BS XsC@)@膦BSjMSrC@A9wBS XsC@(ϼBSH4"sC@A9wBSjMSrC@6X8IBSSqrC@膦BS XsC@(ϼBSH4"sC@*X@S(rC@WV@S XsC@YO@SQrC@WV@S(rC@qTn@SJ +rC@'@S(rC@e@S(rC@R%@S(rC@@S XsC@YO@SQrC@+P/Ie>SKrC@ >S}$%= sC@gI}>S}$%= sC@>S`9BrC@ >SerC@ˆ5E>SKrC@g)YNB>S }rC@/Ie>S }rC@gI}>S}$%= sC@,Pnl;Syt#,*rC@oo>;S﮳!rC@oH;S5&rC@b;Syt#,*rC@nl;S2*ArC@nl;S\=rC@gED;S﮳!rC@oo>;SQrC@oH;S5&rC@-H{!US^(`;pC@m=SerC@ >SerC@m=SY-rC@a=S,_qC@q=SYNqC@..>S'pC@..>S5 ;pC@ǚ>S^(`;pC@8h>S*OpC@7n>Sg\WpC@ƒf>S'MypC@`>SpC@»\>S-CpC@X%>SqC@Ǻ>S10&qC@X%>SPi4qC@X%>SO\qC@XS6;R}qC@{5Z>S,qC@Z>SbGrC@gI}>S~qJ[rC@ti>Sy9[rC@`[?g>S fhrC@ˆ5E>SKrC@ >SerC@0P}O9@S7/NrC@'d?SDN_rC@*-9@SDN_rC@'d?SDN_rC@|?S4ӽNrC@Z1 @S7/NrC@25 @SӡnrC@}O9@SKrC@*-9@SDN_rC@1@we ?S(rC@:SDN_rC@a?SDN_rC@5>SW횐rC@5>SI&rC@9>S(rC@:S[tYrC@`>S5&rC@5>SI&rC@`>S5&rC@5>S }rC@>S[tYrC@Pō[>SZrC@)\>SؼZrC@9>S(rC@5>SI&rC@5XL$w=SZDrC@zOS[tYrC@/Ie>S }rC@5>S }rC@/Ie>S }rC@[>SI0ZrC@>S[tYrC@5>S }rC@8X[>SI0ZrC@g)YNB>S }rC@/Ie>S }rC@g)YNB>S }rC@ˆ5E>SKrC@`[?g>S fhrC@ti>Sy9[rC@gI}>S~qJ[rC@[>SI0ZrC@/Ie>S }rC@9Pcz;Sm3qC@,σ:SrC@$S;SrC@n:SrC@,σ:SrC@,σ:Sm3qC@wJ:SO\qC@cz;Sm3qC@$S;SrC@:P,σ:Sm3qC@W 3:SrC@,σ:SrC@0$'q:SrC@W 3:SGrC@wJ:Sj#rC@ubr:SfzfqC@,σ:Sm3qC@,σ:SrC@;H+B=SO\qC@_hQJV;Sm3qC@b;SSqrC@ QJV;SSqrC@nl;S\=rC@nl;S2*ArC@b;Syt#,*rC@b;SO\qC@C?;Sm3qC@.ҥ;Sm3qC@QJV;Sm3qC@QJV;SkurC@QJV;SSqrC@?Hwe ?SQS'rC@:S/rC@:S(rC@)\>SؼZrC@a?S~qJ[rC@:S~qJ[rC@a?S~qJ[rC@)\>SؼZrC@Pō[>SZrC@>S[tYrC@[>SI0ZrC@X%>S#*rC@ ސF?S#*rC@Ip?S#*rC@'?SOqC@.5B?Sm3qC@"1A?SqC@Av?S:pqC@w?SF~qC@sCSv?Sp"qC@ο]?Sp"qC@{_?SQS'rC@a?S~qJ[rC@DIp?S qC@{5Z>S~qJ[rC@ [>SI0ZrC@gI}>S~qJ[rC@Z>SbGrC@{5Z>S,qC@XS6;R}qC@X%>SO\qC@`>Sm3qC@ C>S qC@'?SOqC@Ip?S#*rC@ ސF?S#*rC@X%>S#*rC@[>SI0ZrC@E@|?SΈqC@`#I?S4ӽNrC@|?S4ӽNrC@`#I?SrC@6\䞮?SΈqC@'d?S qC@|?S4ӽNrC@FX6\䞮?SF~qC@ο]?S)rC@0Qd?S)rC@{_?SQS'rC@ο]?Sp"qC@sCSv?Sp"qC@w?SF~qC@6\䞮?SΈqC@`#I?SrC@0Qd?S)rC@GHst=SqqC@|]SPi4qC@X%>SO\qC@`>Sm3qC@X%>SO\qC@X%>SPi4qC@`w>Sg`qC@`>Sm3qC@L..>S5 ;pC@"J =SO\qC@+B=SO\qC@st=SqqC@wc=SB|`qC@"J =SB|`qC@TE=S4-2qC@ Y=SVpC@H\=S>VpC@Q=SmypC@`9B=S&pC@..>S5 ;pC@..>S'pC@q=SYNqC@a=S,_qC@2VW=Sm3qC@+B=SO\qC@M`eM.dqC@ C>SOqC@'?SOqC@ C>S qC@ C>SlqC@,G@?S>dqC@"1A?SqC@.5B?Sm3qC@'?SOqC@P@ C>Sg`qC@`w>Sm3qC@ C>S qC@`>Sm3qC@`w>Sg`qC@ C>SlqC@ C>S qC@Q`毐2dqC@Av?SĬCqC@Av?S:pqC@WH/oj;SBZc qC@cC;Sj qC@.\;Sj qC@cC;S{9yqC@UMu;Si qC@";SBZc qC@/oj;SyqC@.\;Sj qC@X`X_"ASpC@Xl@S*qC@ X_"ASfqC@@S*qC@`@S4-2qC@`@SBZc qC@Xl@SmypC@Xl@SpC@nlv@SpC@g\S ASpC@X_"ASfqC@Y`Q`@S¢"N'qC@?S [qC@ *-9@S [qC@I&?S?2:qC@?S¢"N'qC@ePmp"@S'h'qC@X_"@SލAqC@Q`@SCSvAqC@"`@SUeqC@/:@S%}eqC@*-9@S [qC@Z`4I,)wASҋ*pC@nlv@SfqC@ X_"ASfqC@g\S ASpC@nlv@SpC@nlv@S6D.pC@f/N[AS6D.pC@ʌ^ASҋ*pC@4I,)wAS bk_pC@$DiAS1cqC@X_"ASfqC@[`zn+BSҋ*pC@ʌ^AS1cqC@ $DiAS1cqC@4I,)wAS bk_pC@ʌ^ASҋ*pC@Ӻ jASҋ*pC@;uASҋ*pC@PV WBS_ pC@zn+BS\pC@0Z BSOz1qC@$DiAS1cqC@\@!A?S_EF$qC@ C>SlqC@,G@?S>dqC@ C>SlqC@9>S_EF$qC@!A?S#bJ$qC@,G@?S>dqC@]H9>S_EF$qC@X%>SlqC@ C>SlqC@`w>Sg`qC@X%>SPi4qC@Ǻ>S10&qC@9>S_EF$qC@ C>SlqC@^dqC@Av?SĬCqC@,G@?S>dqC@!A?S#bJ$qC@}A?SCpC@sCSv?S)9'pC@-\o?SH4"qC@)?S"1qC@Av?SĬCqC@a`@S!pC@?SCSvAqC@`@SލAqC@Q`@SCSvAqC@X_"@SލAqC@ePmp"@S'h'qC@?S¢"N'qC@?SyqC@'d?SBZc qC@'d?S)9'pC@ ˟o @S\pC@X_"@SRpC@!@S!pC@`rZ@S0pC@uoEb@SOpC@Xl@SmypC@`@SBZc qC@`@S4-2qC@`@SލAqC@bx~T?Sn|bpC@sCSv?S&O:qC@ I&?S?2:qC@]ؚ?S*r9qC@]T?S&O:qC@)?S"1qC@-\o?SH4"qC@sCSv?S)9'pC@(Bv?S h"lpC@sCSv?Sn|bpC@~T?S pC@?SyqC@?S¢"N'qC@I&?S?2:qC@cX9>S9pC@X%>S10&qC@9>S_EF$qC@Ǻ>S10&qC@X%>SqC@»\>S-CpC@?>S9pC@>S)9'pC@9>S)9'pC@9>S_EF$qC@dP}A?S|RpC@>S#bJ$qC@!A?S#bJ$qC@9>S_EF$qC@9>S)9'pC@>S|RpC@ٳ25?S_]pC@}A?SCpC@!A?S#bJ$qC@e`獓¼;S;pC@/oj;S_EF$qC@ ̓;S_EF$qC@/oj;SyqC@)dq;SRpC@p|;S;pC@gED;S bpC@ 4;S&pC@獓¼;SRpC@<-?p;S ^qC@̓;S_EF$qC@fXX_"@S pC@?SyqC@?SyqC@~T?S pC@!@S!pC@X_"@SRpC@ ˟o @S\pC@'d?S)9'pC@'d?SBZc qC@?SyqC@gPp|;S;pC@";SyqC@/oj;SyqC@";SBZc qC@h*;SpC@1*;SkpC@p|;S;pC@)dq;SRpC@/oj;SyqC@hW=SOnC@VpC@ Y=SVpC@TE=S4-2qC@iP(Bv?S5z5@ipC@ٳ25?S)9'pC@sCSv?S)9'pC@}A?SCpC@ٳ25?S_]pC@,A?S.pC@ oB@?S5z5@ipC@(Bv?S h"lpC@sCSv?S)9'pC@jX9>S'MypC@»\>S)9'pC@9>S)9'pC@>S)9'pC@?>S9pC@»\>S-CpC@`>SpC@ƒf>S'MypC@>S|RpC@9>S)9'pC@kǚ>SoC@H\=S>VpC@`9B=S&pC@Q=SmypC@H\=S>VpC@W=SDXpC@!K=SApC@ڑ;=So.'pC@nr>SoC@5+-#>SSoC@ˆ5E>S[oC@5C(^>SbpC@|F"4>S !p$pC@ǚ>S^(`;pC@..>S5 ;pC@`9B=S&pC@lv@SFn1oC@c?SmypC@!@S!pC@~T?S pC@sCSv?Sn|bpC@z"n?SoC@c?S7QoC@F?S{_oC@ 9?ST\oC@}O9@S }soC@$[]@SFn1oC@e@S9}oC@v@S7ǹMoC@`@S6D.pC@Xl@SpC@Xl@SmypC@uoEb@SOpC@`rZ@S0pC@!@S!pC@mxK[;SVoC@?Ͷ);S bpC@ h*;SpC@?Ͷ);SsjpC@Zqū;SB]MoC@2;SVoC@߿yq;SB pC@K[;SlɪpC@gR@;S'pC@ 4;S&pC@gED;S bpC@p|;S;pC@1*;SkpC@h*;SpC@nP,A?S5z5@ipC@ƒf>S_]pC@ٳ25?S_]pC@>S|RpC@ƒf>S'MypC@>SLnYkpC@ oB@?S5z5@ipC@,A?S.pC@ٳ25?S_]pC@oN4a;SH]oC@L.;SAtsoC@' f4a;SlɪpC@^*6u4a;SH]oC@؂C4a;SH]oC@PlS'MypC@ ƒf>S'MypC@7n>Sg\WpC@8h>S*OpC@ǚ>S^(`;pC@{h+>SapoC@c?S7QoC@z"n?SoC@sCSv?Sn|bpC@(Bv?S h"lpC@ oB@?S5z5@ipC@>SLnYkpC@ƒf>S'MypC@tXڑ;=SEoC@d w=SDXpC@ڑ;=So.'pC@!K=SApC@W=SDXpC@τ&=S}.PRpC@B:<=S[oC@d w=SEoC@ڑ;=S^ zoC@ڑ;=So.'pC@uc?S~nC@ˆ5E>S^(`;pC@ǚ>S^(`;pC@|F"4>S !p$pC@5C(^>SbpC@ˆ5E>S[oC@5($>S(oC@_}<>SoC@>S oC@W"?S~nC@]M?Sb,/oC@}A?ST !oC@X6sH?SEoC@c?S7QoC@{h+>SapoC@ǚ>S^(`;pC@v;uAS xoC@#&@S6D.pC@ S^ zoC@ڑ;=So.'pC@nr>SoC@ڑ;=So.'pC@ڑ;=S^ zoC@`9B=SᖏoC@nr>SoC@yH5($>S߃oC@5+-#>S[oC@ˆ5E>S[oC@5+-#>SSoC@5+-#>S<+ioC@`[?g>S߃oC@5($>S(oC@ˆ5E>S[oC@zPB:<=Sq oC@5ZSTnnC@`9B=SSoC@ 5+-#>SSoC@nr>SoC@`9B=SᖏoC@`9B=Sq oC@il>SƉvoC@Yk(>STnnC@t&>SDKoC@5+-#>S<+ioC@5+-#>SSoC@|H>S oC@`[?g>S(oC@5($>S(oC@`[?g>S߃oC@>SOoC@>S oC@_}<>SoC@5($>S(oC@}H`[?g>SDhoC@5+-#>S<+ioC@`[?g>S߃oC@5+-#>S<+ioC@t&>SDKoC@iO>SDhoC@bd>SDKoC@`[?g>S߃oC@~x5'/2ASnC@$[]@S7ǹMoC@ v@S7ǹMoC@e@S9}oC@$[]@SFn1oC@L5@S|HnC@5'/2ASnC@R@S0BnC@@SƉvoC@d,@S xoC@ @S xoC@@S~9]oC@#&@S7ǹMoC@v@S7ǹMoC@X`9B=S NDnC@WWj=SᖏoC@`9B=SᖏoC@ڑ;=S^ zoC@d w=SEoC@WWj=S8_nC@6!1=S NDnC@`9B=S%nC@`9B=Sq oC@`9B=SᖏoC@`Gp#eAS#mC@d,@SS!oC@ d,@S xoC@@SƉvoC@R@S0BnC@5'/2ASnC@&LAS#mC@عi3NAST !oC@Gp#eASS!oC@V W@ASԕoC@d,@S xoC@8>SOoC@bd>S߃oC@`[?g>S߃oC@bd>SDKoC@>SOoC@`[?g>S߃oC@$[]@ST:mC@}A?S7QoC@$[]@SFn1oC@}O9@S }soC@ 9?ST\oC@F?S{_oC@c?S7QoC@X6sH?SEoC@}A?ST !oC@]M?Sb,/oC@u?SnC@>D?S\nC@5\?S>ȲnC@-@j?S|HnC@z"n?SGnC@OI?SE(nC@xwd?SmC@l?SH nC@?SrnC@ _?ST:mC@̷>7@S++nC@@SRnC@@SOnC@+2@Sb,/oC@$[]@SFn1oC@H34S+mC@34SՔdnC@!>SgnC@Yk(>STnnC@il>SƉvoC@`9B=Sq oC@`9B=S%nC@6!1=S NDnC@WWj=S8_nC@d w=SEoC@ V|CBSt_hC@@SFn1oC@!5'/2ASnC@L5@S|HnC@$[]@SFn1oC@+2@Sb,/oC@@SOnC@@SRnC@̷>7@S++nC@uoEb@Stѐ(mC@oJy@S%/lC@zV@S[7qkC@@SljC@ASN S[jC@A ASfJo jC@oAS.uiC@XAS=[iC@BvfAS=[iC@ 1TmAS=[iC@O@ASڐfiC@A 1{BSt_hC@唀BS/$iC@2pBS]@jC@L…SOoC@bd>SDKoC@iO>SDhoC@t&>SDKoC@Yk(>STnnC@!>SgnC@>SՔdnC@=E~=Sn/nC@H>Sӻx?nC@XC>Sd:tznC@X%>SRnC@PPV>SnC@W"?S~nC@>S oC@>SOoC@>D?SjnC@_}<>Sb,/oC@]M?Sb,/oC@W"?S~nC@PPV>SnC@f>Sk*nC@_}<>SRnC@&8>SGTnC@>SՔdnC@>,?S"k nC@W@>?SGTnC@ oB@?S9@dnC@lC?S9@dnC@a?SjnC@z"n?SGnC@-@j?S|HnC@5\?S>ȲnC@>D?S\nC@u?SnC@]M?Sb,/oC@hf>Sc 8nC@X%>SnC@ PPV>SnC@X%>SRnC@5($>S*ŎơnC@Sͬ>S(nC@Sͬ>Sc 8nC@ʨ2>Sc 8nC@&8>SGTnC@_}<>SRnC@f>Sk*nC@PPV>SnC@H"3<=Sӻx?nC@XSRnC@X%>SRnC@XC>Sd:tznC@nW>SmC@bd>S:FvmC@i>SfmC@`o`r>S2!撪mC@|F"4>SV)mC@4}v>SV)mC@B#ظ>S'0mC@8?S!nC@>Sլ3nC@;>Sӻx?nC@fc%>SXmnC@>SՔdnC@&8>SGTnC@ʨ2>Sc 8nC@Sͬ>Sc 8nC@Sͬ>S(nC@5($>S*ŎơnC@X%>SRnC@pa?S!nC@;>SGTnC@ >SՔdnC@fc%>SXmnC@;>Sӻx?nC@>Sլ3nC@8?S!nC@a?SjnC@lC?S9@dnC@ oB@?S9@dnC@W@>?SGTnC@>,?S"k nC@>SՔdnC@`OI?SmC@B#ظ>SGnC@ z"n?SGnC@a?SjnC@8?S!nC@B#ظ>S'0mC@'?SmC@JC?SmC@_&?SmC@OI?SE(nC@z"n?SGnC@hbd>SM#~mC@H>Sd:tznC@ XC>Sd:tznC@H>Sӻx?nC@>Sn/nC@o'>SimC@o'>SjmC@R^+>S#mC@.H>SM#~mC@bd>S:FvmC@nW>SmC@XC>Sd:tznC@PH\=S%MQrmC@I=SpmC@h=S+mC@po'>Sɒ9wmC@d8=Sӻx?nC@ H>Sӻx?nC@=E~=Sn/nC@h=S- nC@h=S+mC@>=SpmC@d8=Sɒ9wmC@>S,zmC@o'>SjmC@o'>SimC@>Sn/nC@H>Sӻx?nC@uoEb@Sr#lC@j0 ?S++nC@ _?ST:mC@l]j~?S-_?mC@j0 ?SRlC@]M?SDׅlC@AEկt?ShejlC@l]j~?Sr#lC@3 ?SY32]lC@z3j?SN?lC@3 ?SYİØlC@::Z?S! lC@kg{?S iQlC@uoEb@Stѐ(mC@̷>7@S++nC@ _?ST:mC@` _?S-_?mC@Wy?SE(nC@ OI?SE(nC@_&?SmC@Wy?SPoFmC@l]j~?S-_?mC@ _?ST:mC@?SrnC@l?SH nC@xwd?SmC@OI?SE(nC@P_&?SSmC@_&?SmC@JC?SmC@'?SmC@ި?S׿3gmC@;?l>SS'0mC@ B#ظ>S'0mC@4}v>SV)mC@|F"4>SV)mC@`o`r>S2!撪mC@4ct>S bGmC@;?l>SS'0mC@X>=S@kmC@P=S;MfmC@>=SpmC@=S;MfmC@H\=S;MfmC@P=S%MQrmC@kTd=S^?PmC@$= =S@kmC@d8=Sɒ9wmC@>=SpmC@4ct>S/lC@y=S#mC@bd>S:FvmC@.H>SM#~mC@R^+>S#mC@o'>SjmC@>S,zmC@D>Stѐ(mC@;=SXlC@=S[mC@y=S8]lC@ j)a=S/lC@Rd=>Sf`XlC@4ct>S bGmC@`o`r>S2!撪mC@i>SfmC@bd>S:FvmC@XD>S8]lC@$= =S,zmC@>S,zmC@d8=Sɒ9wmC@$= =S@kmC@y=S8]lC@=S[mC@;=SXlC@D>Stѐ(mC@>S,zmC@P;?l>SKǜglC@Rd=>S bGmC@;?l>SS bGmC@Rd=>Sf`XlC@]z>SmēlC@{נ/>SKǜglC@ MK>SlC@;?l>SSPoFmC@ l]j~?S-_?mC@Wy?SPoFmC@;?l>SSlC@{נ/>SKǜglC@{>SY32]lC@ oB@?SY"lC@]M?SDׅlC@j0 ?SRlC@l]j~?S-_?mC@`oJy@SH,lC@z3j?Stѐ(mC@ uoEb@Stѐ(mC@kg{?S iQlC@::Z?S! lC@3 ?SYİØlC@z3j?SN?lC@3 ?SY32]lC@rM?SH,lC@oJy@S%/lC@uoEb@Stѐ(mC@x{>S09lC@ j)a=Sf`XlC@ Rd=>Sf`XlC@ j)a=S/lC@=SHlC@w=S%lC@~x=Sf|lC@!>S.lC@i>SKǜglC@-Ӿ>S09lC@{>SY32]lC@{נ/>SKǜglC@]z>SmēlC@Rd=>Sf`XlC@H!>Se$"lC@w=Sf|lC@!>S.lC@~x=Sf|lC@w=S%lC@,{=SZ@olC@P!>Se$"lC@!>S.lC@P-Ӿ>SuSkC@P!>S.lC@-Ӿ>S09lC@i>SKǜglC@!>S.lC@P!>Se$"lC@!GA>S1V^`kC@OU>SuSkC@-Ӿ>S09lC@pzV@SϷkC@l]j~?SY32]lC@ 3 ?SY32]lC@l]j~?Sr#lC@ԗ?SvlC@ؖ@SnkC@A$C@SkC@v^@SM1AGkC@`R||@SϷkC@zV@S[7qkC@oJy@S%/lC@rM?SH,lC@3 ?SY32]lC@sѓ?SqMvjC@!GA>SY32]lC@ {>SY32]lC@-Ӿ>S09lC@OU>SuSkC@!GA>S1V^`kC@a/>S"rl=kC@#F?SqMvjC@W@>?Sa1ZkC@_&?S[^6kC@sѓ?SyƾdkC@lC?SL…SY32]lC@HAEկt?SkC@ oB@?SY"lC@]M?SDׅlC@ oB@?SY"lC@}A?S0h!kC@e?SkC@AEկt?ShejlC@]M?SDׅlC@Xԗ?SyƾdkC@}A?ShejlC@l]j~?Sr#lC@AEկt?ShejlC@e?SkC@}A?S0h!kC@lC?SL…?Sa1ZkC@#F?SqMvjC@j`-F?SzcjC@%ZxZ?S;TSujC@e7i?SW?6ɏjC@pGR?S1$'jC@cg?SM JjC@79|҉?SkC@_&?S[^6kC@P~@S{CrjC@&@SM1AGkC@v^@SM1AGkC@v^@S0F$ -kC@&@SBkC@D2z@SkujC@~@S{CrjC@`R||@SϷkC@v^@SM1AGkC@5>@S#)ajC@pGR?S[^6kC@_&?S[^6kC@79|҉?SkC@cg?SM JjC@pGR?S1$'jC@e7i?SW?6ɏjC@,o?SgjC@P?SMajC@]R@S@ZkjC@]R@S#)ajC@5>@Sy'ejC@$@S.jC@y?SjjC@֪]?S?s֧kC@_&?S[^6kC@PD2z@Sy'ejC@$@SdkC@&@SBkC@$@SdkC@$@S.jC@5>@Sy'ejC@v^@S@ZkjC@D2z@SkujC@&@SBkC@P]R@SL^jC@e7i?SgjC@e7i?SW?6ɏjC@F?SL^jC@]R@S#)ajC@]R@S@ZkjC@P?SMajC@,o?SgjC@e7i?SW?6ɏjC@Xz?S6} jC@j`-F?SW?6ɏjC@e7i?SW?6ɏjC@%ZxZ?S;TSujC@j`-F?SzcjC@mki?SDI/jC@Kus?S6} jC@z?S撪&jC@F?SL^jC@e7i?SW?6ɏjC@H~@SK= ByiC@ǟlX@SkujC@~@S{CrjC@D2z@SkujC@v^@S@ZkjC@ǟlX@SK= ByiC@~@SMc{-jC@~@S{CrjC@xv^@SV'iC@ ?S@ZkjC@ v^@S@ZkjC@5>@Sy'ejC@]R@S#)ajC@#@SJ4*jC@+ۇ?S撪&jC@+ۇ?SiC@kg{?SRriC@ ?SkiC@Gj?S!q4iC@Tq@SV'iC@ǟlX@SK= ByiC@v^@S@ZkjC@H#@S撪&jC@F?S#)ajC@]R@S#)ajC@F?SL^jC@z?S撪&jC@+ۇ?S撪&jC@#@SJ4*jC@]R@S#)ajC@poASN:iC@ǟlX@SMc{-jC@ ~@SMc{-jC@ǟlX@SK= ByiC@ f@SYjhiC@K|%@S.uiC@n@S.uiC@YO@S:6UiC@56@SN:iC@oAS.uiC@A ASfJo jC@'|ASʧǶ jC@~@SMc{-jC@`kg{?SkiC@Kus?S撪&jC@ +ۇ?S撪&jC@z?S撪&jC@Kus?S6} jC@uX?S2jC@4_?S7-iC@ ?SkiC@kg{?SRriC@+ۇ?SiC@+ۇ?S撪&jC@`n@Ss^XhC@Tq@SK= ByiC@ ǟlX@SK= ByiC@Tq@SV'iC@Es6@Ss^XhC@;@Sw(hC@YO@S:6UiC@n@S.uiC@K|%@S.uiC@ f@SYjhiC@ǟlX@SK= ByiC@Ox N}BSHLPeC@Es6@S.uiC@YO@S:6UiC@;@Sw(hC@Es6@Ss^XhC@9cxBSHLPeC@Ox N}BSV fC@бJBS OhC@2pBSfhC@A 1{BSt_hC@O@ASڐfiC@ 1TmAS=[iC@BvfAS=[iC@XAS=[iC@oAS.uiC@56@SN:iC@YO@S:6UiC@RgoogleMaps/inst/shapes/bg11_d00.shx0000644000176200001440000000675412710215416016665 0ustar liggesusers'  qGSHLPeC@W 3:S_C@2pX`PjH:X`pnXX&HXZHp`~ H VH p P j @ :@ ~P P &@ jx P :x h"x`@2XP@&@jxPPxR`JXXHNX@H:@~*xHxnHHHR`H@FpHHj@2H~PP&`P ` P!Rx!P"""`# @#NX#X$$h$`%bX%X&`&~' x'P'(P(p)V)h*^h*+V@+,P,r`,H-"@-f.2X.H./n`/0fP0X1@1ZP12:`2@2P36x346H4x4X5ZH56Z`6H7 7H7X8FH8h8`9b:p:z;;<6p<x=&X=h=`>Rh>H? x?P?h@FX@`AXAbHAB:`BC"HCnD D`E"E@EXFFPFpGPGbhGHRpH`I*PI~`IJf`JPKHKjXKPLXLv`L8MXMrMNXNXO:HOPXPnXPPQXQz@QRBRHS@S^STvHT`U&UpV^VHW>WXX`XXXXY:YPZ"`ZhZP[F[P\h\P\X]:P]`]`^V`^p_.x_p`P`rh`Ha*aPb*`bxc Pc^cpdfxd`eFhehfhfpf`gbhHhRHh@hPi6XiHi@j"jXk"Hkn`khl>pl@lHmBPm`mnoXovpoHp6pPqXqzHq`r*@rns spt pt~XtufuHvF@v@v`w2`wzPzn8zHzX{R@{X{P|FP|H|X}B~P~r@~HpvXX.X@X*P~PHpPhRH@H.X.@XRHPpfX@`hjP@`fxhNXH@:H``N``@ZH:hXx"X~P`6XPPXBrxPBH"X~PxNX6H@JHP`NHHxbX`"8^2H~B fhH^p`h^PXp`rP`*XXvPh6`xHbPp*HXV`>`hPbPBPXH>xHpz``BRgoogleMaps/inst/shapes/sids.shx0000644000176200001440000000160414025150767016427 0ustar liggesusers' U @@ ?RyKB@O2&L^(V2bHP P V H F  Jx.f2H~hn`~R(~zn @ !"2#F($r%%0&P'B(6()++-*.P/r0R:1x3 34 5678tp88:$;(<<<=>0?@ABC|DEXFxG4H(I,J@JKLlMN8OPnRQRhST UV"(WN XrYFRgoogleMaps/inst/shapes/sids.dbf0000644000176200001440000004160214025150767016362 0ustar liggesusersgdWAREAN PERIMETERN CNTY_N CNTY_IDN NAMEC FIPSCFIPSNONCRESS_IDNBIR74N SID74N NWBIR74N BIR79N SID79N NWBIR79N  0.114 1.442 1825 1825Ashe 37009 37009 5 1091.000000 1.000000 10.000000 1364.000000 0.000000 19.000000 0.061 1.231 1827 1827Alleghany 37005 37005 3 487.000000 0.000000 10.000000 542.000000 3.000000 12.000000 0.143 1.630 1828 1828Surry 37171 37171 86 3188.000000 5.000000 208.000000 3616.000000 6.000000 260.000000 0.070 2.968 1831 1831Currituck 37053 37053 27 508.000000 1.000000 123.000000 830.000000 2.000000 145.000000 0.153 2.206 1832 1832Northampton 37131 37131 66 1421.000000 9.0000001066.000000 1606.000000 3.000000 1197.000000 0.097 1.670 1833 1833Hertford 37091 37091 46 1452.000000 7.000000 954.000000 1838.000000 5.000000 1237.000000 0.062 1.547 1834 1834Camden 37029 37029 15 286.000000 0.000000 115.000000 350.000000 2.000000 139.000000 0.091 1.284 1835 1835Gates 37073 37073 37 420.000000 0.000000 254.000000 594.000000 2.000000 371.000000 0.118 1.421 1836 1836Warren 37185 37185 93 968.000000 4.000000 748.000000 1190.000000 2.000000 844.000000 0.124 1.428 1837 1837Stokes 37169 37169 85 1612.000000 1.000000 160.000000 2038.000000 5.000000 176.000000 0.114 1.352 1838 1838Caswell 37033 37033 17 1035.000000 2.000000 550.000000 1253.000000 2.000000 597.000000 0.153 1.616 1839 1839Rockingham 37157 37157 79 4449.00000016.0000001243.000000 5386.000000 5.000000 1369.000000 0.143 1.663 1840 1840Granville 37077 37077 39 1671.000000 4.000000 930.000000 2074.000000 4.000000 1058.000000 0.109 1.325 1841 1841Person 37145 37145 73 1556.000000 4.000000 613.000000 1790.000000 4.000000 650.000000 0.072 1.085 1842 1842Vance 37181 37181 91 2180.000000 4.0000001179.000000 2753.000000 6.000000 1492.000000 0.190 2.204 1846 1846Halifax 37083 37083 42 3608.00000018.0000002365.000000 4463.00000017.000000 2980.000000 0.053 1.171 1848 1848Pasquotank 37139 37139 70 1638.000000 3.000000 622.000000 2275.000000 4.000000 933.000000 0.199 1.984 1874 1874Wilkes 37193 37193 97 3146.000000 4.000000 200.000000 3725.000000 7.000000 222.000000 0.081 1.288 1880 1880Watauga 37189 37189 95 1323.000000 1.000000 17.000000 1775.000000 1.000000 33.000000 0.063 1.000 1881 1881Perquimans 37143 37143 72 484.000000 1.000000 230.000000 676.000000 0.000000 310.000000 0.044 1.158 1887 1887Chowan 37041 37041 21 751.000000 1.000000 368.000000 899.000000 1.000000 491.000000 0.064 1.213 1892 1892Avery 37011 37011 6 781.000000 0.000000 4.000000 977.000000 0.000000 5.000000 0.086 1.267 1893 1893Yadkin 37197 37197 99 1269.000000 1.000000 65.000000 1568.000000 1.000000 76.000000 0.128 1.554 1897 1897Franklin 37069 37069 35 1399.000000 2.000000 736.000000 1863.000000 0.000000 950.000000 0.108 1.483 1900 1900Forsyth 37067 37067 3411858.00000010.0000003919.00000015704.00000018.000000 5031.000000 0.170 1.680 1903 1903Guilford 37081 37081 4116184.00000023.0000005483.00000020543.00000038.000000 7089.000000 0.111 1.392 1904 1904Alamance 37001 37001 1 4672.00000013.0000001243.000000 5767.00000011.000000 1397.000000 0.180 2.151 1905 1905Bertie 37015 37015 8 1324.000000 6.000000 921.000000 1616.000000 5.000000 1161.000000 0.104 1.294 1907 1907Orange 37135 37135 68 3164.000000 4.000000 776.000000 4478.000000 6.000000 1086.000000 0.077 1.271 1908 1908Durham 37063 37063 32 7970.00000016.0000003732.00000010432.00000022.000000 4948.000000 0.142 1.640 1913 1913Nash 37127 37127 64 4021.000000 8.0000001851.000000 5189.000000 7.000000 2274.000000 0.059 1.319 1927 1927Mitchell 37121 37121 61 671.000000 0.000000 1.000000 919.000000 2.000000 4.000000 0.131 1.521 1928 1928Edgecombe 37065 37065 33 3657.00000010.0000002186.000000 4359.000000 9.000000 2696.000000 0.122 1.516 1932 1932Caldwell 37027 37027 14 3609.000000 6.000000 309.000000 4249.000000 9.000000 360.000000 0.080 1.307 1936 1936Yancey 37199 37199100 770.000000 0.000000 12.000000 869.000000 1.000000 10.000000 0.118 1.899 1937 1937Martin 37117 37117 59 1549.000000 2.000000 883.000000 1849.000000 1.000000 1033.000000 0.219 2.130 1938 1938Wake 37183 37183 9214484.00000016.0000004397.00000020857.00000031.000000 6221.000000 0.118 1.601 1946 1946Madison 37115 37115 58 765.000000 2.000000 5.000000 926.000000 2.000000 3.000000 0.155 1.781 1947 1947Iredell 37097 37097 49 4139.000000 4.0000001144.000000 5400.000000 5.000000 1305.000000 0.069 1.201 1948 1948Davie 37059 37059 30 1207.000000 1.000000 148.000000 1438.000000 3.000000 177.000000 0.066 1.070 1950 1950Alexander 37003 37003 2 1333.000000 0.000000 128.000000 1683.000000 2.000000 150.000000 0.145 1.791 1951 1951Davidson 37057 37057 29 5509.000000 8.000000 736.000000 7143.000000 8.000000 941.000000 0.134 1.755 1958 1958Burke 37023 37023 12 3573.000000 5.000000 326.000000 4314.00000015.000000 407.000000 0.100 1.331 1962 1962Washington 37187 37187 94 990.000000 5.000000 521.000000 1141.000000 0.000000 651.000000 0.099 1.411 1963 1963Tyrrell 37177 37177 89 248.000000 0.000000 116.000000 319.000000 0.000000 141.000000 0.116 1.664 1964 1964McDowell 37111 37111 56 1946.000000 5.000000 134.000000 2215.000000 5.000000 128.000000 0.201 1.805 1968 1968Randolph 37151 37151 76 4456.000000 7.000000 384.000000 5711.00000012.000000 483.000000 0.180 2.142 1973 1973Chatham 37037 37037 19 1646.000000 2.000000 591.000000 2398.000000 3.000000 687.000000 0.094 1.307 1979 1979Wilson 37195 37195 98 3702.00000011.0000001827.000000 4706.00000013.000000 2330.000000 0.134 1.590 1980 1980Rowan 37159 37159 80 4606.000000 3.0000001057.000000 6427.000000 8.000000 1504.000000 0.168 1.791 1984 1984Pitt 37147 37147 74 5094.00000014.0000002620.000000 6635.00000011.000000 3059.000000 0.106 1.444 1986 1986Catawba 37035 37035 18 5754.000000 5.000000 790.000000 6883.00000021.000000 914.000000 0.168 1.995 1988 1988Buncombe 37021 37021 11 7515.000000 9.000000 930.000000 9956.00000018.000000 1206.000000 0.207 1.851 1989 1989Johnston 37101 37101 51 3999.000000 6.0000001165.000000 4780.00000013.000000 1349.000000 0.144 1.690 1996 1996Haywood 37087 37087 44 2110.000000 2.000000 57.000000 2463.000000 8.000000 62.000000 0.094 3.640 2000 2000Dare 37055 37055 28 521.000000 0.000000 43.000000 1059.000000 1.000000 73.000000 0.203 3.197 2004 2004Beaufort 37013 37013 7 2692.000000 7.0000001131.000000 2909.000000 4.000000 1163.000000 0.141 2.316 2013 2013Swain 37173 37173 87 675.000000 3.000000 281.000000 883.000000 2.000000 406.000000 0.070 1.105 2016 2016Greene 37079 37079 40 870.000000 4.000000 534.000000 1178.000000 4.000000 664.000000 0.065 1.093 2026 2026Lee 37105 37105 53 2252.000000 5.000000 736.000000 2949.000000 6.000000 905.000000 0.146 1.778 2027 2027Rutherford 37161 37161 81 2992.00000012.000000 495.000000 3543.000000 8.000000 576.000000 0.142 1.655 2029 2029Wayne 37191 37191 96 6638.00000018.0000002593.000000 8227.00000023.000000 3073.000000 0.154 1.680 2030 2030Harnett 37085 37085 43 3776.000000 6.0000001051.000000 4789.00000010.000000 1453.000000 0.118 1.506 2032 2032Cleveland 37045 37045 23 4866.00000010.0000001491.000000 5526.00000021.000000 1729.000000 0.078 1.384 2034 2034Lincoln 37109 37109 55 2216.000000 8.000000 302.000000 2817.000000 7.000000 350.000000 0.125 1.601 2039 2039Jackson 37099 37099 50 1143.000000 2.000000 215.000000 1504.000000 5.000000 307.000000 0.181 1.980 2040 2040Moore 37125 37125 63 2648.000000 5.000000 844.000000 3534.000000 5.000000 1151.000000 0.143 1.887 2041 2041Mecklenburg 37119 37119 6021588.00000044.0000008027.00000030757.00000035.00000011631.000000 0.091 1.321 2042 2042Cabarrus 37025 37025 13 4099.000000 3.000000 856.000000 5669.00000020.000000 1203.000000 0.130 1.732 2044 2044Montgomery 37123 37123 62 1258.000000 3.000000 472.000000 1598.000000 8.000000 588.000000 0.103 1.461 2045 2045Stanly 37167 37167 84 2356.000000 5.000000 370.000000 3039.000000 7.000000 528.000000 0.095 1.471 2047 2047Henderson 37089 37089 45 2574.000000 5.000000 158.000000 3679.000000 8.000000 264.000000 0.078 1.202 2056 2056Graham 37075 37075 38 415.000000 0.000000 40.000000 488.000000 1.000000 45.000000 0.104 1.548 2065 2065Lenoir 37107 37107 54 3589.00000010.0000001826.000000 4225.00000014.000000 2047.000000 0.098 1.389 2067 2067Transylvania 37175 37175 88 1173.000000 3.000000 92.000000 1401.000000 4.000000 104.000000 0.091 1.470 2068 2068Gaston 37071 37071 36 9014.00000011.0000001523.00000011455.00000026.000000 2194.000000 0.060 1.036 2071 2071Polk 37149 37149 75 533.000000 1.000000 95.000000 673.000000 0.000000 79.000000 0.131 1.677 2082 2082Macon 37113 37113 57 797.000000 0.000000 9.000000 1157.000000 3.000000 22.000000 0.241 2.214 2083 2083Sampson 37163 37163 82 3025.000000 4.0000001396.000000 3447.000000 4.000000 1524.000000 0.082 1.388 2085 2085Pamlico 37137 37137 69 542.000000 1.000000 222.000000 631.000000 1.000000 277.000000 0.120 1.686 2088 2088Cherokee 37039 37039 20 1027.000000 2.000000 32.000000 1173.000000 1.000000 42.000000 0.172 1.835 2090 2090Cumberland 37051 37051 2620366.00000038.0000007043.00000026370.00000057.00000010614.000000 0.121 1.978 2091 2091Jones 37103 37103 52 578.000000 1.000000 297.000000 650.000000 2.000000 305.000000 0.163 1.716 2095 2095Union 37179 37179 90 3915.000000 4.0000001034.000000 5273.000000 9.000000 1348.000000 0.138 1.621 2096 2096Anson 37007 37007 4 1570.00000015.000000 952.000000 1875.000000 4.000000 1161.000000 0.098 1.262 2097 2097Hoke 37093 37093 47 1494.000000 7.000000 987.000000 1706.000000 6.000000 1172.000000 0.167 2.709 2099 2099Hyde 37095 37095 48 338.000000 0.000000 134.000000 427.000000 0.000000 169.000000 0.204 1.871 2100 2100Duplin 37061 37061 31 2483.000000 4.0000001061.000000 2777.000000 7.000000 1227.000000 0.121 1.855 2107 2107Richmond 37153 37153 77 2756.000000 4.0000001043.000000 3108.000000 7.000000 1218.000000 0.051 1.096 2109 2109Clay 37043 37043 22 284.000000 0.000000 1.000000 419.000000 0.000000 5.000000 0.177 2.916 2119 2119Craven 37049 37049 25 5868.00000013.0000001744.000000 7595.00000018.000000 2342.000000 0.080 1.188 2123 2123Scotland 37165 37165 83 2255.000000 8.0000001206.000000 2617.00000016.000000 1436.000000 0.195 1.783 2146 2146Onslow 37133 37133 6711158.00000029.0000002217.00000014655.00000023.000000 3568.000000 0.240 2.004 2150 2150Robeson 37155 37155 78 7889.00000031.0000005904.000000 9087.00000026.000000 6899.000000 0.125 2.868 2156 2156Carteret 37031 37031 16 2414.000000 5.000000 341.000000 3339.000000 4.000000 487.000000 0.225 2.107 2162 2162Bladen 37017 37017 9 1782.000000 8.000000 818.000000 2052.000000 5.000000 1023.000000 0.214 2.152 2185 2185Pender 37141 37141 71 1228.000000 4.000000 580.000000 1602.000000 3.000000 763.000000 0.240 2.365 2232 2232Columbus 37047 37047 24 3350.00000015.0000001431.000000 4144.00000017.000000 1832.000000 0.042 0.999 2238 2238New Hanover 37129 37129 65 5526.00000012.0000001633.000000 6917.000000 9.000000 2100.000000 0.212 2.024 2241 2241Brunswick 37019 37019 10 2181.000000 5.000000 659.000000 2655.000000 6.000000 841.000000RgoogleMaps/inst/shapes/sids.shp0000644000176200001440000013216414025150767016425 0ustar liggesusers' Z:U @@ ?RyKB@OmoT`B@`ZOTyKB@A^T`B@ bT"B@cT #B@ hT+B@moT&2B@lT@cVT`DB@ TT@AB@ TT=B@ QT`7B@`PT`3B@gOT0B@`ZOT@.B@`PT-B@@UT@.B@ WT`4-B@gWTf+B@ VT ]&B@`WT`#B@@ZT|$B@cZT6"B@ [T@_!B@ \TB@A^T`B@ >VT@.B@9TSIB@`ZOT@.B@gOT0B@`PT`3B@ QT`7B@ TT=B@ TT@AB@ >VT`DB@`VTSIB@9TXHB@@;T?B@@=T;B@`T2B@>T@/B@-@T`.B@AT\0B@@BT4B@`dET7B@NFT07B@@GT 6B@GHT6B@HTt5B@IT]6B@NKT@-5B@`ZOT@.B@@=TB@ TXHB@4T B@ }T B@@\"T B@"Ti#B@@w#T#B@`%TV"B@'T"B@`*T@B@,T)!B@V.T!B@.T!B@*0T!B@ 1T!B@2T`B@7TB@@7T@)B@ 8T]-B@ ,;T`/B@5=T3B@`S`xB@?S'B@ SHS B@@MSB@IS`b5B@HSm:B@ &HS@@T@/B@>T2B@5=T3B@ ,;T`/B@ 8T]-B@@7T@)B@7TB@'8T@B@K?T B@QATxB@`PzT@b B@\T&2B@ sT@b B@@LtT`B@tT4B@`jvT:B@xT@%B@ yT tB@ zT fB@@7yT,"B@`PzT`7%B@ (uT*B@`nT'*B@gmT*B@`boT`Q.B@moT&2B@ hT+B@cT #B@ bT"B@A^T`B@\T@fB@_TiB@`bT BB@ -jT@ B@ sT@b B@x &S6 B@S/B@ S6 B@]"S A B@$S# B@ &S`B@$S#B@ $S+B@`vS/B@SL B@@S`B@!SkB@S B@S6 B@ .SB@@S+B@@,S%B@`|)S@\(B@&S`Q(B@ $S+B@$S#B@ &S`B@$S# B@]"S A B@S6 B@@S`B@y!SB@ &SLB@)S iB@(S@B@+,SYB@ .SB@@,S%B@T A@nT`7%B@?|TDS A@ES`nA@@LS 3A@LS`A@`LSyA@`MSA@MSB@QSB@ -TS'B@BUSB@SS`1 B@ mOS B@zPS *B@`PS`B@`NQS@B@RSB@SS`B@OSxB@@MSB@ SHS B@?S'B@>S`xB@ /SB@0SB@f,SA@n/S`A@@,SA@ U-S A@`.SA@`x/SA@0S`A@2S`A@` USNA@޼S+B@ )SA@SNA@SA@ USA@ S`!B@@S+B@1SB@޼S`B@ )SA@ )SA@S`B@ )SA@޼S`B@S@B@ܳS`B@uS@\ B@`uSB@S#B@7SwB@@S wB@խS dB@S`A@ ES A@ SA@@ݰS A@ S A@@SA@@S`%A@ )SA@JSA@ lSB@SA@(SA@S }A@S vA@JS cA@`SB@gSB@ SB@ L~S2B@,}S B@`|SB@{SB@zS`B@xS}B@`sSbB@IsSwB@oSB@nS*B@ lS tB@ !uS `A@@vS A@wS`A@SA@ (#TA@ ~T`B@"@TA@bTA@`T DS A@BSCA@0BSA@CS@A@H@SPA@ h?S]A@;S@A@`9SA@9S 7A@ 98SA@6SA@n5S`.A@3SA@2S`A@3SA@3S+A@4SA@5S`LA@>S`7A@RJSNA@kKSA@%S`A@JSB@SA@S A@SwA@qS A@@S`%A@@SA@ S A@@ݰS A@ SA@ ES A@S`A@խS dB@@S wB@7SwB@S#B@@SB@SB@SA@ ?SUA@ S A@@SA@S\A@SA@JS cA@S A@S`A@SA@&T@7A@TB@WTcA@ ͶT@EA@@T A@@TqA@TfA@ذT A@5TB@1TB@TB@ TB@ŦT@tB@[T`MA@ wTaA@qT@|A@T@KA@,T@A@@ATA@T@0A@ TA@ TA@`TA@ TA@ dT@7A@ T *A@TA@ZTA@T`[A@` TA@ T`A@WTcA@'FT A@",T B@@.TA@1T A@`$=T*A@`tT@A@`fwT`A@TdA@@k~T`A@{TA@ zT A@yT-A@?|TtT@A@,5S|A@SA@#S|A@(SA@5S`LA@4SA@3S+A@3SA@2S`A@0S`A@`x/SA@`.SA@ U-S A@@,SA@4SA@`SWA@@S@A@S'A@ (S A@#S|A@- (SA@S@ A@ S 2A@t S\A@ SA@` SLA@ SAA@#S|A@ (S A@S'A@@S@A@`SWA@` S@ A@S@A@SA@SA@S`A@ S 2A@.0`TnA@>tTtT@A@=uTTA@uT`A@-wTA@ }T`A@@TA@PTA@xTnA@TA@'T`A@`T@nA@`TfA@1TA@T`A@ޑTIA@T@A@TXA@T1A@@TA@ETA@@8T BA@jT@A@ ~T A@`AT A@|T`A@ z|T A@}T`8A@?|TtT@A@/P@TA@kS ZA@SA@@TA@T ZA@kS@ A@S"A@SA@SA@0SOA@@SA@SA@S"A@@;S*A@SA@SNA@ )SA@@S`%A@qS A@SwA@S A@SA@^S 2A@vSTA@NS`A@|S`A@nSA@@lSA@SA@`S]A@S A@PS A@ S`wA@ )S@A@S`pA@ 8S@A@SOA@SA@1S@A@@jS `A@`.S@A@`S{A@eSlA@[S A@SA@wS`A@@vS A@ !uS `A@qS`A@RpS@A@zpS@(A@nSA@@jS@A@`lS@A@tS@A@tSA@#S@A@߃S A@`.S@A@2 1TXA@` T A@`TXA@@.TA@ 1TMA@.-T A@(TA@@&T?A@$T+A@!T@A@FT`GA@;T@vA@%TA@TdA@TqA@@JT`A@TA@c TA@` TA@`TXA@3`lS@jA@ FS A@- T^SA@J`SA@@`SA@XaSA@aSA@@,cSKA@ #dSA@hS=A@`lS@A@@jS@A@`Z`S%A@I^S@[A@]SA@S[SsA@ZS :A@YS A@@eYS A@ VS \A@PS 2A@@PS)A@`JMSA@kKSA@ZKSsA@MLS%A@`LSA@`:KSA@@KSA@.KS UA@@IS`XA@~IS`A@ GSA@ FSlA@oIS`A@KSrA@@zLS`#A@`MS`A@ eOS`A@OS VA@PSЬA@RSݯA@VS@jA@XS@%A@YS߫A@i\S`cA@ T^SA@4`aTA@;TbA@ =TA@`aT`A@_T`A@`YTHA@ XT A@ UTA@ ITbA@`%HTA@FTA@DT/A@CTPA@:@T 9A@;TNA@ =TA@5 dT A@TA@-T[A@T`aA@བྷT`HA@YTRA@T`A@ .TA@ eT@A@?T@ҸA@T@ӶA@ETA@T@A@TA@ЪTBA@T 6A@T A@T@A@ܲT A@RT0A@iT A@ T` A@TA@@T{A@dTbA@ dT@7A@ TA@`TA@ TA@ TA@T@0A@ TA@TA@TA@ T`A@`T/A@ޑTIA@T`A@1TA@`TfA@`T@nA@'T`A@TA@ DT@A@T`нA@^TA@T[A@6_SA@`.S cA@zSUA@S@A@sSA@ S $A@`SA@_S A@S`A@S A@JS cA@S vA@S }A@(SA@SA@[S A@eSlA@`S{A@`.S@A@WS@A@ SA@[SxA@`S jA@.SEA@)S@A@ ٓS`A@ચSA@S@;A@zSUA@7PT7A@T`[A@'T A@STdA@ҺT7A@ T}A@ TA@`xT@A@`T`A@ T@!A@5T`rA@TA@TA@ TA@@TA@fTA@}TA@TA@T A@TsA@ 6TA@@TA@T LA@1TA@`TA@`T+A@ +T A@T`[A@ZTA@TA@ T *A@ dT@7A@dTbA@@T{A@TA@ T` A@iT A@RT0A@ܲT A@T@A@T A@8[S@LA@ ?R@XB@R B@`{R@XB@RA@RaB@`jRqB@R B@@R`A@ R3A@[SA@9R@DA@[R5A@RFA@R`$A@R`A@@R`A@ pRA@&RiA@ ?RA@R`,A@`R@LA@BR A@`RA@@mR`AA@ pRA@9:`LS ̛A@SNA@$ FSlA@ GSA@~IS`A@@IS`XA@.KS UA@@KSA@`:KSA@`LSA@MLS%A@ZKSsA@kKSA@RJSNA@>S`7A@5S`LA@(SA@&SA@&SIA@%SA@"S` A@`6!S@A@S@YA@@(S`A@=(S A@$-S@A@ FSlA@@T'SA@@(S ^A@o6S ̛A@`r9S3A@@zLS`#A@KSrA@oIS`A@ FSlA@>S@߷A@@y,SڬA@@T'SA@:xT آA@ TsA@,tT@A@pTA@oTA@@lT=A@ ~lT`+A@kT@`A@lT7A@-oTA@pT?A@pT@[A@wT`pA@ ,~TA@> ٓStA@vsS A@qS@UA@@S`A@@yS HA@ ٓS`A@)S@A@.SEA@`S jA@[SxA@ SA@WS@A@`.S@A@߃S A@#S@A@tSA@tS@A@@(uS`9A@vsS nA@ sSમA@uS ҫA@uSA@xSՓA@9yStA@~zSzA@u|SA@}SA@`#SޗA@ VSėA@ SȕA@qS@UA@?SPA@zSA@ 7S5A@ԭSGA@ SA@S` A@SnA@gSyA@ #SPA@eSEA@S2A@SA@ S A@^S 2A@SA@S`A@_S A@`SA@ S $A@sSA@S@A@zSUA@%SA@ 7S5A@@pT`ؔA@`ST@`A@ TTA@-WT`ؔA@pT@[A@pT?A@-oTA@lT7A@kT@`A@5iTA@eT@A@dT`A@`aT`A@r`TA@`TA@ |\T@A@ ZT A@VTA@XWT@A@VT6A@qTTXA@`STA@ TTA@Ap`aT߲A@MTA@ H;T`A@@T>A@;=T߲A@ =TзA@MT>A@@TA@@@TA@@T A@@w@T`A@ATA@'CT`eA@ TTA@MTA@}T@ԲA@sT`A@ БTA@TA@tTA@T`A@T A@ؕT A@ 2TA@TYA@T@ԲA@чT@A@bTpA@ MT@\A@}TA@ ,~TA@sT`A@N`TT~A@`T@A@`T A@ T~A@TA@@hTA@T )A@ 0TQA@ETYA@TđA@`TT઒A@ T"A@:T@@A@TrA@@TA@wT آA@`ITTA@.T`\A@]A@@S` [A@HS@I\A@P`Z?S`}A@t S@A@ ^S A@=S@A@]A@@S /_A@&S^sA@SA@S`zA@qS@UA@ SȕA@ VSėA@`#SޗA@}SA@u|SA@~zSzA@9yStA@xSՓA@uSA@pS`vA@@pS ?A@QpSPA@oS PA@nS`A@ kS{A@iSuA@@&lS`/\A@Y8+TgA@$S ?A@$SgA@SigA@SmA@ S`sA@}S {A@6S`A@tSA@#SA@S A@ \SюA@yS`ÎA@kSaA@.TA@T`OA@+T{A@TA@sSLA@4SA@@S ?A@@SjA@@S@'A@SఓA@S@`A@ S?A@S`A@bS4A@ S@A@$S ȄA@SA@S ;}A@@'SxA@2S)tA@SlA@!ShA@?ShA@SgA@Z`DT~A@ TA@ T`~A@`DT~A@lTrA@T`3A@T`A@TA@`XTA@`TT઒A@TđA@ETYA@ 0TQA@T )A@@hTA@TA@ T~A@)T ~A@ T`~A@[RW^SKjA@ (S`#A@'`r9S3A@S A@`Z?SA@@nKA@iS!A@ISaA@@JS`#cA@:JSdA@qFS`fA@@DS``hA@CSShA@"CSdjA@0S@lA@ (SrA@@i)StA@@*S(|A@!S|A@`{S!A@#SyA@LSxA@S |A@@$SryA@S|dA@ (S \A@;CS vYA@ISaA@`"S>KA@#S *NA@j"SNA@SLYA@S ^aA@S hA@iSApA@`SXA@`"S>KA@``\S`.A@܊S tmA@`S`2A@S`.A@@S/A@`֨S 9A@:S9A@ȪS`;A@SG:A@S:A@ TS=A@`S@@A@SHA@iSWA@޵S^A@`\S[jA@9SlA@SkA@`S tmA@S1aA@@Sf\A@HSXA@S_WA@@S RA@ ғScQA@ySPA@S`|MA@@S@gJA@oS`FA@@ːSCA@RS@A@܊S1;A@`S`2A@a(@ːS 'A@ybSM]A@"S *A@US.A@S^.A@ЋS,A@sS@,A@`S`2A@܊S1;A@RS@A@@ːSCA@oS`FA@`SVA@GS~YA@HS@I\A@SM]A@@NS[A@|S\A@N{S@[A@@&lS`/\A@dS