g.data/0000755000176000001440000000000012253765235011452 5ustar ripleyusersg.data/inst/0000755000176000001440000000000012253674514012426 5ustar ripleyusersg.data/inst/doc/0000755000176000001440000000000012253674514013173 5ustar ripleyusersg.data/inst/doc/g.data.Rnw0000644000176000001440000001253612253674514015030 0ustar ripleyusers%\VignetteIndexEntry{g.data Package Documentation} %\VignettePackage{g.data} \documentclass[12pt]{article} \usepackage{fullpage} \usepackage{indentfirst} \let\code\texttt \SweaveOpts{prefix.string=gdata, keep.source=TRUE} \begin{document} \title{g.data Package Documentation} \author{David Brahm} \date{December 16, 2013} \maketitle % This is the public version - no local packages needed <>= options(width=80, digits=4, scipen=5) if ("package:g.data" %in% search()) detach("package:g.data") # So it will be in pos=2 @ \begin{abstract} Normally in R, objects live -- and die -- in memory unless you explicitly save them with \code{save}, or save the entire image with \code{save.image}. The \code{g.data} package allows you to save a whole group of objects to an associated directory on disk, then access them later. The objects then appear to exist in a particular location on the search path (position 2 by default), and are readily accessible without extra effort, but R does not actually load them into memory until needed. \end{abstract} \section{Introduction} In this example, I create two large matrices \code{m1} and \code{m2}, and store them on disk in a ``delayed data package'' (ddp). Normally you'd choose the ddp location, but here it's just a temporary directory. The \code{g.data.attach} command attaches an environment associated with the ddp directory: <<>>= require(g.data) (ddp <- tempfile("newdir")) # Where to put the files g.data.attach(ddp) # Warns that this is a new directory search()[1:3] assign("m1", matrix(1, 5000, 1000), 2) assign("m2", matrix(2, 5000, 1000), 2) ls(2) @ The \code{g.data.save} command does the actual storing to disk. Once I detach the environment they lived in, R forgets the objects: <<>>= g.data.save() # Writes the files detach(2) @ In the same or another R session, I then attach the ddp, and the matrices appear to be instantly accessible. In fact they are just promises, so the first time I access \code{m1} (by asking its dimensionality) there is a delay as \code{m1} is actually loaded into memory. Further access to \code{m1} is quick, though, because now it's in memory. Note \code{m2} never needs to be loaded into memory, saving time and resources: <<>>= g.data.attach(ddp) # No warning, because directory exists ls(2) system.time(print(dim(m1))) # Takes time to load up system.time(print(dim(m1))) # Second time is faster! find("m1") # m1 still lives in pos=2, is now real @ I can also put a new object \code{m3} into the ddp and re-save it: <<>>= assign("m3", m1*10, 2) g.data.save() # Or just g.data.save(obj="m3") detach(2) @ \section{Variations} There is a function \code{g.data.get} to access a single object without attaching the ddp: <<>>= mym2 <- g.data.get("m2", ddp) # Get one object without attaching @ There is also a function \code{g.data.put} to write an object without attaching the ddp: <<>>= g.data.put("m4", matrix(1:12, 3,4), ddp) @ Since we're done with this example, you may want to remove the ddp now: <<>>= unlink(ddp, recursive=TRUE) # Clean up this example @ Here is a new example with a slightly different approach. We skip \code{g.data.attach} entirely, instead attaching a list \code{y} directly to position 2. \code{g.data.save} still works, but you must now tell it the location of the directory: <<>>= ddp <- tempfile("newdir") y <- list(m1=1:1000, m2=2:1001) attach(y) # Attach an existing list or dataframe search()[1:3] ls(2) g.data.save(ddp) detach(2) unlink(ddp, recursive=TRUE) # Clean up this example @ \section{Under the Hood} \code{g.data.save} simply stores one object per file in the ddp directory. An object \code{xyz} is stored in file \code{xyz.RData}. You could access these files with ordinary \code{load} commands, and you could write (or overwrite) them with \code{save} commands. Unfortunately, in Windows the files \code{x.RData} and \code{X.RData} are indistinguishable, so we modify the naming convention by preceding uppercase letters with the @ symbol. An object \code{aBcD} is stored in file \code{a@Bc@D.RData}. \code{g.data.attach} contains the magic. The environment it attaches contains only promises, implemented with \code{delayedAssign}. When you first access an object, R fulfills the promise to 1) load the data file, 2) store the real object in the environment, and 3) return its value to you. Subsequent access just returns the real object which is now stored in the environment. \code{g.data.attach} also gives the environment a ``path'' attribute, so \code{g.data.save} will know where to write files. \code{g.data.save} is smart enough to only write back to disk objects that are not promises. It also has options to allow you to choose the objects written, remove objects, and set the directory to write to. \newpage \appendix \section{Function Index} \begin{itemize} \item {\large\bf Create and Maintain Delayed-Data Packages} \begin{description} \item[g.data.attach:] Attach a delayed-data package (DDP) \item[g.data.save:] Write a DDP to disk \item[g.data.get:] Get one object from a DDP on disk \item[g.data.put:] Write one object to a DDP on disk \end{description} \end{itemize} \end{document} g.data/inst/doc/g.data.pdf0000644000176000001440000022244312253674514015033 0ustar ripleyusers%PDF-1.4 3 0 obj << /Length 1806 /Filter /FlateDecode >> stream xڵXKoFW!2ܠ( IpC-іTEɎ?y-T$'.Ervvv 7FMt9DeVXm&Yir=O*UõϩvDia P+xl.T,iM%7ӏ?󉲙N"˼S$5Ef"=^JnaI d܊b <MR2[:;Iuf֬Q%f"8.$Tg> 3&󕟤dz Fvњx#(VAQj-zx݃Ɠ7h[л'dG}%.EV%_yW\~ʌ8rݬI{f +tr=KaAA3ٍ j{N 2@ xwAB\9YK7ɉ%x^rvtrIWPA I0s+"NaaI5Vʫ4U#qB>eJQfʙ`J64t"b;gˏW3ݏbʬTy!6%(t(`q-uL )B5U8;q}mjWm_=qWr?V?EcJ99/ FQ͸^D(V[LZ*[5 ր6z4Gv*T4T=meVrjy/ V:07֊rPhאHJsnɋcyoI-#}(Z>C3 \3nY*P [:DyGT璏;A^I |ȕi_E;gyߦc d@㾡9J_w#a0k>l,.M3\e07dZbh+UMS$وtIY:6=:-:a" T>*`/ڬqhǺ\Pi]h1rL >h4N b@I9k%f!noEJ1'^n#{C$8 )'A9g6*+J3;jHVJ^c19 XYy@pBǂɤa(U*N*$MMgxLq'dft8IwS52l(TAosݻpnˏ~b`T`\_Bz>ydJ迀#裑v)By-|:ei\ОY'F/AÄ/}9zq<-ӓ?;(|jO8`aJ |hpÈ_oUUzh'/ d)endstream endobj 2 0 obj << /Type /Page /Contents 3 0 R /Resources 1 0 R /MediaBox [0 0 612 792] /Parent 28 0 R >> endobj 1 0 obj << /Font << /F31 6 0 R /F20 9 0 R /F38 12 0 R /F43 15 0 R /F48 18 0 R /F49 21 0 R /F58 24 0 R /F60 27 0 R >> /ProcSet [ /PDF /Text ] >> endobj 31 0 obj << /Length 1515 /Filter /FlateDecode >> stream xXKo7Wb^nP)C B{HsP+Z9J}əᒔvm@c87x3!Xc-g1-oNFDT̷oKv s=?'7?d.v᧷mC a) )@nzgs֦mM4Q"9dsxJz3ó2FK]u5Vn||صE."IH驟ֶ:C&::7)#kO Pn#zg=uU'Mnͥeq8 GoNEVdѿ35X? 5ܢJaxyG-upta<4}}v&eUI&Z4 L݁mR|h0%VV>M؁CpӸYkK?+qgnDN saWZ9ov s!e߸/q[]E$s|_?p96Q1 >A!slgN^'9i4`ty)ߝ9?h8yk gx@e1ƚtE\f3vWXb;҅AFU/0솤< #S>&س#n-+ÀMw$`1`?_BBȍ!qf9 >1~JȆ߬PEfTNaz/RTS9gkʡOg fendstream endobj 30 0 obj << /Type /Page /Contents 31 0 R /Resources 29 0 R /MediaBox [0 0 612 792] /Parent 28 0 R >> endobj 29 0 obj << /Font << /F60 27 0 R /F20 9 0 R /F58 24 0 R /F49 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 34 0 obj << /Length 2130 /Filter /FlateDecode >> stream xMs۶_qf"총}>w7MD;%5.vA.(Rl/^|)δVs2gUTQbS=qcLgTSyKn`:0tsk0Vx%MM0igaoG< M#v븆c0/#]>g,*fTe\Wә3p$Wa0`K% [#̖oo_¸3_`|Gt?!P$17zi:=nQѹ^J9W'H :6H븜T)J撿-%Lz9a4 ®ɛi0io=k*e]m@:g 漗Q$a(Wx D$ J@4;iD "IZ#V3Dt:)Z31ju|b))Y[Pa : Vj.t$0c8i BiyᐎWZYmOr^a:D >j2V{@Q=se!/)5<6gjŢiH Iw;j;ʗ¨睬F5֨˔ DʾG fSX{KNˆ=ʷB 24,8xES3(TV)*N<_"7eqksqEڪ:t45jTYUG9%2>g/x*Is'KXQuJn&onCF};Ш1j ha'A ޲&k*{{塧O&j}F\;\m7/)Ilݕ+,C-yn:b*Y]En ;,ǮPRiHjwn&ԃ>hEBˮ\Q_xxD(r/(~͙ƷGmL4ݿNV@+YYUPw`ř* 3aSPyUe2ZxrRBiX[ %3TTE㭃푆19F$;/;Nɶڦ. UJ\&\Ě#|%/ sа _sN؊ݨ@l73{B.LGd:3gjh1՟UZVlc>d1^A _AWD+ه#nIen4L5>6`R oE` 5$iv0µ_q+j,~2)aKSRGHzf k,in URy,*TCwzbpԳcRҔ"D3Puݕ֘ ډo)ն=7!do#cid>NWKcJ'FbnJ-uPƖJ53CxM!2b\Tm8 Յ$3`ZToh"DΈs#˕؈[{K|o需ҥ̷^`${ev_i.ް3)F4Yp{7&"~ ϟ{ @+PDUq9ʦդwxS~ -'^sGQp|E<6[´Gg\+gC}$.c* ATalO/x7Oendstream endobj 33 0 obj << /Type /Page /Contents 34 0 R /Resources 32 0 R /MediaBox [0 0 612 792] /Parent 28 0 R >> endobj 32 0 obj << /Font << /F20 9 0 R /F60 27 0 R /F58 24 0 R /F49 21 0 R >> /ProcSet [ /PDF /Text ] >> endobj 37 0 obj << /Length 443 /Filter /FlateDecode >> stream xڕSMO1WhxACVa%!dM%K{flg޼7;>FG2RaATFX4h Zo\Kјw:鯸~MfuN"; kڷ&c^jP%j[i/ u> endobj 35 0 obj << /Font << /F49 21 0 R /F62 38 0 R /F20 9 0 R >> /ProcSet [ /PDF /Text ] >> endobj 39 0 obj << /Length 161 /Filter /FlateDecode >> stream x337U0P0U0S01CB.c I$r9yr\`W4K)YKE!P E? 00(?;h0a$>z A?$h LF N8\ù\=Yendstream endobj 38 0 obj << /Type /Font /Subtype /Type3 /Name /F62 /FontMatrix [0.01004 0 0 0.01004 0 0] /FontBBox [ 5 6 44 44 ] /Resources << /ProcSet [ /PDF /ImageB ] >> /FirstChar 136 /LastChar 136 /Widths 40 0 R /Encoding 41 0 R /CharProcs 42 0 R >> endobj 40 0 obj [48.75 ] endobj 41 0 obj << /Type /Encoding /Differences [136/a136] >> endobj 42 0 obj << /a136 39 0 R >> endobj 26 0 obj << /Length1 1667 /Length2 9464 /Length3 532 /Length 10435 /Filter /FlateDecode >> stream xeXm)))AQɡA$$K`[;CA[}/\3kh(UMF`  SUU̬44009y@ @ }}ǎIں fzQ`d99AV1 (5 Ü&̘@ b0Al0Y$ec pS6qf7d-@m\&`SLy(N.he%+"@+@m0 P ?ɁM =* ۘYL<8)C% .`E9 1oEI1ƿÊ -; 6 .VfVV </*'nc 5w'\1[Nw bcv]Ym)xg<P_`[)9B&FVE_ofb mUne6 ,{"1[2w5Q>j[aj9sM9DBax3L!NDpe '<O sn'<_;3'E7M\|~܀oG*M:ʿ ]7~WX` cK!"8^,A7h7Y2jW@xA?   |CXpO ܔw{{'pW ܕw@+?rᮜ#bgq\v3'0/' ';77Bw6ƜHj*+}Bd uBx ~a^lLWPib 9W}<=T "b2e `T$}N9dP߭'J~DO#6p/no\UZnYg ]}Llh<{n1ߤo^\L*pa'n@'jJ=>:%U)1W W[o96$ZL oOnJD8%,+B{yr̮_ j118ϵ8`nBKiCݢbi&Kb՜͕k"<.|hV%i44_|7ɗ} 5+ƶ7[TN9t߼dHLk_k]q2q(|z;+4 0[̻~Vf;@hDxlXYhfAjF,|xy7`T$P82d݂=0Yq/DL}ƒ\з6dC,? ~]gT fo*[#}ì]c %W.Vl-symvYʽIr%hɝ~gsH'CkEd{+o:TTZZ!ˬ4}x8c+\wJvB5sWewkADL_c"ͷ_ tdvlYg?{%GY)x2穂P}oV3Vi(l0W$6o%juNjw%9ER1>VI8өQ~ D[V[d`(^,U~[/ o-iVTr]㷗IjF|27*B1%0%#zİV]P"IÈbAEMV uJ ScTIƩ~<]@(O^J+doZFB3ij߳2iiP+6*Rztxy4U@S4@s9&NgV@^S(`YVd^x_wܶWxv2ñ&˯n <ѭ~Y3 AtѬeÙwÜ_zY_9|;irrSbF f]k+[Pu23ĕr:rfGOr6d[ $MO5bkV3 N]K[VæE٫B3M kPU ǘȕy; ⟬)/'ڌc3y9wƾ&|:;GwuYPяqT?mNlnf8BKdwû gW޾l~MY۠jezV~A:d}Z2zg}Fԫx.r?nz O"J4VstJB=h_(yhSxuBم+>pd@ {̾Eue0{5lbQuu2>m=^p1txeCuRbxIl1S٤ERǴoұm~Vv*pо"Xny5t!tuSTاc[8^eD=]$=9v HO91ly,xG#&:IU۰@dPcyF`Hx<4]4&co+Yhԝ=FŬxBhj5˂swJ)rQ^{8{CX l˵Y4o!Bnٶ1dRGqM_/ D#|4"Y Vl 1gbT2+aʖo*?+תA w<ry,ܮA@5{U]bm Q^0+rl|>S%D"cxSiGG)d2V0@E%(=*)f«!pO`4<)-}Ŏ6:PMO#89ڣ(\hx՟`c&Yxs?+>CFP:תմλ\_5޼)٤tu^xK\0 /n#lQOhp#S?$NM %^ y>MrmYzQÎʰ,;!u$1*V|)$<"r/U݂|cYT>GuGPӗtIA>r+uFoa4L-=9Nx6d) |)xbQ0H5gtwC+ɯm''SGw!OB^lI.{b'UQ+>]S粴-wC5Wa^UHp\IY:q^'hyy[4: 2-)) mawd.tf73 D+?(ID?%ؚI-Zءgv,4FBg ?u> _mH0 ȅvytdf2`]&* )3r`k[ KieNĶq lk87sf]k?ZZ*V7M#Nɷ$HsQd[Ų짲?u;F,aNLxWдWwRz,KG#-i4- G&~X,Uˆȗ= ..P wV$LUvjrc =ľ$⹿ґ!8,[=SL1hQ<Ǔq;nYzWDM7e~Fs)>&| pX/Ӈ$2Jg2G`L`궧cbpZkIteOPذ/rn5ӷ \aJa.7"Giu(6Tm:vˏ,ҖLuIpaDH!8dᄄMĢ"}yc_SLw&͘ꑣθ/*!h,QPAS* ,:JMSl, {ٌo0q: RW:|%E s> 2弰l Xd;a z+͝!,m/*ܠ_~ET Ó.= mNe;kA6rG 1lYs[#:_Әڷ6QN8xAa.zpSPΧt/|ŅZ3E,K rZ9ќEVϏ+(JA1 E#,6}ԫ'!QC^]|IG\L!B`-{(5}g(gL_vynnsjv(`V\665Tϱ'Rǵ\Z_uxs3ŏ!γ|!#Mnh8m!Px$'-3h>8fTjuӠzČ)Ngfq}DT?R)eii֣v[HpZ 'jAK홋DWɹLģKT?";Ĵ-Z&lWZx$,@+C,6t"[Ve._r< ;}̄#_]=?Z1w ~QЇ@ɸAalz w."4Yav{[v vqg^_ZGa*(]PЦx)9 Ro?g+ vMS:kY;+B9K);)Ω7+H}x'\HFr}ۭN@96EEcNֵGH)sCC9 ?h^NZt5eg=լCS$e7gzM-⫻m5l*Ã93%Xg8oϼ8\ʱIf o 8ؙ֟9S3]>-kx~뤐HIzy0E k.tJq~i:U_*X_,f9jIy3}N L "vr[R$Z)A(tρUil-)Mz }菱l$?,4B+yW5n[N/4Nބ@:B}kM;]Ci[AǕ k]XN&I8oZ]6>U̴@ PRsX9g? 6sѽ^e@+fOƪS^t{xO`8`ë-/ʽI R)ʉ鄔 ,4i ݊m2V`/@:-WG# Cy" 4W@mߒڔ+;Ɓ2G{n/;ܔe ˓:^ԮW0Bj?4?Lg,\k=Sd$2ѣbtz(g E^khCZ'C(ozr7F呕$ŷ4M,LG^ԕM0~%7Ǔ C.vֳ]c-`.xRlIbDIP`pN eݴ^?Cy>hkmJY5&΍sU3¢= yDomKR5ꖒpR[|9KdRƆqseesL^ֽakU}^s]5}R +c=\<.tO.2''&Ҝ\Y5t=͜uKA:txTy6]㼦j Kͮ=+f<*),"i!b>MMт%Ft ]_[L'86_$anFpBZ{mҊu2W_ lh+2b f,}bp^'Ȋ_1ggY}}`[BOQn9~7M,Z)FIDj]?̜Pa ]*o_ec8'w\J/Owa0HJ݉lz#T"-a< nh6Q,Ӣ95QT)O'=3($U1Dj8 t-;<|go,u+^3a>CH%I޴@C;e :oײi;/ө-ԫf"_ӡGR\\{_nJYm-#@Riw ? O|t>w6:r3betzu+ϼU] 4%$bg/sF]4_׹G1qHLIyql_mC3 ދ5n5%eF+Ђ-T U=t(ֶg=t;.UIGw86yOz%suNyM`56*9"3##2|byBM).nB(`v33lX^OoSw(o/IUZl Ց;=V&5D9/]S9<У[e}v#6% k6#&I5Yji}K I00톆8?=ve}gF1nڃhݗEYq'4a/5b&(E.(`{S^!am%a 0D?ݲ{Ma ;L-].lqϺ(̄rԺw $jAGmgZt` ⇀-d\i^xDjo:ӧ 9(ۋ1o,$2GQS0n8nM+|&|BVÕ rq&fLt7r,qKM99YV\` oxz͐VRMPbcn= h" 0EVhSl?$9VSzmS7t6?]5tkNY~u }8 n0Z-5ɏ|)jrMl,mPgD7I :`e3 Q*j[kJEݧdTKvd~ʘEY޷18$6?vά"VŚn;W6ZMlOzùPܩ#*d[%#ZVE~Ln60`6,¢9O RqQ=[E+_87H/8y17*u8D!299*$j42g#,X Unì__PI4!1P~Ρ^3b(N^$<]~zIl䤻4f(z-w(SuҐcS;qF*E!oq>S󲾰HϦ*ugL6]q|4jmvՀg6ڮ@REZn##rQgMGR nMG?"ie ~u0*QqFUi^44uy AYmSBa1MɞArV+EWmV6ԫ}PF 8Q\HʫtGvD"z:"%݉WXI*׎ojV{Da=]7i1ksd rz=2rۈ=4&a$xJ#jŽ w.e+wg䮄xg@|PPK8/ߚ=mDAS-j).FTcnc|)r$v!$8//;H&b`R6,+O{P>N[Ӗ ʤ7cfd|te3 z%{`P*f`tуR6QwM>KcQ W;} Q AmC5gp??EKQQ\ i#BVZWy1}B{eAKpIգTvǨUȖCZ@Isio-|\m%spУvMEq|S4U_RU$hJX@8AAKݮoRMD  ]Rꁙ"kN<)sȑ-#^'#yw:Dv}'].&"(g)iڻK3,BV`j YbG3endstream endobj 27 0 obj << /Type /Font /Subtype /Type1 /Encoding 43 0 R /FirstChar 33 /LastChar 121 /Widths 44 0 R /BaseFont /GKKPHD+CMSLTT10 /FontDescriptor 25 0 R >> endobj 25 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /GKKPHD+CMSLTT10 /ItalicAngle -9.46 /StemV 69 /XHeight 431 /FontBBox [-20 -233 617 696] /Flags 4 /CharSet (/exclam/quotedbl/numbersign/parenleft/parenright/asterisk/comma/hyphen/period/zero/one/two/three/four/five/colon/less/equal/greater/A/C/E/G/N/O/R/S/T/U/W/bracketleft/bracketright/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y) /FontFile 26 0 R >> endobj 44 0 obj [525 525 525 0 0 0 0 525 525 525 0 525 525 525 0 525 525 525 525 525 525 0 0 0 0 525 0 525 525 525 0 0 525 0 525 0 525 0 525 0 0 0 0 0 0 525 525 0 0 525 525 525 525 0 525 0 0 0 525 0 525 0 0 0 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 525 ] endobj 43 0 obj << /Type /Encoding /Differences [ 0 /.notdef 33/exclam/quotedbl/numbersign 36/.notdef 40/parenleft/parenright/asterisk 43/.notdef 44/comma/hyphen/period 47/.notdef 48/zero/one/two/three/four/five 54/.notdef 58/colon 59/.notdef 60/less/equal/greater 63/.notdef 65/A 66/.notdef 67/C 68/.notdef 69/E 70/.notdef 71/G 72/.notdef 78/N/O 80/.notdef 82/R/S/T/U 86/.notdef 87/W 88/.notdef 91/bracketleft 92/.notdef 93/bracketright 94/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y 122/.notdef] >> endobj 23 0 obj << /Length1 1451 /Length2 7729 /Length3 532 /Length 8603 /Filter /FlateDecode >> stream xUX۲qwh=@p@и{p`A 8Aw's59W97~FW?MK*a6ɂ\X98Rʚ\N64ZZ)b v WKOW vX[Z H؃ f@2 dahͬA.l ;;_; g dΆ 06s,r`K6wu 5`d@-< 4v0L.jg+]_@{k;; e9:S[窂 Ld,k2Wv1@\A ؕ5{/\4=WX{ 8888G13D z4 X;< av6 t _! LԒ?m-,@h@g?Zu#' qu! BmPc6<@ _GII7+' zyxafJ-ς̈́Cl>4/^+iR5Վ<kW4ƉiV,kq9GmT$)>mid;ëLuş. \I> IIOՌ]Rs*\nwOi?fܽÃ>=;PJ`c+ x"F@<]gp?b;R6 2DQ* I,>Y >w䓬C _,OI<E/zȺ\h Q>TqQh 6\ƜQ5ƺN IuaIXpaZԄ0K#zWKϔ&^V9$?֗|kVq+#=KQڹb0= $qbvH cډ6K@ I &e"^c|ZS4% (wJJ,mo.խ2Ř_K( R$`mRY69+?osBBG+o~G\x<삔> UTL;A ߹\Vi\?"?n*qrP0}8)/"sH :_#դZHX|(]߻16EbSKv#OŬ}Mt^$Q/G?]JBsꎅG|T^QjX ?4-u++tߚvc,\0xXW1 S[gA 4?Z=Qd`#KS![_0r1>܈ ('vg1e5Bzd(;]Q(?k `00"ַWps]8;P t tZt+ %ڿ6RTY=,&W#ΘhԚgB%8.sTfCce8 Lb9,ol=?.p.P[jT=U%8dXw }gxqw.sԍe,i'{dSB|Dfv7i~1+G߸I k56Š" qɯ9r6}qb}52\e횲oЉQ0xlO3y%nF_G&`i+Ǎ?%{IK¢Z),'=HCa: t[Ԋ}d/ l/ 0ޘ|C/?g<>ȏtANkŴ.2_Ӕ = ^}&۷wXaHFߨ;Q cG+9W & c uBIt{ʺ"rm}q|wq/ {"=8Eq!!:>v ~t;OMsDlE%xî..Ф 1E *@v[]`G-c'l{[oO/=zYp%{GWq@GuFFvR>7߄bΗ;prhvmQkSn!F+.`yלɯzh`uMτr JA/տ%.͵%Qiѥj ,eHK wפw9M}y2 jl9X%!a 6|pS5_m?)] Nj񵑪L FL*2LۘQ F$= Ja2Qc%!`AR!W".0^`W/]Wtm3ΙHSLDzDsovi7xHvyPX'"=d9>eto(t/q-a#G*5*|ӎ*Hk1unlK`nYR Gژ×̫Gq-[!d'Yޫ`$6xS.C +F[r:qL&)Ǘ 9LXaem~<2XJ)2ϋA.m=e\x2Pk%GzѼ3 <%+MԢIû=?[mQov]\q#BXp^sg=%++#=&:9go<+ dKӶ^3Fh9|T0Z,+Oc[6Ŷ)fzN53+Tu>1?kR: cQYxd"Vx[WWycϖ/,Mn>RVsUcL*OCJLNs.Sj cg Hwŋ-+GW(ZGӊ::{vzy 1Z9e@VPzvAEǷ4,B}sg$rN]!VLPw1Ts9d"W,`:`Fܕ,'Bz|B6y m \&3J"Nԏچ/1mdG>z ˑZ"EXANr(NqF#x`24hq2dA[VV6:L9B݋j/58GV!!0ƺ2Rv{Ζ8>s񷽥_$@W7j,_Vͺ\Ev =:=:r7ďo;" ͨ`eL޳d'/%=p.+v`SKW%xGl9J`W~zؓ';?4xHN &7C}5ʰڧUI9CF7"#Wm5σo$><4)}zgga,]E'IofR8_S1O?&a_)bnL',1q q}͓_՗>ah`6 ?jV44dI)V$ ضXSW)a{#1=3%JQ܉dg;NZefne}S˥xO@FD9 %m]Rk† ;Cn41EMܻu:E/(q$Tf& vJ>J.*ؑ O#_dbk_'GVE1PkQ57P lL͖ʏk&cɽ4?(ON&kcoD5Z"j?qt]qiLPZg<.9шc¨mq MreM*Q!>jf{|ؖx>56; *%MGCD4W/Td9CQi%S\%uag6??t;j7Ep{ƪ6%PVVeQ!1\!De>n# xwgכK!]:5'j$ =OI6Xo +:`3%VbKNP'[s}<;Ã^7߬s;N ~ol~I`!djgBi.OU"v iKlhNA\]_owQa߭Q)[s4n+` 3>8F(/R/1xl΁JB_dz5$K2a ҏ/ZkqYA+CMUdkqA扳Dw5`Z_QFeU oR_7]j|0q^bQq{}P ZO~ Gݗ-p 3xi=[C|kC~[x8YLٻ irLvz3p ,J+A>&p^Sjה3bv ܬU5EoGdLuhFߢ,$,a?Gr $<~hd}ilk}7a+72Ò*XNLb)?zk4^,wϠ♘lC Rvu_Г"~~Y.-<0da0N\Qa>]\ F{bQr*ieSh=]:4D10etPq 3s^E/bqP狛,c-8.\Q&N]__3uJ|zǍ?P{Ս@t56Z<<+ؓQ&™t/KO#<nv8\2GnƐM+'h=#hH6{ʂ[@viW$CحwV)*K f%,,̨vF|^mI6*Q?9fg9 {5.K3NNrO7Jnb5))ηj(tU|CKVЖ@_ 4(^b0>#7v:h}Z0͉VJ6>q(T0ҵVsΞ 2:Xo>GSL,uYGҡHȟʢ (3|zNwE݁*2J[s?+֡2Z[u@/Zj(Ds4Q$*GI욫xۗQ}2z! 8r?zrS7ugF*MP^ Γ'BT֊nW_4WpF;0bz~"LjTT \QK}muSWq[Ź94 ӥPV&!Ҟ܀+NgqؔSpvcPeu*h]IY->ȣ"p in0dwuu1]KohK#]̛_hogƇTEg'`:h'D+Zg1E45at;/(eMbBvtzbBb/qr`ğ&=~7]{ɘ5ܯU8 GHjh´.7>1盁Yg9R% !.1fL(>^Uc:KDi?^T7%# ee·ZylIއ83^Q#y>dsFxs|bfm0J{TL>d`P ?:Z%M5X P=}"RsB yo b9JK/FejS^/)3h{n:ҩP["dy`AstBoy3+qiDvk_ eqFusfH5 !7plLOwf`Q/m庛?5>=ɩ)|0&fv lآLEHendstream endobj 24 0 obj << /Type /Font /Subtype /Type1 /Encoding 45 0 R /FirstChar 34 /LastChar 122 /Widths 46 0 R /BaseFont /LIMTHY+CMTT12 /FontDescriptor 22 0 R >> endobj 22 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /LIMTHY+CMTT12 /ItalicAngle 0 /StemV 65 /XHeight 431 /FontBBox [-1 -234 524 695] /Flags 4 /CharSet (/quotedbl/period/slash/zero/one/two/three/four/five/six/eight/colon/at/A/B/D/E/G/R/U/X/bracketleft/bracketright/a/b/c/d/e/g/h/i/k/l/m/n/o/p/r/s/t/u/v/w/x/y/z) /FontFile 23 0 R >> endobj 46 0 obj [515 0 0 0 0 0 0 0 0 0 0 0 515 515 515 515 515 515 515 515 515 0 515 0 515 0 0 0 0 0 515 515 515 0 515 515 0 515 0 0 0 0 0 0 0 0 0 0 515 0 0 515 0 0 515 0 0 515 0 515 0 0 0 515 515 515 515 515 0 515 515 515 0 515 515 515 515 515 515 0 515 515 515 515 515 515 515 515 515 ] endobj 45 0 obj << /Type /Encoding /Differences [ 0 /.notdef 34/quotedbl 35/.notdef 46/period/slash/zero/one/two/three/four/five/six 55/.notdef 56/eight 57/.notdef 58/colon 59/.notdef 64/at/A/B 67/.notdef 68/D/E 70/.notdef 71/G 72/.notdef 82/R 83/.notdef 85/U 86/.notdef 88/X 89/.notdef 91/bracketleft 92/.notdef 93/bracketright 94/.notdef 97/a/b/c/d/e 102/.notdef 103/g/h/i 106/.notdef 107/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w/x/y/z 123/.notdef] >> endobj 20 0 obj << /Length1 1252 /Length2 5868 /Length3 532 /Length 6645 /Filter /FlateDecode >> stream xg<]h ØaEޢ $ANy:s]okojh"ph > ! @UO$ 89UW@d ii@ $dDdň8@$W$@:=+]  @!2 0k7 AA@ q‰rwF$v6A-:!@ęHXւ05|a0}_^{@a z'!2uT BPo h pü!!p^ ij~=h}zSѫB@ ~ebpG>0 $B 4A(  >)HSL  WH &4@@?7슄!vDJ$@X7!Itu$DZ ]EB3Mh=߄nBDaoBw2N 76DB@nAh!B=@D y|@C8D}UTA@Iq`DB> E:Hđhn(S^SM뮉٧:^|K/H7q7YCF4#Rsn67ZO7<~D5O~44TaQn!ڃ-/V~Qy0W\9^qbi8can- Ljv_R;l3:Y$k?(ټLX-˵HrR$Or X־󜯝,,0 Ԍז$&(c5hH {jw?g.窣y$8AsEKZǓq-=2~]@Q^Ef1#479K$!ZfF~$fONR=\}|LI8{,q|Z.xRg}6HrQE(`0Zp?L9(jSx+_{BܧlI@F?XXw~yoc,9$g Kdn;y&l O$??+aݫH|c|4=okK1s2\Si'<) qIxb(U(X!T?dt. P:ܥ}1k_ a y v$V,AـmpӱCdm`^/ǽ`su\FLOlITW!ί/*{:UZR L&I2> &,jd`ba9ݑRbU*U[s!v=k"r)c*T`J-/7 W3Ou53 nʲL[z[/gR ͟7W0C̪dpM)j$1қ? ;/ }ʮGkug畧%JrM >ӷ[S"p9\cX',?C(Y1"tDSfƗYejU1 bR3b8X3S hֻ1}1Qg}{\+%bmā$*3gf(7TErL/Oe,<2"doF tc'tG7j0^+m%$P? N"R6/#$7V6:ؒ:lpD/џ}Jxm]j뮂ΚM5JA|X1ލQS?O.h1^\WqT-Dm[+^צz'$#p2!0M]^ A)MghڽLrUg@\L#DžOMawHc{ w#UrV!zC=nhplC^j0]HcO. 2Sn灧v/^G8Hخ3h0ӎb?6KO" )Xl_k$Ӈ9UfIZ3&E-H'ګB}~ܢܛ#ٱ>xh_<`5&NL-Q;vU)F㗲 gCHA}EzyAjkLQM~*A»4Cѝs׼|`.uukO4vˡ6cm0觬.;ŶWkKo_.p7}3N %to~BM A/$kL de_'H2}% {Q_S3Ǣ? ȓ8fpZ.>D8m'ӹѱ3W[( lمhNH1qԺ F8oB$'xzuiTSEfܰ t[fMBk1 'wwӥszH^/\"\XM4Ҏ,Ogb`K}~%Gn^Zr 0QWf)WÒtlȥk6023Dx+mI"N_s:yw*_Cq \< dHV%vGS846"lSpNâP4 5Vzja[(5`CP9yX|xh7 Ve [\T1cj9+0sA9^cZ37\giǽ8zѨA@6^K~͜EWZ*YOs2?Nn>g'`+1dk]ӳ_j5H)pBJc=Y(-x@tN^w{ Nç.}8dUOdCjϖ!+E*Y9[QԥaB٬z)M(vǹ&В8*L&tp><b`bZ3+"郄c4IKwa> uZFf떎544]c # @W?Þ V y72I h:>1DU;R];@i_A2d a@>i7Ma L*_tL#WR$ BrLpJPMfdwN5t^P{(HtR'1ls$e]ݟQpڄ{bG}G40u߫%>q-!ϗ+1'!kX&+Pp{vpyaj+#^\S9&)~!@i]# ^O}>#Y;l;ސH&j'eĐ%i4ZteevmĄj3FȰ ӹidI i]W8=':I{FSR5GF[m?o{ <kՆHLYߑG6 {>[MkMH %?HIM:WVn'PCPOZ!UyN2!h*M +9b[Uc |E r6m0}N&%g0VLXOdTtY]fWј0܂Ä}PYy'5)__S׃}C%ǰi%EK k|dx64]Ɗ|rFm* _4wpȊ09K̛ˬn/_Cj˻> zsz焷.LK#'%*REkx\,|Ws8b 4|1/RJ_BN]pNo2Ro- TASlQδDiaROp4 t- ɻS+uShbIޢtʧCv@Z}4 |Wjj/ s=G~es}w%A NfQvg6$zS+6 >}o-Q^T|N*,n/y˘Ef&`_7cĩHЫ\D¼b[ p䂡)'Ձ]ޚIOw&nm5R]*bquޠxQ]@m-@P5P<|N6ȜWG$:FmÝqXAۉ ~j">_+\w޷ۗ5([tU4ez*17z8KHתY?>e@MpFe`K߳Xɳr$EDl0D) Ο=LU;uP{rNVk{NlHmJR'TTM8 tq%YbeƌvH. }֣X'r$́quzv AQhCb#mE[s1ݎ8rvr4ǖYȧ(xH\ZE7yXG e!UbrD1Q-1|->ԥW?v<##c.4ǍrNg@rS@dXn 'J^5]Y0Zйʛ͎d kxـ&H8sߍv43&7S\INe8erF [G3? JOs[TʛWLUIPؖ^*{絓j} X!h')mn(,81C?VWrpIM}1y9^7`0~(*j[N\L$ڀ{;nmJk7(̢~AC3r}j|츻S?kldc@; r&e:ќPA-=V6Lずs uG(~|->b-6 ;jfעMٙ'I٪e2!(M/ɬi(p'd>Da0F/AEendstream endobj 21 0 obj << /Type /Font /Subtype /Type1 /Encoding 47 0 R /FirstChar 45 /LastChar 121 /Widths 48 0 R /BaseFont /VGGRSL+CMBX12 /FontDescriptor 19 0 R >> endobj 19 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /VGGRSL+CMBX12 /ItalicAngle 0 /StemV 109 /XHeight 444 /FontBBox [-53 -251 1139 750] /Flags 4 /CharSet (/hyphen/period/one/two/three/colon/A/C/D/F/H/I/M/P/U/V/a/c/d/e/g/h/i/k/l/n/o/p/r/s/t/u/v/x/y) /FontFile 20 0 R >> endobj 48 0 obj [375 313 0 0 563 563 563 0 0 0 0 0 0 313 0 0 0 0 0 0 850 0 813 862 0 707 0 880 419 0 0 0 1067 0 0 769 0 0 0 0 865 850 0 0 0 0 0 0 0 0 0 0 547 0 500 625 513 0 563 625 313 0 594 313 0 625 563 625 0 459 444 438 625 594 0 594 594 ] endobj 47 0 obj << /Type /Encoding /Differences [ 0 /.notdef 45/hyphen/period 47/.notdef 49/one/two/three 52/.notdef 58/colon 59/.notdef 65/A 66/.notdef 67/C/D 69/.notdef 70/F 71/.notdef 72/H/I 74/.notdef 77/M 78/.notdef 80/P 81/.notdef 85/U/V 87/.notdef 97/a 98/.notdef 99/c/d/e 102/.notdef 103/g/h/i 106/.notdef 107/k/l 109/.notdef 110/n/o/p 113/.notdef 114/r/s/t/u/v 119/.notdef 120/x/y 122/.notdef] >> endobj 17 0 obj << /Length1 879 /Length2 3088 /Length3 532 /Length 3705 /Filter /FlateDecode >> stream xgXS%( E)K4`HB/&]!@( $Dt^QAt^;UNs~k~{ygk0]0:x FƖ85@`&"a8-  eu_ *r24d݃HhJ)>(ƇZ,h,DԽ?O"q!+M\0Xӓ> (v;!_6%IW<Λ b@0<֟uMP>?ԿQ>Xo?x_]1ܟR_1X?$7sBX6j%=+:_`F6RXꯤ #Y}Y#A=:_UH}G3mŹ2 @@AC%y `q D5 I#u&!Q9K] gW'Ꞔo`P *0!%ޤP >(*@edEY/ڟ@H*u%? &MģU=sꯔjej7\5yx[DwsC?L|n7oD /t>F]&R|cvGKƺϰPiEҋ8y{Tԅ9eG.G qlF6g:NWNkg|j7Ygp٠dqZ>WFj뾷ڗJ߅>/ Q_<=*etcrbGvqSsJI[Bwjr8$$)=5 { e5Sڙ߫1!7\i6 wKW%ŋT|\&^u{vRh%#cb{=6=>`IFu;n3ܴ,=Gi/u(/ȳ& GoV慇W)i~LҞp5fRxihĽNJ2r S麒 svk? n|0jm,?e衘s bT/y^qb!Lǰ#gH&J|csė`^! /ǂEEsQ<*Rg/=|5s|b**oo{H71+x).l=Keֆ#{kő~,)0Xo`EG~a V)F\^䴴 P鎙q86po6O?H9~_^i ƐҿTjݷc5S7gjY{'SW Z؋S,>~~˞*5=EǫB(7EI2nI. ޠ!x²pnq>9˭U3;蕲z钛P7]}7jH[ls]&X}߆\S={uvZBj&jzZj|/x6wV-O?X+jq(ڂ~rrCIݡ/S\=% =<(VVj2G&\{V*@Ϥ{@pZaD{Zg\t108ƝωYcEh #\K󽯻?z0[[lR%/nuN{p DuGgX_1!Ziv~t [~̋6s0yI)Ȇ&zW砗Ues` b-蓷fAÚ#- .25\Oɔ^) M:6~!2/!Ȗdiԭ/k%nL{mV;JIIJX4$y򾗺@RuLT 9((w",{Y-87ox2~[$ת&I/+Agp Q2¶&}[[(˦u+Ii 9,-׵[Ǫ>B{D+@Si=F4"8k8{sVAX?g:p FykW1MvFwjd>[d^hDAIG e~tWl|Ak})td)q&rF%!E1~Fȫ/qTzG?}4Q']`LD٥s/y]xSySoHYÞ=ZM^ƛs^+˶YVMXYc،ݚ d菎B7^<)ذԼK٪R*RL*Yܺ;o16jMT-)sjYX 3fkFj,JEwJpFwSeX1u%Fm,JB[4ZeF&f9 ,tgT`{J'xCAֱϦW} U.GF eM.{Ÿ(N&lFPMVͻ!mw̨2|ik&B7tw=tB3ێZ_9. [?">(^m`endstream endobj 18 0 obj << /Type /Font /Subtype /Type1 /Encoding 49 0 R /FirstChar 46 /LastChar 118 /Widths 50 0 R /BaseFont /JOKXLW+CMTT10 /FontDescriptor 16 0 R >> endobj 16 0 obj << /Ascent 611 /CapHeight 611 /Descent -222 /FontName /JOKXLW+CMTT10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-4 -235 731 800] /Flags 4 /CharSet (/period/a/d/e/g/i/m/s/t/v) /FontFile 17 0 R >> endobj 50 0 obj [525 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 525 0 0 525 525 0 525 0 525 0 0 0 525 0 0 0 0 0 525 525 0 525 ] endobj 49 0 obj << /Type /Encoding /Differences [ 0 /.notdef 46/period 47/.notdef 97/a 98/.notdef 100/d/e 102/.notdef 103/g 104/.notdef 105/i 106/.notdef 109/m 110/.notdef 115/s/t 117/.notdef 118/v 119/.notdef] >> endobj 14 0 obj << /Length1 1259 /Length2 7352 /Length3 532 /Length 8135 /Filter /FlateDecode >> stream xeX[[).݃Kn5S@ Z[)Z܋s>޽yN'zk7c,m=nkW+ W @,,rP%E!V GLP@L 8H8C`K%⌨t蹂!0@;< b̓ V[{lJ*.6֞nY@=R?59IkW'5 p⊞NNQm\Ȳ~|^DDL'1?ja{Ŀ񆀱O>ք*d~A|$k[Y:ф:S^;RuQ 1&&=Mΐa{\fo=Iφ]ɳ=GZK &9]Gݻ[ HmϼRÄS "^U3$F D, ޣ.:D`=?vm$o4HϯDwKj 'L:`lafR);"V:o4fcz \l+LKѬF 敗C3S4z&rӮQ_^4*@lF7?O2ykZV8?33:uɡ@ǫo}xVL'u 5n5[X ]QKҺ%z52Y aÂ6*R؜, AO7K 4ѽ68S%h8?h0'hQ`4y|hjT V#z+. [D*+Q@ \j3b3Sso Fg+Je3GuvI6ITtye=ME>r1JHw?Kv\3A`|9A$'S| 2UGEdEX#+;HC[HAz(3|=`3P7cPi>S-j%ѪH_c;{-_?}BNz}D8ylX~JOB؅mn+\t[]CaIjSbSvy` x2YCK__pZG1rl.Ż]j{xK,R_jegY ] P^MM-0"%$Xj,$_̟_V'߸0c.t- jd\e S|nIӡ  {V;WN ffsEEeTeCk!A'8/37ZzRLD*)u<=Q?׊,m+SO.HJ]!0Y'P%=] 8YYdœ˥G~]eV+^1[;T6i >W{8z+ pDz4!4 Anr}mz d(Gr'\<,4z4uv*tL¿Ӱ0+z(~PLR|X4'Nj3H:aMuv5haL =}sxw" m2Q0zx5ޖBJڧ#dô-ֵ „ncɡ|`wW϶%:)e=Rg~pXQ~nQaZkɧd!$DqXOH( $ykGt7 }7{$5)sgNqEfO/LeӊiZoK!. vb71ѵ/2eZ\4? O}HQғPe6iw6RS*Sb?BAUJi¹FkiJXzG_6p/5΍gY w}޲%!PiW.H[}.s'Ikbwɠ^%|}MgS:JgJ({_ژin^~*] Z{'0b:sO}B{]N׸$ ɩua]S\cLUEa۩|:CZRLwbr Gʍ> ).O6Z$0EDRToRgDv7NƷJf͹۬ۇ^[]h&pV{ժ }B*AX< )]s0_TcѬ;_Nk:+V$9XCjZyGwՎR(4;\V]GVĄ̈U h50Yy(m4ĖdPu8Eeة r7[N : \kP]h0g0f҆?fp" 2su_VϿYyvaKw_j1< :>̑֡p\n}jb;bhKnȭ/9=w=Bq헊L8ԢXEy>8݇ȼJz04F*UOVc-Q6e:1 n s_cLfeAUn)mH-[s=MbphA1HL%J*2#@")}u(#kd)߽a48zFo uBR(|oI k0Qgb$b 1I 1Goڻk^q3i7ܠ3JNnתᕞ8AM`r:uT#DtlhN:7W>C)9P1{f]*\gA:GnRkR~kԗ-efBjƝ:: «䔫č6I#RRܣQKsDŐo۳x̘@GcVYOL?4}s7FEз.{kơSdH*cDn=n98 E~gzKXecfӄJܭ՗GC=1nW/:zlwQwl6 >ZQQsqkSagv| 3o%`Of;jךT6P#J|ISFAY c^mZ{qZM7zg_sH ~}n}uU*XgZ뒶:q_y! jj6JAy*lmsq٠ȀGgo00иq}p}tt}·Ҷ^9זf'~W8 iJj#}&NM[Pݨ&!8qJL}˻ɚWc>8y⵺>yLY˪T{%_/Ysf7tN;Vf4dNjuFþDZVGfk ,Jc܎}O?,ՅtW$=VVӰ F$2'n8oe_}2Q`FxLpMET3ڈtms /7c0hKŏmEqzO ]#1&gn%(_UO Vuz@)CҤuo>w]7϶xs6c*PvXR(U-PYqz PYD1[jq>kM}Ga.6%?"F1LLF{v4 w`'ƒPS2!}-N{ؖ*Cf5;iVu!|$1mԤQDx$$is#HQ~h)שh>_ fVMtc; WtK/&'s55}t6:ΟbX֪+/3.}HY"w&Y|dYu\\?nó8xPXOI=Ym,ɧ6#L)QitfZOW( lg9\s@nTc`3UVCsZqЮS:"ɢWYOBm Lj#9':sB";.> $a)i렟 ՜}9ڱv&C[?&첤y _Хa@y,cjyQyu =ǕqM %71橇k\^H+^[5𭠈&V(pI‘3q|_wFg~" 3kudN,p3ɹg?=א:z8;['b P oy{㹔Ě'NWMGI$ 4mRIf>$KkZZh;gă|wf& *M(/\³ZTi$l{[h:{q }g!z/^m`_!YI^X;\`EKwۡ, زhO|R̳3}6^s:G6sCI6W3LA ,KCJPmǪ Ϯ?5uMVL;(=`$aRÓ-z]7Ot>1MXǯd)m<t9fWSurq ި+dpfPdaf*@UѶAuL XWEFCX>4)a87sFvVnGTm6ixk!13领ڀwIMtk+Oa5~VHReBE8g}0bYu>" .J2ldFx2]KaEl FwkV5= ׿6ubݱ1btTF`ϊrw^mjHy(۰bl:C,+*/#W[(e8!h.Ey4,70w$ƔޗxLEQo3Ǿu_f/>=` Ĺ*‚~ j lg aT9lC/L_4u X<%aңr3oTjj`WG_JϼUv1BH$39" N[3ǣ`$O$E:e- U'[ӗ{&>uoM'XSM?(ޤ=Vj8|@&LWni| q"}>?(lj D3DO6K[KNa<`T0Kv/iHzZ o6*E )tcA_aF*kz2g%r^CB튅8Qn o;1|.AG,%boi!D6y)"G(CBZ#>9jo }-VVqXˤu6j=$7kyC FUzx 'r|NgibS+kM̦h7Hk-}>T/EZ&MV׋4f~KMvpQ3U].{HvjSy>x)9_:󈎽v{OUH6W">L |`r<3o!UH/"4Ѣ'GUWEIAl/7u g?Vg.Kc>ZUXN\m͒!EVY}ˮ) C-Po̰)rֈ3# [Rbw=Y X˧~!GKhpM<[;YŸkl[> pIp?8"+@]E6m> endobj 13 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /RTXCPC+CMR10 /ItalicAngle 0 /StemV 69 /XHeight 431 /FontBBox [-251 -250 1009 969] /Flags 4 /CharSet (/ff/parenleft/parenright/comma/period/two/N/R/T/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/r/s/t/u/v/w/x/y/endash) /FontFile 14 0 R >> endobj 52 0 obj [583 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 389 389 0 0 278 0 278 0 0 0 500 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 750 0 0 0 736 0 722 0 0 0 0 0 0 0 0 0 0 0 0 500 556 444 556 444 306 500 556 278 306 528 278 833 556 500 556 0 392 394 389 556 528 722 528 528 0 500 ] endobj 51 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff 12/.notdef 40/parenleft/parenright 42/.notdef 44/comma 45/.notdef 46/period 47/.notdef 50/two 51/.notdef 78/N 79/.notdef 82/R 83/.notdef 84/T 85/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p 113/.notdef 114/r/s/t/u/v/w/x/y 122/.notdef 123/endash 124/.notdef] >> endobj 11 0 obj << /Length1 829 /Length2 2799 /Length3 532 /Length 3389 /Filter /FlateDecode >> stream xRyhA&h+i`8)Ҁ& 26BĜVU[0Q␖K-T%e[C# G9w䛍f}zˡ҇置gAV3}߻ ol~qdh쯝Lu.`{jU43`8#'dΕQ#=u;a?X7S hP[]1䮞wӳUvfuBUz[Ul7 H=􊥉r~Q0%0PJr,?lQ?Xg14X@>;g}zA3ע]Mu ,[Kъg/_>p+Oz|v _副INJ34ḥ^h\jυ|fx֊I禆+7#Cn޸*\$̀Oz=XeINA 느 ]LWpcC5Dw.HM~(w${&JkQ7w9f/zˈ&$8\'lΜeQ~$ͧf[VC-w٫|b"6q.QZgrE Kx;4^Ebuzfm<4nk\Ρ׼-xvU aWæҷ&[CoOcpʙr\8"̮]gǑZo"IYQuӪՂ2h{N[䦼ϵ)lse\nD1_dMa nδB,xVokt*:4?6[l kYD~:L.'XES~ 0|E0l!&].>NMc|.w%3 G]3^–T62:[^1˯;$FGcݩ=Mks(cۼcVeD9˼tzu/ >U(F?bHȜboɎNam G`MSޥ:˫HGBN^%M}COZo|ѯ20S [_ja̞ne?DPi~:oD1tu[Bݤ@;}QP敡ćbNӅmm%A;2F tB,m }ȚR;,ꍤG~Zz Fe=hppu?mk:{HH]g" `aCc]qi=/$iЬ7zn2(eI}#2Y' ]]%LRYmQ bgbY$Nyꥪ:M TqbE 9^9^Ez͜tG'G |^,x^(ArG$ΘO'R*E vaҘe&1J\#ח&__Mώ;ow}OS\WvOKЏm3s;V[:c2B}lс!vE^0_̠S|q5wk_^NY'dLJmJ{!jDY}( ˶gKޓYBjH=>^ R.jslQݳEhؙ]Eah0XHb`*%8@k[Fvw^:~ b8U) `0ޡ=$;BOʔԸ c8-vxU"W8I>AS:bDJud~D;$Sd .WvKfm""*=`9.p)H$@ga5]Iϰ:yAݙcs5>Jb"%F]|&DІmZ*Y_C+}PQ^8;5-^旯ֲCUh 13X}FO> endobj 10 0 obj << /Ascent 694 /CapHeight 686 /Descent -194 /FontName /TZTWOF+CMBX10 /ItalicAngle 0 /StemV 114 /XHeight 444 /FontBBox [-301 -250 1164 946] /Flags 4 /CharSet (/A/a/b/c/r/s/t) /FontFile 11 0 R >> endobj 54 0 obj [869 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 559 639 511 0 0 0 0 0 0 0 0 0 0 0 0 0 0 474 454 447 ] endobj 53 0 obj << /Type /Encoding /Differences [ 0 /.notdef 65/A 66/.notdef 97/a/b/c 100/.notdef 114/r/s/t 117/.notdef] >> endobj 8 0 obj << /Length1 1655 /Length2 10478 /Length3 532 /Length 11415 /Filter /FlateDecode >> stream xU\AqA n=8 Xpwwwwٞ{'O[ԩS߿NUQ)( mAN <Y%f3%$j0ss3,LfV.&v$JZI!! kd06([Bp(.@$ffhfBbRj$ hb vMlk&7?caC kJsv:dmMLUMhblRNB 3k _! Gq 798d}1C ݿ#`fb`bb'%25; |2dXLnXd7w! -lF{g[':a6&d 4+_HW71a0ۙABUlM@?-of[8gd+i'vqonֶD89Bl)EM`?vC`? >1\EQUk!0! &n?b?K!p ? li?!X/{`qߖ!/KY`+? `+ۿleB_r VN!/[`+׿./[EX͓|7Y' ?韯6}o6f@ii֘72!G, Yc܏Ι6oEk5ӰaI]_Z/cR] <~j\ɺ}xv0{{)?>RYЗy@-rJѥRו!fXKJb_抑62vʶ9!'MhZP7cC4>`>ocmn!IF2Q`*&4˗o!D77EU:8#P_^N ܒ@w;m,_b:ϙV\wD]5myLHa7DYBN´%_dzu]K Qֻ0BgzwR7 >bH"UkeTa:Kq>v X_ӼЌ;گ,oDoߩS;^$q6dB)v =r"-תI*fYn1 ׏Us?&tS&y'M8?h=: 7oh:ݩ\CM՝EGcռ 󙸐FbK$^e7/"/"!`Sx-:}0"F׳`i.:}IAM!`:K`}Wq:vaMgn8nvADlf2C&dsj v\b}-Ͽ2}!w$2c)aݍz5PiYC~3d*ݸJ M:XJu,, =2J[&On *4NK'm vTxRN/pdKem%I't(Q 2PkVe;Ȇ1y}hEҞeQ A>ۤW?GJ4;[% "kOrc(Z==s)+aH1v&[j=P(Hl[NGjiJ0) K?ALu:gC7x'#oH_NV%!ib>& жG6-P@nS0fRGܱYf*zؽJ'M1,5X#~O`Q-J!'׏OWŲث$_SuSƺ& IMH<И>I\0a.ujw5G-ol*<>%Nc!*>ro1e/Z>:D>g12o.f(/njsV4k:{HhF>>P?9<}?9jMLD+F|ƂIJ[0c+Ys-] gKl61ĦpO pwoH 0R.4΀t`;oͩAP_Nm3(- 0v %|]y.\#kGzFt]WY9{%j)@ҔqSj]{G{N?1p"`(2?nY<:SZ|cl˅r[Can3[0kn٣3)VwnW`I{ fۻC$&Ij=%q3FF: xM΋ 6q^Q/$z;Lo FFf@b"2d2b_[#`Gt򐛡˔}gC2I_Ƕgl |ݩ=H7;ʬ+Vk>p+ >U+Oލe'c_|dџX[ޝur͡ 0j7M_359Y43 ]\9Տ=.oa%qpW'sdlT!UR;muMH/M'uՌ#C; U{BI K8FC9j!K(V8#V$̢Gn.!CO#]O><>3(\4z;ntTՏBEU. cG"cԹq e\p|fH_1wF"26`%l:<~ !l~YP%"qN> ^""7p`]Cna!Ne ΎN~]"e쏴xEceis]2m"ďY˴)^[SWZroع8zY74u*"i_&R&w=GAfJz߾e=.Z*1U|۬EZgKd 6FQXc}ʬFiٚV2'Ɨ`cx걆oMVc5o" aG㸍^>S^۔7I& $*; 4ҝjMqxE=gJcR:6"!LE G%eRW_UJL/gMլ]spzc)=)M[Ցa i忄ND#.r ;.l,#NퟨN/N2~lg礒iΘuIAV͢T<1'{KFdx'Jڗ:m_wA򤍦V%)zb̢0yj`]$1Wa/3`QOC:J ,婺uL}5a'j$ƞivh2",P.}k2ZP>}$3O\8PȤ"dcqc3Iik&NgVZ>vSCRשhut*!Z0kgKm?}?sͅyQU4ƌ6ژyF`2H&yU;ؽT\JxԤEmj#HXq^rrqvuj7UIgCM8]^|iwe2e*|XC `/*/vHrk-|L7`M3C ia+˰6n|GCnF %_qp0FZ6)j2kHD܉g~i4LN b ޟ/L<(wӽ?J뒸aH 8@ Ɵ|fRKI>WihLA?lmp.Gxi׎xK-S`Ӳ(⧿4 tE=Wx~Mn^%d(0ub)x`4Tef0R`c ^u|P5L)ɐ}j?fK*T.ۼQZqɌPA-FUˉbL WF[Ze"n^!.HJr9Z%#= 8;~fbo8*}}eRVX Ȥ.xNO\ N1ѩ _%=>(FhcT MuK'D ݈1Mfenv}@Ig@avC| 6W2/ҥw>3"dA O %ٗ]\ ]xWddf5/McۖW6H=Q I U_f Gc9ܭZ {Q<)Q\M¬W33=#VxT6=bˤHyʟӥ?!Ǐ27Vi$"-3X w# Q^;T__(#Ա)~IY~P5kO"X.[a.w220]Uy2g﮷ǂ0q-"t7J2T-iph1#+lon~97VlodUeE{EfQ4ź*8"j ͭ +XUCa~Qr@E~bïihݬP0-` mr.v9H=Za(dI:mN-=Cº$EPsHק7/ۗL.A+¯M9HXԂZBE+&C``D{f͉BNR\Azb6>S4TbDF X_XD ^.[;SNc߅AFS.@(6[,]iFmY1a7EZ+pD3{%R[̈́ŎnՁ}3L)mH{7YZ&MfS>P#N*MQbD:/eqiŗ }+X+SC?Y~R*ߵ&ΣGeK>`M{xh՞[Ⱦ}>~?]O2wu.4pS@JL}g#ntx5ןp2k5pؑ2^ )"ۼGkpzupHcHO­Q5wiH&_d1$q`ܽ"J^ɎcQz(~92 ڿxMJ-&}f^I~.ą{+M`@i){>i0&1]ak =P+F!o8OfcӎEn%(zpX/ BW bkzF/W5d bZljsf6m|O^BBLC+-1Ĭ7EQ j-就ƨOWe:{]89g9җ'>WX-\SpmOɃKXRSq8k_nB RTB l_3aAiQ pS~ᘛB󒜑1xM4$Th]dz _8&3VuTH=;r2at_dtJxQ`.CÞx >8 a;w7wGn+LA|KoziXJUNENhۛ(uCQA/HS$5c֯Y.Zb=KJWMIӸ dpmSBl 9yC!*{@zCҚ:pH|LL#3mw>Mtg{?j* 0N= >d1s 8GU^JՆN^t6Uw}Bq[2y j=U7FYK/Oҩ"PV>~Z㥏dCޗR }lr,[J !#yn?&H+n{F.nᶈ+Fyp]M:c<[_CBTd˼uj{D594$Bݳ6t`y{ǡEQ=dfyz}7K2*/E=#jM_r5)LȡEmG5߈i21boIz\K/+YK 0 BN㙤ROKuuQ+vrqM\SM`! a߉5.\[Kz#WC+r̯~kaGʗY~'6U/F!aD5A25Q0'sfIv,F!B] Up4Mjȸ4ӦLMQ۪I5NzI;Z^%L8_T.QSRPmOE3{k>9nnrM[ܑŞ;V|CIN (qöx t 6tᘿv֥s?ɏξ Ã'b 1fl&: P0upFKӟ2f?6ˁC_'VBg i͸a'oWI lOY*L9 Ύ.$6E]) *aBޖE䈕A#ǔvFgl,.+cQ)H~h!rV`#lV q]96/.;:Tv47¼쬸aQaM&)$C+22>PpaFmn}f}>\ m4pKŁW-Z:&_uEVJ=~a~ |_ͬO]6+㎫`_?ԇ!CC2bx'޶]Ef 7O%B#0s i,"4H42, \gge_:N雊{ _Bvέ捍5 = 8␯I`M~ֲu~(xoMĥrzEފ ^|)T>j},:@ p9)S!EIl%"|Yptk+Np/x=CcY$"-Y5,f-F{) _VbwWU fh +0x#/JׁH@4Thw=k {XKı4vڝMOK< 2~zy+}ꭂ+k]YBk #_|s @yɡKƧ@aג{!l;Vh?K/? Y@?!ՊL3F@S@GA)BxQ:ð*m55>dMօ*L(Y]g -F/dg=tR-Q<6G2WÙY"׮BnPҞ^ݓS.Б )h:4RnoS: SmV$ڼ4c=SѼ֣1o1QGR/ :S^uA O"g j;ʢ'mEL@]%D WŦ'bػ{e0]nػĜ|D>~+jKWxI&OHEֹ[7[8?+kL4(iz`zweU,!< >p "TU诺% v.ձ ys ?2Ȍq PE=&%!yv;f^.*5f z*>:(>$tѹ ?Qhdkc`v endstream endobj 9 0 obj << /Type /Font /Subtype /Type1 /Encoding 55 0 R /FirstChar 11 /LastChar 121 /Widths 56 0 R /BaseFont /IQYXVA+CMR12 /FontDescriptor 7 0 R >> endobj 7 0 obj << /Ascent 694 /CapHeight 683 /Descent -194 /FontName /IQYXVA+CMR12 /ItalicAngle 0 /StemV 65 /XHeight 431 /FontBBox [-34 -251 988 750] /Flags 4 /CharSet (/ff/fi/quotedblright/quoteright/parenleft/parenright/comma/hyphen/period/zero/one/two/three/four/six/colon/at/A/B/D/F/G/H/I/N/O/P/R/S/T/U/W/Y/quotedblleft/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y) /FontFile 8 0 R >> endobj 56 0 obj [571 544 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 490 0 0 0 0 272 381 381 0 0 272 326 272 0 490 490 490 490 490 0 490 0 0 0 272 0 0 0 0 0 762 734 693 0 748 0 639 768 734 353 0 0 0 0 734 762 666 0 721 544 707 734 0 1006 0 734 0 0 490 0 0 0 0 490 544 435 544 435 299 490 544 272 299 517 272 816 544 490 544 517 381 386 381 544 517 707 517 517 ] endobj 55 0 obj << /Type /Encoding /Differences [ 0 /.notdef 11/ff/fi 13/.notdef 34/quotedblright 35/.notdef 39/quoteright/parenleft/parenright 42/.notdef 44/comma/hyphen/period 47/.notdef 48/zero/one/two/three/four 53/.notdef 54/six 55/.notdef 58/colon 59/.notdef 64/at/A/B 67/.notdef 68/D 69/.notdef 70/F/G/H/I 74/.notdef 78/N/O/P 81/.notdef 82/R/S/T/U 86/.notdef 87/W 88/.notdef 89/Y 90/.notdef 92/quotedblleft 93/.notdef 97/a/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t/u/v/w/x/y 122/.notdef] >> endobj 5 0 obj << /Length1 946 /Length2 3211 /Length3 532 /Length 3860 /Filter /FlateDecode >> stream xy<{-QI1vo5f&1e,!.[X"DLRlٕ!keg9z}]u XHi1. 'f%"-(,E@qH ZC EU9eUYyFa@"]p"%@E h sCxR4`P`!84B?Nf@8\H4#!c Gg(&E8p F9r? |Q(sM4Of8gp?8( F!2D`n (3@iҷZK1ϟ9K({'CfJwQFZFB)~9.}4 G) @X(R  Ga4(= n`?)(3_,-"пI"  B0Fa_7B(_))R?ߧ ddy@I^%|Xs)o )@ `1PUt: ?aMFwxKL=߫=2O78تKwrG^ۑˬmM_W-ML3r ~J("rlޕ1l&#CcNHo`r앜(J;vܹnn6WQҗ%\*H#9dUv1c@YGC_а'u,yy'LMJ$evXjiw;FnU (˯Xh~+ QQv2$UU'6[^2ߣ>Ia.r%P4aH4d\-%~UnNǾdDU{^emnG] $N⪻x1^ZG7_~xF}fjq'dzAI 2F_\g ם$Θ@dqYiy"[m#qZP ½l#;Z!a,ȵwY7i?f/ShrV)ӨVma+ޕAsLT#82ܯ96&&<[%{Dꞇcނ6%+oK(zdy.fk}m3JF^:{͠ve9OLzfVv8]sPD0IߔH}>&BiOqsY3U ;l8 ['Y@ C#D>W,\j$dO[1n}!+ Dn6=OsҸgE;~RΜP.jGIY=k[bЯ\c]0<F>Wڟ_RCR[Պo9w^uM |;g+_U/\ZH޼Pf:q85T[wCRdtThޢ]x;4b~ ܱ 5ʳpG&1*u"WF'P沓 }=sl׼[qjDTYvxroėm$fn%uϝMi#mY]XF+L_Х:^/P5fuV&={_4`-A$8;vZ{fyۣsO7WRߧލ; ~˭(j4o/N-K[yO9Dp5ԔytƋWY'=Mx2:=ɛ :E}MPmÇӕ ?&]Ҭu!]q_^}#h@|`RxwJÿYWX萉9iP<1s_ ݓܨ@IĈ6F8EsR^.; e/z qxfW{SK2 a(gNAXߌKnIv Qsۍ/WUpp><iss?Դ]b7xٕP[NhT@xAHɀ%@y.$Q~+c۵ʼn܋|aW,,!ZZæ֓9ڐuG` M}S^e]W]Pz s`= I` NDO7mFw]1 98/VĭPսG΅ oh8IQ %B j$aeKF7aڕ/FkHbQULl܁:"']cj# L$e?bO(a1~=h3d};eV +וnI/6G淭>Devf)jmسf7p{xT􊷊rB.CV{<a|V(Ph7MMpR"Z i"e|~ɽ7owD0yl e HreF\;d!?G(FY`ZSPXֈͺdĸ{Jq\"ù{#={tr@{CH9P28vQcBEgDNګ 2XZ,sM CȎ!d/#]&$WN]q;~vc-ˮ 5kC*hZVS>XLf>̟%)M9[:cS6[fvݎpxF1Jջ~F8!4 -ZS(`[v~F|\'l/ӃM'Au:׏#ߢ2e]t윁_4 J/+ypMf&Y>|B}gW4lK G&V _b WĔ'bk3KFxevFU3k:&y ;i{ZaAjt +EʕP_*q Mtuc{u?F_nju<+,]]KPe2?kYMOdxQjP]A$-{JCIݫWbM*MV] u"H_3{=U2b"Fľ#&S]sƻg2kTY+i`z?WTrfVBC]݅⯼5ֿٿ\+G?O!嬖n 4Z\> endobj 4 0 obj << /Ascent 694 /CapHeight 683 /Descent -195 /FontName /CYGONX+CMR17 /ItalicAngle 0 /StemV 53 /XHeight 430 /FontBBox [-33 -250 945 749] /Flags 4 /CharSet (/period/D/P/a/c/d/e/g/i/k/m/n/o/t/u) /FontFile 5 0 R >> endobj 58 0 obj [250 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 707 0 0 0 0 0 0 0 0 0 0 0 628 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 459 0 406 511 406 0 459 0 250 0 485 0 772 511 459 0 0 0 0 354 511 ] endobj 57 0 obj << /Type /Encoding /Differences [ 0 /.notdef 46/period 47/.notdef 68/D 69/.notdef 80/P 81/.notdef 97/a 98/.notdef 99/c/d/e 102/.notdef 103/g 104/.notdef 105/i 106/.notdef 107/k 108/.notdef 109/m/n/o 112/.notdef 116/t/u 118/.notdef] >> endobj 28 0 obj << /Type /Pages /Count 4 /Kids [2 0 R 30 0 R 33 0 R 36 0 R] >> endobj 59 0 obj << /Type /Catalog /Pages 28 0 R >> endobj 60 0 obj << /Producer (pdfeTeX-1.21a) /Creator (TeX) /CreationDate (D:20131216170604-05'00') /PTEX.Fullbanner (This is pdfeTeX, Version 3.141592-1.21a-2.2 (Web2C 7.5.4) kpathsea version 3.5.4) >> endobj xref 0 61 0000000000 65535 f 0000001998 00000 n 0000001893 00000 n 0000000009 00000 n 0000072664 00000 n 0000068531 00000 n 0000072509 00000 n 0000067283 00000 n 0000055593 00000 n 0000067128 00000 n 0000055122 00000 n 0000051456 00000 n 0000054964 00000 n 0000050521 00000 n 0000042109 00000 n 0000050364 00000 n 0000041493 00000 n 0000037511 00000 n 0000041335 00000 n 0000036574 00000 n 0000029651 00000 n 0000036416 00000 n 0000028560 00000 n 0000019679 00000 n 0000028402 00000 n 0000018423 00000 n 0000007708 00000 n 0000018263 00000 n 0000073333 00000 n 0000003851 00000 n 0000003743 00000 n 0000002149 00000 n 0000006273 00000 n 0000006165 00000 n 0000003956 00000 n 0000007008 00000 n 0000006900 00000 n 0000006378 00000 n 0000007341 00000 n 0000007101 00000 n 0000007586 00000 n 0000007611 00000 n 0000007673 00000 n 0000019161 00000 n 0000018850 00000 n 0000029198 00000 n 0000028909 00000 n 0000037105 00000 n 0000036861 00000 n 0000041895 00000 n 0000041710 00000 n 0000051130 00000 n 0000050817 00000 n 0000055469 00000 n 0000055332 00000 n 0000068037 00000 n 0000067677 00000 n 0000073082 00000 n 0000072889 00000 n 0000073412 00000 n 0000073463 00000 n trailer << /Size 61 /Root 59 0 R /Info 60 0 R /ID [<69ABC077947C04EF62AE7EE39A4FC4E1> <69ABC077947C04EF62AE7EE39A4FC4E1>] >> startxref 73666 %%EOF g.data/NAMESPACE0000644000176000001440000000012012044275212012647 0ustar ripleyusersexport(g.data.attach, g.data.get, g.data.put, g.data.save) g.data/R/0000755000176000001440000000000012044275212011640 5ustar ripleyusersg.data/R/g.data.unmash.R0000644000176000001440000000012012044275212014404 0ustar ripleyusersg.data.unmash <- function(fn) gsub("@", "", sub("\\.RData$", "", basename(fn))) g.data/R/g.data.save.R0000644000176000001440000000122012044275212014051 0ustar ripleyusers## Save objects in position "pos" to a delayed-data package: g.data.save <- function(dir=attr(env, "path"), obj=ls(env, all.names=TRUE), pos=2, rm.obj=NULL) { if (is.character(pos)) pos <- match(pos, search()) if (is.na(pos)) stop("pos not found") env <- pos.to.env(pos) if (isTRUE(attr(env, "readonly"))) stop("Read-Only!") if (!file.exists(dir)) dir.create(dir) if (length(rm.obj)) {rm(list=rm.obj, pos=pos); file.remove(g.data.mash(dir, rm.obj))} is.promise <- function(i) is.call(eval(parse(text=paste("substitute(", i, ", env)")))) for (i in obj) if (!is.promise(i)) save(list=i, file=g.data.mash(dir, i), envir=env) } g.data/R/g.data.mash.R0000644000176000001440000000032012044275212014043 0ustar ripleyusers## Convert object name <-> filename, e.g. aBcD <-> dir/a@Bc@D.RData ("@" needed for Windows): g.data.mash <- function(dir, obj) file.path(dir, paste(gsub("([[:upper:]])", "@\\1", obj), "RData", sep=".")) g.data/R/g.data.get.R0000644000176000001440000000015412044275212013677 0ustar ripleyusers## Get data from an unattached package: g.data.get <- function(item, dir) get(load(g.data.mash(dir, item))) g.data/R/g.data.put.R0000644000176000001440000000023612044275212013731 0ustar ripleyusers## Put data into an unattached package: g.data.put <- function(item, value, dir) { assign(item, value) save(list=item, file=g.data.mash(dir, item)) } g.data/R/g.data.attach.R0000644000176000001440000000077612100606230014365 0ustar ripleyusers## Attach (or virtually create) a delayed-data package ("DDP"): g.data.attach <- function(dir, pos=2, warn=TRUE, readonly=FALSE) { env <- attach(NULL, pos, basename(dir)) attr(env, "path") <- dir attr(env, "readonly") <- readonly if (!file.exists(dir)) {if (warn) warning("New DDP: ", dir); return(invisible())} for (fn in dir(dir, pattern="\\.RData$", all.files=TRUE, full.names=TRUE)) eval(substitute(delayedAssign(OB, get(load(FN))), list(OB=g.data.unmash(fn), FN=fn)), env) } g.data/vignettes/0000755000176000001440000000000012253674514013461 5ustar ripleyusersg.data/vignettes/g.data.Rnw0000644000176000001440000001253612253674304015313 0ustar ripleyusers%\VignetteIndexEntry{g.data Package Documentation} %\VignettePackage{g.data} \documentclass[12pt]{article} \usepackage{fullpage} \usepackage{indentfirst} \let\code\texttt \SweaveOpts{prefix.string=gdata, keep.source=TRUE} \begin{document} \title{g.data Package Documentation} \author{David Brahm} \date{December 16, 2013} \maketitle % This is the public version - no local packages needed <>= options(width=80, digits=4, scipen=5) if ("package:g.data" %in% search()) detach("package:g.data") # So it will be in pos=2 @ \begin{abstract} Normally in R, objects live -- and die -- in memory unless you explicitly save them with \code{save}, or save the entire image with \code{save.image}. The \code{g.data} package allows you to save a whole group of objects to an associated directory on disk, then access them later. The objects then appear to exist in a particular location on the search path (position 2 by default), and are readily accessible without extra effort, but R does not actually load them into memory until needed. \end{abstract} \section{Introduction} In this example, I create two large matrices \code{m1} and \code{m2}, and store them on disk in a ``delayed data package'' (ddp). Normally you'd choose the ddp location, but here it's just a temporary directory. The \code{g.data.attach} command attaches an environment associated with the ddp directory: <<>>= require(g.data) (ddp <- tempfile("newdir")) # Where to put the files g.data.attach(ddp) # Warns that this is a new directory search()[1:3] assign("m1", matrix(1, 5000, 1000), 2) assign("m2", matrix(2, 5000, 1000), 2) ls(2) @ The \code{g.data.save} command does the actual storing to disk. Once I detach the environment they lived in, R forgets the objects: <<>>= g.data.save() # Writes the files detach(2) @ In the same or another R session, I then attach the ddp, and the matrices appear to be instantly accessible. In fact they are just promises, so the first time I access \code{m1} (by asking its dimensionality) there is a delay as \code{m1} is actually loaded into memory. Further access to \code{m1} is quick, though, because now it's in memory. Note \code{m2} never needs to be loaded into memory, saving time and resources: <<>>= g.data.attach(ddp) # No warning, because directory exists ls(2) system.time(print(dim(m1))) # Takes time to load up system.time(print(dim(m1))) # Second time is faster! find("m1") # m1 still lives in pos=2, is now real @ I can also put a new object \code{m3} into the ddp and re-save it: <<>>= assign("m3", m1*10, 2) g.data.save() # Or just g.data.save(obj="m3") detach(2) @ \section{Variations} There is a function \code{g.data.get} to access a single object without attaching the ddp: <<>>= mym2 <- g.data.get("m2", ddp) # Get one object without attaching @ There is also a function \code{g.data.put} to write an object without attaching the ddp: <<>>= g.data.put("m4", matrix(1:12, 3,4), ddp) @ Since we're done with this example, you may want to remove the ddp now: <<>>= unlink(ddp, recursive=TRUE) # Clean up this example @ Here is a new example with a slightly different approach. We skip \code{g.data.attach} entirely, instead attaching a list \code{y} directly to position 2. \code{g.data.save} still works, but you must now tell it the location of the directory: <<>>= ddp <- tempfile("newdir") y <- list(m1=1:1000, m2=2:1001) attach(y) # Attach an existing list or dataframe search()[1:3] ls(2) g.data.save(ddp) detach(2) unlink(ddp, recursive=TRUE) # Clean up this example @ \section{Under the Hood} \code{g.data.save} simply stores one object per file in the ddp directory. An object \code{xyz} is stored in file \code{xyz.RData}. You could access these files with ordinary \code{load} commands, and you could write (or overwrite) them with \code{save} commands. Unfortunately, in Windows the files \code{x.RData} and \code{X.RData} are indistinguishable, so we modify the naming convention by preceding uppercase letters with the @ symbol. An object \code{aBcD} is stored in file \code{a@Bc@D.RData}. \code{g.data.attach} contains the magic. The environment it attaches contains only promises, implemented with \code{delayedAssign}. When you first access an object, R fulfills the promise to 1) load the data file, 2) store the real object in the environment, and 3) return its value to you. Subsequent access just returns the real object which is now stored in the environment. \code{g.data.attach} also gives the environment a ``path'' attribute, so \code{g.data.save} will know where to write files. \code{g.data.save} is smart enough to only write back to disk objects that are not promises. It also has options to allow you to choose the objects written, remove objects, and set the directory to write to. \newpage \appendix \section{Function Index} \begin{itemize} \item {\large\bf Create and Maintain Delayed-Data Packages} \begin{description} \item[g.data.attach:] Attach a delayed-data package (DDP) \item[g.data.save:] Write a DDP to disk \item[g.data.get:] Get one object from a DDP on disk \item[g.data.put:] Write one object to a DDP on disk \end{description} \end{itemize} \end{document} g.data/MD50000644000176000001440000000121412253765235011760 0ustar ripleyusers8185e3643dc9c71adf2f32c139541a26 *ChangeLog f66666b8cc7fd9915e389beea6e8c7f4 *DESCRIPTION 0816d48257794f25a67b80e7eb5c17d5 *NAMESPACE d1efc0661a32b140b5a7e9fe51385e55 *R/g.data.attach.R d5226ab665136647a70d33bfc415c227 *R/g.data.get.R d322b4c5ad903d98d3347e7da024a5b4 *R/g.data.mash.R d91db07e36234681aace6c413e05811c *R/g.data.put.R 4941d37edbb786615a5c9d97511736c6 *R/g.data.save.R e38c896c3440c8ed15e652781cf6a8d2 *R/g.data.unmash.R 1d31bf6afe14f3e9ce9cf77975cd495b *inst/doc/g.data.Rnw 6f94c727ac105e862acf32227873dd26 *inst/doc/g.data.pdf 593ec8da4f7e13fbbb1cbca61c33b967 *man/g.data.save.Rd 1d31bf6afe14f3e9ce9cf77975cd495b *vignettes/g.data.Rnw g.data/DESCRIPTION0000644000176000001440000000116312253765235013161 0ustar ripleyusersPackage: g.data Version: 2.4 Date: 2013-12-16 Title: Delayed-Data Packages Author: David Brahm Maintainer: David Brahm Description: Create and maintain delayed-data packages (ddp's). Data stored in a ddp are available on demand, but do not take up memory until requested. You attach a ddp with g.data.attach(), then read from it and assign to it in a manner similar to S-PLUS, except that you must run g.data.save() to actually commit to disk. License: GPL Packaged: 2013-12-16 22:06:04 UTC; a215020 NeedsCompilation: no Repository: CRAN Date/Publication: 2013-12-17 07:09:33 g.data/ChangeLog0000644000176000001440000000122412253674147013224 0ustar ripleyusersNew in version 2.4: - Vignette source moved to "vignettes" directory New in version 2.3: - Environment now attached as "myddp" instead of "package:myddp", making searchpaths() useless New in version 2.2: - Vignette New in version 2.1: - g.data.upgrade() removed - NAMESPACE added, making g.data.mash() and g.data.unmash() internal - Code split into individual files New in version 2.0: - All data files stored in top-level directory, eliminate the "R" and "data" subdirectories. - Filenames include an "@" before uppercase letters, needed for Windows. - g.data.save() knows not to re-write promises. - Upgrade from v1, with a backwards-compatibility mode g.data/man/0000755000176000001440000000000012044275212012212 5ustar ripleyusersg.data/man/g.data.save.Rd0000644000176000001440000000720112100606274014573 0ustar ripleyusers\name{g.data.save} \alias{g.data.attach} \alias{g.data.save} \alias{g.data.get} \alias{g.data.put} \title{ Create and Maintain Delayed-Data Packages } \description{ g.data.save reads the data in search position "pos", and writes them as a delayed-data package ("DDP") to "dir". Data objects are initially created as promise objects, the promise being to load the data and return it the first time the item is requested. g.data.attach attaches such a package, in position 2 by default. } \usage{ g.data.attach(dir, pos=2, warn=TRUE, readonly=FALSE) g.data.save(dir=attr(env, "path"), obj=ls(env, all.names=TRUE), pos=2, rm.obj=NULL) g.data.get(item, dir) g.data.put(item, value, dir) } \arguments{ \item{dir}{Directory (full pathname) of DDP.} \item{pos}{Search path position.} \item{warn}{Logical: warn user if directory being attached doesn't exist} \item{readonly}{Logical: set an attribute on the package that will cause \code{g.data.save} to abort.} \item{obj}{Object name(s).} \item{rm.obj}{Objects to remove, both in memory and on disk.} \item{item}{Item to retrieve from an unattached package.} \item{value}{Value for the data item being put with \code{g.data.put}.} } \details{ Data stored in a delayed-data package (DDP) are available on demand, but do not take up memory until requested. You attach a DDP with \code{g.data.attach}, then read from it and assign to it via its position on the search path (similar to S-Plus). Unlike S-Plus, you must run g.data.save() to actually commit to disk. You can create a DDP from any position in the search path, not just one created with \code{g.data.attach}; e.g. you can attach a list or dataframe, and its components will become objects in the DDP. In this case, the call to \code{g.data.save(dir)} must specify the path where files will be saved. If the DDP was created with \code{g.data.attach}, then its directory is known and does not need to be passed again to \code{g.data.save}. The filename associated with an object `obj' is `obj.RData', except that uppercase letters are preceded by an `@' symbol. This is required by Windows since `x.RData' and `X.RData' are the same file under that OS. Unexported functions \code{g.data.mash} and \code{g.data.unmash} perform the object name / filename conversion, e.g. g.data.mash(dir, "aBcD") returns "dir/a@Bc@D.RData". g.data.get can be used to get a single piece of data from a package, without attaching the package. g.data.put puts a single item into an unattached package. } \value{ g.data.get returns the requested data. } \seealso{\code{\link{delayedAssign}}} \examples{ \dontrun{ ddp <- tempfile("newdir") # Where to put the files g.data.attach(ddp) # Warns that this is a new directory assign("m1", matrix(1, 5000, 1000), 2) assign("m2", matrix(2, 5000, 1000), 2) g.data.save() # Writes the files detach(2) g.data.attach(ddp) # No warning, because directory exists ls(2) system.time(print(dim(m1))) # Takes time to load up system.time(print(dim(m1))) # Second time is faster! find("m1") # m1 still lives in pos=2, is now real assign("m3", m1*10, 2) g.data.save() # Or just g.data.save(obj="m3") detach(2) mym2 <- g.data.get("m2", ddp) # Get one objects without attaching unlink(ddp, recursive=TRUE) # Clean up this example } \dontrun{ ddp <- tempfile("newdir") # New example y <- list(m1=1:1000, m2=2:1001) attach(y) # Attach an existing list or dataframe g.data.save(ddp) detach(2) unlink(ddp, recursive=TRUE) # Clean up this example } } \keyword{data}