RgoogleMaps/0000755000176200001440000000000013621005761012472 5ustar liggesusersRgoogleMaps/NAMESPACE0000644000176200001440000000063013620773261013716 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, sp ) #importFrom(RColorBrewer, brewer.pal) #importFrom(PBSmapping,plotPolys,calcCentroid,addPolys) #importFrom(sp,CRS, proj4string, coordinates,bbox,spTransform) RgoogleMaps/data/0000755000176200001440000000000013576425300013407 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.rda0000644000176200001440000012704413047107224016145 0ustar liggesusers7zXZi"6!X])TW"nRʟt<3n2u]o30pxgG7B ^7j(4DŌWvpv3;+;[ùvdž)VѼX9]Y*gV2EcgQxks;M1l_wL k^8nr-S:*S dq2x eg:9*!іteU 0p5vV+C:G+](;@!. q]+ 3z.Z$! F=1ȏ 3ply&N1LW!ݥ, H8Rg8|Ų"33́&M%g vC|am7ʽS!oٖw 3R%@רJˁ$sfIz^,pƯ/dFÕ:>OsjxZSgA@AkzlkKiO7Ax}vUL+r-a8nđv31g| ǢZq|U7nd;Z?ZNw $Ās/Wr(O>߭FGf[.ƜUi]J#~~$rN_T#w덁xqj_sT3/OU^~FkCD9-|*Q#L1ByG.@Eudn Xɟ6S! C!FRK2mLjKD)'K& hCYlm].Y s1FV^bq.^re‘ ?kOrм (ޣ}ڛWݓ3,M'p!)\M+8m#]PW~m.SJ- 6{Ag#ƬlҔrh蛰@E}gqS'B`W:]rsLE3("="(k@k"u~m^$K-P)\;N+ eQ* -ŠȲO+ -Wp \>',.l];Zdn@y4&gaD7%Me<\l m)ƒ)v%8^ʺΗDbgY I.F!k)-[Ic,9Hb0tmUK= 08F0乧hy [LHͿu)NMe[9mNdUϊdPMh<(М/{.F»m)gWdX0ʰ~_DBA|Qi(mM!8$c|b#.Ejl^ aɋ3ٳЀ#vJ9in#Nqd?9@DZkaN=mssyT0T`{ad5NJDqw1Bz0l$/4ToG<XԯM3՚N=}_cR־">zx,V _Yl7kܻObuLDB0UB0O}s(-^B)grGh٠ ~8 6G*#Us~$,'-UܠW;.O(u콡M1|RׄUrF-6AtXFwgdm^}] G_S~%Ѩ}TULK@6.b:DA#?x'WĘTe)٧Ru[4Htjr)aQ,_IbPTC:)FpGO& V~{pq 4ru+ KbO%e*K! V4^LIY[ :a[> %v9"N:ZEkK'ڮ\DbDNM#zU=ވ@j՛-`HW3FeQ6g Bʃo 26[VQZwB!Yncփ 3pNxȊDW =`8$K]cq.Yo 08c'G!\anMk0c4Β \ e 3'"(ȍЍn@jH>Bm\XcIs(A]ʌH5"ёUJ@;$mR|E?\t7_f=9~4!s/;LPG{dd y#/Nt/0̩Ԓ{u1~A'` fA~¹%h1Mm%#ԯBݷafkP7 asN H}*1ANhRqU:]Aax5HvRweHH:[ܫ[#0ma*e}/}*}!H>2}cŐځ+aG\$ySm;,w}x93{TXjWwFF ;2i~3Χa߉3` c+bam܈2tB{L><fz[2D.U@]zL;W6v0j<I <]fk9 2?:,RgfkH]!܌(1e{aaOI/^ݎY&aqR5nj6oa"/D,DqgRһ;y4VYK&}֋w^UfsDUG"cx9G(5>GNG i{ ehr`WrPsg]?b$* U~]̟3Ҩ>xhDؚ2 a<g!5n5na9vs–G0J ԰(P@@ZIdgC(!,j(*t8ؿt]bjqL|, 'i<_Xð(jk vKB2L-J- fy#7_-``Pȹҝ/L00Zs~֌ym[P `@vktyf*!6Vj_ʉH pGfFU6qklwFLlZ},<^}!Z 15< " n,Z HnuJ'mЖ:HN}=պ[3Q-'[d&ɬs6'|`Nס Eݏa#*)3U.%Mtbv^f]Jpܢ'x O6yP9vqivrӓo6h*#5 JiHwv# p. k+I6s $PLV k G'u!Jyqؠ)]2s[,s9L- fEMoxظN\+E$ZsHwZ  xl2ش#ye_8Y6\{"qghyǢ鎃$6zP1J˿a|s`yȫ(hFl!*VK/uu>ѷHQ ;rBwψ+`VeqDxvM"Iqr ?`?;685X1mu( O1?yiغEjd@-bY( B1+z%!KEY9aS]5ң@%)$ì7 "NeZV_\}^!,eV[P]Vɪߨ-{tuQ^-0; c7g؟|F 3uc<=@н} Ҋv9 Z.g*d’.G,߱̿SEGAi8`H bܹrڀ:3^*O+Pxk^en`J_v-Lr'@[oe&cZZǷ(<yą4F"e&LҒ+Q@X%rUKv^&XJ$\"l1 ?f-R}^m9MF@iH[P%H|YCRǰlM)c@mO$6ړm-)TU^X } :\,-:';v=U@wTO'=>\AmXϰUv'4א g80@fYB}R9Kwz% w3g].U`xmN7C4^l=S.vhw̷0:8¬J~=?Xoe? ~&!ėY8_.5l7%$;M`uͭ4uw30reV1BZrݦq?m4FN) t/!!Ѓ<8!Ⲓq`'\gjo$hGCfU|8-SZAX,?E ȓOo*dPxBy HD[#B 8~vyWJԾ'O 1*6I6?K@~VP^3Bruot GGt L_C[\ww&;r AGUWZCOU u2T,o&嚨Hi73-6g2C AS1&D5l*)@80b1f@L('N"_zDԁkɕny S9M3fſ,.8ir+0>9͌knF)\ӹu8LVCljѼz[+ w[[rf#$:s~ݠ&f:\w!WWw/2 0 ɄA6)cJL@?#b6 PIb@.Aͪ'^m@BS1 e#zcp%ʂ%f\g_7GׯBi;rԨ1;jPSv;J" _2&bX]Dj[Kf+1#h0Qsף|G5a:V!Hو"NpFT/jܮ'@3y&X 2\ ߷ kRprivmB|[E=JNӯE~ CRumSZlx=y-Cg E VxnTV^|!\u]e!樸-We$Ə6%wI(+C|X'stY(;!a\:;H/)FN5pԌ5!wUpTH 01,;>@GvqE:bx~:H,=Hk1i] )m]3਋ξ~h}'B3 `Tۯ3RM.0A ʬiO 9f^yQ*iGV2+·x䫉$FL~juf 6q# ӥ#2|̰qh<Av$%û&Lma-4:)k7 "3#s'0Z z"؍\8`z.S-`S^7}:wygO[/<&TvQ"p*#{[hqdȞt8uvuնn~rGpTcxJmLmgfBJ wr(E4!i@L >;*]71w7 -tJTaoZ;S[qh-C 1QaۖZSgKN^@ÌT:{& 3 u#3udr>ۑ~xߝpk $]zum5n 00FEYj82Oӄ$Xʷh/1ӥ9{0 Vw;?$ ɾ-I 'ކ=ԧJQ c$ {Sg`O_bg>Eo:@REE Ƙi,M ZH8r&Tn{`m`BpW ,* )iڧmy\{wY,;o%:EƢ,L ݳ eN[OЯр1K1 i$X۰Hrg=|l|Acض3/m%-bR2SIX}­5Dҧ]2e5ӌtg܎ r+FAUWGY\R6Ҥ}XS.nj/0( ]gp<*1jQoLbBjE Dkg1ETcv6j;Aw7:$?FJ p4`Zf O~%{gY۳?mߐ7#% `8<#wh4V 1.ZVH#lQ JW.E e3w ~W4| ]Kt N<2Ucxp[Q{zx"չM#ƪAF.fBpm!j5vW -`{OߠW 8> }QmFw$zA~dk]8,0; e*ül+ x7BSv0,Η/}1-]BN{ }օq]v3Sch TdC~ Drv0Rn){Dk߉Cd 4#!7 5?wNWS&Kl;ȳI; c!8ELugrWĪșAUZ_?S1:Dt.VVm玹'g:+%Z H"e 9-&OE׆CX!8'E¸a,ٓe!J&C77R!Ü_`xQ7k:8J/(5t$Q>uЇWQ{{Le<x>z G՝64^^G<\P@׬ؘfy&rfVZ~:^o^?eSn0ml/sPht}\ڐXX4.8W8$9$˗Ɋ 䃖^HY'*&c%gf2c@qqπ`z*g˓E(9>!>?gQH%L3_)ĺ%K}u#l `c p/ g/Ԇû42+z@k8"[d t̆[gmnl_חn2HwA52K2Efu;,Qcx@:@'QX=Ǿ`'>_MßXktf{. 7" # Z[(T%P$v- =}kdCx @g\D TmZ|OxT+zO D*sp*f-a ~<ߊ5;?`En )f?񇹺˃fT 9$/2[ rr㺓?}W5c3}zbZd̏0l1/2ZL!W=ZaInhyqTQ-c8 PD{vMOǣ0?AzE+6 w=P~- }gH ⚰٦32iacK܂k&R7ʆ `z'"ɒ&r8g\hTis7%Θs<IJ"ecAL=Hf>G6_U22j[PH粴۩!_[3.q 0Nb;a3ac@Kd R`zXWfDBAȊ.iRj->Z<+{P %xk^,+xgqq5| q+Żh"ѱ|!d- շʋp m.Njkݼܾ9%^d61l;1`9>varؔ.p.)sI/[rkU|5&S[n0-~ ]Q) RY? 1{q9KⰇpS,=BGcWu,cfc74=܀}=B~{:J"QqtM~_E-#'y, !8izPr= O% qwJZ/$@\{lR6ϔ扑tb{4*G qZ%Xaҩl#TM#%bM8~0J|`F9ŀ W7>7EJ$>%2S,k#/y~tĢ_%sBq_jD od ' 6fތ?IZ`p,;ܙWEZuIU}|)!j0tK`\VXu?@v2RٕʏO" h^ ] 9;PFڱqr2/}1H2bk^Uz,535YFoҘ{mE\ <c"?(EuaitzWoHe(y6gx Y{7N=vx͑Y#sJI <_ ~Ϣ`;G<PĎOlf~JV{$BXŏT_qm!^]/&3^hΆw+.6H)EY\me^4݊ _N%kkbuf_K]doȀD c B\;=ě6#=2Ŵs+y?]u] eZҀt›aᓸm̶(( 4G>wC;WQ^ebX1 wSzC¯t@T&]y[ v"smN].-@:t yagFK 8|X=.LX">ĔmoHjmzu CASOx. FxjM# XX͉A<\DE{=foȃ_%ۜ+ Jwfك(# !:Lٷ^p˜1R/OݙhڋsCW@_%Oe@u e&~d>Ub am|P[}Wrs({HX C~О1E9Yօ"z֤Iw}aꬨqIPG aUG*e 9sw o4E6xNw '+WtvsYbԽhlg%|lʾ%Ù;XT =2_ƾv5eΩՃb*'jҞYW %=Nþ6{_9J>=Mw^ n_.T\Eϲ a.̭QI*@dOv _Ji}tLu–3Pj3 ܙW6}j "qi}!s;YN-pC˟eQdME<㊮\;y2I_wJdJA֥Ll)JKĞBIP Мo?80oM6b@wNDLoc|,;3p•X9K msRB4p;OU_߶$W1CEFϋ*A+mԫaL1$kQ^ lHY1\< UV ʤPx|/ /c\_;^}dMNDyz$Dn&wQ]S \#*d)up )H:7r&LlͤbCgM^d{D`4F;T#ئdf0QH<+: 8UCL4Qr$JFEW輺@{d#< |PC(@5"1L(1z!o( iiS@ eӗyT\|0|e:,\b@A{o(`B |L3W]qaTvG#%|)Y!Z#N(~5eK/~J60#6$|q!"K ĭō8O%aDaLYfdκHg7/m鵍1֍Hs7m 6.ptf =]͞cgg5C)`JF<јMo]/+tx[辸i+wt.sDD8~jD/_9`k'hw'C냱 {Sł}(Rk{֬<=mr(Ypݤص ©g VUP=;נPF0Pd M%<; d~w<9AOAE;7+T[s<J/x5Mn)[wtHgAIݫAc5$ 4bvڊYFǢ@n^`5a>1ai,dE/pǜ}asK.ui7@KJ.|' Uw P&b"wc1kLnnq)عb9\q1H6o+؜ =v<,옏g:xBG<W,/!HyqVGg"ʮU#"  )}xup==\#*P ]QxP *BpҶK}H9QK} enMZVwtq.0_-H3^ na%نb*=j⮞a]p޼rQAsJ0ZЉ+/A7Dc 1 ,-g\6$J϶*ʉثx|&`KMLLRW#csH8%)rdeAd֖**3rw._,5y7Ddli/NN;A[xZ,#b27Ǖ1iFWh@F<GD8\zI6DژGעJzړk!fx7D ք'9׸[Rexmaq9^ER灐Oe%QOƚ8r ]{;H[i1,PyE z Ɣ;J{ܙ+VEy y k]sڽ&dȕJD?P8'?'6#7ljO?&\`NK8@~t FxR@2`_%L MQ@ ?!ƽ [* YBѫE4=רsP?X m}mDz8k㖏`_Wfo#:1o#(pq\j= Qg\ZP:"8+\&FoCՐg wNcAalTܸT8'9~?Q sLp38}qsV2&;(ޓZ@W#ĈQQ)|ITۉWեLG1*./9䠯Yfe}Iu}8ceWX#o ծToKK[mmz;o)94J*o7E]DcJucM#wFZzWR`/>su~?hxVFml}^C;;s#CLg"=w^ Mui8u ?(v>Y.&)o ڄ0zT*Yv+ii Q[J/X{S"̀X1:\]-*Yo~8]QUbBtl $5EOg?t B\2"U-+$0fu$1ON;'PVX+7w5ȄamvK6{!9p&cd.ȶE~H˳mtYɖji-;o=,O2)]''3VGI'+XF ,Dgpkdd>FݙaōfP2H E?0ڏkH輷}}O'td%sxخijJF̸x+8C|'kd:8kgU>C 8{8'3򂛞hDp N rńgU"Iv.rx Wa1,0p5,oqk~ʨحԁӆ6 Ui=v֍]$0 Sl$]hC1'DBF8zZ|֞ҋQs룷~1T8V-xrRι6Z[6tEZ6sC^CoHrV tOW}~2"WdG#ВMs˛t*t#N>BMfنr$`eå< ycŎ&bzpKNW$#m}>$Yۢ\$:hyz\Gƽ @t_nB+)G:UU9GNN[X}q33P˷j*F0er"Q<$#&/Ϙ&?%"'l(ߕ5︯X>E6e nqˤ3Ka.@MrU)y{d*]C'M U)[1$N-P,rj.NGE>v r^vWK1x׀ZV MI pl.JnkOX@ 7+#tym G;_Y{A^OZa QK8i>m FKwI_3z@m6ؔVkPw;AJ̧N_K]H)Z:rJ\Q~+]+83Ѝ$Ef\x#Jq订 [m*XR/7xjW ~ ݆*|7xiusW~rѮF21l{ 棌e\./X;)c&Ruu 8Vx_(P=*8>^8/>"/Q)~8xD®7y(|̔ѷ@ŝzLF ryޞy B0֟aۃ۾o+?Z1MBOhEĵb̜wl; jFAn)nn+\ӢABZgn_uuPr%BeBBo BSVEw #sT>&w0Cf]*ƞYqDWE?)vuPfG ҤcCU ! VAtebWjC/TbQ3a</3!"f״Q&= Y!Tnr$O 9bfg8F=eh&ZT a"cL$C1]6ilHho)Seԥ˭goJi?ƃ(_^xZ$.#gka{jam^t-ʸӢĺukAi4BmI7ս+qAM|iz^-D*û }2[8K!/kUJ@P[-! KM3:/jE&D.|,N#| 5((7Vro4OI$ ?5O'2l :J5A ",Z՜.xA0؞^d[FCFN]^ð$ݕ6G Q9OSYP̅הA0#rT^ADO\kqT/$DtY(k\b> kE@<Z?Z&Qx;*{JR+='IS6e\FL*5ͳv'%UUF41C$. ?)a] ]6I<.8OUɳt_蹡/Z% ;./K4 a2qaZ2!%ȥJblIx^P QwF!ǦNd89MH"*gy0Ku F9E ^$)Kr\T#Af\69(#/JK0ySR?=fFE7泐.*LeqLwX?|N'fU1+&At+]pl Н0򩎉"tն=1?SwlSdܦEi-5C( ؕ^Ѹe)&ΒP)c͜H4($ޞ2> Mb], ~poF,SI#D RM/;rp_ӧFa2\iډE[hi87D.tI.nZ| SZ믋;g8lF0obNg6$nw)t_-092f/hFk~uʦ;-'"q"HC26s-J1UYk<,.}tu4n"&N#hi$J̉pwkm0b9` a]Hd/X !:vf}$I$% ]ޒX1 ̷rSwQn6ihk#fK,6(7ʘ χ-8<2[q˱h -yW]#y#-Vİ 9W}#Ɯ/Qqvߊy">{s!6W-5ҾzCx?:[lc7y`[s[xsZh( %'?'?8u%2av0[¶җItH<_EH$f[)#f_E3Z=DPpgÓ[:Nc|O8H1/AM #ZsƚN!8 MiYztr|[rKKSN'̒g'\ g!X B|j`/h;HOlQFnC>1]>FZz0R[ij:in?AHaY̬ƑƶZvZvk,4Fdm"i"uewE 纨.mOQ'/?shY8 f1\$]72V^RMg錧ě.%hxFdyIf}{W(av6 A35kS h3IAvwm;OzRI]q a9I.5 "Y*CxwTigt4.m`ixcb>Svz Q*9Ҷ=ŤXf(h D\D I "&A %+X/<󳰒6WЍ)N`OlaA#䧺N?DZ>S[{${P]-?2/yE?w5aʷj IMp7̎{= $9} dx:7xِ7e,.kcvL`r!aLs ,;J8.O8Ȗa ʢ,\ F*G}5gA>:bMURǕd"ǒ4$mc`ySIa8(w֩ei&U:| ( +"0?] R ]ݘrsⳤ o 8e=yĵ8\Esl堣KI3,\#Ai>d\HRc4O(pacit=YG16Z8;ú;m(}q,4 O!*$g\¶q֐8a>4iʱ{QdLjt(x~HCUE-i )i&gn~""xpX:<9ԴechDZjbKK#WInbxv;bĜY>ْ%fb- dGg%h(5t(OMiݒ1sl . 0FBB%Gv`tZ#XPC(Iމ'xu˲j6Q_tHr5"M7_I4$7/ 3]??)&[iK4JMCW6YsRuj,>tk^G3B:mOi*+bg 5٨0@ظN`0Vu q81y+CV!%:mDmEDfZֲq6C#Ĺu ^KC8crc kP8 46!٭n9lAaFD).󝊑`I)q'{JZQ, R9*%Jo{xdFr ZhqIW' 5lɒ9L.e^\]9x-Ө\׵Nb3$pfz((g Dɺ1iQM 8ʒVRCX`Tۨ#|@5R õ]D14%%OiL`p2?x-vڦȬ]id!y'M*br 1woaqP u7ng Ne+;W~-;Y=A=lF%jӫ)=j=a'hE9@<#pQdaU8گ.?M|:BT /@Cs(P对/HKb} ϝ#3Zj[,na)B@-rɅ88l.Ƣo8Fe՚ o vζ uΓ,ꉃVLDq?bt?ykM'oN< aD;9/l^% k=2\MvmXeR'GUW;7B)fvòK]xOwPR|o2PkW&˖i@+QPu26lb\DH1U"KpAQ[Ov?m%qˠt!׷Vi,~,O߄F6D`a (W~ۭ︨!fVj%KK pX~&9'xDuN@<ƩZyl[<wH!z9:[{f REvʌ4\{)&㹅@GnbTfI`)=.3OPL'}AZ.": %.H:=!Cl-Т\y"{؛@RT0Y譸Mvˍ "tG7߄wXDvNns(Iɖ"(~@I^qMxо6c]6pM\:Aջ\rX7c X;wєz_X^srot,hzȊWD>irp r1UTn*/T?ۄJËƽhsTž_S mB-mܪtY]Yzq/B0K~ MPNᒱ`dQ.v[s!T (:;Y8d_۾[{IZTDJTJexS2σ !{[ zyX4wkKǯw\BHH,͜jn+dmBk=-[8gYЧU^6_[Sʞ\ Vw9C"3Dk2- ]PW$7ÛhuǰZ-iS4ڴ9m.XcYz^oka\)]`g'cB"NTI}_t`Pجh˞n!۔]R?sb TߡY }mS)ll.Eٵm1(A]pIdzEo:X0si{nW{lIZlWn Y|.%Wض*łrO _ fi Pl]:-r!(- I@m]Thې!Tk,gu5}X<^7Wr9h%DQ4FP].t$`?QHgj iXqFl뽪m4 &>99geKAbd![tKnyTJYJ%DkYo6:fRBG7]:?r:EsH%rlF"ٰF\lю4+Ĺf_ITs֜휖zb'(Fo7% r < .Y/;UP5YPZ*-~OB,\d@{ _Q7׺XR?[VN#g8?j5ѡ#6 UQ]T ̌?x5 Jc.>A+'nA4_zzߧL^ljmY9*M/\OxP[Kֻf5<1jsaO: ^yAhDqWGhT]-Ǝ73u%< +)sXz3?)jg,M.l{**LV n'2dxZNTU%w2v{ӸQ $A[(Gw# p}cC~e?Z[;㜸c2Rg01fL8bJ1Ne;;:*2EЂՆLL @LKU&LDGc}A'-PIÓ $6UY%|>A^ f>t/_Y?YkjL@Ej`^En Q`9^ i&0jDWiv\WD(e-ہ*{C_^DcS \?ZyVh8l_UR`Pc3t|J+QfW_ky`ȆZ@ qjƤZKUЯ|,T4 J}Vw=0Ƌڲϭs+̲oƲPs Bjv^L" $gwkȃF+rgkun (3MvR"(Y^H,$v7 OK-`ηSGu [@:*8Z0euAVՆ LiLl!/%SONu,D#+.8&*֊[:ؑ㩞}ǔSQqϹaPLQ9c*v C yi&[X3C%PʯWB债ܓaK]mRS|`/d!6gEMĺ%`T" Kˣyzfs;][6NV$Aﵡ!t,ןfmMrBs7G$ i?DFܽ-Ϳ[(DZ8bO{s4𘏃 BDݥ(E}xElx{G}>VJ(a2]:m)L0\c4tEQ>凁h49z1wtZ>21nרs9ŗ;&Q\f38sYpJ"Qp~{{ χI4Ts=)ZarE)#qa(+AȑʌjDXcGBe%7^Km/leF!wfˆv\5ǵ˖.@?ZwxkYnoT<_.X8{7BuG̨cN*q} uAԈgJ MhF=`[\cK՟m7D@fk Ǭ$jî^a&ңw@a?.-HH6=wVDTO0 s~[F ݞ^'L ;xnQ9_עn2$Tr+{Wdi쫡Q3`G?=&td0RHaLhe Jۦ_AF!BxӹE|qh _Bc-z2H )ZCu20Gys@6e!fLь/lfL/ Gvurpo 6Dh1rF܇XeO޷֯Y]lZӖܣ ֠|3鏾۞ y Hqb.?fӆ4Qi\q eY&2mˎw2Fe & w?kF?&yެwch(9"arm!b&8u}sFr5hՊ$J;/3A|?ZP> ߳ VȠL vЁ4޶!xmM ;5C*i!iXa7b0Zaꄣ xfD+A"틿衅fO,Y~K!"/% ZGccT*q`j{{$nK|v0ԄXl}0 5XN{ !h,S`<h'|00bʭ۲iҏdwW!$iH͎3_&/CN$yme zN4&| @ƃLQsQ2c^lrv:@2Յ΄?Li,(}1P4!2v{c(Va=MHWEw *n1KnMrth@Mt>-X!qVzPrGė7<~e@k?g aWo G72@gk3r@EՕGՀY`2=Mt(Wohq4 #Wq l\3g&\[˔Ye3qPvˠLzPbHafK]";:X\ G #!B ^f!hꀲ(O80EZ'Fpohi"Xm ĢǎuF"% iOke1PU4%ՑMS8 t\:l68W#5ð7ii&f+Ouw}eBPUI[ e({ˋHf{q>H͆`LޒQQS?BPm^ Wqv+iN\5ߖ5f{/h=|ݥXLc.ykBr:+DvX^4}.h>{3֠lh 8 Vc;Yդ LQ6AP `aXȭQ"B<.WXöE]j"c2 R<9r?vHBh/LQV6U l`>)rlcr!b;U0DМ}.'H}"Ck-hYB9ȗi?Y 3qV>ø-:[&pB9F_xxur8=cVYb%nBZ,l>ZQT V.xGƕx>K9Np0zSwg?]dJ" @^"QQZO:>5on?y Rc_چ؊US$3Ws>mBBk̴2II?W.tN&bnNP = v)dzeM:_OTq* {4f> CmiG9]u2)MdQah̃KJME]Zy ݧd(*,R_is_0mgef=G< mp6`HI$p*SHo0]Z ڌ=d`u F"L)mXKө\\YD/Bbw`ݻ7,ԍ%Ph2*h(K-0\DŽ܅#ON&LS#(^1˂yjOz `ywQjHZY(Ga/nᄭ36ncz^N"C==<ۄIo /bf,@6@ r,aCӶŁRf]DSSumbN8>zyDr0%U/3j0Kٰx|<ss^r іWʒv)n&.^ =Қ&)YUQڍ*}pT$q {;Ji/>x]aEjBAd{$̴% x@ OƇ?ƫ=jذGتBGw;{y?U;fNju2$Q¿d7 jHRM|h~S\zm;KʁM Ҍ?D& Pr 0~aOюw<37k$^MG5#ҷh>˄JyPpmjNoڕ;jB$E_1Z"Hoc>B͢# K5q;Jh$Kc_QDY]tkB\ hwF[3e$ IjDt1lzh.yw/zWu/DhMԣ\ NKs AUByhHX§}㪎tL˹;[$ ! ( L%1[P{,Sf߯V!˷ƾ #r~h]ESB]_$/6T؆c՛F:cv:f o UU=UU>bg #l[X{P*OX4YڸL.e.$]rZ~PY^(N.$Bl''?3A^⨽N)'t`P)En؟yvcPuBԝܟj2R|n"DѬGMG`֓̅-=xnf%0D"*Ҧ ;dz D dZPTv@s0 Sf4[`!k•L̹&*F{%92 7M=Z;ӡ]Nn44 ^OգAcs"q{hFª:aoD\DbT~9`G3T"18-_>mJƊ.LSٹ? dQV(xm;8AQ|:Ԕy!WK) }ڊyLplL}*FeJ)=L?~gVLsCI8ayP;J͠dW،wy'^?6>*@E):wAIM~l~Ib xZٷ~E*fx +).nIojtO:, Y;a {mS(:ĪF e0RPI}lSs %ۺ)V\#U%znh!Ҷ ȃ&~Ӥ6DԻmE <^4hK8'H;Er%e-x$KK[+ IYu4+GMs<++N}v_IvWڈqe6ZmWI-^qS}li=cӏ!)ܓP68¿& aHRtLng{aREylQ\Y{dkJlӱ6EC\ =Sni9msm5Ax 3PF,7~j7of rs'n$8O6X#pM:y^& ,יYtSJ %A1!Ԡ^󏢣P[B ç ڧ̅h72߻5:鸃!^w|5JS;Ө[bdPlY+ qD uyp+Z jm<׺%# >Q͔Clr;ߓ!FLSX 2.YF=W +zH(0ۋB6?S \=ϷJ'=!O[} ~MDN*& 3sa ߴm{A(-Ygh T$MZq˧i{|O12*:m&+p,e3h`! !č'8maa<W*~]$8Sˍ&g'|-AOESqAt5{-Gsz`R?CG[)ԙB1w&esOy((]`!9uǓqz,e w(yT~2I*6p%)%WSU* 6g4N:Hh~]r@%f|gk5za\sD1_f"[9и̳DlxQmD6ٱW#H6ħmt•F܄V!Pwt^b_ui;RG~nzPG-o?DJBjǢ[E@:U-w0XK)'F?xP[vVy.a$t7vr#: IeӋjtu nUV571hhdG@j?'_B3Fi^v ,C|8R-M m@3W5 5,ڔ/hC-.MrRJq2+nmu@lu4XL$ z,%xO G ]ó29#וN 2#ONJ 4B=ߔ,e|F%T}--q OG0<\\5O{%}r“/mҊ63Ƭ. a %А$ő۞/P^ |uCO}Q$(bGD(Iz0$5PGIN98],dAn揿 ۲VlfVMWPs/= ~\iN|d[*5<Wиɣ9Otc%@֐PΊ}  氩ZDnɗK.Z[1($ ddƐCZz +9#Vm?Ռ|7!yŲ@g,? P}A ABߘC{,\x^~ibtt~I]Im)J]>iVdi#uWA!^s"*?h&8_6d(!E4 ?N _aѕBC{M /('.#ZEȄ|\-p؅x*H\ 38 j~SnO9y as:r?i8ia0ɟhId%4WUIVz4`h _R Oߔ6 P%@3r:,Ќ~xug8tIҐr@:P6}ٝUK7G&6 aoZ+k6l0G?.O4y/d>ˆ6:)D 3 -d&ĂJՔH4r9\h]Ѷư;DX 2-.9)Ph==TER-H=ΛTa=)0"xG@s)tԩ{Y笠 #GmK='ы+'΂Nb ` ^?\Ŗ"Njm.{W#ۆ+u^;h!L#\b:e߼tЏݚ݂^,ݤ!Q7+| H<244ۖ=q_:@λz"  )b0hݫ!;yqwmscAڙWḾu=syM]Ӣe Ŝ*cקτvRa>k\ ,i'4{ ˆOMYЈaf9V[%7zѯVdft|痄me:O=xT~z9@*6c9|/φv8m:ڏMSA&vX`YQdQ٥ cv-cYk.l\)*E#o٤UDLUL l_KGdl׋YkNqE 1pL´I*QXڔiG\ DhSEyV6ad!rs5]Z@L"$#e^Nd2cMz򳦌 ½ >A#|Bx8Cm'%cx֌R6  YB@bI줐)nٕwVϴ'ֿSU~ ,gȩ夿#S*䘃 l)/x-hG'ۄe=#]_R@kx[FHb8ٮ&|)H g`[R@wP?,o͢e+ϖUcp-ʏ)y=^yE6ŒuTjS?;b.>5 w"2g6i( ƿ#Nӟ82ۤ׸2tCX/βpvih:;# ݇li݄u[!1\;Mۃa`ܚ%a˜x&wc%4XUr, L)c ߮61q&6&Bd @m`d5.4E2<4?]_O)L,~}iw΂E:`98w¬Et64WN(ȟ@-#GN\W@*1߀ 6~ǸgcCQ'U1BY'[W߀,h07w_>*_ݶu%bCQ[TFRܧ})" # p:%_dPgep0x("dtGm 0y,ʁL5ǐ9^78y-~<ώˍ'==X(~P.W4~UB&p{fP|a<u_mLjH냷տCK׵KVꠏi:!?V3P_H/Rծ gjWVod{PНI3 ԥOB&Fʗ>Ɍ"=-hMJ!<0%h1yg7󆥼 7~PҎ ' &\ԽM䴡_V  k'b1Z3_sC~DkUTKżBrdTٮ }%t^GEL{F5ʘ>>e߶ 8cP&hBis/W |9Q;o34ڬ׋Io"o6pTw~Q}͎&0RS ϶hCw,.jvԭ.5W{*7/i@7 O=2k zS0l SBۆ1ܘdCbvݫ3#!<.jVv4PBpҺ$J!E\#$3 )k x#X Ij;>=kEY.r2|qRZ⁐D gg6Os6[Ʃ%ej ckw=cWF̡H%.S81D5Lt'٣ZcqLFfbLHfo2֡`A6jPUTe5 mV `x,^EzgqބB'qghB+61P12 lGuvD}&i1'M{`TYNroPܭ&M&m>+f*-.xSgYP&Fߴ}k,0+x.>AҖf-`˹]K${TPtVVf YlaWkĕ^10vlŝ]ᐐ۹yl C_$6K-Ҳ7 z$葑!I0$.B>9-/Eͻ`,m>`DAuސG]|2@np^{z܀i)sf")"Pnȼ݂K߈د=U ڠH 5o#G_dx{r.li 6GwUt?D-YóQ[.ゅjR6#nAh9&3%rN <FqbX=YGtX0Hs,7*#7;T8%y _syO4FnH#Hճ|yίNb | luSaIǤpVn\O9o=IG6{w-9 s=R\-M PB!BY|)= vfI_]YPez{oiGA@4j=-Jz~8:Li,i[`\(A5LyTᨰ/l m*ÑxdMSX?"ٮ'sEyϙ@~EQL_*PW8h>WW([Jt\sc 3c/BsYkΐuh06p!<:;x]r?ot0*NlBa ~~L!jŹ]!o?LZdS#.6wLUI9IjK)خ$1\Z%eIKC,M)[P^zF=Ry.#:ЕhPiZ\W0r&β5Th5t.:R|"5bZUA#:,NWhc,0r!q4ʹw_9ˌlB7aX假&$yfքD  >}$.G,X%UJ|>+68*,AEFaҽ 2DNUab Ň .RE60j))w{ ̛Գx0t‘eWfa?x!O.E)TT8c.R;3h@9 J))Ȋ;zZs3F4=$ta9j_hqn1;zDݪ_.>A\uN0&Bh҃ñM,EټBAqJ66ۓgAUi` D(ߛƠW[FHd03H::yMFWZ0x*hT)τ7bn>xRDB@evu)rr $]roJ {h;@vxTS(Bu:)d7i#֮ˑ@.8Ρ1XzqKC-Z!~t6~ #-hr 근t"+{.z[-!iz*-SA-,E k83^ 6Vrʌ 3[Sg! Qq"Tq.?7qYIfW"Z*NV);¨s q+k[*.\;a:5_-ٖ6ݜc?61UeG4 ;ttQ+]!8( <d2fIzatnXdlj07Nb\\ XzZmsW|&B,s;!#j=S}_JR0 ęϩwg~{Zq$ˆEa,X3c9%ѹ xы~.' g[JW'`D vh ZNhVOQ +zrhꍗJ!e3TVHΏ2tV68C%y\EZ =].:Y! S66μ7j'sOݑ+<1 đ#y+6"R+ji~.(4#AMՃuyYP-Q LfVݸZT`ls\ 9òQw܊w AJiA]D6΁ciaO]u m6ΧVKg ^=KS$=$˺&_^LOfűyTEĔ~(Kt>P4R zh^\3Q| <UEjUgX1xP?zf#̷pW&# )T'/E@0jߝѢX,*9C ~ZZ?n}($l}"΍b`3QA©mjIVw/%~p3b`d wϵl~:pHB{K>sSAM7KhdgUL bU[w=; ->l-YrfއθZ-|tMg7B!d3Ե kMf~L0ȿo ] ]Sj,/fJmG! %ҝQkڀhw+qR<;b3|X(@<@璷(Q/ϟdmm<Ԟ<0} IX.yrpKUbuEYG [RO//e"ꓯ/Nb !?786j>$ _ lI9,2.rֺɄ07cӧ(N(6Өhαy2>S!7v` + 4$Al(`I>GjX)K&;*+`b`nϐG慘6iך-]s0CX(tC13U nv`1y~ Ćr|!Bܺ\գvY PABiݭpb I= tuQjSEzW6gFa+ v0 +>mjM>ϥto8L3 g"f]T5&qmp J3~l(@m*9EBbTbh8e]M$7&+OdgI0{u%^Y9<1>믷C!w:]z.]`1e`fRf ]eHO RL/ LBTRu*fТƲq/N~%V> 𡘯1^`{HbN&()eB\;`~.;ĪswB[MX2r TB P ,k2mJ{ DP9vAW XWD8U_6ˏxrʂʴu|knX/SagxSBКηSxT. Kv3hB[HԖ06e+ALX0G~Yirc Ƈfc8Gd6FSNJrY# N3u"s-"yJg#o1|Pχ h:@V:ЖvJ_2/N*2L1 tL."C !⿎aJ"'!uNSB ~(&C[_p;sʨFnԫbVbX/{#7+3Çz?Iu#Gҹ_YpEN7wnop-7%C P^#GcmIu2Vx0ǽYeHftTCB{m?][a>Ix&zO6ز'}p094Be/i[lKK@k`Fѣ0ń-}zzgdO'F^LtL"Hj ;9E^H 9c:feFL7]:w .cBBF1h0>0 YZRgoogleMaps/data/pennLC.rda0000644000176200001440000004005013047107225015251 0ustar liggesusers7zXZi"6!Xt?])TW"nRʟt<3n2u6,Xk9l3KyiR:cNh@3m;0qD]@YK8BI?'jswїm`ݓH?/<$;~ B׀B2_!棞G ;C\>w :L_?3P: Zx` PS얼 ` K6&LXƂd^҄YN[.:X$Nfk*!Dj!h34iy:&>V@d# 鯚'gVpԔgl)nLd7:0x=zYнj΁ tdٞO+ |^ ݠAj tr.=!lq^y1=#L:DLKFWɂx-c l? ~+X"JS2W% Zr4f/yES6BtZ8:s~.8ɨ}{i~ıOvF!"yꆒv're7-.zXrktי0uN qCP\xxT-J:$rFo˅00~Wo>]0v44r>~sZ%͉!, VGcIm]#npWG$G+Ŗf'Yf]RBzި&iF{Z؊ l9Ӗ$ dGNZcIx '|g⥟訒6Bld Z.ڼs,o*FtKN_߱Ә+gMӕnUdI^Q@3V` ڱ:DkjEq4Bij0$ԒπKdᄸ,M;r-bwx6Q×@`3ͼk'N_~ EigC_0]kH])n8Rz b*Fb3Z揩[O,^Dג?F^jna8WQ Hu8Ӕ/m\o7}E U0:&Kz`k,?hC]- _bɧc&RBoT[ZG^DX;F鳆l79[v"P27P0h_]aIq a85_K De5 7˙ɀ҃.K 7,hg5rqJ2Y|&_:ՍH}Od#ŪZ joT6 n{wNJ,~$nhT ]mZ94+MxTdon/G$F6|-|n_`J<+N?%C9PmR?DukzVZMvMdc㺪{S1>-\`u@z-IQY_VM#c9J|VMّdl7/ȽEB,F_#՞dGTnԙf".g?RH0ـa&ѐ ᦲ؁[!Mk0ÿ+F%ܸ'!Fx%3nn[@r,ZO$8 91F2|yHl+dy`ot? W#o[J 2 #>O%-8UWu7b|T]*^VIyl纤ozDdbJID֖I$}GpX/3ő %LZ㯲H0\?GU92g4@4OeMc!y#$+&V7wk=4ĽcpΞ>,|wj.@ 띏& ZZzGD"Cb$c4oJ>x1rAVRٚ[>$:xt@-yyhAOD95/l8^+nfJ7 +1>1d|<`فo!OO:;-K—94`3q3i4N?a s |*XB/uWBܱG^Dz1i>٧&hJ 墌]ۗ4m4,$hcb` 6t(pAF/!b~TzѲ+#A}(ףV O\r zq)m^bh#7i ߛB7PgȻYPBD FiN:@To=ax{ͺ)BZ@⧁WHm<#z5䪋ߋmMgzc(ͳUL \% %qVCqMhIɼ Gn{:H9q-|,IGI?]vg PPR@1Xd$_5sqN a[+$m/s8/^թ(N|Bmiٽힴ\AD^1ԑ" ;w9>5GN.%:<Dd̍ lv̭%$Z]DJ;JjLHM7޹XfR^.YYUdݼ ꠾pzMFAlk5fuYrFy g#V9֦RMnnY x78)& Qլ$-_Ȳw{ݲN-/ n)*z~Y<Х|C<~uyv'׶7rE iyQd\f8+2h i;D?{D}uʴZˈbiJV"@xA)ܧ3~ғ0f;xѵF4n_,o\joPnpumJ R,wɗǛLV\]eg-3l2aE'>('wF|_6Q'ՁHQ+2dSEnD/U]]{!qŲL߮3BW SGjXA4[8%fAߒPeDpNtJChz'(ΆCI8j@ԏKdeuʿ.Hlnm%0MSWxˎC}ͣS;}:3lj251/aɁn |@"E~APq_pjFIxr6:}{ Ó;xDDUxAi䏀6ŌnvԣF\yNa2_n%fe y:$O2XlB>JcVL^Hͩ>~I$-~0~X.[.ͅI]ϩ~p$8?` k+]p⾬&x Br9R E_Xm}a$jܷGnj3rs=`2=n]ln"da_e?sk\Aox&y^ i8!y އ XN1X'&X ^vu7߸{6p-[E$ekT$pcW8P(;RJŬþp>Vyf^RsҿNΫv$#nkE[W =|53qXՐ)B\Ԍ?iKt9-Ciz?NUA*')woǒe2 ezm7z\9-"fiw]o$\4Q{-XF}@fP'9+ɶPU$\\WٮQ‚Q{Г`ӭk'ݎ~hJhj?ir##H65rn0j*ÏLreqoO%RD`8'Vd˚Rr?"&/vl!x+">ɔi@M諌wAo Ƹ۾W12w;Li SA1=j.aytZqmiH.@Mڸ} PUن38c@ԝsIͲ٪@IBbMA_1#cŋ͉aEAr5L2Аp CVF e'M `a3b/쑢3 :%%FMatA7ĉqB[4M͹iǥչ+m-PoV_<{gPehh.xÈn`Hst o6<\z{udތzdWy-MÅn]uz%%L|3Ct1ev^ H\1Tcg309.zh3N~?lS?-h0f 9.+[?(א.eƵOlFXqk "L"-w.i9۹ ydY9C23OP k-p%Nl rOҾ *ЭCeIϔ*z6ư};+p\MpScn6Rb 閘;݇*!n`۽va-Pe[&(;B^-!ԏ#tUL댁}ApJm-h#b7K6V*89RvtCށ %a8|۽P!RDRos^Ǯ_U;x H~J=PdMn/Bn&e΃#/\uC1G|+xI -)0*ى` 5;=ut>,z<^CQDB"'QH-2`ع) K\` l}Sv6y|6M Ѡ|rV'[%6/5Qj46->)gĬC_:Q]Zah="C\`P"?*4TҠٝړȌX-sk ic7_SCFckz]n9k\ݶ Rdꩨ)h d0>IoՌ:,gIȥ/1SҦu\=ꥆ⩹DD Oq=*l? QƆ,$j$ِ/d^5vp1ikqyweE+%M/-[ߴx2֣1+ ":PXB>8KŴcqj~`޹\> jXC@k#/n^8 -lcl'yaY*@`Ɇi}vEtHv>:2~3T^$W^Rނ䌃sK@`Ӫ è^*$}vtYR@=l[!f6J}$NCp ,\99|whZÐе,I@+G"O,`3uzJ$|dRQ9F|KfHdv Q Pϑ1ޖLg BNZpq}%eMn꾀0$W?]|0 G6l2C`P%)+o2]7va+]ROjwzy]n/,1M^(,l`1\k=c.Ҋhs1?ք߿D̴*νவ|R04xRWAWD8ё p) o{o|mZ]A(€C@<9BV'?Z+BT׵6 /"J+[@vI<ԟIhuPIp.> 8:R ɯ1F?؍J)pmO8hRer) vl"dw(>9 >ꭟpV3ѷ2IZT̵ tm-8!$ 8R6)Q=D,P~wߚIB;IrK5Ƕ11 S-MWD1^UU.~ YJbzNW5~C+3,kv`>ϨOoav)ad&/&`4OL/]tkzRc/aP#L?W7Έ}5:[Yv8FUa[_:@l U$ot CY&=°HhlD 3 M"-mqY~{ЪYmdz|pq'~B P=V]BW(\ @^d:X2#Ɓút2 @̓@FydSSf]E{`=*0yrl8y#'0sp5OOɌ zp*jW6% -emp[{FW,Γɑ`v ߑrkȈk!oVB=&52&6Y{Dy+3d$_@{n%.6 wqL'~z'BKQ 9UKjit:p# [_6z$9Ͳ82 UKmCo[ #+_6G4RNX6.-xH6pQ/)5|p='a,Ӹm{0=JZU$QMoTm gK[<|AYyS'uy.mt56qg8uL81˧"; ϟ7 o-X\1tRPC@tO]s+qj,Ox%wl&,6hưb/zҍ54 Q?igGf7!a[s<(9_0}eq'JThطyrkq=& ʟvhn)D)dCݎ,T@"sSwJ$}( Ϻ%J`^'":?9~ۀʚ4mqvgGG: 7YDE3G;ڀOlc>̾9eo}$>,{c {ldL8Ek>8eZ=1{ q4[ɇ?BZ,-=c ʹw*xW zNF=S}ݙ}$ ?LR#_giA&3Y˷V M9.xybG-y^QHxƽ`ӷ' @[HSӽ2fUޮL R مi <*iJB"򤣆+I\fECR0 ıҼQG 7[-5فSCu`jFɦ H׽RGgVC}k8E;n${yX(}K@PU)QUcf3Gѣc?/at+ O-:՟ ?`7,c*ȣbctklIŜ/Ŷ~ֈ k#g6XFO7~/+Gx7jʄCf#$!l i{+ICxfnPr7B|4it)4 >ZО2-+!Ygg!uBW. W9_hQ_; )1,Ad+b7s?13`_V=)\W2 ><'Sr~먣C<+ xDYyZEEq=+h vN4[d6)x |bָ"{Np٭}n'v}>٪AuNJkmMHO[".GB*#tB cMAyvӑj)Zq|PMƻT4DOr;s״O%7okkzCٷJ`"L^*P;&NI[UDQڄ[ ɋ-IӺw]ͱ@a\en`eAFzdc YX< Z) |Ol-ݲʍE6YMG4xO<= &ZL (nPjHFa~!&`ire/iO=.!ژoYy|x:It%nn;h,Tnr> Y^v7tY&˞Alv8ВKtNAZs#N{;_Vjs~pN0Tkζzv`2 -5i{7sBi{Q ң#q}b#YF˖ΣFޓ?dJFqauFUWK# 0;:s@ G<Ԡ ]zhr M PvC(<ЯԺKwp%Gr7dƤ`KHחPTl!?m5Yw894˹ըFj, EXВkm ca]tvŶ9~c $ Smw:ra!Qgp@"ہĜS`FO'X'@x+CɐT: 'nL Jvd&1ȝh0(2}3Ň~S5/2, :qʯ)6jX6}Q!Ctt' { _SsGE\Y[aXgLQzyy?Q<.mBYWPFl`KwUȡ@oI[9 E>dXa < hOksn \ޡy}'8Aע07S"_i1E5q_сq).*+PZpWV`BnoLSzKC |%jͭU"*[VrJUx3km3@)6ՄVK998>jx0\&T6@F --Rs􅒺=/em-ȴ{ G0W O\h]Yi{eP'ж"NӢ8O4DgQR}<媾Oά,?[$-8³gclCM}MPv BTh7e=u'W^⪥a\io7º9ѰL1VlVSH1FS P[&ѣZQmFXaC$qMe C)"Љ&UJ.YFݢ(g^oUm27_ Ac|AUV5_TB4گG%9BF-0Zl  s$y!6EH H]lPf@ls1mzO xchfy鏷۰NF 7\p=eO*ɋmx.) Eu&qib>_7tGbN&٨ /{ |JS+qhrS_3x]Qo'DlbW*-l xDyxylG w  b|FL .Jԟюsk"GVQ~Y [^{IϜv i=!<#&)sny+{`bN0A[Ɯ,X5 -E^ЪK796|ISH62#_ NDIU/?}gaV{N^[0kѠ֖/:xST#f\-p\pZp~L]Q9m?5*k5TbD LJ`R7{PQ:׭qQoV@zvjn@їЋ^=2O {%??-=%2X\bWso8K~VX%ZpкCl Д2]M |lI\zћCY bRZw юrY0bJʍ&k5*xA @@C3( v7ʭ&k Mp\\a Fg #ktL6$6`,7ZTh+0j]Ź^,\q f}Yx.2HʇlLdߏC|7c]/d}|Ofui6@ֹZk~W2Nxdo6Y:akҲ$;g.fʈMA{'7jrKz \4ɣght,DT`bp)Q=n8h:tBr ީ#rʹyA*^3QxȲQL ۜn['X0ԅkѨ kp ސI{e}"W#xѝ84=N s[`O>-Tobk QwzUr \|rY[j٤ ɝp"xDv"өUEy33" X vWxa*i#RY 3gS6)W IBIr6]j"ws$17{O|%0' IaQ0!AQKȥUa?GN7Es06YM F&Rn㵟=VmFȶĥju"/8 *9m1#RBV䥂䅞WNX?cLVbdCVJ0X$>OY'MU~ x&mwBʦt`GţX$ OO:*nעl͸xx\tV(YJH1]5վϳG}xBJ`4y}u49<Ϡ?@V0 ʂϢx[*؃Nڟ. 'tz7I>VD $Jim/Y6V8z}x&PreuK7;HVX B+}LkvoTD+T9zCgY͍,uW'xV{@BcpEL,3"Dt]Sщ F?•*[I)]dG2e xSF?uQ]>"ItcXX [ti>)ż7 ~)c0H0u}m)4֒9ylL;pCnآ{ex FS5vI5HyQ1=l 읫ñu=|h_)Ev=8I HO֡0n M =L9lW6R7|ՍpOo-&Jxe%XZC@d '!Ծk(1N̍_Gix{Ԉnvt4ZO`i ُa>{t-2k]A#zYq[;NDێvHҰڝt=!>!N@eN%u\I˸¶^x1/ "T)6O_'H+,X\lWt Spt2#Ȧ%{q%e`ͯ?OY4uxC IvȻtN83{Ơ\ YzYP33QPc2zi@DӠwhiN3V[CaR(',\= <.& O|CnJRa(5BKJ3Ӻ)Co ]w Ȼdn7ۢ./jXm5wB',`?\TK-`"8 +q$ ԭ!}yXj|w^-4iDs\zc ՝aűCdT/kZN>AlF=t L,UQ'#G'^k4i`ԅ5LjU<OүG g6UO 5tߤVj0bJ!,}zG>ZyO!q(d^=BG".qs.(nS&^_čExIe[viBog-B8,z׎ѡ/8ǬK(a )j%p{" y@h y82Dż3WE[S5&RGT{]Z 8ԽpT)m 7;H1 ǛJuIɣx .BHj^=BY5~Gx27æV 6aBQrw232]jVF7%3dz톾ӷYh;C$n3D%LdאHvI#X< i;hȰ=16?1UWvʦܑ0窸W:hW˫PW;>RŔyLi/3h%ULqWODX$UGx/Ek z*o%7Ta H MaҘBNsK} Vs**%,ghBn"w,5n }8ZU鵳5j &} "ֆT40TR&Fh^kfW+5Ap%@8M30yXite.ȂJK7͙tog Ff`H8ّ,&Q [cȐ;Lbk40&VZ}VqLXN'i_)/;b~|6/,t\?BeذW0kM-ދf{t%ܞ0\r6uw^2人hU. 3OܝPt-Z8:g!ån\`3٣"np!u^Cڨg :t{>nb%?=pCA)-۶ x'lj ",fʫC?T"wʎ'wbIN>iӉJ lSub1 8Pj6p1([M0zכYR(*m7" u52!'gC}_%^t.‚-پ :ZXgd^{]_8EPsi>K_]S80YZQ`A$pTs2 qd(,9OLmq#i|2YZĹXnc]gM ֡v6?MŎ쪀6v<µ貒t[;3L1Tn'MH!نlsڥS#+6tY!Z`,'0 d %6Bi,b!-:4 %6USt ]4`2`Bɿ2/N+.F,ccT<"#8^8&77OWX6=8,mdmIM'h_aceq4o!T̟Yw/NtᑜzA0v/'r"ŻEM ?0+TW3vVTjf* !<NA=Π[%|aFf8 C|Lଌ9b|';rZ4.D-a1^= H&tXl&Bv)K{10F%C{^ &_O ta6MBwG蓻$4pY߱ѓĨZS8M=` Vvg& 5iy[(FFo?Вu$}FvԬ|WG}k|gE "D9%SL*uD-X^NA!$=e]|'t0T6{A3e~Ubw?ms~6z%J$Ν!>UbX%[%bs`=b`sE i}is~r|0y QZ O#$qPڼ~(WaR*TVO0 YZRgoogleMaps/data/columbus.rda0000644000176200001440000003252013047107224015725 0ustar liggesusers7zXZi"6!XP5])TW"nRʟt<3n2uda?*C\Y3g=.>@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/0000755000176200001440000000000013620774554013261 5ustar liggesusersRgoogleMaps/man/GetBingMap.Rd0000644000176200001440000001246513620774347015535 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.Rd0000644000176200001440000000702713620774347017626 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=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="maptools"); shp=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); #compare the accuracy of this plot to a Google Map overlay: library(maptools); qk <- SpatialPointsDataFrame(as.data.frame(shp[, c("X","Y")]), as.data.frame(shp[, c("X","Y")])) sp::proj4string(qk) <- CRS("+proj=longlat"); tf <- "NC.counties"; SGqk <- GE_SpatialGrid(qk) png(file=paste(tf, ".png", sep=""), width=SGqk$width, height=SGqk$height, bg="transparent") par(mar=c(0,0,0,0), xaxs="i", yaxs="i");par(mai = rep(0,4)) PBSmapping::plotPolys(shp, plt=NULL) dev.off() maptools::kmlOverlay(SGqk, paste(tf, ".kml", sep=""), paste(tf, ".png", sep="")); #This kml file can now be inspected in Google Earth or Google Maps #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.Rd0000644000176200001440000000304113620774350015274 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.Rd0000644000176200001440000000316313620774347016425 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.Rd0000644000176200001440000002040313620774347014724 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.Rd0000644000176200001440000000213313620774347015554 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.Rd0000644000176200001440000000141413620774350014721 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.Rd0000644000176200001440000000272513620774347017775 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.Rd0000644000176200001440000000151513620774347017076 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.Rd0000644000176200001440000000256013620774350014660 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}{ } \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}{ } } \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/SpatialToPBS.Rd0000644000176200001440000000267013620774350016014 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.Rd0000644000176200001440000000646113620774347016600 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.Rd0000644000176200001440000000127613620774347015214 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.Rd0000644000176200001440000000426213620774347015410 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.Rd0000644000176200001440000000224313620774347015311 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/DF2SpatialPointsDataFrame.Rd0000644000176200001440000000201613620774347020402 0ustar liggesusers\name{DF2SpatialPointsDataFrame} \alias{DF2SpatialPointsDataFrame} \title{change data.frame to SpatialPointsDataFrame} \description{This function modifies an object of class data.frame to one of class SpatialPointsDataFrame} \usage{DF2SpatialPointsDataFrame(x, coords = c("x", "y"), crs = sp::CRS("+init=epsg:28992"))} \arguments{ \item{x}{data frame to be converted} \item{coords}{which columns are coordinates} \item{crs}{projection scheme} } \value{the new object of class SpatialPointsDataFrame} \author{Markus Loecher} \examples{ if (requireNamespace("sp", quietly = TRUE)) { data("meuse", package = "sp", envir = environment()) meuseSP = DF2SpatialPointsDataFrame(meuse) sp::plot(meuseSP, asp = 1, cex = 4 * meuse$zinc/max(meuse$zinc), pch = 1, col = as.numeric(meuse$ffreq)+1 ) data("meuse.riv", package = "sp", envir = environment()) lines(meuse.riv) } else { print("package sp must be installed for this example") } } RgoogleMaps/man/geosphere_mercator.Rd0000644000176200001440000000123013620774347017421 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/bubbleMap.Rd0000644000176200001440000000530513620774347015444 0ustar liggesusers\name{bubbleMap} \alias{bubbleMap} \title{Create a bubble plot of spatial data on Google Maps} \description{This function creates a bubble plot of spatial data, with options for bicolour residual plots.} \usage{bubbleMap(SP, coords = c("x", "y"), crs = sp::CRS("+proj=longlat +datum=WGS84"), map, filename = "", zcol = 1, max.radius = 100, key.entries, do.sqrt = TRUE, colPalette = NULL, strokeColor = "#FFAA00", alpha = 0.7, strokeWeight = 1, LEGEND = TRUE, legendLoc = "topleft", verbose = 0)} \arguments{ \item{SP}{object of class data.frame or \link[sp]{SpatialPointsDataFrame-class} with associated coordinate reference systems} \item{coords}{names of coordinate columns} \item{crs}{coordinate reference systems} \item{map}{map object; if missing map is downloaded from server} \item{filename}{filename to save the map under, IF map object not given} \item{zcol}{variable column name, or column number after removing spatial coordinates from x@data: 1 refers to the first non-coordinate column} \item{max.radius}{value for largest circle (the plotting symbols) in metre, circumcircle of triange or quadrangle (square)} \item{key.entries}{value for largest circle (the plotting symbols) in metre, circumcircle of triange or quadrangle (square)} \item{do.sqrt}{logical; if TRUE the plotting symbol area (sqrt(diameter)) is proportional to the value of the z-variable; if FALSE, the symbol size (diameter) is proportional to the z-variable} \item{colPalette}{colours to be used to fill plotting symbols; numeric vector of same size like key.entries colours to be used to fill features depending on attribute} \item{strokeColor}{the color to draw the border of circle (the plotting symbols)} \item{alpha}{the fill opacity between 0.0 and 1.0} \item{strokeWeight}{the stroke width in pixels} \item{LEGEND}{logical; if TRUE add bubbleLegend} \item{legendLoc}{the x and y co-ordinates to be used to position the legend. They can be specified by keyword or in any way which is accepted by \code{legend}} \item{verbose}{level of verbosity} } \value{################################################################## map structure or URL used to download the tile.} \author{Markus Loecher} \examples{ if (0) { data(lat.lon.meuse, package="loa", envir = environment()) map <- GetMap(center=c(lat=50.97494,lon=5.743606), zoom=13, size=c(480,480),destfile = file.path(tempdir(),"meuse.png"), maptype="mobile", SCALE = 1); par(cex=1.5) bubbleMap(lat.lon.meuse, coords = c("longitude","latitude"), map=map, zcol='zinc', key.entries = 100+ 100 * 2^(0:4)); } } RgoogleMaps/man/ReadMapTile.Rd0000644000176200001440000000113413620774350015670 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.Rd0000644000176200001440000000110413620774347015136 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.Rd0000644000176200001440000000621013620774347015655 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.Rd0000644000176200001440000000170213620774347015630 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.Rd0000644000176200001440000000065113620774347015607 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.Rd0000644000176200001440000000077013620774347015767 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}{ } \item{raster}{ } \item{verbose}{level of verbosity} \item{\dots}{further arguments to be passed to \code{rasterImage}} } \value{returns nothing} \author{Markus Loecher} RgoogleMaps/man/columbus.Rd0000644000176200001440000000506612710215416015372 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.Rd0000644000176200001440000000470313620774350015562 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.Rd0000644000176200001440000000375713620774347015300 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.Rd0000644000176200001440000000411113620774350016566 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.Rd0000644000176200001440000000167213620774350014651 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.Rd0000644000176200001440000000104613620774347016237 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.Rd0000644000176200001440000000453213620774347015230 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.Rd0000644000176200001440000001135113620774347015727 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.Rd0000644000176200001440000000123113620774347016515 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.Rd0000644000176200001440000000245413620774347016272 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}{ } \item{lon}{ } \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.Rd0000644000176200001440000000356613620774347016141 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.Rd0000644000176200001440000000153713620774347015312 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.Rd0000644000176200001440000000141613620774347015107 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}{ } \item{removeMargin}{ } \item{verbose}{level of verbosity} \item{\dots}{further arguments to be passed to \code{rasterImage}} } \value{returns map object invisibly } \author{Markus Loecher} RgoogleMaps/DESCRIPTION0000644000176200001440000000150513621005761014201 0ustar liggesusersPackage: RgoogleMaps Type: Package Title: Overlays on Static Maps Version: 1.4.5.3 Date: 2020-02-12 Depends: R (>= 2.10) Imports: graphics, stats, utils, grDevices, methods, png,sp Suggests: PBSmapping, maptools, loa, 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: 2020-02-12 13:11:09 UTC; loecherm Date/Publication: 2020-02-12 14:30:09 UTC RgoogleMaps/NEWS0000644000176200001440000000222612767016327013205 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 offlineRgoogleMaps/R/0000755000176200001440000000000013620774555012710 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.R0000644000176200001440000002654713603575343015222 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 (class(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 (class(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/bubbleMap.R0000644000176200001440000002070613370570667014731 0ustar liggesusersbubbleMap <- structure(function#Create a bubble plot of spatial data on Google Maps ### This function creates a bubble plot of spatial ### data, with options for bicolour residual plots. ( SP, ##<< object of class data.frame or \link[sp]{SpatialPointsDataFrame-class} with associated coordinate reference systems coords=c("x", "y"), ##<< names of coordinate columns crs=sp::CRS("+proj=longlat +datum=WGS84") , ##<< coordinate reference systems map, ##<< map object; if missing map is downloaded from server filename = "", ##<< filename to save the map under, IF map object not given zcol = 1, ##<< variable column name, or column number after removing spatial coordinates from x@data: 1 refers to the first non-coordinate column max.radius = 100, ##<< value for largest circle (the plotting symbols) in metre, circumcircle of triange or quadrangle (square) key.entries, ##<< value for largest circle (the plotting symbols) in metre, circumcircle of triange or quadrangle (square) do.sqrt = TRUE,##<< logical; if TRUE the plotting symbol area (sqrt(diameter)) is proportional to the value of the z-variable; if FALSE, the symbol size (diameter) is proportional to the z-variable # add = FALSE, ##<< logical; if TRUE the result of the function will be a list stored as variable in R. It is possible to combine more layers in the one plot, previously saved output from plotGoogleMaps should be given in the previousMap attribute. # previousMap = NULL,##<< colPalette = NULL, ##<< colours to be used to fill plotting symbols; numeric vector of same size like key.entries strokeColor = "#FFAA00", ##<< the color to draw the border of circle (the plotting symbols) alpha = 0.7, ##<< the fill opacity between 0.0 and 1.0 strokeWeight = 1, ##<< the stroke width in pixels LEGEND = TRUE, ##<< logical; if TRUE add bubbleLegend legendLoc = "topleft", ##<< the x and y co-ordinates to be used to position the legend. They can be specified by keyword or in any way which is accepted by \code{legend} verbose =0 ##<< level of verbosity ){ #################################################################### if (missing(key.entries)) key.entries = round(quantile(SP@data[,zcol], (1:5)/5),1) PolyCol <- function#Create list of colors depending on attribute data. (for bubbleMap) (attribute, ##<< vector of attribute data colPalette=NULL, ##<< colours to be used to fill features depending on attribute at ##<< values at which colours will change ) { # attribute=soil.ll@data$ID pal<-colorRampPalette(c( "green", "orange","brown"), space = "Lab") if(!is.numeric(attribute)){ attribute<-as.factor( attribute)} if(length(colPalette)==1) { x<- rep(colPalette,length(attribute)) col.data<-list(cols=as.character(substr(x,1,7)),col.uniq=colPalette, att=ifelse(!is.factor(attribute),paste("[",min(attribute)," , ",max(attribute),"]",sep=""), " ")) return(col.data) } if(is.null(colPalette) ){ colPalette<-pal(min(10,length(attribute) ) ) }else{ xx<-colPalette<-as.character(substr(colPalette,1,7)) } if(is.factor(attribute)){ if(length(colPalette)!=nlevels(attribute)) { xx<-colPalette<- as.character(substr(pal(nlevels(attribute)),1,7)) } x<-factor(attribute,labels=colPalette) col.data<-list(cols=as.character(substr(x,1,7)),col.uniq=colPalette, att=levels(attribute) ) return(col.data) }else{ bre<-quantile(attribute, seq(1,length(colPalette))/length(colPalette)) breakss<-factor(c(min(attribute),bre)) break_unique<-as.numeric(levels(breakss)) if(length(colPalette)>=length(break_unique)){ colPalette<-colPalette[1:length(break_unique)] } else{ colPalette<- as.character(substr(colPalette[1:length(break_unique)-1],1,7))} atr<-cut(attribute, break_unique ,include.lowest = TRUE, dig.lab=6) x<-factor(atr,labels=colPalette[1:(length(break_unique)-1)] ) col.data<-list(cols=as.character(substr(x,1,7)),col.uniq=colPalette, att=levels(atr) ) return(col.data) } ###The function provide list of colors (cols), unique colors (col.uniq), levels of attribute (att),attribute breaks (brks). } #require(rgdal) if (class(SP) == "data.frame") { #SP = DF2SpatialPointsDataFrame(SP, coords=c("x", "y")) nameOfSP = deparse(substitute(SP)) z = SP[, zcol] ll = SP[, coords] } else { stopifnot(class(SP) == "SpatialPointsDataFrame") obj = as(SP, "SpatialPointsDataFrame") data = obj@data if (NCOL(data) == 1) { z = data } else { z = data[, zcol] } SP.ll <- sp::spTransform(SP, crs) Centar = c(mean(SP.ll@bbox[1, ]), mean(SP.ll@bbox[2, ])) sw <- c(SP.ll@bbox[2, 1], SP.ll@bbox[1, 1]) ne <- c(SP.ll@bbox[2, 2], SP.ll@bbox[1, 2]) nameOfSP <- sapply(as.list(substitute({ SP })[-1]), deparse) nameOfSP <- gsub("[!,\",#,$,%,&,(,),*,+,-,.,/,:,;,<,=,>,?,@,^,`,|,~]", "_", nameOfSP) nameOfSP <- gsub("[[]", "_", nameOfSP) nameOfSP <- gsub("[]]", "_", nameOfSP) attribute = SP@data[, zcol] for (i in 1:length(SP.ll@data)) { if (identical(attribute, SP.ll@data[, i])) { attributeName <- names(SP.ll@data)[i] } } ll = SP.ll@coords } att <- rep(NA, length(ll[, 1])) att1 = "" if (filename == "") { filename <- paste(nameOfSP, ".png", sep = "") } if (min(key.entries) < 0) { ke <- abs(min(key.entries)) + key.entries + mean(key.entries) } else { ke <- key.entries + mean(key.entries) } if (do.sqrt) { scale.level <- sqrt(ke/(max(ke))) } else { scale.level <- ke/(max(ke)) } radius.level <- max.radius * scale.level breakss <- factor(c(min(z), key.entries)) break_unique <- as.numeric(levels(breakss)) if (length(unique(z)) == length(key.entries)) { zz = factor(z, labels = radius.level) radius.vector <- floor(as.numeric(as.vector(zz))) } else { zz = factor(cut(z, break_unique, include.lowest = TRUE), labels = radius.level) radius.vector <- floor(as.numeric(as.vector((zz)))) } # polyName <- paste("poly", nameOfSP, sep = "") # boxname <- paste(nameOfSP, "box", sep = "") # textname <- paste(nameOfSP, "text", sep = "") # divLegendImage <- tempfile("Legend") # divLegendImage <- substr(divLegendImage, start = regexpr("Legend", # divLegendImage), stop = nchar(divLegendImage)) # legendboxname <- paste("box", divLegendImage, sep = "") # textnameW <- paste(textname, "W", sep = "") if (strokeColor != "") { rgbc <- col2rgb(strokeColor) strokeColor <- rgb(rgbc[1], rgbc[2], rgbc[3], maxColorValue = 255) } if (!is.null(colPalette)) { rgbc <- col2rgb(colPalette) colPalette <- apply(rgbc, 2, function(x) rgb(x[1], x[2], x[3], maxColorValue = 255)) } cxx <- PolyCol(factor(zz, labels = key.entries), colPalette) plotclr <- cxx$cols plotclr = AddAlpha(plotclr,alpha) bb <- qbbox(lat = ll[, 2], lon = ll[, 1]); if (verbose>1) browser() ##download the map: if (missing(map)) map <- GetMap.bbox(bb$lonR, bb$latR, destfile = filename, maptype="mobile", SCALE = 2); PlotOnStaticMap(map, lat = ll[, 2], lon = ll[, 1], col = plotclr, cex = 3*radius.vector/max(radius.vector, na.rm=TRUE), pch = 20) if (LEGEND) { CEX = sqrt(as.numeric(key.entries)) CEX = 4*CEX/max(CEX) cxx2 <- PolyCol(factor(CEX, labels = key.entries), colPalette) LEGEND = paste0("<",as.character(key.entries)) legend(legendLoc, pt.cex=CEX,col=cxx2$cols, pch=20, legend=LEGEND) } invisible(map) ##################################################################### ### map structure or URL used to download the tile. }, ex = function(){ if (0) { data(lat.lon.meuse, package="loa", envir = environment()) map <- GetMap(center=c(lat=50.97494,lon=5.743606), zoom=13, size=c(480,480),destfile = file.path(tempdir(),"meuse.png"), maptype="mobile", SCALE = 1); par(cex=1.5) bubbleMap(lat.lon.meuse, coords = c("longitude","latitude"), map=map, zcol='zinc', key.entries = 100+ 100 * 2^(0:4)); } }) 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/DF2SpatialPointsDataFrame.R0000644000176200001440000000173412710215416017654 0ustar liggesusersDF2SpatialPointsDataFrame <- structure(function#change data.frame to SpatialPointsDataFrame ### This function modifies an object of class data.frame to one of class SpatialPointsDataFrame ( x, ##<< data frame to be converted coords = c("x", "y"),##<< which columns are coordinates crs = sp::CRS("+init=epsg:28992") ##<< projection scheme ){ #require(sp) sp::coordinates(x) <- ~x+y #c("x", "y") sp::proj4string(x) <- crs; return(x) ### the new object of class SpatialPointsDataFrame } , ex = function(){ if (requireNamespace("sp", quietly = TRUE)) { data("meuse", package = "sp", envir = environment()) meuseSP = DF2SpatialPointsDataFrame(meuse) sp::plot(meuseSP, asp = 1, cex = 4 * meuse$zinc/max(meuse$zinc), pch = 1, col = as.numeric(meuse$ffreq)+1 ) data("meuse.riv", package = "sp", envir = environment()) lines(meuse.riv) } else { print("package sp must be installed for this example") } }) 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.R0000644000176200001440000002712313540613224014777 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.R0000644000176200001440000001431413557567671014403 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 ) { 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 } .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) } 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.R0000644000176200001440000001444313603575214014505 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 (class(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.R0000644000176200001440000000505013370571167015274 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) } 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.R0000644000176200001440000001273613620773660017110 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=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="maptools"); shp=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); #compare the accuracy of this plot to a Google Map overlay: library(maptools); qk <- SpatialPointsDataFrame(as.data.frame(shp[, c("X","Y")]), as.data.frame(shp[, c("X","Y")])) sp::proj4string(qk) <- CRS("+proj=longlat"); tf <- "NC.counties"; SGqk <- GE_SpatialGrid(qk) png(file=paste(tf, ".png", sep=""), width=SGqk$width, height=SGqk$height, bg="transparent") par(mar=c(0,0,0,0), xaxs="i", yaxs="i");par(mai = rep(0,4)) PBSmapping::plotPolys(shp, plt=NULL) dev.off() maptools::kmlOverlay(SGqk, paste(tf, ".kml", sep=""), paste(tf, ".png", sep="")); #This kml file can now be inspected in Google Earth or Google Maps #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/MD50000644000176200001440000001036013621005761013002 0ustar liggesusers14534dd8b445e09cb2e482f4d838397f *DESCRIPTION f7ac21aec4b830623c342e65a2979ff6 *NAMESPACE 0c76532730d5eba1019e37ead4682ae0 *NEWS 89631468828312caf7657e01c20b4afa *R/AddAlpha.R 42ba5f758927c3744bbb2aa4deae3e06 *R/ColorMap.R e12f8b34efdf4c43d79ad595809fc9da *R/DF2SpatialPointsDataFrame.R e6e076e6f74d7666bec9c162a63769cb *R/GetBingMap.R cebd9c9ec9bf7e78790fb134e7f791cd *R/GetMap.R ef3397e4d77ce9144669877a66aea9a3 *R/GetMap.bbox.R 067f104297ede487b77c525085a0e022 *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 7de6da23a8513365e86bb60afa88b4db *R/PlotPolysOnStaticMap.R dd21f4525460d90b8ebb32e7da3be5ba *R/RGB2GRAY.R 516a44b4573aa55278458c470aacad50 *R/ReadMapTile.R fa2d188bf971e7b54d90ea7af4030c42 *R/SpatialToPBS.R cb1db91b47ccc84d934f882e3f78e246 *R/TextOnStaticMap.R c9266b92fbee256ffaf5ded75eab9d5f *R/Tile2R.R 559ff54dedb229d3acb463aad59a62db *R/XY2LatLon.R 5875c427fe5ff8cf6877e652a60065bc *R/bubbleMap.R 3533c87c584f5084a6a53a0fec2c60bf *R/degreeAxis.R dd81e2274a3fae13eba68bf8ee131c59 *R/genStaticMap.R 41405ba01ea57c24a61e8964d07992ba *R/getGeoCode.R ad9b2ce342ef9218a4ebb26923b65f4c *R/mypolygon.R a3930312621009ff9369d4ba3e5168e5 *R/plotOSM.R 35fb59dfb73d5d42827a40552dee3cef *R/plotmap.R f9bbc4277226d7c77cc69e96f002fc36 *R/qbbox.R d1e1139b42060b20198eb66688f533f6 *R/updateusr.R 5601bada69b5de8044be241a1f6e4857 *data/NYleukemia.rda 5f2362f39e9822f14dc3a7752ec5d44a *data/columbus.rda 0de6431245ce91bb131c07fa52d7e943 *data/incidents.rda f1d5296339b7d6ccfcdea3e4525ad7eb *data/pennLC.rda 304c9493f1b00020fdbfcd3e2065be57 *inst/CITATION 33327f2934f801ca2410bd38249cba43 *inst/shapes/bg11_d00.dbf 916ea4e6590eb10198eb2971c70c3cdf *inst/shapes/bg11_d00.shp 07ba4f7c7984bd3d9254566f931672b3 *inst/shapes/bg11_d00.shx 8cbfa63fc98947dabdd53e2444824b48 *man/AddAlpha.Rd a01bc610ee6aed13f9d07506a1a11293 *man/ColorMap.Rd 022d079512e49baca9658651bf00c696 *man/DF2SpatialPointsDataFrame.Rd 52c08c49a130ec965c7c5950907602b7 *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 fcba3ddb36a9f482477b08278604ba3f *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 590d35df8c984a26a5e84c090a778e93 *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 5c23eb05219dcd9d1329e7e89c91d15f *man/bubbleMap.Rd 379ea946ca7cb761714ec74c4ed6f309 *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 437ac5dde6c04d17ed9c3db9ae6e08bb *man/plotOSM.Rd 747a5b42cab00fd335238d8f99782438 *man/plotOSMtile.Rd 257e1b40f14b17c0a5dadf0785cfc49d *man/plotmap.Rd 25895a1a6d5c54ee90978cb6224a3dbd *man/qbbox.Rd 00c07c942af684530bf133682d3ce01d *man/updateusr.Rd RgoogleMaps/inst/0000755000176200001440000000000013576425237013464 5ustar liggesusersRgoogleMaps/inst/CITATION0000644000176200001440000000152712710215416014607 0ustar liggesuserscitHeader("To cite package 'RgoogleMaps' in publications use:") year <- sub("-.*", "", meta$Date) version <- meta$Version note <- sprintf("R package version %s", version) citEntry(entry = "Article", title = "{RgoogleMaps} and {loa}: Unleashing {R} Graphics Power on Map Tiles", author = personList(as.person("Markus Loecher"), as.person("Karl Ropkins")), journal = "Journal of Statistical Software", year = "2015", volume = "63", number = "4", pages = "1--18", url = "http://www.jstatsoft.org/v63/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 http://www.jstatsoft.org/v63/i04/.") ) RgoogleMaps/inst/shapes/0000755000176200001440000000000013576425237014747 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/bg11_d00.dbf0000644000176200001440000027021312710215416016607 0ustar liggesuserseAREAFPERIMETERFBG11_D00_N BG11_D00_IN STATECCOUNTYCTRACTCBLKGROUPCNAMECZLSADCLSAD_TRANSC2 8.77458979542389E-054.23206449693460E-02 2 1110010016 55 BG 4.73291402467990E-053.12724322940309E-02 3 2110010016 11 BG 8.58300000000506E-054.92671851944166E-02 4 3110010016 44 BG 3.24213772947557E-041.09555391598184E-01 5 4110010015 11 BG 2.46648059812338E-052.50762984939645E-02 6 51100100170111 BG 1.94004000000358E-052.15284274179343E-02 7 6110010016 22 BG 3.80099999999321E-052.86038077499683E-02 8 7110010016 33 BG 6.84849127434162E-053.49392049949669E-02 9 8110010015 44 BG 2.71878999999753E-052.17765541098530E-02 10 91100100170155 BG 5.09715500000008E-052.89580617737030E-02 11 101100100180111 BG 5.36070687349732E-053.79504352817502E-02 12 111100100170222 BG 4.54350000000103E-053.04822813280164E-02 13 121100100170211 BG 3.39936807918773E-052.49804780255208E-02 14 13110010015 55 BG 1.08665000000063E-044.42547585534989E-02 15 141100100180355 BG 1.13936999999870E-051.43162497028018E-02 16 151100100170166 BG 3.01529005000134E-052.64562990287497E-02 17 16110010015 33 BG 1.90750000000073E-051.79071379085912E-02 18 171100100180444 BG 2.43099999999163E-052.64638758619942E-02 19 181100100180422 BG 4.65231867550764E-052.81786984188095E-02 20 191100100140166 BG 4.84449999999109E-053.30623379293435E-02 21 201100100950522 BG 3.52000000000130E-052.68869104932424E-02 22 21110010015 66 BG 1.94526500000543E-052.04149347507381E-02 23 221100100190188 BG 5.01650000000464E-053.11632599505492E-02 24 231100100190222 BG 1.66050000000029E-051.68256294173076E-02 25 241100100180366 BG 4.37009726179105E-053.04461758989957E-02 26 25110010011 11 BG 1.81923499999632E-052.02238660240074E-02 27 261100100190177 BG 1.88299999999975E-051.77288251334369E-02 28 271100100180433 BG 3.77349999999277E-053.33342630070577E-02 29 281100100140133 BG 3.51249999999692E-052.56689501534847E-02 30 291100100140211 BG 1.79012368327625E-051.82844357672183E-02 31 301100100950544 BG 5.08734316755632E-053.57355480791872E-02 32 31110010011 55 BG 1.85073500000841E-052.06077903984114E-02 33 321100100190166 BG 3.45900000000288E-052.90150759512895E-02 34 331100100190233 BG 4.39148904705644E-053.27726784898361E-02 35 341100100950566 BG 4.59499999999613E-053.71719699141702E-02 36 351100100200177 BG 2.43227999999207E-052.20919234021953E-02 37 361100100190155 BG 2.16791399999972E-048.15646056273523E-02 38 371100100130111 BG 1.36450000000478E-051.76721189097897E-02 39 381100100200111 BG 2.53772486509263E-052.48332207356287E-02 40 391100100950711 BG 1.47999999999815E-051.81546390045059E-02 41 401100100200222 BG 9.93499999998870E-061.28031667789624E-02 42 411100100190244 BG 3.03029790509057E-052.35676759473425E-02 43 421100100100111 BG 5.91350000001701E-054.38506139840663E-02 44 431100100140222 BG 1.53659999999944E-046.24952981295867E-02 45 44110010026 22 BG 1.89174500000722E-052.18809982131449E-02 46 451100100210111 BG 1.76349999999326E-052.62689699498887E-02 47 461100100210211 BG 1.82475000000681E-051.98394276300758E-02 48 47110010011 33 BG 5.15191000000081E-053.26526927140954E-02 49 481100100130155 BG 6.78787779998247E-054.11815982908945E-02 50 49110010011 44 BG 2.72846913923763E-052.42259553497806E-02 51 501100100950822 BG 1.25199999999881E-051.44110774604274E-02 52 511100100210266 BG 1.31750000000289E-051.58099414480581E-02 53 521100100210244 BG 1.03149999999830E-051.41263959278053E-02 54 531100100210233 BG 1.39800000000037E-051.70280987587537E-02 55 541100100210222 BG 8.93000000001766E-061.27047325451994E-02 56 551100100210122 BG 8.88674999996453E-061.24308772070222E-02 57 561100100210155 BG 3.15459764771431E-052.51960593897718E-02 58 571100100100188 BG 5.34464000001011E-054.25399707455094E-02 59 581100100950844 BG 3.82288500000438E-053.53902156528784E-02 60 591100100200255 BG 1.76276499999906E-051.74446931997484E-02 61 601100100200233 BG 2.70346935223875E-053.28663838772804E-02 62 611100100950833 BG 1.38550000000071E-051.50094182451348E-02 63 621100100210133 BG 1.23100000000405E-051.40527327438224E-02 64 631100100210144 BG 5.06699999999749E-052.92023060570395E-02 65 641100100100122 BG 2.30050000000204E-052.32405906381199E-02 66 651100100130177 BG 1.88434499999723E-052.32816670630847E-02 67 66110010012 11 BG 8.59999999998232E-061.22173557745407E-02 68 671100100210255 BG 6.78185304263390E-053.38547680661499E-02 69 681100100950311 BG 1.84881500000511E-051.80434897386513E-02 70 691100100200244 BG 4.91771999999446E-052.88345094860763E-02 71 701100100220211 BG 5.15485025000123E-053.57808368716968E-02 72 711100100950111 BG 1.81400000000276E-052.05931839458970E-02 73 721100100950911 BG 1.11749999999757E-051.35146221500819E-02 74 731100100220233 BG 2.53554899999758E-052.28938061954345E-02 75 741100100950988 BG 1.05249999999557E-051.30242268813706E-02 76 751100100220144 BG 1.47600000000025E-051.54096942256472E-02 77 761100100220111 BG 3.59590235229634E-052.85530026154939E-02 78 771100100100177 BG 2.16399999999894E-052.21826600250140E-02 79 781100100950922 BG 1.78163719999902E-052.60242951750948E-02 80 79110010012 22 BG 1.52370093724041E-045.30521292762767E-02 81 801100100090177 BG 1.02878000000223E-051.31892926093660E-02 82 811100100220222 BG 1.79949999999113E-052.04195029943064E-02 83 821100100220122 BG 9.33814999999338E-054.11351101343344E-02 84 831100100130211 BG 3.58199999999920E-052.77285872383059E-02 85 841100100100166 BG 7.42149999998498E-054.03081763252644E-02 86 851100100100144 BG 2.12868000000199E-052.85724220296809E-02 87 86110010012 33 BG 2.20900000000024E-051.94055031296583E-02 88 871100100250133 BG 2.92823495000359E-052.41542122882770E-02 89 881100100250111 BG 1.44666499999821E-051.62004016550866E-02 90 891100100950144 BG 6.35419999998610E-054.05697264985376E-02 91 90110010012 44 BG 4.33889066774329E-053.46510144871239E-02 92 91110010094 11 BG 5.25604075000130E-053.07913315752371E-02 93 921100100950477 BG 1.62699000000165E-051.72901554662668E-02 94 931100100230111 BG 1.98638499999959E-052.13965015991246E-02 95 94110010024 22 BG 8.10845000000227E-061.23517280595351E-02 96 951100100230144 BG 6.55589500001275E-053.65732905216995E-02 97 961100100100211 BG 2.54132000000462E-052.44274207624502E-02 98 971100100090111 BG 1.49509499999534E-051.69667192891608E-02 99 981100100950133 BG 2.18216200000121E-045.97363482231189E-02 100 991100100230211 BG 2.45039499999905E-052.43671440836894E-02 101 1001100100950333 BG 5.49849999999484E-053.19919170016244E-02 102 1011100100950322 BG 8.89805499999681E-054.83030520388801E-02 103 102110010026 33 BG 1.12342000000362E-051.58457203768871E-02 104 103110010024 33 BG 9.01455000002372E-061.37094089676988E-02 105 1041100100230133 BG 6.59950000000131E-054.03132324829549E-02 106 1051100100950122 BG 7.43999999996275E-061.24636446751872E-02 107 1061100100230122 BG 6.55838100000750E-054.30423689885468E-02 108 107110010006 44 BG 1.34649999999972E-051.70832636219139E-02 109 108110010024 44 BG 3.22267494999584E-052.33973899343863E-02 110 1091100100250233 BG 1.47645499999841E-051.56620291149203E-02 111 1101100100250211 BG 2.39249999999525E-052.28076643319864E-02 112 111110010094 44 BG 6.95678499999519E-054.18078421511036E-02 113 1121100100090122 BG 2.33568400000855E-052.23243778287258E-02 114 113110010006 11 BG 4.94317999999438E-052.91946660885186E-02 115 1141100100950466 BG 7.02080500001034E-053.96052390633839E-02 116 1151100100130222 BG 2.61250000000712E-052.18853295668872E-02 117 116110010094 33 BG 1.72335195806061E-046.31660653312500E-02 118 1171100100090244 BG 4.71050000000802E-053.26853542175426E-02 119 118110010094 55 BG 2.21569989999060E-051.99440140861317E-02 120 1191100100100222 BG 9.78000000000957E-061.44317909520033E-02 121 120110010024 55 BG 1.55300000000136E-051.58386425314025E-02 122 1211100100250222 BG 3.22350000001026E-053.59156009488382E-02 123 1221100100270111 BG 2.51500437686708E-052.34888889968324E-02 124 123110010094 22 BG 1.77500000000663E-051.73072774037487E-02 125 1241100100280111 BG 1.08849999999605E-051.46522814964318E-02 126 125110010032 11 BG 5.81325999999827E-053.41357177704304E-02 127 1261100100080111 BG 4.64649999999400E-052.94257745630524E-02 128 127110010006 22 BG 1.81958499999996E-051.78357313127322E-02 129 128110010029 22 BG 2.76850000000065E-052.35565480227874E-02 130 129110010031 11 BG 1.33799999999934E-051.57351365184023E-02 131 130110010029 11 BG 6.15732829999383E-053.54265957966330E-02 132 1311100100090166 BG 9.71794785000341E-054.72475609736943E-02 133 1321100100080122 BG 1.04849999999768E-051.46617412641158E-02 134 133110010032 22 BG 2.49299999999959E-051.99457192578831E-02 135 1341100100930111 BG 7.14998698778668E-055.08798159591165E-02 136 1351100100910155 BG 2.12825999999586E-051.85482728502873E-02 137 1361100100930144 BG 4.03146000000631E-052.50567735235670E-02 138 1371100100930155 BG 1.76349999999881E-051.84075067449657E-02 139 138110010006 33 BG 1.31100000000106E-051.98473877688047E-02 140 1391100100270122 BG 1.84780500000481E-052.10113476783533E-02 141 1401100100070111 BG 6.61749999999461E-054.02432599948822E-02 142 1411100100050111 BG 6.07857000000152E-053.31139501724098E-02 143 1421100100920133 BG 1.49576382174610E-047.22690627077532E-02 144 1431100100910111 BG 9.16550000000793E-054.32709191462212E-02 145 1441100100080155 BG 2.65549999999559E-052.96657372925681E-02 146 1451100100270233 BG 3.63345500000167E-052.64542094327516E-02 147 1461100100070122 BG 2.21850000000356E-051.95281516940375E-02 148 1471100100280222 BG 1.37250000000200E-051.57722170557165E-02 149 148110010032 33 BG 2.01499999999966E-052.36045771384875E-02 150 1491100100050244 BG 5.01249999999287E-053.27283487136884E-02 151 1501100100090233 BG 1.78649999999780E-052.47368838110825E-02 152 1511100100270222 BG 8.61499999997573E-061.22044976400826E-02 153 1521100100270211 BG 5.58314500000434E-052.98271738408700E-02 154 153110010004 11 BG 2.15041499999902E-051.87120048161021E-02 155 154110010030 11 BG 4.00699999999476E-053.94306332382817E-02 156 1551100100050233 BG 1.53124459982223E-045.80314335741744E-02 157 156110010090 11 BG 1.32149999999627E-051.64145799961973E-02 158 157110010032 44 BG 3.23599999999119E-052.69794370205784E-02 159 1581100100930133 BG 4.22500000003389E-061.03753019801232E-02 160 159110010031 22 BG 8.03449999999366E-053.61349064481048E-02 161 160110010034 22 BG 2.07920500000514E-052.40902349151589E-02 162 1611100100930277 BG 2.75150000000335E-052.56599327831158E-02 163 162110010039 22 BG 2.54599999999772E-052.31611429836972E-02 164 1631100100910211 BG 1.05300149999835E-044.79149441960175E-02 165 164110010004 22 BG 9.13424375000305E-056.24893120305601E-02 166 1651100100910133 BG 1.25799999999383E-051.97145071968070E-02 167 166110010039 11 BG 4.19849999999666E-052.64317357892234E-02 168 1671100100920355 BG 1.23899999999529E-051.43983569908515E-02 169 168110010035 11 BG 2.37849999999845E-052.15949794475186E-02 170 169110010038 11 BG 3.29813000000262E-052.30966064013865E-02 171 170110010036 11 BG 2.60850000000229E-052.31360900835008E-02 172 1711100100330111 BG 2.81050000000560E-052.19056322226066E-02 173 172110010037 11 BG 1.60467000000220E-051.95360918174190E-02 174 1731100100070233 BG 1.44160999999976E-051.75031380023582E-02 175 1741100100070255 BG 3.56450000000771E-053.34120678857345E-02 176 1751100100050122 BG 1.22200000000350E-051.96528959397044E-02 177 1761100100920444 BG 2.06923999999803E-052.13428220537093E-02 178 1771100100930288 BG 1.83749999999316E-051.87032128387494E-02 179 1781100100920422 BG 1.64648214500004E-045.90666429938628E-02 180 1791100100910222 BG 2.73700000000543E-052.28859382539911E-02 181 180110010035 22 BG 1.45350000000655E-051.48841822573526E-02 182 1811100100400133 BG 6.92999999998833E-061.08288435612762E-02 183 1821100100920344 BG 9.15999999997683E-061.40784524012260E-02 184 1831100100400111 BG 1.11549999999849E-051.40380625026788E-02 185 184110010003 55 BG 1.75083500000284E-051.77209231365932E-02 186 185110010003 44 BG 2.79150000000172E-052.49415202346419E-02 187 186110010003 11 BG 4.41000000002412E-069.66835641594109E-03 188 1871100100400211 BG 1.60350000000145E-051.88809459572437E-02 189 188110010038 22 BG 8.08356774700258E-054.37637279836137E-02 190 1891100100080144 BG 4.76001829999798E-053.37824159499830E-02 191 190110010003 33 BG 9.17500000002791E-061.33859013306871E-02 192 1911100100330133 BG 1.36050000000276E-052.15069050669334E-02 193 1921100100920366 BG 2.48149999999836E-052.18545730330406E-02 194 1931100100870211 BG 3.68399999999824E-053.16948328639221E-02 195 194110010041 11 BG 2.58719499999782E-052.15590241756938E-02 196 195110010044 11 BG 1.17515499999665E-051.53725415940371E-02 197 196110010043 11 BG 1.67999999999592E-051.65947113395223E-02 198 1971100100400222 BG 1.03350000000002E-051.30577047350340E-02 199 198110010034 33 BG 4.22999999999396E-069.14926951499961E-03 200 1991100100400122 BG 8.55558385000621E-053.99828160646029E-02 201 2001100100080222 BG 2.34599999999682E-052.44406772759354E-02 202 201110010034 44 BG 9.16000000000805E-061.33979754861975E-02 203 2021100100420111 BG 1.29249999999692E-051.60909095741287E-02 204 2031100100870155 BG 2.16224111470487E-046.91676509795937E-02 205 2041100100960111 BG 8.28087000000989E-054.32622359944641E-02 206 205110010001 11 BG 1.17800000000168E-051.41180519173056E-02 207 2061100100420122 BG 1.10500000000090E-051.54486444032110E-02 208 2071100100330122 BG 3.17542472499932E-049.91085207737571E-02 209 2081100100890511 BG 1.73923039999968E-052.70533256503604E-02 210 2091100100020211 BG 4.35950000000004E-053.32619612779905E-02 211 210110010041 33 BG 3.64082955000566E-053.22134688877004E-02 212 2111100100880355 BG 6.75239999999300E-053.69825936819609E-02 213 2121100100880411 BG 1.08529000000107E-051.42019999999974E-02 214 213110010043 22 BG 2.82600000000022E-052.55990558714799E-02 215 214110010044 22 BG 1.08500000000067E-051.57195159030012E-02 216 2151100100330211 BG 2.17567999999946E-052.14596655028554E-02 217 2161100100420211 BG 1.74505317747764E-045.97836532320530E-02 218 2171100100080233 BG 1.86299999999917E-051.82998882589145E-02 219 2181100100480122 BG 2.70250000000138E-052.12621842348420E-02 220 2191100100870144 BG 2.50100000000128E-052.25675233311492E-02 221 2201100100870233 BG 9.06499999997132E-061.51942090915654E-02 222 221110010046 33 BG 1.65338999999556E-051.88765914297412E-02 223 222110010055 11 BG 1.24812300000277E-051.48426639304505E-02 224 2231100100530111 BG 1.12599999999713E-051.42391832948176E-02 225 224110010050 11 BG 9.81999999999372E-061.52460442864123E-02 226 2251100100490111 BG 9.52500000001022E-061.49399724574345E-02 227 2261100100330222 BG 1.41749999999566E-051.83262696223469E-02 228 2271100100520122 BG 1.79779499999699E-052.14279865954308E-02 229 2281100100520111 BG 1.06338240000309E-051.46489564356582E-02 230 229110010050 44 BG 2.18650000000029E-052.08078584196793E-02 231 230110010046 22 BG 8.22965399998876E-053.84870122173721E-02 232 2311100100880366 BG 5.22142514999269E-053.27117353217888E-02 233 2321100100020111 BG 1.91690000000411E-051.92480461261378E-02 234 2331100100490122 BG 1.42399999999987E-051.58803577758944E-02 235 234110010046 11 BG 1.82419699999992E-052.05753432408494E-02 236 2351100100530122 BG 1.41549999999879E-051.62220177274573E-02 237 2361100100480133 BG 7.28642485000597E-053.82097642493228E-02 238 237110010086 11 BG 1.41050000000142E-051.59660807683580E-02 239 2381100100020222 BG 3.33996157104999E-052.82772443565243E-02 240 2391100100780611 BG 2.13800000000014E-052.20263508069329E-02 241 240110010001 22 BG 2.05061500000029E-052.03720274645916E-02 242 241110010001 55 BG 1.46861759999922E-051.84144893404713E-02 243 242110010050 22 BG 4.09859469999493E-053.15152906829028E-02 244 2431100100780655 BG 2.37160999999597E-052.93014107998430E-02 245 244110010055 22 BG 9.66500000001980E-061.37836614005242E-02 246 245110010050 33 BG 1.01909999999927E-051.88843708486503E-02 247 2461100100880433 BG 3.02254000000349E-052.61923240476311E-02 248 2471100100530211 BG 3.33753999999797E-052.54835414498802E-02 249 2481100100540111 BG 2.79509999999983E-052.66064224452564E-02 250 2491100100540211 BG 1.46250352499822E-044.85043692578192E-02 251 2501100100960233 BG 7.61243267524137E-054.52729451497932E-02 252 2511100100020244 BG 6.84600000000479E-061.30055141378567E-02 253 2521100100490211 BG 1.48002679999960E-051.63102613906174E-02 254 2531100100480222 BG 1.43174500000058E-051.53864585793966E-02 255 2541100100480211 BG 6.74499999998857E-061.14323322940482E-02 256 2551100100880422 BG 3.23225499999635E-052.38151750005158E-02 257 256110010085 33 BG 1.73749999999862E-051.78486161553763E-02 258 2571100100020233 BG 9.87499999999253E-061.43260155151719E-02 259 2581100100880244 BG 1.24810410816800E-045.32905133084675E-02 260 259110010001 44 BG 6.88999999998163E-061.51998021275974E-02 261 260110010047 11 BG 2.07503999999914E-051.80685814239679E-02 262 2611100100490222 BG 3.06999999999530E-053.19890448922945E-02 263 2621100100890311 BG 2.66529394999937E-052.63414243877272E-02 264 263110010055 33 BG 1.78761260000090E-051.89484662792217E-02 265 2641100100520211 BG 1.82100000000185E-051.80989339436618E-02 266 2651100100880233 BG 8.13430900001300E-061.50844679108033E-02 267 266110010085 11 BG 7.13999999998882E-061.22256320876626E-02 268 2671100100880211 BG 2.42811499999579E-052.22284853087577E-02 269 268110010047 22 BG 3.97379314999377E-052.83566410126111E-02 270 269110010051 11 BG 3.79822319999806E-052.98313027480036E-02 271 270110010047 33 BG 3.19300000000411E-052.26122579117050E-02 272 2711100100890411 BG 1.69587305000052E-052.03001031548220E-02 273 272110010056 11 BG 1.43149999999939E-051.52992913382359E-02 274 2731100100880222 BG 3.24243520437306E-052.57726408645836E-02 275 2741100100780733 BG 2.24119904999665E-052.45553329302262E-02 276 2751100100841011 BG 2.62252500000115E-052.24710421410328E-02 277 2761100100780933 BG 1.24764500000207E-051.41250591437994E-02 278 277110010085 22 BG 2.99397499999854E-052.67829968632159E-02 279 2781100100780944 BG 1.39599999999795E-051.85686823562716E-02 280 2791100100890422 BG 9.12772485001101E-054.16024311180763E-02 281 280110010058 11 BG 3.22648000000147E-053.46042172108435E-02 282 281110010056 22 BG 5.03780000001286E-053.53152151879990E-02 283 2821100100780311 BG 1.28171724999509E-051.79857224912134E-02 284 2831100100570111 BG 2.31311766430431E-052.29965994641383E-02 285 2841100100780711 BG 5.12275499999770E-053.28161423328987E-02 286 285110010059 22 BG 3.11833499999220E-053.71351513671538E-02 287 2861100100780411 BG 1.06063499999937E-051.74728548597440E-02 288 2871100100840233 BG 1.78821004999941E-051.73468466432310E-02 289 2881100100840244 BG 1.44739000000060E-051.57820558615324E-02 290 2891100100830111 BG 2.73839615000382E-052.28876185509033E-02 291 2901100100830211 BG 1.31936010000222E-051.53495811063361E-02 292 2911100100790144 BG 1.20477790168305E-032.48993244576281E-01 293 2921100100620211 BG 2.51638995000247E-052.12715122695444E-02 294 2931100100570211 BG 8.93549999991805E-061.63960290452907E-02 295 2941100100800111 BG 9.79999999997649E-061.34701403515352E-02 296 2951100100790111 BG 1.27524935000234E-051.50183583654687E-02 297 2961100100570155 BG 1.74030570000705E-051.74899172830670E-02 298 2971100100570122 BG 1.68880000000066E-051.67763930028568E-02 299 298110010059 11 BG 1.55799999999595E-051.98527860441359E-02 300 2991100100790311 BG 3.52548500000549E-052.37371061186247E-02 301 3001100100780422 BG 2.23163999999720E-051.98606415831457E-02 302 3011100100780344 BG 1.34579000000135E-051.53139546583047E-02 303 3021100100780322 BG 2.10146905999992E-046.91012695588904E-02 304 3031100100680411 BG 1.64052500000178E-051.74891097388375E-02 305 3041100100830122 BG 7.88664999998301E-061.31378662197255E-02 306 305110010081 11 BG 1.63633990000467E-051.79910653452279E-02 307 3061100100800122 BG 3.38173314999440E-053.15746376754247E-02 308 3071100100960444 BG 9.31319199998226E-061.23172564543038E-02 309 3081100100790133 BG 2.16673000000278E-052.40576878592465E-02 310 3091100100960455 BG 3.13447874999706E-052.30456494926743E-02 311 3101100100780844 BG 9.36889050000148E-061.23926179964594E-02 312 3111100100790122 BG 9.08270000000294E-061.30516950024755E-02 313 3121100100790322 BG 2.81099999999979E-052.15700311840522E-02 314 3131100100780833 BG 3.86233877229802E-052.47820847199362E-02 315 3141100100780822 BG 1.85389410000264E-052.10854668449326E-02 316 3151100100960333 BG 2.55284075000100E-052.55434486942440E-02 317 316110010082 22 BG 2.09958499999274E-051.93979080210497E-02 318 3171100100960322 BG 2.28189999999517E-052.34595604575877E-02 319 3181100100780433 BG 1.32281319999705E-051.51439948862781E-02 320 319110010081 22 BG 8.15169999995868E-061.54705529045998E-02 321 3201100100800133 BG 1.85029000000642E-051.69327021562411E-02 322 3211100100780333 BG 2.64826999999968E-052.45108565418534E-02 323 3221100100960311 BG 3.21916564999715E-053.74466617450891E-02 324 3231100100800233 BG 2.57114439999734E-052.82018312687431E-02 325 3241100100800211 BG 9.15009999999383E-061.24977998364776E-02 326 325110010082 11 BG 9.71209450004173E-061.40293124497155E-02 327 326110010081 33 BG 1.43841499999769E-051.73115109254437E-02 328 3271100100770811 BG 3.44999999999374E-052.80083598415728E-02 329 3281100100770333 BG 3.33000000000069E-053.05115256770234E-02 330 3291100100770322 BG 1.70113527971638E-051.92785657619446E-02 331 3301100100990311 BG 1.58142000000194E-051.63812199842262E-02 332 3311100100680111 BG 7.67857825000329E-054.78413596252264E-02 333 3321100100770822 BG 3.72100000000652E-053.06724101233230E-02 334 3331100100770311 BG 2.18688500000508E-052.52173413251779E-02 335 3341100100990355 BG 1.51981434999804E-051.60088743378922E-02 336 335110010067 11 BG 9.66600000003315E-061.27211620166804E-02 337 3361100100680122 BG 2.38149999999826E-052.23429020680804E-02 338 3371100100990611 BG 2.19516685000115E-052.48777079551006E-02 339 3381100100990466 BG 3.08063489999413E-052.76958624975662E-02 340 339110010066 11 BG 1.71624780000643E-051.69730700632051E-02 341 340110010067 33 BG 1.25616814999757E-051.51442988586136E-02 342 3411100100990444 BG 1.19717244999873E-051.40134750107408E-02 343 342110010067 22 BG 1.90241500000743E-051.75942332110176E-02 344 3431100100990544 BG 6.10953374999834E-053.12097958869659E-02 345 3441100100600111 BG 1.59459819999985E-052.37041603205744E-02 346 345110010065 11 BG 5.86384365000026E-053.53800472954046E-02 347 346110010061 11 BG 8.25463464999981E-053.93966195739995E-02 348 3471100100620111 BG 1.16527940000055E-051.44366777172659E-02 349 348110010069 11 BG 1.11714000000417E-051.67487034323604E-02 350 3491100100680211 BG 5.43700000000258E-053.27106369625481E-02 351 3501100100990722 BG 1.34678859572629E-051.76840329639160E-02 352 3511100100990522 BG 1.47533740000177E-051.70781980822862E-02 353 352110010069 33 BG 3.30635899999931E-053.27775479418108E-02 354 353110010065 22 BG 2.40646039999515E-052.06223116232609E-02 355 354110010070 22 BG 9.95016449999164E-061.62951826195527E-02 356 3551100100680222 BG 1.58928750000065E-051.64446173902023E-02 357 356110010069 22 BG 9.34499999999394E-061.36379076471351E-02 358 3571100100990433 BG 1.72379729999894E-051.87417162371785E-02 359 358110010070 33 BG 1.15475000000281E-051.47421063572395E-02 360 3591100100990533 BG 1.67170500000091E-046.08940100887550E-02 361 3601100100990155 BG 1.20284274999771E-051.53502646507532E-02 362 361110010071 11 BG 8.88853549999014E-061.32787093222669E-02 363 3621100100680233 BG 8.33242999998974E-054.34698016642837E-02 364 3631100100770944 BG 1.76362694000232E-045.62146998462433E-02 365 364110010072 11 BG 4.13854669124580E-053.07168783541468E-02 366 3651100100770711 BG 1.17403475000215E-051.64547120741510E-02 367 366110010071 22 BG 1.08554046885354E-045.79031898711347E-02 368 3671100100990211 BG 2.01937500000082E-052.14957921799734E-02 369 3681100100770733 BG 2.34880679394062E-052.07653139979148E-02 370 3691100100770722 BG 1.71249999999790E-051.79060934601167E-02 371 3701100100600211 BG 5.17705940000154E-053.51965174085443E-02 372 371110010071 33 BG 2.62172500000712E-052.19760711373825E-02 373 3721100100990166 BG 7.17116999999490E-054.43851433869681E-02 374 3731100100760155 BG 4.26490425000578E-052.80096169068104E-02 375 3741100100630111 BG 1.61300000000031E-051.63663781347180E-02 376 375110010064 11 BG 1.52750000000229E-051.78757019991625E-02 377 3761100100770955 BG 1.24050000000486E-051.62378547153184E-02 378 3771100100760111 BG 2.39195000000247E-052.49481074192342E-02 379 3781100100990144 BG 1.72950000000283E-051.84556173455712E-02 380 3791100100760411 BG 2.08925499999568E-052.00530918910040E-02 381 3801100100760144 BG 1.65900000000385E-051.66680859970027E-02 382 3811100100760122 BG 7.95052679999977E-053.76573959818333E-02 383 382110010064 22 BG 4.14196999999339E-052.69120673364326E-02 384 3831100100760433 BG 6.84100895000372E-053.99094779381726E-02 385 3841100100630211 BG 9.58319999999624E-061.60310539760954E-02 386 3851100100760133 BG 1.29860929999753E-045.45340246652651E-02 387 3861100100740111 BG 2.70360442809481E-052.13087607457637E-02 388 3871100100990222 BG 8.20870519999926E-055.39170893005033E-02 389 3881100100760455 BG 9.93532786328188E-041.52192862244732E-01 390 3891100100730111 BG 4.72792499999347E-053.92355138490046E-02 391 3901100100760577 BG 2.64066699999996E-052.56816526560051E-02 392 3911100100750333 BG 6.75499999999718E-061.52417431204483E-02 393 3921100100750433 BG 2.47418373600650E-052.27135295231117E-02 394 3931100100760311 BG 7.37877139999968E-054.10351412124259E-02 395 3941100100750422 BG 2.22740500000068E-051.96649446476059E-02 396 3951100100750322 BG 3.31600000000043E-052.47614152480053E-02 397 3961100100740755 BG 2.52599999999992E-052.35801278115575E-02 398 3971100100750211 BG 3.56185207668266E-052.68633971393859E-02 399 3981100100760333 BG 3.41036500000266E-052.50414676522847E-02 400 3991100100760355 BG 1.34700000000154E-051.74278489071191E-02 401 4001100100750233 BG 1.54893449999916E-045.67205518121972E-02 402 4011100100980911 BG 2.12599999999397E-052.15740550860129E-02 403 4021100100740122 BG 2.47850000000827E-052.55221794294824E-02 404 4031100100740644 BG 3.92726689999179E-052.69990865679730E-02 405 4041100100740711 BG 2.94779684937019E-052.31536158696755E-02 406 4051100100760344 BG 3.80166490731582E-053.57240380273679E-02 407 4061100100740811 BG 2.12589860246748E-052.13728404920370E-02 408 4071100100750222 BG 3.19633999999874E-052.77940359960345E-02 409 4081100100740411 BG 5.19149999999718E-053.99413669890318E-02 410 4091100100740422 BG 5.54855500001228E-053.36663177460458E-02 411 4101100100730211 BG 4.15949404164381E-053.52091149669220E-02 412 4111100100740311 BG 7.34373699790187E-061.30899943879546E-02 413 4121100100740911 BG 3.50907869067774E-052.55712640108495E-02 414 4131100100740922 BG 6.11833500000353E-054.56355539336797E-02 415 4141100100730222 BG 1.05326457550792E-045.57433241463906E-02 416 4151100100730411 BG 1.06149999999916E-051.32818054430097E-02 417 4161100100730422 BG 1.56650000000119E-051.95154275463063E-02 418 4171100100730433 BG 5.16307000000271E-053.78608154787538E-02 419 4181100100980411 BG 2.06293499999677E-051.91538409048375E-02 420 4191100100980344 BG 5.81109499999677E-053.37799013576250E-02 421 4201100100980711 BG 3.38068833778404E-052.58939952499148E-02 422 421110010097 11 BG 1.92828000000031E-052.08679236770877E-02 423 4221100100980333 BG 4.34103499999117E-053.38890245220539E-02 424 4231100100980111 BG 1.50826500000256E-051.88873699213035E-02 425 4241100100980322 BG 1.13407000000287E-052.01765319530196E-02 426 4251100100980211 BG 9.36421319264191E-061.43156299550040E-02 427 426110010097 22 BG 9.51884950003978E-061.74206621829443E-02 428 4271100100980633 BG 5.75240738904526E-053.23149806242376E-02 429 4281100100980622 BG 1.16850000000390E-051.78079376165383E-02 430 4291100100980222 BG 6.21129999999470E-053.44600533407694E-02 431 4301100100980733 BG 2.19477998088247E-052.24674099264832E-02 432 4311100100980611 BG 5.22660590237811E-053.04678897322482E-02 433 4321100100980844 BG 4.99452104648218E-041.05244614657924E-01 434 4331100100730811 BG