d2G9R _6ǻ(/`}j$s3؝%7Q ZKo'U/q0dQU(q`b]J#i$׌T ƞ}d.|g1_I!u!!:Ev;ۊ\o$X+IѭŠc"/w-6 F倣=6IJTNa>|@룢\ ~bWg "/ F~}=%W Kv8lo&NUU숵Z`@@|*qO )C bUOYrQ`z!CVi1q:\oI(I`}кh~VN{rwD0ϙuܯ|oOY>z@G~Ҁk̪$òP  .3;} BK.ŷUsR1B_ʏ'qLjO.e}kF/3]Aʨ. Si(G` \e{I&`?>N+ kTns~+[3<z>@ ?/ѭH;n$t*̺3j@E?9h;m԰3j"qo}!—!ذ3"R;v0I]0K$*N>DVvHҰ43徜Kufc"Hrxs"Hڨ1Kb%m6lDq[<'E vPCms^OwbkCJ[?@YDxӵzʸݹ;JRa++RNGA]\1۰_ wIDM=;Vôs}an޲sZʫ~j lWI৸Nz/ -e&,wq"DeVj~*Z~ϸz Qk 0}31EyN3`!!W9)𪱳ouKaA+yFJ%ƛxEem1(p ~xq~)p5~Y7j&1޲k 3G2R?U9<"E7hR/AzJ>hMb7jNx'[Yt"zA e(՞*rʿ&=} po>#hE')2R+r0V0\:=# >.9y(GX[K"@TB.CZ˥HJf$1;j@2%D #rﯚ0 AU1g1.xх`0E@Ӷ&/C 2:h9v)z0OFx. @sE3Y0%580ޛ:PCy!v JOYb8{G!F@9*_JdA(M( 9赣VЮښl80֍ 2R11Ju!h ZMZ ߸w2 9 I,kVN[L5SXےwga#[݂"\Dc )kF- J&тr]Ht}mGg4Ɇ{NޭHIo=]}.R:plZ%JۺKU`,gB/rH.=f88 n:1ppKLÔ_&Pb)<$NSm: :UU\d~ o$wq6ELko:(ravenlibRlibrarysparsevctrsMetaRd.rdsfeatureshsearchlinknsInfopackagevignettR.rdbxdocdesign.Rmdhtmlindexhelpfiglogo.pngAnIaliaspath00Ilibsoteststhat_snapscoerce.md_characterdoubldummyinteglogicalit-arithmatic.R-vectorextorshas_elements_nalagmeandireplacesdqrtvawhichittype-predicate.RDESCRIPTIONINDEXLICENSENAMESPACENEWS.md4j DDD"1")EFHFQQaA jB_ N볔` /Q9]r@И3ȳJ"KѭqEB參8N!I&K(b-}ÊX$9r]q @ ׺ yuPoPa1=Gk`;dRP!os@a; 3y < cwF9xm(pL0"kCI{b'alHv|uhm)t z,f_8~@y.GLTlVapiHgH@b#<"DP> @M#Cnd" Cx:H*1.a{181v pxv[8E58zHc&ꡉ!cJ6hb8$1WCzyZP=0Y>$< K9!OA!p&KSƃ\C&tewe6l (/`dW[o5Fݤ& zQhFH$I>NF]dz69MOO^u7%;;))'tDej,\y%/8Ω׺ʱ& β}/9ޅ?25\L*L%Jx2󶼨*5%m!^^6ժ|1Az: ԊB'w :2eQK-#.!E!葁`_a>+iY԰Y%.@[A͊gxa5 U=6HGES2dL@ُVhe=`0t`Hy[vpǻctȝ i* dU]2w7LƝ銒wHrhΚE~NhSR~0T!;[ j@~塒H J-M}JPM(w&+ ڷ2jeN-%M7- yԙVӫfC۾ 5ڠKЋA [05+~lB=t{y[ՋPV sߚ ͌)LӠM3=$ϳ& %IuZ~wfRjƗ.Ԑ j);xSU䷽{Fv?C/)Cp=M}e*5KhJ9S Z< hJJdC/+9j؅f]oVe@tt+O}RNuM7]. B-,7 ׄs*YX. =*ܴcQX8g,Mt6t*ޚC4ρ?԰{%6Zb=k)\:ՂKL菶F8EO>z.bUR2U9-Rѥ%ySC2,qϹc;ҮB+Y鱕XiJOt`%#9B[SAhɅQޫQU(GCSj\>qIBdgg I_KuFJLJÂɱH 81tM<2:[0(>q]44elsdEa%x46#z)J)ΦzҘYS$h`56 c(⩈şBNuN-32vvj嘼#:\2A=:I[2\,)=@$T! Iț}mlF*.T}d.}q<|U0]lȅϐТ*S V`A g=xYc#ؑOw߫O4iVΐZ4SEC++ KLl<'*bՈ*6'Tvü}I4˺߽*6d,KSHX(f UNQ_O\ί%Q+4t~i=T*dV:-ˏ4i&s/,?Ԇd=,ۊDKj<ޠ>4'}Ajǹ>{W<}wz/^UzR UϧiOtKV.61Uۺ+_ +}nN6;tm`2q/<5ߘ+ap{84pjmp\V-[!$wey0B剆ŌDqfwՓ38ODH{nՊlEsu{.X<3[DglW ap0#7mEz/W꺨?;XRz8H ޺ y0 1ݖ Ztb-2-]Zkإ򂋸I9yy<#4K EVYo06e+BWK]ψ>WHEtc ?p6v;GEB/9"$}ބ|>>:;#dDȌ׋RD\`A%Pђ)zRE)FLJ cn*<嵠Vu(^Jeϴ^X La``d˨'(De7ˠ PvNO3cit+yooY"qmt L LxmztT ۈ!!1E8H;D qCB OǭCxЯL48͔M^U)H!׃ٞD|~J}B O-V(jb4Ghœ6y8pTW >jVKejIJoM r4;+<&Ҟ U?0dt>5Xeؘ'@|c08{vCnיHev-5ڭsBo5aZZqXӽĒg:wja4]C=*CZu`(Ҝ );Кy#Oy]g64lxYg 7/ݚ uTj1/!qܤ-}c%PCB)͌w'.[Iv-iA:s93;}w_We ukbB~ Bg.ҦܵW#GҚ`a4 ҀA5eWTY2 9YRrm\2%I*2gn `)!I~*9x:=OVo6cN -aJ~;myHCvEQ-sH߾$XOYx~Q4Jal]LǓh06{(FxiK.ILBؖ 4g]PtbI 㖏5fkE]  FkաOjU]9Ǟ#aK BLٴlraٵFUn=~6}LeunF'UmïO>8|ۯsژkID$ ݅E[z U[Ϊ9 M\^[ c,"sr8r0lI,PlT 5A:>1{sjIın pH&`|H.,fxa-1Fgq,Ălw(N<=P-y?ě.1SoINl`iYȅfT혇N\ᄂ-3'Ma߿M34'`x6Rjp:~~7<2k^\VSfj)#EjG^l+_l^軐#EݘivbJWH^Gxԑ9-~kZG +f$b= 28+OV%x ^qc[prW2 =b\/tբZnh5:{sb:x.nϨcu@ 4JcøM&n뎲?k6u }Z(` YُʆZΆW_hWG40N~oު#d~n|:kp[ژsg^~F~ywD+tmDӸFǖ}eXL| !oL}`as[)8ZB41596%xw6v9mV{%:u!pRc>BV̩1Y/Dոꆶf!(Em`NlYOb#WVB)u%e2o?Jn.Ƿ=ҽ^8?!5dBÙ]N֋UiDܽ,}}،g{yQPWg-i3 ]k#'`k= 's4ħwnZƹ)?FSB` ֍;sw&mP0 0Q0&&|^'7\,4L^םB0vAE|-0 )S*KG$> Hn"+ Z $8LYޞgf'x#ןwH)ur[O@6]bv ЃًQ!%$ i# File share/R/nspackloader.R # Part of the R package, https://www.R-project.org # # Copyright (C) 1995-2012 The R Core TeamThis program is free software; you can redistribute it and/or modify # it undertermsGNU General Public License as published bthe Free S Foundation; either version 2, or # (at your option) any lat.d inhope that it will be useful, # but WITHOUT ANY WARRANTY; without eveimplied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # fre detailsA copyis available atr/s/ local({ info <- loadingNamespaceInfo()pkg <-$pkgnamens <- .get(as.name(pkg)if (is.null(ns stop("cannot find n environment", pkg, domain = NA);dbbase <- file.path(lib"RlazyLoad(, ns, filter = function(n) n != ".__NAMESPACE__.") }) xBi `a , b C"?Bi.B@b ` 5#)3/%3/gKKɇKJ2JKRa",&09٩) [Wox]M0 tJJ&$ 6&69BbME% %?|>$̀ Qm4 +, 8,2D>o3xwC4.8gcyr'n?Gs;7$uJd mTۢuCw1}0s#Aex\K_;ʉ/蠣w)@b-ȍ!3rHnrKR쪮샜fꫯ^Xm5ƣh?FWp=u?\FM}_v_rhL>s+|rqM+COfudԓGGIQ[^jSZ+#x-݁}*#dECú2װ>,ц-.gEH ,_޸_h5IpT .͑L8H)r׹1fU?D0yTg*5 '^I xb%Q(~YT7HT^:4_6o-&>-jm2g߳LH *.UkVDxѾLHi7B?.qk 4P4oh:XL-YUSd)z8Qܫ< 툊ߣ%(<}kQjXy:8Ue Sduuz=F9>*&+ɜ/Z3`v\Q+eruCYܡM椫Y<[D_]Y8 mY"CRJ|z04ѾsB?E_k4C l0 va2o ]vOAªU̠ޑQl/jkBQXg Ҧm C?61; 9kP@\uJi8|&Vhhpr+>wxVXytȨ΅zOXId^-OcSHuڦ{VxT4i 4$]  I9=&&o;1K0Oۤ*kjF5)IT u A8~,Nyv [zX1#kh<2 CJ@dJP2Sŵ:` 6<:XMVᐠ661t '\|z#| #ie!qO2R ͙Li8u0\[`Vg巚B-bunt+ve'9sJX)7Aʫki}\x卣9Ԫ @{ k& ʜ=B'CG`et H@,9`*mk$Kmb`Nr &,$ ^'xճ)kd̫0K JY|<*PPQA!HV/Շ?"*xXw*Q[E{5o!,DʡBˆCoj*>'r҃IX{TCecm쵳bjBG zÃ#ޤ3WYyPmO׽rM616VTjaIqcc+Qlmu4L6ՠl!qR!л$:-SkEgSjp] &~!sz|[@.z bP#9DQU{xۘXPIYQ˥@6V*nDF"Zl ˶=i֦W=B W~dXg0'C/ @) k#H=gBnY=ےh ӻ[t2GsE8,j,mx|b%BN-Q' gm<[Q!nRz7E"b%n=j>߾&:ƔQ)P1yas#Bz/s ?VGׅo~9-_lsJ Ƶ|„ksVڥ. tp]hUAUbWОXXY ҁ~㼯2`2q6FjI]x ef 'Ca%z[.R^U`Clmyꜻn]Ysh[K]VBnT̾7ZrKSrzzyNe\vhk̄3I.C./*yۦAv6/.˂JN[c|V\QS Y JaBBƍ2';HGxxcIHO=nQ[Ogz&kՆ P4m͌T A&qTM}A܆ cل`tavr3%Kh0Y_R3Zcv[&-j;oec*t۴,}ީC`#-<Fkg6FnTL R #؅9Ε=)z8.7pyƢl{*o lM|Jz:9Ce[gC Ox{S=' /lp pllx!?LꢺXw.wRŅ;Zhp.&f˼"kʬM#(9YVصN2>f^a#=l-%ϺdSnfYC^.0~Sig90g) 0&ia?L 0&~x 0&~4L U0"kcءkqP,_w?}[[~SA&wwF=.w?wNrOGNo'|.;'}|ͱL8IHg;YfZ8'-*~70 $ޗ6=&d$?ֺPo/9=4 dgFN ͖Wfee{{5 d 1# '..H,*N-K.)*  xW]kA4Ij4mZ ~ 4ZAB%>feg6)T&ݛI {w9w3sgN&+<+?1SMc{e1YheCR/IHnK=|!XAj~=0ܟN޴Rj4w@ڰɩl̲SFiޔCZdf,NJ)HY+L87-75Ar$jkrK=O 8jWoQ5Y8}G ky%PA"[ &6B aA-iP|5#{}d xUKo@$vly6ބP!\+JMk`'D႐fd!Z$tE9~hxA g;;A~Dã#O&EHB._+f醽^)(# !"y<*hGk q!,}=D#,7XdG1B65,!NEK,`lGER:eB=lѢ<"H8@\(b(RTWj"JuB]UYnOrb_\e>I)內 s-gd8BL"H'ϨRJ2gdOMՍd' ,$kȃ1]1oS~Vd6psHj * ffl6$2eOKi=HuKm #٦1b ħ)ZܱgR|В @wR0r$Ai%_D9^k*b)t'c/=k+{XkW%EUs{D!w{NB(~wQR",H3T1I}sٖyaPjvN:&lƲsvɺƚXޗ 1wLD?ՅI|~cyy[u\o ~EUm]q &D( (U*N h x~MG1C" @kxRJ@d7m+A*XOWSϥMbB$!JK^Dh5^;I`=|"Zq< |G2 3)QIjyp|75_&k'g/q!qhNʷȺ*ιʀ15I.N$uA^dy 7eբձ(i,TDTo7%ƪxΨ ^fTf|I^fփ]"=5F4tZ5>P /ז'3QZ+~hJYI̙rrDAS3FA=#coi(]kLWf5~x]&=>}vqJxY[oG]{;8 / @ TKR EbةPC_'}T2/U%7d/ÙsuXIG"<"lfrӭzjr^޹#m)X$&$6%r$F$x {͡Z_rxZ߂ԿQ_!!VPg" yI5C/*ơkPU=G6"OFe~*v`/A( Wˊ$ ~1sN?B?!4{j+΀Ru <8s4 =9.O(Oqí:((R2zl0"|֓g|{fOF0cx$f6AUsd!d" 1Zm q[f) p@.-foZ<`8Ά\_4wwhp}'nZ<38,U)ǜ1>8l|RS :oZPIG>ϸe!mid5a>f"*M}:a$3u:|(3n[#j8h`z_}z77?Q͢ƫ$?$VsJO69}ANK,ln#jNҲ@ d?-'(0A0e `@ ˀ׀u``딸|Fk õ) &МKPpg}{\߱'b1sbN>4txX[oE_[&lKriL! $- DTx7$J ^;jfo^KZr̜Ιogvg8M%NR<<=l%F% IQ1X#M񻭭R'9kZ)g;ЙYwz'Z߉g86kN%$tЗFi16ޡYh<E1xvSA ~b[Ġ7W5\7>V˚_bVaB5*IQ02qAqh0z9PXzW5-՞>zv .hݨɱdz`xgi4\73Viu!I))iiBAMJ}rq Am3(i{3"2؉`x:lUN_3M]9#4{79(ļxvuVXtV8`-㰩`B%BP빜s%a3daas؍5U /.5e="Uf^s<2t\`~sX~E7*2%*l 9U016W(2^R N6_Q2!v?ڒ@ HY|P@ e`76qn>;V@q # V!*10JDc #BcxV^;NbM)h *8 N=$T"u(nvd{vgyz/ BAL2b>p`o]:1.]iBazu&h]?b$: .){2 -c&CG`'!;Xgc @Os:;`o=6\ex v}k3K>$.!>< D:sc/@y j= ?|6Tݘ  4J)=ZGTTr+\Ւ(L&% f8C&,mEιLU_ˈJ<⹃BރśUÀip lZy";uGvdהVQd~׮:+Տ''ѵd*hHRn*_bKo'ꮒ!n$( UUSgEc v_˳,{qN4>Pjhr'/2Q\>ȬyvJ6Ӄ71;4Lט,?a+_]_$EIs%GW'ST7sC\Vy?WY/s <&a}DJV[Ǝb=ZV500~:tt /AOtμB]Gĵ؅jHd{5 ص?ԟ $O ny.Q+Ջ,Iszxκ8{|9,|o'9UW_ꗁk0xj:7{[Pad[7!ďq!m(\Z!Sĩ炄RdmcvJp BjصgK_3k!D#>8{]co>U #z5̾ʄ lVnivJϼ8f˕d;}V14z`0ɑ$t3;s\s[_G蚠 1v۴q 2<=g G<`6`<y]wA~Sr &̇~fs/PV3ɲthȑ/p>U̐Ɠ0(`ߘUSt( pD_GceTj" ƤK<&rM{t5ҫ"_YЋ2Dp:uEڬ߄i0ؾ_S[Vtd~^zFrn*zh\H2^QW~H-au Qϔ*O?:RUy+媺FGQ8ZA 9y\C>g/@B>j1-hw>h?E5.hcUfvDvƇ擫,srPܮH>!WJ"Sȝl]RVK$4:2(*ֵ݂QaqETh m%#%7J`C'MEtf?+Hէ^)!oVNf|rt@XͳɘR<_G?,(iz/+9nj,&@~:>QD:IsQ^D6t98wHΔdmkjP:DG0*tbjCKxE7%=4 )mVj3t [IB?#L&^Ϩ=郍A\P.Y?X9 h8g4{<_rԾYIm-S_EkS@/mAA z|#T wxVϏ@cYwՈ^$&=x28n6&tnBڂl?ŘPa,%J7{{tc:3L+}xSǘ.̦ QMIc|v(`0iRt:7F$,`7((ҋ+ƅhp" % e9_+Mۼ[)o*9%F> #h@7MWBש[tB?4x PG=a7a?}u֡YE}A~ &U3)Џc? / /SIF_;Paq?^{ S(F^2B]TNؿ rr%EZlȑ"ҢN +8A5Q,'qǓ܌}2jBh [t,N^Bw(Yl/ vK89@+1a-֦ϡ5G2Y9Ϳ~Ԕ̏oO\}y~AƱ o6<:Fa z3XU3"Fc "jE RUC@ĉP\ cG^'q? BJvC"%`y_&jjq|Mzɚ&8F {>/*-u+ %uD}$4VI'|9 NJG*4܋|77ззd7[m" \ \osؙ<USq{˘ԇc W( Y;RDtCj7v>n./rig8"?n]Y k;8lLwb}}A}cMƂ֚Ӽyc̗#u?$򸪀$G`3 q5 F'z"&l!@g ;R4y{ߛ7 cdM _}80fdbc04`SV&AFV&Van4 `?!/(2ƒƅh &2I " /QD[B]d'#t*7$:EcS <'Cu`>EU?Do8H7; pn"R>Q\ѕDg85SĻbjÊS>q-X\iO%‮a;Q?IB1 Y&Qsw\}u;I\5X며mǑ2/Uh >tӼ=Δ|[#`kHp7S8*p AHSAuȾl ~.Eq7YEbу'fcHź6Bڂ/x1&7+;LDiu}}o^WcLgIwc^3tҘlFl^G|& s&neqGA0`7) ZBR 48K4b;2B3&U`: ûE8%l;F&xB-< p:C%tkAgu O Sgi6sW?Z3l&З_Hc'wd(G7tRKLF1iH좂m̏#o\(`hIIQl*r8A U|M۠(Udi52JX,珴z ˎopZyVO>؍h(#Cd-q):CBpsvt5ͳ {w~pB8M%_xi<&DS!MB4bz@#7b7_%|6Uq*-7f&<XeO؍o`iSIº 5ƒTz"ph+gOM `b?sG.ِQ^X. ؀Þs}|f|a8dͲKci܋n{$1ekdT0Y45ӎopW1؍.icQ!Ҹ RDzu=>N8 .S`: "@.E-<OpaA5t[Agu'>.`67Kl q/85ĬRJDMA8Kΰy@_ ~!J2z~CQFÏIxՔTT#/EĮ*ضO+Sj M) z!GڊHډ3_ߪ0P7 abY8LG~8%Tz/\FKmrydήvI89@#a6a[u _@kEz &㙟4[3`9~qƱԞ7F0_P,ĚX4r"͋[meq!^B.yF-<kpE t;Awu!6O`&JbT)Hnkpxdߑ ǏWf*)RP(Gd`~8cK)4֖ThN^ِ#mEE;*uqh6OFXM.!ڳgAE<=̶zcluKw~xUb3>q~sq,uǑG(Wo. z&Vhb@dGqEV;mq,c6DJv*V зK4{q @os( mpMGaތ0”뭙vF?6 fϭgG e1pLn8L=DRYH7I#VG8 gxrާ L:<;wy7DŽT3 ||цo2t;o $輁'hvSsc>݁1قCft{@:]J̒*E^p%K/IFo(ʨzrcol(H B, $vYƋ//( X[:RQuyeCȿn0_W7 0GFOC/a}*&dzpYTƬ!ps&f{^Z_1;*a.s쏢HjMӝOCI \(bLXHҸVٱ?d"e;JUg죺>t=fΤ|0kH k +T:"G?_?r+iR i1^bLoYJ&_ou:p0tft'0Vp/(Q-F(ƔI?ҤL;nL ypk\`7PGECd-q-E1Js6U`:#ACtAgutO v=gQgћ56ۈEbT)IDMAqc H2zކ`2i/RI LB9f/_NQv4(@vʆi+"-j%Ώ}|M1_6趆9ed:|6}JEh Yx$s,6Wp%ÜgB2Y5?~Tϙ oyr(pXnF0P,X$O2"݋h%{g!lHy8DtCfy []H4q$(zB Ko@^<$KmPKU)RoK\jdJK3Tg^`~3s12M7ҧ˳}4,~2`b=~!mwN| sz^1\\w˭h&zΖ?(:xʊڥqVb.5Kyg`*pG' 3)%̗ayǼF_E~!Ѐ5hj! bw34uM'sܾ4"#wñ'n0ETDTr  tR”WR5OtL n+Y{kyCs|7_{4 P1)j iF|zzVs Qp{aoז6_Z1a)'a#& 'RZEk 5;\Y#O_+![6`Y@b.Kbl~,>صoy (`} juR\}ZA i'Mt}ʞC,97Wqc Q:uhqWQ2nSX;/Xo͇oޥ-ț"Q$ޅOa& 42Д8cX,xͶ6-&Rz!8PUBrMk8Q .rAH lȕ0!doiMo!듷! O| l%꺽^{^!>S`i_jvZ`n' %\uÖ} i10CW3 Ku{`@FҞ<2L)Vc4NFXb 5Qc_f1OQe` -.`5ꘫzVΡe" ZLg/XΣ$Uñ+{ ױ.- _G{SȵwE){Uu6i&a~4$f)i( Npy\>;+Y:G,lZQ\ucv-˷Qb: x Xǚvq%]Ak-_Ǻ7~k'}$q"O|FT,e0E~x. > gRz%GO,:i \xON "*T$W*P+jYIT%19ێI28q^,\V9#ݰ:o]98ZrVmah2(l aدd7ljRofC`M.e7$YͳU,hJl3mg%cE!+Ch:!2 I *5\.VI0ۣc`oo_A֮kԾ͑, ysɓK։Um-1ӽ"|DFMnTck GxV]@IaWИ죾xޘT[NA6cioal1$9sϽQ D@HEMdhĂ"/ft2Hb][9)|:Uq ^~2J6ҡkz& =AC$M5 ؠRx!NLsiU%3i8f8FC%9teDE<:F x Gn!o o"_'e3h^msK@sAΟ|0#u=C.Jy>3?ļm1>϶lu~aR|MRB>Jмá 'x8 BBQ2[wXX>sYp;Sĉ/t-\B4:rT0F_@,>moZ *#8%Yp3K@UV4X2\?Ɖ\E"FzS.?`mZecMrhf1# -!r~e_&2+]zkXZtEor}xIЦ(pF!_锬ޤ7$mo''4n o xgGymH켿^-E*6mLm-e_sy ֞ӸyO!8ᎀCDK@w%*T_'+1 gr,Nd'%s YY#켙7;^a0X} ,}4f0ƽxFw3D17&K3#Mnwʹ O芆8H/"kK/I#< 3B9Rm;#1hA7mבFiz4x P )zan~1lB1zA; ?PwsQI̒*DD Kx^_{ )R,'c2EkC?*N'k8_v,B+ɺg1+^z!ܾgN]К#nyͿ ~Tί֊|[%5WO?W< wc1 o6pY6c5w-oH?ɛ;i,߆T`#q,cO@M9Q|͈xXKO@^ly@^673kos"%>;'Da?QHip\9..e6m}LpqrJ˰, uiggbq,> t4M fWh2F?W`~E6Yr‘ zLEi5p- (m xʠOg1c b9 2DBw muUQcUo,0h[BbtEYE}i7.ׇLLGk #E\b\בZ7Kl#gT3=sWl<)(~1(u8*GDٰ9,1IN᳞]kqq*ׇ̐OJ迟>3|~ 3d ل -#04{ kK{zڡڅ޲\Mf<06ytLmkK cddsds|qa{{Lъ\4Y*>vQIQ%v\>~#aszճlkr/.)Jr*;KI^Z835ڵa }+TIP֚uo};}5(2^VQ Wo9P'"H%,ӛLcnE߈tuTs[g_SX\y>!B_3-p].t@+Nvx;@1 6@tF+_]lO55#dLe -pa:nTVi<9ՈME6@iR)Tn\liK)`BOJ `. fq,XH$ML0MVG5[`H':d#GiD:(rb,`8?Z  9<j:?M5l2#Cx[YW.m0/,01x'3"ƈ-F6Ǔ2CyK^s9əsTRWZ݌D|\Uխ{{knn5!$@!3 _b|$HTn3Yi"ɢ*t&:~ZҷE|-UT .̚P&ןHլiSZzֺy x@QK 8[@]MIXSPLOK% _'OIq|1FpwƧ !6vo_Ʊ;`0;.1)=(#h:ц\0'!OIA.6\JJx!3AF!q& b3#Bcrr&$ҩu=ID,lѤ[i}qjr%#ۅyk=B fݪU ?TO `1wͧ+.FWFwvEltTA v8siw0qw5O(Bkbzcjb|Bo؎(UrƧlj8.<ۻurQkԔyn1a%,k+TNz\ῲxRKH)ffV coO*r46]^kn0}H+|SR6Kɀ'Uu1Z<(3ZO,[?CrURq!#b&j<&sɴ._"(WrLo!zq>z54, Y-tՂia4LL"RAo8}҅GvhNK["M[=n/b#M= of(?GEsԙfLs̪?ir3si=IK}$)NX9>NWTnsR<6LrH<2D3\zǫgE3y`Ku/6&uLgDP7sЛP󼒈U +V[E _䲦LÂCMG5zϖXg≜\Wd ڨ5SΙ*NG ijb6ٵΎgƉoߢۂ>+߱o;U 13v[3ʃ,޵lH1!#]|L[E7R N%A> +{əc +ؕUg>-hW!B.: Zv)釬ᆗ%rE Q* P!ВӠ S'HųYsѲYv/k[; s6\펬_/AvϗR\mKUwE,'AgO]HS έ)x2Yiph9bb$o!bVjBpD/̍zwc~ ۟n]b|xd arQ@6B6lƇQosiX(3 9nӐS!/@^1˘nw(yk۝3|(OG 9^^p8/Ee^֓]3oV&RT~؋/mVK/qw/`gs />wr @/Y>^8#}B;~?gg4e>H7~6 ||_2yRU.khtZ @K4 uqQ[q r~p8#`HsFJ`&$ KI.s*5 a຀o&p[\G9'n <N |W=1x, >+)k/ OynOl)-`XPx)`%>#NC^Y=xXOFy%! t+ݺu:V&UhдOդ}ol__Iqr>HO~ޟ9HI:C)~CB2>I%DllX62/]j/ћS0AepǥiH2TH,2wi:X|n&E#Eb ]db61X _,ȹ+2Dj[O?BjS 9V!jl#Dz 1 ހ3:q52I@Gyۂ1t <.8=.\+} g bx"?Boa OYaf1"[p15Y>uLrkcmgO7m!7 u~|,qׁ,^ti&(`%^s#Fs<jI)ncP[=UKpts|`!fT狮j)Ketj;J_ST;0lob9'Zk8W.&ؓ2ȓyHaDrJ^}Qԗ9}i0ɒH6OTaxt8qfB۝2gxH-YLjتjr_Ñ+.ZkA}X/U?9/޼` SiƒKQq]+5~%cP>:3M城Le} m@Cs] ݝM}o43$ E_/%!}> >G]{g[FP>2fx@T\!hhf(Ґ9U L]A0v4\^\RUמSvSf`-^&'tش͡6bK!%Ȃ?vqs3߼Ҏʷ\!vnc-'>d%"div2m5a+OʝO\',) i4\b,*dH3k-jv%rmuܸm .= 3+zxR2}Pj@KbC# M3(!CT'!x Yٟ^.xW  YhxO@78NG(ǖCgSi D B3T[X/^'zw̼Y8_+1YEK0}>rtĘe7K>Xjt3#vHoФC<bpS1czGXM|$J9D2rD<k{͘@Q YBct( =Ehh(QIz~ěBtf)\Q\( ?C(BjسC?b?yyb:5Qt|:8E:-i.?LƱ$(n1Y+,۔};OHh<ՠy,Ud@ i$/4Gf+Ut<Tc _.Oc< f3)5ݬTyzkzO~񵴀/o6ɕ"M%ȣ#~x  xY:|~T(1C}xYHd*r{Kǣ߳Gbs/RIkN?u #8_wC:3Nj$b΂vS[Ju1,}"/~ {b^K 1bct161&G[z[1vX_їA%HAEYw_u OÒDG+H%VF` ؼ@&v@_;s PxKO@]-DTԋ/xpb{+SDaQ`̛܈Y4[>dlyD1X]d9:oɼ]FxZԞ*[mKEz}phj65Jz=umfc;/_e~DTP[`F^ԓLfP)b[,`HNS)c4:}%0)8n xVKo@΃ЦJKp)R%z@\\*$.(r5rh׭E႐vq^eo曙l T7BO7ݼtTvEiHgkN,B퇾O(o vSc!`_?%ַ\%@lW./CH\˻wIR#:5C(DVKƯ56N ->UZ\1{G l`yΡCAz<[Sy 0p ` >4o|4 %f!Yw9|kd Nr`W!R"OdsN"$Ԩ9h9Б'"}c*TBK*gZTV2Օ&7\VH ֤NsvRNƖζVoLM23-r9Slla>N8swGGcqkןN87pxf$)]ٳG~:|&iмֺh ko *]R;M;Rgю7Hj!t2I@;U4)E5%f9aأ FJahƸwwsorVr oljUX)0/91+ hL3ԕ:8n)mVC@kh;!!H1 BmC;ISxm 0 㶊A>CEV`0ь)x"4:k4i>v`t_`NN$6m$ZۆQQGuXsB3bUE7b| [f@p]qe9ϑ'E#E˪f0ފd?α$hH_z=i,~ޯHp q@̫,v_'3xTMK@&٤߭ZESЫEB%T#%T ^B:iZ^';f4"cf_c^vsltYa%9 _~o߂MC.e@cEN |[=w\ {;A-5<p.eTJo;pѺj&=E(3Ir$!h Y"a2Ɖ'8ro-1nA,L7Fm`ziPNLzǐa2q E^-f|PM9)P]E&3CMb_2v(oRkw Nd"q2[vJg ViN/8vCq?ϱ;04ZO zBXYJW& DP%б5D}7NQg+2ze7~X^/xTMK@&~G"Q"xAvl/d^Dhmfqօξ7;M]a̱aŲe1$Lx駉DZA l ,Pp+rfU몐wp xa}ZE1jN>AS>+=boX:MDIN%)&"Cp4 i/DLz(ro-1nA,L7 sLF2B9~n/sCz74sm(aZl4;_Pu]-廆j* OHr1jjѵF;&v{O |u/7O#Az-3zٳ{F4KlR~'ۗuN仡8jN zBXYW!"LP#бu7NƊcىBMxTMK@&٤?ozdzT<A衄H%ş,EdNW]xyd1y~UnǘamiI43.~6TY`(lҪ碐ҷ h/<|[u}q)B}#u)6>ދ `1":gDŽIOLH#IŒGx2Y<ʇ$t8R͉`f(}4 TXI0{~&,5PǾ5|5Gu[i2Ū"3b[+_ZS7F_7:?BWIb44;Xxg V꟥^o8m0ۡ8߱?0b-牃jp=#|,JC>B5 ZouD+l E&7B 7xTMK@&٤6ƏxӋ'ЫEB%T#!-٨/d^Dhmf4t }3ov}1f2/]vLbb[`]12y&/ :+M\ꀃ2mQH;Xx`}E1jNFS>K=bXv[!|#aX.'ԏ|\G* s%v"Wrf[0 PnB뫕Jdv%])җ#3DneQD\"81A!#.a;}[iҥh1$~F\V%6ZScgТ`=\&hXo|qjֶzj;E(eI'A(\dA*A=7A>Kv3S/`ވ$>(ٶy[;k*E9}VQ Be U2SOs*ơ~[80ߍW)bFC* U·2흝݅#U٪sce<`cq̾UZIԕ|΂[nDnFnƮ$WSGuᦍ9Z8qFxY -ha.hhB/ tԯNrCX }pzs\Q plX'92~h/x.=Svލ`/@wvtf[@o'uo+e®>Atx;AA! 8Gt? xډFI@_#;}1]q|#gØDZX!0{hw} 1Iq>AhaI.0ngȽpd,qLqQ8.)<ǿ[ 0^A.X>v<v<1w|tmx,GZH99f,?1r+ bKm3G/]P^%2˱cb\F^"mA\"mVAη֠E}'H'֢SħB={s ~ЦzY-}^Ә ^veI+6 Ͽ3~[::`>8>q! )oID+I6P~={/~g1r:zT'T3N[ӗҖ, 'oH=D5=sj.^pg#9k2yҟ\~d=5zTDvbj.|kLgRtRsMլKTBBР֔篭)FJw}ds_3ࡇ$j gln9i\--:A$Hث:C{*S& t׷0L<'Q]*j|Q-6e{ TxBeQB#K Ji2w56t%7'P[4D,$H:JQlM{4z&Cմ岫yYň.ad^jL>Хk]~)U<&z+sW ";y`(,nF%ÆΡ>ro8!cָg{߉Gɉ3Sy fd2aS`mҩjiR|E)cب45SPc&WkP u6]XrQwԹ: r泷/AGN bH7Ce+m6k9>%MPvXɯEf(7}lD]}kuœ8t7]̙q9&%ܙ0)!I7.+Rp\-v()`r7V2*=S(rl{J<̞Cv_}tc0' X?~T1ҧ?c"c#viNE02AtgzCE[( "Fw*01EnTyw/>9:H!^[ʻ4Ccɪ"+gqh%kuЦxy?mv/>x)Q|#CaTMcK@3^S|/\O_3œCf^N@x)UIl}kj@-/δ0 =xCD^Li lɰdKV QJ~nxt[2I +3@#& >8G`#h5+K&r!QTDA$qS熝?{;l ~(wM'qr(xp;r7öw{xJPTNF $d=HQ_*_wv+ !r鵐*sd1 8IT[<'yrú-1<Ϣt4DQ \˼-VnAЭ}2g3*"q|sq|焯@r?F(?LG!:h;t;^ťp3Ec0fTH6lbއll%`'ÜE;C]0cmF j}0@z&>@9H }Jlp97 Loy  j67MTN`" M2NuL mͪWH_\#x>@>]|cu)=gH? @HEH @9U4* x :i 6wH @= 6 C= 5K xkAΪh/BNJ 4''Pȡ ń]rɟ\Rо}cގZ>1og\?p(} ?~lXFQϢWnzo,/@ZH " rțAںLxi9Rd1NIKL<|zJ9Oƾ946(m"d'&JZ{BuzeC9BsL:Hz iMFjJ+/&s^wno9% lTvYjD(},I{B\U.] ⎿X )I֛ yoX=8`ϫ—ZI8чtX[U*yu[ff?{Sޖe1W|)xNJ{9T\sE_۹$]m9Esɨ"N;W.lNN-*sj/t,8R/h[^ڊ%[zNV􌞽Bc٤N||vcQӆZӯ( }ʨ5C6?`8b3N=Z iܟ~ ? 8xW[kQ>{ܷq[mm5R( >E $f}' E9s=ئLΙolfc3-x0ٯ]3fL A|m!nY;ۻۻBM#oAG):jw9Nˀ28kQ$c~cH6c+6 J84K$Z>GgPCMPr}Bl`迋)נ> F>;h9wP&Y{R}isy2rw:wBgZW# D)(N4l%i1FKtizKtR',2EsyQS ~ѨMkJڲbQlC)V](0N wUu %}/~^,:N#JdnAե3M֒W @,fi 2BDkrr։E m6~&^/5 Oj;{x5qLPA{ݰ= Ns"3օ͡--~_Kst:55Qc)w bEaQ+!}EòdCi+spוաR6]IA0Cﳷ}5>bJ0`^B3,,ݻvۃuW+kU;._#X¹l ;ݔCvfmj2n~8xkFp>753HƤ I_ iMkVvba6 Npa |haLbh5Sk6'bk7s~lOxdN9o'v@G{s$)KMݷ.YN Ýg}'E  =F}"L8bbÅX,;"Ԍ:K4Xٗmy}zX/'uKaϢuyio$֦%$r\\7#P/_PÞD>y_n`=KbuMΈ!IG&R@ZeB&M/$XEEQ֠*dlUH]2D^UxXo6-_q$Yfsl0){*P%ș{0 iC2~Iww<R"Ĵ~~C/KLRRxLB܍&! YOz^gi'sgt׿Lt?dGCL;rFYC컢hQlP,S(Str|<T/̙09 ƚ'Űjbu)gC:uୂ̖h0 z:g d8@ a~o!{ }r-houa~3lCw)>{>usI, P,/ o?#q>8gX2%aR&Xv &~pϺ+AWFJD 9:HRUG+  򎽉8H)w-0Y*ߓ09"6lf 4C[~<U5%3V\哅sNI̕SRݡ3qhyⰤ%#_08YAak 3.IS$s˞39&n퓳0qdl3gdGc;z6< K'rG8Ndt/d?TA9pxyf%D4l dE]ˬ6;=z<5厜0bZ.N'^rxB93I2eb[ڼߎD m\\&֊+|\/{ |Ņ^#rHB^?oMHC[/.I0.XRo|vXkCrrgvHpCTA,ߕ;)ͷh~p{c~W~Юm>^ߒĹ ~7!}I(~{?w]xs.bBggXt XOw%vc!2>xzނy+,E@ \$)y-hhFMOGuHv "fpȠcQw$};*[zF,OS*άzv֑fa7qa nZ^8ܤ=Iр:>{7(OGUGqrX( ~߭2Y-\)IQe~4/[fjBzFqՊ+zDpOQ %=&L!1"GypCe;;2PfnoMi^ESzNx=xeK`vIY391kйL)PE.U#u%/ Uנ b\U!_E-u7!oA~(SܶQ N|4qѹ<3 v뵙lNwLς܈mn&wENo]z8cYVB7 zm~H2`5M$*zs4JܞٸvÑ]fͮj1/䖣á=|tDrjVvԥSꎆ횮W\ 4Ÿ=՝ݷeVӷEsyʔꇻ[v8}-I%!I1x~549m) )2ZڂZ1qdN ;W=EPN`+| JE9wuHLURx/7dG8+RKJ+ylb40-Yyis001<i+b,`DޒUANJXE-G OvwЗwD,J^@r#Y5N_|c3ˮcul` w;EϘM7o!8Ly-^]bEP*@ 3( M/xİ!ZtxX[OGz}|uI IqBiB.m_x*7kƬwP-}nAT%RUxϬg񺀲9s.ߜBHGI| "I?J,icMxP߬o}t L=o #k{vljLsF[x=5s)[ Ao#Bwy0 Pw/ i0?>f)2MPl&U$xJ8U[y5YhN+Vڝ5W,ة8_<<-p9UL޲y#Y,|c0_{ø&5ül! ? /! Mkh@1m <3hCoaSȯal)8`byoNhw-ܴ67<9l&$6 [%e494uY˂bRݺxwArR'C̔,Fke1S鰇A&<>Ə#Ȇǣ90qn*"%dv<)n MHB TM/5{6_؍VDY- EiWTi~YuD:)qPho;']=8'f#DQ_̨X"yհD4Rnj;r~TkUmg'ձfU`2n9Ϊ[g;-uswvPP+O 9&#o]YQF֖$?ٶezKo v(rgu{`ߚG=3gaҳڦ1ClO>k:1-ϴrlmJܔ$^r+K~9ITu@*=Mg g} ѻ}VV0}? _mFm@hwSq8*Ü$e^ď#VO? `ik$eM<P.UIa݀wII~s/^׿xGK77.'Ck.Qַrq3;xF=[&YU^)_ahk E [fvY~`W QNй rYK\+W+y*ŝf ҏ9sfv޷IBHD?,o%$A"$Aesbt߭9PEV +ԾBP$ej[K?&j,eCyG a~#!fS"б`L XC]> CŽ3H((e]?P:as1e򌒢P~Nc2rX:XSB59o~g)t-er(t|~Gy!, qX oJkCڧу/QW *q=AMk``T[BΫLDٖ`s;_q-X{7l^cwĻuKp_ I6AC2r ;S84jMX>6`A|^piH{4!5~JЩWY``֎KRw\c2L+uɰqQRtOadsPUUUH?R>-;KlZ>V¼޺ENEJkYw9c1*GLcRF_yW-w+*baj+0Z^}o$TusZbN+ZF϶} !կ֑K*MNi^gqf T)WRR'D}Z*6B;'K1aMA)FmbIlPtĠ# 籚kƻQM)(պ7ȩ5eӵF? ^vtg诟 E2Q>Dw'S.VJS$SN"B賎mj u//`T.xZDf!kTm'Uuc$xKE'k^ +Nu'huӪKujU}O78_}={HgF׽CSp;{a//)~9D?} } Plt4W͋n\~oq7|L@{Aϛ+d>OL2)4 P^u>fny If[9{F舗/`wڈqxÓ7 qO?ScO$4dΛ3~sBPg [ *ѣ %0 `H >`L! Cô@̂90#y@3 z@A"x$Hk'6S VvS7J[vX=yxX[OGw.ڡ&%uJZDyBmU꛵[5k].B_jA}*Ag3볓ٙs\gΎu' $7?{4 J'#sX'mwh6T^L&OޱзNtnߖ1=>p;Nj7{.}}p3=WeH1E1 2՛Y^xI0Wb(~x,Ou QcvRA'[3 4k hmg^G΀exq0:-] K0WB>b/#Գ&Y= u 5{ktt?Ptgnl| :PM?|~54tLjKi uZw_b Ditm:!ΉN"Mkr^Thgf!=H+<hF! M;vdNSfg AMmw᩠pV&BHO+ж/j)kHG(K+L- f<-eX=n2q/Їge|;mu8ȶu~*7>ʃV?SlXc\vcwA.Oe7roO3Gh:;XÚKЩ47Tˏpʸ74 MPBFuo~ϧq3X7$7Vxlܷ)d@.F<'ViЁML.!v9TGo֛rdߕq\ѯU Z|/k ]Hݨ 1V$}Jd[Ur8ۣ&IK}f+x&?3vs@-y>Wu&OEgo' zBq"w=t_ %I^a$(_|q|fv8*PDk5iqx,2#`<,:% u'n3.h!C>L L.1y, ,BBe,@=_ ҳ/! ( l".x=cac@wа=O>#D:-=DpN-& WĒ.E)<9 ̯Sw$5Hr[lO*+v$[a|V5(]UQSCeIS!];TÔg 5FxX::˽IeMR1ٟ:P%n5N=foSh~w4K)#e%դ#MRR1Z^UkRW 4+UdIMPy A'Eg6US.6E&~bR+Nk(9&pLG-=E:NXI9ffJ<"B}c%RU ~ώ=cSfg\933k`EY,r0ۏ76E7 6cʾU߫)~qiei۷q%!?jC䖳m|~ \8l8c3Ure8bI6IX Yv]$Vb!V/l lA6 v"(e1Em y\en4Í asc6bKEu,sfXd2|a`u#(Ɖ5 kyِ+ Oy>WHz+ ky 2&CC7uIk -`lay/iF"t/KzW,^밻7|\Mı ?.{7}Wjz0>!;i^w,cBDaijl{;nD ,Y::CCgxuEQtzaDt3S'[e^;KO=*7t*jhcZpS^qltg&UJ#mܾ(ڔ~5M?_%i_Rڙೢ:Q5?O)B{+,cQ9E _ˮ vw`Cz}ETn_:ʼMtg|O:[0xoiz$ٱ4q9{50rAlS~8t}' O|18R|q#cRYS,|Iҗw/CKU)t8;̮[V|vgswΌg}f??9 }z1_ͬlH65z.;{k2{rQ\:$<Nbim()8_r[?+r8&`Ce GcrPu i‰3N$8БXc bq_ƛ؃ei+>'ziI'\(q:&v+Db>Co?b~_8~'9qFb+˰R_׎h8Am/}H?Y7=fl #n"z[oGD[ۄ.w Gb}&p?3xUO3mgvun5KC0|]9"y|Rw׭7u.DqjOCm5RT]ovFSHt))n^gYA]/'bTՔ&)V"1p%j4{v#JN3w\^*1s\qvЌ'4ulx_A ~$0ZHjtxe3'HiMKyziNV`D$7KTbZ8)ըTt֕H:I*L3:?!hu38IsNVJ8}Z2􉌇Ls7},84fAmTIYslm(%[3u?rWy-3M⚝>r UɻnOoq{T -;?į2\pVu$O  =g1 ǟG d'>hqe'xW[OAN[wH11xFVXI[H [&bL3oa]nuf|.{1f2em>zsxȘeO>XId?o6v9wܹw` ;:$G#1@!c!'N,8B5G  9-̋~ı]ǂ.<5ϼVW *g#-jD}(k]mj4SIVBIn巕Fé݋h8=&TjQ_5w;tm1ڸ,.ؽ p9yEjyMɩWk6$l* :NTr)vX+aU-(?f?Ab/*g ]bڟjECAo(!D7/raž hhs)}*a&%bbn"K5shՉn_n_} l.A~ȝy&{k$A% i[G```xDl4Ǭ1Lg7[{\N'QxZiS[71f1`/}B4i6JBR#qj LRv/K'3I%#<9\${t%B<@RR1y}:!~X2RNn6AW`*:2ӗ?>ȝ'V'HLq"Hȓ UG1N2E9.V ~բ)Ob!f1)=l@_1y6Ic֞9-?rL/㵃6.u"_u/9u!NqF)~Gncyqp&(~gS} sG!ig$ygI첤coQoaXq 8|1 C߷з&軇Sz>ز8d_GtNLc1{^i 1oRUI-A?v ߪooB3:Bsڷ.i ٜ73 7vuKp1cЉXؗ>>X $2N 3د(X>.x*$E B,-#FɄb;鬃* h<Ƚ53Y4鄑:Ýcٓ#3Nq{6ꐸ%'>^!W+q ݀*a\UIvOs֒|%Y"+ZCԷ*1k̊z}Eԥ.z{+UyLbT{Y!4,ڵ`AWk>z_cF^+KF"[␭[iU&RY(vp"bak2ߩ/;xM};Yx;[7g牾r㽒bŲHv_/^^kd(NcF<f荙8J&vah+{w潳~[+ 0lW(r6@MJK˫ V9< ><2ϵu5/yA]!zeyEia6Y6Nx:aVUj PI*+_xR>QJL}f=gP_5zx*mNܰvӎ]%Tɯә^1{`a wQ^~:K<3@,Ʀ`a/^%mvvvvvvɊmAO@@@e8 NG ;^B :_mt~;˯-z40i0 !3 u7,u) `%V>oU+k pSQ඀{ X>>6Hc6liq"[׾ q ?$7wV$xXn7e;Eѕ]E x PdA#A,YMQ .9sPf& 8.yyw.)YeȤxe Jǧ?MfCˠ8eؘ'my1ژJ [,+̓ .ɮ]Etv~|d'+t|gurOS’ܴfS[\Q`M*L)#rߖ/iiF͹K<1&S̳Or{0Mmh`L`cLa9i_`LcĿy~ܮyZ k:W?b4[&K}1|:>.QN!5Bcd[$&)pk;U$"݋'ԽC "2/}ChkBkF6޴RZ]i*6Rh'\u u)z:z$poFcsu˃ |i}Z݌o5m݉ggyr6Ʈ-(ڽڝw9&Rc92\)qnw?kC(kP bq/5$֌{]3 58ǡ5Gkc@?xOxK@'6҃oGOSEVBJ $q7֊z:Lmp_6;:f#Dӛx2=Csǎ.br^*%q; GwqpYEΑE rWs2ޚ!>(G8)=4oHZ=fnF _M ckya/ѳ"I>"~kf*wvq9ܧ֣?:yk 3=*ԚN'PknޛL}9LTׅfa\ ># ŴDpgs%o4xX[oGw c6SnVVPF-K}//i?җR .-HÙ9|9;{aL !B"BĿ!!i%OPEBa5ZW`J#[ ~ն%FbMDFDZ< >&Ļ~!Ja@DO > 擂O>idSIה+_~E&Ch>I{<_F|533rs-S_")x?[H<7:c렟WCM _WnqH4=Ys?=p`߂W{y>x?L=r׿@FN¦-#kՙ5 ju"5oJȖ^\>Kxݽ% n\./ nI[V{tso4sVzlh^>Ĕ=;zSw⿵O"r8FP]rqu_^.Ywj]߈ &)2-rc_Wʼnّ9uE+Iyö!;fiՆˊC״&m;Dvcʞ/p&3 V.VwQ-c[N}Y57]U5u|1c󒽼\y\pZ< 1QղKnWtÖh 6J \xVMo@3vϦ_PP9 +Ph)JJT? Bjxk&M8(&睝oι3e/gm,, f1BtFhu"AAsCx$lE! dƞ;'al`〓Ǔ8pi*:5 Ujq_p/#G<S~!.I}[>RMkB x/t.#%^םqo4Bd|]o`?JjUƔsHmj<iaPKVFK ꎺָղqY9:Wp5q3sWkԌṭ#똧iw5K| iagT%MSsa8lXIe pa4Ks5ɠxAe +1TԾbYIkJcqeU\\FQ?$71? x볼S'O\3y@j_:QgC8:ELhܔ-&h^&&\$|k7V"v bm c:AD\rwܹe 8,XGYZk-2}ob^6{EIsXP%XxY|fSM)~ l @?%l;@]/8ߓ4 9/Y<xWKo@8) R!JSBVHQ$ā~!R ]fNK_63;;:!"8d J}8m>}srBdLMcEi6f~{:Á U72v>(Jsjc13 91Eԋ9' x׬At eqJ>\W`x._HXPa8__ex6t\nB^y&-6W-keM$a9qn)Zi1ͶLV|V4Ce/ɆddWgl5' +㫖R6]IA0}ﳷ}5>b-%XIcG{ae9Wp_a'5QK*/BяL,y\G!Tn!;3lFEw{]Wi_>u<5{#8W^P^9Jo5;OFZDMzvM'|0Llh`c0&1\ 4si)51̛9\\<2okz7S; =vQ%[,'sγVm d#D>?E_%.'6p/ =75( Ve[^^KIPسl]r^i"Fw t8ׇ|x%'\Yߙ=;z޾ϫ(..n[~o%i"y?(I\FR L&&)zFvP'׳?G89$1Բ\/:p)0Aͱy&|-,]p+U)n\b/exX[OAv -PzFO<$,Jt!_h"/D~clD|9|2mye,iٯ_mxro?I$ps#nOILZ?d'7Gc#фMg!c,kp$GXH| %J+b$:qnq/r)"rC iCs\& o y,%Rg -IA-˰i㹋z,W dY^Uנ uMupmg 6=bƚX_0# y/dy XϯdhBPcm^eO K( O%դ>W14<II~RJR#\bmJq~Ԭ|f*SL[Ȧ7<k^BZ1#Eu H9w[`$blL̤}sQg 69+BQ5ٙb:15޲Н;5XWJ:C:J)P>҆{}Ζ;[QgEWUbX(~}C/[=+Ft.sE'i&w.rh8@[[sg.S7BER5UUa{:r{Á<;K`KVW(KDyMyrĥ,K7m%/9<?U\qdɹ8{t:t4 Ҍ# [E" ~]: 2 l׾f;Wk,H4d3pD|8ͼ0qWWY{Oy>MpUoYl@V!+e\B7q$wrrӷنlAv!H ,t26r@@ |= C|Lt7"pXnMɽ H5Ȟw .dm`; d͒!`eG;xUMo@M֔HR衈S $d*7* .)a6~lb"g7y#"| 7qK>I^8TtR!%^ χw9ptf1g33Nd'KDϖ"D' P{!"=f(OϕAbw^l2^A<ji 9Qrl9T^Ls'nUDZI_!uynfQY_X,y ?OXk>٣wTeٚ* ,e֬&!s/-fhazY)*MQ7zVHƷU1-nH[[d9pv ۍ->̓IffL s%4ފ&Ssl̏H;*?糵)EP41L:EcQR~:u@6/7.>֞s a lA@bpRG 'b@ǧ@BF?+.xW[OAVUEhH'1>Cm[&ŐPgo١Ӌis9|ٳ! fS|{tӠ㿤ӉI"zu9WfT`/ߧ:hV zv^vhx@HQ,"yؓF bD?H'ogq!E` ߂OrFn'AEgȷ)ٹoI}[3;&g5j~ 81]p 7Qh]z=.<¨U,\(q wDM!Q?K/BHWu$T >p] |;V A|Lxt 3B7 ]0(Z mLҗ@n]9kgvA( sġ?iFNo,š:2ձy3WG󦠁`EQr +`1JH)?G2Ò4d.+*"a XpDǀ+!Gn6-}[n35RXxTMO@~RAML<0jb'ěA)iAQ/dp²tHu1>Cr׼o4t ǿ6tHb-wϧq]WWqPP1E"PQFd40:I)8B4w ";C\ /Eg4ųS<"lD Qt >BEM՛ g4$$ˉԙ$q{OsWTB>w!#r | .e DCBk-VR0e+>Uʒh596J2x >]TH7#W tv峃gsA/no:? &;vԵ`tN,q>t YcvFNRhخ*WMZ;3N)%k 'M(8 lxTMK@dI?_/Rh*(=Ԩ6V ^"Bl2nl12ۙ7jjf{Sm>iS0q{Z1gc#|b^k4iݴǦch~tt 90-*rlآ֠WrrH9/`i9gbEUO9%gu1F g@΂Slw =f{EQ<:|g6tIb 1"nQ́<;>Y^g|.#eogl1g‚x`~|$]x u:)m8݁5b W0`5t!@:&~&Xn ,?"MD ydyMz`3qz.'mI!Ѣz7ZӠ-XI(8I^Őm[$s괼nA%{2:^'$ԇ>vs#Hc7]t=XFXt@ɮpz373G~]:gT@M?ѬDT|iЈ#72Q+<¹AnY Z jY_}=7R?>GyNJe/aUϓxU/Dӆkv̐Tdba-۹}YEx;L"n[.B*bx$UYDb~5-ELgydIey)lJu;uڡU;5ѱ!1.psj Q\Gӻ8Ar()AZV`U+/=myI)@6H]WA߯sl{~SEn)KD̳CNаCuX "ue©!W] B]"y>^-XqL4&qEur!%~F'2(Cd~Ib#AKpy=⾌G#o1R n]W\5S!DC 7ïI,)Iז](%ЫS~sы{ZL;8*mCӵY6vld˅6YY(k[n1g;ium3yI#FO8OjtڨPm!3wsflM Sj $kF$Lլ*~./('[Ȳ¾Vbk "l* 's򁜓vقYsO{39ɴ M/yvEq |&)R@݄pSpwz9O7aųV'7 fک^ͺeo\PqC$wlQp/1PS\q_n%(D/~e "֚iSIM7w :ՆE}V >5w# "OIb+y^?:zY&lWRNA.nӊ;~%?sݷ2zANc_/3vF^k,Q_4tN;v]*٢rV([^z}ک`$ؿX{=3cq^L$JyNL3Zgzr]%ybݘD6JB a( L$[F"x cUz߈2awf.fS8uم9DZI[X`3qѠnB"Yv.Wl[1X<ֹ&bʜDD 8.Ul6(;~urs_>]h xX`FbѸKW/݋ =(oCc~D 'xغZ5 qrW8Qj|x7 y:x ~W?z*:~Dygxv?re jߏ1BM w2BMuv6&P R/V|aE?mq:M NLKm> zb`3LKjLc#Rp}=, !3r?̣|?R1.v/5P.J+% = PՋ\EU^}+Q6?=0<ɸ32UP3s񐋅s2Qf2Y $2VC-+}qk"\ev/: H@B@m:9t+>)1> !7L 1a$?P`CZ{b渀9qX@##9x*xX㰮'|| ^v7}&,'_" flk_+ ؾT:UۮOpv?LxWIO@x!gRZT7KSPTJ  MJåD:c!8R,}ޛ~BHFb vzs"?($4^3޵zVC+]}cy/QfM,T.qFm'vmXN?=2`a00NAU1 I:$GZ+YcbBLboI\ }tE/O bU F\Luyr>y[s=.gb.+X_s9\ гȉOFI@xP[e"e3b 5۫97Wk7vJ䐋$3&cl&rmǨX0:/ȅ\:c_3 #yW7oYi@FjC3F9{Vږs}pq_ Y>+R<u+NTD'4\=AgK*8ZUĹ2<'3)e2\%\ @emc`Z3a 3[ ^2؍Afwv!/xUKo@^ \@,zjH.S\8 YQ9 Y{ZoV61,}{^>!"B/ggg3Bl 2Mz bqqip *u^2w5Gi*=z<8gBQ(a}mM/O4q,>&MDuN?_+%xYr78G;dNB8!@i!- )n E/z3 zon:!l,`P$g2'yxf᭍ B1x(4mi;֋k;J[Y]YQډ`0K9Uݢe Eb"Kbh My&*Ech ,E<Egz7 ݣ7.$A(dа):M=h@3Cq v19 Q/ ̧-_Mr)%Oֿ baaN cυXp7)NSkعAY29@yAJRԿ, †ѿ b.şO .^ s7l039 ȼڻ>?59d~ 0xUBm f1"V6%ʈNdQ"j my7BACIQL(a>ۮ_I3 dS0 Ϩ5Lk\kg$|&5,IJB#%h$|^C -}HԖ$j˕myÜҘ٩7ތY.?n]BƨNV5nف"] x{χ#):6ٯ̜9L7aWjpݒ5ꛆ1G-/&y a$ºwg2H4񉮭DTUZqf%4M׮8)Mm{ }a[Q_|ed{fG8/+niK:fgY8MO=g\Y_mg۲+%Hr}iRHۜS,շUkWE]d'[efU:1Lt'k6_*RA'ZXXPFEM#`e꘧i5K{ZϽϽKyPEAnim6ߘ-2>Ƃ?#g1d  r2(JQK9}\6E%VbU|W"&_v똸[C)ˑzsp_k?ד Ca \((E:;!*)'EBd/gnrR{+rJ>Ogz⤵L=7NaiҙX e?äbc^BfтQxVLr+#D/7N}LOwF766Z>GN i*[`RQQ u+ {1*YaVV^X6`* dWU|\ ^!W%L!-5^ҿ![:B; k׽TArmA.G q̓cTcBz#(\"KkY}Y.^~`~~7)4N0}W3r\ dh0. L "O5)`Z0s  4E ,DŽ1Y2p\ 0v @gZg5iU/ _ NMn\n|\u7[ | 0yw {}w<#9xcukhUy4/jSi"Zhӊ%h4>":ޝ{yZT~R`"RDE?T"JE)TCQXj={l`s{Ϝ{9-zC驡ѩuW|U>YvS~ 2rȽg iD^;ػz iyUCȃݔ} ߃ c?i-Nyn8[ We}}_qyIR*a8NȻ5މ=prax[kpo"#`@_@< ׁo ?9|-:e CO#f9LF>|A9w |0 4"0!GpSȟ0iͦ/vy&#?M;!Fq؟Gs !_0|qFϯa}CK'$s4 J_BiW!vAkIC4?sfU4OKȭ]`AB2"w~S"@6aѥwZ;r19:16ktǘa JwӼז+Ss$ēZγ[4o<\^4ŲrIYb}<w( U qL= F nu-j UY ڶ\י< -5 XғLT*k5vC,@oZ)GgJ-Giqv>+R,>e+M,%P+JES{"eMe0bLlC\^eW:K6yO,J멲UR[Y9jb^|%LauEaGLXCʲa8av[ Jc9]S=:i/ܩqM !m5ාP/+?/%8Iƪ}ܐ_0Co=mhX-՜HKKŭW]̣/&{<暨З=̊y## ----include = FALSE---------------------------------------------------------- knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ## ----setup-------------------------------------------------------------------- library(sparsevctrs) --- title: "Design behind sparsevctrs" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Design behind sparsevctrs} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, include = FALSE} knitr::opts_chunk$set( collapse = TRUE, comment = "#>" ) ``` ```{r setup} library(sparsevctrs) ``` The sparsevctrs package produces 3 things; ALTREP classes, matrix/data.frame converting functions, helper functions. This document outlines the rationale behind each of these and the decisions behind them. The primary objective of this package is to provide tools to work with sparse data in data.frames/tibbles. The next highest priority is execution speed. This means that algorithms and methods in this package are written to minimize memory allocations whenever possible, once that is done, running the code as fast as we can. These choices are made because this package was written to deal with tasks that were otherwise not possible due to memory constraints. ## Altrep Functions The functions `sparse_double()` and its relatives are used to construct sparse vectors of the noted type. To work they all need 4 pieces of information: - `values` - `positions` - `length` - `default` (defaults to 0) The values need to match the type of the function name or be easily coerced into the type (double -> integer). The positions should be integers or doubles that can losslessly be turned into integers. The length should be a single non-negative integer-like value. Values and positions are paired, and will thus be expected to be the same length, furthermore, positions are expected to be sorted in increasing order with no duplicates. The ordering is done to let the various extraction methods work as efficiently as possible. These functions have quite strict input checking by choice, to allow the inner workings to be as efficient as possible. The input of these functions mirrors the values stored in the ALTREP class that they produce. ## Converting Functions 3 functions fall into this category: - `coerce_to_sparse_data_frame()` - `coerce_to_sparse_tibble()` - `coerce_to_sparse_matrix()` the first two take a sparse matrix from the Matrix package and produce a data.frame/tibble with sparse columns. The last one takes a data.frame/tibble with sparse columns and produces a sparse matrix using the Matrix package. These functions are expected to be inverse of each other, such that `coerce_to_sparse_matrix(coerce_to_sparse_data_frame(x))` returns `x` back. They are made to be highly performant both in terms of speed and memory consumption, Meaning that sparsity is applied when appropriate. These functions have quite strict input checking by choice, to allow the inner workings to be as efficient as possible. It is in part why data.frames with sparse vectors with different can't be used with `coerce_to_sparse_matrix()` yet. ## Helper Functions There are 3 types of helper functions. First, we have the `is_*` family of functions. The specific `is_sparse_double()` and more general `is_sparse_vector()` can be used as a way to determine whether a vector is an ALTREP sparse vector. This is otherwise hard to tell as `as.numeric()` can't tell the difference. Secondly, we have the extraction functions. They are `sparse_values()` and `sparse_positions()`. These extract the values and positions respectively, without materializing the whole dense vector. These functions are made to work with non-sparse vectors as well to make them more ergonomic for the user. Internally they call `is_sparse_vector()`, so the choice to return something useful as the alternative wasn't hard. There is no `sparse_length()` function as `length()` works with these types of The last type of helper function is less clearly defined and is expanded as needed. The functions provide alternatives to functions that don't have ALTREP support. Such as `mean()`. Calling `mean()` on a sparse vector will force materialization, and then calculate the mean. This is memory inefficient as it could have been calculated like so. ```r sum(sparse_values(x)) / length(x) ``` These functions, all starting with the name prefix `sparse_*`, are made to work with non-sparse vectors for the same reasons listed above regarding ergonomic use. ## FAQ > Why aren't the results returned as {vctrs} classes? As it stands right now, it is viewed to be beneficial to have the users not be alerted to these vectors as they are expected to be used internally in packages and rarely by the end user. Furthermore having these sparse vectors produce the same result as dense vectors with `class()` is a big plus. > Will this package try to replace the {Matrix} package? Not at all. The sparse vector types provided in this package mimic those created with `Matrix::sparseVector()`. They work with different types and allow for different defaults. None of the matrix operations will be reimplemented here. Design behind sparsevctrs