susieR/0000755000176200001440000000000014143515472011532 5ustar liggesuserssusieR/NAMESPACE0000644000176200001440000000432314143476342012755 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(coef,susie) S3method(predict,susie) S3method(print,summary.susie) S3method(summary,susie) export(coef.susie) export(compute_ss) export(compute_suff_stat) export(estimate_s_rss) export(get_cs_correlation) export(kriging_rss) export(predict.susie) export(print.summary.susie) export(summary.susie) export(susie) export(susie_auto) export(susie_get_cs) export(susie_get_lfsr) export(susie_get_niter) export(susie_get_objective) export(susie_get_pip) export(susie_get_posterior_mean) export(susie_get_posterior_samples) export(susie_get_posterior_sd) export(susie_get_prior_variance) export(susie_get_residual_variance) export(susie_init_coef) export(susie_plot) export(susie_plot_changepoint) export(susie_plot_iteration) export(susie_rss) export(susie_suff_stat) export(susie_trendfilter) export(univariate_regression) importFrom(Matrix,colMeans) importFrom(Matrix,colSums) importFrom(Matrix,crossprod) importFrom(Matrix,diag) importFrom(Matrix,rowMeans) importFrom(Matrix,rowSums) importFrom(Matrix,sparseMatrix) importFrom(Matrix,t) importFrom(Matrix,tcrossprod) importFrom(crayon,magenta) importFrom(crayon,red) importFrom(ggplot2,aes) importFrom(ggplot2,aes_string) importFrom(ggplot2,annotate) importFrom(ggplot2,geom_abline) importFrom(ggplot2,geom_col) importFrom(ggplot2,geom_line) importFrom(ggplot2,geom_point) importFrom(ggplot2,ggplot) importFrom(ggplot2,ggtitle) importFrom(ggplot2,labs) importFrom(ggplot2,theme_bw) importFrom(ggplot2,theme_classic) importFrom(grDevices,dev.off) importFrom(grDevices,pdf) importFrom(graphics,legend) importFrom(graphics,par) importFrom(graphics,plot) importFrom(graphics,points) importFrom(graphics,segments) importFrom(matrixStats,colSds) importFrom(methods,as) importFrom(mixsqp,mixsqp) importFrom(reshape,melt) importFrom(stats,.lm.fit) importFrom(stats,coef) importFrom(stats,cor) importFrom(stats,cov2cor) importFrom(stats,dnorm) importFrom(stats,lm) importFrom(stats,median) importFrom(stats,optim) importFrom(stats,optimize) importFrom(stats,pnorm) importFrom(stats,rmultinom) importFrom(stats,rnorm) importFrom(stats,sd) importFrom(stats,summary.lm) importFrom(stats,uniroot) importFrom(stats,var) importFrom(utils,head) importFrom(utils,modifyList) susieR/LICENSE0000644000176200001440000000015213703336624012536 0ustar liggesusersYEAR: 2017-2020 COPYRIGHT HOLDER: Gao Wang, Peter Carbonetto, Yuxin Zou, Kaiqian Zhang, Matthew Stephens. susieR/README.md0000644000176200001440000001047214142574204013012 0ustar liggesusers# susieR [![CRAN status badge](https://www.r-pkg.org/badges/version/susieR)](https://cran.r-project.org/package=susieR) [![Travis Build Status](https://travis-ci.org/stephenslab/susieR.svg?branch=master)](https://travis-ci.org/stephenslab/susieR) [![Appveyor Build status](https://ci.appveyor.com/api/projects/status/tcgeqxd8q8krija6?svg=true)](https://ci.appveyor.com/project/pcarbo/susier) [![CircleCI](https://circleci.com/gh/stephenslab/susieR/tree/master.svg?style=svg)](https://app.circleci.com/pipelines/github/stephenslab/susieR?branch=master) [![codecov](https://codecov.io/gh/stephenslab/susieR/branch/master/graph/badge.svg)](https://app.codecov.io/gh/stephenslab/susieR) The `susieR` package implements a simple new way to perform variable selection in multiple regression ($y=Xb+e$). The methods implemented here are particularly well-suited to settings where some of the X variables are highly correlated, and the true effects are highly sparse (e.g. <20 non-zero effects in the vector $b$). One example of this is genetic fine-mapping applications, and this application was a major motivation for developing these methods. However, the methods should also be useful more generally. The methods are based on a new model for sparse multiple regression, which we call the "Sum of Single Effects" (SuSiE) model. This model, which will be described in a manuscript in preparation (Wang et al), lends itself to a particularly simple and intuitive fitting procedure -- effectively a Bayesian modification of simple forward selection, which we call "Iterative Bayesian Step-wise Selection". The output of the fitting procedure is a number of "Credible Sets" (CSs), which are each designed to have high probability to contain a variable with non-zero effect, while at the same time being as small as possible. You can think of the CSs as being a set of "highly correlated" variables that are each associated with the response: you can be confident that one of the variables has a non-zero coefficient, but they are too correlated to be sure which one. The package is developed by Gao Wang, Peter Carbonetto, Yuxin Zou, Kaiqian Zhang, and Matthew Stephens from the [Stephens Lab](https://stephenslab.uchicago.edu) at the University of Chicago. Please [post issues](https://github.com/stephenslab/susieR/issues) to ask questions, get our support or provide us feedback; please [send pull requests](https://github.com/stephenslab/susieR/pulls) if you have helped fixing bugs or making improvements to the source code. ## Quick Start Install susieR from [CRAN](https://cran.r-project.org/package=susieR): ```R install.packages("susieR") ``` Alternatively, install the latest development version of `susieR` from GitHub: ```R # install.packages("remotes") remotes::install_github("stephenslab/susieR") ``` See [here](https://stephenslab.github.io/susieR/articles/mwe.html) for a brief illustration of `susieR`. For more documentation and examples please visit https://stephenslab.github.io/susieR ## Citing this work If you find the `susieR` package or any of the source code in this repository useful for your work, please cite: > Wang, G., Sarkar, A., Carbonetto, P. & Stephens, M. (2020). A > simple new approach to variable selection in regression, with > application to genetic fine mapping. *Journal of the Royal > Statistical Society, Series B* **82**, 1273--1300. > https://doi.org/10.1111/rssb.12388 If you use any of the summary data methods---`susie_suff_stat` or `susie_rss`---please also cite: > Zou, Y., Carbonetto, P., Wang, G. & Stephens, M. (2021). > Fine-mapping from summary data with the "Sum of Single Effects" > model. *bioRxiv* https://doi.org/10.1101/2021.11.03.467167 ## Developer notes + When any changes are made to `roxygen2` markup, run `devtools::document()` to update package `NAMESPACE` and documentation files. + Run `pkgdown::build_site()` to build the website. Getting `pkgdown` to work properly can be frustrating due to numerous & fragile dependencies. If `pkgdown` does not work for you out of the box you can use this `docker` command to run all vignettes and build the site: ```bash docker run --rm --security-opt label:disable -t -P -w $PWD -v $PWD:$PWD \ -u $UID:${GROUPS[0]} -e HOME=/home/$USER -e USER=$USER gaow/susie \ R --slave -e "pkgdown::build_site(lazy=TRUE, examples=FALSE)" ``` [susie-preprint]: https://doi.org/10.1101/501114 susieR/data/0000755000176200001440000000000014113174714012440 5ustar liggesuserssusieR/data/N3finemapping.RData0000644000176200001440000042716014113173235016062 0ustar liggesusers7zXZi"6!X'o])TW"nRʟKMd[_;zkս/Q_$67LI2şyRUQUU 3"B{G+g@ҕX%8 Q9N@5VCNZ1C;v 'UW/t7N.P̎T DL'?^UEHO޿KpA'+8.|7w.(8t96d8DDST8C;! )3 8„W/F,_wM)GY.I6ؽ/-D׍{ٝ\L 7c/1͛J”ѦT@G'ai_.q#Ƈ|1P&aVP6D ',sЀ,U6QWʙS\zyOhOl_k m`l&9GliS ^ \+!>U[پ;[x{#5 C*j~^Oh 4Qn Da]O^S\Ħ@G +9̼hK}ك$]Du)cx' Ly} VMfþA`'֬ #ʾz)ĂA'9R7_|bR\O !<(sڠa9i;?Z$c]T&d|o@QMr~i/j RfkA.J}sTz{E ?}c_=,LD00NZԛa?)p]?Ikm}_kxHj`ЗIu5^6oOkqp [4M{nL)L.ǧcvpqlF/Bg arն@>#! O%.Ճ51FkJ32v;y J&/V ۝/MSHk ӵ5Q&YTYf|\tD¾MQV~J,Y?έ6$-a mpd݆N=A* dW%m1`P)<ڻsuGYn#Z0ֿZT@)D{| "ḼdvJ`yS NHVH?,hw&216I4J^`Ulx 2Hgr)n_} $ΨTO KG!‚#r_MUxO96td N蒸,IϪޢ1!t*R"җ8J 0OOާ">c԰;<%%"^cIgK-8'"ѩ6իfriU*Zg b7v1-&):m5y5 @>͐%G}ԙ $3Ĉ3tcVꦅƜJo!&m-\K(Fcqb̠ܸ>o,b 4%c#Pa"'))H*%ܬLNZ˞W9_gt!xէ5kTW { X7콊Z 2:mo)bEKխP~,&:}Ї)@s| ax]P ,J-+ =!9v~NfI,&^kn)Ӝpt#o6u[.GOA&fM^k,{A(+t Qm'd҈jzs?笝}.RsFN"X+90[_󌅠Q[ac6ёПoa"b'txyKTcKR镯*LLѐ ~MPBˀ@Gohc!֑=F O=,mvDg7Of1Lu"K2i#Roy>dƿ$EC&җCy)(vU/tzX$j g3 )t$?CH֒q&ϙ'%1/xlq_ʆ6IJ"3]1j]\KTc9]Vƌ^aQn%7ӒƇ⇿ۥa|Kq(+6u/6r^aZ iӿ<ŶNU>hhY:݋' |aoB<օ>&/ g # weDrr}oQ+XSafۊnXbQϰ_7=cp$@F?=A{کlPQ4q:s#B;x2ož8 +"e*vlHBJ]zjң>~6(CQ:npd&rdG9EG,?Բ7>Bu]__U肅mkGf0!.#j5 iO>CDH x_i(v ׉odn>ill*E^ɻ[`+aLfKX!<LTӍ*Z -zڬ޳fcU W&V4Elȶ42t+)F. yy5lMfzN~ `.4P HQ'0J ,OBj}q(ԏTH͊8ϭ0]*EmoѮw#1IfK.&(Z>}TܜH>d}JRngmd (bWjϨGIW7bEM%ײ:Pa ib֌+tƎPTZc--'L_<֝ 2u T{9hDVJ4mRb9^>B_?vzY'4׏B>ւ:kʄr}9UQcoTz9&>aPR Jʉ_?1rA3R%:e*HÔxps.7/$fсsp֙(hk*3^~H +*^ե;yuR u8y *ϚJ{9WH'L/wVf$h*]cZ>*HW+/}lNeN?eF\ Sq#-I}IN'i|%:KaltǓ\M4>(4rXBiI֡W@ah[RF!: w4d@U:Y|r]O*]·c6w6j+4R#qc=VLD A!YwxQ_In': Jՠ?di]vs+CiDnȼuLka׺njet56jbxOC3/ʎ.]G-ظ J̣.`E6m@fI΢g<q1=u6^4#vZSWgŸs{Bբ-ʫ[T.^Kd_ JKl)"tGUN <<:2ߨ{L̥XlnW`UUظ(`8(צ3V ~p-RXN޻)JNCb7]VjOh˶'vPkF>]?N\T|yTgH8BtvH+2g\zgls(` G|c1^:φ~=`e>GBb=ğI$ ҉{4<Ŭ1ewH1?,2ԁ"-Jormn ߀Y?4ѽ iruiAMQ)jb +l3T,KƋrAB#n ۋ+gv,tb-m굌={ ͍.Z)3AeEn]rXO`Ry{u 2}Ff[*lTRt|4u/%}fF9|!B\RJPGDvoه?@Ά*ЈpəNusrŗ' eQ`NKح ;iA$]d9T"i%RәMց^f|_jL朄.+-LJ.=(U:Dm\&yIGfp6Ky"*( *~pwx 5>T*l)=-0OG[!8>"Ҕ+~>ܮT` ~QSsBqƘ*A?h9ӽ b_J`j HSN$)_~) 兑t+B'P'5w)MK}4&xujp~=ϝu'PԻvf(#EֺJcĄ }=$?%H`d &w&(f]ӣ2΃G"rw9I5Kjh5{aUY#xتVZVWë]_~YpNbC^4Q (}8P{8k3M/mDnDLiԦ> Vqij=&sc'[\' 2d*%PD}?>F{٬3dMjiH:!qyt; H1+ZP~vL҄@)k4?}Dnkȟ0aLLN'OFpGs#ʹա6Ft7:ϙA#8߾Kb/g6cB;PD{RrWFtH* e6\zŠ)}NDy![F@a#'d=\&$3CxWTCTQzDQWF'7_%<5ܰC_D7FD7BKv/ꐩ04ᷜQ,<;$y?QY1&6ڒ I'/LJo ֭S=?'S'y#^vQeϮ7s[%x`x~`lSY:2: %Sø2:tKa~ @\zvGC ˡav-Um!*6bh^J&V&¤$?uIjD/Fo{ކ~&/JHǚaUYf~,mᨛ(RAySVyѮ hB~TChO'9ENjim1ަ*`m{IC[Dx!a2c٘f8^>>:y2o]YRN ~pg["ڇUTz4os y,bSKn;T+{z)Mw iotI-XzfA]MgJD"@#s#77MG3K\'޸La(LϷ*I=mTGR7 0lf4Y t)1ŝ>I4l B.D$?溂uB#fX"Vr bF[ F{輐Tq 7טG]g * Z7tkbhB_˒w#2!A5; n/۪K4E'FeO ,nφU.%L19&Ad7I%{3B>~Q|R b'v"Gz;J[ѕn" 7upq x{EB)q2t3p\)!) ?YvMX%K'ZZ;9|tWc]H$*t\m5L#wV 1xȘ ʞ Wqyí~hANS P4 Xa\|*/YJ `8[$Lfݱ 7$Ջ]zw[=Oqjq[nUuJqR;K|5*x38S@8/@ew5F%r4' Y`=#VTq0ǩU,:4Pը[ްC1Ht@I`la3hP*bi"[WGg{V;tb.]VE[äA[{bJ7NkKk䎅 `:["4!O0bH{8v22I6Mm2?}_51gDdE3 !]@o̸R<;QWE<yF{K;>4ξ7_@WJ}th +\Ŀ{rO~P-s]bA'p۾?ي~Тaن8@2Z\ǔZZ& SˠPCqI\5 T"%Z\ϫW}UbB\IJ꩎*]y6yzlͬ) <}%+rbDsv6#2J~GsxNYd^NbXJl٨aFcN1je/4`[SYih<:^r*M77e%I.Aas>PҫVy0CR3wW3Io[4sN}=YL[g 4O02&>+q )id6ב3t&{3@t:CEUFH!U< ^|ujj%,>|]4 ~k?( ^ d!ppNeP6u͙h1ӌG(`bbĪ!@jO@0~~ U/az|L菏m͸+x2Zio9ؼz$rQo^+@hӂIZ#xzqYtlN>@FXxHc8C=/&qqo LQZ]W O?AMXq;wZjLf\}lsP13 ،Z{ANl-K )}3aHB)80~ :KL[;C{ei@_9@YW2/nʈu뵣wbE v}ɬiBO\.y'~0:s&'aB7?kBhb() dbCOkߟeYVbUO`\윲uY>q{O}ꁰbݟ178jnÕj쇴Oq!Gn)o3['WC>:n ;dpbe,5/-$a*Pp'`' 4xtۣ/K`i[dhǭPJK;U@ [*?D!A ۔?h9Hy2p*#㻟*;1M`Q$fN =̲+م W}]#Q]0-ESF"Cd=/'!c=oד+36''cCY]φ-i]OOk8gFPkAMT*#O{~< NU:`B4o֝^4Ʒ&s5OxpAŬaͿo6.Pm۲TdO|6njr҂ʒ%jHG7qk!!Dr@J/l_sFՑ.JߠR{v6'+sPZg8 ]H *-'p kX> miHDڃ3DZ3~ZUBFҁp"vH- 3<ȯ:?b>Jħ1NǙVWka[n=x5< ֤GDU?aa J 3 %U/Swn(m1踋 .áW@b7JM ~ȃJv1XꢼWPn5mQ($@o\*6 Aaw[gӨد]/nU>i&pyRGl#t`D&H9 `nc+>ǞNeĄQxRRai9ed@@ 8jX &Dx+ӂ#ڎ]xƒLOP:weYMJƓMH^F-sMzWM,Iłܭ.+rb|x1*=Ek]W06>42Xۦ Bod87@x2yjoB]&m^!}D ;|! wCфQO$ <̓Z̊U .Q3ǭc9T {X 4=;2kM}J eiBTdCb=7V8>fXF'x 2$AinYӮ!~Fa Qepؚ;֨2C+#*ghi]e0\h{pst!vmM  P<8)4r1bs;JI#FF:qs$E[ӝA H*[@WuMdvJ@;" ۚÁnjkoN"?GJ9XCnU޳Qϼ՚ {|x٨kŧx0֛0Г/Қֶbϼ`߶srș?G'ƆʨOsژ, ߈R׹^\Q&16!.2,UN|gD:"=M c73ozɬ3߿CQB'~` oO eK226?$Ĺʒ@D3e(A AJb Gq{ĶFzww"Qh\t:9/ ŀ>v`܎+fMC%{>?3QU)g' PO< = )d}KuFTmeumeD8L 6q |u(d|*?Qr: f[DbɀCu52~i4J-,HYa.q'}g/êe-zy@p$0\gS>F#]˹Sbø[|McG3RDxHjOƕA>tHk113}{SN]n(}}ał_m!39%n5(RMπqL Ş&gW}<1iO-׉Q2_,êRĎ :rAdrh_5'WHelGjw&7T *&Dnn3-A`5 RD\:Ź#۵]-?XT&X%y2TPrTjK;;]>YE$=|w; 8݄.YH9MMy\Stf+Sƻ6*rmn0R8?bvۃX)GnRp[>_YCv|ޣt[=" yTi]LN`` kCpp8 ALss'k*'yx=?#Pwx9c<ܺ\&_^PE7~]i-< KJ8;|ã lO vg)gˬxhp Nk'JM&ɪofFT3>jnuzd!IMNQ-z] #H 6׃b}(f>n:WUR<}+O鐆i b-KSlCbLkCPХ YI}vF%t}S~YBrl%/Q)͜69׃ߑ4Ol ͿT7[NVSƟdBv"dⱯ@#tџmUlk4F=.yۤ@U졜UkrO(9hBvFZVZ󷭫cV԰LS/$EVQ5 ]s&:#q#FZ"9?iI') gξ%~f7W+m8H$,E~?E Yۦ;]$ >N㒟꒼"N {eA'x]\ :2m)vUμ j؍u2K!Q@ 4}нoDNj]n2.'<0Aa5zx0H |PJIy>3-8zC4o@t.3ͣ&vVL?}.7TXyjGzlB@RsX<`alxa 1t}I)z_X#htg2'~"5,aTY}'cZ|7" SAVz}L/udqk+.{j]hkfMoB^L6C:a,g8]51>J-Tp}O'bp,w8 UӠ dwDZ`IN/M vPyR6!\KIt憇=#cL3RُhGOPQ2O %VjͯR ?/EI`6PZܗk}CTE.QUu޸B*)yΖuP6lUWo@jŻDv m L1\_E?7@BXDN%/djpDdO$$4b*6%08$8U;* sTk9cmR*f ]Oƈ00to2ӰX!oKC~~ŪQq5,7HcLI>Sū̃.۶o_57 3VHj??7(2̝2դnnjul|R䟗7XFoWiyWZrLzy| e*M ^ƮqOYzX0PǺS@#>9 ӧ6!jv%=>!$Ȋl(K}1\ҿp[`ԔF;0br RF ͦ[PY}yA%IhW$Rl]#`zO&J%Az-.U׌Toρ3Iq3?k濷_j'[M`c0\ 9zBF< |X,LfQ27؃'t0a_wNf[p|tssM}̫̆S;)"2{o*?:%O̝ {j tCo&{dL߽[Zwo. vc\ғ%L@sJa"ݙXqXWOć!x۰,6@+/ Y)O[9ܡ_ ]uH߿$S;оWNYR#HhC5ed9]ӵ$V,6+@eh [sIb" ?y+DŻ&_Q C37U(@΃|+:IX%P.] L44o>\H8Ŀ^)Ѽ̵Wu4يη|_c5y1Wl{gɀgY(,Έ/a ,e) i;}YXP!Hl$7圄"OR 2sQ< 5UU@"Y,@LXi&i k\.f5 ʪFԥn&H3r }rj;Nѣ[c㰀P81OM -$co`mJ~%&B?HRDzٔ%H=+ 5x""Y8C%7jEmqވV*59bm)p4#zvTn<ߣ#jZxFO߻A]o *$tgV ,Xӧ9fcAH|| 5MI' }4t.WMK@)\fj ( V! #b!Qr)`Ux#֝$|@d rXVG|Ymx8 9W?|6-c'm_.]c0xĔ)$, 8jv1W>7@y((dY?aL=>&xLwlv_HVGFK<#u)jfFdYj%i7e'd`;bb*lᙿJS q }fGjd=L"T\5,@Ya\{>+\spG&Br1DԢ _6XLrx}hB_c{JKZ2_ڞK h֧ƗC:Ƒ[K>*毿XJXq9X3D: tE;H]~]ΦrZ]Ŏ+z]36=Sս ^ir<{߃:7ǂ\̘9NR`˘`$I$fBdƘ'=hEP].? Z5x#Yl遠\\;?Wv"T8iM2[3K*::|B9QbR<9(kNN亖Opc~j Hӽ$g('Ul*s˴Pmq`()vL7@0EN38@]If]lTP@2l6$% ~r߹:jb_u5$rr] ͸ uɖu,1FhV/ŷpdQ gk{WEZ~5)vh!xgYPO7pȭؔj‘`H<25A%$KK^? nsYT 0'VH!IYDK8} bl1?4C b !HC5xKeiҶ9!)Js|ϕ8%y zf?Ti@nDl=xr3\EqK7 x+aJHDaΟ@`YYx)5'OP6 uѫa"rC+HoV^ʢՓqz# v{A+H|@ 3"3=i=tnc\\$m{3$`+DT(t6cRE5BftմUt'ae/*j,bJj,yԑv *i(dtku=\*ɤ <?Zu{G속^I3줘7s;rb ,> ->W S@b0}nu+,'RɅ aȤ<:VLT;C| ?6eO8{U2y3IW$U*/Ho/;c޹]hu>C'6,C~ӵS)6kbDo|xS&dz4r|Z& [=Uo5]LIG)؍X㟨4O "5,W!(/楢a pb Bgs/d;q+1`OG`lR{'a / 1sfȂ==)֘@cƀPG/GRf#lװ!hb\QZ3o mH%3uTz{(]C:}Ei1mRLҝRml˧UTRi?br~$@ҕŏpre[{W,l_Uf⹴Lf,7/rȧ[Q'f߲eγ>9C-C6ei;fL8smaG LǬt5pW-4||̣f kr.Ҭ$V5ǹL IoIm(pOOX~H-K} ]v,,$/š\ [0hDgvV?IUj2k]VA=n% L]兩8hbYɠ{gԴs ' 1IћG@_En]Z>)x;H_f7HUxUrC(4Ƶ~Ase) -Dݒh2r`}`wCC)ް7 &C^jqcwt}SC:+4Dvf_}QWӫ>-l+i x9mxܫ2w6T툃G v2C9ÜKV#f-dU5D{ GU>RT7hfag ;?'\Tu"k2..R1 mz»߾ta p j3EMQ߄'"t>x 9Q¹g]h`T%Eq%CtV[R%q?R A,QnFBrY<>~Zݸ"V&t Ua5 zQ6~Ps!rlYUfN:p7K`xV ~A\4MJH/ L1'tcp!.ȫ\+Ia괷xNb}Uj&+T{|}e>Gq@4_³4D/ڊ毹pS1nOz u6>X:>T9`IGkEGjJz7,;;+K=YM/x2Ex-za]#e.B){>>I` FI2K`u|N=nyp4C>М| Rgu~*hBiRՙyadZ.j+_PbL ()e7V:#`Mr"&B߄]ZZ[].ClZ41"a567coKlޟ\\-s4Qso3~HGgV8.GQ \xukULJ7m*|W{ a@ u@!IOKWy SQrTh;_Bİ[![mOMBn );5yӸѶd}-IfgR:$bJMDvdzb㤧wߎZ99p^E^cC 1x31M{FcNw%YױKJ0*lZiU_hSJM.۔+XeJT0GX9VfAE>FhVM#cԂz"Wyގ_KY}PF9FɨÄOt͝L!`ibªJL#Rg[X`e JUٺ3ɠH9m2pL𩇇_‚Ke- 1^2;)\_,blˎp]@pgߣYQL& Q q/畏ZqyPR)=Lqs^BL E-lnwHS~F?a4߲bH Ȣ%r!Vwʕ%uŻ O\BsKT@KI ҸD^|$#$?Hv | q.{)bc}V\('S^߇NcP E&4C$DI]fr(@j4_] ;o󜵘-esBٱm$VXZ|+F'ݶ# vlaٓo~+FWF$f̭{C>qK+B_U[V75Q<ƀ|kѦп>gCU6d bp)NCY:_mLv&yU o۲fq"z-9}\_Zlɋ5VB ܫxe_%yqX%,B Z M8*R _+xe f#@ wÔc)V`gƳה,azC\Yw޺y?e#FShpKk!frW補3suˀl]0Xi#\lLkhÒrH-)17y|7O$B'qW჌lhl~ܽI3h'1~q%:Ms<NlySAO|Tc7t6\"dq"(U0 5bs&3~[6,H%<ض!.b [i~կsͲ (e.7H{n _˅/<˺_t'ckZW.6r1 TjZAh_L'2RVcV\1Ž<^wCUbͭd1\cpn8]Qu5ٗ7+-Ք6Qva ﯼ!Xr @Iqy)?{Buݍ`Ct(FՈfߎ\#sV/PbA4U2KkИ'033'1Th+1&ha&9@ @c6?$]Ȭ-J|%G\0UyDhp Z}2pl1H Q.tTnU)cR^F |jwx.5 Bl!QoOJ҈:cQ' 9jf|cb*k'9g+Ѵ[Y$& on4+u6,obW ګ (dC,Ue90΅E:r'h;,(mWK'Vp_Dvu: EP"e"Cc f?;IJ(Jҡ"KDv$ʡsל#8N`{9-C ekpesùu lbs~w衴eUVMzZN Bڕ ~zv4_6Y{rr-PX8eٴWKg{фɔ^{fz-ymoy抻!>ilw?ͽ֐},iiN9%&8E:IzY[k\>/V0:{g_V|A?1;إ[g Ek i*U` s3r>&s a#?;T;3݄C:YGÁF62G o'2?@]ωyȾ(\QT1,XP&APsW쀃R@%nጾΉM6͜G<!z|I %t!O iZ ]{K>N^ppL}qd/7lzO[^K8M.zI_ʜsє Z#G_v"l,9,W8"]hJaDK947]'&ˏ2Qn6, Xh,pkfCp_;]YPsC}~YYuen} `'ъ" #mTwȎt3^=d\Ǻvβ*Owklaö05Xĕg:v<sTzC'Ƚ0`Ҙ$:ˇahVCB4,,2,Rr{vxs+N^yߎH;fy8ۨ*>`4UDpq6ۏvD9U7mi!jo 1=~ā+iI]Lb LcHJF<(hw5%}V-2#u_$>6Q Ak5=e)H.kiW#E;pw8A:_刼,79azE5|T(Cl¾x8/Ytedv/ *[|;F(|uz-z˪-O_]{pnqS.<(-dh]ǯY{g΅]wA, "uP-<7`V4Z cq.CY 7ÈwdrQ&QH&A3m& wm a+u]i]MJ\}*snŘׇ& ѢUH"ٹbFn/t儁KzQSQkS 4c@&s~~P.a@&_lrcM4k/.tFb- ]dpÒNpLQJIՕG(dBJ5J֑B^vGT%# A E6r̯?`nⒻs. eA1t\8g'&ʲ/ayBqr;8q/ Q76R?J@v| +JO2rB'x:s_r97'lA ɸ+]f2 -u=luU(7 j,L[a$!-,-G[.2^~3qIy q(f&TE xWy0tK+5޶ slϔ-5^CbT3-*ᗋj 9<2,ɮWry< bk/m!{1p7b [9N oH kddU%PS`㢣v)=d;ٹ^/SDa r6ɂN 1tzSpQ#zՆ|8L:DP%ƫLGfKġaCk 5h& +)㿶ud+DU&MT{eFI(iOwsWCx#h&ELg8R-5sp[x:=+=)GL^ω xyqZA;@6PXmg&y$\*)__~ 2NG={tu壿10YneA 9Sӫ{F|䵎G*]Obu# ^hA[10-%+cbu%L (6ž"~a ߧL="mCO1zQ%3l3BW:4S1s,$(/Af|v^Ҁ<$W9fg_OͧuR f $+邯O _> :=ɴC g6z B,)^[$v*&1(Uަg<|a'ta!94͖դE㵪2 :́&zO=4!M8!.%)'ؾ䍈XNJ:S#Q:N;: _?{fl9 ƹ N ƕڽ$Uk4pkC7C !zi(׋>P@}HvV I?G`$Jm)VW ' Soiv@Y:u1/ָÞJEa5Q1@j]20N3d*"a㡽enuu]@RExᓇ6`K`A| })J,ooLMHVäKqKytV :mfgIi  RjE3 _8lm=uwY7uS @k(P9X}i(BwMa#q[-ͺ>A}y 5ݟ1!$y>WK,F?G'W= C۔ѹ쁝ԗ_L"q5ݤI +;ۈA۫ZhIIX@STaUo(Cxguз!ŪlR%hg5&$Wkت#lRW5;&1:W*/O#5dIչR1=0QiZ{B_xs Gq#SPy|RJnd@)yñЏl)F=^ajmY7І'=LT>--]OUS5ңp)UQo/ nT;`ozfU{c|~7ya"B3nҤY_:CZr.mt&]6jgAXsM@I]g*p3 N`.@zuGyhyҫ?U*"h /OFNih\xg,U_;y?Y(lGt sӦ-'6@97-PM*6*,rmW/ȷ:=#cjI*bNWWX 4_;@ GQ)H+P>Jb%I[GdU` 2̑E|DxjiW_]8J$ C H?>Ew3*k[tu=-+WPLK,GJY Xt[5C J^ 2Úh_ I`lBuyw .l-pO埄e16xA+CLyZե2"+j ^<5 HvODHrT]BMj9OpGm#.EsE.R"阔Աa# @vQj:A` 7Y\A-ީ.WA_A2E' R:F`M8׻ $Ӯ#Jc޴10t8dkb>juHȢY65b%gR 3_yRͶ!3I:55oέHYBgH:㵃M0p.ѼH]VI.6_eշp0O~=Z1DIT%hV\1W(Ob yI/B;B/c&c)KR̭@|׿Z! gPzKkT@Ze3 x:n,ĭ01qYjiU1HRܱ IBɢP[ǽonJ7 y 5WVlyF;m` P.;&7x1*@UAKSpD`F#1-V:G'rV! Н/:2BLlm9*s3E]'-:|,\;]j~z>UՏTHh9T/ZIE#l xoJ(Ą}Q3o&l-:=ٮ|lhDg7׵NFqQ4o4&WVt3sͨ+Sys4M]egyRʌZq*tXzQ3Ey07W{zA#X$?p+IAَkxKxbyh7C^.\6mWxH鳀GJPku @R,wL &C?~c\+}&.`@ ۼuU$WYp?d~Fwלc}0H$lP̗&]vJ5%o)(-Rnh󙧤0&%Ej.F~jZ^Y}؇^vW.!"ծul\~;'J(=Xzⴁ5hk` ?Uoez3UQgqHiMp`3<}J0!n?Neџu,2 i~ X,`ƈ=Q|*&4;;f >|6hPOn?D\J[,˥^E>oj|sjGI>!Sl}{6^ xĜ=W^'`PTrq0ȓc?X{h(kT'L۬3f$l/iK{JXmۨSŸ:g}m_*6E;[3R`7>3[8Aj:cdzn%:]eAhsT1=3%D<.h45^`f&tsQj_{œjcY?f7` uҎoZN UdISie8޵HӃR]s3r!OW(Kq/33`ZER#$+-#8OEӥg1 }>VI+\z :z(UfȜ/ π{׶Z5^Q CokUo`$] %JBy(8q!,̜fXbŁӔѓ-/@E`rߢ[H7i-PsJk)͙%hkJ"W9;yƑE+pf.Τ5]T\|QajЙt,')_!I/f`iiN4$'O)45젷QLKqw%w<y͸A=Fz&Z6BWf+A]W 9/tD!Udexj&0f*N傭0̑l@YE/FNCđO9x ȣ%8B{DMZVh b;}QCWl/Q5;v%de5 d-WdOs]^7B#jp>3h JMdn(oaIHM ,Bi<#,A}8yT4IMw#B>sim׆a cQFT kËܴhΰ2̴r7J+R@t n0W('{+"ѿn~?+Z4"1>d]J Ǩ]0\-`K>`ֿA-4Ip`}Os] >dE,0dq+Wf|rNs IB f-eWǟق;뉏)%np3ClͤY*Tֳ\k܄ɶhL'Hk8. \V>g(b\9t(G"[@8![ P#9C,3el{g߿QO P9}[Ժ,.1hwS2Xl&BV&׎u,tX;ݔꢙg>.)"xSd^ Fͷ=,+Hr$v_T|gl>@d7[<'&^ (hۙ]x$w$ {5A4e,B4BlX|]MÃOcm*0_J݋C[ŪS)"wfvQLQ3I~oJIލ!~x^#dr@_d#6{};|&-̏"v2,֟pһ̬BӅH%NF_Mqq+aOb&\3q#*u?5eh0¨LR܄ o¿P&y1›6G Tԕћ2H v韗73N"axU*R(\^EQ2],硱O(J<+w϶{wJ:t%# ވPG.llK=-c5]1a6 (6(ZkkEٽ_fGqjeP? /Z؍JƳr=6U8 xCJ[t fe%b8p(0lp+Pj%Aعt 9<j Uwc /+ͅ=7:dIi]7ƜVh. m[|˵+p"Fc_&g|qjB%gͬpCJfla%(-[cE/o,yL.>-WDƐVgb0=-CI/o`8Yg7XB Nu%;Bkn-è/u`Qr*AVc͆{Has 1'H"ҽqܧ ~3O,/$]K4 3hj8^@с\kJ$)EMw'+.JT][2v D O܊+κB1CuJm\$!ޕ!y -QНj&y՘Z$;ja~? Vӻ 4(l*݇Qk*SN0vGO|@~_n} c5).|ΞA 5nINhgs*ǟnz8;D2|e]=wʖ5{7EDlQ؂C5cNlu]4rZ@@-+z8?`s@bZZ1XsU[Ӷ!wz_Zٓ$2pqntjϭe>੭u\-9#&!n:1Bbɜ7%Rn\P%9LF*MK^J/LPl`v\(&'dTu_Uw1DkL&雒oH3ۊ:ZCMȇCTB-A-$q*["q/C6"'7vgϪk~lDvWmT|Ÿ#O)ϲ}?}.-)ELy/ I1&*LK"62UX& {'`"1-9I?tփwO 'G"Ms:b*]mHtGxvsʫm%B D Y_mVn?&R89; C,C:[kv"&*{/]J թ3w[F Rk*SX4\/ ƃă+.dunZPVo HC&.j`PeBZC ϛ =~|5,ovG0ՊE]Hə#߭h% `IH3]m[Oƀ=ʊػ ~_ZvC_EN3A\@97 'k?DI%tcCk=kN{CR=`)~ `B[{l㮓dc8KθҺp^fL[ VֿaR88ʾΪS_u\rfva;OE+8? %:`BzgʚZ;=#PF 8IƜB *v3RDEЖ_ πduf: 3)Zlc35!~$i󰾴Eѕk"B݇j|0F }:DQJF%DiĹ|l=2T쳓|O;ؾ63)'LLǧe:tb>u\#9i/${84>/u\|D$@&W/-Ku&Xg+~B oLRW0\&+i1Qǔg*T]g*2̨D7[K{$z/r,;,F^XftW*K>> J{l+v$ϳ%M.gU۴;o%TNu;WhlCqgZ2OҷNaZ}b4kgtۿ?sMn)٣C,&BPe?Fll ~>;@ {wvgs z1d;Ķf-dё%1N9c"vC;)=R^N(?b  ~v}xJ}6@Llԥv64S$9`<&\ [_ќZر LO`o i~JCQ#>-ӻ&_*f{|DۯqMҏ5H as)I:bnL]6PFM+A90[@T6C'8-NSlF*N.ְS2f4 !$[F~sr<\nX@=eF m9>[AͶ2=Cf7ìixcq( ~%vNTzZL0VֶEᣰsDTTE9L;H'W%0zׇe숏e,4}5;LAMrFg~!)z,Y捑I*D\d1 ko.ttS$`zt 4nu[s]OEM(jB:zVhv'3ɏCb02I '.̾K }jk"`ECm5(_IU,鶦s河\?JQQy)īn6!7*êۻ7B EM4VӃ?E$a'O[M&ʌCRWjrw&YB43~>y9B:&BPPmG3^ _{c&"虬"jtEBʖrSVJq%!h2i_lج5vnnhI%oŻ8-DQ,Y,64X\Y*2sw|b }):Du~D>ۭ@DbcR_sS'k>)ER1tz dF5o3}Fum}j[ š;i7s=vS&-:;ʘCcqyǺ21'h,"n5uD &Cs ܾ/vDܛA3',J=/b)?MKHUd? | bipT|+miJ_6pq˱%e=Ť08'\LfzkH2"u,_o``UiYLI srM3 SkP~|Unm#Hp&eVf@bn*Q4f*KEhlt2'4sg M\pRjj rh e:1Y\w>jfLIc{#jJtc0/k,rHT]Y&1p؆q\I0c2#IޘY.[5ebp:B 4_!i~l11ѡ`Wub_\eςZ%S(Պ؞qß?!f-J3o|Qe eyL|'QR;lR=ksnPmNu pR*6P ;"?G];%qGuwUoM=i{hnY%.#M z\Gh=ouvpumPQ':9@ m IaQsej,Um o|XF p]X_uK dz680VS[GJ|lA$'N`w)HjQp΄/!vb|SW!eMa 9{e: !`6;s^8#mH6%:Rj Тկ=]aeO;A̙hƜL[M ,Ȇ 6P{ypJ>n񃅳*fgQϩLz"".2{KvG7PXfijn.W^M;'MI'u+`F&#W/i2Vf_8yuPќ[Gt@dOvŐNQyְթce|paLFD`2It:'=~rq}%YB NxabLH=$-K&( =FhՂ sJr+_//4ؔo7nh6Vw'bC. E]Q%tŒ5УMV;ZxWG>aE6܋ 3+Ğ*#HlotMgi 9k+\ BqDSku}t8V]rG y5 YDTdp(Di!D*m #` S"C8 VX"$ozde&7tI8}CJoBz߁Z_wk,Q />5\&:j@`3]Aܝ0|ƺ0M3V5Mk¡&-_+zVtU;3s 9P@D5wHѡ.x,|A& KLmopI`5D{1=;\j'd_(qf/ u(GQQ.B|U KA8+exEER^_?y#هT<7)Url"vo.; -29f/87RJYjORplBű9VJ&,Y&>aC`[R׏U61і1R?QI#ۂ4x'^ sI` jUZa"@UۜLs|, ?[Tp_=kT,]~Q %61VC&o J~OMjHWhm|.d<: Hǁs|.}OzFczx=y.$k?ekZӗ7.~Z654=v]k298("C 5FF=й/ wrf >];t50Pu2jGQh42P,sTlO>'H5HYں(/'- %iZ٭8J|Pm?j:@*x!@D_5G7ۥAo~NON죴'Tn|c6Q%8f,]7w\ bG/H^ی9 c5lÑ>^IU S W {f`m}!D\IF&T}44ض'#Q9vv4fM >HʳWntN"N6ke,&8˳uMɹL&Z>VRbpcG Ww),Yyq2;k| V#QoA+ojkNn lһL Ydy c; ΥUF,BHp(u1Y%cv,C Z=CXV1ʼndc7#T,!7i<BQ6d粉nt;kWh$|E c1Cъr0lwnBVEMp0jn5yyWdU}lԲ Ӫ =|͠ [0`ΖhX/7Id3Gr擜u+8HR|h0v?>:.+6GI$JާuS&,yyGN G{%#Zλ gO 8gV]%9ޟ5U1zgRIT١SRU6|:HRf@ FU v 易(ɏa %̒1#CQf,/Nkh\Tq]z~ihZpM7P_|*(\h{S@Tj>u, kLY/I4i w嗝_Zf!"ZK$x, <#aYOK$&Xtn%Fd l-G IEhST!-ݪ!v\/X=600o3IvJGM .`fd^5mi(#(n @44$c4}R2[pzH-?{THH[LG)г+uv<ȵǷG}LYT#RdMøpy0g) U9?]AlݕD;%Nq涱zbpRHy7`{ڑ;2gy0,hQW\m>>Xӽ٤Aзr1&L:#M|) ߧ}4mSAI5y?Yj<SI ԽCY`x~ɮr1Si_qj G9?mc<)OTM{d ˧pVVbvEG3Qk>H3S&_fS9Hw:v؈{hxƧ%LP|r1.e r]HN,}`7 5x;7+nLrS"Kv'88v!!sXLY݄fIRE݆3)![Okm^%P AWw;~V͸Hz9x_ 8a@;8'h87O#meg[[uvr,VAHYqY|Tabf7'Aذjr^,pM.PMIU؊kN E Ye 7,}wVsS\0Q4yf@7G Ws4%!ؑ&X)#sZ׹̄šn:iY %֒,x BzTq%}FW嬛viXo~[Oky4϶_^eG5tE%C^+&z h ]#(.:iJ`$(fZ O|S@2gʫ*{w5;ϓj+t[)",x߇Slm,I9P0' FYq/O@M;gvyRtܺ=yʿHkmPXlP_vgȋ/&2?1r:^.y )B}*HUh.^ B8Dc e|)m{X5P]vx}O~ɥrܛ9Z.Kh([|}Љa7DTHbeL` z[ Cv{w rlHz,؉NP III¶%Gӹr\P&(>Cӻ5r*A # y{};t%0[b嬼=*)DgLJQ־:flUјju 2Ir.Z3m֮gvbA*IuaW`ڵr<Ǣ&0~RiYSUH p^v7Чʹb{'γnc=IL+mۍFǡs4wmpƍdPh- Ce9;Ag0D07[]S*)FQÀIgO  !iE[Z*eS]<>J뽟W(qiHq'q+_LG-״,Q[W˒K1f`:SGͺ_:}.scY~;J=E@@5Y ai G&*=Yl7h= AMߛk<{`{m0?<a~ S$sRKLB҄B眭q\WQ|+mj+ m ?Iʻ^tO-*$",`ɔ {/Ľi._D4Ke}ƥQ#@m,}w82|h$dg [6փE-:&ܖޤ9CZh 2\$Hƴ^ռZPѥcZ|@,-A᳹&W>Qe)Ր5'w} S,uJ# o%$J+ UwӅ׈e>O97%{m_njWs+^נlɗ@$RTuC\ 듐', 1(@qηP۲ m&ا4f_lwT'PJ^Z7 HC]qD81܍F:' LI,o 6yms 7F ݁^L) L97"?*=3-͚V+&dVVPG,iu\'֛>~"4F&nbM=i;.U ų*bdy F7)Y͛zJ  i;4iزdOZ' umy1 !h)*!!aP p+\:PeU q06u9)S}Bwhn6Vz"|GRusKcq&M,) 0ng=#p'_M;l-՝AcaISn["Z䣦ʵK'UHϬH柄>#λIdG\ 2tyQ~tgR򝏈X%^X45^qO\o LoH?G׶Rp9i@ųƄhM A< DuȪ tgxͬ[y?@g¦%ftޕ=T#&$)Ml?5uAkq>K`H4\TDgZW.dB8B[4~@HҴiE߁r]T 3j|C2ӨFA,i.uȶR;ᨼS dEig_9pW,-C5/mUjFA&mrڴrZ|H$Jv  qIV/W8|, Mm+(d?+"* WuDXV\gkF (!B8jyn]hEu_zP*Wdn}˽a^aM4]@P@Mi؝K!g #R /;UsHx](0ڗ7,A#7`7 2PfRbgV伏ӹ`$ 2;|?O1Gs6PUvw$%5=YzU~DZ깫f])OY(uqX"żK֍ P \!|6Qt 4GEĂ#w7*ğ7͊ʽQff'Ck.?4}dԛz.]$val/=fQm-9lT@vrqxTM״_򹛢 S!:NZ*jtOEz>=Ƒ,Y|WYdF!/t$Bi~4vNħW&k3ݐ 36'vV1QH:[N5hbP1mU;*ό:ȜV3/RvZc)pg15:1Ys>c}Zyq gh@+5}T}KX l J\:Sա}E N=ٯSۻCe-6߸ |h¬,;Ԫ>,E{]Ek #c!C=ثd[pBz,i57I[8۔o2YN ^I+%#q `OMLU-Q`%w6ݟ*jWט]" 䆰,WԊWyA|Kŭ6Z{)!='(a>)=')&Q.! }ܰR^h1G}~h0}Tr*OwJi*l}}Ha2!ӨSyoI-z[=rճ>Ikuœ0~ (au쀣]a;tq&̎ 6PE G֥+5W{UYN[5\(XwiÇI M sܖb}L `w)$g@_ e-lV[O1s$sTBvҽn8E<$q㇣ :%Mm$ٛ9 ټ3?*hܺ# ]f GL>ZJ? ֵG},uBO"}5фdii7>q'j TEd32_z"Y4-=]߭0ҼL*71ED@q GNͅ{WT@|#j#M ؁hv`^j |epWC Yk$o0"tQ0i ud{L M=Yd(/:(}m*Z^_Ht>~zG\7)(Mq)/'` ) Ws 4mUO2~E:ecCbȽpfE w"}ai$]^—{ai2q} a?rGJ|l5p(qlINA='81@g"?5󬙻ݯ#j20"57t1pa:x84"&ncMN*΃h-0 }(zfSfFknmg?TzJ65_S Rsjv3Zy-MiZEZtk%ʷFڽ*9ҜlWmY.~ W*[@Z-'@"s4ԩ휑C^Ԝ1hDIⳤ%dyS ^-+TBםE:yϵy*Hۑ1Za+ʹ@ADμ#'"3rz&EvڹD2gG.%t_7L!G)c]5h{\VH?nF\tY  $P=|턂UL\O@%r _K~GD~~yXgX#~9p-yxRTwNx+I'˻7)&1\Nu#wGހ :BΜ0 EbNd1Lx0aY=(jHKHрZ앨PU9Q|نr֘RB`S0qoC ĒXKj a,2M0'NP~R>ěv[ZD@LQ5NDRZԊىPZ|,Y&XbBtIGXғe1uD!U<&yQᭇb $&9jQHNd#,~<-GɳOܼ߃e(@zfgll`xS6km3Ph)lq#X7`AdrbeAspXr>BYS T:Q`` UKocJ 8NСcpb&Ң:sΈ[TUJBe}jٺ~bvSd\s7B|#=͟%Q=,KqRq{Do߉14N܆os1fˁ|(o_ Է6)VVzu8i4078m{/,xGkj>pm~: {5P(TJ$,Ld̅@>IeOs3ҁd`vf*EM2fH7'm)"SJ{_ r튔AGV>9؅F7WLj] rXO% Ղ/h/pųR ˢ P\`ɀݡ*wYJ1\vC4Hmdz./j?R 1 GfډJEƇVEd\ﲏ5gwݤmw2S}3p >k@=Nq(1.QUcBOxŊ>P0ДtCE*h?2އX%^CH1!VOSKiTMGFQ{OMy+ "a,X P(ʟ3V,xvuMaT0e{bl%Ku9eW YA~G6n$˹[46+!3X0b54&& <.K'|,FZL'(SC6΁DÎ$o[6"Uf!3\6pQu}tGWǭUWkҲjmgw0|7m[,jnjVnA?5}DF=[^vĘ6xgI+n/lRSJC[H毖KQ3IBN Bs(W>F,=r?Āx7Rl@!g`lxt^B ,r|T>C;A;cS'$zRA9eIj4YDMjp4$ zX TCh6$ 4| /Ȼy]d0|0"Rs1>;FцGԟ[/CxpΧZEY~27Xu6#_ĹR,ճ*M&^=ʍ6#So7M̦UYCpqhd'5%9 4@I@fQq?{4xπ8~ME I5 d.дCZO۰jvI;k{g(,Zeȕʱ^Pg&ᩦ7#h2׉u41=ۍ4fl%9ACь -YU(L]c u=Ji5Zl#rYUr}bSs&:k8y`Diw'\k5XGs+2"4y8Ɨ?hT+&wzEK_=LD>l>LmOWKMkZd-FUiD,:?.*>GX؁uJ\ nϵEWi (}CoBjj:LC* BW9G߃3, pCk#@<{qQ'Z .N삦.T- ʲVK}{U6z51|z=v4Z6`yZP6o eΉj5E(l6Vx%,KY=Gu2q)LQAþﷷs0$[?]Gvl78 VVaz-УɂΜ R;M9Ow'YcඋzC>3ƾD\h c:Ȇw t*7ϸ)w#::*[(,PC9| /5J@-.^$uju6$ 4o63,ڵ4f' (|'6Fys_{h;aVMF4Ee`K:FJA{^h RaZf?w[E6misqHd6>xCدA`S@魑ЍhYu'u (qQ`\L'a{lal2wOAtq6ʑ#$k[@)c~;s<M.7r?ԩEgޮ7W"w*>8Aޯ.on]^- G"F~Rw1 JrW6"@α_"p)v Z XZ8S ^2l)m#L @Iq_=c݌hMb2µ܅,y-OũL^RjWrN(1qbE9vo~MYJjYͽ1SՁ _eEC.O~'#줆gNH0uXhdL%gMjҊbS!T 6F.2n)tcBXwP)aʂcf#$3Ey9LC.{餟$}ͮsUg-V|B)]=Dq/ l,8ܸOȒMHܟD H̯yv0vgI ܵgT-JMzSֻ9m}z]/Q66?am,S0ϻvƳY|y+yReA]=+7QQf33O/XYJk<}4/jϠplA,KY 87`,( q_u ܹ.%еmq9Ƨ['A-( `:6› wMS㞵dd K8):=4 ծrn;>tԡi{mdj7%ЇD?co<DVm\R9_@MIi!FdǫP(:a'[a֋CzO)Fmgب9""@aTJE) nxK)K7?՚:ɱuU&$ ˙; DG\aS;G65FArdWLLCG[2 1yUȔ28lC;d 'T4\XFbd5ԣlD8d78F:ᓝ֥sܲZ&v΍FځE+I`̹: _3=qܣ4ĵŽoC%>ey5le:GaB+:U { Cmc4nAG"䮦 W*?Ɗg?C)Howpx `:njFTN~Yxlw;1mykW1`C7fP_ukL衵ƭ<{,=Ʒ^8ޭ>AYC;OD.s!sScnqJ,@G|>F\0MtrfA*}W&ڵL͖I̋NdnK=43v1{$(I&YٸY>U{ VEN=Cp11Ex[ODMkgG[ϣ1[[Q/KY-3qR<;h(O|eM^ yA.o c}{o f8 uش&ײQy&KEE[ KD~ru(pYGdfܮ&x`V߅kA/6N,vL#;@ 3a^#5e.yhy#~Zi942Jjټ1Cc_ ?#s(-h?@NOT?oAymQx-{ KpAn, 0wC`kYa&ETVlM' ;dRcQv'eQ @;Q2e nH).&GGKx)\e~G}Jfm$F&iGR\C"}#۷Y+mg_sKp:W}"!XGp0kq\޹^~W\U*;A^gG ʝH@Ԍ^]b\%JmpNE`p?2bsL=8X eR'v/5>EJni<@oN_2A(Tm4˽!-YF$+%Z R֥ް7e;d۹BSM5Ӆϡ x<* x=!1+WA@Gs;NQ&&d'bV]a{JHAٛ ߩbnc:s\*zuw.nLj9ʭJhA@EGǚ['5"|X*ł-,=_]ta>>|:vR4hVK w';2՜r`PsKK.ڙ[_qWĦT߬mX\sգhtTi\)Э4 so247gj +xF3ORaA&z'B3}B)0$\ۀ\]|-b1Z;.s~-v@}v#b䓌O3s>@ذM68>?8&ʣv:D# Ř>\@S,1JJ8+*OGr|ȓ7df E#'T6xjcTTE?^pI,cs<4ImzdצA :|o%jdg@(jĭƏz?`(H !l. /; HsxÐ;kܩ[xD)jS|06P^JTz%mYrRcfrD+4b;est@4)D¹?&YA.xѱ$agUЕo'o7ۘa6%?5'6?. x\ gl,h"_õ{}ПY%9<sI]髾H]r-o\.xPa/|6B$a}o6NM:;2MWF~ #FfR  Q{u E(j0!Ikt),˼#]\M'RZJT&KޢGU=̇{zݝCXySOMl;prƤ x~mO Bd݉%/f?ǕvOc Axǒ7Ao*e 2D.:x{KcU+t*ܚq]c+Wlڀ&8rb^TeȄ3gPGgcպ 53mFsxzy-ݖ2de%y5Ez;y|Y﯇hoǬ9FA;UW "_uB(>aOYu4rsf1B C|F{ 7" a&+SZ >-ke뎍2oHf#W}TsR1KzdFQYjY^AfR7tm&-CƉ' [)XBdSNsy2u;fL^\\T|y RUmɭt%K58GD ;jE<o"(c Y(Fut+krNw$# S0*#)β"$9ZT8TcR]NK&l8mԚx)}Qb;2{7%( C~:fUD_޾g:(LX5fuub3[e:AS]^KJu/Q1ZrjzxsO8H)9”%"3s=g-FA(ECZ -9+rl*pu3̃ VDoth}2[zZt*r&y剝gRGӺ4׮m+6qڟne٬|Չ+T㗍Pqz7S:d''{Ѐ-{+@\]b]sA.`]gaTԂޥ#ϋt L,O c(+hO'XENv۪o[DJP)wcj!327l{VÁ:xcy+67eGj(aj$dX" PMc4]|$t(@ū֪(x*^R(%5oŸuXz9mOnZaԔLCUV1ֿnhO2A20!%vlXdmY@6-IU6(Cwdb [H%Zo4[)<΢H'2&R22'( D@ӆc]\enqU&/Qѕ3ag쟤Q0~]!efb=M@<C1F(x/)+pl}7 3Ce72{k { Z{M M7b,g3TAD^M*;? moJVl?O<.a)G@( &;*OpٗBx])HVIWg h0 ;PXetN!a3lUk߯6/ uE||p!7p9KlIX*Fr5#~ N.4nD#TL?ǺOpaٿf]&^¢z8xYZ&R=KA 0+-b7(Qn<}ť n XD_ }I(Ӌ)Eh_sAШd]X ;7+hޜ͌C{#^܆N1"B폹'hX2esJg@أ50XJ|:J\#Nf%Y(7 tkqO댉&k(VnrwVUh4L4RPD(b'j>Vg}>X8*Nu`ᲂjt$}&efٽ| [Ǻ 3=; 0ȼ{ QMG YWT<\{o3Y;iQ6:g@|"E\2Y# bQt=|9Ufe_BMoiIz'n-.dN2OӔ4Zl0"/UEAe}Ce(ISU}I6㌼Adhqv|߈\D{cU6cݩa̯e=Lp8\ks@L()jiK$s߻ |t[A38v7  /g I(^5^1sxm"N]4Ⱥ|/Jxv'@wl_b/G7S E2ؽb, Rл:/wIc{ٍvTLI[_uѻU*.2P?1CTSb '|*&gҖ7I{ӊh Sd(LĐ!ԥYn gr7T:gধͷ#?FԝV D_!6(C ԑKu]^KzvwnlroTa M^};:ᒸ#c$jey';j|RFds"WUt1`xDYY{6R,2$^g "Fۮ @o1*T\nȲg! $zHG[81IsK/(Ҳ8<;P?#BҗuS*6b=0iCwR.$4 ccn f5v[br&u b% ޶/¸ē+i2˰4bB' >? :c8]j 5>5QGES*YE׏;% bPSoaܼfΊ<%3Q0ʦdkhVd}>ri7ltĪmxnf];M~O#Tmk%*xwΝD5 ~zȕ5Ztj gjKCo C#8}_ұ/XP? "a'oNMrPgNOrRfWXh]JZYSTӸO"gGn^7Уe}3t2fJX>$zo rjN@@*m7>Jٛ p c 9,u~=mNgn\dٖx2[7a9! V^s{(yz +y'-3)uT9`7wޟ\!m  ?i9;ed /yL)Qyq!ξovpuכ`<|3HYT(M}Rgjd *C% 4g|he"/ 00,Vhu cgބCxf#\_n=; HꪬaJh= 79 r8ā{/70PJ[~6~6tTbq-s;tz&H{3ѭBtGk9|6"|G>F@"T,=,:?Mr\ڈddşu7%g}l5/3{0q=A` Jr!p}"$mwQcW&⢶jS(()~yB84F;ÒT}iHo]:SۘdY*IZ!y2ϭGx8dC_X*pj$n(]EuBגf}/%LXnVz+: Xx4}cսo5EKQQ⼤"ccж/}e#vE\ EcRk+|mPPaI-;h ̝ՙ)2tVt^i$@aD9QJ:ZB/8O8;<E?,۝, 7lDmgfv.{zc>𾐅`Lʷ)l}0ŃĆj,w.=KB (h :&%&ڍTv nVmbѰ8g}~S{72Oc-=ZxPǩ- OUlY[,l0 6m+ ~)Jyk utdCXRFwɿ-v/*SzufA@||>8>*-[3i~Њt;bxsmM ɥX)fkOku7XiqL[p̓T=_4 (犞HssNַ\&rؠ\W'٨o/*V %w-驊 eů~'wm~NͥM6RX|Pa-K ) 2VKLǦ5* Ha*$cH 6na݁8^iTȀMuRyo$[1YGKB3Wjy]2$\3[E"=Y6) H1 M6N@T lGc<Ȫ(s55\3&2 OO(XBeYEHx͸^2fp_캹gԎc ]ZS2Fd(lYDD[>7rt O)z|EWt\+XTϏKL[q% gF'fE :5*W,"*]V@J˷vr;SJ~DUΕyVwٰfRhJnr'Sde+ ]aZ4A v`&aG+Ls7²"Zg\}KÇM_Q{= Esd(J=b/uoWh EdHxBfNu̦c^MUy1?іWg*UW_S3?Ol)8]D7a3J[ O\C?O;*/ߎec1\#}cK wIP[&~j CɺO'Gu:3DS7Jη_y]N;qMF'D;pYl$m >"G ℠XB8S ]M;{Osߜ=*N֓5+1Z.'\%H:)]RPr}tqDYv28/ )pg/]E=ώΡьlá"P;ݷpT;?TJ՟4*[ע&'lD˫ʚpX$שR[024FZT@О>@p}"isoħhf.e[ڠHTN^ƻ 3ƣ$äVz$O97MzS:~#Vjҏ&ɡF 3hEU1&3Ͽ0jR[kTs"fU޿ >$<ٻUh`2pLQd|'`*> vTQz.>s4f3s*`[tv8p# 3o,U<<"ԙ⬠U!HeοդC2-" vêmf6)zFNlIbiC{ۭ]/hYfaZ݆p)|V{ep+a;9@$˅_% _nѮr 7*9N;^@0. fYLFBY<"1YO|*+")C,olcpcp.RNST*)\hcPΆמ$cLmDh=Juk7'B  Cz*h ϗ'PY̞e_JB) Fp$r ^7Zɓi-  1L*2$rt`MpT `<`%Ԑpm8mOd'm!~7PX{*7M8-òU'[,9j4p̜7Zh5l8kJGхOf՝hlnyh}F<'}WT 6>1\usuA EB*֣MOД%Mu B(\؝_:Kd/j%SaMIGBj+zcOhi C5t'UPJ/劶O>aWgVi`V"ubp퓪0\~BӔ;Lrgܓ87V >;(BUTeu*ߣJѡ01hT;a0Q=1ߚIɹ}%v'8䡺'R#6_ju=5ʎ vS\x Il :o*wJi8J7Upt.G+-sOT̚Y@ %zD)r]ޑ:3:^FuE ~eR1+ % ]I& 5"?= C߭ DzH/)^蚕T&>Y_dB˜|Z(Re23i_pk}Rڤ;2N$QY{jIT+ۊ^͏1CjB{+ u``ZWҲNz9,L"MCkCI>{Js #/q! $,4'*c yJdlRC>nM8\q]|M]ؖ: Z$TD684xyD(qY?PAO>%CƦX?B5I) -a3cH Ϛ:#lSңmW^\.ZFd^E蹑*W}r>O+m搕t<9V$LɦfcܾEN>nz&o)p8z6߸5@՗x/tgNҿ}9/ ΂ّ頗l[p/fqX}%(3+rZ뗜C I [=ܩ1ci˺x\}mk:IԛՋ%w@Mω̌(uJՎOH^vo*0kNudf"  YV_)s.)aTZ+.^Wڦx7ZFz:{ꀪeQ| R ݛ餳)f=0 =QDPcIx&2OW*[qo|밢@dO@ [`fq@i0Mo%Z_[I;7W)ʋ-I岓ț?AS\Rw=nȞm3mؾ,$84u'?HSlhz2ͽZ=+ Oލ@ߙSEzu]3 \bؿKy J㡺k^X[= =n$":} @W6@58;5u%5dW0fx߸e c~# pJe<Z`^$ @VEx1diͿͬ_<oLlR˴% P8!:*  =}48P l%blT>HD EGXGu: nn_uߞY[9x+و0c8qM`G;,H8IDia$swӻ$Ggb;Xc&m=kAJdLG`HiBsk +RO1ȅbd͌bA_qrծkY^ S3_AaB?DݢUQVOBewּJкSbQ1J:(轷aǭ}mtJP-KЄQ:U}'* 9\m_Nkf|]ނB2&Rl'spGw5S*ښ:Th+7N y$'},qq}JF'2+88ZtcԾcnB!4JŽ|n? 2|I93fT]_lL6}NQE[]i$&|b`cg`wUQD.l-#՜>τ\&c4 t,N,-il=ھُܸfw{ȣMQ%;!*~fYb 4:AKΪ.>-@TZ.LݛW(P0E>6qi&oCR[*d(ne-oc''1"=Q 2F=lόa#,$C3'Όw"`TO,jPY|)_e붾e mx_6p|W(*j M6Fg1jZW/eRLu8h|ccZ"롾F[$M-6I\uyj $ȐVdp_ݕ oXuxĤJEX/Ɨ`YK# ¬:n[H@:kHRP';%$^}~엥Tg_WNs> |?Fj<s|r-2>k$DF_dЍ^aP.3]=љ܏p}o^,WJƻ]RKs!Boݰ e ᲖGkIV,nV7] )/z$R7(vQ%JVE>'u*x +H5D,wV9aJ K@ҍ0cEJoF"TIPh]dw ,Nvc֋@L!} ׆ cP}t{^X_`)GiL~ ~d'fuҺ&<-Wz1y`%Ն? RapFf@5\y`TtùRnoc"H^/[+(#A)4 ̢wEl/l@A?Z 0P}$CFLnk&-$ӍuU6 3_ b&[G޹$5Yg^XPS6>q#itxPQ篎D:&F?WȻ}<%Z7][RpzTZWܲBəOsPh)gN^,Wzp;3{n2CYAj'Sx$ -5{`DOA'$I~'(0`S&@[RTI- 7,Aa?00Q01f|5vʩ+{trKQ.@Uт3ew`¤ ʡkY&^'-X1FlQoh7c㰇g m*̻9(̷l45֕߻=~nRkc9 H8O=/ϕ62Kߴ1qe #6n%ˏXPEڽ(8kNj NWg3jhX1`a΃LDw W)-fEC('[ 8 7iiWe&D(3]w n|;pT4Qp02$9tgSZl&s˧|7+z) yJfmx@]LC/eX̵qEmUǀ@i]`5/4Y 4dty{ݳ W YƠɫ[((KJ055_wypsp=K\EN ;s" pA]s;yfF6S]|睎d~ L?<14'/ 6Z~$ :ҕϒ)]sXAj24>K& U(3p랏>} xT5diigPT.C7k& >Ӷ^Qis'$`81bܻ2کwy;?Zt Z',20u _%8T$/A'#MKW{Q\n;4d1I8Sk$P51x08w@zww\_w b/o+>!%#gI+.hdPSV."YX SRFb3ke֖['B/Zy8)RA:-h)bo э&r% uϠ !Ns͢`Bk)7Դ+|hVB'fGEw+lR?DG6mo[T9Thi,Γ*q!`TmF3 Ƨ"^ر{>3 y#OT')z CfV#YauSCa+,P@?igqB1#=IL''C˞GYl-|i޼@^D`#1bho=J.뽃4^ԾgEAs TInlP c-[ԕ%R<"yw!ؑ†Zey`3YcgUt©eHxC( $c孁f*{Qk=~P=wlz;/Vc@`.Je'z;wDv63 R-. C=uV>rS bq7 ^L3Fd[2ѺrsGnp% ޶Td%Scjɰs7$~T^Z!ބ^)ۖ.9| qiޅVfQ Cr1Z \#JT. vIg)X p:i0V8z(L/`>Ak, Uc$.D[Iז\6 hK2xL47|ڏ3EЩ'㟤1$i(<]IQ% p[r[鉩`5&Ѳ0S yŝMeSؙNjH 2_V4[)*4ޡ.)4͚@xVeYۯlr ^`6Rўe8w{|Xki[p4!Ee*p#Nm)E{sFEH W3Bj6m;R.[ ؊ DUF//-Nif-TChY=骫sjIM8g-,ѥՌEn Few Z$Uc}* >ݛ| T!2-y˃/ .Sw0.s&+KD{ɩ+*O}pϰՑ`>G0ܠAΒ@ojaƷ4=k⌈'c]G1s/Gi+obPXkp{n1!5R?k OxWpG؇iEH:f6NOdx; ﺢ5m>Br_ƷQ$ N";T\"GjǑ$sZ]''dZ5کG5KL_#T}/|'pmw(cYA^wWx6NtL@#Ɨo,q1G7DY\|Ýӳ`o@0fg=b#W+/z%#cgY%R*&g axi? U ^Nn5ofڱ1#^%'9Uv/d$<YYf74 nͺoCƫ!|Hw z_3_r/@ )_Qz>*[^fp('cs qKOwtŕ~#X.}"YJ !eCn,.ިĞ';h"Lz*c.ѳ <0 [y"4{ϻD '] m^T`ýt_\{Ex&g\+ns.0 wlUfe?ce6m峛do4ƙ2$IX\Yә1Z[?ˤY,.mŃZ _z_*HL@>(ˣ ȓF̨d} \ HV8_b;>9(ГZB5F@1v΄),B$09/iE`0\eht8B{+0h?"[9D DNFR A50WAELї ZkdNkT)3q| ,CqOМ/Ki)W)HӞ%ŋ%9nC cXU1l? G4p` 4'RUF8kLYLi}ځ_Je kc}FшŸm."]AUX űVߗբ%Z}{28 (qE"@J 괟t(ڐ>1'&QvWJ={X;>F,R#7tDTr.ݵd r#H=mjS k㝥8n,%0w/ KB(S=:ߪ¹״9ZUZxO *5ءrˢskb700~NZzxOf}_1' yݡYo֪d3LEX ADcgݝWL=FukTf@(o?j -G&݌+-DJ7gAШO^G۞V5!0%aMɃ j묍z"0_vd0ݝ%n)jZЦt潲s հ8s.QyL:w~|8~CR0c}m>P?:r쳫̶֘H_)Ə:*J>Ji=JT77~x5 V/W]'\B1N~DhWj):$_8h_`q掸Ewp@{ţ2@LsLRаKbI$Ýţ&ƫ/8 UD "ɩ ͘Nb*Nٷ~ 򱬬kC$9 WqVT>oq~QzR;ן)|2iOHxuׁʎt($uI>r=_C \Jh3ޝ]jL ^X5 Pe9Liy+r~>rH]h.\&6hoy E"ڑn`p5AXzAA_&Ta%<<|" f2ߺT.e!<9.~dMS*mj0BK^6{n,qlʠm(nӻ#z= C~jʑV/ۂL FiU -8E`7"wl>t8Pڅ]d>(܋[p9wn6'򆼥}TU#ƹ8˦L!qzJQ3@ҶЀ'n/e`! {#C؁짊@%y%x*ӆ"3]PpT,9\)Z#D?K?wKgJ Tj h6(v?3Q|"aqVQ6_K IxA"]g0s|廬."4}fR=~Gg)d}Aߖ>jӻ`Oiv{+\XzSxe*%~fĥ%=]ُ3-k/sng~`b X.Ū_-L2qJ9oqp`.a9A&P-xN_s3^ =IƒE !;Lc'J" ! Er׏^v BYq<+I)"3٢`.Z(mTq4nړյi%[Uۗq-\jzO avT8K :>6ʡΆ䟬yYr )_0"F 9cb_9?0WGt|G~D΂DXt&~xD#PMLta<seJ~~nٖa? ruc?2 2 ](>х7 =TWb7zԙzKH-T"\0] E)S *#䁧V?p)Ƭz9TaĶR䊸c 9h4°|W5"'V*AGa49Q[jƫhѮcDwl~~M@93gqJb.$l@MAnkv vSց /zy0`iwy 0}`0Cqͭ[XGطݼ>^[j Vf[D% 䜭L 0y MfbK) 7~W+س ~Ư.$߄rQ=ĹUEfÐQF eHh8tNtO}K;}ƑX#=H |WһS?sVA.= B5ƾ WR5AY`]5B%Zm^,C KQS_7TdՒʞ5'KmC) XS)Id~[Ed:"OvHd/s`CZbD-^:!Hk;-K{'ˮu0ZIE,]}􅚫97@V}-RϬT5i:bF80&M-!?Pt=tY+X1#T !5q|UMɪ+lls1]@(!YB:if"^VIbN[ +;Z1Z+>VfWtET7՗˗~!yp͖"|I|uV=Pjw]M4ofe0Q 8:T:w2*?g.LPsqi}Jbw_#\_Qd7nО*Q(\3J>/2t K3߲HT2U_dAz.$y]>¡{;ZH#55/ zmSǙPq:0)uXśY\r_|ܾ+e 'ųUc&9sglUVM%rS}~mLD7 ɛ)?~(wQex_LaEL &Q">QxLɴءI],C>1%9۱z]t*o0Hma} |S7n!-p8༼ͣ.caȯx3k:^_.W.41'Czƻ4fk#Z_\vf(+e*f)Rc9TG..('R،5&2# ]DJ)-;B~ ۱Evx` kNRmhG Y*XS]6Zz<V7+p QAG)iGZTBO9'8"j$==n.PcV;|+- '=;}{|#і N0GTkCi ?D+r8I/}rOT]bKj;) \q*e+PI .ˆgQX~NsUz9g49Mc@i\%%s=`i-g 1lu-%?[Ȍztrq^fa Fr4 kte:rr˱/&fɇ|ܩݛ񭚙Z=f "H+jk#E@9Vu#4 RԱQ& K8ŵu+qXƫh20R([`tuݍ`p/cs`fV+յv`LC Xc~ЌB.Plɛh^xtHrQg|S~&}&5Y{3$fx^Mif3iUt}VQ\py\/so:TV7ps-A˞KKNFfIzFS89< 逩yH [lC9d=#ɤTӱ{CYefB,F-zUI;&]=`v `졽k%$y: 0IJoi.zDoAk됧bsKZ;0M8d B:h4ό'3eի!DFOH^R`KE:u^:É~rsJ#S;w4hʏE=&tEsۄ6fzʸ/6:[غĝ;Cy> Jx8Aw3GN`%\i2Exz*h9KV4b! B'3'f#<FiHdLVyP,SԤ*nM* LG; DŽ Vxun qD*z Yyd& u)م&ҪS'[濜m^89 k:ϦSJAQs.xR y>! Bgcʛ\3Qov>4ۻxDX?ֶZW|a%2-TaD qGFDȰp Ng᳢ (q.e[ڑZA_8YZװ(z゠FS$ÿʽ Ua~r}:EY#1^)[ġW@M.i*7{e)4.;k ZfRJB(؋ւz$z$xid{F(Cʓ0[ 4HZj YP :CT#rÑkRs | #J>SJ xOyhq%WԚ]Ë.NeȌTx+I1. aeD&q3 WwrPƴ&M& Cǭhz63}Yf+zBluJqCvg͔? [ppc=ea&(m`9ȆQm4",-c9thsAQ LANt>`Ī]a9"$M^n PؠP z]2^ae'(R ZsJl G\гQ|uySJ}S+0{qsOPN.(eF5U5VkF X^*mM AB-Rozf+F 1tY58A,pm 8zcXĉb픐Q4\`矼B -9qD{hCu`Ǣxc;3C;%11 cM0A;34ov᳽.`^ 6]sJG9kXb3/u9)ɢuȱo|xi) ) fqٶ}c9<\RD 6mf^118d(gqpJU,{m#bdIla/7]mGY/ V+ۦe$2w$t  5< 0z{YCw ZjߊP> T|=[eݶzmE@\=ԣacX}y/2t* .d8efFHN[U{]Sɧ9N{ j8F4Ewv8 EF4 %"E hv_dطЖ>.c?#U=U-X~҅ﱬI$ WLW QW7Wul4>-R؄<7V^ v 8?^mP[TE¼(۬s%D.҉af:u)ѝq)BRZ4'9m/}Jim\{,-K%[z)\4Ǝ=NKts֊i4\N7p{~b 3׀ޝ@H'"/`9md3yk-zqLodÈEГhFDgv c5i7D)Oy7ϤJ$g y>rq8g4' #)b&MA\A aY:f(vry8b(nˇ(U?i9mE%"`|L")$58ϲp <4oPէ4D( gw2%ݍǻNyh E cG]v|Fs9ݹ݀!Z΍*T,&rN% *${gW\y"C" ."~\,iVfgŜZ XaHf8-"&NShF.;eO1Co&DbRZ3ٯ(^xE{+-c --Uu2Pd'Y R (;=7B#:KCj2)_",NzF(yхB&.rT ]_L c9W&nu=Q[cȡQi0#k٣'GM`}ܩVr];|9^d :b4tΜr9H畨-bz6xKu@ne{sBQJX{իX8 ٿq}f*es˜j֡hSix6%aكC >JBwMwqSPM[Iۢ<56P6r?!=jK!O~'*sw&^Yz:/UZK*RsΟޠ]>*ԴoXIYfD^S^OY2>a mSޙZj"A~Nj U348 K,2ì湜SL-ri6TRQ:1L#^LԌb~=^JO ݓv+HÃ[t݂9/cJz$~_:+8_ sJ۬a2A-4gFG.mB*4$2HJ#0u1zk(ZHo&O7H1R7#& O3%,?S-}l?ς/XBS qJ { ܮ0ˊX:.Ah)&1Uk˘>M! -=Nr/  4’d!}FY=]@^VKf m^x@@8`yt'5n&vv,A+g9?\'q~?ߋ#7K9aJx7}v```[}ȟkE:U@lNG4Ct<lXW=yܾFl\c;2YFM#x:b).>h4FRmRgKRRHO8Tj0;U]-p'*xP<!Xl)1䦋cNaA.=! F_V"iye|vTGyXBD]mV[|YV^"Ӱr#(;XyMgQUMn&: eiWs itCRp4 <ՉDÄULe*e TedK# {2X<yG!QM%D @kYJgo5(k:'U^Wme׌(07"JIh; v {UX X]q%3oeLM OA7eLk _upBgK%Gi}j4Ho LOoVl$d{،b! qp}Țk'! 0 ČstMuܾ$ +maݑ*qV},]/^>g`8EzAq%s? l=Z>[2:hvQCX&)k2빦RǐVjp^0' /1YX Y2b5tX;Kvb)iqC!;fFlu^ɪs!Yr2g}ɻy.#Dh3 եۥ4~H $!h‰XDx䔱v9ćuDgRh^L2`ˉ QXI9;ߖEnӧ:g'֝V U~ 圩 MNZǽie,$ɁT~R )SS'WHC\laiW`#XU#~UKzhog;jDV&juKJEI^BL> ojl5hY7a9QzO47{OOyr` y6+ЮLe C vrSaCƨmEz\*ۂrXvW3>ypBtںz_66h`l 7su~V6^vgKar 4ZNG9\ 4װyo0K ne e /XAKGw%:5N:sFNr5| ߒXD$}Jt*tM(ʙtb nԼo\.A()AAV<;N98%jrq`ՄBs:xΪhmLA)o~D5UAy e+!m!au@q-849jXEdmbzTQ9%HJa|2K OEr tYNP&%1)=zۍ-pH0K ٪d^52pY_4k> 'a>Ut )G(ãUԛ A>2ϧK+:WYeSg6@=&-ؔa>j$S J$( *xu`{a;t?6’n "&3wd(Жδ[= Tep~'6 Q&Fqo*;Zt}(J`ؔP3Me{[r74o'sI-e]ttޢ.CT_? I'zwo($dt98]]tv'5u0H70 ?GM` 4ƅxH@ڃ}(3c\r9$(v̋`Vw:[ !BTM&8m/."5|m8Z\w#1KԴbb>[̣-?pR4CDASx9}^'SqeClkt?.#\H";e EӺʠ(Zox_~1L0qL;$3=m*T ߮lzӷȿBxopfW덄[3x<į|nGmT& Sz/NxH8cdrT @dft(vˊΫ#}$Tf={\X)ej+u _ iH 1)1\2fNc+]xx6!ƒۑfO ٧`0Yd.]/R[E)?PPW*" OT4y+o#9/jnpA-m{1 Ft[$WN[.bRw>1$Lo+L_=? iH-A IL/9ĂDK$%baf ҹ3ar}9d&8~>{ $+Y}D;S16 5o*Q^CD1:ocQK2P?1.m%dq/ Z֋FS7!q죗?TՑ~͙!R2]cF26s5u7Ӫa[>@}IqR=O9ʭDwsp|>³ Dۢ hyx}dIW*t$me9 2Qj6Bz ޕM[u(w{W;ikz{$=T$s};^6=<~/y^- ٠0M^1\ u +{He`9nF@i6$GUoyGx.|OpG@d7MAQWɧ2ͿC~{02wy:9:n |zE f.A⺖6BU tsF*8v'QkRFm Rqyf>SC?sΦШg7-ȿFF߼X ei*! h`Hև x7Y$F&‘KHԍY)7z6vY LrQo@7"_=5|wiG,+ :kEi` Td;F&Y`RCqla|2uZ f(9R`d>Qy6,I T!DtcniZoD={2G$P4#󦿢)ԧTG [6#5v9Bœ _m}nD[r:Lз$g+Ym3P,~O.޻$O GU/H̨.ܝI?d5YXmF>ۣ ŝ"Yl#=$kg/iK0sƺ㵏/KC@0$~D@ 5XF? %`|j5A: ,.p)ǂ1qOh!J\ŎרZJ K":n8hkaW*ATi]d8B648Q[-Kf8*]@<wE;+躑$X& |:kJrhDw]Bj{v/ o=kBjĸ+mĸw6+qg XAuNF^GwO}2P!sބ. n9TsFUI9/n(\n-* o\NtPvAJX;f;"˿(88g!{=TGȇZ6L&@Yښ)5Y2Lb%8٪( x~24 --EojWT>!F霃]"UV4ҿ{ac\=*0ȀVCgdѸr:tu]448 rWiwhQ$ѐKz-qPKa'g pޔygr>8V=7Iȍ%W!gINu' K"K$&6,J?#VleFN>Oa|މ$y| ;7niRLEf_.AP"2Vw fHtKXR兘e]xί0囏J:zؘB~9&4lci^[X7hCwir%A'G:wہWE oECQhY^eD>h`86-HM\L5Q+ntOn1zмWzAMZVTx"]ܾoY*aT 8E]PCCHڌGˀ9^qdpr`wkD ʢQ Ca3G"T*a-+] pxӸ>WmHMˬSgl2[s[,kN a2bQS~;N =p=P'D6-'*bgWP*st xuu<SMn2!N#2t4=T NR@lm&È753? 9(I BY0DqĶ6D-KJ ?] [ |?˭cpKF`ZCI^[ird"Y_L\;Wa1xUt'ZT :CCCUv翄u`0K2b֮'7x٫J˝cZj$9`Eo#I9+@>7~[e _-6|/Kt}aS7|yq~|$pν鳎$\7y KPDFqk}MWCσEsx}퇣~"Aӧ _Ue;‘2)gZZ$~!N_[B Ó{V:ґ' teZ)ĮcP!W~zHO_^+~b)fؖ%:6^C3e zl aaFc2fA ,gN6VX_}=3W,nsܬEV#H]r۬ce38qKff ՘0}S顺+JɭM/ɗ>\G8d Ei 'Kܲ|Au wu쎮G[둟/])o.@*E|xckj$1! ;7Q$y?^t%nߍ`MĄܰ 46XusN16|ֳ *ۆx*{8ɥRp]2 ֧xch{8EɳgLpodkV['j2/0ܕOA %j T㉭8:fvD5:&G=)f"}q=nw/ƴE+ebvLmDZM :] 1ړE2s0N'݋״T橸PBe0b4"uV" SW#թ<Jx̢W=p8|5 RBZO-- ܈ev\Z +(\+0? _ v9ʕ? ơ(շ):H΄[XȦ Ƴ-vC1:A$]+T0d,Gyx :]] @+1AlurWҪ _l !^]xlK,;sm5f43:w dvpYAY2oDvezK;a9yYF?ZɆ-tz}jlOWHPφx ,z;$vpĿ7y>;LyY;90N<-yIO4VW1 yڗNףQXy^QS.<LJGuBo7@o'Y߀B b)!3CR_DŽ XV<@ӬdI `;iSN$Y$l DFœ }{A[ͭ6cE*qAtO8ZZgazrarKSR"L ޿䝶38?:A9adP'rMu nj[~-j],Wi`hsdJqW+0~=?~zdݸhj{^.N}$_DATђ9J4S`JGT6FZ FEB9*,Gf򌮺bl 2MȲO<e[=cTC,9L'`{' J#H}}WliXӗ(ٟNa͒6/S]ox(xnӛmBHP[ޤ׈KYΨuٟ]$i*TǼ%.SBxԠ f]QR MKTV K4ZD'{?G ªN _@'Uя\vgWqV3S~O:-H2vnj\VE΋]4I0̗Fbn45H=yst`Oa+Oi|_<Ѕsnr)}-9⼀vmDǻ)Z耧@ZEji/%;g-tY.ΫLZ۝vmƀZct 0F▬4xԢ (̍wYSrf~r'0DES3FA>2svlMMs32>|@[MȍLj6tuPg\t%1XYRu;8=*%U-?f,l0_q)5q$yX!DFMjhJ0)\{ie m5su 1d(0b>ڲyqB ]g0ƾ"Q^NJѵs?3~8Jj,w E` ر x:WeGZZ|ɷWZX]! y\$`mC`l/k f.ebL W{Fٿ^٫]u)7ggW hcaPa2b&Bm. A Y_=IX:Y4}:qԌ/\u/%T!ߕfn!'Sitcb`ƙz2"WU ݷs~*.Ǐ;"/@equ<09z4ٚH00*IMzmxv#2D$xzv6!}_El0l41VgSf)+*I7 `s:ᨚEẉ f8 zKCO ]X-G0CM2GRi^=(v>P;3)7q/v{AZ+`c1w)8(dڣN5.TrrS2.^є]ߎvi>R­!v{"5fJh?7~/;?h" ?Wd2(< olje{).R"_;\LdžP ZffXтK?pp2b))nsv@Qg0:vks'f<:sMg".gBpb ˭}YyjF⮀(Qz> @el 4=n^49/ϫu1A?@\m87d(vo;`|7^*B+Z6}H|w}j^ӁPVe(g=t." HkT}1償k^8 _*͔YVV' 3}8T~&bszz۬/Y#g)MaWV =oݟkxcEV$ߝŕ1 s4k}dP8>G3]XՀ4$~aw1"k3{(Gy9Y%9 LjY0q&QYs?a0-"R*ҚՁ\ {d5m)weDF-($NZmE,xcyg6H_K36 aRG④\je)s~D9gG^);oM<-E('p l ^ﺂ g#zZݖ]JHhKeͰu?M``KSA2X8͜|qKaxww o劵<47}vDL=|J&;,'7$8B8!ъҹPU_$72GyʡkƔ'Lܑ/K"ezXVa4 v@!~ϸ?D;[^xA`t;֣ 6 jg(P鈞jeΟr^`d%GtJggM+x;̪6 \.NKO@4NiM:L:\TWh}5_b|sHm+њԌXĬ&vGA6ط 'Q嗞`[']}ƕ%^ab?rɏ[ACTcֽ{a[6XQPEfy}_ iO^)]b&?Gfv.\ &2H1rTL@LFT8%oE_bwKY6=%MX#G.!MLmdvXtzh#eiwo$bIx+>JydT N}ɥeN=:jԲUhk+Iu{[j.VQAwUصj}O+΂^nmAR&2` ?\9vq7Iwiƅmr]I(LL;7.sS+u̼wWJܞP7R&W˜c$8) K}4=tWY ?Rfl$jID;,\=$41[=",p/د_X f9oQa ڟV6R3lWe* E( bLѯr@ٮ3+-5ySfZvs#,[G Pټ7 2S]Y7:URC/ְ@JL1"Yյ=L)z, q&h9cA:t;GPpOlў H3:^PM J@5Jp sep%y0vکbCLJ&fߏe8da􋶏:B=%JFa.E>Rq %~$3~MG1t[Ut{6MxHjQGyc:Y`>_⾣MOvBPQt%нxJn8S?{ȫLS)#~Zcم-ZS"=t%S⯱9sVLp\3[w3%o^?O^R}by>/aP#XJI.^oLkTd TRP -s#DC4zg8{; 'b`U}ب;ySu'3HhpbբӗU⸝7StWWlĺ?4\r,nWD˜ Q̌/Dwg* )O]ֱZ[ +d=Ҩ$[BV.WRg<+:*HAxPnJW(}A7]־.UPq)ܹ:.]p'bI0{(Pezc9HxҒ\v)b}14v:+]{U\V'2>ϭKzYW+5i`%4#&=5l`=ܝׂw:>@JqE驱f#MrH;'P j4$Zֶ d}䚣_q$%.P$j^ (zрi%c}IXt^,֧*Xf.lߴ:F!= DXfl^t`8>v`J?"S}^a)âO`gEY}QHG5&NbؘՌ. pO|(##Nb/I1)ᖅBnZF^ٹ ձm\O„P )"YCK=5;<@$4iueᢗU?~ݩp8F `kjflyr77v:7tuxf ~G5p:S9f9 1`>NۅƆlǫ)Naqβ"oL]Lo3+G4 8HNIxgLL]дJє4sUf.קه_ +2蘏#C҄Jc:#~:cMaPԳ!m-|-O\0 >AVgUQO0o{ϿABT}x|sż"CbD#h$;.\uy-3_0W Ǒr|RWۙu s6%74Vkο8pPW``@ 8, |SQ@6Ob+uXҘZ+Õ>sMqB<|xբ0җIEŊxR^-!M(8o3TS-]ԪsbDNYe*W~kԩLuE)0:D({4IGȅἶnD>/" ~'YY]SWA-i`9,`[Cs'TNK%:X>GQ&dbTwtCZӪcpա%sjG2h-ޝst.~9| Ӣ 0a6 d/.GtkM~S!$6ZC+cY.MʝlӖ`o[Ok`G{V?oפقE%eTY75Ch LNCK9b}$cۖo;77vkH/x>]MLm;s~.(&|T F[ m+1E0Q92Q8vmL۠ czC"1g1X,TXGn6C/*bz]BqB; %nu7ݞ'>\ⁱw7AUmptyjVcF64˗^/= 鼴C8ɋK_|8ڴZhӪ@Gq6zϪlxCQ?Z%$2q<.;sr K?qeaB8&VrLdz6m֖ nCڜ}9LKk/EԄu_ќ3s1~D4VSH.皯D Z4J{YW6*b_?Z2VUo{PH;p9<+"5KB~w=7S)GaŰ aڦfλ q#}}ڄ缹BD E}uȝ@![r5eh.Ւ(l ݕՓoVyYy*i;k⚷lεV.px&LʠDٛfeȪ@؂39J]&-C_jK('S1`ńy:t(nfl2 + BMSfB+j' p!u1D;41_g q ױNLw|?:Y噋q2LSэO W$oOS&<>@[Uaj4ָW$"#T5J2|2k+5:GI]qn{yis-qoY1]z꽨?`;[In!dOM,ZgjԼG d㈞j2|55aZw,ʛ5"FG޽L6cXYnE1~6[,Req\D*( '~\>>zHщcB]ܼYc1 !#tY6毱XU}@.%&g O$r-ƏqH|8j{go h^IY!D_|ևW32AQ߬c붩H^nL4aq# d AaT1uJjKpŴFϾzjS吲&ө{`ÙQ@FJϗLl)#.^ ŤO#=p_?⇶lNuN\@9xI}`jp\No:jٕkŢ΅:LG\.uOmE~L~.j~f!hȪdvnܝ'k 59{| ~,^Ԃ+|*ey]Wp/O  2 u Xz!BF3pc>˔b:w4z2LAl} vPH~K`1]Ү%s4ogG:M7jmƆ1IѽʦZw*/+3K7r"/N14 J7QxG&āš`wxhDiLP`J;*HI˹*Zh)CR)2 y319d~"t ? rɝH D^ȞgUQx)-%46ِOZa -9_l[qTJ<π} _e"Z_q`V!a>ߛ|s:6,xr\ܤxn.$+x5s̃19귌|țױWYO-6U=7X-4nʝP+_דòC:9mT_-ܝdV3nQGM9 : zM <~)nSSLG3ο.  ;kWм3J VRNNuZGՖu^4 kd WY: ?Ӯit^5չpmph7*2ts_7H e9#O^6-^PWdCd\֣c4͂mtnKa=\*M H$l&uibĐp';HޭpyoՒ}XuO'@fрDUs |CtT~ LnybKEFCiPAHö@8]@L=̥XP@*է1սjۼX~xgun4bW~"^v*M2aTݟ > eϪ ڮ%c$6,sReO>SpV-|)bMH`N,ۖݮo_!^uQϑGq>{hS('e+qAȩ54/]oUҧ {NR>/Mܹr+V*$75DYlR?G ,* -xT%M!O7yqW7aMUaŕH['}n%ʮByeCI$.:ݡp >A IښrdUBOv\(ۈt:F*η/uc4Y2EjZy5)8SFC"3e&nD 4 ZϦEq#[cAcSf;PTE,f;ùe3Hb\,|m(~0\]gtҵMB^-H1娸z6Fu+Bwf[ .UMtZ;/ %;FGS*:w%>2Wgzyycp_]>2`JR/;J}&8 Wk:kkx<*[6q [kvV(5hj<\Qb285ށ# ?9XKSX-0((a9~\DLkoTldhr-=|$$z'͈aCMP'~T'x͹)H#1^͔M1}l/&YyMsnI!PjwA.-Nj;P?+sI}blyeZj`]\{!G=`~)w&`1֫HsI$IGM>g';@=3P:9r,"64!Oax9[<_6"i9Vkԇ¥bG'nȏ[gJbjM DS|\`?LR Sw/VƑ?6XdR>)0*vk} ^n\knljgMb\m#7N.ei8;(Vn*pX1M p8/ ^R171әJ [rl;,Gn~?=Kx*LbC]muvZ`NrRW}Dƀ%@2Lz<%H͓r6?dZFF3 U62"v܌]ę=͑Ʒ]XE *W6Gq#D%:~MQv3dyNRECp*9Kwd+q{CQMgK]gV>U 8Gj6QnO /᫰ !Ÿf({8Z۞ao蛰v"{PWro}x E >Rf '8Ѷ*AιaBJ1vh^a|;}?c/4nM9*fl *dH0գ"׬j,u+) cZwCx,u8m`lE XѹQYrvƤt*7^" GjMKȮgH@0a$פ^}S%mdYP?` ȗe+@;cc2M44UAO4k#x:>#f3UJtR/.*'y\xʵ來4& 4J^<+v75kY]ЇrΨⅼԈ ҵA ,P&I5hⳄb/N'䴛#*#VpRvrl/qB/ ٪H:h v[d P3524zkOiDu5e9(E>R~СsL/<۠KL~M!4iγ1W1_2FӗqO 6s#UL>\bqŦ՝Z˓޾ίTRq%,]Ix7EQFJVkefs&3TȝtLe2Zg/~SXp-v( KdSE׵P[~wzi^4ћ*7: ./-ְ _|_rAקN _`Z\OB Wd1S]DK9P9`vqr?JW԰kRwrS 氎GzN Q'Vp i芵אم~5;\.FD,ElWoL{Xf>lA/@GXRjr$0G, pQ4BVL3췚2 &4(u~Tꍻts.FR$)aCvikUG;C'_&DZT8?݌(g(o&$"~$%;vD Ø(\Cs]Ui]'4סgkI\$lD따 T޽ehyG$l-zǑaS~k/D DVW~i<#U-{˿2"o>~RVQ:?{3fy]͂NXs:e-/9$Ѳf]\k%9P*idw]<אb@qc~-A=]0UN> $*j=ˍ^]zjz?s|L*Ff!OWO1)1re@Ƚ6z.랝VŌA;JH}}B7i{Y=,7xD饕*[޵f)C&k=uxUr?)㷋kɆt_&c5?d'H[W !lytm+oks#@G@*]4׈\04c b_zӆZBKQmuHJOv5+t|d(|K?M ˱Η홝Ո`_~ P_b0Yט%gEHS2EqBRu*$kFbK1*Q-ES]F罞MzRuN 4G%Ҫd^~Őoe 0|CjgŧFb.+`' zqNQޓ~c }|CYUw0*2 cӷ bj059;dh!ܖ'$,cs4:FҬݐgq}pԩ&WV]*Vi-ʄ͝Té9{Xz<Wi+ h{R/%~<$}[u~$8O7k ?vz:{>礽!|L/`?_Oz"i$=r3Y}ř0^>rnТ$%9{9p|;w')6W {=œmϞi䭯D|%~/[ti {t^XY:[PT$M lp&S-!Z/I"O݂֝ѸհV2= (fNеsfR#)*u9#5~'gQĵ_d}~N$bB=w5Y9[ :FBuxLOʋtEAZYmX πٖmr0]ow2˫D+qg[qm6)-kE)Rg!|.ijZ5 x4^FR?60*$5jK F%Dpa d}k{_"baԯnL|TuP:uKVII#Δn_h|aƮ0GKWNh~-Z.,E54,g&4} 0{.SR:i_BцvƋ3-X+>/6W=ۢJVUSAZեWJ~63tʬrmFta>/oy mW_%^H/C^% tB7W:(66RG&o?])88^]ϬlpAUY|:wJ!(]iⷣHa0VȾB\<,D݁lzG)D^F{Zani FCQ/G{V'H"e7*XIG^${]˷QZ4;X!wg94pb$ŞBm$AfeZٸ8-h†"}Z6m٢.'Ueu.$ 5Y~$~)}ǣtD07ixR8pKb IX?;BMn@2`S@aNX}kViYkk)O|e? w+$"a#cIش|mdWdaE[&xDtFAf~qbN4 XVuI+8Ą gNJ!l~F"~I5t[_ç`d]$Y!Oy|ѹ\rxoZRa(%bÐ@N>x(8mTD"Zϯ|O),6ږ*/`͇Š\ 2&#Qb_d*3,Ϯ$|I087vhxdjzDj^=}7gqkm-F}L2~v-]uQ-z-3/ռ`3a~&}[%5@2Iס~ ;)gjP[;QTr:WncR|#il)s۹z F1~t^CQHM_N|iT/#;5qA>ĂnpglR5rCnִŃ u'hЅfT1XF,mm9/ 2|l;Z` ࿭BRظd5YUmU^o/K'+,x]:m>8~ t` `* ?"3f:Tޥ2ٱ[)"l{V00X"T0K N1LA=hNNl} IFZ)3&/<1kzSa~ZO6KHފE+` /!3F05.2^>22&9@ PNʚHߝx ;f*)γ,,\vs9P&й8c>;FCK7}pvDv?/N)D'2<b5 wrA뷐|3zBs eΎ(܍pjdMa`hw3XQ(ʳ5dEu x&aP6IVpY[Bīc2%`.4ܘg1҂ *gx }8@qdO"]u\2KxJN `}((By:d8HBYe 8?r9g /=xs=%E@@Lk[p.cvь4]8A~7ʩlAFJ C^{ JO3vxފt9{gH?zܿ$`=@Ir^D%tn1#:A< }g$Vclz/"sZ%)S[@%=J* Pf3c .H!E}wuR"O1rA مCWUX0 AMЃBRhϲV2D]jJ-|<`͐c=lnu/Qt. :v6V{1CS?a`!N֬DO8Χ ~}OqeF0 C9NX$ X Q~271$U= KB8}70KT VCRzU Cf󼄑oaF3ܗjUnl}n7LG;藤nV woL˂ruO YK7J\w"zV \8`JYݧd9J+c/WiԔ)2˅Ąs 5L%m\E6䮮=߬Po=͋z.WoYj#|hϡ3>K)&a*~@;ڷ)XoߔXD!<d؃^mB:9ilXGߚ(e=;s2ڇ:ZUdFl'=d!uGO Vϲ쉅Rc~/$Ye5ܚl%'`VjAE8sd kDDU)0#6_,t#,9gZFGs: K8{Qqȳߧ"1\#youHʓ+q4 :qeȘ7bT^h^ʬS` Hf^[MlQfY!k^$ k3Gy4,Vgᄥ,有JZsSRu2a/nyu~༈W²D1 6@渁 diNP7Ȓ8Axӈ ՜ڀhf%%aFlJX±Vs^֢Bj", fC2l2i_Yw;aH,9=".8)Dva#][[wʡ]yohGI>зضS|yq!G*w8秊h[f0<,D@^OIoc6Ztk21C~;Ant,|Qsrl fN;/SG2} :BBnA""G@ȑ9S6x`.IrvFI#EܓL"ZwƙsZX=Q}3k2eHe4AlpVNXP_/"`@L'Ӯ ɝ #t{Г$DǕH> wc9aODYzjQ*) r*UX#>@ұ8TgP<ث6,NW0/ u~akϐ8BkNz}irNy(d-c CSܗމPdzp3k2 T,)vx̉*ᯧφY`0jى")cڲ爹bGڕSuMB[O-Os,} ^J@79dN}zzC7ÕYM.k4ٕ>ti)}|s=N;xV+Pc@DfSϩg-&γP~[Y^hux SRRaibo"kLe0'XsxiM=Y||Ed=9_ri# d~qSB39^'s0 ]U@Z=EsM׿H5H%rzޮ统 yviB.nMI[H-ogPVvS|ʈ|efh3|)fylT-J],wԢIJCAԕq# _U+@mձDZ)emiMR; }ǟgwD9ו@l2b)sgda$J^ޞ^×zR$H:W7%Verf@aɨ @3}:Lˀپ!7̩cB-0%RAr*#=P2_pu(j!G1Gyy@S/Ʀ _cd:ZΐYwIfs!}YUt:@_*.>~ZoDSvBaO5'4m=;9} d657h\kI.7}"(rL'ܖ"s_3tNA{H<AVMwH2bMekHxo(U>U |; ^`ZY@Ї~"]V)eC:ޠ*FH cc~|qc }f~7giO/M8I э)IxT.(Q:r~[ l`XK>8/{)0f,KQPOJ?1W<% m/V;7WL;!0",}|7"1t$jzGIcow`/iblUe ];1uC‡ERD JyƗهe-D1z˹qYX]NIUq. F) p'(n;lWͧyqm(s;@PN i)Ag,@fu:3p,3a$VɉldeMͳܤ7E6;G:fյ7nRn%_O{rTQ_Ĩ&sJ<+7/a(¤ z@U+HӖh:F1sp~uBb$sa̋/DB #'`NYTv5DdSXjБt8~TBe~NYheIIֿ$k jU擭?X I )ZӭF (nڠ1b>hnn5~:zau t GWT辽S!zbp0T#D,)TDVwtZDÒ޶XUvKEтmuyGrԨn6(("C MMtIiS)b5P?X|.u{|17.*}ʹUcϙuw;E`Aڞã I/(LC>-ƝY(Cw7=nqYZndR0ݩQ'cSa=2O+0C|s>YkٿpW;xϡ(_W(uێ |]Kqv+g ^\x`Ir&9=SC.t^{3~ÑFtFܪQ-`Gb D2݋>C]zE03n95^<)<]unqr̘XA瘂VlN|b;ud/-|Z&DvfVO jQı>-ulhW)7;a:-#Խh-'F@ƒ<' sʖuz\7̃Oq$xXe<*ydWRQ_4C>UhtSpq"&ZQF7f`'H=Z%v ,QS&z'7w|tSXI o8=aDi,z^^|;_no,(e_+D\Y e*76oj1nE9͢3Mlws#3'<K=L!rLk#6b;njPJXd ?.mvO&>Ė3/ M+m?ý.1ȇ~5啑$!1w /z^ dڎ͏ys@7 Fl88YJYy;X%,dy'LXl2FۊMI_R]U_dJ(fIIJ:|&& xʇw{8b:7#̬a`ҝ fxf=Pz9b :\,TfR 8٨fnIU]F;_ii;Ν2Yp|*Lm_4^@:'FrH&pa77\cCo3Iߪf 楕Cݭ`ffbV@]GHK_$ˤ`}O&lm l죶^ 99G0jJ!?=S2|B`E>p:RÁ#Üc'gږ{0YcKkYV.gE.VmjM]օ H8EVD{Ip Y Sp: R N^$嫁 {KNW٣oVg&7ǂ`biD!ˣ4g-Q'h?!h$krXrKh8ZDfY,KIƳ)`:@P~G,fI?E59AH*Y, L0*D<6JFJ:#YuL{YI5Mleۯom( ,! P1߲3QdnIE# -]=o;lh=oH9`v8y)޻!CR\/m|x/qI黶0]Nz82Z.˄1vCN,:"{T0t? ƱZ/ezZ&Qل:[ݬ땢f)%r5"mn[S)>nhnLQI)q+_20O[fSd0N]N1q[m2Wj#w/^Qӽ*Ť~>i)OYpG} q40"]&s =0^;|.1s|ղ>Ϭ'#E?R0S"JNC6T%~eo5D+xԴ\?#R)ӄKd};2XUuhdx*@gWZЁas]8|vPz !UC!RPd3h jLy(tVHu V3 œ\'ty N6jg/vS7WL52,x fݶܷSCnhԈlHT7oAJX_Wa'dcZ.gd[`%[(niU c\ݔqLd&KS@Ap!ojq"߬)vlx$:-4i5d̜MnH%;ӷk`\ h ):wO/Anԅ l#;rT̷Kck6& r*# ?Nktg>OpKq "1ECSKxx})ra4P'EA{/*^ y(iyʟGC/&Uwz+ކ8V|j̬Ak;u}^p e}U =Ĉ֐K\X6<"q2ܤXMBshWЪf>LZQ[ñnn ,EW r yaη@"D&/!Hq.5)☰=r 6iLN ƣiP#Ma%1B;=j:漜yA*> , ]喁y4+˃cYSH6W\Cxe,? ? +vy'9^2EE溬^ueki'Bȓx*~#Dy7dI)Ɣ\&`8|fWGrt{SjsiNYsrƄM'L+$Qh'ۊ"dYBS*~Gט( G-~oLQs" &Rȯ7 }\ -*cJ}nK sMREJ0Ia2Da/ V2P!֟6j>\rdoMH)\a,}O zۑ4Dr48x( !nW|,qc]ĄE^l$gk;F>N,[Y3.2⍥6JF.UkIչ\q&iR~=9 VU˩u^W )W npIc~:B;)FdRݲW >`@z{##x9jY.Ex!7T8,c1vQQ2뫝SI,ⰼ6rMwҁ]jKi!\5qT_`AIĉ)Zik5A+/ç&\( 7}h ͷOZ 9*ʽ fP m_@gdcc8q8(3 &rsG !Gֹ=E'ʽ3DSw _0>=wm4caUMDjm*kSFO \)ħ}W{;p2p5{(`s-}n\X^"9&jg@g<zyQlm(8.<LjgFIEP[CzO4v{ǵni]0WKl*:aZ/,=vIplQd%g6(0޲ vH93ԪsO!*+CipP/rY};"3t\d٩h骒ϫ #"@ޕ3!nl=hQ50IHaVĕ]NiC.n)10km ))2")Js 8w4]`!ju9n($VwuBk;0ܠ"fq]} uo"jk˖v olx<9i1-eCoU58Gr}ht~QOWktWEτʑ7E!V|,iAL\furD=__1U5z~12- !BVEķ]*z \j\ Yw;Q^Z8{S{ AW@zXeG(޼E6hWYi2)g͵tPJIWbH׹Vz^C1<ƅ{^Mh|N1!CZh_V5&>Q#h,}bX(ofVDqm94)J1h'ptqF`bgZ֫5zH:N;L65D.vEv%sZJ Bmh@#..u; .歌\A58(V'?u[%U;r~ݒLȞ|4Dy*T|.֍22J H7O'~YuLV1x7q1]oz;!Ta1oSxiQHѱ"m?u`Y3|wD/chRzl d\q]1k禘O ލƇ} ^bI̊`VI$uǺ,/Ч?r; n\5nR_X];0m,{1f{SUC7"l4]Æmez^:L"&sx Б wCBI[vJ hTc-[jlyoippWăB\m^0cxlω b/f_@layŨr[EݸZ=Z*6NаI->9&eW@7}Q&;a"ZOy%VrHbX]͡Q:q$8Iޣ`GaY1~@{uŪ?"Ik-@&0U_%1|/BAqD,"y5bp^zDnu9-Rp%77$6vNRcx!Q*^R@9!PpoV~ :HZ4AF] }Q/fexlFP=ӿ;k \+^Y&hMeDUA1g/ڱLukyu޷xVuBBq~'P1ׇ,#9+`waYMuᓢ4&{1/-TS#X[Hĕ(p/i-Jt#LU ZL)ٷ-ڗ„ 5"#ERn Fs| !Y 3D;ޜM7=OW| pn&fH 4EedY`KӋN~P?ۚ0F#}r9Yz˛q O |{@ /2CA92 pnl m?kZOݲGb@AK!'"kKyS(\L"'o[<P)Up_lPRXj=ʀ%Jac Jd亄O =HbT^*:Q0Оđu $0 ]D?=R%C|f<<"͢5=܌d%/C{XBg k2ȏ =KadzΌ­/Dޮ6DQ:oE-us2{Aٹ܀CR@8=zu[R\=܁3Hӫ=ݐ8B*6]'bN| J΃!76-nJ4u7,Q1ʿ)gmI3ݭvcTT@T)9_kl>,Iɇ^mg Rԟڢ8(c lFs |lɮBi1Vr̕GTA;^kt>SFU:Xսyևi`v^d3j+Tt2~)vmD( Th֎Ti;[P+i= Ck-#C E {ÙM-Aq8 Aws,^sU+BsCH#ҮklU#4oy`Gk5cWSr%X#vk8eڼ(vۿD?.[^l'7̣(V.Wqoa%562[`[DjA:|x*p*6hf;iI6n 7a!ⰾ,k^,RqEjczH#@^mK|BOq:YЕvDg} C: VLh9Bp\ьܘ_wS7Ĵt8Pm7SxZ\+f%8 (z ne%oK` +ǕH^R.g'b\ Sъ.?gvaya &Q_\(?Iѥ ~gl;_4֫ q%%)ʿ=G@ͷj#:<9>;y|8 [xVj`,c I2|ywN0m/0`0 ,8Ô޶f*6Ӽ_륭k:RKD!58مTjViwρG ZW,n2A,bnB,;τ\6޼JКdAAgSiPNi9F侪_>U`ߛ;XSUt6tHJTwG\! 5#Z/"LwO}dc{$ #"ӂZwY#r>Dxl.;*6& }ޟ/ tܟbm5nZ0HgLJMbLr/ -  =" SC,ah_4Oਸkڬh4A#.FKaˏ˹R(V@A.crWiriȄ׼խp3l4S0Cg#-?A\!\pOS`1rk˂7AIŎ 9BȀ+Ȯ m.$aO%=L }K|S4շÀmI4Pe,97}~AۯC'Pj_;u&;"NтxԦTvӖMMՀA97m<mNxNܼv`ܿv$kTiEtͺv2m,Mg3YGչMAߤ{ѣ>ǪR?Dm꼽apT o}8še٤ίXW2c[o˙ &M/ſXZlκH,0BփHbF|܀]QٓC[xOw@شں5.EX|b|Tw]$H> e}Mےl$pd[s㣠yֵ6J;}EXT7s0&gbpT堊:W#Z d {oO0ke^0kQ9ԙӨXK饵lKE7M}>;:]<&>#uMn-c>h?r2,Љ1©.\ܧ.7N=aab eDŖ:ί XU n.݄/O8+_qx6S'&{ 5PAC#%tn/CrSmpAEa;7fyA!OM Yq'$l@Jwn&8|!yBO*??X,6>f1X ]f!U$׋#׿t='Fm%x^fS\" [d"t,:4HjJmR$.֛.Mj%5_?iW/jek E.\לVݷas5߇'{=4Bn n-VශqH -oF#5_$`S!8|_BM{.(fI \R&]/~u>.7%r1P3 /Ñd\sQÏښ\ {h$Yfn橤hHQn#EW媓=t57~a5a4礴E\20++8JG4T7| (iy.MHt+v9Nc3UQVCcLb#v?^qs,Bn;X}LWHuMr%:3,S Ә_d,bTlj@Hۦ3:[jz۽.`W[J8&EZv?I'xcf"~X"v N5b* p[B޵b'~YC+dGra!%Vf16*ω6$%j9KtM!{PVoGPo vs/U{"4얓/}XDk<@!XG=OdC8Bc%NJ 2jCBNKDŨjM+qJ! /NFbQ\5I IM$AI{?{<0絛d5{ }$aT\Kbi1o05B2"8QՆ:՝a=)iҡA+˞ r FD|}"KwiR5v"'Xl XwCe g  nF&@'g/W bo&⁼4'߱?6J MŠL G1Ei2>>Nܭ"$ 4T-j8;@zHOAC+ TbxbA-nihaIW޺4 Lj̻"+hMFSÔ\C_-QN}-*7m=& hrk\bH7U"Fs#c3f(9J%?bj}{=+![ G\_j]=96uY[|[aBG(EzX 1SC|Gq F󃁡֘(vm#A4mX.9_F-Y#a[~^eImB+0lrwo@~tCim)U?"g" ,^k l'Obz '?w ۠^40յG0!2sf³!LU\ר+> c;Vm[f%C/W?\]ACn"ƣ.ҏ9h4nW*%ƾGGMPi(mV6y-/绥^wxTfe@֝YЫ5[y;3=yŎ>JRFVPNyDo@xRSKSeoЇξ$ma[jce`zfF▉92e;3~e9n0Bsc;社Af=7I\L|)ZzZeh t[bn uP ػ06}cldE[dKq@Z(D$*<tڌ@b0k)@PMw/؎d-lev\. js)OlWzjX&ېJUpw5n"ZZ O:di21OKi1 1s'" gb>j>'OuƸV qebHv~ŒH-j !Cb׺Z;C"{] 4r7rP7*(kmeU61IoQ"Kf,E[ U^R'ڵ?['<)=΄(U&?8aOl82zS9,L-am4yD p3o q5QP?L.`+ p HfYYEp*pAj%Qm%⽯kXDjiA5n6K8XA)⚹x3/sqò2KV0h)81pj4D_j '7">b;ةߚ_c |hC$C<>;JiR 5G73ai6IPuֱ9Ym!moD,fEyԃ47vw#-|9AY]?E׊*6aln亇Yy=o ava W4>謢LK'&(yHXIRc)W{Y$N{ǻ քہzԤS%XMespM}ǟvgO`^Z FNr!m9F; OSPT\#Qs\1,)џ'Hh%4'@4$&7#; +Ծ07c%a@ Ivsl-3d.H $iVQXxx:_2S^pp8yf廒.ືi*s1=iIAC~y܏T?:kzyp7yPgQF &OsVwΰ^YLc] S"Qe:OBl.wa/lT+L_3&~0SzYpȨMGÔџDR"bmT}D˓3=!1v4OS vmEWך"a-7?O. oVs~Ջ%P ۉ+ј97 b4C'_eӆ_avIÿ {$\?ޅΚI>3pI.K?G!"9B-*2 27֟?gX4ib4zEuMPE;:wu=z>/݃ (~Ү ۄ3L?#R3@'n:ͧTTbb7'佃ǽѪl%?QOjRJ#*@lJo[4DUdJZrs7)f*QX`%GYݾA?FKzy;ߕ"`4!GCkJQ@.!d5g]Fo2}kh0{Ff# mz2eP{i5]Y'hkB"K ʠ]'JhHiqdt J|YTsN}OTȻ9ΧΧ*BzoPFsq pVUU)tw@qqMJvϬh E+蒗Դˣ x+^Z G mdԄQ# Iܨޭm$j[g;㙕d6* ,(nacwo'p3qa5lȗ D9&vz0J ևK|rN8Nt\ilZ-x@˟Z8۴ӈ`ѼhD+E^}'F X:)K /ܺ1SO>(f!mpͮ=bX)~Ϯjv `6 Xo=rf@VOoGW~ȿnz̜ܝ3ŕ""d`0$u$ xJtk"l ` ]FgT˟b\F7 Cء9yA7PWBޘ|8*(w [3jh2_K]0ۿK9L9,?ϢEewg+H{m y1ƽI)UI@9= [H#25C)!AeGYҮ#CB NUAtIka,9k #3LkI o[?1]r r]iIwDh1÷ tMSx>y_dFk`Z`QґO 2|)ʯ%5U805i 8չ};%al ړx2 'b/Bgcd .qvD#{Yg(/?31ЫU\QZƭʬ5#5YؕPq9D}-}1o2Cjy+MG )[}"_ITQ$՞2C&~-48 {tƺc<c 7-R>s`ΚVk.Q7li8;Db"^rK:M|Ş?eL9IN;7aaD9M n :x,:ld&)t(@a5_]dĸiTn騬bXk#Q4LqJ|T'\Ei ~[4`;LIƭGh.dZUf#B&р/ؔ1 A'NjL_% Ă'ABA D?'v5^`S1~Z 9ȡ!܂8|vЊ4h/Br*h<7XUN9̞=[ 鬟Ü p J #FG"=$:\W=V~U=x9H&[>x>Lc9!*->1ԪU* A~7@d)jul'K(@bjr\6Hٴ ƣ62K"%VNђU!R2 EV1 '}K= BxkzwśQxsFf Vb7"w)4ҳ7X܂, z0hjW@9zqXr7&$ y`T'|2ZE Z4[~}xQԃ‰䊇Ը˒IBфp0J9F黦 'ۉW)fiϊɥ*_DH ws'4/u<:kZnnHRO *]Gok.a8{$nΑo+O:Ռr~>yWV87CmCȪFF9Шa"QR}SMlWf m55ic# jES<9 x'6Z5Dy>"s5 Wet&m.̵Z:W/2;޼4#Gck+)|'̹7sFO.<&C2@qt\zuϷ;*'_GzɮԵo`9RP,sZ̕ZP\LԠ(1-_g5t4@e2u]gDϻcL># #hYO_tE[iIZ_@kM='x޷. mD &THNJQdkKVZ)z L389jioq軐̳ .Dne #6 F0qGEY4 C C~ 3Rc'$Wk5sjE\ -,v"s9|6kS5KIݒ;C8:-Rr泶?WӾ(J:C}!فZ"*Оrz Ln.m XhJ@V/j^ފ ʛCj\S9#:e.U4VF'hnɐ.)P}#uҤVP0D;$v/ԜwB5e1>r|}ەpľ>5+5տ[;ʗnK+әmlk۩<6{\GeHt|jຽeU,Y24.c=SY pF_fEv@xx AIcG IQ"pT O*BWjNɒ9@ ν'7(W`|T<* FM)^kp WB۱z'WzYig @ ͌';]Ơ\)@e>~k QE0x1Y+(xTN1YР`hl+j<%Y5BP@)J> p_?$+|[A2l  Rl Hn/ӎRy8JL l%# T{9$+*8# 9G~n6Kfo=;kO=uх V]WrQX O_7 |{F\r.|<Oz3v&t JzT߉6t˞bot7\u+^›MA[%[3*K8USs^D'OF0D"M3AV އ*rҠ|9IHud,[퀾X {C<pg"?ˉL2%ΘiPGIbacya󸦿Eruٮ9O,Rn٣fz~ nȻ,CbE&@c|Dj )X#}_I]'c{)a9b[T+kva:i^=FaNgȢ?#! 2r1$D;14!ORؤQx>H@~K`? hRbr{A9Fk @L6PHhM1|-7F1d?kSβo)J}Bd(?4 2p"vgB`tpSݱm/[9`ӪY_nnT[Q "zRm]IRZ|g~VҋyAn D@r 4jrh9ű˛Gsyf"|:0tNT^zc 9?ڀP?N5k+L{|!uX:6E|0хyu'9F{ ްF5` :~+ ȍNX콁WY0Zcm#=bɘW^t:jo)D.&lCJ,J5h Gs["'%;f7+A,QW"vj{PYTfi K Ɔ챟Oa\ߴr;+\Z/cz8$ ,J Bf&];NDPy. FCFM#dQ;#]vY[?ZlZ=ΞKHOG?!3 CtKH㴳a!y΍𮕉 Ͷԁ!$0eK~v\K0nDr3N&ۓ5 vӭ- fJ).v_#;P)&9ʹhSJx!D#n\ޓ>+U/Rm0 ݢؿ a$khQwߠ K+LM;\HoCBAI mߺbkzI^*,\N<̠</nB:ExGYi b<=۩hܦ)!RSsڼۦQe` B-R_AC}bp\۹6GJg4@cRFrV ]=F5b#JEm]m0!?^4X$ѝxs 2aHNC_o] I G"WO9E Y^ƂMp۴j]Xuʉ˩o\4+Z }xAJAv^ؗ8_,gBs,h]o1a0oLPqoH.F37I #J,9,؝1 {%?+iOH:뉑~iC{L#$t_E]s"} 4 =W%Dk1eiQV#R!c1'Nt_q`xZfj ŗ "r w]h+-̓y:pbM^PL*3sM rDu`'k=í GO!=i48>MԢr.0lk*MuZ_>~2UI/"u-^1+ߢ *sQTD Q q ¸dʍRz/LX4˘+ttXs|[$-O䨀*Xā koN+LEySQEP,r5h+ՉLhep'nSqXg H Zըom޵t^פtd~b xOML0~ ,awwFy\Pc8J! Yu>Eo*kB/(䎆>puXterE|}Yܯ[#>a EILaQ3fSkP\7Αh4@)Q65d^%wfU\%.ZO%D]$y`@BԇipyX? Gn璕yOB?_`KV9sr+B \’6J/j'p:'OY}b&w,~F%3TmE& ;} SƓ!ټ A3͎G) IC/)=ܮSA:ߺ@;_)Ƥ Ed|Jn2TU X@V'\Gt L}FHz%=TЩr-IE ( njd@|gaU)]w Ϙoxfrd6%~! tn|_|L|A+U9^'iO$dؓDMtQgl3{9;!ni%')|2phrL9b;%z\ @Lkyp^ȔZqrd~5ȟٷ2UXlg=~M9̼Ec^#Qz~<&mG5Q%(I>9E ڎ33xCnI֧adL: 9j8ȃ2#k=T7}OUv@9>HѐΥƺxClm)h."V8yҷ[֕04 KP `yJ,ivS&LjE-+fK)Df"ȍ)hY-KSӧV*i'!r\~L]v)>"׭VNcCz\q孉 HQVC}α̎0د(>q su0/Z8@>bŵ=ZP[eA46hlebb纰8aj 0t|`2̝jvA*<.-[k9r=ZaU4@tAE G<Ai9uby_Y ѿ1C?#PHFe~&W~ݩ{;DƁe3e.(^ 4!iWЮe+|S<'yQwI6 sE]vfDH>Ոu_"q%Z.X?*zY#g5XF\z%GI+V檈휐49O>{LHW1}~/Z+1: jNeTHiZIHupcq$`hS`>%4:Nف>WGW*"M{2h'*eN +Rrln+OGm`K:M_ǪVePبykh{'j uQD$wX ]B},$*U!h|a31.c7lǜyl+n">Am2,L,{Om=0?=s>a?NrB[L #mVJv$"^J{?4X'%Q%UfT~{^EmUB?7}\ʜʚ-)6uby6Wɺr)xo9SݸxQ++GjO r_VxCV*DAĒ⡘%nb2.zG*Yvr]/ &uR,GԾg#/U:ҷhK uؒ hYh^%(c{fw@p݈\\0L kt -3Sјiihqό1נ\cAZ3YgVؔI";/F~/wQcIŗTKP6(}LNaMCS< %(ë} XT_8Ѷa$`aT߃J-&b (] ,c&rF+dx FOqul3l'ݓLn.,GuQ־P'?%_[42= +rVO؉rRҮy }׆u}Q6*T+h}֪;Neȳ=OҫF]b-}Z~byq;E69MӋ̌nBu?#CH qӆ7*^nqe Yu@%`eYb!xOI\>9k=d" Xy\ֲ@}u7#Ju ALBA;Az/ZiSi wbpgv{_6E ~rat_pڳWTגVY- A&BSoLСɾzoP!Í+xθ" J}F iP98'ɩ*l? 0*T^8ADJ]V/dϸ kG?S+jGȖ@cui Tl)\:_Q?9班z9as$I0&nVI!/u _M/P`Wб4M1Ӑĸ$y׉ۃ%a>7Q} lLJKjYnq:1; 51Hx\Sq)ScW3-@,TRrdJFWezCA B.OI=7A09ˠF|'K'ɧ䒋B͓[MZ0 OqZ3R&X;7~&mRWf8;5 `Ԫ Tʙgwy E5ϰ x;KWQEcYN yMFp\2s|6X>7m8a{n|d5C2vMqJ5vsqh`:w_؟tD`DFs"@̀oUE"WR,|Ζt.C3oAas?-?&A&X E$iЄz|'9B\caם|WGWUڞF$_xHy5=~gZ 1QP{>3n~ٍ.X-A !EuHJN"AյY3Q81qOΟ~), ^T}?'_ Fc!9`hnx)/>1y ):fN=j(r9ɤ;lWQ&c$X^}}l+ gvEh:9(k؂FZ*X}Y?9w.ߜ腚Q@YZsusieR/data/FinemappingConvergence.RData0000644000176200001440000056073414112242722020002 0ustar liggesusers7zXZi"6!X])TW"nRʟKMd[_;zl#Q6a O*u7'\Y蠏"qUY)79EYŗvUy$pȥ\fڼ&7u0gTZs'G PS#5y0іxָL'9C 2}I,H*+(%@}A8ޞﭐcUXcX̡ԝ -{v*E{W 0dcp_Y-I{M8أ=1# X_7)XN̠TԺD<.d$`ӲaM? 4g)ZT}HBX+}o¤?10ɱ"8{ܽe3>OEIyGo;abm$U$p@mJAY{s[)i]CaYno^%I<ͮa[Ju#zR\dkM@ >:Jgw"] [ bI:U@&Z؎@Xf8`^1N'h8]O5}QԫQ:ga&2D])=58YbbBտؓ:ͳ4-Ҟ*Nqb'5 _Qĺ2#$x[u;%J,d"ͻmW@s +LŎF*.ddFHFzE}`lͷE_ףÅ%7g`ܐgPϛ)հ41 C ^mRbKcMy+9$;o*U~4#YdhGKWXjoK8<-tW+}QHWd19ǕWtY͔-~|R`nw os@Eαԋ s'3T`[pM~Ƈ,s2A,m28"^A$M+~v k-T2K%g8Tt7k߼.;D=zUV^Q FCX1Pî6{-#5Zxs[^hA*O\7G%$¦EIOu#VDVJ+; nBx0HDk:]zrB_Xz@ο0᭕^AlHg%|-snwO4|7P#X(.*|0%rCvKNy͒7UȂm*\N m栨4*4s@a0D_^  7xY޾o7F>5- !F>b *DWx)/W Ē6 I줹1GO L3k`yMTJprv 8`Zfhӣ?ow PpY ukgHTlZ|skwC&>js-_ e$4sLٚ]@{Ue|C_O`Ԭnbl#E%yWkaFGd`K5ඁT׎QAK"%IJ#5WJQ+Ob&Rfq F_I9P5z iŵXfa?4ĞeTY@NhEhu3fJ±@@EEujlwf͠M$|dTH~\6(5X4 h,;G @lI>5⸂Vƞs/V$!J&1F >W(tXi.Q‘c@Aj`SBzSmZs;x8+?%xb9=12a}-)}|xk Є?L1cot pwtԦ4v;z ,Խ1gq OɒjǚP?) rn-v`.֤6ZthL = kTʹxmpl Χk hm M ;pRѲŦĥD[Z8xb#F99`nD Lv%JBC3il ޝ ;/],{ yDJRDtT5܏9JfHeU};kPTf]Ϗh{>Kq\b!}aQ'fKdJAn;w +a:p - Dbc3&7:|~,xOcNV40vuQ7*0~>dδ`U}#2tڪ0`zkiYcp/l~;f7Dk?msq)xRqfEkzW*cY4v " /iah"m:VBDێ ;Bi/F_[W #@U燡wn h bD1ID_||qPf͢M/~9=\(;*]iH5uF~!p}0fFP&*dtߟ`MJ,A~|pZSŀOmB N8U/j3 #_R߱4k?CAQ KE@.Jx%FڿXBQC٘3!V55Iv~n(t_ f< ⢵E 0;16AMa3+yo=+3b/`{4E:ioU`jTׁ(6JepIG!k[~5P&bЊ5,X R[w"', |_m.Nٌ.#>25j"`c~ "9i{Qވx$~ =/{כF+) @DrjBwϐ-[r_0f?P&㬡ptQ&;S[K81h}(9K~ q :ٽ'B7e6Z5ؓ]D=_WOе-A*U٘2Gj SX D0;G\;vaО΄j6"W fvhy썏PAɩKTMnSZ" #Hj;g)%V қKw T e%X FI/^ˆяMGϥp/`kXfn\q_gQ[dG|]ZjU {;'{މӸ ݟ)PaW}C3cSELYHWt6^fERN7K̵ef3n/8fo LiX׵ќgnssk?$zR*>4HLaTJ 'UxB~sEru= D~=2>qn}3J@͇YKq>;V92sT 9(iqx DhVwV۳p?x_]Yi%[U\84l [>yH;{r)/:@ sk*=9 hkWGqB!bcӢ5 +yG(6"4PW] BG2pNY1\+s(9h2>4zWУp $U_bZCՎRdL7@T +Y@]CǏ}LH8I8&l}$djFC4?[ߡ2UV^DY?u8hDƐC}`+fw,[SfPsCss/S:)b܏^hz?Z y.uLٕqlbG`ѼoJzG2r"U_Hhf?57zҦFwΞiV#=87XZvW e"f=38IbZ {]aC @Eri)3 0y#% 989*Ҿ Fɔv T8٣ sT%[mެkaqߧ[yhHYv]SE9=e.v*\Ze  X#yQp'@ʂVp;#&8al >ӮgV f GMP,"ܻ!XxPgiOG-ɁYZ[Qg&J[:9B]H݊n Dږd^l&4Բ!滶N<ӍI<2RC&)-,0񇙓)6FI#A&$Gv㖝L|;܁^ rjZq B g|(Q0{_( u֖d8po5NRaI**8*or<)2NAXD:À0)Yq4&}o*0!( X}m:e-?(0C8^*G!]á\þse u//aT#mO_ŦU4c^ VCO [PF%jkmmrP;'ΔGx)f(99A$TZ;' 1B؂֡] g !wd{lV>WPRb1̉kXN`FvO۾ F9|X"˛t6"}ƂcaNW3e#7/4,AfqPdž(h= 'B2"m궱wux@ǒ}!Ypd9\AjSUK4vә?y!^H+Ò9r4׍$7ґͨG-`]of,ec*fxj5@֟B~nڍBΰe% Kӱ'`lS5AÔO7$o-U{= 0'tӖѕb ƂAUo|KHȚպ*r />|֣1ю~Oq'JIBT.~%3;%|M_F362гd4ߎPpqyP#f4`QtL`aQB##~Kk!dP-íR|4:w͉m+8#]뗼DzO8M΢ wY7Z.n;6VrI"uvB+GGkj6yzf)(r]c/f yWpZ)@C<9!-tۓ]hE[*+]eܒw4uh]s(;jrzb;w $x2%\ΰjU 'jeϗJ݄6+q̘qVxv#)rrh^\x39@U֊%7GIƒF#vW5fzE< zRL;}cdv*|N6ȉn~~TR-u $Ǔ&Ho $p\n8| .npY㶘"AWKpm?eFEUGY;U P4|gP3II~5*-}ϟ4nfh[am IY-ԓOr,Ie,ItvĔs:qq<-4Pń)|@ZPI:xNI_/ W/9w[xo(iseO ȖNaȭ^++}sL+BphX{^M*JCf䅨__Ƽ׆w /ROңz>GQsE_^z )X7GU36jȣ7hO߃[V7h Ӥ%-腱[Ta^#w!%R^SC)k:φh$UQ.!WɞKE'N? ) -L/Ր Fl"Xĩ\) `WI&#o8SKf.;z[w)uG?r` 6=&GZ֒q+Fit>!)bl4^n͓" Aon#&@'pӻ *8ejrG`2"e#~][ΘIS܇nkJaUzJjq?Nt4ǭ&3PSUuBYlM !V*.KA9$ÊNo(—Ђx.T $W|u VDl)MQp?JMC:qܨC$m|,OD8-ufƎh_hP1u i\C $9; vsp6d,ɳ~yEۡǪrt"XT. Vjl֖{%x|ءz(t`U>M 8bN(w7 W,c욒_Yo %kG\cqc4B-*4x2q)0\%١V$Z.UFRC8:ASm(Or_,\F\%pHufĘKU5o8)@NI4&Fu%+GKF"vUtQwg$ͦgh) 2q1=ՙ9͆I(I-e BK >,9t?Ds5M]H f)*ʡ2Z=zC^s1l[ RQi̴+]9{ de܆V2sBk4"hhczr08<è,ļTJ= r3>$QݹaH[r` )N|@dx|;h $agBu?9CߪwćFN B ".MnaqzƵ,Җ8AsY/L8"PC.Z0CaK5D/=ftPY/(V<8 &$ E}BK.P3d=U?l;D# 73(F$LgA3b`@\c+t`EMU|]Ó^ 9Z& Oo@.9_6!>L䜔?NQ 5`'uGb,g5 N*x&qs!qмI nH{0YE䄸xH 6ym5 ꋧG&ӯ)_8ŤBD9 x'W؏ !$ýpgϻ T dg4\dKͧv :u}m Vb՝&Vjs6ʷ:mYE{lĚwaDs&?yCTx{T-~ 2u'u+rb}R1uF* _8P 'goWM}g'Ӌa9A˱7C} ~i˹dbf[wST3_UߏFo>IKd> ۴,3_fQ43 sg™xe;qlWAt[In&2_Mo3= v>?j42]z_JONk % 2| 9My@v"OY'] MMk - s|{ %Uvd!,t*ֱ_ x5,LX2̠-i3\@wg8H!J3P< :CAG %ֳOcZe|I_$-Y5d,|7IcQؤ%8Z9ٿ^&KLĀr. NWNf8P8/Yt_h$u_x$}ly)}Q ӿP17ϣyaKM#\#Ztn CNzݚQ[9/}7 WP7~!FnQ3|;^=_Wl4N^Wfv<6a]%ح` ]LtlLgXcMi{{fɤQN S QfHmP ka O}kZxI)-Bq2Wo`Q3sxnJ UM1Jjyrտx<#4>IwH@Vo#I4\$v%t7ȁ =nfA~p>5&a`bN2!rIh,کNu~k]Nz[HS"eRPS?a"{*kem+Dؿõ1STiF2-CN=?lBǛe6\ =X1 GUß{ g43_(&`bԖ!Nٸ0|}-;"G`p*(5aDSa' noYRD Pp;]%R}}teDle HD% ˻ l O|"dsl7 w 'ݎ}|~OO_59 LC~b*ov2,dxejƿ{*ۅ=OBb eф&ƢF 1m4 ;t*{NW.fs- xo=?weŒβ5ro-l+R:j>PlIJ_R5EvV^Uōx) + ˊ-;9M>]`WC~UD<88Ob=!Y;U/LP"Ɗ7]&:4ҽ7'I/pጧ{u֏eohjۆ R%>JSfTHJ JmnN}ӥ>_hF{VV4qtAsy\|ĈݒƆѼtt n&s#"G5ڍoHXG!ŇR>7N]dsKϝwj.]>'JrU t!r`+ Ҁh5 o,OzL7VD{OX#Jyٓ(H& ZC`)h B8vadn/u9)V,Fi$0upYַ9Ne\ \&#rOsIz=^4G/Z!og1qCIUxǂkW㴅Ը|Ґ/@I -Nˇ?%c0 2BdLۀ}r^z5_Tihzv 8O0܉-H0|2[ZӻNe:yi0޷sm@`ǾuX^ =w!QAQ%3R\;ۘY ŪRl 'A8}l2fأ};̻?"8^#&v `*G68_qwH:M;.eL+\:cFD_pX}aMlG5JvLaB'&}4T0cL޽t'f4',qVzLHgrtM?ŖBvʠH lXv!"mF^ cB&0t=LONH9ًjϵm[;N_9G'CWkL@37ڼwE\S؍ؾ xPl^u6ל )6y_tCSYBT﫶Ip _!&TR2C J9=ЮjhN swʠMZ_б6iĢw7v5my~.FI@;!$+ ]F"v.J "ހmwl ųl؋/ZoM_$mU ]EcqTcz|3{^ َad#HZ?LsEJiys*$dUur+aŎLҞT=Fne QfomZr9t}l6QT9Uv-dl5nEh9Xt,)jLGAR soCӏ(A쬠mv[Cfڎ(W6onn1 Vr8=a3]P܃^+!B9y#cY`n.C输?OX+H 5n"E}۰Wu͊qEk=0h{{f U\xE+ժbsm}E~ˇX>U„ǹ{II{RږU N^jtF,g9$"gpÁoB5[Um3Qk if@mUS,`-P0zu6ȀfskM LQ-Nt>h&]:;꡺Ž0 #kAޛNC0ǫ YNڄEb:kG˭}/~,31"0-楊V׺D*z]F(Q ΍\`i}i2.W{W2`tha-vY/eҙ8+3jCLpаhrW{) Ho1=I+ ֫P2k6wgQ ŘXkDX)_+891jd:VDuPzI:a&6 duxyb)_Xy\sOzV1W^[Nkb!BOfS!u2pWGh|,E}ZRB9>add/_&V]~n]L]Ha+%/z\У=:i8T>~aUA+'_oZlԣ0޽[uBaIb[vm˃n_‘.'u\0CKsR gF]ɹ/%۷j EX1SQRnJ z-ٟ@ef)LӄAi:sm +v&!1)~PShR |wM[CRyP[]c~+g6i$lcF^DR}`4\:1E8fnwygFOVo \S <\ z FCp:09#φ{ c_\q.|'"6kAKX`q V*>*V< P`>a p7ˈ??(ij3QNԹXCv.Xq@`̜OɅga%^ ^SlOs7P=g?1WP ^q9V|A֝u>j [w&r uod2ڀ5do<3vl]lw=n%(`Zy.^\? H{2>n{T.s^1 Ep#O#+>w.Kϧ->PeD*R]xi{\t( 3cUo|5OӻvJX((kC6%sn&j'Ylcٳ٦ږ)Sx2a6d`Y µyB9SviifMqKQ T*S>5T*B1 ;&+8/k<;$%y3CB!(5惝R҂(wx=Ιȟk'IR!zY$23uZP@F /@3! P1;HD3K띾>=icNq)ȱJݷN9bQI3^bލ|-D[T Y(gT[p3L}#hH9䴤t|aO9s]%6&|*P0ۤ}#DUc 5v8W#+.3n#}]dd&ugNKfM&{eDc]UG=,x[&1e}Kpui]h;?%:R_i}F Vd\v^;,LXvѫEڜ}oQ] sD}?(NvCѐs2f F*+2Z+wɢn ->.3GfSʆ<$-р%`=ΔWo߆a=mH=1bڤ%YY=|a!}{'yC^eBg9$gzAIIn*L1g΁w͞ Ȫ+&]e2f~\~"ѫ#,e ,sy'fDkjX#R.O?9+᜸Am)8pp.}0ZΆ_A(>Bk7۷?RܾqWUu=۩"_AY{@,: {9!tp\F)LyV8aL506Ja~|A9]:.YX'+u;!F[;~Cr0B%dWnoqdϷ9U=b@TP8:`>r?*D:*aXke+wM99rv3R5IO27&ğ뗭uas+ ![`I@qYh@%<Б/)xeO.~c jP³ǽPfV *R maG6['W[UTJFLهwPFxTLJD}qØ1#`+K~а qd+o 5~me4NSRL2n_8uF='m^ wU"ttssM×`YSZ텞Iuelt#SElhqRjE1hƋʁU/P r4ӓKs4อG5F ܉ب:tP(0{.g BO[q<_nj"[5k dG =$Ѣ]Ȏ0aK+79.HJOׯUMe)Bа̩Oaꄬ_`RjmAdCef(PV AGjҫc21q2jI,wо@G"|d6]9ŝk,|N M8F|;Zn9G+K9%AC=oP0ۈL.Cwv +؝ܑ׼Qݎ 4AzX%O=W$G7_^'aZrq;6p+}'aPTy`7(2%tY'2$.Sd;xO36l6~j0HUrD,~pZvcjWWӛB;H'7};5̌"`{|#OпKqn搚P.qɆ"av@gR7ƣHjKjҨ ,MbWkXsA^11Ιq%dTȊ౶"[Pos1`z`'s 1xZۢ9[ ͛Я26gɜ`% ^ɲV٫F~RVe6z1T5ut4oIPq{=f#P1eNK\AmO:Eo:(j3Fq ,Y75FJoEl*_|(o @gJ߾Ya|3ƋrHONAK]9)J-E Rç#!Sʬ р~G@B׸LL68q:F$=Nf_ \2Q]RBfIYbR}Zh=/Ť ~`_s^ p]{WCƫ*J+IŖcۻ -JHI3&;Vxu[Gcr'ϥ_G>R~忩:86ldRyeCY 48SA3 }?*҄U2rB>dQ_pP>V4HF((QVg3pRDwp02fM#缺`0?}+D3y;/R6fN7^t-dú.YHlqa+.M88bhWދAbsjQ(ĉ~_6\>t1:5 *rjI1nJ4ʥ0|w^@ n =C MC RyqSgaa+-⩿p,Ł5ikٿ^szy;\ -lF3B^LIS5ѩv`9"o\ꨞ1({u{UOjd7OChO;BS.>GqmM%mbEL#v1O[1شr%t7X !Y!B6q|ũI2 fcvI<-;WMICm-oi% wԩ :sq)R38[15#0 ko/kaP{Y-uYJ3ՓkށoŅ^MFmʙ QF",D>1ykm+Mh >=‰ZcX~mxWiW gnEܛob+W&F[j ''܌[?qJq A fl=g/_g)"bx e^0WR-:64UܾA,N!kF;'zNQث{ )nå51mUQitK%&"y3e7 u4^[$t!sKAB@0`ך*U>R-=D)on]1xb 1h0aI ںb9{u1g@[+hBajO'w bj2Dmu [޼YUg4m*X^?yT%Iّ;lj> ԏyUEC/}赶97!r MJ`!!C rpY7_A_ U貵oWq: /T{c~6~q7y٨MHpgB`M`#O:2i qLb&m>9wG) $]/ن(x&xKC!Ȏ1gQлr)L?^ץ$+4!1nk/8SAobw/sA~}XIOhIh}'Xx~fNNOڦ~$4~(uMFJ:ԏra)_w)f! Sr}VL: S== c1`R[D?3kbr$R&x* t}.'AWxmafC"}/ `Kjw"OZ ɾ|,c'Z:9*fE@Mw`Ϟ%3B0™_<-ԋw.dZW! dEh{]p/u@[2 X{U+'Lh#m,0$4w} t0SџYdH17A4o0BbmǏx.E !ơ*>>칁ja V&ǻYacj^-[ F jLw-( @VIxg;r+Uvo=` w•dO.3#,TOYscIW_tDi]JGӍ(f,2)Zu* F/"|JMpqv2xұI 'a=A|Lbf%J\PDC8 \ӵ|$%V{M,b6#FvMݵ,ƩZ0Yk<#H-f-ԞwʜIo*}ArTG9Bj?mDy?:Ʀ0I\ 0 ` B0ƸԀ:ETsC-#-j`3'.nUED+Ey"Mznm4"zCK#|[C޺-2v~bS+,7GH4?)ƍqJHޝʚ$`qO=BHɂ6PvDdTvU*CG ~l j>i6^>{AK%(X3'=iF7jmt&mϝ*p9^HQ;g'5_'F/fu߾Ƴ4^ ilGٔ *$Llew kcx1W%G/q#Ǡ3Mj? ^flΊS# KoA|; iN㩖-vNJC+!0WxDo7UPu5 A;Q̺P^2+1 O'{&i]󢐲GB%=~.}M* {1U"d-FLW0ԧA/3>B|)MCf0CuJJ`nTJ.5b~P=^0c;KI8uu ~+ȳ¤Nbpz֍qLiqcooͥcOUH/A^-`F{WY"R}4BL j0|6~4vaKlV?X=)r[t3Х锒yFN[4&8zg 8넮KZ/u~&qDZ)8fGJiݛJs{(`ެ#)"̮G:as7FVZ6a(~3u̘YXoތ2%`b'xȮc'Sx9To ۃ>!}x}Rs, Y?h=%hT\0Dk&GMVLOѤ3P`u 0` "a*jR[^DgtkAOC8nt?M5qq>4` 5 &ꑱPݲN}xOvw׃j;M Zl|*Rv:)ks%Pi"Sn030}('H5?J\rPM/;-_saq'rz!g(ZTdn2k *#]eoP4r|R͚nGoc0t`S!9y /]#VZIμ U -nWfNG~!^o/tkĪsX֎AC$0k>߅v؃[`E>Cȫսُ"qdڲ=65*G={4wnGRʱ!z/pnZ hljDϒ`p ̬bk?XdfJP?MmO!:;MslYs,ȼ>js:wi[a%fLl%}|=n;R_p=_Y΅/}vLt%!et}k6};jo&Ҵɧc_"֬A yn [ր8{ 9\+CV:0dmÿL󈒶-1cpۂv4xGwVTa~7:uC\(l{ߺlR#I ׮ͳ^9M}P'uIb4M뮷?d@&.Cwن?NgC91O!hNCC-wJ[t)35tc']r2;YJb B=T_3q@tNw[ 741kIuKZ69@ϙS1\wn'=LMυ({hṺnO(S5.+CJ,mfD3 I8k };(A%k4-#.9 ^'h DX-عԉhl9$4 }"2G茊M=k^G9j)ئX{ sl,!tAR3R{rь(gbLD䭆K>[i$k&b+'D +kjG1s]QLTnz]?Z3't9L}6Z: C|,L V'c>:7RbFixxU"Bm4?D.GKt6{`'4Lnr+lSU4x$m8Tn~~5rf2tbobu%[ ŞXümk0LRRCP6"7mʙ#$*2/&3E!= quFr,xSuD)K:$[ ,Bq1*3b6H!,QIgCC*Y("}yh  HXM` t%7B kWr#u?٭ԗB)s0'[^D>m_D( "XWY MmЕi5?3].~]͟XcbTbj 9#wYZ@K099؁$lVUcʠ?ٍTFh.(NzdXs>* Ö5U ͩ^`ML-3StU,\B6XIZ k74\ΤD?Xؤ XJnfv.ηe~u~8cpK\wDT\Ao-̧D_#`Cu[9:=ov8C?~O ( ̈ENzI/s9+!*=WRJe6;sH sd"d[]օ2ZZDKH'OrnNPV y \/귎A^_6W UOOG݆,ϡ{&v'"emH!>.M7RtG,⿨Eo 4\Bo #)տ."zݿ8Ɛr~_]Y+A1B،}RWӸj3.5( d-;#̎?c o^n$}r"|;촩SʃV:(t53fkt =9~A\fJC[q.t#aEŅ o4DhbGf1Y;Ab,=,L_D~'R;9=;Tʺ-zTl kce}}š,0}>xBS3pI϶gXk1ۑNੴ%FV &se݅~Li+Ĕc4$K-+BDbF>ʹh䋟 'GhY^I7r*|~kRU &Aҕ腧zREh4bUv*Nb0?2g H;MYH'܆k5,9~Hu&7˟m5L1_˱wVb%@jC)oͽ j6Ecs*3|+sR8]'_70u~P_\VYƴ={# w +l*>=]mT=Aulk֐U^4fK{Vۗ|634M1d 7}mN_KM t1tԶ~HBO: ,&y $:tx[}j }bEqt gZ4$PG$Z(!hL$HV“&+=ayV; 0<slWWeRL?(.v L#?4:OzlʽόXH?<4jֱ99NB*v?@*ts!/@mX9ohNcDpn/Gx]c,S]R%uϧye8{CHTn HٳQ{fb4顬DOTe8Pr[1'Ix0ˌHf Ey4(^c(}бRD gRpwQGLb+nK_ }j0QW ؒo$$3r-XlP5QJM cӁ(Í0l.⦅Ob '%*|'p[3%MK?q&t߶>g6c\-6=ҷ=}~m<\b3sW\ŊkٮsdXR9Nt#sw]Ҁ9ZC͌ҚQH?kȦ_j7ۊ}&-n(J YFoTDk}I]5ئ!D>gI4?]-!IJ{PQ*%`+붺us;?q7X:Z/9DM]v #B9D`BׇUǽӨ%POX}ѱN}_4OeG/pY#;W"%A(ZG",4~OmnksED8q@oxDgᬹ$DA %Dnx 1"i`HӪגt=X#o!?t}i8Z.]:%-v٣ϐO$+Dnç'9OqT1i}hkӠ*Dq6hl%dJR⬁%[B~GL6*T]pL~&A/62;L8ɞ蹇o+' h.i1Ez{Fԑb?Pqy HnjM!udP:L& $Y#p['!ԏ; {>]l 'U{';Cϭ5x2I/KD04Co,0Y]d6J%_lؽN4U3?2h0Zy+`ZF*}7,WL'H9UhIkd4|V9&a T!4(0Qdm;m^i(>r簹Z' u_Xé .:"Գ3=x0R?g #@J$LHqI^VUARpZζhx":sFK*;[/\oc JMX),ڟDu?}[=j 2x)$E}dHJ{B5eOZն6$2Фv)waF@H Kn)~KHS9B&r=\u#ԅQLBf/T4XxfMjq]fF. L}~6BH/+w)y l@RAQ6j72@0X&6pDG>mVqct8υF౉H叄`Rߚm]%dE3'"˰UBx >g2b5.jW#bޖ!T55z681HUYʑ~b.L;7+%$&Ce S Ou^}E0`Ê-;j2M^b'm~tGzݝ+!@k1Ga EܼpZ_%IKSx>t 5PIz9% HP[wnV`XEP4{ugë?7U୵kgv}e]@yr5[ |PuVhe[cTbn.ֲYlA ޭ9 |o-w-A73ִvö.i姠M ڡO@[#=f?-VŴCJ#d6=t{=$nk4; >џ`V-f|h0C!#X`l8:I0w%GvZ!ɩVv-7j 3w7ɱJumF>*µj^o Ȁ|`i,O8*Xhҋ nU,MHMfp2sc =2{9"5]@&t(WˋT"sZCQ979縃} 嬢 ]HNd1AhA;5 {=~4;FP}-Ք3ϙ/#%@-bB3)Ք+9-z6N9  ZȂ=v?9:zC)@D?4vw0R;+l@3RJgޥe}NBtĕo1>MoRu4ӡHc9F85,L]%+MP*`V҅y*N)AP=xg+sm0T}_vȲ[O[T,"?${pdY~.rSOH|m֝M*Ps$S NRŗvn4`>46>U,a;TZ4`H~ve!` %=KRlO-L HK/` #"ב!ݻZkj;hŠrwhp~C.)@dr4o6ꜴTN .̷<(e{ 4>(%';pH?2 erѨ 15>Sj#Ytuo=&ݛm { Y@v\jwߔEMtao[Wǵz~0եZ=3b'Žrde),rz5bCWr+Z*#wHW. "itD/ FW/2o{Gn_c*%ct*+1y#Ƚf8;L/u˷(V3v/탦Ԏ!͵<\<28?6كW۞+hbcKuaTőHg/V)rC^A l[5[0f$#8߱" ]!r^B 1ư!N4&FfF;F"hha C%ܩtEWn} 5C,_MbLd^9C>Yrp>dkQ ~)WPDWF+&Qk_7"L9sI hiQ0Bu'pحmGEvx&t {T6ݬH990 LaW+1(q ?u4}QЅwR׏ k+[Չ&?v_8 uWq9; 1U+]v uډ7v3#9([Ąee ܵ>vH&^hjTp*"eACm.p>zʃPyխ|I$pr5AqM*+E.Kf$QtDgGdG U<1]Rdb邴(G2+qaǤbݚ/VI# Qi'1H<λYu@eMwk9.:Le@03ʘC\"P0QEg -jM>k7Qx}'4\5Zi<]5y&~.W-i䷹=#*o줢?᜗"!V"i<_̟V=BIë{HH( u!5}7$Odh:er+@@A[DQx@/꓎a%)s:>nLӒNԖ'-% ,ؿǛB$u_=z)?Kp; *]n G Wfdm4ù?-{Z\Dִ);H6iDBc ˗,QKg'zK`ˁ 'w㉴t`(xV{h29IA*u%aFbJq+`^XIK=Rapܭ$8ZM @vy v]D$Y\1[no6y=5eC)Fh"c[wP0:FfTRd /6a(|\Jq )(O{ hFp\DbѳkB^{O/ fVl13(is'sÔJ\ɛ1-mۧ, OϟAqB:>'G;U_[|>X[4s#SU(1p#P {0 b5Џr ._4r'.QFcm^$m& 2Q}(c'SrMePBNK@ʼn{b(~-Z~ /6COL-0G*sO*62Suk6; tJguڝ^d.z}l8wiگ2߬! hjz'z_&-9vtǙQ*$R. {T#v//~ۤgH[LJA E͝{ X"~m_li#1!n=͜8|/;&CT;_]DgT$i?R7= 0K/~cөAIçiVNiEnaA0!wjid(\CNU92Ğr:6QFAM|;eqE55z lH&c97< { j OFn O͜%JϿ 9H`d$7V6tWX\ko†k#3DNHcl8L {we.F#Y&~h&]x&YEFTg ۲=&HjO*,:Na9KOW0| 2!@aԲm,e!+.; צCxR P^FQ~ fb~ӑg"urt>tixS+ު QID LLnr~6}C)S(VJ 8̳X{s[2NCy'Ihvtdq`R9ܾNsz"w.8~Z$B$g }6%E*{ehK'@,H*9k@!w O?tS6 fRM_1K3aEϳ R/aBjeک~=>7{gi1iK^})Jh9Y G]H$++шp(<u6y#ŗ( C(";඲91 6_EC- 2MAg1a;6&R=o 7cv⚮6H0q￴J2E&my*[E`uC `S nK樑z`[id]絣ty3}8[*LLBxJIxlW)ok`TW{.Q~ FO)Ś*~J[FڑMsYnW˪tAxa`wo#[SmHDԶ0'mM@Xߜ;k3_Eܬ'؄=*`.%)402XLs?1ۖ"$HV|pV`T%. شuoq̦kiEmj'H[d/ibY)C˥&{6\lmT$8bLN9ticL&>DN:Af4,{MhޚlÃzl)ޯDh~`"OS nH1MU!9Y^>q@&a0wMqY/"ې٤ ё1O@[(esD8 51 l>\ 72vQOB*G{me`u%MJZWOY,'mbٚ1a5a URiAj,7e.T_֯cݔ a!+YD  Gs&JB4JpЎ΅`m KƩqF泗}(7|Rdd$& B5-pLW 9PA:s$^| VUWc(ZУdjSLJU=ܵdb?3Zm=Ed)޲ Cs VFVg\f,ݬ l2Gk[&}rb)K#`>@xB ?9dґ^Foa?З7MbDlFԳOMt]mE3- 0'. fD> Mf|gZ $,b6 #/[L9lyLM&1q_( P5μ?~xgixB?>O Ҍ"y#2FB P^F=%r,a%T[[S#`RZC$4_ % VTn : ' u-Fލ~(̘VTv)=R1%yTE}A|{Jٗ| 0{6M垭n 2 Ǥ>P57 /+Ȑ".n"bm~Hue kΟjoEҜv-,@<\bF/RE,3M8L-\2m/G"g(BowvBY"q"W&NZe+(W- ?- Vp&\QnnB:#uJMX雞cXWzfw畨`n$1<[(gP67(I*[uq\YV1aa^2n?oVO45Ɗ{>0Y'ӷѩPϺ8tDj Oo%gE1{dM^ }dD;BxX\ dd6c7؆g:j'Z"QS2q&>nELk#\pϒaX<=ЃtDEА䕟;2C`41ydm9q3 $ݛX !224׫agfPh[S@1Rٴd/+kԄW_ߡ䒏7<9]HM"wL2Ȯ{NMؓBwe0qh5Lu+_atP§qjW8xk ?خ/M`R۪/ie!éd3ݪ!ɑ/ 2;Af*P /Wq}:ܿ+5I]B s-v mdT z2K~y˔SʓLb'j\LJ[o@= 0Rew*ݒP92I U# ut:_sp4SjVb<ӱ|u -$ C(jƪwQ#ik`q<67 /zBBF{8@қz!kl^Uoׯ2-:( q&JI7:a~w{Gkkuƨy%9v g ZH^o%p U_6 ${wmnJޭeqᥦrfqaaF+|k~䌉#ޕD?PHj%CDPRnf/"N22-ߵi FB1LS -{"CׯP5'8W(`}S/aʻS(:&PMkC7÷KM9K`$tO((b]| 3fp,kuñ%>WE轋Nenz( .CLU6" 2U[/izv6(xjyȡ]cL* b(DőSU2z/< -wbHpsd>.z[9v'$'V'8e*˂x\c7;>hqPgM*uMbº$Y|V"ڃd<o{aN 86n 4813(SXg wEtrصx$Ms1 )ww LCbi ˽;ļVn9&Q(ڡm&~ oͤ16 xjqm9~᯺ Cup/p$]'fJ0bpז+qc(ͽw{g NvX8dRǼKPi*§ &m> 5Ex"ש/Q3FIXEOTo_~`:56wqFa{[aZ",'[:4 M,zf7$w3n ؈:3yR`t䥦Bw :̮1[R]7lٜ֤Uf> Q x**Exk`pLa.{ `䎗DnC`q?1?7T93pmٖ\G5y޽ncS(t[ض&ⴅbcXp)y藐je}%3ࢄڜ;LQ#E{gELi_T)/wV_ͤp֜()&X y\Լkyzo{\辦q!=qȲk"Nw E% ] /vyV8^ [z+?#ȉZF\ AheMrǤ~s&żD.}EGyɗL'L2pӘ[skDFT,.; Z1;/HfGիB-e {Ú䑢=eܚ뽶(_|dm D]p5EU߶nE23TpbU>ƠT1+\8 ˲aR8|4*]A+vju8t C+Ӥ3,ogOiEZ}oEDҳ٫{Ēݞk`[V$*J`oZSQ?Vp?7=iRb0Q¬~ϱ' j e\lQv]t{3`DODJ &;I? @ų3d u?i &ΟVX| i j~/'IgO?9[H R?h>{~]}r~ka/<=%?Ĕc bK/ Rۊq3 s>OsKuaj]L+4gVDmG̛mU`. T!y W:쵉ȇ͂A$#%h2IRbϭ%^9xEtw]ʣjL5sLff/oFWI6G-"Ra-O iu.Gly11}U"A_YRJHgMͶoV%j4T}t`槔\A9.:+j~L{lrܙ=4w ~L1һ(~ETTVc'=;ܡ3 )7^khR &ʭMA wVxzzsdX@ T0PS\rg~-g AS!jQY NSG1Q Ǔ%6U `_yձ\>ë́`0)FØ/ ufq}"xtʳڬۖ4f(:mұvh0 "2ǪSGU.3ΌTyĆ}LwaGʈ ]:R!^0P.? U_G-;zZ}?[ j WxwnZln,bR9y72+׌RWmҀH-i?2ݖ/O |ۿ@0I"LZJ#1ϫ| 7O| ɞ7q)H{í[W՞3Q$FZK>o)Rm~kuc%+o\K3)6H":ާy(3rbWhh`lҚK' Qu|B"pdf;NB|Ͱ߭ }<9;S[5#|6 6X-U}P_3u;5q"Pi?NQZg;gųiSggF(sf}32|g- \-uqy;tQ3"d0vWˁж7 YJ'akniul(GQ,fCS+,A@$`*+OZ/07Vˡێe}I^XUJ/Z9t .).K@⬔̱XN=8FX|d ib KJ]BsDt$C}IzR,&OeA:_Cws2 5ѐ-brIhpYO',Z|t\MƗ-LՎ֍cݶDcB$շUO(c 7R/nեS3'{-d{:k:-K56't#$ʈV>F"&=2ڿ5 ydОM_AhJbH;lpؐţ)6m5 jKd8`P0Ed.TX_sD2G,X^ɂ;0dU$^+q@L@clBJgD>p>1wChڥQ6W0w 0^D;?; XZ}Nm$E6g t8| oWdl8ls~#FQ ?f a a΋!ر(EyVU?SӋH % V)GISjؚ>d YL?,RwMGrhl_xG"h3Vmp̱0-̸l̡삙C,Y&Z~p/9]'>\5D%Lat MOl1S,{Y*Wu0Z) a+u!GLߊ?R'8~l@h0U:w5 5"Yu ]W;i$Y9M uz,O# FQ~E8SeܑzWZCtin<]tx݊8C;ہ"O΀3(5ҭ@5aG`h%AUb$~>f=FϹkϺaӿQ7uEL8!S ۞d33 *C ?Ĵ7Q{ pc_\$dI 3וl7:Iw_%Hq3Gƭ0A$5'1͉4IP~ip&Kag h>s=Fo(0)P[oq W-PCSr DlЗ'@$-0[1-ðYh6JDsgKyOl_DݶJ/ BݻtL;f@&D(;#^ܙ> WPiJ06'1;g9'>iPWapfP sa&v -+f\(Ieo<^]o%|< |0ZjZlӪ^26|35q}EE Qh:fv0Ɂ4׍b9jp l0S8!GZy6h~eсOV, L(\GHV?9d쭬be~_7Fk4&=B|si;md}If"ۄ3E-%|nAzQQ#(oS "mΪqoCFvQ.߲ÆgX\Zʆ jvoM5ib5~`'? J4vYvqMϚԁ ,fٴ, gKc+VUNiKRu6i 1_rsuMwY*i1.PJ??EÄ&"Hk*`pKf2C*-,Bwh0!L7Mw˭w $*|\];>PŪme(JbɗhK:mݍ?${\!wV<_2n\tfM, bGuCXLqN s[t1Az2}_ t,)Zl+sմ*,1ER5[\dsʺ8SZeެUdUqR;ڂGfn#uʁ$.ȸIx8#@Scȋrȴ}%&O;+P`qr52Mp-0 1˹*:ΨCnƒUm8;t >̃LwG ʎJX D _쭡d7 )8<~  "i̦eZN (͡v^l͍F;J ĥʼn)ׂttZ/[0SmnVdĒjd,yLؤdߔb,7Y0DP~tvk<r0+c뀄8Z;pSrc92N(ľ^ǔCAO0 ahs1=KI;$\f2w׮6/Xtbt—%7۵▚}Kf[AxcBGR|l7"_OY{0>0^>"&4Go 2jۇ^I vJ$=hJŨB%/a$n g Ͳ^d2R1ù[Ӄ--^ QUlRźz)˵ 蜒vi`!껡"5egvڛC q$jyÎoy)ic@kLC[$ aťF ' vK-sb>td וLC#) [ 9a Uѣ|•dKmvϙGrCpɌJ2t!^"ݬX%H3UG&q'Y_}8\6SHsM)+qU5gkD{:_JPle6e"@{|**z΢Coз>+HR|_yU7~aTr>]Mҍ _*>i7_v$E3Y# W@ϒHu)YDŒcN [ ]6498ce7ML拍-9r6"ywblɝ3G-U[ .<̶i%s/5/ڶ_h"$oaS1>&@6}*:xaf$u94(c<'?8|-Ί @i9D"^2\vJrTkc~fV,~*_wN"<.:-n c;L^cXGfR nP|*[dZQ#f+D0L5{7 ||?.]t~wW!\˼߿GvBR"*?}ZAT]|+_2⛊+!-k'3&@0l cNꓨ*j˦.]2X0MS雹Ӓr;qtub>aWι <̷QX"N P߅i;]1cF/wAutŧHygyT8Y9#\ /L+91E]Uφ#5b6RA+ao:o %Q9'2lDS9MJ=1g.àѹ),9.{_|2@]s[U o;߆8Vsnؾ5=}BhT|Dmaf٭JZ0fZ@c?Ì@.mW[>I0eY\wꖾ_89.@Ii"2QeL+'$T=T$U;S*4/)rROaVеwU.bd7fȁMXϠ̒Q3^d#`Y_&ꂁy/l=4ۖo#2$7>֗d> \jEyڡ(Q-g r [¬vObM(S~ xTN)aXT3N4Y"-L}Fi MRbFo7ąU J[_. r&hNE{îo𑇧zsT|"C#~NdA5n=s" E]0 i(d'28R& d> fdpLW(I6fc4\'="zԛ;Ƃ|Ϳ]P{9pS"@a* Eؙ]=PcWZߣ6~qCVT|4œRȘ~9t 7 F5WW9HF4iJSO]mg: R0OBeV6â<axzM D AE 嘁`(¦%W'} w$:0׻T겭(WF E^Jh`N$i ,Qga2x8T<~JPbt9}Y1|Xh{XTrJXyQSP)WTo#ϥm~6ՊǞrάM,{ Uۮ1/|9+o4˩Ez,ZMD0 Vj /̲cxݮhx? .Qy1Tw8}(a=ȌyM*-1]7^*ήӀb_- M#gZQx9I`跕hpZ!I %ɱ|*:K\aZl,GҿښsMmpt &fs WLƳ e-$*, &LzMǒ Σ %Gb ֆ(,Gm 4B(Dj4X[uC[TIҡx҃nN!.?|_X<bQc2<;C|/T\ۈՌCE&[[B&U[vRy֝KXzP_Sg7h 3?Kٻ.5kW򖕪ȻTAe[U8ހK_=*f9%1$U5'wX.B3h94]fIq@Bs2-!("ɽ.nV;gdJsl`i 3PX",D_H4]|uє2PsT@FmvEVgm쩇Z?'';sQ\ wS~=};=}Y J 'ڒ;{tmn!.z4t7`6܆mQ/·X/;<,Mԕ*ԅ3w5:wqN^TVuX%@e"w[e0]Ht>6: @V_<&T1*n\3D}(Bbgw_d+ /{hlU#Eőisݠ6/3p8RSb h@׳'-0HKK9="k\,s"*зHlO8o| F(. jaF.S&eϜp/.⬡Hm8-KL?_+:\!](ސ穻&H8ƂuaD kyWڂVQ_S1BBIvZ0܊ /?U t!g"J]7q??)-#zւ/ɑ敲NNJCue=Pnrp5h=D:Kg<|hʹ:$¶yd+XZFAnF!1 be4kH&Jg6N4xE4ُNdu]U+3zBXj+wNGlr[oMK C(f0ӧ>I! j/Z8|t_}`!"q3js\gl"69 &[߼Meձm Ʌ9N/cQ<|ǶG;p Ԏ#quyZO>&2N@5,kx i5(f (qZs𓲛*yecpfđ 9ʤcX||72.q򥐬#3SWV?ljbMO&7Q$yL0CaRN=*&0g8Yho'eշr& XO֥LfmtjvuQ LX5߰zƀM4 *W|X>nER3֖!OCd,o~wu5vg!.CWAL\ ږjhQDx 42mvq׾G/^PKGSߵB _fU8otG1KY.ob)ĴN`V j<_]b`/#^<ƏgV!9@乙1 ~yșL98^*HG =yrJhg澘PcRn'?5<3=1Rm&uUyi%~S5 \94 karQc\[ğ0ﵛW9pl~veO3q3>sFE&c)A0;ߊ_xB'h=&3&^oAhhK̽#w1ЄgiF6RѼgMjv Re pH`s'7nVprl;$@zG55<#wˊ*l`0g([0aVJ?O"?i{ $v}g{x@uЬB0~h?%hZ̬_0ݳE["p+ʡht\V e\Eꪒ?G@Ԭ`Ko2{k9p;a#KqmO ^l%nOK8KbAZQLf($L=^ yԴuvW iHaQOV.oOԵgL7(tѝLDFR>!\?AtXN@ )L/!ȅ*^6! oHn O$tSgqAx5mMGgBX~>1VͦRSC{Q ҡTCEe#o".\_JO<{Z2qx$0ӌE@ЖH-/4JYEsU Xճ%p, ;-B%LxO)+&[i$)l~U( qOՒMDmfl3;ϭ[ا6\~ ?^K7Z0:!{نECkWYs^LӬm`ŢiZЬ{d6|7,zi#vGfH뻛=eI($)y!#x6m{:̖%d=H4Fux(zglcZ\O+V!fM=Qj7P^d?<怨AH8$ZdIڸnZO4_ `,RT&ڬ]= M3Qv#Ow̡`d2K~y N&|7|ٻv(Is%|z gYV-c!VeFI`yE. ޣ33K{b)6WQd"v/7 )$~yp 8 HGЁoJ#)g>Qnn~`9I// dtцE!< j%6 Ae|֥Hx;\^[e\a"V'3p3?ޑARWqDDсAP؞WRGQC+۹;cTcR԰J)|E LfY-=zH'r;m=ҟ8E12Y7$iӟ[-1ARS&ӜФm. nHEO=#Sz F>HWH~*- :pjPP:D#HlY'J9tp.@* M~pOOZfY2w>;贻Ly #"nF۹R <2mff}C*N0xsB&)]9 psPӢlñh ¡;JB{gIH3$&]V6 E8E넧"tR)wVZ" M[NYia=X ۢk W$^?GO݇Z< ds Q3x4Cˠ: ZуͩZ6b'" 4tRkX+ka߬+̸kA^+tkT75DH!׸Y G֜C,z/fC)8j`Bd"b'׬p2!OLu@WiHZbYgdh0V-a`IyS $G҄X&92 :aVpYߡ8Oo;҇ϑKi` H#~ ]%:>39G i]>z#w8*1ZNLR6rA ʆ\;UQ[{JS2nSB߻P5D`V o$KfNzsI=,<!ᵚ|;XA΋e1椧j&IsÿWC BȞ#HԢe%Xa3DVU'1bk}h͔:қy^ABbX&Rb^۫cU:A[ ##w9:ĺqYG{x>M]omI0' *˘;@:.?n '9ճ _}&|H7iKѐ!Mث,0ӸqZfxfԾ 7<6'hyp\J$04QHt` [ n2~>rHq#_f|oL#J>oW5fxb'S MިqtReLC58Rr8ޗ a׺u Rs‚5XeZK|7?|)0pFD-?Wʦ(|!`#ҙjuHkztxn耹T6a';#ك~̊[ z$i,_CݰQ0cO!A~v}wNܷ\4c+yW{R[PەF.l aʒI3M~SeznB1o?q -m]4e@5W&)w)K4d [hO#JV(p(J*|TF^#&N?`Ú%K9cS)ቾGC*Ę!Es:t=~K0bc5[Ŗ"u|;9gJ=&BZvVBft}<$[#iYH=߭tp8ˣu4h/vR%)3F&§'XUa? h(O %T B&ؿgt~4-j3c6Ԋ ֥C⪡xY ІpyoySMWR0*#F w\e?qp[gUbCku]&3Lo2KMV7#}4윿 L%O 6oI_˸}{$~܍B|c+\ƐهnSSQ'+D/́.|֨aed8yH.0rFڒqҲ DiRsH? rF/Q45$?U}vMEk|30fnڿJ@Zj < ͕H6qf&I0ISwg&zc C'AN >+ޒJ1LꍈI{^aP0к&Z+^͸1VFr 9|UvnaqW?߁&󔹀$RB>O= @!զ^#_6ձV M1l ,X&NJx8:"|W/gam^sQ6}/sw^BS'Z.Ia/ʓ'R)Ր270SצHx5Z9hfj ݚ}ө=lCyn:S:u<t)HGW,xǿT50 mJO+f[pSJi?X8rhFefY'c< z_7WZH>3^/ipd ; ]ovLܲxwB\c F3efˬ(ĵDn~rw=]\YPTZsҳav_cFܤWL[S%bC,E~KYz*fbsȍ$ou#d? BoR> ,D9vj@mĴԘhn/qUP,e?YR~-p2A6B›[P2=PIpظ޽Szg{\3[{MV,2qd.or.M{RFUl$1%2]"9#@j iN7yNk&™lzeQ! [C\.F!Y#$fK2E~-sιyy^ȗ\A dl#čןyX݂=ӝ0HT-͜4cP8ߛ>wL1S'ͼ[|A}N0 @s F/)AQ;/~2 >$W9G)y6 W JV;\OyFF[6YR| S77SҢT}7h&<69^OemhHo+sX<=E{ 4E;)sd\JeN?_YAn_fCȷ<# YŨ TL]"GHE9yG׊l8 V/WyRJ&xQrYA!NXw33Vz| ~ånAٷ*VHb!a5q,Q}ϔ%xʘ(qwrP2n6_xn#wLFS=d=ɭ*YjiGɣduLq3,i1Gcm(zho<~/!EM Nq^5xOtt%k[-^SU*˶<`gUo||aTAIi %tW:cfZz}A D)IȦBMEλAmЀMߧ2KXѸM(GDu/1+Nw ?쬎[9&?8@"9 ! w/AeQC:dP6 )^d¢ᑝИ;)BI[}>6w U}q pr0Psos(-00\tv%!DjFɯ l6_0 SD[ `y^d gz#hk~T"C$@$0 :ɻlk%Nǐ2_*z2"/&ͳ6>~TuWFRG,zFJv:? ¨L!cﻜG5}N,Y#Dt[* @Hӓ6&iHSiY|N)(95bX`=Ae$,r#;A24FŜ\˼2ev١X ԋ ^ZzsN" ۆ=uIZЭ 1e%Tz*ħ9$->qϵxiSkjB.|rG9Y4ÏQ }ib. ձuk, 7rLڿK Bsceodwd_*Pkզ%du'߹#d=OfxC yNFC77Ǖn~i vvqLHM&Q#cy<ҳbwu_:|±\̲3r g]`}733fώڕ<+ awEœԈgԖˈS(I&˜ŦW| 0V*Ө 1lHhԒ橆fR2J̓@$IF:xpsm;!`cϠ]b#!񘡴^!@6|&EOHU;ā[G4B@?[?vڋ;LS`m&ω R-nK` :k@jEY>ޞ/tG Uxa͢nK/ 1WK}t-:6 MUQ%MP%/3EAWr)Mqٍ@Mͱ(KkX rI9/ d>~cmǤ,0`xxh0Sͷ{-lч1 Ga!#7z?i8DTƒkynY.^+GSwVxs |^\#<k 4;6q3֦vv"{:š 5o=TK@'֢!~ gk 7I=gJU,LFʭpDKKei$@f@\گbSF -^7gQG(3\WЖqi+GbaON:t޻Tz ! Pv%a9{FiOXâk EHWC:8:k)P(!.1_ "#?><|IT]a90¬UIX0)4aA.2|txlSܱ^;N6p=:,LLN$8(2%L)A2"FH傊\Ap~K2I^{]{8]'|:QeGFoeWCdF~늑xvD2D@h~ Xk9~  p) zG-ҀƫΫ;Ά!RvHb݈]I3)5ߤ-s>]rz!XLs ȃ*TjP\і c%Kd< r$rUK3?P,>Q>->TKa݈䙘DNJVBK㠛MF6 6S=fsgm6k-D}c?98Je!W–ux!­/T9$%.PFCc >'*6w*N@z&Vf}>&\IvjWeקgH 1BydI}4e" 煦۰ Z}<~ipXSM'odj ʨk y4YT涰T_EϠu De g|JFYyݺG4kô$x/#1LzrX? keF&*D^R@EJ,q 0"Î;hSlʌ+˵‚sU[Yq̑{x?*JC*KgJmD8 ϯ9wGeOw-W>LEYCBkqdi 0ӥ8Ql +F vd"av4b# SQ~ͥ\U)kHe&E/搀ߦEQGH t7eDΊ`r% q=phu6HeRK '6jrDr&R8bb$SXNT>H.FkMmu;wBAG9[i);YGH5}C+$4үmbsF:tSmy,qܽhʸ|ح5Nnfho  2>T[ѐlI2+/5m_zSTn!.@7qc`iE{֏å۩Ğ>a4W<졦@.Ѱ`*.:c#vKJizu sE szH\B4F#%3F,BN>~; Y»\B@$m*Yx(aOYf`f7퍗]5<{?* |9W_iYq/=-8xyKMln}4qUd|𐟀^ϋdo&1'飐d аTl)7 +>gv /qÔxquy`4k!W=9ȡ@M^Hipi7B#V %s3a*8ߠ'C1U19zfvS̸'Op# dBUE,TgFh|Q>@#!jNQfRib!o4o < =R7- JXᗲ F(3hbmJ[_nv@dԅ kcJq͸Q9_zhc$1{'{GTIKαךltZG ^16y5)`\.x{gZq? `CZ 4% 5B(qɑ2܉$!RiKI6VDJD50qF6( T[[(AipRhQKP4Ct @0qJfaؔ+zBuT7K0fG-F8"+!-ݷp%nփnW4GxA j=nI3.>6XI# İ{a/@ߧr&@`h;4ð6Fe#L< +yYތ]v,7bűTbgre|(@W%0x/ >lw 39<,?0y576ox<&`rk!ŚzV;ʶ),*De) IHjˆhR\WE TyQ+hO̎HsgY0V3`fD4ZSW?6RO.:8|HDC9XB͵9/ebI#E;i $?ȥG(gˣ.F=E?_>lqd_ᣫԜpP8YrS_bWhE H1tJJ6պ\{/R gqi $}uXB|=|;oRxYQE ,_hV Fك;9"j#yIBHayhZuVT'9)AQ m!/Ďya~|;d -޶v7a[ -^wNJh-[jG/#9OZ!今 ܔ+MJJtJѣ|+ Z _=ApWB,K倔ڍ*w '-\`:.e>@xf)klB*LpG9}(ԘbmӰD{_a+U>m/W{u _79>MakZ$n>lw`j]Td*қ AsCuOJ&A ހU>L ^r%`&Ju?SJ~1$ e "m372= sCU@wi#!54FZ.:>X!bC)^LO7d $(N^爧ITc~@ rt\<v6/oՎ*h$$$ EE )v6%LИ7*I$D \(LWhZ ND*BgUͷP6j$CW uDe[0.`cS);\FOCp]:Rs!s\[`R86_ք'\*D^c(BkF"=>B?jY1Q_xRw"&ZH0fF ?Y:-tՂbc.q^fkn`xFvp(8C JiߨхS]hLj<xݳJ)7;?˨+Г oޕmI_uBvbTzȁ"QJA`c4BSAZ")j#c8U ߜc㉈#&֩5SLb8&*5 ?3fFpIj)2&ۊ$( ?i0}I aΟ"@G#smjPn]Yǟ /48DsV}FZsTܟ 1Y. og)WF>y{"mR !Y10*)U ߍ5G*w`c=ި=k,d$g. (t,3TI"?HuE:7qćjp9 3Jc@S\=ȍݾ!;YM̷p1&,=oI.s9eU ) [_ɗ Ϧ pl\]PЅL-c+Qǐ r =zJQ~'DIi<ڪ9R?\: X r@ގ[hwH1|s BJ`V!;epMZM$f6$t\^F/ݝ\w:é/h0U=*q?,>3oj[d {~k7VZ=@An9#m6͚a|Õ=GYA.%s{fqA3' ۪Ÿ h)`p6eo'8qqitu!xrMPaiW?/Y MimU_'8UWmW,*ymMߝ#di|P,7J~XqmA+O{6BLJ o{ ^VYQ=-|qzr=s\jb,L 1Hج@* _X=b8ֻǼd-*Fj1+j/ś}F>|@ÃMRbpEi›׮(a#8LtHN"U#^$XEo#[/b]o+RWI#ivسA~50}\3㕰=\FIF2F \ڴ9U[x6/ajܓ)f3  X%j${L|0EdHU_NJnR*>%!?GS)9T.uURA.YE![ՂrV@T)6T+S8iHvg"XP=d8KWrCehxwb73SeZ xW%d[{gec= Ǔt2j. g$rr}>~~+ek[-, F`w{æ.%&lu2%nA.냋?_P1uMxwZÓi9Kex>Ht}؝q8KOQ~:5edbɵ7%Dvj5b,٫𻉝0]5)=orץUհF!wcď>vYeux[QPFG]Vz 5${p(d>T* I$Ȣ[܉ycCYf&:[ _t7g(E_;cahB7fװ74AXĉbh˗IBYE,'n`҈X\č@J?"AixIuֱ,!]6ˣ}M((suPЈS%CZ\?XgJ_]W,Ds*DmW05[Aq!ϒF^t@yNB5,Y]/rJrZ2h1U2ׁGRCN62t qIx>*;h[7uۉu5FU,[l1@R (Rfu~B$T ҉Ϥ$\Hf>BaBB te @_O␋Y^n^oMhǕN_vӮwRqzN+s(}輝Eq`\gBzQ\oSYOU-#֚G Prd5bB~_ʇohzrq21E3GVHDPzpS䲐`g83 ]ۑ>cfCčv'AQ ZRyL)\%K3i=x71* fquvݕ d_@>חTC  !-׌x˚z`6Ks,u͇wՋQ݉s-&Ek13(bOqPs3d>GCbbYeu-Z, #!s` ̋_TjWێ6?UlQ) See4yȲLu`YnH"ta46D԰EiĎ+EΒ ЎI2~;`Z?$%M\ N]/V2RUtr Re-/*2\b#s& dj"7+Ǎc}#ӱ7*ƶEZ; )]#$?%fAvХ0#M3^!ݠCa0;[m:[pRәclAZFN" ܠIB-pH 0X6FPcM` z|*RyR+zSeʠwbkT6N<Ii8-՜{9K2~,򍜬+tR#SX8"_K)|"jusJq\i<'C*I$R,9Q?e;t7tj?sߪz? e`m`B\e.n|q?$ %R yDjO!#}rK\@䃢 agml+a:M9+d;gy}AIXwI/'1 +Va*MJgXI%.-i.X#P)T ,T):ER~@gp52Uhؙt7IDmMH>rW D6ck9\!kG󻺢 mi oz!lcE[9ǵ :jC6 OUsmshY}'[gp :չux_Y`rC. ٤OJ%leM"m r_7i&-={Cy E;5y3<2GiE2 x&20YӈBC[bE*Wæu/5jWtާug,'j?ʘrF5/D"XƵ2^friUg433Jפ{3JEvQvi"LE5:xڂgl'؅Kېgq@U$V F޽~a3G$#/ sK΃52*Ģ֥ erU0xu"o`XHz4MMKsiNKE퓻w=Fbc?A<P_pCCi+^slaYSwX}> uyo (Xyxor_zV@^=rTeUSFVi;ΡTtm #3`أ}_"KNFn rT=#zg>nLt {TA^"'9(9LidG/?4z0wSgU,[.P#O镉8lן%iVՌ0P M(u5i_L󗇘MUQ?0!$o v,Á,ٝv ;Se,'`4JXTa波.[{OU]LH/˕aLlqz$3PuBHD+r^|p"%`FѥCSzYUPJd *C#5M=7N9%]RjvPjQ ҊG6Y*X,*99)~Ol-3 = 2OmU7egm(ۮ̈*ʁ]،I̩c/^M]߬&Aנ6Ù+sq y2 c^>WW):š!E2`$xUhT^e>TRH9 8Dry0&8dt\yy`xl+cKµ՗_7i`ӌX'$𫪏TN 'A4~7Tw1C={/toQup;D8`֋4HO(z]\:ϘR.*yk0&UPn4[1FU2>bs@}^=IP}I['Q^i7_Q?-$eK.Q,CAqgȤRrNNz"NĔ ji^m' k"z۞{bpsKiiS0.ҍc@(R ^KC޿j:. f)N%o>ƍfJؗnO٪B$GkP:9L徖Hcǃ HXstve2эb"#Vpst/v+%7I]@vp޷*e&[몗i]W1leJE; 476E=JCG62ܹ\*d&cu4Ǥk(-TS貳E HWtO}*)hP>I'#7Z DHo,nvn S6՚&'Oq@5qk<-# &[^g%4g3h[ M< gmY2D!`fhјƏ X}-f+O][Qh 3w&<8VMf)t75hy=?sx&?{y!Q[fը'UKUX޿#Ew@Eʻ (/PN< * w&nsĕX(@qZ5>_t._ӛм*Q,^o4Uټ|\.UW8o$#uF"p,ry|\,7>RkyTw\*Y?s63:TccVI!rQGX Q<.;%zhKhiITm;ʹLAhy fb1(|[Ke#Vf93㰺i'_eym&ha*Y\/3?m$b[ƔKc'*}?;ڃXz@N툭$=i'͖ ~S-<9hFIP\~ZR9u)]Jez@>W80|~ڱs*c MHoG1^doQ}_no^s!-9CvN'W@РHv6yֱt Zq8bRJ?mQZ&c i+q5/S\^|_HfW;8 2ý_,rN02dҾ[Zˁg8 &'^Q&lJ]]x;LN>Qf5ZN"_r;rG=ڻ~* \Ҷ#W#nVRٞBqi BQN>J '&< 7? T$ 0MQ`3iʵF\sP"Ī_ -jG+cٮ-Z~I+k\Uc>\_Ctݿ@t NH xv,In#6cRdYL33 v mׂL$j`h+zVXZ77*N:_glEuǬp䣫rBnKثp[]dZqzO`u!pʿ yO-4ض8OǗTDp/rY%=J. z$h';VQ4`NCשS/|I&5|g2nk(7чN4C;!ܿ+7$39m~a d̔zAl>vP5o%M@;Z:"*U(%oCZ!l޷vڗWzmfG ۬p̓NbE MtW+놽"n7uFQ?JńlC+QMt~PL G 2X⬊:hԒ3m2҈xaa ,;eZ<3VtRa[)!VNB\7B7P `Uuf^ Jq$Eop5) S3<^t+$٤KG!o!o!\wi|\h{nxl'bR5crgl.ﳺ:"szz3k/!*Y-豃MM' ^Kx8%~fP\\޷vNK8'f\Ȇ_mk!ժ"'kMRra|{ :a7gs+2_Ŗ ?XO l۔-d&*^3Sɳu4LYCpq[~5y:1sa+Ϊ XA]Et붒%[~(cߙScH"*k2G%tyesUBA}<}ުXi;E0QR `*DY!A8ܤ/Z9#T.: 5x!Y|cl癥 Ǣbjvz;D狸%_tBP.*[ۉՒXzO=m17c'Ձk Wx= C'0Y0IBӐ EιUѤ۩:%."Xm2FȼŒg:7CSˡM9{_.xt>`p}C} *OVrɼj~*nM~[9 4'Tx,?TGHungγ }|!( ٞ- DG,Q6JH땺ҏ,l)jzy1XṥnY}E Ji|صE[xiFcEضe*b^He(9ǫl!}Z,*mF2LJ}:hZ[6GB*S)pT#;LJ~,VRNuط5X{X{΢v;-#CaIj82"UyS Ag#U)}8"Kqۙ:{~%Ŏ~W//z۷ʉں0z7׹B0z*yJ-~ !OGOd6c;I}ʹV84?TYY(.#ݢ@\Je}-?3'lFD0:c]X!W>I#zla ԍ[,2djSU#P40ODY˰eW+t_lcl@!7\(bmo_UbTX=QLR TRԭf ZqD^}1 VGCy(ϷK^qxD &ڽ=y擄Y81v $Ģ@=g5=_g=*Dh5E"Ƭԯ+B9cX&l/፱MbN<)A_jX[[Zj%Ta!POJWnS3.rn}yt^ UFfrk%Ve9pEEրNj7BfyGhO7Y)@2<$h!Qk&.RNą@aT i`opOM_wt\+o|?{azd# ǴC-J-FC,-WI'2@;1cϯq>27>z#Ϲr֦#7?cH09g>Oҁ:dYd#\E/mFCGX*4ޮ̆.[I^V-9R儚6.']t{|DT K baK|@ڛNMVTz)3}i$,gU2 q9M|{;@.W?Pm)2CK0eTuʎ*X‡O =lNL3|׍?'~uPgį9?[GI\aۍ)9Y"'^%kqRl莘Ⱥ07ĉ_U{?<֗8{ErF\ iy!hH[ڜG"t,_9Tp"TguY:zh2(/9qDs/G7qX+qrW:ݙ kO"1O(W]dƚ- {.@g[ʛ)_Cɱ}6D㗫K}tK_ ׬sKokqޞ5Yg=Y]J8'Z5S?1OA^Hi0Ccu\a0bB"c&Z"l;i#{1;\)Lس0~7]ڹ\!~<ۡBs&~oJ^qf]"١vKŘL[T%TuahӵD‚@20{-Xoc-NuxD| XK V 5\IΞR iL/ES:3Hr?N摻]?Ͼ)TS v.lT7EIOb<"a~qjCy$m(6+Zd@[3f)6F7:覠Rي`3^Vgāpna]V:U)FF O/)Bbz^%j/c!zr?8L@vXdz `CR^3*D:ޅ]"Hp5?W,puo7( +~ 8Lim01P͇@S8OK{Ԋsh3GZﯖ]Ҥxn= F롴jtJ(K"#kO>)e@CyB }Snr `/~ kQot˿/`6MCmryRƮ!K%.hiç{"9'rx:Cò^_fX?%7(ʲ[u9AR{ SbbY*<{fFFcN+h?]'aF 1,5pbKITWK9uRog;g vc|D[L0Zo1IX6L†pجJ/Rټ2j^ X5iAN:ϟYVfK'y"O 鹐Dr8A=\(*D /@/"SОAWɧsHܘs升X9C2nEs4""  gz ~q:s=CI/<RS?Hp#-U&Ep3+E 3V:KE:1eApEՊSd O/Vl0hQs` Gg8CUkD1UQZzTz'1m`V} |0& 6ΰ x6_8?AWM1]ș7o~~CedhgKP"8>iOHLt5ѫlȸYtb㩴 dFk>oK}Ud(d)s6fJ,n ԟRGK}ˋ7 9 fe:;Nؼ vkWm_0YUQPR I^7wW!mꞇ]koyOk2 P?Y!6AP1|swC~ T!4E-ߣגSw:5mW@R(n](SƢԾ7,v Cji[F;C+q@p:LkgP$H{KvLL. W9e U Nr-JB70Ϡʗ3$gkɽ9BecI5 JWD,tJpZ6]Xx'{E>XcOQy7pHc+m)ڝK8o3" w*oS>@N'rꑩ,[s{߰)2؃]MU`tPHWyt4[*䐩;w1I"݇ZߞOTԖ~R1N:,˳-+bۊ8Yum)p'wٿ *өl5TNE_ʲ=*dɬhSi _@qz6f,+..F'Qy<=7]wPy;GdXղ0"cFI]I=zRyU%%0Gȋx] [ .#j)Ns̜n:5kf߅?D&b ί;=W/焂8ύ0Ƚؚy jQ?=e\Od{Ѩ2v{ő -gzNĚլQRBi'"5^:ީнiK^]r;R`jzH=t^rAh<OB7mm [myuYӈ 9 E&Q*>g %,:fvO/zϚ+hh8UL\2W"9YP괹Séq˔z . r=ޭQ1:j(Z>`0/TeC建olU|e|RJg'(JOp~v>'|='Z~%0@EF$9O6ə- S=r*{a%ftYPW x.XIU,2N5oͤއbZ~bo. 3_q\eL!pEZgSi_] hk'R鋜7/3;x%GLE&:S8dGSʔȦ2uq0ΐJ֋6bV٪R9qbڴfxkJe&w gBh7)*otxh^sˀgxO]C'eX,XpRZn Vb@!Qyn|5PKwhyry!"&q[ |JU2$1eĥ-npD|b~emHW${fIf4%'.g3ZoT2e)t{z<{f:nST>g-3kU~-)N^%\?PϋF@m~7}g jfpa nla?`ű@_`:vy2&j<.T cj8ӯz@&W:1b%jWIqw2dB3풯84tz+ռ<\]Gr>&a:Ϗ'+/ 3e+JJȋDi7<˓Nn*P? CEI9f>$s|x=,Qֻ˼ZO%v]X2}BŭbO(7OT<℟4ƒJ1^,Wc3)$Ը;Gws(A=WBqg|o|- 5N6tP crTly蝜#Sz rp=uf,MP @@0:L嚩U +NcdNԽ̽4\F&1>Z>5I%z 4mA 32Gkذ, +z淙򅓑S)oJ;"ݵ<1JmE,i0hzc= :IG[W I;).R^R|5LnU`NjhqX_>ݝEB]:-}Ӽw*w]3N:7/\_]O{?o-BV vKke~A y|?O~nARxc[zDIkۜhQ2ۺ*׫wvjS\di:3Uxu^44~ فt+$ VHrP"HbHC8* BRΜZڼAb.n"jPnbU?.%R}! n9 { gV\A> Jf ,iͪb:p.[P9Y@HCIQ)Y\oVL0QdkcJ ްm~p)s2}=k`(S<,:\6LR0$:ڇ|FXlAVbWHvUs0Q)øTN2i zJ7,;4TkjAVTd&zS^'U#QeJPDg_zsƄ Y8N_M['5@^X_Ez-WnH+Xۚ)&Yaiz,0"((3Ķ$~FvtfInv^@\ɏ|"lI3zmgė]ތv$aWI6#&wYO۪(SXEQG 3:f8uFY2!ή0Ҿy+P-f[YNSvC)GUja)! @wafSҭ8- =\#$%%o*Рrãz.qi.8 EЏIjJ]hM -&9"Q>128舏芇n]0PIF O˅,AF_*еILY]z2W_p]#'3?I,B-Q'L2W1m؛$,I-; !f`ڭ͙q_=O2g@W:9kP&\n~8my-Ab:#\@>|Jr$X*&hpS_Oq_ xX& !*2:Z->5ŷ7=x.jCsK"(-bmej<򭼂8`Gn~g&nģʏRr^$a'$tި]-Vd\d3H\HGpm[l,hޟloYPi#>(h38LlH֗~G1\,,f!T$i2RPh(LJK1jtCqט6Js%ܹj;X]Qxe ?!u>.Y <,J!NmesT&H( oLq%)һ3W(=!=CQ]CNˉ?u1VVw)o@@i>6Z/O82 Ncb6'R{je鳑dA;ES%WF1CO}h_,rF|+~ @x;nlR߰m"Ѧz۾x"rBZpl4d^[r`r᝼  [bi*)񝘎?$a|!J9~s0N*a]/!|m(/<`@9+ /1V X:t7T")^, =,n6ax^( ׎E0ܐHLt`zV~']/Ǝtk"Ibr={K@L_.}qĄw^ e+q$|43W@?e=e#7셄٘ 5%sOpz;,3YDasBEj/_fYm.`Q|bf6WN ռ#c9E^ #:_*^:aE8#GK3%;G Fe1W 0c*rރDC2WjQD@"r(o'EKr ,ӡz^Q!7IGvI[׀sLrp1255>H#CD!Ls,轖Vqݘ5Ԥ7؇/-1 >#K笧%glWSG!JȆb.g rK4,L a-^EtFqX [|uL 2z?nRwn4<< 6ǢF}l]j5Q^MKEⓁo4AIDzZ9!tJ!~owpb yUr8rKN4ouZzN~]EbTX˪"fwăG`{x.LS=3DplGr"\5 Ip~tH\˼4P gdF>`UNΊZ؞~]zgQ9uR9_-]=?mF:~gtwaB+nmhX1vج8+˺PSUIm`Gv>2ƆX7Ңw'qڣDyjj^sU+?FTt}=}TxH\=\cFf=ݶ|tpΖ4p3vzҹ <*U<2Iw h`XVRnjF>359ïfth j~al>dn]#^k:+bO׉)⃓$Ty"'p[TN{4t#˝ÞKJ,0t'yvuf-@sqƹgv<$LrF_JM)%8.l !x\t|2tw,gHFb"356J,TGx p|$|Y8uGC7ڌmj:p>9'Xˡ]$B~0i$AZZu*μf?T'X oJ@@:0kj'lEOu-֛x;awƔʸ;0=Mu>'ۓ䧵e5ϭZ^ޣ)L98B43N }WebTZ\';kTb )1%)5w4Է.QKZTuHy@o~= #ui: R</jY#EKxw_<\& zrz?Z ڙRQ~F|60pT`GeX,C6sH2%znE=psh`LH̃XJbrkqvQμ3D vJ+.BPi-i\xB1X*mO1H2~^ C`Ca `0M(aq{<#hNϴ=Z&5lu3{pC)GG˲" wՙq2 jvz[#Z]Btz֍Cse/1L j:6֤>[)_){)eAVϹF8Q >]-(\Jh*yssOX8Rf$x|~0jzט$I-n x,Ե54HthVI-sEU͗de>wc8A׹?ecn{!=,kcC AVv쬲wylzx*s+묨A|*CU] 4X@uAxE?zOm겿&;#YXQD 뭨iȆjӴ`p a.i%h|ú8ex~d\fkr gL)karQA/@ <ÝԟhP%@opX2\t<({7bQ9s"~%"f<*!M>Q.` L믘Dx|"A0~DC B#Z"5N1_%cX3_nItPڶ3xe;Tښ t@ C<ڪjc0 ^hJwUc?{ `jhdL30&ayiI$yH:8MlV/8Qo{-E0 #T,2- 2M)#tGs~;)"Q>ugMl8;蚅k/P5wAg\kD ϪW FÕ>':C|LW MUwRcAWK %(e##>Jx9S -ko\n%5<ԠP\;\71wok$+Te_cw*43`FP(fjS3NUNXNh>תtWc5X w6K_ /e5Yd"{]lCC. #9 ]k~ʼn{]P!~Y^~-3׽irJ? /N/1-͆oF;sW2eNr)PeW) Z#Όr G}o5+H.v|*`I!?W6h[۵ I~Lfd6a?IEdKzPŭ*o+u,Ds 16g']A[g'mQ9R8>de_^Pduq_G,s-v')b}] 'Į7T`P;S_İ"a^Խ%b^i~_2#%z:J@A%DG\ә*񅮮'&v"jCSd\Mq.}ߌh9j"lތH1&{y+ykIW-Z ZeGo}OLKX|ţ=15{xà Ho &HP9xVTY)*7]㤼8Cl#SwK` K@͇T1s3.ź#Eٻ(ӕH)g}|{њouHt;4٦rc\ePu)ycДQl-@aj,!ʕ 6X&{r=*lJM>MArq[bmݩ`f&ގtmfM_LDGu8Z WDi9fPiqucoU[VZm%}3ir1JL=:%~ux#/oQ B|q " 4*1V]ŵ֩m}67#Hq.ͳUY]IK;xTFҴxz1xs'+X3La'lm$2;+ ܒ$kC>46T ?'4L EMpHr0#N}~ۑ5H,ֆx3W#W5-\fBfEp-p73LZlPn^{ԍ>@1hXiH&s''y[IcF]܈!~ ^JV93yC@΃GNHoYbEX3 =xDBf|&֮{J9&CC \#k|K$M9Q*؝t?~,|jk2 .5ݪcOSyWkgb;ho˘# oskhN& ΓzCe<_ n g +yz8i-6xK!Ix_׋5% _My%U#[Wn3f,sl(bM?y?OŻoWgoF!涿a]vv7lH@ 1T%H$nګpkkMC^(zwYd[=϶g{h5~k7ҝ"A>l 2 :"*J[?o<[S}6ߥDV~fe`84V;eBceT$DSq@q᭲|AVS/>Pb=[.h.+ ʜ|w'NsQ)QZx Y{19o^RlyY9X >ۗ <ƞ$!淭IVH-uH) ai(i0`قpf2~*ԯmtw)\?CAwW#6@jcQbu?/AU~{)dڢ˵LZ #赒B6c~~ǿuO[tr6;^[o2\NIYzZwU;tXa,B-|9w_x8duGGgs&{,dtjIݴCg& u?ePPng*m 2Gj8oc'ۻ%);$1j0r|!LgHp_; QUHcRD2/ g7.v`Yߗm_ڈt7AϪ0͸ 9%obֿ<5i/ %Z0'K߽EnOT8E8B콇z]MP<҄|O:ty`~oL|v}jpk9,/*9XZ`Z? &M~ǪpR|LRْN1*CE֮zPTME+v]R(ETMq]WN^+Y)ǜ?vYK<4n^[Z0Lip\dY8CyjLV/MLmwc~s6$!wxMovPpэsǑE-L(@=ly;L+uyq[5"(! ㄋUmCK 2[2>LKoh 0"ixB’QH:,,U-d>&2z)ޜ$nIJUip23 c."34d :~5 F˗kUOIC°˥Dj:enM )O0fc䞗G<68 Ije,6{]Gj2~+e~TR:J[Na>8D$v13($;b̦R'w_#~kð7/(AKx٬ݩkI2׬\J߮ 2PU1v 08y{t"rpn)FPo:͌iUI9)HwZ#ь$lHx 'zB-;'9vIXB=݀\&,-W~sf嚡D.dWbo'hwj2*&F?l}d$g^zh+xԑ[v 8 ,֙Janl6jё]rMܠ0x U n_r=Z 6>f RP$zW茞3휘wB.1t([xqj"˩,[ƉJo hѣoO\x9:͒552-fw^]x +"B4SOۄM1zw샠EWO"V#n(gRZxb?I/0Kw|D=2 )PsΚ)}kx3X~cYu[z{o ZX-Zqc$1 P|PakgN;IU5_9 ((}pނ1 R^Ueej՝ڎ570d.MPڤ9ekϟT YqQj^rjrXy 3‘it*p>w hX ˭ͱ%WR$ȌQv3:)[FH tl`ɼ?%JeޓXbtiZXWRqIʠ!V%g++{SD<дۅ25^D 5x;LMj`ĪP,]0o ź1eE H ?Hd85{{objzp%g*BP}Eߋ=ߢ2]kU2ދoK JM$3\2k| qƾϹa+?޳i2 @ tZ2oflAA{ [5ǵ**82Eӓ`ӬjW 7bƒtSZ+2m c5"@Psqr }ͩ@trșX$ 3ROso:-qu5@ЏiY5JsT9I1;\]XAo'Bd\^jKn=2ȍ]/LN8WRʺg)+7oj%Z.4`% YvBgI 5VZ}ʹԉ ql#!/s Eʟ,Ÿ0.AGyqRKiR.TUЊȥUìoK]fnbLQ?Qj=#Pn!gjY8[$tϑ30EIBN֬]3sLuM= -,1$%2Kp+[u`RivbW)l3ܨr4}[OD h3wӑ tkQʢa17Toz͠" :倒 nl/k&~=g,-+w{o3⟸Inmd桭ZrI -gnB%5m\^)5|+۹!{ cڒ3rV&ʥ BC nK eRlwfۖ.V`صƳ(_62oAFN δ%#w/-`GiQݷ[VZ>D!w)|\#HhM'Oǿ nJ6+g=,@Adķ~=?h97T-d%9:]v)Zjz3GņNqCnw̭ͮHf8y4}u*p}klD s>T;)7#}ey9:A F#i/u^^A0@! =kxnxM8ɏh"#څP,|{KJꎕҚ#UQ @d]zCav^ɸ:7g kц&w5C#A#x4ԏ>CF |4ڑpO}`j= bVt*So`ǔ쟀@:Ɂu|.evyp:/<6zgAä,nRKr@9YXN meJ"=pa@2X9ߖ^ 3MHQtN(mC ; s>6Uk_5t2|'G5u^΃zGAzq*rC_4Q}&&5q0̹;,RfnM)R* ma# 0l򉥶|_z{UɃ}E{T }]WܦO MK6r*•ّCw@HC*d糅/6Tf)ƨD<:ỳ|*^hǫ>a{K+--(/v gbnUQԱ@So!xu>:ӡG ЍJ glRQs{ﻲ],dW˭ - L\lub[Qy RHL(|nnʣ|c̾!2>pMLcZ#&vQJtAm.ߟ:eD9 M$_Jzę9-pfrscgyhXC߰pxLAb)rYjꐜ܌ =Rm| FZ59$@e'o GHU] S=ޭ%C דgj&FЊ+z hc&Z㵒r{_b \ IԚBj9 xMLMήsq]4y_jt@~}(G7=iI'rKǛg $5l\I 1ܯyע̠sWZ<5 hDžԭ<`ŝD D-%0/ 13P!YikE J5OٻhGq'hvqKRPTT]nN-hrmnXno)uC}εjڜ,% U{&Žp0a]SpnW l8ْ^!1!D؅M quxr}c߆V=au:8aJTMe OV@n_1_'a<)g.71Y;DwZ97pf_TE! .Ū54*+gUuGXYJ@=G#bTAlLstzcCCź}8P hn5ҥ(-Zɤ]+ KxJQ O %EiVg}y,BnFbcY.bp| `>3WV%JJ]|Eք&%\[\祉y~e dSf)(I*Rj鱸vkyp'c''sYD`Xutֹs_2' Ażq]U(\ [?Xت~P+n['GI?X'Su @r!\rXM,VWQH%E?2&TXk$QKRT8"ɋFC)WSрt(.ZǦC`k?A_-;&)ܕY9;NgEi\Z[d QC<e$ی eؾ4w,Np%>-32zSp!7L7># CZuH͵Cmd >E0+Mϋ%RXzLRp4|Xh_pC)@7AHE'ǨTsP8 G7m[ڲw̿+SRX%.T>, &rKB(o$X+~ ALTKʟ  &OskER4XyI٧n1~Ka*~>riբrIW6b7  X PsPnճF<f 1@/tŲl}\7`gL[Ê5d#l1vD8y9#{c@AyV*j+YaC1uSڌЏ,]g$Ϲx VB7r3Ӻln`lQ5b~|oI 13`J~7BIVbS}N5K'\8͒kmH ͌*=NDB4 rU[X-n_Y) ѺDJzl㈁G5^_Rh>#($nE bSyrkhVY{N ;KC+-X8"65ΕAl mZWK:[&[MkI`C;q9x9:K>&T|{ɸuPv!<.8Do+ڏuR9W3g-;ycgAK˰?%,&bQY'УNdAq *7*"\b@JJqY3eѹ/Eaa2RSb$"f]̞T0F-xrݸ!| < r{sΙWp%U ę`$|6 %VV.n'\w][7# rAuK+ZV64 w2.'m|7 ,d(J$\uff:KE"5g$WnNpYF{^\FNs]RǑ L+F>11R-_nM{bsE蹕 ^C(܁l*X@¥"HT,uWJ$q7&//otj\:_Β¼aXe_ƐB&p.ꬁ<_ KV/}O2ne#ؘDHM _2`J`CAWX?i.mϙj9шnzM\jF֌Ur߱2t4 `Y\Lbb*hpJ'F?p袉-n:I8@VUYzBf@qϹߐPQ3 +Ftdwj[c}G$9ʖs4X~V'S7Oz++p "aFJk)juKKt}z+uդ Lyrh 3p \hO!"*.>ܶ` M6jqjm,(}'[}D';(gymK>\6*U8E#nM$@?B [NF#xHIbG?eƒRO8GFG{ Ƨ @0\>>uTjx91Y˭vܽ`ERM2e$HG UJ &tP"4!j#M }OQk6XBv@T;* L.wϯ}drk "4V!RqAЊOZ0"?z:Saa7eH<#8'3EInQN^]]_O -J `R6/LS;y;{XF/?c>2lRЉ0ĕyjv x;p7u62eUK> 3z(Enʷh,o%6jxG!kLM 0%@a&|Q0IXM-@FS#ժ[fUg|䙹&i}]ֆ$9깴/f#PЙr E>qa_R@َAsh2y&׉VBDeb3U#%λ\a5|͈?gob69u 9W#%[ ŷ1, k[H`i^ _"T6 xzҸ|.<Vx\drcn&&3Tvi(* R*ߢq0{yd!0[)%<%Ll=(%$'zwslb w%a"b*5Q Cz9f"b!}pccCAd+;'~.PR@s D#)yR2+) D:,)s<|=,7_`ss JbӅ%ejԻWޫAo>@%P*w%N U+շ~uZX,z.KtY0::5 xRW;*ZR{`Ik%)hV7%oFn$IHj|_r>]wu'7d]_0D\:&rH@fW+x|Z:=D+g2=_mypKWM୤TP6b FAviԇkEzJ7%D'1~? $^>amӟ hB*'iNJWdRjN]UMrM!UOnJ'6qu&&;!G[KJƄf:&0ɀ1~p}A| hּApE\&e2Aޘ=Q&NPKُem5o?R(ll|(,P!͘=PQdMZb@_RA!k^,uYrH9z2YƁsy`  ܍2] iΞfi?!N60 f2^ǍsGwF).2Vc^L,4S?eoHMWXH7u g5IdwXh_jIA()TjۣU1?e>x=K<MlOݞNU>l`el7޷"޴e^!1 mE6VA ^ֽM)%8_gsNPwDġй{am8ޚöjVsx!LY{!xVB62&lq^hj ByQqJMu "-:49SC \ԫ 蛪+ꫬ5^ ~nʭM#ζS+*,z "/1ZڐĻ#QY0Ɓ~p~ToRAh/춁O<^WZ(֛3oL5X=W b$ښ}қ4$18w0"+PiT5hXpwK1Q]LM|p6-g4c˷q^ :f'SJgE:=ZVF{Ŗ1/95 ^7 KJ%%0+afhA ʗ0fАQ:B8fjӮ}:Q.ㆪނ$aL@N2-x+NKy $Й`wUƗm]&&o^M:mk f~fR#Хj%zaT?pudu8`mG-ˣQџ{!=#6*&wP`86XC bc lszmRu*R7.35lo_(T{mԕT^"~J0?iTzto H- q97J_?ԴU O:<|?;6ƽ`=^#1Xw.e  "[蛼8' ]:]Xو!$O vX7*FO|nw3r3VD-濿$#`Or]u)n>Qlnzw79nm)JUAGKˊ&:Gqopa&qi {MrY?`,OÈfZu"E&NAt+/-Z[)ҍII9' 0≊WD4@v["{%NJ}'8GO͐|j؅ 4lk³tΧ СY5a1vYZ|^: =[!M.Zxǃq%T'yxUFo@lSa2Q'W/<~-R&4oU"sEy&Tq}t+1vadWAdiJx`mʎnEŜܽTWǢY2 cK]cͰ jBԿNB2c-\8nOdWA o.tT3=&RI{;k-S ͲQiD;& e] d(I3@Bv]@~z*iEG Knj= `C[ʕy?6>!.IE4g FpʣB"}"qi1 IxyFuWy)aZ 3 Lpp@ =%RyN$LEK{.?>ACGG~գDo?OչI/vjNjhn.˪Hs߸n燣+:n)RCAƮRୃr6%̹J碇Y Q];%5BtZñ)/.7ësg|o okG,:@M1O[A!v<z&U&leOsjbRSM)Mt)tɛV/X4 HRa)tt)(ܚPZ1@Kאp=qgw>Ubo CHuyk&Y]@WǏu3`9Ń޳]@s##rU -їփV&4e?y ^"iT9c}y c'F5`ZLcR4@$.je/@ 4dp3ap&oQ?.seKpgJRw5T풏n h0,aw2}\hAՔ (')#(ijv|FIsѡdCJ`¬$[ww.2"NJͿGnc*\rsXQ;TքEվ]O_R;B{ex`ūV1uЧ=KԓȒ1\K>& pېeΧP O׊OI  P5UtMgu\3)s ׯ!g|¸'I U:n$RξKU[%6b8ӢD@ni;nDׁd^Vf΀.ߋJ 1*5u!=akU$ PyxU.:k/ru9i @ 瞰y?F=EdґGh[e(U4f V.:x}h0N/yׁW8R6Մ,;*׌л/C~zX?!{ F/`.j9w+6Hx:,JoѷH*`ƋϬzDQٴc37 1evNO N` cVsAMޑlf{ng@e]6A\o.=Qq#X}(>ow@U.*4iGss頾 x1xc anPʅ-}iF , $|1G;D}a:A/A&D~P? 0`1CUayBH,~,_^s`x8ŏ_7w_%|ѻ"h0QԢ]} .)z/X.R:tD˻ 5{!YG*X3O.6ݱQ'n":fXg+GkZ\8&q[O|[KT28Wv4׏b\ 8{KIts1 H{G#t}‡fEmeuZʲڲK.~0d Xma˳b&tg z.\G,wfyʔyʑF蚳OCxU=FZE,r^Nm SCQ2\橔ȢG.dLt^m!>Z +{r S8]wYC$4m+ٶ:іe4"1ٴxJU3*/퓷GXsdP$7%LKY&M< },2K !Bi4Eo *WxdGm?ysz6Wĕ]ɔTjY2wSyvڲѽ:&" ׉a{ YTJ0VKTDqO`6թ%ϕ(] b iZjg x}aK/zxr`a{/[%$l47P궴AtЀ!):|Vu^{&±%ElccCϊ%jn<6}v>5_{AIioϭ֣{JmGPZZ&E VF-bw:y?blj;oB7P:k⚳we->`<,m֣<e;!ޒGK+G52SMLxum=x#M ; *$F/Tea+UVP`Rkm§gXz.ڣ3@z2[;2VkTO˘SYd#F-RuWQMlgl0|'69cmYLĂZu:Ak4H_ldWv.'|o(֘v7M豅|Hz: &/U 6dR1֗4@d頥H)'~=p[C>22G = j(_T]?Wߘ> q.5γ"sԴiȘJ\u᥼4OF=*БעokftD"ޱv$T݂-8D5 HI[%ϯP"G"70Op!ȕ/ 8#λ:IjV2 sZƊO 弲8kD/C3= ͭ8a1?B/ѯ{t 1|c?`0ua-~6gM Abs$kϴY?P:3 qBK%" ( 1khkM,\aaaxrWEh}{A8o^QyԵF+=-Ҕ:tR7y7-woڗk*ZX;W%dA,)jIrl}NVg:0&Ky!n+#ޖ$I8妎K6ʑgeuTGء^E~adK.Z«\(E!ϒ Jj,P: Ec'Id tl %Es BmBr.) cPyz/w޶bM:gt/x4>m]< !NEvbS&Vˈ:@1|Y-Ww?X#t[ҍO#sYUBab%I  %UZr0R+.'Tw9MR(x4e{?0M^黑#Oxғ6%7e"LiD׶SOIP1XXtV˄g3Gv>[ $6݆I3 |٭EdaJq+uh TI&{RV|wYdJq uz_2ߕQHd/N!jgDJW j 9(RZ)PJ#gVjYO#zXT`}vuR *|$|*-WXWY}6TOL8c6]ہ$ ]n.s' ZWQ0vjtRj5s?((hma.f$?t{(O.QZ w%A}Q;׫I!x;wjQ6DjWOҊu;Qox? )/DZ䲽k!TR *NȊO ofGf* *K+}Yd6yAcݗ]V;gþA.ЇrX79$( ;kFKiW]21i{Έj/,hlFɺ8&_ =z ʃ3` IgQIbAa7΂e1̤!0 CFэ o(̀\G1 ZHnȞ>^{ Hl@eZe SiYDGdHr>-9p쿛|gDII/xQɏ_H;?է%nF+hngpecV7H' 4S"3t[ڃKϿGfTs|h4!%0B {=5S"< {s"t[-U䨺4eVXu0#n`jA1/p/)8-'6qXѕ[c]s iϿD >!pSx |x-!B"]N7h@&Z ,ĺB0z"x\SQ>D. C&‚hvQ\@x?Aq+Ll(sLȳ1q;ӊ&U6o \n2_4#bV!]ɹNJEٱ(~Nlb/XL$[V8b9-gn|X5U*}> WfUER Uܫcq[k1~1QdC䬼*m|/"ԧFscrqLx6 TŶb,;2F.n5jxrS #C3cN dB+MX~?d?+QޕQңf)IlՔ7Lq)Q"9_0 ۗrtOmBLSSϤ|i%6睳{Fb݂.Aur,Eݤt}.l>Gw;#M(Q}r#<9VeȚ-ϛ3>:C;kG| [Q6|BLHڰ%lYfԚ]ԬN@w~Mg/T϶cյ> œ=n0{)IDj9ґökC& ŤҨNxbNHG/6a1%GwZ99jZD"aT rR[ khp<)6R1>P m5<:q[#KW=/eZF# do/\tQW31{|d:)4$ ͮ]\o* % 2!`-@6-pbL؏jHB9 `%7Fy^Aͨ-n?b9]q^FF]SLy64-(^g޷<+T PS>ْc㦛L!o-BK4qa9hU2Y/|NpVg!żvD71C@d?%&+#M-*`=544ҘtWDӰ\~Fv#13Gj/d1AǜE_RZ; iof3^H!<ωz-1b_c?/$x!I?F.`UdNE09P/}4p1kjJS`P =O%f"6^/Úoa^UQ.jN)ɚm맺\jͧ؇6dU?jj [}>B7Cu _ݑ蕟'/5H㴟ndp}Tm5]wYsnLN5.P,FWF"_msɥ9XO57a!Y Gcm`r`xꛘ~tnr,nߎ\D\U% )zjyDz$i{J@cϕ䃣CǓ_✚|4f+`#pԼ0k#&,l_+WXG5Gi]Zy17ctrc<{ϋ[,D"RxC" LTL3Dw@@U#ۉTgJ)nC شnϢB'O /Fʵ>$7俕nS4qo[ }ÂMy0y .ႢK cxshXET);߂ჶO%ToZ,B _[(H (Py"(gw>] R JD%YBgvǒ!؋LE-۞~gq<';{C7FC'$(E.yYO/ ,*hanS+@Ҧ*Hrdܽ^9N s>2).E˞xb跹3DZ#ň\LC\[缋gI^&+ u%84r`=onuF9A"*ڍkR%D2\VWH`"0"~LJ`<—?qgm|XLz Ʃ#(:mD,91!?Pt<v3&Rϐ[C(' )hDC]-V˿I_"?z/섗 Qi4G_j5U)iN{1,%΋~2[E{pFUf˿4pzJ@︥z01wGUl9 >o 8A/z~X6'b&f޽r| \<Ί0#MJ5H!] 4,D:Dd-_(?n^=a9z`LSJ >ЋOa袐t bdR;n`zV|=, FsV,+k2|*3YlS+K䢛bT,*4c[,)RvOdp#nUNtwcw64c~%upD+4vk8{yH@ܵ}ףlB;6 bߎdhHjdo6N'._ Oǭ)rRqռc\(BFzOn3">歛Nɽvie%"D{%I-$Bقß9ĺ!rM־ Yy@ƫY?z@4V% zU(^,ܩ,4vL6 BV f Ke~9+r$XUyNf {Jr3!48 r~P]3!'`(cqJ*ҿou Gu&V{r<ޠH~ Nk>JhD̎asl++_cp/-Ps{UR_~ $iH5fl pQ"7]P)KHa&—IB|& y'B-(/ q|nG8Y(Reқ^{3l^_r+q\hRa)47y@&P- Zfg*z͌lL)0`$ir<ԍ\G;T%}57>%lG6@dcVRyqJ2U$1@b./Sh+Pl`etXX.fYK5:;?ޮ_,j]tsm'AdD5€eFzL$f{ …lk^'0J*\b7#ZS,S)7d waa (K؉sᩛz&% D1W|gӜ]،#VTOV3">{ B/r%"J0 S6~UAGĬ܅zM] r̈c O#'5H5XsU_IL1Ź\?KF 1\EYfiJ zcUȟ v$ Z7A{ ~È}4>KBi[jۡz)ꘖ8ݱOEz@ ᲾF[avx9Fa)xBINbaP~3y`b;csi ~ 37zΈT2l$lr/m^:Pz((Y޼oO2 XҼv'9DW`uP'MhϿB/H]vq h<Ov+S-52?Ѻvctב9;sp*i]"D9SjC//~°wbzmen1?uVE7EJ&@GxHQng+h.a#,D;~WqH4)p};1-$ q-Pj{w d| B Sr^:KL8YpDW:V~M%bc!0hǔ:\հqˊhZհ % NTQ!`pC7\pT~K2GՆBWk+amQ j'F>ꌢἝ<[jtsj @Yk7ъWe'1,@S=6iZUTݶl yɽ\aJ؜?WDmC{,:\p'%1/Rh2o\kj |*Ya BCkvLJA{7[D .F,>SMH|K#$h@SQw"-Oq򯃩Wa uB&n*WIWڙA8d\jl$>V.ܓ "Ϸ~<{Bv¢Ts`q&ndaҾmݧ/fR(/y{jWnj뼫R44wAQ.wWʊ6nb9=Ğ? 5$E#kQ_΋tOMch 'Qowpu]m֨@-r:,㐏{DEG!&sBbHWFT.9BvnvUYh&PwFuh`%XDh&#Q @0$M2Em8+'ⱞf|[sdg:Q7dSx݆9]Al ܘUe1>[?)mAX *>/f9q%ɰЈ!݉h;Dk,ort Z[ݦrEN@3{XgX14"+=#B5R3h]p7"PF#w^##6< ςuuVi4 &`9 @yYġ^/@խOn4+Dyw-.YʭF,bx҆"#} bTrh?New9`! BlcixvOR'61u.r}5qd4]xDg֗IcyIVŕquׁSJEyH jwxs0sK1 ev?Q$`9VvgZ"F9U;v(w Hga0W"  as\0rQ0}^W;V[Ck6;$} L8eJvJOqF@jeJm,dwI`϶a1 u2ৣhKʂ!}y,ux]\wK ] 30-3y0,,oo%fNh* !&oNQ~XRIHԏՍP7mhM 511ywˍrE;N)lrت'lZywMdwdtcJt퀚:= !zfArynVpuO2!#MU'\#b0=5xKlbLĕo_$1ճV PsV!~/* P"/(Z,c?kEsso>γR3Ury9x%nd)L[XD}EV"R7Cȭ x?gƪ䌟_wAkvX䍔FE>)`R^Y+KROȊ,!vZj{j60 .G`J'grh~̧(F㎼'K<ԧT*.u!i<ϖ{l}dpqN^=b,@_3Sfbu4R4`ik'$\i9.B1H˝o!%$I_\@f7drKy}|Ɛw}`}ЫHg"k2H{2r rRm(75RS̍3@5@Կ(C@<0:ӫ!!?"19/6* !nj )m]AZLN=#02Ʈ$'CH7D϶ aobɠZj{5mZXtnD}t/yh@K6,w8XL8d`XDt-V݅opl0=Ti[ig;U{\.ւwh/Ï C螸1),t`eCSU4K dx4('wc:oРd_ ku|O Jj㠶QOZ\ !-kb|Ir冫y\Y&o,)VekUrOP/PM+#Qv,g~)2b (̧/g FUq]hң{w;q!ÚiBBc3c*e6 NJ[*~2yxfi?YAhp⎶_3UܕjW hCO,@X;Qpv@:G+BnpKSUHA{`jr-ȣ;{"B?]lådQ_ GY_jኯ} P5:C;Bb:I"8#c>FBv_l nͯaX!F{P./GoۚFw_yr<9``RW„zDDaft#E'sؤѽgJHz@zGUP=8:uyMq6zGũ[`[G,ٙf6 qPSx-5 r:~T4%xɖv}R3௻^"9j"mUcoOClfBͭ>(֮}?m_c&XW:*>CL? ~֑bVvW3ߧ.4lhtPn!ktRI1E[9̪7\""p$u g K U¬jf#-)OHw̷zs φ>k@ 7~;em\n*cFQtrTCbE>})# 0JZZ<; \]P?+zTf'cj3YQ+c+xh|3eL3: 2LT (ԦZFYs,<Oy"7c2m[-vv2adcZ AMO$8d($DZ}|m` +ݶfuΥ t;#c޷z +s唼W j%QF.O׿!H>WFunOy kڃ,?u}?#Y ä3 [fjk%dak#(4w6yܡ|q\ г(C^|;ң07D}W3f'o,"ߗ AcaH\^ybN }ˤ  ;>ۄؙwMgǸ)vUbT̺F/ "e#+Rj6$p( f" W;Y[OtCNj460Q6yh4~w4qaZd_G#cUq2# 3ZhM0CnIIЫVcL41L_G4Ke _\ Zu/K@j`L:VGe3#Ȗ}cK9JQ&Z unJ1jz@/h+@8Y*%mnRiX{ MQΠ2qN"MRPҧ<IuEmF8(tPA֒43m6GOܷc7>+mˋaOk/6ye0 IT$Rbp~p:ձOyt8ӌft33G<]e ԝD!)~|_lQm]-b>*^.;JVxZ۬z籋zP# CCf6r)G(^Gkt3 {EAG޽SjNRF2Ftie ' tOC57(s%GAG"~u.IsfT(uQzϯ 1d8tn[;[qxԎ .S7ʰ*AӘ|u:iNXsonw0Lxm؏UYK|.b@qX^4wC3?C?]'uCn:j A IcKv =ȴw<1\@_^] #eg& :jnrƣ$m\9ܫEPvt4t} _R?gR@,D8i]W(rk}nl+YWu~6 x+"42ďоjz::AY; ɂ;N_Is>eEsTOz5ڊu[`l>+w0Ce @} ʽUB 8o_ 0'a3 mA0t5}w'Aɿp+S4O ^pL"LXuYQ^ *afYTnM,U5; 0t} ieьbQ%E ΰgmoyV~ r^ j>06UWgYXa4\ߺl"}T?lTmV{9wV ݘOqu'lc@z%`IӊIw9Sۮ ^p(Xon2Nd'XetiAX>~IQaNn;w&ZǼXf  ({I\xECq,U@{ wG_焋3٤[F Fbe6N&%wOc `-S T-1"Z[ոHhJR kZ#JasU(l$-֏>ڎfBL6ATrIZx+xo<l-:pl.xp4 "q+~K$ʪQk(E91P#Wvn>@c.0T1/t2rYnj^+C/%4W>he"/X*oZ7p>S-@jfy}&6ZFҾO},E?nti.?iԬVWIow(vjL2](K~O7hfiХXj}9NJn9W<=_jב'aA{s,%9s/'JS.>lQ _r+Y*_hNpѼpEt6ҊA,"I[+hcf*ͯG0Yر4F1dѶ};+rrWcވ C7IoutT5O3I܅9=4BIQR8:P)ďˢS>m}e-Jn~&s[P>(#6,B(C,g%bРyD$,I[Ub:wQ74, f G-4敲";WʉˆRTn)t;43DӯhjkY(}E CL29E-{vPGl<ףʂ;,z?r[T˝dVk\mo?*9>`x|@`&ZDI*]It k= Z|T%*[_Ty|[9ۃ8@@ 9#$4#Uˢf;%k~{㭆_J]Z3@5(\ Fإ=lL̀b1kZerbStF|խnp9j$/^3`LH:d.Y|'tj6 ȯW0(āYL&Z4) o3 asb1C5Zr0"H+f[o,9|W+R%o9(l]r2D8y 1#Vhf0:aXiyIVsl3M]gs^Ua:NWRV!2<_钳,,ɬ|8|o_8;7dHפ+>+Þ 8W[ya.9@RmϕЫb*l*"OӈCZRB?#ńfCZ'*{8tefɭf} p~Q=krb a\;1qӿOx}ZUEjnzʜIP >KCc#%(o疙:Zltz:wJK}k^3b C':8]#0Le`GlZu~O ԢwިLqZ{CX 2*1ŌHUfRndOhg#3^lHU6.,|=s1bC- 4QēAe$ońUh &xoe@}[" 0hUf1.sv`00AcEj 84 v%%ÌJSBdwwvLrhp›pH*)@8hEI(,K ۚqoGTdaChyڛ]-w1RK&;́(U%2)2pE:@imviZSNs(br@jPW0>#VzLL*CYr? %PHI0| /G ou\ړVP}'"E,0$u%J{!&]>A"8'۶iyj dG! LS[/h=kٮ'6yt׀ Oت9]"Nlvٰf\PN&ǾΏA=ܸP su6=ӽ*@?||iIƾC̜wJ*62^Z u+-moX`va'|y[w4{I M_B>?,%Q+É@mu Uf=F>jOQ|)R.ovOWGo Sv3qwnFHJc; GAN7^bߢ-e*[qxku:н*/[si@b]=}(t4HH,]׳84EN^ Kp ɫKV `i5L|4[ 3`X2}}߀$`s\7?6R]7_q> 8te18;Ӹ15dgMJ ES8ӟBfM3QH*dEz/{T22L#؅ !2#ϬR@E{kL'R:4v]&^cC|A1JfoCoa?:ܢ=bo,tt=I j[:G'a3Kjђ&5( +̅D@[59e!Fd|(Rs 2Y-M P@+R~n9YsD<21 sZXM ݏccOEO$V3Vj݂?J>n֬{Rvx/<:>~C5$VY.M3PPY:U~RU]1EcRMľ@[? B5ŠC/vէvr B\48~/Ⱦ$/U V6;D bd}BiC/dd9$u듌3'wYd!ǥI~> P՟ESh_Ic ec]s-eIS״IR%Hh= huaT})ܠS ;T,P*aNuZ·[@~fK`]j3T M{EAm‘y]21G>~-r],&Y j';]n^ßɏ 2Lyu99Tj :-އ4\dmo7BPޡU6:bj!7Ynt:xG"% \숅Z'"C2.e!%i=nYw/?TqL \[ NtAOKӪ%.lٻ0Hdv^\:۹#_9{Kp:л[]C_KqؠݮWoO=S )@P)i1D Tw4`鶵W)km'Z|-LiFm@(D8`I [2ttg?@BU9]m!}NN@]N+,v iѥWg:}|rthSy?<H/S&+מ- wBH[vR~ !Lz]MIi_9TԺ*A${xCu. ~nhfl`8Z-Ep=l^+'H3g֥#w׌C\xc-\`䂿 ȓ^?"˾lٓu 킰Zi'M>ɑìW7ʩ!خQ !x3 VZ4M$Ygun.g63 B'JQvǐ~rAxхW}{ ш,Au&޽T<·Ź+AXSO\)[ @Mvh+&03z'4=䶇G>HgL6W0 ѼĶKx7Mq!ŴI}s]#;*+FϚs*ꋺJ=yVS[gSuoO%rk|:SJ5/ɼ&8٠A۫~,{nŚ1 @5!{%rX¸_'wÑEm!+@Jnd`Cٰrt5c_BwMEex3YkF4KE$f櫃JʸTjE3W~'r.qP(`;.)Vl/̅iÂVՎǡK9VgkLᏍ6MbZ.Iaԡ$R$GDS J7pwH>fDWcꃏB[.FNγu'ռyh^ct?/q} GVo:F99*>,>Jhao<+p虳BӋX9[QSד1EirDA^3@q7gFΊX;/:zF|sƆVP!!^Yk=_"f$tLɵ%/y՛d)St\<0=pr^$"+DϹ2C!@aj>NA6 Jz6=5돐8tP]Ja3GTJsc]!U^ ATK]gδ3䲄^)"gr;۰tcNHkޥ巛V cܪKN31s^tTxp)m&JFˑrDTi/*v[gȓg Hr)@&ȩNQ~Y 7;D١@THp.A0=eek_ )ś ])x~Y1";+syiJhg4;)F*/Y@4= X=x=t4G]=\|﮽lv.FW{&G(FvRb9c ;z#ddolA#0oߌ+Iг`qCJэ`c㸎Kia)v%Q.ӭp*W'P02[F;˔X퇤ͧ[bio&bjO`p CSx]Nr_.!:Nxv4Nh'WI)]])s$!")2&ݗf̭K|&`!4ߔ؂166v&M뀠qvnq^%gAOenT79]Q#0Ӂ1ddĬ`^PԜT\kW GZ2^ d'Z4ϻw8ֻt~kIM+Y3ႅ([̃aNfR޷jAP'S:--ӈ/~%Rah*8C.N{Jo4^''`7a/pPSm.~n|Քc{$+J&ujtl$[E1y; bό1<=25P.Z;󚸌_o q0 ^Y-DT3xj.s0j ~llZ$S=gDF1'*.KquU|Whz23)X%Cx9BqG-_R[Lcˍ*-k&H'z3ҩz IXxnE?>GeVE%zunua;hCX@BbEYRw}YY_(#|j_a:xRh{d ,_ fjH\W-d83C#gxxߐAȺpOzA]HK9m/vaR7bWo>}Փ13AGyo47ąKd) !޷y}[YzIʀ?BU+Q'0p9ee[_m:zCiBIIrFe,]ϕ`XWPeg[ f>hNmRC,Q_@3 `RR̵AH&Ċ+5Oh+Nֳ,) )b5<sn=.SG<>ըIƊbd7JKENaX ٵ nKTsa,6=-P)SJ5taPҁ4>IMD|D`!x] :C>evcw-;]>ŧ/7S;['~o<}t&m\WAG '=[6|jyo+߄Lx.|TCkw QH\>X)ZDW'jζ UyvV/В":seq!t^T_y;Dm;/,aX YNA . L n# yN7/g8,0wx?{Wxo Y1XS܏ąUf|P u" /8M!a=`_˸ E̸kZ4NB{_OCO/"WψwtPV Pߩ?U_>'|o塶SO~n#*vsff!hLfèӇE'IES3|&YƒF)#-FAJ7HsH:ʖވ {"9F"l C{hk=,{냣N:Rb=TLV *duxN 10GQ)o ~fm}˖: x s܄&4+nA\D[Q/n DL6r0qqEN_JZ\ }dN=t76?a"Ă^*쒘r<}mXsfIpa }c?\wl[BQp}^/`4 ,S p2^GyT&B7>Q1bd-.l4Პ]~i9e/v *7l? f)MC }K!):?j4OV/He !)n?)K7D $;1./ lѫ7w.{umc@J0 kMo^SBj)_GZ n& ̩pg: Ae}N}T*-JVIOErk>H.V/=KIdJ+NgAW),2`+p_yϳɦGE@ Sd7 4(#~1 LfV깵dV;y²VAƅ p`\ Sa %C,;HV'0j9D`TV2 ;"蘸=wNMlZ)n͝C[TќX,m$My+T7wY]Z]hu#s&I(2Dy2ĢDJJHk1e:({cY:Yc1WpV+Pt;F>$xb|{>8GPQ, ͼF*(.՛Ñ*DN&ru/%0gt)MUd"PQ78-1'Vd1W4ߵy7SKp4|j?n* ?ϕ㚁* ߾.S E9,W7|G}'K|uUy=)At&VbQb7+K%gj^Hϕi wuws8Rҁ ;07;`k,/PCr@ x<^bvD] h]B;|'! FœRc@84K4++y+o"Zl% .>cҸLz>&Ji3+JR}0v\ا|i.E^2BcKCو]`B>\2[Z#<`M;B5vJFXh4"TY .DmHiye_8JeF+sĎs)c1Uf `ܣUhrf/k3@Tty];b|]lo <(0O{ sSgi {E`"Ⱦ! aܝ4iA΀fZG(Nj\v84–OPs ձ\/L\ yFnu[zρﺑ&VI>Mdq(Mpj*5g+t'?!z䔁 G!.5 |Jnrwm{|߁F4Xν+Jyϝe0ot7)AyמN,}HK "%$!wKiXvލQY%O5])<Mzic#m8P%Kg@CYN9͝X0\`J~8O?Up Z;^g4 <5@)e1뼑ۏEŰjJ2Or7CT!0|qݝ\%\\kcyk20R.~}&߱Bem6[ xrX' h %u(V߿;bh)i&D.:z^RڵO"dl!wO@/A=ƿ\^m|0+I!16vEb1Pv ZXtb&9%ҭI,T ꆂ?z_xe3]H%7w81 `Bl5k *X(L;bЪg2ˏ Qە?ʬ᪔iԩg.OW%ѢaPA-*&>'X8OJL\nNQFb }2**RGL :s2W7bri¦AUsaRӄlprao~ C${@K8 &yWHmSK?Ԁ\[*c;pw\|CzWo6@B7!=mwGu9;3")]幸 co,]D-G73vwWg$}Ldݯ^6Nfc-i&*!1<@@1G)AXOxͣeypUԅOp|E: ~f26_.>i/ب˙o)ENnVj5avxa{:F|$c~&XG!jE6@ ;rC"h@eiN`nZ8XZ:vCP FvfN>6-ϛ} 3PO zgodA MDG^M.)T9?YG )d?{aX<²$m=Ehw`ܛ [ޒ7ziJC'Qo*)^ Mj I.#0 u&}0k>5e*]EPuiqTCsL ^/]uUGoI}9i Yt >a~UcTüᑓй*/{Jջ!"e= P*׎JA,'M%OAѺ/vVap.:ndy]5t e"oVL>g(8OɴS^G]pxPBQeƬmSb#a>C`搜5r_Xd訩]e>f'Γ\UlDW?ꨎ:Mm$3_j hi[#HNۀ5 jnT$*u1g yPdAX6xώv95b^_ WծCPAQZȵ]\Fcc$'T`Ay< IW5F9>#݊g6\P?UTTGW<%'leHh1Pơ7Gp>mdYUz8yMf-~!D#u͓}NUJIĐ)[P^28⩇;RN25YkĝYCͭƂ/;rUx,ڥlg *uXWx(}!k%\0(UG֍aN]vmr{&w~*P-n 1 zI$yZW }j!` db&b]?{Ddq|E+ tEѴp<^TSEs* yeoCPiwVc#Baح*2~G 7sg&Vǂ^M%҄[JmzȆB[oԛZ_3%T=~[ gOxn.m#|BE̤ ȌU%\H9]zJ{ hW ~ѝiWN},5lb{L6BGGsĽiDZ{s_#=; :nZd3 ػ,cp FKzvˢld3/F`9yl'~⃑k@,H SK5(_P͓%Jīѵ+Lvzk.b?SjV&O wJ7 Mdd7?ק`K{ oʎqöS`-%R=O/l|`C;9es>df$sU=SbS{^7D nJ%wAfư|R:pY6sP80ӣYW!mCu}^́_Ӌa}# Hm>rI!ί}yFQO6l};J5DU\[=|d%72DN1'w_7hm5Sbv`xQ߇ :B|5I:HS^ԞyGڬ ZUHm!(̿^&neG|) ػSџN{AìϿa6vZ1ߐy 2\uhpб I <=;BT$-& 4Xe.EW3>ҨJ7ț5ȝ+>VJ^y3|缨P$fsgG8Ð՜>ɴ )%oYQN/Q!-&ܒUl-d#)T(o3s1n6ڙ@H*0mұkzqW4THqzkd/h,_pNg+ e Iu7S(X76PGmyǯgGy64,u}TEcˮ- _LOl4Lj}|fzzf5mS?W\l揊'\*J_ƑCsfҲ卑HD<쿻<o2dW&ZTqNfn23i^Pz XS*L=E`BMfEi=EsG68Yis'Q$ SS$/Li[) )CeqtBԱ02͆ǭW A:ztٝ:G@_ 9؎ڀD 1 cĔG/eSxԄdc}վJL@a$E$qF.q E8-0^7mJÅ{ذf̼R&-dҾnDsgJٶesx9MA@L!^y4W>ՠJ!7=l10Yd-_ףyʽ EN bǫZdP\/?vFc7npR~ةe_KvT-n>W9ȿrX+jt*8Im0t=Tf}Ţv)XW*q!IYspF8#Rqd5T;{aGn6ԥ)yj3*mLqƇ(x <6$D({4ym(~UF pg2KQ Of^22䠅k}a1}X@Dncʂ4b`d⢻̽1z7I7}3f C⺰BCsWz֣lvSq*-tCz-R w+S.)pj%еX@(7!&;xӧB%ȾkxP+W3uL74e^V7U3ƼǙL(@3x1 Z=~:L*,_1(鑂Y{)f\<#VY0͔3&(zr--` &iqK(u5?RzP{i66;ܖY>x=ǣzOJHm[քɠ'6YH.Ť%&ly;vX#RWיj0" wPsu_N@f. ˧N }o/#S}hBZ/m;ܦB)#? Vh/Qo":in6P{*rLtˋum6!KZ꽣!/&AຽW 1Ό W"=y4$/aV]uyhD!O&0S/a~?GI6^-aW3 NJv%whV#gA-܁keRf₾x7N0WzzN%ОB!,/iJɜ;zB4++ D) E0/JTi߄UCme$ia(F4ܑH, "rՙ/mCꀅVUGcj=In<|N"X ?Ԇ6 =Ԃ;җfPCuƝ er-9+sdϸ6Կ,[6ctS\VK DWw:B'o^6}5}2ދTnwt&kfJ'cQIXB8dnd'.q&Ő1/]|r41Sښg4>I+Q?nΧigNUYq(r*f_$hOit$.{W7\H:WX(>vįuﰄU(uW\r>BʌyݗfYcuQf34X46WLƬ&"oXe(U ՆMfl# onzV_>c C?> sTvcI%lJlf24DfS ,Uv,ْQg)Htq1kERFj@n茎 {Cߩ`lQu -}+AYт>*5'o0 l6)e%?[XK&d%nu3w#d>R!21$Wl}4Og 'kSƮ @ۺNK,EKx#Œɒ oLk,^ L ɦX,΢)P("4R]4gˎzpD&ߞ*cu'xȪrA'J@_蛒꤫8?ZA#)xli$_` _ﳤ{b=]36}%SWZAHܑ8=|f:=r"[@fɑǵ_M IiZcHg%Eg\3; Fmѝv3☠"~[M=Kz@NM{',1XKgJ%axt2HAԴ gml )`IY1H;3ut;7^qw(Bu|ʗ'],I+UBhcNr09)߭fcO *yD {‹Iw`iؿvvx4i[[IEErmB!4}нaw/-Nw@WuU8qj UUɜJ =ՐpHԌ4[>]gK)RL[g7IPg 1I Ia\Rmb_z)4UwT۝V9Mn=5nks%Um5W2@E:8'W(x5h_쵸a.m{1?Zh-g= IYJ) H;}ha勒d1JCa('@^ )A#Qs`LO(Qb,<Ʋ2<@]b̨a\nE KM)q)~*DyTBIJ`| FUĈaPZ\QqgoAZY9ܷ=5*9F+'0c0eί3vyĖ9k0j1Lbw,h4=Iu#ME{T@_vB|ȡOB-_hC1ו#;k$:SJBYsHvKj<$xy(ÅRD-u-A/ 5I~Xʹ03'r;Nfju&t'e+htߜ CEg IYwt"[4wy _/cIqī |a҈>|}-7%A+*2cTZ,럑ĉVJTȫ57 rslg.2xW`^M9 ¸[.'(NjM6Ϣ1k#3Tx\\^ o٬ҧjy+yb^3fىD2}JzAGB}^6KykUJIKKL HUFI2k|Utut(/vbC!vBƴ"*}"ڿyRC/[3Q,G'YEQ.$ Cw^7_UqDd#e=2&LlH Tj[*SS5j:q)1.U;VJ{qW84!dzLIj1qnO@t>hA&gz&; nL,9 9Ζ' y_Ozi]ч 71x;[3[LgT;tB(;OO+w 9*Дp$]xi% 2#nv n5D\x8T"g8ȭ'˞v#n)Q:ռ,6wI 9QrO4\m[CvPQR]Ot]bǘd·PCD̨NKIBИ}cqJU;i;uZFzYG9,^EtEq ^bi (-wf"1!urWKŸe2B}j:dVã}#Qt~vyŨI]tmVF8ne;c&,qQ{Jv }8|uGsap clyQՖpU{CmL9NxSJWC߆25&Am?r86R1,OHJd lm}:<7֎S ϐ I{AcDeT-#; *9(Cu<3N~atVH퀋pȣmM%-qټ. FgҠ>~(Pc^ִ 3u`β5tﲇ*ɒHAQi3bMH>bTN7 5Pfcb03 PX*x QJ ?CA0-sFFB뇼+.~rWR#^:ؙp+U738@pw;Y Iܗ[ᷘ-H B/RˍMA̔q=ueۤJT9> Ͽmjgt}&m$UҫsEkVe"8THDGPW+R6H֑ޫoϙ3T7:9jB S dt7B`'c+kY%7%eSƼJk$+o8l2mX@W>HMAZ;h}z_sYɤe0B<{nE 3qސuvQG ɭ bow;N$,e&M]YFd, 'Sqm4铸Ą{L+q+%xE Igq_S76E#xp**@.ڣ5yw&[S4mŦlX0\a&?v_>l=a,EBwg|O p X)$'U nbmZSlɵ҆#Tz?eHVQרW11,!3[dntV; *cQO;V=rhe?&2:m]ƺ⟝4NΪA>ݕ79ʉ<9_N5»i,ִ&>i^25a8$M:PI1=^?"3byE*7`@FJt\dF~ʦ bOjoXzP<1L4Mk--+3g# RlEg;u  fSR;-Gp!"mi7h݆[_';'1ɺX yg:7QG3+MrsW{ggՙm1i>17ugO")YyQ`Ӣ7!5 }IVN5J<ޛAV¥7juIHtWדb-M :BL+Xז`2 /cGrA<-V#a]QN2RlCA=V.ǔt-$'B#d)cÂ#@s.vnn~ PѠz"y:~ڗJ 㟹_hi~O$OSm/"2<<{FB@1F/.$PO-4X/yi`\oiTi W{pZ5sNaungl EH%`eѶ kS~v,0&W=u@):#Z䈆_o#Áa\v0B4rj-Dq 6q-ذX*.s@Cc,xg3m&uvI)<}pKw>UWǑ\C8Agy*ߘpڟdZBqC&̖Qu z(iG:ÂҼvFOBIT>18NJyeeѳ`93d (at,-P;X|1ZAtMq/~$5+Hџ2J\1x&K`: ӟؚ3V#A~  @H~N ƃ$-hݨB (5-<ę)Þ&;B|Z,!\ :s >VUAe|}$%xI )ßVJ?`k'uʿGL^<KSVD@@v-Ox]s8)0flrl5[rnOjgp[7M_JI^[AF^`ux}k8=D_ >+k͓ZtC7ż&>HeJɟ=+ѽ=oaa~u;#}e9ll"bu8o^icP#;tKoד:Rt A<f2?M'kec5"DԈ-D(uFxa9{+ W@u'l>%u ~e.EuDѻ"Sq? <[:+~3׫!D"nM%J/LLGd>)glY8ҝxyf"z?@ae>59NQITN#dUFo ad!chtE0W*.:pF|ؿ#-xxrͺ w]țȒ}| V-#/?^dnу]6[ f荦~!2;:1/>i|E6wӒe1{^ >Ӿt^ysh7s_ :?O/'?d0AR?ss(lh˨{WeA)xmee_T|n؏Z+Q2VPcgk|sa?^iBnpkY.7]\'~ {#gę8hKgWDrx4̜2"$ $t\_, 4Vu2^o7nZB:nQm~p/fBW/Vt\2%E@M:K,<4\1K*s|9#eEe-bFO*]-VÎ^qc .8/6IoxrڋR r|Ԏ-:@lL .nnn=(Gvƌ<,,%'h*2Bw-#TZy:+U% 1RA+Xq[bî#gF- &!YGܬ[zqoVrX,ޚ oSDDC0v^z[]VS O+,Gu &a`=m.'bT<-T:tfKhf\_dh`t[z TmD$N箞kVYy>nW~Jˆm?3KNϘ2zqO[Pӕh/ tHxфfݿg`m݊OBE P"3x7!z?*b,whugBsR!Q`:ܣ#P3|ěs ƍ$`dbЋԺz̩a^:7myWe@2pW,NQbk6&9ۢG0(Q?,?k6쉲^+Iw+^T0rj*!?n~bi@>}+"DJ>b'QB^1~ {S1|Xkwu;ltZ6`%ԛO)$*cLM"z{g~^Mý X剰б,b6[]hRsNCa$B\Y+of'ْmZ.^6W1)v]ew<~@*.37?@_+ Io_̵5xuOCY22컵S2@-I'|aj2+g(.{xp^(3+JRʋoLqLZȯQfn>&A_>^݇eK%M' 9]u_㏄)QfBZ}Y s/ ]JHC)z!ؖuT\+ [ZdLDKx {\z5$~:4 dhzlnaH>Z/nAv<$D $2Xs/Lг06s[ m`nwf֚[.y-sዴoSi6KC;o!lAxSp{aB=1>ćCͼqONW$\V2ħ6ͨa0=fF\"4g3s^~ٞT(U -ᰄ'D #8T]l5lp گY!OP$V5=9%VuoP^ Ԥ_7Lϩx*N{"zu2.v/{>=(t2WNw( تNHokk&dc]\:#P#C$ 7L #14v}gIW]a 3cYgSGj2h` UGpXHs OVO&!rSLйv?xhqqSgj4 Kũi"^ZnmI^Ր^J1+_ ađ|829f\0eW4Nd韪c6gHxŴ9( Oy~VhdjW[|{b(3|5e@%9cwf $E梶y DIA,+3ՠr555:EX`;Hc3ZkXM*E(\'V zțX@#4 zM!c"e/lYΎ]骹YAW!2.B F-;_ D:)Y5ȑ2^)Msp4Me$294Oeu\ o~*ΥY>E SR-oM0ovx\3%#Rز5]7?na H*Nu6 O-"5"棱&dTƉ`6vQ~lC ;OALJҧSc?^ &?q ^pޛrǀ HCqU_Z'?" s\gj۴0 j)E1G^p[+ ~ޣBK{ҁ\_(7"q6.XEgS/ȶ6~ޭEGƫ;]'x@$ G #nzn¿ނ7|)//vɾ;R?-2R1^[L/46]1e ]ƚ]lwTH:c񍮽fWTYE؊"olŭM5l7kإ D@5{_Z)0 }50jY7 źAR47, Ox<(#%K٪FE,֪O$UUd7xn8~SCɇlȼ܉U5gl]Ek6MQHw}pOC3;S zBC/!dP߭r:s PGZ;b-h: #>G4 ֣ ~!@9NbVUI9ӆ»n'# ֭ ɧZvj;]}x} rf@hmӡai7:}c`e7ϒU \_ Tc`޸gic¨QR㷣m1`PZl[k#nC}M +Tpf;H h(طI(u}Z]@2tM* *8tUy# ӅW섆P]ղy 0 b8 L촉Z}[US̍N-Ɨ,}t > 8dq+;w'+|Rʢ;c76'(3ᆘ(!k`,UhVfuCSdAlۯȌbmJ|$aGS& t+3JGW)b̢cxb^۸>_Y z@{N%F V*JV1}_w-r]HJ"G8e`fz)ڦ$*)Տ٥zGfyHj9-_9?3†68r) ̺+Mͤ$[@-~ :۔|Hr4SG%&ɆuK6z8][B7b ecQu#B_/P֬{E6rm}.BBv > Z5wyr@Z=vpy|d ic\in$ $rS.xT28:X}w?̄br دg3 BLVI7ˣ2棏B„..}^AM{q#G]6l;qgk!ݳu]nnfȾ%t6 '-z11J7+v{r8D19vtp%BN JWh^^AhMd]wL\8C`vY[ Q|{w~,E%e2WIcEu?XbPv˵m#$CȆ_ 1j2WW-pGo,[%fzjOkE LY.= (k"Wh?\dEpUޤMli%Xx~ B{뾯t(DKƾxvf Eb'- -^ OlμJ˘7@筭f3!E3-d/*iTv=wq[;kf[-^fԖRG47o٣oyПh`븆/BXއGgPȳGsv5.zB/.C(mtg"/]W k% ~ik!֖f._#Y(kfN—4DnhBur҄c5R{gFQY0k{L-#2L%9]'nҢ U<1in{:G)q?/;+M@E3FG $q ԱF/nSՆzǦ~r`(7f^G}]&@Dl+m_ݣcIs?M+NO oEVr߄S|ب8FcmBLx` 4z!:}Zn\V P)}NGD@Z\VSCg6si`urKcX 9YN9Ds@b +[Dlj#nPSmXI} k/B{<927v\rU./uv&nd:dÔv%3L}y8]L(un_8>$/XEҢ׫ȼk+YvJBk2Z:#ÐGr ;~Ui!S/1^U20U(=b)ӱ)!!>:K~P vTLi2X/?R=H8DrRiW3wQn~@. n[vH~ӗ"y.ͪN,D u=N3vÞ^Fj@B$xK-*1X(@' 6ߒd#e)[mn,n̛u,1ۺf^]A8꣔%l%F8dc?@!G*&ɿX,A|'H ޭ3э*AmpMH>z&+Ӻ/E\ȊgCI G2k1bATϞkJ2@&YfS -7mI\*C""葀B%f58 I*lՅ lj~|/m}kY?8b4#Tan_s3P4n3PP,~ehCҥ-Q\0~="޹ }Vu#A3쬢P0V CuOV@x0&FXd u;Y=]\Z?h@HaA.A|P;/%yD knK-&y +SIJFW HGRRiC_]r5s7AQ^fx/BvX Yg jb$ L'(@Rm|.1:+{?b{7S_Y*R ejlIv0Fc/F k$lYOI[< c-9`z>/_3gӽt]p\[&9g?mKLMW;a8<ڬ{Wu:plqb4(qoieq'TKq˺∊ (}kevݲ@XZ9-s}+ ~MBbSJ/P}>D]h(tz(#G=l н'MZنT$).립A[Bi7''A (&wF=esd~9^q_A/׫7;ZjhW]*@|w*fڵ_7X2XnchKvug8%f?\M%V!44xğ(ᢳH;!PQZ4bO)= z%f#m98ԇub JJUFqhUo-k-jߦgpiP?xf5Y^LW\4{(6(9!n%ob& M@•I\GZQVS8Tt%0i|SO%A(LW*#"~Nqڟ!n{6Y=Za@k.@'[,zv1 sCڣ@e vf~r}!b{|v"Q<[[#fQ-aς:LD˔v.dNZL،Jtu]]i럁n1FA͹{ʕiO)J\8>zM":=ǣˮ̊52OT]\8=~ԛilSlIsZ'`\a␚= B/:.AL;W4F5NA;?~Kl- % ÿ,dFde*<:ĕ݇t<< ;At|{0]Ǝp|+D$e HʟGPSk~YӽEmRC|IL;Vx]ySDw3 Sj{ECD#I2b.֟D^Giɜk[dՖ'D:~Nwݚn/Dʬ{^hEVBOԦjSf ޣVT֕I/4mPNBNW9ՆԪJpJ#8 t~UWbHkv3$ X)\Txۻ턢9߶?Z1֔E) IͶ4Ĉ!yTD Mqi0ur9Tw-8;E1| 4r~&5M_tէe%Ң',;[_#ucSh4W7gmx8 5LЮex%ѕϹV'KeoTQxgTjϷdK <`"?N|ԜxFP81Ӹ=a(:-įϮtݏח] ˈG,uw?`]o_-^hxܷpDrb"EᓮzT>hEHA q Gh"s^0:+;'ץXߙw2$53kz M- HJs\Q9FQ ^CGf% {fZ'E={[bjMuN g5Hra\#XBc څ+8%:=CJ=Nй*vh /81fZ,zCs(K]nGCce:I}(/\˽&%F6$-'Q/WOnI&7\pJ~ͻ]ֱi:""QbMz]UR:ëWʣv_'}ԅ:nX(#Mq0޵EvnL|%\i0D+:}0DZ5ZL')žVti瓱˼Ӿ>!S0$q #^^ y#]2*nHRvL_ݵPG&)%%KStL Kl #ɱx+;62G՟>坪BwgP-ܥ./wA& q2^ढs<rLԾ㹪GHͭ,j9L<ćE"<ԏ3]\+VQ5IMD"n:'Z.?xfewPE`]yC/e٭ŝyWB %^h{(K`X "VU yz vKFGSjo iɽJ^7^cǨ-Ax=lgF d6ClJ~`g^v$:gB ԾU;|'Uﬧ56 t![z>379yt0"Z/Y{-}) 90}6Ų&餸|u707m-0NTG#rp%/i5OjJ:$Y \*&$8p;36^,<T ~0ثhP9'QZ3LobН;hdRVu"jjf`) Kp/gK`k- k,YZAѡ4SɊ*޺0!K_1̣y?8P/ٱ! { " [l-߇P"v:;ފh5 H"t]wQ- 5|D0I™& +ZY,XuYxw` C _^jG1ZUn.j=a:u84pd5Ï`|Dغq!, 󑆿k(vr2шoX?yh-O76TK<_*ocJ\D1B /($o ʼ73}5cYxGE0RcX-0W7 aQi2rFK  3*Ƌ5UL-/*ջ}EF?Z lvgƻ-VFBL&SxİO хӐ=L;т#P|Dŋ%_.;SJc9/e%zI8mcC}lC6|U)kIdC"%JkvjS`7F#2V;`l'2BD׮%GG ۝xfmN8Yh?MPdžJTGS"%@;'iJ8cHW Vb.Z)ݣ6LTq}a)3>ے*ؓDP ZI7PHS1I C};lk}Q-_cs.jlv`g%\&/:~p,Irb;GO,z+IʢGfi8:L ߕe}2]TQ-M`aK?ǝ V !eȼ~zE|ezkֺ ?tZ޶L͑4D,. WG-eRihj= Ms3?.6 3] A^νkI*o.Z!Uk-i}ŵ=@ƛI/:I'16i/vBx0<5*B);WC.5_<[y+jsKUb(  kJ/bknh1=#ԥ˟:h)y6+yAi&/QUF߿\!cya*L;:Ϥ~"jGA uS>,t]'r`BĦaU_ t{۱"cR~wJ>LE*K߳E0]p|}~ `4l) "(pLUJ'#+zOfX [P$Y#f`fi"xo`O%1Tbr.,M>}%e,K!aF|@bx|I2H.VQg#r=]>KlKi:+4b>:BE _x@s舤۞i|Q$<ǜrS35uؔfZ^Z%Ty{x ukv!(d(l?ثnUP:3`hLoޓAo  1?[A&/0<ǹ1-gЇTln]AC#>]VoDM22| C}k % T:q\m";^o<'rlY}`ۛYlV'ƶ|: &IAϑ6o8]?Ĝ .i?K˯;e@/Fò A Bpj->"ŅGdȁYVGen8 TK@Zrݼ-늣vd?OTF :DT5r~cIj#(,*5]Aj8+ġ#Ugdut-5kn3[, tyJ\1oq&^2$q۱΄B*7S2 v67VP  7ܮ+>jphPS43g[wD_%W"1TKl-2 ^$֧Bg`] hacH__UP{K n + >2לH:P ^x%"FO4P>.VtP.4WNDSŝ`/5?.2> Jj^7K͎?9C"^BLcR {H4"LJ(9$qmAtZOcӝp4G ij6 [M4÷R 6] kF_%riQ/V9&j~K6g?ZMs;/wgҚ>/zy+iA%:xT@:X'{@a dg+$fK/q؁?U4%Ƙ~yM\A;o݈{k.觏O*鸀\#ؾ$Ucj` ?J13OOdO%rgN29`>[41(LPhe:$IZ;/ޠtÁJ&}p/BgF[Lߴv EmO [@S|*W_SjNxF!b?+{5z"?X|~&a@t!)T5yE20.uvnP:X//;b$f^{G4U6Iaz(%xu[CxTݶ3kЙ_kP:uBkJ-HxwACL!vrտm%'L?sJ qV[NʕL(LalK(@028sCvdV Pōb9Q6Yo.L[ d!O5dXULW=?\MtuP$BSI>>7Ynv +WPh1iʒ&[af}]Y_4[ƵbO\, N%ƧnVz%y-JZUjoy]`B`,"(9{KtKZL6r/wٔd5uhIY}~g ?j˵3 Al?A”g(+ 8x)wgmNJ(?؞lՌz1wjH)""} so^q J,cꊫuwM:gf5="g_ CR)= U:˜q/ w].VOv a͍PFKLэmq.JPINkҘ+V=·mÄ]uHmK@^>+sY.:にG%ejCZ8΄,3yPL=u70:Τ=A4T $K8sEE0xE.79cXйhukNJ |%8D\_p=y !:1#S(tR_[)Έe%5/_zhLm 0&Mņ)%I;9ɖkQyUJi)bX2-׌!k}Ef5 u2yA(PZ3:Z/SX#'S2pPg%A5j]n2}agR̴u…0:T1͛}%-rՅW#X*B?s .)o Z3.z"|2VQ&>k)Rr$x2|Xo,14>0dr[b2Zf:{*,񆚅W,@ MO(?^61#7*dbgA[9[Qp&]O߷ʰU2Bl{cD[ٍn%FsGD3)$%dl !+\ԶS+ ¹a3nՊ.(VwfK2Paj/"|>x/J4]g$HVo䜘UޫBDvqc $o0l@%*'Gh=<,/,UnQBXs{|سx=/JL9w(EI(%3hG",Ɣ/RdsjUN?8Xwz qv"-> Q4O[ fN=t:>Xͅ~HQlu hNBnC״pPo||0-XI}/\#cxI<9mdc-:_Wekݲf~<$ ܌ ?r0E{mvBD 2FIQK=Gw u@z޼=.AVS6+F"]kuՒkvds <ÏH<U(*>i.[*cꬊJ}st^" tƛ /pyn @p[il#'15PYgܔhvv9zfUZjuW SE4>DRj=l&uuS>N:D\˯|E[\Xu;^v#3+(!2*!EC5;[DbR 60E YhFIsH{&vC-GVCyTzy p״Frd**0c!b@ÙoEdJ1){Ϊțrl5CծGw g!ҁ̆-n6Q1#sjh`4BWB*!;s:6(1cuSJf_&-n%j-j<,ɒ7X˝?!y0r/cŬ}M'.$jgAX"c[ą9g:C. k{!t['GE~8S8%o3G;I7bv Iw*_>g) "i-A_T@ GE(ά14 .⯗3N9z G:z34hO?wu1)nQ` Ji[E 8q]%IjB1,EӲmcK8;m9 RJ H2|߂A"/}2k]TF{GbR҈떳s.@_d dhgMrp6E{da2xe囱gId  9&A?o֊6X0Kb礉D4͢.JOI` E-q65ubCݵk@^\3,9!zo%fymGUD Lґ<5 jCcp?B1?'EU8֫Nz^˰&?rS'i qUSEqө* r"۩(xZ 8F ׸};={d j_k .v-E~ZXܤJj~#j`Ŝ涔`Pلf|*LGZ٨Chw`|fK5"?=r#MvюYÿW(ؕwDX:m&uL5#DR'H;:s@ئ C+g;q$޳&Fg;q0YV)SVP~e[@5rZ hi H!]ۏ"Z]Ał?ㄠ3iD2ޜ7̒wwTp^Xjg#kyvBGȾȖd3ܴXPXXc?d P? %Yc7ɤүBNd=rk+br)M\,o_FXkPϹ$+ꗫMDwQ6R[/Hϊ,Lh YSjLZ$}<7X7ޒB3X:n0y2Ņ)lcLS0"95ň,W&[ 2lӨ฀g?}!-zn:^>C|z[BFk k6//EewN4|dJ?em~ W,P%Uᄺwo'ڐC2+"J.,isyx#Zs7 gHf'r 26ݷQx d`7Kioab pjwK+m=l'1`>A;$sębPG8dL`:/AF'+mqBa4)6RV\I)FOGQH̎k AjSDb,D~ 5E(n腟 6=pWjq5ߜ pE-CTV3ӵj8z~>X_4Sem<֍_!9V":G;/C*}>/EV`S6=JZv`  [.apvjW_/j1\y _inڀ|4lbw<[լKs=ژƥNkRaW]t5SJ,VLob ϋoVzufY> Ü zYu%3tV\9HX}Fu|QYJ`̦dU@E~: ~ 3*-*Ff Ɂ9ss)%)%w3il&TڬQD?ZWA7nsb*Rh.|O h3t+d6#U ģ9} N$9p[iwdr |`qRk!vsz?U:=0te`s_ 0X1מ.v}(`S_ 3% 6p r<8I>0j,'bKTooo7[)s_)@c]/sv5p'xPJBJ@XoyRyაX }xA%1Fڕ>kú 5't4v~^HPqrZFBsKOEi-®0HfW=$Î4_+]Bn Sj1Gt(m^/&Tn. 2AF}mY[Z.N3GOeU-FGk Uj֧UyȝCf O%Fފq(yp+͈b5clB N4^"r;c (R({03 6cG*AQ`m?Y_-<&>̨A1MץMV>< ${jv>h *lњ;u4Q~lpgs 56 \A~ V0rRl1#F+4BCs9Ei'H~RhZqǎZ _#3&q^zM*ζV-op t nNG0aW)%S-@IC+$K)%c1GHҠYNUe-s4ZlyXzzV#:EONHzzrE\d/#7T}զk[浺̂4W/W`p̿[љc=_ y3 6\×|w=0žlYӅ] ^r(a-, 86ѽ^\sR{dFæݖ6GA! R&3_ ع ~{_D߻۾O A_>o*]h8NxF\-K[Q%̴-7J\NmǓPV^LOhLM@V#[ci G?%`(2h_`vYY}N|Q|~4fv"`Z:vAءĢgZt0$t_1 a \Gw0s:;O;9T \]k=4JrWxjbpiiϓ&MX {$'jԥ`lQ-fUw<p84lN2#1Ua[t&134x_ {/B(d~8n;yh.D$6ԳU0&OŶFP:-]2HWhDoerUocxrbYx:tpfկw:KϾ%h=:n5^1} >Ɲh𙻵>RkW|ɱG:vdHK$c!u4["+0k5&%6WUpe1;G`ՠU ^9{r7V1MqbP)ojbD$ 򥯍6q![w? }"s.&)1jǪ ryWL^rFj+znYd v743Ɉ@% ԄHfN=jj5*=e: T$,z~BC1̳ͯW4|Hsyg}[8_Ķ&43ڲh!/CZ&$p(p.[֌/!Ҳb8x |Qs f"OZzoSc%o;C!v.UՂى#2o5̞j? Ra53 {uބQJ vGhͣ-ӪAjGz/h.GOSawˏ?|f|B:J_aeq A8޺|ޢen 3Z>JNv^l u=6̂w% Ac . iݤqs߲~HA[ IBHdz(EOK4t~r _VB{bY|]:^țĞEsTԬ/"!WYj z]vc"9bt.U?NS@R:&цF @TQֈ90ьcstHf,(!IxְPOp/V 旹=L=Z﫠=3顚ϴFSݩ^某_^F*A X V)!O5&U()s Y69l_Xs=uѴ,1 [Ņ͔t!:(ʉkf@o., h,Ҿ))1o@n<$ *Wܞ7 ߀M 20H)dg/1@EV ԑ`JGGUv}l&ǫa1ڱZ 71/IaIΑy}(D\$֨9Q hZ x+޺ؕ1yNl";e^xу_V :9\]JqB46\(Ƕ SD\WAt3˚ Xx>ʅЛqp~.up¯}zr)w [ v_K"pq78EՂT X_=i!X+&M2,t~@JQRLgDN[NReԶzK v`?uZΈuwŪw 0!uJ#/ҝ)M@["Af*b+BU~Igg>Br+Bfd3Sq+:9L;>_&N@6!*/gˎgm:P~6W%,BZXh"2_vX\>& :i5> xe{DA遵̡wÀ5b얦Մ$MFz㖷39 *w-4d(\:<9IB8(. dQ??273Kǟ0 qIbڙKGV冷Md&_&~t8I(&qBgT@hsX-c )]t5q*xrt)Ͼע%ɵp'M]y~pݳ:&C9)Gy|z֣Ǧ+vA_ V421ݼYU\dSF #?-FMK*WgeT `8%sO;Rylt,{ 8ۯobրCD*~K379t ѥ]UBhZ VuˏTD+ cҴdk~C&egm IH&zcb ;.0M,j]| MoFLG\ԺKqo(p+T;' 0,{ޠ`K9r):1Xh%(*klMUñd cѝ[(iĮ/L3M$s@mu,Py(kvNa?+vw&j&?t2^.e};oͰqz.E%6s eTC¬ɐh(`g/I'(M>6,X?IX?rTAtLl1">?S7;w듗_#ZΕ3^ Rc ?"uP1TlCdάVҟ@ #BdZH~Ĝ) Zٵ o腭~ZƖ2e;)}bƭy[S\ت>a9na]U|@Q4^w]آERhV˱4J2 YLojmW{emx+hZ$!)6%do*EbCu]N_@^Ek ߋɉ3QY_ ~࠴2Z?e;k?Bȱ]r-˄UOVcKs{RiiWI`Yr^7;v6'!j4ZX@ϖL5-O- p|sѬXO=<ѽ/m# fj#"=^&\=ⴿJ"aֽĪ喊X" L4HG;W; {ZȿM߶IͅDšt:E/t'ǃgmOpÜlAv>rط^󂕣욋o$j;PKi_ 9ԩ3;1Ws9yZnaەP|xy/TW 1CAsPN"3t5{r`c͛N[ƻJmyЕ4Er |6"dc{سfϞa6j]p-Mg=xWFCD{e(m ۑQsBaB*?H2eD8J OxfQOUb)¤eQK Da_NvAx~jV#ye.K'[+0.Rk!Tw L mzM\մ4 D?x~} 3s 4܍QK /"N2n:l#l^5_x*1$1S]6J/$H~V!k>ig(jjnvu]r_YZ|KryȽܷQ F24xn~yr4P}Dﱯ1-]U8߽ck bOn.̙eN<.> tANP*6ߏaRNhDGS|E_NM5׫?^&Wez]LpJs_$Fx9MC YiX{xɏJ 0kҞY!3Cfuk3 =% a ]#m=~mR&q^S2]"d׆@+ܷu戋n_4lX/z٘?Eh *>سzld4v>?Xސ l gGFy>zD.;06S=L[5Ac3jmF i Jy=ˆ%uh藏!|"Enß\?֥pmQRc{`EjSܕ!M%$_ʕ2ݙYwA{{`s!sƄ@YIs@RFxEgԡ*iB`͓6Պ4+@ +H8Lg4T"Yf霻%^lRv쯱:ԣ^+c nP62qK ޼zWe 4qD& ej0|צ} OنF=V=bDնYӞ9ϲUmI0v1,b#< hG$6ΰLU%b婰 xŒd3]3±Z8{+W1d0uE_$Nh. Z"GO J=YqWWU +~cm ? kHOHsMB,|M^ TS},y5f{f*ug!w./ïK,ϒ1ۊu3>VX>;{Wc?u&ci3y[JX".S`K`ҙ mYC@e2&<;(DS3ڟǪJjBy[7VN=뉴Ot|ι1yὉ7O4n \ӎRX̹.X*O`A}nϒ"b+{ :5Յ(B#u#ZadMzď^Vyɦ2n4!߿ l+E3HXe*6r[)pM[5SJv$eQj(/Vuǫ թt%>0 YZsusieR/data/N2finemapping.RData0000644000176200001440000041225013703336624016062 0ustar liggesusers7zXZi"6!Xtӧ])TW"nRʟKMd[_;zk΋&*j_ضӗyK[tp+ً^3v m{*a]nx75-z|2HXЀыeVqyy`V,>(̷ҙXqkAE[e~1u5ba_fA봼 ZJMM4Pj\MZejW+K .Fw}6,'9`kh$TSm Wjŝ-ꘊ-9l|cq `ȋlf ƴhػf 蟤*-" :2[r|G<*iLݛ5Y1 zI\yXS_̧Ys||}]ě|}fwۣxg8ѸfY T?&dF=j?xweX&5&*<@az f=b"YwV7?YhkS`-KU Z7؁eK8sXz 9D,|rxv)_ `aZsPt5RRP grCMr4nZeGJ* ɒZGij= iݏܳJsj @ݨy<޿v\й睔+x*` I h-y޲yLrHKϠ^ `BY&NHPmQJƹzl0:]6{vK]=&uIo^'C|fv xi yוtH'S24ds c?MGvx+ <,'(?~Feo߻ eQ\Č䶮*b:hzJի<iM m[o&H, VdNtk"{4ř̃ΜK_Hh#n2^{7~(4 w?rb|B!g$sakm@qT81 cw7!eQILXQoZҜV(;e?<Ë>8+.՟ : áO>$;=u 48Ń| iea8 U)/k)+RH p`B͜t,1!Vb_ㄕqJ= |Ɋww8ߡh{*k2ӯ I\byqvJo@J=L_4Iz.)>QNnHXȡ33Uά&v~΂G8d24% 9S0+ڽ*:[M$~'8țqWUXqQ. ՗frʛԞ o0 L8i؅V~,0ӈ'Bnp;@s<{%2 f?"ze%V"[k 2 Q=>XjNzDcCDn'\ܱQ(4Ya з 6=>5@N\O/WlO![xo Qkh$H;_?)EqkRW l-ޯ(X/$Q49f޳ztZf$ПIS6nP)~([uaQD.7ΐY-E鱡:*hכ^RP؃W`5ԕՠTWb3Kϙ ~/-&en?_;+nEs/7U'@Jg7aH:7zM*?ɋ0.F=#s Ĵ"E-gC񧻊=t/E(Ʀ7FKNxx)&hԁf]efrƠ%jk]i5sx5и͚[IejT2U3oPCk1lxCE,vf;~ +%2+=0OdY>0y*1E(c6ggYh͓Uj,i ?څ9uY)rl6 l6@o'cR>~]VB̹tKn3!? εR&S^?.ZzREj &vxw9J dƉ?"Sff7^jW;)K \ qF^c)܉ށ X6D zyk5W vo)I{0 y =1 a4w}'ɮhu,I<\ REhRˠGb/ ٶ \0|Gm@RD;/8yG^\VԹV)L\ae@[[Kh0ts 1 X pKrr M;KPU~{I}?M> kB7]`~x~ /紥BNP3A5Jo ĒHc7Xw^1wNПwh)JI "R#W;svW'ۂIux3F7YJ#x*o=vK3`{d?*[ UϯW6"_CVA( Cn-^Os$umʫ`>IFGO|mщcA˿Ա[Q=}r›nSCa%\s9a&Kv&g8tΩ6_yb?HEߜ+ ]K'jt1S8ђ@ vpl)_Gͤ^.i%a/ a`#A79z5 :J$>5 4C~8Χzx#AMh8hުuE]CL8j #h^NUq^0l^:mYn/^njf4kZ6}>T hm?)LUzDF\B,aƋ \+ s*{⭜S#A]dN+ߜ~Y-kug7 "!Vx[tQ @须9M8bTnkMw>'rL2)N 3ȝ&E#ɒ$&\s:*~dRl aegi+4!Fyi1~Tcy #ZRwU CcZjGC5͐R;vR0)n :RѼYc%`3_}*&}^IF?Əp'_(@ಌT0$v:n/4&'H_—Vz5aBj찅lU,͝[5.JM#vpco7pL<Jl/lLƞ_Te|__ HtFB AB<_8d' [y{I\()cC;@^.;|9.u3bB)/651ܫrʩ \`Ü)?s7lsi kQ\t,V5>li)8BnPgIZr~7eEpʼvZ_]75+1^ '1N'q0b^=ڮ&hpFՒwq$ȋ<^HȰ;R$ze/['([$/Ȣs7& '\G1`@v ܛtNq5ٓ>$~l=,'c iV(Pc{Jk@`TLd T%,-+mJ%P S&\"6h=衮XY4w7%[b\^ձHYfOX}̓2#珽߅Je,!Lxx>A|Sg=¿;0ޕalŒU,VEJ^5A={t+ѯ:yP+ьGO#EmK{mH:m?PSFdH!)"ve53ڿ6{(L$?}oϡCL]ӑi٬̑u$%p,yp\S?9l G;%q5(V$1yaKK ZpU-̆-]DP,\VlMT!4r,#u~C\6щʀC""xTRXO0/4/+ m'f|$ɡ@U"bFpW1|;~zXHLיWkMkR?U/T(CԦԨs4r+ ), ]/AuCBpKx9͊qKTU7;lRP@L:2SY!>4iij\2@-h~zKίEYuIhdXXlW;hzf Pʖ\8?> g ݊2R!7." kOnhҏҞG:Hyɀ Iwل(9GKU?C/%~YV Ɍ]B  1_&ĝ?p^tD xw3s iԄ<6LNy\t()Ő{jt/-sk~3SN+Ȩ#~3)FBl5* ۜb-BF<4`"X'زcْTwxeYQXP-ݓd!j"1̆4c-„CbM}|zƌ8U@sNZ%JM3ᅿ4e-Ԏt|&8bYHsEиP.20մ9>+PM,#+ySV!-)y,,Pf8_!- R)t!*0f&jyS`o/nHpE'w<| Hre*Wp +g!~C1ZyiПDij8 YoCg8 kqv-dWaFcK|u5ML8!`!t~9"om8O'E<%ryTc/ʹl*oo͇_ ݍ86M.b-:W2K6I:?FLi4pZS]SN7gmV?9ޫqoQRp g¿շ)oX Ǖ`@=an%o7L; ˯RPCS;1SfN>%&u6AiÆ!I YYoO=ф 8@=%R""װaڗX2d[k!37M`.M ~AMdül\pQK?U ٴ090RG"blx#6[SNo8JjD&l6@?a\s@9D^{b6P$Ic܂'PZ4CMfSVPH# t 8j+!m=")D/n26\~؀b5W^t H#yкL( #ujr_mkOju88[ ‡t7Zu Ⱚ8>b|2+a!u啽" qdIrU֥R⡥hv>6wB;/N8 Pk2ŋrեjoy 2Z7.>w!.o%im%6\Z+fhL Wy98wUf]`zY^27󣗮&Ye/|amp S#,3o%*/1Ч]3R 5ۘ/ `.ztrƺwge5ҵk?&k*) ʡmNpmT=]n"k%IU4ר R#7z >삵zx1ygSD|DI55߮&sC5\]+21|^L"(u]5cmvS rA83N yGdž|sOyң 8DД=! T%5pms @#柬RshUIS3C u*2 fj2sN46b1P6<.:3P] tl*B3bjBYZ b;."o|% g0R}NAԿGHi{_7f$A%yI7mo%[*2 4LkX^GG7JY;U3} N=:(Y/4@ܟ:bN%ڲA'h7̊ba%yvq$f FIzԎ0wKf @b4Ax Y) ;>е>նI9( v<\# _;|!֯Ϛ/ur畻.zYa 9y#i v݃9ݭ|5|4*l[*SH˃8*E`92[=ZՈ>271 nd (b62:W,'#^\=ib% j gWYXgYXC-Ge*; GOk/j} L"";\Ot3B,C 0p&DxJ_۶GU8d|{ '@ީ;U!b"(nwef>C|P@wNxcg(84qρbך>PlH4/E21Fa-&'GWק[r~Z3ew'Uc=&̞S~=+zT:a^+g2qߵVa4/{v!~ 7a3QǗ}r(z|?5k+739 6'xwLH"|6=T)}'>C]o$P*_ ҳPy$=; Hү;6fm ^޹UZ7Gmd'aWV/Do'd O~ՒapeF$ׂ¾ǘ(<&/bv |]sLřFVwy@rhkRsl7ҫ 6D!ḅD#عN ^|]M7Їs$ ]7Ցdo8m-cܰ8g1YvqN\.j8g7+*H (tF1&G= J oC<>c9h!2vCNJSl{rP(cD @R/ yX&;=^nz~J;Lp`6OWEլhkIMk?CC 9]iD,m7a.!]`l66AɧI#6ZZN6EEKQ!VpZf8w`'vum(=t`nFKޑ~O1bAPfހ &(:]-(Y)ki Lf,W4vZsAI#HL^ p M~ZTin_ ԙ_Ҍ9= Um`mm)*hb>'c^5FAct%_2+'Ǖep [zz^446wXO,mN+.o" w(pKԢ]9Gkp^^>Bl`^!񅴀s h!'^ 9ղtյrL[#5.xw胬&dl&}:P`:3Czil6uZ犞>Äܡ(I>7؝ Ieƌԭ=? ͊ 1X] EE\zy:x\Y܈H 3L ڤx91i3zպwqIxf3*F8s_*ҧSvSyDfֽT-A=Psf-`PZP;Bk/Ggy|W1EO #u`x.1Q/[j%Lh+Lҹџ?.[D>4",)KeT|.AP̙[.bu%A2s*ϔrГ0xãdÊ[a Bo hձ\i|e:]_?`&s'ڧ<ݍ¹;ͦq ߭GEG*کn baTWtK}ʳWdz]Q=U\|oGˡ$|23 Kk)< fБ%ъɨX#?ygWH[U. &ٓ{j:TsBmO_{oKHѻr.z`:יּ1 Ŷ-ǫ  !Q&;qߨ(`w~(/i"t :.]<\ToKuuaMe1P^?H +@?Δh6TТAzvo+4Ah,E]X!S>ވZxR6KVt4l}Ibs 'n@Ve w]CoT)ey-U*18>{C<2 vh/.r;W[ MݽfU/ cV44:Vf1+̱5 yHN$!*YJ@&'Ҫ=a_IyySzES-RQOw{ bgab/uj+0hjp.t9S#̓+R< ½!qtB;gg<`LMqӒCu' mi~p0Z\7q< ,Sf,z19[Euaum\b<]hfQebǡB|,JVd ꥦչ?*F9v`?bksdf+eJMTܿ.ZA,ǔٜx~O {EĄ&]0Sy'1U黫vy0ׅgq=П ]t| U4'M71!Љ{[(fB4Fލ6QD2?YN(圸C &C336Oȝ+ q43}⫋/#"xvOGKUA aPAɔ#T~LZ?#sBĥ=ZQآ[I`B#7U"qϵ*R:5qRJbcKBf .c=1 O`qukE#pV[FEzW&_sP\95_qR;@Ӣfcy1Jb@- <2?`'yk+:%8V/ú1:\p>k-PhUgn{,;3\I4;5/>*sh/'5DD.G69BL<]nH~gpGeNseqvyHYƳ+Ֆ"d2m+TSh˃ŒL+p^*Z,b"ݥdERv #z |g_ݕM\itd0ǽy( k_H٢7@1J6x\Y"F~`Jc֙_66=t N'SA rvNXA9hk5YZ35 I$]P`xr*G4 oʎFw I{|w?&W|5%y6 K&=K< TH*%o4@}O2qY^1BzumrztE&1q`U1cގ`Fx*)'R[|. Ҏnm2'J$&ӏ/+H=/ۜ& JOS}U+ )uՔ>ftz@ 1ômr2+CXK& pNz7|gIֻ:i 0=E#q168Szj/T̽pp-;+2}!l9Ta{RIl"#ѕwټG{#X~>}rFStȔN"ӻxM񛎒 @iuzoL Z Ŏp+S/%:!?[G2 9S"fZoqk˾Nht :`]tW&\W3>~v f _M#",nk=/GmWK6jYܖ\깝I'~R\z}7%e 26jdRvV]䐉n|&8P˖p$J 9݉B9 Ux΂&n I S{KҦ{zR!_'lZFP`I!P'^u`biW_!=TV&xs/^4&$RGUՕbB"k ѰЦTt1Dy=SD, e|+c0ⶁ c(Rt~Pjc o nzoa0 ;>dYSL3T36ԯSMВ{o*ʉw֤XܳΙƜګ?=OZ\.CTUwh֩GJ!a,#Œ#WYsU6@kʧʻ4&Xt*L H},!Iʢ:lPeL^6@S"əʡT ]+~PO1Fsx> o/{rg̊ m^E-ۥ d@ul _!6y8( w ‰-Ĕnˤ/n 뱩3I'KWbgkrz;9Qu؃ˬD"WY' G=|9S 7Eh-8Ncx3U! 2(УBz 뉝yIR:?zΰ[(% !qAg{jP"Rp 7C8i(dIו&wN W4Ҧ:%̏)IS7D}g3:@#5ss2H0Ѹj~bϐ(/,3~ٳ%$D"|dk FMOU?t8-cX(r#A_utiHr/xVOW꺨Fv[  *ɍO`UCtpQ1ec7PLo!x{oVuߗ^@d2A8BMG0 药ٯǬp+=LHD=(v/AV 6e)9˱U=`Ϲ1W&#HE.ꃱ!h%"yy$[ E-UK%/"m1nefOnFc q!-[HN0zP!3'rX$ LB[=Y'-1GaĄۺZe*t֐/Y9 {O_ 'i hAĕ3kWf}IVKĎ-TnXNK,'|nm>䥈hNH:<㍐OL)#_FrqU]։(KO_ |"uخ>Kw?UfJU"w(\. W18y9w5(+)v|)Փ/\kx (,]D]"ױaLIuv[ҞĥFwoKNwkRQ/ZY^9Eb! rBwB$2Q!eB3!!`n:Wh$B0M<_8Nоz`-;jG'!N-\c6]p׊ff.Zϭw񣉋(i]Gg~0 áQEɦş0\?YVAthD:s_Ha?n/[~/S!a DD-I84qGm5O3kFmNg~ӈ?4} s١߷"@D8LRxWvJ{ԆyփnX;lbUbVMWc Ej2U@DtCV$mRQ>dAr=CaL~=:s?-#)uq U?!)*ިC.F/lƊ4ۂ:H}Dn\u:l[HŔ#aWv~*dNBˠ_ 6+޶Te*ǒ$-ude8`RъY` 4&3AA@f+CF.󽶈_) &!k Yn j84uP.5-ëɴ#55m7kl*TݔP>@#}X*H9xv^0]- UDG3 ˗y#ٳ3,`7n>?Q@Μ֦Wt| agT7جۚ6n4ePE̫|p_%*A^p8 ňpĉPcr!'5*T=G_[^Vyk8&y @e'ɷ`x'#Bp:Ku`=\3[~ z(V4W*ŋ5A0ԟoClU0,p(!8Ք絰2{$H&ˉm#ghawCG%yAW}\Z aS57|N`U #HFS ﻅoV0\c@JU ~ryD|hv]1&%&l7y 9uۺZhOT7lX<(?YKlg"r~qz5<[AU:[MkrJWhK5'©E—ۑ0UB&jSNb o(60[y+>J+LE[8o)"R߼S>ҴkBSl3^4d@a7h(/{ Nl_x^8sqd}Pe|`m@d퐪T}:Ft+[$o׳w یLMZ~-`mI$%]|~ ϓJ"VAEu>9P>͉9ZNOjqPk#','iX- w|3e*鰬F[bG{+؝gl8,Uؔc7viVDVӼI<➹T#&!zȾox(s tqz| j9J[:sQ(*n(N=iP6:[ o8UIzUh!:c93Cȣ9?,߮P%veyѻ)ŷ2~/ p\=qC"RC _$:_y.G3A?1iNv)s<<Z@?~@dd[iIx$11&/ ڢ~hUjQ#9S*x'N׵,: 0s{>wԇMTgJW4jE_8t~ʽA3MN9R/b̆H]2zhX]~v۵{Y'e|=TmF5(`Z5檸tF?@Esŀ'N&Mti;2 Ӟ|1$Fv~Oa^Ay ]e)5 *-~Y,UZGLvs>2ŵWHg%Oh=iVZqZ7+"Res2I)Gҧ0n!AKatHJ4X!2m!4^5 *w+=$Z4tnL_{/g81Ht8R$WlzHl$GO 7̼ի(`=K,"l1AGy!v6IdNԨ^奫죬nM<$`NA)_o|koʰffTIć~&8:AfRMGC zOlmzP$"c,k' UdοEm%KWA8ۀR%:Ғp7 [rj$ VR^7jJ `qT^^԰|.OӞJԏDU#c}K4@XujM(4< &҆Z2 l ~]=Ͳ oז{) M*LH ѾW %hq+9rgg_E8PR5r1 ZcZ @ rR?B"͆&cWWrc'xh7j} ͇1އy(l9/WPv  X[Icr)ADg0ӝHRb z/gùmAtxMEg0sEc@` s.@˙~~a.cx}[S -KlU>jQs.|axUef.!T3HQᐛM9AoX\cEj\k<-0M\0$鏱eMsW}*/߫=Oaq-?(Ǒ|񗓶brQJcddV]-i=(pO=5~A1T5וF;Ex=jma۱&Xt.^ Vcx\.R*^7*`YG DFQE#ؕ˖̙|_{վl͒}VC8༽],v ]k!})"T.,5Ԗ! E[UR$kExgSڋyT2J0ƳKgK}2cMv;N,LYVHkDuۮ d=;db- qV"B'Ga\15dQ `Cxhl^n!WCGn4{{ g'T#"\6bv 0ËpC}ZlꦗaZ:R ,p:9V~U޽ָRVb>U! qkFP#^ y^./CZ* |y/@['.TgRLO=/zƅveAηìӛaQ?YLPƁ߭g?#r=>˷gkbPrsZ#(WCl|dq{ hz$O"0P$QnP'zCijMdF*R8 atCH2hEN[61` L*a]zhAe(wdNNۜ8J&%]?z?|~ž[cnh2LO6Ocyڋ40dE0PlsN^gp}+g F?IUfU[ME9|+ɍtQxfosN0SDTCMSȬ__4"i,]u6vMzp#ΉXA=$71o!"jl\ao٭2xϟү29+tHeuW$#)8]9\{/Rgwv Gخ~qPl3_]{} };ɥ(\(vƪ.>hZ.͒,l U]OY/' G(Np$r tSC3"94jE6R̗dl'2:PFiXD…H$fY5*|\D3 k˲e寧0ʬk/Tb2g.iv%o-UNLcm%xUt7<WPX0]c͹H| X:bʂiJķQЃMT=bAm=k!oJp+Rv/UI)Q}xNJy'segvM3p]GE~:r_h!uɋoB$?=-٫/效zQ^sK+`QN?&QlJe!{\&$SXV*R_U.`h澜t3 "Kx̫j<b&coiʙ޳@g(Ӓ9 T{rWoZ*(Qy6-`IFk#&A %1hMasԃFk%Gpo8ohȑeYH(zS衶 s7c\MdE.`$$>D0LR'ܩL VUIAGšo&CoږT\#CD1N{lyX鋑-7I%"񎖄;vM=$^41?!OnyU4?[sHRz58L0v;)Cך{umfE{)A5^ aykƲNٯl4w`cJNcq2$:qx4F/.Yaa_?ڞ%61xY :DOНthMۂ2~:mUרms"$%T)H8\t[ ɓPXn/ ~:t>ƮӾ;wx_lѼFGr9LrÁ5Gu`alz\O[MNކ|h:Ejr2ZQtveJ^5|5N[zYm8rLN4 w;gV2T^D@C2C#8ͷ_f0AjR G$9w*$J8DU@ OPx]xtvvӠ&)wHŽ͡='-J.eGiUawB^0wqEeXQ1RVgZIGF:cu ~ gVfgyX$4|)zi_K=GAL5 &-^EâZ m,$2Vy Eu ,T:sRS>x׫ga5j:-\*3plˁMLDڇ#D 7WqGDĞ:wrmgh")ߨ1y6Ru }K ڜ.S;M K{s lgb 0kpz*UAx~AK>1YR#if1i_o YAa!n#?ђӗ"5:䉰AzMĞ 撸>w4O4TaHB"'\%)au̫gzҊg/cxbtj"ѩXWv-'{'GQ4-ƕjd|:Ɏeݼ'icdIF ͲWOzz6>歃B,nӞꈓ=6_][H Y"hWy*+I֗[߳^K6%6n8H det]ì1dH_ݿב1hPX%v'1j%,RrC~ȁPi> S^q h\SWGWҙڝ,~+ٙYHްs\{[amU$|?0ћkTEQ؟:m 6K3l |+Evv);"M?njfp3:(?% +E8M^Lbnύl$ BPNگ;6銚e %& 72B0%k#b h^á0| vb 0-N.#5"UH5N R,AXz ]$ rSkQQٝy9>a)/XJUis`p-P[P#r g Gг!^ʃ_19WrCpDv *{ʨ^v,c=x:أi'Z]]|OVVMN_v$! 1DzܞKhN0;QȬ/_@|qXI=I4.eKRC!AamqSE)nn[DŽ++{re 6/̫8àES;ʢ_sy݊,7leD)}v܈iM#0q]z)"&,{/EzE6Z]!Mk_YhfIR5A˂#ִG|FkiW{(`70%؃9'sNK$GwM])]>]EN 4 i~-7:Wv'e/IfxȯCG׃fŁ1lDbu >%SC /', `>ӱHy>Hz'18ZPjO1=Z/ X\_>Mzq)+^vR0WI&afF "$~Ns m+YV\JZuY}*ۿa܉7@NT*hCr^3!㟔-j5vpfՆWJEu1ep:x, U_u= tOhO¨ɷCHCM|ie{Y!4$~TT Q<" 녨cLNwt$0i~K3  |$eL«%R1C{1DJkV.~f~7m%0&-k.+Y )ct~'쪬f{ŴJپ0<>  G5 ! 0,^BjrqԄyr]&2Cu@G@av73tʭo#Y'څ&=Q_ADF]ӆ(^^ &2`#iP}0Wʒ$k4 uI>5#-$ؠή]bdUQ9X;~QmxO^GB':TwjO?`y|Għق}@ZĹ{A$l%qG>4T>h&^%ik/%Q /Hy%Â]ɨ$#WqZi(N,Rnn% wPV\퇭_)Ҭn7aڲN$׺3OQD>k%Ĝ~Am|uMr qǠMzejϘ.0H\|5lӴ\>+|kfpB~QpՆD2/xΟqNQTkoϜQHL:F}}pR9?X+j‡8ۍX "?8 0SC0eJ(Ob*=g J;Fآpk P96(FB~XaB$y0x-6'|'k 1;f#~td"Rہbv8>1D#φ# =<:$*j(|+ PiP.Bh-}`c$d9+)"3~-##^Dps1| !F`/TM8.,PZd]o2X18o=Y2 }S47>B.nV\\mۗ*2I߬ )y>@݁FִRmV өI]JbSy=<> gԔEKFEq .1 FauAYv6m i~^^; J by8Ld&[y`2m>4 7L(U s=PVnSpsV)6i?"fB᝸ypu$jgؓF )p|Zbn@3jFQ/~!Dɲ]\vظ5-^A;}e*N䛎\I-RYV],0/d noX ӌB{OeuXmjQ 8KE' YiFgy|?epu&) D#Or%ʭ.']90Y; ]1!)0A<&=I~㖴d!  W˛+zdbqQRY@| :&¶lG r&l dUH[ ɞ֌7N/@[ח 3pN@(q>}L6MT 7? ke=@ Î&,ŦUEeDsͳY3N1fЀs5xʧo8O0 R(1}J~zE#pzT H3:RQQAp]Ң]X79 S$ph ȮX"PmbE70Zq4,s"> f!wշx"},x2eUQ 碳+X&2BW7YsaiV .zp_Hlxb~ిnFO~zCncb7 &N)^0YyՕvmNO5G _Q\yI*aknSըz)'V/lM{(4jH76֔έMxAc!ɒS췬uMI>3VIV,D" ү]#yא5i&QCrB*t- &*M+Pz ٲqV*T*ˈ!~x l[t~-a[<$ʥegJDÆ5X*b27ȿT=X/ms}~kQG]ӖnP>8]a;o+K M4Mr>CqpP1-ռ`&q:y>{Se*gCVy咢EU?{Ԛp!S5:%:Z פ !Hh"@dĆal[!wXЅ10. <014-EFePPVuh0Hs$t}# `-NY>dnuSXtGYT9>.&!]o{316B&tȰ-x҅@ SԦCl=TxWuNك01t)G}ĉN"7X*rYzN6D,'&b0P~\=6Qm`[pе%ber<`4+#عn0?s9N1GjbI3c'&'!eo˷R{`@siqڱޡԥFEUu}\Tiߤ?W ٣it7d9jBqPI߹@Pѵ\/`*^V&~M? imFZvg7D6IqjXAW62,]F:|V=-"rQbveOpgy(zs0Vo2f𸊜YH8)_af^%ur;)^1ɓI! =hl&#WI0LSd7zE ?#K$s\kX~^#^}u'˲#sP=P1EU7_ .p&8Ih+:z[,&ƪ %FV%MaM\b,Z?\x^ ӝM" n阖Oʠf$6m_ci[ V(OoyB0رL=AҏtIA)7@ߖX2;X oc!:)F)$@\ו6QTcԣx7Ι`ć7_ĪpOB?_~R0~;GwHrCEv#_LSCYϜ0;vqeF2ū&P|c]Rohkao Du \gY+D$ ϰ[)^:A2, yBa -ѓӡJcːME'.=)2Q]1&p+Vɣ OX6EhNK%HDjYf}_5:`mdP5QS"֝618c&|D{g[-_S:o,F1:.nyRޗ\3)K0-F%qYJ3kkEx^)H,i8S@Pbkaݘ%͝^ \!ŦzJvFq̐*Fa˭EqoxS FYj(iaœ2;.׌L53cYş\)!PQ^^l ၂(Щ)Oe"4]ֳ-IQE<3-tπ#G7h<=G5D;,T˸W1i'9綵UB!l(~+ &ƽp\ Mcv3;ajV.k\`pXgec(+݉4:ZwHb&N&k]#E{VKnE"*b^R}{:_;SݘTme ᜌ/!?(~⎹=43:,HQ^.8b&DɯRV!L }E&q8MoӲt=⍉u,(nS^,L!,>  L^xYEG9{C /9Z۔=^f ,)ڟL:xZ'Ec Ȥ ]w0? ߝX_ў, ta=ZΏ,1W]kѦ1^ˋsΘ3UI6UVXs ߚ+y:MO(([,%7 ު1%q`'  -py.Xhp5}/SP ! z[t>ܰipzfE7~,ZlQ},LW&h 4ZR/HW  ֥#A#X[FyrNqmH߅=~^LpgARPYk]PC/$G]o4/i8gҶWΪiRF:yWqu_8% ڊDco!.+ ?.i ==M[BJz]tG"qL}&mԿ)tNVxQ4MbW. e'HU>ek q.wx:ޓ>!T\oSłn;o-'k\oJB[2XWH:A29ʔ[&\zxA'7\E!FE8]=cry4TlH7$]~^#ȑ .ǰƂM-"+5~H!]6[#3BLs|( ӘOg~8\ӷZCaF.ET݈/xs]Gm7Զr1Hb~8 ~BLX5o$L_/"Utܦ4\JxrAS(dK1'EsSf*툱h<~GMQمBYd1ʺFEY8[$'I3 mvN{*?5x/47Qi!4H7dXO.'p!'ng{]"dt, ԟT/p6j'yR7ܜ3+xK Re+L@$R֋?0JZEZ.U,hhP\y\dvEHOWZS9k Dt  muh0:)? 溜F >byWQzv䄢P|شP.؎ .tQWv 9P[}At@u_?,@889":G}e9q}] :!µ<df>b{a CS L]}tjH^Q@sGpz)m AdS88Dg'0&iN/oۉy$h\WzC9/bTᘾFdGu/Tͼ_sF[ͼI;֠pO]Nri'ZxWD켨\L ɇ#`? C]'|J8|闻wWJo* p_ Ftz4,mt䤴y`}-z'2Ԟs}ƴe1*:6'tPG Iu,c % tXV å1iߜm``ZN]; QwzM`i4EF+F:rUL$t ՅeB`K*$u"$9FPو`Z"A8 2}TӉʙ{=AvV€?KA/*!~Q/?vqiSKa"ω6 I3P(7nQNli`v'b_X$M#eqQX*IqDxgi.NrCGK8ü/95' @6 uDg3*vr =R304Ԙv_E{_-RǾ)/ Mr.# N.̆6չ2?)* 2b-`4tCZ)N\xNSWi.|t͞X^,$ŸgbTkB|>K;ŽE8!~Y6ebwgas-ieoxo#򪫄0SN#|\w O#s-WJRl=!l:|_z A-aU` *S$|=W1k~Tt 'Iv&_Ŧ6{q@An{p2V mWn#DjU 印X+u׀nRݝ}@sMsb\ ˍ!h(߽'9~9Ï 7gQ=0 tUU4kܼ$TLd(y6:^V*K$@<3Kxc.U=GǚqBY r1ݍ]/W>|$li{6{~q w㈚MR/}Lcm:Ti >^ϻo3<4D?$/*Wc츠xM"&l{#a!E=h4 SBc VTmH/gM;6#)1T:̆g4KHsAo?Ϯ<47,ZN KBfٹ7X?reH_hwJtiֲaWP=rU-x0wA9m6lP q|2N hMwbq FdJ#+M+@xne[?fZA~1L@07``9Ddͺj:6$S\,' {jgІ8b90pAH=G6B4L3H 1a iyTn?Yy-UUQí.vsc)C ?!cMX)đ$D{QяH5u >~f Ze\||Čte۵ͩ)8E1ћS%rBF&Nw!ηwoPkM?,V6qqK zbw' n6v(nOdgSjCALvn/L+i^3GP=oK([-8`ejqH'g_KK)E0}̀vIIũ1nee~ Io7w9F1]קjyRC|³l;99fDkBTB, 9g7=I%h5e{we25!2cs^'+qHq`LjG 0+>Y@rF$ǝ,{xos`̳ wcWE= Y+mb,j'>ڸ%Cz$ᔊ o!hڟtFJ^8boq6󀏔PPJGE׃+H§,F`ҬCcmOq1P v΄w%pJW%'bT o~R93Èfc%&_-#oTM8קP'ċw1>4HNp 5,z $82t)ׯ(|K~,H%SJ ֨-ĖW֑:ףj4^?O rײNgߡݺ ~c\z 7_u K ^Ȱ{f޺,'$ގ¡+ʅhN^bXªry_ >*"5%S9Ɖ_&GPbU+ؼ+eS`Ջ}^'5zI5 ҝ7,_$cF\h~̣ 2VDX`f6%6µ^uQZIEAx0pSenqgk=ot؃q$f)ƁRY ,.s({} 77|OHq6"%= ﯺ,/Hw C<b_M9w}?f/SHd 'μ30ɺnjİ=U(Lu`w$=lc/9 :9,aSOS=TޗFiadb80 ̄TGD [ZEdamKH׳R$"I)/ŵvw-o[8띊da3 ڿ jQo>#'kFG۹XrQ^}hP_fyV}q0cѳ6#RJ(C]0{YU3u$ko>\!m&Q4=rgw2KeRqW{8;?^cM4} V5%bw}92d&yG8u?EdNROò#  +"|Ћ1{cpڥ {̌B^f%~MZПgWG_?kA*F(?o!k'6!)#Due҄UilVk:5 ""칀qE#~O j8uB^Ҳ֓l噬\ 7G!/6L>~)Y2cg`/ؑ,HJVU!*@G'#?Rnki5x] < (6jգY;{'}r}r׀\` IQO*)-=V/2 19{ ^,*}9q:-6uhfxL^j \p8u*L7.qoA<[MF;<\émVWҨb^EMpUg)ZLDF7V¯ uh<{{ti@2{s/!7 ZS Gwۺ })0 O/f1wdO:C8繹=<[0:)>K׸Xp#ߕ3%DW,=Oj5п`㡊H8)De'͝I~U{ (9V4,Ф9($ŝӠ$@!=癩i ;_JjeRv;jS&pij G0*, O;"Zo~qP{;Dmc 2uNy[;ze g ƴ`b tlywIU@ivkG?irP0zcG駉a{? 3TWChXw.g=M|UۋH[)߱V3Aq4YӊdJ5=ذYjAkBVn¥R^+lPp` ;uF^,#9R\Dk'6guNK͗,'֟_/wvMRv/;TW;uCzA՝.55;Jj,1ga4~Z"k:B_Lv-!Ip@5}}PIy׌dNGO{/uj_-*kUTu'L2ʰ0.Uh{U檔|-U9@{v 7BD+xU:(kLPu_Z'*cv8[j:G]ɨ3{-V/Qcۡ֯*cZh\,0>|!y],.$imru_jUC58 3S/vkᓚT6 YV$u]}yBl6&һșܩ+@ۗkd"Pe@.fr EvzgB.\ h6,)j >UWPjVBzQ@p 4 iVn Iqhd G|=>\S ~j%l*qnaV֢btdXd{،\'DgCקΑ bt'x6SPRBH -`D6$)THq˨Cd>\+vAA(o@ȚD&DlڋT,d lLPeN?\_AnwIpIt)+!V0^Pp`iV%L42dPN+o;ު䰖mEpc#>F(SٙS0s6Okd땼z`(r$25\>!U!<5ZHg݋;:.]C m_e-]SzaA$kdJ_~VhE3a;-m_ۻo'[0A,%VhqL||e>b)3Lq.t[[Ds`GOU ZE B6W,r7#A~ʏZ'Z|#_?E̩RxWȐ=t-y =#Uq'\ҪhA7n3_ snLeA9( C?<\һ >?Ssyg?pRL*hl K}!+'wsv5$ qe,Rj1a jQYbrI1.)i׵>19gfGLqo&;t%*q;D~?+2p4Ku69 \k ^ 'mC ӅHDžIm(+F LHiF5d=`jhM6ml4Ι)W<]P~EHl_cP7`2l CmI#=]Rڛ ϥJF~?h1褝Mdi#~lWNьAg`1DS-:*^9a*XW;B* HY>Y( @A/USi}eOكbANg"@rbeZ!H]J{3 ߅+Mɐ >וȠn\*ά6!O t}z$ ݦtG+-]d¹Ѭ^h\u֎%oȁ~ɾ]_ҷ)=y"K[iaטZA0۽#ڹ'4zqJ*Z7{,'m YVXgܻ \=RB`۬4"egӱ"Wmсw^ti*QbV84=u<OFfDԼㅽ[oX5uxMcɎ:2NQomTw&N!ZTC9ǍYŝ~Ӥdorݡj؇w)L0w1 z&,QQae]'wKKz8U?]+4rD&~-R|0S0 xZ4k9NV]YA@= oN$00 VGPYI'M. Ɓe1Z`h["͕=C< 3WBe`\pZg[EU>/eVϏ~~wpwAeymue#gpEaope*Y gis#D" NčT'8vcx-;Ú@~a?+u'I[ @M+dA3·Ǹ5CU&bb<%hR*C:(]%L4-1F.Z|;4S- XJIElki 60:(ӬZdgcnc ,' k/JeMl˿4P]V`g_-KN2 :8|/H8 }YÁkީ|Qhޛ0[TA]j?ě #߻Rc 57x }FMp :R33Y6x^(YՐClGYƵ{[fΧE.0($|~lk;3*E)dgmTT~vv'd 5~ + n {]:B82g/@Ij&Մ !)j) //g#4-ޔ΂kο1.N7UTA1b$O̥9ŕni7p&۱CZ4v4fٽJ&$g#ΩnOZhsu=a?3*.$kC`tZVO6s@ 0ObѲg<02;wLvx)oDLQ۾_pT jK^eZDϥOt̏1h*[`^1!=?SfsS3%ߍ&ye1,~(6&wlV>O>-ly ]؇Az\slJQv3z"0j+ "6bDwp @, }N^nͧM7mŕ+m1&j1:;b~Gk]3fGP?p`@Ǒtѷ6%}$fG`m4^pqDI SG4͛Sj)Mº,K=X Γw} z/ƸS\+3+gm&ndfg-2SzuY>(EdUkP܉-{ӾtCJt~b `٧^v6#=Cy\{+dNZ+$T̿3P9"| Ǚ/4rn Ѡ$.UMN6.i g:6,'SÖ (yGux姈.nJG >/]Ȭaxv9LJRxn]&FUeL5@>%SVk@ =Wpվ׸q !B#Qםl]0طBˑ 1ӎzgnS#n"f#!DlB'>k PMR{+D1רԇč@C9 (/te`/cɊJQ@Jwjᶒstē@ 47;d~#@(t9I2-~JGGX$WV>3b'!&%@\t!CfZB,.*VpDD-X-!/2)($>@Թ ,OGI NIעQAϜ([Hf"|kߪ#-n*;z ;o<I$6yJ=ػ591 --&mO- 9.e|(C k+~oetbۻbl~T (vG񌶱ip5r,f&r)J]MU֍ҦY;%e\  A]l֗4&56{Kg3mJMm1 qVL`4Y)HZ>Wޮԫ,+,KYsjSWXil _H%/]Fm0z0-=,(~/ ^9gHS8Τq`ܕm̉ _9(L:&y-^ 9R_u4Uϧ %I޵0o{%0aPai2ryr{X~)#j=T2Qb-ony7>MlpY5.lwbƣL+\h+2Lgn8<#_e!,qT# rܼ&om4ltqw7QLbXʏj_ח_}Uo|'N7NU7R=vgiβ(+4K б`Tp=eV>N@ z)٩Ǣ)ԃ1 @AXzmAuN{9R"\PL T6HPCpva'[e0{MaF|7w+B{][a'Һ߬=;xn3wm.)zyoFSHiV𱐿0\[_Z(f6WnZLUP݋x"iAPB?OG+O ǎ (~dT3_r#jm\FAhYr5 1 nnY<٤zM ĩ+L׬ 34oB}zfaum.v©8OIq[b glݑוE|LG)Oҳ2b`i Q%ZfÅ STY[F0ތ +]@W5]!هQUdg wsþ)ez>0G6#JH[+OaҙHA*ā9Do*1-Dog=7=3q<+@+%Mĭ3C,%JQѐE'b2eXtR51M F]/L8fn; z,)X/=C*2Qv-i7 iJ ]}P/9,rvDFb SsǰXR}7~|pJVbfL(㘍i-S,ߑWDj(Y/h5P,(y ʪ*MǵWrCBFh';30Z'H Qih-?5wPds>3OAKTBnr`L1Z@$Y sf::*}#*U/ 1M&)Q(+ MPįMLdR5g8Sf0(Pg"c F=v?5LI2h0gKslk$ט?(sYA>@ @ᾗB˙vR;ǶLhd07@BD-㊞ mУVBYѣ6,RJ#}#Iו2[иJ.ʐL}b}N--eA UEZ I19梧Ҏ'X 0_ef.)P1`-Y`M_FO]\ʁvlĉ I:=I^\w(e-W"QMv %wK2{a%3bwFjJ_weT /nQN$w9l:2#a[VXQ l B@yN^C)W >~&,-_c,bWKL?UyOɔ7 ~ɵ-pzY-d N!y5$gbFwEz?& YS\PNuѡS!7#BB5D0hrsl{Rb@tpsc)iYa58y!ep~~b.M*."Vad'/clLm8~V44e1KnQP_?*QϫA %c\1Jqt!t5O.#< h)߁d(P)um!_n%]3"bIz̍s~qoS幣+txTzyGዊ毆2w/sA@Ղpݗlj `deҬsnvԩ; 2}W:;!#rB@:[~AF-ۼٮ{oVi$bC(Y|.$>x!%5N0H\\Lc7|K)(CmSyٻdۇz[YTtdD$} ЩuBV"DV>!sQC"̺Lw>X6vlل[ڜ~>(^) ٬{DH?&)ݞc PZ'2%x4 Gfe#^n!UqlS46ayzbqd뱮촡B~p۴ TdQ{|&;vߗTF[khY⊗Vq7e,pC/d52;Wle4Olf15si ]dP/67'Ȕ޿䝃x! qs)ϒ; =3EfV66wIȡN!ٚ SGb bG oFcW,ǵY\ddM%u.ڋfo-H XW];64A.2O#vgƢI % JV^m.l7bF'8Iѭ2~ %#A& 1֒gS+ժ%]?qƪaRLcgW4r<}Vq,7})ǰwS_+C0&nl$3K.^3j59mrsb&ƕ)j 󫵱IgdVaO4Ŵ%UI>v 4ٞ'zZ~\&!#HY܅.Zj:됐l^wR2 Ҏ#}7!㘪"6 ]T>KLx&pꨟl]D1=pO"PUʗ&<ɕܦs(XۙO*2° *:gf  /S]6g[uwQ8[H]蜍0v}%ơ9 , HUGD)7cPB8ƅyxP3%;lq۩YFMW9nBBN_e±85&0`V{^jSMrq "dufCܠm}y4w^-~> /칑|'4a"}A MAA` ?TDSN6xoX9faCX+u}o0\} JƱ;[2oޅB2ˁna%Q)e"A9 P֧TX%fP*;=<U"9pDe-x8e>#CaDX(P+_u dFf Ι G%䟀2G:G?Dfߵ#yG_^K"E]g0lᆶ;y&WIm?$>V9&$oz~`lRYq1(_zv!/$J2")Q8 W'⃂7sIH.ӫ*madzۧh&դ6!r/pi9?]ej,"bpx堃,Gn#龒>91[:}ܸ^"ۆE^J=+"`>yaqJ8G/v`d(ǯǫ"ߣmϮ!,G1 0wWi+Wu |elV#{0 <_tZӆҸ~)dV摋q?dm(]*xhHIDŽu%n ~l@/Cy2OwPy6P"[Ǖ{Z.7KHӡO L3~Aμ?>G!,d" gƥMl14ñ<;&=c)h4qn( D/VAɽ/JwBp9Ҭd}-`4k&=’++; \$\N͵#p6'O)PRdk,a;! E"j>Ge9ҿU6B㚝C>-k?x^k*(4: zGqn+u{hu_m Ӛk% DC ^bvS!O@:AfoJMbJV7 9-ZVRHQa,PD/=$gx{C Q[$j:ua}{#=Pb!!;cX4IٝAL- *tzoe0%6<טv*6ճ2ț^i(w*ߧ!Q(Y/.<ƴ4/T!}w<#YS¦0ay>]_n#d lDͅH_O^Rx[eý0J_CCi @m^`|X%N,4;1[Bsm>pllrQ1xv>ѴHk{ aMk3Yߞ-K&EǦbnY I%&ԠK#0;\l+YOfYۋp a@|' )=7A.@&Q䦺K)m0+Lxc1Hp- /?ҿ :|d"St%(߄x c/9- 0fOM'w`Rڹ@=[mWE%1y~$JW?CNQ ho53JA Mϩ~/RK f0)3w"60 cK6E)0Ǫn"5 {2]x&F㏲ڼۍːM:+ y&)]_.Ibх87%[s_Kh& ~!&B>短d,+G[<(ʹwR -2isF^{\)QxäL2c~yg*ȈiҚ1z;)&Ubi5FA% ]/Ӆ{}m茬z:s=fbe}^wz"៽W@:tNߐlnq<ȹ)urLKz^][}a?S$B}$a%nK9 bW\a>ij/Q3?;zVe B;r`罳޲n9Sͮ r.yu݈$Ҏ'1ߒ$!N9P\h5fvVQ>[}^0VX 'ӧe7ٻOȚkm*T z=|/nSJ&fk5]1X!\+9yYPf74wp7V0@C~O%M{t'ʨzU8yeH5SU ꈈFIޏ-Q(p˖$*$ Ld؇C{x7\up~B@ZZR$cWи (nl H^]٥ }68\iyjiH-W/abq;͉VnC>_aSz3k56Rwb96!cph$#~n\z]a}󰵥8Ilx|m[Y{]E_jN0tFvY]0G# ut\3$Cҝ.6 ^jBF0T燤Мgծ!l`0ɎEd>fGT-V6qqeqx3r'SG$#r?;mqY%FCcuPy !GnFVmrB4/SQ Nw&L ${CR!,%e/$}%`oO:'ۓE/]tΠO0Pԉ&*r|0V/YnD`B ޝ.#es"~VJ1ْ ³<r)4;b{9FkKPAȊsY-+/YK}> S7E@(IUsGR YWKrMlb5.ԞIhEΉ2ȻGSG͘ȑK{apg0'5Dp k0q5d~X__CF$14!yiy@.VYǷnX^u csΛN+9Y=ሽrNVMz.G][sR]r[K EN8}H 5[~h1&JNնeH+(!6 0G|Kr>)V4%Dndqjة. fR6Ꭶc3-#CTWLҫs׽ =zp5H=RO3$ÿ́CVU݃:uAn|]c.&%ٞc8 L06 `x[:lpVJn'/|HzC$Z %GYnwu tʅȌұGח"x_);鍺sP&'sH@\.[y1VK_`Y[iTxtݙ4؝C 5ktt N aem; cu#%!2VBrQ ?#aZJIxjYr5_{P$nl}9ŹR?MJK ޳(oM.{R:>c[CKPzԗ).D7 '4?%tN>X^'i|rX[&ꌐ)yQ[ i&]~[2zy;X`MPSGium;wF#=tlᫀPB(A)qle"k{[7gi˘ u)- PM+&CAhm ;D>sXG}HIgFUfQ<0]xۋ, bژ)kOuv0sCý—je%9PEH\&F վ}Mðw`,2 c!5QU^o Gn fn7_i>}j"y7,$cz1`03~dĿz%h`ai[cEB jbځͫHbۡ^3މ1I/LݡpTۻ1ً F~he3[ ]Z=A8 O6"Fi)Y[QŀW:M|`^-壍Z+MkLps3ťT]F$Ot0D@0 uky3"taQETE}]%q;S#K"w-Klnh ޢKjig&Q9X77d̪`.1I98'0y*MBDGII徎Zo2 ܳg5[$WEy\1<n#h# A;1k1ac̜bp hq `t_ CgyX<^gMS18J/[EYpG.o4Oo-N,Ɣz m^K! WMuHhwGrK7w˸,)?&STd-@҉o1˾h5;MhY^۫إ'ȁ}Agx0ƨI+&KLiIȳgHz|dBq9_j5 Qwy]EyEȩJLP}|‰ݨًB:&nT\n,:EWY Cw>zr 6Ao+s<~ Q~˂QһZNK3c?W8hYNg4REMŮlbw&~ j"XڀzIc]~w$Nrr(0GՀݫ=ta~>~ ?Dd72ҙ#dN_]BdҞ= 5%l)Y`2F~ {kжSyfйݞ" M3=t8i^8V;Ԧ^C&uMñiS<i9'qW7ʻ1(1OYs&2s~1.C3%~M@7~g3){$,c՛΢C\;dL>MuIL6♬L&Ng9 ,*nY@P|jKk!H*M}qDVjBmA3ra4xe|SrM< ] *%wWK#NJ0$ #IW}#jںꋯyړU m?iYh :53D|N"ؓ%j NQNQt]:I7a292ѯЄA!Aa&<X؅҇8ns+t )nF?g-Qǒrdc:^8"pRR iqrI+~𳨕jYu.Wrm{{Yșz~\\ImBѦ)*sböl ?տE.b_0_09]d.8)&Dр]BT7j7ra#wvA]'F cKǏS1Cr uC0L40fF +NjNec Zk$7 G!݀TZDh>3|99\ e}mI%,9oI/"{91G.kQI#o$t=%.m,Z{-=ѨG-~eqmP |a#~iv{2$\g407$ڎ C0}§&W_q.d;9{ܾ7Onz"67Mr!_O_]bH_.HQCp.+bleOȕJc5& *uܳ֌߀'r~1t3 =Sh"M{A`qw}w 9D ?wV7)%lE+)-;sgL=_| H,6݃! Qw6WЫy =e;h|#ȑցRb7]>qމtۅSR9#6|{g OEwֺZT2H/&ؾ҇GPzSB0*zzߙԎseၞcӓ#՝IBP qwe^0;Vm6*Txaj_6NlY|E@X~UfZy}Η&\å[ՙGMlAX$*nE7vlXi4Sڪ1Е6_"_T}?qһ:ELtl_݁") N\b=Ήl />P*ak] FO^M%=V–mM2fvr׷҃bs5h:e.e$%Q$a_p\Eo%Q&Wd__c2|2'9O[%Պ`a_9ߙ` 𞰵u5iPݷ( 6Q Ymʾn6K&P"*X1Gwm'P`+ռū?$4tv얻ˎL7Qx(Bftܸ1ڤM}]533Nn,{ ے]䠼z+' a\pYaJѧ B/qݡWV_p+5Px#NaR&WYYll 3:ʀ%kqe@WV*RCz͢M)w$~o9g ~\IPAe mŜS`K, EUhp"3)Ԙg"lm/Sj_%E\p -8b/R%^عOm yqGH[9/Cdqf].L  #%bPf8349mj*cb,2 [ YHCp|^>RaQ ]lBENߍY; cKk=ic f7 =(MtUlf(zy7wf{Z/riȱ2LNIv;}ab{&]&uR99K l?dUfƾ1w74lp/Ѹw}Mg$fsW?iDxdp)Dہep)H`7~2ɱTkV,S\aGb_>VXExӛe!u!#{ MJaHґ!e]_~Yr0 xԨwa!Pumrkzc` clj O(^%~?Nݖ [G.Lj :b-佫Uu7P[,loQMH8 3cƚؖE2PNxqRhqP_N8rETj_1s pwql( jHZzG"u]Fw%rdP %mAw92@|C4G6_JޝNwj>"3MՑ*M-{8f_|Y-o@oD${ΠL#uc'"➻bY4R,njXms,.&䙜0,S'kU a 4/-s%~T --Nmխ7.ZѹaXa >Ó߲LkBbrK/Pxr G~pd˞HX g-m*K_Uz4 `9j]LX~ōMGf x/Ma^z莝r Ά/S燐iIkCk4|dF]ToX~`X%d>HXdlBFJFv>vlqPBt+Iճv9*T~`ރ"lhNT K&0LYrP ǖ;Oft$8}AiܬzUJ3r%NFm{F)04mIT?㽽 >xA띜[Nv0c,MRIč!Z}gd^ U}FF.A,8#?v<\ _25 L}NVJ]Df?\+ D+v^Q}]ݿՉPw@Ty)LQ&̂c@91xU"֚{!jhs'ڢ/Ѕ(5Hׅ]f$P ےa%sP7zBDL? ^VL LKy;K7Ќ8/gw3}QSթn[]= @z:k?O5wXX >)OS"y}=?n;: 0`bFa1i\Ao "lwy $j2ݔ gT!zL=; QޘwB<0Q+bdsrZ[i ݴss}kFu1>O!È͍ÒwAh#XD յJa,BZA3mNƥ_ tQ`P8 BGOǿ?@{3LLjF inr#Q˙Pq)< "[7vkKwKohWN\(VyEX?*"ք(2vSmo4v✒zh.ɩU}KxER7}U@tZ&`RD&Ebu 9EllkV4l BCS4˚2-MD[rܗ { r@`DP;rΏ~/,5 Vza9m'e/>H:EJ. Dp C+~| Բ[XGڞ$]{hkd2Cb 1 skhhnxFH꾹f-S泡?!OLG`ˋKu}2ϐzMAS7Z?<T(9A 6S.$kλi.UO9T(ڑփ@OgIF@)!4$2\ރ%ƎvvĻZs/X 77z,;Kۂ{EIJaM!:Dm}ԁU5q@#l4 i)kzZ'6?bvZWj o~cl# <ֲ0CyM, }<f;{+-yY:q@͋+Ӭ V:c736 O| b.f*ZH_Ĥmo+DESb#XSH"݅Ӈ|J+;l^UfC?uP}rц0cGPT[3y|WK|/\6Yl:Ԏ&s!~PfyWGGA¸kx|.ei%=Gˬث<}'L-+`@^#|FY>BhuW#CFQ=}>ʳUj-=MMu[#L]E$TN ,nNBCm! Hå_Ԛ!toⱍǛ4.H)@Ԗ"!5|Y=*Ba>Y*<6^u D:*L|ޱ$~/ *w֚Tv ~+?/^tp)a},8v=0L/)202qf3^F#nVzK>bMݰEBrc'˱Ua/ύH'+yw4A鷴XӞT2'FG?VpXN<(\0~Kkc'c~ C? y8Hxm@BWLW{ZtAĩ.D‚@6>\TD'2W0d@0׫s>!f}0&n15/F{Pܬ*I PU>oUw"**^ {+FQV4D.L"x9)@=wtq |jźs Dn!$ub#`8OɊA Ҁ]qq!ݥ Q8M]}E˶L*jJ@utx"mVNH#%~g-Kgv_<'0LsƇ8 GݳM?b(OFݺsu\Xf+W%dvRpIEQP $:)c޹%*j)1yMNihZ9[kaXOZR O&\&g6,"b^;4QQ\{4>C3._h)@Yja7gJ|G亖7P v2?зk.zkwC;tH2v^^ʲv(2L#Qj X{:{qvel{i7]_1Gb{8 &eݠ߬IםMhYj%^0<>.ٙM^T4O=r5rs~ܖ6qAzuf) D~ ^Ph^bʻzr-YE3Rxd{?a$íb[0<ĬSyͱA↘G8D"5VX=>yљkzFhid/PXO4Z=-ehb;hΓqaorHب-j5o&ylSLJU~5% fubˡ2dX} E`y܋OStXܣ@bldK77Cț+; }R )qZQgt6QS'2D\~q- uݤy6EMn ך TYH˜Tz+4_+u%Q H¤> w}1}uluCbs>p Hwː5=K wL jyg~CJ8әT]4Ӏe' dRw݂ O[!Lql`lekhqtabW#Eʴq(pJtx7h|{ "BJä^]rߕx$mJXcQ#n rZ 9z6K6; lj683o6Fð2!!ڵ4LHƏ*lƣX@COxj9}g>sM-M_^̮Y{`S)&).\f ɤkCbsAV9-E-Lp i]FP%×hxҊ,ɥ%lܡa NK= W? |%wg]dXZokdkڦP'#xDʶ<購q&@d/XTш%ԑ]lQj<ߢ죥h4*9JNv@]1أТXZdY,ޫgodmq)NQt )ߴ~^_I>.4b{GBd*u+"j?@M $Ys_5?0 6 U;ҡhy=^8*PɌёs\XC'MOu9dWQ\XJ_#'/4cLTs? @`}c 'Yްm i` "񼈏{g2C#L^,lZZV@ΘG}UHiTt& |^Z ϳu+` yܗwsl_dS*D(ӕy݊|IщڇđafٜvzRY0jlj;)UW#!6PԢ_~ PbSSu] `i&;{{, wǑBצjy6q8Y?*er9jƈD~ƊPUU- w `Td` JkҾ9nAUM&'Itcr^qq/cT*R'9;`E!Wӆdn ]XZbuHc呷8qE$tJSL i^y,'Y?at8Κnlg_GOsuPny8r;<f HϚ8]z+O˜>B7$&ff61RLa[k'*鐛=@X]KM%d-iuVCuQ~npH Eڻ '՚sI~d-"iNѺ"Vp294R0d*Z6FmV)%9κ}?U)KAM37Ypze@ Ynp%w(ؼ ;I¥b$] 2!Do+F>b`v.>MyĎ8.-#ܚ@0S(p0di0sPR;( ξ|Bw{BHOʓ1c~!-XpN=N{oR{FC|KxV[+eKr!÷(zyXJ邂FA47-G(w*?P$8KiBl o@j2Ɂ ޭmBPc_D.Pkٰk$?_hV5ݧFF6~|k! 3`@rA٬:3U::/vVMԓ Z:GpYҒ*Zna'auCODF^b˔+B*=Q'%--J]/QJywfL7۵kq܀65ɘ0tT?I<~PIX2z_irT7vrE`&2E7uTJɬdt]Y!UGcGN~e'[K:sR%Tq@tO(Sn|q1WbH F cөEI SaSNSéFjV_l>DήB{qE@e_ߪ>|oܽM OЊNg !4Η]T?<.0, c\Ҁ WI푣taL::qéuM3h[JlF̶"wwؑu_eJd{r\r|4 GWt c Wٴ35zhl3ᬝM *y=QgoWbk٘R ^,q͋0>Ru :^**XB^gHXGtspPw)@|91gሜpVF]ĬLevRh%<ʈ4yN*Kj٦|Z֍?2o~\+ hW,:́L]OJ/Cyu&cvKy +gl>%}yAδ@)(N3jQٗPQA_oXXPX62-" JR3-66d2) sTK! oUXji L8a5.'>Z8_+v tdLF`/UbJn9/&kPΒիñ>O$c%m{(8fR$2M00L$} a!-]m.Aҝ oޭ>}ʣy*Fn8Wv"hG7lZۼ$zstCo~G4 r.rGDA>jWO;/t2b}q4C~)#ڷ^D_]?9iXf[,zso"8ȕ:/HEbIt0'(Rb - Ex!g1d%Fg<q0L^ߨ,:0-ϫ?xTuH4񍨋7r')EyۤEj@ 8ծ2hYA066p"}(a75V1LRd:qvPUp[eAvz*O}`#X }6=/Xqݵ1sdT"g.w{x۞`\v' ׎FyQۂм$D=KMpϭY^Lfyv I@t٦)_M,.ˆ>QunΪ0p"RMV Mzx"'56̣2wфu^Uγ"P@KB~"XHUgE0ƛm%:a^JЩ CKVp8Fʢu+L4 ݦp4a ~XdžxMbvᡳvoՔ Qa|EV1b?B|6@et!j1]SR2,&nkGYa z([:S Qvaؒ4 ȅ3Zh-kO-l_!ƣni7q <?Z2;@X9J!ru^čmkVP_סl]^hD5r99I/r9le !:ͤ}VB@ܷ; od=H$"paH^Y#b՜ ˂6UKS}] HOYs9v2E^StW-D+n3_v<16 gބ0XCLv\ӛ9.l)8-{CS=v !M$"7Azp `y_\dybt':kSk|.EaxD[\ɂnqǶZu`njB]3A#<{x Ƚc| T0ԇ}FbkH9og释AJT:ݟ +%(2K6k}N,e Afq(lV` _MN"Eٔ@nވt|ᚻMrмjU6eYpnTuHpXFd!;4g*A$ˀ%f4/;#޺zo>`P̃6k) IuY/KK1~F& N=<N}H01v *H)'W {y|񣇘єC̖]7QBX1a,n.$ X'n{LUma!s Ln|LgEG=Sy6$jLolmXK~?%5wk;!]7bڴ\!wr^j@yp8Sg4&AG Pwb vcVV'5*DCc0̖^6s<i-iLSoG`A%"(y,׽v[I̊U%7eEC6%u[tK+4cw'o+@"OB(`7 DlI }˂jbuaK (%A  Q9cp!1,4(L:?ml Zc}ɯS0[>Ƃ !%S rBaM%Mi317E7zC)kx@cz}=S3!G=CV޵,SqSwڿWݾ>2np cwZiLI+)t\|ZLK%*JH:gh=8*(*lsuQZU<00Swh2iݽ, *2|JUmu }"iJ'w셰W<(Ff)fY0 (*J׏9zHFC^,VJ ˡV؆bwræl8u$w޴e@OvQ|=^a).:? /'8&F/6X -w\[[qGIc9% 8TiȑMYWRpHTnvֹ· B "3'4 nHYPoā`^ BNAbZϾ\_7ny5h`$*[mO y/.!KS|7n&XtP>yS2)cL,Q߂)  =A@qo(b _HVg>YZe0foAN*˖.bjj #>T̬1ʍd Ӄ]l Az垵w?r闶woyM%\$Fכ|G,m#8BH=: qv2(PzBV*C5K= $ȆzsE\cwbm n#6)>˕T҈*υB҆mz{̪-oZLZ:p-(mbL@Qe5cyِӐt{jrBz +l&,E,5g Ə2O:.q;K.+Մ5<9ܺTwҔ\+lpHfrpєJU\$"#ʲ T-ZQxyB*bu{,z剮q +2T73?XXh4 ԐY~p({9Flx+5PApiۍuzM˜Qۖݨ e7RnkkʎX"(1ީ,R.vlur(>"*k $՗:6/-IEreQ  '$J$UL0r5$Q> :,b˜:O<{lTLֻd&]n<ڳb댕.srC+h]%+W 4HԵun9dܭ\iՄ*G,k$Je-ה,7&XZ]]ڋTlӄ (HC"О %{hmf46@-u_f.=y/6?'\6dHx Kd(#Ѻ{2Qjc*LP8n EHFw(N#2غҫR̊  z,|VaO@fm;nܛ'/#қmAfyOCDQK("㞮Ƹ|0ÆWIlJJMV9Q kgዚxo"ya婷%ϬzJ;GޕIgT\z1$=Pe-,-SM]gnls1{ U|3@g &ЏOСZP0|m Xr;={P0tg=j_O) NYH94enAƁ)0y/sxYlG[YL?5cPc-+saCcA*HT}tRV\wWLng^v\h84apIx )ׂE CV"&C/X\ d\!=I.Bm BP9cbn7+[$ hc Վr&.Ep{k0IO,ZICMRA؄:.gBdk"a@< k|:bR` '%ZIkڝP|Vm?2mveYho/r'_: GzYBIL,\96;2o7t6V]Ҫi-RƽYesVЌ29Y]!H\us֚K169m^J[dBV͆2Op8Ldyhԙν{KBqJ4b^5L_\xY3_ߡL>Q!+5ب\>o(~vJTOE=[ { 4Bڒ,%.R/58^JI14{NRO_O^\:R_緇Hx(%蟌0n^>wf=e3{*K[>tJ(SEC 0 }^5iB1\ 6oK K mZ?2r߱#I4{P )Yߟ6RT)3PUUC7[oA'"J:orVa+'kT; Eã}ͣbm~5ߔkav0Ɋs?U(n.5gzCzФmEtQ" ¾n 'Ø(H>~n5Fn~Ͳ 5Db&F pwBЃ(@;ԭ`pP@o֪Vpfx;FI,)֪ PNg|쀐Y[ 6<9]KCP4FcJ#wO 7^,yQB8~dա1Fe%U^(Gl5_%UYқ;\W=O~jmD磀a46/fkoIA2(B؈gq~Ď֥~|9PL2|pG*G]StiAܪ0vipht|98}5 $qECxR#((#DH5.lIz.gJ[iݶ!"FU%~5>EYí^Ak%K3tN>lϠES"ā;:&GAv)G؄D Q:(~vmAO-zE+h/>VsLeK C0jM+ڝ2Aк R(GZ5y}\J#gXS.O LWr>:o,=6]S<丩EE3 v-C9}D?U.5Ʉ*͓*6*a_.>/A `(-zHLpMJT{\P0k5RD4鷑 M3tBgMßK4v}'Ls {|L.l/VA]",󬕙C[y^LiÏo]WZzR pCfı)'e2LDOcU">v^[5#䦐l `(G~P╸/!^9̬.p|ٷ-bњd?WBL~]p'Usܒ؞zs$d[Sb堻p_5_ͪAl\X:Wx#y> p㦜o(7nls, ]*Fھ%Hf#O%tm8"|%z Alyzt?6+J1&1 $Eӛ&UBL}:tSF4WElCw :; el(M~&԰/LѨ碐\2RfHnjѶaUcr>~e{KoWT5P%ZSjqRdЯۨjqEk Yӄ@Y{z24?uṊAF#$Tڒ+Ԩs$u lGBɊ ߢ;8e4dYn 5[/ktx ( N|;G_ )ČXC[oCA0icDFyTq}*0=f# #궸81vMi6Bw|5%x*Q]aO()19UDI5,Mh!u#' qX*`Sol_a^uzh tlb4u~c6ͧ.;FȗtA P~* >[ 0)K  @9ر B+=HU*q`4*U{\J.>Izż WhTwFvYhWPkP\}1>W~͔"Nk 09LAf,(ZeLI$K+j(c74XNWb[%A ʦ*fCa(;N768ԅ@7P &2:Oܗfk]^u-Sp5;*~[Z38c%TZOS$"MN4:`lG*}sxwT28:a,YQR X[^]ӡ*OvɖdDjbXK:H8FR yZ.Z8ׄ1?҄o M\R7奟fd"4s9#Fů,%.aQL*wOѯڋloR3u0c 79Q]oR.z7{-}&e-w {VK3.NՋ&,Ci |LXFRY]NuZpۭr(HU!c+;:Vv+Լjf ߋ{H;nj{(p=-vήqzU|&d/uaOyUo*ְѐEPoDD'"Г[r^dև3aAxdmoLêQ%Cd~y Tspى3FkUK}w֔JS 5gV;4ԩ[\Lzr+@6'9M/c?v-F%^dq{'etĢNϛ:FV?\[M 8Xn,8Udq^SdCtӳ>l,>Il2qa>hEk|aDriv}~Nu^Xv}p/#I5C~.轚e+CR9%ehig#8Gu9sFvĵT=e7=bK(d]y`TCT# B ] 6:{}:ؘ@q⪺;e*_(U #c6Bf;,jl4g T >W[{ W`7?'-˒aD8t>% H0]/<C]LWc%/]@WfSL_JLB\BkbgKEiҪS&5'KGHv_Å:ɞ|P:99pƾ1 R,/?d_F: 47ݢx̶ɕ(o.\æ*/ 5P 8D;)-i#Dg1r]+DN @K/j '"x g}?0(0U[W{jreJVBW@q޹TRkw1}vCTK Ol<ՍjvMa_n!t$m{+' x+*MiBL%U I \Ù9IW I45J7CKFtju.pV&uS@.C`)Ͷ.1o0jqCuONXiz":<;WK;s ^A6~$^]4XjN3Au2Ц*ם65Y'>t6CGjj+n$lo^yXo|B{Ey<_*gU3|Sw?30)Sۼc~-qf}&|{8;^"TUH~xZ*أh"r%?]e 4w _hURwkL$*ҚD$*_3d&9t)'1bŨQ:dex#],շ$sk9nR[5 <&oRyS):lW\m6~T F ,W V]S;_|F "/7J{BqX|1'υ* !Jx_Fu#KJ&0?M1皕S9>GFElg7GYcD/{‡7C9-p2Z6[e]Gu&ljry,kaڠ)_DJ` <1^+dAs6v?A?b ^\v3sًɼtwaE3^HLg,B Ǿ`Z0e3ҖX&k*!u>Xo!Xxz\(!)'Dwڧs{of*K(HO_[$}wY"9^Ȁʺ7J#IsCi(Baӥfk^* VO ο_md/{8ϓk5Cd.O7Ni4CkM0!eĪe\ MNTFVB r8/4]}?\g.*.5/fv*T!{YJ-I3Tmpb  }(ضnb|a2!X})eBީnR$~_IE/ت\M>9͐>UR/T_oMq d=NΪw 8[#DFldӳCok7FJ ]%' eSnXȟd1 Iv!s]T):Lud޹Mx9uJsp!ePLKG;(I%C۪UyJQ2gNk2 xX`Yid]-9LZZm骙e!xf tcQoMoC o2M]/JjC`k6ɳb_:kۧ2JX7`r `LAKՏ/>!5fxsNk'ʆJblwCcq CnJZ2%Z/ͷbWU.̓)YE> Er_ Fk(d gl%.B! |3BMSb,ORX ~'ڴ֭?4yM m3lteEe]!EJ&_},>?3eUi`G]թJr AAIķAǾ Lv;?=\Ҥ_gR?,DakˁպNۯ G fWy *( YuA;LIϥp)tw~IXh>HX-ߝc+eȅD (*gMi1/&)]bԫft^''u i.{ /PBH_Û j,]$JUe3%/!O2ruӜQN6b46ߥ`Y8K}79Je+יq= 7\oOkzKǠvabOESDL&{$- CI?%$#'kfpCP%ɜ:+eM{R܋.sVʑE碦N6Wh773$;?jXl(n'Gͫq'7˗./HxNڬqO)9:l4n8ܳOݣYOA]j:t9}N" F-%V;o҇Zե]ZRQEk o7׻, S+̧@ .%4a =˯m!0G-O?Et}[P!rn ({Y.P:k J#$i,>Zܑrkfq SJVWAu!J/V`?{7q$&"WhД@*69̦wEbȟ{AxN]F&]hX<;w< $hW*,B 8lah3YwC9 H*[~ oTXn MY2']*kO;/,|r2觨Vm{Ko.Ϩ) *᝻q/R0x znͣ'0¤z]}tAZt6B#v0Tx&W,_V8+b ?}M1~#$bȰ,U<䶺*xi& HOdT&k8bY(tŗ4Gk4ؠ4r֭9G %'M٩'~?lp"\u&ZXxfOh•ג*$-Y$ I:Z:'*[p 9' )Fx i=4# ,̋g@&r})C^ \yLCt޴s4`.lfe˙[TUC#i[⍔3xs^K%z"D"@oE?CT?[zq)uVۨO(8-I%A(JjWAtisj|Uq$`\[TK_9"Ty{u/&MTE5FVMbm܏edG>l`t{j\!^NLYœ O/ܤW7xKGL-Sİ%AUIڷ:ĬZSp 0VuQW/B;#cyN49,6o<&a[ߑq4,t/|B] `qoT1;{~X0[@U1 D6b u&I@4T ȕ¶6M{k|]abbS˝Y%rB\l_Sk=eQ[Z[>Ұ3VjPpdpJtqNhL^aQiovx|vyβWx1=>u+)sNsmf]<^ԩfJ?Pq7'-Fל%T ;̇sOuZ$R[ٮ3Ҫ%%Ys{9?` ~>!uTLh:`/@ kz2J*ҭ(td!hd--mX[m, |v@ C7T[8[<[qء n!GG Y*E^ xGYBB$ &k 6rZ=Kθ;+zW܊}w;Ċgef5u~%.~ Z"lu0! 9(So̤w㪍MwCgGҤ}s3SZhtk!pl ό)jX7TM|gK+o`6ѸM7ڜٵY0e2~>xθ{2P9`GZհ[gr4뛓&!"d5,|oln !:\p`nj5w_;# zj,jNU>{烬5Z1P ֥Ï1f JZ]j"yf'0`Mݟ֙jSq}+-Hwq*n07dk@᭵ ?ī*2 l@s2 *]-erFU\veIMot##_%"ʗiKchS\tdUF1\t괒{ <"BȬIp}%PM' [.8*hZv2@v.nr0qUAxJCv~,?#]PlϏݬ^Lm7|L&{wPg0&WmÕbO{%;oN%޴;Wً.&-~`Ǟ}~$5Z6d"-PRq^nOmK 3da鑸0>m$xi('KrzlsB""oQMR${)N؍ۣ=uhn)zCK5=/->wk& - V!ρ^s `}ܓp"w1cZ+$ꚝq~݌x l4;O9AZ#G'0mi(zV2{ϞB CC"qr@^5]I/d0{NV+Zd L$D }h1]?(eD+`<,@=|20T.j%~#45znqi^vӂ>6`CBؑnf;gF`WcaMG߄E~  vV2vt3k+|z@: z,pT /Fגd+<ۄ0?$熝/8B#ge cUP7m!˩"?m_T?HI%=#6YTµ~@S=|v ز౎'q~{mu&m\f&Dizn݌~ r+T~ "NS-ibamB.ȕP'i'!d !A?ר`|~95ƕ|2ͰncEp|-\^a^iG~}o*nbNI"4=<kJ'#z+rP2ҏSrwwEF[}C[*a'2zXQWB%' pAi, 3Vt.9gr+YMQy%)ۚY&C@)yv6>1*Rn,,r1{^.r=t(o}~*\?%{:n 8Z2M\W*W*50y/OPgM<A_׽w9|y\d$r&+Ey &GQ5s# M=4_y{6HL;|9C:-ĝ'֤ۃ7:%; P71s"A gul2ulQ~\ 9 ns2X a cྠJu c`ӹ-xbyp,X3lLK;PJ_g@ | ̶u:kʡytHlA{TQ$혅~X^Պ1#|Cs؟Fׯ;q=}r."ꮇw~l-W5yC4:aey; fn}5{ #S-EV+`B"90 [-2IFv[z#ը[wTy'GjZJ־c(!8ħh7up97YwP/Rr(Mw.@hoX_gnES0 %lgÄ #CCr(7m.\~LaPX|`_/ U>,l']jsmoj ݎ.*_N2.z˂Ys$2ALYủJW0ṖJR]cp<Ղ^FYI9q}h}BW[v%(n|xz6;2P#Nldɪ k5FcoS;x bYFN&y DjV329gԗ An(dw/$kz#X cCs-@lYYE=(e 6I yP QeIcRMw_pM"]@;! %b+MZ\=`aA0 D-#U0kjeq*a͈1ea9ye^di g%T3!NmFͶ+cD8(8̓f9C(4YgIxz&/d-Mg_!+%; wS"xP2)ojC41au{nSHTW;[QFvxf7} pHT)>R.R7Tdz%!cU1|C "J)IUŔSȨZ.gOg#a5PqdUz\BkRf ,<9OЌR|6Pi/3+Z lo^ِvmK{AG)(.ja 9E[#SoDdfwZ44\&@J ͟Ң 4b ᜈ/;'Ny K@ֱr,#Ŷ#(9ʖH2btˌ_\y<*3,bqh|UvI ŰiWZ?|ޝ,!1d.IFQ!XTN یRbn2kky|"5{ò}\Qb3%`|H_gXl&> 6gG+Dwc*3:5ђu`wTFGY/m'=&FS#Y܀UAY7_±&!E8Wn ILV:B@oh&Mos"^tf'/MhP[JfR❑M| =C3c_ٓXK:X ā&]Nt-pG c:Y*чa9{x6nze*qI\:mI5 wr8745Z"ӭU2h#QiszWO&11$\w@qe!659Bpi*EzJdfU>XRH{}4hpP X .j,5\H| bOKg1<Ӑ$\~_>ԇ79,nI&7M>R#x˨y_hD0^lQjϟKfx~`{۽N9cϿ#֋XzL+[<7\1 /)xvP%-یc GO(&1Q~Q\kZc@º#lC8]am35+ eֱuE̾q[X82)@Ĩ SP8,*\~N.t`h%OYtA}JB6_SB݇>q8Qt>hʨav:<<xU!+`TLk _(rFY^`sgK&Gn4lA^<'}QJ}p!mCdct%(]r8  ]O1VmSݧ_JU_eb pĨha)s <~BUU-C8J8h$||ٙw $Î8̗列XN l?7#G]`$%kdKؠ@P$fv 7LMl ӏ/dVىb% {UIM :QKLt[ow[PY/UBT"$[UT  9bp0dNOGRVsS翝6a^%#7'H$W':dBTR7^iQ²E%DF;>Gj^2~ʑ™5`9 !rOm ܨ=`!mRކEH>md#qR]2 8ؖxlm8~E!^]]+zm]b8ImF_`ʢח@Ij0:\֥FY]d;c!mOq۵@j=FTj^H0kTJaRwo%u*3eoPܵԑE^M ۈ Pl#A`]ħ9K*rE NLY=|4ިH$OB@ Zrӂ"h _IW . wMl@̃c\=`DU5|#5MZ&Pٲ#<ˈ=x"KeC.ZD)֝asPvk7l 7 o!|HG QvP$qTAeX0SS( Qz`~=8>n2 v/#L ?cea$ľ諸Jd5s?Iѽ7^ >qιT*si?Sh~T.Mx֢jW6Q4U6;CTPޖ9Jr_l>mVvV3/r4݉ylKjz;$/gB[B\zZϬ@᠓uLΉC *.oJ.TXEz*Qk༾*]eg)zAEݗ(>z#J$$~8dyHh+O `!VyBF!ah~`sUh>UOG u *HdenbNj D_~D J%a.#whFz龴"3$b)}hTEUx~10DЃQ6Vm3P2x! m QvDC -_P"!vr CImwM=VpmHĺN'd xg5.»o۸T4f`}0VR`nB֢G8^pYBvE<:k|U-~~?vڜ:dەq3^3L-&GP.wC`f^Ǐ[#*D;@c3~?Wי>`zt'ߋ'l,COesAEAv'K @=0; Ij,b=_qk_B9SX;KnlEe!Ǿ)&`^YעΊΏkF`(N 1[Ȃ"i[6Rddvs.p8y_,,H(\jR{r)%W}qGs $^S(MܖkӜ \ozp>9B]fsLIa;*I?^̽U[Pw{kgD ډ 痢ଞ8LNb[* |4ȉ1T"`|Phr32x:;5r|i~$o6g߿@ow~A~8:dZ"Oz$yݓctǵZ+ eƞgUĩ٢aԫ:_3*r/.悘K, tjbi P d"&;G}gHtha6[]VOcLօ̓ҭ9vnćq=!'FFr͙aL_nwyu@I"P4)T_xGg$mt.$VDJG[$S*ȇk*$h1+[L<"-10Q/ &rt_k6ފ˝᧴75x aXVlek8v0'SLsZ=&>Rc`bnVkQyG4T^Ɵg^RD^ж}:ש26ovS(sB^D<+0u^R$g κJQ]!#'vz?-2z6 ǿxxEX|e߷r^tH c'[$kh"נ7fm Mޗ0Z)ݓX8guc<(jMLY|O6#Ł}7~ `YmWn`H@΢ 5,'o+ {GOq&Kߦ<0ɑy&R +iD50H VGDt3t }))έ1 Ff8u  ZҾ]P& Mw"q=eAT3aה^J<_rߟhm[ (s#!:IscRezxm%vͫQ>xmJK}s;_Sf)?&u?dqH{:#xxoXB|Muƽh $sKاy,446F>춳H&?PUjE烔`vrxWd'!1oq]-1OS 5)WG)1vPkPަr| c/ݫt$<~v <o D~ُY̯B!9@il'Xy]qZQ j6I)]`E}m"] oJ|efA`wQ6+wCuV?cSiIJJMJ}D砞I9򚧎W,~15 #bT>"}{Q,q#*ULLZ7?6dS>y9]Y#cET>@?i} &`aͰ'{1y HƯ5ڣЦڞ$-@4( \/ t몥󩤝DմGL\ I o \p5OoyNcTN%NZ{ z1g4R,鐍-6@Ȝf$ w.yoZ8k墪~_gYN|8M(~4$B>N!)So^41hmB7Byiutj5l?R S4^XId4j6n>TI~y5V#ѳKqIpV9v"cDgA#&YL4廫):ZXP{s.4I |ԠbU7ET32wCj=]y;B(92Sḁɠ%4s=3qP9# {.A}s܍:!u WT*Qy-e6daW4AdYW/nޛ{r^,ھ%.|Nh6my{!Q& 4HcK{Ƅl;D"-QU1o-Zm;p;aHMENlgt.*GL|O_@7"= ڛ[ׯþt>c/O*H:0kd||G2{#Z-|r;- \]5a w`,f,]R޳(ɹS3\6.eO>6q9Tw43L <T3Wb?ߜPD{۟ejt/ ARorX ^?h)GPJ?݌RCCV*lBA򞎴0rctũK~R<5'D)@Oh0KU;dv; 7=OxL#} s[J0UO8 փ9X+kYG2", H+zD"O#9m=`)0=RF?`ܽ#%,K@MO~DrI0Jw);LO55 QKu[ 1te Du}wS5-\xQnQ=1Z!iQdtZYbwJWvi,t!3 R8i&ƨrGG5a_GɍOK(Vx^ Q~F,[3ݒ Bș)^[yҾCb[Bx b59Κc!%:\]{+=iE±Z/P덶@`-/1Аcr1SL_Y! $Qfކe"jvOP@1 %Q|﯈,%EZt}r1 ]g 3,hq"_̦H)͖b>\)Ht od ̾{n#`2A.SU:y_ 36,{/'&kԃ1|:;P.YyՐhz<~mS#J@@`${4.)pݑĬ#P{/a̟ĮQoMJȅGvGUM^Z;5 O1Mzb3E41kymXGN9Ү=%Y6$kJp; /uq09sڷKfQ(3!x ?c+2;YQDn+.x$]]'>wY,ҩR.ܬ%#-NOo;pig6ɑ* $tvp^Ŝ`|&{eTtq1pN܅+ל!9mWzO+l9 Ɖ>~]$M~x^v|=dz]m~`Ix.k>X׀奁=J Yդ%zd /xrQWo4V%<~ 7rqq,{PAvGeim*r6Hs5UO|M?0%=t-ȫ|q_  Z'KПA!B0/EŴ5Q)no>wz1[`}>z8u=_M @60K Zgya2觞2 %r#0EnIAYUKDB &9zxilavhsډۭG7Ÿ$*knb.L<އ &eE';kFq1Ǫ.>h"ژ)?Ш>4^}*AVoHt61ꨐ@oo ^ PaiLul\24ҥ<$r\)DM* /[P[ܑv'5:t   VXnolI*kLFQ4|d$(4f-1bs'Su9)k<@l=C%3c?Kϓ]: x%u״ ;hCA PHz]\4ta?MhcF"?kɐ$Y@Ȇ}eH\+s.[% L'(>BH 2ɶtGFe3Pn}jZ 졻D.d?g@ԒB} ^mG_}I w}(KRW# \vޡrnAN[Fgg"`GJx:VBkdJЪ~{m9oB;Fʅ!G.j]3l0}HN zϝ fCFe7Ζ3TΌ=}žEya$f @EV?">I3g 4%"zVQJWfb QWtɉLgihtjy`[NHTyWY,x4.X@$௪?4{BKMЕ/ y[U"4riڔaxq>1Z|{I\337\+ >^g382y"?wjOWx'!Mۓ=OȱbiJCdejP(U$hFns;V_8ns2 @ѷ\z.ʘsA: hlWs7;KɌ:'N#Vo86T3_7Y 8pZQRf`:QE+tujdsSI,roϯd aKsDhRx`|ߌ&>qpU ,x^.`XXK0MOQ#5.'W w>C*J՚7 Zψ)w|;|<= \Ѹ/L]RH)Ozx#6G<[Zۗg YA眱>k-.:G ]7n m&Ppr y-<[c"]>),e62uO#3P .y$i|i+P<2m"b*RO_!W"vCEcWu"DuH 4>9ٴ7} tS,Ǖۚ)LRȦ84c2 ut"%9_P-2K*&&Np`}}=ZSԁBQH gF՘AdB`$iGaZf b]?0b1( ߎ(N4>82m~ArZ s=׆k\ e]v ]U'/A#4;D<Qq'p˯hpW$ѿQFf6`i&2˰ع7S#kNŸ^0U="9 RJ <^'Fwcݾm6/yX%8`deP1#P5R:#|E byR5 U 9]icoCpA&F 0]9W*6 'LtEb __m1y)L9IP^"ӻ E_[%&zRN@ۃ]*gEDhz;RLJu)iF*A^b\ Mĥk4y(gknA+!ҹ@Ӝ9rCls]o7ѮP\(0YhM:hȽh4zWNQfǭmJu1ZBÆi/cܣdShQP{ϑ k+v@DZ3 22x$3`wY!sNűSEf^-gEMνڝNs;'>\(>[z}ٮ]z7L(]oѲ"=fFZۀ{[O,tRxXgHF+7j^iNvoGsmR/ῢR6{&˙`" J~[0,l\)YIvV-j%j< x(G_wB*YZl'd #gpY& =ǻ`-Tpm(ǠW$~floTsy=JyeOcNɛMy=<.؉oDBP1MsQ._ARvC(V7IȞI0خ9Ԥ_ĕj< w^{Nصܼ ľ-qumQ(=oKU2ғ\nLR?Pt(X27Q#K4~:#@AX?XH UQ2w2U'2eF4Y[uA}ќ̑qEHQf17X0hk|K'uxWf+^s<؁>-W謹ܨOïY/LZa~]WZnGUm `VOeJ :z=nNPCrɨГS`g.AyEe^ tڣ/cl[|DrHY2E]GFTQR$\dj"UXG6-V~^Q0) Jەu~x?[1䮃{ݒB'uI+/] D] |j =AQǹG^)/q5=5X*_E_}. vٜCUa5ɞ2䤛cD(JcȍYIzF8-XP dTzPh%H쭢\%elC c٠C/eÁ s?j8T54x`0 ^}X)`N"ʧ.O#ѓ6L#etsPP:2RQcxni,s1?t*Pd|#\j '<ѰUڸ@u.h~N5ҧ=>kșhU.N K-u#R9ϵ>lѱm `,C\(iLv:iRkЍUzүzGcS3)d\?պJ_J\6i4x(\jjXN^yN z&?;xJfg8 _{Ja/CB[1NXH! mDQ-QlZxd4V(|lX+Ud.ZZiq6Z 'a{!ba#9cV spYhydwi+dQ2PsP U{չR7"kݵB f'W֔0>ƁQ˔41V*0y+% >b"(fm㶢| v=!p=x=z[^cLk~A)AnU8(=Nx| MhOe_4DΚriCjAZTۮ}yDη3si1H6(d[RJGYY6Y;#ЖQ>Ꙡ!c |%NN0,?o`%RF\`=޲Q JNgz0>vzG`!CN6df6z {Ձb!a!Ial@+z ֒bR]i0FLihU924NU.cv^/^4.[<Кqby}e0V>_N! m%bUfuO=В.}TbtGIxh__iׂA5o9l61_HvU/VƑ-4].4g*E3|y_%UU(MjӪ1LMޖBb §||[%!y)p±3/NWlqdю:{THt>eO}!`壺cM|A^2Թ<"JU ޙ߉ k{7Lj4 Y5SGKo6~%7闣SL.Zq5҉@:&s4!̆}kF)] >Q-9<b{ tR)6QlIJ}{e-;o~E!M[i! 8 )D2`٦;f{O[};ZίH#/GVD}}tpֳ8*q@)!.RYcޙ3 e-IG}Ckx~ eL2,[5iDTJ|^56]eGR@cߞf5OwƎu=Њ8\Zd֥Q)ԏ恉dS/p/ | ʶ$cdhԮ"p1wR(=񝧈wOЀ*']GM pb=аDL1Al0Gzx]":X.“uLP1ViBSZOO2JjL3ȍuHF(4OS:ࢻyq%*Ax  $~tA}?Zز` ju' pXUf\A#$ь^'Wtwl}̓.>hho鎻zoRPy_YAd^ yP ),S<-x,  1*ũ҉|fb^!xVv4ڙ !f" PJ1H}|T$c`QYƣTީq:X֫ﵐ@0zvp Z$aƾ9Zrh5e ypZKeOQm~ЍzA49,vR/JxG. {#mZ^'kj4i鰘aX9gOT l+$-6xOuiP]E^Dpڲ 'Da3cjqܒt'YX+rGKjs;7]LvYc?ܛ\LX62!~nHo-@ЙbOqT$0c/~paFuGHg&[^cݑG%M8rv`'jZ/]gp&YlF^Mً2zq5mR" '(ؖ_)P?Wyd/aI-O9 //6ꃪab3ߝhEmEڎŅ̌I,@IWh֍fi2N;TȓХ$Y;^{O~$1LF|sgY$vzZIk-5jy XlҮK# MQC/ʎRNI`gbo*f9R5X{Շ 3vPbee@B i3I1|[(k_t`G3Áh3trJM @ՀCp*[H51%>v|Z՜{o{NZjd8/qa#Ar4G ߦwI"P㨐Q/j(B@FH 2J-0z\WV̼i:DlSPHd0&kmfQ3 4my臸#3KB2dxj4B6,%LgMm @gkm7r %|2k#"7OR&]a`y򎯯oW& U&ߙTX ]Q~V*(fQweWzK] f5= 3Z{OȘnBRW|q<${LCU\ɗB(݁ M/dlf;>PKb#Q{:PE^oWh UXsڧ̋ҟ Wgi/| $V~B׊Җk/=fC9+q, B'h k^(5הּM!I.U.j*/Ј1;~X ,+ψ<+f!TQP1;} tq2 xD }n=L[oUmtT`B]8ut)ӗfWy8Kf\kq*5bATfCQ])OR~|Y2AD\ȩYe\ͦrov ꕡMip^X̲]g:Gƒ:C s~g~7\0v0蹰d*@t6dέgW(ڗ};P1"*H >ƹ?6.Q9ڵdIaE?i4`w z$o5 x5b ƞc)ӗ}7w\GIM6Vs7˅R4 vVGfDg\o"pl9Ye) <άp^HMpB3Hf1 ;|G#+EJjOCgQ7.9e}HҼD;Rϔ1w=A7OkHBq%  M< !j-PG{4m QF4PPU\ S;Ԟۥo"-Fk2J洑zG p/'$ʈ;Ufƭ#l| I`u)̿[ڎHvٓt4F}0BY)ʄv ͋jUюMî0#ubA-IA 3:#hHE\6R4$cJw`>yEKBJBFlfWI>vR5ޗ(Jgce](QPǕ/ ĢJ5蘞ȧ7?¥w$k>[Gv+½cdTiB[`)Y9Kb-"`*e"%[R犲wYVOK~p L#W +SGC&'j˷7#uH3@(zOUQ03mVgGo!~P&#Eɖ0Le̦[Ǽb*euٰņjROEu7:lha)7Hs+3HA!ؼ.aMse@  뚃538.Jr׺.&S(/\_Vk˳2&G'~ycPPnҭI`@GهS_d"|߲W4O>׉CNi:_q_"' N2M5 )΋7&-@Q uK+ ]C_uoWQJWeU жpIYd]^;>>JI>|pD֕e$tOJdǁ8SB鿆^9lB+5XauO ;GRFCxqBCvz>Q[%1d'#y"D>fݬ{h[}c\_?M(6T,7)?9Êĉ-Ľʑ"pQ_< PSb5Ww TR*rTᎭj0J]]_}~ՈIGpG.c:S('<vɳ4@`43(w^tYY|pӡ',"~z]ZBᶡ_M6_Qo{.r; 2gW]:#My+:U6×r5o=g&!m)Ɠk$NLA]6ewܽCL  _.aY#5 vR!!;wE}c[6M7"^?@şsp.x|a3e_gPh<+Hvcг$n_ΏEMzo2#Ku x +/_ lJ1q/5?YCDIU| zW$5&/oG7Nݸ;5fIЯő!;8O6PPLJh/w>2F <[&5 4ŷ|d9pSRFXeoܔD偨hZA F0uRiE>FDSWӗ&U}X+dGW<d7uF)EQkcIvGkIHqmtmk=m[nM2"f*3܂¶Y^4nHpex<:ZH̿ɭߣҢ%C$Sus=OI|¢)%:2 CDN~+?7Ml,hKim ~ۣP/m0dc6]|3X``nyQST|tO;GVH_8=V' [`{vpioYy׭R*Iń~ӥAIZzT^䊫Uy>J@_u* KISɏ Gk1.fv7aigaqa}ZKp_߾wS;wFIߍ' ` Unn c&1ݍm8W]nF1CtG8U*7B"_²8R[Ƿ򹬩EfU旰Ե.Di,!siKBr?ocS((`p=73MDzD O1chDT[=f'@kmV+S(WW< +I|"r@"ێeq =L%ܘI!^ !M8ʝkoAX-srxcR5vG VDf==knL+&?@] ״+i6Ø,o./ƝA|n02HٍP-zהOf3!9V;a }Q%աn.-}# R<۝\V~5Z^/7>sC&:Žz@`l>Ou0;1m=x句Z#"cBZ TV5[1>C~.ls"3HTU:qV߯gFlxOuMг0ʔ *,A*C!#' Rڑ>>UkoEL [E#* ;s&(×G}BZ~_O yL=:QF _8wLFa O^CCO=0q׾)W]Mڵ[AawiƇԫ$V+JtMT6)< dI y)F؞`ߐͽ"tُ Vn<޼{6P7gl} ίg6Hň[pE|YvP`N9Jl3 4?3S{4PG߬ڦi Ne%sꏡJJg.Ǡ /'9S8gDmBwP73ps[ [X.0:" Ö:L djb6<(;-<ȓ/@a{b)10Ja\o`gy [_d!.gпjvjeV `_+T1,P`\niϱ+!=bnN9ꗑdNwqYи@ڪD<tH: E{}x/BNTbt‡!wW|8ܾAMJ. JW*8Ы57Wם-|S#HyD.㘬8@)Z(gt ɀ@'m~@u 4#Oed 8ֱ0(BBzggqSnHܭ`xx7;44JFm9Wq&o@Qx,Q@n|qxU\&z<1%_{r Vha#HBoW60A'g@FX̌FDղb3AAIW-\d!ciA҃^ퟪ/]IumHsJ 02WU3(\Vq,7r2YK6*G4jz:քDOy5@j./@@-A?I^K%icFx!"vl(s&RM e^%D$ԠͺVxo| 4.[VoޞܐO;/}2  otA&,uf&A\ qT'8c!;I_ƕS >}ԛ 1n&;VW˂~0S;uhwFgB&LЧKW-$aB1Tm9w6ˇ =D\DGU^M[UZ>kaؚloT!IO:lC*rXq836m sZ-Q b̤9 }K]\a%:5U+RS3UՊp.{C &bŧ/ :ҳt;;ǘiJڈLm8 Mw N7HpvYhzF3m=tBojqԀ:̍{4zLĚwJZFgSd\%A~I,WW'.5&_\6T۬Юrd`Ur w V[Xq8S[4o6X=Ǥ1!j[a0g7ݢF@S6OSml5}r5ECJ "@èE $7ya S"(YDTX%HS杺i*&azA~B, ׶4T­%lT9{cIes h#@U GLGhz؈j@T>c~RәID1;EhܴggSws.$IXݡo:YۜotJ.:Z84J!2TRC{S4-Mc3 dr_)/Pn@[;tqN@)7Rl52|S_ v 3]}P+"Z9ȃόRʼfZi¤ PS}Q:z|q.gV  wJ?}őjl~(F؟r5 ב.5+(?ޯłnt- a-;juycYh0Y XQ眂z`:@qҀw;@ Q+H :/ -%ύiKo䎍 ehe!!;yTh@sbBfH~".wd=-V|,}sb*I*DaW?D97m!> p`| DTbI3蠟mo"Ұ3QД*;s ry9.׃a?v46 8<FeXEuBRbW"eaμVzgX}t44tq>lf٣AgБ W>n ? YhץLtM(ȧΆ1r]=hF˖mlè$;GtG6_Ԩ͍^H OU_%6gx1wy{,]^hޞe,N^{4% D%1.5+u\.9y3bj m`'u2z 'U3TЏԅܖdZprZd/=?\XJ^@wO;.#sۅ̆<'b. h?˟= mM%MdFS\­*تX4gdْG ǎ j."QJqFŦ|IV}l!R۞&u6ʸ[OS2Qm;FtG(90DY# `gGцG*pS'N24L Ѽ]!Ԏc|sJ3O-pLraC$8r[N,Fys(ޖ'KV]e[WU 7RI`YǴOn'p5e>kCB5MWp l\O"%" +n+8RMPKc+,0Ӳ$te3gRyŲr*qgLӏEy) (+gzjUo^}XJmP?dY;q|zw-SYC@lۊ4cX8{^j5Lpg(o4)ޒ/@Cȥtf ]7ZSlA4Qn^S6hxP5 vk^~kNmT0jZ?iL KĘ_2j]Qz0_H#CBs X!+٦%p}J:ƟnSC2۪m`O4V,cl$:u|0*GN U>!L`8R/.*PTi ' h!,\KqϮ1c;YY!cHUqb˹+%+V?"Ca"#t F] @]I`QS05EXh"1_ζEIE鋩QC6s+͹0;jЕZהhy9b3SJjCANWIFտ阅 FAB5 ߈CRH ʹ|^Ycl( ŕpedGd4t*c\Df[}JE_s7JG~ҤU㉙D50qu5aB)vP`kMsAZw:pҳO_VX3 v[ك~V)tZ,g埼28.)fԞŜ:iؔ{s9y B{iCH[cy nc=(ȥHHiD7%[&Eׅ!W:C:?"EmWFv}TvY?Ie,xNeqˈq}P~hn:݃;yp ۪Mea(Cu= :z :Lʒ<ϸkTɃɬdZ7G.cܺ% 1r1*;7^$u6GME:TΑ!0y x{U Ȓ`ݘ^f㿣 ? hᆺʂiF!%_^!:m AD7qj? 6}4Cs'4Xp[G~xwsG).$L?k7lau|DR'M5p3>q#"Q>]Rt֡!B"- 'd0ɚܯ([{}q\ljhd FfL U%O?Dw1X~|9$e|83/ '( )lCpT:r}L-`N4b /iXZۭ*Iu EՏF8[:LIKͅD/\><7Heq&W8vzbZRdGokdk/dɷ\aZrY:\8x%7pq݉r>_wʧݤ56vf_h n&E5z! ٠]9#4IHiܱ/CۼϙlF7fv bp/"œm<G,Zd@?j\ Zb `Ha d4&\aRStB7R)Z\POsGՋikr/jW xs.qI` *sAȲ'_>U7'CC}ίz'./c=0b6̤k;"v [aYE;TmA_Ȣ81§ߴZJMq坺NL%P@@gX!Z֔WgC:mz5q=ƸJI0}*r;]"XÁ2i-5 .3YkǮh5㢶1L{pb\^~dٍCZϻb3c ͓CBl[s쥰vjA!<|# ) \VH; BtAFط|< :k $&*h$]bc+Y.8#yg5~JeHy(N 3wbI? 1GG{gkn5oʲspyC1()N^L wo}$)uq~>, _neٷiѷ?S4bV86 w!T>g.߬bijw*N>BU7 ]d&y*8:`}.xK*tG徵>e̋#Lĥ%`0 r%WIas:^ݴ̲D2TS{eĞk(3']F{*ZؒJg+z6gi1\+9Meam*s<k^~\# ͠Mhoi1,ٳR}"^t<^ ;`ceA'w~ ċ.ym\ `?(L[GZ;b֔.Leʥ?bjQ8ٽI`0oR}<|," 3)8~x3a!@1̀{}@^Y1 c*nY)򵴃KOQ| @,]~e[_'X='Yc93pZ'9>5y̩Ws]n'R_ib"c\$I^^_{fz'˗[BU!MbViV  ՇoYL٬GgŒb{Z5+(yԢq{Ҿ5޽HT߸[6E,EM=f%EtGzv €Sn]Ba E-2حt7|wd:mk vHYY@֊2Kef(@a 9;=a,m}R5rڏZ}χ1/ףhJ5m쟈aS1*L~=l,B3-3BoITa@CԽQ徇xO iNχ.]٨{L4oC(.|;*gP$П hDz'YӦ'Si {ۦzk]l>KōpDPyAޕQM 1r(z5+ ⷛRNtͦG4cvbئveЛ :|2B [[;!f-w^E,`3f[qTK:H5HYƷ9Dʡ䮣w/ڪcot/o=4`cdp呁.'lr' 3HT5ϱQuEu[7+LFMֶ+Α}bg/;Ɣ"T4Вf 4 OKޥM_$r0|!咽_DNg0?ÖL2%l>:2,^EMӭ '7ybvK/yD[q\~<16±MT'LAjLydFI6qvui &~t"NXBb 3:&oG͂yT:ߍ@ȏb0J%Oco;Tp8 \s7d } a0\HS>xtF{(DB ql yEdž+Or 0qm1#\WҘ0XD4,}UޢW/] uegIQ7\ uPP) >߃t=f@T{QTvg/J,fXZZ_织 +8CET[^ dAb}: h]B4aXXP9lK->M$jK42l:p{гy$F;+FUBΛci_èyy[n[w95*qkf8}8=OL%G@'ԕ8 9zրC(Ք 1}dץyLw)`iT$4}Mzιyv;S9W,?r Z*H=1r0T2I4- A= Ukq5M#çp<,5Q^2CHM(^窨ylJ~˽yB˫E0:WXT gN=,i0VB esCYNZOgej$P_l?7= py _0:9 A!^|)鏠:"Bt/Zo.%BO$6 SQ jz߯(֟$oS]rSeԎUT#6N|Bew.Zk6SȚ bP-oKٗo͜a :;哣y2}J]_ϯA'SDϔ>Sx>/ww1֩ΦWyLBbzGcFy SF8C?^k8ZVo;` *8Mƴe ]N9Xnϔ6<Č1Kx 5Rq!fx姮XzIlh{)F2mmWj!)>)yxDJj; o܈>rk kBYʖm?7qVD^Z} ,dv]X,ĵ[9#ϧ(5+|a+L@@O9`mX$0he>G-;^JAm3Uk9:%c;]C=f8rfLqc0ԘۃLQٵR6d(& 썮x>CMcXQ:75Ysꍃ)h̼B)㲬ЋPz "E?ü"fqhIY[Ƴ)\/,1mݡz 27X.i_E3"ܞ/c=%ݍk `׹&UViG4bD[|:+$3fG|Q$qzr(^!wgC!CŴJ6/~OE3wz: he~-*U~J' :c 6%&~aϭ@M-vPQ~B{҇o왇0:EWZ]4yOi/)3DbI--F`Ux b~ʗ&9~QWٷu3x-?tX7WXl18L\kZ.xjcwb $-3>) `5%/F"ںlUH%[kx"kп{M 61p6E;[)h%8s4UxSGL\&1bpm :!0pwLjy^޹[Hœ";*&;S8 #;n39 U:9x\~!joԘ#WmT\+ھ!sjݚF.LQA)|T~{l3[:l1؞0ߍXW.S^0YTϷ.a֞$\ýebi yq*@\ B۬t7bH; !i3@8.YoLwd5㣸h UXwbc}S= 0]Ɖu`[2FGWA]$C]vpfn aw@sf~܄eI?46" R`T Ab>(?a޿Ao1Xf_X !{ya{[OmƷxȩf?*\i ̥ߎ)b?^@(,ѐ!0qaW9MV2^֐> l;Zu /ǃܓhש*#nE'\cY՟*UT [ ޥc*ͅHkxĈ#ty>g`JS1* Ğ UH!.wd?~Gh\fV/C, mP˗|h |X?cn#1}7M c#KlDiܓH% A`#Ht G;| {HoϻHUF"|<8GL^5m2J~O4OgA7uhK11%-,75W)3ůHQfT;^ߛNfK#ęX"ld~W!ÁJ۱+A%Z &uх$[oRH 6xGh {LFŅ>鈲+ئttE'b-E-c#9\_sKcY0=y/] ĔkV-cԑHj񰆄 =z~ZXk);#S;0^NuQ +&4YQ ҹظ}Rl?m!Z.]4e"2r'8L{qn6(Ps\*%G絀$ 9t$⍭@U5@!|7m/=WwLm osc͐i/ eJDi3x$ 893 ֭? zlH(OPmhwArş$.'d^r,֭"6?B)"h^١U6mn4rr) _t2U`MHBqM/ִ *JXҚ4w7n {(n(pGoͳƗ!)}Sycb; g?)Mٱ!+mM 'J|Mޤеiz^{-@G"$oOMPU۵d?MJ@5X2!2$!9}iS1=> WOHRa|¯s%qR^V`(f"|SFom\/J&*0kɸRn Q;:ޤY!g@ٳ㆒y*dbd#8:z.x׻xȯ1.Mh?E:|)X%Ǜ6f3;sRXڭ?_ՠ6WgJG;x`AE^.?;n+( uYv EBkpSN7]w:Bb ߅*1oO`)("Bby~YUB]N8ԴI -S>zͻm!esч,6)Ixp,]*[U\xyyA@6ѥ?;vBaN*C,(JcYg"v,(1~W^aC^#zGy 1yFGdAqZ4" s yuX?=VeغXFN7~4*AԨ\h;U˷TJ'ygKo158ο,Nl%qRUI$|BZt$^ zL=Vɕb|Mgh 0h Ґ\҉\v./em~=5 9e}q@,\;=K%7kݝVM#"vk~Q/]Ţ( ٟx`m;+X^5"(9Mr$;$PyS@SMIa~7Kåyw-`3R6ն{RXݣ7QCbRvgyanJ/IwKP%̞bJRRrkwajHpQDkC[WϤ,&ׅV͙@80[IRp5EkZB̢ʕz} 6b6}Dc5yƯOл =GxB?Z I:#}̻k~nE{8ED0eNPN/JZP.Gam=`SC_O"w2.9^myؘt4_2Ieu*' yVIBQaf\ιXK$!'ݺ/Pn-={VmPY7Xq4;=\ߺucD42רPl҂4Զ*Nf,o&b*n\m2]#eEWJ0iP[?6m76&er )0y7]3heG4vD PH:=XVv8QH;c= h͒/=-7sʫ'˅$|V@ 6oՉ=Fх,S[y(5>U8`13'х5wF㔸$()aDez1Mx10Ƕ{$HQUE?7/4lgNH-~7+%LLs̟y$#;o|5n*vtMOHzZvOڴ$̤A񡰔 uft_ǡ'5'!1&\O=veD:a2e)w^3>1Cx$uvͺW"{h*stӢmtJnYͤTG~p/ll6>^f8V7*RHّlL\k/StRR]0qe:ӠIEԊ60Ӓ5;y} d-Xn% B@@RWhOgġB2&S|03ʊ,@vZ-p Oj9rej^ovVA/aёsQBxXot,rYs{p_ċ/;D̻UC =޻tiX+<Z0ս`%|6+C\C[Fy6rND*ל Da3`xб.y!^s0G$ .b$̂n\Ma}:ΕcYi0򷸼'cpOJb1΄o,9p=Mt+~@%yE ,P9Pnm%s@`}Bn!;aHȉN9ҏ׷ǑJZ) nX@ !% TLSzIn 97cϝ'V@9*irn";?teWQT?/e,г[o^".ʁ'WO5pj̰pGG?=Ұ"v LMi4*HXD-[UJ @B ]sbX{RŧGۀvbtTAqy'~Vp Q잷_S(ݗ-BG õݚ[3#D'*_]O3yX#<`޳e`-G7}-Zi^ #4%H\b6t- d@sf{U)ԅ˖9y"H/]5K9-j+}-y䳌l @jrb.+iEΞ%B̻GGЏr| 3+U6eN8Gsm(%BbHɣå3XBI+ds&Y36u k?LNJI`^jd=Jo?'vbLd<'S9\: #E{n4+@{|/45-*LkzM(0/ yDnXN:Q6ZD+a.s*n|_t~z=BD 4@!AZW wee.Sś ] Q{D"bǶvzJ P[n&Wai *,"CC#`ZhZ4Fow@:$p$<("*FXI [%&>wkzs@)}bV:ކ}ҏ쮻ZvI#Z ;Dp DBa)&NAodx ybDbO4_gTlPqnǯ0w\voeC.?.>d07IS`?;oXj}wzQN 1E_Ssx0ycfmnN|3G_U21tYc>i e2̚A.γ Ky*\՘zծ|JydZF[u9i/풐G]5r^ @Ԫ"kQ6cᰵ̃hn8) `@-6 s=;H!)@WZC;'E8Z$gG޶"DWHCjE]P5I9ߜ64bFt{h%poN 0my<Vς&fV\;.槸!^T616GVxbK .?TBIFh`m˽$lv/t?52;[pD4]^Z_-y"<3_8GpSM.oANK>BkO[3?ްv=ioOOƌR9Bg~#3Nox c棉7{x^sp+GAH)&:gZjMIc5J'QA[2zdi MKQʆ!UX_A -@]ra @_wD(kVҿO~ l*@[N 81q\KueC ޖΈuvo+kbgx^)](8+0:[9-c h웭wKuZ5)hܓ4݋{A7vya( J=Ɨ 6>j4G5Bp`u{CɀrQ0()O!#4Ɇ&15AwO;_a}h>z9 ̲ZN@ҡ(J\ R8:Gwphs(ǎSyaEl3\/H7 Z\2`y`A%-e}0aޥ8\_${_Mg&at6L]$*acΓ!$/,V$g#o|}<9OCӝK|x|!-!`1yeeZVėZ{HCV>7kCU0]R?N6(({J;< 楬}.$e. 3&OQ=zva8PuZ ׆f8 RFoBgs=35&0hZ5{ΒM+vіizys9Vѯ0vϕoo}g:]8&D#a~yڊVo+Ϭ??`h0=4HMTP8n&տҩ3gK=ei*6Uqne1dI xEUpFD&8xyX,QF$+lQAnk 0cعԐkVNrEfNT|G`wM<+$ F2qSp{Y09A "&=O$@ pGcI5g%\C9" ڌ! pG=5/E" wɜBrDf6e !>L=;-n{-$tsEL e4TAgIɁh7qe9rU|ܬI*bM]_/A<+{EUPyA"}-] vc,7rHG[Tߝ<OT'F Qh>5Z=N]8kU1(xY^ C<詊&MMj1|Ao*5LE^r"$T6_|֒>dĐǷB}/N@O;>+s w`%tO:9fTHǬ|\?Ba{(h"Xn # Fg 5d0%wN'$Bkp-{"=E4'鎦?U[-|OolʿneVBuAq^EvAI^o7L(by+fe('$hC;-g}xz7=5ح C]A@c"<,5R3G>hz-æ eBy Dn Wܝ.Ss_E 5d[:ޡxQ mQ?i)u8TCwLӸ7XrT |7xXƊ>_UN²}9Z {@Ѥ$}WDZGiHnOIe\R-&"7+BO픽Or%bʲ[$5g_P x`|g\jƜ2D?\"#kYEhH' PeқmU>qۖK;0igNR \01K KsXZM?*T֯qAV 1W,Ə _-wফk߱iѫ2:qjGg-Mf2=9r94ey+TjI\hCϹ h +,NQ/p=ڶ}ہƒgE2BkiF'=d2vO}HlOXb,WsH zw(&"e9Nş{U)4x:j.|iiW*ܲ:-c%{v)3 Ubow\ ;pjZt _tʺ썤)I_I'rASb^nsAcHnop6%0vZFf`8QCh _&_reFܲC4.-XGq=廤 NLk wIyd2uf($rE$E%E(jW F6yD==͒TwI`̟^+ `ܥza&k8"7iǩ!%9x2DYQE`Ycj#ʯl#S"!>Hrjdu(q IhGjm]=\&6m$ogRg߿g3*U<_{ ]dqqhXg< wʼn,f;XuW*tqe +qB¾ pzͤ_'b \#ԏ Ֆ Ɓ0=_Wrd|B%6ӧY\@n\=n V'5Nr'xx>ܡ b/V2[m1ܡVQo u1Ȇ5@DU/э-2.Jgt ΀VŨ0M23-{ZL ͖蝚F`"&AI={M>ۃWyHv+D%0ڢA<5KeŜհ#0WC{9ǒ_Ef Jߛ' P~*(|9R j QF+S8[˻סEڗ7M]qwVsG,QӋ="jB E(#ZBUR5W4ۿ#]vC|2x;$)HDvdc8AC"4raWҿ-/6]`w񎒤0|FwUI?u8Mի t6HB$Yq"kĔYϊ KN4Isr=vOajF93lOpDcȞ8.8 ]Yd1Ň9;&wKSu:N欴}ꉂ΁2>KJ{<A6Nfx{Z"B(B~I4upHSm zu^Scjd E>J?g?\u9u]@>xP%훈 ӡ_{e(z+NTh0Kay?LYW@ >IK193íFkrq!TE:ipfrpBX0 ͳ$[ ix{52hV.s2ܟ$bs addaI-#$rkVɕS9E ##K;U{()%ba}7v ]^!O+{^J[ZLhŕR[u,KS3)CĎcrxIErKF#8f« HQӨ (o{bݞq6rԿd\8M"k{°ʹQhnUFU;AbSK6(wmKp(Z4}JwXKa ŏr܂b:{T\=\ 07); >w-S귃^ )÷m/X\_ y=&ĻXNlh쬠mғ_, 6zI󵁅 Yc ']֒>#kv HӰDU! p7ß]vZ#3 [J/syEMbdq` ?/l g FR ? B!L6t_+NϮt䡣)N[v B{.dgwCIoz @c(ʎڬ2Fi Qoh5m;%"ZE$?_Hv]T (r@efG;V6M7PDWQrc9 HH c̻Nw,->zE#WyJ 4Wg$WQy{ٱ:9 [mLYNl D@O6Q,x3{Tev{[M,F+cr*7X~ mY"l_=lݪL'J3S`T zdeT6_^%|T3ʱsVWjM _xKxAӫJcC*9&Lf>8b_Ea] ;a@EJ>,*U|{|:C]dw蠦X= Լm)c7tFJϊy^gwoy[b"}Y?eW~(:̓ )#Z$M"NG# b!7LaY%mGY>bv$0&mM'=HO#R,W'YH\qv#x S]!UE}sq] 2Ä(g뙠[ͫNA:d/Gv,W+lm-f.Ta6ԫ?d m酒m -poDVϩK,GV^Zu^g*'wXzX*p W9M|{w_ݣ g j)˩AYy p];<̔1n0Y쳄fieFM~> F~qnF07~-|"ylz5.4J]l Q@YZsusieR/data/SummaryConsistency.RData0000644000176200001440000055701014113174714017244 0ustar liggesusers7zXZi"6!X])TW"nRʟKMd[_;zkq9|fAd+zlOukr5 pNНH@gşPsp:)0l_90.?z:=B.Mh:L=5.H>Rw0 ?yu!ɒ^&!8fPUpdӞɪ#}zy j@2 FKugvZjppՈ}+/ Y ca%0̹}}GZa' 6^֙np9mD5F>@n.ϼïo~LІˮ=mfcێ֣3eRl6`9+U.Kng5׭v q荧j굕ȍ)D yZ๠O~;WS=8Ƥ/TlDVkĆ,nwʙGBG#l5'歨Ϣ]54ox?V={}U*Z;GwBޝ(;: D *#Zg{퇇i[͎@M4Gҍ-wrN{7`н&`-9 TR)c#FZXdx93>m8ԙrH-%Bc.jLbkcJ4[X6<+1I.6f22J^rP:^9/sMqVΫ =J/@O|MVq+G{%u1D1#\-Dn5$?j{/DA :u|X\x(>܍I8W=NaS 爲FYgtcbpDR<8Ņ߱q~~6y1;e70LGd_mo,\-K)抳qs7tzYe&C<|F&j.tgQC| ½Ov<#m"Rl'/V0K܇nAOڜ/K^jN^wxp2gstLIC@FKp2qK/%Iu973=SۜP|) b`%ki\Q@-oӭ$WDfYmGel>9|x{@f-CtSG2P5ARH4O*;c8FMhW|G%_%HR-t&J|'@!Xu}@'Hk11]2@Џ$^eOT0ʀDGY4:HA)/O4LKk0a-_I)k]s';<4  RuTYlt /]xi,.J\Bga:FӍvVmPЎLvb[dЄPW27YN_?UqoP\@kɄsX% q:. %M ? H ^nZSa9T2jIlP]o'z5V|E`P2Ktn@!6JDze[P#^s.U{#\y=d2WB ڸ1ioeHap$%wVt1,mگhr҄U&hi=`b|ǜl l9tb!A3qyMf`ӍQ!4A5$-UM _m(əuI)mܱ0N>3?`  Ge-?fͦOȪ{q}C[ vX#cE踻pVl^oapKoc.nj~"ºm ."5~o]da0"v0leV薜 Z=W5ğ3O*:έ:/W{f!:69PPd+q{EhL®="pH_ѷ}a.S/y)vdg\K|Z&y̿aY=AAoV&ejTLe%7F܊cW1fς$!<8>S(&)3uȧf)1T3ˌ!%c]=YR=NhVtwu'7Ɏ/bKP >?mcS[xO)(21ϝ2V%XIZ>bu8P$q? .$}ô߿E ? > /V ʍ,O*X7ُ X9Te,1۪r85uT6l1~M][h=CJrr <.k7lEQl5oe"oz3!΋M8RCc)  |T$j>էܱǩcğ'.K"pJq߀l Gp8V1<1LHX`.-ni{~6[]khSf zܽ |6}27=? ݃lF']IXΒz ~RLX+?)YG+5=PaCTO^L^ ]l~ɓ^}^!#53>SbE!ˡ\ІpFg6Q.kXBu/~%M#6Y"*:Q86s "&7W}`MAo&< &jjw+-*: h691r䈷z^Od8`y4v+Ap,*84vie3n WXsr$}$c™UO;r;Q%*Qcp+uqE W# v)lOV&1;L_/&_9ie%k~IhyeTd[-ŭqZ(JZ|@@$N$ӈ[fud`e {iffb~ 6_$.$4h;\Tc5}Va7߸_U8ct▁;apJLĄVcU,2.6E\BR:ScFn8(İA A1D=o/S/IQjf<|;]* 6ut%'|MnQmNP71H٣pƚ5morxtPvoq=KH.>]gS>*nLp޵I̯`br"+fGZѐFrN>]UcuJg#kdYD֍3R(B*Źh!+Ỵܜh>JᏬJlp vZ~aH^0+Rf#62JPf P!R/7ԶɒDm 3ĕ'"iˇ:fU2N[HV2$^LeÚ_"c*M8ǐ</h_ zG/ }¶Z_Ӿ²EWw:p"<~_r@4[`Ra@_S` @ @yNLQR#Q/yv'w's+v];iYBK`ȫwt49*^_7D/ҁY)a-˴TMj6qxB()/7UaX8}AؐXwS㦴 fǪOr7ŜZ KYR|loxƪE-~)dk6RjWgAit͊گY"ta!B&ۙ5Y#h6(UQ 5?c7*EΕ`—dRL+2-L#xۨ@d/eץ^OIJt|le|e~JqQEEdp=U/Yq5mjvweO>)FxvfTqKޗEWAK F iSxe^jXiѲKQO( (@HȅYn@U3@ZD*hR܁EWs=`#&eNINGShhE9UM.E2=D3%2 lkCMU7k-FU#Sg$H03j] toqjlSI-랖r8&zl j j\-=|5o L*")M]&KzbuO% K;OWw]l$!jI>s[z}+aN^7&4'g5+fƿv]: J: aD7x\lTs(صdÞ=z[ W~k0wgJ[D~e W_ )]qV'̞@UZ4]>6VJ{6O<ڧRGEKC~ߌhzڮ3V6H`-wi%_O1Ш*S-W !s|1  %hX^:udW 55᫽uUw_Rҳh(To[ `zyllalG˫6B \,_`om%|lV^a"н^3n&{|we1^aɊPX̭k'"}g *,֐!"JPHjk;\{6 OӺ1<.(H D߽ZSC?U Gn P#/77\L%ce9!.)%s).9?bOA3GS:']Q7T>2EC!< 9Fhx[yr)B]/3\@-ɲa?uƻ;qxs4)<+&1hޘrF_޺ٚn!$- o<Ξ3z.GHE>}\1}Ύu;S퐕ܱ1ACRX9#j.uJXx.|7ycvP(b]d&M-w{\6n&Mg8xӻG*dž/SL@LDYlڏvz8u }ZqK{HBYV lS( u8`gD#W:٦GՍy3{"1]"b?l cX>+%Ѕ'̀Od交ʝRo=<5\sqT\ [YH|q /~w`$ꅵ#jjTܤQi zMh8!dc3xK]\P!5_"jA`=9ys=d t fo~)c'Sk"BP.d0՜}&jĹU&w@lv:X7cVo6bsW֖33f7q)P/狒0.m q}3=B"!T^dlC>U:qغAIe~FH$PSApe>:V`(3v.d'jф@pj]^~bm+Co3,X+AcƷN}hH b;;0 7V&Fw$Avq8w$&yJt%+^[@8p%*6bg9T2ԽB9.ԃTPn>6zZvOX{H$P7z+t}lc8Qn ?DJo Qi_]n}hLRAdr!#swx0G4+zbS;'M]Go|w#e9NV'[jBzikC Az@tܙ},֪׵Bڝȗăؘ:crI\#zWɡFG^v-K)]< aXQC#TɩUyQ-ЪţSvbNa`fvW\$=k>)mpIZ8)efEYQ,[m?*ݧƘȞ 6yRSBtّU@QH^K2\ cVͧv40a6s9oReJop]A17|:H4t`|Ys/gZɀ_ѧVJ޵y7Wq3u<@ TxG8kxCt%k!SI2 b_| 5|ZSU.ýQ:@4OS@.uM%hw9?ǖ7k';#zZo \c" o=m/Yиua_! ^n}H-(]eŏ ǘ҆wUO84a8%QcfhUOF0S:|FܖӠдt[ #CM3~ʫ" u 0*q#0v9Kڊ*טrIOP]xMl`A=s!ϺH#mPVߤ2-&ҿil} o/?J=ܡ=cEn]&<;rV/)mIZC&7Ak5H M%E (i{Y TPɹpfjUqbΐ~/>ꍃ6`>ASVӐtV.xS"z82)S ZT^_\ɰ ;k~{T`8o;$"b$ `#P*#Umܜrca,!;Yyll0:=W6~|T;.8<(2&2hǣ]}޲GXkoz{r?aݒ8/ r 9dbZrCB~Io[;3W([`}<?ad9s3mƏ*^/Km;m/EF \jU)v5ƒ@"rs(Kt3K\fmƕR9po@Oi-yhWkF*h).~P {3mpeu2-,e}c!syzC\y-cE)oP- Q/!,XY408&AkhRIaJr@%~gZwP̚UU gyEr4CmrYl@&{%ΧB0G<'beAbm0ϏZE6{c>Fog:/̱ ;(d <ړ^30l:-|D`rg%U>gaź+2(fc-qoB hZw% dj9Ni  <.#b$dQrs<|gdh`86۱BSN[5Djh]@kD$9> \ ں}=fЉmܝs?/HdG3>|/ړh'3[)As]'q^=$'ǝ#GbcyZq@|’o:gQlME!Boܯ1Ir}ޑ tQ\PVkH݄I܀ K ?zXEhˌ` HikXVdR($xX7c*4+淙W(n-qovEH:j}F=w*$ׁ '#'wO}:SUzb?3o8sqpk:CSf= Er1*^qp"=k0yz!]#6yLO1væg6֟ѩ%&8 /K ȏԘ= j^J'Ҵ|_Wb"`c*kt?hE!.YI^ռBCa>tԝ[`dYt )5]Ԃ5q3gUjb͆k{Su*ޥ^crduO HD@RB{)-^XE-S@Z*UsQhǂMnĊOxF_<=ɞu@(g#n? ]i˓5𫿨jsuPRU!.v&-\H5Hۑ=D[,Yp;p5*Uʈaԩ@('baa +6pڥM}l^c) ?mnYiz;j+,$I˝y2ժZ1bs(^ l B]/nDtglz'ccp6iD6&8֖ V+- {G>^Z\Ô(އ`"owS195y2h]6Ru \)DL uz99Dg'g ȫr!OSiq>إ#0cVv?oewZp52}]nȖ #%u˚dXK = p +Hd4MS!W¢Rrf-c=Fpwޫ[,4T(m$5.`GF3B .l*k6֍Ê$8q{< 5 kK~ A2"j}] Zت*5P˨AJSyVrHeUo3WǥM̂Pt>g"^9p mjw0W4R.'iA;7HyzCWv}qw R?ZmEz"pbaɦ'OnmuBBCyB"Ž*][:yg `l/X)eA^˃Y1r$u8odFs Tw4.~k1k 󹸓]Ջ>>Q_kAJ5+@駈eemV qV&^痞~30ꘁq;sԞ/)%8->m} PϗM<YWWWntM-*&TsYBx)J1p= 6~=K |RTc;dIg?vd8BB?v̷u[ )4S,3aE=Ƈ 0u=KĀ:ad7mt|Q˩r`zߡzNӵ܍kߦ8AUUazⓡϔ:I: >;$UhQCJa{ثm;y&җkP7J>.UY(jvsHЧ%M@^{4 !w䱐dCQ} 6YJ *r@[h@?<3M}XaW)U)uȄcOp|Gr7L@9MZ=y_?/^މ}2tߩR㫍^U?~Tfm>ep,)}H?q{$D,6jiQ8_o{q;sZ~L/XLo,4Y/Po 3tPzUF3c{v8K0Rf,E*wHGl xL:##|'_d ]uӚo.u7N( x[zAbDA-d}n1dZFa}3b3g!ܬb=j [Axy@lfXE7W~XV磪]zAWz ?ֶ#fV!߫KԹU0"gS/^d!'ubI_B_:ً] `}BS {FXv[c%N{E9x =="S-j8#1^?b7˺gc)~Tji{_B].@peY)U'oβϝn)KL":J`V(.k(ԏFU|R)y,;&⯈jn7uJղ9K38W-uzr>^`@Z0 ASIsI*&B./Ѽz$Qq$Y 1^Y,z4#zАeҾPM#j*%^)֟L/YW5ׁr/OV"חEެ3EMV W^`58cݵzԷk=Qqw d6 llZa_j|^QhC@%&XB PgVU3KIf7zk1߬aVn:5up.jGyDG7T?"fG~(f WAcnlXAvxZdE|!(if^%E\3ČVLC7N Ȱ@i^xУ1 Oh-6]%+I,,^{°PKh=FG?v tNгbRNiϯ杼y`2?i60+VRluxy"g)gfdq9P4N(PYKs Ѱ 1pw+AKBS V`ˮ0rL#,(INجE Miwx 4Cf~n'Wؑ^r~E$]eO$HfA/Cze-Xd^% ^dvsCC 㒕>Pb<B }hf-K HIC>;g%SA[S9z)JC!"YaTGj :nfypf"R-s(*&6N,Nv*T\~'BGvvzLS&d q*Rs=Zɋ5[C$ȱ 2'=yCV*EvpjA?X_'{{1Go @v攺~ћhJxl ;$՛gc+DAAO}F8"f9%rFJYWN?/Nqp)S&:S/P43&#q.≂&$V'1ދ֣'mNMAsYEO^}݄)sׯrG,l|\9U)ҭL`=E'OsjBfX-*A̒,3OHym]#hl#vC+(/|k忮>%kZĺНcJT]a&K q>4ʒ?[_ l_`7X]Mئ G hkcBzChތ:#&vق# SZ} Kxfax:*o/;'ޘ>ŀGƓ`HwA$Vh%cJ PݿXdDZ81B}%dy NBkB *,ٽL*!/v3ndVhѲ/:>JΨm e]v0+5bfɪneӘi^Lfw_`Q|6 Z /3:ܢkɰ.]A!V\6,LckgnJCjOr7bVAi ['r͆aa@Oq54K)OQ )A,ˑ*F] :4{BQCSSA'[rv=y$/r֯.|"Ҙp->.xC|<(q?#v*PYx9VN#sˋ|03F4gΔ?l& cID a ?*-PWA=L LVcg09S=pأ9 :,63˼jigi{e=e UoӾ=U0AӀ4NDžGH}MӐ]Twv9,V=֡ÿZ ")Tu$׹A8 \oUiZa]uƝ|>E63K\:_eV Dwgm'kxRtXxSޮәmVUoȓiE zuC+yR,yzwk\ āp$A~S:Q9ikUæPxAteM8\XUcI]*%s p *G虬2ʑZ*{ xem (&Jik@4^Y#&pb:'U4.,#<Oav[OlwdM}[On džRDXA/ő).Lź4:kOG!glOIIn|O[q&IU ;Jcܐ~w97T)'b:I4.T k9fٚH T|w^({Rv#IL%sŬ`m9t~1\՟LDzÛz\P֠t1ܦr#c\sAܼL,ڪ7WufkX2C+lW JLpQ92hqUםWK([w@}Jpa688n.^Rj3V F nL`¬:y92YJax,H302=g3]Tw.ǃ]Tڶ;O'sO2GA{ M,}6aEs7ܴЈ)}27G{V!hMd&D4VM鯲YX pF%pgw#?s4Djً*QW/[ "h~3bSG}M]a:g_mԁෳ.&&l(袼ca"LeeEuĸܶۚQ8-LXSfܜ{z?a3@kJw8է@;5cr|"]OA#zH6 u&sEGD%,Kw,.EN V\@*ѪmAHW;YjZqb̆36R^[Te }&! " lJ Largxv0!(w}v$ +͢JN-A"lTϻ|q߉cQphYwdo)/;ʃ(Npyyy=ojgiZZ`_i^^e o8zj AVdz'm?ts^>ܿHCuM*@5kE.}H `+ NW=bn5$CǍN^Wnn?O.h;8Ӧ)&#l~RP Opx5 GfO= Hv@Yey 6X~Pͭ+㓌;wэ8~_kJ$D ڿ-X9u6'9QS Ҟ$CW?hmrҫ%~-KfX{|"u{;I,F8D[~Ln_WDD:Ge| haI W!JS`h_Ϛ 6?0f$ /)I=đǙR\(ž^jECLݒ&O&1&mI!yo)3s6Jjlj${uߛ xgB)kͲ4oE1,Y(!U= 7r=lC Dm&]nvY21Ŭ w :SUmSܳ MC.m y?./' м{$g"[׹q8!q_+oe b*\e\v  bu8@\ɽ#@Љzh'K.7pKf gIܘ ! Owk٘'pK6oSW\Ccby)I,@ Ps߽ .ycX @e_GCE|9jĎCRu"EPWٞ8:\ehrʭ׳q;v&=Wbv$%C3ȷacH /d^'C.4 ^ZL_ę fСNfWR#r)\Qo[`*8ѷBYq~15ٽux//3TO!_zC1en}dB״tv};90f,F DiպAiaU ieO1x#Χ@h_r40a1.$KH+n?aacFTYԏAt[*޻L{wV7MC򖅜ѷ m;oQa_yy+  gyeMgqI3$qAjBdݚd@yL SKAQhȭ.WDL"%|3c Nzn 1qىp|"p ٿmT,Qa0!o`o~6 ChオKII b)"Kl\Q@Lc G (*^O48zh]7p'6(`_:[&YdGhgG齣@L/-kӓl71\ejyMaW=hL(<춳8EϾט^?C j*P7AD~'XWf 04q2 dln<:d`n7үƬ}-x'[2=@=#{3,TORmjB=g!>AU^kNd;8OxF[_eğtIj*m|ߋJ}?]@7&bJ_= in+4>$D Ƿ9c䴱&WxtO/$*hFG &fus4f96?)Q‘|SzTe%,(>i)`q PBFwٞI\q}hf@]<~M5i+{r忹~n@N=ҦGZzrl0.O+Q6+ID~IWkj,ZϨ30X,al_ܓݨq 0N Աġ˙j#ӆFeː %!5 i7;sT[Cy/w=(Fߘb^(" 9Z! K"\x_;"_, =BPw"N1ŽG~rҩP*wMTQ;Hfi `NU8+Cn(Z_P`،0_O\1Y h<("!Ok'CW玁4@*>Ng4ݿ`N2!sepԝq~)-5tqlz 쑃Ͻ7**kyͤLi9)t |_-/u\SaC9$Nn͉,wEjgx1Ux`Dk8w{`\˴c+}#LA|eNj<}O+IFg{)i͚alkٜDΙtֲ&=c,\KМiF\a*?Tj6$bq#ۊr`Dl sG|@# H1f)MAc`p:GWC'xgV)GՃ2T^O,+"m^5K}~dh< UBʐs8pHZ`+NJatFXL *34 e#Ҏc3F!d&φ2C<.B ѐ@{P9r'9XQoW[C>1eN&2>-N9̳g ϡNuh;;w?}.|Zi$)6/MS_ڮo ] +,< y^K~wZLG[1 .@I 6 %ӋBQaE892а7K&T'* >9/MB쒼Mu`*(F߉\jǯ^E"mZq f&}2m>HdRZ@+0to ABd"WqWRA5Zz}MVUvz\Q,2VKyK$j q*b뢒$_}zE| cs͒I4)K{sfR쬰k 09JK:3u36.)hnjRrwa/+0xETTd: / <}uf$(9# x@#3h?bzŹj\'-FGr) x3X Ӹ1| xaSK":9Q]=D% Y4P3l0ab5bL 倆wzKPJrRPAh'GE'3憎}(QN3zYNKdYt!x0w j"Ayk=豸қECu`r.a+2ac;hrAWs0('ޒG;?t(С:Nnėא%#gy>g\^)/\)h}2# X®xIǶ*N.fRj@M^<I7҆ıa3LUF <7HLT0o:_.w|n YYp2FnܝUbHPf`ucvQ/&h̓ss[ BG;۷. %JE8 d% ?3aO&ELY:Z$ގ5$ߵ%[^x&Jfx.N:G`f-Wm5 JRt9P95#c+,J&_0BEiA===_ʷ>Xmq㩸n97TAvp7X5| sMI@O)I6dd1ܷzEoBWMz+wg1髮2{/=ϬSMj}M";q|H|cA#$%FO_n)q\F~;3 kn.%3Ͷu*gdH AMou'9gbȰ&<4ȼSe9: j%D_OLۉz\ yyyM|k{ȧpk€9S$aCjnLHތ"(SSϞi NGDaȫFax7AR/'j7BZa,ѥ&jffpOx"©A슜,r!X!z 6 kE}mC-~ r|H78-DwD. Xy_B61}+c-\LJm6`@OnU\XFzmiT#ߓl‚"[&Xr$a1T$y#sQHnkx=cgf\\v0IVO_ /n)@h3asvHfya7 ~F޻eF˺R35})4Pld$Z!*hQo(-Qy3IO,e^2ٹ; gX*ͻ\2l#J?c:mEVGiDZ O酢;iy׏d4`zε:2R!9OXu`$,yCl !*Zd4| 쵴X)}C3tPqBv.((|sógVgk]id> _-f_XjX:M:L[M{FMtLȧ6}d5o5J20o*#Yn &t#Ո/ \ʝMJJ="Lq>=5 3[ؽ|u)ծ'vsϼ8'|"uty !$4o4x )N^6K//Y][6EQ^)hdP~RIƼB1|wCފ޾^Y7Gb[o9?2aLߘf0!/Sõ!_{^@3cz\^.OY/^Lʶ] -x=02J/&5Q39O|%W:5,KdJi"/zd稃]XqBx3R򝊕͹i}~CX/b|up+n:$o3vjքqB |HETc gN\AcE%ez䂅Kw=Npь45ͥu1mb䨗rRh_3:d/[Lx2K /*^$B+oRq| [w5$JO;\^i0u.k15Dݖ>p>V/SM(S ބNk\[JĈ8| p:g,̗ hH:zABA׾Pרţ?A']zu=mL@~'w T٠׫@ף.~Hm'[F rO,i֤ݣGN7 uDğzڣ5 ID#+l~]sԒ('j2@d#]M|$VlrX6llLOqCXgEYRI" `d:V7f*Qvzr꠺'ѡ_`f5w߯!ւXt׶i;lzJN87+aΉJ8F4IQ⠪f\N7w!!= c9!ƪ^ܚzQgd5y:˭A"Q36v+;z/[2!a)c[i &Sih uսe,|F6@|(@b,s2*?1B[α%`:.\@12AqWR{J~ft'ٿL0^M<[g/Ei2(%[<ᚡ: ^) 4vp_* ފf%]G_@m9zbU'Br fʇJƖO5z}=XI 6bOoe{b-oyHhq\8yjE;ŽQy*~3cgzuOa&>Zgg2jvOԢch3dύDY/E(#;m,{K 6W+yw.歊yуyf8[&hS.$`1Z H a}l̏7 6%o3,㇮ pϔIaœDYwC`ޢHt7~y,R!-ٛ0G .Dg1hW$%t# %Qx,rMdDdfrPދ}Q4c':J I4FOʛZ< X5TLX' MIyw|6[йdU'LYq^sytctpGFIz$g(v֕UjWR( ǺgL2D9Ǹ!:2s9)KbGI*$02`t{7p?ӮB2 *_gׂ{ lJԼ> a(3v>^ tٵ(%h-4jxO9"A2X^h4*-~$#a{cVyW7]3b6Xmb ɀ /uetnq̛ n؉”_&^+t - sy|]WE][J)3r`!=cL5G%&6*CbÕI[nbTXP8c*S3fp}ܚH^E_ BYrr z"_9*xj@B+m.S FdXPN|0D_-9ׅy"ߥ׎RaD{!'(4y"2.!rB]Z =/BU34Ģ^n),ǿ4;=1[Ro|XWKcI'v4M31,H:^ #@ˡ?w\6+UJ5*|9ia`0a>'2ި.-{ZM\eŤ'\51Wf8)reOj7PزUuCB\yX*c}9iژ `U#L/ؐ#XzENJu#N7/8bvT ee4**+obۭZ}]a Pz/nݣHfOx,0If$ATBlm~;?Kq`aϜ8oPqG`a?kW+|tвvlIX 4O(_-WׅuG!JaeLD4He^ަ|uPR_4͏048'HRQ-c+:7:a& Mlj)-D&. q*Bq? %%]g^-R ڰ351CKrX~x[ܷR`"BdFz[Ӡw:&]_Ǿ"*## ݢc-+>Γn%?dA|J~;ͶRFq%ۉϩFNv*T{땣Vė$I̙r?|hn:磍iE]]Xub(րfa̬5u,a1oөl R&}iKFiSBns3i=xu܍Ut-YXF(P2&Raw_nsty٨"jSS|nx21C5QK5HWkuτФ|K Gϒ}ӫF5ҙiA" (J@]N?)c)Fg RZ cL" Aw6 <'C:e{PrwiW_JYa[c2u T_T%zrl7gsSZӪ\P~cըaܶ]` 0%oAhb[#N)vgĻ1g)dGrx!.;O,v&N);#z[U5'Lbp`jgٯp3`SJ5T - T6="Lf|3*AVw{^ p5zoP A\y_Ÿ'w1S2nlSOj|7 pTGr& /zb mq GnKɴTiNi{8?Iшr57o`S9s:K$@@J?&J?Vx#ѤQO]*m/\ i'׫]߫mle7);dH-C dՎm]FEf.>Aw&V{g>3 oFdeODro}bt>\Ľ\; 0sLU{* ?e`  G4Z4U2}[pg2T1#d0(]U4ѓ|mUS"Yl;j̵nF?MYFuzmJC^,k,bF1ᅱcG58S1OC٧#`lIn傟KZOMeXdWF3@Wv9k1ǩt%)M,kA txb|nคm?S;u 5#nIljef6ܜׯ8P{;\uDOA `,+]~3L%}ײuÄCR61=޹PB5P?c(B1=i5R+gjD!?m" 6Ckn hO"]-jc&M$ȖrYO(ŔңT~>~DZ",+]+Iu9YhGx]Xd.oyVoj Zv@KW16jA‚[sW2ZSmFZua=Uu,z4߬SقY.BDyrxC;p?(1[nzXB(4;{{LH=ETt>?C Wf~[]`NŽo]M=*Z۸h#C ^9p =DZ [4'SH#m}Td-(jXQ{tW6av\NrJ3Ųlqtzv|>08Ag%^GVԇD.^n }ʹ(jy"*q+C壚yL)Oވ?!N;dCbb]}drX\ZF-nfqSZ o4D 31-k(;x]rHd :ɿo/GQƤ=N!~8̗'Ҋ|Q /QHąلHK\/F_N Tw{aBY1f7Zov˗vL.U32I/g 1ءS WκsvDkH!߂Q"U?:dE2vj#Tffl6x[膳vںBcM}pO om}a2 {. n(ߐMQZ ]Ht4•|xǎ[!dGͱ珳 -Coпȡ-b@{2kèg< a낲ǿp);,;i<䫴Or5ZS~|VR8݉oH??A`RD@6!E\y2H6ޡVhM`hOEuon63z^flyJd+hXr.E`qG_ d~:2S\d Kz+{ҌJ;mmvNrک!Q'y:0bZ:f=LősT!,=aؑs\Ҵ뒡o+skl,sFz;y\(ӡʝ#!YQr%xnLf1`;ܞc~JぇGl' ڧ}(*dj8gcX鋶l~37a+d07$ʗv 6RT˹0;{GOBNA .najL ʯ`2Lj0F0~WQfv~93;-#َ}YqC Bvx}װ> 2\3 ^|GK.kv,> ,@"*uw_%x@ƚX,!:fF>!l'EѤA_-vXt*= 3A҇!kA-K~i ;|u{Ϡ=ѣ^MNhe-yl~D"x|5Fmr.(rp:BҺkXi{OgԛdM5`}"JMN( 虏Pa:m\|o u@11:U l1I^OMF?+Pb6S},ʦ1 Ͳ#R7+mEJ6eYm>[HcL>"_7M61A͇M LjybTD2_>:}6hBj\FҞhYo@n ք_2ɯjm-nASqOOv8iW?&a!/`1-w+EFEb=9i*$BUiNNOl/ٶx#7V׻*pi2mcK`Ĝfg'Ĺp*h6p"mJFu&&T ?|o.ƶvЂ%Ʉ ?1! 0wFGwM,;5=K(\ l/CUmms:qEeNP Ha.>ǒ[6wc3hh2B~Tdyi(Sb{*3L״|۶\P<51^m߳a)HìZDEDyc2?;+WI~ǂ#(ԊHjEDLAmpkr-30{OAn.L:ks 蘝?mCV Tko5 Ia);ǝNCQFde,r(D]K|[}euww4Dx ˶Na0yo%$oͿ'-++&}ɮal;iqUXfh%ر$aDk'd@KBc/ &_ÏI,cd'!G5jK a-CH?zWgHfJP.Q@.u#~㨏IA9-Vsہ6}9%֤&EBԺv֖:lVp KC4:+:mu ӱB,5j %z}Fa=A.t yCK(`5$5(YoY@`A"3,on hBki>^j1cә=;9+D>|gیzVFcw.l1!%P-=Sh|? b|6H8:sp8B4Z0 "`zԈ|D樕ٽTWZ8;$XKGA} YuB5p2;[(5 w&CA<@@p8V9C 96cMTأ^bLQXC][~$1Iگ<^]K5Tǡ{GnsW2gqѶjrjMrU|4oX"K+cT#s`G)ّ >8SA3t1xQkSCqm`3A s:c2Gy.+ό; n:yfK [9w||*TDWJ@HSS"A=f#ץVu J(M8Nƣ݃7C>y9}ډ:vDw1U6BZ28d Q/HZh5kRH_u "v\$^H?G蛂N;+RFKl7l突q) w^>3ObIٷ"ۺOl.t( 1{ 픿f_X"fEy7&D㽭ɊSTq\.uTj6 <FmDo:d 4܌36n7Ľ{,%9I#X9՗hrήjHpz<6wZ V砈u4`u b_[ :%&xaT]%Ul 2v8^,VkHk#;юU=59gas~Y,F(f[r~Uz W]NǎT-K46-&s+ *bL/N;,swTM JngGqg?"Ȋ3(8(aOtսgBC+2U {>",p bs_RWzSLۋဃ!$4O|gLKZ`FhSVϕخosA#/EGoR^%uL!UW=x.S5vl&gyP F8i6r\l&<;$K ˾[e`U@xJkt`!Nl hmŶ%͙Ӎ׌SqQեl_U;Ѩ}EnR0/V8[Th\ ~C `Keg耜͈S{^S/Lk_?g2?vCd%ӇšMMx'0~O $E?bхITVޘ MҁcJGsaɪWQ_D'_hʩwVg"Hx_$S#g{œW6Q!Z8xJС;r߿uM9N #kbsac-E ދ1Loˁ+R,StJTdQ&׻.'J< ҝӇhCa x~QTI Ao\*ǼW©aQTӗeD_4;J}_yG-w cQT-ԛc.S"#VӘ|/3J["%|X5{LS0!}D7i_We6#eӾ}j̦RPGyFD' tǩ|a)ͦmAl B*힤?jP61*խu#?J)?Βϕ=YƊ쨷W`zv6@)陪U1 m1;0gQ'ۊb-@\UOF4mM$5KsJ[-՗ 6@~"D׵s_EԪ>$CIbqY9-4ӎ"x-Nn%{@{RڎIɖ&ڽ$n0m''Mwl?G࣏/Z* G}< I2& S rs  4rrX#ˠ@a&ڼ]cS SSİwq W%>, IGv˜0e+-6n0KY5.SHԒm4?PpB+QY%Z:׌ }yWӊ >o\7*+# -КXm爞kۍ[3L<š,cA9;'mAdbuSV9;(Mn>|qif, &, 0ٷuٶ{$sAEglRljvT}hgT\RK7F"ঢfǜ_`} |H1ە8T4i#ZX2G,$ mV"G$ؾ9rBSzFЌܽD&i< UV=?,Ww/((qD!Wl^G-[8TJ}dSj$wrЀͶG>|lFn  c9agϜIne[#b мbP8MhűTkyG؟>*Ur&9EIhʄ}gXwRa] ޜ+{uFb5-wNj/lKOI!앐  !iǖxkDLtm=~:В@%2\vs*,OZNRƻBa^t P^ÚN׫T_^RF*d^Glpj[/Q X8qY0|> wPMupp;0Oί.JwLucɈލN۰Jw{>??-om `XqW:̃~ާ+"%F(3-y؁,- qɆG ΚecE0pX4еPu>Wgl^ zxL1""YTjm+P8[**"X..LYp;N LX𜤊?Ё~(.ow ۯ4vzVv\|PNkNn"OCymkke\KјQѷs{[~\k*7F1'o[BzO+m(>֛wDJͧ!FqIK;8#Y6N߱opT/iEg/aM[ W{}FpYY'M܄, EU,- ezO!ՠZ.$' aiP9*2}wٷH)i9hXE YzCۮ"=8=x74MN.#G4o&nm-\䒸>8N[l9v'p5`gpqjA$D ')V"=I ]4dʿ&h x\4;g.==ǩ6_ CS1H cX^pa-^&*ίHI0N]h=x @5ie Pq~XńbWDzZkhY%jt_{Y02=6m5X䝸|[f.{hS!/ix4"?.n3\$elq7>4x~vzʦeq`P2T8fgV{L ?U*|@9=^wqވr5b؈ZZ;4#ǚ6U'mV.Ll6&#^wm,'ߛw9'7x ˽ĆmNG"½J-E@f8EB:V3+d^ Il]]LA|_&!KPM#<#ԮЀ1FZC 2 uԷie=BQ+&dB Ļ]U1H6 qAW7-jޭ4#vv#Hnu45Ee8ݝ/-mSB%#m!}C+Oa?8 /_WtzC;vQ#r3 *Me YU*˾ <ptª՘ ӓ S/Q+C5oޢ+#8YĮ4΢rqr2"V 10T~֌r| @X{ Rv^ qW#exs M `-p8j-:q5- P:.r 89ġ&@4/!p)068v=]odg4QOQ)Z#"i_~/&̈́rL3O϶E9|dØ#.Rqe#_ ZPS@l'oK>Su|z .q䵅¨RW-uhIRi{sàܸ& 2̠{iPwOKx??Uᕬ|u_CWxp`G2\م~I%ѨfDž , %lc;]JH쁃R^DrﶎRӵiFިF 6c RBSGpì #~:D e)PfF}?GWaB%-r_Ѻ+Z[К!}#,t{bT(9s1`s`x.7;FyPiW+u &|ÞÎHM!Ltkco $̹f~2&k(9mfÌ*ݪQjH6k8cڧLh$_J8LX*tCͨ*^ӵ qF(Pf4<)j;+ } GI1-D$B;.C¾=#vO+MՒieG~0U1j7,S.TXW雧L zIcUUfz٤6n-0-jXyVǎ'FÔ.A)@Ժ/B)^C.{DGFh~]B0ҥZI;M_[Y+\avĺFvE_"'!DQ_7;%!ƾSWukWXBo5EzĖ1כ\RZ&;25Wxך>pO^ { @zX8KPrn3J(%`F҄9ԙN0pq#^2W؏|~V#voқ>ebUM6XsEq`'Pm4F:WPsA`pѻ71aϑvΌsJW&a7̤wC\؇Ql7;FOXîܻO$Y;X`gt橠]S97U1 ʙNX(P}6zZ wV:W3@IMlSxOA5p- gC z00=Z)*XL{V` 0I|FfWo>u-9򀲙9@{JyT<p+A5M[ kFeb_e!tEXygvKtj{4Ȏ_2rG<λŝCLg_ۿfP{DR[%aP]ŮU'~[-z;cTC*30suissņ*azp8*/Kp@4t lRz $ n`cٰ/DΘ(+|Sh9{ӕ"eU )#CI<&Bq7{O ?/mXw9_?B(GL+텪M$ NW">E.8-C_,\60d`Dvs/U+UNc=9`bmO4m阞a }d:i6xk)gB$ES&>Ă%6ܲ!0DlӚ2 Ϋ:4I(c& f[2^_?= ?q15][3^D7e3,:ڀAgop4Иvl8I3o[x רNT~Fx|6=ɃsU^T-?*9)A.^,C,M=m+Hr{R^*Cc1=ױpզnKk,ޭ{DžmE go)p Ӭ[Skun巀KN/y^ӷ%@x~/qOt^M%?Oʯ기4A({Dw9Yr h`^izv hd+|;(i(N8oϻ;d12Ų`7EgL zYKU\R-\f`٤1 |\ʑdQdѻgAS/fC"3meJ٨aWZß"RSKzwwrv(1:ȣ8Ͷ-ؙ+q¹VW ^~ %l3\Y~sPH_k-TnuiOK^Ɉ_:f&٥S:5r3$K^g5`~l9E 8K~CRII!FFA&"s8gZfk#| |(b8q |.΁S.z)s<9]9o KYZ%̭rWBdjuC yVz|>b^ƔҦ;{[Zʲ_7>: 7rt&EpƊ̖3D*YхFZ:TQTX ]QJz]jiAZH<]HTU‡u4I= m:U_9jb=&aהm{}Io8@o5|ծΥtsA>MmmQDf! cg|1.Rk',${̣8"PFd{oׯ}'ep~b757fae|å` &$_t.J!exIFPݧ{X;ڑC ~ q1orTsz"p&D̕@Oyui, s3ʌMza%eQkht#eTUå;2WtC `g^w`1\\KB2iE{Cm&b, ^ O,?+{E&O\(}c%HGąt:]qs_FR䕕vmuz0_h}=G8>{)20UD(XS>D)6\v5;ynnU~Oz  H8[f7=PYWWVM%hPq/I zv~X`v\z/dv&iv>(B[^EL8ڵ,yc1tEs>D"~vL(XϹmp>s~F)!:y˷8o'<; `гz *TAD%&McKWU*N{OmMsz0j\ S5?!cx޳NteHyHް2w; QJĶ,&nTQnw2`):kE}2_ӽ0`p;AtjY+^\@vuX`J[}hi,Bbs,}C\&t2eTxns91%#cxҵӴޠEI+^foϗT҂ZvAJVI3a2/sQ%[C-RE轓S=" :.ҙU JSؠ>w6s(P2NU݈I'.$fδ2|oFYdsI!Fe=C zߒE= 95>֝8),<}̄y2K]d*޺)j#Z#9SGsfA@"%iHUچل:YfFD.Pأ$RӘDYuk|'J,]ylNM෻Γ4>93^;4F43}xi09~?tͥb-dro=5)@L#손%C Azly;\u"er/Q<8ƃ:?V)|=S{;l7RtОLCvq<^fV[I7qd>fB*Ŵ.|L2LަdR/6 4i֠w Y2` ZJmZ)z@>|ۿu/{lcív ݂kR/qSXjL? sn(?+zdWbgKmj4TP8,S+xT8Kǯ] Zx㦦0ttEd-PQЈXy3H_ *x}Az<7I_kIX+|_oH~e(W! l./amEJRϱ {؃/&MPpc"uH^Ի狜k6KI&jSt$:"$ÂQ5͗9LP}!ybIsb;qpq.N)z%yrcahOYL%"Q}ߒt1Y B**Fkr<gGoMUI\X xQln?ЬrGhX 5Rz{8$of% L4'5>6#3ˆ/̋r(z&VZ\l& c^y%[`O}+PG~g桐PO h߫w! TlLNկ4D"d+󽜇*81LPڂ֧g$w*!glʠ"s^If.N,{gaQ?o*"u}0ttp~cb=5ȋH it-oB2Oa]PhV-1g+5*(SHAjIG^!wx5UrO8>=rKQ :?oͧUgCZ$/D6%lh=<.Tőh^qeBk~GqE!DZ`L-Njwѯ.C)r݉ȬF\)!t}Sgѕp0 VC2}p)B#Vp { R\^)VH !h+L9ߋ!}]*#ZkD8,RRWZ`64jY1z|1_&U@=eQK߁xE=?/<A3$_5Z$w8a9]R>odSHYG6|8G-Yl3.Ѱiz|Jg5BJ{bpb~n4Sg /UiF µ]ŇN| 8n; tщ;O-W٘#!1]8ӆ. Eѿ$A\=%ik%8C;58LGj)jxYUT&9'#$5k@J(r{~CSwT# *  ̢_ʗpwU2^&CngdL}'s" hHwN55c nG\¨ &B|g v<#N"hkKE)݇#`pd{LINN1f:P+^`ع?x B#D|P3)q1Gu$njMG6yw`NW.m1-{[ny4Hj/DKry״+ ޷4 *Ó۲J2f0{rljd5H.d%1*v)>5NY^_yuNO ޡBRu9>1yyES|Hf ~mZMCccU#.$+EcA/2A#VߚFbnw&](m7z]Ļ3y"Ošm !xιfI֞}nڑUhUyZdb:QXbhԩ!8əe?qT! S!;#ZV{AZȹ\!  `1_ׅZkLjuʼdn|kC*ުc ;jԩ,u+bblm w[EgY5F@{]XI&Q'Lxniq|0tFרOwaE 9\.q 0&Ff/С^qE3d+CCiE-ǁ"%_N)\WlD)ܮwcӿv,ƚ|$G~*WK5䃛Y%Bѽ5Y\&cO8T CktuhY,]ȴ)SBڥ~7XS<'C Os,z~Ș Zds &XJk{\:%!# _ܬ0Msܓj3$~y4 ?ڜxΛ3>ɢU mMtAYOOz :*s3c 1} \m5Ƽ{nψGA&yX]h)p :l,-p#q(0@[vq˧q|v iYƯ1 7zH~\ ;Y 8z0>̚mN$R\/Fwť㩟3bqLlK48Rc6**2ɚ4B/3^!⇑ Đ&IX@yXziw) T5,T25N$I+GU2Xa7ExgBiSs]G4]:[Qx胛䦊 Mo-]RG9i.$tZ^S !n.NmPN%V89+ܶجHii[0*~4 tȽf 9p Q/%j܂yq쟠HBa*6@:EKWrBzvW8RD2+GS$0*z$1+M %J] #{5asۅtGz:jwN(spkg >\]e,<'Mb Z(q|ɡ!Wq2{#gm,}+]Qf!Fl/(K.>cR(u-_w}bEQ_dV|pР8g$p-ˢ׫}Y]0=`nʰ++(5op{;\m5G+'fO롋4-.ܾORH>ɭ垠W#N[܉{)qխF:AULΑ{Qpg2>ԩDگae_@mÖw TM%%EG۾?ڧOuVEǶR)ɠȤ@δE^}4d*Q?Z$4\C݁;>Wl5>݅w4#ӻnkn8+u%3Oל0=ҡxv_;pLml >Xz`MAzXn85A *F7@Ǥ#USj7u>y:mZxc&D%;a^ `LJa$F {M=u0\t,St,l$|gJqnRAri3jm̋9d!סA"l/~vR&rydUi]p=̵c!2"~EF1O?dG) 2hٝ*`+.Q{Y7 Ɣ~e :ܠ+G`]&В[繥|K]5юLibg:WYIAs"[5PO2vO %簛Ѵk)?'pE *"-lxs<O}3Ї{mHg^?T-"Ty\ҧ:DЀX-L]3fIN1Gu"3!A5r?Lkt`;u{Z3ef[ dZ;^6NGMr_|{:^pf"|{ ^e@0R |ɼx-e˪ .v&E[+y k0>+vaـ^jwX6Z9c3kBbt%pX0S9ʐHz!nӅdCTx;\0=bFr7IN g"G{Y2V9@?M:x 0Rc>/TlOԌHxO%hauԕ?9.%ԏ%nPnI1rq: In;H:s"ۿ9q8۸E(a9.ૈNIl ;.`(AJT7 q׿d Mա [[Q݁!W#vubDVg0 ..DM-WX ͚!GcF|ő2NRW(3^UJӰ5p8%~i-x!,EC HC=oFſ [ThBGkO~{Qe?Q4dRtt9O0 gtWpbA]f\SxU{{ѴL TXD^ vL12ߒ(+/n!^}·Q ?45-p$!~~SX_5):-^]ueB2IJeeA`PQվ؆H/#?tSotXw'ņD*ZGytaCLX;g`Uxp.ǟo-J~|m݃Q*I9#P #+2DZsCk_υma=#U'PePVӊG^M$^>A0 P7#֓8ԅ$Y8CK &HV0ULP[֧);[ūUm=BH zʫdhDhY WO~{jKj[Skm^PS3ZҖ\{kz/vܿ-ql鿗$ +>iW˺P`V6s<<"Oy ^" bfvԮB2[*8oHxp)| {Gk}Vft(Rwgt5u l2 JDZr|ab k{+ h>7*Qgр Q+.;%G^l_sՔ_4969fkN#%2IlQ|#*)Bc#z (ؖ*T Q.o,[,Q݁suM5G  t 45s B;AvVIާl޲ HmO;rl;ΰվU5]ȉVzv{+ f8!!m=&\~|Oѿ0fczp)]yhny4ȻI9Kz6vwdZP+Ҽ`I.m(܀i t*"JAZB;?b_\'ޟb2sU迵8R0=A0V /_>[֐^dXTk`LJ[)=r$C|?)Ƈ !m`OMK9 }@wʟÌ-V#H..r܉GX *j_9.ۂq 7adUu,Evw?^m0HRK ;scDq(qb*!t-]Wl@}gCεbp ,C=g6r]G%nn# ݻ=5Pnmã:d~*y%YfEhvJ'XW &@ J)'\OI毹Ra;>S;<_+V-Ҙ`ֹ JX0ϥCSD2TYy /HͳV-'㦧Iˉf/e_)1-^8 [c: <6NYSꥣfExKjҺIx4@QS3l:R)e6-ZWGXq@: `Nn9@k:HW˳"ǡGhn+f~qV 9$"]j2$y޹DȆVqZǚ悞4J+3U;g2M/&7힅go4eQt@N~緢zEKb\d$N  '+ODաf"|]V=fK\R6+9]J,fz Yި)vp @/=N;s3\+]>rQo /%9"k|`qE4|#_l썁EMu:%%ҮwA /ϭZmF8iwlKTR`q92LB% ֥y.Y/އYc3jЏB8PLBlsMB3 3J]]dQ\/ze pCX(kBjxH|q鬣"]V/*܄ И\Fbی ;q#B]dTWx^٨,fk+t p˾ˣUz!x9P؃I ^u< -6g?BF,GǬ1'^H yQpKCIBgd-yrI-ϔ\G&]wAmtA%Q9z^-͠2$ڌ88R) JWF$p[bNHz{Rn0n+V80)5¤y.cְZ58&7PF"F cޜ6]P:.9Jh Aro'}1]wK$PZ W&'t 6#odB6CWd>.[K̺uu ^h΄}sTN[PL;վND 1ך1cCk]hͪms YQ`)[x"xmKE;{#6yS_ -q;$ n a _SagFTD%=;S][x_[YF9 >%b qR?U kPQ9XnQkAt ~Y6?QVJ卜ڵɷº8.*䜌KF}};ax>hq߽PljU2wβ8/["p^ea|QXt4Y3mYӗlًNBEna? ;fB탪+ LJzsqjA|#itSn_wNr?OL&{^FfMF#, `iMx0bs*Ҥ]+NΨ|u*w-'T%YvG:Px#I:>(`SRC٭|ˉۻ"AOgfM P[xIo 6<S2@:u`NFzÐz삕< UvE~YۣHsPΗc^퇟;PAᣑ7q2"Uliyװ=2 e>ǰ[m׌/6j@ &˙M rkhMUMB [Jmtvm(-J WY~7} LyF/jˆ氵SǬG+tNI6ÏJnƲ?6V'qIh HE/sm&3:ZTϊY1|b{5eIGnP+@d mP)B6)YAsbL~ݧ+Aa1Z`FXCd?ދtUaۑOd-h&'@(N@4lgxM;$%3[zPV_B`E v׶9 1 _38*@F)P;Ҟͬ+ c)︉Win78M7." YhS&/$Ȟ=U3m {|[A~RxCjg+oz$~tH񜱔ad!Z`KSq*b8b'ʳc.iFuu6/9mF$PLAy;]o>)CeJ,S:q JtQhy!:)VGMlH6cu&G-ƽDmyR]p]Cpq]2IXUA$u=) )<2t8^Q r0KM{D* $!pWfȒZFVľ|f϶(Po!?]Ӫ-EE 78`,|OyDe r_9#H0 :G@RHPKFr0ʱcx&/CV-U܄<||¥[-␩/Wv΁G>Xl$Oߦ5⥒FT`sΟT!)E *2O9y RbRiuNx|"a_/p8# 8 F gj:E8*b!BAЙ{t'EX>N$!{g2ȭpFFۊ1'Vҁg'%Դ4!RfoCeͧTzly䂺N+^oñ90-&.wxJ s;xi5/YL 7}P1/ڒlctfŪ mkHK%?d豙< <" 2nRVY/YGAm9H\MU%a7AuodGڃ"$EAwi?axa] XU ҋQ}*oQ R0Xʈ?!"%6cԫ)-@s:G5HvC6C¯Lv/ܹb>6j/B!It TnP\!&.Nwn/H ð//[FӤ= o`]-Msp RoT\)f+FW"&^KqkDI-W^tvu!Xg1ɱ+/P:'P T <9S-ӳ1)'ʻwi'>}LˬO, e֤ Gպ^9bKֳuTЌ1m\r׆4ntdAASKТcJYwq)eAgfMh愆7>pPxCA"KA^W)uh- f[4,34Ъ]f04D17 &NEV@ p{a|ztµht8JrT(DLWH'KUOY?Ž凥3U} @xLiO,!zZV@f w/>$cE'%YndNl}؏zvjZJ B/d:u.W EyK{`SodYCn8 UbiXs&l%3l~ ՂqdclZπaG*'8Qwd`@Q4ՠ"jakhNegѩ_0`Z)og":wL֓M[0LtnsExCVٚL^ \V0sT9l:K&-N5RR߼1ѷ1}Bo`L^y@µiL-#=k^uh|xF.ZA `PA mW^` . C1܆\b-B֫Ý0P2HʩiX1㲟ЅԞf~6 /޼uU"bdX-05sNaXEt{)ϘԝLñ羀 Zi#D=p<`$\tu q ]A`@ëg#֯E m*Ѵe"8{B/@]xIo>Ƌ3OȰT$%TYGS߾A֞B\(&Mr \rFڤsA1Ir|򅎖b<DZvfd\$\ _}^n*w>ˎZ{<:\+~I;3FUF| o<YRdܹK&o@/P_]E0(7iKU,>zIѼx4r1JLOZؤj}S.QE\֯R}ڪpS͇L19H1'e<Bvc&]ι-"xaq4>F/HCjm'eRώu .Ȏ޹s Z2Qb1"C%_Y`֣-u9Z~JV;*w~q:~j$$i%+Oc@P9-4( Y@S8C-{ˉחvV=&s推{Qnt,7ygχv$ngjNjx4Zʗ<6X,e>8zlʹ..zy:sbb2C =,1絻F21S6~nQ7jQĹw.1{|-O%2^{ʗxU m \qW\Z\_>IC5?\5ց,9$$Yԛ;Jcf7/TN&|,`p**Ӗ 'fۯɨT/aۀpGP죬Λmo=P9,j{f׹`qi˦/n-' W\yAA)+Q%W0Ƈ g2,%ahϜKN xDZ` Nߑ".hQ3OfǺ1 Xd4Qְ,dMٺ.zHF8( 8I}UN5ܣ*Gw0L &g@j_^zYҐHc9V"ԮJh ŴR]ǥǐ1zQ&\\4BKQm?IO*V(4 ; f쓷F N#v1 *CW?^ rWڀ dgO'k <1#{e.0 x_^/ \jbʊUEԪfwP:C:l_Rӧχ9v0ȷ{x˅r S!S%sǻ-BNd3"OMͺPGZ$.ҏ-&SZlv{KO" ܤP l?4W,/[rhxw:lwLFR-E+#n\> ǣah2Kאl,z:C(V]uרvSR͏+dR۫-b0OB`Tn_(z"/U:n~n dFq/߭gET~|ny\۱-?4?:@>;Mr3AgǼlޔ 0i*3L:jx nR+Vݫ9pWL[E6 2}v$lD>rF [^w࡬qG:c1}U'R( /\d|$VL#@LbVtg+n?$z<AVXySЇ( ][.N"»-UJ(Vϴb!,nJvʚN^c΂> JASu`\z>%(X冑4y6.Q+8VM[~us.U2B=?T8h0` MSNLij$ Kc-pr=vNDjF9Ke.4VvB7w-09TMJ8\55yrkĈ]VAoz*eG0sŠXO 뭶n%dW$AQ,rJaw6ìGdʫk5}{ F+p+#0m%/%""=_#iv.?hϖb!6Nz6eZ4lݛu>+F檝Q>?eZDo㳑2a5:MRHi[#0s'GB2ƼMSz,3׊{U.}g2hXW:o!&̖xOqZ@Օء/MkV^SBbr*H0`ò8챎h'߀]tN9yRGJ5,Y6\67>Ъ?(+9GV.|9"-[+IIa8'zUIİ ;tfU(Ԕv+ˑ1hNBVm\J\jmn tϑNk +r^-p;Е1Zȸ祟4rVQUόeoV2!krtߴ Lʚ%O{)T&y$>P}r-S|dTiSpuxy VOwNSVCd9C|R J)SDT[Qϖ<7$dλ EE9}W)UFeOl,0<˶S,VEZ2\#7͟k9W1ѽLjs)ZY+wQ{djRhj2 ))g`sN]VG'I "-`fػ/AVq\DXFNzrq^și*6!o=n\Nfħt Gۖh8n*dA _ޠ7mnQ[]a0 chV"y-'`ӝɕG7]a~f1q*kMtWgXd(Ēc~{(89RWczXUad9fC3Qۋq*;j{ҢPNxV99c֥VS8u"m *Ed`Sb/sUf'Ä։xL]qd4Vz[lC5FA\ '5F _fE%>[+L9ZW_%cLc&~zZ=Wi9,Z!Q[ht:K(5T޴Tn^,(e˅WP#tq^,3B81LFa|Ņ.욟;]{Ì}Jguל%U#@P+^R i(N"waȩ@ڕ(Y}'MtݥrRjBY=:27xBWal1ԝ\ض4fx3|ǠQLJ ) ]L 8q~ߪg`y#"iht nf$QC͈5#^O%n$%=W 97&gGRhl iCe~/Gw%Gِo@٬|P"Is9]Vgpߡב3eX3Yg#1$@<j\cN-CNd-Pb}3cX%ݱozRvS `dLTq rrVV􆐯';&20 <,9'ݠ>"W -G'.XY`}`{_u&N {EΐmϾY;JN~ņ뾼쳺%)i=Pt=P~ pX?P$'d{ZFA~yb:/:j󵷖 'xw,/.(6M뒐[91dJK6=:¸ҮIX@+L5D-p:T~mKe%oZl'vq$ -Kg,<ou dw|TO;>cH$>_E/!BC؍˓LφAc4%6pK v ?=4 ]b6V|`'Lv%|gΉ-y+3NcY l.b+GuQĨ194iqݙP{hw k#Ւ ͤ%j/u}9ɺ~xQ4fk9U"ƌY Nxoн WKYQYHB<"Hfif(7(#UX\\qmpy{]5|Գ5fvټtеmF>voPLssjp4oT=VU:B+/_7_s1ut5Gu܊HBm/z*L=dټF{SRr}w7*=UVϊ(mtZNMLv&JŦ-Efk|Po\Sܙ7͐U)U8-G~8ֈ=0)I+AHڶOH*,H!AJ95hϨ]Bf/ ~`EobxGW~`Ԍsl:=$VB!{NM(衻P,880Ks p lCQRG~>#|~0v"+ @; b$ʻ?[sX5zkdKM}<  H DxQ$-mH\6_ᙂ(, [hmrmߎ)R1Yg ^WbS#blhxAXnr\c%3=Bk*X%0Lzo q=̌2Բe${z MLcCӨ+ZCARI6ͬq$y\G%fm D35F#._ە tvIӂk@O.HO\;g4&/$cy%${46N%P9Ƀ(Ϣ$r7:22B V l @՚ 旘!T*j:,M[ $A WgO6m}&vԤUIn'?zpcZl+8l2ټHj?߶•w{ U ,ՇиZ_U uŽّ xfs, !!!wljHq6fc: LKX{rLp`h8d{~"7`VZgC뾊 g^d {j+ݍ1¯VÓ>63SC^.6Ot4os5iiYKisl/FH֗ <Rr'2\J17cg7 -r"K! ƫp}uCȽp@ݶL 44ٿ'Ge߰)?gA `xTrbۺ@7}SK8n G߈"L)9Ň&xyH=BAZMq[Hm5I|⡋sŤct%Öf*F V}pWd%ל^aOdrpK2HL.2{ SjP^~T[5L,jdQuf6mNpR G/RT`̳ ^f6z9QE7-xIO^Eaŋ:?|1w01(Kw~˕S:N:Nm }Î"8ԶuN_WtݩIGtasg"TC"0􆻎nn+>Wqd󼧛>?Ś31YX|XL2WpZ(6pX܄ap];1^Z6MULcqQZTqnB!K̇+z!aJ7_-cjFnf2_"h{ O}!EZ8+k-+]la!ciXzF?M-ӹJ ayHA vJ~uF˖- 7!!|J`$_ XO\/I%yGmƠO t>~=v Gmg/, )_w1cb)|5eګ8ۖ+r`!C$$PaAZݼf=lrQ<ܼOyI sUfJDxi)&+VTx ѸJH w$#bs,*hS%ϐ>v MhDRK4hjD*%G-SVեhwd6pc!8fa ȨQJ4Ӓwm ו.v`gTNFD{J6:אcu`~E=ITLFepoNpP=Šm <\\ 0|[$~6`ebA _dtG>G7l_ϟߒ1WBffϼzGmk49at)IuUWIz[Q.y'lxZXrTXEp# @3Cd>ZVz|}kzXr%?qQ]G _OWmk't#ʢҮOPtշI^y5a&cF9F,<=[oܠΪ2[|7"ĔcD;[gSj&XL8G71ܢκ{.I;\*\d*1B nK:v}m)q4qpx? b mIjD +s'CMzeD^֜c'Otm88{&\90XjI!1hlciŏK"zWh) DX %OlWm](/CN:K}O,݀ qjmo/j#`]Q̙DVYF#%?c6$ ,kܶԃJG:cuaND5 kYHڱ)pBESNs&g @mFѳm.<[zs$F/DZ |B6ӟؾO .9Dᡢ"\܃~wwc<Ӣ13MBFP`)SD'4Zi^B=0m5>tyX<1C-t`)դJʞ|jH9]\ bk˲Z^ο1"aR\~LJ:j@G*^䨜qϐBujryqRhZXJin]G>vOp g_YUģDYb\vχ0)5T);jȾ;GM_Y_ƚ_a5!]U-m-@i6AoM.6?ؒ+M08-y 4j 0x?knt?Lw?ۑ"ym8Zc򃟿z90s銎뀏!z`^4xu=6#p`t?+F'ҏ%ুv\)Fv$r$YvR' Dߪ$5-Ep ػIsSr `,0Q'J,cd{Ȅ?4zBwѕ9/dM'? -,sB.NŀP.^Y ۍOkB4{}(fđNaìm~OLD^4S5ÐDj}m!7򝳾sipG׎iYA=JJhClQQ]WxMgtzIS;bޱJ8Ls¶NтF< sq-^_0]ms :>T}ĕ8hDdLGT44$Gւә)v}: u҃ߝNQnq^df[XaG`谩G-=9++ʻ#jU$ɹҐXْ1А. x 'kcu_(m %P<vWt  {ay$@~ַa'COqz@KTLV]),ԔP$Um1*Ft-YSF~t V̘u=!>iEҵ$$7rp lPJj(+5.BfO2"i|XyRO:ļ\Є!b~GR/eNzh =#;㕜%Q*s*DtQ PFcAaUV9׬Nnۿ@]X SDqN$RqVMCZO m)[l/|R}X&TJKbp 7E)~]Vİ$\n0'bg1:wy|lg5E2\*y \Wb奒C}<遜,eepj#'†|K[Nl]w1}!(ʧ -¹c|HK@!ݯTzOp7>س fw# 4jḡ!Pn/!;@BdMJU "EU_A}i}*ֵ5l AaXԱHx^3B kȟVf`4H~p0=w4=c'uNzx~'L+8~AMBKY_׭\̣>@*vnf'(.U%&›hn>W[1,xGҳXW+R<-d>w8G):DhTWܵe%, ?ySE$xzmyl-kN\uf@DVam'Oh|=GU]Z 3ž(͗uDzM'`%u<El:arqEts LN<7O&<(|tH3't}辶Uҙj4l_eEԐM5>\+$LQ CH8,q㲪~n}tުDaZtlUagW..: _鍋R65#b]BlQ8rs^Oȑ,n)[3JVW]ÄFәжIeEN~ZN[E K-kb# w-S <֤Fy{zmmAhmlڰ*s4[_EJ`4nz(_]w.|Q 5:7'WzOz Pcfs>MKzD 2eK*u–3ĵ2bA;2@4#~c 1i:9~mjzhr8*{+AtG`xqyzf9D0%V QcBtO X,"FrdpNV,7 :kF'T&k[A،(>8֫i^Rko FF oDXK\ýP~ű=12Z/)6/)(r| ,KtO 4iXR[۽5xFVCqnl%f$ҷG6T>Bs9=?NGc$!ix>ӁaI7 gմLc^ϩ^ <,o+:OqnDbn_ kP_Օ@,w5 3JG *_͵x%eRQyԭtgs=j"BvT6홁0׆OU)\ALWװϵ,RC>>:3& GrV zSdt2"Si[GELkr*z,Jy.g|8!JE#BʲFcP]~#3ҏ*t=wlD>1׿\CaO| )`1Z4vԗ vxR+Q 3()8T];X՜zL0A&DT駂b.0rN\x\>`lZ,/TLjT$t nfIUW'WLQ' +jlXEaZa)-ѻ}q9 3M\{|:(|SG ! BL~`ܨKuifؕR7'fsGtd)OdʓAs RnZu-z^_uj`Od!d0]$ݙ.7v;=ۇ IIm9.^[=oMw?U;ЍE rV?Ήg)a6G#mn,:42*Lc)5N^#ҏتr : Ytq@3 \sh7Y/yf9]ti{9L[K[ I #ulh7-MQ?/,$/yGvo8hT`}tҺ._h2r3^"K/g߁խᎇ_d4X,,5}sp%O *~~I  !T*&xNEa ?-~XJdO!ReVg POMH(* ^uj470Ev7)/7~}L_\5L~8vBWg(L]=uQ 1H1ZMiJ i1:];#'0qȵst[,ʳtnf&Qk -"7~MYmx 4ecW 'pph6a4Ӆr]fY烩{аOB1.e/ 2/{k ^I!H_0) xRY/GD(%MzpA\%h.`:#L6SP?D=,xm [ߜCQ?CxV`ʯtXkhV0)#P+P=bQJ5ԧ1#>U1}fA3h3K:3K8CCSmM7H#B_SM}WrOy\&eUb {F8J'mlrƲSeO\#Jx13`(fOͪ f&YC`Nu̹f3#K"@YWcPJd!| +-j'X˵x& A܆^"wf!-Zyg3[vWie˷ݒG|): _Y쫸~pzK DLbCaq vb4t6Gd9ڵSOH5~m~!6AxxhM81zЅtB܅5 +G7򔙜>@_8Bi.v$T\K5rN[umcU;GgEY#?ݸ]IT&k[6[H$tt64y:ϴJ+Gwvhq ,1sfcћ^ nqF6R^ ;*ؓw[ĂՖyolm48#]-g7*<_l *y?4_(<5>pe $`ŀށΗ`R`v}G Dm£8gh lf(CsqZmiOu+::u^ԈI%8=Rip ^Yn}Ohㆇ7k6>CɁ{tQ|G /Dz+s}j*8Ss9gw8c,'Ew'\XRskg!GaJ11 uAx8 J:Cò5 C{ eN Jı֮lҀe͓cv$ P19-z50sxh;:2TTHb+/5{0#;Iakr罡հux֛}q3VϬ8hR*زhPg \~ g#YOɈ\cR2:`+6z o] 1㠤k]yh.{T儗Sb݄E`>)[/ꨛ!ap9L?!𜐠Z$r;w6k*V{ 겯E(0Z.J{:!Q*Wσ[˶] $F{emPbDO6trRIO/h); ,UahLٿ`C9 B ÁIgri\y9탫ut$<^䌾p/vf>KX ӣ o3, ܛ#} fPQh(r**9SzL6ieZqXNT/8k!aD~)`$S;?I"[+R?s_EkZ@ǀ=.Xq.m],H vx@ XٚS~\BqG+Y{=2f="Ifmq!8$B|^z k.Vbx{eK5ϐy{߁˂pOrٲ/.D~{Y!l\ XUuaȳ1~'ZZ !U$^]*MG\AO1qtoaz Xؓ<(=8=bMq=)?4yͯ}٪ƿDHB<&Y8xjUCoTmQ#:7 ̦BHrߎLk楹!$[9Ua hы7-| ŠppvmvVш8bwPoCvّS?KAp{?>IX"~$R=J3z;' P8ᑭ$ Ż`rr-vwK8^~Ǵug|/58MTaL>XHu}7)Ne6AN$zFP'K x` ၢ a%8c+VH&JutӰu.A T|&A ,Q%mieUv*5bd1mt;]}9N₣Oȗz .~YDҮ}:U&\kBh\䭭}3h^f03ab_}7/aPEiuhGJ @̱ G9*)7VP׼(W4o-&eC!<+c"Q#H{f)J-o2KpIMSa #Z;mXl6LщfC_KRoyˆܠW%3Q>N>11o_WYt5lpjf9w]6q6kUvaئb1>FM\A5zgGCS۽䱵JջuC>LÖzq=l]a;ZClA$buR=ŀEsEMI's9DWӒvf([_Ev# : L,lÍ%Md(+F&)$n>%\WE#WRI'QǨ߼fZ"b~ xqoaOl HcmT8XюyYAϡ᭨Q8z4)ΎiFW#a_9gaHJdY ]0>j7`.p (] +C;Jd΋ ( :ч]`m;cd!J R6p:x ұX`>l'7H"(LQm2}[Mx JKnx\&Y+u%7vI"-͕XH9݆єK5}6Tm|pqtUU1ﯯUy_m9ʝY姬 ?-) V+lM)7=FU|t ~lR%rARm1B9dUei x;~G,`) 05w j!`P@2cu"F:U{J"htMۨ?fR ]߂!$@i eH]m}mQg}c  ^}6YOjܩBE(aށGՀvBquĉ$tr /΄ R 3ڛFefY?QQc(>bą;˗&ߩ*)'-I k66+i58u> I|l.m옽=*"cjNR3p~5a 2#oIr: νs% \G*u7ªwilBE , ] EA\䏘z.o>-INDzSWg\6zu w7҃-QR~eag5YR}mE℩NJ!&mߺ U Rbg ɠ}[)C\=2Z.!#vV׮ZS$c{J&y{.``bWoӿ_djhP˂Me4F!:Xh!"~|^D]}KoCj_f[w8_Ss^qn3kHy 鐡C\/nk W\ZMdZWq4 yk?YXvGAXa`\,57ʓ3' 4{i"]D[&T0l9I?T󵁜\HJzJތ[5ra%HNCbcM$3 u] wS0ERNp׿`y7wF%E1e?&%MYKyeU@RE 5aD](/S>{g<SOV<0э[2, eNH~nS]&ۯ4ڀ.4,w;dm~k*QO>-qܘzweO٭5kOsV]AD\5e%¼F TvU3Qz /LhYùu"'x62+}&S@ h\NbT:zSL!Y9aFp("_hr\}̸_/=XSvµ`dayeT3^>dҰeK$Pz*JnT̶z S$BA\;$qϞj \[;8ex2i(FȅM<ҿR|ksͱݞ0&.Z% 2kiPI |MRxYbre ۳܀ u|{]K[:]apfCW{Ng#sUYqCքt9+5P}%I%LpRg ki Yfio2 Q ׽-*p h/ nFW0m#5n0!?p͖(T8`5Q6'p 2^63}dǽiZX~Lw2{|+l656!ūzgYSQi-?87&rzTgܿbRI`)HOF*vLcȬF3u:cCf:G̍3OMK=nEW?m` pئ6Y505OeZ1g':e;̚xCi\(2A@wo'&n!md3O S 9A<>ћj0&D$BT[>ۥ hqm򢦦0<_kuE1 ݳ-kgG(@#&'I鲧yF !m`}_ JWE>3w^zp~Bص){̎;OiK5'Qp❻ԯ5@N]O~+ )?u;16bB O6)91CNʍvz89ّ~ \` -o؜\_3>r!t{#s|t E9=%%q EEέx~[F[+Fٗ# < "ߪc0e3M-RYպPtc7@`ۤt5-Ge b'i{V`Wo];^leɤ s" yIgY#i&Ε4`0j6Qc~XwS}IO"BY'@6~E2N߂9*cTUPL6N#3v'QW71;\g/T}C(.H]'9͐/T? x<`ak953=V.ren.hyu9AWءI+9 =gB Q!&} `guGG"[ynH^Ac{0o;vYGl~BAxwBE\,4;0 =RJ<6^xhݭ>?V/}g_vD{1dub$* ?sTʳ Lj%08w#p_w|k+]ՕlԤBi;Ɠ-w7R6#U6ޥ@.E]KhY?[МUQ<?5)U{Z`r2d_Dy?ܵ\\u~sD2̲a?@ͱH<@I?9TnZ{42:x.0- |48'?)< C Vmr] k^eyJL;Q(e051_#EM"lN.s/TRoNWhk`hg$[<J {įe7{&Kx!#Z'&ke]~}kVU704!@mY)i{OH7Ln]2sU!#PMUEx i1 qx=/5˿b4H% Z|{Uexª2Šw`\ixJ|ы#hI#ɚ:φ bwghu/eBl`D v&G$G+,썚3F OX8,[|8dX$,W"niP,RK20E-^h|-qѢ -F%ȳe']3[n QF{Hy#?J#ߴ$Ck뽌& 2DbV}T>$GN1Ub\ΑAaS-K8҈o*4Oӽ#+Cza\~7e@ڃjNnN u4K:F}4~xLY0jCO7bBivG=e%2Bݣ`U ^aj%VcPKd)W`= }5iocoT s)ig~0^[>}}=`gONfYQ=53_زN,Ԭ ߽azl_'-8o5`|,#An.8gO|GE%QևpmG ;&EL58Q4 ^lcXjTеe5'0)P҇Wn|eLǟ# T8 ) xlX &*V(1"3trkQ/Na! N R [χ7Q{}Q: +uу x1=&uv>^WeLcʕhOIد;Q㬳8jЗA{deAoᎠ}W L>CoR.w%2 ?_Wm;A4HD'jsL[ b_Og;5g?{'I0H+ddPǝ/oK[{%rF,/ӊ>,<'(3],AKP~zf`(r /T2@NAB/v(ЩӜ8D^&E JWS or amoz&'KmxMM+^HArޜ2ӣ#j0eu~3u<SCSM]~{ MnWҁr[y*h]Mk䝑araXU~{ضlOdB;zfŲPģGQ?J8lk]Y98;yL&,lysrucGm,KGv_s RE$ċ{(ơw`/L 4RFCB0'wV4@pO'S^A{ϒ2Yrͷwg^nZ}aV}vLC=AT kFdVS!@IsP~M\Txς?ԟTL#Shਛ2U^z{sal& "$B#Q?ɭf_SbѪ$^d=rIAgM_Mbe:#V)c\AݪU>-&'%2fdֿ.:=Kݥ"R3SfT8d?!F\ۇ Wbl 6% ! M C`#X_gp\kg ' ͹)ʱX6ഫ8ˬg`pEKP+ = y(a( 2䋹1νmHW@2}8xa-drFc T\& \qtJ@Z~刯. _> ?g||>#MwۤmC3=>h$ ])PLMs!j*Դ @AҢMUi|w @(,.uc 4 KKo=s>tEZ L@(Qu+a[:Ym/E:x<pS$NVKfH~t>g1368&9mLBƴj}%1`I#6)OGĂ2d] Y%Ѽ{sGGl`?^}*8h1( .Y8w"rvyEm1y)1#`F;[u]kWؚE{M2dɩ^~^B^~ ̻oMOC>x$j3Z$'u{9VR&e_LBY2,;=u[5 ASkNrjkZHsĸ7`%΅ sC""&hDvx aM󝊥vO g[o,T.DC$*w*:z->|0t]` }A;L, d=XT}N+KWkRtvW3y+EzU"&dHFB2jnSubsa "ǏdH跖X!YY`CPl΀.z |"n,4 Wc5i.i7A:zH`fX"GiѸ<5JARLq艜цɕhϣfDڶ7Ml ȕШj2KGʀYڰ#fCGqԬzX(2U ND4ZF(DȺ%Qbp'Re(pڍE+>"] Sa6 z͵vE3pOTpO"q0 H 3@ sԍOQ JmB"6{XΠsdlePp ]mj7h+2ۅAA墛&eD ~WW+6r2i:OgI(py:iL5N21hj *F@li?n#ɣ:{6&b u6I8|@(uopE%$¦kxPQ_ Mg54.ְ~IBcM'8;,"𼉙A=M7ʂn'LɰQ_EWٕ?+6x:($㦞)el ,Yπk@Y. f9qЫ#,mnC6 ˩tVJ֔:= gLT49`+C_$pM1_ ΓJx4(}1u(& znZήԱMXvsp1i wUZ m{Hkwъ @^{yCc%qzigp]eZQ7ZE;Ci7Sw.(M1YPkvϝ f1$9ϱ*3VA S͈ZqMUfdD _7X-!*Tb W5y΀w`+3Z8#ɗ;!{zm#jB-ke25ȟ>$;ͅB9 *nF+e]OJes5,$`R%`Uu/Oc料yko@n^piVDH3k?`ݸ6T\NL>&ŷ|j̪r-(59fo<5ds/b4FStz.+~aBUrʹp]L|/m.sb`lX† NIowHչmcK'R\H>nŸGQnﰫW u?C@70S uyB[{U PTCwK @ dvFyjlBn"JJhZ.ì8jd8AA pʕZ/h[N8K ( V[7yֺ3'6U zQ6.|4.vx"z q#E!A~ ’Tfy%YU'I9o>!NN!ßڥ3'&qo'j&(_.7>m/ ~{ȿ6;PznKX]ƖU{`)7H˾*%Cj bAm͑wrrQi: Sa &cQTE0챗Ԥ1&JxVacVL-921Ҏ %), V4t2,9z9&z˝0֝}0`4-N]m]JJݤ1$9foVώfL SUchxcd!j5XZ"0*SV=)jFX@C>-p*׶V)Xuþ_5d^D5ѹsmmdY!Н90)q]th g0!1dra8b]ّsmi玫u'6~tpvZFTOdM`¦K[ޭ0w+3`I[1cHTȉv%\K$V)P,R47@/0dӆ(?KR\Vum(\ӿ^[[$k+8-pOg[2v(܍kk]kCRR$"uN#dm8"Cf &<=BdkƕЉ.y3Ў{WoZ&:wIuN ٝ|Yo4nx2wk8^m4SS{Ch2XJ1Cs{|1iw/+%*hڃJ#"|@wZ ՝,|ϋ\b/n[V6t,`7󴮠M6UPaiTYbq½ }gs~2ܘ򪯓ž7P0‰6 %ޞ!Phx^U4]8x&^9az% lJ;WSݠQ|aG -jf"3N J:11K ![a .K7Ri)wFhb(X]Z9<6!*U]0&9?J2y;ŵ1IεqIzsW,_[^e5c?mfJ\ I1/??_|p E GV…4J6]a4W`Yep^3UGCD8F Ky1>jvdGή:˩'>Kh{o~"܋y,$PoPa'RU+[J&1Ngn8w)[ |ظ߹#[vn3^D4NTU*=S,3_+ ]k.m京͂iBˊΫt"7#h*cnZ>jhpK`zMZV|y!@ъĚHYT/չS*7*>Ao&ڰcYv.qs|;?N[L?Y4^Bz̔ sR¬]\la:ᦚ~7Z QU8dв0źQ;FM-q"M.E\'f#{+/$j-Mf^x#B;p>[RWYʵr38.I tz*#6raƱ‹:";0P^ w b, GS # Lfow"D+hec,i՚{e% \WrQ*dhUՑj<p҇_:+zhQGۿMO_ 195"[z,Y*ssހ)#p8SqF [t=d1ӨE(;<%+eي|F}4WtNڬ3qW gw{7̌f,h%m.cͰw9c7c lZt sf^&wZz] q/wnaAųD-b\!%*Uy7i0dzT+ne:|﷔bY !uk8 bH*TI+'D?2HGQ+y_R;$b| -%B9Ÿ PG6Wz~U4Qkax#wB7!93ic8cś+ #H'#~ a2}Aq{Qx!юoq,P-RH?jmd~*t&cb~04qצ.M•~0FD)l؞ҐD:C*>+%fc@;씽ʮBx^a o_0pX$q<0#͔q_6wE$yrZWކcLk7&sw^BwjR!dD?TvEmWǬS;@ۢJcyBM>B)Dj ?KK/"k\ &bsI$!D:|v1,ɮt'x]ũ7}b\? <ҫ[-Z$t(`_}MgT.f9SKP$ ԻLI2)jJ7zr*>^K:JѕC'8/7[]ïfp^_ k*pn!)34{5i2l0`v?6^t TV%T4 ioKj>폧cepwVzGh=0'hMj_=K@%]6kGp~F$WI0DA &gK}VkO" f ʩ\&؞!O%f^{E5 .eSN܄k0u2>|X0ʝdf18H"jOP0e%^[Vv]o]R!a޿6/{6Pv@Db*]u Z'XUx$leO<8p2:|,c>a?v^3a$Hd! 6}nЁԉ}5xP{צ Z\ *:.J\ERk!._Ӊ*aY0'bO(j,Zϖ] oO2*|n^Xҫg;h3}B *:!^PGDz(W C+Mb܌m}QUU]1X_3ԆL+=vjgƥ@yݞ!$7 'Iܕ ~n!0%3YC[.b' JL)05J-%QHF,~_@Y{c"v 5PEo*LqK@?^ӇZ WoGW&S?҄&mߏZ| cwQ6%-ѹV3c$C!4ƈZcBHpfUQ҇WB::.ֲ:J{œ p*f/5hRNi-M{8C7ivK#9.ӝU&q@E)j!; OfPpp x=]dlв3gU ݡ{IvqcDIX=(|*'V+ ,lqIyۯnfā<7"|I} 2̥[GȻ)IX^Qj9Fq/QhO{X]7{2 ;)ᶮZshgguD;0Ԣg7~ke=YdϾv eF=&IA%+|>6dS˥x4ʀ\&\r`7oLY"rǬ.9f fj/֞c;WE$crkJˬ`'d3I[" _zI6;{IopU΀+n͐D*#! XcFH)u=IhuF19Cn(Ds\l{b|-OJ%\Ru L@;>ܓ} m4X LdjodFT%<7 ߯?&϶@\)GmY_Z$L;a i7;EiDV8LI,*e"-dGu0Q!㆐!3ɢR?$;gE(Z6wBٵp"p3+Dfjn/9sT59>f7VEDWLn}- ߋt=G_XuKT#2- t۳6a4Ͱt09IxNއuf/iVatEɖhϏ@6i}iɼx&X\2gUyjƄH U엮ڽ kC3cj"8ў0ب}Hf_?F\^*NSQz4FS,*O1oQu]QonL1ؿ*e t֖+4y̠q^ -to˜:"WԳm[d-lYMPL *QVz 3u+Qb(&LzAƖ5gXurO7A"cTh2ZO^o<̟\2(} ґrk5A{"6tb>!Y.o?8o#ű|ۡ@h@nEMBfC bj! d1Z%/sDd @1R⫣rĚᛤ ~6 ~;|{MC8[P^&+sQq"ꕐ"uڄP;,$A"읛}gZBJw-ZW+gTYz[R:SZ )k9(Vs:âѸ|x[nȜyL6$l%W4*7y _sT昔ȕȈo9'idd3f\^*3RpwAj,15R^Su)fu]B_@G?ʉzq|wK ATZJj,#T?%1qSH4Y-ܾdN}Yk|}=ų1E>7o&Ji’r1p}oW?+/*^pU"%IIh!v_3L~rؼ_ zcW T? HH!psOI0Nk> v9.MQ\BΰI\1"&q )ami6l9"se 5I2G 0J̾5Al2@<;. 4;2/]#KRRK }V_y,|{KWѵgW_piꕋ46͇Ruֿ*1엷&9z AƓim7 YpxB9emLx9+e9r4A.xRMPt*i`wa1Hd ;$K`+V>(}>D(; R>Y4A/8UNVˡ|IrLıI0WIIqla,nXT>~sAnKԴG>ۦelrs$Rpejڌ:Ďt_3mN6uk)#~t<<̒ҝ7 )X7^xuhbdTc=^62/cNXa"0yD{X[#D7GL`j*wfjC97@v-kؕ^ps'E7vT&X-w)tm#η^.AYy8s\lCtjs8s qQ7 r^)$EZ}g0%De_\6 Q>(U%:B>ϒS0\$zl8$6H#K@Z^BٿQg9wы~9 QuŻҏ)3`+RD&e_bαk>3zD1x٨:&5/KmLAْwmP*OxI|܄\ei6% BTJ&(%/ {d?-biJTaj sAc<}k GOnv)K!eؗ SSh.z~lR5:+sN4k|'^DsOګcOa8/zIig/=ѣ&}k4h%Dv`(E̛*ׯimKC!&m/GZrٹJH'kƧ'AQP J@vMlWU 4i;PYOnU$iLȉ//hhe:#lb-!|H{qC#8jAFlv# [3;0t&Hm&e(j(D؍y(R(}64wT= PNa@]׭X;-6c+6Yz**tAy Tt+{t'[G^s~DDu闕|cv%K%Vpϳ{YGe_kzlݦ|=|dd<5|Ve :'$H3L|5F=;7V3Es Q[PmroH;Y#~i2K\ubl7V@k} u:gQJ#lo> q6h㱤 8JӼ2LaG%GDv$u]AsD1B4aQ$"8>. –z UNNbə~^NL"ƣK/_P Cu(w"@߁=W_n_f Du1!(dx9_r$_mDk90z |fDU{Wf+HXf \rh4K( Q]/!lU-(uÔ2nB!3D40r4a!yc!3W>9xz@+LH_# `&[)7 񖲂Ժqazl]0etRp|Kc ǚL;_>Zy \: }yHQgB(Ιғ HUT{ꉑ j(r)K17QԈJ+TBl"EHgij=^4rW;J%e]@6}ӺHy_k$aCR}ŀ.4@ '{.k }N`ɯ njv8InڥtМ.=xV6o:BْlmL=FyՂG<ܼOBC}xU2K3HәsE{OAs4P.i.B~ R3hر\:8ӼL ^)dKg"r;g[C9ϤЫqǿqWɆH I[f,P-4T05JH7'`0h+)X%ƈp#1l[gJdY>v1A- E+q}.noxl3%vƈJ3bJ+!\5ȋ|:sπmrH wUW1piLqs#dţ.gH~l_񭽏HLT{.&Z_jo$nDE'U `t׷uYK T@ 6GZA.ՆɃ/0MMɸ3制 V.'bbr%U'+K ڦ+"`CaDRCM0QL(,EOY|4U_Jn@!/! 'zLAU 4K xވyiPȽ_C+4k0f6#xZU?\$XҠQ 0Hq,M.34AGdJBQ\@HCC5-&yݞDES%3dV& sw4۔ ܟxϫ[CydKќD`>28hV&5hL5)yVE#g $#; 3m@ؼƤX)R2Y`.J Y?)$4)jT*LNfM/8z KK0:voU](3#{Zydu`T.긦.U4/d XfoqZqMi$^2aOfqJn Hݐ(έj ?š-k/Z&.?c ?E7cK~Av L_Ue[xG ?+QXIuon~~t x`mKdmjQz/ecXS;jB$&磠"ia'^谸dkA?]7hȁ9>7aGWa/^g@aЇ_:tgŵh25J6X|A?߽J a'gvhH o zOMR!,A<:@L̺ƥ@S/kz@hgcUOr mjDFu;/t㜋-n6vT(֞7)Z@^/JxV)DPlY1pd B4=îAǔp "n45Xx|p>g=  uqb]El 5$08Nه* ׻6^͟*4 sz`:+?aq|.znt  כɀS W-9Ԥd߾}c" ;͞ΞE0$!h$z.5E;&eā]_X[Ȧ_Sf#]< Ew%4B"Ir¢+ `]f:I|e"9KGثLw\iADT{>1"þ#b7166wAHOKx4,᠌8Є^%#Ҟ`F.Awn5*=G^0E.f; u7Q5f$+Al{HU>~e[JEB,?:_q۟5RE8PV tǧ:$3RULBD',' ]NAALc0KL㺟)ye`u*gu,-p% r9 F#JJX*:8tafӣ}fV L؈%ERƎ|QRGUD}@nnjN*vY}DŽ3r-sdBLz` .;{ m;JZg~|`CF~2Eeiڻ&~L]3 0 %H3rt!oG5$ZP)YyESOrU;]}Z/Vhq_lch]@4D=0S|[֛'eVۺ87NAB$tΚUKYFnFl&kyj;FޑQ9=DAXQRD6S riK"-b vj?(i-zưw K?[W#A}yHI#"xŴ++LDn}-kN,Gt^&u"9E`S5IlɊDM6`(dk4B'3mRsD; fl%d LDXMx̮۠$]L" / ˡk=3opDc l7=7[2g(M#{,e%A%P*׺HkK|#Q>Uh:wipA/>H~ SmUQş*Aԧog3#/.U//rYp^"(ŧc{ñܹnJ-qӔ'[鮹{_ZtC ^jV6j+BjSP [$=T`B\Uh|Ǒ?A[ݾS)vMNvAv0X#F(@1m ba_`GZºl)ATp-ɬpa8ɺ&d. { dr|6\x9 #YfZ,vS<'08ksh>ؓݰ  hV p\|0 Fy"\j@aZsS?M"n 8>jS(1[V~pxMyO@̵r"mPSKvgǖӍyDVq3ͱ`r4ǥ^mTş b7[Aef ~ .RTg#=`6MwSoePm=ݚbJ{=|[CDWwXg2WPG t*;x& H64v}!@- d _mQnYwgF;<ANf@=ćt XEoeFya`]p^wXLɀ@dͦr8 gW55!X0; T,-0qo[O D}BDFRݦwT iUp|Muل).ޱ#>k؇O}NM8uyCִl?WHP%(\` TG;o<ĹzcO#mHI!'ŖDi<FC.y jB2065~Ch 5㾶e1Sg *CzBxO|<.u؁ZnH!/7)OgD{Ҟx$FBwxO}=~̥_[C ^F(G"<ҳ(#4(T6ڋhiW kG UAޘL44U862C tQzC1 $q;KnMk.v& {ةz) tdrƉtkiK "h Ab3C{@Uyǥ {d(;ZH? 8 ]ܓ`7Xr[ ;IZ|S$Q1U{N#$0\b7 Fѱ [3PnGJ\+qvN~ڭ 3-$e@-А$JTԕ='¢37",qd4Y5d#dzZ81/բkwk-ean~Fmtn)<1?bg xCJ`PL4zEҶi .BL1rOh0*YZbCO]G2H 6pOǂ/ X|r&6c/栺˫űhjzVGR֛]=}e0#ACV azc@S#Q/o [Mc(Jk49zVgdWh>M{y`kAkżuSyC-YVIa4Lo6+  W%$l&>e>t5uə \ /' fqw!'_nYp7ñ>[SI&t˸Q'dՇ]I; YSugI q| W&)nPvx8)_ JAQzaڑ$a`K'9NRC(σz HǕwę) c[x74ׯX۠LzzsX:|MYvo^)LttvٖM^Zn퓩W#lst0<(@(k o_֭=kޥuo(^%"ŨuT2YQE`t(ITM5,Qrȣj{r=DžħXPHWkR2_.A#} @*=cCtUS(>*,%)  N{5:DY;\,C=lQllkOg Q_7f{DoGqQ:$oV EHfqx c[ӑjc ]ˏb)w9 %Ԁ} 1ONӷbncMlQ#F~KsYdDFfi`x0 R:8$ #O`v?#xwIvV 6秽0o3^Zom/ٙyd mj}t~`ݹIBS!(!4a%`gkَQ=!Aw4:U Q6C5b?3,fJoC ʰU0I=hnIE=ܗ?`S}z=^8%XOqqٗ,jRrjp22u vnNI'\G{9O~Q'X*Sp|J +~TMpYNGiȕɄ֯nsleB?3H)= $QQWR:($O!*q&|7{IZ5貮˿-$ܸ(]jDڐ?vR3F$qPzxhC?YF)p6)4BJ=}%@B cA2jmo$iG@sr蘋 ҿPS@ܵgB:JTRP<h Fx SYJ `*?氞8C$3ժ,k3e'EHqVJGΙ R"ݲS /o$Y|,{ƠؿZO ߿ZM3\cA,>Њ-) wON*`$Q;.tvd)wb0\WZ>mRUwn-*' )⭇2~ 6';Bi+{|5QlWo\p>sT xD?V.#E$-Uy!Ȟ<_MlY^ O YYdz`y=zNӝf ~bw `q9] Iع|}bЕ4IPr I9I-9zM^1˿bƺ_z __J[AJ DP E9 D؂ o%o1L{/sa.1#B~Kqoa Y0ѧ593Y@J2;t^ ӻM(GzZ#<@J : GTrl1 `+Wҟ3mTV;'`wt`̿jε6e40Z1x6-RXtºOrITf\0I&`Y#CSarui[kbN]O !v5ȿVdJ\/u:.'Ri-8޶d؟Bhٍ/Mo,1OemݷPU炻'S"4EolѱqUL!WDmsM84ߓd5ʏ#>("Xr7nNQko2߫L#B,Ҋ Qo6=؜mņСF)0 dqJ5 y/_6::y M;s|a}<P??9XMPT.uU𤈺 9.?M|i@| r5ȉ$ǧk,{5GAZ1/tU_J3Gs$F̿F{>D 8%%(h7nU<;=ClbjY7ݕee̞ ]hg|A64O"_Ye|#䈴 ױPNI3ԗ20@Mti ӄfdW8dF5R01|P+XLO%R }2!VJMNoVO7!2z}'YY ,7X|uxi #yRU¦Q6ZW(؃-v=!W.1- Pab,|l#@Nm>⒒ b rQbABӆbCU/f Q۾z)X-)~8k+3I2=.]e7E:r1lT]$S '[̙<Z"%mܘ]}%̓"6<y]+ y/xm҃P~H ؕ"jى|iO7tn rCR.0pI:{(@5(!;lhl&Κ(.6oڬn<_%}4W$؀R@޼WU*;߸i.~RAIOpytտu⷇zWyW}+Y-AQ͗5:Q4

h Tv)FF0 2#z)66|u~L9jmE'uLYlR  Ѻ6\CGz5Ŝf̋Pܤ⊌eo SnkFH8 ]VҡSWj# Tcl: ᳤Xf؎W㮪 :j1R鼿FO[%FڶWRZ-yOw.!BpGǪSao&L 85tOeSroGKʀ|0ܧPj)|7dSǥND+><Ɠ:Ԛp+b".!ʾE;٭0v[k1e3SGeHa?YK+*ʿ|!`N(cUs.yUד=>{l>.`8!&ZG Ŀr8IM|&M§] KZFjvj<=Ɣdcr"q.Ye 85i=⛼KJՑAF(Ǣ9݅|UC(|0 ?v== eugٝrw=GN2ug%"֗@ Bj;&47a$,zyH1AB9 4vxs'3M~vIy3e!wZŴ&a[#ww1ogͻB[@_־ڣ*UO\nPkR &Ҿm ! ƒJu 0ҝ{ZT 0Ok$̣ k]w: u<04tQ** b%P[ jiʓY4A*)`a;jdñr@ hJ=~)! $.d?d~Q CMA8ZjQ_^aywczFhC/x?ܡ32&h[`La`ʪ:p* ,2&̫wG8P: a:vue.+#AɁa (tj3\WmD?Uۅw"J]9 &YW03XgI&)c+nFQCO@ԋgxgXM468 sSeC@6һ݂k._R4iҬd {L:'PCE*V-1*S@b/6wkb`Nf~È\ inzò)3@]Q#a)\ؔ^˚W,OhGvKWں9θpY bw:=ݥj#`uBI5TGgNf?θ/e( .:_2Id: /ƫ: *k1#b_ g0Z=vAPgy K'zP$(JV Ze#WQnֺO/V^;\HsZQX^agYH*Pf5g;~. wp1Dy2&1Z#Uqᇂ;Ă_a JEjr`uq}!bPʮo^p,ۤ th}'AzTCRf`„͟xL(օ;~H+lX+H^8Os'4XoͶM)C1 씜b W^yI/rXScQ)\`יwrj-S]RWu #nså Z;mS[2WEY-Nqr@{vs D>}\|uVSf%3<;b=wEIѿ}7ɨ!{j1| r& XFwtbt+a /O%XA\R/i]4s]K6ZzYU3lGzƣ&=EAGHq{EU,~YZjd䆜57JuL5RDҟ[Eq}E?mBFẲX]l7-djM}L+6lM{!y5ؑ5Jb-<}6qt,-F ā,Qy%ЪطE]xJv<"-]KpEqݮ]:&J0L`˞GU ]ʥ|j^R52,pb޶@ýRHrg $ DC{x)-P1aROYSa0;|b'G{3+nU>Zj`ps?㲪E<$oԆByZWg-kbX>&V":0tIBr,vD36)ţfFu{co,9? q|oʕ?C+5^8ptL Tngcl[)};Mdd1\^PESqeOd`Rv.gq(3$ۏLt"oS8ehRC_i&kJxgamVN{CV˦{ ~Y.Oo-!.]<l nB79Ȧevq󃭆jGuo߸QOX5=_%~C LdaMª|9 lfЌ Bh{YMwr=ً݆.Y0OT8Zԋ H;IG,*`^ҀT#>e$CtnLPi'VSj{![ V@s Hdn|Q-V~wqEWY|z:;ـ.f˪y%S#2ǐLP }<3@dkwv:ѱE$%vHsNtj;=T  ;aK=Vonql\OLvTm$THjN}UJko*ƷNA4M݉+Cy´:[Oan.sJœYn$s »6 W/b>K5r Zd)5R΢*Lw5kVlV&0E)^cb<3#nG]Kye8,*=G^9 o Q2 _5# 3Qec)ZLN4b_KE֔>uUfk5.%P 19hBy"w-_a¥R#ۓT~^]/tV?O|oT>OWѨFB̭% E@$Ӥx Sqoh&XX.C)8%5\{W9a:He{v:"a҈:;EK9 THUE|هi U(鞁(.`Hi_ԓb)Nc[El5B@6eDaI59~}own8HBƹ&%3!u&nDy5 6Ek!! ; ˇwe q]KHY-ҘFp16dWX$r/GFŰ"02_,3Ktm7N oH%+хt'\E U Vx.eߕ^lְ,&.m# Uj\| Y߸ }w7fĬ)cD;ctGAzfSwBP/ b]`j+va+Ks1郂i'YlyԾ3=+? ^igzolˋEFJ6#)(bqOm(%V #I^ cJ R~lQ^q8`ƹ[65V16zDZ+o-YC08I|EE$+x['cRٶ-νCbh?E*LvPucW]EG.S(@)Lsv4Xa|pG"j9.CCٺ6"#TY9+38 vң'~(DZ;oķ=eV^($~^v2~Z)rG 0#[p:~xNOGc@Dž\qяp<ˌM' ̻K퇶c!\%4jݼ&Ld(>F.J`OCH65X~O"O1} *N>#R'al`O5KIXU9HbՂlY n >ӋbӒP\ n.Hc7 NԢUrMEK=%dtBwZ-[ca7fơ,c̑eu!Pf_zըP;.dTQ.5Uqɶ \N] RYM]A1in^ jtv<Ѱp YBB(&oZ.)*.A*KgQCa% yl{tn$JQm2] n3Duy VG6u|h6wGش"QYkNȸ]tNL=; 4 4Y𑴋d`7vRKຨ#ĕMc,.)OD9 ,ZLL9n=kΎڄ,Hx"ACSEQʠ灇*vhY2!Sշ] 1k `?!BQ,Lbvprd* Z@^%3DxTr'Q^yԔ^pMŇ)֓ /m'*~oLl-7pFxL):r1OOVtFc9e(c£8ܠll%8#E,m#Xݏc^Lz۵;_q+HO0zjޘ y~7W7 +!MoLjzB'ӝD+ZRy񙙠`k .2,!QiE y[iBCǓұLuB~aw:{b|ue(m2RmTcE һU<| JPRJ*M ZSs:yJXXCGL):/?DwRΏL]φTv/R[gف 2 uጲ`SiĶ(>qH7r\#Y$hYX:Qmhsž딖"L*G}̄?$M:݁qU8+N *3ځS%< 'a=B(ȓUbR_-AmS9,0>M;tQ?\Y1,;s" YB]A~I4l-u>- U'):j\ƐsEFeɯbd`i  $JB~1soN/bվa AFGzե({H`2!n_ d׸f9|4ȗ)mѻ)A*V0E-i;kc2*!;q$j}}WW40vXԭqG;i~ܻ˥Vq1:shi[ IP/$z4p ŗRYs i-䂲NHl||`|g=[[%\ƕCSnA-m7h51*%sH+6Sכؕ"M>&W"drhK/š MS%7#3 d&&2oC}o2&c>  Xy;H| b`Ko\I*oC*B}Pr$޼U7µ\&IIWg/`yRSW(+C&vN`be*3XUz6gjfb0PT}ko|RݸEV跡RoolhV]$?UO\D]ܬW:xQO3>_'/lOlC~; 삋o6=7 !1Qs#'Ps2_K!|yPdN3X+{ .Vo{'d܆`;]q5`46 ?O!^r]ۙ`/ T\p蠘)ی'zD( LEA6oUiMT͋QJ̞LW/tZR}ş@aBz L5G8Tug(8{Z+_0hkZhe{rbT’.&S)7C2d=kHEg=8q6Iv|3D0鴲L;ҳ4aJvZf]h=fsAD"Jz]H% =#0P?@QxK> (GS$'e K&]'Jv.P3^^z%5eLnzT` =_跭<2F3¨xpVݞltÙG^>o.3͸>̂%E &4ʠ,P qB<y3}[H_]f\d 4L6 iDPObA0De]b^M}f^px/r͑ "Qw'd~?QUFW+g[y㲪mK\MBzfv_6Q$Q<xśջ^ G~}ZS/5LtQ$'v"}8ѕfmt1eSDh&,!ur/U];1M`ӻt|Ls"nt|, MRҗܻ$jKU=k5fKe.X𔄖 !QuИ|jH}-.>SW!ޠ4H_QgT=k/~*ح`rۛ 8s :DZE\'!n;Ye6uNEvp@%a6[> ^Rg(%rE) Z B;P{Mv` #Hm4kqKfG+`ڸ]?I6x[<sIh`v'<'se 4ru{dΕlb9hꢭACAԔ(ѶҎ%\իMp1\-Xp஖E}e_lmPWCd $TaT9BM08LxZ 3 j S"ŲsoV46RZJKwcvrN9ބYQ*3) ^{ e~k}r-">)wbq5:ƧءD#_\곂+C@K9vAG"[~Gd֐;V\-9Q{9nm{ҟ3Hca[Ņvy[Z>+k&2QCb@Ar]y9n{krV@BT1ut$'gGHQkW|%aSUϒ.դ+C'eJpIV{z3YV{-O$u`JB=q^pGp /ԃ}uؠ!FQV("3ϯœPm eYx68xL;GY3'z,뷉D4!w -Cި6ki'}J5jr,;eY.Vl K}>{I"_Yff/nC|i~|lg`hoO0֛|+өWr( `493#jj*גsJ *ԡ荹N\v|aSkCNzF% 9$5 L7@ݓsٯ-B`EیA@ -ʙx~#ӎu䇦EDg}m|-NXסhHs]`V8K*nef1-V5 [a,.fOKnRߙ7ן9A c&zr2PU[ٰ;k eN aQdYi94zuD=pdi}f(Q']6XZ>}x}S x|1 9H PF r109H%ՔD ݵ`Y"uo’lE|c j&okuoZjW#JgX4lmYbak[<S83cB"F6-crw9ƛWa5M?ryLqIDkpҹTI hӻRU1`Ra_'\ukRO ).7o 'EW& NdjuNuZ6b9}/%ANq+E-Ж8Y,A*]pf?ħFdu@?%#u8qk8IϋwSQcnB3ǔBq `+c8d@*\1?G_AI ]1H]2kΣ#dG'ƘB#u }jPNGYk V2s`% 4*Ual\wJ"|`4*6Ab>zQVr \4)1Tg8.y( Cw2- O SC%rG$4S=HX- Q.I8j{_ 0Ao)N> w(.g )OȸW2\PuLj] -[~T^|ӣ Y,`)jY! , Ս'䀶5XqzDpDOZ 睌 .C1 'QwaRrOPh5"J{5p?`F䟯Y% l6iѮZ~.<8n{@; b,/ӠpRLD~R{d%L/-/O˥f}f:pCBv#4i[ gp@M^lEߩI )~]he^cg\lfӹeN߈(jSIr#|9)v;]āOL3#+%Taf?Tu,|I拇@- 1d^^fs#F~\:9NӵM)Wз]y\ GY/ub]Rq=9qqe/ֿV@ՅOޡ"ϐ 9(* q!|NL)4O5uvbreZ0dŏVOh=*gѝBG"Ƌ&. [c=#!%뙌K\얚>P/S5`(\;a @_g*Ʈ$b Kr;MioJbRVpW؞=F #;?Ai.93dԷ#D{GiGc Ѕn[гe{߃@B-̴Tng083H|д,WIW Kft/DA8Q@HR ÀFFvzܺZje@ڹrci"|0{W n)i\zoj^H&qHJB'еK$ǀ|ѡ̦"!r(pD5;+>8&qP~$t R% n#k*'(GԽ& ?5.cmQ !-(/vFD 6Gպ QV"KNjn/הEfh%Wۦ:xpS$+_v~SʿttA `=ƛl1Bq){r_ZVI yxl($, ߺ ):_ .BP/d"]\ ջ5(@dG*<.$8òpN4$gG&{SоR@bA+~1tk4 ˓cM0aG(/ {3jf#pO:ZەX joZ*]4Z.Y(]cK,GL^v}3.^=(hN<{kJ8&aáj'c NJ3ԭϳLz 5(ٛ#0,[503)?\P*S1? SC'.0O$:Gp*,{:EҸ#rp'Ն Ńg{gALfwxy39-5KnͲB]\~cqdUGmto)ܗ%^Sj,Kȝ9K3p\qB/$3U)2mD=\[0"(!;mߘTp|i͹]<(i`_i1p[ZSMֈ"1Ouj}G5hs*ۀZpy0[cA2A VXdŸ|YksJk2XRSemhRj(K=$RٟH+ؼJ%8q)"rZ^2'%fL,hUEg|#PfhhZVPhܧMA=.Es Lޒ7u$Dv1tI8y#sUFl QamY6f3,Yq2vqZo#f;kjjTe"NE6!F3K>Ǔw女TkJw ̒ E5 lq\᠄:#7(ꤽwPJl~$~IU?`٬yE>}%,hgJ}:6 ;AuQ2(`G&}bymlG} "au>ӱ̴5{RX $('i0`YL9ߧ_zVL_,2xe=WuUGo?k`"03JoPK _Oƞ9_ U9][:zؠ??+RMdXJ#/5ӻ_6ߖ,ra=L#^ +dx1}<Ā-I/C[oVh,xu$bH 'MSKz_A38 &r+&-S^bWh3Kx#CLlaqAľ " gG `ˎCc9'|-pOsA;)^D`axto~, Wa-qJG4_o>GF˰y2UIx-ʉkS8X +dM f5ہ:rUᮡ iKҸ{?t|ņDS`ђGWhmąsc(6jnC)K;mKVhC`AU.JƓ*<&̲z.F4.9&WCx1<&:*/hc'x{J™0ZP=(ͬE^t$vsPoU%R{8Pg .dݵA@~;^ Mx ء÷vW"MFgyRt3^"N*]v+2$VsP6X"*4IF0ߞginN&fCLv.̻fRvݓ3NW|@ ڪ- "V٘ž./`\W O>7MQMX#N|{uJ?-!܈ѭ2ٸg $|pNy c ^ny0U~?2% PɚX>H8+ Di4^U qxatǺ8bF0d8yxVYYe8zĝ)= hGlUjh p9bA)]5O:P;XxL5,ZAa.h,$rNi>$ȈmfˍAŚ%0/.HSDmd?Q(zxf l}w%&.1~dr7xM +XhZ̻C>$넱ap.6-#i@}8nV/L΄K%ߙ-v+ meZ4Saa}!_{721v$k@.j4[1&J,.-}>p+Ve8լfBtY^! \.RN]4 [NK" Z15II)6ʑ7~O_9vXn3)d.J4lܟ[bH ,Z*ZJ"&~#YE4{g<cGbyN[i8E%.]rvdu8s4rkx80qy 3[7z9ev|5TRNmIRiQU@)KwԬ׈zf4TVMO&&FYV"4n!.GPм#U]7~V YAG,"`{YV.I1~q3Urk0X"b[iIɛ7@5~T)"vAMvՠ81e]pXLkޭ]WrWW,!}QL.w, gރt>[z+ TYcZ>d4StԖ5qY~Z)E?/JG4@٦[96 3Z99GС?L g)-g4cX6+_N /t9 p\c›3-64%1#}D]XCEw oY8'S5 a#b㕃+#j%h," l?tIS=IBrdD;pO8]q FI9挦t "Kb6PꨙɃCs[U8ZO ppMؘ{2 5uu?ÕBvlɃd[^e<]^d,!BTryYَVj d7ըI&}xW-cE\؟WL4Bː,آ/Dmr(P~~`ZNֹ;M8dsS myJLU BSA4}g)#^{U\QP~yQEg?*G.2}-m$)/3䭓/>W={T$;bdUJ46&{i ve(Co|14N5?A6+VaL(Ķ w3K4NCB](fYc9i?̔O;]d#1*W^?Iw+}hák6恋M^!pWk8)1C}fxQzSEJYd :bos7śSni?hdӠ}6j)aڍE_d眊R1:^y{SCZI5ζDou@]]Pd1G0e}FINE"=:8 kd7J%&TNڔ2`Jo1vG|Mj/byOYj4rM0gK=NoYIQ'Ʋ13>뻅*cg%oe8Z91Wo, sd=/)h>?.dPK̎[+=n+rd#3zRwDđ步.ԼCtсuEX9NӞ,# ȓD XʉQO]V>MfH:_^m#j; ޷#,C"u)M_Ӽi4ȶf^.դcF ZꈛϮz"}^І޽C@N{*GG3뺇/^F1ypp-t~-CҮiTj^(Xdxӯi R7lw(v&>6~ΦR_Co} :q4~oև,\S+^ srhFg&)X7jG{ j%#ATɪq|!5;VݷlmLdw#(ᄇVֈ-2 PO/|\4%?B&vz *e,L~51\ t=/ u뉵ZL)p!:FD|4BFa|5=4y7]FP F@Dt$zchjG~pR͹0)ep ^i@4Ve5$Ц*ղgnbJc|ΨE߃MGY'FW(ePQqr89b}v[x zizK_rMu6+Xj9K5n=`nZM3 x|wM//F@nx\~4n-7,zg&)SkCtBc0mqVƫ1 U۽ZN`=vX6Es'>6yR y[o5" TNj+bc F# RHFcReG~K0TΞ$o'궝l) v3&|@&vPq?n VZ2>TuGIR2 NVp>9;|cVWG N5Wl{Vrn XnCt #YlMr ˿OnC^+l[u̓Y&&!q 7I *< 5N m[ GյwwO$Y!Cz :UY5X!Ӗ7Ԏ/ZYM[PQwX4k>BX7,vܢiy_Rcy%4rsv|+vzf3K{Zf X4AKՀGCP|pP 0#3/ eY ~\si-*b cB UAbgzs5xDUY0eVQw=) !LYlU'!LKAWŧ!ZJien8نyxó3˜0/ *\"ŻWCApbяtOAv=KM%^S-ňi[D懪59izd*,`^m"ܞiAa!l~o3]+8#D.pǁ9ZD^?My rՒezm -U7a޽aJHwB[T*T .č=xu^trqa_G}JSBMFPFr w'?}@Y&8Xd`F9:D \f\~OhpqN@*gQvh#qvs- gطi jvR"K/tm47uW<$} [y>/PWi,Gфphyьk{.0}СxQTbDg% u$hQx*+ 8~rN I *0B~|C59⪽g~=XQe (I_1m5EtjmP˓ٽȅE ߆jo;}a"Hj]2oAT8ݓ7Չ|m g d^wohqp%6wMuq(T#1s%K^˼|DaBy)* u:HfbEz@w{O^/~Iisq ̼3z ٨*?/6 5DݦqHbA-S[K|yhRA@wHPDIRmm.rBk喗#xD\H9D +F Iwk[Miѧ!N9tKZ%~X4;)3 nܕ|')%4k.N-$u~')4|'-&g1Qꢭ'^WtB@X`'ӀU9,l%R U]`2 3y5yG8kig.(uX! UVPt5OֲA w_] |*xh\uS¤`^h\*ېNArhX߷Wet纮}3:m ?ݏxi(Qr ,s{Fu4)HLqy9?Prtll~v| {G+L>E~j5jZ/ xs>4`Etz}r;^T5s ib #|]lN35M85T xOO ̮肧92 ?1(MÊ@NF!֮8~XwP#HE9獃_I dQPʗ5)A~ @IѻjW˔zB{4#Y,'ԼP2 4"ALޱj% 1 =ա@`fQ'8tLgBH!<@&TG>ֱ2DŽm~Vw0u bBn ȍ#ܐ').G=4X:`iqdGҋ@uYU.!xnuVsO9<^א+$YlS!K0 N-ߋm Z3R`â0ǛQʍ6=u.aWB u_aNrW p9x3y=59Ӓ?TtHqG o2weR<5DysB?Kv] ï`;0Mt_W|ʘ<ўv_ /@<},H.sL;eP&2ӯ3^n 3z5gqTKgF |s9k஬$e@/!.9f˶ KC1D$SQLOFl3 |ȥYȪ,*%w70xWLihOWF|$1P,wP)d>N̫ʮL4~Ƶ}|2R9!Y-V FhΦ!Օ4KZ *,Vy~;t lHNF= ^,Di8cTW:ſ d/6|L4F&C/\7hϣ|3Pr0&}-vzLMjԆmf`I_KAdCx)O52 {]<>wS Œ^s($%k;0^}޿S:n4 :Z%xԉJ jZ.2+ VBxgL%D>ﬓ^ruДm$s l١(,r2F[k xMoA}ad]*tCc@UAfdݻ) W* h&%Px85/ ˠ|υԌ2JԙC_[*L-2+ȑUS,H/`oiC:ia>!nhLRU.oq}ǀ L0E %pzܑj[FMub;TG 5>+u8D,+딇qa 4|: 4ν=4WzJC2Ξ"b"Gq Y)X|.~NvqjB~o뻥#IS-+ :c#hZGϷ r- nx !>]zh9o.eFD0a;5 ~[FtHG mC3z4`svSv[KE7?8670cȌ"1RfJ^ץУ )tWAQa|Ԧwk;pе9f5ؘIuMcwZs]u0v^͠X&-xQb=3 Wfq0;å|ܦ Dm wD'kkk.'#U$fT!k:$JlMޣ pab'qO)4X8cxA0jF M /Y l&5Yό0 *`DqL;˿9JKfη׊ٖκv=OwD֦vg)!g dk뎣 hDAl!SNH026T>x$Nۣ :YXH Qݿv?j,8Bֶ5V5ѨY")aS=,EIl.Mk0x)\z~JGpV1 -63 j94׫iu:ĵ ŮF*tW`$5_ՄJt9&c'{꿠H*?"f! '-%P}*qQ,.>6>rDnO⚨q* c=G]1%9> 2PW0\*9.onAY 4o\W%Φx"ٻlHJ?sK@U<Rc{y+LkĐ{i()»Q ˑ-AiE^Y6ڍ);KlL+ݞ+p>=veUǍ !c|Gq_[q a~_iٷZKK˱o^#![dܓ()j=-Py˩=X>LBFkʝEOÁo' åL zLpTzu̲]`&0Q3yei{7\*quZd˳mT QEz^Ɍ㡍gw*:cBU4^}#VLWǨ&TbeY5"?'J˴63 ߹;}*mMU$nC1Ifrr%o)as}U0-Mݑ?%Lyx. .' /- e^ mKžA 8Q09 ֈ e>sE$.{$1"pV4ʠǺ6sr=F*lyCp֤t9؂-y|D5L=h,`5>Ӓ#8QOA4[2An5Kg; *BA<*ݰ}+c(pT,fuIg}>ޙQx71 Zs[a#5rG#{]s!KU-VP~S?0״ɥsky)ش7OJHc5r`N­-mAy\pw!@Un_^ KDNQ%V6$hve+?THo3qySxFx*|)aٍH9ػP1EפH<7͞]MjDfJ p\&@v)y4eƟqSlzu,iޢ $}۹} s{H#^B;75.c/dvKNӋ0#NdU T U\߇GɘM!O= 0@7]a ~E40eEQ҉soʱ=e3@ߔPL@%i98Z2V%FE9,f}7ܠɾgOt崦vLU,SNeSdy/'q_3p̮@.2b*uË3h L\\|;wݵ?u9wT-BxY?63 t#@"K_ S򶊘'j( NGLYJǣf;\<i,} [=PjL슫3I`3uNS8Հb%9 DYT-q*"<,%CL1z=J7wiQϠNCXaPܭ|D/Ms>[cv^jpJGVi+fXkUfho61LNkV@ g-f%S$PEi@o0:p?aGCa+Ƣ2Љ$5yz VC*=?\WSW&RXTӢCq`o'}8/=҉?~43XܓmZy  J KcB gI@~~k;+6PeayOD]Ёe98fƌ5伌y n yF%յ^;6 i_O]I̖vuCsrXo4=Or촺U&LQb2@r U5|?ɫ!$l-hJq/ 42ZਈyA0pV{)F-dgN OsCr ^yi^ڄP Cfső MfDhI,6,mf NM\'q/0BnshH# +e!Ӧ(4y~}%8Ū*_ѩE8_8`E0A0~\VcPL ITXxG}J W>B8\viDZΖc4#ٱb*AQ=$i\Qx3|p_@ 8:Cnᇞ$9p詗檬` 74 o[ ryO7,]؉yNtogXR(3rϫ 747@/m&Lߨ`BӻQ+kWB86^X 嵷Y&@E+;]q[#he- VsuQP؏8A[:2Qk-zRfuɜ{Nj {&G %@J-hPlt 4F'QgyJKo؛7G6uNS4)yX|x;f'MT~GB_ANht"+IZ]c4< PC'Vq!V#{]UMҕ̏C0pXy_$fE!V%; =>VнxpgMNP N͐Tݽ6*$1eE)& zqv?qSJK`8-.}bdTIiHl5 CZl1Q4ō5_(?|ߣ f a)fjB'?ױTqLFdԻhSЖ(.:έlb<,na_C,Ċ231ǫB"'YSSΑLGSrZx+FV`ӕ1Fs;2#ރHiͣW:ǶOJQ7r,~(2N xi32VmZEl๭Lu`|sL #QuK 8 87^5E-mBl$;Pyռ94i\ϟOW/L-] k Cb:@A()⣕PDP-FbOpGp [, #^2Y zRlZن!phZ#1+(r/ZYWcŅK<9RDVkZSAk{ FW ˨!ˊ<ˠ; 0.+h@"5,Zqw6u#o`7ha?rP|NeZTqk#żoa(,z9TA K܀S |gD7.)ŬKEs-r(eոٮlS{`&c㳊T.Gv"!Dky1Gu"$8b-rnWtY.5v fj/'4$( :>1\YE(RG &\w YWXbo(;g@ O6ᙁkّw r+Q UǢwZ= "m][vdS+b n*_t\u38(;kڑx^wvb>d4iu$eupyn!ΏRݣt{V¨Ρ`'^MXN1=fB׏!;yaذOoEISVN%xy{N]EHv4R m^0Ǚwi?-7xvC"PvcJD^yozrW<)[ C Lk%L*7(EtzQ1~N ~>;Lb9Cܣ},LHm#h K B} )o=85D ۮGph[fo^bG/e2E9}gR,Z$Һs~55lat#vt{(Ts/46 qw/|gz3*Nx ]/+haV̳jS5_8£ !;:ω;}?TԄE e߿$/=Ehi )j,laF߲Z0L%|^'?{AZrbS^@,\c1nƼsnl].vWnJr:J0,$٣[SqČEœV X&τw9PzbgD6N{:e" ^ n(jϬm3䤽*NM7sR3eyCvYN(M5"fzfI)7i|QHNPܩ!᤭Dr  u0*DMAvV]8T<#niO`vf g R:Ht ~ t3Y ws%՗SƦEkē Z ?P`F:73iô ZU/5Fbj&MLh}(I08*Lx`TvC=̈́&XM=$8/4*p B)o}m2@B 1dkV"p*BΫ_ݓƘAb\#胜j jq1rm|GzP ֥npyr90nڿ_d(վ Ѩok7h!)h're9&wi #mI^' m=mOm~lw56ȦUhc݅jf'[4o?yM>Kʼ{ mC;ۿl͸fT4 ؘӆwc %/ TFő-W;{\H" T\hϼM)fzf35[gdyGm^F`|Zʶ 5߀ Iaw;GX IJODRֽ)oYc\Boqp]Q&lƎCZ8GHhv=VkT`#8 Dei2R^?~}R g uQ‹ʆk"MePKtċNuAP9R}0kv֗YOsn>X~ƞt9 soRZϸX* DϕJLk=e*v;EТTcYÊ~?,chj|{5Yjp6P+Α\a &hz9X2d~Ƈ Bկt$M6_[G{]P'#fj%IOZ`o`Uqju4Ÿ~Vڻzւ߼n6NUl 1bQC۠C_ Ѫ-2e2<V=| v钁t8̊J$ΡvSղ`RGa >ϓZt|"ibhI[x M 5)(`d2,6&N a" @%>VfmUKl h},,uLڕ -Q\!rߠ❆QDLdϡeUL]X#5.#~{;w'.bWP7!!zQvY p<].1x]Nuv>})wu6DÍA-" 8,(/Ν*[D7`A!oΖ#)wA%RZ>7n</+-S mY{k4E5&O+$|Ib曀yd}噃KCʁ5[S;׈'?[tLdDps(ґ0:抉uQ?&S9dYfAp}:;N3{Pbx/z+ȷOl1*t` e6~Ut$Sі=QuiuĜauJ䤑+ ^xo#-iw'hjc/%sY LH yF rP壤 瑦o.VֻSE ' 8Zx;QN\Pa8;t]TA?bmg 짇t}/(-"Ɠ5_f l齡Jפ T2l|ZQS8`X{ep:h͈m~ f) 7R@72 N[L(Qc:C2q_w_Q<(p{LE4kҫHG7F>fhY*X`1<[>9[i?/و/8AȤ$/5y3"-0UaoT5?:@iV":6u*p.]GlAh Ql0FG냹#Gcm,L|`"qEńd/W {.W@ѿxi|,.BNXb,cYhSa Bz~ܧxW/[-Q`Xmc1ՇpbæJqLj|BOKa8ުlMjq$ЪU-z ]f>B%6s@DůmLኼ1̶E37akbB9?,5SQf!eFT5=ݍS$hIh[姌$L1lWX,iC隮cw=kr}zRf> r(v9iBlxPg T\CL؜(g92i@XDMHib`(yzhĬr! CAZH HFQ@z 2[)GCBldj%fܾa{: 1%e%^ȍ/IWYgE>zZ8!p5GTKcMa~~mފ n'7=-SBqN +8- ૉqwdj/L!GLw®.]yH2^5a4˿!u cksB{e30zhֹ.?520J*lֺ2lO63bmŵigwJmz&(cLf }kK#2_hZh$t.OR.L.p |I³ly_M z\L;wK]4Dv-MAj&0lb!3`kXV+Em`eQ%Y+Jl9i]{_Ųs f\ wy_޴'fIhΐ9$L/1[!-k[RHD]dPHz oA1@&."Ğ_a$4RpFQ"m 1dK*uG!M&Aa Mjfx*.kpz;S)I75A:T_<79JN]s _भ7=Җ62vW#_[t^]{LvmD*_u杋r.o9OJ#,OZ跮:,ꦭ$y">fG gzH5Oܠ^>C}b9ZƅAvZ!I{, v8ťÙ1lB ^غXS35g 3JK:/WyTDVo43HVݐɟ+ إGӁ,=cVȋ5;hO^ FvTl@ߪ 8fy'P6MBE>y.ca<-hVFj(MI,)evJL7" 3 Kad!A%BuL*~t}s:m%**?g$Fs3W$EbE@%aiwV,W8}|WJCLbOtӑ+mZ;9= B GD0QhR^pU "홷X8/@XxSCf JK|&as8>Wh\δ C;G ԏ;uz]:*/$)ݯ/Mr-6i6>re[t9 MݡIƏ`ָ<$^6۷EyrDL.J72vuwnp7.MD_دǒsνBEdƐaG, uUكRS%, k{Bn2dW="~3 o7%kѐW3Mr(0G8E}j|/a ؆RU;\ou췶(qXK^b>{NZ_'*Mf|plU ].{ oLaK D┩n|xƙUJ0dʯo8l^`Eωl-CBՓnlٕjW38j<N|6XynH$nzIT;ck3a)L]YI sk? "_tzeidNSec 7GL{wi (]p$lq֢W\i,xy*L&)oQIv\o:FvG2ϔšY4,= PD}9DwFF6m:oX6MEDD&BZ 7*JXޅ {gCcp +]12RB>4<77^e}ɲ^H#)>^E[p} Ҋam(CrZA1 CKKpffk;-l6N;)UH:-PFm>:g(wFSZeеֿ`̤nӐż23 <\<לPLM(#ѴÝQgl.5 p1)D 3M>y+RUL22|~{ʥT֨T}PHS {x(W>[.`WR2[Y2_* YSeD{x0(Om  q6@^?DO_e'=l f[ƥ؈1 ^]k:osUVKv @ix6M_ցtCZ0$rP,ZRˋJ:7`Hum$~:%0Pf} Գ]0]BL4uJJu$7N ;uTgbY-\ZG؂*:B @] !)]4E"Zvޱ'0Km+Amh{brʡji ,a1ZyѢM|tF4M !7!_qc@Ԡɍ'l&!gjM%aIps"t R>:@_8_QBi'/Z~98THiJՋ =|xjHcqPK?U&bn#]*S}hBC׷:ɑ :@>pyauF{դQֱd]eMǘ'M»Oi#db^RMEѶ˂Ղ۪7<$rd1zNg/ ʻ}FJL[Ò fw (㋰g阢k':'uX 7oADC&ϙ]‚`b hЧ̜juwOQT( )}tQ3jG)2&x~֙WfnG#lg/5%l`˶eSG?lR> ?fšx cm^z:܀d6K(I1ʋo !V ]82з=PSvӢ4>:}A!?T;G)M}lh"?t-X~J$zE!KOҮ{XGt7G[[gv!ӎҒO~"֞S5$=ktfP-HO*YqHyn:8&D"Qb㧨뷽ë\# Ɛx?boRh9W2um,Id@s)"{ @@>D s,>YhgB*5=i% @m$GnBqރTvʮzb=']` /L1xFx%| N=R43eʷS*gn>|z`ؙPj<5 Dcu@Dʘ4mma:+X{}x:W D>1#3)*lI`r]ңڟ*ꄬ5e )wpmb,Z;i͙ S!iȭ8>YhmVR}ބ/#4'Gl<9Oph9sy5z[&>WP'М~Hq D9!vJy.1.Rcc:):vM7ahDAXt4h0JIH6F`A44.,);4`YpkPr;l.#,B%Z͐cq3r0&rzZxu{WLtYHk'lK'Eᡙʥ_ ^`K$wdxMcna`$Decud3d`YO |0;-wQNҳAfM{F݆k#o|=@1K7h)`qtNl.[ +`ymˍ[0Dc>rTVP^ˌkHy5T Ǹ. Dv[ 0'E_l7RM)őK; 9Dٟ[gC6f$fpsw ݚZT1bnfDHߡ UQLs_lJ3k0ѐì|І[F^`V?!5Rl3f1M ʦPh )+NA%a2U"߱T#* G$mKZklXx2EdZ70Qɸ_o3^>7ܖ)jOWjdFJ҉{(.34Ю dh$2Qi,LUDCh~vԴlNnޞ$9j]LQ )Li.8rL*ж區aD0K+=GGRK)'=8ʆM4#P>0 A%q>8^`,V/Nt7a$ KR~eA|=8m_sM+cr/Db iΨYjlDOk3 d 2v~PkX3aZHw}F}HyO̵bO[~4w )n/l:|'^I,k-mƶRߠ.,rC=3Xx\ϐH^sG:0>' %1fYgqLSai2HM0#2eDd65z`Qsҋiww->r7!*f}iG<H[_ݜJ ѭH wNOׯ.O}03W֬4u#ʑt9>ihw˧c}' *{tՃsx c dGd AWle}VY"ˆs-*-ѫy0ysW$럂@!5OB4-PKD%XTWL WGoI_azfJrûi9S䥄]i܁K#Ck` 3'Q23@$袛N`~\!?V+D26 !brg8gWͳ1(*${ ɐ^Nӕoitu!i>zCCNK2'EU-cCǸItMmeul%}M~x ?t0^Eoܝ҇xn'&_m%sd΢+jk>^gȢ[ n㸭i߰(Be뫧 =eۦ!*B*[5u=_?.ڑ5srjA[PƤ#kmbچm@1m`; ƒ44׽_CyWgp]UZh~%M./NyK9WY" Yߑt,&o:&U ݈a M #ele4¯-0/.%DAe47^s{wP͟c^jr'NZ0ţZXs` &hwHQq7٢A; GjqU<~b"#U* sj<3j՚5ښީ~sC9zBz|$($Xdq;#@]'ǚ3/7{24L_REut +|$(3Zga&֊mgR}J5/p`Y^L H~Ȟz ccf7Хۀkǰ /D9~݀FהOAN ŸN0f ƁK\J$^>>@}L޸Pi2jb7|766,c2o ` hH4\k|R1S#*JAR_A2]sDRfĸRKhK/K|uOF ) cԠ9%?_-v3<+9Pys|V yyL" v=T8)$!P~6>(k^aDwn`;9g%4-KAw(P 0yȷi$Xa(4GK-Rq=4tP!u7+ v/ J9lYQ$85Tqvg5ysN&wsjC̯E_/(*T K/m {*l09z 7y4*!\cϲxwwݴx̓.*o]xjh th6>[YiK&U=/KwAX@MOE[Xñu0q&L[sBB*_]d 72Hj\*_ {M Oޝ gɭhC݇cpea/Yڱ7Qge. |λU 73;{lcxmY,(1qa爷wxRG?M03uQh}EF/G:w& M1p d#.k l&4ˉ>C> ^uGghx9["KeV,c Ĉ+<‰n$#] !%&VJ)rwQvN7f I>)b'~KX=޸ʹ){ym [6 g'$o tzч S Pgo=?BE dK:=80R˄ @JxeTL#pMK9!CX}᧷PVBn,; Na-;JjXM4ؖۦ_cާwy:WpHODH1Ī;btew#|t>s м>,עVi™\`P? #P|crp#P=FGc$WwcL/uIY<+2Nk XΎ$W×N>& &:7iZY0nPJ 7)+*OP^cz+`q| ]UEs+Xmz4#K!4X6=&pҫ:׽yb gUMBNy,بz*Pږg(ܜڣl,e6;#ӒUZk5:٣Ut%KڢQ˓[A־k%MfQR0)u۱Ūe CAS>HXdxxK"F]`@m5͋B#2i 2'Ik;d7m\EH./-ftĔΣC&}Lv/{4YU.ֱyŗZfO̡9sӊjd4elxbP #^դعpxSg6F9k8ð#"2pQݳa.׿-['̢Ivnޡ2v[ :H%I"\:0CLCą=l Ⱦz8 hZZ˦/As}P+>8Dҽ fר+g6g:7FhG1xtD{sԀx/eW=pXbxDCĴ]CjK=nGIJ,Vtu1dK# k=@?,)6Y v'䪝i\C9 W 3+E¬i%pڽ<9p<'_:>6}AFŒV<]m>d.XF]5%dA} Ś FAzh:4ư0 rDT|L3UFfn -p|_ZhJ]CftcW Тf|㣺j!=(ޅqjޖ"_`A=W-| Kt|)@Cl/9cDE*"ǩj49m4.TLHE o?@S sqpvB8$%UD ^B% $5׊沌 ָYÿBo(&ƖNEb.*A*Ctj!NRZ<8z<(ݪJ~A&%/rIpKNĭ9}nZH2I4Iy&Pdžދ#8noPaAM( NknҊQ WV5n ^ZKBv 5^΋bbT_ui2؊&K1J+aNdEc#5AZq_"o>zNE,&˒l]2P%Pg\ ?Uhx2!a.[^M%J0~ P~ͅeW'yh8+bpuީozCȘnJޕf>qrpQ5H!kel. Bde%ffb,_*Cjy: kfT>(Y}> "?$cjsP ~kp7=at%Jh(Sزk?L5^ L%t18P(1*@eϭp q<7Hvb~wEK)8R-#) )K~$ԁڼJAq:e ;^YgqV]2qpop]:I٫1SlJ`'f;jwJ6Y"~e^( \3 &xS yXV҈^D:6MLr(]5{+.Ϯ uWۅם(/\)=I^( 39'2 B!½GǮ*EՊ_^j9MPamؒ' \i.Nɟmӱ;3ܽ1 B(}k[X,UV& cnbUv!ELpouцw)tQۄ^W)T%oag)u&P2p̺jK* ݢ?\o[ܴz$AGXj|EW11ݨ =%-H`kWI4yd'"Yq|x`yran0B+~}5\n׉3M;gӏo{<=P߬:Y"&!`bKE݊/P 102570HP ,P~/ގ 0H4eŦgCiK)Z&j]|&v0j[>TUIkxCHo;D4.p!-rUDnNv3l*䧔4P *)ꖑ!cg;qq7BGxE(i/-w90OrMv9Dz,69Dmvs3|rJꃰYryrC1ag5hqj;dulf vENDR̪lR?|ZW"(0oѫW!bB2iݗ0ֈ۾>K{*|t0uyO,K}dlP -P)6'L3eHp!mM=djc֏&?Ε_(:EiBX;ӺuWb[D=jd~esDg(i ݑ]MmҚσ-hi[)F+LVޛz'`J_V ~p< 8d+^Ú'[l♎ -16M?[m p}Kմ(Z#K[lU N>&DYrs 0K>O @?yo='Q}:PDmYk9nKf0W'ZJDylvqPB{d\ ߾`FǃՎZ gBP t.VhBm7ƢJ@e)=jٚ&$F؆Wi3NBg<<7uބ z$-L|:".>οOaJPObS  $HSY0OXdh HRA+nAvo4x{}U-~*v}u}YgzESE;4'asn:;.w_mb`$GŒ6 ۚw\M?˦OO#Pa@{@j|fS3}^t<{> r%#);x ] r.u/@$E(s;(f7, vJナ 5ͰM =UW-_,5q -c' $ލ˃n(b儐V| >JwR{ɑšZFxHoMۭC_IӍq=_:k0 IiS_@WP_*@K-h|a'K_Rd]5s7:@ "2@yC/Pt4zL W "<g[xm4z#_ŤhfpE]2 jDe`MAW|o,}1!l䍩hvty=KsLzOvM*ʸRL*֬1` H$ys;uzE(CXZ@1G`xJ6ªUWSc9(qHM&6Bt{@0/QȘi^t_Nd=3J aϩ5!,YMnVv§Bh.~KRbC,RIyML X 0L&haj9<5k+1_ z1ڔk”6߮7'oC 1ámJS8TV {P/ZK:>ļ`(ܺmѵCVxdždj:|jUަڪ;% 6LC#_eok;Orj¦G٬ 1a@\RX|FY rESULA ͟^xټn *:Z͉W³*rbqHRq`12Ͻsp B/&CKxoCҚć~WۜNV٠8..r>iJ2mx$5?D",I$pM k!, 7*:GeQgV~T Gx6LI?S֕˞!hH:s`+cg"YBddZဗW= D_W:D2M;sw)rƁxc9Ցz R+4]SZxYF?/(8y3-})ZEQo #hsHu҇޾7!ꦸQWW Z[+RWZORnmCkܘfQ&fjG`a{IJ35xĤ%0f)w<AZBdA Ĝ&P8/!֨#]oSpn8#U|ѵ<ö@ۇJAZHx"d¥\Ft+:z#%Zۦ4DeZQepeކ _6\Wx1k~u%7|@{~;ĖЦFHfJkb[CBpAXw<:W%(?<>bAQc+2\à׃Pu?w<6mgJ +TE@۫n Z1o5yR%B$NS& ͣrݔNx綛aDjP.H*)KE8(+( L;"hr&'m !v["Aŀ; mRw!<$X J62;u ['e J:"پ5m95ϳS@Vq4\|mk;#҃*{71_ꚦYUք f-. a!T|DƶhT% e4tN" e)p ~ٜ7tyTGI Ez/!l3浇;?.`P*6.꼨%j-O) ƒ¸z\&(UVڭ>VJz/7Hᰌ[Y'8z+a%ugʋUYn$p7Z%lWysA773 u)`"b\nfsPb JBX0ÔlZ1U^,/LHIW^(L?"JZ$wyOgTY}Z_I4X|bz$JoM;~~ ?Q=&6\}~ ԣpVɃe c)B]BVYgm?Sų HF3'L@g3~>/N|JP5XFxI67$fKrր춯qg!H,ŠY%+ͯb)7ݷ?R3 9Āeļoq=E/ѭ0j1JЅ>>aI3i[2Oo;mJQ+kc.0x6֒tdeqsX/#0װaSUK[O4-EN(&ڵnF+M2j{vqӸrR,04}m_N(CGdz}*M'xu{/kͬ8B?M+#9*%O}b!AV۬m|7 ٬,@邹kZ}E:HN|O1aJE=/p\<B;/]c*!yAe< -o lwh_0/uA%\tZqRnMھv$ۮFr7<==+okT z^%+:L &:ofm?E&`8AN:Q2O;p!H54zF@|Njԥ2Vk8Ro{mq1GW=ΛrMtX%x6D3U?^K]/#"ǨIc,6QDczFw6 4[U/2{-LVCr9۟V [ .{3R`6ڈۭuSUzظΎK\FIȒ](Ø9sBt%AMe%|r y6Jpt dX4D1afBF53W+̰P9޸np6#g|^bPl*jGXFZK >FIj܁z\|]Cbj;2>+Yn~ ^z<k:dCVi9I)^G}||'lr\A~U=IR1ga _ @m|x޼З>`uЁ!CBo3 5* 53Y]iDG6Pxr ]5Bs\H_5?,֫58 Vz bs,&#:لl*};:unۜ:fZZ$[gKY[\d wgG|jŜ'le X/,)m/LqOՅZ;?N9D>QBoK@`}ŻS=Lk57R<|UqA  >EaYS.ߦjtcZoQh ØV~ao,MpF 13o:_vv֡g!]qݨ|i%21.`Q1hr(DXbH_o> 1Nҷi&ȳ3,k@( =1ȷPfE!E rNzՓ&ue_Ω)xې*v(?.$FjJD c[{HX{eqxmz*N,w ڎ [HJa7Vx~Z^Xkp{,-h?̓uf cOOb4O.u(i47I=~kӵ}qߛm0f m쇖,GM $5L(3HB&@ӵ2z&Bř_PQ׿p-2dB"/nő}U\M[w[S/a(4r*)jL^=$(TMidT ? ,w,}YJ>$y Q*Q+H =$k5ۥʺ'f6lR3Rߠ0RxFJ\ꑖ !8<#\C  byevMeЎ/ $wn֠D d:ꄽ}\5X mh` UFwd? x-'_{$lXj~E/jj*Dᅨ,6̌C Y:83NڙcDM AtBWt܌,7&UN3:>D3X*&r9lD dƔ1qғLŁlAGK~C@I7WhGK2o*G9,nC䣁[{ɿ/]+'O=_b4x*''Qm: DI9eJEH>Ɇ9ekbLx3e:xMl3fjt]#ĵ̛Z;='ncMٴHr@gڈZ:Nz[M`&j8duoQiS/"cD[&먀=d򣐞2Kx@H'^`4rTn-uTLU#q/:q~%) 0uAGU. `Ɨko$:w*6L+^ ?YRUaJjZvBBm!ڎ<"kjd(#tX'fyUۍ`kZP/;o.DM ;/=n|/qos!|.Fijm8s0i5a*eOM'cvy-&ɻ={?MnnsHX3[*@AGH$9AVيnfD;Z D` X o m%`9#}޲?q~n3 uL@L Gȧ9ڠW~Jy3TgP$qݸ{/(1;19|bF ɤɬq9zY}lЗߌ uu~)Ve-O09µA`T[rf2'ZFc[@)O S nRuHN-Y ѤlJ|9rj$-U;!_t(|5\Ad 3~]F+bn +Od'[=)]zU,wTIݵ:6c$'7;ӛu%]׉K$YQhZ"7Ȗ~`}qWաf( ;;&ROh+Cս]g 8`K㽭c:yr[ 9t;J/?L-;X T϶4e7QMqgCeŖN⑛%s{wˡ wod =rhM,$gȔ`5(Ŧ'+̗3 {ү,1\jcxY<\ pL3|4^Z༶ŘRý#נ)+-XffdLDp$,V56 z~ 狁Μ /^Q-14?\."5bK6]R)7g ,LvX &z苷$`խ@c)W4a8Cʧ޺K4iYRu)V5]$=:7Ґf]` ^ZE>6}ѱH @ J4vr|N{}qguZ]I3gU_K9Lu8] {TQVJ4D< +z$1̃R~ߊսCMWhЫ`a ?. Zf0Gr;!- D~>7)IK zH5ۈWT>C5zQ-C*B R%\~#ׄZU>5C{ /HnQlkc5~mvۗ<ص[ Ox| Z34R"uY؏1G<m) sCq͛Ώ&*H qeOڠadR}8Z@- &*[À%4!ʍeȟ|hI 4Av[=P4ÈxLtK8Rz9i6ʐ{VͳЕ"iH3ރij7dG8-Iݧ.RvDjӟ gY`QxY>IVGxROZ<: +!<+V/wڔYTQn%s|&I'4-*t8_?'hjxeZn VH* j3QꝞ}AkW#J)jӪ,${=򎗗y )'c$6WʙqM{Ѕu+iwnZe:x}%K+K ʺ!ܧ6*}_Z ڵn1V(K`'G}feH J0 7bǕJ [k^i\nbL,p$QsCIx-N64˞NU3|!fjԉcf5`6wo|6G_ZTݫ%uD-GLT!+Xr!p$&֡0pzQ9r~<]:j˺H45` ?_@Zʹ5+Qm#*7*l Mak]`ՖfuDp,BwVp@A#Wd0ZcD0U"~HpFCNE\1@v~T*1jt練^|62 p- sWaU0F n,)A~&ăK\e8<\, @q&-p~Ds ބ闿J =Y/7Y Y#\Yl'i(܋3 MuZ IkRJ+ȤNrKfS* ` ~\I`9 1wȶpU}y#|.sQuq5^ڛ9R2(J,!·0|OS ʬai OWig#+`[Rص_R`7?8NJM;!5G 㳳4&TzGcHPOtۮ-ԈtE'3h+ o.͎:kCh:ܣÇ,?, qN؆lM:Ni c1A@WlH4Hw lMmk5fAjJUn>|6b:A.1)nF n36Fͼ>ϯm }Ri.N%y¦6XJ0W%ug6X}hE]KcJG:,3'3Ee850ռ#ؽ 2|/h A:MG H#'96$;}8~4~K[G 7R3T4ϖQlSV$gu/I]=ۈnTҪ8kb*{%"X@J) ${,hk"vJfOi)v-P|\./Y\3E_?$U^n0}&NP=Д_,R_#hqA-*< 8<95~S[Y$tA.lڃҺDϔ*Vz9J}>]J&}_d4VWy)[}O#RVǃYYDVVfB2 kRBrLpUp۩*EX]e˰l=ia}qh}_'|4>`ўI\X>!< H< YMf9uCh2*ߜD6\Αks[{ljꄳn Ć|8JJ<Ba~t8&#Te#OO?L{)K$GP1{}gAO\T2C ȼj-z@o~*> fIC~BJmNDTW;o Pj##Y95-)R5QErVdߟp7M $ Td'A;UCGFgPq{C;}^䎲`@v "3+w^Z!\zR|mP sC߃B- @RaRvCvBEZՉ-FVI2od_\vJn5_vb6rՆvm8=|A=|0t@BTMsEgL.]U9N!  Fѓ [}鸙)ɲ`P/{<pErͮRzUh+Y?[L!c]2Rd&=A4 a1V!|) Mzc$^Kf0 MjI{M#T@U7Zr*KW&"v>>jj+] B4ݤ+B|G]~^tj AhNjU'Oѥ]&qWu*_XiKGA$p\hIkL !v5մ.N4za$ܚHuည\.8CV4{N{z:~j][`Lu<7R`VlFKj[PĂP*.OhIf á~tno6g7%?lvf~㺻Y BF=K20[_4eӞŒPϩ Sh[=b~[}>gw9(2N)ύhN' 39P]QOھi.$̏x=9T*haE4o;F"MWR>CZY Bđ )\C9[( l%-%ë\%`Fn+8Yr^NwNqܗ;=a!_& 6O{z *Ns˝2~O\b;\F &G_}v\WX2>4LRDDಚ~ц'Jϙsk[|^N8,~s=Lךa x|Qgle0!:]lխN E!R^|HJmEdMRW4r )DZΈ!I~5:)8\IGL=dMzN`` +mG?0\)alw /n2}4;06@[oMPYٍ=j_T:V=zjS@ƞ*7@/ 9 ؋]rK?"K `|Ѩlrc$WͿ=~,k &2,f A=9F7!;uZOCh-hMn;jK~9HYmjQEf`l)fzNBm)xxϑi̱'I? 3sI-&A1xƨ@q9%(iIc>!hrm'~g`Lnt;W0(TpoAYlT.D3i\[c |9/6oPdbX0'%] KXa )4?u}Yn)vjAD1q 9_&$h4{wּ|[n5`A/Tci* Zf`vM^Htf bx[,dk4/SYZ!c%J/h kV7~r}8YsB"hb n@Л͎X쎕hd],tV5ʜRgz Dr2tzy](xâ+35D|aۊ#V24SjYc9i,װN+Rֺxx$~k,'yv[-[7 ݬ.kzu!We6RnQF{`Ȭ V-xV8 Ѩ"qV8V.š&RkɟK 64NF<@R. '8S]|`tٍq$?blyғ&=K:lB O.YjL\vgPz"&  c |2'%I5.Yݨ߂-lHy(~BN$kRRfs7V:&>x2<"j ;LGx ltqN\AYcܔ>@KoG+cg2ɦ`m1V8?Yqr:E ؽ`TxG`9̉#gLs&[L§26˻l}oռ'Qf ]hvljM"!nbziS}ZK{&r9 ^7; +\IQ- 7wB@;Y`jrqJ?}uR\-[ZF;VMaQDV xHpfERX!1\(a8l+ Jsʚ>x멈.b DVVc  ]vΤ[Mrh20V g2#H# [|IHT#j x;՗8o4|0ɥȶ@8b2vKU䎎Í4`DG~g4;Gl{-t$9BT>)c'=pgL.vͶp }W4㕾t9r>޼+ >rt/  ?# (0rH5t$xk]ܽ׶N&}1ڶ\dd^{o0` K`E @Z+;~޳9D#繭w:uxޒbv*A9'ZF3=8>͂bSˌל?5nL~W*."H>㽋nCĦxv}lP)'?$+xW'P2Lwb K^݉ZCv5e\x?<2+)&.šJw4F%WAD?7 )y3kS"wEFFFB+g(I6-"ܲSԙ=,Ř2,3R ~鶾[4>Om#BVxn'u(5ǭm:&JY^ls(.IBK5xc4r2m{0|=5o>qgu7Oyx#?+,| l7ʦtXm&g٦^t\0a0O D2)q? =-r\k0S}k[41_),mAk~$p(vh [fչ`ZxRW60蔽<M9PewvR& 9(T\ Iw#"yg'`VSH}06sLq zi&?0)7*YdI'wnt1/7ZHw"4%OJ,I"$dʿ`)/"p gu/!ķI}cSzBCEi >[64`a%a<.`ݷ&/{,ucءƛ|.(û>( Lyt]OloU/sꤟmZS%')QKXϦ7LKD4G po_V%4s'D̥^V&`cŤX%Dl薦E“Ont7̍7LHC<ӷ1} z =~ vfS1L{=av^@0իh%"UKbX&R= ͼ$dӨޔCd5E$nT\%:8lp#HE20FK E4%!XP`_T:~}+XD/Mm Y0'(k @vyo-r,nl[Pqy 3i'v UcM&/ ck&zɧ3\hk!}6aN*|R+LNGs;vG? {Lo~$ֆtu2OnEt2<ʫ8p|NlemSK-kVoszɬDM7 y m}Q01-{Veakl l=N^Bkoʃ2DlZ::,aO8X3|s* lAmȍ]7"8#nZs"ߠJѩͯ)3὘1˵ KmnI M'gEbD2N5Q}03^ b:8(OlYtץC[ůCd*g}%0%QjVQu>eW^ٗ;f>L60h|E򶶹5@iߔ4),7gT⬤ý+y}q"hz|xY ֊GT,b^yg[V/qàϦ|8+<*2QaiԣOގfڂH~1Epf}s4q T>N ʞYLx]DBi"D@1o#M1Xޝ5E3Q+$q k1z1({DT- a}Q u/%ў(E~I,D<('ҟ0mc t+ug(֗O=CiKH(tW0B@ӭASC>Z^t"[ gn/9@bG_cˎ}^CB(dZs<NJOjbC2A§uPWHAsh+3*"U(\$2CEb"a7P+p^2"dDsproBE+GR.D7| Q  k|<(J5XD#4۴?_tGy-%w9J00""ddGuV~3-Ow. ;fj! XViIz_y,y ځWNH" $2FFX;L(k}0' 06`2"B v]a4{P;:g6x#fSkDvvzFy䎿 o(Mǣ㍚K::q$}/ϯYZ`{,^8߫ X6]pAc_5)AI3dL>ة5{!VyoOP6ZtZ|=7}fX(3#*-O9xspj<&YxIsPL $NLp=,)F/@mh3yJ6R&7jfȘahPv)G\(?5BfYc,^pg*ﱥJqb yCW9\{bzc?[\pqv^X3D`:'<<鑝?f7Љb˕dYGXV e Ս}0ɬ>|1,kxAOkOkd*iI]mOX%K !U U[k1O!$GPNl@}+w +MIQ@W_nu,ۀ i8Lgi.4;J G˔b4_*>6RTALF}Ud a|k!YX\5`[T3CS1|mc- зi .&@.h8ۅ"XBIElI/n 'dzFlJ _-)$}D[ 9 >l|#WCq8N{ h$\# 1PEP$аW&~1:KMO mV f )<^EX…?ԗerĜ~xWNLTr18 vhQ]jJQ.2$#+WS}j-N/]j^RMNµj>>! (Ǫ9,êIaW!N.s slAGc#RU/<*ِq՗Esb½/v ܅%3X! s?Ϋ7ײ?ݹH?";kPi}-b;)1 gڹjfA_5"v~!8)ksq*YQ>=6U)0K,@O}rI,&K̙1sW*C2 lJ6g!*/ZݛRJ:d3d^9G~g_F_nqc>eyC=T) Š^MFi{Y.Y!;1JtX5AJcf=|} i[/8oI\4 ~}w|P:`ŐW-sa &ꆳc1t5i^Iح] 33\1EW̡xgɨtP3l֟3Jqpi;WJ<(yYA[8WFB;Oz~ٕcW-ztYH΋q!!9x#xգ+t'2- BܵĠU8e,ʮNv]gt豋IX (.uQǼPP*dq)HO'KZ(YW|lQmȜhp0AX[&NBl:LA?E1tKQKU[uxȘ ]; q.~j$0 YZsusieR/man/0000755000176200001440000000000014143375605012307 5ustar liggesuserssusieR/man/predict.susie.Rd0000644000176200001440000000212314051346274015353 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/predict.susie.R \name{predict.susie} \alias{predict.susie} \title{Predict outcomes or extract coefficients from susie fit.} \usage{ \method{predict}{susie}(object, newx = NULL, type = c("response", "coefficients"), ...) } \arguments{ \item{object}{A susie fit.} \item{newx}{A new value for X at which to do predictions.} \item{type}{The type of output. For \code{type = "response"}, predicted or fitted outcomes are returned; for \code{type = "coefficients"}, the estimated coefficients are returned.} \item{\dots}{Other arguments used by generic predict function. These extra arguments are not used here.} } \value{ For \code{type = "response"}, predicted or fitted outcomes are returned; for \code{type = "coefficients"}, the estimated coefficients are returned. If the susie fit has intercept = \code{NA} (which is common when using \code{susie_suff_stat}) then predictions are computed using an intercept of 0, and a warning is emitted. } \description{ Predict outcomes or extract coefficients from susie fit. } susieR/man/coef.susie.Rd0000644000176200001440000000104313755042336014637 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/predict.susie.R \name{coef.susie} \alias{coef.susie} \title{Extract regression coefficients from susie fit} \usage{ \method{coef}{susie}(object, ...) } \arguments{ \item{object}{A susie fit.} \item{\dots}{Additional arguments passed to the generic \code{coef} method.} } \value{ A p+1 vector, the first element being an intercept, and the remaining p elements being estimated regression coefficients. } \description{ Extract regression coefficients from susie fit } susieR/man/N3finemapping.Rd0000644000176200001440000000324314142574422015273 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} \name{N3finemapping} \alias{N3finemapping} \title{Simulated Fine-mapping Data with Three Effect Variables.} \format{ \code{N3finemapping} is a list with the following elements: \describe{ \item{X}{N by P variable matrix of centered and scaled genotype data.} \item{chrom}{Chromomsome of the original data, in hg38 coordinate.} \item{pos}{Chromomosomal positoin of the original data, in hg38 coordinate. The information can be used to compare impact of using other genotype references of the same variables in susie_rss application.} \item{true_coef}{The simulated effect sizes.} \item{residual_variance}{The simulated residual covariance matrix.} \item{Y}{The simulated response variables.} \item{allele_freq}{Allele frequency of the original genotype data.} \item{V}{Prior covariance matrix for effect size of the three non-zero effect variables.} } } \description{ The data-set contains a matrix of 574 individuals and 1,001 variables. These variables are real-world genotypes centered and scaled, and therefore retains the correlation structure of variables in the original genotype data. 3 out of the variables have non-zero effects. The response data is generated under a multivariate linear regression model. See Wang \emph{et al} (2020) for more details. } \examples{ data(N3finemapping) } \references{ G. Wang, A. Sarkar, P. Carbonetto and M. Stephens (2020). A simple new approach to variable selection in regression, with application to genetic fine-mapping. \emph{Journal of the Royal Statistical Society, Series B} \doi{10.1101/501114}. } \keyword{data} susieR/man/susie_plots.Rd0000644000176200001440000000626614055430035015150 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/susie_plots.R \name{susie_plot} \alias{susie_plot} \alias{susie_plot_iteration} \title{SuSiE Plots.} \usage{ susie_plot( model, y, add_bar = FALSE, pos = NULL, b = NULL, max_cs = 400, add_legend = NULL, ... ) susie_plot_iteration(model, L, file_prefix, pos = NULL) } \arguments{ \item{model}{A SuSiE fit, typically an output from \code{\link{susie}} or one of its variants. For \code{suse_plot}, the susie fit must have \code{model$z}, \code{model$PIP}, and may include \code{model$sets}. \code{model} may also be a vector of z-scores or PIPs.} \item{y}{A string indicating what to plot: either \code{"z"} for z-scores, \code{"PIP"} for posterior inclusion probabilities, \code{"log10PIP"} for posterior inclusion probabiliities on the (base-10) log-scale. For any other setting, the data are plotted as is.} \item{add_bar}{If \code{add_bar = TRUE}, add horizontal bar to signals in credible interval.} \item{pos}{Indices of variables to plot. If \code{pos = NULL} all variables are plotted.} \item{b}{For simulated data, set \code{b = TRUE} to highlight "true" effects (highlights in red).} \item{max_cs}{The largest credible set to display, either based on purity (set \code{max_cs} between 0 and 1), or based on size (set \code{max_cs > 1}).} \item{add_legend}{If \code{add_legend = TRUE}, add a legend to annotate the size and purity of each CS discovered. It can also be specified as location where legends should be added, e.g., \code{add_legend = "bottomright"} (default location is \code{"topright"}).} \item{\dots}{Additional arguments passed to \code{\link[graphics]{plot}}.} \item{L}{An integer specifying the number of credible sets to plot.} \item{file_prefix}{Prefix to path of output plot file. If not specified, the plot, or plots, will be saved to a temporary directory generated using \code{\link{tempdir}}.} } \value{ Invisibly returns \code{NULL}. } \description{ \code{susie_plot} produces a per-variable summary of the SuSiE credible sets. \code{susie_plot_iteration} produces a diagnostic plot for the susie model fitting. For \code{susie_plot_iteration}, several plots will be created if \code{track_fit = TRUE} when calling \code{susie}. } \examples{ set.seed(1) n = 1000 p = 1000 beta = rep(0,p) beta[sample(1:1000,4)] = 1 X = matrix(rnorm(n*p),nrow = n,ncol = p) X = scale(X,center = TRUE,scale = TRUE) y = drop(X \%*\% beta + rnorm(n)) res = susie(X,y,L = 10) susie_plot(res,"PIP") susie_plot(res,"PIP",add_bar = TRUE) susie_plot(res,"PIP",add_legend = TRUE) susie_plot(res,"PIP", pos=1:500, add_legend = TRUE) # Plot selected regions with adjusted x-axis position label res$genomic_position = 1000 + (1:length(res$pip)) susie_plot(res,"PIP",add_legend = TRUE, pos = list(attr = "genomic_position",start = 1000,end = 1500)) # True effects are shown in red. susie_plot(res,"PIP",b = beta,add_legend = TRUE) set.seed(1) n = 1000 p = 1000 beta = rep(0,p) beta[sample(1:1000,4)] = 1 X = matrix(rnorm(n*p),nrow = n,ncol = p) X = scale(X,center = TRUE,scale = TRUE) y = drop(X \%*\% beta + rnorm(n)) res = susie(X,y,L = 10) susie_plot_iteration(res, L=10) } \seealso{ \code{\link{susie_plot_changepoint}} } susieR/man/FinemappingConvergence.Rd0000644000176200001440000000234314113174734017211 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} \name{FinemappingConvergence} \alias{FinemappingConvergence} \title{Simulated Fine-mapping Data with Convergence Problem.} \format{ \code{FinemappingConvergence} is a list with the following elements: \describe{ \item{XtX}{Summary statistics computed using the centered and scaled genotype matrix.} \item{Xty}{Summary statistics computed using the centered and scaled genotype data, and the centered simulated response.} \item{yty}{yty is computed using the centered simulated response.} \item{n}{The sample size (50,000).} \item{true_coef}{The coefficients used to simulate the responses.} \item{z}{z-scores from a simple (single-SNP) linear regression.}} } \description{ Data simulated using real genotypes from 50,000 individuals and 200 SNPs. Two of the SNPs have non-zero effects on the multivariate response. The response data are generated under a linear regression model. The simulated response and the columns of the genotype matrix are centered. } \examples{ data(FinemappingConvergence) } \seealso{ A similar data set with more SNPs is used in the \dQuote{Refine SuSiE model} vignette. } \keyword{data} susieR/man/univariate_regression.Rd0000644000176200001440000000322414051464002017172 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/univariate_regression.R \name{univariate_regression} \alias{univariate_regression} \title{Perform Univariate Linear Regression Separately for Columns of X} \usage{ univariate_regression( X, y, Z = NULL, center = TRUE, scale = FALSE, return_residuals = FALSE ) } \arguments{ \item{X}{n by p matrix of regressors.} \item{y}{n-vector of response variables.} \item{Z}{Optional n by k matrix of covariates to be included in all regresions. If Z is not \code{NULL}, the linear effects of covariates are removed from y first, and the resulting residuals are used in place of y.} \item{center}{If \code{center = TRUE}, center X, y and Z.} \item{scale}{If \code{scale = TRUE}, scale X, y and Z.} \item{return_residuals}{Whether or not to output the residuals if Z is not \code{NULL}.} } \value{ A list with two vectors containing the least-squares estimates of the coefficients (\code{betahat}) and their standard errors (\code{sebetahat}). Optionally, and only when a matrix of covariates \code{Z} is provided, a third vector \code{residuals} containing the residuals is returned. } \description{ This function performs the univariate linear regression y ~ x separately for each column x of X. Each regression is implemented using \code{.lm.fit()}. The estimated effect size and stardard error for each variable are outputted. } \examples{ set.seed(1) n = 1000 p = 1000 beta = rep(0,p) beta[1:4] = 1 X = matrix(rnorm(n*p),nrow = n,ncol = p) X = scale(X,center = TRUE,scale = TRUE) y = drop(X \%*\% beta + rnorm(n)) res = univariate_regression(X,y) plot(res$betahat/res$sebetahat) } susieR/man/SummaryConsistency.Rd0000644000176200001440000000213414113174734016452 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} \name{SummaryConsistency} \alias{SummaryConsistency} \title{Simulated Fine-mapping Data with LD matrix From Reference Panel.} \format{ \code{SummaryConsistency} is a list with the following elements: \describe{ \item{z}{z-scores computed by fitting univariate simple regression variable-by-variable.} \item{ldref}{LD matrix estimated from the reference panel.} \item{flip_id}{The index of the SNP with the flipped allele.} \item{signal_id}{The index of the SNP with the non-zero effect.}} } \description{ Data simulated using real genotypes from 10,000 individuals and 200 SNPs. One SNP have non-zero effect on the multivariate response. The response data are generated under a linear regression model. There is also one SNP with flipped allele between summary statistics and the reference panel. } \examples{ data(SummaryConsistency) } \seealso{ A similar data set with more samples is used in the \dQuote{Diagnostic for fine-mapping with summary statistics} vignette. } \keyword{data} susieR/man/estimate_s_rss.Rd0000644000176200001440000000336614055245030015620 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/susie_utils.R \name{estimate_s_rss} \alias{estimate_s_rss} \title{Estimate s in \code{susie_rss} Model Using Regularized LD} \usage{ estimate_s_rss(z, R, r_tol = 1e-08, method = "null-mle") } \arguments{ \item{z}{A p-vector of z scores.} \item{R}{A p by p symmetric, positive semidefinite correlation matrix.} \item{r_tol}{Tolerance level for eigenvalue check of positive semidefinite matrix of R.} \item{method}{a string specifies the method to estimate \eqn{s}.} } \value{ A number between 0 and 1. } \description{ The estimated s gives information about the consistency between the z scores and LD matrix. A larger \eqn{s} means there is a strong inconsistency between z scores and LD matrix. The \dQuote{null-mle} method obtains mle of \eqn{s} under \eqn{z | R ~ N(0,(1-s)R + s I)}, \eqn{0 < s < 1}. The \dQuote{null-partialmle} method obtains mle of \eqn{s} under \eqn{U^T z | R ~ N(0,s I)}, in which \eqn{U} is a matrix containing the of eigenvectors that span the null space of R; that is, the eigenvectors corresponding to zero eigenvalues of R. The estimated \eqn{s} from \dQuote{null-partialmle} could be greater than 1. The \dQuote{null-pseudomle} method obtains mle of \eqn{s} under pseudolikelihood \eqn{L(s) = \prod_{j=1}^{p} p(z_j | z_{-j}, s, R)}, \eqn{0 < s < 1}. } \examples{ set.seed(1) n = 500 p = 1000 beta = rep(0,p) beta[1:4] = 0.01 X = matrix(rnorm(n*p),nrow = n,ncol = p) X = scale(X,center = TRUE,scale = TRUE) y = drop(X \%*\% beta + rnorm(n)) input_ss = compute_suff_stat(X,y,standardize = TRUE) ss = univariate_regression(X,y) R = cor(X) attr(R,"eigen") = eigen(R, symmetric = TRUE) zhat = with(ss,betahat/sebetahat) s = estimate_s_rss(zhat, R) } susieR/man/single_effect_regression.Rd0000644000176200001440000000657314051464466017650 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/single_effect_regression.R, % R/single_effect_regression_rss.R, R/single_effect_regression_ss.R \name{single_effect_regression} \alias{single_effect_regression} \alias{single_effect_regression_rss} \alias{single_effect_regression_ss} \title{Bayesian single-effect linear regression} \usage{ single_effect_regression( y, X, V, residual_variance = 1, prior_weights = NULL, optimize_V = c("none", "optim", "uniroot", "EM", "simple"), check_null_threshold = 0 ) single_effect_regression_rss( z, Sigma, V = 1, prior_weights = NULL, optimize_V = c("none", "optim", "uniroot", "EM", "simple"), check_null_threshold = 0 ) single_effect_regression_ss( Xty, dXtX, V = 1, residual_variance = 1, prior_weights = NULL, optimize_V = c("none", "optim", "uniroot", "EM", "simple"), check_null_threshold = 0 ) } \arguments{ \item{y}{An n-vector.} \item{X}{An n by p matrix of covariates.} \item{V}{A scalar giving the (initial) prior variance} \item{residual_variance}{The residual variance.} \item{prior_weights}{A p-vector of prior weights.} \item{optimize_V}{The optimization method to use for fitting the prior variance.} \item{check_null_threshold}{Scalar specifying threshold on the log-scale to compare likelihood between current estimate and zero the null.} \item{z}{A p-vector of z scores.} \item{Sigma}{\code{residual_var*R + lambda*I}} \item{Xty}{A p-vector.} \item{dXtX}{A p-vector containing the diagonal elements of \code{crossprod(X)}.} } \value{ A list with the following elements: \item{alpha}{Vector of posterior inclusion probabilities; \code{alpha[i]} is posterior probability that the ith coefficient is non-zero.} \item{mu}{Vector of posterior means (conditional on inclusion).} \item{mu2}{Vector of posterior second moments (conditional on inclusion).} \item{lbf}{Vector of log-Bayes factors for each variable.} \item{lbf_model}{Log-Bayes factor for the single effect regression.} \code{single_effect_regression} and \code{single_effect_regression_ss} additionally output: \item{V}{Prior variance (after optimization if \code{optimize_V != "none"}).} \item{loglik}{The log-likelihood, \eqn{\log p(y | X, V)}.} } \description{ These methods fit the regression model \eqn{y = Xb + e}, where elements of e are \emph{i.i.d.} \eqn{N(0,s^2)}, and b is a p-vector of effects to be estimated. The assumption is that b has exactly one non-zero element, with all elements equally likely to be non-zero. The prior on the coefficient of the non-zero element is \eqn{N(0,V)}. } \details{ \code{single_effect_regression_ss} performs single-effect linear regression with summary data, in which only the statistcs \eqn{X^Ty} and diagonal elements of \eqn{X^TX} are provided to the method. \code{single_effect_regression_rss} performs single-effect linear regression with z scores. That is, this function fits the regression model \eqn{z = R*b + e}, where e is \eqn{N(0,Sigma)}, \eqn{Sigma = residual_var*R + lambda*I}, and the b is a p-vector of effects to be estimated. The assumption is that b has exactly one non-zero element, with all elements equally likely to be non-zero. The prior on the non-zero element is \eqn{N(0,V)}. The required summary data are the p-vector \code{z} and the p by p matrix \code{Sigma}. The summary statistics should come from the same individuals. } \keyword{internal} susieR/man/kriging_rss.Rd0000644000176200001440000000420414102301653015102 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/susie_utils.R \name{kriging_rss} \alias{kriging_rss} \title{Compute Distribution of z-scores of Variant j Given Other z-scores, and Detect Possible Allele Switch Issue} \usage{ kriging_rss( z, R, r_tol = 1e-08, s = estimate_s_rss(z, R, r_tol, method = "null-mle") ) } \arguments{ \item{z}{A p-vector of z scores.} \item{R}{A p by p symmetric, positive semidefinite correlation matrix.} \item{r_tol}{Tolerance level for eigenvalue check of positive semidefinite matrix of R.} \item{s}{an estimated s from \code{estimate_s_rss}} } \value{ a list containing a ggplot2 plot object and a table. The plot compares observed z score vs the expected value. The possible allele switched variants are labeled as red points (log LR > 2 and abs(z) > 2). The table summarizes the conditional distribution for each variant and the likelihood ratio test. The table has the following columns: the observed z scores, the conditional expectation, the conditional variance, the standardized differences between the observed z score and expected value, the log likelihood ratio statistics. } \description{ Under the null, the rss model with regularized LD matrix is \eqn{z|R,s ~ N(0, (1-s)R + s I))}. We use a mixture of normals to model the conditional distribution of z_j given other z scores, \eqn{z_j | z_{-j}, R, s ~ \sum_{k=1}^{K} \pi_k N(-\Omega_{j,-j} z_{-j}/\Omega_{jj}, \sigma_{k}^2/\Omega_{jj})}, \eqn{\Omega = ((1-s)R + sI)^{-1}}, \eqn{\sigma_1, ..., \sigma_k} is a grid of fixed positive numbers. We estimate the mixture weights \eqn{\pi} We detect the possible allele switch issue using likelihood ratio for each variant. } \examples{ # See also the vignette, "Diagnostic for fine-mapping with summary # statistics." set.seed(1) n = 500 p = 1000 beta = rep(0,p) beta[1:4] = 0.01 X = matrix(rnorm(n*p),nrow = n,ncol = p) X = scale(X,center = TRUE,scale = TRUE) y = drop(X \%*\% beta + rnorm(n)) ss = univariate_regression(X,y) R = cor(X) attr(R,"eigen") = eigen(R, symmetric = TRUE) zhat = with(ss,betahat/sebetahat) cond_dist = kriging_rss(zhat, R) cond_dist$plot } susieR/man/get_cs_correlation.Rd0000644000176200001440000000252014061022471016427 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/susie_utils.R \name{get_cs_correlation} \alias{get_cs_correlation} \title{Get Correlations Between CSs, using Variable with Maximum PIP From Each CS} \usage{ get_cs_correlation(model, X = NULL, Xcorr = NULL, max = FALSE) } \arguments{ \item{model}{A SuSiE fit, typically an output from \code{\link{susie}} or one of its variants.} \item{X}{n by p matrix of values of the p variables (covariates) in n samples. When provided, correlation between variables will be computed and used to remove CSs whose minimum correlation among variables is smaller than \code{min_abs_corr}.} \item{Xcorr}{p by p matrix of correlations between variables (covariates). When provided, it will be used to remove CSs whose minimum correlation among variables is smaller than \code{min_abs_corr}.} \item{max}{When \code{max = FAFLSE}, return a matrix of CS correlations. When \code{max = TRUE}, return only the maximum absolute correlation among all pairs of correlations.} } \value{ A matrix of correlations between CSs, or the maximum absolute correlation when \code{max = TRUE}. } \description{ This function evaluates the correlation between single effect CSs. It is not part of the SuSiE inference. Rather, it is designed as a diagnostic tool to assess how correlated the reported CS are. } susieR/man/susieR-package.Rd0000644000176200001440000000274214143476342015446 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/susieR-package.R \docType{package} \name{susieR-package} \alias{susieR} \alias{susieR-package} \title{susieR: Sum of Single Effects Linear Regression} \description{ Implements methods for variable selection in linear regression based on the "Sum of Single Effects" (SuSiE) model, as described in Wang et al (2020) and Zou et al (2021) . These methods provide simple summaries, called "Credible Sets", for accurately quantifying uncertainty in which variables should be selected. The methods are motivated by genetic fine-mapping applications, and are particularly well-suited to settings where variables are highly correlated and detectable effects are sparse. The fitting algorithm, a Bayesian analogue of stepwise selection methods called "Iterative Bayesian Stepwise Selection" (IBSS), is simple and fast, allowing the SuSiE model be fit to large data sets (thousands of samples and hundreds of thousands of variables). } \seealso{ Useful links: \itemize{ \item \url{https://github.com/stephenslab/susieR} \item Report bugs at \url{https://github.com/stephenslab/susieR/issues} } } \author{ \strong{Maintainer}: Peter Carbonetto \email{peter.carbonetto@gmail.com} Authors: \itemize{ \item Gao Wang \email{wang.gao@columbia.edu} \item Yuxin Zou \item Kaiqian Zhang \item Matthew Stephens } } \keyword{internal} susieR/man/susie_get_methods.Rd0000644000176200001440000001330714143476342016314 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/susie_utils.R \name{susie_get_objective} \alias{susie_get_objective} \alias{susie_get_posterior_mean} \alias{susie_get_posterior_sd} \alias{susie_get_niter} \alias{susie_get_prior_variance} \alias{susie_get_residual_variance} \alias{susie_get_lfsr} \alias{susie_get_posterior_samples} \alias{susie_get_cs} \alias{susie_get_pip} \title{Inferences From Fitted SuSiE Model} \usage{ susie_get_objective(res, last_only = TRUE, warning_tol = 1e-06) susie_get_posterior_mean(res, prior_tol = 1e-09) susie_get_posterior_sd(res, prior_tol = 1e-09) susie_get_niter(res) susie_get_prior_variance(res) susie_get_residual_variance(res) susie_get_lfsr(res) susie_get_posterior_samples(susie_fit, num_samples) susie_get_cs( res, X = NULL, Xcorr = NULL, coverage = 0.95, min_abs_corr = 0.5, dedup = TRUE, squared = FALSE, check_symmetric = TRUE, n_purity = 100, use_rfast ) susie_get_pip(res, prune_by_cs = FALSE, prior_tol = 1e-09) } \arguments{ \item{res}{A susie fit, typically an output from \code{\link{susie}} or one of its variants. For \code{susie_get_pip} and \code{susie_get_cs}, this may instead be the posterior inclusion probability matrix, \code{alpha}.} \item{last_only}{If \code{last_only = FALSE}, return the ELBO from all iterations; otherwise return the ELBO from the last iteration only.} \item{warning_tol}{Warn if ELBO is decreasing by this tolerance level.} \item{prior_tol}{Filter out effects having estimated prior variance smaller than this threshold.} \item{susie_fit}{A susie fit, an output from \code{\link{susie}}.} \item{num_samples}{The number of draws from the posterior distribution.} \item{X}{n by p matrix of values of the p variables (covariates) in n samples. When provided, correlation between variables will be computed and used to remove CSs whose minimum correlation among variables is smaller than \code{min_abs_corr}.} \item{Xcorr}{p by p matrix of correlations between variables (covariates). When provided, it will be used to remove CSs whose minimum correlation among variables is smaller than \code{min_abs_corr}.} \item{coverage}{A number between 0 and 1 specifying desired coverage of each CS.} \item{min_abs_corr}{A "purity" threshold for the CS. Any CS that contains a pair of variables with correlation less than this threshold will be filtered out and not reported.} \item{dedup}{If \code{dedup = TRUE}, remove duplicate CSs.} \item{squared}{If \code{squared = TRUE}, report min, mean and median of squared correlation instead of the absolute correlation.} \item{check_symmetric}{If \code{check_symmetric = TRUE}, perform a check for symmetry of matrix \code{Xcorr} when \code{Xcorr} is provided (not \code{NULL}).} \item{n_purity}{The maximum number of credible set (CS) variables used in calculating the correlation (\dQuote{purity}) statistics. When the number of variables included in the CS is greater than this number, the CS variables are randomly subsampled.} \item{use_rfast}{Use the Rfast package for the purity calculations. By default \code{use_rfast = TRUE} if the Rfast package is installed.} \item{prune_by_cs}{Whether or not to ignore single effects not in a reported CS when calculating PIP.} } \value{ \code{susie_get_objective} returns the evidence lower bound (ELBO) achieved by the fitted susie model and, optionally, at each iteration of the IBSS fitting procedure. \code{susie_get_residual_variance} returns the (estimated or fixed) residual variance parameter. \code{susie_get_prior_variance} returns the (estimated or fixed) prior variance parameters. \code{susie_get_posterior_mean} returns the posterior mean for the regression coefficients of the fitted susie model. \code{susie_get_posterior_sd} returns the posterior standard deviation for coefficients of the fitted susie model. \code{susie_get_niter} returns the number of model fitting iterations performed. \code{susie_get_pip} returns a vector containing the posterior inclusion probabilities (PIPs) for all variables. \code{susie_get_lfsr} returns a vector containing the average lfsr across variables for each single-effect, weighted by the posterior inclusion probability (alpha). \code{susie_get_posterior_samples} returns a list containing the effect sizes samples and causal status with two components: \code{b}, an \code{num_variables} x \code{num_samples} matrix of effect sizes; \code{gamma}, an \code{num_variables} x \code{num_samples} matrix of causal status random draws. \code{susie_get_cs} returns credible sets (CSs) from a susie fit, as well as summaries of correlation among the variables included in each CS. If desired, one can filter out CSs that do not meet a specified \dQuote{purity} threshold; to do this, either \code{X} or \code{Xcorr} must be supplied. It returns a list with the following elements: \item{cs}{A list in which each list element is a vector containing the indices of the variables in the CS.} \item{coverage}{The nominal coverage specified for each CS.} \item{purity}{If \code{X} or \code{Xcorr} iis provided), the purity of each CS.} \item{cs_index}{If \code{X} or \code{Xcorr} is provided) the index (number between 1 and L) of each reported CS in the supplied susie fit.} } \description{ These functions access basic properties or draw inferences from a fitted susie model. } \examples{ set.seed(1) n = 1000 p = 1000 beta = rep(0,p) beta[1:4] = 1 X = matrix(rnorm(n*p),nrow = n,ncol = p) X = scale(X,center = TRUE,scale = TRUE) y = drop(X \%*\% beta + rnorm(n)) s = susie(X,y,L = 10) susie_get_objective(s) susie_get_objective(s, last_only=FALSE) susie_get_residual_variance(s) susie_get_prior_variance(s) susie_get_posterior_mean(s) susie_get_posterior_sd(s) susie_get_niter(s) susie_get_pip(s) susie_get_lfsr(s) } susieR/man/susie_rss.Rd0000644000176200001440000001635714142574570014632 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/susie_rss.R \name{susie_rss} \alias{susie_rss} \title{Sum of Single Effects (SuSiE) Regression using summary statistics} \usage{ susie_rss( z, R, z_ld_weight = 0, prior_variance = 50, estimate_prior_variance = TRUE, check_prior = TRUE, ... ) } \arguments{ \item{z}{A p-vector of z scores.} \item{R}{A p by p correlation matrix.} \item{z_ld_weight}{This parameter is included for backwards compatibility with previous versions of the function, but it is no longer recommended to use a non-zero value. If \code{z_ld_weight > 0}, the matrix R used in the model is adjusted to be \code{cov2cor((1-w)*R + w*tcrossprod(z))}, where \code{w = z_ld_weight}.} \item{prior_variance}{The prior variance(s) for the non-zero element of \eqn{b_l}. It is either a scalar, or a vector of length L. When \code{estimate_prior_variance = TRUE} (highly recommended) this simply provides an initial value for the prior variance, and the default value of 50 is simply intended to be a large initial value.} \item{estimate_prior_variance}{If \code{estimate_prior_variance = TRUE}, which is highly recommended, the prior variance is estimated (this is a separate parameter for each of the L effects). If provided, \code{prior_variance} is then used as an initial value for the optimization. When \code{estimate_prior_variance = FALSE} (not recommended) the prior variance for each of the L effects is determined by the value supplied to \code{prior_variance}.} \item{check_prior}{When \code{check_prior = TRUE}, it checks if the estimated prior variance becomes unreasonably large (comparing with 10 * max(abs(z))^2).} \item{\dots}{Other parameters to be passed to \code{\link{susie_suff_stat}}.} } \value{ A \code{"susie"} object with the following elements: \item{alpha}{An L by p matrix of posterior inclusion probabilites.} \item{mu}{An L by p matrix of posterior means, conditional on inclusion.} \item{mu2}{An L by p matrix of posterior second moments, conditional on inclusion.} \item{lbf}{log-Bayes Factor for each single effect.} \item{lbf_variable}{log-Bayes Factor for each variable and single effect.} \item{V}{Prior variance of the non-zero elements of b.} \item{elbo}{The value of the variational lower bound, or \dQuote{ELBO} (objective function to be maximized), achieved at each iteration of the IBSS fitting procedure.} \item{Rr}{A vector of length p, equal to \code{R \%*\% colSums(alpha*mu)}.} \item{sets}{Credible sets estimated from model fit; see \code{\link{susie_get_cs}} for details.} \item{pip}{A vector of length p giving the (marginal) posterior inclusion probabilities for all p covariates.} \item{niter}{Number of IBSS iterations that were performed.} \item{converged}{\code{TRUE} or \code{FALSE} indicating whether the IBSS converged to a solution within the chosen tolerance level.} } \description{ \code{susie_rss} performs variable selection under a sparse Bayesian multiple linear regression of \eqn{Y} on \eqn{X} using only the z-scores from standard univariate regression of \eqn{Y} on each column of \eqn{X}, and an estimate \eqn{R} of the correlation matrix between columns of \eqn{X}. It does this by combining the "RSS likelihood" from Zhu and Stephens (2017) with the Sum of Single Effects" model from Wang et al (2020). } \details{ In some applications, particularly genetic applications, it is desired to fit a regression model (\eqn{Y = X\tilde{b} + E} say, which we refer to as "the original regression model" or ORM) without access to the actual values of \eqn{Y} and \eqn{X}, but given only some summary statistics. \code{susie_rss} assumes the availability of \eqn{z} scores from standard univariate regression of \eqn{Y} on each column of \eqn{X}, and an estimate \eqn{R} of the correlation matrix between columns of \eqn{X} (\eqn{R} is sometimes called the LD matrix in genetic applications). See Zhu and Stephens (2017), and references therein, for further background. The \code{susie_rss} function is based on the model (2.10) from Zhu and Stephens, \eqn{z | R, b ~ N(Rb,R)} where \eqn{b} is a vector of length p representing the effects to be estimated. The effect \eqn{b_j} is simply a multiple of the coefficient \eqn{\tilde{b}_j} in the ORM, and so \eqn{b_j} is non-zero if and only if \eqn{\tilde{b}_j} is non-zero. In this sense the variable selection problem in this model is the same as the variable selection problem in the ORM, and so the credible sets and PIPs computed by \code{susie_rss} can be interpreted as credible sets and PIPs for the ORM. However, converting posterior estimates of \eqn{b_j} to estimates of \eqn{\tilde{b}_j} would require computation of the scaling factor (not done here). More precisely, \code{susie_rss} assumes the log-likelihood for \eqn{b} is \eqn{l(b; z,R) = -0.5(b'Rb - 2z'b)}, which is equivalent to model (2.10) from Zhu and Stephens if \eqn{R} is invertible, but does not require \eqn{R} to be invertible. It combines this likelihood with the \dQuote{susie prior} which assumes that \eqn{b = \sum_{l=1}^L b_l} where each \eqn{b_l} is a vector of length p with exactly one non-zero element; see \code{\link{susie}} and Wang et al (2020) for details. In practice, this is accomplished by calling \code{susie_suff_stat} with \code{XtX = R} and \code{Xty = z}, and fixing \code{residual_variance = 1}. (Values for \code{n} and \code{yty} are also required by \code{susie_suff_stat}. They do not affect inference when the residual variance is fixed, but they do affect the interpretation of \code{scaled_prior_variance}; we set \code{n=2, yty=1} so that \eqn{var(y) = yty/(n-1) = 1}.) Additional arguments to be passed to \code{\link{susie_suff_stat}} can be provided via \code{...}. } \examples{ set.seed(1) n = 1000 p = 1000 beta = rep(0,p) beta[1:4] = 1 X = matrix(rnorm(n*p),nrow = n,ncol = p) X = scale(X,center = TRUE,scale = TRUE) y = drop(X \%*\% beta + rnorm(n)) input_ss = compute_suff_stat(X,y,standardize = TRUE) ss = univariate_regression(X,y) R = with(input_ss,cov2cor(XtX)) zhat = with(ss,betahat/sebetahat) res = susie_rss(zhat,R) # Toy example illustrating behaviour susie_rss when the z-scores # are mostly consistent with a non-invertible correlation matrix. # Here the CS should contain both variables, and two PIPs should # be nearly the same. z = c(6,6.01) R = matrix(1,2,2) fit = susie_rss(z,R) print(fit$sets$cs) print(fit$pip) # In this second toy example, the only difference is that one # z-score is much larger than the other. Here we expect that the # second PIP will be much larger than the first. z = c(6,7) R = matrix(1,2,2) fit = susie_rss(z,R) print(fit$sets$cs) print(fit$pip) } \references{ G. Wang, A. Sarkar, P. Carbonetto and M. Stephens (2020). A simple new approach to variable selection in regression, with application to genetic fine-mapping. \emph{Journal of the Royal Statistical Society, Series B} \bold{82}, 1273-1300 \doi{10.1101/501114}. Y. Zou, P. Carbonetto, G. Wang and M. Stephens (2021). Fine-mapping from summary data with the \dQuote{Sum of Single Effects} model. \emph{bioRxiv} \doi{10.1101/2021.11.03.467167}. X. Zhu and M. Stephens (2017). Bayesian large-scale multiple regression with summary statistics from genome-wide association studies. \emph{Annals of Applied Statistics} \bold{11}, 1561-1592. } susieR/man/susie.Rd0000644000176200001440000004107314142574570013734 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/susie.R, R/susie_ss.R \name{susie} \alias{susie} \alias{susie_suff_stat} \title{Sum of Single Effects (SuSiE) Regression} \usage{ susie( X, y, L = min(10, ncol(X)), scaled_prior_variance = 0.2, residual_variance = NULL, prior_weights = NULL, null_weight = NULL, standardize = TRUE, intercept = TRUE, estimate_residual_variance = TRUE, estimate_prior_variance = TRUE, estimate_prior_method = c("optim", "EM", "simple"), check_null_threshold = 0, prior_tol = 1e-09, residual_variance_upperbound = Inf, s_init = NULL, coverage = 0.95, min_abs_corr = 0.5, compute_univariate_zscore = FALSE, na.rm = FALSE, max_iter = 100, tol = 0.001, verbose = FALSE, track_fit = FALSE, residual_variance_lowerbound = var(drop(y))/10000, refine = FALSE, n_purity = 100 ) susie_suff_stat( bhat, shat, R, n, var_y, XtX, Xty, yty, X_colmeans = NA, y_mean = NA, maf = NULL, maf_thresh = 0, L = 10, scaled_prior_variance = 0.2, residual_variance = NULL, estimate_residual_variance = TRUE, estimate_prior_variance = TRUE, estimate_prior_method = c("optim", "EM", "simple"), check_null_threshold = 0, prior_tol = 1e-09, r_tol = 1e-08, prior_weights = NULL, null_weight = NULL, standardize = TRUE, max_iter = 100, s_init = NULL, coverage = 0.95, min_abs_corr = 0.5, tol = 0.001, verbose = FALSE, track_fit = FALSE, check_input = FALSE, refine = FALSE, check_prior = FALSE, n_purity = 100 ) } \arguments{ \item{X}{An n by p matrix of covariates.} \item{y}{The observed responses, a vector of length n.} \item{L}{Maximum number of non-zero effects in the susie regression model. If L is larger than the number of covariates, p, L is set to p.} \item{scaled_prior_variance}{The prior variance, divided by \code{var(y)} (or by \code{(1/(n-1))yty} for \code{susie_suff_stat}); that is, the prior variance of each non-zero element of b is \code{var(y) * scaled_prior_variance}. The value provided should be either a scalar or a vector of length \code{L}. If \code{estimate_prior_variance = TRUE}, this provides initial estimates of the prior variances.} \item{residual_variance}{Variance of the residual. If \code{estimate_residual_variance = TRUE}, this value provides the initial estimate of the residual variance. By default, it is set to \code{var(y)} in \code{susie} and \code{(1/(n-1))yty} in \code{susie_suff_stat}.} \item{prior_weights}{A vector of length p, in which each entry gives the prior probability that corresponding column of X has a nonzero effect on the outcome, y.} \item{null_weight}{Prior probability of no effect (a number between 0 and 1, and cannot be exactly 1).} \item{standardize}{If \code{standardize = TRUE}, standardize the columns of X to unit variance prior to fitting (or equivalently standardize XtX and Xty to have the same effect). Note that \code{scaled_prior_variance} specifies the prior on the coefficients of X \emph{after} standardization (if it is performed). If you do not standardize, you may need to think more carefully about specifying \code{scaled_prior_variance}. Whatever your choice, the coefficients returned by \code{coef} are given for \code{X} on the original input scale. Any column of \code{X} that has zero variance is not standardized.} \item{intercept}{If \code{intercept = TRUE}, the intercept is fitted; it \code{intercept = FALSE}, the intercept is set to zero. Setting \code{intercept = FALSE} is generally not recommended.} \item{estimate_residual_variance}{If \code{estimate_residual_variance = TRUE}, the residual variance is estimated, using \code{residual_variance} as an initial value. If \code{estimate_residual_variance = FALSE}, the residual variance is fixed to the value supplied by \code{residual_variance}.} \item{estimate_prior_variance}{If \code{estimate_prior_variance = TRUE}, the prior variance is estimated (this is a separate parameter for each of the L effects). If provided, \code{scaled_prior_variance} is then used as an initial value for the optimization. When \code{estimate_prior_variance = FALSE}, the prior variance for each of the L effects is determined by the value supplied to \code{scaled_prior_variance}.} \item{estimate_prior_method}{The method used for estimating prior variance. When \code{estimate_prior_method = "simple"} is used, the likelihood at the specified prior variance is compared to the likelihood at a variance of zero, and the setting with the larger likelihood is retained.} \item{check_null_threshold}{When the prior variance is estimated, compare the estimate with the null, and set the prior variance to zero unless the log-likelihood using the estimate is larger by this threshold amount. For example, if you set \code{check_null_threshold = 0.1}, this will "nudge" the estimate towards zero when the difference in log-likelihoods is small. A note of caution that setting this to a value greater than zero may lead the IBSS fitting procedure to occasionally decrease the ELBO.} \item{prior_tol}{When the prior variance is estimated, compare the estimated value to \code{prior_tol} at the end of the computation, and exclude a single effect from PIP computation if the estimated prior variance is smaller than this tolerance value.} \item{residual_variance_upperbound}{Upper limit on the estimated residual variance. It is only relevant when \code{estimate_residual_variance = TRUE}.} \item{s_init}{A previous susie fit with which to initialize.} \item{coverage}{A number between 0 and 1 specifying the \dQuote{coverage} of the estimated confidence sets.} \item{min_abs_corr}{Minimum absolute correlation allowed in a credible set. The default, 0.5, corresponds to a squared correlation of 0.25, which is a commonly used threshold for genotype data in genetic studies.} \item{compute_univariate_zscore}{If \code{compute_univariate_zscore = TRUE}, the univariate regression z-scores are outputted for each variable.} \item{na.rm}{Drop any missing values in y from both X and y.} \item{max_iter}{Maximum number of IBSS iterations to perform.} \item{tol}{A small, non-negative number specifying the convergence tolerance for the IBSS fitting procedure. The fitting procedure will halt when the difference in the variational lower bound, or \dQuote{ELBO} (the objective function to be maximized), is less than \code{tol}.} \item{verbose}{If \code{verbose = TRUE}, the algorithm's progress, and a summary of the optimization settings, are printed to the console.} \item{track_fit}{If \code{track_fit = TRUE}, \code{trace} is also returned containing detailed information about the estimates at each iteration of the IBSS fitting procedure.} \item{residual_variance_lowerbound}{Lower limit on the estimated residual variance. It is only relevant when \code{estimate_residual_variance = TRUE}.} \item{refine}{If \code{refine = TRUE}, then an additional iterative refinement procedure is used, after the IBSS algorithm, to check and escape from local optima (see details).} \item{n_purity}{Passed as argument \code{n_purity} to \code{\link{susie_get_cs}}.} \item{bhat}{A p-vector of estimated effects.} \item{shat}{A p-vector of standard errors.} \item{R}{A p by p correlation matrix. It should be estimated from the same samples used to compute \code{bhat} and \code{shat}. Using an out-of-sample matrix may produce unreliable results.} \item{n}{The sample size.} \item{var_y}{The sample variance of y, defined as \eqn{y'y/(n-1)}. When the sample variance cannot be provided, the coefficients (returned from \code{coef}) are computed on the "standardized" X, y scale.} \item{XtX}{A p by p matrix \eqn{X'X} in which the columns of X are centered to have mean zero.} \item{Xty}{A p-vector \eqn{X'y} in which y and the columns of X are centered to have mean zero.} \item{yty}{A scalar \eqn{y'y} in which y is centered to have mean zero.} \item{X_colmeans}{A p-vector of column means of \code{X}. If both \code{X_colmeans} and \code{y_mean} are provided, the intercept is estimated; otherwise, the intercept is NA.} \item{y_mean}{A scalar containing the mean of \code{y}. If both \code{X_colmeans} and \code{y_mean} are provided, the intercept is estimated; otherwise, the intercept is NA.} \item{maf}{Minor allele frequency; to be used along with \code{maf_thresh} to filter input summary statistics.} \item{maf_thresh}{Variants having a minor allele frequency smaller than this threshold are not used.} \item{r_tol}{Tolerance level for eigenvalue check of positive semidefinite matrix of R.} \item{check_input}{If \code{check_input = TRUE}, \code{susie_suff_stat} performs additional checks on \code{XtX} and \code{Xty}. The checks are: (1) check that \code{XtX} is positive semidefinite; (2) check that \code{Xty} is in the space spanned by the non-zero eigenvectors of \code{XtX}.} \item{check_prior}{If \code{check_prior = TRUE}, it checks if the estimated prior variance becomes unreasonably large (comparing with 10 * max(abs(z))^2).} } \value{ A \code{"susie"} object with some or all of the following elements: \item{alpha}{An L by p matrix of posterior inclusion probabilites.} \item{mu}{An L by p matrix of posterior means, conditional on inclusion.} \item{mu2}{An L by p matrix of posterior second moments, conditional on inclusion.} \item{Xr}{A vector of length n, equal to \code{X \%*\% colSums(alpha * mu)}.} \item{lbf}{log-Bayes Factor for each single effect.} \item{lbf_variable}{log-Bayes Factor for each variable and single effect.} \item{intercept}{Intercept (fixed or estimated).} \item{sigma2}{Residual variance (fixed or estimated).} \item{V}{Prior variance of the non-zero elements of b, equal to \code{scaled_prior_variance * var(y)}.} \item{elbo}{The value of the variational lower bound, or \dQuote{ELBO} (objective function to be maximized), achieved at each iteration of the IBSS fitting procedure.} \item{fitted}{Vector of length n containing the fitted values of the outcome.} \item{sets}{Credible sets estimated from model fit; see \code{\link{susie_get_cs}} for details.} \item{pip}{A vector of length p giving the (marginal) posterior inclusion probabilities for all p covariates.} \item{z}{A vector of univariate z-scores.} \item{niter}{Number of IBSS iterations that were performed.} \item{converged}{\code{TRUE} or \code{FALSE} indicating whether the IBSS converged to a solution within the chosen tolerance level.} \code{susie_suff_stat} returns also outputs: \item{XtXr}{A p-vector of \code{t(X)} times the fitted values, \code{X \%*\% colSums(alpha*mu)}.} } \description{ Performs a sparse Bayesian multiple linear regression of y on X, using the "Sum of Single Effects" model from Wang et al (2020). In brief, this function fits the regression model \eqn{y = \mu + X b + e}, where elements of \eqn{e} are \emph{i.i.d.} normal with zero mean and variance \code{residual_variance}, \eqn{\mu} is an intercept term and \eqn{b} is a vector of length p representing the effects to be estimated. The \dQuote{susie assumption} is that \eqn{b = \sum_{l=1}^L b_l} where each \eqn{b_l} is a vector of length p with exactly one non-zero element. The prior on the non-zero element is normal with zero mean and variance \code{var(y) * scaled_prior_variance}. The value of \code{L} is fixed, and should be chosen to provide a reasonable upper bound on the number of non-zero effects to be detected. Typically, the hyperparameters \code{residual_variance} and \code{scaled_prior_variance} will be estimated during model fitting, although they can also be fixed as specified by the user. See functions \code{\link{susie_get_cs}} and other functions of form \code{susie_get_*} to extract the most commonly-used results from a susie fit. } \details{ The function \code{susie} implements the IBSS algorithm from Wang et al (2020). The option \code{refine = TRUE} implements an additional step to help reduce problems caused by convergence of the IBSS algorithm to poor local optima (which is rare in our experience, but can provide misleading results when it occurs). The refinement step incurs additional computational expense that increases with the number of CSs found in the initial run. The function \code{susie_suff_stat} implements essentially the same algorithms, but using sufficient statistics. (The statistics are sufficient for the regression coefficients \eqn{b}, but not for the intercept \eqn{\mu}; see below for how the intercept is treated.) If the sufficient statistics are computed correctly then the results from \code{susie_suff_stat} should be the same as (or very similar to) \code{susie}, although runtimes will differ as discussed below. The simplest sufficient statistics are the sample size \code{n}, and then the p by p matrix \eqn{X'X}, the p-vector \eqn{X'y}, and the sum of squared y values \eqn{y'y}, all computed after centering the columns of \eqn{X} and the vector \eqn{y} to have mean 0; these can be computed using \code{compute_suff_stat}. Alternatively the user can provide \code{n} and \code{bhat} (the univariate OLS estimates from regressing y on each column of X), \code{shat} (the standard errrors from these OLS regressions), the p by p symmetric, positive semidefinite correlation matrix \eqn{R = cov2cor(X'X)}, and the variance of \eqn{y}, again all computed from centered \eqn{X} and \eqn{y}. Note that here \code{R} and \code{bhat} should be computed using the same matrix \eqn{X}. If you do not have access to the original \eqn{X} to compute the matrix \code{R} then use \code{\link{susie_rss}}. The handling of the intercept term in \code{susie_suff_stat} needs some additional explanation. Computing the summary data after centering \code{X} and \code{y} effectively ensures that the resulting posterior quantities for \eqn{b} allow for an intercept in the model; however, the actual value of the intercept cannot be estimated from these centered data. To estimate the intercept term the user must also provide the column means of \eqn{X} and the mean of \eqn{y} (\code{X_colmeans} and \code{y_mean}). If these are not provided, they are treated as \code{NA}, which results in the intercept being \code{NA}. If for some reason you prefer to have the intercept be 0 instead of \code{NA} then set \code{X_colmeans = 0,y_mean = 0}. For completeness, we note that if \code{susie_suff_stat} is run on \eqn{X'X, X'y, y'y} computed \emph{without} centering \eqn{X} and \eqn{y}, and with \code{X_colmeans = 0,y_mean = 0}, this is equivalent to \code{susie} applied to \eqn{X, y} with \code{intercept = FALSE} (although results may differ due to different initializations of \code{residual_variance} and \code{scaled_prior_variance}). However, this usage is not recommended for for most situations. The computational complexity of \code{susie} is \eqn{O(npL)} per iteration, whereas \code{susie_suff_stat} is \eqn{O(p^2L)} per iteration (not including the cost of computing the sufficient statistics, which is dominated by the \eqn{O(np^2)} cost of computing \eqn{X'X}). Because of the cost of computing \eqn{X'X}, \code{susie} will usually be faster. However, if \eqn{n >> p}, and/or if \eqn{X'X} is already computed, then \code{susie_suff_stat} may be faster. } \examples{ # susie example set.seed(1) n = 1000 p = 1000 beta = rep(0,p) beta[1:4] = 1 X = matrix(rnorm(n*p),nrow = n,ncol = p) X = scale(X,center = TRUE,scale = TRUE) y = drop(X \%*\% beta + rnorm(n)) res1 = susie(X,y,L = 10) susie_get_cs(res1) # extract credible sets from fit plot(beta,coef(res1)[-1]) abline(a = 0,b = 1,col = "skyblue",lty = "dashed") plot(y,predict(res1)) abline(a = 0,b = 1,col = "skyblue",lty = "dashed") # susie_suff_stat example input_ss = compute_suff_stat(X,y) res2 = with(input_ss, susie_suff_stat(XtX = XtX,Xty = Xty,yty = yty,n = n, X_colmeans = X_colmeans,y_mean = y_mean,L = 10)) plot(coef(res1),coef(res2)) abline(a = 0,b = 1,col = "skyblue",lty = "dashed") } \references{ G. Wang, A. Sarkar, P. Carbonetto and M. Stephens (2020). A simple new approach to variable selection in regression, with application to genetic fine-mapping. \emph{Journal of the Royal Statistical Society, Series B} \bold{82}, 1273-1300 \doi{10.1101/501114}. Y. Zou, P. Carbonetto, G. Wang and M. Stephens (2021). Fine-mapping from summary data with the \dQuote{Sum of Single Effects} model. \emph{bioRxiv} \doi{10.1101/2021.11.03.467167}. } \seealso{ \code{\link{susie_get_cs}} and other \code{susie_get_*} functions for extracting results; \code{\link{susie_trendfilter}} for applying the SuSiE model to non-parametric regression, particularly changepoint problems, and \code{\link{susie_rss}} for applying the SuSiE model when one only has access to limited summary statistics related to \eqn{X} and \eqn{y} (typically in genetic applications). } susieR/man/susie_trendfilter.Rd0000644000176200001440000000622614055444252016333 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/susie_trendfilter.R \name{susie_trendfilter} \alias{susie_trendfilter} \title{Apply susie to trend filtering (especially changepoint problems), a type of non-parametric regression.} \usage{ susie_trendfilter(y, order = 0, standardize = FALSE, use_mad = TRUE, ...) } \arguments{ \item{y}{An n-vector of observations ordered in time or space (assumed to be equally spaced).} \item{order}{An integer specifying the order of trend filtering. The default, \code{order = 0}, corresponds to "changepoint" problems (\emph{i.e.}, piecewise constant \eqn{mu}). Although \code{order > 0} is implemented, we do not recommend its use; in practice, we have found problems with convergence of the algorithm to poor local optima, producing unreliable inferences.} \item{standardize}{Logical indicating whether to standardize the X variables ("basis functions"); \code{standardize = FALSE} is recommended as these basis functions already have a natural scale.} \item{use_mad}{Logical indicating whether to use the "median absolute deviation" (MAD) method to the estimate residual variance. If \code{use_mad = TRUE}, susie is run twice, first by fixing the residual variance to the MAD value, then a second time, initialized to the first fit, but with residual variance estimated the usual way (by maximizing the ELBO). We have found this strategy typically improves reliability of the results by reducing a tendency to converge to poor local optima of the ELBO.} \item{...}{Other arguments passed to \code{\link{susie}}.} } \value{ A "susie" fit; see \code{\link{susie}} for details. } \description{ Fits the non-parametric Gaussian regression model \eqn{y = mu + e}, where the mean \eqn{mu} is modelled as \eqn{mu = Xb}, X is a matrix with columns containing an appropriate basis, and b is vector with a (sparse) SuSiE prior. In particular, when \code{order = 0}, the jth column of X is a vector with the first j elements equal to zero, and the remaining elements equal to 1, so that \eqn{b_j} corresponds to the change in the mean of y between indices j and j+1. For background on trend filtering, see Tibshirani (2014). See also the "Trend filtering" vignette, \code{vignette("trend_filtering")}. } \details{ This implementation exploits the special structure of X, which means that the matrix-vector product \eqn{X^Ty} is fast to compute; in particular, the computation time is \eqn{O(n)} rather than \eqn{O(n^2)} if \code{X} were formed explicitly. For implementation details, see the "Implementation of SuSiE trend filtering" vignette by running \code{vignette("trendfiltering_derivations")}. } \examples{ set.seed(1) mu = c(rep(0,50),rep(1,50),rep(3,50),rep(-2,50),rep(0,200)) y = mu + rnorm(400) s = susie_trendfilter(y) plot(y) lines(mu,col = 1,lwd = 3) lines(predict(s),col = 2,lwd = 2) # Calculate credible sets (indices of y that occur just before # changepoints). susie_get_cs(s) # Plot with credible sets for changepoints. susie_plot_changepoint(s,y) } \references{ R. J. Tibshirani (2014). Adaptive piecewise polynomial estimation via trend filtering. \emph{Annals of Statistics} \bold{42}, 285-323. } susieR/man/summary.susie.Rd0000644000176200001440000000120313760346546015424 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/summary.susie.R \name{summary.susie} \alias{summary.susie} \alias{print.summary.susie} \title{Summarize Susie Fit.} \usage{ \method{summary}{susie}(object, ...) \method{print}{summary.susie}(x, ...) } \arguments{ \item{object}{A susie fit.} \item{\dots}{Additional arguments passed to the generic \code{summary} or \code{print.summary} method.} \item{x}{A susie summary.} } \value{ \code{summary.susie} returns a list containing a data frame of variables and a data frame of credible sets. } \description{ \code{summary} method for the \dQuote{susie} class. } susieR/man/N2finemapping.Rd0000644000176200001440000000330514051474607015274 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/data.R \docType{data} \name{N2finemapping} \alias{N2finemapping} \title{Simulated Fine-mapping Data with Two Effect Variables} \format{ \code{N2finemapping} is a list with the following elements: \describe{ \item{X}{Centered and scaled genotype data.} \item{chrom}{Chromomsome of the original data, in hg38 coordinates.} \item{pos}{Chromomosomal position of the original data, in hg38 coordinates. The information can be used to compare impact of using other genotype references of the same variables in \code{susie_rss} application.} \item{true_coef}{Simulated effect sizes.} \item{residual_variance}{Simulated residual covariance matrix.} \item{Y}{Simulated multivariate response.} \item{allele_freq}{Allele frequencies based on the original genotype data.} \item{V}{Suggested prior covariance matrix for effect sizes of the two non-zero effect variables.} } } \description{ This data set contains a genotype matrix for 574 individuals and 1,002 variables. The variables are genotypes after centering and scaling, and therefore retain the correlation structure of the original genotype data. Two of the variables have non-zero effects on the multivariate response. The response data are generated under a multivariate linear regression model. See Wang \emph{et al} (2020) for details. } \examples{ data(N2finemapping) } \references{ G. Wang, A. Sarkar, P. Carbonetto and M. Stephens (2020). A simple new approach to variable selection in regression, with application to genetic fine-mapping. \emph{Journal of the Royal Statistical Society, Series B} \doi{10.1101/501114}. } \keyword{data} susieR/man/susie_init_coef.Rd0000644000176200001440000000175613755042336015756 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/initialize.R \name{susie_init_coef} \alias{susie_init_coef} \title{Initialize a susie object using regression coefficients} \usage{ susie_init_coef(coef_index, coef_value, p) } \arguments{ \item{coef_index}{An L-vector containing the the indices of the nonzero coefficients.} \item{coef_value}{An L-vector containing initial coefficient estimates.} \item{p}{A scalar giving the number of variables.} } \value{ A list with elements \code{alpha}, \code{mu} and \code{mu2} to be used by \code{susie}. } \description{ Initialize a susie object using regression coefficients } \examples{ set.seed(1) n = 1000 p = 1000 beta = rep(0,p) beta[sample(1:1000,4)] = 1 X = matrix(rnorm(n*p),nrow = n,ncol = p) X = scale(X,center = TRUE,scale = TRUE) y = drop(X \%*\% beta + rnorm(n)) # Initialize susie to ground-truth coefficients. s = susie_init_coef(which(beta != 0),beta[beta != 0],length(beta)) res = susie(X,y,L = 10,s_init=s) } susieR/man/compute_ss.Rd0000644000176200001440000000132414051346274014755 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/compute_ss.R \name{compute_ss} \alias{compute_ss} \title{Compute sufficient statistics for input to \code{susie_suff_stat}} \usage{ compute_ss(X, y, standardize = FALSE) } \arguments{ \item{X}{An n by p matrix of covariates.} \item{y}{An n vector.} \item{standardize}{Logical flag indicating whether to standardize columns of X to unit variance prior to computing summary data.} } \value{ A list of sufficient statistics (X'X, X'y, y'y and n) } \description{ This is a synonym for \code{compute_suff_stat} included for historical reasons (deprecated). } \examples{ data(N2finemapping) ss = compute_ss(N2finemapping$X, N2finemapping$Y[,1]) } susieR/man/susie_auto.Rd0000644000176200001440000000557014055242561014761 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/susie_zzz_auto.R \name{susie_auto} \alias{susie_auto} \title{Attempt at Automating SuSiE for Hard Problems} \usage{ susie_auto( X, y, L_init = 1, L_max = 512, verbose = FALSE, init_tol = 1, standardize = TRUE, intercept = TRUE, max_iter = 100, tol = 0.01, ... ) } \arguments{ \item{X}{An n by p matrix of covariates.} \item{y}{The observed responses, a vector of length n.} \item{L_init}{The initial value of L.} \item{L_max}{The largest value of L to consider.} \item{verbose}{If \code{verbose = TRUE}, the algorithm's progress, and a summary of the optimization settings, are printed to the console.} \item{init_tol}{The tolerance to passed to \code{susie} during early runs (set large to shorten the initial runs).} \item{standardize}{If \code{standardize = TRUE}, standardize the columns of X to unit variance prior to fitting. Note that \code{scaled_prior_variance} specifies the prior on the coefficients of X \emph{after} standardization (if it is performed). If you do not standardize, you may need to think more carefully about specifying \code{scaled_prior_variance}. Whatever your choice, the coefficients returned by \code{coef} are given for \code{X} on the original input scale. Any column of \code{X} that has zero variance is not standardized.} \item{intercept}{If \code{intercept = TRUE}, the intercept is fitted; it \code{intercept = FALSE}, the intercept is set to zero. Setting \code{intercept = FALSE} is generally not recommended.} \item{max_iter}{Maximum number of IBSS iterations to perform.} \item{tol}{A small, non-negative number specifying the convergence tolerance for the IBSS fitting procedure. The fitting procedure will halt when the difference in the variational lower bound, or \dQuote{ELBO} (the objective function to be maximized), is less than \code{tol}.} \item{\dots}{Additional arguments passed to \code{\link{susie}}.} } \value{ See \code{\link{susie}} for a description of return values. } \description{ \code{susie_auto} is an attempt to automate reliable running of susie even on hard problems. It implements a three-stage strategy for each L: first, fit susie with very small residual error; next, estimate residual error; finally, estimate the prior variance. If the last step estimates some prior variances to be zero, stop. Otherwise, double L, and repeat. Initial runs are performed with relaxed tolerance; the final run is performed using the default susie tolerance. } \examples{ set.seed(1) n = 1000 p = 1000 beta = rep(0,p) beta[1:4] = 1 X = matrix(rnorm(n*p),nrow = n,ncol = p) X = scale(X,center = TRUE,scale = TRUE) y = drop(X \%*\% beta + rnorm(n)) res = susie_auto(X,y) plot(beta,coef(res)[-1]) abline(a = 0,b = 1,col = "skyblue",lty = "dashed") plot(y,predict(res)) abline(a = 0,b = 1,col = "skyblue",lty = "dashed") } \seealso{ \code{\link{susie}} } susieR/man/compute_suff_stat.Rd0000644000176200001440000000166114051346274016332 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/compute_ss.R \name{compute_suff_stat} \alias{compute_suff_stat} \title{Compute sufficient statistics for input to \code{susie_suff_stat}} \usage{ compute_suff_stat(X, y, standardize = FALSE) } \arguments{ \item{X}{An n by p matrix of covariates.} \item{y}{An n vector.} \item{standardize}{Logical flag indicating whether to standardize columns of X to unit variance prior to computing summary data} } \value{ A list of sufficient statistics (\code{XtX, Xty, yty, n}) and \code{X_colmeans}, \code{y_mean}. } \description{ Computes the sufficient statistics \eqn{X'X, X'y, y'y} and \eqn{n} after centering (and possibly standardizing) the columns of \eqn{X} and centering \eqn{y} to have mean zero. We also store the column means of \eqn{X} and mean of \eqn{y}. } \examples{ data(N2finemapping) ss = compute_suff_stat(N2finemapping$X, N2finemapping$Y[,1]) } susieR/man/susie_plot_changepoint.Rd0000644000176200001440000000241114061022471017326 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/susie_plot_changepoint.R \name{susie_plot_changepoint} \alias{susie_plot_changepoint} \title{Plot changepoint data and susie fit using ggplot2} \usage{ susie_plot_changepoint( s, y, line_col = "blue", line_size = 1.5, cs_col = "red" ) } \arguments{ \item{s}{A susie fit generated by \code{susie_trendfilter(y,order = 0)}.} \item{y}{An n-vector of observations that are ordered in time or space (assumed equally-spaced).} \item{line_col}{Color for the line showing fitted values.} \item{line_size}{Size of the lines showing fitted values} \item{cs_col}{Color of the shaded rectangles showing credible sets.} } \value{ A ggplot2 plot object. } \description{ Plots original data, y, overlaid with line showing susie fitted value and shaded rectangles showing credible sets for changepoint locations. } \examples{ set.seed(1) mu = c(rep(0,50),rep(1,50),rep(3,50),rep(-2,50),rep(0,300)) y = mu + rnorm(500) # Here we use a less sensitive tolerance so that the example takes # less time; in practice you will likely want to use a more stringent # setting such as tol = 0.001. s = susie_trendfilter(y,tol = 0.1) # Produces ggplot with credible sets for changepoints. susie_plot_changepoint(s,y) } susieR/DESCRIPTION0000644000176200001440000000402714143515472013243 0ustar liggesusersEncoding: UTF-8 Type: Package Package: susieR Title: Sum of Single Effects Linear Regression Description: Implements methods for variable selection in linear regression based on the "Sum of Single Effects" (SuSiE) model, as described in Wang et al (2020) and Zou et al (2021) . These methods provide simple summaries, called "Credible Sets", for accurately quantifying uncertainty in which variables should be selected. The methods are motivated by genetic fine-mapping applications, and are particularly well-suited to settings where variables are highly correlated and detectable effects are sparse. The fitting algorithm, a Bayesian analogue of stepwise selection methods called "Iterative Bayesian Stepwise Selection" (IBSS), is simple and fast, allowing the SuSiE model be fit to large data sets (thousands of samples and hundreds of thousands of variables). Date: 2021-11-12 Version: 0.11.92 Authors@R: c(person("Gao","Wang",role="aut",email="wang.gao@columbia.edu"), person("Yuxin","Zou",role="aut"), person("Kaiqian","Zhang",role="aut"), person("Peter","Carbonetto",role=c("aut","cre"), email="peter.carbonetto@gmail.com"), person("Matthew","Stephens",role="aut")) URL: https://github.com/stephenslab/susieR BugReports: https://github.com/stephenslab/susieR/issues License: MIT + file LICENSE Depends: R (>= 3.0.0) Imports: methods, graphics, grDevices, stats, Matrix, matrixStats, mixsqp, reshape, crayon, ggplot2 Suggests: curl, testthat, microbenchmark, knitr, rmarkdown, L0Learn, genlasso, Rfast LazyData: yes LazyDataCompression: xz NeedsCompilation: no RoxygenNote: 7.1.2 VignetteBuilder: knitr Packaged: 2021-11-12 14:53:21 UTC; pcarbo Author: Gao Wang [aut], Yuxin Zou [aut], Kaiqian Zhang [aut], Peter Carbonetto [aut, cre], Matthew Stephens [aut] Maintainer: Peter Carbonetto Repository: CRAN Date/Publication: 2021-11-12 16:50:02 UTC susieR/build/0000755000176200001440000000000014143477740012636 5ustar liggesuserssusieR/build/vignette.rds0000644000176200001440000000077114143477740015202 0ustar liggesusersS]K0qqGw _X}{&)I7goۤaE9ۄz65ĵE9L Cl,X~esOAf>Ȏc.,xM&g1bcY먆NZŵ1qٵTe_<d<ۭ|U-\0sui u|W>\~+3p M@(O@Lsq+`V{ru.󼢉7J sɤaJS]|ц_FH[ORW۶tH=zC^7VƇef0{YbX|[%,'^susieR/build/partial.rdb0000644000176200001440000010334314143477564014773 0ustar liggesusers |Kz6<<^p08x';|o]1q{^ HI[+Yeɲ,ɒeYC|Ɏ$vINJ'NNl+b;x_׿gjxcIz PꫯL&ӕٺ+ӵmd/-OzB̝g]۷v-1{l7YcWevѩ+[ L; Uk9Ŀ=?x/~B{_''k) ~+[ yȍ݂WtHv*A˟2zN U\ ӿQ_~b_. ]kGO ոVIAZY qtGR³+ʍ`X,V+?쎾=:W-W*ޭ[9}hP {nloL,9]*s m+'jaCqҾR5Ŗ]׶ڶ`n& kܴ&x7 H@<N <YK1o+H)w d*j*x 'NV\a иNucB}kdFxm-Xuw | sW@<-Cto}n;F8te'ŐbN,Vr*Jj{N].o7eXjtHVNzzԃѥCntVv&bT.$yAل?:][*P$ ;퇃YPJl^5Y4Q?# 4f]N)v+09yeGi{1nV&NmS +WV YifH,QʁW d,;UU+˗oU;kz3iC;T'i}7C׶V<>.ݐL7= ZطBzN۰ɶqg hk,O퐱.y~ mV Q-W,?J2|Z:ƲoA״:ֹp o΅[=+4C|?^|]Y[ջ' h/ANĈ]CJFQn"F~&~RQ}RἸ ;>#ܗv(v?ohtQHq|5{/H446MKyڑpp;!t"K/u^x:M07PGPv8ŚUZЗP<`cothTY nFTO OA"@G@qIV!VCUiBT<7e{YiQE9ț0bP##M7QQVd%~O`dE 6NGs'/ZbܦlՖmOi$qmLYi"$ӽ?( N8q:)}* zN['e;;EeKOũ!dNC/RR9mvG^ھsei=֖K9@uAVbx }| ܅f@&ucy?n}3x?t fJx4ke'|UqiQݡWdiECצ1-:Q8!f&k-5QhU(~_KUۗ}sObrӫem1 \PE";zQDf]p B@~P=h'hkՖ} hs̲4yvgw}apB~|;dyk?! .%nƞxǮB_˧$  +Mu-QT?^/"E|C79sAZD'~J͛7 ~?;>:6>>~%myɃקgLy,d}іe{;_*D۪B 0 k!񛬹;soj /e756bS)nmm{b8wE߶`A%:Ւ"f+ENmUS n)9`wR5}]R\?.Fm$G̦jDZr}5wf%=,٥ i]p׹cF.x˧wSf%lZA:(%6oI(U@r[WfUvFUi{Ҭ͖!R^m(+P巷Qo/n/zmގ9i{˗̗ٓ+q{ |Xly[w痜o _;Zq7E~`zՍX@H_5?W\ ZǩvVjY6hm%w=3۶J>Dz5׫Nk?/xr²#+sU; We+FZ=_+ v̯Z}I:kEgIل^܁_I؆߲ֆ 8T %ڔ*Ҫ/""lCUhmЭZY#'hZnR15ܤzVk~cTb3շ^uu =Wꅂ|rzWX^/llN5 8!|k:ڴy:Kn:F|U¡D#cx3M*EKɪyni- a-GTdN>VޠƛR_Omek5M)6elgw.z/$heSfG` >+l!F:j% *vRԆ윯ZR_Vɤ|eIFObm߬4]koy 2|ڦ˯hAk׽`-olOꬡIآlol<{*y2W³EDW\@$mk:.W_mNs.A^jYle|GT`4;{_󓇦ק.|WkEFhςѹR9hb\qO(G 4|߻[.wœ9%u,~ex_~knxZކ,d,z8yHlm?^z?Z_}a>/>x 8" w 'grɊrhל`' wT_e~#&Zk}ύn8A`%/>{'uȯyVͨ6ڰ%Y[ M k56.hջ`J㬟9zx%G/Gnщt54%_C/?ĭ_EcD=x2;護Pp!^Hp^>7iDLT=*AC7b{k[ƣxKǐkwޯ[Nt6m^SH8XrѸlnu7ΊoSJhu73!c{o[/R7^]սn9vmUwiSN夶Gz{j v"_ӷNI070opԫ3J,U֩N5 ' CM|QSuJmToTP: !Ni6SjuJen|S+mw*/;2Ag_)SoDzģ؈;t|SOiae.ZbģGgt|SxJ$[+ә^Vo<Ɓqa/(J*gm]% %d >1!cw6nt0>߇2Jc^JDJWU.ƒj}}2:TCt>umj bG"LKmKhXc^, ɬKgߡ+ r_uX T7}$sQ|=/ 3m&e܊bfOAtxf(}fX% !8YLRywHG;Tx:MCh3;xGM:LGѡ \e&{xrGѽ7qA?pP7״I_t )F(]+3|AεKC7"3Cx:MCh3}]JP >=5Db-0}Hny3Q+;0z@"ы(&^'1nVW;OHs[vQ華Bң)S-|- >LUV_v|?< N7NɏxXƤ3}ѓѥs&C1 ^ G{  /@u*n񖻍ۍ|*4G ;"iDq#]ѱzI(h ܧB+OH&y_/ n; +Nbȶ%eNwU~j'2= GRt,`COjOY6آfA\5īKGrA~`k%s=IR@J%#3m2]P8YpOYRv`cG!]:ybģH^&dKIZu ؒ/i%92*#vЏ{ɂ˟-"r 238I9[%<LOiy <'I 6F |"T` UxA-Ah.yۯbv /t^}4ISdHw n$a&I&N*]Y}JG츅RhVs/JU9i vFiת΢Srk|+nŷW0\e_qTs[USs=; ;_d6 lȳYCѵyhIBl6K{Dpv}nd b1I^| nM."DZ9ZQ⻵UmQz>R:CC#ϳs{>\g^f Lλ v7' 9;s9dF,V C`svGiW+4ZaFaUD\kæneXƄ7s]<'+lF 4FQ1愙)zդSucn K֌KgތA[FekhZv=1?/Ԗd$I2{cR|C80+Ec\U*xmƄ? t cw͇ct=ɄkOdt-VP]l3!K2N4g]*٢U-{02/AkAާ(Ǚ.]%֎6f{\+O _&1l n2 !Lߩ} E؞IvTY$Nn J9g*^zS42D *hE䏛^Lfm>$$d̴#7BV'=_Tͫ&E>}Mr 0L޲lc> m⣌;)y#G3O%Z +Ś/}P6Qȣ7b uަR4P1):K"[m~qzz1`V1Zh7,1zd> ^I E+1Z6MӖA2&3.-Rq@AUtYkCER@rWAބ X@n%~O;EJd*rDq?*d_clir,kS )׶nuIr?J%F+%E.ѹ& Cꖖ"J^emVh@6SfO6pLG *~V@<42\%WU-Z~14KNB}ABۙ<'ԻҨ!:f{ o<@'UR@OC>OZ/@JQh?/U4E j6ҜB#Oix=tvQb0?`T}xlѮ>i9BoG sF{;љOJ^tG&=BNdՊ\>@,m+/:nD78I8xf+rws+Z=ڕ;TYU_|!c-?Ы| Ԯ2D/11Ms8҄ZK3_T'ܤ % EBWgx+FpVG. ,J0Zkf9J)Uu 凾Ὶ"KBCNBԦ2<Cc I]E,{:_uJE%6Q䩶 T0ptYKP3Ѥ1Xkq4']h `Qj߉vxSAZzsu[ PBd24ty; !Mzo8+UAB!fOoΈx!`r^GB/CVꌺDgR@<h+2+7&`Mn Ois9쬆S( A\5Up]*d A>Bh%e&ߧPqW 럿$a[E$er8 YgZN¥Cte}Ŭ MKICxlz@>D9־9y8 YU^[!o|ׂzDm?39'B'!|GOZd!ST?rN|AVZg69':TA@9'wӐWz^u3& 6v 8Ytlʟ^܆l&:vfG]mSޅ*d&w~T ']]u?㎛ۦU pӐMd ȷ7HZ*ۈw3&{³eH/< ML\B1YUFm$Q:6t엡0 <1fB>0FZBorNJD~|,'eUNAwz[`ouL/װ[d_[e%GJwmH}!` zԆ>̢B\OZfx~]ò}8LfIuSӾ]vƌ6NԪ"ޖz Bs^L7( 솬9qCeߺ𮤺>}mWw*m'p}m%urƬY$+xa9'T7YU"<ʍZow}t+'>J)Պe4(گ݊t0j7^@:1tw#B#ۿFM]!M4T,Q[,b4 LAʦ,c[ޒUp [ckU~=$XăqH@<+X.[ ;DRQ< OǪ5ﹽj9 i׷ij@agJѝK <isaVOGd+]c b 8 Y)#Zǁ cϽZޫ9PIdr.A)YuPJd CGg]\QK a/B̚=ʶ't:֤ø/e59< tj*n?AfڍmiQV)fS:~ i|@k*fB vwCV:a, -b/ssYv-^[d#lŬB@nJC֏-GCܪUR@Q}ࡣn)p9H@@SM^} j.Fd}Y~_e%<Y--~*c#Z Sg?B,nKNWi jKK tX;! w?*.I7xHT Ah$c^çէUbٜK$>R& pxڤ9]vI;al.2v;FIT./C:DoNfwa㲭'<2P' oͳO|?KgaZg@WiӉ<9qCVK8]]δ 4dOBG!˷é@őtMo8C}d\Ybu8 VT/Ar(:Ɗ^aEGEdU(S:RsJ;![m0d8 t&wwQ{o}kdJDAG۷Ϸd%U..D+uDgq䨸# \-JZD4.oAֺ-9ޙȱp#~9]/9y m%[mj[~hA6Up؇hgITCxv>-O*d[lKM Siǁ _3gtJ\އl ni5 7+V𔼒ݸFWt]6"yx9uJ Sqg +铜vC]gLgdXރ|Oފ:PeWKVgzJ^s3|>/;BÐ9MzG g?^ {XI(hfCzNJw GQ#Ͼ*T} ߀C{B2vqh<5v*BKw266&r>*1gbuBJ]U{A{뿠{7TD7|Ka/^mRYZ≾|Cp%s}ys ^)*0 9wFߡMtgu.)!O"d -rW y>"ͼPYy?jgSy1VjՅ k psk8/R| Bֿnt0dBN ]ms,"J Cq DV*;³R6WK iȑzO$OAV&"9y~ +yGPvfYF;ʔ9)jA痺/+֪F-6BŞpYFK'e/ F|m ll}OH:H}y3&5Ku<+Y¹G8q·L|AGwnj6;q,ɐ!BiKΆ&D9~s o<7' C_!_ɔџBUIqC!se\!gGPJk2k08 O aMwʎ̸s'n4C`D)RxFS_A.&l5A"WVX3s_B*NhV!GT"۝>KTπ+8dsX.߽~,wC֏M?25CѲ6`B6Omxb=IDq[^h ҮStdňGVf?Nt=gco٬/f. tY0iTp ,9< |NIk CxN3}Aگr%ǵG!p~-}Uߟ)㐕'w%=pOW"ќI|9??>յ{bIb#+] {~-ZD.[wݘPWI' ƢW*{x )ؓc/_Siap>4R5)blY9ޯz^)y\qPXX~||l|4'^{3.B}7/|+# ۪ > Ib4ɚ 3&[V+y_mRv_c^ªT[[۞jz%CwE߶`Am%:ժm9oVM%*V7}tk|PuJvIqDV/YG[0q\_ Yv;Kv)H.{n<假)kYoo1yJ(K~PG3I>gj-C*1D5.nρ2$ImÌ=b8V.[+ZUK9eݯ#0dsG=)$$]~O@~ | kT#ha<%tp!:A|)?$A/gKQSM6..xB[LB/.QG3{=ׯ i _ٌfͨ#Ta|ٳKE'K0a+A A`Ѳze{S[C(VKN8yF=vo؁t4/ކ${buRt4m񲋍Ia,b?JOOjFø7z{v$il.K ɘYli8'\;$:9hwV=jKaO`trqJr#2V*< +J菅-oU˕ʃwgG(}5tNڗoX1ѲO$v^bq7GO(S<ھ}Z8N܌S2EJE8?x#Iej7b϶3?pfeWZ'h‡ݭ[h,__/9E xq[o>yPu2gvnڹƻ[| |];S7aWhD@<^Fk[% lEegsq+bq|ukiӗE*xh_ϒy7p7*R*'suAkٌ! R$c*9V? -S-B PjBŔَ < pf;ڃ#o*-Śm3ヅ?~<ȲzB4(QVu$c:h G*ԣhhVKwԱDČd.Vd9i.=('xU:5y.P.\2Λ;XQf٬<=!^Y-UK$~zļ!.v5vW2^P5·sk)!ÐVr3ɓB;RUtB>MuPԨBԟ#Z+^1Jc2Usl@9<4l!ՕP+Vq(d1h(ņHG& ;)ˉ" BRER5>r 讷-:\^Pu AoeEL^g66L-X%).?08ΜgB2ԗ݌=*Q}cW͍YSaQ64EʶFiyf`Chw }͵j L/)OUAP/,!N$Bs.j0@2H KL\3Ba 2N x_ ďv: 3 Mlv&*M!47g"n ۠D[B t(9A{ Ch4 0.SF{i!-̀ЌQ=Ӎ ?b1`shc?BsԑxnSg4hjFRuvkFM?f\75fINKHb;kAhʍ1_40UxT_?0tg(ҡI|$`1⑧H\:V<1:BxW 8yȘFoݿrJ[B M 4@ Ĩ޽7T5IZoByc4#oӝbEGU<7. =B5B.ruj&TdZ#B8'*x:M-@mRǒ>UQO[3knpʵ2skE;Rb{_@-Vꧠ̈́'vVH c ڼ{5Fzi/2 LnIu$U"k6Pl'^x:Mm@1i$8*T#Z]=!.cEg)F dHކ|[^[sZΨ>Z#ܙИhHN6UK LIj=CCx6VMs7l/v} +MKZ,yl! YcǎS33t\|}3܋[>a'&7?9l"ۂD;dn]ɦDoIzOQ))npY}# xR]w x]&ܑgo\Q{އ|_˽UT#xR.x;SZ'Le_Pf )],U>+FI^}Nhpi4{l Y%I4PQiqi^ GMhپDl.g hc[v:QQ:y9VUnPKӳK*x:Mc5c{&m 7ńG +F;i#͎Qx x R7~݈&N‹;0"P8D`BTW8Yߘo5W7y6ƊU+Us̩6‰o%rln嫡i_h-(.*Ġ^n6Q JQxI}7J~*V(eW _L^z#׀'np#F_%Bs-<D@< N4? NXD _~o6yIxwFq+i- WJe[׬ ^ neg{K뢵hbmюJ[T+rOي0K5 Bakq=WW<@ժlؚ5A 3&AjV7 4P1ǚNH4<īZ#-4YEܶ}x~~p,r{s,SUxV3Wt{\g\rtPij 6uF$w5*.ԻEcTSϻNI`r*pBN*ۈpk2]LU]=bʽKNJ훱߫9V>R-oNA~b>>lS\.Nlcp^Վ\H7(5pPu"20ZNAh T삳4-x$d /+]=I"oL[KUW4< Y)蘢C)7Qq nW 9K|@Vi$d(LqHҭmDSV8 ,_PqW!/_ 0޹*[yCw"܊lAԶ ȇC|h&Mozw*1~?2y6 qTɆ#=+`O'*6d9BӧJp8Y4_zӮ])ʆ(9 6WJ(]X!}jcXTx:M=%$jn Ћh~Ajw$ӾZdM :ș@*dبB;S.ޢ9$U1„K5g?QYZNBlQq{g!o[@9ziLͳ'6Jrz!R%uxRZO9U +-YBY.pGȪY?Ƿ ^lEyEFN_9&knש&^Ec 5c{c%p/Aflղw40xEh\~}We3ۯc@a~vQTu"^GCM KQ'*nF\ ;"Z3ZmpC,}4cwgh Zx! ;伈l jJQZ`Ziȧ?B6x]^܁+*C6wMͥowM})($TMtסbl{$<$/e&< Yi7DDr~K=uj/erК@:/g2ΉnSZF =z(v;5p-1OPt7be; x ZDlӍK8"YZ h_B !C#ߘᆄAhnRpR^׮8@ַGoFh-}DPyziHgQOS@rFށ'ߑSIg!TF=HV`ے;|33MhCˌ'Ip!3m8y];Cw~Cŏ ݳ/ 1y *~\@<񭨁39x}$opP?inw 4ECd69m Fek@w9gT܄/ 7IyxҎP9#e|dTz:^JqY?xxChj J:cAȃxo,Hjh J#'v瀳 X~RhqhKq{e֣DDQ= МG~e}'|y`;+d`Kx3)c ^f[z 4j Y'm[U*ts|͕H]Zt[ ӓ/VrN=դr$Ӑ8QtsC_ҷKVi,?  AoQ(a7(5I*>+ v[~8/ Iwj XmZ $rOxK3]~CW{qކlrMr8d7ZEOi@Qo5$eTrznːVL˥0%7 \5Y? g~hu?UIcOB~2{ Lt0#6]rQ44~eJ{bOգ5K3TUtE { b@ %Tۡtgw%NO_rBv^Vy%ty+ޅ?LR{HN+ޫ~ Y @8 yRmvC29s&:@YW rYP/5ekޭEAINZёW:)AJ~=CşpnO@1E/C_ڡl9h[8;B~vCVl F1^7ɲ#QsQ"NV [oUB_k艈c yayWm'[@< c·V/KREt_DtP"W 'kƮh( d-z!݉HoC@ф6 Ia?MabOK_ʘyzM< . "M$2j7QYIІ1 ^Z{4?=ڽU~ϟ2@V#B;[ݘ{r^yՎռ9&JU_hl=YTcqxbݏeOC1 Oitu*UvyZP(Xo"<1~G7:}T!>r*@1:۩u+MݠIIȓ/TMͤEJ׸0(y<ơm#%DQ*+B @oۺ: Wc7 %#WWQ[T@nKBMZ4=l)(zrJf`K81~Jq3sJ(Ng>T#_v_Cn)*>+ v[п*&R/ ITc@;¯:l鯣KR1b""}ն'U^^I8uMΖPqn?=IŢ×dU(]ބ"\a^e;)<%g=Z&"O- g hǕǢ>v;(X)ypte l)v$_ēT5tM{n܅J-5Iv#:aoFwM?yZU[R=Co' Oh6s2dK≟²]]( fG2J,nk1J&Tq{ۛAS'i9j 9W,uA P"#6*#vE;GLqU2˽dx2-4dhQytM+A-|Yj8OP}UנÐM./Aބ( Oiۣ[$imnxu1z2cJ\i:eyV*ҞʆlmtC3Qw_d8R![$iWhx3l4(Nfd^*Rqd^= (4pt.Q6\6lex<{Δibqx9KGGީa(S1@ Ut.B!+ +7m؈JvTx:MA ئ1וw2|Qo]xbB/b 8d #Esڇ` CVe*0hۣW-!-FBc O"h;/hxZD ZS <3'o]6:䎌g}L )Szܶy=7i[LNg!B[O}ުLu*M9WtۭJw!~VhqP>}Z/Y@69_$<YlF0,{h dOsL yx 3эCs~±톬`Fzw 4{@q>>$<=[*G)<Y͙hbjD ,dmJ;<YiR- Z g{*D<{OGV:m9bEH iȧoP,:o5Fd}o9?B!C(>nҾ 5c,⚴EGn [ĞiFK=ԗ=$Bǀ' +=OB&{H7'YM'3gnW|3p;|H(VkNgrn1h/cv=]rWٽUn5`޲U;Q<ctbsӦ͓S㺀xu!7YuW=Zʪ8@V3yj>Otu[} Cޯ?! ÐU1۵jf9 <ؙf9< YId k(c_+Ws)SG uos'[Ȓ ƴB 9X(69ѝOiodlӸ 7gu[ Va HHxA,yjzbMRm%*-JrB A.)---@q Td4οajJ+~z:Z0R*qR! Y-Ǟ) [6.dTAZQV7)}j4%7"ɿE!ԊȵɿE!ԻML ]&dCY~tG: Y-9>DL&W _L{W!'KqhU\@ѦtRo ل'!m4݉9گ>T)En"řA*DAEÔl81uIFwҶQFMx*~&icР664跍jt"߆Ĉ3-ArS]*~X@<bl댻;/IeSE?6"mՔ⌛vpMfL͸S=RgI&"4oUO}h2es} Ibi,fC 2Jxcln['{[2|l=Y)~gD1ABُ_F׀kU% ExK(5$y|-Tji,ߠA_AkA_ yv Ȣ 4Ƿ-y\!5"}o?&dU0f;UH{"uRڃջlMVbIR? _$mtuerѪ[(si㢵qKvKND8e5Ej,,U/[TOilEmlmwkA wBMW6hgyN(ԗW<كJVd;GeU:6ؽ(vo5m`tƎvڄ$1ނ}=.q llEQp2/W8k1]o'ZsIMt n^R ܤ&[zP=mz]O}I^#BuGi8_p[,IfSv~<xR+CgiӾ3խQeZ{[2y-&؝\6kRQ= v]B7 mqv4.$Il/ JȌfYhUXatDm^:Mx˄i^A+*mS&« T?GV4~$y>(7a?ߘr_MWot:XKӉ!#.[жD~*FU46U{~%a:BZ=GCK J7N.ˮE$ccWhBq4h-M'?яoB5!P?I+sviU_E7x*anFx xD_o&n݂1I|Z;Ĩy=Զ:jVFl]).j6qc<gڱ}*R7E-twhM:@${܁]Qq[ .ء][ ǚ^P ܤ][6mҢ'hEB_5n\nn9BKybXĨ7c!=}b.e+(Nrb1@da =x<^.-%=_Tͫ&<*p+ˊc^fC|ˏj[;l LwBes,;*%.he<H_Ҍ^hT3{Xe/ڂBFoڏ ŎرT*~iXŌ]8R(ɍ:nui,9k>+[D8e)Wm^DAWs5םCUZO?q qn[`{_i9B}uC1m,LDV칉^ .H.O1-˘W4x*ePmc^>K)xF7ϤLd\6yfoNS$ef6fnl43 `l֊S$6&x0ӎ|WUز;=Ce_v nOn FYu'͖pp|.,A1;@ŏ7p#P+u}~o>Ysh0{9<_^.`˝_Σ7q|/5pƗ m픸ėvLhQZyюt9 GϪܦy=; kWCMUp1xڷ#-7wх̀7|xBŷmkNj~L .>5v=eL!}/g nsSJew(LM$Շ$Ϻe+fnqf/q2vǸ;y rxj&˕bǁwl``'sÁR~ wlbf 7(bx.(*m+=)I$ox5P8eiQ6j,pvkCd7Nsـ;t5Ʋha ֧KnsrE+_bJ'r&'PEAQsR0S+IlLYW21,;5@uT7Q1.ڹw!zI "2ǁY.k)]?ViOۆsـ^-)nNq&+^T$?{:e[lVT 0̍˾]t9D2f/RL6M1v5W4X8(7XY _bV9/=0WwkЈ[k8xFz\qـݮ! ǁ8OjCFBvxjwȷe)/ۧm}.d$4OZt[6hQT m 5V w6-|`y9t14*vYr`#;Z l?Ϟ؍+lYBQ́ծ &)#(7Nq`;[RqCi.ө\Q>䲁IıcʆmEU]\!zò&^r'[Pqǁ9.8lq9Eշ ꔽ@:IF\6tI칥C9B3c1FM}^}9R;Bl{ݖ/*==6i#@͍p?KlЮ:`V>"܋kmW\V[3>T\/pj)W=KUViJYV1 .Hseka}KWQQנX_q\[606G)wx'LV^,4jV}wyUB#]b`GABA8]p:6䩍eԍC6syJ^.* =_q( c|̫I>w D-w^slVfq%*Ҭ2<.ݏ 5?6@M oUF[RHTKE]k8+J+ϸ;B ĻRب%F4O(IJqq _įxB,QHijD1.r|&8AD׸x{&DvMtxfnP%w\6ͮX6?3v&E!V֒t?<, kmr5r'1Rqi.h.u<*8eR8JwXjmZ$yӯϣ wxf 9Xtbm+򝙨\r' Pq[\6n6p ˴p%ɛO >/Cv.:R͝C fΣgt0+PP/dx]B4rnԄMM5p#R. ԹE/2}Gsڹds*#zpƗ+k]B.ru/K;hǎ,/ ܮ[-2 л-ˇ6ͱ;t{DXmCO/VNs͉^ .irͩ\&lÍI48^bL60~:PW7ѫFsaC-[t&3\6|\pkC&ռ#fVʵb6DBt40~ڬ;T $V{YE. 4ӧH2sP]^oeGsQ=.+fMIl9Yp~yhqj8kBp/ IQ-#\.*xv 93#v})Ks86,IC?mwQ]G\4gؚWcE/ڢEcB!{ёjAw;ye;"^h | J]sAU. 9"+M5 B:DZO4wxˊ޷.ťHǿ y.+^Q"dP dr@L7T \6T~ʿeFDVkRI.\ ]91R˶(#}<WͶ%ގjx˝g*"6 s7sm(yՆRBCwvf7s/*%ˍBy6 ugV.[+ZUE^da Z1yvWc$e!4rV՜T='?s*n7j'sDPk {rE6lS 4|~9 PEŋkEF{ʵs';;hw*h4(HsOqDu`j$Y".ׁlVyM)ASה4#MSNO͚BmⲁTi]lHQvp]OBYo7hks;9RA*n/$ lPω) fJdy.7Y(GӃhՃtL4t@d+1r} #t1dzGgXy:-ɱ?S\6x`ӲZDD/pY-&ETiE.+?=BWRv8aŁH r@f_%]6.Tǭ?S"rx˝HIp@̡L. [%UJKVuXNsSSE UT8x,Q""4JTi9eЈpˊ׼$@#dwX{!$6W%74UPgŸ\sU jw7* p#J/Ə&I%jvClaC#mm|Q][n* e̹rLŝಁd˻45ɟx "Y.+:>4Ǟ^\1c\@jdtĈjӓl(qxˊܱ^-mDP+ޞҋRN/qLy׸܎c!Ys:6O]ɘ:6t] Q r;Zj3vhkS6T{ZuN`?W8 M\"M@ Gz ezjΪUr[S :M 5Bj !;q xꍸ͹:=i|llLϷa66|-=:ە\Eپ Z_6ID7|KԷa/Hj> C!w͹<͹ K_X񍖟oϽ @pt" k!UBϳH3/1tVw& hj`* pXkQ]G8~pjٮ.!"egÁ[* ,躈%'5JA%*%:D+x'/ 1 xZ,9=dEisK5{0W`.3^0' Qծ**ZyrrNTVyА| acў3 t!VZ#+*ߢD ͙aϘI҆ҡtj%(LVi?4+")(Cxi5Yhqx +8D:uw:YƸU&(0(x ;p3쏀P&3 &u P] ֥>ZD}rsl:ϞX3ϱl=׮VhUbFehblb,g,p6!^м=`̵Iߣ[Cfa(GyrYt8tۏUUhqFB8prHqLABZWi*缵O]%VI> p[`WppgOlH #d#vH=eB]K(ETƏ.`tݘPWITҙXJŔbOqY1~ydؘJÜsY#Wm>b1;~1:ŚS*~畂7o{ E<;> >G_Iy`ٹ7S.w7/|+LʙB6':zMoeC=VJpst4FGب7ֶ,Fɫֳb?H#2o\rm9oVM%*V7}tk|P 딪Ӎ∬D_jvhT 8vVNլb%$mxL= ݔ5W̬7Fyŷ[LOei$1M2~zmΡ^Is ֩Mu!uߗ 9AMy1jG9*Ie_lVWT=w?z&U.3A^ڍoqwboH,uoG ~w-?Q- Do_ؑP1q@M]txA1'=I?[ £h 77YJ.w"@s m(-}539{R{ಁmXS/|N7 z>5b*|@ݳR6ʾ/@!cr^RPJ_%xnvb9-"C1Ə>i_>~}5Oseb>n 1 #ocvntz+>5~Q~?k rsusieR/tests/0000755000176200001440000000000013476534107012700 5ustar liggesuserssusieR/tests/testthat/0000755000176200001440000000000014143515472014534 5ustar liggesuserssusieR/tests/testthat/test_SER_posterior_e_loglik.R0000644000176200001440000000102013437306365022317 0ustar liggesuserscontext("test_SER_posterior_e_loglik.R") test_that("SER_posterior_e_loglik agrees with version 0.3", with(simulate(sparse=T), { original.res = readRDS('SER_original_res.rds') Eb = rep(1, p) Eb2 = rep(1, p) s2 = s$sigma2 scaledX = set_X_attributes(X) scaledX.sparse = set_X_attributes(X.sparse) dense.res = SER_posterior_e_loglik(scaledX,y,s2,Eb,Eb2) sparse.res = SER_posterior_e_loglik(scaledX.sparse,y,s2,Eb,Eb2) expect_equal(dense.res, original.res) expect_equal(sparse.res, original.res) })) susieR/tests/testthat/ER2_original_res.rds0000644000176200001440000000005713607476333020403 0ustar liggesusersb```b`fef`b2aUu'susieR/tests/testthat/test_get_ER2_rss.R0000644000176200001440000000142614057454526020045 0ustar liggesuserscontext("test_get_ER2_rss.R") test_that("get_ER2_rss (lambda = 0) agrees with previous version", with(simulate(200, 500), { original.res = readRDS('ER2_rss_lambda0_res.rds')$s ss = univariate_regression(X, y) R = cor(X) z = ss$betahat/ss$sebetahat R = set_R_attributes(R, 1e-08) attr(R, 'lambda') = 0 res = get_ER2_rss(s$sigma2, R, z, s) expect_equal(res, original.res, tolerance=1e-4) })) test_that("get_ER2_rss (lambda = 1) agrees with previous version", with(simulate(200, 500), { original.res = readRDS('ER2_rss_lambda1_res.rds')$s ss = univariate_regression(X, y) R = cor(X) z = ss$betahat/ss$sebetahat R = set_R_attributes(R, 1e-08) attr(R, 'lambda') = 1 res = get_ER2_rss(s$sigma2, R, z, s) expect_equal(res, original.res, tolerance=1e-4) })) susieR/tests/testthat/test_init.R0000644000176200001440000000074214061022471016653 0ustar liggesuserscontext("test_init.R") test_that("susie init", with(simulate(sparse=T), { original.res = readRDS('susiefit_original_res.rds') original.res$lbf_variable = matrix(0, nrow(original.res$alpha), ncol(original.res$alpha)) expect_warning(capture_output(susie(X, y, L=2, tol=1E-2, s_init = original.res, estimate_prior_variance = FALSE,verbose=T))) expect_message(capture_output(susie(X, y, L=20, tol=1E-2, s_init = original.res, estimate_prior_variance = FALSE, verbose=T))) })) susieR/tests/testthat/test_SER_posterior_e_loglik_rss.R0000644000176200001440000000201314057454555023215 0ustar liggesuserscontext("test_SER_posterior_e_loglik_rss.R") test_that("SER_posterior_e_loglik_rss (lambda = 0) agrees with previous version", with(simulate(200, 500), { original.res = readRDS('SER_rss_lambda0_res.rds')$s Ez = rep(1, p) Ez2 = rep(1, p) s2 = s$sigma2 ss = univariate_regression(X, y) R = cor(X) z = ss$betahat/ss$sebetahat R = set_R_attributes(R, 1e-08) attr(R, 'lambda') = 0 Sigma = update_Sigma(R, s2, z) res = SER_posterior_e_loglik_rss(R, Sigma, z,Ez,Ez2) expect_equal(res, original.res, tolerance=1e-4) })) test_that("SER_posterior_e_loglik_rss (lambda = 1) agrees with previous version", with(simulate(200, 500), { original.res = readRDS('SER_rss_lambda1_res.rds')$s Ez = rep(1, p) Ez2 = rep(1, p) s2 = s$sigma2 ss = univariate_regression(X, y) R = cor(X) z = ss$betahat/ss$sebetahat R = set_R_attributes(R, 1e-08) attr(R, 'lambda') = 1 Sigma = update_Sigma(R, s2, z) res = SER_posterior_e_loglik_rss(R, Sigma, z,Ez,Ez2) expect_equal(res, original.res, tolerance=1e-4) })) susieR/tests/testthat/test_small_resid.R0000644000176200001440000000050314051743475020216 0ustar liggesusers# context("test_small_resid.R") # This test comes from Issue #7. # test_that("susie works when residual variance is small",{ # dat <- readRDS("full_data_1_sim_gaussian_null_1.rds")$data # fit <- susie(dat$X,dat$Y,L = 10,null_weight = 0) # expect_equal(fit$sigma2,1e-4) # expect_true(all(is.finite(fit$elbo))) # }) susieR/tests/testthat/objective_rss_lambda0_res.rds0000644000176200001440000000021313607145336022336 0ustar liggesusersb```b`fef`b1|> f ft~VVr>-30pi ԔDsSTS33T4 KTcd$ӔscTSc&$}yPØPozfI|r~n.L IsusieR/tests/testthat/test_susie.R0000644000176200001440000000336713612573541017060 0ustar liggesuserscontext("test_susie.R") test_that("susie agrees with version 0.3", with(simulate(sparse=T), { original.res = readRDS('susiefit_original_res.rds') original.res2 = readRDS('susiefit_original_res2.rds') original.res3 = readRDS('susiefit_original_res3.rds') original.res4 = readRDS('susiefit_original_res4.rds') original.res$Xr = as.vector(original.res$Xr) original.res2$Xr = as.vector(original.res2$Xr) original.res3$Xr = as.vector(original.res3$Xr) original.res4$Xr = as.vector(original.res4$Xr) dense.res = susie(X, y, tol=1E-2, estimate_prior_variance = FALSE) sparse.res = susie(X.sparse, y, tol=1E-2, estimate_prior_variance = FALSE) dense.res2 = susie(X, y, standardize=TRUE, intercept = FALSE, tol=1E-2, estimate_prior_variance = FALSE) sparse.res2 = susie(X.sparse, y, standardize=TRUE, intercept = FALSE, tol=1E-2, estimate_prior_variance = FALSE) dense.res3 = susie(X, y, standardize=FALSE, intercept = TRUE, tol=1E-2, estimate_prior_variance = FALSE) sparse.res3 = susie(X.sparse, y, standardize=FALSE, intercept = TRUE, tol=1E-2, estimate_prior_variance = FALSE) dense.res4 = susie(X, y, standardize=FALSE, intercept = FALSE, tol=1E-2, estimate_prior_variance = FALSE) sparse.res4 = susie(X.sparse, y, standardize=FALSE, intercept = FALSE, tol=1E-2, estimate_prior_variance = FALSE) expect_equal_susie(sparse.res, original.res) expect_equal_susie(dense.res, original.res) expect_equal_susie(sparse.res2, original.res2) expect_equal_susie(dense.res2, original.res2) expect_equal_susie(sparse.res3, original.res3) expect_equal_susie(dense.res3, original.res3) expect_equal_susie(sparse.res4, original.res4) expect_equal_susie(dense.res4, original.res4) }))susieR/tests/testthat/test_intercept_standardize.R0000644000176200001440000000110613437306365022305 0ustar liggesuserscontext("test_intercept_standardize.R") test_that("scaling and intercept works as expected", with(simulate(200,1000), { s1 = susie(X,y,intercept= TRUE, standardize=TRUE) s2 = susie(X,y,intercept = FALSE, standardize = FALSE) s3 = susie(X,y,intercept =TRUE, standardize = FALSE) s4 = susie(X,y,intercept = FALSE,standardize = TRUE) expect_equal(predict(s2),predict(s2,X)) expect_equal(predict(s4),predict(s4,X)) expect_equal(predict(s1),predict(s1,X)) expect_equal(predict(s3),predict(s3,X)) expect_equal(s2$intercept, 0) expect_equal(s4$intercept, 0) })) susieR/tests/testthat/test_Eloglik_rss.R0000644000176200001440000000144014057454413020173 0ustar liggesuserscontext("test_Eloglik_rss.R") test_that("Eloglik_rss (lambda = 0) agrees with previous version", with(simulate(200, 500), { original.res = readRDS('Eloglik_rss_lambda0_res.rds')$s ss = univariate_regression(X, y) R = cor(X) z = ss$betahat/ss$sebetahat R = set_R_attributes(R, 1e-08) attr(R, 'lambda') = 0 res = Eloglik_rss(s$sigma2, R, z, s) expect_equal(res, original.res, tolerance=1e-4) })) test_that("Eloglik_rss (lambda = 1) agrees with previous version", with(simulate(200, 500), { original.res = readRDS('Eloglik_rss_lambda1_res.rds')$s ss = univariate_regression(X, y) R = cor(X) z = ss$betahat/ss$sebetahat R = set_R_attributes(R, 1e-08) attr(R, 'lambda') = 1 res = Eloglik_rss(s$sigma2, R, z, s) expect_equal(res, original.res, tolerance=1e-4) })) susieR/tests/testthat/SER_original_res.rds0000644000176200001440000000005713607476333020444 0ustar liggesusersb```b`fef`b2:Mꅛ0_susieR/tests/testthat/test_susie_get_cs.R0000644000176200001440000000152514143475555020404 0ustar liggesuserscontext("test_susie_get_cs.R") test_that("susie_get_cs purity calculations are correct",{ # Simulate a data set with correlated variables. dat <- simulate(40,100) X <- dat$X y <- dat$y X <- cbind(X, X + matrix(rnorm(4000),40,100)/20, X + matrix(rnorm(4000),40,100)/20) # Fit a susie model. fit <- susie(X,y,estimate_prior_variance = FALSE) # The purity calculations should be the same whether or not the # Rfast package functions are used, and all the purity statistics # should be positive. set.seed(1) purity1 <- susie_get_cs(fit,X,min_abs_corr = 0,use_rfast = FALSE)$purity expect_gt(min(purity1),0) skip_if_not_installed("Rfast") set.seed(1) purity2 <- susie_get_cs(fit,X,min_abs_corr = 0,use_rfast = TRUE)$purity expect_equal(purity1,purity2,scale = 1,tolerance = 1e-15) }) susieR/tests/testthat/test_susie_XtX_Xty.R0000644000176200001440000000746314141046730020521 0ustar liggesuserscontext("test_susie_XtX_Xty.R") test_that(paste("compute_ss XtX calculations are correct with", "standardize = FALSE and with standardize = TRUE"),{ set.seed(1) n <- 10 p <- 5 X <- matrix(rnorm(n*p),n,p) y <- rnorm(n) Y1 <- scale(X,center = TRUE,scale = FALSE) Y2 <- scale(X,center = TRUE,scale = TRUE) out1 <- compute_suff_stat(X,y,standardize = FALSE) out2 <- compute_suff_stat(X,y,standardize = TRUE) dimnames(out1$XtX) <- NULL dimnames(out2$XtX) <- NULL expect_equal(out1$XtX,crossprod(Y1),scale = 1,tolerance = 1e-14) expect_equal(out2$XtX,crossprod(Y2),scale = 1,tolerance = 1e-14) # Run the same checks again, but with X now being a sparse matrix. X <- as(X,"dgCMatrix") out1 <- compute_suff_stat(X,y,standardize = FALSE) out2 <- compute_suff_stat(X,y,standardize = TRUE) dimnames(out1$XtX) <- NULL dimnames(out2$XtX) <- NULL expect_equal(out1$XtX,crossprod(Y1),scale = 1,tolerance = 1e-14) expect_equal(out2$XtX,crossprod(Y2),scale = 1,tolerance = 1e-14) }) test_that("Results from sufficient stat vs original data", with(simulate(200,1000), { ss = compute_ss(X, y, standardize = FALSE) expect_warning(res <- susie(X, y, intercept = TRUE, standardize = TRUE, max_iter = 2, estimate_residual_variance=FALSE, estimate_prior_variance = FALSE)) expect_warning(res2 <- susie_suff_stat(XtX = ss$XtX, Xty = ss$Xty, yty = ss$yty, n = ss$n, standardize = TRUE, max_iter = 2, estimate_prior_variance =FALSE, estimate_residual_variance = FALSE)) expect_equal(res$alpha, res2$alpha) expect_equal(res$mu, res2$mu) expect_equal(res$mu2, res2$mu2) expect_equal(res$V, res2$V) expect_equal(res$elbo, res2$elbo) expect_equal(coef(res)[-1], coef(res2)[-1]) cm = colMeans(X, na.rm = TRUE) csd = compute_colSds(X) csd[csd==0] = 1 X.cs = t( (t(X) - cm) / csd ) expect_equal(crossprod(X.cs, res$Xr), res2$XtXr) })) test_that("Results from sufficient stat vs original data: estimate residual variance", with(simulate(200,1000), { ss = compute_ss(X, y, standardize = FALSE) expect_warning(res <- susie(X, y, intercept = TRUE, standardize = TRUE, max_iter = 2, estimate_residual_variance=TRUE, estimate_prior_variance = FALSE)) expect_warning(res2 <- susie_suff_stat(XtX = ss$XtX, Xty = ss$Xty, yty = ss$yty, n = ss$n, standardize = TRUE, max_iter = 2, estimate_prior_variance = FALSE, estimate_residual_variance = TRUE)) expect_equal(res$alpha, res2$alpha) expect_equal(res$mu, res2$mu) expect_equal(res$mu2, res2$mu2) expect_equal(res$V, res2$V) expect_equal(res$elbo, res2$elbo) expect_equal(res$sigma2, res2$sigma2) expect_equal(coef(res)[-1], coef(res2)[-1]) cm = colMeans(X, na.rm = TRUE) csd = compute_colSds(X) csd[csd==0] = 1 X.cs = t( (t(X) - cm) / csd ) expect_equal(crossprod(X.cs, res$Xr), res2$XtXr) })) test_that("MAF filter works", with(simulate(200,1000), { X.maf = cbind(X, 0) ss = compute_ss(X, y, standardize = FALSE) ss.maf = compute_ss(X.maf, y, standardize = FALSE) maf = c(rep(1,1000),0.01) res1 <- susie_suff_stat(XtX = ss$XtX, Xty = ss$Xty, yty = ss$yty, n = ss$n, standardize = TRUE, estimate_prior_variance =FALSE, estimate_residual_variance = FALSE) res2 <- susie_suff_stat(XtX = ss.maf$XtX, Xty = ss.maf$Xty, yty = ss$yty, n = ss$n, maf_thresh = 0.05, maf = maf, standardize = TRUE, estimate_prior_variance =FALSE, estimate_residual_variance = FALSE) expect_equal(res1$alpha, res2$alpha) expect_equal(res1$mu, res2$mu) expect_equal(res1$mu2, res2$mu2) expect_equal(res1$V, res2$V) expect_equal(res1$elbo, res2$elbo) expect_equal(coef(res1), coef(res2)) expect_equal(res1$XtXr, res2$XtXr) })) susieR/tests/testthat/objective_rss_lambda1_res.rds0000644000176200001440000000021313607145336022337 0ustar liggesusersb```b`fef`b1|> f<\@ 5SSM-SMLS-,,SSSMLSS̍RM X%C c 2C%@*3(GOsusieR/tests/testthat/vbupdate_rss_lambda1_res.rds0000644000176200001440000003433413607145336022212 0ustar liggesusersy8m6,<2e(d.ID !i0E)*$EH)* )IЈ.R$(R2F|<۶_wvo\vyuDZG4vNv>iyB4x10;hoʸ?JE Mg ϲ꩐oa5&:c%8uџ\Opi(٧gf_>cag`x˛f oWօ]0ԄčǺrr0S3OaUX9)vvO9E8=[ *.s`o`"~̾WssKiVz%,M/ƙLOpd ͆E +/n6[[ڻ0<~4ހq/aGoqPf oH~* GX {~o}/%.U7py<KӮGY<,ᄍGGR Xx>8agZA}Q]t/ , *`x_ۊy.Þd sjބc5K1xElV xC)"9l4{Zie}yh O40m/0^&ܒcW8Rf_Gm9(<9E`u%+FZVBRҢ%h}U{v8 ie3%0W>y|cq/"\`o`1yC8OK},UE0;ԧ+`Ϗ?iG|jξ|QVy7눨ڞAoAY$8~Jtښ `eaǍ]2sOqG~t'7Ln -j$f,}٥Rɭ~,|j!ZǶG/pqzTݞ9;0z&=cgʑj"/,qS՜딽()WB$vx0:_}X؊x!0<ǯqũDj.a 'Ugbax&}& 3X%MƙYS08Z:vo7xWZ*o2w` 4*/9W[:fYc'q/ED?VTƓǷq\HK =[?UKcsT??n'{}]/ op8Eږ,|/ h,e!lˁyEe? o쵐ul<:1a _׿5B/l}" {~CB'*axspu4U {~R镛Os!G+ql~ӌ|N4lXF5M6CYq_b8ORW9m`pU28ҰWa)c&TvϚ/-i^T0;ᔔU?ݷWjuK3x`lLoǵfԙ- !3sh ,?i9Odͯ8w*y$J\X܉kC0_羋WG wh)0c`ǵ3ax}rv̇,1|[z&/ţ,7Ṕjqc-sWM%cO7΅͊{Kl:RZaea]}bfx(=3Q ˯etD? glDvd ;rݙ.[o϶XhJ;)5:b4unN*[ j;R%e`ph/>B-va00 pwCqz2ZnNt1ߢ0\waE/' {~Δôw`u/ mWHu ̾I1`ɿ<''ȑt߾'/.#+p sE wN曥Q8ӏa4q,79؈[bO<ht }R~drǍG4?G'^3.-furZ/4XPG~!0woGӯSqi-%cܥt@̾` @xPNOa𽿩6,RzWn6}CWWoGl|L&jPh9~E8M2aӖR_KꍼK_}ߙamj5 W.4brNh*0(}.utf9n%I0=AƘF uw1hc|7(`xrk^ߤȗ~e"1|atl|vSz-N3r?lpqm_go_\;7_X+dsêxWjm5–|0;i>"b0>5cMUw2* Z/x2 *ll޳ڥ(<˵8Omud_ڵ\wD94]zz\|%8=qˍ_ 6 i‡7'NuˡͧjpݯѶ1$L-I#0<_p|̤U?=a8_=;-wi#2k :3\?TG~g =ܪ RO_0T%-((V&xtչʉ:\~=L1u#⛰sC"xf8]+>Z+G:7 \f zSk~߬]ʔ@-q]"ey=G=KE1Z]}1DZ0.ޭoӏ;ۗft7zW<|g:`x#Dz2ܙQ\=KZ#fb0 ꄫ_ gEy}[gQ5sd= W/%vLJQoM.?Ŗ8 Ș$?U׭vbW.MNpcn0%LJ3`]^ZY)~mTl髈m>_~"/Xh*/z^I?^7p3Fn8}Wxax3߇DI|D_;n;??߁³^qNp0zD0$wt'g{'5}`.ޔKHѬ]0= ڜ#0{upW͉QѕDEO)+tY #h.ƭφ;-i ûw5,Փj/ 0:w~\`ǃe}p 77i)g><飜r# +<" {~.&_KY<ߠ2skkDm`,Իҫp iw^◊˗(|+HJr^_`vQ`$/?Xurxfk(m0<ȩׂkXl[;?3:6KZ @6 OUFqAʊy3\i=sǸz7` bYT"-nbh0'.qbѮ@ 7ܴFgR*l<s&L jc}y/]0<~{s>yX= Fݫp٧$cm^/AAӲo ?F3 hI%^vYRhg0xR.?$&K/_KʅC̖.aT7;K|_Pxijc-ۢ`mD?ݸ/l9bNy:| ߽({ҥ&En"{M 'Ns_WGwl"e/>EP'L3W?OM\ Ü~3^Dq 1ǴBo(qwqa Mʥ? m3\u׹')ɋr`C3H׹,l=Dׇfj/F0/n^M{'PUK0 .Dk1r:%viMP|ǏN\PN I0y+ֶ%pMo$K|) 'h(nWC0 %#xl/l?"U\3|t.LI90:ҭ)ky%[SlݢU Qa熮[%Cro~w(*!p6.))SK`{f>FK+ѳ)'Hy;Gjĭ/l{ao"j&`]J!s5& ژJλ)QaBQ^_S[܀/0V݇iL9#X'h{7̙5#{a}gwvӁ?wʻQb6Ʒ23}] o3ѩ;a^:5tkxWV|7e^m\}翟2l܄e05oS93}0y{B,%ٸ|#L^N?dR[^0?B| /[7y09fǪ0OSC`7Syf\4i,L:??)BA %|r/X9sc|!E Jm񇘥tQw%2$o{`rEztWRyɣo b⯀/a0,y.VnZr^K?sɵQm<`]%z'^G=vb~7i]~_d)yaP" d?-Үxt=?f'+}_.nn<{?DU5VQ]T596~FT 6 ݣ>z> d0yqco舩o+Ro`Ϳ`D%g&K/QyG<=CT5. GݏI.Ks`Imm|X8?r(!D#ݑ˃#2_/L?pA6B l?wډW3፵5 ,;%xrrպl]'v0Rtff?RedSGUeaxʗWb+C|NSpOb8;4az2̦.p1q0⇣m*t}Vi1bVo&m ߖugX*&KX9͹J!8L^9bj<|˾?1NJco|7@Gpx-8DMON K뀍0וeZ{ Oytܞ8 a媙bB_H(^l 2 pqb}b;LVQTl[ʬ_`|~4y(,6>; oV^|9c;k^)|>Yǥu%,JSG30>%&ey3>%Ir-~gW]mXV9Cᱭ펛1{JqLe4 Z !~j\ ˧cp>p?$\y 'o 7<*}r? o06xNSѻ`vi/ 3 c~{k-?ne='6{Nlt >̉_(}vkab(#[pgٗW;8HfZ%l 8S1uՅ X}f$\X%oyC]ʩj`5kV}djNMøu|κgN8} Ot^r-./ ߪÇVc/>-v?bBVߊR28r:Z w흗/Q_8':R1̿=]bvb~ DEg[%r0LFhlȟvW!M<{V;I]VC˰6i.cg=۳6HN})%X1Ba ]w8 d$gbV\CX[2NCxӘ?f{0.GwtXs}F#yax4^ϸ6;lͲ 89Ba59I]0)иToH\0N iPV󁐴vCWt|i0LCqݦ9WsIfg54̾)O7V-}믹Ix!JL4pC@6}!931j/ ܐJ#!lR8i/I)X ?)a @Fq q~ZhXZDq4ރ8#N &ۋr:ߦkaxbaYsa1>2< ;4/LTv@2axQB0<U}փh2a5ZIB `9THP4) ˉ!qi8Fѻ0 >RhUulL#u/T5<21Ɵ4W a5IQҭ+qY0yUqk&pUtF?_'mp5UܟSyGo1`\r? A0rbxGŲ;`-Ȉs )H^>rSI/DJ/~7لK %n=S$(^ɾ?j֥ 5pxN4 *3&.v6i1 }.Ԯŝ' ,Iuw5Te]iz2^6K3`xsi}Bn yfP" ukp|y{74~9'ؗ4Ic["B:S s'tc] F zg0w),Tuh3=hN}W==ĺƧDf=tGj*};}tiP(L4zxX7_M&Wg,|⍤ocX<]WpwQ>op1 ÓĥߏۏĢWSC0FRݤqAKX*2mh]}&ڹ+qqս߫2k`5Y*d?8]]ȁDÏ`Teg ڗ}Ӱ!şh_bbhg_B8gO⃶dax+*| \J_ ĭRo7vک8>|70RâFM|LӀǑE> 5m=_VL0<}00"qˎ4%IcmM;@#~^#\m^^:n.=kU;l&1y0|]ϛGY Ona#Fn^1__#bzC$ иw0n|&WZ5կcW~\HQMnI\Ws`o wrfQu<|/B8 XMb+tU`&aUn>LATUjop,ѝ'"p{:8>bǼQZkrWY3N</iza<؟]sw>ۺfjRQ9]J|)9N/X#1YYN_,j}I7i&4JGpŹ?'XVr2 oi=}|S[pqDx>Ue!=8}~qgE}"J:|bbDv"&w>Wi~wDO+:>Ru.UZ½o?yNy^Q:._Mд{~:^xZb^y)zO:pYM8gL&jr|O3p& o ÒߥCʟ/<_^\_?'F]𽫁(}ƅQtcVW? Tpo ϪaϏ/ ȍ;Jމ7g8"_` g qzimcq[1˃ YʧZp30)ګaFDN1˷Rߴ _UWOSٖ,Y^.9?q4ӛ~15-iomYg5{-$|p?)_8}&O=L, oЩwK1w.ƞiwO엔[8)%%qfmȥpmI+ql9E[p-K} c~Eq ϮU,b_U \}0/mWC;1u06W@oq>.}Q;h<͇-$fa٤ENBs/>皪W;FhlȟvϏПRmۿog#U.[X2矶e#=i17̊$ mQDԞmۿomۿۏF__6tn"w4?-6ߐ?D}wlzHĿ>D=q>qm `_p WD?&hl55602611 0 437 04 73$PLApSNo!!ףfsusieR/tests/testthat/singleReg_rss_lambda0_res.rds0000644000176200001440000003641213607145336022315 0ustar liggesusers={w}/pEáv~-Qw>UygׅmI߅(qKPܐUDNQw~Hw&'ki|ϰ 0'SEC+>FfmEkM>G"ǣ76ДdqDb\qe;,SWe@$Q[=. i2 j;spםVDttȧj?fD"h}vkrDjz){nc>3Ⱦo D(2U>olOD~ވLjd ZMC GI*6"+Q˳ I`D Y>4|QZ"݌LS1A=6I"cJιiUc["_Ȩآ ׶mze2buߧ0>#`D%33fk+4-ˈOѮk/p F3nS跀i} N5w&&| @3ZN3Y9Sy1Jc u h"uSM*»deXUXW%n(`Dͨ=15[/&#r]dsDVK{q' שc#J"wq&KIϓ5i r%YlY&8i}0QOE"*XxrۦUuV~ណH VFB$87jaH6*ۄ:|1FG1-0DPW*D^%p8^/QVO]"aK[_tY%'wQ44cq5.KO Rr G!ύr{ײ.[D*=h۔HD@Տ+1&yzYzT<"9䪁(=O)XLg4%Te>HeY0]>< I Q9 [M=anQ/aFg~G#vdQDز"w 5 !ڈnS)4L?po?HW O"Rk_ !x+0}L7ɵSW|5ŎB뗋DZw8YꙥMv7]ىH_:>G ߳;B5+oͨ=@ƫPWϖ5yp$[Dv Ɇwƹfo _|;;&$E)q)&ji'lՕ]7_.Q 4װړ} {Q"+ S̞CCK:®h@u?A qz ݰYZĴJ+_4JEEtA34~9n")g}:|=z&NƳm^gtJ  @|R?p\|vGd;3f4D rhFHSr|,G(ͱsc=FeG.lfE=]M`>Ԯx0/tOv:X̽[ntˌ0r b)/:*ꞘƢg 2!ovX1MBdɰdԕ)ݼb F;J:/#Fv04ڌ+!G!Av^ԩ(=$Exʯrf&??\5ި#V_ņjĐqȰW2&$wDzRP܌!ӴM +6NUyonY,DVk?KU@dϡ6,IH]faDSEZ<UP { ]=ie3ST7ih{mVlfv|"cѷۭA=kKN@?b+=OCQefYeJmDO2U%쓟؃.!J.6 1ΤO"B ׉{qj_!{E}ĺh.ϵ{ T *Y?Dn:"y|=_"4ޅDDi7?Y[LM7Dv?{O3g櫡ȁh%xO~x&کtCi"[]0!Q&ǹ-ygS>^țhoA=…RcgտVDm5("t?Hw%J΄xgJƈ"CssCМGƺ#Z,s\X$ZJ8)1M /5C)%/c78ڊ&uub󧡁 /zDeڻʕEjVS/Fz"D~VP;Ef>:'ײ"P:"_i,CF$8' $.D'!Mbf]zQcVlt9<|Q"SE?v0АBtD/\+'i)bwsJ' ɾD. x`ufsFm94xDW9:,.A$=^ҷz?yGh]])z$"?ŎnhTa:6'{7w+ Ȣh_v]DhgW)Ln\DPX?T+}cwWmq!|rh_^bsxC}4H1N]iPBu{p*g=\hF Bz4:,27E?JG}U?oX=Gj hM֝ar[!2<.UQv]h <6ɖmC\mѐO:KP/N{g_C$&g-PG{hʊJ|) hX'YW6"/Of{/镃 $%4vk9Y(^xMyyõ"{<lKXݟn(˾ǧ؉^h踼c+W qua\g%U?Ǵ:]go2Ьۺdl[mZ ]+%S|ۮv>+>~Gv;K s:M17=% /*@5:r$͌,puX̧xblEGco:Խʖz"ڄ'ep]uU6yÈ9`QK씋xre,Ƈ=!1 F!168Gnǎ*`{~|7)ֆN9~ oR]yCa0WzU CĈ XLmz=B{O@yw*֯n> %Efpֺ);337}kp@|аk2-#y'>l un/fj!. k?g`WvYgm+nsw\e2^g̪ݚ);̠銰}3֊~O%|S/֓WE`nI -yy(qp[ܳZ"au T/5nCϐb-ڏ+? ͒,\ep`c+0yg A+wϩoM}u^ 5?E`z cx$j~D=?سQ. O+}Y1?Cg2Y՚QNh*|65R^m8p4LbCQW)~woQuz#N=)Ԧ_rK`}КZ|SY<{un  wh1R{9|E־m$ax&@n,>j@U?')0ȝrRA܌WuoX~87CVkݥk9RW<Tv>_l0'xI4H5<4I_͗1pwި[k`i/bx*޷umqX6(+mKȓmv NQ{ 1X!>+ ݂= ᓌqhTgJxίL:Hrh "SBjO$Q0;]f,&ѭ _a ZiOĹIAN72o$,vb?#0oUu}{#q̤Y7wieҍB\u`0UK| J;s1SļNq7y>h W.$FAG+ kyu$dfCG~tp'|[݌Nq\gf/#owa@fh/P{.n ]ǭMYzAo|8Zp]ܚ<#;qREMv4`[ne.S4&? A"ko ]]W?a>YEʵpqLQ&znTQd ?M- 8bhdǬm-GvK4.4 Gm[f:9t@+@yx gM1\wxk̄G?ݏ+AuGgc\!/ tJCgn!Pi~۵/z=嫐s#DRW*ldk z ;܇}kuKMO^"^?p§}b6=\KV}=0"Sf}< Z`Z!M7C΂a&o`L*gڄǠ:>|q[& ;z00v;ȸ <_fpB}!)zŲ3<;\py7>%_{zw(]_<P%|qB4`XT YBߎ/{jɟz/K_ɁG t֮Oކ/@h(} K*0-K'S,~1>Ah&sv}ਆ^v,8!unvd7q;+;= ).+A$%5WƱ 9t63m{ k4H1oUbC .m71.iS[ۻˆF~&΅(v݆"~2 /<ӌj%`BT'ůVM"mC.L]r;t%hIGrmSmu`yy3W+c?&8ڥE8i _.7x.xB&]o~wxߐ8Yc=T ;Qhsu3PʄEM(yw/[TQ-kzE Oaz.,= |!%JچqW~xft]#"wώ~cU1hmQu^c&t|r'+2в6@ӏ>35߮|0&yzܡgo)[w:r[%/Ake5v" 3ƃU<2um9tp AϨGPw`ۢ3>A7OSp:0l֋QU:]r t09%D,Z6g'$Z銾R4wa5g@8`t%RӄUx$7K-.;r3Qq)xq[-N>,ƒ) ?3};hؙZ0]k01# FG+G|x񇂰0ͧ7V2swVC"69o :`"o'`>d)Rppv=z [H?- r`$qg t&Yh>[,XZW$xz߫#0XrӾ`7C)MrmK\_NsfJH<ڿ#iY[ ]LΈk~^$|ԭ AόMxŞZԃ+ĄĂC On)?!;+R|z,Z88n!0oI f [?@}E"ke?3N{ A#,ZÁR(}׆+CURD}-OC@C޽d%=cf^] gufa`&kЭٞo3Zs/`m٠`qM,Ukaޞ |Zr0V GLo-,>r{ɿ?,#, ~Mqi#״@Z0d?pN;?/C^MS0X_0L:EA)(>2b ւZO5`}GsPin٣˂W/ݒ1x`|?~{ntd;괙C0zR9pMf_"nX\Cwn'` wEdtEC[ ^ۻ}9}7 = rXz`G'Ptљ#5nZ Dv0MU;dCooz}` g8+Nj` Z,%pdUv6|&WU7}ܬ0ty+?ݵ%i9fS/]a)r :ܯxM2܍vO_TUu$tU$}r'nV{ خy?QraFa".k1<Ku-R@]*j"a~LH?8TJʪDAC[crcmV̵Qj F2FjBW<*vQĊuЯ,oz֬ #ÀUJ.0^>{t<mrâmС \:Y=W#NI8@ODf$7 9OLog*jl`Uz`<ȇϐf _ް䕑-m6rb*ވ̋T X=Cvm ? dO7 %ht-֖!RfnnFPɖ'/9ɏ;YTF376`( ;_c-vY .26Umra~ھ\߾ ^L\BmO`ښЅGc>".vq3t\@<˱H}g3x/W 9w07R$wIʅ\Нwc&Ro~ zNHAos}u0d(j2CI.&M-dK}kZnȇ:ND=9YHwy? MB g?l(G0#B%ƧÙw}Sy8 I;Q*R=7T|$u709{SfͳDhontQ/97zr z?y8'z7kګ@oբhuX4OvB?)q~sGxvMgؾs;M*zk)NkW#9m S%'1[Cz)<)'SL}bWAwNَhʋNuVv*u0epZnix[9B__hU ˪cjWmӡsUlj6jCSR`ߺK`ֺi,Aߺy' tݴQXvfuD&G<*% zKIwsA`I#лs$ൔ{bSaLҡ&p*vܿ0Wyg{dzqɇW+WJ9d@*qU&L,oR<}dpXʿAwg7XWu3K) JgdHU;}չׁ,r8y 0 cn}6,@~P"6쑨V>o@7!1e{6Z`t\8[ߒ ?vYѥ)F/MZM P|Y>a>[ms]7{KBo1vtNs~ˆqρ<w횽) Eo{D O^)׍&ʛ0L;W(z@1c3r 3jMuN3Э̿@N(A{sə| W(i`Ɋ\o'tZHt/fhֱ"^]'0ҳEh[9MK ~ xjބxM`D6wN; iw:` F9Ag ^0\U0A| ]E[;,a77D>gJ y B̨S<1C9?\ C޹v[\`H^MoT*?gmnmx 糄?*&wM[A7^a_ a~ |}Ga`ogwQDS$y{ijKӒ*)3Mh:ܝ묄,ֳ3w*0|S̺qeA癁C0H>ێoWSUl an/F6KпYٶ.-!4؃:77?=! z\} :zN$|C}k{!dG|9s-º{y zx>!>Ϗ t #˕_CYUL.m83:[^zRfOKy7|@0\6N3V\;k-:jnR֮#[V{03viyB7 ::sE~"|կY`)y`TM\Xi KK?oLΧW^WŲ:k ^Pk ŷĿJ v2<9ю5L˙ؑWxQVU*g$;#*Gb҄7/GF#?)xS{`-py iY[Y) [}pB؇ݸhc.]9枇I12~f2 N-JԾi}ڗW >uzz*~-=`Tb><~wn$'(p>t5A^UMm)C&![S{Ko;lx)2)<-@?U[FsAkU%*_ '?qv%lL %ڳmO5ƍo ILcHȞ-K8?wBh$Lr2]ɨ_5}pb)҈.en Qj콮=E\zɸ-Ӗnb:Ӥ ?Us;*ݚp~u-%G8p%3KN0;-K1k]v\V7]7gřKbpEΎ?TS}_D)Lړo74IazWZy1$~#XͳzJzczbFFLۘ#_"cr1O\QFJ\\"䜅y&=i+Mܽ5c"m/RͲOn/1)UԵtQEӮPԵn寧naj;q⪧pq]Նa.(Z.߷a"9Lٴ#M0x+tؘsӊVcr%ӝ"UBΤqI~8^9]7``2%_ӄΙ*@l]4e& Uxskē{}<;饙a]io*ʮ* _#6IUߙyK}sk8kbO9'g\i׆qD$@gCз8YWk3ӧT_aHLh.ʅI9gTZNy4dV}Q{(7*Map LQbDLQaq_ =\R;NӶuZj/pC/LܵFYC~ǃpksUC3/I۹qfMu]Li-1 bC9Norޜ| ɶz@- +};w8uL_-K"ӛ34I_pBWmYўu>ټv$lEGpo;0@WOqCv:50l6FYAkMp]rq }/`dr7I8!QWn93zy4rxw*Ѡ{ֹ7)-LLT1 - ˞u٥͠yP+SSR_G~3x9bwU.:G> W'z9cЗu}nGm%z$>{L_rmBgE,nuԺ̶ƭ^]+@g1}b =1qLKH`?]zdoA"7#z8wߐGM 54:K xmU`z]trXw`|]΁6nUe^e껛 Or5bƝ⿜NuutŜ~";-.bc 1uA'1>8]<^`WQœnY)3- 't6F|< ^l:r&_ow al0NvL iB-/Z\5yH4:g7)85vhoPȅz 0>ZtLߴߚYc ͸VSO+uO ad9 ^l#oŕfɇ~ɧ/bk1T50Li,Mh<2NTykIjV>fމbz\Ą|s*xϨI@wvHar57~ץ2]nPv fYQqرW+\cthR䉋;:qL4޿249v^`1#\fskwv7}+v)eryYsx_ g8a2% SWG?{c.('Z5`w$j^Ƶ)y+.kpsUMA&8z&S%юnr>sԃ)Mj>cֺM0~ϲ%hqm:7,4;mYMN \t`ף@LMIqeL{1 U7:i-SxF@%{rZ6c* \Fz:%/{/j}ў0qSn[YS'VsN5c0jߖPSm0XuFO_Ǹa0Q$~䟤IBa!nݵ4]1'~ŘpFp]z85hez L?1>m`Pa0 '`f.Dcsct.(wunvL*^CY/o>֋}&\kD]jW{!vSwosL8&Cj>& _ Ԅ 9 M,hfokc3UܸY^/[ӷf[2,&EME8y)ʢ2N׳d R:ca%T´ç O[#i6^kQY05cLŬJZ+l"=R4[X-CW YgP{<ԕ fn?]v5[q05v Jd/خ5y|;wINr6:9{.>q*'Dw5cyƎ>Lt~;tf2K[ChE1tZ|<Dr]99!(K:PvD릸~gpbo78?җ521ieB/Mhf'b@M|ޔR>$`JFМL'}ԑEN֘`s'7 Лl{QS;D6Dc-Z }KtimxBE.?W@ }q>y7ؑ6ݬd/gG򊻇K,6i {"_KgAFǡuyTݙvKN+{ ,>k Wר)D bK /LLL1pJ/k,xpUWl^j֬~CaO nE7\q]VߝK+h"5;۷craYn|?@_C/s6@*D'^`j_#L\"ߋ_v'}g4ޏger#Pwp;K`ȺV Q\SLy>ܸpv~BJ}\1_g~;267Aڝ m"M^̑ͅkI0IC'?o_{ *m<'3N qaJ7|Oqa㾛_Ø/7Hݗm]md?&;8VE!T7Z++31$W98ag,i%|?{n>gBYwO:]bnhdFlGJP_ ǎ7R0V8!o$'oddp1CCyFd7>{M70xz/Y?susieR/tests/testthat/test_susie_rss_get_objective.R0000644000176200001440000000144414057454621022633 0ustar liggesuserscontext("test_get_objective_rss.R") test_that("get_objective (lambda = 0) agrees with previous version", with(simulate(200, 500), { original.res = readRDS('objective_rss_lambda0_res.rds')$s ss = univariate_regression(X, y) R = cor(X) z = ss$betahat/ss$sebetahat R = set_R_attributes(R, 1e-08) attr(R, 'lambda') = 0 res = get_objective_rss(R, z, s) expect_equal(res, original.res, tolerance=1e-4) })) test_that("get_objective (lambda = 1) agrees with previous version", with(simulate(200, 500), { original.res = readRDS('objective_rss_lambda1_res.rds')$s ss = univariate_regression(X, y) R = cor(X) z = ss$betahat/ss$sebetahat R = set_R_attributes(R, 1e-08) attr(R, 'lambda') = 1 res = get_objective_rss(R, z, s) expect_equal(res, original.res, tolerance=1e-4) })) susieR/tests/testthat/susiefit_original_res4.rds0000644000176200001440000006373113607476333021742 0ustar liggesusers 4V0~CDJH)&Sm&L%2$ 21djYST(9}zײskZッu`i/6BEPG}e`v6TR,]2ePyYLB,+>`3X~9V> ˔+'3x09~&a*2PEE U}ɖiim{@D|ioKo^7VUÛN/']\vZ{4HjJ5WĂӡUt"Ns7g3ƃSld ܤ17E8}_R՜cl8c>`sI `[§\E=U~: }ٙ; W.W߈IJ?}o-LJIŦ> ;z0}^cc Qj:y@,n:5(GOlgY!x5sJ*;_GTKK2366\r߁K8Y=Ƈ:Ӕ$0n CS8mV8'.pTWiոmٵ\kw? T'^(iUX=;'t$b>of&}Rϥ*V_RQ)0K3Ɉ 03.^y ̈;¥`e=<[_߱9&J=!ͷTaL]U3O3^Znr>nYVvmĻ''cJ6*dX^ivX?o\E'ǒ TwBMˬLݒ7iñȟk:΁|a8unʡ$@r>ZT&sbTWĬ#vEn ggaNFoJ<7>>9-Xj=)0VW=T]Q{[ΓTf]&{躑,<3"50X$ul?kk:~ +bud%=~v !ɜSg}`Z^&f5 3;J>?plñE_x(\%YvRi:Wv! >DM*yw^ z!pjŀlG5O>3@N)\5_lǷ_\5WX sCBԠ+,;* .`ql,B/%|`ѐuET֞jL*6R8A$;`T8 [ڪ \^Llb3(|lp5Jv~If۳g81T3|`~a;0_؝\~`T]e  IYLׄ&UwZ/yrCg3C gM=Sf_SI55tJs/x *+YpQP֪0J2݅x<>-gTl@6UdT_܁yzo)?m<@*<sSn crX̣ L+mc^M`|{2%v4c)?6n ?z* aWX jB WoX O6f" /T~tVҗgf$GXvm{u X΂㊗b$B)X(~ 7G22ibߛfç1Oٱ$13Bp)R/uցuM PpW`OweiSSۂl4_6LS5 `ͿghuelǛ.Ww)RA҄nن+`|sjs6Lc< |sqҡ_8ϊ}u|/$- g?>xs/ !ku`n+XfwkonϕMv7?4e65D沃ٷIa2 #je,`tN׉{ VR;WyL]`S\6D]\r3X}0IrPcK*y*u𫎞o\s@< fRuwTGE Jv9Wh8흋s7xILz7HE%r:$mܸ& byo`*tf`zRt [;Rt`{ƙ\ ԞT6s05X仫d`_q,>KWE#s`'&7{ր܇RmnU~1t@*>('hɕo WG ue@jm꛹Z8|53Ij0R]ʶ ˤJ/I2`emXDˈ#` i V כG1`պs&Ƃ5NVb+XsgmǏ>^^ӤmmWA: 31'>I; ݳ`8. v:\J`@jab<_30?~s U=V# m.`Iq|}o rFrخA/;7B?nT}ک'Xp=u4-Y`>\ڽ`qaו[1vy.X RG] Q ZRȷ/,{iCޑzpJ}c7/mɂ;3xJĖp/VOqR)Ȝ=˹Ʈ}w<NRkNILipP龪z'8_`_}{ʠJ!&e/EZ$oOd5}|%0 961_H ;1_?pI0v`#5[I5GB"2fH}d]Y*l7o:Vlېf/XB֒M)@X!1U?>X-^ڀsC+RՎ(qZWR ΃5o pF?/Sj`mVP ַiקeワy{:}ON,~i0TRIt4Lcީ(;t_E>yh7#Pt[ԎŃs74p`RШ0d(> %[Ÿ܌]=}^TGad8 ,@NL'9D!zEkuyr鱫`l%hDc30Ez_pюV0ΰ'*ܯL" OgbvRCvE0=] LS,i- =0_LǦʳ0!դ2SO4*JH15&iV[%0{qP0 93ƨ @{ٻ"PBԲ7JD8t%|ϕeH.ʡ#?vrpP|6]n>,[E@K_Ll O Ы<fH:zN <ϰI|J0VMaD+p S+窎 OV(T!2/TL>a6ϕpL={L/> 3vjωoUV8) x[$q6\"ocսi:`zF$ȌrWZq<@aoz jǸI%#;HkK&M Zm0 p KtQxUt O}{dn-k>]dM9Od{T|yvn|YuM;x0 ee ٸ(j}M@R*j&^ַ?mk*: CWcJbV 5J\_V;$Dxpo |8 Vi޴gLĒEQ"o/q8>V5c$ѓG˫߾\}v{.c{(p}#X>%_?4uSJzWcZlݝ E2m9 ؎hK͝dېES: vʃJ̱C1"¤USθ)`qXa,s,l |y>TO`mc 3X ?o 9}Oۦ>JӅm`/ϟwg# ,[o8Y,+z9WدxպYJ!Bl vN?,+3$KIUz[*W"c` 9؂>(̪FE/sl{ [0țpz?ׂWKߒ>-5`^;UكҸ`V3c<̙N]82 xkPt0?䇌bb@URʴ7g4~[0<[a3yE-I(;Zy$ m\H ' |K*6M5൒~aV32B^r; uCmh^[NOoKkJ7!IE6f/N }j\6\[-^4fb _P8ΑOd-rZS멫T/IBs~E?xs.\bHŀ\2 AA0Rgp}׷\qR!Smj(Ak^EGHq G+i2W*܀KGuE &MeƤ3bV@Q0+%ReWO2hY .=3` "0/svvL*#C*JZLnŚ%ItK];̰ 4)wMo`i--?0Ո~!_ƺT!UŘoH 4~r7ݚsqLC%y08O̷B0?Y_x-4lwU&y=7R{; ǍזU3v2nnÎ-f,rX-(7[xWg@mUI]!eί$oa\`)0]EB \ (ryӉbwqgJ>iim\B2KbUGR}DI!RUCw_98Q5;Xi \ )Vj#o/R3;F@mkTyI*bcThe WWh\Q0^[qS}0tu5&Ym#wo |.KS˟ eX{߆4v v]lxnU#g}Zpx5P^>5IE9 IaqsR:+0,[ƹ6<'xU 0a2r/DӭC:`b= /ʗAFT\2E( q۩r"zt(RlO  ׽HOj.iIK0D Zv _>BPܦŮ'ITM|Jyj!6kdC>:5䐲|z IʏސVK)֜o9J.V˄J+xc(<0oP*fnk"4쑜T >0"G~cwk.F]2'Oi|Xg0M9߶}S _ƒp><^,W(dk<q^KP=Mi M*&G$g@ W#1`awid+LSѯ r0KFx!@D3 ȲV#{-tf9^R]s )~UlXeO't˧Z ,ukZ݌® ^cȹ`}GK'XNJѕT]̢hcT`V3y̾8M }R̍w^ i0 [Ӯ>҆ K2a{pi[:\*JD KJKŦ-u_pM-G\J>5kR .~9F?㴀̡њ dRE; ku\,vZCaws+79f)0g\FBNz0lz cպ6X~6 Es`ɹ mp w[Ai=L᭭CwLS%KJǕCfMi1@9m߾mÖR+bo3J鞦ʭI5kܘIedO)XgiF-EU(7@8E|~!>c~lب5S cٽuŬ=/~|\ .S̼ Er̉]Gތ!̷7 :oG[5KHE\}䃃 `0]99LJmiL/ \ KԧoUUY@޲js5hļ2m+^^޻7_HuhSZ2wgMWodffj9Mf9=ؾ#T7t}\[֩q%RM¹`֌E0-!V7 _B(9#@>Uu0y 3]JLEjzd ?YZzt,:?|ޟ-K' y9\3C,g/L)0I%3~c|'aN*} hN$ƻg |0\XOu0Iap9'7uơ0g6%Q F^tL#0" O]>rIroxkZx ,(w!6$+k^4Hv( إ) euBh^z*|z!ɴx-Nk~G|| YS\}CR2:/UYӇW:4NK] crN54A/PD| 5}EǓ3Aъ!PDO؉Bq5lͳVǒhcE kSӞ0@ei7VQ-n'aFsA%:Ø V+7/* .7.sH-Qjk]zub9[GkǢ^7nWS2h8ichw ;(v_ڕUT"eӞèN I̊!hC#fJUsEM={!S.>DPQB5>:C.Twd4]]7Q0͟o:qe7 h"4@׷3߄ жR%l ѻ7D zD;@is!WA9A"qBh?y,ANh9OCgRmC'?.GǷ.v:ugvVXcWw_-DiK4=c9$䋚KV@})Nhf2ڭpǛǾwB4~HDdXyƸVj1|ӝw dV7sԹb:>-D+s&/+lʊ4A %Ra\<ⴘs!,]<!JS? X+k қ*B/3[/I:L1ZoE45}AT<]t/*3Q}=8"MsF]OB>GAy%rwZebU#Y&GqMtF!4XKXnuFݦ.w}.n[x(=} QGt9+UEuY5~#t[yadqQC>UӠ@o \.Mum;Yq ط?u>tgC`Cp0Qz2 InkQ/o@|Eʜ%!N8Â>w<.Q׼(D\:¹(qj-/Q" 5ϋA]6dB9^s6q=noIzjI\W n76SI{6vڛkl|H^ꐼR@$2,=XN$дTD68ɢsэuZoϢ-ux2 ^iq]^>Ew6s\c\QPciq(QnU QsF;DAf4/e:5zWi5iVig::л}&zYo.{}>Өq{7Z="!`'c"ݒ,>BãD؀sXv"lTҴECIMM1U\xO OG{tI.h枧^ͱlp=j>)J4 kVUAnh9G>vCޭ n.)tM62US/m@==J!E}4hH rhɄhkU@NGCoݘnC߉1( gQ}K޿ʵ86J%gB%BehT)m7TqTvScUj;=B[-Bώ`;0XUOL3A\9 }J&Q4]{h~} :¡oK4NJle^e4lSi_8 gQD};''3mG5~s"Ng˘fФJ۾Ob7>X6fsGj+]f} . c :N{|)P}3ckPv“;`0}0l:/ y#("̈́C [3w [A? [ވ· uLwȄoc)-#n–aAyit4)8Yfmzy_1Vx,6Jç78帠ʚZ`rwlXֆVD]'ƿV#6bvz͒-.rx+zS&-sy܊G[CV'k&ͽDVѲF= GѯrGZ+8V}N+YI/9{%>Y+vY, Y^{j޸Yns~Y,>[p_(QP0 phFOչ} ծsoMy:t7@) VIͣO^N⡓фϭ,PFO! z4JQnUTz~ ۨNz!4nqY㛤HߺŞ"CyNGZ +U{4-g_^mv"۟7qQiu";h[‰SG`V?A";w Dvn-|d xH磮+S4h̜$pwnPﺷZ7YmQ96x 5 M̺ΫGz5\ǣkuT}WRPiZUfs" Q픱zc/zsen|`6u?hpQ@1C7>';GxoGD7xbήBgԋ|zq u-ߡYr4o8F1"^b3 r~Q9z`*o.[֟J1atyW*].? @3vFlLF%*{?,y6Hv=M2 uCשntj0Q@7?dC%t,|c?":xk6ߺlw1y*ae۽Dy~:)ϣ'n4hNsH%Zz=G-mmKg]? ,3Ox#AٺoelϮ㬵\БHIw^[3>nڼ~ z3P!vl.nMoGfGv^R0Nz?{H[%"mvTR~QgCm8Jmڜ=$o\d@Psm6}ۥ,kǒʛ z`a4cȥu}LS 9iPO.<$at iEsR=ͬn<0=9!~ tT\㡧q/Ըz5bӡ hhTm%Ѥe$~fy[7|Yy;wI>ܗwz RXr|}+߽g'!LFԃG6y6R[_ fiWP\a849F~t'`o;}a8ߍ w.j?ܮ0DٗY8#e%wx}Ű6WIeF& ѫCokAQ=ѴAq#rrQic\HZ=/JV9=O҉Vؒ㥅u=%oڳu[p{r/kxZ{y^a*wm E SWe~=!uԙq=kIz(.eFqFc!%^B|E⎀]׼)&0A*wҶыŠӚ#_V<酑_¨x}ʍ eQBR`H 2ѣY>1aN~DroZ(]0LmpҏHa:r@SU{Д7D `L<.YD]eGҺĪw*hN)أDw}h2H{Ofѷi!%al&.QiYCҜtq^׌5햣hՇV.5 k j腵5(mj~(i#kH§hyGG)]?jDѫ\FuH5QFvР*n;S.hFy -6_th򅽲TMOYeu_^ڻ"kVo6臯ywu4gFCkucsu.x{Iy1( Zt|GEN0I*ww+=Ci䁤YtŏkM{5m)==&$lM*l/OPi.ĪUVrח_kǨb}"_H"z-~ëh(&O4gz;۷n>b7G&47^u:(m31ܟ r?19Qxbs<{$ӮO gEjnp>1x*}>'! F-=OocZsfVt(pGͺx=nշE߯t"u=Vz'xoY^xoe>oe@Vm$橠ۍm"۾-eyBcK _PY5C뫮dCuŸ?E}v%9ФD#0/Qsa㴆Q ;|s(X{x1!zNɲ#^bKGP?NPs&"KDs=BUr_@oe&JW.wFt)34D{6vtMgШ/>AOаg eOWTs0DsrxݪK~zXrx=ھ)pqm-U/D_|ÁNKAmuaB#F/ ݛu CK.#܇n [۲dt[MR"2fEi#eh&j v|L%#c #? Mw gaN;)!nH_ }{9BB)H 1)Xv;$W&AGn-&VԼ/d6Z±VtrA juWS+k#_լZϒ&6FWR(ٲĥ4uZĥ'{2K__AhVHOϬ"4%<~놚B\a\%kՏ cC޵'!0Fd@E"cnOr:PsY Q&M]h{2([?F2ːF5oDHjڑ-蚨vG{\ruZrorH~ hӯDrˡPVTVۉVSek|hB2:Hni:YhݼiIg&fQXNݑ9"h7&_D)Q!Y"/xbܑi/9"bvZhHn"ru+zOyU+LbtW6*G_ۃ%~Zղ. Z|@pf^`!|^h'm~xh_-`@pwR8Έp{wp{g-e/_ɗ| |U"b&\}d<]U/LD׸w ҍ:,fA"a}|i"1t3t~`mdEW T y@cPJ)t19~ZO VnbEoZݿ6Mt1k b旼fI Վq;Wmg͚5EѪЪnhnQg?ߊo NG~лwsuI%1@~> V-dba_+0SOx+ \M`(8;0spPMI>zCD _ԍ^V 5aW]پ=4 rAkIo-a,-*0OG?i4aojQNc tK衽C\~D&[+͒DP((-T8x} Ku%ݪ.ANE C#T?ƕԨeE^{F*NEωG ?u)GTiPWċݝA*w"]"s]) wWtC7H2 pmE#Z;9|^;<-{|$-e;ɂlCuY,h$oYs<ŭ: OW؈B3,qh5|\u軰y罩d;9qOSþ,b4ݩ=diX4RR'K]חP KzKAsl$O*^-Om82ujQ3J}!_i3uИo04z hsƧSv:7{7[~Ҍ)A1..'8LjGO*uF2և{m+뻯K~:j[cz㒒W{T{jI%\./{=zɧ?!2 DfihVFYZ[& &߫bXMQyksвf:̾zttCpCYMVBn煆_r YrRћrI_gh4&XEP =], G%7< vGWlZC #h9kJ)!ݨ\&k+ŠcFGV=?΃ ǠOXWX{4u0b{H<Ի{E(%Kse%z‘}54- Q -7ڽ1,i[Gb%wѝ:fQQecdĮVz=(ɓ7+=ٔzhzԄ4×FW^7^&/pdh6ʥ-0/Tgb-1z3ԗ13@[W/gFIɢk{sЀ]A+ϻsûJՠV~Ȥ}{O}З?:+ȱ]֛T;%2n=lr@7e,A[aݚgGЙ=jV$qx#Qu J\<΄H(o޺w-QS@/^a B'mcv=u&ݨ՜^`Y^NTTn=n7q[k谼wJW޳.y(% ׊I/ipoItKz9 .O~ ٿmh/ډ5yGr}zШ, 齬hƮenHM Ly;3$wF4kGg螣I/RК= ?>lzNoA߷D66\P0TN~*=a}h=t4*Džzx0j>5Hzoy(j$ qi'Ao־lb]?{WqESeyӣo>ץB;_QM![R~]H=j]WrT6@o)nu:t0zmTىjԕZ56n+'_Um/lm*P)7qs\Kޯ+ X_d3]oc +~~ ?p6Dztq9Mi&(égbӡ>l~jh!u:_>p;ݺƺm6fFkٷVܷ :Nz}o:9Q} =UAs%rA.E (E#+ʋw]PiG>MѹTРz];X|[;׻=S<)1El()N.߆edWlt>VNvܦw+aÓT0H=}r h1dG* -0Zp1(F4/{m^A}=uRK^вDz4r˰d0.)}&V#hO|% *+ 'Kz>0xFu"# r(Fom s*&<0xǑ񷏧rGoN;CM64 4Ϣ MhO7mп*|S*MFpdjJ*̔L%%@+ӕDz|:[`bxK֒+ʼ7O-^ Tlu8/ szVf;S{2OJR}7KʷQӷòPgjrah[mj]!'4|<%subOB}W^<5 @y40?Xdjh;CsIsG[PC-; PU}Tj8g:4SZN~K$47>~*zi$lXRhZW@4BJт+ӣhgڤg7.BuT(h'zMoy?1[+=h̰&3;qHx_t|5:deEt7t,v%mX)IEVg956:BluY=" jdeF9|3GƘB+CL})k{K6eY}o%=ʖpᴈeo*hnɹ ҍ~L鉞1ʅm,p>xn߮O uMQ?iuEs9zK( *C7eQJk6;sedz"ˆ @ܠ7̰%DlGe|7~Qq/X/uRq!vWMK^Zjr>t@Sp)2Bs5>RwO}sқo|cO:IxTNZ4/#V ֧F*A2uȂtu9Q]*i&4Хz`EGRcwV珿rpe=\ڌ,ӘW^Aqh{hcPsX ѯdC7X[q+ː-^[3;G#⹇6 t{o?Xyo&ɆU\h˷N7;U}|]?_&.h}0u 3Unh&z CPI)߇^}x C40'[8rWЅ%TB{hVv4L{""c]^=..>V}dn&}m%kr.{現Ydp^.Yuo;Zsa$}yڃWhޛP}Z<:-2V^_QQZB}m5o Q/mѯ/-wAkޞ1@ɓנy0?4x$(R<0پЯ꬯('3@2q/ɽ#-7֛H!dMtaөF/Q{`?[: hx{`TJy#"2"ݜ7薌?,iE4LtzK{qDԿ<ǝe`qf ti#4I tMzO6rwEY ~OzA;b0Q7qm4=5!?44(ϴK(<̅_"q+M ^Fg ^PLo yڮdL6y:[ \o= WY+cnzك ;nMmQ̴%ô宯,Ve9HY6򏽥IX!'Prd ,qw=A|X=c,rDFl$^7ПN~?rv-+·|mYNaw8 1(G%ǙzOU~ctt;ʬy6J'5&m-=a$ ~@,۬mmTDW_Y/2,ZTCQo3XtmsʩGm[)Bۼ$ۜjhct^տ%:]zzޕC}SΡZBh\ǫhȻ}47r[lIÐ_дdtf2̀ԓ \(3 2jPFͪ(wsj~O*VR~:2lv;oDNpóa/CY-wqC*mzV^wjAd0z_P߀z(0EN@3$Մ`D_-ș) y ?чE`Қ:Q𻽖7 F+_ 5s_aLXgn46k8LϢ#IhBڝٶDx8sz {Cp~8;j-G;3_`hlT郖TUIUHk 45o[ҹu>[QK܃aGՇѧqh]jȒWhK؈EXOYnÛhAKK&9HY1ļ| 7@7p&@$ ̉X0_\j|TM}AZ{>S}b~ۯ0u Kr犿IO>_RC"ZnV?’8jםgBU_sjwtS$]74uP7/*ۉ!WrdCJHA۱]#kszPqޟ/=>l.d=Foӏyi:D36/WTD~B@[V\64ϒV*.lTAs ץ@[՚sޣԒs9J--~ysʲJVhBzɂu(,%aug$XnޒgG4I]}AKEd,]G҃=]g$p)&nƙhac|Mc']&<_„W9LxszB&|.uXпbJ:hqZ2qxH M,\Y}#2^k>\Y\[DV<([s*쿒 }1/^x01Z1f ʗjTWh~zhiAs҆p\< O1?q<܏n{ =4w\m,5Ki䒅28&rڼ<}̬-lsQa?z;X2v0E&rч?_/+r-Y1?K1'/95Y.xlIG]3%+?`|<27-KvnYQ{JѓPr(<92=,LWͿT} UR Uq=}!S-W*#0ΌW^TxTsyuhKɟ|Fj5BgOA[҇y:6/S%|?rѶ=~%Fb e.Y۩"ϦFbo`=Ͱ8O1!0ךH<^rxwD Dkݏ:L<\A5>V@!Jc1͍wk?]][ce>'CSt^.6G7~Eلɻ|a[;uXKWX~I%5G{'^Y -.Nۻdͼ~'ۘ.Y9J\KVq C7Րr%A7uϩ=hO1Ctv  uL@'?3T@F='Ρ dK1CTFc0YyA5Ln+< i&0coOޕ)W ;?) ]MTvrF=x4['D*u*D@ g_hi%4q0ZڰZ\{6 u(YuxKߒEsڽs3QKL"u3jf1uQC=7XFY]ϟ}|ψ2뎨w~[F gwO1^ͮM??l=x>q3o_֗0YXZ[]A [m,h$D'g>eC\0"H*׭4Q- HRAGO o)h33fqBmTwV/{|*U;ʲ#kz`X=P7˻=恕 C's:q8̫F 5*B: #-J}#"]ljYЮ)<t nfZ{nы]:ڷƶzuB `UI]/ kf$w_|ߤ :y׳{#j‚XTΞ I!u]F؈<i#Q:VK?̹MW0ağOdwϮs^uVEB-eFc4TlZY?F#QzpEApsh>5dKY yz/"x8Gy ƴOɄ;iE@bpr4} l2oDi.!͒+Uf"ů1m`= tbNQ,y7!.k"Y[ Cf_Pn!NIVVGIkUT.5yU=7nwXJnW_ 7IWj (tS6g;_kϙ~躩 `[^sz`&YQV[FHYX'&Swbl5ӓ c_T0k\p*0u~6VYivbvmiPG6!Е >~/A~; ?%0#򦵑:.5L"~,\㖃Cb ǍoW埒b:^c7T-8O7o9x>nAm .fF.G=]"T.qǿeKÎͱ_R1E%3ӡ/GkF;#ݤeϷ+<߆a}4uTB6ۮszտi#+E__7"3Z_-܍IOFg?k{P^OD֊ls_k+ufz[v |X]X䯟s쿯'R%i'W72ԓĹ@hϵV=q?Yߢ5 Q-_( @hĹ=.!='叉j`kgeFKBXR_U?}Uo,?Q;BLCR7~ɇPYP;,G!^l2ГA?6j{H1tZ/¨WB̋=&i]bvq80C5$D{&C{ <i3* ﲪ'qs5DB*cWPb]+z!R3ڹLa%tkf^xtQ!a5QA8#p?_pǢE4^G]bQ5"Z<@=6?gѺ+"g }YO򖰖G=n5kZ;^ R^Ș9i DDPIz3{zxhaca>5'#!j˧r\"kqyI KQֹ Odw'Q*6|dHxSs_0n6"ʦ‹>Q3v5:cuR$*cG;ec|:k/߮gkť&r6H}|:,UP:]v_8,5G{vQKy3FyV칡 n~cdOڽ5,o_TQtHH;V29q9GO8nON}k \zni^ c'Kqht\V_Gle_lptȷO~([)fV`@ȿo#a-e10-ѡ'Z6jќ8˦W ~KɆvVm_ o˓u0Q2׆WP6l+6̀lcm~Kh-KCKԖbecekcne-=i&G!&}susieR/tests/testthat/susiefit_original_res2.rds0000644000176200001440000006230013607476333021727 0ustar liggesusers 4W0~c4* )J9%I<2'<BHe!EPJ"J~{߳_wֺ>}>* * jZj *jz)(:6s="> 1VͧN^GtU6#M9<Exy)i7iΦ?x0E H5ڋ@ + kRh[j ,WE93@ .q|x$}1(hlQs }Ҧ%s#1Y oZwTgϝGSq |6asO;W׎ 5o\r?WHщ%;@[eu\ h+pm }3>&U:>@@Zˣܚ7]7|ibc1Ī|́$^_u Dmܡ [{f}9ǫӻ1}ݤX5ZD/:ƺY +@S꧚фn-+ARFZQ,G΄Yg>+׏}YpLv>x8&2 S #Ecڕ1Cpxu_չ y*GG?Y !8O@sϗVM~jm`[v hzۗ&R޶ݭ?:9ݝr٫3D+Ǭ`e&g}~L cU`?Zz5]J8YCu?M],ݕ||U@wwyХat)C2턝@g쉥\r=t:xcctХ༒sX yM,PdeW]5ˡ&ڥKiFRh{9ITPY0nwZD =FYҵQP'+T6˸{͈\A2#yc|){ m''rL3#ߗ{P!C6 zIk@ K~U3KQq-#_2^4ۇLe^&`pVA?0 3+ _rfT cT7|~U zzΨnBTH<٣81ݟ;^z#C 5HB.`9|O?X.'QU\&u?4<شG>RFeʚw6B,̇ $³[FrIcі(N9DS^v(f%\|lbwjg0zdv m$fk퀴`{n9nHG;i!,4+*|fcُGN/Xo3Jz&s \]V.5釄g`!pgXS.G?zub>Gu3 n?Co9b:9%ARuhv:wx;JU`g1JXZw%;u{oG?G_EM~<\Oe+}`4:wE-ݭD?1r^~'R]1ASȖ>jW 4$=M쬃)jl%PƎJt>UZs_?> Fy{C'#(з}`{j0iyYuP W51,zaѯu&h=YvUt1{A0yaS$a -,!6QI)Vf_Q]Og;\O-P[ ju/S%Vt_ZMVKtǴwՉ[e]C]81ͪa؁>]pQGɎ Z4`q8x ,NP_,ӑ,d}VZVebҼS-¦p8;h+*8/S4w|p:X1w' ף*ɥ!W6[vИӸοvMs-Q4`HYq@l*KAyp)=;]0_}D~0Vt?Iڢ/8kWg: -9WFD{n 7tF7hFDwv1uW}BUpA ߁w \[>\` \]y\:S=oB:BXصC2y7d tNOu s|n :J5Oα#AG1f=%gs g&Foؖ})bwUaP؇Uq]UUOGp mUSALcYhl6F;jQf^sbkFk=κoֺ6tl3{zA3Bg T۲UBR$%`)Ř ]ݶP/yX ]iކR_ kw`z#OUśRʩ% *6ioiT ͻ;xp+ZwkFrno֨ybx(7@K+R9H8֠tӀ}^_XN_wUnAPWY7:[zQՠ$wZ5P?B?ڋmF?P`ݣt‚vW7v1b$.O,:x$kk.]珑#߂ڨp}bNhnpb? MY*s}>g}3N]Xt C։}PyFTS0=7ڶ9&oc"eQ9wP+Aô؟vS'bL*C $笣 =cݔi@}M}V1뜗~N6H -m NAgsSM׀t6@: JAgCpP^1Ԡk Z{wG'P8*:f W[}6Gg&sjfe:?@6pY5-:8 xsk%] ȰHl@VuxV'@{{Y m=^?$ܔ{`{V̾츨Duwf샷 >7lٌk*;y;JXk a5gh ϊܺLVb]?}|̸3p=VEt"UrQX-8pkqo4Y9+}^nh\ܩG`|U̅`1ZgrV`5q3;+O݉F'qug_wka( L`uv0]S\ ݳn[=9:~V?Dgn Π9L4 Wml' }:A?wH[rB>zׂP9OJ埏XJx ³r 8>w^z׌nUe7lm|Hq!37fc&Z=17pw}-옼WOVg/rU࿓㡹Fx3OHR"[gzXV]tqfB>utT(t)͝_#39y1w"MתVJ`Ȑk6l|.sc[y )wұbk ;rtu%k1>ݚKa|[ʘU3(B^ B!UK:PߧկVBh`׽Iu0UrBm[nّ@Ү>7ϑ\yJc3p4e.Ih:Hc 'Gi320} 8?(| $:cOPӸe?w ?xڐ]:<{j?j737NDA1~:; :Y1i$pv!zho|۟V1FZJk,;To'Mq7Ou_M0~ym_\'~drY}oEXϏyz 4NiS#xA@DwWA0fL h}}jō6=ĸ8KHq׉6Q Ҫͯq}}{M3FrT^k 4A+[sӠ 4t,rzs۞J_hWӏ-n\o Z<;C)r'׹{b(;*byzOI:ZS>r^S^=N*m5-SRbmh5m#$ON^Yb_\ߙ 2O+hmߟ]x3:N[ ~t%d>y*n7{;IwZ'%k5 j@vtXU[Շ*G̓QOCƱsKD?Y1u%Pye*'MQf'~P3jNz6w4[BV,xB= @:T?H?O A!; 9vI+.Vh^L1n[]w~w~ t=]. ?g.{Š~"貥nӵg5Zf#u/L{>][/EGF7w5c߱D8NL ~" js :QS>ڨzX .4 y]|C`1M,8l aB"XVXHt X~@{8t|CJ,`VXH_Z(^T0HwL6ΓUe#,8ty Zʨ| JW\{cH |0$eO!El[wL8.P9`*tܗLSvf`)"viRm4<:Pm\KC7[E>t;Lv dM/5*〱=m,wDaZ'Mt}UPaxԄܲ.8o*T+5k:7#ܠ&83V}cQڳYz~~|H;f-sP3^+ g{5iyrKEX>ѡzܹ{6?[@.L4Cq|0V:F$1 m+uև}jQ/ۤrY׍;QFȋ^y˽Z`.{mNC&t<.`BApѢŋR-g.]RtoLq]r.r!&0w8n>c*en=4 7j%qA|QVLp=t:PͮN^}vz4v@΅sMZ4VRN3qTcy KV͑ 廠'$bĞ2%KZ"1ЊM.^h}&@H_A_Qn?L%TǝCZzZ U)Ѝl>|܏^ 5r+=ʎ\4?zw@"L3|3!V]y&q\9OOX8'ɾ ;N7<ۯ(U-6ޫ`];\!v#.hơ'.iN`|^Lbl">v)OEv}2J?#墶x,aEƫs>DK'}r7djYV]4Aۅ&!3h;5H'ImǠ{³@!,]Odt6iciF@sZ_J&^A8tN~h;Cq|_:vqGqh3>|A1Ayu?#U/<rrq}Xׅ;orx4P:)rr4Cb#ث3]~,{ ă[~!,/llQؽd)yUσY1~P|v=xv49؁߭H_7>:㢿] j(=y`rF{I.e&O&8+=OIkLn̷?!rE}8.Yxߋ< ^N w=٩ ̸?wݵSg9*ǂ3ř]'((h(((()h(Vnji0+䯮7|]US ShW~,6Y,j&=P~gͅx/ןD ^ ނf^-q֎A$hYh:E5-Ͱ.5'h>|ϠC,/|I+Ьe#l7Õ^]-OVs ߯hF|B?ن׎GUDe '3tй$Om&~+{k׷myί8Cx>7 mKAs|}N 7tBp穻k9$=-$ ݆T&j{zɮSKV@jڻ!5A}n&HuT93buZB㝐өieDqTh qMTi B-Dh.94R1;[:0O(5>Qt\)C= Gi+OCt.)(Mެ&QOlu/:jr.eO~:,|ڽ!%E>CW>@Tq!n~Nr"EIzԡC#;)>?yNor2$S=jl2R;u첅6"z7$rIU >Ty1+Ge}Dec؂ Z0A߯E"^tTK>)¸1t?&]'2ʖv"u oOJwѢ;=eWQK4 QvīgđіUgцh]WHzOU‡ G)B`l-TBs";f tN9ـjtBۦA3 TDUQQse7Ѩ?7pUgrqDOJC9O@Z%*-I^y,^F:F utEzKk RDw<ꍲ,|Gn ٌ>*D[ ‡z BXt>O̰e",m^b:e~Y[Dͼ@brqVN8B={ ]4]eV"{ eXnnG9M.؏{Q~WMoqˢ@\&=݁ą{CA|38U slߪksr^?4o_mD#zB"UGkhu0͞* G#TF$Q힋ޫPDzOi/9nmL`HÎnH8vޤ`YJۄ*q*o'Ÿ܍ B^@w&~lVm"t7O8t*|y,9Sy׫nroD$[!uZUu~ٟ:D֩A}iJh7jw&ZCgLc|O~WMؔ!r60heA"?[ATy !}׮ 6ۄ&np>F_xZnY܈hwܱy3 AhCYO4Yh[ANz)RxW(5 gt7o0ݣ[l- 1|+_ΓO.ԬbN ل eOEp|=oа;ϠA6_%~+n\gPoAfDh?w$@=]j_ҕR1&t?vUE.%6+[вGhEz6cETUCQxR]e0 | yW̛(*?ʳ gwhCQ#PTboi31~ݵa=r}KQE/| sZL}g4䈾!:,bQ{&qA#Q~5/E6 \ZFLԎ߭en 8dݖa*Q ͠~ҴFPwY+g= -ECOdBc|)2-zaK_} wY" {6/֕7~AſBيroYnrMϨR%VM?ӞBE[{WxpL5(sWP'! D43[GoH8{$|Ds={u!QS4y :ZĒZA7B Rh` O6Htjsk?PJ˨̩ҽ_;QQ}vPm/Rڛ3G/vf)ϣ.TBM{3rߓj8T;@7͒~CDRKt Ao;J4e4t%j'˰2^ =R-D*FŒ?n\FVyDw-amٹ;0H[' bA_CV ny̏۽[ӻ) :t(6pODk_܋b{M{^3e1QyyH9~єav=C=snQR [TX:& fL8}EaN8PUmBlM'׏(R+ydOtWjjwƁa}_"eN7趓6]#TNJdɩf(oT\@ghu`8m5n$^aˌިӘܥ{ޝeb , tPfg_ôv?jiUor`ߍ>G 5 ʦB/t}L4w{DDǽmDج偱D.jr"yȇl%0YL?.`Wc_mpm#SpmW!;>WW5eK +kAN\>:,UO379eF7EEe]0E]%=PUێ8T%>U伂=>|W-b$lj´5o9C#B|: 1=Єд-TvW&~DY{(QFfFTT}t m &t#}M^tSqb:MxO:-]Ylwc Rl5B$/fPHߦ <&t H+3ͪ9I7<24>  w(˓!aLtnY9id)&TwU,Ⱦ^mNNOze=*^c=~xsǫe!$fDztݡ-hM^#ۜ=oFݕNY\2A-Q6EEaPs1zn(4:/ 5-LVAM0?k4ԴVz8 5OVrAMkh%!yaoqr_ވ*xUJh ,ԫV9s u^"BJPLPGvǝQ'KT=R%]?8pQ`/TgQ3@^h?6&;r m|34F_|ܳMZLSqkHJ{y(jJýGyc uМZ)3(.М+йK 4˯ ]v"@sX>VmT|zͭq/t)u:o?Izƿ-?SDc8jߡѺȆs\"?hx\KlF+"sY8@.3Vu.Ivh'5hV{_42= ߤ;!-e/fc)ftEg0?_$x cwvtVE Xt8:M p"վ[x ҵۿ [^o&ٗ=iADP`;pn/'i!p׵8mUb"Z^(KVcZ.s %;Z7 %-w<`V6o<SC++t ,#MѪ^ˏp#2GH D&) u;C=A%%|.CE\4nզĝG9&:ތWzr9%&N"#qQwbTAɻ4D>@D"Rȸ'fFm(F,W!'QVTXڏVLg֞hk *GJ$C/]Ѳu}IrRǥϠw Y”x.Q蔚$/qE/;wZ޷]4^"Tn4 Y0 h7ƈXģ?Qڇp~яO]*($&R O9"Hk|BD|AwDWQh '5tw[:{ҏS|#F>藊&rtA$ҏfKd=;^zնj%4R19NdF0-B<)@KCV ?*e4{ '\C].cNJrQEVEEl$ߙЈ%e@7Ar9&v -g^;e6e? /^WU˚N%\-PI)uuƱYZjIy9@Y9pӻwE$+Ds%+E[9XA=(tJs{FZ֊Bk/GCF 4nQn栏y9>]{]hY6p8z$柘XQB?b/J4P[\ BgD:B4$}/n!hvOYFW.fZXWRb&5ѱ{-{'%_As2FXoNJ]ك~\Kk'/{{4΄o.stmR{tM}4jc a\(2ljEׯ(Fzϡ5|엻~P>(unJ-ywأB7]%lҝ2=nfzg:A ~t"֘oG\}vEqń JI{JS0Z2kZ^-SF3>9 HvVA>8bg'BaoD?D2rɴfPEٹBQ*4B78xA-\uf-JLh1 ^7XKS]Y %x9JK}^~Ǫ'+84xyUEp[3tOkΆ._)&T_5N'yFg}w`BOvzD$B<?[7D58R=ĝ rYQ@ӓnPBVC~h`UxSǴ:EY!/Efr}6t(Tƿ\-]ARTh1 |[AKϙgq~"0}!,lroDF?+3;xhh&7hK|!g*1m]~>~DN5ED+EWDb;'coM:ENw% wp?:˵s(=UDłŃND%geWͨkLZ]ޭ]=$jV%ٳ@N?\"cӎ@dDdO (Tס-gߎ=$v=+rf:,j,TJl`ǸZh"jz>Z!q<}[trFpqy&|':' cLk7笻m אַ/nѓraw̮QnQ<cA y P›xub_y[-->xx ae)?ڿ D͟|*jg jއz+?zj+-oNhۖ,^0x ,Fc#֢ӿo@&c%Q}: QCBa9۞<hѲLihߛhWhU ;~+<򮨾",V@^٣'su]R НrG gUpS.Q%IX W_wYK+4%-T4dL?ĉ6V}33fR%4e_.Mx>M/ ޿ްKafjמ䖀w;Jv`Ue _2Cczaq JQ[(hm_48 ]x+QGdz{a>eKH8y?OU=|gmZ֞$5^2$rs8=ul9F ޶d_O6}> V}|wޫ"='*x75puR"\Ni_q:ۧ  τ][еQ2Or?q; B_עtqo-WgK&z6{mj"F5]Zг?/BpedQ^WrI"Ea}f1ZW -<-zjKJh5z3;ZR.VyuqP1^}xȣ"O%{ldr0FvŝFkF~}n`ψW1Rz%JT@G3BL89}Vury6׊@ DTlq(}уPhͨ/Spd*zBͩrUʙz,KZo>5Fxm9al$h5Y~(Wv_ZCL_Qc=#*Y =8MvĂ!jo}!*%M Ջd'( 6RoVF{ 7 t(S#(iڝ(U Ӌ?g2]+tɤss?4$/.e S Q>v\'~ƒ'>DYMw^-_X3x/O{)}/ߞP[Mv`zNGɾy396<4O[~J?T D_v'4i'F^-i3Fu 1"/h2z*4(M̰o#'Y]Uy~W3:n̮A76Gw.3]=?vJ}A{F[FЖ=6%d[﨑lFg _>?)/CJjSu'$Rї@J;"'e-ﰊKDzC!%ynYв׻&%xx߭=Ì>HOf,A_4@iUFmG{~7BǮLqJ 5!'4ZV,̈́^?ûvnOj^u?zZf%yG=t]kD O|uw4-j'Cjh s?Z3- 'YѢ-d ۢ'Z*Ҧ&Ptؒ$$t-꼉U2@|vC<*NIKw sI1腣ΞC/x] 6 糏@PyTt{R%]j}!`eI{Xj۷!ZiT>7R1FKt -s>H@2\#:vF?'&?|B [99~O-z6"!j'ۖK%nx̍M׹O͍ThLJ˓V ꞴYPuD'gC$ɱM {{ӯrks"IdRPg$ ٸ/31yf&M3H>PsAп4KuK rC/J_ɗA&?ߤD )4GP N)̍ߑJAnK%мt Ֆ>*w _8J 5BxDPV٘e(~)2:.{1_|i{\X mMg6ڢ<nAW:^ mל)9}k&Clfƭ0:2۷P׋s<鲍QQ-ʑxz2zV^Ji^y U*8z4'k[3*&f@ 9Ytua2~?w),|΢}E~x- }bA6x[6Hۏ&>fʅuP!-ZOPC߿^|lԖ7G|F=~<̈́z:~j 맍_Q⃮qhX9u-[&89 -ҮQE5+]~Ʈ!^qQtk]^#Be"5:k5ݷЗ6GѹϦhꎽhr6˿|ij-Oɥ-,*y1pYv!!d( \nFM(w(MA{P*ܶB^qoV4DobohPCOG^D f9/C,Gk_: !+xCȂe~a T9 r !0+IHW m M\j=Dž!0)r +68Auw4UUa5&G zxOD 4  a1W!aB7wtdNUt;O_dz(\p~TJ`v|4Nx-WF\\ף]9\UѨ΃ZԄQ=5eLw+^oer~cSP$>klʑB;Jn*q[œjOORnmBg8ƾyRx Ӄ :@ݥ Shڤ# yg>CϕA!~V򴾽) y >+ObkuS˜;Bv$$!|IPuiQse&w2?N4`.g?9hâ[9c#!k,o R۟ʓ >{ZZbDdnO]nV itcTe^kSo{%)]J`swREGy>͒9]Tpp\{r1>GwٝUdEwnި ͟AwıB~osa0Wv'6C~4K΅3I|NH&ȁx,MSjjCV6/ѽҶd쯷 D9̅\`_ yTE[A'HHyL݋dFRC#M⿓D%3$q>'SY0`cUQByhrL0u-yha`>Z'VzU5I>wFy/BM#u~Ftot_%9=7 yY/{{׬iYq 7瓔R7;d&rvChzKmaB7Bu wyVХ}$ kr=1!;k-79M |!BMzP@^%-SDSB=(-3Vqa=\^Pb:^(5:7FMzA#y{X O f}aS'xlɺQ Ek;'wEuhW8ۮ85>}p["\ `-z|'#?dOr@ޡ+>W% =o-BH;5h@JSH8ٹRWL<5TC$!~0_RW<7u/ uՊ%SrUa.o?Q "лYUhMnJa/e.pn G>16*;\^f..% əC6:{|d۶ldǛv:˗<,3VlCc7+}BĪ9hytGQĪ՘'Ч5/՘+,^1#zp?w}=`[>7Hn@wؒEJ:=x%|]Z gJ0$WdG!awa$46oF&ŕjs ݊w6@r M59 8'y֡CLد;\Vm}QNG||/ q=Y͗ l{Y@vc]4Z^5欉 q{P_1ÅgѣEdejt9y&8騲7zTFIݝdCJ]X"͓vfrdp&ˡ~Ng/tfN]b|"_ ؆bWZ}zO5BO|צk|fy/WϏ4C.aovsiѭ'Pw·, MKO o9y ݶI}vDzNUc㜲AMO,a`rlBd Rv̐]LUV!<׷M=ū Qg+p6QsΆ!K^1zcW8d[6DzY'Gfou\â)"68?ӣ4J/r,?ʣYx54k ~q gUtɞ JV{~FW2Ö~OK9U塴隷.:ԛắ9- tbcŦKxCAHj:/Tk) r /Q"Z,u آuzw5z!6Eug@-LBP ׻'Hn@߼Yxac}d[ Z[v@˦ٵܠYGKF˃_Pgg/ۚ;Y-*qV~XY ~\連a$(=tO$oH%k=#i!WXi7wBH̓WQg(RJaD./>},F)oB+?9СQ-/Bт뷮 ĊNy4"c)W[ &n7BS 99W,;W)}TKNgNYO DSu1hؿ&YceމqWB Q`Sy{Þcoi՗%GNnk XrRbP' AD2 :ƈg%p~,z: ut-N2|٬ҚڜUЉB+Щ^ Tikg!k/cGfZG+'u \d^SNLIN{[6qBdy*kr\򀡄_HtYg]n}͢n>dM'sޛ$cWyaoiuɾ%J6~忽=ޞDs+bldlrɪ:AYͯdLuY }1f?>'˶\MY{ӈ]8X}Q8w6Ջ}25˝\nв|[ahIqqxtW:1;3'df@+&_E&:Q`L /OHH j<'&K=QtɼGz^T.^o=t_cbv3\AY ASNKUф+=|MO٬ YAؓ-v{Ġ-QOkPz$bo(o7ػ m*nA_5 Ղl6|eDAfR|/?V}Wc@Y-UM'޿S7͉++ j#57E;45KuEڑx #ʅ@QƅDR—̶[inEr+% *6%p;C^!#'9vQȦӢ-hG9x35Q\(n%3{Su?_l+eM Tj': ,&Ԟ] `k0k=XDzU1Z>(KzWrK}fprwxSRS;l s|3 ~Yw0:j[ryg?*Vÿl!qYSL_UO䜱25v20s#W+8d_ZBˉL {gK M -mMϺ۹u06<5ɾܯAwW}~K9,ra )LE!Q^ 3[mr}_ &Lgxa.-e!`K#LLp<4Z~ann'L>y}1RXDK:eS'79Mv*FzgA)ΛD~>q?zX bo|+LJ_і/y_p+QwmFDOḿ3uZg>P7Ȃ۩!B ޸2f]??oxA(߇X?' ʅy~.aqI5=rA[=zr [ok_o;WW T|Q!-[p~4 [er(AS\=z\ ^uC^P',z4۪.mxvXlU;K;n.V[7C) (}]\1atݘz*^Ȥ׾ԂcO̧$! pE^Q32߬'Kx}g6[گIQAlP={FЁ6'+k/6}3(uy#Y?.6E;^"[w*DY۝z۾g?#,ů+Jrw]J(c[Dya\ s*Xg[nִ3̠I?dJ]q߿◕΃SG~yo=-`5J&o)(g~Rw_Lxe?+Uu}-"!+sYwr?~W>v_~_ߗzw_W}W럝篮}_Ϟg{?*oaed|qK/ 5ʿd;c˒”ee|NZibg %N9{ݯ+TKq-&g~9o9ueiFmoiY M9:;khfld_W+_K!HesusieR/tests/testthat/test_get_ER2.R0000644000176200001440000000070613607476333017156 0ustar liggesuserscontext("test_get_ER2.R") test_that("get_ER2 agrees with version 0.3", with(simulate(sparse = TRUE), { original.res = readRDS('ER2_original_res.rds') scaledX = set_X_attributes(X) scaledX.sparse = set_X_attributes(X.sparse) s$Xr = colSums(compute_MXt(s$alpha*s$mu, scaledX)) dense.res = get_ER2(scaledX, y, s) sparse.res = get_ER2(scaledX.sparse, y, s) expect_equal(dense.res, original.res) expect_equal(sparse.res, original.res) })) susieR/tests/testthat/test_susie_trendfilter.R0000644000176200001440000001067313542461263021457 0ustar liggesuserscontext("test_susie_trendfilter.R") #check if the susie_trendfilter produces the same results as the original version test_that("susie for trend filtering",{ #order 0 trend filtering with(simulate_tf(0), { original.s0 = susie(X,y,estimate_prior_variance = FALSE) s0 = susie_trendfilter(y,0,estimate_prior_variance = FALSE, standardize = TRUE, use_mad=FALSE) original.s0.ns.ni = susie(X,y,standardize=FALSE,intercept=FALSE,estimate_prior_variance = FALSE) s0.ns.ni = susie_trendfilter(y,0,standardize=FALSE,intercept=FALSE,estimate_prior_variance = FALSE, use_mad=FALSE) original.s0.ns = susie(X,y,standardize=FALSE,intercept=TRUE,estimate_prior_variance = FALSE) s0.ns = susie_trendfilter(y,0,standardize=FALSE,intercept=TRUE,estimate_prior_variance = FALSE, use_mad=FALSE) original.s0.ni = susie(X,y,standardize=TRUE,intercept=FALSE,estimate_prior_variance = FALSE) s0.ni = susie_trendfilter(y,0,standardize=TRUE,intercept=FALSE,estimate_prior_variance = FALSE, use_mad=FALSE) expect_equal_susie(s0, original.s0) expect_equal_susie(s0.ns.ni, original.s0.ns.ni) expect_equal_susie(s0.ns, original.s0.ns) expect_equal_susie(s0.ni, original.s0.ni) }) #order 1 trend filtering with(simulate_tf(1), { suppressWarnings({ original.s1 <- susie(X,y,estimate_prior_variance = FALSE) s1 <- suppressWarnings(susie_trendfilter(y,1,estimate_prior_variance = FALSE, standardize = TRUE, use_mad=FALSE)) original.s1.ns.ni <- susie(X,y,standardize=FALSE,intercept=FALSE,estimate_prior_variance = FALSE) s1.ns.ni <- suppressWarnings(susie_trendfilter(y,1,standardize=FALSE,intercept=FALSE,estimate_prior_variance = FALSE, use_mad=FALSE)) original.s1.ns <- susie(X,y,standardize=FALSE,intercept=TRUE,estimate_prior_variance = FALSE) s1.ns <- suppressWarnings(susie_trendfilter(y,1,standardize=FALSE,intercept=TRUE,estimate_prior_variance = FALSE, use_mad=FALSE)) original.s1.ni <- susie(X,y,standardize=TRUE,intercept=FALSE,estimate_prior_variance = FALSE) s1.ni <- suppressWarnings(susie_trendfilter(y,1,standardize=TRUE,intercept=FALSE,estimate_prior_variance = FALSE, use_mad=FALSE)) }) expect_equal_susie(s1, original.s1) expect_equal_susie(s1.ns.ni, original.s1.ns.ni) expect_equal_susie(s1.ns, original.s1.ns) expect_equal_susie(s1.ni, original.s1.ni) }) #order 2 trend filtering with(simulate_tf(2), { original.s2 = susie(X,y,estimate_prior_variance = FALSE) s2 = suppressWarnings(susie_trendfilter(y,2,estimate_prior_variance = FALSE, standardize = TRUE, use_mad=FALSE)) original.s2.ns.ni = susie(X,y,standardize=FALSE,intercept=FALSE,estimate_prior_variance = FALSE) s2.ns.ni = suppressWarnings(susie_trendfilter(y,2,standardize=FALSE,intercept=FALSE,estimate_prior_variance = FALSE, use_mad=FALSE)) original.s2.ns = susie(X,y,standardize=FALSE,intercept=TRUE,estimate_prior_variance = FALSE) s2.ns = suppressWarnings(susie_trendfilter(y,2,standardize=FALSE,intercept=TRUE,estimate_prior_variance = FALSE, use_mad=FALSE)) original.s2.ni = susie(X,y,standardize=TRUE,intercept=FALSE,estimate_prior_variance = FALSE) s2.ni = suppressWarnings(susie_trendfilter(y,2,standardize=TRUE,intercept=FALSE,estimate_prior_variance = FALSE, use_mad=FALSE)) expect_equal_susie(s2, original.s2) expect_equal_susie(s2.ns.ni, original.s2.ns.ni) expect_equal_susie(s2.ns, original.s2.ns) expect_equal_susie(s2.ni, original.s2.ni) }) }) #check if susie_trendfilter can fit different arguments test_that("susie_trendfilter interface",{ with(simulate_tf(0), { n = length(y) expect_error(susie_trendfilter(y,0,standardize = TRUE, estimate_prior_variance=TRUE, use_mad=FALSE), NA) expect_error(susie_trendfilter(y,0,standardize = TRUE, null_weight=1/(n+1),estimate_prior_variance = FALSE, use_mad=FALSE), NA) expect_error(susie_trendfilter(y,0,standardize = TRUE, estimate_prior_variance=TRUE, null_weight=1/(n+1), use_mad=FALSE), NA) expect_error(susie_trendfilter(y,0,standardize=FALSE,intercept=FALSE,estimate_prior_variance = FALSE, use_mad=FALSE), NA) expect_error(susie_trendfilter(y,0,standardize=FALSE,intercept=TRUE,estimate_prior_variance = FALSE, use_mad=FALSE), NA) expect_error(susie_trendfilter(y,0,standardize=TRUE,intercept=FALSE,estimate_prior_variance = FALSE, use_mad=FALSE), NA) expect_error(susie_trendfilter(y,0,standardize = TRUE, compute_univariate_zscore =TRUE,estimate_prior_variance = FALSE, use_mad=FALSE), NA) }) }) susieR/tests/testthat/ER2_rss_lambda0_res.rds0000644000176200001440000000021313607145336020754 0ustar liggesusersb```b`fef`b1|> ft(a{Ǿ; [g`aɩ)榖&ffiƉ橩ɦI))f ,LHXsS1A ̒\ susieR/tests/testthat/Eloglik_original_res.rds0000644000176200001440000000006013607476333021373 0ustar liggesusersb```b`fef`b2ٿwlctsusieR/tests/testthat/vbupdate_original_res.rds0000644000176200001440000000730613607476333021631 0ustar liggesusersy8_!"%E& :(%H"HQDeLB"EzsEBi@I%]ݣs;ϳ=_>k׻{^! `_ߎcPUaD*Ժv/\SsSF${hEUa*k- [h :/xEVoo'Ѻozk업0ޝգO#?4NDpO梻g~N&3RC ΔzjxgB'>xYBgNjQ0Jz@WR3ƻ;=5d N&>:GN/FƒdgZY .;xzenY}>_&0MH{0XyǵG":an%0^iRF*af^2ޒp W9NVigsx>P:*K䳬j9bJ^jq{ưlr!WNS:]e%nCgoJNjT/]ݰ>Y{<^ 3ߣ>hW`nIS&(_Ӓp qG p#ީ݃7<;/_Y{sIh\o σV j@%OT`w ko5` 1z`[mR7P'd zD9$őW8Sd wq{{ї0^QiUSp89z}y.xQ#\<>.}o1jL(~'Ūa5f_^4X Y}c6҅h<+OMQp|/7Z?t}loȇS׳Wx}"_qm0ޝ6]Py&/Ė+TM2ړ8sӷ_0-=]0>x<=TQ%oͿpdñ0z~;V40B0BྫVkpk:|M]/pcllZֈWq v|{y<:;Z(lzOȳj/[g9xX5[t#L_x郛Gߣ?4Kݮ;/uTU .qn\PiN2/Q"Jo[ؕr!TxldKAl0;%}{Ikcc2` qj?{xg7mYPDž- iH"/XX0^6AT\SWT;jw>r8<}"󢌼 Y{ IʫQYRRքx<%moV{6yӗ-ʾlX.GlNV-9/Xy?.7Rd>Rqo?('Ixg^kQ\@=ؗ~.ّ|cgfoaۓh{ߏܱoc _k"zVi݁a#eWr! U?4)npv+X&xzԉc҆oJZ3=b_X;|:^>Mk2:To¨!P^[ոŧ ƻv-~I}3?-ouWo1dS9+y<;oaTǥ.+?>4Ũ^oe^ga?nqSs Ef DFxD{;?] *J^c ;h0Y}QYaXcBw&nٺ}0^ؔQ0L! a[W X9.ww11td_kþɕ!x8J`alvX0|cϖVݺ0^L% z'x^p!;++LygInC7n,r\YYp)4-;HEnd_ o3ods<=+WɦO4o/٧Ư +F}۴:~߳# , M2U<_s`΂W/`pWˍŇ>$ZoWXΔbF [!-q’> :K<_ u[Y,nF;Ί5]] 79lz ka%἞{A5K(>`'%+C^49WrBX4W%KY{|<8zg6 ogMG^Cӭ`h$bN؞ o',g|{+y_~Xi'3˜ 䝍y=NsUV=qEiY{6 6r4ɷYXz,h +YXx;sC=\>A2U&Kw֌ak\51z`'X |. +Ju$?`s l)ƝQn&?NC{ LN?0Zc4DftP?/}|lȩA&ŇmXX/|&VxCbW`5X:U#^XLʸVqk3x>hѸ9V%ZGoQh@pL9*;TEp9.'u&uS^uf8Bc a Rۙ[/v>*>׎lַrm ώ8wGc24eN>irvyF;ot^8|\|Qmޖ{D"[[և5Kc.w;[rVWF3?R\D|†)EWjV)_a+.gݮ)VC ? ^ر M m/xg$Vә|WNggy_Xo;ݜ>8мc7HjQuӕ`>*3}?ܸ\̟dBso篘ѯ;`267303*f]ߛ}?}hvy_Cޭ7ۿXgRZsusieR/tests/testthat/est_V_debug.rds0000644000176200001440000001012113437306365017473 0ustar liggesusersi4Uo"eT*J\3qp c T24P9JW) 4!I#IQQ$=×ۻֽuõvYJ 8 \9\ B)?4VpW8`eEa0k[G8NPq4|A]@KVڱyS7ΓN~o, +5 $;-v@&63O~ΨǀU"qӰ91*\U­ `gv Аo!U}Ҏb Cxk{ Ux%OY?9'rxO*]>^4Dn/xOr=ƛ0[kqc^%kM #sAF>FZ?N-?Q3t㒭y6TAIԫ0[[hMW}rv=G}g6RW֡̐yG oX0g2 SnԿ!m̼ЮFVv_0bSܠv g˺e*^r|ee?">wsnԾW+xȡgilt|7\a-xMNf]-Z5ALG"HOtUkAҭ1S`u)%M1sOנ-y-]qӿo(Fr5=z9@ fMlE:bC=82nK{i/Cѭ;TF d8' >mpmD5=Jg õ1J{7M˖ǎ{{5n?+j*'6&Y^Z;.Y5[k\}!GPuƮm>0rU!6MhJadcHhy; tgJM֣w/U`œ@I laJugHa9'd_B۸-ת~o6l~3hfr!"q/R=e<1So .nj kƵS_a 7Ua~F!dl4 i1&2Bil60_m{vm! :+Y.C1WOB7<5ڭ F)V%H%ۗ݉Rt-(Oh=IUs^vy,,AsFHЮO?_oЮ{C;Da0P1=,7Hƒ@ɞybkwT$U 흼 ,Lj2s$Jyїm1LZm&pp)*٩n让@n:ɫ7}~_# ? % f(2p[ś8c"`+wlmL;!S;EXӫA: Bw~\5E!Oo,4bX3텇~vOю~3f/K âq+zh5vӻsm{uT$Z.ihBVH3cA6!~uwLsp>-.}ՃXnj3<(H&;Ȱ|F2UtK_T^ d ygb RK}9 Gc )ʗߋulM,S=a I@U5`f3GR!\B}NS^1ʉHv2Q6m81ՅH+E}τ^]?_Cq!Ro+:lb,T+!_\J3-Ѱ2QY ߑi)Չے!4ڂ_ǖA‹]w6;ψH'U\p/(p?`ϋAoZc支kFS^)9 Kc]x;؊aīGUNb{䁫w9M4Z L:XTZp|\_X@^Kј0>`T{txzB z>\j4ia@]AE-ʳ_|u-'Qwv֪~3R5Z=$ؒ`ICX̪u10{Q#Y#}m~'xNHXP ro<$K+F<0NmP*B -2}Yx \' -(c/a.0qV]=3ao&czyVm{*0ښ'd3nst |$` }E`H蜀 #1GVc Hk&|@Q0G) })sH1܋)kj !U不Qh˷;(,%:JƁ,6U8 MQ UܧLOEB.+Eꉰ}[fqLkZg+v=Rꙕ1Ԁ~BGf0hwaӋ9v C)<&t?޹6Lx=07>>AW|#O&G%uܕCmfwV3'!8-%V%h?9g›|[!+ze\=&ĝFnbW( |7< |=H'u̙&ˇ/8d ᾔ.*C4QNͰCXggqthI!v,ONoJ/p1a4/uD.xIl oJLo݄5{xKT}q>Ǖ;FtzQ<NʬR;⇐ nѡ|G/Mu#~iU}zM~Evĝ},b3?3@\HZ1HG?0-Jm.G $:o//U3Hq+7_>,hמi^PZR(4!z M*wh|,ӻ1·SzxݛU|jQ aPĪun$c1ߢ<}76B uQ݀-hj/!6.i̽ 65}7b_ KOCGCK?m&+^IHRM@f+z?/g{1 =u^N~[ӑ/BB ,M<%z?DHELj_R}& 툞hǟ̺R;w2!$IJ]]""ڣS*tNl'f!bZpy˚iFicc$zpǕX:Of⿱w])b rC, lWK@旮Ph5M%֧mcPOt~p7VjUm{@]B~{,O1dF4 #Q}D䆿N:S}IVv`&:-Ւs(QSouܧ 1Udܭ:{pi\KÌ15I ٨s$N'V(W_ve3b+Si'}W/^8S.xebbR!@oNc`xpaX)aiUſK).V,Q ;‡u_ł3i_Wjw6y(|KQ:㠊*aX]V_e+{Rwݻr$\JA͈\0+r?,.[ɓg )֜Ėv ݧeo?ؓ |+[V_=ae[SOvr)y|>dG/tjOݠtA~;׏BcA-ӝ~͠a"$#Qo8Lj=\1,#W7/yT"`p?V;zҍ/8X]K՗%l6} z¼u}sfTǩlE9ð|mMt)ƒi+wrݨwGܱgG S]׭Gc@LT/ g3./Ͱ;d@l^Ȉ fqxA7"#mk(ps"_ o4ʏ3N?q1 H%AL|^"\za".?FPI/8M$羫X> 2OaxI fzcϬ_ɮn}>p]SFɊ%pϭAR8#1HV. Kks Bj@Țeݭ@055"t'ZW(9a{To|J֓N"H- MI[6r 2Դo\swuMrlXWrz`=S~+Y ލWD屾)iZ 43EjqF]]jcǹ y |>t{ Q:ZyEِboF<{$ӿ*|W/9\6'6_R.3{vL8*Y6_wDh6}{r܂e,/Ъsć\֞X*]1픙'r}f~,{)*)b jnv3ޙO^Q7[%@5ptȤ:hn3`Q eX]x›9[atnb~4b bb}MKvcf(gs?p1v,ͮ*o4ǍPj5xĥh_/@`둳&?'60?'M' }b~ Z1 #opl ˍp&<'yzW-7'>;Ƴp$yָshW*&B?+38W:4:K?2+Kw[){e)'w*susieR/tests/testthat/test_est_V.R0000644000176200001440000000062513437306365017005 0ustar liggesuserscontext("test_est_V.R") test_that("est_V has V nonzero for the debug case", { debug = readRDS('est_V_debug.rds') betahat = debug$b shat2 = debug$s2 prior_weights = debug$pw V_debug = est_V_uniroot(betahat, shat2, prior_weights) betahat_V0 = rep(0, 512) shat2_V0 = rep(1, 512) V_0 = est_V_uniroot(betahat_V0, shat2_V0, prior_weights) expect_false(V_debug==0) expect_equal(V_0, 0) }) susieR/tests/testthat/Eloglik_rss_lambda1_res.rds0000644000176200001440000000021313607145336021753 0ustar liggesusersb```b`fef`b1|> f f|x O/4o8~IdZ^. }v" V27m0=Έ 5< ona50*1`v6ҷW詃 +NNRk3 ;]x}=lg!>uhuFd}j4:Gq>$8cHѼvƷYV^ ^瑓1aH5OKWu=r$261ax>|xv>u3gtoI^B>[_2ض҇s}~%zֿO Ze[_TϯRl˅_K݅pL9蓾?a=*x͗sꚰw,\o` }ګk9:ֿJTZ}+hK%KwMތ~,;^T+axmϏw3 ;վSwQ{|Nޏ{qj(<-~odpZ _+}> kD3oʧ20ˍM=wٛ R'Y1bՑL-*b-k"n<8_,mŻkLIc2aԴ/[ZS~fڛ};#j^ ΰPE>̾`{O6JאK OհRPwc;f`| 濧oJN-W9W.pdzI,>Q ygoVxC;>QsUOr *-Ɲ_".<~iW^ do8ZG|8&%zN\=lp6_8_F~}P1F!rXYw&ơkN:U{e|_`xU֋sSaxW.\Sa ߅ngEaAzS1 /F<'Vn@oډ~țz7Vw,]qf_U9h|NN3*`x͎]tJ?i3v°K VgY? wZ/̾ h`|=Zu~=XMti!k/1)V{ l<||l}9a75Ȍ/4؞ëk=w_xIOdgޓk{'3(# 9xmI,xtvN\#U~ cFI8w7kj@x(t6/,?=JK\OMCmaGzZ/ˏ +XO4#':ߐ&0Ce8}G>/ci ;5'-[7? 髄dKyCFz-{g&H^֪8_%xhJ( ޓ PxJ |*ΜFpXVEI˓׃omm! 6J9 SpQZJn9) ǗD6 ;zFʈTy0<6YY^H0vnҏXÛk7Uzp;$?fofvIڊ*>3n34V[8,LZ2G^ӻX{ZSa%cEQ- .rv` OlI Jkj)>)ø3ZZxFu.n=S^4Vl1 ٙ_ <붱l58Kݦ^^(<J?ETaqp¼$S6\x (r=Zfa0a&3q0>n"X~7iɓǴpsQM0<3_u]O*`%i4}ڲX+#elúb#^lMk)\~qr`sϼEdZM?09:r?N'f;ߋ]L۷qF8,Oli۸|0狏r p0N 6OŴq0BJW0е¾0=`mKKN|0̾C&gp͓gOc;-ZqlmwɹGk9,=<X>$m&,Hz'}{>Y ϣ[n9ow2Z3U_D̾#Y1wxV cC 18ܬgpnWyO-x饫0zSySIo`M_ ?j\yX3}ӵy#`::qFa1:?aQu 7lsR_~qp;?3̣H7L栨(/qLVoYդpgcdϞ'8qȶfYu\~A0?,:nsN\Gӱte=p% 'UZ\`z #0}L:E8}3 'h?[&4s#ͻ*`l/yC~dOC`U}hN߱B1iOdp{ڽ6̾t'r?Qa~ˠ<|]0*%iWJuۊq|YK\=ǫӯ[` jvKX=ZPYu_z;8=Ju0CʹSt'#P2,F:s(<Zo;̾mӄ:Lσ.:0_F_V)Qi%oK;%Tj݁=O4dG$sql*OOl2R&.^C̬V(t}70>]o'`y~l'oWW٦@z&GЀwtדLG"r@_t;]%`鮟g.W)N?(?O???k?쟯x |uy >%ErZAT\L[F!E|k?,]GsrI7_HyX‹[DGZM)Wz-Xzׁ*`oO`rYP[L9lcBKX"KP0ⶳtqrs0,v9շٗ`#;]%kxnS ̀zCCg-nݞH9vhw1 ]A,F7cv`ȫ{X;3ۏX‘5on̟­C.)䢙*270>\y î,e/"y`xL^92k!98>,v~&S],qDٸ̖f?>Vbi{6%M3sfe`.X >, +a)DJq&7b|pًZ3Q~K,+e/YsKZ_ .-IX9;̽3WYyI"Ӟ KQ106ާg9`,φ)s͞sJFg;NM>ѵBҴ˿ԉf 3?r.f na91#) 7`ΘP]qW^|1;:VN(~prGH ZIYUэXe`,, R`,!mۑi[9 /'/qh",@:cg_=Q-"OIEQ2顂(9/v ).*C/K$frj>R&K\YB'& )ݷc^`pʫa W%:6E}"^[v':*-dr?sgZopJ'#>1`?grsEG6V}#xaYDFq|v-a}w{hg#". $Jօɑ;cSŽ`Y u^ `t}/sKLhx Q/x(bqx&Jsdž`r,u~8>~%09%̇a,759ȝqX~/0+.߀Th4eC!us OLHOivTdޠVƉ\U8̾Yk^r ,|DMJNڣ2"vdVyyv>%,7H&IX y0<օ'`̺OiG5Ӥ {[nv~'`r,ܣ. /so1XLǯwjPx$5nW8/<|GoT|500 +/1rN<f_g|_K}\?N$8lЄ-nڮx/ oh/m1_Y\ 뷰ZRbN[gu'.?@q(8hJXa愝4l}a~|mX=[ƇcN_ [XlqSA/TX{"ʧ1k[MW"3a|V 9 x_h;޽\dHOS哼?p,V7-[뿱 q痑 ^x. xr / 8)~tGzϡV.%ΞظCxU'twũ0<~Ғ aE-憝YK'G`r,MˋOհFRdyƚ;r>O߅x|ʰ0uE'̟H|Ike wޡ^ƃf5m\|ç kom`INϢ%Ĥ_仙cvD#JRt ^*UA]{8~ Nv>`_{dNK鹇놩],9taaHP_ Ai*Kj>o9kX9@f{`x,J{ΓYjX st7,m/,%AWlݐ_ D2nd$?`0mQ֣#>H%?|Ţf |a"ZҌ@}W,G߇Wߪ@gcMqrL=K~\tBDt2׆~0 Ѽbu_U쭭GpOjšlz$nIԗUryEuӸ|:0tk- 4gXԥOuN2z,6)PAsD)JRJ2\|_J-LO9qtvG  uc}'#b{E Mqu҇?%a}εh[ X} fUiN$ oZ Yj۾H.|}0<Q9Ͱx,uz]| Zv~fwkoX<5,_%\8v(l>(֐G=fպ?M&gQ|iRr6nf~=6/-76lt]zKOpzҋw=r\ ]-ܑgw pnlP9yt G'TOd ɴgΌΗ߃ Kw,ccu2>lsX}K}ٕ_8S !3"gNq3l|gJe.}]_3&섵wlɌ,Z&rW$gKr mkJaV,Avuz'~cE[_˜ݜ_|7ztlb3,c9Z'^kk~\/~R;/&]$6vWpԈNb7f}67/{&d-c$vg=-o}͑C zOus0~":6['.?y@jj,.Sf _Oj6n O\uC>`|K8~:..>3$,ߞ9hޙ_EUڣsW&NgaX֯WOS8cl{SpA>0&{&Fq|`3N7,~ΜVOŵ6Xhnz>ד;>bs!R~6a!W/'j ?"9nn:kM PG8}t-}pad^E߹weףzW]X<%^rg~z+qo?%z">ZZ~;叕&?Iu8um8} >~HX! 'G{/QܺR k/K̗G(w=ŹC'/?%xʊN\|ݦ[qz#?ۛ |Eȑ$mq<#N'P8X{:SIYY%8RUvdꕧzJ\;C8 fgSc8ڂ en_f|?rHe%sH}(Ny䕍G""*wjw2O͒v/?&C&qc^߅7UA}eFPRw{#(OG`XEҚw-,~ɒԛ3)dDz,^AL.|L%K]r,6Jj/Uꃉ)=?|/g}a0UԊʬ8ʗRBTK.o-g˸|Nބ R1K=$WW,56# BaEϟ?߇]K9 SC%&iV{" v~cXMdRf!9̧Gn(i6v9KDu=zm$/pWz)Oqni~rZRrI-]b50+w OP#k\{uyyiȣF-SpBciPq/Yqg0pBEFimcu1uN lju  `xaUE0Nɥs!6s=1{`R(4DRX.ˁq nrNHC=0o}Ӱ8-y.Г6I<8L=ɽb z''8qq`9 9TkTBܮr u07y(m;QH_X펋W=:v :9 '=ujmndo99L*WB\m7m1ո <&tuoE2!;p?;Z<,`ۈSOQ043V`5BHEآ$8&/01ލ@ `xb iO2 ܧP`ۤUg+.W(7- Ebc z\,asR2ǻN#q.^j(yr[=|~j3 U.u&\>zZF_q\|Ppmh_2W, Hr e/L &NX&)s:PWUV*J<n}1_{.,'T[H4_6*۸jzNijC wˆOkRN0Vӈ]''׺e/B*P>gt4I4Ʌ-9ĄM޽ݸx٠ъ$eX{NX49I u3IruHx<_x3%Ef; o?&lgx-)bV Q]as;,,7joqٻ=i0AwOmƎg_5U^kG{کv-MNiD;Og9IDCDur #Ο•ts/V: !Gv8 oN?}JwMٷ-[WĬ WqU!O#?j-"E9Ք!&T |?گ8~rh`*Ʊm1\ahid&W&"-ڜ?>ԛRa5=!;.$[ģeIfQ\axEz0ѓtK8.?Tq UkGK<˟Z}" ]&ÄijkD6yt}9΂WxTL]}2UbWjqNswg2`CL{?xdWj\MZa1a Yzuw~Ѭ Iߎ}2EpqL0{n:>]p سSpMWߕw$) t _/S>Q3[x}FxO{~};ӌEܔׄ+vm*^$1hHf^Y;L? 9 .¶8ڬ{LTHĭ/g(0<៾[$$axڒ,-0<1\ 6j=׸| aѥ/)8e# L Ujb/]wcrl&)]%cO{miy㷛7n_y֜ / /֪⿒53/7;0<}qLεCV8ng#B 4XM#>_w܏#`78uxaxVIN\вwE+qz ou^|g+5}|g]Mvj޵{|ǢqړeWq{E;߆7q5\wMj]>uӧNܓK/ +w.n݁_A&{p]8>0{LYCN3/D`x}pV42wKJY03)tZ[<.70/-4lX|؂ƿ"uq_EWhC0< "6}90<`Qj%>WI8 rſF4 ,TV/g͋cOz1Q"#7 E7 Yxd3#i?Q"f߲ŏeJCZ9_\ado7eK38~djYQr),Jo ,Nhp^]ӧ&_e Jy֔js#r&,Tt_P4o̾q%  c0<o2Q%N`x1eO`a$ϞG\pzeɔŰ|blڰ!\![`RC/wE&\G6ǗHhePnj S6ЅIE|?!WaPPKְ8^k-~-iD<.]Ň`x|{xS~!~䤞=|d  zd4[VcAf8a`x&'`xԕ>zYk$MD|*Zv͋ g_pyM .+~nUKb>ĽmAbWYM[oxꡑ ePxĈkʮ0MxgÄq&qcN8vi8wqzf,v0<Ȩ8"3pzmb0S3(,-D,d??hW^l+?V ^((! n QN_8&0Nқ Ϫu, OtS?x/цw[wSP3*+էn$t퐢5p;-a|qGY<W(y;)mE8ǖO(_L 0S|#秄͓}T[/W:?}Ftυ9%?}'ܿϿϿϿϿϿϿϿϿϿϿϿϿϿϿI?ɵ'8 ϶}'0~ZOܡA}/\7Q7Ѝ h4z#al`@35 tc:?=S?6fsusieR/tests/testthat/test_single_effect_regression_rss.R0000644000176200001440000000243314057454724023652 0ustar liggesuserscontext("test_single_effect_regression_rss.R") test_that("single_effect_regression_rss (lambda = 0) agrees with previous version", with(simulate(200, 500), { original.res = readRDS('singleReg_rss_lambda0_res.rds')$s # the git commit id to previous result is readRDS('singleReg_rss_res.rds')$git_commit_id ss = univariate_regression(X, y) R = cor(X) z = ss$betahat/ss$sebetahat R = set_R_attributes(R, 1e-08) attr(R, 'lambda') = 0 Sigma = update_Sigma(R, s$sigma2, z) s = single_effect_regression_rss(z, Sigma, optimize_V = "none") expect_equal(attr(R, 'd'), rep(1, 500), tolerance=1e-4) expect_equal_SER_suff_stat(s, original.res, tolerance=1e-4) })) test_that("single_effect_regression_rss (lambda = 1) agrees with previous version", with(simulate(200, 500), { original.res = readRDS('singleReg_rss_lambda1_res.rds')$s # the git commit id to previous result is readRDS('singleReg_rss_res.rds')$git_commit_id ss = univariate_regression(X, y) R = cor(X) z = ss$betahat/ss$sebetahat R = set_R_attributes(R, 1e-08) attr(R, 'lambda') = 1 Sigma = update_Sigma(R, s$sigma2, z) s = single_effect_regression_rss(z, Sigma, optimize_V = "none") expect_equal(attr(R, 'd'), rep(1, 500), tolerance=1e-4) expect_equal_SER_suff_stat(s, original.res, tolerance=1e-4) })) susieR/tests/testthat/test_update_each_effect_rss.R0000644000176200001440000000177114057454504022373 0ustar liggesuserscontext("test_update_each_effect_rss.R") test_that("update_each_effect_rss (lambda = 0) agrees with previous version ", with(simulate(200, 500), { original.res = readRDS("vbupdate_rss_lambda0_res.rds")$s ss = univariate_regression(X, y) R = cor(X) z = ss$betahat/ss$sebetahat s$Rz = rep(5, nrow(R)) R = set_R_attributes(R, 1e-08) attr(R, "lambda") = 0 Sigma = update_Sigma(R, s$sigma2, z) res = update_each_effect_rss(R, z, s, Sigma) expect_equal_susie_rss_update(res, original.res, tolerance = 1e-4) })) test_that("update_each_effect_rss (lambda = 1) agrees with previous version ", with(simulate(200, 500), { original.res = readRDS("vbupdate_rss_lambda1_res.rds")$s ss = univariate_regression(X, y) R = cor(X) z = ss$betahat/ss$sebetahat s$Rz = rep(5, nrow(R)) R = set_R_attributes(R, 1e-08) attr(R, "lambda") = 1 Sigma = update_Sigma(R, s$sigma2, z) res = update_each_effect_rss(R, z, s, Sigma) expect_equal_susie_rss_update(res, original.res, tolerance = 1e-4) })) susieR/tests/testthat/test_susie_rss.R0000644000176200001440000000202214141046730017723 0ustar liggesuserscontext("test_susie_rss.R") test_that("susie_rss (lambda = 0) agrees with previous version", with(simulate(200, 500),{ skip("susie_rss_lambda is not currently being used") original.res = readRDS('susierssfit_lambda0_res.rds')$s ss = univariate_regression(X, y) R = cor(X) z = ss$betahat/ss$sebetahat res = susie_rss_lambda(z, R, lambda = 0, tol=1E-2, check_z = FALSE) skip('susie_rss_lambda is updated.') expect_equal(res$converged, TRUE) expect_equal_susie_rss(res, original.res, tolerance=1e-4) })) test_that("susie_rss (lambda = 1) agrees with previous version", with(simulate(200, 500),{ skip("susie_rss_lambda is not currently being used") original.res = readRDS('susierssfit_lambda1_res.rds')$s ss = univariate_regression(X, y) R = cor(X) z = ss$betahat/ss$sebetahat res = susie_rss_lambda(z, R, lambda = 1, tol=1E-2, check_z = FALSE) skip('susie_rss_lambda is updated.') expect_equal(res$converged, TRUE) expect_equal_susie_rss(res, original.res, tolerance=1e-4) })) susieR/tests/testthat/test_single_effect_regression.R0000644000176200001440000000140113463056206022746 0ustar liggesuserscontext("test_single_effect_regression.R") test_that("single_effect_regression agrees with version 0.3", with(simulate(sparse=T), { original.res = readRDS('singleReg_original_res.rds') V = 0.2 original.res$alpha = as.vector(original.res$alpha) original.res$mu = as.vector(original.res$mu) original.res$mu2 = as.vector(original.res$mu2) original.res$Xr = as.vector(original.res$Xr) original.res$lbf = as.vector(original.res$lbf) scaledX = set_X_attributes(X) scaledX.sparse = set_X_attributes(X.sparse) dense.res = single_effect_regression(y,scaledX,V, optimize_V="none") sparse.res = single_effect_regression(y,scaledX.sparse,V, optimize_V="none") expect_equal_SER(sparse.res, original.res) expect_equal_SER(dense.res, original.res) })) susieR/tests/testthat/test_prior_weights.R0000644000176200001440000000352614057454332020612 0ustar liggesuserscontext("test_prior_weights.R") test_that("prior weights specification agrees with default", with(simulate(200,1000), { res1 = susie(X, y, estimate_prior_variance = TRUE) res2 = susie(X, y, estimate_prior_variance = TRUE, prior_weights = rep(1/ncol(X), ncol(X))) expect_equal_susie(res1,res2,tolerance = 0.1) })) test_that("Sufficient stat (Xty): prior weights specification agrees with default", with(simulate(200,1000), { ss = compute_ss(X, y) res1 = susie_suff_stat(XtX = ss$XtX, Xty = ss$Xty, yty = ss$yty, n = n, estimate_prior_variance = TRUE) res2 = susie_suff_stat(XtX = ss$XtX, Xty = ss$Xty, yty = ss$yty, n = n, estimate_prior_variance = TRUE, prior_weights = rep(1/ncol(ss$XtX), ncol(ss$XtX))) expect_equal_susie_suff_stat(res1,res2,tolerance = 1e-6) })) test_that("Sufficient stat (beta): prior weights specification agrees with default", with(simulate(200,1000), { ss = univariate_regression(X, y) R = cor(X) res1 = susie_suff_stat(bhat = ss$betahat,shat = ss$sebetahat,R = R, n = n,estimate_prior_variance = TRUE) res2 = susie_suff_stat(bhat = ss$betahat, shat = ss$sebetahat, R = R, n = n, estimate_prior_variance = TRUE, prior_weights = rep(1/ncol(R), ncol(R))) expect_equal_susie_suff_stat(res1,res2,tolerance = 1e-6) })) test_that("RSS: prior weights specification agrees with default", with(simulate(200,500), { ss = univariate_regression(X, y) R = cor(X) set.seed(1) # otherwise it might fail because the two results will be slighly different res1 = susie_rss(z = ss$betahat/ss$sebetahat, R = R, estimate_prior_variance = TRUE) res2 = susie_rss(z = ss$betahat/ss$sebetahat, R = R, estimate_prior_variance = TRUE, prior_weights = rep(1/ncol(R), ncol(R))) expect_equal_susie_suff_stat(res1,res2,tolerance = 1e-05) })) susieR/tests/testthat/susiefit_original_res3.rds0000644000176200001440000007044013607476333021734 0ustar liggesusersPTKװ$ dDY`AE$*AArF$KJA&4C9cDs֭snULٻ{^{6j4ddddTdG f?&=n\RgKqP]w ,>œzw`Nw2 X{e4s9 qJ`el/X;ı7s2û7~fG?!~&@MՔ @]36@47f@4gx&Tԕ^r}#ϊ#xy7qxs8soSgo΂a Y2px 3,s=W|ງu:?73qDܻ`F``nifqfO}o`im1%l3wZnu{]Y }p-ntuIݚ`R2 c&o_VU iA'/3 %q> c%>5JWiڎK`\FtnHpK>]~ʦFz-|75gl4 Wdvd;+?cNo dA }gO\%` erHHw(+Qkilpm稿RJjc`ͱUL/̞ӂ갵`)Q3L?W3Vס9`vKί<5Mv`-|,Hz*XY>g2/G?i,ȓw5_ѥjqvf⇏`$'|!8deR_A;^ZA |"3˰z5s|µM\;DwV=um9C&cfZd~FթFMG0ھF|a+`$CwAklہ\p۴;|^).Q5,-*;il]6jf?~HzT_ޟZBoAS{~?"]dg2<\붺:0GG;aaXgIBOp]QrٺŤh4xr>&:`ҥ|8~ L>sk8 Qd|π`a.z{c &#߻ȱnb5pcdhOdK0w)^N]IcNA`,u_X 9v(ͧQML^b3wFP9%0hkE`v2v}9, 6 \߶ip7}3 `8E`sr&~41;h<'$ /Y-t?m#~vFvѱ 046߷l|?˟0=cxK+۵$opeqdXp`qgp2̗eKS?^[0iB+=dbZ ~P~.F<+p9vMi3"v^ׇ̋1ەY?0T9 9`6 'Nʜ7zSntZ枣N0?R.Yc;"٪`jauzi7 ÚM>G}ЬǦrʀ/J| eK/GFT{Y\BĜ~-=^ %݇ x1ñh>X;s$,9#  _KJ??bqMw˜&2*~ 0b̋\hv%WH sw`1 &0zw+ RyYNHn|-&zs @J=NysAAss,+C~mG>]Jĵz){mbqq@/^nhkB-_^T~S!`*l*RLNQNCvʷއwE]y~ME\NpXe+W ƒj3=`5Y>^FW56O¥mHp-тB`}٣TC0\35s FFuTl]W|q O?c(qRV*7O$qɆBV)%?mU`ŤV3ftG^wyӕ48bb g\=*_ k,x,Ee}sµ`~&b] ƤܝǘK`S7Nz5o]6t`,TXNb1X^1 M4-} ,ݬ|bA`>8؇|Uk-vOkċ5T`Du0 \oӊ+6Q~0 OMK m`Ɠ.D'w.寯<9Dqmqъbst,>4(;a/ X`?z@k4c@X|/Ẋ\{6Ł `q2ix6PtVl Ԩ di GVe\ZMO\K_T@`4 X>wȘ0LBn=w|_,az~T-O17 0uL#͕`m컻XqA6N2+~ JI?1Y2佑D:C^m)2+|;+ز9H[ʕ zf)l ?.c-Z`jh"z3^e,?ɾfS>|`^A(x8R:x/V֧8&=)ݯj{k{\gIGA:8ۣ[]x. P+?>0'?iS8&?v   Q ;pM'W7{ē`;*2pb=_ЅcWdVg)p̖sOL >I.h}0&¾sl ˾@Ppvh?~ȏl K\v:M,(_g%Ov}粙9ǝ.` vl߾e .y4L 't^X~ؖw.|93)ov^0P2˕tG^o#睧Ϫ9C\KU:tNv;ڞؓ`rT1&1 &N~Y'58$~S`RfKpLRۋ Clv5V';dn?f_g J۪o\邤- Dƒp(%w. ܳ1_ ڂ/<iLt oc$xK4dCƍ /E`?XԞ?15k4P ik֊q`x#N^%y]v>`0t*F{-|`fq7\׳R\)FJ.W0I7vE`#M`uLlReߧʨ35>A?O-~0k=t0y~ލp?y ]%@w B?cLAmt#MZ@%lZE8w7{F?\\JY{ .x} sliaKcФɹpSs!!sH}Z|($'{7Q/Fz \&ƭ m)@pSB2ҺWC2gw쿁PU~⎌S.n,{C3ep,{g 3 "*B=Xܙ* Kl2X"%qFՇRlH1g³lfxMz m%x=[]RM`kal=gODVn|D= 4rY9\K093 J/<} ̯4ws{+`%vcDlI#㸞=;qJ/XoR`Xi3bN&.,G\ Koŵ).Hy^cB0cݮS ϗt2|ǽ`x0nsHW̝ phd~w P%*FyU 7#),"ot|0tZOW0hvftc"3iu-AkSÖipݧ< mwgJcY~7r~ϡ:sCP?G &8h`oN8(+Б3UF0xG b*?Tl~0irSO|K0yd*Et,CIs<IQӀ}` 5Lۧx{;x*-GQl۟ z\` 4ZSSX[L$gonNry֥YN_q]gX%KoZg_ɉ0yc(LhvQ|~u,N8&x2NfU׀s=(\ߪqxE.w)`. > #vKՌb|%xk}GK3g ]"ΠqzQެmD\yd9~e 0qjK֯|xg1c"Rv d{:63ʽ+ɵ}$ F,ix0.9zye2bA?OqR,Mk\sLqvqǛ s^)u.s(W8@|QPsaXh1Ir8(nFkLI}fr<eSPż8`3N9%`N 9)^ /7]xV @x[xJG[Ď_J!Ѷ@$zs|.7?kH,CCCa[_6{w@;Ȧ ʊEG!O/c~R>a00}P\k;B4Yp\wgev0)HMG7fP}mLYRIk0}hLUTi>DGL+VWz}P$(J=5뗒E7,o.c iBA t.:[*|0Ղ!;BWbYq]^<5S_b]d{s`"D Ln d&`c''Ae `_WG<6p VzLSJic~2Y0]_ ,bE0cUj1A0sc=W f%q ^?x\`Wf{z7 -xDƒc#UT#Iuy &[Q7"gMJHK[ㆹT|?i \I2Jq\PpWq@M pϺ@\W !=ڸ#W\U2hp1QU'̾O\S$w5X3tY=} XqfY 8U&Aַ*+Yn:j;![y`$Xs n^/U#=}%DB]:FMo^xll׊u[IďV0 wfŒAMxynŧηib2.سR`y ~@po}dlhzQ!Ral$D< ['oQ.^0Yjgm0>AZ{~Ol_LkݗHn*PN=@8{B.uͲB3Jxi)͙u\;1\njjX~g +Ƈ+`%{VW2ssvVΉOߢl=oN\݄׆zPkd,4Yîwp%Utt7~ߏf#_ySbC6NUλ9 Ϧĵk\1w0ebs'k`J_${` v[)x'xb>\-0z|/*ɐ<0yq:tX\L>)=L6,N;17#<H&h'ni3}n"~#x\+jOYTGdxY:l:"'~<`<=e歷[)F$9pIšځK0?I\-S#ćYÜ$`Ǔdrfhj/ށS?m}XA`t=twL -n_@ޓz`󣴒uie\H*.^0a ~ C25 xD^n[R{q } g_2 9E[:'ES2DQx%Xvi=l\`9*3c,_x) V5GCCM[殻V7=wKzUPsլg_b2^#`vX>"\+@f&}ϳn&Q9ɾS"]J½.pk= p-.=a a,x\OOu +j ?opꓥp IV!s` S#Ӏ2Z?$aϷ'70)T JZ<'zH:+\Ƶ5Q0 ms*o\Wj'_pg.*=Zi^}#|Vs]# P]k!o{$٫0POlE  }{g%]5fn{Is[Ps=dG8wtJNh@IsI`mqA>3¤c0/䐌hY0Lo99CScyIa+0m `)wy|.I~|%v,@&_?i@>WV^=7_e: oul;O1Q8ki- N@8z'j* ݛ7] 6<64c0 D I붭-t}BWkOO2 {Lh0͵ 5uX<_ p|j.lJq~qSSkヮbM7q-NT c;)TxN &K>=!7j NŒwCW`nr:OʐQm#$ tu2^]ouux\?Ld[j̡ V o)USׯ2۲%w a=>Hl֣]s`E㭖Et} Ճy!#9M063;v,k|a0߅ &.0Oԯ7Sy>t?S.ԩ 5-0.~9jfeA͚F~m.Lա7#[/L}ev+(jy cwxLLO/IG]@0=I)s윎߁0OgPMe͝]Kr=jUiOBBQRjԪػ|ZzPQvfzk܉ zԓL0tW4 rK~῜}aHr3=y[=~[]P/}6+/쯘 l/_{w)F!"%s!Ioa "=j:HrrCdcPR3EꆅlڋBP#޵U#M}U:DB\޺T\5D6"O>Fx шxBhcK?f|&i 3UըUFÌch/+ F a4,w *:Q`R鍊d=7~|: 3 |.7QX*?& ?dv# ~$dz sK^hD{>4N‹4SE[_!Yڟڐ+(xt s}U$!6'E?9*5 "cW:!Uw(wϿ+C!/L&9݇zhzVDU~zwas Z^^:we{@| }3C)v7T'=8'h$ sOQ8"}~_a9c1>tmY6m.tOI,adZخ@4ܳ^ =u${Hf i5AӶܯHМ2`q75j8^S6~z_vKF(?GGQo=2MX .D/$<jlD[f3繲QQƏrT#4bTCá*nv>C }ʉQ%bIg T!?ޙ.8~ǺUh-#b#UGE%s_[ԖȢ9rvSfgoA-#MS{P%3fj]rj?o\#mjP#Ǭy"jomTG'_v:Pb Rv[%PTpCGn~> wz~ۈI[=ū*fwқ.0QdLe݌V Q02JTׁTĠs0T] &H#]\pyR fՊRd_ 墔s"*,(؍ԩd$0:Ih~'u;J^.Y; . Fg^jܯ9 dʢ0kQ 3T xVrnZ& wHIβ)׷{aV dEmCS ?%kg{ڭ,+гGѮTzh_<ک/ Cwpfk⁞IOއmC4i_ZJey3C@k04#{" t]XSU`sl5 79@嗬0w[f? X츗Svv0G¿m[laJӁ2ڡwl fh5`f"gUg`L<# '9aS+0]a,f fg<~c hVMgE0wWa5ڽ>7jG:'yuzOz|FrMGPȒ>G!Xg]oQDZrW1LL8ρdv}&OMӰ/aיH0B &S/'ωo3 0zw[,LE-j}l?B㉻Rmj5\hx#b4V8)j 4Dcs=XZ`atJn.Ohum7]&7hj+*|Z/R3+/Q)ױӳt{ *dY?TnhgJ~]!ԟB%߯xM'|fzw*bvY@YK)P}toU 7/ZEͭ=;Tt: !/)ZkkTkk{5 z^"bC D:OZC]&!aq+]iL'u%gKE] +fr7 a |c-ߓcP"{j0JfKv̫tEҗ%9 9Y&At(8%s)>r>fNSTDa?Dau7;PX[y(V_&zȶK19A$ ⦹s) HD ws IDW%_.9*~ix3Ұp;}B:2 {hxES0Z@s4zb8u ZLː+Fbٓhqe [LyT()#C>HAK2- WM{!LEM5SZO|)/ ^VW[>[|vF{:Fꠑ1l\#42zI42hdhpP\j\Fƺ?,6a:y{3pbaXIr+ oM% /eaJ9a*^V+ MJ0ݬ,MHkAӧJX3$#oxTyAԯkw|ʜ>@Skat2h_JOl|o{]0 MKw+& P"ud, =m0N+}ס0u5;+~o t*MLf|ga,Yِ~eY#0XAwV@ VjA0X hS (knj}TrQݡʆwWe瑇0zY+gC}"ku>aSe0;bgm-/;iUyk8 EYg: ErqPt="!(R59r$dО9Ѳ0_Ǘ71{|ӷEouߞCMP ;㇊4a/ =VΏƋG\׃Cw}j:#uzx.?]̸t~Rfl3$ܵ/:}qVY~-Y:\HC;PLKt ه_Łl/Ym6kfP|9]9d=K`Iqڦy0`qo&ug"/=aϗ`iCN0Lxg$:-ͯ^creq4+YRH~4zI0$|uNJW!y̓c &Vkw ,ik,p3gaj*=,ڊ6EPOܰpq`X|{sz],z;eǬtGn}CL뷟ޕI|FR(B]:QjQߥ Z@r(&7_"P\'D{M2P WcC%MD5{G5Ll3B1&[TCkz`iL젲\D5S>]r}k~=FFw4+6VTUGUeٴPUCTeQ%RL )SaD6 c}mRE>Jqȑ(2pX=-G-|۝ʑg˟GII9ZTL]y!ZQ6ϭG`mK},Zt3`,Ow?eD8=z MXz[-Ե`ܩuՉQ7Y(1 =_[h( )Q&0n)T Va&r dl$cn&Gj1koQc(0Fa@*Y'#[T 5z ;{uEuM]d5oREB9&n5:I}{GpWuQ̕u xAu+um?u_T E]tԤ{j¨kϊYC!uҞE'yEUΠ{GPPкD^8у:tueG E=B>Wg"h!=~i4RW]kh!Q-sTՂ̷Գ?_(Im& =a~Yva~FD̿z#x`%̿?eEW&ҭ=h|ވwE,"XF(7rϾ|Q4w )t0Ƴ_mtFYIU45kg1x5 hEnC Tqg7QýoQбKQOԠc+F *c4ܟ?"eK[<>[3@E) x?5@m/]hjA !n|)Cu*i6I蹢iʕ$^9Sc\Y1b僮&kCW$@|y7%Kb+!_C k@'Ȥz_f 6?ĖGJ,[.1hD56{miϣs۝ P1N ?Լ=?ò+6=TUG^31FU.7ɲbNCsizLXE&W^ޛ`HAl~wޤˁl(aCt0&c 7\ x$o+F'UsuB#R }I̧! S<s y9Wtj.ԩ֔Dg,O%?K&f$]2:EjlX^l|׍9oUnƨ3KQԦaP>*zvrۆ\3>j!W$";v8dMT& refe2C.3"y8 ~X<#F #E{X:1垳L%]ð$*,߆S҉\X:e~?+eV25j=<5 5؁~聚w7|wԥG4{a CTZﯡfh[-VVˇ K'TCw}Ay-"#5:Ҟ;Wv/%+zt(/v;z* ]?ԋ Nء~Sɨ}/AhzY=B~i5QrD[AԻ8UP$]iݥzYBf ziPhoPGY~mP. >+"1+⍷"iCUƗc~z{i|dL~ XVB9)M@Y]|5(̟Mwc\XKgpBێQ|ፀw7g{\TeN(͎̕ӟB˾eRXHv+VC{v0e:&` &ߠlNf>?qB0%))Π!,Խ 9?T"\afY_IA-ET|ټ"T  AgӢOF'YH%dXTQ MNby'o)ZkFP/ۣiPM6[abgmx2|CLG(B S oJzK N'0Mܰ@9/ո i|9QU6򗧹 i;&@T?}Dj)vƥ@Du"'"Jz{J4"*m|7D7@DLUiDNa' O/r>#hח{=fn,ՄGָP ڊ!n/6y]ZuWA}TZ.$|-A6lGWwQ\UD%~;4׋j6$~:ߖi £VP3fꂪG5vjLUUTy H݃*e ?HǠJIk) 44{/'ު{뢲 <:l!h *\ ),/lj?s&$E+qϦ`3Z8 V5\t`oVHd_#X5dzXw0 Kek0rJ =1{R=`bF!έޅP`oL=abOaH:8 ?1oy'?r0?k81xg_00=-Q> xuH|W[݀2ͦHNr@n gt`l7Ryy12aor}k.0C3-V0wm6 9h }DY%3 ̨Bp0̌ow°<) PGS-vhHۋxEjK8{s<j-4[Px, d˩IR=]ZaR=9 O5fw¤m&=eLYaI%Lzґv^Xp0"&n]׿]9)޺7+S_Za%1,:O%/nB=-_RcK 3MB?{`;7gYā2% n[xjz8u"r@RCuxt顷8GEa?] c\EU0jۄOQ»R5얗QJ0J! Fɯs nkF߆Q'?1iQ}|$ H_ːe$ R+s`М(zj) ~/ Ʈ'{cL_-Gl]1z2D]r@tQb[tyr{KcBƛ|/;%mrF%M;Ӆ o`̒6n5Y,WØy9c0fAU@V3}$$w90,J)w/`ӹ"ネewVFNj1ZMè2--^}|Ξ~ߠGߑ+ &C=gïr@Our8Xx =b:1͏r5z5,aO'CLzt=0nO 2VXAO_ p d.="iS`|L hXyy%:6G_"C$}`{ tQ~=~պ?Iqzft)tQ&˿}Ɠ~>&@Z FYx8ɇc|Y{8Sf!;Q{%Fy YSmJc9?W>%Ez@ k05I<:y~x}ؖA) BGץ'1.VsjCv*n 'Yh X)1Xҁp>CzŔ`~1* n :  8#PQDmRXv F'S% u}[.)TJ9ƒ;mƣ1 Pq&zQ1ҙrXŇ:8# S N7A F~ 5tx?#F ߽،1.3fiDvDre .߿OhuCa@E)WLaĠ+ ?&baR_q(@Gԛl't Z.oL ! cvpց:׷CgD[utF -qiGZE>&_ygydU yM1xB4K/k c t9br[}yE+ۅ6`0g]˒Ln.Wfq.Ln2qP 2$:"U 0Dz1g0dM-LoהiD" & CB^x,(X#ylvzdbcŭyA#oL:4`wa:S1v tDwc^0;ٽ6Q׺︓0~?} _&tUХ;0zDtF)L?֙P[qA̜0ZwCY;F|`4jvF|<SF&Ѵ_` :,;_kpRFږKa$JcvY6ɺ)`Hꐺ) N4o{C{|a8~s#lou `hhMMHTՌ =xa'E ?W/@/Ap~=* AWb#_iz6wǒI"R\^f\%'Ar0}j)FN|"0ZPv3<:aF:_GQ6{a4ùO[^:|WG@6 x+1 a,*|םtO9=0jK`LHa> \&&caMvѳ&e(?&Y-IdepI/L 0x:nO9/%88̟|̘2F$MLbT5I/y`.[f9Fe_6̥|0Ĩۓ0yy?kd|Bm_yLQ%/4 cYkC@,`nЊQl+^0yK -0˨^+ K*[s>q0+b.Di0v\N57p/ kȰ$幜0rT~Y̱/af# 0uK{,b)a}AT] L}?K^S'g*`*EEi3 ҔkRqe\Ew%,O97;RwaI$K,mψI S_1fK{7H.?]}9 ! (1[ZHV~˜k/F k*O.l(^qUB>0+ܹA =xhe&̞lsҁٓ&Rsyʾ\W3ohzkg`zJ7=OUoVJCD1+I%i<ڏ0^3 Ӧ'a90Ɲ 疩`^K*>ߺlN916'Ehb,)=ǘ/47t,yyH^3U7=xB^"+ >m'Ƭ~\F]$1r&K^i[C"@rvHԢ&_96H}F)ũ>x~@zw%n| o1?6A{p6UZobGN/C4Y諻B[xxgV8o \0ȫzcƤ/z0Gͷ]n9#.1 bI .ĒK '1A7Wr*#"g]zEKuܜy/t0K9tп ])xaXG])0 'Wa;Dze$rlsqbhsn5Nw9oܤ( \,rw1o=o.&J[BE[k}970Q;o|^HߤR q.'%Bgc>OOY{l? >SB޵9cb &gNCw`1s0pe!8v[Ϻi"cez^ϲ0'r ˞ =<ŘnPbږW[=[}hzhf[Jp6s#m,?HSqEatm>^M}a#Bg-P Y8GZX!U1UaT8:]WyFO1[gT`TBy(JUϧ=0OҭXv%7k;a+- v Aί-j0hREm4_ab4 >Q4 z =Ak㌱\ bT)@; }\ϗ~KrpE`F+鬧kq%&Of%f3h8Cjg>7(yo[&рAi0O]=Mzh`X an /0|Gk,cTMZ5A3{_T{o1ιNY]E g_aZ0L3# 0]g̞wZ?Q ;Mv{w.& F@l[0rf!ʄ)֬ DSӭˇ)GdMbHy }]3p.,&rgeX|ag3 t`1Ǔup ~2wb- n~X:eC7~+!*wĂC=X@,1uoJL@2& $Y'[VM{|QZ(+n;`;6]j-C/7wmoR%}*,EH7G 1^RufdQ $~]1j&/U6cnkS2`n,LnNμVb\q%G0deU\ C6W`hO3ピ#U>0:-R4_鎑-<X;xTbygbz?()A/4+<߹^T=6ppu c8gEW<}caPX)G#{zDPicOpY=E8F׏Gbl8(R "#aby\XN/%Qznvү#`ܖu -/J*)Bwc#G+յrF@\S6>N l^EHoEy } :@Z{SkW6-J$ ^٦ R}zq˴?0S~Xm X0x ]a*BPpq- V=Ӈ*֜x>F Fߏ9LRa|]rI.Ҵtbz+hF)c08Y9`WC6/_Aqo+n19lƁUJqBFX~ {0ޒ xrG`'x 1#2 Q<ϑj`NU7pHQª3O`eXu͔$iU{M`+N3c@]VRq6@E !-iٵ0=iH}Cp 6e"E4qR+٭+m[l[zujÀ݌F6 -1/[ 7FQHS ;~g.,HcU>Lc~R:yKdv U-'mjX|`ImX5;g)޷B*0x:)aOlncK0081RFcي620T}sHۍ;3Uc|[?~%pwcv|ؗX#}LYfo0gvzoDY1ycXdb> AB~`)EL C_(Wrؾ5-=V7h/S`fwY~,oqY9vykԅa`[_`n8{GT$I9r犩b(h,n-Gר_= #/hb`:OC0jCQc7Z>nU=`bhN :P`lS[o䟯 oo:aqB8amM#ݰz}Lg0V0z `|N{(}Mv0v/Lo0}So6{`ew&Yasy,}rK2iizĩ:e|:c;_bJHţfXe^ǿoпt<1yrO* ~6=>~^ߋ*4=Gw@?fHfg2J~а8.Ag +rFszabS*3#e^+0U-Q6{-xZ'U#=bb`kL–6omÏ2 1+?<N a|Z7QQaʩyX<:S!URAqF~F&߾A!I(>xkXz/3~L>\1Ŀ7kaVBictV0&v%]Q2 $v{Ǘl{Hr}8TkB,hsGu{~ADuE%(wՂc>iUeDخd{կ 6o/s~^@յ+vdJPM؇A_N%h{F jqgψkBl59\+BU:zҴQq fx:Lݍjxls|"fOކeז`YA/Y E?`1MmV.Wd`> BvDaQ|E{/zv/;S$:]iWM7~`6ܽ։_$rb9;Pr>K@5n2xab0p' 3ȃއMIC搲j_& VM4rOk ,5׏'+W/xJiS/y$?OqRu2s֛y2;zqV*ȁ'myߛ pJS oƤ![|?zh6-?GyGWS9$ oio_lK3%NT}+;H~UM _fs7ߺ Wjuo*g%|_9"4<澮%¿g5_hB{Goڎ{Vxl-uܾ26>G=;&Skѿ8~_<Ɠx 3virnYCz~gNC5<+|P_\ĸm:kuvArēޱMHC̾r<>ɠ4_TAAHdUnxt,U2Ko=0N+D|kjMy }*ʛ&^ck8g8]_Yg;Qrw\l/D S58z]ornk3E H:)Ҧi!QOm k[*&a/:?;AuPN$9ԝgR!۬[~(MLTޛ?ˈr\vs#hNVݝ)iw9SijT >+Ԏn?WyT"2ylz3AAD8Hp4+c߳qp4=)?3\ 7$N۫i,DAxvuE_uqM F} ֟r%?":}N# ds]θLşw7gJ*oLpIK<խ։Zsi[YOT -:0McO]!GK}!%ҷ<o=rޟ־86?di‡yLf5$K\uz; (m뾗`y@0~~o9>uWC7y5JX|5viwBuO91NV[cp;\C%*Y1KJZIWC=kCZ!2HwIUk^Ue_O=lc |iɂ<=~ĜO_O<c%Ï܆IPD`OT=Q#W&zDVOvs_6&&[)(=п&zfdxk{܉7*ͭomuVֿfx}ܣ}Ć`muOD_@#Ghec_){P}susieR/tests/testthat/singleReg_rss_lambda1_res.rds0000644000176200001440000003640213607145336022315 0ustar liggesusers=y8Ua" SD"QEQ4T( e*!)R)RH)ʔL瘇uu{}8z L ̬ L9?8 i8؃Z;~V[;n?}2(us Dyf݅ {gJ3p E-_r8Pf͊}{mD"y^1DڵqCsfZ)qOF V%zǞV(}[iEVf5MXkF)Nŵ(g)͐( "m=Hok;j?ʩmÈktBdǤTuc"I~yVȒ߮D۱GQZݺ`?6a#"釿yD f7s|[ʂJ#0QwEyTɍ{6ُR^TrBY?y1n>-HOORB٣䡬y.+TgTRj ݔ}1+]<Ъj:Hy@)uevtWP="ǖQ|UdLJ"{iC TT~ 2:yaԊϠ 9TE$}=w^(eD^vj)"q8FoD9MٳQC %$ \(e.ȏb{ib'C%/?*d7EܩxyǔJz~6)DBcՏ^(dDnSi.#"1̊n?]p@$3ψ@H+"\z)> ~p2,]u׆p˻?zN;7u(+ˆGtxW["U=B>c._;mL y8ӊ˫'z oEI9f`?2ſxoތ kQ^Ij] Ji.HbA `L(3gT?T殴Ic8yQDk ?>Id^3ۏ29ֈ u -(Me%f'(efn5c?"팖t܇R *D&<z e[\41GiN?\PVKFDYe,ǵ>fVg^HHQ`G)DSg GPeGPg䱻D=|r!@,i%.f](ˎeF95RJ>B$pWn@=7=&FQƩai'(yc(m񕟸z/Jvs(kuCsW{2'=ө֌/RWDlM܅[&I"}^_p9H"]+ _D$4O󿡪se~1ܓv3~|Xj@'_l xsEq|?{T ǜ`rX3kxNFlgDNW-8DAE H,T RԌ>#/Z")L^<r2DP葥ҝXv <J*v#Ru~TE޻(e|XD>sջRz$ O"ryO/lRU};ʲVH?FRfΪBZ*FE&PY@:Rmo+ QN#ch ygS"ʺ/qF!rз"yEF]1tD]bQ˓PzMGB6} jhɶ4BMWcP?s**m. }>V/ofVZ@DO>B~O4}/r7AD=~5U2/O^<*VM|'wa",;,F)+*!xy- e $2oH C)MuEn9"Ab(od|HodG}"pޖ ?q@j QFG҇QA ;¯NEi(ע&W_*ScqYByjO띿ҝԾLRMuDQZVATP?8n˘[se| x:euxQMx˵m(ۑfQz,cς&i:CiD 5bGߪLDB}5~U'M1 oy]x~,J\HpGW.E.ʛKpm]2@K/A|E;QEՕ9+RK?|{Ԅw1Cs!BTA-ܶ H,[xCjGBN/%O?uAL97RliJMw'tr@%"s{>R i(k.llE$RÛ(mN!=eaAIOՁi󶛈$p{ 3AR:\.W|tD_U<&[Un6xywGG'%ʦk,|'"+m2F%vWQ'gMQf׿?*q"r3D:`7Ԍ24Armݎ>ZW\; /N8j99~ȿ5w*eM zH[(=8 u#ҟܹcpvmÜ}6Adh]S(PQ+6" aS2ɧ@d" Sĭqi+B2,ljM3wo(Ey5ej~-kQdGFCxf$œP Dz<^R8<.cU(U*"Ye^?FDڰ%"Y(جȞ7lCM刴O^z4N%t/Ε"^:$OEw:~*oxjdKRZmOI_R&w[wSXk aoG)k$Rb[ρHug^ ˢ\RV2$8n$nB)6m[Ӂ[n1cC!|15iqm_\Dթ;B'PTSs1m'6Eo_Tly15"/-xC^)H s #8z 1?фRmx"ҭ6\)(^ur فHeGKX͝3R}ҷz2+o"0_#xDөaxŐ`887I oD ş>7v|f?Eiߝh۫Rz-njEwf \>}M~r"WJQjMJ Cy ; yJQ "IF<ϣ4NbΊ=1KZ`W埸A{=VȿN>/@Sfy%/ F%9^ Q{:m.ogŧs85WFʨК1&qoKѝ^T1]ۑ_=w{;D~;r;VGQ>2]mF*J%p 4ZYA!eno`/jH7.'>jtM4#2fr;*e%ԕlnܗ2[BkwZT:ӈ~Ѽۈ7"ޕIezFw^P2w#~I(_*seyNZIp[5{r$Jwk௝$|N$JZَjmVӓJffG.o.Bur<~ucwH+"G (KlU*5ګrאxXrm!i4cиǟrM玠YP5vu%F?Wn2S{~ Hn:7od?:Ÿu:'~Mgn>泩g)~~۹$ \M@ O l7yq\_ڤ Dg}%3CVag(ww^9lxYW,RIg:}{uS}D ?qCjٚ -<ˮ鵦.(m(ʹXSTˁ"K6~ ĔHzT4kԗ\WF ˁ$>L˹z ]{<ľCo[ln$ѳ|Jj:6>u"RӶ@gL˯j9x⃘v9B()4]flܧ0oͶ|1C`P!|',yDm7%%r=t?Ƕ[ B~8YU#ld3G&볚0qS=k$l"ܜ2ǔ!G9E =+T/oho z#XEnet{pjc5S ' $‹i Vhŝ7myY3> UmZ?h\0)L15;Y{@,뼯4`"/O4$qUau=>=[R{vR.,m'dlO\\ bcT݆%Syv s ދ;z8{iDL8-7>Rŷy2~4&ߢOԩ'(s%tg4woߋ?m7;cT_2T( }"r{z7.\Cˌ%eF|575L- +q<}*̪)Y(ݑz:P_TDEGsgBbAv_xr3e=7_*٬F>wGD!~H(J8Ѕ|0 6"Ecq@c1,5vl tqEH%i>ܝ@qkTcҷ/M$ n.)0K:&;-KDqğ8 /LS3kP#e2sGGY}rxn0Pt\| 輋 gkuZLP{Onߏ;>?c;g}/v<=˲6fmfsI?(hQЫx:^3H C7ċlAŽ6}hfd%Ɠlnj`@t4lx vp@ss?}ʔ.ѥQGq/i_V#VًYлB6ܘqF6R9ͤ Ú_J5ac!ې2 6`mslgā9픦׊k.,3?^,_C~I~迣Ӄrlҽa$LS973#2~hoiqs\pQuC4,sWo|} uzV9뵷I- qb ?+ g-5BaϥAjL{ s<̶Yb1Ϟ:o~x:5[(y{-[ܒ*j-lZk]`lc*J| rxnÖ;vnx:vEYmPsD+S&;gwLO,¯WN}Wǥ';#C ;kqsm~m).楉܂P^@oe^wJ3nv[P4 uHMny[5C O PJtAarǍHT>uxQ8):wSZ77GrcKf x`ߖxt|+ԩgNϺDcG<5?h)&>Cm_C J MtCkE"k%U锦?h ̪*q<妉t6#s;#oq0IM"_?3өЗ5݊ c0}GLl:qCCF5O ?zm|큡MTk}AoClo8+% tTe˜W_}QF7^!S࣪Z["K5cSN&>b늍|a6_0[᯼[俄_uRa"-0hG?-nvAo%M7v5-eELv )kL +ck"+0~_Y|p}~;:>;W݁#b)t\NWhZ?jw92}ޘ ԢMshI`یTN(vWs|_nKOx ݔcJNle;}bqwψo&Kʡ-{Z392! >)ZzM@|k $j)o'.=`VKd(hecr@/?|w#L[7`tmJC hr^gTOS%0T }%<5J}eĜ{K{ W4j=VZ#w@_TZ޺ƻ#Fd }vj.?[a4BjaX;z޴%FT@㿴FX:`v1SsynF;:.~U]M]}E z=׺-axBc{I8Z}F8S"^{$j}5gZe7dM9Q{0x <ؽ5 z}o3Bܨ&u'Otm;czoaƞq0p"n 4 `8MJu1w=aS@O60k=,y_| ã酓_^ u?iI}Z\e7woѹ3#NgaRi}uc{MhJ`=tOtΏ΅r=ϡy<7>&r/n mUoa:Gh(ЏR2H쳡Xṗ5>ӗ7@CcZ~)$'>;Sl{oPed<\LmЧDc0S7/p&v}.B袈LDoo)P cZV7~a3/l]#t6|,h{^[e["Eoi iuJ 7Ya#9Z/;k\ܔ>>&;0qd?S>c^l@3.ߤ S;+c$a ;,ؑ˗.X=p+i ~äV`YW|C>Ы?Q?vJ> svKX`XJq_0,o:F9fxkkra%Vvmk]U^CFgV7Xzy^X4!t"-%$NؠW~,-];_C}y_zwIo!qk{Q27fwb@~ICIs@>\֙˜,w'èmM늅I~ECxX2`9&5im=y/1'ۯ CE% 0o;L0RxpGamuT&04qx/LFUg;QyO@>v@4,zgR.3-˂&}vfh4Jo4a6 uzʚEǙQ\ W"C\j,W۠HMi2k&=>IFtmw-& wq;s S#au fo'EI. أN'G~\Fp{]Z=ÆۼX`1.{1Г@Hehxѧ7B/!,vb0i'e49넯|,#Q1U&F!}1f0t}C˘n_AI~CZ`6a{a,nN/0zy6Ĭ++C+s@+Vuy~F!'`H&g0\QKCf@srr h290jLռ}R4DeT i+)]؋ʆ>j";/yKWa*y0Qk!@LMR󙱦_Jqy!8{ozlO^/s"Okd&X (Rcd;,vs -atZ rV.1/X=7U#8傄U,џG9N7i꜍58X-3om"~-_JtϥM:0SWFtky8_aRe om+!V0ٳV 4:tJ>\~9QyL|#5n/{G"+hS5.;ÀYl2}*/aV"@fЃŴ3Y0gM\9̳/ӍtsRGIȳSq[JQ}@}Wfzp'wMfaQϫ}0R\>hA =j0ֱh Ֆվ@ SfBI-7J,4T]_"o21QD_W̏'xS JxEpJ9&0SJLe]$U7_[2)F@g Tu}yq8~5_P<7>߰Rh`~VO._SdTwחX-*" Q+LAC -Ŏ^B[wcӘ-pNkߛq[=\{ъ\{˧ a*ˍN˸DJھブ_HL],9jʉ!y9 { mwU?!CaYa꾶VAL<wcn٫ٓRZmQ';<^s/uu[퓘]V8zҮ3B]m)nZ|rCqj`0h³O ^r\CKRfR ǽ7A9Li:0z~\r5D0`=$qAr*n8/tx"K kGF;YNG9K8Jf8!ME! V|<̄06$7ɱ[jHС3qW<"3]2l<{nmFoqVًR&W+n:Ts`S* m2i q[ZY#mr ՜>SܣF`#0Эs7w6ϰK ~6e4k\ [2_ I36C30^DZd\08(l+,(aO|Wvz:bcpi6x6h@qZ]nۚ:}Vcj'ǡхLb׹qE#OZx댳U\G%"_*PVk%nZyّE#XMKv~oTi>z?BƋ5!PpL/n)4#*N+) 7pB[e'ܿrWvN_‹:~I"2 {W+m ?;0u YXUJz34޾nɇ3^(3yocLK9$(Ŀ庾g龦M0wAų S uyNibj'SI\k-zoS>$]n}@B_!aQ*dh62;&B壸(KbXwI t}M+7.[W0uL-ÜeQ0%<m1ޕ&8/Y_}Q7Fr -[ pqّ"G15knmk_[Iӕw^Bs+] rQu\("\Ε8k#}0 'ؓg.LMe:ZuL7k$ b9iPf* V*j/JzLMd(3U$MQ-ܠ.~Sb.n%:ڇ ;oonkz& ^_>=_lCvŔeŎS0%%L/;y'lŘJw. ᪌f2?/wx?O6msՅBx;0M'Y7QVi'ulچc=ƽϿA5/_MkoUL]`Unu|]'n`l|lxaSΚxax6ܐG.WOo9 $hTո:p74 '췪"0 J"ġ8燃ջL^~[ȶ_8}{YSo=\,g3f߅:^!;prg^CR"f4&S;8Sr`ei7פLqᰖƜ#OՇ ۣsn8؁x fi: nyis׿.1ታC-T75iJtu'ݓ#2˥-x&pկ7 uG;Pn19gkzsajz}Gakq87ǍQB >TzLLcjCH #~wW_}u9  =Ž'ԍ^D*'Z I_c sU=hdϖIIlGr">sG+ WDEsN& #~}!TOc6 ӣ@14fS0Vr]CO]+ ўjs-' 2FXvf\@C7R~=g{:WSpэT,r$;05%|ZmCND6^WR|^;2>5ֱ@FE[벺A02:p}v0 lPجBp~U, _4q',pTg]*D;#ܡ0?h.c xTC8?F읋.GaJ3s78|BjQ\6f@anā esq=cܰx<?⺾{͹.7J<~\vRFZV^nE'M8jerF-kgpϫ{,q_3tqfc{Eyfp7vnґߞRnFm9|NBΓ")iD̠e6n4(]gAƻz1y{J n8joJS ށTN(VOwTN0cNwL.P) :Aɝz> qWWNRMƍ\'1uZuy^g,,ZsO3nh0=-q]8KSzsW?Uz~ SMoX?Jf&SEAD*]h]x'?yK_>r;Z7 u1FœRzQxK)D_|#.KΥ`Ҙz3Ӳ0}iҬQ-?N8C\LJ/S;Epu):"VǴ$챸!}aJ.QFgl1]Aη;;;Crٿ8c-d jdt w%$m]Z8Hh=㗗;w_HFJ,htl|3t~nld W6R%rRpSiٓ0HL{s#`l-{Gߡv]S+d_:rѣ̎)16=hjzGDG*<-o߱y7?[7?susieR/tests/testthat/test_null_weight.R0000644000176200001440000000255214142551145020237 0ustar liggesuserscontext("test_null_weight.R") test_that("null weight specification agrees with default", with(simulate(200,1000), { res1 = susie(cbind(X,0), y, estimate_prior_variance = TRUE) res2 = susie(X, y, estimate_prior_variance = TRUE, null_weight = 1/(ncol(X)+1)) expect_equal_susie(res2,res1,tolerance = 1e-6) })) test_that("Sufficient stat (Xty): null weight specification agrees with default", with(simulate(200,1000), { ss = compute_ss(X,y) res1 = susie_suff_stat(XtX = cbind(rbind(ss$XtX,0),0), Xty = c(ss$Xty, 0), yty = ss$yty, n = ss$n, estimate_prior_variance = TRUE, estimate_residual_variance = TRUE) res2 = susie_suff_stat(XtX = ss$XtX, Xty = ss$Xty, yty = ss$yty, n = ss$n, estimate_prior_variance = TRUE, estimate_residual_variance = TRUE, null_weight = 1/(ncol(ss$XtX)+1)) expect_equal_susie_suff_stat(res2,res1,tolerance = 1e-6) })) test_that("RSS: null weight specification agrees with default", with(simulate(200,500), { ss = univariate_regression(X, y) R = cor(X) z = ss$betahat/ss$sebetahat res1 = susie_rss(z = c(z, 0), R = cbind(rbind(R,0),0), estimate_prior_variance = TRUE) res2 = susie_rss(z = z, R = R, estimate_prior_variance = TRUE, null_weight = 1/(ncol(R)+1)) expect_equal_susie_suff_stat(res2,res1,tolerance = 1e-04) })) susieR/tests/testthat/test_susie_beta_se.R0000644000176200001440000000602114141046730020521 0ustar liggesuserscontext("test_susie_beta_se.R") test_that("Results from sufficient stat interface vs original data: no standardize", with(simulate(200,1000), { ss = univariate_regression(X, y) R = cor(X) expect_warning(orig <- susie(X, y, intercept = TRUE, standardize = FALSE, max_iter = 2, estimate_residual_variance=FALSE, estimate_prior_variance = FALSE)) expect_warning(fit <- susie_suff_stat(bhat = ss$betahat, shat = ss$sebetahat, R = R, var_y = var(y), n = n, standardize = FALSE, max_iter = 2, estimate_prior_variance = FALSE, estimate_residual_variance = FALSE)) expect_equal(fit$alpha, orig$alpha) expect_equal(fit$mu, orig$mu) expect_equal(fit$mu2, orig$mu2) expect_equal(fit$V, orig$V) X.c = set_X_attributes(X, center = TRUE, scale = FALSE) X.c = t((t(X.c) - attr(X.c, 'scaled:center'))/attr(X.c, 'scaled:scale')) expect_equal(crossprod(X.c, orig$Xr), fit$XtXr) })) test_that("Results from sufficient stat interface vs original data: standardize", with(simulate(200,1000), { ss = univariate_regression(X, y) R = cor(X) X.s = set_X_attributes(X, center = FALSE, scale = TRUE) X.s = t((t(X.s) - attr(X.s, 'scaled:center'))/attr(X.s, 'scaled:scale')) X.cs = set_X_attributes(X, center = TRUE, scale = TRUE) X.cs = t((t(X.cs) - attr(X.cs, 'scaled:center'))/attr(X.cs, 'scaled:scale')) expect_warning(orig <- susie(X.s, y, intercept = TRUE, standardize = TRUE, max_iter = 2, estimate_residual_variance=FALSE, estimate_prior_variance = FALSE)) expect_warning(fit <- susie_suff_stat(bhat = ss$betahat, shat = ss$sebetahat, R = R, n = n, var_y = var(y), standardize = TRUE, max_iter = 2, estimate_prior_variance = FALSE, estimate_residual_variance = FALSE)) expect_equal(fit$alpha, orig$alpha) expect_equal(fit$mu, orig$mu) expect_equal(fit$mu2, orig$mu2) expect_equal(fit$V, orig$V) expect_equal(crossprod(X.cs, orig$Xr), fit$XtXr) })) test_that("Results from sufficient stat interface: t statistics", with(simulate(200,1000), { ss = univariate_regression(X, y) R = cor(X) X.s = set_X_attributes(X, center = FALSE, scale = TRUE) X.s = t((t(X.s) - attr(X.s, 'scaled:center'))/attr(X.s, 'scaled:scale')) X.cs = set_X_attributes(X, center = TRUE, scale = TRUE) X.cs = t((t(X.cs) - attr(X.cs, 'scaled:center'))/attr(X.cs, 'scaled:scale')) expect_warning(orig <- susie(X.s, y/sd(y), intercept = TRUE, standardize = TRUE, max_iter = 2, estimate_residual_variance=FALSE, estimate_prior_variance = FALSE)) expect_warning(fit <- susie_suff_stat(bhat = ss$betahat/ss$sebetahat, shat = 1, R = R, n = n, standardize = TRUE, max_iter = 2, estimate_prior_variance = FALSE, estimate_residual_variance = FALSE)) expect_equal(fit$alpha, orig$alpha) expect_equal(fit$mu, orig$mu) expect_equal(fit$mu2, orig$mu2) expect_equal(fit$V, orig$V) expect_equal(crossprod(X.cs, orig$Xr), fit$XtXr) })) susieR/tests/testthat/test_get_pip.R0000644000176200001440000000107713437306365017356 0ustar liggesusers context("test_get_pip.R") test_that("PIP computation is correct in light of null weight and estimated prior",{ res = list(alpha = matrix(c(rep(1,10),rep(2,10),rep(3,10))/10, 3, 10, byrow=T), sets=list(cs_index = c(2)), null_index = 10, V = rep(1,3)) class(res) = 'susie' expect_equal(susie_get_pip(res), rep(0.496, 9)) # expect_equal(susie_get_pip(res, prune_by_cs=T), rep(0.2, 9)) res$V = rep(0,3) expect_equal(susie_get_pip(res), rep(0,9)) res$V = rep(1,3) res$sets$cs_index=NULL expect_equal(susie_get_pip(res,prune_by_cs=T), rep(0,9)) }) susieR/tests/testthat/test_sparse_safe_colScale.R0000644000176200001440000000075013437306365022024 0ustar liggesuserscontext("test_sparse_set_X_attributes.R") test_that("sparse version set_X_attributes", with(simulate(sparse=T), { dense.res = set_X_attributes(X) sparse.res = set_X_attributes(X.sparse) expect_equal(sparse.res, X.sparse, check.attributes=FALSE) expect_equal(attr(dense.res, 'scaled:center'), attr(sparse.res, 'scaled:center')) expect_equal(attr(dense.res, 'scaled:scale'), attr(sparse.res, 'scaled:scale')) expect_equal(attr(dense.res, 'd'), attr(sparse.res, 'd')) })) susieR/tests/testthat/SER_rss_lambda0_res.rds0000644000176200001440000000021213607145336021014 0ustar liggesusersb```b`fef`b1|> fݬ5JYX tzb+zz>h6*,߻3-bPJ3XR ORJ7e}Fe*A1+<cKʛ>Wңñr}ґs}*}}.&zQYl0±=n`ySpOkvN\ >@'Ζ.iv}Rcim5  T>"<.]UTf@Uuw<1?e/&:u+*Zt|܂0dV{I1#mE _-|tY9q"r0x95ODUfqsC3X.Fl;,I@c!5J6hL;#hL{Աƻ^7NƸg(ːiƅJ4P *Y@?{WV(K..=nmmt{Ņu@yyBl6Y 1=o9~DI& ٨9o\Mt=:$ChՁ$F4#;UT;Y{Un/o*?c@ H 8Tʟ]sZ:@b=w?H,OgP}Wb|&̣yDxJH:Hf!;iaSƆ7 7 V-l2@jid޺H+3X`ܭsuH߷-VGOJ#C~!\=y)W8-ynW=n%\oJ/cwW[DP[w>+=J#99mjf.E?*e)q"IjZt57ƩXZHm )j#[ $^F K癮M tX4,&7h HZG/?-cEtSo5aCdc}šk DM͘$GDNݢ)(g|2ms_AGPĚ k7iۻ_¼}^WA$uFP~>ZArx݂A1uaPШF;*#'_|*CG2h&lyds];Ʒ)z@Z7 :Pnf,1 ۏN󡗣@Ye˜/г x?:9ʷ)oƼ"IWW6 z5{5?B҉*`qI^4UN\O,))3zu=o$bGק5} 9q}W0ɂЇD@iJ9w<(}N4؜JWH'±6~vy+vyFԺW[W76ybŷϻvu*HKm6`G X|WޢY$ް$RZ\Dz2b1Ҡ'~B`;艫H[ SʯAOԠ.=uj@xÁ"ލYU`X! [y*JYkIjÚa>cV8{̓m投$g ]@tLpP;S~6ٯj ^s FXkʪ4P'Wr:~dݑpto]k- ֚|t͞MRxgTҦpFy6ԱTx 62'b ԘUWQ7 pQ6HJi7d.B-Erp:Vc W~|5&(f9 _JnxQ,2(k{yO%NƀR ܌@sEsb0n$,OXiLR;NʊiӾsl`cr-tj&>+ I__>A7Vx[v;HOCI+v$s~E[= ͣ8/nNJB/l% OXs( ?Ƅ\i?i$vP]HCL6]@<۱ߗVҋOs_s -|rHr˸%8} yh|!0dOgpm w2@ ,ۘ%Ъ s`^r YOߴjYbVux-Wr90P ;q^9ո"qgp;lWc[e\ }N㪯Ă[xYhlRf1GC@Rۚ`y^.XuD{-SBq-8n ]lq\ri Sx~yz >'W$ZBIp ֨639J{vōEsG*>b|ׅw3SrqRgA 8EǾҽ|Ӆ@*"hKRAU}inFAHDlbRa%@j?_ fJqѨ'=7^2Q~=k`7iXzj*&}%G?+or3K#s` 0bf1>>4u#=hseEO{;GVЃ_Oӟ/"Up\kƥǮwR,`jaO7:QCW6kY&fM,׍gY8x!9l0>Ԛeb*J9 ßGV;o \}R Eκ޺0gzCo޲{Zu.`,藬iNXrm3K>P[[Rp iPLN__9[AJPa?hS )@(w&S˛ Wq#hl||߹SfG1vyE.;>_G)|hu$^NG zUeY \_m#LA}hVz+<MZakxˏb.mp~3t xapCvH^6%u'*P*ibv$FPz> ]Ovq抱P;t]~&J&.&-Ԛ7) G ?mՊ7׋ZnzuP-]TK>j+Dɼ5mD(k=ʌDbS*=]iOxr3Ap-V">SnH)@gvU] H{[t㊀/HloC6K\z,(v7<Bs^$bS/λ9kg82ݥ6^Pf!(;ceeV2rPfYKq7j`\h λu[B,5+vJӠĪ49+Ai>K$W ]w\>(-d]òd!湮a's;sO˦Lqdq$7? :ח%[BAdžб:Trt8m\e i@zwCi߿!1#q~`5m37b=p^:=&Hb'H ]s1NjޅyjkM o R:h f[P&y0{_xuL}j}fKփGހw+L=#Y- fsʭw XYywvb(usy7ػ6 ɠdZJĐBF.#?n_5Jym0o\^SP~Ŧ1nI<@dc?`=ty{05& fm~F)osb+}b8.MHhxm=J{Jcqϸj]GDx;(y4lK_t?_z]-6;qm.T=r:o'uv.W%XN+t ΀?Yq!M\ 3Qϟ>< T_TMrRf3zsT*OgxJy(Ƿ_e 6 eս?Vyگ Hlq䁴S~X?η '[>)S`4;oҊQP*=]Bl>ScoO j5F^bއG7W}|w<9sAEq-?>o16hXݓu_y)M'7XϵKc=Ly _,$F|L;ԍW8řg=`N&번הWycsw(y u-0[\3gg c9,s02y'LXx>ԟ :j~!#.Cy~[ox]kΕA5oR_ 7 ~-}.yҽ'Ay%ଯ(!v˛XD\IT-0(q,͝<Жgesnwu749lCДL O~ ?6Ϟ 8ɏzt# 3kNM쎆iֲ̓?yFr' oF躐- to=ؕ+ڱ;A7:!#t&,'̓bQTmՀ^O廲HjoIeU(T^}$+]M@Rz7ܛRm 6Š lחӍ- +ddކ,d!^C[yJ D8YqBSvMfD\_#ַr|Rqcw2D8n7keX5mޡ3uVW^9o2YF 'yrRh5=8";ˁIMeL^JJ|οn$_%{uV.wУ̠o~u:dY2g{#"3-&$u~3-wn!1L1O _K4a^0L7 s1 YI`7$|ޠXK aUW٪f~,9l眧e[ґ*T][퍨 zI|^K :'Eeɿ(&S(^82A@zD] EK_u}G" ͐^%PNjJVHoɳJG#<8aHׇ_K?q6K *sNy߽RQ;ּ"*\v-١63 ]+uWSqɜ![7Z}w\&|zchQt$|ߘ~LnFNIC|[Nz&G-as4 h^,oNJM@i_{75] &B|@a`\2CfsB/%d o\(l"ڈK[eK^r˦DaMSDٷ ?X2F]4C.jB9BDbg/ _|`KG-ۜ/{@c`#rmW9+])(k񼧤^yk-|\w7HQ ޤEko[M"jk|P&x(z/u~yjCYm\WyͨMObʛ>'Q2Q( _Ң&J髓h%th4x/ =M\% ?)fi}L[νDf`!jV"3xd:A\6Cd Vwk@)l0֨ 9aG |76ŤKW"ՑB cEDuڈ;<WW!lj!s3[axzm-6"aH-ӧ86qEO<یy6ִV~̗a%a'r/ÊVu.M"L "N%d ޡznʼn}yo)c^卻~R3ae.-i.b^.i, .h?.tQjk?Y+'\"Ov{W{#:+Tk쿧'/ϥ<%>)+I$}6"H\a9;-D$tWW~/aeB;c~V0+V憐<җ ٍ\K!DDE8Ə/ij׏.>6 Ƿ{VA"͓cH2Δ %Ҽɒ2Wp>xS(%a(+.uR3P$z%]g-Ж$_h(>x]]RֹZ mr#X,5ļ1`j)ԋG*"9]꺤׈j+jQnjFZҎלD5Lb}?kϡ[:|_-i^ 1[_25j#VgCz7 =^M`7-,l1p9(ѴÜ=, DXDnLH *[k|a+hgs–[D4ƌ f27Z7rx-4q!aR{B4 Vo]6;.??tY~W^FB9<.'# F6ABGgW $&X ƀ!Si"!28ѭioG'BBCXu(zHd ~gC1RrQ 5FIcR=~7T5_H[DPE_FA-*!:8(<(/76Vq+Qѯ/b_Aօuh,'i&^8I ۫}=`by#4a^0QpB Z^(Qd,M=:7$PpWWQTK]?"->El 2_mj5zڕrBl_G`.h~a[u}#^uWNPC^Kp5Ihj3meqf䍧(4V~f?Q^7>Hjw~^r.|"el_wzY}% zhR+}͒SVDEnV^tTc v]8G89dKE(gS!qw>vJTݒ{ 4ޯĩTZĩ6Dw6D(%Q"}}3DO;=`ׯ>,2BĪr%9UXn\v)!:KBȞ;~?LLwoKҽf<J]jF9tVUB-YP*մ?`+=tKWJEiȊ@鑁aV(=<)9ej+I+Ψjf;EZId\ȧ%e00%DX@Z$",TE5z",m($3@t/0/Aַ.!#rdcyvȈl hMv*BF̮Նی<`jz0A?::{n%qY;ԉ \lDbگD)٥Dry"(] y@& "diq89v~ΞѕQ=,5OÙg~3f p1kpFՓ5LpFlE? mM`VJ!Qzq eFƒwo#(xLF90'FBkQ^Vsz@˪cPر?j$>${ O3*C᳞%\ @ KO]PJ,I:(|MSV7;b?H\e 87Z a;d݋ ;<dϡ)1rqskmW~=V!ҸC QS`D==Iy2:YG@V][ Q׷y6zHpLKOdn'A6PSBQ6z"oPkt9 ƓƯdZ\jMמ:e'YMJ된jjoD '۪6 !Q5(,ҷ^s,"4zv0zvpծ%)U})tP㲢Y4jȗFC͝WsPs{9j*r5ztɜµf!f]2|}l'P4:-hQ+/KPŒ=:Po.A1iۻQ6A(FusL]^:Q&TNn忛(+7H85椳-޳_wWQac͑]|ca%/$䩞sa ~'դ!(,S+H(/jJR*хGdq}VƲ˧gby9)|C|fhoa'hw)>6BRcurh>h_!ۣދ޻zj Lge5DڊDAz 3t/QM9Q(=)9}y.:Qz˰b] =Gprgyۉ "oIuFރD[&sz"o% :olM佣Fcc0~,ծjo@lSv=MT"|DE (G2_\&82CՌz4֫? $뤣 `a"^6vK3 @D9'Gmxs{~+ kUaᄀt$$xEBSbAҤV42??Hs_UC]iS0xrU1tm0_53/ÒtWxya'tR۴Gx0w5N'Y\$3şO Y%gB={2½ϥ^he Zvi0#mƅe\yxs3 "Q\57""ﶣa6Ux!wKIfͩF2GJĪ(9Dj_yuhW-$b H)F͏sAlXX}~7=0&E=XCм%:oo=O+; mX~WO9>[WRU 呣 L&zG4QKw J<ՠjĉ|._9YC9ZjȁEv%_{^)pF2 ,koЦKIV~>^%ֵO!.O;_%T~ROfhM[y*y?j~WLf†yg7}DbRy"BpuOL;bMdyfξ1=rZldVO]9یNq[䒎ч+Dr*Drg TdSͫt\CQT_1C;Q3n|'Qvc;9Q!ucoQ%paהQBcMG^gܶ(ofϋJ_z DaD)7~ G1Ht?=-z2ψ W/EDOC_3GHơv;nRWbD자e{vbe֑mDae|5zGЗC;ro''=yN.ZbfCf'vid| p[@™'nVAڍOF^IۋTQBצkvOhR} Q_q{D}MD}D}Ϩ#b/tNk1+ouHeQKN$[m$RYJ*e!Rw^u&R.DBQw7\a6kTnk;ћv30Nл2W}E|euږɧ6H4I_EI:;['@I;<;WC؝z+O#dzGa'/zyy;]նdAF (@#v gkAZ\f7(w=;] =Р]觙Gœծ鶵H0۔`nr>H5pE-uF`ӠHTHGY+:)P 'BONZS엡>V'Ϲ.ho2JQ7[0G3o!F YmnC[ҙQa?eپ3A5Hyw&ƪzGPfӎYgYᴰ9wШgb#ƀ$}A]pUN)R \պ(W&N[$ Um&ʃpǨ5\%SnPU Ãt#=[A>xyw C <v+[${fhZӨ0At(#RV{F;!fv{sf!]T@dT^Ld]E_#i-Ʊ͹yrvvVXI=.9#|V5In$|v]yIE{wetݒ~I<v,:(/h>rUf%S?,[LEYU;~tECtDSAlTA{)XtJ>q)}T+q6Jέ YNtㅘp[dhiŒ^EϰZ BzcZ_O?sE%BzG7Hosv?￐5VJD!~%ڏ*C/wD#XJXRRcO.U*d$KaaLt1kxiK:Tܵ琪@LBBw0L߈uUQ._TI>DXʫ9A",]bD",KBnyEQA [ȷhaZO|v",W.s QvEKl}$Ffe=kGBݺDg-4 5 ݉y*}7G6wBٽ}~a7ܗR"BOdgp_Q-} ,11ߪ+R(ӿo@T0U'^#^?K yFl#"a鰧hj>Zlj$߆Ha^ʸU_ ޷D6Q 4݉<)Q]1̺MqO3yk ђh۔en(} ծjoD&󕀾 D)wvaMD܅?8 + DrE44eד(] Gb۾n_mDfo/-1Nw?DFg~Ol5  bd!⩹z]#EOf] Q7s_ oO#r 2ٍ;6$d]5rW)JLU Dㇱ@CQEwC:v6eF[|a|Z4%oon]_ݿ[.ӏ?ϴ(#.(S*OܗtޒL>at 3u҂BNv݆)Xww0k+Xrw.9Fp_{$h7lp}Uooy{g e۰&+ )LRI?!e dHaX?m )GBN=tTI?1QH9R n} ^O_^|8Ea9xs@ )E$џӑOhqOޛ[!iY:5|Zi5#@DMGUi IC>0+,x}m i{]v 3!@`~jisa>BBʖOI18'ޏGCo73'Z~tL}HkvlyTwƸP^jݝa.p+I\w$_ꊍB4sE&ÞCDt)C36詐K'Md,_6wp*ϤR<24C6^VTyT)Uq;s3)A;q$SR(>yl:uհ(uYps< '߹rè}4W4#W|b?]?e y]}jߑ'wR!Ey_%4s|V]}R;:>Ҽq3:}||\P+yͭB:;t(A\*ހ gl!h$-n>y{|zcZZ *? yy(VcOL<\myS"ex xJ26Bv-Go8j%ӣNjżx+]l(Kcׁtte( CZLJRZ\ӕ1' ݱ.9 (3F4}p\vR$XnF%o9oF\]?}"U+:_pF v=> tgZP=υp'g"d;Сdu<0󓄿Jqӓ1q᩻`aP8}"Xwx(k$ΠGb.Ch*eq(xswRN)k0Shs[y)Jd஝*rc'GqA_[~s':|:>yL \Z \ _Pd(SWF֦Jy57J U3Eӏ>˞F^I1=l}!:݊Bjذ~JKIw-UYxxJ7C^L3sڞE\)7￱=qQ>0h}FE#KG6(Bu2t'߹аzfӨح}Td*"24Olʁx瞀AwlY= oC7Vﻩ&zp\;?7zGJ[}%>ِOޏpe_lZۨ=,̜@}xq$Qu?C%[dH8]}H o'CY]b7p.W`Sh Bf57 A̠Ȏ^m u<%AT1t[^U3ߛ.7Iؘhjcd&@;*Gyf6vNcxMb1lk1\9Y;/lo"sOHDz-![AH^~i2^WΝgꆐZŇ{͂RP&RE鶺1g=!Br,;`kKBx谉±m>eдsxտf?$G`)M=7*<zFPtN/_(;rofq-ow~n/ ?xZ, K z69tOaʢ[#'n7rGp t]BypKR {r]t}ve=zp`O*K9 `9P&Ar6DlWa%!¯(zRzJ*qoD5֦ >A;\% -Ş wH[Cyz!òc7%cHzd)N]T[*&JXm ~qZM)gկSL !۲/O_bAf:nW}[nC=-oIg*Vy5 [kPS3/vH)hfeg>V9zU{-џ!94H:{, v}$5[@K5R|)IUϷB^-&HҶ!Oj/ 쁘3.st?%8m<' 'bEOiI9ENT{=ݤe5Eޟ,D}\&sK"Qj.t57(/2WT(A/wIu}W^=x} b--䵸8q:ldw{rtӭƆedƢw$t,x3n/'b|)>9!y47^mO5ˢ|us<  ~J"X0rN_r:yR!0*,xYmC:Bi{~{pͼi?s]d$N`苹HfDk4Ǔ;P !̛j_>nqkےx;.Ax|hjb)jK׈ZuuHrWD?s@Uk.>myB|VOO >y& GgHZIA\ի2<7>I<΃ߑ|_J{*k9|;ube ɣ(?55=K*"s^=W$S.RoWBomb ~gƻ6_$Xei.l!M6fLα8GUü׋AylV>Od}  WDo>te$g@=s4'U&O ,=6u1-"64#_¯foEp77jD|r:$\`U^XχNOnMG\w&)7W!Tt2{z.BRgcްHĖWH{~}H+~cNi}VU"m ܀H:y`Dȝ]eS픡֔o~R64$<|X M⬃dj۱|V t4zvy>;sZ-Yc'z;0A4Xwe,"[?̗]-( "3S./"{Wou0?BԍZGQwϾCAf=noS ʮZW?Tц>!:dq;﯌ؐ25 AғgwAEf] A˪Ci h^jx} D/Q#giW~jerE#ipKz<0q='섺iFknNeUt-ƂCiv%c|6Z/\Rl#dvmQox{Ud*nkgCvzJKX9^ȎXit@"#(p0H 7(BDŽԝE*n3H%Ru A.Q?^EU-U}e3Ci4(H9 ٮGO'BzAH~ T8!m6Oe45;L]!)7cW?I1|]gk$sp=EWu$$yRX4aYȓ HYu{6,TƧQhzD(jZь*ȩyAWCzyRO9P ҉Bq(x+ !wűM/}'r?JZ)AD+G=lߡӡng}gIl?iojT}g1j:t5aSڏ Ana!p;I eX_mŶvj ar>ʼN_x#:lj~k}vY!'2jSK3^wǼ3AF~B3gݽFy89}1gNۢVu$7?S5^/9wSn}nژv Jr 糩堮 ~d&y:2'Ϋ:=Xg}\[$3W|ʝ r~aSC>% =|<co8t!,s:Z| *T6?yCM!V3)N494Ɨb6b^Nۓ`ϝLe@WzG7{Nkhfcn-pIT&\$JTumt/72H7ύ.48|)1_{2玸\t|w 6tUF/3=nαYmq}U&K~:\>YQ8XwZ.P=k9o~Y9* Usuvi.Z@-&2ȹmAr|lƚȉwg͘ 95BdWWwiLr"gM[ׂg_f`xf>Zh$sģ.@-oQb ߴ[c՟o֓_UQ}*[Q7"PM bZ:5<}te}}hNn?7oxVB w 覹sr2*U +˯S7?)$[ G$Ӡ4%:tl|Cz|;%w kH$9tBOf&@dIk(_N3ø^iYkw:ٯ#cF_i#z6Lth8U"hOn%>Y!07cC";Lβ>tc{"8L Qf$'/3 ]~h=-s^XhIO=Ѩ>v1^gVaE6Ue |%S٨Wt>Kt.gm8RjDMth2% ո݈ʕTKi{l^Qå&?<^}5'^\A g;C}oCIkuJp|1ayAd>{P {s494ANM/n!ݍh!dWC/[i/Z51_8kz;#p.zu-;|\&;g\[_|!^s.Y,w2_NItqq# Oγ lFOlq?GUoq.ao`7/튤@ k~+Yqu> ~<{p!rhNv@>Q #U.%RoweH!sM& .qS=JT=i{c;, Vߏnϝ{9c6#a6R gx]C#"F;5Ať(o֭ sڎ`FPTV űmDLmDD}cD|ŊQ8%HRyBiߦy_vw3h.IP9O6O,x#߷L3IzW%߉ިvGk!D;D݌쳪D Mz"SK pR-3PJQL vhuDk2Y@)Կ,ocN{~͓>Kz4l]IO)HpO4o7஬Vx>%JywX-GF7`Dke < ]'-9,ׇ?t 89SYL?ve/1z?c;2HRHG==Zo-ۗ%z*jʓ;$w`au守u oc(+1^~Lz7oxk2Fػ=2G?ϙ8 o[EA>KCă?zƺH܋v%;8?=$\ /YY\O%gNJu ?߯-En ÜZg?_hwUK@q|?%jK?q+U D :]tnPxv^z>|_8h^a\Q[oXLX3_O{hZӬ!?mpk㏲UHS=xuO+n<=/'_%؈3ґ> 73~5> q #%Gs.Acz9laf}֭BFY?D{w2+K7~۵k'j6;5>tvva}86rS k9)[:ϥV>,5<5 mEE}| 9*i緯B!M71q'Ru1?=8{NQ絬|at=s~z{\Y$=qMk$~F{2~ʿO-U}y|l(k/S޿Wl?K퓱?}?oqW>{}=?zjqt?oj^i;?vx__چ%o KDiiwo 53gmq%o䪿Zbga['^ %Sc-.^}jnki̯`{6ƶ-(̭6u=ëvWl ,L mZWP/mlגi6esusieR/tests/testthat/susierssfit_lambda0_res.rds0000644000176200001440000011162213607476333022073 0ustar liggesusersuTW] b" "XH)ą""!(eH#"!HtK7ݛ"̺{Y\ܯ]W<&%""EDh~?'"OOG ""oDMz7mq;8_vx;ovx;ovx;ovx;ovx;ovx;ovx;ovx;ovx;ovx;ovx;ovx;ovx;ovx;ovx;ovx;ovx;ovx;ovx;o۽FLߞ䵪ߎϤ_)Z `mFŎVB#'}75)p Uf"d& Dmf5RfX}.B~p"D^= mo^N,(ɷo^ET/Sfg̈́[Ay"{$J0j S9M㿼Icn6+lr'ZX:O*p.s+qY̥ PǦâqyh9Ν#3>f>R|䅲B䶪Ul}_>tv. I+h+T=6o 7@mht\ ֫"ٟ%C 'hޠCa(Eonscs; 5x=Ts_ˆa640bD6;e_X~Ŷq9ܼ-˃#JȂ5Y&ڐuoڋʲ4 k<3d1lk'<z [\:͸F 6WTF}{9CY?H`L&|>psݿQB_*D^E=%\ҭV$z-~u5Dێ&\Pn vj~>hrxq1)7 aH}<ȭ|:Z)a,/ rD3j"q# %pEc\ߢAdΣy탹y(nFA3?l^M90~iv̽<$ϋ%?C1'Du9T'3_Ӓ?HNF=Y4'1jh8s7̕%5U_,܍]~ QŽR= 7NH<5ihk˃w/Qd(rV7[<q<:YE,4K-4p=. ج+tXP7^gJs4>Ȓ6XdT=YnȭYJ}P %Q[\Կ޴A.O|PՇJ--Ѽ‹8KP?SwP婼\}hz<LEFeʰuchdKsD'/620gެoГO:g?hQ+&Np79DGF)XsՉfeW7.2} Wd KAQ!6(M̮C>_cȎ{'2+7ѭv4~B8%Y,.}/ڛv1z "-)cC<'ʻ=P]z *') zxAeC-{al5Еǂ_W4dLַO]w~H%moP ^1kd+445B]*UTRDTQ[!o[/*rSŽK}‚J+ThN!'O::6;a:hIէ\tmˇFwPl(m6er:}kOn 3~YWK:,OڮcX'sh -Ȗ/Ҷ7{Q=Ó,("Q$6Ifo|4sJa> 1KJq )<(/P&&?݆0&Rlw1P'-rw~^p4gq>O #G#!da[0vUN+ȶ6>Nef\o{=sY0j-7إ!]D3,^\׸&ȨsHS4Wl}!L=>DՅ`J>;E$buKS>t2}FϜeԄ14m-㑋ZG^]HT2΅r)=:뭇+9ؕYb8 VQ3tpV7ʠ5m\sdzk`Nw9~e1C3??@?jJLui'۰]24 6"S$TBB!q^e9)aKrKCp. pOLqAW8Z\ŮuO:?Շҭ{ q٨,7X<ɚ.G`;|L$jc҂g ]n|D:2d/@W;"/ 7,P:(Y>eȃ2uK$A6}$4h@L^WJͱhɃ~cڳP盔(Ĵm8.7~bs*~%i|T9$J*ědWh*驽?sVlHzX8$]͛}!VofS#Vn]wP+{A*"d꼖{W@!\P#u=YJ}MBfwN:y6C;:a#YqLN61(j=| >TE.i Rmv%m9&HHB2lĻw+Xm54y_8o6Hj)u=-ၳP87w|~YZ0E#o 1RЋLϥ&9FhʏWl^ŚOwbuJ|942ѽ.[yՅSɡ;a~h5˦X}Hc?,nAǟg?=G1vQhlބs'1<(z5?"Jg7I9-/N} }~Eڠzc~%#B.F$ MfFe޿jq>9q4C=xFvla6peF|_|I&G3Cؼ诞 /AEX 4lӿJDR4P@Ya?Fx#dPzEU䎫a&PUFG.__hJ ަ:7(αhjns~l^uް=Jr8na뙎_ap#wX9`[4m !i~Tw\Sdq9T+nrKyeI+lũI2fwA)'~7PEM5 :vv<*o!ho0czYX STޒ"y {6o*_i4HWo]%~;&+@QL0HwIl ~o({T?Vq/FYY>P:(u98OCOи~'1]t~1P3d4pDzoYzy74LǞ6,|ccS$7jQmn&yy=ND`эJ]>,D;Fz9I6}N2UjϟG+sݿadI1rVzC Rj{7ٷ37b&ֺm?(<8x\ʹ{,4ǥ<h:HGꥩRtCmYC*E7ɼP~2ͣ/H? g{uK !l@PsYO50l=f!<,-žF-0cRvEsI <u:_4<7J砪>aߠ=myr-C}Ug byq'>cvgr(n֑x d*cK_aTSl|xPZQ'pyPZ5S B,h?{0x[n ~MqQ*-Ϩ BR[D>. 2:>Χ$ObؗqECc nW~i ^'T};f/̧QSN^ŏC{DY>#cx[ l/ iA(g|FN}/^gwG _߅–hm nI{-|!鋽AgNI` 9#TߥB]*56/׍oxTcNV8~FիI#j9*yIWH('a2Ppck*nl;g\ hyr_6#_bt@wZ^- 43,~q`!&i (Φl1TsGWUab%]Mߣ*JP *J6IbC}6P+]B?έFdzm\}q(occ~ E=* I$^`[n.GIO\l6~ -qGFMr& vai#$7HIEvͼʔf\o{4ħ!8@k%|8n𥾘iKwjpրBIGMQndfל %v7%3}LA!gocGfW+5j۝@u2sF ϤՇdxɦ MJ2gaX0>4MOVT|@p37>}rTS=4Jrz{/^Ceφ?@ $C3G08ʞ;_Yh`unԝC'&0RB 9',ԑ3 ΕSfw g161_ߥi)gl:N$e!}G> ʭ طǭ|avv$? DcA/{h~WvGX(<Q1롇PCh\xK3yvߩH72!fyd8~@I#!o夐*ǯЈA($I?0`enaۻ ,z~TГ1uCMxAڗCgL{>ٱԋ@(9tGFJd]jLw*vL#BL+hM]޶SSVR,}cUaJml^vCM'1_V ""l{#hUd-zO݅SøVj";(:t*}*[te6VwWߟ Y72$ų{"!R*6C{.vN.!*ר Oqy0~1f}&Ѕh9hIPMlœTmuG1u+Ps\?jW]@G/7+>eq!dedr'-2QL5̸)YdD GSy3b.V] ~'gnR);^uj+BC̊'QZ:|%O.[߸[KypܵtZ?NeMp 40 Y9l^BeҷCI:~`Ǝ'F~ OĶI%D9XqyЮt.ib9~E>4?ykY^4$hW!Bg<6UIbyfA\ظB^i0rDC n>y:9.SuBc6/ot[sYGR1-]Cy``N^zڔ?p@MGAnecn %YB(O(]򙒺yhz'a.a@I̗kZ\krѠ5<4-̯z ƲPwK+vk-4 81 i3lߡbOnVC%U%piBiQ7rZvc?G Ogܠ]QqQsCj& |sNr_ hM,FT%BUrgVniqDg-qN7F;m,'PEԯ>B465˨2$Ge % QO˺9*Oq 8=˃USA(&^!h &d_luGL6?,xap͏WXo(ozN7)Ihpswj!_3Q0`#|xG5(HW,(@[R"a[%]|h04yY46En rspxz~@;M-2hU6*ch4?…cJz)} hHܨ.goDuu ??ډ vMF]DH3kAUylt*jSÏ?&!%֏V={ BbCP@*)֡y Xq@f+Sb1ۣݪrWMZV Mm>鼡ti(u &ݙg?@҅W56 f՜U2vbkנ;?^P{[NWI2 ugҾ(v-A%rlcWIL7t͟ TDbRI7&qyaNB#6QP'IˑWwUذg=J{Z9’"1yοCv*N<[lș\`?i'_4͑gQrTOs'hy6pWrR!~zMl*Cs{<7IP_WJ[zFLG=$>B-D zq2M]@U5aTAbz,~h/J/H+R@ͭFV[ XrEE]Z~.}>LIYsNC `q[P)˝EQ-4CzvUWqyy<$9*zx&>c#⾆Z.V{tgu`]+E^6T:;ri}|;4n:Pxw10BEWM*4iIWSz2ûO-1 0$e[J j=&茔BcG)-l{ 9?z]n攃f Q3s("fV폄=C@Ӟ"XI?pѮ.Pm3$SVhG^nŴm0Lc$F/.Z(ۣ {li#n7Lah{Z2/?K!;zMϸ<4h_ t}wz'_OF^(tsݿ!%9PiH@[7Kvj'Cy}ɗQ8L&EhU,py(H$jIqmJ9@ŷT".. ޾x)9WASNUQ0$"moB4pQgr}tsn!z 8"jC؆!ux(4>9k/poedp5Wq(%yu g=z n G F(w@o#Kq/w.|ܯ;Y<؊w>AUF %SԶ |^=aހ " h :U#,'?Z`_Jeu֧)\ GaI@>wdPmS7\{aH!(1fۜxXEF,O#Mjx0jHظ 2uK2GESyRT4}1[\P/%IEb-5^_Cgzc3ޛoF$M砱xM]XRf2CJgm`:3$:ɼAm7r`IwEp6:?#J92Zu\Luew>ҠЭ!4 : OUxQ;Y^ bТBx+.%QiK\Gx2;-,x⟊]/ IOB09O Dzn;ӟqyC G6yа+Rck"*.M>SW:]y*:,=tQO$*G#O ){| sD-ԯa:%{`=,VBUe-c?H1ybq:YXZf6hF{Foe@$E+,:6 U7AQ]d i;5%N|mغm4:Txd)ѹm’ߨAZ74i~ktbk;ߍރ&R(C BƓ(뷏% uhfq*=p2.c뛤 SQEllW Ehy3jު8h~0Fc&Qr<Фy1APU8%qac59%M6=i1[%]Aj-yKB繠|u}z#ڲhk7l^k1d[ [w:x9!py]\}57mF2(v~:FK)|~ n~h$).V6-3yOFQکh)GIe_̵˜Ƅx.NxJ ClXEPCq !Q =茚~ ϯwI?ljZ2 xY]D4C"{kv ԼRC݇k/-uh>e RfÝCwsGh"_ľP+E_x@Q]Zejᆁ֧`T0p٢r; >g ^"֥!Gg f{äRJ9Ŭ֞ @ 'ԠgxK_(?M;4I1aLRlzee={ݻGg.C_#z]~>CSOuK)vڙ(Q2Q685! G^}FQ]ͱ[W`@g`~4dE8ZHRo nsؼ~qJ%n.!Ӻ &7BYLq) 9)l֯?E-9߿&TIг v2'+u?T6/C7|OZ*t|jfX#CYWnw0.aeUeA ̉]V=x>u8P;쀿t|>+U?] wV^~\\vTORo =-)ʗ>U84Q"χ\.l}#- hË# ~\ ͜ sFYkѣACP+Anc9=r3  mf)F/SR׻[|ga[rE^44fLd)"М e1|`l'[_b2_hP|N.ns9BuWRj_ܙQ Qy[D4${Kǯo"չ >kUdP_c$8; <ǚ#ڼAUM}hK7pM%4SlAT9Rp QjX}:9=`bSy.hbm4 9&o'qA+[ԡ9QHtTWx c˶Qt,j0~K"=bkw^e&:ĤRf+?䖃dRl}=^wJW>ewkQHcw*\}PQUED~LG.\+cCF]jod?+ʻӻS@3 920tF>yɇ'.V_el}J]'A'ksmmrx`PM/Pc׻n]2@Ir\}S՟|&nh$WuELՠA*%+O"@S쳇CWAzIj[5o~CK -y^^W/Y'Z0 7):vGg a@kk.*0x M'e櫧[ [4\H̠:ŵꃖWBٽ'"1;  $moQu)zI6yuRϓeݗ_>R;o; V.jǮo]`^>uQDoxL1꿦?jU$ֶFcHqBsH噖B6rTFD_l$߼Ia` ө~t L{G_*Mm:rOQ#}695+czN=h+0|}9; W4r}֯nyh'}䝒s6Vgh1I1^]w5CJsiBJGV$s7d2UK)yx%M0ľZP|euNʰ`(vXn}IV BYӓvr^}~O\7gڱw솖΍~QP({FLk+~8?m&]W'lDF= 7'UgEK%WQ &D|9Ɂf.3U6~/06TsiW^Ij?R|/vN2 Vh0ҵh\ v>FRy%G4 -RؓdʛNF+4?Ak6Wk{G.)߆ZŌΡD˖{Y!n5|<'vq m Ab~ P6@D6o;up~D}Կ j{$ ssn%*Ca<0+y0h)R$TeBW5b] 47Α=r0Hv4}Yc6-}N#|?TCVgNC NhLvtc^g/A֏K՘k-)tҀm0M<А٣qYgUbD!sh^w dɭq敜zF dj/Q W>S͛=ҟ|섅H!=ԬS.b6wؼ2tf eE81p`lGzxjO]߱Pr0ܛ;07H<)KϋFv/_xr1 $qH\On92;F5$A;Cп,)P~ Ƒ_iy~/ kBW]S H}! `C,I)3 `'g|oKP{r ܵFz\5ܡДyw(٨巆8r8^ك,Zب6O}yְܐ/J"rj/:qr kOR_֎PR- Ϙv@SC%AcД ~w*cy7?>vMws~ ~P| l8b7i1 w$Swk=E'T.Y EϾ5$ZpO祓]1S>~lUjK^'ShZ.JcԊ+\^kV@4j5X~wOlc<<];gճR&_64#-l^K@'FAСt07Z/D<6G֠jŷ:D_a^ 3go<~ŅCn!\Ʀz1y3 VXmh*8Ʈ )ڃh mH(̘]|sFy-̭W]p;ntS-UD2Qn i;-$Avd Bئ&D|O݂vn5)FW:$b{q'`XLcx/yH@9|prVtYL!Z.e Mq*$P  +i'U r+Kz )c8+l=+5ғ7a^HQRƅ=}(rx<5,{y`jR5(T; RԾ:@oB&2"xy;7C~$ ܸL6J9\(UwP8M{lՓ!*^oS/4>06W탡LҝؼY@0Rpz E.z$|;( n@QY~5~NW*L`2`уIжab 'ج.aB~:p,"Y.9 .VǮk< 6/dUo353xC'ܙ/1 #EF!fG(M$Ʈ1öIѰ6x6q𭏂%/؝y'LLy.Vwu`=oصʻ` lOji) ?8Bw9ytq;X{ PR0ȇ<=9a}}H8pMʚw#gziyt}_y>ؼ [=e?>霾z< Ocװ;5J7ܛ鴊Bk`O?aY˶A=ueh=Z7@<jq%VWl^9O20 h JIф⾦5> P|a# 3L\.j.Ek:vzt+mUy_4G"lޗx"H'hyqpHdk>ݝ P$ ×Nl36@Wo@3[Lp>'J}:/α}"oa臢Bzdw6&R69yLRܣ I2 zLS41I09gښAl^31?-p5߀_8sOD?4T:gcקqs+5նP&YRh )Wa4Q7/G1znHwa٩ZL\gj ~[fr:d)Zt^m}#c)21@- h捞@cnVx+u#{gzom>wMWڸ!G[Uvt# 8vM,y1-d'oBU\T3^tfy ^q>o6>AѴZc6|CŬ%?&Oh#;9|J<5I7;`CiPwIOl݉Ŧ%;oJyHgI?9\CC/UCQy()Xdt_sA2V{sPXb'~sZe;a!jN1Hb8~*LލluP~;=~ NOMp}~FY'i]ocC @v<D(u1 @LS_d+gʷ(-f?Zt,!mz7fJ6~ND6߆xzU|c^*#|`8;GJ2=| wofC<17ղxҢOA!H/IJW|͛bPj-bg:V"usB{S⧞;.[2˧}I'Ӽ,D8Ը"Юx6b(ؚR1Eb[F)MA"vv~;X9i<6/XCJ/M%Z#D^;ˉ}_^?ub󆏤dP 5l~@ ։#'k_FEad~.E"MM 𞪧D2*|9\{ ?'S+X̂uꕥ̂o|gDн.<^^6 5m3Xj\%G4%ӎX@XL#ȑfce]7Ky#uyZDStme!_Z\V>GLX .0>\k(#$2?.*zxI{h]Z>Ac_ ʃCmg.X˝J،cI$ڭBe2䑐Yhz~f !\/-_r'zCCkz5x ݳvFjYW&lސ!ШyhI }"Ds%'XcR߃Rf!f5/}T2 _??j* ,Գ(CIwe"H>qF>|3\ {XZleg'h&(.%k jV¢oهG#j|/b[nBb9iЧPSs )WHlډOBcؼ Oc7rHU7>eK]e`FRXjRw|y $(1޿LCm>/7$"uc@ЏWwgoB8!-"YKB 4͛T'u6JAYDuw# ߕ ng I ǹjl c i Ps㕔ͣ0 %?`p͕^Q=a^6J_A0Wܨ{@ w ^Zr#a*M w49wRvh[ yBqEbI,hWBUʶp9黊csxr狮%J|QȈ/zi~cz8`t}l#-~͛" Bp N܃#Wyq]QD>i2 辛_Mč}kY-p@ ʃ%{ ܻs/KlG8gQnز4X2c 0K2ZL5@I0 ~+y[tH}I7懎BSa(ʬ[(XWS.31' PJv7&߰yiFn_$ "~[`ˎ9?3J ̸aN\_ cj/?Gnzd_]l`zXST+/an L߲c(02 @P8{.ܳnЇ߶I@/|fUߝ111U={_ZIZ,Mأ7 ,k6L\+Ѝ6)@:[}?]>[|_;℁Z1W,y.CŐ` rg8y/ZiBe;oK5@g;yb=򜽡:1DϪc@Gi7#wB" R<[P?:*nhZ]\ڵ>ɳ-w%[-ҁc g<=08lퟌ+\{s&_/da8 \&:%u}8ULqމ_i=P/םQL?7BB?a|kD_wzBUی|HڅsIVt?>H.^*<.}0ɾpVRuMk1,t6`UCo!0J/H<& <{ ~wF_Cqf!d,GX\?zD?jS'y?[~\T=ܣFx@ ~Ф.{~R1 A TsؼOBH0&2( \N?FrGyXVnXmAr64-1O "0ߔ ~-duLmc cN[eA#Oon`oYHC>*/>fB:s`亹9');SGWᯏV3|tLC9.ۻIi6G2L94NxxX./C^ =euSbObpׁQ7*ؼҁqi7LDJ ܪdw=qoFe'!VOZdT^w?_~VM62B`[k6 _uœ+U*Y4Zy&d:<1Udn%v]M߾7u{HMn"$ ƍ$SrND֨ E6/uix?Ԡ7$'Ի"sZf+_k}^FMaO LyO=,{Hx Z-<õ/@ CȦ ;2Ls5_AQMMhawWw7eIuγJB}filu^;F3~V,1WIlފ)'m$힂2Yw34 $?e^uSP4wRnICT\'6/^4ۛ0 aE$ݑM`]9 ݰyuCi/˂0sn0#!hc?|:gª9vB'<<^^W̨C O=VP"k5jtMwg"GagӒѣ-ȏؔ65iƏɾt EW|f05!rXo3kkg)o-Z6_;aƛDhf9FSПwU#Ei,پjݯApٯ)p'f#Rp[X rdN57@? K@ _i$qG nRCq&j3w\sc!^ϻ xI'$ fW:Q> =,b\ny*;y}N} WU.. vC˫5(m/>7jm})v &s|Z! -"(AʅJ|^A/rԃ`T;T iχ0͛oA@n98%Ly.8dU5 7(Wx$=SKa<`@_$9mCN='{҈?Ǐ1J xȤV.ocWb[i 3Kaȿ¤cY*="pH4}އZ:D?|wS)AWߡW> ÷ܫ\ 40G>Q4S'}l@< ~>H7WUhj XY:fEk-d!'6*NS.Anbn|ڂ߮pTJ덳yo!iYj}#4W?޶j4A>v'9 o@|=ɟHzq_ܨGx'[AfLz v?49TU.1௷ 8?h P3Lkqf-`UN Mn_kϨ[4Y]0SJOzo'38q#@՜&: <.2Y,OQnfo@`bk6ؼĘ~zi3]|֘ڄ~2"?pw|~>P- A{Dy{Ƕ|ͮ:Ԛt=&`:AtV=5"$W! %t'ڄPZCw0'4nSSv̾R>jECwb>BKj_MLߏux{- 2Ts4~ )ۅPLBV0r !]G<y%y)x6N] ,BlPxb~~L徉P׹)Ԇk`8/iKƬO&=ݾ6/j8C~B?4ZP %n?Mb]MYՉ'ZdϛeZ iAc_Z◩p~3Ӿ^)O @%7yI Ş{M[W.WRj= ʘ Ɛ= &/BC6ep}@7I'Gw֨~e0s_ye>ğK!_CˏL0W3†3Or,]P*CSʗ^\ /4< E&\EQ?|5]@,~>zݟwۺDUq!6c)vh>oUz{=RC?_䀯W_#n1nȈ,iE!_ح+4# u,FyTxl KA?8>QOr$Ǡ~K2!${ \W~ h iTǷRc}y@(ћঀ1 Vzp6wOįqrzwr懷zs?X'Fa׳(A>˃@OW"A7k8 `Fya =7ٓ{H/V25>bBkJnr>ߨȫ_CpaVeA|dgR;d 9J;;h,*tIHl^z#)ؘ%^Ir/ﲉؼW!@4)N=4(:dv;^cY?C5dPv(68+qvT?"p08Yޜz w9oIw\ȂޫqbL/B~_#2?DdR#}Yr =.rPEox }2 ^n]+% qo>!l^e>@ĻI m5w|*xOիOCf*gWC/jo$3BMmwH 7==;o۪ǷMq@! QZH~MR;nҎfm[y ,&5tﷴy%_gdjaRȒvi{,8R[yrn\?W5T ^p{P?~f &8 &} P}J?K_!L7F{{2P}) ? R-X Q ]#1Xz >t^cƯ{Zl_nB[pO6e*0tKH,Uʽ$ N'~~IAjzI(-4φ74uIyYgǝ`/Arv8ty^/0&,{\ک+{ 5T$yN^.!e0Y"{dqZ1[%tDb ٵzO֥RsGT\I.3+K8m\hK}jqL4ffr6 R2d%_K4~j!:髯+`R e ol-yթdJ6 /򝤀gxj23_!ïO\]$K3x+j!` 9^wG㟯:p [d9t+5,]8W-wAv5'|`c> :~o.GLY1w$JlӾMώwhN}di}O_`U d,cuN9:25oL&'`ä:zS-t$At65yY}ZNf #>BHkw>9D 9(\!'C] UgkS~䋑^:h8L#5F)_6oǚ/1y.D#:"]7(<7dpFZ˛w6XZ-1yFmlc`qH7{#9S.0> ?WzEßjVd/BGgvzlMbO==$mr$A|9 CI<)ߡx]R^D {Clz3ÀP&Ih!5`Yϯ7ͯ=QTTq'+'V 9Wߝ_u=πPg 9<'qv6r_ߴ%Fl>px?ܛ)zу{$ }ԧ>ƶgv0cʢάU.'BD;[$r+|L#%cL!/4?({BAgӠ1ql^1CWaAӏohߟ'axOr@>-Hh 񇙯gYFlralE*yPv(ǬQ&C$rc2"2I_C[Xd4J? OAInALbRɄ8?We4w[-{OH_/dtA9̶2y@*&<̅y~7(M!IF/ȭX3v⋐МB26/I(6d~8] Bws#?AX7Mzh=E K;\z0U EXT+XrGowƶ[ޥyNkKؕ1=Ni% zKzPgzڥ S_gխwD]u:j|u#uUbY4޺y<䤑lOYBt$>4Ocϯ\,<j>4#0ڻmP?.o'ɜ?@]W,WȐ-,Mqϭ>Sϑ+>b:Q p. ͛XX߂"rhزk!T9V?M=*c(ZVR !sc5hT}Ɣ+3d~}O $|,=IBd>Vy{’I%h+Qr`;8e R>| *S5ߗ96fC|p1-2WjL6oRLX)*^*|.[䘡6<5e\ K{aD~q?^iE[)yN\+ط I'?H|^] * OaQS:ס -I YurW>T1m|묛рuxߦ ʓj;Sc,I0 Sx^ ;ɍknNd7 c%.Q;3CUq|f%ň_H1*S18I@ =9\}&;z~;%:) "Z.'󲔆㳾Px8F^mւs -hЕoWyc:1~XZ"Ut0t8ldsㅞ@c50~S2W?N1fTWf6dK|7.T⥮\]91W\#ܓ r//[~(C/7g{[|R8:1(rw r{_w,B/mcS}^t%P75yӨvQr|0sCBw͍?JzUsZ ǛAPzvvA!xJP.6y#nV7ñ?]: &wQ⟿xa҅0Pty=301!r:Ձ&;&v%گj{46|Cbؼd^=V8k33?v߷sifǍy`(>ޱ^QR*9t yyUGyɓKyk!oOQ2 Zr\d&}+]C>A[H9@ca<2P(??ai9T ڸRmbG*$޾┅\bu(x`z;ma>}JNEÇ[ψ4'dHV_" ΃/Qօ?R յu0H}Ni;K[N6.1[>z_A^Lezs! >S1aCY2jZP- :Z&~M~dO7ka:Qs n% ?h=] nRez}2(P,zǜkOir^;q}Rd_e:ߓ/9u#7@0Q ݔĮND7?~.Dߵ.,CBOQO<'/.w\dث[_5=V5+;9UH4 g/i.qUw 1IoxP4íǎF#kCaZ=](0v/e9b!Ab缒bh^@sM_Js4Z-m"tӔ5ZhFΚv4 =^˱8:5i )1_r`T5h-uhmu:U) Vq.AS2Kyh|]Ѽ=Aq ·:h{xl!/ZU~GPySwh='-D\I"i_<:y>-ŴE-$:̚װKͭTסA{.079Ѓ{׿CLڦT9Ќ|w-t,'Cs}\xtמW)4/t>}9o݂7;4vՍwl֦St%$ _p"]ɦXnx#9a[Nށ٩Bir)8tWFAsDߡyu^iEYRN 37{c +=+ஒ0N_r0>edecY@bƋtƆw.^.zbSk6X'i`߭"C2 p[u;v5kӋlcٱ[4^8* .,(IlPMRCBËd>Ա}m{ftC)Ӱ_<ŔF)-wKi NB˭ӯ&"2>aDy~?qq8SqC-܍WI>kPR^k> Y;9ͽcƬ^g2 l:3sJFb'Oza_ZOb.$_Z}s~3m ~<ם?v O Bu{9ZXJ6*]'^9Wcq`AFFmlEfoh(|XCj u^q m#%ݒn Msc_аi%h1 gy%>Yҳ}QGXPXd`qBv65<0Kŋ* 7&?:0:7-nhJ/]jywJ؜%G~Ԉ>t%۪kƶ5B׫<`}:oNB1eJEhy t(ifs`뭏`\wza=l /ksɻ4#pɉK]0bʚ3-#%Ǡsaαj\:;;E{1S! t&_ċ%s=gh#ߗ0"|2ظ$.KWa22I=ԢքCGQt4 U(/f ⾅+䗺бWA>Hٻ~nP2<C8DJ[|A!HU*9ufᔽSֻ%EśkX*Q7#?[QGQa - 7$!0-}?.m{ȟQ:sAMv`_Rnb0ӱ)\gJѣ fiW.E= ?VwtȰ#ސB0X=Ǐjr7UAYwj\z,(TH Ԃ97`@nl7/'fiUup6]NF֛ΉVٔt[d[NȍPl{=3|GܺYpcU]Lyu;Qf#37P\ES.0k pOM7jxo>?էA٧3: dF\顥cy!ǟu(X`Hhw;cmC%+f!K%s( XYS%^ծ~y3Yc{>;Ax{ ͨN [싍wX[Ch{%Q5 R4}R&Q zoB^/\eОWa:w6FzFҐ[eT=RL7s7 Ef#}E nyrVfSX"m+ >xw~m/˪cJ] jPSQ~0Z >^_8kn݂]zPtC.La\B.Uw824ə@˕g޹kXπ={LO^q"$ G^I b, <4l!72aݹI j]|A;VX#Ǭ+m֍ bZO&c4fR9g}_0wؖ'P:LZˁ6.n:GNv;aK' =>En=K!:,0P=.*q]dX@/4?e!} Mq'Óҩ]< I5кEcTbh\m)p W99n9*J1'Bwjd >m\2it/69\ ؆M%#EȠlVQ;}\2vۛ"H A $H A 8o:&{82YbtkM $C).^N7 =O}?+?i }I>_5DQ@<5DQ@<5DQ@<5DQ̅;z $H A $Hc$_\ǘIdShT'@;LNF&#H09>bk:1W&G{OÉiN?v51"ޞ4kܩ>LtNuR5o//xv㑠o-a;Wɶ~'o꞉9%Ç!B"D!B"gL Tw/7{MV&"ӉVmzNx4?w"N{;='$W_ sEĕ6ppwy2v~4;3{q\g@`"Ɗ넕uW8:ji,ն:;j/]tC@]OŤFo,)susieR/tests/testthat/Eloglik_rss_lambda0_res.rds0000644000176200001440000000021313607145336021752 0ustar liggesusersb```b`fef`b1|> fּbaLPAb(7=$>9?7HeR(susieR/tests/testthat/test_susie_get_objective.R0000644000176200001440000000074413607476333021752 0ustar liggesuserscontext("test_get_objective.R") test_that("get_objective agrees with version 0.3", with(simulate(sparse = TRUE), { original.res = readRDS('objective_original_res.rds') scaledX = set_X_attributes(X) scaledX.sparse = set_X_attributes(X.sparse) s$Xr = colSums(compute_MXt(s$alpha*s$mu, scaledX)) dense.res = get_objective(scaledX, y, s) sparse.res = get_objective(scaledX.sparse, y, s) expect_equal(dense.res, original.res) expect_equal(sparse.res, original.res) }))susieR/tests/testthat/susierssfit_lambda1_res.rds0000644000176200001440000015075713607476333022110 0ustar liggesusersuTWMMJ({ R@D.iT$T@ }u=usrm~g}{=q1{IHHH)IσoSBH(*oP6v[* @xLi1~^ ow!%JH1Tql::_`rOu ^!}_U(E/^vqcCg!:9cSDډǯ%ٙq~k@"]@ }Dr~G-#onMHuU29~eߞ@ȝx@'Hv WU0A~oxc}}}[H%r fMW9<0Jz ?[?LAKI6EjB%E=u~ȯ"w6KdUBb-]9/YMM<;nfIQƯ⟁)$ $GB6O}:+-@Z[X+,(f'!+dq +'[Gdp@*c<xF Ә xs4 ܗ]#5{r/!ۺWs t 2vrWlYBI8p 4\aOcwa8f\Q$+Zqce c(7D߿."b WqSO&ˮtBk-'MP*>xo/)2 ؎4{0Zwr黿;AtS"lXduBe~eJ=GYoi]aY'dh.-;$#_ߦ$ E!밃r$u?0 2H>P{?sLw=4~Oۃ/>cgE ?۟G_qN@f|_> ~{s=^Z@Ⱦ ʗ+ϛldXO}J(GLSX=-'(S~LkoЏSMW=Tv~:@ʂj~b4/\BD';fG}L2FDZy|f9n^@FD,(b9C2̕H\S^$1,d+^͓ rk_Nhs-;a}!kdk~4_ i؃waxLz[9:{E 1A7>'w')vVٳĽ-oȎtH}U5(!uo|~\,qp ~R WSӫ@X.n\g +AoӈS<!˦mn2eO $qq?ߐ:SxSxa?;)?j#u#E:Itk8 h|ae-Bڋ;=Q@8(ҶZ  15=7+*l% 򒌧y5H'e QE |6~{k>ДZR__ځJ<û7u7F/[tӁ\&]ؼsש?'d{ +ʁAf ^R+&*&7w@BuZklSZR 1]j- lkނkJU<~k…ooXNRrvT9 }`#L! Db34ǍwG`Z&'tnRYQ4꟰ywHP!z)6>8S8?c{M~Tr{F(߿CoxQyǁ èTŃߏR.t17]$iCv7:`g># WVBS@J|8("O'D e#GȨ dljm@N|<;~{;(0(nj{ĝ Ogw,|^P[t$I{n h=&cO>WXÅ%9pf*$!26 H_VG 9~9*uz O .?qJ,GE(!PBeQ̼L_3$y' ÇZ2z< \<0ֽ>\hR%6*4@SbKOLrѽ.2ίϱijo#q !j6_#4O _%џ?R4|% nև 3:Zhrp)dM\-Ed >hG؁$w˼\as|{# FF^jGkI +(Lu; wEķ;esU^[?n漿&vc^TF3 Ki{>6O){랫w]P 鶘'd еj_j֎|'d:WniAOa^|X/MJ|" SSiߤy/@Y xg$J)]=؆S?+n=⒇ 9x{(W_|Zbg& B`!>3jj~Mpx6}OlINgBRi$Jx+{dԼ,T i!~>: `рE1M3a)''i%6T @2=WfPmJ~8IjAgZi ڒxHv<s!2z@Nw~;xpPɀ8c'K_-ҾܲA/Y'w<ȸGXH<6D: /58t,ΑUJ>syBz!!N$}z@Oϒ=F>yե ĺ$+.oD%H_+_ J `(kcT:>;>>_;FhZYRl4@ޟ7raΉt[!dGt;|[[ο E.˾y~͘0 d?y_q ߐ%wsG@% ]ߗ|K"\ð1 -vs_%??Utr HX@\|{lo>VÓ@;q}1lWZsoNDfr =0 (W`.H~%S$@=Jh0sE_A!me $@>֛؛rD` 'л紀ԛ-X aFr\T^![y:]6pNP2> z_*r3V#dH-)ss]@V/Eh5+%B~yߗG7j!rNSşOTy p#}~٣iΝqˣAɑc`tqɷN(x #+a2]+)ސgyJ$m^ w'c6O'CB&90. g9L%3 Uue}aU>9l.`N|x:-ic $d w iR}&<:Fɼ4A '#iE6O:Bj`}wR2щ9~5vǑv3[ ־q%)a ]% YB0+~[?'L޸`P>4HzBH(;eN%] XǛj9f57O%虃6=)9K XR#?Ծ7Chh  xdxFp..\'df_5e끫 {YU>MM'].)S݇@ J#6i7`IȚ3>ڑR{ #'I uӒ(H. O_|xx!GTFH- zvTKG/=Q$:t4V (Y4d:ZB[!pZmZZba8M9Hʕ;d@D*{s ܚMD?O$"Ar*8׊<7?H/' _B c@*/ }E&K7YjLDn"/똺 2_̆/THV?ہ@rE ٠bHJ#Wrs( l^K*>2⏙lAFɌԑ>Gl`9Ғ0ݓU4Jڼ%&ʡ'ˍ2i>ru $(}-x'M@vi@ҲbQEs՘S{k%sB%z lεHң/'SB|ӳl{ V> m.yq EZdKvaC׉ €tSgP_ gWNZ6 $sl@v†֩Jm tU9 ׂd@(hf{\W_pѩ7j~QYYO: U(.mc3|4pRj ^SN;jVJOlڞmLܶpOF~};$qP;bE ÈE-xSkƏ_d ?'Gd,qjsK= oul޹Ej",zHǨWh~+7kNA'>g]=[!yL kFm~|1;҇A@}*jϏv:MZr$sOE.0js?~uĺw~H ].g ?aX[F(;Y%H&3׃:eQ2?]Mh;BAIQbäHD~/6ʣy=9ƒ7ǃ뗬ŹO2kYCs@±~MV*-D({!Vvjmss8CQ(E\8 R׳ `Ɓ3yUBlGZ9u%]e/tyϭqt, HI .:*7 ?d +!b@|e`n-'ؼp6@N)x#T>Km &i|{k(*=dPWTckj^IPnȜy5n& ׄ^̆9FX?u G̽@">v86z)) bH_عLie1+U$ϯG BHA5ka䋢*Hښ+??τph,S\W@{O]dy<uۄ Oo I5ɿGd\1qjCV?Q#dډ?@v%d@+_c59aHzVn}* .޴4'+ c?; wQ{S_otMӅsqo.¸Ggr`ca6K7!%cM8P8dLďNhQqO"̪zi?XalpoA)UkвG0~| x V<7@cZ^ kWX!6OV9wstʗj 1\zo><Ŕo}MxER~}0(>\ pbB7 ,8!\򵨈ky*Ë񣄌EsG MZB5oRc$&}aR ;l ˟y' (Ӄ׬=f((S?f|Тw@NSVX\|O5$<9cHyn(΃=6k]~:7o /qv7a'^dHi2+@Q Vl޹Մm7ڀ AnLgײޓ!) 1<^`CFݍO#*` $|0\+EՃOiU9i ~Nήա} Qt& [`f! ?Iyj2_Ə>%xN⏏d/_ t 8)Kǿ +O5/Hўj&Q!(zL&#cBh}`egXb9ǐ[KݒOe8Hv"4MT%oH+v tBt+$C%ZeMs] 1H+^?^=rU-qIE'R{#d;_/}62>ֆ\`WRv)h[}`otZD !T.4HH &<8=FiY& lPӚ~\zMV8H я y=&ouR*W^<,?&Zͦ8AۼN (,P[7S\'lyCn Cw@;)G_Oh/Q_JN]]M./La, &> BFpك~»K\Lۇj!?u2(hCy>"Fӭ;0g =fÜ /q\ ӥA{GJ}m@{ $~I=zعF(Um 峕W?#_#q%4 S2;[+R 8%&0ĬWi}|˿V@ؙ쯏+|૬Ȁ!:>;1@G[?0gu'FIlbDZ 'Bin&,c :YF])~2gBu cOAa{'<bd`bIF,@nIxj/_+ڋJ6.@ 8(_ͻ 0~u0: j{tdU5s^9ؼл$J~Md>qß/IeN't[x~IW7 =cT{lns4V '{̿Y2s_ -Ђ@ ur&7Yy>Ih29ֶ{ ]ѿ| 5#BT6i`Ii2v55xw8[pZH:aLynT}OD ՞@r_D !7iLyZu2.N1G~iRG<1u~BzmhOza gX}ďR>(:7^^9 `sDZ @:^ O|k26,7A=s;ٟ(ʈ ~>1R|Ԋ|ϧ%!Ԩ[JȆSpm3= @ɽWz.U !=paY Q;䆶h6#tUHg &p /y?/!)U4IP.qoF 2) >@Taخ&~mc&NQ!y K OhhlиG-_iת mՉ䇁6#@76OYvdFu] aߠy ?:s 7qCc+]r Y1(bkE$zm]E݁ԡs|@~-aMi~|Hݐ H!Qj|Rj̱ynWj_& Vln6|=Iu"9^$b42n~I> >kI/>b~"4l%~?cAI,?ܷ+6!֕h&^ EYO`a%P1eG滎pu*޳ycSwzrgVZp#Hr 5=3 &5 cq 6~d(|96)'~JǴbЈ\ǟ/|ls6x#:14c* _?򅏹?1K?^y?UYO0oWx\ ;Rw}<3(`z^+ѻH U&*0:nsq$Ր;l3OEqJ??Md^,<6Γ.);~ݨ6n'cXO 󰯟TxT!u ƾ[8oόwY#y@|uuPɰ? 3žrgō ujST1DfU O؏fKu $AQL5G 3w{F #Z>UӔ&-k^*26B+AfsnLHWE(Wvgmm3MA?O۩|N{|m{Z,W <tAƒVn`l[1zvRg }y:?B/3T4RXxb!t%nddj1Z sdPy h{TNK͆R\&KW_riJ5]d<3h.ߣwK ϫ@\o1 :V㸱/A( )x{Jm)$)$qAUI$. /9R,y?/zNF&MwmHPGRuY\7Lr!nSf]}X@у7[9D~af-q5+^7kL5lʻ狍vG͐a Q)TP .[)}[jHҾdwdmFžXd<^4~ 3ue֍7RSeE4^m$/]=)ċ cWe? }{wyzY> K9{/ $^V?yŊCEy1 \C*,kVE|]@V|xKY~ŒS HtFonSFWɿGU]5RiKr~ع}Z⛢4_k8<9y؟y&8Kz ҭ=fpeT搲W4ChB7ݩz4yoOp~eJhIꈦ1%O1LW6G@2d NZ9G< m#@+]`]<= |L^o{1GSvNw}WF%]qV.F'rk@A,OD*bIȶD l.:y_'$V[腰_;ry9WGp4p9 $n/k:2b~Ø+s6)0r<;&ZA$7'l ÈB6_q 9T؁8oDl*#uۉ&t SήW΃o,y6]ZIhCO7';b籰v%mW)_BW!9 Qo.4"&Z]Ғ(62d :݄ѝw<"GYLyv|*8E(.fnIJΛOK V;-/^njb )ANXFA:^ (09=u|G g{tfQ2^fWyb[~nD/G8ɥ¸"PT#O"BoxV)zABT6Hpw@퍒:xse 7VfαBv瓹@&BF~'?\m aZs=t Q@Q^hȲ*ÏWfrޏ@5i2pߏȩ.i֩_jIߤc 8wlϯ!U׼${@Rtd_9_fho0!sye /8?-xߟnTVk[24>)kOWA Wt%>ojcRjL?r54[nZp/CC <|1#\ $l K5,R ҳ|}j ggy3QE*(RzUB+xT5rE>Z ߄>sXpZ}Wwq2~NvKgDCI*@GPTH現/#$yjN'zx_A/|y3~qE uKGBFQcȷHM^YZ?\ ?5!~ 2?6?+5>\hQD.?EjUNy෷lwG ja-Olބ2YhnDUjC.Ȱ h} HD8y 4+32t_Y+YI0lB)g??ơr9 IG${ۀ?_59/u44B}xs/ s,gMC ݵ+yƗrwt5"?πH&Tro\ a]Vj:`~Exw"-rˌa}} Ho}Ut -9oЛn*mmAI&lO\6!髖?fzd_Ēܣ#\PxdXQHw|MQ'7ĵo$@ı OrDw2?``H\ڤJ AAdo쪯kbeM^ } ƆL?j"}eIU I/:ʋ2㷏@ʧ愊':#jAFsg(yNg!d^>`xoO%6 fmL#XE?>`i- wUJlAe#lG:Oq²;޶@ŢVT06y  }'oPovT0/mdLaP"T_uc\ukaAf~1\ˢh~}8?l;r!ã6v*d'%@Y?G;Pf Hdũi΁,A;{RB{> s*ȐZ8n.ybEEХhԠJ]AAWl  sB=-ߩPhnʁgo]s<1K.:J)?Ƞ[;ЂYpTҭ5 _pc*9TA>*mc&tL!}|ܞ4ŨLf7uq%IBg2 yĺTi~HыT t>ߙ;$/lhh|ͯ[Ĉ[ݧ^5>nsѯ o! }P>'넔 !_2ʿZۛ["%2y/l6iqi'vi{s|Q:Q%tbF|3Ю.)BuOGBHHwdutj}gl 'pGd I{{m'sHMH6k3⋄7!$N <n `??A\$ʹ❱y瓅G+UIymwP2Ʊ ?_}ZY^Jczw@:kY >UCOIl/м5g?eUVB8 $N[ [: KC\=4G)3YuU߹2=^rW~[?%n;2ldXP\V+*_pz Hȳ~& ~&BBaQ™'t+Z>'mV۠I\5N0XBا'xL|ߟ/w}ӍЙ4v~(@Kҗ?>Vn+3 ˷'mCdDn8z:i eSN@!˩;ЦX7ۼ70=#J=/ϡ3֪FV@9=)&4/ɖ&_Ϯ,P[]] CWُ=I\u] 'B ">V"dR٭z4 &j%yRF:z796zH>yC1ĩh^}?7|ktŶQj@}y/5q=3(Qe9$(i꺛0}."g}rުKK nv2iN ?E2cʜ0B7jd(Z'\0h %Ny%K$znwY qY SJ? <vI߿Je:W.H#{%,9c-c< >E~.]/}(F k?hm#]WvgIJ_[#_IA&|s1؎!b@3fYdG"FzeJ(+_ (ҽ>b`~| 'JvPjj$~(5|nifov2B\O)Ok1}w9 wv5nYsHIZ~GNP2޾7+$);JI@>ikj4tc?/ЫoU՞D*e5&nl.o\s).@PpW_-_nҿS+GʁTYcݠ (Yq&~5*_rKdHO( .-QNOAqJrK7LVT2jOa+]d$$$$H^-l^Y{' ptCz}>L(FfL;-yH<[ɖ 1y"uЕH2]-:PGv;YLkh04v9MRIRQAE+<| y~9g ށbHPљŐ'IS .w(~ m[Uތr \289My/ހm7а+!TRWV lnMxe6HԫfFϺ[<1cLXcNş-Όoqsn.hyd:]Vzex+Z l%̀_=8b} L|+"=obk-0Ԃ[&Eݨ-ԢKJ~ Z^1_ 5쬰Xv='ß9u_jhRwW\l"kc,iITPmOvw~D--]8da;gpߓy.Zl}6,`V^uԓx|ސ`4zBq]g턫'eOT<|zH;wdj,?=mol{[!!Q?=?3C l2oQ(Z\r42ϴ4 }R ^2l|n(eqs40ϵrcl{VUB0{Hlo%a1?/+꼪i@MdRIF)f 1շxz7x]OV=*߲ GOmt]L: :#R͜XeJؼpv(w8dѮ)Joܿ߿V eNQiXzeY8(*al>oߵd'ߘ?+Dz-/q+ã.lؼbL pV4a2ka4[СAY}r4Xk4!f\'XzbM. &O2`#nmlhb26Se4a \`?Ջ*-7Hawa5B^|Nب u5dN3iRvm,h6oI] 6{ ;+3z舳<VϧM0AT3`Korr8&E[g։wF#l(f fA\ 2Qs|1θNt;ZKN2R|$3ղɃuh`><8d:v*^dNRٗLSGs?¦}];6(`w?=B;bѨ{vv>hWΗɺ`3K]9Cu^f% pXײ)jkn"Q3 H*FAmc$[SUd/c;$y8O~+}} ї \\bqL\E>z6b)E e.-iɂC-`gk ,#_ڗ;!vK>{xs8`]z<4elR$\= dxedR'l^%ZkhK~8$o2$,T@oz^o '4D JJvcZL;!T5;Ql'[|iT{!޶Ol:gFph+jF#U4|O7QߛrOɮL?GO`aTz`I<="W)^OqUbeIȡ8l^K4]65 ۦѼ \TmB&5,~c} (wI^l@ᯜP~KB0`|8j҈rsL섖چS݇}Py9pyʼnćezRlPkf?Щn{M4'Hq4iqCM9xocwgåV𤶈 ZnsAC>Dt44^$`n)IZؙs%(76׶o>B`onؼoap!{>20j͛hП@ ?GղQ'AhffZrxhB6[塩R=mTRA858ɓYQrb!,h20gYV?܉G,c4b~O S~Չor=I5*I};,*JtjY H+GC;Ǣia fUaPS;?E73Jkz%]|QӡB٫j+naC#_/Qtŝq-\,8R:,X~ҝ:r?-23_Z9Xҍ'MOt ~*-4-x[_Np6 xSr [=d5J1ҋ֋CH/2+?sX`fS ן~ C+ ٽؼ\Oj}xn><;9 KؚkY-ڋfboa"y?WO)`eӜ,l}ua~r;~,h>'h$f;DXwamjF` >=ءO;fe˹<ōpt;\l{%0B{^$˱>g}=b` r/ؼ)Op %j j;?.ZNqkǶG6U UFd;v9?a{g0_V1Y f=&sa)v8N(yּ6?#,ߎjCYk-рCVg0/e#/uwCUQW껗\ؼiu݂(p&}(IMpw)y`opDg.py9vY$\w_u@_4S15'S6ƑmW-zʷIO2^|BŴ4ŨDu f5wUpÆ5OYmoK}Of4nsq98NCT J2.:>^ѓ_aٖIuUp3'I/r[ߔ%ϹiT!ۨꝯVI}Ofl}K+'L9HϨrrn]( ,zO ҨRls<dhS9{N\@}sc"%^^ 8M{0in_5{)۬Y8dt-b2z*DӚb{z٧%8q'F];io,fSF((Y 3F0P1:!\}0C8u_Qou8C~g ڰ+^\s'B.NTOFC}D͗;GzruU\l7OMՇ~,TЀʼno3Ш_욮.lc};[_NIVhatp .Lj4S?׫m#W2w;4Dz}.\<3=S\ғRC o2r܇p:^ ˁԵ>δ,HzY?xkhVA\{aqwwVzcecիK7JoyUJIBt篝 a:V +6oEWX]T. {y#{ZV?7[m`UXrD(;ti5xaҊ?+FĘ}BB[O'Vp5)̂ eXPNh:#Xk˃=?Ȯ_O+K9HzO3R|Rbpio4䃦VayP^MI\剀L#Rb 6`Fѭ-2|}aWѧ= s͘d4Vq+.&Ē7d s}Cwa# 8ADõT<( C\{^7`"Ollmr Qucﰄ*hQ>y+6kB`<r jSݜd6X3Ph=$w[߈y?\8FG 3U6kuؼ YgtQUR/Bu+ y.~^XUBu6\{` z\ݍ&{B=4ؽ-Mo{SXF^t@aJ'j0zG=WsZ >6x[5Ye,ڐntnLyspvy?PR[? }PKRm ɢٻ_wF5;ґh3oze%X+GO]rc_'9Pu9nU[]81<.ӲJv4=[z:d6{\U vQ3CK(N)8G3[\6  NrC6]`/Yplr3\Ehvy+.)rp~T0#X[|>PEyh9c8azȸMYgI]ehq7KSpO[opiߚ l{g^DN+4h&=MM <ɢ#͖%'Ѥ, KŶw9ھ{~Ekn6¸Vϝ]p .}MF2kC%QSEQAu!!4%V7>9^} Gxq̰4^xFW: -0 sO*Ba"O& dՇʼBN^ɂe,{jvϰHh7Xe{:=?6>!AW^倍Y&fyW%g;m7^tU]Y1r*%ղGoGqŷl1߁=\d4a,x%X9 =iS@[\):rw2Ne8moP)j}g; <: Zs 0'K5MiA[¿ FN54q $_kQCK9#]}2A(a$.5UQv8&fZGmgnI e:'jŷ@r$*^Lgu#} "~[Q, g} ЀCÉ.,Vm:'hrFt<;jM94w(˧}p{WTrS{{tt6jvP*5Cy*7_|G̪y 4's0W'/-K^}|esѰnh}3.~Acw >4s-[KI"Z`En{Zr/?toQ0D.:hўJl}^QMÙ0톍PV-G<59*jShLgU{ō1N֧D,Q@pz mFSV3ZR[8aZxTUjAlrEUcDg4rÑ0o@4,T7Nȴw>UvV>.ӔV!X2ynhy$7<aFmV.n|h,G]2a[WHWB|B~}fHTߛbࢶ0A-{?PN@J}5ϣ'I^q%bUT\MK.5>Oė 5܆͛ejF\ oegĶˌ$_Z>'1KiS^;qnjS 7m2k; Adh81>&8Zٜ"͛4S+-mڂ=Vnht72>Khj g8KܾF |LLI]oQ `A,_ )W}j#V 5vi9u5r|ĞA}"UYRaTdޏd̽qie4jyCĪqY ĶG.pINfW3@J̸Έ(?ᔽ;K^pK>?n$~9F5=89rXwl}>ڒ 0ӏ&]/F[Tufwxy$H&Dػ? ܜɂyncG<OCm[[}`+d;aE@p. Yl^96>t7,yO6{4pp~ )wʷ8Yg?ZiϪ KYKyFcMM{QI+I:>41~/{)|e oEi)$Qiݚw!~Ra&Ubeq Uk=uhV%;0' B}tĒqX^3zi ):c+b{h4!ɣ-0=nYJto4闵Pr*'1-…DڂQh3?Q8xK޲ o}ډ%%ۿA3')Dφ<)FE:vѢ#oϭFC#%8bG(8n䇽: ::칣 c{G*TދKK91?<e έi?y߿WsfU˃MYSaxT8tpKQJ [_ƏOIoTBP񻼵+0%_{^Xgw4=%\0p'D>|N4mt̟W[#cr*&{–+O@OGP6wǭϠygP} ިLs<Vw vCc ((ҝtEpfpe*<uM8ئ5} n\]kYx*R'+|ByB$eO4;&zVA6(V$X`K:I_ہ>Hv_lg]"3jO߲Fʕhb0r` ߶V͛1dτ}&RWPݩa`2}öw'^5\b%to$>&Cǣ燖;蟿#zE9Yp5:=eݽw;52-DIJՀU.j}])L!(ofW_|Z4wgR)X ?w6Y۟P[G8QQwxZuA[>]Yu?`G9XĄX}Z]UZL 9-&Z\:&yH }5Q.e)jSu8"-n?"Jņ&w[=َ&ږj!RΑl/>~X}7P0$]Kg/Z{zmǂ_R' 1:5f4.6y6( l^;lPLpPq<pt~p4cϯi9p[bYC9æp>4\EԟWh {wuЍhg>4J)쎖.^r  jA#5&qyԲp_)vԵ_==k/8*JˆeDa׏COyQy1Ǵcn_grp]vذkIl^0=ͼD%ZnG"wKks&%P4.rUˣJ#ipy^<\Zc? '>%?~iT'${ ˎdoQa;z0eH  uĢ {yBhQ$Y'\MW5)bOC͂_=)V:X¶'^'\h$pB/h*QDjnօ0Z 4DG1ZY]F̂w0;n4|3i81pvGYZ˗ǶeaȋL r=8/rj5*` ?'Zb~'c5jE|H%{}аwX5>vi%lշ$8_W+)@ȬWCpyhjF ^)pݰᘕؼ2=Nإrx6*p+m7 eoCQE]'Q m9iG-Z9˃YA{;@֡(5\_,<uݦ kֳ.CW_f8@ +9)N׃W`-OTbJb ]G7˃K?Y#^Zvٯw`xuDŽϸr'~޻ \o Ú|ކ|b K w-[JUFk춋VOPWfE өk {ko$>4P:UW0]$3x: SrCTa m!6/B/09jJӺys*ksؼ_7~;$$6wOˇR4 (̂Ȅ=$٨+T(fmMn1teP Ň)-+1)Qͦ>T]WIK o`yֻ`8x&~|]wҬMۨ'?b6SZ z|G/8Q2l#EUowꃅ4U*О#;K.ͱ zP=o=(>8.Yt7l}V7YFrVP]Bz?1`PTt. \D Mܸ;I>#pC8:1V4 [ۋp㏧W[,2&?ɀuj sͩF][c 72+9jPg0˧Bl'r{$lq^5-]74n-ڼ<ߩr}7ܛ_GFc<~GWPvq9pV؋8~?>X-kkTsk:v<8l,W36I'*.a6&6?x~ *Ic;X˺u)R0#X$^=_s"QkGhqBXOu ՇS}>†_µ-QKexЀ6h4(ZxU/ kDŽbVܱǧgL`10VHSAʴ [h(Ia^u >ؗ.ev}2$\/\قoԞLXDA#wf~@X#痌k/,޹t&\m.2$xy&H%ov@q,}PgvK6ےY(X [,>}qdr[D Z]xycG^F57Vj9;U,;" F\8^\j72RzGvub$M;^I[ߟ;Wq< Gdy/ڋf7L1NYfv,l''?:ұWte(NqLuɧp~6~Jv-&_EþHca&h$,@;hd0K~I^*;4l6%ׯAOuٿϟ3Xm>8*JnaC Sfu^QAz 'Ha rJ8qq(}.!Xw>>MǾW +ι *zۢ}RE+^gYGGŏɡ&QW)\b137wWh͐'#eKu#{貿"8,tU)zϢDz7BKphޟzƎ{7D8? z٢$`% BEZuCЬkv)dw%*+peR;;<ˏFXCo,]h{ 'YS rC{s&Ƙdk{})]_ؑ elUb >\{TڌE_E:$Мu3a|2p,'~kz/z/BM߾2_›{`.m n4,CdEjsKH K"羞E9)XI0 k:/BlF)>/,Qgz&QL Zﶢ߀zo%nb|Э ?bY>Kf Â尠 |ڨu]|!4;3κSU;{'ƿ?6'Q~yTvFe}jZGԟm2l~sb__/up{zE-OIBa MJ3TW\pe|[{^Ǵ.OdPbr.꣸O#^Ԯ& ]&c G"WG~^V%t"tn*]Eӗ ̄ =zj7aߑϱ׎MM8fE&S!\Z&%椤bF2Q3[QI [|_rgb/CaHq|il]532KYP&r46Oׇ '*ؼ7eU=heǿ-PVҐLfmXbmA,rh H9bw낔0Ni8R Eu{9NEjvDIsmgĦ }} NR^ւFx`½aN-_`a"q2^el ZmXXLbl?yhrtO~'S\INF'+%3{_^aodY4)} G~$"ёWkx \CAo-Me'Dj퉩Ƶɝg@J]7`aOEj-.-U"ƙo]H:Ѷ 5LQ9]@'rPT x ,;gE޵ݯaSW7*ȑ"̺P }~CŸDILl&S!?|tt<- [/n h\O8)N3+h%<{-}t#lAd,Q-u_Jcf)]Rf!/`noy#URɁdəjg``,8kb <62NH8f^pXi'TQWCMsSؓԤ Ǐ-76]-6o_F=|Cl{>HF{"Ќ ˥Ap;sG%.%Z>0S[#^xZg9 7=O*C=(9P\kW*b|[ѸZegk(jݺq}Y8Xeٞ:o߻~1.mpn{Nԑc u{K)q\(]LCN/[ ‰kʛ/PĖ'V7f5XG-O7`Nehrt=ws؝ cϛ5)ptt X}wFL3uۄ̦n攢&soA\('RwUa!?;G}*R[*++[GƂbϻi^EYql7^n]㒂XZ-çť #P{ufbiཋhy18 X DNsط` ِJ9ec9 |r#ȇ MPWWL4-\}h49G2L!i] }PzXaw&v@8&[zB(_&؞:N  tϞpnZs9z(/YR]nv5+97T8`mBCE3 [| [ RjtÈZI? XDFE GuNH vta[wJy+\(u.%c,dTh! swC{҇'eV˚gazPM*P550?zh%nŢCE%B&W 8-%l1{*S;4r2F]lJ/shX%ؼE"I>u^K~Yp`˲3I3 cԒG/UݙixVXȷiޯWj˛7 'oMu߹cMUPLhؠwV~pל/lr;6yށK? qQ:˼a#e̸>8KƸiV5]vs+mq|dc?S: +)t2=;6a;{7o*h&l[wIX*{ᲙP1coW8v1֠5UPy$P9N9fA 9\zp =:fe+yҤ}m=|,s=Ŕr-V[L]l_"U|ÒKll+r` 5t#zL#izhOM0p^櫷ȗ A'WզQD8~<[a m('Ԇ"kvF`:j~d®{WIw`sDj!|`^q!ïI!nVgz-m.zv ;G@gN˙f M*xyvt`; |.z]YG)~ʫlw\͛) Mب.3v }k_|A ;/P*mKPl;ohjYUf|[ߧD:;ubޱlFvTx>ⴣzhdH>4c9[?1`Knb|NxqV$y5}*"%$UYX~_/ }U[[\{ йpӣh,փbe4%] Ўm!5R}HX4˵7mQe|v}vgBc"* Iؼy{Qe4(\dvs^kaõDs39[1h}!kY䴍.d g${s~ICBr)I-P=" 7Ońr+7QaASD]ᡊ9,dSb`g>^[|ﰤK]l8ȱzyNnnQIgWH:1>2*ęD3#y} N*:bjmaKz4;X|W_ @ ʯCIa9{,ey9_ácM7w`أFIF|%wX, >NvunV W~߁3Ǯzzb:muqQI9f Gۜ.RSy&1NO7 dwI,po%3+{x \+ex]˂EQؼ{jp˱Lۊx>*Ggy;M#C?|3M{|tؼ1v&9pV8Y(vnvqxN7^ؙ}AjnW!l^ p8fpR< cL缮;ҳWKgK)=7l}i5l&ᨅpG4m='#fJʩւH ݿ?N? ns ˍ65{f(eYQFmd5 Zy~ˇyi<ʷm6SLHJBP4KBT4JI*EB$CqOml6Os;޵q>]뼎<'?zp =xۋVo:Amt6ڳ~>7823; isrݩG7nC3n y )IRtt'.tTR} :z黐y߼krrί78赭]1 Z\y;oRa"05VH#O)rUFqA ĝlp%#CLQE摛BT׋􉕹^S lavQ+TōG8%+X}Bϒ" y5tE7dGg&}֯o@ϸ4=;"h@]ZsyU} NoB__(?g%2՗\B6L-gNUk=BؖQПr2CZedl}Bo"h\Tۣ]g8t>͛ 1ն{@ad*nmҽJw.Zc[̭G].Vhܶ@4f*p~ϋcb/a赅 )tpʒxK.Oȼ0'ͤ>w?)bz8qFy I%6^}#qv~_~EAd%W˹ni6Y #*~1 yTmaDLr$0|u#1ҷB6?}sI|'̀rC{q]1VwFy L@wW2k6ᗡ(?j!Ju.jE rxK)u^!L6zf2F7*5'n`~x% 'E[wp׀VH:D-qsfrd< zjkyg>Ogdpk8C ]@Uiv =zEHH۶,G6v Bj 󘣚-@| gPS2JV˝ =So}Hl2q"F o_xo%=9T:xx52CVl8eˀ6i~۹GkI"xm8 'iϱ݁0ߎw+MInAxrnMHa;zg9 Q=Jk4:Α݂׽FQ~h8GM[z'cX*>p_x:]7B  8HxHcWÁP:$tG_)l}@T\nxS%s5`tcZ|du%n*t 6ksxk籺̛isKFR},\" ۿ@; } aB ˮɽ pl-0vx ʺ00ūڄ-n`ĩ?hlX zE6)aǤ(z; k{'z@ߗ(,r aH[e}3>G ,+os``*.ѵȼGqW Cpܚ ɂ2U{˯qȼAS85K/] m+f~@YȼN]F5@ ;Po-ƁwpG כ=u]xt5By03AKϻu LJe(#*m ~x?m)A捂Ju_V] &yy@f"tv]~'@ pn `tWɿ߆?Ozx9#Ut;?;dtlWch+ɻa;-Zd녙y5>IW@'l#m|؁"]߅^Cs90,We|I h$ý_Sݷ{=rO#Lw٦aAD? b_UWJU@g~< Ah.`99ӈ"'(`xO(V4 )S +VЁK8KaLUVx:Gt=z> [E$ct~|Ϸ=LIc?p-l=rG};}ʧC;jED-?r03c{0[O!CM8׶>c'U:VD=rZ ׻w2 phHewزN냡Oʸ%}׫@ Zs:t懱?Sb06Y?x"&h3Wv 3ЦGd%{AI8Oב&ߛ'5_;Aibۚ֗@V/WZJ2\9 %ի |Kn3Ʃ3lUs?fDŢ5 h*2WnB`/DZ,od䒶]bs2-M3 Rwϝԍ- ?1g ?ϧ0ʱOyn4k3Cιqm ~[]d{̩:6kO]@ũ7~ y~9nFS $-N Kve@!xؖUyyiKKZKy}ml ߶[vM#xՀ#>pԁG8>j|=rUC0v/xڌͧ]barǶs ċ}/}|UQ(p902oX %Y V;Nf4/&_{lVsBj'n9cK~}G 2tJ=(aycEdc#rMDE % B]o*9=fg#3aT |Kz­]{FN? LϞ8..`/6Ğ&kh:~Q35uGa2_CC 8 z6Pey] i[- hv _D0;z|u*UAq(onϑ9?E]?z$]^/Jec$0>I2S@ OxI#Q; x&|R N/=^.Qu?d^>*m)<0^:U߲SƑ&gx 천*  ~4t dNkd\:c}WoVHGz]+l#[ha$Ur5!qD]辤 4&.|^~]t=h)ݣ@d_:KD浕X)ICge  2P<Ş i {Ef/&u *&=Py8Ρ@NmEJ> mf5#۲ք]佶7+Eᛧo ]Ãwu &̜ѹTv5\1U z 6'L];g.` Ǔ;YR~KvQew`uW; FN( !ŀ7ZZUz lW~0٩0v@*Ua@JuÂY$`~l60:ғ01.kZKALR︷%%2ʱSc+:1…̛+w-~/CC }< 6nEw!9v:N`G8ϑxiE0A$o l7H۔8[}Wd^.v+0׆ǎBK`X=t`VE%=wW߳H:CfވE_$q+JŪnhW-z^`ROkLҵMy-8gA[NO%my'-ϝڦM,,ňIˆY8S7@!VHS+g4 G)r 꽭g][*4Od^Kokg?hzǕ"vT zN0>ûi4? ھʡ=Zd V~ =Z]N[}32l.U@אB 'ՙ~D%s$2PFYDza>(z$95ж焩Ԭ9%0y)Ạ̌4Ɯ 7OACknYQ7{9`a^ < |_9UUDpކx5؝G7e+5ڪo&Vv@P0حD͔ jO^}o = sCi 4`o hMaŭ[/nOH _;ImסGR9'RTb nJwA'S<'_ \>JN+ŮuWG?ys_j\_1пܚvݿ"xg?t%X-V.]E!z0C2_ ׀P{U8?x.8ՒKb^`8tP^ :Ol 0FbieN<–ƅFA X!͒^s72!YY3 <‚[kpⷵSzHqQϙRSz\jZpՍ/?!zmfKc#w}tpl!ԮatM=y>bʧ_xO==}3fxnHOa0y)̣SZ"1p}?II0&Xv;t]fU?{I o % (?hYc7,DN*r2.CxFߪ3&wȿ~Em=SLgŻTH. #_*>Qluy;-隧c ?? oڈ^ _m<]m`k}ϸ)F~Һ:/$sNeeeE{weR8Qu l7/Hz<\=Ҋ-&Ӯg_ܡ?-V0l;%Oj*[FyDwׂZ%'_}= ;h`Tc9j -įos麎 u]c+{|X~.*+⧏E=V2.7E -o],c[$Jw0>dGkh8:O+ S7=Lءd'|b@lm@j4lw:ʸiey t=$'۬=m]G Ηov 0Qg(ȼC>1X|l>] $k١s&BI{]j7v.fnf\痻#rX>7kw$;V_n)syVLo*=+P-bK(@sVFovwx+k4w{}ṱ;ڛJO2_6[| Z^w& 'GQy8NSj@q|~mH7կ_@ -Jk|ԎO7"@\?v͏ 'J*6kh;cǧecA^wWŸ骐T"}cQ-}93m"1N7Na4R L ]{l\q'^Z+5ڻ_vnS6 p~Lz9OmH9c ) `[t!зOvE1*VL¨W 2nF (mf=rrS0VIaXYX`P}c2g<-#']}720z>q5%@#0e\ 9:|zdcɹWO 8{[҃1oԀYLpCD%9;o,%wn-d=ñqIN FNirQ7#GTx+a kF'Ӟ|Z^䍽Ǜy͛.gY V:s O0pop :o<2X5~O~ΰ;}-sW^Rafqbv~W6۴dt`[ cY;#?:v ll/ m;.Z'z&JD_T6 /S?<-^wZVEl~+lLF}r| S;~ w84@Ǭ]@j[_"Y?j@oZlX9XȼNd)]$z߯nQT !V갢52o>7} P+x =ßi[:5[ j@Wh_Y tԻ3E,.2o2Re umx]?'Z)d'΁9A?[h}~l)c< ^]*Wq69SQ`ܚP,΂5|2_qc8!ѭ'm3[PQTbkB'?ݤU :h+W=2Q:8̊L:xhL2[}{[xep_(ҟG.M4z!Q6mLoxmi^ߴ_E熑8@Q/&}OU) QKY#KIbÉ|ki\f|Oc<kϯK؊>h&Q%<G3x2bqcU$_t~j\U Xkfĩ%}…|/I*m4W(Gcyݶ%{IeAI11UtF뭎T"Sf'@k]f@jG1@NwYW###)FyQ]\KdP|\5=C<;f Rr#܁b7Skvlz#;e jHR;L5M!.]y|+֧A5vL_oPdl;PEt$p-",%n56ȼC9'yk H1v뒐y=n- cMNlq;.xn.`dT&as&2orp|-rWȤ^ n^?xR5̂Xorߞ} Q ӛHh5G)AK[c ܼ(z>\ّ:Xx0C8O+\NF7@ YG@-=(GGugi]=]ȼmUCʎm@HVw^}AyM'aƹ&Nz"Ф@4[?\mO< 폆m?ϦZ=I/P~ D=E>xTHD fD][Oo.!3Wt[2gfF [l:k{}mKz ]WXg|&*b02 &[ DWe8sI/ʘ} B[ t)dء;<$ՙY ]#hUID~|,cA~19MlӡR[ש-] dI}sB\0EA_i y_\L fkA0: :u/ouħ݃_-U"0/@ug/ ynڪXV@;RY {G׿"U 36Lwi`ʜ97:"U÷[vƨ3V-IvN_}8W·Y;Qy8 39`O`x4O0W% e Λnq)s~ń3[uwyw]zDxgfPGg@jjO鉼nבahP>䄟a}Ŧ2d^d;oAh j'-=7Dlȳ8[.CInH0ž#vnOƷ*fPDZӮ>G@`Ӏf},ʼ}@ݭtGSڼz>[l~Fқ~ނ YN3q.VPvp]Gyj@V9|*Ojw[œk6"ޚ/.07AC11F <:@hv9B:뀑[(*3g_y:i ;`\lY,-~t^]諭Iyzoq<f]M#V>[,W{o" ٟ:LJQ#qj_~ÈN{+a@p=?7M}сr{w[( 6\@_)Z׸%6ڈC yu0W<h { vUi/tOxAxO\ca»x}>7+dVM=Cg`~"B.Ik<O:,'ǒm @EI pn BݷW^0MС{'zӥ3 @+lS0yz7zLNQ ~ptj0ۥH{B0sS9~`m 4-jCځ~bexy͏T#o^O1!xD<yՆHLJC댓V2qG};j#4/o|7=N}:ɮzQ5`{NUO10{8&m'nV15kN,J ^eH=[wgaO1cC8~S7(i  E d#W`b%z7"$/\0 >md=Ejw-т[B|2Mٶ.P[#yEC3aCRÐ~׾\v-sڒ>QyȧrsԄ.tޒẹhDnVD7 *:~Uwパy:>Gr;- _8ZY?x.C[Tہ\eO= +i=0D|~vjfN`ݭxw]e0h['2'Rڥ U@{zLh\`~ñŸU99]W.xS=m>f{xgCFb8H?`$fVEm>%cbirg7\H B!hN縀̛y# @x[%;fSX NJ/xs (N~fÜS-tkAu V.nP 6ŭЯv_=`F~hct]F?80%] S٢@R ]ImKZm;BEO /vhnL GNM(LPdEQ qؗZ>.z0sЈ|F'\T4;ۑPz̼{}Uv=Eqݗ%}kToɪ:*^*z~Qޙt̒zdRh3^_eSo' IPdڲ_èͰT >_܄^k@ܶTA" =r~,rj5q\y qѻg_J!O?^?Pq_@wRmE_;M0y=Z5,B/9#*^9^@(KSK ȼ5OVCBgGޓ%c:F 0n>'?Kf4 &[#Rۨ .:0EHA #6ۏ[=GV^S8j{[qd],g~) يM\BcNJK-C{i֯+y_ޝgWh[p+ŁJؾ:?tb ́tDം2}codǢ?Ld{}4`cDP]T74SlLž>Ϳ]r}=:22'# Cd@Jݴ3l=^;x3٧ g' T[V4z]0f[cj* ݌8W!0]&;׃0utP_H d2#Sh WGOh\}S-!u̳6)0&14z_,W*7P_ / Tx%4$zgy,ٻ!Y0Rg_;Ӣ~u Ǯ,vs]t;k2[!o~=<])85OL{+p|b?h9/ 8x < y~Wkḱd?`GWvLSM^O#7kd2LpD3p=vi}XY\6YίT2Nh!T.GoW}r42껴͔v=>T(oy6;yGp[DJ!E=M}MoPOޫ> 4_7&o_77V$·Bq;C'{5Џ xC@6<\;y~OC"h?VfQہ==ʔt^|nKf'/ᬔu0b \'nz,wNB4cNAbuP'/NsUDKwƏ*V[oZ?4݅KM|/2]"q&w <f,B; JظtZKo^KqlfŠp2M{uO8%j?4#Kysȍ?%,aVF7@t%N~ &n>O`xKk.iˆiH >e[/EWIڣaXHy%-1V&ڻb<.V6Xw XʂⰁӦ'jXo /nС;F$OIGamVCxlP87XQ?~&=Fj>baz߱\װmMGc.|8+lon[ҽd׽ 7*0⅞5ZXJjshh=0$m1?` Y5~Q<6"'Ku~ .pn)p Y6nb}_ғYȕ|wlXlzQ`+xfZ&iFUQmW)"=0ofql0ҎW=[!XQD緉XW)PRK0rӶPxS61%׋߂1VւqO;w&okC}5 ՅNͼՇ-IX-o}$rRƬ+Ӹ-ƄI4dž{FacZXNi \0/_ ldžXjO aϢBa CE<к64E(̱wVc/ϰm+ƣꝸx(鵙|w.+Z$T.~Kײ~kbݥyt.Zؘ mcO!/L}ZBA( 3|+9;%Jyx¹1sw"hZ޷)z,_ *ˌ=ldwk%c Hư(WOq{!{p1 6nMӽ}kU 7[i-gBJlˆz籓XaK6%lNߗ7~PYg\k"Urՠ#O9?hMMi\hMlt~ & ߳Xѱe{Ln ,~S^<99ީubth3j5u&zU`gɎso+TqWhBgC#e01MJ%l2 Qf\ 6)AP+n[тU_ߖww-J/X)0 fjaUa[lxw`*$e91h;{i56hw%<%(.)\e!_\L׍YdRzwheQ`T%%Q0չF_'oぜ`T_9e~9jhkȆW(Z;25cac~?1_Ԏ< |)0!R#}dW*gK&Aش_%]^s9bAghLK$Ֆ/"۰2#)VmNK3נzG+6-]`3e1a>frN%t VCL}Ɵ}N][x 6?F"~n'6݇ g"?C&RO'WYf{/%f8Ltjv󆺍⹺PYD61W1f?׶0uK\ jN/lظ+7`;|!w Flt'l c+ֳoV6-s1{S357QzxE~]05!]64̓`ɠbnZhYM`kR{5bݰYѶ T&`:}r w@ظx+ >Z>j5IO=_Ccң]X5Xgl"Lm<|&ju нx{6]#ñS@:FJh4"A6|? үcczE4쒠fGwe_K >|\o7q~sx6.O+a2{1/hXЛg"70q`9>h;0ubٚ?ذe a,OA=QV_d}ͮQU=>$.TͅuOqloҞLkS 9pl|Q}7<<ĘѯbijNU2ЅcOc'"Je;c>ݝƹu: 0_i6#]ީ#o-LjiV 5o1'h).+&T?)GoG(7;!mmf/Bs*롧ul{>:yc~g*b##<0zE+{FvvK&F.ǺL2] U- s(O`#7adV#to]q ´ U:0lŠݭ vtVZzyHEtt[g5Fk!uȊƶ<乯cq)loNs\ ̸,>GX3ÌjL4Zz΄%^ Cڰ\ i$j٣)0GkbQ+fwl`42qݚ[mtSR //+PeKyR)аagmnbv6w`t\t%TY?ٮҫ^Fb3njM~,O̶~9Xe l,Ϭ~Vh王4'T3VKÄQK]:۔jKWݱ1ŋXKxLӡw;sfs#[ơ>u0{MW2`Sw/>NQPuϱ^ )ޱ߆qZfI(7(EZFc]&btFˣJ98sv.T%,xc{8dO 8 zN:' hOqޘ}Srbvc;~$Jc\Bt@[p6Dq^1DK\ N(29𞲋;w忸q۞ =  w yCFܿ>˩]7ᎈzG939<3s grwz}; iy7,\rY.e,\rY.so|ϯqO>>I|VUr%P9A _l\㰜㰜㰜㰜㰜㰜㰜㰜㰜㰜㰜㰜㰜㰜v0a/e,\rY.e,\\2Wߎ9>%ƿ$ܜ*"_qX_G[u .,}~%?OX99;!7w ;{o /'d?usrtO?vC~SNks_ q[ 9_~MG:t/;*v9f7[.(ܯ7U'N|_$+.K/<}4g䉳Wz;ع:usۉ1?g_+.2 pqٲeV-Z[9lݢerj9>8xngё&)susieR/tests/testthat/test_update_each_effect.R0000644000176200001440000000100113463056206021463 0ustar liggesuserscontext("test_update_each_effect.R") test_that("update_each_effect agrees with version 0.3", with(simulate(sparse=T), { original.res = readRDS('vbupdate_original_res.rds') original.res$Xr = as.vector(original.res$Xr) scaledX = set_X_attributes(X) scaledX.sparse = set_X_attributes(X.sparse) dense.res = update_each_effect(scaledX,y,s) sparse.res = update_each_effect(scaledX.sparse,y,s) expect_equal_susie_update(sparse.res, original.res) expect_equal_susie_update(dense.res, original.res) })) susieR/tests/testthat/helper_testthat.R0000644000176200001440000002040514141046730020051 0ustar liggesusers# @title sets three attributes for matrix X # @param X an n by p data matrix that can be either a trend filtering # matrix or a regular dense/sparse matrix # @param center boolean indicating centered by column means or not # @param scale boolean indicating scaled by column standard deviations or not # @return X with three attributes e.g. `attr(X, 'scaled:center') is a # p vector of column means of X if center=TRUE, a p vector of zeros # otherwise. 'attr(X, 'scaled:scale') is a p vector of columan standard # deviations of X if scale=TRUE, a p vector of 1s otherwise. 'attr(X, # 'd') is a p vector of column sums of X.standardized^2,' where # X.standardized is the matrix X centered by attr(X, 'scaled:center') # and scaled by attr(X, 'scaled:scale'). # #' @importFrom Matrix rowSums #' @importFrom Matrix colMeans set_X_attributes = function(X, center = TRUE, scale = TRUE) { # if X is a trend filtering matrix if (!is.null(attr(X,"matrix.type"))) { order = attr(X,"order") n = ncol(X) # Set three attributes for X. attr(X,"scaled:center") = compute_tf_cm(order,n) attr(X,"scaled:scale") = compute_tf_csd(order,n) attr(X,"d") = compute_tf_d(order,n,attr(X,"scaled:center"), attr(X,"scaled:scale"),scale,center) if (!center) attr(X,"scaled:center") = rep(0,n) if (!scale) attr(X,"scaled:scale") = rep(1,n) } else { # If X is either a dense or sparse ordinary matrix. # Get column means. cm = colMeans(X,na.rm = TRUE) # Get column standard deviations. csd = compute_colSds(X) # Set sd = 1 when the column has variance 0. csd[csd == 0] = 1 if (!center) cm = rep(0,length = length(cm)) if (!scale) csd = rep(1,length = length(cm)) X.std = (t(X) - cm)/csd # Set three attributes for X. attr(X,"d") = rowSums(X.std * X.std) attr(X,"scaled:center") = cm attr(X,"scaled:scale") = csd } return(X) } create_sparsity_mat = function(sparsity, n, p){ nonzero = round(n*p*(1-sparsity)) nonzero.idx = sample(n*p, nonzero) mat = numeric(n*p) mat[nonzero.idx] = 1 mat = matrix(mat, nrow=n, ncol=p) return(mat) } simulate = function(n=100, p=200, sparse=F) { suppressWarnings(RNGversion("3.5.0")) set.seed(1) beta = rep(0,p) beta[1:4] = 10 if (sparse) { X = create_sparsity_mat(0.99,n,p) X.sparse = as(X,'dgCMatrix') } else { X = matrix(rnorm(n*p,3,4),n,p) X.sparse = NA } y = c(X %*% beta + rnorm(n)) L = 10 residual_variance = 0.8 scaled_prior_variance = 0.2 s = list(alpha=matrix(1/p,nrow=L,ncol=p), mu=matrix(2,nrow=L,ncol=p), mu2=matrix(3,nrow=L,ncol=p), Xr=rep(5,n), KL=rep(1.2,L), sigma2=residual_variance, V=scaled_prior_variance * as.numeric(var(y)), lbf_variable = matrix(0,L,p)) return(list(X=X, X.sparse=X.sparse, s=s, y=y, n=n, p=p, b=beta)) } simulate_tf = function(order){ suppressWarnings(RNGversion("3.5.0")) set.seed(2) n = 50 D = diag(-1, n) for (i in 1:(n-1)){ D[i, i+1] = 1 } if (order==0) { beta = c(rep(0,5),rep(1,5),rep(3,5),rep(-2,5),rep(0,30)) y = beta + rnorm(n) X = solve(D) } else if (order==1) { beta = numeric(n) for (i in 1:n){ if (i <= 5){ beta[i] = 0.001*i + 2 } else if (i <= 15){ beta[i] = 5*0.001*i + 1.6 } else{ beta[i] = 6.1 - 10*0.001*i } } y = beta + rnorm(n) X = solve(D%*%D) } else if (order==2) { beta = numeric(n) for (i in 1:n){ if (i <= 5){ beta[i] = (0.001*i)^2 } else if (i <= 35){ beta[i] = -5*(0.001*i)^2 + 0.06 } else{ beta[i] = 3*(0.001*i)^2 - 3.86 } } y = beta + rnorm(n) X = solve(D%*%D%*%D) } return(list(X=X, y=y)) } expect_equal_susie_update = function(new.res, original.res, tolerance = .Machine$double.eps^0.5){ expect_equal(new.res$alpha, original.res$alpha, scale = 1, tolerance = tolerance) expect_equal(new.res$mu, original.res$mu, scale = 1, tolerance = tolerance) expect_equal(new.res$mu2, original.res$mu2, scale = 1, tolerance = tolerance) expect_equal(new.res$Xr, original.res$Xr, scale = 1, tolerance = tolerance) expect_equal(new.res$KL, original.res$KL, scale = 1, tolerance = tolerance) expect_equal(new.res$sigma2, original.res$sigma2, scale = 1, tolerance = tolerance) expect_equal(new.res$V, original.res$V, scale = 1, tolerance = tolerance) } expect_equal_susie_suff_stat_update = function(new.res, original.res, tolerance = .Machine$double.eps^0.5){ expect_equal(new.res$alpha, original.res$alpha, scale = 1, tolerance = tolerance) expect_equal(new.res$mu, original.res$mu, scale = 1, tolerance = tolerance) expect_equal(new.res$mu2, original.res$mu2, scale = 1, tolerance = tolerance) expect_equal(new.res$XtXr, original.res$XtXr, scale = 1, tolerance = tolerance) expect_equal(new.res$KL, original.res$KL, scale = 1, tolerance = tolerance) expect_equal(new.res$sigma2, original.res$sigma2, scale = 1, tolerance = tolerance) expect_equal(new.res$V, original.res$V, scale = 1, tolerance = tolerance) } expect_equal_susie_rss_update = function(new.res, original.res, tolerance = .Machine$double.eps^0.5){ expect_equal(new.res$alpha, original.res$alpha, scale = 1, tolerance = tolerance) expect_equal(new.res$mu, original.res$mu, scale = 1, tolerance = tolerance) expect_equal(new.res$mu2, original.res$mu2, scale = 1, tolerance = tolerance) expect_equal(new.res$Rz, original.res$Rz, scale = 1, tolerance = tolerance) expect_equal(new.res$KL, original.res$KL, scale = 1, tolerance = tolerance) expect_equal(new.res$sigma2, original.res$sigma2, scale = 1, tolerance = tolerance) expect_equal(new.res$V, original.res$V, scale = 1, tolerance = tolerance) } expect_equal_SER = function(new.res, original.res){ expect_equal(new.res$alpha, original.res$alpha) expect_equal(new.res$mu, original.res$mu) expect_equal(new.res$mu2, original.res$mu2) expect_equal(new.res$lbf, original.res$lbf) expect_equal(new.res$V, original.res$V) expect_equal(new.res$loglik, original.res$loglik) } expect_equal_SER_suff_stat = function(new.res, original.res, tolerance = .Machine$double.eps^0.5){ expect_equal(new.res$alpha, original.res$alpha, scale = 1, tolerance = tolerance) expect_equal(new.res$mu, original.res$mu, scale = 1, tolerance = tolerance) expect_equal(new.res$mu2, original.res$mu2, scale = 1, tolerance = tolerance) expect_equal(new.res$lbf, original.res$lbf, scale = 1, tolerance = tolerance) expect_equal(new.res$V, original.res$V, scale = 1, tolerance = tolerance) expect_equal(new.res$lbf_model, original.res$lbf_model, scale = 1, tolerance = tolerance) } expect_equal_susie = function(new.res, original.res, tolerance = .Machine$double.eps^0.5){ expect_equal_susie_update(new.res, original.res, tolerance = tolerance) expect_equal(new.res$elbo, original.res$elbo, scale = 1, tolerance = tolerance) expect_equal(new.res$niter, original.res$niter, scale = 1, tolerance = tolerance) expect_equal(new.res$intercept, original.res$intercept, scale = 1, tolerance = tolerance) expect_equal(new.res$fitted, original.res$fitted, scale = 1, tolerance = tolerance) expect_equal(new.res$X_column_scale_factors, original.res$X_column_scale_factors, scale = 1, tolerance = tolerance) } expect_equal_susie_suff_stat = function(new.res, original.res, tolerance = .Machine$double.eps^0.5){ expect_equal_susie_suff_stat_update(new.res, original.res, tolerance = tolerance) expect_equal(new.res$elbo, original.res$elbo, scale = 1, tolerance = tolerance) expect_equal(new.res$niter, original.res$niter, scale = 1, tolerance = tolerance) expect_equal(new.res$intercept, original.res$intercept, scale = 1, tolerance = tolerance) expect_equal(new.res$Xtfitted, original.res$Xtfitted, scale = 1, tolerance = tolerance) } expect_equal_susie_rss = function(new.res, original.res, tolerance = .Machine$double.eps^0.5){ expect_equal_susie_rss_update(new.res, original.res, scale = 1, tolerance = tolerance) expect_equal(new.res$elbo, original.res$elbo, scale = 1, tolerance = tolerance) expect_equal(new.res$niter, original.res$niter, scale = 1, tolerance = tolerance) expect_equal(new.res$intercept, original.res$intercept, scale = 1, tolerance = tolerance) expect_equal(new.res$Rz, original.res$Rz, scale = 1, tolerance = tolerance) } susieR/tests/README.md0000644000176200001440000000005613437306365014160 0ustar liggesusersTo run unit tests, ```r devtools::test() ``` susieR/tests/testthat.R0000644000176200001440000000007013313211334014640 0ustar liggesuserslibrary(testthat) library(susieR) test_check("susieR") susieR/vignettes/0000755000176200001440000000000014143477740013547 5ustar liggesuserssusieR/vignettes/finemapping.Rmd0000644000176200001440000001355514112242336016504 0ustar liggesusers--- title: "Fine-mapping example" author: "Gao Wang" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Fine-mapping example} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ``` This vignette demonstrates `susieR` in the context of genetic fine-mapping. We use simulated data of expression level of a gene ($y$) in $N \approx 600$ individuals. We want to identify with the genotype matrix $X_{N\times P}$ ($P=1001$) the genetic variables that causes changes in expression level. The simulated data set is simulated to have exactly 3 non-zero effects. ```{r} library(susieR) set.seed(1) ``` ## The data-set ```{r} data(N3finemapping) attach(N3finemapping) ``` The loaded dataset contains regression data $X$ and $y$, along with some other relevant properties in the context of genetic studies. It also contains the "true" regression coefficent the data is simulated from. Notice that we've simulated 2 sets of $Y$ as 2 simulation replicates. Here we'll focus on the first data-set. ```{r} dim(Y) ``` Here are the 3 "true" signals in the first data-set: ```{r} b <- true_coef[,1] plot(b, pch=16, ylab='effect size') ``` ```{r} which(b != 0) ``` So the underlying causal variables are 403, 653 and 773. ## Simple regression summary statistics `univariate_regression` function can be used to compute summary statistics by fitting univariate simple regression variable by variable. The results are $\hat{\beta}$ and $SE(\hat{\beta})$ from which z-scores can be derived. Again we focus only on results from the first data-set: ```{r} sumstats <- univariate_regression(X, Y[,1]) z_scores <- sumstats$betahat / sumstats$sebetahat susie_plot(z_scores, y = "z", b=b) ``` ## Fine-mapping with `susieR` For starters, we assume there are at most 10 causal variables, i.e., set `L = 10`, although SuSiE is robust to the choice of `L`. The `susieR` function call is: ```{r} fitted <- susie(X, Y[,1], L = 10, verbose = TRUE) ``` ### Credible sets By default, we output 95% credible set: ```{r} print(fitted$sets) ``` The 3 causal signals have been captured by the 3 CS reported here. The 3rd CS contains many variables, including the true causal variable `403`. The minimum absolute correlation is 0.86. If we use the default 90% coverage for credible sets, we still capture the 3 signals, but "purity" of the 3rd CS is now 0.91 and size of the CS is also a bit smaller. ```{r} sets <- susie_get_cs(fitted, X = X, coverage = 0.9, min_abs_corr = 0.1) ``` ```{r} print(sets) ``` ### Posterior inclusion probabilities Previously we've determined that summing over 3 single effect regression models is approperate for our application. Here we summarize the variable selection results by posterior inclusion probability (PIP): ```{r} susie_plot(fitted, y="PIP", b=b) ``` The true causal variables are colored red. The 95% CS identified are circled in different colors. Of interest is the cluster around position 400. The true signal is 403 but apparently it does not have the highest PIP. To compare ranking of PIP and original z-score in that CS: ```{r} i <- fitted$sets$cs[[3]] z3 <- cbind(i,z_scores[i],fitted$pip[i]) colnames(z3) <- c('position', 'z-score', 'PIP') z3[order(z3[,2], decreasing = TRUE),] ``` ### Choice of priors Notice that by default SuSiE estimates prior effect size from data. For fine-mapping applications, however, we sometimes have knowledge of SuSiE prior effect size since it is parameterized as percentage of variance explained (PVE) by a non-zero effect, which, in the context of fine-mapping, is related to per-SNP heritability. It is possible to use `scaled_prior_variance` to specify this PVE and explicitly set `estimate_prior_variance=FALSE` to fix the prior effect to given value. In this data-set, SuSiE is robust to choice of priors. Here we set PVE to 0.2, and compare with previous results: ```{r} fitted = susie(X, Y[,1], L = 10, estimate_residual_variance = TRUE, estimate_prior_variance = FALSE, scaled_prior_variance = 0.2) susie_plot(fitted, y='PIP', b=b) ``` which largely remains unchanged. ### A note on covariate adjustment To include covariate `Z` in SuSiE, one approach is to regress it out from both `y` and `X`, and then run SuSiE on the residuals. The code below illustrates the procedure: ```{r, eval=FALSE} remove.covariate.effects <- function (X, Z, y) { # include the intercept term if (any(Z[,1]!=1)) Z = cbind(1, Z) A <- forceSymmetric(crossprod(Z)) SZy <- as.vector(solve(A,c(y %*% Z))) SZX <- as.matrix(solve(A,t(Z) %*% X)) y <- y - c(Z %*% SZy) X <- X - Z %*% SZX return(list(X = X,y = y,SZy = SZy,SZX = SZX)) } out = remove.covariate.effects(X, Z, Y[,1]) fitted_adjusted = susie(out$X, out$y, L = 10) , ``` Note that the covariates `Z` should have a column of ones as the first column. If not, the above function `remove.covariate.effects` will add such a column to `Z` before regressing it out. Data will be centered as a result. Also the scale of data is changed after regressing out `Z`. This introduces some subtleties in terms of interpreting the results. For this reason, we provide covariate adjustment procedure as a tip in the documentation and not part of `susieR::susie()` function. Cautions should be taken when applying this procedure and interpreting the result from it. ## Session information Here are some details about the computing environment, including the versions of R, and the R packages, used to generate these results. ```{r} sessionInfo() ``` [N3finemapping]: https://github.com/stephenslab/susieR/blob/master/inst/datafiles/N3finemapping.rds susieR/vignettes/trend_filtering.Rmd0000644000176200001440000001050414051733237017364 0ustar liggesusers--- title: "Trend filtering" author: "Matthew Stephens" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Trend filtering demo} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 4.5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ``` # Introduction Although we developed SuSiE primarily with the goal of performing variable selection in highly sparse settings -- and, in particular, for genetic fine-mapping -- the approach also has considerable potential for application to other large-scale regression problems. Here we briefly illustrate this potential by applying it to a non-parametric regression problem that at first sight seems to be ill-suited to our approach. In particular, it does not involve strict sparsity, and the underlying correlation structure of the explanatory variables is very different from the ``blocky" covariance structure of genetic data that SuSiE was designed for. Nonetheless, we will see that SuSiE performs well here despite this (partly due to its ability to capture non-sparse signals via Bayesian Model Averaging). Specifically, consider the non-parametric regression: $$y_t = \mu_t + e_t \quad t=1,\dots,T$$ where the goal is to estimate the underlying mean, $\mu_t$, under the assumption that it varies smoothly (or, more precisely, in a spatially-structured way) with $t$. One very simple way to capture spatial structure in $\mu$ is to model it as a (sparse) linear combination of step functions: $$\mu = Xb$$ where the $j$th column of $X$ is the step function with a step at $j$ ($j = 1,\dots,(T-1)$); that is $x_{tj}=0$ for $t<=j$ and 1 for $t>j$. The $j$th element of $b$ therefore determines the change in the mean $|\mu_j-\mu_{j+1}|$, and an assumption that $b$ is sparse encapsulates an assumption that $\mu$ is spatially structured (indeed, piecewise constant). This very simple approach is essentially 0th-order trend filtering (Tibshirani, 2014, *Annals of Statistics* 42, 285--323). Note that higher-order trend filtering can be similarly implemented using different basis functions; here we use 0th order only for simplicity. # Examples Here we apply SuSiE to perform 0th order trend filtering in some simple simulated examples. We have implemented in `susieR` 0.6.0 a funciton `susie_trendfilter` which internally creates $X$ matrix with step functions in the columns to match input $y$. The algebra have been optimized to work on such trendfiltering matrices. Here we simulate some data where $\mu$ is a step function with four steps, a 0th order trendfiltering problem. The regression is truly sparse and SuSiE should do well. ```{r} library(susieR) set.seed(1) n=1000 mu = c(rep(0,100),rep(1,100),rep(3,100),rep(-2,100),rep(0,600)) y = mu + rnorm(n) s = susie_trendfilter(y, 0, L=10) ``` Plot results: the truth is black, and susie estimate is red. ```{r} plot(y,pch=".") lines(mu,col=1,lwd=3) lines(predict(s),col=2,lwd=2) s$sigma2 ``` In the next example mu increases linearly. Thus we are approximating a linear function by step functions. Here the truth is not trully ``sparse", so we might expect performance to be poor, but it is not too bad. ```{r} set.seed(1) mu = seq(0,4,length=1000) y = mu + rnorm(n) s = susie_trendfilter(y,0,L=10) plot(y,pch=".") lines(mu,col=1,lwd=3) lines(predict(s),col=2,lwd=2) ``` Compare with the genlasso (lasso-based) solution (blue). (This will require installation of the `genlasso` package.) ```{r} library(genlasso) y.tf = trendfilter(y,ord=0) y.tf.cv = cv.trendfilter(y.tf) plot(y,pch=".") lines(mu,col=1,lwd=3) lines(predict(s),col=2,lwd=2) lines(y.tf$fit[,which(y.tf$lambda==y.tf.cv$lambda.min)],col=4,lwd=2) ``` What happens if we have linear trend plus a sudden change. ```{r} set.seed(1) mu = seq(0,4,length=1000) mu = mu + c(rep(0,500),rep(4,500)) y = mu + rnorm(n) s = susie_trendfilter(y,0,L=10) y.tf = trendfilter(y,ord=0) y.tf.cv = cv.trendfilter(y.tf) plot(y,pch=".") lines(mu,col=1,lwd=3) lines(predict(s),col=2,lwd=2) lines(y.tf$fit[,which(y.tf$lambda==y.tf.cv$lambda.min)],col=4,lwd=2) ``` The two fits seem similar in accuracy. We can check this numerically: ```{r} sqrt(mean((mu-y.tf$fit[,which(y.tf$lambda==y.tf.cv$lambda.min)])^2)) sqrt(mean((mu-predict(s))^2)) ``` susieR/vignettes/sparse_susie_eval.Rmd0000644000176200001440000000345113351217671017725 0ustar liggesusers--- title: "Evaluation of sparse version of SuSiE" author: "Kaiqian Zhang" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{SuSiE with sparse matrix operations} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 4.5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ``` ## Set up environment ```{r, warning=FALSE} library(Matrix) library(susieR) set.seed(1) ``` ## Overview In this vignette, we provide line profiles for revised version SuSiE, which allows for a sparse matrix structure. We compare speed performance when the form of the matrix `X` is dense and sparse. In this minimal example, we observe that given a large sparse matrix, if it is in the dense form, the speed is around `40%` slower than that in a sparse form. ## Simulate data We randomly simulate a `n=1000` by `p=1000` dense matrix and a sparse matrix at sparsity $99\%$, i.e. $99\%$ entries are zeros. ```{r} create_sparsity_mat = function(sparsity, n, p) { nonzero <- round(n*p*(1-sparsity)) nonzero.idx <- sample(n*p, nonzero) mat <- numeric(n*p) mat[nonzero.idx] <- 1 mat <- matrix(mat, nrow=n, ncol=p) return(mat) } ``` ```{r} n <- 1000 p <- 1000 beta <- rep(0,p) beta[c(1,300,400,1000)] <- 10 X.dense <- create_sparsity_mat(0.99,n,p) X.sparse <- as(X.dense,"dgCMatrix") y <- c(X.dense %*% beta + rnorm(n)) ``` ## `X` in a dense form ```{r} susie.dense <- susie(X.dense,y) ``` ## `X` in a sparse form ```{r} susie.sparse <- susie(X.sparse,y) ``` ## Further step We encourage people who are insterested in improving SuSiE can get insights from those line profiles provided. susieR/vignettes/trendfiltering_derivations.bib0000644000176200001440000000104213542461263021644 0ustar liggesusers@article{Kim07l1trend, author = {Seung-Jean Kim and Kwangmoo Koh and Stephen Boyd and Dimitry Gorinevsky}, title = {$\ell_1$ trend filtering}, journal = "SIAM Review", volume = 51, number = 2, pages = {339--360}, year = {2009}} @article{Tibshirani2014, author = {Ryan J. Tibshirani}, title = {Adaptive Piecewise Polynomial Estimation via Trend Filtering}, year = {2014}, journal = {Annals of Statistics}, volume = {42}, number = {1}, pages = {285--323}} susieR/vignettes/finemapping_summary_statistics.Rmd0000644000176200001440000001002014075324172022522 0ustar liggesusers--- title: "Fine-mapping with summary statistics" author: "Yuxin Zou and Gao Wang" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Fine-mapping with summary statistics} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ``` This vignette demonstrates how to use `susieR` with "summary statistics" in the context of genetic fine-mapping. We use the same simulated data as in [fine mapping vignette](finemapping.html). The simulated data is expression level of a gene ($y$) in $N \approx 600$ individuals. We want to identify with the genotype matrix $X_{N\times P}$ ($P=1001$) the genetic variables that causes changes in expression level. The data-set is shipped with `susieR`. It is simulated to have exactly 3 non-zero effects. ```{r} library(susieR) set.seed(1) ``` ## The data-set ```{r} data(N3finemapping) attach(N3finemapping) ``` Notice that we've simulated 2 sets of $Y$ as 2 simulation replicates. Here we'll focus on the first data-set. ```{r} dim(Y) ``` Here are the 3 "true" signals in the first data-set: ```{r} b <- true_coef[,1] plot(b, pch=16, ylab='effect size') ``` ```{r} which(b != 0) ``` So the underlying causal variables are 403, 653 and 773. ## Summary statistics from simple regression Summary statistics of genetic association studies typically contain effect size ($\hat{\beta}$ coefficient from regression), p-value and minor allele frequencies. These information can be used to perform fine-mapping with given an additional input of correlation matrix between variables. The correlation matrix in genetics is typically referred to as LD matrix (LD for linkage disequilibrium). One may use external reference panels to estimate it when this matrix cannot be obtained from samples directly. Caution that LD matrix here has to be correlation matrix $r$, not $r^2$ or $abs(r)$. `univariate_regression` function can be used to compute summary statistics by fitting univariate simple regression variable by variable. The results are $\hat{\beta}$ and $SE(\hat{\beta})$ from which z-scores can be derived. Alternatively you can obtain z-scores from $\hat{\beta}$ and p-values if you are provided with those information. Again we focus only on results from the first data-set: ```{r} sumstats <- univariate_regression(X, Y[,1]) z_scores <- sumstats$betahat / sumstats$sebetahat susie_plot(z_scores, y = "z", b=b) ``` For this example the correlation matrix can be computed directly from data provide, ```{r} R <- cor(X) ``` ## Fine-mapping with `susieR` using summary statistics For starters, we assume there are at most 10 causal variables, i.e. set `L = 10`, although SuSiE is generally robust to the choice of `L`. SuSiE regression with summary statistics is implemented as `susie_rss` function, ```{r} fitted_rss <- susie_rss(z_scores, R, L = 10) ``` Using `summary` function, we can examine the posterior inclusion probability (PIP) for each variable, and the 95% credible sets. Here, we are the 95% credible sets. ```{r} summary(fitted_rss)$cs ``` The 3 causal signals have been captured by the 3 CS reported here. The 3rd CS contains many variables, including the true causal variable 403. We can also plot the posterior inclusion probability (PIP), ```{r} susie_plot(fitted_rss, y="PIP", b=b) ``` The true causal variables are colored red. The 95% CS identified are circled in different colors. The result should be very similar to using the individual level data for this example, as the z-scores and correlation matrix (LD reference) come from the same genotype data-set. ```{r, fig.width=6,fig.height=6} fitted = susie(X, Y[,1], L = 10) plot(fitted$pip, fitted_rss$pip, ylim=c(0,1)) ``` ## Session information Here are some details about the computing environment, including the versions of R, and the R packages, used to generate these results. ```{r} sessionInfo() ``` susieR/vignettes/mwe.Rmd0000644000176200001440000000237614033741524015003 0ustar liggesusers--- title: "A minimal example" author: "Matthew Stephens" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{minimal example} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 4.5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ``` In this short vignette, we fit a sparse linear regression model with up to $L > 0$ non-zero effects. Generally, there is no harm in over-stating $L$ (that is, the method is pretty robust to overfitting), except that computation will grow as $L$ grows. Here is a minimal example: ```{r} library(susieR) set.seed(1) n <- 1000 p <- 1000 beta <- rep(0,p) beta[c(1,2,300,400)] <- 1 X <- matrix(rnorm(n*p),nrow=n,ncol=p) y <- X %*% beta + rnorm(n) res <- susie(X,y,L=10) plot(coef(res)[-1],pch = 20) ``` Plot the ground-truth outcomes vs. the predicted outcomes: ```{r fig.height=3.5, fig.width=3.5} plot(y,predict(res),pch = 20) ``` ## Session information Here are some details about the computing environment, including the versions of R, and the R packages, used to generate these results. ```{r} sessionInfo() ``` susieR/vignettes/trendfiltering_derivations.Rnw0000644000176200001440000002761114051613310021654 0ustar liggesusers\documentclass[11pt]{article} \usepackage{Sweave} \usepackage{fullpage} \usepackage{amsfonts} \usepackage{amsmath} \usepackage{bm} \usepackage{mathabx} \usepackage{xspace} \usepackage{natbib} \bibliographystyle{abbrvnat} \newcommand{\susie}{\textsl{SuSiE}\xspace} \def\vb{\bm b} \def\vy{\bm y} \def\vx{\bm x} \begin{document} \title{Implementation of SuSiE trend filtering} \author{Kaiqian Zhang} \maketitle %\VignetteIndexEntry{Implementation of SuSiE trend filtering} \section{Notation} We first describe the notation used in this text. We denote matrices by boldface uppercase letters ($\mathbf{A}$), vectors are denoted by boldface lowercase letters ($\mathbf{a}$), and scalars are denoted by non-boldface letters ($a$ or $A$). All vectors are column-vectors. Lowercase letters may represent elements of a vector or matrix if they have subscripts. For example, $a_{ij}$ is the $(i,j)$th element of $\mathbf{A}$, $a_i$ is the $i$th element of $\mathbf{a}$, and $\mathbf{a}_{i}$ is either the $i$th row or $i$th column of $\mathbf{A}$. For indexing, we will generally use capital non-boldface letters to denote the total number of elements and their lowercase non-boldface versions to denote the index. For example, $i = 1,\ldots,I$. We let $\mathbf{A}_{n \times p}$ denote that $\mathbf{A} \in \mathbb{R}^{n \times p}$. We denote the matrix transpose by $\mathbf{A}^T$, the matrix inverse by $\mathbf{A}^{-1}$, and the matrix determinant by $\det(\mathbf{A})$. Finally, sets will be denoted by calligraphic letters ($\mathcal{A}$). \section{Overview} Trend filtering is a useful statistical tool for nonparametric regression. \cite{Kim07l1trend} first proposed $\ell_1$ trend filtering for estimating underlying piecewise linear trends in time series data. This idea can be further extended to fit piecewise polynomial of degree $k$ to the data. In their paper, Kim et al. showed the equivalence between the $\ell_1$ trend filtering and the $\ell_1$-regularized least squares problem. This motivates us to think about the connection between trend filtering and sparse approximation in general. \section{Trend filtering and sparse regression} Trend filtering problem is defined mathematically as follows. For a given integer $k \geq 0$, the kth order trend filtering is defined by a penalized least squares optimization problem, \begin{align} \hat{\vb} = \underset{\vb}{\mathrm{argmin}} \frac{1}{2}|| \vy - \vb||_2^2 + \frac{n^k}{k!}\lambda||D_{k+1}\vb||_1, \end{align} where $\vy = [y_1 \dots y_n]^T$ is an n vector of observations, $\lambda$ is a tuning parameter, and $D_{k+1}$ is the discrete difference operator of order $k$. When order $k=0$, $D$ is defined \begin{align}\label{D1} D_{1} = \begin{bmatrix} -1 & 1 & 0 & \dots & 0 & 0\\ 0 & -1 & 1 & \dots & 0 & 0\\ \vdots & \ddots & \\ 0 & 0 & 0 & \dots & -1 & 1\\ \end{bmatrix} \in \mathbb{R}^{(n-1)\times n}. \end{align} In this case, the components of the trend filtering estimate form a piecewise constant structure, with break points corresponding to the nonzero entries of $D_{1}\hat{\vb} = (\hat{b}_2 - \hat{b}_1, \dots, \hat{b}_n - \hat{b}_{n-1})$ \citep{Tibshirani2014}. And when $k\geq 1$, the operator $D_{k+1}$ is defined recursively, \begin{align}\label{D1_2} D_{k+1} = D_{1} \cdot D_{k} \in \mathbb{R}^{(n-k-1)\times n}, \end{align} where the dot product is matrix multiplication. Notice that $D_1$ here in \ref{D1_2} is the $(n-k-1)\times (n-k)$ version of $D_1$ described in \ref{D1}. Now we want to transform the trend filtering problem into a sparse regression problem. Let $\bm{\beta}=D_{k+1}\vb$. Then if $D_{k+1}$ were invertibe, we could write $\vb = (D_{k+1})^{-1}\bm{\beta}$ and the above problem would become \begin{align} \hat{\bm{\beta}} = \underset{\bm{\beta}}{\mathrm{argmin}} \frac{1}{2}||\vy - (D_{k+1})^{-1}\bm{\beta}||_2^2 + \frac{n^k}{k!}\lambda||\bm{\beta}||_1. \end{align} We can consider this a sparse regression with $\ell_1$ regularization problem, where the design matrix is $X_{k+1} = (D_{k+1})^{-1}$. \section{Modification of $D$} As we have seen, the trend filtering problem becomes a sparse regression with $\ell_1$ regularization if we consider the design matrix $X_{k+1} = (D_{k+1})^{-1}$. However, $D_{1} \in \mathbb{R}^{(n-1)\times n}$ is not invertible, so is $D_{k+1}$ for $k=1,2,\dots$ By observation, we complete $D_{1}$ as a square and symmetric matrix \begin{align} \hat{D}_{1} = \begin{bmatrix} -1 & 1 & 0 & \dots & 0 & 0\\ 0 & -1 & 1 & \dots & 0 & 0\\ \vdots & \ddots & \\ 0 & 0 & 0 & \dots & -1 & 1\\ 0 & 0 & 0 & \dots & 0 & -1 \end{bmatrix} \in \mathbb{R}^{n\times n}. \end{align} And for $k\geq 1$, we obtain \begin{align} \hat{D}_{k+1} = \hat{D}_{1} \cdot \hat{D}_{k} \in \mathbb{R}^{n\times n}. \end{align} We notice that, by this modification, $\hat{D}_{k+1}$ has $k$ more rows added at the bottom without changing any previous entry. With this modification, we are able to invert $\hat{D}_{k+1}$ and consider the inverse matrix as a design matrix in the sparse regression. \section{Special structure of $\hat{D}^{-1}$} After determining the design matrix $X$ in the sparse regression problem, we could apply \susie algorithm to help us find a possible fit. Here, we denote $X_{k+1} = (\hat{D}_{k+1})^{-1}$, where $k$ is the order of trend filtering. Rather than generating $\hat{D}^{-1}$ and set this as an $X$ input, we exploit the special structure of $\hat{D}^{-1}$ and perform \susie on this specific trend filtering problem with $O(n)$ complexity. We will talk about how to make different computations linear in complexity by utilizing the special structure respectively. \section{Computation of $Xb$} \label{computation-on-Xb} In the trend filtering application, since $X_{k+1} = (\hat{D}_{k+1})^{-1}$, we obtain \begin{align} X_{k+1} \vb & = (\hat{D}_{k+1})^{-1} \vb = (\underbrace{\hat{D}_{1}\dots \hat{D}_{1}}_{k+1})^{-1} \vb \\ &= \underbrace{(\hat{D}_{1})^{-1} \dots (\hat{D}_{1})^{-1}}_{k+1} \vb \\ &= \underbrace{X_1 \dots X_1}_{k+1} \vb. \end{align} We notice that since \begin{align} X_1 = \begin{bmatrix} -1 & -1 & -1 & \dots & -1 & -1\\ 0 & -1 & -1 & \dots & -1 & -1\\ \vdots & \ddots & \\ 0 & 0 & 0 & \dots & -1 & -1\\ 0 & 0 & 0 & \dots & 0 & -1 \end{bmatrix} \in \mathbb{R}^{n\times n}, \end{align} \begin{align} X_1 \vb & = -1 \cdot [b_1+b_2+\dots+b_n, b_2+\dots+b_n, \dots, b_{n-1}+b_n, b_n]^T \\ & = -1 \cdot \text{cumsum}(\text{reverse}(\vb)) . \end{align} Let $f: \mathbb{R}^n \to \mathbb{R}^n$ such that $f(\vx)= -\text{cumsum}(\text{reverse}(\vx))$ for any $\vx \in \mathbb{R}^n$. Then \begin{align} X_{k+1} \vb & = \underbrace{X_1 \dots X_1}_{k+1} \vb = f^{(k+1)}(\vb), \end{align} where $k$ is the order of trend filtering. \section{Computation of $X^Ty$} \label{computation-on-Xty} We consider $X_{k+1}^T\vy$. Here $X_{k+1} = (\hat{D}_{k+1})^{-1}$ in the trend filtering problem, and $\vy$ is an n vector. We have \begin{align} X_{k+1}^T \vy & = ((\hat{D}_{k+1})^{-1})^T \vy = ((\underbrace{\hat{D}_{1}\dots \hat{D}_{1}}_{k+1})^{-1})^T \vy \\ & = \underbrace{((\hat{D}_{1})^{-1})^T \dots ((\hat{D}_{1})^{-1})^T}_{k+1} \vy \\ & = \underbrace{X_1^T \dots X_1^T}_{k+1} \vy. \end{align} Similarly, we observe that since \begin{align} X_1^T = \begin{bmatrix} -1 & 0 & 0 & \dots & 0 & 0\\ -1 & -1 & 0 & \dots & 0 & 0\\ \vdots & \ddots & \\ -1 & -1 & -1 & \dots & -1 & 0\\ -1 & -1 & -1 & \dots & -1 & -1 \end{bmatrix} \in \mathbb{R}^{n\times n}, \end{align} \begin{align} X_1^T \vy & = -1 \cdot [y_1, y_1+y_2, \dots, y_1+y_2+\dots+y_n]^T \\ & = -1 \cdot \text{cumsum}(\vy). \end{align} Let $g: \mathbb{R}^n \to \mathbb{R}^n$ such that $g(\vx)= -\text{cumsum}(\vx)$ for any $\vx \in \mathbb{R}^n$. Then \begin{align} X_{k+1}^T \vy & = \underbrace{X_1^T \dots X_1^T}_{k+1} \vy = g^{(k+1)}(\vy), \end{align} where $k$ is the order of trend filtering. \section{Computation on $(X^2)^T 1$; i.e., colSums($X^2$)} \label{computation-on-d} To compute $(X_{k+1}^2)^T \bm{1}$, let's first explore the special structure of $X_{k+1}=(\hat{D}^{(k+1)})^{-1}$ for $k=0,1,2$. \begin{align} X_1 = \begin{bmatrix} -1 & -1 & -1 & -1 & -1 & \dots \\ 0 & -1 & -1 & -1 & -1 & \dots \\ 0 & 0 & -1 & -1 & -1 & \dots \\ 0 & 0 & 0 & -1 & -1 & \dots \\ \vdots & \ddots & \\ \end{bmatrix} \in \mathbb{R}^{n\times n}, \end{align} \begin{align} X_2 = \begin{bmatrix} 1 & 2 & 3 & 4 & 5 & 6 & \dots \\ 0 & 1 & 2 & 3 & 4 & 5 & \dots \\ 0 & 0 & 1 & 2 & 3 & 4 &\dots \\ 0 & 0 & 0 & 1 & 2 & 3 &\dots \\ \vdots & \ddots & \\ \end{bmatrix} \in \mathbb{R}^{n\times n}, \end{align} \begin{align} X_3 = \begin{bmatrix} -1 & -3 & -6 & -10 & -15 & \dots \\ 0 & -1 & -3 & -6 & -10 & \dots \\ 0 & 0 & -1 & -3 & -6 & \dots \\ 0 & 0 & 0 & -1 & -3 & \dots \\ \vdots & \ddots & \\ \end{bmatrix} \in \mathbb{R}^{n\times n}, \end{align} Define a triangular rotate matrix $Q \in \mathbb{R}^{n\times n}$ such that (i) For any $i, j \leq n$, $Q_{ij} = 0$ if $i>j$. (ii) For any $k < n$, $Q_{ab} = Q_{cd}$ if $b-a = d-c = k$. We observe that if $X$ is a triangular rotate matrix, then \begin{align} X^T \bm{1} = \text{cumsum}(X_{1.}). \end{align} Since $X^2$ is still a triangular rotate matrix, we obtain \begin{align} (X^2)^T \bm{1} = \text{cumsum}(X^2_{1.}). \end{align} Since $X_{k+1} = (\hat{D}_{k+1})^{-1}$ is a triangular rotate matrix, \begin{align} (X_{k+1}^2)^T \bm{1} = \text{cumsum}((X_{k+1})_{1.}^2). \end{align} And, obviously, the first row of $X_{k+1}$ is \begin{equation} (X_{k+1})_{1.} = \begin{cases} \bm{-1} & \text{if } k = 0 \\ g^{(k)}(\bm{1}) & \text{if } k > 0. \end{cases} \end{equation} \section{Computation of $\mu$; i.e., column means} \label{computation-on-cm} For each column $j = 1,2,\dots,n$, \begin{equation} \mu_j = E[X_{.j}], \end{equation} and $\bm{\mu} = [\mu_1, \mu_2, \dots, \mu_n]^T \in \mathbb{R}^n$. Hence we get \begin{equation} \bm{\mu} = \frac{1}{n} X_{k+1}^T \bm{1} = \frac{1}{n} \text{cumsum}((X_{k+1})_{1.}), \end{equation} where $(X_{k+1})_{1.}$ is defined above in \ref{computation-on-d}. \section{Computation of $\sigma$; i.e., column standard deviations} \label{computation-on-csd} For each column $j=1,2,\dots, n$, \begin{align} \sigma_j & = \sqrt{E[X_{.j}^2] - E[X_{.j}]^2} \\ & = \sqrt{\frac{1}{n}\sum_{i=1}^{n}X_{ij}^2 - (\frac{1}{n}\sum_{i=1}^{n} X_{ij})^2}. \end{align} Hence, $\bm{\sigma} = [\sigma_1, \sigma_2, \dots, \sigma_n]^T \in \mathbb{R}^n$ becomes \begin{align} \bm{\sigma} & = \sqrt{E[X^2] - E[X]^2} \\ & = \sqrt{\frac{1}{n}\text{colSums}(X^2) - (\frac{1}{n}\text{colSums}(X))^2} \\ & = \sqrt{\frac{1}{n}(X^2)^T \bm{1} + (\frac{1}{n} X^T \bm{1})^2}, \end{align} where the first term involves \ref{computation-on-d} and the second term is computed in \ref{computation-on-cm}. Note that in the algorithm, we set the column standard deviation 1 when the column has variance 0 for computation convenience. \section{Computation on $(\hat{X}^2)^T 1$; i.e., colSums($\hat{X}^2$)} \label{computation-on-std-d} We want to compute colSums($\hat{X}^2$), where $\hat{X}$ is scaled by both column means $\bm{\mu} = [\mu_1, \mu_2, \ldots, \mu_n]^T \in \mathbb{R}^n$ and column standard deviations $\bm{\sigma} = [\sigma_1, \sigma_2, \dots, \sigma_n]^T \in \mathbb{R}^n$. We define $\hat{X} \in \mathbb{R}^{n \times n}$ such that for each $i = 1,2,\ldots,n$ and $j=1,2,\dots,n$, \begin{equation*} \hat{X}_{ij} = (X_{ij} - \mu_j)/\sigma_j, \end{equation*} where $X = X_{k+1} = (\hat{D}_{k+1})^{-1}$ if the order is $k$. \section{Conclusion} Computation details from section \ref{computation-on-Xb} to section \ref{computation-on-std-d} explain how we can benefit from the unique structure of matrices from trend filtering problem. As shown by our formula, we do not need to form any matrix and complete \susie algorithm with $O(n)$ complexity. \bibliography{trendfiltering_derivations} \end{document} susieR/vignettes/l0_initialization.Rmd0000644000176200001440000000376313350763557017651 0ustar liggesusers--- title: "SuSiE with L0Learn initialization example" author: "Kaiqian Zhang" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{L0Learn initialization demo} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE,comment = "#") ``` `susieR` allows for a customized initialization. In this vignette we deomonstrate how to use [`L0Learn`](https://github.com/hazimehh/L0Learn) fit to initialize susieR. ```{r, warning=FALSE} library(susieR) library(L0Learn) ``` ## Simulate data First, we simulate data from the minimal example. ```{r} set.seed(1) n = 1000 p = 1000 beta = rep(0,p) beta[c(1,2,300,400)] = 1 X = matrix(rnorm(n*p),nrow=n,ncol=p) y = X %*% beta + rnorm(n) ``` ## Fit L0Learn We start with fitting a L0-regularized model to the simulated data. ```{r} set.seed(1) L0fit = L0Learn.cvfit(X, y, penalty = "L0") ``` Let's choose the penalty strength parameter that minimizes the cross-validation error. ```{r} lambdaIndex = which.min(L0fit$cvMeans[[1]]) L0coef = as.numeric(coef(L0fit$fit, lambda = L0fit$fit$lambda[[1]][lambdaIndex])) effect.beta = L0coef[which(L0coef!=0)][-1] effect.index = (which(L0coef!=0)-1)[-1] length(effect.beta) effect.beta[1:10] effect.index[1:10] ``` The L0Learn model finds `r length(effect.beta)` effects, which will be used to initialize susie. ## Build an initialization object We create an initialization from `l0learn` coefficients using `susie_init_coef` function, ```{r} set.seed(1) s.init = susie_init_coef(effect.index, effect.beta, p) ``` ## Run susieR with initialization Now, we use `effect.index` and `effect.beta` obtained from L0Learn fit to create an `s.init` object. We then run susie with this initialization. ```{r} susieL0.fit = susie(X,y,s_init=s.init) susieL0.fit$sets$cs ``` ## References 1. Hussein Hazimeh and Rahul Mazumder. (2018). Fast Best Subset Selection: Coordinate Descent and Local Combinatorial Optimization Algorithms. susieR/vignettes/susie_refine.Rmd0000644000176200001440000000531214113171573016664 0ustar liggesusers--- title: "Refine SuSiE model" author: "Yuxin Zou" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Refine SuSiE model} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ``` In this vignette, we demonstrate a procedure that helps SuSiE get out of local optimum. We simulate phenotype using UK Biobank genotypes from 50,000 individuals. There are 1001 SNPs. It is simulated to have exactly 2 non-zero effects at 234, 287. ```{r} library(susieR) library(curl) data_file <- tempfile(fileext = ".RData") data_url <- paste0("https://raw.githubusercontent.com/stephenslab/susieR/", "master/inst/datafiles/FinemappingConvergence1k.RData") curl_download(data_url,data_file) load(data_file) b <- FinemappingConvergence$true_coef susie_plot(FinemappingConvergence$z, y = "z", b=b) ``` The strongest marginal association is a non-effect SNP. Since the sample size is large, we use sufficient statistics ($X^\intercal X, X^\intercal y, y^\intercal y$ and sample size $n$) to fit susie model. It identifies 2 Credible Sets, one of them is false positive. This is because `susieR` get stuck around a local minimum. ```{r} fitted <- with(FinemappingConvergence, susie_suff_stat(XtX = XtX, Xty = Xty, yty = yty, n = n)) susie_plot(fitted, y="PIP", b=b, main=paste0("ELBO = ", round(susie_get_objective(fitted),2))) ``` Our refine procedure to get out of local optimum is 1. fit a susie model, $s$ (suppose it has $K$ CSs). 2. for CS in $s$, set SNPs in CS to have prior weight 0, fit susie model --> we have K susie models: $t_1, \cdots, t_K$. 3. for each $k = 1, \cdots, K$, fit susie with initialization at $t_k$ ($\alpha, \mu, \mu^2$) --> $s_k$ 4. if $\max_k \text{elbo}(s_k) > \text{elbo}(s)$, set $s = s_{kmax}$ where $kmax = \arg_k \max \text{elbo}(s_k)$ and go to step 2; if no, break. We fit susie model with above procedure by setting `refine = TRUE`. ```{r} fitted_refine <- with(FinemappingConvergence, susie_suff_stat(XtX = XtX, Xty = Xty, yty = yty, n = n, refine=TRUE)) susie_plot(fitted_refine, y="PIP", b=b, main=paste0("ELBO = ", round(susie_get_objective(fitted_refine),2))) ``` With the refine procedure, it identifies 2 CSs with the true signals, and the achieved evidence lower bound (ELBO) is higher. ## Session information Here are some details about the computing environment, including the versions of R, and the R packages, used to generate these results. ```{r} sessionInfo() ``` susieR/vignettes/susierss_diagnostic.Rmd0000644000176200001440000001050614142575215020274 0ustar liggesusers--- title: "Diagnostic for fine-mapping with summary statistics" author: "Yuxin Zou" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Diagnostic for fine-mapping with summary statistics} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ``` This vignette demonstrates diagnostic plot for consistency between summary statistics and reference LD matrix. The `susie_rss` assumes the LD matrix accurately estimate the correlations among SNPs from the original GWAS genotype data. Typically, the LD matrix comes from some public database of genotypes in a suitable reference population. The inaccurate LD information leads to unreliable fine-mapping result. The diagnostic for consistency between summary statistics and refenrence LD matrix is based on the RSS model under the null with regularized LD matrix. $$ \hat{z} | R, s \sim N(0, (1-s)R + s I), 0 1 | residual_variance < 0)) stop("Residual variance should be a scaler between 0 and 1") if (is.null(residual_variance)) residual_variance = 1 if (is.null(prior_weights)){ prior_weights = rep(1/p,p) }else{ if(all(prior_weights == 0)){ stop("Prior weight should greater than 0 for at least one variable.") } prior_weights = prior_weights / sum(prior_weights) } if(length(prior_weights) != p) stop("Prior weights must have length p") if (p < L) L = p s = list(alpha = matrix(1/p,nrow = L,ncol = p), mu = matrix(0,nrow = L,ncol = p), mu2 = matrix(0,nrow = L,ncol = p), Rz = rep(0,p), KL = rep(as.numeric(NA),L), lbf = rep(as.numeric(NA),L), lbf_variable = matrix(as.numeric(NA),L,p), sigma2 = residual_variance, V = prior_variance, pi = prior_weights) if (is.null(null_weight)) s$null_index = 0 else s$null_index = p class(s) = "susie" return(s) } # Update a susie fit object in order to initialize susie model. init_finalize_rss = function (s, R = NULL, Rz = NULL) { if(length(s$V) == 1) s$V = rep(s$V,nrow(s$alpha)) # Check sigma2. if (!is.numeric(s$sigma2)) stop("Input residual variance sigma2 must be numeric") # Avoid problems with dimension if input is a 1 x 1 matrix. s$sigma2 = as.numeric(s$sigma2) if (length(s$sigma2) != 1) stop("Input residual variance sigma2 must be a scalar") if (s$sigma2 <= 0) stop("residual variance sigma2 must be positive (is your var(y) zero?)") # Check prior variance. if (!is.numeric(s$V)) stop("Input prior variance must be numeric") if (!all(s$V >= 0)) stop("prior variance must be non-negative") if (!all(dim(s$mu) == dim(s$mu2))) stop("dimension of mu and mu2 in input object do not match") if (!all(dim(s$mu) == dim(s$alpha))) stop("dimension of mu and alpha in input object do not match") if (nrow(s$alpha) != length(s$V)) stop("Input prior variance V must have length of nrow of alpha in ", "input object") # Update Rz. if (!missing(Rz)) s$Rz = Rz if (!missing(R)) s$Rz = compute_Xb(R,colSums(s$mu * s$alpha)) # Reset KL and lbf. s$KL = rep(as.numeric(NA),nrow(s$alpha)) s$lbf = rep(as.numeric(NA),nrow(s$alpha)) class(s) = "susie" return(s) } susieR/R/predict.susie.R0000644000176200001440000000372614051345167014647 0ustar liggesusers#' @title Extract regression coefficients from susie fit #' #' @param object A susie fit. #' #' @param \dots Additional arguments passed to the generic \code{coef} #' method. #' #' @return A p+1 vector, the first element being an intercept, and the #' remaining p elements being estimated regression coefficients. #' #' @importFrom stats coef #' #' @method coef susie #' #' @export coef.susie #' #' @export #' coef.susie = function (object, ...) { s = object return(c(s$intercept,colSums(s$alpha*s$mu)/s$X_column_scale_factors)) } #' @title Predict outcomes or extract coefficients from susie fit. #' #' @param object A susie fit. #' #' @param newx A new value for X at which to do predictions. #' #' @param type The type of output. For \code{type = "response"}, #' predicted or fitted outcomes are returned; for \code{type = #' "coefficients"}, the estimated coefficients are returned. #' #' @param \dots Other arguments used by generic predict function. These #' extra arguments are not used here. #' #' @return For \code{type = "response"}, predicted or fitted outcomes #' are returned; for \code{type = "coefficients"}, the estimated #' coefficients are returned. If the susie fit has intercept = #' \code{NA} (which is common when using \code{susie_suff_stat}) then #' predictions are computed using an intercept of 0, and a warning is #' emitted. #' #' @importFrom stats coef #' #' @method predict susie #' #' @export predict.susie #' #' @export #' predict.susie = function (object, newx = NULL, type = c("response","coefficients"), ...) { s = object type = match.arg(type) if (type == "coefficients") { if (!missing(newx)) stop("Do not supply newx when predicting coefficients") return(coef(s)) } if (missing(newx)) return(s$fitted) if (is.na(s$intercept)) { warning("The prediction assumes intercept = 0") return(drop(newx %*% coef(s)[-1])) } else return(drop(s$intercept + newx %*% coef(s)[-1])) } susieR/R/initialize.R0000644000176200001440000001023414104273074014213 0ustar liggesusers#' @title Initialize a susie object using regression coefficients #' #' @param coef_index An L-vector containing the the indices of the #' nonzero coefficients. #' #' @param coef_value An L-vector containing initial coefficient #' estimates. #' #' @param p A scalar giving the number of variables. #' #' @return A list with elements \code{alpha}, \code{mu} and \code{mu2} #' to be used by \code{susie}. #' #' @examples #' set.seed(1) #' n = 1000 #' p = 1000 #' beta = rep(0,p) #' beta[sample(1:1000,4)] = 1 #' X = matrix(rnorm(n*p),nrow = n,ncol = p) #' X = scale(X,center = TRUE,scale = TRUE) #' y = drop(X %*% beta + rnorm(n)) #' #' # Initialize susie to ground-truth coefficients. #' s = susie_init_coef(which(beta != 0),beta[beta != 0],length(beta)) #' res = susie(X,y,L = 10,s_init=s) #' #' @export #' susie_init_coef = function (coef_index, coef_value, p) { L = length(coef_index) if (L <= 0) stop("Need at least one non-zero effect") if (!all(coef_value != 0)) stop("Input coef_value must be non-zero for all its elements") if (L != length(coef_value)) stop("Inputs coef_index and coef_value must of the same length") if (max(coef_index) > p) stop("Input coef_index exceeds the boundary of p") alpha = matrix(0,nrow = L,ncol = p) mu = matrix(0,nrow = L,ncol = p) for(i in 1:L){ alpha[i,coef_index[i]] = 1 mu[i,coef_index[i]] = coef_value[i] } out = list(alpha = alpha,mu = mu,mu2 = mu*mu) class(out) = c("susie","list") return(out) } # Set default susie initialization. init_setup = function (n, p, L, scaled_prior_variance, residual_variance, prior_weights, null_weight, varY, standardize) { if (!is.numeric(scaled_prior_variance) || scaled_prior_variance < 0) stop("Scaled prior variance should be positive number") if (scaled_prior_variance > 1 && standardize) stop("Scaled prior variance should be no greater than 1 when ", "standardize = TRUE") if(is.null(residual_variance)) residual_variance = varY if(is.null(prior_weights)){ prior_weights = rep(1/p,p) }else{ if(all(prior_weights == 0)){ stop("Prior weight should greater than 0 for at least one variable.") } prior_weights = prior_weights / sum(prior_weights) } if(length(prior_weights) != p) stop("Prior weights must have length p") if (p < L) L = p s = list(alpha = matrix(1/p,nrow = L,ncol = p), mu = matrix(0,nrow = L,ncol = p), mu2 = matrix(0,nrow = L,ncol = p), Xr = rep(0,n), KL = rep(as.numeric(NA),L), lbf = rep(as.numeric(NA),L), lbf_variable = matrix(as.numeric(NA),L,p), sigma2 = residual_variance, V = scaled_prior_variance*varY, pi = prior_weights) if (is.null(null_weight)) s$null_index = 0 else s$null_index = p class(s) = "susie" return(s) } # Update a susie fit object in order to initialize susie model. init_finalize = function (s, X = NULL, Xr = NULL) { if(length(s$V) == 1) s$V = rep(s$V,nrow(s$alpha)) # Check sigma2. if (!is.numeric(s$sigma2)) stop("Input residual variance sigma2 must be numeric") # Avoid problems with dimension if input is a 1 x 1 matrix. s$sigma2 = as.numeric(s$sigma2) if (length(s$sigma2) != 1) stop("Input residual variance sigma2 must be a scalar") if (s$sigma2 <= 0) stop("Residual variance sigma2 must be positive (is your var(Y) zero?)") # check prior variance if (!is.numeric(s$V)) stop("Input prior variance must be numeric") if (!all(s$V >= 0)) stop("prior variance must be non-negative") if (!all(dim(s$mu) == dim(s$mu2))) stop("dimension of mu and mu2 in input object do not match") if (!all(dim(s$mu) == dim(s$alpha))) stop("dimension of mu and alpha in input object do not match") if (nrow(s$alpha) != length(s$V)) stop("Input prior variance V must have length of nrow of alpha in ", "input object") # Update Xr. if (!missing(Xr)) s$Xr = Xr if (!missing(X)) s$Xr = compute_Xb(X,colSums(s$mu * s$alpha)) # Reset KL and lbf. s$KL = rep(as.numeric(NA),nrow(s$alpha)) s$lbf = rep(as.numeric(NA),nrow(s$alpha)) class(s) = "susie" return(s) } susieR/R/susie_rss.R0000644000176200001440000002143314142574553014104 0ustar liggesusers#' @title Sum of Single Effects (SuSiE) Regression using summary statistics #' #' @description \code{susie_rss} performs variable selection under a #' sparse Bayesian multiple linear regression of \eqn{Y} on \eqn{X} #' using only the z-scores from standard univariate regression #' of \eqn{Y} on each column of \eqn{X}, and an estimate \eqn{R} of #' the correlation matrix between columns of \eqn{X}. It does this by #' combining the "RSS likelihood" from Zhu and Stephens (2017) with #' the Sum of Single Effects" model from Wang et al (2020). #' #' #' @details In some applications, particularly genetic applications, #' it is desired to fit a regression model (\eqn{Y = X\tilde{b} + E} #' say, which we refer to as "the original regression model" or ORM) #' without access to the actual values of \eqn{Y} and \eqn{X}, but #' given only some summary statistics. \code{susie_rss} assumes the #' availability of \eqn{z} scores from standard univariate regression #' of \eqn{Y} on each column of \eqn{X}, and an estimate \eqn{R} of #' the correlation matrix between columns of \eqn{X} (\eqn{R} is #' sometimes called the LD matrix in genetic applications). See Zhu #' and Stephens (2017), and references therein, for further #' background. #' #' The \code{susie_rss} function is based on the model (2.10) from #' Zhu and Stephens, \eqn{z | R, b ~ N(Rb,R)} where \eqn{b} is a #' vector of length p representing the effects to be estimated. The #' effect \eqn{b_j} is simply a multiple of the coefficient #' \eqn{\tilde{b}_j} in the ORM, and so \eqn{b_j} is non-zero if and #' only if \eqn{\tilde{b}_j} is non-zero. In this sense the variable #' selection problem in this model is the same as the variable #' selection problem in the ORM, and so the credible sets and PIPs #' computed by \code{susie_rss} can be interpreted as credible sets #' and PIPs for the ORM. However, converting posterior estimates of #' \eqn{b_j} to estimates of \eqn{\tilde{b}_j} would require #' computation of the scaling factor (not done here). #' #' More precisely, \code{susie_rss} assumes the log-likelihood for #' \eqn{b} is \eqn{l(b; z,R) = -0.5(b'Rb - 2z'b)}, which is equivalent #' to model (2.10) from Zhu and Stephens if \eqn{R} is invertible, but #' does not require \eqn{R} to be invertible. It combines this #' likelihood with the \dQuote{susie prior} which assumes that \eqn{b #' = \sum_{l=1}^L b_l} where each \eqn{b_l} is a vector of length p #' with exactly one non-zero element; see \code{\link{susie}} and Wang #' et al (2020) for details. #' #' In practice, this is accomplished by calling \code{susie_suff_stat} #' with \code{XtX = R} and \code{Xty = z}, and fixing #' \code{residual_variance = 1}. (Values for \code{n} and \code{yty} #' are also required by \code{susie_suff_stat}. They do not affect #' inference when the residual variance is fixed, but they do affect #' the interpretation of \code{scaled_prior_variance}; we set #' \code{n=2, yty=1} so that \eqn{var(y) = yty/(n-1) = 1}.) Additional #' arguments to be passed to \code{\link{susie_suff_stat}} can be #' provided via \code{...}. #' #' @param z A p-vector of z scores. #' #' @param R A p by p correlation matrix. #' #' @param z_ld_weight This parameter is included for backwards #' compatibility with previous versions of the function, but it is no #' longer recommended to use a non-zero value. If \code{z_ld_weight #' > 0}, the matrix R used in the model is adjusted to be #' \code{cov2cor((1-w)*R + w*tcrossprod(z))}, where \code{w = #' z_ld_weight}. #' #' @param prior_variance The prior variance(s) for the non-zero #' element of \eqn{b_l}. It is either a scalar, or a vector of length #' L. When \code{estimate_prior_variance = TRUE} (highly recommended) #' this simply provides an initial value for the prior variance, and #' the default value of 50 is simply intended to be a large initial #' value. #' #' @param estimate_prior_variance If \code{estimate_prior_variance = #' TRUE}, which is highly recommended, the prior variance is estimated #' (this is a separate parameter for each of the L effects). If #' provided, \code{prior_variance} is then used as an initial value #' for the optimization. When \code{estimate_prior_variance = FALSE} #' (not recommended) the prior variance for each of the L effects is #' determined by the value supplied to \code{prior_variance}. #' #' @param check_prior When \code{check_prior = TRUE}, it checks if the #' estimated prior variance becomes unreasonably large (comparing with #' 10 * max(abs(z))^2). #' #' @param \dots Other parameters to be passed to #' \code{\link{susie_suff_stat}}. #' #' @return A \code{"susie"} object with the following #' elements: #' #' \item{alpha}{An L by p matrix of posterior inclusion probabilites.} #' #' \item{mu}{An L by p matrix of posterior means, conditional on #' inclusion.} #' #' \item{mu2}{An L by p matrix of posterior second moments, #' conditional on inclusion.} #' #' \item{lbf}{log-Bayes Factor for each single effect.} #' #' \item{lbf_variable}{log-Bayes Factor for each variable and single effect.} #' #' \item{V}{Prior variance of the non-zero elements of b.} #' #' \item{elbo}{The value of the variational lower bound, or #' \dQuote{ELBO} (objective function to be maximized), achieved at #' each iteration of the IBSS fitting procedure.} #' #' \item{Rr}{A vector of length p, equal to \code{R \%*\% colSums(alpha*mu)}.} #' #' \item{sets}{Credible sets estimated from model fit; see #' \code{\link{susie_get_cs}} for details.} #' #' \item{pip}{A vector of length p giving the (marginal) posterior #' inclusion probabilities for all p covariates.} #' #' \item{niter}{Number of IBSS iterations that were performed.} #' #' \item{converged}{\code{TRUE} or \code{FALSE} indicating whether #' the IBSS converged to a solution within the chosen tolerance #' level.} #' #' @references #' G. Wang, A. Sarkar, P. Carbonetto and M. Stephens (2020). A simple #' new approach to variable selection in regression, with application #' to genetic fine-mapping. \emph{Journal of the Royal Statistical #' Society, Series B} \bold{82}, 1273-1300 \doi{10.1101/501114}. #' #' Y. Zou, P. Carbonetto, G. Wang and M. Stephens (2021). #' Fine-mapping from summary data with the \dQuote{Sum of Single Effects} #' model. \emph{bioRxiv} \doi{10.1101/2021.11.03.467167}. #' #' X. Zhu and M. Stephens (2017). Bayesian large-scale multiple #' regression with summary statistics from genome-wide association #' studies. \emph{Annals of Applied Statistics} \bold{11}, 1561-1592. #' #' @examples #' set.seed(1) #' n = 1000 #' p = 1000 #' beta = rep(0,p) #' beta[1:4] = 1 #' X = matrix(rnorm(n*p),nrow = n,ncol = p) #' X = scale(X,center = TRUE,scale = TRUE) #' y = drop(X %*% beta + rnorm(n)) #' #' input_ss = compute_suff_stat(X,y,standardize = TRUE) #' ss = univariate_regression(X,y) #' R = with(input_ss,cov2cor(XtX)) #' zhat = with(ss,betahat/sebetahat) #' res = susie_rss(zhat,R) #' #' # Toy example illustrating behaviour susie_rss when the z-scores #' # are mostly consistent with a non-invertible correlation matrix. #' # Here the CS should contain both variables, and two PIPs should #' # be nearly the same. #' z = c(6,6.01) #' R = matrix(1,2,2) #' fit = susie_rss(z,R) #' print(fit$sets$cs) #' print(fit$pip) #' #' # In this second toy example, the only difference is that one #' # z-score is much larger than the other. Here we expect that the #' # second PIP will be much larger than the first. #' z = c(6,7) #' R = matrix(1,2,2) #' fit = susie_rss(z,R) #' print(fit$sets$cs) #' print(fit$pip) #' #' @export #' susie_rss = function (z, R, z_ld_weight = 0, prior_variance = 50, estimate_prior_variance=TRUE, check_prior=TRUE, ...) { # Check input R. if (nrow(R) != length(z)) stop(paste0("The dimension of correlation matrix (", nrow(R)," by ", ncol(R),") does not agree with expected (",length(z)," by ", length(z),")")) # Modify R by z_ld_weight; this modification was designed to ensure # the column space of R contained z, but susie_suff_stat does not # require this, and it is no longer recommended if (z_ld_weight > 0) { warning("As of version 0.11.0, use of non-zero z_ld_weight is no longer ", "recommended") R = muffled_cov2cor((1-z_ld_weight)*R + z_ld_weight * tcrossprod(z)) R = (R + t(R))/2 } # The choice of n=2, yty=1 is arbitrary except in that it ensures # var(y) = yty/(n-1) = 1 and because of this scaled_prior_variance = # prior_variance. s = susie_suff_stat(XtX = R,Xty = z,n = 2,yty = 1, scaled_prior_variance = prior_variance, estimate_prior_variance = estimate_prior_variance, residual_variance = 1,estimate_residual_variance = FALSE, standardize = FALSE,check_prior = check_prior,...) s$Rr = s$XtXr s$XtXr = NULL return(s) } susieR/R/update_each_effect_rss.R0000644000176200001440000000325513755042336016532 0ustar liggesusers# @title Update each effect once. # @param R a p by p symmetric and positive semidefinite correlation matrix. # @param z a p vector # @param s_init a list with elements sigma2, V, alpha, mu, Xr # @param Sigma sigma2*R + lambda I # @param estimate_prior_variance boolean indicating whether to estimate # prior variance # @param check_null_threshold float a threshold on the log scale to # compare likelihood between current estimate and zero the null # #' @importFrom Matrix diag update_each_effect_rss = function (R, z, s_init, Sigma, estimate_prior_variance = FALSE, estimate_prior_method = "optim", check_null_threshold = 0) { if (!estimate_prior_variance) estimate_prior_method = "none" # Repeat for each effect to update. s = s_init L = nrow(s$alpha) if(L > 0) for (l in 1:L) { # Remove lth effect from fitted values. s$Rz = s$Rz - R %*% (s$alpha[l,] * s$mu[l,]) # Compute residuals. r = z - s$Rz res = single_effect_regression_rss(as.vector(r),Sigma,s$V[l],s$pi, estimate_prior_method,check_null_threshold) # Update the variational estimate of the posterior mean. s$mu[l,] = res$mu s$alpha[l,] = res$alpha s$mu2[l,] = res$mu2 s$V[l] = res$V s$lbf[l] = res$lbf_model s$lbf_variable[l,] = res$lbf s$KL[l] = -res$lbf_model + SER_posterior_e_loglik_rss(R,Sigma,r,res$alpha * res$mu, res$alpha * res$mu2) s$Rz = s$Rz + R %*% (s$alpha[l,] * s$mu[l,]) } s$Rz = unname(as.matrix(s$Rz)) return(s) }susieR/R/single_effect_regression_ss.R0000644000176200001440000000374713755042336017635 0ustar liggesusers#' @rdname single_effect_regression #' #' @param Xty A p-vector. #' #' @param dXtX A p-vector containing the diagonal elements of #' \code{crossprod(X)}. #' #' @importFrom stats uniroot #' @importFrom stats optim #' #' @keywords internal #' single_effect_regression_ss = function (Xty, dXtX, V = 1, residual_variance = 1, prior_weights = NULL, optimize_V = c("none", "optim", "uniroot", "EM", "simple"), check_null_threshold = 0) { optimize_V = match.arg(optimize_V) betahat = (1/dXtX) * Xty shat2 = residual_variance/dXtX if (is.null(prior_weights)) prior_weights = rep(1/length(dXtX),length(dXtX)) if (optimize_V != "EM" && optimize_V != "none") V = optimize_prior_variance(optimize_V,betahat,shat2,prior_weights, alpha = NULL,post_mean2 = NULL,V_init = V, check_null_threshold = check_null_threshold) # log(bf) for each SNP. lbf = dnorm(betahat,0,sqrt(V + shat2),log = TRUE) - dnorm(betahat,0,sqrt(shat2),log = TRUE) # Deal with special case of infinite shat2 (e.g., happens if X does # not vary). lbf[is.infinite(shat2)] = 0 # w is proportional to BF, but subtract max for numerical stability # posterior prob on each SNP. maxlbf = max(lbf) w = exp(lbf - maxlbf) w_weighted = w * prior_weights weighted_sum_w = sum(w_weighted) alpha = w_weighted / weighted_sum_w post_var = (1/V + dXtX/residual_variance)^(-1) # Posterior variance. post_mean = (1/residual_variance) * post_var * Xty post_mean2 = post_var + post_mean^2 # Second moment. lbf_model = maxlbf + log(weighted_sum_w) # Analogue of loglik in the # non-summary case. if (optimize_V == "EM") V = optimize_prior_variance(optimize_V,betahat,shat2,prior_weights,alpha, post_mean2,check_null_threshold = check_null_threshold) return(list(alpha = alpha,mu = post_mean,mu2 = post_mean2,lbf = lbf, V = V,lbf_model = lbf_model)) } susieR/R/susieR-package.R0000644000176200001440000000031214051243075014710 0ustar liggesusers#' @keywords internal "_PACKAGE" # The following block is used by usethis to automatically manage # roxygen namespace tags. Modify with care! ## usethis namespace: start ## usethis namespace: end NULL susieR/R/elbo.R0000644000176200001440000000233513703336624013003 0ustar liggesusers# @title Get objective function from data and susie fit object. # @param data A flash data object. # @param f A flash fit object. # @keywords internal get_objective = function (X, Y, s) { return(Eloglik(X,Y,s) - sum(s$KL)) } # Expected loglikelihood for a susie fit. Eloglik = function (X, Y, s) { n = nrow(X) return(-(n/2) * log(2*pi*s$sigma2) - (1/(2*s$sigma2)) * get_ER2(X,Y,s)) } # Expected squared residuals. # s$Xr is column sum of Xr_L get_ER2 = function (X, Y, s) { Xr_L = compute_MXt(s$alpha * s$mu,X) # L by N matrix postb2 = s$alpha * s$mu2 # Posterior second moment. return(sum((Y - s$Xr)^2) - sum(Xr_L^2) + sum(attr(X,"d") * t(postb2))) } # @title posterior expected loglikelihood for a single effect regression # @param X an n by p matrix of covariates # @param Y an n vector of regression outcome # @param s2 the residual variance # @param Eb the posterior mean of b (p vector) (alpha * mu) # @param Eb2 the posterior second moment of b (p vector) (alpha * mu2) SER_posterior_e_loglik = function (X, Y, s2, Eb, Eb2) { n = nrow(X) return(-0.5*n*log(2*pi*s2) - 0.5/s2*(sum(Y*Y) - 2*sum(Y*compute_Xb(X,Eb)) + sum(attr(X,"d") * Eb2))) } susieR/R/remove_null_effects.R0000644000176200001440000000107014075324172016101 0ustar liggesusersremove_null_effects = function (s) { null_indices = (s$V == 0) s$alpha = s$alpha[!null_indices,,drop = FALSE] s$mu = s$mu[!null_indices,,drop = FALSE] s$mu2 = s$mu2[!null_indices,,drop = FALSE] s$lbf_variable = s$lbf_variable[!null_indices,,drop = FALSE] s$V = s$V[!null_indices,drop = FALSE] return(s) } add_null_effect = function (s, V) { p = ncol(s$alpha) s$alpha = rbind(s$alpha,1/p) s$mu = rbind(s$mu,rep(0,p)) s$mu2 = rbind(s$mu2,rep(0,p)) s$lbf_variable = rbind(s$lbf_variable,rep(0,p)) s$V = c(s$V,V) return(s) } susieR/R/compute_ss.R0000644000176200001440000000373114141046730014235 0ustar liggesusers#' @title Compute sufficient statistics for input to \code{susie_suff_stat} #' #' @description Computes the sufficient statistics \eqn{X'X, X'y, y'y} #' and \eqn{n} after centering (and possibly standardizing) the #' columns of \eqn{X} and centering \eqn{y} to have mean zero. We also #' store the column means of \eqn{X} and mean of \eqn{y}. #' #' @param X An n by p matrix of covariates. #' #' @param y An n vector. #' #' @param standardize Logical flag indicating whether to standardize #' columns of X to unit variance prior to computing summary data #' #' @return A list of sufficient statistics (\code{XtX, Xty, yty, n}) #' and \code{X_colmeans}, \code{y_mean}. #' #' @importFrom methods as #' @importFrom Matrix colMeans #' @importFrom Matrix crossprod #' #' @examples #' data(N2finemapping) #' ss = compute_suff_stat(N2finemapping$X, N2finemapping$Y[,1]) #' #' @export #' compute_suff_stat = function(X, y, standardize = FALSE) { y_mean = mean(y) y = y - y_mean n = nrow(X) mu = colMeans(X) s = compute_colSds(X) XtX = crossprod(X) XtX = as.matrix(XtX) XtX = XtX - n*tcrossprod(mu) if (standardize) { XtX = XtX/s XtX = t(XtX) XtX = XtX/s } Xty = drop(y %*% X) n = length(y) yty = sum(y^2) return(list(XtX = XtX,Xty = Xty,yty = yty,n = n, y_mean = y_mean,X_colmeans = mu)) } #' @title Compute sufficient statistics for input to \code{susie_suff_stat} #' #' @description This is a synonym for \code{compute_suff_stat} #' included for historical reasons (deprecated). #' #' @param X An n by p matrix of covariates. #' #' @param y An n vector. #' #' @param standardize Logical flag indicating whether to standardize #' columns of X to unit variance prior to computing summary data. #' #' @return A list of sufficient statistics (X'X, X'y, y'y and n) #' #' @importFrom methods as #' #' @examples #' data(N2finemapping) #' ss = compute_ss(N2finemapping$X, N2finemapping$Y[,1]) #' #' @export #' compute_ss = compute_suff_stat susieR/R/susie.R0000644000176200001440000006003214142636221013202 0ustar liggesusers#' @rdname susie #' #' @title Sum of Single Effects (SuSiE) Regression #' #' @description Performs a sparse Bayesian multiple linear regression #' of y on X, using the "Sum of Single Effects" model from Wang et al #' (2020). In brief, this function fits the regression model \eqn{y = #' \mu + X b + e}, where elements of \eqn{e} are \emph{i.i.d.} normal #' with zero mean and variance \code{residual_variance}, \eqn{\mu} is #' an intercept term and \eqn{b} is a vector of length p representing #' the effects to be estimated. The \dQuote{susie assumption} is that #' \eqn{b = \sum_{l=1}^L b_l} where each \eqn{b_l} is a vector of #' length p with exactly one non-zero element. The prior on the #' non-zero element is normal with zero mean and variance \code{var(y) #' * scaled_prior_variance}. The value of \code{L} is fixed, and #' should be chosen to provide a reasonable upper bound on the number #' of non-zero effects to be detected. Typically, the hyperparameters #' \code{residual_variance} and \code{scaled_prior_variance} will be #' estimated during model fitting, although they can also be fixed as #' specified by the user. See functions \code{\link{susie_get_cs}} and #' other functions of form \code{susie_get_*} to extract the most #' commonly-used results from a susie fit. #' #' @details The function \code{susie} implements the IBSS algorithm #' from Wang et al (2020). The option \code{refine = TRUE} implements #' an additional step to help reduce problems caused by convergence of #' the IBSS algorithm to poor local optima (which is rare in our #' experience, but can provide misleading results when it occurs). The #' refinement step incurs additional computational expense that #' increases with the number of CSs found in the initial run. #' #' The function \code{susie_suff_stat} implements essentially the same #' algorithms, but using sufficient statistics. (The statistics are #' sufficient for the regression coefficients \eqn{b}, but not for the #' intercept \eqn{\mu}; see below for how the intercept is treated.) #' If the sufficient statistics are computed correctly then the #' results from \code{susie_suff_stat} should be the same as (or very #' similar to) \code{susie}, although runtimes will differ as #' discussed below. The simplest sufficient statistics are the sample #' size \code{n}, and then the p by p matrix \eqn{X'X}, the p-vector #' \eqn{X'y}, and the sum of squared y values \eqn{y'y}, all computed #' after centering the columns of \eqn{X} and the vector \eqn{y} to #' have mean 0; these can be computed using \code{compute_suff_stat}. #' Alternatively the user can provide \code{n} and \code{bhat} (the #' univariate OLS estimates from regressing y on each column of X), #' \code{shat} (the standard errrors from these OLS regressions), the #' p by p symmetric, positive semidefinite correlation #' matrix \eqn{R = cov2cor(X'X)}, and the variance of \eqn{y}, again #' all computed from centered \eqn{X} and \eqn{y}. Note that here #' \code{R} and \code{bhat} should be computed using the same matrix #' \eqn{X}. If you do not have access to the original \eqn{X} to #' compute the matrix \code{R} then use \code{\link{susie_rss}}. #' #' The handling of the intercept term in \code{susie_suff_stat} needs #' some additional explanation. Computing the summary data after #' centering \code{X} and \code{y} effectively ensures that the #' resulting posterior quantities for \eqn{b} allow for an intercept #' in the model; however, the actual value of the intercept cannot be #' estimated from these centered data. To estimate the intercept term #' the user must also provide the column means of \eqn{X} and the mean #' of \eqn{y} (\code{X_colmeans} and \code{y_mean}). If these are not #' provided, they are treated as \code{NA}, which results in the #' intercept being \code{NA}. If for some reason you prefer to have #' the intercept be 0 instead of \code{NA} then set #' \code{X_colmeans = 0,y_mean = 0}. #' #' For completeness, we note that if \code{susie_suff_stat} is run on #' \eqn{X'X, X'y, y'y} computed \emph{without} centering \eqn{X} and #' \eqn{y}, and with \code{X_colmeans = 0,y_mean = 0}, this is #' equivalent to \code{susie} applied to \eqn{X, y} with #' \code{intercept = FALSE} (although results may differ due to #' different initializations of \code{residual_variance} and #' \code{scaled_prior_variance}). However, this usage is not #' recommended for for most situations. #' #' The computational complexity of \code{susie} is \eqn{O(npL)} per #' iteration, whereas \code{susie_suff_stat} is \eqn{O(p^2L)} per #' iteration (not including the cost of computing the sufficient #' statistics, which is dominated by the \eqn{O(np^2)} cost of #' computing \eqn{X'X}). Because of the cost of computing \eqn{X'X}, #' \code{susie} will usually be faster. However, if \eqn{n >> p}, #' and/or if \eqn{X'X} is already computed, then #' \code{susie_suff_stat} may be faster. #' #' @param X An n by p matrix of covariates. #' #' @param y The observed responses, a vector of length n. #' #' @param L Maximum number of non-zero effects in the susie #' regression model. If L is larger than the number of covariates, p, #' L is set to p. #' #' @param scaled_prior_variance The prior variance, divided by #' \code{var(y)} (or by \code{(1/(n-1))yty} for #' \code{susie_suff_stat}); that is, the prior variance of each #' non-zero element of b is \code{var(y) * scaled_prior_variance}. The #' value provided should be either a scalar or a vector of length #' \code{L}. If \code{estimate_prior_variance = TRUE}, this provides #' initial estimates of the prior variances. #' #' @param residual_variance Variance of the residual. If #' \code{estimate_residual_variance = TRUE}, this value provides the #' initial estimate of the residual variance. By default, it is set to #' \code{var(y)} in \code{susie} and \code{(1/(n-1))yty} in #' \code{susie_suff_stat}. #' #' @param prior_weights A vector of length p, in which each entry #' gives the prior probability that corresponding column of X has a #' nonzero effect on the outcome, y. #' #' @param null_weight Prior probability of no effect (a number between #' 0 and 1, and cannot be exactly 1). #' #' @param standardize If \code{standardize = TRUE}, standardize the #' columns of X to unit variance prior to fitting (or equivalently #' standardize XtX and Xty to have the same effect). Note that #' \code{scaled_prior_variance} specifies the prior on the #' coefficients of X \emph{after} standardization (if it is #' performed). If you do not standardize, you may need to think more #' carefully about specifying \code{scaled_prior_variance}. Whatever #' your choice, the coefficients returned by \code{coef} are given for #' \code{X} on the original input scale. Any column of \code{X} that #' has zero variance is not standardized. #' #' @param intercept If \code{intercept = TRUE}, the intercept is #' fitted; it \code{intercept = FALSE}, the intercept is set to #' zero. Setting \code{intercept = FALSE} is generally not #' recommended. #' #' @param estimate_residual_variance If #' \code{estimate_residual_variance = TRUE}, the residual variance is #' estimated, using \code{residual_variance} as an initial value. If #' \code{estimate_residual_variance = FALSE}, the residual variance is #' fixed to the value supplied by \code{residual_variance}. #' #' @param estimate_prior_variance If \code{estimate_prior_variance = #' TRUE}, the prior variance is estimated (this is a separate #' parameter for each of the L effects). If provided, #' \code{scaled_prior_variance} is then used as an initial value for #' the optimization. When \code{estimate_prior_variance = FALSE}, the #' prior variance for each of the L effects is determined by the #' value supplied to \code{scaled_prior_variance}. #' #' @param estimate_prior_method The method used for estimating prior #' variance. When \code{estimate_prior_method = "simple"} is used, the #' likelihood at the specified prior variance is compared to the #' likelihood at a variance of zero, and the setting with the larger #' likelihood is retained. #' #' @param check_null_threshold When the prior variance is estimated, #' compare the estimate with the null, and set the prior variance to #' zero unless the log-likelihood using the estimate is larger by this #' threshold amount. For example, if you set #' \code{check_null_threshold = 0.1}, this will "nudge" the estimate #' towards zero when the difference in log-likelihoods is small. A #' note of caution that setting this to a value greater than zero may #' lead the IBSS fitting procedure to occasionally decrease the ELBO. #' #' @param prior_tol When the prior variance is estimated, compare the #' estimated value to \code{prior_tol} at the end of the computation, #' and exclude a single effect from PIP computation if the estimated #' prior variance is smaller than this tolerance value. #' #' @param residual_variance_upperbound Upper limit on the estimated #' residual variance. It is only relevant when #' \code{estimate_residual_variance = TRUE}. #' #' @param s_init A previous susie fit with which to initialize. #' #' @param coverage A number between 0 and 1 specifying the #' \dQuote{coverage} of the estimated confidence sets. #' #' @param min_abs_corr Minimum absolute correlation allowed in a #' credible set. The default, 0.5, corresponds to a squared #' correlation of 0.25, which is a commonly used threshold for #' genotype data in genetic studies. #' #' @param compute_univariate_zscore If \code{compute_univariate_zscore #' = TRUE}, the univariate regression z-scores are outputted for each #' variable. #' #' @param na.rm Drop any missing values in y from both X and y. #' #' @param max_iter Maximum number of IBSS iterations to perform. #' #' @param tol A small, non-negative number specifying the convergence #' tolerance for the IBSS fitting procedure. The fitting procedure #' will halt when the difference in the variational lower bound, or #' \dQuote{ELBO} (the objective function to be maximized), is #' less than \code{tol}. #' #' @param verbose If \code{verbose = TRUE}, the algorithm's progress, #' and a summary of the optimization settings, are printed to the #' console. #' #' @param track_fit If \code{track_fit = TRUE}, \code{trace} #' is also returned containing detailed information about the #' estimates at each iteration of the IBSS fitting procedure. #' #' @param residual_variance_lowerbound Lower limit on the estimated #' residual variance. It is only relevant when #' \code{estimate_residual_variance = TRUE}. #' #' @param refine If \code{refine = TRUE}, then an additional #' iterative refinement procedure is used, after the IBSS algorithm, #' to check and escape from local optima (see details). #' #' @param n_purity Passed as argument \code{n_purity} to #' \code{\link{susie_get_cs}}. #' #' @return A \code{"susie"} object with some or all of the following #' elements: #' #' \item{alpha}{An L by p matrix of posterior inclusion probabilites.} #' #' \item{mu}{An L by p matrix of posterior means, conditional on #' inclusion.} #' #' \item{mu2}{An L by p matrix of posterior second moments, #' conditional on inclusion.} #' #' \item{Xr}{A vector of length n, equal to \code{X \%*\% colSums(alpha #' * mu)}.} #' #' \item{lbf}{log-Bayes Factor for each single effect.} #' #' \item{lbf_variable}{log-Bayes Factor for each variable and single effect.} #' #' \item{intercept}{Intercept (fixed or estimated).} #' #' \item{sigma2}{Residual variance (fixed or estimated).} #' #' \item{V}{Prior variance of the non-zero elements of b, equal to #' \code{scaled_prior_variance * var(y)}.} #' #' \item{elbo}{The value of the variational lower bound, or #' \dQuote{ELBO} (objective function to be maximized), achieved at #' each iteration of the IBSS fitting procedure.} #' #' \item{fitted}{Vector of length n containing the fitted values of #' the outcome.} #' #' \item{sets}{Credible sets estimated from model fit; see #' \code{\link{susie_get_cs}} for details.} #' #' \item{pip}{A vector of length p giving the (marginal) posterior #' inclusion probabilities for all p covariates.} #' #' \item{z}{A vector of univariate z-scores.} #' #' \item{niter}{Number of IBSS iterations that were performed.} #' #' \item{converged}{\code{TRUE} or \code{FALSE} indicating whether #' the IBSS converged to a solution within the chosen tolerance #' level.} #' #' \code{susie_suff_stat} returns also outputs: #' #' \item{XtXr}{A p-vector of \code{t(X)} times the fitted values, #' \code{X \%*\% colSums(alpha*mu)}.} #' #' @references #' G. Wang, A. Sarkar, P. Carbonetto and M. Stephens (2020). A simple #' new approach to variable selection in regression, with application #' to genetic fine-mapping. \emph{Journal of the Royal Statistical #' Society, Series B} \bold{82}, 1273-1300 \doi{10.1101/501114}. #' #' Y. Zou, P. Carbonetto, G. Wang and M. Stephens (2021). #' Fine-mapping from summary data with the \dQuote{Sum of Single Effects} #' model. \emph{bioRxiv} \doi{10.1101/2021.11.03.467167}. #' #' @seealso \code{\link{susie_get_cs}} and other \code{susie_get_*} #' functions for extracting results; \code{\link{susie_trendfilter}} for #' applying the SuSiE model to non-parametric regression, particularly #' changepoint problems, and \code{\link{susie_rss}} for applying the #' SuSiE model when one only has access to limited summary statistics #' related to \eqn{X} and \eqn{y} (typically in genetic applications). #' #' @examples #' # susie example #' set.seed(1) #' n = 1000 #' p = 1000 #' beta = rep(0,p) #' beta[1:4] = 1 #' X = matrix(rnorm(n*p),nrow = n,ncol = p) #' X = scale(X,center = TRUE,scale = TRUE) #' y = drop(X %*% beta + rnorm(n)) #' res1 = susie(X,y,L = 10) #' susie_get_cs(res1) # extract credible sets from fit #' plot(beta,coef(res1)[-1]) #' abline(a = 0,b = 1,col = "skyblue",lty = "dashed") #' plot(y,predict(res1)) #' abline(a = 0,b = 1,col = "skyblue",lty = "dashed") #' #' # susie_suff_stat example #' input_ss = compute_suff_stat(X,y) #' res2 = with(input_ss, #' susie_suff_stat(XtX = XtX,Xty = Xty,yty = yty,n = n, #' X_colmeans = X_colmeans,y_mean = y_mean,L = 10)) #' plot(coef(res1),coef(res2)) #' abline(a = 0,b = 1,col = "skyblue",lty = "dashed") #' #' @importFrom stats var #' @importFrom utils modifyList #' @importFrom crayon magenta #' #' @export #' susie = function (X,y,L = min(10,ncol(X)), scaled_prior_variance = 0.2, residual_variance = NULL, prior_weights = NULL, null_weight = NULL, standardize = TRUE, intercept = TRUE, estimate_residual_variance = TRUE, estimate_prior_variance = TRUE, estimate_prior_method = c("optim", "EM", "simple"), check_null_threshold = 0, prior_tol = 1e-9, residual_variance_upperbound = Inf, s_init = NULL, coverage = 0.95, min_abs_corr = 0.5, compute_univariate_zscore = FALSE, na.rm = FALSE, max_iter = 100, tol = 1e-3, verbose = FALSE, track_fit = FALSE, residual_variance_lowerbound = var(drop(y))/1e4, refine = FALSE, n_purity = 100) { # Process input estimate_prior_method. estimate_prior_method = match.arg(estimate_prior_method) # Check input X. if (!(is.double(X) & is.matrix(X)) & !inherits(X,"CsparseMatrix") & is.null(attr(X,"matrix.type"))) stop("Input X must be a double-precision matrix, or a sparse matrix, or ", "a trend filtering matrix") if (is.numeric(null_weight) && null_weight == 0) null_weight = NULL if (!is.null(null_weight) && is.null(attr(X,"matrix.type"))) { if (!is.numeric(null_weight)) stop("Null weight must be numeric") if (null_weight < 0 || null_weight >= 1) stop("Null weight must be between 0 and 1") if (missing(prior_weights)) prior_weights = c(rep(1/ncol(X) * (1 - null_weight),ncol(X)),null_weight) else prior_weights = c(prior_weights * (1-null_weight),null_weight) X = cbind(X,0) } if (anyNA(X)) stop("Input X must not contain missing values") if (anyNA(y)) { if (na.rm) { samples_kept = which(!is.na(y)) y = y[samples_kept] X = X[samples_kept,] } else stop("Input y must not contain missing values") } p = ncol(X) if (p > 1000 & !requireNamespace("Rfast",quietly = TRUE)) message(magenta("For an X with many columns, please consider installing ", "the Rfast package for more efficient credible set (CS) ", "calculations.")) # Check input y. n = nrow(X) mean_y = mean(y) # Center and scale input. if (intercept) y = y - mean_y # Set three attributes for matrix X: attr(X,'scaled:center') is a # p-vector of column means of X if center=TRUE, a p vector of zeros # otherwise; 'attr(X,'scaled:scale') is a p-vector of column # standard deviations of X if scale=TRUE, a p vector of ones # otherwise; 'attr(X,'d') is a p-vector of column sums of # X.standardized^2,' where X.standardized is the matrix X centered # by attr(X,'scaled:center') and scaled by attr(X,'scaled:scale'). out = compute_colstats(X,center = intercept,scale = standardize) attr(X,"scaled:center") = out$cm attr(X,"scaled:scale") = out$csd attr(X,"d") = out$d # Initialize susie fit. s = init_setup(n,p,L,scaled_prior_variance,residual_variance,prior_weights, null_weight,as.numeric(var(y)),standardize) if (!missing(s_init) && !is.null(s_init)) { if (!inherits(s_init,"susie")) stop("s_init should be a susie object") if (max(s_init$alpha) > 1 || min(s_init$alpha) < 0) stop("s_init$alpha has invalid values outside range [0,1]; please ", "check your input") # First, remove effects with s_init$V = 0 s_init = susie_prune_single_effects(s_init) num_effects = nrow(s_init$alpha) if(missing(L)){ L = num_effects }else if(min(p,L) < num_effects){ warning(paste("Specified number of effects L =",min(p,L), "is smaller than the number of effects",num_effects, "in input SuSiE model. The SuSiE model will have", num_effects,"effects.")) L = num_effects } # expand s_init if L > num_effects. s_init = susie_prune_single_effects(s_init, min(p, L), s$V) s = modifyList(s,s_init) s = init_finalize(s,X = X) } else { s = init_finalize(s) } # Initialize elbo to NA. elbo = rep(as.numeric(NA),max_iter + 1) elbo[1] = -Inf; tracking = list() for (i in 1:max_iter) { if (track_fit) tracking[[i]] = susie_slim(s) s = update_each_effect(X,y,s,estimate_prior_variance,estimate_prior_method, check_null_threshold) if (verbose) print(paste0("objective:",get_objective(X,y,s))) # Compute objective before updating residual variance because part # of the objective s$kl has already been computed under the # residual variance before the update. elbo[i+1] = get_objective(X,y,s) if ((elbo[i+1] - elbo[i]) < tol) { s$converged = TRUE break } if (estimate_residual_variance) { s$sigma2 = pmax(residual_variance_lowerbound, estimate_residual_variance(X,y,s)) if (s$sigma2 > residual_variance_upperbound) s$sigma2 = residual_variance_upperbound if (verbose) print(paste0("objective:",get_objective(X,y,s))) } } # Remove first (infinite) entry, and trailing NAs. elbo = elbo[2:(i+1)] s$elbo = elbo s$niter = i if (is.null(s$converged)) { warning(paste("IBSS algorithm did not converge in",max_iter,"iterations!")) s$converged = FALSE } if (intercept) { # Estimate unshrunk intercept. s$intercept = mean_y - sum(attr(X,"scaled:center") * (colSums(s$alpha * s$mu)/attr(X,"scaled:scale"))) s$fitted = s$Xr + mean_y } else { s$intercept = 0 s$fitted = s$Xr } s$fitted = drop(s$fitted) names(s$fitted) = `if`(is.null(names(y)),rownames(X),names(y)) if (track_fit) s$trace = tracking # SuSiE CS and PIP. if (!is.null(coverage) && !is.null(min_abs_corr)) { s$sets = susie_get_cs(s,coverage = coverage,X = X, min_abs_corr = min_abs_corr, n_purity = n_purity) s$pip = susie_get_pip(s,prune_by_cs = FALSE,prior_tol = prior_tol) } if (!is.null(colnames(X))) { variable_names = colnames(X) if (!is.null(null_weight)) { variable_names[length(variable_names)] = "null" names(s$pip) = variable_names[-p] } else names(s$pip) = variable_names colnames(s$alpha) = variable_names colnames(s$mu) = variable_names colnames(s$mu2) = variable_names colnames(s$lbf_variable) = variable_names } # report z-scores from univariate regression. if (compute_univariate_zscore) { if (!is.null(null_weight) && null_weight != 0) X = X[,1:(ncol(X) - 1)] s$z = calc_z(X,y,center = intercept,scale = standardize) } # For prediction. s$X_column_scale_factors = attr(X,"scaled:scale") if (refine) { if (!missing(s_init) && !is.null(s_init)) warning("The given s_init is not used in refinement") if (!is.null(null_weight) && null_weight != 0) { ## if null_weight is specified, we compute the original prior_weight pw_s = s$pi[-s$null_index]/(1-null_weight) if (!compute_univariate_zscore) ## if null_weight is specified, and the extra 0 column is not ## removed from compute_univariate_zscore, we remove it here X = X[,1:(ncol(X) - 1)] } else pw_s = s$pi conti = TRUE while (conti & length(s$sets$cs)>0) { m = list() for(cs in 1:length(s$sets$cs)){ pw_cs = pw_s pw_cs[s$sets$cs[[cs]]] = 0 if(all(pw_cs == 0)){ break } s2 = susie(X,y,L = L,scaled_prior_variance = scaled_prior_variance, residual_variance = residual_variance, prior_weights = pw_cs, s_init = NULL,null_weight = null_weight, standardize = standardize,intercept = intercept, estimate_residual_variance = estimate_residual_variance, estimate_prior_variance = estimate_prior_variance, estimate_prior_method = estimate_prior_method, check_null_threshold = check_null_threshold, prior_tol = prior_tol,coverage = coverage, residual_variance_upperbound = residual_variance_upperbound, min_abs_corr = min_abs_corr,compute_univariate_zscore = FALSE, na.rm = na.rm,max_iter = max_iter,tol = tol,verbose = FALSE, track_fit = FALSE,residual_variance_lowerbound = var(drop(y))/1e4, refine = FALSE) sinit2 = s2[c("alpha","mu","mu2")] class(sinit2) = "susie" s3 = susie(X,y,L = L,scaled_prior_variance = scaled_prior_variance, residual_variance = residual_variance,prior_weights = pw_s, s_init = sinit2,null_weight = null_weight, standardize = standardize,intercept = intercept, estimate_residual_variance = estimate_residual_variance, estimate_prior_variance = estimate_prior_variance, estimate_prior_method = estimate_prior_method, check_null_threshold = check_null_threshold, prior_tol = prior_tol,coverage = coverage, residual_variance_upperbound = residual_variance_upperbound, min_abs_corr = min_abs_corr,compute_univariate_zscore = FALSE, na.rm = na.rm,max_iter = max_iter,tol = tol,verbose = FALSE, track_fit = FALSE,residual_variance_lowerbound = var(drop(y))/1e4, refine = FALSE) m = c(m,list(s3)) } if(length(m) == 0){ conti = FALSE }else{ elbo = sapply(m,function(x) susie_get_objective(x)) if ((max(elbo) - susie_get_objective(s)) <= 0) conti = FALSE else s = m[[which.max(elbo)]] } } } return(s) } susieR/R/univariate_regression.R0000644000176200001440000000711414051463366016472 0ustar liggesusers#' @title Perform Univariate Linear Regression Separately for Columns of X #' #' @description This function performs the univariate linear #' regression y ~ x separately for each column x of X. Each regression #' is implemented using \code{.lm.fit()}. The estimated effect size #' and stardard error for each variable are outputted. #' #' @param X n by p matrix of regressors. #' #' @param y n-vector of response variables. #' #' @param Z Optional n by k matrix of covariates to be included in all #' regresions. If Z is not \code{NULL}, the linear effects of #' covariates are removed from y first, and the resulting residuals #' are used in place of y. #' #' @param center If \code{center = TRUE}, center X, y and Z. #' #' @param scale If \code{scale = TRUE}, scale X, y and Z. #' #' @param return_residuals Whether or not to output the residuals if Z #' is not \code{NULL}. #' #' @return A list with two vectors containing the least-squares #' estimates of the coefficients (\code{betahat}) and their standard #' errors (\code{sebetahat}). Optionally, and only when a matrix of #' covariates \code{Z} is provided, a third vector \code{residuals} #' containing the residuals is returned. #' #' @examples #' set.seed(1) #' n = 1000 #' p = 1000 #' beta = rep(0,p) #' beta[1:4] = 1 #' X = matrix(rnorm(n*p),nrow = n,ncol = p) #' X = scale(X,center = TRUE,scale = TRUE) #' y = drop(X %*% beta + rnorm(n)) #' res = univariate_regression(X,y) #' plot(res$betahat/res$sebetahat) #' #' @importFrom stats lm #' @importFrom stats .lm.fit #' @importFrom stats coef #' @importFrom stats summary.lm #' #' @export #' univariate_regression = function (X, y, Z = NULL, center = TRUE, scale = FALSE, return_residuals = FALSE) { y_na = which(is.na(y)) if (length(y_na)) { X = X[-y_na,] y = y[-y_na] } if (center) { y = y - mean(y) X = scale(X,center = TRUE,scale = scale) } else X = scale(X,center = FALSE,scale = scale) X[is.nan(X)] = 0 if (!is.null(Z)) { if (center) Z = scale(Z,center = TRUE,scale = scale) y = .lm.fit(Z,y)$residuals } output = try(do.call(rbind, lapply(1:ncol(X), function (i) { g = .lm.fit(cbind(1,X[,i]),y) return(c(coef(g)[2],calc_stderr(cbind(1,X[,i]), g$residuals)[2])) })), silent = TRUE) # Exception occurs, fall back to a safer but slower calculation. if (inherits(output,"try-error")) { output = matrix(0,ncol(X),2) for (i in 1:ncol(X)) { fit = summary(lm(y ~ X[,i]))$coef if (nrow(fit) == 2) output[i,] = as.vector(summary(lm(y ~ X[,i]))$coef[2,1:2]) else output[i,] = c(0,0) } } if (return_residuals && !is.null(Z)) return(list(betahat = output[,1],sebetahat = output[,2],residuals = y)) else return(list(betahat = output[,1],sebetahat = output[,2])) } # Computes the z-scores (t-statistics) for association between Y and # each column of X. calc_z = function (X, Y, center = FALSE, scale = FALSE) { univariate_z = function(X,Y,center,scale) { out = univariate_regression(X,Y,center = center,scale = scale) return(out$betahat/out$sebetahat) } if (is.null(dim(Y))) return(univariate_z(X,Y,center,scale)) else return(do.call(cbind,lapply(1:ncol(Y), function(i) univariate_z(X,Y[,i], center = center, scale = scale)))) } susieR/R/data.R0000644000176200001440000001325314142574152012772 0ustar liggesusers#' @name N2finemapping #' #' @title Simulated Fine-mapping Data with Two Effect Variables #' #' @docType data #' #' @description This data set contains a genotype matrix for 574 #' individuals and 1,002 variables. The variables are genotypes after #' centering and scaling, and therefore retain the correlation #' structure of the original genotype data. Two of the variables have #' non-zero effects on the multivariate response. The response data #' are generated under a multivariate linear regression model. See #' Wang \emph{et al} (2020) for details. #' #' @format \code{N2finemapping} is a list with the following elements: #' #' \describe{ #' #' \item{X}{Centered and scaled genotype data.} #' #' \item{chrom}{Chromomsome of the original data, in hg38 coordinates.} #' #' \item{pos}{Chromomosomal position of the original data, in hg38 #' coordinates. The information can be used to compare impact of using #' other genotype references of the same variables in \code{susie_rss} #' application.} #' #' \item{true_coef}{Simulated effect sizes.} #' #' \item{residual_variance}{Simulated residual covariance matrix.} #' #' \item{Y}{Simulated multivariate response.} #' #' \item{allele_freq}{Allele frequencies based on the original #' genotype data.} #' #' \item{V}{Suggested prior covariance matrix for effect sizes of #' the two non-zero effect variables.} #' } #' #' @keywords data #' #' @references #' G. Wang, A. Sarkar, P. Carbonetto and M. Stephens (2020). A simple #' new approach to variable selection in regression, with application #' to genetic fine-mapping. \emph{Journal of the Royal Statistical #' Society, Series B} \doi{10.1101/501114}. #' #' @examples #' data(N2finemapping) NULL #' @name N3finemapping #' #' @title Simulated Fine-mapping Data with Three Effect Variables. #' #' @docType data #' #' @description The data-set contains a matrix of 574 #' individuals and 1,001 variables. These variables are real-world #' genotypes centered and scaled, and therefore retains the #' correlation structure of variables in the original genotype data. 3 #' out of the variables have non-zero effects. The response data is #' generated under a multivariate linear regression model. See Wang #' \emph{et al} (2020) for more details. #' #' @format \code{N3finemapping} is a list with the following elements: #' #' \describe{ #' #' \item{X}{N by P variable matrix of centered and scaled genotype #' data.} #' #' \item{chrom}{Chromomsome of the original data, in hg38 coordinate.} #' #' \item{pos}{Chromomosomal positoin of the original data, in hg38 #' coordinate. The information can be used to compare impact of using #' other genotype references of the same variables in susie_rss #' application.} #' #' \item{true_coef}{The simulated effect sizes.} #' #' \item{residual_variance}{The simulated residual covariance matrix.} #' #' \item{Y}{The simulated response variables.} #' #' \item{allele_freq}{Allele frequency of the original genotype data.} #' #' \item{V}{Prior covariance matrix for effect size of the three #' non-zero effect variables.} } #' #' @keywords data #' #' @references #' G. Wang, A. Sarkar, P. Carbonetto and M. Stephens (2020). A simple #' new approach to variable selection in regression, with application #' to genetic fine-mapping. \emph{Journal of the Royal Statistical #' Society, Series B} \doi{10.1101/501114}. #' #' @examples #' data(N3finemapping) NULL #' @name FinemappingConvergence #' #' @title Simulated Fine-mapping Data with Convergence Problem. #' #' @description Data simulated using real genotypes from 50,000 #' individuals and 200 SNPs. Two of the SNPs have non-zero effects #' on the multivariate response. The response data are generated under #' a linear regression model. The simulated response and the columns #' of the genotype matrix are centered. #' #' @format \code{FinemappingConvergence} is a list with the following #' elements: #' #' \describe{ #' #' \item{XtX}{Summary statistics computed using the centered and #' scaled genotype matrix.} #' #' \item{Xty}{Summary statistics computed using the centered and #' scaled genotype data, and the centered simulated response.} #' #' \item{yty}{yty is computed using the centered simulated response.} #' #' \item{n}{The sample size (50,000).} #' #' \item{true_coef}{The coefficients used to simulate the responses.} #' #' \item{z}{z-scores from a simple (single-SNP) linear regression.}} #' #' @docType data #' #' @keywords data #' #' @seealso A similar data set with more SNPs is used in the #' \dQuote{Refine SuSiE model} vignette. #' #' @examples #' data(FinemappingConvergence) NULL #' @name SummaryConsistency #' #' @title Simulated Fine-mapping Data with LD matrix From Reference Panel. #' #' @description Data simulated using real genotypes from 10,000 #' individuals and 200 SNPs. One SNP have non-zero effect #' on the multivariate response. The response data are generated under #' a linear regression model. There is also one SNP with flipped allele #' between summary statistics and the reference panel. #' #' @format \code{SummaryConsistency} is a list with the following #' elements: #' #' \describe{ #' #' \item{z}{z-scores computed by fitting univariate simple regression #' variable-by-variable.} #' #' \item{ldref}{LD matrix estimated from the reference panel.} #' #' \item{flip_id}{The index of the SNP with the flipped allele.} #' #' \item{signal_id}{The index of the SNP with the non-zero effect.}} #' #' @seealso A similar data set with more samples is used in the #' \dQuote{Diagnostic for fine-mapping with summary statistics} #' vignette. #' #' @docType data #' #' @keywords data #' #' @examples #' data(SummaryConsistency) NULL susieR/R/estimate_residual_variance.R0000644000176200001440000000104514051462763017433 0ustar liggesusers# @title Estimate residual variance # @param X an n by p matrix of covariantes # @param y an n vector of data # @param s a susie fit estimate_residual_variance = function (X, y, s) { n = nrow(X) return((1/n)*get_ER2(X,y,s)) } # @title Estimate residual variance for summary statistics # @param XtX a p by p matrix # @param Xty a p vector # @param s a susie fit # @param yty a scaler, y'y, where y is centered to have mean 0 # @param n sample size estimate_residual_variance_ss = function (XtX, Xty, s, yty, n) (1/n)*get_ER2_ss(XtX,Xty,s,yty) susieR/R/elbo_rss.R0000644000176200001440000000376314055430065013673 0ustar liggesusers# @title Get objective function from data and susie fit object. # @param R p by p corelation matrix # @param z length p vector # @param s a susie fit object get_objective_rss = function (R, z, s) Eloglik_rss(s$sigma2, R,z,s) - sum(s$KL) # @title expected loglikelihood for a susie fit Eloglik_rss = function (sigma2, R, z, s) { d = sigma2 * attr(R,"eigen")$values + attr(R,"lambda") if(attr(R,"lambda") == 0) result = -(sum(d != 0)/2) * log(2*pi*sigma2) - 0.5*get_ER2_rss(sigma2, R,z,s) else result = -(length(z)/2)*log(2*pi) - 0.5*sum(log(d)) - 0.5*get_ER2_rss(sigma2, R,z,s) return(result) } # @title expected squared residuals # @importFrom Matrix diag get_ER2_rss = function (sigma2, R, z, s) { d = sigma2 * attr(R,"eigen")$values + attr(R,"lambda") Dinv = 1/d Dinv[is.infinite(Dinv)] = 0 SinvR = attr(R,"eigen")$vectors %*% ((Dinv*attr(R,"eigen")$values) * t(attr(R,"eigen")$vectors)) Utz = crossprod(attr(R,"eigen")$vectors,z) zSinvz = sum(Utz * (Dinv * Utz)) Z = s$alpha * s$mu if(attr(R,"lambda") == 0) RSinvR = R/sigma2 else RSinvR = R %*% SinvR RZ2 = sum((Z%*%RSinvR) * Z) zbar = colSums(Z) postb2 = s$alpha * s$mu2 # Posterior second moment. return(zSinvz - 2*sum((SinvR %*% z) * zbar) + sum(zbar * (RSinvR %*% zbar)) - RZ2 + sum(diag(RSinvR) * t(postb2))) } # @title posterior expected loglikelihood for a single effect regression # @param R a p by p symmetric and positive semidefinite correlation matrix. # @param Sigma residual_var * R + lambda I # @param r residuals # @param Eb the posterior mean of b (p vector) (alpha * mu) # @param Eb2 the posterior second moment of b (p vector) (alpha * mu2) SER_posterior_e_loglik_rss = function (R, Sigma, r, Ez, Ez2) { eigenS = attr(Sigma,"eigenS") Dinv = 1/(eigenS$values) Dinv[is.infinite(Dinv)] = 0 rR = R %*% r SinvEz = eigenS$vectors %*% (Dinv * crossprod(eigenS$vectors, Ez)) return(-0.5*(-2*sum(rR*SinvEz) + sum(attr(Sigma,"RjSinvRj") * as.vector(Ez2)))) } susieR/R/single_effect_regression.R0000644000176200001440000002105414102275444017112 0ustar liggesusers#' @rdname single_effect_regression #' #' @title Bayesian single-effect linear regression #' #' @description These methods fit the regression model \eqn{y = Xb + #' e}, where elements of e are \emph{i.i.d.} \eqn{N(0,s^2)}, and b is #' a p-vector of effects to be estimated. The assumption is that b has #' exactly one non-zero element, with all elements equally likely to #' be non-zero. The prior on the coefficient of the non-zero element #' is \eqn{N(0,V)}. #' #' @details \code{single_effect_regression_ss} performs single-effect #' linear regression with summary data, in which only the statistcs #' \eqn{X^Ty} and diagonal elements of \eqn{X^TX} are provided to the #' method. #' #' \code{single_effect_regression_rss} performs single-effect linear #' regression with z scores. That is, this function fits the #' regression model \eqn{z = R*b + e}, where e is \eqn{N(0,Sigma)}, #' \eqn{Sigma = residual_var*R + lambda*I}, and the b is a p-vector of #' effects to be estimated. The assumption is that b has exactly one #' non-zero element, with all elements equally likely to be non-zero. #' The prior on the non-zero element is \eqn{N(0,V)}. The required #' summary data are the p-vector \code{z} and the p by p matrix #' \code{Sigma}. The summary statistics should come from the same #' individuals. #' #' @param y An n-vector. #' #' @param X An n by p matrix of covariates. #' #' @param V A scalar giving the (initial) prior variance #' #' @param residual_variance The residual variance. #' #' @param prior_weights A p-vector of prior weights. #' #' @param optimize_V The optimization method to use for fitting the #' prior variance. #' #' @param check_null_threshold Scalar specifying threshold on the #' log-scale to compare likelihood between current estimate and zero #' the null. #' #' @return A list with the following elements: #' #' \item{alpha}{Vector of posterior inclusion probabilities; #' \code{alpha[i]} is posterior probability that the ith coefficient #' is non-zero.} #' #' \item{mu}{Vector of posterior means (conditional on inclusion).} #' #' \item{mu2}{Vector of posterior second moments (conditional on #' inclusion).} #' #' \item{lbf}{Vector of log-Bayes factors for each variable.} #' #' \item{lbf_model}{Log-Bayes factor for the single effect regression.} #' #' \code{single_effect_regression} and \code{single_effect_regression_ss} #' additionally output: #' #' \item{V}{Prior variance (after optimization if \code{optimize_V != #' "none"}).} #' #' \item{loglik}{The log-likelihood, \eqn{\log p(y | X, V)}.} #' #' @importFrom stats dnorm #' @importFrom stats uniroot #' @importFrom stats optim #' @importFrom Matrix colSums #' #' @keywords internal #' single_effect_regression = function (y, X, V, residual_variance = 1, prior_weights = NULL, optimize_V = c("none", "optim", "uniroot", "EM", "simple"), check_null_threshold = 0) { optimize_V = match.arg(optimize_V) Xty = compute_Xty(X,y) betahat = (1/attr(X,"d")) * Xty shat2 = residual_variance/attr(X,"d") if (is.null(prior_weights)) prior_weights = rep(1/ncol(X),ncol(X)) if (optimize_V != "EM" && optimize_V != "none") V = optimize_prior_variance(optimize_V,betahat,shat2,prior_weights, alpha = NULL,post_mean2 = NULL,V_init = V, check_null_threshold = check_null_threshold) # log(bf) for each SNP lbf = dnorm(betahat,0,sqrt(V + shat2),log = TRUE) - dnorm(betahat,0,sqrt(shat2),log = TRUE) # Deal with special case of infinite shat2 (e.g., happens if X does # not vary). lbf[is.infinite(shat2)] = 0 maxlbf = max(lbf) # w is proportional to BF, but subtract max for numerical stability. w = exp(lbf - maxlbf) # Posterior prob for each SNP. w_weighted = w * prior_weights weighted_sum_w = sum(w_weighted) alpha = w_weighted / weighted_sum_w post_var = (1/V + attr(X,"d")/residual_variance)^(-1) # Posterior variance. post_mean = (1/residual_variance) * post_var * Xty post_mean2 = post_var + post_mean^2 # Second moment. # BF for single effect model. lbf_model = maxlbf + log(weighted_sum_w) loglik = lbf_model + sum(dnorm(y,0,sqrt(residual_variance),log = TRUE)) if(optimize_V == "EM") V = optimize_prior_variance(optimize_V,betahat,shat2,prior_weights, alpha,post_mean2, check_null_threshold = check_null_threshold) return(list(alpha = alpha,mu = post_mean,mu2 = post_mean2,lbf = lbf, lbf_model = lbf_model,V = V,loglik = loglik)) } # Estimate prior variance. est_V_uniroot = function (betahat, shat2, prior_weights) { V.u = uniroot(negloglik.grad.logscale,c(-10,10),extendInt = "upX", betahat = betahat,shat2 = shat2,prior_weights = prior_weights) return(exp(V.u$root)) } optimize_prior_variance = function (optimize_V, betahat, shat2, prior_weights, alpha = NULL, post_mean2 = NULL, V_init = NULL, check_null_threshold = 0) { V = V_init if (optimize_V != "simple") { if(optimize_V == "optim") { lV = optim(par = log(max(c(betahat^2-shat2,1),na.rm = TRUE)), fn = neg.loglik.logscale,betahat = betahat,shat2 = shat2, prior_weights = prior_weights,method = "Brent",lower = -30, upper = 15)$par ## if the estimated one is worse than current one, don't change it. if(neg.loglik.logscale(lV, betahat = betahat,shat2 = shat2,prior_weights = prior_weights) > neg.loglik.logscale(log(V), betahat = betahat, shat2 = shat2,prior_weights = prior_weights)){ lV = log(V) } V = exp(lV) } else if (optimize_V == "uniroot") V = est_V_uniroot(betahat,shat2,prior_weights) else if (optimize_V == "EM") V = sum(alpha * post_mean2) else stop("Invalid option for optimize_V method") } # Set V exactly 0 if that beats the numerical value by # check_null_threshold in loglik. check_null_threshold = 0.1 is # exp(0.1) = 1.1 on likelihood scale; it means that for parsimony # reasons we set estiate of V to zero, if its numerical estimate is # only "negligibly" different from zero. We use a likelihood ratio # of exp(check_null_threshold) to define "negligible" in this # context. This is fairly modest condition compared to, say, a # formal LRT with p-value 0.05. But the idea is to be lenient to # non-zeros estimates unless they are indeed small enough to be # neglible. See more intuition at # https://stephens999.github.io/fiveMinuteStats/LR_and_BF.html if (loglik(0,betahat,shat2,prior_weights) + check_null_threshold >= loglik(V,betahat,shat2,prior_weights)) V = 0 return(V) } # In these functions, s2 represents residual_variance, and shat2 is an # estimate of it. # The log likelihood function for SER model (based on summary data # betahat, shat2) as a function of prior variance V. # #' @importFrom Matrix colSums #' @importFrom stats dnorm loglik = function (V, betahat, shat2, prior_weights) { #log(bf) for each SNP lbf = dnorm(betahat,0,sqrt(V+shat2),log = TRUE) - dnorm(betahat,0,sqrt(shat2),log = TRUE) # Deal with special case of infinite shat2 (e.g., happens if X does # not vary). lbf[is.infinite(shat2)] = 0 maxlbf = max(lbf) w = exp(lbf - maxlbf) # w = BF/BFmax w_weighted = w * prior_weights weighted_sum_w = sum(w_weighted) return(log(weighted_sum_w) + maxlbf) } neg.loglik.logscale = function(lV,betahat,shat2,prior_weights) -loglik(exp(lV),betahat,shat2,prior_weights) #' @importFrom Matrix colSums #' @importFrom stats dnorm loglik.grad = function(V, betahat, shat2, prior_weights) { # log(bf) for each SNP. lbf = dnorm(betahat,0,sqrt(V + shat2),log = TRUE) - dnorm(betahat,0,sqrt(shat2),log = TRUE) # Deal with special case of infinite shat2 (e.g., happens if X does # not vary). lbf[is.infinite(shat2)] = 0 maxlbf = max(lbf) w = exp(lbf - maxlbf) # w = BF/BFmax w_weighted = w * prior_weights weighted_sum_w = sum(w_weighted) alpha = w_weighted / weighted_sum_w return(sum(alpha * lbf.grad(V,shat2,betahat^2/shat2))) } # Define loglikelihood and gradient as function of lV:=log(V) # to improve numerical optimization negloglik.grad.logscale = function (lV, betahat, shat2, prior_weights) -exp(lV) * loglik.grad(exp(lV),betahat,shat2,prior_weights) # Vector of gradients of logBF_j for each j, with respect to prior # variance V. lbf.grad = function (V, shat2, T2) { l = 0.5*(1/(V + shat2)) * ((shat2/(V + shat2))*T2 - 1) l[is.nan(l)] = 0 return(l) } lbf = function (V, shat2, T2) { l = 0.5*log(shat2/(V + shat2)) + 0.5*T2*(V/(V + shat2)) l[is.nan(l)] = 0 return(l) } susieR/R/summary.susie.R0000644000176200001440000000401614055430120014667 0ustar liggesusers#' @title Summarize Susie Fit. #' #' @description \code{summary} method for the \dQuote{susie} class. #' #' @param object A susie fit. #' #' @param \dots Additional arguments passed to the generic \code{summary} #' or \code{print.summary} method. #' #' @return \code{summary.susie} returns a list containing a data frame #' of variables and a data frame of credible sets. #' #' @method summary susie #' #' @export summary.susie #' #' @export #' summary.susie = function (object, ...) { if (is.null(object$sets)) stop("Cannot summarize SuSiE object because credible set information ", "is not available") variables = data.frame(cbind(1:length(object$pip),object$pip,-1)) colnames(variables) = c("variable","variable_prob","cs") rownames(variables) = NULL if (object$null_index > 0) variables = variables[-object$null_index,] if (!is.null(object$sets$cs)) { cs = data.frame(matrix(NA,length(object$sets$cs),5)) colnames(cs) = c("cs","cs_log10bf","cs_avg_r2","cs_min_r2","variable") for (i in 1:length(object$sets$cs)) { variables$cs[variables$variable %in% object$sets$cs[[i]]] = object$sets$cs_index[[i]] cs$cs[i] = object$sets$cs_index[[i]] cs$cs_log10bf[i] = log10(exp(object$lbf[cs$cs[i]])) cs$cs_avg_r2[i] = object$sets$purity$mean.abs.corr[i]^2 cs$cs_min_r2[i] = object$sets$purity$min.abs.corr[i]^2 cs$variable[i] = paste(object$sets$cs[[i]],collapse=",") } variables = variables[order(variables$variable_prob,decreasing = TRUE),] } else cs = NULL out = list(vars = variables,cs = cs) class(out) = c("summary.susie","list") return(out) } #' @rdname summary.susie #' #' @param x A susie summary. #' #' @method print summary.susie #' #' @export print.summary.susie #' #' @export #' print.summary.susie = function (x, ...) { cat("\nVariables in credible sets:\n\n") print.data.frame(x$vars[which(x$vars$cs > 0),],row.names = FALSE) cat("\nCredible sets summary:\n\n") print.data.frame(x$cs,row.names = FALSE) } susieR/R/trend_filtering_multiplication.R0000644000176200001440000000521413755042336020356 0ustar liggesusers# @title Compute unscaled X %*% b using the special structure of trend # filtering # @param order is the order of trend filtering # @param b an n=p vector # @return an n vector compute_tf_Xb = function(order,b) { for (i in 1:(order+1)) b = rev(-1*cumsum(rev(b))) return(b) } # @title Compute unscaled t(X) %*% y using the special structure of # trend filtering # @param order is the order of trend filtering # @param y an n vector # @return an n vector compute_tf_Xty = function(order, y) { for (i in 1:(order+1)) y = -1*cumsum(y) return(y) } # @title Compute colSums(X*X) for X under four scenarios # @param order is the order of trend filtering # @param n the length of y # @param cm column means of X # @param csd column standard deviations of X # @param intercept a boolean denotes whether mean centering X # @param standardize a boolean denotes whether scaling X by standard deviation # @return an n vector compute_tf_d = function (order, n, cm, csd, standardize = FALSE, intercept = FALSE) { if (intercept) { # When standardize = TRUE, intercept = TRUE: by special # observation d = [n-1, n-1, ...] d = rep(n-1,n) if (order == 0) d[n] = 0 # When standardize = FALSE, intercept = TRUE: # d = [n-1, n-1, ...] * (csd^2) if (!standardize) d = d*csd^2 return(d) } else { # When standardize = FALSE, intercept = FALSE: d = colSums(X^2) base = rep(-1,n) if (order == 0) d = cumsum(base^2) else { for (i in 1:order) base = cumsum(base) d = cumsum(base^2) } # When standardize = TRUE, intercept = TRUE: # d = colSums(X^2) / (csd^2) if (standardize) d = d/csd^2 return(d) } } # @title Compute column mean of the trend filtering matrix X. # @param order is the order of trend filtering # @param n the length of y # @return an n vector compute_tf_cm = function (order, n) { base = rep(1,n) for (i in 1:(order+1)) base = -cumsum(base) return(base/n) } # @title Compute column standard deviation of the trend filtering # matrix X # @param order is the order of trend filtering # @param n is the length of y # @return an n vector compute_tf_csd = function (order, n) { cm = compute_tf_cm(order,n) csd = sqrt((compute_tf_d(order,n)/n - cm^2)*n/(n-1)) csd[which(csd == 0)] = 1 return(csd) } # @title A fast way to compute colSums(X*X), where X is a # mean-centered and standardized trend filtering matrix. # @param order order of trend filtering # @param n the length of y # @return an n vector compute_tf_std_d = function (order, n) { res = rep(n-1,n) if (order == 0) res[n] = 0 return(res) } susieR/R/susie_rss_lambda.R0000644000176200001440000002077714141050376015405 0ustar liggesusers# Performs sum of single-effect (SuSiE) linear regression with z # scores (with lambda). The summary data required are the p by p # correlation matrix R, the p vector z. The summary stats should come # from the same individuals. This function fits the regression model z # = sum_l Rb_l + e, where e is N(0,residual_variance * R + lambda I) # and the sum_l b_l is a p vector of effects to be estimated. The # assumption is that each b_l has exactly one non-zero element, with # all elements equally likely to be non-zero. The prior on the # non-zero element is N(0,var = prior_variance). # #' @importFrom stats optimize susie_rss_lambda = function(z, R, maf = NULL, maf_thresh = 0, L = 10, lambda = 0, prior_variance = 50, residual_variance = NULL, r_tol = 1e-08, prior_weights = NULL, null_weight = NULL, estimate_residual_variance = TRUE, estimate_prior_variance = TRUE, estimate_prior_method = c("optim", "EM", "simple"), check_null_threshold = 0, prior_tol = 1e-9, max_iter = 100, s_init = NULL, intercept_value = 0, coverage = 0.95, min_abs_corr = 0.5, tol = 1e-3, verbose = FALSE, track_fit = FALSE, check_R = TRUE, check_z = FALSE) { # Check input R. if (nrow(R) != length(z)) stop(paste0("The dimension of correlation matrix (",nrow(R)," by ", ncol(R),") does not agree with expected (",length(z)," by ", length(z),")")) if (!is_symmetric_matrix(R)) stop("R is not a symmetric matrix") if (!(is.double(R) & is.matrix(R)) & !inherits(R,"CsparseMatrix")) stop("Input R must be a double-precision matrix or a sparse matrix") # MAF filter. if (!is.null(maf)) { if (length(maf) != length(z)) stop(paste0("The length of maf does not agree with expected ",length(z))) id = which(maf > maf_thresh) R = R[id,id] z = z[id] } if (any(is.infinite(z))) stop("z contains infinite values") # Check for NAs in R. if (anyNA(R)) stop("R matrix contains missing values") # Replace NAs in z with zero. if (anyNA(z)) { warning("NA values in z-scores are replaced with 0") z[is.na(z)] = 0 } if (is.numeric(null_weight) && null_weight == 0) null_weight = NULL if (!is.null(null_weight)) { if (!is.numeric(null_weight)) stop("Null weight must be numeric") if (null_weight < 0 || null_weight >= 1) stop("Null weight must be between 0 and 1") if (missing(prior_weights)) prior_weights = c(rep(1/ncol(R)*(1-null_weight),ncol(R)),null_weight) else prior_weights = c(prior_weights * (1-null_weight),null_weight) R = cbind(rbind(R,0),0) z = c(z,0) } # Eigen decomposition for R, filter on eigenvalues. p = ncol(R) attr(R,"eigen") = eigen(R,symmetric = TRUE) if (check_R && any(attr(R,"eigen")$values < -r_tol)) stop(paste0("The correlation matrix (",nrow(R)," by ",ncol(R), "is not a positive semidefinite matrix. ", "The smallest eigenvalue is ",min(attr(R,"eigen")$values), ". You can bypass this by \"check_R = FALSE\" which instead ", "sets negative eigenvalues to 0 to allow for continued ", "computations.")) # Check whether z in space spanned by the non-zero eigenvectors of R. if (check_z) { proj = check_projection(R,z) if (!proj$status) warning("Input z does not lie in the space of non-zero eigenvectors ", "of R.") else message("Input z is in space spanned by the non-zero eigenvectors of ", "R.") } R = set_R_attributes(R,r_tol) if (lambda == "estimate"){ colspace = which(attr(R,"eigen")$values > 0) if (length(colspace) == length(z)) lambda = 0 else { znull = crossprod(attr(R,"eigen")$vectors[,-colspace], z) # U2^T z lambda = sum(znull^2)/length(znull) } } # Initialize susie fit. s = init_setup_rss(p,L,prior_variance,residual_variance,prior_weights, null_weight) if (!missing(s_init) && !is.null(s_init)) { if (!inherits(s_init,"susie")) stop("s_init should be a susie object") if (max(s_init$alpha) > 1 || min(s_init$alpha) < 0) stop("s_init$alpha has invalid values outside range [0,1]; please ", "check your input") # First, remove effects with s_init$V = 0 s_init = susie_prune_single_effects(s_init) num_effects = nrow(s_init$alpha) if(missing(L)){ L = num_effects }else if(L < num_effects){ warning(paste("Specified number of effects L =",L, "is smaller than the number of effects",num_effects, "in input SuSiE model. It will have",num_effects,"effects.")) L = num_effects } # expand s_init if L > num_effects. s_init = susie_prune_single_effects(s_init, L, s$V) s = modifyList(s,s_init) s = init_finalize_rss(s,R = R) } else s = init_finalize_rss(s) s$sigma2 = s$sigma2 - lambda estimate_prior_method = match.arg(estimate_prior_method) # Intialize elbo to NA. elbo = rep(NA,max_iter+1) elbo[1] = -Inf; tracking = list() attr(R,"lambda") = lambda Sigma = update_Sigma(R,s$sigma2,z) # sigma2*R + lambda*I for (i in 1:max_iter) { if (track_fit) tracking[[i]] = susie_slim(s) s = update_each_effect_rss(R,z,s,Sigma,estimate_prior_variance, estimate_prior_method,check_null_threshold) if (verbose) print(paste0("before estimate sigma2 objective:", get_objective_rss(R,z,s))) # Compute objective before updating residual variance because part # of the objective s$kl has already been computed under the # residual variance, before the update. elbo[i+1] = get_objective_rss(R,z,s) if ((elbo[i+1] - elbo[i]) < tol) { s$converged = TRUE break } if (estimate_residual_variance) { if (lambda == 0) { est_sigma2 = (1/sum(attr(R,"eigen")$values != 0))*get_ER2_rss(1,R,z,s) if (est_sigma2 < 0) stop("Estimating residual variance failed: the estimated value ", "is negative") if (est_sigma2 > 1) est_sigma2 = 1 } else { est_sigma2 = optimize(Eloglik_rss, interval = c(1e-4, 1-lambda), R = R, z = z, s = s, maximum = TRUE)$maximum if(Eloglik_rss(est_sigma2, R, z, s) < Eloglik_rss(1-lambda, R, z, s)){ est_sigma2 = 1-lambda } } s$sigma2 = est_sigma2 if (verbose) print(paste0("after estimate sigma2 objective:", get_objective_rss(R,z,s))) Sigma = update_Sigma(R,s$sigma2,z) } } # Remove first (infinite) entry, and trailing NAs. elbo = elbo[2:(i+1)] s$elbo = elbo s$niter = i s$lambda = lambda if (is.null(s$converged)) { warning(paste("IBSS algorithm did not converge in",max_iter,"iterations!")) s$converged = FALSE } s$intercept = intercept_value s$fitted = s$Rz s$X_column_scale_factors = attr(R,"scaled:scale") if (track_fit) s$trace = tracking # SuSiE CS and PIP. if (!is.null(coverage) && !is.null(min_abs_corr)) { R = muffled_cov2cor(R) s$sets = susie_get_cs(s,coverage = coverage,Xcorr = R, min_abs_corr = min_abs_corr) s$pip = susie_get_pip(s,prune_by_cs = FALSE,prior_tol = prior_tol) } if (!is.null(names(z))) { variable_names = names(z) if (!is.null(null_weight)) variable_names = c("null",variable_names) colnames(s$alpha) = variable_names colnames(s$mu) = variable_names colnames(s$mu2) = variable_names colnames(s$lbf_variable) = variable_names names(s$pip) = variable_names } return(s) } update_Sigma = function (R, sigma2, z) { Sigma = sigma2*R + attr(R,"lambda") * diag(length(z)) eigenS = attr(R,"eigen") eigenS$values = sigma2 * eigenS$values + attr(R,"lambda") Dinv = 1/(eigenS$values) Dinv[is.infinite(Dinv)] = 0 attr(Sigma,"eigenS") = eigenS # Sigma^(-1) R_j = U (sigma2 D + lambda)^(-1) D U^T e_j attr(Sigma,"SinvRj") = eigenS$vectors %*% (Dinv * attr(R,"eigen")$values * t(eigenS$vectors)) if (attr(R,"lambda") == 0) attr(Sigma,"RjSinvRj") = attr(R,"d")/sigma2 else { tmp = t(eigenS$vectors) attr(Sigma,"RjSinvRj") = colSums(tmp * (Dinv*(attr(R,"eigen")$values^2) * tmp)) } return(Sigma) } susieR/R/single_effect_regression_rss.R0000644000176200001440000001065214033741524020003 0ustar liggesusers#' @rdname single_effect_regression #' #' @param z A p-vector of z scores. #' #' @param Sigma \code{residual_var*R + lambda*I} #' #' @keywords internal #' single_effect_regression_rss = function (z, Sigma, V = 1, prior_weights = NULL, optimize_V = c("none", "optim", "uniroot", "EM", "simple"), check_null_threshold = 0) { p = length(z) shat2 = 1/attr(Sigma,"RjSinvRj") if (is.null(prior_weights)) prior_weights = rep(1/p,p) if (optimize_V != "EM" && optimize_V != "none") V = optimize_prior_variance_rss(optimize_V,z,Sigma,prior_weights, alpha = NULL,post_mean2 = NULL,V_init = V, check_null_threshold=check_null_threshold) lbf = sapply(1:p, function(j) -0.5 * log(1 + (V/shat2[j])) + 0.5 * (V/(1 + (V/shat2[j]))) * sum(attr(Sigma,"SinvRj")[,j] * z)^2 ) # Deal with special case of infinite shat2 (e.g., happens if X does not # vary). lbf[is.infinite(shat2)] = 0 # w is proportional to BF, but subtract max for numerical stability. maxlbf = max(lbf) w = exp(lbf-maxlbf) # posterior prob on each SNP w_weighted = w * prior_weights weighted_sum_w = sum(w_weighted) alpha = w_weighted / weighted_sum_w post_var = (attr(Sigma,"RjSinvRj") + 1/V)^(-1) # Posterior variance. post_mean = sapply(1:p,function(j) (post_var[j]) * sum(attr(Sigma,"SinvRj")[,j] * z)) post_mean2 = post_var + post_mean^2 # Second moment. lbf_model = maxlbf + log(weighted_sum_w) # Analogue of loglik in the # non-summary case. if (optimize_V=="EM") V = optimize_prior_variance_rss(optimize_V,z,Sigma,prior_weights, alpha,post_mean2,check_null_threshold = check_null_threshold) return(list(alpha = alpha,mu = post_mean,mu2 = post_mean2,lbf = lbf, V = V,lbf_model = lbf_model)) } loglik_rss = function (V, z, Sigma, prior_weights) { p = length(z) shat2 = 1/attr(Sigma,"RjSinvRj") # log(bf) for each SNP. lbf = sapply(1:p,function (j) -0.5 * log(1 + (V/shat2[j])) + 0.5 * (V/(1 + (V/shat2[j]))) * sum(attr(Sigma,"SinvRj")[,j] * z)^2) # Deal with special case of infinite shat2 (e.g., happens if X does # not vary). lbf[is.infinite(shat2)] = 0 maxlbf = max(lbf) w = exp(lbf-maxlbf) # w = BF/BFmax w_weighted = w * prior_weights weighted_sum_w = sum(w_weighted) return(log(weighted_sum_w) + maxlbf) } neg.loglik_z.logscale_rss = function (lV, z, Sigma, prior_weights) -loglik_rss(exp(lV),z,Sigma,prior_weights) optimize_prior_variance_rss = function (optimize_V, z, Sigma, prior_weights, alpha = NULL, post_mean2 = NULL, V_init = NULL, check_null_threshold = 0) { V = V_init if (optimize_V != "simple") { if(optimize_V == "optim") { lV = optim(par = log(max(c((colSums(attr(Sigma,"SinvRj") * z)^2) - (1/attr(Sigma,"RjSinvRj")),1e-6),na.rm = TRUE)), fn = neg.loglik_z.logscale_rss,z = z,Sigma = Sigma, prior_weights = prior_weights,method = "Brent", lower = -30,upper = 15)$par ## if the estimated one is worse than current one, don't change it. if(neg.loglik_z.logscale_rss(lV, z = z,Sigma = Sigma,prior_weights = prior_weights) > neg.loglik_z.logscale_rss(log(V), z = z,Sigma = Sigma,prior_weights = prior_weights)){ lV = log(V) } V = exp(lV) } else if (optimize_V == "EM") V = sum(alpha * post_mean2) else stop("Invalid option for optimize_V") } # Set V exactly 0 if that beats the numerical value. By # check_null_threshold in loglik. check_null_threshold = 0.1 is # exp(0.1) = 1.1 on likelihood scale; it means that for parsimony # reasons we set estiate of V to zero, if its numerical estimate is # only "negligibly" different from zero. We use a likelihood ratio # of exp(check_null_threshold) to define "negligible" in this # context. This is fairly modest condition compared to, say, a # formal LRT with p-value 0.05. But the idea is to be lenient to # non-zeros estimates unless they are indeed small enough to be # neglible. See more intuition at # https://stephens999.github.io/fiveMinuteStats/LR_and_BF.html if (loglik_rss(0,z,Sigma,prior_weights) + check_null_threshold >= loglik_rss(V,z,Sigma,prior_weights)) V = 0 return(V) } susieR/R/update_each_effect_ss.R0000644000176200001440000000337413755042336016352 0ustar liggesusers# @title update each effect once # @param XtX a p by p matrix, X'X # @param Xty a p vector # @param s_init a list with elements sigma2, V, alpha, mu, Xr # @param estimate_prior_variance boolean indicating whether to # estimate prior variance # @param estimate_prior_method The method used for estimating prior # variance, 'optim' or 'EM'. # @param check_null_threshold float a threshold on the log scale to # compare likelihood between current estimate and zero the null # #' @importFrom Matrix diag update_each_effect_ss = function (XtX, Xty, s_init, estimate_prior_variance = FALSE, estimate_prior_method = "optim", check_null_threshold = 0) { if (!estimate_prior_variance) estimate_prior_method = "none" # Repeat for each effect to update. s = s_init L = nrow(s$alpha) if (L > 0) { for (l in 1:L) { # Remove lth effect from fitted values. s$XtXr = s$XtXr - XtX %*% (s$alpha[l,] * s$mu[l,]) # Compute residuals. XtR = Xty - s$XtXr res = single_effect_regression_ss(as.matrix(XtR),attr(XtX,"d"),s$V[l], s$sigma2,s$pi,estimate_prior_method,check_null_threshold) # Update the variational estimate of the posterior mean. s$mu[l,] = res$mu s$alpha[l,] = res$alpha s$mu2[l,] = res$mu2 s$V[l] = res$V s$lbf[l] = res$lbf_model s$lbf_variable[l,] = res$lbf s$KL[l] = -res$lbf_model + SER_posterior_e_loglik_ss(attr(XtX,"d"),XtR,s$sigma2, res$alpha * res$mu,res$alpha * res$mu2) s$XtXr = s$XtXr + XtX %*% (s$alpha[l,] * s$mu[l,]) } } s$XtXr = unname(as.matrix(s$XtXr)) return(s) } susieR/R/susie_zzz_auto.R0000644000176200001440000001267114075324172015161 0ustar liggesusers#' @title Attempt at Automating SuSiE for Hard Problems #' #' @description \code{susie_auto} is an attempt to automate reliable #' running of susie even on hard problems. It implements a three-stage #' strategy for each L: first, fit susie with very small residual #' error; next, estimate residual error; finally, estimate the prior #' variance. If the last step estimates some prior variances to be #' zero, stop. Otherwise, double L, and repeat. Initial runs are #' performed with relaxed tolerance; the final run is performed using #' the default susie tolerance. #' #' @param X An n by p matrix of covariates. #' #' @param y The observed responses, a vector of length n. #' #' @param L_init The initial value of L. #' #' @param L_max The largest value of L to consider. #' #' @param verbose If \code{verbose = TRUE}, the algorithm's progress, #' and a summary of the optimization settings, are printed to the #' console. #' #' @param init_tol The tolerance to passed to \code{susie} during #' early runs (set large to shorten the initial runs). #' #' @param standardize If \code{standardize = TRUE}, standardize the #' columns of X to unit variance prior to fitting. Note that #' \code{scaled_prior_variance} specifies the prior on the #' coefficients of X \emph{after} standardization (if it is #' performed). If you do not standardize, you may need to think more #' carefully about specifying \code{scaled_prior_variance}. Whatever #' your choice, the coefficients returned by \code{coef} are given for #' \code{X} on the original input scale. Any column of \code{X} that #' has zero variance is not standardized. #' #' @param intercept If \code{intercept = TRUE}, the intercept is #' fitted; it \code{intercept = FALSE}, the intercept is set to #' zero. Setting \code{intercept = FALSE} is generally not #' recommended. #' #' @param max_iter Maximum number of IBSS iterations to perform. #' #' @param tol A small, non-negative number specifying the convergence #' tolerance for the IBSS fitting procedure. The fitting procedure #' will halt when the difference in the variational lower bound, or #' \dQuote{ELBO} (the objective function to be maximized), is #' less than \code{tol}. #' #' @param \dots Additional arguments passed to \code{\link{susie}}. #' #' @return See \code{\link{susie}} for a description of return values. #' #' @seealso \code{\link{susie}} #' #' @examples #' set.seed(1) #' n = 1000 #' p = 1000 #' beta = rep(0,p) #' beta[1:4] = 1 #' X = matrix(rnorm(n*p),nrow = n,ncol = p) #' X = scale(X,center = TRUE,scale = TRUE) #' y = drop(X %*% beta + rnorm(n)) #' res = susie_auto(X,y) #' plot(beta,coef(res)[-1]) #' abline(a = 0,b = 1,col = "skyblue",lty = "dashed") #' plot(y,predict(res)) #' abline(a = 0,b = 1,col = "skyblue",lty = "dashed") #' #' @importFrom stats sd #' #' @export #' susie_auto = function (X, y, L_init = 1, L_max = 512, verbose = FALSE, init_tol = 1, standardize = TRUE, intercept = TRUE, max_iter = 100,tol = 1e-2, ...) { L = L_init if (verbose) message(paste0("Trying L=",L)) s.0 = susie(X,y,L = L,residual_variance = 0.01*sd(y)^2,tol = init_tol, scaled_prior_variance = 1,estimate_residual_variance = FALSE, estimate_prior_variance = FALSE,standardize = standardize, intercept = intercept,max_iter = max_iter,...) s.1 = susie(X,y,s_init = s.0,tol = init_tol, estimate_residual_variance = TRUE, estimate_prior_variance = FALSE, standardize = standardize,intercept = intercept, max_iter = max_iter,...) s.2 = susie(X,y,s_init = s.1,tol = init_tol, estimate_residual_variance = TRUE, estimate_prior_variance = TRUE, standardize = standardize,intercept = intercept, max_iter = max_iter,...) # We call it converged---i.e., L is "big enough"---if there are any # prior variances set to zero. converged = !all(s.2$V > 0) while (!converged & (L <= L_max)) { for (i in 1:L) { s.2 = add_null_effect(s.2,1) # Add in L more effects. s.2$sigma2 = 0.01*sd(y)^2 # Set residual variance to be small # again for next iteration. } L = 2*L if (verbose) message(paste0("Trying L=",L)) s.0 = susie(X,y,s_init = s.2,tol = init_tol, estimate_residual_variance = FALSE, estimate_prior_variance = FALSE, standardize = standardize,intercept = intercept, max_iter = max_iter,...) s.1 = susie(X,y,s_init = s.0,tol = init_tol, estimate_residual_variance = TRUE, estimate_prior_variance = FALSE, standardize = standardize,intercept = intercept, max_iter = max_iter,...) s.2 = susie(X,y,s_init = s.1,tol = init_tol, estimate_residual_variance = TRUE, estimate_prior_variance = TRUE, standardize = standardize,intercept = intercept, max_iter = max_iter,...) # We call it converged---i.e., L is "big enough"---if there are # any prior variances set to zero. converged = !all(s.2$V > 0) } # Final run at default tolerance to improve fit. s.2 = susie(X,y,s_init = s.2,estimate_residual_variance = TRUE, estimate_prior_variance = TRUE,tol = tol, standardize = standardize,intercept = intercept, max_iter = max_iter,...) return(s.2) } susieR/R/update_each_effect.R0000644000176200001440000000277714075324172015650 0ustar liggesusers# @title update each effect once # @param X an n by p matrix of regressor variables # @param y an n vector of response variable # @param s a SuSiE fit # @param estimate_prior_variance boolean indicating whether to # estimate prior variance # @param check_null_threshold float a threshold on the log scale to # compare likelihood between current estimate and zero the null update_each_effect = function (X, y, s, estimate_prior_variance = FALSE, estimate_prior_method = "optim", check_null_threshold) { if (!estimate_prior_variance) estimate_prior_method = "none" # Repeat for each effect to update. L = nrow(s$alpha) if (L > 0) for (l in 1:L) { # Remove lth effect from fitted values. s$Xr = s$Xr - compute_Xb(X,s$alpha[l,] * s$mu[l,]) # Compute residuals. R = y - s$Xr res = single_effect_regression(R,X,s$V[l],s$sigma2,s$pi, estimate_prior_method, check_null_threshold) # Update the variational estimate of the posterior mean. s$mu[l,] = res$mu s$alpha[l,] = res$alpha s$mu2[l,] = res$mu2 s$V[l] = res$V s$lbf[l] = res$lbf_model s$lbf_variable[l,] = res$lbf s$KL[l] = -res$loglik + SER_posterior_e_loglik(X,R,s$sigma2,res$alpha * res$mu, res$alpha * res$mu2) s$Xr = s$Xr + compute_Xb(X,s$alpha[l,] * s$mu[l,]) } return(s) } susieR/R/elbo_ss.R0000644000176200001440000000235513703336624013512 0ustar liggesusers# @title Get objective function from data and susie fit object. # @param XtX a p by p matrix, X'X # @param Xty a p vector, X'y, # @param s a susie fit object # @param yty a scaler, y'y, where y is centered to have mean 0 # @param n sample size get_objective_ss = function (XtX, Xty, s, yty, n) Eloglik_ss(XtX,Xty,s,yty,n) - sum(s$KL) # Expected loglikelihood for a susie fit. Eloglik_ss = function (XtX, Xty, s, yty, n) -n/2*log(2*pi*s$sigma2) - 1/(2*s$sigma2) * get_ER2_ss(XtX,Xty,s,yty) # Expected squared residuals. get_ER2_ss = function (XtX, Xty, s, yty) { B = s$alpha * s$mu XB2 = sum((B %*% XtX) * B) betabar = colSums(B) d = attr(XtX,"d") postb2 = s$alpha * s$mu2 # Posterior second moment. return(yty - 2*sum(betabar * Xty) + sum(betabar * (XtX %*% betabar)) - XB2 + sum(d * t(postb2))) } # @title posterior expected loglikelihood for a single effect regression # @param dXtX a p vector of diagonal elements of XtX # @param Xty a p vector # @param s2 the residual variance # @param Eb the posterior mean of b (p vector) (alpha * mu) # @param Eb2 the posterior second moment of b (p vector) (alpha * mu2) SER_posterior_e_loglik_ss = function (dXtX, Xty, s2, Eb, Eb2) -0.5/s2 * (-2*sum(Eb*Xty) + sum(dXtX * as.vector(Eb2))) susieR/R/susie_trendfilter.R0000644000176200001440000001043514055444232015610 0ustar liggesusers#' @title Apply susie to trend filtering (especially changepoint #' problems), a type of non-parametric regression. #' #' @description Fits the non-parametric Gaussian regression model #' \eqn{y = mu + e}, where the mean \eqn{mu} is modelled as \eqn{mu = #' Xb}, X is a matrix with columns containing an appropriate basis, #' and b is vector with a (sparse) SuSiE prior. In particular, when #' \code{order = 0}, the jth column of X is a vector with the first j #' elements equal to zero, and the remaining elements equal to 1, so #' that \eqn{b_j} corresponds to the change in the mean of y between #' indices j and j+1. For background on trend filtering, see #' Tibshirani (2014). See also the "Trend filtering" vignette, #' \code{vignette("trend_filtering")}. #' #' @details This implementation exploits the special structure of X, #' which means that the matrix-vector product \eqn{X^Ty} is fast to #' compute; in particular, the computation time is \eqn{O(n)} rather #' than \eqn{O(n^2)} if \code{X} were formed explicitly. For #' implementation details, see the "Implementation of SuSiE trend #' filtering" vignette by running #' \code{vignette("trendfiltering_derivations")}. #' #' @param y An n-vector of observations ordered in time or space #' (assumed to be equally spaced). #' #' @param order An integer specifying the order of trend filtering. #' The default, \code{order = 0}, corresponds to "changepoint" #' problems (\emph{i.e.}, piecewise constant \eqn{mu}). Although #' \code{order > 0} is implemented, we do not recommend its use; in #' practice, we have found problems with convergence of the algorithm #' to poor local optima, producing unreliable inferences. #' #' @param standardize Logical indicating whether to standardize the X #' variables ("basis functions"); \code{standardize = FALSE} is #' recommended as these basis functions already have a natural scale. #' #' @param use_mad Logical indicating whether to use the "median #' absolute deviation" (MAD) method to the estimate residual #' variance. If \code{use_mad = TRUE}, susie is run twice, first by #' fixing the residual variance to the MAD value, then a second time, #' initialized to the first fit, but with residual variance estimated #' the usual way (by maximizing the ELBO). We have found this strategy #' typically improves reliability of the results by reducing a #' tendency to converge to poor local optima of the ELBO. #' #' @param ... Other arguments passed to \code{\link{susie}}. #' #' @return A "susie" fit; see \code{\link{susie}} for details. #' #' @references R. J. Tibshirani (2014). Adaptive piecewise polynomial #' estimation via trend filtering. \emph{Annals of Statistics} #' \bold{42}, 285-323. #' #' @examples #' set.seed(1) #' mu = c(rep(0,50),rep(1,50),rep(3,50),rep(-2,50),rep(0,200)) #' y = mu + rnorm(400) #' s = susie_trendfilter(y) #' plot(y) #' lines(mu,col = 1,lwd = 3) #' lines(predict(s),col = 2,lwd = 2) #' #' # Calculate credible sets (indices of y that occur just before #' # changepoints). #' susie_get_cs(s) #' #' # Plot with credible sets for changepoints. #' susie_plot_changepoint(s,y) #' #' @importFrom Matrix sparseMatrix #' #' @export #' susie_trendfilter = function (y, order = 0, standardize = FALSE, use_mad = TRUE, ...) { if (order > 0) warning("order > 0 is not recommended") n = length(y) X = sparseMatrix(i = NULL,j = NULL,dims = c(n,n)) attr(X,"matrix.type") = "tfmatrix" attr(X,"order") = order if (use_mad && !("s_init" %in% names(list(...)))) { mad = estimate_mad_residual_variance(y) s_mad_init = suppressWarnings(susie(X = X,y = y,standardize = standardize, estimate_residual_variance = FALSE,residual_variance = mad,...)) s = susie(X = X,y = y,standardize = standardize, s_init = s_mad_init,...) } else s = susie(X = X,y = y,standardize = standardize,...) return(s) } # @title estimate residual variance using MAD estimator # @param y an n-vector # @return a scalar of estimated residual variance estimate_mad_residual_variance = function (y) { sigma2 = 0.5*(median(abs(diff(y))/0.6745)^2) if (sigma2 == 0) { stop("Cannot use median absolute deviation (MAD) to initialize residual variance because MAD = 0 for the input data. Please set 'use_mad = FALSE'") } return(sigma2) } susieR/R/susie_ss.R0000644000176200001440000003614614142636237013727 0ustar liggesusers#' @rdname susie #' #' @param bhat A p-vector of estimated effects. #' #' @param shat A p-vector of standard errors. #' #' @param R A p by p correlation matrix. It should be estimated from #' the same samples used to compute \code{bhat} and \code{shat}. Using #' an out-of-sample matrix may produce unreliable results. #' #' @param n The sample size. #' #' @param var_y The sample variance of y, defined as \eqn{y'y/(n-1)}. #' When the sample variance cannot be provided, the coefficients #' (returned from \code{coef}) are computed on the "standardized" X, y #' scale. #' #' @param XtX A p by p matrix \eqn{X'X} in which the columns of X #' are centered to have mean zero. #' #' @param Xty A p-vector \eqn{X'y} in which y and the columns of X are #' centered to have mean zero. #' #' @param yty A scalar \eqn{y'y} in which y is centered to have mean #' zero. #' #' @param X_colmeans A p-vector of column means of \code{X}. If both #' \code{X_colmeans} and \code{y_mean} are provided, the intercept #' is estimated; otherwise, the intercept is NA. #' #' @param y_mean A scalar containing the mean of \code{y}. If both #' \code{X_colmeans} and \code{y_mean} are provided, the intercept #' is estimated; otherwise, the intercept is NA. #' #' @param maf Minor allele frequency; to be used along with #' \code{maf_thresh} to filter input summary statistics. #' #' @param maf_thresh Variants having a minor allele frequency smaller #' than this threshold are not used. #' #' @param r_tol Tolerance level for eigenvalue check of positive #' semidefinite matrix of R. #' #' @param check_input If \code{check_input = TRUE}, #' \code{susie_suff_stat} performs additional checks on \code{XtX} and #' \code{Xty}. The checks are: (1) check that \code{XtX} is positive #' semidefinite; (2) check that \code{Xty} is in the space spanned by #' the non-zero eigenvectors of \code{XtX}. #' #' @param check_prior If \code{check_prior = TRUE}, it checks if the #' estimated prior variance becomes unreasonably large (comparing with #' 10 * max(abs(z))^2). #' #' @param n_purity Passed as argument \code{n_purity} to #' \code{\link{susie_get_cs}}. #' #' @importFrom crayon red magenta #' #' @export #' susie_suff_stat = function (bhat, shat, R, n, var_y, XtX, Xty, yty, X_colmeans = NA, y_mean = NA, maf = NULL, maf_thresh = 0, L = 10, scaled_prior_variance = 0.2, residual_variance = NULL, estimate_residual_variance = TRUE, estimate_prior_variance = TRUE, estimate_prior_method = c("optim","EM","simple"), check_null_threshold = 0, prior_tol = 1e-9, r_tol = 1e-08, prior_weights = NULL, null_weight = NULL, standardize = TRUE, max_iter = 100, s_init = NULL, coverage = 0.95, min_abs_corr = 0.5, tol = 1e-3, verbose = FALSE, track_fit = FALSE, check_input = FALSE, refine = FALSE, check_prior = FALSE, n_purity = 100) { # Process input estimate_prior_method. estimate_prior_method = match.arg(estimate_prior_method) if (missing(n)) stop("n must be provided") if (any(n <= 1)) stop("n must be more than 1") # Check sufficient statistics. missing_bhat = c(missing(bhat), missing(shat), missing(R)) missing_XtX = c(missing(XtX), missing(Xty), missing(yty)) if (all(missing_bhat) & all(missing_XtX)) stop("Please provide either all of bhat, shat, R, n, var_y or all of ", "XtX, Xty, yty, n") if (any(missing_bhat) & any(missing_XtX)) stop("Please provide either all of bhat, shat, R, n, var_y or all of ", "XtX, Xty, yty, n") if (all(missing_bhat) & any(missing_XtX)) stop("Please provide all of XtX, Xty, yty, n") if (all(missing_XtX) & any(missing_bhat)) stop("Please provide all of bhat, shat, R, n, var_y") if ((!any(missing_XtX)) & (!all(missing_bhat))) warning("Only using information from XtX, Xty, yty, n") if (!any(missing_bhat)) { if (!all(missing_XtX)) warning("Only using information from bhat, shat, R, n, var_y") # Compute XtX, Xty, yty from bhat, shat, R, n, var_y. if (length(shat) == 1) shat = rep(shat,length(bhat)) if (length(bhat) != length(shat)) stop("The length of bhat does not agree with length of shat") if (anyNA(bhat) || anyNA(shat)) stop("The input summary statistics have missing values") if (any(shat == 0)) stop("shat contains one or more zeros") that = bhat/shat that[is.na(that)] = 0 R2 = that^2/(that^2 + n-2) sigma2 = (n-1)*(1-R2)/(n-2) # Convert any input R to correlation matrix. # If R has 0 colums and rows, cov2cor produces NaN and warning. X0 = diag(R) == 0 R = muffled_cov2cor(R) # Change the columns and rows with NaN to 0. if (sum(X0) > 0) R[X0,] = R[,X0] = 0 if (missing(var_y)) { XtX = (n-1)*R Xty = sqrt(sigma2) * sqrt(n-1) * that var_y = 1 } else { XtXdiag = var_y * sigma2/(shat^2) Xty = that * var_y * sigma2/shat XtX = R XtX = R * sqrt(XtXdiag) XtX = t(XtX) XtX = XtX * sqrt(XtXdiag) XtX = XtX + t(XtX) XtX = XtX/2 } yty = var_y * (n-1) } if (ncol(XtX) > 1000 & !requireNamespace("Rfast",quietly = TRUE)) message(magenta("For large R or large XtX, consider installing the ", "Rfast package for better performance.")) # Check input XtX. if (ncol(XtX) != length(Xty)) stop(paste0("The dimension of XtX (",nrow(XtX)," by ",ncol(XtX), ") does not agree with expected (",length(Xty)," by ", length(Xty),")")) if (!is_symmetric_matrix(XtX)) { message(red("XtX is not symmetric; forcing XtX to be symmetric by ", "replacing XtX with (XtX + t(XtX))/2")) XtX = XtX + t(XtX) XtX = XtX/2 } # MAF filter. if (!is.null(maf)) { if (length(maf) != length(Xty)) stop(paste("The length of maf does not agree with expected",length(Xty))) id = which(maf > maf_thresh) XtX = XtX[id,id] Xty = Xty[id] } if (any(is.infinite(Xty))) stop("Input Xty or zscores contains infinite values") if (!(is.double(XtX) & is.matrix(XtX)) & !inherits(XtX,"CsparseMatrix")) stop("Input XtX or R must be a double-precision matrix, or a sparse matrix") if (anyNA(XtX)) stop("Input XtX or R matrix contains NAs") # Replace NAs in z with zeros. if (anyNA(Xty)) { warning("NA values in Xty or z-scores are replaced with 0") Xty[is.na(Xty)] = 0 } if (check_input) { # Check whether XtX is positive semidefinite. semi_pd = check_semi_pd(XtX,r_tol) if (!semi_pd$status) stop("XtX is not a positive semidefinite matrix") # Check whether Xty in space spanned by the non-zero eigenvectors of XtX proj = check_projection(semi_pd$matrix,Xty) if (!proj$status) warning("Xty does not lie in the space of the non-zero eigenvectors ", "of XtX") } if (is.numeric(null_weight) && null_weight == 0) null_weight = NULL if (!is.null(null_weight)) { if (!is.numeric(null_weight)) stop("Null weight must be numeric") if (null_weight < 0 || null_weight >= 1) stop("Null weight must be between 0 and 1") if (is.null(prior_weights)) prior_weights = c(rep(1/ncol(XtX)*(1-null_weight),ncol(XtX)),null_weight) else prior_weights = c(prior_weights*(1 - null_weight),null_weight) XtX = cbind(rbind(XtX,0),0) Xty = c(Xty,0) } p = ncol(XtX) if (standardize) { dXtX = diag(XtX) csd = sqrt(dXtX/(n-1)) csd[csd == 0] = 1 XtX = (1/csd) * XtX XtX = t(XtX) XtX = XtX / csd Xty = Xty / csd } else csd = rep(1,length = p) attr(XtX,"d") = diag(XtX) attr(XtX,"scaled:scale") = csd # Check that X_colmeans has length 1 or p. if (length(X_colmeans) == 1) X_colmeans = rep(X_colmeans,p) if (length(X_colmeans) != p) stop("The length of X_colmeans does not agree with number of variables") # Initialize susie fit. s = init_setup(0,p,L,scaled_prior_variance,residual_variance,prior_weights, null_weight,yty/(n-1),standardize) s$Xr = NULL s$XtXr = rep(0,p) if (!missing(s_init)&& !is.null(s_init)) { if (!inherits(s_init,"susie")) stop("s_init should be a susie object") if (max(s_init$alpha) > 1 || min(s_init$alpha) < 0) stop("s_init$alpha has invalid values outside range [0,1]; please ", "check your input") # First, remove effects with s_init$V = 0 s_init = susie_prune_single_effects(s_init) num_effects = nrow(s_init$alpha) if(missing(L)){ # if L is not specified, we set it as in s_init. L = num_effects }else if(min(p, L) < num_effects){ warning(paste("Specified number of effects L =",min(p, L), "is smaller than the number of effects",num_effects, "in input SuSiE model. The initialized SuSiE model will have", num_effects,"effects.")) L = num_effects } # expand s_init if L > num_effects. s_init = susie_prune_single_effects(s_init, min(p, L), s$V) s = modifyList(s,s_init) s = init_finalize(s,X = XtX) s$XtXr = s$Xr s$Xr = NULL } else s = init_finalize(s) # Initialize elbo to NA. elbo = rep(as.numeric(NA),max_iter + 1) elbo[1] = -Inf; tracking = list() bhat = (1/attr(XtX,"d")) * Xty shat = sqrt(s$sigma2/attr(XtX,"d")) z = bhat/shat zm = max(abs(z[!is.nan(z)])) for (i in 1:max_iter) { if (track_fit) tracking[[i]] = susie_slim(s) s = update_each_effect_ss(XtX,Xty,s,estimate_prior_variance, estimate_prior_method,check_null_threshold) if(check_prior){ if(any(s$V > 100*(zm^2))){ stop('The estimated prior variance is unreasonably large. Please check the input.') } } if (verbose) print(paste0("objective:",get_objective_ss(XtX,Xty,s,yty,n))) # Compute objective before updating residual variance because part # of the objective s$kl has already been computed under the # residual variance before the update. elbo[i+1] = get_objective_ss(XtX,Xty,s,yty,n) if(is.infinite(elbo[i+1])){ stop('The objective becomes infinite. Please check the input.') } if ((elbo[i+1] - elbo[i]) < tol) { s$converged = TRUE break } if (estimate_residual_variance) { est_sigma2 = estimate_residual_variance_ss(XtX,Xty,s,yty,n) if (est_sigma2 < 0) stop("Estimating residual variance failed: the estimated value ", "is negative") s$sigma2 = est_sigma2 if (verbose) print(paste0("objective:",get_objective_ss(XtX,Xty,s,yty,n))) } } elbo = elbo[2:(i+1)] # Remove first (infinite) entry, and trailing NAs. s$elbo = elbo s$niter = i if (is.null(s$converged)) { warning(paste("IBSS algorithm did not converge in",max_iter,"iterations! Please check consistency between summary statistics and LD matrix. See https://stephenslab.github.io/susieR/articles/susierss_diagnostic.html")) s$converged = FALSE } s$X_column_scale_factors = attr(XtX,"scaled:scale") # Compute intercept. s$intercept = y_mean - sum(X_colmeans * (colSums(s$alpha * s$mu)/s$X_column_scale_factors)) if (track_fit) s$trace = tracking # SuSiE CS and PIP. if (!is.null(coverage) && !is.null(min_abs_corr)) { if(any(!(diag(XtX) %in% c(0,1)))){ s$sets = susie_get_cs(s,coverage = coverage,Xcorr = muffled_cov2cor(XtX), min_abs_corr = min_abs_corr, check_symmetric = FALSE, n_purity = n_purity) }else s$sets = susie_get_cs(s,coverage = coverage,Xcorr = XtX, min_abs_corr = min_abs_corr, check_symmetric = FALSE, n_purity = n_purity) s$pip = susie_get_pip(s,prune_by_cs = FALSE,prior_tol = prior_tol) } if (!is.null(colnames(XtX))) { variable_names = colnames(XtX) if (!is.null(null_weight)) { variable_names[length(variable_names)] = "null" names(s$pip) = variable_names[-p] } else names(s$pip) = variable_names colnames(s$alpha) = variable_names colnames(s$mu) = variable_names colnames(s$mu2) = variable_names colnames(s$lbf_variable) = variable_names } if (refine) { if (!missing(s_init) && !is.null(s_init)) warning("The given s_init is not used in refinement") if (!is.null(null_weight) && null_weight != 0) { ## if null_weight is specified ## we remove the extra 0 column XtX = XtX[1:(p-1), 1:(p-1)] Xty = Xty[1:(p-1)] pw_s = s$pi[-s$null_index]/(1 - null_weight) } else pw_s = s$pi conti = TRUE while (conti & length(s$sets$cs)>0) { m = list() for(cs in 1:length(s$sets$cs)) { pw_cs = pw_s pw_cs[s$sets$cs[[cs]]] = 0 if(all(pw_cs == 0)){ break } s2 = susie_suff_stat(XtX = XtX, Xty = Xty, yty = yty, n = n, L = L, X_colmeans = X_colmeans, y_mean = y_mean, prior_weights = pw_cs, s_init = NULL, scaled_prior_variance = scaled_prior_variance, residual_variance = residual_variance, estimate_residual_variance = estimate_residual_variance, estimate_prior_variance = estimate_prior_variance, estimate_prior_method = estimate_prior_method, check_null_threshold = check_null_threshold, prior_tol = prior_tol, r_tol = r_tol, max_iter = max_iter, null_weight = null_weight, standardize = standardize, coverage = coverage, min_abs_corr = min_abs_corr, tol = tol, verbose = FALSE, track_fit = FALSE, check_input = FALSE, refine = FALSE) sinit2 = s2[c("alpha","mu","mu2")] class(sinit2) = "susie" s3 = susie_suff_stat(XtX = XtX, Xty = Xty, yty = yty, n = n, L = L, X_colmeans = X_colmeans, y_mean = y_mean, prior_weights = pw_s, s_init = sinit2, scaled_prior_variance = scaled_prior_variance, residual_variance = residual_variance, estimate_residual_variance = estimate_residual_variance, estimate_prior_variance = estimate_prior_variance, estimate_prior_method = estimate_prior_method, check_null_threshold = check_null_threshold, prior_tol = prior_tol, r_tol = r_tol, max_iter = max_iter, null_weight = null_weight, standardize = standardize, coverage = coverage, min_abs_corr = min_abs_corr, tol = tol, verbose = FALSE, track_fit = FALSE, check_input = FALSE, refine = FALSE) m = c(m,list(s3)) } if(length(m) == 0){ conti = FALSE }else{ elbo = sapply(m, function(x) susie_get_objective(x)) if ((max(elbo) - susie_get_objective(s)) <= 0) conti = FALSE else s = m[[which.max(elbo)]] } } } return(s) } susieR/R/set_R_attributes.R0000644000176200001440000000227613755042336015411 0ustar liggesusers# @title sets the attributes for the R matrix # @param R a p by p LD matrix # @param r_tol tolerance level for eigen value check of positive # semidefinite matrix of R. # @return R with attribute e.g., attr(R, 'eigenR') is the eigen # decomposition of R. set_R_attributes = function (R, r_tol) { if (is.null(attr(R,"eigen"))) eigenR = eigen(R,symmetric = TRUE) else eigenR = attr(R,"eigen") # Drop small eigenvalues. eigenR$values[abs(eigenR$values) < r_tol] = 0 if(any(eigenR$values < 0)) { min_lambda = min(eigenR$values) eigenR$values[eigenR$values < 0] = 0 warning(paste0("The input correlation matrix has negative eigenvalues ", "(smallest one is ", min_lambda, "). The correlation ", "matrix is adjusted such that these negative eigenvalues ", "are now zeros. You can ignore this message, only if you ", "believe the negative eigenvalue is result of numerical ", "rounding errors.")) } res = eigenR$vectors %*% (t(eigenR$vectors) * eigenR$values) attr(res,"eigen") = eigenR attr(res,"d") = diag(res) attr(res,"scaled:scale") = rep(1,length = nrow(R)) return(res) } susieR/R/susie_plots.R0000644000176200001440000002466614055430030014431 0ustar liggesusers#' @rdname susie_plots #' #' @title SuSiE Plots. #' #' @description \code{susie_plot} produces a per-variable summary of #' the SuSiE credible sets. \code{susie_plot_iteration} produces a #' diagnostic plot for the susie model fitting. For #' \code{susie_plot_iteration}, several plots will be created if #' \code{track_fit = TRUE} when calling \code{susie}. #' #' @param model A SuSiE fit, typically an output from #' \code{\link{susie}} or one of its variants. For \code{suse_plot}, #' the susie fit must have \code{model$z}, \code{model$PIP}, and may #' include \code{model$sets}. \code{model} may also be a vector of #' z-scores or PIPs. #' #' @param y A string indicating what to plot: either \code{"z"} for #' z-scores, \code{"PIP"} for posterior inclusion probabilities, #' \code{"log10PIP"} for posterior inclusion probabiliities on the #' (base-10) log-scale. For any other setting, the data are plotted as #' is. #' #' @param add_bar If \code{add_bar = TRUE}, add horizontal bar to #' signals in credible interval. #' #' @param pos This can be either be (1) a numeric vector of indices of #' subset of variables to plot, or (2) a list with the following list #' elements: \code{pos$attr}, \code{pos$start} and \code{pos$end}, #' where \code{pos$attr} is a character string of the name of index #' variable in \code{model} object, and \code{pos$start} and #' \code{pos$end} are boundaries of indices to plot. See the provided #' examples. #' #' @param b For simulated data, set \code{b = TRUE} to highlight #' "true" effects (highlights in red). #' #' @param max_cs The largest credible set to display, either based on #' purity (set \code{max_cs} between 0 and 1), or based on size (set #' \code{max_cs > 1}). #' #' @param add_legend If \code{add_legend = TRUE}, add a legend to #' annotate the size and purity of each CS discovered. It can also be #' specified as location where legends should be added, e.g., #' \code{add_legend = "bottomright"} (default location is #' \code{"topright"}). #' #' @param \dots Additional arguments passed to #' \code{\link[graphics]{plot}}. #' #' @return Invisibly returns \code{NULL}. #' #' @seealso \code{\link{susie_plot_changepoint}} #' #' @examples #' set.seed(1) #' n = 1000 #' p = 1000 #' beta = rep(0,p) #' beta[sample(1:1000,4)] = 1 #' X = matrix(rnorm(n*p),nrow = n,ncol = p) #' X = scale(X,center = TRUE,scale = TRUE) #' y = drop(X %*% beta + rnorm(n)) #' res = susie(X,y,L = 10) #' susie_plot(res,"PIP") #' susie_plot(res,"PIP",add_bar = TRUE) #' susie_plot(res,"PIP",add_legend = TRUE) #' susie_plot(res,"PIP", pos=1:500, add_legend = TRUE) #' # Plot selected regions with adjusted x-axis position label #' res$genomic_position = 1000 + (1:length(res$pip)) #' susie_plot(res,"PIP",add_legend = TRUE, #' pos = list(attr = "genomic_position",start = 1000,end = 1500)) #' # True effects are shown in red. #' susie_plot(res,"PIP",b = beta,add_legend = TRUE) #' #' @importFrom utils head #' @importFrom stats pnorm #' @importFrom graphics plot #' @importFrom graphics segments #' @importFrom graphics points #' @importFrom graphics legend #' @importFrom graphics par #' #' @export #' susie_plot = function (model, y, add_bar = FALSE, pos = NULL, b = NULL, max_cs = 400, add_legend = NULL, ...) { is_susie = inherits(model,"susie") ylab = y color = c( "dodgerblue2", "green4", "#6A3D9A", # purple "#FF7F00", # orange "gold1", "skyblue2", "#FB9A99", # lt pink "palegreen2", "#CAB2D6", # lt purple "#FDBF6F", # lt orange "gray70", "khaki2", "maroon", "orchid1", "deeppink1", "blue1", "steelblue4", "darkturquoise", "green1", "yellow4", "yellow3", "darkorange4", "brown" ) if (y == "z") { if (is_susie) { if (is.null(model$z)) stop("z-scores are not available from SuSiE fit; please set ", "compute_univariate_zscore = TRUE in susie() call") zneg = -abs(model$z) } else zneg = -abs(model) p = -log10(2*pnorm(zneg)) ylab = "-log10(p)" } else if (y == "PIP") { if (is_susie) p = model$pip else p = model } else if (y == "log10PIP") { if (is_susie) p = log10(model$pip) else p = log10(model) ylab = "log10(PIP)" } else { if (is_susie) stop("Need to specify z or PIP or log10PIP for SuSiE fits") p = model } if(is.null(b)) b = rep(0,length(p)) if(is.null(pos)) pos = 1:length(p) start = 0 if (inherits(pos,"list")) { # Check input. if (is.null(pos$attr) || is.null(pos$start) || is.null(pos$end)) stop("pos argument should be a list of list(attr=,start=,end=)") if (!(pos$attr %in% names(model))) stop(paste("Cannot find attribute",pos$attr,"in input model object")) if (pos$start >= pos$end) stop("Position start should be smaller than end") start = min(min(model[[pos$attr]]),pos$start) end = max(max(model[[pos$attr]]),pos$end) # Add zeros to alpha and p. alpha = matrix(0,nrow(model$alpha),end - start + 1) new_p = rep(min(p),end - start + 1) pos_with_value = model[[pos$attr]] - start + 1 new_p[pos_with_value] = p alpha[,pos_with_value] = model$alpha p = new_p model$alpha = alpha # Adjust model$cs. if (!is.null(model$sets$cs)) { for (i in 1:length(model$sets$cs)) model$sets$cs[[i]] = pos_with_value[model$sets$cs[[i]]] } # Change "pos" object to be indices. start_adj = -min(min(model[[pos$attr]]) - pos$start,0) end_adj = max(max(model[[pos$attr]]) - pos$end,0) pos = (1 + start_adj):(length(p) - end_adj) } else { if (!all(pos %in% 1:length(p))) stop("Provided position is outside the range of variables") } legend_text = list(col = vector(),purity = vector(),size = vector()) # scipen0 = options()$scipen # options(scipen = 10) args = list(...) if (!exists("xlab", args)) args$xlab = "variable" if (!exists("ylab", args)) args$ylab = ylab if (!exists("pch", args)) args$pch = 16 args$x = pos + start args$y = p[pos] do.call(plot, args) if (is_susie && !is.null(model$sets$cs)) { for(i in rev(1:nrow(model$alpha))){ if (!is.null(model$sets$cs_index) && !(i %in% model$sets$cs_index)) next purity = model$sets$purity[which(model$sets$cs_index == i),1] if (!is.null(model$sets$purity) && max_cs < 1 && purity >= max_cs) { x0 = intersect(pos,model$sets$cs[[which(model$sets$cs_index == i)]]) y1 = p[x0] } else if (n_in_CS(model, model$sets$requested_coverage)[i] < max_cs) { x0 = intersect(pos, which(in_CS(model,model$sets$requested_coverage)[i,] > 0)) y1 = p[x0] } else { x0 = NULL y1 = NULL } if (is.null(x0)) next if (add_bar) { y0 = rep(0,length(x0)) x1 = x0 segments(x0+start,y0,x1+start,y1,lwd = 1.5,col = "gray") } points(x0+start,y1,col = head(color,1),cex = 1.5,lwd = 2.5) legend_text$col = append(head(color,1), legend_text$col) # Rotate color. color = c(color[-1],color[1]) legend_text$purity = append(round(purity,4),legend_text$purity) legend_text$size = append(length(x0),legend_text$size) } if (length(legend_text$col) > 0 && !is.null(add_legend) && !identical(add_legend, FALSE)) { # Plot legend. text = vector() for (i in 1:length(legend_text$col)) { if (legend_text$size[i] == 1) text[i] = paste0("L",i,": C=1") else text[i] = paste0("L",i,": C=",legend_text$size[i],"/R=", legend_text$purity[i]) } if (!(add_legend %in% c("bottomright", "bottom", "bottomleft", "left", "topleft", "top", "topright", "right", "center"))) { add_legend = "topright" } legend(add_legend,text,bty = "n",col = legend_text$col,cex = 0.65, pch = 15) } } points(pos[b != 0] + start,p[b != 0] + start,col = 2,pch = 16) # options(scipen = scipen0) return(invisible()) } #' @rdname susie_plots #' #' @param L An integer specifying the number of credible sets to plot. #' #' @param file_prefix Prefix to path of output plot file. If not #' specified, the plot, or plots, will be saved to a temporary #' directory generated using \code{\link{tempdir}}. #' #' @param pos Indices of variables to plot. If \code{pos = NULL} all #' variables are plotted. #' #' @examples #' set.seed(1) #' n = 1000 #' p = 1000 #' beta = rep(0,p) #' beta[sample(1:1000,4)] = 1 #' X = matrix(rnorm(n*p),nrow = n,ncol = p) #' X = scale(X,center = TRUE,scale = TRUE) #' y = drop(X %*% beta + rnorm(n)) #' res = susie(X,y,L = 10) #' susie_plot_iteration(res, L=10) #' #' @importFrom grDevices pdf #' @importFrom grDevices dev.off #' @importFrom reshape melt #' @importFrom ggplot2 ggplot #' @importFrom ggplot2 aes_string #' @importFrom ggplot2 geom_col #' @importFrom ggplot2 ggtitle #' @importFrom ggplot2 theme_classic #' #' @export #' susie_plot_iteration = function (model, L, file_prefix, pos = NULL) { get_layer = function (obj, k, idx, vars) { alpha = melt(obj$alpha[1:k,vars,drop = FALSE]) colnames(alpha) = c("L","variables","alpha") alpha$L = as.factor(alpha$L) ggplot(alpha,aes_string("variables","alpha",group = "L")) + geom_col(aes_string(fill = "L")) + ggtitle(paste("Iteration",idx)) + theme_classic() } k = min(nrow(model$alpha),L) if (is.null(pos)) vars = 1:ncol(model$alpha) else vars = pos if (missing(file_prefix)) file_prefix = file.path(tempdir(),"susie_plot") pdf(paste0(file_prefix,".pdf"),8,3) if (is.null(model$trace)) print(get_layer(model,k,model$niter,vars)) else { for (i in 2:length(model$trace)) print(get_layer(model$trace[[i]],k,i-1,vars)) } dev.off() format = ".pdf" if (!is.null(model$trace)) { cmd = paste("convert -delay 30 -loop 0 -density 300 -dispose previous", paste0(file_prefix,".pdf"), "\\( -clone 0 -set delay 300 \\) -swap 0 +delete", "\\( +clone -set delay 300 \\) +swap +delete -coalesce", "-layers optimize",paste0(file_prefix,".gif")) message("Creating GIF animation...") if (file.exists(paste0(file_prefix,".gif"))) file.remove(paste0(file_prefix,".gif")) output = try(system(cmd)) if (inherits(output,"try-error")) stop("Cannot create GIF animation because convert command failed") else format = ".gif" } message(paste0("Iterplot saved to ",file_prefix,format,"\n")) return(invisible()) } susieR/R/sparse_multiplication.R0000644000176200001440000000453014141046730016464 0ustar liggesusers# @title Computes standardized.X %*% b using sparse multiplication trick # @param X an n by p unstandardized matrix with three attributes: # attr(X,"scaled:center"), attr(X,"scaled:scale") and attr(X,"d") # @param b a p vector # @return an n vector # #' @importFrom Matrix t #' @importFrom Matrix tcrossprod compute_Xb = function (X, b) { cm = attr(X,"scaled:center") csd = attr(X,"scaled:scale") # Scale Xb. if (!is.null(attr(X,"matrix.type"))) # When X is a trend filtering matrix. scaled.Xb = compute_tf_Xb(attr(X,"order"),b/csd) else # When X is an ordinary sparse/dense matrix. scaled.Xb = tcrossprod(X,t(b/csd)) # Center Xb. Xb = scaled.Xb - sum(cm*b/csd) return(as.numeric(Xb)) } # @title Computes t(standardized.X) %*% y using sparse multiplication trick # @param X an n by p unstandardized matrix with three attributes: # attr(X,"scaled:center"), attr(X,"scaled:scale") and attr(X,"d") # @param y an n vector # @return a p vector # #' @importFrom Matrix t #' @importFrom Matrix crossprod compute_Xty = function (X, y) { cm = attr(X,"scaled:center") csd = attr(X,"scaled:scale") ytX = crossprod(y,X) # Scale Xty. if (!is.null(attr(X,"matrix.type"))) # When X is a trend filtering matrix. scaled.Xty = compute_tf_Xty(attr(X,"order"),y)/csd else # When X is an ordinary sparse/dense matrix. scaled.Xty = t(ytX/csd) # Center Xty. centered.scaled.Xty = scaled.Xty - cm/csd * sum(y) return(as.numeric(centered.scaled.Xty)) } # @title Computes M %* %t(standardized.X) using sparse multiplication trick # @param M a L by p matrix # @param X an n by p unstandardized matrix with three attributes: # attr(X,"scaled:center"), attr(X,"scaled:scale") and attr(X,"d") # @return a L by n matrix # #' @importFrom Matrix t compute_MXt = function (M, X) { cm = attr(X,"scaled:center") csd = attr(X,"scaled:scale") if (!is.null(attr(X,"matrix.type"))) # When X is a trend filtering matrix. return(as.matrix(t(apply(M,1,function(b) compute_Xb(X,b))))) else # When X is an ordinary sparse/dense matrix. return(as.matrix(t(X %*% (t(M)/csd)) - drop(M %*% (cm/csd)))) # This should be the same as # # t(apply(M, 1, function(b) compute_Xb(X, b)))) # # as well as # # M %*% (t(X)/csd) - drop(tcrossprod(M,t(cm/csd))) # # but should be more memory-efficient. } susieR/R/susie_plot_changepoint.R0000644000176200001440000000354614061022471016622 0ustar liggesusers#' @title Plot changepoint data and susie fit using ggplot2 #' #' @description Plots original data, y, overlaid with line showing #' susie fitted value and shaded rectangles showing credible sets for #' changepoint locations. #' #' @param y An n-vector of observations that are ordered in time or #' space (assumed equally-spaced). #' #' @param s A susie fit generated by #' \code{susie_trendfilter(y,order = 0)}. #' #' @param line_col Color for the line showing fitted values. #' #' @param line_size Size of the lines showing fitted values #' #' @param cs_col Color of the shaded rectangles showing credible #' sets. #' #' @return A ggplot2 plot object. #' #' @examples #' set.seed(1) #' mu = c(rep(0,50),rep(1,50),rep(3,50),rep(-2,50),rep(0,300)) #' y = mu + rnorm(500) #' # Here we use a less sensitive tolerance so that the example takes #' # less time; in practice you will likely want to use a more stringent #' # setting such as tol = 0.001. #' s = susie_trendfilter(y,tol = 0.1) #' #' # Produces ggplot with credible sets for changepoints. #' susie_plot_changepoint(s,y) #' #' @importFrom ggplot2 ggplot #' @importFrom ggplot2 aes_string #' @importFrom ggplot2 geom_point #' @importFrom ggplot2 geom_line #' @importFrom ggplot2 annotate #' #' @export #' susie_plot_changepoint = function (s, y, line_col = "blue", line_size = 1.5, cs_col = "red") { df = data.frame(x = 1:length(y),y = y,mu = predict.susie(s)) CS = susie_get_cs(s)$cs p = ggplot(df) + geom_point(data = df,aes_string(x = "x",y = "y")) + geom_line(color = line_col,data = df,aes_string(x = "x",y = "mu"), size = line_size) for(i in 1:length(CS)) p = p + annotate("rect",fill = cs_col,alpha = 0.5, xmin = min(CS[[i]]) - 0.5,xmax = max(CS[[i]]) + 0.5, ymin = -Inf,ymax = Inf) return(p) } susieR/R/susie_utils.R0000644000176200001440000007425614143475372014450 0ustar liggesusers#' @rdname susie_get_methods #' #' @title Inferences From Fitted SuSiE Model #' #' @description These functions access basic properties or draw #' inferences from a fitted susie model. #' #' @param res A susie fit, typically an output from #' \code{\link{susie}} or one of its variants. For #' \code{susie_get_pip} and \code{susie_get_cs}, this may instead be #' the posterior inclusion probability matrix, \code{alpha}. #' #' @param last_only If \code{last_only = FALSE}, return the ELBO from #' all iterations; otherwise return the ELBO from the last iteration #' only. #' #' @param warning_tol Warn if ELBO is decreasing by this #' tolerance level. #' #' @return \code{susie_get_objective} returns the evidence lower bound #' (ELBO) achieved by the fitted susie model and, optionally, at each #' iteration of the IBSS fitting procedure. #' #' \code{susie_get_residual_variance} returns the (estimated or #' fixed) residual variance parameter. #' #' \code{susie_get_prior_variance} returns the (estimated or fixed) #' prior variance parameters. #' #' \code{susie_get_posterior_mean} returns the posterior mean for the #' regression coefficients of the fitted susie model. #' #' \code{susie_get_posterior_sd} returns the posterior standard #' deviation for coefficients of the fitted susie model. #' #' \code{susie_get_niter} returns the number of model fitting #' iterations performed. #' #' \code{susie_get_pip} returns a vector containing the posterior #' inclusion probabilities (PIPs) for all variables. #' #' \code{susie_get_lfsr} returns a vector containing the average lfsr #' across variables for each single-effect, weighted by the posterior #' inclusion probability (alpha). #' #' \code{susie_get_posterior_samples} returns a list containing the #' effect sizes samples and causal status with two components: \code{b}, #' an \code{num_variables} x \code{num_samples} matrix of effect #' sizes; \code{gamma}, an \code{num_variables} x \code{num_samples} #' matrix of causal status random draws. #' #' \code{susie_get_cs} returns credible sets (CSs) from a susie fit, #' as well as summaries of correlation among the variables included in #' each CS. If desired, one can filter out CSs that do not meet a #' specified \dQuote{purity} threshold; to do this, either \code{X} or #' \code{Xcorr} must be supplied. It returns a list with the following #' elements: #' #' \item{cs}{A list in which each list element is a vector containing #' the indices of the variables in the CS.} #' #' \item{coverage}{The nominal coverage specified for each CS.} #' #' \item{purity}{If \code{X} or \code{Xcorr} iis provided), the #' purity of each CS.} #' #' \item{cs_index}{If \code{X} or \code{Xcorr} is provided) the index #' (number between 1 and L) of each reported CS in the supplied susie #' fit.} #' #' @examples #' set.seed(1) #' n = 1000 #' p = 1000 #' beta = rep(0,p) #' beta[1:4] = 1 #' X = matrix(rnorm(n*p),nrow = n,ncol = p) #' X = scale(X,center = TRUE,scale = TRUE) #' y = drop(X %*% beta + rnorm(n)) #' s = susie(X,y,L = 10) #' susie_get_objective(s) #' susie_get_objective(s, last_only=FALSE) #' susie_get_residual_variance(s) #' susie_get_prior_variance(s) #' susie_get_posterior_mean(s) #' susie_get_posterior_sd(s) #' susie_get_niter(s) #' susie_get_pip(s) #' susie_get_lfsr(s) #' #' @export #' susie_get_objective = function (res, last_only = TRUE, warning_tol = 1e-6) { if (!all(diff(res$elbo) >= (-1*warning_tol))) warning("Objective is decreasing") if (last_only) return(res$elbo[length(res$elbo)]) else return(res$elbo) } #' @rdname susie_get_methods #' #' @export #' susie_get_posterior_mean = function (res, prior_tol = 1e-9) { # Drop the single-effects with estimated prior of zero. if (is.numeric(res$V)) include_idx = which(res$V > prior_tol) else include_idx = 1:nrow(res$alpha) # Now extract relevant rows from alpha matrix. if (length(include_idx) > 0) return(colSums((res$alpha*res$mu)[include_idx,,drop=FALSE])/ res$X_column_scale_factors) else return(numeric(ncol(res$mu))) } #' @rdname susie_get_methods #' #' @export #' susie_get_posterior_sd = function (res, prior_tol = 1e-9) { # Drop the single-effects with estimated prior of zero. if (is.numeric(res$V)) include_idx = which(res$V > prior_tol) else include_idx = 1:nrow(res$alpha) # Now extract relevant rows from alpha matrix. if (length(include_idx) > 0) return(sqrt(colSums((res$alpha * res$mu2 - (res$alpha*res$mu)^2)[include_idx,,drop=FALSE]))/ (res$X_column_scale_factors)) else return(numeric(ncol(res$mu))) } #' @rdname susie_get_methods #' #' @export #' susie_get_niter = function (res) res$niter #' @rdname susie_get_methods #' #' @export #' susie_get_prior_variance = function (res) res$V #' @rdname susie_get_methods #' #' @export #' susie_get_residual_variance = function (res) res$sigma2 #' @rdname susie_get_methods #' #' @importFrom stats pnorm #' #' @export #' susie_get_lfsr = function (res) { pos_prob = pnorm(0,mean = t(res$mu),sd = sqrt(res$mu2 - res$mu^2)) neg_prob = 1 - pos_prob return(1 - rowSums(res$alpha * t(pmax(pos_prob,neg_prob)))) } #' @rdname susie_get_methods #' #' @param susie_fit A susie fit, an output from \code{\link{susie}}. #' #' @param num_samples The number of draws from the posterior #' distribution. #' #' @importFrom stats rmultinom #' @importFrom stats rnorm #' #' @export #' susie_get_posterior_samples = function (susie_fit, num_samples) { # Remove effects having estimated prior variance equals zero. if (is.numeric(susie_fit$V)) include_idx = which(susie_fit$V > 1e-9) else include_idx = 1:nrow(susie_fit$alpha) posterior_mean = sweep(susie_fit$mu,2,susie_fit$X_column_scale_factors,"/") posterior_sd = sweep(sqrt(susie_fit$mu2 - (susie_fit$mu)^2),2, susie_fit$X_column_scale_factors,"/") pip = susie_fit$alpha L = nrow(pip) num_snps = ncol(pip) b_samples = matrix(as.numeric(NA),num_snps,num_samples) gamma_samples = matrix(as.numeric(NA),num_snps,num_samples) for (sample_i in 1:num_samples) { b = 0 if (length(include_idx) > 0) { for (l in include_idx) { gamma_l = rmultinom(1,1,pip[l,]) effect_size = rnorm(1,mean = posterior_mean[l,which(gamma_l != 0)], sd = posterior_sd[l,which(gamma_l != 0)]) b_l = gamma_l * effect_size b = b + b_l } } b_samples[, sample_i] = b gamma_samples[, sample_i] = as.numeric(b != 0) } return(list(b = b_samples,gamma = gamma_samples)) } #' @rdname susie_get_methods #' #' @param X n by p matrix of values of the p variables (covariates) in #' n samples. When provided, correlation between variables will be #' computed and used to remove CSs whose minimum correlation among #' variables is smaller than \code{min_abs_corr}. #' #' @param Xcorr p by p matrix of correlations between variables #' (covariates). When provided, it will be used to remove CSs whose #' minimum correlation among variables is smaller than #' \code{min_abs_corr}. #' #' @param coverage A number between 0 and 1 specifying desired #' coverage of each CS. #' #' @param min_abs_corr A "purity" threshold for the CS. Any CS that #' contains a pair of variables with correlation less than this #' threshold will be filtered out and not reported. #' #' @param dedup If \code{dedup = TRUE}, remove duplicate CSs. #' #' @param squared If \code{squared = TRUE}, report min, mean and #' median of squared correlation instead of the absolute correlation. #' #' @param check_symmetric If \code{check_symmetric = TRUE}, perform a #' check for symmetry of matrix \code{Xcorr} when \code{Xcorr} is #' provided (not \code{NULL}). #' #' @param n_purity The maximum number of credible set (CS) variables #' used in calculating the correlation (\dQuote{purity}) #' statistics. When the number of variables included in the CS is #' greater than this number, the CS variables are randomly subsampled. #' #' @param use_rfast Use the Rfast package for the purity calculations. #' By default \code{use_rfast = TRUE} if the Rfast package is #' installed. #' #' @importFrom crayon red #' #' @export #' susie_get_cs = function (res, X = NULL, Xcorr = NULL, coverage = 0.95, min_abs_corr = 0.5, dedup = TRUE, squared = FALSE, check_symmetric = TRUE, n_purity = 100, use_rfast) { if (!is.null(X) && !is.null(Xcorr)) stop("Only one of X or Xcorr should be specified") if (check_symmetric){ if (!is.null(Xcorr) && !is_symmetric_matrix(Xcorr)) { message(red("Xcorr is not symmetric; forcing Xcorr to be symmetric ", "by replacing Xcorr with (Xcorr + t(Xcorr))/2")) Xcorr = Xcorr + t(Xcorr) Xcorr = Xcorr/2 } } null_index = 0 include_idx = rep(TRUE,nrow(res$alpha)) if (!is.null(res$null_index)) null_index = res$null_index if (is.numeric(res$V)) include_idx = res$V > 1e-9 # L x P binary matrix. status = in_CS(res$alpha,coverage) # L-list of CS positions. cs = lapply(1:nrow(status),function(i) which(status[i,]!=0)) claimed_coverage = sapply(1:length(cs), function (i) sum(res$alpha[i,][cs[[i]]])) include_idx = include_idx * (lapply(cs,length) > 0) # FIXME: see issue 21 # https://github.com/stephenslab/susieR/issues/21 if (dedup) include_idx = include_idx * (!duplicated(cs)) include_idx = as.logical(include_idx) if (sum(include_idx) == 0) return(list(cs = NULL, coverage = NULL, requested_coverage = coverage)) cs = cs[include_idx] claimed_coverage = claimed_coverage[include_idx] # Compute and filter by "purity". if (missing(use_rfast)) use_rfast = requireNamespace("Rfast",quietly = TRUE) if (is.null(Xcorr) && is.null(X)) { names(cs) = paste0("L",which(include_idx)) return(list(cs = cs, coverage = claimed_coverage, requested_coverage = coverage)) } else { purity = NULL for (i in 1:length(cs)) { if (null_index > 0 && null_index %in% cs[[i]]) purity = rbind(purity,c(-9,-9,-9)) else purity = rbind(purity, matrix(get_purity(cs[[i]],X,Xcorr,squared,n_purity,use_rfast),1,3)) } purity = as.data.frame(purity) if (squared) colnames(purity) = c("min.sq.corr","mean.sq.corr","median.sq.corr") else colnames(purity) = c("min.abs.corr","mean.abs.corr","median.abs.corr") threshold = ifelse(squared,min_abs_corr^2,min_abs_corr) is_pure = which(purity[,1] >= threshold) if (length(is_pure) > 0) { cs = cs[is_pure] purity = purity[is_pure,] row_names = paste0("L",which(include_idx)[is_pure]) names(cs) = row_names rownames(purity) = row_names # Re-order CS list and purity rows based on purity. ordering = order(purity[,1],decreasing = TRUE) return(list(cs = cs[ordering], purity = purity[ordering,], cs_index = which(include_idx)[is_pure[ordering]], coverage = claimed_coverage[ordering], requested_coverage=coverage)) } else return(list(cs = NULL,coverage = NULL,requested_coverage = coverage)) } } #' @title Get Correlations Between CSs, using Variable with Maximum PIP From Each CS #' #' @description This function evaluates the correlation between single effect #' CSs. It is not part of the SuSiE inference. Rather, it is designed as #' a diagnostic tool to assess how correlated the reported CS are. #' #' @param model A SuSiE fit, typically an output from #' \code{\link{susie}} or one of its variants. #' #' @param X n by p matrix of values of the p variables (covariates) in #' n samples. When provided, correlation between variables will be #' computed and used to remove CSs whose minimum correlation among #' variables is smaller than \code{min_abs_corr}. #' #' @param Xcorr p by p matrix of correlations between variables #' (covariates). When provided, it will be used to remove CSs whose #' minimum correlation among variables is smaller than #' \code{min_abs_corr}. #' #' @param max When \code{max = FAFLSE}, return a matrix of CS #' correlations. When \code{max = TRUE}, return only the maximum #' absolute correlation among all pairs of correlations. #' #' @return A matrix of correlations between CSs, or the maximum #' absolute correlation when \code{max = TRUE}. #' #' @importFrom crayon red #' #' @export #' get_cs_correlation = function (model, X = NULL, Xcorr = NULL, max = FALSE) { if (is.null(model$sets$cs) || length(model$sets$cs) == 1) return(NA) if (!is.null(X) && !is.null(Xcorr)) stop("Only one of X or Xcorr should be specified") if (is.null(Xcorr) && is.null(X)) stop("One of X or Xcorr must be specified") if (!is.null(Xcorr) && !is_symmetric_matrix(Xcorr)) { message(red("Xcorr is not symmetric; forcing Xcorr to be symmetric ", "by replacing Xcorr with (Xcorr + t(Xcorr))/2")) Xcorr = Xcorr + t(Xcorr) Xcorr = Xcorr/2 } # Get index for the best PIP per CS max_pip_idx = sapply(model$sets$cs, function(cs) cs[which.max(model$pip[cs])]) if (is.null(Xcorr)) { X_sub = X[,max_pip_idx] cs_corr = muffled_corr(as.matrix(X_sub)) } else { cs_corr = Xcorr[max_pip_idx, max_pip_idx] } if (max) { cs_corr = max(abs(cs_corr[upper.tri(cs_corr)])) } return(cs_corr) } #' @rdname susie_get_methods #' #' @param prune_by_cs Whether or not to ignore single effects not in #' a reported CS when calculating PIP. #' #' @param prior_tol Filter out effects having estimated prior variance #' smaller than this threshold. #' #' @export #' susie_get_pip = function (res, prune_by_cs = FALSE, prior_tol = 1e-9) { if (inherits(res,"susie")) { # Drop null weight columns. if (!is.null(res$null_index) && res$null_index > 0) res$alpha = res$alpha[,-res$null_index,drop=FALSE] # Drop the single-effects with estimated prior of zero. if (is.numeric(res$V)) include_idx = which(res$V > prior_tol) else include_idx = 1:nrow(res$alpha) # Only consider variables in reported CS. # This is not what we do in the SuSiE paper. # So by default prune_by_cs = FALSE means we do not run the # following code. if (!is.null(res$sets$cs_index) && prune_by_cs) include_idx = intersect(include_idx,res$sets$cs_index) if (is.null(res$sets$cs_index) && prune_by_cs) include_idx = numeric(0) # now extract relevant rows from alpha matrix if (length(include_idx) > 0) res = res$alpha[include_idx,,drop = FALSE] else res = matrix(0,1,ncol(res$alpha)) } return(as.vector(1 - apply(1 - res,2,prod))) } # Find how many variables in the CS. # x is a probability vector. #' @keywords internal n_in_CS_x = function (x, coverage = 0.9) sum(cumsum(sort(x,decreasing = TRUE)) < coverage) + 1 # Return binary vector indicating if each point is in CS. # x is a probability vector. #' @keywords internal in_CS_x = function (x, coverage = 0.9) { n = n_in_CS_x(x,coverage) o = order(x,decreasing = TRUE) result = rep(0,length(x)) result[o[1:n]] = 1 return(result) } # Returns an l-by-p binary matrix indicating which variables are in # susie credible sets. #' @keywords internal in_CS = function (res, coverage = 0.9) { if (inherits(res,"susie")) res = res$alpha return(t(apply(res,1,function(x) in_CS_x(x,coverage)))) } #' @keywords internal n_in_CS = function(res, coverage = 0.9) { if (inherits(res,"susie")) res = res$alpha return(apply(res,1,function(x) n_in_CS_x(x,coverage))) } # Subsample and compute min, mean, median and max abs corr. # #' @importFrom stats median get_purity = function (pos, X, Xcorr, squared = FALSE, n = 100, use_rfast) { if (missing(use_rfast)) use_rfast = requireNamespace("Rfast",quietly = TRUE) if (use_rfast) { get_upper_tri = Rfast::upper_tri get_median = Rfast::med } else { get_upper_tri = function (R) R[upper.tri(R)] get_median = stats::median } if (length(pos) == 1) return(c(1,1,1)) else { # Subsample the columns if necessary. if (length(pos) > n) pos = sample(pos,n) if (is.null(Xcorr)) { X_sub = X[,pos] X_sub = as.matrix(X_sub) value = abs(get_upper_tri(muffled_corr(X_sub))) } else value = abs(get_upper_tri(Xcorr[pos,pos])) if (squared) value = value^2 return(c(min(value), sum(value)/length(value), get_median(value))) } } # Correlation function with specified warning muffled. # #' @importFrom stats cor muffled_corr = function (x) withCallingHandlers(cor(x), warning = function(w) { if (grepl("the standard deviation is zero",w$message)) invokeRestart("muffleWarning") }) # cov2cor function with specified warning muffled. # #' @importFrom stats cov2cor #' @keywords internal muffled_cov2cor = function (x) withCallingHandlers(cov2cor(x), warning = function(w) { if (grepl("had 0 or NA entries; non-finite result is doubtful", w$message)) invokeRestart("muffleWarning") }) # Check for symmetric matrix. #' @keywords internal is_symmetric_matrix = function (x) { if (requireNamespace("Rfast",quietly = TRUE)) return(Rfast::is.symmetric(x)) else return(isSymmetric(x)) } # Compute standard error for regression coef. # S = (X'X)^-1 \Sigma #' @keywords internal calc_stderr = function (X, residuals) sqrt(diag(sum(residuals^2)/(nrow(X) - 2) * chol2inv(chol(crossprod(X))))) # Return residuals of Y after removing the linear effects of the susie # model. # #' @importFrom stats coef #' @keywords internal get_R = function (X, Y, s) Y - X %*% coef(s) # Slim the result of fitted susie model. #' @keywords internal susie_slim = function (res) list(alpha = res$alpha,niter = res$niter,V = res$V,sigma2 = res$sigma2) # Prune single effects to given number L in susie model object. #' @keywords internal susie_prune_single_effects = function (s,L = 0,V = NULL) { num_effects = nrow(s$alpha) if (L == 0) { # Filtering will be based on non-zero elements in s$V. if (!is.null(s$V)) L = length(which(s$V > 0)) else L = num_effects } if (L == num_effects) { s$sets = NULL return(s) } if (!is.null(s$sets$cs_index)) effects_rank = c(s$sets$cs_index,setdiff(1:num_effects,s$sets$cs_index)) else effects_rank = 1:num_effects if (L > num_effects) { message(paste("Specified number of effects L =",L, "is greater the number of effects",num_effects, "in input SuSiE model. The SuSiE model will be expanded to have",L, "effects.")) s$alpha = rbind(s$alpha[effects_rank,], matrix(1/ncol(s$alpha),L - num_effects,ncol(s$alpha))) for (n in c("mu","mu2","lbf_variable")) if (!is.null(s[[n]])) s[[n]] = rbind(s[[n]][effects_rank,], matrix(0,L - num_effects,ncol(s[[n]]))) for (n in c("KL", "lbf")) if (!is.null(s[[n]])) s[[n]] = c(s[[n]][effects_rank],rep(NA, L-num_effects)) if (!is.null(V)) { if (length(V) > 1) V[1:num_effects] = s$V[effects_rank] else V = rep(V,L) } s$V = V } s$sets = NULL return(s) } #' @title Estimate s in \code{susie_rss} Model Using Regularized LD #' #' @description The estimated s gives information about the #' consistency between the z scores and LD matrix. A larger \eqn{s} #' means there is a strong inconsistency between z scores and LD #' matrix. The \dQuote{null-mle} method obtains mle of \eqn{s} under #' \eqn{z | R ~ N(0,(1-s)R + s I)}, \eqn{0 < s < 1}. The #' \dQuote{null-partialmle} method obtains mle of \eqn{s} under #' \eqn{U^T z | R ~ N(0,s I)}, in which \eqn{U} is a matrix containing #' the of eigenvectors that span the null space of R; that is, the #' eigenvectors corresponding to zero eigenvalues of R. The estimated #' \eqn{s} from \dQuote{null-partialmle} could be greater than 1. The #' \dQuote{null-pseudomle} method obtains mle of \eqn{s} under #' pseudolikelihood \eqn{L(s) = \prod_{j=1}^{p} p(z_j | z_{-j}, s, #' R)}, \eqn{0 < s < 1}. #' #' @param z A p-vector of z scores. #' #' @param R A p by p symmetric, positive semidefinite correlation #' matrix. #' #' @param r_tol Tolerance level for eigenvalue check of positive #' semidefinite matrix of R. #' #' @param method a string specifies the method to estimate \eqn{s}. #' #' @return A number between 0 and 1. #' #' @examples #' set.seed(1) #' n = 500 #' p = 1000 #' beta = rep(0,p) #' beta[1:4] = 0.01 #' X = matrix(rnorm(n*p),nrow = n,ncol = p) #' X = scale(X,center = TRUE,scale = TRUE) #' y = drop(X %*% beta + rnorm(n)) #' input_ss = compute_suff_stat(X,y,standardize = TRUE) #' ss = univariate_regression(X,y) #' R = cor(X) #' attr(R,"eigen") = eigen(R, symmetric = TRUE) #' zhat = with(ss,betahat/sebetahat) #' s = estimate_s_rss(zhat, R) #' #' @importFrom stats dnorm #' @importFrom stats optim #' #' @export #' estimate_s_rss = function (z, R, r_tol = 1e-08, method = "null-mle") { if (is.null(attr(R,"eigen"))) attr(R,"eigen") = eigen(R,symmetric = TRUE) eigenld = attr(R,"eigen") if(any(eigenld$values < -r_tol)) warning("The matrix R is not positive semidefinite. Negative ", "eigenvalues are set to zero") eigenld$values[eigenld$values < r_tol] = 0 if (method == "null-mle") { negloglikelihood = function(s, z, eigenld) 0.5 * sum(log((1-s)*eigenld$values + s)) + 0.5 * sum(z * eigenld$vectors %*% ((t(eigenld$vectors) * (1/((1-s)*eigenld$values + s))) %*% z)) s = optim(0.5,fn = negloglikelihood,z = z,eigenld = eigenld, method = "Brent",lower = 0,upper = 1)$par } else if (method == "null-partialmle") { colspace = which(eigenld$values > 0) if (length(colspace) == length(z)) s = 0 else{ znull = crossprod(eigenld$vectors[,-colspace], z) # U2^T z s = sum(znull^2)/length(znull) } } else if (method == "null-pseudomle") { pseudolikelihood = function(s, z, eigenld) { precision = eigenld$vectors %*% (t(eigenld$vectors) * (1/((1-s)*eigenld$values + s))) postmean = rep(0,length(z)) postvar = rep(0,length(z)) for (i in 1:length(z)) { postmean[i] = -(1/precision[i,i])*precision[i,-i] %*% z[-i] postvar[i] = 1/precision[i,i] } return(-sum(dnorm(z,mean = postmean,sd = sqrt(postvar),log = TRUE))) } s = optim(0.5,fn = pseudolikelihood,z = z,eigenld = eigenld, method = "Brent",lower = 0,upper = 1)$par } else stop("The method is not implemented") return(s) } #' @title Compute Distribution of z-scores of Variant j Given Other z-scores, and Detect Possible Allele Switch Issue #' #' @description Under the null, the rss model with regularized LD #' matrix is \eqn{z|R,s ~ N(0, (1-s)R + s I))}. We use a mixture of #' normals to model the conditional distribution of z_j given other z #' scores, \eqn{z_j | z_{-j}, R, s ~ \sum_{k=1}^{K} \pi_k #' N(-\Omega_{j,-j} z_{-j}/\Omega_{jj}, \sigma_{k}^2/\Omega_{jj})}, #' \eqn{\Omega = ((1-s)R + sI)^{-1}}, \eqn{\sigma_1, ..., \sigma_k} #' is a grid of fixed positive numbers. We estimate the mixture #' weights \eqn{\pi} We detect the possible allele switch issue #' using likelihood ratio for each variant. #' #' @param z A p-vector of z scores. #' #' @param R A p by p symmetric, positive semidefinite correlation #' matrix. #' #' @param r_tol Tolerance level for eigenvalue check of positive #' semidefinite matrix of R. #' #' @param s an estimated s from \code{estimate_s_rss} #' #' @return a list containing a ggplot2 plot object and a table. The plot #' compares observed z score vs the expected value. The possible allele #' switched variants are labeled as red points (log LR > 2 and abs(z) > 2). #' The table summarizes the conditional distribution for each variant #' and the likelihood ratio test. The table has the following columns: #' the observed z scores, the conditional expectation, the conditional #' variance, the standardized differences between the observed z score #' and expected value, the log likelihood ratio statistics. #' #' @importFrom stats dnorm #' @importFrom ggplot2 ggplot #' @importFrom ggplot2 geom_point #' @importFrom ggplot2 geom_abline #' @importFrom ggplot2 theme_bw #' @importFrom ggplot2 labs #' @importFrom ggplot2 aes #' @importFrom mixsqp mixsqp #' #' @examples #' # See also the vignette, "Diagnostic for fine-mapping with summary #' # statistics." #' set.seed(1) #' n = 500 #' p = 1000 #' beta = rep(0,p) #' beta[1:4] = 0.01 #' X = matrix(rnorm(n*p),nrow = n,ncol = p) #' X = scale(X,center = TRUE,scale = TRUE) #' y = drop(X %*% beta + rnorm(n)) #' ss = univariate_regression(X,y) #' R = cor(X) #' attr(R,"eigen") = eigen(R, symmetric = TRUE) #' zhat = with(ss,betahat/sebetahat) #' cond_dist = kriging_rss(zhat, R) #' cond_dist$plot #' #' @export #' kriging_rss = function (z, R, r_tol = 1e-08, s = estimate_s_rss(z,R,r_tol,method = "null-mle")) { if (is.null(attr(R,"eigen"))) attr(R,"eigen") = eigen(R,symmetric = TRUE) eigenld = attr(R,"eigen") if (any(eigenld$values < -r_tol)) warning("The matrix R is not positive semidefinite. Negative ", "eigenvalues are set to zero.") eigenld$values[eigenld$values < r_tol] = 0 if (s > 1) { warning("The given s is greater than 1. We replace it with 0.8.") s = 0.8 } if (s < 0) stop("The s must be non-negative") dinv = 1/((1-s)*eigenld$values + s) dinv[is.infinite(dinv)] = 0 precision = eigenld$vectors %*% (t(eigenld$vectors) * dinv) condmean = rep(0,length(z)) condvar = rep(0,length(z)) for(i in 1:length(z)){ condmean[i] = -(1/precision[i,i]) * precision[i,-i] %*% z[-i] condvar[i] = 1/precision[i,i] } z_std_diff = (z-condmean)/sqrt(condvar) # obtain grid a_min = 0.8 if (max(z_std_diff^2) < 1){ a_max = 2 }else{ a_max = 2*sqrt(max(z_std_diff^2)) } npoint = ceiling(log2(a_max/a_min)/log2(1.05)) a_grid = 1.05^((-npoint):0) * a_max # compute likelihood sd_mtx = outer(sqrt(condvar),a_grid) matrix_llik = dnorm(z - condmean,sd = sd_mtx,log = TRUE) lfactors = apply(matrix_llik,1,max) matrix_llik = matrix_llik - lfactors # estimate weight w = mixsqp(matrix_llik,log = TRUE,control = list(verbose = FALSE))$x logl0mix = as.numeric(log(exp(matrix_llik) %*% w)) + lfactors matrix_llik = dnorm(z + condmean, sd=sd_mtx, log = TRUE) lfactors = apply(matrix_llik,1,max) matrix_llik = matrix_llik - lfactors logl1mix = as.numeric(log(exp(matrix_llik) %*% w)) + lfactors logLRmix = logl1mix - logl0mix res = data.frame(z = z,condmean = condmean,condvar = condvar, z_std_diff = z_std_diff,logLR = logLRmix) p = ggplot(res) + geom_point(aes(y = z, x = condmean)) + labs(y = "Observed z scores", x = "Expected value") + geom_abline(intercept = 0, slope = 1) + theme_bw() idx = which(logLRmix > 2 & abs(z) > 2) if(length(idx) > 0) { p = p + geom_point(data = res[idx,], aes(y = z, x = condmean),col = "red") } return(list(plot = p, conditional_dist = res)) } # Compute the column means of X, the column standard deviations of X, # and rowSums(Y^2), where Y is the centered and/or scaled version of # X. # #' @importFrom Matrix rowSums #' @importFrom Matrix colMeans compute_colstats = function (X, center = TRUE, scale = TRUE) { n = nrow(X) p = ncol(X) if (!is.null(attr(X,"matrix.type"))) { # X is a trend filtering matrix. cm = compute_tf_cm(attr(X,"order"),p) csd = compute_tf_csd(attr(X,"order"),p) d = compute_tf_d(attr(X,"order"),p,cm,csd,scale,center) if (!center) cm = rep(0,p) if (!scale) csd = rep(1,p) } else { # X is an ordinary dense or sparse matrix. Set sd = 1 when the # column has variance 0. if (center) cm = colMeans(X,na.rm = TRUE) else cm = rep(0,p) if (scale) { csd = compute_colSds(X) csd[csd == 0] = 1 } else csd = rep(1,p) # These two lines of code should give the same result as # # Y = (t(X) - cm)/csd # d = rowSums(Y^2) # # for all four combinations of "center" and "scale", but do so # without having to modify X, or create copies of X in memory. In # particular the first line should be equivalent to colSums(X^2). d = n*colMeans(X)^2 + (n-1)*compute_colSds(X)^2 d = (d - n*cm^2)/csd^2 } return(list(cm = cm,csd = csd,d = d)) } # @title computes column standard deviations for any type of matrix # @details This should give the same result as matrixStats::colSds(X), # but allows for sparse matrices as well as dense ones. # @param X an n by p matrix of any type, e.g. sparse, dense. # @return a p vector of column standard deviations. # #' @importFrom Matrix rowSums #' @importFrom Matrix colSums #' @importFrom Matrix rowMeans #' @importFrom matrixStats colSds compute_colSds = function(X) { if (is.matrix(X)) y = colSds(X) else { n = nrow(X) X = t(X) X = X - rowMeans(X) y = sqrt(rowSums(X^2)/(n-1)) } return(y) } # @title Check whether A is positive semidefinite # @param A a symmetric matrix # @return a list of result: # \item{matrix}{The matrix with eigen decomposition} # \item{status}{whether A is positive semidefinite} # \item{eigenvalues}{eigenvalues of A truncated by r_tol} check_semi_pd = function (A, tol) { attr(A,"eigen") = eigen(A,symmetric = TRUE) v = attr(A,"eigen")$values v[abs(v) < tol] = 0 return(list(matrix = A, status = !any(v < 0), eigenvalues = v)) } # @title Check whether b is in space spanned by the non-zero eigenvectors # of A # @param A a p by p matrix # @param b a length p vector # @return a list of result: # \item{status}{whether b in space spanned by the non-zero # eigenvectors of A} # \item{msg}{msg gives the difference between the projected b and b if # status is FALSE} check_projection = function (A, b) { if (is.null(attr(A,"eigen"))) attr(A,"eigen") = eigen(A,symmetric = TRUE) v = attr(A,"eigen")$values B = attr(A,"eigen")$vectors[,v > .Machine$double.eps] msg = all.equal(as.vector(B %*% crossprod(B,b)),as.vector(b), check.names = FALSE) if (!is.character(msg)) return(list(status = TRUE,msg = NA)) else return(list(status = FALSE,msg = msg)) } susieR/MD50000644000176200001440000002563214143515472012052 0ustar liggesusers0159a67881b724197a3395e046b6d95d *DESCRIPTION a3be5243a96b6322f0f3e12b50b7f0bc *LICENSE 9e830d627d55a2a34c7ee12fe820ffcf *NAMESPACE 876e55a16516d2090e0896ee7336f14a *R/compute_ss.R 8fec294bde16d62458945ddbc05d5cba *R/data.R 66de9387436da126035171198c0d3ec6 *R/elbo.R 1f8e6e822ed400f480e1b9619bd24bfc *R/elbo_rss.R b43d4f306fb1cfe6eff7faee0544c239 *R/elbo_ss.R 1596835bbfbd49fa531267a27cacd25d *R/estimate_residual_variance.R 338fa7b1a1046c03782a8141a5678e8b *R/initialize.R 749e003b08da519012d6cc8448dea9da *R/initialize_rss.R df6d433909cc86f2c2647b26d386b2b0 *R/predict.susie.R 7f7e4202a663c07f87875d8c7d9e7cbc *R/remove_null_effects.R 99ea33d5c27ff438aa5d6408bb6d0ae6 *R/set_R_attributes.R b440c12fc37b3a4c33f37b55c0dcdc78 *R/single_effect_regression.R 2d5d9b6ea1e706321d2c7a8bb47b92fe *R/single_effect_regression_rss.R c9a04a1b9d80830802906d9bc3a8f1de *R/single_effect_regression_ss.R 58f7f3431bd183a596e387e934a6779f *R/sparse_multiplication.R 5fb69a54bc552f32672b95155d2f563d *R/summary.susie.R 5bbbbf707c469f8242c18344792cc25d *R/susie.R e0ef681901465d24f47f9139cb2c086a *R/susieR-package.R d27fbda5b06f87333e617d52d0be0b25 *R/susie_plot_changepoint.R 173a09862e3284872dc4c715253609e1 *R/susie_plots.R 3093d911c075ecdde1a957ddb31a8c20 *R/susie_rss.R 2036752730983a94d21a2c2711adbf78 *R/susie_rss_lambda.R 44db06bf4176c76bdb3df90075bf1842 *R/susie_ss.R 25ef9bc05025a082bb667a11839edfc2 *R/susie_trendfilter.R 2b802f6519186fe9301d43dc8411fd5d *R/susie_utils.R da77e89b41857ad08a0248a4599ac567 *R/susie_zzz_auto.R 7f10f37aaaed6dbfe4a473e7ba2f2cc7 *R/trend_filtering_multiplication.R d909b04c45682cf71d7b4ab483806f23 *R/univariate_regression.R f80da19037525461aa519e7111bd7430 *R/update_each_effect.R 33b8522a20dfd18abf1826b09ab973b6 *R/update_each_effect_rss.R 88d31baf0f9b67e8b71af983da35eeaf *R/update_each_effect_ss.R 37e0cf9fc9e2de3331609bc4eb4962d2 *README.md 10ba2ad436290c1bf096911bc7ee9541 *build/partial.rdb f7ac382a75fdceb2a492509f530f6629 *build/vignette.rds 6f94bc2019fd6794a159a32c0c90ee44 *data/FinemappingConvergence.RData 61376f255dd2f40420a96191c04f8aa2 *data/N2finemapping.RData 96362a90fc55f3497c82b2df8238d5b0 *data/N3finemapping.RData 8bda8428d1ec33c6532164061a2418fb *data/SummaryConsistency.RData 4ffe4de2b91dd08c42acd8621707990d *inst/CITATION 055877603aa7eb964c256198acebf53e *inst/analysis/optimize.Rmd abe7af4381abc51da356118e308f5642 *inst/analysis/test_susie_auto.Rmd 5aaee5b393ac8af120d65092042ab6cb *inst/analysis/testing.Rmd c734e74dd9fd1bf669701c5aaf747a7c *inst/code/caviar.R 02692f7642b659ea87a0048e70300fdb *inst/code/compute_ss_memory.R 58b5976fa2773a46e2b380aa6fa94f99 *inst/code/dap-g.py 0c68bb7496e0781bdee112427f04fd46 *inst/code/finemap.R c3030417a7707071de218c9284ed12b8 *inst/code/finemap_1p4.R c940915206e96508fb8ef34af4142fe3 *inst/code/gen_original_results.R a028cf38ac54be84c96157305b9defb7 *inst/code/monitor_memory.py 740085e45b6b363a3e6dafa40049217b *inst/code/sparse_matrix_strategy.Rmd 912254064afe7df2d019ac2373e0c146 *inst/code/susie_memory.R de7972e1caa01efe9ad0f95cb5e59450 *inst/code/susie_rss_memory.R 2eaafa198851004938f32bf2a6817d31 *inst/datafiles/N3finemapping.CAVIAR.RData 270949bf51a2c3fe6069901152d68360 *inst/datafiles/N3finemapping.DAP.RData 0a8062f7f5435e89fcc7f629d0f3a332 *inst/datafiles/N3finemapping.FINEMAP.RData e04f02280cc36a9f614096908d53084c *inst/doc/finemapping.R 859dc36dcc298d345decafef4163ba35 *inst/doc/finemapping.Rmd e73a27e74d7064f958ae26da12190f70 *inst/doc/finemapping.html 9c94c15440111f87a953419a0b13c8f7 *inst/doc/finemapping_summary_statistics.R d78ebf84658f611420112e23688c22af *inst/doc/finemapping_summary_statistics.Rmd ef8227e911069a9559160d7874cd74d2 *inst/doc/finemapping_summary_statistics.html 57611455618bd6180cfc2c23aaf4d286 *inst/doc/l0_initialization.R 5cc4f68e16d9a9b2dadc1d6b1158e0c1 *inst/doc/l0_initialization.Rmd 8c0a7e2401a71569dc03315860a78114 *inst/doc/l0_initialization.html 847f3d38c652363bfefafb6b41dd33b8 *inst/doc/mwe.R dd4899d3f6c1d8771df2df2ec82e9281 *inst/doc/mwe.Rmd 26436c18736fe0bdc9601ebe088def73 *inst/doc/mwe.html b2479c2657e4c4fb2c9ea8ac2bb54d12 *inst/doc/sparse_susie_eval.R c207a8c9000f7b33ddfb15902112636b *inst/doc/sparse_susie_eval.Rmd 5e65351436229b8d74dab627398ccbe7 *inst/doc/sparse_susie_eval.html 57bd54e20dbf25fa0acc1f67a41d8087 *inst/doc/susie_refine.R 7b6be764908d669ed91bcd44de590c26 *inst/doc/susie_refine.Rmd c3546c6574b5be1d7a1ed1318dc7172d *inst/doc/susie_refine.html d8c6c53d46aaa9627657e96fb92f61c3 *inst/doc/susierss_diagnostic.R ae9951c27dcfcf8544edae2a2a3d24ed *inst/doc/susierss_diagnostic.Rmd 481577f0a13ffb250e27ae49b26bb71c *inst/doc/susierss_diagnostic.html f6843e7ba9577a8944441986dbdaf6ee *inst/doc/trend_filtering.R e44146ea74e39426234769df27b777da *inst/doc/trend_filtering.Rmd 67c197e8291197e98450c349fb2b571c *inst/doc/trend_filtering.html 9798c9e4714beec667ed3e254b146401 *inst/doc/trendfiltering_derivations.Rnw ce8521d51cc062a4f48e489fbaadec1b *inst/doc/trendfiltering_derivations.pdf 5ef7ec32160a728a8e0421664a22884a *inst/misc/post-commit.sh 2db00a6441f8de02698d0a6aede1f6c9 *inst/misc/pre-commit.sh 1720cb8fd23930dc3e7045c9d8e16f1e *man/FinemappingConvergence.Rd e763f77c72fa6944f1c2bb6bce6ed2b6 *man/N2finemapping.Rd 35b0bb59b9350e897d43c597990ff626 *man/N3finemapping.Rd 02ad26632873d5b7a577c9ed9d04f910 *man/SummaryConsistency.Rd b85fc88bd1e6f7346601bf954f32d388 *man/coef.susie.Rd 9244037f4de7f2995a8133f6a108e76c *man/compute_ss.Rd 654c21a0db37d1ea582e2bc3ae259d23 *man/compute_suff_stat.Rd 0263103422b1fd58011efdb3af17ab2a *man/estimate_s_rss.Rd 497da300fa0189f122d5fa25cd7adc7a *man/get_cs_correlation.Rd 2c0ce1b361c32f72226d3c84ba0d5269 *man/kriging_rss.Rd 9b76bea17819c05458c65d8357744e0f *man/predict.susie.Rd df3259511ae91d3f022331a4252e7df0 *man/single_effect_regression.Rd 38fcf364c50e011ab8996b9d495670e6 *man/summary.susie.Rd fa05b3ae9b8d92a2f17a3e2dfdec43b1 *man/susie.Rd 159140d01bf2c2adb134f2e4b79dfdd6 *man/susieR-package.Rd 6685782d373ee0516221d0972f5e0e5f *man/susie_auto.Rd 5e0be3024c414a4cbcf288f65903d92c *man/susie_get_methods.Rd c7ea1c7808d619acd070840f622eae2c *man/susie_init_coef.Rd 2ec9ee36c9eb5edca737de1d42f5ee8a *man/susie_plot_changepoint.Rd a2143177260a97bf973554e3c9b719ca *man/susie_plots.Rd 818ddab9e7220c48a6a17f668fae6ab0 *man/susie_rss.Rd 75576ac542ebc86504162c114da8b39d *man/susie_trendfilter.Rd 979d2121e527a5bb587e9a6df64e4fdf *man/univariate_regression.Rd 0feb689a4008d1303d5e38f641332584 *tests/README.md 9e57750da8ea08e98bb12218b20dc650 *tests/testthat.R 641aa8e6bbf5a81243c7c25f08f4ebd8 *tests/testthat/ER2_original_res.rds db86460c48caeb98522a147915ab6d56 *tests/testthat/ER2_rss_lambda0_res.rds bb4e54e9abf6f40e0cb5ce8ba700380b *tests/testthat/ER2_rss_lambda1_res.rds ceec7a57ce1ffa3bb0c22b2ce3ad2d13 *tests/testthat/Eloglik_original_res.rds 58f8aba120e11d59a3eca0ae427ac244 *tests/testthat/Eloglik_rss_lambda0_res.rds 156ba213386cd4cfa87e03ccee0dfd6a *tests/testthat/Eloglik_rss_lambda1_res.rds 52f91743306a8660179e4d0ca51ad2e8 *tests/testthat/SER_original_res.rds 57ec0e4dbbf13b7e5fbebc3cc7e82653 *tests/testthat/SER_rss_lambda0_res.rds 376b6e71bcab1844978ddc7a784aaab2 *tests/testthat/SER_rss_lambda1_res.rds 589846a8b3ce89afbc0709dc9eb90d1f *tests/testthat/est_V_debug.rds 72c092f4e41ab10e7aa6d9208c975ea3 *tests/testthat/helper_testthat.R e345bb717196a7d27aa5200bec69bd76 *tests/testthat/objective_original_res.rds 266ae5b06d135c242f507d5aa995d32e *tests/testthat/objective_rss_lambda0_res.rds 6d17fda36436dde063f7b6e53f6965e5 *tests/testthat/objective_rss_lambda1_res.rds f5f2da9ad0b2a1a90e8380fbfb8aea64 *tests/testthat/singleReg_original_res.rds e36128656466eca93f2c80005d888429 *tests/testthat/singleReg_rss_lambda0_res.rds 0cd6165f3d8ae6388a10526b9be2b023 *tests/testthat/singleReg_rss_lambda1_res.rds ccb9582205e0480715230135ce6a3455 *tests/testthat/susiefit_original_res.rds f6b82c192b1c4ff50a1a6c4e3418868e *tests/testthat/susiefit_original_res2.rds e9ae6aeaa424d458e4c29c2d48ba448d *tests/testthat/susiefit_original_res3.rds 2e7d1f9dd1029e389a2b0e71de0dd5f3 *tests/testthat/susiefit_original_res4.rds fd0afe6277489e0cbaa2dd2d74adedcc *tests/testthat/susierssfit_lambda0_res.rds b776e42c6e5fde08590a1af865803f97 *tests/testthat/susierssfit_lambda1_res.rds 57fb271cf938e53ba9a8f7ec1342a567 *tests/testthat/test_Eloglik.R a001e268d4692558718b83aa58dd7c70 *tests/testthat/test_Eloglik_rss.R e9e23b1315a03ab3fcc92c62d2c02116 *tests/testthat/test_SER_posterior_e_loglik.R c0c0e0550017e6f6ccf29c5616ad44d8 *tests/testthat/test_SER_posterior_e_loglik_rss.R 936ba383fad03cb0a1b6be32256ba788 *tests/testthat/test_comput_tf.R 96f99c788755ca3a08da70153036c8ad *tests/testthat/test_est_V.R 055030628a94d4ee6f24ebf3331defc6 *tests/testthat/test_get_ER2.R 23ed62870e2277c8b1241aae0e6757f6 *tests/testthat/test_get_ER2_rss.R 343ce829dd2c36d490d2a107c544f6c2 *tests/testthat/test_get_pip.R 87755a016ab4e737451244cb5feb8396 *tests/testthat/test_get_samples.R 855deb4f2a90003511dcac4a5df12f0e *tests/testthat/test_init.R 89ab77ee6bbeeafd7e569ff1a76fb977 *tests/testthat/test_intercept_standardize.R 8af8e92161cd582ffec3960372f0cca2 *tests/testthat/test_null_weight.R 4b61b24766e891bceb62dcee70a0bcf7 *tests/testthat/test_prior_weights.R 280c6f97da37f8fd5ddd08c70616e870 *tests/testthat/test_single_effect_regression.R 7ad0a407abae6fc4271dcc63849b3457 *tests/testthat/test_single_effect_regression_rss.R c4c71d7aac11155b4fed7b71bf785364 *tests/testthat/test_small_resid.R e283347cf2cd88f25517948438fbd104 *tests/testthat/test_sparse_multiplication.R 4c2b5e312098bd3fcaa900ff22d830d8 *tests/testthat/test_sparse_safe_colScale.R f4d591cb4aafc25b18c4251f6fb335bf *tests/testthat/test_susie.R 9838a25eeca6a1322309747a388954ea *tests/testthat/test_susie_XtX_Xty.R 88c480ae614781f0ad3d40fc147e91e5 *tests/testthat/test_susie_beta_se.R be08170e299942621e228664d0a65b18 *tests/testthat/test_susie_get_cs.R 8a9e21ea28eb17602a67eca3b70581f2 *tests/testthat/test_susie_get_objective.R c006a98e85dfed1b6322bafd5d3d8ec6 *tests/testthat/test_susie_rss.R 7fbf7a163ae3f7c15dc1ada50c91c8ad *tests/testthat/test_susie_rss_get_objective.R f33e5b8afda3a5b60f3f1e0d16c2fd0c *tests/testthat/test_susie_trendfilter.R 06d7cb90bd297b39e24cd32ce04b8be5 *tests/testthat/test_update_each_effect.R 128466df1e91cc350c912581ec186b3b *tests/testthat/test_update_each_effect_rss.R e326fce5c8e7db5a5cd7fe44c8cf80e9 *tests/testthat/vbupdate_original_res.rds 5c2587d93a66dd84a32e6453e26062a3 *tests/testthat/vbupdate_rss_lambda0_res.rds 348e39186218130a1dce2068fed80a9e *tests/testthat/vbupdate_rss_lambda1_res.rds 859dc36dcc298d345decafef4163ba35 *vignettes/finemapping.Rmd d78ebf84658f611420112e23688c22af *vignettes/finemapping_summary_statistics.Rmd 5cc4f68e16d9a9b2dadc1d6b1158e0c1 *vignettes/l0_initialization.Rmd dd4899d3f6c1d8771df2df2ec82e9281 *vignettes/mwe.Rmd c207a8c9000f7b33ddfb15902112636b *vignettes/sparse_susie_eval.Rmd 7b6be764908d669ed91bcd44de590c26 *vignettes/susie_refine.Rmd ae9951c27dcfcf8544edae2a2a3d24ed *vignettes/susierss_diagnostic.Rmd e44146ea74e39426234769df27b777da *vignettes/trend_filtering.Rmd 9798c9e4714beec667ed3e254b146401 *vignettes/trendfiltering_derivations.Rnw 8c9d761847070677be0c9acbeebf3690 *vignettes/trendfiltering_derivations.bib susieR/inst/0000755000176200001440000000000014143477740012514 5ustar liggesuserssusieR/inst/misc/0000755000176200001440000000000013542461263013442 5ustar liggesuserssusieR/inst/misc/pre-commit.sh0000744000176200001440000000265513371027166016063 0ustar liggesusers#!/bin/bash # # This script will be executed every time you run "git commit". It # will update the 4th digit of package version by revision number. # # To use this script, copy it to the .git/hooks directory of your # local repository to filename `pre-commit`, and make it executable. # ROOT_DIR=`git rev-parse --show-toplevel` MSG="[WARNING] Auto-versioning disabled because string 'Version: x.y.z.r' cannot be found in DESCRIPTION file." GREP_REGEX='^Version: [0-9]*\.[0-9]*\.[0-9]*\.[0-9]*' SED_REGEX='^Version: \([0-9]*\.[0-9]*\.[0-9]*\)\.[0-9]*' # `git diff HEAD` shows both staged and unstaged changes if [[ -z `git diff HEAD` ]] || [[ ! -f $ROOT_DIR/DESCRIPTION ]]; then exit 0 elif [[ -z `grep "$GREP_REGEX" $ROOT_DIR/DESCRIPTION` ]]; then echo -e "\e[1;31m$MSG\e[0m" else REV_ID=`git log --oneline | wc -l` REV_ID=`printf "%04d\n" $((REV_ID+1))` DATE=`date +%Y-%m-%d` echo "Version string bumped to revision $REV_ID on $DATE" sed -i "s/$SED_REGEX/Version: \1.$REV_ID/" $ROOT_DIR/DESCRIPTION sed -i "s/^Date: .*/Date: $DATE/" $ROOT_DIR/DESCRIPTION if [[ `git rev-parse --abbrev-ref HEAD` -eq "master" ]]; then cd $ROOT_DIR echo "Updating documentation ..." Rscript -e 'devtools::document()' &> /dev/null && git add man/*.Rd echo "Running unit tests ..." Rscript -e 'devtools::test()' Rscript -e 'library(susieR); tests = testthat::test_examples(".")' fi fi susieR/inst/misc/post-commit.sh0000744000176200001440000000126713364666256016273 0ustar liggesusers#!/bin/bash # # This script will be executed every time you run "git commit". It # will commit changes made to package DESCRIPTION by the pre-commit hook # # To use this script, copy it to the .git/hooks directory of your # local repository to filename `post-commit`, and make it executable. # ROOT_DIR=`git rev-parse --show-toplevel` # Only commit DESCRIPTION file when it is not staged (due to changes by pre-commit hook) if [[ -z `git diff HEAD` ]] || [[ ! -f $ROOT_DIR/DESCRIPTION ]] || [[ -z `git diff $ROOT_DIR/DESCRIPTION` ]]; then exit 0 else git add $ROOT_DIR/DESCRIPTION git commit --amend -C HEAD --no-verify echo "Amend current commit to incorporate version bump" fi susieR/inst/doc/0000755000176200001440000000000014143477740013261 5ustar liggesuserssusieR/inst/doc/finemapping.Rmd0000644000176200001440000001355514112242336016216 0ustar liggesusers--- title: "Fine-mapping example" author: "Gao Wang" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Fine-mapping example} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ``` This vignette demonstrates `susieR` in the context of genetic fine-mapping. We use simulated data of expression level of a gene ($y$) in $N \approx 600$ individuals. We want to identify with the genotype matrix $X_{N\times P}$ ($P=1001$) the genetic variables that causes changes in expression level. The simulated data set is simulated to have exactly 3 non-zero effects. ```{r} library(susieR) set.seed(1) ``` ## The data-set ```{r} data(N3finemapping) attach(N3finemapping) ``` The loaded dataset contains regression data $X$ and $y$, along with some other relevant properties in the context of genetic studies. It also contains the "true" regression coefficent the data is simulated from. Notice that we've simulated 2 sets of $Y$ as 2 simulation replicates. Here we'll focus on the first data-set. ```{r} dim(Y) ``` Here are the 3 "true" signals in the first data-set: ```{r} b <- true_coef[,1] plot(b, pch=16, ylab='effect size') ``` ```{r} which(b != 0) ``` So the underlying causal variables are 403, 653 and 773. ## Simple regression summary statistics `univariate_regression` function can be used to compute summary statistics by fitting univariate simple regression variable by variable. The results are $\hat{\beta}$ and $SE(\hat{\beta})$ from which z-scores can be derived. Again we focus only on results from the first data-set: ```{r} sumstats <- univariate_regression(X, Y[,1]) z_scores <- sumstats$betahat / sumstats$sebetahat susie_plot(z_scores, y = "z", b=b) ``` ## Fine-mapping with `susieR` For starters, we assume there are at most 10 causal variables, i.e., set `L = 10`, although SuSiE is robust to the choice of `L`. The `susieR` function call is: ```{r} fitted <- susie(X, Y[,1], L = 10, verbose = TRUE) ``` ### Credible sets By default, we output 95% credible set: ```{r} print(fitted$sets) ``` The 3 causal signals have been captured by the 3 CS reported here. The 3rd CS contains many variables, including the true causal variable `403`. The minimum absolute correlation is 0.86. If we use the default 90% coverage for credible sets, we still capture the 3 signals, but "purity" of the 3rd CS is now 0.91 and size of the CS is also a bit smaller. ```{r} sets <- susie_get_cs(fitted, X = X, coverage = 0.9, min_abs_corr = 0.1) ``` ```{r} print(sets) ``` ### Posterior inclusion probabilities Previously we've determined that summing over 3 single effect regression models is approperate for our application. Here we summarize the variable selection results by posterior inclusion probability (PIP): ```{r} susie_plot(fitted, y="PIP", b=b) ``` The true causal variables are colored red. The 95% CS identified are circled in different colors. Of interest is the cluster around position 400. The true signal is 403 but apparently it does not have the highest PIP. To compare ranking of PIP and original z-score in that CS: ```{r} i <- fitted$sets$cs[[3]] z3 <- cbind(i,z_scores[i],fitted$pip[i]) colnames(z3) <- c('position', 'z-score', 'PIP') z3[order(z3[,2], decreasing = TRUE),] ``` ### Choice of priors Notice that by default SuSiE estimates prior effect size from data. For fine-mapping applications, however, we sometimes have knowledge of SuSiE prior effect size since it is parameterized as percentage of variance explained (PVE) by a non-zero effect, which, in the context of fine-mapping, is related to per-SNP heritability. It is possible to use `scaled_prior_variance` to specify this PVE and explicitly set `estimate_prior_variance=FALSE` to fix the prior effect to given value. In this data-set, SuSiE is robust to choice of priors. Here we set PVE to 0.2, and compare with previous results: ```{r} fitted = susie(X, Y[,1], L = 10, estimate_residual_variance = TRUE, estimate_prior_variance = FALSE, scaled_prior_variance = 0.2) susie_plot(fitted, y='PIP', b=b) ``` which largely remains unchanged. ### A note on covariate adjustment To include covariate `Z` in SuSiE, one approach is to regress it out from both `y` and `X`, and then run SuSiE on the residuals. The code below illustrates the procedure: ```{r, eval=FALSE} remove.covariate.effects <- function (X, Z, y) { # include the intercept term if (any(Z[,1]!=1)) Z = cbind(1, Z) A <- forceSymmetric(crossprod(Z)) SZy <- as.vector(solve(A,c(y %*% Z))) SZX <- as.matrix(solve(A,t(Z) %*% X)) y <- y - c(Z %*% SZy) X <- X - Z %*% SZX return(list(X = X,y = y,SZy = SZy,SZX = SZX)) } out = remove.covariate.effects(X, Z, Y[,1]) fitted_adjusted = susie(out$X, out$y, L = 10) , ``` Note that the covariates `Z` should have a column of ones as the first column. If not, the above function `remove.covariate.effects` will add such a column to `Z` before regressing it out. Data will be centered as a result. Also the scale of data is changed after regressing out `Z`. This introduces some subtleties in terms of interpreting the results. For this reason, we provide covariate adjustment procedure as a tip in the documentation and not part of `susieR::susie()` function. Cautions should be taken when applying this procedure and interpreting the result from it. ## Session information Here are some details about the computing environment, including the versions of R, and the R packages, used to generate these results. ```{r} sessionInfo() ``` [N3finemapping]: https://github.com/stephenslab/susieR/blob/master/inst/datafiles/N3finemapping.rds susieR/inst/doc/l0_initialization.R0000644000176200001440000000233414143477602017025 0ustar liggesusers## ----setup, include=FALSE----------------------------------------------------- knitr::opts_chunk$set(collapse = TRUE,comment = "#") ## ---- warning=FALSE----------------------------------------------------------- library(susieR) library(L0Learn) ## ----------------------------------------------------------------------------- set.seed(1) n = 1000 p = 1000 beta = rep(0,p) beta[c(1,2,300,400)] = 1 X = matrix(rnorm(n*p),nrow=n,ncol=p) y = X %*% beta + rnorm(n) ## ----------------------------------------------------------------------------- set.seed(1) L0fit = L0Learn.cvfit(X, y, penalty = "L0") ## ----------------------------------------------------------------------------- lambdaIndex = which.min(L0fit$cvMeans[[1]]) L0coef = as.numeric(coef(L0fit$fit, lambda = L0fit$fit$lambda[[1]][lambdaIndex])) effect.beta = L0coef[which(L0coef!=0)][-1] effect.index = (which(L0coef!=0)-1)[-1] length(effect.beta) effect.beta[1:10] effect.index[1:10] ## ----------------------------------------------------------------------------- set.seed(1) s.init = susie_init_coef(effect.index, effect.beta, p) ## ----------------------------------------------------------------------------- susieL0.fit = susie(X,y,s_init=s.init) susieL0.fit$sets$cs susieR/inst/doc/trend_filtering.R0000644000176200001440000000335414143477733016572 0ustar liggesusers## ----setup, include=FALSE----------------------------------------------------- knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 4.5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ## ----------------------------------------------------------------------------- library(susieR) set.seed(1) n=1000 mu = c(rep(0,100),rep(1,100),rep(3,100),rep(-2,100),rep(0,600)) y = mu + rnorm(n) s = susie_trendfilter(y, 0, L=10) ## ----------------------------------------------------------------------------- plot(y,pch=".") lines(mu,col=1,lwd=3) lines(predict(s),col=2,lwd=2) s$sigma2 ## ----------------------------------------------------------------------------- set.seed(1) mu = seq(0,4,length=1000) y = mu + rnorm(n) s = susie_trendfilter(y,0,L=10) plot(y,pch=".") lines(mu,col=1,lwd=3) lines(predict(s),col=2,lwd=2) ## ----------------------------------------------------------------------------- library(genlasso) y.tf = trendfilter(y,ord=0) y.tf.cv = cv.trendfilter(y.tf) plot(y,pch=".") lines(mu,col=1,lwd=3) lines(predict(s),col=2,lwd=2) lines(y.tf$fit[,which(y.tf$lambda==y.tf.cv$lambda.min)],col=4,lwd=2) ## ----------------------------------------------------------------------------- set.seed(1) mu = seq(0,4,length=1000) mu = mu + c(rep(0,500),rep(4,500)) y = mu + rnorm(n) s = susie_trendfilter(y,0,L=10) y.tf = trendfilter(y,ord=0) y.tf.cv = cv.trendfilter(y.tf) plot(y,pch=".") lines(mu,col=1,lwd=3) lines(predict(s),col=2,lwd=2) lines(y.tf$fit[,which(y.tf$lambda==y.tf.cv$lambda.min)],col=4,lwd=2) ## ----------------------------------------------------------------------------- sqrt(mean((mu-y.tf$fit[,which(y.tf$lambda==y.tf.cv$lambda.min)])^2)) sqrt(mean((mu-predict(s))^2)) susieR/inst/doc/trend_filtering.Rmd0000644000176200001440000001050414051733237017076 0ustar liggesusers--- title: "Trend filtering" author: "Matthew Stephens" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Trend filtering demo} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 4.5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ``` # Introduction Although we developed SuSiE primarily with the goal of performing variable selection in highly sparse settings -- and, in particular, for genetic fine-mapping -- the approach also has considerable potential for application to other large-scale regression problems. Here we briefly illustrate this potential by applying it to a non-parametric regression problem that at first sight seems to be ill-suited to our approach. In particular, it does not involve strict sparsity, and the underlying correlation structure of the explanatory variables is very different from the ``blocky" covariance structure of genetic data that SuSiE was designed for. Nonetheless, we will see that SuSiE performs well here despite this (partly due to its ability to capture non-sparse signals via Bayesian Model Averaging). Specifically, consider the non-parametric regression: $$y_t = \mu_t + e_t \quad t=1,\dots,T$$ where the goal is to estimate the underlying mean, $\mu_t$, under the assumption that it varies smoothly (or, more precisely, in a spatially-structured way) with $t$. One very simple way to capture spatial structure in $\mu$ is to model it as a (sparse) linear combination of step functions: $$\mu = Xb$$ where the $j$th column of $X$ is the step function with a step at $j$ ($j = 1,\dots,(T-1)$); that is $x_{tj}=0$ for $t<=j$ and 1 for $t>j$. The $j$th element of $b$ therefore determines the change in the mean $|\mu_j-\mu_{j+1}|$, and an assumption that $b$ is sparse encapsulates an assumption that $\mu$ is spatially structured (indeed, piecewise constant). This very simple approach is essentially 0th-order trend filtering (Tibshirani, 2014, *Annals of Statistics* 42, 285--323). Note that higher-order trend filtering can be similarly implemented using different basis functions; here we use 0th order only for simplicity. # Examples Here we apply SuSiE to perform 0th order trend filtering in some simple simulated examples. We have implemented in `susieR` 0.6.0 a funciton `susie_trendfilter` which internally creates $X$ matrix with step functions in the columns to match input $y$. The algebra have been optimized to work on such trendfiltering matrices. Here we simulate some data where $\mu$ is a step function with four steps, a 0th order trendfiltering problem. The regression is truly sparse and SuSiE should do well. ```{r} library(susieR) set.seed(1) n=1000 mu = c(rep(0,100),rep(1,100),rep(3,100),rep(-2,100),rep(0,600)) y = mu + rnorm(n) s = susie_trendfilter(y, 0, L=10) ``` Plot results: the truth is black, and susie estimate is red. ```{r} plot(y,pch=".") lines(mu,col=1,lwd=3) lines(predict(s),col=2,lwd=2) s$sigma2 ``` In the next example mu increases linearly. Thus we are approximating a linear function by step functions. Here the truth is not trully ``sparse", so we might expect performance to be poor, but it is not too bad. ```{r} set.seed(1) mu = seq(0,4,length=1000) y = mu + rnorm(n) s = susie_trendfilter(y,0,L=10) plot(y,pch=".") lines(mu,col=1,lwd=3) lines(predict(s),col=2,lwd=2) ``` Compare with the genlasso (lasso-based) solution (blue). (This will require installation of the `genlasso` package.) ```{r} library(genlasso) y.tf = trendfilter(y,ord=0) y.tf.cv = cv.trendfilter(y.tf) plot(y,pch=".") lines(mu,col=1,lwd=3) lines(predict(s),col=2,lwd=2) lines(y.tf$fit[,which(y.tf$lambda==y.tf.cv$lambda.min)],col=4,lwd=2) ``` What happens if we have linear trend plus a sudden change. ```{r} set.seed(1) mu = seq(0,4,length=1000) mu = mu + c(rep(0,500),rep(4,500)) y = mu + rnorm(n) s = susie_trendfilter(y,0,L=10) y.tf = trendfilter(y,ord=0) y.tf.cv = cv.trendfilter(y.tf) plot(y,pch=".") lines(mu,col=1,lwd=3) lines(predict(s),col=2,lwd=2) lines(y.tf$fit[,which(y.tf$lambda==y.tf.cv$lambda.min)],col=4,lwd=2) ``` The two fits seem similar in accuracy. We can check this numerically: ```{r} sqrt(mean((mu-y.tf$fit[,which(y.tf$lambda==y.tf.cv$lambda.min)])^2)) sqrt(mean((mu-predict(s))^2)) ``` susieR/inst/doc/susie_refine.html0000644000176200001440000033702714143477631016642 0ustar liggesusers Refine SuSiE model

Refine SuSiE model

Yuxin Zou

2021-11-12

In this vignette, we demonstrate a procedure that helps SuSiE get out of local optimum.

We simulate phenotype using UK Biobank genotypes from 50,000 individuals. There are 1001 SNPs. It is simulated to have exactly 2 non-zero effects at 234, 287.

&nbsp;

 

The strongest marginal association is a non-effect SNP.

Since the sample size is large, we use sufficient statistics (\(X^\intercal X, X^\intercal y, y^\intercal y\) and sample size \(n\)) to fit susie model. It identifies 2 Credible Sets, one of them is false positive. This is because susieR get stuck around a local minimum.

&nbsp;

 

Our refine procedure to get out of local optimum is

  1. fit a susie model, \(s\) (suppose it has \(K\) CSs).

  2. for CS in \(s\), set SNPs in CS to have prior weight 0, fit susie model –> we have K susie models: \(t_1, \cdots, t_K\).

  3. for each \(k = 1, \cdots, K\), fit susie with initialization at \(t_k\) (\(\alpha, \mu, \mu^2\)) –> \(s_k\)

  4. if \(\max_k \text{elbo}(s_k) > \text{elbo}(s)\), set \(s = s_{kmax}\) where \(kmax = \arg_k \max \text{elbo}(s_k)\) and go to step 2; if no, break.

We fit susie model with above procedure by setting refine = TRUE.

&nbsp;

 

With the refine procedure, it identifies 2 CSs with the true signals, and the achieved evidence lower bound (ELBO) is higher.

Session information

Here are some details about the computing environment, including the versions of R, and the R packages, used to generate these results.

susieR/inst/doc/sparse_susie_eval.Rmd0000644000176200001440000000345113351217671017437 0ustar liggesusers--- title: "Evaluation of sparse version of SuSiE" author: "Kaiqian Zhang" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{SuSiE with sparse matrix operations} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 4.5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ``` ## Set up environment ```{r, warning=FALSE} library(Matrix) library(susieR) set.seed(1) ``` ## Overview In this vignette, we provide line profiles for revised version SuSiE, which allows for a sparse matrix structure. We compare speed performance when the form of the matrix `X` is dense and sparse. In this minimal example, we observe that given a large sparse matrix, if it is in the dense form, the speed is around `40%` slower than that in a sparse form. ## Simulate data We randomly simulate a `n=1000` by `p=1000` dense matrix and a sparse matrix at sparsity $99\%$, i.e. $99\%$ entries are zeros. ```{r} create_sparsity_mat = function(sparsity, n, p) { nonzero <- round(n*p*(1-sparsity)) nonzero.idx <- sample(n*p, nonzero) mat <- numeric(n*p) mat[nonzero.idx] <- 1 mat <- matrix(mat, nrow=n, ncol=p) return(mat) } ``` ```{r} n <- 1000 p <- 1000 beta <- rep(0,p) beta[c(1,300,400,1000)] <- 10 X.dense <- create_sparsity_mat(0.99,n,p) X.sparse <- as(X.dense,"dgCMatrix") y <- c(X.dense %*% beta + rnorm(n)) ``` ## `X` in a dense form ```{r} susie.dense <- susie(X.dense,y) ``` ## `X` in a sparse form ```{r} susie.sparse <- susie(X.sparse,y) ``` ## Further step We encourage people who are insterested in improving SuSiE can get insights from those line profiles provided. susieR/inst/doc/finemapping.html0000644000176200001440000044044314143477577016465 0ustar liggesusers Fine-mapping example

Fine-mapping example

Gao Wang

2021-11-12

This vignette demonstrates susieR in the context of genetic fine-mapping. We use simulated data of expression level of a gene (\(y\)) in \(N \approx 600\) individuals. We want to identify with the genotype matrix \(X_{N\times P}\) (\(P=1001\)) the genetic variables that causes changes in expression level.

The simulated data set is simulated to have exactly 3 non-zero effects.

The data-set

The loaded dataset contains regression data \(X\) and \(y\), along with some other relevant properties in the context of genetic studies. It also contains the “true” regression coefficent the data is simulated from.

Notice that we’ve simulated 2 sets of \(Y\) as 2 simulation replicates. Here we’ll focus on the first data-set.

Here are the 3 “true” signals in the first data-set:

&nbsp;

 

So the underlying causal variables are 403, 653 and 773.

Simple regression summary statistics

univariate_regression function can be used to compute summary statistics by fitting univariate simple regression variable by variable. The results are \(\hat{\beta}\) and \(SE(\hat{\beta})\) from which z-scores can be derived. Again we focus only on results from the first data-set:

&nbsp;

 

Fine-mapping with susieR

For starters, we assume there are at most 10 causal variables, i.e., set L = 10, although SuSiE is robust to the choice of L.

The susieR function call is:

Posterior inclusion probabilities

Previously we’ve determined that summing over 3 single effect regression models is approperate for our application. Here we summarize the variable selection results by posterior inclusion probability (PIP):

&nbsp;

 

The true causal variables are colored red. The 95% CS identified are circled in different colors. Of interest is the cluster around position 400. The true signal is 403 but apparently it does not have the highest PIP. To compare ranking of PIP and original z-score in that CS:

Choice of priors

Notice that by default SuSiE estimates prior effect size from data. For fine-mapping applications, however, we sometimes have knowledge of SuSiE prior effect size since it is parameterized as percentage of variance explained (PVE) by a non-zero effect, which, in the context of fine-mapping, is related to per-SNP heritability. It is possible to use scaled_prior_variance to specify this PVE and explicitly set estimate_prior_variance=FALSE to fix the prior effect to given value.

In this data-set, SuSiE is robust to choice of priors. Here we set PVE to 0.2, and compare with previous results:

&nbsp;

 

which largely remains unchanged.

A note on covariate adjustment

To include covariate Z in SuSiE, one approach is to regress it out from both y and X, and then run SuSiE on the residuals. The code below illustrates the procedure:

Note that the covariates Z should have a column of ones as the first column. If not, the above function remove.covariate.effects will add such a column to Z before regressing it out. Data will be centered as a result. Also the scale of data is changed after regressing out Z. This introduces some subtleties in terms of interpreting the results. For this reason, we provide covariate adjustment procedure as a tip in the documentation and not part of susieR::susie() function. Cautions should be taken when applying this procedure and interpreting the result from it.

susieR/inst/doc/mwe.R0000644000176200001440000000140214143477604014170 0ustar liggesusers## ----setup, include=FALSE----------------------------------------------------- knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 4.5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ## ----------------------------------------------------------------------------- library(susieR) set.seed(1) n <- 1000 p <- 1000 beta <- rep(0,p) beta[c(1,2,300,400)] <- 1 X <- matrix(rnorm(n*p),nrow=n,ncol=p) y <- X %*% beta + rnorm(n) res <- susie(X,y,L=10) plot(coef(res)[-1],pch = 20) ## ----fig.height=3.5, fig.width=3.5-------------------------------------------- plot(y,predict(res),pch = 20) ## ----------------------------------------------------------------------------- sessionInfo() susieR/inst/doc/susie_refine.R0000644000176200001440000000264014143477630016064 0ustar liggesusers## ----setup, include=FALSE----------------------------------------------------- knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ## ----------------------------------------------------------------------------- library(susieR) library(curl) data_file <- tempfile(fileext = ".RData") data_url <- paste0("https://raw.githubusercontent.com/stephenslab/susieR/", "master/inst/datafiles/FinemappingConvergence1k.RData") curl_download(data_url,data_file) load(data_file) b <- FinemappingConvergence$true_coef susie_plot(FinemappingConvergence$z, y = "z", b=b) ## ----------------------------------------------------------------------------- fitted <- with(FinemappingConvergence, susie_suff_stat(XtX = XtX, Xty = Xty, yty = yty, n = n)) susie_plot(fitted, y="PIP", b=b, main=paste0("ELBO = ", round(susie_get_objective(fitted),2))) ## ----------------------------------------------------------------------------- fitted_refine <- with(FinemappingConvergence, susie_suff_stat(XtX = XtX, Xty = Xty, yty = yty, n = n, refine=TRUE)) susie_plot(fitted_refine, y="PIP", b=b, main=paste0("ELBO = ", round(susie_get_objective(fitted_refine),2))) ## ----------------------------------------------------------------------------- sessionInfo() susieR/inst/doc/finemapping_summary_statistics.R0000644000176200001440000000330114143477573021731 0ustar liggesusers## ----setup, include=FALSE----------------------------------------------------- knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ## ----------------------------------------------------------------------------- library(susieR) set.seed(1) ## ----------------------------------------------------------------------------- data(N3finemapping) attach(N3finemapping) ## ----------------------------------------------------------------------------- dim(Y) ## ----------------------------------------------------------------------------- b <- true_coef[,1] plot(b, pch=16, ylab='effect size') ## ----------------------------------------------------------------------------- which(b != 0) ## ----------------------------------------------------------------------------- sumstats <- univariate_regression(X, Y[,1]) z_scores <- sumstats$betahat / sumstats$sebetahat susie_plot(z_scores, y = "z", b=b) ## ----------------------------------------------------------------------------- R <- cor(X) ## ----------------------------------------------------------------------------- fitted_rss <- susie_rss(z_scores, R, L = 10) ## ----------------------------------------------------------------------------- summary(fitted_rss)$cs ## ----------------------------------------------------------------------------- susie_plot(fitted_rss, y="PIP", b=b) ## ---- fig.width=6,fig.height=6------------------------------------------------ fitted = susie(X, Y[,1], L = 10) plot(fitted$pip, fitted_rss$pip, ylim=c(0,1)) ## ----------------------------------------------------------------------------- sessionInfo() susieR/inst/doc/trendfiltering_derivations.pdf0000644000176200001440000054337214143477737021427 0ustar liggesusers%PDF-1.5 % 3 0 obj << /Length 3080 /Filter /FlateDecode >> stream xڭZY#~_inm?و 8ryu^wFaIf(8LduWE}}wu5ӵ2ڻۙrVBV~vw={ޚz~Vo⭞O|]7to|_W'\Ƒ۟hҪ MmjggZ3Iw/r~f ]ճq4 1Oon& Mi DB7^Htx}8IV Hk+ V@ko-QR#-BVp @kO(%ýLmyUtWZ4 q>gGaB.D7\vwҒ饑7(Oe{Dx_,e'4QORT5P[n_WbIK)c-̥I_tNи8b Lf{xiyw`ԓ"Ʒq֢.f[_6}b-ıqj9J<UMn~)0!\ow8(i\ՄZ5D2)cfegsf3Fli q ( 8۫f(7+$ }jGC7K:fgizK67HY{HNKќ{"F6H"xVg]+KH2vJꀔlhB/ג6Q G"xYt|`TЇ 3nc0퉵J61n~SW4ū: V" T,'4P4hA}L0I n%dP.JMZŘ0[2įA Y`Z~P~BٗCX ^"OԟK47ca8_Z۱#Vb KV U17ʶ89?+N.yL sQbiÐ ]Z 8og-=",V4%KzEٙ8)R%DIlrm=e(yƄTL $0m4=isƨ nwƞs#:C8?RcpT ۚ r<% 1A Hu9B3? gfb囘RUNYU.%pSΡ.mnJ3$|:^ߕ۴.`;U9`m7hyj%5kFiD V }:̲+r[( G n@/ڿ37fh(0`n $RqW EC5V1gKvaTK8"jl!bs;\) B>y;B&8TymSRvOe1$D{O5-EF:<( 9u zHH7aR XPL%84b{;aRLS1`YU1tddHÍ%Hf>qvj?S ik<,94+l1VU!&H /T\C)ǿ ~T 2R r*(O4dI:-M} (E&3k.KGp#)=flH\K4fID{/3WDe8\a9.&}(2X@Fz7;is~#bx+B?SԂ3TKqBL1"sb!r:Ew: AJ@C?lef64`zNP{U֞@u1O7mIbаHm3ІӚBVЗ2Mkp 4j)KURNƻlU56D! °9 IȤW6w -= wr$b@%qK?x:2mAew~L<-$ӎF1QycO, > r 2Kb"aq)4M}='Y,#"3 }Y8?0A%`@鬠֦𻰵Y=v.rwbR<ȋЋ0}0x)>@.P d54/ 8߳l^71zEʗN"bWT b+yBH*VM+/퐵rrFl)w>AlME9u6CO7YUþVմs~֧^Z3}}B,r&P%| Rcm!-Qo_MhU 곋iqn;G@kV>$T endstream endobj 22 0 obj << /Length 3120 /Filter /FlateDecode >> stream x[[o~`dyJ.Eض@E)DRbٹ,Cj$Ӷ>آw8?{e+FUo*4WZK"Η_N_U8CDGU͈q 3hQe^QNQLTT7UԊ{u:k.Ұ5V [Œ%J4FҘΔV ʻH㐹J#Tz0U n.=@o8FK4ޏD`=" )k gք)$Kg]cHA3E>. 9̷{]>^sP1dU 7nzG^2d(oZtg b刲刲刲刢,82 Hֿ i3bMBE{& ]*0Q`V]$JVᅭ8دme IE;a`ȲU8|D zSKMqקfvS/ ahl[v߸6٬ӚfSn͛m]/+$|}x[X_6޹767Ro68w4aaGv>yZҖzN5_ ҳ.[֞u;Hf gy"y)z ]6A-=wӸb_Fk?6'k w2b+0M :"k~*Y5%yoiM!r4 !tGz-KT 8Ĕv|P.R"2)NaHTB <K`'nYd>cSڸd#&\q>3 /^o; y*M1b8= SKS%搛 Yݫ%STwrkPICQ;eNmx_MJx0P#62NB\˰ЧThK|gj4/gav\MDeqLs׃M}DhI^:&M a|x*$N6NJ^]Vmsȵ1*|nD(gw}ѡ4X]%3 UƨynVLd'=?pR`@T״Z* RWԕG(wNuFoLkRB&i?JLDXl\ss.!hYX,UVW=K\Fo:Oeb,Rlڙ1v3Ev;ǹ wij7 ! P{3i @ߖLoeT YT&Zűc&GH# AQoI&LQN+wsZ+CO B _Nkp [ 6po,e4s"+;*ZSHG(y'>>!YyǍ6%K9o:gDDvMHg D@5xJ5c\ gua ZMF: ?[;$,q]+ۥx} P Z՞Gv_|&zuv KTt6 EO\FwN ?t} s*iТ{\u`dtG&٪ߊǁ Q:!PGr8Mw9Z)=[,ptB qAEuL8PQ3k;QR`k<>W "0\ߦ_Q;|l Ί'%l^t{(B (\/>! L)Xq.Yw:6Fy*ncNKWV*ER>ju>0~&ewq#"(T^d!?M،Q!}P(->-gvaωO-,h>к7 w v Y>YXNi >,b6 qڌeޱ "kKUyVo3{b4LXjHy\2,ƽjb6ƞ8c?xhxN>|{qaa3T̯UI)tX#}4ca Rwc6]ef&#ՅN-<ê6wgVYc]cM(Jgs̶ wZܗscOWǍB,3Qf$ۧ`. ojʕiDƸxzð*oe*d-Ìf(`ziNUOas|vYEl%xR6(}tׄ~LƩ|c-6π?9N7I ,;Ejh.rH>F Ś+qudUsu2H"hyJǕ˞IlԴ|ꝷeg`;JoCYWW&)w G'e{E/gO]V\ endstream endobj 27 0 obj << /Length 2701 /Filter /FlateDecode >> stream x[mo#~B% ,ܧI @dY~YZd|!\zV^[[95"9o̐ߟGkg\1Ϭ0l^T 5p$WW_;xyܯq=o8ӷ?ۚ9%gatNtd|d#13|i&Dy$ *;#MGkkÊYX*V*C>/*%l l$2|zNHCm,s2>ĭhWn;δvFmdkגtG5[TuAM/5i78ܜ70B>{;˛45rBI&MI?P3-hE2|WhZ67hm.pėyDkv~Ϗ5W۸g$[ 3ovք7pb4THP % FmYP ֲ P,ĝ/O ,R.4/h K}S8Pb-Ayƅ flJ >2#7T1 kKݒK %C yڋ!DSrNNOyOjƕ)}Yekn,Ӏ'F*\I,u COޜq./˄p< a/?@$n ܜz:h==W{|U1ղ.?w]l>#ImdN#'r` D8TRsUl,+|B*`Rr`2Z[EWwgg:7QunD{Ju#w1UV !ؐQ LRR0EK%ճ .)5u1,c |X$Ax_R̨ӿ1,jɌ[jГAeOX5ֆ_NAM >| 2O_|E;r &RlБtM|Y~JYR%Uu~-ͱ¯mnZ0lwU04\d!}3HOq:=]8})x)"ǻ:տ`3,#NՃIכN\MHY-t 謬ِ{"|]&6aQ=N>qR-~*4M ՚$8ɟ88%JȈɟ00!;a) whe$p)cߪ^aQD3,ԠzvrC*:<$oqџ PP}q0 e篾Qӟ 1HRuǿ͖D_BjwmI`8ƌ1  ڎ=]Yx\Ɓv /<;3ձMyM)nm6jegun웋Ű߼D;&-<\:?fjcnye V4ǃSǁQ UxrC!6/#v0 }zEGf(` [jh[<q/1Śi˙UgywiˡTZ9k,ky\Z:4}JP*0 HéyXw3FqY#T鰯⮰CS{T 1Jq2 5gF߄}%Xr05O`; E sqߕO:QxO*Y5q#ȶrB6F/ 0*g:Y`\hr%`A $9A]AB*e~% V ZHQ=7 imq )ik_E8H-(aXo/^5djqP %gє; HyB~B ó-h.7|y0p woWbS #  lO].ηXY|ٻ4ɕZKKd*'35 }{;ZD_;pk'_}\= X7d"NxKovn{>Xq7[k%Q]+hؓ~lfV_T$z+{ 24&^S/k%Z*xLO9Nl t?e?X0zjO΢D(lo֓h5sPT%mD s*;vrzSjmT|iZsxb `co-zyD6o~ޟTCJIoSljV2 {'ԭܶ⏉$2dn}몦܃otܼ8tLg҃6Uj'F !5`@[XHEcK#w?v endstream endobj 31 0 obj << /Length 2237 /Filter /FlateDecode >> stream xZr[7+*D;e&YfJHUh_~kBIeT7 .\0j8uξ[2 /`!BgIh"XX{A!lBc#BfWR~U8adTp3$R{)WJa^Oc\ɇMV&PoNb.rbu$5- 3f(öp(zEFFpaiEWlw 'mVCSҳT!vRޠ6Wr>91U^G nD]ݛB䬱G˻땧uY~b`X +ë t6mm3ÕmaA4TeJ-;5'4V<)LYX{zƫQ Z!nFKPJHO!ZJ& FAR_nGdAωxĘgwB0dҦd ¼0LP 3f?Bwo>Y~E~_]{4w+/Xhb٤/-p[k2AD-IXrȬ ݅ލ-eƖepKLA#{^(lv )n%=}Ոt*J27rk9T>GJZYg?i/ۙ3fc6sId`u%f ˸?^߇KG䜆&7rT;?=e6oÑS= s 0j7-+.3bBP>7K.^iRx)joX LҿB.|E;n\l9ka7!-d46m)c |yŊWrVc45:d\+8^%\ZY%l۹{KuQ uOԩNX|߲Do،c"=lѦ᪆zsHG-6`Br?;RJc䫓\6DiT@C :kWq$wT/ijo2$O0xQʧYY:9Fʽގ`Ce2uBvɚdI][A7#$؄V u-;Y/f=jZD!!>tqM{srܔD]2M5焽t8'xj`.nZ"* tCDW૮Va >H "aK<(*4nQp5mиtY+M՛ƕ"1| E)Aw_E邚EvqԞz(5wȰ#^'tv~ٝ6O|f)͍Q.g;/duC#O{>Nut/a *ȟF?ه8 t^4Z vwZ55k7iMHCB-j!47eP@Ap> stream xZYsG~تHUhpB* [ߧ{vvwfZ!$Z=3u<<4DuA2nTecã GD0l-j)ks}9+L5< fgVThaT6-3ЏݥcC3+^($(U0-\#'=vOzIVH$cY*z4 /ΉQ$=wYXg@z =^ h47Ab?{݀ dnήuv͂FQ|Edł7a4q,*?L*]M$ȇ /U( ]Ydh 蚣蚳tVYPUILH:歿RYwTKwY i &TPG$[1)+x3|,FR謠AH'FSB%ORi ?{;g2>B{++Vg}>_5m쎐h ; T>0iC fZd,}m,V _R)-ao]% ҏnbt>rF2יԚĩfC8l@>' szs/}/ѦoSq ̩Z>duFm MFNX 9~B_c:TmMw(c]-sxUVer {Z]'3I&\Ie֎OpL"z{Ƿ-vSr!c՛tEv9Y~>оĥT@/T/Qq*1a1.dj̀t5%t].7u9ݮgSlEy]W"t1AGnQM>dbelR b}Tl+G@Ajl˶)bKo1W,w3$Hv:z/!8Gώ0y%FUЋBAN.^)|MmhΫ,\f TxA\4F,j3C76ً]K 9߻5Cϴ&=0G/`*`:UcMQaOrb'ר#p?EPc _˚y ӯɀ^t${ endstream endobj 38 0 obj << /Length 3047 /Filter /FlateDecode >> stream xr_`vPK&GAA9TzWpV\و;=iAO$Ua Q#0Hae ]E!+1bnAJ ]I`ז5;~[v~pa[@(ފGxJ#fzWJYꘝ2HWSqN1f:yv*3GyGwNlSMQT~)gOmVwA .gޚ CPzFbGJx]jpᶔˊпFP;;$KP!CF~pJu{f$-!Nٮr}y = S,p-E8!l<Z\qżXSGk/ᢦ}X>޼lcܿvVL VLn j IAOw;:݆9"vpp$y _.8Wz2.Y䌆v]"}Y8&3r^bJJc +NOةӓT%e_98uKiSKx|hl~l !3 e!yc s(]c-6eiનppd2ɲ0 _h{5Fd z̃$l6MbШJZp2 y MdFm"MvI6"T=_JN1ݳ7ěXcYj0Q&Ȥ-zY"QE)̦7ς`ߢ?sl/lkHo>xS@0vm}Ic+a7"F(lez"VȆKE˿xc!klY.#--uUC#CL-p1ȦRL~6wyz#a U E{RU?rUG[hK5hS4TwU嘆#W}ZuL1iua*y:q;5ؒi `@BK˟Ϧ\/|}d2C!בݻ\ uwB9}+/ԋn*>iD*~7g&:wݼEYdywerY;G̛m8ڹGMΥw fb\[7]04%WA\Ir bCo}6cm e1Yj6Iq2U0هg\2SXgu`¿`n.a>ug5 >6moOX #XWM\G]q>BEl Hm}57_$3> :OkWbn}wX`dk?>{~L7 IzH `ppIR%am|'}g4,Ek<"NEi+F<A,4 y2rJ  bI=`mO/quoqQݮcs|9;1?ynXo} ԇW%#*p ަ.{bi|>&pdC(EOh\pp~vi22" 0yRCUD(ewW$:ɭ,x ơn.iXou endstream endobj 59 0 obj << /Length1 1399 /Length2 7388 /Length3 0 /Length 8345 /Filter /FlateDecode >> stream xڍtT6!RCC Hww4H030 %- ]҂ttw99Y{}o&:-]DCrprrF<77'77/GdAA0C@;<yԀUw'xE<jhpp I⍀#sXY!?3 0|­`G"]D<==9np$+; E:7bn;Cn гeЅ"=ppZC`nw.0誨O] ؁/W8.`7fB SEuNl~Nn;) (huAqA~;5+l w}P޽# Glla¥CTܩp nnn!Aa @~'v1VwlڀAm!w8>n`DC|?%j vPοߩ!wG@;ܿ:1s7ψTeuUe򿌲p/C@xxCl_?%{X;Bݔ[M?.7$WN#뎼 .jkueN6mSAvAfk)B 6ZP_tK{ќ0 i8xv]֎wχ' w)`p[{7a0ƹ$ܭ .Ny58'*(pVD.$~#GRkwn⮢?{xAq'b!U!M2CL놩>ӈɬ/g2ɽs ,37> 5a|-uFq<ߕƦГq5rDo@mQequ#9P,x9Q.{]2eT)*s>ȋ8q/Z'8~{|>K1xZ))ɩOF}d^MZ HP3"GsH To!al~p2Vc2)&~`-Ȥ\0P& ߇D*G㚍Ls Z>o~/hlfOu:IxTg5L-Tka/kLpTh{W&Y}*NXma<\Q%hN)7˩4}zWEԮU{廗 ={ڡA[ukF<%qP^Sqps]96E2_ ;[iMFrz쾢}vL0{:y1}!⒐rvN%jG fS:V"ΧlrZڽC-]*= Eў7DY3w̺0ح~X`ɷ|ʛpO>܊{\Ϡ§B0.<̤B$۽C}=Xk  )".NH=_Lpepc-·S ^#>QE'I|jYANr@J4IHI&)ȋ7ݪAn0s=^ynoϐ C7}sC4B qxsg%:JށmX5cW}:]{>झJH #N53ugS2c Ӯ ۜ/uYV# Fxik+\!,Fv#A9k86=-!cyTҍ[&a L_2Hjd!Ml02@xÀ$Ϥ-&4V_62*BCÏːWhR sxtL6G7α|xO[* ف嚥OMF,Lb =\b ѠZ ߰~8+~F!cjM'xNFL:2m ڎVr\]BN'GVZF"BoKj,,93Nӱl/ސgQM* .j7# RT( `!^cPJ^Btb[ y֕ރ xM3{/>rUܕ)k*+Stav-M)-y\ŝZߩ1RA(́DnS ߖ,F:&$";R^y$h:d=BK)Hʔeΐ_:m,">1xZ'xl+㹙CɷwBk<ؓj Wt,)o胟L9Fi Ed8_+nz@PNCZs{zٗ'MzMjz>Rcչb)d,~~ZcГ"Ya.#9Ʀ_%M? Gf]Q2[E7f ,oqޣ6Yr^~. DJ1H,Ϭbb△,'"&4(<@:a++u +Vykٗ:x`砒n~^GzE4[<Ǿ4_*D"xCh))8,R3P@1:ppP{I8(%ߋSa͕5\&fIyCh0K7%Nn+XKD0Q'":!x8W1"JR7᣺WqY6 ܴ$I͸~7yg)B¯e{J q_h cW( q&OگH,)-6WJ# ,ENl ]OG|ǭtѕbG^ }QL~>Ґ"s>z1BX7Z˿@8jeu oZ~i_˷u3ČDL=- "Eyp穑NJą]0\Ӫ8eՁx5FZ<2sIn諀٣S\y}gX4o>5Zk`%Q qʟ!9`⬵-%u>cqÕVC g?$6!6L n_IZb?~d\n>#,Zj.)5= 5I ٧(tJ v(JSu5ַ_J۝^3]oaT/~?''6rbg4Jo:djs! h-:%/nվI3NO?Ҭo>ƭvq3o궆wfR97^Z!vl,)ơa֜p%j;S놏d*F֙Z?G|nc_tߐ R':P?}7&:xph1fŔSRqqϕ" G![2-_*dzoo^|Ρ0퇵Yxj\[*_[ṵLɨ"BCG^I:Q\[Fr OտfDi,9-95jhd!yNe<꺼\bٯ-"]"L*5ׁ4Ҿm&1`;?iF5etƳjcm?wXȻ93hGwƞk '$3<_.[FebVP3ei?ՍT,fr P2q bT3ۭ+ˀOs(-{`>\TM-Uj{_y'j)/^ Y™hHzuyhLW^gڵl2~<$nձ8[cG^J0>|eYv!0z(qOӉe|:W,30ԟkZ?lYy\.mSP52iq.C C#!{{b5^csieBvT%L$k]#3YS)4Z}#Q!x&UNmBňקTKĭ.p:2NG झ%@+_Fgb\u>?RC$N3.SBlԶ(|$UbJ7Rsa5+o6;Î]$}`ГdqcVM3ȨM*z6G4[j"D%> .\GfƜR>bc]F{o?UgNp8hBp},m#{c6M4@@WA-̄4UFqb ʡ8c@KxKJ'Tں}DIFoN"jt#Gl"%rFR?  mgT GvwGqu?5Ϋ5E֓bN]p(M?z䛀kk0SP]f:cOjJ`9Q*% ؎Y9y/6FJ @`|kvo-yG}#1F|dTSuA0 gpAKU{s?ÞNǩnN%NDyueI7F%j FsK@ЌvNb9uFz@ٗ-RY>+&<f=ȱ@|XjF\ s{3x{շ`ݝV8*ڱh:Q{62RiU$Qt4ĜYu–\fGY S{Y7q3ZCx=ι6&]EK7uv2~tgsE3 ΰ`Uҡ|=i荚eVde?{lj4s>D6gT{N73B8b@ۣxG"@3ЎDfJG&^Fw뱯ѨK=􊅄:K`y^DTQr} sEet*;$#GUՖKM|%:džn $>Y=ldŻ0_ YrO Be8pW=:Ri%\l085dtf}ZȻXk={8)4 HaO g4 cPb3QΔ}‚-c`Z͢MU;\&3*XK v+\m=Sf'szDV"+U ),ݷykRRT*i40NEV |cci;<38i^CuM{Yʲ"R$EE2iH89yl4@ Z`#,51*7(|Y~3@;>=Bb4={{>s #Q!_}_w'=:}NV@nw*^SS1n55ג FZh,[z̃;h0sI+AxBI$)vnmz8i0muy"G/Ħ\0g\j-SIJׂ[ #gūVaOG{;\\ ʨE6L^ RdV@[ƪSJ^05žpf 1 æ54]GC' C{Zso+95pA_oJ[FH,xzmĞlgz-]0O?%}C?-9?9Wb|=CȰڰWàQSqbƺ,|GvLJ!u.v\G&J6۝ CdrE3-P}MiY!5u؞P8^[YjWCݻ['cJG+R{/ԞPx-XrO"4bR_Am:1HxҎ[vQ:'C '1-|'hbri.ڣUsR"R ϳ$FdQihֿ3݂&㰭˨g`zRˣaӏxTl7HA<ŒUb&HU#6b 86±cl1SQu4 endstream endobj 61 0 obj << /Length1 2010 /Length2 12886 /Length3 0 /Length 14121 /Filter /FlateDecode >> stream xڍP !K4nnh4@p';'hGf꽢 zm;{LYI$ivdbcf)jXY9YYّ-m@#Qi v`EA@@8%P uqظxXY쬬 āΖfD%fg4p|9?&t6^^ƿ"  P:Zl_N4L,AnSўŅhl1cX:ZTA 32@h 3@o l,M@`')x9&#P;pll-OB࿒&&v@%`fi(I3;:2`߁@|3hW@ ~&K{GfKY~yTvt@ݟ%d2w7.l2adϢ'ńfrpp@ W كr6p򰷳yY^ y8AGߎEHllSKG1d7~+@E~l?0S;۟𿮘E[A\8?sx0qqعll.VQZ\v_? BZv/h]gO快 v$dc?퟈:9l.o1>G.m;FKIKWrۮ{l, e;O ^px_.`;[ B @7$)sq<^,`;Ǘ 9/rX~Bf#9=GNAzC>ِ^ !'qfzOTzg7tE=n=#~սTp,>E4@d x`tU ZmapŚl;sCE;a;NE+>0ܐ}8Zw/=XB% v<@`NBX͛ebPrQO2E'A. ec qSba?dʦ k!%}_P6(Rt:-j4\ʟϷ)c76ri5'Nww2[:90E.l 1: n[ 6fی1Gx{7c+:Af, g'G5v(OG{Փ·O#m3kЏ,py_oI j"Ea2kXLX6_?{>Kni: zS+4]Cpr,h+DuC|B](2څr5Wp!'I $,G,Vg8$٘x4;$iYEHBleDLqa֪Vl^zRό)˩̂7PdlFId ; gmxQF-g} nt~2gate(5IpO#3^R62Ҩjໜ-o(CL`}5zgdw#ilerUP7z;h40K)Mn`4me3?[=VSɖy䕚G}FO Wd_?s#;W{9%(|kB=k^y𸸈t6#d&"/GO:S0Е.ߴ>9SwؤU1Q\߃B5JTL:R*A+$bkW7X5ܶZQ7!T=;l j)SJ<#߼XO[7A>z9 -fS&7: o,@ʟ䟍cTKDs?3vC;K\$N+GFbhV֞6N\)ˬn0dLC[ HRYe(W#4Uh*061/pxgwNb(cS ]'Ɋ wEX:-qT%ygϢxfQ'Q ]ZyQxj{U2*V_3y1Tj߹AHoOd;\;~ɛZ 9FܟX[zٷ }3޺16 r֌512٪YහȌ!2Bje5WcMYϡVM 7?$ʫgɎRɠ5DaP8ڷ\yι)޶=~ nQc?"8Ggճ|^jZH+olP^CZFbYFaj`8\)c*"R$W 4ɰ]1wK>&Y $E2tؚʛWuOR%j“ٖ.{n)0CTkީz)}E$ {cGPΖTWDJo6%zZ'5͚.e1-@5D3 \gy FIDٰCv9uIx,OtjUNK~_TlLM(Ep3o3Xb/SS?vRΘ1HnMߌnEðhO^ԯjČ@7KaSU$9FnFjuRA?GuQ^Tpe[֓0\$;IÉd+[RQ/9:O۔ǨwO{ezWGZm6'HTAV޹XbӸ>XۈU7.S=ҍSkf$ӔXp0J}p|l9.\$ ROw (ѿ/K$̀vIMЄַ Ӝ[T[vLgeԀtA#ћk]]gMI^\(;,αDy6l!Wʗ2}]/ o3݊>|BPf0;T;*6lG쟻߂Tr6=fL^5E)g)L10&p,iyX̏ MګR|: qGpߘ]Z*QDJu҂.]QMV~ōkO5бD$tr:"Ycdiy7rW;6 [ZB X*N1+ 7gؖ͝|9xɞ~(^>vXem*q,<4DA;~pحڹ:>颢ˠ.)c=CÆ0-qJ,a&b\*E\WZ]gʭb~AsF8[Q|E!_Y=9kv~DJ-*j p3}E7^wˊN?RjQHOA9N2Ww ϳ5|бjJ;4\%}.$c{I3'tɃ\Yq0t<<.WI P 꼮1Rz7oiMjd_@_gE *g]3A'`lkJ7LXlD3'q`݃nv3[ӴpL 1AaB>zJU۩puԏg8|D YbfЌI$AN\/aC͚= >%$Ж9u xP7&ZZєc]{\f.1_Ĉ{ˋM(`sHw#0'h܄};UD/IomJZ( M#cfu<+ɍ0;m3NQpOC@mVBN494̽mS{5[&J":r<Ź4ܘS7ŵoCp]:H)QX6nR*Զf~)jk5YVMz?5%KmIC>LU*Ϩ9AhuFCb$;v^uiQ EXh4wbh㣛Y3=Qn=Cx~Sm /㠠]V~J!6#]A'I7:O+Tx*.+]|Y)Du2H3fr֮ۚzǯ*ock$l\-HtšCbNNI3S>~?Y-03LWf9coPw-Ľ1)qt"Dg]Tq|~wPR3hfn¾<ں(ЯLhdE dYN)ňɪ72Q|䪐Et3 [;Pp$UEE}SP{7𘢑mY`[˙pWs' UZS>fC[D_*VIy 0G[X~7V#=#N=Cx,w7-TrCINn@Esw;]<'0 ӽCUW5.|++Ch S6 :'L*HVSx$Z ZRenlq^isIVRtLq0A008" ?"ogZb/!S6smz3)>G؍מVj5uy<|_nLد˙B˜![6.+6cb6(m4b4rd|eP"fG. L;Lǹs@MJF7KQ0еk#Eb]5rgB.VLVq7@SĶhCUv_Ĥԏ3{Zkoޥo+IXR} ;( G&],>D‡'9] |'8tJ)E' !⸱T :0H)3"̂XR>WF95X~8>RJVK'7̌: c{8qk&8߬:;r2$ ư%@i68d_;ZݛکH_oC+FM!roj-H@W oL6u-LROE _Ųo$'U.8YK/KfcM̀’1}{0[T~8\^?v/((m)J|w3Ay@\wL'C# |zF.P}`]9i+3f?3pe<[,"B*ɓ9r瓆sʨ&̟:! w5e͌뼠==7> sҷԇɸU㄂YQOɿI7(AT2%x%8m #ϼSQn[Ī3"q]3#p39j|Ljٟ9? ɑPv "UvP6 gկm~ѭ2ݾNxޙ!Pbcƚf62&{ZP$4yz'sߺw{b;l&$Ϙt(m|G^&1?=y!&/woy ځ:nGM"tf9z>cY!‡AىlTm+,x.X 1O2H?uD5>Ă>8<f()wZW Qn34.l)ap\)ZbB+pMbQ^ݶXʮ&E׾[;F-VTg;gcA ¬.vjxSfImJ6AIRB;B PNhv,E0Lxb05&ꗠ#v*2"JTVdiVg>`6 y%,{1ꏯ?q/"WLG~>nkp;hff@nrT-f#!2L9SY04kLs  MFk.\`+L/õa"@:=xѳq(9vIs{yۃ;xVF(j4w5ğ]PG?W`Xa3w"|دo%3 ZrqwL]Օӯٮ۸p|ixƢ 6}ߝ# ; }{gP|UsdUC̿KYkvؙ"WJԚiFWr`a"鞀fV#-y-Oݥqg_`xGN5# cbp5.-;#kGпPUÖ.eٺ=[ćJgYv9F٥ic&LiH,^eJ4+dnm&搰/UR*C=*:=4M4c@ mdBhK]YP|0h02)n7iFz##)*[G#6 c { ޴ՖPz}$̪bw1vWm] Ҙ71soqma#ԿX&or1ڜ80rS,!'Vo~FM6fД!d'̛+"K_Q"JgC!;3h/@kt'-uS&:6U!Vs Ahڢ Bq,,+!jq'M2Fs zl+WXujƭ/8NaiMT"R ?qS{.IX4qGjX"6!.'xhm8iYbi7VAjoF7ńyORs{"R )&РQLDawhKrI+pwT5R]ꝼC1bۢG*;%1@du24>{U3e 6Fɱ:Տ}~uU\T:R$|yP*#V6Lʌy -E*n*Lb͞9Y$]S8\Xc35Ϧ"w+% fbyn l זq߆ǐP!2yc5VĒl{%Su|М)8+l"#ܕO{*#%l ^yHp 7 #ژ;nNMXٽ()4]¡h?wydQ2̺{M T -EX3 (ﭪ"w<5m}f9>aV);fQBeOn u3=P ?~r YMu=<1 [2s(s6sџ&q"(z}!_Гw= 4a7v붶1X3@ݫCrJ⯫h<ӗ+lepHF4bLx{lJ*¬x:G2KƒI5y7B.;&뵑:˧HXet ~WM%ᗱL>ن!caS@BxOmh<RZh8yo)s&_h0?yhU&땸VuDI'4gbɍd_`Zsy5+4Skx.>|~r];٧hxFa)b[q"5\@P7`A\k:6D:;b,)$_]<}Dwk=űZKy&^C;z1D!+yeq*_}X ߻$6Uu?l_GSP UzUZHV?qpm'<lRObsls8Z b?&TEUT'믙mA AY]wO #]+Ijǜo /JhpC{#S ~jl\E.."`;DNZZ /Bwc19fzԴ ug gCr7 W1]pK윣u8fHج38 p~2GP O}!MŎW-IwWM@_-C>Yv}Fj~LtF6>vdmwc?uRstuW/y²1ÃA&W.nT{9כ70*}}>=٫ pVKaT gUHC%>^&dIׅmZ坯~I ݙ9SހP)s 0RKtzX&T)PWco)q.ԅt%Yf'%4};2a hY 1h~g RY"V#{v[m*n3ff13˅TO_[:aIŶ0X>`h-pי:88c !OAU5P KL.i{`+1| ?"~ܢ%ϣ,NE͛GӬ`Ц~]jYXr%c)ϾͨnэB ^cmu}ެ6շo+۷cSH]5ژ%$oyh$a_*"ow.ɻJO @FPT%?2j$1?{V~ޢ٘EHWXH ֑ry ͓En|C,}AVH(C=Og&YwcKciscvu adnh{sN:?;z*6tú9#j%Fl_^\pLt<!8e$Ş,%@7FNjZ2ܧF_u{l3j6n˝)oiצ\) ˈf4 )ЋKՙDR,J u7%"%8y:Ҩt&(sÐ?jaS͉%w+T%QMׁ@ ,_'`~8><'*8qM^ڎ}`E1[<~0n6~Wq;._$9!IX פ-b/'x|K𦌄9x;릕)dj g0 7S"ʆ]32t: a_󠴐''XHc-  8\'ۏu\7mP%G`u8'hԤ󻤚q **q5踪\{߳~>P F̆W,vHKe*yJY]F{&-Xl{T޽@I*ЋGTr:NB$Jw!'W8=3(\$'(*ȶ\l% MwK'cD wP{Q]WV1Tګ25~Gv9RD=nfoZ̭]X)6wM):PxjR"'$Bn }?`S[r~JhntJ|mmpJT1h'坄pS̶8j =Ssud/+KQݬd cޤ.% Uv:N&V7 ̯+XcMxR-ͯPQ1@\#g>B:\*0ݛ ^JJ\E55 eA|X*PvTm 6A5d34)c=vOĽGۯDRpB?R_mA x/4@ A8/!. .&Th)@fkXJ$g V?M!hf(Xp١yjѡg-!4A>mE,> )m2?m k-Nsv0C VR{^?̻\2>suې=ӑȁGe[IF4x:":p ߭l63(Bh @ &X+ԪQc>lOcyoƤ>Lh/~nEj*%X=}[Vyr|lPe Zl&RMCAOuiYii7KH6{ϕ (:ugP`;W+/;*5}[e, ˬ!'U v;Lb`EkLrە[$I:H=]]GDWw7µϢt!]hv+_BkHyӴBiTGm#2&-27c~/3}ra]Џ_+ 8smX&]4(2H+r (sEݣc_g|ycAOY4{pؾ_M endstream endobj 63 0 obj << /Length1 1762 /Length2 10896 /Length3 0 /Length 12028 /Filter /FlateDecode >> stream xڍP.Lp@!H ldp w@pw$H={W[S|OvW9" qR**  qb20hCᶐ1t!NPRN0& ?U`E[WOp@!œ`W9@8c2H w\>?W*1Ü ZW^VJPm\d3BLke/(pYwJ:^f̞xmzpXҘ׈^ZA*CܲWEu\#q,bPj{gea2 o&-g/lD%~x$~V?8DCn>N #4@)͍V{UTH|߼de!-Sb'IE$+*%b拙!4H κݩP+eߨlC<n]ތ2T/Sj= +I:E@nm9SДVmOK~p\):h^'풌 Qk5Kr8_jR"<Ͻ+ `>evgqI?k8_Xvp7+Mڭ L2waY'VB$J"jeDyCp6g1ccRr{kuPGA+jX=%AS$WFcbl_E8jBc qKn.\s/L>WW9KI/ Cjw~Cc-seAs zIl˿j)ޡ4+-CVb߼OȜ;v><ˍkWb:3!Vѧh"+=qlyn`>S-(%| 1EHESm$M !~[O@ Xy-U:ט?9}vXt삗vpje^a26?]_['ZجΞt0.Bi:c5PQv=#و^xfqI=\̏9*ɃP8ݹ:Iͨu=;F'9hKt* ]ZQ$e[08," ' G3rt(85ACǍ;\BMT3leJfƘ_na"y,D_=PSuF(2x48_s >h֗|0U De2vRy~2 X.V44ϹOD:z,VXt+Wy釹ՑzR^/29/'G)Xd%mqX;:%jO~Te+aߦ,}4SbZ:Oi MSPM?u^cO ֦*9w$*Uj҃KDFqU5ӧBC8:4R;_Ņ. o"0sob> =YM%:bΐ߉?>Τm _o']PN2~i^Q}3;MoZ# |_[Ԙ㤯eR%GX:ɌT慎-ӻ 'MlX_?v0:J'XHnbbe,tEU:l?ˣR?G7̻E;ЮJUS8H>^YK銔{s-tj(nn2s;ww V+N;gNIM٭,̘> Gs,~GjFP'2fxz2e Ղ*.˃,C"%]'1Mtrt>mNifKQţE8Q߮ٝV+Od!58 (l{T6A/Y .(IrYeȜp:cƟ&yhN`"Z-`=c#imi{o~zӢD]n,b'b{ud'!KzMݔ(ߡ0,WK wvgӑUo>C/lwXm=O~H&% /Au,2g[SbbdZH&^5/IzBޖz$u_g߮[7<Z-S,l:7gXb|K ^Q1׷-^PHv*RpNEgvdKPPR)R6Rοnw0 jeeWIWPJ᫚[4[z Tw_q?K? ɉX1T5A1M'.ŝH/]x˺bCX{u %= \s"cޜ u-z*_^AKrǓnWD R ?F3q_ov2'u1:U^n1-5hI!x57`d@"iPel|)ȿl|Z-vytCȓG&ҟ̓ݐАVCL!U3VP[ ׄ{֦a9)ADk&I)0qv&gG r `6qX͊6vђJ\k_Teicz "2q͉FkN5YLT򢥐)ٜ@;]:uOggSnFqbV brlhG Zd_+Vr&OyVt*?NlHr a#_T'>ӛiSg6¿-ѾݔƘ~s\pLeW)b)uW,v?&el|BE~}+U'gݔrBJRD }Kom ThgoBB$>"αY -vĎn(I,ßqnpu }ə׽X&\Rٙv;ά1Sk6k=k] V2"NN_ n~q. LƜ7shYC}ER7FQտ#8лTn[/Ӯk[t*%k>tj0y<fj--cE rg5$ ,`/U LK7#ҋ9QR±|+L7NhE\dN4vљj+{W8rWo$j-jqN6:/oMKEIIfGT,;Ŏ?&Nu,c4\HUPd($j~L8p82J9%~J`@# &sDXzɀl$}ƁaNNcJ IB,AMy#nkS`*nz2,i1\A8_Cݲ;@WO #69N"cF]-pVor%Jn,R;8U!z<^cp5}W O)`I!7)ߨS!UPɽv5jUDZ-|$8{,ď"ͽ( 8s{EX+&%|`{q7*Ai\UC\  %G&C:qN1]iί3^Y7 9+fh;<goIm5= x'rJ:9c&a?5>}ff'{s=-G ~uw,StP[QbJ_fSlP#;ݙUR7,#;:9d}d ZrV (U=>K%b^m4~bŐp{ @YQwV)DReИP;4EkՍZXfz.oJ3e|Zmd_|Ser;$#V;DYJ}߆ҥLu&}yZOShx+2:tDIl"D m8,P1xCB#KpVؽXsE0TRc^/6fj_A[&v1P2Ƃ6;>G<a|,xuD%\[O$r␛]͝=;QF!K~%9b_Zة'!`?^+1rRMk6"gvwN { z=q :esȰD%4i_Z9I^X"~ZE[aޜ4eYE6숆l2`cr |>mZ!>[Q,ij\K?ʤƵwzif3泌\cL j9hV`q2Px1(YC~;YRQAJ;b X(:WMYBnaˍ=NUD{{v><ҼJ=o1=1j%;_a^z74Y' BfUR9 [B3zGpbƘDA^ task;[/AMFKn8Ehns{o hRzcӻ[|ohϩ7:۟9sDz9֔˓HzJsr;z[Kƣʺ'g;g* "0cf  cn$6?D4ŧ/96GJLȥ[j)Di[j+L<^jݙ1bdi&ޙ8^8UwD?L\nՒa$,^(Mrr Crꪣw>Me郓fp63B--mD@(q] O҃Ⱦ#Z=}PAm܉W9R], h#""i\[Yu\n`mZ@@(5ces%L TNTD({/<39ԭtjh9\ڊQMMPz>\M}S` ϬvKAٲ%VeN Y4QM+gYK۫O#\Tbuy. Vx}v%hnH3m6xRySݚ;~MƤUb +d/:ض2X\Q=p{yW$&G϶ p]~N.s^J|& ;nRloYA>2_zmL :p34%}c^o >oUrv#8팎lq<|R,哄m]KLWe7&\hA1֐`k훟Kl]?SX.+Cvgٺ/G#|7v%"}QxŽֽN"+DBy !FbB*tem~hΚL9wjiʀȀۃ;P̻5K3'+m]-2:ecr@iPmM]AcydOV)Q2$jMźh'#d' \dRzm|k!JBN[~ٸƼ٘hb1+gWWʭC.˺v忪OUW`7QY ,Þ vyeToh^1?dgϹ@ɺ 3ބ}L.-\/JYU± ǰ\ǂT0=/J#-Ȓ}VI ZdYDY;ZyۯlIKe'Q~ /8?qN[ ~QX$1J>BK"wFPRjM?نsVfg`^+"x\bD<[o=K)Ϋ2B/m[?T5v'Wӽ̺ؕO7RHN3ΧrI6]YQROӆ0kuFo%SW^^pCKT-$9vNbRU6z[If޴gk$-i_O-c,/.,zȐ&n +L'Vяai^\XӐn˷۪ ɀ7 C9bd &=Ro[& }rWBc/ˊs/tQo7#dbޝa* PІ(;#i *,]%SivWyV.,F‘<AhkTnw~WW=|#h75 %ޅ'?yCX,ˎ{ޕǯg%hˣ;r /~Y`\$z֑#)ɑRA~^U%FL;[&Xko6eûY ު+[r'o+χQc. x&A<Q+(xԮfG-%=AmR]x8c쟭Mzp&ICkBOXKt#w\ڢ_hf@k MR/w81/ c<ڜn񦓣Q4GMEF=2hBbKQՔˎ ھ4MN~nwIeά7KQ;s`E}%稇Jhz ``tmH75@ m^[RT& t9,BC955\[NMTgast7?b z*c!)F 9g#Gw9/Olw:o:mx҉PpV~qqdcά0`p jIb绳zf+Zzlqq\Tm1Ft}nۄ$4I,2L"]Zʊ\,3ټ3Lma`͡.Vq}@4CL^?ǣR~j2:%~1S2 @}sJH*/h :9Fr-1W%ƴa Yt&ucsZ6Aj\C-&g' -#Ԑ^7R r' ?9,I5P0'^#\m޽Áv^̄T CI"zI@5B4,]Ycj&2嗪@XB,8((ǡ 6ɊnDW%2z'"ϙs5=P֓|'>Ϻ= }6(} iF1Asj4l_ʔ >dBD%{DOqn; Lk7Y~ c}i,3&viv<$/ 3xsMQGܞf&;±8`NI⽩-[ot-f1B1[IVִnw07O]瘻I}6C 41ZSjǎ{}h Q<F]E_:ReR(j}Ā?VRyͺ, y5+[F>>e}f'=pe~@h`}[8 ȾՎPYttS#]_j[vz;K&Q0zdziS&TZvʛTG)pr~Qnulj2J>f+XO@ad1)O~J ?bjmvY5آ`rc[,lI;lIiK-aˏe4F~c:d..#H~k&*gRscScRJhbάɻF`͍,К@Ⱥtb!b1kΑKn-ox,0)IJ]2WM"|5."ȁD6{·ޡYtCq\]q;2!,䊿̙D)ph.hx 9$!b0Ar7xU8]"KؒW*p,m_⌻92UO+nubuZtNK% *8h[SP~HB=*6_| |.|kž&FKs)IUe M#?j`SqWVt#~48ڶoxp!M)u}"K|77kVU?HݴK a ͥ V*?g)=D;E֩,tb=񰷔 \M~tFxt_jSζ[t\p~euja0 %Jyjx mjgej07vh/˸lDTFc>h+2}zrl4z3bɎYVo'r} ͮ{^b8MK4`!+kSRڋ'l%P· qwrܑW\ $/{id>}jVCQRG + }za27`T#?dnrs˲bsRqubRʎ҉vsK_6)lVd0jg(*l 7]<ϙQܼv‹)2UbeL |)h}4= '9K}_{|-DD34sAJuM/%WUd; k9Co/g0#.Am]*3>.c`CJOLЭ6 -PU?{͖-qb"VgT4?|xݍeWqdE&n| ۀKCFy9WgHn <.c2qk)1_JϰbpPf?cF##a0D6uӣ+I/|Oi#ƍ409*,)RW>lN _P endstream endobj 65 0 obj << /Length1 1469 /Length2 8101 /Length3 0 /Length 9103 /Filter /FlateDecode >> stream xڍtT60СtHt 03C H#! CK4ҠtJIIG}ky~>{ʨ-c (a(n 8@N]]'`eՃ X_@H(&ruknp@Ł"||~>>p8@ T0U䁀ڡng `sbb"\2 A(;`@BP $rD\7(ABk G߭ȿp` y tN_d\+ѿAaA`0 l6P@SQ`ֿ $6 :n Je F@PH$wZ듇" sr_n0 fm k'^},7Do-@w < =N6 P' .oOD` b ;b`w+? _+[Yab^mUm'/,-p |ۅA߱0m_?5-'4҅tS>!>?!7TW3n낺u0jkv!P*@ 47PO/;uXkAQ`d]9@a-8/픁_>#[m!oG"cPg 00 @ȃox;?m8E x [d/$v."^$/ D qmZ@ 0,h_B֍{m)^OC~~pUּSPF7φZ񿞥MS#ZZHė?ޣx sz x3xGcrӔzN>dr+GU: pjj#7EK H)I6"O1GMD%qʢ\Y$J]*Q[ZgiI'cO#exR"׮r^39S8q< X)w\'i(V\䗽\4~kݗ\vi*Ǥ; 4 &U]A[Uˣ[t1sP@qV\wDXy=}F*^KYHڟl-JeBu <` k™ ӻŸzEG1++-WMgu%%Ϩ4;~0K,^NYOG%\n$QuwSZPh_aW ɜR!>b R\UTe&,[yi2szџZ%F}E&=AI*zNio&A>iٓ;x8ՒdD'\!ΚUXf" Qf4JV!۹moI5r}A& c+3$ml_hze7`+]qy"lqg/cpA*cպ0=Iw`F&jPM,ЂQ+S}-!'`qЖau`JTƥvݕ,k-O*ZJz3{vٷLIB\S*RԻ9=dz:i;&h|D6 [vͺ $eo Ye/m _6ls6A5C碳:5 UŤI>Uű Rw^6՝? _R*a?D\ ֈGvAkK>:Ys%>_;Ke 6j9q4+V6q(9r_q,]TQݕǵ*;DAXq_tZ/)9U(dx^IK2ɻI0|>Z\|3LDyN_qp[#.#d[0z5aX'OAv9" vyW(t˨{B6=/+xZ9B+[Z,-"ku4#C|f|_JU_[ĵɊB+LXb}_BލON jL/aLOjr"WdOF>ͼMvzߓR<+3ez/rXLlcOvJ$ m6CCvQ$zOF|_%ᖘg[_r(*U{ {F 7(a2Sp,<47"1V u2 aqv@WڬM ׊3#F, oT+iw !='~tk0Ů:؉_&2eǜ/ngBY~[p럮e}%C?d<}a[?^-3pZ.&6oiHFSH&@mcm<l1aJk󥞶I[>q 89g~ F-p 8(,zE7 5]45Q^ >U}C;w둲0R51<^S͸L%1Rwjs%x)@RXcͦlNl=,'"D3_@@½huRbm]0h5R.=MQ 9>TX"O_#4Q{zΈÍW OFݹ=w+7fDoǙ| usJ @%,3IΛs,EQ%!фt[~`ZeOiB>@ ݫ?sD@|So`V|߼lSٷ;fΗ9M/sZkd{GvG)꺅^b¶EO߸oOpOff(UDQB\tze==?ah9}ÛTzAxrt5t.mdΫ"\OfY|Urde`9 FK,1E*wR[^tSzi#iN*)}ceu4h@,lb8A Wga!^Djy[dxv\іEw%Q{f'h#e71 Iv&~tgJ4u^BP{K~ )bp$۸ķhpKw8/3@fF#%MwfE LH;f7;OұCsS ’in}Oq4=|<%ʹB' @0PwhFO񙥂ޭY.Ze- 4#ޜO s|B~-:l$}3m`>Hڌ yqFM1x^IRHX/\=|xI-;/b$ʺ ]zdL;%#IUsPbۋ o=ha׻* 1߯6_;MrDį&t{&ZFk,D37~xm_ DT͍k DoDO3hM zmIa/Cۼ;C$ݢHQmڤ E:RHULnm s,eBUGzj美lY6O/͎jqAw`Rn bĢji7 B; : Ɠc!SMG2}6IQhՔ2ۜwkX15Rj[O+ SBŀ a͖/|awxI=%o!L&O7*uqH%%ou<(5&%W6 Ts^]RPuKLk E/*sb ?(1.>PgRs7Fƻ:fǖ"O9麉Vfk [lnʵ%(k2C +,~DvãU(5dpr>3+k*T溷 ȹ^ i4ypUIDd֜;pyʻg8SED@!WUUg gSLrZ}f.3V~F*b :YNI{. k??&Rt1OC"Jƻ`5EjrɫgA# @2NTL֐5S }ѓmRz̺\um^0_<=YMůʙ#'p`Ed}+#vhYK؊tdpO7 ;]m?DaiNuhE|~A\K]bذFkFgS/ 5ŵa1[`ajc]&MKs&2>g%9R ƴ+}ILK'ebn6?ɅMQUƥSHبUDr1J;1BqilDK;ވRTYXqQߠ&tu$mKj}1r?+y{g.~|ߌ*jWae> Lؘ}-/LΟ &7b`^e{.Lc{/98vS݈,OVE9]/ #r2sl%Xjbρwe?gc7^֕Be qAe˻B^CEfRH{q=$9x' AkX&&SlN1$[ȃċFy6T)F~wԦC2ax~TeSZk-h!|)B1m(hsQ!LϽDO[SI؈J3E5k#ǹB-F;'FnCi;ՙ8)hry̨q>f{)jE;&Dg$Zx̦#5䠰/5c/it!"8ԉe. NE9Z=͓փ:EgsOm|@Fe';uܩhg\ᆆF#AEb?7kKqw!𡌅惟6VJ%)ղp>g{Ga$Sk$Z*+"FKUI< P"D9SׅdY1UeXr0G*]u?NE?]AGqWH~́na*{Ǹow∢v_KdLvY"APU򗕍i8wc:KID LT56+,S룤'9NcqS 2(DmR{҇Z%?6rEb+/yߎv߆<}JL.J[\9e(Xm眿kz2fBܵ8b-m`Ry6^O; C~ e B(H;=NM0âQ0\q+lb+ W@CwL>)ZE 6Θ*uGA`UOe|J`^)Bbc՗E$"#1ȷEW/jr*lٺ ordQBQ\6V}B2V{tl-wIp&OoZڦ\MšmQƾ!z\*v[0niQY._!X*E9zGW0}(x%Tk|U7eaYj_uǣ{Y{ʗhbn [#.Z*I(q*>]SJԜ|&"+E!  $xۜ(i-VZ4omY򽩔Ǚ@%ݍ/5wWLvezb\,PXL˪=+ V4/+>4kseLԫE{ߒ@=&+jyw&ԝ|贎}#M^"3.26bԛٖIE kyNwT* S?cQfb# 1:D1 endstream endobj 67 0 obj << /Length1 1536 /Length2 8047 /Length3 0 /Length 9072 /Filter /FlateDecode >> stream xڍT6 -10t)%ҝR 0Cw7ݩHw 9k}ߚy;aU␴C`P7'H x9A ,m[o1.n xɀv*0(@ ~. x@ \2`7[K '@aN.6ku0[qH:B\l-P aq|ЂYBYprww;9a.b,w[ @A, !UƉж%ׂY!.?xB-!.Z 5'/c p{d 9:Pk&̉@P߆`8u?  < u]"0]ZJ!Pw~2.{r5Y{(7ZZ.ՉKj QA  ڞN?J |`N" V?,o8 @B|S`ikCmXDCw=p^0?%RMZy9x< 777aWjo$ AB.߹sYpp|k|? ߐV_Z<IZ/́@< Xs0 ڐI w1QôK}" DZVv֒Rb]eΗS:zOsksfx_P6#HQ "SEub[Zj10~ZxHT&\1U,KRH&ORuT :%+Dje@E#0 zrR osyBib-|ZMR邤F@t}H7Xmߊm`W3tQޖ+rÇH.QW6;'Z>6oN%Ҫ, 98 s= ܩ9E'i:6 7ʩ'feh n]Z1kae6є6VPGm 33I2 .yWF%>A?{GM$De%A@.F# :S˂ X": `:dD2G%QSI(Zh Uߜ9yme(fen:0=߹7t8=2=5Wxy7XQ*&~ĈE#rw7KLI):% fZsX渥;B볍R~I;2 L^,G'TT^޺mK4l>d~xL҃9|a":(8ÍpfD#dtj>d󌟖Ė0\Q8ם uSxx޷ >E?s&g+q2調ׂea.ȶQ4Xc4ΝMb 6!\|^M6GxWݭ(7ן;nyqRXoJ>&wJ?v>^{ܽם`{U&k2n*"PZCQS[am2 I{CCU^]ŵ<0@jZO ;]軽F) ~44NpM@˰C uu r<àzӉ/I)<eFR[mSra@^zV/a:.Nc=DIl &o^A/RLhX\GIɰ9"8 NBC),Lt~6 979ԥGqe % S%F0<$ q(S~mp%ewa:&׬(h#Ɔ$c>#^e/'kS9}/a͋`l2&?Fegӕ訸kd+qw V~:*}!R4 䥂_j `*5R Y$w$/LIě>E[?8QFUоKa7N`TAZbxtX8mci  bo>ũe8m?zzW֕$tckG{-2 *Sȭ6"X.0ˢcrUF$-NT`PoT'__Η}C߾iZ]KZs?~Px)D'(}Xz7kOs9}ɍ^9V5bLkNMQJ FK t5}:!^zOKH]yJJR7W? seԊD%9׾f\S3".jR~_#V9ݙwZ)^S*׷qq@Ap`PvZY/ cD]~MFMӛإNa\2҉AY$y+z6/{*sXgжpP!mb_bJ19FN8O\t՝dy:Fd\E;{:'g^Uc˩缦 &|àZ +)K/R< d vi#ΚE s6b# lo$Пm j>c%U"bYKkNB|2-b !_w~OP-h'qc%PtH<,cty 7p!!H7P$ԏF9Zn3C8l}9LRb0C6TԿny :~tіCJN> B1$|SBUAZB G0"jacE|͝5"f,9H F#KxسK xtn.s,NN̳͉JvԝՍy,`liOp:hρm>XZ\.ɠ7z18{/!gE9 D&SB#Ԑ]:tm=ԎgНgHd,rakyO)&Y„_qnD/k?1c[c屏!+Ѡ}vMH¯j.T^;ydvPOϲ6+6`%}Z#zkB­?މvV z*Gncn O&)={OiQkudd2(UU\q`V$Do 4 T(DẄ"QDtD{iZ5 c;E7+XS= `NCs[!$7zTAKTqsH*~0Y+؏DžJIBIz|qK6R>Ȁ*@6C uրZ|A6I{5pFSCck|5qq 'ierQ,ƻvH֝Ei89MVF9T&M84ݗAw {Ϧ~ǽIG10o3LT'+̏YV;w4`C?7tmo GKʗusv۽1ls)Â@K-P x/i"9~񣘰 dܿ҉FGRrո#יi5f&ZWHP2(_z`nj]2aIx*~4먌:d-_NSTA7 _x?RHOKKA L#!=DN|FML҅‰}3|xoFӫmnr^a@>c+rAr~'hX2Ƅ5E'i ' )LL1pqtq:q2L[jnSx}.ɤwĐ%%M߼<9.P, }2y<4F nu:DTԓP5Лc#r\ @= ]~R)5PռuVg݊@-݊u$/e6D,sI\u1$K<pI_v}Y)JalԷXu͹mZ"QŞ,ӽ?tndKߊcCbdӔcO0ﲢob<ˤe+~-X𨜪P_dҖ2OP%Ϥ/YÍ/D2 f"h^ ~xyB,8boI% eL~A*׽8?t"s7I>L`d`=qluDl#3 S7d3 7.'3 RƮnf"q=F|boP͒.qEg= f,QXS𵗻JjpIx ㄭK;5@#]+H>)u=]I[i'vn[],qu|5ONDaC|f)m{;(\񃹢Pa-b u,&ZԡPw;vCfgҏ~V_``jBgΏx[/TN׽OxBG5_pBKr]lx$+1Bϧ  Wʡ5U=Z|gb ^|R; )-jkOJ ,=7,a"O9{Oߨt`sUc{&w clsg~Ƕ=>:V}Čz] BgvS09OЦ9hQ&dDv;v&B˫f,|_DOi\|6;Qa?(I"(y/_P.9v &9M59tٹV.åȱz8VkMnxDpJqf<ᘪǼ1i->W=MM䀭cV/ 6w$ς{ΧĀv2LBxWN3h'rJ:A߹n10djD3Hw}qC^Ѩ9BHt1y))c20mY궞&HwFNW᫤AL,w4&Zx8}**gt$Z-j"gD&Fd?cgB. ^#y0al:رHaV4BпτQThuA?_t[\3, 9^r! [>D"6vpghxį ˋY(Bpli ˽G^ ] #l\3pG&?&F!!2XokF0 |{D;KyƯ#Ǘf|]pi^ v%c_NɁ@'DkI!F\2CDM(3qo댇J·<E!%{?.:0ؔՄjɻ9U59K;`LRS&J%C5/;'5Pagn0Wb4]o`v:ڲV}R~~MKe"ĵsgw#x}iJavwٛl*Du^6pu5[;bJuwE_hcH-0#C5Ga;?zTO=kPΐv(S$ an\Y(瑫N2V!*9*ބbr滣HG6"ݟsᾛH 8,L7=Oec{d7sQhZ'ڪ^r㓍сTˊ6~\,"oguxIpzv ޾npKH# &p[2pؑ)烱' ۴;^~݈'Nt QU;.lͼ yR4?;{< Й;jQ74\_-wnMڗ<}i'Þ]pg[B~ <@㏉X kʖlpR W\C;> stream xڍwuTTm>4f nIa:D@i i %%$TCz[֬u\{_{{.6}ykŸ @R ‚` AepvAa1RAQtF\/mJ0K&0K,,(Qր \H^([˃zx|DRRw8 pFa@jp<CX8 ҶR El#x\m= a jЂ9 M 0E"]=`ҀF75<W??oBNgD(`upaPB#m+?X".x; Y]~?t;]]]P_M~ge"qu!Ux/_`=0C$ cՈ#>PUti"fpD’B @xmA0rDvB~/v:F($\7"@kBؠ0$d4#K 8<3!7KYc1h迧 R32PV翽 XO[" D |w"B#V{yQ x\>߹EX |@ϒS,$'!Ph?)us\MB`jch.Bcs)j X;DX\;r{\F\ǿ*cX_$$*a^$CD7re 1Xt_u&51I dA.A@.(D@ U&B/{Od~'Į2kyF!+F+A? 7cjCޘlo1-E;QD3D%sEMhY0چv^M~{eǥ;<b$$4g4)TȏUtٿ;#WHts5ʸN~.lMA0µئLwtkҧT6~E?DC|S oq P{zpyWHAxqe޾b `GȚXlc-s)q[k..ifOx"6. /h+TITfI8ir-q-J{>a5|jz$[O>t *M"{\y_cɢ37Nk10.r9 ĝJʤ%_^ 1 ?JG} |a\vQPJڻVr0fda(olM9 Y!`nW w6fnĝSWZvH3 ~= IZ\D1=K4/1.>䈠:{'J;ݴ4¼~{Lɸ^>CLi4Ku}Oܲ鷱7jM8!v[B̒2o;^ _t 2D0e <(_X^p=|cĂxҔ0SV8=o0tZa7Tjr[~ c.{._>k$ag zGItn8?-zEC04®eo@e֪2377ӈ (jlk|5vz|ònG'm%qf嚡þSu Y"5LZά/%;3I; Qoffe;j>A?|"JG+NegU$MdR@fу1O@0{fry.oGhGmzmǝ;'|%v+l/aeH|fѻ*-;O+VkEcnh9${N&lc:⺭0\(7 )ĦJ %w4^) EZr:, ?ǹ49llmHGH86$hn./:q|k@V{,ֺ_Z8 iQlh:dO˔`jfX. 紕$rct; IR 2ثlH(y4vd!A|5vN窄 <68P!}P.xn_ްh|ܭ+T4?hi2Xm` #JuPzEZWT);" 1Tqges$ {@UXjC6N`'gPս&-?Ә]H|Q{ltG<´u)x)٥.2~gcÄJOr8>oa\bܕv(a>yo)(UV mwwBӮFoo6,/0㟱B#𑒡>e1CA✿)|[#f (1s7zYUf;ă>9$W"LL ld,QVj X&z?VS 8mI\M,R%NdZM  `"d~pv150SbX#F/|Umdnҏ<жxbSr p\lQu|wB7-E5Ǻ3,h~ HQ>~~?HZfBb|jv%7e6L1i'Ut11OBrvg!_sS@0{f!TxxCaC~tbk [+g쩄L?-c<C, nVohw+X8w[޵xiu{%Vs]\ = YƦ/>SHկ= |5`W/Qqǐk$epD]9-{682d j{w'~1Y,Zy-f7U?KhVc_Qj͞yqT;O$B E񷬝)8E |aU1C^ZTn' 4A馐w>QrDn8 ²w -ᎶW@ û<=u|VǦkǽuL_팰BFiU[fOɏ/kUyG8- gᬎ?mLV_G&)kLզJu}Fk=Y&EGXċXjzݵ)2%!CI],O$z<bafQC觷_=_omV3=jREn;aw;#D9a>/ap46oR@͸(єh/Ǭ@z0iTq$} ps|/푾IMtܣⲟZ *@]igl̲r[ŋ[&#pXn2;/*c P "'dLȂ8 Fd-i[$9q<vYKc$/^uEh$]멜r.cj?-EE9׌JD6 y<4HK /4 <'Ҋ(+d|ni{w4Ui;1O)#ɭlUkwf}\d:Mut_l1!p,},"gt8ǀ.xPnSdj(60ڝlF`zk ̦1Hojˋ0[1We|G9aT«&#YDei'Rco[=KS OJbZn䭫Zd\̥bow4BF!T@1W9|cQ_ 2 Pٮ0hj"V>?1 jUV2>˴ce{y9W@IRh_DۖO; Fin LD8GʵM=72޻I/oɡy%*bm^n8ϣVl*8 %4JL2X?dҏ+CPuDNmBcA×!M.摆a'aT: I:2 fUgvC=צ38q#5t0dBDEǶ$xW f"\NMP3ZuOGl^}0k7C7wxj.J[Ubt@k@Æ +s^^5,D8gr+/Ls+BS~*E&7Ly^]Ĺ""vOod [4fNFs :4n[HDJ/އkR`BO~'kAF>wm M7?p5%aޝ-ɌEF u j,Yt>@ Sd r&Ri,CU IJJnjG;U>c?(cvTm֩dFrYc~\zsXw2AJ3?ZY6;.;RD341ؔM`?ny(Gfx MhBd%$VN@ ]/zW/s'G)9~^,+Ko4|اqfڅjnOީWSb2?U\`Ba>HGR~|"ۥzW=4۲ (1Ev7sCtK&%ya;0^O: J]hmT0c(~. A/4IAu/KXRfh޵[oɸ)W%kU*4(FK<5"1uSS .}7E'#G iIߒ=EQ5L^Xhq;f½ ݓƯRLS~hlNrWiKZNݙ+]%.cR5!'z>1Lbdo3peNM5pBt i%89$u ׭w5*pv|l͢I~VlS_Ay"Q+ ܍M #qf&%xB}U{%6mA>߅)1 )exUSi롫dHoս]C!P:v6^{}GLSc>"$$f799D-@5ˌ}ƒִF\[iOJ:7ܴ4O3J%@,T.&_'LWLE**ﳋYڀ޻16a?ᢸFW q2G֧tA++ .X7њs@KO94-foS㫀b&{tti=Җ9rFSw›e)2GAoxM&mzݍ{X00pAj|BHȀ0h{<~UtWpvkE@Zgׅo1{#֢XU}jg=jOńpP]8Y +7+";-NK=B䝫LYegd?+,Gj)HmI=QG343]lΩͣюwxTڏ{uT@Q=`x.B'-KN)u&«pCZ.ZSEk'Oqr{ֈ{t\'0'^.q:B ?4:K^]t?Yʝ^uO'a!ͼo†Ю۞A0'J [~0C g@5#_f Z06| G!2hSq1vZ#Nr1xM~/=M7o أ88f젗Gg+T7J2{S'{ ZGu$ STHF_(aȴGN9&Gᅠ7j% ZtF&߶d'$͉eUE+ h yeKq O$X۝dN> stream xڍt4k׶щ.Dт F.J1(D5JtQE B$Z%:koYg}}}ztlPp  %@(Be@;q=#PHPtC>@!N($! + D@(7iax PG!D\(7=s߯^$%uWw:@AP=s" GpϿJأ.^^^BPgw! npZPg_ q ([ 808⁴04.p@)WBd( rv"}H;- Іh (C='5u( b&k>w.p52kVF(H;ѯnp}Z#۲E mla"lDzՔ`\Dh8Pwa¿0q~13\1[8 <~;o `h5$: cc<bfa  UuU?A0 Eā$p::P_}UCڢ ~1wϞ/]L .̀@U2;x89q3/h 0b@7G`PvB Ąwn@ޜH I+qPOQp݈2%>q C=0*{&7@XBcR(7_{[r@" v4[p7F4PvZ%QDg?hIsU7XQha "eMƴ@Gyhiک֋Ôg"+VH;ڝf>C1>:׽g*2'U;7y|I/))Jڮ\06F}_V23dgf؈o.62ֺ$nkX Ƹ *ԬPjaGٵqw\fjfV"‹R"> ̥%|ҟ>@@hKCsǝ֫s* 'յDG6"2sy8Tb$Rn$J'_=o,1z1)]3JՑ7(p+oEݮ/+=bz"q# QsA&oTiWIT&o ,3}vw~I&2;oy9yjm:.E}k ri`oaX=gϝ zA몄c`}˟rvs)|O5kHvVyw>)/ =\e{[`}S ,m]-8XiA˻HU,zQ1j~L'0}|}f#/GQ56rO@XVﵖ}\R\A)'Da|4Ӆh rrw]fTe' mX?rL{1=Unt!ڣLS`E5ih:^?[5Fƈyͦ0&3Wq;EζR.[T !u;ExSy=\'/Pg3GX 'aR7ܓIhŽ@ty1b[ Am(^bh%d]I2CY3OwkE8G;"nd9zdZ_ OCipz}2 s=;N=-o|3V3/YI?u\6䏖gW+$q$A3섧~,CoOэRrPl QV_X[/k\3G{`';U&-~Ӛbyⴊ[6`Iӄ񟞚Zr5]0IDƉ1~kAZAu5JPqY:jn:; C`C Ȕ]Ww}|y1)LX-⥂:LQ7TzVU  9d6E|pTcmяpݹ+0{R*Ц+yg9:6+:G^e {Yzu2HI.7*O:M)C>RO RM`!~T)pfM>fH% Jof|V&35/k,,N<b"-P HCD`R6Noئ{y.#Ϲ#BOy"_"O{l.F] C\UӍc92n8yY6.u줶3Εm|ooVi y##[\IpIO Zm @q*\/՘Ž/Klv}E0!s'hN*b׫tDkV1 3}n-tfl6")Imuiԛ!/nS:I"ڕ9o'Ԯ?rl=hhS xDPʟ<?FqdTZЃvӓtuQn3颹d(;n5cSUGQ<[Yi84\-SK :=f1e-Y؋P0+ij&u|JA[VzN)& ~Dnaa$,q\^3AR b}h\+ɋ9 жd+UgeaoC^C) ǁ&Y;͝0"!Cr]7hMqg cF_09U?g8/^ßbklܮh^G(N5fݙt'?ZbZUc%&jg:,{8JM4#ժ=B! L'Q.i{ܲzq=! 7qڊ⏑%I@/X߀-!LD2Qh+"ޛA˸}?=rž&)^}(]pyF,)_wR$>,\I 'vlq*ilB !/dҘӃodڞo˺g"|P#IyF?';&_u=*&m3LV5׍M >T@sױqYqM+w8«jL]kg3mZκ:s𑝂q evpM5nl1NP@ DkvMC|ec & G_}x*"*&YyQsM4EugjF:oK0ʓsOftH\wG 5/ze+RG0K3LMi״4S?ܩe8}NۊVbxDOxKr 5&֭D^e.HC9G \+{n뷰{nqNr փ흌 d.ϦGHiȍ52[H7Tt~׃ }bCt\>F,PK{{'ҕW6Dh#Ҟ߭d/L5o;@fz}su@\]C}tXF1t|ڐW/ƀcq&1tǾL%E>4NXl}gJ-p8{.s򦌀֚y.$+5ᑯbǝ`#1(kΖ7c~ü߼XԅV'NHVѼSv7^\%\vbbOvX&z֟Rs)~z\|"LwA1B9øׅ1N/q*MAlS}ҡd͆L cIZ*jy݊8 HuN%_~2dP$Rל)3`("cg69=0c&ybx2>*NS&MB7tsanz^櫪fJ_/'fzPŵ-a+NYJ _~6"&^vuMӟ`l*k{|1ZvA7hIU 4VЊv䃫<1g6f2oweRdCzR|Kn^Zߡ a*z٣}犋<O<pE^pRdqq7NO-Jí1#1w|}?b}>X/6F3I(iM?!܋M=!%III-,h-A'ʇ$6؛INZf6w5X#cY[Б6ܜsFOklexUֈ{t&D<(6CWŌ(TvQmmN:T*"ƌ6x|,օ{wB̀b z8l1=i[}]1}Hn{sM D|{&GY\)lg4#:9TJm #d׎l/ņ~>H{${q-TNݕA?TR_`A6"YSP=NW(Q/Rv244'˫1'BHp 15a9&);gm%Rk 3c_ďQ@1Y"mg0l+Ĉ.Dڻ!E)yw=}:@%=٪^VSvBMrdrtZ.S-! 7G΢͕u³-Tv -Fv NP Uw +}  H~82Ioyg\?Y$_ʹP(mPƯy^^ύ!q/sr8WJ bfvTUykH*x蜔HI[bprD0KkUJ \rvت>P9X. }d-WȥX\rA,h-=E GC5Mwr^˨|ݶ#]4Wsx|t= K@]O'.?MW]:iԯ42T+Au\o0Y=N=z#oULj|8b/dueaׄ] wkBx~_)n!1Ffy{q@px("+`8:o[(]G@aλR,Ξ!06ć\ 7 _2VmZ %ϣIW&TG͵vj,[h #Oh푔8p)Ƭ RWdT'4PzDl&x_p~eL䙍Rd*+p6rC>0 TȮJU˼j:dOkL#FYZ` 7؍ښnRUhV%s)7;r,#I"V_W`);U"a endstream endobj 73 0 obj << /Length1 2398 /Length2 19971 /Length3 0 /Length 21377 /Filter /FlateDecode >> stream xڌt Fc4m{ƶհq4ƶj9{}kfq|wIUL팁v L<9ef&+ 95bru-_"@#gLd'gg v09x9y,LL1sZv@'r;{GKs gP<Lܜtr-MlrF@PD#k%(,ylneh ]0@Oe U K*vfnF@H`miuyؚ)Y=c tMdi/g#;{#[K[s5 .L05mhdd7r562+s#Ts2qwvbp]"oPlMEllNtd?ڹzYښ.ŞQ(%o `gbbf@w )Ax@E},̀/'#W 33` 4E;Zt@ `hLl=kjJT_; @`dQ4wJٚԦd/hk?KdbrYߖ&$bm/5տ?j#Kkt@j9r@SKr6![sIhhlb϶#W}ʬ-mvN=h4G:Z&@Wh%N53}X9FF!;tMZb#3*`f{FߢQ0A\F"N& `X+Qb0JA2('_T@*Se_ BFemhd ͜Y+g{0A&&.6f֠&Gabg $l AW՟<~O/ffeE&F6dXsqdb'>hv@ۿ,@2˿ XA+wНj :Ar5({?j=f?ec=*k":ß^9؁ 3#Tӟ~#_a;Yt;2:[8 g7@mq :׼Ac{A 'PsØ8:whF݁& v&VmB&g4R{-;<&QW} pJy#Fu#BuR֚ Nyz;dP]?!<z'Nil.\{> ձЅ=*h(݀9y\RgzB8 wԹY7b8Zh/MyrU.<2E?1ӈYD@:Cti0ѭ&q=Cy~ggb#8cSp!߱9h톮!fܙrqg*f-*']sΏXJ%Z`\P)f6hl6үA6)޽@<3 _HvO"BoMoʄ.*…cT9s>w(gu9)JEB8Uv%iEP*|v+%,X9 ^[-ū|RۮpOz UM^߫~]!!-bkGBZQ,]mSEEE4Ps_!In A mge8P~![@i!H_[/_K lCcOgw%ixU $,`85:ih;~$Qf!p&hp`;|Cɿ1YrHyj(6_PQjE'K(z8ap |P:_pX2"hF*ΞK%̻-No`"qз/.y}ҷ?7*?~L>F4ˆIrWcc'w[AEHmiqqa>b}JSLît%Zx5!"p8mmgS`s%I7jͭ>z7g ,~b*uM\н@8f9 A&fh0Ñ2 lG "XB eQ`UOR$#~:z,oO=GɌ-R'WyIҹʕzpOINS߃\69Q/O&ۄwtnK<˹cNd-[{~YHszĊ¤`;!L{c]fuƨ!a~Sn;ӇAa,[,zvJR.96g08< (pKɦp%Cw]+?*n%dzU?q(w^ڤ-v(_!e]Mm- (HN~ 6i̇VWج3-y4L;IH`4Ͱn'Wc!RVe+>c(۸˰Bк m+O  ,Ky.Oj@XONca6Em cWÿ,F9NP81Lqb#чT9)~uHV(q?xt҇2iJ Ԓp0ρ:5UK<Eţ!K3e q t&4pUn\#t+A~ .ؿGZ{pKn(N{⩍cTgch1єFWzT(b.崍Ϣ W*0(dnZҵqq-􆆘go o>ʈ߫?}P6X1^'i>,Ozy0bSbƩqo;4?:ƤۢxuV,fzŠ]:"FʋvDIprIZR$-߲Wh䓁;VWq M1cKqpXO<2Dѕ xJc\q7A,bG`vo^wfr(@daSYb1vK58q-DjISI|wxi9uе%* Z%.0Ϙ ׸\\hvIx/<WmdC1}u D[C`w<;LE7{4Mg}M)wF K]/fpLe۬%R!\j*ᮘ l|\L5x,o^ϹG*ĥ(BpͭSw4m|9I;N]| "b!G}XJ v}hA~d_IYYO) w*OW4x NfoâjPX{"ͱhcԺ (p*fak҈3zF)'*%)]T}/55ȓ3 U!WoጭUN]8q,HҺ8r, D-i)>^#L\F]uͣJFQ6k+ NJ-o:%)xζ@;Ң[5iTE7hk`)-G,P{=:P O%#ްz)GO_SC٪<=U|~ptsٍ\kd~6BogNI=W4KFn.1<HDD#pL4OΉpl7C̝OVM̥SwB7Zc ys>2 %7ҚM zzo {Ve^|tkyv֫ nG…7okLwϹ'%衢+$ "Nx<89Õ)B<1i}DlH'<^ѝ_2$'s=;- RVk-I]2{Sv{R{N/W NgT%XJt(:\ N!zJ^{|p5ۊf2*kQEaSԒ(%↊&Ѓ*Î d_ߘG'4,*in +}-aG`ej*gSJu/ErKj]qtæ;R&`*|omgP@W[0. @R+ !_&$yɁƓr |X7ӏG wH%J*(䜦a55^|oɭI$;#$c #yj'.ⶥ]sPj> -ÖRX| `O V}!~:ZK07>ͨޟ3U$"N^2ê┭ժ!5+aa+uf ^sͬbȉWb.Xs {C}Ā%cOMg;H\.kdWI.f>&$/zNP*;-y$/;BV* GS0.}<[<2C%ucN]m@cEzrND;Ù1̼7n#H9F8>V#ÂOy{>~а{aN1_liPP?jx^E&G 4pNS =A { s;J?~}L4U,olB#8ӎ>zH snzT^ G)G6!7,z=_؊%s/dv߾^"Oq P_J~Ʉh-$= Ucdq~~p+-yoWmrmcPS(-^RUN-*8CsUdBeCi$ڲΖp+79{d*Zh?VʦM|L=}1U]=v*xgl.qG-x&* -qDbg- XQiXʵ -n7OESZ[5Q}D#pTp_ '*BGζ~SnB{=ӟK$ćDM  DtxSJ:d9XetY:Q`$G .ȿ!ªhv3SX hg3km]eXSW' uyC זoÚCBV6x^"4.9jmwGAezGRj7 K-B%N >XxV7x/䦑bm%Z‚;gU[5+ rl9?FqxZK8jZG7 sQ,9MS-UkXڜ[d %8cwH+ KڗN!>y}*nMՏ&5ׄUعCK3I{ՙhRҐ`"vB1I+z< B)pSxLD2 [9~%΁ bH/BwF}fndf1ҧ IƳLľb1DCP)3mX]׻vK"MJ{ctc(:"Y`YޯWz'~v |r'ZSxB氡\h-t^hI9!s^5HWm색r&VpJg-Du>1k}GǫiI|G菄;F#&/:쥹b<\\n .kiN4̕jFL_1 fp*&@y*=cg&-8ڳwübz}eiKDr_UXaq&s2rX-i 3/tB$YV'&K~yC!:Oj5 ޅ%~NN߅5ct\ 5{!Fch.4(|׉-faAs8xMXQ{:j@BQdp>E񧲫ݯViE0?0Ǖl] NqQ,.Sqݷ(fJ,-kG|t-fXz)NH+.1)~J}MõH˳KŊc}~#v+S)wH;'y֍ {cO,,ǎSa+,8q@,a)_%GK@+M8Dl;O/sI B)ć6V>o,cC N/hOkqoF"j8; U8is,k}Y2vԆS:!U%G FΉ8hDa»/>G3$si wV  !a^4!Uy; <"|t]brDff u&γAjQV'j׫~yhQ@D3\ 4m5O lŶ9fRQmgp qڃMFO% C:"6ϯ@v!Ě&CcFY_ėTjrH)F˞C_bш I%^sY5:GQ 䝞f)CM)r0Hk;JrKg xw9sśo{;$jep{[E+ {U0ZuJ0'|-ǧce(R%f)m=hބ(eԻci~N;7c+Yg05Q'mҹ5Z#Kf]绐ߴI"2~s Dj@?pM'۫)rJ{K]b@dl#>pb܂6 N1'(8VO`\s,@3eGq$i;IV蚬:xS0sO8[4X=N_A, Q\hXuuhxdYZ!:<e_RI'i+pw$͵~$kr"[QT{\_@9JEe_LBg]9W5Hkc4GsP!1}~ R 4jK9sGG~ߤICI߄_H|,bxՎ%N+w$r<^_f2/y=SE/4p_.7 ӦXoMyiF \M ʇ̒Sb' 7duq͋'>]i w>,Ume:3h.#Q)brB߬~Nh+p? gJu_'Ik,3t: GۇzCeFb|cII#:Rn 5>$ }Yq|oD,wg6VD*U3.3Y**o|ԒY;tlCHfT\יUȺoC-{$ 9{g20 t[Jt?tv KLip?M _mHrN+aiY)OC\,Uf/8OB pQ$=ܲ Pu~\t>2EVȒ*8 d[ "8Ro5xTxx=#0l9d(" zB*&<SŻ7748I5RFEb@ =O@^LqR% A- 6Ӫ^mN)ZU8qE[Y";ߐNPtD۳I=dwW#a=ҥ\Qi;Ϳr !^?=Bɂ!xӒcC@DiSbzHV4*S'T2~O wiswK&XӜ>h%Xx͈Vat!`p1&N"\܅5 Z. j>DQ)Ukml`]:B6e5lP-[̳r5f3gp) tbn q >1+V9s>?i*Muiaץ})a&(N?2{0)9z.đyh!LaW1b4N0U~*=]KYD< kzI'ܗn<.́ ~G3@zگ' DZ9Z n|B{*uTUMD ptl-z7uB~TRy-dmw>C{H6k<02EVڌ,Ē3HA`%Ս18@WVShۤo+g(LIP/482'ؑa/Bӕ.D ruB5ŵ}4w)VUn Z!HE%n7PXzli12wnaHC1eSseߏFTV59e_l%]̼յE;&]aHGՏ. zކZf_&m-Koݎ@+&"-L8m >P*r4l~5/JZz^~J ,5Ӻ$_+V{JO3%|]HRŒ"WLA -/ipAv7yyjTK<'?,cHAs0`YBpwZ^2$kW%뷁e :#C-t~fd4zXz %"ϯN1lBa量=yUHڑZ*p h [`5K  *҄h݁ 83jUnUr&B(  nAM; GLȝNMׄ:LtÜ+e9c9VȃCSO>׸D=,fj-H+>zzyV`n8$DQ3FPqDeIkdhU) "7z`=t'}|x>QT2& 3tUsQʯhuQRFmM˅\ZsrXbN<闞Cn,nSd_&:vҁ\X$daQf6=D-t-ٴq 21 $9lraC#\[qvN"Ti!>y?f؅D%k*)Zp75go=!\-0Gk'_ LoSddby%9Цl(|#rQلUIwO}x @lP̧zB5M?t1`X (c 1&2Dk'8mڙGN՚}M̧Ośu̩ g3?K<xU kXkω^χ-w {9js8(2/ve m/dƞYuF;Lb83ijh$S0^?H< cn NK~}F'#`#{`ikֱn% *(wL5#6ʊD@'v Jf]A}д#0g_,yנMRh Ty@Kl@RGhh_8(K}oEW^87ǜ>*a\|sXHDk}_(PlnHЃZ6[B9,)>9Gy!?ۘ<%BC,SO(08|YT3rڞeG|RY)\8/VDÚ@Sl 9Yjrg(CZ  w +Ǖ=ΕuM2ʱAipY^w=G--b~(l7KהEFɏ & TT3FZKܜh=DT\̀ո슰fHNc xjup DW1O hql@N=2ѧe m"8a)ï<* i A_\xe&Q{OzW؎Z.QVENq4tBKwT,T,ߣqk\JҋhtO) A1->SZ/>^8FȪn)rxdIhq ܣ֯(4^el}H|;w<]W5JQ=sH8'~PcF25(gcBE]NvN LlNX/ ݀1 6ɪsWcB(N#XtS} ~J|v& ki^:f@trzF7-[Hȩ  CX롏vW}Md*jsW7SR k aj:W7_1#ZyHl&hQyĔ9*7L_mc}\Y5O'0W.Fqak{E?r</?F.. $#1i(hwŸ~*9!7/k۠՞(HZ VΓ'Yv 39@`W[|pWX5!W{ŹqhU_aހH;Y%}T&vGx*VyY,[r<97/گStZbd |Kh3eCAi+;U*Rc" 8YH 5B9;)"rG^tև/B|L!IYlLǩbMv97(lʰxO0yuFum`bj猚YB?RӞ1R !Kڲgih?ֵ";'Ϩ+a&KRYՆ< !9fnJ4nʣ4澍5B{D*yF>!{Eg<&ӆ% P|ach o}QxЂzg{MybH90ˌIuk(mJ%dhkk8H掔_.b lDgt8!FH RGL ~w\ALB _C|bh (']#hSA?EmUtNx )`vxavhifI'6y:7-A C^=6-h@a!:>J9`#qw7lq~pgȂ$r>~Fn԰0s6qVMb+W N~8@ )g`[P|׊ełPS,/S yʧ2ɕ4Qhu1UnT4ª K8z˜jOώR_ wyp6ɥ^责"eӥJs5৷Ih$wO.ARz*< evlٿFY#S:T9dpxk$϶~j~/MS8[a3&gtbG nQym?  )dA"lu<Ћ6@ሒj hn{õ">n{E:5k&2_.zC~w#M@*"{怱X=tAHcwd.'~u 3$TRMOUS Tw',KkKv[ƣOt ::.RNQǤSh$&UX +pORV0],)pr~*0a؇,jf6*kmzq1(7βԕ`h7U<*]hcȀ)/c>QJL$ yL4φ?N O+-O-":I{wsdvB=38 k'6V R;i %x~n4DxFovPm$i |}A"QsX.5ԃnj^^.uUr?P-:-ph|u{j>RUjH=e(BAyo47h6RؽBylU2/`]9eSN:)≧,VD˧1Q+Lў4BHQ쓱8~%u[?9@y(=E oZqv{ P\FEFy? `qI~rml#& m@o~"nW /P3Р%-,{RmZO`;wx '!vrՏ+J`o&cxU>Au`KAlER8N|(+(gn}؈ȥNX"*J}ty~Kxm4⎒qVag *607«$.(tCo >ƦI9DgWFQJZ<"؉,w M@hױXzk -|ߜ_r}M NC-c9v2|[`[v;llJ ýc[P`Ÿ.}rFf x6"eyGƭ炏4$F$Љ:ĺS`eʞkE%ޢ@!Ny$*PWb'8+*\ە wu,W22Cr/ǃ݃H\*M ˑ nlR>DcvZ iq<UJ}UNW `WȳAڃE྘V{AT]i,c:hn*vA[MFE՝Nje]CA$&/^ײXr,[嘲i`".|оq맥! E$qnK[;焿UOP>;jHz0*,Oy 8^ĘSG[|= 6*{":EXDG ٞeޛwH3r #l4SgI5a\v`c&wvEDzFf1ȟv9H=rf=;oQ  a4P!gr\Ym)ŷtp2+5ET[PI>%z7,AMb(2 BߘŴJL z \%0sway9VwںMeNx+zNYc#S?(;K35svbR6KA^EqT|A6Y^zǛ5W(uY_˂lEU#T' y%_g9/fJqŸ͠n{4NzQz%R.Ƭy9ju ImQ0(Q"j"o\Eo~y2KpD@NY=#Z NqAE58vV_0-ke>/GişYJܙ;{Y$[/x&SC[*%TckJa @>v̢_ 1n]/_ Gv•a7,HŁ8m(f pέ _3[]KNY:k=N]. )Qk^b ë#yΪi:vW9Hk@sf ?#݀͠: +BY&|\4ʜ ib> 4{3@jr$\KǃB1nXjr tk s; " WaQ Rǃx5E_^;J4Yw*vx1񓹫nlF\noAءkj}d) #RKf~>; @LA}'1k/%Edk-=8U"WN/Q2`v kB xy:d{#m?4RnJ?(1C̥Y:Lk%;ȇw|!}2 a]zɝax)fS.t X uH$ זٸS)Qsxd3:\7`PhD39ŽM| Q3W=icT]y4 FBzXNR&^{Ol7{)Ve6ʢdWKDN?5"Uu|'Z9'.@SwٙԷP4NmK߫QcmGúnlժ5ؕ3F}R$]ǥYD$f{GSKRHrZFs#f`hj)ԼF^+fb2r"]J,P a|JaO)?bG K8u4xtѥ,&*cDZwGgOtJZ͐E颉΁QcFصīoϯR F筍 ۧHa5]Sʆ dGN|KnG**g}rw7CIp]UBfbYB;7q/F&yQB-|UYEȝ~2QϦRZeXPoc}: ,LtG\N3Ԯ&8ZlȊCǷ yXL5z У F=&`ەZcנ'v,i*0 j 6bYEͻ\{U%_}8'g@[|=)!;*\S`MPL#,S׍213˦z?_.+ʣ;!¡;g` x%qd%Fnf> 6:p0,- %͞N\פg GUw=)H- l)%xhX&W4׋5~|?*+4d%l=!ji+Gbm:ytuE9z VDzp?ǃEZ.;k=z].R(Ԃu\f0I)E:;yk4;dR]$aCƃT…I'$w4ب>4Rj{ =CGax, 3ob#BϠoTTLF%2{-(>G%x]"sAo "3 ; $V@{OuYd*2N /h|kz sAs-2UAuGm$4-`] j ([GoMMOt8gbS#y@d:VZ0-Y݌kUޗp侗KH$B.(; )GV 6sIE&E9&K{$o(o{Q #cH`=E[ȣmLQndO] FE7)j2OkxY SЯpgЖ]W$CjkLMjI. =\j 9$վ?#˚!`Qi=2ѝ ѻsG~Eۈc0KN!X1`I\%Z_@<~Yb5V5\ߐ%\.@[9)T3bSh9h!(rrWG\jnt郗6) p$(4H ×&)TVtEs.Bu4"2_֐CRSZBcoSO+פޮ(D}fn:D/ں~ xy{;Wþ.vv3 #)LE01>VjBfɼ+yZCE|t1ltiS0o:X S;Ja6}k8m׍(&  ˼woޠEczuQ+6:BqKPJWH1ۊXs/TD-ۄ8R N(gHT<Ǫ7:EOQJbjNo Q4)3_i9<#cKXyV3v^L b<+xE!+LE;8SBfo*'ThLdrD[;|33d[P&/Md`+`tJ* lt7;0>]FҸcsYo8;6$ ˱4riDcї6>钋CţTK{ x1E16He|#]MWhc>r\cQGC,J3^>C [ͶЈ k{&N·vB86cżP~:P Ǟ*ƴl} ۵ endstream endobj 75 0 obj << /Length1 1658 /Length2 9368 /Length3 0 /Length 10444 /Filter /FlateDecode >> stream xڍP-=3  nAC - !ݻ{5U3sڻMC"ahup T498\44 W{_bd] h"6s}Sq\^A>Avv'; !i3w%@ H9:yA@6/i@oc ,3WKF 3{_!m\]<<gR"b>ĘΝ|&WL`B;*1^t&&2 $HSRKtHNォy 987'"dU^oOt(HD>]Q\T8k5waVK=h{Gǫg ӴK'BӢZ=X]ml@7!m زΪB{D@.& ,0!ZeW9b<23cU IȶGK{AStf\ga"LkVT%9CHsO_36T Tj&.ò7n5}LIOr*|8H[H7eH{*d"poƿK'3EI^p6ڒqcrH wMl(Ѻ̫DSݔNs)Bܕ~(}gExjTɓ7~C謹ySхAo}箧e.zQv_" ԮEֶs%rr& +p3Hu"D~{\9%hܴwѥldL*uO8iδ S6g_hX<4`ZqS\ǙxFV3o-ϘM ,Y^ FX.1˜Rx:y Ib^oJ$$W`]~'G؎Z(oH-;MsIsLN#kqƕ8fNUPRVĿq|uq y#lv3#'& x@,BhYuD'nyqͻ.5EC|FAq3Y &~i[êuF+w6׻v [1\{lҘ.@3׀x㳇قUϑfsV 77 ykX^Nr5IE3^$t -3UT'iA3${fy}!(əgy];{yZUҖ8vͩkuφBˌ]Slx k~J"ffD^"I,zLPUKTfPHj9twY) >{#uPU{//6G@M%I+7@w* A߭ǫi<?R=f%~YM~|cJ(sci/rn.L;vK4j,Ub|O5ębTAGѶ'Zwh'1a%v<$doQEXRЍJTs8:j!e6Ş_PSF~ 1C1'yFd,&i挕E~Jo>V35Z΋[Fb 2!b]j3<`O$ ~I'ƽ4 p8yh[WjȸmLcFXSfxR߯Ml|n @L%Χ5q9iZ܈[SBg2w]HK,53\ y[ʒ5T;uЍO}g-Nx\ El%>eiJK=b}t#l 9rsFy#ф3}+\n:ӡEjJu?}Ch]'Px)aIX;``4YGbdGNm2$Ch=0da* ]ȝԖ? 1Pl7@j2Z0m. ֧0󏸼%t=bt u~G#t;w8!PGM_UtSDGXs|3y)GƟgɕO5r^!Vz4891=<"0pf >Ik;aQFsA$e>t8@Af8=R+VGd a }-탞r .G7\z6Զyݶ־lLFcY?br*1TuؖǓw}lO_ɺG(~cD|K&z0 (2'4"|w[1s} ‡P=f3|Mh,&xݕD)򆺯URlTv~k`KrJ$I >$!`SP[|xTz\тuk)9Lj},ܺ3"<Σ{ѯ\&zJ o~(h7f3&gE4uyfj5l*lW[1!YW- ei򌻳xT1`| H R #>$ّjA#xׁe>vGH8-Q&cv6JZVzemlGSh'̬pOԈPsL>Jf{Ý6:2`8~jW#'A 6]R"mÎ yH <WifO K_s 3Xz!N y(u|HYJ$#H.ѡKyL|#,?mNpQo`VѼof1&٨F-S~wpVfXkNر0hM^#g>) r^7NZߍ7?G̜SX\X]i.{J|Oka&3 =䣶zR1iH۷ʍJ־HM|z]]S+l [ryov lo׹+4~^þȆq`w뒚o#ڔakS^CΖF*exDQN>E9pJ CvNݧkՄRڞH+(N2 Pj蠘YXꨔrk[ewC7G{pS1C^G1Q&./ݒxD!{#@n||%I+G.Y9V@h`9-U &֦5ϺǴMehJ 4he))Kqw"M)+T[k[$:0sIuK"X sP)jjٴ`{aDTI 56%8T[RnC"\%b|1PU &!'!ċ.%>U噎bWڼǛeB }5'^Ur+ RG蔈䄳b+M]/%5mMG82昞Ք͵; ٔl?Yηff 'lêH2l,7{Rxo? wvȨ2K2p%d:K>GS,o Em <3 ]aj8t:o@)9'c+BIǔ Lý>)W\VJzB*9xutɅ)$ { E= Kt]ECfC6nn9HAB=JiHI OhbWTZ]u.wguut`"}ۅ%f Wx" oɅھr!Ldۥ||Ȋ4rgXَ#jq5`2d @bSRǾ B4ۋ;Fǜ_D]H xH +(7`ڌ)TURTTEẖ%z#!z\I-ҁެ -o+n{Tjkk*: Ԫ)RjZEV{Hjn2|Dņ3k)[*=>R\":0+~/*:5{SURȩ'sV~> ~J0*5 VKM RYL^C?GyHT;~lt@q$o{t*6&@<3sI9Ȼ ''LhXHl҃ʅX$ږ$VL"rO5jٔ(k9I_PRVbTZ}Y1xqG:f(о8PS,G?`6<)' Ū./r,sj9#p2_)k@QS#.vhT v|1fa17/IJ³'$%>[*ۃ粴rSw,T^[1m{YgB]Rn"&L&a-Z+vL!{ !;鄅ku$nxubA~۟z 5,TeSM0Hy^#$1v,a2jrĖ4ƎOOU랅_p/*7VU `diԅ/%~液R>22Diq,CoDH>hӻ撳U"JJnK-!v#k%jYvTFBҫFҞZL7ml9tJ/3P&Ш,YY띚G2[DY ͣ)K?[s6p^2gv ޒF*_8 0 (~b6ַ`kW'=ezH2>XJV34nD{oI&OAEG <>&O# 0Nhׁ85yn\&^b5]LO& T<}%9|@\͉ReȓM$ЙhS1[ پ݃տ]F[AMQն蒒N'$%vEkP Ӯ :(df9"! ÿ){ zިੵnѝT~+zhQ;,VB>N8CO粝*a䄯}JXB4f8 2ϴJG$D򾬠 jnw0bp E#A&ρ`At@t3ܠ4h9KCa)v\W&Җ%Za@Aץ#0bqZdĒwڕ ^zD`m]DGl'PNK-v(lp {^m]Yqa/Ł®߼$׽H,~B֜[YaC|cUp]EJ9`RcqIV#MJi 5x\zl:]ڱԫr.E7g^j4tkg m\Ԕ%5%  bbS'aw_+w_{Kr%Xp$ kc=`k.B*b;6BZ/ow:'&>0 = 5t4ڡ~ >+K 6$9vn6sRk;`mk0# (!-3,H[摡0e1aЊ(]VJs|i}f;':1-.ExQl\h=GQ-w;4WcUkwxvAѤ;$(H ܜDI$k!P, 4wCOoI_E۷&qyED7?Z'CЕfR?]HjXd2NR6@||`N[ifGLyX.0}³GRުݧnN{sdaXݦ!sF!fzGrXm3`=߃øwq^e#s%:o(ys^כhl9|_zA!}u&G;4;T=ɯ}&qv^+wF9΍xsL< Hp5 s3H痤2:FGPz2QjYlZ?BR#DZi=s \7+f2 uu1=ڞ[=dk.Zifݩ LRmb)t>KO#a(;kij}veJ=J*Z).?^bS;rq, O,}yfU?֚(H1 gWC36+Yeupd<{b|5hwh!L ^(fX47ŭ(&?ɇ#g(Ǒr=*M-p>cܸ(jĈHG]>`<gCQGOg/* 9 kYrSJb^"/Jv&ZZVFy~ E2KB'r~M$G#EW+7kB.^@$2_AE4tec y [7"ZݥG/C X_Xi6Ɨu-1y 7+8&]e MO#E6BX{\Z)D ( sTX!jD{]FprLHMy> stream xڍP\[.kpk,Cpwwkn\w w,hpwHNx$̝NoZ[-& (p $58x\hZ ;b4Z3Y&el \\7NvvBRn 2+@:JB<@V.i 7gp2q@`59@bxWz!k66wwwVS{gV3b :܀ TLuƊF в9%ׄX:;9 :4@_J0 ljnw0{VK* 0[64s7w{N gVg~y4Bbo8O 4'_'k  &,\ش GW&"Ȭ.vvv^~0f^G[܁`d |Cr6u\\>^T7BX]f@+?џ@˿;<^/4_['!xpqX8y<^n~GQ3]\_>O_}c@I F<gq#(7oA2vv=ogκ<_5@ j]L@le1e@@ 5_dK{@`VpymogFQSJ!7 H<</Uz0 qyv<8>76ߢ? &o4ylFke9lV<jlvr<>>gr9>wH]/? -BljnIYvƄhwtX]0*֜`/oI_-RGWfLYj=0}{6:-WVs8lNCT{jsDK$|4z̒>̮'V}N_%q1ԦDesRx;VҺ'DC9kk%ƍĴR޼)(R۠ޞ4mFQjUm$]X:g`]z?{݈܄hy;w{i=ٶZO&c(^(SoDKp-u`Q!m%LXYK@nGT)V *됖%ɛ;z;Ry ~1!ه_A]Q ~uLYVcGT B'~ SXzމ yTJȌX&~ 9lK?Z֌M^tX}lVcm~&43sBahvoTfkWµ|Aޮv<,B}1E9ʌyQ?cABWP-W ~|܁bMȑ)ƣ ֈcQѲOA'sr*ݡǡD3R(x,^o[[X~e1}_fyzR;yyK?~BI2!U}$op&"ǜ)ǡrDCTp9nxQ}" >@Y\Y<9Ah+J`\^|Ie-p"I o #͍ѮρXq}ys3S ˷=` )gAFS1o`W\m23y-P0ǥ) lJY %8HdTEϵ茫&? /.k|77#+~uW5ȽPW_g?pȅ{zz yqKړל:d׆Yc*r9Y5iCzݹvL" H8\?sjHP2UH4V;0LU$_EvT#c+ZgvQl!zˀcnn:TVJ)zbem$޹/,9uWL`מcŐeZ| EǓ vn]AT|z٩|q-R:8zطp=aߑYDr#oMoH%oF+ =NC:ՀRN`:`nG̖|b:i=jY%4Hc㸾ׇm('j:$LEt8*$d%cYYr։QFZV k}e=U_^Dn".鼕_; 𿻻A*La:ߑL^D-'7e~W3\bKsc%3j)ш>1nFFs>Ҁ+B6N^ȓ"rmHJ{75lkB|޺/}JP n|\o%¿2]Ƅ5 &?V3*tng^౉o0]|!ONځrOlt.Np3ѩhn E/3 K302%-Y 1j۩N{2>i0{4%&J F6և+RZ'?: ̨]\G(a:||A-o\9 Bd @Kwbs^j/ Q̘oꑵs ݴ{4`=If5))mQu'ɀFyO8C)n!6f-&ITc>D)p"<48=O^G9w\l 5gNiǎ%(uņkvY+&q+A#X ˨yٳltZ&kC*_t=~b4A?:`U@lZS(&_Džn5} WxӦrH}+7܁\ZxSÃ?(T/ʗMo1'R^yǩ,KZїKBɑLF5ąDiȴɊ"TJ}m"LC7fmk(8C)n ),ov1%YAO= Q_vXu~KX ?,~xa7T^ /yL޹мXi'IIibdQ:S'z_=7P8/VϚIn7V1MMت `]ʷC g>NO f IwtmI;TM7p0'N7+WHMh Yqa^h34bT1}?E =*${!zY(~v-WE %n,[o+,$Iu:/Je 2F%i|sJ\' p'yBVJϻ,o.RGB[$Pr $mpUEi( x]^̿V2= QҴvZrNF\40d]h|w53۱ə(2x6#mk$=5u-'NЇ.}eb9hFx6>m.){ǰs/R#XC!K 4b|XfQEto+(;7[sw-6za +FY0PKImvA?.SP\2mGP/0${_FWzT`:pWȓ:vb>LZ0[ %ƗNby5aɕzEK`m?!"LlD}d?j^B C H(u"3Ih/sS? džHj*wU\ZEDTOz%mcQVkUtHmXʵ)֐4Ût iUZWQSmU Eeqdr|@}ko{D3QG?؄V) >1 j{\HbjJ/! `?&;Q TW:Ajd!.{,k"sAba^$dNuĩPaϙ/f"4>ı͢;|IX(Ռw9,zluskrdB)ztlFYxSقplW&5ai7&En$)W赠jA૏-4z?!R)i]GެD0 N#XFտ`L8*0(rn#=(L(aVJpU沰H` ۘf/a ̘AsO((!~/P]_SܾsZ* (x喽`rç}*qNR+k۾tnBl0%:,;X *?(n+e+R I^{1U䣓N=iNzV^C J;B;nSbdOu >O5ѻS,mDt~׼#Е4oj|`.jGf~G-(z$2>0m7yRDRI:zL*7C^;k+䇓M /V( `I)5X^Kn9e!l'B {m_AF2C2##љ=T*9]zb>A{5|~:HHQ~ɫfE7I p<-h$Cq%ءxdU'Ewүל[iK ŗ!ЎCKCZ zA<J#.KlqaRszis 8|V&R"TbI;Vɽޓ@_dRB $ٕ |e*VbW3S1W\xXySeGWD7R pJ:0 W<;laMcxZOOMTAp.SQ-]k{[r$2IxL1Yk߾qUQGOyؔν·t[ǜd9Q?Όmx&RU#FjOܜ4..Փ޴JI~O'k>R$7:mV4,p3g&mDYjz y#$'Ije>aٿtEjD/ ?'ԙ%#qoqA/"S dާu ꝿnLJg2nNF .Z0UOInk0QD7rj>eWaM:Y4Sz2Tos4ɤ*4X]R>5ADɺrƗ~2qxKtȾX_1xd(PxZٖz7|qu`Rp^FxG qd3l+yU)DpS,lGFORKx *ʳm4Ua|-huq<;G%3kL]2ӿ38.%T_C!dtij|}dMBg~نn ݓ!^v6Ԧ?wGܓ^pg.RT .Xךx\b+=9fxԁK~"f:7L"~ޗqONBLV5fsa(K+cRn5_+\3_u]>[wJޘ3L({ǝmԈk+>1N<`tRLI(G )#0hW)c~%'.` mK7i$ 6S{![6.=BFɴb@#%痜خ~FvW4َ 5 \wJZ|b hlDhDad|spm˫|F k4D'&D%yW&>L #d?I*N>w XD8G.W4ݲ}k "|>zun'eAlfnlj i m" z5x ڰ+0|p\C#T$10o$.|EޅrImb_j9=J0 .%n7/y P۷̷p v\{_~ċ%9^0Q7҄FlQ49 kA~$sDE jtdQ_ʦ!Sh>~(S:ReR 4-YM"浬,CgS851'V)}u΢,ɱ1B"rdkP53Fz{\,LeՄ97ⷢP{ .w)7brYRSNX[ѶZ?h3jl)T fCSJ\ۼm84Qtu.DrR8pc*Iq6,_7;k*-7?-,؍'F&<~7%MeP?ȯ -V)-ӎaO=NϷ+ڃKf4@,sPr*!d51v8Mp Y:]LDK]Y5IXHT!0P0ki_|U3]f#9ŰGyFIlL2IU< (?_D8k[&uΨZe\興ya7q[ЍNOg@5&-}R@$H"96BcC%{{)rbIx4 ŅX8X'\KDWw9;LSu /שzƔaT2ڷ}܊QK9 6èF*¬&E쀹9VG'scԟNWk*~>ݵUju-t0:a}m0޽׀3anJQh29 ӯ5g;uJdipoٗ]yF[q¯e?ZD*pB*iMMWItHp*%j=)Qc f_8{p n{dr_o؝B4=b-*):$b["} 'Φ6g(.ǀff+(,6srLHS˼j#u#ĝ^ݙ/jaV?T0\߯Q_!#%[tz6uF*[ }yp8%δ=AJx endstream endobj 79 0 obj << /Length1 1391 /Length2 6272 /Length3 0 /Length 7222 /Filter /FlateDecode >> stream xڍtT6t 2 Ctw "%RHJHKt%ߨ9y}kz{_ff疵Y`P$7O ' cf6#!?(à(L 2ӄAjnPeM B1\`{$*˿6vPLL;@XAVH3*^&DzxxX9#x`p\0B [vZVΠߍ1 ?>aPl"PnP[ Wh5ppy v9XAP{h+i =\+/C+rCQ (PvA"x`ȯyA]"V "xSA6[=V'(ljͅ vu*eAHr_QܲA!^.y|B| @ug+_U Z v?ciP& ?ݿ/z Z_Gk xG & 6} [kUVC}`dF8ׂAP ||Cm@[B-?S*Bm`_H`[yF>@ڂ<3!Q.T{~;<g[F͇‡B<`qQ%rd77xXJƃ{sDjy+vn9x%!v {elϊl'27>_Út[|-7[>Q|å6q5 rhBPcqu%#;V)] ݪVw]:cmT4Ŝk5Mň =$:9$}=zK#d?b{܀񞚉ڄthGnY7+iʶ5d d{SKÂyT\5*zY%ѹ!K0pQmSH5K;| !>}ՆJZX$z)-{c9+}z4/Y*p gUF͏sUV2MK@* NK 6E ᢓj*] $Dw^R}Jz`TY*maCZ1-G8Xd1&])lW ,{LVĠdDNCZ;Dm1^&9F1al}6^gcg{j`,@4s6;¡ ?txRQԒ:འ󱷪]`+tAec^ V4}IL&\;w :nY:zEScwTX$fϒ8wWK }y@HTm 47!Y'nXjfDN=X h3t2Nm9υ GO}) XMii! RHRv@eP7U&*ml;%)D܆! wFJ^]P7r(߸d{)ܧUuq $Ѡwhо4A"QiGS˞M=r&=~wYZUFl(_Nk\$NL #輝ooi4:ξuDVmhA-pq`܎?1{iģ@}C6ضgolJB"_ [sG_KOXSy&1X֤+XkƐ@K&Ok{=Qu=RRx[)L^wMz0W+N8&~bO/Er9Mg}2Vjne؎G.;q>^5ѭ9t+16^9zo*iS.H7=ٿ\7;3Z09)T(2T^QS-Qɹ;@F.XXh}p]Kn]Q!6Ń y͕>4QO߳qnȳ&a>#pS|;GM5K7ẗ xoD39]XO(6O-Zo \cB,Rɻ=^紃ox&&PntVJS).5i¼+|i!˃d͖[!7rKV+7 Wm˓"LV68mIsnv̞ٜqY]RuQ$UWkRآNO?MM׉͗bY~>oUE?3+lޝѐ?|ȉAHW:(}+2ŞE-逾$pjkoQߜ#pOulca8#6\ oLjB[Ɋ!ӷj{ kaTV8CIǝD.<#/~k'ŇtZ$v󾑵i#C+4КâϽ+tR^sNH^{]}튎 4 VKl@_7uMRX: -1/;s"aѠ3t-T*F4Ěʜ]7d7DH1_> P#R 7}VGGdNU-p9llx*>kGztf.ktBi3Ԫ$+6 =N.Q } :M?<6'FhrP+E i2}϶<ƴəI|=xK\=63;x 17.T{RX_iZLw?137900ծ}ﲵA=f,w-۔Iy*V\[6mPp00dǰ0}Q8(~i#~U-IHՌ}+4P_G1Pvs=M" xB?=Z?xR{Uhhej}MfF-^8퀑g179[HU)Fڳt6 Ǘ#S+Y8+x'g@iSU0dSSE `o0LF3 (Swޤz5vX Lbd %pL0+TPsԶnv:b%+.=kYMa+Ѩ;vȟJ:|918"4)I<쎱 ] [) OWUbᖅ09H|s~TP֖g)MP$xԔ/C\b~- aU_{RPqzlm+Sݪ iܽ2Gw&>!&L;Z#ph_odqDCIV^G=>p''+kZF H &+$ޙYbu{M{6L| G{78|4ҿ=RVYGaBqP%Y C}GYV\[ jmHyxfuv%''7bޙhS:3](FS u0 Y 9]fp&4^J'r#57n2y*^:!vikrLYh昙w;*Lk+ڶo}|Sڏ.wK/8MQzfƭ"܎s ǽ%*גZ<r>\ICÉyzh >v,en_nV ꈯy^EAzLe/mгE,}ߔV+ @9wu`AJV• 91|aP}"!% !8x;EZbTrNGCQrrnW ؆|o9DbxLD]Q#}])}f# Љ&}p >"g<% )lb5׶ E|qq/yMѻ?rƚgi?~%^v[VoKw^h јY)NQe"JsK8"qix†%žrІCYtW%ɠ]F0=!Ki9ݍ&?eX8;{ڐy(=Asbk'?5pR"8:HսøΎ AqJ]=no= solH{e1^W,fxauƻd_/1Ta>~`:gdsm-:a}S *7U~nB?BUu1+wseyEᢳAs4`@Id+އ7H:QQg;un˶_C$֣Ζj~{ʤG26h) ϒHp.}I ziuj4@UiV&0}/|վ*9 *uAESA+GiU7֢|Evw-RHeG<هreanN@+:]Gڪ+hمWn >jaN:[y;4dx[m[J`ltGk2Fm -edQG!4:뵘-h-]djP/<Ũ Siͺx8 AO ۤ|-ޜ-nm^m7ya8^QheZh1W3+ @u}哶Ti!l z+JEN4{=8$۶R*Y Hw76',Z03O%zjps$XLez94WE:Ļk*$ Ew/7ZȾ S]u;赫 ƫLَ{xpM{~?f6S-D!THj> zZ̞N`:5DPGmT8cb1͞npNu*lbqY/ E̬<7װ)iI)` vL47)P҃2?uPZejG͂`Q1v3MQvX-X'"]3ӳ^M8%kG1L~ ~zS endstream endobj 81 0 obj << /Length1 1419 /Length2 6562 /Length3 0 /Length 7530 /Filter /FlateDecode >> stream xڍwTҶ()D{+%@ E Ez M:HMk}Zɞgfe4a(*  H D % (@!("6%%ÎPp v 8@v\h vP%8hWI~~OOO> txBю F\ F#b9BQ hOvv8: ׻ յ_`F񡠰_3*s}*pG~ EB݋:p-{(lk +1QWvAD$7ck#/W z'>W'P{ '>EP;4b}}H(H~@ϿV #0_1*TTD`>^A((^#DUT 6b~?ZsG"*m>M#*O)]&>|uL`Bﱦ$}v$::z@%XxUlF#l79TfW! [(-wU͖ !8؁f֠X~`sC:Wo`Ӊ `6)5*+5G2n%w ,uO`Alnjm&2h FٖUΣ8sآ>ʱJ/U] GiWI[t5ZCS ׹|%=16t9B[ } ޫ0(W̼T~[M|?πC8f.C:x" T~_|ڒ RZ͐H\SDJ.}.L؞SK[?DWue dEUxB0Okq7B']=VŒU¯SǒUOO j0_Lv Y+Ӳt7kiJ1У{^ /w%y.~.)l {x')}TcTg?,Ƒ\B@ԓ;Rt!=Cp-@o+,B!fgI֌4hTk]\Grᒣs;o.>e^]4ari Sۋgԏ8yR#SG#. 7ךt/m_`v"<Âv)tb9'D.VEܿ #qYEG)p)4g\-0?4]Lm>Yh*UD\<0ه1Q FߴUA&'|0pZ)ihJVs,Scms$^k=E.wcNJRʶ71B:Jr\o&9qЍ-7հj4}(+fĝ:'](QMs(Lx_aO2o^7x[dS*V%_ Mѧ;8tFGX0qҴOF>4_UzK 9 ?>2)!f"1uF!g9c30lc0"+9xPk6;mc]ȒJϹfV i9 vI83\)i0/+7 y{[olMz*aOxF|&G!̭wZHplpŘ*-~˼*p}V]^jSV 5p72҉?XKݤ7!:Hivϟ<>_kɠTDu-4-HPSc'aQݙ׭reN9ׂ ϙ />̨rK{,e܀Or c!7TAJ/gD+˂f\vGb\)@.zEXk=) 4щ^ܩt+zĖ FwÃ0dKjϗ\'kIML^J>o)BkO8UʇCt:$Xy?,cqhCSy7ͅ33{t]欀$:uR#7J\jKjC]귈 ,6sQk)yx3; V>4F2:8~bWS׮_܅G eMԙnIsJ I a'Bކhl5k1){$FƩJW ;l?&? )r\VwգE[fg$c[7P۩beB2ainzY8|卍&)U zn@jOܣٴW;Y?zJKTKVI4`q9Q,CE Š}DdNًV/}vwrZ0ԛ8]xB_B"ީ')iXГ<ڈ)Ǽo\ B*%cc'DD NҶ@E[%VWS4$T$n^t>ێU}NgF9Q:ùϭ# 1-5M]lLh؄GH'Vr{q`ܤY$[uH{mZP'Xp,F.RkrQ&f3/>QJH_H,v=l.5D|s9a߰V(H:ݛ"6C,<^@ d/*ZKS &n}0nsHG5T”W|y2e u&"]x}2ʺ*ڝ'ς2Rr/ݡKJ;3E;7S5rߍyf6FOXĚq[PW9չ3w*s~Wx*l ӀL5 T6'],{o^0ފ[Ĺ$7C%&ĄUrO߈я/v^i=L\3~lx\5#Π"wG=d?Ú8OgO]%\TKcjyo"둉ݖ~ޓ 6kYT ji24Б;\ \>u}np4<6Sh/ .w^=/G+Nl[I=̓P9kSϛi!k])b:.ЁFq~1>H=9f(nbdciԸr8GLCzt3~ldjf$_vF׏X')5:'2lnb>] yY fo~n54IY}{Ҍ8D8Vy/}m '5'G>ţm)62|i[ڨԾ4tUHw9y7NTDNPu =BNSFTjIKN[{~pYfiidTm {A :tuET`6I̫}8́~)?;.i@L߶ u tK޴9Z\UQ_wvYi7dFfe˦ ? \J IŇWȭ P_R/ :t_?#ŰTbK8!Dy~"ZyxU6Ӵm?ESG1\VV%YIb! q|48Ƒˁgƥϕ9zɒl9㈻Wm)ɥ-T0:K/b|.cZgT~9^㑳#E_-b|ۙ,fps#|ƇYt<IVYMc)L\D65sq:7|o>Ц-~_6ɕbH{Y$ KLBF5:wZBx;O^Fy z{s{Wk`'MnlȆ25Ov@o .>Fg˰U*,pɓ^Z7~jݧf>Čl H[<9uS;6iBԗё-J2M:9SH˟[Ƿ كAD,gljfzMxfLG`/^x\r^7{X9 X~RoЉuthaFzitV@MeɌDSEاSRIOfmgʏW+}}Ctj8/u*;HߩT'z\lD'MY\2cq64fli(tW'ML,Wt\PyIbtȴZDxdOÎod$C8nyqL9(8,jFdsdxWzHM>#۶Vd x+@Mj:5[ig伣V)5nΦqn/Œ̷)IZ騗s]"=\og GHEO>؉-|~+ҕ~2]zbƁ!F.([#0#B;b˸el& &iB3.sGgU/M`j'{Ps@1o3mOG\@9}I'_|)=KWakm sZt KU_ۗB8(}]IZ:k (c7GAį=Nvcr4F^$u̺ÆOQNWuQka]Pwbӽ1B)-c3'6=_I}R?Z*lyF,8L"9cAS2_.}??e=˥1 sF9~2R9f&-o܉R\'vKw`{!EԦ(8[El݇@نD18sJ1->ɦ-6wؑ,![p8Q\nMvPޘQeI#YzU[L%QϟO+8Ŀ^Mt >"˜]u[')?Y1LêLi+" m?ϞɲNhˀkOKRO/nLT6ֶ1}(8]V2+_(IwZ*VCʐH78kf\bqtԞ"&NUwס$sn$MGr0O1Aui7;5︄s(<:ʐH:1Ʌ=XChk̻Y0C'ru@F{Z?>R^DqJbةJ""SL/(&fT/%J~{J2EyfZˆYEw}G!* /-뉖ea Rc.|jjcIJnJ]f X #%Y,+w?t ro6<\4Xu>eL}k%jz,J+{Ò1̜9׭@q+ӆݘ0M}&GFMv!_[ˆjs2=wm;R]kQtX9U|˗䲆Æ1>moR WR)zo f B5 endstream endobj 83 0 obj << /Length1 1376 /Length2 6062 /Length3 0 /Length 7004 /Filter /FlateDecode >> stream xڍxTT6R)= H700 ")Ht+) -%ҍ4{y}kڳz3k33plA*0(Oe`af6# 8 78) @-HJ$J6`;1 0+\dol@v(p l dE `A`rD \%xy===yl\<07v.'An ;6.?0 0{4@@ qځuM+X/yOD`` jC`ɃBplv68 oa"[lt"b^m}y#C?#˩r E"QQa?ڀP{@vw8G ҆! O C,%w6.` `H-@jKZ ;{6H5C@v`/e77 ҅0(>!EtF>EHjvg]e(fKl"77oY#W_~*@^ rF= xpG{[ 3?J: mX^錊7F̾uT|`mWp8Mw,|bƏj젥T<rߚw :;ØhZѷ=Zksts$0n7'{@!C*5|n 3ĐSXb7twCu[KkCO 4zEI(I}3'P%d?n(_(3R,Y.*oKtopV zc{LxF:{j=;/(G4&j;oՂtr:F]O)XI饙&!_f& XHCVхйۛ|JP1誣i38?90Om7h81ҒMśvd&4 _|"2PAjºrru:U%ȉύ3 jnkcIN8Ѿ\)tptX {Jzqk߷u;|h]!n܋V0 :YS3 ")}4󭳆oyuO Q]kV?v<鏥I7p}~Db;*1ZhnU\'22l?krhxRRh=rAg Jbֹ0q*@q_tH%s1b<`(}#:DV3y9ӋhkUףEZ>K`_|u>۲0yFՂi&\rLT`7TWHV`JAUKL-ktpݝү wuqmMO|R|7z%y-Bi&#:\1h +~i?0[k"KXd< Яܴ(w _'. (ePv폭DwV)ɌrlKH[;?P)tyWRcN"LKV%>/)eޘI1pC_1e=[OJΊ+w|8Ù=dK^J.s>N}PǙ x)#.z0h`HWWclN{8bVݞ>n<]&N^ZHxԒ.k  \LF%Zgu{+I3 p5U$BDa#(Í:1p^qDH{h=^%$3~v*nukS߈qK"%/gR )û3sK5VoYĒjTXC(7iD9HSUK@ua/(6Q?epb=C3̀y4:=l9qzbA$I[o_]dd0 ;E]<[!0`̗NqD1‘>Q&Z(.daUeՎ3M\XbpFNMr߻-ڌBꧾNi|sd/9̮hoT^)˴8ۖE=8EC E~Dzt[`|7X0^blql/YT$ucNכ(A-UJipv Dy=.qjQe룪(Z,dخMy9\ʹ"`G";ʞ.jF(}X.꘹/.aOnz 4ޝͿ6HQ+4Պ>j|9;meO?|94Ni+˺Cb1֚[㖚,{v aP:XH`'XkJNb{m`@eNj[.uǹnsY3!KhJ(%6aLRo*4;/)=7yt Oofy.hsah7jy]-FU}C̼\|yw1ɜ~[5l-Ѫ` {jR%<BZb=)(}x5Lj< kRG/M}O1uJD%Vd݇ʹfHgm9a|T6L7TWl_܉9!ݕ?(VixϷ`&>ڹcYp1qX_WO'o̗A= .i+J>:(Q&&|{ךyO~ۆaRo/ykB_z-AxLش|SсS~+6-c,7'hAPYIԸY2{ ?&O4(CYQ]q!,6B\Mǁa<5eS'nA#E#U> O=ŗ$<3ё9{Q>r#،Y00[ǷYkP若Ą' {ġLa?ޤ)0?@)+pPQE (W}CB,)nϦDo't-sT݂uo.lg?aL7fOgL&Ln6뽴S0`h4nꆴ9^RjaT~Jk4*#'ב _7h}q^v55Ѯd`ɪNs#qVx'i_V‚E*S]uB9 Y+ގ /[j(?kv)׌A_Z}Wn% =7xIqu3:hw?eR/c*#̄`U(s w`nybF鋵Ͽ6wh.1e:d4VT۾L1p_*[&s*B7"Y^"B Ѡ`Y<*%FF4K)e,@ P` KӠh_ae'A rd ~U`TsoV}TN+U'j^ub,o+eQJG9YCOMe+Jk_밅Ѿ}Fak&8/ƱspĹ[ }x֍reQAOgW9lg3 4=AHQO8bɖ PٟT\y?b[f[NMXЮG_j9Rଜv{My9bⳃKLLoIf  -˩RwiQ9hz2vr%^ts'uS!"i)OS[]ѫ/03 kZhi4ԅ=`iT\Fi|4uM \Ω*7zVrntئ1Y>i %`KQSgjK:8c'f3S玏X9?&ڔRjL֖?aMm3d@l" JT5c*YLR%f~|U9]ǺCVXG>K[RS17A3YoW11?<- $Zp/9? ܭ?X: X0֚Z{Yub]„Rȃ>>0PDS8uI<Hσ&8>څD 2kAh-:}nƫ┛{O.i4PBuXD wUI ϧ/$w$v{t ݜ+>zƛ(bS'zECo*qhbBz/t{l2[FDgEn bo8@xu ht<8LYPoa^êF/Gh)sbixZlNeX bԢO0H|ױUG0m)GXw[U$s$ žjg$@qak$O24"" ˶Hb +Ӭ6~z_ >+g'EΔmRy(98eq#Y g-2P3lu- nD\<(I@żkLɵsQAYi5kCbln) b0;, a n#j i8h:V]oIKKocܶX";*ffw0W ^QYñ^']Փ*ƬI 91}󺇱g zq:eI߻8օCИwY`?Ч3['-ЪνܝiGG︎f]l{ԅ}Ӷ[a+ 5q5ωN.1ˮ|W#WȬ(n ~Jk6seB6'sY}CD\>տ @8~x&hٚT^XRyv?70hN6혇kFLV>u&[Kzk ^ :(R˕R Z[?rX0 Gn'qh6\IȩKD1]/뮇zXG)E3h, F3ZnL|wxv'Wk&(}7drVL+Ec|?޳&*qMLm^.UPLոUDq!Ŭ2d EͳӄfrtO쯝Ŵa*KYY3+'Ɍ5JZz`\mh~ BfTM3rz\}pK wmEЎ1-{p9HWVϓ5ӷ]Jt:#<-싍3w|ߡ$X򘬦i灋saؼt=7Hj"yX4:ryZ8N_~ߚ/L7^LQuBfk߯z$GR e֣re`q/t>EAdLdu?#cYWܾM:q-5:3^#<Vo nrg!YG>-Ogލru+umÐ{%B\n2o\-Ϳ+g|( J읯<9a"m)9OeBwD!\ \}CT4?:tf\yk d,0I$E#a'z 0Z(1Ie4/0,39!KϤUDϏV`0ŒfI(qÌG\!elٛ+x6pzmu #҆tT_]t^x-j{!zrHJ=pFiHVҭ9wMdavohYrQ>TX;^A=(Cڅz_Oqxܥ_^ߧ|}'Ҕ{YC|s1%(],dt{0<2vI0vw^ͷ*{Q88bTTT싆{7tm.[Kcc\oV1|jL곶藍Ff`CN]؛mE'c_ 9J׭AҴʣӛe r`0~|~-,"+^h~J%ؔh,18#qU.2croƽ@te0\`_xva=.f@ܙaP‡$;jnN4)u^ww$k'Q/1nDc RQM-'[t>@^P endstream endobj 85 0 obj << /Length1 1610 /Length2 10116 /Length3 0 /Length 11171 /Filter /FlateDecode >> stream xڍP\-\܃K` 0f5h  ݝ.=!=>~{5Ug^ݻ{ջ#K)K9XȨ(qsx9x0u p;옌`'g *ɂODU pq sȂ\!UNk(spX+ł-,,g8@A iE @f=++8Atss;sœY9n @ vr[h'&#@Cfw9O;;Vh+п*8o#g0fz@+. ws@P? ;gS<?,:?g 'ܙbG?+3 ;}o X`k?ٟ`;Ao 7'Y vy@e=Ey[SZzx>w :*iU`{@XK \0?B7xzp?ϐ?*HO?_d\žfT=_ W z)_rqre8C_y@0g7Sq~. rP /99<0 @N( x`s`@?L"A^P?HT7FOL0ho$_ )?S@!?I@?S*?S?|JT۟66SO/-0f`A*ʥ(^9 ?C۔#w yu}ʛ1+6+zp'Vd;9Bd |{PfYŅrk/Қ^Lrt+C4=Nl42!!^lfR ɩ%ɑ݃<=dʝfcI9O,gMAY̝%EӔ6NO6{WeV?bH}s7g^7ek>\QT\LkC~|/JExsBdr`Z SN~Z_3] WnSb ?ޥͦ=Rd' }]N˛t iO`‡̎ lW:yd[>5I/r140%@Lgq}`cP+dw{ǔviGz/T Yńcf8FXpK'x}=\ZYUz_uc8TBMwN3Fba7:IQ1@K6baoVe:uFg֟êbhV'}E~8 ԓu{3i( o&@JFjUl-4ِD(s0lORE:Gjz3xћ6q%:HD4lmW/2N6Fm9G2?.T3~^PZ)~fUYAjq /g8ncM a }z=e2hxEE:m껖=o悏Y eF@q{0=bOX7., ˂15ڂ,|#XA3kJM/[ 4>aDYc¦Tu @:Bݧ4M)3x.$c&,Z~h m|'zs` hSWȕٮ]1c7BC#kQD+P:T-$ f7^>_6h# X=b9M^=G8ebf+rxÒMtC3us~+KM6 aY :ۥB²"g 2x)5?2ԝENfnNRݮro 󃖜^[jFD(A5Q9;V<s+z弔]\O,>F/m4Ll ﷲmЦ D9faꜱ~39;7#޳N YfO^9AMgc$qRW- gUb X+VܙYMup<>lFB_*#t2rn>ҿRsKJyN]4E\zܚء2S3pתDPGA geh/`\13YcM16q09 5ظ <@}n[-n;CRYF+Sh!Ф tKO!DҰO m>-1_V*p jDgRX=h3L vBalI&Npf@i!ܦZ B+sAE<$K ~Ck|\ݭP=u1Q9)S1QE+ BWo6N`n 8T{@%<qUږ'3H#fk]dqx7PoUUSDcim-x*^lqT%A2$ЭSmY(zC@[D |t]`ձ92;qJ rf@t~* &7 0<-j ؄Myf<2?'C6|nB<9k5 q lueCVǠJjfN *0TL[98R:+z{u$Ϥnψ(T_eܴ U!zt.wx3wʆ]sIP,:xڣ WnHİ2kZnz%PvuE;"@&qK+N|(gWw~qEXT#*g3xL P׶'xar0 >X0\99zJ]oc"W) =x,BRBBl)W i][g1;W,D$~ʾNfSF*q&&O*%4r\fC,%X>YXsi`1+o>* ?"D좮n{Q5p@ߊ@ݹ1C35v}ۯ%질F83WϤ=՟!,VpY0Eгi2odt<}dk!{tڼV46c |Ep9J8` d=ݏmPw# ߩ#GU3Mѧ/bބmojdryRHhݤ(muT_IjE6jY5K>- AW֬m*ሯbH1_!/CKC?;7e]TtFEF~Zjj܂hTWKGkA#$U5~VAw e\Y֍ۊ**L*Low DGVaq~tk3؅&ytІ~TE7 ~^:ys2`}-HrGǤe:d%JvT~ʣ}N]h@]Zųޡx_4%|nXMzA0]y@;hkj>k<8, dδ\)vI1n#,%]a{ɝvl#=QZaBQewJk0_yPm3v(eK覬}B͞usN%}I7%Z}f'Hr.=*=X6A Aדst>&⋜Ͳ#YpkE'4+`O:Dbby u ît4{bރǭ4>;\(trxuP͐ ;!tԤn*xo0ѣ]n,wdC97̇<_z[)ޛz(E.ӱRO?r ю@ܿƓ9[–1k!+¯kLH|n}Ҝ$\㹤5?j)[xCjdŏ}zl@h!SVϻ)"2ZRwYK,o&Sw߯꯮BĽ +(u,$ְͧ&]~Ҷ4v(nˋˉ)1;^6\[|kĔEDAQM6,j#Įf`|Y ]oYj9Y"*aIJҳs1/ô7a*KbWLU.>EmeZ- T֫E*ϯwcVoHU>}#м̖ yR=]'~DgEsPg/6䯲vр|o8m0~}X3M~o :u99ncl_PGDE6U&#'%*cՃ`g./&eDBzmx$BtQ8n4s 0nQ_095c kN: [_YX$InT6Jũ8,, BI{፩,XV0(GvT}K{M݋:,u<%Zv9kӒ Yy"rD*7V9esOi/ǘ4|4|vn}-d1o%+ lo)Be2Mӈtlj9Suelfw r4BedLw,NRhk (aF_tĀsg}m4" * +yҼ/,2+TC) )1׏ww*rD-%[9O^uj^Zh#y?$`#18dYBNȊ~*Z,s(cL^[+XIa;r:%5_Ada8|E׼, f9nh#6h!@| g{KS馢./HpSVR4B7Jscqo;/C[ Si^c$M>NS,L("i#.kߩa;xDyx̫MVA.< ߈ˬFNJ{=W௣a@iC|E#i $#d8sFpbxr`Ʈ>h8߼8A8@vR'AF#q968 y2Uh?ﮪH$WifhBC5ilBЭOWDbibc_+(1«ߣg|elV.6oZ>5SܗMZ$:Ӻ~`Shs,S!$vгYф!E遯rZU٧C,rݐHP:6#eK; c/D6΋pFs*nޓ~1oᱢ-VNT=;8rԷ?!Qh^(|ܥZo@~Z5Pyrӓo/O[<7ԘT ;~JrC)9+tn¿.Vr}2%"oA+MTâXM^ӿ%ab0F^U$6\.efBޜfR>}]9XLd"I"9Q*@dj(?DyՔ[9 L:r <ԀW0A)K9*okD7`p> }R #GQn$k(T(򏼕+jq26i|<˅8r~W$TS_ni,hmr)ϺpX6KQbIjJZNL<} 염2$h타Eѭ]m^pn[@c-8JUy%(ú߽.rCi\́l%rxg6]wlX&kѻ)E(Hj _3R),T;e&6%aIlFudYdɞ9bk=rxf |x)as^I_67u?f',ww YSܒT,Ǽ$wմ?Wf3 qLq`-*; xXޖ9:뙉D Tjl%c*~xѼezߟ5_ĩMX ap{#I! YG~1o7k&!EIp_ٵCW :r^D1N𻓌ܬm /2UFZAF)+X'⚰ESYLKǥ\ot9sʌ#5yh[A#D3ryd#|^wU7uߴc!N'##Ae# |ƅ~':)}%+`` \C1W P]jf˷t\w{="lV>9O7!JxAAt Gɾ#| 8HMp3.r;ڒmrIb${l#$`I傄1 }φfQ !F~bu))^7^Ne2| 9Qv-QxVJ$-f s٠N7-o+ߟ1^{cr<;u\B'*eh?r/]fᤝP`zۑNH\74KAehG21\oW &w): Bl'պ;=ɂ'6|[5 ,-}f?1󨍕.%@iR1#}3MU|!XL=U*%k}ZN{{fQ8"H3e"ɍiےTؤeyϧ}G=b6x=SC%AoV_pՐT8(Vy/7~[-x}5I$›r^wuϔ`s/_Vz $bGta(jx[؈L0GH^(;in}az!"zr lGg!Pkz-MÃƐjܫ-NAL#r_I^Av"f7A#b871T 3\/q#W)0l?\q\f ΊY}61B_~H1nS@a4*tW_5ZgA2?8zdw yr|`oLjy?yu. |[o×f@ZQE`6d"O##?p0GML>M;MNwH~ h=dzbftg98 cڊ Or~ɱ&W"lGeBJ=М2c{?Տ63H0_h #v <\rضql!I 67D>7>\Td`*Yx 2|C/AP{к| M7k0OMP%N[ܔcP(@1uc|DI+cwbVBHN(8oe)CR_#a#nbtjk]a)ȭ[PL-KܦؾL8!+͢F-R% UhV!aq.BG/$oCzZZ1uL"j{ sR%gIQ_#$Jš~^Kh|+Ք?D~i6>.Oɬ}2lƇ$c0x{V m$1yr{f-4GԾ{OA}OiQ'{C`ApBV#j]%ײ^MUsKtIVD;|96ZUEa70)N4*&TDju)^Ao'_#Y"E-O]!^G^4~M9Q։ H>2j f]%"{R h}!f`MNjxƐQt Wr;p~i$=`oX#S(įٴi뭒GVzTUp)t/N]ص;:!Z&whI:Nxf$WBb@2#f ]?_%F R[{~b9,.ljq[waKA+QsLRA߿GWj&sJfM>S֩D}i+Z٦4"^Rq)yab몠ɽEOgReʛ 4EWgA䔮z@3?"'e;{!HJXLNMy2%_;,G $ƚ0ȩXeԯ䃄 57o: /^dja]9AW,Gc~1q#G6ƓiD5h\6ޚMi16٧7E(oxwҿDv/l4c4t ӭѾ|my `^\(k9Qx$Ť 73.bg'P0'BP">"tR@Ea.LS4C}6e헿^D=GZ̮#NDM!Bea_lY-̳zhg g+9nF:v 2SQI*[ LR/M(m&'Uf{o!Q`ì*A@t!pxVZaHaG4/_i= d2J#sjh%=LYc_D)kYL,* $ՄϲC1X/ <]{Sc+r0{BԽ'x/|I]|ъ0ήVTeZ> stream xeSw G2'7eɖ{$$dz ޿x?66Gh($BD'z;zݰH#X#E!ѠCbЀ0? q zx?:t4@.$xHpю;b(?%LfE̴,p$gL_C8,EplqD$b>TB*x7Q4GT?z8$a#$?P~"$Pg  D؟1#@$"'%!A ۏ Y0P'HS cG2(P'PB?*w**oO e $ x,/v ;!  jj w^qZp t;"ii~bQs1#/XrO`X5h\M˖\^xbbAH;.,fQbeD`)Mm3wY+gI,c+"sw~Y83o>ʁ}rq~}+V5`sfrhKV}윞`XU5cK i"fSObn4"Pgrk)U=-ƇA!%*+Lk΅Wt) ?ل%IMxp k$zpl!pM5{YN{ sp[65M:W*uJuH<|{~|`Uw2TX6.ٵ7L}ꇦ DjV/喇d;O7[s̞}2rGA@aNE^ǿeA_`a˒#ϣO8lYR=]fdϢW4\Qxf?8T\V,%lRT.Z~2/w\+3%"UI6v?bGe[.HZF|ߏմ`p*|䤕 vi|ln݇2':R#99Ke7JF"rҤAT.YS6ށjN^lk$DC]]c YE3_qɓ &h[tek*|漞óՊցݞLCEpƂS\qK"Exn+U猔[ GhԭQ3ӓ8W<0QH|kI=xqe)oV3My_inwҼI=b=ɭ?c:' 9ԗӣ ˛{Ԍ'nso%Hi7cxkCO:ks/ynCTOw%y+33P+6FJƴRC[[˔ޕ)$D1Ph/KژbO=G1tW2`M 3)@>UΦT@5f.9O+uI%<ZHqaL}_S y1M [Ր{7h?Vi$q+ N7N:Q:V=8ە9~U5R7xUʞvT_JeSh6?ʶDH(u ;/ǀ"/E9eY*Z!($NN#)Ox32t${kkb+`dgm-I aaQo:I^E$ ^d$L#/'k[@nZqUi|Jې96֫{۞K(Nah;|Z wOfAhד{&ZcjeѲr%j&_*Uc /}IYVsUF Y/m]Bˋ֤aeEnigGI(i&#m%-~lզ~xeUcptAwTgU !zXSK%z G:N`X;͍)cTx̶Wг W<%'9[B#ՑW4/$ 2 8|`X8ԧ$/RѶ ϷzeNoqOuxK&y"-TZke3gw@g,wjop;h֜dudWg%*MyRM^1}+5F&/{Ĥgֲ;]_ލjN3s '}$G[V_-f4m+yƕRR)Ŵ鱀7\b D <rq)C!\Ρ8(MlBd?X;XV@N$b_tS1øbvȻ^a)PcntnJ)U5DX`âeGJژ(m[jOkי\`@5޼s,}? Bh.sOOfpamjk^Kb6NP9+#;%~ LKevR_^=/ʓ(`{8Վ;6ꖶޣ 0Ͳ{AòPDDh4lbCI0@\V[m yrfYz_=X_Ls+}yBƋ1vp{Ÿ251813i1zU&CbйN 4"!'A.%QۡV9. MFi^{ѢqlI=톀csԘ:e qolv[ 7jF-bҜn. VЃo]0c5*/^w{> stream xeR{4Ty(Ac_9D{x,;3{ǝkسdUauDDy{DR"*LJvhb{[|?}|<q1.̐fQ!IWTL"q"Lk). HјրHpDb4+UwwL&# PD ; NP Dd##,Aq>*jI[6Z,~0Z K9$,FyPh1䃓(*!H+,<)RmG1! %Q &}qE(/Cd2`D!.\X<b$T-n`|@ 0qKf,r-d(Fr5*Y7Lh,TD{}0|  $0J-  +K ' &4ٙ.+*Uؘ# L 0춲6c'M[XԂbJAb:5"I.;i8`Ɖtݐ oYfCDLC?7l;z*5>9&6:h%+'mƗh,[-W|ȺWWBi>VK*wM~n\.t!(L;]]Ok=1l>`*E%LG+׽6YAGh;ع9ٺjVcX)3;3vO͏(Np1+sr!ϮY9::WR8l4",ձ=;4HIn!,u^n<`Sr^޻znt͓|V+b i1"l Z^s>]^n8\])zsE}9=l -O4P; *Nq-scm '6^<}?ݔ4kVfsH_yY~:\KqJ^,X a_׍O kqFC/3mˊVZs:o50>Yˣ9AN5^} 2;drfʭ&;ꦻR~c4Ot:;zzy\U/]!D ]UQ4^Rvdjoc N:) > stream xeRy {XJ!M2u,(U&b1xט,d)ZD$E*YZldM\Di۽~y9t=064N an#@waX8bp@ 0!Q((fa@6CDZx(2 6ܙMx8;N 1`A7)̅!@~QX ^ g2 #I~Kq)Ljf0A5Ɓ!aA.,VJ6\ [VML sx qđ joUxC05S'" Gոq Vޏ89-_Q6R;4$J+A/܈pdes"B^=j _eWGWyJuy ~r["Fl>[ % s;)S oB}]I*rkJGvΒ Hi7'7wh- 룍Eby+AU/pv~ɗ K{ ˣ$/˟Qݱͼ ʑԺl(LZY:@8`[]e u ս\%cF*azCQGp`~CL= *h^nm -ț;l"9Tݻ$7ʁW*nF"t|[39`o@t7of#Q9EtƦs/:ZAIȥ Iiz1eY{DGwh5jd* 痉ߞ^KMSsB9"8swM`NjZܑ\"}im_VL^nPJh}L״~fͫ 1]Wgu˶  |?xPS^kޞ] *6f'lVD&*"Ɖ=6aN!7ӗ}km20fQR'1j)O>KKd#+G~Qxm/i4W=joBi~eѽp ay`vǎ[w_-vF!7b- di *#4w+R{ť5q(<ԇ!$׎A'5X+J ~.+ k=ɰqń&ÉrQܝBRgv%^=G~$W%Q-> E|zrd.BHoaEҐrKքˢFþ1{rJV9Xjyq;gS1_mXz[*Tȓq 6GG&ܣnZ>Kw^ImI6֊?GMRlCĻΉ Ws^HH_&k1tS;C:|12B|3/:Ӟ=9~f&+*w(SEYQ ǎքV-jU䏗wW'};$B!~P.d{InӆO;֨ u76L7tѕRtjgo  $&j5g4J֨]=4\u$6x({ڼ^?_k{$'tRFdGKuRTNGe0ۏd V4lK2aqkڷf T endstream endobj 93 0 obj << /Length1 1019 /Length2 3492 /Length3 0 /Length 4180 /Filter /FlateDecode >> stream xeSw 'G$'#3#{;wܝ"2J qJ"[ddwy~zՁa=X QVAdw!`Dx8 82H@r 5f  LF1DCBxH /,G"$C~!1/j)փ` H~O? pGA8D Pp3d%"T ]!^ԝwxD$*@FB}1pP߃ 8Iz^3N/~C`X *ײԫXVB`XB ճ.~cs A{Q /hbaH PTV x<$D- *Hxuy9 H8"jꪀ<{'R=#u@7R  0 )4~Ԇ^y,UGPp4ͤZRo/=2=[EaH3# ?ZW*(ꪊ &Axc֨ {!;2b}+u3Asg= POʏeu:OQ^w']5:Q7$u)П:mֽND7?9qݛI>^bjZ]{!ZbO~,CRͲdѭ7;=hL[d]ڹ̱v陌9 o~ aKˆi|Er8ۅ,[XWE0[!fze"(e,uy fvw[ib3} m>'( >ZX&FHG?ԝGO)|_[R\{-٩&Vd2M/0 !k61sQ@pk&Gln@%ڪcƉ/4cO'!ɞlhm% K4ܑ{D'6ÑU~F*\j+er3%l"@GD!ѫWp: ]""u GeHCS +/kٻtܽeU,ڟiNI$$'rI8?*eNIIM_,bfrn+3DW\5P3ui=ǒ8.f//^d- J쒸w *ZCllLL\8iFNeE8ϼj1Ȓyj݁r^l ;f]tcy=RO ٻy B<$>+8]\V۞[>vnx2O$p- 6'FDX%  m>xxk|z籁)Γ,Ksǂ1M ʚoE{KʦSZE7fDov}~PhdRwGfɒD16^# 0JH~ZrC }ri8e%s2 ]IZ7-ZW"e#`/V}蠆OI#ĪEu'#x7gM +pW"RU| 'ژ h󬿾3Yo_U9.lsx.:2*@W`XXpa=7[ph ]a~j>BJm+HE<5O{&[!;\LqxSnE92.ֵ 3 =%=>v5z9>{2MmX^Vبذ_}H0ܿQu%\7}9<C}Љ;M +1|Ć[K:]iFh=xmXgM-{yS]'ŬhMb]˚goD9=7ay\z~{Jn?Mђ^d.R_]2]O';8q!$wSm*zEzm%> Ic>qD$Yz4mKپ)I+y fў\,´ه;ݓA:Gc,CX@&-85UOK^U͌l}Jד|DwY7mCZ쁪ğ6XǞ:xvpoQd;o#]9trV:i/=e0H/j'׎o%raVmeS4QYq^4r%"B+a:yVۚ>yTYNύ!ymOdq(4Q{TtDW^!xm`a_SQLKQrQZ=S3VMƊeo@Gل4Í`3q<DͻNn/eB̯yй"F.wWk=*J}bI6lr/*aa-=OjsMc!]Kv$2ژl'cO--ݺ _kg(ρh ]xCB\%șne9W{aW{~[!JBlҷDEf94exh}^|đ8SJ[KR׾t+vl4\YӲCN%LFxԶ//y 8{LݵArt?0 3tgYٰuҟ-1q؎y ES2JӒoiٓ>F>9eJvyiIGY39;x=&<U4ULP2O+^:JͽJA𞱐0 {2mD Rk\UޔG#܅ v!" VKց4w$EXh|@ :sq;v\0Mbdez{N _ ,GTVq|8{ֶrl=#3֒nb74#~޹piu]]vybHHcF \ ج[3~&Ej%*>߶LˋbEkNB aE.\}2͊w t:m ]GW؏Iݙ|Cʐuu sCz2=po4v$rwZLIH endstream endobj 95 0 obj << /Length1 1306 /Length2 1345 /Length3 0 /Length 2180 /Filter /FlateDecode >> stream xڍS 8Tޱ]EOQ-O2AR*Yk̬1&Q;]RNH؅JEI]ӖP.]8g h9Y]O1l ōidpqQ St' OvX"E0+pfJ gfjA[eA:j I,8c(,%bb p |8DB(pp,"^BBqWL a`%q"ɐHJ$ֆF@$e`-$'K#N8<0>.$0 B R"Cy'WN ` liMt qH  |DulW2)P|(B?OlzN'J1.%KF2 f{gD0KI %L7hاAy|e<"2nCH_l0T܌`r 1<)D abL Dp8‡?R .a_;H4!\J0;1  6S U|B(B)[re)o3b˄qo~H{| ' !2ѷ^'"v?P\L0\{kBgH"$*:10O<8t\BF1 |LBR)4$b;'G>0 sIM1eL`~LK,qG D/a@QVCSOY7;9Vq5hi JۍvZ=F*w\ɏ+ܕi0o(/Ź.ީ-/!k$%i14TbJY饹6y2eҾ55o_ݹOgxvhҖݭ)vH>Tů4,g5Pi/Xgn5 7D7Պ:3ya AM5o|I_Ԑ'{wζbAOliEiGs 2_fj4rgz9Gf[Wk3}/J9h~?Uk|4R[ٜNTش@__vdݼcp"=Oy\ظ+t38cZs2.-ӱ('5u]팴^Hb+M:wUz.& [G6Z̸9!k&lĕԭR?:I=tm/#Xa RG"2dtOW'=nU$ǃ/:^-2YeINVyé<-GDUn+˝qcxitz8gdYBR%GMܸ}ŗʧns7xfkP*3SLP~PoT$\1 w7Wu}}flYSW-*Nyi/ }xzGxVQ³:3 yFœ9.^o2js> endobj 18 0 obj << /Type /ObjStm /N 71 /First 589 /Length 4699 /Filter /FlateDecode >> stream x[nG}W.k~,Z[_䁒27萔o&gȑCJlT_TuJUURUUJ9YiQK&TTRZSi]Ie܎4]%-7424p2>Ji+CD-+c+%=3„ DA$*/$}ѕ4 -ŇH¶ sWWQcC=h]HS9EtH$%I%E@Cx.ʓ2V$ hIRYov< UEK-W a|hR*RjIu$kK$laPsE6aDUOCP$ieE⼭$x^l$tO VTH63,YC#i1GR%P°T&E “Zw"Mv;?Sꗣfޟ\ϛewlr3=kfrh8jǣɷ꣠G*~١S3ؿhc Ul"]J!UB#,l\7lE;s!O,l PN _N'goyxtPͷyB()ՇI;T*\(P*LWz j%&ޱC봋+\]gKIШR%R%-[£ <RZ EZJE$ kk ]J:AĵNuh*ܨu)s>)zҿW9Y*5BH-bS~@t>Kx?սDq"P3#TkJCpP.dE[YdȴnL5!v[+FIњَ論icr,ǫ7 5[{KycE%=؊WCۓ?+h%NF ^ Ch>[),xD of{Dq^`UK+'z&XF.@gYhYSa;ڼXQ*%$ȟȋ5V%U rpey'?kͤMp٣]/^wEP:1AphL+1&.mi12b mcR"r8AM/k4n-M^VW69|#)G2球R$?r"Mm9&Hۡ,Wז7m]IF0K1G bNc* |pHdLȂI)bG@cr# |Kܛo`.nH[pd@_Ǝ[ ñwp+/mj&4'qT{6`"#AC#N_`cV Zoݦ߰5S\2yu%g6l{߈7~yd*x]%S/ ^NL'$/"ozzф~>T|~y+@q=yLFψpHG`pN/\HN(P,M,e:!Sg޴rWZQdY|Ý^;5~[_nLoQ o|վR["?+v+7sv^Y-o=ʷiR @ _1ɩO=Tri=^~+틱q 2ϘSJy+3eX4>=!y qSFh8::@06-/HE`T҅V**/R2Wl %J#т3/o&ݑWe&:U2˔OqCSv\[*.:t] b ݙfGC'r؀ NxGE\L,^K4'XOAb^ziьM;K}1!["ef!K ˣfv6O7-/FWޛýIA.G$=Du^,^PE}yҌ/>vj=|t9>{x}qT4ys3]DI_?կ71)wVMFyP?צ4z|R&]66E/t<95Wj_*y=/R /H(zP^>{}e\= (Sqjv>}!T 5Sf/sA͎ϳYy_&:?><{CN-mRIwQhIg0d֧|Z[φo|$^Qo~8|gX7-!hbwBa~N?xttk3G)Vg7W.ou\f1+s/)9m9~̛Ԗp ?BFxCҤC Ggd)f`4v 4>U6 =trh~O#`eѢD:erҸ騺QlOG^D‹{1wf.=Fgo9_y>~܂IR7)lF^?/'/0wЛ:wӍ|򵔽(|kowq5|f%c ([`-o-`5vVLz`(m~3kN '3>c;q],us{Nq endstream endobj 99 0 obj << /Type /XRef /Index [0 100] /Size 100 /W [1 3 1] /Root 97 0 R /Info 98 0 R /ID [<5CE3949C8CC7449973A244E533D63916> <5CE3949C8CC7449973A244E533D63916>] /Length 273 /Filter /FlateDecode >> stream x;/a)֩NE_g-RuS"!H>au~&X亖_$cff1Y`'d̑H6!d,S8,rmdI ?uFH-,|V zDa#7H4V%1FI$]$NI%}$`>Tj|J~*^́j8We~TR5 OyU ~qJËiՇj^:Qˡ*C ?}?+P endstream endobj startxref 181484 %%EOF susieR/inst/doc/mwe.html0000644000176200001440000020472614143477604014751 0ustar liggesusers A minimal example

A minimal example

Matthew Stephens

2021-11-12

In this short vignette, we fit a sparse linear regression model with up to \(L > 0\) non-zero effects. Generally, there is no harm in over-stating \(L\) (that is, the method is pretty robust to overfitting), except that computation will grow as \(L\) grows.

Here is a minimal example:

&nbsp;

 

Plot the ground-truth outcomes vs. the predicted outcomes:

&nbsp;

 

Session information

Here are some details about the computing environment, including the versions of R, and the R packages, used to generate these results.

susieR/inst/doc/finemapping_summary_statistics.Rmd0000644000176200001440000001002014075324172022234 0ustar liggesusers--- title: "Fine-mapping with summary statistics" author: "Yuxin Zou and Gao Wang" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Fine-mapping with summary statistics} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ``` This vignette demonstrates how to use `susieR` with "summary statistics" in the context of genetic fine-mapping. We use the same simulated data as in [fine mapping vignette](finemapping.html). The simulated data is expression level of a gene ($y$) in $N \approx 600$ individuals. We want to identify with the genotype matrix $X_{N\times P}$ ($P=1001$) the genetic variables that causes changes in expression level. The data-set is shipped with `susieR`. It is simulated to have exactly 3 non-zero effects. ```{r} library(susieR) set.seed(1) ``` ## The data-set ```{r} data(N3finemapping) attach(N3finemapping) ``` Notice that we've simulated 2 sets of $Y$ as 2 simulation replicates. Here we'll focus on the first data-set. ```{r} dim(Y) ``` Here are the 3 "true" signals in the first data-set: ```{r} b <- true_coef[,1] plot(b, pch=16, ylab='effect size') ``` ```{r} which(b != 0) ``` So the underlying causal variables are 403, 653 and 773. ## Summary statistics from simple regression Summary statistics of genetic association studies typically contain effect size ($\hat{\beta}$ coefficient from regression), p-value and minor allele frequencies. These information can be used to perform fine-mapping with given an additional input of correlation matrix between variables. The correlation matrix in genetics is typically referred to as LD matrix (LD for linkage disequilibrium). One may use external reference panels to estimate it when this matrix cannot be obtained from samples directly. Caution that LD matrix here has to be correlation matrix $r$, not $r^2$ or $abs(r)$. `univariate_regression` function can be used to compute summary statistics by fitting univariate simple regression variable by variable. The results are $\hat{\beta}$ and $SE(\hat{\beta})$ from which z-scores can be derived. Alternatively you can obtain z-scores from $\hat{\beta}$ and p-values if you are provided with those information. Again we focus only on results from the first data-set: ```{r} sumstats <- univariate_regression(X, Y[,1]) z_scores <- sumstats$betahat / sumstats$sebetahat susie_plot(z_scores, y = "z", b=b) ``` For this example the correlation matrix can be computed directly from data provide, ```{r} R <- cor(X) ``` ## Fine-mapping with `susieR` using summary statistics For starters, we assume there are at most 10 causal variables, i.e. set `L = 10`, although SuSiE is generally robust to the choice of `L`. SuSiE regression with summary statistics is implemented as `susie_rss` function, ```{r} fitted_rss <- susie_rss(z_scores, R, L = 10) ``` Using `summary` function, we can examine the posterior inclusion probability (PIP) for each variable, and the 95% credible sets. Here, we are the 95% credible sets. ```{r} summary(fitted_rss)$cs ``` The 3 causal signals have been captured by the 3 CS reported here. The 3rd CS contains many variables, including the true causal variable 403. We can also plot the posterior inclusion probability (PIP), ```{r} susie_plot(fitted_rss, y="PIP", b=b) ``` The true causal variables are colored red. The 95% CS identified are circled in different colors. The result should be very similar to using the individual level data for this example, as the z-scores and correlation matrix (LD reference) come from the same genotype data-set. ```{r, fig.width=6,fig.height=6} fitted = susie(X, Y[,1], L = 10) plot(fitted$pip, fitted_rss$pip, ylim=c(0,1)) ``` ## Session information Here are some details about the computing environment, including the versions of R, and the R packages, used to generate these results. ```{r} sessionInfo() ``` susieR/inst/doc/mwe.Rmd0000644000176200001440000000237614033741524014515 0ustar liggesusers--- title: "A minimal example" author: "Matthew Stephens" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{minimal example} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 4.5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ``` In this short vignette, we fit a sparse linear regression model with up to $L > 0$ non-zero effects. Generally, there is no harm in over-stating $L$ (that is, the method is pretty robust to overfitting), except that computation will grow as $L$ grows. Here is a minimal example: ```{r} library(susieR) set.seed(1) n <- 1000 p <- 1000 beta <- rep(0,p) beta[c(1,2,300,400)] <- 1 X <- matrix(rnorm(n*p),nrow=n,ncol=p) y <- X %*% beta + rnorm(n) res <- susie(X,y,L=10) plot(coef(res)[-1],pch = 20) ``` Plot the ground-truth outcomes vs. the predicted outcomes: ```{r fig.height=3.5, fig.width=3.5} plot(y,predict(res),pch = 20) ``` ## Session information Here are some details about the computing environment, including the versions of R, and the R packages, used to generate these results. ```{r} sessionInfo() ``` susieR/inst/doc/trend_filtering.html0000644000176200001440000042312114143477734017334 0ustar liggesusers Trend filtering

Trend filtering

Matthew Stephens

2021-11-12

Introduction

Although we developed SuSiE primarily with the goal of performing variable selection in highly sparse settings – and, in particular, for genetic fine-mapping – the approach also has considerable potential for application to other large-scale regression problems. Here we briefly illustrate this potential by applying it to a non-parametric regression problem that at first sight seems to be ill-suited to our approach. In particular, it does not involve strict sparsity, and the underlying correlation structure of the explanatory variables is very different from the ``blocky" covariance structure of genetic data that SuSiE was designed for. Nonetheless, we will see that SuSiE performs well here despite this (partly due to its ability to capture non-sparse signals via Bayesian Model Averaging).

Specifically, consider the non-parametric regression: \[y_t = \mu_t + e_t \quad t=1,\dots,T\] where the goal is to estimate the underlying mean, \(\mu_t\), under the assumption that it varies smoothly (or, more precisely, in a spatially-structured way) with \(t\). One very simple way to capture spatial structure in \(\mu\) is to model it as a (sparse) linear combination of step functions: \[\mu = Xb\] where the \(j\)th column of \(X\) is the step function with a step at \(j\) (\(j = 1,\dots,(T-1)\)); that is \(x_{tj}=0\) for \(t<=j\) and 1 for \(t>j\). The \(j\)th element of \(b\) therefore determines the change in the mean \(|\mu_j-\mu_{j+1}|\), and an assumption that \(b\) is sparse encapsulates an assumption that \(\mu\) is spatially structured (indeed, piecewise constant).

This very simple approach is essentially 0th-order trend filtering (Tibshirani, 2014, Annals of Statistics 42, 285–323). Note that higher-order trend filtering can be similarly implemented using different basis functions; here we use 0th order only for simplicity.

Examples

Here we apply SuSiE to perform 0th order trend filtering in some simple simulated examples. We have implemented in susieR 0.6.0 a funciton susie_trendfilter which internally creates \(X\) matrix with step functions in the columns to match input \(y\). The algebra have been optimized to work on such trendfiltering matrices. Here we simulate some data where \(\mu\) is a step function with four steps, a 0th order trendfiltering problem. The regression is truly sparse and SuSiE should do well.

Plot results: the truth is black, and susie estimate is red.

&nbsp;

 

In the next example mu increases linearly. Thus we are approximating a linear function by step functions. Here the truth is not trully ``sparse", so we might expect performance to be poor, but it is not too bad.

&nbsp;

 

Compare with the genlasso (lasso-based) solution (blue). (This will require installation of the genlasso package.)

&nbsp;

 

What happens if we have linear trend plus a sudden change.

&nbsp;

 

The two fits seem similar in accuracy. We can check this numerically:

susieR/inst/doc/finemapping_summary_statistics.html0000644000176200001440000043443314143477574022513 0ustar liggesusers Fine-mapping with summary statistics

Fine-mapping with summary statistics

Yuxin Zou and Gao Wang

2021-11-12

This vignette demonstrates how to use susieR with “summary statistics” in the context of genetic fine-mapping. We use the same simulated data as in fine mapping vignette. The simulated data is expression level of a gene (\(y\)) in \(N \approx 600\) individuals. We want to identify with the genotype matrix \(X_{N\times P}\) (\(P=1001\)) the genetic variables that causes changes in expression level. The data-set is shipped with susieR. It is simulated to have exactly 3 non-zero effects.

The data-set

Notice that we’ve simulated 2 sets of \(Y\) as 2 simulation replicates. Here we’ll focus on the first data-set.

Here are the 3 “true” signals in the first data-set:

&nbsp;

 

So the underlying causal variables are 403, 653 and 773.

Summary statistics from simple regression

Summary statistics of genetic association studies typically contain effect size (\(\hat{\beta}\) coefficient from regression), p-value and minor allele frequencies. These information can be used to perform fine-mapping with given an additional input of correlation matrix between variables. The correlation matrix in genetics is typically referred to as LD matrix (LD for linkage disequilibrium). One may use external reference panels to estimate it when this matrix cannot be obtained from samples directly. Caution that LD matrix here has to be correlation matrix \(r\), not \(r^2\) or \(abs(r)\).

univariate_regression function can be used to compute summary statistics by fitting univariate simple regression variable by variable. The results are \(\hat{\beta}\) and \(SE(\hat{\beta})\) from which z-scores can be derived. Alternatively you can obtain z-scores from \(\hat{\beta}\) and p-values if you are provided with those information. Again we focus only on results from the first data-set:

&nbsp;

 

For this example the correlation matrix can be computed directly from data provide,

Fine-mapping with susieR using summary statistics

For starters, we assume there are at most 10 causal variables, i.e. set L = 10, although SuSiE is generally robust to the choice of L.

SuSiE regression with summary statistics is implemented as susie_rss function,

Using summary function, we can examine the posterior inclusion probability (PIP) for each variable, and the 95% credible sets.

Here, we are the 95% credible sets.

The 3 causal signals have been captured by the 3 CS reported here. The 3rd CS contains many variables, including the true causal variable 403.

We can also plot the posterior inclusion probability (PIP),

&nbsp;

 

The true causal variables are colored red. The 95% CS identified are circled in different colors.

The result should be very similar to using the individual level data for this example, as the z-scores and correlation matrix (LD reference) come from the same genotype data-set.

&nbsp;

 

susieR/inst/doc/trendfiltering_derivations.Rnw0000644000176200001440000002761114051613310021366 0ustar liggesusers\documentclass[11pt]{article} \usepackage{Sweave} \usepackage{fullpage} \usepackage{amsfonts} \usepackage{amsmath} \usepackage{bm} \usepackage{mathabx} \usepackage{xspace} \usepackage{natbib} \bibliographystyle{abbrvnat} \newcommand{\susie}{\textsl{SuSiE}\xspace} \def\vb{\bm b} \def\vy{\bm y} \def\vx{\bm x} \begin{document} \title{Implementation of SuSiE trend filtering} \author{Kaiqian Zhang} \maketitle %\VignetteIndexEntry{Implementation of SuSiE trend filtering} \section{Notation} We first describe the notation used in this text. We denote matrices by boldface uppercase letters ($\mathbf{A}$), vectors are denoted by boldface lowercase letters ($\mathbf{a}$), and scalars are denoted by non-boldface letters ($a$ or $A$). All vectors are column-vectors. Lowercase letters may represent elements of a vector or matrix if they have subscripts. For example, $a_{ij}$ is the $(i,j)$th element of $\mathbf{A}$, $a_i$ is the $i$th element of $\mathbf{a}$, and $\mathbf{a}_{i}$ is either the $i$th row or $i$th column of $\mathbf{A}$. For indexing, we will generally use capital non-boldface letters to denote the total number of elements and their lowercase non-boldface versions to denote the index. For example, $i = 1,\ldots,I$. We let $\mathbf{A}_{n \times p}$ denote that $\mathbf{A} \in \mathbb{R}^{n \times p}$. We denote the matrix transpose by $\mathbf{A}^T$, the matrix inverse by $\mathbf{A}^{-1}$, and the matrix determinant by $\det(\mathbf{A})$. Finally, sets will be denoted by calligraphic letters ($\mathcal{A}$). \section{Overview} Trend filtering is a useful statistical tool for nonparametric regression. \cite{Kim07l1trend} first proposed $\ell_1$ trend filtering for estimating underlying piecewise linear trends in time series data. This idea can be further extended to fit piecewise polynomial of degree $k$ to the data. In their paper, Kim et al. showed the equivalence between the $\ell_1$ trend filtering and the $\ell_1$-regularized least squares problem. This motivates us to think about the connection between trend filtering and sparse approximation in general. \section{Trend filtering and sparse regression} Trend filtering problem is defined mathematically as follows. For a given integer $k \geq 0$, the kth order trend filtering is defined by a penalized least squares optimization problem, \begin{align} \hat{\vb} = \underset{\vb}{\mathrm{argmin}} \frac{1}{2}|| \vy - \vb||_2^2 + \frac{n^k}{k!}\lambda||D_{k+1}\vb||_1, \end{align} where $\vy = [y_1 \dots y_n]^T$ is an n vector of observations, $\lambda$ is a tuning parameter, and $D_{k+1}$ is the discrete difference operator of order $k$. When order $k=0$, $D$ is defined \begin{align}\label{D1} D_{1} = \begin{bmatrix} -1 & 1 & 0 & \dots & 0 & 0\\ 0 & -1 & 1 & \dots & 0 & 0\\ \vdots & \ddots & \\ 0 & 0 & 0 & \dots & -1 & 1\\ \end{bmatrix} \in \mathbb{R}^{(n-1)\times n}. \end{align} In this case, the components of the trend filtering estimate form a piecewise constant structure, with break points corresponding to the nonzero entries of $D_{1}\hat{\vb} = (\hat{b}_2 - \hat{b}_1, \dots, \hat{b}_n - \hat{b}_{n-1})$ \citep{Tibshirani2014}. And when $k\geq 1$, the operator $D_{k+1}$ is defined recursively, \begin{align}\label{D1_2} D_{k+1} = D_{1} \cdot D_{k} \in \mathbb{R}^{(n-k-1)\times n}, \end{align} where the dot product is matrix multiplication. Notice that $D_1$ here in \ref{D1_2} is the $(n-k-1)\times (n-k)$ version of $D_1$ described in \ref{D1}. Now we want to transform the trend filtering problem into a sparse regression problem. Let $\bm{\beta}=D_{k+1}\vb$. Then if $D_{k+1}$ were invertibe, we could write $\vb = (D_{k+1})^{-1}\bm{\beta}$ and the above problem would become \begin{align} \hat{\bm{\beta}} = \underset{\bm{\beta}}{\mathrm{argmin}} \frac{1}{2}||\vy - (D_{k+1})^{-1}\bm{\beta}||_2^2 + \frac{n^k}{k!}\lambda||\bm{\beta}||_1. \end{align} We can consider this a sparse regression with $\ell_1$ regularization problem, where the design matrix is $X_{k+1} = (D_{k+1})^{-1}$. \section{Modification of $D$} As we have seen, the trend filtering problem becomes a sparse regression with $\ell_1$ regularization if we consider the design matrix $X_{k+1} = (D_{k+1})^{-1}$. However, $D_{1} \in \mathbb{R}^{(n-1)\times n}$ is not invertible, so is $D_{k+1}$ for $k=1,2,\dots$ By observation, we complete $D_{1}$ as a square and symmetric matrix \begin{align} \hat{D}_{1} = \begin{bmatrix} -1 & 1 & 0 & \dots & 0 & 0\\ 0 & -1 & 1 & \dots & 0 & 0\\ \vdots & \ddots & \\ 0 & 0 & 0 & \dots & -1 & 1\\ 0 & 0 & 0 & \dots & 0 & -1 \end{bmatrix} \in \mathbb{R}^{n\times n}. \end{align} And for $k\geq 1$, we obtain \begin{align} \hat{D}_{k+1} = \hat{D}_{1} \cdot \hat{D}_{k} \in \mathbb{R}^{n\times n}. \end{align} We notice that, by this modification, $\hat{D}_{k+1}$ has $k$ more rows added at the bottom without changing any previous entry. With this modification, we are able to invert $\hat{D}_{k+1}$ and consider the inverse matrix as a design matrix in the sparse regression. \section{Special structure of $\hat{D}^{-1}$} After determining the design matrix $X$ in the sparse regression problem, we could apply \susie algorithm to help us find a possible fit. Here, we denote $X_{k+1} = (\hat{D}_{k+1})^{-1}$, where $k$ is the order of trend filtering. Rather than generating $\hat{D}^{-1}$ and set this as an $X$ input, we exploit the special structure of $\hat{D}^{-1}$ and perform \susie on this specific trend filtering problem with $O(n)$ complexity. We will talk about how to make different computations linear in complexity by utilizing the special structure respectively. \section{Computation of $Xb$} \label{computation-on-Xb} In the trend filtering application, since $X_{k+1} = (\hat{D}_{k+1})^{-1}$, we obtain \begin{align} X_{k+1} \vb & = (\hat{D}_{k+1})^{-1} \vb = (\underbrace{\hat{D}_{1}\dots \hat{D}_{1}}_{k+1})^{-1} \vb \\ &= \underbrace{(\hat{D}_{1})^{-1} \dots (\hat{D}_{1})^{-1}}_{k+1} \vb \\ &= \underbrace{X_1 \dots X_1}_{k+1} \vb. \end{align} We notice that since \begin{align} X_1 = \begin{bmatrix} -1 & -1 & -1 & \dots & -1 & -1\\ 0 & -1 & -1 & \dots & -1 & -1\\ \vdots & \ddots & \\ 0 & 0 & 0 & \dots & -1 & -1\\ 0 & 0 & 0 & \dots & 0 & -1 \end{bmatrix} \in \mathbb{R}^{n\times n}, \end{align} \begin{align} X_1 \vb & = -1 \cdot [b_1+b_2+\dots+b_n, b_2+\dots+b_n, \dots, b_{n-1}+b_n, b_n]^T \\ & = -1 \cdot \text{cumsum}(\text{reverse}(\vb)) . \end{align} Let $f: \mathbb{R}^n \to \mathbb{R}^n$ such that $f(\vx)= -\text{cumsum}(\text{reverse}(\vx))$ for any $\vx \in \mathbb{R}^n$. Then \begin{align} X_{k+1} \vb & = \underbrace{X_1 \dots X_1}_{k+1} \vb = f^{(k+1)}(\vb), \end{align} where $k$ is the order of trend filtering. \section{Computation of $X^Ty$} \label{computation-on-Xty} We consider $X_{k+1}^T\vy$. Here $X_{k+1} = (\hat{D}_{k+1})^{-1}$ in the trend filtering problem, and $\vy$ is an n vector. We have \begin{align} X_{k+1}^T \vy & = ((\hat{D}_{k+1})^{-1})^T \vy = ((\underbrace{\hat{D}_{1}\dots \hat{D}_{1}}_{k+1})^{-1})^T \vy \\ & = \underbrace{((\hat{D}_{1})^{-1})^T \dots ((\hat{D}_{1})^{-1})^T}_{k+1} \vy \\ & = \underbrace{X_1^T \dots X_1^T}_{k+1} \vy. \end{align} Similarly, we observe that since \begin{align} X_1^T = \begin{bmatrix} -1 & 0 & 0 & \dots & 0 & 0\\ -1 & -1 & 0 & \dots & 0 & 0\\ \vdots & \ddots & \\ -1 & -1 & -1 & \dots & -1 & 0\\ -1 & -1 & -1 & \dots & -1 & -1 \end{bmatrix} \in \mathbb{R}^{n\times n}, \end{align} \begin{align} X_1^T \vy & = -1 \cdot [y_1, y_1+y_2, \dots, y_1+y_2+\dots+y_n]^T \\ & = -1 \cdot \text{cumsum}(\vy). \end{align} Let $g: \mathbb{R}^n \to \mathbb{R}^n$ such that $g(\vx)= -\text{cumsum}(\vx)$ for any $\vx \in \mathbb{R}^n$. Then \begin{align} X_{k+1}^T \vy & = \underbrace{X_1^T \dots X_1^T}_{k+1} \vy = g^{(k+1)}(\vy), \end{align} where $k$ is the order of trend filtering. \section{Computation on $(X^2)^T 1$; i.e., colSums($X^2$)} \label{computation-on-d} To compute $(X_{k+1}^2)^T \bm{1}$, let's first explore the special structure of $X_{k+1}=(\hat{D}^{(k+1)})^{-1}$ for $k=0,1,2$. \begin{align} X_1 = \begin{bmatrix} -1 & -1 & -1 & -1 & -1 & \dots \\ 0 & -1 & -1 & -1 & -1 & \dots \\ 0 & 0 & -1 & -1 & -1 & \dots \\ 0 & 0 & 0 & -1 & -1 & \dots \\ \vdots & \ddots & \\ \end{bmatrix} \in \mathbb{R}^{n\times n}, \end{align} \begin{align} X_2 = \begin{bmatrix} 1 & 2 & 3 & 4 & 5 & 6 & \dots \\ 0 & 1 & 2 & 3 & 4 & 5 & \dots \\ 0 & 0 & 1 & 2 & 3 & 4 &\dots \\ 0 & 0 & 0 & 1 & 2 & 3 &\dots \\ \vdots & \ddots & \\ \end{bmatrix} \in \mathbb{R}^{n\times n}, \end{align} \begin{align} X_3 = \begin{bmatrix} -1 & -3 & -6 & -10 & -15 & \dots \\ 0 & -1 & -3 & -6 & -10 & \dots \\ 0 & 0 & -1 & -3 & -6 & \dots \\ 0 & 0 & 0 & -1 & -3 & \dots \\ \vdots & \ddots & \\ \end{bmatrix} \in \mathbb{R}^{n\times n}, \end{align} Define a triangular rotate matrix $Q \in \mathbb{R}^{n\times n}$ such that (i) For any $i, j \leq n$, $Q_{ij} = 0$ if $i>j$. (ii) For any $k < n$, $Q_{ab} = Q_{cd}$ if $b-a = d-c = k$. We observe that if $X$ is a triangular rotate matrix, then \begin{align} X^T \bm{1} = \text{cumsum}(X_{1.}). \end{align} Since $X^2$ is still a triangular rotate matrix, we obtain \begin{align} (X^2)^T \bm{1} = \text{cumsum}(X^2_{1.}). \end{align} Since $X_{k+1} = (\hat{D}_{k+1})^{-1}$ is a triangular rotate matrix, \begin{align} (X_{k+1}^2)^T \bm{1} = \text{cumsum}((X_{k+1})_{1.}^2). \end{align} And, obviously, the first row of $X_{k+1}$ is \begin{equation} (X_{k+1})_{1.} = \begin{cases} \bm{-1} & \text{if } k = 0 \\ g^{(k)}(\bm{1}) & \text{if } k > 0. \end{cases} \end{equation} \section{Computation of $\mu$; i.e., column means} \label{computation-on-cm} For each column $j = 1,2,\dots,n$, \begin{equation} \mu_j = E[X_{.j}], \end{equation} and $\bm{\mu} = [\mu_1, \mu_2, \dots, \mu_n]^T \in \mathbb{R}^n$. Hence we get \begin{equation} \bm{\mu} = \frac{1}{n} X_{k+1}^T \bm{1} = \frac{1}{n} \text{cumsum}((X_{k+1})_{1.}), \end{equation} where $(X_{k+1})_{1.}$ is defined above in \ref{computation-on-d}. \section{Computation of $\sigma$; i.e., column standard deviations} \label{computation-on-csd} For each column $j=1,2,\dots, n$, \begin{align} \sigma_j & = \sqrt{E[X_{.j}^2] - E[X_{.j}]^2} \\ & = \sqrt{\frac{1}{n}\sum_{i=1}^{n}X_{ij}^2 - (\frac{1}{n}\sum_{i=1}^{n} X_{ij})^2}. \end{align} Hence, $\bm{\sigma} = [\sigma_1, \sigma_2, \dots, \sigma_n]^T \in \mathbb{R}^n$ becomes \begin{align} \bm{\sigma} & = \sqrt{E[X^2] - E[X]^2} \\ & = \sqrt{\frac{1}{n}\text{colSums}(X^2) - (\frac{1}{n}\text{colSums}(X))^2} \\ & = \sqrt{\frac{1}{n}(X^2)^T \bm{1} + (\frac{1}{n} X^T \bm{1})^2}, \end{align} where the first term involves \ref{computation-on-d} and the second term is computed in \ref{computation-on-cm}. Note that in the algorithm, we set the column standard deviation 1 when the column has variance 0 for computation convenience. \section{Computation on $(\hat{X}^2)^T 1$; i.e., colSums($\hat{X}^2$)} \label{computation-on-std-d} We want to compute colSums($\hat{X}^2$), where $\hat{X}$ is scaled by both column means $\bm{\mu} = [\mu_1, \mu_2, \ldots, \mu_n]^T \in \mathbb{R}^n$ and column standard deviations $\bm{\sigma} = [\sigma_1, \sigma_2, \dots, \sigma_n]^T \in \mathbb{R}^n$. We define $\hat{X} \in \mathbb{R}^{n \times n}$ such that for each $i = 1,2,\ldots,n$ and $j=1,2,\dots,n$, \begin{equation*} \hat{X}_{ij} = (X_{ij} - \mu_j)/\sigma_j, \end{equation*} where $X = X_{k+1} = (\hat{D}_{k+1})^{-1}$ if the order is $k$. \section{Conclusion} Computation details from section \ref{computation-on-Xb} to section \ref{computation-on-std-d} explain how we can benefit from the unique structure of matrices from trend filtering problem. As shown by our formula, we do not need to form any matrix and complete \susie algorithm with $O(n)$ complexity. \bibliography{trendfiltering_derivations} \end{document} susieR/inst/doc/l0_initialization.Rmd0000644000176200001440000000376313350763557017363 0ustar liggesusers--- title: "SuSiE with L0Learn initialization example" author: "Kaiqian Zhang" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{L0Learn initialization demo} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE,comment = "#") ``` `susieR` allows for a customized initialization. In this vignette we deomonstrate how to use [`L0Learn`](https://github.com/hazimehh/L0Learn) fit to initialize susieR. ```{r, warning=FALSE} library(susieR) library(L0Learn) ``` ## Simulate data First, we simulate data from the minimal example. ```{r} set.seed(1) n = 1000 p = 1000 beta = rep(0,p) beta[c(1,2,300,400)] = 1 X = matrix(rnorm(n*p),nrow=n,ncol=p) y = X %*% beta + rnorm(n) ``` ## Fit L0Learn We start with fitting a L0-regularized model to the simulated data. ```{r} set.seed(1) L0fit = L0Learn.cvfit(X, y, penalty = "L0") ``` Let's choose the penalty strength parameter that minimizes the cross-validation error. ```{r} lambdaIndex = which.min(L0fit$cvMeans[[1]]) L0coef = as.numeric(coef(L0fit$fit, lambda = L0fit$fit$lambda[[1]][lambdaIndex])) effect.beta = L0coef[which(L0coef!=0)][-1] effect.index = (which(L0coef!=0)-1)[-1] length(effect.beta) effect.beta[1:10] effect.index[1:10] ``` The L0Learn model finds `r length(effect.beta)` effects, which will be used to initialize susie. ## Build an initialization object We create an initialization from `l0learn` coefficients using `susie_init_coef` function, ```{r} set.seed(1) s.init = susie_init_coef(effect.index, effect.beta, p) ``` ## Run susieR with initialization Now, we use `effect.index` and `effect.beta` obtained from L0Learn fit to create an `s.init` object. We then run susie with this initialization. ```{r} susieL0.fit = susie(X,y,s_init=s.init) susieL0.fit$sets$cs ``` ## References 1. Hussein Hazimeh and Rahul Mazumder. (2018). Fast Best Subset Selection: Coordinate Descent and Local Combinatorial Optimization Algorithms. susieR/inst/doc/susie_refine.Rmd0000644000176200001440000000531214113171573016376 0ustar liggesusers--- title: "Refine SuSiE model" author: "Yuxin Zou" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Refine SuSiE model} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ``` In this vignette, we demonstrate a procedure that helps SuSiE get out of local optimum. We simulate phenotype using UK Biobank genotypes from 50,000 individuals. There are 1001 SNPs. It is simulated to have exactly 2 non-zero effects at 234, 287. ```{r} library(susieR) library(curl) data_file <- tempfile(fileext = ".RData") data_url <- paste0("https://raw.githubusercontent.com/stephenslab/susieR/", "master/inst/datafiles/FinemappingConvergence1k.RData") curl_download(data_url,data_file) load(data_file) b <- FinemappingConvergence$true_coef susie_plot(FinemappingConvergence$z, y = "z", b=b) ``` The strongest marginal association is a non-effect SNP. Since the sample size is large, we use sufficient statistics ($X^\intercal X, X^\intercal y, y^\intercal y$ and sample size $n$) to fit susie model. It identifies 2 Credible Sets, one of them is false positive. This is because `susieR` get stuck around a local minimum. ```{r} fitted <- with(FinemappingConvergence, susie_suff_stat(XtX = XtX, Xty = Xty, yty = yty, n = n)) susie_plot(fitted, y="PIP", b=b, main=paste0("ELBO = ", round(susie_get_objective(fitted),2))) ``` Our refine procedure to get out of local optimum is 1. fit a susie model, $s$ (suppose it has $K$ CSs). 2. for CS in $s$, set SNPs in CS to have prior weight 0, fit susie model --> we have K susie models: $t_1, \cdots, t_K$. 3. for each $k = 1, \cdots, K$, fit susie with initialization at $t_k$ ($\alpha, \mu, \mu^2$) --> $s_k$ 4. if $\max_k \text{elbo}(s_k) > \text{elbo}(s)$, set $s = s_{kmax}$ where $kmax = \arg_k \max \text{elbo}(s_k)$ and go to step 2; if no, break. We fit susie model with above procedure by setting `refine = TRUE`. ```{r} fitted_refine <- with(FinemappingConvergence, susie_suff_stat(XtX = XtX, Xty = Xty, yty = yty, n = n, refine=TRUE)) susie_plot(fitted_refine, y="PIP", b=b, main=paste0("ELBO = ", round(susie_get_objective(fitted_refine),2))) ``` With the refine procedure, it identifies 2 CSs with the true signals, and the achieved evidence lower bound (ELBO) is higher. ## Session information Here are some details about the computing environment, including the versions of R, and the R packages, used to generate these results. ```{r} sessionInfo() ``` susieR/inst/doc/finemapping.R0000644000176200001440000000551414143477576015715 0ustar liggesusers## ----setup, include=FALSE----------------------------------------------------- knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ## ----------------------------------------------------------------------------- library(susieR) set.seed(1) ## ----------------------------------------------------------------------------- data(N3finemapping) attach(N3finemapping) ## ----------------------------------------------------------------------------- dim(Y) ## ----------------------------------------------------------------------------- b <- true_coef[,1] plot(b, pch=16, ylab='effect size') ## ----------------------------------------------------------------------------- which(b != 0) ## ----------------------------------------------------------------------------- sumstats <- univariate_regression(X, Y[,1]) z_scores <- sumstats$betahat / sumstats$sebetahat susie_plot(z_scores, y = "z", b=b) ## ----------------------------------------------------------------------------- fitted <- susie(X, Y[,1], L = 10, verbose = TRUE) ## ----------------------------------------------------------------------------- print(fitted$sets) ## ----------------------------------------------------------------------------- sets <- susie_get_cs(fitted, X = X, coverage = 0.9, min_abs_corr = 0.1) ## ----------------------------------------------------------------------------- print(sets) ## ----------------------------------------------------------------------------- susie_plot(fitted, y="PIP", b=b) ## ----------------------------------------------------------------------------- i <- fitted$sets$cs[[3]] z3 <- cbind(i,z_scores[i],fitted$pip[i]) colnames(z3) <- c('position', 'z-score', 'PIP') z3[order(z3[,2], decreasing = TRUE),] ## ----------------------------------------------------------------------------- fitted = susie(X, Y[,1], L = 10, estimate_residual_variance = TRUE, estimate_prior_variance = FALSE, scaled_prior_variance = 0.2) susie_plot(fitted, y='PIP', b=b) ## ---- eval=FALSE-------------------------------------------------------------- # remove.covariate.effects <- function (X, Z, y) { # # include the intercept term # if (any(Z[,1]!=1)) Z = cbind(1, Z) # A <- forceSymmetric(crossprod(Z)) # SZy <- as.vector(solve(A,c(y %*% Z))) # SZX <- as.matrix(solve(A,t(Z) %*% X)) # y <- y - c(Z %*% SZy) # X <- X - Z %*% SZX # return(list(X = X,y = y,SZy = SZy,SZX = SZX)) # } # # out = remove.covariate.effects(X, Z, Y[,1]) # fitted_adjusted = susie(out$X, out$y, # L = 10) , ## ----------------------------------------------------------------------------- sessionInfo() susieR/inst/doc/susierss_diagnostic.R0000644000176200001440000000514714143477651017500 0ustar liggesusers## ----setup, include=FALSE----------------------------------------------------- knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ## ----------------------------------------------------------------------------- library(susieR) library(curl) ## ----------------------------------------------------------------------------- data("N3finemapping") b = N3finemapping$true_coef[,1] sumstats <- univariate_regression(N3finemapping$X, N3finemapping$Y[,1]) z_scores <- sumstats$betahat / sumstats$sebetahat Rin = cor(N3finemapping$X) attr(Rin, "eigen") = eigen(Rin, symmetric = T) susie_plot(z_scores, y = "z", b=b) ## ----------------------------------------------------------------------------- s = estimate_s_rss(z_scores, Rin) s ## ----------------------------------------------------------------------------- condz_in = kriging_rss(z_scores, Rin) condz_in$plot ## ----------------------------------------------------------------------------- fit <- susie_rss(z_scores, Rin) susie_plot(fit,y = "PIP", b=b) ## ----------------------------------------------------------------------------- data_file <- tempfile(fileext = ".RData") data_url <- paste0("https://raw.githubusercontent.com/stephenslab/susieR/", "master/inst/datafiles/SummaryConsistency1k.RData") curl_download(data_url,data_file) load(data_file) zflip = SummaryConsistency$z ld = SummaryConsistency$ldref b = numeric(length(zflip)) b[SummaryConsistency$signal_id] = zflip[SummaryConsistency$signal_id] plot(zflip, pch = 16, col = "#767676", main = "Marginal Associations", xlab="SNP", ylab = "z scores") points(SummaryConsistency$signal_id, zflip[SummaryConsistency$signal_id], col=2, pch=16) points(SummaryConsistency$flip_id, zflip[SummaryConsistency$flip_id], col=7, pch=16) ## ----------------------------------------------------------------------------- fit = susie_rss(zflip, ld) susie_plot(fit, y='PIP', b=b) points(SummaryConsistency$flip_id, fit$pip[SummaryConsistency$flip_id], col=7, pch=16) ## ----------------------------------------------------------------------------- s = estimate_s_rss(zflip, ld) s ## ----------------------------------------------------------------------------- condz = kriging_rss(zflip, ld) condz$plot ## ----------------------------------------------------------------------------- z = zflip z[SummaryConsistency$flip_id] = -z[SummaryConsistency$flip_id] fit = susie_rss(z, ld) susie_plot(fit, y='PIP', b=b) ## ----------------------------------------------------------------------------- sessionInfo() susieR/inst/doc/susierss_diagnostic.Rmd0000644000176200001440000001050614142575215020006 0ustar liggesusers--- title: "Diagnostic for fine-mapping with summary statistics" author: "Yuxin Zou" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Diagnostic for fine-mapping with summary statistics} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ``` This vignette demonstrates diagnostic plot for consistency between summary statistics and reference LD matrix. The `susie_rss` assumes the LD matrix accurately estimate the correlations among SNPs from the original GWAS genotype data. Typically, the LD matrix comes from some public database of genotypes in a suitable reference population. The inaccurate LD information leads to unreliable fine-mapping result. The diagnostic for consistency between summary statistics and refenrence LD matrix is based on the RSS model under the null with regularized LD matrix. $$ \hat{z} | R, s \sim N(0, (1-s)R + s I), 0 SuSiE with L0Learn initialization example

SuSiE with L0Learn initialization example

Kaiqian Zhang

2021-11-12

susieR allows for a customized initialization. In this vignette we deomonstrate how to use L0Learn fit to initialize susieR.

Build an initialization object

We create an initialization from l0learn coefficients using susie_init_coef function,

Run susieR with initialization

Now, we use effect.index and effect.beta obtained from L0Learn fit to create an s.init object. We then run susie with this initialization.

References

  1. Hussein Hazimeh and Rahul Mazumder. (2018). Fast Best Subset Selection: Coordinate Descent and Local Combinatorial Optimization Algorithms.
susieR/inst/doc/susierss_diagnostic.html0000644000176200001440000075476414143477652020264 0ustar liggesusers Diagnostic for fine-mapping with summary statistics

Diagnostic for fine-mapping with summary statistics

Yuxin Zou

2021-11-12

This vignette demonstrates diagnostic plot for consistency between summary statistics and reference LD matrix.

The susie_rss assumes the LD matrix accurately estimate the correlations among SNPs from the original GWAS genotype data. Typically, the LD matrix comes from some public database of genotypes in a suitable reference population. The inaccurate LD information leads to unreliable fine-mapping result.

The diagnostic for consistency between summary statistics and refenrence LD matrix is based on the RSS model under the null with regularized LD matrix. \[ \hat{z} | R, s \sim N(0, (1-s)R + s I), 0<s<1 \] The parameter s is estimated by maximum likelihood. A larger s means a greater inconsistency between summary statistics and the LD matrix. The expected z score is computed for each SNP, \(E(\hat{z}_j | \hat{z}_{-j})\), and plotted against the observed z scores.

LD information from the original genotype data

We demonstrate the diagnostic plot in a simple case, the LD matrix is estimated from the original genotype data. We use the same simulated data as in fine mapping vignette.

&nbsp;

 

The estimated s is

The plot for the observed z scores vs the expected z scores is

&nbsp;

 

Summary of SuSiE Credible Sets:

&nbsp;

 

LD information from the reference panel

We use another simulated data where the LD matrix is estimated from a reference panel. There is one signal in the simulated data (red point). There is one SNP with mismatched reference and alternative allele between summary statistics and the reference panel (yellow point).

&nbsp;

 

Using the data with misaligned allele, SuSiE-RSS identifies a true positive CS containing the true effect SNP; and a false positive CS that incorrectly contains the mismatched SNP.

&nbsp;

 

The estimated s is

In the diagnostic plot, the mismatched SNP shows the largest difference between observed and expected z-scores, and therefore appears furthest away from the diagonal.

&nbsp;

 

After fixing the allele encoding, SuSiE-RSS identifies a single true positive CS containing the true-effect SNP, and the formerly mismatched SNP is (correctly) not included in a CS.

&nbsp;

 

Session information

Here are some details about the computing environment, including the versions of R, and the R packages, used to generate these results.

susieR/inst/doc/sparse_susie_eval.R0000644000176200001440000000231314143477606017120 0ustar liggesusers## ----setup, include=FALSE----------------------------------------------------- knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 4.5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ## ---- warning=FALSE----------------------------------------------------------- library(Matrix) library(susieR) set.seed(1) ## ----------------------------------------------------------------------------- create_sparsity_mat = function(sparsity, n, p) { nonzero <- round(n*p*(1-sparsity)) nonzero.idx <- sample(n*p, nonzero) mat <- numeric(n*p) mat[nonzero.idx] <- 1 mat <- matrix(mat, nrow=n, ncol=p) return(mat) } ## ----------------------------------------------------------------------------- n <- 1000 p <- 1000 beta <- rep(0,p) beta[c(1,300,400,1000)] <- 10 X.dense <- create_sparsity_mat(0.99,n,p) X.sparse <- as(X.dense,"dgCMatrix") y <- c(X.dense %*% beta + rnorm(n)) ## ----------------------------------------------------------------------------- susie.dense <- susie(X.dense,y) ## ----------------------------------------------------------------------------- susie.sparse <- susie(X.sparse,y) susieR/inst/doc/sparse_susie_eval.html0000644000176200001440000003066714143477606017700 0ustar liggesusers Evaluation of sparse version of SuSiE

Evaluation of sparse version of SuSiE

Kaiqian Zhang

2021-11-12

Overview

In this vignette, we provide line profiles for revised version SuSiE, which allows for a sparse matrix structure. We compare speed performance when the form of the matrix X is dense and sparse.

In this minimal example, we observe that given a large sparse matrix, if it is in the dense form, the speed is around 40% slower than that in a sparse form.

Further step

We encourage people who are insterested in improving SuSiE can get insights from those line profiles provided.

susieR/inst/datafiles/0000755000176200001440000000000014143477741014451 5ustar liggesuserssusieR/inst/datafiles/N3finemapping.CAVIAR.RData0000644000176200001440000011514413755042336021032 0ustar liggesusers7zXZi"6!XK%])TW"nRʟKMd[_;zl wOC:s[7d%&IC}t\Wy޳MjT7UgX:]`qȯ`u|p7Ƿ@N -)ȕE N 8ɖ!ΗGX' Ao33cp& )k2/ۃr_γƂXdNJo e.fzFAߐM$!uVnYU,FR}̲%TJ/˻sJlW1GoB쁨ܬ>͒G1H=36LzX ݪ#ҙ>H18rŜ(`o^' s=IRz%n;,t6ҷÔ+˥?a)YءxRuUeISq;p_d- l! w!@By%Iz`>D sH*If0Iw4 }dp->)+W[/9^J)%x|:1QbAɸErizl#5SLuqX%bğ SQXlhʾW{*A˶G#NH;N:EbǿsUiT2CKJDVn9&d?0-8qEYBN*]rOtdt"JG( LϐKLyTowҕ{3!@@6}4Q*- o3G_|<}%{^I|tS;Wu1(biAMV8ߥy"Xm*=u_ƈ3daRdpjĚ13b S°`2ƈ:Y2u(HMx`鯎$wt6in* T=X<ζ@,zCn G@*15F$>(j((nM#~op>fqRz*CoGI~g\n1ZgYik;h80ɾr_н*9OT,3L8&3݌#~(?֗73;Xo+Ѣda9-ҋof]5127yxpb>U'Ps8.=/nv\&˻Y(=N0hS@U1ο+;8:lNScR{Y(ac)DGsD eOUqdcn*J99eVrĊXgӟy%td"]U 6dY;B8g0=/MZCaF?Dc7H^GlRST&?qN™i t`s↺>CVfQUQ2@5m#"Hch6l;Ce] TD<,R{0<(Kg#A4"aȱ X:L=u +mr0$&cqm48`5ݴV;^'.7PG60T:w "-7 fUόOR&]m[h\<#Y|v'!ؒ9 HȝwOi9~9+eG!;~twb晠}cx6lV3\0mD 1MO*UX;"2!BYJ`Iwc썡$LQe3q0R؄ p{oleZ:bP)ḥ\sDsU V#=[Ӕn}3df"DyKDxsH@ [2#\,@\`/4,d =] c&]/Z?XK?=|zzag)Ut])lu*u}VH;N[P|"jY07& zN9 J8[#Y qBR ^0м fcN?-Aed;p_f.9%ݦ4稌'>Cr$IKb/j!VZfC#>k1MSX}AWA ξLVpёrdʇџ\?Vŵ>kOErk%JصUO^Uc^҂w/W8ۀ TeT:uC.@"ݜS6'&gp%ش~wA -DޭiԐl(oU"&Rwp ^EX.q5!ӛb\%+I9f>]ap~/ {J52)QbcRYMv#=@Y'. |2O4HйeM9,qܓ '.uo$Ŕ&z5$8 O=Ba5&}6J30w`/M#4SW?tMgB&Z&Ǐxβy@3y'=s(*1 d>dg^$NgAO&ѲC!/  !VzŪLד $u>)[얌i7m~^7e6]=ڦ*vg Љá#q^)@+ m)]-SV~pT] FݷlL̓5=Fa4u!/W5o0Mb5 /Q}( d_>4zDӀgZqz.oRR;[y~fǕ <ݢ5Fx:KF09-aE&lzl&cJ&7PVUcg0g.SZ.JA)b>![!FJs$u(o,K|ʦ7R S7&yٟh>p{1~F_1ؓ_dJDJf^S&)[)1$[X?11 ˽&al,[1Eܶde]fBd.KmJXD'G95f x|'+$"CDNg~Ć3l3oܟǠ4s8WBa7TJZ5Z&PpUai0zJ-;)`B%;`$vQn˟qֆeQ\GÓ֩a,}VxͦWcn #3Xr^k *G >ƕ&#\Q V2qVO߻lE#\xǴ3i\/T)4]8&tVF7>(eDO>1QDQ ~$E 3T{$RYN 6_ 54#@!Єl\-R*< uPz|Cv2cV0fDl*u0\ i,FwiY?,,#A\Sw+RpI\V ޝ${JI+0fjkYs&VQK=.u dvK|W T,U*_+ rEPw^tULm9>Op*s$7 R̉Jࡲd'ՙAD-~Xd$άd]~N~Nu۳~ÐF6_6og#&ufLjDquAEjS\m|˭vEŔJ:J'V4Vg.6ŭYF62/(i5ܟ1%HY15ƀbYKn^~K<\'H'@Y7mpk3 ~tCMPDa$͹Ns&k<ЏN6KkKu:>B3ؠ2J~-Uo4ȨꙤg '؋mh mLDnA 4*e<yR dW%fɐ .v + RD~,y:ǐVAji C)SlZ|KL$  Z PbC(jU8J/vFϼ*H#ć:SF*;"PK<5’7V4Qus7n:e{*FզH² c@%2̭'laĪ(-GV$~kMdT:sj\7)_RJU?A X?JK- p=Q%Ŷ0Us# =~UA4tmJ,S@ =։}eYyb/o5dAjP_cp̊۰VD1B2wTIWg"E?5(~:TqY)Kޙr jCYޒ҈/HV6%]v1dt 3hߘ2(>2j)ፐ>xD!\߻dBX6mTAr[;*O8tk9@;GL0>SAẌ|&+th"ƱR$]ڐ$XrY}'R+ 2oӿԱ#3ҟ8 [XFF|m iSQ!W뵱*:3i+3:`Kc2V Bm$&a$^gzxXt\#rP2t]:H0۸%c bΚeiBRRERb50&wNv5=n +_22qY99)^u u0PV}VrۘgL씲ڲη 4%T,u[k*Íw}Țn|?|E^bh~GV"֮D$mܓw_A?!rT'+'S鍓pإ!ƹ4D4U~?.eNxP0- '894(sՋ`ƆWd6n$XUd AY'm%7w.>Xp8 K1}v xI:)'/az{3@9#jӫ|-i kP8U8Sb;|.hC2}-Y^ jdnqNΖ-c3 ߭&PUB˽ ' QR E\o^,(aAcP<Rč3{EB3T/%O2 I%d͏6m]K76z73*j<;i|` y?a!SE#TG-}v>\J 4Ry |e_--WUהjjПqa O8{k.j%PG25%,LB(Hf y(fWc1"E!;nRoo3"h&[P-L?Ͻ8E 7h\1]7M.TsQ Id{Po ,yO]۫y-pp0rRkm#o޻d%[쭯{~&vo8M\:%Ϻ"%vnY?HW)6]ݹvH~UƆ*ْyӨ?M čRTBےSe?#.[X Ze>@:jTy)^Vg 7$ݱ(( 5Kw]vLhT53˜[oxzZ9'X ?= bcf,noi.p~>]oC%C'PmnlJl+S-/lN?>Qq;e|!_wح(cJm$" NAv)f1\Yut4'}hr,a' H}8dm4x5y :Y5{hsw08 c5K:M4QfؔVG8FպJ KA9y&a,򧻻$3`2:>0FûJw[pɲpXűgR1E Ί“g(W]vvJgGZԝ~k"KN\&V.DSG>Qj/m X(??VsVn.ww쐧7,&hUCS&PO {ު2cǤU_g[9ޑݯ:{iLVzF@Μrq~VCGxҞh/ t.Yo6IڌPgJrc\foRi{dQQk+Ntm.S6A_1歹YJu|V,ezDˇB³+i[WGR/l/TB|r1r }ӆ~:NS< . Ĭk/Iz;4%oE ى?z$TIKAKw쑎!Okm=I$ Y.uT9@)+Ӄbg `qº,O5ĸ婼ôR{Sz8 /}o6PgD̋CUE%u*Z[94[+i# 2XvX^w>㵭9~(c`Ћl)3r7(OWMRnpL |xK+էx`֢ZAIQSjH$Dk,e&B5#Oj"8WuV*\ F]p fʓE`@_R 8ݒAzƫDZ1{<ҢR+*,104}:A)G8}Hq ){`Zjkc=NdTE*<))*°NvX1t; G=E{T55ң#S#x~O4ah8,VeΣk>?Nn>_(1`S|~Y &^T֕[XJ1 1{kϥIz8yRr0 U\b ꩜a:]FaV?c/4@exfJ% d@ր 4*=Ě!:% :f5R?f+]wHC}îԄ53{`7^r+잣0]jmKc2N ݏ>:;>=PoUF^WɅ`%+Ըy.M.Op9vwwXȀlz( ;4a^[G풷P;KNl'v'P̸U)/i^8ɠT/ay`,&ׯ,*]M$4G6,c!G Yo{hErlIRw2Uu]YU6;إAǎQ=Q/ IjJ"_"1 }ilm>#yb48Jxp7v`+=_W۴m"4њI+;YnIް'xҡ%߼DŽL Y38sIĿLG@y:Gq(ZXhC0#~w3OmLblҰQVmKVvg*1CH4N<|zL R)ˇB؛.o43§9;cΖEs(2˥ԗ[M53ϋ){nw:Q/wa:-h݀cJC%0)NT@Zn m™[qVnx`|( O{V=GhoFĜ#<(.Ju~ɞ@r˛ z`ݨ"e*|ƿu*9^7w5P8%Sv *>_Ǻڔps{m@;\\w9\6$a 4+VW{iO/l;t4*81~|a=paKRWc]f&pґשe,u ׮lTZ63飇nX$RBqL ;f a{a[)cZk݉TW1Ww$&O -:Ȁ (уX^MsORk7r<^3C$c˥e<m8ÝAsZ&n _ &惂Yr_cܹ5 IۅiqsWƮzEcjnۙA,}'pR&[)*cZGmZ.|V"y9abL1j%2r(qNwn,7dpRËՏc&, uv@늡XO5MUs wu6`@\FFrTf.2io9lUr-p]pnD]>uB#!Nzn]滂pƞh\xv ۠Z:$9(̎{I+T(`]?+B,ׇīd Lx21Ynh[Oi)tr<lr'=F0@>.ǽx)f%w\y1X~uHR ^ӻRis$ٍA+gq7Ol16#챬B6x-5v1I 6)3_n;ӜFd&@Zph匠ǒZ𚸭'OywLuCe]7x[CsƂ1O L6c72I0tcV0X@-NZk,A0v[:< |Iюg50wd֬* N. ܮ4$ܫtK 1 %l|m UoKѠUX$Z<60yAow YO ;nH 7ekA5QHïƯTl3C6gFrkڣECݬ{MnsBXL 2 p_\H /冼5! ћ)ٖn 5 ݇i86~0%\8 ӉFIntw](UYh`*A՚X3Ot?5ޅ`фz!\ ukuRB265Q&병ĐΆa{"1TloDmg0w z/4zՄhe7r qS 83Rph;kW ѵ@Ѝ)Msɨ*vZ/3| $Ug-P]w'[e2#м wWXD8*_O {d E~e>|4 Iq ",+J®pd/]TSb-=Ff}.K3ߌ􌃡ީwC0DlC0!łApq+>,qe;VG0ty:I*' _nyF/J"'oc`G\T筵D>ldYul{D0й4JweиLVit tV6Aq:kudh"U\V7vl"6d>>[e]X>z.Ju)bĈȡ 5Y]1,~Fo=vu&.鮨?ΦPRi^9SKJE<9Me3_QxI2̰ړbPﵔ7qX,*pfZ9{L_a8B9\1z#ߗBlNzd H:m8,ZlgdJ=L^Q&FNLA I%5+X ?8b1CE #Ǟv$qSӏ}Xn++(nO/\3 B"3[˱}Aք}7{؄H{l`JHz*N׭±|Cyn8 ȱ4piLR;׏+5ڋC]RWK8퍣Y\Ud{>!k5te#`(fraߕSE@k߁xӫd`?@ } NoYC3^TӰ@VղoN 9<:iA*6WLsOpk<7: ԕ#=` n I&3&#['G Jx \ dwm໲5z _>%0CpZC~Jv$ie3P&9] '%t8m3!Fu3e(d9X^<-pn3dzvf!YV\Jx+83u=mw#؂@Kڔ Ҟ*"Qib; H➯XƫBLcE9OQ]5ŏ AOS6KlfEw&RUyd[3N[;=?я=9gO=s9/1W9萹T60~^ RhۣJbInhVzW$!Y֥*S7@⺤?K*;@\S1?LTqA~~4w4FՁ彰,t"tlW,ԒryQ. &hUtgW /.=RG~8]e^T)#;/q=}~`1}kqaѮV77DZmU_~dHb6=j.:E!N߫ȫvR& b^N4 e1sήIV{2=L-ȣB!oAM[tJ-еL#[V ªuI-olWIʝWEQ,ÒdP& I;";_i3V!E&o ErB#{pvTzƨWo*0$~ITB4Zg SLCdkF#Zr&s${?/y9g;t[QE -4h\í>b)̶C!ŷ,FP~¿x35SfI!^ۗ9{G&1/zd=ȋgĔt^IHkr A栋N] nT2T.s(^es5@G,:> 8sJK}b-ecTW;%Bwq0O>\(L9 `FʦX%*jI8wm85*ۇ q3cqZ &t $SM̈́9<\)HOփf_qەA{WΤDlT&#aM3G}*H~/ ?78L:b1f%$vVN`nH5S/f&dhᲩR(pNqrv>#Iy#p{=L|^w9k<F 2qS"[78w4dˬlޅ c2ħ dʏv4onu$piO߭Bm6)>if/@㎤u3HZo۴k6i [֢۬#.i5d\I>'fRWҴd !$ątk6gG{gP!⛹nݿJ׽Ơ%LrNs D;#>$+Xi1v : scrKʧ9SCjlogo)','] :2bCl)zluj`R6 zaot=~ p3oJէ-*D+QɺE.cO@?yn=?9xeZ R 'j]L:EdW;; O6?qkwm 5IHigAI@KSY`;@1pKT0^߰wAQg}"[9<۠{uS%Ԩ@7R.ԯ^N4 %6džŜH&6LkUPU; 6WPd*IxRWe$:D%ݲz+}60X) B Kˤ1ٕސ5KXkYW9Due/Y$sRhOL'-|#K-T7IXyDu&2cUA''D-0roIҖy&],bD+Q+EA/d/IbY#CxY&X+:C0^l=XPx,ҿR3Qf/M؇ɖBy* Dz郒}HF01UuuQrN4M1H!~/A6.q)1IN)6g_"P-@PQw-15JlLF jVε/w- _!oQ>s*Cy-Jt88c=ģ9Q[.MJG{-L83fwI^cсpnYI[ LGmi@6#:fbWcc>ӈ;5;^,ta68.e]z#)?6txMh886y>r ~ޣ,Pma'AyqxU2ARmap4UN@׊ܿef(2ڟ< fab4ǽc*0x l xOS9IНjZ2SD딅[ovkF઒\JyI:e  $dL= 8lm}m@X v-KmJH|3z:n.\CՈ C]=t)vdsq㈷.a;gg*S:dօƩ8:BD>VOq֧#pBNKBsZ~`.) )3XϖPTI^L4=1&0hI<.fы/o< Qm'9* Ďw,CTFX(gyڗt7H czq#ߍ=>Y'0 N|.I:OOm)I3GB`YB+Kğic4̴N1$^Z ƛ߼r|q>RY|7g:e"$T1aRS:DFՂxFA@XOD.l\PNZ-Ӏu?5\{ 㑒{X9(Qӱم{KNmO ya~J`]e! wS`Q:e/ʈ/#@qE"?z'YC6jpM2Mۊ7>UXp"dPy%pmЄw|~|~޴ӕ ep+]s5Wc_yN"/b_ b*et1C1 %T2S;.Q?N{A*=8YƬtO\MXbPzt$zM(ϭcBm}u..pA]`~V%0GX>lF{]"<F̑QJy&.Iz(4ɕLG5&kJ(WXLţ|^U]3>L'pJ5X.bcReѷΤG9DmZMUm9-їm/ܡ _iTMw^K d6a?!v\hrQlu/) | su ܍dfJ gYüץ\>FT퓅LabmY5+K+S !bluA- t~'j4Ē;ˆ -7lHrldO,sٵHHzR9Uw,a 4'.\Ny)I}5߸|*?g`UE T(XC(Vݜ( ܄pիva\ŋڠp477U`VDXWjŸZpq7Ob=:pЎ:D}'KWw,wyD˜Q?C|ԔoΓJOVU0M)quxA+{!DDw~XT1wNIo\% P-E+gpjԃfځʓ6hGX*(aHAe yc+Z$;(ϙ-Vԧ~SȺ3ۤ09 >w]ֱ|̲4^c μB5(P ݎ.aI3.3贋eʹс`WF86s_0qxRy[.cOCG~>ġ) Fv{eo|˥z:{"H|2{.< %Ńj 7((,'D9Ӊ ģ\`2hbeIUL^# wq MKoSHdrȪ5 w5~R̀aX;0]lqлM1|RQ]Ug8nIߣjX-ƇG\h肟T{p'v#QDDq8#,3ތPh=0a:w -2q[d%y~p8}=0yfka_ ~% |<@_eCHr*ƢTlo oAN. R %y/h,"Ũ.ΐ]fiO1 m3xr)OA2Ʊp'64J6Uԉ@PڂIq'H1\+6:}*A DUpt.0MٶBazvLe[5ncr MpMF.Vy.;zE->ckY2Wϭ%O͋Dſ<$Ԯ]?[$3MmړߠQ<6J.8-A߬*%2oI >!eXG/lc UKIgUB1=*um.C 7\QۏqԈ^3=B|N30J&KNC~RIųp8=C̈;x`=+(qPE"s쀿GTȄr%_eA5.W ҋI)Lohڠh`i`GPo`Dz t|Xx*?/ hX *It̓^\_ܣ-=aY£ъCFٵ(YnMڎU\֍Y&j^L30Lf̩[{`GAdC?xqI jLBiɥJNd (c]PԅٶM&V~OGUM9g z ƂԞkFg~_o\eʭy{%ԴyMHP!5rNd%B9%7؄ُwհׇXmv-ꆮfk/Tk{BK5Wsn?҂=QibwP/\b7dTͪ0p}=$Rr-Fs_cOM>CC 2zDi@IS#{ ʽw׮xR,KpC‰')˻lea"CFa\Q &3a'@t[6YzΪzJӧ,4 ̲yCM(PD*}R0)pgid6c3$l̂l_}0[gSJ$Ok;>< dS0Y}l߱1V/e3=Ģ.d_qf6Yu“k:΍~*?]Zofxumf.nN(|΄]88ZXeN1$mN~geϛ7W]&쥤;fN@<,/<|ץNhVT^Ep{2Z~[.6fڈUJ㜵b92Cv]wx˯pv%phk;h jqpYHTf/ln#n\O8*na>'nx,us<#M[NkءPa&7gZg1se+d?^(v@|9-LV?x#@8\cvWW_>ZCG`=9?x2zIeNRKOg-RF?^*xZYtњ(/:;;MњmٴZŻρ,NHHDF/i AzM;xVs9fn3Ya0l(;=|2]k;Z6D++oȖ!|I8}EU "&910µF!30'`Gn `e}gIMehZZ^藱 v+=G&U9YэXj5Wi%j^qj+*"ضϽSBq{%JQ e}rijޕanQrO6K+$K/^8gӬѦ ݓc%.>Z!@Ċ_9r-,-ԪetӔȰھ#'&!9>=B'-%;=tB nltP2*Nj:s*-=3O@zbGd;p7u1~,k JdQ}9 '4ƈ9'wSsbmC|axjc3</o pV;U*HaǙ\x F?t%U1-a{tqR(k.Q7>?Tu6;|Bf} ;W4Ѩ5ˍtHD+ {bq_ϐ> [AP&JJwK5Cr6ƦT0\.@Boe?XBlP43Mf[(QUG[qFs8kG!SpZyzC!c.wfcwNJQ3Ȇ8Qoi4h >[6C ۱7-{S:HMHuyeΫcd)W%Zu"(am8osHi #X`iqE()^(AB%h- >r>گu #i!cGOԎd<ͦS FMNU77gbp冉[(5% XXa }o'fSβS pcvځ7F݉,n|q/VѰ)!%lm "Krgo^$^ rD@-1!y"Sǹ'hHˢ7I]=eֲ^جooA!z ~Aѷ4wbۥ 80oRyYC4 y^:L5,O6&Z` zxB1Є/cKIM_Nב)R \pS1zERVr|靓]g!"!VJХw&IP35+"{cᔕú80KE04t==8&h涱|v)mՎMq\Y =2tݛYлZջ.+Q 9R$<FA d`UWK5iѹRu@Ӯ O4]0)4)Y!]9!8otY]m~Eu}H2p_ex5_Xt`~~+]l'? h|S5~eq>WZT30:kw\ XH2$+Ia59쵇dOY=|G0 U`(6R9>8^7C70{oHlk>ޥ-tPlnK_~TA(-H8wvrHWa+iHiX&sthqG^b eF[tvrˢ' K)oPaͨ{U4?sq g p*^ܥ >J f.֜1 ;B￰h̀p6b6 xMs:F0c؟ v ^e HM"9\/$QC2kIqrgY%\ C!&s Dz_F=lʘ-^ŒJkB aՁzodnQzX(fx/J S(f38_Wm}erx'UE"OP ʡ5\= viq4ص]<_!^deKeX#۫VK,zc7l[&'pzAۢfнTjVT\±*2cm,ׂmˤ]0e-YL=p^{* ȇE~RMeRۅJʸuX:U )=dtډ/"3n- &;k ~B}ڱ]Qt)"4U8- d`8u̺8="J_"'ݨ-U:R]Zz<,BTgr$8cӛ"Ljp3k%W1:+Jc4`;& K\2sYQ,]lclVEBt (M2dK2PHn@SB5`V"v rȹy&8ͣ>H,IF ߝ  8- Mw-`> E !_"2[QSX8J00սf' _k}|70NomOR20y*^L"i+[ [O>pV(Q`Ѣ vk!&o0E,o)TR.M|2ui135AV͎MSRܣfcMՐِjU/\M%.cʍ+g?b NmJm,b{MUk7űK{A3'gJ~ 6]O% ߴ1dWvKU 􌑞tP*T䇪FN10o즯|$?@7 :AS0y!Dg&o0u4't6 .-{xrG=vcC7>oAkDNo]oˉ \GxsCw^f;a ~_{۪lwڳՀZV ^[t,o@T:x1oc5F)3gA]5S*[q_Rb@ؕ4+>,lØrNCC)Mݘ>ŲK>xIՈ=+ېVUhάD:`*]2 @f^rCN=fػ\TKڒ 9]&3Yjߑ6ͷA+5c{rm܊}R ;ơ(*(Wu}e?_$4./3D% 1Xj1zȅL% 7~3k45ǀ 9#&ʷ9_桙hj͵ƹUϡgěQ0xarT 8Hb?$7G`c*jwTE _DK .'2fzz=*Dn ti' gs|PBY Vd裹_Hq΢¥go*%_ qĺ 3 'kSv ]Fx 4Ih!,"If9`.Yo}ILio`ԝD9s~k:D[')?XNAP ! a8Lʓ^U}  | }OgVSuBWbpԐp/XW,ONcJv ƱS,UnY{ m ǭIŕM;&[цӻ7KveǷ<:BO.VsBqP^\ٕBe0 0ti& 7~q>o7bxIh1ڊWq˄52bVJJS?tC$"lhqXT ä Et2Ro5"[#6ҩWDk+]'賷 ꨨ=GS>FU:Hϕi.sJFc{6YI؅G7W~Rlmdb .d 2(f]=?߆pa`!ɿΊN㕾_Ĺ^>-!2mG<B#覅-ڟL݊,ܚSR(cT{HױL;k^j͠*z@I&,IΎ(LC@0jX<2uz%JC631xގJ DpWsCgٯn rBcDT,3{^_L!ha"}-C̸,D/4"ϮJm_8А(mtyj՝L]>2qDHzoE;QR3#W؊+P#:],aҍѽu- L7! Ez^N<.v>ԩtO͘ zU><{.;bFsBWXP. =OݤxoC-9Fn:w=jBGuS4Z8B } J̇ckĊ6B90cӸe*~ʍ.쨍t~WmW8qZ#+aܴPolO.̹)oF^餣5.,M"$BS Ҭ Ҟ v[h,xq/= \J.peeBJAb}^DJTմTzg2:R+E`Ŋ!gY0 }P쇁!Zu2U n5U)K9"I}4ڃ%%,nnĬ[?-豜͜A %G|1DJVpc4^Q Ϲfoqx*U~0'Xl+Xa(P~[xXL C؉@|Jed;v @ƓA`Z75Z ݚӤ)2};-ՕKC{cx͂b ]s"v$b}8ݟ |plb[f'-Sͥ1PT<~] ^h*iI$ ckIZ9f1"B9^"O$jU7.uVjm2}T.ڲ 75?lƯ]?{ztj7Mhu G)0EgQi83,Z٥3IDzۅU155 e=B֯3ؔFRZc E2a5.(r+z5:{,y&.qIat _@lhtiFVl:>Iq${Oׯ{R)cw(氻%mh>aqqG3cb*]LHS@5C4i~Osߨ¢dy YOZHӠnW+~y"d1y W=@p8wH9C&}!pkϓr}O8/&([䔑b0 )?`;HU 7o}Wl*7 9"X}T)`_MB~-[g2({_$URG@mG a fn^@ V]B9ۗ,ec1P-{GBYi)Λw{;wŋ7ufﺛۣ`~4Mf©&0lG(,(w^EbfM)x3!YH՘_e' _^CӁ\_-48C-f?Jc|2zY6$8^mSR֮!Yt@-+8`=RgnΥ{j :~d?$5'<@,2'ٰj)I(⏣Vr^5B`+knS7Rv3hZRFqo>jaU*8iq/뻒*òej)H^g{*R@Ҹ>Qe7FT =wWPC`gQeӎͺViO_q8 U$x ѰKe="So MwA``cvLEBu]ŽN/N07(,ٗ8RAl@2Ԝ ܁ɶ ZO0`}]\9Jn7&$$5 P>s|*R>p5 g_+/L}Y(r|G_ps~i%=G /#v!̥=[4?mT,n>l(wCҟh6Tx5#Q( E É_ĻX&e{j63 T FZ%0n338x4'&uq;%B(ajٯFE0\ P۲1a, h I[ixIiA:Mґ 1'B4H n:&ޫAB_v%̹3e4 Wi`ҫr)z;kWKD9}7 S}q'']zCm"x9'=`<9i28ZqD-sґ>&+g9TNI>aN⸿Ԛՠpf.c]/a{ziq6]+( &"p]g..0b ,Vٷd$Snec~BLPDŒpJ<4<k0wn,9 >S,f9+Ocp{]_ f器=7Jt51 Q릹I$ D'K'%_P&t8i^-(.yJICd d6J Cpw̓kL?%@ Zͺ=@TId9WxC.3=Ѻ歳E}P,͕1_8trQYMZ/ߟg{;s7fS#RDPLyNe)"O wOҴ~@q{k Pɐ՞7Z5*!@Jȇzuߖq7,V]w`UI UqcmDOQdނڮnYu,V"w5bĵ&8NۤA`{AN25BhoOX.Z>eHUf z${Wvr8q}ws ڐw, *cDVHvq|lQ .(Y>ݜZU-Iݫ2|ȺUAO6@4$&4wڭmUL/B#.r}%;Zlj"3w (ҽ憊'/ph}/]Q} 3Q󢇅` P"%0A欌hȲR3?"j#D9-Z.a2t=-< ȶЭGBu2Me;6&CYNvS&Fu n+7|ұW=&w #cjOǑ|)#X#p/yAY Uj,1Fz.6+Jl;*9@ip6lq]ѓ䫍bOw%q=x6rX?Qs4Òņ0t &d^M<T)c:3wBQ]a/b:m.5O(狡^|bza+E^A'|sE)ALaґʞy?f? >oL36ޣW(S.+C)8_itvuXWc|_`-0o=iG 9)wvX6<u ZxahC`i?02|c'&xR`eR3S=d0$Ve; U,@ef[uѽA{ ~K6]2l`v9wxsf£039̝0BIio{ゴ7=> -HxiCgXpu^YKeI7nHђW6>Ljl |H Js*Oy"2DDvoJ袕P:M`@N@Z~PW"Ca Bt}_+UΓZ PɤxNŵ-Q` QDJ(KP.ޏvr;=k+Bz?L!$I܂M'N2 \NRYMn,eI0'47c3a sD>𶛙yw&E{tV46̍crp4-JV% z7ok5x78VÇB]ΰ:B,ؓwj.wS>?? g"V38>VeٚЕflE:*H|M`V0]Ub~`OC`̩wҲfNC%cB.ol) a MFƖ֬w7jZUPx%D:?[qSRCPF?*.yBR>(͏ސcab9om:1F^Ȫpn:Xu%pv>3!vɚ-#Wdkl>*3Aif6iXy#DKg_Xa(R =t%kq]^V-yMsF"6yN+\`A=%V[/ނ)N8LJ!_gvl҇4.4d؟oa *`ڵqR_R(= 7|9 CEl|fZȻ*~&>A%WIjeQ `Yn:-F;[a@*{mmפ/E47`< v3GSBs^"Q̲ (6$ߑ Ib N?ͤ*B2U| Bnz,7߂Vݿs3k] 8 {N֜\.~@l3GUcտXRMs#-r 5yJQb6cT,f3G5zHIqEm d/HK] [˴6 ۲jD@"U "-<Fps3\[6K`ő2;ߕ/ C˄yg¶ۭ{TeKVKJN:IO#wBHl(DB_T p3 "r `U0O/jvnd>(y8HWt-TLk~9wFT=;qhQE"0|"{Ύ ck2-/8cp!v?I [%R DʕWzMO jS$G [rPŧ=9Sz|#3ul(\] eXfM-v=ЛsE$ )DVN[3&wR5BUPZI?ktЊ1 P *yOdeRTDKOiG =y*/Z{3MG} 0_Q 8ZBB5G- >.D4"wx JhUw3] B!"a\sq<̊۳WACsnӲOXo@!q&.o/Ũ2xgS(Z5 3 Ҵ67.Lxgrsfؖᴀʕ6==t7ű(%dXi^fBN8H] JFGL ̶GvIO趝t)Kڕcߟ,i'?3LnBax%1"lU!Wo%ODV^? &},أ"&nI;]O-TL@'ܷ28C:scp 8]N\bAUE^G?ჶc(?r$.>ꋷYw̎0;eH?2zUTuYU`38vxNhNS{cY:Wҷdi@6;E5ّh#UGŽ2X Ĝ; #V>A2p7J 9ة=L?<<7'hWp6+҄>0 YZsusieR/inst/datafiles/N3finemapping.DAP.RData0000644000176200001440000004730013755042336020467 0ustar liggesusers7zXZi"6!XMBN])TW"nRʟKMd[_;zkwOC=k"| WAdrOv+BIa^%Xv(ԣSO%|I81X!%Lve>EVsK T oo~>aH,7Gq3G p^ ?<)ynTWyAt .C>q$hWi<Ł`?8pJ4_co3WGKa3c-i/sLـwKRcш gfjŹj{Uu2ZXr2(Γ3{Fljs>]㟴+F%)ɞ.">v!QQg˂) JyI*̈D1Т5eJr[CPVMeG|6Sg꧘)n|dfy| FݵR[ "t@g+j@1ٖIO]AO}æOb{b #䵕F{^s%3@DOcF4AB3WP *Fpcf/Rc(h߫=vvRMpvd ٓ˂(r&xBtm# /:*]1,ܲ3+ ^@oe΢Ĩ Gܰ &߮xD)mJlDiNSԄ{Ӎ?1HB=f2 $Ӈ59T`rr%ڵ/ LU^ORUHFlx L\YH*֬Hs ,5Bl>S #Ņ~+ᕖKLJ.onк$^H" &XtY0s'ώb5kÂ=Lnٽt,6} %EC3g_|2Gw!\#c"gq:jBߑƿBOGSyhpcjWer@h[<-dZ0b{9zu6K ԙg]$"[.O2ҨL2ή3!A,/0§Ba?Y9a\W>N$tNz,i곘KV3iUHav"~7b!{;)o?d(p>UftJffl\P,!yd x͉`a;x6Ꮣ*be1yoOc#8ɏ0N`°V \DE"'k'Q.gJ(DʋgA^J*F[b;$Kڞ{22e1!{#Z)]^ #]%<䛖P*AĐ2&[mJPH )Y>.a o,>f1XOHLbp 7&ٰQRأ{[1l.9WMZ&\fṢ#VZ`~ EHGQewJ*6()j'1J{aVD.\AvKC9DwFGs rN0Kc6RB5R%?RׯGiWXI;Q$\&+6sWk_kѨ!VYo:B%q&RiBSTL45 o\ΔZLZrt[#.mFUڜ~Dh$zkVÛrz, XFBkbm.dD*Vn)aY-˓+ew35U?m-PbHYe!EO*ʋ$殫+?]Ksle#. %hTN+p_d5ǒ66m|`_IgQ`kZ(߉}k.6HnA}6M̰[ ߳yFiTGL{?\ں+jPD;6tbly4LdjQ(ź A齗'nyU07FuЄ&>tKu̓+ֵrpڙHyL!U&XbvICn=E⹴%1X3ZuS.gxi˻F-)) Uz% #U[/Lk^ ?v"Z1)coub\ yU9<(+lfq$% B} M0b%GN4 uv\ a"Y6e?m?o 5Fy&qN|aE=Tg;dP8?n d46t/7o )A,?zy<ۿv*vw1BHs ^;YŸuft@pfR!o <$Gd`9qʏKZЉGw X,?%j@U A7, 8H74#fzW̊PһXU8e5b f՗Y_(˥.Up\%Dj`r x@mHeH۔%{40opaUN/ђy;S2)`JTWjujP ڀ4%h<޽ۥW_)``yBt+xq+k~qF}&3Y(g[vN^.PfTVَ[a 8>vkIK_%D$,b:NIsB4lA| ~Ham]#K/ j?QIpK5MB3+^lH/mLceE,h3WZJD>&Dܵ.c̼6g"ʫ1/ rWEyugU߀¡1\~n b䲈|{HIWsQ|`;)$mgS~I]/\Zco(l%N:bdr7asW+2b5CMa1嶋XRi&kE shOP~dE5QjY,WJñ~,cܣ9.(9]<Ԡ'|9w(M~.y5UWF92& u'n13Ida#lcp7SVqpx kpf݁޴ W/ zCKTaG4 \q?!/y D0k궦-dꚆonZe/(4"㑋)f=0Jt I]}{GK㇒7i0T4vׅR#g8EG$R87^ʷz<-׵WB ]4 n=jYTufTna{ Чsh [8TݠP4 ']JwWuk}x+%!y0j߯XLbAӠqxg=_-Bn}A[@h({G-d;Q_o,h+[4= +a!>Pcu|ʵx ? V)/Yhp[O<f?j ⓬-aѼ%NܳȲe=`$L&K"?<ϩDn,=ją$mGtwCmK OR8eW$ޮ{A[]VE\inOX-KZվ6FZyDϮcm4u8" V}V`bPιF-r./7hh0ĐꝹDD]_{ǃ;,$ -X͚A; qb£ePU9Ya}<m}2ؘAEهz9 Y8WܤjX\X.T#R \5S}_(z&b"nNi"ReW[T8 _%H 6Z8*++4Yw (si}mF'2 `%0ױK'UߢmvL_p!H!u*e&,/U3kQu H;pZs5~bu=]*Āfb`4u`<1״VU}-F}W (!5G󧷀ڢiPɳZ+dR*k=xDZdőVir{f!*9)%bM64l.y6Y.]%[ 90 ҝL1SOK,t4$zIwTKGYe9G/xÚ34Ήp⫚XnN&S&H.i(=*9+.MyV̈]d@~T$.y (5BwnO ( iXd-ՓP$C B z?ڣPo6 zv{ 2'pOـ,"f}v~pɸTpT? ' LuA[^)RءGIn8?jW"8cN{s;@։N*V> BzngM]ѦžȦ~=&A:ꚝ}6Hoo!iXnNX 8eM@wsu*9\31Q۝'2>wfP ֯AEz)@b7T[}ZzhQdK|iu^?ѧÅьb JAzoks cl2*-ՔSء*0c`2 K6Wx쏈 om|TSl<"G"Y|i'1΂^GWPFщf#"^#PJ}3 ֘Y]"7o;ޗxֺtx 40u,m=B:hY\禈xP ?0R>Q5܄-d}Ԉ&"[:Rûqvm`}K?_6dWOLXH,V3uI,EM}KGE +\WKöFyJ=^FY@}~L [,\HEGYnW(W}_>21%ן3kV [ƒ:~M- D شniŦ7]3ٕe' D/ (2+l*Xu%6qq# >tW\c&aQU;Ρ9ڱp?noRYrC({1&ރ WtUm})Paơw#{[% P;e7j)q|'+%jXZf;Y~7i્Ƹ.Au@?~H%qʒ'XOTƦ>$Drg%Re1g$b756D}`DTD?aKIKg [%CMT:K60:'S:;q7B՟@㟢H& h6ŎǛ [cwyBؚUm[^vf%d<\$H4N@V&񻰽M}w:/cǧA> oaLَK2S. ̜K"z"HABD'MDZj-^ z,YA-ga*VzGA:p(OFqz㶑/ jWC[;wvDC*{=jLID@iع9} U'N=&HU{,.~3iAu^W?eˠ 4P(1\}SF! O)LiepMRc% iU*sZY5I NJ~?K p{){FCRj5" .Q]gcz#X0mOSI:iSIQT=;҇{f> $|UNؚ HmgZtt^T`)hU-g&I^j̎:fqCTa0ĵ)񇜤DKEX$ ~| ^o 5t[chQ4g;9@'c$8(&`: _ %<{@G* ScXr0(#+ߤ 's"u^9^K&PZs;,8ez*>^g_7$ۑ\7A@A2Yg9vwVq F!4Pݏsgfu@í1PϘ)^6mgx`1:جO)8YHz$AS^icn`j&5E4)nCzv^Q5x떵a7-4#DQBm @؛ٝ5%cs&Nvr9m'l_Ӊr`2-E XZl , s\<͛Ժ1OÃn%5:%\IkĞ*6/ЭVk 4,Gz˾VANL8S=r8N̓%D=zp ĉն]vl@lcQtukO&о=սݨ|x't(+=yVv1yꋀd{0DMULWpxp Zug%jCl0~)``/=8ϑJe񇔕mt㼤x-Xir2*^DrV n\$*PkiKOPҿoy~V[ltp Z>2׊3 @>l FŸ;_|e\ j Ad< &/;DI"&&Oyg}'8,Cë8Pl_&x<;:Sj\BmViWL-lW&Ħ!C{N[^o&$=Ba]y '7gHU-t^1o#`z0Xn1,}ĝ~&mfrC>TVxf\X4?Lm1hs ,"T8-@/MVbf7^TFO{TrG2N7hK!BY.{1ig@| CJ`HVT& Pyns5Bdy5U)V"1lRry K"dX*u0⍄U593զVmpr%UmS֘,X.Ɨ l,й~#[H7#\㚙 TɍFXkP)qNkҧO"h}% V!1I֐3~K7߅JL=ۤH:8Zֵ]070s5,UlJ8'ڂyE-8z _h(B$y@cF&jXbBd`l]~tP2𼽔*&glb #oI̊PrUΆ ޽ 0;eߒQၜOamd$}E-9H-09|*l>W;']P=͢՞XIx*hk^:us[M|=ݩ 0 oMɳ̮sj"(*>b-UTbۧ?]Y$r&uOG}/qYY`0+idd)PL{\uk33}_j,ʈh˷C 6`d,⣣;3bh_;- SQl*Lg{.!|%wH $Nj.Kpdi .K%!]=wеSO\^K) pz"ɩb2:ё\ <8]Er ;QrVsB3Srw܀By$}A*"9Ʃp.tG``_D.k0%`wD.U#B=ȓlu 6oIk2 EL}H,.6КiKh$aD|Ng/-*tiXs5>_nB"Տ Ѣ&=;+`9 Dɟ8EߢEq_y-_Yҡ$g0RN`m?O-Ѯ%,qESQ*)J{/ȝM B̿i5[޲Ei.s=WdQX(39tɑ\<(i]f6 Sӱ%Hh8W4`a *2@S"{,8·/ztURmf?tk5X'ӉJ?eJJh/~GgmmH YlR4:/4Cձdk<落ZjbdjZٯ>]* n|atG8B xC7=e"~Ό𠞖_n uā&Q ;¶tw*~jh)Q8"DK#8)bF4rv%lc=Ԇj^f6]U7aDNY րqCBgDvZ:2uI:>W<R?J⎁ ss㼖[UˈL^>x`iLOD?l8EͨRHoI^|- o 󮒝ylYwK9C qKNK˃Wk L@7ɴ[,.QJS*_Rc+bJamCu>,-z%66)QE豥/&V8&+,E)2w]OMuz߷n_i( %@"}A2BsL+meV+j9q]V"Vp1fp^I4^˶)#3t#:Upˇq5Tޛ玞#A IeSܘ'RF ><{F .; mø<UP,4c[J'tBPji_Upy9EeUtUis1'= ]{R3looSj0 kʶE(/ڕR`uz9R6@_& 2Gw\,yâ.JQe/սV&z ~iT+cat:z =BAȁ{4s}"zwFLT? hص\CCV?)ݞ^).,EX秆)ٷ:5uO_+Lࢨ)4s=p!;TKVp3Z*RGm>kӶt$[\'`ު25Y UJUkHC4p0=Ы;b_6(%uCwod-]qIMh/1r7n')xhэ(%osJiC ̀,7YEgRQϢJ_q7?-JMٛV0LHWHَ>RNz_vIw\Nf!vۗJ~()6,58 n6^Tla;DtW'+vi׫쁹mivWBpJ|".J$c@ 0*#:g;lL6R%mm_gcdMk5< dj_jB=< ]7cQqE_e΄St/Z_e`OɾOR n)POhP.J_gS*tZFNGzAo百+lJJ7>)mߣ^\s!(qs#͖>5WxXcgĈ#E cWqݵc+ ^As#rz$n> h 4uCP{a/-%wW*k^$1*?WjVޣOkTgi25b`Z&MȐIZ򐪮QB>+kq,vcOS\Z+8") :/C\UAFidTX@ˊyg&;#w*.jCcj"ݗNvɠzoۺ=bt a,#-|JeIF}]2`f6 BN TxM,8wMHQHbI$;\1ZdO7O|PG⁛6;Oy |~lƽpkM ۸R$G`C.5WF%\vcT%blLP$ҭaYɨP{e.C͂@[ %_sUb/ 51` RŝeOQ${{~4̹Xk@}Xtò|mgf&C`KbC==brv9("2!΋M5|}kcqgϵ.mLi_ͥU)}֋0Tqx9$'L#6Y)t| Xr=f;/Oby&]B4VWKk R]C*&.M5M[5B<=ptGo +ɀ)*,ʕNNE۸) gS6!xkס0ރys'1} J `ϓ'ܿ-,Ga4rV]"NV~"w34H//L T<'$Kfr6?ꋨ⾭Ђ[eW[v 6v(&،k9Uv;^V0Y1kfBAGu7'pEr;|u )\ [z!%=0 ix&tk9 sN=D=m*Y^]ya/ϭ}(WZ},aUQV29TXy>%H=j*h$ 4G>l)#QqI$Z\!'Ux_4do1+k)6; &?G˩s `.PP=k*%òܙzL> B=IVYv4[\޳y'B =X1u W$/jATɘ:0Yx'!eq]0o[Qm,o@sa~hj؂/QlԆP̱g=;=MsF׌w)C*>)<Rr*'] yԜ 'teqT:jZުXI{]hk;nO ѽl޾`5&ݸSC^~CÓa9ȏaZ_U_Tr`Uz`hIC32&V3'2\"Z]BlcE P #WQ_>eVt.@<*d+2i뽘VBrXIWiѦ"h"EUU2-Sfmz v{47ٙ]$fK"|7u-)P:_aO: YjOSh6ʙ<^%.JNfW~ʲ0c6gc]$=*CT \nń]Q%-YöW,|7KZ_XK*tlo88߫A3 142$Oj)ߌ}=fcKz¸!*`_d K+~s0-c.":toD>[,Qs%lm’M\CZH2d2Ƨa|ɧ _"N#IѨ0,{7 \I&|`Ǟ.> vOzD}kjywko.{ĚagCu-O [4S3kSq(bpQ8ɯ \s͔q2qDGn 1qǬhNW^]H;W' Q8"~_}Zfdu(N@al/jWr5 3zPQo#0^H|~'Wf3L9 Jr5ѫܫXTC{XCǞ-,osݴRv2U`x Y2000h#Lqo; WdI23znUxkX1֫Ѱ.4N6raRJq$A9sFz3|' ".KJm ד*|a? H}L%/uj*zx=1pAV&< TmΔ3JDuMtct(]-a8J$V#YZ,>^3 )F5pcthpLsJ+6X H`iqZ]lv1U$'%Qnf%oKo 6(N I 'l<]vnīSK[}\lr`b[=Wszi3aB.E|3IM 4JVCȪz{:&PJֲ$WR[d_VQw?є$ !R&;ZGh}sUYuO5,ďɑ{oMm,y4Mk_kKfBrᅦT,=7_,bb{̘3"`? '/ /(a /,6Ѫ|u fj}c/9Bv2Ds@bivCL)WdNO\J1.='@Ŋ%,}OtA^X';";Cl"\7x?!ې;F[ѹ,h@^ׁ]qtcWrձBYddM!2atC_-ߒ=ͲTvia?+>ht 4Вy'C![f ڴƽixzxZ-"S3E<|®{` ! *4d>a<$⦚fvVq|S7|)έl^´? h s AUaD) rN8=KqԄ:TɱFj4B}w9 *˚טcS6E(;ÚM>0 YZsusieR/inst/datafiles/N3finemapping.FINEMAP.RData0000644000176200001440000120101013755042336021131 0ustar liggesusers7zXZi"6!X[])TW"nRʟKMd[_;zlVwOCARLwz4 cFDI 2JUp{ `Af6y'$ Qrą9#փPՀv 9jqawA$ȔbE`H"YQ(`Ad6} h%5V_2sulj[_i07H G$.gb>O u%BWZ%[li!׾^B{U YtID^%okr-~BTsN^NHmSa2OB0kW^Urf:ڶ`MM֋jO%CќW侇OGauf_W'NI2ݗ"-MR7+N[+իzo"0t;?;f4UڮV$ۘ#QSzLoVYPq\Ee'(;z=E~]Ff4M=mB̋twH2/4^tn՗NbZFr"tPcҤW܀:d{ \QkqxM9kOx'7 2eXtCI F{g9;m~d4@Ӣr |\` #pdTF=j]=7c@KGFA"wt~[1 E dOa$0J#Fd97m QiX{֏OЏ\ ,"ʴ+yVDm.y?~4HC~3H5θ+iKVވ3,Sm%lG[9_h{WOV8s öҚP=9Vh +4]00Cƚv`w6ÝMet:Oa.~ KMiCs;,fM vE$]%1n>I s]Q\LU]*L+|--;Mm|mːaJNQ@|(00HxMm[Us2Fȅ-AWs5f%R xEx*rmGs启ZD9ò;rcBB7%}UHQH;oq1OsfLB`Y" ݩyR7:sX( b6'6rWO jWw;ed.N^hJe8$@tpS*a@ xPZ:7^zS 51qeUOJB)ƺK %㓧gsOu .evLM\6Eeg(9ƘHW'Mzܬ^gEw ޾hl\#`hF-5 隩Ŭ,^һ &oK>#!-)VMD]+ʷ]Qiᔊ~nyͨ>'gE-,aDa䦦`N;dqEbݫ1&DS%Q-)l:X燅6N_9״ie+t_^ Ht1|`_@B'I!8Y2T1E,7`lj.;K+6r.9l$zؚK"Ի*"+ɏj b@ LsYx]ltdV gZIҸw춉G1Y-&kxm~YU5o%/͇ }I^R@?W{v cw_el9'.jS~=hlN/ X, :s7":M{Gb'̛h5Ă ,t= ! ƒ᫑9 m-&K(MW]̀^~L9>ò<"O3wnIj05I`M96~b7d*<ی@+\@sM u/ɨąy@!Iؔ}/M;hUmEGstirc񊺧  Ĝt3W&Sbv[4`(˥{3 Mna'.3=c/uCnf 0?]BwE숾*8Z]3`'OUTD-O{/(UΘQ<3"ғy|g!>\dT,(lM.GYt0OpZB(_sR{̬[_h^g"w%2|v Jskajm6S5E$Ag`AJP[?Wa$+?SD+/p6"7oʩO hDX1Cp:8< 6OЪ3v]r ryfyw Zإq@7ʗqahH&X7PӤ)cٔNyԤ68~.NUݯɔ&ZFjgcn FE-|7OA㹙yU%>)43y8-"*Cjux$mi/׎`. "3Hr :r= S*c =n-Zb^K^Z3Yš5p7sje'd+/3ZVGT0 cXC w6t`3<LzPl#=3G˽w U/rY/Jmܻx5k*LyN PRk=sW#O"11|X YNI?oDLc8vSZy3ū(7&(?]!t1IiFss Vrb3맗U/{?Q\A7ذ6/L,0p~rယ[nhu1D8I6s޽ csn/I+mEjF._m_lw#RXh؝G`^ C8%HSGVuCPGGD5N)P1)sX*q1tJ R vx@/(.i7SN/}t+K>LI)yM6שFP(bLmbr^$Xٍ%6k_}z^"p9% /lR|??Ub2g\&~,+X@3+Xapw𴔖Sm$d‘珕պfrHPIm8mܛ&Y:|j9MBp5$a9ǻa~'0>aWX85\ CD Z+פ,ѥgh̸! ,׏)8cZv tULk{;Կ\.+ ^4䲣lZpkr {NZ0Ȕ.>SCEXE@HYM^ܙgΧ:*1*S2x?hޫQO$#s~|3jQPt }Pɕ[[]i\5k) Y?8r =6lOPw0*'m2bЩg`swD5e~2-TpTt*ӌc(DLz`^먉ATI| r/cS'u&^3|oeb2vxnяў?w5G<ňgБ_F nKNP?g!}~rX5.fBW6:XI<r`13*&(MBT~AE4JfGnh]$U4 20JH}8ݘG0ڂuCJ˃\,YL`%8%qx)ngR]v%\OHP$X2~vpQhQ k 6x7dt@&tR/TT}WɕDBuˠ)Ao1"GqE~y˃08m\֑D'e4ũ6k@ 3Qc8<%aH}*U]S Kp7aIEpeE_vVph$'aiS7*u\) jDkzh wdZj|GzW>]6{]eVWOC58cz FZ^-5"rqT¿(aǚ:2z(`d 󾃮 W3Aw_ &;(o fvfYr>~ʾ)g^&>NR NM6zF9,B hWR~]z-/W1LiԢDJiTS0 BȆyQCl"ZHXvJֵ);ږ\v86%Лibpq$m"߅I4R{zttݝQk%Zvx3T/YJ+;S4bD逹;N;6WaEPYA_ܛQGyOR"@&45!fNprOk(ٳegBقCQ=Cp:zW Hy8=W9[S`|s͎Et$z&lrDt_[e1RB8lm4#k,ρ>]ƲR~?զVyQY#eLJ(#u&R1[q/'V1_3*Owd?E/r0LMS=J+b}UQO袳\DIX)oAV85y#r >YT!eoM).0JOXu:l<=ԞgUDmNIKyhP{I[U)ѰPU/kJaSH\B`98~ )?S L^䭷vӓӽ,͆>i#e?y&"2 SSm쾗܃#*:O5R/M@NXU#h=BGLi!h"5<\lgX6A`^ȼhfϰyD>\΀8ICo "TphD}wb@/Yy ᇲҧ[> ,^.U% (XP>Krm= Jqk1}~~niG3#1 ^JXJcYP,o(zs=c{JUX+ƐS.M^*#I[ J0-։2Jt]d/R'9CvWf2yRHIZ3akl.iz+sw#[G 9(O3&FߑUGԤǕ4J@S5%ƲRφq#%)t*ojt`}B JzqzF e#,{|CSa0>}hwӦP #an3AE8`g~xv0J[*hkU9^hL.T"jȴ潩Wnٷ\mmϱ,A2O @Wb׮ә]4s6YeSz{_0''ذ @l·qtp_jBPmux4ᦑPmiNW+ɡ&}5mp{S? @|,Huq"F{/\R`ȅr,R4,ڐyoA[Se~|`)ձ xhI, n?-ymBV F[- kݯU" <gheiWf4BJӸus..Dֹ1w,1td6p]o2 G\cj9(/j<y b.1U ſj}HG| aٸu˃y 8©7"6)>oP>U\BM4'~>͡~y AT!ltQ㛞R0`}ͲNP ]10qx^9]" h KcdPvX{7m\7Vڛ⨅bKJ\ 6`j6CIJ^ɛ;\* ]ۤn[XndB%;Lb޸ xϑjԖ_v!7AD:tyR̯ɥ%?9yU;Աv*MΐaZلC ˅A"u_OiF.XLdk.#J 7OdK*}H9YrF3-+ %s珕'c,N?254+kw#V\!$ؼ$6"&v-mg-i^ʞ,\LeD%|$y.rӽyt%7>58!:S+Xo'orh\]> W[7ad*\ұ/QU8²eT{ıZppd&rT6!pq󀪯&'Ċd<|䗂׎b^ŰcNɟň&@hп4F#|&9$ Ro xޅ \q tmz@43x'3.>`>}U9C5j,Y|u;Ni`-UdRM'YjPˈ4HN(Y $8{5ڍ>C:KFևWF^[)Xh.{G|,!/OH6COkt%S+[pA6,tXz];MG;Msx1ߎ\ )pn\ԤS~=f谉7ū@jȌSZ 6)@ra/΅8@q$|c@ޙf5f+EWC5J6( ӳv 6xgg$gnOy̫fu|G=mN>2 K@ٶJ/R;e}BRf*s]iZpؕFr*seY_(WpՁA:f[ m'QbF^T #y_LenQ/J饉?}kExtCgC}2؁ kFJ( 256NţH!EZ{WA '醩Jqpqڻh,&k`F\f2~TòԫE74ۊoN@;D cFDxTo]hDiکؘ~A )Fx&`S' |Lu N³8`bZ$|tEl!IUr{ 'Wn/NHp26EpF7 j@7ZجEXbg߬=H- r&`Z6#u /* _b B N/@7% )#ğ/ xT+@/J G}|S^z:uնhGh&fMՠNEk*r9VT$lPA#֛]i ; )Iyg;NOXEU)7OjH û 狙d+,\v*cFZ㪄y8ykf"%z%5|sr 94UlW#T9KP=k)~9j{>$n]js0(0?A٠Xl$i\f:OX\'~ފ> i4ƾD?Fa)& N)J`:™}J iF+Ƙ`хT_2RxZV~(&[lTۑl|gWA}NlmRYڸc*f\c|?,hoXMbr`r)ܑJrQ|lBxLCf6=N]w=pl֦V/KnAR &zf-%Qx5BCʹ@I"JfoOgb>QHi菛 ̏Wyo&d>wkQ EysBr6܎L8 GߺC=>OqYxܶޖL5 읩2F|B__e+}VɈ8MS- O#1Dߜ cE OhW? !\7,S~Htb-gwԨ'v5Y]B,_#-d!Zkh4%ըlA`˧x8K)Q ܛLEY՜epw{ҵ6߱x* /ꘂ|]B";@/4jPv WX :P5BHu0]8XIk*%Epw(JH~ZH5(<'r"Do$ \ V~߰*')2)3G!ބ]:SɤJڵ0M4O_Yәs.xνCfx&T]-pҹ{Yʊb{yP2ݘ8*e6|"+4w?U!aBOCvct-Y4] u6:>_/yv۷ 3ϑi5IS cWwgelix~}f}ƿV)Ω\P Rp?Ju"4~98{%7%$_mB>bU$gۙUгNfWO*9G=FjQy dA͎S(QotdY8[ha SV*2rX@ utSB{ANJ,\0 pꄅzI& ҽq㺖,n`]|F`7@?b n󭵑Qn9Z$'OYԾ2AS&Lo Ѩ5j*@^{d;đi',We`^6{#9ck3){qmMr2 yؓ-\/ֶ4{Q`C/g v|t x6Ap:Wv5Ws.~#-;/J2[#N9!^ǻgIUO4,esǻ,jg8:_6Z2OT'wuEC|K~3y,9,W(CþS"* h+[ '8ªU/PׄhF%_+WI1SغR swB2 .aWx%YtA`962/XnƠXLFi꛴M]re0쑪=:7b_`9FZզXx j8|׫}U,*Pkk=]0K ,7{whh o_༠+Ry@kMPΑr -)r4i6#f! E3[1=vuz>aIfojsJ(Br)\PDlI r@5oVm*ޥ8Bq;E%?#ABELOE8JzY1Ê"Q2-3,ß3%4bV#9G<: x;p9Ҥ+'eK*XѯOv*VQISp` )cDWjPFx{i 2$}Ifl]+JjC;`Q+2';$){goj™JWbLEjɹQYR4ܠf@X5_w<[oMY '9_|1[ipeq*}ŕtZY6G,|Y B808-T p^} ÅGFqCB5"FH2[#}y' #٫NT^Ph"2udu}5Z}GԣQN{"1fAk!˿: FyYJŌt2q.u&vtӥ 16(6ou J.*42eDʿKƢ]!"N;AkDYKS3 Ԩӽh%D <̉5t0 5Bն,Zb$H ŒEk*Qy5@~ᆮ1F@kka{ɱ- c&NN%;Dfoh+2Vs ckc+<6GnڍUZ&&YAL8Ag_Nxd hIm(jwT4EV xA9/TPVJcg")d#.4 X;(d!_K-'UK:g7Y0!vch_1g0]L.3Ut4dFq.}etKN(>e+׹fjW!&}uJL@*'w^,7lAFuP/o9X/s!S&r.*hd Ⱥ=28((+:e"dCzbȵJEoy0fX?+:7t?#e[#K}dn vFAM_@ľ.;A:#J ?Z}GQ҇R,'"bЌ]͈4=K\tV@Iqroyf:0N$~y$X Rl:} 7(o|3IY*"3<]$fnSh7;EYltJb Vx@_@._/Uƪ7Sq z}8x/lj_fIj;΋S .p|r/-k[U>M7I;v{:\t`Gu{IYQv4.9F:gjR ( Z'WݷF[:Kbۇ̘//[cJu6xS/8S1^ة}wDJ(J{:0I `i]m\6/RfF#4H="`._&!z4a3%'|#.P(T^\$utUVλ6StI7.'_J0ũ-{ⴏ )4= 1$,$XU7h[bɯ7>wYĒ9uc e2k}7)n:&\>-Vь .)[%nq 0z>^a!W2p Xx#eO $6pe2 S::bGFy0ʦlb|!ZE%`]>x.`LVu )= ]Њ_'/,AůE  o qw'^;b Vufa uC/@#p}@]Qa=DϐHwf~bd.M3XZX⯥ۯE1ɔ=Y-+:%|}^_=tryQ"zk Г+> *u<z.Tec4Hlc(CI"0 Y1>+R2lF#bb?f-"U0|GX+ieY'#Uy|BodC'vAXCe9밯[,G Hέ?e%KSpTG1k.U:v/Fm>19lb! Kpz I,v'8@к<%hVVr9OZxn)m2PhJ-w:~nAמB l :U TL;z=RU):J8*U[98JTv^5~|f54t`(ًhlᑾw^Q4M՜4\]a:&=N5F;ZCvY+rT e" %|s|8Z*:}̙ʹX~b7ans,@ō ($&.;  IKJgњHLg#J؄pY!Z@e;r6Vr_@asC}auEpyJTH@>JB7Hڏ  1׉{ٜoyUun'=\a+(lsv_J @癯+Uz8P1\).Xxmmp8sw_[<:Ph]FcB Y:;9=ۤz .0 觌pwRosum;(tŔ0Y^tM8P.,xUcm_PvVd+W1j?_+*]:ʁwڕ\2^<`=0R3S<~θ .⤫^B>3B^jl;]3УzXg:SM]'QY_v2?0zd,DYb?[[,a+G St|y+lgC5)|)˿NjsIlg}ɄdLCT9W?T ٯ UcO P.\+&'0HC 2Y.5Ϙ!AUOG#VP7)ƴV@m. @@K$Nv0 `,N28"Ir|' ǩ4G8[eQ8 }pbU' ҬËtbRtM[qrwѫh-a~۸fy$ɢ׾ ?le/\,IfKfC6.Qa}W\Σjل }"#Xup}3&Z4 %Bm=v3U?fxJw{f""L|pw RE+Wmظ٨f: j+|eζϝ4 q3w' %~mi8E ?h*9pFϠSkOQF'LsQ |~˜A:z ;VˣHB/jT%9iT8݅PC,\S1 wl d'º9_e77hLkH .% 2#7ϓ+?nlȪ>9RngP K^듒R﵃:zSBls7@h2ԔTsӆ:D= b86̛JQ&=H%,IG))R$skצu8LnY%Ogg0맳H;Y}x>KB-RL =Pdfn$|!Ș, rG`2R|?h(Ӿ,9s`oRIӰhJ2̪Kq1y"MD] a7jtߘ92R{?FJv?fkk}OuuQG5=5*Mǜ_7@gig9աrWo"<Q4[SH˃L$ߎ‘iK}>ʁJoR8tT(Bn3QP\ÿ|uDsi:EZ/a2${9CmCz8;0XцŦUp!B4^4SW!F!~4HjD2B[A[.ݵIJ-ayY"kѲ# bыQԡ;{'_jW /rT+ (0-\=f6&Xݶ=)d-4M aũiq%K:"4Ghü%Hw>~8Cv8&ԴU\ ]IK۩h8ZcQsmyaLu 2֊QixNw+)Mك Y"!XyҚwj89o&ܟ+_UvFL?]-dd\|z[ ^%9p^E69{mAe.&knn04=DRfGesVjЭP.^aK7t ~)2hRijfF-LV__llO ;O6Ë0c?M0DNcA) +7֖@ԛiԍp$Z|l>kHi @7GA`g $/2re{DSX}0[$So}- Xy=79=< 9#lYyI[JƓa5oʉ$^@=ء6q 7 .]Qғ: *a9 b{D{{"}m]o^#/ W_n !C:Rsw 3"~q<"Q6Ɲzƒ'e3ۭZcN Vztw|VuK[fE%zF~ ,Ufڊ/b70k耛-̓ͻԫ൧btpvR!ђ0gj}-$rV9;% aUy&ebH0ٌ#ͤuͮ  fR|aݣ@{3TMd>o?pЕ&ǰ!oox #cN%P.rDzorG8Qgn e;tfGNp_퇄Sy}D$-[uړԊ.ǂ9.RRP0a-ᰨr-͸n@JkHW/o#i۸6Oh\ƛljYp~H8,$E0*c&dK*|V3ZF*ǜՃI?=0RpƐԳ@X[|/ {t[5aOa2p?QPba 7GWUy% ?hMl9L"+܉ybbaa^iqfǰ`}C|.]qmz{ڑr T!j u:RS~>oh:Z|lC0&$ĉYjDs濱LУyFjdwܡC3 ߔՖˠJue%nd4N R=^LʋdK{զ! p"6`pl1K(;p~i,R!k< ʜo$N(k`|BQx*=9cKCK7 i;*Nt>&)Bv䂙{͙Pvp`vI3Ho>XهJok6rPuX!M"ި m7J>: qA؎Zo㇆> mpA{S(bBw/o"nf.) XE qƶ i<՞_ҁ*߄QǼ6[DPmF5wL;xⅶjg:٭ˑCRTk1Bdv)kxgĹM!L8');6P%i6٩y"H/=@Չ1Jn;r/4|E+˜ #'GgZs[sQZ\"[Juc032wZ#@I`s5[F ؄_7c4O~oJ:Z3*pJcDȝF:6iKZr +H0_*NӇ`X?ҭ{lvqIO ݼ=2'7Vr*Q#Dm_c^V8mJ_$Va15s.5 X 3=(~us4^v*Pl֯ %pIəN̹(Y9[^Io~gxRRnqilj+6cIo /sc{j {4>bP&t%䌺PC&Ѭʪ\#Q3b:z~5tj!0n5jy>P f,nN\USvNy{YMa$gzb~egu٦\]fVѢߴV$$)<ZjVp:p6Gmw2Ժ6wd-F5X? { +wO{0v2n~xnjs]50-2 <8Gk9՘aUH:|֏; NhPɴ'NO<}"9< U PV;"o}+U(`UW,ss!tIg*c8oYN`>z]ޜsIU0'ӓ- Nt1&}x2dS$?XȊ# tU&,iG&a=@D=#L}(td %4Y[տIlA͐5aD'!j?(yΦw aߙ ]U KTyx #]5%PnDLM8ð: {87i$>*( cE-k~rp:=ޅ2mMKeqNMD~d*p%lwrg6 Xz=\>Ev1'Jy)]M_?ҕs ` \M<'P-2$ D齜 HqM2?8|ORrbs\]24l[9=Z5X v4 (R0$BX.ܳ=(:)-AAJOY)i 3#^;$W]f:Zo,EeiNshe"F>b(6Rjs)lqmClcxv0V@|d|;Hi_®;,>]Xl,izd@^νtl5}{SJCBoi G*2ż1/Wah< s[%WĤ\9IDe<6-|a֋[S|:ㅱCKyt.xtϲwVSjъKZA]rIFEOugm(#yR!DOZ.Q k:A&~#F+͏"?6ZC/ GɬI\Mdb2ΙSuIzHIx0evKyU@v_p[q7aUՓP: kD|p3%XrV| "uP\uGqIn!` Ʀ~"G%70, D!A.KQ.R. ᎛"˱Y8sP3؜ŋ\w3gTl Cspt$UȢBgDI._xoF8xLv^=<2˃F!U;ik"wR#t&n{3az%˄|nKEƮixCہ\Y)p 7Z-[,txہbcs '׼k_PFSsNxWK5_ 8u5vԷ6FiW~A3(LxVNykAXKwKؑ*h=ljbm??C!2Ȳ/joAH@$>ZRrRXqvF1m-IWXgmyucLE2ԓye݌= UXS0;X]}G&ޜR^VaBW4"+G9-TC'絸933x\5m}[S/ܻT eq&;0h-b+n'>#MX% ߗgs u+ ߟ:YknAOb!87pŠm'qgFW> ؽs #.󤝸;O츭.>ݪ=dA5bEoDje1?kv *oaqz cNh gRo epʓVB~?J ӵ5/봫[0pJ:X%4!Dm!qKK*,ιڙ3Ϝea<ֻD{Sv༽KhY]8vhB`\HmK1̢֟Ejx^1|MOY_P\>6F ?K0~}0e$جyߨ%G6[וJ;E~-zuAɖ|Hp hsnNC1^w54x\-׊4GE+VR˂(aSWw5yk Ml %R0`]ۨXdLIwfcϾA[4zȪ( iܕBR 5#{y=-8\a[*M]}CE.s!p(11K7ܦd K;q2 IZT|ҎL`x( qq*{SYcFqIOz:|@1}Ny޻2f xdxf jq Բ05 [@$.cQ# L/E{2rkm%|7wR}֑t깑a3;[%@Fi Wb'|lZ瀐$+x=[.[yBEc硋9߲@R{\nYoQ>~m``Y=G5)Cg0,۳[ȏtqԨ,ՠK߂g+~Vzd+F X̮)8}j^</b7/ jy[W*U+Z 8nEQ B$8*Wapxɰ,'{{|v,G"(c+9`D*i}ZQGW:oXn=DdǶJ .BF=ʝRTEFo_ϭ!sLZ*u.yJl-1[rD'L>̊b2؏fTs2;aO'&F&$rz+y 2|+r:Mr wR؋ąA_E_1/jl`ȏ缫 r&ch LY9vqS vVpT>bY!rަ^y-x&Gke* i+£=U{t|d:Hx+E.$˨̟pGE lGxӰ?ej׍!/rqt^9q_&9~wٽ͑c)>(.!f %7e[KbD)%Ti,Y w¹L-n&IKhƗdZD#E2 S Ϻcݤ ZghXONc?TuQav/#ˮRSUkB Mۺ O\\(lO.lFKUpmW4Wt$(rGc`]yX|TEahS F#9!)/6}v?dzˬ+蔼 !ڢ>2vTM8lD~ѭ|.E^VQgP8.E@E1"pHeVfۍ?9 @m̬/LWV}ٽ4y %+Ѽ?[ 3ݓO8d2u~"yµ&;i()ȗbG5ULt\r/ɬ<=D:1OUؘ,Ѫ*sB8n\Q?y;<NJL-|K>ot`f41lfh E^G_F>aQхYAg<$Yɡh2CP3t=lwJEP4kmjX$\4Ʌdoנc_W*捏¶i{y Ԟ䖔ӽ8٨{|˰+xnG7 ۬ ,BIp0dw_B/C7"b+* &Aszɽ"UeQQid)؍g#V17'Bܛ|XV^M.Vr|ȅ28j\fYQ1e X%,Mik4~X@ &8Gu$%L%7`±;)VRپXkW3Gޡ?}Bd$H41(^e:Oc[i .ĎYGKpLn9؂BHp|йRzԵH ,BA7{{`1M^i)vYm)l&O4)eIEhS ۔!踈r^ܷ^ Hm>j'rrf4*T^؞O& E8<~ Z1:4 AB}qH0 /1 15!)S{ꍕp[vFAX矲Iڶ*q73 y+ cT5=.5w9ˏkN7i Jcz NGd泱 Q\b4vygUz{|llFYZh'[<_!676~S ߑ[#Towf 2hKN|O{޸Jj9TZ{iZ'th+ZYTOc3Ho: T jXEWe[h>AY#?ݿ=` \. mH`L*PG'`Þ7E*3m!EBecWyFeׯ̤+mT:?n^SN}Ĺz،!.ʓx4rZIL_BzA=1MvAAb#lIl>Z:/#GiBs%$SJBs̈́SzlvE-8]|gghNyy\/y^c$aӞЬ< p`~6M=utEZTҰ]=B8)@~곹4K`nI7PYL:&~`9:w[9,+ ;Ko?ђ'D+twx|kZrw%ڟy4)?GeaIU`t97$/wV #KijV []D(~#3`8[qɅ<,B"㬶rTv/8/*J2rG[G6S[Cz2>ؙ<f=2D`lEtu)R&DDǠaF"^PZ5FIm-BϿYo5m` N6GiSRd5 MUh_BRcwf=C @%j'EL۹:G,8Nx>Α׮-&$q=d )pvjzxs":Nd^+}ݵfR˲3|~iç^1t7Lf.j^bډaxϿoa MK-TUu"X*Z5ĺ5Z\QW5D}Qxh<̺ی#(-նG BjqeaiYXi~E=^a$&)_| m8cGΔe\Xh~gFE և4;o^Lnwla5~BLcw̝ Իhp |ɀ@?k'e Os4Sx);%AFD$"|W5S&130^X2h׺QDjjYr8un%s7XR3_8p 0_}.ԓ1Pv'FZW) K:vn&,PR=@rl*q)/"G%g..ԺܫݐNfԠԩOdt4B3 .yiƍuѳR.S.blEP,P0\^J`Ҡ)gkPL,p#2<-h8. /X~M߇&+&=8|]JO= +8fB"tC+QV:VͮԽq54 dJYƕU\-+8 hp:Ȱc4܈55H r]{8Mgt?Uyqj|^HR{=Vt u@/[2=D'dȡ2|zx}(9'wuI{˴u 5U >ZzLv6\q&VJ; ˶͑L[Rld kҩId1# -<Q]G83WJv8Yv!/[WeqMvp/arfⓡD >Jj]O&(vEҲ`65Gvslvѕ,l H$nk\-,RJ)aXũFNq"wGF)UC"UȤ > [Ht"KksaśR{ DSUHTk M oO:3bWF (4^եf-+gu>B*,pi`llF\6}.7Dx gw*5>[6<$ WROA\o.he4Z@繮-WkhV6^tw!W*2> ]t5MЏXXϗm)5FI䑛 Ȯ˜k~Sutov~zK. Lkg+71KDgM!5R4V\pG$$DS:)21;4ʳ=6WblKZW'ft2sh%3hHLDsӕIF;f}[mGuy Oo 0hc?m~ ҇|]pYPfpm$86'ǖa˿ieROhavfy3wjRac͏m[WN[6kw5pwg>Nt(j,yI\,"Yn~_% :lM#|n࠽f:^}MlshSѬMv~p]rh] NFp)v wbD;)H,FSHd 597~c(=EEhY'Yn<ք<3n> :p2e}l (Ӌ+޹/&,ʤvesJ@[NalIn5LJJSF+ d=Mkz@x% I fjbieYZScwP$qحkkڦ7N@hBcU>^w=C3↶˫YD"pjeWpB;YaGdYCN cIl䂶0%c D> - lWӲ9/AwA+U`+7u\t:HԴi:Ş:+]tyA#͉ ޲|?QԭS#/`b]x,J)5b]Ԛ޿AxKWۛܛb׀rmjQycє2؛]} vl?z(`VvYYcaen.ٷHZZX:>LޟnzC.~ӎsś<@م6FQ}>K7߆XSnݬrsFG׃lm4: T Y@k@47OG?J4+?cJ aS8wU?u] ;6T늛t{zNd$mS(uz{ u#k#K&daa'&țsϼ8Qtâ sݗwᶤ%sQZ3 m 33KۦhsG@6Z#B#4C{bD6*h{LaWY8.K#|t㉶q2ޟ5s6)[L~=D_NűHc3skĉOs ܥ%kQ\ GBodSc3oW b?n9Y4#_QY`ȂoV1_~ojҒY*5y?&"jV` nAi1*O\ޙ6|D;T"^pqU )TÿL9O3M!]ن-(@k:䃧8L8%饭aJ;woy "~v)[S=A0}sJ/PA砂~R+V_EǺorO6dW%=wx3-AQmrlFDD#v8]6)廊G"V!2 PɵX\0`g AAf)X8m/W$bhw1cio bEH;DD|:,a8>x0H#&8Y gm; %A XHTy~Πq nbX7fJSxWxnugq0z?]G!j8j FD>ċmDUwؙDjwnjD\B^6vJ#tQT =\+4&ܙ)lھяk3V|K\_uRBgE5^bsY_Hz{HP#ҕ㊋Ɣ8҅sOV=^F9ySmP9a_E΀B=iP6V蜱7#bFFٽ,ps YĉbbzX³ǒNyBb~EǵĩYp -4_HD1zzM[ &$#&Ϛx[^6wLpF=7T _CEL} TA+M+nAufcf9Nt %Mo85iɀ*Uݴ q( 7MHOl{lbm`>vCHgvNҳ0Gm  5" >7(^ɚ/ 6sY|ԇov#Qv=zV&Enߏomyw4\AsT`xrͬ!l߆B*/b_ pE.ruG{:=C^bHDF+}'Ư;o߲i£<#I+KNқPOkS Ṽ*Q?-&/HWKpeB]SqP^iUY+yӯ"@N4O O-Ȟl/"Cm.|< .C H$}2w H!*CE/Uׄ*bf7&uC'BԷYȜ?gd d(b<#nH*E"y$<{%;Bx5M=Eo8҈ ѹ~E/ +OT(A+ b =>'=J(-z2QH,¸KXƢf`-A, .yoItiOR=QP6<%$<UxFy}[D2yoeSղr^\%*_`aʦʍuIia'FnĮR ߆wy7Yac!6WG`㠣@gSpkV$p ?`>I(>9P$96CT]d-MA]-bbn܍2br G2Cp3st{*]e3gw*`2|=a!OH)PyiMۦ\;3fA**9hK z9\Sj>xxKvJdШԛF3RVD続%W_mNj[c1MD0KHfe?d!cA}?{7jTzTMJ`Q2jT; Ҵ44$Wr({6|E{9RoZ#ӆ%;aFM4IY‡4#aeӖ\ ғ):3ʈU'~D_ΟΒ/%h=6v ütT~Dյ&R;  ]m4^?{[h~M~5b Ԧ(eR1,B\}gwK )Y>d?Jޒ(˴)y4iP!]H;AWmcfbdU)]<?$$ČjjhI%x @W/ڷL/up"r5w\_m#ISôA^Jng8)X;OOttĢK=PlBcsDFkx(xDX!FtjH/J=)EjQNAǶHW>(( s-$gh"Ϯ+KQopcC  gx3zL]\_8N-2woX{g DQu\Q=FbQsO ]tv:X]^Tu(q/)u)Yz ;N:*Dk:q=Yy5ȯV?)j$<ň3RYؓK 铂&xh"A<'xRP&G]2v1}zVܓaIXpV7%[|n8N$:~R{ fc4ꤧ⒛yJ#^fD^L,7]{"cy_.%=;Iؐd`YiQ +{Jvx2@V$ c_c?%,$G .hKyjd,`]"sUMk0n ˎRCLWh##ЪGl]/;+fkMţo>Zqgʫ ™UҾ~&yawbIx Wh>IyO%> +4$S/('70H0N@44*Pgn)CkN}ϼgOBp%kdL矏M(%\kTR^ؤ9@>$հC㕈ޟmXnR_Mg(fC|:ABkahi H#fCi%giʜeSDoC`r"41b)(;q頭bo|'H0n,f =Cn|^ے5NݺP`zA/V(Opk~=]f:QG]!h<519f-}U"ܲly1 R3ï ^S$]eatܪi>=4ZFL;P7#o,PV6pu^8TGeiX!fNZiXZQnIUqkXodqZ깖TS[?X¼S ~)ڣwK3lQFՍqͦy \|'*mIE@&rĨxE01˺~^ 8fer!aO0W^Ku:-x4*lt<+_y֡\5Zh53 U% >C]UʟDs[C~y`c~]΁hH]P_w'孫~e 1 L(&x0+̭1ki哔=j+0>)(&{8q 9VTAt+ :p+0Aw/vf5Zx銦owM$F擂TmsMY/z¯ӊu79'a )uu?$*PzvONjʨZZ[ DH;o cd\ a-󆣓ˉ)Vhm]0%JҫJzUgI3wKY봫R1TޞŷE@(dٍuGl[E.<5Vb/'Uhb&ռ #Q.|q(*`Z0ӡiz*܎6Fnɨs^sL32ܘaI/X^Nl `,aL@]yu^8fp72A}c߬ ȓjR0O%z}&}J20aV2ES)hX[C6BIJ紏G! ̓/.U& So\f؃̊$TM)e8` {3\Rrt54YSkʦ-r/C!iK.aԪ`Q$0((NLgh=V SnI eA`SUw=[BnD $T۴ׁ%)G1K !f||B!?O.uڏYu? GzAXvj9j'gQdmm{s,sp*$n#w @pLnPّKe1+;Pj&0,`Tl[nl:^[-xiŗ6eh Y4YIq53E9Sދ yc3f L3g{Lf84wı%#*~$=bkz blⶸnA_Z8e@t_}CE:7+R ȌVY+Xڂ.M'M{a]}FHGo[mW(% %]Aci'qC$$Bli처! b -\&5 wsLs]e" 0\Rg=CAc$kHo{}%I #Z^;t@3k=|6.(4H$F@O\Yq=h献᠆=A2"d2x*ƜLf`@ܑIL2Vh&WrJ͓c)#i[jXT+D3nOth<Owwq"DL&`gQZLmrZl 5&שD+=!Ղ KX\3/"f? ft\ō!8LZ\bsE?U+NFǔYz|L؋|Uk>-X~~ߜe1yk ½ɣ6Ȧ;.?ot|>|UJv^D=oc`=0Q`gA^E!nIe=q1Bp.^#E}|rJ,elz\6A&AҼZUwAstB}2@> MoSEȞ~G ocP}bg\tRt2~ߗPt" f`Q`y3zq,(؄zjIzt9ž JG.7s)TƇbw%FZcyOkUl Ghh75BTb>r>PXmQVΑP!|p{#q*;Cy( },fS3TH2v+8hhcg=vOk Ֆ=)X/O$; eJPeP (pKwcYUܾX(9< lmZpkBPQZ%8Fs l~iիsa5~2 t}TbO亰ʣO8 E2b'Dy4zcDV t"wב'e,h @"=ZHEƫb4.űt)t~4tzdYggDK< .m硩:穙Z.uX`X|/#EAR|X,hptΏ( *ky k[,B\Ў00)ϑa L::N/wQÌFau_ e˙:Ձ5a&cRZ,%$5"~w~!H@MJT~lypݯ_Q.^KEn2&0jhE ]RV "" 9ǟ BԎ5EI;rnNaQD|o9Ǽ{vtRs,"Ӷ3&uwK82u> ݬ0Grl.LV%z.e_e}÷ H":[ї/ØWZlMŖX3%Y;ڶ.S0</!Ut56],ew $"#F-y#HZzDE$ QŠWlWZ:Q4]41n `zD-*=(MOkĶdS}$Ec~I=AnJ. m6(p2:S]Z=(hYR|kJ7Ԑ=/A\|e?EcQ `23U_>5 BeTom5KɒF-iy۽3|s $ߠs4 tEwnQ/:WdCx/$g[iQg[fH*<Ŕd?+h;4yMz|cwUV.CH@ݿMqd6FR?F,Npұ>%v@',6(f xdQYW &ɶu}}+Pf&^t(uDBg/#(u1Dly7k AE bF[uePY(lЫBD8A7w^Ii e*JݹE'V #62<%AWb5,V0b1|33TҲ&z,Ã>IÇTmXWnލeN8#OL偤q{t'WEXŁc!ꅁ /|T2¦)f'HDx.l/”ѣn l q?6nsJyVSEn ʖ-p쇫ۃ&`V: ޿-hw-4 ͽqORw9"/?mMd" ebQw#]g`.?3:3_*;Oq!HtUTb|Q;NGD<<4q医0.r u,[} 1eQk L>4|agBaerȘ|Q>ZW/7S`5 z7M%n,XʺܹJVdFדY-[슻H(";Yj=e;d:M.lY#gĆpGR(ɍlw+8HU 9Pή-Z ֗=sA|QhՉZ &f w$@_aq7[2:D*QdZan"/R_nahBs=YL-6ܰfz>c 3gwPblC'{˔o然[}[+3>gAxzmчstO툨Zs&[X)B9<1jZY)ܾ6f\/a}bSA2+?D%Y'K*rr9ƈX> 0j'Q 59wu Ζ[ !P,X{v`  !rNAVt%'||ZwUE3lK7Tˊ6[3&Sg XFMnGxyO;OJJ<|CnqҔ=ĎidҜ8T  ʎf٢dž*BPu4G byN^*kfy&7(?^\OB4nv ^|ᷣÐ# 2?_d"4emPK\4V?s&'۾ 4̊!GZxFKSJ]8BU/mmgppJsR{$ `jQ v&O؍Kd-잦*PRWucũFv3|: (0 TB^89C2|Fm 2s8? gk9twKP)PoCx _UCG82_9 YI tMզ' lAطicvSdИÙ1@)<1S 6J]4W7пhм;JJNvV@cYko_Q?3, iEξ@)Va@#p$I1@QUxHQm\wgl0e)SNMNDR&6e GeQ 2@0VjU^fBflҥ"`5>.ţ|N~CmP6dUv#3U qܼz~OH1XL紌q˱U-k*7ri$WOA'I 7Fh66K30״Xnͣ7RK|׵d5h%x9ڢ#.A7E\} 8O:"A/8@] FdEpJ&dj6nvT̹AuTH2Xf*әDOl{WzГtH-j$cM+S?t]Uĩ_mIj+rMy`EQs^rfevCjJu<}e;zh.Y͗!3V{:{/6}(I*wD[o(RDJ g_K0z@82#lTs,_Vk6ҝꀡBr~siHVW$-䂚 @֏ U`E2S$Yp2OL,lJpz\gb2r)Ht{T;v `8ЮBV0'erm:`Yco mOmi6Gi&^A {6i+s .f%l`[łֈSv-}%'ؙm}: lgH͂;൵rYu]yjyϤz#X6kRa`جcD,I>؇OwvJ(?;uyeݣ׍}qr ^^&+$Rm-mcu['))zú@x^ ۘYN >{kB֮u!ʎ0>D; T|Ekz]^ y%;:Rw/J`Qc00yK_w+WZР k(. s5k|s=dr ;./%Z7ce~k SAu.keےȿa`$\pRPAUġm /"PUAT6=ūSq[XxiVfٱi<63i]6*`F+Yt NEx&@k?.e~4mRk1SmuИ*@˄佖t3cgӞqچYo/!șm}x󼇞ߣ͏ZmVVI5< BK!aarvklGBݟDyr'd } w[,X5}56&CS$a(ÆU)ADP j,,]뛐oU:B"|J{=窻)@-cbr[4{[3d y]TxD^ߔ(saI,>T1@3M![.c &LF0EneFDWH6γU<&2c&%@U^joU'h'8TYoax7¢e׏Ƿsmk)qJNRZ1(~p}$]j?Ea>=Z IYϞ}]A$q Q:cUJB8ۓWϗ]+Vaߊ9cDaGl$($\؈j59pB;#z)20)ip[Ac=' BG' @5vb6;Ef؇-2kͭj:%s LcOՄ>*FS-`^hR?{:iR($jPfcY ?sAgVSr󉈾.l=3ܐj,:e[S:jןGvqqꝉR}3ægMuV ,SokZ`KoA/1_ޱu`FɽCM=@y!pEFa:[QLNH~jK+h`/ p#g. &~aek}Eqs1Ub{yH9_G ̩'e+I0yk.`zW-qTf&A@I;`I?iH eÞt QUwsM8ʐ2tH͌8Ҟ~zI~&mi,95滃QS=ζ!`6 m8cYO cfpw*vOcog²M1 ٲ~hsD\eu8sE;' qkCx&Ah] O9tQm` P3j$bzY@~AWO?;&Ҏ`(wwݻ7~@fy(kNB{G^,_|H7JS::&sҘp3 % R:bw῟r%zTp_ #~~-E$(V&JJn(/>ٸLNmc@Kpu&q!y`bMsݩKKD!<hn*RR2`A Iŵ.cwo&Ye䬆%Z$O B-[9lb\Ú_1cW];-l.c\84,@A8=Y|# #w)zs̀P࿙%ǃh(?L] յ{j1&[ؿ}!5ῠx AiԳVs{jO2,3snn^KM9u5yrtk! ՗he̅؞:Lb_ j3bB)s6ŷB1Oz#q`w֢R9.Zt/'\@dϱmEQ̷*k>{Wnڵ%nbXmPVŽ* Oු-ڄ'[Djwx|e8[9h-=mܳ"V|0Xd_t Ɂ!U)@κx`#s8G!.{Rq3HN2Y¦F!ĉbU'Ftj1ȃ6*">ZvhHPvExx(±EKbRP}co᪆= nXi A^ju~5-XDiceiILq~+W? urDiS g]rM$eo~Sl,P'"M".sF7[XSd2wgޭ.;at.ڪ)x#G/XŜ,k+u/rT2wQMbvyh/y R:=t%=>7L(G{EIva$(B<*,8NSEfHⒾ)OD8"vpJI彚f7iܛ=O3QoTYgr$ @xg4O1#N7Uw xKyIhV}6$pHd5PB#^c{K_8j%D1J`V#7tnFчs Uc~2\EѴ߁ !Dm.(2`ΔHQO]9[oC1X;l*GQFx2.)3-O$G:>V`=~>UJ>o VLyh F' A3ܗz]yI2VDҚd8j1̜iF4}=[vm-\R,[=lɢEFTX`2O%ȋ&+(kEF^'̾,^I;YC)k6T\@H9i3lH^\YK?YxvC 07Zq} X(~F(mE!9ӯёCGfJV4݊TaZ ,Jճiy0M~'띙X'7gd]rjo_`i *z˽E"mԈRmy3e s ??7_{+Wh>ɢܤyd!6k1rȬ*]6:zE z 3kIYGzw:r#vf|)<;%';_%&ԇ ͑2kϠ}J^Do imm os;zhUir,sFLWٱ#o@ڳ|V!r_ͫ(3CІ&ăY4!Y9 '|qJ[(tơ$[2@>{]`#ʄ0:޽ Uʉ-*7gm~0!}$is%%j[^C;ot|M]A<_s*%PzF$9hUS:PG3 Bk7 #pG!gnjP̥QdkQO [ƄN<ك'ԩ^`eF`xxՋa׮ϵG)0~1$F~+}%OM4kgkhkhM]-9zk/bBG .ܛAYmw3lZdN[$ccd青USgVBv2-GV ysI,f^Gʶ8W7ti bߌP'*B4ea6nŀp"ywCUb2ܤ9zp(t#mDFӮeԣcX0+ꂼ"crJ"M,V b~gpaoL!I p!w1эcbJ~ R]PGbK5D}IގE*,ke?nrujrg|M}+eAXxhMFگvXo]/Y)߽Qu]')yN_$!|wS/>>2mlRhW1U nt*+nk}#/Hj$d #={K.J~èZ,'9/xq1,8!.\+:q&!ݻ%di C=0t-ùhwzmnFL!ERxM&UY$6zLe{c 셒0 Dq"yo6v% k;]cwGz#p`q<~\P]0'j#8>8,i'ġ6m'C2鶃 OObfͅraǹG[=ԯ]^ӿ T"4ZUxB)̥G[g۩Ű~@^y*]%h_-C9_!N5gid~D TY˙Ć!#l:9Akb7n~gQր }^(ͯA/̋|8PmNTD5yp䄚G-q_!=im}dѶ&_3^!eiy ggtꟵNtsbX&3&]z蒐AտؒL:҉ۈja̓LHgՋ'hl&+!miPȯv~xn-v W ouMEW# ǛyGi} 90;HQ]M:NBr+fcW}Y &x#} 0*9ୟH1i+ ]'Kq+C ݊`cyhẑt Ł1ƈ>Y'4ZEd# F tQaT sd\q!\}x;yò0v"OP:m-FCp:aύ'R =>\{#^7h7(b0ܣ؂r,/F'gδOӝ;`|62$tb]"ukl|ˠQ9Aڕ/o1_0$w6WR?1*m]q♷|;6(`;.ᙰU%[TĨ)pTySMw+}ʈы1n )-8~eIhc7ZN90ZR UZ"CZ:?/,]LGv!tsgͮ0$XL|)lb/!%>_6} Ȟ\TƄA)XAPYڢzY&zXH)ݐ0I3M^2(:&*՘ k2M&$+1B*v6TnpZf%WV~P;lt*|a90Ŋ;;Il2F2%EQpՁ_@0QZBH;IL|)p=m'@LLRXG)~? )ͷeZ1L>x+qpg]Ym)uF?B3Ge!*S[ciB.&֠a,ӭ(]̀~z . |=Hq6*k ,*7S;ߖn%pJEz42e*c3З Qb)XuS6 o^Q\enOo,h8w+M\k~U2Mlgy`X#bDPi?y^CN&h.XK-/$|h)= lyt>zvSg;_Z+G:fk,A/sxѽ:"*Y&2@EhkvF+_"7%[NIC={]Y.8aqw8́Oi/Ћ9cBNKϠ: p&oJҞ*U;J2C@dLC8x: HnS6qR+%Þ ^}D-X[!>͍4򁠏#r0Y5V%3{2؉Eѡ>|w/Pܦ%q5^>h~ %Sd W0؛ȀP&vrh2ql6\T+omj+oj%I`⽰zҢlK7g\v$o(F"~.3Pm`$W3du ki7G}צJ̧6]Yv$շ1_E<[BGUJw6$œ2^a텀7b rS\u߄n  cBN*Omb MoOrF x79?ҦGX=btʯzd.V5q}VIW7,b,yӚꧦm Q޶ -ÊP[kq\'7"&bQT/.Ր1TBdTҭԩglitdEa Zv"(LmKL4W|vr.l}bx+wFYb&Xz$-ɃxVn %˓H` ݿ0)" ^>vdz/ YNooff[%m:bsN<9X*\}'?}O*lg՛o?=>oL5mGO9qy/56aT;LAfV>M)_FxN`^[s$!ʫqdظl`8OqOʖY>]})g=58@TU۪Δ,5V.ۤލ>^Us&lp2V7o˜߯n(2_:ҾQTl?|׻u  r6:Q?sw7D1cϏP櫁U);z̸U~A'X/jCwr2Pq `@E1Lh}KSJW58ks.x:|[nWbwehfhl,v+< 1?ν5cnVm9/ҵ)n¼z`T:)o@Ȧ҇AB(' ]~^gsd`Sl^F~Շ@r.\K0<9\@%S_%hL^@-">@OK|c8䁳 =_}%xʼ\ݕ ]%ս8CC 2|F&"TMBMeM\o,A63 <0#ˠL425JhquG ==Ty6QPsT%U$T@r3y̌/ &ތFnTf_BVoX 2!qK s" .tPyIK'&˴CQ]eúrL7idHC`~FGQ3@v-TS 7{8X?$:ψ7H+ C1P*?~JЉ//f)8ST 5f7WxBexRqlBRV<矅̮s8JWaVsa:qQ"=-q4* gG4(80*Թ݉ 6U0ntD: ?@.̏eH#J2-b6@kUͿЉӌ ϖì}iV#mj*ƜI+*ǚ"AmRPP)ꭓ{$T,N#_1yQTѴrJIxT8;jK/u`B8YJMo/~wLr%iBH 6Q9ʶmTa , Ot-*%"hbf"w1M?ͽnM`AoLB;bDDzq[*wxĽDH S ,)ژ6pOH;Cuq wP^T*e.n2:p^t#iO72tKNFvLS/dXKdkxnkC8s@&b\ S*$uw 4SBoY0~nzV (~'<<wКTWJ22]A ӑ wTGhHSs/H'@|ÿ"]/3yW_sKIO 4e|&3 dKl1޿L_6lq75 oݣ}Eʊ=, |Wt"t׺3 9XIgͦ ffQͿa_/v6CƫS)gi)5&6}B=DZrQ>@f)I&5՗g굛1}'7R'" N!<,~p|K@#PM=5Bqv &^,'NUm }i} NbA'a⺿ @Te^ˊJy`}eU |F7!YlJ&;g/47+\xH㔥מO-2^,j@;K(gjchiqgl%?#2E~MĮ1hoGӍ͗^8R>hB 76t{x+Fl`V5I* NMh@|3YOn[B*&\<:O,B C=̓m; V[R,r܆7g<q@ճGJ0_LR$ow<os;?62Td+ۆ~O>l;MF 6EwkGzTyMsM1B}\oؑ#ztO(\_ QQ/j Õ|v/Xu3Eꈌ눿&b9ݝ`9zH8FZ!ÔL!%|WCϞb`YAbn~ $ zKpPB< ^* Ͻ(/ۿ Qelý2cJ]lf6fWB Ӥ2C XBflWʒϐUQk|}P QQ"&n$3O&)y$`1 D:P O7\1^E&?`9Wk1jɥ#*Ew\\j<&$;]W@y2(ht>%{p*hv;|4=Gms!a E2D\Q)V!+A@CɻbJ*jvnJO.LosgZX̥F^Y)Muy1F7A{э3+?j#ͥSΌ6hA0@ [0d-uC2(D2_{1n _dexB\Shho vX>vù 7);D B+~դXX@h [0̛)ߏ0]A~Dps+@&_]̓i\a;HQ>&UȠ"ږbI=TcM %FX?M19_"7(iW Hn`U+|@"$/R NJJnee{☴/l7Ef@}!#Rx6Qebi%l|mE W 8c]m֟3 "!D<<3ICY |O:+Ș'sGwp>(ścF#qza( U-9cCݵ^7er? 1W! 9&lՊ q!H*@Gە~$UoN, {<{$d  zd+0T b{xt֨qچ]O8 ċX N$ȷ b>m3cF=B;lcV4#(P czbMtucwք +Ya͌cHLuO-1Q.=oѡ&J-!?ܔpO/[F#ȯ8nL:ћL>IlPFcmYZ6tPyfXa:S2ׂ4wEixY`8 #uFڛA/% S­8^s;u0Ýqw3](.dGr=2|/+zw}.fvxvרXR_+(0:Ӈ^ N6; ؖ;x$^^9%|StE@E&Yƶb *(q+"_KtS>SV%^# +VcTQlǧԂA[@YVCuHwcnK{I枷Z] mN~ueWM ht p   Ay;|ձu6BZַOUzNS58Vc< 6H%홖ưa$jƟw42+;4Y[Й\ u=Or(N%NHϻu~jѐ%&c^ hH!9)u8u@\Ou T\ԥ@'Lf!r~,"vne g)Snj8jj!:ӏ kuhyv7j*pZT(~Ԏ݉ܤ@o sT1F ]yUSU#9Ȉ+O.:b@1[H ^f.~_<KȾZm|uW(=-H07j77(TAqx` l45GdoʨK&Io㊭19kgGh{+ZWH͛wJj&M'E (㱱](m?\{xR NMEkli BOVȉݿ z?2_VXYpV Sbgskt?';rIK@za芐Kr$m"˪k8δE-T$fi7Q3RPG=V,n̸Px C37Җ#zϕENТ k (K4D>pǮ8Mnm4-!)r A;A&-.S:@%3}#p*t7;}cOg <6T59XPDfDǝ¶2w,} ʐJ"JhN2lBFٳu7x^VG56J? aGD[J8%:!D)K *]ݻ-Dy YvLQ>.c<^d97*ۃ $Y$L(!RՋ(<#tAE{⁆3e KFIL`$]f&_R{b4S 2 Eˤ~Vi+uF^ǖaCWN8ի?;yQI9S[Q6Ci8[߼5m#VF:JDYäǕgxB=lG)G:QUFh2?K'QPʡmп*IW;Lѣޛ RIh}$n C,dV<# (W1C3͊>4?w :+he~'pBݾ:4k95$l/0LVlDp(Cw/3}`G;uKI>GĚ|nA"RޯDoN^g'.)nz3]VW֐4!Iwii$_ jYQlpKX9zS6i@`Z|Z9'y:嬥G bV,(a ( ^-[]vYѸ8/o ӕn`$A9{Zckه6 jR.;SO>ĹBIM))[{#YL}@T|C&iC $Y4- ! va)5!ӲZܭlMmom~sؒEq( ]A54u{ _'Y(+F7"áT/72sȳrUy}r fMߨu*$Pل9[o~sھ]MEҚYO^ML֤|gϭ0RYOj6T[1a\j}6f[jЗΰ)) =p, $V@l3k 䯺:BaYvKn 参x 1. ;>N0dyHϦ-_xW^*lA+`K7_Z!=ݷ[1bqR'tWY|Vg{# FhqξYL@^.AfZ|$|I`¿G%yEPHĚ.J5M\[xNF$"~LG3ϣ8-%Kuds|x.&A0Jcѱ鼚mGwAT*`)=UGزoSx 12tx" 9DH$825"S9yx8z{&ڸ{1/ݎB>LPewe' fE"+lbw=&{w/QU<6pn]HH󥘓Ebt۫}θ%eKmGLBlY.s1 CI.43;(y68=%&#LU[F1%E4Ζ +¯nʡ-wֳYlC7i6#T>`.z67a^zN?!W G^w@[ >/Ҋf4.1&~uU@B@k|r3cn1N9h ['UdI C6?5uñ".0)Mzj@)~c EPP)FↆcыԬ,DR@C}L6}?vͳ7뜗?ߏ*Zm:TGt4Dc'7pP+ J#@p@~>HL쥵cJb>s@X]-Z7i\Sa\~3~XڹjC60_Ҵvj4*$Dn5Gw䕱pf&!NJ\Fy.y^ YLBڧYJaSd+64 ɋ7^mv@(1v>j0c y*6!~S`\= l@tO [VYO4uka<:JRTyݖpMGiMXePOSǨ)Ԗ=b.S眇JC2.N6+~)V"o-YDcWk9D=vK5j|/vlz'L[ .5EfN!j2V\ĞaOwSZqYS+.(3N=Cs A# :p(xAVE- 05pӃQA&Md6bGS\~1)쮷ݝ[J>Zd0狣$qO阞,pg̈́%GS-,C +]`MŲ ́M~_=ڳ[E(ҨT Rw?Ũ<t7O17b0ŏTUUf\_cKٱ4 Ea<*$,2wWbWPT>DDakPbEsH7,6ަR}Y`1tPӓw)Ǫ=vJM@q Lw:6՘zWenrg,7*3XxYش:Zj˯Yg3AйufcxzKPۓD4{,Jђf%rTDP۬:RR.}O0FB`!P4U-^H_T]ds! ~ hмy.`2 /:$-,瑎v)-:b݀!6; k()F)cOj+3V[0ggC di~4AʼnB($0 E3Mi|Ozx'ºiśn 8[]^媻W͘C8HmzjL-5fxc,/ i َ<ǭ/w"s~cѠUr EZKI,yc7ċtHSHAyPzL؝.OrlH!Ӟl2cmϕAWoTkFr16COh0+UW˯EU>Z#@- 'l,G lƲ i3渐`k¶.&(8RxоAu?J \PyR(X.WCGEf+wxwkgV7Vxa,f瘖SO#d{\>xACP¾;tJ}5&8[~p.4dBhNN}a{@/GD=7S[oe~upٿL׋ A5* Tn|Lqr~m.~U2}暻s(Ci.פ8.l94xa.&~0 0#]^U O(jmK1VR-Я!3`q̕yzecsv 6y^ itK=ųBkӾ5az({gZ$á)]eSm: "!ퟑp?!w쯏[yň׭$6% _HT.iI.+}Pew͆+i3|?4N+ߵYs zR.Cc${ +䘉?Pw: غu))Sb5(7V'*,sߊ%n [[G)g+{ˏ s9SVF+ͭhIPGQY#AHy)sf*@.nVyϟde/V\;g%1g['y`:tO";_`~6<@vY ig.-22-Gf[ESyFx=GIrd%Q;}Oq/,;8)Zw<=]tA뫬l\$Q=epwBXϚ[Nؼ: CZ>Zym;CwHaDlisq>O,7OpC/j2YX4: ~-)ooʗ385FҝͦJc|rAŽSMxkCSB,s"N0cٺ;kZ8FdTd JŖY (qA'+%Vh"vq2wx^S ./UP/Svf{< ,2`P*rY`͋ѱ/Pn-ʆ>̮ |I\z.K-)B! UȈC.^sw竤x{Z-{<]ޙ"w(SMd?MP='S=iwXcŰE=|Zfb}!7ƿٜ/U!(`FڿqBJ)9q>o7 h&MR"v`0xZkKtpA! zoX@ԝ*\#y,X/Al8&e3&$ V?A SgZZ ˍm],c`'p,z\tw9`.nNI řk_Lԡm2rOrfJ7-}3yq]i_$\7yVK:~I?R׶&-*b6w_UYv;/Us< ҶA] T{y&`OjZjN?01c{/`ᦌ/v{bn&+{!mjۑ`b#(/*[d 1Şθ" yk-I@.iT\JQ[)[rR1!Y`p`?\cі'zFߝWĥs˅Da%IchҰvՒxP4c ONt7~[1VpEGטq/(X(T㙃/eOzw» 5YdA+kB֯?q:^$H$Uc^% ,?4M7(?e ;-N}0̘RķZ:W}0W9tQww{y4[s:99+roĴ~r݅q-">>ٍdF.0>n;ٔunݒyIl~׼ Zg (e[{!a^-@v7moV^ʒmYwe Odˤ? mT/λCաRJe:C2֟u;ynXS%']¤;EjQ v婰 y6HG%Q|Kc1*5\8m; ;Ip]?pSwtԅ3J=oc1a*$rД䦊zI&>XR ;I>v4 ~چ7 R%5m /|`t\ "@0xB(8mڔb2tsdHpXJزF0P(OUSHqwyR^`K=)4ܔg"Ljk,[2w^aV8JhH+Ti [e`/=H__.3MqYs+> 4& cm75.[zbς92]FTx0ax>p-k6Hf.&8}Mn QXWy u2D8?wAKV^`^Q*oC:NAs|Ђ]5{G:(|Rѯh371l,yK⼾],eK>I>o-y [dU϶bqfԲW ƞᏃ,2e_W{EΆT=hwgn/=kb&Ws\.7ClȥLl&3xV&`)3^7yw*z'fs\b%hh(`WնPtտG/簕DL>FՆ== 0`ʮ74w`,g׀6_`L t $!|ydK`p^x5xTtc.x^tzhJ) cs"n^@PVKZŔ"-GV5.$.1|B֧rMB cGV,$Cd[LNUDlp0P}GM5 ]g:_M7'N/ *'k@e%8$k2gü8fekI*z"E;U}k/xo0`Q٭YTzT{fr8a'e" V[S\]ʅ`f^A;X;]{/˖tT 'xNA Mw#?67((&0HYJ׳ȿlηaVy x^C` GTD^U 3dJ YKGA)Gbvͨ1aЃ2Rj-704Kw<>9,Z lwDP..{+U)k Pw2vl{- X\F~y||L?.J)U8fOH^Pc/ x釕 >ZS( |+u6` F58/|#i KH]|?U*HP읳*G:8wW׮`$<k=8DbGqGf|xI:n;X!dkv)A&@.&q"[³#gcM*= |m\m=ZLZiF[.DA6wm$aylvR}bSg7u)meS1s4_󆛳"ez +mjxZ܅%TfKc1/|STdرT/HVq̟+f=pql[{h7_{h PlX-5\?L!+)Gq>p^ DttfNvv: mF釉Ò /Sۂ$3Z[OΣtun_ .s(q'm 3ivU3 c2&-12 ZG;{=~%(:xYN?qqb9@<?:ҹ!2{"rxfY-KY5ȼջbZAԈ:x-8a_Y.S~6GĻuR4bTqtd(ҹ%,ɧy2:FϹT4 8]*Jg~lc>O~M̽KDé{^8;UZoq 鷌ޭDؕ׷xˊ_{@VQlݔړ{D9- Μ%_w2;aK2G{rXE]at˸>փ !uU *sw\G>i߭WHYU#\j0);eߩ:IH9 \ݽnj%Vc~U=S" #A5WnWB۰ߘ(Ms_f`{S%+c~l5wkJӗ4gy"SRu <{F3<.dz.r>NM5&bؘd`T)K'1sU^֣(E ?{W6K%ME9ߞ'ia'΄&EJ(Moi4nB6dF|lJdtƿhܕ@y뜠i{jB.% q B lßo-hP==9Z[[:OW4Q?1v& /uG> F ӱVKԒNx|w RiQ}^.(ѯ/"zA< ].uz\`[S241Y yK,YD1 sh `S0 57x\a7 a0ee<ʍ;yRe*Kn vu3^! { x`ذcPƠÍ9@7+6^fP $cx@-aZg4]=HCP~Oy$Iš 'FY * !%" ġܵf((=gZ&Y(..N3%AIo`8ujzPO^oaɍ~wEvl *kƾ2zdM\懲!bK 6GGq{փM.j򌜤 {=1EY^ŏAVic,ZEaKӼ$EW{Fn]@g~U3[? T}khiQВZƼd^=,1A Iq IKQK A:= TH +G;~5_=H´59ᯢk*5]o1RC VnGr(4ނd}4'-XXI5c=3:VMw6yRP3<`.&ypcCiW;ix19iMnk*G&-<5>cGaᗮ&#PC <¾JpڶZ=x4-PS:m߾|4nTSC3$l:'-+LB v/\o)+b]6O_G8^n(7m|x)m;R!d),g\erTznyV*s J~L2*jyw)ޙ_P{ќ4v\d׆y%r sw^6Rl ¤GJHq p3d/p~yXg/JC"bZɒ8]zO5 hRlW͇O*>U1KZ╗ "ek-^l /fLtX?p\k@@ ZJmu9Zæ!J9zטp$ߚ7zW'4L%mQOld?~[cA1h cxÜzCq{OdO%Fq5rP7(\A3K9wn(4T2cOY."l%ɺ_QMWFK_J;2c&v_] (-4dJLX:~01ys`vgtQ^닥]$Me I0UBm;gCw'KΚ$;- GvOx9MMȁ f; $Q-xj>:^V2D%L A$1nBv ^ ǻUĈlO AA\| Qs̘F 8;Ƣ \\H\ePSc1L'xj7Gc\AJ&.]R m$UV]|%I4oA~xI⿿y**4=>cbB.˲o,?g&IʆpEO:^:yfw%H渰H;'mi(g*^ NˇM#y pS2'IG#@rВ[$C40(T(+ufm7CkAt|%t𻨈+1*:\9f1nڵ/wHﭘe@ ^LdCZmPLG\(xmSU.DY k{Lu%1MOh2 7Gs/R @FN-`S^d=D~u[2o66K9Xe@&od]|W,;#!g FALkc<%=X}Q7fFz 1Y}c:u~գRX_uNgTߝj ׏E)i'[ꎐp?zK7@wCbg)Ψ  ono#(NV|Ћ4Z꼯6m |9~f듦QmlChWQuu1]nPU7I]Z|kdQLxAgE:, ,g@>E7ٛ@0@r:3 lh_P8/\f;Ln%  .68:|g/>/&;@ eFV2/S=| U|y.ki糬[s]lK@~.aZ4V0<"Melsj nG ͸$T)s v,*7(A;:uLۘlpU#OUc<[[Q8Wa=$_YVnء[70 /!B!_, Q;L_ KJJsT8 }qCAW#w7vZy4U>H @T& ޖ"rUM4̂hFwAnѼrn\D xHB749?OEvR qRfp'9}kX2@d[CM+{ ݰ/m74(옖2 Mq%8US@̑c /3T]А# K5sSc1~ EvjkjiAp~5(CZ^nn[@鞲6.|)N[vO|M{̯%G 7]KE^23h0_:%VlU7%~rMa;Q̒/XEd+l4H5`IŸ2¡"XcbIpXƒ Bj?zOlؔP .C(bu ~w?tt$U*iܱ'aC;:M|Roa~Tn4^:$H?U4+-m =Sİ%:FKvW$eZe_ёL"G_t+6OwQ]<=آhP@F&gC_+8]!TKm |]^2eԓx:lb8~J7s&9|]0g "F1NJ.\-'δ7j^5<.FV>n>v Q;l7'tP"{O.t_H1Oj4/E[MA{ƂP2Ro݆0mst,,KR.K>eT]H@D,$(}N"q)|~`1-lCiB8p(X7Bn%Ӧq$&4vFJ9yk=EqBZqi CF9=8q+w ;΂ޟ9țLE2mj$j'5Nm әjjsf_ ,KbЊ'H2[BHw}SO kN^`U=#';}2ζ<^ n4J~ ~fT;2(9rz{6!N샟H %Ƥ dC{4Wg9?jjr1zvg3t|OO|9BR B8J1jy üB,Eđ P(c2`Shl5囅8^UNw݅+;,{tlj;Y]]Ӡ[a!?\$%K8T_(=u̱y.?ٟPAvfVCm#S$ +Yn<¸l5_#/`b6ډxN`gYq)^ew-Dwe\AG@Q$lLy 7h1 }6;8{{7 !![;j!q- |oݦGRx:"qp#6Ta Ywۭ\?˵Kh%ZWcXnJ-!̦gӎ{ HTbhKzZ}$=5;:+|U ,b]twWM MΥ2SMj1G@!ڷq.$m%e"6錔p<"*6o_#K{[Lӕլzp@p@;]I]&%U*np ngh0-mRxiat %b&MRUCpf:U Fy_אgX\iqP&Z.ɢov4|74mC ߳cBLL~& {%}j9n^fRn[j#IT އmdj)wa˞RE<u™n.Ǫ#vw+XC#Ua ݁՚Psּg$qtiqkn)9AJOvM0fclU6ct_ joUR+Y/t&1SەԖ,/r2 oEƋmQ̄\A"0dюT1[rX7"&xM g`|m!LsZDe-mI|)IWL3h2N)׈vo Fa]7ףē, Lg{E (2AG}DM6U H> i<н0VTiB"E$$"$VҔT\yx^{jD J-Si; P}.HRb~bu7+Z _i:4鿟2?wQ1n(EO{qmӂ*v`"nd~m&}=e=dpanJ:6hV[a%LwڱX ~"zH} GkVtyC{Gt2RC>,2Q3QIsHΌ$5ylM4T-GJOF3.=zM"|[UMw_qb[@g]ՋWj1Dvѐhh?HPi`*Ϣ@'b`Y6 dM. Oi }=\Mor6ΆZBKwyۺ=1mgKZ.>ԌcDrH2G_wix.-* d.ɽ=N[J֯1tb,&U&)|' VDkD|^5`xHh,NYUEÍZGjH:esh@S 9D;6wLAv~H s`V@",λ/-[&9_grvW)ւB% gٝ8%Ib+Jeݸ΀Ml^5D%ڹ2~_yh<ȸ$ @܂rzqAUˆ U5wDzW 吾Y_+l\(ot>re-yUnP:ݧ .9ez!oZE=+aH[ j b7@D'? h98׊<`y-)-^z<"pZQwm7UId[?0m.G̫ݩվKt`hm'\?`8==BEoU!iL"MDTYW!|<66<IhC?&yA~H [Ό6,1yQ5(w9 >*LiT!`S>6Y! ݳl{TGTK6:O*8ee`|K.})°G@%aILXvBPMO^6VaIoMC*qzUN.WߨLF;R%֭g+ MP ߘ昈5ނEFr/)K$c-_bIOpJܹ];\t?^ЕRl@n!kd9 W<փ:lUg5j 1@^W.iwhy+1q#Ȱ0 $lf<*I*gxH̆:H.>vN| X1mtUu-?+WCZ観}okیS܇2svR,Rqh@W dY[9MĺpE$0[EUkX-ʞm*XX~t|4>4bM \LѢ6 C:G43_"I#I=i phl &!b*zC٠o>asR9/8;Z>'hSz{αA_Y36^zy70ꜳɗќx0啅 fcP:F$ _;^44UWÑ [7`w0D21!&řfbXm%!~A q eduj7FXgDC` \ZbzJ1 M01g4. tt`:r!Id|kxFЃ浮y5UB̑ϝ)΁臰˕f*ϟ_Nj27SjŴB5ԇ_ΖPǯ3 z"RzL~z[I6 1<5IrL%?B9bS;qw#Sk #2Se-#uyt36kk UD!@5s“"BNxYMLc.pi GL XOK}W: i\@k|,x\~/i]z,k;u.86=+;RBoK;y l`2J~N>G"@~:T"=q T{4Y\DoRDM5"gl\>th(Ie67zF^=-\9HD3~1?-ٷTsƲIu90"XPXVAF?yA6rHeopyEIե QWP "l8U{dH'b~ <b!%I0'mmw5+imA\+R|}?XXtj\ ۀI6'7Vu!4<Ñߧ,?ƞLb}Q[lƀ+c$~CR=*;pQ,1-ymRS3ݵ$-pi&hd-v}MkEN\}c|@J 6Igz vY{#)#Q|1sDhΕPZ~ kpxS/hD;9hg>Ix-d-<0Km\n=x&pBGqUe8%Pw}ytjrTztr)dqH_C}X%hozs's/G(S@@0v@ ت]J|~0I'l~OqdZ?mc8n=!!:IDkVR6\V~PžC(IovB\Z(Z,̛zB\~/k>_jg}̌)"qj3.ϒQ6_ӵv@Yf{P QÜ7q(hE&: ׋ A{e\#L5ˀdz!b_@}KwY= q^gMD E,*!Mv)*FB Ywb,?T}2Xl?zpuNQ.s3jwKkFC1OҼ4BE,4 # ic+ ) Kp2ٱWYeԹmqzxn7b h3}[據"lYBv㯙r7Ʈ%q$aVo9u2R'c%`UhVX,^m\*w ea<HtJ|VspD^ kg*:gW YMjz^CnQlT&ӌR"q|6b QVaN2F ID-X>^[~:2wvqfm%Jbh60@u%M24.*liN`Cjx>|+W84ߡ )hbENgoTp;.]zy[B|(ɶhE~ 2\eDWZnYArLh5M# (/r mĚU5׎? A2-};Z KӐPLjF3"GMsw;/vt0I)AVFu.?sB\jٷ<ԧʶl/{PY@#֝Fam+D4ϘI(oO%!αC XMDGVg _IhF2|c0yKos'?g1~Nm\?Y2irw?FvKcr5ǔYp zڪ=a/v60uO,3[8DǡɅ`'MV94CiXSth6[6,{!VcUH\~A/FK0 )3wOuwEZ =agkg}hXG5w>=-'xE^P_VIxæOQKDI[a)tn| O+A4c@W2>&5uqf!d8'9`m~ThXAZ BW^4^ģHU3CCҺ’JC^jyhׁٜSBj[bJ,(j"p{tPaF+%0xRo:kO(I@&bab:f~̐=.뤬.5*<Jv!`LVM!ټ5ю6ցjYlI8+5G41]z`|i+$rk<ŷ0gVRBM!|Πh=̂e|DG_Qu"jLBi>Z%xJ֮vڸݾ6S+[cR 'm^>%S(y v L׳V4T֬6 25ciOVd=+7L%Rg͉ڣ^c\A ޗ"W22yalL_3NkV`G}&ƮPbo7afr_zPDbUFPC4>H%seйXMV-ʲJht9yOxh#SēM8MUFFc/-=ݼJx/(dυcSlɣYZBݏ~x΃wRjsQ?#y,P]Uzi1V.;Ms8 x)6oUXc̖(J}zm!=R% LLɅ/~rS[qBwoP*1*Jby#{=k8wDxI-<М" ֺGf[rCz_pD,Z4 ӏũtY܍|i;h it ^vDt[?&n/脝钄<"YqCPUZ4A)Y7M썦[#jHC˜;̧5Jt=LqGEw10DsjŦRɉm5RKtdZqP 8oy/z[Ub{(F`|&µʒ')j㟔џߖ`ɢ YzT@G;^sB={ z͗i?&/;KPP@2m(q be0eHA^Pi(TјWLz{Sr '[e yaݠbKz&} +rFdKZ'ᩚԻ7^ [2JT`P7ѝ/=-{OvII ]LjX6Δ\f ef D1ѣ>zñ(7c%#|2mҬVxL \v5{y*u"kݗ쥹MlU\C݌&bϟy9- ;OiljU`㗁 %v])n\(-ء&AgvπѪz|ueJg-x^.L [|un (~^ :p:F-TVN&烠WbNzhxjWġ>jz?>8@)ĸٯL^< ص9|u9vm% &ґN45iiSK}t)[&q:&[mO0=2iq|D_G |W5CH:q& ͷAƾQA$kv|nqP#?͐M\t~ZtOVT&5hXvYš*wei@V FH|S^HBT ML)(1˨ mm),2*X.Iu??=>_ ?sA'A҈y;BPӠ Wgͭ}%UwZGRÆ "c0>MJNJkt%B{( SnjF1n&v ;@ W"v'  ?(>_pYG`˪㡃_"znBl[:b抾+M#oS;HV<ؑ_AL!8fh0R4B7ނjZmQLj--K9Qې3)?&pB n1ylvDWzGbd쪂WF`Ha3.YV"wLr,Wsr|g\Ak>UJh]w:7tW j^U`O}{\)jVj=>@Z4y'c2܃o$c_o'-D/R˰χժVuв417J[&J>&TxJg~R%>62h̤w[ >ڜuOzM|fU z:=˕+He!B1ܴ i@$>9&ıuZeXmz, {b/'z}Tb.S\OxՅ ҀC`j%;Arۓt˗y>/mK}=6չԮ˔ j;.슞mq1qqDGo;pZyuz7naΛBY5Yxwr - P[T(}SiMRT__A|6^MJQ:my;y5~&(3L"JCu!BIv$'SiQO`bxPP{6ty}=7dsz{͐ޟ[r )UGb10]o5ǤjIچTAl8(T/sBd(o}Q d\=^:4FCH!+7WtTZ/ɅUADܰ!'D`΃u).^Yd9yu B ^כhTnXI"u )]*L)XJ}!j:4#ZR$}ȳƖlP

-/aO4=v|6'üAF:)-1_eܸ0TOl21y'U:Lپ9*ɷ0Hc>qRqn|cuVp'  A\OAn~gצ%`^2h3?s-&´5?z(S=re)s3PDLԊ겠mZD4Ñ">]CedSA ]]( }'~Øa9Z`8D9 xaz<IQ~mg1h VbϫƁGE7Y䆇뗿omJjsDe.{ >c)Wkؖp;*W hk '~C;}abaHD ^i un|d͂B|(_0<y$b|rGsy_9wްm[ܽ#a5}i`gOOJu{&fjjlA *mQwVX0lW,ӽ;:5`qц-&{--_1"SHC>1Xx eXR9O'V_VwΖ݄;JИY,J.=9(o$`3r+{5D|ykKVf%{\!^ Mܘ F,1P㑤D E`J[""ckݪJ ]5 vlH'ntNxu$%-۱e@'(K,}⭑cE dWzUt-X .S5NSըBL<vQe =>ۅ Y mSܐE>RdLMQ,'zB GTMAƝ\h")zȑ%م ߲FУaP.}9!'1O#'2i!BhkAxHċ-*/KMwb2ԵB8pCLV]BkRw7-8478Š} 'Y+|uoY` ]dp4}&edD|5eOWKBud̷cE5Ltk$\S-{JgJy8=h]h}lf}f5_Xo.X-}mj;ԖVT5ު^WZn=,z\6U_ xH<bQ+NA S'Y-lVɐ|7G\Z?5Qn4Ŏ"[!8_&ji;z1ʚ8vL&c1[蕖Ć<νۧ0ngGpl ?(.l^\:/G h01l#yBzY蒯<-#7 񬑐iZs0&\ed.PAUD;f~Se7qcɑЕ˟3r^ѩV2ڙGmg ކm>‵Q8%9D=D0 ¿?8I|u2Bd cy9%na8رqov͒5RmWtu,Wn ķdQcnq6%?"ѷ_9/|1hlVj#8V]2\pJ4pݶeb*-xbGpxSumǏ3;a95J/߭Hk;bޝ{޷#&s }]jզSd-- |HvDPwЋc䷦l^#6XB0L^ _3NN6Q4v.Gv6h5%K?s UwgKcc N~dMc)|7}u/D9T+p#CZr& !n&'ji>Tcgś T41xW[.$:pz ۞͏ PHRnـ)Ms8?sUNZ'GNEz$ELRL:C@R$`ohvyb 2SWTUT`ق;k \#- Im™`EƚY*WP0ir1li`z<brZh&qb_;s-t+(LKk_p>kIZD\l=4QER Y<+fpE!yu|jMJ!:-J/GK_jE ^I&loE)e;;2hN4l葽S'n |udzy" '\Q(UB"gkCʾ:Sl9Je6޸%Ms pl탠1,>BRdG`^m~t*:G|Y\nvr氙eY~ӣhbɺf7^*{UΎ0UqHe u]1[JN'Iz 5]U!R?`2)>Tu!AðK[}u{Um`Xe%IL%_H O8h_ŵnoǞS$zZWdo2+x`2b}u h unzHnϗv*?U૙[ [ |Yn'Zr Gu 8t: '?yBeI Ҩ$cwNAAA^%e D|g͋ pW鿾O8ŷ>Q~u}Ynfb!:LtM1C&g2PB@䜔,DqT86n?USZgE=4u ܜ}X7t$wӺpڱ+.Ʉ1Zgq>jYb{|('ٕ( F_A-wҺ3m jF_R't#9Ćb3û At>7kȣ^cJpvx箿6DH"|<0X_$V۾i7k.3AQ/Wr]*9ӏP R@d墤ߧ pȺ3J,3dj{qݹa @r}pK"ra641Kۓ_r>űaϺk&i?Lo~+#Gl. 6Q.`'.km41FwƽWa&8eBcfZ?%ˣUvYI wZ!Od$ {.4ұJ$?{ sIB/tR`TC_* ~Y[P<#jڃ@dLWFG瑩O%zB_hb 'pDʺm\E~{XybL2;N@e0bW nK2WnOE? e Vz0(eM8j!QbE*#ˑHg#XX;a t OĭTSxV}<(2t>qKjMjɣ8Q0Z'K}Vh@7_deݑ(M򖄟&%?li߹G 7vkg.z(PjK' #K(XcQ]LNExGN"ۋ]+~k2]eIxd2;* ů\8 C)aDqDˊ2sJJ{YA=R//E"+6o!@zD*6:Ju(977e@BΫ+-dL[w.9'5࿧ƃ#$ˋEu0%zC}x3QBw*:IiSe`Tr9A熒Em Ȋw/H2RffWT575/t{h{I" jk`* !юe.#"\ Mk^0.Yys%288*(<8K800zۻkvagKO6oxTkO <8bdzEpcΆatQ2PorX*v7&iKѬ*+Uxlj¼Jtx+[IO2+;?V|=R-c) K0j;H_ujjbXlHBF%.7ok<g%z,nZIod1gbN!56 ?{xYmVQ.e604!gȒI$cū׬2>/Oj kM. [۫?:C| EH}{-6 O \p,W.U)0g{=yQR^(5˻{f*u ҝDQ98Sԧo%W}r*XiJ^,rt=#:8,&D81bo[q_PR;yw\R&XDžs>CF6.$;.ͼo]YmPwKf'+}Ҙth-gDPZ4hOEe6Y=3I}ujJѲ.% Xզ]U)f~K6T|ƃЂ#h*C8i`8#d(MYҮ` .ZXh\4caǻT}ͣXɂ\H0QO@ 1U ㋼ }Mj8Bp2dUv<qFu%ٹf1#rŮEc+D]nX(ߒ4+6`"" [>N zcjL[qJ:9&b7 k&vt ו5ލ:1Cdi[jmQ 陬_])T{zy 39㯞ITd§Tf "@pC;kV°[+;+H!dj-o 5/qŋKu~>Dkx&}ߓT!(E3 &$JڬJflNYd}D=b,Tx͒CJ7_/_hC0:p3iڏ\3,q(s+D9r4WJYyR. ([20e/"N|M}0y #FB(#mɐQ/ƷTp @R&8ʴp+ձ @]r~_fjT֦C1tȗ-Z #ഃ3jlEZ$ s |.3Nx6e L q z S׻eΧÝ(|q)X1s+%V=݅*`^]^.6%RыC Jfk9bwAR[~/i:u;CĘh BIqDvSfU/X"*! Vcϒwφ+"ޭ݅!cxdm8jWZ"ʉJ*RVw&Ԕ^{ K|1~+ j!J35֮[V C^R V.e-@T Pc]4m _Un1> ;_DV Gj12Ҥh'\$/-q7MՄŮ=/D|VxB)vC&v/M`԰Bq$U*s\SO4@oͤ]rG 1?.9e^gQO9};`+\_Ss#q)(%3b)ɸL>z"lPd%kql$wb*".vTHfSx xCΉ}mWp'\c]7<{9i+&Ubx3OF=Uݺ@-uM/mh G/'My Ct)iZgkOf- C97 b~t/)Rm )4?T) pSHE-uWoŢ:Jl֢"",X>ĭTQsg *p%': ڦqz e²3e0GɺS,K\_B!Iw n{&6mZ:R{kH- ,രXxnY2'Z& @QS#/AY_R,P+UMzaLl/!+j<ԨHB(##'߾G̶4 9n VST5B`62)F6<_El#o71ʣkm$؂9wP:S ;ח=5r{K:&,eBB&5uo-ު6PbM=L*.R {ɗ0"^$L1N0ü퓶$X! !uk/l2OV" 2O3{"wQξ6cTbgchh8os )T! \A#Z5|Pb@C ,:X6!b1ƒ, tєלuP` 5ej[ŭyo}֊q%ҧSG.9t  @g'\!U ?5F_d[j?_0! $O!1 l3&ْhR6lHcP2h2{\(w<+^ P2i 8#] o; [;ɫ@cDBvgYP_y)tuC^X°y-})\@9PZ|&8[47wl,rw>i>5q2%B?0*t'0蓃fO"r}]Mmte8'6]7qAA)i$?8!]lyGj]CKOi}v6%4+h$C,G*D%-mflw99-|(ڱ2ű wD(>ԟͬ7J.,mCghc:%Rg:W]OךAy K*݃wsK_ ߔ+K3YH ϭ*z;_mOI ܭqR6tr@yi:$e~JY($*eC%mת5k= 3YG@%ئ)HQSq_ymtr??Yj:P.k>^8I[kB¢\ݰDu@ E+.Z$xk`'兗FF8%$zL6XN@E&/zYMLhPY8p{I/`N(#Dԣ=E?{! Cs{2N S%qҿ&e݋~|Yd ͫ#]՞W,.]YJj͐6n[pk)|)7Qp/ͳSu ;.L%3KxGȨ֗TLh]l;Hj>u% †$SZzZSlijP]JX%H_269i3KSZegȟ3`)k ܙtvS?xSmmJBrRf/Gi]@mjn?65p:2c㖉r~C4l_m4N"$Bf,>ۥĭ8/*ܦ>~KpU;ߘ3R1! JnR!ϋ}ps V\EJ5%\#9 m~6/7<ɣCȽ -!8 ,Sq7*G[Lj 5?4f=NsƗLdd0pWUXFZ*gˏM+߽wAن!9??KsJs.Gcc7 B)P6kaD[sI|qG7 "sf7*20+0Ɛ;ċr$b (E͟@S(GM1G"/g! #2]1'҄@d]S4ߘKI6[\E'o!y*7qϬRyC_D&( Y~'Pb ;#(ƱPݘ+ JH=Flq%r/ R_nAOkJnDErSL˞ aķ tJG:jv(蟾)=wA\EjHŬjgzAuvS(c8ЧL"P1gz)p pykX{IId:^6s8mKuv,U(-.>(ν}!/`xxڲr~+{PqLέ1{V1ҿMg - :ّ^te."fkJJ0m9ם+H) zpT*4![NC.5^.-E[ra@xt0. jp.i4֨\:4T:yZ:fc`OrW[yS׍ |^9Nen#'EfT$lL2ŝ$|>zxlLtSE7ЮrbHUJGF`{ wƀK^i0O8 /7M|I\G,Q޵-J15LЇZc/"OݳVYy0S$0hDmJ$Upv d;Uzį<.ʒéHtI[s߾W\*sUrҫ`ªu^0f4 jQ}LYN{^'G`pk# \@1X³=ꈋcMnLՖ~`ɒ餴 6oM j3uh/XaE{}F­_R67mb0vo&. MZ~Qu>rB($ MĔDD9/`7᪚4? wJUl[A 66 >$N=k'EN[`Phbt Ҥ |ۤ9xN6,|]]|f*c, _2G\IFg\ )ȶ4cbN@q ]#{CPMZ;/[*J"wI (Ѻ RͿyIh2 ֡EG> N-4NG7]6PHBY%_ەԽK< ]7~㱊+AaeE)4C4H)aѐ71󽔞\e= n?!'8'G:8] 8w :d׳Nq GqOK|Q-NmGq"2ipE\2qY?)խIp+Tf- mOUn`Y-DR0 E[EO:8g%0普:Cw%4'(j5g-2mVJ6 u€(dzE1xv^,&G%k\gK4(N4ȃ?7:̚?V8`oneNhb3hupE4\Z$0ʸ a,IW+ճU~#ҁ\B![2 nz>M#9 5g\RI p`-JN@HcwON/V6N(&4X%yC 1rk+wqe\(ͱ8̦#Œ|FW9V7&ri+ܐ\?\yEۮ_΁;h5cL!n;"eX}Ăr1a&`͏"%Q 's6D>!@1p@CXbvLm·(*vP5|K.6FGMޛ*@er> bn;GgH̗X'ԝf wEKֹzIB^+5ff4ZB6YGaoh5D\C2ѐ_F6b;B*vmPZBPFiF!ieM`XDu^-aɡm<zcw:vNV-Px Xļ6֫J2Tgl HL9)"ܐlW"9! -S7Blv*b$Ɂő_67TCЊn۞0=>46ɮH}x7ImwYX:皈4c lg4A!*|1raQqϏ-KVp $3IԒg% b=w_~&˪b$Ҭ6Gפ+³t<.KO#ވ ,Dc(TKeSM +AD7" U&a,Hxsۍrw'y^FEIauF(D~"GT5ikf3>[B/K5Zu AKm%>s>E>alϬl4c\ȂjFeC]?4]Z@(;A)%WDouy<;[V9:ߛU<z)HBK%㢷{'nNKǑ!諾G=&62Gp`X6aT4Bl/@x{sfOit"=ߎUݙ$ |Nt~q jƮ72oz\lG.D^+BUf*˜q)'ç^nm4z'.Dkմbe{qwZq ЍJ{Q^v #~f2gq͋!ӷ*-c)a 5|.3YkQ T,7 ^l }qo>J84,n,uufRShbL2rQpH{LGGS, 9FD.*}/°ǃ2\k5xc%k_eݐA1x8A`LTb@*Cf٠S"Jwvۗ[4%q$Uubct /MHR"H5_Sg];$5LOmJŮ,ג;`'>anVadku3^(WMQZpbղcy.2xeN8ȐB8yk X :l.4J7qt!a%I^o{B:2Z#ܼ娳{Q$ĻALwE hORL yʕ`e,l.GP!בOh3R6٘R䟮"^Dm`2;_syمROiΜ,֙̋hP 7Pz^˚ڪy#5GiB67rNŶ[=u0܆(`l1g؇Ҡu ;Pt)G<0zA@nKomhH櫃t~/׊`+m׈ A- c<囑r0O `n`'5pjJBp%}@l=wf(c=c]˫7O-c{O6ZptL Q*5녆uJdksrOxɃj*J!̴ JHAhQYJQm$ qҠ܄ǰ<-&c|/2VYkBȫ5q@Xd 6l />i~o?1# 1kAz =޾5 4iBtڦ <JX$ |)Mi>ENٓ! YstB~CC8=dETK4N=5]BWW^-be|5^5Ë* 'I_tkJM "tbP4Sn wtPӄ6P}e1i*za+AJlv(nhTۜ˨6 Cu 4c pO33특8%5c^5e-F=?mZ?W }yDŽġ\g?P62RP¨0{ (Km J{/jh){3v.[.WJ=t'Df*ZBN!>]ywah7+z} n__}ő%ߚ:չ~/Q-ƏF/?V.N>0òDxsPIJ6=VK_ R nQ@X".f Wɦ1DtxslA:T X<6'+<5[;t-Xs,5 kS'ѿHD7SEm0كղc{:ת$}@nq,sE_.Nޯ"rhEQ,S{u*#߸pL5z89[=2@hPuFȻ`|h+![md9L(V ]1FѤKGɟF2:DPf:SLZe0(OWTD]WU(j5N`Ku'ȼ1 ,mCnxԅ Yo: XlЗhG7OXYOxnjb;OOzĤ&ĝLge&ɐL?6Ͱcz]ee\K9 P 7Yk(lhda 똖BKH&V.nn!bĤ߫ägwQ_ǁj WDukk3km(ŒSݤ3b4\=Oi Zm”# 턛~mzy;^oøFҋZ'qr]DF.L#WPԥJAx$dsfY-$Smh!E*{iP!;n'#x~`n| ܥxIx@ /XPw砜\ ]+2u(lx5&& G2ͺ]LoeYb}0N b)A:6eLPT*w|!PoNFg֑-^Ļvn gB?mи \"ncnwzАfl?+T[͢^/aq`B'UWC㟔KP&`uO"cpxܖhMOwP1!Sv$%+Vf Kwm$:n^.4eAG%%߽z' ]~Xb7ErrĮjla0؄Uq_ !X@H6ÌP0q׮:Li!ҫ$gMurTB=ljTcK:@qݜt$6id|oANM' .ɻ՗3(f9ZM.Y[ʆy)h>'?5tQqYŦlUZ(=UXFe*n*tpw3օ)EfTdDkUqAk\>Hҧ8EHU  ^F\2j']Fw$LaRo&0M=6!C3}M-huw'ᡝ! ޱW/ 45gJ4"uGnFԑ0r/kf:͊(Ҭg hHqI|Vm5]Q3wG k-,@y K}S4ʑ0y#oL4Q,B+l'%AOtٵsM2(i.lď; 0S *>}k+`Vv{ohF l؟F.%Fv& :vY*N3* [h 3\[6$\sCd?[ =ȳƲ}*;+AcUH`7l5+}yr9N!V`Ž!k c)ɊkFCEGKE]uĥP0x{ ui JR*4[2ugro.kFc^ ^ۺEk`t݋MBPG/ dѹ| };w5^6EPrԼL P_BT|$Q)qՄ &%_Iē@YGg};*ˮLu6ѱ<<;L c̸rthuQULMs|F>sԈ$289q&.VR(e9|hϛH-Fu$;9Q[SР3 `Ñq_Zwx ub+ 2i2kJb3hI.md/5Pl\D$ Skß zZq[%XX/'ۙrQ6r۴)|#ml i'Z a(7EKV8 `+|WpĂD:.@ֲ*dm$M`1d,ְ3rv-D^gұ)_'@x5h;M#'07_;w֨PŀWAJbC'2x^2)/zffdNf;O=a#?H:T6ʦFO;wܼ CoHN{U\E6:V:i2$KD.{}]Q(k|6njn36;F]IIbFPS}cC-+iT[ ^p K^(_ G^U g鿦.wɛ"'e<đw5|Cw7!\@\Q2G)bBfpz[KРVuS9E8) зi}L gRΎ VqBៃ`CŜXP築J0cp:z,H9۠!2i-tөIMȄˌVaݡ^H3&cc$Dasaɮl߳ϛ)~0U~(>4 GU/#[?%p7O»$%=e) W: @&PU`~*\CL㫗` PӛQW.PZ]چ' C6 nh=fi6ح:y i_W$b݉֎'m ^&o=)L=Kdl@w#B,eozTEL5IisM>մyn"\O.$E'M's.Vfobi=DC_NaϰezպQ؉6#<$PlwC(ʞd㉒n|fA;gTz)wF<_> 3Z4L\ڠLФ $sjY{@VG ÒPFoM\AF vT}E4 OН5d;1UC"=/׀k@ {A;"U{osaQ`w@ya7w8ְlfQ+w4au**o̅+X/n_ctm(P?<kk(aQ|wd\ܹ}\j7mTFrIeGdNjyFB\%.mvY9qLI#> 4(G|uxbA|_\akyVOc^N%Bk~FCC"Y}b /JEv!DSIa&5ã{ɥ5"A~ՅB!xadc9m&qU|j;[Y`V!unCQqpfBЈxaPd47R6YH֩1Zwwks O}6{߉ YwA%f Tq|0UǕ$?a_elz䑯{rU %ϸҙCG\#'w]/|jSWHB>[e-rn]*#{iSRpj{a*8F]I+&BU"/_3Y`_S&~ӒA}%-l1~/YQCsmkdB*wM } Fd : #N~-دX`~Krp^ҭnKn 5Uܜfv6xEJ7INg@x/ɨ*wS2uhf3HJ qEA#F|8fa{cD"fDxI G6sf9( Q.&B%7P8't I9:ҟyR0Jau8$="D 4,D- =k,=l\ F<Zh#SF/ ĽvO70FꅺhVY#Z7eY[q-şڸSp#@ 䗣,/Caw?),X\1U;\8 7'm['FO}c rR\g,r !!<4&&n4U}GTi-Ϫ={StsEXyхžiu^-,\8&]w9s6HᓪQo` jU4*QpF Up2Su;:@2H[:&VgkM`^tKpo< CB,5Z{4:eP lY̸;JE:2}p8pw"n>җRn (v`̈ib8J LZX\W.$jZ{ =h$qm1A u6!M~uҵS5HjMu铉ZQ!-P딋:8rxܜ" 2]DL,--j6XDbJ[ZNUQ  { [7Mɶ*;MnteFZ=^VT+$_XQf|(㙯 8g(+n3B#V2k 6"2SOGKU IĮD@Fľek VVRB MP#Ŀt0qN#`KvEOomGIywG "so_Rv[ Ы2 *.^ bߏV6{$N _ewʹ"M„6Sլ6Dg'yGxH{& 1׈;.(6V`[˫=+ =&Y)5l"hl~Egkx<1*S]f= G&{'#7Ssl(0Ju%\GtQFDPWq [@‡D1ᄎ+VzV9S DOH xM u#$j͚t *y'{Ӝ$wбL^yA^&BL" q,FjI=s;xCHη;a`#kl&oX}gh uff7 7{^Q8AĴ;m?6㟫i_wz rLoD S7ww?˵~v;jFכF\w<9"1\; S2Xrtƾ~`_GoNd|<ӱ? 9NIƄ9?Ho Dg\ PwS]֖go'RTu0D#7r] ,*[ mh&))b0+99I9dʗ}ӻ+ۆkۙ3*?U{ò*OZG5ۧ*h$[K"Jp>8JWH6Ż'|~tz.ɧoUb^:v@jclܶ,F`ROdroVbk=poy)id<'Kʤ(͐|y _N9%Nq^e\RníS\2gu +SPf^3c:?C2 #X^낞'}3tRͯ Sw zx+MꎯoQm?oa ~ɟ@h`e̚vBGAK: 46⥀5Π~О[QS7ݥ\e!@[pWhÅq'[<4sn!0$lE *Y5Y3:ŗcuۀLɘM:7Wly8] pf Ѳ?!}ea"nLn-\Md.M+VGX2k~@_38E7M6K<ޔMbqHځ2j=Ԃ du{U7QOtH`oJ@~2?mX:IcdW |>k`]tWoPn(TGL&[Jfoj_H6iaࠨ\)]ue*JnM"pE`=4g'AqS9A/_S{LRCz8+a maVO-7+$vJacs<}6,KSג,PɾpZ ߊ~_gaF6H֛tү@؀\,+6aG&m(3U=ʈ#ߋ9XG9+)EPѤz~PFlo*~TtzV s4m͟ ,Q{\V~C燔?Չ({fszKt0}?h ɕ- U'A?*] ?N9,S{VԢhjdn|c6Jg$K>OLOcI"YZ=],πXx]`peNNoyp4nMFg6P0B_ZjP km^̺RRy"Ļ U Q:!dLNFm$Lx8EW}cR*/Ycއng9R烋3E2Z;Yg817/HglG+ϑr1^ Q8^EGS3\}B񬑯@9 ~uZIQ#2Z2mb_| DZJL60Ǩ>]=_֢ ϧnQ+Sq D>x597禊#5NrV]0VЕAy"J<ъmS%kP+=e=fi"ln7*#Zg:ᐮfM䂤I BS$0*۵ͤ|V陵 nϛWB`n ian}4,Rq9bOr ڣhNtu \m%a(l]Wq `4;QrI C;IR}.W?0[y78UCHbv$q'q$U*^2 , G PB%= 0?!O'ݘ}rS`=z ;9"`K笻$jP|. f6ڲ2Z%E4dj2s !j=.wԵf{#eX_Uk lN@y*d5b_[^$_FW\"[ QvAYB`OSPB#IWm"k ޺'*KNnbG^ݶC{uRK!wê_Klmc{S1:;H+p),qVOY쌭ꠓMu%EAI =8h !4#ClDkf\W*+rt' ʿN22-gM0C4K! qYuזk oj4OʶJ>̫yyp'\ <@_465„2/JcDWM ~&6+Ų*r< ;a(%ëoޯv2^ZMq#}Pp&p XpOϐv r%0; [f2UiOT[rrrhP [/oE7t!U*'ew)r\-\.nh fٺ~IAO(qiz=H{pjcM|[Jxr_K6=z`m…̐%}؈BȁG:Jk}yn~9-4%+1@g{sҍĜ$(#{w]@(V7a e!DA<0ڲ\Rfa*єBJ%NRjv?ׅvX UCv康r970+3]a$nQiĔ.?tRz(\I-LbOn7@6\ՁH`d]%bH\4r +n 1}G`Jk `Bُ]7-, ,sq3+6 ~6 :ir)&iwE"u1o,{wu:<i|ɨ]Q|KdڶOXox%-4;愪)Ge:]c(z0ưެA ^,ϛѫ(­phP Eb3Q OZ墼Wo(Wd (Byl;5Aʳi%SݬDDn.~%iZ.ѩϙ1X0>̘a!VټsO2IJР`v_B.ֻ8_';JSYW8ְUEpʒ9/ Hq +U$oi/)MD[96-ʋ~Y.@%le(#tP,R} ċsJC6cLS,t멞.47>sHAN-;[VCgz2bL.d\5ڞ_J~i<}h O%t(C{|<ڧ,[:6Y,k p4\)Ft0b1:&Ex] YW&BWjt3~ꊡU*s[ys.R8P{0wG?=l&T(ۜ qia:ɶGiDJ tk>X>appEJmD0J9.\HyJSd[}>QUEO:5$J呋7~&T,슿k}byݍYټĸ7ө"dBtu͟B24qv bS|W1N foZ4g,(ըQrsoF,sJEvbH^ [7#qtU[fM,4/9w벏s )8HksUnv*=7 MUΛaK$\0VB%#{LXXFmķT9Iy6ܐS~ N"FJڸ]^aܼԣώk}d'Ϩ; C#\D|V|>=uC&Rܬ( T=.O,s(q>/ ~Dȭ '(oZ8Ei"xܾ\:Nm>mF4u N;D&x~۪d!I4ؤf:窈39ŢK-dok7>B3$KLUCc'⊌J}iz07%!FYf'ZJzCE((kf?1-ɴ<@xds({ל`d8w<7n^Z,,%(Ų:[]t8qÚ 6@EXTr;$kUm.`+v\)q?0U0-O &)͖^eR/ڠe&6nuz`Θ]tP*y4~&**=(&9:yJFЌpU+}maŬ.^hn!%F7q)zACL@᱂.&]6r>4x Q>֋'+Fl:AjstxN D83v/Jyl^w 'ƹFF_TR[!ᦣ?q^3*qrZ;Ɓ{_wyedVB~\mB]C4;\eOXP<@#`rAU;bz <1nJZ|}թ2B #4PԇnYW `cE"m *o 8B#bzwlO"7(J=oK.`_صfrMŜA]h-:?{UcpGuG0C__]0y޺XA\oA\,1 4+tҨXhB@411]s=3>v;&`!4$dT9&7I~Ói9: PJ{;z ר$7 0_0N1#kGz6wC=o\CkGJ[s{|1ZJwHTAuYgeE^gsj̑KäزOX:RgX#rۣSf J8Ӣ6Қj`K#kAKuϰ{(eIr?KhP?.v.+ 5%y= HU=e EҗZF|Zr$\r!Uƻmr4lӴOXñ\cLq NL3ZCԠnڟ?'5!~dڵ "yFaUW EM "a b1icnĕ y94@h<ƉARBo}/+j)g>+!S-hז^O| au%XmSY(¿wq\.^R~*qBolos9t|)ώﻜ K[ OUe{rGFU;݋~ ?zuFЦz*f! %z6ЌQHBpE?砒uj6jnL'*zfoܟT Ha? &$U܈9:RԇUXj{%oj *67JC$qׁgս~^$9m^ ͎Y"@G74u|ΣԷʎbT{⚛Fr&VȗFJA l ɡX)r64l}h7Jgw6wa= C|4@#VANH"CR6?0њDݣ YVv;OH-3;*-DeF.)!<7-KvUcKE f^ޙH7%~0us0*/1hYײ?N~Y(a$jHD2'M3Q,!U89aUgk z>ţj@q&9eF^S7Ӯa>@VFk9޽vܫc< ɄF*W)X{۲w M[>2hoL{#5ȾW)VhYc 5M1oPQXC_ūM%'թkśX֪Ss)%ybG1w2!V  pvvZ1CtOPfЊlR5)|1D\@(/fIz>fPNnME@>>i/FR(>6?\ȑ1wPaVzgLIvcr1Jx؏ϾPGR@xu<Ȝ ]݇QHj=oC#_QKv"-l}+)eV.z>ACvE]VJ(0Hg_QQ+tS9^ lbZ,w[B0Y@L]D {9o C%o'Ț<9,z-^ӣyGn{Fx/ꎎ_0<APs{ދlJo8b5"snogٌ8o-.W|vlSt0Ԡ+IFWMVR2U@ -8nBC>-EMSk|r4j }lk j OrOC2[aqS H`A 鞄PU2Jb赼JTr̤W2f,żg1bKՐpTKFk1U3 l$DU]wmV_}c"xs.Soq)/8~> a.rt5/kpd/|Yx(&YVA$0󕪠)i Mh2BO?iF)3a ;hNjbe+\Wsc5y?M>L/D4IMX1XJDg i@I4Yóh\|M!1GpQFr#Yϥg{= "V./D7E.q3I!ò<H^Ҹ'0WstpKzm`tN\ܦ8} )AVHv}n73?4tuI%[ןyʊP91YloyjmUMZ;./׾$m6 rֿ.cz,>IW8=4|NWѣ6!ZqAˬ_8.,j[bG HbfwY kB')l4p/Ձ .͸[]Jk Ovhӛ>M̶w3[nTNPܼN@DCy+jc1w4Xv~S>sQn/c ?R6)5qppoBfKg (}Wod_2LT,cEI'ڐGhq).[/s˞z|xz#M7qY|زPyr5umPeWFZ gC=! 1uuT45SA:=l}Z$P5չ,L>& YG%?$l/5$a]^ڢ+79.L~;&W%ɿ]}NY3U΋(wv'd?hJC`oD=[$DX:MF.87e=d WrT(tDl@ ٚD]H(m{,y ݗ?rP9JH^ķRr${cD[̥l7N/sH娌pO!PF=gvk3%b⪙iJJ\PS#y% {+uZ&㒦ĎqL%j c5y;{qk FÈ /xjl}3r0Zʼn%|k6Ii~n<ܤg$ORS^T++Om"y SdH?2"Ƒ'"jD_梳)IF.a-  vCܻ]^`gkyb4|~L],cnݔV5?WT1ss]*as o6<= ʘ}J{;=evR jCb?w@Ct)Sv˩*C6(>+2Wvvypf _`J@p0?[]_*86TKAփV8 N`s 'IkU-Tv̤T/LA  ;Cɦkp NF @Ud҉Q95W+M4C7bH#x;8F[D@ Pϴ )weN+|* .&pOX(T;S=ߩ܁,FAD >3t{^uiы 1M{p%Wzf6C-0hkh 4zX+kuk>9ǚɈXԮ8^@e;uF/JtߴT$8"Y;TG6}A ۸i;B@끟'jlX]i揓<#I}єZ޽;̨eˡWn)YI+)8I>`Q3ׄ$rSNƩ`@qzaV!Q?F OR* Fajz4o!7%V~SC@EhoR+.3ղtUzOo[ƲM {w/'˹;EmMݩP'IfmtѺ`>6=+pAog=eQQ?lj2ʓ/j ~Q=(s&tLoma̋;_(ZN+3&A5%=]) =VWVymR}l̄M6.7ɋM U駕A[KVY ǹzɱi>,Nѳu.@R tD92p Pswo >U##{em{~8.ʢX13tFĮ8B2;Al?MMoQ;Ɍb[ h˶N2ڢkj0\Ʒg)s$Pמ>G-L'A Bb<]u[NZ#[/| T?9VhT̩N喗MK?bL?&]D:4cҺ>Pcr@0T#,pЀKcq,p9ܶ,%ooVV{-/ͰÔ;`K+X #>2mF'd ,0trN[RM 6>EK)LFBH^\:0E&7@feƘt?șao %XMѯM?R}#][ OпoRNLc= !m b(k#l3< [шgǸMMYatq,kxK0A.3E0O'@p9t ,ϒ6mL R EEHݲ=9n۫@TA5L3RjOIYG l.𧯺PܕyCkr+21;`'mhqm.mK6IΕPfNlrsV0]vIa1>Pj.`;:?}|sCq^ j_u`pPcHj)Z eUl? KѽMVuͪeqWQ8ur`OuDµS[V:&>QB)uR L_7*V{Gmĥ/Ku,ɓ'WsH w;٢ۂa_ߧq7r `}1n.wx)OmUExC7.$Wc RSAWQ:W-{ELn[UnQܒ˻PWβa7"%-R u7ߓ-!Rt ,ѳG횚$P3&s'<VٽIn2!(3S"\U+9~&KViIفMXʉb67-PBѾ2%QG*9L`*[_Paf퇚Cv:O}5"؂(P$&{As| ԈNBR=9/yYO4kVuCI ivl]O^I'y.犪 Bd~ at<ёbZb-2ȣk4DߊwY@dYBT·fgo~"|-#jJ̐`wɜnBDfz 9T򕁱y½|(eIqBR]ms9;k/0ҦSx˴trB)w>,{a|/A j>5yӄ3ͺptpN&#j12R`#C=9OsHy.Po÷pϯp5X R mVc@ ,DwRX0MFg82\\@~m5us ۽l;X¦)"g%y}+졌ge~L1 ,"UK͐}w飠q?Yr ӻ1)w`Hꆝ+r7dJ49}r(GŽb8{z&$]E\u@DSсM1P="׊G-?!dadQ؅xZumZhR͟wĆUATP!x~FEm4Y΄[k"eT}oh'qw*}$0&թ.{؆ĺǹy7< 1 93 ;;/liJfwҲRbd^Uj$6^}f,"IyR$m#7jlG1 {> гzpӟv/Kwd$'(5f*v7oChDnDOk}7L ӯ41+BRf>p?AUG{E3v2T؀q,zZHH|jQ4촗zl$cHͲbo$dQ\0q6y̏œ_IUd?8yD;&aW rSON*0F 0)d鲇"Kc=&y=&* jnd'7ΏJ#!߮Ib-ȶ6݇tAͯ#7>RkM\/ hWԋBu@qm= xo{k de<-1 Z >5)8j"zQ5 ksa\|m(VsM[WmTNvϤ]8AfQw?]Z7Q@cgUqCؑ~bZ䪂ōbu{z1rDTG뮝-aG}v7Эr`7W[iYҺ@.ާE dS(K)QѐWR6z.7|@ql3Qsaۇ/ּQw=dȐwSۣ~N LdwtaXO_ga2=p`km9/xt8(j1뒖*oа[ e-ܓsݞB%^#B=[11f٘%{mxZ/GM#3Şu!wܑ~3"UN.6EZ˵,FBOW^L:K}RA^]QKPG{^_{!߳gc,8>cЊdJVޛRq> KQ!QsRtbx74DOC"sزO}F¬'}TAs)v@OTAg!.`r1ewCdPN_3λ[3m,M'Vp#G9!HO}O !58fZ\Αњ sd8 ȤtZ-|d " 5#kSV"A,j1[ص , }9)=*] #\/8|q3}ֽeIsN.v!v`-qi$Zm< ģg%CcaSTxg 1/OJª)939'F[N;axbp7AHvRvyqdGw 7??/YWm^I5M:Ȅ1p enh] FrXB`hX aw =x1G*b Z,$ ZkgLJB& aE+H'˗k 匹_!:87 $1Q?@Ў)Òudګ(:Atٷz1OD+4U.)a0iPޭ| t5Td,Fڒ-(R), P[QY$eԫtV%%Ո ڵz+Gk z m , e=x`y+Z2橑oLǞP-?Rr&:tk.85cC0SP)lxIY'$Ns"\xrSig'jmz}MNKfJ"m ڪz'\3| }(.%}GT/_?i;gAbE ?pÞT_΀aǾY]='(Ui`۫|cTXw ߯ן@N%ԟ=F&K¹b6axp.Ϛ*~[~t~9}oY~CzŐȸSuUa$(?Y9j!wps=y5@Semj9X+:!Enq qFh~lA_rɌvFUzd 980OS1bM5n#*y1%hJHz@o7(yOrw ?퐔̀PL8+c}PP L*xS)C{)$sjΞ8F1nxMXrm9SwrD2V7U@0vh %ɟp@d$_ _(B1X_ųn}z:5edrI ECYf,\zF,t^GAڑb:uEOixͺ Kr_|//1ԇIlxܺPdrXssWL~j"Ml.Iͅ·Cr!{' ru/unrZv(|Ga=}f)~$hf-֓86!~N L)Ox4 ػl5 g5M:.a^y A\+pr;tD'E ⊛& `d (3uNW (Aiھ c'gĆ+#Qp0hr>KQ:\B"PpxG##CYwU+9O̢*mھFᯨUZXjK4^ eJǍ(pdz+wؔ*-SeܮՆ&XK d^bg<1\Թj4X0 #r#ߜ gSC86g{ h]/7Acd7; k'}}ۛhz?QUlKOW|Q,x%wӅζbg-I]g)*@RekHSr0#<`Rua WnLx:=9& "<󍐻2ౠاgY"Oc)J*,Q$°\$8|r& 4ZpJлaº[ YLoD=#wg+5ם@OU¼y/rqd"?RPO)1IC<DZ_y!_Q=F0]`{ 8-X\u'@'s4Y2ѫ O5ŝLúq=ieRR4^GC3'@e$P>`Fdy^^3LnutJ!FĒ볩G#f(} Y=4m."NO3͚Kx W֒Eb=1w=!<@Mx!7(Q'TLY'(t=^$蔉]tbhBη1:ooz,Mi~8$55Nr@Pq4_.(av@fϕ jh^4J5\ڛG @@*<_42~+z~ٶ\&R1EJ-%eSd."N;) t,+:=O+\LyZMhNFvi5**뇍kxK@=(6ф+{6 OcE/P*ZoQ`ȷ  V_ L˚2Ow)xBGXqaIUYM= Hrt 550 h.xgJ=Qd6UPIM'/uE3k;G͕^'= Ds؞>CzoPQ0>]3ċ4=NΥ+ɒc<7uvA4$Plq&e-R|Kp}@ᛡG4k}>Vb~6$S`+~5Ԡ8J{.`W^@2ʉzV-C^unJ$ۣ!YPRBh6u a7lVh>9m;ċE^R0Q. Krea A҃/`@"#Ur!4,;5 0Loi *r1vGZ?~#=l~rmFP8Y>F":AREvd7=!>x"@A&$Aq-ۤ(RPzY[{2{1y* /z,>@t<22,ڶ#O1L̮xNݫlHvN%ϊB)4$AXfO JZ yW*kNr8pL6pqHc 3:Ĭƃ¶T7~䀶إ_PؒD- KN{S!CKiA`9ҡ:51,l[ԉAq|iQW~'DVG4mbhS7I=+1eZ^Wk﷿fW7E;|M+zRteN(-ֿ/|Ib47\kQp#&8'dby/\PٿwhCILhj,RP2)TGsn./qv}ta@/~֦ шܓԦVM]BE#RXO >]`V|#DhQ3jnK0y0LjMՒ{L_ԸϘ'|4K`\[h݋ Mi|I`[5™[?Cv;r1N>$lq\KV,&>1bLDBP|[.\<]aUy[>>HSUZ3- ^x;*S[`܉IFK%" 2ή) !~ƏIN?4O_L`YӸCbe&`"@dx D$E븽@ QWY);gt-Ivz V;qR}X jwϙM[βt+ g7u5:ntSyװ*緑&{d$ipl}'«T1O?dX^ޯTW=Re h)@2ukL9pl6ٲbiX]S,G(C-'eZ_ d:eȿ;Xy:\/Gǝ.Q pkGA,jX1Mݻl@U{<ձeF؜^^ZR<Ӕ-fd–jy24Zxu|z7~jYDoPjP5~)ֽlGhQ.nVzDM@Hp&.C<"@[.1f~bə:Dz ׂ15v{>pscjҊBw)kqG+-6Z9#\9Ӑ߰a`FX%bݼo@ǣߗzwqzU\Q%mBEFtY i4J/:ζR0}pg3sYA?`Xn 襯/p^ %T35A$6E@@-w=!+s/@uu8◂.p LהW\"-x,ۑ/䪯 f@0 H5U"m;@@rҦ1fo\gp'r5dR&)ԥt9tW~Du{E?IFجq˥0;#7-|5𸷠Gɻ8'UF3OuvOsY%Q;3s"}k{U#Ӗd/*56 |QF+޺6,PU|(uvVVi1Ke,:5 7zKYѨ2u Ա>Ҩ.Wid3}cXX 6i៯/ toһ.Q8Me_OXHP4)rO$[;#--)WY5 Xz" 5d9 4 O:[\-]pFqCh)Ó`Jl%/'b,'(Cl t7lP //щxdLtY?Cv ٧?G૗ EMc]pr*?&4Y$f<5Meћ.i[9SI3|#nB;ő z Zpnz$rM`xk1JMKvCOwp#5.C!М~jn(ݚi$@{(+e9ڡ)w->P<AФ2[H. 8Th(iKἓidP3% t%yAoO=顣MȒ"SzŃ(r>ߛ#c$#[!`FZ>dk7W\ίA2ңNs9س *xVhs{$0P%{FxӀ~>d}.tЅ(~^F1w{g/ 9@n݌gI(,ߩ4V$Q֩FGFr6'vhu&bfKPZ BSwfcLVZ(y!FmNg(w|FaUA9G׭=ѳC VWD QpHh%b8Z٥5kLfU\9د=Z( 71vB:6D@W!z^2l0qTsG΂ \nǴݵCTRa1,.M`\K(ڗd]qQ(DT^V S|<~LaiJyawԓѫ N,j)W0E{4v"^0EuڔD3i}8sZE\TS*Rv?s)UܒaI! b1%*8^7( G7bSK)&-=DuE.dt^Ye?|(0E*AX yVUMX +2pQˬ¨a"*3gqD(z/ܿ, !l P+g2-a'rJX^VG7+V)-*~L@؏dc\8 DHBJ:zXޣa,]Qes #ܷUƿ'` x6:ܼ"o~"R&}h0V8]b!ׇF,L˜'d,qÈo9M Ag "ЗzxGFey t-_'YTR§/KQJQ9JPk'uk~ڕ>#[6sS[۳ be zO D`Z4okc vXD `O'%z2MGJ0N ׳l,??=\"h Z B2\K=1sd&Egg C~e棥al flmD5Msa`eYgA |?y*GQ`Or8$Om]p[RkHH4tP &H.U oj݁R]4@Y&[]do5G%ZO4e'LnYQݯT EAmdIo)= þp~$_ʗWЍR N<Ěଲ0lQH(Y+{` LTی3Ixvc#έ~)["?3D&^9ULQ2dRZl]]ެNˁi(!aİ19bqZ|0M+G)'ZuÝLT=A}ߖ+H~xɶu$Y Pa={`p̤kQeF~HD9l Gյ$ R\ 7tޱN>L;tۄW\kH>% ǻ)>)XB>ԱJu.IJnSɠwAx(c =pXXir'Mt%m솸TqLWywjh=w+ nENj o)g'͝iKrSՀF Gv{LaulK٫w)pvoDE&:.>?IǁrD7ؔ@ԿĎrr 5Y 7 |L4{H-wgz]B~&j{&~*XY՟EKz{b rQ 7Kmݿ蒛RO͚]1RM53=m6 {__<ĕ.F#P|Ws5F屡my;0 N~{գ0 ;5_89t$aʹd ^m;šz/ҧL&B]'S G 7![S80N" OME[j׃{ -cAx#Z">esfz ]chիS#d:KYGzrJE}@ѹnUT|@zSܵv%K#.jcf/^v@8/r7pu&Wc<=b fd~#HJʆ&;*%RFሂˆ-sq@FwoHcsuK=(ō_\ #Mۿ4E}0bQ{sVV[W7j [1~˖ {D&WTq6z,@1oOH qYeH4 o&` Hg \,1QK٥cJՄ)gn {T7|s`r(Qb3 3 \S*ҠFJ ]W[af@[[,f\$+#I wb% j;hc<ݣ{ӎ}4jꛤpZ3XyZV8.8k*=x; 6yb)퍤}#T@>Gnf̡O*3F%;Mx2!$qBca\IZqSWcʃꕻМ+X~p@y ʵw\Tq* C\yñ8 C` [WZF??KsEk$5='gV_=BgՔEoX , r뎦u5z}!=,yhY0mɢ /k;-ر ;sCp1f>Cu%DN+l⋉4I,\xr X:r6IS4nd?X!߫Z>1tw﹧D7jyd LPY.ʲ ra5һ9!C"Q0JR}D*z`(酴]- _Rc֎~c[VlUtQXJ-ÏfyU{$%~uf&`e>'4:tWސ[ؤeṅ3w q"nӋ4(sKg%Mx x=AWHs# 8>h%|8]3Gӧs[W-jDz}"?8^s%M3oL4o-HM\+zTOr/gV[;Bc҃RP2{s͵%#=G]V~O!qrJZ瞼ޏl98ځ_6$D_9'.&ʟĶׯo>3';1s2W+2ޣJXoMOҝc-# ' -PIs`أ%M$Gn:KNIE U(87SvT1 !(˓I2HX >F׍¿)cpn u!ʴ] 7$#A,KJayr7&?nDP<?peOd.ЩyRc 3ܶ$kީp-tt*9]yW Il"q9V`/'9^F4.Vb(qD wZ"܇~ܵ3#V](]_:[* IܽJ T|8L)GzhDp,wٻǷE*4V K^)S| ,hE*$M86F?E ?2Z&ܚ?`ʮH'Z\yR]JF TejLEܘyF@ L EOYxAvھ.$hHJ}؝|ׂésD ]ΕkHi|1YBt5Q7=1z(HO8ZU6+_ƌgԊ ŷ^>UہBAGIqCߨ.n,{x^&i:뮙Zӝx9E۳0!a_xVlȧ1Fý~#2L0Q!Mn[UK;.6z+g5)^~,fFI,KNpyzgNq8(KυO9ʊ{EȬOz+4$MU~{yd6v.o'`q*^tζpR(} sFrKTOç\h!K|+܉C)vwC-SO@@@qH uxM"|<ăH5m獙s E;6(~CTyOj/Lf,B+%hKc%0̵;woGǁ2 V.VK GZr!bD2hդSӧHbUɜѢz^ b̒Rz*s:- ==MǕN&'`a=\m@9cج߀t3[ wPdVY 8٘JBoO mP  Bjra&JQ\\~l\-)ɝv(h"#][Q;UK[$V-]v 46/q{Ees+4^:B}id[ m|圜ӭJ,wneX]ۿE{HC4WtZP0țPDPg\ }PP 4>y\m1/V,.e jz,1= 3WCs%1q,MѠW ''P&\vA:/*pt4Ϩcp!,lcDNu 'IWb<8烓C[$}?)Z47 n^$ ͺ;5bLL1-1^ˇN{WUXJZYj>]D]׼ؒ9PB(-C)%":J j=tBI Bԭ}wQ>-g}kӏLXt$4^guc?l+0ܸxAX%;z=F!8eAvt5F#b}=Bvt}V7kE |¸WEIޯnWH1XX١Zj ӒX8h߉/.ץ~:xlƘ8&/{OiY rPRz?&@D.5v9g(y<织O' 4u(5[k1 x]f攐0e/$m&F?1^.;"s!F,nw)'H5T?lͧSP )Zz.m>^]mU*tcN#W[DTՒ1wGSi膘8{PZӞ7c1Ӹ0 4D@6Ki,(*h"`w:4^X`aۮWz4n`[\|?V M/V恉3Mkv=leb. nAzfRPFVd&W֤$f (%ӓU"6a7FaSYPd ,zyՅ0S]DV8ᘶ~)d`옸ncg1CךlEvK#!_jk*LXn6RD"UKSנ vPEZ0gC5{s >v>f+Bp aVZ Y,35=K .[ ~R|@[۝(uw8s?5r*D,w]4n\SDb3bIĠ2b,%!IwҍDk=@p(<*L{~}uДw'#qncL4ϰWeߘ r+_U՗rq[f&Ǯ-8$/;* z g{D#aufX!Dmg ܂JDrH&`ïr<}zV/\_;TR{8OAl}}ִdY*my8!@@NA_>qG :`8]t;SYDפg4 1TW<235sd(z[|+ҎlTM  E{6G2 =V\G3/!3'HF]h?e/+hݰahv4vTOʮRDs3 KpJb'HduQi D*{@.205mjjeٖ?@deQzԈ늁S=e/X=n=t^=/?ֽPOxԀܛFC^!4S[DF|O#R'`T0BR@r!{uF\DzIVM{!kDx^"3a J[ԭq3()%~32=}5a.b> QP 5Ere6E+$'&Ƙ|e>JuuTAL'F Cag3u"2ypd+%d$GYlkѯYk4ф'dq/z*oD-@sc2jzh#Pj85*5p$-Fŷ&>!~st;iK׾Fe9(!:+ @->}EdPI:v;uQ j|͑ff}j  O] cWcw#m$)Xr:~{-ܾRwk?I/@R' a?L:n=fOR-{h hXBTuǹOf ;DiH*VSD6-Y,s_Ίm'"Wwr*%vʯr~4F!&;eT3qv;Y$ 8{'φPnCM'3X5vCG1g+!%.1Ɛ;@("drKgQVhkZKOxKIqq]%0Uo{XQ aȑQ[({{mT0LbXj d,kD+1H^$^ fM4B^Hb#l|Dj@<]Hs g<~HRaO/cKr6c̨]o#F"s,uX:52/W戺0\]ĥfs NRjNCRdNk=YHbѧ`8N<*e $WRV,%r WJ,u2xΦ˟̨~jpF!6#. ^|qW)D/ٳڃ #r7)~Gpu ) 3l5?j#C z#%7[z2ĂCNx: 429qpPV~ÄQf\g٢`*~G-)v`0eVgRoFSCDfHn(TmCd<J?)@Ө0)~Et@$|ZqotV'ZqNl!s`RX!>C۳aNG JsҬiŬEoed m[n }K[Rc碚_Wunڜh zig:'3w*E[aKHp\c^s;~$O;>4gS]AO7L#dDfm\Tu?~Zb|{/GoZ-R*姅'H`Њ岋UZ )w*{ n.8mؼ05Qԭ(Xi7oԴ{SO5Ɲ4(@*/Ż)Ē|4tpgŖkʝacaΧNlaHyDF"yxճU4됖"#U*3Wj [Xse'0aNbkU'@}PMeoB毩nWoӮ4G~Hj'/mDxZKVz cZth:e7Ijf*L<5el&F#| I*HcH|f!{f»zwE˜IL:{™ @t"hAvǪpsD<󎇱 fuV+,c`UC-YMVЧ鐭sDBԞyfgb6,Ȣ|\!rm)y.YKF0;{_697GKL|gIٕk%ŒIʔ C )>{3"v+0Pc5[]q $6q0n?bZܩKa<)+b AvA<"mF^As*Ëux,v1Vn?z ]E&:Qiudȸ+t }ZUCfц;emb}`=$zoMs~e| Rl'.9qe1ZJz4_u$zZ| _Ξ[ķ<7-`b*ǭ%ɏ~)N_mB[;S>IwF=0;(55ãe.4]A1ih/wi C{o #jb鄱Ie~:Zs6gQжSp…'{ *5a tYG9^nMfŅ9 8$fzT).~pagZ ߹Al~a ɑd yc@)_XkqRq!e]U4)`Fj $w\ Ql3grj`։ylc.n;wKu37e6s39t@}"½`UË=菹xĄŒI|ȯWj _o{q-U?;(8#-j'tpWheEt)Lw%f;???aРR9۽m`P_%y*JõFoH蕱,6y[D ơjn1 v#̎|֗N%q^p󆼮u|4p}@:P,/#;!h><_*pOdJ7BMw{q}\Vƻ[;+0°$8(l.[rC (sԨkU% Qk#|b.U1>ѱ}tFkx+llnZD#0扤W@~pk#F݋> ,RF  \J)lk:Q_>'(o4]Ɋ2UÚXadE9U s x/=cSa$S;;l2ڍ>6ʽ>?3 kp$p#j}ZtE#އ,ʸ僝Sw4fduTDu͋\٤$QZ˷8?B1PW) U՘lY7 ,5{Q&(TSxhլ VɆO F.*IJ_x b1,8v1oj _P|lB{ǺbWOއ鼴fM' .D56T^~$p)3l>< !\C 'qۈr!F w bRe-PB= ޛ펭uf},5W㑗Z }Ʃ34P_yM?=<ab|'[!X޽z[$@,`E"$k`! o.BO-{p5хuk-m-͊F JM\ [*2WM# ncIS/dfaq(10% 94P2VLWRw6Ő<EG%0i8k;0%)l@&F{7 k e- (/3r=6)l֭gmdPK O\(1:j'jB!*.@% {St%Vx4룮9jB&2_xˠp2HZſRehL6 9ay$pg \XGP]ysKJݴ`ܖS5+*_K G\YtD .\։nnzj{"kOꗩPO̽@:.P4#nt ncRU^SG+11`.ż(f`Ǔ:Z}zCYm)X-T{B< Z6# xmOQULvlcuIЁ1鄅݀$|a8|h4ЀiX7JE1Ԁ뗏>j%-'qPل՘fR\qNܫR;ڏ2cUÒWN㳤HEE05&~Gjfj30^5= =P eU.~m[]5"88HciRMJ@ [^}6ŧjîvLqb~:4Q2j4')a0%Hhi'F~:\Fb09\mMj*MS47d\%l\?լZocmp,R_UzUGmԁ0=9V}8$;P0.;u+I# >FWDL 9ە~ -uuTYtJϞI$cjӚC񶟌'2J؛Z*Zt[aQki[ Ru=xV' +)țN.rnlDu-| 8P?y_lS <c#qoĴj2ed|U;"hQBI79 9)w?/W ihqN)&08ۛ|5}0ҜYOKFoCe4Wg˿ZXQҀ:iȕ+0a:0Ob`#t lLC=7f-_X ߽iQz0=Z(x{kA_k(OYb mٝlwX'wq>[' l1+bރS%.x_Q qLE䕟xP l3MPz94\ /F?TV>Ou'pe uQO1|Skw{fR(qS#mbw?2&_ P7'g_EcK$+[Zf%4}w/-sk~Jq|1AJݪ3<;) wFMvL悜c]䖢0D]9x%)T<*GwcYmzd,P6blӷE,ǵe[1,)~7sucYK(zwLJMr*(ZM(#4#5u#wBf͛ +C?+ߘ`ʚlP][`N>a%wB^zLbP</C+(EߗnBR`2C{p8;7i6@pLo󣣡 d7g\Z Q}z¸fwhRjGOMZӶuÌ :d29X"$AF!I!\ު /|^+Y.[` Bt:>VVnJ~CYAau KП{ߺ[iq( ХhY]T;m-y!$ 46 N {)Ji U9 E/'R"T[‹P5zf Fsy]1ta 6 lDG[J8YB,G@R_b<1cj юЏgb2mu)܋+z3GiInXK?/Hϛ7nk|etːT4jPh1]2c& qyegqHE%_uUӟKi|wNL}V,ݝ wې_Q@GcP_ѿ蕅 |D=R6Ҽc0>+y¬&ylJ Un$5Ɇ\B1[y3/Ww'udߘʄ֟9avRBʚm'Zfo?LEl] Kvݵm,Z؅Z0mdPҎs(o0x~Hmôvn#/D{p~Ш>i }$px5o_kX$ K; $CZ_kA9.4G8|/c.NK5ȃsbU` Aǫ-' %~J>'[_<]]A\=(Cߦҩ%Z쭫ug_}]S."6obkw˃=ӎMs;?RvvQ1a}q;1J]la7B^`.\Y?ĩ0iUE$HIFg!3S䑦dg2$O 1>EPQvu9APҊ!btǖ_)Ү`ɳ  C\R-qư=$ec1EѮ867ĞW׾֍\6!\ mgG7ĵ$3yL1|HT]:UJY+"֕ii&cF4%\5踣*^";hQ7b#pĉ:_ ی`Y^`K Ȍ6o{yYYxc46y1B+Sh3ElonfdcpITss+b\acf&ji^ϭAj䕥kpa`Z+M&f5θ7r`⹋szH@sSF;nI Iq"iEcr,ciy<ɮgŃHv bPuƺkƞg/ކ*Qs"L=SM?tWY_Oi'7Vvڋ07o`%#7:ȁܬJ[]?1zvdEgyYy c Od aÝ07-̤lѫp9_0Y~S6v3} O[&K,-5>Iev}fRTM5gS)$|bYuJϒ `\Rk%"s@jhX@2|SiQݏ:QhE{*Pak/N,B9 IG4NZ*V2uyZf0>$/7C,S~r 'T95Z$y/zizuv1jo;N L)gx!&"Η)" db}KxJN^+a0.,?n*J\:'o)p't9Baf%NQkAh-(+>.}r+7iYhv)#odjo.8Ļ1F/y"FBuөPY^L5IQsv o0E^^ZS(q /"lDQU$0M`AوpɬǓ=Jt)V+lh C p |ˑbxu !A.fK)s3?ooA4([ sN{߆!г|n^Ϲ"Ķ.YҬ2gꎓ. .Y=ZZvH'-}npY -Ѽ1^1kIHѓJ>:7ְ6%Rov8XDǰk\Jua,- A{790>xhGZYrgXh-v&!)ls.8԰5B)t DZ 2Ug7S(uJip1$7e*-;J9}u&\'1%B=AF7M 6 4RjR_lMV3J>|6QX'Kӱ#N_A3K+@^sfx`9*Kpp'nOG(l^ T07f^V?'WӚ0csnNSM T.N MŝrMZ#ix 2<Qp+LaM~ProKo-Iq*üS:(s+l2)̻{PfNo%oU$:Vb&ԍxsu9U[UЁu(.&>ǏJIFv.,C)VPپ?GoPY}bxA(ߘ_X8vc|aPG}T5*sM= 4>qsIʁ=e2(i>ML+R1C~5gZ8Њi9Y_~So~aXng9dn!daXQrp(W]p_w Bңf+bP;.ȇW)h(wrp/<"s<ա\rZ  ݁,iencf)DcuTS'/%U'׈| #Sm/D=?dz)n j 1cP׫+EN͒7&sޣ`<yNkIIH~~&ZO5lB6b]NΦZoᖛ:saS2.:*d^j_EL?߹Y'fiSFf+|VT0׆li缍E/@:$JެT`i#iOI;kI#^ՠ+b;`BH@ڛa{ o7}5S.,r6R%ށ=arO2B߂ +zn wth2Ze)uoteI |S)U2E?1nB4ZZ k5#EPx$T,V{T9Kyt"1Z8iiw9Py:@2!`91|B1.I9Cg)ԧnK$_-6ӉSKOQc<`f+x!ޓ_8\@V"+H)nݽ 3LLH9w+Y2[7r#9g'c-ҶxaHæQ&^p ;sZDv5" +W"xm˂h2A@f_9 rpTjT42'PC3 fIY, )*.wne>BZ!/cvS4 #剈3yxPmc/L%]M}ZrYJ1&c 8k[CtsWϩ󇜫a啄b:20à~ek٥aǮ`E9ܭ6:R6W(c*04W5{<-@oqfyD+ }TDEWDz/cO֢ > 3!TkP; 8IS)>'ӧ~F{q8յ޸4V[`8vP3OG0eo`It~Vo>;.*#->@,9ajOEw[Ō'4HS77rjrRJ+ou˜pt/,?̧,L!ן) Dm adz>l ?ŴǓu MhL2x1(t[]6 i]_uq T_j |OM3A: 69Sm3d6RCu, x/%%!@ ČtRfڕ hqP6v0^zTHyB&J(=^p'M`&$986&e'Z̚S:[Y (M`GK< S86ȃIR a0}H;/ [J>=l- PU)9Nr Y8'UxVR~RB$VfM *yؐS*t_P<{זW阛X?D.\[~TY%XP77ŏ`aOo/>/2ߎnn8!=fWܱGL=MNE?<Ď*BqIi<ˑw$1#d8R= ˛(XV`V4} Wh`cY#?Rd#?qрm bmH2Iz-ѫˆ]}MJYѝ /oԟ20.AxN,ծY~*+trxhֆh;;@!v_fp [xLi6)iID'6bh/3/CӈΙ's憁WI%PlY/~qZo+Aɏ:8`~6>dpI qbc/H]t6(oE.' Lo_o$` G*ơe؋aa82۾}s2P(HXA-?}P TiЃ`z8y_-~-;(jo|kja}Q ̀&7wh6gOl"-S!,վXOƮӈ+?,*"qfO}(IJfh+x*K``XAf{bcht $oEZ{݁ٮx(wĥFd'CO)aL#A~ϸ{SGQwv!v)$H=IkJݑp/`pE/ΩK.Ĕ\zfDLݨۯ,! &mπ[,JAf ֢37LV<TÌsn7AqEBb m3uzltZP \aL=WA]ʟhwjV#-ݱAZ炱:pq@?t38ۀ-{1 RO NCXFlX43a-4ɥ$!9d6N^CQy[T8v7s0" $ѧ& !V AykHsJcڕ镬bIBvȇfBYog*m{UZ8c"Ĉn4 ,5Z̗ff׳ #ۼ޸t;|~ONhȲ8)9oOxڱ6X\` LsnF><}e%w޿W0~MR10(*} 9u[Rz}-N'("yRȜѳj?X#]ʏn>6mo(]켫xOt'5>hNq Թlԧ%EX_m#Eʜ$K훋N<VuhOQI(K+Vt 'c?0g>#ońAյcb$#bDH"'CvP䧮B%0@ r͇h]cp۹+* -pudsJ9Į.sD{z QRu[w.|9zJ?2 ι1jP[/g%!+F-ZtZ>YF]GtBW.s{ĺ TId@tyT?X݇o2ബ+*(B դn4bu0 jYKu˨l2C@ (Z+'ޱgJȿ Ҙӡ^P>/ѻ(iT9ryGrJ'5[ƝܖWz>IaMVfj*5  8WQXys:Fq[,Ge]i g,-r7kb]ö )lm!3/휒)bkP7\2ԏaDܠqg%9X#RuXpWNfBkm,@%vbgc7KlU1(Y!n"ʅ;YjO?npÇU9َz7Mj%,Ci k'Ae@߻N꽧 > ;(/5y06D` /=ݼːhYpxcvC,|-04֍Q9W:Ԃ7xRL+Re%<1IBZ.\`QURnZV6dr&N&ȇO;2z[<%e,n-{nĴq {# ªTqq'aӄfih Bq2u_F<"Ȁ \Yλ=aY2x "uu˘Ld3rВ i i0m:pPY)(.^5@1;}L/eF_[ov.pJi*}n6qAn.:n`;cp:M\Z9SsVO؍p :&Hy$y#q/f |ٱi #V#J)8k2A u`_g##lkX:)0_'$TSGXV H}瘞*4W y/]x9O#m@LƓ2h~ +d^Օp':Hg(NN5JKm<pl[Ч: y|J -f@7| u?'&{G6~~_=䘽2څZ(9h^ا ؒPGSV|0BQ=l9Xk,_+"53Fd7DB7ȜNAmcފ4[ҏ36!Vv'`Lh#eq#љxHzD(MaU&0P z"$bgjɲRrʢm~`"YF)]1-(~_a?ae`@0nw:U"ÇC5p @˶4y?pаt^_NP@t΂dQ!3k <#=Uoj1e/'Iv3 `t&ɾ M}{5~m{҈é $8b~u?i')ٕVVTݤ3{9AD̵5ˊ*r-oKӕ !Ÿ֫)㭱;Ճ C&TnN+y2lb'vo.fr d'hB`H0`#9YȩveِxޜwLI`L+8/:uJUj\%H:v۸5h Z%z֙Y&#`Mgq MoB$ &,֩d0!27/.fxnJ޽C|ȝ-BFAtGʔƫ,Ok]bw: @[߈ԣfSݤKPxkK5d[hd X`Vnmi $F~7Ba Vߒ4mFm[ۍʢhP-v`],'oлZ}\_Ś95<-xߦAKԙٍ 7r )+6J`JJ>$o;a:mIsmny)69+T`~M1_!u)Cq[OH38!6?Pm瀊6m}b0_| dnH<2u2pƪ*-VdThOPUH\|Vا#8!hcy@wPb󡜕`MkѥF|򽰮~Py%ȭǤ{!QjcIc#84Ȼpr݂(^$YZw/St *>^ԙHWa% BËI 8_}YC*OZQZKV'@y7GGaΕ-r4#R~|}"mON b1"z㢮8 -#?/1qd9ti?C]b$l_qޜ(0x9 !FZx LTjp<  eC2 UDR;G9X$)%^iTɞ1>F~`fSeFt1~Cv<: oO4+$BWƤӋ#/Q: zӑm,23IawynhPô)˦cRLq:dͶAۊc[8wIAhB ,Z9$<3(}F3Rbx./ sq#3om|lձ8]wfIy[T<)N]nyQ3e[I<w6 .ЉrmMܣ_.gG Q+Y;k\#=:3n{fme8\wA'|ǘ쭩J26̨"\AS%2@6>}QGv^:!dBջ88ВqC4QtPx&fdO-W^,bh>Hty]Ѣ&oysO~Jc|h"daL;StaOe~|9=k/@<.wAHfPQ"0e-DXhFBDiPżj\gn^6U\oJN{!n- >l2 J&Gymj|dq{/.G R`TC ~9 LCf~\]4d;VKu\XoWZڦtX V\֤ϴ$?:-Gge/vz'0;by&}}XCOg*Igz k(48=Ƭ ;f+Iǩ`n-7Ex#狄KD9m/hX* & hTؠ}G/Ll2zVg Z )gVSņ@MF"uh: OY}j,ev,S1b-!xHE7zKMBdEżV"omBq"PU}vjSr9ݗO-*fjV7E BNWZIj*?ÅqE.(]tƛ˦E)[BAmZ0ZQ#m7pLE/+x$FaI\2?F.ݨ/pO yvTW'MCUA ${ sZMaPk7Eiǡk|b:g>0@rگϴ} {)xj+x>^Z I0#hh-oՄJG3v |oulgS9yD{"٫%d8vS2;>Ag0EF R;9OyGf{&D vAajdeaZ?]8j !y5x_nVVo2Kժ'.AsE)Fd!i]N {?DCTdjCHf Z u햤z& `E}N ޛs"tċ@oE^7=Z ?!,Jo)Z@K_#h{UC%TlSB}{ `@Fq\2a(ٹeuȋLalw$lSgt4o}b'xɦZQ eiOkB" gK_eAXw\iB}.( Q .1kZ*q 9 ^v.qҨ/1!5n.N0ܠ$08ER|AD\[W*{ņjϊع)ש>G2KJuKJu7IZ1rdbQ)UWn݊VAw ! D79145#Xz}w h5na ,xTPV Pm 0qc|Ȯ 1' T?MxNxdqAW'ƹ3z-२Q\+K{.ZyLHQ,3&9p^zJ)o׸]{߾>L*cxF_fǤ;p1gh2ٲ60Fb+ӬB5ܺeЏW\둔XŷG 628 ۆy,0@ 79Np5$QmVEa_2&۾[+'R`oG]|vT7Eڪ)LuR2B!?_PHNy[RizI6Ұ3 |krK?$ܪ#6$Zpyg?8ow14 o6MW%MΫКݥ'ZN9p͍BRC q rDz>xU+5Ȗ'R^FT~tz#:(A[…f[ _(O'&Q&i@TR@]Xھj) mIH ̡AHwB.V@|~pU?f2tCG_OX{n^.tL)7V9I}zch^!p.ˍGрP`1{zKp=D$kR| .19kRTB ͖~1Y9+Z=l pX3O6M$ō~d7ngZcW1 1HPs_m$L+R y*sA=dyx|{H1YeFᲮ]Sʽg;,{55IóM@Xcџ/'EMlf);Dև6\;.#8^;@IަoV^}k`AO-zr'uy%55_o'W}|^ws܀gS]Icד-QOMB־#<}|/ FR  蝣OJY5ԐF`JsY^Bd n{kV_)d]l%9J~\$y:owHWE&n|N\U'qI!`TH Ћ A[/y(+6 ,Qg>:pob<"q\жSfqP?Y\8OƷmx N~uōpmbxpo[]0egLNOQ42%7䑺G Cw-wW[y?0$:Oi<56K(tpfvi nݫ l$

V(f2:!9?⓫} g iϐ[P}ˀ`i!@+jq%XT+e|i}OXv$g1i^{릐| W]$Z*!RpN&Ylb|=@r xqV~{ή@(W}FMZ m _uWk_4њ xX1/W0 H̎-i9US?nu sC5" Q^ `qaZE\x}Z~n frIRi?#ꓳjy^aY[ZF.a=0"4<U.JŇYt g)$MP[7AC _ّiSV=W..CcΚڴ ~Rc76#QXy(Z6G{2ﲓ;fT/b7 ZJa1DY oxu~t?bG8SF|dR_];>]oZpKgB3:Cچ?|.~y Dgd#Vzh]'-2m_pR1I!4y/,) 01?m-SV^ܐAZӲqoh zPеL)Qޡ,_͞lCPDuf& lz .]|J}̉qZ dkb3&WvjhJxD7I?Vb1/( ㉼98^&R8@ [}8̠hKvbj:gq(^8ο=X*@:vNT|n`?vv%8 (NAێ׋v`H\ F?.+b8e vVf]"rߔvX#M3?z4*85]HQC,b22 |Φ:L`)FoxW)&xIjne!׎Tyt7'zsp)6@#@A\`}B+% 'mBhhˌկA1ЁWG2OtqCA G{uRW+r:0ZsyE DEPPGaK80hRSpigvEv}ʯ]4ĦSI~)w1S3gi(z"NUu{LdUiVvFWC}ů9 1xz'CuMBz OI>{jc͉_V L#lg_qÓɃok-]S[.Cz"[eݍϮ`%b AX|^q"TT(fU/%|K0 {*L0FN̉JW oQ`>N.QybRE/*:D.WPɴ!:X ,_rӼ:ԝnDrpt42FX|~Db:M ];GvKGF͕`w2ujP]/8iQϬp P\>+U]m^hم/GEP%p,T}oR7`L+&1mY$:= ]UwSUz-v/~30伛lmj`'D M{ߴ>=^; d3޷ҽ8m_9Cdw_BlK8_p9Ģ\ܷJNoXV@ڿ(=n6$Q' 51N6zށMMp>{ߖihhoiff2>-5Ǒ8R-m2PBb#D9QYE9Ff7_l Q؊S4&{J`&:8]գu*"0~Ռ7OTf x&9OwP?,Pc ,֘ɾGOO21P2f֟}^ F B1'Ȣ_^>cNPd-)S ЫGy H:N%K6,ꪾ=D;_u.6MsF Og9U/#v|d5P䃼F!;ݒe061]:/]<<`>n[l, 3l/O 烓Cm >E8B.(™vqpÕ(r7:ZloW;ɴ&z`PNF<` {SvF duh +A kjF_2(|^WPO0$:IXML 1p$Ѿ·S_SKjs{ҋ1_w$7)mvO -#s]7kCcпĿD6Y \҇.f9[vIJ\{'l蹱3WrO y0{( Zoh-=klֶB[4ARŔDj+)_)[6Ueʼnՠt\y4NX ȉ&_SYY61.F'Qr輏$1u> .^"iee,0lXR5rzEUqw@ёh~,^wAW@J~TfVa  jŶr,t 06T 4'+e9=XRnۡU401Gdb B APQg9N[7F}b!W„iFE148Q&ߠmj]QroU/HLXdpsݍ %}{܅ʵ`EsMQU+ݲدLˑP?OOu>ȼ(b4Is9sr9<h6_.!K5~gPO{g:I#Wh, \}?l 4$l`i..kǴBi0Ewxt6mF ʎ-4R\CCT= ʏ/ ?h pȤwf*OwZBn  47CsM*O/#\˸A:odv)IliPibhn*ʩ,;6̲Fg{ ADw9m/`*aw )+ew@^^0txc:ID g QJoכn~/CgJ ywT06jUMZ>` T^ڨj519sEľ)k#ms!;7%2lynBTns5EQ~|'DxN3+}w)'4"Xlp`:czkcr9\:Hm;`x|MB )YSXwN^.&KWqUTͥ- ?HQz8ڐzr($Sy )5bЀ517 w{6L%|W;Y/㝛!bi)e>בwxt:MY;|VMڔO$y-T)S3%)I2nBV[h%еӯM4"~+#.wܾCF9j.Bfp#V-|u 㬑5`+`OT}V5n7e̠3ڵRcbPt]>\<~{9 Ն2=<Omfw(Y6莞h`0XidFt[ըݘH7Gʷt.oҶ+= NcJGnEQjdJ[2J"qXNK+UhC 6d>?]%WUU2 ~[ڄS:ˬȥJ 6nv@s_ФKۄ"j gH([a,`g-s7szlo5 <Ejf)%1OrA(6>p}&p^vSgu6o۝KZ͢۱(؄‹R}'^-B FNM$t kkX#Yd$yFݝ粋Ǒ77H eHqo$s2ײYGa`*BH;},Z7uPtMgnRlr<(c0dx:.CXq6~"ic;)A]bVu5f!N lzV[hhnnJP籍4K:R{mե|dGdb&f}K*z&%q;qײN}zh.^^]`-Po=Ap?RTju +YjMg8r#޵hI"ȏ #¥0ul|qjDH(QP-dn 7$)r8zChSOqCl6/D>{XxzӈR=#Ӑ mШR1d<D@h % ps@_Tg;BrCLAU]? "Xɸb>6#5?Bssq<2(/jAaPq ؃\35yZa]:BG**v"F&Y3qS;Ve~1enDk1b$7JU*t (?8 l܈Z4"n˭@%Iz@0e@oCv[X(;k~/V0l%Ճ3o27h3Y߂>WBu:~ !7X<2d^dLV MkcKG{ҷ d- ;NcW"–@Hf02gsR[՗x"̛Gl GTm/1W-E-i{C%\jʼAM\6,Iio)(HԠbk#5f&z/KJ5DC/>ط~~=ѽG@3X<"&E2";Oyn^p $ʳHUdCCɥ(.a]S(BBz^m ^z9s-*Jj1֫~zroXFz \0#5d:LY68Y)*hbΞ䳳tƊ OH?kQSd'kA!deؠ{C=<yU=AfkGkWhJr,jw9+5[Y7A;幦 aْyd.,lhX2D7G8 /\;`|Q)!#/($-c^"U׃aZwznUy)^E$e#,& phq-Jא>^q 7c}$d;fxeķ]a3*dgFj=mE[siQy˯d>"uq t6+ hβ x-գPs 2z7DADu=3:P/X5/TGp%j>6C| S_:}bgf x" 1ʀG{?HhWh“抡:HTzVsov[#p ez Gzkm }$_5"[yN+{mlXon\G V?x2Eicȣ?i_ e<[M[訂Pvx a\ $CD.~MoP^+ZxX.}a+7rRƈtܭ &U9*bTsnJ'$uKgYMZ2!N'U= ^4,y'Ͷ2/NzP]#eEFm5 GrR]\}N2Vs ' ԔH/ޙ{{܇Iz)?7 |[v5aUſ;*E{iNt5ޒb81=ިٔ@ޟPJPd t|xžQSbqA2",\zALjmLMqy`4ni/2wh@ NnQ%~(\-k1Q)cHlwKOu2K'F#bt(jjt9[%/./r97./ V̿Cp BZLUR>/&9q'VlȿN@7"buH%i~r;`H1b*굈p~i@Nt%b& "?Ӧ !taz!o]DxyuS/\AH%TT!IP]:ofNfjOa˅LBW(Ç<ZGqGMw]<)T0pٕ@}Yz:&7xK%{q,Je3[wY6W|ĬFZL' 1L/J|$wOV=0uId?`(Z?7랕5Y pqdo:P^.1L?֢n>PDK;0YSQƻi)[! c>tɷew ӭ}}\4٠z粃Ĭ{(H^32O? ֿU:m;faj,D~v%? a7Lӑ(_6fHL'R{VV(}3"Q;23ۨ 2+>t.X([J-ڟ9%&]xx4aNÔM'L(WMhqRƕCW(0r?=#zLQAe0JaG' ;6Q%Ěנ\s00ydmAٔܚ4TL2ud )5~@ϞSW']W#vE(RJp6 nj?E'_TR5`-mCu6.+/*+piFx_I pQ:ΟR=q^+220$5۽E kD8UjN2{,!O>WG:%Wn3\L4. PUZN <].w:ؔYAޕ CFViΖF9]-jqB҇_*WvP8絿f:z$'O*ke*xg+!2)o隨8 ;KгeQx˱[paOoFJOHb>~9?I05:)U̳ji[Z@ȑ[_PVW@޿bY5Gm6j7 qRE!:س)ȡPװM)\% (Sw^>bܭ'?EHɌ6VӨэĸGo:${5"BF4 D INeBcaM Sn2RL*Yk~~sT0 @œEܼ ȁ`TRY> 0 V.#Ee?'Im>7 Z$/O2cQ'{Û[ ?R3h4/,`)}K"3xd9qs[0(͌KoiƒɬْDz{fa,ck]qj'㧸X\`pٺ?* h\VܐqL&{;X`n ncIƟ.`qɝ¢=Y7-z].ik θԖ\B|k;֮E'?p̳]pYV2gS,ݙc4Ǝ99͒2ĥn78q*zD Hry'xsI)EX:D4줹%5Uh~ř `ina~LS/pWT =-Yt},qD17Y0':N5h(_UӚ@ fUD%63.)g>G pOg|=6ݼ@x3š W™n QUSj7ő;z9L/g:{Fؤ7 #׽Ilc/T?k-^⾎mҕlos<{ִx M Sֲ gQ@CΰGl"Ģ5QMv[kuA ~j48 ڛ|BFZ4Oȉ)f:0$س>s1iWSX1*+4FlE_1hDwmֺVX'LxBi8/Nj㆕͆_N Tj,zpU$rX>%mY_k: kq0 z  J׫3 <S`g r^=XTh\N60\s@ F]tHvSF]L6f፧*oLct,³x^y7oÌlj:~eE3GoU #Up3EO|ϱ jx35:]OZ uPFujlC+4+=aF5-6%gd"èm?| uTI i3my%&0 biKG{B#( Y-mT{I6ɸgCvҭ;5-a&g]~d&1ϑ"Х++c?c!rdZi0m8O=,:疎#Ҙf^:׷CHasAQvdN&ÙA `+ەSD&B :ϸciPRH5@*8_ lA ǡu2_Zb{)_-FZ/‹/0'sm)?j6 Igz~[Cw,&&,,_?Wz%et@>U[kMG׽cwYuL]tFsx$.mIHYٜi${$׌`'H~?lʁHtXtߏ%~mA ݓ~߭-ɤʆ-z*Dbf.ajl׵`2:@J}B e  $vyx B#OT|~C_z,m3v4O:qbp&Yhot*%m*(P>@q7nN8/İ KvLUXrrV)˴=;ĺ 2By|#\W90%n, βTPlm>a&;6"LPy\ XCadeF x'~uy)OaZw䐘~EjFoqltqjpT#nlh)V;(V9a¢eھ0;>VA*f"8!IV堯d Cc i5!ipRRN)]WD鲿;K=AR[^ Op#~C5 IM؍7jP4=0#aQ&ޜF΃`76s*> F=K˟C%PQP5%pU[kma7鞊h:^ }bQ_vˍFo4=)a^9 ġz$ZT]EYs iODG^QlW1GZ x#$h8,U3AQBf`pi:]eyD1@8=hwP/u+V3 ,V -ƽ_ ':DjHT^R2ˑ o*arM+Ҵ[89բ&:9(M@7@pUL]#t:Eϣ>'XJ@ˀ<3G (qGU tn>s}uQ<5ڼ{nWMa!iF $sG|jgH˛q|^ʋ^U'(f6OyL^UX3"pZf'͎3V ~yOF%kMU1(ɜ?.̈I3V˜|Vg jqkui \f~'#O'r4c,,8 F*P~>6Sasz7Ж8 Cu28Q %zl ,ʣ.S+>VDi!"z/IojHPzeLFBn3PpzlKaץr.y0>/: i2jRpq BifCt2GꄂoZ0aɄʰnKmٸB :NTzEtK*Lȑw&c|zLzzIİi>=VFoO{ҋuj$m#HGw $'V-5# k55{2ǮI]"Ú6y_^pb`L]JrFKc0d*!{b#j+Rf$*.λP߼p" 1Q7j3*cH!_R 3bfC鐶yM]=8\|\P- a?.z:щcjࡍ]B1ƿ}d8KRŜZѽ剁k<_qm5uO^7r'MsWAZ2nI'9]ޜkDbHq\AP': )Pf #:H@ypS<8UihǕgl :EX=,aW?rOjoJ?R/=Z9C;]%3f^NA7ddoTЩb" ӆ@|`<[Аl.ۑuɧ Ʌ(Q wÑ?TX\V[&WrS+` KNt P' [%ckY̘eý'Nlb[AoU Gp{aCѿ+z縱@.:ʳpˆ4: !fc.Hdr.mGvSQp6y;WXt%%p1R^c}&d] piCx&"?^uB8$ YT#YY%e/Ɉj*n[:tyX?8kJMYf!?jJ)Q2\i^wPy>Mؼ<Ѱ3 ӷűwS !п6GuMpwq7xG妍E;`_1ŷ9М39_2>t4ތ@PQ?"fW7.$JwԴ̖M%q؍8iA.0< "\:6 ʉ^6CFZ#k0UԢt͉K| 嚬g"3C)tοeQ6ʒcD5N]Y8b%"|K jLERэLjp(y-9%*F7䑇p6%TB~3uXDEK-JKlp▵ /]JO;|vwtI)s~E q3ޔ$Y!|qCB[V.XL O;*IR zFIG@@s쫽 Ms;!{M͚Mgcum E_+aMEGq/+$J aY(p8K2qREh~SHݦ[k䭂s8 MzVDUR~|+G&)垗,'fj˖cmN臀:Cl\P^S}ӋeO o-8Eu*i Hu;%[fG{*x)XBs瓐OEo̕ Fmsh_DS$sϳ*~|y^=~(*tMyXz`O}E6/LѾ mq6Fu3#m4+13H}>O, W@& {YQF|pPV8aw7_UT@#->D-Iuh!EÇoL$yI<_$+Zұ>;㨔4\˅YϼNWAw5vFѸ]v +}phu!9Q;"`)tW&6ljY F\aIJhq9'V&e+;e;S Wsu[ K+1\h/PZt5=&Me ף4hUs&?׾,)5_?|:Z' /=h2v_ݟ d_!~WN[v%7kp%} Y+Ǚc0me)y2\UHFK9M/ #'HT-_-%+'F-lF"~PV~siTpqnҿEcޱb-9@shtƿ @a؜kokGmITHKm\{xA qY0?!VM ]D3\N 3wf1ߤ JbJ?rA&ֹͨl + V1%ؠ]gv<^Qf> K"9G! 7m4ԍE&5x LN2u!RC3T[jRz2}_!$5Vm9$hW#s_)L@$A@su,:ُr ݐS`UK7'NY ܤJf2'#ғ@&\JN>7SP.HATQgAr%/Pr U;C+a'~о>]Ca4yI޻U6-)8a>]tq]]' h=.{ 9b\SN(3F|zOj[Z:8W)c4)Lr@K4uZQS29ܗ> /@pD_MG9;u!AYpwn?? uUTޙpnV()ۣ\#/sa $ZDtE׮ny!(/P>bC`g7A.k c"b@n6q.\+Gͺ9% 0h׵jbSA-d<V:^w a./nO$,hOV݁Y0WCC`8Xx ЊiL6!RM}C'&RƔ%\J=hpYE/N !lDۦ6\5@[%r6. K#n- 0!q^6[˕WJSw~4CH,̟0 ڂ_u7Q#FĬFBH01HHJ( /C^bאT$6 PkC;U2]9qlI3yx.:%F aQ(b+tJŏc6X^L?fuqr#嘶S7V$젂IltWVQXM+OSvK=0˓[:pL^u&_ ԯb(yG_@ӴCq/i3l;}0YPGec<nYho7EM9 qAW`ҫKv\FFGްdl(NiSn;ߐrd YC y{թX8CJi|:Bn6g|V1qU( L Fat׭by.N;#Mkw7[WNb(H6<+)yրC}1G\"#a q̂!`jjLm5_Φ `EoIϫ 1]X3"qch^!eu8EI?sf]:.%Tc惼4SYQ*V VmJ^KNW 9>q.^"&aě~ecd]b@at)lF,ܦQs% H9Ƿz{,F5+I1&iLZ̩M hq<,-_?rLeTQ|֐h"xBJ-F_\l$NuyJ |&Y(mnZ򭫍5 ^鬼wo0ߺ1OX1%cLv`>5!KE&ƚܱdk*h;&4BQDWyu3{.`=/q%+j ˝&<_фYkJu=g'q*bRѢ mx!#m7z%мeZ>f(I#SBHi<¡t'Q/< ;ab*@9dq`H &87e롥΀hDm핑vi`-}DS3~'m£\S6o.)'k;d%. :1 Z^:Ore(ۍWK>}0q\uxlĶ]A0چ1w,+[khi%ǀCXe(,}.m'oY7.l-}=/c3%!?[ @rt'u +]}GFLisqޔc[6A' %7R ybTƇlClp3jYTNqK6䥢 ("Q',!}vK ;7pĠ PcT̚¡\&9M%V;`{|,,d.ps!|Ehir1v >!yeU,Y#S^Y}"L\$  P8_CdnEj܇BN1g׵a{YY,[CIZ;I{מXi|ao- gqP6:nlƁ׼S f4-W m9J965ۜX MkK-Sw~ b3 2%(].>6C;U6ͽQ͵h2jUB1UHÎ*'6@6KCucXSiPc# k-|vp챴8.[;|%ly nZ`g+e|J72AEG>ga}.=)O"1샘U^5+oS&,3^gwK kDVr'6@,U#*4M45G.~; w Ju}Wc#.,`9uC ,iAh 釭5]f4/b(%R nfNḦ́TϷp}n!2>oI2=FeF]9Nc8?P;5q9nP}ݼUd%z v$E?억Eͩ;M .%Hw-I4]g 6Wy G?x KJi] ,Ie.\%uqC [i)k}tc^:o3@l{'KҊLjA6D2U vR ?aڔPF<5ڽ.!Y^Ջ x}(geih2(n"L| ] UF!,9aT"Y.ʼƞ`TzXRрqJIOUh;dzn.+X_ c7VQX.PQ{06 z-,zɯ@.RR[;{=MUu7 fjN5q;g5߻Ma"C+qORcx%"Em.&qDeM3.UI0^="e1)dkxKfRK9x5Amo3-)Xަo$ Cg[věwF Y丛ttS%[XHFR_;UPZB4gӂ@zŧ5u3/4AS8odC▆mBKeMgoBC, oƬ sp#T#0YOEwҜt>!Xu`tAڀpeg%bvt$6 N[/цDR(N #郎k_IЬ]kj #LQ;$,yMeɆGrE{mp'=ۖ_6coBq]E jIwm~.@Pv[En%R6؝Hr#aikYh%YN%ε&[akJ"'X`IoA>ʔ{" N#rxzİB投0yDwm ڢ$dşu+1Xjao+f8M~^l{k aZ-]x0Ԍ4Eqel | NidߌwgH~Cd )18dTЅL. ]kqC@X8/ $kqA<$ę5tΕOXyِ$5zKňZ|6eJVRaXH G 3g2[\ c l_,j0c/=R9WݒXB<4nh,ɷO{dwMP.I.} /z+כ遌-@]1':)Y_$uB0FIL\` o $I9p0b-%~{qQ cf}IW2JE\7Nb1CBu5G6/Pdz9$v1ysy a&W`ٝ>oV!d2le6 5+QmU9\ZI$5~M-2\7!ޙ:_xNgAN̮}X,ɑxBLVEVNڑ]ki Р˥$yGӭ0|k^v8SCtM )Ώ0޸oO'24#F,7F^'vb\RE,| 3d 6rxp뼄;)He9k?*/۝FrM`ljS;q ,:-A{W,lfW9m] TUgFL3|k7X},+__6FsR|oЅ l6B)!}ck+b:<vv? O y|3efeYh7"/^d 3$b,G9: \PLPb\dzM]밐K2)S@d\KQzU+/ wqH=<i4D)b7 y KwɓĠOS;zojԮIԒhKk!E(#n<0H}͉F^9&[ h`KuFqεX| 00BF\J[8* HCHfQxlRQee<;!nJuAZZJERb$w@|\ f2wvdx!Mq/+d DZnZ.!|mxz7f!+gG21.9 fIzTP$ҧaV~P& ގ 2 \5igk{UO6lJhnڸ3(hdҴ7Í`pOs(Ovb &4#ϯ97Fg;V唶[ lwܳCCql>6_YOIZp>x< hM$r[o~h[(M3y*TAQgX]T3 ;0"YdL˲^i$`Y+9e\Dzcj4`\7lљ*=5TR bۋw(KZиb40Zlg%hy(o`B>(2sMke ߃~v)xB 3(읖2޹x37xRųdywbB$5 t@ -C *6<7dJtP  (Pt^m0t)߯p/ 0`N62F)ű,3 $ntE39!|ݺ7L >d姽#>4Ve ;U9':)V}yk$` 1j4xv ]&#Ja?:^-ᬀld^")9A4;/T`|CLNǁ$({G\$S[:VCM"݈ѸcRKUɏJ'SFM'6x3|jb }SI𥦈Ѡ@KOb-*C+oh5~Sj `7 @Ӑ?PXPִH!BEM~8ÖlNJYD& ʥe:(QI8Zu"bi:uuJ~aƦ8U{I%egUZm"+ *Ta "[r0^|\ѢSǬZ' oݝ=|Rw``$3wj 'BA#+ àO/E@NEg?Y,mf&"r>I1`?A=K@s*\o 1- fTt/ײ>bj+TY_zPLK:h߽t#ףyz<* W^nGUF?1{[\FbOhkJAv9}@ns_16š{0Tgw@QXAK5E&0*w(ʮN2N66a AOI8ٖe}0h).4Dg,g).pmGx@.+AM2Ƿ ̐{`yZSJ@Qjg"ulX9!o*Y8'T4vMIv^[-wJD:z^a@^j Ns1w|^y]p>,|ArCр 2S6sv/&y6Bn@gC ]k"4˩L'^naw$Γ%;EԆowa>QtTR#Q4ōi`ǟZ ´9W_ui\Mr[8Tl8rO 35[5Q'F~` z8ڃXG 8 ? "b{j`#GIH嗩QHx- \q>v6#57TvAf}!Pd_ˆ*65-5jIVJr/R+<~(y\(h`fr(;f(55`y3x'9i{!צ̃ղŕ I q$ML 5گLGRp@.= dewJ|mj;̜;6~.(h&><@{.Q+,;mB/ujNy~EA,v멂O7GDGp԰)_[ _Ȃ&7|yQkX +/,h"/Ω8wq}-igLHF"u7m_hܱ+xryn:H᭨Cz̏_Qu <<7 }#6JKeXYpĦn`jSʥ%h{Nz = גz67e &zg-uHdD Qޅ C>ve5M;n-@jݩ(fxx൷5ZVZ+V.@8Q[&A Լ'ZϠ1\j3sh1dБۘeKL `pODv+ nA\|lx~HBFH$FnAj \{n \ N96dP`8tIl_RUIH%} 7hf)ߝ3 gK&/̩zyb+JzOT=̎8t/Hd#҃]WCCgPɳ`EQX7R[Pۖ??ã~=/):Gטe+%='HL_=` "{^l ,sZVRo&)g;ȳT4O қn;߀ZּǛpbϋL|hi!VQ0.X[%J]|GW#WBuaӅ"u4^g P;;J0Q9+LyPn G]ǜvȿ-qh"{+A̐G(3ΘKaoM6a| jtYI8 qW"Cc܃e`m(QWQY pA5m$bP}t| XECr6v@,L ԫo#,ա.w;sw[bʻ%U4@͓jLu $J>O/^+yEý䇠1H5`W,] n#,\=)2 KQ+~l_;W2"`G<4; K/2ˊ5JHjķ $&r2g^3"UĦ,f[?FLDEigvý- N|$Œv)J)}@iC؏FaР1Q#_ȝf0<|詰ΊCs~KO|0]YDhgRd^7% ԆUijh +{i R&1dk4CNEkI+jLu'y"P+] ѱ&|z/Y FGq1|h}ryN- pϪeP^3k4Kc~`#(M-Xem!yxYEt˞> Fm;o4!ci F`O#D'v>gT0 }+Jc82/;D|2nb@Q73i0W, /v^tR> &ۛJBq31 )vd?>F ܂j;!" \ ;d_v3C~5=RXjKPp`-րBJSx( @!>ҊmgyG ԊÄ4A[s:Hhפ.b<e:oh )|)}h c"YI9Q7TA&tƵ אP:#dOd~T-K fGwwŌ+;7qݬ\{kՇS  /XMOV_[Lk<#3 usdw':Y %C9#+Db;*i`O7@72ǫ .R-1DM"i)aw)ro銳IXwTZ{Bz+rɳ\֭u`n;?֜ԗw*tFB\/jC1k%ML© %!4 ϝ"),V(!mWl=d:(V;ﺀ ,p7a6:k7}H ao΂рlN.=eɲ(ɧJ%qЂ6:W÷"1>f&dNʮ׭{t[Qo e20 @Kӛ! "M5 "xeՊy'eB"NÏJcxC9|iIM!~&$[tK ODM dtLsnjM"egʐU6:[]JO׬t;?.;b0HxWK'bZkK.+ Otk+|BY9qi/GB|_ZOf"-֔C&}ON p椬_ G+$ ]hfn@`Lem%I(ZBkTWT~ U)|>.?]eԯ`#zx2KV}m7h MbWj׋L 7Vӏ<=pʯuещZH~$қ*.|+sjGcJf@m0K;;nԨ9k*fF~z|\v&RAFRFA@')kh$K誨W q[졵wE,9l%OF@675e*gߛ|ػѐ<*יYײ{?(Ei9M^܇w3mɛ8\`{C=@NX0x<)ۯw܄Ʃˋ2f,*RӟtZ;mW1gK %3Λ3N*ۀD ,7^AaPeװNUG)K5Ow1I.j tE/?0=Ahjdzm˰ wU KQsdʼ 1bD;Jak7 #>- ]E)]fYC<ߘ=ep-Gazp\YNă Z(͟Ua 5,%<>=Eri\4B>,z{ۛ<>)??7#Yd[ak~](JW+&? 0Wu=~zZ lL2W)NIE(.}"+[pMZBG4 t=yFFIw<))14SmObDZHf/\[s( /ĴrWz Gl[uoGB/'kU[KX8AT;%s]v -8ȖcoR)+ֱuHc%뎝TF8匧jMii>oIwAZ*BCbX⊇|cn|` +_0!l\zՄwm{.f;HHl؜!0H|^댏#Rmǫy5>g^0Jwg0Ⱥk"BAV9]nq&! >+ ^y @:O^sߘ+ct~.9F =>^zٗ+in>Y!Y!![ WN-j0P3%t= ?@OT3yO^ۿIM&SN;Vkp'H尧(Q$@as򇉖4*i&̧!qw•KаzpS7`(9`ZREmp.U) ri]j|Nh$9_Q+RhqnhH6$6U!i}ϯQ4kG]ҩ.5B(/r$o%d·93!*|\0aKQ9j7}ѓ~lQ}x^3*}ʽ~7JČ8:㛛Tv' vUJ?^4YvOAn(qz/%oE!]!T7r[!>ԍ[sHYh}5&u >z5ka\ 7EkNTလZ5$PkDYQřaLW۰y7V7ZbI/*M,dT$*H+ ³1BFdpCզY$L{e(83#>s`LTHCQGg􎃏Ug-ZNh Rꥪ&{h"wNHq>']L߱nyeԅ7"&@2K`^[[?,v{qҊ ≏y^,s[?+ ACȪ{սp}7cB̕eV7 ?e =J΁7;0"R%ssMHPk7?W4ʊDivOm 27q.:l½q^d2RCZ\&H1Ee#w_c_ OIldT& Erw^{eRe[Z 9 njop]UVIAi|9)S܍,e\^IiUvxZA]n@ݭ:cz57S1vp+Y.{ "jKE V?x+}|lqqn%b(8_</ƄcN5,SE}cU?DHqa'1ѻ!hXiF +?U^Q)(;qniS XL$SƿGm!Lj$o{1/1w> {虗:7t5eR UJ .6QE]V&gs*گ4 ]gBܼH^w{N^oa[*UH$ƻI-IΪbz^?8{4QXqeP,iYwWxqԩGuɟW:IZaԀV0M|R5U%$|HKZl_~BZO}:\>2-`|dآ* D*O<.&%)rAu&, O"9ҘϔTnqˀ,2>`4m^7>j-wk]ݢ:/ʑPFIHϺJj$$!@UR(z%D? #u0@z7(_VFqV4Dk8(  [j CDk`iyJ%hSCDڲ,SpdzZ?G0 q@ Pd5!r`(t͊lAsGPa!p3 u}>H`k@!l&Av(pZoS`@s>GCgy c[h-a-:(͏i垞+:ѩ q ڗ3;wGFl;?S8]N 'q.PFXs{p}d|Bb] ^CᨸnW:-KMa>O!q_;aVa]D6IORrak: 1P qhF s_QNP4 v"%yzke C$e'9EO9/nVyX~l@ IC(+w ~ʅѡsWI4zz ։BƊrKLO²ڰhcK=|8xFj5O, Ă]s1;9sySA}N~njEgrO! [Y@~t/!EcPËsc 6M>_8,be͆67魘 5[eR'U3~O]"| K&*zmK<s&E%Cf!iuo.7Wt\:~T\I[=\#e`t-_QFwl|qH`pv!y7cO 1h_K)w}c.TzSd#.T>w]Lw ף&І=\&s3 Wk.[QYS>V?vƣ 7-$(CSW&h ۆbl9Ǐ:Sڒ5g|y7*X+(5ȪsY!ogJ X7vȋ] ,VKjݸH65=WSB "_L5;2yx4!pLjڈFGop\*;Lla;JfbHQ&gC4Ym+6XQD$ol&K]ٕz݂Q"Pvh,$\sч&w6쎼p8A澧cpC=$0KF_ʄo(|yj ?c\F2_;} h!NsCS\[)JjjpDl\ UV_@26/t!yf$u0nH} n߭QtaPN|v1K> !L~uQDwa2JCXLdOC]&- {Z-KWi1cW{\795CsQ~U7QU3{jNXYC#!74Hnܺ Yff׈0 "i11&Z!~"gK\ٓVwR/hߎU} $q/KnurjR«]B{UU/dcj ta/(3\]s&9ʈ:\FCs^kޞ1Gb‘P ωcnu2 eR 﫞/TQÓXBxıݹ;@p C/\ec`@hmUY4ԣA [d[n3=ӛMx:>~Pi\l'o OtH8N EouIj yzJjH[at#҆4!mb$UJb̸<߶o/ `+k9I-f?׵T~|)3Ho#. gp0GOr Zoq#+ +XѴG1O~_o!K9.`aq8/@LO36l7Hg翅;2&c! Ejl氱I?DCq}T,>(5QWD+[[/jFC pS uoit,ZݢnX%MqʐMח6N,,&j&gR)=ߚm%+saz,CIִȑӅv +%#<⛙D)BbTֺ=&9XyeYL_2kX%݁J䉷;ÄdS [r7N=̙u%dkH !# ~02[ClM ZO15q+o[rz1X & پoPNw/'gq t_o \S'o}iYk٦ߏP$SG3>6Gak/t/:1pwPYz"%k=ût0<(tuJUmcCZ4W%_09!:hƜg5Gg]HN/oV kLI$~r:UBz>FiKm0ف;0WsA#I+$E<-]]_긇u>J(mC6*H9-k=!޽DSE 8CZUP)ePbV?˥L#ݚ YS,+f3-rĶ-Wf=|}^R,?PTT𛭁OT0@-B07A:hK5+A2E OQ=O,c|cxf**EkS\!js/ؚ1:)pn;Jsq,W58c 6QOS* poF1]o72y8̞|jCH4xIN'h%Ңڱ0SϴtN8 }Z+m݈A/ /rʢt[b'~f*]oKp ^*o/_N7~Qm\=?zT+ m֝[zò",ʞ3˒DU%hW=AoV, 62g|[nMXQ 9\mOUt97Ob.]DUز_LT4ؐ"kv!0'wk)\ҰJa#DEm)?ԓ=A*h02<[gP WN8bV])02 a>'qۗ{+w~#T?ox[bԾNA-Gܪ lh8F-M/ 3JSՙ/NR9gX.BR֭uX6faDaןMdʨ<^uQ˧icuƫPA-'9Y1ʹ[hExG FNH _ IOsN_J]#)]kOó8Mk3phx9\lџ-Siaڋ&-㲩蠾F]y`6E %3Lr8-mFEd;-!N\qn+A<ЉIїḠξ+(\|]Zi/?#$G_WV 6n3 )~NfQlɡ6Yv/EakxގT,aW wysP ֘%whMHTdzKWŋb~JۤRn,;W4.푂&ϣd)vwks[dNiJ֬WXeZ&Yob{ZKftVzv[A,laJ (O@lvpuŜZdk`B`Suퟸ|ÃbՎ(;=ڂ2G3c .|U) x>lEŗecܐ9] #ܖ\l\}v8&^#y!f<'0~ ]wɏx2NBHU:f_tP1cuő_ȍc, kffH/"M@"sЕ81ꍟ֖GI1t( K?9ws6b3+yg^q68VV2|{Z Qe9kvҽ,#NLDx])5#⫪aaA rIwK`n8&ŏRq4+!ԀI/w B4]tkEń:A; RhL(b"y!aVGa0f+'l5ņV.LS#I2]~fQ2+nۆ&zb\ 7mQUΌZ38Utt(MP)%JNYV8 9ϭKDK B{>jx+)1>)u=ZLdB$z^ 01ieŐb$y`:&O񷢢 i0f*d:z" /@p!E-/,)ߝxZ 3UZڝkzub![2kDNy#yvnuc̦jW'UC5ktm:wL:1>ƢRYD:Y^W\@Tٺw4ODt2M6?/&I"o#c{{N3HVwI rLHOa5ݘf{fO!`׮3$Y 1-4{۵N]/h [( $0itXH_;P"XqLs$9h|qA6 mE:+y-4}m*Y =Cr6ķ )p zFJab$gUe?Ks5d`şwn_>]k>"A5b{m/Jxw$B r"G?']o,z'+&< SFL8ғ>, oWy` pSXOh-¹·v ^|덥lm_S*P^R9xoJ W&*?h >mLjA%Txฤi/teNO9nus#Bj'xZm}:3 A'h#$"*!9bT1kE 8ZΡBdi-=SeRER,5-pUVqґ).a`ê_ri+3H h7%}RW\+evcE\__BБ  'J-Avy-,u@4 7pw4vEYf9zCyE_V}&NŲ}d^<^yz \d&qbBZ rʙu1 `Xx7=w~5P~y.eĎf(-hJ{Ɏ*TnLZݟm9 6Zӯac~."h{׏]A}a"id)OY'BIYSZƀy ܷ#ЙcUƍjYX+9a$vG-?E,͞I~Jм $7\]сiQI8 Yğ ْBxˈ͋JM^-vNw1>ZwY9vL׉Iz&Vl+n򁋀1d)'V ژNA`1U .o J}onGIj2yEutm+ RL>BE?6btƄ}]Q|ApFM'+E_/k3~ Eqx2{ )hd"Uv"vnY$xlR6.-,[ZIVZV)"Qd*DDT@%GXL<,qg ].q>H%>kAWh=t^U%.t땽Z.Nfcl{$G&8sǥ>9 e Vjn|N$j<?7Xb9A2 dD) `iܧM%5%< w_4g &6IdfnoȦj Op 1~k[K@"T׻$ix]slCmrRo>қzU%b Klbv}IU}g"/fڭ4VbĜc߮HMcBMV_I d&ЄЀy"q R:U1kQJ 8sG !raNaf%80pV]A IK!..t$=:97aSX eW4: @S[NC Zө9WZ7H9-ط,:Z-RjEK#A[ѵlcȠ]]=*@)'jgб_g6n߭[|ΡPiFq䖩Y?mKU^ql<jɾij[&v:wǙ^KRO-;8箾ebkAhu5"RGYCbm+w cZ")3zm=Nm>f^]Lr ;qUU X{d%1T6[o>iu e1ME@ rk*ghYsK䩯؏W_q4nbKÜ+eTG4 r$LrWz"{?))@9ӞZmooQ[8=48i Qb(~gpx!MfVN(7?ksuMZV?x>"6wf0gRO W6yR;DϝLsEuXuܴ{]^ˍo:4Zl5`h@T|c?ށi|/X5"?K EYˢ\C 'Ylw %t;wPLj]y`',v|'6L w9Š{5 8 LIG22֕BAAWs.*B (@B(X &=@ 5y'81^Zd_ QlvUJQqd2\ºt(i"Vr9"fM˗1z0 lZ+M? O$[ggް!/ >aIDh-Pc0, ZqK1d\洀;k~gmC.3؎I\=[XF%9,qr_G1:[ԤWN̹;`R5Gpj 1֌iJcmg gF>ޭ/-$KyRtZNJpTSN_/8t$mWa*K_1Wk1(4| 9"cgɻ8 ~FjkIJrr) E8_E5(կ0FAt C^M}/aVGjxȳxY;sƴ{hq5cuf4_u&;RR3t[be;olo?M> ˜ТA^;>s6`6mۄGKB{OzswEc<-Ι_N[mEJ`|N!|_w5U#݃r'914f!>;m&x]YoNga4 $:墵DL\O'oPL @gC[}tvTHPx$bw (r' aQ*p(C8"raR#+gh;EwnUyl[@0iom`]YGAD(D7GҲPrbix>g&:~Д!,J('\̠o& \w2IC= tJ9[G.>yGT &;ǟ#ؼRPu" ֗Û..<,vp 4HѶŒeZZ(N?̺E-NNu1P5M2B]i5j<,O.\` PBXB+ܥ%ߪCfErdfpGtq&7('u˂ {sա>y*Nx݃i>ePuewnSxg78 kvv;,;*t-R _W/yYB-l=uK3m%w8\жgzU;8w*yy/S;&Cfzt\'5*D  \WeFS՛F҅څ6)uy+*<&3.ӹwQa 3ke}=J׾ N5⫫Fߜև4EvxW,<4Ch!?Te|Dm1nذxW2"ׯ``=r;{%!<@q9x8ٍ۶( J߭~]YXLTr)!Ls0YtUf XL3D3sA$XQC_./1ᤐ?^yFJ 6~eX)&uG]_gݘT"$261>;\o1" 4{l=d\* ll2eAޑ*ueD;0l.oOܜkA &}spJl[tS+6Rcp@$zv<;W@+ܬ=1/MǸ:aGxx15лwqfsja͍_ɽ&l1y5QxE&1IVn.4/ǿe:T sl`{$ԗ.~"mY4[:a;ҳRze;${Eewq&M (-1H3ɀi2ABJ,ij95"YVj~"w"g9򗒦Zfk <V z _:!jo볂kw&@l.N9:X=ФydfRgrd: W D(EɭmpTCeP0< ~(h$qM9;`՟x40*t 9u k>*5rQ3i^i0X lf@:E_~@Fuy-r' dqop2l_v&Aፇ/Ebŋ8znN,EHf`s:I ljP7`ܴ6Q[|ֻY bp`T}v2YN%ڄ}ЅR_xqxΰ݌lC 4h*%"D ,2*+v3AQSH*J4M Ev*a(5!TV/{IZC;:IH0T1-ͦ ),v< S{y/[=Hbi"Wk7K{SnJCy֦оVwz,A㱊\ 7DM3ms-d ҽWf*!bZ]Q-mIF: D;A46R+vY$)J2ǣ w*m=:4Qߖw4{7Q#1l0+w'fe`%HT a&c`29u0Ɖ;|DT̸ÍqV̝} o8P N;\Phn85^U-E]z&%{ѨvY@W0O]~$c VCGD?e׊(4JĎ Փ4+FIF73$ħb RnMm$ǿ4#V`OKX Je< ~3 {Mq[:ĜzM+v2Giqkҍ.pd!z;p d VႾ88{8.U4TW|ZrvQwCB E!Y-W3G("awe3[.e pNsڂa4uT='?Ķ!'lel#ΗLn^o[vbiFv]Nfd wi* N4[&l'lń%s>Žȩ8[Ҵ;:x6U9ʦs^ ScdSnP_#G8 \A`ޒ6,[}\%K|bgY,CkDўMy|T kTWP^s} G9U iT,=dH?і Υ@o6$ c!Qc<8^ޭAUQۏJt\*VYs_U*y@gQk,B$g97CG8 n726 wɎ{z cLtz*P pϐ"GTLѬ("&%@ŠQNᯥݣLK"7}XQwjPc܏ϱ ~@'x&u1eH\_ۦ'R=􎗯N826 q6u!B&,aNXq)ũ2DyAB][]Ye%l9 e]3mgYQl<0,=&Ӟ#K<׏$XwntxgB| h-}8OfR c!'@ERG=Tf+:Swj-[b#.lC:Ȥg& d.kdKO_TmG!C_$[;VtHFaW~MOܹG59`!9! ={{7|#2[3D#idB%'>E[WJxļktSFBI.zKi1}Dhi̇7V!_,C/hbU̯:c"[!iYW[CNL 6p2%wPk~y. -a{kXXyo6"Qs!<A#xbjH4#.y{@M0mtqޫ~V)Ѐlfrǔ[iUB_r#8Nuڽ-A;: h"XFӡ/V3Ef!e+&'YlA欴$:Z31fojYŷ\YW"s ԰Shf=ˬ&0ۖD#MMvXNrf =1BvzVG!]cF U[޻EɐQ^`WS-2kb[C!m[!t N=+K9 Q.28m*tU؃X?Px῟Ҵ;Tg z~ u?C]ޘRX%.hZ!P^Q>p1V%NCG_~o0@ĴjQI%EJRT*. \ R# k$iH6D[!:ukYwEϝ $1j J"u{0g\? ^EHĎW|~4|#Hq&$F Fi(Y]3^.=CsEWoG4Zl{{ֈwilG o҅4gsU4m+oX\H PTq~H+q_S1s䁸a:h S2=wc߄BR0ɴP'+[=E9 qZd٘5YJcW!Z餭q,lsf<T?)V" MBKj4Xb`Z? -ez6smtXm2=|6wt6aiBи= ۻhi%0^.@'>v SA *uY"]"񛀇#z ?Ϳ=* ֥ Zzv}Ѽ\%cue/h`~J&ux9$5: =ر2]X{%Xz촵X7q%rVLM!iDj+F 5ve=#;e7m&^ͨU3LOS #UY3îE3GtDYolKhE!cTSIN2qSǭ -e= :ػDB<}Z@DɫN4mU hڴ4>a|L~13i>#˕Æn&HH=1"-o%+X世uB seQ &ަΔ'"-pSe<}䂚 q.Wo I3k/rNֺ,+i6X6'L_FHP?1uSM87j9Ӆ 2" cI]Y/D'<Ȝ=F7kJ!÷L* |} AنO3\(YLj~9/14E3Vc/U/hB 2Y0kri?s1)#M 8MYdPkNەè@!FT-M˔XZϬ_\!2V[6d'ZK u7QEW_@f]󵺍啧,MX i$A.X+=M,&a ]X7ɪk< v;YsyLJ|؇ ;ZK(ۗAH0upQ.T-o߭a zHQKz+W >˯)G{lrX[ [> iU$Qp"((3*t3|#u㎬PMzWeꊉ0aŊgtE1Ӏ;Dc{XGueծ ˘^cR 8Umz IFgzuDg88;H)SN0d)G68蟵%?Y(=|:R4X(f$UYG|ͥ~e%4 -œs!iL5=\!N4.+:eU6&Gc^?#yztx*1ory`yٕ$WCvFZ|_HhvC{Ķ#DMWmOvcsrAYXڳ@R58 A=a*魆j/ ܍:H|ž1&RpD99aԉ(v1p004\Iqܜ5QW8&KQr.$+jT};ǎ-pc۔67kΐvZs`a!651c9>JmΏ޲YsĊ wվ2pțL2? Cg`z9U>JΗޕ^w‘KĄhl&_gȱ5_H5wEh~3mE?Iٍaf*ޝ=jzYG#ił1qycfm)Ar,Mk9Q6 qU{29˕zI/ȑ6&3;I!Jז#tonFY 䉮*@Hwc"ll*ׂZ~O6B`5M}Ǭ]WG#S%E/ h){.q噄b<Ξ5^bRFRnsN~yhdh(i-P~B\Z3F=.-FIiy' l;'3:}uJqA{pl<^<[kG35y"ܟWW%Pd@N#>%ۥ+ 'lxfrKYlG R;=`_Oq< OF$5jxQȲïpmeK88? '9Ss U,=HAߢ Nڄ\YlYk-Ȃɘ%!؃ ZAхcg8WOIճXPm\&,V@OHaY e,C ^|o{ച ]s>{|6=w8x.o KdϿvH N B|w&9.1S%|<@QmZ-mNYޏ|V*%̯W.Dى$6 \m霆o!eF&9IkmYnG]wP4@Kyh /9-v YIS]m!bgi]ԁ>MWkpUFCN}N1}Rɷazsw*̓?T(9բg'B%wIi!K6)Ŗ7C )SgZ{$=Vٹրwc)U_ ~hB  Uhjv^)3k+zSV`fZ^9ͺ!\?i G]NטECʹf![5*tBMa(I5E~BiEI ` rLoZ"6nvtOW3n"JvGI@&^%ҝ%5]:E󫞽@ٜ_Alfek~u-MPw G@,Ϝ [- Xb`'+~ER."Ykl[閬D ylWc1˚Om ϖ%ʙgn2Hx?!IDvUQLaKT1#F)F^!2fMo'g_3Z l3MVNB!0lކсo֕6sBz*ͥ% 7+PЋ Pi,U.>/[mz3[r`<%{A]>G> [1XDsW׍R{51{bpL"$HP4Ƒ X'$x:<4\U4xuDHΓ Xer  (X9>̈́M/0e&lsmG,ȁ }Pݹ=A:֚pr49Y<00d 򦣳 2Fg͔L 6jW&;jK bqGxe'qΖ=)MYXm)7olR:($U.lk*7>iSkd֖YRI"۶(vM&u־c_F_c@dp:d=[d`u9 V QZ УR!Yس0lT(%pna;΁21) 7_śh][a_w1Wyľ"]7 !\V@#[k_$ذ’#};5gӅЫ1O#+}EVP84THp~[dicdƧ*):4d{S[BEY&{Kq"J:ל 4/@S[!gH;]ÜȈFX]WƔj&!FХ'm4^Tm]juG6!:72ڕ3UYKw l?_Ř 9t!8F@÷UY1(?C_yX0NŚL}vRKʜgW'N,2 4Wb:/t=bb]|$sp,ms~:،b?q<6TѹZ! 2`qꟻO%H[r_ hhQvWjRչ7i 'fgҧ <=ՒdR`ZyesĮ2cFحL*ͫn/ 6 k's}qC3RP~ r 4ξZRGE#i%F 0\'' ϥn7u+˵zotU$.?y1_6 6 Y“!)ƎKZJ2)w}Q,& j_C`#*~lz/A3sA&Y(WۄI~:7Y62,FMP!8!MQDXP䄍艉j; ddGNR{ V$& &Y[ih8of( P@4;W< |)Jn}l5%ξ؂'T( cB2JRbR`,.1yf2D1ӉJ@k|d )fxAbtKs h@Ow1O\_>h IϹ#ľ +wh[ԏ FMjQQSiω b7&(aݙ E1T=tIuoE+b.g6T"rnWe G.k~TZ"&BOPjl#/7縬zn`Q瑊ghVFlαG|eœZ+k&@sʖ|%9\u^0vW )$zVρwNLSXw[u *apWK}x!Pb=/RZqgW08f_=j) h;(}3̎-@Dp33H0.bUF~#<ҝr#߻QYïo2X2V9 V[gmj 7;lBjo4QVۢ-,B[+'f¡N3ji5l c铗Mϲ] U#O9|Y"U#cq-ߑe`kn\JؖF<[|I+h&A+]S$'2EmlWi3z DK[7C $&`lƘYAB,rCb0`$Iˡ l,Evʖ%iZDO?dKΓ /g|QiF@h5 Q!cSM>sՈfF::S5\H~6 8tI|dm(.1x+ .LzRE:'"//dSm!)(d3Tx|81c<PbxSTfPÅ"C*.Pӹԋk- @ϕD7/C[KRՁHDnT/'ats怖ʺ x%\go<]\4P!HzVڔVDծ2&FtggΈ?h|ņs!`AjT6* n>EX}OgwVt;htɦ|w IQe9f7h΋&B`)щaz2YւϢà^aqޢ: } Sć]wIp1Ѥ_̚uUuEi[0/#L z ![ 澹L 0qܪ8W ZG߰kUrBʻ *x wSV'+n|eew{g3[PIkA0V;7N:-S4S(_^2Hq/Xq^#XfVRјzڱJk[B0M07 7ش/S~KC|!Lcw _yF".(ώŤ3x=&^dM)]RYdxt!犡w;>_.9|_8)z36(?^P=sLmiQ~lB}.DCQo%uI!m!M$Io(֓S:*@qnwabk# ` $•Z4%k}d71B ;vf:`mgFbp7~껏Go?-UD-{bߑ 0O6|rnN߆I `rʨY>PL>>#Q#-Њ"w?d)zCdu0 1U}'l[eAdQiJ=1'r8[bY?<~HC x[9Q78\4gZ5FV)9{)H@q:!? kS E!^(Vl;K,3%)Iu]רQ9gfjMo[Uy g,w6;C{dcea-0x&+!Q R.5jupΨi&{ags6yrFж[ߺ?FmPƻdS\ƋʰR`0=spo["#Wvr2$FL{ AEڧ F8WNⳄ7<ԇ{ݡp56 'u\Y[ T|u9;v~^6]eo©o2Pa: .ɬMnke0ҎMtXH$2( ɼ۽M`8DI7.LLVT u9%%f&kWx })KKy]GlvΠJ/X"zoxX!RyICSL>ĢFo;hӹ @ồ([&fsL0 G֐`.D@U k|y?_bi08>SJèf9ΔF7m|*mu<+jܣ[ ,Lo4rҩM/]p!h27!ޮk~MhW :F?:g=G:86hTa:/D+}!fTfvl%LU^cU9ą6 ǂ\íd}$G_!ܟTˈ#g9D)`H<1SUWjuc`吓u5h/p5R(o@!Fz\oh΢rbzT󿏍 7'D0S`J3nǵP@KM/Ns/ x~p0+Ŧ6H;2PVݣBWJntons/K+̶p=rą2VQ .7ˋFPv&Z~1Nzd˘YוhF prŶō1+v)vJfO֩ _HƻIC@*?o45osM-d4֘?ܬڰ r[%/5qs'6;ONqtahZ Lk/HϼԺ RܤW6ѢR׾ƛQV:2C@c.4==zm'/{(ۿa abڱTR;}Vz3zdRX z NZ(w0:h7o~?-bMyF{=]Ɗ鸉(_aT^]',XZ&z&r͔<kH-{1{~G ?ыgB`ߩ#)tOm[D O/`A:gjoS~jl?Q$JFh% )7"n1i8.MBVQح``'7 7g޺]vM&֘xgΧ Y%hK #סVNٟD-Ig:x{*R1260r*|a͍^a%EOnǫ{)нK|:l7^Tr5sRdx?D`70(P\G%f{)%ńWjAsmng40EPH Y'4j!e@7;2D#Q&{zǘ|t9Z7*[FۭݺY9xύZjEwU>Z CxN^ TƖ}pYdu5?1g"9t,tS(;lx90WZ+X66ش*AH[?O3ɲӚJBvӭ3#f~ ?(F26O竛Y8ʭU˒Wx (w 5NGkb^;>&`pyI1e3Vuwe{W[#ޅo jP>+5ZZGlɌa|X^Ihk-pT9sfx/PqYy}B$&!+7` MOVׅSZ"ܷT  +!;c;hNP8bL&r}Gc.mMFF"ZB{1GYf-12C(E ?Ob U-;(`kJ8s Xrf`͕°D{GL{*=n)fA;y6ܖ/teww\BAo%IGO1PrF[ЕowyJdxcnƢ[.]T{^O97B2d9@(ϓ*7Q` #n8v ~bן&y8l} םBT@...;G/f:hNdss.i&kqoZoS%bH tAQ<UL<]D+[m()! Q݉`dG=!%%HnV7?_% 0j1U_( t 6A\y:ϼY}Ći[޳@e$ܮMt0,A,GeL @4mQnrZU<hGP0ҪcCdz!>eqvW`qYڐdjjooFź +m(\,}y}{=Em![kc:ʧƊLqoucjr)4+(8\XO?TX^כ;'F;ܸZI) iDxKW<"Cyf??g޽@gqj J$ؘ؅S&6X"o 7҈>?-|X D[ߤ KjT4;JZu SAB=1ɗsiq508 fp-LM\yR˵[OOh8sWXjw`ƶF[x./%utn#ٕqqCo_ ޟ3%=wJC˘,KHyj]ޜˈP8@ӠPC{ge =Oxkr|{Fk6yvvtLes[ tV^[,b.=ēJҢw8Y_լ˅ZЅpN~c_ ^[%\6X#cZ5:Ծ,9EE`DZbݖh8-nJK, $XOl|_Z]v.4 S InQ9-!8ニWhIɽW1vL-]TX%汭,vWl%$wA unc8N3 `Zp77u? ԘR ܄TeSfHѲ QpOê%N8q(90y(x?a+"&5%^"ty5,=CWsK2oGr,z2 n= Tƶ+9M#Dr QV \EoEqyyقwa3'Eʣ&('r%L\_3kv܀MoYvy>0%ujGu WRAĻV[/k/KW6[Any*Իp*{.?W dN*%mBiC@ ę,[KWV[쟺awl<` o9yn1~G=VDlX ;}mYBU6,(ɗ63{'$yST6ͻ8ײPT"3g{뮬OvHq6fdbyݓ_tk5̆'" +zՉٓ'YF;uW>tJ(}Ȅ73tX"O뭋98NwAuDOxu \]d>y翜?~_<8y'&2'd?eˬDP*)MZap| BcGXsbQ_8yueE萾WY1?yȳYTHu=R Jk K\L c31U`ʜ)SfފQ`(h/u+k?4h{V10*b㘹%9ЏK:':e [71 *⍒M:|?56Dc%)r'I(SFKaoc~<^ $` R *z2j7I73Gԗ*% Y9m _ w2ä8Ґ)'?(vm(UU)V!$!?v"1?EY ](~h;ID]VTi8npEg]^ޜY$QQYn"=ɾ sUksX)> Z;T-`qFGY] miL}t)gTtwX+):H9NrK1}tK y *Td&y~Q]uGxlKaX/,,M9=Twi:+O8?.t$A[b `G.uȷwU%|0w.~2+_p սģNՀrWI)QTx ba?ף,Hl7p &mQgwZ[.(gL,Zi8Ƥ1:Fez{:?!kdhx.l2K@{P AH{d%v_H!m<-v2iSsf jSԘP _ЪͬV=@+s++_a i 89pHنBTަYG4'9&kD8` /SQ,7pF]`Rܺoa0$$CV6޼pPp:CqޱC䯥9k$>LfC|~vA^64H9\'Ѽe+Fo: {6_x Nz;6M'S~ėFwOHlr,1\k=sn%AS [?;|`9ry_gHjb^LO4d[#=)4 z1Gpou]@Іw.j,Ca"<|Z|,`E޳ Cυ Lf%uxJ7uStcoƺ=^O޸tՓpHCQ)x1504qe<ş\MZmIeVch~츃â|n!qWLz=ZY[ mBuV%@)+F N0jQ#Ɲ5|n50~~~0 ͷ^Fo<\X6lQ2@g愦G?7Nq%ƫ*}4 Sx DbC,vc2Z*W΄*qxch8>mi1*燆ջ 3~;ky13Q'TRi?"w*i.`gn|+|ڐF!gу$Gޖ!u "q@S~3b1a(Gs 4rv~23uNuc  eۀ`ɧjϝۺ?*Xi{Xu=K7DXW2\-4| CSnM8<|X]Xe^CH2KH ]H뤱b JTr>NR9;RHڇU8<Ҿ*pJQKᬳϱ/@4ژm! `Y j̟x'X = yu㶹6m :85S Brύ;=ruhH樟Q/:_ozP &\5Myg,9gU_}(] T6~$+-G{}hG0^7 8t* )6\F!XGFM&X^UgVO'/a4D 7e,n_ :5Tj/E Iw4c;+?IE]%wC &X2`aEvL2`8SD{^j?N7j?CTl?I6e+ʡ:%Zr2ŹZ[,IHEش'gcKH3Xt/O8`y`1TJ<77NS"+\_ 4`W7>(VC@B$=n&ݑ c^ZMpR*t-hdQB@dSkT"uhn]T욾$+(Sa^|2'fxҘ;-owK}G!08F\>CS#xZ_ R\bYHӯb&NLPP2ho*st<ةf&:ΪJ{cAJ6=g 7" 'K[٫>^;lIz("#}d~fy۸,K/^At3M{Wc3tןi)*$ͿhE +~e,\&8Ԉ0RRulk(yl}j`l?I}a| '%/9r 2Ȝ]dR`!a2e ^ح<^ 5[XmY3ɒuvk #HHe[K(6\M täe-!H[,8Iijs:+VJjϰLʵ_|lKk(9q‚P/̶11П2*l oig uPka^`PKFռT9ST=qM-mKZg9"ITѬ80aDw0n-bQ\&h5`#51rrC-?jc@zTZ /_ nCP<ī,(';CKEkYl:DYao'RG+v>8gvY'cg7II0i`& FP%vU{O0sN.䓑O@C0]5ov \RrW$5&u\S/"k7AW>3[a+fDJ4ȏ)x~V'AN5&TQXF8-K4FRT ;/{ M !Eu_ a0&m(qia͸ON̠{?%@U*ǣKPr fK<1l*{%d9?4NR3oʎ]Rt/1h=r~8M6`*O3 [r-9|(کL B;oC~}5Kߙ0ɶҠ{3B(p9ZK`ȡ΅l;IEp'&-d^((\Hw͈ja Q"j69_9NMvڐ?}?N޲mOLW&HAי-!k`"VL~G;8K9;6 -͛~tD5C;z0" c 2R@+$OorDDFJVq6=4s7lWzgPIM(1V" 1I`MԸv[$a,pt${&HQɱt27n[-hF\ْZS-&Z,L]Aw5AE?PqʺPez[l Ыct,Dn8NLrm*܎0m<%6wcS_IeCWV{o&Icn<}pwLp̘0q/FݮeW\]]lH5TuN fLG6`wnRgLb2=<*A\Y$`ݝ;Cdo`[s{,@Q_uHFaG!T |B":X ;̓&Z?A q?[ChY3(>GN^&WbA DCB! ꀣl R iPDYQYh,Fɡx52ÃaZCըvN$: G\>G'y dd"8+lpc cn=njjkӝ5 ~`o01}N#0s.k΃ xwߪ oVV)F^0/ڹ1Mu_lqH=V?鿮$\|ZfajR 1&Tl[y!igBatVG`D& R=JZN;/LP:МlS6i }pUg ՉhWDY|QvYb^U6 . j;N:g@N"5 ~Y} f DQ i2ȕ,}6B'WX1!IVv3B6or;x9o`:B=-Z+hѪ < [Ǝnh|h,uQY2C,6*$rkk.\QhbogᣴpZ}b. 8XX#رظŻxjL5R.u2̦}al &wTo߂8S,i=}Z>&|%7P~,Z%:pio}F&!xArXeRDJn[5~}.[߬%%m8P#=d}ЦvO̳HK1hb~8_k~43ٞdQ作[E유 A>4J4a4`A To=[3\b^,g2i A,ZiiK;a +ž <7Ԓ6 &cbH_a *Ĵ!pŨz9<#CExEL5ΣgO{J 7 pIzJGEa`k`PѰ|VMh:lq55kFܲ@a}!,l `@Y'\\j@z S&Xo.@+ecGUqX, oBO~D'8[QS<)6\䷣[X-r0xӕk[3Hy`_-rp?׌dI_asU=߈请+?-Kͳ,ZE64XGyo^^V}.a&q%E0 r/i}Ц^ d)0㬒gҀ )$2^gHNrb96[>XEKmW*#5 +BұyDp,C5JG-+P]y!0?mb^.R]OYhT3@P3Qa:H [ωqo$( -֕A@Rgv*HʗA:fz52~N|^,oHM".?a'3+wx'Q/7yc>_1ʯ\frW@@)E4[]%`zҝ(^l+M*k RYlǂ9f}7Z!]TN]9Zƴ@Ǿ^Hhmsx?A霂4 QdKm$>"ve .t.3iEDafop,z\ۛyε%тmZSO/pfX[7o]Wbb.7xWcRg 9]]Qr0&BJw.d vb]AFʐJNY\ :l=.澒!EJ1NblJ|X260 hk?9gEv"k[h3BEٱPys̳/a&ce0*05My||{)X qZ*1>Ti9 Ph` 3{J@[{8b]oڴl]8"n(**O[vXYeӮsjOuw0W6 G9G 8I.׸(^Б)Edn9{w T=#>O/dD = ݣGwoe y.pqîĘ _,uZ rVherF @?cFcb=;2>&N[p XXIe)y{OA~$;Z8\x4ځՄaVuc(m[ `0 ePKBKLG'OE$Ke.ړG,nkr= Ve9\]>@,'qLOuo$eHzU_DF#($qUweX!$m 4_ā=7-XoXlv u.utG*S֊IThH8E >rE|`i:7Wוdq Wx0ƪd5z!ȌAO.ki3cpedQkKx_M'8Ȑ-INA522Fy)c;$>GEAF*ar Rr< `F\Wí̤ `Js>?-f:>?\}qukMM Lgڸnka+Wl]Y!a-rWaݳm/_#@:cD(SiHPtN% xjQ,äRږTz'cH<B~`p>x/^$] kŽaueS'LKrԸq;8{x;&[D l\bƯnSY)Ml@_[lѓaPHt~W5 -cnbwZt(!@.CKMIJ*5(v^|RRLq9} v_ 48 ųtχE5Ygf`BYd&H gv2LfWWRqtER%<&Fg%"9K`3Fg#ؒ'@; :t;I;N#fJo406{ukx{ی& gfxzM{68dX`r_Cb:'Hܢ3x5tR:2p3C \ݓAwTcؚ~})˼m|&S>PZ~ubӘ8rTog~ȤG~V},@?eX.Z+yGWmCPoTyoI_g;:SA3!V%%/@я9c8dS@|uĽ{o XiM ӭ k6r:anJ6%HMhQ|WD4P̹/``20 q+!_ c D0U.n4N z w}*KKVĴ6 /YI\ }_^<,p N?9~@ Ɓ?Tn$rָ!YK >K*dm ꩍwg_rqWOFFB}(.H2echUW+h|"bP4XT`c~v%r_LpF$S@ |q~p(KzCL|)bC'\ZD^E.x2bѼ#X9n U */c#]J~tktb?ji4YUpΪ/}PȚt;ܿr`u,p8_·kMS++rf<$ԶMw.LMHs#:pb@/Ȅ3;c*zŒHf }emZ4ofUL w]ydN?{]+kel 3M;ϲTiȇ 'ndjyDcC?jGyA`gv-X8P5Vt 0 v zU88@b0;hUx%fA~8\' ceMv( [F}pumditJdg}K\L)iόO~ ][hn6 K@Lv 9o2]1%G^cf3 n3bM՘#+P-kc=X@b#bCfW@q^.ơ:<ژtfsnτSckꉾ ,(Xm}0Ԧ!V ('Ia-7 ,Aq=c<0p& VH6LYt+%?16&KO5 rm(Y~nx0L; Keco7dnyhm{x"u:!S]FVhP_(7'(p)9#FSFeov+ NAdFUQh kwI>VX-\wv`\*ɧ0,_nja qUu hJu_3[뙇3`10**6E>~wĂۗj>\]F$*׳._hilud ^̜~H{ ))ў^ A] n,B#l9D=BszUw&޺JI!jK$52As>cO(1Wyr[Wq +kE+{>X.e8~n v!6!mg)tI|sZGTgSTEUq,(u7MTv)ҁl;d㞵"p*-õ"۰тeo1[Hb*,t^xϦ9C1#XąHW-?!d*ccIfz(y7994Oڭ}V2ɴd2(4{t mus4v5+"ɛPMDQ_U-j̵)/;9#g;b3I9w׃ &8O(F 5W!Wi &A_oF %lfI!M$7E%tt#l8Hx Ya 1 j!{ǩE9B.Ͽ{F('(Bn3QQMdIOLYC0\;JOXm&NWbxr[gq /:O\l[D=UNeRIeՆhȯ]:@H3G%d kv|Ts& _H]GyY gytn[^qp[k2kȾ.(4zV[M2Su._N0@ [=B1C7񌤉{Rd ڞ_%kO&PЈ CdS@d<6gOS:Ri Er.Nu}-X*n~߯TzeZTAs0>av0i]5xmP-K7k+ bvx-X;pmVQU$b)\ҍ?4(iKMYϨv-Ju|fk҂/3 !iLYs@G{j`R - mes>hV% m"S[fThM@.TtV?& uNhW} Q0_h*V OZ(Cl!*cĕ 'RL O#!@zy/=xreH$lZP(/ww'#9:jU^'3ND Wx=- lsmڠ%T%}l>HkiOszKߚ&ֽ_^̲1lkT-ذ.l$_ZT,\r7gSfu,pgl)REdW-|'Ktf{rv%-edѪw%n?u,m!V%}5F;%w~2=o9BxHHjK=\wr[oq1 8Vq_S04ew*ǰhDx&Y>yHq>{s+ Ă[(M\}{FAֻqh] P=~.Nbj,(wA졅..rKPYTi?:U&3yQ]NA \'Z!"Z NAN@Qv @44,tWl$Qk++Ⓝ2xĎ P׌@v;1iQ;+3hvA[̛;.|\O] u1WV Z`bZȫ}֗ƹ#lb4^!x'Av3^&k*Nck^ ޔ;jOuҙB5d:$)ja>~MKݥ4Gђip,65:D)55Dz o3= ;{Gvwe1MHķz'sg,\/<|,b/i4BDí+ /"s!'7U)]9TM#p!8U!9aDe5ZNԵ 偁^n5'_9N|#oņ350b#P606gPd6e`5At_WcXI K-At,s`EOō( khׁ~[*7Lh(CYՅEf?,$d0]<(?WcdXK'}R\X\I\d{m;DRц׷ʃ Up{?_B[E/ѬS#Əϡ> 3oM5E$3p6s2U tI#Cl 6.RP+C $O$ y]5% Hi}۪ rI VeYGլ-1g1h60V6ҮwH3/ա|v̎+nEX mU^ٶ͎H?;dt t>)a֖ t|H,~Vs([Y+d3fͅTs ތBlx&Wy=0ibiLPb;/gl\O# zr,3OD]׫mLJUi1ۯ]YW3ɝu . d r҇RNS#"_j~ƴB FrMԘ4 ~]HFGuİ 1<5t1.aKeIV#yݍt(nR#ݣA+r,\ӂ̼ c{Dur:(_4K&N/PXEpƲvQ•=d>?-ZOxTu@~-I HaG>\a v)(~#.EvzPIΎD1;UFQZ\57aةb#ap}ÚwXͲuf(Hbj}\Ɉ&V $K3J"oP0ĖR^U~@'虹y*48OtT!Q0cΊ$'?BLeKI39aZS>v.8Zxo-Jۺ|Ib$AiVMgDp-uII|YOvJI=嗘巠vhN2e8[9nYpm'ԍP;Gg{:Q>rWڡM_H݇&Oc^O HgkZ`[DADT,T%rT&7yO菑&b]s,s6 * ʕ.v[E4lpf~`l@t6e?+W"tqQf9O)Ğ$Dm]w ƪ4źȧi!i3NuD"P:kV !0FCoP1Dr.^*27~b{!蟋^搃.cbpNGW4_ʝ&r?B;C6q(_A*T0ͺ)lvpٕ> (-yG6&C%BJ2h۽YiGK$yŸ\$P t|M_ )p[? ett ;JtH" ]Ar5@ c B\@-ݣ tnNя髼L:.`*y/(6GѺAMdP ktCKW ~.4/ hs֡im_b:zܓttwlmS&YhD~%뜵;}Tv 5TYWgt(BO'1"+&R&lD^:Yuy4]ky.581j$h/{#1 z8$OʗK@lOF`t噒+FRȕYq_my5P0+$B]^!QŇ @&w8OmƩwR$\8?88~֪T=29*Lj"J_bXsӖ%8>ˋ\{Kآ%酾y:3r:[x/'q{᥻"'8$9Tz^: 쏏k&s&A.y?D(X:zx#l[~)Yh'} \PH>đvZ,:/4V޽&$ewL$Bc%?J?jwªKZMSlwꠒ6t]x xY+a1VAwQsFE>GQ ?v?5. j祣!2Ǘ41w5 (܂zܨ-H:]cf(Mb<؃ m} >hMqyW>_F a;J,iuݱشPLb/ԭ}orW+>Km LAkҊ|X9kE )bwwV6Nu:40=Kl^'V_$ԁӗ!%ORtgXV`fyÉcϚHA|vL\G(jݜ 8ke`sa9^v%b/=jhajjaa/ qhy3MIq0_ܛUz-::(ciR⭛WyG@_ *; w@Ւ"RFQl74DQ4Ab0vs/dz!B3V0P NX[h=gq[׀*O> `a2MJI5< i\Zzr@(a2XF9סJM"F)aFh&]Z_2Гz…1G#(NaxEw6Yc"QY ^##H~C9C+KjN(:ok2ۄf< 5=x-1s ~hEJDT*nГAiThIlAN磭`͸vRE f:W2#$!9Va@B rnywrnz]F#ό5Z(@!a< *(`aМ7er4ݫ/V)fG>jb5ݟYGNٶ̋N&h$wG&&ju]8+!{-ݏ6ez`li31Yսtg \/M()" S(Zg1b<G犧\pz1z0۠x sCZZɨiW^gڱ95`?-Q&! EѶP*+īQL'ԻH!1 W߾ xFpm;u+ =gBHԃUvIb7'yK87[UijcZ3)# ENY;GswvAÚQ̈*>kʛ ;|y6(6ku%1}8J$Bhؚ㑃:u<`OľIB&L< Gh*p/8O׍]& ?, nu'y UK'+B]ώr ,n A y8 u?!jvRxH a"E}݅0ʑi:$|ʴD+咰.|&,øOә(kVԛWqƲ +tR 8( f(u kքHfʝ;Xd^ ->^Յ5R`]l[ppc=WYSk5gW-|I3kn?`C7BBʴ M+KK_VG$prbi~^Jօ{/OL&}~Ԓpeu:ИrԄu$L w[)<=L3 mZm"hH%1ے i3HɫHIN L(B18|N$G<>u1(۽/gl^9וG.`ؔ ΊʁVTtR K~A {]UQb&[ U"JX{ZK, UTRŏ%*}~xx\;<aƆ O_dϦ9W 7~u&P28*VcTC{3V @(Ed-ts"h1.9pA54wݭbAYrtCc#BC-2A{‰sYl!bյssY=) 9"Ga͍uYף(d2ՒM*JKvg&w> @CW5!R웽 ؜rA'T˃;[o!>v )Oa)%8Qo_C(+v(0gN8.Y5]sbxZT^UIm.,$׿Dz~4QksXwȄ٢E1eȆ4; m7w (?ۗKӡ났t˶$c]AUlfBeulibXؾvgowudK;[CPM5:XQ}fRIu,#l)@8&ڑ4VVU.KmC^-D ]JM7 a(]X w %tfr>UN ;eٕ 0Z*1f125v0'{L4B/kG\SV*xQ"0Tx#vu1!3w?H;"N,)c~h | pxJ=#QYn"zԞ&}k!diW7ݎ*ք2J-MIOAmt壚2!/ምvu$En)gP8a@Rt&ɔ9c8 A@+-hPO0qG1gpqW7JU"/4YUeF)vMtA?g-2cO/#N[ݠAx$>2.͆CQď9IaR7D) zܼo.ʴs9MZ 'Yjts= !S7%ƟDG'v04`8laDhkzb)Oho- YEߤ68kxg5 `ܺi߀czAN,hmXW^(F?EB+(-怒 x8 ho -t":sZχ̬XyU$.)f"țZ8W`A'AkjR>ni2؈GDc "fґRyw3x#q/#OABLV?'d#I~z+9|3@\h#aC`jw7+UndȔ;ez<[&V/:*,|r Ho & =OL,6:We0]v ׋wzDk0v ez!6>^n74r,+@Fu g[xkQ[^z19jK=ߍpZ=#] nhvifM1<|{iq`x.n[Xysx_ϻY#.#)sIS}[6n;R{qrd b!/ _V6cQŻ]1iw~ČE0|T+o'(| 둊?NvѴ37 R6fP J7RY)|QY^Q 81LfE~V#h*7,''>J)`3`4Oؗ13&5[&>&?pH4#Y;G [ g֟lxHɪ@ZSwpkAV͢wg y7W+RD0 f|is,s&+5ʷGP`ٲwUcܩ2;8r?́qM||_qYF B6H%{Tΐw{PA WA !ɖ4`T260TH cOFƩHI@] ۾Os?^|rJX UlC¨$YMV?Ilm8ѷ M у586M* i[̬84yWB:MmF 5n* ]BG`o+v=B{3cdZɎqt5:@G6`P ?b ZU79I0gN3v1)"YҽQH$e@cqZPC lQE!꾣~|?ߕ;M:l y?P~Jx#™.iv|Qa"Ȇ蹧 R.r.b^7`GeΤI5Qn 3r$M1nWx] \j@rap3RY?+j.2>d&QEWdwc'w+ç[~3F#[|mr68csawrZ}M;#%Ӷg#TV$SUcy)BV☉n^bU.)/S b-clg,gy3^dh@ ^_p/M%L5OlרƮ 50َYY~[GD dEW݋gk~ xō3$ċZM')\BCA?tf0m:f0+N PWwyki0)5лðWCr"_C8]rZ6;>VvMGJ#( 'JJ}[DI$S#ϠĸJAUU߾rS=)(LZz[yzO] '!{N0Sq6ٮ+WO='n${ț Z=}z)l|T/3+BAzϴL™Q\h@p)g%Sһ6 <+iY)pQĢ&X gI\ׂj{4I_Ȯ=.ΏZo5 0H09L]9/++A?!lQR%ٞuh5~=>Hhh呯sDry.W4*+qrshg\6)5N2[ zR'x괒@R a#sN2a[zdfi IB,3 gc0ώG3a̓Z:giy)'Fz0-ISZ*v:0dܺx%z_8se|lyՎ_(` MQ5.WNmv~j"Ś?XhaZ,&0ӪÒP<}1b33 wiq"o/r;+t݋Bzb{R+p0N*x]"ewW|=2 c4aNaC}{7GӤؾ/Z= h{N98[d#$=h '6x7h + GLTs:칒R h8=lnzŬj9OӵQ"z@PoasC[=M.Nk+\_t9.aW}fM٢0c("XjΖ]PFít"ӭHpe791sCE΋.xU[ #g^I' cHtB͌\/U =YD `a5w$J)~I?/_LP8#q}cz9cxЛfb =Ɨ$s [ѮnW\/} h Zȓ-'b:MPdV6rM: 9{Q-9!S?ؘe7@cpB6:HJtȆ CD7ʌmT%st(!uWIE`{5k5b?nR"RP@Z7'W}Q;f[e'N4! 8/@(P$ ~m9TSʑ< A4J\z7diH}.`SUr/M[/AeqO`Y;0f7ilpA/0 gVxxXdwGWACBӞ\:63>yyEv4)n [|ue*8^N Y0f ҽȋHZjcm(F`>08mmQq}gﮂi #u RvGQ5Zo > ͭ7HO(lҡD;R)*PBDҿnkg;Z(;{baKmw`"n'bi ,BmșlI mc]%@2MP9rfqgcmKOSBmmeQ ۥWt>,?v 6D!h;{%@yMPINcs36k, jTS;@a{M{780z 3y/U4SO#+<-zgAPy΅5a"QX\TW5YoX"г &s)Jz@ofkWDN Dܦ^U5xsN <*;kA3[b}܆o{Ҋs272bУF?;"ޔ *ZOB01HzN؝X/\n (LCۥYߛ|ȦfmAJ_h^>o9+߻v] *y[k*HJk f9uoΡ|̥f~}`EmaPQ;;1h\'E֋9D=,QY˪<;a R9:ԓ&=Tw`?oJקM+n'y| {RJM_Mc)*S[n$.e|D.a>7?È0"6T$h~5|н!>IqMqwu+uXުom~a</~71=U=˟z'V8+u&uyvn_ G*vM s^|X ݵCd;eBA/Z*Ys%{3ߧj)(YP),KiـI"-x!?#ϝklࠣN6,"iϗwC:,*nS S#K(n(O/(pY';5R/b)'ȇED7U9+HXpEH2ns^A05kNw l 4 fǮ$E@yY-t/8o|҉wk]'#!/^uq4:a! OAӫ(L=`} {Ek?w8Ay#Ozi= "dy ,gƔ#m^ ~󴆟]ܬ2/h2Hgo29 I1-{MYF{Ӄۣsi㍹Zhx\E 8 YZMV80aj^||3v{:1d^:O3IDXSЏ H5Ұ{9ЈJI9ɜ8kpiX҉Ƃl^!d8Lgߤs2u#.KԘ #Lqäh,ߏ~AXNtޥ+Ͽ^(_ެm 34փN\4bT 9!8+5N+sC7 3]!]=; !@{¬ BN盖iJ0;_[8` ƀhIcx7L9˃@5ʻRdsKoh1Łr7X_YVn V<)Z~/9e A(}-+'- zi~>X& !K%?ȯS[XF]k&p1౾𾓓HUVFx)FE~I%Hk+un ̢ZIo B#-)P-pG^F#|vC,M{ѴVb88zut);rGФiJ=nl|~u6xs ]>MTWLUW4Japx/?sm#.f\V^QF(63X6JiѐSHAx7^3a89K!UY2]$7Hρ*WopnHi@ K: ϋnXjAY y7@{PLa}"7Fnz$n2lD8$x 9jRcHwW7s]E.ly^Yv.۩JMSqrĸsC ?M] 1tO6$qWA??lLx|88v<9o=a(b|}YY z%nQG_ tO`=4R@0ǀd'<$iƜٺ-ק, T)74`8~ĀItH r 3!22ODύ"J5*$:6@d!KFyFBQ-aD.P 8+,)jMjޒi4ycA GvW ehUrzv _Ey5YpK:Leة=UG%pn6L*FwmL=}/ ثжB6"+ҷMVҫ%Ȏ yL_宪C@7akڶouѽ"5T6aAUlpc2Jb:iN.y^^S.p# WڜRװ^tmEۥVݹe]ۙlG<*- ,}_&VvR50PU/OZE]7 zgi6X !ت!kxTh6-S aLf@jj} f*Ķ[_.?9ň\ ppDxS$Aq?j1);5pw`3';\#߀n[ l\U3v#APac/4'MjU.aA>~^㱩#T9/ju""d ^e;x= p9};mǘpn4db]6llW͛?f{N^/hN{|4>4^}hy1,.85>> ~ @]#eE2`"} Ĥ]sD&<`үտI!Hjz";@ou# ؍%=^n2qbϒ#<1t׭Ϩ[_u8h|uEެUhfSs<(+]'N-f2Mv+ 0jS]% VeR+..vslY{v'gn0`+ /Wo-۲b~ƂKnN5Klgg)vWr(tj roN@)1:G{lG= t2WG7 ]DR('RƉ<hVk kR giV~,sCעUKBmze[& ݛZ9,r s,X8*|0x_F]x 9}}8\vr8Ǥ\Ǭڅ) ǒutjȷ}v 8έj}`^fҜ2s` 5tKۂKWT79VH?yғl..%nNM8>`/ˁIڡL| kg:la xWE)f}]ő`(]D|H?Bj5)KS_V$i3 4ƿ]s}ʞֵjIDEluJ\۝NEvjiS*)OCiz%ѩt*>TMv-Q4FxpJ@[p%j|y&: .=PIa4)pXx{=Ѓ&KiDwtݡb;K ~9zE{ 87񽞉I:y̩pcQ'FNz|v ^83BOnc #en1x8r#@ci~4$}L޲^*ZfBw+@hQqMz!q+Q5=t ]bܫ5i#ڎpx3D-!T wPxd=̂D%} =v惩wg7omeF:xv(RAPI%+OS+SHHQ8X|Q8|))=]keO&PXRo'+-1膳~TW;?|LK9TrI3^}4`iسUc4Y]$f} 3Gz-4nuKngW[Arp`ľ \LC^h؅Jٗ/3r#]`kcmGrT[Ҋqb&jNF@0a UYد@ )>y[-ҥ o uO 0]-ݟNs_elSAʾ"Z_,Ż!x v nAcfB-һL!}# (/\aWyLHYHqZpY96-^rdZSG/tv|VY{%Hn#тbĴxxppUNh2g,{Ap s2@>ysǻ('&9-)2B9'="]4ɡ$ZbSƗkx7 \i U{O>tIa>fC3J,_OeDu/'RPЮC 9z<3rT_\$Lox?``HA'y<,u|y\; N80P:O(\b8Rn3nV.y? 5`vlBTN6Ed7f0HK'O)^=M#+3^*ffA$vaVlAxD!n$-xyvηʊJ MNWzvV瘮 v,&'3>JKޗxeτ(tNtȚJ Т3 T˙7mmX J%HfX [^{W<+P&xd!nu_^@p ͩ-P&ت!t^Τ_63WY" 'HGUk,} nt]饚67FI6l@kƘgѴK(.=!'4ͬ V݊3\tk@I=:X]'R^2aI^M]F0;Q]&䩓B,[3Im?$.vL׵fm4f6R 8tBNo5a%\ 6Lvby.RHU?wCWޅȡ̠g!ņ:ffMk_;8 {lJQk{øI(ol0FHTj"D&t7ӓcv6n>J4_pO7t 8W4~: 4n6c{ǸO!S%w'R03>7ws8% vj:\KW{W0 eT;BV:f(}ςUI}WC )SX'dj[>,wNFO.KK_^6 dXq |+ wվ!ӏXX"W+,YuѢcn15ͧ;QX{FMOW|ГO% @1Uſ!CiUKjB#7eKuВpFűRfј2<K#ӗHx iv$p=˳([` M`ʢ;V5Ǔ< Ais6A}#goayȽ`TM`F3qHYm/[%DҰ_5>tsǙz_x|t|Ceכ# |V96!7~@ٔTjT[eĿfjJ7@i k*t6~{ޱkr) uY@,̯\Ed7oٹTk2RZgY8{hƽ0v \8+:ID:"Ř0R\Yr䏓]2,="~bEoYjjvĬyrnSz=pPU3,b_qMoĞ/*=*@)k, qUr k l(O)2w3t;F'stÙLlQgly+H8xLԜ(V[q٠K!sqEX)Z,){~Ob'&F4׀54+g͞k 7tVCr`ecn*H 0Tb:)<1Nxx|<0K( G?_*m <]i!qMfH2gLT,SqkO MC߷ax=pmZYGECช Ά9,j+3qӍx#J$ i G&]eT5*Ȭ?bP5޷=[}_2F:bq}6f;y'ӭB7*3-u.M,;XS u6Cq>&9Z5DE!*=/73κBT@͍j/ƵO{'n+{-0_@ 3{jkþ0S i)nrNA sS,Y.?*W -`~(\s )?lEcA,{ ɭ;d{5#yp8g[D~|^+b(A@X.SA&yL]T[rx^ 22/d(Ag<{u9*Ina b)M>jMQ gVf9VB̋.m-?_TANE`-X'EHa}lk=Բ;Yİq.Wiͮw9 ߩZqq?4٤(?Ea,T,h/2NgK2otZu/Ĵ%M^bBoMC!UFy9"M H#4f"lP2T(|$dWa e|?Ibܖ(v?{ # ګm ƥ#v 6_ WG't8Hem@B"Xl&)EgyW@O, Ҏ|-41 _z joAH,PT4PADl0<hNZPј`F!w,cq ݟ$B[KB|KΥ$E3;=V lUM)66x']r$'!e0I;RPW*1{/b5+{gz (?/e!"W96ζ4ղjKFѷ$/<ݵiٳ-\nTLdD}65^شl.gć9I4+DxfߒCGv46D+u2!aU6Bz1`U`ٔte@m%ٙωo@]a)FTG icop?d,uoid Qh+[ꍵQ*j:"T'k=U7we[$ 9uJw&V7t_qx]΄ N1 ~UЪ7(|s"#g@!0@X 0TGIݿ|R8j ^b'9{ڰ&j0iS=ht|7GhiRcnMĈ^K{U[&Vn3_KM~*&#S`!7О唉s7Զ KȘ\0(߶VzDsv !PkD9Kh,7:B}!~znv__A->(nGf]()RC̋ȲpկIbk~uePmyt|ZyPgr d+\j<{:9. V ,[ ?J2.(OY:\Fu[] dݳ29 U*u=w4eCPx+hq N3W`L>9E@?hq;e_'; Ins"gR, @H^#3Rػ~aK 'Q7 \s:$˰ uؚ^|h%5ZrREU9 y{ l狫vZV2i7І|nYA6u V2.?Sg›4謐\(B\!qXYUX>%j= 渵 miY.7Q7b .s ܉KI7)M2:NoCD1Fri{5 Iq`9C )s [~ǖthm&0 w Ӗ_gp nŢ [t(Zч@oYK9oV>ᅳ2؀L˜P&$S0" GDk\EJ},Y\ VL? >$I.(RTDQbf?kr(nkLp6P'm9_IF=uL K=vBI3-Ad~sPQ۟bӲ{-r']KWm=DKq7 `Cc<'\wFdX+"4>^,J*<Ì{KZ@]dtO&ò؈e^tCM٨ʋyoWipݛ GBivRqxV7c`Nвǚ̆1^"ؒX2:O'<}OY|`7>KR!i{gy:px#z݌KkVB9O/j+*&Q "3V ӛ̢_2K'^#̿h~y^UJ-S 3t"_bd 44vIx4"2o.>:OO~^!Q:uZ52MthDPRBb|.n!P*U!!v$ Gљz#cw&/>V߈ȗM@1R knj=dm|=sOκD>Λ`̝iEŖuK1Uf]5:WSڹ1;a4UӹŖhtjlZ3>`cZ1lٍ!x0U|~/0Gꨆ6nwVH&~0GeaN5d}$(:#`3誆 #Ӣ ksҤfAbiN[?dc*Mvc;\>sI(!⾥Ź9l.L!NM&\eK+}ǸE']ʹgԉbm r+4&nלs cj_ɲ:?K kQʗ5CYEQ-q-t";T/]hLb6҂cj67EDf?M v`xz:LYMr 4սIJx}nը#woq iH>b_9XƄa'DX4SL"{)QmDŽ$׶> ?!8F'( *{QKWLVzo"]nYfOgK0Oz7*#SDImdҜ!tp`fZg!d#ǁ\'GZ,#!`ccpnw;_|3⯌WϱcWhJC]gf^Q|Mqvp=hZ ƚ(䁟$w,,IxKʴ;u{$?'l Xk5]>^< %7`.)4JD3Ii!8M3;\ɲ^>)Kh-L.T:yz ϐo'iƾ76jKE"rB{g4c̽DОzi!Xs;NAA:&[wq3Rb0,M PoL9,%c喭]f8oA6 d#k 'õy+8yL3k8Gi6d?z@&j.min싢)3(k4EdZuO@WJTC܊8w@wܑ~%n1ѹ%V%yzEb<2Qi+yvn 0r0Yg`AJfihEN(&(#ʳ[UO [/x)̿+aiNMA#gm:~e= S <: qK J3q{Η&Ү7܄ uԒ{ۿ.繩n804tdGZrcN}6{@2Wב#h-Y",^2Ji~m nz&ɃN;gWjTP!IL6Q2*#'up=,dBb%4pD˿_aDπpMom78HM=G05]PoZpH0P-PLҴ*d1TLrb_HPUaPlXey6‘\o&>~2F.BIp%MZ5t>}_蠎hG%0be~#.)o|\+./|P'SIpf'._ };#-MK.iktԯ]EUt.RkΑr"j"sE', wXO"KVFU(S OLZRNWrakC2l9p;s*m7]D뭢U谜K-0[ >rʞ>^VpxrOW|͗,yV*^yVi  !L_0=/OQ9\䎈!Weٯ|'d\ :D ,8]n^^FV'n0f=.1A'!赉H.oZMh[/Rb{fd_J&ZZgPô®0JTipT9-0 '6=O ĮEwuEO_aQ|3M5%z]5NVU6OPldP=|RFw;0p1&%4a foޠMцO LɧI 0r%2#q'.\R =SE̝c ӝڰHpbzJEẄ́~DԮj8_\֤+b1TW\b`I6)a_]S 1A=]S_@9pi[n0e(xPNF&٣tƱ?˕65}ZMXu֍ɖ@>jo ͛6LWjiφ;ηi u?E殭=wOq5Ko/4ێ.mĂu]A-ظK#)~NF#X~^gb qt$0Pæ |#فKL8 Ĕ1d[aEQA;ďyD{Ol>'\($u=oiag^Y?У NIsyFFZv v ;{+1IK;T-S=:L.p>+j'%o-YsKnSA4jwi-Ċb$|yH: t~ݍűFwӍ?[p;yTV*A6KbN.TF4)ɽ=TҷoM_X+;Fu2wDM *#phAf,;Z %4~G}5 t-ó}~f34 ~V捀$  C {Ex\EwW DO}![r&/ucyGR#VR7;qj5⚈яµ[2wlQ&=3F('鍼=.FP_Y1y}zhBvS|bIXC#<69M3*V哣6,e5:bL=vAk3zbNz̨jff/yxs|/ۡrȰ"[h &մ,-zAM?cj =/_)prlv~Sȉ-a{3 L&} \OSbo SærY2Qrʹ7B=ȑ*J4t")_&Mԃs%y~w&ՃdOM:߲MԄڂ!٬*yjV@RǗdL͒9`lߙg-Wf[I:{`bhj@C6Ç" T@zŎ2mp&[M'zkdM{w3?m_?D$x!J$GԱ0f2WiFϼ>!Yzuy"`ЬԦ Nrk`y.J{eLs~~y~pc&b3)`ra[ XYgX 1~ \` ]{cN:qa,8d5# M|BR]U磖X!h@uAJFtF\@ pJNdó>#8f2.A=|٨%VqRrSB>pkϪ]M$1 0'yOfQхeΧަ);w7<5U]"R[۔{oT*4]F1hGbB̻h'hDΞ诂E&O' ܵ|3*̏S7'ȡ>IcFKK%Iʉy)'qZJ\4s:2ǩ`ꫂ˔,hSvk4(- ȭ.5PuA2NTa\DD=+&5\s9p,@wC0-בXbU191.Gm1Lrh&__iCxDovYlݘ2;W'unb ) iO2SQc?#p3%5I8 o˙&%1 WkŻ(_Xe9oV{-4tM SQ%8|vj˲C9qՉ DݪЀ)C=d{?5rHZNBELc0g6cۛRaH`=90h=~j.6j.]Qʓġ69Ó~SNhQ-OKe\(1[kgH=Nae*{/ιg %>gve1dPW!3L+%51^ J9~<5FB:yLTlZQ S'Ȭ| <W{̫1=Cl3`a-,*5Բ[;\*ys)yJ#Ymif by:CG]pLHwLYCdň-5#xi0/gg-p#@#B($Q*!o4L28:R+MtȢclDJT_U %G|+DxZۋlV0ܰbVGNiu ܃==Jt2 G՝? \lM0p(]5lf.N-ɐRBR! yu+"uv;A; S='$TA_aa;?1Z_G :LJaH"u46xަN)*ҧONI6HgԀ¦͋챱vfPmB Vm:>MivM|<d?6Ɇe8emF} ,H0ρ.')-FP]oߐr!o{gb K>1'y ( nZ Am X3Oz䠒'CˮWn]͢cnnrIu+DQqۇ>D1۔FB&sHsJ{@˝cO"5&vo.;qK+UlVOHRg>9卪^bZ?eIfbeOFN8\07YjD9Hԝ{dV/y1Nne䖼u-L;u^\XT8q#\%D7ʾQQD'|[{/%lK)m4$ud18NEMnS?k^܍̬%4cb)0hO B[Du;ʥPt+2ۺA,*Ak_W['~cU@ňHw'A{1GTpq- /fLUAӨ粸͍ bm<ހkhH}=cyDk XƏHcPC061ԥ׬}TghWrF"*t6R?kpi#TVwA Bp<<9Bq컫yܪZG$(5xk[iSQn MIxuoy/W= /0VQ Ź*yE"d#s)JAۤY ItH_ji4ګ+3)["łd/i٘ b$j|YclC4u1&kØ Κ`8EvJt`F|L?Y)|1$*$Q~&9[4)֊'F2!wItU-Mg4]oDZ2^R"}dHxetq3* >՛+=R:YO_:V hZ L h N.+?`g-@~Y6$H-+ʹo~&@;NXtbBOob3Nh&mu[QH^dzڟb1^D{5R.VUuK̕Q˄~ 0 L@"\mĎB|J" scknWvt]//HvV6Jފ,+Tafy` ȃ>#ӳY &D2@1o0_Cy r" R|#.ogJ0k' M ?=2yd$Rp'@Zm)RtVEœ%6JU׽-!E/vdLRލ߰}7Lx$dE}Tr>F:,$,'X!g{YEЋ"Eϯ[٫;9-YS87jdq&ì);.%?EoTT3aR8i0X1 *Qװr]r%n7Hf~`v%)PIm9bFo)H&K=(L!ݦw^~g87C,uS;uH3Z02Jb|MuA̩R[ Xz,kߦ,[[7rĄmXsGzIB+UPMk\+l2=x2Vф5afn9$qZȄ+>[Jj; Q4:k6>S?]|iD~){혺ZNX %86l)5; gP1Ehe7V %LLٳ,|P(Mym](<Ɏeۛuʵ pD2: ӯD2l>v%m!NwKY+X9X[|(qX/< V3;p.#'C(bяiPYGUٚgF}d\CHVDknxܒAH*棞(c 53œ0ӪO 2|뤷}(v4>4; ^h>ߩ9H@мU*zlG$HeQp2hT@.sF%C@$3j?d`ffԜ)fo73o1[^)hOٱahygr p )/EX01U"ddٕM5x0-ئ&F1J ć`~Wv@]n4 䆊匌OXTyMw:X ;h>/Vcla_lȅT\bT))r% :{~qCb(( ⷊo+W}V3>+{r 8꓉W>'Cާ2ϫ w׶^P `Çl||1jy4y;V/"p}@T1kneh`CIl2("UNEa1?ѵ7,DõfmOz{)io. _펬w'S!g/vQX{U@MIN$:@nŠdŎe||h|:tWcFLtKp) -yػ UJX5xpL2s)a%?؁Ρ@] -: ;Y.Jc QŭJx8dML"ZW?7ysUe }ZV_؞!z'5g.%T/ ܺ5lw&L5B棑ZcKM-B˛)\1R> +adPNIɎ=Q=`&yiz@V 'cvI(u*(ķzi=7P"{+E|CB2rN CkhW/̀5"b&8CbyIw'XA؞>~BrTnJIxl~k^MrԃkqS-+T>ПT4TwQ.`^`l , ƅ'-'3HtԬԵwEN}zq]3)9p9ܥ1_z}׷q;-2bO)xH6Zː=H]"_~}̭4HjlW#v܎Cn}Ode-Z5bYGfvЅ*hb@;l#'T\9Ӄ`?ǯUYx"u~f&HD+/3T0BqֽD)v$`4gTh RV>g5rk)&HFLYXܻ_ |lxV<Zk-$<"*lص(~ڈ0]9a-Gb5]cbN2==Bc@ {mc>:ȩW{)Ea ~ ӽg[/j}*BSbnHvk6׌ GVvu8N dbʖ9O^b끓}ޝp݀Sh:'3 IZr+As,r ~cܑl0(<{8OK3cIQ;p1@~%Z!z-FFَ(AEg پsA%΂7TiLS%`;`G= mH< R|[yDVwR)LJ^e+c;})OHHWWz1r9P7Iɯ 94 G ؅fjE8 W{03*߇ت+M)ڳX åB2ۑύ!Iag'/JzC,D\*1A`^8AJ NY tb'߶֥[ аB'Tm\lˁPK+xᮃ~@I;Lȅ18qҍoRE'DdBSMD Y:QW+f1Ң @oUtmj٨xґYe{pcr6VV/%ja3Z1>-کs"dŸ)ӟJpa£\njVJ;es%~g﷯QL 9 hYԾ\ ^*gpHgE_vb{2OUK}OeyЉil~c{{:YyN1x] iw; +x8ĹcTF?E;qx !YIÂ3kg* Nj*|*.D\ hOXjp ur˛)MTo~6⇟_NѲA= > _-# P7ys_3^,&W0~㖕;AOL]KV-G%sMpw#6bag䀐2-kA֩$QM"Y#\)Q)佃t+pRBCgQ6#ejӚV kNi$ 9 kxJAhTZBe%}Nf2>>'HG cn,F+hk(NoF,S"1N$E1ٰl?O`o}P2eqlVHR(y$TPl~de'0thx=) 1}D/tLyR0VKDBz_$d) _Hء~t5(up܂*`==`|MSz_<sobB^g;̺9e@ ]ӚĜ@şs-$A]"99Ty ^l-taDG8~EztH:Z h|)RphDư;tgi h 2F| +.|E8?JPrF޼5&@S=0w0^ ,Q [L=*hSbRe-g‰T%:vE q*YokY UJ=G(He1^ ӵs: iSv^,AcwFQw}mJ'mN ބ;cc|Srֈn$ go,͓M7zyXb2(n_^UB\IO 6,M% niwjdC!P=w`<)|fi!c-N8%tJƹo׬KtuUHM /tj3=DD?G RõY ̔1I#D+#Y/ *0֥ #e xl[;c {}^4;f'&"OL^VHrnԾnv+Ӛi(u~9;sXc&0%K֭ؔ$vm,mΦ=o ЄX<o~\v "C>+}/:"8!' ub*fC.fn!(zH3=iy 1DK1;,.|@jXQA|WɏW孝NQgO)dXu}c&_HGuB]2k{4* \a7ff?zxL4 6 dm]^O-iCwُ@cXPs% Wqx^<Kl$o<~&>n2:_6%>/a5a({ L`nr+妆puySVmY:yM g91#qo> pjzaXo;ПUK%޸y<[ljHO_jK}ÁL6 7VK7bbORwcDԢ&aU .)En\MK<)rd|Cg9c R RQ a4yy E*>M|4Sv7^DmA%@MikIES<)BQeѢ8<ȝծ)\Qb[/ x1΁ I=Zc"{{ZW5Nn+1qtPvqf>'_iZm Zip# INY%n4ӷ8^ש}g \8W, #hm9 kSMS܃D"A8l5> `?>.LxE0C8hI_j y% $b-N#DEޫI*51V I"2Ę/)Cz2 d֌v$0/٤>==X]6J I*hNӳsnF _E;XtVtn@Z@6ąm]2?F?<𸨳K:AD/ #ѣ*x/=jG@46G᪙+@ ,JX^MQQ})a=?..«=>\NV MnsARL#ITO&D'aTy"64E)nUns=\<F߬-xm(,KcgZxgRV>Mp!S;[مl54LT_^!ۅĨrBӒAs@)`vizȵ/{뱕 z*ݘu᝽6{+<|C w'Ňy>Ae@q{>yNHcܚPL3e+ӣde#1[98]!o."}9oāQV!uS,M9G?X,ݵmuBT 48H:b}O/h+81F;G۫juOK8smT./%)7gK.>$4z` eq X9\nRsC+LlmaP{4_"/b%'qVrx텒ss_2bLI#sDE7=ʾ*2z $~cK76B}3T^8Ȥd1\M!@cS,i*h<[5'Ufnؤ,[>oOT:@ rx~z_rexEޓ֞roK4 1+EOp|tb;DaG/1Aˊ/;b Bk_Yn/[k/F[0|}F!TIu0Ky:t*E~ 6e*y3$a ^Q.u`t j dJ OʍR+lultdqu?wUNe"R 81 aҳ3tGqYs8RBV̟w(kHVJ_=k_WEaVʍ ZZLel0ϖj;jg?tSi~}PT0ѝʪq{+O@88?NPx.L9]rz1 hQ)yMa[(liW ?@,$>kG1E?|tohQ!DيHj>x VM><.v1ù'`eA/&`2 _15 ]'pduRd%ZQ? қWOK3?Qt_0UxTM]0.u4;QxJ< eoM2Vu0ÍȒG$}JR'՘*3ɢ;:l"E4;>32VQ פNA:'s6\jrR !zB>.'Y3:SeL\ykU㝮NfJFkT͉D!nU\0z-~bD24)tv6f?W(E*% BVF{r $Few:oagAX1V5VNP1*ə{Kظ.١|^2e Bnni"~U^a0 d%+űŨe^B쌄ĩ_kIA ͊&]g'g/*as/I2^CmTc̫ӠW7ٲEO6+:BR,De2#$ƾ(a_P8Q=:#,"1vA0}!b7D fSaל/i "}UVBҨtfhx!.cg~uEJuC}\T%ǜ%Kc=(cv 4+U.R8PLcUq7b`!N3E_~:SyU j\AH̹s_>z'4瞦X)72_Y^Rp#0 م>n)n4_Ԡ_;h"~nB2M չ:RQ_=)7=a`ul>NUw%ȦX|RA\ͻM$[8!O't7Rzu>O*T/bXO^}mдnK8i)'7kn]Xڳ@(5$ EED=M@bu =kgM,!͂ۼH6l;:*1թM8R 1j`hi:qq5(ZaK,̵%%(T,iPٰE bcI[811P;_G. Rz!lRu|!g)  ˹& bK~43(:*GV4qvrQWh7O5'-ZHēޢ`.Dj *vS{ / !t)) di1}[.K<3 :V :^ IqsH Q,(䪜uLdhj+gʅqά'$Zp ^պc+ZWiC3^s/q1:@ !RGRsEuz,ce/ה>8E,sP3Vb~ cʾ`( ~-SRRR6j5rXQ)^l@ݾ=22( 8%4.PD-q.TRMS%F~Ռ%OIyJRcaa ,(TSY4Hrd)l9QEUm*^揸Š&0p7'bH%|oV VECxfC>^h"R˄O͛b2Re BO5Lh_Ѐc'ݢ2Z=mLnh9ƱM1lī n@oTHh_  t2$juZؕ#_#_ר˓AɟjQ޵UWԬfmo 3Ë́%Q&B_`ajٳtjpX̢ϱvvN U/&NZuF4Qd_>ΏxiSaOI497nOښ+"kzgDɉOw\-^D)bdފwJ97kv$5ܺߖ,zڂ Ne5> Hvq0Bǎ;}k倬;WH 'M<Ս8;X[T꘠ޠk'5{2]2z&RO3=$fXzRREaU񋻭u$XcrM.E UWM1GV @#tJڍ5{XżH ITiѳ\W' Z'2:s a?hq=~J'33Yɯ)mfzv?kKhRžw$LIO<;n>U oޕ u=NfB_}VvriYp򠁉-^"O!ؙkw$\c{H87FK\FC)T'd k V{q 3$JT>/,|py7-1k*gd$>!|)9O,Pվ$yQ`;_Lp Y"<8ks PV/ Tk1[MI>8z:fPN<6XzlZ.ZysvPK&!h?]/EY F΋X*,y129:(bcF~O@_]p.H?^l8?ʴ1|)N_zΑ}9)y> Ox\kJ>IoٴL2D\ @}YCU=xT@9Ts YpPO4ZVRq wʗZ{V?aM_!2W z7/X1AIu@GZ[̽%Oq 7KNwQ,r[oߴj]tPB6CH:Zn.3$?*? 2 1E-7QߧswtǏe*,VycfM>WM}nL2(GOh:ǖˣŇE3J34{='JC+Ma sB{ =̓Ylrp@B sSv1XZ׮#OwވB6\E^oK]4Mꨟd]<[3!V) L@.:zL?II9$2nƽ;υwcjZDwE~8.[ASrCƱatHbYK `ؐ`'*d4~+ϾĂ(u|w'*jnQ6TyKoJIT~a'aAб죟/nfpg7+ >GGhAg#%qm"}# T(8B^+u o Vl))KNݘHG >$ҽ-3i jj+@K7 1ㆻF%Thx.#@F4X=6 ~||r7Yǿ`3L=Xp5MiTi;qDN-25#AIjY*\42VȲw|y y챬}Qxi4[sIW( c/bq1aM';\`ל I5 >ZeHC;0:W=WSм&CR~5>+[꿲oɷW> AlґL[s"RYg֌Cȏm yR͠l,V~h#)}(/,{O`}چ܁f5u^<ڂs%i-C[-nf؂M5JĚ:)ЕR-7uy q꿹Z݃Ew۰/˛C`v9? .N˼2CŊKAXAB2t5>ҕ[w;HEg7;i@ kKsdQͅig<%!ԵimG GE]Z_ɺ`J1yoƹJ{-‘PpuuŖ|/\C/nA>/4oCwٯLN֒~U_R&f1\9XRfI_$xѻ-bm;\k֍)İ$#O_>xr\ninO/;6ϣa*bvQ0q(f/~k\_*1ŇSW^[R&&B 1`aMՏE5:c@liKVo 2B*}֨ho[r3WaЍB=nP7 N#skfYJ!;h }n*oǎ,r1y8֟]W~iR͛m:x6tAÚFo2mrPkbTYohƼ[B]3 xp*Xd355%J@㔮^HY: l[&`FDő\mM;RrUFpRp/tƫϸgi`pQb0|cQF2~j` B wZ9bQVT bɉlVr>Quc6t^f b5c\Uu {[O~C6Oщy)%IQ.Ez%? Wdzqv)aYgi57n,_ Lɥ`\t785k~Qi䱜[SuBKW&/Ԟq.oU9ʻYɥws{Ka #O&<-;s3bc UHZ:(eVJ^jœ)ιT.P웰exQ8K+os0WCe`B<6) hh3U$Wݔ?D} T)"i01cQFвs7'up6mB1!c_-#+PdզK[ 7XTi2' {usThlن)׼H7o1:z|g=[Ri"G ?IG@ ,ȶ06\e$'2ȭY Wepqz[Pw%%I--bqȻ- n]_iU{KuɭI޸r:%ڠ1jy<(hvavqS3qk҅0u["J +|溵:V&am4%DWVԝūPA,m6Zi,oEukͩ` ߩO VedCG*}P/ƞMgp]s]P0R&R% Zs(}E ;*v-f{E 5O8Tm/Ϭ`,\])OmZ9szX;N* 5^=f dF˴1 պÀkBٸuW [?2Ie`Ws41(:p&ԉ*Yȯ}E>' Jtf X$H) Egf B߲Gd cqᦊ >Nnc7EGfG"yVGƖ lEPr%DEnm ,i=ѢLXFy?:u9 ed|r7(`;.qpAQ$4z|28-mbswk;^r5F4a#aB%T jڽw'q̸ g-k{jB8ˢ{"%*0cm,jE WQ ]Jבc祩5;.ARd5 M)a=$/\I^ C^  K[lWUaɁs(5^p S$A"eԤM݁rƋk#E7OMTetg嵙Yvl7!'n:PѳK|EWrmjMUt\T㩕kP% Դ [bg,V ];6_+.?Z\f,=5 GG@?kP;ؐ/78^ :ht7}\ov=)XV a1ckDc!S5DZˬYl7'(%;tgf5Ht&tf'+0 VK-#Q~.q74Eu +KUnA1lrG/O,'T4|ԷdZ>Ɠ|kwIe?%ye(g$#bU11/){-ho:.;A$"#(1iNJוg>?ha6卲s>DtI; %äb`"x:67iv) r"OT^="(`_m8v"&90Ѵ#T#} ҋ-AYa`8;Q:yysχ]w(ssVs8۾E*:Ki>-Ly2.P{ M*59(RQ ^~* @7kr}Jsv܀bZGFK96TGOnXWl(@YsI,{!tOzp?7η{l(& ~+w`nuZQ9>(^2$419PkD"Z#uF_@սa`f-6Vz{N?!,)VLc!UG8n* ,V[PFIAt *|>%pSp_BxCrh* ?!i^ m'yc%BQYjb c~\ ?guN+52&s3g 8̼À^kM-ax=s+޴25NKh_%NPw-o)tN*6!A, t7k2bSp_R~erpi<3όwawq9C~/@3Y S?/R%keR1:ut,[b{2}M/8>֎$v!n\74><t/@e}߳{`mSzQH~q!갵tk uв{2y=(ϣ!FM@\6qqz #sFnch D7rg~5bc+b.saµ?7y'ՏwZ )&iZ^' B/_FOד)w5Tv%Ѡv$r] %>Ș"l~̍Pmz-UwBdPeOf˒7"^10g-9k\Nv\ջ%ߩ*Enol%Hua8S$ 5Oaewٻ 9R-콡lLk;gXcϩ0R=Q(M$- z=U*þPifըh,6+%ӚZ+Fmbk4l~βi;Ӡ9IV& !*tEin65@@r!`Ǩ#L&׿'(ӑP0n2g窾ndה\ƹ]UjTΓ/} Owz@ST ;tۡd1)-Mh3x2d߈ԕ~f\ҷwZ,dj&fӭu?-h[o,z ư{樶\j2bpD~WԑWA 0bK~_3ǀ%ԥB%:%Y=\RVHN(E/ٳ;wi 0Ӆ[ϖ!_rDȵbի([I7 mmDe>Yjzl0qp 7xZ<^Hq9ffeѩa˗f>+E>QY͔!}"Ck@֘~ME==C + =6r7W-G\Nv64g/NMJs@wx(dL<CuRQ#7tſ_ H0ݼ9+r׍ IAmu"% 7?HB~fsm٨S9ѷ=<gs=CxI(2kWQ/NVWRfRXFClc:`$O4hh%JYty(vxeDGC`K7`_T_G2mUVU;SJ H9 ^$Ve=/TzKC'(}T'CBgב 91^/C86sbMxha, e8v7}orw̒sDXW|oWLؘ6$VWu浠{~t|m fĆO g_VV %?9+7T(,pM `y>ףQАb |p7[=W@賂6N힝 z:9U*sӥc*kQ.? iqѕ秠KϸH0<+Z~qSjxPd2q~f#V;̦s/,WJg˲ݪ`c͑oO'{@hj϶@ʳs ^ cb'В W2UєޙM` E;VH}ۦ=Y@3K+%Xkɿ%w )12('V:0Yk1?HLϓf^یz&r9X݂vQ`YohbӠЬ@ZLj?ːO˯%!w]Q.̩Y }^d %㟓Q.>7K>A?2؏{KMV?TbE6zho :v@d]v< ĵrBWXQu{0gh$$7(n:W #H!fyqqnM|%n=jX :mt sM)\ f=;1H.xo$d+pJpU@* PPsh ~ LU;q38jV^㊄\证&o0ǩ^7פ]JB>bpwVJcMZw¸C:I\#;pɚ?Ogd~ B D&L4kxkJ }ƪ7ezlֽV)gt\P=@| Nz?vpd]&=v3 VJFp|3 x>1p=H( FpѱyXK#,,1n%Aǘgs_gMIDm}+ C "QCl"L[|<o$ ɸ K00EJ8z.>w3âȫLM#!rG%hv.TњEkjL;ܛF]~Bc0[$&ݼ6$=;\;4RQղ9 w\e/w7~4#+'T=( DD`cx WQзxL#jQ %qN9*Iaj(kd\=S'-펗S<Ɋ=Y$M='ss} U1X=/k"زLG g)x&r:mZX3gIÖ5l,s }>OҙΫg-T]!%;h3E:W+sK5DN=ȎJ bxGg'g%'(Gfhe#I0kɢLppH_úÇIsbYҼ0w$`g d*2UW~JvC'SB;*NBn#a=:+lk6+ 1$9K N*\W_Cȷf)A"~W'< |=WH[[ eЕ BUD/E  cc4VL'@ee;C+$x\J!N*j`:BNp3@t֗:Gтw?h*kjs,:6U7uI"wAw W5h6dEGB|YQ"DΞn[!|"DBZi$>ɊT F4FK>}aun3 mIN9d ] d0u&#'<]սQ"!霴=1`iHMfcN؇=+AI7bh7z87eIbI-clBD(@ xTүqc`+/M%C+N~/qWVk;VX{?JVIQ }j~Xw2_"PRs6fC!A =wi`83e?_תTr>>94[2NvNFI~qYE;%Oƒz k/{[{` :rZgmVmE0) 0tNbe[A͍{ 3FMK⧗a7PQ]ʹ{= cT2pynlӑ6ݡ%㓂2D5%bD v6C, O+`kPw3U|b2&|ôR!lm 5yZHR5sE]`k9^L({DzofNСn6պ{jƄv$1( e~>ƾ^.8=t R,mn$Me-؀ @ 3NѬgP"gp[|+9FOښK8/vdlvT=m+;Tց)-~"?[ mCFd1'aj1ڌ@zܘm>5;?# 9p'o7w$}卲o3a&dDK=ًnESNO4Os_%SQN˛~W#U5*geRg&Żr?FNtѪ֫|Eݨd ղ Ypν}M'i\HGE1 tk.{%&߹m9+g^!'͉L g%A ۂʩZi>WR*S?']pB;y5OâK*s3'.ޞ6 /#]ɨ@tfHk]a͖9RO{ < F[1ˢs ub a55wmg&;)Ůj,awID8Tc*/Й,! &87010P.qR[(vaZs_{~6s c٥v|vLI}]T2 ʿ8BYIC*n֠enQ 53 98xcK^ ^ۨnl\j Fkc۰2+NTmy/0ZVZJXRgq QeI6U'ۮIB͝oZtDt<lwg=&Nw-M;c_ʏzx6V a+{1MT2<~lա`\hEa'OEm GL./ğ4q F0@Ǫ\ p]BoŽ]u;%4i1An,<`RfƼUALa@I2Jq(SX6 8x}F]G=qA< &hGĈj;yMBIWKk#-H}Q⵺HZS^1$^ &yA%p'x5g+T!,>;65H#x)ŕX̂errFZ4L Hm,M},܋-ضom 08ňo~䚗"%w"VKɒS14xinj )s%WD| ݮ鯊"$ި>o$q򲧫 |)J$fۼ;F;U6JöLX@O6% yj!XJb* ;rDҗe:ޅjF%۟[jgp]XZw2%v-OG?NBEF$h߻b"~xB(M:+پ^CLaGͨ+COEد[i;7!uXXPcW#ƙB>ўe#]u!5}<jMB-[y}(_.jhjW릦5̂Z*9-,xv1=nfo'J5qㄤQH>E?%D juLԇHS: ^&Rn ˡPQ+bj Ӛ2Yf8qzt~HZ1&-cv =Q밬^PAytRkҏ!=6|ۡ>hVyQ)ocw74'&i[CBKpTm Пaa!p^\D?یSeYa£ iqJg crOG $]fTBϕ} R`MNvT #ne>^g%:#Z"vA }6g9]%k抟l_?'ԛè66 2S<1\ I:c p&Y@Cz^zbx݂1RVc7POӠI,),p:0j@GT~ +`d#zN)&- p#p8") bLbɒÈL^|pUENLM ;j|+M i9jBdxSbtqE m@)M 1PJv..MBWţp7Q> Ǹ߶M?i3)Lj>}L=A~+盻xDDel.K"kF~K&8YS*%wGaչ߼|RIi.#>Ŕm3ņ1=I󘄛!]|ZV+$9%쥸ҵW)=^fLAMHvz9S$g`$3 ̋B]~ ,;d|O lZ6ӫbr16Ǯ38 ,ҳ HVP޺@th11۶k{ .t/ u p䏅|$Tk& _$)xg R{aiJ6 BoO y`DޫJ^z:?E4M۲R-YآK IvqYDx"2>~0KyR~ -`p~ߨ>.Ր0y{yu4hzBB׋׀z*$FU&GCkz'U>mbi H'>%Mu>zNXV `0b?Ji!ɔ 6RJUk53OUi9ӂCzyNZNs:ԁTQvc#\+:nʝeͲǚO4|Ѐ1zz$MhV`Stٌ֟+Lۺ@'L]H5 OPxkH,9R!w\r.>%qɶ'%)n^h^܎;@& *LJZx^[UP{ƯN;[ x$yi"KC`:n٤:d֔jU#TKb<⸇NaD N O`x3^HV,HM.{D*Ux=gG9jRKXUttu5J㡫}le\R]<(.$DU߁=e瘜AQBs lft5nàe B[¨^ @֊(qe+G:ֽNhD8ڄOAQ+, z :UzS}~<tb>-JgS@9~S-Y^f?2+*ۀ ?<^SN,i3oRY; ]DL`H& kN*m4o"1'z7"D%)D KۅT<rH&~a0iΗoު;p#PӷVwJ O͓ӔU460ݛ <;]~<,K (hUl CkT7bqID?r*IS&OQhm OV i ?LfK+1w(6:IPw.ZY[Q:߫r,UhLnvMmLx~\ 6 3X85kֳ`JW܎*vp:RY: eeBL$iָ?+VjRҼdu؎vЍ?vԣ kImEߡXPT3w G`PFoZC FKVPZJ?5$63y#zk`ߚ=φ@RCOgbBsJdG0zeO9n%L;ab+gdv1^ɸ|+J9A&AˢMQ|dRм2ò4kH%<݃%Q@YZsusieR/inst/CITATION0000644000176200001440000000202613755042336013646 0ustar liggesuserscitHeader("To cite the susieR package, please use:") citEntry(entry = "Article", title = paste("A simple new approach to variable selection in", "regression, with application to genetic fine", "mapping"), author = personList(as.person("Gao Wang"), as.person("Abhishek Sarkar"), as.person("Peter Carbonetto"), as.person("Matthew Stephens")), journal = "Journal of the Royal Statistical Society, Series B", year = "2020", pages = "forthcoming", url = "https://doi.org/10.1101/501114", textVersion = paste("Gao Wang, Abhishek Sarkar, Peter Carbonetto and Matthew", "Stephens (2020). A simple new approach to variable", "selection in regression, with application to genetic", "fine mapping. Journal of the Royal Statistical Society,", "forthcoming")) susieR/inst/analysis/0000755000176200001440000000000013476534107014336 5ustar liggesuserssusieR/inst/analysis/test_susie_auto.Rmd0000644000176200001440000000167413335050146020217 0ustar liggesusers--- title: "Test susie auto" author: "Matthew Stephens" date: "5/2/2018" output: html_document --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ``` The goal here is to test the function `susie_auto` which tries to make susie run well even in some tricky situations (eg where $L$ is big, which susie is not well suited to). This is an example Lei Sun showed us from the paper demonstrating that false positives occur early on the Lasso path. Here I change L to 20 instead of 200 to make it run fast to begin with. ```{r} set.seed(777) library(susieR) L <- 20 X <- matrix(rnorm(1010 * 1000), 1010, 1000) beta <- rep(0, 1000) beta[1 : L] <- 100 y <- X %*% beta + rnorm(1010) ``` ```{r} s <- susie_auto(X,y,verbose=TRUE) s$sa2 ``` Now try L=200 ```{r} set.seed(777) L <- 200 X <- matrix(rnorm(1010 * 1000), 1010, 1000) beta <- rep(0, 1000) beta[1 : L] <- 100 y <- X %*% beta + rnorm(1010) s2 <- susie_auto(X,y,verbose=TRUE) s2$sa2 ``` susieR/inst/analysis/testing.Rmd0000644000176200001440000000612113335050146016445 0ustar liggesusers--- title: "test.Rmd" author: "Matthew Stephens" date: "4/14/2018" output: html_document --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ``` # simulate data This is Lei's example ```{r} set.seed(777) library(susieR) X <- matrix(rnorm(1010 * 1000), 1010, 1000) beta <- rep(0, 1000) beta[1 : 200] <- 100 y <- X %*% beta + rnorm(1010) s = susie(X,y,L=200) plot(coef(s),beta) s$sigma2 # fit <- lm(y ~ X - 1) # mlr.p <- log(summary(fit)$coefficients[, 4]) # mar.p <- c() mar.betahat = c() for (i in 1 : 1000) { fit <- lm(y ~ X[, i] - 1) mar.p[i] <- log(summary(fit)$coefficients[, 4]) mar.betahat[i] <- summary(fit)$coefficients[, 1] } # # pdf("pvalue.pdf", width = 10, height = 5) # par(mfrow = c(1, 2)) # plot(mlr.p, ylab = "log(p-value)", main = "Multiple Linear Regression") # abline(h = log(0.05 / 1000), lty = 2, col = "red") # legend("right", lty = 2, col = "red", "log(0.05/p)") # # plot(mar.p, ylab = "log(p-value)", main = "One-on-One Linear Regression") # abline(h = log(0.05 / 1000), lty = 2, col = "red") ``` Notice that the coefficients are monotonic with betahat. Some shrinkage of zero values is evident, but it is not enough... presumably because sigma2 is way over-estimated. And further we see excessive shrinkage of true signals, presumably because sa2 is too small. ```{r} plot(coef(s),mar.betahat) ``` Here we try fixing $L$ and residual variance to true value. ```{r} strue = susie(X,y,L=200,residual_variance =1,estimate_residual_variance =FALSE) plot(coef(strue),beta) strue$elbo ``` it works!! ```{r} plot(strue$alpha[1,]) plot(strue$alpha[2,]) ``` Try with very small residual variance ```{r} s3 = susie(X,y,L=200, residual_variance = 0.01,estimate_residual_variance = FALSE) plot(coef(s3)) s4 = susie(X,y,s_init = s3) plot(coef(s4)) s4$elbo ``` That is weird it goes away from the solution! Try with estimating prior: ```{r} s5 = susie(X,y,s_init = s3, estimate_prior_variance = TRUE) plot(coef(s5)) s5$elbo sqrt(s5$sa2) sqrt(s4$sa2) ``` much better! Now try too many effects ```{r} s3.300 = susie(X,y,L=300, residual_variance = 0.01,estimate_residual_variance = FALSE) s5.300 = susie(X,y,s_init = s3.300, estimate_prior_variance = TRUE) plot(coef(s3.300)) plot(coef(s5.300)) s3.300$elbo s5.300$elbo sum(s5.300$sa2>0) ``` Now try too many effects but just a very small number of iterations for initial case: ```{r} s3.300.5 = susie(X,y,L=300, residual_variance = 0.01,estimate_residual_variance = FALSE, max_iter = 5) s5.300.5 = susie(X,y,s_init = s3.300.5, estimate_prior_variance = TRUE) plot(coef(s3.300.5)) plot(coef(s5.300.5)) s3.300.5$elbo s5.300.5$elbo plot(colSums(s5.300.5$alpha)) ``` Q: does the initial run with small variance gradually find the smaller effects, or does it get them from the first iteration? Could look at that by doing one iteration at a time. ```{r} s3.300.1 = susie(X,y,L=300, residual_variance = 0.01,estimate_residual_variance = FALSE, max_iter = 1) plot(coef(s3.300.1)) s3.300.2 = susie(X,y,s_init=s3.300.1,estimate_residual_variance = FALSE, max_iter = 1) plot(coef(s3.300.2)) s3.300 = susie(X,y,s_init=s3.300.2,estimate_residual_variance = TRUE) ``` susieR/inst/analysis/optimize.Rmd0000644000176200001440000000227713335050146016640 0ustar liggesusers--- title: "optimize" author: "Matthew Stephens" date: "4/15/2018" output: html_document --- ```{r setup, include=FALSE} knitr::opts_chunk$set(echo = TRUE) ``` Diagnose optimization issues with Lei's example ```{r} set.seed(777) devtools::load_all(".") X <- matrix(rnorm(1010 * 1000), 1010, 1000) beta <- rep(0, 1000) beta[1 : 200] <- 100 y <- X %*% beta + rnorm(1010) s = susie(X,y,L=1,estimate_residual_variance = TRUE) Y = y-s$Xr s2 = s$sigma2 x = seq(1,100000,length=100) l = rep(0,100) lg = rep(0,100) for(i in 1:100){ l[i] = loglik(x[i],Y,X,s2) lg[i] = loglik.grad(x[i],Y,X,s2) } plot(x,l) plot(x,lg) # > which.max(l) # [1] 23 # > lg[23] # [1] -2.398905e-07 # > lg[22] # [1] 6.282734e-07 lx = log(x) l2=l lg2=lg for(i in 1:100){ l2[i] = negloglik.logscale(lx[i],Y,X,s2) lg2[i] = negloglik.grad.logscale(lx[i],Y,X,s2) } plot(lx,l2) plot(lx,lg2) y = seq(0,20,length=100) l3=l2 lg3=lg2 for(i in 1:100){ l3[i] = negloglik.logscale(y[i],Y,X,s2) lg3[i] = negloglik.grad.logscale(y[i],Y,X,s2) } plot(y,l3) plot(y,lg3) uniroot(negloglik.grad.logscale,c(-20,20),extendInt = "upX",Y=Y,X=X,s2=s2) ``` So, to summarize, problem seems to be that optim has issues with very flat initial gradient near 0. susieR/inst/code/0000755000176200001440000000000014143477741013427 5ustar liggesuserssusieR/inst/code/gen_original_results.R0000644000176200001440000000411613607476333017772 0ustar liggesusers## results from original susie devtools::install_github("stephenslab/susieR") library(susieR) create_sparsity_mat = function(sparsity, n, p){ nonzero = round(n*p*(1-sparsity)) nonzero.idx = sample(n*p, nonzero) mat = numeric(n*p) mat[nonzero.idx] = 1 mat = matrix(mat, nrow=n, ncol=p) return(mat) } set.seed(1) n = 100 p = 200 beta = rep(0,p) beta[1] = 10 beta[2] = 10 beta[3] = 10 beta[4] = 10 X.dense = create_sparsity_mat(0.99,n,p) y = c(X.dense %*% beta + rnorm(n)) L = 10 residual_variance = 0.8 scaled_prior_variance = 0.2 s = list(alpha=matrix(1/p,nrow=L,ncol=p), mu=matrix(2,nrow=L,ncol=p), mu2=matrix(3,nrow=L,ncol=p), Xr=rep(5,n), KL=rep(1.2,L), sigma2=residual_variance, V=scaled_prior_variance * as.numeric(var(y))) X = susieR:::set_X_attributes(X.dense) Eb = rep(1, p) Eb2 = rep(1, p) s2 = residual_variance V = scaled_prior_variance objective.original.res = susieR::susie_get_objective(s) saveRDS(objective.original.res, 'objective_original_res.rds') Eloglik.original.res = susieR:::Eloglik(X,y,s) saveRDS(Eloglik.original.res, 'Eloglik_original_res.rds') ER2.original.res = susieR:::get_ER2(X,y,s) saveRDS(ER2.original.res, 'ER2_original_res.rds') SER.original.res = susieR:::SER_posterior_e_loglik(X,y,s2,Eb,Eb2) saveRDS(SER.original.res, 'SER_original_res.rds') singleReg.original.res = susieR:::single_effect_regression(y,X,V) saveRDS(singleReg.original.res, 'singleReg_original_res.rds') vbupdate.original.res = susieR:::update_each_effect(X, y, s) saveRDS(vbupdate.original.res, 'vbupdate_original_res.rds') susiefit.original.res = susie(X.dense,y) saveRDS(susiefit.original.res, 'susiefit_original_res.rds') susiefit.original.res2 = susie(X.dense, y, standardize = TRUE, intercept = FALSE) susiefit.original.res3 = susie(X.dense, y, standardize = FALSE, intercept = TRUE) susiefit.original.res4 = susie(X.dense, y, standardize = FALSE, intercept = FALSE) saveRDS(susiefit.original.res2, 'susiefit_original_res2.rds') saveRDS(susiefit.original.res3, 'susiefit_original_res3.rds') saveRDS(susiefit.original.res4, 'susiefit_original_res4.rds') susieR/inst/code/sparse_matrix_strategy.Rmd0000644000176200001440000001203013703336624020665 0ustar liggesusers--- title: "Sparse matrix multiplication strategy" author: "Kaiqian Zhang" date: "`r Sys.Date()`" output: rmarkdown::html_vignette vignette: > %\VignetteIndexEntry{Sparse vs. dense matrix operations} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r setup, include=FALSE} knitr::opts_chunk$set(collapse = TRUE,comment = "#",fig.width = 4.5, fig.height = 3,fig.align = "center", fig.cap = " ",dpi = 120) ``` ## Set up environment ```{r, warning=FALSE, message=FALSE} library(susieR) library(Matrix) library(microbenchmark) library(ggplot2) set.seed(1) ``` ## Goal Our intention is to use sparse matrix multiplications to help reduce computation time. ## General strategy Given a large sparse matrix `X`, we want to compute some matrix multiplications associated with a scaled $\tilde{X}$. We notice that after scaling, `X` becomes a dense matrix and is not possible for a sparse matrix multiplication. So we construct formulae to apply sparse matrix multiplication first on a standardized `X` since standardization does not affect its sparsity. Then we perform centering to get the same result. ## Types of matrix multiplications There are two types of matrix multiplications we want to investigate: + Compute $\tilde{X}b$, where $\tilde{X}$ is an n by p scaled matrix and $b$ is a p vector. + Compute $\tilde{X}^Ty$, where $\tilde{X}$ is an n by p scaled matrix and $y$ is an n vector. ## Results This strategy has a decent performance when computing both $\tilde{X}b$ and $\tilde{X}^Ty$, compared to simple matrix multiplication `%*%`. ## Strategy formulae details ### Computing $\boldsymbol{\tilde{X}b}$ Suppose we want to compute $\tilde{X}b$, where $\tilde{X}$ is a scaled n by p matrix and $b$ is a p vector. Our goal is to express $\tilde{X}b$ into a term involving unscaled $X$ matrix multiplication to achieve sparse matrix operation. \begin{equation} \begin{aligned} \tilde{X}b &= \sum_{j=1}^{p} \tilde{X}_{\cdot j} b_j \\ &= \sum_{j=1}^{p} \frac{X_{\cdot j}-\mu_j}{\sigma_j}b_j \\ &= \sum_{j=1}^{p}\frac{X_{\cdot j}}{\sigma_j}b_j - \sum_{j=1}^{p} \frac{\mu_j}{\sigma_j}b_j \\ &= X b / \sigma - \mu^Tb/\sigma, \end{aligned} \end{equation} where $\mu$ is a *p*-vector of column means, and $\sigma$ is a *p*-vector of column standard deviations. ### Computing $\boldsymbol{\tilde{X}^Ty}$ Suppose we want to compute $\tilde{X}^Ty$, where $\tilde{X}$ is a scaled n by p matrix and $y$ is an n vector. Similarly, we express $\tilde{X}^Ty$ using unscaled $X$ so that we can perform sparse matrix multiplication. We have the following: \begin{equation} \begin{aligned} \tilde{X}^Ty &= \sum_{i=1}^{n} \tilde{X}_{i.}y_i \\ &= \sum_{i=1}^{n} \frac{X_{i.} - \mu}{\sigma}y_i \\ &= \frac{1}{\sigma}\sum_{i=1}^{n}X_{i.}y_i - \frac{\mu}{\sigma}\sum_{i=1}^{n} y_i \\ &= \frac{1}{\sigma}(X^Ty) - \frac{\mu}{\sigma}y^T 1, \end{aligned} \end{equation} where $\mu$ is a *p*-vector of column means, and $\sigma$ is a *p*-vector of columnwise standard deviations. ## Simulations We simulate an `n = 1000` by `p = 10000` matrix `X` at sparsity $99\%$, i.e. $99\%$ entries are zeros. We compare results between normal matrix computation and our sparse strategy as well as comparing speed using microbenchmark. ```{r} create_sparsity_mat <- function(sparsity, n, p) { nonzero <- round(n*p*(1-sparsity)) nonzero.idx <- sample(n*p, nonzero) mat <- numeric(n*p) mat[nonzero.idx] <- 1 mat <- matrix(mat, nrow=n,ncol=p) return(mat) } n <- 1000 p <- 10000 ``` ```{r} X.dense <- create_sparsity_mat(0.99,n,p) X.sparse <- as(X.dense,"dgCMatrix") X.tilde <- susieR:::set_X_attributes(X.dense) #returns a scaled X if input is a dense matrix X <- susieR:::set_X_attributes(X.sparse) #return an unsacled sparse X if input is a sparse matrix #but computes column means and standard deviations ``` ```{r} b <- rnorm(p) y <- rnorm(n) ``` ### Benchmark for computing $\boldsymbol{\tilde{X}b}$ The final results of two methods when computing $\tilde{X}b$ are very close. ```{r} res1 <- X.tilde %*% b res2 <- susieR:::compute_Xb(X,b) max(abs(res1 - res2)) ``` ```{r} compute_Xb_benchmark <- microbenchmark( dense = (use.normal.Xb <- X.tilde%*%b), sparse = (use.sparse.Xb <- susieR:::compute_Xb(X,b)), times = 20,unit = "s") ``` Our sparse strategy demonstrates an obvious advantage over the normal matrix multiplication in computing $\tilde{X}b$. ```{r} autoplot(compute_Xb_benchmark) ``` ### Benchmark for computing $\boldsymbol{\tilde{X}^Ty}$ The final results of two methods when computing $\tilde{X}^Ty$ are almost the same. ```{r} res3 <- t(X.tilde) %*% y res4 <- susieR:::compute_Xty(X,y) max(abs(res3 - res4)) ``` ```{r} compute_Xty_benchmark = microbenchmark( dense = (use.normal.Xty <- t(X.tilde)%*%y), sparse = (use.sparse.Xty <- susieR:::compute_Xty(X, y)), times = 20,unit = "s") ``` Our sparse strategy evidently has a better performance than the normal method in computing $\tilde{X}^Ty$. ```{r} autoplot(compute_Xty_benchmark) ``` susieR/inst/code/finemap.R0000644000176200001440000000661313350071146015163 0ustar liggesusers#!/usr/bin/env Rscript library(dplyr) library(readr) library(magrittr) #' FINEMAP I/O write_finemap_sumstats <- function(z, LD_file, n, k, prefix) { cfg = list(z=paste0(prefix,".z"), ld=LD_file, snp=paste0(prefix,".snp"), config=paste0(prefix,".config"), k=paste0(prefix,".k"), log=paste0(prefix,".log"), meta=paste0(prefix,".master")) write.table(z,cfg$z,quote=F,col.names=F) if (!is.null(k)) { write.table(t(k),cfg$k,quote=F,col.names=F,row.names=F) write("z;ld;snp;config;k;log;n-ind",file=cfg$meta) write(paste(cfg$z, cfg$ld, cfg$snp, cfg$config, cfg$k, cfg$log, n, sep=";"), file=cfg$meta,append=TRUE) } else { write("z;ld;snp;config;log;n-ind",file=cfg$meta) write(paste(cfg$z, cfg$ld, cfg$snp, cfg$config, cfg$log, n, sep=";"), file=cfg$meta,append=TRUE) } return(cfg) } #' Run FINEMAP version 1.1 #' http://www.christianbenner.com ## FIXME: read the finemapr implementation for data sanity check. ## Can be useful as a general data sanity checker (in previous modules) run_finemap <- function(z, LD_file, n, k, args = "", prefix="data") { cfg = write_finemap_sumstats(z, LD_file, n, k, prefix) cmd = paste("finemap --sss --log", "--in-files", cfg$meta, args) dscrutils::run_cmd(cmd) # read output tables snp = read.table(cfg$snp,header=TRUE,sep=" ") snp$snp = as.character(snp$snp) snp = rank_snp(snp) config = read.table(cfg$config,header=TRUE,sep=" ") # Only keep configurations with cumulative 95% probability # config = within(config, config_prob_cumsum <- cumsum(config_prob)) # config = config[config$config_prob_cumsum <= 0.95,] # extract number of causal ncausal = finemap_extract_ncausal(cfg$log) return(list(snp=snp, set=config, ncausal=ncausal)) } rank_snp <- function(snp) { snp <- arrange(snp, -snp_prob) %>% mutate( rank = seq(1, n()), snp_prob_cumsum = cumsum(snp_prob) / sum(snp_prob)) %>% select(rank, snp, snp_prob, snp_prob_cumsum, snp_log10bf) return(snp) } finemap_extract_ncausal <- function(logfile) { lines <- grep("->", readLines(logfile), value = TRUE) lines <- gsub("\\(|\\)|>", "", lines) splits <- strsplit(lines, "\\s+") tab <- data.frame( ncausal_num = sapply(splits, function(x) as.integer(x[2])), ncausal_prob = sapply(splits, function(x) as.double(x[4]))) tab <- mutate(tab, type = ifelse(duplicated(ncausal_num), "post", "prior")) return(tab) } finemap_mvar <- function(zscore, LD_file, n, k, args, prefix, parallel = FALSE) { if (is.null(dim(zscore))) { zscore = matrix(ncol=1,zscore) } single_core = function(r) run_finemap(zscore[,r], LD_file, n, k, args, paste0(prefix, '_condition_', r)) if (parallel) return(parallel::mclapply(1:ncol(zscore), function(r) single_core(r), mc.cores = min(8, ncol(zscore)))) else return(lapply(1:ncol(zscore), function(r) single_core(r))) } eval(parse(text=commandArgs(T))) dat = readRDS(input) sumstats = dat$sumstats N = nrow(dat$data$X) ld = tempfile(fileext = ".ld") write.table(cor(dat$data$X),ld,quote=F,col.names=F,row.names=F) posterior = finemap_mvar(sumstats[1,,] / sumstats[2,,], ld, N, k=NULL, args, prefix=tempfile(fileext = ".finemap")) saveRDS(posterior, paste0(output, '.rds')) susieR/inst/code/susie_rss_memory.R0000644000176200001440000000163314141046730017150 0ustar liggesusers# export MEM_CHECK_INTERVAL=0.01 # python3 monitor_memory.py Rscript susie_rss_memory.R # # NOTES: # # - Without any improvements: # Size of X: 0.5 GB # max rss_memory: 4.15 GB # # - With some improvements, the initial steps right before the main # loop use 0.86 GB. # # - susie_rss right before the CS and PIP calculations uses 1.6 GB. # # library(susieR) devtools::load_all() # set.seed(1) # p <- 8000 # n <- 1000 # X <- matrix(rnorm(n*p),n,p) # y <- rnorm(n) # ss <- susieR:::univariate_regression(X,y) # z <- ss$betahat/ss$sebetahat # R <- cor(X) # save(list = c("X","y","z","R"),file = "susie_rss_data.RData") load("susie_rss_data.RData") cat("Size of R:\n") print(object.size(R),unit = "GB") cat("Running susie_rss.\n") set.seed(1) out <- susie_rss(z,R,estimate_prior_variance = FALSE,min_abs_corr = 0, check_input = FALSE,refine = FALSE,verbose = TRUE) print(sapply(out$sets$cs,length)) susieR/inst/code/susie_memory.R0000644000176200001440000000131614141046730016257 0ustar liggesusers# export MEM_CHECK_INTERVAL=0.01 # python3 monitor_memory.py Rscript susie_memory.R # # NOTES: # # - Without any improvements: # Size of X: 1 GB # max rss_memory: 4.70 GB # # - With the improvements: # Size of X: 1 GB # max rss_memory: 3.00 GB # # set.seed(1) # p <- 16000 # n <- 8000 # X <- matrix(rnorm(n*p),n,p) # X <- scale(X,center = TRUE,scale = TRUE) # y <- rnorm(n) # save(list = c("X","y"),file = "susie_data.RData") # library(susieR) devtools::load_all() load("susie_data.RData") cat("Size of X:\n") print(object.size(X),unit = "GB") cat("Running susie.\n") set.seed(1) out <- susie(X,y,estimate_prior_variance = FALSE,min_abs_corr = 0, verbose = TRUE) print(sapply(out$sets$cs,length)) susieR/inst/code/monitor_memory.py0000744000176200001440000001201614141046730017045 0ustar liggesusers#!/usr/bin/env python3 # # Copyright (c) 2012 Realz Slaw, 2017 Gao Wang # # Permission is hereby granted, free of charge, to any person # obtaining a copy of this software and associated documentation files # (the "Software"), to deal in the Software without restriction, # including without limitation the rights to use, copy, modify, merge, # publish, distribute, sublicense, and/or sell copies of the Software, # and to permit persons to whom the Software is furnished to do so, # subject to the following conditions: # # The above copyright notice and this permission notice shall be # included in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS # BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN # ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. import time import psutil import subprocess class ProcessTimer: def __init__(self, command, interval = 1): self.command = command self.execution_state = False self.interval = interval def execute(self): self.max_vms_memory = 0 self.max_rss_memory = 0 self.t0 = time.time() self.t1 = None self.max_t = [self.t0] try: self.p = subprocess.Popen(self.command, shell=False) except FileNotFoundError: self.p = None sys.exit("Invalid command `{}`".format(sys.argv[1])) self.execution_state = True def poll(self): if not self.check_execution_state(): return False self.t1 = time.time() try: pp = psutil.Process(self.p.pid) # Obtain a list of the subprocess and all its descendants. descendants = list(pp.children(recursive=True)) descendants = descendants + [pp] rss_memory = 0 vms_memory = 0 # Calculate and sum up the memory of the subprocess and all its # descendants. for descendant in descendants: try: mem_info = descendant.memory_info() rss_memory += mem_info[0] vms_memory += mem_info[1] except (psutil.NoSuchProcess, psutil.ZombieProcess, psutil.AccessDenied): # Sometimes a subprocess descendant will have terminated # between the time we obtain a list of descendants, and the # time we actually poll this descendant's memory usage. pass if int(self.max_vms_memory * 1E-8) < int(vms_memory * 1E-8): # Peak memory updated, at ~100-MB resolution. self.max_t = [self.t1] if int(self.max_vms_memory * 1E-8) == int(vms_memory * 1E-8): # Peak memory maintained. self.max_t = [self.max_t[0], self.t1] self.max_vms_memory = max(self.max_vms_memory,vms_memory) self.max_rss_memory = max(self.max_rss_memory,rss_memory) except (psutil.NoSuchProcess, psutil.ZombieProcess, psutil.AccessDenied): return self.check_execution_state() return self.check_execution_state() def is_running(self): return psutil.pid_exists(self.p.pid) and self.p.poll() == None def check_execution_state(self): if not self.execution_state: return False if self.is_running(): return True self.executation_state = False self.t1 = time.time() return False def close(self,kill=False): if self.p is not None: try: pp = psutil.Process(self.p.pid) if kill: pp.kill() else: pp.terminate() except (psutil.NoSuchProcess, psutil.ZombieProcess, psutil.AccessDenied): pass def takewhile_excluding(iterable, value = ['|', '<', '>']): for it in iterable: if it in value: return yield it if __name__ == '__main__': import sys, os if len(sys.argv) <= 1: sys.exit() interval = float(os.environ['MEM_CHECK_INTERVAL']) if 'MEM_CHECK_INTERVAL' in os.environ else 1 ptimer = ProcessTimer(takewhile_excluding(sys.argv[1:]), interval) try: ptimer.execute() # Poll as often as possible; otherwise the subprocess might # "sneak" in some extra memory usage while you aren't looking. while ptimer.poll(): time.sleep(ptimer.interval) finally: # Make sure that we don't leave the process dangling. ptimer.close() sys.stderr.write('\ntime elapsed: {:.2f}s\n'.format(max(0, ptimer.t1 - ptimer.t0 - ptimer.interval * 0.5))) sys.stderr.write('peak first occurred: {:.2f}s\n'.format(min(ptimer.max_t) - ptimer.t0)) sys.stderr.write('peak last occurred: {:.2f}s\n'.format(max(ptimer.max_t) - ptimer.t0)) sys.stderr.write('max vms_memory: {:.2f}GB\n'.format(ptimer.max_vms_memory * 1.07E-9)) sys.stderr.write('max rss_memory: {:.2f}GB\n'.format(ptimer.max_rss_memory * 1.07E-9)) sys.stderr.write('memory check interval: %ss\n' % ptimer.interval) sys.stderr.write('return code: %s\n' % ptimer.p.returncode) susieR/inst/code/caviar.R0000644000176200001440000000412313335050146015003 0ustar liggesusers#!/usr/bin/env Rscript library(dplyr) library(readr) library(magrittr) #' CAVIAR I/O write_caviar_sumstats <- function(z, prefix) { cfg = list(z=paste0(prefix,".z"), set=paste0(prefix,"_set"), post=paste0(prefix,"_post"), log=paste0(prefix,".log")) write.table(z,cfg$z,quote=F,col.names=F) return(cfg) } #' Run CAVIAR #' https://github.com/fhormoz/caviar run_caviar <- function(z, LD_file, args = "", prefix="data") { cfg = write_caviar_sumstats(z, prefix) cmd = paste("CAVIAR", "-z", cfg$z, "-l", LD_file, "-o", prefix, args) dscrutils::run_cmd(cmd) if(!all(file.exists(cfg$post, cfg$set, cfg$log))) { stop("Cannot find one of the post, set, and log files") } log <- readLines(cfg$log) # read output tables snp <- read.delim(cfg$post) stopifnot(ncol(snp) == 3) names(snp) <- c("snp", "snp_prob_set", "snp_prob") snp$snp <- as.character(snp$snp) snp <- rank_snp(snp) # `set` of snps set <- readLines(cfg$set) set_ordered <- left_join(data_frame(snp = set), snp, by = "snp") %>% arrange(rank) %$% snp return(list(snp=snp, set=set_ordered)) } rank_snp <- function(snp) { snp <- arrange(snp, -snp_prob) %>% mutate( rank = seq(1, n()), snp_prob_cumsum = cumsum(snp_prob) / sum(snp_prob)) %>% select(rank, snp, snp_prob, snp_prob_cumsum, snp_prob_set) return(snp) } finemap_mcaviar <- function(zscore, LD_file, args, prefix) { if (is.null(dim(zscore))) { zscore = matrix(ncol=1,zscore) } return(parallel::mclapply(1:ncol(zscore), function(r) run_caviar(zscore[,r], LD_file, args, paste0(prefix, '_condition_', r)), mc.cores = min(8, ncol(zscore)))) } eval(parse(text=commandArgs(T))) dat = readRDS(input) sumstats = dat$sumstats ld = tempfile(fileext = ".ld") write.table(cor(dat$data$X),ld,quote=F,col.names=F,row.names=F) posterior = finemap_mcaviar(sumstats[1,,] / sumstats[2,,], ld, args, prefix=tempfile(fileext = ".caviar")) saveRDS(posterior, paste0(output, '.rds')) susieR/inst/code/compute_ss_memory.R0000644000176200001440000000124614141046730017312 0ustar liggesusers# export MEM_CHECK_INTERVAL=0.01 # python3 monitor_memory.py Rscript compute_ss_memory.R # # NOTES: # # - Without any improvements: # Size of X: 0.3 GB # max rss_memory: 1.65 GB # # - The original centering and scaling steps require about 1 GB. # # - With the improvements: # Size of X: 0.3 GB # max rss_memory: 0.66 GB # # set.seed(1) # p <- 2000 # n <- 20000 # X <- matrix(rnorm(n*p),n,p) # y <- rnorm(n) # save(list = c("X","y"),file = "compute_ss_data.RData") # library(susieR) devtools::load_all() set.seed(1) load("compute_ss_data.RData") cat("Size of X:\n") print(object.size(X),unit = "GB") cat("Running compute_ss.\n") out <- compute_ss(X,y,standardize = TRUE) susieR/inst/code/dap-g.py0000644000176200001440000000615113365653500014766 0ustar liggesusers#!/usr/bin/env python3 import sys import subprocess import pandas as pd import numpy as np def write_dap_full(x,y,prefix,r): names = np.array([('geno', i+1, f'group{r}') for i in range(x.shape[1])]) with open(f'{prefix}.data', 'w') as f: print(*(['pheno', 'pheno', f'group{r}'] + list(np.array(y).ravel())), file=f) np.savetxt(f, np.hstack((names, x.T)), fmt = '%s', delimiter = ' ') def run_dap_full(prefix, args): cmd = ['dap-g', '-d', f'{prefix}.data', '-o', f'{prefix}.result', '--output_all'] + ' '.join(args).split() subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() def write_dap_ss(z,prefix): '''z-score vesion of dap input is the same as FINEMAP''' ids = np.array([str(i+1) for i in range(z.shape[0])]) with open(f'{prefix}.z', 'w') as f: np.savetxt(f, np.vstack((ids, z)).T, fmt = '%s', delimiter = ' ') def run_dap_z(ld, prefix, args): cmd = ['dap-g', '-d_z', f'{prefix}.z', '-d_ld', ld, '-o', f'{prefix}.result', '--all'] + ' '.join(args).split() subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() def extract_dap_output(prefix): out = [x.strip().split() for x in open(f'{prefix}.result').readlines()] pips = [] clusters = [] still_pip = True for line in out: if len(line) == 0: continue if len(line) > 2 and line[2] == 'cluster_pip': still_pip = False continue if still_pip and (not line[0].startswith('((')): continue if still_pip: pips.append([line[1], float(line[2]), float(line[3]), int(line[4])]) else: clusters.append([len(clusters) + 1, float(line[2]), float(line[3])]) pips = pd.DataFrame(pips, columns = ['snp', 'snp_prob', 'snp_log10bf', 'cluster']) clusters = pd.DataFrame(clusters, columns = ['cluster', 'cluster_prob', 'cluster_avg_r2']) clusters = pd.merge(clusters, pips.groupby(['cluster'])['snp'].apply(','.join).reset_index(), on = 'cluster') return {'snp': pips, 'set': clusters} def dap_single(x, y, prefix, r, args): write_dap_full(x,y,prefix,r) run_dap_full(prefix,args) return extract_dap_output(prefix) def dap_single_z(z, ld, prefix, args): write_dap_ss(z,prefix) run_dap_z(ld,prefix,args) return extract_dap_output(prefix) def dap_batch(X, Y, prefix, *args): return dict([(f'V{r+1}', dap_single(X, Y[:,r], f'{prefix}_condition_{r+1}', r+1, args)) for r in range(Y.shape[1])]) def dap_batch_z(z, ld, prefix, *args): return dict([(f'V{r+1}', dap_single_z(z[:,r], ld, f'{prefix}_condition_{r+1}', args)) for r in range(z.shape[1])]) import os from dsc.dsc_io import load_rds, save_rds import tempfile import warnings if not sys.warnoptions: warnings.simplefilter("ignore") input_file = os.path.expanduser(sys.argv[1]) output_file = os.path.expanduser(sys.argv[2]) args = sys.argv[3:] data = load_rds(input_file)['data'] cache = tempfile.NamedTemporaryFile(suffix = '.dap') posterior = dap_batch(data['X'], data['Y'], cache.name, ' '.join(args)) save_rds(posterior, output_file + '.rds') susieR/inst/code/finemap_1p4.R0000644000176200001440000000764514112242336015653 0ustar liggesusers#!/usr/bin/env Rscript library(dplyr) library(readr) library(magrittr) #' FINEMAP I/O write_finemap_sumstats <- function(beta, se, LD_file, n, k, prefix) { cfg = list(z=paste0(prefix,".z"), ld=LD_file, snp=paste0(prefix,".snp"), config=paste0(prefix,".config"), cred=paste0(prefix, ".cred"), k=paste0(prefix,".k"), log=paste0(prefix,".log"), meta=paste0(prefix,".master")) se = replace(se, se == 0, 'nan') z = data.frame(chromosome="chr", position=seq(1, length(beta)), allele1='nan', allele2='nan', maf='nan', beta, se) z = cbind(rsid=z$position, z) write.table(z,cfg$z,quote=F,col.names=T,row.names=F) if (!is.null(k)) { write.table(t(k),cfg$k,quote=F,col.names=F,row.names=F) write("z;ld;snp;config;cred;n_samples;k;log",file=cfg$meta) write(paste(cfg$z, cfg$ld, cfg$snp, cfg$config, cfg$cred, n, cfg$k, cfg$log, sep=";"), file=cfg$meta,append=TRUE) } else { write("z;ld;snp;config;cred;n_samples;log",file=cfg$meta) write(paste(cfg$z, cfg$ld, cfg$snp, cfg$config, cfg$cred, n, cfg$log, sep=";"), file=cfg$meta,append=TRUE) } return(cfg) } #' Run FINEMAP version 1.4 #' http://www.christianbenner.com ## FIXME: read the finemapr implementation for data sanity check. ## Can be useful as a general data sanity checker (in previous modules) run_finemap <- function(beta, se, LD_file, n, k, args = "", prefix="data") { cfg = write_finemap_sumstats(beta, se, LD_file, n, k, prefix) cmd = paste("finemap --sss --log", "--in-files", cfg$meta, args) dscrutils::run_cmd(cmd) cfg$log = paste0(cfg$log, "_sss") # read output tables snp = read.table(cfg$snp,header=TRUE,sep=" ") snp$snp = as.character(snp$rsid) snp = rank_snp(snp) # we add snp-prob for backwards-compatability with code that used this script with FINEMAP v1.1 snp$prob = snp$snp_prob config = read.table(cfg$config,header=TRUE,sep=" ") # Only keep configurations with cumulative 95% probability # config = within(config, config_prob_cumsum <- cumsum(config_prob)) # config = config[config$config_prob_cumsum <= 0.95,] # extract number of causal ncausal = finemap_extract_ncausal(cfg$log) return(list(snp=snp, set=config, ncausal=ncausal)) } rank_snp <- function(snp) { snp <- arrange(snp, -prob) %>% mutate( rank = seq(1, n()), prob_cumsum = cumsum(prob) / sum(prob)) %>% select(rank, snp, prob, prob_cumsum, log10bf) return(snp) } finemap_extract_ncausal <- function(logfile) { lines <- grep("->", readLines(logfile), value = TRUE) lines <- gsub("\\(|\\)|>", "", lines) splits <- strsplit(lines, "\\s+") tab <- data.frame( ncausal_num = sapply(splits, function(x) as.integer(x[2])), ncausal_prob = sapply(splits, function(x) as.double(x[4]))) tab <- mutate(tab, type = ifelse(duplicated(ncausal_num), "post", "prior")) return(tab) } finemap_mvar <- function(beta, se, LD_file, n, k, args, prefix, parallel = FALSE) { if (is.null(dim(beta))) { beta = matrix(ncol=1,beta) } if (is.null(dim(se))) { se = matrix(ncol=1,se) } single_core = function(r) run_finemap(beta[,r], se[,r], LD_file, n, k, args, prefix=paste0(prefix, '_condition_', r)) if (parallel) return(parallel::mclapply(1:ncol(beta), function(r) single_core(r), mc.cores = min(8, ncol(beta)))) else return(lapply(1:ncol(beta), function(r) single_core(r))) } eval(parse(text=commandArgs(T))) dat = readRDS(input) sumstats = dat$sumstats N = nrow(dat$data$X) ld = tempfile(fileext = ".ld") ld_mat = cor(dat$data$X) ld_mat[is.na(ld_mat)] = 'nan' write.table(ld_mat,ld,quote=F,col.names=F,row.names=F) posterior = finemap_mvar(sumstats[1,,], sumstats[2,,], ld, N, k=NULL, args, prefix=tempfile(fileext = ".finemap")) saveRDS(posterior, paste0(output, '.rds'))