ade4/0000755000176200001440000000000013621233757011100 5ustar liggesusersade4/NAMESPACE0000644000176200001440000002600413553312514012312 0ustar liggesusers##################################### ## Load DLL ## ##################################### useDynLib(ade4, .registration = TRUE, .fixes = "C_") ##################################### ## S3 methods ## ##################################### S3method("[","dudi") S3method("[","kdist") S3method("[","ktab") S3method("[","krandtest") S3method("[[","krandtest") S3method("as.data.frame","kdist") S3method("bca","coinertia") S3method("bca","dpcoa") S3method("bca","dudi") S3method("bca","rlq") S3method("biplot","dudi") S3method("boxplot","acm") S3method("c","kdist") S3method("c","ktab") S3method("col.names<-","ktab") S3method("col.names","ktab") S3method("inertia","dudi") S3method("kplot","foucart") S3method("kplot","mcoa") S3method("kplot","mfa") S3method("kplot","pta") S3method("kplot","sepan") S3method("kplot","statis") S3method("plot","4thcorner") S3method("plot","betcoi") S3method("plot","betrlq") S3method("plot","between") S3method("plot","coinertia") S3method("plot","corkdist") S3method("plot","discrimin") S3method("plot","dpcoa") S3method("plot","foucart") S3method("plot","krandtest") S3method("plot","mcoa") S3method("plot","mfa") S3method("plot","multispati") S3method("plot","niche") S3method("plot","orthobasis") S3method("plot","pcaiv") S3method("plot","phylog") S3method("plot","procuste") S3method("plot","pta") S3method("plot","randtest") S3method("plot","rlq") S3method("plot","sepan") S3method("plot","statis") S3method("plot","witcoi") S3method("plot","within") S3method("plot","witrlq") S3method("predict","dudi") S3method("print","4thcorner") S3method("print","amova") S3method("print","apqe") S3method("print","betcoi") S3method("print","betdpcoa") S3method("print","betrlq") S3method("print","between") S3method("print","coinertia") S3method("print","corkdist") S3method("print","discrimin") S3method("print","dpcoa") S3method("print","dudi") S3method("print","foucart") S3method("print","kdist") S3method("print","krandboot") S3method("print","krandtest") S3method("print","krandxval") S3method("print","ktab") S3method("print","inertia") S3method("print","mcoa") S3method("print","mfa") S3method("print","multiblock") S3method("print","multispati") S3method("print","neig") S3method("print","niche") S3method("print","nipals") S3method("print","orthobasis") S3method("print","pcaiv") S3method("print","phylog") S3method("print","procuste") S3method("print","pta") S3method("print","randboot") S3method("print","randtest") S3method("print","randxval") S3method("print","rlq") S3method("print","sepan") S3method("print","statis") S3method("print","varipart") S3method("print","witcoi") S3method("print","within") S3method("print","witrlq") S3method("print","witdpcoa") S3method("randboot","multiblock") S3method("randtest","amova") S3method("randtest","betwit") S3method("randtest","between") S3method("randtest","coinertia") S3method("randtest","discrimin") S3method("randtest","dpcoa") S3method("randtest","pcaiv") S3method("randtest","pcaivortho") S3method("randtest","procuste") S3method("randtest","rlq") S3method("reconst","coa") S3method("reconst","pca") S3method("row.names<-","ktab") S3method("row.names","ktab") S3method("rtest","between") S3method("rtest","discrimin") S3method("rtest","niche") S3method("scatter","acm") S3method("scatter","coa") S3method("scatter","dudi") S3method("scatter","fca") S3method("scatter","nipals") S3method("scatter","pco") S3method("score","acm") S3method("score","coa") S3method("score","mix") S3method("score","pca") S3method("screeplot","dudi") S3method("summary","4thcorner") S3method("summary","between") S3method("summary","betwit") S3method("summary","coinertia") S3method("summary","corkdist") S3method("summary","dist") S3method("summary","dpcoa") S3method("summary","dudi") S3method("summary","mcoa") S3method("summary","mfa") S3method("summary","inertia") S3method("summary","multiblock") S3method("summary","multispati") S3method("summary","neig") S3method("summary","orthobasis") S3method("summary","pcaiv") S3method("summary","pcaivortho") S3method("summary","rlq") S3method("summary","sepan") S3method("summary","within") S3method("summary","witwit") S3method("supcol","coa") S3method("supcol","dudi") S3method("suprow","acm") S3method("suprow","coa") S3method("suprow","dudi") S3method("suprow","fca") S3method("suprow","mix") S3method("suprow","pca") S3method("suprow","pta") S3method("t","dudi") S3method("t","ktab") S3method("tab.names<-","ktab") S3method("tab.names","ktab") S3method("testdim","multiblock") S3method("testdim","pca") S3method("wca","coinertia") S3method("wca","dudi") S3method("wca","dpcoa") S3method("wca","rlq") ##################################### ## Import ## ##################################### importFrom("graphics", "abline", "arrows", "axis", "barplot", "box", "boxplot", "frame", "hist", "image", "layout", "lines", "mtext", "par", "plot.default", "plot", "plot.new", "points", "polygon", "rect", "segments", "strheight", "strwidth", "symbols", "text", "title") importFrom("grDevices", "chull", "dev.cur", "gray", "grey", "n2mfrow") importFrom("stats", "shapiro.test", "anova", "as.dist", "as.formula", "biplot", "coefficients", "cor", "cov", "cutree", "density", "dist", "dnorm", "hclust", "is.ts", "lm", "lm.wfit", "loess", "model.frame", "model.matrix", "na.omit", "p.adjust", "p.adjust.methods", "pf", "plot.ts", "poly", "ppoints", "predict", "quantile", "residuals", "screeplot", "sd", "symnum", "ts", "ts.union", "var", "weighted.mean") importFrom("utils", "modifyList", "read.table", "write.table") importFrom("methods", "setOldClass") importFrom("MASS", "ginv", "kde2d") ##################################### ## Export ## ##################################### ## ******* diversity ******* export("amova", "apqe", "disc", "divc", "divcmax", "dpcoa" ) ## ******* utilities and misc ******* export("acm.burt", "acm.disjonctif", "adegraphicsLoaded", "as.krandboot", "as.krandtest", "as.krandxval", "as.randboot", "as.randtest", "as.randxval", "uniquewt.df") export("bicenter.wt", "covfacwt", "covwt", "meanfacwt", "scalefacwt", "scalewt", "varfacwt", "varwt") ## ******* dist ******* export("cailliez", "dist.binary", "dist.ktab", "dist.prop", "dist.quant", "is.euclid", "lingoes", "quasieuclid", "supdist") ## ******* generic ******* export("bca", "col.names", "col.names<-", "inertia", "kplot", "reconst", "randboot", "randtest", "rtest", "scatter", "score", "supcol", "suprow", "tab.names", "tab.names<-", "testdim", "wca" ) ## ******* graphics ******* export("s.arrow", "s.class", "s.chull", "s.corcircle", "s.distri", "s.hist", "s.image", "s.kde2d", "s.label", "s.logo", "s.match", "s.match.class", "s.multinom", "s.traject", "s.value") ## export("scatter.acm", "scatter.coa", "scatter.dudi", "scatter.fca", "scatter.nipals", "scatter.pco") export("sco.boxplot", "sco.class", "sco.distri", "sco.gauss", "sco.label", "sco.match", "sco.quant") ## export("score.acm", "score.coa", "score.mix", "score.pca") export("add.scatter", "dotcircle") export("table.cont", "table.dist", "table.paint", "table.value") export("triangle.biplot", "triangle.class", "triangle.plot") ## ******* 1-table methods ******* export("dudi.acm", "dudi.coa", "dudi.dec", "dudi.fca", "dudi.fpca", "dudi.hillsmith", "dudi.mix", "dudi.nsc", "dudi.pca", "dudi.pco", "pcoscaled", "nipals") export("as.dudi", "dist.dudi", "dudi.type","inertia.dudi", "is.dudi", "prep.fuzzy.var", "reciprocal.coa", "redo.dudi") ## ******* 2/3-table methods ******* export("coinertia", "discrimin", "discrimin.coa", "fourthcorner", "fourthcorner2", "fourthcorner.rlq", "niche", "pcaiv", "pcaivortho", "procuste", "rlq", "varipart", "withinpca", "witwit.coa", "witwitsepan") export("combine.4thcorner", "combine.randtest.rlq", "mantel.randtest", "mantel.rtest", "niche.param", "p.adjust.4thcorner", "procuste.randtest", "procuste.rtest", "RVdist.randtest") ## ******* K-table methods ******* export("costatis", "costatis.randtest", "foucart", "mcoa", "mbpcaiv", "mbpls", "mdpcoa", "mfa", "pta", "sepan", "statico", "statico.krandtest", "statis") export("is.ktab", "kdist", "kdist2ktab", "kdist.cor", "kdisteuclid", "kplotX.mdpcoa", "kplotsepan.coa", "ktab.data.frame", "ktab.list.df", "ktab.list.dudi", "ktab.match2ktabs", "ktab.within", "ldist.ktab", "mantelkdist", "prep.binary", "prep.circular", "prep.fuzzy", "prep.mdpcoa", "RVkdist", "RV.rtest") ## ******* phylog ******* export("as.taxo", "dist.taxo", "dotchart.phylog", "enum.phylog", "gearymoran", "hclust2phylog", "newick2phylog", "phylog.extract", "phylog.permut", "PI2newick", "radial.phylog","symbols.phylog", "table.phylog", "taxo2phylog", "variance.phylog") export("originality") ## ******* orthobasis ******* export("haar2level", "mld", "orthobasis.circ", "orthobasis.haar", "orthobasis.line", "orthobasis.mat", "orthobasis.neig", "is.orthobasis") ## ******* spatial ******* export("area2link", "area2poly", "area.plot", "dist.neig", "gridrowcol", "multispati", "multispati.randtest", "mstree", "multispati.rtest", "nb2neig", "neig", "neig2mat", "neig2nb", "poly2area", "scores.neig") ## ******* misc ********* export("bwca.dpcoa") export("dagnelie.test") ##################################### ## Not Exported ## ##################################### ## ******* deprecated ******* ## "between" ## "betweencoinertia" ## "char2genet" ## "count2genet" ## "dist.genet" ## "EH" ## "freq2genet" ## "fuzzygenet" ## "optimEH" ## "orisaved" ## "orthogram" ## "randEH" ## "within" ## "withincoinertia" ## ******* internal utilities ******* ## Re-export the following functions to avoid the breaking of several other packages (19/11/2013) export("add.scatter.eig", "scatterutil.base", "scatterutil.chull", "scatterutil.convrot90", "scatterutil.eigen", "scatterutil.ellipse", "scatterutil.eti", "scatterutil.eti.circ", "scatterutil.grid", "scatterutil.legend.bw.square" , "scatterutil.legendgris", "scatterutil.legend.square.grey", "scatterutil.logo", "scatterutil.scaling", "scatterutil.sco", "scatterutil.star", "scatterutil.sub") ## "add.position.triangle" ## "add.scatter.eig" ## "area.util.contour" ## "area.util.xy" ## "area.util.class" ## "fac2disj" ## "neig.util.GtoL" ## "neig.util.LtoG" ## "ktab.util.addfactor" ## "ktab.util.names" ## "newick2phylog.addtools" ## "scatterutil.base" ## "scatterutil.chull" ## "scatterutil.convrot90" ## "scatterutil.eigen" ## "scatterutil.ellipse" ## "scatterutil.eti" ## "scatterutil.eti.circ" ## "scatterutil.grid" ## "scatterutil.legend.bw.square" ## "scatterutil.legendgris" ## "scatterutil.legend.square.grey" ## "scatterutil.logo" ## "scatterutil.scaling" ## "scatterutil.sco" ## "scatterutil.star" ## "scatterutil.sub" ## "scoreutil.base" ## "table.prepare" ## "testdiscrimin" ## "testertrace" ## "testertracenu" ## "testertracenubis" ## "testertracerlq" ## "testinter" ## "testmantel" ## "testprocuste" ## "triangle.param" ## "triangle.posipoint" ade4/ChangeLog0000644000176200001440000027347113621210442012652 0ustar liggesusers2020-02-13 Stéphane Dray * DESCRIPTION: ---------- release of ade4 1.7-15 ---------- 2020-02-10 Stéphane Dray * DESCRIPTION, man/cailliez.Rd, man/kdisteuclid.Rd, man/oribatid.Rd: Remove some broken URL 2020-02-03 Stéphane Dray * DESCRIPTION: ---------- release of ade4 1.7-14 ---------- 2020-02-03 Stéphane Dray * DESCRIPTION: Packages sp and pixmap are now in 'Imports'as they defined S4 classes used in some data sets. Mail by B. Ripley 2019-10-14 Aurélie Siberchicot * NAMESPACE, R/suprowpta.R, man/suprowpta.Rd: New function 'suprowpta' 2019-09-24 Aurélie Siberchicot * man/randtest.Rd: Trunk a line in a help file 2019-09-20 Aurélie Siberchicot * R/krandtest.R, man/krandtest.Rd, man/randtest.Rd: Udpate and uniformize the help pages of 'krandtest' and 'randtest' 2019-09-19 Aurélie Siberchicot * NAMESPACE, R/krandtest.R, man/krandtest.Rd: Add [ and [[ methods for krandtest 2019-08-07 Stéphane Dray * R/dist.binary.R, R/dist.ktab.R, man/kdist.Rd: Correct a typo: "Sockal" is now "Sokal" (Comment by P. Legendre) 2019-05-17 Aurélie Siberchicot * man/apis108.Rd, man/casitas.Rd, man/chevaine.Rd, man/hdpg.Rd: Simplify the examples of the datasets 'apis108', 'casitas', 'chevaine' and 'hdpg' (no longer use deprecated genetic functions) 2019-05-17 Aurélie Siberchicot * man/s.kde2d.Rd: Update the example used with 's.kde2d' 2019-04-11 Aurélie Siberchicot * NAMESPACE, R/ade4-deprecated.R, R/dist.genet.R, R/fuzzygenet.R, R/genet.R, man/ade4-deprecated.Rd, man/dist.genet.Rd, man/fuzzygenet.Rd, man/genet.Rd: The functions 'dist.genet', 'fuzzygenet', 'char2genet', 'count2genet' and 'freq2genet' are removed 2019-04-10 Aurélie Siberchicot * NAMESPACE, R/EH.R, R/ade4-deprecated.R, R/optimEH.R, R/orisaved.R, R/randEH.R, man/EH.Rd, man/ade4-deprecated.Rd, man/optimEH.Rd, man/orisaved.Rd, man/randEH.Rd: The functions 'EH', 'randEH', 'optimEH' and 'orisaved' are removed 2019-04-10 Aurélie Siberchicot * R/multispati.R, man/multispati.Rd: The 'print.multispati', 'plot.multispati' and 'summary.multispati' methods are now deprecated 2018-10-18 Aurélie Siberchicot * R/dist.ktab.R: Correct a bug in 'dist.ktab', 'ldist.ktab' and 'kdist.cor' 2018-09-03 Aurélie Siberchicot * man/bacteria.Rd: Add url in the help page of 'bacteria' data 2018-08-30 Aurélie Siberchicot * DESCRIPTION: ---------- release of ade4 1.7-13 ---------- 2018-08-30 Aurélie Siberchicot * inst/CITATION, man/bacteria.Rd: Correct invalid URL 2018-08-30 Aurélie Siberchicot * ChangeLog: ---------- release of ade4 1.7-12 ---------- 2018-08-30 Aurélie Siberchicot * DESCRIPTION: ---------- release of ade4 1.7-12 ---------- 2018-08-29 Stéphane Dray * DESCRIPTION, inst/CITATION, man/ade4.package.Rd, man/mbpcaiv.Rd, man/mbpls.Rd, man/multiblock.Rd, man/randboot.multiblock.Rd, man/testdim.multiblock.Rd: Update citation and add reference to the new JSS paper 2018-08-20 Stéphane Dray * R/varipart.R: Clean the code 2018-08-06 Stéphane Dray * R/varipart.R: Start a new and faster implementation to deal with unweighted models 2018-08-03 Stéphane Dray * R/varipart.R, man/varipart.Rd: The function 'varipart' now accepts a matrix, vector or data.frame as response table 2018-08-03 Stéphane Dray * NAMESPACE, R/varipart.R, man/varipart.Rd: Improve varipart to compute adjusted fractions when no covaribales are considered and add a new method 'print.varipart' 2018-08-03 Stéphane Dray * man/dist.ktab.Rd: Correct a link to a function in the doc 2018-07-06 Stéphane Dray * R/rlq.R: Correct a typo in the summary.rlq function (mail by Manfred Jensen, 29/06/2018) 2018-06-22 Aurélie Siberchicot * man/maples.Rd: Correct a bibliographic reference 2018-06-20 Stéphane Dray * R/dpcoa.R: correct a small bug in summary.dpcoa 2018-05-23 Aurélie Siberchicot * R/inertia.dudi.R: Update output names in inertia.dudi 2018-05-15 Aurélie Siberchicot * man/inertia.dudi.Rd: Update the help file of 'inertia.dudi' 2018-05-15 Aurélie Siberchicot * man/inertia.dudi.Rd: Update the help file of 'inertia.dudi' 2018-05-15 Aurélie Siberchicot * R/inertia.dudi.R: Update 'inertia.dudi' and 'summary.inertia' 2018-05-14 Stéphane Dray * R/orthobasis.R: Correct the output for orthobasis that contains only one column (and transformed to vector by default, i.e. when drop = TRUE) 2018-04-25 Jean Thioulouse * R/foucart.R: issue raised by Didier Plat https://github.com/sdray/ade4/issues/13 2018-04-05 Aurélie Siberchicot * ChangeLog: ---------- release of ade4 1.7-11 ---------- 2018-04-05 Aurélie Siberchicot * DESCRIPTION: ---------- release of ade4 1.7-11 ---------- 2018-04-04 Jean Thioulouse * R/randtest.pcaiv.R: Error in dimnames() vs names() in formula fmla L. 14 : dimnames(df)[[2]] was replaced by names(df)[[2]], which is not good. Replaced by names(df). 2018-03-29 Jean Thioulouse * R/coinertia.R: Misprint in print.coinertia 2018-03-16 Stéphane Dray * R/dudi.mix.R: Correct the extracting in tab (now by drop = FALSE) to deal with cases with only two levels (bug identified by Ceres Barros on GitHub, issue 10) 2018-03-14 Stéphane Dray * NAMESPACE, R/suprow.R, man/suprow.Rd: Add new method "suprow.fca" (proposition by Martial Ferreol on Github) 2018-03-14 Stéphane Dray * R/dudi.coa.R: Correct a bug to deal with large numbers in integer matrix (bug found by Angela Fuentes Pardo, email 10/02/2018) 2018-01-16 Stéphane Dray * .travis.yml: Remove last commit (was an error) 2018-01-16 Stéphane Dray * .travis.yml: Add 'RANN' to allow building vignette 2018-01-03 Aurélie Siberchicot * .travis.yml: Update .travis.yml Remove the '--run-dontrun' argument in the 'r_check_args' tag 2018-01-03 Aurélie Siberchicot * .travis.yml: Update .travis.yml Remove the 'travis_wait' use 2018-01-03 Aurélie Siberchicot * .travis.yml: Update .travis.yml Add a tag to extend the time the command has to finish. 2018-01-03 Aurélie Siberchicot * .travis.yml: Update .travis.yml Add 'r_check_args' and 'r_packages' tags 2017-12-15 Aurélie Siberchicot * ChangeLog: ---------- release of ade4 1.7-10 ---------- 2017-12-15 Aurélie Siberchicot * DESCRIPTION: ---------- release of ade4 1.7-10 ---------- 2017-12-15 Aurélie Siberchicot * DESCRIPTION: Correct misprint in the title in the DESCRIPTION file 2017-12-15 Aurélie Siberchicot * DESCRIPTION: ---------- release of ade4 1.7-9 ---------- 2017-12-06 Stéphane Dray * R/mantel.randtest.R, R/mantel.rtest.R: Returned objects now belong to subclass "mantelrtest" (to implement a 'msr.mantelrtest' in adespatial). 2017-12-06 Stéphane Dray * R/randtest.R, man/randtest.Rd: Add a new argument to function as.randtest to specify subclasses for the returned object (by default NULL) 2017-12-05 Aurélie Siberchicot * R/coinertia.R, R/dudi.R, R/dudi.pco.R, R/mbpcaiv.R, R/mbpls.R, R/mcoa.R, R/statis.R, R/utilities.R: Add a message containing the function called for the 'dudi' creation, after user selects nf (Feature request by Zhian N. Kamvar, on Github, 2017-11-07) 2017-12-04 Aurélie Siberchicot * R/dudi.R: Add a message containing the complete call when users interactively choose the number of axes in an analysis 2017-11-03 Stéphane Dray * .travis.yml: Remove addons packages as 'rgdal' is no longer required 2017-11-03 Stéphane Dray * DESCRIPTION, man/area.plot.Rd, man/atya.Rd, man/avijons.Rd, man/kcponds.Rd, man/mafragh.Rd, man/multispati.Rd, man/multispati.randtest.Rd, man/multispati.rtest.Rd, man/neig.Rd, man/tintoodiel.Rd: Remove dependencies to maptools and spData (examples with columbus data set are removed) 2017-11-03 Stéphane Dray * : commit 0d0c2004ce328889b7644f0f86bfc74bc6e552b5 Author: Stéphane Dray Date: Fri Nov 3 11:27:42 2017 +0100 2017-11-02 Aurélie Siberchicot * R/dist.genet.R, R/fuzzygenet.R, R/genet.R, man/dist.genet.Rd, man/fuzzygenet.Rd, man/genet.Rd: The functions 'char2genet', 'count2genet', 'freq2genet', 'dist.genet' and 'fuzzygenet' are deprecated and are now in the 'adegenet' package 2017-11-02 Aurélie Siberchicot * R/EH.R, R/ade4-deprecated.R, R/multispati.R, R/optimEH.R, R/orisaved.R, R/randEH.R: Correct a misprint 2017-11-02 Aurélie Siberchicot * man/optimEH.Rd, man/orisaved.Rd, man/randEH.Rd: Correct typo in the help files of the 'optimEH', 'orisaved' and 'randEH' deprecated functions 2017-11-02 Aurélie Siberchicot * R/multispati.R, man/multispati.Rd: The 'multispati' function is now deprecated 2017-11-01 Stéphane Dray * DESCRIPTION, NAMESPACE, R/mbpcaiv.R, R/mbpls.R, R/s.kde2d.R, man/score.coa.Rd: Add dagnelie.test package MASS in Imports and update calls to MASS functions/Data 2017-11-01 Stéphane Dray * R/dagnelie.test.R, man/dagnelie.test.Rd: Adds Dagnelie's test for multivariate normality 2017-10-31 Aurélie Siberchicot * DESCRIPTION: Specify the required version for the spData package 2017-10-31 Stéphane Dray * R/nipals.R: Correct a bug in the computation of biased sd from unbiased estimator. Thanks to Kevin Wright that identified the problem. 2017-10-30 Aurélie Siberchicot * DESCRIPTION, man/area.plot.Rd, man/neig.Rd: Correct import the 'columbus' data from the spData package that was moved from the spdep package 2017-10-30 Aurélie Siberchicot * : Merge pull request #7 from zkamvar/patch-1 Reset par in kde2d 2017-10-30 Zhian N. Kamvar * R/s.kde2d.R: reset par in kde2d 2017-10-25 Aurélie Siberchicot * man/atya.Rd, man/avijons.Rd, man/buech.Rd, man/butterfly.Rd, man/capitales.Rd, man/elec88.Rd, man/ggtortoises.Rd, man/irishdata.Rd, man/julliot.Rd, man/jv73.Rd, man/kcponds.Rd, man/mafragh.Rd, man/sarcelles.Rd, man/t3012.Rd, man/tintoodiel.Rd, man/vegtf.Rd, man/zealand.Rd: Update help files for data 2017-10-19 Aurélie Siberchicot * R/EH.R, R/optimEH.R, R/orisaved.R, R/randEH.R, man/EH.Rd, man/optimEH.Rd, man/orisaved.Rd, man/randEH.Rd: The 'EH', 'optimEH', 'orisaved' and 'randEH' functions are now deprecated 2017-10-19 Aurélie Siberchicot * man/ade4-deprecated.Rd: Update the 'ade4-deprecated' file: a precision is added and the formatting is updated 2017-10-18 Aurélie Siberchicot * man/carni70.Rd, man/julliot.Rd, man/mjrochet.Rd, man/palm.Rd, man/ungulates.Rd, man/variance.phylog.Rd: Update examples that call the 'orthogram' function 2017-10-18 Aurélie Siberchicot * man/gridrowcol.Rd, man/mld.Rd, man/orthobasis.Rd: Update cross-references for 'othogram' 2017-10-18 Aurélie Siberchicot * man/orthogram.Rd: Remove the help page of 'orthogram' because it is deprecated 2017-10-18 Aurélie Siberchicot * R/ade4-deprecated.R, R/orthogram.R: The R code of the 'orthogram' function is pasted in the 'ade4-deprecated.R' file and the 'orthogram.R' file is removed 2017-10-18 Aurélie Siberchicot * NAMESPACE: The 'orthogram' function is no longer exported because it is deprecated 2017-10-18 Aurélie Siberchicot * man/bca.coinertia.Rd, man/wca.coinertia.Rd, man/withinpca.Rd: Update cross-references for 'between' and 'within' functions 2017-10-18 Aurélie Siberchicot * R/ade4-deprecated.R, R/bca.R, R/bca.coinertia.R, R/wca.R, R/wca.coinertia.R: Move the 'between', 'betweencoinertia', 'within' and 'withincoinertia' R functions in the 'ade4-deprecated' file 2017-10-18 Aurélie Siberchicot * R/ade4-deprecated.R: Add an 'ade4-deprecated' file to store the R code for deprecated functions 2017-10-18 Aurélie Siberchicot * man/ade4-deprecated.Rd: Update the 'ade4-deprecated' help file: the 'between', 'betweencoinertia', 'within' and 'withincoinertia' functions are added as deprecated 2017-10-18 Aurélie Siberchicot * R/bca.R, R/bca.coinertia.R, R/between.R, R/betweencoinertia.R, R/wca.R, R/wca.coinertia.R, R/within.R, R/withincoinertia.R: Rename R files for the 'bca', 'bca.coinertia', 'wca' and 'wca.coinertia' functions 2017-10-18 Aurélie Siberchicot * man/bca.Rd, man/bca.coinertia.Rd, man/between.Rd, man/betweencoinertia.Rd, man/wca.Rd, man/wca.coinertia.Rd, man/within.Rd, man/withincoinertia.Rd: Rename help files for the 'bca', 'bca.coinertia', 'wca' and 'bca.coinertia' functions 2017-10-18 Aurélie Siberchicot * man/between.Rd, man/betweencoinertia.Rd, man/within.Rd, man/withincoinertia.Rd: Update the help file because the 'between', 'betweencoinertia', 'within' and 'withincoinertia' are deprecated 2017-10-09 Aurélie Siberchicot * R/between.R, R/betweencoinertia.R, R/orthogram.R, R/within.R, R/withincoinertia.R: Update the call to the '.Deprecated' function 2017-10-09 Stéphane Dray * R/multiblock.R: Remove an unrequired space 2017-09-18 Aurélie Siberchicot * : commit 7b6de30d8740e9df053e0caa76d5c22cbd939dba Author: Aurélie Siberchicot Date: Mon Sep 18 15:03:04 2017 +0200 2017-08-21 Stéphane Dray * : commit 5fc0e8ce3d26264fb2a7cf6b16672bcd236dd5d9 Author: Stéphane Dray Date: Mon Aug 21 14:02:01 2017 +0200 2017-08-09 Aurélie Siberchicot * ChangeLog: ---------- release of ade4 1.7-8 ---------- 2017-08-09 Aurélie Siberchicot * DESCRIPTION: Correct misprints in the DESCRIPTION file 2017-08-09 Aurélie Siberchicot * ChangeLog: ---------- release of ade4 1.7-8 ---------- 2017-08-09 Aurélie Siberchicot * DESCRIPTION: ---------- release of ade4 1.7-8 ---------- 2017-08-09 Aurélie Siberchicot * man/divcmax.Rd: Update the example in 'divcmax' with correction sent by Sandrine Pavoine 2017-08-09 Stéphane Dray * DESCRIPTION: Extend the 'Description' field as requested by Uwe Ligges 2017-07-20 Aurélie Siberchicot * ChangeLog: ---------- release of ade4 1.7-7 ---------- 2017-07-20 Aurélie Siberchicot * DESCRIPTION: ---------- release of ade4 1.7-7 ---------- 2017-07-19 Stéphane Dray * NAMESPACE, R/varipart.R, man/varipart.Rd: Implement a very simple version of variation partitioning (useful for msr method in adespatial) 2017-07-11 Stéphane Dray * R/randtest.pcaiv.R, R/randtest.pcaivortho.R: Solve a bug to deal properly with 'strange' variables names (environmental variables in mafragh) 2017-07-04 Stéphane Dray * R/supdist.R: Add 'drop' argrument to deal with cases where only one supplementary individual is considered. 2017-06-29 Stéphane Dray * R/multiblock.R: The '...' argument is now passed to the as.krandboot function 2017-06-29 Jean Thioulouse * man/statico.krandtest.Rd: species data must be in the second ktab 2017-06-29 Jean Thioulouse * R/statico.R: species data should not be restandardized in each table 2017-06-23 Aurélie Siberchicot * man/atlas.Rd, man/elec88.Rd, man/irishdata.Rd: Update the help files of 'atlas', 'elec88' and 'irishdata' 2017-06-23 Aurélie Siberchicot * man/mafragh.Rd: Update the mafragh data set: spenames is now a data frame with short names and a new Spatial.contour object is added. 2017-06-23 Jean Thioulouse * README.md: Update README.md 2017-06-23 Jean Thioulouse * README.md: Update README.md 2017-06-20 Jean Thioulouse * README.md: Update README.md 2017-06-20 Jean Thioulouse * README.md: Update README.md 2017-06-19 Aurélie Siberchicot * man/supdist.Rd: Clean the 'supdist' help file 2017-06-18 Jean Thioulouse * NAMESPACE: added function supdist to project additional items in a PCO analysis 2017-06-18 Jean Thioulouse * man/supdist.Rd: Projection of additional items in a PCO analysis 2017-06-18 Jean Thioulouse * R/supdist.R: Projection of additional items in a PCO analysis 2017-06-15 Aurélie Siberchicot * man/mafragh.Rd: Correct the mafragh bibliography 2017-06-02 Aurélie Siberchicot * man/mafragh.Rd: Update the 'mafragh' data set 2017-05-12 Stéphane Dray * R/krandtest.R, R/randtest.R: Update as.randtest/as.krandtest functions to deal with cases with 0 repetitions (useful for msr.4thcorner method implemented in adespatial) 2017-04-21 Aurélie Siberchicot * NAMESPACE, R/ade4toR.R, man/ade4toR.Rd: The 'ade4toR' and 'Rtoade4' unused functions are removed. 2017-04-21 Aurélie Siberchicot * NAMESPACE, R/cca.R, R/randtest.cca.R: The 'cca' function is removed. 2017-04-21 Aurélie Siberchicot * NAMESPACE, R/cca.R, R/pcaiv.R, R/randtest.cca.R, R/randtest.pcaiv.R, man/arrival.Rd, man/cca.Rd, man/pcaiv.Rd, man/randtest.pcaiv.Rd, man/rpjdl.Rd: The 'cca' function is no longer used. 2017-04-11 Aurélie Siberchicot * man/s.logo.Rd: Update the example of the 's.logo' function 2017-04-07 Stéphane Dray * R/between.R: Correct a small bug to deal with weights in wca plots 2017-03-23 Aurélie Siberchicot * ChangeLog: ---------- release of ade4 1.7-6 ---------- 2017-03-23 Aurélie Siberchicot * DESCRIPTION: ---------- release of ade4 1.7-6 ---------- 2017-03-23 Aurélie Siberchicot * NAMESPACE: Fix an error with C routines in a Linux configuration 2017-03-22 Aurélie Siberchicot * NAMESPACE, src/init.c: Fix an error with C routines in a Windows configuration (32bit) 2017-03-22 Aurélie Siberchicot * man/divcmax.Rd: Example in divcmax becomes 'dontrun', pending correction 2017-03-20 Aurélie Siberchicot * NAMESPACE, src/init.c: Register native routines (new recommendations in R-3.4.0) 2017-02-24 Stéphane Dray * R/dist.ktab.R: Remove some useless checks 2017-02-16 Aurélie Siberchicot * man/casitas.Rd: Update an invalid URL 2017-02-14 Stéphane Dray * R/dist.ktab.R: Revert commit 0894456972fea6668635069832ef6a7739c1f150 (bug was not fixed by the previous corrections). 2017-02-14 Stéphane Dray * NAMESPACE, R/RV.rtest.R, R/RVdist.randtest.R, R/betwitdpcoa.R, R/combine.4thcorner.R, R/corkdist.R, R/costatis.R, R/fourthcorner.R, R/fourthcorner.rlq.R, R/fourthcorner2.R, R/gearymoran.R, R/krandtest.R, R/mantel.randtest.R, R/mantel.rtest.R, R/multispati.randtest.R, R/multispati.rtest.R, R/niche.R, R/orthogram.R, R/plot.4thcorner.R, R/procuste.R, R/procuste.randtest.R, R/procuste.rtest.R, R/randtest.R, R/randtest.amova.R, R/randtest.between.R, R/randtest.cca.R, R/randtest.coinertia.R, R/randtest.discrimin.R, R/randtest.dpcoa.R, R/randtest.pcaiv.R, R/randtest.pcaivortho.R, R/randtest.rlq.R, R/rtest.R, R/rtest.between.R, R/rtest.discrimin.R, R/statico.R, R/testdim.R, man/RV.rtest.Rd, man/RVdist.randtest.Rd, man/combine.4thcorner.Rd, man/corkdist.Rd, man/costatis.randtest.Rd, man/fourthcorner.Rd, man/krandtest.Rd, man/mantel.randtest.Rd, man/mantel.rtest.Rd, man/multispati.randtest.Rd, man/multispati.rtest.Rd, man/orthogram.Rd, man/procuste.randtest.Rd, man/procuste.rtest.Rd, man/randtest.Rd, man/rtest.Rd, man/statico.krandtest.Rd: Modify the structures of classes (randtest and rtest) to store outputs of randomization procedures 2017-02-10 Stéphane Dray * R/dist.ktab.R: Correct a bug in the management of fuzzy data. Message of Jean-Yves BARNAGAUD on adelist (08/02/2017). 2017-02-10 Stéphane Dray * R/dist.ktab.R: Reindent lines 2017-02-01 Aurélie Siberchicot * man/divc.Rd, man/divcmax.Rd, man/lizards.Rd, man/newick.eg.Rd, man/randboot.Rd, man/randxval.Rd: Correct some typo 2017-01-31 Aurélie Siberchicot * man/bwca.dpcoa.Rd, man/fourthcorner.Rd, man/mafragh.Rd, man/phylog.Rd: Update bibliographic references (in press) 2017-01-23 Aurélie Siberchicot * man/bwca.dpcoa.Rd, man/julliot.Rd, man/mafragh.Rd, man/multispati.Rd, man/nipals.Rd, man/olympic.Rd, man/pcw.Rd, man/sarcelles.Rd: Solve errors in examples not runned 2017-01-18 Aurélie Siberchicot * man/area.plot.Rd, man/atya.Rd, man/avijons.Rd, man/julliot.Rd: Correct the import of functions of the suggested packages used in some examples. 2017-01-18 Aurélie Siberchicot * man/acacia.Rd, man/area.plot.Rd, man/avijons.Rd, man/between.Rd, man/butterfly.Rd, man/capitales.Rd, man/cca.Rd, man/corvus.Rd, man/doubs.Rd, man/dudi.fca.Rd, man/euro123.Rd, man/gearymoran.Rd, man/ggtortoises.Rd, man/gridrowcol.Rd, man/julliot.Rd, man/kcponds.Rd, man/lascaux.Rd, man/mafragh.Rd, man/meau.Rd, man/multispati.Rd, man/nipals.Rd, man/olympic.Rd, man/orthobasis.Rd, man/pcaivortho.Rd, man/pcw.Rd, man/plot.between.Rd, man/plot.within.Rd, man/presid2002.Rd, man/procuste.Rd, man/randEH.Rd, man/santacatalina.Rd, man/scatter.coa.Rd, man/t3012.Rd, man/trichometeo.Rd, man/westafrica.Rd, man/witwit.coa.Rd, man/zealand.Rd: Complete some T/F in TRUE/FALSE 2017-01-18 Aurélie Siberchicot * DESCRIPTION, man/area.plot.Rd, man/atlas.Rd, man/atya.Rd, man/avijons.Rd, man/buech.Rd, man/butterfly.Rd, man/capitales.Rd, man/elec88.Rd, man/ggtortoises.Rd, man/irishdata.Rd, man/julliot.Rd, man/jv73.Rd, man/kcponds.Rd, man/mafragh.Rd, man/maples.Rd, man/mdpcoa.Rd, man/multispati.Rd, man/multispati.randtest.Rd, man/multispati.rtest.Rd, man/neig.Rd, man/nipals.Rd, man/olympic.Rd, man/oribatid.Rd, man/phylog.Rd, man/rhizobium.Rd, man/s.image.Rd, man/s.kde2d.Rd, man/s.logo.Rd, man/t3012.Rd, man/tintoodiel.Rd, man/vegtf.Rd, man/westafrica.Rd: 'quiet' parameter becomes 'quietly' in the 'requireNamespace' function. Add 'adephylo' in the suggested packages. Correct the import of functions of the suggested packages used in examples. 2017-01-13 Stéphane Dray * R/between.R: use weights to properly darw ellipses when non-uniform row weights are used. 2017-01-13 Stéphane Dray * R/within.R: Correct a small bug in plot of wca. Use weights to plot ellipses (this allow that ellipses are centred on 0 when coa is used). Thanks to Sylvain Dolédec. 2017-01-12 Aurélie Siberchicot * man/chats.Rd: Correct typos in a help file 2016-12-20 Aurélie Siberchicot * man/rpjdl.Rd: Correct the species number in the help file of rpjdl 2016-12-13 Aurélie Siberchicot * ChangeLog: ---------- release of ade4 1.7-5 ---------- 2016-12-13 Aurélie Siberchicot * DESCRIPTION: ---------- release of ade4 1.7-5 ---------- 2016-12-13 Aurélie Siberchicot * README.md: Add badge 2016-11-28 Aurélie Siberchicot * man/PI2newick.Rd, man/ade4.package.Rd, man/adegraphicsLoaded.Rd, man/aminoacyl.Rd, man/apqe.Rd, man/ardeche.Rd, man/as.taxo.Rd, man/atlas.Rd, man/atya.Rd, man/avijons.Rd, man/aviurba.Rd, man/banque.Rd, man/baran95.Rd, man/bca.rlq.Rd, man/between.Rd, man/betweencoinertia.Rd, man/buech.Rd, man/bwca.dpcoa.Rd, man/cailliez.Rd, man/carni70.Rd, man/carniherbi49.Rd, man/casitas.Rd, man/cca.Rd, man/chatcat.Rd, man/chats.Rd, man/clementines.Rd, man/coinertia.Rd, man/combine.4thcorner.Rd, man/corkdist.Rd, man/costatis.Rd, man/costatis.randtest.Rd, man/discrimin.Rd, man/discrimin.coa.Rd, man/dist.binary.Rd, man/dist.dudi.Rd, man/dist.genet.Rd, man/dist.ktab.Rd, man/dist.neig.Rd, man/dist.prop.Rd, man/dist.quant.Rd, man/divcmax.Rd, man/dotchart.phylog.Rd, man/doubs.Rd, man/dpcoa.Rd, man/dudi.Rd, man/dudi.acm.Rd, man/dudi.coa.Rd, man/dudi.dec.Rd, man/dudi.fca.Rd, man/dudi.hillsmith.Rd, man/dudi.mix.Rd, man/dudi.nsc.Rd, man/dudi.pca.Rd, man/dudi.pco.Rd, man/escopage.Rd, man/euro123.Rd, man/foucart.Rd, man/fourthcorner.Rd, man/fruits.Rd, man/gearymoran.Rd, man/granulo.Rd, man/gridrowcol.Rd, man/ichtyo.Rd, man/inertia.dudi.Rd, man/is.euclid.Rd, man/julliot.Rd, man/jv73.Rd, man/kdist.Rd, man/kdist2ktab.Rd, man/kdisteuclid.Rd, man/krandtest.Rd, man/ktab.Rd, man/ktab.data.frame.Rd, man/ktab.list.df.Rd, man/ktab.list.dudi.Rd, man/ktab.match2ktabs.Rd, man/ktab.within.Rd, man/lascaux.Rd, man/lingoes.Rd, man/macon.Rd, man/macroloire.Rd, man/mantel.rtest.Rd, man/mariages.Rd, man/mbpcaiv.Rd, man/mbpls.Rd, man/mcoa.Rd, man/mdpcoa.Rd, man/meau.Rd, man/meaudret.Rd, man/mfa.Rd, man/microsatt.Rd, man/mjrochet.Rd, man/mld.Rd, man/mollusc.Rd, man/monde84.Rd, man/morphosport.Rd, man/multiblock.Rd, man/multispati.randtest.Rd, man/multispati.rtest.Rd, man/newick.eg.Rd, man/newick2phylog.Rd, man/niche.Rd, man/nipals.Rd, man/njplot.Rd, man/originality.Rd, man/orthobasis.Rd, man/orthogram.Rd, man/ours.Rd, man/palm.Rd, man/pcaiv.Rd, man/pcaivortho.Rd, man/phylog.Rd, man/plot.between.Rd, man/plot.phylog.Rd, man/plot.within.Rd, man/procuste.Rd, man/procuste.rtest.Rd, man/pta.Rd, man/quasieuclid.Rd, man/randboot.multiblock.Rd, man/randtest.coinertia.Rd, man/randtest.pcaiv.Rd, man/reconst.Rd, man/rhone.Rd, man/rlq.Rd, man/rpjdl.Rd, man/s.match.class.Rd, man/sarcelles.Rd, man/scalewt.Rd, man/scatter.Rd, man/scatter.fca.Rd, man/scatterutil.Rd, man/sco.class.Rd, man/sco.gauss.Rd, man/sco.label.Rd, man/sco.match.Rd, man/statico.Rd, man/statico.krandtest.Rd, man/steppe.Rd, man/supcol.Rd, man/suprow.Rd, man/symbols.phylog.Rd, man/syndicats.Rd, man/t3012.Rd, man/table.phylog.Rd, man/tarentaise.Rd, man/testdim.Rd, man/testdim.multiblock.Rd, man/trichometeo.Rd, man/ungulates.Rd, man/variance.phylog.Rd, man/veuvage.Rd, man/wca.rlq.Rd, man/westafrica.Rd, man/within.Rd, man/withincoinertia.Rd, man/withinpca.Rd, man/witwit.coa.Rd, man/woangers.Rd, man/worksurv.Rd, src/adesub.c: Correct encoding of Rd files 2016-11-25 Aurélie Siberchicot * man/gearymoran.Rd, man/mafragh.Rd, man/multispati.Rd, man/multispati.randtest.Rd, man/multispati.rtest.Rd: Update and clean 'mafragh' data 2016-11-21 Stéphane Dray * : Merge pull request #4 from zkamvar/zkamvar-patch-1 Fix bug in randtest.amova 2016-11-20 Zhian N. Kamvar * R/randtest.amova.R: fix bug in randtest.amova This bug came up in https://groups.google.com/forum/#!topic/poppr/D1gpqgQM2F0 There is no issue when comparing three hierarchical levels, but when there are four or more, the alternate hypothesis for every fourth level is incorrect due to the recycling of c("less", "greater", "greater"). 2016-10-18 Stéphane Dray * R/nipals.R: Correct a small bug identified by Denis Clot in the rescaling of sd 2016-09-27 Stéphane Dray * R/orthobasis.R: Correct a minor bug in the print method of orthobasis objects 2016-09-12 Stéphane Dray * README.md: Update homepage 2016-07-22 Stéphane Dray * man/dist.ktab.Rd: Update the doc to indicate that ordered variables are not yet considered. 2016-06-10 Stéphane Dray * : commit 7a4a263d8ac2822ee89f1cf167e4e118c03b4023 Author: Stéphane Dray Date: Fri Jun 10 15:50:04 2016 +0200 2016-05-20 Aurélie Siberchicot * .Rbuildignore, man/pcw.Rd: Update Rbuildignore 2016-05-13 Stéphane Dray * R/scatterutil.R: Correct a bug when covariance is null (ellipses were reversed) 2016-05-13 Stéphane Dray * R/dudi.pco.R: Correct a bug in the scaling of normed components with non-uniform weights 2016-05-02 Stéphane Dray * NAMESPACE, R/inertia.dudi.R, man/inertia.dudi.Rd: The function 'inertia.dudi' now becomes a method. It returns object of class 'inertia' with 'print' and 'summary' methods 2016-03-21 Stéphane Dray * man/elec88.Rd: Update the doc and add informations on nb, Spatial and Spatialcontour 2016-03-04 Stéphane Dray * NAMESPACE, R/suprow.R, man/suprow.Rd: New methods suprow.acm, suprow.mix and predict.dudi 2016-03-04 Stéphane Dray * R/dudi.hillsmith.R: Function dudi.hillsmith now returns vectors center and norm (useful for the suprow.mix function) 2016-03-01 Aurélie Siberchicot * : DESCRIPTION: ---------- release of ade4 1.7-4 ---------- 2016-02-24 Stéphane Dray * : Merge pull request #3 from Rekyt/patch-1 Correct Reference with DOI 2016-02-22 Aurélie Siberchicot * .gitignore: Add a configure file to ignore some files in the Git repository 2016-02-21 Stéphane Dray * : commit 93fe29b91eb21adeb4f08e07b432b3b61d54e07a Author: Stéphane Dray Date: Sun Feb 21 14:33:14 2016 +0100 2016-01-22 Jean Thioulouse * R/mfa.R: print.mfa print mfa object class 2015-12-16 Stéphane Dray * : commit e983689cedf4c297aae70ee4dcce8cecca1a6b54 Author: Stéphane Dray Date: Wed Dec 16 10:45:46 2015 +0100 2015-11-26 Aurélie Siberchicot * README.md: Add references to the binary packages 2015-11-24 Stéphane Dray * R/dpcoa.R: Update the plot function to represent species (and sites or their diversity according to RaoDecomp argument) 2015-11-24 Stéphane Dray * R/dpcoa.R: Correct a small bug in the handling of species names 2015-11-24 Stéphane Dray * : commit 4691e39258ac4c2f743d97f94cbc2b6d94d53ec1 Author: Stéphane Dray Date: Tue Nov 24 13:58:43 2015 +0100 2015-11-24 Stéphane Dray * R/randtest.dpcoa.R, man/randtest.dpcoa.Rd: Add new function randtest.dpcoa 2015-11-10 Stéphane Dray * DESCRIPTION: Add BugReports field 2015-11-10 Stéphane Dray * ChangeLog: ---------- release of ade4 1.7-3 ---------- 2015-11-10 Stéphane Dray * : commit 13ff73165e429972dbfaa2d44f8eaef4ca826324 Author: Stéphane Dray Date: Tue Nov 10 10:04:42 2015 +0100 2015-11-10 Stéphane Dray * DESCRIPTION: ---------- release of ade4 1.7-3 ---------- 2015-10-19 Jean Thioulouse * R/ktab.R: Change ktab.util.names to allow for ktabs with varying numbers of rows (columns) 2015-10-14 Aurélie Siberchicot * DESCRIPTION: Suggest the 'CircStats' package which is used in Rd cross-references 2015-09-21 Stéphane Dray * R/randtest-internal.R, R/randtest.discrimin.R, src/fourthcorner.c, src/tests.c: Remove some unused variables in C code 2015-09-18 Stéphane Dray * README.md: Add badges and informations for Mac and Windows users 2015-09-18 Stéphane Dray * .travis.yml: Change setting for travis(error was produced due to unchanged dates and version numbers) 2015-09-18 Stéphane Dray * .Rbuildignore, appveyor.yml: Add windows check (via appveyor) 2015-09-18 Stéphane Dray * R/mbpcaiv.R, R/mbpls.R, R/multiblock.R: Udate multiblock methods to deal with non-centred data 2015-09-18 Stéphane Dray * .Rbuildignore: Add README.md to .Rbuildignore 2015-09-15 Stéphane Dray * R/scalewt.R, man/scalewt.Rd: Correct a bug to allow scaling without centring 2015-09-09 Stéphane Dray * : Reorder the levels of season (spring as first) 2015-09-09 Stéphane Dray * R/randtest.rlq.R: Correct a bug to deal with a single trait and/or environmental variable (email by C. ter Braak 28/08/2015) 2015-09-09 Stéphane Dray * .Rbuildignore, .travis.yml, README.md: Add travis support and README 2015-08-27 Stéphane Dray * R/dudi.R: Use make.unique instead of make.names to produce row.names for outputs. The second is devoted to names (e.g., by avoiding integer which are authorized as row.names) 2015-08-26 Jean Thioulouse * R/pta.R: Modify the levels names of supTI 2015-07-15 Stéphane Dray * : Reorder the levels of the 'design' factor (use temporal instead of alphabetic order) 2015-07-02 Aurélie Siberchicot * DESCRIPTION, NAMESPACE: The default packages other than 'base' are now imported (new item for r-devel) 2015-06-12 Aurélie Siberchicot * R/dudi.fca.R, R/utilities.R: Modify the '$call' in 'dudi.fpca' 2015-06-08 Stéphane Dray * NAMESPACE, R/cca.R, man/cca.Rd: New summary method for 'cca' objects 2015-06-01 Aurélie Siberchicot * DESCRIPTION, man/add.scatter.Rd: Update an exemple which uses the new function 'plotEig' of 'adegraphics' 2015-04-14 07:38 aursiber * DESCRIPTION: ---------- release of ade4 1.7-2 ---------- 2015-04-08 13:27 aursiber * DESCRIPTION: ---------- release of ade4 1.7-1 ---------- 2015-04-08 09:25 sdray * DESCRIPTION, NAMESPACE, R/orthobasis.R, man/orthobasis.Rd: Add new functions to handle orthobasis objects. The orthobasis.listw function is removed and will be available in the forthcoming adespatial 2015-04-03 16:28 aursiber * man/kplot.sepan.Rd: The 'kplot.sepan.coa' function becomes 'kplotsepan.coa' in 'adegraphics' also 2015-04-03 14:30 aursiber * NAMESPACE, R/kplot.sepan.R, man/kplot.sepan.Rd: The 'kplot.sepan.coa' function becomes 'kplotsepan.coa' 2015-04-03 14:04 aursiber * DESCRIPTION, man/abouheif.eg.Rd, man/avijons.Rd, man/baran95.Rd, man/bsetal97.Rd, man/capitales.Rd, man/chevaine.Rd, man/cnc2003.Rd, man/doubs.Rd, man/ecomor.Rd, man/euro123.Rd, man/ggtortoises.Rd, man/hdpg.Rd, man/jv73.Rd, man/lascaux.Rd, man/lizards.Rd, man/mafragh.Rd, man/maples.Rd, man/microsatt.Rd, man/mjrochet.Rd, man/newick.eg.Rd, man/oribatid.Rd, man/pap.Rd, man/presid2002.Rd, man/procella.Rd, man/rpjdl.Rd, man/tarentaise.Rd, man/trichometeo.Rd: Remove invalid url in man files 2015-03-29 11:59 sdray * R/combine.4thcorner.R, R/plot.4thcorner.R: Update the outputs of the combine.4thcorner functions to avoid bugs when the 'D' stat can not be computed (factor with only one level) 2015-03-23 15:40 aursiber * DESCRIPTION: ---------- release of ade4 1.7-0 ---------- 2015-03-23 10:52 sdray * DESCRIPTION: Aurelie is the new official maintainer 2015-03-23 08:45 sdray * R/coinertia.R, R/rlq.R: Improve the outputs of the RLQ/coinertia analysis 2015-03-20 09:13 aursiber * DESCRIPTION, R/mbpcaiv.R, R/mbpls.R, R/multispati.R, R/orthobasis.R, R/s.image.R, R/s.kde2d.R, R/s.logo.R, man/area.plot.Rd, man/atlas.Rd, man/atya.Rd, man/avijons.Rd, man/buech.Rd, man/butterfly.Rd, man/capitales.Rd, man/ecg.Rd, man/elec88.Rd, man/ggtortoises.Rd, man/irishdata.Rd, man/julliot.Rd, man/jv73.Rd, man/kcponds.Rd, man/mafragh.Rd, man/maples.Rd, man/mdpcoa.Rd, man/multispati.Rd, man/multispati.randtest.Rd, man/multispati.rtest.Rd, man/neig.Rd, man/nipals.Rd, man/olympic.Rd, man/oribatid.Rd, man/pcw.Rd, man/phylog.Rd, man/rhizobium.Rd, man/s.image.Rd, man/s.kde2d.Rd, man/s.logo.Rd, man/sarcelles.Rd, man/score.coa.Rd, man/t3012.Rd, man/tintoodiel.Rd, man/vegtf.Rd, man/westafrica.Rd: Update the use of packages listed in 'Suggests' according with R-3.1.3 2015-03-18 14:07 sdray * R/between.R: Correct a bug in 1D plot of plot.between (message of Matthieu Salpeteur 18/03/2015 on adelist) 2015-02-19 19:03 sdray * R/dist.dudi.R: Correct a bug to deal with null distances (message of Robin Cura on adelist 16/02/2015 2015-02-18 15:03 sdray * R/krandboot.R, R/krandxval.R, R/mbpcaiv.R, R/mbpls.R, R/multiblock.R, R/randxval.R, man/mbpcaiv.Rd, man/mbpls.Rd, man/multiblock.Rd, man/randboot.multiblock.Rd, man/testdim.multiblock.Rd: Update some functions related to multiblock methods. Use 'ginv' to deal with matrices are not of full rank. 2015-01-15 11:50 sdray * NAMESPACE, R/betwitdpcoa.R, man/bwca.dpcoa.Rd: Add new functions to perform between- within dpcoa (Dray et al. 2015, MER) 2015-01-09 12:35 sdray * src/adesub.c: remove the unused variable 'seed' 2015-01-08 16:47 aursiber * man/add.scatter.Rd, man/area.plot.Rd, man/atlas.Rd, man/capitales.Rd, man/chats.Rd, man/corvus.Rd, man/divcmax.Rd, man/gridrowcol.Rd, man/irishdata.Rd, man/mstree.Rd, man/orthobasis.Rd, man/pcw.Rd, man/randxval.Rd, man/rtest.Rd, man/s.class.Rd, man/s.corcircle.Rd, man/s.distri.Rd, man/s.image.Rd, man/s.label.Rd, man/s.logo.Rd, man/s.match.Rd, man/s.traject.Rd, man/s.value.Rd, man/santacatalina.Rd, man/scatterutil.Rd, man/score.Rd, man/table.value.Rd, man/toxicity.Rd, man/triangle.class.Rd, man/westafrica.Rd, man/worksurv.Rd: Modify examples due to modifications in adegraphics 2015-01-08 16:36 sdray * src/adesub.c, src/adesub.h: Remove calls to C random number generators (now use R RNG) 2015-01-08 13:59 thioulouse * NAMESPACE, R/costatis.R, R/ktab.R, R/pta.R, R/statico.R, man/costatis.Rd, man/costatis.randtest.Rd, man/statico.Rd, man/statico.krandtest.Rd: Added statico.krandtest and costatis.randtest funtions for permutation tests 2014-12-08 14:33 sdray * R/fourthcorner.R, R/fourthcorner.rlq.R, R/print.4thcorner.R: Correct a bug to display properly the outputs in the case of 1 trait x 1 env variable 2014-11-28 09:38 aursiber * man/scatter.coa.Rd: Correct the documentation of the used method in 'scatter.coa' 2014-11-14 08:42 sdray * R/mdpcoa.R: correct the call to dist.dna of the ape package 2014-11-14 08:41 sdray * NAMESPACE, R/dpcoa.R, R/mdpcoa.R, man/dpcoa.Rd, man/humDNAm.Rd: Update the dpcoa function: names of outputs are modified and the df argument shoul be a site-by-species nor a species-by-sites matrix. This allows to be more coherent with other methods 2014-11-05 15:32 sdray * man/atlas.Rd, man/butterfly.Rd, man/chats.Rd, man/dpcoa.Rd, man/gearymoran.Rd, man/gridrowcol.Rd, man/orthobasis.Rd: Modify examples due to modifications in adegraphics 2014-10-30 15:04 sdray * data/capitales.rda, man/capitales.Rd: Transform the Spatial component from SpatialPolygonsDataFrame to SpatialPolygons 2014-09-11 14:50 sdray * NAMESPACE, R/procuste.R, man/macaca.Rd, man/procuste.Rd: Change names of arguments and outputs of 'procuste' function and add a method 'randtest' for procuste class 2014-09-02 12:04 sdray * data/pcw.rda, man/pcw.Rd: Add new dataset (distribution of trees in forest plots along the panama canal) 2014-07-23 14:09 sdray * R/fourthcorner.rlq.R: Correct a small bug (used names instead of colnames on a matrix) 2014-06-18 15:26 aursiber * DESCRIPTION, NAMESPACE, man/acacia.Rd, man/add.scatter.Rd, man/aravo.Rd, man/ardeche.Rd, man/area.plot.Rd, man/atlas.Rd, man/atya.Rd, man/avijons.Rd, man/avimedi.Rd, man/bacteria.Rd, man/banque.Rd, man/baran95.Rd, man/between.Rd, man/betweencoinertia.Rd, man/bf88.Rd, man/buech.Rd, man/butterfly.Rd, man/capitales.Rd, man/carni70.Rd, man/cca.Rd, man/chats.Rd, man/chazeb.Rd, man/chevaine.Rd, man/clementines.Rd, man/coinertia.Rd, man/coleo.Rd, man/corkdist.Rd, man/corvus.Rd, man/deug.Rd, man/discrimin.Rd, man/dist.prop.Rd, man/dist.quant.Rd, man/doubs.Rd, man/dpcoa.Rd, man/dudi.acm.Rd, man/dudi.coa.Rd, man/dudi.fca.Rd, man/dudi.hillsmith.Rd, man/dudi.mix.Rd, man/dudi.nsc.Rd, man/dudi.pca.Rd, man/ecomor.Rd, man/elec88.Rd, man/euro123.Rd, man/foucart.Rd, man/friday87.Rd, man/fruits.Rd, man/gearymoran.Rd, man/ggtortoises.Rd, man/granulo.Rd, man/gridrowcol.Rd, man/hdpg.Rd, man/housetasks.Rd, man/humDNAm.Rd, man/irishdata.Rd, man/julliot.Rd, man/jv73.Rd, man/kcponds.Rd, man/kdist2ktab.Rd, man/kdisteuclid.Rd, man/kplot.foucart.Rd, man/kplot.mcoa.Rd, man/kplot.mfa.Rd, man/kplot.pta.Rd, man/kplot.sepan.Rd, man/kplot.statis.Rd, man/ktab.Rd, man/ktab.list.df.Rd, man/ktab.list.dudi.Rd, man/lascaux.Rd, man/macaca.Rd, man/macroloire.Rd, man/mafragh.Rd, man/mariages.Rd, man/meau.Rd, man/meaudret.Rd, man/microsatt.Rd, man/mollusc.Rd, man/mstree.Rd, man/multiblock.Rd, man/multispati.Rd, man/neig.Rd, man/niche.Rd, man/nipals.Rd, man/olympic.Rd, man/oribatid.Rd, man/orthobasis.Rd, man/ours.Rd, man/pcaivortho.Rd, man/plot.between.Rd, man/plot.within.Rd, man/presid2002.Rd, man/procuste.Rd, man/pta.Rd, man/rankrock.Rd, man/rpjdl.Rd, man/s.chull.Rd, man/s.image.Rd, man/s.kde2d.Rd, man/s.match.class.Rd, man/santacatalina.Rd, man/sarcelles.Rd, man/scatter.acm.Rd, man/scatter.coa.Rd, man/scatter.dudi.Rd, man/scatter.fca.Rd, man/sco.distri.Rd, man/score.acm.Rd, man/score.pca.Rd, man/seconde.Rd, man/skulls.Rd, man/statis.Rd, man/supcol.Rd, man/suprow.Rd, man/t3012.Rd, man/table.paint.Rd, man/tintoodiel.Rd, man/tortues.Rd, man/toxicity.Rd, man/triangle.plot.Rd, man/trichometeo.Rd, man/vegtf.Rd, man/wca.rlq.Rd, man/westafrica.Rd, man/within.Rd, man/withincoinertia.Rd, man/withinpca.Rd, man/witwit.coa.Rd, man/worksurv.Rd, man/zealand.Rd: Update the examples to become effective when 'adegraphics' is loaded 2014-05-20 13:30 sdray * R/add.scatter.R, man/EH.Rd, man/PI2newick.Rd, man/add.scatter.Rd, man/aminoacyl.Rd, man/amova.Rd, man/as.taxo.Rd, man/bacteria.Rd, man/between.Rd, man/betweencoinertia.Rd, man/cailliez.Rd, man/cca.Rd, man/coinertia.Rd, man/corkdist.Rd, man/disc.Rd, man/discrimin.Rd, man/discrimin.coa.Rd, man/dist.binary.Rd, man/dist.dudi.Rd, man/dist.genet.Rd, man/dist.neig.Rd, man/dist.prop.Rd, man/dist.quant.Rd, man/divc.Rd, man/divcmax.Rd, man/dotchart.phylog.Rd, man/dpcoa.Rd, man/dudi.Rd, man/dudi.acm.Rd, man/dudi.coa.Rd, man/dudi.dec.Rd, man/dudi.fca.Rd, man/dudi.hillsmith.Rd, man/dudi.mix.Rd, man/dudi.nsc.Rd, man/dudi.pca.Rd, man/dudi.pco.Rd, man/foucart.Rd, man/gearymoran.Rd, man/gridrowcol.Rd, man/inertia.dudi.Rd, man/is.euclid.Rd, man/kdist.Rd, man/kdist2ktab.Rd, man/kdisteuclid.Rd, man/krandtest.Rd, man/ktab.Rd, man/ktab.data.frame.Rd, man/ktab.list.df.Rd, man/ktab.list.dudi.Rd, man/ktab.within.Rd, man/lingoes.Rd, man/mantel.randtest.Rd, man/mantel.rtest.Rd, man/mcoa.Rd, man/mfa.Rd, man/mld.Rd, man/multispati.Rd, man/multispati.randtest.Rd, man/multispati.rtest.Rd, man/newick.eg.Rd, man/newick2phylog.Rd, man/niche.Rd, man/nipals.Rd, man/njplot.Rd, man/optimEH.Rd, man/originality.Rd, man/orisaved.Rd, man/orthobasis.Rd, man/orthogram.Rd, man/palm.Rd, man/pcaiv.Rd, man/pcaivortho.Rd, man/phylog.Rd, man/plot.between.Rd, man/plot.phylog.Rd, man/plot.within.Rd, man/procuste.Rd, man/procuste.randtest.Rd, man/procuste.rtest.Rd, man/pta.Rd, man/quasieuclid.Rd, man/randEH.Rd, man/randtest.amova.Rd, man/randtest.between.Rd, man/randtest.coinertia.Rd, man/randtest.discrimin.Rd, man/randtest.pcaiv.Rd, man/reconst.Rd, man/rlq.Rd, man/s.logo.Rd, man/s.match.class.Rd, man/scatterutil.Rd, man/sco.class.Rd, man/sco.gauss.Rd, man/sco.label.Rd, man/sco.match.Rd, man/supcol.Rd, man/suprow.Rd, man/symbols.phylog.Rd, man/table.phylog.Rd, man/testdim.Rd, man/variance.phylog.Rd, man/westafrica.Rd, man/within.Rd, man/withincoinertia.Rd, man/withinpca.Rd, man/witwit.coa.Rd: Update email addresses 2014-05-16 15:38 sdray * NAMESPACE, R/between.R, R/within.R, man/plot.between.Rd, man/plot.within.Rd: New summary method for within and between classes 2014-05-16 15:19 sdray * R/randtest.between.R: Clean the code 2014-04-18 15:50 aursiber * R/scatterutil.R, man/area.plot.Rd, man/carni70.Rd, man/divcmax.Rd, man/dudi.acm.Rd, man/ecomor.Rd, man/julliot.Rd, man/microsatt.Rd, man/newick2phylog.Rd, man/orthogram.Rd, man/presid2002.Rd, man/score.Rd: Correct the examples which are not run 2014-04-17 15:44 sdray * NAMESPACE, R/krandboot.R, R/krandxval.R, R/mbpcaiv.R, R/mbpls.R, R/multiblock.R, R/randboot.R, R/randxval.R, man/mbpcaiv.Rd, man/mbpls.Rd, man/multiblock.Rd, man/randboot.Rd, man/randboot.multiblock.Rd, man/randxval.Rd, man/testdim.multiblock.Rd: Add new functions for multiblock analysis (coll. with S. Bougeard): multiblock pcaiv and multiblock pls. Add new functions and classes to manage results of two-fold cross-validation and bootstrap 2014-04-17 15:39 sdray * data/chickenk.rda, man/chickenk.Rd: New data set chickenk 2014-04-17 15:24 sdray * R/testdim.R, man/testdim.Rd: Change argument name for testdim method 2014-04-17 15:22 sdray * NAMESPACE, man/bacteria.Rd, man/dudi.acm.Rd, man/dudi.hillsmith.Rd, man/dudi.mix.Rd, man/santacatalina.Rd, man/scatter.coa.Rd: Unexport methods for generic functions scatter and score 2014-04-17 15:19 sdray * NAMESPACE, man/adegraphicsLoaded.Rd: Export the function adegraphicsLoaded 2014-04-17 08:19 sdray * R/utilities.R: New function 'adegraphicsLoaded' to test if adegraphics is loaded 2014-04-15 08:41 sdray * NAMESPACE, R/dudi.R, R/ktab.R, man/dudi.Rd, man/ktab.Rd: Improve '[.ktab' and add '[.dudi': extraction methods allow to select rows and/or columns of dudi and ktab objects 2014-04-15 07:44 sdray * ., NAMESPACE, R/ktab.R, R/ktab.data.frame.R, R/ktab.list.df.R, R/ktab.list.dudi.R, R/ktab.match2ktabs.R, R/ktab.within.R, man/ktab.Rd: Clean the building of TL, TC, T4 (they contain names and not numbers) and remove two bugs (building of TC and in [.ktab) 2014-04-11 07:45 sdray * R/fourthcorner.rlq.R: Correct a typo 2014-03-13 17:36 sdray * R/randtest.rlq.R, src/fourthcorner.c, src/tests.c: Correct some minor bugs and typos 2014-01-14 15:27 thioulouse * R/foucart.R, R/kplot.foucart.R, R/kplot.mcoa.R, R/kplot.mfa.R, R/kplot.pta.R, R/kplot.sepan.R, R/kplot.statis.R, R/ktab.R, R/ktab.data.frame.R, R/ktab.list.df.R, R/ktab.list.dudi.R, R/ktab.match2ktabs.R, R/ktab.within.R, R/mcoa.R, R/mdpcoa.R, R/mfa.R, R/pta.R, R/sepan.R, R/statis.R: Global update of TL TC and T4 ktab elements 2014-01-07 15:16 thioulouse * R/ktab.R, R/pta.R: row names correction of supIX and supIY in a kcoinertia pta 2013-12-03 13:22 sdray * data/mafragh.rda: Modify the order of the sites in the 'SpatialPoints' object to be coherent with the 'nb' object 2013-11-19 15:58 sdray * DESCRIPTION: ---------- release of ade4 1.6-2 ---------- 2013-11-19 15:56 sdray * NAMESPACE: Re-export some internal/utility functions that are used by other packages 2013-11-19 15:55 sdray * TITLE: Remove the TITLE file which is no more used 2013-11-15 22:41 sdray * DESCRIPTION: ---------- release of ade4 1.6-1 ---------- 2013-11-15 22:43 sdray * man/add.scatter.Rd, man/capitales.Rd, man/dist.ktab.Rd, man/dotchart.phylog.Rd, man/fourthcorner.Rd, man/nipals.Rd, man/s.match.class.Rd, man/scatter.Rd: Reduce line widths 2013-11-14 12:47 sdray * DESCRIPTION: ---------- release of ade4 1.6-0 ---------- 2013-10-30 12:23 sdray * NAMESPACE, man/acacia.Rd, man/add.scatter.Rd, man/ade4toR.Rd, man/as.taxo.Rd, man/avimedi.Rd, man/baran95.Rd, man/combine.4thcorner.Rd, man/costatis.Rd, man/fourthcorner.Rd, man/granulo.Rd, man/kplot.pta.Rd, man/kplot.sepan.Rd, man/kplot.statis.Rd, man/ktab.match2ktabs.Rd, man/ktab.within.Rd, man/meau.Rd, man/meaudret.Rd, man/pcaivortho.Rd, man/phylog.Rd, man/plot.phylog.Rd, man/randtest.amova.Rd, man/reconst.Rd, man/rhone.Rd, man/rlq.Rd, man/rtest.between.Rd, man/scatterutil.Rd, man/statico.Rd, man/statis.Rd, man/supcol.Rd, man/suprow.Rd, man/taxo.eg.Rd, man/ungulates.Rd: The NAMESPACE file (which exported all functions) has be completely rewritten. Utilities and deprecated functions are not exported. S3 methods are declared. Several help pages have been modified to manage these changes. 2013-10-30 12:20 sdray * R/rtest.between.R: Now the rtest.between can handle objects created with between and bca functions 2013-10-30 12:19 sdray * R/supcol.R, R/suprow.R: suprow.default and supcol.default become suprow.dudi and supcol.dudi 2013-10-28 13:55 sdray * R/statis.R: Improve the speed of statis function. Thanks to Benoit Thieurmel (email sent 11/01/2013) 2013-10-28 12:53 sdray * R/mcoa.R: Correct a bug in the scaling of Tl1. Thanks to P. Bady, adelist 3/10/2013 2013-10-03 11:26 sdray * R/ktab.within.R: Correct a bug in ktab.within: column names were not handle correctly in some cases (Thanks to Pierre Bady, message on adelist 3/10/2013). Moreover, the order of bloc is given by levels and nor unique 2013-09-19 15:58 sdray * data/atlas.rda, data/atya.rda, data/avijons.rda, data/buech.rda, data/butterfly.rda, data/capitales.rda, data/elec88.rda, data/ggtortoises.rda, data/irishdata.rda, data/julliot.rda, data/jv73.rda, data/kcponds.rda, data/mafragh.rda, data/sarcelles.rda, data/t3012.rda, data/tintoodiel.rda, data/vegtf.rda, data/zealand.rda, man/cailliez.Rd, man/capitales.Rd, man/lingoes.Rd, man/s.logo.Rd: Correct a small bug in data files and update the help files to pass R CMD check 2013-09-19 11:39 sdray * data/atlas.rda, data/atya.rda, data/avijons.rda, data/buech.rda, data/butterfly.rda, data/capitales.rda, data/elec88.rda, data/ggtortoises.rda, data/irishdata.rda, data/julliot.rda, data/jv73.rda, data/kcponds.rda, data/mafragh.rda, data/sarcelles.rda, data/t3012.rda, data/tintoodiel.rda, data/vegtf.rda, data/zealand.rda: Add Spatial/nb objects in data files to prepare the future deprecation of area/neig/contour objects. Moreover, spatial information in data sets 't3012', 'elec88' and 'capitales' has been updated (coordinate system, city names, etc). 2013-09-17 15:08 sdray * R/scalewt.R: Correct a small bug in scalewt 2013-07-23 22:24 sdray * R/plot.4thcorner.R, man/fourthcorner.Rd: Add colors in fourthcorner plots 2013-05-28 08:10 sdray * R/scalewt.R: correct a small bug in scalewt when scale = FALSE 2013-05-07 21:45 sdray * R/combine.4thcorner.R, R/fourthcorner.R, R/fourthcorner.rlq.R, R/fourthcorner2.R, R/p.adjust.4thcorner.R, R/plot.4thcorner.R, R/print.4thcorner.R, R/summary.4thcorner.R, R/table.value.R, man/combine.4thcorner.Rd, man/fourthcorner.Rd, man/rlq.Rd, src/fourthcorner.c: Complete reimplementation of the outputs of fourthcorner functions. Now they return krandtest/randtest objects and adjustments for multiple tests can be used. Experimental fourthcorner.rlq 2013-05-07 19:51 sdray * data/aravo.rda, man/aravo.Rd: New dataset: aravo 2013-05-03 16:01 sdray * R/scatterutil.R: New argument 'bg' for scatterutil.base function 2013-04-30 21:07 sdray * R/randtest-internal.R, R/randtest.coinertia.R, R/randtest.rlq.R, R/rlq.R, man/rlq.Rd, src/adesub.c, src/adesub.h, src/testrlq.c, src/tests.c: Use the new 'dudi.type' function. New 'modeltype' argument for randtest.rlq. New function 'combine.randtest.rlq'. 2013-04-29 15:55 sdray * R/krandtest.R, man/krandtest.Rd: Update the doc of krandtest 2013-04-29 15:29 sdray * R/dudi.acm.R: Use the new fac2disj utility function 2013-04-29 15:28 sdray * R/dudi.acm.R, R/dudi.hillsmith.R, R/dudi.mix.R, R/fourthcorner.R, R/fourthcorner2.R, R/rlq.R, R/s.class.R, R/s.match.class.R, R/triangle.class.R, man/ade4-internal.Rd: Use the new fac2disj utility function 2013-04-29 13:14 sdray * R/krandtest.R: krandtest can now handle adjustments for multiple testing 2013-04-26 15:31 sdray * R/coinertia.R: Correct a small bug in the choice of the number of kept axes 2013-04-26 15:26 sdray * R/dudi.acm.R, R/utilities.R, man/ade4-internal.Rd, man/randtest-internal.Rd: New utilities functions 2013-04-26 15:03 sdray * R/scalewt.R, man/scalewt.Rd: New functions to compute weighted mean/var/cov for the levels of a factor 2013-04-26 11:38 sdray * R/dpcoa.R: dpcoa now returns 2013-04-05 12:31 sdray * DESCRIPTION: ---------- release of ade4 1.5-2 ---------- 2013-01-09 14:42 sdray * R/procuste.R, man/procuste.Rd: value 'nfact' is renamed 'nf' 2012-10-18 10:27 thioulouse * man/coinertia.Rd: Small typo fix 2012-10-18 10:26 thioulouse * R/betweencoinertia.R: Fixed a bug introduced in print.betcoi function 2012-10-17 16:29 sdray * src/tests.c: Correct a small bug in loops for the acm case 2012-10-17 15:49 sdray * R/randtest-internal.R, src/testrlq.c, src/tests.c: Clean the C code and correct a small bug (R strings were transformed in integers in C) that provokes problems on Mac OS X (thanks to Vincent Miele for his help) 2012-10-17 15:47 sdray * R/rlq.R: Correct the number of repetitions in randtest.rlq (was nrepet+1 instead of nrepet) 2012-10-16 13:32 thioulouse * R/betweencoinertia.R, R/coinertia.R, man/coinertia.Rd: Edited print functions for coinertia and betweencoinertia analyses 2012-10-16 13:30 thioulouse * R/scatter.fca.R: Bug correction in the call to s.distri: needed to be pass the xax and yax params 2012-09-21 16:02 sdray * R/sco.gauss.R: Correct a bug: dnorm has 'sd' as arguments and not 'var' (Thanks to Alice Julien-Laferriere) 2012-09-14 11:21 sdray * DESCRIPTION: ---------- release of ade4 1.5-1 ---------- 2012-09-14 11:19 sdray * R/randtest.cca.R, R/randtest.pcaiv.R, R/randtest.pcaivortho.R: Calls to Fortran routine 'dqrls' are replaced by public 'lm.wfit' 2012-07-27 14:49 sdray * R/bca.rlq.R, R/between.R, R/betweencoinertia.R, R/coinertia.R, R/corkdist.R, R/discrimin.R, R/dpcoa.R, R/dudi.R, R/dudi.acm.R, R/kplot.sepan.R, R/mcoa.R, R/multispati.R, R/niche.R, R/randtest.coinertia.R, R/randtest.discrimin.R, R/rlq.R, R/rtest.between.R, R/rtest.discrimin.R, R/scatter.acm.R, R/scatter.fca.R, R/score.acm.R, R/score.coa.R, R/score.mix.R, R/score.pca.R, R/testdim.R, R/wca.rlq.R, R/withincoinertia.R, R/witwit.R, R/witwitsepan.R: Use eval.parent(..) instead of eval(.., sys.frame(0)) to allow the call of ade4 functions inside other functions 2012-07-25 13:30 sdray * R/coinertia.R: Update the summary.coinertia function that now returns invisible results 2012-07-25 13:28 sdray * R/dudi.R: To avoid confusion, the term 'Explained' is replaced by 'Projected' in the summary.dudi function 2012-07-25 12:47 sdray * R/pcaiv.R, R/pcaivortho.R, man/pcaiv.Rd, man/pcaivortho.Rd: New functions 'summary.pcaiv' and 'summary.pcaivortho' 2012-07-25 12:46 sdray * R/dudi.R, man/dudi.Rd: New function 'summary.dudi' 2012-07-25 10:53 sdray * R/variance.phylog.R, man/variance.phylog.Rd: Returned is now an 'anova' object (was 'table') 2012-07-25 09:23 sdray * R/bca.rlq.R, R/between.R, R/betweencoinertia.R, R/coinertia.R, R/discrimin.R, R/dpcoa.R, R/dudi.R, R/foucart.R, R/ktab.R, R/mcoa.R, R/mfa.R, R/multispati.R, R/niche.R, R/nipals.R, R/pcaiv.R, R/pcaivortho.R, R/pta.R, R/rlq.R, R/sepan.R, R/statis.R, R/variance.phylog.R, R/wca.rlq.R, R/within.R, R/withincoinertia.R, R/witwit.R: Outputs produced by print.* functions are now matrices (were table) 2012-07-10 12:03 thioulouse * R/coinertia.R: Fix the problem of complex eigenvalues sometimes returned by eigen in the case n < (p, q) 2012-06-01 07:23 jombart * R/orthogram.R, man/ade4-deprecated.Rd, man/orthogram.Rd: Orthogram function is now deprecated. 2012-04-23 12:29 sdray * src/testdim.c: Correct a small bug (void function cannot return values) 2012-04-23 07:59 sdray * man/neig.Rd: Modify an example due to a change in the deldir package 2012-04-19 11:11 sdray * DESCRIPTION: ---------- release of ade4 1.5-0 ---------- 2012-04-17 15:23 sdray * R/bca.rlq.R, R/wca.rlq.R, data/piosphere.rda, man/bca.rlq.Rd, man/piosphere.Rd, man/wca.rlq.Rd: Add functions/data for partial RLQ analysis proposed by Wesuls et al (2012) 2012-04-16 13:06 sdray * R/ade4toR.R, R/amova.R, R/area.plot.R, R/between.R, R/betweencoinertia.R, R/cailliez.R, R/coinertia.R, R/corkdist.R, R/costatis.R, R/discrimin.R, R/dist.quant.R, R/dotcircle.R, R/dpcoa.R, R/dudi.acm.R, R/dudi.hillsmith.R, R/dudi.pco.R, R/foucart.R, R/gearymoran.R, R/is.euclid.R, R/kdisteuclid.R, R/kplot.foucart.R, R/kplot.mcoa.R, R/kplot.mfa.R, R/kplot.pta.R, R/kplot.sepan.R, R/kplot.statis.R, R/lingoes.R, R/mcoa.R, R/mdpcoa.R, R/mfa.R, R/multispati.R, R/neig.R, R/newick2phylog.R, R/niche.R, R/nipals.R, R/orthobasis.R, R/orthogram.R, R/pcaiv.R, R/pcaivortho.R, R/plot.phylog.R, R/procuste.R, R/pta.R, R/quasieuclid.R, R/rlq.R, R/s.arrow.R, R/s.corcircle.R, R/s.hist.R, R/s.kde2d.R, R/s.match.R, R/s.multinom.R, R/s.traject.R, R/s.value.R, R/scatter.acm.R, R/scatter.coa.R, R/scatter.dudi.R, R/scatter.fca.R, R/scatterutil.R, R/sco.quant.R, R/score.acm.R, R/score.mix.R, R/sepan.R, R/statis.R, R/symbols.phylog.R, R/table.cont.R, R/table.dist.R, R/table.paint.R, R/table.phylog.R, R/table.value.R, R/triangle.plot.R, R/within.R, R/withincoinertia.R, R/witwit.R, R/witwitsepan.R: Use full argument names to avoid partial matching 2012-04-07 21:29 sdray * DESCRIPTION: ---------- release of ade4 1.4-18 ---------- 2012-04-07 21:16 sdray * R/testdim.R, src/testdim.c: Modify testdim functions to avoid calls to 'exit' in C code 2012-04-07 21:13 sdray * NAMESPACE, R/ade4.R: Remove .FirstLib and use NAMESPACE (UseDynLib) to load DLL 2012-04-02 16:23 sdray * data/bacteria.rda, data/capitales.rda, data/elec88.rda, data/hdpg.rda, data/irishdata.rda, data/lascaux.rda, data/mafragh.rda, data/perthi02.rda, data/tarentaise.rda, data/vegtf.rda: resave some data files to improve file compression 2012-03-16 05:55 sdray * DESCRIPTION: Update email addresses 2012-01-20 12:45 jombart * DESCRIPTION, NAMESPACE: Added a namespace (the default one generated by R 2.14.1) to ensure compatibility with older R release. Now stating the dependency on R >= 2.10 in DESCRIPTION. 2011-11-07 15:21 sdray * R/mantel.rtest.R: Improve the performance (speed) of the permutation procedure (suggestion by Josh Wiley jwiley.psych at gmail.com) 2011-05-11 11:31 sdray * INDEX: Delete INDEX file so that it would be generated and updated automatically 2011-04-22 11:13 sdray * R/randtest.between.R, man/randtest.between.Rd: Update the function to deal with objects created by the new bca function 2011-04-11 14:23 sdray * DESCRIPTION: ---------- release of ade4 1.4-17 ---------- 2011-04-07 12:00 sdray * R/pcaiv.R: Correct a bug: intercept is not included in 'cor' to avoid a warning produced by scalewt 2011-04-07 11:32 sdray * R/mfa.R, man/mfa.Rd, man/statis.Rd: Correct the documentation (suggestion by D. Laloe) and improve the code of mfa (use of match.arg to consider the argument 'option' 2011-04-07 11:10 sdray * R/withinpca.R, man/withinpca.Rd: Improve the documentation (suggestion by L. Dubroca on adelist 01/03/2011) and the code (suggestion by D. Laloe) 2011-04-07 07:45 sdray * R/between.R, R/betweencoinertia.R, R/within.R, R/withincoinertia.R, man/between.Rd, man/betweencoinertia.Rd, man/plot.between.Rd, man/plot.within.Rd, man/within.Rd, man/withincoinertia.Rd: Functions within, withincoinertia, betwee, betweencoinertia are now deprecated to avoid a conflict names with the base:::within. New generic bca, wca with methods bca.dudi, bca.coinertia, wca.dudi and wca.coinertia should be used instead. 2011-04-06 16:06 sdray * man/scatter.Rd: Correct a typo 2011-04-06 16:06 sdray * man/scatter.Rd: Add the doc for the 'main' argument 2011-04-06 14:33 sdray * R/dudi.R, man/scatter.Rd: New generic functions 'biplot' and 'screeplot' to plot the outputs of an analysis (class dudi) 2011-02-24 14:11 sdray * data/macroloire.rda, data/rhizobium.rda, data/woangers.rda: Compress some ASCII data files 2011-02-24 14:00 sdray * R/quasieuclid.R: Attributes of the original dist object are preserved 2011-02-24 13:55 sdray * R/cailliez.R, R/lingoes.R, man/cailliez.Rd, man/lingoes.Rd: Add an argument to correct (or not) null distances 2011-02-24 13:47 sdray * R/is.euclid.R: Add a warning for null distances 2010-09-27 14:42 sdray * man/corvus.Rd: Correct a typo concerning the units of two variables (cm -> mm). Thanks to Peter Saly 2010-08-18 15:25 sdray * ChangeLog: ---------- release of ade4 1.4-16 ---------- 2010-08-18 15:10 sdray * DESCRIPTION: ---------- release of ade4 1.4-16 ---------- 2010-05-08 05:41 thioulouse * data/meaudret.rda: Updated meaudret environmental dataframe names 2010-05-06 16:16 sdray * man/triangle.class.Rd: Remove auto-generated content in the documentation 2010-04-29 14:49 sdray * R/s.class.R: argument 'pch' is now recycled so that one symbol could be assigned to each point. Thanks to Vincent Le Garrec for his question. 2010-04-12 08:10 sdray * man/dist.binary.Rd: Correct some bibliographic references. Thanks to Pierre Legendre. 2010-03-19 13:19 sdray * R/dist.ktab.R: Correct a small bug in the ldist.ktab function 2010-03-10 09:13 thioulouse * man/ktab.match2ktabs.Rd: removed deprecated email address in ktab.match2ktabs documentation file 2010-03-05 15:06 jombart * R/scalewt.R: Fixed a bug in the scaling of multivariate data using scalewt: when units of the variable were too heterogeneous, variables with the smallest variances were not scaled. This did not affect dudi.pca, but other functions such as discrimin. 2010-02-10 12:12 sdray * man/rlq.Rd: Correct a typo in the description 2010-02-10 12:00 sdray * man/rlq.Rd: Correct a typo in the description 2009-12-18 08:46 sdray * man/fourthcorner.Rd: Add information on the outputs of the print and summary functions 2009-12-09 14:49 sdray * man/banque.Rd, man/dudi.fca.Rd, man/fruits.Rd, man/meau.Rd, man/meaudret.Rd, man/monde84.Rd, man/ours.Rd, man/rhizobium.Rd, man/woangers.Rd, man/worksurv.Rd: Correct the use of the command '\item' in '\enumerate' environment 2009-12-04 13:33 sdray * R/plot.4thcorner.R, man/fourthcorner.Rd, src/fourthcorner.c: The argument 'type' in plot.4thcorner can now takes the value D2 to plot correlation instead of homogeneity statistics in the case of qualitative / quantitative association 2009-12-04 13:28 sdray * man/dist.ktab.Rd, man/woangers.Rd: Put some examples in '\dontrun' to speed up the checking of example 2009-12-03 13:27 sdray * ChangeLog: ---------- release of ade4 1.4-14 ---------- 2009-12-03 13:22 sdray * DESCRIPTION: ---------- release of ade4 1.4-14 ---------- 2009-12-01 10:01 sdray * DESCRIPTION, man/area.plot.Rd, man/neig.Rd, man/oribatid.Rd: Use the package 'deldir' instead of 'tripack' which has serious license issues. Correct the use of the class polylist which is not exported in the new version of maptools (0.7-27) 2009-11-12 12:08 thioulouse * R/costatis.R: changes to the costatis function to remove cat outputs in non-interactive mode (i.e., when scannf = FALSE) 2009-11-12 08:40 sdray * R/s.match.class.R, man/s.match.class.Rd: Add new function 's.match.class' to represent two systems of coordinates and a partitioning 2009-11-12 08:38 sdray * R/betweencoinertia.R, R/withincoinertia.R, man/betweencoinertia.Rd, man/withincoinertia.Rd: Add new functions 'betweencoinertia' and 'withincoinertia' for between- and within-coinertia analysis 2009-11-09 12:06 thioulouse * R/costatis.R, R/statico.R, man/costatis.Rd, man/statico.Rd, man/wgcoia.Rd: New functions to perform STATICO and CO-STATIS 2009-10-30 08:49 sdray * R/kdisteuclid.R: Use 'match.arg' to evaluate the value of the 'method' argument 2009-10-29 08:56 sdray * DESCRIPTION: ---------- release of ade4 1.4-13 ---------- 2009-10-28 15:29 abdufour * data/meaudret.rda: addition of the species names in the dataset 2009-10-28 15:08 abdufour * man/meau.Rd, man/meaudret.Rd: information about the link between the two datasets meau and meaudret has been added 2009-10-28 14:13 sdray * R/phylog.R, R/plot.phylog.R: Correct bug in the use of basic regular expressions (argument 'extended' is deprecated R 2.11.0) 2009-10-27 14:50 spavoine * R/originality.R, man/originality.Rd: new methods have been added in the originality function 2009-10-27 14:08 spavoine * data/woangers.rda, man/woangers.Rd, man/rhizobium.Rd, data/rhizobium.rda, data/macroloire.rda, man/macroloire.Rd: three new data sets added 2009-10-27 14:05 spavoine * R/dist.ktab.R, man/dist.ktab.Rd: new functions of distance for multiple types of variables 2009-10-27 14:01 spavoine * R/apqe.R, man/apqe.Rd: new functions for diversity partitioning 2009-10-27 13:59 spavoine * R/mdpcoa.R, man/mdpcoa.Rd: new functions for multiple dpcoa 2009-10-23 12:21 sdray * ChangeLog: ---------- release of ade4 1.4-12 ---------- 2009-10-23 12:19 sdray * DESCRIPTION: ---------- release of ade4 1.4-12 ---------- 2009-10-21 14:18 sdray * data/toxicity.rda, man/toxicity.Rd: Correct species names and table dimensions (thanks to Jean Lobry) 2009-10-21 13:34 thioulouse * R/dudi.R: bug on row.names in as.dudi (thanks to Jean Lobry) 2009-10-20 14:18 sdray * R/newick2phylog.R: Correct bug in the use of basic regular expressions 2009-10-20 14:15 sdray * man/multispati.Rd, man/multispati.randtest.Rd, man/multispati.rtest.Rd: update links to spdep functions in the documentation 2009-10-02 09:07 simonpenel * R/newick2phylog.R, man/s.value.Rd, man/variance.phylog.Rd: Minor bugs have been fixes. Replace extended = FALSE by fixed = TRUE 2009-09-22 08:10 thioulouse * man/scatter.dudi.Rd: added some precision about biplots in scatter.dudi.Rd 2009-07-24 14:53 thioulouse * R/pta.R: corrected a small bug in row names of supIX and supIY df 2009-05-11 09:19 sdray * R/dist.binary.R, man/dist.binary.Rd: Numeric matrix can be used for the 'df' argument (request of E. Paradis) 2009-04-20 15:53 sdray * R/area.plot.R: argument nclasslegend is now active. bug identified by C. Calenge 2009-04-01 11:11 sdray * ChangeLog: ---------- release of ade4 1.4-11 ---------- 2009-04-01 11:07 sdray * DESCRIPTION: ---------- release of ade4 1.4-11 ---------- 2009-03-26 14:14 sdray * man/buech.Rd, man/corvus.Rd, man/dist.binary.Rd, man/dist.prop.Rd, man/dist.quant.Rd, man/kplot.mcoa.Rd, man/kplot.pta.Rd, man/ktab.Rd, man/maples.Rd, man/mcoa.Rd, man/mfa.Rd, man/njplot.Rd, man/orthogram.Rd, man/phylog.Rd, man/randtest.coinertia.Rd, man/scatter.fca.Rd, man/scatterutil.Rd, man/supcol.Rd, man/withinpca.Rd: Make Rd files pass R-2.9.0 (devel) parser 2 checks 2009-02-03 12:39 abdufour * man/randEH.Rd: replace PD in EH 2009-02-03 12:32 abdufour * man/optimEH.Rd: replace PD in EH 2008-12-12 14:04 sdray * ChangeLog: ---------- release of ade4 1.4-10 ---------- 2008-12-12 14:03 sdray * DESCRIPTION: ---------- release of ade4 1.4-10 ---------- 2008-12-11 14:45 sdray * R/combine.4thcorner.R, R/fourthcorner.R, R/fourthcorner2.R, R/plot.4thcorner.R, R/print.4thcorner.R, R/summary.4thcorner.R, man/fourthcorner.Rd, src/fourthcorner.c: new functions implementing the fourthcorner method and extensions presented in Dray and Legendre (2008) 2008-12-11 13:23 sdray * src/adesub.c, src/adesub.h, src/testdim.c: new functions to permute matrices used in testdim and fourthcorner are now in adesub 2008-12-11 13:14 sdray * man/RVdist.randtest.Rd, man/randtest-internal.Rd, man/scatterutil.Rd: remove empty sections 2008-12-11 13:05 sdray * man/dudi.fca.Rd: add a second argument to the \item macro 2008-12-11 13:04 sdray * man/witwit.coa.Rd: remove invalid whitespaces 2008-12-01 15:34 jombart * R/gearymoran.R: small typo repared 2008-12-01 15:19 jombart * R/gearymoran.R: Added a match.arg to gearymoran (in multivariate case, was messed up. 2008-06-30 10:55 sdray * R/niche.R: Add a global test of the average marginality for all species 2008-06-13 10:33 jombart * R/dudi.acm.R, R/dudi.coa.R, R/dudi.dec.R, R/dudi.fca.R, R/dudi.hillsmith.R, R/dudi.mix.R, R/dudi.nsc.R, R/dudi.pca.R: Added a as.data.frame(df) to dudi methods. 2008-06-11 11:04 sdray * data/abouheif.eg.rda: new data files 2008-06-11 10:59 sdray * data/acacia.rda, data/aminoacyl.rda, data/apis108.rda, data/ardeche.rda, data/arrival.rda, data/atlas.rda, data/atya.rda, data/avijons.rda, data/avimedi.rda, data/aviurba.rda, data/bacteria.rda, data/banque.rda, data/baran95.rda, data/bf88.rda, data/bordeaux.rda, data/bsetal97.rda, data/buech.rda, data/butterfly.rda, data/capitales.rda, data/carni19.rda, data/carni70.rda, data/carniherbi49.rda, data/casitas.rda, data/chatcat.rda, data/chats.rda, data/chazeb.rda, data/chevaine.rda, data/clementines.rda, data/cnc2003.rda, data/coleo.rda, data/corvus.rda, data/deug.rda, data/doubs.rda, data/dunedata.rda, data/ecg.rda, data/ecomor.rda, data/elec88.rda, data/escopage.rda, data/euro123.rda, data/fission.rda, data/friday87.rda, data/fruits.rda, data/ggtortoises.rda, data/granulo.rda, data/hdpg.rda, data/housetasks.rda, data/humDNAm.rda, data/ichtyo.rda, data/irishdata.rda, data/julliot.rda, data/jv73.rda, data/kcponds.rda, data/lascaux.rda, data/lizards.rda, data/macaca.rda, data/macon.rda, data/mafragh.rda, data/maples.rda, data/mariages.rda, data/meau.rda, data/meaudret.rda, data/microsatt.rda, data/mjrochet.rda, data/mollusc.rda, data/monde84.rda, data/morphosport.rda, data/newick.eg.rda, data/njplot.rda, data/olympic.rda, data/oribatid.rda, data/ours.rda, data/palm.rda, data/pap.rda, data/perthi02.rda, data/presid2002.rda, data/procella.rda, data/rankrock.rda, data/rhone.rda, data/rpjdl.rda, data/santacatalina.rda, data/sarcelles.rda, data/seconde.rda, data/skulls.rda, data/steppe.rda, data/syndicats.rda, data/t3012.rda, data/tarentaise.rda, data/taxo.eg.rda, data/tintoodiel.rda, data/tithonia.rda, data/tortues.rda, data/toxicity.rda, data/trichometeo.rda, data/ungulates.rda, data/vegtf.rda, data/veuvage.rda, data/westafrica.rda, data/worksurv.rda, data/yanomama.rda, data/zealand.rda: new data files 2008-06-11 10:58 sdray * data/abouheif.eg.rda, data/acacia.rda, data/aminoacyl.rda, data/apis108.rda, data/ardeche.rda, data/arrival.rda, data/atlas.rda, data/atya.rda, data/avijons.rda, data/avimedi.rda, data/aviurba.rda, data/bacteria.rda, data/banque.rda, data/baran95.rda, data/bf88.rda, data/bordeaux.rda, data/bsetal97.rda, data/buech.rda, data/butterfly.rda, data/capitales.rda, data/carni19.rda, data/carni70.rda, data/carniherbi49.rda, data/casitas.rda, data/chatcat.rda, data/chats.rda, data/chazeb.rda, data/chevaine.rda, data/clementines.rda, data/cnc2003.rda, data/coleo.rda, data/corvus.rda, data/deug.rda, data/doubs.rda, data/dunedata.rda, data/ecg.rda, data/ecomor.rda, data/elec88.rda, data/escopage.rda, data/euro123.rda, data/fission.rda, data/friday87.rda, data/fruits.rda, data/ggtortoises.rda, data/granulo.rda, data/hdpg.rda, data/housetasks.rda, data/humDNAm.rda, data/ichtyo.rda, data/irishdata.rda, data/julliot.rda, data/jv73.rda, data/kcponds.rda, data/lascaux.rda, data/lizards.rda, data/macaca.rda, data/macon.rda, data/mafragh.rda, data/maples.rda, data/mariages.rda, data/meau.rda, data/meaudret.rda, data/microsatt.rda, data/mjrochet.rda, data/mollusc.rda, data/monde84.rda, data/morphosport.rda, data/newick.eg.rda, data/njplot.rda, data/olympic.rda, data/oribatid.rda, data/ours.rda, data/palm.rda, data/pap.rda, data/perthi02.rda, data/presid2002.rda, data/procella.rda, data/rankrock.rda, data/rhone.rda, data/rpjdl.rda, data/santacatalina.rda, data/sarcelles.rda, data/seconde.rda, data/skulls.rda, data/steppe.rda, data/syndicats.rda, data/t3012.rda, data/tarentaise.rda, data/taxo.eg.rda, data/tintoodiel.rda, data/tithonia.rda, data/tortues.rda, data/toxicity.rda, data/trichometeo.rda, data/ungulates.rda, data/vegtf.rda, data/veuvage.rda, data/westafrica.rda, data/worksurv.rda, data/yanomama.rda, data/zealand.rda: remove corrupted data files 2008-06-10 14:12 sdray * ChangeLog, DESCRIPTION, INDEX, R, TITLE, data, inst, man, src: move from trunk to pkg after initial import using cvs2svn 2008-06-10 14:01 sdray * man: remove man folder 2008-06-10 14:01 sdray * R: remove R folder 2008-06-10 14:12 sdray * ChangeLog, DESCRIPTION, INDEX, R, TITLE, data, inst, man, src: move from trunk to pkg after initial import using cvs2svn 2008-05-23 14:12 dray * ChangeLog, DESCRIPTION: ---------- release of ade4 1.4-9 ---------- 2008-05-23 12:12 dray * R/niche.R: Correct a syntax error 2008-05-23 12:00 dray * R/mantel.randtest.R, R/procuste.randtest.R: Correct a bug. The number of repetitions was not correct ((nrepet + 1) instead of nrepet) 2008-05-23 11:53 dray * R/niche.R, R/randtest.between.R, R/randtest.coinertia.R, R/randtest.discrimin.R: Correct a bug. The number of repetitions was not correct ((nrepet + 1) instead of nrepet) 2008-05-23 11:46 dray * R/krandtest.R, R/randtest.amova.R, man/krandtest.Rd: the class krandtest now accepts a vector of alternative hypotheses instead of a common alternative hypothesis for the k tests (email of Kim Milferstedt on RHelp) 2008-05-16 13:54 dray * ChangeLog, DESCRIPTION: ---------- release of ade4 1.4-8 ---------- 2008-05-07 11:29 jthioulo * R/dudi.acm.R: bug correction (mail of JR Lobry on adelist): (any(row.w) < 0) vs. (any(row.w < 0)) 2008-05-07 11:27 jthioulo * R/dudi.R: bug correction (mail of JR Lobry on adelist): any(col.w) < 0 vs. any(col.w < 0) 2008-04-18 14:37 penel * data/ggtortoises.rda: pixmap S3 objects transformed into S4 class 2008-04-18 13:33 dray * ChangeLog, DESCRIPTION: ---------- release of ade4 1.4-7 ---------- 2008-04-18 13:31 dray * data/capitales.rda: pixmap S3 objects transformed into S4 class 2008-04-17 11:05 dray * ChangeLog, DESCRIPTION: ---------- release of ade4 1.4-6 ---------- 2008-04-16 17:02 dray * R/phylog.R: Correct a bug in phylog.extract (mail of S. Ollier) 2008-04-16 16:36 dray * src/adesub.c, src/adesub.h, src/testrlq.c: matcentragehi in now in adesub 2008-04-16 16:33 dray * R/nipals.R, man/nipals.Rd: New function for NIPALS algorithm, i.e. PCA with (or without) NA 2008-04-16 16:31 dray * man/randtest.Rd: add some words about the computation of pvalues for two-sided test 2008-04-16 13:18 dufour * man/ade4.package.Rd: *** empty log message *** 2008-04-16 10:12 dufour * man/pcaiv.Rd: *** empty log message *** 2008-04-14 12:41 penel * man/table.phylog.Rd: Example table.phylog set to dontrun 2008-04-02 11:16 dray * man/multispati.Rd, man/vegtf.Rd: Update the source reference: Dray et al. (2008) 2008-03-27 14:28 dufour * man/dudi.pca.Rd: Modifications : explanations about values (cent and norm) ; it{} into emph{}. 2008-03-27 13:47 dufour * man/dudi.pca.Rd: Modification of explanations ($cent and $norm) 2008-03-26 10:29 dray * R/sco.distri.R: correct a bug (identified by S. Pavoine): default label argument was badly considered when one column contains only O's 2008-03-20 15:10 dray * R/scatter.R, R/scatterutil.R, man/scatter.Rd, man/scatterutil.Rd: New utility function scatterutil.sco and scatterutil.convrot90 for 1D graphical representation 2008-03-20 15:06 dray * R/sco.gauss.R, man/sco.gauss.Rd: New function sco.gauss for 1D graphical representation 2008-03-20 15:05 dray * R/sco.match.R, man/sco.match.Rd: New function sco.match for 1D graphical representation 2008-03-20 15:05 dray * R/sco.class.R, man/sco.class.Rd: New function sco.class for 1D graphical representation 2008-03-20 15:05 dray * R/sco.label.R, man/sco.label.Rd: New function sco.label for 1D graphical representation 2008-03-19 16:00 dray * R/sco.qual.R: Functions of this file are now in sco.label.R and sco.gauss.R 2008-03-18 14:18 dray * inst/CITATION: Add two new references to the CITATION file 2008-03-17 15:47 dray * R/randtest.cca.R, R/randtest.pcaiv.R, R/randtest.pcaivortho.R, man/randtest.pcaiv.Rd: News functions for permutation tests in constrained analysis 2008-02-05 13:26 dray * src/testdim.c: Correct a bug in memory allocation of the function svdd 2008-01-29 15:07 jthioulo * man/sco.label.Rd: added function: Draws evenly spaced labels, each label linked to the corresponding value of a numeric score 2008-01-29 15:07 jthioulo * man/sco.gauss.Rd: added function: Draws Gauss curves with the same mean and variance as the scores of indivivuals belonging to categories of several factors 2008-01-29 15:04 jthioulo * man/veuvage.Rd: Correstion of illegal accented character in exemple code 2008-01-29 15:04 jthioulo * R/sco.qual.R: adds two functions: sco.gauss and sco.label (draw Gauss curves on a score by categories of several factors) 2007-11-09 17:19 dray * R/newick2phylog.R: Correct a bug. In newick2phylog.addtools, eigen does not return an orthogonal basis when there are null eigenvalues (Wscores). Vectors are now orthogonalized using qr 2007-10-16 14:41 penel * DESCRIPTION: Change License to GPL (>=2) 2007-10-16 14:35 penel * ChangeLog: *** empty log message *** 2007-10-12 11:37 penel * ChangeLog, DESCRIPTION: ---------- release of ade4 1.4-5 ---------- 2007-10-11 15:50 penel * man/dunedata.Rd, man/steppe.Rd: Replace non_function by Doctype 2007-10-09 10:54 penel * src/testdim.c, src/tests.c: Correction of a bug in the declaration of variables 2007-09-25 11:16 dray * ChangeLog: ---------- release of ade4 1.4-4 ---------- 2007-09-25 11:10 dray * DESCRIPTION: ---------- release of ade4 1.4-4 ---------- 2007-09-20 15:48 dray * R/coinertia.R, R/dudi.R, R/dudi.pco.R: Modification of the call of the imported function chooseaxes for the use of the ade4TkGUI package 2007-09-17 16:23 dray * R/within.pca.R, R/withinpca.R, man/ktab.Rd, man/ktab.match2ktabs.Rd, man/pta.Rd, man/statis.Rd, man/within.pca.Rd, man/withinpca.Rd: The function within.pca is renamed withinpca 2007-09-17 15:12 dray * R/ktab.R, man/ktab.Rd: Change the names of the arguments of the function '[.ktab' 2007-09-17 13:05 dray * man/amova.Rd, man/between.Rd, man/coinertia.Rd, man/corkdist.Rd, man/discrimin.Rd, man/dpcoa.Rd, man/dudi.Rd, man/dudi.acm.Rd, man/dudi.pco.Rd, man/foucart.Rd, man/is.euclid.Rd, man/kplot.foucart.Rd, man/kplot.mcoa.Rd, man/kplot.mfa.Rd, man/kplot.pta.Rd, man/kplot.sepan.Rd, man/kplot.statis.Rd, man/krandtest.Rd, man/ktab.Rd, man/mcoa.Rd, man/mfa.Rd, man/multispati.Rd, man/neig.Rd, man/niche.Rd, man/orthobasis.Rd, man/pcaiv.Rd, man/phylog.Rd, man/plot.phylog.Rd, man/procuste.Rd, man/pta.Rd, man/randtest.Rd, man/randtest.amova.Rd, man/randtest.between.Rd, man/randtest.coinertia.Rd, man/randtest.discrimin.Rd, man/reconst.Rd, man/rlq.Rd, man/rtest.Rd, man/rtest.between.Rd, man/rtest.discrimin.Rd, man/scatter.acm.Rd, man/scatter.coa.Rd, man/scatter.dudi.Rd, man/scatter.fca.Rd, man/score.acm.Rd, man/score.coa.Rd, man/score.mix.Rd, man/score.pca.Rd, man/sepan.Rd, man/statis.Rd, man/supcol.Rd, man/suprow.Rd, man/testdim.Rd, man/within.Rd, man/witwit.coa.Rd: Correct usage entries for S3 methods 2007-09-14 11:58 jthioulo * DESCRIPTION: suggests ade4TkGUI 2007-09-14 09:15 jthioulo * R/randtest.between.R: modif eval pour ne pas chercher dans l'environnement global directement 2007-09-13 11:57 dray * src/Makevars: replace CRLF (DOS) by LF (Unix) 2007-09-13 11:18 jthioulo * R/coinertia.R, R/dudi.R, R/dudi.pco.R: modif pour variable globale ade4TkGUIFlag 2007-09-06 17:08 dray * man/PI2newick.Rd, man/RV.rtest.Rd, man/RVdist.randtest.Rd, man/aminoacyl.Rd, man/ardeche.Rd, man/area.plot.Rd, man/as.taxo.Rd, man/atlas.Rd, man/atya.Rd, man/avijons.Rd, man/aviurba.Rd, man/baran95.Rd, man/between.Rd, man/bicenter.wt.Rd, man/buech.Rd, man/cailliez.Rd, man/carni70.Rd, man/casitas.Rd, man/cca.Rd, man/chatcat.Rd, man/chats.Rd, man/clementines.Rd, man/coinertia.Rd, man/corkdist.Rd, man/discrimin.Rd, man/discrimin.coa.Rd, man/dist.binary.Rd, man/dist.dudi.Rd, man/dist.genet.Rd, man/dist.neig.Rd, man/dist.prop.Rd, man/dist.quant.Rd, man/divcmax.Rd, man/dotchart.phylog.Rd, man/dotcircle.Rd, man/doubs.Rd, man/dpcoa.Rd, man/dudi.Rd, man/dudi.acm.Rd, man/dudi.coa.Rd, man/dudi.dec.Rd, man/dudi.fca.Rd, man/dudi.mix.Rd, man/dudi.nsc.Rd, man/dudi.pca.Rd, man/dudi.pco.Rd, man/escopage.Rd, man/euro123.Rd, man/fruits.Rd, man/fuzzygenet.Rd, man/gearymoran.Rd, man/genet.Rd, man/granulo.Rd, man/gridrowcol.Rd, man/ichtyo.Rd, man/inertia.dudi.Rd, man/is.euclid.Rd, man/julliot.Rd, man/jv73.Rd, man/kdist.Rd, man/kdist2ktab.Rd, man/kdisteuclid.Rd, man/kplot.foucart.Rd, man/kplot.mcoa.Rd, man/kplot.mfa.Rd, man/kplot.pta.Rd, man/kplot.sepan.Rd, man/kplot.statis.Rd, man/ktab.Rd, man/ktab.data.frame.Rd, man/ktab.list.df.Rd, man/ktab.list.dudi.Rd, man/ktab.match2ktabs.Rd, man/ktab.within.Rd, man/lascaux.Rd, man/lingoes.Rd, man/macon.Rd, man/mafragh.Rd, man/mantel.rtest.Rd, man/mariages.Rd, man/mcoa.Rd, man/meau.Rd, man/meaudret.Rd, man/mfa.Rd, man/microsatt.Rd, man/mjrochet.Rd, man/mld.Rd, man/mollusc.Rd, man/monde84.Rd, man/morphosport.Rd, man/mstree.Rd, man/multispati.Rd, man/multispati.randtest.Rd, man/multispati.rtest.Rd, man/neig.Rd, man/newick.eg.Rd, man/newick2phylog.Rd, man/niche.Rd, man/njplot.Rd, man/orthobasis.Rd, man/orthogram.Rd, man/ours.Rd, man/palm.Rd, man/pcaiv.Rd, man/pcaivortho.Rd, man/pcoscaled.Rd, man/phylog.Rd, man/plot.phylog.Rd, man/procuste.Rd, man/procuste.rtest.Rd, man/pta.Rd, man/quasieuclid.Rd, man/reconst.Rd, man/rhone.Rd, man/rpjdl.Rd, man/rtest.Rd, man/rtest.between.Rd, man/rtest.discrimin.Rd, man/s.arrow.Rd, man/s.chull.Rd, man/s.class.Rd, man/s.corcircle.Rd, man/s.distri.Rd, man/s.hist.Rd, man/s.image.Rd, man/s.kde2d.Rd, man/s.label.Rd, man/s.logo.Rd, man/s.match.Rd, man/s.multinom.Rd, man/s.traject.Rd, man/s.value.Rd, man/sarcelles.Rd, man/scalewt.Rd, man/scatter.Rd, man/scatter.acm.Rd, man/scatter.coa.Rd, man/scatter.dudi.Rd, man/scatter.fca.Rd, man/sco.boxplot.Rd, man/sco.distri.Rd, man/sco.quant.Rd, man/score.Rd, man/score.acm.Rd, man/score.coa.Rd, man/score.mix.Rd, man/score.pca.Rd, man/sepan.Rd, man/statis.Rd, man/steppe.Rd, man/supcol.Rd, man/suprow.Rd, man/symbols.phylog.Rd, man/t3012.Rd, man/table.cont.Rd, man/table.dist.Rd, man/table.paint.Rd, man/table.phylog.Rd, man/table.value.Rd, man/tarentaise.Rd, man/triangle.class.Rd, man/triangle.plot.Rd, man/trichometeo.Rd, man/ungulates.Rd, man/uniquewt.df.Rd, man/variance.phylog.Rd, man/veuvage.Rd, man/westafrica.Rd, man/within.Rd, man/within.pca.Rd, man/witwit.coa.Rd, man/worksurv.Rd: Added the encoding of Rd files and remove the email of Daniel Chessel (he is retired) 2007-09-06 15:11 dray * R/scatter.acm.R: Clean R files: replace T by TRUE. 2007-09-06 15:03 dray * R/newick2phylog.R: Clean R files: remove multiple function definitions (floc1(s) becomes floc1,floc2,floc3. Thanks to UsagePackageCheck of codetools 2007-09-06 14:55 dray * R/multispati.R, R/multispati.randtest.R, R/multispati.rtest.R, R/neig.R, R/orthobasis.R, R/s.image.R, R/s.kde2d.R, R/s.logo.R: Clean R files: correct imported function definition. Thanks to UsagePackageCheck of codetools 2007-09-06 13:53 dray * R/orthogram.R: Correct a bug: test for the choice between orthobas, neig or phylog 2007-09-06 12:21 dray * R/scatter.acm.R: Correct a bug: replace score. by score.acm 2007-09-06 12:19 dray * R/kplot.foucart.R, R/kplot.mfa.R, R/mcoa.R, R/rlq.R, R/score.coa.R, R/sepan.R, R/variance.phylog.R: Clean R files: remove local variables assigned but not used. Thanks to checkUsagePackage of codetools 2007-09-06 11:58 dray * R/PI2newick.R, R/RV.rtest.R, R/RVdist.randtest.R, R/amova.R, R/area.plot.R, R/as.taxo.R, R/between.R, R/coinertia.R, R/corkdist.R, R/disc.R, R/discrimin.R, R/discrimin.coa.R, R/dist.dudi.R, R/dist.genet.R, R/dotcircle.R, R/dudi.coa.R, R/dudi.dec.R, R/dudi.nsc.R, R/foucart.R, R/fuzzygenet.R, R/genet.R, R/gridrowcol.R, R/kplot.foucart.R, R/kplot.mfa.R, R/kplot.statis.R, R/ktab.R, R/ktab.list.dudi.R, R/ktab.match2ktabs.R, R/ktab.within.R, R/lingoes.R, R/mcoa.R, R/mld.R, R/multispati.R, R/newick2phylog.R, R/niche.R, R/optimEH.R, R/orthobasis.R, R/orthogram.R, R/pcaiv.R, R/phylog.R, R/plot.phylog.R, R/procuste.R, R/rlq.R, R/rtest.between.R, R/s.corcircle.R, R/s.hist.R, R/s.image.R, R/scatter.R, R/sco.distri.R, R/score.acm.R, R/score.coa.R, R/score.mix.R, R/sepan.R, R/statis.R, R/symbols.phylog.R, R/table.cont.R, R/table.phylog.R, R/uniquewt.df.R, R/variance.phylog.R, R/within.R, R/within.pca.R: Clean R files: remove local variables assigned but not used. Thanks to checkUsagePackage of codetools 2007-09-06 08:08 dray * man/bordeaux.Rd, man/cca.Rd, man/dudi.hillsmith.Rd, man/elec88.Rd, man/seconde.Rd: Clean Rd files: remove unmatched right brace 2007-09-04 16:12 dray * R/testdim.R, man/testdim.Rd, src/Makevars, src/testdim.c: New function testdim to estimate the number of axes in multivariate analysis 2007-09-04 15:07 dray * R/gearymoran.R, R/krandtest.R, R/niche.R, R/orthogram.R, R/randtest.amova.R, man/gearymoran.Rd, man/krandtest.Rd, man/niche.Rd, man/orthogram.Rd: reimplementation of the class krandtest and new function as.krandtest 2007-09-04 14:50 dray * man/vegtf.Rd: correction of a bug in the example section 2007-09-03 16:53 dray * R/score.coa.R, man/score.coa.Rd: new function reciprocal.coa (see http://listes.univ-lyon1.fr/wws/arc/adelist/2007-07/msg00007.html) 2007-09-03 16:26 dray * R/sco.distri.R, man/sco.distri.Rd: sco.distri returns a data.frame with means and variances (see http://listes.univ-lyon1.fr/wws/arc/adelist/2007-06/msg00018.html) 2007-09-03 15:24 dray * R/scatter.R, R/sepan.R, R/witwitsepan.R: Add yaxt argument to scatterutil.eigen (see http://listes.univ-lyon1.fr/wws/arc/adelist/2007-07/msg00022.html) 2007-09-03 15:04 dray * R/multispati.R: Correct legend in plot.multispati 2007-09-03 14:58 dray * data/vegtf.rda, man/vegtf.Rd: New vegetation data set to illustrate multispati analysis 2007-09-03 14:51 dray * R/niche.R, man/niche.Rd: New functions niche.param and rtest.niche 2007-08-29 16:20 dray * R/area.plot.R: the function area2poly is modified to export the bbox attribute for each polygon 2007-08-29 16:00 dray * R/s.corcircle.R: correct bug of the grid argument. see http://listes.univ-lyon1.fr/wws/arc/adelist/2007-07/msg00001.html 2007-08-29 15:47 dray * R/randtest-internal.R, R/rlq.R: correct bugs in memory allocation (C interface). These bugs have been identified using valgrind by B. Ripley (12/06/2007) 2007-06-15 07:49 dray * man/dunedata.Rd: correct the number of rows and columns in the help file 2007-04-16 12:56 dray * ChangeLog, DESCRIPTION: ---------- release of ade4 1.4-3 ---------- 2007-04-12 13:39 dray * man/suprow.Rd: correct the example section 2007-04-12 13:08 dray * ChangeLog: New ChangeLog 2007-04-12 12:58 dray * data/atlas.rda, data/avijons.rda, data/aviurba.rda, data/baran95.rda, data/bf88.rda, data/chevaine.rda, data/cnc2003.rda, data/elec88.rda, data/monde84.rda, data/rankrock.rda, data/rpjdl.rda, data/sarcelles.rda, data/steppe.rda, data/t3012.rda, data/tarentaise.rda, data/veuvage.rda, data/westafrica.rda: remove non ASCII characters in data 2007-03-26 16:47 jombart * ChangeLog, R/dudi.pco.R: reviewed by: * R/dudi.pco.R: sub and csub arguments are now actually passed to s.label 2007-03-12 14:34 jombart * ChangeLog, R/add.scatter.R, man/add.scatter.Rd, man/scatter.Rd: * R/scatter.R: removed add.scatter.eig * man/scatter.Rd: removed add.scatter.eig * R/add.scatter.R: new functions add.scatter and add.scatter.eig * man/add.scatter.Rd: doc for add.scatter and add.scatter.eig 2007-03-12 14:27 jombart * R/scatter.add.R, man/scatter.add.Rd: *** empty log message *** 2007-03-12 14:06 jombart * ChangeLog, R/add.graph.R: reviewed by: * R/add.graph.R: * R/dpcoa.R: * R/dudi.pco.R: * R/kplot.sepan.R: * R/mfa.R: * R/pta.R: * R/scatter.R: * R/scatter.add.R: * R/scatter.coa.R: * R/scatter.dudi.R: * R/statis.R: * man/scatter.Rd: * man/scatter.add.Rd: 2007-03-12 14:04 jombart * ChangeLog, R/dpcoa.R, R/dudi.pco.R, R/kplot.sepan.R, R/mfa.R, R/pta.R, R/scatter.R, R/scatter.add.R, R/scatter.coa.R, R/scatter.dudi.R, R/statis.R, man/add.graph.Rd, man/scatter.Rd, man/scatter.add.Rd: reviewed by: * R/dpcoa.R: * R/dudi.pco.R: * R/kplot.sepan.R: * R/mfa.R: * R/pta.R: * R/scatter.R: * R/scatter.add.R: * R/scatter.coa.R: * R/scatter.dudi.R: * R/statis.R: * man/add.graph.Rd: * man/scatter.Rd: * man/scatter.add.Rd: 2007-03-10 10:38 jombart * ChangeLog, R/add.graph.R, R/dpcoa.R, R/dudi.pco.R, R/kplot.sepan.R, R/mfa.R, R/pta.R, R/scatter.R, R/scatter.coa.R, R/scatter.dudi.R, R/statis.R, man/add.graph.Rd, man/dudi.pca.Rd, man/scatter.Rd, man/scatter.dudi.Rd: reviewed by: * R/add.graph.R: ajout de la fonction (contient add.graph et la nouvelle version de add.scatter.eig) * man/add.graph.Rd: ajout de la doc (add.graph et add.scatter.eig) * R/dpcoa.R: appel de add.scatter.eig: nf supprime * R/dudi.pco.R: appel de add.scatter.eig: nf supprime * R/kplot.sepan.R: appel de add.scatter.eig: nf supprime * R/mfa.R: appel de add.scatter.eig: nf supprime * R/pta.R: appel de add.scatter.eig: nf supprime * R/scatter.R: add.scatter.eig supprime (migre vers add.graph.R) * R/scatter.coa.R: appel de add.scatter.eig: nf supprime * R/scatter.dudi.R: appel de add.scatter.eig: nf supprime * R/statis.R: appel de add.scatter.eig: nf supprime * man/dudi.pca.Rd: modifications faites par Anne * man/scatter.Rd: enleve add.scatter.eig de la doc (migre vers add.graph.Rd) * man/scatter.dudi.Rd: appel de add.scatter.eig: nf supprime 2007-03-07 18:46 jombart * ChangeLog, data/rpjdl.rda: reviewed by: * data/rpjdl.rda: removed accents 2007-02-19 09:53 jthioulo * ChangeLog, R/s.arrow.R, man/s.arrow.Rd: * R/s.arrow.R: added the "boxes" argument * man/s.arrow.Rd: added the "boxes" argument 2007-02-16 09:13 dray * ChangeLog, man/orthogram.Rd: * man/orthogram.Rd: update the reference to Ollier et al. ade4/data/0000755000176200001440000000000013621210574012001 5ustar liggesusersade4/data/mariages.rda0000644000176200001440000000052112576021756014271 0ustar liggesusers mJAn6FB  A iDHf5\7M(2>`-g8 |s9f&WQ8 'E<~k'\Ϣ3z}Tyٿ%գg7+58 8{'x`[;C[ 8b-w7<_({{u6cU|CsC3m.w^qc(K8ֳtnIQ>+f'K?;M,JKEj{Yœ^zBM-_%_Y%_Y%_U%~_6Bu!ade4/data/datalist0000644000176200001440000000156413621210574013537 0ustar liggesusersabouheif.eg acacia aminoacyl apis108 aravo ardeche arrival atlas atya avijons avimedi aviurba bacteria banque baran95 bf88 bordeaux bsetal97 buech butterfly capitales carni19 carni70 carniherbi49 casitas chatcat chats chazeb chevaine chickenk clementines cnc2003 coleo corvus deug doubs dunedata ecg ecomor elec88 escopage euro123 fission friday87 fruits ggtortoises granulo hdpg housetasks humDNAm ichtyo irishdata julliot jv73 kcponds lascaux lizards macaca macon macroloire mafragh maples mariages meau meaudret microsatt mjrochet mollusc monde84 morphosport newick.eg njplot olympic oribatid ours palm pap pcw perthi02 piosphere presid2002 procella rankrock rhizobium rhone rpjdl santacatalina sarcelles seconde skulls steppe syndicats t3012 tarentaise taxo.eg tintoodiel tithonia tortues toxicity trichometeo ungulates vegtf veuvage westafrica woangers worksurv yanomama zealand ade4/data/rankrock.rda0000644000176200001440000000147412576021756014323 0ustar liggesusersuV]Pj4j[XjvJ, 7I,Z fwK|LD̙sܯ6]3̙?|x\$wܗCm z3\}Õc35@.v"8ဟy96@~>&{=#t1Gs~O0bs=/x4'nb7jF?3SoЋ>N/9p o$\Cs!7u|ԃ~ >>//xC ]66r^5L埨+fX?DU8Rѣbn=A}dM`:O̩C烹9 zGB8[3$?5E~`BؓY?ZSY罩-nΟwzyA?=t|.?wbsg`qnt?ytNmƅyvz1Zvi1ZѺѺzN̅V\B̥b^y-Yaf 6+lVجYa– [.l– [.l– [.lV[!lV[!l¶B( #V=MSoJwv}?M\oVվ(0ۇS"jv[wժvSk*w+صٗgaӔ{l-g?T7{`)| ade4/data/euro123.rda0000644000176200001440000000220412576021756013701 0ustar liggesusers U}TU]mY,¤,b #T4jCeNfRݹZ!!e!.TDi|Mf㴳DEؗusߝvh;{9wV/kYokkGoOw5KхnĹKyçvH /io]ޓ\GGKco7|>3ǎCfuu >tro tyf{2Jȱ?u#'2(j9V}0|G?<8}캹yH?QpGݘF7ϴ^ܲ^띵yNϫ[r]\" IS W2",F=*4M+чFշ1=HY~oM[ۆ$ ،:h3ӰB/f7݉.i&vqs:4T2j;vÔ̎Qlz)lʳi346d86nr$@P[]MHqa^q4"\>dO;.[e7OXNHN8y~R$+Ash+/Zfmt1gZ`x}Cӵ~or]_kklBWaLܚG=EzAp^jl;{xတZvS+:;agW[}\q]Knӟ߇_ ;UY7O9"Ҥ$}.~8d#0P1t'_<jellyTA w)ѩ!Nʝoj9ʛ?#z356im_Z :3 O)($#ח*m`fWǃ&GX ixqɴeA<qb)5&4dM9F#\&*v*>33U^q,%gui7ftKUqhƇ%t q+5UK@ 8%˰ `IDc xRsOSS)@j ˀS )@j%јHMM 5^HMRS XeHMR+@j}L,^! tXm3x m=qI ade4/data/arrival.rda0000644000176200001440000000142612576021756014146 0ustar liggesusers WM0 F=N8!;i&^vN{+!_0NFԍ$lw>~wWWMӴM<644>;N_˶>=[A$Oɸ9\nYL enSP&mpգm˶=[ :pNutm˥Bg""`Xh":V y<yŲ-2mh(X@g@ zԆ2]vFqT3G X?b1P[prA 8 Qp1X=6 ",Y81bFVX1rъHT-u`V9 kHﬤMzcE0:s[PqgTDt2\a;"Tw,F<p[@6# \t}mъ Vj¹0.FԞ;FTM Ya0 *DŽ5VH)-[~6N%`6p)ڹ\[Y9nY֐54*gLc27 _x!IJѲ iLGaʡw>ۏ<9F~ pf7;mzK 4aK} @SsG{  d%e( m̔M@_O=zVa(Srﶎ2S͂(C+f'yr\(F3S>L/d04#^ _{Y>ycgmPstg9|}0km͹#vg9y,̘:5kg 軑{9ۻ?]ڛ~6H}YG_9^la O7}vڗz 瀳^`;_7Si+{17w`|fεAʉVu6(9߼'{c} _=7 DOfu+ϾwQS~~< [uAE#y 3i#ӋsePT:ݠmdG7:gjv}xSngx뙏 g6h;aLߢ}s93m/)?71F?r9}vEB{?}Iq&l9,~ :AΟeoYI\Y*:wBN);sgt?O-SB=IS=M3%neV&neV&neV&neV&neV&nV!nV!nV!nV!n3Y>k\5cBiLP9f(цvmhGцvmhGp!C;dh 퐡2Cv!C;dh 퐡2Cv!C;dh 퐡2Cv!C;dhB* `.SV?v8anU[yiӧAlG+Gg8*q~9{]CoN7^$_}t\g_~]䌫az:-^w<ۇA=ntWPg~mЁ۾cor;{j~?9zJ,{ofl*f_׎YTfY87=@K?LK*cǨ堕gd%qd::WgM-(&Lͯ"lͯz  U7Esu  Str/Z- mz-L35OXT߼I!kq=fKs}s7 rQ[jM.ɩ Ō-=+{=p& 偤7Hi}/ƺ:qmuVH[x MrG.bn$B^Zrx *@*B*uI3hX!j&E$O hҫ1tkewaDy"=Z-g5}v^jXr邈k<Ҟe\1}8J997us5oi^B7 㠮sYҌeq2CQv'|}ސ۶6m 0"CGNXeR8,z,z/r͖δޫIu;Ip~ڀ+Ͻ  *7ZG9հ`;z¸Ch#(߆o'W|S ゚wOrs݃vT߽&`.@[o_#*QXKO$G0f5?AЛп t6`.`v?=K;0P,_ޭ:Ag\LİG 7{G(l*lFNi;vz/\{ի,62k|qǬ+rw7jz)lw ,"@,=|Vb(J}r_zŁ OKA-V2k4}//{.xHUX#/G5 ߇"lʣ 6=;0p~gcgR~J5ʝjic`G^|eQL:cˋ 2n6}ޔ/R܋a[[85=I1\Liގhl@$ǞJH yy@NtIbKrSd T4Y.oj^M^X^o0Np%/B 6TJY("KO-d(^aH5Pi .\&RxJcAz5Numy~|Z8-% )^  yMmX_YM])YdOz;hsz~( >ϳ[,bN3#{|8TQf nHc25@- VJ|&&d*BhٚȎq ڲ)bCpY#h7C"liDe+SrТ]EV5>~rT>(x ̋s1Nvyx<|ZJ㙼Gade4/data/zealand.rda0000644000176200001440000000226712576021756014130 0ustar liggesusersV_h[Uɖ?M\2,(iӮ:*eғ͍tDXT mHp`|˔ V۬=TDE9;wW |9܌ Rc)0L#ʿW̄3p1Pׂ;aDш>3P<t t;Z:ZR=rN98W"w։E< E\/p>鶡 /[:gg0y&9>zMӽ J\O|<>8tvj1c]1 'MAg?t eYO^0? 5taNa]2NT7@Cp7}C]\JB},sȾ>z.D'45QQK!O=鞗s&,>\u8Q&VY@0(>5a<)9 ~fW9uTixƁ,ǖ<jVgǦ5)敨WGc;52^SFSuvPq⣬ϥ %>jWg]rh]e)4;AABIv0{ʸ?d37C^#cw^m%͋${;m䅥o}5HaoG9+'?k~M5%sみ}nFvasl;9~3ä \oRbO)7Yy}+d?Ҳ*6JD LK-vhT%J9$]kl曅ߧ4;.a (4KLFG?k4jUIZd5B[ޡ@NNV`yz؉x8@3@]ЎCCjN֦rA+{h}2$ ?otn~h2_MŬIDac_飝`mg9WpU)8w\?]_r7٬UWIg^h5GAɗgw(=gk c򶮽67_Gk_w#.ĽYV!~JߢE,{N&;wù^t,g%YA~a>+5V:ϕ dȊ!V3B3"3b33flЦZZYHV,+U!K@@@@@@@@@@PPPPPPPPPPHHHHHHHHHHXXXXXXXXXXDDDDDDDDDDe1 ^or79:yGdĝ;oᗊW$7^:@3wWD"u;c}/p-/m~{U\{Enxn㦬{B1?dkN6owu|E ]Πy[oBC.=9V>ܸZNחuJΜiѫ=o=Qw%%OJ=ñ:=&ݙZ[NZq O^*^V2ѯ%_ЮC"cJ0vSuCM!rO/6+˲ٝ7;;;~|۾Rz{j^)58.aR{'x>O ?_^c|Χ24NߢU{*q{}>?πxloeY=~:r+輰sppp bm|Sw~]:#.y !BX+"<9G I AB}#4i`M믆ZՃ}N]q?PW|yIq;u= FyEB6=gԓs/`i꾦^0;BԬocj[>?P< hͮ 5:"vs^֋[A4f+p ({o_ h}\_-\\/j}!WW 7|]+쎇oEtl|:| ۇl|>?,؊xi1Os2[vl=̊"z=7z~|;r^qfUTU6OC^7{sE?2M|!O-K7Tͣﳫ5Tq}X/ qrj9}ᛓ:vo=`>ԇWԻ|2T^c>h:JXUG}ˊFh Al 2vDDHIKHJI$ €0 €0 0000000000ˆ #F$H0"aDˆ #F,X0baˆ #F,D0a$H#F"D0RaH #F*T0RaȄ #F&L02adȄ #F.\0raȅ #Fna Èa0a2@Hi 4@!͐fH3 i4C!͐F.]t %K@.]t %K@.]t %K@.]t %K@.]t %K@.]t %K@.]t %K@.]t %K@.]t %K@.]t %K@.]t %K@.]t %K@.]tK ]bC%.1tK ]bC%.1tK ]btGݭtKI1̖?ľ^?Ey,uwQ>{^o=Uz.=umM~?e㾫*6g*yHrui}RNK|QyzjQ循xye>\l<ܭף6_/}.lY?~>#ӥ:UORߩ5l8`幫z_kr^ϟ9eßbtl.ade4/data/clementines.rda0000644000176200001440000000217212576021756015013 0ustar liggesusers e[hegf(mJTC P$&m`I&ڤu4{Kvgvgf{̦J"AT|ȓ [AD >AADi)}3N=络lңQM Hi15mld(wkN Nߣ(|>61ޕq}-|Y/udΏuE^2>fiM얟ٿd_Y~sj˸oxxܿe<MGgyױ/%2/x͝Kr,TNtωtee5Y >r_;ƈÚk.i9 e%~2"ϻyC㞜|;EkGy{BSnƜʌWMm&UxUuM< x Y̒q)w$|~!ߜ!$3갓c q)Uy_ tFvߔ>L? S5aΧ2&~f۔:o9U^oCC%? ~HYnS~:zT}# d$ؕ7آΚIoe{á.=="~G63҃"qw&<>" ;\Y*УTOx2v2ϫW_s/s&}N]uw,P|7 ?++}yq>Yg_ W_ σG ԅɽsInٿ gUo+iǥɆ]I ?~M|9sA>8 'Ὴ}:aEb}U(O'{V78r IÚte"lH;i6bu:Vӱճz.Vgb|j-=u8zxu6=k T>ߘ/E0v]!n]f]!^]V#"ƈx1"Z#"8Q>b ade4/data/irishdata.rda0000644000176200001440000005061212576021756014457 0ustar liggesusers}|\ŵ,wCƄbL(roXܛV* v !@By] SC!ĄCK:7{wVɿztۜ3ߜ3s ;('''7wmWN-e{ZNNִ-_nwO_߀_w7 o`ߠ ]}-o7opC~g۳^Y~d IEWD떢pw<3Z:|s3oTZJSiy*-O婴%x.Z^K9(W5W|I~cN8ٯ|ye|Xݘ}]}Eγ?zr|2{}5%IC^!Ňg9Ļ8?l쯳'ְ8_(7|<)#83 ;i|Sj-.FP2g1|7j?; ip_=v)I-"=W؎M>*ȋ:7߿})seȇRN9QsոzSy?3545h45es|5xRo/l7|_l>|q~~/_s&{xOO8&~/F3:R썓}ⱺUJo6N?O{Q;Eݴ5^Ԃ{QE ^~sk4\h=;רٹF5Jvѱsk4\`:ר׹F5un!##dd Ȱ Ȱ Ȱ Ȱ Ȱ Ȱ Ȱ Ȱ Ȱ Ȱ p p p p p p p p p p62FFa##ld62|##72|##72|#c1ed22FQF(#c1Xy#GygHO[tOW JS:O<ԺS:O<ԺS:O<ԺS:OffVIq]Muv̚x<iZW˜9eѦmܒ9ѥ귑>p^˩3p~ɜڇ/ص6Uj5Oyʶ^٭9Zy3϶{ŏ{S*%-[EüY?Z*O8/[E] t\_O?5zFBi^'idckyx$-5=UYEzBg)/q#BEQފq([QڭIڣ rgyeJ;NnMoιxiZsߞmCbWӅ"Jtex7Kzڅ6/㒮ːyx#)!VC(W-> rq|$Y/ڊPOPx~5ьOr>#ukS9}'"xjxYf%KfOkq9ңq?2($=w:Y's<2KpjSj} !O#s:H'#?2I3|.=?;.D:Gd>\/'u[$m,i9[%mz˧w7 tV[6I9Pe^4g*vp/.L F8f%d0ɴ|>R7~yxViLγ^d IWd7R[ܭPR [~ h#Wo\7Bs|7<7q_O=J<#ެuD| /MbkϊRI:e'/"5w/T9w̟)!:T1~%|bL/3p\ 0̟/SI~2_6@^s}>G9ϛ/8vu~=d>cCͩYsc;:H|^j}־ *zk':<Pfgz8KzACΙg"u[9T]9rW9P }g.+Pne&Th4NwY씆X<#}"51P.J|Қiqգ?cpHKGG=9K3=7<8FRG3D_(_؍r8(M-7-p{xJ>9lo3Ҡ__8 2Eex/^EyCQ>=i_@}2%_-l2v "<:_SHvg?{1e9L9T=mai~qƣ#zۛ/ͳ騜Y=&x%3`99N)TSKsRS?/} =γ|/E?}+ͧ'4V|1dz}-7aۘ7ϭΣ_ x{uZ~Klwn/n= cx擞KO C{NW>p#'>ݻ\pᆬ[Uy&cw-`]w擖77}㇎_Nny埆{E_ͯrQ{aɡ}G:yܢۇ?[^ߟ~5wZszt׷Xs AOclݻ7|O #?2לYqCq/w;qGwwP G\||9u ͓gtY. gO^Nd=ܞ7ʢχ/{eW_Q헻_.g5־zĩN??hGw4?j3+Pow[9}gwZ!);{9w']->9;oySHﰅ֮~]Eeߠwh|C/_I~oaoDU_~߳^\oX׏]O\,o3/MW/ScL59@a9k=tF3gOdCrɼsHWA;+~A~vGw4n#vneAh{~>՟עe#?.IKi!_/Td;֎w*~vW2(֝ɶYw_Uwo헲Ķ ln6k.헲jOi[TKStJS#mO]L;vo!mmfmm-헲|vlm4 gy¿jvlS˦9ۤؖװN_5 Ћqu˅F/PB/pnj7Ň˒ئ^ Wx,F5okZ;ᛒZ.u<=O0{`@-^mt)_teK#VKx+}N+yZ[Ӽrg7qѭ>mM1令 )ip5iۥg!EoI/v`)o)[)2Vڏg= ~d7^/;KliH"GΗ_#+I*+H+HF[Fc 9_v7R`)'\T%J7>f)fBkqru"okXr{j>->Û~?A?Ϗ}co.,of,{({BΗ.+yx+GʞY9JyVIKϢWENϸAxg"eIeRO7#J"}ʞ93M^qWepgr_%&oUU7'{C`<)\ԯvԿɯX]YSnHkt_ʣx=xB|! PιCڽ-̗)I9O>NO[5t7n.c|NGb JzH{*Z'[|O[/G}!#wK,>fAUca\UOK>u9#KԟO=[[+^%.9]WEq8q4P[x?)7z._>V)_RE^eȉ^?1?@N1v$WJ}ƭ"uqUq_c?.50^ZlW v~<JOC*-x^b'0cs^);Bگ7_Qe4w?&-r'aɘ^!OnNVڵ[<4 =6_s?35oh3A؇؟LbCcl;rqX,ڈyA΋gj]'5+^7O0ZZ X;'{6U<5ufۘ=H GcOҾ)0z󟴍gRm$spmH|fطkkĻ8f_9۞Oϔ3eWRI-"?'YFdx%;8M8>}^־ɵ,iZpi|R6I-Ʌ^Gr.鉼6_3o3p_H7X/';O'>Ar^\IscJ'9!{xv)Wʝ##ߒ=f=<zP%Am,G;&79m59X׳R|ixZm>^[9{xph}IWsbO܌~v͹rhWJkusKKr/@)y{>幹O/~8G3qK''C~(퓸hKq y? xW.Als/~_-o(mD=N{H^&'rr_^W_~r+ i$ʑ܂~q;F1~N C7y!䣂/=&Ǹ~Np4G/>%} 4%iːky{<{r3f?8LHߤ?&_A{<|Z9;NS>ɛ7!k?G9~v Y$39MF;L'OsEȝrFGK?L~CWr8+A ^? 7!2~<i!g$qR~f8L~BoN2&s2[%bh;#IW_gow37'n_n|_Ήp8xv僢?$~'x8c2/&C><{I%ċ-ۂo7[QWh;c0?10 caS߁#'x&l7_Gߢ1}z_`;!Gԗ?Qzh_3)2`XOXN`XO 1sGȼnE#~Z}/ROl+(w/JyO#_,ߨQ{VWeJ}Gh7Cԏ/Q>Eq8Cy˔zkv`P>; 2ǣ}Oy)г0PB'rUcՠ4ݔC~J_Q yY9N.O~rϽDA?Z-<4բ5b~G9/b*=z-Bya%za9/sy:yzR%pW؀WG_vk|9 9> C4c^ }</vߗ<z%h y <;:|ϴ׌=i^dabbc{+@;|t<8D8q O8 >AkoSR^{4c1\BS#E2y qH$nor\ԿS?N<{qD"nLjkĹ ȫ)ZΓ79:̏SqK&.qߟ |X,әg!0g|;"Wv#'ϦS~eLwQ b3?>=< %SP^Cd>&_ȡ\J=z-=( ;.y/$k<ι )y$J;F!^?W-=q@ nG899z>= 3vyWe.矰S >Qq1^ ?N'$67xH܉r=~A6}ў?Cz7ہ<)kgH$KڛR~ Bٻ) =m"ʿzBN 9?{BNʟ_aIJsT\4W*UiJsU\ViaViaViaViaViaUZJWi*-_嫴|U(6JRiT(6JRiT(XR, )KB%!ŒbIH$XR, )KB%!ŒbIH$XR, )KB%!ŒbIH$XR, )KB%!ŒbIH$XR, )KB%!ŒbIH$XR, )KB%!ŒbIH$XR, )KB%!ŒbIH$XR, )KB%!ŒbIH$XR, )KB%!ŒbIH$XR, )KB%!ŒbIH$XR, )KB%!ŒbIH$XR, )KB%!ŒbIH$XR, )KB%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb)X%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bXb+؊%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX(8%bX*%bX*%bX*%bX*%bX*%bX*%bX*%bX*%bX*%bX*%bX*%bX*%bX*%bX*%bX*%bX*%bX*%bX*%bX*%bX*%bX*%bX*%bX*%bX*%bX*%aŒbIX$XV, +KŠ%aŒbIX$XV, +KŠ%aŒbIX$XV, +KŠ%aŒbIX$XV, +KŠ%aŒbIX$XV, +KŠ%aŒbIX$XV, +K-Xۼ=ox]\g_QQLn⏰p_"'ǫ/b#WIZu~Gͯ*0?'6*'f~Q﹟K~"ILiKw `vބ_ȽXs<?m~*>\{lמ#ێ#;PWxcڽ-+oas?iވW<ǛqM3w{Ӛ9s ~?vďnYʳ{9Mܳ ^Mˆts*St擖wv9$z~wH:{=7ªͯrY/+G'O/>y3ky9=5tY^O'O:PsKqě0㩧ݡF}:N[o9T8b{IwG_T蘭-CyWۦݺ:}A'5iEp>˜Nk(Zt_0}~,W;s!t?tZn'?\~x}m{]ͿyO~z*&7`v9W=Z-ZGx?k'\pㆦͯw7yiklWTNs>@6O?i ?]]q1Ks[w *7l ~i#`'oW?.ӧ?Yˑ*C{J,ievo=)k8՞VJZ߅Zw[d"JOe$]Y.-}1t-_thF~?GR_tk#}庩B93pc ǫST !(G3?}8ʍa5թ>o<|<,Ay p<)7#=U#-M>KK%-qȋx WmJO!Eyc=q\37{Su_ E"|DžH 1Ώ}^O HڸY8![%mz˧w7 tV[6I9Pe^4g*vpA9\f!=)v"#aHxrRWG|g!-|7bz+POh^sSj} | [y`>[q?z1, 9>P(nyoD94zxFYU5+_) y+6K(t9Z/hAH2mN=_Zp~hkN~2mD~JE7ٟq3b?帾i A~ q?qǜ?ؿwԇ8H'<94^gy\SSˇr>k_gmt=뵿t[X_(i|Nj>kx>.[p<BX9gJz6Ο|m@~xn xٕ̑#Vy#G¾3Ѱ\زhk_Hߥh ) #ⱸy>G6E*jֻ4R*=hiMCU]tD}''4h0ZJcMe$dPBv2TgPN`HHMHLiPHL -$&ShЖL$)3e&e@K4)C[vSK qI\D yA!.ڒiPhKΆxdфzMOPǠP -#C4fdфhdhF,24c&"RCl 8A.k".-TBr1$CP -C1 4[4 iA!:m{CfLH3_(3z, ҬƠJ2chn %SGC?P8C]40tQw2!|1|:‡)C/u6dO@P9- !f6C\tVA!][^C0e2iP -d?tJGC>1!P?I( }O2Iw@a蓠( }- C0e蓠(] }4(?HgC0 4[P - iP -tGWCx0tSƒ9Bb-B;pP e-@P(nnxֿA[mm}n4hk}ٶgʭ[sk-n ꞩ8ϭע]fۊ[3o5ϭǻkkl[wtkpnmkkA[[6[<3 iGxfrwrK砭V>+E}क़v ⽊1^ 0-v'nvbbJ Ix0^^_`J;ǃ^LWY9 oH;1^ޫfM罾~4GʹNɟ{A!`UH2`=0(v2R?6ߤ<} ˤI}yOx0`sƃbuX 3 >ieR@{;k?x?4 ⽶b L=yFx)1y `G{MBo.^ǃ5KL Wm3{;SAW<~~{cu״4_-c{n!v{# OopkbwF%bbM;K7%Vw uQ:ˠ}tO5{s?&SR|lm<>ׂj~ʇ ҟgz"e1OC3AU}TsR:d!_gaؽM{fp^\ѾCg[P[gCSaZ9eKٞE7 p)y:uVwֵ4j-6KRǧ酟扜һ"cX/\ =dd\tٗ.хcfKtQ:'g%'2OR x;x=z* Sơ6hv2-8r?3/qĴy;{."Sq c1jB#* oCES(?GFV~tN#g8nwV ܬ9>|Ar\EDޙKlx^*4>(Ng1 8lq#mOlE~5.ޤovo9q&79o҉mf_,^ۈz$0<*Lx?+|A3Lw珴NYjwn!]=D/y ϼm c7vq[u %Dxl[%D[p 1Ki .! B&ͳ.%:\JtE-t[-!+|Y&ٖ59hi>]4ݵ4AK障mi>]4AK̥A\-3ۊ=.gˆ]6v?\6M۝jw?'z#=i%/jn._gM_$}0/U@l֫W /R&ɅX:L"Xy\SXUS|\$u^29G4Fd9u$uv}- Z_k˲6h9ͶY0dLbG-b.nj c, ;LJ1iIp? x2J!I&r,Gh:~4G8Gavs'mz6nm;qKuwqSt'lx߸kKJt>8˺8l6(>Q@<'yOEɓ7%J^5hn6قl-7ͲB7f lt,gl,{)ya+_$iNA$IX"InEM²-&a\$M¸HM2LB3  +̞;gχ}`C-Zt>C˴]:O&TwCf>g;&}?/>Oϖ_%GZ􅬿[t"#{*ac4`X\{ͽ{'t!=D\?̈́n">Xck@8~~$l) [. qԦS7r!0S{Y^Oz=zCZ~|CE?_E9l1U^#=0QaWiNӕt ~6P+^%.9]B[\\܂!,O| |~Nt 5]bM'}=J< -AhwO+%ghS[o5DXثXKC :|SGVhKְ5]){z?oM~yۘ9yk @I2Z87ԫ e_ǜ1_\ ΁O 0(wK/ }=fruy+c)c)c)c)c)c)c)c)c)c)c)c)c)c)c4K4K4K4)x>3UiןJKs^[VKv.̇(\h\\\3R*7XFwrw$C,{.8 ? . .Ԙ{+c7a{&x<> 0w;}o:03 C1h;d/퓂^%^誋]#uڇe-oR9<#'|O:B#RrRrRrRrRrRrRrRrwv8ҍCjҐ>\2M{wТᅱVsĸúI:'y~4!߀ULAeWVbavt 11'gN\UӠc %OPp)X=YaM e,e,e,e,e,e,e,e,e,e,e,eЬQvᓱ3f> ng!'SևJ/;nYZtqf7}NYS}^/ ?폗cYЏzvc+we+we+we+we+we+we+we+we+we+we+we+we+we+we+we+we+we+we+we+weۍvvvvvvvvvvvvvvvvvbD9}ȪXQ%b5{^qצhqۦ.F- 2[q"lY-S7Z>~X&Jv@ %%B'=è?uA08_!bVCf!x~U.VFڈ[hMк)2h~FO#zD%T=埈uH3L5s:.HHHVVVVVVVVVVVVVV/G5G5G5G5G5G5G5G5G5G5G5G5'oDrҍiHc+vBȰUyɥK }/DV."!i7qn&ngpZF]Ð!RAnM׸ v2t4~G=R,]D~ؽ];% % % % qTuTuTuTuTuTuTuTuTuTuZ۝`0fXC:fi)!Kx[V+tKnxtuߘK]7:ݡ/큯OJPXY0Ġcr}&kV<n|:EUI|-cfnݥ//}{kD>A$Ɖ/`t^\u\uGc3cp HxŖH#e)/:YcoGmJGmJGmJGmJGmJGmJGmJGmJGmJGmJGmJGmJGmJGmJGmJGmJGmJGmJGmJGmJGmJGmJGmJGmJGmJGmJ);d٦WVF ӯ_>k~W>'D^#׽ssѯ`>%OOK [6kŹvkr5sE7kA5/ _AK¸ NEN9ʁS)< DC!k&kfkkId$ID(Q$NIV@^6.F2]}}VQQQQQQQQQQQQQQQQQQQQQQQw GLGLGLGLGLGLGLGL'2Qz,--ҕ!Zz^W%Os'_}ʴ]rl?Q8\4@/]/a2/er/iv`AKl6t'@C!T/BB/F/J/N1(X0R3m2*w(w(w(w(w(w(w(w(w(w*w*w*w*w*w*w*w*w*w*w*w*w~W-mW-mW-mW-mW-mW-mW-mW-mW-m7S0U(*JSjl_X%f:̉,6eN;Mjn/<~׼zR>}%hrY6@z s, oO>y~@np} ,lX>`6*}~zyy'F.ܜY \\ ˀZ*?*?*?*?*?*?*?*?*?*?*?*?;j؄.H0Kgȟ2v̢ \^⏯vAi%8sZ]V%.2#2Ɵ)AzM d4}M|Q z$0b{8~1,& p#T|jBU;fggdFo;LwC7gx8\>ĝ0ej{dKlJ*Ν(U*DeUBW1acDŽ +V>&|LX1acDŽ +V>&|LX1acDŽ +9v+84W4ω̨H%:Z/xUjsO%qyl,7-t]Fn/J13)b1`ǚ@,kQlҰ 7S3q5nz̆rS3xEoc%ČC!Q& -#`-7I3q5nMָ7azdtVF%JX2*aeTʨQ +VF%JX2*aeTʨQ +VF%JX2*aeTʨQ +w }&΀@5嵙٦Bk_ܻ+zھȱ5=>聭  h#vlJ=8YVh[jK~n6,wrRvao' >K- qGgûf_9FOb9^r+){7_8jˏtqE`nhE_el|l̓_ٯڏ'?%\t'{ n_,͛ttu9yw8]˽ EdMXӠP=;BtlG'Zkю;ɥݽش7zɮ^r2]Ґz%B&z*A-5,-oj:zuo^#ۯEPiR,5Nz)߻ǖ7,[5!R]W",Ro?QWP6joe8r6GZK|k J ruuʌade4/data/ichtyo.rda0000644000176200001440000000167312576021756014011 0ustar liggesusers N[GP\VEolzHlqݔFjXE%4U(y?J!Ot=KMni9YǙ1YBtlJ3\3']9+(z3׊V<׹" v' ¶p­a*r ZS!;;nq;} v?7"y-;5a9練בMᶳ+!yUqox_/?OV%^VeEr~C䱋&v#&ݖ:>ews[}RGٟʂ՗ǯ 2voNmzw tw#tm>;sg/OPک:$4 M*d ҂!"XXت5c-cmc#3LGf:2ӑtd#3hhd>+b:eգ"_.zGK/GFs3xʝz'y75*jvmƵ&Dhղ>>%qjKnRzI6J,jIJڊ\ gz+*F"= EEy'ade4/data/maples.rda0000644000176200001440000000375612576021756013777 0ustar liggesusers XKlTU3vk^ؙ6i&ByH 9b LHe:t@p֬u)%7DЕ ԕ@@_{;wg9O]83 #l#g4!È9c˜UWRrj8K%kvΪ^~+stp57/l`PȠR)/N,p0U/r!iP*5uUMff.T\n*kU.#cϬ|q~p+[Cr}tW |jN:U+qj\)_\jI8Vx,Tg=clPb xay0"n58]_l;O1G1b'Jߙ.W M{nЧYp>z?Xl^ݸqXOv"ӿ_of'[Wʀ zMϰ'7n7Sg&a=f vҷ3yDL'v?Юff7FO?f;70$$Q'ݴ޾!/]]ׄ:%c'΢tnJCV`[RRGH6+Xv0Cg^sҗ%xͨW lE>?B=cW7.u27QKmķ}79A$q%N9̼cy8D^{DN$K0~=~q">4'8LO˘`~OWBM{.1|/1ȝxf\7y Q;PIɧz&8WO3Ο@!Q?{7صץoukoJ])vk+,qKꪞO,<{$x9K1EEu[@sĜ}}>\ǀO}^E!(o_{TAYEg qőz̃zI6.pxXsFmK,ڸz_= } B6B { <+<1U]8D~Lu }O!E!/ yP@nT}ʀ]Bx jqlc?(\nb\n6'tJ^kMh-"ZD5Z3&q/#5Թւ1"ךEo ZS_ !bxjc0Epε@4[Sޏ/Iezx&38=}z_<}s >{ 3[6 9%vm}>m*}/܇qȿ}}^Kw@KU czxO"g>G^ !m-}yf9p ޓ}C~#o# =s[w9Mgny֥:㾤6%#xT_9sOo=<-59)z~wD&%|\γ_"_)x0S]}-DZmh͹Ocޓ voUbҔ g'0LLueZ+Nky0ͯhHf"0& vl7#-::yr$394[7fux=͙ zzZ@n2(7AtOg&g OJ|mk& 4Ҧ_5|j{ݣfcݳ&V;/~RwK&ds~x{o7' 3}fZf;DSSg+"=p j9Zݎade4/data/dunedata.rda0000644000176200001440000000170612576021756014274 0ustar liggesusers WKo1vE*\Y4}rK[*TP"ԫ8J Ra7Lnm0$؞]4uƘMyNSatƑDOzުvzz9VgFZ/4F;ѿ=e+Zz|Cz o 8%c%ah 9r#C@FIJ|XUWNXC*p҄ a 6 E`oa6em#iH{F2s4蝑lBwcXvK;bk>-%]Gm[6P^~EeY.-JϬ\ϲtuM2ŏ}iER6βw.@m8/e[c|l:DYr Futt_U˰[#[lļl)K(/&/̹x_ЋX#}럱̓j}EQ=-ke@2.Ϯoa{zvw};swqٷ5s]e#- dLO:~x]ge 4( *a` w P*U}Exi`jY P+94p0Q<r%}G|_%^'2blzO'OCCa":7 0NwC|6pæv.zxCgЉ2Hz+\C8LMǣيXsPe4 DfN|ade4/data/capitales.rda0000644000176200001440000224416212576021756014463 0ustar liggesusers ж{^vn#̄Lb&~^U| QOw^ӧi\b2T"ejDbHBJ)( YiTUW0&&m>|/'|}>:}'~_rባ?! ~ky] =çi3{K_gOyO\iԿ3#/{U/sՏyWW׾uuao|ɫ_/~7_kC}g{|Y{駽ugy+#^irOxգ}#~刺^UoxC(U>7>?"އ==_{}߯Yߓ43_gq7Y2KR}EWǫnnГU3_K?u?tO5X,Gg}7GPC o?E7[?6߸r}>>⬿/_cpG^߬؏߬7׽}țo;7}庿7?yΏ |>&<x}T֏}TsG?_cwq7>Oo>cu>9Os|rc}GΏǃ~?<~\css'N{' |bGwݬ{V)}rsIϼY}I?e}5=?5{O<#wz}y{E?ws9u^#7.},Xy?p~ƛn>3ܛ|~F5xwś߽1xy?G^|zyOқf}ܜ|s^?+7^vo]7ǯ:\5ǫf:+7ǯ~/ 74)߿o>ej}E?tB|?y~Z5GE~c8֞g _7Ϝ亹^<}_:O 2xxe_z/ _xuxi\|H'>/Zɳ?} ]Z'O<7_>/{=:V{~ Coܗ^\O?x Co>͓啑|a\ |^ӧFN*tʿf-]^hG}s_;~u#^XּkWO}^<6SJmk.ȕǢ/=9&B!w8ߧ9G"?=}PƯq?ܛs1I_!7~z1z\|cp{ɿ{o ǟ~7zjӟ7CF:}繳>[sG>엲z64k~GFoDNsxE|+"_wue~%z1} }x4r饁e>F=| x"Ϛ߿W"O>5?7߬@ё֏yC~u|\g|q_~s\qoY?>!KC=|y'8!y7xײyǿ#|o}y`Oߎ8~{k?f vyK}ߞck}?~b}>x7?y}v3x|]굡W>5Sszu~W^~~e^:w 9/yu5ב߿>{ǟ,_A7vC_+>tiw}rheW'ܜKusG}=wo~gޟ{? 7ȥ|O_o[9\y~[{p襏~|_^'>1O [ ~雏u7pG_}_d<><ω^P~yq>rx?'~>8T;<#>9q\xzNu]_=zA=z=z=z={={xn㹽s{={ wsW{wTί%/y飯]C7 {Ư+yk/b7OѶG񌗼ۂr܇ xg>~_w~;o}ߝ{w1ս;?{Ow;?us�wΏWw>[;oһ[?~￸ߝw;?x'ysow˻Ώ_{?c{?x?ߝܻu;?Ic;o{w~9W;?z|?w{~۽;/}wƜ-yo{_}yC~Q?{^Vu=p?=w>=[txB7/w~]xzqyCsԝ_'+ؽx@+߹F?x{¯s>OVwK7K|s[x˽;?;/x/+ĝ_?/XCV ޷ߟw ~ݿᅵ%ޒT%y\9WGXyIV_֟|ݿOuo7#=|W_3o{w~  _ U޽7:eT7>?ܗ K/o׾_c?r7ρ~}>α! 쯿:8O;^,V^/^d1|{|NN{|jCO) _湾=|uyo_~m+ţk]qY/ >AgǻHCt{;c[7p<|3j]X|߃;s/<^p~enxO#sOo?/|)skRGx/?X>_OrAw[xOxwW3:ggл.^#ͯu]R=pd7_V?NǮ SgVx><=]t#)c|-O{;I$}w-yT'tˎO5W]7>9o>_g-<':ּ@ gt[9=|Nt}w];e]st{snwl8k?/)[%կO7;E .S}9^k}w:F'|>y}w }CnWrNל ׵G9ϱX7أ3&.aѯx {v<ϵ"/Mv(&zW#|zk9mSyk}8 9|K+'=_58y]}]W}z]s~ή~إx/<6O~|lj[[V^7_ߝ}sW|t~_~%': 3ko=._wQ\Voen׉5 7)5 <7}~{׵c[3~m| ^3./9:L~19o}pqOQw myK>|?-ݲSt7J/Gǹ\+GVn{&{xyԟ^-|>G>E/j\}k9ԍ>~Kt~K'vC=6~EW~7Խ\>zoDF~y1ٸuOܯ;<֮ U>h{W>%:DߕSOFN5OVnޔ~'OʇNѫ9~I|.~[ڣ OCǙMJ'qC\$^tWmkU||z|BnW}7~L.\j'Or*/ntAC.|_{}?}:uzC܌wa^EKl /Xo[Gq[:濑WO8I=+O}Tn-|_Bލ_'ޙ;CI<篌=:eU#]c5~cv=Mnz_q]rE^M~o{o}zUό=^ ]}_s~^Z{x(g[yNzəG*񑵧7^ͧO}Cz*ݣg~c^`ͷ+~sq;w#n}}_y}zk8tvb=x7T9Ǐ]^מ%Oa}[~ :k?|!n0Y Ty!&osOWnɥ{xS'}uo| /C v潛g y׿MYow~1?k$t@ϲkGnF]vG/S[YK_󪹯~^})M/~o?y{^"s֑K[&Ouŷ{k v=}>+},o9uyY;Ǽ ȃ^?JK~j_v^@;=vuቃl}osb%G>C_'>v%7ѻB/wѝ_ɜ>';7׽~y}KsB<@;$T K酷ݿߝw{wޕxW?)p߻K{>G_Gq(ow7~["͵y8W.'~Mw9;콿>qݷݻ˝w~~w]_'K߱2r%Noǟi_Cޟ=Mm+Gz}{z Ec'[XR|Fb;qFy,R(WwYzʺv =U#aNz|ⷱgy{z/P:=;;oŞ`m_~{V9r*x9zB }M%l}#mP{&m3ϯ 7z`w ~F߷^B~ާvW9 [5)\B{LnU/ZMT~:.rv^}Crm֫w~|_<.rzN>>#?u-kǓw^8#tZFd9[F#nwb+f j.kgJ׎R]m51T^T,4T_Ɍz\[2M Oje#<|Qn3cLi,C;Ù-Ԙ]cp|Ce;5GN/:嫰mm6d:2czxX]S:Gl9|Mt|ؘLstg{;rj͔K|7cm=w-Fzf~|1 5x^wjГ'W+zN;t~9#yn/H;=9k޿|g4r]y]_#_}riWrdlscTlЋk =+_WNnycf*&^)7&Kf:=~Qngaoޯo黹zg~ |z>:}cjbm~ GTzߙon\mmoSj{ D>oͅa>@cנ3t = f&ه{/ni싵'KCJgnlzEf9phl`|޻ݡ6nM^||kA>wFzVmཚS-~`/1ɍ]q׾8C/o2E~'f5]k? ]73VbI8M(&f5,>[K..Z9[ӑhME=y9ֆnOk]ؿZ [kuC-'[3ۚ4][SOD.^@ϱwev/yK/U:>1_|K+tOQfվyۃۚ}s_[{vf-|{<֐{ɑn9Ay־Oڟպu{R~UDz[;"эvO#waTK*;kb[EO\,ck[^uO38x{퍣5'g9{rbk;.}Vn_t8o~DSr,=Kvg=]~{C gWN~_*~&.ߋ%?!.G[|ۋ%\wk;tΆP{9ݸ 9;~$'^mAkzLs<#ؙۣ:{gᶙ֞?i=?Cw8iTç6I&ٙ{zvj4|<1zPPzinǿr_\XrwگuhڹjسnmqaMܗ֣Ij8^1K`vὢ=/?N㧩= _rbV@EazkpSl{wW_VOmz|O#W쇡vGn-w_qЇxfk 47 x~W'ܗZ0'p|ϵr<7|y=ӫAO\<؝ÚCK/aukO숃ٻJ\A|B|wL6?>+#rf;;;v\=7+>je]:-~Y9>G=yk8[nv=9_`⭇!^gIxDvIl [~{ϑCMTá׍nbq6k&6u>>ٸrWw\8IqtcXwd:_x9O\=9V{#GMƾk`w9Mnm>cc~Xpxo'~p蹳vS^bgcw8)6x/s~+׏` Blj!n[?wz7;Į3~}x{}\ \]龫GqJNzM9 >bva~?=l<<_š!Nw^=YG}]mOU[ނ]egxЏdUCiB<+M/ؙ#/|Mcⳇ8ᇸ qLܮ3W|fGsv&rmߩI.wHvЍiv{xX?|m=5zq gXzyzCx|/+o~1_|MxF 9u~䟼mк]nC<'9~_c7"AhݹSuo 񃩇;Գۨ6=}mON[6A3"/nn-~zEynq~ol|uզo \\GԗόJrj/_x4Ӻv_{oe;vx]}i|w_ks}8pnwʻ{5u[k6zK^>Tm뇚 s3~1n5ϻqP5}[ c'8n?h>w}i|L~cl8xNoܸy@xd'3RVN־:c/?7ouK'goG~{қ-'? '~o ;;o2]/ھa͓l|gw|3{quAoO?yR'/i~Kg:q!1쬮~!/0hLgkc?Н3leaؽ Ww吟qjx7{]+xeg|EKIp8kȺqد{+o>dKߛ|/ !>W]̩boh݀=7Q)ו/oh~࿳ w }$޶u5;.zܺŵ^w ;G/~d28f֟ [}zԳ#_5uΨ+7'HܶyMщ Nï!k˄]t^љ^[V^. %ÇG@_?ֿo?[;P;?ly/ ;a[|;YQgN)~,ٮ6-{ƹ_i?I\^z|ΏZxF6n:A]}e[#?kG|?d]g{sj]ڧU)X]!{F܈1x_zїGC}sK#>'gƕ;su+yu]7^;;XL\uY0,nZA~SGI|ʑCn~:A߁/fתT_ sg3֡WTg ?{ 9uU\ nV;*[?}й69ry]O3,._v8ALv!B^=O^c/_/;.^yuzt^9[Gw#8|Z~-;xvߑͻeֿϞۧ3"?-<͓?>}W;\kXzOٓv5Gy̞?}s{zmkwCyG~>]^;rqlo~LZ|Uu9yOF_ [O{ N':e|oN_ٽu G]9Su!]}?}_%o)?_re7^#{կk7c_Z{~8 :)7'wQc_W lFq^}M^ḲhIo>~|ZqFgsZ7k7u[?yV߶/z=_sWDjW]kEF]53t@Cm;g_iA5?Ch [u?m=/{s/mmꑷr>ߺЭ#w+_o[.ᷱ En?y}^Gn|~ߺ=̾Dr7ow_??_ui;;rgp8'v_Y;oB@]I9X?!=MOG&]v>㝹FU\|ls龍=>bɧ:^=_wV>uۇFĎk=Zֵg??:_Y9?n\Cguk_#cmrg`;ɵtX#|zuɷ5/1ugm?;yxSo!:}×!c#X9\s'z3z=/bGCn rw(auy_ ^jBW6Wu{C=+ț6ޱoa\nڝ7rԱKyN[@/,=/6 wP> uCjb c?b!Ma.~8r'ϳtvux,;~{^jA,t~迼_jv zOvxo~7nvR>h}mW6ϏSg{O|@w_aЫ}Lqs&޾u'F7t97xޝpv͉gA0a=y\=ط߲O[aN6룣Ϸo٩o~w'w7'0$|Ը3OW|0yx!?C*kT3gA<]#'ޖW!C]l?yaaS!.[otbOcp#.]2O?#7n~t< ~嶏ny fsyēLo7uZ3Dwi/zӯ|o~n7r_.,?r_zKջ;sבwgI}fl|Pw|/n;nhY=Z݀E[;;Ow!>o7oԱ=o}ĵ6s%x{͏V^Oo=q<_|sƏnp~ Ϲqnw&Q$g],aOCj_i#ԼǭcsZerv}ݼ엫O ?eutd7}~ٺD}~@>y4~:3{cg=ֳS_+W1}/~Kq wĞ_yqz_{_=#漢w鍝nw=~>3u^ ݏ/qH|%77\ O[Y~ק=y"|n?'u_>}?u>[W8={SE[|Ł3f׫8˜ww:El^]\;u~6k{_:(Is|ܾ1uOIK}vޥ<<㬷K[ƿ\m?Oy=?|p'}1v;fO7_x4Ίz0'6s-SO%r—ݏ^3O^q~vq䏎\׎ۿpw}Kȉy[ч;k룻_}BkTC/'n~|{O,;A=A_-}NNˇGzO |ŧ:nJE/` K-#?cNe޳y?r*'/WZ:v~=|NO_>!_g?->W#7Z3͕G^oFvu/o@Szs#OctP#yyag?y'ΜVUfcgEOΓߥCՇ*>C'.=nYUcZ.wM6//Ϲ74Ys칗u)ucQ&ٰYVwc/eETcG< ϕSKօt)J\i;Arf}ַ`P>[6Uuo[W;%.X"N]_7\k|͖ vN_MO_x9krݠFL7Vxƫ4zh߯w-.Gv]s^yB&:6 _|[?/k|NnۼyVʹFkdG잦"wrNFB- {MXoo_=@O qxw3OYީy.<=zYyljȃWn<_-4'rp,}vޚ] Zup,eR6A铽IOOrGTiw}ktJtݬUf:5RvF  ]?(}ï>_n_'#*D{ ;١>S:!.NOO;LyЮmSkg~yrO3=7rWZMk;|_^Ѫ"dO}8,}/n-vyBowݱ*t}N˷Z v׮yءv }7O* vaޟ}V'E4=T~QwR"<szhv_vU_Z>еxKvm0U`}?sWl<}Ӫi];S^;1iru'K>Oue~woTֿoJAysFnNӡىNyrߝUv8i!3^Z|\@5Nv LTVqηnu[sp;*m39G~>oKpwAnT_;.ױ.<9~o"y2 5\:.4[[ڕd)~^J뵚(mWoo|:7[~&^{$3nr)_vSݧSF.z>-nm,;u-糸TxD"w.l}:nª{6 ЗKGO)yS9$?g肽U&~?ig):Bާɦ7Ouv߱+  Oo|]gUQr^\ݼݏ펕oqOOr򾵟~ |,߭r O%{}Cl]74G)왬" [GO=QDo9>t'}:nc?Џ9Tx&O@We-[8킌л%|nJ#5;8ݓ"'t_⇃q{žon7إ!&S[f5y{'[ߪb)Kh>'vV]z.~gO@ճڱ#[/=#yI'Fo^]ۛ?\ϡ_k]Lgr;gP:B?t_{q;7SOȁn~|:]K"ϺdtgT3cc4,;yԟ[qv}F<(<7&uX~_oE;-əSP;%´ʥwjWcf ~<η[)Wڝ cWu*<ō~N\Z&&~ϴ:$|vʙxLXht?quR_G7_贺͠\%_[|du?q ~ g /ّ7Vo|z7,@|_~m]^]{N'R7/n;%0Lw%|/铽_u_z@vxW?geqvͮӏ|ԥ4^DN59E?>;w=3ݦv8鴹uOVw|?};gw{=8D~~ɕ_<䉧/k7?3i\]>k;3S.S-=pBGu9wҩW~Px#}cI~A1lzfr[_P4:]6uv!'Iv:KqΉ_B`w{σ]:ߩn {O{x=o$%7nA qhS:\zwzG@ Ozc[uR'u&Lxqyw|#0o +p:vjQ~Ϯ}<>ͳ)Z'=UtO{OgwpUwjhr }5?<[?EބO=E#N=9[y{C#7{ߣwANe>Y++:8y[:ߧ_zfDIVރ/_~ s$_ 7 O3sOSGo{[[n%_aQP{օu:'t':[l_ [׃طo>UI\N_%/W3]yG<'Yy:U? bm4 /p:=߭M>qk~3xO6xos\xOu\gmF&YdÓ-=okSVy.xjDmMkm\x,fֶyfu멝<­>\r2mYKϑ=b{c5O9K=(<#XXzuu>pˇ'ۻ+]㫼wy ߃{ ϕC_~ܟóu '~[_9r/\'>M9A,xͥy$[c[kcr&F?xO1 ԙF˕'K]y[`=vGFlڴjrrmؙ33L͖٤raWݯ>OXwV|r2݄jF_-,}Ę^гuk!`Hs#H{5c T.\MS#v31?ȏLbp[3;tЩ?[Þ|ʧqH;5Oc^&~&@oL?~OCբ.rBG Fܝs6K 7;ikNN=c"=/ߜ1xstO; o^|d/qk"xF7E=߾'9.8~9ﻗt#_?"7_/~[?N|\8#?$jGѳTpu;ڛ80BX;R_pǫӯP{g靍M>wƕBV | GRaSƎh-jYĞC|^;^j~J>'N}{}Ľ[i|qc=aja%cfUuv#wF>S'AY3'N>3ߜͮ!qzzv;/z2Oxnvu><8řM"]k'iw&^{z)@Cw]x==L?{~ { =ȏuE~>K~z]zzSV+'Ek bײ7 7_Ŀw7F>+Lٽ#9Ѻgwճ=wlFot{pI;kq'L>jun1>|wnW{%z t[=窟?.EN%u}~G{hB;='>O_Πj\Cg8ps3KQ|z{oO38rq<_3փySy <7wYg~>?ţ;w~^=yiZܚg{_4kDwxz|{ ~gVHn~[З٥>_{qq'<֏CG^+j'~GVysf`kE5bEޣ{tSԩCb߉^:ï:snP]uΪ/nGqRwBnrE \u@螿93t 5yϭ;6,]KB/o]k|OO]ƕI%D> S%^ n[.q4GvY|?h.>^ɬuz'Ξ׋иzb9ܪΘe-|O#Mн눣<0<q)ęѻz}:ַl,[ ; ^+"^jE!~B8pjOENq] ?8f낧8"|oѸRqN;LTWL>o_KYG9agKaG᷉pltv u0kZ6SwdiLjY;pg E׽;D N*<ugwnaw;qflAzًGgv/GuYalC7Yqzp\ dծ:] |Z8v(yV:7CZ?w䏧oǬ6R@uKAly?~,Z3j_з0#>#%lo@]ړ^_#>U~49Cn=X.UYysW̺=: =@,B{#U}ɞb/ɑO4s.Gf^sJNf<3ug|to#~?mhq[o|ɛ7BY7T{L`xaf{̬@?]tϻs7(/$<ҩyHv!׾;M]UGGD)|ءOCkg} 9(]~߸#y*saί{}^{yAo}s'+T73ҫnL^yJvìPN/o/7l̶l)Y0}vh qh9l}s}֠l Zc/:okۓs/6d3xzzOpnۆ.=jĄ&pƲ{s>\S^դ s?@Kl{.6X,nM'=A7}/OuE筍u ܽX]& װ ZLp\YmЭZW1 ;8Y7}77<+GKlDDlDD]RkCFBG_xkyX渂"okLu\ZY9nT/^Kf՛;ʖP:?>j鐛3ĆmsY8XI?n#Wr?<k%>jn8kg:Asi,߶iY;={ _ࣟ lyϵ 3'wV}=V}$SP֜YB {ܗGϐb>'gӗoy9E;&o#r5v9Vz]l/wVSL'p\syO|ZMkܞzg>:|ˁ { ҳ7rޯzc; V=< H49PoG}ӺD5N⇿{Q1ݒCCZ9ߣmO =~uN=!g^W\EOik\w)?pk7ԙ扖t=tٽ2i^ v'NWE73^b]gqͅ Oύ?{N4~lfCO{g~ůrk΅ugEn_@qtݷu+Oӧ~j6=q}OB_O.Uŷ:燦^_|[sظq<@k{CNǂD|}o^g ?]x[NdTwޚ\5쿍4g2Χ!x#l``N)|N׳.\!3[o {^~koGnwOVC>lܗbyۀxn^{]Nz9{Ugy;ng.r̎ :{GLA<_^'7؝Tk{y396 W>9ʓVN7o/t=7.$BsF/W)CF//;t|Oo&}_<%tysn}8纎Ž>d'}wrAɟO>h<CUCg[o6 |z< ϩ?[xc׻yUsg{q1ǮO#7ხyʝ<_gW<>y0EN=gl“m^-6.=ϕE7;#r{}ebf6،zU8ROg'w-veSbMq|9~(/$}ͯdCo>ғ:ؽld߲;6r<_$7;ۭ_|[og?kuf:xR]Β䟬\'~_~8/:ٺև^Y!ϡs~g 1P=Dzy9umccؓ}aO9,q$y2[W2t^y߇]AGaWESp4;N~5t^p r^zr7c#=qͭm.xh]uvԙqyG!z}xS瞿p/էd8c%Bϱc_Dωs/d_v>>qQC[#C߼Ox :j%o W١Vzoy3Zʡ ydٖO;7?qгXثky!7'?'<愛K<Ӟ7g>W惞Co>C7z?{c|~į>Yw'gާ|+||q,qƔ3%~&\jW(V&V]CZ"=ͮLn[[mh[p~p xX϶bs>8d={ݮmG:&و϶> R.,DXϋܷxYi5oGp3ɣ3<8QstkJ`-p7.A. nT,ܦo4|S8)(T۔xI*(\- sFnxxog[ ns%0BRSBB--ԮTݺ"-_&Iۧ ~?2jsI й960%RwTc7yM^>CuοMQ 4#> M/Rhhʾ OU?U>MCֵ[>_H6T%.D+daBm¿|T-RYJvQPώQbBIR7PQK^}É~@g菾*z]oT-;ʢ'%5X~< gD|f"ҕm r ɳCw[褨NyIkGRes-y5*]=umxxomr~'qJڪw͟$X)G_oiGK f<ouE1{ ~?\*}þ~ziqmuīҲ3GkGn>xl)=늷U/^o3gK闶,N-ݻ_^r5z:o%}>ªTS+l-/޶TxPzz[Ѹ}0+7;/;By-xV?ac N-n)O#.@^kQGOoU k 1O\@)e^[YLbu$wS__<<>>凱\_< wю?QkLu3mӺk[9jy9ij[?5x+NB4>~ݸ1|;yS<7xhiuF]hzo&s<;r(o(q2#o"s`-;`ZugqQji1h+VpLXɥ?[E'u#g.iU/˜^a[7{~:TEH?2k_7N_N}j+c{е88CGAv<#:JO&-^ ~29!N-@[Z[Gf)tԼp{ |Kq 7/GQS`NkGwjSScSO5ɓGn<ƝjJ'{jG ?>>TSWG]V.m[&[A}ˎfg+>o~?OuZ:ڣz_V+nePϢnΥ/"cepe ]F=cx '_?#2Ka뉶nE]9b?cFBkv /so;s|{v]'9uoK5 oZ4vPtI;R5_Uџ<8]3_/ ox'ȣ=K(|~zoa/ONe΃o~Q}~ʡ%ŗf߿}ey7O1M]W=FrϐDtmtnI눳- ~=~Cޣ ;4vm~@Eڏ2p;gxE '^`ʡv[~g:<}Ç„}n>9zȟE_绕P{nAo}?cދg'% +؟/ߺb=U<`K>rN}e::%|{T*KS~m'ǝ1[>399[l'𯽷Drx{/Cms}P|s4_҃k[R{\+:w9va3|J4hk=#WoKr#'q_ + ?=ܭ/rƣW</y,{׃/և>[K/ 'UL*e-? Zl;?7>u!O}p?uywCt _5 ]o|1vٟw˙Y_Nn1w}쐞';.OX?yy^znG%x8N"ȣ K蓩/uQj~ {!eSzwOz >G~a֮V_3Ƌ|RaOGWރ+;Kc|.lBc&?qvk)uG2u OTM{c>;yw] ?ggu ?[sPﯯ* tL}}@3 ax>}/-\_@cVsqWyˍۛ/-or7}?=\z_;tMS?q?1^6ugi-?dkhv,=/t,_ogv y¾=un׍^npw|V/ukĿ?{u>h#}/D/wiYg,ϾyûzoG}<e{>Zo|7J=J>9];ɟwoFձ'EQct~yGy=y6>k3Uŧ;*ߋS[rI"WK'뷮߃kR4^.ăw{CG]C?x}?/5;"t !oyy5;~R٪_q5ug'4oCDK2En6O$N|l)o#Q}+R7:sk3;L{֮5Ç/#= $$_yC}S>0/3/|`ѧ!~p]gF/vzڜBX [_z>ؙ6'gm~0u7?{[^~ƕOK{puŗQFHw5I]h8̧3! U/ys|ܰ:/{V~W^ܝ~kؗw:Mw~}u'/ l;X]vs<zGyտ1 *{:pgG~/4Թ =?: nܧ3.!W,)]=>rDu$>9gγ9YjOtc3xo?<8f%eA!tP}=vOu-zv:ñ?wK{ұ9 ObWa_e;u _I7Jz~!z|-N~?pIvNh~~>;W$}Ћ:%&=z\kn;vcȑkM_o|Z{C*~o[2Kzq#5'x'?@o~Co1|:_6|Pz;p}ytETчcO/ 5Ӿȉ6.zw˂8vީzs?~r>z|[9y_:G'p+ tT9R6{1~>SQ: > G#rݡr}s|z+y{?Gµ|s E|_rycyR:򹸁ʝR;%iX;M|pO}@;Ł÷zOsi}ž7b_ߵ{,1~LΓBw=~_gz Hkk=L]UOys/~?a3;d^ܖGx淰?-;r<&qg߷GG쾥FO ?Oy=s/~k+t}wNi7="3uV|E7_S?|8~)K_yo=/t:`l?tF7| 19ߑG9Uo_\}Zycv4w&7[o[Ns]%/.sjcGr 9>-c~7tyAz<?|K7 3|&.Ow_ݼxpV1yΩ:"p9|}_c=^ÊoJ> ⱍGFߜ<ž_yDß";Dg{enXVC;(tQx7֏h=FK:E:l>S {[5@Ѿw?K.jrr%^sLuR_u x/v@%v֝n~<b{:szPwk_!z z?UoL~_:л&.sO9s6E>zdk'}NK8&'6< ](z~幽7h=IzǾΡy>n5toxx\Lb/;zkދҸB ~] _]]uů ]y yDBg'佶_ٗosXCˎmtLmϷvH {_?x3_i<~f~ W7^</|W+>G@//Î\w=Qy;]=yҟ >~9?x: >so^L]D?_foo ҋX$= +GB+qcv6y/x+>.,r( #>!}Ao@O:1_YOX?'پo}8Nߖzpg~ٞjO=o=~>|둯vu9^DA\GzuSS;a{?NfԮ?Cw?93qKy޵M?z߳=sї褿4_|#[;zD?7򧯢sny[?roK+3{Nf]'Džq]yCWGO~/[=smz`=y~cυ/[ƞ1@8>᧝SPУwu'uЫOgK㣼-|ȿ?v+:K__1?),)wpFo\!ӹCCzY~i>\xk~:'W3Ɨ~G#'k7|}*|>vM߸ {;sLJTG.w*Orxy/Rgܴ%3c8oc?+WmV_Q>~6׭}!{ =,vE\yV>A|b \vߨ>#X|P }kw97rƹ7t!1|W|#/ʎ ^k[獛; yzal6n:si} ?~Fͦ_9rfWO=}ݰXp"Ї?>;{kH6Rxm!w2K*W^\?=tQs..yz\Z6={[mcԬ ֌E>{{o r13pkg&C-f_RkQz{|⡵yOvC+Վ;rE/&jfvXgk:6o ]MVh/D s֊<-9o?Y;*kkWߚ1=m~V y^MB|fV?z;mgÀZ\{N<UCZjF36_:kXC, 6ED,=t\ښ!9v dO9Re2_Vk&Wvk#uJEX/֞mkg޵kg:oNZI54/vF`1Yw1C W C䈵):t߱cΈʬHr5bjP?B3tz@wZQz\τZ'~}fgB?_?O7. waޗe!"_7F;=Ydg=q{;+8Gfzgvdg}orz<'mg6>J.ojh'V<} ~_!o_zgl?3<Ϭ҃=ˮ3͎kRJN{2O|{ۋl!o_s_q밗IU$g?8m(oz|?GN^V~G>y~1~G_3r}ޕc蟼p?h{Zi۳N?D=NRE98f]xCp§3 Gn%."ߒg ??= B9]}Ȼ/zy?Yu&gdgycCs։?={}MOg {Ok-N}3b_{OfL^AO"M3E]?+?|ϱ}{x&J>5zʂ*{ogOsB_t*6j@ ;kF.5<{wC=':uV`|{߭=+ioo<ә $7/:|q"< xtvD@r{]|Nΰc6+]ZwzO&džY򴉓5ٺK8٬ڃ#3}xчP{mf쪵Z:lc _;'{]9[Wq6+0J+ﻇA;c0wVzf z`GcpGDoO~}<ٺC 8_Yӳ؞0fmlQ݂';#goz^g›>zst6{0k{eyarLv:Di3) ɝ'9opWB^3W|J.3+q>=I>ǟ]#'8Kq:כ{kI+>Փj=0){ju}9xvOS- 7'xi m]*{~VwY ;Qܑ?E(sϗƛs=K}vkkuV`[W^|=<¼H??^C/?:߼f%*Of[S W"|,M6_yܙ ylYgp~ >WyTYy=o9M>WoyIL|c/ p >#q;tH߳7~zȧ/r9΢|]{0+0z̎93,gV[=.3rdgz:GtJ^gm`Wl٬fM 'Ko[z}rEYR~Gku{D.T>2^צ.w}3uyitfZ{gxfVQf0§>g6w ~ax}k3Ra_>3Xؿ͛Cܧ+U ZW)+?1ޣKWKڷ9Q+YV_sfƾ,]x?=A w_Wc_ra|Of&m?tH;s?3{}63Ӯz>YvYcTOG{'l?kL‡{칅i?hfZEo 43$y<_g;X;O<0lvvQgQa̶󼞣r~3:]话yV1tj}[b⯹>}g-㿸~;7c__츙xnggš{AkNl/}aﻮ rLVO:o왙V}μ'jfU6^sݻy+7k|苙Ŵ]8ϋ>gdUwt춃\g~ ,Ց+{'|>ơ<+ 3;eqGן}^3Z6 ~x'OW?W.>>{Lm?{o^jf.Vߓ{;l솵_*' ǥrHvCSng~En>yڇ3+p^9A?Q쬵|P}7WlfV>k1}b־σ'#硃Dnlaf*o?Y +~ ޷~O~yxw]0y(CK\|YM|?vYbxV}?{vgzVu&+GmVnw>@& `U^z~gNTL냝0s6V=|~_<3u ]rBm?W ЖimΊ[iq~f:3L=ͥG"֝S+w&XrkfB]{k^Q-sΪj/SKe63RYx߿czgfȩ9<̙2Kcsdv|ֶAĊԊ~ftgZw_=S;arM5|Y[kx9:[27cbWw:i[ 162n8Y4:IJkxׯ9}_(̝h-dY2;Ԩ4' Cj3 "gګ,x[>عt.YgEδ$C'{gCƶ{r~clэ9JnH{k0U+Ʒ3><']o;CLZN|xdsoͭE~=9oXvV`JϳgژR;CVQigʩ˿=weߋwM:_JsՑOZ'kzof lK||^{ifonM!GV[*:#?kL.9/TYy\IC|O܇δ:[4g8~{ >fD{c(sy?x:Q]~7D?o ~ҋ?|fzx~tkW?/oO ;ZOe~箝 >l/~?t.?{tpyAY|0+@ }<{|nrQ g~z~>'%paq#+w{gvY%}q!{@1CWOg Voe7lH׎}^*xc{xK>w@;G}/CoמrFqw| xd'V_( o@@/^|z\9|o O'-9e+n>K?3r} 6"e#ܯ{Dcs1z*~Yɑ'I1r_0zx?W#gBS!.qo"9zBϮyCo^̉\l/'xin>vƯ3ʐ |':{Lv3W6J|mzcO__ =|8ěj=#<8q%;c?=okD\ppLΓΣW÷v9C^omۙd\+%rE7tsNj/x K|ݺu| =xpl}}劮wݻA-k'~%칷ޥ=⠍wN|ez|Obc*GO^:a\ʫa%xԟ?='Wdg@Okcv+Q <ggޞMy%mfqĞr?+_GWГAsg>;gylfG }ןS_*?zVy>{&;q=5O|>G#C"cFaz[3 L=LE{_tvn@f4w>l?DnCVc|7 ~v}q=9|3bo=z9}58nb:٬LAqLysCqP_n^ޫwd'g[?Y)z ԋ~g g 򐽏K~?MKSD~'+ƅyr:sj==oo{!m]8hɌQr K8t/Oï1pFoY|s@/א·/rϞߞM#q]ߝDtGrJJoK{={Io={#.glffWeGsx#wٻuzm_ [ .hGK>; u^rzW[}:K=u[g~ rtTLO#!ث+v;u/c7}ާ=m?}n9 Ynh=YNOLΑu&W?ErgލlJ޻ϕwrr/z T vل_04x:ŋ:KuΚkggk30KN \*+fSyZ}ݽ;Q%ّ333hgl0[gY=pfq|@>ՑzLBEɝW z$YC_Y: iyUC^F/Tx/3{xu<k<NΌrnB96+^\~{ ;M^#*ow/ԁ8W/W};8z%;Ko3{?Pk'ƙw~y z;{,] fC}-Fg~wV|zCzb}cӯyܜW̛n.O{ޜ_}zq~~W z?cӤgެ}ٳ=Oї埿?ks7dL%p|դyÍYse+(LٛV; u<[wۼUԻnx?; iZ;๥%:XXNq:~ʎ#ƱN8a^]-(<9I's$CkmM"zh9ߚKyσ26ML׼'<7 Nm2[OܒpΖu%Q_+y[x KKQF᷎M3vJcż`8.{nEr7zћVsz9;^yV+y?8Ϙdyxλݿ9ojջ܈{*7<>i Tlz aA> ݬG>K>}ݿo󞸻+ȝ G5,3[Toz 쑱*UNߕNCw;9h~wk_]\{g˘?qnϼ'ypJ` GvcR< ;Ÿ[p㹟>>j'^kYݭi? S~tӔmYrS'HդLntq}v[wlzN֦9u}gVS&{H["+_/yyYѝ2ia_|-ݱq>m#c3|X955<g~R1ޚ&@KSz& YÞo";&*|_!ݾCPZ" '.yk쟶?5īM*׶M.]3Ξao~y;c/eZޣFG[/}SN]_'?}"7u|Yֿf-4MKGۜ8w ջɟtK3?UYFFnn#W|ï9oz<^YXp+zAc~큱"m6ơi ؝޳m3fgw' +].?%E~hKFO) ȯ k|U:ߙq=?#AX)!g/xClɖ,% %8򊷎;V,GmJޭ]@8m#szZ.|_{}*ƿ2*~OO"EϏ(NC+<{mi.g 'أse+V^ qyvw#5/h\ZSqSuK'O^yZ/P<צ:vkh8oW?mS㍁g띦mIG߫32em҅l[L.Do5M;z?cF{Ẓ#pzˑ+mi;g;21 @۞7PWxxou]}ПE38؇m}ퟭ]Ϙ4;[|19%λwϹq1S[ K=mszySW[Z:r`ˑƶ Ń+`l3_=pV6xh}xz nleM/់cygqi|q_u?ƿ*.$rE7:nV^վx#W dfOAxQۧ#[qrO'?}_+nCڟKeO~|@.boO"jǃOֹ LG2X^}L3>ևyiuymm^|q4yx_q_oageM yR[Yx;fSSzOө|]*on;g:EcU>ȗCt5|4&V[d}i(;Z::[};[.k-Q.X]lQS#6yFU==t/fz?eɑ% <п7>xS?j&nZ3(5=Ї2:;P? ]i,vsQ izstoCt=_F@rQ#Ro;S=$F|)C{qh ڳ'w-BbB[Ԟt;9Cssj[;M;c_N 1)}O?s/L/Ɏ/!Cvk.\ g??7r7gp]W~z]c/jb9_ڣ{b7FmOY շd}W*"o!Wjw+~D5\HX~ٙ_9 }3+֟5[[t.o=ʟ?}zW.[}@\{{'hqGjاܹƪg4z˓{7Nߡ;=<:Ω?9D~,]o݉s,yJ=k ,ҠY"ln[Nb_~-zK~GQS:qow[ D!ⷐz(l}M wj|F/}C59Cy;Ffc#ggj'S?lfNC͔ 6%"+:K + =jq&G7r^R{8oO&l^&t^.}ڌ_O-˽G*g3 ~]eK# ;5kNl4w>=xf/NZ^'xi{C_yCkk7"ŠDZ+Oyܟ=?U fDr.zm-əTtz܏ksߚ?P 3,z7vck /ڞz53:`?6!ǮM;c38o]<([?r|zj˭%ebkztN[,t3GيqP'x:#LMf{O{[_9E#O}1DZ;C$uni+w;U?zc{f(G-K>{ݿ&o>Gig78|Оz3$|oȭ9lT]b\ȋә|՞\wtl|.<|5՞<~^wҸ &o7{s@ulh򔅿v'\OvT}Ym}uvמU6U|+⃑7_|=i=׆Oo G~ Q{)ׅ߳^3jgy| 92u%g/1ӼGޯ|n'؝z$}O`okjO8wztY [W5{M?jO8gtf/~IgAzrO=έ7P|RkWMUEL][;Sϰvx_ o?ȳ:m^B'tvk}NE|B'+},%[G?[|eʧz`\wF z_օ}JS%^ 7ߠ7}*P{ȖSơjjX=|buWGxa+9,\W|DKߑ:_?C?OS~EK>O[/+I%?( O{"ѻ #}nGR[oyٕl^fu OWz~ӑC#O p\ yލ팎Έ5 W:0{p%~z$K2`lF.|h/c` Sy&oĂɭ7zǡ_q_!_g=rG8ŮKN/[a%ۚɥg6^ <p^}:SuߙXI5]6fMCg 9mein?3avSr =޷&[mM-sɦO 0>_;r1xL ÁOrĎ? !pm>㍉'y3=?79w9|>|MoՕ3m?:vCkf|OMӦdkN 1~pn@owUkߺU"=bQw{s,#WI{rݯsw=7*u=_98} _|\z@ b?49FrGOb~!B,0z gOj9y=CkAtؙMǯF_g{/KB} J.s^%W;\78:][=/{}x= l{{|]ȭS qt<rkCMO?t ^}y;l | 8U0v$;ϠRqyGO<7Tы?:Or!GzU뽋>C6v8'Ez\QܧpčviZI>nܸ[?ŮGѿ% ].{G>;WY#zőm,r5m/'+:?yȇyC3/?q mӋN_}}C=.Lyw3+ȿ<8O#=/9xY|l'?Yy}ou'3>Ԅ{y.&QY!oIF:X~x#qg~VOj0GݏkvSNgP^AGgx;͹xIVMuG^]:%tDO?ż?{< >+a;򊟉ag3fc.D7?bҙp*r;=i6\rkgGi zDZ66>ᣅ|p3pTrB7_$?;N$?^)|rw|9;O4G/;|g o~_{O 9Doz3< \ן~P߶~PƯ|M.g-zAB=ݛ8?/nʛ3?~»'x/| xwNހ?N;~l@şuK;K"zz g6=o7OS">.G]ӻ;".O|g~Ikʡ:X=p]29[{?vTZ= Of>oo^贳~Ox|8ɟ'q?+'z[/qU%u/#mffzR]W8|h/~)ܭ'noѳ>_?F/7@0 ;&ؙzrw[R>ȓj?Um;wm=gkbn|':G^gd'w |v OЉysUˊgw#EGg} dwwj?no~i=g=>W<؋?CnNMwOx 7x⿧=o|毾O|w?Xc~Ϻ{=Q?{|z?׽G}mWћtl#hؑ>|^[ h<5 [_9®F:eބoJČW$l:}̖ ם3*;釸mhH9y*q o?tp?7QfG[ogĿ-n/Uflmj {~ߑm{זm4le1[GЇ܇M2k1>|H/qoI7Lh{[iX?qFN03Z9:+[wx׻#|ۊy䞭e<}ݒƖuZϬϖ[NT\o$eӁ{޼WP%,Xgvp3~hFyJP7nv2 ޹F̖zhqi-`eʌ{*l6.k3=nY(3&'5'Le|(wTi|{[r?#WrVrc"q|깚6:s3'ܸenx?IGq{f n5c߀=Y~6zU|*%_&m_ IcO@ te 3>~q[y.\@/ZolVEW;27?{GM}ʊFƹ'bն9[t˕ځdP-uƼOå3r*'+Wz>7;>K?3.nɅ MvMA3D3r=zx7r޵s6 _O$yn =gwcG{uIH' +&~g%g= l 4KD\Ďf/ާ[71yގWfT=UfnH޿[/ﵷ}qoوobgHegnGQӎPm~Nn\ iI8x}ME?zH^[ٚ=3#_%n(^DjvWo_9l*Yz෎߭ew n=Eޅ~}h;v/| h_wK{5}{kgt*.cM7mWz倁#~c<|_пsn ϻu/f}֔я~B:wƙO ZF)vPOu+Jȩ@Ꮥ;+ӗf'||IϑXX۰i XGz[F:+[WOܨv>XإS~:`]4?;Wop?/ ^į#}N'9}wl-ww,0F͓. ?Wbw̡8O[̐y"=WGt *~Ε}o~-r9x)~-p'x>;A`y^Hkq<|vxv =Y6Jxs}gl\+/FߋW-&o'.qڱ|-S6etSto&׏}P;;Ewtǟ*.1[W>8ySvQ["'$N7vIvEQqiZz`gm<؂|Ryi~A~ėCO8ߎ--A~s}eINv-ru %ڋ'G t|cVާҏSwf\W(qByqzEav 6vb^\"J;kgr#W u/!./f(r}{ioduc\vSevnrbn=vU'>_@.XWv%tZ78#z~9obC DvGo. x5;zFwA|o|el'E_>tV78tK;{ۭk:!'C )珷nq~_j_tLL~^iqN;[m~A|z~GO'J>=4 ./(S}vW=˧7?x%xo9[ҒWA wkk&h@ypum=4qtp"G7=y|om׮3_l~[n5QDnx7~+C絣۞J_r [~n=G}w'ocPlOސ_|yǡDG' ?q j['~ݱxەoM="=Ğ$g4yヘKm>A=E_8路mAੇ'C~9S{?A?:;Q81Tm=+z7&'q%w)s~+q;qr<yټpx'[Or}W;HCDz~|qq@ C"? 7z7rC'uh8hǥ gZ㉳m=8z#Oܛ|;~83݆.ᯇO =WK»TzS#yo|n9P`B}yq}׶ȋm^ gz~"G5[G)>>}뜣*AKD;/k>6n/NECG Om[௩>ZP\}DoE vh.~"9u_IC?-==!^ƝKWdOO?kFo7:Tg~,R\ˌ]|8Y`W '?u;fvASNS{n:}DncƅG/F~'-.|t)_~r0[}H6o6?B{S=xq(A^[ ]6'x?K]{r|GizZ\?wǻ;R[dmgRNU}~ǭk=-y;xnژ&~cOZo&O [[n<<)}2W_ComGG=>v$6O/Om[u9co6o<ϫL ϭ?9mƾ>.q*>߷#t_]<||h:;ުPq<v>f,Dz~go6~ [GbǴŞtnW/2'wq7:Owօlzt^Sԁ7@57_ݱykj>ߡTO"t2?㇎~w"Ŀar=Qq`WO\_;P^D\D}K1glk?q ;kx-Ş~j}psb3Ňw<7{XK7k4}σG@ݬş>i'iߝyUoo\8<1[LgPǫΚ)Kl[|]%}s(~S='wv^@79}O]k M:ǻzthƎB/Au" D?ۈ_W:h<@]fxǖa/VyP#Zҗ7rsUNߝ0nϊ>:`TϜK\=~:k#Oz(S?co8swx~?x3W&z1ޛw}n^ ycG*eA?ύ}I#Il8csd]{3>?+g_~Stc'#kfΛЍxը\`Nl>z4}`=z y59wf׋u9=B8or`}mft 8]>/ [KW|l~oZy<>?؁cv4 8G|K.|k>XO/X=T<z>nO5~ ye?mOzk>ׇ>CҰ~W?_z||#*g>Wp}Ƥ?нƤK#mN錶DkȬjw6ZS[[C65ҭAt,375 rcfo%)sЎX@cEbj|xI2deYUƬV;cرtjfVYk2j'tX^'3D[{SZ#8=zY!mMd{g: s2VϬݲޭvt֒wZB^Y5HX3Nff.~Ykvtw̦;|(:3g4pmmr)rx_o{,]"j\)8r7J[QxjW~gEΒznz;V-f>_B><3I X\l9 G^ ^nU5Q|Lg{=&3#~z/;VK| gΆ;̜g7n}o=_'bbsmo\+;4٬3oφFtO 1trofe{~?=@z';%>^[~=_-԰~q14-XlS_ެ |Ek=23;sL̇xUN@ ^S̈n.Š~;䚂Df=-D/r?.'gkjMvNt~+j̆ᷩ1wZuBWeV=m>} |Ը,!vL u{':+<|,/w.{z̞gv3G 33hg6CgZCY謵w#o =lEjVS[|rf+Xrk,{;ڷz13pv\nLy@߸Y/]^{OLVps9cL0Kt߽ȭ6[kfFw[c6r^775wnzBn;;aDq~7L]ܴ#rbқc=w74ϞR𿳲kN= ޷os];(vG0;DOmc>  =oά g{Y4%>S9;k_[kVg.osL[~V-s}y!y$ìjԾlj=kXBW۳`ϊ)>缑kܿkAC'Gr؃Uiy-4>jT=IEJ"dtrRJ BE100lql@6igdZ\/us^TKKz~ԜEwwjq3eg8f?]89\c5jWgTF޴;v6kkUxϑ/GMZoӶ1r~दP?kWYf9Ogm>?ΪޞY`&?~xx45ܨ/~<7?7^LYЩ3!bwvJ>~6 s^'A;[(ueſrY{W4z}sy;3bڝ]!}rkΈzGLnWGROߴ>(ߓ7vq=[+5?5vJX?Ύs. ڷnWE]^!lj+~; gN|98eo?MBn/f^WFq}g;畛 u}6dE=!z紒{3&N=Eߍ[[\P·\p^q`^'g&|l3UW~xY\һqt_@^ܬBhu)fF^/pdYq5.;N9cvþ.@n8򃙶92`znGL,<:;q32ïyCy.tk]į GΡ?}E|{⥟~}8|ozB9}a=>cćk3=˝aѳG[Og3- /姧.}J8N]Fg~yϭ~WȓfFNg.N||>7S[^~֓E=.h<:Ϗr>!:K_N#z~L糏]03nO|}`^N>_m "|cq/vՇ'<, uS788u^xcٲUcxu4~`f=_q&Ϸ 1~`qYq3;>;?H=8^؃[S{(x7$/OcBv:\!?nF]/}o*g΀cg@?~4޵K _7&O{kw6 {b!$.x +yuڷgƋL>6~7A9xJ ݺ3{~v>}`?6?-?g,Nx{o, v ?_3:"w]n }[G&Z?z} D}y4/(z:>jg?g:s[UNϔ$C7w u3붛7j߾}åuy٧ҧR+$ot.xP7 }g؆^u[39io?UO/z .ۭܟ:3[)7}P;"x.uo_?L(~ߺϤy8C/ 捲>'-&ǫWY}\$fK's[>&}.Ѿ7_b^H=rcVxpOn]ēupr^y~|'N0~\q*GuFVˏ͓N|3IC'Wl>^g;GF3_s?γuݵ3#٠־3co>+qw!z}|wYsտfKNt&ψgM3JfWK~ [K_j]v<:>sk<{k 3>/:0c<>7.AtJ:\w> 桲_[$nY,l}3s۟luf}/t;Jz̍G}COW|$zD~?}&/y׋Vr{o}gDyL?>|> j?X6'` %r%Ji1~|$y ox{7/@OV8{-IyvM׮;i {<y?~7ѳR<[HG^ד_~cx{>tz}p^U:3߾Ʌ9Euv7+ݠ'xcz>m\>\\Yr<ysz}`OB'^7~j홎g_}w~ڏό u+Ooƥq3`_?s>/?ؗ>vu_֭,E3f>Lx^?7qǩ:Or؁3Wu {Lܝ?/@bg$8@?zԱ|>o^ClZk wg\.|Oyt<OA?#O+.}J}?:N5rG¿_ɦVf;SPY0^QZ8flms])~c; 73ē+؞lSZ;6Z01h 6m>yw ߙR>?| P`zvn3K~Jns_:YQ.1k{R_d [TYA![FNk~7dbu1Cbj;+zW>{sΨj,9ߟYG>,tszbV'ՠVKN"~Ĥ0?s.7L6h9HٔM/o%֚ )K,O51ەs 3C|k?}n{O׍W>kWn\:}gt9t.\Bc 3Ӏ@NdgT/ɑJWCn /53[nkAEskDZקzP1KLQ-{gCUɽ7)7ӄ﷧ x'X1akV>>GoM`ꋋ9Sk1^5I,՚fp=k<]53;y^b$?j?Ր*3j溷c(crO"ޘwpsrT ةgD7f4't'Vv?{Rjx9)󗧶=jj9=KewLlpU3d_knw]֭! [B/ pGjG~+\.A^?!A7;?j,,W͟W2U7'E~GH}&> kD_(wd:K(rYy'c"#Kf3a+nzM~_9]{',]+ /7V;K rB;g|ͯyM8gpߙB'_}?aj>[:6N>az^h~ kKrghl,nu05KY;w#{q&|vFgFߐ7x^ӱFxg.3qi U?)\zeF55t??@}jz5z8x󰳶g |Lg- m\𠇡G5 zFfבw΁s5Gߞnjst=ߞ36$ﻎ~]<6jͶSr_>:?{_ 'cfqz:8' 쨝j\ؚP=~6tV\E^uΎ}gq\`q.ϗk0aBJ_M|5[~tx,qm5%ϔwWZlY=jgmvn=Z|M_ PF^7O?=v-y;?3AΟ?ŧfyOO^]88Lg}3/50?3bL.PߓE_߭3w%y'YOf&ggw9ُ>O_o⦇}rn>gVy}q>^$*7BO8cmNBw8Njm/ubg3<=9<ƵUg_cC/+܌]Ά!r~~9~~CQ{^YQ?;5>=5>$KcoBx=_6A}SwT{ED^_{ov%?Ѓ;{~}o}߭f5~7 Oέ׳' ;ugZ'V?`n!o{>i<8|u./ .f]n3/[oeVepƯ}E2<ŅFԾC.|d[~D_-C߇3:ؼ1oԯN\^w?~W[>'OmENGo4=ў87OS3v@e{u+>׸??Uln{o8Δl>fgu6nfuV_pׯco=MvqKkߓSqع͏ͬ.=7߾v`7ƃMn^1;k"{b~p#։7wzFʞ: SMNB쇩|2[Lr z@xro`̀3y OPt>:>x̶GSOhQMt/^S@y|N_x=9Ί&vʍN:B7oVh G޾=^{dugD4?6ۈˉO~kcN]q=Zğ ̮i]gȟApRO}~q+%ԯl}sFI͎C7~}1?? W ;W;A"ߙ|fNP78vQϏ/yj:g΍W>ޖn\'~G;~ٝ| zW'@_#'rWr`g!>hwfGq]7"c_Tǭ[N^nl[7dЫǁ?-Os!u '_ ~_;Ͼѣ΄mC<<`O>i䩋}b^9'}ϾGvXW a;C vo=~+oŇwy6pY["Θ&8P9 =Wz櫒G9u1~cz}E|l~pv8z~UN|ΊOG7 W#ΌW? ÷q/^5txOo^s~\<\wʼnh?P.[\oyP뇇<˛: ;q삭;b邜o%v3ᆾA4񞙵:3ʼn&Nxg4v|zcȕW t.Ɵ[_-izo+=m|}f2מ)^0+~Νp^qBָQ-OԹ{kÝ]7x}M쳮~Ǐ\^;mn>_zr=Gpp{"iqY;@{@7N9t!o Lk}\3obJg1ԥMCxi>fG_=?-V~Ym?Aۭ]^VN[;3_'t胬̇Ǯz~_gV7:2y|QWOyY`v 52qrF<= wN9 ՝7O\y|_1eAQ=kv?۬G^գYoy6+땷oo{_/yowS|wϽwk/~}DËo}o~E}-ʷ;R'=o;*cgnk(cM2>biq"e)m##޸7ԖEB^!-{n քI#οdFmwӺx KXc:Va}mG~GtO xI"|$ <^W^U3 yz^ ~ gn.㵏>?>gLBηxv#2>}C}'H'Lpaf/tDzZi\K NŒ+h#o<)ew\rU:緳4^t7ƻxY׎]ȷ=8;y(>Nanoו[m )GYɖe|D^ n9aqC~| p}^7nxMÁyx+M%z֔#FWe-.',&S{PyK3!_ugg]w/kK?s>m=Gk3 Ldː9:>1aA1eeoxY!6/G~yZ˴ϥ;~͖?ӔNh–W_\xw60gWxid7m338:_a”?=rV~ph,^7;8-#]K :/cVq"/>=\X~xΧ}k}<崫^GvG9j}qH_0=?;ƒ<>*Ns,FqbgWi\FO58e8#=U{oGÊ_7r}6|9FWIO_({gMnYf\.yش{bW;U3UN\OrƾO p/Nw\O~F_4~@[lV2qr5m҈^쾉7r;B6xw>̉?1vFM|K2;O8#~q ?ʯw+NhE.;E[9>).NB^^y;/X>Ovyx_cWrM4K*rvgv|!X9GcG>S~}_+>;q޵0cn9H+Ԏ 8oiO\|cTe~ޗcsp#>}sv_?~Q>:> =+B q]?D[s~7߯Q诎sL~j}H‹AwjV6C~gGqcc\Oכ<ô"x#9 {$ư>ɯ1m#.k㢑|;8M;kcs?|/9z=)i.^{ ?wϹ}Dk]1)_1pmPT0 ߡS>(_!xU_<$ֿA~njl>5~ˎ>:Ҏf{Г`zLY5=h1{$=>}Gc=qmx7 k/uDw'5E>g7n qg^7<Mx)^/\c[^i}{_6e?sSO;/ ^k?rN[DoɟkśV'OXf|Ɓ?gOrfEd";}>t>?WX(.OA;4Ǡ#t㳎qk@?7ķƥk-n'nE gN u|:xo8s|ls6_~/~qXtv󡟍G3x[*7v ;tKp_ܸ9V&~軞IP;W<+=ոH\\Dzky܃u%>'>qZ3C {_w:P^gתrֽy}ry/WNzG _3v"PSY#'!WO>ǎ;u=]nWąk~~q|X7K_bY~]g}-x揽'ߧ'&S^CE.M^ޟ|NM?Q}E~…\gqP9p ~|g}_D=^_^]fo,^߭ɯƳ$!/?l<>>Z~_~оo~™=o}/^\1m>k 6aW\>>bo2Z~G>n uf*x+tk?Wy8Y,_y<>.Oy~_#6_mx풭w;/=+xe_ؑ7]T?pW,>2cg;n7֞;e|4vá~X\Ϟ W9x$>{t[oQ ÿp%k}8Fu7nv|󸯮7x|9_b7|f3֝Gpk>h7vQ^X.o:Z}~5G]O㕃"M6?7E_qEq{lmzjC}|v[}>«kR}o ~8Ñ[7g_ 6~O_섫Dyx>G?r$~/:WWϬ\{.|?^+r/S =6?1&n ơx|soۇ0|6 E=?/u4/#\c/ ?4p[8x}1vf1V1IMXεG7'yԠQfC$@FmeC8_e97 {VܚΠ*bk=fLuĀa>ky:28eVU.fk9<>G>ZUɽb!9|mΔ ۃS҃nV޾7؎Q ? 'C[뻵p{}ObE&7Y~r\~TxDkb'n:9}j]{Bl:FM2gfT+Hks$~?qlL:n8-\GYx-N[wM5炿VE_59=ϟ;}?_j;>>LŬlUm_p޿|ox{f ۗ;cdtvۜ: c6N]bNo7$+8m ;T+|6$G҇쫘oLrQljRǛ<4=9utCWW_O'+/1Ŗ{pVC޲EE>W6r<%0:GE zK R f{j؉_O|n헇Gc3k$?yE/vz Y ߠ{}Ζώ\чa'ؓ!i-3T~/%8ck X=K;#8ƎZSX0>/ˑ->wLd}c:C}(=ɓbꑽÇuMb򌜔D[<=+rf{(Dd?_=?[?Fmgn|+^f?}"j '7Z=>=~[z__q )ZAZNNnN*_Mnyk^ ^8񵶃|{^o>+ioC?>+<{sAr}yܶ콬AB}}EzlPCr Kh$[ye}uo/ExCxZ=<[Cm6Tf;F-=8˧:[%ްz㷵.CEx?FG|vgF;V.Y7|/SNVCWgX_$3FSQAK~fwq 0dWN;>h| +r[ŷ@O8!~YIo~o[|oտg ;1x#W\7|RYn[-D^Zq>抗y6`k݂33p1~fׁkY]j1][ñ߱g9^y8NAb/%m#y,Nѓ̮'ů.^l-{&J1:Е}E{czg`ů+[Ѧxm4k۷\k#kF}f@ ݊Ǔ[goG'᧍W!ju7~eoxe_n6ooe9͏>N4+|nv^١9t/ZeW'=co ?xi<9\.FqWf人N}aY\w.<>BW8ٟjqoz\}_}B/|3 O?D+>zqBۏzz7xs/!_ ><>~;2r',jg?ş ى^ycl{;5G<~G8!|.ǷwE>'5;\6~HY%osvƛ ^ ޵Y=˷nffegЫz6/NΡwg\ܯ})38S8no5?\h#wxMܶ^+˩w"C~2}ϮDU߇Z>gl?~ؼ'xzj /߃WWs_~d~8Glk ̐o8|BW+q}ykx?G;qv~\7G?oC߃C[֙CvށRp}8A _-?->O!f?S"~cGv[}O+nov?c?\g%q7&Qyof3xςSg\-%NϯǷ~⛵?28罿v'{}N<35y{߁M_ _[O#Wp9oԎ_oeWϾ7ÑmMmq?9/|/n7 }FΖ ._(~`ek^*?xf-Ngj -^z^ow=ӏ>/\Cj"R;^K䚊  ?|wkt;\ :x}9Z/oo/>pd)fzrՆ=j'>Qco7_f/<{X᳟U|{:ؚ^;+^j*F>:ocjfr=vu.;rf^aqןvx/{Y1t?)^imgikNcNSbxzᅯ*c /~ڡ3Jl^E; =xSV>ךA5#詝q@NO&x aDqpcً_{~W/g\,LNWr쫩68= '?}^b …exzkk"7CZxp;g=!Tzjg遈>G5o >'>G*o1S?ƿw7Eg\=7p,v3xX0#Ԯd?ݺUy^=js_N kį\eGdYjE t,Y׍j៍Ꟊ}q|^̎c7|.okPC~P n@߶f~7~C裕wټ>f҆9vg_勬h{?.pje,煫+=RSjwik8;O$lքEߑ >otz:ݘ{ۛ^jH 58Eqx^ pzWgk+|Rhzy*\dwZs13Y`?­5Em%2ynp(N5m> G|ǎ,!Oco }VCq fAk;/ዿ_Kbw|uA7*# .~xNkWѡzn0bE~,&<6oZg/6]Loӛ>G7z=3˭=s׹=jxK:yZ +׵5jmrx/N o=rpdl1~#At/=]/xWz=ߊZcgvFzj}J-9~ȈCܯ` ^5ˮۺ%w]΋Ԛ֏knp;y kg/lθx*^/cW>kde[ўyDwtVN]`4+JΠ_Y/?:-!jFo$<ˍWlLåoM>g{QZ3<i;C|<^'3euR߸xᯋm2*y\w컸k"gw6X1} Z!{Couهͯ\niG''r}u);UBEoPƕP{p\xyFXm*GꅿWs>|Q1|Ko5o'dUaE8Z>׏8 /8ֿͯQ,^Ӌ/'aݲk?!ء|bwԿЧ`x|9\E.:5 }X;m}a<xm^oB7z?.F^4x?ޗL}x7?a!xo4<֏=;_c7u4֝uoYwUNDO{ucw|\]Lδ.cr3#Wz/~k Svs 8pre'hW8";n8y9ŋW ~w+϶mK_Uu>˛:_x5?csV|ur>P tGy|%?y;ۼs/uk/\=GWyg/ _Cb?7/?-^/pk>9|F^u؇xiqg/>F|5 _ #?>쒱ģȽ.Vw#__gg4h&M1y8Q/=|ܕ>30ru+ywe| >?3sˇ;~tB'\;buW{YCP7v {~$ֵ'Vۺr^gkg{Q,-w7Ƚ[qGu}pgG{<{q^w?9?^gUEx6L?3b4_=|诩WGW3|wd;c8r2k3Yo}w\,q>tW0}a[&~ ^;W_ȷ3&ٴdz\.Vg$qyϼ.|pk~[v7_Aqڛ?u᧕œ?'syX?29v~9V88Me73Tُ3.^䟺\v hq%| ^7}]o63+'6^t qir^.|'bŹ5Hro /ܞ-kxv 99ps>8c7\+9d9}Fdqg}[?/>]os/>37_'^3 +x;YϿ][rowO|;zw1vū'gzq{_>^F`z2]C&_X_c_l߈_WϽg,Gƪmڒno|#ët}kvcЅ5S: 6cG+]N{}xɓ.~!|ZG>AW~tzAOBVXcķ;iW倷 ]x1c"GʝGuau4|3Ō)."G߿3s+g9ȉ^GVt>_QԷ;fyQVyAt8CgُwMP!t7.㘼qx[zmAz@'m_MnSK9E~[wܖrmozoWcJsv޴8먼zd쀇tA_|F_sZ16GY͘_r砋E~oc'"פ0i:>#e4>-$76=G݄^v9מ,K'p7l'Ƴl~=s|;g9ܵvpp^΄Wo]3Hs+{㮓:fgeBDҀʉ>j%oE?93vy=m袟ڙb틬,N^/._9!ǟQ!]fbk]YrJKN?V?sOwY;f<7 .ߢ'ɹ.;/Ow=KбSyۖa>t6-I:n!iimG[B<ٛ胟J~ᯫqGȉ+'|q7ٷ!ILxحG&x*r>rAZ 7or݌0e0~Ʀ;W+*/":S:%zuBwKw_sGC]Ty-t̏Aul<~EY}NFB GZuYۖ٫_"~xO9]ѱ'WuYrgt'/z(]%||c͢[.9mC1qڠgOw ~= />~}aO(k߶+T}>㊝ȹ/qc8бxbDNh'Am z|N^ n\)!vG<&c{Ԯ7v׎|҅8;}<.}?}<Ɵ#Dz@w vaWcWkۢ׹:ӦmH{T{;e[W++=D!O}_BOG:1Q|Q^n<=X/:ԭ˩}}bЍ7>5ٸ=zR>ߖg~دPqʉyl#:Xo%S>yOuOMf48?vo>k5ȾXONd0[T4OϊK }'y:*>~r\@$LAs7u8 Qt!2z~W9_yΟ#7/.'$/Zc#7v?@T5.\;ySקok#sC"= 7~xaE`Rj邜|EK?o:60z+M}~ȇޞ[/Wy~#'>t:~?? {cBcWGD>w~@ծ v}Ҫ?ߵtQi'<&s0Bsu#/6^&?l_c(DŽN4Vɾ#إSJ#?{kS:Zu;Cc~O&~{>W?G^[c>V4|gN!|}CBB)xzx؁IgC?ӎe;su|A]vډÎK'ݏz U~A }:[G\h__$x؟S<=8FGx_8n~fla [q^cQnmaKL}j~nlLLl{ [01>ckw]3֘bnbSט<:]Ej]eR:>׷r<}N̔LǙ}U@ {e^}̩XkIL-ޕ.=ӻxesk6^'dz1/AlrG־W,%uؘ#6|tÇGؐGl2Ke颳ܲ5O (daZe#e2{'|n`> P̵EMʉ.ѧ,:elmb7FLL5F}_;^Y7*'氽6Keg+;=]\Tv?$v''1V; EYmb=KKwC?l.vCvE!(D X::yrGGf85 ^؉{\9K#gM- qaWX;uz?cOÇ>?ܭJo\P1V^cֶ\DxT~7ڜwkkϱ*7.!-]l~u#]Ԁ>H/.ȇ]9A+?aײ?9<1}:zX%6ژC/tQ91~i5lO*2:j"J7oT_#:A7;tڮ/jtzāM/ rBOܠGxؓ@st~ .r~}T޲>:( j+cwc)VNLtAxH /:K|~ %xʓzݨSCFOO-fbs׭GeaBމTz޹WD|OɁ+]_?3=1)X;uj1Zv:n̚g3C<3Al= 7 '[k`ℵ 6y/e?_͓̌C_~ߋ>!L>hkckm 8''\a zJ=Ξmky/OWF#_؃].nrC}}&QD:IlK\R3~5[A7y.:-t^g5EyW>yS^𑟺lϼ7:Ikԅ^شI ?G|c践ZSS#v.z`l-i{ۣޑ' q0~!uNgq =# !++).Qܝ#˺q$Owؼ?]qͣF.}7+#~T{tW/'H^9^5~iMd>7Oej}=|Yszx*~ t>]8Po'E5G\}֭׫W>jz΢uol^j7!wwo^ŭOCE[LJ.? ȮؙՑMܯ32;Fp:lz\#GLbz[QoB|R=>:cpfU~m]Zaݗzڙbݩ@up$îw3 Wt}ώSOvujouHGOo~m u Uǒ'[=kB?#β3|/!lBp.myTxzĿ7N>߱5`ʃʾ}+uz@}ܞ\>C>BKK<|~{u&eo^`3L=_׍ D?NGc*Pl/KVyO=&~_YZ:O~ŕ:/z ݊ʣ_q#7(_:C0{8ԓ\J&ymQ<'_;K|]ȷl׫GUI)wvQ'l"QCG73ٟkǏ=qOЋ}!7ɏƿǞ3B_Ů~#./쾭 o'N~+?hz}p;áE Zb@.=#/;矆ShBnSr}}v?'pL=o 58Rodw;C"n1tȳ>ΠO!B]O}3rwխc f/_u M+/x#Ľ>}zuۗ= rёK/?: ;w~'|izxY)MtƷk|@cj[s:~sīn G^D<\2'uόz.+'!8| 'Ǔ&>g^3;usܙk5.ȋɶX3ȋf=`귶?~'hU^Wȗ,E#23v{ul֍^kmZM>73L??cw鑭!iw//'7G2m=ʗE_gFDfEq:^x[_ kgEHWLj{áE=A>0u;?|By\~.$.|w\ __ʝe͗?3yg=).N]}S=y9+}'S|fI/_+^r|zg;Ckc?KnlkčZOo{r'-z=v79z[&ND?7o8uEXY[ⓛ'SoE3`emokg=`=YkY"t[.•ב#Kg䄕\Bnf,>|'ϫqЏ19!OcY/%n#蛭,]$/j:Dn,?z͓{C'o㐝8~f9Ĺw+zߞc$IlxnɳS?J >W=rgȵ~/عW<Z:G.8^ sz3pVү'vcy|;NG%fw@'{z˲oٗdz}|gY'1_ G0bg'쬧|A93V7'{=c mNcOMysk b@s|؉\kmyv}˭!C;9;[2cfgllONf}Q\{Jnt19־ MɉtINLmXZjv_rfɵ6y%؜NZ㘵ʋ-9MssZi~Y ZitRú>oOr⍵y.0[hzJjW^>2 ]Օ]kc_FʯI-q9"&9K}:7ZR'7>tf:[C\|j[?:$K/5@}ޑV5 r<srGl{jb邼ζ(]Z+;~YVNQ;gj:;R|ߛ烗|Xbb|WnlYl>7}p~c/>Nc'egj͹&kW.9#wl*Ԧ}rͽ^Y||O=׶?Bs65,X}=GMȥꕱK=t1 p^bbQ| mDn99vEbr-R{o-R{4tFai11Z}sXgCGbV8'e?n\bo?~{jrc쀍_oXI{pRU^_qыlon6wҕ'qB, tȾ!К z8bz;.ట'6\~E_WSsrE}*O\;쉵/W|tF]ȱlϷ;/ko>57.f?wZCߏZx*]}5t<Uax#׮vܱX#7$7zMſ!/1bj.z/Oo<흋ވ>#O:=5j^`krE뇬^A:◸I߰nO"GMt15[Cu譜p3W{cs«˵ifG{}=\pl]=ƿ#t*!ԙo:]j{o7<2“9`zjGNjg!g7w4op|@'ko/.-^_W{`u>]/Y^$]>wj62~bʇRs:zR[^v5$ agHcɃ}q a vfmbGx?\}Tzkd<Ԥ~hozX ~%/?:vSlkʿO)D~]< ]X7c<>]'濮+{6^vCȫoLˇ̫|nA@3ȷOk{[|-W*bv_Ov}|:zU}S3|gۣ;zA^u,UO׃5S;=(c/:o.{zP W vDclfe 7?lݴ.uM= 9S|pg֎ه}՛Ci֒}˼<+`ZGȳȏ kzxDx`wcٙb{xdW>7_qμ!?>߮?=zhZ?v9׭G5ģ&~uSfƲo^'g{{=#O.['[-c(N^տ};wV!ɫѨy_й}Wf'KzT>蓬Ckg}n1ͦKά\5LOq?ȥڭf%nهuw6)k[pzYXPcv%ŭng?߮7KOgMtSq 9삩l/z?y>3-jGM(x:Տ;o|:x3Wrvo}z(o^kC+[g4#=2t+V%r~g7/.:k}v㪜#qx:/t.c{[c[qO/vv_ gB^?M|?vn^3qA/:^j;IF.l)KЙKo쾛=WFS7ظ[{]qsz];^V\űS?xB ,; ȋ[#ō'K/w$nʎ/~6x'/%[Sg0|fg/^ ʗGiy~k盇}vO'=p;F?}+w>#G(;]_ ug:Hݑ8`q׏~g_>^Mסz}Y|E-"wE<#G?]^<3ٝSݸ[Pyi/kP+įo7WxL ^xkMLxr!^9;@<+NT<8Ut^_{]ٝ]L|yIۉW +SÞ#7zcOv6[ ;YgsVȯs{mf_;,]nrJo^=ߙn'߶OL"yU4>yԬGЃك";]Ix]Ot>'͋Lyg']Cn?=rCw\,g*dm}PA\mv_ ?zv|SWb&KyUr (ض>2z1oe.W *cZ=Dݯ5n#s7:X#s 7\ȹŻi?m}$?ʔأcmY!]1_És ~}}V ȃ'⼸~7 >f,ge~HiO0>~޲Zn1e_C}nOy WN' ~Oσ?;a6LybgtْF1uƌ9Pn?y\=wo[qip%}u #}&U\~3q~t:HLs7u|s}>}~Ѽ8}Ӿ:v?*{fEGp &mڎ){K/yvC!z\tk: _-_{7|OWvё벏 nݧ)o}|w|t}^?rWg?sꍡ\ǁ3DQd.^k{a j̏=vA`<>'&P+Qy0~u>цyv'?yvђFvWחQig8p&WMq󢣕?[..L.w\TrA`9vO#\=(r>VЛץ3g 9Οryz {ę[o="g"׎—(r`ӢV8O^3=om݌{n'}M._/Gۦݶg%s#ȤCQX;^`N$mq~^y Ov0ض)#7>,TK|Kےkڻiv'{:1xx2Mw*:#|^AΧ=5=)Ensȏ{ Q;xҡ܄m|>tAzW~ڿp>' i}$KT~'vET.^Eo׵q1t?>n{{V,r}G͎$^,8~c8l}Y<pO|o1s;ƶE7]۸rqw#c~/rs]?pxg2=|/%_sy-sExP⎥[:h_?Yšj7G>or~Aa=ԸV!Ig55}$WowOYGPep|-LOٿt㋡ezk?D~׶_]:r@.9y*/^|W~Tγ5{_p&Y]>~-ߞɄoIrގۄ Loze'a!R-r~j9Ͽr;qVt8oߕˍSO<<7i_]U8r uw":N2]sc[ï5{ߍ)r4oK Ǜ|3sn3Skm7Igzv8G;G")뎜Z?v8#z}ύ+ur`>8hX^/a>X\ l?Wo.X/`_y跍}9Ʈ獓^:ظGAgso-]=}xxVL%ÊR"=x.=^g_sY~c;+tw]ԗ\毅ώz aϱڮ0{=wq.9Q>a_({q#^S?NOC}8{szͣؽ['~)~u{~yi탩lGaƘkrFmb챎u>~@^7\[77` _Q]z>SE/ X艿wuC#wZ#$oJ7FNUjg·[(_}ϗ:nWb7u 3cfwU] :c^1m? uHST}nfhh}8~Ɂ:nsdz>.{g8GiJ} 9C~x_=7՛-T;U?uӟǴ[c/ۗaToiR /jӥ{Mo:]>cGn?r:~z~uW}+N<_p|Mյnߐsv>/+ǧ|̎~vStw}qyսp~GG>[Or2ӷSF??—~\;򚽞~/~~A'OÏWo|!?_bk8y~*[g8WOG>f7q~|=.օ/_v^gfg/oi8g?^z|}~wq+M7rԻ-g_qfg,k=7/,_8_o]p>KK~CvSmOoq8?(vUΫSqfoo?T{޸Smb=~8_d)·;q^_#^=u6ד9:̚'k~d30͌bĖaTY{ѩuR1Ds_j;0Q#k.,5)O/>uy W]>໾ U15Ҽ77Ŧ2z5 |~s v=lm\rߝsUq*wJ8rƢ9'lc5^3r}}mKG> ?a'}I8_r{pԑ{VޟdQtVFӷ暟],FNv]ϳWkĨaSs'w|k z}p~=|X=PڗܷZ:Mf99v=fx9f8~T5tW4kO /;:Xh{s_/~)짙(~S_|z,mL nawws qt[f7އ[g~?ٞO/ϛun+Vo .;;{fƦ/|^94F5)? [zqGg@(~mRfOѧ'?zj^\؅W{;~rT\qϳ"i ;}A[- M^,}>hgﳛpFW; #kyv~AW9???\lqz}*._|ρ7>Vosş>G>{A[;$3*:y߶T-^>7Z`W?}>nr:͊+lO yU\~dknSO囑@B]Cϝ,^lυx%>V~'wf Kn ?vO{x/}3=`=P*yJ>5ޱk̐koUyz9!. ^IkOٰ߭6g6n!ru{"hV׃7r3kBKC3^Ɨl_ćc>C/_(^z &G"=kxz3N7sl6(\AS,Q屎LSltqFE?ykoC(L 91#4|>3)  Gzzdݕo聿8ow d팲O}.Ixjϩ?8q|/V^ĬMڌ"I&+=~WZG.{&oo聜qz5W#i|<=Z׷'s?~q`AO\[6zޏܿ-:vحnZOiSy>_9gf:&xLޗ}S(r=͑v~&=9L1ηxVO28Ƀl-C\Iǎm?̾͗L=lj*GU#VO&&uH|}|nubxY/>婳nuS;ȅ1.磙5kL_Y쮼ߺqtxq,y6ԭG=\׾GϬՃ.O8>>[Oyi8oJ}o+Y鍃|qY8HG$5yr}(=jHcp>r U.mLkmYWV,;CVuaL}:]*'.U3\/8?f?_rk3-?O e>N`#J没Fw:USҞȻ$85^//W5O>;6KzrJGrjS :vs{{oro7"Az?y=yjC1 ᙟyE&;9y% zk>(r#;Msrgdzۜ!]|;"w;IMyE= L|؈eO?M{>:o-zֲmlgjWsj .mNs]퉟-ΏrG7G*|מ? W 5~S~Jts7;o>G,_9/EAa+Oufg\91g|IrC(_w~_=:]؝/_~1>x},{3>s DxSk#r}jsWMaZE/d謸n\o>>ʾ+mO>SOss^?9e몟CnYoqNyjmu·_֮kWӳؘ$>v9\7vBΞuޝI5LO^9c( =R94ܢn흼ov6zw~.Hk~E/Ŋ=?YP?Gt&k^eηܱUzj9?GzӾz~3359/9mݗ} |k/d]z 3vۻxYG>.SV8Ko9P=q6<9/Qۗ>7BNh耼?#աoxӷ䅸\myō$]o{boc7 }~m}>A}NjQ &ް5+W-_rڵSbnT zݧ'G/OOlucrԮ8\;g؁W +yp|c?r,| G^?K^'}_<s~tܗŸ\f\k(~[őK7z@hr'm|+:ׁkݒWqLǬ+WwL9zp ۼOzQoϐZ/G> {^;cku68 |.`c]F~gpYy/ϻ-n<5M'3.rX}?p^1#|gl~|덟})=GzB|y_cg_>33 'o?''uz6\~ 9~ډ@(Co/W}u룯G}u7\}QO ~uf{i 5r3'aR<;?zrr?WN=yѵkLj+M ~r]ij+Qv~Wέևl3~l#vZӻu'GL+ulߙΠryf 'r?#NԭK;ˡקn1bϋe鮯Z}O]Ù5ƻ|d*߈GV's7_;c@=^Pu,jçN]7?tdMZVYw>8foϬ9qC18?Bpz8KG/}ïjaӳx}q>G7uzHus9ևy͂|1rRvz=6nKNŶǎ:qq]~V'x-u뷳_]&uٿo~}67懍]y '{Jۣ#~WFo3eƞם_[twq:m7zP-wy 8? ͣ ]<[?yko]٭'߾+;3 !RxZw:yP7Vqcoqk =]~(zg@VW_{ƭ"+o8+7r8=?WV_Zq&ǎ=y׷̠<ށYVp7kvlr^ዯ/U'9}9Gz{"~|7m;jqf8/ 7>y\q^|v7}y }7oqo8o_k쉗ٜYoGr=fށ>Hx~O=UnOj0=~~^}'{2y9xM~O{|g{z7^{ޏgּ̚?z孯W_ ?/>g}[?/>]os/>3oxO>{{?6,(wX=۟_Q_{|K-?x_[_wΟʸ}P?ٱ?g^[y]^4(vj{Nؤ6dMۖlR{TηȚ\jڕ)l$29i٦grۘGMڷPF[-UY(Vfyoợ)0a%Fv);R/1\C_7nt6}=Ikh gs}K;W@B51[q:n7}G);Y'v e'y˖|Wr_?}܏-#Rkn9CZG#_ou|0|&+s04-u#'3(sQUY6Tgm(5קl߭|8n[kDpԴ7hg)} s~o[-:XG s{ҝיnڶ[.3xo9{λq|AGжLwcSG4u}nNbiK:r['+9߷ 2C>'<6Xe~͒_>e=mfMpۚ6r1'v9f+nGGfLQcDwՃ',΁B֟)xp&Ƕ#Ikٷ:VoBg":㮵MX}qj֥+Ѧo+#⮮;Z׷Wxr"c5v4;舾bwx>|~])ʷM=ͯ 74n3|/~>aE wS΋:#ߑLHiʼ$粿Փ4-α8MgOֵ 8nBNnyێ[~FW\E_ui?|p}~ ܶ'>Lۉ}_v8}9rmAPiy|%o|GbЕ =Nþ\pG>{ާ+0*̌Gqcmz=_{+7vuU>O%տf'^ϾcvrSz0}˞m˧6ƞq|nK_Vq 􈾬w^O{u;_~rJgJg]-kܯG՟qpi;~lG|g_MIiۄ^Ojӣyy4~y|"|G6:'}[&L•|^}uEi2tuP_.}AD/L ]ᏍO?e\rMQ:m>Hzs6ѸE4noڀ5h<$qiwWvA{^'|]}<;85~n]m|;__ NVG^@7@muGq-d#c:%oe-=q?D/Y*DnѦID+~$r5&~|՛}~&ޚ2P(#§_15}cO_Cg(.u\?MۏE2¶]e#c>W%>"O1t~%_f?V&n<]1+}=%78/|9^yY/Nogm&~g'^yzȭitk{ۥu{g#o9]GxWk>kOFoyXr1!gz3gDz.7ݼ}y)zsꄜy|o¯S>xvy#;yH֕e~o_SpT#.6gtGee~^[7yqG#gCW~Bγe;~vW(9cIN]m>7 oONgӎ#'/u( n:ѹ:4}S|c_?}~훋?f?|mƳscI>[/)QVx|W+zk}RGʿ}﹏͜g[{__ }?yDYc:Mξ=ώj;n>g@WsF~|m;}7կf_[Go7_%wYL}!Bk} 6ZoH}MGD.׽b3kgt< m}|B~]>6=/gi"om*wl=Eo>ߴn^[8yyqR}>GgzC__7?@? /ySy}ct {3o=)|-O>W_n ^k7 ύԕ}}boX}9T8u ;x\?Q]tGps?;};x:hq/\+t;}?c UdW~|{h\6x|||%Z{m\BbLx7>[|ǭ @S~QvIڮgEW]mwzͫ3y:?~8Yط&_VocoZ'+8o]Gs;vb,+x?lނT0++u+:!7sZGϏy¿Nї8ckbꍭK_6߫ˉ$E/q~k=xk%@S7AcLgԺ [–)șҙ|䱜)j\,׵ysۧi{qc < WD'v6?z%[?|^:>%^p>_ڋc/~kw|o 3t6~U+ׅ>g[=Gye9_/z=6zF_葜h~4?W5]5-ZoC.`G+B-`yayO<{~ Yƹj{ >׺xt4u 7ʎ>ȝ֣1&s_s㝹^U: _u:Fw ~bgl\^eדW'=yJ7@hCtч#;7%~A5.G\kk(A~OgԽ/qgOS)?sSO}6v_ɟN\ۺ{ks~|̟A_k?ĿؽqϭGWybyE뙳_v-}+ӱo={r_|=GW/[lEu7sp'Vt/!>I܌vM~eWlu؅$߮=~7Зӎ+%?w{|OK>ӷ۷Aҗ~_OƗ~!E/|:Z3c8J~U;,SW]??3O辖XjWgFFQ`HMO+XY>5䛓ZDxmGnck~TGs[InScbSc Er-lh:S1ZX0Yց,cۖvgWkX~Ͻ\1h"CGvAlkK) xlM-+V{lv }qƜ̢8ߘ(c}溧oGwf_׾[ N]Cl9 lEgщ~Gmo{z&g=m~Əf)w5{Ԟ- Ll76 bKvcj}rLl8:}o_='ʯymtUhzb=6-},:8>EÚ$7'1WV[[cE߳ѓ\#ZC@~]%u5@jA&Zz1ێ;*{=Oȗ%#F~/;^#'̉ȓȅW:{yjkV[N>媭GrYk'6Q;l{X|щM5Rd}rlcjիr;ckZ/9Uc -]Te'r:֐؊.{b'p[L>8T?[P !45gzNjF5 Oku;&9Sg;c #:0P963Ξ\S#ǾVSHn>hmX'Vb+b%}_Kgy'gS9 40EkCgKOe_ףYt=bƬ 9#7%fnPr[E>'z1zc9#yf}GS~{Fx>}mbhd찭Ű~}y'yW;*;t/KOVYzq #Ao#իw8q~xi@Rc`f+_9EvK}9MnfTCo Nz=$~'uȺ79_ yos˩'~>5p*}M=kJ>H -U>[Û#O8z҆־jv?:q~^[c4~Kd9_[[no_9zUgFg8.`jq{D_dVG>wZ}8=^q5ֹͳ` Lvu7#~). Nʏ5 CϏ^Ok&. ڞ5u7m~BgAk)%'>c-j<=[?߽͢'p>y>;cG_yGqbo8pu}Nu+@r]C:[{LWia"o%~MSc$im^p5o7u44[[ qc҇[V?լ^jӃS{YVt@WG9HsyXrq"Gv&μ,g+X/w_zs֩DNcK v6Vٷ[]GCq-quRO̴ӚcA:֛dg_~c7 ޫ]k䭷.N#?E3ĵG~t :UcVYtKg;c>Z?A/M}!7mJz͢ˌ]}Gy!~gqgx:`VXݥg.:qu6o8}vU= lWS|ߎP?pS߇9TNz$7\A&DrAj}=r_E+Օw-ٞr*p~֍dC7͛oxToٝ/gO~3+'ϰʥlj?ULi7ɵ߭=a硟a~끜x_ гلЕg\rJ$9ЋD-r#|Z:ռYSHoO2BWGoJy+^].zW#?g[~(|xW&.rιN΀נθ~|]TOγjgԻ˯6t^z\oע'S=βnfTh喸aG~Ɋ/S{#{k`E#Ny~xYMx:jF};ރo3{\l8Frӱgnz}m-9xMoBҷ_cyС{苼BA ^[r[/oȍ֑)uYX9Ϸ}X=~EQW1rv@a!/>ܙ7=i7~Qo\;t۹ڱfM|D=9GxtַzO m\REݟɭ΢K޳O+''w_n\݅ƕotZ{r|_֟xӭ /rJܳ˰SޕW]a`S3mԫvlφK|ɳd|xQ6v_c-]ھЙo֡Boݷ}ԅtYu/+b߶!uɯD'k R̲gPo|ϢH߾D'Ʊޢƾ_j=;/76n[_޶^OܫzKGgWo0$y\+~${ ]i=pz#"g̚BW}j䟸 zDfD{Ӈ?o[ѧ6,`cʪnc5ΏJӠ'w]s^?[;?GQ?G_'R_I^kqȝ}6y\ 7/dO?8?_uVZx}8xaOu^S;E.O{<{Yt߈ƫ/>hfytekBl≮ڸY53M6֫.7dCzTNi\xps̵ALcs>m-iL{=SCb@_Mm6L͗ W[b3ocl\2[y*zWB_ȁO-7gs]t:ɞZP[,##;*^;s9pCK>]$o@^yqvBou[+^ZqNҩqQ8ocby7sj䖜χ~j跗ՏH CLMvzjE~m&zx[sSUuz| >ܺ<6iݘ0>\Odl;8M9vBqkxo#y\+ͶsXͅf`j.oOT@{#b p=dFKtYar}t>~u8{ɍ>ք51OW~yCz1X-#׶ٚ-z^V<5|/c?w%rcM-=6=ỿ5tG ՗b[zˇLNbg9ogDOzn y<ՏڏԟX"6ִy6V˨& -~ }~ڣtr}b;zvsgz,]5zG"15WOl{ʚj+9ZȈ/^ȝfȃͲjҳ^;R\$ҫscmF/ }+oJޑ#=v8Zov~+v5##<53wkX6֍\oKZ8A |#q9:㵧ȍG)Ԭ/qwfxMVsP{[Zh|F/l'r7|G3+;}^K?\^Bg)}5c5R7Sz⤛':cazv/=ԸTtlt/~(Oco{C}CS*'];=oͼYL>zǟα'@wc?9C_G\T3=GEmoB_4xonkV^}gֲ{Qvf_=|3_z`ֺݾ?t(nЙz{_[t=~mya?nuT|vڍG .8zKJ"~WЫ`wuȷȥ[r}^_Em /3uk#}PuޭYc[3ŭy;V3ysqV+4cNҗrzړ}q}7P~K<=|xԋuv={^x?8|zқMPo^_W03Z ގBύc%5zD:8| _҇:9F?vE|OX{~Ku C_쮇2tM݄0 tE~;}lQ^jr&~$gG;nq|rH}MѧV_5^>`ֿwedBG]7_2zr ['=G۸y;됟JS?FL_]#G GuK>eZwa=޴ĵyzJOS}GoC=gu/džn6W[g_5?,]?zדoLO6zes\DwgB}l+rZgg=6ݗwm](!7έS񬫗5F/+?cq~4<{o~$B?^rc=uE:[{h^cg.=w ի,?@'3}w{ٯwO^>lvBO·N缕Kk+"']Y[u VrcKWGOt73Zg6zpںJя,n[o5O^;+g˾1y&ǵBW^f>/s\)33؉iInf^[m6gz4U$gtӛ%Ŀ/yϧOȅaw|N|j~ɬȳ͙c+y' fe7ٳ}fU3BwfvzyNY+-tʱJ7SGֺ9uf߷-z/mկ7K~Ul}MH|_>Ğ7Q9Vk}FZ:aB+u7ˮK_Fz=H/[:K*袇Г}e__rj@G?+/,Ϗ\΃g깛ݿv6>pl},zBGaGy<-fo+o}m\ο7_x?~z˟{֟7?}o}e}׋Ͽ][rowO|;zwTְq)l`:h{\\z>:Sc=|ez3j}׷ ͺy0uq;YƎuǃq3[G|}pK]?j˺x23[[Ĝuy7v]<[{8Z#{<iݢfv\^ţmiIs];SFpбϱ}>[q~_G;g_V?`pŗ4Ưp}^fV.~7A~GN.޿eMˎ2Mxڗu{r{=y{*n;~,UwSq~ 畻3v+<ή׆{}a8s}p؋1K"oo G~Gv}8żs}i+a&ኆcckpVf-fO=c.~nŎ)}=#>^pCΆ1:Ƃ}'_{Fgܨ^\+s}M>ңrmׇ^kW5oµx;.m'M/tP40vq=76"$|Zu8+|(+=-| ϯ~ow?ppp/ Εsׯnx|I.kއWϕ_]L#)םg=ů|:8={m]Ox OG8UI6/I%7>4\=]h_?U^Lÿ|;x˿7Lk_~ݳe}n &ze ·iʑ[:r^M[qvQ8×<Η}=qynOkYjyh凃o 7?.~us}oz>/N7{û=Ώ}8ݕ/٣0[q.}{}rrge>c2Zϫx|#r/z'(_lekW/k7pS|}AW'`,Ʃ}ϕWcC4#yz:,]?{k_--;h4k'lܕݸr߼M6^wF} ߗ-+9}\|n߶=.x=u_\z׮`?tPz]q+yzշU^?w~M =,n\[~:|ȇןGtu]]?<{>Gn}T=S߰xBxU/c[ß~./ջ7ʯO7|gx G>J>"'tsɱk{kw7tz[_q^|?WC.#9I_n5y8?uy7iWsU|_ۭ9f棼P?Cn_ Wˏ]s-=*v鵛|C_|}~s7|~zܯ8_/7>}_Oo?^|:ݭ׽͵ OOr;uz.Z$WW93oiY[7=^7xxwp^t[\٬~u³r?rrq`uq|_lo|:u5pTz~Vzx|Z>|;zroY;6dz['<YWOs[W8؟퇚~Ozӭ?Qo.1ʃߴ[+?u?>upo-蒯իORDzz+ot/?ۿ4xcg>~۾Зŵ:.n ӇZ|jn8OΙfطuMyO\}ٸ#|.m4z|;kg.>}퍏~8_hK\*/.~{*[gU7@O0sz gn~ovMo~.[|w^ s7.9;Ox}}'u]\/yuF_߹[׼pm=e~M>uyɅCͳ׾o]9q\G]>.}_p+'mưf>1Yzpڜ\]Zc/̭ןuF' }.Ǿ5bG#0(ڼsCђ[,`>;gbCOw{|{ڦG9xp=ffkyku5Қs?zgyf]~,]{$DZ|7|o\_gh}ԵYz;&\ɑsg>}X9\^|<[s6Zrɛo{̜` _Г7EG56nj>JxMNVs>Ͼp^ѧ_⸞s~vȮ  GR4.ٻ~]W{ fTot^!w}a{7Nag{VYE׫wW^}9{ȓ ^}tkpu k̾z~}nslGz?_`yj>w7;}4'X`*g?/9+~o,; rj4C?#}8kcݵץEGV#sp{iůƾ777j-s/8ОZ˺vWgv:'N> ^i'ͩά8W_}Lí/kN xJ{L遡AJ!~KM屪} ?A,|/z=lw>gVSޘZEּ֠w'|Pvdo|}VW.;M\j]yӸYY=+Wve7o{K|>׮߼Qvݿ¹f7־Hm_:knxg~"µړ8zZy~br|tu6.~];qW}/cexV^{nx^q/LR:3zGsy}ŏk?:/j ?^>]~ÿw7~}^G>h6\?1zpxh~wCb:g{y޺|u_{j}˷G}񴃏'.Ѹ^ηNqo.~K>m^ n<л=!w?k7__{z3o'~Tᵸ<~wv񽽾qWˇ,cWxw98n򦗯xWc_ ,x[Z;k%W7׃nN?^O\~L҉+|}=W nk7/^߸u54.cE;3ck'^:] Y|w8]u63u'~^]|Z~ O\? ߬+ND1+uraαŝWn |s<.}oOF/ۃo=}8ue=`9C89M({VԺw|{Gz=|oVsYc*grq]~{=_nu7OuMa^vo|g}n?]>^W"gdҳQ~no_K\ڙU|w=ާ'~4*/OjߌX|ofjx{ [Vp=?}um}ہ-_g ?L-y}nlC+c_U_ٽ+> [u֭_-+ܹ*ٽx%tKb-hݸ}pnncs]eQG=sgv&r?cnkſ>~Y驸_86vV/kCk?~׾evKٺ]G/zyqGZu><]8YtK?{#k}~QEN,]T\:|?_v <v3xW~}}?{}3\S3os7O/]x/΃qN᠟9W8څ17\̤֝ F_{Oy{ |h=c%?&G`{w7~ټ|te΋܉|~NjM^_?w|֛kTNN::pܹGpM}Y3s}]y>8v6ek ~O6?2};5{qyޞc_dWΈq㿗tM׶_xnn7z3ffxsR3c=f~7=xn=%p{D׋ s}=/:qW}Y]k5_KWc+9)?B#q[Gvoq#s}*9vV׳oc{SPvWo ^ֶZ|N+F.X~cg#'\+;׾,š=~>X;gͫ?s96CoGn/ڟ{79٘u>_|s#7=q\wټt~_1S38n|6|Ij˗7}ᇽ8zm&oo Gz׵&v˧~.Eϭo95;ׁ_=;^_~g|rƧ{]~rKg}#g×?wp}\ᗬ}2ŷ\~uCZ>.? sk=;>'|ow}{^w w;pk__}8zqq>^O󑧭 GM5~>. ?.֏]^ww翛W\ǃ?=˗˷kpu|gs;kX}HY??>'κ}/ήu~{v+.`%7G~ųo_r_`o?<~.x7|w=k.#޵|)\NGvŎp._jz&y=skwWre$/S-ZMz>/Nߕk5}~tߴLJ?~?O^Gk|\s}]$/W W>x8_ux/Z= nn} >/.9/y>:cXRx _Lo˿Wkkjs=7?[׾Z|8Ǝ_4,v]r{>g'r;#C|=8vE>]?ݺ |Oml׮7g/KVqu#HSqǭ3X=Lµ/~]. n\Os7o~Q\ox=+\vu|7!Ճ[ڏ}—7῟s]w>QNe7<7I{Vϵk{k]<7tOkoݾz?v\-}uv0$yyxr~}ÃM^po,Чp#x2s _~뭟>] ˟>9\uYIOѯI7W˷n>Ҿo~~x\y8Zox\Sy}7{уC{B/o]oo-c|j];V:𧻓_Yq߻\xफ़6[hyi{8z-GjvG[_|=|~ 'w:kgCRuq#?:cQ{)=.Oxꃑ {qIƭn|n>tn}F>v;z.^vs[wspg{cУחO]>(.:wj'az3t?쾭]O_ ;{jq =9^տOw]o|z=}+}P_웱gY>YWnz1rzʬH7|oQ]+~xs羿rrϓ[W{xYVƍOo+y Oq%̀wy[}(88| ~r~W<;z< #zxY}^>㩋-_G ;Łoy}n珸/.]m\Ԋ_C[[o?#9i݋~;/y.?}|>TrxWxD7y6{l]Ӯ'N_q N'Mw꥟x#NqWW,Mۺhg,?I8Uo`jqGuwЙo/+m>nYs36G83W50Kh|u,/|h .7oxntWnv>#c'jcx5~|wė#u衿z޸j]~l[ߝC\|t,+/zxs[\oyu勶^l:\C/ߛ}w_Yþ3}Gy}F_7kW<dzHlwWm+w3Ͼxqoo͋y|>{?~2[>g+kowoU?9x_?S׫|^QaǟxV|ܢ>T|Vi'#6V }!_OƮG~?dGY ݟ+vΧ7nW/TVc^ QG_yݱ>u_-ݱ;ÿ}7q²Qf?[QPt@O\ubFSGiח7)77cڟ6?U>ʾL<̬wpw /\?hϡt%xMx}؋wg?>rI+f 9B _}g^?p =߂y~ 'y;re$>='Oߗ^W#z ^> 7x߲/ÇdNq cܸg&܍V-"']se'O&?}9Ogeݑ=V| _W6쾸NG}$~[x-?y쑔!=w=1n}||17aٙÎ;F~6uuړɞ4Dq[>S/&w~#~Sqg>>p#~¿V6M?e2fZ_:-4G$)!'?5vB>o_>Zn^7/nS}HGp} p[ئOإpc?oZ:P@>&Lq`D^_˯=ǿ/eeۂ#M_p\=P{5g yF_ t4E~s/|L|)K=_߁oOĭ~ď k/kѻxJ;/'>__8I>U]'H><| GC^mSq7u'}8k|®#Gt]vY΃O_|8?g܎u?\x#o׍y~Mr"][emY}o6rHޒ:z'?no /t4吓SGkvvBqSn.OuW?Qzq߾>]{fŇoؿ<ܸy"wwcogRB_GY0{&)=+AG:~{h?.M|y8z>_E-SاzAp#*'cGV3 揑y]^ݲ+⿐?k蝯|C~̖D>Woc[s.8+;[_yC?j7v%z>ڋ'gYE l?]?o/N򲍗w}g_}a}}Lo _Znb\΁x'v<n 3v?Ws 7?bݼ*9k??:ì_O-ywٛFW+/BW~CG뗍>{K|Mo#>bX= Gi^?ߌ.?|!;Ǿȫc9CÇ}=|+o昞'9?nfWp}olk=q>~91sv^'#~7{u|nu_3qS?qqg,bOwCOG}cxq'[Unݲ}[wxu:-!F΢3ms_|sy?ⷕ;~ve=sc K֏l]{t_[ׄБߗp_ }V|E6>cgWOzn+\[ ^X<; q5ڔs衏QOSGq1{~cx|$!dwo|vV:r*Q=O??#΃j%qu>oU4K~)#>Worpq#kO$Nj[C/ѳUhF>>g-dߛ'U \G:9acE/O4.>g7w:WIb߷n8ǵK/%}Xs"O]B]se-* 0PÓ Āٓ\ (R(R$Cp+Z)R@[ ^"NJ{+חڜ3[N%u|tN>c3?~s}3|;:wWv{sr7olg&:f]_- +'8:Hӌ_>7#?u!YyHX7B?{n=GC+~=$#/AXt#{ |<r/x GugM֭[}ޒW^9%z' Q<=9WxG]g8O{lԳfu3}N9b/~ {Mx`wO?a8?ɸa~G$^"o\Qő91C ' =ß3X ߂>r>>󍺣 =vK;+eM}/~`ˍFד~"_ÿL?cz%|C#m飗m:"ğC}R>%|Z'v@_/~| Ax.~߈/M ,.K%N7pAaOb>\0>F3}Z}yC_}D54M|{%[='YO$Ou<">o|j7=C/,ɮSq_R}/}41u>yE%i]3s K#"Ǿ'}oYOcW=zfQ1#sKE0ԳBrzgbs'oev8!'|>?|c'[;q_l?}~nд=r<.,-6=LhJ=:ȩl['GrSМY{kg3&M[]w>*&<ìhxnl171Rn>}[K6r/['D\KaW6c֢5۵1,+*rB̾ #y7 K|΃|K>qI|ƶr֢Ŷ`.՜tίHK;z| ɻYUΎL׃ф`ma Coۊm[g,kUQ3v/GmopQG„1{ qDΝ#07ۧ 4gֳɿԻ[op_B)Umz|KfwQk̒b/5͵gpZ=KГ 9ID"v06[f3'@rIN3Z4NwbְoE,{%h=n;qʿI y:Zu䞲'9Ƚ ០oLWSGܡOY"ڀsQyEߓSZ?L}K|dC{*T(_iK!o;+vND1s"~پ9\$|㈟'r3}9do}r o-?]WόjZol"w|2_Mt>oG~Vv+ctDi-FGzo =A+7_X^tMs#=CFWn:Q.cOfo8Ξx?3l c*OoM쁢f9tnG$7yM;ƺyʔzF~eȎe2?ș+3a|^bͳ0ZO'Aū]W;.{ܳ^6#v al2n>"N'7+yz,gZ{ 8·0e}#_B+kՈ|cm9piO{k/̧CruUs^RGwKߕ'ysm' oo]71~TY]7͙3r/8eGC]?%kEɯUC7љH8ۍzO\?O:WC .n{j# ^ٮ#pc vSU^!/p~yY7l;3r^֯&d:N'mxSMxwF/uϼ |zti'Oc-9ro䈞 p)zKC?B7~O]Odz)>#'\x:6ׁ;u't\gE=~2y!?s{|ߑwC߲;ج_2%ٯ`y₈|wdBS?%|w |7SCt??o0^e.e;*B̿6wgx0\p^%gzsf<|!/[iޑt>J|QgFEy ׻w$g5 }|5ş.d2W'?ydxSͷLh!?B~K!}g}:>-8 6E.p?4t/;z;=|LO2.FAȘgnO2$x]q\yH+!H>:+nEfQ+~tE+$r~ş!x ۏlݩw\dO[$Cs_+ zg޽yʿ[ϔp=oH~|iYOIrM-:=^DO.Ք7iEWW5~=y1F~'36g׬~e}k2ǁ] 2-j#k ~_KkŏE0{.7^\-cǥO ~ _K{;qg眇a o2_q{SNv.| $6p}W_C21tYO?ʏ8O~qľEv.?%8yC[=Kȫ]k5W^Ӿ%>:~S }@ WO}]/63'wzllȣdˆ;>e׸{ZM?]id \4e_' N/ȣ@W[% t Mꨉַo/9Do׏/+fzsaI.-{:AwS%=sϨ?+zi?^|o'zwnf/ oJ?'?Cq]ȃbn}a @-7o^̸;$8|yxG"yԫ~z>yH//t&;youP=!_KP!>߃[ qwy{#s>oys wfAuN/zG#OumODowKq%=]_wH4;6ص̓$ؗp*cNɰk1GZӯϜm%o< | <%NR%O3Hΐ^լM'W}r>s~㢧& 3^s}n:BGGf;N=;Gw#.uwQ_د=zgAܧEx>?NqWΓg# Coa;b@>J髁 'w$og? idot3>/ _1oG?$L^'Gp_|ʸuk^G+S_';MoL:iCAIѧ ;p߸H>dg ɾہS_8_"N }Y ߙ}{>n9(;=fg N3p̷Ӛ9?>?Xe?ϰ2s$*wC—Wv캗8>Vg7@O>TN{|}?s_yNcr/Yc B|aź|'c:BSz>'_SL(K\BN~z*щ!#V6^%һ=#O >p|7 =p :7|AO5/tM^9z^7K&䈨qk/q݉%ܳ{ǦBcɸ<3{c@ow@w]?ѿG_#G3>1%ȵaѫ,P# O1Ol+h= ~ |~E37Rt2RW!&&h|`o$POW{Sj7 I?R5?_!![^/z?uYpx)97ߤ7ȳ6FllX&Crmc5Fn'q4}nMf|e`8^ 2nq8 E\59gZ=3^rQ v,!1'^ ?mh(O27կX׉)n?18?.wRD-S{!`&v,Zc8!w/4!7OCf~bWӏL8SK}H^砥_%r}cU=:yFC ޘM¿M-])ǘ'4s<pG2^5qAS5__׌NɣZO"ߕ/ #h7p~.lQ#/uGzȃ{}㇒>7W|!L^ OiE^mc7"/f =J=ǸNϟl M}kG6O7KvC _m'oy$ݙe' 75L8Vx^@w>_~ca>US>Ge+?|k1Ho8?^/=+ulRw3Nyg?IgǩMYGw7p<{ˣ:7S=o}ɼs!߈~Q#?I//gYq|S&Gfuo͈hcYmV'[%^~q@?{C+~&_A}^K'ރJi|%໿W݁SuXGwz^ nxO&<$y$E ~E s#=C ʽg-Pec9_FzzThۂ^=Ө?(9¯0֙'o?=+<.{Q/uMs:gn#ﮐ{+K>3>o xw$ﮐ8?lPA7r=oq᧣c[q4rB1{{fq;P|jԟܣ_5ԯ91Ld7{{#/޻P{Ou>gVs~x?ExF=z zuȳ *vKυ#~ 8ޠ=Ro<3߰ACzoܯ ExGm2JST/6'%`3g}K8kǮ;u?#x=$/#_I#~S>g_ Ǡ{C.}gOG"HS~f?{ ŻTcٗc >bGifҟ>2zПy7#y>E"_yoS3/,1v] a|1qsYI~O eFB_- y[ D>o.q67NDICu;?:~G~x -?# q4]U_>Sd߻I'ǻ k ɏ8_3$`oa-5OӳW7 Bp2ЉKԏ֬^˜ |<!+; OP{iv~ uӜӰߤ~}  x ?nKїxOzQs= #6P^9^qĩ%[w2_!J9QiWZ΃w~ s;EL\wG۰9K?}]C-+〬%r>*p([SRwFNCH>7q̉4Ի_u)!yWCS@vq }$M_Mo#&|r|F+`9CC\x]sp , {_3} ϣ_"=Q]ΙgnWy ?Ӊ\߆QI^|J3q .i; Ys̙3'^(9`5%uֻfBƼaߤ1~Y=upyŴ)/gq@.szOxuG?wC\g17Ӡo]6ɣ7B"pHk6N'Nb.ѷ߼pE yyf~ۇl_BOMo@.mϢ5q G;(ȗJ:iK<-7M&0 >D>sCx ȇ F5͏d$rs8v8ٌo'?I^, ^M͎s ܢ+P'ɓ/=u/?<\$"B}LGo~Ǜ kǮ'[Ө_4G7>OF_|C8o7QUf5f|H␦x(>8/<8֐7oMo2>8%1Y.q7~PC`?e9gqq;V6XuL9a)?f,'Krze.SOv˱_ϟyL]U*6}mwч[׶7jYg 탴I %*U&5^=O֑;Mz3dbv+ UuϴmRAH~)#aNȑC@=3O[C_v)%rJ;OW{qr;B:DޑG訣ї˂>ɄOWn8}z#u]-}G G>]G}3|\z74mN1 ws乑mY[Gy>xCp~ynFwq=|>װ eA NC_y ]F9R^ƾ /M|x^%N A8x^\9N_9A7XЕ'y~I'"Gy9\9!W1G~|_ q_g {-ŷ,'AOuI <|BI:E|D#r ~!z =#zie9NJw'=~9|Dc Rr`_*M-cD'{gsB|:teEq8}G=H?~!9zep yЏq94~00=T"s^ArBZOğs6|B_z~0rS\_={?+:{n錝Sc_N+Ƅ-~]M/BϠS5+\CSGg3qZ; ޼<Q||Q EiTe&}'/Gr? s5.^9.>1H>|'{"=x]D.֏|.%?z8_W^'ŴqYr63א8T# h;NLW*&}3H<mx#De l;%=eynIofS9|vz+\s>8w8^O)ǻ7 +kH^'~28\^2E.v?G|N/8Rg\W^ʏE=ka^92z װ36 k2vvGtwd?8ϯR\ ΂j6,nI_cml,zհK+xKy/tN]o7yD+~ l|u1:)zٞ/IąùFޞUY?rנ}͸zᗀ ̏k??zo%F>y uLڴx*~`Jn]o<teAuCg=pC>gǑ8u7<4ȭp!Uմ7|=n~*~ؽAW'=}î\g$p>x=~5q8HuL[Qց>~f<K[ů}3rLjKL/7%seր9&A|k{`߉2?^r/OĿ9]:xA<,ٞ;SF_ / Mz|7 i w9 =C~􅞙 oy3{`߈ۚ?@Wᬷ7!i77<~ysK w1b7A#/8u~]yEM>8&=zt~Y3t.Еϛu=4'yDCб! }%}?υ+߱m1۷  bL 9?k|D'p!j _u+O>+舽jvSG u;i=_W@_^s>Br _ }Cgo#?ȕ7z0 /3}nyv }c~ I/ٞА\mَP~Cg>s}/pIM>r̫7Wr :#?ȯq?/Wȑmusᗐܟg!YO֝ -!z7+>cרwB?Ⱦs!Gȭԃ+0-!>]{ػC7a ]~-6=IǠ7r=C>GrGW~ȱ_< lgiGJ.[%jmG!;CIO8x8fz<|p^M羬q_fnaD7[L_1q3t2.?Io| 2u ODBw\ @^wOg3mJߐ_myI7ǯC#sovu7|^Awܟ.s*ck<z)gП:8|U\뺾ɛR|oO~!7(=r\/|\=]''`8+pV=wdARtYڇ S=s'`_,ɰasćW[@kbf=( \OFsl9}٣v]HU $A5SCN] vNlПwEYCQAm#&Jb4V`=lGF~l0 䚯|6>|&}kuOlA~y;{| ;t9>ȳ]C/qF93|]lC|Om_=|7Js~5 >ȁuz ,x\@g'/|N X|Ѝ72k؋kr:d%s\_!O\#ΡBoͯ L_pAEOC c~@~O ~kCD?AG|qD##ߣar:~ӽPzN}/"%3ϙ8f|'֎؏E>:۾>#ryL=A.{|/cF+tpl,AnsO9yE/{`xux^uooO#Q ';Aܑ5 :Ytf;xn f^=>7??ܦ?_}Ln^}c8N4'u^A~69Ԅc<'}%J 9f6x9z͇;tCNi%p$?! |"x{؎E&mȼD{aa/pYϳ(/?7>wpx{)+N?<3 :`S MzLwwD :էc 7a=[KЕ#t8K=X'^7wy] zO!@c?|DžRtxf]7jo#K>8Й&ŏ'`G7pAzm??8bFz]@9~O }9Ja/y`sRg_@Cp{,x 9O р)O]eA^cfy$xgPm7e}1}"e{mW`?p^5{x/Jɏ{5y 1qtUׇ_ueH|bʿ/-i1pYD=[ cϐփ^![D~3OFqA>;ߜ{[%S?wP?<:o@O#|׳Zz G8=ߢ~ ]x ~y<0qq&I 9oq#v q[|Botcĥi8s|1d}Go_}O~#|HEfmB_7qW̸ORt^7{F^q?:_{fu=dgܳ'}?s=䀸 ~VqDe=y:O; rFߐ'_ޞGPgZx8>{TG} =!ZwU5#L=e=qmZK:{xO;= "^n#wci { n,?33M㊤/}K?w=S:33~AS^:^tu_>^F\n yfvu>?GG:/v:pav}=)Ћ{Gp? Bnm禓lF2/@r&=wGýgߋ_?ZS3v{4_XŲ'uL5~ >tx^W9"yHݗ9 p_zKL נ#z]Zo#2 3Ph'?zn)>:luj6o3!? wiquXy?@^ N|?bg~0n-kM lߠԸzv9+ ~ `&O̞ “w_7{C%^þɾ4W."ߠI|ñ=g8T+{"|_ ]c{79| \Įc?׉{\ٝwp)f'8,=|(|_oicאg(COsЛ<2E_.z8Or !ߛq`\-!/C/y~0r.=~v[~ůE^8qG9:C=HtAuȟ+g=|8蒸4uPMBz>wg~a?vY\嗸"`7Ct;~x_j=WyZw>q1y y< [>(p!sp]$/~Dr}rD 9 č| |o&c Y}c_ [׬yzd2^^.. ސ߸6'yi>C܏?&} ?$=νs#?:#zc;|BE14K6`אۈ˭:<-bpLOq`)փa߸teK\ޣKRS"ԃkk;+J29DzXOW1['p<1Y77 .@_]ou\a$rTuo ԉ7jkNbg_ّ324J6k?G,}vJ@h\^  ݗL~3A߰o__.z n ~ȳ)>{Q}^EcugûOg_\W<_ubyD8%w2] KQzqt.#~/{9x ]RLIz@'ͽ>JR|Wx)ni~< ={S6(w'N7ɶ"[~֩AcdBƐ["ƃ^ĈL1ů躞̿7z꿎|g|4]|&d[}M9~SKYEơ?tw|<|/Bl#ӣ:ЗRlۻҭwnf?/rg|wFNWSMy?{Y0{l=Ob*t9j|݈ 9wMH/zs]Qg> 5 jiPl=FyVY6jz~r. 9y yMЏq'W w믊ucCք#ۍcۈ QM#= {p=EWEO;CBW^`BKDG:ެs_|{pnZ97|~ 7=\Ћea8 Oz^/3v^ m<^*v#B/\@/pֹqg W0z38ݠ;^3#s^iwpf/xz/׃-v{EiF\+&䜑rrĊȭxf] B#g\{)}C,~pß0>z|Fι^!ߩ}R{w;ףZ9!mKw =rUp~^&=~tE|c7ߑK&WrjLoՈsGZ`d`׈oQs~8U^'sO5oﵢ&Grd5/jM1ω`|O~y\'?NXK~,,/~4<3Y  ;3 87i/w_2]x _gy:_ii8q>Gv#ϑ@zYj.=baܓu= 'wo}mp8Bg'Nߊ<{җ>#o߲zlE $tG.3 {ä?Nx.OI. ƒ/OڠgϺ,DwoC .mLC( 3+%@G~g}i}({lw7j/1{Ѽ7$`8bϰCߐ (ȥ{{ o=}a/M:=7h?N~!rPy9 {C=7X#W/x&8_[4 5x4Wt}_ri~߁Ǟ} <,miÔopsY9 8|Y◦ePo|8,?{Laǟf=3{{{uKxފɼ @_A{'GйA߉8&}#z[@"G_-χ\+ wO뀟#,"}"N&=y~[Q&_C<^'oу }}>Cw#>n? ;i7漹w2E}Fv8,?ku>FLYˑ\2F\H?oIg}9<&<$ $ENuh`YNÜ<_`=|fL:UsaVu:!C뼂{T?,}|?|q=̾- @~ܻ ;K=C\=M<= >#W x'+oZOɽyĞ1" }3 ߠ|[9.8)zz]9L|jj=% 0#yyct6}up۔O/ُuuA7<.{7gEozOc3|z\4@ϔ82}ཋyʺ-r?܁LGx ^O亹Ny3]/7o.qy+Mϋ}GoL܎U<73r+;O} 3G95Gtc8c3܈~vN?}|y%#v ={[UA751~ y8-:^_O !:z+^GGng/ພُzE+|ʺٱ r*てm4 WrL潦$k+^g9ڟy"yݳʢer@?G%*z繾)3 E2kNxp^сx~qݤ+togYpFk% wCOp#Wݧ?4~QY8 k%[N*_ D&=pܜc1?\b7vxoߣN|f\_/3ٵÁԏ/NeA<zɧ|[EasME|oc 瓡i?*M?ٞ}g^{@]/>9$nd'39Oo&.cOg9[W #{׮{sMXn}39>w3$_sϠgț鋿$\WmE 3}_tne_2vƯn)%l~8Cc}U~}“˄'9'mfyٞE>K~eQq?#_s!a^Y}D^w7 _|Of7y~Fsr޻>9n^rK=:#_ꩱt nDWo<{ևΖc%=ڵN\%|As {^Fx=rps)Ox zjN^v |go/1Y?%sNOrl7EA/?r>5o9yA~ox|@ӽor|8>@S;NDU:r[ z`ȇf> y̹~x\ ̑z<76w_@_"H]?BWp3A菽.y0sq`#pe3HB;-|UpիR'tJPo͂7!]+H;iH?7.V/z^se4QFyqꗶ*{ڭ#goћ;-*]'_뇎Dc+!l@[9 C:M+zb0SOO=!m-[1G x>H?y~ql/ѕu*rrz]g2~c oz)$t]<\_hOn cF`ׄc [s[n|Ύ^;ذ_M"τ3p#sao<.@o#<{ىv{Q~@nTrs~Ex$ls+u0puFs*@?Wl~%>:ze5U|pA!m]u6[حג?cb'nqdOs75'CWO7?e?0q.* G kO i48m~e?dd:荟[g{}]=E;8E.~9֋~Go+cx4@1n씮G~7^ʺ+UXl!{7/g 2$G/W7ғWi>ݦ-@o ~3f7U3:O'=Ďc7= <į};Do }2Ӥ Jc9Y>$Wj})؏`j}Ÿt-yڶs]#n Hͷë)+Gi5<v>Wc/?%ƴ)ˠ7|oƘ"z/7 #q|<>QF)KrNQh!L]~qGm["<=1~Kѻ՗^xqPKnY¾x ~?xh~aؾEc/h _GyR},Usw|4%M" ~h]>ڞE~/ֈ]?3~$u\XMऎȍbyG\eG;E ~(|tU3%;x~ y6ɛ$ٶ_~@O3"Yس?,6z+ϯm s]<'nG=3w'Oԯ\W߃޸'B#|m<8z|ޑC^MNouPnA]3-tu<*>p}pJ?7 ^e7;}Ƚ'q,8^J"G&oL?{H ®an!rȺ9)Owț#;o}]iؾ=A|뼺N ;;,v&_GPf̯ʶG>#n%/. {C#Y7r*^mi3oc-r9)W6cߓt"k=5.֋S/Wk3KIKr i6^Gi@ â7t0q!߈Eh1m]9o8'fȇ$ ح'I= ؟ч(}qLd~ k=I̼14& A <;/\8^Q?4B_\W~g^1^E?GGy=sM7d:.}?=-ox3}Yy=E7DuI2q}:f_!¡oYPOcQ;GpIvTW;ޓ^y|=wqf_&E_\'_GX?W:4ց n;KKd/ρNa8}};N1H?!tS-֢ {}P>"}T+sw-ynƠwЯ/q "/Ǭ{6_Gw ^g^<#A>+\̡xo>v>Y=youQ?E\ ~1ͯzGӈ-iz_"o__\fgwPQOߌvj~'B3Gq݁~yCF?SۀkgGS},G갲{=' κ#7|N}#YwYø π}ߒx~ow1וyԯoz֟߳^eQ #$#wҿOf}WOs8#O~ck?F99oB}+ը wg^0WbK9$iCEg~ulG1~~q?ޖ_qʺeO-K4b=ț:v?l%zޢSz(H9{S~+Feay?fʿob=|uZbW? kS/&^¿Md?_=*Rng%?<.:p7ף~%xONu[C{ޡ?Gl<ïq=[G]':bo ֿg!.CV9ki.[y!wg갑>Qt|=-x6y$6=}Q?gw<s(#d~u+3yLj 7?WQh6NvZo>m#]g^*zA$s3't;K\!va>?جl>/Vε:/ W*>% 꺖pz{z-y{(=yN C/~w;s =u~}?y/ ~G3񵮃|jxvz [>|u|x'6#x1/ɓaxz yFB_弿;F\|8 w3/F\%CϨK\|nLuz\Q!.ܿ*>3ݧGL_&} gw?}!:!nF¯w~?W8_Q0Kw_4^F<9 @=I}SԵOu;:y1tDF-5YO~F3MqF^x:L߀G ~3v9O\A~# t}~Tag,~5>g?9>:/Ym7'=>x^CpV ; ?[*CW=M9L>g'/bPG z9^sB0Guj׳t!y9?Eo@i2\x-;>3_@${ 5GvCo{ G-m1zO^ޙ礃cc#{i<^ND UP$_ ;rO>5]?6˳GDc;|F-|voHs2C%r=MQ r@۶რ_[6Wp7~#o#5rZ!7Cn>0,m|A7Q BOlk;5p=jݵ*({џ;\溈U,ZTÞEND!tș-iY?|Æ= $!d7k9={eΙ|cϦ;{˘AϢ&vŽzCN݋E޷7 1!8wrg ףD0;x96ٙO8{̞o, 9_򈼂 <ϸFOg2зc{&p?(χ?r@i`|lgۑ57g$˹[8Nnd=;+|y O|s!_;?~+~)υR䒣=?H's\2Avz^8=Wݡ/fGC |}w@3_Mp9 ulޥ?cJ98&{E\G _W_+}% tCOg!{Pg>Og6г}z!zW|{^笳qRƾsJo=Ys?=*cO1's`躜_Qf؃Y|CWx'{9|g%rQ3EӿȚ9w߫-5{??=Q{R=7]3L>{HN'BxQf&획zO@fawP#>>v q1{=ؗ-z /_;r6H .A)=gzΤ,9G?= #ooQ{Y{]tg:BJL4p>{W=J;=C2 ,fs{!Jne~A~ޓH||o;r3]bϊj{ˀY<Mŵ&~!p~Q8X=+x= ~tݻ?E}ovT]=(=:KZ]ɽ<Ş1װ'3ֲ^fSO w)cpf_MN;2 7 _y{DoGG5}$/gI gz>Gx(:g $'/ ~&"oh{$KEߊRg =̋K^=c.yfOO zƈ3'xC!])'O e~>sϤw0#A+y ɛPߑ{N4:Vݳ/ Rf$KQkE 8/<DMqȡgc+zg_ςȹg YwgTĮw`Tz~5ԉ9fv؃4?>Dw刮/E^xL\K[ϋ=Gp gNCq;Aٛ{Ҹ'6YNKSQ O9_)M=+g^9 "f031a_óMio #t^I*>CD^9X{Oٓ*fl7:WC,xp52ʽ:_9uiU+qR N7 ocO^(Wُ|1AzD<}"byN$D>CT$9#yxOEonys Hyp=n'2~̓w^ 3;@ts}Eٰf,_}9Ay>yavDϜ'g/|<GWOMsA3̽|WR0 X鞲*m_7:/^v\~nKst q]e_}3=MgxE@¯37OB8"Z|Of~?fF.<\' s G]g oAܯ ^;.~/~}E%߲//"C=?_ҧF>W]Sr f5@k~o] ȏNt'nRWoi8,5kGD|p膝G7t_ s =uM_uql]TRr<֧G3 q~_{OȫP~cz[d 8?BE8Ӕ}cyO3CEבE CY{N7_?^2?#uNA˾cϳ_ȃ+QvzK!nDsԉ .W_rzP=,>x)3rぃs ~Ow xqlvn(gAK?럠uAo&s K{Ŝwq׈:;^@rXx~o5}\8o=_8ޤ7'}+I~Kע/RM&mۋ=Y}L+'|^gao0DW@syzIo[c$ց|ܥzx:z~|iNFux ?FRp}s=_8\ O{>GGt=y^}Zg85|nTEp>qAo9 p 8Ή9 ?DZ9>!J'x2긖c ?#8xzuc۵ E.?x}RmuLp9'[+HEu{&+4nqM&'{%e |zE?uVqv1s'NLױ wv &`O'>9owm;ω&_\#cϹj]Wzw43_)~27vJ\7>D#{}0gp@L7{N)s1][!v.v7ssRB܅^Ow8DwԽb~aWχޫ)F=o}lvupe>w89I" yx3"}~\pQC?}чݡn~e}.-cq{+8Nyb  {%N63wf*UX1cQϏz|;wC.{xW}M/:fBo!ϛ}Emѧ}>1p!V/W/hkz۽Sy'}km+zu~bߏ#C_cauNzV*'{gaC_Tw!_;ao>k/G_\"^'{X^Jn\^Cט+q_oُr8~ o'|_/t_zU#3d1q#yϕO@/r6r?Gڟ93#{~"4k?hyȓد3_ARѺλ2*/-/=]_߄T)I9WUL| H1o>&_ѿu5!O4HuSa_#ƞ/b %Q3~=N٧뜣d,{|=+/#wec1ڧOr~od=EkY@$UaA$b!GL5Ra|TYgejP{gA mRrA0|EltV+9/T>5g љU=13ϋ+}q5ews.z]2Ĺ^|z=#(6 F7ڙp{sf;p#WDlMgrV9['fw03 Y=g*= *{At 3p*{roL$>%blbTۻAqn?j,EÑ!Wvn+d ÐqܻJYԜS$7!_5,oA`#iEem\0!|&Ǣ^Ay%zULO=rLs7Pذ/ԮeV"f_D6W1z7y#z ~AG#',jj1Nej{"CG/6.!!mR<[ zS1tH@ 9kIzxƐTbW{^GpyAܯ7{D{dwrWլ7rz?Dp?f1b8/g sگ`?8B/ h{:KV|Cߴ5[wÌH'g#'~;~Tya?]Qqޔ_'=ף=,}䱈Fv^Yhfjt} vBtǯw}:9EhASک|rœF9_!z7;qD''GTW=){o~Ž) Ks{91#M^1fg^Z;ѯ[O3Jӯ`]ټBC$m ޜlTxzNsgz r^^~|geOnP+Yp{)NA|]9t}.۲So$z]_w5w=={Wx^%%ro:njs#}#^x)fsv9([^Y%qf3ns#M6{׏gy=݊8 ЏL7~gz?¯ ~aCA%Coωw@WևzoH[yqJq{6,K^?1=țgaﯜm?J}Y_ ~=!EScſ]{]?e".J$򏹧r޹J߰G}aǐl܋39 C1i]~7u%xyɸ1Czn®/~c[y2r`:f2?EO{P'<ui軍z|@_鳆Կe&>g׳뱗+f(7eOb78 FlheŞ פOٗl/$5Ȟ~c9\Ǣ{X-wGM7sD[C}vGa:/AًQu8 >ŜJz:lqUw8f_{EOb/E "#J?zYf#9y*#>9/K=.z87\^̎e;dSC<7>z#z~?Gp*Ke~|"r=Sqoᾍ{GZ"__6p¿b!kǎ?0r0=? g/ʻ#o:=􋌯;꭬ eWQa; $zF}%}*yu%9h#)p\wd߉9 $~zG}u;%~'qpC8uxO9\:;z?1Z_@>|/ vōs?s;zWÊx?D)ZO.9r\A@'5p|EݿaW^EQ\4ʎ/<"~fC7Gp?w.>b_܇H7/Cݖ̗we |#qq8I7mg;gI#w<j0oNߢ?4EG?.?"yj+g ¯ľ+{:o NZt@OA {;<:zzxw?\|?!3y^0~/ޥ#?&ߡ=4neŗwyk=#1Q:wD]8Vwcn@~'o䡢ao}7o_?eOžQ+vC\_tޘ:}=GB-[5p 9]=QuO}\+we>K2.󺏔MI{8NS@% O"=;E.ЋC]9^cz 74od_}o1C}Q_&^t0]cI|o~@q&1={_sߺr)]myK8{ϓ9_Q%=w⡴;RK,vn=q`WK_yzQ[wҴO*1^rL\_~쇢o:6uD{\?}$SҮ2~=gq 8k9s$爲:,~7򝰢^Lﹸ٧|L?oȉOٯ@wYw'#p۔>$x2>O u@퇋ԁl9DBKi>e?؟w^s?3vwmrS~'XN(׷B6|?pO:Xgr,SWfUnm+Stδ)|q"Wl]+WF#͉Fd;<=yiF0='ү({XJ\i:Qܟv̏7I6 <5=n/_3 xn>HXm-'m㰏p(%]8 K+ƽ}Xn_GI^D?)=p%^R q Eʿ:z6{u^lG| wx3n򸻒7ou,El=.n+:?Ynx=/zIom08'igI=tێHD x0nm2#mj4croޤu]0?ÞA%Mi!3-x3G횄9^-à7ël7E'gE|9q^4~3$?kwY|M4ɫC?fi=nmre C3|53=ρJ.y'-o 8xc˾Q2_(=e_|>I[?@k#=?+~oW܇Q.uSy^yD;׽YGßEwʉ5 Iw>w;|q[;t>v{;`=Ϲ^_';y=m SٟA?nϘ6@qYrzy2ʡQs}zn>&ߣG؃u=ߣOe4؞8St׍d|1xەz>pþ!#Xp&,C;we'q|D7z ɿs'7.e6ۗ|?m{߳X`KBO+ҟF߳ ?# )ǃWy_yRYr|eȋ|͈۽q o.`o:$ʇkpK$cHnKb;+}\M|_3."ol[DbG ~G!?O#|=tx_->Z| ǰ:m{"8;1I/Lwi%3y364y#9xg9؎`y$}pVϟc#w嵓e8$C|L~ 9 d= ~yi2ڥsIcY/ ~XǙ#/r[ҮSt|~ aS}cZ?|ľ? r ݾ#ywo'BF>3r{&8m%]`)ct=ƿǮ?ĞC;??4U,1֐c䓱k;w%=zޞ.fN=<75WZ?<vE-x2/>O|>@o_ Ǟ)z>OP%z#?;gE}=/vAC05Gq >=R~KW[d\C^#>9Pʿ1np?Гx>;R[d|f<^rm$oס!g/`WCM<~:~"`|}~Byv]xc;͔N|4𓿋Sۓ%mo᫷s~&ٳ:Eg`g+gT}5=EЙ73Mt/oD|Uh$r{~| ;bq^_,iYi66$r.g8\83~*@.OÅO):[;~릊k/p]MI?|[Us\#y8#ȥYs^{ᦷANؙ??g_ON"y NANc>!GOs^Bq.t;K>(oxׯ1(\8!>f|UY=c=_ oc׬?9n/f: ύ ~/t=׮ /|8'zzKGǮr[ G9?tMW w#OG[5y'8] l|_`2K?}/#wYԃz >p>_gqHr<dɧg)u<_gu4^gA?lx.p(?$O=Ow~-YQ< zW~փ5!Rd}8cϠ#bϥ +h䗰?uIQ}1-xJ6}ęc݅rh?Q|B^Pg'f%둇?M6uQ?'}DD.N_mmwlWI,0nIIڮHG}؆vIaW-;S{}~3wH}1|CsM>PyG^$maɯ{,[q~Пu!1^ב/3swit>[ύF'oB~/E0}G)Cs;:&<~xNyGp931dS{Iry6ꦑ:pACykr~ockvZ9z`Ɍg_s~='zoЛ1 }B>?1o$||N=):G:r>]s /@l˕}A3B#6?鱭zQnwK`3X8n{q(Δ{k;#|>7NGXw+}oL|>gf}/wd`?OJlo#:jZ χG>I^n7L@> Gl#q|kǬW/y?mƟg9r>q ,q w?cqq:tg:SgБ:-ۇqlkI/^mxۆ}௷!sK5Ϝ OЏpU>1L#3qhaȾzg?@*/|g՛ oe^oI1^;e3VA~c~1?>g8E4e˪-eL=g1[ǞV;~]L[{l绎vn[Θq󷯟.܁[swumiw۝uݷ;o;lO3jwy[`=w/u'?;l.[Mnff2}.w̜sx[UG빫oZKa>&kU=}w= 7{wmvyvvϣsz,/_&Pws|Y{l7zʟ}=)5c7Q!Gȿdםn]xBs̰V[۳vfy~gޝm8yVo[9EyNiI8j];.-)3|]wf"3<^ ~%_yjs諪u揮fv>O}jjW^85WT3q<{?z5ӯإRt9pj&~?y#jדּXy'_qmf~bC>;j7f{-?c|5k7xuwς?w'U #ZcծiٯZh;ˣ~~P-Xa۪]߮~j~u Bork}T-t?g/vo^xe'tW PfZ" ϼ~t_;nYy>ZxO~6lPO[r V-6k,\7nP-F|~[;~"yxʿG<ڊwl\qG~-")t_O7yeyjVZe??U-2պP-:WV-:S-͋sKE="~.rs"=_E,ZtE_W {E5xV(>x}}غ/u/6Gѣ(Ͽg_b)Yl-oYj5 ;b7u~ZC律=?_U|u]epKe-;wa\Xɸ7sղWW~ݴW-=9ǪgG]-xlj{U?.l߶_'Z>usgU;EZ׊U-vj9gwAr?\lXN~^j9i>^XbZni{ P.[pWv%L{XW-ҫn /~:j\|Ro媖V<׭ \u9|U[.ЅZ.Nyn_/V~pi=x۳{5Xvm,|ֻijѯ^˳򵵪E(_CB:#4xGk V?~ɋĨ< O(2˂ t^fߎZf\ZC|,$=hr=~Wk>R='wf|?|{>+|2W_~ī랏_rswpݱ=x ?{xO~1_'ܿ[=9O|z ?WgϧE>{>喭;Wӫ|:e.t:|`ўO[pI';#NDdTz|ݩ~GگEv†s~Ǟy Wܐkz>*ѐng^hoimqAz/D/Úw_=_\Z|qο>tz(z?}oşO=___|{{~&|Zω=K3Qxզ~ɖ=u_O=/fĢ=E}Wgr 竳n[?=_]#ۮuSqgbW׹߹Z]o4{&?e{&^Wl3It4+g͞I%$:Lr{&iDIg5c==vJz&J&z}3ߪWl3ƩNw_Lt'g뙤L'I'Indl?=t㞯_z_0g3wגg^׹gSɒI8v}z&}zknd=;k]z&K&|,N>}}m ٲOImߜr蹽}Omvn諾޾þ%[O8}J>W=#S|sԘ[ro[َؽ[{٤m3Y2y 4=Xj[j=$wdǿU_淳Znz򇗯]Iqm|!|b'zY{>}?}>z?-oz>u{>}>>83w]tAk߻ٸO7pl0 ďOoH?9O~׬H{ŸNssGGw6x5߼u/:Q7N^R-aϫ /?S{^}_GcdWƞj+]z,y}yg^֯ߞg&<ֿyNX穏Y=yKsϭ=OL}Yzӯt'vcκiOnyuG_פ%\\ȎG;zvj+}W=;Uv~65^xpM|b;^]af׽OcǛ;?>O-]যCߥI_8'蘰5ף1a͞lODŽ"'t|Pb;>b_:>/xSoݺwrjO>c ?Ϫ>tLk1;y;&;W䁟rԽt|-z~S`7smuow<@ǷW<+NlX*}W-[7罳M3Uo~w[g=3ϩ)?ׅ0JU'UWۦOYGW?bVm%M}Sj?U ZPp< oϸKՌ~ՌƏ7Q?W T2c5peg\pϜ?~z\j{~urɗmV_ώ[ _}=UyԀT?y:\3Icv;y̳w^T};߻j%?f)W1W%>RY~T?}?_C~rnW~\U?ֶ/m/v=v=*f~q;۞yyvMqY6Quї1[ۿ+/rGߺh;Jv|u+~ߪoG~UTau~~/qCVo},1,y1;~+~]~ Tc?Wo>u߽jҏEo=3:L~_yNǗ|ǘe9yw܎wwS^x?1u;S#/Kj!;A_N~}w nnz{;sqGV~g%o9c]Nrݒsp /*8j;{qm~w].gƷs=s}UαxJɡlT$8̱ңc|m͛c[e"9;H?P9[gx~g>}GWwlt[>P]Wcv>gԯTY{nΟJqNK޵ev^zaLk{7;肺~,~KfܴsO vnXظ-׹aɧvi%_YӺޮ+ `֪sYs諼hg{ag:4sY_u>.]EjMYsp#vmHE.;ǂ)vsWY%΅Թ`ǡ[~Хc/Y~A_,v~Qu-~MmIߪz{~]U_=>/zYIz}tyf~u骺OnUum:Ϯ.*{` -~Zu΀VshU}`?:|uV"ՉPhuBS]N,~Oub_ËUVΛEw_qθΣUKǍ8b/:v+=qe:;㛏[uWq`CNCK~tbU5?Yו|uvAm7+>> 츾/ynt;힎\9juï<ߴ'nRSOyz\u<A}kWoG1RLb?:?$T]|8\j,ůf-8^]k5|b߫yV{ZSm5ybZU|5Gߪ92~9}fq\gP{_ >TiݳUY,Yu]f~&}4S٥7K(x_U;1p'T=>WA5ou~>_cĔZRW0WkY^Ӿۭ/^g{ыU{U{?U+;VTnrU{XuTmTYo@ C%7 /N]X[ku|D%>/v@GU/ݮ+vK'nQN}?Q=\ ŮVO;[=Uiُg_\I_U=Э˜\U=/=|G'ҫIE?;g))|\~;6c+:W=(x)?ݔڹVεK|׹΢VO)umP#u;7*vg%ӹe?[ڪ}$[4c/ :-vP!?/wWWWE:U7Ty\cKy ctr,Wq;NUESQw^Xp.-qW;/-zy+uKRǗN9?tYʩ : ?OVKQ4.yU_WRW|~䁢wȏzsWu %Bc>o.>Qpb:Q$Oow'?_qP@u_=C}cʯ|EO|Czzb(􍂯oxb:ߗ?M\K}1G (85ff,z8fFŋOqc~~gz7DK+^\F勽3瘶—1mC+ﶂEnjT^d0+?}Lcg)z9f]ՔV[YW^㍥G=/&zVmW-|Ym1} Tq-{c)c;c廏c5fiuW^h=i=U=hk+굔X₩º֬unpեr^WǬ|{Dy*O+d[Q' f ՉnyNl_Om]qþC) pox%x`oes?b9V]6lް˳/N,,A~Vm^qTQܣ ,~}EvXv隕-fҾvotնOq۔omz~mv#픹fxӯ>bG3x~~^ڰ~[Ԥ%kmS)"mg_q8[~n|զi۾4tUS_նKikeJX~;7;֍Myɯڶ(MoNmҽUۖ}h/mm(mnm*m #']T{q?~VԢmFh[uwHwv1#mg2/]\Sܵsv~v<\v'_ōnKxvqujiknpvUmjmT=E-vOiGmmwpΓF=ޱh;EOJx=XM*mvu}>Ͻ} -qվ`1YN\/P/U۾L_c˪Ži_Ch_}BUJ8ܾJ ۫h,m:bnߣ+о.~j?JګguyE+aEy+0~7}rg>s~?;v?' U\r3_s>o{E.l?!/ec׾Oq+ *rԾWvo}l?[OO*aOIp_W%~ZqG{ǽ3s~i+J~Kћ[q\Uڽ%wmGo\rjGLI?숝jgioiڿ,>ÿMO*f}ҽ}/ 3\a`I0sikjY+ ZW?t ^3|YJ9oYJj'?C={w޷Rz[kUg=n+0/]]xҮ4Wo(7Jn\(Rr|e  ϛg{KuVqgON(!p}漏ֺޕp}\chI_#Ώ$onXz{s=Z׎ouW[pVōmRW}6rQu_S_C|[C__3;p)cEE&.M*z6I=Ii݇^^T='L'W{׿nto-37uznчî d '.e=dov+i6uڪlemkpm· ?6)ny_ DnWҍmˎ\ئwʓm\k=nw۫{-zҶֳ6Q,޶_ڱmoSMm\;'36-׶ [V:=E} /rv#KX&\o;R~Б# k 貎~u_ߗ2aKӥY]Jt]ZKK뺒V캿]wٮRRz˺(v͒vz1TGI?v*Yu_i]}/vsg>-8{ߟcG 8hr.v|RߺTﺯO]ŮtYG]w;K[GWo.uݬ+餮JڒR9ʒvﺲcו%uEú./|CIw]R+'mu+=u|It)#f~s=JZKr.]{=ګq>%=ԵֽW.uY҉]{X9ϮſO#xmצ%Ӣ7]?ڶ]uX8qî|vI_-i.ǺV-iz"o]EѢV5|[Wg}vPa~X'w}@%REKk[5uY%'*u\V̒ vTºf\Kή >v ,qo?84b~V؏8Vޱ9^߱.`? }ط_<Ҟ3bǾQ7s}?طKz{%փ:^+~ؗ^}؋/ruKs%=;[o/|xiD>Qp|S2Vmc.x5c+?BDZϖ2g[C~^?Og }>W5RXpKe$3;Хxr~%5K)/u*9T.Pi[c)n]+/XеkED'] khISw)޵|iZN̲w.vKe.Yt-UPRt͵cIw-}ڷ}[u-#=]V|] FZM@t]kw(qqbUյWfԖڵKûv[ֹwE5Nߏ+{8A]{ ,zӵ}}K9>:;,1mwwUgM{}ߦ7\-v{,7p5M'>ӫa-^vEѵa,a.::Fqj؟ ]̌ }5 .*5삩#հ3 ;憝T0zخŷn Sl>l ]w>#?uǰΓGdXtoJVj3Պo4Vba]hؘk$F̰Jvآ3-z:g-ЯĊC{}؇*W3ĒC):T1Ћ=T[ =_j%;Tt Njyb?-dw>oCj}%~PJZbcKN`hGMTrCW,PaP A٢bK.s ~Oj=K=R;HέToh!w>=yO!Q!-Pb!=Cn.i5/k#Ր\ 9{ȑeK!m1d9VC/!! r?~磋:`Zb!g;orV 9l0DC([ kj5;TC^ڿXPlЙHYEKrhkYPj?CGЎǬwv]nJָ/wV5Ƿ|Ϫ?/i5tmYx:7o߶E5t7{5!,$oG?xbgzܱ7=;CQ75C5aGou?\?G7rf߼ؚUC->2fS[ǫ w>zo\4lŸa0 a6l1ltm S0mI1L5a:a}vpaG=OS ;î*9aj cS5ekaZ*[.Rup[/ٺ޳Ur%Fim-zܪ շuxJnuŒm^putjJU9_NZJN >\Z&[,9VmӪS]EZ,wkTgJUbilU |l؇Ŕ[F9Kmhi)m[ы6j[}%ݶouпm7qg~jXJ6۾;襁%|Wm-qwt ZCT#k[jCnU{4ǙZV?^4"ж酷pUu۹~ϫڎ]7ׯ[ֶu k|N|7Wmsm?Un'y~um[WڲնʯnK m?vv3ӎz&uD׶r)MU56/zvh9+vXIIEZ-uZ-y:؅֓ _[UmUb޺ۡZ--vMDǍ$kh]]]Vlʟk]r{# .%ےc}ثRbaiسTKpiKaYkî{[?˿WQUf}rLUS-v@Ʌ(ځ=ԪvHE+9Zk]FSj(WQ %P;j':gNB_\Dlq%QXjk7 Ejj٬ݨMߤu(WZE 5Rk%PS.vwzBjZV-Y{m흒W{}}?;OK _vwrn2v+qDwŰ{@YGr:ju장v=Cj"s@\E޻)AŲ[#A FB:^"U;^_ u/Tr 8{"'Ky^|wQn;K-{lW/9utg[9Pd%ڭќMwkt{Ӓy=woSpE~+{Rpj{y>-}\ė3vC%ےS>K|>:)gE?.?}rO!uT[-jVK%7ܭC^37T:WUwJUaSv2QVeQrg=9i׳*kܾc}zsDs<k֏{;%[Ω^|9Kou*.Tng?_xYݻׯ[lw]FkZAR>f>Izs*}bwPjh>k*nՈ*~R1%GޭJxGܖV}qJmOݿ*~Lp2r}bWt$,=Ez}ub7.P~U{_]g_rJ-v߫dR޽N5ݽKiE(t҇Hnw)Gz~4w-~h[5nmн{-~Xnmн/m{Aխ{k;_]:.-Ov:s?~^<+Tu+Gݭt}s-uqwߓ.EKW׏Ӆ߭uUw| 8f﫺g?gl?-^yR#vmҐUmo>wRXj>M.Wmr)׾.صpǐjߖ4j>zחssl}ßGѳ9`fw`[Ek+T{Ԉj/6bѳjgL3kZZ큒ϪiԨvjw\YڝEkVjw}G4Q\vsn*|Tj >:7}/1AKK~vjtXSX;sOsغbk߸X~%+׿;~˺XmYiīǗh)3V+>WW;U)5ӵcpxB\M#B ֎,OM~M~aZ4TuT߿CM[|v(nmm-\tܼKMzJmOjI?6-5Bm(GؠUDm'Qj7WS:zWj땼Hm=:9RӬ+^W=/H#|mU辽vj;_|LmW]wR;UMmoCy^[7I֞˂Nc]4r^7߰%w4`je^a%0Y&oo{FG^|qO}}軋/2K\6v|O߷W7{ǏT2zgNɞcѭ{0ej>W/YVj|G|y'WOxGWhafta5ڌgi5k}[r_pQӨϫQSv~uWQ'O:|6}=ur5"O~5߿a5#nV+ulyQG>Q-ڧϨ vڦèwЯQ[è-JmiOsڤaԏ|h~I5jRyQ>?3[tThϽըuW?`y/FYrTk5ͨ߫;R?.<Q#gF-WrP-5QK9[F[h5gQsnsF-/|Q5j .x469-G^}dKMfըT_ȉ ?Fj{M^[|l~qKFRr#O*z5WF/I|Z㑫OT#W)HG-9rHG>#|_r5rG1ψjۥ2Bz[Gҏ>B\ڈ-ӈJma)ɥ3B&#)yj#T#Q\P̈Ո%KfeaF,Pj4#պ,r;bRv,>Js|~[5 J|ֆPrWbz.>G U3/a88 Lf$$& @38)-.A{8 VJ)E] E}kߚIާ߿ɳ9gٺv| =*Xؖ,/QXǨp@D.0-<e-oyhyx@Yl[Dz ݭtweE!JŽ&qQ١ Qo))a3=Α#Սuoyc-,WΖÖUZ-7gc ,bi_ jG0#(p,d}Eo[e,": iyUQYGQ9nQ91(I7p%q]Q~IqX6by>;Ԯ4.9&rMO'o(E* raHtx:ef ۈKw**} fVYhPQr:JH*_T;ߍ߶v:w 53qD52Q#v[XE:C*{sLЙygȒQNZ%Z[EX*:,h+Z_tY%.4Z|7/}qVͩ]Eݎnmt#j%N(ZѢ%2ZlG'3wgc?3zR{:Zw%~6ډ{OG. .g1ɽc:DWRHU1;O4zn*)=曞ɿƩ14]TLOT1=smb~xNV1@lI9|Pq)5O81WAGbA]Y4G7+sb@-[cdo3u|omycDB*3gI|.+cLb?qG0cCD.SqV8+4sqqrR೸&O"wHp}<7n!lqb[,;eȈ+(ղ{L7VbDrZ։< yfig|wD"לӰ'.\,י݋{[8`,I||ukqd!?=^Zs=G}ٰ \LJC_Jg|+GOSUqWrT]b3\jؙT*~:X^?`%oݓr:kZI?~U!/Ǿ\w..#68dZ@ފrE|^kCנ"(/%|Sne->7g|f/;n`]㮋B[ x1?'y2ITioJ#IaHjVhC{X79Fخ=Ļ$5yCؒ&@tgh!d,I/TaQ)xOR'x8)JtR⾢E}so]lyiKOYW$HxŌ;/G\ ~$\;bH=Uħ$es_4?Q$>%QWW;J05wxZ% VBJ%+_ 07?W)Rvy߳}P)qQ`{OXďGQ/C~2P !) M&ـ$N')'M$o*)Òra]>RI/3ѡQ/x2į_RB%i?US'J㺋xW&?eG 瀌͛T[)z$)+wljW7Wr*FN**+1˷M]tkxIb X Tgt/8W߅o %.rEyiWB3oRLw;kTJY;^HC^I xFĹO<60c94c!Q)XWTo%w:8_ZE*q KO%eo,|Փ8%oG~_$&s%.exʴD8I\,n?-ʥmjo뭑yxJIK>+$ng;-X:iwY$==䉫/qq}{둸{/G|A%lJ{$nI%A\;`J<[aN\/^V|ɺx [~5qCĉViܮxDe}~8e=&"q^HRF6%=ƕ y/q$lĉ y=qs/\x zrOHdge? 𜯋/I{M-qt!$^Y &ހF v%ކ-,ć=y|#N$LbC$IK$>YI `х-4r{җ,z1o\E Л$U8Jbӭ$*gnz!y/Jj 9.5Imە$y:Z佤b*6߮/R$ɵII]$]u$~7i/IwO)>#4>I GI˓Pl+D|~RJǤWmjMgT=-yA& L8M&7$_/$0[OJ*}~F" >>\FQ|2?ܾ[SIzh j j@/|=ߓqG|AX+>-| |]cկ:N(ރs9IeyU*{WKt/v-;ԟH_D_Ҷ~,'?$-7!9$Fc u87uہaUj>?3CqF|OΈOY7 %|Az%]n9M:'>n42IWķIMU9.<˰]I*]_Ҙ&]߈9AЭ4pZo}Qc3 *M*y?[T.Y)Y%ZΗY$&Z3AYQ$gi L-9lxQI@K3iaTgIS|{}D1Hg "Aɯ?-ח>esؗ)?2Q` l^q %i.UЩ3Af+^Ų*qn(*Gv ӇJ!齝RbX=?4Um]f_N|*7 HuT+\[;Ҩ>b?]ơ.$O㙩.kqTq{ǓS|waN u*up|:=g~MGl7Ux3|uGAT;qR9꠵T0נHggżhS]F9hǡu]3!˞_#uh|MjFnºTjki]%AasFҳnk"vT&{jEZ?4Ξzz.f7+g x6\Yi}_?5?Oh={Ӄם6Kߝi"O2wu$ЯءR[ywdٺn>>9ZO5b޹{ Kjno%B>έ* 9 *(A*C|wDee3R+ez3Gr] 5UAI+Bj n*92JF\s;R; ' cCɢ̧֦6Q PBXE{eN#RwS{ZHbG#EYBީ|=w-78ЗڻpTR,%;e@ J ۍL3>, eJL~9*~y+mH/hVy nPI_H]]'4f+wAUp ޲8QS/NTgV>" $*τ=k]ƦDi,8Qew=}ߋ#{i ìa$)ĺRݛ?2}~a!o`>| Pڰᴙ6zߙ)a.ٶݾNi֧~tVIݶr귏Q=],~X̊b Iϩ7gn8t3p Ǐm/]^9Jߘ'{3o hL*0LǙL?RaJzrj_N1&,\H`%;yYn1!ӗybg'NCܜOFL ]Y~eP?V( L6=sr TUzs`n rttDD3ż {o3veh]Ux0u[NӋD;3D߱ Ezp:|}'A^a+n{,"d_G_"YHc%p6p e7pYx۩SNɜsRaT"! b D$  s֜`Qpr`7R(~:}7)> cD*hJZ~@Yb0wGmIuBzu 7gSMYh%0Ջ0LYxfSdjo k3̲9u_4K0MooAx/e&տt\Sӟe7Py4~AdWR޻I=G ySG0Ds6c !}IkҀ 8l$=$vԳ> b S4VVJGӇA6@,~19}hþpɓؒNϓYkFc2tdΦ@둙4J'7= rfIB:"FSGP4΁!ΦSoz3`g,T '#+]0fSE9hS^?:(kNN)FOKSa PӐ#N]ZtVXvU'].GycA[ubU:v*иI*X8Qበ6>WU8%~!G<@v /wǷT$=Cߕbǻ.΁&~b1@ a-chQkbe5,89tC؄1v+ŬLM/xID9,AfP?i캰JN@k6P{D28՟,@I6DM<ohKưQ= a5=Qz=Mv=}Y8@fY6L.\}>9\nܿI `1/ne po84e ;a-azsQck,YpB.cp*4 f=_ag`z~D2djW C(NMe,S"zO뽂cԖJ`LR 8&+|%,MDYB/Upna'EBrp!="ՙw|n@Hqʑ,SL4R #by q_q̆c2vR" 7F=~7:QGO{QLY3^= 3Y>z$C@(R~OPyv=%3GNh(K):¹`{"F3?- 0,2 ^W)alH܎z,@SA0UpIhWB[gHUY&sB 68 dଜB` Ή"dgF  e*3~.|:,0CR {#{Bޠ~Qgosq,;²2ф A N y='Zbo9/.+S:yA6i졃|P)͞8l֒(gݾDDjksTL:]?Du@iy(~ tX˱زOk.NAu5v0 f~t jSt(}JeɿS`_ S _r;o_ q؁}ޓd@Ϗz*DH ڻ&vb;:akս., !fByq>L}dJN0JN$J|^,bOC4P3h Ёb;}H&Z3caļ̺ kpvg{r"*spcB2Ew?R9 0Ne$d`N¤_2%8K\~^MϢ.ZRX\p p #Tc7M40A|@%ĀOAGc>A; `6<tŢ9Z۠6[H HˠoWrf`Ƀ**z>A=gaYVf~#G~7?3NEx@]!f,SyIw:]R;v;gh{te՛2e K[B5y˗Erw3(gn'߳rMӟzƟV~}g~i]G4ϛcYCϺ}Y)HHkȆog#8&5R{T"IP]p .j W] B 4}b) ʹ;<zIMg2M` YR.!? _{},TH+8RGX4u}Ts /3NF6:ߘ}]Ű9/: zBd>"c֫*TpH|}W/1`D1yy-`{P| hT*;At fHVzTOy(넑`}|/ooG{9?z=~6Z@ecԮoU_,6.,@W и^(:u$>af+c,PrtO3[6R{"bp>ZG9;`~==9` gˤ[MkL0K֠Aode2zUHnvNKwY@7~ N`]fh^'Г}mF">x8}y"_J' "~ʣ'swwxs>Fc}{njF'gmbt\Je0lA~*!b0'TOx'/A=̰>s1F[P ^꿔8"@G^?F*K 7R #n AXDf'(+Օe6znUu4M;6Wo| luPf:EB.i\3a 4h Lp63: ]} 'gG^>Efb^+=I|?_w&XΚlF'FUϿY9ouVW,{^|s21z8*OуXAqܔrv%20S_4üqaaQTvaUBc˻N'U_(a c!`{Tl^ Ϟ\zw$aZQŬIqʮfA9WI .S1q9w5wQJi~VY%EǪ#zNcqӺf -n0GƫAx$La8v&s4lu'N$_~ b W |kh'g~JW%~p@+spz H}Y5ITkvcߧʱzyG9]< 0ŸĎAl u42I2Hl q i3M7&z2Q!~gb]5@ϐqMgL2]t6fRl"~g0~3Sbm2HlGsS'3qUKל񰨸_:ע}'pׅ?0%oz Z oD5V-p[*y+oDZ+1IQ?wrd:%xlbw-&;+,><#&3Γz?!r^ϰq kLn^>`I^9!&K) ʾ& Z,WҼoKgWH9"狠|/YGbOB;oyR9v q_`L5Rڦ]|^SKs/5T   мR2@'xZz𮴣aBNU>_k|chČYeL!XΘ ۈ8y%$z. ;{]5Mhaj'B2Y3(<܍qw TD;g`6Vd 94`1 =!An\͌q-kF0~7n< p%֒1z} Mǜ*P=8juc+\1E%D0JiMCA9_cpZc jM8 (\k[= $ (Ѱʒ [ \fM=^<g $]Kͯև9zrWu(_I(-+$@yUf2=9ٯқ$ \憈5>qeAEe@4Ky$¡UTwyTQP-Ca(< ~}65$rAoLc*%ιrz%<~O_y%@o^WYիu|,UFR;KUa͏ԎQg/_fQ]c~*܍cdq.dcNJ<'G{O~S- &V¼;P O"›*̜ Mj?H;#DR׳ ${3=s5Q곪áE8*eDGG~#& Nxg'ȟ<ꩁ? qT" DA4732Ưs~t#<_ *iR=1gCy/h׀xo󀆕S;=nnsG4ٶJwA4N`^p*07!yڜ v@an wL3;**scU'#fP P-9HEWV).EB5gu\yV|0PtwO2mfM;NXM_QpD(y# \+w'Ms4d|B&LJ}LG~5=70C I7YꕀJڤ~1x/Ja22CCCn8DUes"PT$iXLa 0eIKVtdfzϩ9UNM>Muث~ojsS3Wm`J4Gkj۾=Tim U1TAͦd(L|5Gȩq0i-q'FkS 3>!(&Zc)D `F1q3”mx& a;C9?}!#*|rɌYя(=(XNkvҼÐ'.ExgC12b1m muO U~=JEqcS~߈-L Ʀƚ/`a1tјӯ1(#>̧gF1$ w@<H aj6 A谡= kB'ٚm^sCf:@[~C~\G-j5}8z/q~?>j*nd3ݢ~!;p5#נ~ZOWl[~Ϣsw<;9}?r&G:n,i6g*CIS ^z[u8Wo6XT䩼oT 6ZhjaɔuӕFY6AX@_MyHiuЩJk ֒M#("Pkzf =iQ V'YZ}q>LZ=pz7V#&"T8F Vme[{U0hUJJqU}RT 2.dv &K}ZdyƗJH\[Il@,=],uzྤǼ'Mv%[~#YtyyW\+k T:r)R\(J&mC4S=tfؕ8N̺RI[O(LIv{MDzy^rJcG:'E4-qgD>#̛w$P)֊oK.\RWUo4v-+AX!;s4\\z/`xq,`3wdpC< s٤Nq#3` LgLL `qN թqL 0 ;dzkxQ? C7N^1YwxwOvUͶ(稍.L/`jvv`)oYnMOt8h<=ذT==FO?DyuN>~h6?n8r^iw%_+mVJ[Ǯu4^\ :0ޤ:2u=.]\?q„yz2tҕ-+&}ݯVG\<.Wcco #T4#شO!xGJ|U ?JrR5M\9 9-iKn6Otɇ0 9-sZFZϩPdM9EI*vK_NcOA7AG%p=2aZRi9?ϋ}J#QzIGjH0YYNqTjkurW +[ .&EV#󭅴ZMk)5ࢧo?KĎ%!d|;p#3d=a* %iIIHF_-H_k67 .ZsoҪVM֐י~o,|hS'J⫙nrӪAsaW j-@CD} ! ] x}zW$CO|KR2yEN Jm0Pm0aڗA௴Tk" 4ሑՆ7Ŵaߏ@mF2JSSCM@:_䋙Z]_zŪoFv sU{*rb9M/$}e^1X:]oKX@o0&#wp EXT@40[f0kt4!s f#=6KYX#2W]r{0sYz t"F@K<|ϳc$c-ϬI%@@~BY?x|oTʹ ،5@omk^sh-ӿ | EhW$U< Xb16.y_QϋA"}CAЬC>|Vz[ׯs/˱4^=dj\b Xs;2gI2a%d `+C_/_^ W ֯.~C_,~#[dl~/LzLi'rgbɄ2 GгixNMEI< K 1(|*IK<#q7Lx B'٣ Կ{%8DU}'*/ɒ>=FBC(1Y `_̷dltE;͂G,L{M";TFFMmh=h6ilhSE"`m"r/k qn`js +̞h C\mV7 g/:ʹ8Bg4/hȴ"I y8G"  t(<4]#Jσ _sԃYҥ$59!hCXB~BsL] #i)H#~G04)ȁI.m K4NhuHԞ]xF^0XZ"(Wkc陴"7 ^shfC&uςI|!_~W𥎙קk$g}SAZ=d CXte]gK.]N^k6X2&_%>fw|GQ)͖< ֔[R?ߚDe]Q_>iM.ӚB}+fbm%od"(Y눠JM4ZH"9EЮ{jgk< h>NB4IXh!6)ȫMb=(޾~=P5 &AMf =c*,-4t9? Y S9~STmh.$Z['*K}@A9_e2u4_ϬMMǓ%];"2ǐ J;-s\k]eL犬XhU%-K9\>b<˟vsM42hs^{g~GP.楿K.Yns_&B9 |zahOe 8`wahbVJxjJhTĐswVt$t/TxuV1- Ŵrܪӏ=]YUDL1zg~둊)<׭}{vc7wv>e 41UGh|PLiC CD^^IHMHxRy|dyȠXa%V CV̖dNBgLÚJ?'a.L O„Y;H`9&0A`3!'.TO":}u/G%d kmiM}Ք{$Q?N- <tO'\nTcJ| DM;!ɶ٘(x(&mfH/g˄~%)%VOr9}݇Ó>AvKOSTLy6+{~ *иqd gCBK1Ly4Q8 #aK:/\nƝrCTe Ԗ32xvPPq.[g*o0!ÌPc Ɲ'uqrU J,Ѽy[^=]C@Q٘OR0zyW#I{3wWX"}b*xROB2ϛ*|j@3`}:1LƝ l*!C #^k * F*+l ]J-'u5m aĞa5f~OeK;7ak(^ $ ELQ4O& Ս)m˅Wnu/k; +ǛI::?a?Zr1j ךθhss}#J*6gT=nS!!Wތ>nSInS̝}~3n6m[+ryWlbf/d[*B>)O?1 8f!5cx91g1Iy^n[92٨X# ?\)E w61fO6쇆c3F/7`xQ&|W-箺M粽IKLK/χFOջHz,O9;"Xw?7v66r!m.qm6;G u_zlWEjݨCHkJ/mB5_9O+z&{^VפgmDUlj`p{'{27\N{(GLT|3#SXEx6j?c8:! x;^Fxj}pTuÅCrAo+<>rg&v#Ł58peR?p 7_qrz~po%h/pe]%m[>ۿZKuOS*y :Ryb_azwK<*goD8{K&x8ަR8S$iV$B! 1^~-༓gO6MХE6bvssISncEW.l_plV팝96nH绞nEOiX>;9t2mػAirn7P9>wfWߤyƑ~q_~[ξU2Pvwz\N)JV:t?n,nk'mƁ1YV݆g.F]bϘ" Ry*׼#O_{.igw"}ܥ_{\ƤBK՘kGyu&vKDlYwT>'l2ze(Ke9b :ôU P7(=mIn~73`BG n\4η}Dq=RCWR u67>T~Ϗ]ްTvTσJ[©TVvb7 -r<ڈ&..}'쳖C;5]|rkenw|yV{q5W 궙v"Xb~hr[?hw>bL򌤒~o*TuWk>js=ʹ>#~;u]4̯hZz6$JqOyw"=miAzUKTi7T,TwYEG-Ke b,5Lú͗-"nE 0܅_pTs zzwe *Zve=Yu)j=3>zm*6A%ʾ~\q}yzց9d~lIR݅}ǟBs[tR_w*q%a ͣS/Ra?NQ|Z޾*y?Q)pVݩ9;ѳ[oKg/%q_;7R1.;qpGeIj^(Ӓ~O݆w9*\ez_ =W=ttcz:ﺜ}ywm?o<E3z]O~7>k ~mg3S+luPsNy,Oy9n43C.QiHw<7}x_7KJfыSKLH\>JC|;csLoն+탎<=vMo?>`݋c_46&T> 7wD/D<$z gA5{&Q?fv~w$31lsB쵌>Mͳ04ڸ;w7 nדuLc3eG_ޡ.\uڽ캻.l|LPQ*v"V[Wi"=xY ?.EOraz@ˆkHjXޯ93c73ĺKtu،$uw׉N̲6:auwJ/6u|T?f7ιM_{D}ܦr}K4 .zSbԊ%1(ͳ:W )C~LY]O EtABwM+05Ps!I*-NwEW\Mg8_B2nMsrij:T^g>3)Tqx&R{ * dY#-.Gk*~0ͺb}=]yKӕ e7Y6玭.cp?U_Ԯv\匫~5z_b.5ϓ""C1[LJW?J:ޢpMOߏ2=ljL#ǐ4ޠ%@ߐXWۤ톩J4ƿq1mn1׫< \p=*N]7r/ )s{:EP)l~ټQރ~7> z>\M8AY'Ӽ_C5e*0Z!8M+RA8@d>e&3]@u 4h;Eum 5=?Zjziz~?i;STqLX3_[_?ku)=g{?QrnU~Ӿ5b>}xԏQ*E']$ /\-47sBe}%Z2i^o3Fk~?:u_h]Kx_0[|hǍ7OMx6/=<tEeI~N'W MͰVPZj#)[1h,o*S*~4*A5^\ڇC _L'N0i_3\谨rW|~hW@p!ŁïVvV7cƦ4k#o 1=i*MeL?r_Y)L7 $iߘT˷oL{Ǚ oglS+~?o.3=[gB/Jffggv33@gur*wC6xLzU/ü&˻Oh.8Jc}^>Oge<&߼|AM9|wѦUbYϹ[gZz@0A3 u+KC_~# X^{Ȼ~bk!ԅsW;=}_YRC^+ '_{\'(91kƁsc;HN~=1eⷲos_C_p_cyQ\;1cƯ@ύ_A?kJxM/zva= E?0k$< y zLHozߒ CSG^)cI Byh+Mc|&Sd,OϨO*{Oz:cݘpl}1}fѫ&yk>MX|=TeVx&|!'. c?NJUvzXy]1ot_e.Uz\zS^S\a7v"M(}W~|%9Bgǻ%n.zief-g%AXr?%wC/Yr)%B_r a%6wl/zڒ,)uK^g}4?MS#⃓CkwO;h܁]/B ٔaya(z~*_(9J1K@CJd-E`))va`)A-ٜG> &9Jnb9%'AY!Two۝"aɬg|%>8;NkQmvZAO~xw|^0/ Gr' к}Q Ke2;7TwA,vb(.;!W;YbGvba/)rZc[i.xXH}/Vgb'+t.KTp~}Yrunm*씪r6@1"MN )2z:~$"ٜ5.94\_Lk@kڬP@rFKhD9Hp.\r%IТK~N@2K3N+!׹Gg16*"yKY"r},(D䕳GK%w/|Ù<IZ9r!j'/{S::3HN-# Igx*۩|Jsi:/a"B+#וFNzgh~fP}6, qA9#˙E"׃fF3E*9òɵbأI%gnB['"5y$7Wtz:܈lu˵ƛ ΜzE!93s4Lߙ̜ʴأyF+\ЯE[A%r:>C{^t׮w-gĝ>rmk ufǓ r}sAN8kx;k hOyxMG '#D:"7!""!'.rh:nbW.h4+M_Dn>ǙrQy ד:sdjS8kzD9p{En7ݱ8v c%"+XF%۱}Hyp|' \v}sz4}k8[Y& Tz3ZڼiQҎ訆]upÅkr"ڑHQG"tTF3ys#B3S{e>0kG΁Ì\3"&DJ: (Qptĥ`ppre\BTr| 8/8r0:x]^I: #Q9YŐQ3/@WŅRǛT E(r:L0#a6{D:5`F3ΈK%@zZ_AG~{>t9q;_xt"ّ]2}]r5츆ё9)Ȇdȅ eh\9BnF+C[,ȕjxUh,_^쏑~ۈ u[Dm?d<sޖ9ջX!yԣv.~9"=@4cWrOyhD'頻!1" Ym4oV_*Ap쏐׆zG*+Ιgy!g*>J&tx~k_qyDxOU~x~șiϑ4~߇ AXoa8qmFofd\oNԻ3}9e=7о 훀 6)x7?)Lfoye]w"ݾr]gnC(uJ"Ϯ_MHjz9:y'q͸};گ9h?^'~Ő;u;+I^IO?OÑ~gm̗PW݌u|vun ۿq;wMN︦~ |ι(rۏ.DIA`myܞ4 m엘Qe~}K :et~*rwo%?lS}?߲߃îe{0w폐|ПLȄǑY3ӑ9n/:>G.\5\o GtzL^seGndp 6sFuGN#ĚbNn5ɍ; GD3"uȎBH(~3!Cw!/>qp%9Qӎn[yr<;JI.7U#aFNGGhuTB&GMG2 bÝf8"/sO@hv9[OFȐh,t28 #[j2jJ*2Y8|98jwá 1N 2;e#>}g}v$###YddpXaEdwC'7~y^~kdpĵ.,S'r;zJ xS9KC$󝄌N}Y7rcZ9~ڗٷ #%?COXt^yj%"R+|*!O<,]r,±Xu12-9 t'9% c2i]r^/rg8A7pckDMΥ\9|tTT-9 cV1.[@N|o@؍%Q{{qeE~;+"qH!gCB aC){xΡu8|}'wx=& 9'D%]CZudp\Gd㦬M 7D!CD!t?-;O =drhOq ODz" 3}| r: Ö㉜șx܎GB/"#CȰx t/d(Pk^}ʁ9xW+dpw~_ {ܺgg0xt=G.+zFz66~~ a@=J$p\Eߙsy}/)9,y@Ȁ,‘4dN3,zOӜfW;AM#̿Wڏz8ArG|g#Ar;\V[/搗-.w 򀳓TXyvC6g7n;;AvvA^ ggrAgGW1;YD2~izO1gYCP}9LBt'w Md~6\3t场#a/?/ۋf5ABѳL㸇O߱6i^;E&WOXݝ7g"!sB37cqs,ӌsDY)?B 9g ^9͙Tr;g=6l|c˳2:NA:{5\q=s{ZyL霏z<N^jo<6t~'z,c1rFF~G茠=>#ו 60W..\6sy +~H*aCq`kwFŏE)W>1ϼNr}>tG{[oލ>ǽJq+?uqpXqOF6SW<`Biyz6(rwc^/S6 w(Gu?_UQ5ξy}LEUߜF%"FzkX"wLC'Pq&Q{zDioUjsNH/QlX\!?#e&K8*Օߡ8,)3,҄vd?X{N>NuU~/ ?WbpD*eUL Uo q^LjG ,&ߒIϟϔ}ս]ڇ ZP2XRGH[jم-{bZ#vNp:tj!O_G6mCfzFsyƕ@x!oH*aScbkP(I\#Ne RRM$,,\,=3OGݬx~ f9h\0* 7} a*|?H*\%cOm?W8ߎ4bF]F%,L 0]++ ]q+7ή\U}N{FJ{.>2԰)U>4ߞ/o~|Ω Btg ~*7Yҁƙ3Ch_!+zF/:>?2Nl{D y>\Fce3pEj2+B>ۗM w&#̥+؇ѿQ\q0. $tUyVPܺ*!or9ci*éU _r% L() J!K5O\S eMjP» iP>ɹ%Q%,M.NSROY~5!_r*1X_K+^z.Tsgc(_g"y;ҏT?Fx'pQ +vS TKNA8 8*~J"]JQ5ݰ~;k^黖7Ѹ2a[ m+!nt9&F1D@rK x^Pu@@t:Pt@F:7?OiM%Gk^W-[}?[ch|VtJ6;^ p i͗?[\wZ}8J愼; a# D(3QxS݊K-yQř @(T _JhJ~X8.)1 v"@G ՠ𖖁^#\q2.jHr ~q k(=A6d݇˩iN=qWX6Տ)a?~j0c5$x˜F8 5 k܊\þ޹P)H1 |/\ru"@N`ź~By ,]lh׮ru4(ߡOp׋J6_e`1*.gHbΰ^X `2<+3NBӒ3V&V;*k%%KYPb.Mv~KbhA,׍&}7Tzs?Y1O,!d샿eox = x>m,pcEOLߝb9 ȴm9XXv/@oqnMFqݲ+ ~V|[m|~aY3X"`f/k:g]EEۦj<v{H9-Zz }(wX'b ͻHkށGw.qbG3,^4=7a~ w][txZN͠cy^[B}ܒYcgNoϠ;[|9/*+]*J4VSc Lzg=Xuf4o3ՏYBmbcW*>QpIzW*_] !Dß՞턵l#W[cB钛\ϻZt3!q5Ռ"Qo*PZozpWKF4pz1еm;]mؾMm`otVmOSy]Mm 1Χ!j\cz_}Ʉt6,BxHCQƵUϜꋈw8.j8-ia~;krֹŃPO.H WW񹺜]ڧog,.Gqu~̩ v[Wzvz\c=(aWR6fSꋻ]#M _k0Ҿ?=װ>ڧAgRq3+7 iSq6.UI>QjKpB+I嶤7@tp[N`YtU:)U*GtV:Q}6o摊ecG.W1vwLN77?}?uT쏣/1'Bm^*C8_RyYpw="_=B3VѸ_@PT\vFnjPqe:ktk^jؙ$_6 8w똊$FƸq8q`HJ[jsBU_JT+(G5וU|V9\/β1~gBFGn~DBH4aCgƠAnv /DOSfoXp"9>o Wg2X$̏ K܀*N{HBx8;=~ǿxh_=,}ן1௡R?\7 @(\7p7Wx3n4s;^i#YGD gƄ* o?zJ{ɺ7g{RQ)%:Nc_IRH7: &n2tq3YBKx2S;? |/},#~9DzHY׏?͸yhtƍqW۴`Ԉ]c6nsPj4Ռ/_ r͓v'A7 rTo :zߊkL3QgHv#}iq_'T.NǓ/~Ҿ4..tuT~&뛝;~dFU { W^O#B ]#NٓKJrKh#'|5 W̰Q?38FotqAF`\[p!7s2rPC/;  1YGχ1scD5ٛ2YPAtc,Mt'3Nr~(J 1vdpO 1BGb*;ׇ~*Tz֠Fv588@c/݁7&wЍy1Gdgb< @_y>b?|#! #11XO(6 W7~Ubr68Tx—?a#b>髢^Z棢2EGQ"GcFGF֩K^f?ܻ`:}?\T"`E `Ra*Js5V4L߳) _#2򨼂 |>ioG )AEMsA|#%ՖOxGQ}XFĶ,}*j*'5i4L^b\BFMp5Qoލ3_fߊt~`8c @QX%L9:uigTkIQ{ Gu`Yx)Wxq9ӓ'{hYAHs471DmUnQ[EmY:uO|V2^q>YʊjWWQR{+mD_j͗gVtΞH?pӝ*1ܑ H۵YHf.qJWbk7\{ˊTr9~S*zbS rg ', MpsmDkv]漞zQ@*\m~߀sm`zYPL։{׈)i ϗ[6XZZWKzh=ֳbF@vm>4Օ٘4u*8V_ (ڧ`HULG?gZ෼r->ߏE|e}]r-󖅕k=QG nmf=D.T S \a;|Iώ|s(!5Zl#y|PfH_g֟WԀbQ]\I,N=V>#5\j GxWs15q}ЯjOpwYYALOFxaxPs4~2|p$X*͖6o`a0O1N=؞֣('\D+9vU\sAIWn>_T/{.Kz-LԎ.wxr 0ȕ C[)A{x'=<=jMb=ܩ=όJKK侏 \ItI=.L]WvYkguC=MvpIҨ LkN.ˊGT_r'W\kجsLqpe=w¦8~P;PmtNr%^/=ݸTMۅ]m'4Nqw;`@ہ m'[F΃E_m\|h!pL;xO8kC{0fKtO+s~>y"#Zە L B+U SKN0B 1byۑFĐ7k Qhݦ3M}sLk?ujhh7*g $pqоr6{rzFE@+ yr^/[xES5ǵ\d~uYpD̵tܵRcRU2UrD kHLzW/ܾT| כ'ދǵt#ak9v ?W 'v>wyyJ"1 r .NiG ]Lյ] qWkEǭGne~zr^!%t\'; h ]=u@<ĵ+~= |Aו~}G>Q d9{O:_ZI{zHSqSs5@'qgN7? ҉ĺ\ǂuyB;'A:]wM*?rLgdDjlw?Пrc~QؓΥB\TLwJ)m/[.T ޫ߱ץJ_U&뫰 rkcVa.*SCUX|ϞI#]Xuza>*L|º# :PEf׼A 3,G[oƯU[_E"?["HܘGdȼTc*2?lDfGD3׈?َx֝cT.5UfP*b#!KTY :"fw~[XKGW8E `1Mڝks'"ɾ'f0}HvQK"r);;"s kjoqeGR7r~w7wt`O[n!O!&HNr@iNS]ُr^z1Iu'Y":{AlQE dI̻c95xcLɬ^-R&9~9 [FNT^Wy[̛|32f庖^ޚcSET^Lgfkު2We~'Uٙ"o,ʔž[[JTÿ  +UB>>v /˱1 ۂuۈs? ޯt#8i{E.-4ިUZi**8ft tt ֳthqٿJEz~w*t\Gtٞ*ӱ-Th4an Th ;(raZ8g ˞U/ZQ~K2*x-x'^V+Z{V  *;',-u R{VŮ<}! zuP[T5гyW>>q?uP-^2z~Ε!4Kۼ*UO7XߠFW2_ )'aAA^%C.秂mT :u1i*ӚUPy]>F| ˀr"U9@5zYvkC㓲@d[7ei(t./PJ`\keR/|sPWkwYӻr P|H@$ŞP90A3ye,0U-g*V9ـ`>K y'' ]<Ծɿ$_'eis 8F?'Q?`方02?<͏`ojJ_ܘ/q9e> ~ʼ3 f^ 2D\^C/:O=YTY2kva̶ZV29+%O.h<2KQ&7λiWwQy,ǟz^i?i[o'mgSgSoST{˾_+Sy3`eaJ~AL2~)_gk)SQI)Ŕ¨#eRX7S$ҽ7 3Ֆvom}udu]e蕶3&oS4AEse* 83X߃[]ot2Y-OEL\LNj_ԣc)SS?/@]p2MX[~Gd__䬚t8>6yYCt,[oz(O/_̿/3_}7?|T1?¹7?º?PUe >|x|=7Ou;<t,RJ%pw]є71^}N?9%߀̉1 UyoB ޻ q!Ǟ#*PK`@ȥ *$2;y Z- ly@5~A> j "͟٦vZ?G $(8+ep`?;S|u .|l\-7Gp p|{죽D149;3/yDdЏŸcZjkHF,̎gV!oHR rQHqMȗ'˲ ^B.!BJCrCDN ~<$oe"Ožbs | ?\G5[~S{ZH$%ijo? >)O1oTg}Y0X_*xDQ/#0^~jIC@wG mzo!$ !>2!ἄL= I]>5KyfzB r |P]Y.<Dˠ!BBC^ s*vP CC]'V&T/Rr^CmM*t&<g+t1cbsM@:lB8ܐzROؾhd{Ta=%=ׁh8WL+[5NH_G٪=RJ[Ui_h6@s*WxO@/`c؏S)JbY[-jeCMe:c֜i d+/ĺc_1!ʖ x kz|]O0y D4s mql Rd{]K;[wC[7Y+[GPm9f M.NTd*[cN$K6ioMd_@dkl_C?ckv&הl^JQJ'o ֚H/.ȝ?_5MOL!F.e_x?ހr}4jT6;ۑ eߕ'^8p%>h}#&&e8392M+{f؎NpSsx \3d,e-Aܤ2([.l99WM:B#ЯUȠ:Xkcu~z4'y~X`3gsZ/pbj~sgwq^kXB>^cz i=%<)9z "1~c?KcW1(΅8n;wn/NYZy`mqo|crBٗy?oGYֹ3}ΔyΔ:Qk"E: BLko;Ϛ^|7H7tU7Z;=k[,l RQAkݬȾxz[k÷ ?^~uπګzm-)kIZַ|iUov\6$AdؾJR~EE!Zh9Ѡ+h񬱲.q8 Z~X+O[+9 :i,ZMUOXOpfan[m_V9w!Xy)>Z']J/W֚B mڜS恽+k=Y}CNIl,Uu&]иBiM:H`", 'Cxk"iw?Rk7Zy uX#W/GpBoZsޟh>e>:|艵/藵/Vi=ߊo;U轵S,.G;n#|L-'ᅰvkK36N٧oqbo'd~ǤNi/Ɏ#9a n$&ʕv>RXSO ~O3Pƥ'~bd܋wwoZ;ANvA-|=kGϧso8D%wP>Jg81>?h|H~ըd= m4*p3"YGn=t4rF ~#qB'߹ ̕>2%IhPA7 -Xw%Bϳ.]N rR*;!GX7ʺu3;&NMYVKm|6+5#6pJ)ʺ@f_eݹDf]CgyDY7x*~\\a= Cr 8(xj7I60!c9\`] y7هȗs!'6&Q)'z|u^/tz|E-3S~b= g|}P}|h\!ukUO[W~vݖsy&}#p-uG ?[FlDOU0_gЙDϖ[<'~aӾ+ȏE؊AmOlA' _f 9E9+[Y/X(eJoe_W[2f|a{M6!z f}%sTBn%^"Q*/JXaK8+lDQ]5wjؚ8Կ-cʿo\_bE{_e _G+ەbG=yǿeMy|hC*هlߪ=MoBS0О]v>Tl"~vhCOКRǮT.[m M/Z :P%d$C$ WЉWh0dP#PUrȻmUA4!D-:4!b @t7\[l {-w`M:Xl >^4vS:/b# v,6l_m*0qM0-0lz6s-S/`CzDZ*H6Hl{Ac6x 6cGoHP35OAP;%@GTT]TP<5q4Ǻ}8f!*{X[ЏAvU|\r(X _޲s{m;{ ^"3,p|S_$ynΥ}{#$ " axKi20Hg*$:8!9q* |Bb_Bg#Dl¡9y "T/T|GC B7"'~%lSr.BzTk7a --x\ʥ xlWVzo!S|YZlB3Eop%0 ߭ab [cXm:Sҟǧ'oppg=\l /Sԕ2|³7?cç>;|lvc|wޏGC _ -3Ⴏ>7b[;t/ u_}T QflenZ LEd_"J wDЉDEWTCece/~ސ!l1^Gwd){fV7_?DEb?#ma߾ȎQ"砿r>#4r%dȕȕK\ \%˺Fn|#7`="Xȝƹx9r'紡ļ#WA![{9p9?9>֑3Dΐq>)84|l"e?#/F^X k}"ȹN9IUVle`+-[Tv,d,$^e'.NlVvru/e){sUeOc]ʞ<˞uss~?:ZV|i+;_q! ~XΙ,h\XӲZbOʊ[YֳlbF`WUւsYu54u <}+𪭫HMlnߦ0l)/>+"l} _@'oǶ~+ *lK=F66mظlcm8cD/RRmyKY*>:KI Wld["%9$6/kXNo^dlGDyJ|N\mpgp)م]xb(A~sbo/k [ |zRm<;@d(p'x.~{'(|^=޲]|=d}d|)E^ {]+芽+#S{C{;-{;e{[9ٛz d|}uvk^gk @7u`|R[[Ssy>. tn^Y~O\aO_^:%̮@ >\1Ѱ-٣_Z,+x=R-|=\/HK@/o/.Z M{ yn>9y'[1=={.s|WJmn|})"Iq9ť^1@9ǡڿx.'-'V-p-!Zcߗb&pS$Cb]~ڍ2OO~n/Ll@؀t*W{`]Afo/ =bi(lBRBTAoAo{9w'?_an|d ϲ~p  %[ж=3&p+]~q^_\3?A?aeΈ Y|l#|N!6bu\ٶzM|l[--'n>vOYX0~[$PG|ls\L#{ ld&o|MvhYaM}莲 )Y|; ?A^oM,F]euM.uu#4"["?|#נS^zOs{|=>=>Ͽ'xbS9$xb<1 OL' '&#቙Pxb*<1 O 7&Cε'fxxb><1 O'fC)ĘxbN<1(O'fiĸxBO '&#xbjd<17OL'Fxb|<1? $]_t$?\8]2u>8n!yˋTԚDWeQQ&TEMgXgP]EUTs\ FZ6 Tr~z0y٤G4y*U07}o@iϸ\/f\z}TJ璟)h*ا*3 TJfZ^a|E%BĞrKKR.¸bs7 >Y45c}cmu~ rՈ#Sv#]ǩ,oo I$zz$b] ΎvD랰)SEvfc*ČAJbiA+gӜ?\ܐx=x?A5DX33`u0Հ15sh yfGu'D=fs<<)̳m+ "LY@$,DW sc Ȃc (sbwgucnI>%Y9$-,&j= PQw΂"Fd/ \?^ݎz`g4߆o/.o5fa70ya^ie^\?浒PDxPc]u/1nKYJ1 pugDG{&x^yӳ̣\~rFbx2kSv&&H8s\فbq(ΒQB}o4BJpف|EgȢ,¬YPvAc<=z][Дsac wbpFbJi;=QsXDTsZ\bT'M9ôh;K+&ċ* /ͼNo1y3GLbX"Ӈn;E%'; T ;nfcc M|v-Ъ_X EE!LN8)y7="0/g&7 Dc-Vq(>lao& N&>T&7W1P>6[~LiPNsAd qDq-wgȞٛLTd_恈mtxj]=)~(,N/ (:3Ņ); _cKRUwr,; *oa>qߞضR+ۘ,f4^}Gl}o[}70[Ļ=Djc1}0]X_?lzD@-2^@&^bH&Vq p gG f,f"*^i@$fWvNS~HhzѮp9JqxL. :}+Fy,`wꁈ~J,#;++m VYMµ!|D/ mJ # *R!Y XVg-93wŽipO2cKծl{_dQhHβRdƄhᖱpQ"_B+9%5$ ~OllTrMB; 5NUUԝN"E.pzpW[Wql^3hY0찞~qmE>溢aBԢOOs 9˰t0'Qfv3#ؘts3e*|0 _0>2+Oc).RSh?fu~Ō@%3_X[?f\h\\HHXp_ ]IMRֈr{5Δka] -56ð&܍"^HݼY^d`ٱhGf2p_4f=Erk]FkirNqMg Ftq[)f&2Ek^ O)]?Ɗ+T߮ LN qḚhq[H#wNsͤ5KT/"d~E4ל_y/aB̳/np9Vz W0Y<#)B)Px)l mF{Uܓs( yFGV]~]3(fЪų5:\yջSGOk +5rk.|9-J_Ti׮:5S.))QYf붱IJ,&IUVrN(Nc 1=&wͦk>x~Z$xH.:`{XEⰏZD͜kvxO7W.zf:Av'j5_{o<w\H-4>S4CrSbE[ؙD#;QAgx"b]L(r)T#WkΘҋTW$_ xkӮ7ͶB7g%4]ec(g|=_\ He9Q#|\8j.uET5UYp Uqݮkbl)7pܧuOn @;& (]i\i(M@p`xua"uސP/"`{Ra\}g/v$ћk^-p ԁGRLQ=J(U-ZE*+ZsWROբќj19[*4ƃLhL81X?F@T|!S`j"dI-0gZ;1ZyF/_to9P_Q=4H{l/o`a7,|&y =RB o,|7 Sb4\ß2.@lٻ6.lРh:U[ _a g7ѰgnhqߊA-.D'wf\I}WBkjqøbH'˸tӃhq~YZ )~Z+%{5,Hqu*k@i$ GKpHJk1zh5M奔V~gXA8NJk7¸Y"֢=r?wDshD{WŦ7#/NO\=N|%-E} Zx[{Y:8P.!eP)v$f+68eӈ;F?_w# F_ɸtqy4m߯TqnA0 .Rŭ1,n Ob{S$fv>QK:nxO?YW?]Y bR,7Tb^Kiĝq 8x?UeK|-/hWףϚ P2ޓ"b e%]7CaR{D‰a~b)kK[fr}FWc{%݋Jѳ~S [UUx%>!7lt-{#?@j>QWI"L쯁Ԛ闕Q 9θ/Q_/7Ovl= 4.n\\Eվ R*\ӭU?,4A97iIZE<'+zU}iQ#~OqVҪspV]gԪzVKyPކ&Mđ\ ?y1.קzzmqŸ 늲o]y[m6J0M۾uA.jI'/mYm3線Ι'IA\M4]&Zx^Wӝ%0MS!:@9/hbբVhOࣟ}14:cPUMDZDPg0=؁Ҵ~wl_j}yn~EcN"MTcS;HBrc܊]s+V_[cQ_z˨/|DW-v_)NZ?v_Z~+~CU=9ﱽG,c{r_Amo{91 NW|_b}%M߅X=X7-K?P?UyƕW M{v9V +¯P/8'8υsB!^ yEG瘿i"FA&Sc1/"Zq*D|b_pbulY01ZQ[[h1:y{nQ1'oƜ$݊MG}Hb3Z9Ҳ|uob511僶,[s'fcЃ?fqXw1#)"R2'-*'8EuvPʥ.2-t- >9g+i?(w i>2%mVqyq `MgVwceOOdT

w ߐ۠gn|hS.Jy;HE 7|n o7@% F3@Zue⅞`~5@TA!#esdiR/|B}#p"WJot.r3kn0˼zM1]_wem9SLՓCTuT`ʔҦI8^KiZVQ'xTGQ_G 9jQzsy (JOTWj?uN#GU?R+~kfik-:7bt3{ѩѩRݒnh-e%B=׉*z#f&;ʩ+Jɴ\yrQI1r/?9!TPM%%U'rL,h1@}\LMbjS_SZL#bSiA nL uL Znc ~y bdu7ѓ`Ո1Cc*16BL%GLTL6#Ӑ"91~CQ}4xǴWlK%fkߍb8HOb(9L3ӔoL?ѓܠQhVPSXL w9qF;^CqxSjs?ce_R[8/!݋*/I?IM[? /G*z4ϧ G1V(+dHxo4yj_͠)z*D+~7Z1j ~/( 1-:pt((us?RO u~ =LЩ ^0IJxa!M)'xzK5zLzLɔ5P?rDJwMx8O}c}u*+:Ok@ʨ+lO޷,-y.-vJ|K)%9^_ޕ|TSRB0j?]֩=4%!Eh7^~z&Yu\uM|,ANf^B^Dk 3q]O:܀9:'t/Ⳍ)W}ԓ~"nѓ\ԭ ][ȕ\TP>sm~7CkSe+T\~~7D͕v@WҜwlgMiT?U?dߦj*6j#Ds.\,ͩb֜sw$|c;ͩsTTY Ns|D\vNT~}9G1s 1tߠU~9K.g^+9T̵B_QE t|OgRv;QDzH{L Էkf@I-*UG}8bd&$3[I*U39*U{wԐЏBi"<|E{UguG }qѢ?Y%#g{@ K6#r3Z0*Iud;cT=:'R#Zm?|3VESTēNeGjx7u|={uT2hIN{IE$.I…zT= 淞_=hb]Wu#1TH9u]-NEȸK=3VEȘ(91Q+Hu_,Hszr%ԏT)ӓwoF =֣]՝At O' ,g9 "T,¿Gԟ:9,WR\Auy$"ޙ_>)xː觐WXEfT!3Ἳ,ϛ%wb**tgFt)a[V3?W|,#TʐǙXiyģStD$Ce^Q/rxEW[Qׯ$VV|`9NjGUO@od_hj*U<@8kp:k:bk _P(5xuY]Ws97џNMm]"+T\ Jׯc.g+uԺԦ$3&t5]̈g`Wu"fPyiԼ%?ykِoD?Lb>ֻC(8$xf1s)w9*kM ~!j+~wfo'vH;gxO u<{΋{/ю伦k͐xGmIυc_H5˃*Fb<]%I'\w˛a]&GBoN\IC_Uy1#y.k^[ͥa욫CqjTɡ]uu>ՙ]}ͥ'?xPKۮ>wO?N p}C~5TEߏq .;L]}]|k0k0V]Co5WS]ʼ@~N5B]s .3kD%O"L>+۹~U=) ɤî"'1k£~&;+إnTƓuMa=ׯjݦ2k5{.~t-$_Zhr>\-'v&_ZK:c?ߍG픫]UyٵM%mq&r/tQQyc8Sku҃"=p:%Fw|c10Dw?:Hu| E{K]ȷnjuU z@퟇_{s򡮷aGRrƿ>P?9QOu~e[iuOnm@us5hW-H̻ㅦh)E.5Rd}QKk}x{-ҳ2rk'-_з$xP`'.'J P(қr^7%j)kB~(#4-%R()1ÔXїb^b[.%Rb=$WSD`~SutsTπrCWy]Y@юg?Fc-%Vx/rYJkgsJ󋯖R-5{#g5a,zeZJ5 S8yR<1ZhJZJ?yYm3~8&υU1/kxI?MفR𮞜b0`M-eOkOZ\JKSISZ >b(oS`\=')3IsJeS|}NNJv[*~CK GԺ9Ч=𸽲W7(|4]|tqv}7RDž`^xW}յ> ʙGGOeݮOvˈv'K_0/KݔGz=b= ѻ~#v |J>Hpßli1PvG zNScZE{߫}W #+I>_ct8:ZJd}DSd1_=U~4SeYRjx>ml5_s\8b6j BK0eCB e/[!x]A=E +wMYk],λnӟa7E;]17#v`~~Ww/sU9 cȺbaT}C"`Ay9즇N9̨)G(L]ϰ=ǥ{Iտ20\r/e K]di`fQ,nK;y$_T|e]/1dʕ޿~߳ȲL!k@Gg,5 ߋ|:u}`DBsqqܟ4MVC/hU<[{P~ nF}STRnŋ 2fzd0U/c)^}uߛSw+RM`f)yP(KtY U̙72aFN05z=lU>]d_g$S+ՉOڂxB#'jœu%Q~k񆢩)RK%R2ct_JG,~^hK<#M}̹Ʃ?eُ<`1aa_8/{ښ>oFxLѼ#=U ϲU\1R{,x_BEpȄFxo13/sټTJ ]ƻ忂<~!7ZDXNO,po|q<)K٧.|']!CxjfqKChYR$S2$13NˀN N EY-IsG;EAX[,;5h*?5/՞'EX ~ ҐN$eZkąh/EsvRKT7SOOߌxg ހM.-^hAHT)|jBcSbK|ɛ!iL|T\45=R_ѣ>5o%'C[TO|dĒgM˼%7٢,r3hf)̼% [ Z,iߍqg1Iد&4ٱ`񧧈%@}@ZR-,1آ<,9/ʔh-5hةY$"dIG!= -# hLͲ)3E[҂kK ೴<6[3幥 =O-4Eݼ4eբ|¸+zXW⟥- |BO˧|Y>㾶|NͰ59f@K#sYrZDs~DbƼ1Õeeh`Lˑe5і,ciGYY>evPKkK+5diD:S#W.0J>a_q7< m)Ӫ?"!>)UgT[_p[_`gE)ٖ[nF[.fٰ  M$GtA>I&PmvhbޤiR}ǿ pOGytwCM^56| •O\>ղ |1~{l$tSEҟBlPeX~tKU#{8BxnV,燯,M7 C .zul|Ys _: >3?3dSo׍yټ`Cm6?k>a@\i#& V'}Qmzf YLej0%Sqg_l''kf!i]<70_Dwv2=2ތy-As>ZfXŀb*=Msgoүs/ ǃ _4ڮӀK݊:¸Aa2lak,,<_mmp{̫r47.򹿢q<6];oJir{;;MXf6FyC7=olӴf;m*'m ݺlK3ٖэڶmql+5ʭ`/3G|x^aY!TexC帋G{]LYxO˂x8.ީ_m Vl-*h#{9r kX2hjk챔챴cE7h={{9v]{bj<]/&/?vi-1t)@~˨iuwE ̲$)6{GGsK j'.2Q ?csIܜ (Z,P;q ރ\22s:eYoi#*=ӣkV`a_>l j9?5.M˹{ PpOso4-WՆ3hkt<%M}N=ҴQۢY-/y-oMVg0ʢ_XbeO^XP>ǁD?_xC|>=Mu։(2_ѡ/,_64-uت-<-V eӴ#Ei#>S ZA@XJ ɥ~ ~5`. vhӴB] Za<A4y!sVto\İxãPmPk&~W^\f\.i &M+VS@5 Z~֊ {|&UlM2N<v?ho ,WUy(cZ໻ &犞,eм=7ܚQ콀^nb'D9Oiw:&_>в`צOwa}:[W3|Ծiui!C}rtC ;1O>Kh_Y'x[ۜvcɲ/Z=х4LW~Gn:˫#v]/ x^_]P?YfzG_㲧 S68,q~ojHsf;`n~ yܚk|Q%ez(9mEi94g߭('&6yYO:x^~ƒ__Eo=<$P~Z8=o( c':/?% w ޴GPSSqyzL.fEɼ5m}DduwVs~Q@Oyl"kޢc7F˝? o#_e/ʌFL2j}BSF`5_R9=gS5t]r'%qʞKO8v8B-ok Y 8~8[n{|u}l͠+ǀ*yx*.@ox^{w-}+A?O/ zǦm:{T7j^Ko&^- ( 2}t\q$ݷ)ױ^|]^GPo2to#i/ʱ=?Ӽ8rϽ\= [ }^? o[r~~>7/]9ZK7@R]^<M~ ~3g78"H.|{++G{>ar~$ecj>?{)GBQ]89~犯%yljs:2wO\&&1T (6H@_~V5(+G**A<@jG(1uDH?~$_]۬}!ߨ@?~fNо/K2R:uJ:J%qT`G4>k˹_l1/`:wgSZ:q*=p* =ꩌ<>8.3Z|{{{˨_EE$]i/ ʺ~4c9^?\#(7teteܠ,mΏ3 sK艜j~2ㅯ PhQo-?G8dQ\_-OO(˯Đ?}ɏV@nv?o+ؾnO|Zhww  P\ QQfѧ Xy)1L ֯qfXֲ#bTр_zJ{+wb\wHߠO}QQ>=:<o_ݥxsyС/vhZE^ss#C^֖[J9t<]CY+՟tT7wT-UC)oy߽ e5R[%?[z4 +}rgȅzeB]È߿e>_*19.ޖNF0U"Ik3 ct@$%<(WCiZq%?-| _ =֊.Ώ `ЊvjЭkCG-+MR?_TOfH;.'[~}v6ⓅOBYoW]F`-Ε77g\їP.! "քu-VM30x 2?2OYz >CT?;Dӊynnسgo1h۶;Jb[DF8'?ߵX꾸sXJm<.ܵF}[VaS{/ځz;_o[e9w}ASP _tz֊_5^*;GӢ*fCGzEѯj4 ߔK/ ~؄ >qKBR^;wR_Lz%?~eƞEu~e]`֑u ZN^#wϱ@p|^4hOٕ-;MlW[i[:T5h9k~>p/W\AK+a WtÐf gC»?9pzaENבq] ol5$\^Cs ᕮˀ?P NWxyԬm^;78_H_@sn([\w8^de/ϯ=АLv=@Ӟys Ou>0 [)@ mvI8=sJx(6\Uc?b)Xgw6ym!\7nA!ޡ{kw,<^mųS Wή_p9KWkyW:HRNJ9L.@9~_lc>wsCBz{jH(䩁!kܯ {t!̊}4ScH8}َX>ʻd<[Kf@K+ݐKsq,i;[G /DqhQ!/; hަb@,?'Y+Zbj{B>'m?րʍׇ;*?;}ܤ߂\M l(^Z`/SK3n0d#}=pGzkʏ&_7@wE><[c?zǾ?\>m>/pn{W$ Ϸj:AI ߿= }_ST^OpO|k:r mqFueYA%G?~H~5{H6g|,k;17\gj7xo^_L}ژUs> øݼkw^=oFV^\T^Tt#jge qC,#+Bg H+K]"]mr~6}6|㠣:_?w.%@En|cz7u=!:?~_B'f?\~r{eg:t(qX3z h5D%ƅ' dnN{MZƣ;u>^U7zyأ`]oպ5 PdΉ?iֹJRx/P\\6H:6(hCG.oZ敛AY~t}4QqB'g;Ϸ2~l(0⯯ n}ۅOs՝7%Uc` x)}=uT.E<ΫGw$>3+?8?:]@}|VZV{ HzλC|균훛 0.UX¼.Ly]:I@=uNS9zN, Pr{"x.unOn}ܹQ0w\_"tzH ߿}]<>lVx~K}k//~#bKIYh%  m)}J.ޏxPtY~J*ǁP:׹hUݏ]4ZT+yQ6`UcѪ-zZLd񼬜>}z) hY]@y:d駚ՎëHs_;zw :gR^=W./y4fo9(̐u.坚̱\.pN݊ʦ%CJWO[NG)̕#*@|w _w$GDw\PkGGw¿?'K7_ E^~%DCٿ|n{q ~|7P׍~ *~_6&uK҃~`'җ~_~A/[%7@yI!#v#Cs%?c/B^yVEGIvLۦ?{gsb_k/j/d\~J_B[R##ミcb4҇u(@yyU.+%VV~^yeΣ nq!E %o^⍺5F>eo>z{J{nyzSwz;u4unoE?x|5v#^u䥺7z)׶`ޔṒ)tJ/L}3ӟq?OT׀j| F2EΒwվ|=@ݿEo~}L{Cc׀}NXcg2nJOIu|sg3{v4Tz;n5>qz' eRx }cH%#Q=@!^{+%CW7 ո&ﴣ '{կ!Ăo{ T#ϋ ΐÐe5롿W^^kgn KuCªĤ3W_{KOC ^fHL}qwU2$\ȡ1$/͍ DaH8|5vbƐprZR)3TxeH8{y?I ↄGEߍs0 k<D;nqm G9umٶI ;~)eІ|Qo}ڬ|=yhg;w^~=l{ { _!2/(;_^}N'߈Ba7%\*ڑi, j1xC\G+@#gHxoȅ}uZj<U" C;|T@{tbz6Pe3@SK2C‹FWWӛxNE^y݀B;^kA %޽;GwCk"w J]iAFH.ܣ4-.'RrC_ar^l!QHFO(aiI+3)%}RkIMxu1%/p%23OԚwfZ0b- 3X'$=3I@ƍIq2sR[FOjûIs,]\KђZH\%1/w'5`&$ 3'%J;v-$Ք8\õFNJ`TjJDSO`xsiВ1CHR&mhSqE3>PR4#o'E"qj0XK 1m")ZKЮd<aFlPeS];m5_tJ"Z%T ~g f޲?ƶ ؟3] 0[RFNԤ {3S@R*I%!?ęi>#'a<$OfJR=<9j~<8w_ff.^L4UjqدJk[c.01_ט!~'kxT?3w2r}3wƳ®[DY`ݼ`w3L+e bIY}lL:f"xzSg>EaF9e`j=~b,ǑeY2qÅz*cfxm_m\FȶlTЕ%OmbŴcf+Z/UQ|mqye[sɶNRV5wj}uo[/ /R?Ԗ.!޶%w%hc[c13ږ} p9eEqfeq_ ~O1'hNe-mBDPOe[7F(unkK~ֆlmJ}Ws[3hFzdkP6zyd|M澴YxmHFUrә͘gW&dYYQ^AE9儏@~l0&S|Hj+K~Vq!mF'ӏ| Ï|!L66ovyJKi+ Wbj+Lj+8|6A!?fLj4mZ0UxzqW gԬ:֡:fIړ 3[0'̯0e0y/ȟX ].iLvbMk1OG[YXr&3Z+I\L+25ZTy )~}k0"k RiU{E-\F9:`|$ hV=)iy|fj#e/SŻLȖ*Ufb\a˅C/-r)-H,xY.1CW,l9ϰ_- ,5E43XN;-z_~T,O?|9e 32ez0f g\_wT5j-ߓ`ⶎV_Pj'y:ǵBTqc'uFOs  Ox~*Cetf(Pqog83?-H-Qް&tS,QWUfRf0,a&!buC,nYӖIXjY _E0fY.kTc㲣g?ݍAVe<+l`2ٮe U0o+X_,U"j?1lH̲%e7ClYv1e%ms-[I-[ȯX68QҲe3_&flX9I3놠ecz˯c|\Ǐ1g9wnC޾\Eꅿ^a ƽ!/0kq޲N-k:ebfRqW1eU޳F gY9צ,++L%r Zy7҃B:z"eg:f3[֩T`d@=e#3R[6ܲA rsfzOcMa,pгJG t;BgWe3Z77%BC%gGƒ_9%~o>bV@Uʭ*gB>RYřf Dy31Gg"KEnUR]s<oIK-uYվ#<$W> TT K}- آ2[uÐb0CIҌ1K-ex ?lN~҂T|A*YZ>V-(W@t>ҙr3Δ'-yV ,0 ʓ/ܸ҃_1H&|.وr7VGM)7[i)ՒQV~D4^N/6li`F_O MGMTfMUߦ12&:g:2? ;O uA=T6-NKW%cZ):ѝ->΍ޤ׶VG?f1p~?O?%/}ň2Ϙ 3_}_Gi*PO,#Q27lF}7X*~x(3sZUQhN[PI*(,8Z|#j>3iJNL`gLu>gE*esq%{1o!%j,Sy+90]GeUB!4c~Iu_<|cZSl-<U' 6{5mY> [ ̴ֵ:њ5ڀjO}>sk}⹵>3e[0Ӽ3lZ?VzJЈ绵)f+VOcmC}ɏXQem2Ex+=JԀYw1uK.gUUځ]56&~K;u 'fj?[]sQ蠽^Ǹ3ϔu56s֍X7Ѿb;U~OUN0GebfxI{Jw *X^k-ڮzD{Te>v,[6 -OӖ'`[1e1Bn5[譣S B=-DVNQ2Ar mU><&K wi٩%S>I皭 =XnbQے}X+t;eiO'D֍zO[7yԟPn}|Fo hx Ѧ2ۆ;*{MGFniK1[٦p٦fN=0QmGlFͦ6l3yNfoM^6m!?l_eM⾰ͦcC}mJj0Ye>Oٯfw1a\5V9dJ~6ms,%F`VHjV){jlx>VNVa&nW`Fٶ^ @O`KWN-]هI2nqw%4ۭͭ~+ٶ }aJަ=fϴeSe|ξSە'VwWH2T2N.Ӏϰ$]Ȃcl(;;mUZ7RCvKjo(qMk*5EǮtCWvM2_g6MEo*zyKHha߷o3M3Nܑs|GNLKe}M ?!ڭ/h{vGОv{\:*o+wf\hb`={!8"a/H0{#&"ook>mɟ?U~l^hO>ޑv,)ڿg3SjWSN2׵I̳&-bR{ 8{]ʯސyE ?f]yڟm[j5dV«Zk}p/@[x?Q$]jjfjysH[GlYD" go'Ͽ]։|SMyf?썔WzgoCk<K):i;)wٝ䣲kNR. C'&Ϭ}O7ވ2ǯ(?T3캾u!?h 6;`8v{A샨UQF*:9YQSg_(?ťؗ*?ȥ̗k_&|Ƴ^v7־GWk+<<^~G81m%o"{viqϐ/U䬜{XԇωQt_e?J~~1Q[#We#WyƳEO |~v)I'i=~Dݯ<3wsK2c](]ʟvc۷SOcߢg:6bY2d?wW(ƵEwo_B[ '&@ ؾ~)v8s}gs96WpOgDCbګfW˔? jRVё/ʟҮIXO}}#i7&eS&dL ` vY~~W{b6bByʾEV2!ӿؙ)i짥Q|Y=9OV~wKQ=TOu57<<:uWt-)+&=/0II $_$vJZRЏZR?x塤 _& 9 ϓUoGK9 ?~"#9ID%5;I?OJ>Ko|E9& @&)}ҷI2w01a&}Ǽ rIxd!ٗ1.Q.$Ly%y}ʕKR*AO|$*!$,lMHejкIze wK3u;lfj==S5S rc F9T MM$1Gww.1$x1uǏvm*g \\or=udƑ@槙vF%s<gh@f;[ a!ܿ-M~̭%b-HC_= ff(luDNˊTe1R!y7$ґ;3ҽ匀-GQ_Er#=9ʳ_+AˌKދoha&$f0(8e?OrB$AJAw z'O>AB au+J/ .Z m:ӳl%-[._.K[!.h;+Wx'#{1Ab4ߕ | Zʌ^F@zN 65ךgʸ]=u%M+S9 2Ƒ4ђOQvM>E5FNO>MY#4ug)[':}`ϑM>K_Y90gy8 mg(&ǿ,xvaD\[[;ی?~jV<0]3&Hr7f$<EYD1@&hlxS<~Ɠ/"GPO%g3~=Bf?gi$Z0SP|Ƈs46$SrΤ_tKʣsT&񢽳dU?` 8ӿu{-UWnȏg=C+geh~*N'oeel%~E%`A$Y~f-#YaG^]yýbvwQ0jV~?OR:-?xT=?=k`_fUw~bǝV,KxY2`瞣5;&[ۙ]Pga6ZE2y:"A%IxՒ/նߣ^] @Nvb\,eOO6?o@yb21YY ˪_eUz/&$_u ENVe/*ҌU;ter/:_L4*;ΰsO90,vO {2_: G=q $ xâ',$/ i7xKDZfON~J;yf!/hgH~WN~^학ϋ](=-I^{[^?xb\H-o2I}|Ġ ҴpLtyO6n}HwB0`@5XO8P;IkjԂW;~yG|[C1˰'=P~Q~ó: ?n4N{ߓJC/iH~%:HTH'B7 oM~KEf[*<RA'xvdؑC1 ΑKGvQ$^z@oWr{}[ ?S7cz{XbDрf} ,M ?+I6}u >L4-Q@fj&jt9tfҹT`PL}kj=w,,wݚfS袬sOFO*(?rsjבl\t5q ÃW(yKӊ#Q%GG>^paG.r>O+k|u"l~/ ,+kFV.f#wM5\#^w+ڸn/wJ9?r1_-zA+܋9>@ܴ8Wؑ1 2'ms(&{ ҧK/ ?&An:h/=b[ʊeJ~L;Jb^^7&_wٵ0+xEJy|Ę⏧kuŹJ\,%:db/twmT|NA mCV]w95-\~^}:] 3!}`nA9|!i+n7| ?#g޿X*eMEOo= 𒾁K1.s.t1Wgcy‡'9k# ;VhɊG|ģp<8OMZY?(u}`'=rz+6.@y|^pw;_%KFThoq]N(.~f<&< wr$pgRDQYV⽙L>H{癊~1 {|b.*Uϱļ{Jwxy1YH`wi~b,2c\js{jopTc>Gu9^#AX,: 4G-Y8j)XfiGM*5rcGuEj_QM!̸Pj\[v^gKQGh!Ĕαk6TI Mv݋MՂs ςrNJKE!sя 8 Zp#sO.lDkc  %퉝(Ć_߯'6{k!W^*'x2Dw]YQ&81Jzo&XxQm4J9 %O&R":9@WT6*pT.씚۴:S=9|C`4~cbw-Tb"DS3jV x^Amԯ qQX=?dev[68SLJu~8 :ϘВ^$ho.u$Hz2 8j(f=ECiԮ9,; T Df#Oꑐ/TE7cly =~h%|dQfUʰZߺJ-ƹQ&fŚU,\i+ӵ躿?ruIazVpC,:"u:Esh`S=dӲ`("JƸLx;4`PUڼzͫq:樣xLצ6n;HVG"CqYa_ǎ]X!!֙a-X (lOӈ I7 taF՗\ X~yĄ'J.1#፮qGE%BMh oDHꈅv١x<|x*9RCwS&rum*~9R-q' ISKo2үiؓޅ~ro;{5({4`H}*nh1Qإxxt RkÜmeu $L\chtug'vucBjt5 ~"旗h亸=,a'}i!Μt-Ar|?C=Lad)yQHV"E5KX<Vɰ9N"De-j K ڳzӘEPRh꘰/y}ݡB0Ї ]6;'}1KX.3´P<򻨷7[4UQ_5M߅lbXl:z ϖru;لze^-*կZ|ai`\cڷ)=@|u.'}?eS'y"g Y)&6N8a!xO+",Sa1KFw\ $Qa'Ay9p~wRݖAuyGQg̽9Y?3J&۳'wҘ9"ϓy'ᠩϡb:y͑Lmwv bWj" fq u) gXJ v.#<8rThG5Ɩs^ӊ]G4h8>;GUSqN#ڢ1f29OPS0ލr0&#@ɂWV@9'1htjp2܍;=pq3#wW&Nps'a$(0eGyp_8tw02;]3F[C4v3#&`GEQqTd,GE)pTK6)|ɀy̡bB;*2檣"PZ)8rT]X5#X3J"J) e|E@>{-[-8:X\.x&_Ɏm*clg^X6ݨ<Xϸ=nUfӂƬ~-ɚhq'9̑&hg `i6RY*IDBOm_vԳ1FdTRwuy7Q@1γcu4dGCƂq4RhXFKh;֎{X0zNSrg!G}%Sv0ңa q*A*`S*1}ܱm%(jFkq5B2.k\ A>cxa/M3->f\J J8"A5ZY<ٟgӗL u'-9p%R/90N&4d0G#s4TGS^r4e0G3jX)p2ǿ,xX-h桅ڇ_N\ɻ R|+0ox/Q3ޝaϏQ]^g2,m99n1r&o:TJ5)\N隩iJ⬃fDJit4RZFtew4RFtuw4UdnNhɨO(r*9RE)0D͕h،֎Ƽ]/SE9~z-iH?0Im}eIKtN޿a?6E"*elJ^y0HXT-.("$U>eЂ}hZ.Zt7L4h񾾅= $"K4\.o(b 9!);FMv~4Ieo>o>n6twH=w%#h7-AAJ|+HOyt~^n-82F 7BpS-仧kJ n nK)k~d؃AT߉I<pOyd VV΃"R!S\KVN_GC(h9/W,~ذQu+n\ #8~O9MXo<4|kArVmlYU/VnJ-~se y-ZR5Z/h!yY]sr?zJrzE9QHӵ/Q yY(/E;&V&"l#4OFXk Y~"ӎ(/=P_FG/z3G4ꕤcD1z(E,ǻ QYWp} ʭG?0ގbt{c^N:MKŕM'^ ţ<">V@{}#y^e~w5R"t4< ƭ - BDTULQ[RF49Sҋ݃ AF0b0yZ#gUPգݡVF(O<"t'?BG?a\G#OWv:Z|JUs[r+$Xp<Ѵ E*c oN-*\Ƹwt"s#ed';=bzF%cH'#M$x__Rћ=:%Z["jyw=.jWTg҇ɢJGYO(wYyT^EP5W~0x{ڥj71^i/ T3m}ߞ.$Pa}s.Fx>^]{ yqܡ'c-G>e< M@Qw~ neA1^kqnI!Lyp°^1=y.E+Q>\4߅Nx~?UUYoZ&GWAP]v5h㹢wy΄V["m}\CTs&%Dp+ߡ{69ҔN!_<PnXN[!xN(pHGk!m*iCPC~eXery@+9ZƁR.̡w{ysrE=7iyD44'M. Bugg{-5GOGN:qm4фy S;e¿fBO^1[*o܉ +GL5BK}E@ؕا4#gzPC)^ѤU;kӛ#E.?,ZOA1_{PʽY K>;ϩbsF?_ pu}>? t I\N/Qo:/ >t$|:MȷfHg'|2}r ޟK1<(J*o%tKd.:w|E-".r}+ʤvB:?<[ly+lǝi:q]땟B>xO/_9IB?B*^;_*K} x]sW0B3 y9W^[dayx|eX*Š?+#`0e|}2: qNe'#e]='AY,sl9_Ȣ{c)GNdPЩCS. :!5>Jnv!7P}*xޯL;_U4/c&];!VbHy=!*Pẋ ~V|`k,y ޳SK'eWN7jj.Va`”s 0;_ӭ3XwҴJ r!!)Wf%91}؋XfrIZ =9ʿ/ #dM ^ ZE/z_dAW@뱝c?.s?zmyT-ܕ9D}9M_V?tI|ڀ}ſ]1 {6y4sx1wA3]9ai{οIKML;vT`LkrbZ(~D;)&*§ߑJ>R> =^s:az8SWoOߦ^~B7ԇ|S_dŒN+|$ʺ~7o2(D^ ޥR~4@yiEo T򰩔oB'G65iԻj*7mbR.+ ԗ.vo홄_@,O&EME?ɋ.r>SocKxQq'X?KOfT=Si3#GSe"j4S~2VU~DXD*HFVvވVqOeFzgXO_,M~Wj~:}@yYђ_e!+.w l_]5_F xd$SGOQ̸b%sRM=)8'(qJl)ZVAK7sƅ|OG=~$H> ڢD9zH?齛7%&6y[;>O{sKNCPNaxyz >P|Qz̯ty07yrjWǐ_%b5歬g˞shCCf$1^^/0FefT}Vkc{ʙ=y>I٭7a7"=ߩ{=C?0n`C<$^w )M+#Wp8Ic2%`E{}$ ~oC~7xRgv1\P2aWxOE iFOF1IǤibxmjмЭy_[g]?}NƇ*:ؗNṎxF?ooJR7 Լ/ng!Ȧi3V01.sfxC}Ŕei_i D)OuRz\+}7ʵjR^*rs3ݚNWu%`c.F}]D! &!#f>9Pއc2h^>/y hZÛxOE[{`ך|-I~gCNya >z3Ȗ _5i/P[ fPPj݆l*:[F}GVN:}M,u*t:P>dܿ>{TB9گ?q}S1[{o{_1+}GC޷\_'^x_hr@'OM{FWOd4\a,i,[h9 P'alreGє2-3fM~O_E:8-nBBQ_By)JH=Q* !Uzc->i(TH~#7cNAվrݙeWBGҾVFH{_e-,|D4=Yqܠ}wu`]ϣ\_}t?K}w|=O}xN%7 T<&}mGfY}x޽1 HHM](2Q?'=e?[v [#-{'L JaG|law 7槞Ө)G Ўc,E} ic'%֥Xܨ]F76ؐvMH PJ}Q)oYqFOߣ @1~OP^7*b F)Ư38Pɡ*rgw*Q ʯ8?FݾͦKfySŞߍ3#WכvnEc_u6 9YaUd}=X(=)[9J0\K )O،/Of|.[m`Sv[IgԺUNS 2堝Фn ʆ>rwu2J;ۻUi7f}}Og|&z{{)OM9n2#19y%ԀxljN}%פN2ugSgM+>(L`@*A5|Vl2­+; .`W:vTѳ*;4\EN'F!6K?M Pz YHo?Ta>o~D;k̦_q"ve_D?Gw6/OJfz~LggsѤXӴ_ˤQVWL+"k"^3- ~7Zo>7mSQ]Q2_ Za綿wkq}_W!tםZuYz297z #Hͦ}(L:^eZu;413cõQ SsF25Ƥ?LI"֒ӳs$CMUWiү,* iB{I]4%Nc!i?1ա_i.d}(X7b?tN~MNB{7/v,zͻWܐ]o?{UjzLUgX !>Tz+zjJߕjg>ѴDI ެ1]C:yӛt_2ˊ}쿔x쿖A$WQo+/~zZ+nvvAEx6@^MI1ʟ 6<XHX~h_,N{D'\ T-ְyWi? sB>)@Ex|)9`ȟl(@N>00]G꿏{E`/"/~UAWR׿IR/`cɓ0ף =Tt Qn,}־7P_io\wZ2$f2~I7`?[& 5I{ӥqy̯rZ)OJEl2= ~04QZ*|^AyM~ @[%2 _1y,@%wڢ}9ӞU.#6ʸj<j/@_eVBi+_% I*.Pp 9+t@>yx<9n'e}.)[:PVۧAbUr+QgPgB"ό=> 5zw96tHh<);-@KP+Y%H$J|Pؗ.zO@J+oi2=I+>ˉt^~y͊,_X_U} ҁ޽}}~\Z>ugR60LyoI9ڋاO硗xσX| 3b{$]P.+YY@_?Vj~'P+exW` ArΈO_ +!o{W"λ/UbƬBE\`yIaX#۫\]Xp;JY>kwӽYޤ >%e{Ao2x|F 4q'@y;|tt(!o'AR or7ߎKynǻ1i~u)+2N)n x9LDG~@x\V}W@@ y݈&e2 4@TyF^#AooYȓ2xKFQRʤ)oQG|'PJ,R~=) T~}қvzGt!{S>M*ow|Q{wTY$p|Aճ ]lDg|v짞_oysj/yZsgqc)9soA<,w8þ9s=OyNc?ds P]S,w\ lSW{N@ߔ*.lKOBwr8*#xNMs2(9~+rgTeAj=7dtރ㚔xTi97Br7@<<J SLsS$ ݞaAsF !3zl+U#U\> 9;M4Cϧ߯>|2Ko=絽/@\^X.>z%cxax_t2 =נzC\~soA_LOԏ gynD-8 ^G|5Rs'P4i3a7Y-> 9svIٞWuv+o:eLo M؜+N8섞zN@𜄾9|I@zw 0EGd~~9 ćO8`?-;ȡ#Bnw=ɾ^To ̛75ހݜ4,qm*t|!$dbG}ߑ̰zsI=kKű޽JzN9|EqHg(zȣ{^*Wߠ>Gcz;j[B_t3ۙeIAoGN霦 }yY d%yrȁv(9ޡدCY>$9x(8!rT; w֗wD~ N72$z$wqqЇe<'{wsP;tl@zg;5z,D~;C騜䝆z(i+{>LO=m2dɢMtw*֏w*SN.z إ3`y}wc2Λ,z6lߡ~GZIt~'޽U=֑jO `^dRۉn> 6j'gwc}{}K}Xˠ=fWo |h&W/Q}/e_e+ Oīb+jKL})T}Vb૾ҏ}"/򒯊}BUŸ؃>{87G< r_w |jžkjIK}::ӪOvw?Ư//KA,.P}CQ170|#`p^Qb>훊 뾩xl ~fqAauK#:UgVyvݨ#ă}< =DpŸ<:BB7ytM-/YO/fXpO'}:G7gb{{&t韾){r9y꟔Q\{+_m|`ٟR-}?C6+R-SgFQfZ^R =ݟ|]E:?'.y Q[_ T+2E%Qc/_|J(֣z?巉? W`+_vз?vHo ܠKIzߋ"&~/^;*"._oEUg5gՄ ;f_O^הq }_r:]Ư ZĕK5u5 [ q}П?NkS@wSZBO67Km'ȟf$Uw_xķA^O:#E)1P1~-ú/e@/RK/JKKz)sCN/%cJ;_)tz?`X vOg Wÿ_Szmf`~Ex4Q3ǐ?kg/q~%ao=9,yYo \2Ie_+t|rT1//Bn_yyHR]I?#Џ>?'+=,gnݨOO?A.A.; ^{+loX'wu_'A?7B>o"imdvCF^ӽf^4{ G=߿ryh\ _!q-qT8P+~N;[R+MNKVg׿N*_3OY5CF$} m\躝wq` T}kz9 3Ů?xoA"4^w`7yߠJq z'Od~ ~̟SyN&[}}7:]o I=z)*BNIӁ+#">Nuׯ.8]cG`<g'>^t>t d>S_\z躃O?Tm\DA/DℂS.2H,/:Aϑ] .H{"}=%SO"'L01X%?oKJ'65XiC-I5:Nx,o/K' Xjf~ZglZS0n,6#_l 1?Yq${٥tJ. oA߻:1¡7Svz_\6?%׭gjt|M_KCtN7R.Ot%.|>=t;gkY?m)q-~H-옱- OǶFۚIk1ՒGQZ¿zulsyd[H\qS'hJr3L*7]!T iCZZKL,/=Y$ȧr/ ?Ul$޿Tx V;{yxv IsVy?Z2_z2)9 ~0V[N~jĖ>[Jb?}g)YDQ)ea--ز-^l+#쬱Fɳ0^<] |xn!Y ߝ3 |sҁ4_H3IR$B'֘H~~_>?|~7Xrr~(5OlR-s6_[*>W8&[O?5Im!NZs"՚`#:%[)8'euŬk͟vhw TkaNߋ0u =3G -05A6mXbLvt!Apf;H.@՜`/s ZձvJ)I^>G9{^GNPUWPD_!Lj/xK j1?e:3=cBI[hi09AVAO/I![AKks AÄJ ;pR;a@ PC\jpGՖZMPc[>﴿[HtK0,ҏBE}恺k >sA17fkrHvBZ;lҩw$e-GOK;{SHקv!=ö߶P-6HL:ކmgEj vWMwgV{څg5ӌE>>1Gs.PP昋.\yi.~s'u,Ac/ rf zQǑ8}!aV_awBc/`E{.w쁛ı fO.o:vH@Z#n%;vCquw(>?8 7#BO3?S 83CҲ8 C,̬d~8s42BCp@c#8 ދ4XeBioU^'}@-L_P(54 jL (T1gj0VeS:BGz9.ΗdL(01g  bEK11a=_Sa=Š 1шC)"8։@\:Ɇ+qq<+쿡O Ԏp)݅b˄NϽ ?.xwYcq`/$ )I{.?dH+*b$R*`ˎUBXS& +$`7FfMzeh#%ؒAjہ߶YT'EmܧI=gH v-=rm K=ImT]d0MP ׷ֲ|4qH"ʤE\9;Ĥ4ґޗ2pr -ʝ B%s$[5-oQǗ-dl4f=^%[>WSmĈIZMHSVh9`k*@- t躖ųbkwg&NPm-` GJ;{Zq&(7hDuȡעXj텤 zm{bn>C{ږW$=~?h fVJB!݇`le+ }[*@B曽66DިmG;,b9|]s#9 暷?kt;;:6A-'lr7eׁY "[Q̮Ķ)Өao =|~&"#/ǼM-,_WYЏ$On M +l_lqrǜg>]wI\1R_cH0 x[ DxZ:^as˲WվDVəZ1Xb"W+`)'Z453^R-3i.҂Wuf|LgJXL۱uk6|fyTM\+Sn1C}8߼k~eݣ_9NMiPz{}_}][qk 9!h A~``ӗU;&[Gޘ߸\%՘LDPPE9& tVV fXXDITo~-fe!̺V5>8_L6[tfB'B<>0]nȘlfGDdJ5i [xibcE&J0i5}sD(LnLS'}g{9t4K({5<!i `G+S# ;?/ʳW/--ޮI@`r`>@ 9?-Xo)_>;}! E[$VO%4D2pBcC\Tkj54ZOR(5Dz7 ř%AtixI$KBL-;su{}(2-.)f._t_'dW.m^$x9pJCIlЏ_Wmyf{X' EkE:_Z=&QmO/Mh-JC:ۓR i'Լ/TTAM6߾=en>fmB5@9`ث8]@-jF%׼Վyk^!g|BO\?zP -Ne-PH, "߇[;n;L%ݿmq9MZ֦&>r"Tk+["_jk@W֐h<:SaljM,wu`ETU`Yǰ/#,~ \1nQYgz67fj!R aT)CMNrkBkQ& &.F(}hPۘ,`#iUVE D;h,i" SQ9Z-$I?@@?1F1Z~Hd4T.VoxSHz|M}岧'U۷Rk PUdsٺG{ v bUX%5&`m-a`֔9&EćޯDvVYW㚢N6Ykp{/4iXmXk*}h{Nn"z@yj#Hpxo]\rؠ<&F $%Tk >V23XZl5PnGy&ICb&<'޳771n"uf w$OvreG5iy-Vy-m@*Q5oy3 ̛`0CvZCh`ү ZMŲ jhZߣx"H _6Ukq!Sq&Kڽ>~g\핡=8PD@[%rEvTlH1cЈݾe9i٫[A.u|Mrsi%=X {f4MPLkJ%]+wFlz:1ʹaLs,2ȋ&J;7 ˓MܕC_h#'ī_2/MbAReDN'USY )A*ߓbH:vKԖ'1´&)V [tw֢poԅPSOB;7o6%/ì5cc>CQLz~~jVU< K~_^:CB}'#Ҿ}/X]6>xy;j-A0Zmv?zEצ^ m#I_:Nl.j]u#\JۋIZ[aiF;Z1aԒms$/$"_,!VG,Cx˓~40]0T݅+3Z[*'vgázĩȖ1mġ6L_]RZ"jl%+aluk:uDQ,c&;;h;[ MXu8.:Wm)FuȦ<-$s悋Wc?#urk橏7ufG-RlYYڦXotʶ:2-M@:J'zs44_7,6Gd}9{ٖr1OW%[Jϓ{OsIg[ekp+MhƷ}c)e tL5 .VPF06{Suݯ?j}oޏK.X?e݈J0X/&}9b?{սI%o} I _W~oY$GuGcVǶzVmn O낲yM Fm(`״<2O,(3 H]&B/zo,j`#ZODz>qLڣa $GT2 b9Ao=f[?g9,o 9$|~ӲI2C&Hj%4+KA4q|8=F^>8P$j$$DabVO{l/$di=/lQx~Ng8nQLlErF rU -ib!&mĺJ\ݶCl\X! ~=9\ͷ6>X9fkBFsb-1"4eK+oD%c&r|mwzфv6C9$"g Ht4 O;eˮ$Jg]ɝKϏW6݃4w@T{3 B!ַUՖv_ KK68R!z~2:5jnI5KF_V|^0ӷ8QdӛlcH~ic9V;%֒}9TڦE'= fH> ⦋Enz7ji26bc%Vn,r1b~ 7ǡCHqP2Xť$AWmZaVkpr[w@ Rl٘Vt<@IlF ((:sG#6.MT8Gl35"i@CM*z4:)h3N@"46V P`NNn `NЍõi⻳O>R2Fro=HFS[s?&Sĭ{:Lg3Pdzm*)IOdNK׍f69]?VhAd ¦b &;?@>-Zv~"f-MFZdh$(:eG|y|]j$(;񈔱gp(Fgƾx֎ EC!X۲'H6ZA6[5Iа퍌@xDZ<חkQrVk^x{8@&mu^a?(QLJg60l =Go4AQHjpL>fu>knI? Y5 Gi\)71 &Ͽ K.40:[w?Z&QJÛo.^U"]) v%J~(m/@)R))$d )}HO,tK'˒ z4zO ? Z @Xs48J#fut=B& (H֛ʐ›Ckdk?IWLW>;HȮ+M]P/\ l ~iRWF@$kKPD[`9me'O3iD\%vnV *j??][z%2a.,u.>Vi.zy&ANܝ? 1yԆڐin/tܰmk:nP6:/I֎7^ N LBCGi/ȗ!c$H3'㞜+JAZԬ~2x f-ZI~_YBߥ-˥ז"'P[*NDo(C 9VqmCaum"4n`]8fN$ }$]#"@/Dh$ |-rfWAI"K2ޖAikq~MC2RJО$;8䫭*\ij۪ri%$ѤT9m)d.P+b 5bZzR3GYNPi%el bgO߅-As*q퀌h[i%~|`³}btQ1 J6჊2,aGNxI}bo޲q2&µ7y+o"zS06ǸDC,%}#<֥)@/Eyq1YB~aL.2PZFR.Mk Ҵ*ؾ[| "DmDJ)&m@֡Ԉ JK>@8YUfx#XU3)|kqLϕ-6}+҅'d,q{lIJ#Hv-A'e(PHW !u h 뗀Z0v5iI^lj{Q3E_ngZ=sɜ[~u2^+لM{<’peGNEi3itpb8XhAX@$ZѯtWjH+5eN%a9XG[O{Y¼sBش$RbPkCE@*{?jI&zdWwÆxNBi{霂&vؘԽ&WR|L;"g9``iDX=7goD(_9d3bZ?#9~ӒvRCOH^i׎xUz{ VDxRtKA_I'h_MMFc4(7 IvZaЉ|D"<7Ow  -nV/c>Z+2I()[L])oUm7/fgXg@m1X /UKUi{XB e9*aGQ]JTNVCsJb4HNoN"!lN:t~/=~ pj*OTI-Z%JsGW,.꒹豏r!q7iH+179سe5j {dX밉jτsZJXϵ`m~.!v':vk%3AvpJi7. @DxYH2~q7O眔"ܞbS>wI9vy.7DϹ{+DpRV5D'D rƣbH;(ɯޒ;|vBp%7 +<⨏!^_J{l 4Oa(m9UηB u$; 2e~ (HDp(eT0p` bG9z96QKKzv k: ͤ\b*!a/Zonv]߯ PGyx}$ S^}'IF+&OmQ9Gd30TR1le&Zѧ `ߕ=4VFck敗ڗZL`1[h1pg0q1ES$}83牠39܁Ml!e?H; xbҳ}7߯]Kq{Liw=S;z1 .< (Ë(Ls]uyƮH:)]5 y gCS3nـ-py^;n *(xOK窏CVQ[9?mzdžj=yaz̠oVgQ?Qt t;d4S "˘!t9=76%0N Aɴv$ziٴ4NQ|6R˦آM?G:$>!tLWyAn #m&0xWD,EqR^aU@kWe˽* NϹ  ljv+r+bFF*kQY{(a"*jO¦=di G,ox"BhrtOKƿ;.{HG2^mBLhz0R"]/xd?GmckqFz^]7aYשԲ6MɺVq뾓t|G{πD3ސmWťsg (]]e2vC{GPIdDIxR#G&0Ay%Z)Z@{#9o$=f+WtaGz̳rߏ$0 UWC*QHi ҂dtHVgRBȄD"D2 NNPl#ry@ZVzJ 駖?^jQEY}ϥE_w(pͪ|RK{xa9KZӽ q粥'J_xk6o2ܧγIޏ$i[Ug:'$+tNcQT3ڟ0AUb[1mCo h$S4jL!$c3'Qʇ#*:؁z#qF4ţi L#lC ߣi|T-1d T{L#5aAHDOF۴+:;TC1gfp(TЋs2U Onl @=|zz z&pV Կl]4syy~/^E2(WZ(mz);``ץH.ŀl _/Hu= X_`,}G%/4.&tUt Z(:Ku}`F|z7T= v YR죭(` eFXLOaZަX5b K1;"̹7B\%Ѵ9(]Rz q6 Դͦ=(g Y^ 0z)Ȁz)DdΗLG=41@\iI/a]PdhU+n[Q \NA ҄F/0yV4wO0oBdRtK>HN( {j]gK޳F]" }BS 6A;py#}z0sOIޤՒ% ³uaTԞ_V›"ujp[g!z*5+ӹ? uDZ >+A$хq 9]}5Pڍ %}(2x'K ?3H/2.zs]M 7AI=GӘ0hh =,q Z"i7cO r3B H"t Hi Ě5B舂_zg^m7zF.ޗiꇊrz?ԾӗG+2HwꭐZ(-!e}k\!0o]#d _6H#%UβEGU I(`:pHE\R-8z03%QXK_Z#Z+aƆDUr`F 3?x;N~*Y{Bx/)>}t~"87] :ZӘqw.Pܘ~&!y A@aO ][N 4C'ZLt(Dqxkf(J<0Y3A&|c$fcP.ϔ~ߏI f.E9f\y0#*eR@+?H.s@Yme>%L(S ۡ_bk=?(0@4* *_R0JQN9~a_Dʙ,\߸l(n998r,@l`D%z(ʃT忒K#JR ~/j?ƒ7bok昷&rµk}l%S~]ZU$E$ eaAQVZ6>not>1_qf G`3I9PjBy}DxU8"GHܠ~U:]ڢDunVXчvEҌ86E+L T줶dv=AS$@-"@Nݡn@P; `C?'Î?DMB2>IDɼ#M9hL볐nB!D}vP}&63.@ܸ>]84&PR5mZXp^5I[!w\ '#fg_͒qG@!]pT4Ŗj*`*xoSaMgi!"ɡTS4&i(zOb> &4v&9,J˞EyuC.y <]i;!L`O+jHA{߬;%H69}G+Њ ״D砛(gaUrn: O,g= $u{p+EEƙȹS$LO⽝&f2B+w!cJQd/- Erie.d?MCw}8T^hßf&Vgl۔ JMW^ ۬Uy(eEPZe>)  C=i@p{@X=3|199[kE=P !^fLv =gv?갅 j~EP\+c3-Q;}wJ& zK^R0' aR$)C# rfGްgׅ<UUmgZuHU%˂{@q yL35j6mG?m8.^=uU5moc/'pg}w9˖K`l:n'$w36J}m&3`؛L7(@M !z`tqZcH7;㨗89Ar ǃC(̾ ;7E}їggF= ZN2qH#嫏䝃ΏFT>UBc:EPwҧÁ@ԣ>HF &0 eю6]B8H$3ʯ>=q$=ljGٞ='cJȰѧq=4 A{)E"/YGw- .-үP*G!+""d0/#rd@+?RajmZ~PTW|R!V-g6^՗J /- ORu^UW;"+ .#7~ ~(,yfZKuf} Fa}[İRHGJwRcaUgð}!` 96$[Aꟾ P@6!@qN EOipI5pfZ`28\'8o.zC '{Mՙ )ׅڽ@yL%IݹCG/U~є~jV`#I 9{oF?9=)bpBcd]G?g8v迱Ekj5ֲU5:`>@Fyy"u DC W~|CMiKbJ ārρiئ,0r"`2eg(h* ;d 4 HISzT"%T HU[E`cE_&Vi:ѧ88$?#a$',H`Kr?@i͒dSsk=5}Tmt\ІtzM7$*| A۷K}њ'CAd!HF> ~H=+Vn%"UWNaGű*?d\ꏎ6 @4 +͎"w6@UMm84CmZo`C٥ =!2T8X#X#?*P닳h&=?Q.o ;#EtE3L!rD$)L$2:qD9Z҂\_of.qڻ职1☷-sgע%ѳ˫KXqc 'X8+g3>۫oLI$D>c݆DtǨ?hQj 3} Z:-Ȑ /)2C'}q=֡HILEQ;}:S`parO-P)ʼ~! iʖoW%֯JƐĦ\>fnZ'p<-q!mDlnj;n@ubO&_ `qMBax˘5lrUW0Bg҂r0_da/cO&=w6b vF=M6(:9lګ:-p*h@N;QY:Seч@v:P+躽zbgE^8=~&jcXytFM&.9Gfe*ϧ%(뒳!nSN'י~jtA$UBd(e])薋A{1BM? :K4s։@?`^jsf:XB2RIP6I~+t<s=:/!BB? I[*@Kk!BY!* {Ng5U#VcY}usquVan0U g5$8N];aVgD.[}6J9qE꬏"8^=: )Af/w6\ M9l ?2Ϝ 2!-i 2Ѹ%cu%IjIǗ&ߘq1Lc5^T{3=KDZg!0uf:H?0[ǤE싘}!~ G\J@y3_|EQ^`!st׈-J:/_2{,NXt>3S(a0NDߋ"^1XBpHbV~ٿ=RKqU Aev0$aubIڏX?6Wv:qtănk#EE6Ԏ!;J lDJ\ҏvسg+C坈EC⒪c>:_ +J V\K鿌vNԯX9Zo"zY%] vP"e׺9Ġs\ u+ D̟=r׭̀amoYy'FV]k5(֪FF$P/X?b9R"'*);pʿY*/$o0bڔo{&ft|y6vN9΢*8UF2}#育1Pj_V9ʱxti?U*gSx(g٘QUd?ؑO((M+_HXw)xES*5o-jkXuqH!6?M/| ~hkSdZH:ckUXւ*kaU~UYñBW?N\8UZ9U p1Vnr (ʿ mw@)Kj)Ly\MPKlC5/8#G$~@F#lĀ"7SDRZq"(o M -J-ł_-) `>AO}%P2 ]02*;([Q][ ض" *sznz+58iP[S"j 3[TC%n"ϕ$vHTEG] @ʴT!|[n-o $"7؟,of8Sݗm]YOyB_2z\A, ֩))$\Eo5L3xz,3"PYWߣƀOZ8~eXu\EYXh"V,6E>-`\FI rN -~zGĝ'ur<H+{$2_\p5@W(N(,ښԂ|wt"b2P MnÜs/|( 8I/tRB^PAVr0:/| x(eΏ %?y_'aYR̒aA·bG+3?bS)FҺ*,X؅-^fyDA7i!Fiozg-ل]e =XAN\C,wpq`)Q2g J*$#ke7' 7ò@UnE9?ϱS!gȲm.[# Z#R2(p9/0 [E,-CY>߇"2~8ďY2?¿:~gYYUO- m 0z~P[qtY0ȍJn(J~$) BcRL"q˲|CGB1V y\zNJB?DN.XY|q퇡V07OIL)# g)U3_hLRd}*d}c$_Iʺf|c ˛5)AT{_e\Ǭg` L<2b_f`y=%Sl)aQc'zrc}O&S9'r@m<r TAe¦LܬLBe[O& 73 r2 q$fIJ7o)*tV`QZ$UDR^J`Jɣ~`y HJ/u`AAj%N-hwJ KܔBEI+˂~%|O>rt\|+TI4Q2ǭ;RK뷬Q[0E _tԆ^Ԃ\dyB͛}U F*rPI0CehP~<}_S?AWJ\ =y#8;D10\K%BrY%R))zhVQfHjJ6C"WDKG_aT*zA< ,Ae/2,;Za޲-뷕 >,{d=AryW2,H;CA/ z%X-wy gXecy*7g">R/M2?T{r -|ƷdT`~J+|NɊRJfȆπh.%aUҋ"d@A`Fah+gzu *KEZ^i|_5^-lh"? d-I ĺ Bbe {xl K3쳖8$[aX*5sY"Sj Ki-yD~ |RH v"OK p/GH0?Dm<}Aj ]/r)֭Ws"o5طiУ,R̿g>{?4=YOpp o?֯y˼ti u_5o怞F׭F‹y ͼy=>7"ɼ*̂.lވuiGدsm}<vГs&@~3OFŒy S!'ԏY2/h^柠d^ :4Ey2%e7By ̓`Issc^ȍ7GغY~h6c3f Y_!sEdA_5=\8RefGP\|ج`3{!!JԚbR }=qN0\fSC7ybO0/5d}%g?yb Ҽ |ɼzy'Ȼ惰%g|~so%1j:̳%_Z2B^^b   %rKW떑H˰,Ae,!'Y.i ZvY(#h;`@t#&6ћlQ *;c;,4^hB ȴe xM|j! L74`Ƿ|ji!!z`X@4#L)Ћ,wYvTQkG[%#̯`3?A.C0/a{Y a#P,gn"sy޷߀N79G0a.Yas~Л9?0/E`5Q$,您a.аݗ_Fe·4$>*+o`;%G.[ߨ-엦?R+i?ҘLoMPM3A5mC:iFLzft~KGsz63fΜfs:#8$ 99'p̹gKY[x`.=\sq[w#Ɯib7*𛠁; &50Mb7U3X1ƴ(T`{BzJ9$rgCPȽL=cڦ:3t\0JLtނ*"_K;^&&YGR!ܟY1|z3Tut|Ĕ)@OطLy3ɼdJ@1E('عMVc@E/🙪C5Րg%&?`&?S,2SeLUWHP^g^wZB_2~jj _|KkSCiܿ3}+= o ~e(]3u/3!zaH 2T&MQ?ȴLB'ȃPȴri@kof?WLqc;i@A=}Xȶ)瞅t|8kyOPez; 쎦w3B0g7,tt(L;?k/E$%W7Ry 3%aO6WkvMs=G6799Ois{RB:#a0`C$e)'dEǁ8 ڗ^pe]N.Bw0+Zw_R߈n8E:,Ud7KwY_ZDL}wȍ[y=S] ڍfOt`Y"βu-{X'yd5Nٴv$ݿ_AW--'dyxˣ;ΉGj!b? w6TgAb:v';oH#O[8$#0BƂ*2,Eށy()قҟYSa+~f֚i̓8k>^'Uki ktԎ=TkGT:;~{ke*G=XM8ZgI@q9' °׭dk3UՖy:@h[$6Eb\m#]`h-q^omc{2l@F:}޶&\s}B"qt J%q{qNUȢڣP)e"إg^(Gڎ|\KUy9^-Ag{Y;t}'a 0 o$.~k-ݶ7ҌKC/uCt{hK˨Hr6 mwWS@>܀p5HvT3/sܭs%+!\yTB];C-9Hd<p;G#9䝃%z0*:3Tgoȑ^\߅ӵ{;;jUgK.:6} D~FHup6DgC.@Ӏ˔86FWħ8nl) ԯ5v{Jv%S"=|W;$9;@I"ʻΞ<^^j ޟB=Qٓƣ7坽%/} ϩԏ N>,{8D-Bnoݟ/ :R;oqo !g/br92ٙck4]go }#I쌺Ύ(Ɍre) 6! e:#>YII-CeѼ4`, Զ&!*:Rѹ9~Bp_S܄k$m]gC:arF5wq~ &ũ>OӍ^DvD8mDgi^Fʐ3%>sd]4F@9 Ҍ5H/0gn$g:s8dy/gv ,bgVάHtf=ʙD[\?Gf8ޙU ؁לPY~,9ǡ9~d]gIueIgY\q> =94>ᐧpF3Hen ,ex}q(Ɂ]x, h7g!Xˋr<q@vf"3-id\|^J ~$E}|&2?$)0$,33ǝYwtz Dwg/T΂Џ|,LHgaN. ~%Y~Q.ug;TI:v )ݩ4SG3SO]u!;)7g5; <*g ,;z^ r** 0lXN/adzCS9c8ifMg%c]}~Or9t} mVFϠ?3%Kc-{I$SP+XOKSM`j*$͟!G]J0'} ڽcoGx`.TKs. nQ0s3U\k!\_͐8Z0U_>ua9K-o,DD)|2Iq2IVotA0^`n+خc/m>Y'˼ CNh5`|~Y{RogMZ% O|$8.R`;j*>OR^gKY;Hҧ K|9Y@ݧJ@ f%w:?^rDz]ΏԇJ!Rf1z Auw0(Nwyб:^RÜTuبBAp.RYWzWăY/:"W(#Eo'}Z Fsk4m%zkv!zO+$d=Xk"yH-Ro5X߫SMJUjH1֫NPS0jJ*s-%~5ak"E!5*pf)G;ij')j`Q^mzCW~,gz 0yNȡziЙB/ WMPQPOvVR]@ |B>΂NsRծ`Ю^݂_76.//=ߐ/7W-_ڿ3j iX3c 3I%GR &0sZ)ؔV3yR!^GO|j ';~܌/5_g-@{r+?Y2P\k>L3?@Ԟs?iN}|O}3h'Cvt]zvBjy9>c`k=؇~W~C~_پZiGOh{Vhw$AہSۆ!m+#f`km@mZ:#N@[Rm:ym 0ֵe((-}K((E \&ZZ-$G+/BO60]MNj{[kzvvXQ8.v A%`D&Czi?!Z늞;ztdkX$z}P6qoq<_\?>Ƴw(| >fR',{:j5}@^1_h|!_!scsz@$D.~V.Aܚf\ؾAϳ AS¤YPE@_Ѭ4+nnt9Is3]}@U$'}_s͡WiaZnPk}<65cȺrV {CO4ǚ YSeV^a T>t]y^41B6$k6QhƵ9'I:7ohxwgGZ/~(A  =BD,`B-C>@ e>x@k/VQ+?ZKz\9VZc+Vre1Z7 '4e6R:H;t$Z3ZLk)|OmZGkyƳe *0Cz6r6XGj# jj!jSh3̈́7[m٣-u?K-Eam& 4myp I|!y)(_)6⤴;g;iwaY[=ij7EN{"ٿ^@^]~K^=/d?T &^">@{Sϥm_J邬E_` ,Gs%w|=+gdψ3O;^'=39EN; 43E號C>?G=BoxZv;c s>sK͖)tyJ@d yמ;^.2ϋ'q+1 9Yd}>#XgMf}Tc=]w~EWW*)4Wn Y]|m~:8qk>|K숷cߒ\/Yw]/ y~"E7']KBz g:̀ys~{3ȷΌlU_s=.=YP PY\,*@e"8C ำ7Z3 To>Ĉ4zVdg ]1,/#;=OiU+h/Y 0o;;\nfYWmav6f_`uvvgȻΎs=gWșncsv=UT]!g92vA3X ~;s@<9B#!/;`wN>蜈:TΩ'4U8SJ%oas<:;s#'3P@p*YyU\% liи\\iRw.xe+vb?vn)M7V @Ϩ<0:ﮃŹBj^U-4v,?ֹui͇0q]uQ⠖1}2吓\)ȟKNIrs p!,\.g?,qs=hBIIW+VǝD9oϝ: ^ {9{auQ.>Zo)kf7{i_ۈq#`d;?5s_Fw;MAAE?u0Z$têAbY,G6K~-*Ea)a{ T6)Pu-[r|\C?-NzMd\\U`"̸ e;a3CEUF NTU`F}LዪfFB_TWؖv"+?->70ď6SCtQC5sxs`0EIǨQrgdeAPԗ3^NaL q>X@4&h>ee4B4 #Y C+`A0b鹩P$٘@Ɣq4JLXlj!:sP#z!ՋEZ8&vQ:AwuLߕ]pu?8: vZgj [ |!1lm]5#tՀN [*|*𥻪NZ>QWU`\`W5DCW]CXbt؄]*b]_b\bCsِ;R`#r)&%Uh\o*.[quT]~ R]`Su}Wsa`s Rn"CLې$1~!6P8&G+^$ k|7 'H?!׾s&c\썏d%T1$L9& h f@~ 0CEf$<``?\hE=Fi@v.@pk\#qBkQpFXf$D9{H1\#d150"K?>0>oJwgHXd _X[^ӆP a |$4x=:0dݫ4Ay$- 09ֲ{\;ʋb ':fƂ@{4[wĩ =cюR6Et>VE]vuX d0&QqRT3sH펝(GA14Bw z1 ݀b腬ÐϿz}S,zΏj-a S=^zDأ;Ώ9l,sӿt 8U%6a|mf#5{Yg kz[ӉOu͝8ؔuGaJk2F]=暸`e:PlwJGkK"P+k±Eב:^(xDԞ"TǨ38*~q]3P]3vHϟok6\fr+}OH>'cNeusmӋwn›{v V/E.VEu-Zt]49 kp 0 g#a $V) _eXf x>P `7 fhp pZBm8iC{:9Wu0.D<XqN.H3&~M=Z$wEv-'B"PDu?M %PMe(6Z&FpZj_Z4ZtVZ8*~[13{VZ8R]KxѓâZg@2?^$/8P -SpCcGSd@ sjP x&&ah kXbZ?k?!o޵ _,hz?k=ҮSpGkZ"µqI?"Adr,d^ײt_?r󩑍`lءқ)oz5T*>|Mrf"juֈnyDŽ_ǫ m&,"kEE:}I޺N'e \@:'[9!1u tHw@ )$x&O;A35n/G js xTIF$\S5=ѱ G-vɚkjD]ק/Ftt܅Ct]ܵ辮wmE`+Jѻ$ Gķ7~m #iOqyGuUX'j?лnV|ןb[ \w=b!='hKHN#x]E{h91A."\w,;"6VeDuspo_@vY-M$5DֈS،XoͼfV@R0b8<⮡ p(D$}=-Nϻ 讈?[H?/.^c6P'vs5X;R)eS"D˝}Eh BZ]obzf',xBk+1Z՝q쐥&JoZVb"ݚ&0"4AQ,5GDA狡HDU!FF61^Y8+z;2wJt]tgD[9΁w/{.Fw:K+ԝ ځpG2L3* yqUiGNXg5|~%V pg bOGDfCq;?֚V6MP9yC!PPޯB޻+TVCyDø mdvt}kK` ;|Du%83Ig>7@w#V8 % EMYŒũG^PD - c%U5,d =7w_Nׯ]t򊫵tx6zgH_PZ%,: iWr8DYxǑHǛw-(A Yùt_D7v[-/8\au`\jvotHMHx@;EМe6q=8G{}8ai^6Ϥ %q\p=Ab! 1Gv%Ru==x_#V`u@;%8vg@[m3M)7/`wgAP;ˆT+Ws x؝.M1lzwg[5V}/1qlH y97i7Ǎe/$m~mߓO5vlqW,C- q1bX%c tŎ^lcj>d fQɳ S즏d09Pwbsaoq{]*Nm"< uIC 8sW_/W*Y/Bσot]I Ugvct2:Vf|tbQC8Ig2D:sO4{7?_AEFD~(F|!4oOa ?9h1c^Nهۓޏ/~RۃcGĘ4Ci<{u7ID'Ť&%,H7*iH 2ЅܕpWښ~d7=$H׻枠 .dG QaZ+ p+ ]є eCϯ+w +ZWq 姅:[9=D꿫y+ImN|}ޞteܣ2}=o۳cGP?JQkwy(uۑrT$=/ rȦs]+Rro5tW]_!j]vWw)DGK!ȢEcdƆ&fP }$ƋZhֿ>gTFUr[oԷ7 ԟ J:v FkbQ%]YY:\[6Fݵf^m0Teaf",ޝ\gھ ]HZ^ ĺ- #:K &-ذ,Q֒D2Vфt԰Շ-SäBB,_*BfX^˱n#"댢\S`i0aGs;'a a7 '5 h*i Z`} mxVZq}@|7M;vDrm!# ֠+M ass;8D[P$|7GB;/,Uڟ^G$U/Gz^:)wEFx~x7ބk4i17lh07BKxgၠ&nbUv7waM|o6 n"%qpe +"^qׅ]2wcٹmٱ&{ 6G셻%';uA| ܒn-mN`?@Py>15s,U>z&G85nӆz|Mq@JCy٩OUn08SQ)=]/4HǗ7#ʒ)8gߟHaoQ1 bmvIm2]vJm}ha˙s.Nw/rQ;RkyEFgqM(T@ ;Ԫ}Gv Ž!! Bm*Hzȕa?/>:^a rݢ;N<2^JǣYmF#2_Q!AkkwԀ7A Zy,t x.դAd&ǛVԏS LOןqlx޼w׎o#۱ǶWIDk%FSXG7daiW)h-hq)VA:<}HrW]ew]qDj0%X !Hita!Zb|jD[w^M kH܉E/Q$buQ$q]P`3wWA HLv &:00)YǦ뇋8#E4j8n(tO@{*>340xME{ /ݓكJ0$v\}D$7a:t#=@lxEEznS3%赲m{B^>@=xG,}4Yx(r#ӊ)?AoG*.#!: ^$Zc=g¦0k0]K@/O7҂ 62@]>6<ԏe],D  SP-Si=6\J/` _~ρ1|(C`wOd{i Xwdغ =hA!|vr5܁,Z-zh \G#1=h7iܠ/!:=F3|dZvyȜtCf{¼s=yq_-H~@lqWS=(P.C^מ*5i@N=\%NH@aJJ̖/o_vJMP PǰVkï{rù$!y $ JԆz#7nmpX H4B1#JKJKsiD/jDPюF E0JQCpaFJ: %4a mjll@z_$2?q GƗJ,%8(n\wXKPӸ4w:=JIxJdgTJ*QkGEQVIPbP-QLQҋ Ԩ(u-M8=,f~`#DimFAӨ@qz3dE=/~~.⯯^ Gȫ>QwNWS{HG=߸G)ШCPG٘Aunx(fk%6:=7QߥFNpiiJF":h}j|wƮ.ps06&joqT5]6矟@@sC{ROw / h޷z H1ZQљP)3DguAqѩ N)9킞|':kyIkNI>:#JFGT zQN$yr%bb<i j2r(iu1QGPR3JG cjQH$=w5ڠV 1Q.jc}LQ%Qfpo%#&o;ԆC*NQEQ'$袲JzC@me@^*ՍPx[@)+N3Bh@j ׉A1c_z3ż+ F7od17#- 13T7ߢi߻&ҴO^U0Iv[ h8/n(xU/daqx;l^ڟDè[vͅP0(OOmAo/&3~ܖdž P?g̩k6"_N_;z߿# ]_io5:/ y~Yj0< ҫ_g1_6FHA-F^Fm9wۿ8P9A&k9%#9.f1>>:?'u#vK%#{49y"69 y V.g^5h7B7]R!{ و Lqk(44+b\J!J32ߡ@i)C SJ߆0lQH2XPP^A*Eiq=:T H3TGU 5gxod5C;94 Aiup@5gägX>bXDj:?: K/P:G x|W( g$=smKJ$H3AI\ %h+mkF}.iKONcQJx=G1P"ɝQ*8 %0ƅP\vh\y¸ 9++i\Dm㚢IQ?Vt<aH!6kuc/04IZ()gBF+,?PRX$4P9և1##I7@Dd8%2NM^@C0RE(1l0iH_5y@ uC{.uM=P_YГ*`@\J_1CB̏q7H!#3CFNwSAj/1, m~ I y|Q׈ V#dwE&uNˤ&s`)?5qc )7ocEfEfA"23,({P#"R!l1S#IFN@)ۈlMP#*/kjDK&Q;?.%q#*!2}7[X"*#i)4KD;Ci:7,ѮZ [JR;ASR 1-1Ǒ33#3]/ف 4"ް\{Q2]K#'2 SA8ҵX^Y͆)}FevZy'~Ost}0~;_<%(:}&G$> eVznwx ;t-ޥzB 0t [Y 񝿊a` .踟 Y/{w\֍+Vx6jaU'' #xPj?}~m[NMo(mM,wczA O t~L)y,^Xa4q.DV=6)g%#+Fu57 Ed3LB#Cd٧8{'=)z,~Y Gu鹁cz^4 :oY :2 %=;џ$! 3$QCvЩ!!'JrӐ]Sw] `4K'a$W*۠ڗS򜪖Z@zRw žAʚ' %<( g#ڞrUOһ$JzJĞ=E~jioz_A|'?JxrJߓ%<';="#מtCM(h,- ݯ~nwtS/@ʻ_qjٓݓ|KNtzIrdS?l;׎~y+ETr-Lߒ[HrM\o} .{M<`pY(&OTwP{ GDbžٕ-]{kgցoЗ.`Dw5#M-#g_ J-hoWwl@t}Rr'%8N}|Q݇%2ᐄb(J;z {;tmx~>xz79}C]Vu9aOwSvUaiY]w2tjMswr:R}]G_;Qb̽03]<7o1}>y;y};JRK5_n)@t-U!C /.}A;G1ع+Q9]7Oh22s׻g :{("!dt.=(2VSa6ݳٯCϝ WsgH9݌_K1%Ӆ_Y>p h{WCCm+s=Gݿqu֑y #ӴNNh7q^$?z5G 0w|c8;^"L%]?P" ,ٗJx@'0~4pܳQZ=W\pϑ({{& 3ޓ/P=!z)A%Ƹ;[kVvLws$Bs7"<\Og]VGbkt J}t^v;VyRr jwd/|Clp%yK#} ɝWu^`Yٝ p_BYQݝ%jܙe}!1fv;D:L#65JS ;sJ { 3}>JJawݕ+(U:hׯ( :*ȳQеz %Y\ 7\cѵ t*hRi"l1.)ڈIpr$Q r &lQ5s\g]#Q5Bևc=D[X$_>O7I6tW/~.A?k5D x&C M|5MTfīk.JhKbJaׁO <: `Z/݀uڌhEPe}^Aq\6.Mv?Jv#Gµ U\;dk;mϤv@WJB>q?uF\'~Cbpu%\'7q qP-z h. 7YRDY/I~@OO~.J ss#ǟIkfLlW䨢(u.^..!%P]%ř _LGH!AbN{?z_9FZ0eRLB$p R{^>*=SxM=% )]sx>"bzz=EoU6Ni{:"eU:oO_3hDȣ.#僇\_~~hu:Ԝz?f8RxnSqrz\=}Saz&x H.M,wU*嘼c.ځ#[o4.@~dXY[[KSG{Gh =GO0.* 1B.g\ߚ`'ߙ; O x.]:q_am8uHNKቮl8F*s 58A /v(X[yc~;X;)"g~81U^Ade<8L#g*HIFr\^}Jsnܮ̃4(9F5#2 9c s/58Vm>{V( &N.ӱ4y2&yfޭ gOyhy g e$s)=GŬRmS|n5q >zkkP] !뽾Pu2EzHK9 y*=Q3Dtt3qzrz~kit:D`S.;)ܐqtJO%)ٹWޟrk⏑"}/iʩN<%պ-U bUoP=a^H+*%nF$)d*#G],23hASe<y1Q,>TIexeѠ16# j;,K48cX L>T+! *c8RYeN*'w?By؆A;e?\,O+㛖^{˟ogZz+֝!ގyjmXCOa|qkQ֤sf羬Y_{nUe~Pue͙Z14DY]#L&%1ֻ1NV;ց^QYG4:i6rVYG|j81XV{NZb}[e}Z탕_\Tw_1pP eAH u=V|ξΟs!]Y?وUO^kKy&*N{1JY7bZX{M^YB[bZwTܻEYARg\_I~o5e|~A~s|o*kMgk5[V9kEKkS֊߭X`[} _Y+b?Vfg1Qا-b߶D?Z]hn99eُf1Olve7Dzٲ}/۲rCuj ΰ,{.i1OX>|̡+GBe!֣e!BS ,=a?0hj~k~Iy9U>}2ZY}0,R^R{ɋ4u@ :~~JKݴ-]?Y@NX:r\;̾n-~[ H$a1sH\OaIfIwަE)K],y_-UKuo5oh;=Y0YW]{Cz\[BXOYﲖ`d-mUyGTW7eYPYs>׹N<sW߱94hA,YTjweCҞC>eޜq^M{`exgĸe~w*#˜dAQ_{:qc`er g?ecϙG.Ǐ}7Ӈyl 9I}^&f3og6yJ:A[u?Cb/P/@r*Ii,@nzA:ջbEPkAqp ع'H6dh A`=W ½ܑb^ۚ&A< Q 'DAd|BKPBE_hy'A#jDsg@PC)ug> 0佷w^:s^|GH?y}W:X+q&y֭/慗`Q|'oS^-ց@axGaz蠒<ǔybS1և[Uw稧y_}u(}6#w>{Kkپt T9>~ /8? ґw*לp<7C{oުFҎmmʭ,"ouSvrԠ'>b={/ ~iuWIDdu/H?| 9 y ;˻9^?З`~)yޫ"'WrG}W\U¸*ݾJX羊}h/pCsɸ܀<>}{DuwY΋$sv>=Mr-Ji()xKj~~~~η8K5!Yb+3xrqIyϯ8_PNEK(Qw γ?)Oh{d$>OQΜ;K~N|Sn]A*O[9xwIy"MgIu:g}.Pjo\$%WƚE?麻\pmUzw}1g!nkkzM|kVPa봼>kkkJļWWFb>wb0|q֐_*34%Q໴3'_7CQ ϋ~Aؗ}~ %%CD_/_; >8x8~~sy<k9kqȇ\BW'i_2' /! / ͲR7՗}ۗA3y~J3a%Wk*o:)eJֆς}gy-ԨǢF>^3ao2#!zHWJI7{a'~ ipGo{w/mcVnT޵5#ޯ~ayWs[ƻrK1K?ϸ/>[S_r_x?a=`y?1ց_Cyy=큷iLxw>VQiKgy_Td(PA(K/Rx/MJ۝>BX~1Ƙ寰nl-V lټ,?JULӯ 2e5_2ƂGURlIY8Jeh8E GaQR8BTԕpaCƭUa* p6A3O{w 㿞8'%=Yv()bD NO>>dPJt|];CIqPҨ}_׾+14nw;%MM ߟ\;M(Ju mJ$3z`GPK:6{̸K- % *%-b?orKkJc#m;i B70II*OPRɚ5] %=$@i7ъ:*W뎈;HK} ^^І { (:o@~ Dhߋb][_EgύS\fmMs‹Pxw?+묰qWXPIpS({mR+,|"{d:{S؁ LF̐~nkݡkh|a{x# WVa-?  r B5Q-)AhkoQ *.,5Se=ϫFyHƙ^¶VazUJGSΧO섾%(Sʒj,n (ޒSOI5Z\JX*td񱌏cRMke>9t~wm`EiCʂŷ\}\s.ȅΫXc9֗sFKi\Xeq[|OGNRZ~vx ETN_kk7"bCukd/^_|_6ٜV,[&L~gۙɀ0HIy3*fQ)؛i4ʇm.TʓVZdd>uRn5y𘔚K{ꓣZ]~W5ރBF 3):d}zMr'^¤>Ri^J]P-}}KVTa,zbXE40@ 2n1hʋhC4QWG=Vz~ސro ߵ}HG To57|lqjCaQD¦\}k} Y(e_ _o2?:\||w(/׍qj{7|+GroTbO,psXo.z7x10yo(ѥE79^r!nk6R@8m|g פ{hL~zē8mpƯ۾yßO+Bd5Q<P ͐;!ն~PBJx 3Y!4$ )JT N`y~ mH0 u asH%ՊTRS}&HdӹS{;!ԏtjKq%=lIƙEH=AČjIU@thĵ֝. kbg7?=7M8,EBēl$M(蔚b41oDyi5K; B\$IJӘKxRK vwDRIP_" 7I@@Pn*פcRhf)')jun*'H60*r\ ϣ1[K?9r$HNӄTٔ'FxM#>)Cl~>:$k]$YNB75DO M~7=:ug])is%m`d5}fvTNw5F^ϴHl+_irDV:[[k܆+r_Z R1R]"oR-O??KazH'/{ѿ붙+$I\ ;q $~h߷@<0G_EO?;Uw <M ߊRяRHZW NO4"h-hM|,"aLb%'&#k ։ȝ=HPTBBYG\Id$ B ߡ Zˇ"OC dBҘS198E3&|ԉ>"lE_өd+2Ϯ3Ru'&TF$TBM$Hh " J X:rsA o{'k*wu|njaLHOk~II"x\JMYAHP 8nCRʳσ: b>y ?膡 }w*C@oFJdވD_BĿ2UĿz)Gko8,DQ=ҮIHx?D4k5cߍbx#oWtbq̛~H`$ƒxjb>)5 fC'l#  "zYJc[dvi*_LN_`=G?zS9qƙEk)G[ wyDd$I2A"X$ՉzJH,N=$@?8%} O A.%IڈMڃIw%]y?ڄ GKUr ԗ}K^Hbb \R_X4DCbM~R~7OP?/I$I[ARfBaX)cz[8S'Hr?M~guTc*Uu0RWJF#Bj>R}_}! ,RBn-v̓cЛj$0L=KTڝW^yMd4&"0W2Uб2׆<37g$r3X~ Y-QtR C T=;:a)eNQ9Zs?}'.":yTXi{"#7uh Tgȵ?Uz;}fJ FKi$0볂RvguB)텑"]h}֪T JzGFE$4`ƌ[@D{Ց6>S/%1f  qV:Ĕ@H1H'+U㠏dgi5 d8f jPȧ<`1Je#%yHch2=~ u~wH=]YE);h@JDu)-*f TF&%jLc?њ+>ʸMsehS^zL{HQ !+˨)yoݧK㬥>dTWj=#8*Gg:&[qJ7#g Qy"!!$M]DLczo.&`+ZN2_W>y*DjWFLwWk1Aee| 4Am> i2rqX[Qs߼ ~ͫ:۪!\b1bGq Dd ㌺}w4m&|Kc!GG wu"6yXˋ 4 -o.#(1\DN>cS z^Lc C@BUy}f]ƣ\WL ; =B%lj NOߠ,u"$^yi2*vI}M}S~6FXeO/#!/}VQgtbe 3OUwtߦ"U9 xyn쿲~GL7I;ݰ):!|SP̄WXrx8JH,([H@mwD'nN#9l1 ȱTy͑v>t"᰹ٗc=0g;Җ1HTr~wk;S ҺhEiCyHt-ɄE<I2 q&9k-H6ABh8Z?R2\un6Xy/zg2߲li?LY~DltK Z~sqLzY'0M#ut}utG~sr;#t8+O4yvEY&2Eϻ7N ==s{އS4IDPᄒ,͉"McawFӴA;~ўI_ZgKYQ H.K }*K<&j;DәhW@BD ;S.1e$KbU$6K,Q No"$΃+S^/h?\?2R;NN ڈq߉YꫨE(1]G}st-iT%+;&^)R W!qOZ/'ň&V< ?JYmk' 徿$"wk;Pgy&yWrma ~gCBBd%~֒ĉɴC%Eb#T5qI}%*i,~wܟ7uWs0 %t}>u> &eCN0 __ߝ$sL*r`@'K-Uz:Rkrr]%*%}p1h'h;* y uX%OC"ݏs/ / T@"0A#{`6$o\Z>T]=E5H,w}yz?X2.C' ?\ ~G}7.tI;=u?PJ q9ƵxCs㺠? wD#?+~@su!q X0 EXcUwo_!Q},_}1vؗ}QsHmlGMr][Oi!+!x 5> U1k8f%1lbf!.3UAsƼ}/fJ;st;?៊ycO=?f 11?ޘ bc" -&U h1M:վdOtN֬`~yC*3ר:Y>k)?DB쨧3jϔ4*Y'DHUܤ"G ls#*UطLW~CcS)桩o/:VLb^ лLtO[nz}cMi8y說ZzC g: ~* H\Z^F-TmHڨTKIU.->=QR-u#׋O)?FB3{#֩hZއ-; 2 -M^y!W/+?)(WJ#n*xAK'{haַDRLZnkzzW_*HK)gx3D'qo+>vu!\IڱrǠ{6IvjnIrX5;J5kL_(z<Ӧbُ}?'qjvpor}ԥ>_KY#?e+Nkvq~'$nQͤ'#>Wj'"o{Rދxψ7*_:~[qKCCwDC4}k2/Pv'ʍPMW?*v lfNRvȓ\-|rQR)Hi+k=H~5?n ƭY'^ʵsw}Ks~ݹG3b%eW:gjL'嵏Z7Vr=L]^UN7)xJ@EwMȖkc]K(UQ+wn+uΐ}'uDrNs(^堔5_rm[x X-~i1UMEZ,u5Rʝ[@֑?u&lw'kKgfK ˇ4RNNʧScWh5y3JDʭ S)7!Ԋ~MAđLA$7uh= ~[_5/[اM:q-<%.&ÞXZK}1qy>$J6tR?RZ).k"Gg/H\&c]Fx'yhG"{iW!#^'&"%v3'G$r a_F.'sKD)qوG΀(vu'=6qEzB;&Пb/i {851`'4?, 1M>"0G{ZΫMcw3#ZƜCr=ӏ!1f|.]}b? 5U$19\R q1ag\5pO1AF]%@_^|/)Uk\QGwÿKA煔]o$zEO-֜!޼F;ߟBso$^^7Լݑ{yNۍ zv]>ZhR/wF|@FKN.H킄H-eR^}jGχD^/9WgiETvp WA\ʛ9ޖ( ;vqQJ%k?+ nO)c |͐ Ͱ͐hLs3UHmq(o/梐6F7o#$6BfoC8Sc$S@DS5[CsH{!^᭠}8:]qnsEn+k(]ebkz}י М{dי@:#_%%H88uijLLx/9}뿘hčG\CW&.{JS_dOz܆g>}/%md" L( x7t(-cH晃L8gb]:|(-ڠǐ6Te3nb gbaL8ؗ ʣǙжoi#Gǣ,2Dӏ Y":)SSs4VN|xRSi q`icLL>D}!ʩ^M";(8L<ו"PN*~l}S&au&⾦L}}rU_&+H>ǵrק9'(z_PܥtT}M6\)ve7y@Bp7ѿK;n!5zwN&nnc\~+wm_krj Ѽ}_@ '^"+~꺎k .Ap\/*%]Cq~:O5˳XJ^J;qs 'Ku::< ]]n]溄Kz_-|BY}g/8Aqx~0$u9k?k \J}۵^) ]چ\1]\׮ HZ}75ZJ{Var*yb\_`p}ԮEXOn\S5} k"ΕA[8=FМWiG1]}`?AX׽#Ps֓3杫sT[{:@ /ڋ}v9V]~riGvzb/"\vU_sI'Ն㪂*H 9}UI˅弁9/ g["rAЃ/8Btr֍0pð7G?:`_r<ߵiR#.P#hVZK y'#!SsNw~@bjW$;ohVi SUA딫"GW-#ZC\5o++jy#N'+䪇qh++OWHW2^Y`pe!Ѳˢu5nV$vՍFHkC)[wo؝{&"Y+B덓:*;OFZNɼ8l\Ƚkp<ۉ8Gp.:pn~u\["|sR~ Y\sOtm^p9Y$v>?s43~ c$Nvx;Zؽ!H#|9 FD}`8K<y C `wޭe g{NfGٙDN;9V =>2nf)zH8^_)i 3*iw}zՃ$':仳*i-ޝ9+/qU\_>q灻w8q^Rj_y<9S9-qAϥУWwp0 zV:uV+vOh;9y;^%8&$tw:3J)g4g {,Cgk/a88:F@78ey72}nD1FNPZg'3:exy_|WFd'u}fz"Q%O}99Xi`ӧ_8@p9s7dzļpN>|%W:?.#+$tw.\ASZ3r}7~t¼v?#![#n$!)-}`;^h!%םUUE>WU 'Wum_>Z]ǝeU]]ĥ >z<}9 7_ZQUn5+o1 i4~BW]-h/DWD'Es*f%2rI%v;ߧ}4jyI;fktmӨoO{e?>?}5~?ׇG>S~^ vskڟ reKEo iO޷{pmJ kk/7_HvDӮv_WuMy7WU> =]]~mw%+ݕ0ܕ|#%惻2iUz8W68'Ks4U۠c]X-O8ⰾI)i:K7z=S[; ۢB)-^iw, wu|l ;U7Uٝ';CԟEv;[ۇRڠmgM06nn׈߭Sp^z[Av+q'u;$5r܋ʭ]}?B]#Dz̋ǵ_æop)o@|`K 4!{B>iOYOxĵܓ؞Wa&ߥ?t" /?ǽq'Wt/>^rm޵:vx{$ӽlOO$~. vϥ?\KyaJ}gr_clURTtTbF?xUҾn8xߣؗ=lϓ=O"/WO_~+'|/psӳڏ!z8ˌO!fw;O)dW{8 ?~0kЗ=S/u.䤧~O gxhVW)8t?YQ}ջ<5x}sN{27]y.}Ay q5R5ؗcUn]<֚*rsd<.\1әo%։7Xq* `ox0`#;F.]_osE^++Uώ78\u!?<}kz4K[ no)-y_zykCkGk_ 7V[Zz}J׼Wc세p1N#oG੼ G[?G9vH^7q~+*~pG5?./q eHy z\|}_}{{b<a2;K~(o]ŧ`{RnsO#q0$rc 1)gGc>;zw$xğZNk-1e:Y'/@=<]> q%8˼Gc,GXu7rL"](˶?yĢw7yo]k>sYGmԯ%*ǟ<1yСmp  ʈ=p mo &#ܦHIiԐIusWR41vD;An4pO@>@<Vi_F-l^G@}@W{y%%HhF>{zŀ; l?P]id :NnP>}-=T-=8emn:=i'&Q\gmWSY9` [WYt؆: _ǩ=8#zQQ՟xJf>)D ( Gy-~:>,Ewu*羆k% g̒ /)k =_дZdJ/BRO|BcN=ф%TB8 ^B{h[r.O=:`c s:6y`sK硓C lÀhkջOjrtj3>/DܧbܾO'$$%1S1C* cH&+R1\$- ч1 hN<J}bHC2\N$L&&FL60rp4 SܫT*&v1f0gHc>ޓKp2g1_;$1$يñ1?$$1!\)Kqx,vI=DtwJI[dBC~Cs~l~(p3}/@{s p>8M|u? AkI:D{QwE6d~Bwo^qb0) N=# ƺݽs6HDyJI #)sE/Y`P /ݏ3^Iss8⁥nZ֟_.UL Xb1> 6Ա\=?&Eo2!4, ^Il}^(^Lwѩ8eȉ^uwJ;3؍u]|xr|ժÓ4 A[dm~fAX.},bWkPb!V7P?@2-mO^NbwjM)8;(w Or⸘;Fw:uEpp̝ߝ0`"%U/|[{i=$ ZЪ]n.q݆b4/PyorĐ F8)+l ׸u3|1occ#Hߓ!W񈛸sOA-ILS{ӤLg}ѝr}׋Jlxq"e:jM)cTXbe &dH}[AdNk DŰL IXdx#EؙM_(Ѵ /L sLw ~;[Gqd}Gʬ-9HkNKN־\y㰉L>Lzoĺ4-ўi/_Y3䀉L;@j2H^_Rz}+!L+AmZyl"!haޯ 2 b2BC *#R: #tDRBmc: [eDRFidClMIda" "w\"P7v$舤:r? PMPD"aA#:"Q-ߥd)&$2m1m ķ`ÚN 1I! 2-4 M6gLo`4r 64uNIk6Nآ L)# q@hC7Θ A:A7DAה|1i$幁 51i0LO#e[^CB& UMKf2uh\#+BHGZd1|$܍|3 vhO_KB$\.&8q98DJyochHuhuyՌf.uђq%#pjR^$ tW7`ݒ&Pl]rʃywq/*<`uDZd,~p ON9D@br8?){,8pxΩ{ M`I qS4er+ă40΃^A^;_C L|餝 Gt~vNp:_90u|yA~;i@i` PzAhTvn 1tW>>} J;<H/|ez =Kv;_@9QW"^0{դ__hk~z¡n?Le_ r^Y;^,nW|}.k8_Ǻv]3t(?fsg]7|yy>ΏxS z?q+pPɃm; n*<=qP4zO5DQssQ|@<嚬U9YRdN5>}-פ}fPpTʺiV+ׄr&`_&S×L#Çi EpbkdNW4Mi82&f0 $24CǦzJ2C0G / 2O&\B(x]\㡀z؍5 281*F ׳T_9 $QxL2q'!z'^rDa;c?;aN|ЍdE5yj7M;b/#ȩpnYq>g.xKb8ivt$LMI']wkXLnPI\w p`hc~r-''W})+>r"Knwj}.!}゛c8",Yp'/ }ɡʒ =W8tIeN6|RH$N8rA*@b1yCڷ.$E:0&J.o^V"/8j]&ö= {tyxM,7.Re6;.e{xH%馉o?WSFޮu 3䕈O||_Nez]/N۫1l*~t :40;Ԙr`6l%o"n6v=%q U} CW-kp8_ HTmLoBy.sLV|l/@|)쀧>92ޛk/6~Pz_SI J@"x SGT'UT>oiꓠ1Ow4iRVV7u ԾH ~X|taX@8{CB8{^7?go3v:1\烠Mp>v_d"_ݴD%JU*]Ȱcb;M솼L=K<.Vk7]ezм1gpv-ty4nIpv )rz%fҧk;e9ا,EB/p(HaR)XDL M $,ŊMYQ qU /.hNޫ'_owzIȧ딳{: ( qALG/׺S=1CDDF6|MR Y20<0+1iSǞYR61]AseD&K;)rB?(z#A]N29֙K<c#GXbsJq0霳rmLcq419OM0F["pbs@ʓ r21зDBh-C3LN_"VbPJ\L vi }ZKeJ\HGJHk4DS%4r=yJzIyonKvwIڅdIuB>eE*:5rU%D6yr '/rߤW>0TDZ ):wb+~ %ׯ ’ 4 s_"`jrT#Ri4DDՂN 9ҚBΦP);hȅ&`{4+q#;*Yoip:ց9 Ȫ\8Yg}r+YP86䬦bDhlSKt\D+B:nV`s:~zv!Xڎir| h@;_Upgc%9V#w Iv;/MD!$ 7c}\/kw8I/i%rNj:1Hp;S4o>_Ux p^>s< LEGu=qq,GWSw68^]pEsHnXwC8iGp8Eq/V"TPp8A8p< 1p;z1-p.#lO2FËx^HspK;xB/!'epۋ{SEpa9^1c*(x."8昉Y|?|^3@{8_½X h~+^6Zp=oqJo=뵡#߱q z sùW: ߑS[p:;p8;Ҏlop8R8!G[qGQp:q?IpBn)rV T"UJV}Zm\ J4*"8IcqV%D:85i]EHV]p賫Gï>]5-Ƅ6ס9a^9ou6&wC,q6ϯVBꁫY:6 ok8⸊kvU 9#鬀qrV9+#Y>MgEp:+B.+""*qV:(#͜u|5$m̅р.@.8rRv]OV:ɛZK(f<ձ'(qFi'%3ys>sA+ 5gKpK:[Φ`kZIN,[€/=2XmL#v`_[|]Yo w|+*|q䭎/9.㲞8r}$8;xޝOUW* pSߟ;P-NtZӥ|][^ѯJ pX:=8E__"!ym. LܿUb1-՚qx,^uAV"9˲\[ءp\"w `r\@vY 紆 ;YjngN/wίrm7ゥ+RՠkE&*/iSVJҭD:ֆIRwW%rS-!p1}865>y-`ߎM4H&Bs8i"V4 ׍\Hp> Ȋi-Jq?`9h4}#-lMBt;Vx $c!QB}}zs08]6q?U"б:zsݘ܄3hvNDDS =5#@U"&-{#9T5N`=*, r]Zߛ_Yfꊲ|RҏkW|k}%eYjݵW}X՝ʢ| =O|4s\)./Ne}Iz>IYk&ɶ'R(aVP֡O눞e}]dR-=㚲se+֍٥us[e} h56ԾRjx>/SW]ۤDB)LmU֏0Ȫs|"d1_gЯFT6/aoghvlh';`W-Uv~`Uv1nQmW_Pe+K}Ie;\z}]Dc $PʞΫ.p&=2ȟ9GeGg>c.* VW;l6{-{)۽X`V^.ҿC9{Y6)q+SK:1vgؘf#olm VekC~}lV8c_)[g;k[ެC퉱4l}TyyeguN8I?T?C}O]|rD(e{y` nvVN{WGg_Uv {gNeoSn۔=Þۓ>Xtm#=Þhpe얋_l.e=m6[_;nsIܧc2ݩ}]:ۮ) cLheOF9;PۗL#(e oֽ+{S'y7v q9%ViO\{ےja`+퇴 qѯ>ߩrTNڗcWܥrX9AÜBrBN}ǹcN>*5Mq}GO*l]Tݶ?vܽX?blt*BJXwIZ~s^=ڷ%ߵhڵc2ȩ5G)nԾBYºܭ:_ޫcq*O̗SS/\~? ȟ!s^W*!/v32.Tȥ\yy+:SJ̓K@~Pug"bU^KVOsO̩&i7oU22awWSg9֔'WNGK-Set\\oO+< ayr0ך6fXqWsk'.B)bP1T/Z݈hHSJy *Te}?g/Z᜕ewabU|y`Fa+=V9r`L3@˜Μ";XXx0_s\;vڬr:;VO_3w9699X9f+rn}UN9}7Fo`?ﰟͅo+풿/~y:|>l{3{;-܏g؝XT9{Ǖwbok]"e r~vBW.}z"v;lprFyj r+G˻6vQ9$(mCOMo{fuoJ֙1/[o߶COV{oںA݅uWtz9w]<%C>Qآ0l ^'נg>vKي%Aeu6o}[U;XSٯ/<5K+0_eO~nt*85Le?=fvz_shʾO{x:ll~Wv'ȳߗTag=<;oWdCّ+Cnoadgkc?ɮ] 0{ =%gzN(YVSWX?ؿβB[؃vYwA^[k(e]z㻭hU!b:[K/YA~X߅j}vM38YCY;b<[? PYcXk[ܡy'ܱYYhXc߲1 b b^lyr?tCGXh?~oe6ΊR#eiByfɣ={`ž̙Z14Dg?K6X,G\/^ب,#V=v۰,S4fiD䒥vn# V-?ݫ,>TTDvbF?u zJ%CY!.@d]ߗuzEǞjJ?T.Qb䭐ﮆX&"P04Pw`w4f v~j6sT.`7^6N' >c8#T!`g եGu >y| 7 >m*5kWAЫiQiǨcgAn^b |?yrU+N転 dp&V#Z!Os76>'힧h^UKVlT(RA֨[5+>DX;쬂G1^c]7A7ly闍S-(Rw#۹߻ ;i_v^W5Twv^Smѕr1*?a*0X 6Xj|؟_}0x {TkG~Q&~8i.#oܵ(i?[p>({;VfE,yQq1MK[/X"y]zc )%j!:Oe=G []2Myx}QW]=08=(8U?bvXKro|q]zUp}pGMW '}ƴ 9H#}RΛTJ7)g|=+E/_Ӟvɧ@ aQ ^qcҞ+U߂}}UY^6W1C\2^g)Q_{m_{k(c}+a]7b }HopܠDЫG`ݴV}ЫW~kV__Þ~y 6 U)T0}7pԢ⍏|lL9o6ʑ؏ lmk~2Q]!Fz:TP繖iQZq U^-j7e{oП\W?Rb >8u8wtz:)!FUv\c~G?~gL8Tz5u\B \ g; 3UةnymngOw}#ֱr~{ 7󶵛{j.%pzC`7I`m?u r2Sѭު0O.]]ݏu88_ͫ}T~'oǡN_Ob|\uItVy 3pm%[T ,_kRϭEcm:VPiѐpcʇSjuz;;ؤM])lsɱ|_k|G0zhƺ}f,5[QOԥY;EN?/r" L0v`0_톲k-'b؎phoךr5쟰d"a#)?#WP?~״C$PLd`S)R=ԫR46WK:&Q/O.SXdꃩ;(͔ffgRt>A[)[)3,'k쩌s܈|I }*HxΛ|O#[גY#ސzZx_V넸+,jP^ԠZvgMu25? lόd^: wi^o*tͻx%Y(yÈ{N<: ɛgCgp-/tsޒm*۬e]jw#$v B0Vƒ@5>Rv%|'*nuRG\;1_Ͽx~eT6'xhj4UmFWy(6c_-X^n(m8 %ݘ?m 8.j 6)_m kMMDGqX丮3=k9+WRr(/C0)F_#ؑ bMLW ?kȼ!#G=݈ |Bp!aU~!b~GC^淝5œW6Ac<OqG~K^CӘg46@efG%I{T6rDyk5xyk[ 'Y^ <y+ W<ʕ9Xy`3~\7CXKM'a֏Cʛgdyv^ yЯy\y#0yC`xޓuBقh AyNW纲q>hlڸ*h*KMV[TY;z>H'Ob˦Mgh17{{bg WWF*58ò_5U'c_ϞàdO8uZ~ iS }3eM {`~e֧J '{v @%yיb)9UaAoxّYc$;n9nV.º~eKvs\̦|澛=zQ |T-=^>nUJCeԚM{/`pd<} 8C)ȟSt/q*Xz6bZ{} }\Tًwfv}6zzL{Q7S,fk8`dO<{AcnZҟb87T[s4[eϨN~\W<|{K'O\;'7RTfk}քvlV'F0KH?FЌ͂m6Яmr l!6':yܴOp|}#Sly dۘQmh} {ضv3vs6ڛ/ؿl ٨_ؖնlζm7߶gێukzsF3&m:~hKب..aqݫe9h`kgP~+A W؛O˞6 Wv #8z콡W)?,oSOcs\ð\vd>z} SOe\OԼ>> o'>}>LOα}̾ i7v}3Yb_`~?xa>?>i_9f'ڹ_ e;xEGfyI}%vCs9~E,o_qX`} qC?e 9VA/3rǜUM] z=9!rb*?"tϲri_\Ap9T) t8(R v8r x8( z8 |8(҇eA|Ap?  0h " 0 0( -@aPC=Ae$0" (Y0Wz "߲dC2XW`FR  bՄ>EH>A5 !5Xʬ&tȠeE W݁+b?# "p%p"#6U* / eȯϐZմ2@A<`qe+ZAJ{8_.D@[͋s"6p~tgXi~is-p A}꽂)J5-è=0Ӂ=L8Ʒ q Fi=o8CMx8Ш6uʿϱ+ +G>_ =ٿ ײr%XЃr//ҿ_2F{[ko_ 9wE(sWbWaWA򯂿 rտ-C=Oa jg } 4/ľ_ 5_y+maA^a9go4эܿ#k*+7W`o n_`?3N9l%~˰.˰!sjMCyؗؾؿ04RB7hޙ+?gcmɿ߷c@Feo|߆`+f[7=u?*k?_ſ r׿zKeGs[8_ o~u=&+Fuwt_ z C2eg˔oo58CDM o^7 o UQ}o¾ZO7] 0@(~?Ao{p>/?nb?OAM07Vwrqw) %؇Qt? 2e% QGca)̥'O?Ay'N)$IUr?qzmԿ9?j#>p(S/h;"K/q] }OOPU[/Pq9 0/c;(7N/P`;EvUv}?\W-p[} ~/h_#쌂XBmOn(%읂t|. nW >_pƧd9=0.pkAOÂ< }{U1;`WP,A.򼀇, @o+؆u[ `G#!KuUI cxt=DPЎ)d[~@Tp iEQ ( .pC,8Yp="ɂ .`\DKʷ+XOW4Aeg `/ 2KX! .D]pg9/Ypzn_=r4?Sp`ƹ xxMMS7ZJ+}Yp8\0eUuנ\g|DnО T| TT`v6 T=F@M|?NWVCVlm[ 3nZvq}@=ȓ@=hOG1P!p+'>@{9L:P+Hfidi8 X:GJǵZbZb\Moך8hH11[+G]<&jZaLcHHD|28s  ; i}oH~[VO{9bD!;8<pC x>8|`8+C];aor|꫕2?a+{~SCf a? 2 0^9_e8'=^z@ o`*@ qd`:L聁fAr<CحB_ үl9 #Q8hG??O#3]ߖ+9!YS쿉G꿤 *jo2f-PY[rmlڅABc*5IYj!ՠälm~ʢ͉8'ݮ.8zJ7v_#<=%|#] R:)\FݤAҮ(9d,M.iel_cHy#yi`RTp:߿d: ځ`AnZDNĒEK+fcSاDY~BI޻ہ=Zx',Uܷہ/T~?P[\4AT\FOiٽ%u撔Lj~&g2&TAfRJJH5TD!B&R*:UN]dP#Q @} R?R#*AR)ZTK^2 ̤jZ@r*&S)B~*.DjS2:JI-e"VRO)FN1W(VFB<(F KEQ:2 QBF)KTb"(g?F=%-etkyiDU'3Z¨k?Fa2*BĨm?FqK-b!F'#*l71J܏Q"bTQRFO1 Qi(bԺQj3]ʨw!%3JޏQFCoeQ/aQo-ʨ^Џ(BQD#@ 俕lZ0uQD=яb$ 0Eq QL 3Q&6&űQD}(@J Y@HrԈ")"(bNB9ETbVRBT\RLBd)$Q5[1u" t1SBT|SHPQA!¨DUԏ(QG%@!MGTRQJZ2TLTS!QN z*! DI)EezDYu2UJV=Q\!Q^%/ +%JL5"JTY(":+" -DTZQjf&ŶbJz3WDTQs%DU(SD7O#GdDM&ʯQ[,%*0DOEXBabQ[B,%*Q[ZQ=}VXū>!kY~;Sj2m*?v,1久"<.νB.# jeyW]uҧKy+mƸriLhGLoi{,0y8 TҎZ<{[,*wql}W=]=ҷO\OآgҮyvC0_{乶c A"E\g@nXnER[k@}i9*k RzBYi,>$}Z_S wM~%+!_ )0D@3)KH!,"`R. %a=R#e*p+)p+) A!R&B)b&R0#%c!R6q+)KH  HYD RRJN&d ('+%e))*L \.׶C"%fO2sY=RhRDS,!gb\~φ,!-"eh H)@9HIڏŤ0-!dPZ#nP!RGJ)Ubu+)W)XCd-iRu2)]KIZS I{E52vYB)eb6L9[B S=E唵v)Rv2)ov)q"7DS-!%-)y HH黀EL(F ^hF7F71эяBFC.2:bbѓbFS&0bbe/)dtњle4<b dbthE%14ѥRFJ}*d4j*SVM(^YHhW)_1:623gM[蚍6o[\h]#ѽ-ߐA3Ō2hctq %>29\R^ n2{ FK͌+FFk 1ۍݹnehp8:hF͌&O`tyryYGG y}u?F6Wc{+C /bt|=/a4{֏:nF4^dDK1z?O`"{':` (&` T#`݈F(%:a D/! D;-C? 1݈X@4+-N 4zDgQ57&1 ՈǛՈYGt\EM2&D(:h+fYnCd_JYAt)eG4M15CFM)8%D؈ I{|ŴbVC]y:%#{K WʺhOhiIn%mь rzUGxH>篼'KgY#N!o23ڦ>3嫦V^Mr]yw@[-'dwPι-7e=u[]7oh{_\zPGozH>CH垴) ~,?pa3ôF9=zp&,#4\J < l- u.xaCzـNSʸ=l`qz]]o~?h\B* >79S%fQZ5~oBZ#mi*ힵxM"QG˟vniWL]>Kf߫XIg'2L4H:ץOd+(e[߻@㜢-EŁŧ%ՑgI;uQTh-;;Fʸ)}O+iiZKyϯڏ%?[?uL8n<$]z3=8t#*XUfR%_)JI8ԀHO,$`q]S[%",%5RtYj2,"RPq߮1oAԊEZCŭb'5T%nʱԎGq/ r!uERINj SOr)KIUٍԕ{HeٍԖCHu9ԗ6Ra.)/LiPg.)45A)7'Fj"Run%uRyN R}vR!5h1B:L*ɤBѹ=^THMZHҭ.'VPD괔ԧIzԨs֏:uIxԪŤZ-&ܿrTn]B*עSԯ H;԰*XO@%ԲH5k#l7R%5dR.)5l'vn'TwjoPI;ԺT3#HڠF^3{'ʷԾ{@{9oԿZϊ 5p7R:8T¦yjP ^C?7hpZqVE ['YȆ[>y3ag/E_|ו[;@L8_[*=4c<ᕞc)8Z 3wVzE#U^C&QU>tO ^97F^84J/8,g@f>cZǕzjt2A3i̻ufU2q^82-p|veC{`Up$:0>8Jo}-+΍R9ap*O/mF:1zU鏁%g#kO*-:&}z|=}5h GHn3ӏ6=fUF%zFeUFh2tZ{TeFF<Hg$f #`' ڙaűl|O4̑@q?e<)Әb{gsDﻥ>ʮIK1w62H[]s$dlxd]ȸxxE.d\6213)5L Vf`™\e03 ~cSilL'hE2ݠ`2>%s芋g2yXUɜxnkɜ LdwgC?g/ TТe2P&C2GvJ>??,z37ag1􋙤/ͯ_Qa374[dN]}܃ܟṿXC~d $d^mM C-+YUYU0߲#+`ezXY@ŜYSj Ҭ_VfubNsrRTe \۟u< [[?IYc^-үceoixя䛥{Ů9,};h,p4h,C0-ŠL`w tw?;rtsVVq-X[z  kU=S:䶕9v:VY192CuA'{ISf} ~VX['`XcܬeeX냘%։欻OAiYg#5t0DʣxָGDfmcmyge?kCg[!u@b yl}竡,T ?BXbZYv>7 ץe[c}8K+n1KɖiSelj7d^0{ط-q^ 咥?{o\vv[1^KkÆYg7 hɲNa?zkYY;x6*e&K̷,ҷf͆"Y{h u;(?zޘY.7^YݱnH{  @ŜY^GyG o>$Y@gy <̿ 2IKyzA12y$Q G3+)s|HeNʹTsXcq+r6s4rzf2YpȻ̡9}~ɓr[_oWexTfDzO{UƵ~/[՝8veyilVGFDIؾgU2ƺf252Hs oq(AmЧ2~B1c/+c= Nw@eR2(X}0c ]Ì3n cML?SxD%у/e<1E2{FGAF+~[ed` G_}+7X׾"z-U bN,4AX .?Kz9;Wһc~w]onݼftve#J>*uu$=Wqњ#פ<1w2j֝=Ins| )珹WkykdM*|p gEټURjK$sR!gό>;/z/vO!k_zk1Xp(-0|)C/#|}A{t->w Fyy#Z*ECb~8cj8cg{Go"^0f_;o҉U/MƱn߫zğ~ 4ס6}Mmo뙅7k@o6 }}s@6߇8>[zKt8[{˷"rM#+ķ*{uR'L2VC|Ae/űy"+qg8n[us[}㊾}Ks1MjH#morփn÷|p|ַrS?G.?sOo׼o!'|3fw23gpgp}x.yrm[y{ o*a*--z*߻OjI=c.ӻ_u-p]O: E_@GuEmp&"@Ks2$w 3ih@ݵC wŭPoB/}=~_X/VYΕsgφ:aoRg"ͩǐFe#douQ+8RWq+!GuJR9u6]A j[5A#m:uK݂Z[llG:|v nO(ik:ޏ[4uEG]2_;_k\?W\o٩BS!ߦNa:NHkؗR 釄HkOmvm~ M81RR w@H؎zj> M`oR+-5R+ǽTZY諲ݕd$롂 R{?TZV責ײ]וuTryO{M?j#U%f+ZWאFɼ[jmZ צZ—ߪ#Y]"9U8i;hj)ϥ&C?HUWjty*cUd_>+뫢 |BjJh9_BYHy~R 5gjq'Be~dX2~§]r7jKikH: y%P6HyaK006݆&e"Kf!o ?)X7卌%CC䧜w}$+wn [P6Ϋ?q^"cԞOg >`[ $zo* c|Z0rOuC*R[wbaBa$(5*oTq#*˪m+GE=Qs-wWU\B)/wܖ穕N[J?^ZUɃ"GH-Ws<*Fw}l>W1"'޳tV1?bBo[BcJ1e01>DL5~(a~儊 kg.WK~S1` 臱nPoQE=1e{"G2P-_Gw彍*&jL΋u̜Kχ+&??`_T1?,bܘ*F&F&39UTgLh1+L=ry׵)s'F< TmG+JMliK\o UE9TyJmbR)%U|߳K\. Ǟ۶*x[ѐOT魕Nt* /O2] k32׏]Se*b|T< L]RΨ2B?er]Û^21>eNʌheB)ƈ2P(YhreKb++[DD*ՂʹoTe{TsRVn8*xpUv,ԄqGX,ѪXeoe_"r\~_rq+WV!$rͰ)kͳxʭ`{nU;U_!FSUQJRPRزޣoJ$|%3y%)S UQ<*IJb骴 J[乲*o&6(̱ ֩Z1e !<oz0oļ >xx;i1'ϼ6nx*̻0f)$b ȼ4Dw@r?o7 rJg#e%P0'O_OA*',*-.UPbU^֔7 fa)PаTqW!T|{gRUJ,:֯ Nh*bU]W%ϡATaT*z%|@}LEVE[^Wcw 9XaRjg̩tMдՔb4XgA; XMETI55AlaP!l12Nc`iP1Qx<;Â>&:2:yу#4n%j*>QUG:j:@P¤:ϭY~?Jue(nX;q$B%Kw!BES_eE Ò"BWmaQW@Pʼ<Ѫ, V"?TXtTֈPP@ZcZR}φPSsy^sXT3=9R`QuNaiRu /ҟڐߔE֧(xbU USƵ*,>*~ Sq`X_JPTiXPT)&?)_Cȕ*{Γ kDFE)5?(q/! ! 2~#J(m'LAE!{ Mj?QB{o0_oAhe%lL_7rz3($ E|$DKp|By|Bu|TNh'Head ]29B$ k;A*=&H$H\"3a)#aT?gApK8"ϗs hCӮ H%81GC.VL(%716D HKl(Cpx' 8 .qN@?4qD aM<(P5(D KlHU6PVHrߗ`I@I{%e`^Je$??WUsBP*!UEa_*ChuUWhV'yUWЫ؈z_5F*A@uYTv RVߪz!jXQƱ$Irt ttR\$]L>p(`R޽7) le`n' 1z2]OeFK+!#*T-cU`TiTt4GÃ?=c~&KWGo`d RrMJDqXk\RC)%BTKQ`P#M} פX.mꢤ[u ۊ^vºWQ@uE3,pu>p9>rW>UJBToTo&aW=EQ;X Tv+"2IQ>FȀ$R+ g|([Ghj>QtD^P >NqN~;KU_B[T=w֣D+ 9G B*3UZR9P10hQ$$@>JHpUȺS*XVĔUBܭ(8p]TDQDKE{Q B-)* 2+ b1`HE %,$[ZH 2BȺY%! pND* UprC& K6?`.R"ow8]T,5Z8<̇  QoZV+៫D1[ּ楐RźL|DQ`%'J.Qsac) d>(:U<0UɍqS%6G3(D1PtJ{c_r}rUwQ&~ ?DmM< +~c($QrB MX)0%='zH#}`pIܝXNOX6EN516D;"HN|"1ߝ 9 @L YM1HĪ?Ű#kOP$ai7J :O鄱dsDGcK0%tb`OCBk( -4$Ar=DM/VmWķ^(:bgXO0-*ҕ3(Yr/{bܓCkx6{-Ԃ$g'y<< <E0 $|yJd)}ߕPX!J A=Yr!%V>YJD'KHA6d) |@;|=(YKKX!&߻T'|NtL <Y"aI:NOxd[vt3#<13~bJ o%?Y<ɣ彣@ɣ$ydYL*t"]$~ror/w~KxE?HȂ^ǓCL&91O\.w`'wB7=d?1{0T%A,7]wu&F>aUHQgUPu?+cRj~ރ?1-VQ!IOCuڬ(/$/@}?#h7Kk _}^z=^c: ?xGZ:UGV2ԖMvwdqGnGFm)n{zsV{ryY=MɃo #6>tSql+xYk=⛿k]pFV)c|S=b5r=bKѡG Su^wO=u=S_<ʩ0Z[zM/y#zYuKMvh="j}z#C7T6!姟_=衕|.~!Kt{l>=CVJ-Xm(cxR=LˇW 3</1zd^ԃ? k.=!>׃F$/w UZŽ^{TɂJ1E~.<1#{++2x?eڟVNrtccZ}:|b-d'{uMMQ yXqw'̿wV_r^ֽIN¸y0:\^l xl;YszdFό37xuÌ@̻Ș#47~6/HVY/Wkr,us:}>{*y#C G{?d~7s{Oޝ٫ۭrS2oOi!Oe.2}{tlTRYT%s~Ͼ6< 䂌GNٖd>q2 ݗ~-7{3|=谮>VьB7 [V[LLܚPk?ez?,hP)d~|pNeܟN6䌌2N'ǥ3uFO+.EUx=٫.Tߠ>!J9r͚{Sc^+ 牞S\n=6?ᾼGݳIO鞵 @ݳGi={3 s_~9k9g_SoK=2 .=AO'_wM6.q@^~ ~Gk E /u^za׾_rwx-[_^8 rC=%4YޮoL=M/,n\W֋~_QXzЧ^DO\g^$οԋ,|^K/u-Y%<Rz/s/9U/75Ћ/|Y\ !zOpFj"Yŗb+.j/ŒFXXH2 c_.W%]j5lnPm(M!Cj+'J60}=b4WaTT$Z帄͟d\~#phn8I Z'@%A0YmD%:Ht$lROK%#-0zY0ZZ>"tvpZ$"F.PYi"WDĖaNG ̏O[/+/T{0^Z#FmC8i,Dby -nsDL"i0ƻ[1Z< e6́sޖ}eWY0˲FVD-ZIbY,tNn_Y< E,se"X/e\\6zY""XG0Z<~ق_Xɸ,z,?f|/|)t Ff*8,+`,޲ N%Y?ZcYe<_e|8%,sĴ ek^2N-X&#j2~?ڑVw':ܶxv [DG|*W"#b,p&Zf q|8, ԰,ɲHBEYY23heW6W~3Cs,d]Mu3A ·&O[& =Ns",d>Ɓoۑ浌߇c߲ Av2}kiֲ>ZaiOGpY>bT`qùaw!-R_[a(g3M3D,ibRO%IQ%lD BpDчpJzN#uN5rVwF,h_"Q?>?IZߏDJ:*QG%We~I)vz:QS:I@[1N;5M&Ix+ic%=oDc/\ieR%oDAQ$$HMI@,%S]Ul$:Ax%:^%Dŋ͛$ZX&*&Q%:uf3oƺ5o~n)a^)C/.̒mPs/͍ٙ}E1+sJS[,2/FYa*=f>"RDuKSn%>L֗(P+zMYi?s7=DC/(ԙ8gv:O]7mTR~mja_@iT/VP+&R2FN*wӉ~ NU.7gj :yS49bjN=ߒJrM'|`Զf]`~C!o .׉C޴;m]ڡ;_W.?8]op^+zΚi'u_svfzs4J΅sBǞ젖^v>t>?Qv~|Բ@EݴyY:yףr0Zb O6\lN621 ,w)羫\նGF+VߞgQ :s坰w͐(oVEӕwgowPޑg<^yqhѯKwAzW9;?Qogec6ywu~0}2oA^ï^P::iޕw7{=57E{7nUn=wsps(RkUO/S"|U*-ʧÖ g(J>\Òx3l@7uz=|6&4,X|}gGGP}NҖzW}Wx|Όo5$*3৉ʷ5Mշ&(_A:@ou?OU 6hn~^~MMi"`~ȅ+1Eʯ^/P~s԰~uxu4_kVޥӯykf+ّ'p~C3wA})ͯVX !_FW~0~h{DPZMUSWEӊ_,L<?PJIPfT1.g(w Vڦ"+_) wrVp3Mg6]Z7T*| ׀oe gGݿNT]l]򟔴FD?t^ }\ Ȝa XK=o|^__ߛ>*7 9[b ؂y ,ǕU`cVYo?C t 摠wVA$9KAp3X/AKPAZ ~K*p#=Pb (p28vgQTۑ*Pw`P(J`[ XS5 \?Ʃ1_wY@7 Ў=?B9#kw<εX恵Xok}=| ~0|ʓN '[W=mX8 h*TՓ̨?o1NN?¸ wnB4zoTRӹ=NM~3t] u$ikO_nL幂iݵjIr|e<|e||w~-膾Aw0ѷ7uLSͱ _u;F~u;On*_ l\<_(ߺ@]tMX>}>RGȸ_T|N,?h#|g֗ƣ~/o(Ey1{G*SɆ{]y xƾ[:Q+^?ዙkgVP^/P^!/xId~d'_\U^S_ 4O[‚ZY^ ~_TaV?5Ң =1d^{UᏪPy?U RE-U |l+QiߩG[#_wH#Tsft^ׇ__+k|B"CuUA|bm*O)ໞq{ Sy-FXߨBףUcf;8(;ye}y.<EGOT *7cf9* dA p?T~m:פ.Ea3֍Ygr۴MҟѾH[ 3ZW@2βOhQB[ &u4q]2muE%pkKa^ז -Ǿ-{B[!-uBo+vV -I[ 7bm]k~͕&hmF#.Vti/~j$ޤ6 nm8+`9/M3ȃZ+5un&GGiC "S#*M­M8~9VSZ#LF, No+Yd~[ݵL{Li½5Ls@MpipjfwAmT)? a/Z-yRNJɼJB|ex::@ 5?'E@\eB B3ɼdvBș 击!{!uK/o:<I=pWJRwS|.pJvX/ǥntDavZN~*aij_ԹRu^ꛦzz}!aWSR_ԻVJ}:Ro8OwC!KR&uK}<7*iS lD'I2i^—𝚗нKj޲ωMfOV+(|M@|{~)|9 od- YkVN=4]*6z_Az>d턞z.]5_BʔX$Ϥdg{|躛!\nHe3߽fd;*=ȞkE ըN=lg}Q'VtKџ.lc0{n3gʗvxNhGp}Fv5ʑ rxBms%ufrb1rdy (\/+/S<,^@M>#dm+jy۽|\ZLK}zmDױNc1rab(j'Ë5ӕÈnZc3 ]QdtEjn1z~!~/QQt\ŸqȆ-Z1Ǚ_~? oV;- ޮ @8NO*CB΀p"]{]Ls䅝é߼~.ڻ-ct߯6HF3six2W~־t*y:o~C0$z&!e&WrB-i5YC X@!-ց87l ؍iK>itlU8]O~;Z*rG+ephk6a{RF ]|d *u݃Zi :Fz r1v q4/ sJ^2&z~b'y?e/sj/Ծab} bQWyBuFD#'X% S+EWHzl3,n35-Pܟ!Wov4d%;95pXBDp_o#Xx4Atq.O+qq8qp& nyh"KrMxViuAxVlvdޏg3AX;pYvdEJ4J14lA,"Ni=m!t|ŶQ 2 A‘ @g&' ǐZJ<qc7@:ߌChHgj0 x[/M_ڊX)+֓5rZ@`X2WgM0[h⥌$[@J+˖YZerB[jsKKGE8Q)/-8i_!lBl9iS=kY_o^3E~墠oIPzZh|CA"BAi-jV#s}Lmlt͡ꟾNMl]^{ԃA 2>ݠw%T(#AB *:f7t7^N=zC]'a3" D 7sCtCbԡ!2%M"J~MHdZ? z[J=H{èd Z^-g5CL93kY+.'.lhDh3aȐ"zTC|?бEǵdk3\&t&}"fNɶnHZgG4l̎23 -g_h˱BmyY"TS +ՓKwbGCWU"lc$Wm{DxQfBc倮D7 xnORi9mpRV~&Ь{oI@zE+֖Q5?Q7-u?[*k*OtmGk5Ͽ[c5ˡe[#rR{TTE9('.;=g~`(8ŴË6^l~H; M˱[l̘E 4?C)O}Tހ'hKrOhL6?Q~[ tS_i7z~}Tךo .\N|oUmW!eftK u25ң_ 1-#(cW} 675Ӛ< T}~eEs@87>}i<HVfq^HS0 Ԙ7k!u*bhݻ@ wu@z Dw 6н{@bн }g0R}~t(X.GUOb6yB ȗz'1BcziW zRȳ^88y='#:Ջd@=Wʁ+\׫Xz؅z ũ' `=w$b9G W=GP/@ Hz^ 'P!v^~+: V^~@i8f," ?/$0ROzR~`~р'6%XJq%ĸd\ 3̜8O8;yg؏S@ ľ@IĦ@ ,;hn\Ay "(Tgk)Rb*h&$!"H y."&8?6SA=92 D (D.YIzuTP: ~{ |=#Q%P~@IH R򣄠*PMuk{#ڨ@Ip 42 Sz>h3Ps'y_>W"+1ȕ(Jr%Ib+ȝxJD$W;qɕJlr%: P(W+qʕH%UD+wХ;P tv=]E"h ̓꺚2倘H ?`r$@o ;_/J7*՟S{2[V ^]=5TY g$ RHAǰ>T>:UXG%xYnR@Nձ)M'HWA%^KcWjry] $v38zTKӪ>_q篯& U:{ )>h$4 Ruc8=zvqˍ  WL"  8)9 A/Pqy'-ct+Scr`FQ>|#}XA`}($e0r`^rk\"RB6E Z0Dƥ@. lhq u3N3N ff@ǭ@V-N6f1OܭuIUqϤn~)Xt_)?1R SǗ}xk(O_AÌooD֨+)-Jz)=GVCb(xo'hP* EnawOpqP<$nǝw4q9.qEC@; B8)'uvzׂRm'qF>9޿@_̓'q恿̓7|1N&.uRW\{ ƵzoH6H9k=趻T}tEGE*J\yi\Kދ2qWK[#-QhZ H+ ~\)WI\T2Oő'W{\aAˁV(C{+ec/ʾug0cW.t _c#3v:R5$Vzc'2; Ha;v"]إ( +cltV$د<t+elcLxP'#q"%7^ೱduطXT)i?:'RF=gq@5>idDks)\c~Y?C Z94#k9kG Z;Y;!)]0Z:xhu|jDduG[ ([EDu/sXqrBI@Lf *HH.q\"/JUuS p:qA RU_~xF+e]ӣOuWJ+ Rt!R Z{օ3BqI u]~6TYu;m)KʽU4|.)*eXuX8e|s(Rj= td%JN|)r[J\A2..bu?P$Y@΂o)2M2_#@ցBa~uWR&̇v%3zZ;{]@V[@X~ 9Fk#m%BCYL7n*2oe~ 4uHʾfm(@/oRz~H|Gku!Z[[>IZS+ׄ%ZK,Q[aօ;jr\O&TzR*?XK}+l(!R .K5M֥MYC85U&E谮[jq*( 1&AV_鿗M.*/,^XOn-вgz=U*z$?+kޜZH9^a=$?Hd?O ?,&7OK)'Jھ2o  y|sX޲OI UKVA G|VMf-!뮄+I`EE1TLc|UgVqY&zI#NXUd@&²jMtk<*XXce?}9V;묉8VQ򪵚jBU%*+kU)]]CM /*@)gm#YI9 Ƥl 4?M7Ƥ<#g8qeKMZW}LRzXhU||o>G82]Gz8|;R"Yް~`T|N#HydYBhDm(/)*>^*Ք1 yYmJDOUc&\IW0w^ 񢖙]>k{"Ğ'ڋ&~L,]> R')s%(si9hL׻иYWxlR=W[Y&tgoVPqXUZ t\V SqyBgO}"q NQq#y.VqXm↳0]ōEm8)N_Vqxif0f!,n.'{bnXă5xQs_"ub5tN-R=.vF]͆m$lMX;9 yƑY&ts O~Iśx`i/NaMh8貼wfA&p(7n١A{e1 }RiA8B ܢ,3{ &>?a&b﫸?dwW>q q{<K`yCSO"lcU`DPyؐF 蔊{PjLC6\G`qY~!@ԏ۬u؁EϫylK@q_;K]bC=")">ty6({|!u6dvXQg7!%nsbzJ6ldk?h=͎=Ċ?w97]t$>o9E=ޝuse'z%g:ĆOj/2g~Ѝ5yڋ,[wĝ{xc~DyvDT<ncN 8Ў ,g7J2串Pc78(bF$1V9P\i>WfvY@6dQY10fPɤBl(E;WމKA +^c2Q~CA'Gv8Oa`hvP#&Q;?m/23SrCZsUfu3|G?W.?J;k$J%^\Ӛӎ .2|8؋w' A@8쒟e/!UE^Ǘ+)WY6|A^4HhIԽejT)}0@my%鹕Xbؠ_-wf4`O8;(P6 rBfv]Nl1TݩmSРңΟƤysU$,;.qvϢ 3@ 7۫&9dЛP J[Q"27Tjlփmy .@o;%@pŵV$#sx% 0K:`)t wG% P^:J =$ޛ"@|e/>#@~د_`&Ao8InYh~lA7:kYg6̴cڶTbKYYg1'SޒPF !Upo RɃZa`ߨBk2D)VAp (-_ s.] G.e-oTѕi{(i!ɨC田Ϡ?kѼ_ԾI&q:o$8k+g}y(?^t%%K9 " RZ~S?q;^Nk*|w_t0@?FE :^sYjWjO5g8:fN]Bq0*иuN`TAVUi7v6U@f\d̅Pm ϩF #|BwӁ-Z0'Qvx x*yUbwef j.]_-^VU[9\W&j-la+)&YPbŞo)F,Q:OM7-ȿYb%޿+6-^B퉁_VODmϩvR5zdc}Y~1M~)'-PS091rvSаxĵ%'[tg t\Wq{f٩Mȟ1cb8qlV65/]A$S:7$%`(~ ތFףɴitYοfӎY v7yߤVk<3mNUj+,ԅŏQlCω(g֏(iFmRԶ?s1j{u/F0 jK;}K\ݛ~?Z:l[tJߘ0;u{Tjo*ELtj\S-h<Ö ~BYq8LFQk;$Fh.a{6;4VhAXݥq\ -$#ΎK ǖu0/kўe͢R[LJ MUѠKZݤZkhmfj /^@2~^%KP߯QkӼ5y*T4.,ZߘkrOSƝ/EJ g0Q ;4}gcelǸ#i} ҷ*Wq~x`, r-_lʗkEz(\,ҕ#T>Fj_c񹐫AgHF>?ETG|^[UpB*|qjSۗw'] U$]lrJ' ~_.jEmW9nYu- "Vj4MTFɏ6ibjQő2rvp1h (T&P:_uM!*|$b"Wd[ m-<u$U@kˊ_m{D06q=g$;Y6zQ)NYPvmWm;tv@ٶl=sػS Vu8ko胶~;ˣ Ფc{.P{l}:6Dam3C0'\Fי9n\egAeCuay3x}껳t_Lg8um4t_b˺y{}eӄ; N;k.&PMɼ!C1!C+ϐ%[ͿjpK0_{@˳뙞h Ԧ~C ~W8ak!B"}NmN/y|ӊKQ4?HHiiޡ齇Xv_-%Y:",=8U]0es*0Rg̰S `d*ub亍(_'7ӫG3 =p)('KJ:j2N}vfO=UlTڣ)3CP?Ծb ë5>2Բ9.zgbj8n Yǥ^X@B K0oFB8~:p/'+N3rQ rrYnS1oQ>'ﴲX U! ? 4`{hX\n:)eqκyVR)eRZIh]F;eQfCN; SR+)SKjQ:eOyd GQ&[Gl(KYmvJme@YS(eiD4>cEp=LeIU3ʈ_⺔wJq]+%N!:-NoYWy\ίAa}@Q΋{[BG'{(o{bFFzj-ڏS[osvR^BRE 'SJQ'ZWE[\Z"y\[:U&$mY<3\Fy_S߶Ms:6~ӱQݗ](_q}J 1GmLj'2;\FUxl?_Mpy^}:įN jr1}unS1I6)9wj<~rވɹ VPoE<ȃ^A\MBfO\~973̫ ˍvg[<͇{wqyr?xwNE|VQ[ȉ. + ߻ևeޥa.; C~6k}X^qoS:pwZ^_uwT{Ou4~+(Nl?@BA+aY:|8æ[:jkK(^ XְcI>cF=N׉#@Bj^Eyܫ^Л U/d- #^E?hjYMױ8/W[\S ĄmYt^iF$c}}~j_i_n=vlոrjSok$G }5oFxO6L|FQ)!TY| 25 9)pS/ȳ&'ctX!75F e27]iJKQWW 55HnmǦy:6U}8A͚Ϣq-|>O߷>[A tlm:^2JU,Ly} ]`:v.A'z&>wқ[=D-ovW&u'Ԋm}m6|*LUv%7糵R?yz-{~Igg ʩY~3^<n S~"oʼn~"_ca{7*q,=kZrp%?Co*hWe~O~:/ !.Ei^H9ǘįDj J|̰q3؋|>ej#k,g.ltagѣ| Sj =_+W|k.} 4OK~@<1zJ ֟wY=~o}ʷ'QF1u v_uZKvulפ{i'u|X &\V4ri>Ar?t3j+ӗ_M! 9{Ag-N ;rӤ.pwP:ڭ@㡂 =LWA^⡂O΃~bN"2D)20-P:@繁imZ$پzlKPŶ]Q.Vʶ]MWBHQE~՟D(, Ptҕm u$pl}0Eٺ3=->ߤ8*Q-w^9x{mT[N~5"ՖD[:w;BcgΧr0]7jH9L.cP"VcRZC[Om5qWh^ 83lU aƘ&4Ņ]cL=qʸVF][ygBUɏR~EsQ vps#&6d+*a4>a^J쌑옪l&y/иr$%A}^5LJFQ !:,,WAeK]n~`Gۃ1eSkЩ 8%RvH ՞xQchn E{!`4Q#П)ScxxGHpRQ;Xm¦JA[oqqnwRn R߳Ai#P - bK_s1'=bS(&vLv*~ԾHnh_CѾ]j+؁-A'uQJisʢ ,NšyCMA&MB#ќ*C׍a C;)H&1-V@ hA<t`ΗT'nCWiQR*+b@ua : ,DwF]WqΠOS|O-v2έ8JƣDZԉZRVh[7}1W}qjdjKA{p:b_>er_gZ^tgl߻1~tCg?zj¨ GP6 e=p\k8u˽#8WA% 4:jJߵ|[[zR9mq Vpp,rdjˑ-E%<DWK ̗ocиf:f~CteMռyQ_X[$smUCmbL.Mͬs6zm$q-2[m؟uҶTn{d>O(p03P{v@lz >mHfsmvEP{3d\3_t`i:HI8%dRH;wZI7 |o)D/n}J8>r 11+c2e<14>Gd;┈G &HȥCְ;+[Gb{]+i Vg[#vGKG bf<^DM.0?Q=ȃtIQp]! 6}Y˺2Pޗ8=TK@?m;}}ƦTm bWVIƣ)۷#s%/P# t>gX"4՗[֔R PkaߴY`_wטWO+u_?Ⱥ(^S2?D[_+,~om7m.֋z!vm=`Wj'![7{~9=wl}$t4c%{9q:p 2n,|p*l3x3+a$2˼]f`ES7f =϶EkHY%b?~ o7llbM\rml^eО hkZno,Czԛo1QM@V]K`n@2$%`!pZP$`-G jO =!X02{@/Ow DA@hvL1u psLD Z8>n(Tݲ0h`ÁHv % o 6Ql;d>ƝA"mжA#;t~)N(N6mJB-Mbl5^{i훿hߑYYr)ν5ld {j:J~:d`_Ѣc#r#CG D΁g2P"$5627rB:n۠ 22!eH.WK睕rtBtt1I"ɐ4}~D2C?-l e,wAj߳Ԡ>'P,?> p'P.AG[کZgWM&Ђ x"rA4Jp9Ud/}dop>z$vDcVVO)FGr)=y`/sYf wAlI3 [Q &-ը3BIi76yn6js-*߉+Sz2AVt9ڲ  q ¶Xu Khix`iOZZ_i`_K뇄g2MHil8;o_$J.*\z/` @qlng_/mP@ 6޴A0 V7\e3/=6>^}e@Mj o9-K1##3C2"b BN2+:-Rt,(P2KrFr'm,s}G \4 Y!YІ4K[ M$MҖEq9\i+S.p-g=GӖ!$'mD0KaL[ %lڡp1Li ]-W# ~w\ÿ̹Y$ -:XOS-66.&u8r΍r*?!nj1ps bi8ײ<ǎ{<2DZ3uj9_<`,mbrҦ6w]84DҾ`2\ĤgBJq'Mb Ҷ G*MӶF igB͈ǟEE(>oҺŗnTijn[|:Wj$H hޤ:&Ҧ lBӍ`28_MzZ_ ٙ p:.[$q $G8XG&H+H<q*~X%vWuWr"NIҟ+4ZABP'%io\Fp>u X8d?'~dF?#( hId]DiI 89 ,"~EPEگLiEE/NLU_&Nɴ3lqAjiGv ne8].#H}|*qE]@3;-ԟO.vJA6ivS@H;%Z7*M's O 1{8~GI0]N]6"Bg|=Oݓi8X#Hllw`MwH, vYi_ 6YVb GE GqWD, &A0Fv)L6 l2d!Í5J8[00dtH[_4Y7vEZ?ߗ!ԝ^J~=~i$L83g{7:ZY='ΡnE'WPžCd7CzI$YOI{xTt,1tbŋ bޒ "yy]~n/iK=@-.Q>Cj"o+C;s t5+81?hv{NΧ\.Nq܈DZCtEk/+'Aϵ<ڧb)T? 9[Tm^{B 4L+4VSCy!R=&ҿl *ڞ;{z_@&ʻoI 2x#3sBi+MrU]{v?Q+. ?~=^@ŲD03 3m{-n^W2MgOd¡\y_6XO={+{1e6ɋ_{wק>YqqBCI_E0_Ig?@\OO$)o Vu\\RH I^EJ&h{ UiOYg-N]D5Da юl> >]e=Mho nk; (Ƣv6m#z^!Rl GMq}o69\~^nn9mA,nW00}… )l/`~#S7;E'rnc*M]" i_5GZt h `@Z%-f4~{s`͑nd{zHs~vU6*p罠뵲bO$- 9Pƻ뫔ϔ;/㑌Lǃ3yt> n8 >gIǗz7GǗg8U#VJ0P>J8h60:.5",>sp\==gDt=,̈́ jcٳ}Jo#'<-'v0yvD@bFxj$bVeW|ѷ }wL{ N__{6}wuq'J9"쎓@h 89:\osL@<}z( oLfNDfؤf}_}&'P&$Tl]`xyD~~Rz,LӸނ|@]U{:#q|k@H d2wm}@Fo5A\ $TĿKA~bWyeƙO$+4IQ[(f[ #.? kò])'J>)F# A XpergoI~πΣ 0@H0WؐE@ _ꅬctsOc.8IK+G$9r"eɑc7">E9VlpEq.ݩuk~jx6AWRQ++{5I[v)6MPLP,^ʨ.h`RJP * z9h" MX'SZF#9i䬻?\wG(ph }r@*G sDAAs'#2G|$`" p!K#Tҿl*TW|{b%AP]I=b? h ߄\܈gƁ$ÕS$ w~`X@ S`pUl8ۗGS+[@M&p=32Q~A+qGD@,@](PG1'荣8@( @ e(2 $U;*@tBuAu#2!ɎD R+OX#ID$%;Ҧ# Qr6(YQ'Hs/pwfC-nǂq!G jٙGo-"?xN:mZk6D>rX:Rb 4  FL`t2Z󜥍E#8<қݨJ# 9?8PXޑPxr8cs.H!+a|@~2HH.a#+G3NjnnoIT-$x `@/uq%1s qk> ԐiYPUfL̰B䠫 u4Z v9n!o"omo8Z `Akqvh ˯I#w4 hpw?BlLޟt8rtx 2 ?\7@Ҭ:&4AMx$pC`ԡ-vOfXVC$V9 C$f9D\!Czc+;>٣= j9>3\p;:#/Yp9:CstnGGq:>f58S㯔3KLUGy[KhUL`ÕSPnM]BLm!C*(DKpR0^ttFvCiPW1bTž@U1(3\8r^SG_6qӄ?CBp c8w |8 c'͖UZYc0!q AVWe9u"zsxsƩ,o-# ~dԅK%b?!TN({x1ޞsfNo-&%;\*Ä)?4jȿN¥ExÛ!/0!à:2nw(%KqQ8a`hB1Hi p9#1q@teZQ0X93,v뿗"UߢṟYgK[- "JE刬C?*щ|8bGt9^zx=4  ]M%]иo tl@i2~ @M91$٢c npOR5D[ձ arlS61@dW&}'KEkۋ>s;2@bp8oQ;: =|F1v:N!=b8~GY?GQwqTd˃av#a~K{ ѱw&{s\r.x;k؁ v}:#L5Y/H5*6]?gӡGڭb׆o W.$B[DX +~t) tݼ2y?>J,V2zX!~(dH=ҿw #XM^ϣEZ밀"M%Z `XĸMo{z-( "nJ7|[EN}م; 7>-Pz"E"Psdo!P>9P\2&;yg|qN|xF.:YpAN $8w:~FlgD&:~–':~Bd\:~X"_X3ϊL~@ucg5=7;~x2W鸊(UNu+ nz VlXwu+ge}=DžuZF7Ϟy肼C]Vti~*ǜUuE`Ɖ':=NP%}'ע'yp龞0D 0>+sVR-:pPl%8.3MNpO+"{p'2? -֐q~{b٘ᗂv4AD0%ǍtMగ=-V}8c0D(#F)O"tgV|n<_PMtI4@E_#X Uzxu5c0Fjw 9X,".@GT{~_p[G笵pI*cGoQ*bK|}J/=~~]P\W${h? 4F߼}u7orV}KUћْNA_3\ Mq[2^ t=ф/-jGu4C_=@ Fte[AIm36A5L݆ -t!P2z+wD@l%`zћ +5ib8)zCPЈ 8=O!@ RG.;=@jW':P{cn>On^E"Ce;˿ +K){J/L!+p2\[6lGi/ L戌e!/(zkVgz榉NJf".(^8-L@[LICJ~ % .d۔*]>r9]5"@t#3UhAl_IDrEB*'8Ai+H^*PJ7glEZ"Ix54⣈%S+wIi'4|_{Tz 8b* '(wm<9*5zKHTIЎK.`VQ0,Z6M+i/徰*9.COVrO@/XhvSRpj=)·XBEA|@"BPŠmȻ#B3v9vK z!utV0*Ckg߿0实Azt)͠6ۗ=UDs88P[VljڱBL;Tz{`Gv_RXH'Bl'^^'VGwbY8,;}{ȂD8p0!'RlɺDQ;HY̕Mӟ4~ȀqfD㡅U-6U5Ӭ%KԸ}x[.rˠJD--QwZPAXV[_KU:9)Go}~Od0^:@T.]O9= tytw߹>ERbsJ=cX&-w|Xc\" if~'">25H I 8!뵵(Guxa-~,E>l ;ogW?!wRg‹>5>,Z6MK-^M)t4a(m%=E~ʾVLA('eU&e($orReʱϖ#acOtMZV:d4yk[N-bӧ6;EԩS#gzzT&S7I[Ԫo~)B[긟f3^U^RjDeB.JfmV4hNzI`*ddxW&f6&:lw#$^ַ =(TzVg~Dg">Q,>YɢMa-XT^a2P>MV4_ 0}|>qɬe 5^ޟr_zi +N Uf>)Zr+׎s#T6-X30KP誜+ghty$gcmN׳ZBà\NPʾ "}Pr3h_: 4'\qcT3BaF-05sAVEBB!uZ*nԡ OV0 fن{#܇XQ~=/nM@mﹹreRu9\7&p2Ne*21I)SVQ}v?wt]ġy+~Z] q&67|%o🆷6-MؙTޣb^ߠ#{Fzw8/~#.1,.c4|X ~wĿjwY]D3||W'D&D$t|pj V%L~s1r,}g/`J!* "VŠpa><$@X}/$AR# rR9MO(Ƃ:AsĈ3t N`F Ý8Vp`-5ldzq< $:6E.1B#䖄F`A `Z ~L%",@t#38`Hu րZD]jh߆vE[Q_T8_t60A<{мKz-I@A*$F== g?oQY S@~u/~g舩$ W2/l5CMߺ;bVD_Q3Aq)l`&)pSRkUTf>MR4c^f>;Oc}{ /ZeKϭULz8q@[u}y4u7]WPpt"P{ Ŧk(@`zE49aU qnyi4s"d;33r5g"mBjDLfW' `=sFT ،jsڕZ#Z)*^T֍r'7CVeFwAH AR!(&FVI|πaP2R$%|@+{2yc>4'uH͇i c~@yIP*}B!Oh#$coCZ}]meo_NhN7߿t}hgt$ C}Jx9 Q[ ֕|wH㾀 DPPn^qi 5z^sTARZ_{4\GhepU6x_8g({##5`1_ů۠+KD j`tS#2 t^.Coy ? b(c[(b H%JR9t>Lq#^QKp:/Syb](VO1C0#N^~+ԞB$7n8 #QwbRX p@AOx}ׄ X_0!]+xV:M+-EBA-lbu_?@?8 C8-Io )NO|f"d$;ܵP;)^[qwEKw{ϳ3zuw=>I"w%Wߧ7|oA߉LGT:8A }iw@$zN%n#3]Oº$zZNc$KW"]~Ee%$'9땏eW(?υ7,tKtzDᰓ8 z%#OeBiB~5~MYo:r'}o H:/{_|t/zd3rO/iJLm +',d8#8Я5ҢtB8I&~:≔:2ҵ~GeC*ˮ~Ů< Tv8ʢU#OW#lϝ]~B9~S{tD 1`9mz%օ_5GzUClCpL =mN*@wd(eqO~a|1"KU]BC?vqiax˃7VŞMtvε UA_ustQwTOwĦ@H_ 1N~ˑΣ@/k ħ: 'coBsHUzrs?_i6h_P\ zN Mcw@x#藿NDbޟT_9 ~w{k͆EKV8"izI9D%vN}9Ğ#~&qxBQ 2EP n@eG'{48MX^{y?xdנp=};:r#׆:ѣ_XlՀZH_ {#.2'/ȓ , ~XJVl:@+]%ߧR '3`\dCnIP%hG< r HB6\0D tKq%ݯ{t7N  rasA r^q ?08_zOABP3Q9AK\CVpi{C^,G#oy[[Q/#=vw t߱\ 6x!xZ,so,XNnqU*Ga,P*A |A]d1/~k"|,.9Q OU/ }=d qB&cBVcC"8s%i1NJSC?[uIλ$YyQy~!7CR%"t!$$NDs4D#?w5z|: CbO|@GgT|d'S*qvN~VozOPC$[!1c!^7R#$3 R/2_^OsXϥQ^{?~M;rh `ȭPȫ` |vvpͤ_|GFOS|]_pX! R!!&PG=_GPoKFd>EɑPjQC~UEHHd'Œc'h!A dž3u9|dy vlH+y'S91}r %>p)"%7C_ ܁u "8BsxEaDG%=uj` &;  tG/Gݡz:«@zF#݁u ^EU|4.joCSP+gԟЃX+Azci;MK;r1z#` }= a\~Bo`DHУ*8кP%EP{UkyDEE\0tqt$b)xwfiؓ<{n~Y]a':vdp@9W гY.Q;[!?_nvzek4~_ V+C;+OgLvOד0"Rpߐl7Bdʿ*&EA΄J*7QIp(iL xfwCEN9Y{RYg:z]`' y~S>%Iᤠ8Ct}^ }P-6D.C~iZ{KLb-uE3 ^Ky zT:̑C(a,0>.~He O؟auȡȠ }$W.wk"wσ;*, Ga0OoWUd`s߆xӼl ~2O ic]s'Q$T 7F!{!D?qې!Ӽ? m?,5q&?>KTָ<[_CO0ۄ\ `_0n!s!A udR^CbOCژ6zQuW}H$%0jgE/V $0xǿ$%{wWtv #RXT!9aC_ tg09J_. M<)J-k@/_5Pz3S7 O_8\ p߅62OxYȿ𢐛a_vWؿO92pN 0(9jVm}$&ﮤѽg?1#@xa/`7;@HC"<pO  O¥s< ΐWO<@:?Kq73ý ?1`߅ 3[/>.8w᳥G+a< ]_(|$"|#"~$Bqň0OEp] #q9oE_}p 8𳰣z׆w x_ٯBg;Y59y{8+~Z;"zD`1ZB_. Mp`U"+b")IEᐫal׭uQ""KC,qI6=@S"a>"D'"$TgF)~ȶhw@֫H |&:m|1* @QUvqncQ8_Ge w$@ H@{#b7Ï!kk|Es"!zD)ħD"i":_".O][&[č:IP"^X,B0j"8_%߁oD/GFQÈ"֎pVD!UŁ>!Y75_ÿ{!F Lj(#B!vADy\𧅿uIDx׈t^DG!߈#>A>=TA?Σ'WّHga}oD$FYzv˳.k.R,:oଧ "ЧN*[iW-+ Nb~ؤ<9%4c?22~HW,;.w,@|ؿ7}{#ȇwm"%~(r=r"z&}g3-YF%Yvq'"}bP"G߉r@mүL\q SHtf}Oɢ~?:j,qWC$$Q'u|]h\~ ƋJ5,'Z&  &FD=A#六< Qי>%j/4j,QYQ+?DmrĕPBG҈_[~MgpkC/d} P3wPk`>495omM+%h75pds܃ޫ}!l$>in@_ӈF~/Z 49 Tt) |Psty?F4O BEOt!!hdA0+iTJ1uj3D yti_8hALFcq},O-~7AI|}c?Dk7Fzbܕ{-F߲=~W)xG|%&WD1IcGz#[LO{101Ceʼn9=zp֟z0NEw;ZC/F >:WDSGq55E/zN oiA׬z< ͷ`j:\#|SO 4Uak ؇H\Fc$5j즨'cY*c=[>MJ)1 HEL1Oi >9ћcV& \L+ ]bRՈlFjJ%6ǹ+vGFuxD9%^TVb JlAǍM`/ C{P?O R<똮SY7w㊸ yM qH|Ƅa*hakL?4rx[M9j\ʼn8Oϰ>!'j7Q[1.Q+}L%&Qvyya%EJOhA= "!w^]c쳅OL?6a!,=6[̈ 0 S/~;mo? z y 8C<"9L4Xa sA#Yc?(1#1HȽ0Pya4t= lf~~zO9o*+ a9ΨުN'ٯ ;yĘ~3aPd؜~ lWB93B }I_gQYNl.waG4w aΏ#o=b╜0ZO :델09?3l̃1Lۄx0ٿe?ְÈ; .~s BwX=?&EϿ礒qr:d{߳-ó!|Pign|gdqOYqyx{"LOɗ與! })™ ^z Bޢ۩}iB9ȸ-uXWZ/#W{Jܪ'FSA| A~gyU x\FyWk>//qJi~%Á;ĊRYXƩ 'Ae1{r>{mjt//8ӠV1qi <\q *ng vӵ7GPT. ~55롢׃UKE]<~@z ^áR%O9~+ uiY]獻nH?dߙz_J8_}g8ҙ~/.r1KwȧחM]Y=%Գ3䋧c|h~O*7C<x 95?]C=qin>͘4ͨw'X~R<߳w$C==]V&=Ey@#/)y}o1qWM|́Co%ݗK]{ .yW~䑞㟼~2oTC<#):u7čx8MΫ[m:7=鐾3{bʏ;wHϷNר];pl'<-,2o]guLݶހ{žSz }>I׍ktJogw]݃.N$O'8dC<>?brm)sut;&nGnONgq%xQY YqzOp ܮ:"޽ -2Mߦ [TF@viW|q;gVO7Q q'GqS,!w&-qyT ^L*kUS=SK<8Y,_zg*SHOx8Ɵ'8?U~s^O~Q`<1rg<\,cwryO[S8WC{z#Sp%5^AvW |Kzyc|=7z+' >^7~ ھďy ? b[{;vy NVN\3'N|2iHy>`'|ixyR>?Mi'?H#,pO8d?f<]4n_Xt=x0^#\!71.jF8/o~Ct3Y/!zJG~^TTQp.X'OJ9T=S=s&='s8䱧yvx9>q )1Q~ϰݯj칒/wwCtbY/0Ӏk>A75XRpSg.|Ν'}]p:Go }ӝO;ByMǹb]_&ו~qpD]u;͸nT ~l̿'\=m9HuZmWɳOf"|u ϼZ%ש @p2Wwqu*_չ:qs:ZN9-pO+ +Xn׺}q/<)w>*Q{G੹3zn}IF|+uwݗqu_?Sʓv໹UdzO*]\p= <>з]ʵk3yw_סk\OnC\9.?c{%kqƕ;0^hbUU 8d]:)/|Uܼ<^8 Xniݒ;&yzOMέ'3Tn{a: ?w|+u<3G]_^vuC*yT2~,mt'Mp"s;x?o'~s/#|7I$xn&v[=eğo5$V _紼Nw~NKv9T?9O6譮ՠ&Aop?sUx;uч\ [dwAz0yL7௮Cv!S$Z*ޮ^Ny\_@_p{,o> Xnt1^Yaf=*%aϺ8i7݇^>QqkYcIOqX\ŲП+Qѡ̈́UQn*.]UvtҼ޽'ތLyެwRx<~_Ac>9}@\O0]3~`~8o>rnl/e?Y }Gy4TNO)>?]gS>øFg{tǕ~z~+vV?oka_Է|ŎtP$Ͻ2GZw|kߩd =k_W2_I_{ doï¾4_|{=?q^@r%];jZ~Eא^J ̫/o^U ^\'^E?/ zr+~m ЫCn9qienuza^x]8v^MN:xYQ_7?(AE_$~ٟ p)~qxNݑC;O]&8CNޣqWG+j@] YWu}85Я]HgQ)~=׏w7,9 9.U(]TVqC1ž4%7Ѹygƽ*T.q~EnE\#7r^Uۜr%O?q ]Eo*fis'GP7ط8+է>rUh=}= }y!.Cpf=4|i$C<zWoMuWI,?ԇv$w>֑:sr^:U;8g)EMtsPslyˈ d* \:rruecyLNT5*HۜO}N֠ 7FSI*NΥ 'Sl'_a,7 djpqvtpPgMlKr1cU |"M[vU 9;`۹lZA%XBϝxUED%eԮsO^%|$>p9vj9FZ\fPn3> 꽇lO3{8c۫ƜԾW|l&=◴Ų 瞏.YwiC7QrG|!}Ǟ9~`t^HcX} @9\[h?4{ j|PqSm?zǑO hr< =@>;0cip>]?)ߟgv=Y_g_Ͻ*)+>C^o?3^r2v?~s8΃WjΧvmE~w}c/{VuC5z>1ʇ?Q=Y'8^z̻h\ήj:I˯q`gQ?ݓT{Tp3'_; L uJ|3'){/)qywD/W]Ui͛Յޅ:̡~<-J~}n;t53moM--CL{@߂T_J~GrďxBޝuJb?T!HQ;?5}Cn;l?*< {`/qk{!ڿ8y+Dӿ %^Ҿo2|2{}^aFڼ+gw1v?p۽1v*G%dEUxݧ+p!{a?BO0~kj/~b/8cԮB.^nlj?]2k~ q;݃s[ _LꩈjȇJ&)vO|_.=7#m8tk6k;eirƧr2 }Ԯo.@'_ ۋ-ٳλC1GPˑEQ|mzAQϤJ*#A_G6vyڽvmquoI{{BvZ7vxxǀۣ/CtRY awy ,/-4޷8gvBdeV(tQ#h|˱v%:̗+.7~`a Q;BP\'*`}_2]kNj_47Ļc)xۅxϝ{/ux{җ=%]reKHdG%c>c5Î8S(ԞPߟOO=Pi4>~v/EOw?3`eLXUxz2H| )<.JW'ݖ|ΧkwR>('8^ q<:)30jGY7zo9oo SO8֟#AT@O {nm_W& Hc}xo.!'Ozz]:q xZ= ,B'zSi}z(( gc2eI&-45A4e^Џ1 vq)r$W4.Ҽ꡿ص84YV%3U+*W#>^5=gm9o)[@?мjIڍ|0=gd9F2~e|-3dE|m,їU;^4*#zNqTǛedW.o~^Ku .ſk>&Etje[:Wi}Tu\]f q'}/CYPָv}/ߒ߿B͋xXdXǫ,HfӢٿ8:wƕ+Kgn>,w |MS{a^xT|wî7;M_M7znK4fo$܈ǍmrQGd ހe!kFo5q&:kr ݉o4uՄg>h3?&zC\O.{]^w|.8ނ烾=y}SZxkߥqn-[k/;e}}{ז,Cقa}kތ邞oʧSEi\ʹ7Ծ,վ(O;.nf'};۴z^A/끾77Dr؞cKSqCO~o'z7'ۗ?ԞS{~E 9c^_.ȿ>O ??{?oԞ~2n}E歷lS'o_絿ェA;g `{ z,W>A,oR{ކ)ћޚ4=׊ǏQ\_L89^_Z=Q=WU t4Qj5F7h<ڈ܁@z#v{Wig7Wx>8G~ 8,kfxڗ?}?bo}h< 'mȥ1xx> }$U#D.]Ou`Gse8`}jWGkjo'΢歋<~K\G?D.b;b?,|cN¿i4kӧy~8~NΥzE&~vFp="GV:^*h!p ,gt2+D`㈋XVݻZj0?֊\_g=KmҾQ<"zVއ~j|?6Nv?eQS<?}7hfOzSCĎ=:?ttD-nѓvݢ;O\֛33^዇?:$xE8,aѯDGŞ;eGLGlo>ȿ~,vcW>uO+ɿ"^|itSOLG> tB.)_S89GS)ދS]d] ~bnR-n=ǿ72)Mv|~[ވ =Jŗb>3='ٗ?D<ߢ?} S3=P{zHtD-"w|&G=b&p[[ݒuzSuS ',e]bzQE?]~}}`4GY|MlՔ;W}Gk5M[K~,پO]q2ľSswD^ߕ Ů.73?v_b;KG|Y<}΋r'??^S\b/_S߉>W=b}Q{,zgc$ S7Q)qNsz*ۧS)>JvU-1}rp}*k*:Oɮ} sRC:J /# ;K}Wz?˥q=2;ǝ*עOT'$;zAv߹S|l4'!=KQ)r!jEU нc8¿2ȣ ?^v3'~]jwuM'2HT>իc?/GϥH(>iҞ4i2hx}wU4ΩSS.iRE7?v7}-~UZ~*Kenھ=ωΫ`_$ l.'RqOwby}Pb]<3g s5;ZEA?V%^+r*DYwL{"h]&1d-Ӳ~OuLt_cFc4;ړz;?ݧ$(&ʍ~}}hܓwA?12_콳# vvd٩>U>ܟy:NKclO GZ@v4i3z?jkTU;ue}mq)wem9K2om<@3z,7K:j=9e2rѭFEgl#Ʒ:l o-/y~{YOy}e[Zu^hxB߯SJߩ_5xh+/&~qbA$,}A|@jo&M S\;,,k6W7ѝA3~۟Er(}sZҼdyȶ,l0z,[C[/룴>kp?i_~M˶gqiߖ{=&zksh(~\d7f>@ӸYL'~#>ڐ)aC!~5}Q*A_hܛ@n8"/v"s?iZ`_6-eZ+LԚ:gJCNfڱ}Eԁ쯡~uAYۉeN;^ ~NZ7Y|w\^e~3ߦn8sl?R)tNۖ/ߨmEh+륭~dz;Mr}v~ݓDžk_2^d8Q?B_WnB7P@(F?we`:z U%6S/dOc_afDOD_ |#aeľP /G+c0졼h c;-Jˈ26T(^Bt:yȻb/yqT.>P~h'oZN?igjXKqghƉ>6^s<˳wJ WLy|KiDg̓Ae|q.4ΣxH^w4#yzqOq]67z&`1;Gr72D7 Ͽ 'DXϦM`ݟ(T6Gߟ&4gO{zh޼oiI^?I$vJDNh&_=z c\*Y{i|مwN}~,K0VXD?A?p;}_cI"4_Srq¾ST^QǛdk0&>3Uu*̗i|N6鍞.zt㳧sz#_ng ̈́==SlΞ/|iEOHB oW~EoV?%/4_ D,,ľQbsRY_K}d]-uLeeOeOϿ1? /_v1z!VG^ ;{ ]bz؉Y?X,z"DD/bI\ ]bŧs_~}{v3}WY+ϖV0=*]ɮ]9s?u7Y>y^K#~TeyaZEe;y:Z7|^la'> 9#*;HDq*BWIsO))SZ.G>^Ed0/,B۟uaEIě>ù ?wKjNqh~Bs\ ž&lxߕC? OO>Nǣ lW==%+g)fHH\Uh7"qIE;qBe$o*%>!/#/ߟjqJ\m ϑ#nvn vB(Ob;18;̿&1ĉض nն.*6Gܙm&_mcAgQMrgDZi\bKE-q$sj*b!lQgH+R=e^<$67۾Ei2/Y q7ox_-ⱊ*]LTzRE/?|oIJ*1>z.ԧZ e2}>߈WQf1E꽻EExR@^9Q=9^>R/H;. C=T#^T=8$֭ t}8욢.Fq{|58?1/K;#kʼ:ԏ٘gձ._NG:9"VՉQ' V7co,JwT#Y9h@ |R<+;+ԮWծ2n`ݐovGޥ|R.wF8'[Cx7wN__:ݟAOC:JT] ? [tEކuJ݉+ug7=vA~@|zT\E=9װfFb^ =OǪ>T!V[/{.)G_w/ 2/e_"\wKJ?#R}?[#Bq~'i䑫'?I=> ѩ@><G=I=;IwQ8#U:9zyunā!խ-V>MY L]'uyT!S:y1K8"9˅;SA;u8\աR\ C: y{p!#׮D޷:ڕs@ԯA+>^=p*4,Fhyи?5Z?}9~M?7Q`R|'?Y!G䕩C?ScX(| O@:9kQ"#.Xp% y|ȧP[w7G>Z8j-6To~|\5yjs^j}SɌE&V>1F|jERղQ"I-}_-tYGzSK#U-%rȩvAZDjAg~Zq aGV T(0B }-;Iutzw_A}ab¿ W-+#Zjqše=^ZqjRTZTq5=.4?؏RÅoG?D^|#5NsXDĻZ$䣨"RwO!@"| GҸT= [5#L#z[fUy+3ݝz]k@Y_4\- ?@쀤{3J]h]>'&'#y:{M/?pR~/W"A-r4Q^Gw~D^辽?\vˏ"gQ;"_[xb!.Ԯ"?MވRc}{[tB?Q8u0%ԡ'?#@^:RQQG!O))Gup)F 79=?P8[]btGڃ8ZOھ߇,x!s|KkşN#5qX0v:(d o\ӸL}pûzyy<]@܍8% g+7@>(JՕ'%@>Fa>u Ko}R6w޾h}_U88~`'DWٯ|?X)j~uV-d%] u%!V _Y]8ňTy#}حKON_-i 6ѷQۖZA_׳_MרLt}YeiíM蹃ȿSi8핾%YO89}UIĻ'E:ӢwA^zVN{5ώ$e|W^9wn"T)Y]}[B}s.y|7#wyc?'c?8L[!=, ?DV\ K ;B%mu ي-M#~e1*16M>b cӂ%bKc-~ضH?䔭A~4M7Y=Z}V[kuQln3'0>Gv -zMrobKRz ,h 5UaD%;^?!f@f=Ҥy~*WUp"bǦ@w[u˄?ɖ)z }Ԗ%x{%UdDUqM}=l:޷a:Y8-[pl`K|K$?!%"V[?[AFTC%B%~%ȾP}'6Ukg%}*!Vӹ~0&($\ľ*|/\\d0pPlEO-loŽ} >`|[B4^^Yq-z-v-8 by?x"6 p2lQ;/8#h+'帿Y T%[^-є^;lj  --vM|K[̷zhz~MtGwF=6#-vM~TȖЦwyt~M 9ʼ m:YWpK#"6iՇܱ~gii33'~b-SSM=ZՆ~i-W/ {V pl/2/66YWvm( [cOm ~)[3S~'ض/7HC#=m:[GluekIlYقW:IƥCl ٚ5e=)?T_śdk佭ױ}/sGNou=IOGINlgb,87vYpu;~j[?^_;/=[gxD.ĶTR=lk[;wG]#s[Gqد ȿ˧G޻myHlx4l` A^F: ;6 m$\~pᲞ6 a~{EqO3 ~@X/ .xmE/~z~!Ou>ʶ<6=fKBmD_6E矌 d~ ៰gsęP}{1n"i"1n;$볳"on` [s;}^m+D?i?I\m1L10NG`6z8yE_m^mO`D^mٖHKᇰ~m+pTm_mwm;yq]meömȷǶ:&wāſ>m1l xSa,lOOml/i:}g &c62C"WL9'f|l؅9|bۦɭm^SP)z|ѷJb#ﳭmM+6`8v"g [3;+׾4??3B?4\Dߚ{6A m?W6Ug 9~b(rs?Ih{zmؾ~M~s>M;p:C plfbNy8M쯩WM}rs`kp>l3EKlsD#9@B ~ʢ~ʶz蓎|5;q^=t͜c-Z5gdUabmj 6c۶yն-lж]v.mbmEmm;D}l;_ہ}~'#}lD+qny=w_;n)<}˶~3_ld~:$GD=|:ց]cxg >)$lNI\)/3RK{?C._[!`9.R*ewзMN,ߟ v*Ϋ<^/Rgӟ7E_ _?WH=ϝcd#p_ uqƺ@xG{ikT/d}c٢.<}ϯ2Nǩ8Ư{^rzXQzg"V)69_ağ=n.j6.M?޳?U%~f[ܟ pc*TŠ %~‰^xGy%~3J|{uV<ÕxO0s6_i8 r%1+G>Q=YU%*f0\VC+|@tU|V77 _U*qs&wMg`%n;Be J#P**Y@\ TJ{sY WvH?vH;6c|gƊ*'iRy2*Yxʂl#a`IƯ9+tmԾ.C|UmFQKgzJ\k㨝e0oYPG(D%u͂`J;6{#dFxA}ƀ_cW%-o1 zJ}JZ_=q=#\-%p=nϻ*[v+t;ѱٰZl%8zJCѩN$E8PģXDvÕXCH^M9юtm{$7 lPb;R829.hjdenbe|[+}?/oiQbe23+U?=շ}*{`uJN>輡Do-i+-8z~r hY?cFO"r`=n؉=1Rv_*?ٷֺJtinjqG,:Jt_D7HQ{ķ^]bdL߀DP;)7:rFvz<}`sYZ`EMaE$کq8[T<>'~qy{ҟ P%&[>]|:0ڏռѝ{8/l~Wٮq0E'i]CMֽf(@80 v,ߟJ>.F }_`PLU41F^#~ih?f--oM*FcqX5|wkErbNw_ROtsYרC?G15Gy-Sr_⋦\ۺQiohA/7-hʃ; pj42ޞ25A+4}(Я*wFMa[i_^q "շTޡ86L}7B?uXz%U!SJv7j#2#]T+>`;RW)QYXGQYg΍|M~Q?LDuD:>5ۘݔuQ١uQSR=AgQ|uQ޻8Eky'Q+}x uuyRxh=a=j@Фi"Ghw> y7 HG]kuYyQ-l1JZ՘Uԯ^R(Y?Q}ǁ~ Qw6x:T}CEEK{)Q_Oh`5Ni bF5etSĿA[пk|}_ +c*1acj xnj0]>+}z 1[zQbK|_{_s%ևNEwXYwA'5VdCT?gxoW{Z.F޿9z&jGTeح_lOVJl;;fOySZ_%6P|Y%6!gRs-u~SbiI/1rϤW4GKI>C#Hm0&}Lr&TNBI)=3.)6IΓ0İj[=فLzw(Q2~;6%V-XK'?瞊 q ΡJ\QC\qv^]G񲿐\@qgUEh\5oqџΠQihG!ZK[wJ)q CO/ =.6pMvA 7C{pP_%~Q%;| >Jl;ċ3J%e-do,/a>/BO?ώja~zf{|ઝځu/GbMnOCRq J=Cb++c:ӊS?-iP.Mouz}^w-5I{TMdH}>p;Jd؉SO{rFt /Џ@o_9aߓ FFѸ>vM%t~5" %z;0A:Nh ]`$ @OJH#aҷEvX$e=`ʇW#>7Шit0qyj)жWC( -A M w2a'@ ȯDŽޔ#Ty$($THhZJBc€fD# 2O S`$ a>Z¢ V SŗX{[I1y`0DXʶQyˢ>JbN'QGIC$>kx>6zmj]ؽڦnYha<]I$YHvL_Qjh\+2vC“.(EFD~Dl`,<6WEgcnMEz뎓m3]yG~<sk%Ew<@{YTEн*֛FAmө>Y辄 iVы\ջ }*AGzeBRX:]I7qyxdw9v Q|>臃C~H/}i}ew-m/!RяJ?㢟Z}_ *A_j_Qwbүj>/~Nz E6id׊~RSn^V73>=ziE|5;W)D?rt(珫 v9֭Y"ӫ[ uϕv6NcBQ[. NѯG?:{寊~Qq_0G9gvsAѷ^_m{拇Um+*2O<@iAw>鱟ie~+Q|I_zaC/wVɗ~_ULYeW"9QH3kWъ~8U ;!/_$(~~D~ֽ^TB:͝uh`#1^R?ߡ~?Se<$ܟP1~ޥzN~ݬ+ ?7DvGzQu_'t B~Y}Y!WO'Ma 4o[W bN'$IhKI;2\*-8h ](VI MG?|L}#4!(sRII>b#bgQ{kW_k+KZ;r2﫶qoOҞB'} {,{ώ[$a$>Ϸ1?h<;?E''Wxc&}߹v`h|n;M0ߋ2=44o'Ϩ<~CA4k3qXg'ѵgQ1]8R֩zQJZeFt ?IQV^r*Ԟ6ۈ} uG_m;7⋢[(墊nm $ָV鄯薿y6U>P=leRwmE'IckNrFJMt;Emƺmj7j;}oݦEgwGg0Qm\qݵy]M7WE%Cw t-wyi^; xBН Ud#!vWB<#b`?'JzI(._6ފ'v;q[/e?)o_r +@ϊ֟ rrm8_ay,9pby9oyO;X>p`A-%0 U21d%WgH25?CX@.+W)߂dV A+2]92yw3@_rItd:D%>|V2]_W%13D @P* >]f8Cf^󨝡Rއ=q JfjP29 *8 eAΌF3e 3,'3")S"*eO H2C>oi,~LH.@3+̊2= 3 uhU䡒Y^Y 5WJsMYFqjzN^7N9?Yh}@ߙd@eәXOwq~"vOyzء~9i;pKLEW8 HH h8Kt,qmf&G3e_'3K~NMQ(Nt"~XwGͬ#tS ܪd]G63 4l)박~#b#| S_3;A&t vMfioON~PHfo>;}_2qA 5D"6P@~/}dv@+.a_dv|(w~EEwW~Ї2sO3Ge#('_$uRe]<r5s'P]52N!ltLI堿ݲ?'%qe}-6fyJ4.S2$_ݔyzH5k3<ܐwSD]~oe>dz#qź4O`od>O)3ʼ>zPޅ:)I=%+Y5<{MɪϪuUr5~,ȃ@6d>`umW,ڗC\e$H%CVWV,ǁ5,O2 Iod ߳NU$pVMQV-QV-9BjfDm+k%Y~dzog 5yY7WI/Y)ޕ~ଧSYa=fɺ#G7 VXYoo^EOz%y+ȁ D~>&Ygf}ޑ%z֙\uh-`Zhu8p_a]XZ='Y]|χk%cke\^I%ևdY@r}X自T~XV?V?- @f p XY kPkp{;VM+9T/n+-:XÍ~\vŰ#]knRV{Pڮq|N*sbn+*V XƀO[c'?1sk XWTǪk>NOdzfw,Zd-V JV;VMwӬ*Ue m8*kmڰku OoMY>6im.|tkmujmudmmu$PQ;!^=GΜq+Z[Y[cPMÚmbmi'd>k͖굃/Y/[Dz Ё5Z6.ѬWZC/6i=x478E;PQ+*ltuBשCAv76:-ta~g͒B\5z5 ikӚ ~hMf3"z_̯NS `{+J% 6]!Ī>o>uyvC3q RykGwk֤?h78bY!GsV #kvk =DlC(iU@;X?c5+pi Cw+I Xz]ƴSs݋O~U!k|JoVm8YGKl Rޏ>b_*ppG>!ǭs,hJ7>{yh_hd?ېϳQُʕƆӸV7W3 UIk4jq%;&n"w8gy{f*e y{x,+37Z+AOb*%Vw_v*2e᧷f-ewS{Y‡WWT^Ou u߮e\=pc]/D[(ՙb7+r.k?{d`DSSяjz]=Zbd{Ϩ]1Y乆X7Y UvUVUV6,SM,5Q)eRae}u)EuD/ ز l"%bYA&&;Fk_,of`e+kR8sYʈyy=K;W]V-d;*2/cg^݆FtҸ=ߚȎҥC%$dƼd02Pa{y&b6h-*Ş;f6*~_@Eg)~=ҹQ~SJCB7r):Μ}L-[Yz =ncwAINJf7t˨~x̮ GbKN(6S+~nyͿ}kTL"=o]X;J#?\;gﵕy6A$OJv /3nR|-ef _dTLm=M@bݏdo3ŌH~wJ̸N8IeS]-gzbnbo2ş=8?jYXɌBfDVG)2wOBo -nNyd4WAj,(r57+#V ofQmy||\X߮F*,`Z~υ}V,;-@_MsbF̳e-@uzo)'*%XgErNvXfcZf@L}iw˴auR,S?)ϱ/XV,cb2}OXoag,9/K;Kגy@͋攥޽X'X,chg'GB5臖Y#YH^eO XC[{UYVoj'6Y-۠[J6Cߵlo ڲYo6>Gi+2;X|nزY+񑖵g,ˡo[bY ,~e}޲Qw#U,?ZV> wel؋ٗeW9K+/52ni^b =2We.9C׌~n eLY૖ LA-5WuBZW{Ӳze1dZÞȲ ve3E$.[6 }];W?в !,G8~d9ӹxe?$\X`="M6J{6N zed_&UBH%oiSWO$V[Vb6eZ%EsZ]-wɴ=c?%wg6ս~T~[S;iӾ[ys.GT^QNnAVr{v=7rqŷ5oVLꚓ[{s]r+2[U6u}iss+u[ihJqk\|k-Qrs}\U|פ\M.볯Щpaս>=o[M]R}&6{}Ԏ9w~/ۧw}j-2z.)|r2'ViLY3i9G[K)L߸𡴒u;RNe*c}^}eqjȪ߼cvt}vnͼH. ھ3Wr=yz7ܓy#Yt}n:ٟ>oc*F?^zd^+bܼJZ3u&>u m>.==7::([67׻it]x|#˻CWNB=CtQ?;F'3GjH;c85{RqNzy|Zg>A?t A(^|K3U |tx߭?$WiW#ooޜy=zVt]ۤݣ֛ǟ&:E_;qԎB;UNOOWvS.0OZTt_E{|kb6ysKo*rLK;h[>'=Op :OW__;62 t[-pHwN˥v/ԾAW>?yoP{͍ -Kϵc۞e|RG rOqT_ϧL4^4{GѸRm)*/۞IzCZ<+[ݭM\}{R#ݷq+䟁EyxY||_^>g#]WbTV,H9Y:wO[ON?ͷ=%_t=L:~}׼'O޼O-7O#c+.qgIТfE/n=yA>W:%\dezo_xK?JGjWfoz~8 ?kᷕd*$r;۾%K\+ZSt^~7'zN/8c#]Q}܅D:JFj@vjG:CJwľuoZ=.)F}5iD Go~ZQ'GۅJ-@rs_Ş"X?~Z}c*j&r}@VmLnW1.ss=&7׿˂\XHi5v,_9T>v,u7-'=S3..`yB'LxD? A_TZUӵ̇ɍ)SouzZbHʶ;]O?hTRt2Tv}g>W K;{V9/?JU1cS}OJWZt" jdփ}<A@ߩ|b:^qְ t(''uT7?g"܀!_0{H.]C_ h~4uQInoptݔՆD,:@z7+;e<*emR90d)齺}rTRu;3){"jW&6^Š?Y>1x}zG]WK| /47"2/ߔuhS+.g߯:T=J2EU;Uz57qS@W 8 EsP=zwu@M~e,0o>{8ޢ ]=H>%OӀ)#jǀeZ{|!.9RD8/zRG5ZO=Ǻv]ayL v XEj+%=~8I`C>l<L-`K5ϔd~[SJz<4Gw,iox~>^P'D'G1nlP;N.Si!z-w19sWh3lQ=.^~b>p|Z8]Ԭ!]G}eN jOM5iWk$tن KQ٣ɱW~9>GosY˿3ο |k -:̠4>^d',,Vx]Y*Tfݫ}gszQSioUm3;t knzrm-.r 7s}w7AԞ cߪDV.(]>c8?Ps=}߼VWO0_ཟ,῿{!C.9Yӣ$wԧ 9!y '|qdTk /6=w5v}].+()g8 hg@#Ϳ)oNPLOx~~?@[6=9 E1I)rhzt`Ӄ.ATw]]$-"XjK^K8LOlz tCTMPSM5z}/ޖK%N4i7$1i9w@5}L&9qޯ@4})C/8*#;8Hݘ&{_ХMԖ=Mq;齷@;iz8D'swuܛ.Etǭbrut薦@6]z;5 @7$N0< =WLǤ?Gi:Ns߃jn`jy)ybcSp:HdwdI8%2]кL.qc)C> >(}NsM7h~JwXf. '8݁LzN tAOL͛\ԟ89}(NJAǩ3#qJmX>G:!(pDAOy4iX鋀o_bE;~y߫2(9>NAI cAY%ϕdG,P·_1Z~8}toc5.">cm <՘SGc:Lg hN[8mt|tqr<1N0=a@y!L/q*58]i}i8 :U/z Jb8mz %~ ^Iei+zq?ViՋ㔍ű>PqB8zAS 'S}P۵D__Y|iT8Hf"yrӏJGϗ8 CQ}@&#>z;">)>(?Z:x=>OIYqG@DJ$\D'@dS1+灈(HאxIÔ@~ 5m)DniK#P[ȧZW kh5ġA$V# ҂V2D"Hm&" V imK}O[ H]ZAFD tG퍌x#/;Sd DFv v`#40 DiJ?F;H@LЎ2Ȩ v2)0݀nv|wKzuRڹ ZA.d-F6Q?*ÕF|.XCdKo^)Eګ@^EF*m gi_+H2.}3O@~ż rOA+B䡮 ROWF OWP !NWHX'@U E': ^!^*tq7]22tɠ[]ui_J'@uznu}pu9@ n`t0:A SRG $u_Rdb&MJ,OGDoy*7i5V 2jU?smP~FPI,IF 'Fpii9 N%Nut|%Zҟ?$HIߓ( 2 ^y(=eBWA,w4df>*>[w};)XI~_8)bEIo]KZHl7;GUz OļZ[$]l^JrN?$Jo,|"-zە4CJJܵW*)Jޔ{RSj %E2BS=`)B&NJ_vNIA"M6"ȷ)@T4"%E'R.a-ER].RfUq%5Ja%5nz)f!a\Rkj5*1冀v6RDԾ@nMyK]p&ⓒ*0uI\SJ e t}#*/uǪU*{@%-S8URo.92Rn _W QR?7l4=b(ټFwP|-2 K @&4a ީ /)e/=*PɵQoZ̧֫Ы Q6{+Dנ_K Ő1OYCR UmTf&}ecuR,zu܍w;v.T q5{v9s w)l2 n lB%փcߑڥ5FȦz>mL2DEC% y/B"!_SΏzgVz#Ov6K)  MK4^VI[-Rf|L꘩X:}g Vi)[nH%2|>iVJKS&oY?ovV[m['3vn"Cpȴ2%vno\/d*g^)@Ч ANdJ&m8=pң_Dǀj8*(pϗﲾN2Na DmDM ЛA =uḺ:./_vUo&~ rO# !g _om;û*OR=̥^YXO>>/~IrA?j^ŃwJѸnhb8TA lAj >\9YJg9=ȧʇ4CGO)t;N`0AFp H@`5夑TߜY[i^͟O)ŰfDweװDOBOB ,mX(rXa۹B߿=LaO^9+CنjRA RE5~:HR߀R_COL}~8>rlC <w ֦ޙzL=d }}AM݅M1=RR7COxWu^>%©AN] HK A Aϩr]\ؑ}?SCN|+5oSjƸ "ljs)J %;쐚yOMJHJe2/]UIt)WoI9 9N!yPiɒJJ;cPRZKi dܧO%'?G&PC;߱b$IɇyAIj+ɻRG<(DI^!u %yW%d4^ȔNr/奷)p]W{r^kSRC&7^\?9'0%y \b./G+IyRS9$I2dvd̔Jɒf7i"Fϑ4D ԤbvArD]IT2~%ݤL!I;IܔM$)")Iے>HI*/؟q^^?G$ҏ}U(op~ȩmg)C%J?I:/D׭_ADl>ֱn| ϐ~+ZP7)BzNNurBԓ-'Љݦ(tաҡbӉ}M''vA:ӊUW['#銻l+~7>ȨKi}{ڝG]v12ص ef[;㨕hK=s&q΄VI?ie޴rb/֭֍b'7$6BJ=%&mW3KI4b?!:O3JLb#DAOFT('P&K\#1չ%rrA~ y79)K= ͞ +,BBU>E1 9i|gb2͂@W5 9=Xgo D ՛S &yf+0Vi ȶf;wvs= sk \o9[P _s#s# {0&@x1If@47Y8-wm,Qc sQ`5˘spf; ڽt*db&2 <\k y/<2"͂b%2HŶc'1Hn@.2/zɼrƼ,u2ǛE3[ȼAu#yԳr,(@p1ry~~2~b>=|Ƚ' #Şm>g9i ¿b ! w|G/`i|],n@12"= Ƙ|A? ]ɉfAh6?rCtS;>< r XHQHB,UDA"z הRR")҂TZJc{%{b) a)q]a)"HDϸo,@4gh4_>B2qiNwe<~ h~% r rRK K?ȼ}`3Z|d~/Ar"𭷲~^ ߔS/ "3[On`z']y=,'x܇\7D̿y|zUA7~{ úMyo K:l\yo*ed:b}?8g[CxM/fy aZ{Qe>?wBM w󋈃~<ͯd~+Ͽ]2TbvvN3L=o:}}/[_5RkO ?"HOr)*W^s -R`ĸ9DC l&:IyD;Af^C9ZhzR?&R֫ǥjڽ7-ނ\-SiL-^|=鷍_*?yO(7-@ȉf?_mc%1iކy| ȰK#« ,v0LOs*V1/qwnMRB׳^frP0=7|dKt2 kĆw$7BnD7D?wq1!I;ʼjqi'r¹c$B>_P)Ǿ) ~O#75w|I:M%f9gHkз/}ڲ#Y+.B8_\'~S@.Q =1 3>q0 3nb&&X3nߚqqȣ}#4hGY A8q9Tb<įFm7Jnwn 7f:x.@01xnJ6o[pA' Z?_l@P}m-JƦ+=H$ӌ@$X'Y}2cuiUU++~zd@+sn28AƼ'MÊ\oJ%=cٜ/A~glޖIہ@2c#IьdV1znƏRϏ2me>Ml h y.W|%~@$iFOٌ^ 3z(/3<3J~2e#&CN c`r'$:2Fv[F}2f Ξ[[h>t"39Ah'd ,b/\CFBA/$F2QG泶Ж;+5U'ɼdwF Yo5=9tJYpKF- fԃΨga7K Kīe4ѐciw߳<[B5ʯAgԃQOG]YW5!W3jʺ;ɓT.XeB*!2dvF ^}SM1gѺ+\J'fo n] ;ųRa޾E4R%lP!'4dؤ?:*jC/{ H L0LUD("E(2("J/"Mz}I]/e{}gMmxSV'`SڭuH?m۝qΝmrkPp+)̭!4I~];􇻺ޗq .mzBzuu]?.r;,Aי{>x tY΋<$EFv]&ˬҿ\7Xr"zD u3]sʳ]/4^ >H?D9]s)g#t=yt=|K<'.ϸ4zIEwv}rhr7wNӝ;ri|;7rt`ww}N[ۉHxE﯂쟻n݅5]P.z8+K}Ίt;Bl.cٲkO]o>ܹj+Mw. _.ڥs0+sacO =ߚ_w]ys]n[(%'ׅبÕ uv]'HN.wr4I.yu2ܺw;_3 Fwi ϔ+~]'RnoYuaogዋ D W+[ѽe=?gG/?mԻ3#}nL,{u]}݋_l>-o\W⛄xu]j[>kJҥ.u ׍?>%Y)ןK:\w5>|N9>˻ڼm*H/ȝ(vg7q~=Cy;/͝ݝz5+ P.pn[p R.H>ǭPBH֙4zOK]r>pqW~(o0 Pܡow Cvu }Ș]pn=q嶒ͼ7(/t8ܔיn}4~tw;xNݎ;{v|P͝v2sۥkI3  3=`] xAktM%>=?)^{r%w W&=XwSFv7as]3[i|JpfpwkAwrS.~]:#ICnLrw#]uM7.gҝgĭԟ=z>h>*O¹z_j:_uRwco:󕻩M)Ws7~ 90<:5\݌-7n–ċY/;u#7Dt&INNKډMì|E{bơ5UM/qݽ)ṭ^{k:ǻuFUq/}>'h: ܃>+`]!n-7r=\̤Sݟ4AϙnwS)vO}W̤=S򗥼+s =S>÷i|KQ-ҙ?}3te|9w3< ?]>yfus?~w:K[5rn5?1uky[gtߣ[gtts}OR닂6]WϭzL͑n֣/k3sp^ 83N秀3T9J;K2UgU+p 8o]gW,`p 8egY-pVt^l綀[- prLgs].|7:neUsJzKxY[[x{@]nӜ77Rwc^MF=R.*/ۏQIB]d?ߝe:ޯ/q_$oryc}U:)ZsP8`-B#,9"k)VDc-Ck$RY)ZDfehmSa x{[4zdim&ڌ.k ݏVLfBFk[wֶLgmGck{ӳ괪v4mM'Z{)ڪѬquvuj]wd?P(m̛\|kfRg=G'E:AYR)`Qpmgpv:i-Ll(dtR*HVNPEw ^l*o:b( vNP9U:oNhEMէќͮSmO'AexfRVC;sib[U^F*\e$ )UKVFȸu7Սvvt?e㈝5*[λ.ilKꙪlV:gaKW;o4>s}sG::qvցxԦlo0ݠM%ںh$ ⾶ 6N)!z? 3mX\S9M;Ӎ$a_hIډoj:Wimyf#^/ܹ~wtMM/~DmTr~2vNϗglwZt@uo#:96iea]l@e;lڮy͹}Û)v˄y?خ}Ӛ'dMG#"Jsi6Zٯ*QP|7W TP63mP1r_Bit PM:%0ȦlکЦl~0 MemٓHyϦf~MΝnnk87CVinP㕀P:5ۆЉ6Hl-yL-V|Y_g=kc~ik[]*ulz?D}E'jmQ 5{8}{q4s=ߺtեӕ/ѯV>EȦj+P֧)^?=l}N+?)Եށ4b>Ηny ωW./ZNvG3>M/ΐC?Ϛˣ3QFIzw[wZzjgý{L=[Mc]4Wh'Ne]ghgL'A̪حC}>$iPFʪu5:u4Ah#:KYGid6zZh,e((kݯ7w[B;Ϧj$:f:N=V}d7Žц=隀|y>Lp8~y?pt8v     g@p?eq9cN'`0 AB!mL0. H㤀R0j ;P㨀Tx*`L0 [2Z㭀1WK{2acXJݜRAU~: oӸk1npN&A j괚:mkd7ʋu o )tlPW.6qL%GH*ub:NޠNdlӝR JմlUU]_e }Tf[RhǤFT TұA/6xU5(ӨFr'2i@nPFG *icJe>WPQg"-2.,X-CuC J<~ڏ(Faf:}f =o%tZ,ƎEP Qޠ dk6d[݀:hy^(Ӹ3.UG4(x07`]U=t}7OTT{wߩ~sڨ[]ދH0χ<h\O#>egnO!giLDg6ݤk {<[sv (jaVm̸ҳUng5<_i<p2X,gk_dzLɥ"_۳P/*%xvֳL;i|xVdzƳ4f,~,тKmDbm쿀3_|=/|Ag${;;~Mxb}:׶(OLE^&?䉮|Xϔ'AEs1FcUMf=?F^h|a'RGIvgFu[H_x oy4]`8AS> z~%y'V14˜(O8jS[;DHŬ7izƇfml{M7A}w}giy$"5@ԑHz“FcHu`KCiTi̬yb4}^|#F|q/SFs6I9{NrFϵq3ǭ3˸jmL@M?}Oݢ1&}S^\ơm\u*}^{r#78.)m66jccx{2o6ۭCw8ȭdڸO{6Jݥvk#={ɀ寮̽K+wi#T6^I{6ݦ#[1yqy\cz=`0v,`\0c~?p3@9 ,p8 烀3B9!@lwp|ӶJr]3G)BTZa&(#Rm>ɽ4eXVQEۚ',}:rNxmM*y;;>|tTE{˚|#9 Bvl TʽxcTRXFmVIa_4AH瓔lIˊrjn_%Vj} ܭ*gk)f$r$g!7b6?-hLC6Z~g]ۿ-J_[UL^=S*fhn?#ZET&JOP1E:߷&~[(h:[V!b3oLl%~JD,کtkhPϫb6҃Tlp28g"3](P$xoJ@=3s'3D](Io@"&%2i nE{5QO`?Ih&gZCTI "R\+xoN ?-!f}縘8V?V5';2;EZ~lP (YkEy0B_EZkD+p-ې}@󜘗_Ma\%D(rw~Fh8ߗ"ED<2&s Ub]1咙*6Pѹ_ĢCWX쳧VۆtJ~)W.~*ErOt_31B٢wyw\F$x]C*]!"/DMʆ0{ti !lb=[Ebk17yO]@`?W[][ A_{#{ Wf\[dW€tbg]CUt9/ʎ~۲tH#z莲OPk6B%t0QBsKzË) Gzݜ]`E_ 6^70ѿ|?.sJ菿VUQOÂ#}0FLq?z<~u0?CnkW8]E.~uа#@Bc0?\jUn[~~vnH( ~Y'.3ݞ=%P9x/VDk6o;oۦ8 ɇTY$2<V M(1]|!xAꗐwBŔ I3 _8%/Ko> 5ukF N\Pџ7gHhֳ*z.DYHGukuQE[i(g۴ST}F^M Ws цK5?)x<.V*L<ٷx6B]yhhΛmy+ZI3N<&8I)Oe>hCgM@Dt%dhQ߷wN~&埉䬊)<1eĪ&DV$*&A `"律D7*SO\*PhC]qr樊11_M%T0I8dߣ^B=n-R|s;X^s nJv?0vWI5(HJg 5L הK~"MEj(P'E2i;Ky݆UkpQ"7QoTGO %}$h0M뚤͆1_4F0(7c(J%h4X~% ^AbRד4Pk $ d4Hh=QGL&1? zz~-xuu2OAX%iq5ϝFv:U&uN hHΪ/N W*ɼOI_؆KAdqەE8e>$Cc7ȋ{,)F*;>%}6c&EWjVUK:W-f;  'L Hgb^j2QRM1Ejc浦W3]R|yb!DWd5D yA6'dÉؗU"&)K P`K>(V(hRџ^H~b7ϼdI_(!or?OםʨijI ĥ9tcU`PN\]>>ϓG-uѢ`d0fǖ\B໖Z'uswZ颀_-oȺ`'5x?aӥ~H~ᕄp2jBqyX(Ҙ @n?^%|8`ī>Zʺ- Q֯1LWer&(ŗqNs:Ev~DƤ*%6! l) ߥ|(3hWFŜɤ=i/Pr5y0(He3~?z) /W_ejb5P.6>XD%ג h\-&M6.*9SN&HaBpPn"E2Aer&Yv؜WKԜ|O=6|7lo"s;um%T/Ŷ𪄡vvJW b4H%J0RуqMP;b/%.mKŎ.D$ e3V6#g %ehLJ6PPϛ,Nq`|$m%88ʷ o[Wiɶ6)Z> a@%~N eAɟN%IZO{arHi3FR+p0NK?On#ym&(uB05IrV#]$NE(K8f7-zΏQĄ7D}ddy9\Z<ߠ>#I 8سa1:J&N' PH8܁ȱZۈ[K,h Vh- F)rC!%/σq(ɲF߅ Ljg{]IZ#ŞH|odj$:+=⹶p${*f~Y\/bn뤀oKO_;K?-~>8iQ)⿕dpi*&AC6?? ɼ}<d;]'-vhϫ`E?2Zc!t{gӛ)޺]D^ޥ_Hʃ~g-7S9U)oSH9y%C>SV~G=mzlQ"YGC>Ƚ$nr&J!ASUAGˣ*H&Pc$'A9̃I%r| Dޙtg@' SAF_$Ԥf3!lN^-N:- 5;n]:t$%mWHخ? y,;1um|WGyc]>xi@c *vGiz?[7/A:n%epPϠ]CBP+!g.~Qbo}.اϊ8lA{뎤O.F2LօԬY A}~NNSV`_ /{>q>3ٴu5VC3FRn%PGɰ_&hzrz+_`o'%KA}Zcd]/ILyY>~9ՓGhAER$<Aѿ9WYroyKnOg3E~L>,_IoGZ?d'ԐZ'j<:E >M7A+`sy:}.k0hgD ӵFհC{ێ WuZ.82\~#Oj]u-o$ui.GE\Qd:osD=-I{*2% qJ+3D_?5޿Ncm&t-B1i)x$I.Qbfq&kDc()%hR_,4ޯk$GIY8ń9 r;X$ٌ$.9? H?g#_ zajn1^#i'AF*jWRmɖW,$ܙx$S~ao3J,s @IrxEK`oh~z_%]T%#tRk>Nh > (ۀZBzB$!*YsZp^OJ$tڹ%fޑ Ւ뻢@={"= (6/ @4x~H⟁OԷTyQ5+oNH5o)Y%=9(z?h<ђZsX4bi#$c>51|0{)٘ߗHzHg{K 9E?+ɯf>M\| >EbI񍷀>˹:ɐ7h7M!M| @W]3vWIE?[o:? 淄=RԀxK+x"4孪WEoН*pcDA6# :o,| zߢ`1>w9 FAcYk^_aҫz{ɺ}ChOOnB4 *#h?ڽ*A O*5 QcF5z_IЯ |CoZNS쮱?9;޻zJ/e(_>+_~W+}| zsrE)x}}y~}|U.D2WCp?5_xNK߷Z"Dӎzjs"弢_,tqEvRo?r,!)| ]<7yD}ͩI&-]}]e]`ݩ#*_ /b~:bO*~`ӬG qB`>(tmVk>wsA+Or~Y3 ۬Aߘ!c/4,mIhf|Kl eUVuUT jZjho}ϵokAŏAzַ_aRw\ä}y;{Ē=ϴ8bz;G͝P]?}y/ɸr,M}FOwzN&;?IMϠ"_?R#QsOG'ȉ'į8)*|OF3 ]ˡԬ]$9r5#"G7$(*;I:g$x^AlQxO.F(sQ2ʤJ|aDoJLn5~[4 yr=`==#}{!rB: 'i{&rC=5~ɟҮooR)pK=x?d&)5g% }_ВH8=tJ61@%?9B/⻂ui\XQhbh M.!WB҂L* dß?Jrfm"p>ˊ)ʗ&?4ori[jʓK%Rߕ^R+-#4-y2!r8K.Q*&䚂1L U}ϖЃLbrX&QfZ$)Lv _ܴTI~sg7-ݤÒ%;b7 dwvZ.$'>@{:HirH''m:b]-i47ك0k(kHH,d~Qt^r1-n_ZFrSv|7Qrꯉ禢|o\I,A$>u"/ HHa?$&l$;|9LnG?䶴0Jn^\%/wNn*t $6xr d/PXA}gr|㺝fb|Id綵;Ƹ;[baS듓{P-ߑïSA-]% 'K9 (H0c|-HARDR_S~#bJ9CF4 J9+YC)8J9Gzc^@1}wDN&|0¸IjȆlR)/V Z?XU7xBVnTU;oE9zmlod-t'B$Tk}N'\bM SE8*!D$$x_49ꄂT EB%)M(%IPrhQP IO.6d۾+3=yb; >̬TB.嵥OB19hHYI6Ĉ`^BZ?+,vK% )NbB0 QnFRvQL r 񻑶ؤlyۯ5<:Qn0oʶQ0>#9R^E"A&k5ޙr x/ߥ*lݐwPtjm B6KhRk&W%mI/}olG䬲*g3ʹI+1Xc|r~ay χ:oK^KmFqO!tA 4Zئaئny! pu@LndԳR4ne<9CƃrϝbKvvveԶ_ؾ'_{jm/5Po^fž NB%_* d⯢ϯK0"ڢ~#ml-6%1mm.SdK#>(E3[gxDY[Y=bɄ~oWŅH -jl%wlKk+M1[F{~x."N.RJ-AB]UjɒCoRM,M~ѢC0P+Tji8OH@jSJZ]CV|E!n 9.+k&JB6U!a& zBe^2J}EZUBj1~V$:MS|٦Gp*5L wַB09Uj9~JZj %]Gj 1kxWE8Dn!j&(ϴ@9/zPP_XQQ>lPOEG1nyv}!9>%Tj'1mzY)`|V~pɺʺw[.b2X779TO/Юg۰ٽ R4NItOc>I~$˼dU%M MqaBHaȦ>Kf/"uJiԢ?ej#~)&>^Km,xoBN?T)1JmV?cm%Kd=PЌ_b>8R;\O;PoJ(y( gľ^r`J}[;GQ_9ؗo:U%02ѝ^jw=޷e;Bc_#MOr}%#># owDaЯђgBu+0q?,_k<"V?^$x/}4I-,ڛ6~Xe:-8Sr3^?x~@/(?S"9eH;Z;o۩NjRg?98[^=&{_G|-@."CǦSSDD,SEWa6N=eАV*OnQ5c@W ?CUxMgfV;\U.-T-%T-` '᪖ÇWon!Bj̐VtbTEbՌOΨyp#rHE,g }ZkhkT'V6RU;jПW/Ucst\YNLHhe~G~<:7r;D>>m|ۺ/RfYqޛԼ߯Hvl{s+S77\JTM:44)T am23u^YTxC2Ӕ@& Z\Z =pǣ{̂DUz|RҔ̙5ah+a*Z3 џ h wezCe1bs\f)K_eѕ_+d6} O͙R24go*03ѿy⦡mNyqHǔ2D7H^纚QYerr=Mv̙ԀE]))L8('N'U!s`}T׮OB8+S1=/u[oyM%M:)'CGNpxV=l0l~|舊|m^Ȕ?9REzruڻzδ_>eHWH0*Tdjgʪ5CEv7C=CmQᆩ"{\3wwZEv~i޷`?2@Ӆ_F̯i$Umҝn=Icz䓛jn$Jt̮j~=UUƏ:G՞vk~f)SoT.4CU{fPg]d^ۢ/mWڛtt?UޮmWlU}mk3U{vǠVhѴYWRsk|KMjo#*vmۈ \#Ǩܯ?p]#Mbq)"I*bTNE,jdɫ*bϏS4S}4BՈx'0>_r#V~EDqFFT|*Ee(W{j=uMGLR#ǾQ2Ik'宿.l  } }~;VGû&n| o=5&>ɤ›\*ڿ 7OTxӫE*!IZ‡q{%C*`m>7\cǛ8\@cOܯu\ON|ޙ=p C=k<F*\G,-#R-Tx$A^z­grR3CLJvboĐEϟPwM_y]'4zP.xP ד,i5aBO |gӔt3aOs&ڈE6@W6ty:ݘӝt;/zPޜ}Byzq==uHwth)<f^mOoQ%{bVO/Qb=t<6Cz0?-[bLSy30>/tӆ wzuQI_r;!W6kqEj6.Ǜɼz]"*S=5u?jIأC{tH{Oo}.$~3`nIO{J~*FUuͯ%̫CA!=ytk ~e=wroI{;C?~sgTpBʽCޑ8]umϞaF'v!kkyt<:uџt}?v|on~(A:/~Ws뜡Կ$^qo]_Vt.yH<[u:fyûEMުOm<Kc>w)!Ǿ Oݯa`|:7::?a?O zygy[<縯0w{5p7f}0`ЙbڟGo|cDHnyf pşi:IL#~s:Q!I?|9(r xr hQf7nw{ivU4_?OcU(Hʫ/jdQn //ah]#/mR\=ZC|#R-;#ZU[rA+Kz%ߨ|#`׃%d~r? d= ^gp>SL~噡m3PÂO$Z寤-Οx䣓-$>NTAxv]W) 0_iwS貤 jk-P7lx/@shf[q%>&^u<`un (+{XԱ'/?GьihBYG|2j0'P-lΰd\"K]aX,6dp>򗊜h$":Rj _g\I撝Kt'*?zwU֍J]j[ȗwʽV~oxnQJ 8X*׃K,T?n>c3z*ysr>f>ωV?iB}<㤜HNj^tbfu\4k0+qSTNln Cry}swVr¼R9S7X[u.()H፤~րMWp q0n)xCgC݃TM.SO/zom]ZPp&,9n_dMcp$煔A =ʟ ojO ^`EovX E8лȱ[lmq [ mXOӱ='",3:4UxK˭q@ k (W4~ۧxp€X ͖lF xOVi2QB֊M PϜSȷ5 w]ߠ( vW(6q\kW%],6-M#l?Ejš;4wY"=q_dBY.ObT Du<5:337݁yh,Cי HyD{@jY8 /z+%beZm$6?ew@WQL %-0ܡx%J4K?^}W)b<6_V W`)0`X_ V0S^WVu;>M]ز`U{Zq)ox_<}Ĵ`_>i}[(-ץ~7_/ ek*"/ $wZ UƷ䝩k:kR!_z̘ _5P0Ozqzwf_&/r~sZOO}Oxy<^w^ *wɒs*kשؽb-/qjj5+?l$~sC/nqZx~kgg&_,}rxAx.tymXW?,4F6^i’tpEKE.9۞/r^d蹓F z4AiX:(~O[T K/3f/Jh +=ۜ/r_/ݽ\j ވs?A~poȕm+͟)zs;i@ F3r9964 sJg75^ KٺBK=z4Hx92 xN2 d<V"{=fIPUs.ɞ33E&dHXïe<*tk!AZf<0'I?Xe:F Vրxpۧʽx&.e<'0sh Yь;oP8(*.Ys;r21?.wAwcƤ:2Y1bPƭ%O=(ŵfU,(㚥ڪK2~Zls"wPqGm3&)(㊔/x;wNZ\[l}u\;Y=Jce\qoN.2:YrV~*(ǍZـ-Naw:/~ZϿ:YAG5&(pnOKu X;ꪽ+zW! ,2ɶ<›;2?,r1K|lPE+JJ?ףcJ1bA 8BǗH/)#%2/w9_w;NS+O~K D;D2cqTlAYuȗACG^c^W,PϑBOu'g<z;~߳]x6<%!F`ܟŰ_3h˽x^Ye+[0HA=(2$ '}ųH@Ąs(|p^?<_ k~41& ǧ^S"Yk{;A/%ޞ'!(ցՃo ypuiA7\.}=צ|)xR=?#_u`oj(t C괹Qߕ9F>5$(ߠ+(`=r]/2 >]m2:,?ThhXԙ?S@gw^VuwvŇl㍚G^iH: b CRx6"/ Ǖ.c_څm{ (%:(/}޹3,3=:Mnu8~؜b.9޼Z]o;]I𒙧=ƽ.Z򴠌'366(cA;$8)(c?eܠ[~ r, _. A3$)Kb^dAs~?MPƉx϶f iGtd^*^*t/> kF\;2yHB/Dy9+tm zo{\Mߚ7Ag><ǿ­n{e7dWo3Kyd '7&>r7g3nYEr E}J^q⥌$e<"Pu;Ǘj:!雌B_cgS:皟y1|kzS'\/xd|&(>2O Ij.۰bྲྀSvqA<')saE'ߗHMo<{9ߍ/ ~и7~!$y ـ9 _%}Tqxt_<[um$A&O} !#?wBL8}]M(jϚou$?/t!%(*ig_~68/٣G]X/9ɰQReՔgܚȼ~/~5W% F_sܥ6{iI!scGnӧl,.XgEK^!r /S\ /]ḙ7]>PƺJ8"(`eP}\y9-G<~YPƘw~2wyn˚8oe[R>Xϼ ૜xN {?`)3 FFer7?dWe }9/jrWD.7s mTbN)r_c) ~ ,x^3O+Wxd| ZS^YFӲxAylkVFQac~kܭVS~GXUnwHφȁoV́P/_OZ)Ų8Ѩuk$ #9?<+Oɐ~krL>~A|\!vL y|Pϧr'a^R~[xGjb>kV)zrQO lwAp7~al9˚<??zxB#oBpb./E}Oq\台?M[ߍKw(}\Lpyd ݃~(HlBvy|u*IKyy?HqpCO >+߳LS3k\2c_}qI;9={ rYn'QnbsSΨs_g9}NjsLo'{gOx#z1zz3}sfeOs鲱/kП}-筬AHϔ=Ksr {641ɽ}T.tk\]rU1wwz7yk\qm_AWa`Qϗq>]K@NmC ȟϠ݈OB{ᣔ~?&GaRʅ"It4i|%]>ŭvywQ5*Kw|k?m"Pʞy+ MI!~!ē=Fݶӳ/[ݵXV2kqެ-צ.ߕ`=N~)td~?qfhʭ: zW(.Z2^?( 'z\'Op;ߟ+mؽZԿtAMM1xurԿ7㻝%2}[B_$ws+I={oRP~gynȺsVy6i|ʾA||(ʿsW:|vN~&c7; kV(_8+w&,_b-=4~ JJwbOW)}S%?BޟyV>&sҩJ-[Ub*U<*iB Y~#7ߛ4{.`;Cw`yU92>wES~>r؁]U޶~8SĻ'I]hZ-)~N,n97*M%YITt_:uNSܺYNӲ+-\g )KPr0yӹu\,̻2ʫ(N \Bd~AZr 4 s۹owRk_rHyFsQ?ȼEbĹ`^,A3rɸ0{r}#h;q~fkƣwb~Fuťk8ӧҫɵyZ\i<MX޵$\egMyW.(];h.;muma^:F]rmV8c\0Xdz>N›ߥֈ]X\+"Yo`}fɗ`N/Ʒ%/?%)osk ֊^W[#yYҔk&~7D''F3webW2+p-geϗZBK[Ϟ%"Fv-,cm%Y<bH[Jp-%k+{ XŒ_DƁv@35_yJ8]ck~)z39->SedOF?hMhG|0JX1Od0򘗑z_ۥko2xk -]i>y\5۬ge>!k+g}8;HAGez_ǣ\_wc~t{rn12(075>̼Dnz>3泇'=ߖ]?7qw|ipS֌jEg}W+:۹Zт \-$ќa]ͷ뷪7sylC/KW[IwcPW;_kwb~WKg9V _Yd^3W )}NWsJ r%8i(7}~ޡgpiɛ9o:}G{wuk;Fw7O ZwFۆ\%cA|5ǠP.g񃑯 Vy\qc0/WO;^O+ȹ<\MpY5K W4r0䊤k+B;̣;,.ƛ},trEC# >N)qS2BF#II uUҮ/sI_%R٤<[de[OèƮ8}2?+)8.| zMhMcW_j.2%)]Q]$xWK-K |ՐxhØUy]U.ie4HwUzBC/UY#/c,POOU^wYU\[Et {#]/7ρ1%fRTqmrz;O8OO:~t~K5:1? SmrnQVqKW-f ntB97I ʹ\*tj\"չP7r.}UOy΂ Lg~EL׉g0?s:];3s:6: >) N ~u~"6hϏk#MN™}J_`wqj&чٙ$M(}x31?gcp B)șl$~v:YyĜecY%cN=vd^Ag!:Q#jo|Uer"aYnҎ2_Ⱦެq#/֏/Ϲ=ranǻֈ}6/~zV9{6wzr:24qutN].y2Ô 9ޒ|GGWv(GK{z/mIr4^> #U;p;r`I?Nҕ#mH rоqOW:/q3ϻ48r _wH`BK& ޓ Թwӕ2u6Ṉl?hxǝ}GG=%ٿg^/1u\r ~Qv :v$ìo&ɮH~5/쇄^lHlaƵ"`?2^ޅβ.7eމvtA%go6ZWfQcWnF\m҉y/ٻ3ϡ+ڻ;?;ɼ7x(MG:ކyH-jo!r ksG{sпf-x[1s`o"o'i)^[ų:ߵv'0-(๴ ]{Kּ3kO9&q"mIoڍ{eZ4{{}bv$Iގr{iWJ;! [!>ɜ6g-BPo mO[1fܮ('' A0^$ӞHGH{"Lx@^yux_c(GSN`&R xu(%R۽:е[=Hwu^T{Ia{1H%n/Ydpn#cMk{t}u/ q ^Hca3h/AOl{I3Ri/SiS岟J7eH_C7٣7($boC99{{=z r9Y:WJqό 7Ebb_M{?Lx/g _ntcT1?S>Yk zJ=(WoeUW: }gv?3>grN7~&![z?=':*_sR{g9xo:rR(*.)(EQh1#8U@3Gy#r82,=;f_R?@?}(-uGe,yAUҡUrarOrR.DaG]ΫdЊYm(wh|h+c)xS_ C~.3p#H;Fs|,pr>q|L;3!2C|{1 x9^GTӟ/8vɱőw|CqD=呎V 1}y1s%1qxq'7#&ǏNQ;wGԱi(}A euU_M=Uٙ'ڙYrWgA:; 1Rߝ:(gS +gc;9+3hG0Cv%8ڕ{RN7H11#8->+DNnе"y*{B|{t9C59_.vdMK /S;;zʃ|S5wFDqkZs:ΛXK'ݕu9nhy هoyr<-f{uW/\J>yt S?(gvޠySQ-9-%YW'GyWΗROʦ7:(+~(ʕr4WZ^|+#gTWO>묔(L1Ǖy\cΕ>Ϩou>r3e`?/s?sYWEpzԓUP 1[;T`/\firU$tUjꊐb$W8 Wϛ++TuҙjZ?QM_%)'yJ_]ۣ/ I|a>= ļ7$hx?gZJm)TS?w%Si=W1˩v ڎ wrs\Ogt[1˭ IՙtoWwcA:Y-ޒuf,Wmc|#)G\E򓈯]S>]i ^ik ߕ- .ELZ2\#`PsXKqHgX_/v|^r@<# fK̥`@A1!yC1Լ?F38oP۾-zS*GҔHW6 dp[LvRB\Q}œ*V`6͗z!41ҕ9cn |>nBR+LlH#rPxٴhx,nFS/ɴ[z чߖKv&tU(oD+o25vcYQ|'8IRfI 4idB>BuI!eTvS(kz0N~ezX{SyTܦLmO&DSݏA2ggJzs.8W|l\HBW+e.+Qn+syI>A+Nw$XG*a* d{E?NJhg0?lzQBdy9Oޖ$v T"{-|f & FRFryWވG=5)V0L[Ķv$\y}̮7^7s0ƺI7IӉL<^Tz{3]'C#,db|I{8ӈϻ@c[" KyʻL.t]ΠT"{Ec- *I+x{N%S X2c^ ݃B8ow2z!ڛO)ˇ?^Qyw !O;؁Rhҕ%9-x - ZYҪFKTg4K}Acj;$5fZċ=y, ą+v̯,<8svqVzRFW?r {iI",I튟[ ߷,޷~S^T}S/ZV27e&"&Iq[HB}**XCLP}Q$ҹTWqDycXDa~ײTe\L(X D}Z *%e&2GCRtQIgsn>FN 2J#8ONz2 =G4>=6cyWyEIW@ݥ!{oPA{d.)q5/>263Mhq9=PռO5%j=ذ Zg/O[J^ ;o/^ 5I24.7_aS -$ɓU+ gQ9KS_ʍ=Lي̫Th$aEE XM.?}}xQ ;ld>aB^[KoL;F]+$^XrAC{|`"\By/$/IK_N"HUܼ| ݗ7/9)._|A/ ǚaao7;O}L o^y|m; T<15мCx>$ <瑒y(\@=B"8D`z_^4K@l \(_I]?Lxz4Z>\㽿MnT}9 *t֙nI.!pB򀭄I8) kN8|ߒMqokTdzkVMgf#;ΡkcB^#-Nl+Bdgݡ[\r%m6ط+{gfS(?WFh$>Wb<,ski5j*|(a׮_a@ y+D5B#}>J,}y壅/5"(il_1Z2#`SL*i4_Uz*L/R_yZJQ+Fa!0cImȵ|!嫝eF}˼GTMi &NP?#)$I1e}2PsQ(M$o9h4jiT|['%Nw Lj{;}_ $13Q3 킅֪gvE smjS.> 'ӮXjvUohZf/<ѼbKW 7y=wO}vi+g^.e2):ʼZy]Yp!m3˴Kb ߯\ҧlfv;X jyRl rmφW͂}R=9/\z,3-D`(xP~ٷ3=VxYϴk"]X؅XLb#,eF| 5MNw_:kٴͦY>7`t̮[1?_.pMe>~OKU6y#*I %>]P|*^9̋EÅ+gp5`ۼ_eA,[w]ͧ}K[F7ߗ[N2vmyohB7ҌԷYYPk.[C pYEs,N{3A)oͿz:U O|['{bH,p{eLYJKJU,bN<Ϣ<ʑl6E#cľ2Ụ̀ЀB>Cu8u 6Q ?Dc"J} 40E_Erc,ĤjFZ*O>zUlDܷQ/6ҾŷQiq|[!CF]N,2<}(y-\OSbX:j3c>q{_fHE/*&`P!*Մ6,pQ %K Wl}w_b]z†sj"փ}z 17&wanLG]s,H~VQ[Epj:Ϸ:mVҀݷP'ۢ⸂Ĥ4$$}k鰨M13&5С]4E:O&G+6ڰLaȏD8FQ"^u0 -1epΰHB9# h y&Nȕv7[2U1E.ge(Q .erN al6vnr,vjn!CH1od}1ӖԾ}G ݣ>pU؈:o'-|hӑt|[?lr{7Lă *9aGzÔ]a2rÅa3k`? FAk"[4uɉIWL%y{-u=}'?,]-=hh+Hx&13Jear(PK#mFڻ d #$.Ur ɉ(D4YIW4|MEcJ\t L ?l޷﨧RbʔZb6%/7DEeNyUr͚-5J܍As;M!oOQM0``H# yXRj7,6%)zAS""%R̤UI.',) Vg Eea7hua{"7 ("pf)g饘r^_)hwrԔI@oi\O%JJy3wi!tSH|}0&q_MԿrm½dvr9~01Cmr%qwiY'%uw ZڸD)$3qiHwHxh?`"," ,q);+8vN mƍRzETfOS~Hwkq (i[F8C~;U YhBҠ1nQn8â='ΰU00;G%fE8+:}nMDC1y>8S:F8/G8 ?&[թ*fN%Z)S)HDP'=.G0.I~9ԕf=7 L7_"[bq-\دhA ]@"g Q_n߿/ WR>v%凱+!;UbXԻLtvMT4d]]JwŔ@Fqu@Sl[ c[%=TTU_}A=wCq6*錾g;D;Ŋ_}kzBf.K9ilC3]s'A|@b_X+ 7! .]h&b;J-ٱ{A?¾-}sBm3= b~9&JW1{?bv4⑘}b E."Ǡ0Bļ z!r!㽅:X3b#e5![ӏayF4L7͘\ Ɯ2P@2N1>E9XO^zycbtjjS#ʕ!)MOz"ތ)I{Ҙbz  c1E|`b *$}\bgv_DŽJ_-G01qˍ'Dl01>ޗ11ɼ/b4h JMOT=|ٞUt*(?܊u((&QLEcǸdQ_kʡmIV1fЙ CЙx};ސC[3s}! ~A$=0e|3 ]%irTE๏ǰ8[@31\TD#="> wmnbCO0@yE~oLh/hܿ(_"9;.Q#" آ2HDe+ywoAT%W?uv޵d,}~U~VYv=pNnr{o6{=_;Fn-oHsd9);prx7`lzE}[nim xݲ}"|ƻyrf -Җ0Ӄ֢Yt(jGLs=Q0a'xG=P-L$_f$ 3evGk^KVvD$è[[*s_X^|u&մU-c/sg'tQe~FoӃY+oa|4?fѬ ȼ&`ZɼmykeI2k5 lzÚ(\yEGG4:gYmvxP+ߵsi)  = r2lZQaދt2}bBc^CҼ;楂P~ yЕ廬sHga2aX ]%r cf-͵ex.YN5!2=+^3)\㡺'`>1O,zC<^ê9XQ|cf>Ϭ99t9Z蝣YebCs|9As}@ Ös< uEtYf?Ra$x2y^\*Vy B f7ϔs~N }zi՚q(iZmq⢢ҠSʥ3~"I7sKΓu-_hG}i5lnSth-IZ{˹@=(?tҞaDhK3鐷eߠie .tK,7Ykt4\' (or| #WX=TZ֟cʆvll5# o63Y$FJx.7DN/#od)<[i+|zW1[,y~qxhg'&&u,kC:),XtRMg6,_j_}[:ߵ1`X<:Kw?"LYЭPO`i(tRnei"Y4TC%Ebh&% ?K 00 #Xkn hzZv7( m~1+huZ }!PX?l[xw^|C xKw)OG< #y.ʳͻ(3t ̇4}z?xgM'1lWj0k~ʼiBlfLW O慂Gom]~Ay>Hݿ b.š/D@12ݦמq9&+LF+|g4&cz+81A} 4qM1}L}c\2wM)W3EH[Z/j*GSi?S +_S>iMu\MhkMzՔ|Ѧb31o@yochMt&&u1t_|d ~4*>V>2㺛ьt_mLQi:'m|rEEM)7]>ttL2L> Ì)m5:"M?2Pg:x<ϷfʗMߡ4LcRs-F2HS U;)δN"ɚORanHC('p~/sCWH1S[MN;k:<Бs[̭GJus7y?{Ij^Ɲ1&j9Kˈs2HgR94]x9C"87SiGbGfͤ埦}|+1f^h^LБ 0$3izԍtyKo6m =j}o:@tLϚ~b`12}Gr.KMieNd(t"y徦}i z 0ԫzizܓ;n/5ґ2ƴA(O2æhOaȤhwygihw[Dy?;Ns̥}i)L{3Ӓo,~-6>M; l~QO4?c}dCz=3z1iȡ1M\|d= 0ݖI4MÄ,Eo 4j ^{vֽm'|Z0ƻz*QM̦ɰ9՟zܟQN`MoS^cz 3#~0wӿO,ǀmAڀ3^$fQb2~ߨ#6#_iZPL_R^lZBnv3͓J Rk:>eLz5@j{S?M?}@0S_ 4|O}f|iOyߚ1Zf{h@lL;GdMf"{ԛL>ԕ|C0zx5=ۈr rT"m+QoMeBB);/%Y9rsy+ME6-<_ U;B_E=g8!ɚAEbՌOΪ6 3/agXMmړDtUD;Ncޚ1c=HE } ({hߐ~]2:|</\@9ΪZ)2߯ji֐[_OrETKoA.7jE7yz; ]HVǓ7rB_w޴~cx~A_trZVkEyB-<A|{2h2ϫ]fS)2.岳?+D=]3w(Ҁ\__^ R d wOS5_HΪF"<]i㴏=.D\-}Us D^j>1(߼_uPO=_|% Y8- U#!37z#&6:-rjQvK~~2ƙֱ5㇭c}a_P!)l'CyOT~C:8G'ăa9CPO¸KB _' ܔCzt{Qg q-z=",'8O^ =Z_M-WBRYq4s.BMO³r~z;˺[va]NB u}*>t*3x?N?-.P~J>x ʂZ.j;}Oy[1O1f\>/v菉x:QhA==sU9۩З!Oz`KxߟUN|W}c'~icZ+zCwz[?WoSdoުx#a+7{?>z>C8?z'%Uyu Y=^'~|z=m.䣏븗.-8U*$ʍ}t7տ\}GՏnStz^OP\$q_ww}nzg2OFɏó蕋b>;}ٗ B Mr Mx?Tʝ :P46_Cr#OBGӾ t\"F;G[ny6| pZWFpͨolx? #.~QWÍHgMG CRzXK<"[50|[z{hgš oFg?_oC 4·rB4V$<ۅn^|ut^SCz,l/1E/{A(%_ls~[oK9eҎqOe($}XU3 yEcgX#V:lZ;cCooF7@MxV{L˹>&6D.E0Cxr {(lDFi{TWî1n I1*NOЯOBw\'ZU5> MLeԻ(xI|@+wb(ͤ .~?J?Ckr% kL,90Oޒ=Iz+lʉWcSA}"ۈxŒz:aʚO'7vy3moe8ah'A( )D>).G"axo5 N)T{73$=-Ͱad}k]y:G%diȹ5 :d Eϯf+j<}YܷW :K'K|~e2 eq)ǵ|ԛOV~ ?&|ޖmxKM7%_nܳhM9xnK)y/xݲ.7;q-K7o~ͩT5M\3@I8A~ެR?H@ǽrN0ޏH ugwr?tSW.ޫmYr%-YI)zB{o J@hIhr}kyugٳgf3m=x~ĿxJqM8?Տ7ht<7 iӆ8F`KWrYlW$2I UZGyHi:.-iK{zN": 1h޺3R=F>[P=[v| zyy>g$XS{]Vݤyr oh{9^|BKçu.>P?zrTB_s;S;WXMq7^Dݐ3n,]~+'{H×փρ=_J#\}vX@W:%RbǗpv ޡT+R?:|f * vp?zdu`{yi*HO G:MqKG~ǙYݠy22Rmy]m0M{pK];}DkKk \mN~CtCVXTZ3o@\2uj~Iy.:<~~u8>#^?4/&#}Q;'[k1v(7S?<[:lI%PL:sӊǑo%ښqmg_/lS*kT6|@tنaB;\\E_|kRi-9*ےӋZ"hZK^_ԎVjYN[ j>O ]7G״,w ?hƱq]7aOk,볱CcG&n&SKӸ6DZ#N3L׍ZO liB^LQHWWm}?z~O몾{}$ J'[a.g/jGR_ z-1f̗noRu*F}nLs#`LZ3uCUZ?IY/Gk5<)rsu}I/n'uҼϸ:e?%&UTW2.xVޓO%ɾ$&OK4'[VY_N*N7kACѴʼn#EFt_MsU)Sn*||W<9өF%wey*LW*ǫߩʴ^Wq"JJ/||G,_Q?+pS{+,46rFԞ ,oti|]V@ٴ ̿ߐAϕ~SˋQ".s)r?}eG")rgr?@-=YwE&_ȸo4ݿDf[羊g_~+>3pTJL>S$pYc>s{i {7izjʽ'ج$q\7߸7~O؄͜کG1mevn|75{;3S>A$ sĺw͍2ߏ|R+[ٽ)$ҶpUjVvoC2oԽ {35܀DqH^in޽sW=[eֹgr;i?=t=xQ4WvO{pIIH[<fHL/LFHg;Q;m_S=s=:mfni<7[u3K94e  {c XH@,9eRnjY{tҼ}aF9Zѹе_D7S7ki;oQyݟ~24Ӿcí>~~x73ja3{,Ÿ_OB-cBj़e?{px%oow>)"ܺOןq4.Hn -m"=ҫ#܂/pwSvw>euwq_2Nk ؇[͉ ''j}A!k$ztwniũl[h>D.G7օ^{ x~mst0n/ s 3;;yS?sC~q'JD%݉9+sq4fa{Ց]M_U+qWU y/]r,|>ÏS?`wq+-MvqYyH Oh?uErwIJ!|5мmʑPRyY":0%vP @(~@@܁BAL't~'lPW9&!*;8~MytRiGD#9}$:u=!ހ `]{ _H{6> k\NAnk.=:ZTWC.5k ^{]Cv}} \m\ ?js}no)W[Wû` S6'4iHlr#˅.'cr0,\jRPR}jW2E߷i<;:|֕_DQ.+}| ]ɐ{]Ȱmǥ!ыKC"n.s2^]Ƶ)J YR踤4R}* }4TJ!$,X4&MpAsC <-CeTpkԎpH3Sb!;AfnwBtO }ҵ_Qۢ,Q~A\ʇtC]yrq|g/0gQΧ= G+||Խ2Go@q>t)ApOz_zM*YjD%לwOyDŽ djr^`5^qvX*1?9Gۿx% {s<Wޟ#w,~ƺ,(jIEl_쩜;8nv[d|6K ,иd4%z,`w~\ ~\ﯕ(I֌!87)3<;Z0mvq~|܊xgέ,?r c&пSKz\Թzs9˘/ˠ9Cr<\ }޹j5[8 2!G8w2]wwISun؁{Oع'tߏ$/ty>y8"~;O;O9)I2$ o%igγi>:\zyיM*2ׄ!w9/K˒2G77>#){G :%>Íl*~B\Ii=$9W_%Iy}ۜOg~B_w*vN>7]vsj^D'zs?`yv1ITv 'I?tO _=%Kap="|KaptH;%s;z˝9=[e|1?v`=i$->ؓ2|WЇx<~\/ 7Bڊ+mϹ],xvBpM7-c/BiCr.uG[ ˩i<\@׋/d$* \i}M*#lW =9[gs:犼5O|7t[znU9_Z}ԹǡQf8ov \o}OJoRKaq.=Ź-oC|q̜Kau.8 cΕ8s}Ĺ vo6̇y/dJ#)J/c:lfrRΥ_zeo9=ڷRȌl^܈0Mob9ya=)U3U<53.dQzs*`r.) _\3-z+V{'-&nBAtH91Ny,D̫Cx n}t"?uŹ_=9PQj jXI6>;8ljN'BsN4}z&!8Cts349E2kd{+Q/Osd<(%hv|ggIYeOm!rn76g>BК:.Yt-Ej)n3῍e6~H@#}6W_;%|tOϻe?Ks1ڰ:\W+C=ƧK̸NN;\B絑YG%)$CTʵW;asƋZ qG_FU+=˜m3i_B4N2\r_/sfgUsjo%گh+ᬈor(",xqiw|9CzS >;S>WHW{]>}F%+ޟQK_簳iB91=ck ja1N%v=5zsg{koӴNo`W@n^#vپF|UieEo;⪐{v;?:_ mhϵڨ݇>aԟB/~Hi2}~xZkQ{2{ZKؾD/u-G ƾA>t= ZQ5 ,?x!hEpBOKcvA~ej/Лd" "VVǁ]獞/ Zvl,'5ɚc--'$-c.ิoR]rO(7+]_ߘ?̟& ?9;W7Ѝ:."YqzgL9q>8vqq<9 ܅cMջ)j]:V|5u8wH:!Q6~zrlııvZj{8V~K $rcB2_:IAq(j>-Aq01QG;~xю /:΂zS9t+>~'ZSZEZAkjE1Z 0-Z,pZ,h—M8BN$ys--z?8ZyMs&[Z:=-VVVY MϩIMPr;LTiK=Q}}p-}W[d:_if\ۍsBmqٶ~^'!>~zvrv\Uxjd]sn,Rs8aqɴ 4L/8^yxɇGڙM@E_9™Sy9=:\L_t_9|8ǒ(zV,vb( gIw9n!zI칡 ;b~YwJ<_Q${)bW%v4/gOuE?M\-.rcIvwڋ=YK3%R_OgO$,] Dzp3^[|sG2IIvO臸~evu|S=[_^+0=Q?;4ns {\yk˰W6xijߏb?)*?y2ާS;N|N9ʸ>輈v Tuяuqwrf1GwWOt>Aim8=$5ϨpgWr \_>gHj{Cw?\K'G$[,]gtgm_lG^N%eiFEn#-٩_S=1~^zߟߏSi?J ]s5-wch9-E+W߲8?GعӐX ]j_ekX`HW|ӥя*G9n_+ۤ*,e^68gMk'~;/y$Odwyw`y [٧P_sI<ST &^wbTi#oK䀴lM?Y Vi~h\2^Tl =wt}]QG9},tZڑ݄ٹK?Qgd996g >-$dEXA_s%yu*@Ennn}IM=[eS)wYcwZ;~Pý4<{IvIG_pFω.phD [Urv⯯/.eғV,-Sr|a2Upd}J`Ir\q0ʤ]LzyʤL /FmMi|{[&22¦n҃U2=w#rpr*"/k8" sl*d̺"/c|TQUBE3 Y3$UE=TЃͥ퍰P\E)Q/VQzQxEpTߘK*TDFBEIKL'ĭL9x*z]RǽF;yЃLg?e0oףG |TD,V}"`X_=ݠ2㾞*,Trp nKo!Ljr71YEBKƜ|J%9"pi"f\E`kT2y~#]Ψ},eh^ .qC㪃)Г{UK37=R"1@EF""Ks/U䐕 *э9Ĩ PkAGEF EEިWTyOTu^FLO(=(W*INFXQ(=M=Ut ?(=dneVQzp**q}j(3ňRQ1Q"m=GEΨȗ|G>F>R?H=8!7PQ90Q998Ny*9O{?fЕUT6i/9~TQ,ڧ%WQ8Qt2xb褊:uTPQ{%UK9Ө6o>}EWC?%ti7X]XEtNE/ze*iOGw:I%!kzOF67]~ >݌T$n'E TAafO@Ut?:( 22?8Lcnn+|&y޳aFGGJ?MPJEfP+T;JS+;%ͮ+T Y'd= z>A=A.ϰE(=QZwJ<ת#e?Jv?yxlD\"o`Fңȝɺ"|{=>#GwVE#%9bG Hz(z)IoErPǽ?ȾsyHVg#"e#k#S5m ~xE>3wAnl혊,,,Yb~SX9Yq. %/-P \[E\?/S"~w#`#N:A"MW" ԟuXz0 *b5>P/D>t""mqLeOtRkw&ᷦE~fy1AI}ȑ2Tnbɸ.m9X+2 53M"Wt?g-$c_PcI|kdΤ;qT&=hSazS_k4 ~>,?3Ulǯ&TSP/]PA^RaΔ{F ~M z:u;Uf^su AJЦwhž_NUe1lV|8Ũ*NC6KeH i:Q5يBbh}Na*$s?5T%8鵓?V`ñ.+mڿn~>PD[oVU8lz .*\GA~yQAyeRO=%_Ӱ.x(d|<42|Z20@وzrƛ"*y5Ƽwb_w2J^o_.a.A(ZpeLkŗl2C5o}{2{t}m3=+'}J\?}2w?t\gre*sw]S|Pק/5_sZ~emLvUƁƁC}y߶VBw"?j[m*P5/4GS *(4[CTPCPM#ho͵^*h㌿ߨ~:5}e1XQp71!>`W[ |,^@;~CQo{UH{Bv18,?4K*ThPoTPЖXG鵵 LjыJe ] Ӊȸw²bB`Ti|?0r{.Sa 3Oh*̎5iw6WWakwm] luQvNRaz0*l6aHѝ- J9}!KQ ["{AdrAdgJуTaV)z0%T"Sq>gTau8L | '˔c#06[NslܧU8I%KR~ ؇R~'UѵBFHz ?Qo`Hѝ먔l*ݿAR@KaPTҮu81uJ9y/x=|GzR=|Atz<]1o[S.@>NUuj[xLTJ{NAO9` z]S~Àޙ}F?#?ˇ:|A ЅB~U4Qxv}oJŇBԯ]B"l/EOFK·pTVX)[zX+SB^%k[SVY5U|s#?MA bOQ:e|odw"h>χGUX鯞~uzߑ2Úp4$* 2\[ydٷє|xMR^yUv+mz R{מHJ$ϥ}͞e*O\({]4>='JѳJ?v~&\w:3vղJ~z{JW#)PO|`a9OOï'ج{w45;|hHl).{RB)Ҿd>mvdfǒD,*!|! tAIq 1 |M붶Љ&d\j0h!|ZBfK}᜕RQc`_H*[E*/*m?Ib2)N)|K粔Y! : #Jw_H wRa/Ç4oee˳3Wy>D a)e} (6V;Vi:,&RL褸{)dWd=ZPG PBJ3QY"]U~*Nٯ2222E')%aڠ?q  | #sˍ#'UHg.׬_1J~~*)S' bF%U? NG%)J bZ~|A?@G0fJ>ϓ_^_?ℑ"_dp'ds ͓28yJv|hoS3m`0|*2d}gp4LJn 1'+3Q{#1Z1BŅJ+ {NJ9?Tc}:;3?ulCc,"?Xd73XՃQ?PE·C4~ | W|/ Q)Ydɺs [ d_a}%?GxI;*Pw矂>A^N;hkȏɯ%-L!:z# ?191WcsO %?H~{Z}G|?0!&?%?%x%\D/:D> /va= j Sw+LUY"GW>XU親!ՅRJDf33ZBtPI"G~ć%3u?^JʾXBWO*%_J{w>|e͠>4AS~0?tУ~&A|t.rhIR)~ao~!UVrc~YA &;>]E25d?R_SC'MqTT3ه[˾VƭN"O_^9LpDO,Tw68Ku@[=_) }cɫSvI;vKv]iՓ-_6 (M2/e݌}$eȓF 33$tY߭BEO%yK?~x@za.H&="%o^ڑY㯪k;@$ưI!wF p: cT oR@*pD4A,BN#.sUD#9WѴ۱C_Z!K4E 8/pAFMф]sAzj(V:3}wBtZ@+e?CqT;2({ *f%gJqyA-}{_U0đO#Lb MP^cى41[V2f [܌e1[]iH-t=-}=7ibF0|td w=*> ibt R1}/#pZv* NG! _LpH6Ydߋկ[z2gRw!}N c$Y0R*V?Nk]b|bs }olV>a_u3E(XRfIEWpSHG]utu}6oA˼ST*ùk*u5`kpSQC(߽@7y[qM;#n J7NuCT,S dֹ1`6; #C|5XУb WC^#z"?:Ǟh{CWGb0[U=Z݈OlM?C["n.Y!U,X*F%ج@o9{'kւVCzgBFt8!eU$䊵r7Z Hf$0g ! c:gpWMٷڅko7{8vXRcxbd& 6Hb%1rF{ Zl@p|61jVFe̴~O@f B8om6[pDJQk36e : @ o (f>lc/~%PO^TTiA_MFƻ phJɘ j<\U36q 6@lHw% pv f:bHYow;7DQWQUyQQr+}늊eJEXuQOEF=eͭT;N/L3GE]9Ғ޻8a]QzB/D{nOY>ݡOݿ iڃ{'c)hFV3O Dԫt_Vpt‹ +%|t'F'Q5ΌNmsAs65{VʌVH7ZOIגZ.ځ-#5s0;w~']wB*H)%%ctc`#Es"z) R} ;I[ͩQ>zRGO`)G!pF"5}XNqMύAH9Ͳ/TkǨO_RzBu;2kȍ+6({է(t}WBZEvދ'0Z9u (SɃ1: l1"utId(>'1nF-R=rGB:;9Hy4cC9Dޣ;9(,95,c HkceAڡ8]*Z40R}</REj=U*]DjI3ZcPRfMOee֓(%nLDi$:I42ƈ10?19m2'RipJԫ4oGxyy@C*p:ʿK=DwH7>ߋ<IS )Fc>%3jV {cç \FqR!EynX7kAHƘ=HsHN}Dz7-X}HRSuCzy;6!6)Uc 1$alRgƖºXG^ɩ*(蜱"36 i>nV̓P0.j<(O(b'RRǜ|6Y険dgF#|} kctt"bj@NjIԨt?)cJ[LtСT cc?o!]_]Dg]3pQ>|C'_N$*CԏTzUz..Ѻw! {uFSY)yu{LlR>\HU-)Fu*}>ݤQH]9]%zbEVec8I^#Tc_ K4z?%6mBRƴ>ӑ/=ETo?g![UfU U *#{E\Bݖ@]`#WiEed܏Hs-RS#~y{Gz3huc^c̦u]Q\5c:Z֧ۓ!exR~Elb/uX~[|M `RpE6z.oIOe&)c_b>]4tO,xܩw! ~-Ge^/26b"`yңc.3K_ӽ~R `;b=+)4~TU/iܚjaA^oD_y"D|׻dz+O>z~$Ͱy"I={u~{ϞvD J+sl s%T?z#ɥb˧f`1ZRnGYND ~u'uWȉU͸V*RRGy"C_GJUfRX"Xn(/gQuUJr(L 't_&Fq3 JW)CuY|6뚮uy^__[2|գsTU*P?~Ne.FS{yT3F=OdQa7>F /]z7u*[V_hzӿB1ZʧWBu/CB_i>=QTOJ}NEEH`FaD&xީ(Qjcs[M^t͖~wR*u] a]G2zJݛ8pہk1jktPGoTg=^ėI2IMQXW*_Y@'L:]tV4 d=SyOmMl?E >T_eJuG}&Tf;{?*'>̿C5$Os yީ}~E/fZc<T.^t.]z&}ޟNr:lY/MbP֣ղV/t/*W2W:IlR|߃~cw,&FWS{ow9z(W*|j~nt,R]=JI73 汞ޗ{4A_&azt/M},hv~J嶒9i4)ّtc1SK氈W"9K- t{ m!ǚڳ^tOz/Mk뱿#^K4kڣ?guoml*%ԽהH轩A-t0~pO}#b>a\ C&uEf}a5J=WOFH"^JE0X%& J.(JO铮\QbRQ/E ۽{Tn(yCzA_v `v {DQzl շz^9xa[|=}w0ߜ(s$۾t=?G=T\0.i~`p?z慊/%?n% k?n6Ry,[탖N(|I[䜲MD5۔YhM|MeV1PgToMo9O_Bm夃ćl3F)l6ms6!m26) m6!l6u$F_Rp?mUxJ_hl!m<{dkqmmgU)X  C@ F=[?CK7el~ ݨD*C[7uEH[W)iЇըD(e|I H[GuDV['лMRA:#d3B:#Oq4e뀐6IIikv}Cq4YnH7%~oik(9 m gf+O4VV MI~weeGe7JPnulT+ȶ!d!s,R#mBs! kgj'8oz6m=!l t5BZ"%ReKF+]K!t-!lq2Ypl,!))m!$ysVSHe+P6If+Уh\f f+PEBn+ z^KֿO^G[{T^YG5%^D(CFǏSHa=iVKzgzF̛_*^+֟1~VIh=` [势;գz:k1^5m] tURAX"uź!:pe)D{::NYN@h:ѻTE#/070JHDk; 6@h6k} :YA5k0FskmN!T UB]ZkCaPV;RXiMK̃b4'њTJV ۭZ BZK 8Bu[%ԧ88B2Z }#ՈrVi<ZւHmb͋Љj"twSJB𫧠G%!?2 u[ ;:qIJ>JD(c%IFsWI :u|LC@+ًu9TJRةHE#:B詳%)1>UGEƾ#:BRjB&]ىjJR!H#Twj/B"}U#u:!4:WJEb%)ԏY!:P'ސ5J:Pw$Re(=&=!B@HDo=8WI驉LJmCa!3T 2JGh|R&H!ūɴҼOfz&#ĥ,%!hRSR^M])|M;B}uƅe{cRxPH,/O刭GѠ[D F8gЋT=UuM!rc?QB&ZAjU!U2B*;IeE7("rgujq&*=_JNM`#@T*!6UU_b3RM@lA<ħ[+TfRzj*QEOzo6J|צ>TBnH\{K'w-i8ʙkl+O|*QK[;]UTFnc uǩālRv|}63cWJ]hfj뚦2هSrH|6q}0?QUU0RؿTET Hu޼|j\BPM0n9𧎐7T7N!Dq1H tGCWXHAj%5iHMCQ3V̈́~fcRY-FQ%:U8%]{WANuF&?O} ) ȣBOѮ^"z 5 kJw<Bk[E32~h 5XهCd_ }P!5)}τ֒²F kkY}[ YUJZU 96OV{\wTXkWv2k]V=Ry!w^z1RXȫH amm')6- Gu`:J;Z%ۗʱ?SdsuE,SC.C`*ijkֵ"?nDAfjJjAiqߓ"ByiнURtZρ/[σO[/ڥ2BtZ/C^`P֛"-ȺG+O?/!X_mՄvDzH~Dֶh-F2Hi+t] z R٪!:B%շ$TW?Hi-=[<`[R*զ&}X *$[5 ےuo z>hs".R!e>*[}iWSSz~*8$[7dhjgoa@Ym 唭J6M|L}{(Bۆ3D=g^;׾s'{r 7ezoR#,yms-dR K^(7ڿd7c_1So<"F)hYlRUfTTӑ6m=']\nD^_)?w"n-0\Bs)۞^IzYgXۀ@fp3#l#xET~Or"q@<ɤ߯ឞ^ln0 Fd Ķ m?ܗm¶O {ĀG [Dh{zp,2#_5I䛶ٿ'8{ Ҝ_ttk7d /v~ ATfߗ56E^JuV7eξR{ dlt"e"sT;E?ZcqTjF9~LWmQfA^}?6QfɃk |rYCh_uNZ%]7ìTI7IOҭ& VL%v&I͒2'>ۤIsWIrܤTBI .Ijrh 2깍qIҾ'X욤1՟)ߔ YF@veRHqU]Dos V՗빯PK}>g~_}buizW"^աRg_mjy_" 9[f={T׀T̜]HnQ^ !g\셑:DQ/Obe]\boʭsvrzjZz9T"꿷Vl/c{NZg=e֒}=*!oWЋ$*21bJYR?neX-y{m t=lP%*Aa8[ g0NY&2ouSsS(L,DH˒&L8iܶ% e>h> Rأ,=s6l\SqdOř݁Ev iOhMew&jtE:e3{]#H"zH e {_Idۚk(+im՞ s!>)ԞZuj>Od=`фۖӎ~u;hٜr!0o*aw?Wi>ؒtNYmYѧJUK2(uJ肼 `KPZJWz|}3i*g{TB*} NH≣X=/P[\B[S=1^?KGckM^bD13NLM1|0kO) !@Vn*~;s*~:~<^^yT%{+Z GkgsTx/W]kx\Q5 V^ŗSU_BAHt?ڞS ">]F8ć" o*c{jWmEignU=fB"j_@+x0atSԞWRCx:>%>7@ yrr4M.M/6>]wpE%1_Y*<|>Lb#`*n:v̸/?$*vQ}wߙWVLs䝓g/)mzڌ͝>Nŵ? _ÂT'-Nl :3ȭ]w;mk}zf̈=T}Q.׊wds5.NʌڗD/y./ ދcFLg,bcjW[ԩNڬ}z R:k=z#4 '8z&=ߒ )k&\!S=i7}Kx^tO]IGߩ穽Uĝ&:΂[5uojoe;e[<A='ćUk_zdKd>׵+%Ieiu*үD~J]%'CҨ|ӖQHg2b|Q^Wbs̳{30gdGމW(Hh桼o@nD6gT_ y[)s=> >8 4dڛZOa3~sz^+_j|%理ihuo-} -!\ ̽yN>̣vּ=7C6@5b%Sa:]wc;r?{IH>žanI{m]|>L)ZJ?Ss sSC4Wd^ͽO;ݟ|;Kw>l慼Q=ڵYK5Gk@P!-s&˵n \/--pf`O} wZOŘ9ɒnR[ȹ8<3_e:z~}LnsGjfC2۰z"S)Si}ujXD,ل_f`&'΁ƒKUnV~>_>]Ǖ[R5~(O-(l'_.4G'|mSu o1/|^d>&#˃Q?%;D/?Bo1\mː*V̿h7>$e9 +1ݟg=b^3/e>Կwp|;z^_Db~}|Gy|k*`0lqvz\rS\㚒^स\o}7.+4^|R'r꟢dK@jූ\L=_ni^WTc|8C{v S;l'vH+:88Frr_AqGB;uwǕBtrK߹grtC\W0D@N/ [a_oco' Կ#}zܹZb>H{e(69D y\o}>B}؍p{޷;sK7g;&񱼾O/1>/;gn?,Be|?Ӯ(vw N_|%_<:2SZm+Ꙏu?vφ<?sngT-õ %^?jXbOJ@Iz}+`Pe-}qJhG׍b%4o+.]\Й޾ҡgvs寯ǀ=`6_ʠ4#ޒ*SC~Fo X Wnà˺!Уo.hM [8?NdNRo'9:N?3d'l۝TG:} 0cmCε}&ϓ;m;T|H: X-=NOzS췶Oqm~bkBo3uYvjL[N⦆┘̡ݧ 5>D/ ;9yKQ;5T_%ln>aljՖ~)7Qpk#(mĉ-!#`T_?U.3K ^}2ktۭԏF٨i4eKT_8YtI4fD_}{3 !vmh:swlkԎy>.~o-|ƭ΅-d^Z }z)Ư}k늾ƶŸNzc?ꋓa]иo) x 17yGMXI4 'ɖt`jۧ_P_>Dї#G2s`7!̿?0]Au;G:;ho4P6;>Fuտ]Q=zn>v729b Pm2#D!Il8wǝҁlg ELT( ^$|} Dc~J.;bI*.";?YlkJ@TNIN*ΤOe_ 碤؇*cԧ]WA餪?$UG$N/*'Nk I A?IT!_ pJ $X.P * [1}*vޫ'ߩ'ؗCN3}C$ޗR$kƾm_)𡤒&M*F`/z䁤blǢþT\ ң8RYLG<t]Dž$JB_ ge7F̼pK0*Yf7 IJ@,aJRBnI?`JM|9䪤B/Wg@VR+u }3޷N?*3I]z 2?]ܑsRWnw1/y}Q?=2+sIzKv|-{̷h}~~Y4_Hko }J/~ԏ߁,R{L!iw8=?{F)i/IDg$ 34AsI3 '͕\7}Kv(ok4;+IOJt##+:8}1 ¿<גx|uMioj6-\ʭLğBI&POxlR5i%HvALcOt inGe3PBNs<}5[7+`&*983*1v_Io? -8?@ggE`/-7~ /CGc߱Gc-B.qW?llp:,?ӱ2PU ٫bWeuл:JprWB&{E֏Q}^v wKn/BZƧ É^ T{,&{ש]8q_"{搜Yn؋C~g/:c/`!ؗ屏?y { g^l-?D&퉂Bϳ'IOۓ'sOdSoR o Ҹԝ)}(s^$*{+c}=>gU,;ey]Q2e/^k>c<!n+Z^+b}g>vNY%ߏA?W>gw9?h\^z,e >H,b{Y8^]U`W|`}^ =z==}*}.,D:8xm) z= KvG8S`"Ȉ| Ԟ:;X j 1t{Ci>qE2͙_x4:m84¹!I{Co@|{M܇v"{3KL4-sAks6>A'IK%3`Gτ~cw3,3gڧ^b/"' OtmR9_w:OEd}gxse]BŃd l> RTZL>+d^?T$/L  '= w\Ҟ2q{q[eW?Y j Y(K;>,p@aTp1kogV|'aLa2EF9<,|zX~ i9X7,7c%@0Iܸܵ^]8 ;J:gҮ' Dߟ)nSbc 9*.q/"Km$P@ڸzRqGu wp| {|_UEhZj?p{N^ WfY+  O&q%oXy HI̫&q8(7Oy4֧w}:D 2s٠t]郞 Z r\is"myMv TFAicp0W~Ua/ Qz#>e*  y?+xZ?B4뮣)8O pX棠gaVqs=y>;h7uܚA@|t9e83_4gy/p<@D]{Lzc<@[K>KK\-߬ >gIǝZp@,iQW6>KKʋ5$G8?PHE5 G<؋;Ix> /D!x+h5|{K:30tSQ|B?DtACflD|$}1Et"ߜ;8hF4DϠc Q8$ }?}|/KfC!)x7wwJ;`oA}_²I0?K\gls@0s9ikl8g>Skf+tl؀BѤ>M=ߓ=v>-a<4mϮ;P[ +q`]S]N[ +PrvBڿWbHqYە1uWvP~ ؐ/eD>5!lh Ǿi>@1$|K߿O-0d`xzq(BKq{?V|D]wv uh `>DaCNoql!#}>?0laag(q8lh8>+ 7|`u%s@[6xA}Ll@v7bP{_ DͲΆjg"n"ΐMp0co = vq?]BE,E. g+st:b^ LB'UA"tPF 0%ĠU!9L"m9IJā=z˜8ā\Rf`=78xh(`6x @$-{,j^SW?^ƭBVVVk8@DA{-D?ˌ 61WpVO46%j3vƁ^\2N^_'jy v <W)9,\Hbn{]±teGٛio!W+yS$b{72$4 >X #%,9f92˹rbc`->W]@:J1ԭFFhzرAٷ I9l~W _RKz7Ͽ1޿,+ٯIH|E`mmk,S>-[ ߸ ș;LT߈krn'7D?ç·Ɂ+>88,;_kTbyQj|V#? 5X#Fntȅ5r(Z#5`ak ]^m~4~ދ:l6OՖ^"홮c؞U]L%B|R0|5"yuͧ\AZ BZ|P5Z1Bu|ġ_Wg|=w ] uJm"M;&U]79~~ڨϮGCh}|v=?TџstQj҈+>}Thm2*[~nq*_qϮ St0 =3nڐcXWNh9NcBLZpNu*SslTB[M:G׃TZReO驍8UR fojV [ AcPFCP*fھu?~>-wy/?v=|v~.*=&YqlnT:[W~74-"[轋lѨ¸[}v>'~ASB|Km 1-c? A~*}4OW'֛|E堗U><ěN7;4L%Xv͵?'7 w\Ks}G>NX{ukw|զ})#|^0OJ [$J|./&>W+8<SW SWq/igRW#$^ZDRq[*u=BJPR7#Gf>$ubn@:u0PE5W#MJ* IRWl@ϭBi{,?\j_X9wgma?4hjGk(OQ7dZ]hN+w5 K6#7|c[vjgSDPkbCz7NJ.76iT&z.v2}}oPpOFTYRk ךcy|xJJ-]k!MXk #Z| z!jE^Zs8/b*l˯5ixPO{x:\?zaw9*_Ni)<'*SrV"؛=E>yt=JiG=ESm%MHEOm<+v!nnN3zo yz)c vn]$=WXU^dǿrE=>Ɣxovo\L_,_,r{5L-sezNOFUʩ0b9}5$5Z?dXk LT"|Pkm0YkcW>p7*\-z1a{kJZJ%lڬj-B"Z]XxI%8WEHSk!'U9H`Pk6o3o 8۷|R]y;hY OI HUS!e+z']'JOm[q߃e *f?}^eZ*J)][~Y]MOe=?j_#JYc9EtxQZj6_R9bS `ODeQ7]G}ۜ)76DP~D !Fx3WKywly\͛N-}n}G>&Nn_^4EQt~`zdfClweu:zĘ lZIצ ^^+twZt]SYmhH!]Xrtݞ.}w O3*x|̧>'ΎZ9i?Fo8Y_U` mݥkG`oUOW{g2a.[yՈSz qs{0F,wgԯ2t=&~2,aX1lgl/֝2\NHŜN$= 6'5H]D_~0s\lZ7Rgifj7TW6nD􃸻3AٙvЭeTֽmtRm\y5n8w2!~f1a_*/Sc'HOq!tO`@^jЎbQ4ǦP )P6/tD++Hjz/e#=A~{N9'hʆvy6yL!ZyL4 Ҫ,xL8iew ;ps#ʙb{!a>;{: ^~ =okc? ,ğE {tŠ*л]GsIwB]f:_,L?4SVyw_XaTَ'<3D!~&:-p˱#%:԰/}~[=i @*rBpt19#cq*EqLc)p"uLpcӎWp~v1 F]A]%g)n('p^v|'9GM{Ӵ4h͉b *\鋾U@6CPGUt*Mф4NX"3!2E9@@uQ5[ʑgVYgH&FFWǡ&r9 }6uasԃѠdܝF*i@ O7h 4JY'uՑaGGcU үxnӌ38*JtSvـRˎ ({rW_r F۴9HQ9쯉N*ys%_iC~_Чʳ,:E9̙,#ζ,쨎юxg\ X N4$8;jHٜfYh*KGƱ5gԞpDC@Kdpv"#8 0E:¡ 9…Nazr## # %08#9B)ӡ;x˺ B&ZG L8psSjG~`uy\XGvάH G66BSW‘]ڑ[K`L3QCȏ `L$ǎ09  zx0RaL~"_ȉ!9;29rsXGndt ;10;JkJZΰrT9QA-qܫ|en%dwB&:G w$X B· 1/lvQ$EoE- 89d>-e:(y>OBr1pDC分ƖP+#/ glGYOj9 xߢj9,Ҽ)6]؁!t${'ҀpO߫,,Bw~3?6F1GsOn`[Lt·}OGK´t%G78z "t5"PD7|31X!!BCދ šg#3#c"2:& \489f̀"OÐ5/a]ʱCcؐOG?ЂhWy-_;=,shYgIQ)࿢pWR@X1/Le@geGT*7B43)_R!E<\!9X Dcq,@zD ^ĩi1C"Z92Ad|==CM*΄ZXO?pBky:D뷚'|ZpB_ 3EȿK[ѵP9 3Ej}bHɿkt]5>Y.S=Y`5jmP|+߰nt]~ Ol}'iPLrlN@&?@כtlױy[rln8<@9~IkQNEpӜÙv3"y 7hǯ-츀S . 6wߎs@y;8Ԏ3M8ȇbT3plcID5juHt,x|h;erTh,L ׆RW&QraY_/>$0=͏Mn~]T3hB鹭P]d&[OnҠ&`z?L~9`2P&&irIi/rrj"ݷ_I}E -1|k|F}OT"<49)?"<-1;Ax,J.u~vg/I=-UEWFz;)d!H@=ƾcWc[@ߌ-a264:A882{26l ^u?CxŬ*hk)[ڊyziŶ W`jhS&0N0P/6Fe]&xz1l]lN1&;<ɱLםac C@v~Lj0[a؁Nkzw~Pl0]?-/}9 ޓi8Ki7ɵȇ]C0c/gB@ѳ)i/^\cݐ~"#P7SwEZ`qzJtƣ:#0 TϑoRyu&ZGqW@ێD .XG^eÑ¥WD;i.!kw;XYفw%Yg;u{(/P=YwنC},:4t<)x*l1;8bN'ꋥw͖;E;u6!|XB  cǧTaъ~CRݍ719ȸqҵ0F=0vw aZ6N^XiYi=G%&TeT;%WVJܑʻ+B Bd7IZ(Z6/Z/ՍnlB?pB5O\1|4 1cSmŚj)u5t|jN׍0pO,:yb ; nxSùfIy ?c0dшw.=u(wTȰW\x :zTJ>E_N0O%T8)'~m#3?'<@ߐӆ;n5MB:n6sՙ"qF|cSeZk Z ?POŕVO㨄"*aԊ"tV0T' !ԞwaI_-0CE:ՓK8a/v~.é*d'BK~Sly1 f%(wU_;"qE At[VB$@-L-B%8c~ aْ}K+$&Z /Z1jQ0i8pg8>]{fm?pCp **DBD44)+/d./ [I}J+G64!!4ieZQ*qL7hZ{G7o7Giţ?z hgi7>%;k<,NH0db` }rOI:J,{RnL=EIX W%/M0J\`bД+͂q,p,\k0$j,L 8+Y_E1 RW=z/wXE#|%~zAjlj[ןvV8=Ar4,l .cpY+sa CY oL. "s`Q BO /8+A/`H t 1PJ&+vοB{Uv+pĢűCmP8Y !JVmx[_2PPKKDpz>/`F|A./~5|;Tۿ^GDֳ%3 [|a5$my/ fR0mQ?RP^nV* (Ԁ wlN@tt@Ot4+] A#qL{}!ߑcOZ*)R۠^u+“m}<+0%]>  4CI?x*sj^} ,sQZL? a?1AQsH1FFN6 z/?rroaԏA2S EC'Ne;lƞ@({qrP B{` ]l8ƯeJhQ`+g@J9wsD'%|ihcQ&mK"hFb((!2jeIQ+>o@EcڕL8פg{14\+ZZ)RlQvF.4%xWO@ir^+&ìYiA -U_4z.nh-z_蹒@iAW2d_dh^E-Gt](8"iesD9kpR*P+ϲ3E, ZY۴mK+#fAGir+JV*@ioUgee1Y~F4ZoZ$-Z"NıZ]Iu-h.-NjL ji@3iuX񫋔}S˟{PkU9fƣ?C-+dbƱΨYᦦY޳o7 7J[Jw6oU! }YPS}$nAbH9$/Z r}U<:חңҲC9O#^ge{ޣL ͜!ġ;^^ռRh!{5=w!F̘$&üTZma_j gsG?( }]h| '`b= yHP "!ˉ/p585UT/ z?CC_ F@?1 RZW‰ʎӝQE$rwg==J >/pEO$zrLX_sDH_!٬%RϑV.;L7ĤԺ ]!:QIo_/;1R Rf< EV4PqE3FB ZD@1=`| G=[8>_c;Á6PCEp4 W |@ť_AK& ^"g;$H:IJy0lІ"6T֡iCF#3> qAi?Ziz5i_ˑ o .ܺo+_emSk:%ݷ}?)TlnнBœ-T<C[ҎqR8EOm^zBeoe~oxZi}>FP6$$~}t.7@kdr&D=h^u RZ},F8AP겲Hl .A/ 'H\ۃJcBE1\z> L\<~x1x{Hjm\ C>.m8Mpц,@ C Mj| 0\z8*EJ[ئ3A ~ "xp>GXxLXp lsJ hxPӑ*m4QXFm>|s, D/@Dm!pZ}v1| Ţm.C>hy/-`TDs<6˙2?/T6ܳJR!W? ?=!a@ +6D`(Y5#T"I;T!%"o!7q"*N*ZfP9 ,"Ca cxNR NaN P'9/T(TN~Bx*f"ZTP2b]vb"%/s217,{8ic(o(1kӓ6?Z(8i^aw jcPd8j:bX`zm]֊ִZdr wrg{@*PKmMw~6B}qv*>B@"` .xP & B CH[$[cDbqx#1!r!D0mZS1Rv\owVm4d|lc!n 'vzo!k[*>jxwj:D֗vp|IÒ$$p%"ê_PKS~W1iXcmcaAma4~*%13OpĀ[li@m ͗ ݫeCL[+4+E[/jckF9CG4➭mb;1n]ޮ1?cկi"vD#vEO4ܺbpF~ ɮ[DgxjXD;+ƐrvF'khCTQ u X' oQH- }0?4Qwj=0PPB‡)4p =%C 9 @M!?(A@' Y-GD<y@+ & B# GLٜ)B"E6 1Nψz0O!4~cig=mo :d>Uڅ)U1n^? :&^cHt!WS*N-^!XC(:d$přV<Sگb%JHB(K/!$s$4ྫྷ]Do"O$N]3 (2IG[Ug땘XeH0z"B>w{"b( ?;䉨صu %٘@1"ͻW<A۟}ɨWi7]vydVMnϏn#Dv 1["RgBctJ{xtl7L#iOXQA%P"eCNuCIvAI.8`"|GiH}˺/0H=d;Mc{AHVz,GzD b,9~ V|=nppv5mlܻ;%D/۲;Y`DM5Ψu4 MXhC9*)=/\8`3@q!3[pǝœ&$pxC%\VPuA8wDn< [)gӿWk>_cqZ6Yx'qI=ӊ/zEgZDe MM/7ʨGQu\ӊWBXĉOF6;!,W7g\-g5$bcX0߳j+ބH"1e+]D)H,V|abe ,Z!?0=Q삻I ޽,&&_S_YB1_zޗ,A$HHM  9O U$G`a d<,F n+W*v 3@ngqt?,RhúlBn?;*o}f)O>ݨ1E=d7&=t +3! ;al(L$`N$$g0N(il.[C8ngrY:/Kμ\/?/$)oθNIa,k[rgwfAx?p3']?8b<P{,+ >O'S=/)7_7gV(lșWJgtD(Jg8s̉pΜpdpDH#g.88sř \;s &쭨./غu !`\<Sמ0=Q? A@O}+%ߋl뙩^%96%8[M-F;udڟbᄵ;160fǡ{H u@HRSkY$]9h>_RŚQIYؘCqfÈ3<x² <3A*!@:Cp E6g;Ä \g0JAv;8G[.lէdd*Ytm,QƊܮ WfA~K|ψŃ }_$-3 m K4²¾ 零|<D@*p3c#n~AC~>JrS+xtO>A-z8`*%|G^GϓՃ-}K\F~bf>T .T|OTnLٚ[ E'An=]ܽbO mPkǾ-IWd\E)#@eOOmb26~%qߚkn\F|:?ӵ(4K$`O ړiY'.gy0M r"E:CύF|OzsLMZ:0oyz~sB <T}?g͛Fߡ2nt?OЗLjr)ΏdgrnϭS!Tr)TJ4*0o~bSE%z$Ӳݗ5~O?_/p+&Xl 7GNCoy4>~,*9cx0 l[|Y&1?*$Ϥ7輤؆/?Beh{lnAh:*E^?6Ȼ/&%rE>/|_ %e!c6V=#`5{B81]zĆ6TJHzO~瓙UjH։  rd8yX[xDC֫A-ĭ p; ?0 ំO.?Fz=ԎX||?$M^mRTbkì߇PI ixc GĢ7HBü6 noMrAjVV䏧~2hYn/Nx~`NO _ ΉhA<= lA`DTE^08`7Z 0VC & $wohMmnL(B3:yw{|zi~>`OB[I>_? Cf?@K?=/E;:ɯ~! |O}yo/$dCSJ,SE7-NP?[m*щk"w$~AĭO|$q߸3--l;gg*ߙO6~E$Z?G-Eg|Ja{|"D. ^f":F{H /! R2wAtpDJR@0Q`ޒ8`?^"Q FwXo3d8x vr;GeL<=:3B~3#i@~,4= "vkLd :5}Fl$/F7uFP{$R{ []=MbH_*y+ @r@5 yt hɋU@{ bY\6ly#^>/_VK@hُ "H߀O<7`_2D Xy ~/ %+x9Ϣ9" tv=pۘk3CehؾA>oķ0_$A rl0J$v?_ s5TG/_;A\L 3F"q ّKd.yą ư򽅤f̜YOX'?}?>?xUW?zqRxǐ.R ECqw' KΜ{{"kͰγ6 ɠA(;"CP][$LN9vSǑt8*7ʗ+>=yy[^zk;P.IMY缀;4@ :;@"Eȵ8eag@. CŁ*PS`q\k <>(rM+Pq"Х@CE?h^'P5*ǁeq5`9CH`>@!(t}VVr.PE((P"i\< B$2d{:H(Y ]E!~#?6B"\stO'C/QA'rȔDMݯΧ~¿W2ve QGۜ9rKT\rt=wRj. s 4bf3]և~@Þ坆ʓ<} ngoRgp\*y r^a[l'qKUYoޗo chRs䎬\O;Q;ߗL<8t9x\496DxN&s|=>|q?#+W~/hGzKh]@n=>rWWB|e ~_W?S{}`}{왹׌V~Mq,ܒ&!NEJŞ v-z?LJn#h#}m$NMjߚԿ/4·}r;[ ^ y'ۭ:/IN{\soȭ+}GőW|[ߺ෾ G\}H~Uѧ7W>rg>e2Sg!˜\Źg VsA_9A]?O?A;ݱ9syRdbʑvLz=fLr={l''y[Bwţۛ3 Ib:7Ӌy?n'قo̲fٽmn ৻r;{/nHJuGդk$~KԭR9ɾsj$tIvr푱R5MJzd%yK{צ6iR>Zn6DW[N okRC9(X4b_H|G m~:Y#NR~7''W,?P%"o4kN=iÝIwazz},~rY̅1I.u]1e.{.3`uy=)5vlWKB܄_s3zGi\$wy6gzӷlm2E`˷a'uIg`?6 G}| $x~woc՝{齬{;tR/T A覻#Tv")oq˥4/DsnAMnz]t~q]wt9S]~ڀIc~E/.z@P:nϵIMrnwAXXvzY~ /o^BOD vW`/Ot;G's6) 7Aɕ\'aOui?\v3 ~x{s3O<^9AJ;W(Y) +}y8?\єNܟnF%eA<}Axg97hdixfc~Fb4o4NDbS|: K`1S{bZD<]Oפ|z;S4)ajd-A]Ќ+L'j8[#-#8z̅ceoOS>J*Bϲ)vM;Fr&%BMWoL^M3iR,?Ork_HIqfhR|1mriFyF؊` }R^#Ortˊ}jRw>JwJ-&es+M֤ݪ|хTn-lZ&e_~#|ŨI9Tr_z4}a35)}w\]zTDpŸ˨|\q/|2 ;?5jM[jkRvjFQlTN}uJ&~}yC5|Uq&~_gsMTܔJۍ +y/ ~s'*w: [_jS&~=U<'4M&-{?ࣉO'Em>kz-r"xpԟ<5OR~כ NR[zGH{0=k篍K Mֿ>?T4)+8ƿQj3j]xXMF+ _Sgr:JBĔh^?Va&2s<˼T 3\xb{ZKۼp,gOnO9XoJpG;wk §;oJjnm>ݍ:Eiދ.pG&סkRs=^^MC\Hypo(~C N &zKzTOڳ>;tS4_'G]}.NZb6Bܑ[SZ3¢4[Kxң*Z[c6cZK*wيjOU]E4ݚ3د7AKl2 5/l!xnṒWm~a &Gׯ)__Gzq#*f%Ƥ>t=Q[{7"[53KܤPa=/}v?P΂4ރd}qS%w^UZw+oN)i?\]b&R%4WY, 5궪Ӻ\}Dϵ\KUט<=:m8NpɁ4~ێ{ 7w{k3?y|&MK=x_2^S?_& ħ^ {JĿmKcp&9pOZ]A}{4uA`~ԔpSr0M|&KjPLLM4ywX="Cӗ_ | 3nWBpARR}̞dPL;# >g;i4^>O?BfK .Ceo&Xj"(y[ާ+FzY—tܸwtCr?h2?]jy6\M|a&6PO_/>|3&df1lſ=)c%_7.QOm?|z0a+Nm@ӚNk<՜\swh=}~"B;O?;wd v?go ?y|^+{r"Ih>_\e'_tySg/د=@$毵=:J> }˅wG Ɣ߳k?(Mu~LQ]xx_.Vv=M5׫>.tu+7d?`Imteۂ?wߩy1i>BCjgLJ<yt.]FWEJ!py`E #mǴηܟN3rsXiz|/y&\A;+W&TM|V |f>; |ڷbA%e}V su[N6|_wB?0/7~[R,zf':F'O}yvhrRIJ1%otEm6~4O/]GO;={=1#g ?^%3oJv,gY{tWiՠ}}Y'_~u ˙g3~Dt,: 0"KY9}wکX*ķO2_%|<|0"[Q"̯XErJCZIۻQ$g=ФcW)i;g~u&9@w%[IyH㣩O*U!ۘV#T "^C=cVMsymo*4_1]դsk<)%s/df_H¡=4)_4ηˢ/ȹ^&fw5}rPzz>^f`/og):7xbF멟,g!I OЮ'(毌$c>JoN 2Fu^#T4r;upNuZ./Iݗҳ]H]E+繈~eޥ\\+w!v@ӤTW>&Zp^Ou;u/}c=@/!!y=D!zLϽ(+MKC9GW#)drc~ra_{jĎKkE[rEo{%ݹE?e-e L>A~?8%+?#}qEr'%&5W9}I?_~O_m?'n_H $!/ zHwJqB;pހ_u?a@@ =bG 6P9 i{XBq(PJ $Ҍ><~^#H2,U]>(Lꍁ[_us_W Z=ArO0(vˈ$~A7KwT|Y~5w(A/ tE]x(~2$ʀj%JO_\m y (?ȍHG8(]_6_?E;$~9RRI ?kjK??gWL'u~q|%Lv?#_W+~Tr_WO:2y I_ #f>1GOAk\⿕+7S$:,!rA=.էgEN9C$vWދ=$GW(o#wKJ~)~,Wa ,'Ϡ϶&I@WS ;tQ"]"vzw"wO]ދ=EeoEAMukyH mȳH#}T]?)Ù]j+_DǞ(hOIkUޟKg'"~?%1}0 1~r/_/RNp? ܏?:n…ڗSq_B.C/rek?❙Ѹ=ט]啬{$Y. X@]<7}` ~zIZğ>@S8`?􇿱PiGHo uɺ _^܃ Dr__S i~$ܺ{^~9E $d3=dfGvE}R}?Ǽr?G?}F#>#>78rϏ3tG3k}&}EN ?*?/oďO#?t~9d{/r]<~e\W/?$ǚȟ JU_ɰ+~.i|p8˟(KK4RLs4.5"abLp †s8GoaMu+pV  2FbZZ@:-vlLay+$_ 43FS>ԡ"[iq)zQMXȴMkǴrLٴL(̴M*մ4ټwf^H;m2`e,fCq\mԯ }jb"1%A3]vp@1klf&tc AOH`.xL48tL7.tI#M79 n#2r 82Uo Δ.>M綠H>i*4@h72mz\ubGzϠrG1Dtr=Ŝ h.Yyb.c.,折_sUDU7 ӽY(Hd\7~jOtT:'rry\ ͉nD/X_@NI$ B:󠮟7B@^6v D+ s7iC8< úV\~{;P4(7cV$nLw;[4DNmw Wzyʆ8ӑކ5V3f6m9 Swॹ'zN^4~ ͽ9?WY>gi7}O} Ȝ@rHg!^gPGtܔS{M8܈Q ܀7 1͍yHankŁ8Og\HΡi# {H;=9= םRr~j ҈pҘ; =9֧)TocƌTg!&!1ڧ *\C]3D EsmN+Mگ+{d3CZsq̧$774ܘ1r͐ܚ׍~owDuk4] |ܝCzS?{#0 :1,Jv!'=4'$HNBF"Pys,qy}2v~ԏ)h~y|NAZ 1ρa1e7ˑҼưyhlXHmbJoCjKv4og:Eב#)iދ@;oN=*ޟ@ԿS`O Hb>K?|d0$4#{3"ž':}w7˅Ϗ#<| ٶ"} V!YB;#=?"+K◍O5/͡}1 sa>%G(CsP,,C^eA?q9#D7_ }zx@Hd~{f]o4gl$y_<:pC$5_~&YPB2_|m>YixmFIl@뽖!Qk~ʼoͫxy ?\~_ϼDY"tk)Zej^&tu@jջOɼryo ;ٳ޷q1I:IZ'Ie \%-+'Ĥuwy,˽oGѸ,>]nR>2{!q%~TN߯s+إ~}c{dsIO.ix]": 9$VȫAx`+Yz2EP2^w,j :Xx~(@ʖ*ROU`|'@ܷ߶hhR?û=EqZkߊmZK/-8Y%`pdC"O[$Y<[^d`E5p=QR%d$^$FMHWK4'[ a@Ñ[%f뭳$Yb-HuƒO\}ټ,g;WK9͜4zKA҇pΆsG\*Hם] ئ<ז'o,O,vyo'iJ,ry P򓥅쇖c,ejEϝd;?#y Kg Yua9k~+7j+Y KOC1ADdXқ3P{ۋGT>Q)Qre=¹ zK'L#%GH#mwܦLrwEKRdqO##'ﰤ?G644?50I8e(J-CYo@6Lp >|2reЯe]Qxmc8􇖱if'|d$y2!-?J@I|d;;Ob04Iw4Qi'u9N%;,够Oi\qLdb%D 3[&IzIfrd tr[i>jz롙u^5$<9-޼??W[[ς9-z~`xCsfOZH J͟ƅ1.\ɠ>9- \0re.˗lץ\Jvr++D߭tf}$U[ǁ ,!w[63'h|3of"r&:~ר*/$jS8g9o~R's%!=,d?d>ƁiAo`9& \HҡfeY }й$!8$';-^ =YχJ'UiK"3X׌r^$x9\_W@]y6㾴jqy%<}.۲ޑyt$2`}}D#7_Ϡ LT}9je6nj,5YvC^CNF|GJ#XM#H 5p>ք\bM!хUf5NYVT :hU*uZW#'OzitԪc GWa˦lk58_fwjZ k-OUXjDoP;6Ibq:b=+_zok=CX.5V|KP HQHlUYy" ?~f 7;䇼mKNg ۽}/vkӸCn&y9ͦ,~#r[kG•—HZ"GBBG—'w3{WYBΥ/.r-Wa\/%e?$_\s%I|svS屭W%z}sҚ4WޭAq}ׄn_u/~Q$!E4Gy=i'E8-G`g~qd{ *9,뵨8 لHY^#-)"%2ɒ[IE`'\cT;;inw<!(ryOQa\䢤S%Iտ+rNhwh~]I`6rA݋!x|YS}$E֋p=7[Nnc9Td;A-DNZt_.,^23 zjL[-SE1UeS$9%uCԏA"D2ѫsL?$u)Ayvo[HBH4di8X! 6#&zWQ]CaC'Z Qra1 :^*Ib4[5_e-a??Dʹš?}j1~ _!% *"TWd޲YF+R*ޗ(>,',$++[J ?))YKR\D1-R/6/zYW Ycre= /z`:J%X>ћKQSX6"Ԯ 볨gї9I{NHeq>WWw?d%z`3!z9_ȸ]$Fab }?3jzau5?/o/b_ ;IF ~h|?[a&Yn7x D\tMW/%&1]n~-~tz35 ׀7Oː7M?Q?>?'ק]+so&zh*5lD_tttt34azg^G!vi nƛVw2>la}'sί+;'mĐ,ObMH_+O8_&Bn3(?2~M`}3mH؝L74}Ӕ~'BOhJyG{C_i K2`(SMe.~ ϛkGKL}{Mp$~Zv'L!:˾"zS7瘆.?v;59ri0i 94H}Ac4)'S_z ;|L]q5uvYSmZBiS?M^3W 4 Ss)`S5o&_6^y~& >8x3!3U'A>)jNկ G\1>br^ ~ + ĹW륩gS;!?GWއ~X zۧ~9+_R ~>Q} ~>?>F^9APA.S26RKS/M[zCNUviz7`o?(ᷭ`j_~\UOZ=za_[?R@nS_N=z⼩Ziw`_;::ML3;K{z6u^u95YƗ ~{n9Sw\nwSWYGn]Zn~vGu3yhn _ өpNS7ެT]}jcj]5_UB~SASASAWnho%;:vu:ߠU+SGT'󸩿? 9KId_Jh[7USI֩F}L}^<;jyrV~=\9g0Gj>gRYn$ŹIзbW=x0rQdϜe5R5<L̃1t՘ =q婼FC?gU9^uf,iDUOcyd}d}Da|av\\/Ss1?^"x⾖?<TwV]ʻΨ>ʪS[V;>s"7Z@c_}/( aW}_n>|pD;ZA䎊|NZPr cX4x#xUNjbI rjs?_wԺ"w՗S#sOJmr2чn;8:T3ߣ/H#qVG>;j{jw8uקsIcSv,w΀\)twCϭ9)+s?NΕQqL#9PK ^s,WRgN΄~I : #c%r|"/G][uAniCʽ[yS tjCnoS;zKwnAޖ}u2/eawR®ޔEgzJz>&f^iKErFYɹ<RD/pTEՋP/ ڿ.uzرkz^*zp '4s"z&4 9~x ΊC43"g|לF=- B._9,F*5dǮ^^[1*WwV¯ORhTС|T=C+˪WD.{:p}mWUTމzGqw}G'BA>~.r?/aoQ_OA} 0|'7SOr 7gp3<'))졦8כ| |wc{CֳL>3M7b*rSQ]b( Iy^yˋ#u&(8YD DOl-N֞0Y{B&"rNt־Y*'!kH^Ȳ)j׈NPpⰶ$iM-(&?0,}b}3)CvaL=R4Knw I!=}}L(4P/ zB*M/ %%%})) >(!M6ޒBGTH%RʑW鷄$SHT:CBbz|`Ap*=N(A0ZAs bo~!Xtj+|CTc*&k_Ye:H( ˜uT09Y!>U9[f}R0Z u )e*WJdWB/8jX'U 0XÅ:B| Uv ĵ߾;R>uF הO R5խtR݆"78t 1EؑT7AL7&9\%wZt#vk.ስ"9S]]"#7teĞD1S]Fo*: M3Δ" ":gz=؆K1y9tVo@—Ⱥwq }·nAd ? T̶`3uW.>7ݽW!&BzH0^w%8$tYÅd$JZ!AX=$YPJaC($z<%y#$ s8#䞞DCSA`>ErYn>ֹ8Y7QY"u1.)X#u1SB0n[#u\eu\ Zeu\n[( E]BWˆ a.Bq"\;[f-+2^ow~Œ8C&HI}nCU_Iy#Y_ %+{KMkdJy-),>ud]˔ rvDN Jŷ=9grV9M'X r6w|2AD+Ny۾7JVt{`)aSǗީIy'Y5sȇsس`мw ݿU)dHlu~gґ+%]`W_SŞ5%Eee=Ԕ g%2gF5j"H;d5JykWq; xNϛ5)+gRO[9AdHɨm߀)ٳdڳPg%Uh~2ha"%sթ!~dyɔ+3d[Pؑei|gKPd!YV2r=gO Mu'xm5%{fVΌTÐ ~hݩyc n,9,M>QlqЦbEAb%[ns*!:MnAڊ V ZB[qxيC+i+1nuقa-VnmcmZ#L6_XmS/ubYn*Z=3xqZ6Ʒ𒳦C[kNx< ºjG VlN42?YN3\P rCBA&n% 5/Qc~YC fbTlEm`+ :f+"Xm8Sa}ַ-/lylm-? all0_ˆ:a+휭(Ϊk+[ڲ$e+ n) j,<:VWVg³Xl1bL ElMӖ+ + 뎭Y6&^'Oav2זu8}M_W0XWxI'Fu! , KX9 Ji P}B^KLx 6u뻙+fX4)/9mAIk%q+f`3 r9]1Hb[-X[]icAIb(on&mi<"!m+[s\C5לl`5y=?Ck5:$4w[œL#1;KU$(-Dʫ_YfWW_e v*NWK9_QHy/grWIuZ џe5kD׾ ҟ?`?B, wF*<*_>\e<~/ WUˉa=e4ߤNhтͧ5Ul/ѿ(vE66p%nԔF0t)vtH.=xWaB4%d[@Fy6&#~ϓ4`%.'Scv(qcw<:yu<ĹnзkF SO7frJlFqW(/G%*'_c&;>~רMh_gʸ NjĞ {3%xuķO58^2_-5ȍڹ$)Wm U7p= Կ#ɇv!)6%|JݽP_~ *AGMp+DZˁJuꐾ?FHm l7r;T~Сu[k˯u=s c7KUb[~ 3Qτ5vFʡz9og@r91@In+wscOi7רZ?{}n{E"(^j qo阰q_J߯K^;sv}~5}v.5vI_\y0|뙇cA]?)]7oH4~O-~\{gýN\XdvgHH,+1vY@pK9A8bnN6?<,Qe ~c߇K.*15'g*p~ 9<ޟxpv#}.}R9#mWL[wh?{ =n=^s&nK\{{+y15Ճb唨ri3*a|}=kh3]8zfThV";j7{>#u[]sNo?N"9n~W؏aոҾ<~tښߵ=΢FI2]v_6{TV̉Vͮ'f?bpvƧw67K8Gz4W3v\MoFrBiϑ|tG# v=zez/;sT_1oh\^>ڐZ.>]E޵4[9,+3o4{tv s2?%~/ ]f>F|(U\0{~j6+cGxkS9G\A67/t[9:|@x~h|ϙQ1к=>|,탣'?S/>T 8 >|}cl>+xm+jczsxaZk'*Z)t52Y|v Mz/ZWE:I;K,~='jqEMfC~f;IqxF:`LpXϾ4XT.<3xsbNwߩ.8~_+-wv>|b~r1>PAF6}3&c> ?uM ~/##&1/},Zi?[1Y@$ >1{o7e0RC~gV'>r?ߓבi;$e7znט -@c|syb2^loO2^#iu_̢zTbj5=)[9"&݈>hEU0v΍oYQKcM~`8j'_rƩM?I?@|^.8=8GqԒ֊xmÉJU(p/.AwG+ѷj:z@C_^*?tK*Q[ {닡7>s`\QKy>Ҕ[Aϋ+lԄ vy+I1?%j$jи7D՞HU DTQΉPr[ 笨+QU4g/r-^~vQ6^%ʋoD>~< >]yyl[Jd(bE$Ȇ#2t`0=W7DډayxGBJ8oFV9*AȲ"Kq\t.TɑcݜL=>io7.K03s`%"n)O,1Mx c#C?=oq"H8G\@'IU"<"lAvD쨽zJgpjgM]]{"DOUy[)zzКF}Ov9|E1/P}Sb/kRRsq}qKǁ>E/T)JD1aD0;wJ|PEq7kOFz;ӛJxgYOw-i^U Lcgzݽ=&|0Ž!7Wey|Euwxj+;+ǟz*;Py>WUwsx7z=*wraHoE{}R כǾ":=|yzB.yRORkM]BU+>XL{ά^.l2oG+E;%u-zsY]hp1A;{ňULSڑ_q P =E;Ř5轜KCAߵ};%զX4_gCxxxu4Өx>R(ߢ/ц=_N*$ޗ>T,}_k2npK) ֖^I[^L6iP?}Q%W=rԶ\ L|V;~@[O`>K3{mi'3!834aLkB^4#c}9:azg|TP=7dטP?(u[[![[vEJ~tÕLm8jB懳vz7Bu68h71Y΢ډsVkAcNNCq6)ٍsv V1ur=g'2YˡѮa}Db6ޯ[T6sR>DŕJ0ϡDz.C>.@c+#|":#}+K3NPk /Mo|Z:W׭՟>BfCV%+=rGf]nm0;o5z޹vX]/C ?OnJ^$s?|@|>vz^?^|݉d=}a?&>aw9cK~>BS}o}:wo|zQ~%[Rįq~r S_ć E*uOé?ŻHt1$(Ds'񯼌o!ϐ6^= i8g!Ki=ߧf#g>GsgCȑ*<{]->jYj:[PdzrRr^ORSeዱo<1翼u*Ciw.WsL9zYGzRr-b×@Od_ޒ.P .2|>fl0 s;c.Ō4N7+#|'>,q>=ocQE/S}@WLheߥsԯ(iI^9 oDAa:FH~!FOٜmNl|̀z jD.y8kqG4SPvHp ixt}8Ed^\,-?gqKS"kIzZ#!)oL^$r"7DN|_3ڙ }y$tX}nF>o {u!gEsJK!EH>:F¢ EU= czD@/8F5==ETOOt^J|Vz?D 9P!z9c:@G,oЯRZFv>_wr9,'?R8OG==l*vԛM;ђ/t(9:x]rnte'*_C/Ca'};魿<3=j%qtmBD Ewa<{/c_t3!i]#-q.9ﬕw:s/JryS,k/<%i2_m43̇g0]z@}4~?̣Ӡ>xJ㿈s_e$|:w}ǭ gGdNt_*vbb ~K bzJ)~S'F}1%AbQ5~@1f~NUezSXQbjv. Hb@c_ߪJ >+1CAcHp>-f,_Yr<'vۘEHԘFXŹ'v,(J\~/R*1W~CƭNVⴐޑ~oxH$85}E3?@C~T`ֿw .IA3!Yw9zמop =)x O?xK~1H0T:=kӆHozz K^`ݽR."a""+ \""5nEb}ږ<GMOLI;!qΧ$/݀ڹw7911D3}t`i>=~_Wr*YGP{mH ~I_GNpiR?O(|mSa4͝zo79}В$s9g[)Luٓ~1bnO/5";䎹l6>$LX=-e"`~-}TVwg?f_ogxe&=">S-{`BW+}+kyQ}d_-x9j}:g ]9ѥǎ+W/q^wZWo;;\].ŵh=?W?{!KrO3>Sb3N}>Oɔv?ួ?s;ԯ/O_P_%QbpBECxs|H103z y*_*s70ƩA}`半!Cr<C<)5P1ڠ;G!Us P.3C! |޺B@ ՘.R *;UO:5SzU8(hJ2OU !lG_ g4K>5y5_^__<{YLE.TVVz*pGP5"cYۂ}ک-8{B>w_毹O}ZGmQb_u7E|1@yC͋c6 H`l3}gC 7^  g"tʫWZymM;?$3;< =P e5m ԦݨhH2L>7,=3,b:>S1v4HhXCy raՊMмfƻtȰ:*Pewu.g3 tʰA X~ʾ[ɰDbH5,yذo92F9@_-tc  a=' i)݉/vrw*ӽFd+zag#6m lHP( &сC@-A*hD2T=1$T1yp()O,oP}wvAw /(LiKR_Z5f,U]qy^~w5y~~|n Oѩ zP;!i> =OJ {:<}[td ~\=}!|!#ytwu?7|Netj0lWŘ y>{c|{1t=/a;^puԪ1/1?nA' *.ZD@|cOc\-4E#cQ$Zp<f,S yqN1~Uυ3 Bl,do&Q>OC<c $X1U6c)\7A=c\7A8cY_X)Xv0cEHa jB!+%C5S!8#k̓$2FqB墧t/IEQ;U‡D}v[ wύ周XX~UƊE9JW#cmci65F" $:5G/cHJ? ~J*o4ߠ?{cA7d]6V#H#hI,w0 (U; oQ{X}| =uPTN1Rn~:GĿ_Uaa`IƘuPnᆫH\aDk0Fx DO1<ĕL#\2<•L#q\ Op a /T /qT+K9 o ~b SSАLDq1d ,{\5ET[$r1#!J "FQ=`$|<82E'h4|B:7c _-XѨ ~ 4/Pg`β}эwQ9w$l1zNcby?9 W7}u~ms }˅s!17htHBZct$yp86}Aũx=? y8#g\u7Ny"MӪ#}7 cӑ8C?["8'@.7n`!4nD`X&vgyyDYtӸo?h^ _? ۏ !(u*F?iO \D |c&_0$hT%P~NI[!;Yv#Zf)jQצ>R`I Rq-ojS6// -*TxSyD?%S)ԪXW*jl0WX^rMO9I@O  C<;Tnu\Qz6wvDأ$0h*g6$N'{NҙWpv.]91=?cd?cQz4;C'J@D'^?į7h7*}Ue}?uMA$ 4 ;l []\꺤3թ&7u}/=`Sd]$2›d5E2_~>|p~P @"VG8ω~?Au> =zyJ43_NK"37gd5?zE=zFDevNB=ZSQO"1zB5cqIv\d̶'<}b}pSܔu-q}Շc/GJ"WwNFb5zlk$L~ y\}+ӡV?fH`LIX9SgB?fJ=K\'K`W껗)J!*0T"9ٞMagRK"Dt 8gP?_\@x!_\(s /!hQNM}䙲xuz5#ˏ/# (ok_$AX!<{Mw;kvKے7 -kwWaTh.RN"rc_8|y9!>NJ4:N>ܨ`8!4ODž~L=DQG tC,E%],3b7ճ_~e?zXaIpTZ~z>"$8*/Ibcijg' L\=ĩYS~Ov<_uEN(9&|6 ;AN*e_ݡN)/-V9X[~\I8Y`FzWWRklP~a1kW%J7OkR+{R>,!eNNc?|X)kw )eNe΋CqA_W&.eUޞM /Q޳뢢{J3-_*Mrv/;+e軷$nzݏ,SPIqlD _ "s ]K],qtۄ=O 3_yj#ș V4uku0>Β*%ԅ92%ԉ=/+!vpX|Je5NT#E '$j'5zZ -tG5K V|ژo8VBu%+nǟU Xn?+ee*QBK1E l{_RB7(!Ogk)!GszG6%i)B?w%2J4)X _Xs <^ 5Tߘ>[X  " 74BC:R%JHG 9|cIcH 盖+QаfdNF哤?T#;4UB7+*!d{$;L icg%DwFn07BX\ƍi墄%ƟޘC7|hƖ9#%{DVBo=7~ S ǂ^]w*!t;L>0^i%d.{WBqJȳJ|Jo}Mod}|^u%ɉ1TdPACb>gfRUB"LUB8{q%D3{Qc'nQB %{J䘧S_PBx44BCZoѓo,_-YROv唐J|R!}' q(!sʞ^O; 9a=©~gx7Cڱx$. sHPy{$S0*7a3zwWB±/Cb/CBC2CHg2U "MCwD|t-CkQBNu֖kjoַQgPB ۪(F=y*ZB_S-=dr^ S[o)!4ݞ˴|Ӭ 1yEԠ6]] sTBJHGLy䫾j~-#R=Wk*ޱEk8 +R-ZFC3.'4_gXjvKjx\.[;|Tӻ)Δe8v#,Qكrsz7-iZH>bOR ߰ҾBbB7z}\oP=e +'xk~/| #K=cy >䭄{⑨=F哆jSv?*Wskrh})aW&cM~ 4lٱ r *7r@6<6O;_g!\:T_&뱓-L4a"=> "4y'7ZGfO<"zajE#QyA׵`Sh+G W r GhkiuZ ֊zkE}vzk{^i{kqrv |`̳vQ;S;J) =Y7T_YGU|v1/ծj.ibj?h<_ T#燩= hݤh,T9T& 1jwI)fAub5Vk/ڕǵKO q·|#&"iIzm6_moz2??< |F+QT wso Վ FtV+M]9S^gΓڵUi#x]Ƒ-K+ڥy_B y_+M ]Ev"PO UC?BH`od~//<$xtDP w9UyL꟤~hϮ/{@+^ᯎy:si dW/qMdY"[h!s/>8?ɟ"u}:]V3E#rfwVNTDcOQ?(7(W}9<#Ȗz,߬Np숪(J :qݰ_}=_JWjVNnm7l~|K7շu}dL}-}_)^2}쑱D^a}/=o3^8W腟?`⼮~}@~Ջ~\?-4"^?[ yK?joB;~ YiBOMg9YP=J)2߳sd}_*~%@E?7ySJ_Eb+7tX|A-43Ao_E_n_FBGcwAɂɐe&(똼\n)*rA^y|=< A%(ÐSG|YVa$RPUvmxECpߨC/c'}r- ?*Ԉ/TeOĹ>w%cT{\/@>_0PE^O!TXg$#i1{=ѿA~ͩ7A ϠgG3=>$lB7 NR):~e{_e} ~'=͜7!7r%ȟ_/m@ Adž >A[Co. 1?`6\o|6b I/屿 y Wr'A/ Ǽ9޻G9JM=z9_fO霄7֧~LԿEF P {yzn r>OBnp.77pn߄'mwf;.;үBoq>*wSy;9uiS)pЧ~~5٥}=΅S~.~6W?[l~ך_'(o:7z/<x4? GɞDGcM=^ЇE0XiC 8~s~ L?i?s_{IB/y͊lK(SODȫz{ ~p&$tn>@>4۲=񟶧j=; #NVХ6% [✯o*|Wcx84~$L}} E=~εO@ߠזY@WqUFzЁx8ȟXX?bwO}kq[\uU_"eWSw}S;M5 G z|>EGR/=e{\*x1t~$<'HE^`c^CnHxHxrX«I2( 頫.z20 _ > O'tJW ;薮]iteۙQG9i]yуǹ_W |EWI8Vrpc"xU]u?K ߝI:?8V]7;>~vwЅ:.souZ{fMjO;cR>/(enf}ߛܨވ9A~ngg3&3b6~\c}ws]z4BzY2uGO5 }v&-ƺBO{InMFAέ깿w錩3neJleMvL.e_EF@5+|8':W֣_&y _o"kh֤j!Iz5j@9n%MSϰFT'+] amlΩ@}69=/tz>+Lv[Dϖ?ttR™~#LMv=US,d%sT^ơg󱽶b'0".%I8gumYݻ K3!(fHś z/ab\ƅj\(₤q!.<#0q>y)₳q.;w#f Qf wN3g!qo]M {Ilܜ; 2|瓞Jjl ސ-3so&Ι97gޜ-3{sB<)3{so 98g 8g+c 獨Ar4?X[ܺsvVeV:¥ ,3k.(˷J[  8}{'ҟ_N 8w7`TZQeLzn g2s<̘rH ;Qe#'p3pY\r pfI鏔!|22Ot~I=N2_NRi<_K2vAu }vBie=&Hy#pLүyׁ_e\2YҏcWߐvI}KigJuosO)c imw}hyZ[ݹk\3 =B/vAade4/data/ecomor.rda0000644000176200001440000001645612576021756014003 0ustar liggesusers ]IGv-ܗ&)F(%hi؋[[,vsf쮔*YU-QG7fO>o0`` ۜtۜ T+U[/\4C?Ǐ?~#Kwd2==F#y&9_ XN4 |HaI_'6eZ>;oVm|o}MVkG6;yZ8E]DSjVeK?Cn8}vco']酧ngMw|m~t^>:m}w]hmE[YuKȪ۳Sglã1OGt>҅}|mݧ=WOic$ S8B=8G*կu*yVZK68 W&}Rqӣ}̽ >6'Ԭ gvVutU_3̴zRmUWcRrQgJU4u_Դ*W<1QQcJ&j3ny:6DW<*Gg-8Qq=ך*vR놶zhY)m'?_͋n;%6L_F UXEpl_ft]+W[_ۡ !7Uyw;zM:n<:^K;V* |xۊ l?خoU?qR/r}RR>z?Kv{\Յ^xPkevkjVvyv|'Ğ$o0ш=b-طk-vķs>C[OFœ~X<)œ{?,roxu#c7>kW֩S{7ӮV^a'^jEv}׬n"ݎ.2^=u]G ^ oG~'ZvCntꇬ " ۡъf;N:TnxUtvSn>VЏlIVy:SS]xZc7ډ9]֫OӉ^}^p{]n_[y~'tB't҅Vn<]ub7Vt: O ['a'n T7_|</ɗKKɗԵMI_-<9w)x.:&)͚y?&_K埒|V?Og_|.I{^DSR ,ʗ. ArR~x6y'7~ |rnJ-|rb|ˤ\D~ I~w!)j xw=+н9B=n1~hEૐmн c^?!e[!/{Yп-[kL%ȍkne{ r ht/g ܄\n&ƕCtr:M 9f=.zb}RN=>߄_D3gaf%W߅~M_Cw!\hw^."/%c >1zF;*)$ EEw Ro`<7@]}s巘_#`_Fw _|.!j;rػOAsõoH{tzv~NC{{ d2uI)yon=.sBnz -bK):Y 5{ e?_ļ^Dkon\|݄|rϧ%/Aϲ؟n"@߸n.Qק-п:$:rNb2S4WS 戏|}|zD>IQSl6R37Cy ~D? #g=Gn@-_>A>or\s#$gta]RNG1C' M ~(4_gO~<9yPnq9< <7}[ly#}ȏ?u2Ѽ^f<y zS_<ڟs)C }`ڧcq^S?}iy/ $F=QO^}A20Wg&]?g3tB?F"8c('h'P|9eM~CqFPO8GR*M?QO=c? rD9a֓CWa{p~8oqQ_|=yzx%8)'k.} x\GO;@yݔi_O}p>/7&+]S8!?V~ӞyOўzU.)7࿎z_#)?9C?~)~hߢV{@7'{y?:\~"??ү=4~9Ns}~x9'@wz C?~8 ~D=k#O#?yeYsLJ?r]gzwc? /%0MsڽO9|p?د#`$$~) |x.]<PP9rQ7:øq!;ޠ]Fs2;rvp?t''>=s\om ,r ݺy{]9e'dEW/ _`<'އhwt%W@|Roe|-m9>Gm|]=TY0'lEGSw 3vô3yOǡjʗzuxюq o'Ws^h'iΤw`m9^߼|x^>ȗO$=Iދ8i*,T`\P$w%,ؿ #\bժmU`L9~.?KK?Ե~n@W%B2#7)Kn!iIdgd$0qnX/DQ\ ]AXۂB`zTDhUTڔ0 K|5(B*J|Nk6|/l_?ǫ t&ǘU?H ߷`/} 6ـr**n,EakG$*U&>c?'a-g9_nJmXWf~MB,n ]XqbX.pȆ/AlE_,tx1(WeAMԁ(gģz]}&^ 5[jPKA\"*UbzЏ"&(W|1*ub7?W*"ؒmY`6|PUC'kAdr5M8oml~ k+A6Qls(\uɪaYV(*Ql\+y8jeezݔRٌ㼛`]i̾e:YRnUsU)nr^T)rC^a:Vh5U v5_렇7(pY,lX$J(,i幙*ڔ Cèf8Z/Dʨݬ-nq1܈-&5|_3\GH&آo>R4"q<_]`io *F2{T:J3>QuE2i|;<&"/ K{HtHoN~>?WQ{ ~mU2=t.M2̇@ǩ YcT{iYIJ42edah ͆ćJ((Mdœ[#D*êHVP"TuR^\,NՆk*0MͰ(Qn4k26Zn-ش&қ_jaJ-ӆ+\tJ~zSͧUޒVsp^?d>B+j ۟n+2 ![66%fv%jX+/\7@"IBL]uIbDC1 0PLFoVH/UM5'm%1]eeGyuҪ+<[ĴKtR]+x+l-_:5S f"RW GuÇV#JlYWc9gfxe_yGWUq^yb}<nEHuAŚ_}ir+è)K`m/BT;gՍ ^z6U1\& y'MlkkF ŗSr8J3~Q;܈UF%'yn4֍e+w-/Ue=g"Ya\.8 uk YY[ZM-NMAv6,=$N68\r|V]z@fFXw3/Gy.ΗsVS_7]&lrQ.۝1hX-uwV1tu9hwr.H9eBP>+ k_/Zg⑻U:䃺,&K*~?@"K 1@+Z(> 0j@HnyA<e%:Psjâd (~v]8uq5(.VEtql0kp}!q]zLhdZo3lǣ` (ҩշAc>0H]p3|/ ||Yus-(=qni(Վ_ҶUj*VR?%o[E\e\5?Oc{=H] jAy{ NN^wBu'|~{ܴЉj4އ&8Tbm(@9ڈ}kWTade4/data/rhizobium.rda0000644000176200001440000001632412576021756014521 0ustar liggesusersߎuG-[2 n ExiVDc/t?`e ?A\6NX׫Mnhw5&wo1};QMtfjXCϬMKwp`zax9a0`403 ^1i`0 f `K>3 La0`403 V40i`0 f<"1i0a0``0i` La0L `0iLa0La0`403 LU$3 LG$3 La0`403 LWd4okv5X~N`Yi 1H`c3 f,iGioV(``6bi403 >i`0f0`c3 a `0i`0 f `0i#41i`0 f<"1i`0 f `0i`0 f `F+3 f0 f `0i`0 f 40i`0 f `0i`0 fg )`` La0`403 La0`403 `#Ɠ0Xi La0`4XEb0`4xDb0`403 La0`403 La0`403 L` L 33 La0 `0iLa0`4x` La0`403 La0`403 La0`403 L` La0`403 La0`33 LG$3 f0 f `+ VZ0a0`41X:ɇ?~?}ǟmӆ^44ZڰӆAV6ZkAktZӑv:Nӡm/M 6xmi+1Ev[ݺn}ݶmE[-jQUΫr^eƉ.kNihڠEvmjp6ڠp'5t`ՁKt:^k0h/Lӆ#vA֫ ^FOQ) ȷ:N]LJA{hEZ;m8ѫum$w~qrH#C$zNwr[_+:sаIJIKyA^$r ` d@aY A/a+Z;ɵ,AAvxm'y/N kZɥ^#Vr's2^'Z9[9˼ky~/\I#4[ɥ\o&H.;O o}D'!B+Z OK褿Nur=\O'x>/ҿj./ҖHw?*>/ޫi`&8- :;~UD.vI.2GqI{ i uӑutv7uUC͘7j0oa卑2u/n4oq>櫮F8;1yw# >Zo=/aa{ф}s{_){_ 4qsz@z?}}I9}">{`/~|Ws3D{S {|_y,=g/9~SW~9g-}=aw{|{_9Ryx{د=/=! Þ9~Ϝs=v9/=sγ~!-+o8ļLJ/g$+dGG^#{sߊ<ۋHٹۑKIّّAonJvȎȎȎȎȎ~#CvdGvd_<ۑّّ%;tEݎȎȎȎ~&_ȎȎȎȎȎȎȎ+;5E^E^E-O9>!{޻}<}|ʾ1s^nmM#;#;_q=~h+d/Qv"en/Rvvd=y5Fvbd~Jw#۹'{gݎ}#;#;#e^#;oE^Eݎ~^#ٲlG۾ۑّg;lGv&ydGvdGvdGvdGvd2#(;w;#;#;#;#;ߴU ]Qx{e9/$p/Gy_n/'L#{@vdGvd_<ۋّW1kfk۹ۑّّّّّFdgWȎE>H&3t*|9Hc&=Wx=Iۥu=b:(AmrOiLYփ,^,ke8gL.]lX׳˒[(瓲g:~-T.+f7`Dqo|b4+=]'e׻=j<=βd+{}yȎ):&~$ ^[}w{zu^=F:Eϕ}\ȞKҝd~Bq!{}wMN5"{s);w{s#;";|s_ّdOG){L^ȎȾ.3 ddGRdIٹۑّIٯRKe^ȾZmoNxnّّّLt?W~u㶭6tkCFk4^v0HjXv6hNkt:NGv:^e`i ;mqx%nv[wҭ\oVmhE[-yUΫ W8ѥ_6xmi Vh.M Ն^tՁ:V{iNk텩vprN6z+u)J;=EVGiI)7h/ע^z ^>zNr=/#C.w}ȃ2wRINwr~+k^'w2^>o|v;[;{2R?H ^pt!T r hR0, z!腠B>l%C+y'ɇe>H/?HNrpS$%I$zM+kJ$zN^+r~+~w25量u;ɗzf+y#tKɥ'A opҟC?Ch^+:)~ N?Wҿ/e<^YkO/e^)k>1>6i97wZ5q=Hiia<ک:-cg\7mǼN;?ig5si휗鏼ϫyo" Ao)^W* QVy-URHsǝ*BIMC;{6 l`6 l`6 l`6 l`6 l`6 l`6 l`6 l`dt)ǖag{Ù/xv(x]U=> z a ;>;$k`if-8g66uy@2`l`6 l`l8{q6 ig666 l] l uf넍qUN'fU˯ ya߮6 l`6 l`6 l`/|럆=*l`6 l`]] l`8L#L#8gl l`< gl^p6 l`M=g6 l`;N8aYFF l`mf6 l`6 lV8+]_4R? "g\'l l`9W?^p6s6 웆͜ l`6 l`<ج q6K:9i6 lF l`>v|4R? j}ƜDFʙF l`}o鈗#~gm[m贡׆ h6a :Vmtӫtv|hC ^v J;Ez:i[|jvjVZTW|d||ߜ44wwe~A;ɥC `XB A/|J.VNr%|_y2ç|IKǗ__N#}__|sw‚Tade4/data/carniherbi49.rda0000644000176200001440000000556612576021756015002 0ustar liggesusers Z}ez^kiaWoj^8zzӰ}owvٙevޡ֦!(1 ѨG1 1A0S4HC}wfvD<>w37qwyws"ِ-8f$ @ߒ` A6+hX,$Ao@kܚ5^vMMC-fZ& ^{k\-`Pϊb䄭6@ jӯtW%~YU[@LL$sN ;yR*W-;i?>u$x~r\ר(:U%Ƭ+J*3x -\++MLp6m/(;~\vUf8J:lNMCU JUUكQq&DA]Afɜ_fJ)SSv "l `}Vx;D"2@1qme\|@Am`;P8h6J];q(eJ1gD9^(6Oɖ#hv([>el_W[vV"1Qq^C$2y)/AQ\,_jߛ쯌Ț+6LQ:3h ŮBDžGm b'C);DG-N)A^Ui]sҬHJۮ` ;Y2MDf"<X,#lp:c ;=pB>1aR)A[y; !0[` eQVV.Tr/0h v& {P8pP`) tnOlVjVXTE}vqr1ȗ p^e(2_ Vdx[fAQ1/Vp0=Q9C*q7lf|VG7@R~Tˆr~w\8_N0xN,prRt|9Ts,&$6> LzafJ# j3;$̡^-z]. '.]j$h4 hmZM%1Hf. PfK'2;TIevdT-vKeN$ A_/餡%| _&DGN%\PnHaTt1]K2 Zdh;zOtbf(9$ xg1LazI fӫa 2Q@>t bpafAX+QbT80pLp̄tjbD1Y^Xtj`ztuF0͊au◮ ӭ%+2e"t#.=.iBSa-ɪP'C)$T΢:E#LxF&*4a"$cHfZb1Yclh~ _)LgƲYKbX1XIؕA;Xt DZ-%3 HVƴ Z'z BZf=Z=9UEZCڶlF9BHBsQ]+U嚬bltM)ƆD|MZakTMeVF2ˈapo(5h@,NΫp*Ȩ+ERFwjUt%mt3:T2y9*CsZ6d.CYcķ#uVEP}< "VCau!&D*PTĎ*RZza1$u0EEp$ygY3U>3Ř{!|J1=*Kx_quё L[u`@SStQ H I>]1I΃y(k ~EC~}L'}3|?<<ߧx*gi?Ew/P;xG?6Qs/R-a{ysx>|뻝O|X>B}BckџS\Qs?/4W Hm3>S|wtZyC-oXܢǻվn$}㵏8FYzci\@n#t-=[<}$.uWg8ԨzRtɿ9śGwԂ>8㠏IY o)Gz<|m$/*>Ih>m9Z_>hR,dzi[Ǻ@ר^Fvnx$n[ ̑t_ m2Z+ ~ ;Joz'i]D}1}HϷI3$q~WJf\#-t?Tn0(Vn,η>h7wϬxɰJ5mogR[={j_ߗ{cMƍd/S։o}ËqVo~w~ziy"S/u/I?սw<Gd~-K:OW[g`6liY޷`̖y y]κ(h^|< Y mLnh]>sGqTOBm˲XӺTYO,iު_[tYE^Yov`e{αgijF/s [9dh۹D}ޜwk{弚Q(/a_P8Z%j}MCEq:_>V\XS~xF:7b)җxJuG&ade4/data/kcponds.rda0000644000176200001440000001632312576021756014151 0ustar liggesusers]y|E W 'rBEDI2IHB!p( "Ȫ "x"+""+[zLw':|TWիVW}zz!`R?s3̆z< zf ?z^zޟ !tW[UYb7 ְ>K>[B!q_;x{S:oiff\650A\3{|Q y85rx[\*.˸(.cx|m<Ώ\6q_egqnF(k }DqW6}>rTbiT' SkjgGTU;ڄ/X5 /cXcK; {PqeπXqQCxlb̨j/}HUeNUް,i*sj28+K lwPeuՃs2+ =oP[ÜƑb\fpsy §yZa.VzU!?aHǶ|TqQ_p9 iqA\yAmcSuGq#̐o|sN6֗Tۢ !LPtaymUWQ~ؖUQaҫþP-1ٗxOW KAP^iecW96?n5(i|R.BWD+e&Tqyzȧk;F ty9()&x y)5Շxɡ6rVaT5$Uu0$z}\3}0܊~pkjOy<~)ƌ r Aè=LpKy$t'#XI mYiF[vrЖ\妭 ܲ-°0,a! aXB°RVJ5[f+lTjR6j0la# ]OAtfLLfdv.#c?-Lʡ $%I #HZ5%]% aFaJꄑAR/H! J0$4 #Hy*#-)tçvWaŴ"_oϘjj2-W!tf))7ʬT}l|A[D:N׈t*‰)Or >YԷn{ cŝ.!tqlפΔW2,ڑ] 털x!g(BE}DC SDS; <#D;A[X!򋡞0.ӷbcs":'B,W2Q7H=D~HE383ƭLͲ`lf9#,6PG 2~͇XwsV$}Z+oG/fOJ֏IݜyWm;|cX7^s)|,塞Syl$G3{RD>?#72g6p35ԧٔzQ?|Eﶦ|u?kpyeWpt򃬠K $= q2m{,Ms^x ӳwIeE9;dΟݟpAR񬰟zEP5/y)bͻƬ6S?b=G\sqڞ߱wwf?$4|lߔ`%+~,6}S! 49"~b\*=J\SWVeYvoXiNAa3f{([^:ܚM& JKc([Otf`k&y׎N&HهF%24fS޻͸sY j-s*yxq PGǩj@mvwǏiGOb!W3Oڑʴ4q@ 8D=<0kubx~@kƱ>qߩ7~~ 3ϡmzki>.Ⱦxw x`P XBۄ0oaxc#޵ň,Fe11ϑ#.(aF6°0a' ;a Nv°0 a8Ap0 a8 INp0$ 'a8 I.p0\" aE.p0܄& 7a Mnp0܄AAAAAa!7-r*7mr.7r)7]r-7%EY$EY$EY$EY$EY$UY%UY%UY%UY%UY%M$M$M$M$M$]%]%]%]%]%C9$C9$C9$C9$C9$S9%S9%S9%S9%S9%K$K$K$K$K$[%[%[%[%[%ZDsBWʝx{81͠5zFMؐ>6a鱔3υ7 #Xv7 |"UDzgE8ͯ S掃-SE<%6@? e+@wc;.WqQCN߇lQodi{KgK2.gCq?ҩ=P??7=\b]b-Sŝ* 59?zh{Y%CTr4YR.M|­_^@ay%fҽ٪6\r}h's@$j ~:`` Q].\\í. <+=aBi>ڌͩ0!iP]+f8 PFJV8m[q*媮 E/ BtLnnpV+40HSSncUZN zII^ =A I!yhs,4AAv+UeP\): NC6AiJbT}1Q F6a&Nhg /_T56qbN2'ȸ[ɮP;xvL,6^ J퐪}%Lz~J~28k4T? LU- ([!tB:JzuyHi63 [@qQ}zI0Gui 8ɎHӀQ՗qLO~fOeYTPSTzcѩUPU6kϭocn^Յq2 FV8!ޞ=1 {t@AοF؋dth|& _IVgeD0N9aiP/PPT2ϖ9 C{VXj5{ĵ+u3Z]n eEW>S%]*qP jDhZhBHPSE|NU0d A_wu"\ CNO_i$ijc֕loz7ۏYhZ| z5Ѐ T`PV2l}4@ nЏuѿ69q:ݑav 㘰<׏{1ow+iZp' RԬC3hbWP3h4[F3iG(471hNfQ`6Ѳ&=.X;:F㘰nfnVKkZ6{.lɉuIdFh4FhTFhtLFhtFhF87B9֍ºؓMQwuh<1ܑbd͎ݚ;8eQ1k3 J6DuL8ꎊ+6 7\9&0_Ӣ 7/(ʡ*\kP}Z':hO503Aw$uX<1a0M %5` N^AkDXd&ND24cv{8#Jlx\Œ)CӢ_('c\<5b:Bf)t-I'lysMKW>(Rnc!VӡhuL]-qcs'[eL۵WK[>Bj׊3`z>-^-Wڗ!#,x@^;2Ϗus״bm팒+Wj_@x|TYikCC#2hф]zMzΨڊmQ#n#Е F`%,= eЬ:j/>C:&[XcScXcϬhiayK3' RB?AI ^x? ЏЏ|5]k5tT|!C:޳#3ׁ7_״hA ǟ\5l L)rBΫ@cз  Wuf^C|Oo@uȧ}{21!ߢ\z|{.oҴ[OɇCz,Cf z8}"!^! '_ ]p9|C>M]Pdž|E:>rzoj[tǮ=\{!qHPDŽ|C}~-,WwolдًӶw5|I }Tj\x>5rhW@)Z;!U't2EU=Չ>ꎱ; 3я .{u}VE^V'CU71*F>.qiMA?ɰ̼ jgycBkf-嶹X8VӢ|nQ%5:FGaclGš!GOzv䋏@![PDŽ|w6?dO'LPiso}(ɗ%O!zUGp^D9yL|6鐷~֗,SA3G Gȴ p&GlFi_дh_s˞5%HgC*}I7zD[P:Ĭ%k?ia0EdxƄac|+ޠiz}N(?J aJ8uT=CH+q=] PߨE#~(5W} ~#aK #:ky:7ZJLx27N7;%ya;U?v%O#]^*A.̧ܢMVw Kِ ۆqϴA0?Cv?5|QU&k|<Ii}qlX{͂q,G^Z{u3.5~A?ʏHE˺x]5cIi_ÆqLXw6~˴9=о-4-v5GɺӐH$~R?1OP')>z &yU^.&x]A\ <̈ŷkLxTvk؆p)&ٕϰ=׵vyM|ܽYAS)z|6KXU#SeD1(0[xoiwoJ+/ [rS66̓FAxM2HoJM ⹓VZ ^m*}xmg UсfAuwNɕ#):WXR5I}rKJ2aEG)+*̐Zu}ade4/data/friday87.rda0000644000176200001440000000357512576021756014152 0ustar liggesusers [_oE&i&-JUU> PѿiP7>%vi^b'v%"7>J?|$x|oƻ{>t${fgfg~{ӏsƝ31:8|j3lւ[]ۑq#yUSN.ReQxVtl.T|6qs>pH~*[kYIv_HIy$=ǩϋÔ,8x//c/zS򶇩t\v~ÖR,[`:l=4>m ϣ.dԼ&!w:= YCO9q [.?Xů_An}?uH/)I3=} i \4xazBƭ2H9#Ǹ]Z‘ʧS, I.qMJ(sqp"ncيg/Îq]q~/HE7 beyci5󔄃Xm5IxR8i{gC9;G\[z08r3P8ם/<z#qHtGG}~Ǻ9nٺ/ShʚT}ϱ\_t~3(1)/ze"e'oOȧÓQ`QP8D܆ ue :9yeqs? rz*s!nǴ_8NWZ4s+h^Ui bb#~oǵ\/+q]?ZGeqIvWCMQ8l} {[)>Ҩߋ K>*! O|B'>! CP'i-$5IzFsZ$mH׶H׶H׶H׶D~KD~VZY)JZB-TP U)^U)^U)^&su\O<@aU(x((QB Q§((,p-`Zm^ߝf\~щH=|Ø|މ ؿrbU{E_BP,CEG|| GjRvwQpsD3GǝQj{ <lso_ ̎}oaDKؿN DZi悰ۅ[.+ܮ>n!K˸nM5S?ZaZσ&WN㝼 \&Nm8O\NFZh'*Or7COYo7;{orfZh=zF}&nUOh&ˉ3K0 ZF{w/cWkZTYn5~ ?xo(n7q;έx{:Fxq>ade4/data/sarcelles.rda0000644000176200001440000000232412576021756014461 0ustar liggesusers[hULfy}B C^5VބƦ1Xd;0;&1PO? PJ~R T`I!)"193wn3Ξs=#}4!D!IT$J*18 !I0%P'H4d:!%j/au`6}+lԱ UZ:bû k_Oy:ͻ.~Ag^L'~uvʭ+.O7߰ ާNj?>M=J;zq$s=:89B?qoyȷ343[ߞn>O}_{޿Novts?~D3_X^OݼR^c9jrƨ|-t"BԁۮwI!q*PפH#сD']HGA$x@(m!R!R]AJILi^RI.1%<%|wn8+[ MA\'a~2nW&eO­c*J" nkξ71=o.-אBL1ϊ(,z1bkc`:$z@9qp8%{"*b1Ģ=e5`xoz>k78w*v+ϕx J꿞d2Bade4/data/coleo.rda0000644000176200001440000000727112576021756013613 0ustar liggesusers ]s6g&6&k{hdO]o&fL("Ur-)bBAZn3~ pAy'}]Mjw> Ѵ;ID<3#w:,)W̋z"?j]Yv4._8.%Mhϼ5퇠Jr>m.G}(Mxw?*aϵk^]Eݴ=YSTyM{ESjĝh.ڡSNS}Y^S,Z?U=e X6}S.-dv̈J܉$wҼd>MžEo nܴIb~ *fd]Qn6wyܯԵnu.:eXEC^c~Ɲ`X.RG!WQyD'W}^覯wxԑpQjYTNe넬T}u۞ GUn.]"չIvEMNk.Ioh,/7=/wU67g$+_-?;um'=;=ꋸӦTNv^8翺D^E_|J[i]&,/{s%qT}o.g\mj("e%v_{|S]V5/ү\y\ gr1ZUsrel=bq^^;Ǜ}E7y#ټ[\EQO R}o9/j_fJO,WZokkd*η7&"u}rnseQG ok~F\dwUV|7*qj|׌[L}B ;= !ʧ5ݷ՗UMm =WgJ~o1U;kut;~'s?׬|-ˆ.%T^ș_<ϔ֗N~߰UT6_݅n_<'NƞH!/MwK_;񡕼|5/՝Ooi[wu?-{Ur*z[>n*tkGkĴq+Gs{E?/-H?v,ѐ߉ ,\5_ԎUsUi^x6/}F%4T^5 QUj\Uﺼ{z'{f|S~l_5CnsXOliR9/:6`A$3䛶Ϥ${0埲yQ_Itm}}'"ZOoT}U{K>WA{5euϫ^^M?/y\_I^nTSz4z:LД5 a` kge+úֵQF=:(u[qfkXJ@#:wJݞ/RwA}'M~}ߏrM:M4a҄E6M84҄SmL20eb”)S.CG 1tCG 1tCG 1 0@ 1 0@ 1 0D 1L0D 1L0D 1,İB 1,İB 1,İF 1lİF 1lİF 1pA 1pA 1pE 1\pE 1\pE 1<C 1<C 1<(V%,&KZ,iÒ.K2"ת3v-wQxDEzezDϘhG0Qҍ_Ld2QgaRѡDQ?K$Po3y:> +'ea)9p,_~z//9AskL~08~,eΥ[؏AUJȏl%T\w['!ɲ0{_%1^{0 s">K?U/wNԂ& gĻItXF?X:fyġe^]BapŠb2Yw0P0¿ :ֿlүԝ2i 1y.*8}ѸO"|vb &|s$wm}2WyCm N~#yzjW>A>貉m1T&.#@,͍8^ W!|A_|f{(Z +[NHagm3 {i(Nf~@8a9X#:償~7/$uPX(ƾcȭgu0nJ.BXk\^~ŷ*r8b>pۼ0Bpluu:֯&w8.TmL\6pm&ñ8xWt?<}qknǠI4ō1e)8D=9nmy9t#c2{Lae2̣ĕ5g sx3?ҶyVBԳҁ?>'yNQRx9xryS  , d84l'b'# ~Mܫ Vg|z6]@^hRq0r<ܛia҇i.c7˗m1Uhk=Itx~i |JKx)vI V>Èm8$`)^Doʢ{F>=y.IKC>7'Q+5~mF`|%1mtT~^`~"9:v-ŏ hF?|;V$h'@._}OI WdV!˾ 0J5{a,ߟ4E5lJ­O3.\woqܵs.3usUYGb~L.V x$;ٿr%ew]$_cr|L{aE}^q+#oW-V= znb&_NRD,K D!ߦ%6 ;'4C5>z&0> `Gy)tfbRs+)'! B2C/WJ'ы.tGrade4/data/lascaux.rda0000644000176200001440000006614412576021756014156 0ustar liggesusers7zXZi"6!X_l%])TW"nRʟXaqjnj-&χ8' 򽺸"_Օ^xq6T[Ը2w2kyzR"%fy[ֳcTb!Rw+= l+<}Lv+ej1JⲓDvjҪa ş )ZX chRSbP@(uqA6F R v:[SLh6fӳ!#s*7j7EJ-0}jQ/C>_&yb>:ې .P‘K9hjc"V/pB=> h@êX9AwRH$wqz1s qOuWI,.p2b$r!T1?(Fɒs@ۜ?,*6i=A8a';D{P(WmO64zWcƎ)TDe._kVÑ2^lUd d4^evv"P]]8@n?q&J#s%{नl:}wD `,vd/Cy.-"TH<}Se`,AdzУpGGpߒfg֋{`DK]2Q95:hd/l!ċ̵* {bXlQY!f6T&2W2_TC *\ǞyHxHNZD ;.8yc5ic($zڭ_;BĕJP"&Wi ]<@ڼѰZhx/+*QNuÚ:'GKKjk8rG"9/TFY2S攕t]/giw$VaVgw H{9z-Q$3NN]rckŶ<"m^^oB/=c3霮_@n2dasIlNˍ?D$9/VDNƅt}s3$9#gg{yu06@$Bh۽Z(R@.1m-Q@qwE$<`ke|bwNu`$*3N/FC<,E9G=vz:p2hG -cһX ^9?0؝Bˁ$ױYb_{KC,+vDc\tO5'!KmBu%`ul##zr.ܓLG&8us'i?jN /`4e".9 N"C?|-˘>k}Kg6j+KMc\6]hql$+.")m]"] :[E>ClF2Jl<껱㜥#UP/C`^J~nm=-5cq š-I}38s&>tLHQ~:12H- 'ՔstO^vdy%W7w;Q0K*8=ɰNrWJqs)ۼ-99g =.N>,d; e)$}XϚɄyDdA.JwnkG4tIp9wd%tF 8"dAe۠# N)s+ņ*a;A39kw47{[ϯpGj8m4l䝰COq#m [At_EG5+٣~CC7_{"#Q/O W1q9} ̻W|3b$MV^.fR:Ւ ϸhK?\8 ^q\ЩXZj@k9XW«֟.[6mld6ۜHdd!1,,@k"*aك*Tzn,aPȮLq$ ϥŇ joTrr!?ޞL!cp>CH^`bw!d~^6NNrwD8n.^C?z;uW^1p$eߝgst?I";wG8dlQ[s$ğycϵ"'uӜdxZ,V̅sDӒ~)ڄV =y')7;EDAQξ+@NvT%jA_'#m /7g݂?2bmt״Ae),zOMq$~OE2dA(-fֽ ~E1 *65XS%v)h 1vJCc%i^6?zQ^Z K3J2> ˻CFQ{~wKL#?bl@ &e~P+K!': .@h]L֛ۀ=7TImBK8DcMEvwW@hI`1}*XM&q^Zf>ܨfhh7(K9}G ˇ]z<{o=z;F-DYT2ƓiTOc𐻐Bp\1׭/ yH<ڽjXZJdVt`,d,3Vo3<+*ҡfpIsbڪ/ rC&hm 4#DGCfUS=?׋5|$GUy*誶r#:g8ß,<}zt&lg5_Ŭ6(SJpl&ne& 0Ks譆էxbm"ƻg# 2*q]bǨNܱC/$=`n*W,h-^1*9S[ۜB7dc#J:;-*ҔLZ'YeiZ]wtVJ! -,Uz[?Μ騛“7t6?SGě1x+)WWj$IB̾l(208I9j2#Y"Kh(/`C=K 0^(,HlQtaBRo6D2 BM_b#R\Iac!$}`E%X5)o~ŦC 1sp=ٿ̭޾&l4*>kP^c/RT9%i)k'lA{Rx6tMՋadUjʶ^*SP5h93\}r+nBěLuWJ닐9{O삉 cLǚ=Nx:=/"U #堏m8M677R{й^fbD#]o %A_ ^%.WS8k*) H. )qNM\ɗ1Cn-'qּO!oluH-X!mmE2pϚjNZ&orRݛ90KwtQD%X Ӫle='q[=x^qfSXϓBV G!XLbA.gG&ժHXt>˻.=Q?EJO: ?4$lݘ׿TJ_<Fӭ֑4E q$"lu!=]ӽ<=Jz}%c,߿YvG,*wkYC/+J$EuiHfgat莰8YJ%!0WѿfԳ㌹D 9F5k6h,A&DKoC/R~\+H'B(y4;c0ɴp7:3wj z45oG%zp/cF&pilǫQoq^!,yk CC I,h%k$px8ĂM_d/Q# W( /2ҊJM^s!5WAnC KPC_z7-l'r[.IO73S2D/q|T$s16iZ`Uu=ʳYڶ^,K^bmg#ttƀ>w 44-s!"U\w'.yio2S֓XGS*?HreD)uxr8^p@}:JL$m=A:6 ɫ2\= yKB /pPI g ,|5zwXSP9  f`w:{g& ܎6*i|mz $Z8_~ԫsI'6[jC]o繆 zګ/GVKl-=8=dW4ilCܦR PhEeQ޵ܡp"% *NOd@G.m" p*xQWa/7TԣDY1;:!G\ӤW\QX1KN%g-yDxiN瀁޹ȠranPj%eXkfJ$MdU-Ir\oY/tv] Š{!~D0ÓXD)t;ýDl112yF` 0QkIGR ؾ9  IX\+CsQʏ;#ntMnGjďنn) $xZz{Uf3mƭ2Mf7xr*x^f&qcB\ *P3΂n9A8 s_o^ =,C\`0mWEҽڣ05)γ- I/$DAx4Z΍bV+]G&z,S7@4; n{NSOU<Fo}YaPHx K/ݧǢ *i1IcSa =]\el/" X%ҭ81Onߘ, -hee='N(7 v -[$<a/zP[*sIȅd.rc [3;tP5YX5O8SYz&3/HЄ_pa8~lE{Tm8SR[ .>4$փLCNi[MiN%|.:rtLAXha>fLu?ڛW"2V9wPަΜ#y{Z~'qEVq?)t>2ʇI!|qsl &*yv …N},BFrךƣ8֞`Q6n;D͘#?I yU55kIۣ{o7GH3t(Dmy(F|QMFI@@r74L 7+9~V\1y|3ZC wv@oTb*-H6sSADA#KF3ѬSv4X/WJLаgE{A Wt%m66#>Q]=A *oB.(a-OGf@B%ôP$ _ &0+xh6Y{p14'Y_7Y{`}^CAl}k8e=qˡ/EGju8\H~ Uhv .A ]ϼoE(TFJt'%wrzLVxRa7ZTҎ:ST;)"aHy6pma*s )0ُV3[Ad? qFY?WYN a=uJ6l$$MX>67=j/]xwqh`Pv.fz˫hHMgpTwnn79|kAi놢<|v|,_T+=~AP=ogH1y89t.3iNhvTo˜+S4 KoiB"kGϑɝMrҹGTqlF;@dSO+lOkNT$4m14ǩ'ꊸ۰LZbƺa>RI3Mt~3/PZ.Eiq>ܬ;No|am//E>^˫^sK\EtJAw#ͱ8NU&NX:\w#@[xq !` ='I?QWu;3<{fS<`p3+O4SihBiJUnoˣ51^; 5&كEiuGHc&Tp*|,abs?V[A< N,G-*' 8)i9j5]9v&sNs9܌F^/_RY w6$J@b8 ǺkEy]$z┇ߞ<dgZƨ)hwbK{ J{Z?9DV6B$=:@ٿ|#/=jsj1䘕 66U~"'U8|ŕfG?٭;*uǕ#*L*#UTsVZήĪ( AQDgN䖾.k6'TTXl{hg`cJbh9~i&e"fkCܺR`Ei$2{x/Mgxí}9qOtp,OGi.ǚ]^=,fXo$`._=El8:r b1 ۰+D%%<-Y?_zՂOKLK4Vq?,~f=\%eǐ 9ɓ_:I.[WXLC^N45~q5.GO$ھnz@n#T:qd ņk&0\ڦ}2G4f ]XNdwH;A"x2FPk973[Ԙf{'bGR5B@JNY:ߡعN=65ڦ8;d6֘vlbmx̗D'D  \\#NR'1a bu-KZ 0rg)G#rr2X4 5.ґNK*Z 4%3a8r`U>} !hCL'8,| ~7F};Fu9R`V1:MĻ:tyyd5aXH=(PXk#l?}ԓ#Y#ҞX((:X >JG9̔d _5[Ke[@SaԻvcrk"权rV`έᒧ.ar4dS?Ӻ xU.2[ށ$siήXV@v>F}|m]r5u|5oՑ}b 0 b )Vs+ļ1?z>~) q B%- C oQeM{*$%,!D=?gxWT_*-J}ϊ֠Gɪ|E>uTa#Gv*-N1ݩ+ Ha=ݾ .[|VSc÷iNDf(?Owg똫;mPO>Ozt{#ځGZ; A.22;8¸m<ǧ>w1nM̌^!JQp'[0 `Dй"G@sW\|~>%o2tIu*v Bzʺ ]ҽ VRryش]G_m*LshS-/ӏrz̆rی]I)b<ѭ a%~٪dtAJ|G U.* 2"#n$1_pҕf[IRNtaNzrҠG dC ;Yߋܷܺwho16i,D)O$hGeJt=PC!@W6waTEưoZ M&k1#7vW9"LIQcݣEu= LZ,XN؏1q#GVMت}NUrf@S<4`y\a&+7BE>[@U/]}*mLJct\$%WDC][5פL}Қdy2u"pGc-]>`%SBn[Nv5RHtպ~K\/?,2\Qidy[J?3eHkc5l܄W\Jy-q 2iM8-ȋ)ՋޓT =$2xIp6YBԆ?%ievC"E/EB鰞R,o:'%e(|6u?LS2lVs{YPz{V<)bn\br7RL/ +yW΀N>)4DvE4n6hnak228, OY-Pī;g=Nܷc*Џ{ }->f:%p?:rHLյ̞hI <6<`MQ|rrFwbP(Ko0nbF c4x~miL&\ Z&Jny㼭lC{ a83bJQFLLPه ;g1Cza^ KWbF@_M-H.rpx%TtR57Ubsoݳ`rE,N c銸zחXU1a;A?+h+,/=lfwG/yRkˤ3%Ɩi;%{[g2s.[qPd<9 uL ^6e } M8ٙ6yeEa%,(POP2n~ڜL)W.y}%L"&ĹnN֣#|0)S|+4C.VޝZKXCWzDz/y[ ЩLhBy؅?,۷cx9)/)|`3ynN"3 X's:=MEY9M8w%Td#6ՆRi N*3(hUD&rY3ORʈ%qq41QNE7'ںT=FݖB7g9b(i_]ߠZգo ht hTs #hW'E68 @}Z뉪PA4pb1n%<__;mku}ScܫI{,bY$Kd a'})8 m_d#*ZXzcZ4 YؐKSlӛ4=ZmHpity>LbY} 7w~ 5+/*PC*r1X]G+G<{cc)0hD\ aLtF6@xهb޸32HNg;"ۥ>q΀^ l Q>Ӧt:vDCڹ roaA]eS&j(sֈ)Tb؋sʊ} ȳ@DC8^Z'~U^gF vs%t$"Wո@ !߀mB4KaXX, u~Y,H#GVQ#˰yH^6\&,lD7)Sd?,siZr+(!O4AQ fQ"6/Cx] b4e7Eb)"m#Bim. C=\p 9{?jWz0Zh,F]>K'QZhg~Mmly䡈V6A #_2\nE<`Yp'U\:؎2Zy~d,K7kzۢ&Ki4u:Al{.W͔A6fBA6! 0Ywd$&49ӪO?bW٪dÀcMG{)j jȗQ!Gmbo{E{X/O.=~T-￀dK~R'4S$0BE5sc{Ba:0kKvrSOay/ة KZ}cotJʢptp}iI}0Ws@j ,D]3r-O]JɩO6~<\PBO=n-Y(QeFbN/(\xLzfe'>/Q@4x[&z4s$6קg&'('v@{pMrmZv] o:X0D!Xaœv V=LZmB-B?8=%2έJ](h^ne|J!=: dv?3z%kDE pC&5 >!yNr RZ/Oyy3,}!Dli*0L^jژ9VmBnp÷۵DHZyfTFFl0#1,(VqdhxjYqf/Q-1Ehr)y!M6Jv<6>$#V׉8:oƒ$-9Y\Ǡ9@"Pg.&о|L0d)\aHK)JT0FLG|ç.h9/Q$]QIJx]- Cg JӎFPKJyLj*Kq9s/FT(5An|XKm*#;>xO]`resGz ۆ@sR{{ꍴZYsøQGɁ.qM.Fzawq==8j@ڀMZ<f4zre_B^tiPBseңܽӝ́VAmkw ѡ $TfKրFlBJ*-GWI9beldhҷ0FMi$ 0̖fIne(;ˤ6p%}0A8I=$]B Z.0Ol >2s8o_pfo"B!1pJkL`[7x9?u]'`1" 'ŷ>_$DNJ IĸѯuWe*NٳOėF R huch3?YPaU MS癲Tqa"]=BُE3-j]Ap:<2zu8:orVM 3pbk_]!Y!مѲ/ͶOQ'onSN(ڲo0ȶ`QȪOk(ȵ"1z!9 1v=;t.؋þPNI]eqcL! e] mXΦBm#6Cs/_⏛64NSHp wUsWA=M-h<=2r#])#p0 fj3X~w @heKtvR5/0 ۈ]tσЯe{7 n4nK©MCxgr<8Qdo+|z@jD2BOGbȵcvFhiw} _"+-f5eH 6]6D[Al'-w<:8aI#h&^bW$p#o@[k6e _x6[8T[- K\/_T]`0wS(GQ9mӔ=>qizڅM=)~% 5M?w%;=4 ?:Ȟ/Vӝ-Ǵ1 ɹʤQ"٩Tv 1J͋v%S:0YReߡ6^3Fh֠ nF1iZQOdbw&鏵ԡXfD@>jNy$Z~JԴ?eÇECظ#6 H8tҾB z)Tn52ΐ]s\i=2̓i1od?d&oٟr{׍XH$T\`8ҨN޹`pG*aM1iJj 6Nb2f6[Άe([P{Crz>x 3֞@|95 D/-=*fTTyŴ?Ⲥ@3J8dRl{W RXZn[RkP5%2$MU" h5ioO|gd[S"qmpJpmE[xw7S>\c7N8?{ZUਡ,dܨl&4quWsa]Z;u@m^PJՏ#ʅ .Eӿx_l  et({&_[W7ʣ^0{!gQ{tQ$dQ:ݳ:89cu T Mi w2gu4@:֑u'z ˲mJ1ހ;j;~wHESsP2)"3<Q ЕrҖ lL__<[ng罹~ .:g]p;z{M!%|q˟y{hۏ߷c۾[ՙ-%=6NY;#P&0g2C$va\}.! 9b jډ"zByZȊcq鐪A 5mF8ֹz;b$> uFWO@>a7LZޠ(+Tf * -b6-D9"b%Et'џ@="q)E2👡ڢfuŦ^.ioΫo;eD&: S,Fxl㈤AZL΃nFxcQiG3n7vi;'\L@>s X2 kxRwѻj>YȄ i,C߰xW*op>OUEl~ su`gߥ$z> -/b98vw0BlwW&{}_kؗ-r3ȡJOZv{'YEWZ!P|RGN7Fal/ ?Ӫ e#'u،dc/ȋ{CC\z ;j^ nvTƲL,)',{|DqUB=0bq(CN }G &6 _q#Upr=SjʺʩcAG ;ֆ/8eE+TRd`)n|@>̠4:tk8*bxFc+e4T1Y̩KiKG%GEЂn1 E/IQ:9_Ph~vHݷ'*bߵ{<\/owe /ڙ (C?N-eƾ<`JWhgrʦq͑0uql)ѣAC `ٱ3TiBķ b&1(,g"u1jFt6fvI$kȉZj Kb gi&C&;=.ս!s`1x`<JL2b{gWu0~U 4breL2>f&ݠ3|pēbS)&2,:ʨTTs?2E /We Ģm!^"s^2)$s*\F E%_nxRqJ?ԡWC{Jk92_ms:mI5`a+RT<Ft)XmT9=iC> Az%T(o=7lg7Q^^6nMs-8y6eg^R]$å6Fdho}vZd6Uԋ$ uK3 Wt,SKbvVd&[| .Zb(/EM+{cyJ ;=Ew?s*|Z+&ԉP.zNf7as3fwDt*|~DP"QupzY"{U~q/meμnJ@?Su~nS/\˦.ZxX#MXQ_qbZclt#F奉- %Yxzw 2y/f1lYɺp `K kl_p3F3$` K'Cyˉl`VW Vg[d.!y?!܇dy/&L \pƱG8JVT!#U¢:+;N8=$(kt?djҺe=~=D0Jw#yf56p8/>_J1.zF;&z6?5|goY/ӏ[y`38A5j0j&2tĞ)D@5R)dU#mlťm f:;N E_(XX5lGs[~c69sP!2R *##'I7Ax`+'?ka)ŏ,c wgpbM ltarNH4$ #ϡ$ ŵ;tSm7GJ:saOҺfR˥U81zW8yJ ޤ\)8>WxEϬ6KGx4 r}E(Fa魯W5fyZIŚ^|yUSdb#lUxu'LH(KHE6 ~{ *" lmo|5z :JJ"U|sג6fYcV$k1dϱdA;<٩a8A<$gY C4;U/CvS4 1=͔4esQ" i-~J |Ch,ZB77wd'b$sC^_ReIba`CQMh!Ӯ]L_o;h',p& 17NάބW>OgN'S6\P[}S N>J/F֛9fo‰AͲ?o}aE. U;(x[,;1 #YM ]o&o-Ctw\wF8j&CPHWNa[rFX{D  W{Z[^c+z=ޑ,[2ܢ_-?5Z <|9< AP0*U(ᵣn 1D8hU|4BJSp%t`%>^cM)5B iBȣpq)wc-RQ>WF+O _g "Ò.8fc5#_`c:9*cQ8ch%ruSmSqi0^)FmS`uAZ\u1T#1\>3\|_y*d[M#[~rQY^Rn-eI'˒ɪ/Y>X;Z]& u8S$Ad| ^z-˃L^mo|]ӹ%nb̨n>@xԭ?+$e+&7N a=-˴2/ɿ }+o&r|_\w#VՍhU%N)Ħ̧^ƪ3v|ٙ0͞ό> Иk(؈dCJL TA8x6oPG/S"SE /jAiIN.X;!U5;na[떱ҘXtU'p۝jMPb_pM~;%YR,^5r>5VB=е\SvYizD`\j=:Bפ>X µ2^;5NCqduP;af]_LIC26YW$ZRYiZwܻ^H0M]x܃ރ1'`Hg7%)=AOT 3;j(G>K˓Ro|OEĄd4t19B\pDu%o*Eqـ ݤJ. p] ǂO;li9INcY.V}~{aD=7VvY{52kr!,hq%ݚ_&#|d|^ '23"ڸTX8>@_GR=ҙ~/D`eD6J̷[^8"B=1`VX贘ԯGl)_Q?^aW(+@>[ iH-X-AɨŒ d&aulШMgEuI^1`akoI,xs SjxhUK Kw@6½kr6ܒ- d+L׀(K8C' BRދFlUNSy!X29YrnD=CuJݬ5m{>(ξYa݈WcB bEpfG.UP?1}ADXbjB=C?ﴣA*ս8ADN7gfS{n>{$PU;ϛӛQcD·tct#h.Ǒ#M6E]wݼy͗& EI~rK_E?ˆXgrd#̌W,=/*+9ls79Eh@ژ٬ĮPKI;LV9+QXѤqeVp l6XYS_ȃF'Ȟ4P4ā0uL!׺,Op?ۢ/2 q^` ny kpViJ+>(9 zOZqd ̐:R쪂nDŭ]d'PBƧfrp$=2]OtfWKu+^Ēh 4[ M?P?Tc0@%},QE΃4-s?FCphxcp9h[}⹁_ѩd2!)[QbA3<~&gPƌa}q,A¡XFWOfO-.]i]U+=G*,3hU3H5 9eE3 (VMqo B؀47bpTs@QNUNʆMkKi6~?d:#ra7႟|dm!;#}2*#bpfAIJ4,GcKAl=Q׃;"/_ymO=TgCYX駙ף{TH)uZT-X0OvyCI@÷}tijhzJ4]{4hR^y**s`+/kR%a1K qQ1Y4Ѻ:dC0,E%c@hs!MK;vsJL=ER6[:frPG8?<ܛLFaG"Cftꕔ,+#ϫ&6̌ߑYBQQ$xN7''5P$u:+Xb9ƫБǚږ:1A [ $7,~t ⸑b^vf"C=N:3jSFuWZhE~(nbόŧz¢a=|o;Z9.~է] M׵RUIOs:Kݖn|O솝jN>q\Ӽ4`ga1nLO)4w5Eq׎5C=ñU5J b:!USJm $?o^u<>d=j) @}P5Yt*-g*~n.zֺih+p6Zo~mtNJMTH@oN%#j!?]\ʒ0 YZade4/data/ours.rda0000644000176200001440000000103312576021756013470 0ustar liggesusers VMo0 M>DIHH;LƅkETZT:_VJ^uL=/v>WY91ٜvc1휝-:0o俗Ƨ1qx:oq^gcr|IEG@͵ʢZ[(A'm8kX׬]o_؟s]^ 3L7X=btfS7Ў"Mk PXZ S(.jV5]8hǹ6*^+V7Zeά>Ѷ,ʬ,}cJc?VX}vL+-'Q*R$.L3 jEYNu;Sg ڳG;&,J%P;Z,؋ٸw;m|I\p^8Rl1eO/p?ଽX8wd؉eZ{\=@$ MM!@9r!C @9$rH!C"DrZWFŪ\zB, ade4/data/chatcat.rda0000644000176200001440000000061312576021756014112 0ustar liggesusers N@E ѐ]bx֢T}mvw&tS _w'OK]v !0N*#^GEDr#T/kyNsekeWiY!`$ƀ>̧NH?YD֯RINS1|ceyB"Eo&P!5YSoZ7Sjo6)X[ cYIc~dy0Ƞ*hoF(<5 3 ,G $R!b  sH!1sH!1 5ZzJfbHߢmXV{WVo>89CܡwzVoo'u5{z~nͥEade4/data/fission.rda0000644000176200001440000000064712576021756014164 0ustar liggesusers r0b```b`bfc& 23r`e@q4HKCC@LLHM+#= /+c=M+St@:@!f`` |@̱ߎ׭r;s,εLe:RC sC̱*R _Kl\b7 PsCf,=Lj}b?̱? Gw̝G Od9>quuWwgx9VV˭8ܮ_ʹկK:iO; ٝd'K0OOvr#y>NAWϟ"z]n<﬏7g='3YOdأcǑVۼ5izP>9=fK<-tzwҷ}>ޗ~gN'}1uV:lsuK93ou?#~|39ܽ.Dwysy<z9]:]>{6_~嶹U݈G}a9{;?:񥞞W;6)V=W`V>S<:K9">u?_j~+qI/1g_0ܔ{0q3Nd*G9ľBcp?X?Ny?#-i^1Oq cQ,qޯ[PU>e`s<,_Ǿd|/}|/GZzC,BR~: =.gY׾G=/g#_}c,<ήM'~/\43uQ_w/Nmߓ|>Og{z<ڗ~Tw{FoWwǯa(p RƯo.%廿~R@:T4 -l`KE O'Ódx2< O'#d2@F #ȈdD2"HF$#ɈdD2J2J2J2J2J2J2J2J2J2J2*2*2*2*2*2*2*2*2*2*2j2j2j2j2j2j2j2j2j2j22222222222Fd1"cDƈ#2FdX-lX00ڰaeچ V0Zah F+V07777777777Z0Z0Z0Z0Z0Z0Z0Z0Z0Z0Z4Z4Z4Z4Z4Z4Z4Z4Z4Z4Ր}&c w<е@]kt=z+?/{"b1כqkko\ofє?{vmyOZ3y|‘lade4/data/doubs.rda0000644000176200001440000000547012576021756013625 0ustar liggesusers[{lGgljӴE'Ѵc˃_|'tX_g<۷X7WM$_j л_Woqȷlȟcg3O[w'Jy(V.9b5zK;bNC|#Uw{&;7C| Ϯ:9ȣ!_|;_A_s|y /x>.`+߳.D|K|e=f$2r^[_d C Aa@̇? g8br_HB}Cx}8(|?A2LJo1~l+ C <<˱"C?,zqeqqtZ|EߐE̛v+yq^1hٱY# ?@?'؏X0~qЋW @ +gsvfJH)$#WвòA/X UeԽbQDU7e:8@Ĵ>bG6bM׉EHAך WmR$5c<xaI%aSeuIOMqTƦLt2o'ED4^ixo~s;{$]7Ut.&R'Id;6v eIo?͢ct}m$Av" #+|+bA+a*&.%=ULGظrsadXS+lMWƂy8q8bN62cܣ8<8F$ D[ma)ݦE ?XZӎh&='x.zx,#lpBcW7,6Rb@"<,BޞI²Ed\Jr\%yFּx\\lU$1Zcx ӗsƻBa2^Dݚԕ+Qf,ߖ̱slђc`Qk,}E *I"a5J1KYJܢ;EIM -=^tmN KVdoMUh=Keux4OT^)kq%Ƿ'6f$HYuvCJBW % I}Հ ¤ǕC 9!eWW¢ 5cBۙdt t婐~~k $M3]|2o{U\OVyɮNۓiNTj)`C'_+M>ַ9+Mʔf+kL.kRd+P¥C+Vږ5IsČDV,.6u#j8fwŻcBQիsSIITRm*ǔ2[C.C?\66ade4/data/pcw.rda0000644000176200001440000303240312576021756013301 0ustar liggesusers|7EoA QNBVr9-6j ނ z'V;s"zzM?Ovf1n6Y }eL}fiӨCd2KeN+OkK? _^y?3|g#.9sOҐv]ZLWZӏp)MKzJt5-]u^s:sI\ҙ䵹3cnMKiKqKmni08'M̥{:=uޔ\\zOsN9Tgni6r%KZ-RϥH/K/".pRiKQvp_.=3=Ow([t?*?Ĝ9Ü\ji1xr)'?å<Ioyl/-iӥ0Ӕ㔒.=/=ItFskR\ZOOZ_j:sK7.-+-g9s ss]zI亴r5]̙C!)הvi)i).?¥too\t)SZsz9/i˙[:-LkZǴjxw_-=/=9l̥4[:-\zIґc91%]zJ%5kny\z;sL9٘KigJ+qO+Hh3״xh#Ttgq]ZLCZv!O% uNs!󿴤=gN0&B:BҲK+V]Zϛu%}%إ4vZS^K/^!g҂KoycnHAg(ͭL*$ ?/sK;s@su)?+?̽Lq2Lqct'?QtӌJ| Iq马CZ'-)Ҋ3׶el̙nz,8sIӘ35KL̥9)Oki◘KO23dڿS_^Kjȭ9CZ&ﴒ7mZɥǾ6=\Z,Izh~Y2~K9Uz?]ziK:D=u,gZ̯7Z蒓pk%?{=-miٙ;=_T1ӳ32r`2e&G6M \e\-:sKώr~IJ}?4[= $wޖ\s[.iQFW2 %Tg!g271ř[c(MS[)nNe9Y?3i[R^X̭L ⚐9^z_8*9QF??ڥ.zH9j3}O[e.R&iUWkș|C?Ҁ9ϱXSy0gnrfnERԏ9YZO}~Z/\RșC}H3r\'pREn3类3,dIӒKJbmiH!Iu)YN)^NXr.IkmcIk5KmbjɣeJΏy+stIORa:cJgcøizZ^i rz*,iEMusE'9-WZ?åG|5|+;IMԊ;%ǥ:\Jl;ϴ$֎F~O%ng.uKcܤ:sLs!S֯%m"Ks8-_Zs?!noLIgn}gIhI)7M-gh=c(uZ~6=%?"^'2Ord3G8);KuܐK&6fKvD~X<5dn SUiMW,>sG ij+J҂H}̹~qZr饎t3fZ{Ck'͡c؞psJ1aj7)䅹ii<5OK'%yIo3Xmm4Y^'akZO{m 6#)C`NӐܦ9XNfIoHoC΅Zy/-9n8'c{SzdZvۿc݆Ir,W));G9'5Qyd9{{?~:1N>q^2;1gTeΎg]X;#479|OuoJ}$%LS`oc㊤GN+yct\J{iIaji3c3]R<=?]55LK}JNXRLiS}Y98ǐ4hHg̥D{\{\>5äF_LkY֜"洟Z#1glRcvcu3%7LJmX<(Rmv&Un~Zɉ)vs }L8c{7@c.u+-96I;ʓ34U.R^$eΔp~Tߛ\m Ի0u-|I JgUeI!sk?R:M=[d(\{)3)5k+ΏhǓ{6.,?eH!%cjҚN5aO"vMKj:&{)5Qݛ{]bMzWe,刕J)1~2즕۪u3%aΘ${nzHɝkOM;mKɸ 1vR:*c ކtؖ-^{ID6H\rd!oRb~b.˓w#ǛiA]ړR.{[3.5CҚL3D9ZSK>jOc{dߦ:)5um/9S:Sk_E2wFT? Qj9SJ?]6)󴔜&u^3 xb(%_C$0RSfg2xD'Ϥxs[C$G{)\gdpjsҪK-|~D Ff)5nΑB 'O(5GԞ3~ΓHbr?s.4%w HjhJ[D =$pt!3g&-q+9zkHA~bcccur Gϥul)'ȾM|Eb{q{qSHgNk+߲tC)6?1~/%]J)@}d1.3%J.;əIϓ+z/5{)gȎ{'&K*o}K䄍q~StxOBR"Wwbmh/Mb{Kq1=~X9<㗘q,s-Iy;֞7x=>9sM84D~L$ƾ?seicmTACcUJE:-+^''Kz9屴8> ДRsXp{"]?X0m9i㎴O\G,k?t~gR:M.hI}#Gе'g?@3ʌ%~oMm<`*p:Y\ľ%?8ƌRsj+i} ?O 4A&֛Ž)SgqfI[`_Fr!Ef Nd[N]>5\b{ccx񉸞ahm"9kic`k=I{Cvcw?)iNK}1^;'1}!x-/ҩڣ~XH)ck<3&Ye-LT\};71tLNwJa)揉r)13TWEk>ɿx1.^C ӷ+#)I4컔8ZK&寡֕pDZ~ؼ$~bΣ8CirxSH2J-T9H=NIw;JZtkRϓvK=懩}'u{{M.:(.ߵ~Uݔ ^2 1>BmhHErԜ/S 3ʤmb K.)sCSg4cwGJ=҄s)aGͿL}K,C&)NOݑzOj91^8,&Ʋ Rϥm,X[K0C`(O3RO<%&xؼIACcpx,'o.< &% Rɱg1R.3x NJFuq ҍ9V^9FTe:Cj oʾHysIRRoxmF{'Op޽g]QϬ'gF)TExRbC ҐMczwag 0Cqk( ֆs ~|Kug60+b?*;IVɹA?)/BXPn 2Xr}p9HgTCsq}J*ϤiFZrp6 $'U&}u?'eMl>(};VՏ䦋U1ߴ03JϳJ-JnAKNfXqLoжd kX2w ɕom%L7dkVx7Cc:%~k,ޢ~bZ,іhPRJW ʃ!9T :Wr K9C'6XN غX*ɀ*^4THl0Gcg.lc Wx.%;,lϐ7`A7664>Ol9,?H,1 vV'w/ vMLge8/}2Jce卍,ik47v)).!p 9e}:'%Zoba߰uJL51L!&Tl(GJ] _tRe}ǐBҝ&oZCg^>)Y]`mKX8, .oYZ&78Ze_ĸ1>c.Lק%-i'.s12$ɈKmg?Rq#}JkN(YiXLްс|a:ˤ3KcXV q 8vak0;V/YI +ʾ1`a#iݐ%{J8&x-Vϥƃxߥ!,KV_lп~+q}NJ~y\J_wmۛ0[W62; ~uSO%*b&ݿ5P끳8.3glfImdr}~@8=}9OʹCۙ%6̴-^0z"ll132=)?Y/< ܧk8oЋNj 2BoSA W~}M7m8'Xm`L[g8 ДBLbd51?dm'巡=ֆ棰>k/ݑ\26FZIj~x΂8 x7Yr)7@RARC6] 9me{l Sٺma= m$~I?R-2&Ob7''AK͑~cGڎ2m=h|xn(sLbq.),+62], MI%\Yٚ@& (L'J{J96a5F2m;x;r,xŐF$uO3Yjʴ:_E[H.{~hz ^NoƁd:[R:T~gT=gb<5̅q0^&.3+2=y$־839rL ~lL 662Ye߮sC)$wY'߰85$o:{=Nc ֦XT>k`;[F SmoXq2/[!{0χ{7n,meiOlL*ɷlZء_=鿬{??ϾW'ߖ' 7O,Iqo`_`n{@!g1G>P9dty$ H H,T)kl9EXɮMmclb"W6T/dڵ~9| O^9O(Ac떜P}WPqkHSu۷TPtcP S6h^>_\o*J#k궯\@}7azf|%a6̬;ɟ۾[u/ggn٦Yզ-Sغm̍E>4>09i~uus k|kj=˗T3ϔ ^ͪD{Q~ t?xon{}amePpf$97Ntrc/'lrg* <9\|Cݚ NqO]*SOs}O)/Ci ܭe1OBަpveżA?G yl=NX҉7Η,٬{T躦Bѹ9aBҡ){QpOe* yO]W!1pD[f~{i4y y=cGQ];\1[!wҶB^ǕW)䥫vYg%GWP8i뢐^!S){+ >F!f{LL,TW{R /pF6_!`j[S OY,Jv 7{m:z7ṝBo(F.k?g&bĿJ}mi--F3C։[ Mrk#Ӎ,?$4Vݺg!޴V^t݅VU۶ߵ ǖ>\O-!t,Ay sHGop_g= 58oհM[LC{Уooٷc!Ce|Z-9dC5 x}egw2 s( 궞j?(7W|d rg]zozK~!!h]۔B&6'->:vkȐ?=SG"Cs"O7'*:!z/:qS.'+(>2i0tpAtwDZV ߑBa'y:=s╬u ~۽FFVElYJ y31gd]Z bCJDo#QᱯjT&*)F I}ރ'=pXc9sz7\pwx}"9O<";ŗ)nZ9*;F2Z(>ᆰT(D1>^!6Gq`,W7"t br'C tlCVQa2ģGC tS 1=!@uNzfxNÓQA|| erΈs{;ND?q~7>1b'毘کcXprR?hvd4qӻ [w_bZbٞu<7/JDb*ky :6Ѫ:ݿja3V Aw󻣳Ba&߄J1ޟՈ ۗ \Cbyk˔z'1 :M.Jąi#vuW(~1BzolD}u[<|ߔ›EГ'QDyɱPT6027Df|߲6WLgyBVű`Dߣ"/7wDōgGXݺa8Z1]DY ĺk٨䢓Esc\7F+Ve]oXhbbX^`(e{ [Z|j$?] Dӳjb'oYĹwB\ ~rNk z"TݫR* D2; h^l` `X;J'_̟[o]Ƈh4@* =Cyeu/`Sl^5Кz#@qwGZ[&b[! |*9wC`&w]2FtTH^lJ4:'ޠEā=kG9Jz|)| F׃=#c= :!=8"{:-)T[f1r54 W#: uGS:^[<Ƭu^ k2y<Hֹ}l 2qdrC2cCC4x_5ªݕ:F?waozz ύ ?]@dJKmR` ' ѽ7~D&1qsr;@sɗeh8F7t).v:Ȩ%WGiiM v}Cg0_XGFl߆ z~B(~/>wǁd4*ŝ"(䘗W8k~rV_g,=B~|RWH <ì<{w*x?faEOw m6فI_"5"u_3Ay#z-]jO;+@k{DIg5wG;C}⁸]!{DO-U{(nIX oVzFJe(7B8D9bmd냮;*_)zf{CF̿ 1ˆ/D8"C|bF[6 Gu=bb|o=K[5:~ToYxISEǕ#xz0*Cb~v=< Y]-whx}XijE'bPSl Blf mjGb㞚ш~z7(Gj rCRgVbA#単A]Wc@V/n'Ŀ}D˺V7#=CaĭC$4_&CyQX;|"=#WL{OGVEkan I=~B~kN(w ̱嗞(ʏ(_.sD zU ,8wMX?o7|BUqV=˚8U$YD/m3~^X:k~ؾ ?b}p"\ʩ׌?e#8ԫ(b)PV87;xcCD/?G#qZXI5bJD,ob;Knz!V \/ " զSM^!c^WǤ WRG}W.y1+us3>GlP5buvjtFнĨr{ nkRľ3-W"6\7* c* %7z#柱s<3&ߢ$[|Wzy{!јG@(b{r#[FǛu7 b~kNV!s۶c6U# ^f?OvMm5۟k:jU(xn wx Ve5'QܝЮiDq|sze5^:ޫ0j8~# D0>߉Aac23z}4xUꍇ8l@}TV ͑kO$A[4?G{z:kC&q'څ ~/!υElS"47`[3[Ģ+~F;=Oc\_ vrcވb3]Qn" X- (Shtel%>ӫpBz&WP%PBV:+ذ++䖱m˗ѫ`7K=9V6MlvU#*lX`e E,1_шHWV9y(?w b֡ )Vڳr+g}򎺤KF~ D0jDԞ|U{DpiJY5'ap=!/Ɵ+Z4nfag NG _k|mV($&_#Q]*8#~uU"r͙O|E|p"2Bo[UN7C&F|ҹmgb|az yn,C,pe] ;lbɅ/ _Q!<b0d(Eai&juM*@Iq#)t{D\ѢE^: qJ\jDH:~3P qCb\g\ʑp ?Z"d$-<_D!<罅*IxElOK'O,(C(/VZJ4@uR%>bvgo\k mϻcakUAHuzߣ:e1TIuҜYɤ: <99Aǩ@gLHB^I )J'i i/!S l+>=[ 9cAtuL}=HO ^L8^|9+՞:3?$(3r'> Daڛ=_~VכQt8'ݯIs1tw#'Iw7rݍtw#\礻9aavDS|_LnA9^XHs~X^by.z(?OW!oUrhct.Uvq.]Qĩ.FUv]Qt=]ݵQvMǼvثu]QVYWX#,&jZeg=⢎s{𴋝:j;u#Wt*uWxY_@x#f|=_!o2{-z t]iZmDe/u:IX\{{ξ$x="xN:̱E<~]eEN?x~N MynY{ bm}qm&΋M]Ƒt!Umh"- LYyG2U+w" IK^FޅM3]<%82c)`HC3nX^[ X 5P%ouB{@֫2dj7su{Ax 5tLUv9Gw_+W}sui7tnN0J]!CWЇOtM܄dd8.w\L{ ͐?CXGG1נJjΆ_̆rhϦ[Fʧok.c'-E;tRoQ3ty3D9^@>N|UZ B$l~5|_nm]Hg6la*! l|$\_Be_`@FΛP}߭+cy=4.0^-n¹Wo8#)A8{xVVa;—@=-؝5..swN}03GtZY|S  P]ɽ2OR_|"O2[R>t].r%>Aɇ.lg=NVGH(d[.n:΄B!oR dӢl'[#mQP%;F1ꐿkG:懲Ȟ l@(2hq|v^r-(pӋqW7Y{;s.0Bf x+1Ӥ#KyE$ZZ->mʞ,OkU|oE |{&.oLx`ħA|a`4PB(>j9,h/浏ZFZeJtߵJ-yފc Z%фۿp-yr˟Pg(a?ǥ(d8NxK %=„ʮ/Vؚ+.ԍ@%- zb} "0 K/'YTai#☯W@ʂ ND!4>L`:Gw9'ڛT =:ÕtmP6 yϵIkbCtכW=zcEtul;L&=UK+ೊ~gd_ K@cp|hIq ''N__Zxێ8Q•I 7Q# y7ҫpo̼X +\"(wG|wrk‰6OԤV:NR }&ZydmHx3}hBWRq&.|}&~ clX$O9D'6]93a3 ?şkHŜvpnOD~mNŽ`|!72DX+r` VoT؉pB44+Vn1K7`ѡ(=U~w?>;K8{{c*y/{xKXhn?}yFK*Z+ϿV3fR1<ݐ墳Dȉ{j$Q|G[{g >NټڻK}鷐|G{Of ߓ$>g>V k#]Q@|S*-\gB>xErUOY*⬽$=a{+BYaMDPg;n]*+)J&Cκ5M=hKZٴq*{6}W7l]T0 ":sƄ+C` )7C&UHp\u#^If.m |P[)tl =$8Ý]8CJ(e!k)!pSY|OO |D̜] 0Xw7ӍkY鳈 /⻳H"X;VM,B[J%bw+2nw+Ѓp=KIp?Do_ 'rݢa(ɆWXVlAw=i}anFh 꽲 xin_|{ I|-=>ʅ }a.(CV?ٴ,HZΑ34n-C4:׈@$ V5Gh .ܵ4~!lt.xިӪOaO|9˾ߖBȑrJD;}_/ܽYv`\+t;} jWHe,/sJ{4n\!wS z9ʙXA$VQ,+O+y5`T>+ H[p>?u82iI8_[mc՗dh{*>|ڣњm[sgB7?l 5 %Kw9 ,t_Ln^Hf;cztp6<AJCws*2!]!Y͹`DC7 6`֝{x>)F *[=5fjgxid1E ):go,ad3 !Ť7PcRNKd1 Vf` [.$`ZXHvBQ}>O䫕 *k bl$m7W2V}%k+2Z9'l""BQ>oʼ$tiP&o ޣzIt_$;mwL*p&Mla#0tg27T=T%FtNJgBcX9+òO{rQ@⿹8;D?sC!^x m;œc|d= =4 6\]TN'":|+*F=d?fd[HL{c@W߄'k/%Oxq>.y907 VTnoB>3zֻ}/ g0jFUӍ=nTkG*te&E?zRvG 3C0pL(VqiW+d Ϗ7.GT/<׻=F=h.NB~(AZAQd* nCG:3ggp"πyԈ/K* qNAoPY""{sƭMp38T3S{|KJCK (s=vЯ;H+D R5IOWĔj$X,&Pv,=Qp突X׷ynk.ғkEB?8Bltv?=emp5~`mƒ geIZҹ_hGr~pjI_e-':{_dEz.?8- }X+ݚ*eNSz|eYRSzLB> #5x$\:`5cA T*PXUy" w_%h(>^ inޭsCY:VqNewTAcm)?B>Ծۊ::E9l"-H6d(Y#rqؗ{#7%y9!2S?YLc;,8K{"`AE"VH ,"Ή Q|.~ӽ(>c=!sWq_'GrMA8ǐ!]~rB\r4Ɔy$c%2w˶.dF(h C\tcҳ/cDB+Dh-騵c"Ct0G0 d%o&uX֢|~m'yy%"t!i-,)%OUG5Z ry`  g\\Gb0%P3 Kj7HO_D@:{^ٽbjN$2[8L:zӪ)Kw2D?j=8J`#FBCts5'S{o&íG;F0!H?Ͼ*2IOP 8ԃ@vX7O5K-9NHrqWt~?܌S5)ǂ׏vn6I9GD;Ptք8 `۩xCv/~70MZHAB$4mB?BC+׹GKT41?Ը.>~_4(D&싐OF0)`B9HTʩ\^d({A!_*zMmrXIE Y\X~Ick& :laG"`DApm0s&2t  Rjܴ(Z4,'EF7u8҃X)",V& M~g<2a+᱃H*V8O/k;0q4$/,׍0'c`),Voҝ3BUsBE&2 D<>MDV$^yld3݁G*\h>5OFqcIyRo ʝB\a urq@ʹcS~,U]p,1j̷fZǥyépiKw@_sY>N;jtߋ$3Ԛ$^KHF+%=Kvlh %Zۥ%zoֶw5oߑǀ?ˡ*U/c|%,xgdPD+4/WkKU45S̷e~A[F ,[R7)2j^@byr w zս&w [*76ohD 5w[5Z\t2 ?+lI+:f&cԁd,l={x\ڞWH,NEd32,7"s`Z%A< I-?4`~'wH2p(`!G Է+IKhe\>/DyӃ9_ʄ|RWWۥh`An3sCDd,}UUܐ بڣtbGHEZ6)_C^Eҫ(C5&c&_{N3M#zSjTm:Ԟ -%*LT0Af=w#f s'-5M0' / 8q-sEj˚FDPޚ{ 1TSwllٍp k[H8Oʬ+E_5nS(X|@3QxEvAaX2 k"]|٪?JC<[ҥ(sn)H"DkYҥoxqM2DjeGp.M pfK$0lo/=5G1><ތ,= HQ3*|k[>}wDL,gEAຯ*1R]NCAFÎ6z=OW7!NոHp]s"C٫U V ||ɤ Ci=xՆF(=hY6UK$Pz0whe/~8Ըw zP^ +ada&..uA37WQ#AoBh W4j 4c^PWNAK, / qG hյnv <)OFCh$j#t܆%͡|Bq;({6rPCjЈy-r_'(/j:F[~ LTn`TUf =ZL6uI6ebӇ]@NU'[BEtrݖ;*jSG*E`ϪaQQ} vf" I4@Oig4|u{37\0qm(`읔+쫹827lIŃ/U qS{Ą c4İgNyD`6El+u,C*%I¬|n=oԆ~{ HmެXl#ؚ1x<==1C"S4a |a0A 6hŽ a-g!TIƕ  p\cٶ̷]^ 4}gѬ2K;y =v`m| ݷDHqw#0>dQ^6P4(^/<֪োk:h̟z\KǠ'.r|@ ׯө*R PkHU#=+jZzlRo&֌G_GHowxZXlM.*!5GWqăf5+"p=Eq=~Gj5q##K>s5VٜT}sE Y^?sV%}sf`F6" U O3v%!B=e˭>}~%Cu5cAlqɸW10"Zh]J!?v|I<Ե!t =G@]:3/4 _qҍG>Q}ޑ`9 11gUkF‹8-pDR1%gB6m.gPx⇗}3#hΏj9^"\F?Fo1=<=5+,'emWZe9߃EÕd!cO9Q9DV?A\n5h-t}Z0%%?vP"۫/:/X~ S:^7w;, t'z"R:eaG a'|{7}\~OƽA^Ua* [ k"^Ax;vl-G2B^|. uz7i:SGaDX[8}ǒ/϶#kᄭ|6;ss~]tQ8 jDb0CG߁nAD*W 9*_❥$ ¹h0Y:(Y>|app JT6ɲSFt9?PFˆ:fb-Ow~sc*ooR1^KWª5:#ƅhD}e=COudfdYe"?y<%@j ЦK*7nv*ETe`^!t8{2z7Π} DhIZ!ƃ<},-;~B:H~M"7譜NF.ߴȒ-qQr&]T^|Y:(!ER{q8 oNZ`v ~sLKas(>7'8IB~_<=}gA6qRN t%] zlX Bx,<^, -XXʊBIv?O=xbȥ!F929g[."F'Dy[DtU[d2˭`F|n Z箹 NO Iܤ|-Dwx&'NAџIە`'@W6=N-7{CEڜpqv"\yؼjƝ;"Eۑ#{U (焓ވ &D/E0qvsP wsƐ usJɍMPdNOi9Hu=;il M2vW#u Ӄջaqb"jY l#.a΄p` ̘\{<iLZzpKK ɗRdjHDdMVJf,W]Cq-Ԓ+'ܚ2#2,#Ið c\knn{Dj䄮'`ab1`ㄞ69U8}c]YD#\̣;"c v#CO1FFL(w#=ǝR#R{zu; k.:5ݵ+v{N6`'܀Z;{$7016:wk5O]!NXXИ=UI^ctJ=6! 5ͷ^Wn ֲn1 Q^t^Q, o܀oη$O;XT,2` xrǁ"ZLErNkwD0{ ]2z.:t:^%Έ9=s5 ,zMcS :Oݶ܍Ec z vB.L8ౕMAʕry"##"S!=Sk0ؾk;7 VF4_ ?mg^"я^nA̡WnFf҂< 5m`}Uޓ6V? +`@%"v5!rT" _.)ǗW|+ڧ5ga톕+[Xg!dV ;vRW.ZJ4R<I~Vds^zNSn0VH/,$#\^BȕqވF?gKPӚ.B G7ĺSP!&H[@U{7IJnW#Z4tCټ p~Fvܝ}L0My( q!nmBaŸN1t<> AV# q|]= (q_wA7nr,m@DQ8-Q OK.:#/柘1nCv*J;!~%K5E Ca 1kU="sFKPQ OʽpĄt 7H}6-cud8` %`*( (- c_Q%G7c=@5OM%Ӛ (zrVNo=ᱭ"` FlSB~NpD*VvAlptZ]slBHW8a n>3 #&BnIB<]c"OU<B uXXh0l9/:֊"lWL- }iy p"2l3}u~qd ^#By|lN,s1=Nnb|NDRȟ-~u^cL߭~^ {"nBd89Nj**`[p oĄpgg֞y.x@g"XO#_#ed3WFl=jB%\^ @|}v[ʱTkHM[u( PQ|.~ڦ-Nj^3;EO 1dغ ĒQjlZ'+IӫJko [U] H"׏tLBj$ t-tzFǗ_E^!^5)ȗ7YV#r=Q||:x$PB~U}2@V'Q[ma:o[=Q|NpBw:D >gP!9b &W{Zى5PUz i)^:%ʯTo, p r߿LpeFχ:EY; uJ@1"ۮ9ٜGbq.~ Q _ܲHof\x.e C,x*F#;jkʺ &Bn&"D \){;7vNz;'^Mbg࿡s[@Ō=o^'[!=mDɸmՈbOVEd-'ob|g%?a&׽O' *^IKcbAvۥ">U>DObusi{#1gĒ> C,븸[DXwNu}E3[Z|jHVD^=4'l؟H;I"Ǐ 樉|t_vW #WQmbVX Q,?| ƺ5E5uʙBQ-۷-~#o+Q4_>) 'uAZ`sE3k$eƧt!Zb꣹!Jtr$[-5A\}0`ƙ+L?pt߯*Ľ# Xծ*No9Hk8b ']ᤋ){!oL,P?].)?Wq&bPSlqA"A4'-%_ ϗh CKBa ,V v䪲};PjDA` ܣ[P]FG.NJC* xXa$ kif=vY`LI]eb7x"8^oI4f^ ۾cE`0غ#=g̘11|1~쒉!\(?S,XpAX4bDB8δokg `ؾ0~v>*7=D{Dck "bK~šϟ(ʅ%/J4pS}6@.k9Z䯖oΉsQ'rE>&V=Q|.w 1Ӏ6sm\8|s{;ַvB+-wh.Έ,D ~ Q|_?!$<=)_?{MÖ#@}lj?f~<JW'\Q}Z®r/n(*8VЬE`B'ۧI`J=e+wYԽ] ώ2mMB䆓N~8䈳u[D:ãWqg&D"GnGvC*NzgBp?Oc+H-b*&7EOBtt)T*W ,l@"ZiWDQ቉,'[| bve}ˏ gnǺ᠋;b9"+Yr_' ṧg,b7+.eőNE-3vu Qmɧ[-C,׳ۢRy#&; uWc@b=PZU C Ԯ`m91Z̓w4vWs^8c3|4UlBPj!_V;hװNU cV+M"qs Ո~s^@@(mE'>GObX(!`m~˅ݏ)䟺X.8iqުD)'\FF&72A {&M#b }HMrػMHoKM#[!^=.DN"t6"%':!9`4ѥuШ~w:Mǭdb=Xjw Qb=nhg4"=C) >'=S)3='=cIs&|ukQ2ij{sP4OIXބ|[}e:qOzH`7Ŀ9XxǖJ5Kdηt?Y\HBEHyۣ12 GP ^_V|I?AF{:Zŧȵ`di㛚Ӌ ϧO8Z:s`㻕tI5@0R6(pq 5wf$֖Wؔ. R?%K01X~G>?vP)c=^y^ s@GD3y!ʑ(w{:ޝF<[&Lޅz/b=XY\tQ^?o7#̿ QlWvO 0O-U!m.} o⌤CDp"B8̀ 8' "̅l8>N:3߇ Q _z"ZZ$"5w)>3"CLg(D8Hq^-|;  Ծ,g ?hGDj/T΄t[J@S° 8W '7td ^",] {cwXPnYuE\ fsI(`.rRkDmEnOBֈ8E'duA)H,ZlE\abbD T8f} lOxlE\rx ~o7gY .QP e^XΏo3^{D;{O޺ҝQvj_ﱇ D/Oo ٕd%tj)!SYw<-aGk뵳^-zsml/*Hpx"l|Ȏxgv@_:tGD1>W=A5`Uq'5I9`~Z/L"aY&/5"X@` Hd4\& ,*hzFXc->TcP59v -O *z'K%*HT T8P+k.9{'oHp]߫lmɏdnqN%r =scHdr&SbD o:拊"#r|v7#n{߅fjۼU߷VI9ߧ5@87(wrߴ FX '@Zo$'+eHM?pc1s8q]L;,#+ًOHoSی֡belp,^N`R.Z"艓^x.(3O]{ݬW\H儻_݀Hs~ CL'ɏ $MzMZG\Pl\Aﮗ,K.X(޿=4^C={. Wi=owj+$BGŹs! 'ZO~Ԭwo w>;=jqk&3m#Ug m%U2D|ysCԖg쒓\EovﺶXD zWA# hv rcBs?g?\,_U.oZ&·(QG ۱wmL`=g [X7Ш%PB`tZ2c{S+ͮ'0_ZU Nb y" nZ3#7g3lB8ܘ\>!] `daH)Ac%ӱ[G5{Hz4^(鮟hAsD\^K!Ɨ+?a/Bǻ fdz ~QWgx>ƨsq*'V! .cۼ(1``tc7(!f_Vx{e=%-kQ{ݼ"9FLORn+VҘK԰ױr (;OG|)Z&c~g1{\i:bΤAx1-t}Q|޵!sCM!/>ѱx\!:D,=F?#_I y]1B$Su`. 8@Ζ.Ԡ'5ǙI TtsMBCm 5 r21v=|~ob 'W Y8, Զżɱ?ζ˫'g*ksQw8A(>]<{U5b G#vxRm"XD,ul9EA-΄x)=R9WNQWC2'-G[xM,jè;yB D`V)*5S&kZ5Ncq:|jt=T 3O|nJ0EJ>]W 7I Y1LA8RG݄JHDjZV+8EYwN"ҋ9Qns+8u+wSH7p WpѡsZa9-DKg<[!7V4";Ip777yΈ~cgzF!ND`̀_8,XJeB_"/F2Z,zdXDQASڲ숢HP2{0Djuvh{+fTvU$"{$ڲoXsMDz4 R"`b &B8LT]DauFvDjsZ6<: E6t8&&2@yxLDHp("%#gżt[j3s c@3[=>CHė7O:BZB(!y:.M$_31z'Xryw"9YWWqjr=X^b^\h1Dq\ q8N9F|\ttw$q^IᤚrN;N{Q )\{ bKq)X.xVk\ȹ(7I[JQn8_uS ɹob /DqވiM~%QoitIԟ2&W+IE|?L7r DKG@mpR[*Ԗ AuX7Z|t[DqU!}'RwFW2? 6fZN/$={31Q׏;VM,:#.>7b ΉW0H6nS O !*WHr'.v~Qmelg \ bn[~DsHDc"]|KLyW4xnK#9#bW|HqRm -T{!ʐ bxtCUx RP;z$Isf:Z7(?SL^1?D3-'عwClR9'sVH͜>;'^>'9Klo"컬te`$bEv9ݗk(7Hޠ="دώ8Sʛ~Njߞ^;pK-8K,_z(=XDy_r(b O?b{ >OF룐wn`^0^^#z'S,w:nLn=޹}PDQ.+~ B4.Bwv m7SN֊D{0%X]uiw~菈\Fz/' X)bk_&uۻ +<1b_&=(w =h"O4wcpMt]O!&E- u|Q8(UTD=/(>g4fFaxVF냜W86qCl[]by#{$"s_zf9/~-W9+\/"c,FŸinvD1 N?1|1~b|DԏHǽOB"bgN3o biNρ9x!¾0}qr-yno&8 Ν&_(HMp΍/ qZa(7D2|AUNk6߼hL7}DLb|Em'7:惘=u g(,2m өu͊IYp,T~3"wnшPDaaa8#k0.S!q؍XDaOuq orR}%/QQ]%9x%9!PXsdx?cO}v!ܓ~ DGL砷A4?})82DtZ23SEh;DfzONN{:'[rUat zXDУ"R=+1bz7;{>1N1bzrR-gd$"\8U$YDOS9I][ uxhظx'[D/y,wO'ĬuD̩4WH1OD.:n"p>6{ "ܦH/E47"?A[Nb9b V!sœT_Ip#x9j"R-'Is{1>p'"=Gٵ_o"0>s9p&"7sR}4'WsùPDza0@ȶ&'=əU "/3neN__N/}6c/OD^NIsc |o$"WsN[DاHٜ# `8 6K(" v\a$bpG%m" C9:c}kw+Dz>9Sz]Nz]NGzUNzUNqf b[KKaR*'9iAzNNITYӫid|99sHrR'I9N;ŏQ|Nrqi Qe\NDz9鸏gO"rϩ^9<]UDv9^ "r82 6T)Os^M9ޔE9<.EzJ0wzFλu ^@whĿ v<7> *PNڶ#w,299-zMiqAzNNj߉!C,*'KrXD8Hױ8 NXWS!>'DzMNz9( 9^D8HrR)'ՓrR{tib!R=*'=I`,"Փryڏ7Hrp/ "=_*"գr.Z5Q9I9Aofo鱈To zU7D90z6NWz>NWzFNgz6Ngz5bUTIl^:'ջq{z4DzވqsT+zåTIjt8簏MA]bxCx`? 8^\`Dz~ʾ HDG9afg sӌk`zGL\{1R&#q¾PDpTɹHXD" lNzIN}8!q'=I8^{#7z#k"q>T/ BS|zv D?1cqR']z'NwuH`+D;9!R=' z gDzNzޑYeDzq9= 8#]SoD`H3$CA/Dq}G@v8aU("tF87}"THpR'sHrk89>Nؗ 8'= ޅ*E<5^Tok7DZ"[qOU4>.?+g(!^%z1Nw^q-E"R{!zPDws3d'"+qR;`G6ڍ~qR']z!NWz'Np/W~9>N897}76TŸsca~XNz'=IDpMHF'q}p#^$Y8~ "= !6psP R>fNz_3'=ރQ='3p{'9/Ԫ(>9*NΈsjSX輜zN jT#"kpR;/$-8ނNI9osAq0V/DY '=GIQ1.u}ODI9:='#uzNwH9݄8iIrnX1S "K v]a_I "];g2ĖMHAquwNI9+N !Wv8'Gρqs`']tݟqG!º|9DXW uyN.!UKmrࡐś-ڿ a~IRxˑMW z9*.En@8$f&`Rt3}㖬F*!mb;ήGbZ^,p_ X9z v3v=~<>?, leԣU +F;_Co> E|ѫx@fg_{ Ԯc̿~m7=W5`s߃sZp>+c|8T KfCxtzHRy%N~)sI$_wuՎ(D2'>?gty^Nl9Ԟי*A"@OyO #77G⼇EN9b05wސrG+GEaI.NY +<=CVs =Jk]wxiϕ}c/:?#]#]?cUY R󪸞+qp=/\y%D*Py,3yyvjov]NiGuiB]zYTsS!~KTAOڷlS"f: |4݉ 7pEs#:4sHͥ [}Z=kK.!\$x[ͥz ="A.sA?A?wocl$sy=h)s~B 6S[,;>Nn&Iy&΋ݑ?WsT $Cqtϡ\9=R} g FoyDډnG o%AzF@-a%_ǐ2VKyv=+TϹB3t$=su=^:o.9TVzG#􇤽z ws>Ծ%f2>f ^/ss9~N];; kB5)2DCq<`'\QgQ̇'dNWu.t?zj D} @9(`R1D gSͭGO>_.܅g6=IgQYHMk^ħ׮Ǜ+Mq6oC,k_`l;}|l?Φ5N8xL"f8WHρO8b6՛qιupwK=MsR'B_/̦zٽ-uhf9N"=ͪN}v.C8J7JHc|$AMaͮ!kk*H؝| gS;aQmC|sZ:4a>@TOGDž~s%.՛=ϐyUQy4D/{;yI=~n G ng _EJ0S;ߨ.,T&Yճ}ޣlEu6%:щ3w?wp+Lc9B-\ TTOINܗ>E9R{9-/CZ[ >w pnȡ+P>ܦSF";~)P]sV{מEϟͪ|3\}EYdsξj*-Tާ8|t_r.~ EJ՟ُ̏gQ%'7rfxPgEEr{ւYp 6Hs/NS@ o_+f8@^W#dDdO!~ݠ`-h10 y9#OOy Z}wV^ 㸵I{'?=GKLckyyGAC)r|!:0& V!둮Q1gː;-NМm zCiWR߂hK{iڸ `{m.]z3.Ut4g6i] ե=_PC>B\s?=2 Ton%+Q}z4SE "iV+.4==Ȱ~pOȞø_ zLzD|%]?FzpZxNɎoIs8˙L&0ƓDgṘ^fa|`IL՞`}b&s^;ü#/5DNgߏ|3k,"lΓI?ꑶ?3wIg&'`Vό }v$]3eI?cޣے~2?5r# /NS>|A\_)sUVB8p*qN'I>]$A: ziA A}݁#"O Hpkrhq!!]U#z(k`ׯ ⛵)@ cmce;TTOHāUc{zR_[=@'c{ ,\h>Ao@|] j^Y>X.5Cdg(G"^Aczy'H<:Eۃ^WGE# ՞nŮg'rppUsx0pa᜗gxJ`g;9(=49'4{t~` Pph0Pf"PU[)ϡfkD<8P{*nJ~ (8EOC>tͶȉ?ST )|zʮ/AS<'s扫?6+']Wzv,s'ztN?n?=!wMWn+ū$ɏdYbMݜw}!wɸȏN~s~'4N[$Gd'oi8:wz5#6ӧoC#+$5eF#t՗}GC`=S=8'ܯZhUD,'ruR_Sӷuө~:N])ۅ5ߟc]N@tKɛP~O2~N5ߞgUeapq"A:5A@)41@( -@ШQbq*D @޽\ga3Ws>׺7/M; y=-s$ngT%dE'1MŽ)wo~OȿaO@N<^}<vӲ|n>͑ME) 7 \}/pJ{C/',{NOֽ`F4~a S.Z^JK)ELykj|awVo&+¾!v泣>S)rҾDgĎQA֮_}7NE<Sj9 qAx*ᩞaQMT-/Onu4؅j|oأ}XOqw`6Mt'_~>}~[z3>k"/|QP)nsENy6{i?__W~ZU쿃󦈭_ިTonq'+k*ͦBo.[zz< Oq5o]T_8<7 '͕TqOxn//)v2u!Y`XSao4u]^i8﩯+<#Qa4ֳ1:SWT2y?MMltS/_9)SnwM9%!+RmuO؉L؝M)۫y܍S6v"SZG_/zeZ(Gck5*11p돧ȾkSď)ʾcI؇"v"'95aA~>;[Ƈɰ76y|NQ/rp"N~?򝼭ˮߝ EfWߌ||%ܲXnS ?n\3J {27;ɖUƂw>KLJUʾaǂp}NbDe|K7y}eu5n݋̺u 5DTrCof. f.,gdEWZVsd*ȋ5zM_:GYW{21 @D|ogq;g;教@V2ž nj8j/ Ojwt)ټ} ~G+4HQqȕcfv9ݣŵY{,\qՅ3#Z4p<"ub?Fqʱ<%㎿3aw LҨ%k bґvq.`WWW)[sLfy27G:ԙ2ҽxif\<ڭ..~+|jyv1 /,=WƯr.8襃go\4`D{kO}I>Ů? I4m1πDƮ]}|\*vŚ\x'{e@ɇ?Pnô e~^Z W?{sv),a#WsD~ / l7fuRVfGο+&yǫ«u+nK~aF:6uO2`gCV9dou[tg?pa?vtc\R N-) kgҡty m+mU]!~AFᇛ R_ K}\az]A=gN9g <СJ_AcKqc:8%;#L ?stqBan^ݐ ٚ9շtvVbg%7i)nag:6P%PW.5/FW{ўӱ$o=_^]=Qm?۪vWxnVXRs}[۱KI=|L>C ~.Aľ_:t趥kpX'J=ߋ\}zx~n7I{L.$ؿMy~ϗBG%/&z\>䓉% ?qkg`GG~]>DĽ1{VҨ}ܺy&%/X~'k?gssR?}Ib!LR&?`7ĿxͿ&m)v:kH{6c$&ja;/:_(v<'BJ?/n(v'ތ8i%=gA,b+bwHQϒh#;5z+AsrW&~mq{/^[]=8Nre},׉}"tI/PD輐+Ny%1x'W- BaN>˪ zwұ1n\z *F_rSEKCvw>}B&Z~;ѻqgG zT}`|Bﵸ^%9,,RrN'?vD~_]!DmN~]=ŊbwSHs(e$/QxBw(mñ:- A' ~M^uhILj$qE)ewp;) ׾^/^iAw?k<& vA~pΣȖG{| p+Į2RGiH$tI0*suQo;}d47 E >L˭߉rE}NON;"RҡgGzO]&՛-oK Kv]^^r ;sWN.)Mt)%"erHqqiƿnt>Q ܊D ="WC=yo,TY>M6|Li`w4d}!K?.~H2 ~R$a_yJvG H`j1bˤf[CR%go 7`?~rUc;Ew;a/Ā:J\T(vDUGv.JGx9o 雾a并ZI[ܺ$~_ #wح?L8^3c,VK? } 6L ,E"Ӛ5x?qVo$.Jb[+U6iO/k]vb-d>&sqc_iS Tx{:?|K^JqxsI~YP媴e9w' >pv%ǥ)RG/"xxɱ?;I/WΝwo]vVS@t"C?o }zfTWϹQӯEW]l ӓyK8 4~:?,=܀I=^5mEe<:wem]QUv ?6a=)5]7`M~_]9Mw?#n_out&d⫮>Oj}؛:`>Ջ V] "l3N'Լ+ 'aO>+`=A1cfOvsjEu vdYP+ W$Y&oS{rE _8^VSaJ)BKmSfrg_q0A~puLQtF¾*yaJB78|E_>) 7v_$H:J8#䘴?P. 82ee3 G- 8~q$kIU;-)c[8dd=}1~n$H5k"m޿Qߑo|VyǹG$?hAwyg}G#n< ?,q4H;,RL+B ,Y$H]Ԋw;K?? ?+2}'qŊBE%'$c=qEӐ!ŏ&R>ġ/QdgY"Г!O(C_]6W? )~23wOOQ׾~P"ޒT(v8%sK߆\6+LsEk!e(VQWRG(L'طlS vtb~LU?)E mX^]/߻s"/<> $'HO_U.W?io(?v°k9U7uh=\Yya!erH~6$tItY6qIS1DG^q!k,Q$C6dw_6螤X(aЛ uH됰 1'Cn+QP8E!B)](Z5$+HW W?Ńq?7ß)v ş"[~̧ce>T=Y7IU_ v䅍j\P<>?~ 侰J?4 iR(|IB/gE-Ѓ&׮ܮgѤ'(JE76*t[]շ"tI}N߄~1A<_WW~~1:VB[l}a~/_!Bڦ=N蠓>kԽNm= Wo5y EQ}5 jߤR kv$Ix avә(tM}Rg~>IᐲN*UD|qIrh;!}Pۖ-}qO` >H )QX;iK"I]z? (ve׾9?&_QaoM¾]5 jqIS{!cN~4 {ivdI_\gw7WĹ)z˦GoSDMvӤ'tIYIO=aNr0Eإ;D|y [ol[&~Q ?,~$HێEΩh9Z~Vzd}ZE'D6|RE;qE+6ݎS%͸u/hQ!D?xEz}pE1"/Y֖W(kՓ枛ydD6G|bz[xrעRV)?_< xrky_(yZ"I<hѾg+.@Izr2C7 m9 t_;z O:]"OX]Q#)?-gw G:߮(;[Q/N¿9 oo]$It.PK?NQ7 ?o$Ik{?_R;+OBE_%LϗD)qǓg㦂heRy}"In?I!ϛ6f}}_[ly"qVv6QulbGG)B_3ٲh /8 eRJ/.Z~gP؝s$o/FQ5SHOد"E_)z'(RTcLS*, ?Z~$l'_C~Z$¿wmE+V@Ik*[Q%w(R. >HEVaE"Y|qH@_~N$'R{׮U'H$W"┒s"ůH~M$$H=O$[[+j;bٷ~N$H_Q0~9E¯8_k"DJ"Ea׭/=!!C~G!CO_ M#N)~@6^T6EϠr9D~VuEU%K$HwG*" %qHT8H$~WtU{{SEo)ZQf+ywgE?orxQns_ $q|HwIKZ$/]#DJ\E5؟&D" ?&v3ů\qj$+"~ ?'wH=C*v*)REA2W87Y EcLLsEĩ bڏSyiXfrE~]P:nE_} =${H'!CN"=WLыrCχz{|o ?,Ҿ7H[NK#Er_)qN!w9܄qH[_m=6ه$m0iۑmg= zҶomx]_`HH ~%Z?mj_?{ouf?%+ǎ_7Q=xE6ݎvDz4:7~}`OMo_~ZZ=hϦ:G))I v~`ۃm/~˦ u{@o`ۏ5B^'S2VN;8xYveC#>)yv9X(5QjqΎ cSKV<I G#&9#/+O_1 a H! ܺ^ϑ&L~\"d%S&m>|5^^+'+6j}o(=mkE"I9V3 ?f~$I1c&,;ZPy5s +~[sE56ި?g~A|CcEW(EQ(¿D8HL¿pwܡv9ͺO^,W3 g$IV= F%+^/z>يIB<9~$q}~$IUK%EO'J$^I/%Nypat%| KM?IVDٞ?~6$lHِ!%~O"Hِn_c2eH~7}/@_Ĺ/+ ? v̯SaI||9aagJa˧w?*$H^#7 k'vQw}>H_}y2&za!Ejo>v%g2I b/\`$}E=_+WLHL8د*¾=< {_$Ib`vşLv/]0 <}hE/&o7*>Ί/&aOLž\jE/&e]R(q+tm}~2 dREH3(Q|?s+&aWL. a@zHv$H &e}Q;_v$|ɷ)LqϏTqH~.(zJ b[(zJŊ_*VqIݒZmZ8٤)¾]0w?{{?钰7 e}T]qLEaK®]/)ve=jG%ꖗz-_\I^ #ic_̜(;dw;e+QG<>}Cަf_}TmHW<~D+mxdPf<3nǟul"fHՐvxE6]v oC^˷U2q^7uv\ǹM+>㵭 "|_=eYg |74~!?V%^oxe37!oH/_ )ze/AcG(cP? ~+$dHY_~0$dHl$=H} AŸ? bdlբ;+_텊Q  Ad-Hc#? $7H[#%E}H)߀? 2W]GUݳ+RQs_@¿ v&$C" yY[EES @c?R?~$+ %R"# ^Zq+"dD剎7 %~KuE[#υu{"H/ %ELnZmSBޟǾ2.'+$E-QDg$Iᓰ'aGOžD_M١{yv$I aN~: {u$tIا'9E$P_أ*|gEbE]2^)qAEI&Ǧ]P/Av$I9"I趑 Ny3;fd"3\},YQ"aDQ"#G$7v!NX$I+@^2 ;"_(Q}!)vD)#"%B@ HR #F*'¾com!aC>})񊰷!Ş&Y3ϔ(^ b$I;v&$HȋƯVu:)~cNKHXgIބz{#'f+=Vsي~(:);'{s ŏJWdW_튰!aCn?bұ1#.sj/0Uu# ;v+$RHإ;!aWBb]H®9~ٹъktx"JH=]is$In})za/BbHV0E術OV"E؅'aBBx% aA?Q蒧(Vb`b%Z$(y񛑊8'q*>ĺxLށ7 },$οIwDB J_:W8^QL~sE"H8''qNNVEїh"^9Zqwe~L\|>)Ί=z S~% /]䵟mZ(8'q.Ocw'H;(~~IbIMx}8'EO.-{$Iz6^sR׷).+}tҖ-G[~>ߖH;+P2,U ;zg*vKW]\:h$MH6.d_s %~;Hy&x[_\x[YKNU $CH8"zR'2V;~ԃ{myBOĹs%NdGF)n9m+OWh_ĻQk͐?Fnl/_{dfNko ʭO7baL{!{3﮳wl.ɪX82gqϠ*_xzdPI)u9j;bmgmu,_Ut6zHEWǎZw7?g;cl+p ewnp ϘާggR8}Kc7zY a:->Z%lR/VkKEv5ڵ#ɺ'zvQW{IHI;N>1%k^Z/ʕG/5钿Xsg_c>b[9ڪNH~1GuW'&+kɾc'd[KϽ#Sb HI|`g]K|&g/E?ӕObQ>w埸͔\ߋ5n[ٟ.v+_m9O vz"}gR?ߧFe`V׹r3uGVɾ_/Seo4=$utj7LU(vкثj/%ޑ7˵8_"%}ͿI%(m/'}xa˥NJtlR:tb[]9ȴ#See\{OXr;&-~_K]9R×6ݍCnWȺ ֕zIV깭}{JBFgOL|OVʣ'(qsy?pճ^:J;A<_K~=vm"zl/}Ck}oKcᦄw&;yoy2}wwx+Jݩ4ZN-J6踥ǿتwh6\zYt{7/s} x忻L_1io+~O[o*K:u5kj}=o^*2_pm+]9t;V网nmuuxYRn7^>Wf5r]֤ !vk;}j/}Pia٭i =oćtd僮^u )Z\7\w7q߫+xv}2!?:eь9y]ea>qѵK.tݵ(M!~ttSgvujVtS͝c\JxbP_ _Jpw{js9zf=DZ~pԯQc?p]GDw宩eᮿ.a{Z|PǕ]M<˻0~W$W_vիnp߼ \} +~tD;9A]|تE;vYr7R黷ݸ:_x{2ٕcVqAt㳩(.sKtq^ty\L{ϸﲡ=>uY?zp -|:;Yuɏ?quFwNӝ;+;vW#?QyyS=rPQvkޝ^CϝNI'bKw]-/n@rԶk?t;,m{n~m@8n:e_\visg"uQlo}:w#s3oq6I~Ӗӵγ[\٭w \v^39nX/wuP֓u뼶߻u~wdyV7r7sS3\өnSGo: nwg;:}/۴`sttg΁w,vR8׼M\yѢuqǸcPVYwgK6 ryAswǮw_kWwݷ $*wOhwP|6w8{_5ks]}揟rMwvs3k<)6{`'q5KCNl^ȓ~}Ze;uzCyyvӭt]U/Rݕ{B }r]oǵt>u ~Jw߄[bsBup=Eb$y͙Us(UyT}\gϕ$LnƿMq14\vb׶x/8Wƍ7h { tvvK:GջrpQƹByۓ-m*'GqftooV7tG߽[p'O]9tǼ6{w}u+Ns!yxCtq];QRJG|nzȸ-]=rp;]Sd^?g+2~Ge~Қ's_6o{W>O^{Gvwi~~׫e=&) ^.so}$c *qcMpVm󭢵M{4WJ[􆫇1gۡ\}N2Od~ղe~/yUHDIw&ʱc'gMs#=36uw&k-Z,s9OdÂn2??P˕2zO=/{~ݵAdx_]~l4W}IOIwuos߁>XN oݧoֆU\9u2})< ]vF۽(7o~Z*}۾/ ;{{_}я)+~j+~ХzϣIKXf{w}Z~d6-{x +ɹ\3I8JB\뤒㏬vzY okC«~zpo~CάzEC,5՟!ru;_woM ;{!f.Q+!݂ӽոrcRyճ!kb~!km熼07z2DO򾳖ѽ}}]}At>w7|'uoMc]zsC{zG\˱{d?.{ }]c@9C?2sC?\v:b P) ;3&7.Jԇ.ƸޕðG9}adak\9íSmk|f}}}\~wE׻I}~M/wv?^]z~O]p+Ncji=_3Nd{En}.*>a#; w]7Rt>\{T7ygaϸr9jwjOFBK7=qhdFx?[&xȭIߧy\y0ȃ|5wr+boȥ sff?ײEʋˎ?+בWyq.c\{yɦ+彯q'ku+ϑ,z7M~Exw$6{-wzĶ)n]{qmw%׉v0g[qڈ>v4J'F\1Hg_S}np6`'"R;B/>J$?$>Dr W?w\bxoxͤݚ8W߱hh55Y~yq-}ktxK{n|RngsRy#6xy۾@aC1qqaYE)}KeUyiBxb#$^ˋvŸ`W'󆑝7gG&h+#ge=+㽼/U7GI=<9Q?5c[sݢ,O=i=ەb˃Q-ۖp{_W~=tX{1^<ɮbg>5v3o]C߸u+KGw?tCs\tu{>${[t!g?/KGr7v0T\0[j&H|GurEQa{s(7.zM TX?;jLqK;&gϺ玮E]]}@y/2'տMhӍ[/|vKy=WFcc =\^_aFE=Gc?վ_ e̱ݿ\RW] ՘4?c~pc j>!׏8{ޘu1yd\~`]1&;\=1Z_Կ1ۗ=+z0co5e@k,Ʃgo{}wXqtsݏ}Fͯv]%%.<}'%g3n3vdGsǦ7z=Y]worsS]=+n|帻7Vs~=OwL<"YϻZO;\z⇒zcˑtקXڼs_H1'U+ԡ光}?BG~'r*F>q{k/o|(E(R)v+>;T{(mÖ*bļeŊ' $$!!$;H{!e{]8D&bh?E6yR(z1~0MfɊ~8_QRD?M/?XEh?)~RdPɟM x>;*FQ# ,SD!~h$t~IkVD#~p$%F]vHH+QD&eu?D+_K SxQrghEߦ?F~')JlE{t{?,WD2~$I,Sľ )q%(")~qocG" XqHQ('DA`B7> v$06J<ą$aDtCI®$hHő!%.h"H)W"Y*on"HW<[D"^7 K:I$9$8IصntE؉@:P$rI>}"m~k566X Fv$~Is=;c^$$#agM~GGPے5Q]7)HE؁K#Ů }8^>Aϸpm}^r1 v$H?~$Pn"Y1+ρnIZ@QK%LF+>׸REHP?&qnB~Ξъ?^b$'J<ųV^ŸK_ ]\R=E-RUq%16=(?Pk}_:IH]?P>1 .z+~+?4RtE_9Ve$HO+Q3 gp$II#qqΑ'?XORdݢ)E)PyYuE96]t;+uos@$*I葓+'a7LhE;.V)qǭ{8[~$HI賓Kj[xR{+^7+6EU- }qiHKCަeL%{/#4 瘾Dq H- et"νH{矈CtǞ|O;~aі-G~x%nE}GkQ(+J\ՊE"^)xk7ܰj"Vv(EOTglSD!MH]WH?D^%@3'E\(lEo-VD>Roc颫\U]sW(BxEn?}BM|x+cߑ|gdsE/\>3/$R%$tXH$m)"n&iҦ]CN2vc$ WI4?{/6ϧ&xŕamWEJwxnE{=⮒6/?}%Km;΃_=9$Iqx3wwUě%nrTLl_j^vh%NE+];RUdfDe)'%NN}ū' c/R/#Ǜ얶bE襑 x*>LME-Z`$?{$JB\:"a}WG¾,LzmZ\uR\+9ŝb-WEב%DN)D~>/ LYU*9tE_~6?Ae;3A~eW)\/M{YhGJcm'b;C)M|ol~цR:z\o~گ]=WWlo`ͷOmMcbWWEٗmJ=k\%$aɹU{wZsWs8E,PEj?0rϮ ִ_"PQt|m@Q"OrϙY_T]a҈SSrE8'sLrgEMVRU%_:j-V3ÐЁ&aK"4I([O/0E97/TK' {OveF+_?Q"4I{ܽn16# (t؁ 'aJ/|끸RAʵي$Mz'JI{=Li@}E7U'wK6NrV">I؉$qN^m3aH®74E9$e߭L:?K\v$t-Ƞ}ĺt˘'(:1A~Ky(B/,nEŒ6qH쿑$?9ܗ(Z8zd=(WDRc%nCM]% Jv$I=~DN=EMgYu!)"E a'Id@Q"S.2Rq~HS>$$I菑v=3R$)®DUMn>H#V)]!Ee$E_di*CO_%)=E$&:rP⽓֌QD=r‡fS%9QMawIB9wa%aI]f"I$aI.8 ي I"n$YYg6u& K^gig+vRt7פ$n(ynEߟ))q5Ϫ}>$9Inw؃)첨ޔ튰$eb7^O&e%JΓhEѝ-R|Mm)(isE?_slvy}+w]g+ܝz=a"tI>bÄw{ ]2v#@>!E^/d֋WDwĕW3Eo"H+> &g]f|7{Z*0 :BWW=- {ZRiKߩ\$gɣu(Q=G`?K~hѽYe;ݾl}KsaKJ|抰w%aJ>tΏ<ΕeIej+R+ W/$_ɍ5(},b Uy'F߾}G+3}woT~[?ڬ0fKoUx]wF)JE[?m% >Ҷ؛{at}_gAyk*iwe(q m֣P⃐hEuΌT ' Y^p!S a'Qѷ.;It}>ϟYhӼ&oJYIؽ5/z"IY'*Ž;)vъC'E"I"awNL}}W/9 s2;jHEFQ'(B|mي/{;(TK=; ocQC&mGC~&a?O>+G{?HU>[o'KnJ57d>2 q7?'∐[)>KtIOOM$HTYT -Z:uy2~*JqI{.qm^Eاh#M+lp"kIč|3pN*u=P{! *"&yC#WnSD~dܗ+$)t{OXx׺)#*[1vk$ժE:C3$I#!C\Ҿ-P~=HIb?tI[_m/y~ J?KP/~I_|3 [C">,i3}'gGhoM>w6c~g:w5nO>qӎ~OQxR?yrE_b6 .80S_g~mѯ~x}V*E<Vra{fT%Yr^?E~kYZjRLJ}uDRΫ-S?E3#Z (g(^ቆNK{,t EĶw6g(SmJ(¯93${}zߐrErFvzy߇\%c_"%;,P?EP7u_Jزuÿ}$}2OۃG{I/oK?C¾f"kHn>*ckh˖_y߈ <ݢuqYwD+JrE! gDL8}$HٟOV\RE2rk"H9/U\Eo4YQmW?'(¿hE3Cح)kW}s"H/"_DN7*6Ŵz_uIPZwعlzKx'(1C$HO_2]QN !Ҧ_]l=įZC' }֠za_=\Qt@i][⟒+]}Ežx5"E^qS-\ ]|~_d9%Vho'5S#}g6H{}٢P(: 97ZIa=;naH|'HzjzP2Wt\py=_.Bm78HÑwV{O~9H/~sBꬼ$6X Sm?nI^}.UюvAҎC>W%oLqj7O/|hY;.KE;{gcO2h^x:$y6\? 䤝y ><>g^d'Y;ڼLcOW{sZnYw01}z:mG%+@GO'3@>omv ojS/A5}'دf_μxc޾Mcm?o>ƎGc 7V}uE;/un[;yCv^j/6Ο@ +Qv;wm+%~z웓7#@J\(E9}8mEဢ_zv s=]zg+B|aъ\HE6=/@B%`$t!HхخErhEy&E"R /T^y9 N2$ H6m @B9xa$tI9(R^9 +@' aI~,!!J:$H #EW` $(B_]8Es(S =:$tH8 K@.[W$+B|>cE)8W2E%[@" :$tHzsAbK@ʹJ"t H9WIVؽF"t HKަ%W_rUӔ(B+-:J:Y5?(ݗ6%A: 쓧(ۖZ}t: %NN8>+3w(tCoS(E< -|P1Qy#W)>{"t H[#@~8yKy @"~iM6EљWYEЭ mqIHweիZ.~kd(O""gHΊ ?CRKk"I품/G_1 p]1G*bA6 /] )pedE"%!xtEKŸ? ,S Sv}B"H-~[䈩 f(Ō(ũ}/P: %v$I茑?&o6 k~F$HW}6 l~$<"~. ;mk_٦;kv֤_:HE aMς_ ;nv$lHo_~&IaGC&aBJhE|{!aN"^ ED$Iį!e^Fttƒa'tB>R%O'ۣEW'a1ٵu$I!}V EطWw"{'}; v$Hد~S&Oz˓~8I$CJ|dE!!Wg> )s)CB" y/Ý(ʼ7N^qJH]*;'{s"moTѦ#~i'T;BK m-$x\(;)V\1JOXxQ_"σltK6f5c CMG<_UO%_~my\{E%$⩐-Z|" NI{&S+o}sKA|qN-MEܐNvnίrmTŭO ⢓;( ?^zm"ֳ$eHYRD\rbm!Cn )C~!Wx^kPp" XX/qI"%~x@qH "CԿ\=CD!Re+"Yg*c ۯ =i~wݶ >WN^WS^=:;6U`I{dϗy=g|Ϟ=szҞOB'Щ"=iS{GY{~k{"E{XV=:۞Cg?#FBGny}I"HkO`dShdcvnX]{X{ bW^(vsWW4*. E = K&=We iLb]@Z{#kd헬}tIѻNQ6 }nRK=Z{y"WC|/ÉSϳ}EZ@'"ψD">Ud#o8+/lTƞڋ=y}@ٓZ{Tkj폭=wF;G[jkmí=Oq?4U[~`??O DQ(Z Oa/~Y?zG+ .'ikFZc'G?/Y&%ctH럅8B|bׯo(Z2of|N;v1 {DY??<}֯qIhE oUZ?MiBh%ߩK~~~q-A5ۦhSذn.~/}r?t'oޭ_՛X=7a ށC@߾OW^6 vQwMR^s5X(=Y6ݖӘv@|%VWΉqNLZ}]ǐVd#1&qnL{Tv?'w?o*ɓ >xsM=igÖ{>CgǮE-8X_:zD+m M{m~Jhivg}=Rh֙!Ru]wo=h={uހ^a+N'gHCե,Nuxf_IEWN[O^SknO7VY^luܧh{pyn)LWPult(Lv%ϼqmɊOYX+9t7{gk{hI ǶvG QѩAtn <ѹqŎKShuhCնv路oP[a?bOl鍎ݧӎx_v~GۿVH⛓vMnMܕ>&߼u]]O]ʣ]V~ Ӿ<+FӲzӞ?x]~Q[>~k 5ߺO[G;W>G^/칟cd׏~ζ~ï>ڃ_3&99_߳쾔ݷZv͈+CӾtf9=&Z4}H3~R6W ɞs ?x; _W md-[$kNl:M~ݓǡBO"=΄ SM"ELkfBt_DB]6b&N>[ӧmiL$60-Jca4Q_"o*Y߆iu&6 n3^9xaݯFG*8&Ng]9Pqٿ_~}m>8hq"Y3z[^3sĵN"\}"aKB HR橩3vU&\(BEC2C~c$H6QV|C-~[$HmⷕSuʹ UAZ"oz{"1#aOވ /$tkCs%6萢+OLh Ɋ#;uXc"HO &ol}h}EK\hwFb>J^5y66|zAa˖-w??~[?LhtIn튶`ۋ=(7{Sڣɿ}?|wIV~?O~P۫o=?~NBG㣇k^bE]_}|E]$2E'~$ΙHYE)~1oC燚?/V/~{?Z~c{?]I_?b!:Ocp3{]߂iO~AtGxM;T;&c[r~~y|þ-hӯ?֏PGkA?2EC'EvM&W>9i{~TE?wGxht<\hXYbNEX53#Z4Hm9!^ )TJ ^抏Q;MYI&'@" x0_:ː ?c ?@" ;)RV)" $ħ)@Ҹ6^o۞*R|"ʞ]YOX]D&:5)E$EB7HE(+EJܩ*U1e(t{}͟Ϳ}?|ly6?=]g%w1mAD7CD|9Ȃ+(~a"ΧIؓ ]v";Hē$)+#E#pRoDNvoF)BD|P$BHїpӡB")HRn`LVe#Eod"⯒7\z#w-Wy3MtO}DO%E/z+_:XH?"ߗD_I&BJREwU9|g+JB(RDdz0dBڣCvjU"YIH{&Eb}FzDjv$w$dHɐMa˖-o}[lobUROmmGΩ6~'c^~=N~w$> Rw%~|"HÓ'_8{x$H(XEI a_OFL$HC"OE ._$H'agOΞuPXE䐰'a/O6[xvEѓr_ԘU 8)Gޞσ> ~Ҿ};&%)߀}aq !ɟL"I_{\$oIے5O9 7 ;VRK1'aJrw V|9 VR[ž5A$YIQg%;"YIسg%aJ~}))Bŧuq"WIF)ļ*x~u"I˓'S:f+M"pH(¿], X$dMر/H:^ȸ[vĹGesHz($=$v˞Hu̓caKB?. ;]v`KB. ]v$JH풰%q~Bn"tIᒰ%aKB]- ZRjKs񊰫%aWK]m"jI7MZqBHCu{}7iǦ-/i?f1`/N^LYYE؋'{ ~tȂ'~|Gī "⌐''7D;H #q<2(bx4$Iޮx-$IQ} ؟&aNbE¾D|*r_/D**4xīOWDr\a/Y{t$◐O')>>m=#+j"Iاc.x'ǛmSL'5]Q⡔(žD<R*" '5ZF+6(qN:+)Ɏo $a'O~ո[btc&┐$YQ֋%aKΕ]+ ;U.$I,Pa?q&!JvqWiaWEzPv~Ƃ72 >H /.Eq~vs]8 v@9R=$s'"6)O&^v"d޺*h8Pn$ H+ eۮv$H˓8'-}U"n aBb!}Qg^"I?$I8*\i5 q'Z@}u,-UVي?K;+"]]qڮ+Z%/-q_PHH[(S\o᫅2n*.V++)QĸAN8>Eo (" vE(.x'b'(!EE aAaeW6xPv$&HT8Dٯa1 v1O%]S=(~=."Ivs?(Ž vkR9=)8$qIF"aЉ \9MC'@$'I? "tb\S筤obOPbҖ-' c$1Hwn(¾KznEZƹߏR4( Imvl۹la~l?hIۏiwaF~߷\v`OGqˎk5nTюO'8j٭_2Hюvp?>VجLюv^`va%vb7A!Yg+_mRM;?Z?h6^;X>ϖ)Ϡc~7oնgyy쫂أbcAv+3pHD|Ps(e'9sj+ye"aE"( `EB|* z"s<!ՄY_\t<T䰆)g(⼍y ^z$♑b_\:E:6NQtJ Nr*ފy {+:$I胒ؿ'e_/e+_C"HߐZR+"/@ވNq!L"1;f5G} ESH kGbEBg} Bv>$t#Iе#kG=T㐰!a=ծT㐲ތR q@Iې!aoCb aoCb]D¾} {4$gHϐ!%E"iHӐ!aOCr"`H_f( R_;J Zv(Eǐ!aC>Xǐ!aC{튰!aBžDk,ǥ*¾= {*$PH3)UĸF $?H} aA1 1 oJ¾|żŊkWf*U|5|ʁXE/W a@^su$a/$PK9=YK]-㯫_U$IX?+ 0E7c Ρ\Q a7Anbw\v$6Hu!a/Bž {+m7!m?c%o}E*~ԯ5X呰#8a;$KJBϔ"7Iyv\(ia;N.%G'@ ;!E;O. ;^s<v$I;1i]v^fmv^4B;oJ;R;oZ;b;ol;t;|.Vva!v?Ү{w@uMievgy Q<:TFNu/THx'~يv]mv]}zݗ*"G@ K>א"⇐vDV)N44_ 1_iH$ar֒ wIk#q"IO'~)'9 [XS~%R߄iCEUUoXŸ-i0`Pvݷv}I?go ъ\;x==O+Ş{dR=߲c~[~^9_y_V^ͣ{~{iX%~cIW%kۨJ=>4mе gfM.iDѝ/QtEVJ_()*!t0V#HX}{VqI_bMG)V_XE~z0VoX싓VDZ9Votxl hu%:FV Y$%:,]Ҹ哋uU4xwՇڙ\ґ:S8 .խ2VSp@Z,?}-s}G?}-njlm7]~Kd!?&;0q|Kݳ4v0~.~*vo} o>b<Owo=ߠ 2o|>':ܮ:TmtO~umvb-EjM<:Of:D[i3 7Rs"Eő7|ս 8vt$H}O*vi0Eݑ# SD {?9k aG>_9)#e>P;hEHD*vkkYZr)Zs$IO|~dEnuحNq:2>I ?$PIĩ"mz:V>T]}Oߣ ৳oum[w@}s` ֠E~ͤ`>ظ6n+aNظ6nI=(oiYJ߾ MPa˖-o |nz޶^c_|t.lo.PvzIƏ7i1dN7Oc~6^߸z_qǾ-o}m㎭o>q/+^*i=ho?lc#x`g?z(EC6^exa6?+ ql4~lco('9?m86.n~v`oW6:^{jynf/` .\YJ/>tEr}{_\V|CeD8JMv!Exv? {>ayϳ ~=8s8_{jWCOs{#9[l:#>4sw{.KC}ٜ#D4mw]}[۞}\N˟M/my{}xmǯߵWmm/ڡc~>ΥOڃs={.m 9g tϥ9=' ٞӞsI(nz~T~ܶl}Ӟ7M}y߼ʶ=׶= nxυzn/$]'uWG;F).`Is#iϽH{nl ߹q.z%cLi%%v9C{h4ϛ}ϗO<9c{neϹ=y<О'G{iK|%s3,UxI'Iӑ${_Q+]I|M-(~$cM?o;N1GQI 3WXK:+p?7W\|Z@daGWU<]";ɵsHq[Qbe3k2E2*Q,z*EYE*Զ~5B<@z [)zq["tR'\8$wHRTŒQ$ ]V򫊴#a'9:$tTI/ ˬV藎ٰ#1!1!ELѦ_UK}Ce|m>{$s]hbGhMyMntۓP_۠C)&-#ƻ)>ѥof } mf+BO}D= ]ڕgߜ}@z$tCDQARABσ9ٱYZ sv_}<z27*B|:#HCO }Fz#M~#w?v?:E蕐;(:%SBB,萐;R+oS i}CҦm>1=BBׅN:?T~']m=N+i{^v` tgI!miۯ7٦(?m_/0 ]P$AHoɟM{{H[.6ݾׂE;{g@狄)i)?%CNX@:$tH;?)訒C#3OB_̟:}i"tKI]$s@".ivu:]]_@Ľ zƮuN']h[v=fog>kT_:tYZ_BoY?{$٦~Uq~gu;G3^FP$JB/zWC%m>A>*iuWIOV*|PhlĥSR~V6}},[Vֿ-{Ύ/e}.tdIO?gPz.ZG+Wiw>WKq77' Ow;@,o>aӖ-ӝO@ם q~`{[=~/mv`Wvܱ8gw>7y87Oo|8yvo^Jꡭ<7Jړ=϶}P?z<}S:{!:;q瀧N7t5~ƹPUӞy<¦yI9ij_/v|W*7,W稈cI%ĭ$~GseNP1ɏvǝ/{|=z|\0lSDҤD:Is^L.ǂ :W7\}c,Ɋ6;I{?{oogo[ǣͷn_D[z/thۇm?}Yj#7~/8p G;.z`P>|4BMy>k7߲]~7~Wvq~Ϛl}cV#m{>y=Lkg旧nnߖ-?[;d%3͇i-8}D;P+L' ;io(V?Xk?a+EFZ{;,gvn9;%?;GkV]=Z;*kwggohʬE #'D0Ҧz=⌑%gD1z$⌑6^ooojhv{5ZN?;P=֞6TFkghۣ[׶okgqPm?g]ӳ'8f=ƱP)3.[Okwi}M㐭znۅm7v\,T{ۮm7lbǹ ;xO~s~o߸%c/W}f <,dzHq~rHgXZθEd免&ۏjyLvVU|6yP5_.zWy](:rN*- ]rljooG]]HƋi7W|<" Ro S9s_Pb4 $ݚ[|7uXB.%IG9^T Ǥ5ؠZru.ϗnWg>_~r#巖|efDyU7:(Ύ97/UǍUY"^]UjYG¾#'tf}x伱\gQ?>99vUikmDzj~>#|%ROU^Kǜߝ3A5V#vrh:v8csϙWe}3\%W,vor}W5)ʺՇIouavV׉Lނ6:|$tIvHl? o:hs.?RSt@lNDztH͹5Ns΁~92bԧŊ#_kos9'UttH/}RmVjtρ.ٜ{sC6gVnz=$tH,>*9n}9/%%y0#Ws^ݽ<:sN*q}iyÇJ1ݭGJ>ߖbMBۖ< n\&9!NDmы^ޓ8e#,m9὏|W,vbtr:F%zm$H ~5=?:nA$)nʁ[r0/ bL'@$ƆLp^qrEV@-UE v8B-̻$_S/YsFʸ7Rt"EqC%9YtoYl%t='trlur{=@$s裑= vNH>V82Fw; ZWsex9$tH蠑2U׸8W*!W*6_CseDQtR+R\ȻVq\$ԕ\87W⶧(BʼnW~`stHߺr'qWuys_{yɍټ2}yrNZ8=:Du_o.Uq%^=j6mʏ}}U~e8iYQ2o#tI{8n<;1¯X)@2'|cFWBMg.`_rSk*%[$(cy_z$]5bW{eU>;쨄/ʟ 2Atii3/ͯyY_8;_+~I.iɽkeݖؤo]FU[z2/<8e]z9}JxgnįJai]??0ѩߵ}CO<:6V_ՍCA?Lu|?CD HrxDqOyOA Ov0t-+=~pЍ @j}yё,U,4|"֣/9e乢')ˮn"(L{ϸqv*?|[6"r>|ʯY+WG4V~/n|<$7>/;2~kxmGr} V O^:v3A%#H:w{+xx+M|,ԂfKmi.}-Suvo\8C/ȪR?-^R~E\Rɗ亼э]\ڷ|'V XrQJ>;`KĶ^y"*~SWϿ/ B`kjyuEX5n|Y }|tlzxDZ+~Ot-H.8Xekkw 0>9^_mnrۘb?/ݾG .xуa\G/^=v#w]hظ骞L O{[%ţww<`~_繊aW_3<_ۣW^yWzAE]0r\y9#ʹU}{nWNOQ*dW{WWTn>{mѝ\ͽ9m]u{[ݴkgޮws;U'Y%J]sT\rZ^(VH~==>Ow#RvMW\J{@?}qΒZꗮ|r,;WRφ)9rW0TK)*dxNo^P;^|=Skre“~-Cݸ+ogʕ-)w.ѭ rK?Z/l|D˕tu=g/\IYTV^޿tシ|{qyoW#PD<}[/q9<9sC]Γ[Y'°\|EU{9Q/#|9G#}bx1XC*{E>׭\W^9ynǵ7L#;48RܷVXc;}e}d=\Bq}UVumjVmOQS+i/?1]-\E:2J {/dE_ڵyOyZG#ܩU%{ewڑ0WWAm芤?qd<~5\g;^Iɸt ܮϪK׷;s<] {`7\̟e"xF CA%=>]|쓠?>fWϒ5F7*gф?r96u|_qKΗtr6i\>ۥ^Y%ןG|S5;0ҝgK}A| (Rn: FnG S@JdEo#~s[pH۷ŕPGzH$уǖJ8!AlbHY4#2.?^#~W] pLQm͸P{OK=^WZУ0՟u -8/[x 'NqqȜˤ )_ʺ>gσ;>9@X9 Rx|Ř^>ߘ:~GK,H?wKS7[OU>9Ⱦ8+"*3{۬tb@9>b~]?A;^{|qZ/K_f.c{%|cGe^ST -2=6S-bRhLc_ȟ^Yz/kݩޏeȝ&K#eoE|;oss}7]]?_Iz76)7( q[|>MGU)l\o bգiM5L<:ny>+W.#4Q^]u6w.6ؓӵƁYd]zYүduyqB+u5dVy7?r6vO+-+y͋s\'o5Ay>Hq3av;+FB,C'n%v }xS\ݰt{iԑuJ~<7c#;JQ{Ԡ{g}ܙag ^sPSvvOVv_G]A߀~ 5-Y.^_~kqoWOw'U =z]faAxBWL {6nf.A^{7sK}Bs'A KHt H%\tAoQꮜD Box޿͞,|'`ql2)߬]o@ zW]XR *f(~3?wN]MGE~'ᵦEy$BB, L~eϓ+)~D> ?Z~oK"}m-Vg EOc .LQW?kb޾McAq.[Ɩ!lX\׍KnEٯT`EmhNI)hbYQ͏'(;$$BN fooT"&K)6ldEϊVl` ek*/<,dW+BN79a%2wEO,[M$t(Hgп KAJdETN*=kɥSa_J~~Hͯڮ(ŋN2:E+n6EQ.)v5EKx Eo.EQo4W"t+HV&SABLhS{t@7lS> } rpR::_3>85~F@hԆ[SL>wD{ri@p}X =?[?m߶n8IAkxI\1o'^ltpE)N xc#*(vԞm|xE'tS7W"(E>W )zR?~PP$I9ωV> =(}\Qm;DwЧ"͸pm};_Eο)?[E0zbMcEmKj 7Q(k|ҦG@>v}?[{_L˲mT/V}IWdG^3zf$tH蕑'#EB^ =1R E~WsEo3[<9JQ[jE+Bo|q"~ˤ">_Y ˠEB'02ɗAqyDU<;z菑6qAŋ@@Ѥ/˧Ңg+~oYe+}cnW8v'Brrkyt+j+^5 WgN@R^Tq圯@Ѧ@l;ݾP$tH耑>m7XK:+Zr8LQE^W(BD7Rh{sb7C~g"HS(^"ZISEHQt } ~66X_͋ssEˑz=Kl"vfa)'i.Eo~9NxE?w$8d1;:]'8 Ҏv<7yE֋W赒s%[w}V'{dOw?ۏ/vqMvV6H{>\ўgt{~hbF~/=Cvwڕ;Gw+>6H[Bwuw'ZyI{>лjv}^1Lbڷ}|v'!z^?oT}ڻ_g{oڏ Eą!ϴ`vT`߾-P/?AF:CѶ}U׾B=x|;{b}~}YCՓy"N@Ѯ acz?b\"C>{.d={]+9 qyHÑv+džDqhȺEYO(" 2$Bnt"⸐[_(ZAJ<E肒Mh^TE\Qu%b&+n_'E$RwnƜdt4 JZ]L:dڏS IS S=5Б$=2b+m"t'I(TbFoX(eY~;&yo]<zs'=nSn)?Џ#X(#]~{VB 8vKFBiЗ#oC}>tȿ|)ƭ{Eɑ\9QيWth rb>AFztE*bCH1}'qŊweUQ߯ɫqi#)/-T+YmeWWݶC$5afo%e~Y7~m O 蹑o#"H[UAgJG+Wb~/?c"H觑KE^ˊFrЃO#,DdmSݴa## v^@~Eߒ|5|ʁXESHS)zfgVCedYCW)Bs^z^^,NE3_nU]oD1zDߎeԟ/[jEG3ꯇgu(~w5"E}#D(PQ1unA"zDVGECQE"E/_DE)Su華E"Qߎ~1sߵ]D$w'F"?OsZq;SV.3o/t.sڏQID=(:{S7O/nE](O4z56XO">w]]Dn|~SGu(B}uRw "DQԉ E!.EJqqqc ۭO\|މDeӗgcww;Soߪ/Ո/>^1⟛3ݱMD3E|3E<3E<3E2E2E<2} }Ei:牱|)F<1@/w Asa<4jO*OLcE|__?"~tQ4-xS,v}{oG|4}k/mOM}#-}*8PPXϦ&߷~;>׊~|"F<|ԏ_kҼ?߿z{]"Sߎxz~8DSQqtƔjđ/~Sx?}fEgn/!ÞK>/siuu~))S1*"F4yMwINN}{ };iwc?_Nzqeчͷ{x%е ?>1S5~_/(i_.~A-b/u8}:1cES҈kmI;ME)鞡bĝїu#t@q}a)Viĭ[[ o5=i5buK")E\)PR8Rќw"N~Iwv߀֊ 1I[Mwq">)<錫\Z$""""""""""~"~"""8ED<#_EgCHqY-">;xo'O:"LvDL7n+Bߓ.Pѥw1~jCBCeWrAxFxx=x:k?U:UoG<#E EK!"MhӚEėu/SċPċPć?]}͍"C(Ch\DćPćP]1>(Nqx9PnNJDi+H<ؙ]bģKJQǙ'E]P:4hQFV1/Rzi:4k;s'mCOU1kJQה3/VsJ"އ^V3F1DAN};RQQ53W+""Ψ-؎8#oNHh]5b-Q(رg-#VD]Bu }n1E-;KF{.7DQ*#El>*ŨY.^zy"hɋ|݈',sE u(h#tQ_>FFr}ovYf=h~Bl"iiD|8Wqy+WC&_."[7RD}7zn(oqxxݴm]Ջa诏x0WU8u1>-'W~["(:PR4ƣ-"()џ齢1>E1HDD#E$=>+vLyH~C?GSNqM讥U,b|H/AAw."(hċ4oR*F|Ag/F(Mnׅ-NA{p"k9=:Ÿ?Oڎuh4߽[KŨC.bb">bb=b.{X_G?u{QwbznZtvabbbnyP>RKR#R#R'އPxNz(b]b]bbb^7kLxRG~E:u>r(7ͼQD=c]"F]u((()wXQF]1ZEѸ.QǪSzubb}Kc]O:|z:1JF] qIeebDGBm"'QPS7BI&4T=pPŨg# E}z%9zzzڎ!ϸ'~~cE="և(PP%Q\O:['b޶KN}b\jEOs^fE="׿eu׉X?.N8E%׈5>z%IGo|:OJh/5ߤX?X?_z4X/X/X/XXg3"և((hԊXϡ)(F^u..|BYc/h[ĺ ź L1KEPQ}?Qy0^A}aF:Ͽ_S{>=Q3?ɺ_%&F{u5u3u1u1`"(c9ldz ^Z?Ytu)PXg%"b]"bܒs)֑(֑(nR#CW,EHuuuz戇Wxzuu05"Y(QPY&Hz}m"Qk'55Lz9B3E3::'kBGM1OL@uOE ;L|?7TqHyot%ߘ9"iL=_ӟ|F,p:4慇=[нǵG_c^b^""FAxLwWq1L-֯?& 9oj3))h{.z!")()h3{Se2G3}5jkұV<2E9ڰkċvHDbBUbԗX&"bb^bޗ.kkWqjG98&(rGV:-ƼmyW5bcDSx џb>D=|~0JG=^1#UoE ꯗuiԧqݡ㠘۝{}"}iǚ#b~]=kߪ03i<:>}F_2?g~~ygGϪ@Pߞ{|NwSY>gmxC_E٠mJyi9aQi8DJD3C~VzXztI]#EJ]1+E|:~CoDEШ(^`׍G8CDGba{+F?cFOy?cuNq/I9E|7E#}ZD/Әi?L1_C1ߒ'%#4?:E_PoRkRgR'E&}`v9bo1ߑ/;q/-/I1A};[u⇈'K1A_]Կn^zCD+P)[!".>7娽s+=)⾞⾞F\Xwc;مx"."/y'"b}o:1깴xZ&zu_ʕ=(u;47=lz0yytueDwiWre4xNǒz"שo{~txebO7N{ 4ſ޴F1->DkX'?]Dur{{:]<ًWXcMD?>> r.z EAq"ѫ5?k>ee"hՈX_%FYq"EG~%""ѳߙ||q.z5bȿV^\gm޽bT?.}_.E?:a0U"֫hԽmDD-=jumŧ/3}g Feb^QgOA@J+ŏva-:u4y{DԙțWMe]x5cϢXϢXz_sϓ_q9s#.]#f?Py/;y߭mwX<zǒ.=LD=]DF/y["'))1kDP\rTuz-'G/uK^{#F}n7i߬cݲ\uv=:u3W,#_DD :&u2ug)/i[79e.[Z##@ }Xwh`m="裥?}^|욅'ѷ`WVǠEj1})pr b=6sE=u&n#"?~l-+^K#_h=+JY+#GwGϯ8 ͿWMX/X/sE-8BfxRD-{SyK!/h}W۠X_;{-"F_F1Jgi8>)}RhϬ#^dz4|֋nV\ň'F\hWj7M_xN1DkE Qߎ}REwP#ȏ1oH#>>qaQѨ!(E{P~o<~/B/_E*x#U~V􍦷ɭbvϡnGSMWq"(Kм"P XX1}-{:$*nұU"(h)ug=3/[=Y:-u9(a)aiÖѯSue"o=ZEXm#_Cx~ȏnb]o>3;JESӬˏ: ~7ɞ|?Yߧ?;?՜C~~;ϘNѷ߯~U䡴~}_Q/f]ozԯM}CY/J_/BǷ/l~t>џ߷G ޷}f_~ ~H/kVzYǟwG}a~G~?G:u?u?uPW[oϺ:>le3Pe^B4VCDQ:lufqJE( B:Sw{xg҈sju;~f]_uvuCwlm\R}|ĬqvָqmxyCY#oE#ھ-~r1?Yyo;ERҎeG􉈧WQ^/-:dx wV/"7OcQGJD/E/EE}E}=:R_ºo?>ˏ׬YdzoC>/zcy48Q48ԁ3i:K)N(N(Q_P}ךyt)?߮AD%"QuX#F&x45Q&"σݚc/QsE:zuR$ryyyuhԥkG"?ʹ.==ޟ?t18OsW/|4>iiWQWd5"?(?(?5d""}ի#_~AAAQ|aXVq!E?1tj͢o?s\)fo=[EQ'Ml D3Y|&8"e?yǏ'?ސwDwDQgY _:??~|D<L4*?/Ӟ|TD] |#u;E_\%"O{Eq|mqE^E~E EEE~ 6E>E> EE~ m~buԈg\tNy4<*Ĩ"蓻GB 񺝞Zjeb7JoqI_"zGԷ~a7yy 43[SwPPPPPP+X&N$E >y/y 4k{K@;Q/P+P+P+P+P'y[& @ELgy   4Z/@AQ"~v??<ˠA}!fϬdo}!"=tx#""""ރ"ރ"F|<?Էg>>碈q#߽?|-tσzp((c(c(M(c(](A)chԟ+o""#~x~}]vΝ}/;WD$E|/EwO_\&">"_"":Ǧצ禈CCܞ=ޟ?'ݟ))qO>>>ԷF=t\qZԷ7#"~FR%x,x-M]"#~YD~E~[j}B4IkDY#o}uvP"OO<:*'};PmPWy;UkBG_bߏ߬\_|_GoJпG\-EE.wY-q5^ㆬ9k+Q7s|r5l3FoG{8)[|yD' ゚|/wg!O~~ q~(~2G A_ɼM#Pͼ_}2 }nDͻ؏B?vw_$}&@I}rKyMqr||_u9oe~ݏᄅ+Z ~CG Ӳ o|W|\oo7i o~^'f]]FW=߳{EkQ߬o붿~8}h|Cq~>nC0q3)Gh}O}Kew}OoRvo-_WBy/yOVu^#h-.^*qӍx{'=v11m_:ED]wn{MD"kQq?6Dܯh]1|1qsmOx^/'F_O}'SOoX>n]1>ydt /("Q5]b;[C[&E]wݹN^8_wϛďwy~f˿>ADE|/E 1k䊡-ZMX+"ώ򁗚N[uyxyxyx;Q&"F>yyyyyy>dC+^Y.Z1>\xYhD\w?'7W*Yt1DKRQDfi"(qPċ[~A|<|+O;G _OGH߄\r~5bZo.{~ 1;?lGwH^1ڇ{E!R3Ey/HHHg|UF@ֳ=)x1-m+VD~EE|qMg4HzVx-N'"^F"(&R~D?9WH~oZ$1{LyyuϩWQRG?V~0sϓ9އW{}~q0o] 1ƭUbecbD>mwEQ߮wZn4:./H#^LD~b1˝"(5?{AKw1S>ZYD;?>~|KxQ?_߯撚^.yK#hgG~.m艾Itö8F_c>4u_ѯQ'Q'VZ{7>q|0 >nC= | zlj>qC}g5OBUvܓggł#Z$-廮Q cXW|_wFY]{"P@Q>?M_ZuV+D}{|>珢oDY>y$?N7m*jO*|'O|wϧJ[FQ׋m_}烑GE}~fdE+_=gb?66R1Q>7P?],ԗS}PFv(Sףqo=m뉾띾ThEV|=e1\ug_[u|qgq'Ϋ*4#+v 𼷬8!|z_Us5~e?8)+sީQ<ɼG˳LD2y'yowvF}*Dעy'F=/(QϫE0br3|-O==O==O=s_o=Ok}iyG=}!{:URmSH/Z^C=?v3Jq}߻U[J΀!:WL蜻J:ZRx0rY]U@xu%*;zR_.:^"nԣ;>iuab>Amח4^fM/uMNuu".[:=LkP:Apr@u _# qEG߃ʪ#ǁ7~\y?.Gq];v="?Odw)P^ 4W,OV}[Sq?Gdѯ~]2_q0ԯK/<ͱuѯk?cKE~]5~5~ݎ_}Wo)} uVYo|\~Ӵz8/O̪sބNJyqvAuXp}W/\'}\n/nyxx ~_ Aߜ@|:d:VKpD)S;d3t{2x=OE`Yuxb޹N,.9?]%zߗ_;lĂ _yB Sh߮76|9?1xώruBcsY!N܎4d.k_7=?>םA?PNnCyGҹ#jW^Ϟr?_.[ Ǎ|<ḳBKA^끌\/o8{v̺VTr.=nTXܳKg`]'gV~ᾀ?E$/azY>Lfyz`kDϗx&e8׋>JM/=z+.k=o}}wYg/"tLe֯=S<=6:7<ۗwZ]~6Zx܇Ɵh(ŏ';͒Ue|*z\Ǖ:J=%U+D񼊅 R,fMoD=ύtaqGyqKYy >Jެ|g瑼<K<x0x3_6?xT̋üjǿݪ]DgO͋?B7;yy"0(aPWAOxo+~|@4:};.υt7v|{ܿsu} =f,_Pkx|ED +~]假kuB Hη/VXXXXϠXX{B~y4XGX7X'P)fxfz OvXX1_%.oq&qŘ/QgbD1O17Z1W"oGzy{uEIQԥq}lQ>־"1ٻD̳SCиVyԟyzywyv}")[(ikצږu1o-bޚ"bb̏R̋R̃R\(9ikNII1I1I1Icޓ}'E3C1JoTyN;]D=%bwvݻS*"_E=PPz<x(G /yhFTD<4ox|4Lj(b~b.3ż*=򬻾Z)b"ޜṿR?߽EķӘO1J1~/律//D1IOWI"K(C)Csox1\?xs'1IcL<'YG,#nWܯBU/;x^I|ryP:Byy4IňS1OJ8g쳃&M9gSyTzĮI5"M/Dqzύ,WGCgC1JCCq`I|u'۵,WyX1/KD1OKE1oKU"PSץ뢨C1Ky=~sM"P/b>xO?S%8FD]yd"((hW]U%ͩ%}lF1NM&yIaj:fk&|@jWIdj2z 8O6?E>)&y̿ȡbי̏&y|yjG%JO%JM'RMj2gR$o65_O}m)Ԥ&IݠobG:f1OM d1OM &|슫|}jR(5L7jXGz_-.^vsb2ߧ&>{X=Mb2*1O|ԍԤ>@jkd#5OgIM&5OMRXO(Ա] q_sNu& N~ëo;kF{Ĥu>WCLN1/z#?(F^1YH}h]>bytIGjבԤ?tjǑGMֵ^P+&yDj>&Q7WL3R<u$"5YHM,RԸ.ɺGji[~{ :J1ɛHM귤&"ɺHj.& _HLRud#u]:S7MR7/=b1YHu1YHM1R#U<;3zd"5 VnLLRud!ѷuI^@j׈:Cj!Fqb.zNSoud"{~=XLS#>S1f$&q_d]#5YHM1R$95d#5d#sswbէ&qq}ov'Q[u&1I|jEkomɧ&qɺJ=rk&q^?d%5YGI}f^=bTɺHjĭwnĩn9}*1YIMAR#.UL[Fb~i^4K=beb& I\vj)H1{$.;5YHMR#.SL#R>zDj?wٛEybY&:DjybewQ':Dx=>DLROt--b]H9bu_lUbR#5YHqGqb' ^$ƸR|SOmCɺBjR,5sHuz1璚+&ɺAj_qKMR1LMR#Z~xzȋcZLRud 5 br/v\L1YGH]{1/׋XO9 tӕ'OŤo@*( hSgx^4߻OZ'cOļ>MSdxp8AUbG Ni-.F9?Mb׈I||*)鄍QMV^(b&uSOz[ZE\g))4KD\'i\';d=>Ͻ=O<=MS1O%u[|b-&F}>9?p]e"1kE?"K<Խ$!u^u qƺ*sZuN1,jDܗ6UID*(h&u}R1O~ӹ!)i~,Kuztr-ƺrߧb~b>b>b>b>:u﯏ndzEsv"tZ&&nRc]LLR}+NJ~P%a׶~cϠQ_QDEW/1G9YLZRNUѷꏍ^UXXQM::ԏww{ˊa]eǕY?w$%5az;۹E{N&I^J*Q;}{YjIWkĝfv}zI#ňh^A@L?W*b~>3"i,K.ϒMʻ%uSNciL<8tIGhfż6eb7I_T+)iy{y}y (᏿$&} Rns?b*YtUEBnNgNMvb^b&uBSD]7S'GWXmDIM}4I=Vl=Fz HxяCP?noeyIE'ߥޘ[RwbqCƶ"vWGXOA="Oh䧎b_N M+^B_rcFL3RTPPPФE*O(O(i%C^B^BA#[ EE>xԷ'RA@An2 ! #4g_{]]:M̤FGK^?E<?Okt^yؤ!"((hwNkJ|ޤ/[jyTc-4?:$4 ybF\2y"4뗊<_:FDrHjS}?~j6'm}<[9ߤV/I^sc7 ~nqm~J#jS?}Sn3ˆK|TUQҤfjҏ24/E|Y?|1g,3ɺ9:z{Mq`?G~O:vX?X?XιSR'f4+bMM7gXLSMXD>*1wX/-q zĤp*)(i5ITSQS(-"ob=z|"<5z+DQӨw+:kRa=b="vM}Vym+5w'"NuDи*#^UDE~m*fo?ߛ}7׊IԤ`*U1ˣI]Ԉg)FQ"(hWQߵODJ}KERRQe[h?u\ER]:EMbb^\9zyzt-A?Q,vY?@}?{<-ם=gpMu80}7Fo#2OSSӈ)XU"bD E^$-E E M\ѝ#oFd"Vab_wgS/R+RӨ/LL7&uSL;_1cī7F@b+.@VoΈ9yqqtSŤb* ) )hzĨP!"ϐxNL&bݖƺ4E-ПMxkbu^u^zݩz<~bݒ&HҨ%FZ1㙊xxx yCD<cY'"^FpۑGLs@~1E Eϵ{}neO9s{߳Nv}ؿ)IԈ3@><"-ݣFRVHCh׷G~GFF13kňch:4y"(k(AiR:7scPzU/.0✫OT۟;?n(ѷ{={?uSQ/q8_Y}}y=(t?NkFebCD=go|s:~KF=y}ZD^ͯ~_}<8{:*"ޏ""?rN+G qMާ߇G%Jql@nA;Gy2'͜͟Ayۜ>_|><=v(}9w~Իu(bL7 ѲoY*<:9}#"gn9˔yk]+ǯ\/[ޘهysŤoBwD^1_w[zFwHI>|/*Iқ[S ߓ6O{Rׁ|ד|ףD_OV'Fqv岺n1jE_?;} Dim'M9D\7KE\q\sq<|K#Bs_+OX}" DDt|*돾>i뗾/wԐY?>YE5E?u__u+o)_,}׽Q͋7x_ϊȊ@< @z%{#'1ߤejMK*˺{EGa@'AQπzxx< 5֜x*㛲rz\qyi=POfmG=vqmoh-.n'w'Pz\ ~t<=1ƗբE8KN8_׊WIP=u(85>YXLhq;?oQgFkTto׶?VD+뫇](F!"pQF^"E_ :`s۾OoYogmx^gX^F\ׄ3K< +`5xރExDV^edyrΫ'O\ Hiy\o~A0Mq7HQ0uvߣq/\8ED?$z׿/ ҈lb}R=qWWԋǘJǧF|2u(YL1DK=H=u<)~Ҩ++z^kU˴ kEϋEQySJQǔz^.яwyz~~Z|[{~foQ/&Qϵ^Lɥ,||g;x=KNg{][^y ǭ;Fq jEG~boĹ_U.fQag]:^#.CRz]Ua~ ƼZuu:!^ R_SN mSKQUG7x}3q +8:^ym~Nw?r<ѷEu4nxԷ^)ӘgQOFyb77L>.m>^x^EN1 {L;%Bc~mu߳-"PdRIaU(/ИSaŕׇQ?bq?E q"WPSPohlhhusi.ifWk_=-?)z={*ֳ)ֳ)ֳo?gi/O{_#xՏ >ޭxvFGE5:^/F"'(ͨT>Kw~y" QķQg&z>Qw/nQ 1[^G01DRcЈ/lN!ieGDkPkPI^'ӷϊF|hu^Z z]GZ=TGzϥ^lfOE>zFO""ޅ"ޅzVĻPĹPĹPכW5 ZE[S۹Õ"EE<8^ozUPu\+h׉:^7"խ=J<ݎ,NE>%E EGu/CIJm"frzmBB5B}5:ڈ^wq㠷ER#^qq%ݻ :{S?7Ox{wAѿ"ztܷQ ~tq%z_OPuܣVu߽B4#fI~",(+U~gKx{u/G| 7zcx ﯁xx} o!Ǽ磅џWD }NGAQf*y}%P7z_ %Gs[77Wկ .(w(Pc}nPWz_QԱCQ!_0((((((  qxz$QPQЫe"IҾmPàMR/".NﱕUMQ""zOEޛnm^'Dąlįh ow/Xo!z2đPw8WBjNh(ZǸ-_s~o7n=yBC ~v K6["~fW\Hv1${HR / zAPOq3]"A\_:$Vqj(^S\qm?#)2S)Eb~xX/O8yL[.[{c^F*uͼxkKpn圢nFNu8k:Ӊ4v:DЬOl3}[6 7}y}H#YtU'zTN#gh}YQX>WТ:ޱEwq/+?DgW8oEmEzzF*}!^Ūsi?w+ϱAWy̤j/WDw:1⊪DQy}CZ_*Oux>q?\g~Տy0H{n`yx!'"e?~o~ϟqߨx.#"^`;^Y#>6vɋi՟Kޯc~3G?u:o'Ѭ}{?{;^΃~j_y1g筼{4]^b=??]9вxHÝP "FH;=z|7ufݖ׮7}#;EWPGШ{#sE秏 #O8tX#Ccޢ\DE\E=}f1LDEGn->N*8*8*~qUqUqUqTqT4"(((hc+Mg0t׉n]߷NQ/"ϬO񹹻m{qo|~k|,"~"+禈q+"%} KEKш*qN/EPx)x)x)((uiWՈ_U&F=((]9KD"x*x*Z3lKXפugF:hS?DPTbWODQ>GUn -_.FV jI"(PsQsQsQsш".1bwuCo=n1TC+)FV1*Eē] WG/X̓~wuu"((h+wwwq?5YD]0=xZ9FF#ml"hįWWV/"^>i?CDNjju}(hOJDEEE]x6:>l7%'qFO+$qq_qt_瘥LDB"1ű] 3g-;rm}(讥U,E:uhun:Gqyt탿%"N"."."..EEEE\ERququuhœh(Ѹ/џV=p'g#=tf'm+ˬwD)-QCL}AE5?jO4(ZD۾ m}N#4B+E=RΤ#}sIFYb=sne"MRY)HQ".b>.E&E?N~)Lau"p>"w_Zx5"l3JD-]t߿Eܯ+_pu4NZ"(k)o=sȫM7gQǶU=MK^E.Esx^zv}i󶋨_KQ^-Q"w)w),B.E.E.E.E]<]ܸOGGѧnE/yU"轻myMx`8]b嶉˥˥˥;QD\.xOb~""]=OD\-E<-E#tqt|RUb G1K21KY;ݗvlGho8IS80kO}i_#qɧ'iuѦn9 e+߮GD?߯7_Jaoz=A|Of?NO:߃7{IGE [kne.6+_wOOۦc>cӷ-k$?l||&u#k<wǻ>񲏫}tW~S)}+xT A" yi hm RoZbRyy h8|nyyW"SD4 //Dz۰N@=>F>zDzx>DBo[ŬIU3EbgkäG~zq O"K=o'z>Sw|(ϗ|or>,>|9ϨE}b1Ƒݢyޜyy`No}h?nvMV#gP-f=Nt'NJYyso!z?9jo8}HDYwy\h~{~}|i˷\~N_^G÷{ꅾC[$~倥NIV}3_L,bw/ɼ}דIRקyf^qx:C0?3N2U?oz|o's`z}Ϭݾ]F^mm(i[zL^GPzW^gE=!G1E_@rKzj^ y}7Ujzqno^sO"g/6zG"(r(vCEEWE(^z=DbNuw"z]H+iu(NVjqu/.&fBu8n r{D;uJJ.u}+Dz{Eu[;"zYOScW'q"FRqή/яz_v9۩^!{d Ա7l Fjy%9Bכ|/zwIN~>ؿY$z}n;ыI)EicU^]{}~?Tz^O{vv/>ׯϫw^z^{=_>6C*D*t=_K~OQXm1L#E|1-=DkSnG_4_7A>(Ox`A=vjlM^.qzb>XjsO^3y&Tg߮?~X?+_ywEsD~`yp?~^Y~U*SάOwY}2*w-bV%?pEy}GOQz#cźou3W(cMՉy2mzDWbuGƫם=G񪿎O}eWs{g^o? 8 fz$c]1ciO]*qUE?wyk]y74kf WC7?yϋ~~u~ލvY-gב}dN;^|w}<#yQ&_?fxc>񃏿ߨ+y1VgyQzYGտg'~I{?^~ گwg⨓J?y^sUu_mQWzw~޿#F<<1j1[R:WD|0Ru;E!w AsbIJ#z?";((S]/W*""΃kZԞ=<7;Bvċ)QwFGp5'6:CĽΞuD[ӠGْ"=(Aq7HCgV-q-?O|_~ﴦ߾+Z9] ;{+֞P!7~>:v/5CF|Ҽp~ݷ=7|׮#Q2mZ1{F;Q?"BD#=kuӊDAD||QGz?o}:7w|~'O>~ߛ_-=v|fs'O}h㘖E*m<7^6׷,/?x2:yTu6w3>)???96~PoZbojrozyGy#Qy"~OD<#yQGyâv~|U9~Φr|g.`"qߴKϏo?{:sqqs^ysyuZDṢSԏH E]Bu +RwxN1M#}|xyxzv_:FD>E]Hu%)iԥ,OO#.MD\F>ѷп?WÒַ_|eWߏY3@>EEEE^E[z9we"Xg"""o~b_ɾQN&1:EP xn|4ꑷkޱBzquD]PgFVu)ШR!TP=kui8 4;(i((k(khc͉_CpuXvUzL:K3Ũ8JD%||~-i~0Bc(@Qkjrz[&_E~;-"xocQ_g8((NQԝ^{D#Ѩ).DDQ'"E_(|&;"(=)^ч ^9E>E>EQΝIDCc^+xEOe"5iEPPPc҈[Ls3))1iIlc#""~"N&ENxH8##[D#E~ "+E#E|#ET?E<#E?\|4DOPWP_P9jO>V#1E?f||u")MӈWl#>TZ1+QOFZo澻L1 Gq?g>4Sw)z")QRR?>DD E E E E E zQFnQM4 牨EQ""nż0V24A4s"q)(u))y޻M<}}"e(](։(iğoh}XDWb^CzMާFvxw}A)ebOKIj)})y)u)PP+("+1Lnq8m%牘Q]D]b喉],|168Q[]/r/.c>X~,mc7 ~n-.1LQ_ 5"C1LQb>yS7~b 1L#U|0//qvՋDߞxsOYO/1Js:+}]^V).~#ŨHQח"?<]';ൿW6Rui{QI|%27͹Io-Q߄F_W"1k{-אƺx͜y>uZZŘ1_C1B1B~?Ok* | M|I >u()i=^ y@4Eߥ{c[[QWDn/SA/JOJqK".+d24=扱.R)voryu&(%YD!:D"=Sw1Sb>"bbF}zބNJǤפ//*:H#^^혏OCESQ73S')"nwcsG>O85")))))Ф[* SQ5[|eƌ-KE/Q/Qs~:7[NmFS"i̟E||ڎYugpTݧHi1_EH1D1DFEqb!O?1&"1g0D1C1CH1CH1C#ίN qz4EԷ`WF1C1CoE"o(h̿/Q-u-]7O:4F1C1Cy]bϡEFn }|/P,b~"bb.E\4JĈ//EsQш*w}"ުM<:qU4E\((hm+'"ߒ"b~V2ѷGUxy8,y2ڴ[ՋS@1F]'"F<64ky7y7c1Fq_IQ"~FD =eU?F 1Qw">bގE46qkהǎ=sh:tQEubb~,+nRz4ӵ[FCgv.1HQEkEҘ'Q׌"buF~hERԱ͹ AO8atje4GH7M};/RUHZCRIQ'[Du"ORQsRSUo社4m{E(1J1J1K1JWL)9i"bޔF~1''V4O[ESďшG1OLoW'票;GW4wbDҘ%|xh?ժD}V)i{|1?X,QFU߲~\^!oFPzԷd;E=cDSS#/"f}Y%v??iӭ@gW.ѷb}!ڎa[׊tqS.zE$EBɜ`Frq-}yi#NOvu ] u'_i7Xo_ȫ@Qϊb}^rkDeRWP{oШQ/Nq}߾{V1~A1~wp(a3okJy:fE"[h/X_U~5bԗ)}bs'5TtQfӍ?Ybb_ˢzz47Vn~b1k{i)F5"EҨ "ΗF@Oj$+NBcIĸ9\u"9hԟ,}/A/)c]hʓ+'#8CQSQ˩g.F{9KJĨ߱L>;vR]n8x:wE#_guZůp]y磨)b}F}z4|RSR v>>i͜|zX?YkUϗ?/kf]|EO{yߗ?2D~ɺ*_:SjC (~:~w~.(6;8]=^ B}?4O8N۱NHK4g[#F>.Gq^qQcbJ$]QʼOK(⼨}bAsMǣSv_?(">~]/~=qq4 D~W 믜5/ ~fͯ%>s>-Fj'k7!ޔSv_ڞ5?UYȫy[I, 5]]1s*q~#7B'Է:x`zgWB/L}?ޟ[~^G3G:n}.]7-u4k>үI|eͰ/}ui3|r g+|k|A>NB|6q|\u{D9f{&qLJ>~ǫ/wUbҗwl }[l}f}OP&fLԣyQgo/tkg?Byϛu+{E߅uu7t|y_Y >ߙ}Wy=>ķcGY!S:ϜS<Γ !W|-k;:Oyߢ'ϻgͫg#ϋfWx%7B|ܕ5E|)x]g.n]xs}fflvCwy Y y>u|?o捷l<_f]?3+^[B}= >~v[κEOSRR''-]D^,*y@4bŨgV&"Fkxi"@-JQWbF5bCjJ=0^W{@?zӯ.O4E}?޿o/~|oy/{/>N]aS?o5R n]q=}bO?I;sO~]nf8ް<Ȩ_ߢ.ѯчND=QWFDk_o)F_ZV7|<ݠg|/Vo9x ѿZ/ǿߨ],NjOQWJ醎6|SgOx-pu>~C]D?/7o~ZqӆoWדX/}<'U7zjۼ4G|uU:E8)Ԉ>N. qՒKĬq#BǑpm"PϥKQϗF]"PKou=YQDžbޕ.yҪRѷQ'f^eg]VNuB)RgRYScRu(*t8ڳ:hN}nY}!ySڻU:LU"0ՊD.SL4ە"2QԩDQbݞ//˔lF||vQGFݤzuF..}CPE\ EWu爨Ko."SıѬDQ)Ϩ_X.Z1k;C'h?O=O`΃ѯqy[ qko*;lw]b獸_VzƊ~<q墟'~]Y?y~_GCjDɤ~(=okhױ %ba)w]2P"m_Q)q GRԟQR4-bԷl}3dVD]M㹘g}WT/VUSM>^,GfzD1Oy.jL^|{__PF.Ů?>1ݶ~<=C^4AKL%b}a;ox7.gJ;^qه}wf*w8mCljt_}Ũm8q~R~]!f}zysۿO>p3Ẽn\igͻOoߏgog݇_G;_}#?n>Ͽ~>/=Tfܓ<.wz~*gmww8Q?QF?Z>yy )t¯z~/xㅜ>?\<|C7O)͚߭Θ*sޣyz?jq񂷛kE_q/;E__z.U"nP_8v]}EQ?>oDȓ>Kә-^udz>{ߟyKv~O#>>ͺ3g>B> 4u諐gtEKO=jFMQ5D[N_‰KDQ31Z=+zpo?\+Fn!WK|{ןїF!O/>[D^WEmABxl4Xc-5i]#߷~؏ߵ-~㏻uz}WhYig E_m>i{ j_F?&$(aQ-ur'({䜄~)R;H^dqŇ]+zz&1Q^!EB)RPQQSD?z(Q㣨G>^x/\vwt=O]voG]>q}߻U׍ o8_7_|KE?Hg?G}""3RQߑ~o/AHOR?^Qϒǿ>pߔ]̍+%v%w;A~J|? Y|~I9ί~S}z>X"{sFmz}E ݡWD_/z܇oh/ZC^d>c].8}sV%y]/ьqw8Q~68ǡq{ֈ>myqy~>h\z~Y<67o >2q>q7_0 5q}OyVy(y2BYb.x" n?~+JGQYSy|YzߗkI^qK5oǫ[z<{yܬ8BڟY/|}oUhO/Cyɯ}q=N2Q:_}nm}YdY>u zAɚgkA;[D^9/l5\| >{;>1sώ!y~۞; \W+Gz9=n~Bo?YY~y:;gp~_ yu^-:u_gS)4_zf׻߼gUUb4~wavɇh:!3VRyvelC64ΰ|>כ>'۷c?_7Y눾Nۯoz<8#~{~M4k>yɚqj-}׵}_" b>:F8>Fqq {VGqsc!ma Ȋ8 >GM<Wǘ7/hqzIt1x ˎ*uunBϳy}zY> Əx\?γs~|qD+|w?_{E*qY~=ǁG~iq7Wh\]B3WqW=nN=.5+\=d=6+ַ{n³==N==nŁ[\vGM'Ջw|9Eq>})xSM7^rkDͦ_Fl=D[L1EC~)R3_HNϡ!EB~ )R+YϐfmGCZb>T`c~%֯*Dɤ~ܠO(EPEܭT;Uy(<S3E۳k}:o%Kw[#/tX?-~^8k"1&tvP!v?7]N;Jw}jěv-?E?Sч+ϽΞuD#}m61s 6R7)tom_GWu z՟^V:=oyUK/8i?Z?_3:?=^?o|Ѽϛ1)8n]˛oܽQd^uOD˿ſgQ|?޳t??~:wC3}nl =p۬u뽏|㓌G~g }}=#}83Slw/f>hxȰg.ї/9E_r4x=?^ՓEӬB/7nzno֑}ư5~߱#ohY|Zŧ#Z_"f߾w蓼;?A{})S3bûE3:I o>D.~MXsmEcOїyyٟ3gT>tkĻϾ f^.ڱuo v)vݿO[EosD>^߿gbe}ߧ}q-#8[jốKgV7ߍ.X?;Ĭߥ<3>R硼]' f>]g }oŜ8{mGz^~{J9;'{n9_7~\|ϛ.,3;Vz\[~}o+c6'nxǵY3qo7J-y2QYї\d/;>&k_}~c~GC~^P>R1k>Þ?Η ?xWd~>ɻ_7שQx{ }y>/tk+E(qӕ'=V$"ϗ":gU{\}اU+rqڡcƖB½Co٬NaؾA"V<rq}#B~ w=6{qq?O87zDyУu7|epu4W'|vozku4E=7G 9ܿGO mZ1+s)sNk>v˻E3/[oʃk|GVre:ċF}[?8~nxŬ駗W.޸GnRcݬVeu׋m|ID/8^>zӯ.nv4Ǘgm:Q<___/9`-y >)9E}~~)S?Nџ>~GU1шo8Eq1^?N<'NOFI~WjZ0 55'-uED>}4~IO1?Duz \%{z|G >.3$qu\/V=oيgI\|~j֪Fw,yĻyF~.jc^Jl|>dG"\~q?]cWrAx.~L&qK*1m7>1z8?}oϸ2C&l'݂RF=:^^e쯍;v׏OźcRѷooȟ̩8n;lmǁW%?ovM{9|.?qˇ5>ץ7}\ᘷW>{:WּS#>mLidSQ/ӡ}U;v⮣=+.#~j?Lo<+?GoL}[-D<9}Ż.%^sc~/yӮoyhfu}D̯QWL;;q/->1E`Qߘ2ݰd>iKCGLTyy֝LDtت{'^)F&1/xN/O_xVя?/9E_r?qǹwxmo,oE?sw/V2Bv[D;KfwO|MY.ڥSyOꚅ'z~e)G~l/Yeχ~#?Z\ഏTym~=h]> bW~S,fxՏg?sq;o||o珜;Qg>E} }Py } (Ө'1lݳ~ C(G~%"SקUDX)Өߐz$SuJџkXo?}])$\'? 6})PWRuK -t?>#1}G?Ejm\\z~yTԎ#Ї8g~|qdzY~}Ny؊D\ʑ?}%w;m>^:r֒};)+RWO',R)KH.au )ZEث~o_葱_nfKwb7}V!u˔lFD}OLY7'Ğ;T/(}v*9hٵQ"^!QFUyG#Q9}7v[L?/WP{ғ֊=y߇~>?ԻQ߲EڿkjQ%cĨg!b^?//۵GDf D7R[؟:X-QF]*1R׋Fen_A)Ҫ r4GO߿?f8G"Ѩ7W+ߓGYJ%RXRݥ~+:`O:c#~1E5qGo\r'. M}z#[Б?_SsFU;807BKǓǯ~ߖu>޶ ]Gڵd^~{C~;_ʻOy˫>:Ԏ}(˺Ǐ/W_~~}hq2PA%Lj~FZui81kׯqzzJ(Ҩ^-R/*w#3omD#/qO Ӭm5w-qM}O?csqǥ~\'}Oȿ/˹sޑ?~y>ﰝrW|K^:独}]exoOϗ|Ѭ?:YP^ǩ~=6kNj9ƕ=k^ ިog ?>k|\ߗV>~ɚ/tq?:ύ?񽯃36ny[兮z~pw^vĮ%=5}Y}i}4_g.4^-+~##^-3^/<^x1ox/Ȋ/O 7uqƫx^fJVi+Y-4/Y/烬OVLF䃗Qǵs^p69+82&IIy^cZS-)3~z='E ̌,4>7WϊG,4]3oeϞYQkk~?ůgd߲ jq=e 8sz&]ΓyK ?o;c|qC|]%k^)U-=Ӽ*1k||㟲oOSOq.2q|^}]un_ɚNt7Z$|5dxS_--4^E|*+aT!S3]1KٺkU!?.E\5o*F*S zmcc"EDu_ksJ~\<󖔉1R*"EDEOH?F&iO,n~ s~ ilz(Q;Pt}bkя6i%"kQԵkI:w'tIQwؕ"zҨk. E˜_o/R+uJi3D-_)ޟύ:4Aeb}]$_Xo#BQwE]QԷ(:5"RğШ[&F?Nѷ/ byk}?_C(7)R!{o oxƴ뚳o} (@5"`|3/RGS~؝zҨ["F}V/rLq߳2 ]qFQ?7SN"RhԇQ'>+E}V:4K/|,f}{>}oǣEq3eb9h}?>׏Nz41'=㹜ըwKQ?vϓ:KcoQP}Do[NmZqo-/Q|ùo{N*++bٿcGC~ _;="o4W;~xt͜VYh+[y1f7/_|suWPז1Eb7~!"ҊoF:u|)RcKQǖ-mq#U"{լbumculio>c{VpӻFO#K{#*mbwdzǨLjQOE \:91sDťxUb"RY=a+#|[:)+|[q1KDեgR5:us)P!F]2C:j"QQFQ7E4ziur٨ot{GQߌ9aU")dYfu((Ѩ$">ƸED2|!u1iwQ_~QTJ3EcJt576 w~{׷hQ̽%lt +D3r?,bME1QǬTyuhv=Yz}ϭ"+<}F{:q5/q-i#Υ[D ]&ƺmuZuZQ$b]bbbݕbݕ"bݕb:lhۏEE]68JuJ>*4%W~X-~svymuCڰdX7ߟfSKw&)n:&w}_Nq"q$q"ޟ?G~))bX?~Z!b z(E~YW.='<0}D{ ^t1k;R_R9X,IEMϟicź$E8E<oN]!vSķS.yy 4G{E'XȿX>Z,>AIII~Ic}Y!~ICDPQn1EGcoyN "i],b}b~>v7u:"sN::źTg.&qmChxx{7|X;_wgES|QüTμsEqԷc]bb]|cHN};qW诇uy>4;E{3`t{?FD[oqI<9cZgvhuc}-5b#xKS{s5~\ƄQǵos֝)֝)/S#^NIY/)M㾡Q:yNӣr?Rя\DjuvkEc_=k}DSSK}{tty"R_.bjm1?CcFbԷǺwx϶X/xŗX 5gdW+,=牱:Y<϶-#>L}L)R=FvqCcuc}l[LDSu`uZ"e)e)Cӈ,ѧxX:-:-/' ̽D/X>[-\SEbyWLcID?SLPNz>zvqsmKK^Lb}NkĬXJM}8Ϝǣ_-}kykD㱞OΏK?n߅n@'&Nw{P?O $̾=^UsOK[nN68ԯ+^G9rqM4*DNuqU4i I ۢ~GqD6YѬq?nvz9gbD\37rD\ qm|q'Ki87c;W)[)_?:szqY׬:r]}C3/ }`[޸/~#.8~y:{?cų"6#?Zb˅ZD;.#~rio8L쭿)4bȔzѯ3?Vɑ'֋+]~ex 6?~Q%ߪ}|7O>3y{u?DDңorq qq':#-qrcҿY O zj2uy:`R1>!:Do>.q98kF|Z8f-Nn3C#QauLj׿Wxύ,WIG""FnqtMԝ:+!-E'E[m)Rqts_#;q>_?qq9^qqԷ#Εf}^}M#{X2mZqt&[>Y'""v<))©ęS<3~N Mjicqkɸ扝iM龸T\o/ӛZxu3))H(鎃dxox'xq5[]3Y!"/^D[pq_A<9w~^D}DŠE />¨o#>NE9E}/q񜳣<()igLON8j:{S?7OD<7xԽQOCD|Xzd4Uo~ly((Q?>8{9wtCר}}Ru^!ePPiBB#_FDC "ӨW;Gg'QQ|\Hz:y8OGO_]6SEǕ[ﷹͻŨ*6Xqz:Do~qc]=5uŸyQyS4Jk"q<.ǵ.r{A!.yO>rfjυn1^ַ㳎;_q sެq_/z׷ǵ>1o>{i}S@geI~SD/6t")ӑ+_yOx*8)~9Ky-"))ѨW."O_\ŰE>E^>")aSX+KZ#4BuNѷ#Oxyubui[Ŭ?Nz-'EcI||iQWGS)<Ь u#{Ţnw*EFP},)nv;x~~ϛD./S{Nc{W?. suAElfQwO9Zޟnf]'}?~FKyoAGDžGyͤ^]u;PqYU]7feEfeXV6[TVVTT戊EeeESi" **ʅYYQYbQYYY sysskAzC<fQPG\zD<^7eRHAy_ dVG:T1u]yv ك "onD &s3qy` 0Iy2/<L`"~ƙ߿_ 0_II><qE%#8#La" \C„ Y'~b80d 0/?KqSf*A]_`:m'm! SݯtR[ݯ^s=+'\7s8Uz@ILݎz>0zʶ;##2mL{cӕ : qE9v̋Z~D -X-h9i;Z_PD-GGwjWcѶ/r>OvZ_|L}xhyb}<;nбn~NZoLOϽӹNzP.[O]ھi?qSZǟWOZ_o?ty8Gח/|>Z}ӾZ[zg}/rޗk߶*2;8GP1Iqҟ[t]C^"n$@d"'SˑZN'~O1t у} T{y/Gnzjӿy_$qj߮Zߦv\%tIaAxCYuߞ8t^r_1`)O|uB_z= nT)_ij_ovzJ :wzjY`Vn~|Y)1&u|I]֋޼/n:-9?յ\V-R0A-kpN3ޏ1 LC`| La?)7K|RP!AҝuL=>t!#Oߙ'Mwt}3Cx _ :j$H͑Uio s~_5Z𢞙uu~|L;_&>oT i~_OШ%D_ti7AS=?2(xc^5;ͷz|{::՟#[Pgz>?oNv7Nz-yzSIACL~PpAMcէ?=y>iSyPz=^?;}AND "OyȋĤEтȋt~CS97 H;#}k 71ɮ&DD(&7Ma޾W vm(*HG7,د|ܰSmCyVOjlA:-wG y Q1_)ܿK "LbY`lY# H.G${&P1YKr<<[`s Kn?tPWݿgzWKGkZ4ZydW-|z)P`^@( SJ8OD>&04Lߑ#L`"o>'"6F~,OBpx; B?|wYU5?ǃt]?OyC{"0) 0y;VOn?_ciV_?xF~,/y{Cȃ<1oK ې!{euN ZN[..^:$;SyNWĴK_u68Dkz^tyiF=[}&HzS 31 =7y:2)S ;1=:/,ܿ;Dyd.YG~e*cߖ7q""y:R1|2Z4}3e+BP^dU^\oũ)ouʓ'Xr/FAwy.>Ai^maXC;f"1WD~2&1_s&2q¤do|ix~oLu 3k 2qDW&2]}:lG;[HAa/D&1'ZY3u;v߱/ڧBΙ)o^ έ&>wPPc:g;%ǁ'7Fz}oY!4p.Ȥ<Of" S~Oǭo=uq|ǹO?wƵmY)B!8\=Ews>gdfc@7γ<՗ϙy~'..뒌:A]]6)7"~ֿN$ZsMt:_|\>Gןz~e_X9^aX_}tj=:RЦ.:&PI/H-gj9T˩6=vqJηF\OPSV\8W:}\Ѐ-R}:FsG,x4+{?WR돴^GGjәe.AVW R:zN߹>"3#G M(T[Nt҇wZ˥˭K]o^uW;zONzx3z/!-Rp҈җC;Q%綣ق _vwp5#Z y4ȳmW^ gFtʉľ9MFD^P&2ǒ\ڇZƤ43__ .xK0ȏD~T&t5ȯɤ8`0^ 2?k#8L}]߿w`A~ZN=l,vɓ׀|LOIyҹI 2OV,_AQ&2IQ!|Le8L7f".?qD~&3Lg">&3D&3I_P!| L3)Ag"?O "?*mk?9o~~._A0A}u_!0u{"StBBysD~r&3)o=_ 3=3mPw -hyISN5y ~,]ߖXr\$G('%9?ZOWq?~>0S~]G3|N72S x.8W{*{*?{13L-O]Z>[$ "W5Hyp{D< &1ШPAa"ΤsAe^?X)ȯD>ڑD\p&3Lg".8Dp&3k D\p&38L g"_q™gDp&37L g">qÙäa?D\p&3g<g""qmD>&0 L#g"?$șGD]Dq&^2tC7΄űɤDM&2}A:!:SԙSDu/]u\7B_G\znw`žw~#mۙF "N*qh{DS#[Vk"8L=e")~LS"{(&2!70΁׳(Ng`C_2DM&c2a'ä8g ő,D\H&a"#q41L2/{DC&-{lQȤdP"+s'~"FLbBa"q3zQNqI~(y(q,b˛{} _0 ;U&[0ς8NLebNLح2a˄*vLح2n5LvLAb:F. T&Q0a6? 0N4\vLy2O {}&oL3a$`A\!XrffGޑ ?oIa/4Gӆd :vL1o%<# {:&45Ivq9gcpo~38̋6n8?A؇1aDY&ØnXW"O&컘b<- 36w[!)faW5vUaOń=aL,{3&јWckv/1l0,FwL1_ׯU/]6v tSO;c 3&Θ&%3&naCkaΉ S&Vd(uHA zvLqX 1JقG DĹ##uI;Ʈt' M wJCL/2盉E&ULW17I]< %"N8L1q^U8dB_$`Ac8w^d+ 3``ALfBDj&R3 yз1yIyCsJ09qXL,N z &1aƜAG/Z㞉kLkv^&]e@?A0ɮDQFAO =a&0?fR>lA엙l| 0f[ L:-Hyo9`ǖ;J|-W~JLϙȧ|r AߙoOAĤAa"gDfB)GryAO)4D^&5Tϟ +,xjZ!<QV " ߃I%;{S!~]dQ("Ǫ}2GyD¤΂X|=قbXt'=y7:DL<]U{-D&)b 7N]F(|._cBƌʘpY.ca}|S;vo PP߯|0L[?S'yOP_5٢nG=>wyiBb71߉K ހ z=-h.CbR/yU :z=E.ޛ.=3S׫)7N/u@ϫD BD!Sa6nSЧ3n @dG'8D>&LaBD~&L-Nk4UW 70|L\"HS7L$}v`n 7o2_A跙/„^x LX}6 ":!cBͤA SOs:GU "^m&WPXCYfK֛S_3 A_-6⬖?j:eBͤy%LvLĭbŸ ?n7}2X#̈́6jgq@>}Y~LK,\ & 7D4&k#T.H΂Z|~v~:.?>fp')~] DŽ9KwWGA1'ukQ%8u>slyY_D_`⛿/ںS0ﯣ _? ⸛-V.rM>DP_]#2@~Lb_Iz<.mF-D&â>vӯuoK/0-%S&LL:%.z& ⼘i޺;Sd8f<<|݂#dϐc ; qzGwy{ )Ο^$`AG0C)Fn'\uңI} -wIq*䜷)F' 1BPSZ״<=-ZrE-ORA37elFr~~T(j,ܗXq}f qO۞c6nn?݁ NjONn%11z>ާ;V¶oRGhZeO{*{ZZU?~MyOp?nձJ.wwyZVzeO%@P>i'`0a˄-~ L27 Z7 .^'X^W0Fk޾hA2o}O3vl\;] >*O>$1L3ao˄-sXʟ*a˄- aßu>|3{{``J û&|8X<&߹cjf|s{yt;GL/`D<oXc/cOuBAؙ3)^ A=nߊǙ﯍eNj_PvL=oy"N1uz=͂śZ/@E j=r_K~LNP^_|`;{|N녭O\ctGUa7r3.M| A=F H~OP3z^tDB{uyi:yZoc̀Au~t?N麖3ÕiFz󚖇XV$先uG8RL#DpÙcF OA]1͜z:BP_ N'IqW*/Yp;շ-Rܰ@A˧_> *Rv;n$Ac".w}:LzA5`".!1 M&6 k1)~V`ӿ' yF M D#fᖅ98`LL:W xGelm2Ʉ_#3"+ɏ1P;?sCe0_~Li0)>)AceiV:?cګe o`NjSsu ;wu߯k^վa:9_+O%t;L0˄9^9S? {~&L2)V {g ?3&wcϓ A&ɧgM d >& L2Ȅ'~OmtӓD\0&?W+ \1ͶBAa߈ٵU~= Y%د|ܰ*R*6ezc Sܱ0AC1J[SmWH A]pO 8mL}ϙ?4&1Ƅ_S[cz< =ߣڍoNقO [0 z :JZʼahĠA;2O1+-Ά,LKd\ZpZz0ĩ`jy崏/~qAO[W_,#v=u`A-?az<3xAIoz>4c>-X̣z2|93mdkcˮ[^&z=tAꯣ[(7}ݶr|BȎOެz_n?ݾuq/q=K _}iM+ 0x4L=yƶyirGqzӾWNzS|kyI?[L-8&(S9I$es# q*=&'9]\R׃GG}]ƉMw@nGि'-yuDϝJOt3/}^Ӿ[}cWׯ뱧9c,tԓXk.iq󧻜'Zt?zP0nƆRA3zk'#Gc=퐨A'=ߧ>ISmtwpow߭Ǒ8בĢ]OMkOG|©_~ A#M'Q.Rz 'KN}&>Opoxz^?m}e "6qPq|0hт-o%Hq+gyˡ&_?qș,ʯO)ٖDCfӪ~~=f?Dg iS"lLOmLc"=y,FzgWmxë|.tuNKz=ߜoq(=ַTPV^ut?}'}^zRONq==_w(><Frܥ2-iN/i7 ,t:*vFyט:1 %DL1/WNozPP_G7~/qMZWrO27sNոc&5^o̥e_2bpwzv j=[Rwݢm߯Z~~'=tە&ZL>S;UOimǪ]z_o}3[tڧi}:?Nͪ|w >םItyty?9lNg'yx97z_Wj/h}'L=~mCZOEקnݞNGAc=<`'}ȿn8:9ݣ_нլh 8yp)[Ni"Vz G?_"|Lǹ[puf230aR>^.Hq#Ezh7:}u|L}f^PvgAA/1yM G"(3X֐0AeRA e>o 2CDD ||W[\=O @ &>w%|E^_U<.sr0A1 2n,L/e~?Pq}sZ3"򞻢d`[w sѻI9 :حW 7`6yAڏ ^_o0۽}),G vm(*P—i_B_|L}~]^ق|8[P:6بA]o [4(;uG*AվȟOOݟu`۪4[m`55S&7fV8DPm <e^We 2?|TLb"Ŝ$\o5D.&I1i.`Lb"wD\&5mԿ߉{ xL=w?{O)-=/A"=Sϟ_󯞯|-iGW+z^zn󖜭-Ohh 3e sGw 8tytySIןW3~@N/xQ'yH<=yH[C+}]_pm䱛*|w-uI^:p IBPgп3ϴ:Tz3#븠KQe}zze?jbA^w14BϷr^oAC%*o7 x2o|Ld",|LdR~r=P W﷕yKn"a'~kZI o ,9W 2 nmT]]<ASe>8Gyg "4 "*Ё/ 5vLKe"*y_&AyQ:2Yw 2u!?+YȏD>E ?g"#EX~L G2?L52agτ=vLw,ް:[pVҟ1ႰgBLLE 0!2\<-Zz9&32'x2aTq/ .L]GԞ~OW5Na{_׷n^yyY}_Dw_;\ٲO%mv {fmG$?#?A="ہ.|qrAzSbAz}Q^b._[N "(#.A^^ K&7L-G_)A'E j9~Lm5? 6D^='ɤ<ق7rב_ik|oR^G-DgejR˝Z.-gkr1h\nZ>zz'OAPgȿ<5,x߷w7\moǓz~@~t_l0,FywzG!<y%+:ZPϷDu2>9o`A~]>]~/gvQ׻nݎz:dOgsrAOɹW#O(S_GX+j_ ̖il_عrq3z:?*z]>tW(N˦Pz?'="蛛ƺz^T?z^O'}wOs]>={=֏]rz| 0G%qoז)LMa빂 n Wt=s¿>qc5̼z&Coyz~ E ¿oK傰cRuMs*NzBA]?VY\;B5K~ Cu{B_D +0PP?ģ`KqD7D1][PS߯˧_=s'PYP\Wz~Ϳ񍙞o6{ 췙Ol"[7 žyAU3傈DZ" Ov_%إo?7Df7 n;K>D|&{0߃I;L`B |O}bYג`,az 37#Oq9<n%Ɉg$0i!Hq;f/HHӛ/[0%wJqQ CS>*nݎ~l IqqbG8:Lݯ~#RP=N]BAq8BL]>]~=H"㾌=u}~~=O 񁘺=tS_==z<:m:ƯvkfD[&dL-8<~ӓAOD|"&qejBA-xELg}R7&^:Dy:\Y]AU "w!Sz1*׫W"L3aD$~nR'c|=Ϫ;|?]ukE?FDP?_cG*鼝˧+L#3̄1L3aœw:0D& u}~>7fߘIwJLC3/D &43k>iH)"n ~L2~3s_z i< MfWԏwrA}[fM3[vL7X.iɑ/e>H`A:O |vĥf=N9 A2#26*G))A2)~oJ)M&A?e~p wg/B 1ykUP޾SX&CuU"[&G$?@E ><&)BQU8WcD? ϔ|Ll#l&Ul${l& d}JL~LW>^Lob O&gO,ZP?cLႺqw/ 3BxY|Gn'xk}.A=Iтz>?=L=.8WwU"݆ ^;z묃8 Lu`" Z.A &W0IqO " ͢C"d}sQ GΩR<#LP˗E}$GPˇ_4Gx[x^L:Sb?޿h7h}\Z(GEO$vUg=|V3ϮcN1Gٱo=Sļsҳ"N'>zw z~P.ق\ T"GKܜӗj=1mUz|&1PS_?dG(0z\jWhC)Z݂Lq7QKZ̦pNre/z->}l{\k˓(T?!1>Oe\tU"z+-uszO9.-U'}^1a' :p`eq6FmTWj^֏z݈߬Gń6~LCȄ}!fŸOej~&!y/ F?D &>%NLmẐ&8^BZ o KfpwÄ ~?L9%?#&kF$ A0}s@A1_TDŽ~:L7O bdh1.J~7* < Μ.JpqMo*A5f"1y𻱸~ Lc$OZ ~i CA` ?&Lg"o=s$72Bp]CC"m,?LQY/lm1솙Se. _&ne9FvC]:E® x&eVH?3?e2ώ {1&b"lɾBSLI2ań= oq _h ,cL71OIz0A}BLv ,tO 5=sq]>hHI d_k `I1by| ⼟ =93j7?9+ ω LK0cBt/AaQ3Օp)EL臘f鹢(N| 3aB4znAa"ON&L苘d_.8XMV EL苘1_鐗 #I#>7e&LY 73ڂ`bg9:}"o- B՘د29`A-Τk BLCGön4,grA{,yLs0plAof>3SN R^ A1q~=Q54~nEiڀ]׭(40!˙8ZcdYUGAkx"e qޔA} qFu\ y٠ qǤ7PP&/-y;3K*Oebj#+ؿ2uO9'L쏙t%u|~OO#e](OeGA;/>rރM7/t#Av/:&P|G7LL3shʤsA=0)nAA0<&(~[ '22`n }&O1|#X񥘈K̈́~Io`޶Bzm&_Ո$C D\Q&Ճ)A0;TႴw~ s ; "J„~ISIzA7o0` +_4(HJJ`v5b`#ɭgB|&ple LaB,`A3O]>D؇X\K Aċ`W}` 0N[:Zs'q2![uG펨D&90a ;-y ?Lg .\sL,Iif$Ϟ-Hi?S!1&@LR'SϹcR<`Ϯ>% rI/Az!&@L,nއ =śl?2A聘_b^ {!&;#'a? !&_&B/$P 9/C•{a/ 1hE ,n}AL艘1'1 rF߭jax{?vc# z#&썘#1Gbbg? )D'${wŅ "$=~ YaelI=VaĄ= }. 16jհ7b?`#> abs ;IvDŽ~IZ9aҹE 2 }]LdB$}nAU BǤshA71JPL0.Pv1L  ,&LZa<|6%)^_{qUN R뻮}>DN?^wz>u8sǭN3q<}?y48^<y{< fjyPˋf:ɓs뒭|q-`:dU%zz'z7zGzWzgNgp{Iq Q/~zڡęz?z?ߍ"/DP~^m0>A>hVYj֋hz/ D~/1)h Z)Lo)"[Z5vM|aTu>获>MQ6lfUMէo9pϪezGWwiK~sLY 6&)}{3d> 4&јGc ͰK :&ј!#5|G:77U1~xe-3a3ť6faߵt ;rd3^6 1uh@t5w-Lӓ^?:r)/Ů7||߅; n7WV 2.4^5դ2Ͽf>+837ut#_XyOWҭ)=&43*ߙ}g/ ZbgFux?/tpKtSgJhxz4:Ћ{1fow dk_y̗_SfvM&v󻑾}Ӯm{=p]}o4˗-xocw} &[ŭzzAg.Xhˉ%G`MWQ}:# E/ /ڞjUؤיy T:~B>[]M/լw1T8)c\S?q 3Q;Bfڡ0{kf )\5e   ia_IQL=~xϰ<))?vrQqy޶Y϶\"n[o[N[%l-6o|ǖ5폙vߒ6Mm}ִߖ-4qF7L=nŁs`c϶67|+[mnz[7;$2}kw5oKO3l}Jm}~[˭Sj83Ʀ[Llǭ Q/_kV[3=;5GS΢N?>`oQ̫zzjgߙQ4O\4 .E*Zxͷ?|ws}*˴WS31L4̴715 G>gƳ뢔k_Tվh_yF&5_Dz... #]bsP~]k)vmkrfg}\qQޕ$#L?quM,0̺P\צǺM=L4o)7'>lֵbS\ʓ^LA_YC݊7elbک{eg3.fVua[鯺g]Ѵö;0߹Q :w/Fq|dߑcC;NmO5f|פ}¼~;{Ě~]SyNqFR;=g/y)7'|ܴ=-U2YL滋Mu\J's|:Aχ]\q̵c]/3>c|u2~f,&\zN>ʗ삜9*c.> (..IaFTAM2+{ԢJKԳ+qwzp-l1)ӏ\,Ԍ׬]ӷRCGl6z:7|E4NWP+\-su쩃_4OW/xi4^ Z.}ΌW\m89c1>{.>b~_t*=&3,})Gmѯe^L/(AEL+)M)BaL1ski{m2 ;4LXeV賷NY%FN|loN0˷+&\@z4=f~kc[w}|y к۳`O[Vtn!;L-#-Únٖw||)bnݔ ӷ)7Gl;fCL;m!֝G)i973 2 ƒw|o_0"?QUxnZ/k 7=IX{G[U.1WȾ'ERdbک`&9&kw3He?E3#9clGNy=-h#$!{+O*$[:d$C}f%y.$mg\t ?kǔ7҈Rʿ?D_40a#3'koӼDo6#s67{{NrzJY ?MU O{kl;z.K}ROy(L?~3xYwZV.0GYP3OAO`SDMy7}(u{woi|d3;h< ZCaAtS~hcsIQz gV-ic_ۭ9~>IN谐ƳY&3i_uIvo=; odii^x#?5K'׾kG|0άC_O}h惇 0Z7oՌ] c_<'7ԻDm&?,O/~ڇiY6e^6ߺ@G6w6)cmg~)Ey~vŻf|y_3t~>ܴk^3,/z˅edPj{w(>?|OҔcgϷQL=oZ<6^ygGOJ̘6'$R众֊深mP<ooi䰍e&o\]Sʬc㻽yA0?C}`SލǼk5Bޭƚ掘Wt1 iy2z:o2[?۵Lyw\m}kw{mP'tN߯Aܗ5=0޴ÚE]4Y{.qpr65rLyV]:i.<|ãV~}Jӌe^VB_׭3?D9WLݷhf^or[Y!f]EG|5ͯ+)yުz5s]k5g4sUғ#LX?^EC&E68l⚬ݵQ_Soiw߲ fz^w~߶gfXf\5^`w2X 3_>z}XyeCʵ~ڄڙv]Oz'S?wX#\p`ǦcטzX}?',2ߌ4Q9ljSOO4vV\sNj8:x?s4dʕKz*s_L*Ĕ;}֐c&ꡣy$'v/ OC Q Fleio;)O4ɅF6ٰ&oɅsz 6ҼBlhcӤM}olfM-/bzqt? =2ʔsiXV iqui$ ik׋d΋Szߚަ7"^&6s~5DiMWOriM8?tEr򈍫L4/jSLki=L+dgMLnyokgi7wqSƺq6sݦ=-=D~]˿k?g5:.EoKgyy4;#H_"9oᎶ>YZxAzΊ)_.W_y)Ᲊ?`Cg!kq{jm$_5ҌΕVGo ]'}yQGg vo /?*'wo?yJtQokӽ$//arv}$x$ɉaNm+i7&rONy;9ڒΫcZL˔Vo>0h\y6s|c7Y}QAm7rr:g?g,w < ӾO3YqVh=yz flm6{>=ulj'Wk求vihSZ)qbOZ׏zMk =~`dj{!΅ /;]##3+mry{>r.F/S]93n Fh H?^*is&<ʷwOﱿmR=qYqޘ?o&Cި 1 ze-0ݴ!=w8ײַ#WSXnknڴf%s҇a_l=4;yͦMzWaoӧ_w2֦uSM3HyEaɞ>|o|\u4Rw΍8ِS=ϼ8ͳd_HΕ nn2[ζd4_Pc|w/Hz:kL}l|!5o !Ӛ}r8lh_qgtyyQդf:VDڻ&eU7zAnD W*xxMgo-cktǯ7=wy/.=M+]He7!馇}ٕULˬqe5XS}8ImtAiݟPYZoiWk>/~D8̃OHݱAN_/?άgWJ1^7?.gV{zt~ vKo]=ߌMkGrNW#h~j\memmk΢C?kc/ "I9_M0K%;qiSkZ"#hK~\3q"|-O[sTm!Qk>+zU[oJ ;+x% &=PS/&5s ]`Y%yvCdz52ߵنtIzO%@ь\0-8 ]kD< Vߗ@=YS/y|_n?5K ;8ϽOȻf<>%5s{CySDR ޙy`}7^u=gzxci^}/]ξU}O<{O뱾އ ͸_Q<7xu>;Ryݺo8mgg>nwտun˺;uyXrz2/Mdu`ۼwuhu6:M;󩼻O܏^/>ʴ:|OZо=Rg=gզb^ }Z~QNڟ|뤙ICw/߯|qfzwGzSS޵];E?uoֆ]hkS5IOyl-'ovq `g/_rzNz/k*}4wgоdw5xQlF4r3[f}uJ5Ky|w|?7} /_<5dkwȣk/]տ>5ًvEWS2|v36Qwmo5i3c54_u_f,yuoz؇Bfzu ߳>EgqGz!GуX*LVQ<GWU=h>5fUydղ?A=6fZ~JX~B0 ES4r*{x[ރwxw;jGG֞iUdc֡UqsIo\+Og%ɑ=WƘn}2c}3ie%HjSO–kz.\4raz>E\۾2^CGh򑪸+(C!)NOCѬױOs2敽>!hK͚8Xy|e[٤{{.:sK}3W" OL{) owy+r}N+h0~7?&eVLs}+i-ת?'ЕOx5Zؙy}MŝvMLj=̀lnr֝VzB*7Vse~b~̓b^+a;)?i3csFZqEoXcS+ bC_}rȻ7[[~}r/:r[m9^.Gl'}.#G35I>v9Wsy /.% sA[cwfYne~|2wrWhfhoi6b? ^c ?絯ːb]}̧9?/=PNfZ|)yy4B\JywEOՏTC 91C~98\[`| N>ˡuߔ#qBo3s|+/fg Kip:?|dYe }KP_KՄ_Oyh .[/<|/3Ζo{ 1|bm!/>PFc_Lznv^L?]ϒ~?ޛOVNjp19B^.MZ i=L[͸^&_/F.FӒ3w,,g-4߿f\DBxL3.3%"#.}Wyo0 =u~Ѧgg{UߩlSywo3Hʋby#og7L=If#l5f|eAɢz7!}G֚vܑ̂EWSoY'ʢAyd&E|gֳg{ ,o]+=گx>GYاeAnpfyO62.?w>L7lsi]>%YG؟6kVގt[ 7D,?h3lsۨ緔ɏcq['Wb慬 Q6<+pBSYkg['ʷY 'ug]6+;)?eMAB!y̶%;D,d!Zđ(?SָcnFF_Xy(no ҬR"n{Сy~rFp(ya٧۽;A|w%ywy{sEM޷tΟy}YoQ9R0r6;3܏M=oxK=3c:|_s:hGg'S{^v3g^¬O2}Lv%f }gٮ|wt^k~w`֦27Azʱ3Iy?zi į8'M=d p.yf|g//Ο||{y#[g.yc٠oGY9L?qqe3\]w|a+pۂ92شGF^]u;䠌uQu &6ONLEΫ?/9t,g~b7!Dp;˘I.2rPƬI #IZ/&Nj>s*?ΛlϺ~ڎ?NJiMHo?oJ}wfN=2W0ZZl@"#`1}oIk3Irίi3/ <҃QhCbm>6߾dAYN_ tCl9R u58\l$=W0|:Ť3flr!Z૦~wN=XH/JF'?7DgϺ6SΦ/0nj3v⒣ #Fk5ČC)^z) Gdlp|=5힞~9=>*§Ǥ$2&v7-ZS~JP翵HT/|`ȧJv_/kn} oD>%I1#@̭ͺfk1r7ΈOuF?sɞFgzmR:٤S|{~.pUX+tbm|['&}-rSgP=:Gy9vSw 7-~4兯}Tht7->=cҳ!·-w~[|F^'ɯpm81xδ%]{6?-o"71^yUp9e2:&O8Bu(qyGg6KZxO0lia L2%DIHԽ 塴y_T_3KCg4: }smc3_P9OQ?bm.7c3W(IՍJ o; ioJ#s3 ݽO79{H~nؠmTN+OeOIC<4E^z7]Mv+H%^R8fyjĎk㔥eW*U\n?qR~o/AM=R(3S?//6T'[*Nn7qRo'ԢVsɿ<sq٪Zuo0+qRaJWRoi,qJ~&vKE/Jqys}P9- QBAS{O),{TQNBԱ~nTL}SO}J*;VږQ"@*Pya_q<+JvTi#ۙ)Pf.(Hu?elATL%"*ΧS+R{-\long}4yRyP/G4#"OD*Qy.ނXO"G}G`R\@bt_Wv&~֓fMAuEM}})!%qN?msK3|z+LWĹf lq66k{MY3ⷥ OHʲy]L=,tōT%UDO Bqʈ埌rǵkS ۞K}G)uIj@{0$ʃ&)7 I LGaߌڷ~K)n hčwL?H{)ے+)CKq\= +렿ҍ\0)a"0<|3)-)홯?6;b-~OW YF~lL] /2G˦`jc^y0Ż]dۙ\='g{ii+yђ_J^[3_& qFfML~gːUn]T u>`EGtoA{UfD[00qmk-;g[J߅0I̹6ɓ&1,fH6<~k78a7XV:sbfN\{M&$^aH1Det}s]43zNWqz;''q} 812'uk=bʐ4q8q5xS3.`}JK<82|z: ߂Վs[]ȁq;G0+v}qRR:Ad#`g#GJݐҚrBnzX 2a'$ 3vîM=a,mz`~fBe~Qv׌X)vO ~X3w~žAh$n/~78 [m֗X=Tl~J&ō)  ~yޑ {G&\+*_) |$ȳdI[r|_CXGƦ uŤ < {J&bɮ2H[caWɜ[s$ˌXWΞԁݧh=Wr | %G~X&^A<5dѕ젙sa/P}ޑ F&ca1mj:kԅd;s aG8Oш?_{Bq!  a_hWړB2YDnv_Mqzz[E}^gw XRC=fz|C j/=qcqmㄨ`mi)_H,65~o98g,k_m=缌Qϻ?<\=ך)w|ͤvB&}R7嶭?_k=\fJyq˾nZ_9ig望OOOf4ddGaR<0s!У;:y[;N8Vi&Ty/] A|XuvZv$rErŷE\F~s8[~CFai,Wi$NϮN lcbŊ|g9MYn+9>\ӌtex;zDq߉xq#a}ξh!c{n?~o~>~aqo,.84UY@t>$C-"po}Q|+mY/g]NzO ?Af5;̺sϋL#ngӮJy4D)7箑y*+Xߢ.E -1&ncBj_/Tp͠`AqÍ-? {!)};;z{ȝqcW M2Wbqv<ق׊Gx)e=Lx+#aFxs;-c6vGxSanS4G6L<0z(Mğ$5/6oZOfn;Aַtە憡+54^~N7Tg 7"^V[3?Ŀ<%3akmV9~}⍲>Os'4$Pbw{r>#R\'#Ŀ~q7qԾ @ژ?n2rL<䔁M@ݛ Zǿ~o]G|!ò>_#Ms q}i˃VG`7uk+?.y3Nma[^l_^yې zy SwDJ40qߊ K_zs\},B竌;%:#;u0)QqUV>6DQ=k7hݪ uzPVGOءsDZ0Q򳰍Yzƈi۸p^M݌s=#O<4u6=ZKrw!m\}]uc-7rm,_FEq|Z끵> _9nzGvC@47¶ *h8Nb݅?AفL7?swd𔋂p_53ۧ..yu؟$X!P"wPt!l?rQm\<YOY(oaM|hQ˅y;dpJGhɿo>E "G".l{,yM턼qgGcy_~h9|.s)"#~;;/蒳Nz·4.s=$K΄9S3F?G}׹qKyVl8)o= >o$[F8+.j^&Z2?d X\8rn qZ/(rYOs/8tv<̩>);Y/hU~KoKZzUw_X[}ycj' GKwU] W^N|(H}%7{gOG|&qm%yRVVsw9/f],%Z1 _\yYб,#7a\|{![u^ ݴO$[#Knӯ7Ro-l΅T?dQ W[|eA<_O@y\>=N\powGeO[_2^<XztFcΊq.GEs#6|nͳۖ~?;G_D\Oݷ[+軾=oL=o[-r []S>sケnm5dWb7ۺÔOJOoC봥l?=bݥxL{źĴ^Kw-$'Bey#%gZGrӒS,}&)@RTDq4xԏ=F.v8gq^IL,n'gFr+!Y>Ǚ׹\I~*Xh/z0Xԇ!k-Y5m֛yNW#nvC)8w񷡑/uN*!)ȧer#Oe}yvzE.hToi(R/ssG+~@˳"iK_8묟smM=]ָtz'bԌ[έC[]v}XwwwmZfOVUްk//z8GS"of ہIُV,kV;TW YUqoםȗvW{=!kOZd3]K]egl5[dhe'm1[۲ўkSi gԿgK;h1wtvSQ=gu t_!쫑ǚق%v׏.W]>v{Sawmtc_ݽ_<}=nHqv]hkx[ |W\!W],h |u k%촭iRni(w-j{xT0Satlѯ߬~i S)?|u7v~x) Oz ]9^f|r7zEڇŵ?P|/omN_`/m%z~C˚}g%Q;ٶӸ;=?0gzW7ݢuf*1#CFΤu:oe1>᳂ʗfixs۹uuingCvq[r2q>:wM|}ur}m۹EkžL,\/",}S~h~CNIy6**5-\v ww/R~b_IqG}/Ttt / ݺrڗYs鱏o7ri!~s޾yeoI]Ot?|[DG}¬uL75 ;NоڲgCμݬW sm>b;$7ˢ>]Nm=s{.Iem㦟s/w;9]|#Kmut6ݝut?yENͲ[TȻqsN/(?1#5-m䱸&f§vc;]]f;m{xy|Ckgܖↆ޾6>Zݹk-Ov}+:E>">4tH׹Fϱ޹sp3Ni)am:j㼜۟cIzϹ'(Kr9s;qılsjxz {jOh[}P:1귎.E~{bcꄗKA{崥/wx V9p.Hs]:Wz@^s' ߝ],s%sGY`Iѿdh>x3c}j$B_fE/ )[shj/BβԪsQ4Me4:߿~g{i^NM{9>׿ݬW:<~!=?S_88Oxh`;0&?|6?EhqؿEE]"ޥ_t{ⷹ7?F=y%l~-||^D?ﭿc_og&b!M0_*Aʓ5X F\>M;q-D^ gԟsSMʁ| y/ )N;9MxOrqS%iN>=^X!g=?~T.`FZBC3.ߴ>'cz\&ٟSA &]0b!-<L"BsQwy/l$},$|>6ş~< :aөwb!G.ۘ,sL rƐ:䗈F{Vqşb6'^Y?b7(A]`"r /l*j5׬/1Ȼ`#)0 y!zĘѼ 1?#~e ļSޔrA[YF͟3urFc7Iț`#"@Cy F- !0>I)~wϱ<N9+kx/8mUύ&Xa /ݯ]<.f|V/~d] \Sj\bm^ķ|nxH 呍ip/y dihױy2#-@& _`Y-@~j 07< ?`׷^#W"׬ >6vI/Sܓ[N7`v^X@r1j3.@~& ,@D~[&wyf.@\sa:roHi`T3,wA LHq_ sḨ}7T??0yz]A_E"S_ǹ~%`"1GD>:6nݸF3_//L]>={In ݓBPݾ2kGÍ.|}Nl!}?A`rK-gOPAa"_sϷK "yH8X4|O3u}~fVE :O<<,L}]Sݞ`?|}bC^۩xMG=^Ƴ?D>|Ga>&0w,m|c{Xo=Y"?A}{ވ<.}*aϴBy_0)a ca,^&/La+HO AaFmۘČʘpY_?_={ʟ_'A;o~}ާ˯_b"S/}]GNjxt/U8DPwr#S_iOmSxyl -BȟD$&mD$ßQ;#F{gD>#&1a9Gri|TCyt8ly;k1qd(@~YLC-3D N ? z輡Q["*D^ &Osj5~ 0W;΂D^&0wHpAa"#sa?y'=ahKct4i+[4&0'Nr\P}_t^%u#}poH!-Ԗ AP%~>-˧T>]]^?ON>4~WS?\VǢHA:/D><&1)yg{j4ZySD9_ԋ\:<:xق׻ |kL[c"E R>0AʧV!{̩'+jLCc"S${|KȘwM}Q "?yɘ/D^2~>1mUteۯ|ܰ*G,$}v 1_we 1ašh57\ ˧#?SOݿ\3 6^PW d/cKf3wwقڍDL}]ߏxL{W/u}ߩ?;k߯ˋ|L=_`RFD\ &x0N=5gKޯwUAkDgR " ߅⼉8"L{}]Gjg:]x.N;}ј 8TPV^?Ni'8%L%a"9sM?Z6">9qG˦L}?ǘw))AOIv~{G_idKD&ő Aqj"8ǫ2gjj_[;w?(NY 0utK7/'Gן_MƴW)h?|lķg"> e "?c>J~ġa" S_G\6dWϧ:~~S 0'89L}rl_~GPɼc]ĕ8qxy}t*u]>a>L:JALb8=, ӦD㰫_Iy/vȞF yN-"^3w{υxELwa>{~ 08LKa~:DqQW$s 1{ND!&0ykJ;"LL1_Tmr}+/3O"qD\?a qn禉 0usAu%b"qz\q(1Oq~b:/N~.~]?K>vZ['7D|Vޗ}}އ#.qZOןqD<&3>I/|L'=9ZO^6=٠UZnz> ?Gvu[yZO>GS93};qןKo9Ej3Nw:w\WZ|c3lN2/{8qvCEYO粃v(rlcvLE8Mi;mvFyvDA-)*]S?}^->Tt^t{Xj>D|R\p򕓂 SAYe|7=8q(sU ?ՑZ-+dmvo-vW^7^|* @AگK~u%_SvJ0X֐0A'?,dhP<0A^*?6?gǬk2vU:) {; ~DŽ9=ut~ߦپ-SGw>sCȟֿj0[ |[E?S}?o<wnUY^EqKƓN4.Iokq]hA2qkq~p|x:~GSq0..*c/'=GZGmjyAZӾUSZzOOVXf9Z^7uA 9\ElrkznmyTAy sG93 c=d[y^8k)ǜSy)>ui|ۇGx>L~:>nU8mi>q{ߚIuDKm/}毌=@PiZ':m奔e˥yuucߡAh?voGhtOb_R&2#DQ o|fDA3$\yK7|$=W:cW~~..>/'%F:ś_/h=IM7x "'_P K+ݲ?FDP&2^񇟠 ^޺Q'` N7qE B?citM,+/yȻ$lAȗ̻BDJ&1Iy88L0O6L1z'^" Abޅ1w 7L1a7ʄ} 5Lȅn ;Q扔/tc0q^ĹL_0q~Ĺ 2L0aĹS_?~L0qNœ8 A{0tOЩd::L0qĹS_\]N`[]o-s&D ✄0rv\ MW +lkq ,NWAo#ס?#CItΒ#s&Q8Gail g/8$zTF s K[#8*0KI?4  :pw_oNxb qIv8?Y++c֪SXg^Q [3).A0i,tc 3& iǎOLmcH#E3Xzs&Jg;@zn&L蹙$v yNޚ['zm&L豙D/ "O zl&L詙S35Z-&̑n&[zj&L1wfB$s`WouM)u&ۙ($BA#1gMJHLW3_ĹJW8_b&{8ayO ɹ:[ Irp 0ɞPAa^i 傈¼ق]w $9~|~]6-S!yo| ?U&ٙE >  ¾I畝,Z0yÄ*A: \bSM|r l27{ BfB'݂c9 .-oq\P_GwgƏӑHMM51H0դ( Bj :T"EȡvL r5j@( &M5Q2i軮{k]kws_<{^{u]o3jq)~JT6<QFQFJYR# |GaN}s~bPQIYKƭLRnno䐹Usĸ.ui?{ļ [[yu`rH%敠2aR~_mn{teMQJ?T% Z5My3(E>ҕǠ/|tGLg(c-DEEƈMv~)G^E^b%$(!(FG7PF@1N9E.O-QIEbK<\,TJe@9s%J1se+^3E9ԦJ1)((hzgKV>b%')@@/0z  ו  TSW2A%Aiv')%!]_P?J%@zRzR|jаյNˉΛ_9? +lZ |Es< *y/wPN""JcuهCJ |I|R=(sJs.V".DQJG%'W=%[TuJPPuPPyP(Q"σO)t+oQsSPRDhgc_nN{wFVd3kh?w{\ZQ=qhS{5_vӣh?ܺojnoO۩==y=O{~S{c{>2a|{`/GoǰO|E|lĉrq(jwdާ|%UOqR^X/U뼈EI_J4KbչJGqS>Zi(U8ٸ݋Q#↨6i㔘ڸ&36*yJ7qUԏPԗPH_T%_v9ߺƍe6C9eg %J?(E=nJ߶o3HQD1]F^KRE}wGQRGU%굨?: JQɻP;O]!Ok/Gv$R#JQ;>3@d_Xnǃ0O"Gv<Ȏyq);dDZ0"EEjPGH͸w}%iq=\T)wb޸NJ;|BjIr٤roQ;kO[kTi_@!}~Y_8ooԵ+c}X]}R7G)E-EV6.ȷj+c-=妹 Qw#'jl^yn6ڼ\V+y=qyG46m#M1[Q:fR$}GU>Be;k%(9[~H4kgUJěhՃ)+fwcuez=6>c~BJTJomG~aymP >mM/*b׋{㕨wOܜuQ۪RZ[ 7#l}ljUdl}Qz&s}OGI cM_U}7zR[o>燕ImoMqRes)чJsJդJwO)7{Nx%R)r[;9 V.ZD_Uj?CIJQ*xOTe.٥ʑoDQ>֕wSm?-w^1<=fG[lzhψEK*zПZ^]noQm+ڞy2ʉF*яsyפӳoGF(>unMCQ3OQ_Nrٮ%Xk=!_i-cW.?4[Yߪ|̹mIu.׍7YzZX)q J{7_T֎jC )uNnz'w~iRƁ}GQjl(R{{.Ϸ뷯o0nkR8O2Mis(뱯#"g)k-fϴŪo+w]5Fj8I:4A6cA6^yr\*8LQxٺ2|v_@zNmmF"dlR~6O*V^ÊfИG[EN^G9#o^?V61G~m?׳b} -Mnerm}X݄giD\m{^ź^)K:V;~[Im]xy:an>/fyٺx̟F hzz R_o]}W~(j׾~oנY}lAu=o 7_QF1}$^6]YƓ}c6ja6jh`^5j-on}="!cMONWzH<#Y;}:ya*+ȕ'R'?w=1̰cqc.~V$7(1|1Ex(˲nV"Gq]Kc-G>\+Wos@|1 _SD>E!e.jm)J!$]|5|v58*EŸe[[L(%o-^<3*yjYV.XA<JԃPQQQK{[~yiyiw!/JZR΂JQQQ E\ZD<4[ZD~MJԁP)U΄J<)_y)((ƨe*7F%OH)yb)JQ~'C<0<0_yaTuS"OmviyJG/"όVϪ٥yfyfw"όYYJQQN/Q"ygDU< ?#-U"o"o""O"""߆N y]z*UJCyTאD#EEE^E>EE>E|%(()uT!+?z`%ʟiT]C+1)/@1Oe?K8ssttt|*%JHUbbxyR7J?隸w},xG{ӌSX|I|1N!g\_M-f+]J]QGxчxy=!pOQF1Oe?Sq~q~*)1OrAy(R%S K& E^Ÿ9Ÿ9Ÿ9Ÿ9Ÿ9Ÿ9E}> +1N1nN1nN1O8:8: +{/:Tg(P>qx%'=[.b6J_F1O1f표Ty K7wF[;k[Rlr"OkÅSrV(RJ㧇k&ҕ33ץRkT+7[DE|my tɜiZ/B1E&yT2>8d)1 sb_(懣"b>< < ڽw3r;\fg܆mh&\|qPqPG1^C1?=iM6(я"s<(T} rQD/K*%JP=.hR?1OU~6sJ-Q.kvB KNWJ?|%((((((脭{ +eTz{* J'P~/Rw(D Yy!+ߔuJJT2]@$$Z)=}_*E~EI{r]D%<>ޮ_+f{#ޟvۢžGG\WFj?w)S\FsEOSbe9?F,LWGs+q1߿=.cn{aCE׋E_*>b}!H*R[V>UJQ!KUlyyKV)ח^㗢%+~1Ioyy}~)I!?O?*y~GG%owTLR""_~"_"?>.,Rɇ+RbJ[RϲV[yig?2ulk+"?J_%QyI>Zu%Ϩ{T #!?N_3__T򿲔'"f\B** YJUQUQUQ̻E4Wb""ωg?@~d%)yDyCyCyCyCtjmP"/JOR:Vb=*y;ۡr]V"OdztSy7OU"""o"o"O"JKy-TV2;nx&ӕwWy(y(y(ѳOORJIy%TJ(%o>hˆiJ;B%$UH1H1H1G1G\%(*1G1G9C=:ԦJQQOSQTx_}}TrrV>10-_=Awb+Eܕ"JQWMqG'R=sD"IQL%_})PA1 cR))L+QOKRf.)U⾉~"G%#[&E܏"GQ_q<*YJoR2mQ[R[V"O"GL{Ɲ/ץuØa%!&^/TI4EE"NF'RWWJe+1_&EEEmѯŶ8%\q.8E:g#ZyN+碈sQԁQIe)G)q$%;ǶSbnNX%΋q0q$:,Jh~X>q3+:+(:(kQD+[Qĩ(FT^ҕIQBKLE E܆~Ч Vn⺑\2?kȿo\#BL%o9.nk/>;Agv5m%Xj pݧ}z ,%=GxoxԘ֎w>y?Q\ҋWqNy!<^<]n˥-+-UO1E""O"WrSЧ{Rç*ѧnzr}J-WYZJC7 PCqO%.9,JwSmۣ_טiy7y5T 9SG/}_맽1]8rs;o蒮d%潥r_D }P()ZJ_+Kg'w'+G"Dgs#Qđ(:))T(>q~BQKåc>/U)!H*d%Ї"/s/CQWKoBW9qSRQJGe+QwK{opo2ua7R]D_xE-E?**y ?"?"? _T'T( dȑS E<"EϢ?oQ>߳g)J_>q4k;r|Cu84Ys(ϯr'EJ({=*Jo U)ʓ J#RPxv82ߡJ|2_zDyORQ#R7TJ|2D|"Ie&Ox$E"H/~q[R%T㕈OR=,PJ=`O%,ʝl +QOHD%DE+EXE> Z`6j#a Jd{>*7ۡ.-b{~-C!E|"딴>߮߾]} >I˻s+ҧ9Dܓ"JQm(E\SzRiNK29mQ׶i~j+u~JU[T"J1 <(z\>PJ?\%)晡Ϲw=X) Ϡ79EBx2z|%敡'Sē?W:7e*R)J&zT% +Q_Hw17ax,EJaF**_^z?ExE|b̏A"E?nrG./`PiׇEzI"zqE_}H'#nqP8(qb%S;RS)q%)}'(џJ]}qWz/]ykJRN>E)*G?dR;\Uqb B0G:{*uoK,Ex0-0#_(P"Lΐ<eyd1E">LZßݠDJb_/Eub@EJWSKQ:E$tJċ=G#W*?S9]ܕUyiI*uIK6]T\$)1+~yJeSmSiS{TJ%XPmQPmSm1ӚTNmHzR}ӱ])JySQP"ϛʼJ}S)JQ[?TSG:[xxxߖo,-NS?7yK(|׉SoE(Kr}DEq0q$q"x T\e*q=y./(((Si`+L1O:mp[WS=[ A7?n>%Q RG1/9Eܝżt{BJHLe> %o(bS5T '*1A@C+JvRq= QSmCKp0Bkw#SDf75t¼"_bJ@1?4k%'lRb"ȕJϸ1W)k()S7/P6[ITAUbox^qY2YRZg$afw;{_شl#ƇkrD88y32rXq*:JPP0Uqqx<y.G_$vfϗC(UWu<^3x~//t JgPO*1A1A(WJ^xRIV"No2gX`[(?LD"MSs)TJe.Ϸ__qc-1>%qc1E_ 82Eܘ"NLRc\<? yto)?n6qX>߬?qfj߾?_(h7jPi?o{<ejoWHV M'JUb|b|8+qyIivw8<8Eq q8=41/ EXz Z7I(("(yKUJ=T%MJߗ :q/Ub<3A3ȳ_BO/UJcu%s:uӔS)~רNTU![+w^R)ч"N1Ÿgc_Tx*E|<: /zW\C\Jt3꩔|L%T򁋕CR3QE\"H7 RSȿȯ>q?|Y*}v9e)zq:*ӕg!K|S:';E|P-gqZ%?)+ޣPq *qOqy:=T+utjBy{]nPrx%)"OdЍ;4]y((e8PQQP܇RiҧX/a:,%@SG6E+}_)T>.JnJGS7S#Q{NqMr|̗N<}9}g-Q(ב>%<j+{גIʴ,yNy)i(|(7=BphT%//D4|%))7(oEJ ST~~~YS+WnbRfJX\)qJn7CsM)R>t%x)-~~}u)|ÃsPtl)/CdmV~~_$ż[y6u})=kHhT//3v}w)7iƸ.2_y.4e#WKDϓ$Ϥ@)ke+qIwBQIqIWB%D)J(QAA^qǗ(q}pw$)eK_~|J%RT~5cHnRc=N-RJ`jI^@gtL%k)Ʊ)Ʊ){)w/OVbh*ʉZڠy$}~S牢N:W8E\J4[EE܁"@%>ļtbQ73P(q~Tk+QD1mX֎;G[Ю?W"b>hl}=\S@ %/G7b>.(-uPWTf(RD}mpMugu.|/NqGreʈQԙS̗E{}bG(QE7{=W|,#%hn*_>{uT}(Qĩ(ϩsV>qsJRJ߼KV"EC~V=N)TJtًWJ ̳V:;>uwv>ѪSWpqEZ};J\J\(?YCCCCqO'3_18 (QIܠXmSD>E<"N^})ۡRS)TW5:JQ]2N(qGFe| D=m5Zۛ2ΚB% ( ( hGr _ԝWe)_^^?d)c-w[0oR+'#@%ΗS`wSF,y?#.oS˹OR+ss9Wr]^tNj|:F߂}.Pn_n_7?+uiJGt$}_n$ۯR˯),_QWNغREn{]+](e=V/uK}SsntP鎧^1JnWqYv[t|[/;D'ou|6_7uھ}}%}%.PGV7>sa_?y8^ĭW]L_W*<___(k,I)yJw<;?o.lt%}~vu%}85˝dԽT)y9Jw|םWz7(CY(Wq__D9e2Xo#f)ݺAh+G Y[W}A|n!շ =ck+Y_,VJls]AJϧۇWq ?\RVs)JwJ_|gW2v{uu^|pJJu]>Ȱ]noK}+ݼt_}Լ@׾nT_~!J>ͻ˥;]kvyy#p~~.|r~{~cy|?u|gxu>n_k{ }bMJW-Ru1}wy?(?}}#~a>}ov|hy㑾tsT7;Uu||'_798Sns9yG+Ft|z%_0[k>qJw\WS2Εt|/ce]fvSMiJcfс6)X/WS.JZҭSu|G=\ Jw|׭S+qN{_wp_7ם/K|Ku|:Hc=gm]gn};+ye O= lnypn?,_x>z|f{#ޟ['GuӾ_>8T++eWW"|XE?yϳ뵯kGbξ݃b|F_7q)qn>I(F_7.vmߟvϛ xwA5ߛڞ'.l:y˞yҞGy֞}c}ٹnw2yح'~_8EȜ_cdރT=y˾2B>Q }|?ٞ?휻"ߟ=/y¾n^+yY[_'}fTJ~oҝם.ϗ~baey/J7ם_/u}~n/þno3~[/G#kǾn֭Ⱦv}˝oN~y?7u}2_XRs]]RmPyھv}Kgv +_X;(ݾ㯜Ww׷׶_Sik?O<}_7O?5co]_Aew}}7s>k?Xvu'v=osn^~i ۏ7y<ޮo㼇sfgߟ˞:!~v{b#~mϗ=_:1>A:%_oM )>CRT]5<[nSRTtJ_"Míu|z(_[+FZםg׭'uy|5T[CxmJwrҭug!^We)?db߈5n}[_R}#OZ]_+[ѭۉԾ}}iwX8luҭ'u|gHz"_sR3e+z!_^wA)JwP[/+u?JWS8k8_#kKQrf9CnRVwlV)qLe/rXo}v}}:*Xӭuj&(oqS.|ӕ(*_w8_\xڇB˜wgfϺG>j OTTN?yuw|>cno)kv$)ݾeGfz.w|YRU}}z5_|ݟ^T[Q)e|`.g?b\ux>/zc-ǡ=zD_/vS[+Bӕ2c~=c=ΞGbgV?]ig۞WgǵKW:c=~b}ݺQgt1}n(1@Qt:}\t:}ݺN_>wD}c]n֙\᏷v{WR/J׭u}ce$e(jEJv{ݺa_{|!gw}íKǗg߾R(V^2b}X}?nouܾn[gz*ゥJܭ:k_oo%Vfy}Rs}e~T?vkoϝםW鲔't; =ˣ8+^=C)󢄕n?Z__[+ʵ;fWLT"/J|>E]>E]>YSç˪LYD=E=E߾?Aҝ} %W׿Tyof)ѷ/C@чE>.ϗ>eXo/}S@%P%R2nTT)2۟.3*D% xGnt_yAѷE ǣ=^co~}8}v7=6R$>6>뇃UUkOybНyJ{}eseŞXq^GǺ޷#7^W鬠2꘯qΛkAy;o<w]|g*g /5E}e~ls[)y\Oe*XׂR/[)q\er^[٭sVJ@οk]8_JA]x{}<;/zPR\RWsvrv}p}I<vMuMuMuuzצvJc-GMZ:%-oeiݟ'.2uRJҿ#SkzkzozkzqzrϟPMQoM@ ()P[SZ[<^;s~};\ו*μyJT==j6Jw'ߛWU)QNoD7E6E/E]/E]/E]/E]/E>ԍ|_rJׅ-³R2=ыJPPP)R.JRmKU^RA *eޣr}u?LU1\%ꄨ]_->%꒨;ϒ;}?ޯ}}Xg߯{ooooMM,/>QqY +<+ނT;*QEy|y}_*Jw(_RN?ޮϾ><@5w>/߈ևP}X jkߟy?~Qшn ǃ=^cMNg7v$Y"j'Bv}]{wMPG;F(1sw:3Ct)1 Y慨/D=+#tN@J{>3{C4KO{^E}2{]o€.\gEW=;2AiCܗsJ8I){+QOu_H{]j[c]ז:nz^E\X׽i{$'uAu}zѝם^gX!;7 7JSܞ:Ȟb]=ムu]]zz*)J{/uwY=wuX :kr-+彮7׍?FsyuzqZj߾_=RQNJ`H:T:8:8z]7(%:"%궨;Ϩ/,VΌ&izWN..Vh*۷eJQWyM}QE^+Wc:-:-g%*r|w^T_ĕ}}}o{Ug.ϷgϾ̏Ay[}~)Qz%,*q\%L+%4I<]Z{)K1<uCuCyyyyTI3ӕimdNbsEއ ҹ;qyy4rԣPԣP/3[?i;XD>(=ߦ2OV﮿>hڠʃ&Jy)y)D(żcQRRN/J#Ne1*ySYD'E$E$mjѯ6s (GH7Hq}ݟ}T%濦#;vrcы;_sRrɼk(G+g<[IJ[F%T'v=?׷G{G{c8=ovwyyyTcJ=cy.yβv}^/toXqy(I˧˧ۧv}̣|%,yuwJG|(<~MWb^)q矩<yTU"^ݬvd'*;}IyTسB<0R)y=kk# K&+&|K,D E 8@.%%y#TD܁UZYJɻ.R"O"}Oˠ/~"SiP@7A\] :sΥJzwcLS(GB OG>- y"})B(B(SGPPГ,uPț{ݶk%I)"(4]ȫv'tNxZ]+c'P'Y}9E~ |:Jߦ+/n:ĵ7.ܭR/L%OE<*y*J}p)(M(M?+Q4O2rgV"S++(U$nE (J}?]d(CK/D E lӕȟOHѷ+E E E*^ȿD8>ptg(W9qSRnȳ7;Ty!2ȣȣț܂>g}(QEW"o"of}(ThJ}7+BBBz.I8S'߲RY|7:>%߷a{/%旡;OEwB%nD^ BJ2_DuqmyyT{VE(IzeVr~ՕȻ_X7_Y‘ Z@+4hX&I K[(J%ayTO(el%(GїUSҞd%_&)/[<>^)ʻnIQ"_"_w"_}~rWw J7D,| ||zb+;I YKSJ3Pɢ+F1XYTrS.o$߲HSyӕDѧ"EE^ݔ2M)q<ˊS~Jɷ,U~ѿ%K(K[2V"bbb|< ʾ &]qR'*rwXϗ(b܍wb&-=ERebJ=rm?++_?WB1C%3D1>IJP{~z*@J S Qա㥨7'@u>_sʻ=??aZZHHHFMJ鿲Oq"q!gkODq#@@uTsR⧿(1C1AqEe^%uuTPJõJR7y%Kҧ0Ux?E|"O:H)M(ߧUΕr[k*k5 QWZeՠJzxX@:YYmv%uuuT +/W캤T)yGF(9|YJЫ#WyyZS΢pvm%*LWZ̓x*$OW"~NO%T; (?2J'A),Tf߶P)JePĿ)T׉J]OWJ}hR:sĻ)PߣTݔA%GTezS~J_T%I]x3E|"LQH%\D# Jg:Q4|])cg W/XƐBSSb~x7zx%)ݞk%~Db*yJ`RkWyWSijj޹AiO_nx3rRחDJ^\hzƶ]:+QGˣUeRщ.|J)te rOUʼriJij)TxuP)Jķ)eѱ])J@_A9D\".N8@l^)꟬I(M )r|o/Pž=0/'x3EJ{"Ј<}A_)QH:.Eq*+Jb\2iˉJP<@Ծ>M`թ'|G*@vyi/xPNu7LL~Q@1DQBQwBQWBQGB|S"eצ+1q q&*:(wҧqJ3QF1D?}Ӆo+1D1D1D1D1D6oPNt^h%J'PtRUObb|b|b|"nA1D1C1C%"^VϏ1~A1>A1@1@1@1@qI1AQGBQ7B*ͽ9Wq*dUWJIѯkd+ѧb܁.?*~Sfk y|?UWbP%!(qyuT2(gIѧ"N)TJ]-JؠDE=zT_+GS(P"NgI/%qrzNJ*OO7ׇ"NN%N^DJY/jUWSCWSɋS"^MϦoDkG\LiwJē)Te)}| +V"L%:7,}R;ْD5E5|jqtd[+l_*}RX"~L?]`cx1lemZD"~Lr|\{.:g"L>H>pqb81AoMo=>ig#??/Tr\>cv{coOc]]|cǗ=O{m??[H FG~Юar˖9Kuvh+yɟ{ضi=<??88߻&;klW~u_oR~>pWeP>S2g'(~Py}lG:.pG?A/I!wC_&[`vڅ 5x?Hp?e*ews8WQ;|;)Gq<1~bO/}#[mYo&G}j,oѵvl{)8?>({\ю8?nw2{5z|_;VbTi}fM䬯ԉ*{7?߽Rj{ "ϖ7u_UV:qU^:c8gI*sZ /JSVv[8 ʕsUꊕ'9V6|y[A7||w-u=y];xxvrrѷk\p}\Ӄrw[,?pdO9sd{|sg uOqJ,N}?MOލSuVʦ'P(^گf0*VPXP>~)ܲ8y]0_N5zK^R/O.VWouf<1M)y !^P^]aqڇ?X/!8{~?m?2&4e iT&U]xyXYa*m~㾧p}<}iftv[xͨs')0>ӵ:<ՠŝ+Ns}C8q:}w=2vDP/f}> w]19Ng]7Fy~G4\P}>+N>/:Q&. +qd+Tj*nT{zN +&{//#9Z۔<ǹ_sm ~*໧nr+q'D/v?:~s7Ůwd;{\zǫ9#g[S=C+cXϏXrNƾޫ9#W;wʺW׫G`nٵPY]36\qs9qzK{zA=]6E@Kӻ-z׽}7ee=?b=8q]ÈG #6.y3ڝg$4XN|#[ bݧx#O}1sb}|ؿ>XYdz8,r[gy_{^;w|dh%P)}J{XT<}'pֿղ ^Sz׽56|Нiwޘߣ, rfYQǼXF-|,/&惡q8#95v{{qv $iZUU>펌>\_=ta1߷d&:X,k{#T_.<)y*ׯq$KɱƑlᖺM3W]YUri}˻<6i㠜/o?n~Lm;?t|kE5θ6-y/W,T\=f=GCoq^NIS|ckӔeb83ۚ]pw7r 3.C5bďY}o$/%ッ޿:zK'9ǃ|c}ΞǺ_=~/]~o?^;x{w^/睷WxP}ġib}o<q˸~u8>fwcg{>bg8GW$VEr>/(ǣ=^m ;ߗ_r,u {}l׎-P߾ߕ2o_l/w{q/.`yW~ORO4_#>g!4qGvyYӱbߟBw6^ro?z{^ƛ4|rh1|~/qyq|5+[Wx*~bSk7]]/ʸAD\4V;V>9yE}e +MQ 6?ˎg;nK*4.ZΧ *(o| rӎze-K=WZXo}vퟎϖZxWaqz_;gݾr;Fw?w<{!b{Y˽LjqHhZ닞9#w'|﷼ݟz+Flߜgz14<[͗)$rQ?!ƨ)+_΃?/K _IuH9qJWμrgź?)^_g{f{iDexF^Ɲqh1^+O*V~ٿ7eV^fs/qXxKĸ2{;RJYXy޸L"xA;^d7b]x05=~?/{+3)|/~y3l~m~D|?~-k+?9K C_?*1NrkBQ#ͺw?ѣψgD/󽗿S{e;X{=i{T￷1]O5 Zv>1)wX&O;KJ?OO:*W14znǜ8)]Y]|LM5v7klφs);yAA]n~>2>N9&߸aMqsb߈aT:>02c1fG#OI8w㿒yJlhHyGɓJEw _>\iozHv$༿/Jι/dg_lgrs:9AxwOFt_4۫ >ݓ&ڳy\_95A9Q|ZݩFzNktm_\tx{R;*ķ:,,Tu<>nO-徒W;O 6'~qG*zAzz+_un^~bo˟O?ۻw9ۿ *﹵kqJb~y뗵koļۊ?^6ʼַ<'>}@g{>*^>GzuW8vP';_KNxY> +4qw~[y;%ӗfJy|3/|O}Ev糥xO*U|F;yJ~?9d9]{*g8Fd3^]Be]{2SX|}Ag~royBʙ?ݸYY?.N -ݏ0$+>:qK_qz7P>߸]8 _U|Mʹ1N>wC8[uc"A)uvrAoҝwբ ϕ M|4eYnϴs|~)sxc_n_[o?I|MWw_x<tqy}y.İ&󗏛+Kqaw^q_&Mi^UE<߮ߝםiXxwr__oپcM|_|\Y˽X=>Rz埿u!;~w}$xxZ%RkK}}%tsuuoT%/9bգ~YDqwַĝw{3ޙv<@!MIt;oߊww^K*>օzwuun[<ݾ|ݑvOUY+~m;Mjy~_qnΛK8!ϝםi=MaUKy;﷯;{Ӽ+~ ϼMV[Z[㛾w,'{gt.wOl{O>6wLSVzOؠLJ^w>r;9-.^a:{!^.e]_Ym~pcsC{U1oq;_{w7 7/Q|"}Go(^}{;/rw>9ߝw_vs绍kwϯr~`~tMMkxzwq1>RrB]>dRCk#q y|K:閯s׎0OgmMt7wy}[Gz}q]P)=ή[go=O;϶sWՐǹpGz|o\8-w^ou7e~(:ttNgC~ӝ'ם?Cn#ߟ7/sSzPyܡ{vk;O;Or۾zy.~p̋qɾwV'Gz=؝We~EM~Qz+7]o:ȝWםWG$Wu^g;rE󝘴n9%^¹y.,Gu;tӅI7/7٘<B7tt[yoLt3F(qg[(`קl+-C-ˇN?R9zMCg;^veI(:f_?sS2f]P:o|;t|ӑ./sҜ{m7ym[h7מͼB#^:񞅧)Miy<Ny8NY/,ϗygO{wؓĠs+ 3NBQ\xܝg;ґߝBzw g_(6H=O&lG%/t+ݿ]a"dKs7{ʼ!;w8M_q0>k:sy$ur^?ם۷8a|^x㢬FϔEy5^}{/yO/[?6_y4=_ά}WsH}yҝMg;_r43\4}Ew+̔wٞ/ng=sy2?cʹ*ښG郐;OkCGD|դϕ</7}鼧IK>]!|r^%2f x>H;_{I쇗kPױ߃}x|zul_w<ϟy _e?}r}H[}6YgY{ϗ<׈?o놜@I(3~߼;xqnaq FY}|kmPi{uNWuiqQ->B=g(kϾBz6fɳ84d )wYZQ }AK </֘7qD~lpY 1uaͯޔMOt7o;s=uX9+ڄ Ηvީ}ٯj]\o/=& 6Oۭ[zl#$ު=m㆞סqG GwX\(W}XmUA5]$~%U;,mGuBQgu。N>m(V\+A;o'uy.=9[7{Eq24WdCJɃ >/A (v[T;1Mc%v}Y?}zjiz%Ͼ>c_@xC}W#{-Ӕ͜3y9tߜo-','?Y|U^sKe?yϭuμpmg?!$7ީR'{gxU^v:gS^?qFtʳ}Xp4[=30[h/Jd"W?v3%q?udrD?Orm*G6?ןwN}g}dC>ot%ijRg?>3[RUq {݁(njvib͐ŋ8_چGWG;."vW0KC(6{ NYg<Ȣ5g:˟8 %o[we&gl{O >~HS.lޠ=ϼ?Jxe'.={Z//z+~ g}OTv_w=yt݉$_tՁh>q7{:ޛ{Z{{^7\c>=OnGh[ 1O@l>SFR>V3ae+ɼӇ6B~8R2]dyB#~:/A)iǽ'ļz%?(qݱuOڌ*/|#rWawxo=eλ]I>}zz銕'I>3i\!sK ?'yzֵQȳ표k|z8iv{?Sߡw4_<ι̽_ rT⚋9{RƭT\w?y3:yé)iӻqJ'ߟ@3Ϫ:E'ZqQLPg;|Έ)=wXkNkּ!;Ress)] Ize;7Z`đֺRӬoIx˴"[w%:Rϐ喅DžG88qژ$N'dK^vZ"[G]SDP?'vJs85Η'NS,cRq}{U'DZ/ZWVgE/5t?mI7;yd˻g$y\ .WWt_yiqn|lғ}%q?+Mq)2XI|'owӧl *{=\>PޱxxYo ibwH<6 $J~$4B\hY볯mWYgGfZF{~lS=.y?V~(,ѣ=^[>6.-3R`_?j .~_D(w2gϫ<˓$_r'w~)A>Ľsڤ{lkx tzmJn'y̛Ζj&/GᆲGeGSX/qː3E:P/#O>m,?cI?>)|)Wg[ϔϕ|s\(G?|M9vOAj~^;LI}vSZ)sM{Z{M7=5OFksqE). Fol \rnl߽WWKP>u=Eُ?+s;JGɏº3瞴8$JA?o~iQ^$׉4{+ߵGv<'$^{}_<{~S+'_7f:ajW:Ʃ=xϫ|S."_4B}ޮ,;C|}D73Flޗ_5pr?rhIZGOYtOBg]VO or9zΏיza%u?wJU9v YzewƼ1^ekkw1CWh璉lG"ﹹF3COF?%Vy" ˊ~}_SF1/yW??i'a *y}'? *2I??u {ND?gĬ +n>[;T2BZ?qBѷeBSC8;mJx}]|tG_:nBݝ>"KojI0vYuE!{䆢ϩ;B/iy gX=++x?lMƣ.cC~BGImRe9ҌiHoɃǿ-Bw#ucs~}=.+yde~Ժ}b|&?\T0U5ϝtZaLեO;y\<<<8yGVC?Ziw'aG:D=~Ms-Q_Dt>jTvgpyW+_-kB㼿;~iz˾o sOu;yZ>@'w髿qåᲷ/xY?o `f{(.qgo}</o=;|Vz="oޟytj}|y}i$D9z՝#o3b{Nx}էю{o N~/rG+^2b'ƂJ|)qՈŒ?>ƵagC1z҃+8~d㎟~L0=/>rMxBُA_^IZ?_-(ja%QpZ':<Us>f;$:w*TkxQ9f dr )y7\ڭ㍒kw:mLj'vrSfzA6y?A߿E#vJWv?Qi?FڬF7Sޙ賖9[d%S سr)xAlЊf7 }ߓ><EcQ5j y5D%sKq3y7~ wd=2^_E_-*yp{G޼S*6Y҈(OHm(%\kԇDWV=fƟ;͙熣bzG<~ag|~J#y,]ߔ2(Dw\>=gC/ٮW~S(Ul7y0J*;Ca>lpi7gXjl9·OSqv=x~(hF_fz+/|,>=ow(l+s@ (q}=$B'>ljߟ?rУG>yC(Βǿ+BQD&~WҭEGt? ^o 9KRCo8q)=>4|-E6%`Qɷ-/{}~+VE?Ce|6-R)/E#j߇=NV7G9=w}=jAv> ]N)Bs{ 8뻻ȣs *?K(.{?±!߲w3kZV޹R8r}z?RmH_"#?iZ_a~Qr$Δqo.OQֻЏ) :{5z.{/#d<&}(E۝;)qYd}7Fzǯ]'J2.33;CC99o;㾁E aU~Ff:3|.}y3]CPvdaU[[: }Q_a47j܃V[a?;fɃHG(%՜K7m&ywDҽX~QQ[Y)yGjq˿_YGt֫r@:pԡo@GiU 6(|Z?j(v @q3`L22`gߗAC80uop8h~znE&:"U2i3O/̧%-*K}-w^qM~7TK~7? }e?.}?OK\?E싾Q4%܀os>> 2%nk}r|}?y k'KJoE_OyRaz?rN"9d%}rnﺄ^َ^B^R'C%zWV/c5,{<{Oymr禂yoBvZP.2./ۍUߊV7WoɇX7VY>Q7U8Q'D ?oD?{X{}xŶsy(E~J()ExռeGr r!C;WO{oS~J=azR!;i!ϻkqP伏]>?GKEw`&yR y/ﭾp}F;vk㻿??wVHnR}oHQ':7O ׵J"-v{.|ϯqȐ`ژ~hkܻ'o8=CSE~K$q۶R9^7 طwrzwo}Ⱥ;{]=sCa߲^goR=/K#H>|b?>g8ٽ+U7ɗ:8w:8ɳD ":ItCzIg4O?GI>縵c;٭ ]_TN^Qgsg >>W_]wtBoߺy}}nޢPF*USuލwwsΉPtO]wJUWEs';M?뺬Rt贋JJW$<7Y]'Mޖ:+(:+g~帟dJ?2W^ܣ6y> ]Yɗ/v^犢@TWK򶯐}_HW2a;2N[[Hy[n)rO0T·?].߽/syY])ge9s9P|.zy<1*+}"x~54 teJ_ }W('Eܲ/1ocǟiR;S]:oz()tx^!0(P 7 A޶|:5>r..#pCU{)nԕG*G!G }.y&I:2vQޢ/?vG7k:_mGBWwqrPqqJ)QO;%url2KrS:.xʄ]z~z'\Hig*QOQy!/Jp2Ѻˮ q?處i=5r.M⧤kR_Sɥ>og.x ,k|NQLQfGץ=_FFǝw{YϓRG;u_35q)d[wP?c=[m"5$\8ۻWk%iʮoYO+öB+Ek ^]y-eubKegR}g~_,G٨;Bg튫-uPTҔǤ=v9YLBzϐu^I#byIՍ EyY}=n]v{cX{fQ3 ţHߊ3g͸tD:3Ԙ! ^vz1zme匞-o#>E↮&'~\q\Mz>$(>UGfc~g(%B&f9fskvӪdoM'Azܛ6Eg1Q#4s[;ky <yqݖr?<SSSԍ$ȼ={?/)OQBQx8%)'OTzϷ^}x˾_?_ǟgY ;"}VCJɫ 6MSbHc}yu!LQPA'G/pbC( ?Яz,<|2_mo ɒTz~৕Ux[;~XxEI4(Mt~C_v\SOdxGi~k}Alρyݤ}1>5I!CJ϶H#;fz7nC7eqѓǫ'giLb|W}byA6~xe]8=//}^{V)tDž~|Όrr"N)ZH[Ӓ8w侤eCӎ)}~f7o߭ ;i#OYVz~G_i"}1"~'pPh2grWoF[#_5B=:Jy-;ozFm[6#D]gC )e2D}\Ls^!iW/Kzi\) ~ TnoX=|jekz#v{NOhz'MC2EN̷+4C]8|v֓p\;뫋zl:+E%H}nݎe#xA5-X{ԭbđѲ|SmO+=OwKyӾj=AHtzeڨ?oߗ)QS{qᜂS4X$Qϓ5(N;"uPJ߾mxglO_9y^|f徉Zu5+&q5d,|jLc/k y{CS5RKSV8xukHPHQHQx\g8ϫ>>:/] UzXy_QW}ۙ;H]2Agu.;`<.<9bOI(sm|(Y^]W&u}튡yqCׁ2K ]WȚ[ Br?2AѮ$GӧMΗO8/z=}?2B!Ylgn,d\u[C<> Bx %$tyzuU~nB8Fy;<2̞18~rs!G! 5Q ?d6o~u]y_qF]G"x qu9IE^oEjeD(zZf#~ui\|yhגgcNx5=yRl/w kU0fO[(hG++΃8_lI_ޗ *k+%V/AZNwuȥ?_Z6A;r\O\G[voh3j`7Ǝ|p?%>  >n0c) np\1npװ;z]Ql;;WFo^,?V[#CW\eơQNhtҾ8n_skDE+VE888A/V#I+Uow|JFq9?2?yIZn_+CO=W6u)Zpލ?U8WcLÆy+^Fh׆v޵:]aj/o߼#1OQl|ndJqyL-;۫Zo]H|K:ʫ1i&;ix{Z.HXG;0eǛRz7r:zѷ5_V׃z#~-Svj2P/]'Cv}qhe73j#qnDMXqj88Y//:?r+3wi$?SOC'Ǘ)Λ^^z?@ܰNue_.*>X>ql'̿dVmD?3pPP1cVd˒pm׈oF;5.#x2-QW;1~Wv<.[SjcNv!e ˆ'rxp`O't0?gExӇ~ڑU%qkd̒П٥p:kuc̒w7jӻ  ތƱ2gE\oq;KzqLy5?+c/Vdϊ፵dǎolѸ,' q J^eXEsv\xZX>⬯^䗆KigӢ1༯&j ]a~Ύ+{}2W8 ʯ4"`%/3"y+|/qS2wVdXEtL븄zX,/8taV"*2ݫbf [s ,yWDS<º>}Њ^̏S1r8^?>N)y P?acL8ֵͤ+jdzNQtvnwY.Շr=*2"m:x?zMFה!p*(zb?юhWG*.>_i Ur}UvESȑ%^uyTr/m:Ne:Qua:QUdzPEL4M._qǛ@(ʃ:vv1]/!phӓ:v1cӏ:vа]c^Sb9ӏ:vCd];1ߐ[#ӑ*r+UdRſ-gy$w0"UWu`zUO(d>K]c)A92ciKpծ$1}")2}BQdz8ERAգb\ ΅ELXtJELXV\YtP,c1MW/#enLD;kb7IyԢbRd/OXtEtϗg BR >]c!})&; R.S3L_v`63a{L?*9LUU;ކrt?Vt3$-vWQG˭HΟ^nq>VRG?}ye ~|yi"H'og Ӎ}:RLUo/e:VE{U0]^a/_黸(`A,"'RdFIR~x;)q*o:^~PoU܆6>:A&)q714E:.+fL5+&x8O2r>.DI:P1.jUߢQ[91AE>5K|lbOt/r)t^B-X~OE7UQ{<Ǫ-<c:p͊7~;TU? 畨20ycPW+U.\#dF<<\sݿAWe1֗TrCWw[Y\< 8@Oy_0C;λVa_?~*i?3NmV15K}g1OEHk*™~|13DXwom/=r,b0<OwEOqcl{9Bn:qyog^M5ry9QrhwArI/34s\2f^^/s?G>fsٹ_ ;>p?!8sHrƋQ2k  hh~C2r1eH.;ԛ3fN:rn &…,3 !7fpoCu= Dݜ$a|xQ)WfE#ˏgf._@?须\; 3aLøPo] uN~X;ɩ΢S\[|Ex=L/$P p?)hp"}yS0 V8)\/8'q?IbG?$0'"o=MQ5FԵQ7Ln@ \>'p䦛;(9&p}x'㹞|<ד(l$Y~7E\ <r$K&@?uƂcZp4r}/ |1oPA{~Xpԝq%2A(1%Q'lX帽Bk٠Q\7,8r, |8\?[q"%[)+΃'z>`97RD]txa,͚*V.vDAgy~|uy|KKr{=oh [(o4SqGڰd>c_g7c߃$-_ێo'KBH~[H`/n~6&W:5~<#wMԂ2+FliDֶ#]~78 Oc(4|p?p?!s~j 9f$+$1$ˠ؎gw o{:W8¡܏DT3\^8|?񸫏BUQ'%DA?Gc;~& ̧xp\táAFQ#CAOeORrIG苳ɹhp>]07 %.'"D$:xE1ja> o+1{}^>[t,sŸp}$ BgPvn/Oa"+z=$>,$`/!IOq8/CoPyW+c`q1~9ng=_`wA?;c+ G,tq H)_|W\˥;V{Pי7+@_is?E'_щUv;|x;4se_&_7с[Hr Io[=h,ڷ+c( ۳ي,~=E;7!ؖEH8ۊ3;o$$+K;p?IKſl"$YlGk7њIHr? I#p0ߞ] \Y]E!鯜OB lr~`~l-1#k8Zr IDSHxڊFW cAS9Zڒ-$~XeqK#3$#;Ʈ؜}q4Ty1/E#kd~͹?$h:sɈmr+6CC#~͸_G3!Yne\D?/q3op+rI:\ߔ%_ Kxcs;ؿ MCc FuCYn<x`^%b#\74rFO 6}C j9E9lCߠ}hrI $YaEgQ)Yn A?lؿ6~Dz㺩$"jsTq j8n a&WqƵwrQmtb!ټZO\gW;$]sDkwnrI!qȓS1EU!>$ƩT庝*\#٪HruDU~H눪ί\yN!IG~ھ8nPPҮH'A_*/ys/_+s\e/^q~nomɈ~qNoaUڥG?Coi=߿G6=?b/[2(o<|@|'wCߍŸG;fϋy::ad|ӂA~y?o{j:cRCz?5Wbj$?] w!O]|hD?wߞ7p?7,}3mcn~W<>Wq*γQX^uGE$g$UEWUaKO>W~4&9ڭ0)ҰLޮ8$w\È7~YR*%eemzŮ/v=ܧ2MOd}nدsтԕlP\HUh',-^s~6w~}dFX`s'G/.fp[@B>˨>lb(/xlsk\xgwd[#\Q`eRU 8yi7;+\7=y2uY~gո3_+zq2%F=wvC[^6L3I_wJ]Ւ*y}~Ew&dS⧙7_Ҙi{HCP$uB#h4Vo=`Jp'5O=9Cy e۵xתu,M)m}vb? **Ǩ Ɲ~iv\qhx7%Vx#/oɄb#[{6?Kց1S, aIİpwlnB_kv\WٙʞS.>۰=%a4FvuR${aac-PC,!BOTN`qC{od~7idv iۙO{h#?ٙB<|^<]pۻޮoGLoQGHxۻ}[ok-0~ '51PհG_%,| #gV\ ۟νrm>־hqU@{n ?2_~\}V;ySp{QpǰY':}7`jqJ뾊{˖\ y oͶ90X2^|>ޝ\:Rw7;Q[kد۷ED|{,/O;Ek$8C'n:"aFE!Jfv9@y;|w+Կ@{ʥMD;*vk2#P=3C:_o$~n_^bPdyad:s U6fk%SFW* a|+ _U0>z11K,)h LcRаw߉^~ڞrPP[ڴ~p@cgnP^c,CF7%9q`@`gc-O?^ItwDae^~ƅ6S;Dž o*1lLwT7~]3siŦ.8ϣD{6Cc1cVmI3sT Ćz}lZ}_3og3^{J};~N}S]k- }h<#۷vy>Q9m[{ĎEۖQfnx1ddp@C:n(MooNnfsP[5y`悹m7Ke;}=t/Ou}7dY9#p93Bv1_ Wo-# Lhb~wU7$)!# }Lxlқ$vJd2F_mkZ\ZϟY]WJ(}&sZĹd|Y1M^e셧BeCۗ{1^٫A!Vl83[`z !S.ə4˝JPD B% w9绤/Iaԉ9Ixǯ["wu v/A2߶׺ $rE`ɗ TI¨P/Je*uP :ӢPߒrՆa5԰֟/ 8H0]P^|C/RQW|,8d ksm/~1Ght;eߘ }1wAC߭l7ls5&X_{z9nw'88 ϟJ~@6Cc4}xwoz'OxwOI֋׌Sa^-4֫cw[ qs :IA.>,}C8nd1akCGW&6n|r䅮A;N~ړ ~yp)R לa9Vu;ob]T`}!t[4mS3@FPoޓYyQ ϽsQst<̞06K=>SRF|ΰ 8x`X}u a"3}oon4<4<xap7藬;u̱ίϻ=a++XjP|aE\+%s]|'I^$w߳сo N<0w*fxD`L1·)#n}!GZ#x^kFVK8l>b=pϨ}_LׂQ=~G-Cs~a(5r؉dYy4KVZ~3%5ާjw̌vc-<̣'Z?[O6OZڽߋ磥5E\`JWT۠_^C/=ǧBC;Vg aG8jByrZBy& :Re,[%7ߥH ,3ı u}xدJ9kE]5ԯ=>ԫzu^wesw˷_WxڦدwhAhͪsίLr_B] `?wYaAOt~`z{눲Ed34Y𹞸xQ+}r6aǮyLw̺k˛Bš-3hk&VHRڛq㼀zIӠ|Ga^e\km"TxXUOF9= yҕk;l=pqMa,?87ޡ]0.qPow$~Ja E4'`]}޹bֵ€+7>$~ԻLP~>#Xo'Sֻw7m#X~*UsaAO=o0@ϗn ǮXc~xx_B|o:$zSݜk==$n{{] C>7%.W?^80Wx^K-.3|.:Ĉ8%CGMog8^-`,=Cn_(ۻl*m ;m 6kT܀K΋.l8m?[Ez0oq`A'Y:1lo\Jt5ԯ7Lcyv[?A ǩxWԊ@X͢By+b7``u+B" l.0_ņCy4L~˕&P3`{V$˔%tҸS:=' vmM`N8N 2޹1(v=jH\VG=} Fh+ǀ0 )w.:3jmY?k9mױg2Tbp}xΕ{ /U"};%\y8𹻰w ߧ5hytP\]p"g<;Z\YxC3Ž|3!?xi%vZO׈㏀3"x8x˻ E9぀k CG?w^hUz22#n[͟p\o]q;(9^ x>_O.x ĈZ,?мvAKVZ߫ϱ*y ؕPҚse7O=>^oP kݕ}ZU@{n;%M=2p~ʏO*q-*pې9B{3 }v}\UCq'._- gFފ&pDW}4<À m@WW<%˅A{kvoDza}(oY4)|&b&`BzԫwWϵ Y uHToFWtw< [kނP@]sx%t_wu̕4d[2| `Vk+ iGwI@ ¼< u-[v߸'-J9`7TJ}yBui]0~ Ht"񱦰_+OF'a{-F:|yI@{ݸ #ӕrz/U_Y*+O o/+b$~>2urU6mb>GhΊSsC"-3wwwazk_63ZFbpFRg{`,{Y D+?Ij&F=ڹ!% ĸ+>7eDK}d,/ŎZZ`19=>A3@{XwH{4e:@8?pFH[g(~`qx11J$c\0^Eh ;_C7]OP97==jv!]7k.(~=5c#ey4VqMnQ'S>ej~\z|NQO\|Y\_+ o,"ðh廮.jQq:<Ƣ[s q?Џyw?1?GW.E)څ|-̿Z]0 `~ $[54bG1DV_f4|̊{GʍQC&t`ҺV1F+ +JYޥDbh{mg mKfC8ʥۨ20 `{x{ d (Q :f͚8O0WkC1<ƅs!Byg|=C#)(8 ߢ1`7Fц>8~Njrd]x."50R]AHy{kc2C#Y#?%<^g6D9gE#3ui~Șԣ t|z>FPd:ɞA{Q_MQ璼-FA;եdy\I{o0u׍ؘ9cUP8]q2x{q#mع܃L7%<axq`{<ohܷ{qLgE}؀3TgRMi.; '`q$t8K$o.W %67G:KE8O+$¼.bG%|Ӣ1n0sg:L8t&Ygg0[m)Z/Rr?N+s\F;'noecoЎ䜔o0E#]Y0ǟ>̓동,8@2^@f/Y+>m|G1;҉y^v Kؗ0FRbߪ24ΉؼN'z ŕ ȕcHK{ڛ`nKg(^8.m>zߝp+v˓,*,|Ḷ'!zK67#\wtׄ<8<.Kb(zo\ÙwS|wиsvOXX9G]Ϗ\o0 k(y;%T64ݣQG)5+TbMކb8UGN#=E?B' /q*C~E[?v|]Y8,Y>N _jxVCRgn%1tRȜ;UzeB,]@|㺽䐆3C{eOw8p%X6~㯡lIAy}h\Vwڡ.TR0n O>أX>) dC-G=v^OW1V\0'+a\CrKq'+>vaX%˛xU=1%[܎Ԡ,_C@j^ḧ* \|6>j=[X`>5ҥXGϾqZki 9QW-+V|W#1ޗiåOy$#hd$[n)hh8m.z)LB;$ "z|65N%~ow9Vip;qwHcCZ1F>n#s \Mqܣ&_I6^͛<ߓF@1'zp!u^`q1"wvD7pGߥq\=?\Plq\OX`[߹-?w,p=p"OטJGt}纙}&O0ۙtHp>0_prM2= 1M~jBk187[V)%$Eo㾩Gf`ɂ,0g^X\AE#pi|еCI)pa3a<}΢.Y;*`Q \>|j-;{{q;gϾbFߺ- ~3ƛT7|nIJr7)I/`L`$o[uY%,ORWQdeL u)HG[4x3]KrGe=o/Cf>Vȟ~1QDpUK'A̟0`%bz`Fju1Uc ErYN5[u|uS}<`Q\t-,0tLN뢓P$7o8WrF:su#QHnbM{d8?pi60FٌU-LP qviEq+7Hr]~zU.LhhKt߄:Fq?972sA>Re@2}SڗOUM-C>?'B]\v|| X7kIW>L-)L7V0]"y(WEʶwIQ 7dIۧid9Era5rmq5A|8ף^Yrs!>dA?pyhy?lۻ? [Xg8>q;w?\sR<NsR`-;OzLORbyv1=n\g@/p=Y kgJ+Rp$CyO+r>W,c{?5 :&1n璬\tJP~:NI2r3 \WϯTq"a&ɵ'Akz<%˕#\tlC\$uL\$IsQx\>:Lo%K'K+Η鹎q1̗<۸6'(2G^l.'$W? s3Gu1oNp'1N;rټ8(IQwur?>_NڞxzNgp$op88u[J;fNn˥x&gm,J5욺1wB׸Lzq=z#F% z0~M璄y"R]\%I˃Hnq2!_m#y;w=P3n>rj])>\`Tz(GE%$Iqc(o6E?n-gAW *\'%uRϸ^J_pݒ$i /]z\$ áohςz~0lF)ygs >V+i h]3|ẕ/\U$^E+}Hr]$ׁHr{9n˧Gvzv [> ' $߹׏ر_?nDG~rOzsq/{Y4˥_ߡc7$W1;7םH8- Yv?;0}"t әX-_iш!]!DqBq<}cJ`Hc*֐=/WӱXC+%K#ӳ(b2OoزN\EcItFqŒ:4˅ܥzCL/ øq`<8a,"^qdDC?o~xQqBoIFv8K$HFd` Fl8g1FFD=_]} k$Fbk$FbLc= 4m=LcIFazOct8L#r1O%b ,uu|Eb4/o{^'=GXNق|%g]`: ECb{֘,")8YЏ[c1"Yc1=5vB;#9uJ:a: k>eE¸pƅ<o߀K"CxL?dCM>׃,.Ҳy4>n*2uHF?ƅ~;L#ҧ?&DݑK#)2ݑd4kRwh<-iHy;dGwS2$3ݒ"v}HsRDEG'C<ߔojMt~O/%Jy?~n^fѮkJġ1#t?bz8y?{">L}zFmQ0K_ԢC1r,|(~sW \_dGkl{4sbGoWt?x-oAڿcE{!]"/\)ẁps^di'Gnw"ӕNǟ%I?}pUF2]tV%F\cs)'Ǧ05 {Z;{"t|ۣc br Š˳$|}t'v~ra,RvuM`ti?w L 55I:%S1$-OgcAp˙~L_n :9^OQNrϠwZ皩t;]Y2~F]CtLjMv? ;Rl0(C1ӯ*b>MƧVzӜ~-?,3~^5q }5דx4BK'oq3z*N'/YE2+Ɍu^{1Kqy0uO3`̻79a?v 9Kdz\\٣o֚;ܵ-+n٣ubޚ|m쒧 3܊Ӳ-1*2]4/cqd~Nךٛ?uE#Z 0"S^Wchd]`N8,8M5.L+iףk,@~Zg8+y4ENWt^ZuEgwMk+֢L?k-bLwzZҧ;7[>IKGq>|~/J㴃z% v~Vt@ϕ߫t)dC!JYng78_oO [6᩻Lg-tanA2ݞY3#ΆNx5p;YcޱtL'*Y2NZ<%+Gېl%l%V~e5'(Dv{d?>3LhnG} ԯ¯F֪&ohdAjoq_L/>POhh?n*F墝?lchz9QFRu3]/>'A_O|N>9my;F%>3M")K2=95=~;}1 -%M??2]D%9 ]?ѢQCusB2 H|wl}lq~'KsQqt"b!b-VƦh)uF^KcG3/"t+65gzZLO+ٲ͒bE`'nmw!} ^3j=0qa։fb6,z8Nڭ/&eYTѣ8%s7`NczGE{NcG4wәQg3Y;E:šxs.L$0uNoOB3nMr~rπ JFs /xn,BͺБx]n(_)2]"O.B; /B{}.nhN/ߥ%s;޽T޾ ѺKP Ps\V(|iirZ_MY)2]:\cRRRlbl^;T%_7m| 7 4Gq3Z73=u3'z[2ه-Ј=[1K_Vn|}z 8VNr+2ݰvVd:aEyw2$7Sۆ(s1ki?Nϓx{2o1_6O֣3w|JH/Η^JU}`jϿ}djERu7W+2u7Y[w3}K6hdiɽ,^"Q[2u/O+2"-gqd{{-Ztܦ@\].rGO瘖?z|֝?fF>?|$yh{,2e~>} y$'(=\O/^0s#2<^^p?zY_Pls>=>߇|?َ=063\Oyl@,Ƣn8\obءh$!'papQp] G_SqB@ϪuG?28 z{^=q]dZ!$ןzS\Or$:Ƴ\)(!sGti:s\?y/;w!˛x8?G&;\y7/F >H?]\?Ѣ pUUق6IWe85ߕzk\|s=[uhzjIZÂ7^[ū\(x3]s,HW˒\W~or=-KzH,n&I2E6wnuސu׉ .EwgXQ$-zxM{c/͍ƃX\M F|d:\_)st)>zGIwS sw|bķ'CS{W>:9T s{v/EExuuN^q]+{u42>/8v_/ ~ ,nM?:#{ -Gc $(~57\'qW=^deK~AE#}vܾ,Ւ,-Uhwהz8^g58+N?\ ߗq!wv쟓D;$kv_ܮ-7Kr-Dc!N $}~|b(fp?ӶLGtШz\mɁ:F2-̅2ݜd8fWVt{@{YױqYyL/l gP ~a`{ԗ'헀ј.Tlko\ˣI.L'db0"|Pe=,f'WdvrN[,Ν-Kevp`m,"s'mD[|Nŧq[f%`qOQ^nK)2?EN:k!w| KfhW7p} H5+(`vnI+w۬hz{Ze5tCuknK)2ɔ.m"G#Kb$S3;$+2{"+%ٽ%1IZeKҳ^,Δ-=ƙ3 <oFm4ٹhdl1ϔ{W.Y:``J23dĹ>-+{KfclX\:[#oИA,n-{1a\M)1{-'% %s8ն\6DۀT Fvs3{-wؓ n +K3-7c}vl[fI;'.(ϋ<> K\1~5n`~fV,usnLs7gKD>:cP/XLgkgѲ fVDk _Jڳ=ǟ xEfbf[afotxEVٝmEY|([QŘ;ۊ1OAyƦde[FE;}VIbd[3Nc_Rdvb2̞ )bnkq(oflkζB(Z0EK!Cy fgtG{؎:5p-^[~̦KJfm]ې{ 0ge>v̾|v,o#Ivbv4̞Xca̾fk̮&%KQ%{'k<<,$b,d!Mٺ1)2#e=^nceVa>,/G2{4sϞa뗢|3҈b^m? ˙}E_$]6~^K`ӊ,"[4ܷm֣m`~8řQd̶,ތm0[7 F?ph֋mCzm([/Z.,^ g6+co6+2"Ɓ(a6PDž߇,6J< ](ά8Lhl/I7F7]E#?f϶, Raq]Y\ɱꏍaH$qhĸHX\۸]աc'gl[+p^ՇvƳup l=6&upoֽ3&2|IOMbIl]\p;[Mf,m2`6ͣv6಼x=SYXE6ŧMe~@m[wWd~A8|ئ:K#[tP>+y >oHd@zmd'[4uxYl^KuvFn}kA\O#b{e犓=Ν4w5utE]ԣlRs:: [W$b?َhg^#CydOs^=vY4nRt|Z67|@"նh:運q\cH.ela9O +5K#[׷-cl"m˙߽"4Y1UeZ42{j˟e[4MKPo5 ^ݳK$׳Y߽F4>]%Ml=߶GL8g|q7;@U ˋOẜv^ovПp}>] v0?zێNϮBy:Kѧ#vwuy.G/+u=l]ݶtE[>w^n;Qqz"7n[>{%fz>k04ہoLw낇zɛwK7 }+`+~1?sv<o:Q<~f.L$敁N2LIw&yKg̢x23Y.x׻/KOLM-evg6x5BB8~׻2/k|[:_Ͼ׳ulI-ױo|=gn8 CEg1_؂z~oc z/P&2/gO˂L|>_l􃢵܇yu‡,"ZϵG|Qq[c{ף|E0?-/=TdmO0g542. H/tsG:5lvU|-kh1ŗOK}{^kIg^ <+uIܒ|[ |T[<ZK:PgYdh/{^}fz} nqS# K{gnQCG }2zi/uby*wByo 8p+eNy;27H8sWpaYr{8̷iGBG {XaM`m%Ŋ^ F\t+FqJ5<[oKeKG蚺Q$C~DӮi.bpnh\.yFD=.և=WݖBy#VƁ-mԸ+bgS DVXw qWc=ܳyn` sVj< n1cPYv&Nո)Zn? tUc[xc9c׈Jh7Vcy+#h'Γ){5M2ềE}=o"\2mG/|rc'( ڛC F/C#9Ţq [5&(IdΗp >̅%ܯC7O(1Ƌ(03s曇 dx znxre[b/!2qgkr_Tѣ~I,O7+_VquM o;sI݊ӊ4U$ Ccp/4GjkH(c>_Ţ}"8_*1Y$(ݭߎp `Ő824֥iw%e/F#p>It>vփ{ZdLo`O) I:[C##~Djv52>mvcA!"eȾGNF;9>{ *5copܚ85¸]cP@:E1[Ty #SIoP?>Lm+ĕ-520]6f^om8L^dQ p|8} v2LGsga~@M>Lvi KQ܎SxY0]1+4[U9+༳n qx~%A#_0מIP\vj٣ E uNd:0}gYkUӾxdȶ8B&nbOץL|}+u+Z~ۧZG7q_ρ|>_j߷ ZO|FgL_)O&Ϝg$t}QpY 5+F: 8o|]T?>q~_ۮ&u*h]5?7FfyZ$r~[tfZXfȃv991?_gw |>(bݶk0Q'R噵WBY(Oh'rHrtW_L&5^G4aq^K^lf,Fnr~Ob=@˘Eq3i%8뺜t}O%\Dn/u:ڡzU+wZDFrYq݉oea}]#~b=Pubo@ߺ1Yw4ݙ[\GޑE[ObQLq \`}l'WN_zpGy^KwixӅL3^\7v >NMN >|֫{8?D[Cٗv? .0X4܍6F3&E=x>EPpwP^4 ;Q4 y4yiS㼌7;!$- {|*~ez袡ǧ.ς,&jjU~΅_zQgq;q-c]LJNCKz`iJNV FchCG~ G΄%qֈ\YP{IG"YC{UJ.j-JCjve]Ft1QX*]γ~Wqk>nLon?6Wfy΍kw: tA`A/FOm7;Ǟ>]#\֭NdhtX<Ȣqq8jʮpjB#Q-:lOw"eَuWuڒ\zm'k;^!<rvCӖ7q,;z X.82S#~puUj^F]hzF\݈%ߍѳ.}].\-5v}RluMI7gqڻ}]#ۛ0] l]N&?mH=h.br?9ߚryLD\i.b͸ם7k-dqޜ_3{#Gfm~C:ټJpjhz\ޜ[D.?:uI\/ZևbKSļkn]z γ#BY4r}<ߖr MD=;׳|!pq$wKnܳT,y u;2\n+Y̓rp]i׈?ƭO}+C;$וSv@QؿÖhR~w}wQli;z͋n ǎ(vzmV{fwksI7¶Ar]yg+ܝ{rQDjP~wA?.,ޘ"~g=/z~][b"-7/({__{W]Q?E2xo\?ލǻq]w7o5r=x75vqGc7B{ݹ;9kzoϵZyugy?=p|aؤzIܮ3aՂ=R{bG E#׍ J$ K柘 dhWU95r}y/':mN:x{^>[w,?VA^{OCy|ΐgupjb/dh\ELmlpߕw{3w}/u}X A]#ؽ}agH[kx;F_V.#O$}N$M(ԋdv&a=lIAs{A{]L۹$ѮTX܎%U NTUj0SIr;r; nW3/ zq\{<ODUIr{$)/Nz` dDQ.f=xzN_.:Xu(wq{$7Kt.nvډ =y ^G_޳q?~߀zw~]]<ڗrkI?ܾuq?% 7~?1n.8%q>~{5r$KrPn7CnjǎuHf?vo܎Hn?C@a\*ɒ\;{7/ LkFnOv{6o@kt4KTN[1\w-8r}Xns7s9|q8n홒7hh|'7>2٧Zc 7sv\?~BM9%q>џx?A2;z ǛIFn}RpO zb?Jz.E# N :c%Z.5GY]xK)H~~:?v$n7Ɠ}xs]x2 O_IԈv`܏ہ's!In@8)EJX8:M1\|S܄Swja?f*Nw0ڥo˹$ӑW~qpivH 4ѾkWe=hۓ%q!9ۭp{$Ov{W\ '}ID=y:A\~2&_D{ώ/Y6:(k+!'"7;4vNv$Ƕ;v/X8q]XuCߵza׾JuJםE1\d"/˙w w_9nh4?m,nkD];mvG݋|? z$ׇIr$חzQ\&8]IrH_l\&I~}z|y^ZNxzO7L;Lk+\()z"@]]#?ʹrS3|y_x_sD AQoE+ucQk\d~21Ww4[?k9zEI:_]_ĸ]1O61<1^@1/DA:M ϕAZ./~,?oq A=9M1NK 'N[:q'e\W;`5ӹVuWuQW 9|:vzZa ìmc}<^ u3nVf%nV.$D grgJW(Ί_u$|Jr,g|gq},uy+4ln 9{6cz)Fs1.\CŇsm1k.Go 8ѻ5r$4Up~3z5N]E# dŐ҈N\*Z%u׷Jr$1νE`{k.`^%Gg/WI]u 1~=qB]tHEQ>F"]u'nGQxv0~,ZsWKv).zڥ۔Lv{5urR]!yHu w /usFZIӾ :_Wq9Jrr]uߢqyW};NÕ[\g+u΢ 8(nM"lzM8qi~NIR,HRlzS#ouY[p%nmx4r=vAr5K|PʹYrh7+%kk4vzq {Wņ{5jݹm҈FYMrM{Pc8:QKrdﻎWp{Z%i9]Krݵ%Q7Rܗ[:nZu.\/-?څ 3 57~ԈhC#4gIZwMKra_}҇*ɰzbF<\+xq%;s$wkuetFzO8̒uшX.n׭V+ʭqe4B$o7(:]I<5 K $(:Xɍ'K(^`5q<~$׽ ^\+ZC#ק ^ y>h׻ ^䠡O%I%S/]\|'qt ,nV"Gu/r}$O>lp/>jK<~]sd q%sxn<[XV׭^>\.qtϢHߣ3']'}~^=|ui$I\7OzGSџJ~Gy#B-(}̏nш qHrܟE5cQ$ws旰hK=GϵTJ47y]dWql}6+xXs|ߤ~,_0ϳ3\Pgkpȩqˊ2=~s&&)t7E- NC88ރӤzA;N?@p*? N?!(t:B#)8O/I8M%o R(O(u1tF}' R)'qJ[> ofQ=I3tRHBG, J>AH "㐏)?g[l(J+-GcPq&{@o<$}{OoNSbFzS#hE5E5~\'I嶡x’_[׌u*u.S#7^''^){Nt|@ I?wOiIyӵT8/4s<ΓPhHUtey)n''N'ǚd-q 882N''t^q<9Mq<:urzuuM[ 96=M,HW{-]_Dp[D?%o!3FI{d~K Lz:v:OrAY4ߘ[1+~g4Ay<4" l$EAD=Qȧ)HrIo]DA_T.54M ^$N})I 4NSy4+$O= ybW)AJrochDE(b-o Xwu$y--G^~#yH?GAo~æ~ڔAw~幢ywƀ#w852]w)Wޤzi/i~,:.7n4/GɃE#&{ Ϙ;[@ tI&Rqu~u|NOtg:=] lq:>y,u|2o6ͫ<:>;uM]7|[2nt}u c~+]%&;)Y'tCvW" YRfi+It}^īJe~2ACD5nEsUy8.fa||Тla̮Hup(qHTj+.G &\Vw5_AS<=ohASd$M^I&Mqi<ſL;l$~)2aqkq1Kƫ<5FgϤqIҳ>49Qn/<ǹIS>uQ>$Y2b NX4NjNpEM 2דHr{$ F C#Irݜdp58$:cPn4+n _|__d#$IFGiơ? Hr{$Hr$^In1ԣ혎4yv"/k/.84^<'Oܞ+'θ)8GK8i\qnqƹN\_q%i\rԉ{48\O ܸ\ Ir)91]/SHGCK Ϗ)}h||?Rq97!O~~w~Gw|ݢwI#aEk\/aⰂ5rs\y`L}s+!~->Or~.ܙHr=$P^Iˑ$~9\#ͼ/thzIԁk.cתRӥY$Q*wb2[4r}$ףH⺓K&\_"3N\O"x<$C9$NC2q$Kr$ v}Inחv}InǗp;$Kީѻ= =^%}] ܾ.ܾ.[ܞ.K);G s)٭o6Hĥr$Kr$KؙrE#Kr{3n/rIn/rÿ4hDWyk.,mtFn?u8Fo_~ۣ1ĸ+v.wnŗnX6fJ{.v:ԩA⫐MwiD{ye}+&xՈqoRP|\y\WI 5N\;sGq^s!6ev`Z[?]$]S-ŵBG]+u ~:Ix5|ے+ՈWwZX3M#ۖoKrG>Op[pjq%A\ Kxo"V̽.B"$.B"$.Bun\!u<λ$鰰LL:Rb^uvԉbHPdq%C8,"߭ Hfy B5 o+< LO驡(nBus,τ"-HF`y.Y E̗a8GN,dDsPD[#9(2d$95vN/[A221qjd:ŌFnḋ L/%YEbW(b^FPd`B2jHG^L/QB.YEF.h,"m(A,"C[btH9Rdy'm̢MRdy$cF'WdEԿ [#Hey/L̩Sd̟_2!ө(Nԩ1mESQd:Lt'V@D߶BD>$LD@$O[@Di+2]"i{42dQd~ۊL7o+ĥH$2"[%.ҩv$R /YMvz5ڻ}Gy?3xs㽸4E#SyS0"VdE-ŹUd~ъZEkUܛD/Z25VdzEwQdz4," /,OdZ;0L%ӱF,dzwQD?hFẁ7bFfo4aj̾%ٳJyULע-bffUd~ȒMFG2=O*gU,ie[HeS8{ ӬHw%S3y3V'%iz?Y{CK~ OHoA[ɘ~Nߤ*wi?mw|'wݡ%g8hxܿn{I'E#LשNKᅰFxVd:TESU$IV-4&fyVŵL L,lڅ]YQ$L,%㱼L7-Uļ_^8,ﮢ|/c3]2ݷqs,_W鸼X뢉]R-L9[&5c<4O82ϋ*yi*繜d'(y4 #鼛ɼ4gS:]W t]´A=躈i(b?T.eL8t GFFT(|d*oqdXߣ"Y홎*|u4HCLot;'n̯I_9z|E`_{-{n{BC{sLs94^~04T,O$]?7[#Y*2?Hž!Gx5~=ᕤ;pjW'$oXPH#Ԟ.C6Udv#jW"v'j2ٵ?{ bݍ;nh ^ǥ%MvLV2a_0K#W+?} HrmIsj^< ۚ< d%Ó$vw?^PٹN#ƒ" 슯yVIb Fz7$zJ՘*E~z<ޞ$sx x<IG_>F z1s~rXQy| IyiHcC*_ܩꑈ^~,$<$;kQ*1[#ѕf5]HΎ&%It7xܯn 5ѤLۤ]ݨ>P=tV?KMaC'D籦qtCϼ47.#tgO#j:4Kzy87y9-Iğ:.KyGS]:"`Rm2/4ay>W~zA @B8LH8ϜG2Y)$=?xM"i?m~\i2ݰٵ3Ijg'njz./~/Mow}>} kZ/w~?>>{z^Hyɷgy.>{_@>-)}y~AI1Ϸxny6w*Lۨ΍ 46@Hsp{?_lj#z_|8bg2)Lv3ܨO|6:`_uDWwAtFu]}?}ۤ-j$G#oLKwFu4Usjx^5<4i:{.㎸?':`[cj2y_o9i<5/+3iW#W͏)& =h7đbxv4.)7/qŕ'q糓8_jqۈ).~Rď]Q,~X_'do. )Ҹmyc$M~u_ *S$~kIHãu#qLMVi98tԟƕ/O‘o~e\`} ?-$q߿)#@Co>Q98z4NSG8rt.Ƒ%7؅Iġ3M/h| נqLqniGgГw+B(|8!,_"N*B,wMO&Cx"4!^^/>瑾,"M=h\N_3jOGW4X_N}2.C+z5,Wи'tDq,hGq!H܇8t/ ;BH84)_ieS\,I&|7uj n \_k$q(<}0h<Ӽ|ί̗M_ǝS _5^'/Y$pFB]>G#]1.Huo77 q<шFwS=u-SFޣNƃnd]u?g_H Ӣ~`t=43$߆?j?YvA&?TJ%~l`78Y/9ߐBvɥџ?_yo/_ q? R{'Qo^v:7h#jWlOԮEX_]_#7Ə`h4'D&6+K޻ƶ+;k7'|GkwnX4R  {!͋'^Q2rr|xġG]ӅL&h]r85=4f߶O~ũhʓEm,jMYj?΃W4V4ޡ)r/qH̤?Zp#<\X?⇾??k0?Fnn5<~H`_ȉ̕?!sW#2K{jUϐKdy)Biq}G7<.>lSo-"\ʿNO媌KS[fz]FOTњ|>>I߻1q[M8cqbExV~(9 `d,65]D}M=ޏ}dOz4wO-~X[̇u taC鑒v^O/ڃR?8N+ JfJW7V ^zj#>^jw"S{*~ʕພUu0'Џї/W\iҰpp>g[8 T}p64xY5>~500W*eܿgr4f|<>w{ͷ}4F@;wG(_p<[ F: {]^H|=?FT!N5s+YhO棂GeE˃/4O.)ַGKpᨑA'{Gɇ~RAMys|'Ư87zI9Y`Hw8!.0xV)y _Mϴa'~y\{G16G3y٣_ }byYѯF3EypȮzJd~V,E/%kxI3pN*ȺܗT=w쏄~VeIt[fo0ttwX;S@t $ΐ`y:yi_50=Q/7yl_eNص8WYz-汼_؎C%=L; Ac-\2LAE {h'Wy@;wo؃W*R/?4?XkC|Zܩ4+Ӹq8z37쁬!| ǗtE|djF4\/ں}OOGɧ7q^cZ| +gzE?Tܧ>m͖@%vv8|/0;|5' ݁3(8gtۆ8Ϫ߅4N8[G\?wEe3'Et/xNq+E7Osb}Z>Qq=EP\ϣZҭj >Ӹ\xԂ{񅿇ψu^3Ŵ2L>$8ԭv9,:~+~%p2!F ~5+{KwG#ڎNmܙ}R@ƭ8.7cc Ymw|ރ,PJIpk?XMw1} 3 y/GL![WFYR=ȕ@~+L0Jx:5{[(;.@~k ~R &,ywzɯS7 z43}ܯ2sP˻3s, wO[?gя^)d[7|ZSuCri~S|7 ߥŁkf9|ݛ`J:)C p7ni͹ƕBLTb|u/7zĕ册:4 wJE]];ak x.&FWp78uL $nQ#"^@}p]Vk=S} ھ8;§XjM:QcGN{x4^9;w=zh^2xα ӱgL'a?'j뗍!`^9| z?߻#i)Ϋ-bXO/b]Fu~d([k'vk\_CTmԋv;gK bn&Aw@Wamz{jO/)+σ|k/y~ɇ:+d>/{lq<W] "k>m-#+\z#k~#ߪqyjb3~bbtl!3] +v\ :v"F~ݏDc3G}Gv,d-b =z.)F7}3{_xe.x|>S<ITʹm]/<.+mN?s''iO%>2-zz!Þcε5iF1Tvہkgu:h؍lG޻|Ja[~rؙ?8dlA}1_ p]<:Won4G~]v#Q!'~f|J^^3eSz;)tk?}!>gzK42h}Og~U q띹1%|gqS䖳Ka|E@~pR1.S.-(xL|o9ƸJ귐@xх=G5L9q<x$o:$ b@^C~=yCEb9< ;U+q]v^~%;HsIS:X`v=~˟<RiVVg?_!__|rtw23׺&1y/sb%۷Η_#/_ls9}_KIi?t^x"G˫Ad<{g&8ZE҈}&byoO@ J=:5;ωvvyFY{v1{ho'NdR;Oۋ~EQ;EO wy4#jh=vA#7: >6g?#yn%߀bIZn ybɾvv?󪸮[k_41@y<^W/`|]@%ax|Oǿ~}ѻOli+ߛ<iK8ʻ{y7ݨT-ަK:~#O7Py-q_ yS-yߋy%_onCOOhVyav됑ZuXq( m/F^_iXT |4h0zGhd$#NjgGB?l3F Nc,t*͒m- 6̙%^0o0ak=kibZ2~k}Dfe໳_ZlylBNȽ2IX{l>qSM/׃ \gʿ Cp(O`8Oe_w_|ؔϑ$go!Ь^x)D$'~HQ<'X8(ߏ\hqC3/yt>2+}mgx_r;a1 qȽc//%,~Wϋ)߇$k-w%cb YѤUgs'eEC_'3e)^+[$0Wb *5Hg4 {Bh"*hpQƎca4;]EB9KYk(zqټ7v| 7I>K;ټO6zvڮm=;xt?Ɨa~̫;e/J"NЯSImV/߷egXz =jVv+3M,߰% wev~).`pOӷPoeyԵZg>%/YNt^Mr0oT8cn˭w+8ﺒeJuM\<~eϖT߂=}+<AqAk> U+ k{z+ }M]x y\A#[7cY]j2Or} A_lro|wfv4r'B!u_/gc-I*BWTe" ^~ϟ7%ߟԩ\"S)Zu6t";Im8g9_@ͳm =dq:VĈzU^WcsurS1GWYud;_w,Vݳ(Ǘ9=OdiУ۷Xu:KJ]Gɮiuf:JXrew*IN*.]Vq[+ޮ%)w*w 씥!#OUSx܍qRO|_a7 _AzN$"O/8_V}0}|_Ymwɮd}B=?~[~>o70f}+O~֎QO0z}?'T/[n]Qa#Nvkޱ&iO)J[?ÌewiǴꀕ젬OW)J'iU#"NM=WnE>؞ ].QvoJtCuS&;}B㘇q01n]mNv qވx*:j_=?h{x#8!cjV`}N ;"]` yejyI|x'dwZ.b8xubM[P'MIUwK- ;KycAu0o5زD̻zTdf;;P%|0t:51ޙʳ ʓg&9.Oruzc\ut]q< At;F YߢƝwꇪ:]_C@~)W9eEZtiZd0]:`k)G7'!_Fuu^РO#QtSv]dO2hguv"ڏ^D73r\U T7hԕ|}ڜjnꜥ!r\7UOˮsf͉ v >|] ]G}/qc޽{.vݠhu◯BGy:IGд&.A^o_cyd/)iOZf's}뀑FӮ{.Va\v.[(f!'e."M(ȯeҴ볒~CsS`XJzbO7^*\LQ8~wBŁ{dr؞twMؙl f'&e}L/INiM҇(xN1n D<9H"օxrDt!Q| Dz}/1hD0<6T/{ r;{җh1r \?~C=9t$`bD{D%s(`po:=JAyVr)y{d_ׯ7Ӿ먮kQMK4k}~ۿ߾U^{jRw=DɀA~.h;A~Kb'!/t &ofp?8'IwT5S şj-{>ĩvq{>M=Wk}c~;-ϓGIv O/)7;o}qqqu,Ƹ}g_~iڹB9CzL'H)eFv e7߰c]c;SF={oжvC_Cz`mJigJP7ڧG<e3ncH۷>>i|wEzl\ִg붅 \Tp8?]g_CCH/GzyO\?p"5,TlG*S-"~{A_y3Xo]/|{e蟴y=bpk`8p]wKpe)ȖSOθܟ(GiOHn1yqaq_a߂hb}j9sgN$ib}6PD0%Y$7024^;s˫zG[M)Bq"IE)NC{5:ybsJܗbG9<.ry?g7+FH0(_ul,/x Ao7}wqP|ړsQΊퟦx͡7w~4KPixg\oUР^GN4m/Drݞu<%PoUrݐ2g ZtxR w;_ ŷhR|b)k񔢸O)gѤMįx RűxJc>V<)nE,Oiī >K(yR>F,/C:G2{_6=|tHyq%^_]ta9}*ͺv,։zʒnTt0on#KQ^Se4~ O=48߅4#ݾ~=u7WX)K:]MҩjR~~Mҫ*|YV=ϓT <=/S0HzNMojn"6=HGI:~O%_JWIHlx^H~oy 412xyەIשI٥oÅ$_kV!beS#T!htٮ<}|Kﴯ>zױv-C0ΔC2u/_'׻ ,]*$} k=UI'IՔv%ø_1yӘCfXB^MjZR&O;vT{DVzkj;WRNj8~۫'/koc`y?{tњox,5ҬF:jMOth5fTMsMpo{~[: [}rWDթ:5N&5cȜ.0\SѠA҉kN\451_z5_!ݸD) ՃԬn 7BrM1\Q.T/Qfa]+zjR=HMҫ{jb| R=H͑%wפzTQl]]5RX,5}ח4xO޻ ? 4λNLT b|l@qODuq ]18~;_ujo6^$q&d4:o7?q{chh_L4Hq 3 =d X  {nicpsgp56o^ixg7Te wKzw]#O#n,$q|8ŭ?M?)c!z4KH.pG\왻gq=K_J=n3[7Xϟ~2_~̓{/iB~?(.VS}WF%y3~_}KNVq aWH ~C;7z̗4[`$hO2<[`Dג9ί%A-9OZv8j ֏ۯV )rdd/X+Z!.d$8E R>pM-ءMqIF4i)?5Ǖ渲6IjGܞ"Ǚ86_&_- E`v4޽ջbL u`ѷۖ$qD7(2;A)-uE=}?H{mZ>KEg;lxOl~#{m9~5DJ"^6L@<ވOl?:*k]IqmPSM]iLޚUfEVh^9U+V\}mqV/I؎uIl9f.u.y%h |}b5渠}uD| .ۍI>Fg9 vH9~/i!{#'~untxOO߈[;o3g}>`|$9~]R}GwU~g%οmmY_iAGUhAga3~?q.e@?}KvoE̳`Suzޕûr\"Dž+rs9h[Ѕ%9O^}Su<QI"I7;[WO\s8nߍU><#wN&+({ccsTGBc縚9F:?q_~s<~LRԖq9Ϋ丮ԃ$}Sq>}R{}uޒeXu<;0ߺ/cٓ$sHu{s܏dR丨>=}2 :(Ϲ|`'O՛ϔv{ϗT:خ/ǯ|Zz6dZƎ:#k|ѮZ|ߢ?^燽9GC88E\仍}:y|*}9J5-~োx8/U8~ȧ"8mGXڂ׽9_^SNQ.~9ޯ?ǭKahkp<4r<"I*𖃸Aw7rn o|.|9yr.}{8_"瓐M|V1W~_﷮dSU^g~TnSWuWopu]y}8^.@u4uƸZܤ3f*PeGIqtS9N--TY:E8 uWg7h=Ͽr;{m__L+`oL\mz?;:ڢө~ y|[E;3` ά]tkHqj3a:9MrV#`+͚)~l6NjFX>f#N q"AKnAx9>2qI4p\qHJ@<\GqH4r"!)r<؟k덨4qA7qEh|8IrWk#G }u|i_/|"}fS|N>VmGv=n~g{ S;!s_~ejФ]9Ga{pǸ%z țoљyЧ9*AyrT_]v<c81~(r~oEk6(%N߯ߟq}_|zbx~.:a}U|{m˩]wD~Wbոt=yP]^Lrmws Xװ(o:^4;<cl_OYs nqWYy ?7XZ.:.wqkC˰okvipEi"X?(R?Mc91zfLUvbq(sfUQoi&A>.39?"GZf|OA{v9Ox@_K)h[I{?39o[ǟy?33bG>Ӱ`yb_Aq 9?Bϰ2(r~aȒpдAà,PpA"˰ٓa_X\YZAßkhUCK)fo{_y} % { CX7_;Ww99XxO/znNjѕ)79q5=J‚9Qp|Z_'q";xuTg׳s|"9q=9GAfEI' r7\_Pr*r`[E;Nø[܈?&q{"4pߖ,w 9[9O9O"O;S}cuWdw߆yĠ\aQ\mWxWxvpN ;YgȺzEd=.]]źyE+B73<<ݬ<<9eYxE{ Sdgq =~x}GȺ}O~_9w!9vuΝx׿wFwd"u9L_Ht*Ly?z?8uGGwI Z)cIwB?%ì>y ì>zgE Y띏b#w>:gE9+Y~u]yַKF>IZwuG?\i>룬>루nVOl1^Qd}  ]#dIE'5zZE=u]u+Xuawq$9\3a`]" r0'yt\^ ~ٞ<:}><%{uH Y'o_E\_'I4)ԃSnI1s}cWC2(ۑF=uPgXӊ\桛[HB oۓǑ#i>s"חPd=ief]i3+4OsmEXܿ;gX|ugX|ugX|ug d}^ϔǷy~gnY7J38zdE%K序Edx,rE7%yƊ nt؞uÊ\J;[͉ys\G9!2(yw Qd]y%z"OdEeUKz++r}E/q /."Y|uYȺ勬[#>_fT[p/i^%GȺKku>͟Y׬uklZkü*G'I "Ӽ̺ˬ+zbE+F[_ڸ@+<ǣ}K^I\q(]r#K3dE{= F۟\a=U\7jSa~*뚯*Y,y Ͻʵ'^ ;I0gEč DG,GܸuEKj;{}?몯:c:jb|Y/z+7W.ڽt_"8tg\̷~z)\GEuVB"#uu(b^o^/{orEwrN7\o'C28RX:(AЛ;s=QnAu [PD\r漏;(xܳyYg.`Aq(B ~-֍eE\ngoq|y^<,E)u=uR;}}j47%/P7g0_F79~&C|Xˑ"Q=zt.9/Ozϗlya=}y8,o6!>?4(7~Foυ|Nb}?rQ?=yMg_=bݛ"e n!yZ.Aͺ/Ef]W2@?:/;z;R>1Ⱥ/EkTag];#$&ӾSY)۳ 0#g?Ǟ >Oɺ?2:?Y'nuyWw ..zYxwY',yuXW|uƊ{Td=5"k7!=%RG"9"!8Ik+e{ڍ$]|*~(^%b\ya}^|rʗ9iî~4.4I"uBIty)HI<Ŕ$}b QLyʐA}8.(=Qg %_|uZ3HSNqnHIm&sOES_p@i/>5"$;AʛuiQ?ʫm B'KGkzP0L[:>P\bjjZ#%}q߭D=GOAD^@ϭ|MzT_|}Rd|=hoy{F;u=3ؖ[}:D\Xe?T\.i:}1]V]y_ qZsy?c}"f_P\v7\xc󿭿Ƿ^A+14ici([_Ӡ>dP3-ՇD",ϿDKEFƧEHlOJ` +ku! TR0\2>ՃԔy;{uGK]v)21>~ɛs1N239 e v?\3|Ѷ틇dqWDq`q{:Yp~ob=JRQokո/kոSy bոǷךUd{~U?b HX~oP/a-(~^p!!?B~^Z߃?߱7?&~I?<~?(o(gw9_~Ms?9O"A~TW~W|,h2x-Ht` 5tIR$KIX?eblg?9.KKoUtΊc=(Δ)RjT?Y\(J]Թr>`E|yR~aE=AG|+}d> :ܿ獩'WqkU}r‡8%"}]>/uQl#}bYPCg\/Fܛ}Qיa_3W@/M^ǾQU:x[/uRG/uRgy-=W:hV<o:FKq K "oz!%8~""Ž<*n#i>!Gy\B>A/a~|v<TdJy4ekd\ӱwE;Hx!;Swd%1eܒc¸/b3hcEkY/=;ٟ@{r^D_O>õA;͎Wي^k߫yFXh{q|Q2RIR'-'}:C?nNZ!얈L\QDQyr)su y^}a}@j;.ŸE9ZV@BqLM2)8s}>2[gqqwzR>IEzRqQ㰩7:j!v YA~f5qvt8q{z^X*7)fW@|OiyŸ@</rv)dw3Q蟎M OeABoK U)l8Vsbŭո(4f\j RsDĕ&}&878SH- x b`3SGxWGqoO5 >Nۆ*<qZVUD75Njxo|53IƊ+!+N= q?w#C<h/"Ӟߋ5gO8a{ˊ;9eA[2:r/]8k{~n>=_cae'y9{~r1sd!\uAx=iϧ<22&¾}y I#O\T>0a5uV+YqKg͛슨2kwlУF>?;ߟ5_;h#ϐyv槄os۵~#_Os@BgB|y.DU@?~ydV'U|:_?;) *g3űwOY?ʼGu솀AAApJVaݿI^a'L{=W:eQtOs7;G,bH7n%?VٵZy{e>_[e4w`\Ty_ʟoPkqλ`ݻd}*]nؾ#X~ڧb}%#V &} ~*E\nLCe;v^fIy|y>VcG߱ u,|ϊZ"6YǸ!"u1[S }]bYVV-gBlPȼ[Ə{1xboyϼuD;[``};>͘'xW}~_"r.>2(ۑ~*MVnxocP}uz'jΣk;zNzuƝwڕyz܇tﯼ-kI{{WmZy 뽉xfzoc&yVg&`\@o37n[2Q}ڋXq~oO(7(CWK=w?uya˺>b5E=Fڊx`+.>.ޛew$ߜ|:>?]$D:Eby]l'_Ϲ?7=F x?';'Ⱥ9*}w|x\3o*^v}!/2h/CO5),s^yQozťlwiQɮ$>q(>j zS/ y6\Kuw]xaR?<*+!PSa<+ "r >V|΀抛SvAlo[nK;>3qOz]uȣD~(7|՗82t1~o;p0ߔܨ-y1o^>hUO5hP=5s$äPg_z^;ĂWï5h?|k~T}4ڬOW)([e~6xQϬFzi(>S%ߠCuL~mxg.nJ,qT=2 rk8t :oJehq9SG"Q7~,wϫ;=l~=cȿaˆrbW[+LK~þ{=Q͔G/{c='nz}O~^~o"k>Zߘ)׽TǗ|߬Vݔu8cOv$l^2=N)cG|jJsuOg| #k^{4?s|zw!;7kv ~ 6/{0GgstI~l/\'{%c32uپʞrbٛ==߳R{rN򹴟W[F@\?e oFW肗5/#GP?Q3^' }֮JU.K5(s]eegg&:AUϙG?4hۗǕw^_i.ԅ{]8s1ץH\[F s!6z %enI{{U}yw˺7(:v}qYw/@ڠASP+/!iz^0T=Wu)?&Ӥ|`K"%ҤC"<7I4)}>ّ4R"p"\$䙋: %̡P|Q9O3K噔J0ȨWϴSU~o̢4YiWz|O,ǢIZ<(gsѤ|/E`a_{j<)&泃)ߍ_+c]|cڿ_^(g&Ѥ|43(gƹwm'ww̠<2?3[Oc9Ѥ1oUq: Rt#N_4{u}S~4"ο♖a3Fy=S)_&SLꞩo]hR>K_dDS.SMx¼ZǟBS4')'zʓ"Γ P|OJЍ5H5)?'@=Ϋ"9(r=\`Ռ^!o|l a\jK8ɜErayW&qޕIoEL+~"ayX&rE1EL|ojs8o˹O,z9s>ϹΒ"I E7R\.>8cX r"?rڮ-8R818FrHؿzw;q_q%9OH~q /7 h1h"q 0r\ЕS:Rۼ" RPנq C8a3 yM<RfZ؎9a5 u )r|$i<Vv)'|ZbA r"*9a! 8LE_h؎q8@ pKUڟ^w>ؿ?׫q8~V ?RA_/;-}4&h rASq rA_?q@7~;rC8ASq˽9ޠ78^WE+_{Q~6Of /Blߓ%r7Bc"շ-"~wO5\o܏zb}=8o"qpO5oIg\ y]teX{sgpa9pǩMΰ{ )b~/ |W;-8[qY+x`fp>c9lw%^X|*$pgb.T;(#9$GA򼢝ݮ<^]K2udaM$#\]0mZ>ЫK;`|(vZ/.wOm?Ϋvѷ]vyR1?0X5~^bϛhq'<?2ئ|Xfz@qT]cPyL*oCO8ks% S -m8^G10会9^G73#\w9~G1߷#1WLz;Z'=yH|R:qtdG{Mgӏ8Ҕu6$ozL~կلůn8Qnqk5)ݛκ %[qc+8#VnqJ)ط"q4:EQd]Z'#>Y_PqYYG::ŨIwYbd=ջYop Yߠ~eE/cr=+Kec]'e?"?.a/ F]O3;oMoYoM3+ֳZhoA/:쟮~ir<c?"%`d~؊ oLiGOU<"_x9ѼAwg D{14~pE'@aj}>0bTug&h;'Se<\ (.sy"^gwWl],ox"ɯ^Awd?"_ⸯ/X8*+hƯU}p; }Z,1X)`?̠D~ KKj;{ٮ<=w~xEy]o_~|%,SS \_yݙXIZў<<])hvm'vU0o7Oև*{W[&|.)*y yq_rjdt V:N-!۬4)WUB]@Ǡ܎.#D 5hǵzQŢ>B%_d]"bY"B>&dݨ"bt!{u}>`> XD> HzԊCUd=jE֣Vd]"B9"C+>"B%+.Ti>C+/hcdsW`h4x/ wʗ]YGأ[]9.]q/>Zoafy֕*B"~m~)i }h} LYg* >cݫoHa9'XZuCx ΝQ}AΏ^iR; #`^/:\|g R~gWA\n'c S}|c_?}}d}s y_~z.E IA~{9:Mv2F%߫.z>>{ާkwߣ2{z.<;lgٖxr/AV&@/~7e?,Ndhvmv/iXvmW({C]b-]c=bȶ=%+l{*l^:VeAHNTv$){Oi*^Ϡo+ai+ t%`gvmK{^o xA*Qs=Ή5yqNvpq=~:x/b<mF#9ޯ25ƜϱƣU8Prq5?T%DSM8$LX~{~@QxrC΃̏T۝U GZ5\5w#^͇3yw%c-fy:{^zw;w3)9_,׷,.%.0p<3gBgP Q_3hţNdI/y^Nɗ8E/%\eKrIW_ӏ~iEL_Kp Ws W=u.6`AGt|O#_z,k>y"a˂ő*ן=weG|n=tw|؟WW8#PlU$wAOh/~hmTŸ~c1ۨ a;X zAۨqqb(CPE9/BQCp t A*VYl8NQΛP8O2Ɋ>1|aP)+\>%/Gw^)U(B[/h+>QE^"ShFAHAY (rކ\߸$oN ǡ0q(9d!y q^B\Rwn rB5O,E{סn) ee"BAXdZ_0048P'[W\*Υ lSU{z6]]癈B-a ɼCq*b<);CE]%yAi(r^W#TfMAηgrR k0y7pލ9χ"}`;1.Ӑ ? P:ԩ\"kF r;{XeܰGqƫ8sk D>lHo**rN'b^m DA{| ߍ<(.Pȟ2Wȣ&cƷ!'Ea+<)'E٣Y fG{$)c[ r]WEγyVc|,ϥ4 R>\VQ.myί.M@Ǒ%`(rYE#/ 1ä->1~q@Q[ =骎 < 9G+9/"r ~ǡy92p^28G\?7=Hus%k~+Iy9q>Eǡ89"r`;1n&-U亻7 rݴ\7mҊ}N@ӑ*b| Ҧz亴K4iv.\.jcqC P?둚y d)r]5EQ,8V2?Rah< \ND~3` \?6Sp5E멥:hfrQD}[N y$:\gS=ک]OsEqi^y8k6U$K rd\-)QSD>A$'}aW;a_c9?IyO_Vp$D21A>$:\QyQ\9?JgÞi&(\R(~Rbe%/(gdNLrIOqqy HyG8미 ӹOyU4W%hV UѤ*WE(ޣ-{gE8(ߊshRp޳ݿ;)]IyX4abY,,ݾ~lk8MG]"8]O_"'cф2(Ч',sm[ ;;E;w(svϠKüHY4?fmMߞㅉ!0Źx}`ܧߢ)ȟ5Σܢ)GŹEyT?nNI~ RMʇ;;ф=yK)_&'Qh.$o9_J(s [WL:i3$vTFGxJ|Luu#G{jRssQs \#UhFc0z8WIIqς8h {4a׹ ®s R&ú"J5/S=M L:(MIiyL&V̿D@ܧ1q4/Kt`%o 4IIz M肰邜KIZa9邜9II: ȹO Us.ȹ|y^ st>as!pmU߅*Nv%[!}'}st=IףIzt9QG0qNw+>G0qNxqӤqN.GGGh">t9$]&9h9ΏQ9IGϤ|9AMhF0qNPM(p`g*֓F5 nyۑAi㤣$&a9iI9NM:HWI96ϟ"j4IWIzi$&h470.^YQʳX~S g# g#]1HMqP|st4)NI0q#g4$N-4ahFiCqnF f4I?"st3I7IMg|0\$݌{_够qnFt3asA3h~9[YAfI?IM3~h~Fŷ$3^Ut3DAg}3D '0KwY.ξ/Zkфg-a}ycI"ַ8{IעIgÎk$=,ұhnEsx:IjnE+ү8{Ht*O^6ATC3zү8IY OQuxS T]O$}&T:gՃS = 3Kqv.E0KqvE(lzuvRHR]MO"ֱ8;HY`Xk#XNgU4/wVWQNzMkD{Il'&U4cG} Z#wpin#&V4I hgWm5/$݊&V#WH J V4IIˢG}ït+럻(Eү8[Il%&R@"Bg R4'?e8[Hl!}ম7}k +.Eq3R4I9rb؎)fҥh")fҥh>Eql"} (Ac)QR$}m"]&Sg#Q~THg#R4_8Fҧ8s9dt)GC-R4I"֧8ߒ.Ez|K7϶1d)a}-R7.EAҙu&җ(~CM?II/!=&ճ "` )."}&4)BD+ 늜EO ItJ<)9HqctE9H8tF38g)!]39s(@"AiHq/6 $3[ _ M!M3Yށ~+Ruf/DN3tFyșE:#M9jh4Ig8tF<7Q9X'&鍜7rfHFQ<4@p9O׊KҜ݊ZtJW 땜E55H=෧s{Ƽ%X?mII'pAC P4Ainlk 로iҤxg顜igIz(g顜iRJ:(MC Pi^2A^$=`^3tPS.rV潧Rb9顜)A J0rd.$] ҄.k~2A袼mxAK9K9GӜ:)X'JT=Z=zɬRd"$'AO%{&JTXO5uT0:*A訂YG:*ESMdDkq T.Tʙ~Y?)EO)BG%~QM:Wa=ջrƳJuVYg5U}>e*dx]}1?kGbT?~:ArXRXQ/]T7Kq҄ }8{)kt_Xz/E}c88_RkiiF]e\m}3{Jcw=X%ևsiX@vvo^^M{}qݨ#u?<v|Ͻ|~Iy]b~_w>˾j?~{y;ݘ] ;f_b;waE +>z}y\y}NokD+]zο_F|'@>v#m2Wyװkkٿ.Vvm?K:}-K;ܶmݶ-_ 8?<t:~o ΏտS uTȿ,E|_s4ǧ(R]M[q+\.ڷKg~/f?w/3௎K^o({5Aj<&]wfμL{Ԛ/>wv )wFsTw\0\w9؞k ׽tFn.U !vk4QTO\QOkZo}=bѾT>]kU$7C i|`ov{C b'dAo\\>wW9wӁҏT~җd~ H?_r_zah3|y#$qE88?0b =`d!?T Z8!ɉp!KhR]g`} _ LRl,|9O"P|7E 1UeE(rO9O"E|<~'BDH<4y9 0_|9"{P9@ 9hv^nW^'g;(r~TOEjb~gW}[y!_ؿ/9vr]a9(}8BAׯ;P|9=8~ocЛH||@B #K'Ѥ Wy r^'#P 9/AOG z<@P2zpw@uA3}KɄ ~sΊxpg@\n&P(r9_.-DG4q~ٍH R]si(~7q8+.qLe8wؿ+G0XWפ,/J9@WЕ%p.2X`خ wx9n_%;_t:s}gWyΈwxN/mL)q1N?ߩ>;q|9~^#}9ce3q=;rdd;wq8C-)q6SM{owab@-Ay޾e~-u-0zT%iyD{8_q\~;oqmރ p@>#Hqm*T1犨hu%Zsyk3WDO}} &'݊9޻{8lɖZMj@|8^g_9AK6\&J5NB+#Ψ9wqr*TW=~w9]U_Ţ_8]@}z_18݀tԮ&mp_|fSE{M9N)GG&T)6e,8^ q8~ 5]Ew f~؏wnƐb8ƈ7xƔi9>׷5Ϥ\^ʻb;h}Glq+r|kC~B|gCį: ůqosi;v[c~_q窈xWq 8޵sm8Wsܽ=9>JG/ǗǑǵG rD+|z_,zNy/<sWo){9A3(BoaYeFY 57rW,qdc;~2[LC*gyP^?Hg{$7kϲ?4}y>Q&|j Q~(Y>O)R,/w<&{,.75-U_xٗ^ y|+Y*/'7S} F~0{EgXwCk;zs IbOh}|y/ThO?37Z~a){Rկ cbc;mQ7we?,(ݿC3',?X_Kf"W7ס0kw)~HDiخ%?Yhg '5]Obva b'Td"/ p>G^)*ic',gSW^?i^_|O_Q֬.I1%+r'$k=}6dO)fG? k?7qe~/T?ҕ/)6.A8/vVYF5 ղ_- ُ&Og>~~f?+`yA _ Vd[&Se}2~LT<<2Ulk&3JQ)Q<~,Ec) #R\|H_=G8"53˛HnFd:uW bbi^Lh/M9t*=Hy%S5%RrhEJ83>:9Vdor{H<ЎAzk}2?.H!+s8ߤMr>20E~aE'eoÏ,dpz+ֳ8 =O~aE,4 _X2+7!/s@8kK5?ڈr!o/r{Վ<$VDiA{Ju%Ԏ$n'hc~w VԊZ]Gg/݅w{ qE,w:UKҼ"~}շ bռqX~De@L<(N|rEI?ۍ:^b?0hנ\.|UB7[[eq<">lKn?"|]/Tyb}# >sHw(rxzmúE\nmh^<}u5SU}?U9:IApG t~cw2!ez^p_Ajs27#k7O,;@H2mS¹uyi|oXNuyrUsC/548ٌ-UP<@bǺ4#.ů= b7~rsλ.܇8AGD܉Ws桛p{; *.uyxtZb.' T;}9n7{nɫcv wemU1۟杺8ߤzYm^ )Ac;/Toho`n-<؅[̗ǵ /|/œ Φ$2i6q`Q4׷$ +_YZb|VbCpട~եbѻbM*[_zaopi. OG5z.cy:7i]sQOů9u3gF=K,C^.M{+-ڙ) OiKwJ.gI|:hpXy Jq rMYV 擃k(Uh`٠}"?zؿa{娧\qr]֘ӨcoL?I>NO#4NN{ND}@\y ' r;c~Dn]3Q~kPu3O~S 9h}Q.5_L}k0E.~~kX:qNzz~_ G>Wg p֧51ϝBN\>.?UΆf49iSv-ð|]o<瘯 jJ;bQ_m#hW`"kQ_kD]nq#}pDmײOwS5u#_}e0M@pG?7ho3{?vu^nh˛SlYg8OQ1kkg\χ}R.'aq0xPs( Aʓk謤k? }{w`_y]!b'hj]RLkqWl?h)#FVC-~'셷]oE a. 68gKs: 3_sg 8ev6.W`?^gD{y~q7q2oOo`mayZ ɡOG.?^_exoˠsv*ux{B<(ǫ鿷s#{*ocez3jlr=opč[ B$QbOfW4uiv?Qn/of^X\ޗ?_>V_2sNkkA̳594خ[ >%wq-Ot_7Xs..럻8" 跺t?`0.B~\K(_swo;/H ~x^w8.1Nнo<.i.,键UP]ئ()b m5}Xtu\GwCHA0?a$mwnjy+]k68 /Ok{4[eU}~ϟ bO9N%{Iq~T₠Am=QqA{Qӓ~B׬ [lWLF@ԯ|pvb`M߄o8Λ]2j)ɝRAp+ԁ5X{jXFRWYR=PI{}vzz ufmAp?'1ezIt56|}3x3^_4X;_yza>oy.ŽǼkä\eJ5KKUb}-v(.TKu5{^p͇ok߸;QT.\}~'o>4L,Gjۧ%>˰>ߥYuw]{G][^a*zUn?V[ :޸.dv8؉ٰ,5ʧV\^ƹ*t{^uĸ2՛U| vXҭ#iSUļ` 5+o-Aվ/ y%_o/b\.~>$yšE_83"hpqfE* ljb/b|o{{5+`b_SGi׬P^}^!>ֳ׫YX ]˳U_ϯH{$,zr˱?V/[だfY˖elَr7_P/ Ve:^eI˖a YiϦ5KMR OTKc>dtB#%Ϯiد$i1̀$eK+WN,ΣDn;0)QUq~nؽA/k BnƱV^ݜ5d?k28y%ü`y &ycw~`E5|3~a.]g/T.|.Eow/,Y?ub|GHfDAx ݵLP3+ad>;#2Oշ`AI'ULۧ7X`&7gYS(YQ3+z0 w|O><?EFK+#tV[eԝ{ߜi2do#㥁ثqhlf]{8ϣ?OտmRL~cE+>N6+? cen̂90,*K&쮵.pKuYCs'|^uϩ$c &/`o.y {qd?c"p|^ߋv\]g~O#~>p?[;|G,ԤN)|179[b_IYly1nW?  le*kx!?ot70hDKcyK_d_T1QA]/<^5{ ~ZIzyfWnnMѥye-+T}$9\g18멏}9K_? Z? ܧȌT)粓~O%t̖ Xmkb|^]wd9XP[a.]L@?ͦ +8Dlw~@ϓOpA9)4z&+v./Ʒ^ n1Fz5Qҥimֲ z4aґi~L0s"ݘ&^L0sp9MQAyy $&]6TVs$~`X/O:1M1saI~k' $};|D'nG[Aҋi=Ч~H'֓{I/K0^҇.Lr҇Lq7"}y-A ; -I.NsiBoú.si6\ifowa;{En/~Y{azPS.W=6_ePtCc߆ethmCso{g*˳}/w_ih[Ig#셭_ 4mXg fҧi' n"=&ܛKo$=&I73X-4I~ K8i({C"a7l 7cEG" MhouiGv6lG4:w&a5ג.M0KsE^+ĕǁ®$ti57D?rOV/ ܫǬo𕱙Wc<svWs՚Wkw?^? 8Jҫi^Mj)s.\A:6 ؁_${I 8a'<\F:32ҙL+ҏi~Lq)KIG^ޱ_ ~Ih}o(.͍I  >Mqq8Iw@m"}ϫًtWrW{Vnye=H7 ݔKEi.J;4|׳{'K|)1l'3G?"]&MGmMҳ%{$}+z&wW1)v!⇧yh 2ma},bΔK;^~.w¼خpweMorw)̰ݞLgr'=`XnO:&vwBp1m&-mI __mQo `"F^雌󂣾xSl߆}+֔ݚL֔~%(pwe[F K5[I1'f3ʓnb}y)*oFz(wc2`Q=Ei"/ tK:)w(ooM=#M)_mJ'wS?ú ?# (kH,HnHz o7Glߐ?IфeǺ=qEE[ ,/ygٯ~4O+ R@AEb"AJ$a}"5 mbgSd[Id?"JDAI>~7w}E{O7*+~7E,AIrGbYK_d[1e"ߊߊ\sOb,~7Ş_|Za쇓,tO^ؾ H5 z4ޤoh"$uV~G%+zW< G~6EʷG652Y[Aoy(&$XxIz(C%αkuʛ<W̅zL^O }/WnI-_&qc <9ٿ~g~d[Τ[נ|EhRH4/rP^w ~54{&ѲPwDfo*3S^wfIfh['TZAG?1E=~G?&a?#T7Of{`Fed?YFIf/|^tL~+Ŭrri>cH~4OJ0dSxQbyj+F~&,Lԍ'A~+vb{vR ~Tž9LeLw+4~wJ& )j&G H~ȋ5H)?;٧C Tbǟ/O~wJ{|zRWN2dWSNLέ Rwb#%zxGr}5)oՃqCO~&Je\T =/X{g\޸_ _IKqɿwJwwޛ t@A7@yX;EC4wWlw5qQI_m6H_ȟ )GVP ݀_w}j ]'?& 㮑D,ڻL~ S䬍wȯ ] 8EkOP@~ Moh>zgѼ~2>?E״׍oLE\m'kSşoy>oU4)^,gN/[Mon?Pǥiu~"?O3Ԍu>g_2Ijln ɏ=1Q^}Mgh¯!G~}P y~0질Cq_!Mq𚈃wizv>ѥgߋn^n[".g DK DvG(j;$;s a,{ō!:/E(z͚?a9v?HѾ_OYW%3:uO3S(OwRJ~'MOiR>2MX|b-AvP͔LpǩM`5󃈣o||qo}GC۟V}hb>3h0׬wK`9⾥<_s/@ &@v#kXN!z)˻HEp-p&'9[|qk)OAj؞(vq(_C C[CVL8j;q)ρ*jLq {w%=Ь`?۱L0-ny8oIvº0S/yAg 0k-;wZʼno]唷>n5rlW>uoZqås 瀧\@~#n>p_k6R,o]_[jŸU7sw(k8ޚToA͛嬑qȏqry=}snUy(Hu48?h^/kq}%^S]^lIDT7z7q7띖yqg~#b^$?`7TW"nS/|`jՕVNyP4T<0F+ ʷ)#|z?wA^Oj_1UgyߙHlG#ﻤ\>IAyMk/߫9MWiu]TׁI7I{p #R}o?1,,/"`XtGeJkƴG1@eI{޶q=NPGDymG>ݨ߿mGR~6|ɐv$Ҭ~^mW*Ҳ#5~/{"iNQѶQ3&)?L)J9mͶ]k.}ߛ'@4;1J=݇އw3#ֳݮ#_v?6a( T]j,mvm㷇~Tx\;d} /qOc?4k6P5sg:hy~g\<]y9i3>ߜYr}vdLQ9/c쯾#W祣|"Bk:]hۃv%nS߸ŏtcاGcLk=_vH=bvmP|m}P9nboByXګ>> v,;/.yX,x`\2{&χG@}ǕwNkɨMǰˣScogXOa/c}b|gc}a ?D7QrX(w?P5?Hq~C|X??w M w: ~#8pm)S~JKǙJPW^LYgBI\Ml?GS}T!n4{kRw7+$hR]QT!nGEu4.HđB= EФ<5ATA37l.MEI)R7&$hRzp[5)^]Qz0[F85w- ٶ!3wx0+xଃLqq} "аu)^IQ|&kfrU^R|@}A?}iRI4|݂a?VGQ>~ m{oaG5)^_/ ;$Kyz&>-FeՕ/ۯً5?sEqyn;X'+)^s "ϵ 繎#ޯك5_~c d|Bqq eS|&]S<&V5WWQ_jvxzMgǮ?<'Jy"eWkRbפ8{p}܇8{?؉58M' rLq)>Cהǥzq](?@\{Qpg_|ycV=z|蚔!xs|xޏZߥًU(qNKՇh(N"]{{ws(4!nk" II[܏d?hyX{{۽z_CT*ҞR'k;ʶ!6픁ToJvFu˖cna/AO}D$)?bm7Ѥ|5F%ՓkI$ZRMka;/ׂhRT_"9ͩnfy`9՛kiۊ{'U{f I 2Qq s8 DHH "AA@rtHR]S]vy{ӧOW0k'~Z#Maʺw?1W>V%kuD@Dݜ1y,?<U@I@~>eE[CiΗj87u#q_M YMQ''  7"rp4QF3Q7BpЩlAz7;Ӭl7?u1oDx/$kkcMԱ o~Zc yZ_}݉~:6cDMԳQ 5[55Q&{l;oj4,3j?O:(VCVY!~g5BއA ݄W<{X8hb>*^p«Nxbשz7@F쯄6AAеk^q.TD /IjˋjUFܧ M(u ǣbPc|1D;W"Rp/bQ+^IhJ}"bOTJ|/Y ka[TH|c1f`A|;ߏ;!nmS zGw^N7Y zoQ/;"G"yLb{k-UA'I_`~>=?ؙMJ}$⛃w]z7Ahb^|"<'(z`^sK1ǭjv oz@R')׫ C)~90f װ(\qC?iφy³~%M13S|I@ߠ!f\&1BxF̟y<?A'By}nb+Nϟ 9mMbϯ* :86 K]0(ur¤NRGQ伎_8.]=&ur^8R'5̣A(J =sqCCLI ;SS C*BL :,> U%W R(J]b ˢXL:7z,AŧlxߵYLXǠ]Q <)Є|]>Ij~I1/Wx efAp1@x"Q과(uY8_z,0ts [v*z.bcP7w5kuAX$/KP$7AΓ/ ދ_!.cqbHO uW`Es =g)^cʀ/uZžxn|g6<ȧ?|:^P_s~0C?O*c\Ec851@֓ŸU4kx-`PoدO#{S=o0>#/Є_O7ab|ˬ&1 ށ\? 4_`̇&MC=)߭އm?GbIƩ~l\}cL7hvy{~!w81(1ivHKvLk`|_>O߷G튭[;inyXvgTh` x{/}A&'Ӽqaw0gפt(x?v 9j ='=Gy4w LA*ƵuV_OYb;p;m#?޷1^y}[OI^`\`&5oc`0N%6ƥ݆q-GxśgvLnbGq8$e@Pb v.~<~_ ~gvN|c|׼vj:cC5wP~u])4؞~w>vM,U^En~ӯY;緿?^=c\Md&iz&-wd_תc<[Ǹbu/OMڎhag1ML^qg.X}xvNcܙf wOAܙI3M7貟|X?Nv\Gs?Ua'ѯ^˙8@Mqz'M"A3~}ytv}a~.x|F9! 5a@1;q? ;aG1^ hi+?c)G|3T:{.S9o|GcyObJomo1{iy)ƱST?_kyǺ~qR{ʝ负޷sje<iFt/ulƅPǏz, syb3ux~>z<9)9ON6~v`8Em|:q&51~R?~va<&  n&e9MoT籕xʗơr\:^MwQr>xUWzǹ;o>O㝐i7}_~s*g[/ !${w߃z׬}u>jG|/?ǩ_?P_AGbaE'v:nx{}Q"ԣD x 5k<*N'*sX|˭?zDپipT+g=/:w|eK)ev,fv0e#{ȞldS8n#瑽dTBԫTtK^A}LMe*NJSeO_*3ꃆyv` !{31ϐ}ܯk WPdB~]%Fۘ{{x62'FtG (l_m;˓_pOo9D⋸?.;CgxVryzu7~X?DDcU.^cK(+=[J&] ~_Ry<:PJxDhg)"UܤC|%w23Ɉ$I.ʯAU|h8JG%mq,.5y.<ݏ%' cAoHhU-߲\_(@M\祗w[0iUq|~R:5U=؞&Gi@Oǯe4O+iq^Zn-ⲝ<k61zy>;^ţtWŽ\ݫx~߯H_p}~l#_] V~n'4unSfW_0+CĽ[|1;<1wOӦqj|1S z~,~`6:Y[O4W#~lFYxRksl~a~:AoAzWc R/I7#{Dd,b\פHUs l Al]],{#}~T,1Y@?`q}2 (UO~͂}g:$]34ҍ!ҕT4Ϗ(C:9[k0tu r"}"+""ku$#`QRJ LDMtTozR/EzSgO=3tJ_{r,C)1AUcAU+ku?)}C3}0tܮo{~KV_cS݀vp>Ic[o/]7kh'͎A]yT?א~ғAқ#9KWym;Nx~7ݷc :x$zy7F&~wV}G {J8lScބߛ:~BY8\ЦH:@ƯYvi&2*FIX}Ygn\ `l:0k}LW\1w\Ʉ+Nگ?g)+'6к\K㛏9~TbުHDIJ'뇒U:-~NJm1- {g讦-N+J=Wc;}lTcqNzoeP_:r20z5_qa< :~CoWҦgh=$DA'~{A~O^?Q| Xkǩԇ叠2Py(Pu÷פjdZ U6a'@y>Ň}-?_C5y~}]VіAJF<*ek<߱[~ceU^L !߰CYؖYv,S>{ h ߀*A%`u`10\4` ўsmF;֓4]Q튊[7e=6|[oC{& ȒG߆mh ߆HŭhTt܏hԤoG;`Ў㹞lTF\gw}R퓂Iv]Ldvwx9$qx|?%/_ߠ:H;#Jq]U=E1j ~+z+(V~+cI}Ys h*J[Ҏ -v:Ehq '?uJ{~#oG^  ܞ낊b (dKƽV{ v'MqLg'^<%f씴)JhEC}JV~Թ>[08#uHlEiwS=gbv}Vx<iIoEiǓ~c;⅄] vRGAS.Nz4LJ;"5]OQ`/JR){pu}J{'G}?I=x~ ^KVC{~i0P|__t8w^.ph.~-J ղ2*J{UiY7(탊~HEi}dMN*uWi7.텊Nx] AEiS9WVciEn4y!pM(t>(}'oJ{-ޫ(xaꗎx};S`;C!=iC!wR~2@1`y_V?>y"x7x7Y/ӊ~oޕy'{2OŽcP汸7 `׸'\K{}i/  J)Me EiO} Uq澗kPP?I((ʼ#ć^PkJ;"~B|w4=`Hk[qQy`+o[Mў١':2U홚MWֻ\횊%Ѯi%ESӣ<ZA۫X7mǗB{&KJr|ǥ3[4oV/Li2gXsLWTļVSlhºL I <7H2+A;v0h7ʡ}TՒ!+h7ʡ*vS}WkVy9b{ZUnjU8f4s>`x~2&M5? ~Xh?D;UV373TMD&r~MZ5kD;&c߇u'AjzUZ]AU :[hojg|>N_ZuΪV[hg}=؎V.Ʃ+CUV={*G;b΃ՠlG<a7xʴ>͆+,lA5f7c`䙁`i68Lq T _6yB@X u*f$Yj]Ԋ<2*q~3)6G=h5G햂i.][h>; Zn nA V+sZg ۇnn/wy:`GYaVG;a&;=LuΨmuA&5*vӡb{W㶺g5bmivC{{v3+ݣgv5A_i=О4M)$hWDjV/i=3ް3 K~q} ߧWO_D`_mOv8o}sgx_Y}a"`o0&YZ09M4ceȔ*`aVYf Hp(]v>hdz`5.|Ѿq8=k٬AWv5kT~?x=M1q~W~1Lb<ж' h7kƿY1MqڽGnѠ8n4*8 \hRZ3}oGc|5۬צv1kU?wk~#g3)A;{Ӹa_qohGD;8DǼ1v5h_ƣ}v5M)~v5M 曟mpoC0u&ڀA*YSTc=:k/;N3HIIo|kA uU)'^4`wZ? D敃~$|TXp ]D5{0TLhD&h߳a&ihﳦa[ך?k:4v?hfϚ>řךܼN0v?M/fϒegq|̯9lY~gA5~s0 ; EjP1 퀚`k΅!A g.฿/EarE1OqyVC}y5'ٷ棽ϚNb|Xw2VkC,X4?,AŅGh-8Bk!j}ZAkEWZv?hzGc-psYL;_5/ȠZyhXYӃ0?XzWߖ@YnxK)A{fҰδ)hײ^kqC:g)G&ة`;_}J+GiD@sڣ4aF'oI$kk4^ A E/ڷ4emD{ch?ӿkƺ<~wTֿ{gcˠ Kֶў=[ 4O!wJND]h8FMi_%+_Cvn﯃a|;|0X-/e7=j>L&o0R1n׷z`-Y{}IQڗ!~o{!oؿ 5_˯ qĸBMΓW#gzջ~wz&jS'_Q'}=_7ڍj=zN../hY [.nm#pʖPN.X%>@v`3^?cWZ'ޞ|ټ]Py;kȼ`'Q햴S;sܘz0؉-Mk+J{wПem qvh7.77nCc_Ei//Oⷨ"vo N_xdMiVA?ϧ~G]I~ݼ0/?@O`. CBQ-K?à#8p5>r(-Ы:َ*̫bu`o;6d;a] `OAv۶Nx3c㸭8sP^$No> k_y cAlu;_+sLQbz@OAڈA [!_\,W.x υni!(]~jP|?&`0',οpҹr_ ~ʣyM(BεVaS|7]j'0.C~qo?D;\_2 C}#W3KEUN|ߐ~4 ۛT*_< Wx+#޸9t8W^zBxCjW~>w3ͧa}fAM`>rɾ=L.R~}&ActqP|nh7Is?jҟOttwKj7]kuKPAu{n$: @i-cpg<ω&n%y%4b0oxpijwS+)BM鷤_`=DMP3MNgOoǤE `uL F_cX3#$ϡ>觤 ~L]5=~N.P%OU%}$pJbrTʛ/z꽂_ [acSHMl$]W݇ߟ7ьk ʏ&kX=Yy#=S?U{;k'믭]e}kzNI{v냪o'MLпӛ;ѯS0GwAƧN`Q .&I{Ӣ>D?iMVL~Қ/-Cho:UGgo?IC<$b_ bq^8+Z+3~ŊgzA\7oXuA>⼌_XNdF=oļۛzY_ا u41I1; kBܒG3b9%w+<)\Ka<̓޼lru|PQ?XsD {D``[Z;ΏA^oH6k]q|=-~qKQ~!X'0~(Sso o_wD/A:+`O[vd gCV|#WvE>*qWE!OkV?*C?[MU,O-ޣgO~O-c-Q]3h?KAXoIi1q ǡׇ~0^@ bS9>_-5Ҩ[4myDiD}oiԧBTҀAD\Ų]6B?~^: DMoq;)gC:7|ǚ]֣Y.Wq#`m?5k>~UMݿo%=VBpX@VA?o`/Ľ׭~ު0zHп[s(wWC]$/ĻkVn&߯Σ߸& =?_:k`o[k&+~uO[ e{HyyO>O+6@gņ0߳83T9YaK6Ad_ #+6dq|SK6EcM?~`}SW:W>:X~35kh`&@MMVzsok/єj0>EoS"Ԏvձuدijsm[B<+*79>mދGvw-ѬsItۿ#"w\D͑*.#PR$Ax#Q쟌a|Nl<1 y-0A%)(~q AW̧ucbGvU.oIy4&xM; yfF^7q Ǡf+/X r_Qq~7v/=(vG/˥=Q l5 т DEF[ooTy>g'(ͻ7?典˜IWV])^wEy\6.C5:~`_iBQ$ FUM'~g1k?PoDvOP'Tܽo~rEy kџ]U2;U5џ]s<觮8Ez@?JM~WוZ?9wkBmx{~ۊ#o[Ӽ3)Ɠ0yxa( o{G5+׮8ܱ]~o\?CoMV1i.DoEnMVsqIpWv_^\ GO5Q;2;yF oK1לi/읎‚Aae385K7m @k XC7݊POOqv_'' e⾳+ {+K7NJQ~ǚQ;7 wnx G~޽ a!ϻ8lj!qgW-+B~~pKp 1kN^IsϽEY~끝 GRz+~~ޯ#Oу=ѯTqF{ wz7F~ލ~ލW݄t͠;+ϻۯsj_wKw bRn;AS܊y4/ɻoI*ߚP.Sgzi;; H/Ea?4p)vI:Eog#<_{ݙS=7#{^Q|M&VI:?7ҟKz~Aa6eGzn~}bhu@1]#/gz/=GUgH/;"/";Y=x$WYR}w;܄~I/}ݫvnv/ݡvBxݎ=ǼT&kB؎:x5(rIqԥq%;hb P\>$:j Əxc2Okt  8sJ7Cʥ/m xB} % 6_ _xM~<]G^w5 b~<Կ_c+g*z7{tOb"oO2m}z@חx}oEH1'l9Jj{fc\w6iyOr>5 ;ټkƃ*yLx\.ᓶωx\=$h_'ҼUcar8mS6ģAO ƛ V;34_gx>ϟx.@jQ;a0Ǔ @A^/h=Coxv8o u _;E+:WPc_GwL~HD]~dx08Ư⾃0ow`ŵ8dQ10H _GʞI4QGh]~MVDŏPWx?y0ufZЯf}PlH7q;x{c^Dm#r;N(=޼;q<ӼQWM )vC]6m$gv{bowUQi/v^n&{B3zW4d]ݗߏہ]֮vڵe9wQ~!ڕz{gTO1rSD]>MD}>oOS]0;6}gD}%mvl>C(o?ԉ2ڗ.jJnUmlte]<΋&[q)>MG{a;c?QCˣQr~y.݇ݟ?w1yW ? ?iv w?+ffǟ>>>}.n,{uWq+=~gjCD2MITAnn;k}Cĺ! U߂:89l~gO{vj:ۥg lGGԫnl@ ve2T;4ɾfw~f)C&ԍ;_԰O۹y5Yv ߼ox)>ʾNmo:%mvT|#~{_]y͛;uz~ThAOLݗucuI::]|:SQ,um㸿B{*\D1PkbDŠN`멓`k#y.m]w  \v c֙F:8Qʞ"i#}|~cZL %-R=䳯y:\}sP9]vPnt*X{:|%.{\ :@1b߬3mP[Du[|ި]- u*v*'8ΣDo ޏ*r[O?Oew 砗g&'I3ƭ4 yt{u>qG4zP\qu8~_ ),򻠽V+q2[͞B5٪Uh|ď:I+{݆Oz*zkvZ\㗔Ɏy2]vֿzNCrfzZnqHwծ0Nh[`E?xsI n p2'Dsp~62`=EqKO1پ~50އ= > G,q砸lu3:u !Nm4tp`>(͒d|އbǵ0 W0oCc0y2ϩ6>͠G <\ˈgK6üafUf6lq@%X*q*ivMmM<?+?*WUTDߦHYwdK˪g?oc"Wd8>J hm@cS?k>z/x?Ǜ\+d+[t^N#n:c;6+ZG՝Ӫy!q~]3y.}yc^nMQGqc>oۦ>׿:K1Izf|ţlzU\EM*BIs(u]öp֛TDIzt9n'$OuBI?D(*=RStLΩMQI/騖̏^X/=e^Wt`Tt>LWۦ܅ln%%/s.WvSt%/gpr j}`?$6bbkS[&! >_x|F5o^m\ל+]uI[W\&};vRxNг'}{{o4jC{L^>+P@y-gdy.75O3Aƿe{b(.&g&O|*vը49_OH%d^~6oЎFyۤ I$'q`oOyގ8~-Rl%I{#y]Zs>=o>;*_?9Ϗ(㡐_קrlQ$nקt)wNלm@RjwbSBcP/"s.?[~\n8u4y{5On;yy^fY1_4f)KUSkk]K} ~ֵWO|F\͖+}F\gդDt5*.ov@AaM|ND?o_Kݱ> {[߳+)$4yW;gYR~,3 {l>Hj'BOuMy[|i5=sw-T&78灥T2-.b%<Ln'*]8oXOS 9OC$;vqo(qݦ"s:ט{3-8-,I6C\%:ޔߏh7iIoi|붟yc~iIryO;F3Ώ|'So,[²%ʭİ^Mt}^ݾ[zy˺a]m~/Dyuo貎O]p<[t~~m6+JC-76znMun?8};n,8sǘ߽8sO<<7<>-K@/cܩ:,w`|u 5|ǟ;i%1G- >5ymއz}W~qc%Nb{]+m]hJ_vc\u:5g=_8OMtOPşN0E' .Bjq31݊Nb?`]wBMvc&+x|M a\u} 1:񢚨Y#U;;z8{kC[(ZG5xsMױU]̯0\s1[뇊z4Q!_x>>gr0GPo:za |w|C,d0uQ:0.:q[C+*~i xyŐO8W<oDC$߭qP~:Md7wxy{PCyYz!:>ss7hSjx b{{{QL;3ٱ<~^?޷zGm]=R%h?l j?T{BlS1A>c!֊*{4DjWiIjxYj'|+|?? qwl0pX=9zI[ƏNL9??yw|D{|#lC5~yӼ=_M@=;]ޫvIENӨY?[{M֦7o߿E][X-kZ߶g~^+ؿ9~&4΍ލt `?Z{\Buz5i<~jPoP/So@Oǧt4QUkD}MU܅Oo.-D]ŝcxxH{ kk6;ϵu{,-:֎6܎y( uw:<ֶ?)翂Vñ`lk˔-_QbSq|_~MkMgcmD+K\wå1n@k+GMk֣~n?huuh4QwFq XkPZSp@Л}yfq68CeLMq_*/d^;Gؿ MUoj8YԻZqGqNOba0O^֊&/Ղj``qrGaܱ`0YRqRKzt⼥qK,7qo ![RݿcASD]M[U\q~72߇qV38u43m|C\gn)azsPgDuL9k"8;a=0nTFgbܨ&Ə G7ܼNN;3'Q;3 N(ǣ7ڧל~10_QtXMߖ^לAVqߩ{6?獂~8J'{р|>l/v[v=G.&,4e2qN&}dtC hvɺ>{n8NqgߥZgA{>?i樟(xSkƛZ:9Kv q޹8nƍZ0qVP!CCVxuqqPb|1h ƅZC0.Cm ƁZC0Sq0ƁZ1 爫񞊃0S0i LiqZA=;} i*xMA۴`fLpqi -CT,r~08O]*ޜ8_u{@o}1>TtAoΜ`;Ab}}%cݶ&gJ'[c^鵳q@?8zq?Y,kI =j8VG_10kvh37ܳ؏мA='5/6wmw[c5!>oc51NVL(]0>Vd51>VkObf k"AA`8SѼA.׳oخ/)sTy4Mʇ+_^={PU]1{Jc՟_IDg+TU-ȏgP~Gb[c+'Tku:>}wڕ=vJ־Q;(EnwMtٯin?xDSh34Α0`KnXp ͠ Cфu HF}Gq# c=|Q7D0_:׏y?=;z)V0K^~@E\gXPEr|V0?x?u/@?ƤLji%(6Y@~ԣ_/6?AEǨỳ۳Z dzz;稿OQT؎z=sbM@]  vyx7R u'ɛ '^{ ؎zVP<`p}`]rҮ$Y:`^A6ߜ:#(Ӷ'ί9_{crOQIj4Oy;|=_鹲=,y `[$XmQKtNa\:\HZQS _wA=L/PKxPRu,5QT{dD PL]}>q'vC[uZ'+yM=_:ÚNevFsӪ&+(InJD]_EV| C9r=h/=HK9\U (Mj dW~ԗļ4ol`k ~ kA/C6_ k1ώ~W,Y_a^ +d}y41"ڀyMȧ(i+`|K(_s~ZD~.`'JQ' >)*I^Gop-}IP}-gYyW}ߕ0ש1C;uq:tyw[u6кkc=K#z|~\JwiOQ=A߿cU:Լ_Kga#36b~3w{t/Cnw۾KƿS=TSId~=~?v/z~tۯ~/iS>qQ|?'{q?]7'/7Q;ݞZʯ\Ur@ tLQqY~e~>;nL=|e.=~8:]oN3`h}kGE%|i!ZL?4t=v[ρ'ŗޮM_YO-{ _\jC scz|KL(曉cAG#/c[W16|uSe{~]y=1~yX()-ѯ%& !cyx=u}#b}O{dylg<,-Gt3szny v}T4>v;u/!,#e;+[|-y^(ۼ&ԼO,ϓ-K8}<,p#;P:才e[O9zX鶕??-n'19â/j?~QqMot~/D5#`P͛u4i;qdb{[U.8E󡮚7Ki7Q?MsD}~:O]tQM$<-ԭ:m˦[_)kQOMs y4 {ertq" AP/[CVɿ 4*[9ЍǗG(oyG}' |M=yRеW@}'ŊzXފ孈zOѕ@I_ PIP[NR4+jAԅ=(8yeWq/0ݏ%'QJ0p *Vs`d5=ڽ0>UQGJHi&I k@(D)Ś 1 PIsNʪs=QW4m룎"=z.ԙRt>^>?vPJ߃zUQzU:l╃~>*,Xuu{vSsW,ͯ٠( YЬOCԣDF>p*l~d]q߆9R0Hqz }:(i?RQEP$rpN6A}) J)6EM=QDodY١Do%Lj7C~9txf<-P8-PgC1hh~* ax? qއ0>ǷB o+ԻF MԻn81kA odA Mԫ Qxۢ"mW>TG)oۻ" 4ۡ&Xhq;G/wu6"G絽4Go~9{x.Aoۥ{z -yA{1M1: AoOD#<(vBo#8/MN&#hbogc 7_i, 1. a\&m]b{WvxoMTy1\Ont8v箉qqڊ=1n㢽=1Z㪽=1{a\i{{aO{Aos'??O˵)kE=on.=53`@Mv>[{a~1TsˮM0 5CPz R1.7O?Si5%`ܮbo_N= kR R/UIVc-+=y1ZNϬmYfk{݉=ǯʃ+ƫ~?/Te@~;yrJ``0N;0[ -uf-u ̟ڃ?yQ ƸfcVom;8oMqn<r |! IwOvS@S {0k@^GW y(ֽ-ff)qؽb>(>9ǽC0~ fD!1VA=n5|C1;t`ky?|[O0]q\amv5ESJkp41]quaԧ8vőǮiޙX( :߱]Wץr6YW]+<-xq6qWpYx89lSp/睓c1/W'cy0N{07 +8kt׋:=aK:O:MSt@]{=*\OS*.8E 4?1d/Z1L #}GK %0N_oe-erɘ3Mb`p/x5M[<0r5u+0~M]Ϭ5ŕ(+5^9 ^ԙi^[Q>E _(/n@?K7?&jbPMlߌ~7 5a^#R_?3mS#<q;S~g6ޒǠ yZ}]D3:=į_k鿦HKu}߱SֹqV9{z>:_c3oػ ̽\QƁz7`\IW菭I&1_?|}辬=~~`Џy߆T.rrrO Fø6cY;Cm'B>G}bs~ױ'A-w);읻l)JfE:NŹqGx ;]?X}s꯭~a&o|TJ-/OO~JR#뿑_{dq[ĽO+Oq}~/㎿O1(܉KpE^@IvF#;|xhGH#?AP?}TRqğ_?9?i IYK?xR7ۮdSIS/~O]_ʍǝ޶g)um|f7y4:4>3OZlG<_x)xގY?)>a]@wv$/9'I?k|*moŊb<`}|?J?kō1b榃}߮(/> ۋ~A?m~~G J_e|l/./KlEL"H+0(H?Oz5`UZ0'L_dA^[yP9ri+}Iy$x>K>zz Ww|NԞu`7f;%zn.{ߏߟgQߡ$}{U߳$ީݠv& 2G_Djרsjr[j[zn;]{+_ 'Ĺ]V0:v6SIjGTWP;D풤kEj'y+U#g4GS}cP[qW<[]=?)(=7Ӏ?zVy?qXd;4[/2뱌R-CT;W 4:>_?;/;j?~+~ߓ~;sI6yőH~I>O"i^~Y!Ӽcy3_G.*sZJ>o ?4z>cֿzޕ6 mhWNHR7 x5;@7Z;&iO{8:X?}&e0۲~R?xDd<@C[3(53<,u8I= Eȟ^n|/u7r@z##!~+uNYD"_:^K,ח:Hݗ1*̎m]yڎ$7:}wy zl{>_;r~@+#G=&G^%GTiW /p~JtHJER!7ROv ~!n'vDq'_z~}|6iI! O_J(J@3"_zlc>/o_Is(EZnӮz^_dٱ^Op8;uFq&s!UZ/y6Dzy;z^IIZC< _#u1ic\桎{4~_n:xnv4o^<6o#y65 |Qi>(;H6./Q߾^mj$pqMт侬{:lmҎ[^N|qgB~yGp u{ug[ ֟}rOa,SD;H{&$jJ\ܙ;5qw//`M1)`i+$wA1w6Q K85n|5ßbkUc(uOm`߆!3+&*X"k GMn@~10q <;N\y0^+18@YK.<D<e! BXW6(|={(|a p<$NП뽈eڍHп8s'{WƶAh*Z3๮R/|>Iznrʏ{+g^z_Ϻ<}ZyψT$߯OÅ7I`op{DK3g}b\i!`?XC}=ߡ~QwKCy]?b&7# V~xvsRJ v aChOLto14Xqq|20ꢶO/oM[\O&7Yti;~,OhQQsZc8/yc$:[(LO#or1xO"|MːThط~oj>z(X9&R3e҇F(;K3ދLq;5{~ ~(Kbv2x\l̀O.t|ŗ-*XmO_PgU+ mx^qJz6g.]ҙAqdK6ya Bz$0m1x}B(cmp]V 5H1m5d [N*~[?M&vTu@2?&_G\39et|i1;"0/6:QqY  u_2Έ4yѢ4ӂgAȟe\_ߟ?~]w~~=ߓVqWV9/,&lQA ؟.|XQ]Gס~qCSS'}0ꉭi;ǯ>N1ϟ'cqZOlq(`qco'!3ubDaU>8YUn@э2봑O﷝OץC}7}Ϳgݮ]. fpޫNapeھ# púxG?k0Cۭ#5_ː)=` wӉ~=}}՛ߋnۗ 5_wJmO'X}"4_C$b-(8xd99_3h [ڰ|GaǗpx/o o6Tw97Yy_HM |^޲P홤4L m"q qqd[4S`WhgF jm;}ob`7X9sʭ(/eoո||6~i1q~5ieܟr^ _^[uQ^<ǘ7nmJTa51#|@ 2q˙NWqm@vi:|vnr 권4|@"8{kxVO 8>.py{v3  ӷlh *&#C Kgop~ }^[`({z,]"8^%ۤ~PniXӋ/gM@\z€Eͯ08\z(`$ j+ͅzS>V=sK6~d)oG$$׳~ߐ RE S%lB~Gx(?jXHǻȤg(8 2vFM<^dA4 `vHAN>㿇^khB(&9#莋3B)r}i{{>x?{0`pqz&~eN f(&ߟ" ֝W;Ϡ~09&icT>`;GߛVY7Y&`R}uksa?y A;qf\O$048?ەM?{&L|lu"_~#83syɚ4F_ʱ^9kt5`ʉ7F%HAҨus\<<ό76ȟ;z (cA>>ZK_ʧFAv=,wIDžhߗz>8! ؋\oz}lɎUWW,?/A W#~"nAG0 wv.3ȾӬ?̾7ZcꍪG~Q#8O>w 'VCvC} 7/^deq=ҟ'6T Ou߸o*|?ի^EOKOطc}iĀcۮwm=;o8Yxrix'ɝb a>u3#nwplg=zk;4[cS'ԾBWd<ytl[wN$v[R=ukUbħ3ʜ_z{z}2U?W[UxZc.׋N2H`t8>ϋ4yy^R+֥9`F*W%k/>7A&qy{n8//9OBU8uD[AhrB*A\E=ώϧ V/f2_Xov6Wϗ9aonh۰\+ :XR?Wuoޝ(Ϗ#C`: k6k^q`],`ֳ ]h~L*J`D7<"'Fny8PJ-/9;G\]/J?7,75<ֽڣ">ѧYE\vd;` g*C`0/ND+<ms|,UZܷa]opwo/Ei~)}JZe_{?+ ~~__k55pܵ;~Ds_`T" !H`!kiMqo5]/?G>u>_{opN" ?$P/:_yLK%4Y{^Qȡ }txaH/o0x 15<]=+_.ˣ^>{Wս 8N",6kY`. # NNyuC.[՗ڋcBjFSxA诣 =}* د{ ^Zy4|I*%?0Q 2`}AR\O/&X)W ૉ0&FD]tʠ cGT m}8މQib~*U _} ί-C&TzDU qUNgA)?-V5_U{aC_[.X iV^Ry{$aET~$7S-!{?S5Lyjv}O=0|ѥw ~^ac*ap͖%0`M?G3neVD`w'3͒zgqZo0 ֶ&w*SB[kؿ:m>jϻ/ :ʞ1i`u+<՚fT:v9/[R\AFż`2 u^=GgrESMb~V%+Mׇ$?ć BH`ɇ;E?OWB 0氉 Fl(xTWoޑT5~Oz'XE >{zh}y}z"덪c{;0¸/X+E<$Z%?}B~a?ϲ~ZgNYw^P=i>_f_a 0&u@$;sNR ~0l 46xcM"F6A5.b3gŞ#50b ߥ(㻈-e" bՇ2Cg"D^7\ƫnX]2Ni-fm0(;AU.8~>]ʭky0atq2O2E&!L{a ۣOR)ʸ8ž;60X'yT~:/_NR>9%˥3BvlKP*HW8o}j@ÌL.dfS շE;Ab)o 6^T%ج_۸H֋ڸtg7ӽݞ;,y0Ⱦ?$G([yY/G~0*#b~]w/_.DȒJ/ox4"i|%Iϥ3xϵgC%ox|2T*6~ >rrT{T= `9iCt/ǁnL6tm?~{!מv˃kuiXU1_~pU}ټYͳkn= q Ό磀a|B]'>if𷮙Ew;.[|3*>wdXFgq݌Ԭ~~ć3ةd-:;xQ=kB0>S!ʻecq=ZW,|E NJYjIHj]֙h)Q_GSj}K柎cloNGv?8BSI?ZuB~i]RSΘV5\?z&1DDl}Զc%U{x~+Iz-Zz+n*c/o]1=?ߦİ~wc._j=0 /YǍ|[>@TeBu{ nPfkQ%`3x2)/ϩ S eؾ|Ϣcg:t]oU%8>+ 'zo̾R}6{ f}׋]C7{D1Hޞ35{g>dK1}oAf_ 6{ Ӝ09nЁK4x [/|?T׳:2ei TmJQo328Ko4> ǰqW>|G㻧)$xyP99xyGz} G?"SAAU%~..yafVXǷ,T)xNJ{|^;A~pwGEΏUΟ]5yۼc~F<]5`۷}k<(Rfe)&A"iHG⩹>^8üK~(S 7>5=o^,nEލ2ɟe79 /goNW;߾=5~P?!]=@I1r?6֌6H"?og^Z:ɮzQv{jō> R*J}lzeR5d{d+`+G*8ooSؽx DsK*?b2 @0? O\*:_AvzI۫H}';?ȏ'Qļ1RחN$\Q^A(u}]Ud~eUļRUQ*JUE貿eU̻Z߶z>qm-u\[~kA_$YBh`0_JD(OúXA{Z~; ql+Ra] KԶR/Umml;(uPU0엺R^*J]^> ~h{^ꆶqly uA #^hɭuGRSH=>aO+  {J$Ňw(C%b+0{J]R{rrGTK]*nbw?]vzݤ>"GROKꛬ] z]嚌7=muh;>R8 o_x#޾N>G\Weٟ~[n>v`'7(I};E_I]NU&I}Ք1 rc# q8 4qoXp(R1' 'g&Pj;WIr8K7-tw=u=.ظWq$m1z.zNԧkWIv,ߟ.P'}e9qޢqx6Xcy>oJnkT[IVbwߡ;=!iA9U\yۼF߬0+qLiށz_/*:ïN?&ӻTzC^O "cVz귁 v?q>RU}^G9 l J}>wkJ+~GRUu>5?tVAz;RomooL1ygיQ_z l:}"?DW`=/8AW=g{~eyyuѺl˽e_5=WA*lVU=bꧢO(u~v~ow z1^z-]\oU}XK~z-uz#DߗP3O&dhL[z~/6Z1(J}ARX#_` n`+J y*e{N{Cځ]'~<&Pc]lr_h4~ 4qqT/{eNv 9oQ)*F2"a.bϱͫ$N|^fѼO mFOu#L<3ݍ#}}m=F{T!wyպ~c?FkmNq^Ovzj=Cq=qݝdTEU7~]oPmcM? Ig')<0öo9uʼ_BqᯰtcK!_a~-C$6=i~o*s*|'DM?Dψ%yRV/C'[ }(pw# :7G~R7Ȧ{>NNl*A4d::6SGZ8̂~CXqc?t?y|?~å?'ruޠY7#E9 U׎7H$uHtEZ~avdwCq8Cq;<|\}$:ާ}$i:]v88Xr}Czdu\ߎqW<Dc?妋T Q'ֺR?qF?AF$i<EqSSuZTx&ұqKN[~?9A;x%׸8x߱78ya;F gFIJ*LW?$6Gv:.2bZ@& _7fl:X.hT<6ancr?[} jnwu^XĻ&Ym[_~Gol[W߃CSuNuPSjrWÅ7EHq amF FCq~->2<1WEqD\׷:SyCLTy=Uq4~!&\'8_iBK=ջ}qG-bo O-۸ۣ8XI[Gk]!nD!}8;s]CC-8qnv٨5&wkx{܂_>my(.Ib^B?vwWCg Qqn~F|wfvd_L`K_t~"*%Gձ'?vW#^|֡7u8ДE/󹼂KÀW>2(gαCGAG$N~m"߀EUK~WGk &n~Cc]cC}djrOHH9' >}b΀O|J ՛0NW~Q;DRϏ":I ,=o5IU.#/EƢ=ݤgA 0߭;U*1}w/[-.?u[\Fg$.Wkk ymq*Nb| 7s 8!ߧQFEĽ~îupq0&\?3xes|/?/o]1C$̼]" m4up^Z/#_xU6`FzE<Ȟ/\;da-Gz4G*Q@/f?6X'Sa$軋) N2 #øjt%=`q`ϠSX72(﫞k1ṻ]]6`<$ĸ;u; q7+腎zFp;P+s-F/_Ta]zPAX4AQ%r1eHע5$h٤x1=Y7Xzo;+{Ko 谋I.w@{ G<8gXXul/jiRna{Cui'ֹƂ.; |*`|=.bMV򨌫] q5>i: }9s࿏~,^>wzDv]_(q<|$mh!ᐯ=rߐww-gww=2y{ݜIundߧ7}I퉭e흭?k{jiAqhniB5yUK7Q9 ?bGN7ť?Qx~[-[Oߵ$oƃ_s]&zxBVprݛw'F3Ʌn(mAUQ>o_f_KA6A nW72?b[ם'_/3H- /2AGoGdoT#;mv#Qh+OGu|d/Is:gT cݞɼ$KvծR;_'t:OUyB<}Үp mt]35C#-F*F~q߲RoXc kAn!y{WNߋ~m㏧wK\ *|2ovW8۷)|2_-q!>ESNeY"oVQ]$F/ݡBAgv3H&.N(Kdۥ_{<`P] @g}̻bi .ypN!L]..-ufA} ʼ2i W@O͹묐KWY+eOEs|e~OES1}d8Ki] }~ܒwyNTy8r1XQr':ߟB}VddE7TxyU}D.yeUxJ/VjS |#:.Ln&~oAgZ;[[_Z&dU2ﰾ$J=#moWe^ejϨY{XOyX_[!F֞O.#?q|=ϘO}ݲ~|r_j{̏ZVUu+'^q8=IwP{snW:~xFj+;3^y+|;81`P3WtU׳Ft򞿔ωnKu?tAL6&[(+>ޖoGsC(+|kd>52GF_#Яyt靃key1wn5[zGuRHTzxחyA۾)^)JR'+z@RKQ|`W φS/8;E(ut6H]R7gc%6J0Eq;R~dΤ[L<盖 h/G,+J2W|Kd0߲Ƿ`'ElUo:o[AMU)J8E#k?q߽m Rf߽y]C vH;F>ҤSw|;dfEC ^N y9R?GQc| No`lqRoGQ씺;;ގ?wJ~:îOUwˇʍʑ//F_ ivѣIF#]QaWRWQG"F}zPDUߩ7=Uz3VL733'nT[_߯Yd)JROkMb&I&nz-޷Itm<|kFQ n:vjF'Ij'ޘ"oO!g;Dz.zUBat@KgRwp!\'uIuRp%?7|AS业W_j1NwZ'了m> b=u:g丮sΟo/] SviO2>:_Lԫ%~í?D7*g壟0A|u&+ ~+^3H2|ɏ_/>jؘ37'~O:t٢ ?W1?}BM˔R?W[?.Ф.6h|t^uöAoh%1?aP_e(|?f~aew~=-@I7O $Xɥ_ah ?c^1O=}h3K6l_/0K7jBfcj?tCcPHMݯy]f, .;s:ѿPAq(?Ÿ?Gdhw COqo4uglB>8osW~Oe[kyŵͿ7qu[OW$ rꏨbߨ |I ~ƼBKv쿤ɾ2iǭ!gcuP UUߵ'+KO~~Oic~j?OIW˿v-7*D0n>'񌤛ަq׿dbM'Y/wkC8+9?KZs۸8. տRWK{?Q6=nO8na97)+q8s\Cb縍Bݯ׏Cq':Nߓ~O"Qq~݈8Tm>? ُ:Qz\l~?/hkXqNy3koc|Y,>yX]|L2?x{!鶿\+Hx/O鷂Ǎ3HmE N4cl?kPtxI[iH4*^}YB]7bmk]Mlw⺮Eu7?G u?>{ |9|?;>mp]qg]4qZcܥ8Gz%X!ĬgNɟ[n'd m<>ϟq~w~I4ag%_:@1^>vsۗŻszZ1S|]u;*x{q kauܯ{ҶcLdĶ8eO{>|eX,}`M|\2_5>ip|`8ԓq0Bޛu9t`s[]s>q΂itLJ7c c{gg: 8|!;ǀNAsO Z6& Bg8n%kUIUui1lóZep-# N2tSZ]\otc|ns=8Sv9+|ꢶOdϷ\tFI4GM'Rċ"Fh~tc(s =7EiN2H+Ά /WU5G / ZA^/Paꛪ^R}K9Ti|ס:OF_)L-R<_G5=)^$#lO? -M6;cnqy_%[dG~F ` ԩ^VVUKG&O馳zqcpq,\G:y[?}͢/6a&,wqq^Tk K3slNYH.Qocx/5,^ QQUC^?#||g4o8W} >?P痡GdӽdX_5%r\yV]V6q|+S3nﭗ Pxs Bj\_F~Lqs7Uiy~O\ůi£7@яy^6nU*w@>}oJ{=z;-hOΓ'ic~H3=<\%Ѧ]Vķ_JV~~(do';~!.,>`7R)/^#Zs>ɖ[72w]DŌ[?b5p0/5%ov|$pIrj/8 yU{eu6ߧQ`bX{Z]6]c08J?cRLdm_Z1;?!;twr:fA>b2`%h~|-"61}0/xͽh__tڀ1pzZ0kF`ZkdwrWmapQ$=hMr,-ߓ }4F@e6x`sQl:^E~|o`g'r|1{0{g]gF\!wMozWaǃ~߰/%O&a3)j8#'y }<`CnE|ww qߏJgy4=*oOW9æґW[b_\ixQ'F2Xjm*u$z~qCSS'}&ӳ;=ʬ9_Xףl/.SRAn )I&wΉ,?$6yX_1l5\OD?]ogt۷N3v:÷yiǞk2+w93gsΰ xaةrω흪LSQ|[_ H`)7[c/(\ !-SOq5C{a^"k,s=WW}{Bgl`0NP5kB|[ J8?I;n#9o}j?7vYtAKԿywm!4&> 6.:!lo &i &igv.,XFABq^㏽ 6.b18t}4~Mt/o.!&a0nff/1g2GX3`w{2NRs&[Fi_vHW%+M]j^2k}mjhB)_ϻ-m5kui#z\b_ -n/1(S%;SG~fu/Ѭ v 5j|5eoEhe^pb [QVv b *UvҮT;e2y5X˼I Vv Ei"=cRmXIeAbE#UAڣ+HmDiv;,`K{Kyio)hRy%W^!ⵖ0( ? D{{r]XV+uzE>_6ŽѠQF_Re|X0,#nJuwE^Z:z)^J0R,s#̟Juw7{w{)r]].\$%:c H,D녊/XLfu>qb]zcP9V# :E\+*%ur=M@,*"%UE:\Ru(fa(ב:o% H>rIQھ-׏ޖCo`!(׃ B_:gM<߹.p2wM J?jEo]@_<__(J;? wo~O?x|n{nW:@^WH?Wv<6_!|bSnɸj%LAs޸l"n4ẁq3װ1=Wp~6DojHi/O2#&C.}~[2ƏOq#by'NeUflO. |%wm\JOq{#N1 Pa3izD~)]˭ ~~Z;ϗ?'WqunNtW14٦Rby$s<^^_}w iKb_S5p|!WA6O&o{/mzy.by8A\r(~7|~S/l ]\F9N*kq+;W4O F ԗea;Ȏ?48XG!u;zsz )'(*Oтm`5vfvҢ0m=C=i{͙Оt]p|!=fJP(yHYRG3ړ-3yl/fۙh岇=3gY.4G-B;r]U, r.=2o?Zp\w?}񻘻hwZg{y8O'T@{7̛m)?_=2BOϚX^/xd1PZ;r@?ZV};mtBVD~L߄%k,5h ۥom GB\ֵv9w>9!B+GC/XW|!"ϨquVBOǹm>uo_O(W})z`󚩖k(75Ws琍h]̓ac tK启vqrPO'zḲNd3w8.B-+pa{ 4~ ڭ}.I#B=-o:Gt} :濓Sv1QiћwaޘCwBd?uӾnP_ƢP_бSg̒\g%p^אq>C@;*hkOcqA>Km1wgǁzX ΋6JHp|.s7o@"u<7͠kiДIc=m} }.1D+lqƺuvB|nuZdDPnNlAF7\#Ɉo#>[ tXM88¾qyO g,[:\VW<1wЇD BqÄƥz߂3y-qBۊ`>߅1L`޾pQ/Oͦs1=PS_fu&N<~I.=˻8>Ʃ%Wu?qgq'{'xd8ΤͧNINڙu 7yf adOA)-姌y"\}CYЩڊ uPϴp`؞^?ga\?>LPt60Nی~Fm񾚑iuqg.쟝!p=lwS9 ,@Roz+>Ws.<olϙv:5 yx%ΝHg.|ps. }n\7v#Dz*еJPnz߷@}vv78=zayA2qk 5Q Y"A%5jCԹ"\+#.ݕ TBLk5qG(*|jߐjFƟ광CԷEUkwrkB׭-7_ϾF/qڱD?,Jpuocqqvl7{|ǝ4~cp=rOPnCǥn87ݾ-] 6>  76=r65؜|WѨO4:hKȿiZX8挋Ӧ>zN\u@`~{Y*ty`cep}|cܕ1߽zeq^72'yBA뀙߰\#qyP/3*zߒUklg,8v;lo|7Ja3lonmUȷy鬸θr [I.|oɽa^vHRg\RWk?m;-6ttLy-Jֿ/ AaV#@Իl :66loKl{V+O~٬oP;pu=8It>qO޸}YP/Fn,$ܕfyXyg\u%ᐨPv{ntFpǿW"NW'&vWp ?_6*/Aki yk= ^iʼFܠpnAV';ρ7YNz`NYߵ G]?9k.ou=hu}jz+! @n ]7_ Y;ÈP/q3m刷af/Qoys)~oet8skon:"W=UU:38V#cIQhTkl(0C _c59wcHo%ϞXɎV}?C{>yI ح얛Pψ5z"ϏmĔ tʷ2^>,urC=zW:Ǡ^7zvg,|vz3.e H{I>.iQáhgQcPx-vWoTO7~l\?N<{)mj* O:8g';۶I7ήm-Ad&ϵ׀mC}nG? @6g mgŬ 3˄ax ~l/chTh@8yC#{޺q6&Zb{ lDXT.t78Fr#zRoJn( mjsv\6gS+זb:]E|o|8\GC baa`xlrpˮsvuH>~(#Cvk1ݞ:f|Q[GŠ;al:^HfrAZ$; j0i 2p*tXd'Jυ]>s?ε^d{=xMOvzh '&A>Mde @n)"6p>Lܼs 1{|=upW:O>0OPǴ%tܞ^̇6oqS~d[^]SՅvMڑu6+0M)`/ E{<7K״vRG KdPL#Ҳ+ahKD8^ م ] HѠhgiWdj vLȗ !=Uk=}ܥE3P>]HaZn"ngkyk KG(# qӝ-_T6@8~Uz;3*K{?:=ȟ^#y5 Oӷvא? `lX#'wPЁ㦉t~R؟f%ܦMү1g巟]a A?Hj]6l_G7.Khv,?<OsB}Uwc%q5V>B(Wݑ/?? k4?W%8fknw3?l!^ŬupSM |٠sP/'_u\P;YP5Ռ/أ =.Y5SǘoAџވ dѠ]oɞx,CoJY&w "EɞxF? ݖء0<hh "-ryam@?9 06k[wӅz?0= SX>&Z5K*- u}F{ sAC%+Ÿ^2XcPK;AП4\1#ZP1W\J ~߲_ 2׷5q27B0}ud(#b0nG ݑ?q-ځKU00TĖ\#շ+|'C7"WD}t fg-@W] Ζ#-37u߹w+&K /z$X݅dp e)$}gmG8~/r s> 5m5zH8>ayk(ާ]7>P>s} %̟a xyׄi wj׍\@?_'C|F̩C.Ww cG$Wa<?A -8MϞooy-4Y !޷ LHO[ePOZKҺYi]P> ERv?{Sa Sq6Ns+<{Hבk z@,3kZlW){/zȗs~M7-<37#9UZ)Ô ^Lo~Ҿ^oFV}'G7MXybZ6~z+S\Nt{Av|?o>'nYOc4S=,4ɯl+|r)<W SLΘ/GǠ>#MbNض^[6 h+X.|CkPZ$/"^/ޱ_CACdhO#sʿ˿^1wq=[:2Ǎѕrp41?J\o~l'#1l'9Zd(^v]yKҟ@P.It>Y++.IEkc-\1]⼚vxQeWzu3SN"uNߘЉЮqp>1.IŘEvdlS@?q{` ~j9OFpC`Aa3Q=: _WuGM`.?a@;Sxd9ʜkg?C;TLm'%ǍSS鑳d_)( #Z*6?5?|F/2Na㑰2CcHK$U/KE%7E>R.\P*a<.O'g|p=B;39 u֦!ggb7bƕ?$)Ǖ]jͱ(tƏ9ѭ-g$Ugh̵W^ƣ%^eTƟ} X 'S͐?̐[u_ە&bB`4!8@Ko 9{KVxix{ayav_W~}=epndo*F?ʮ/> +w e( N9!&B;2|txUO㼌*iK]ڽ3wEq+DP_AoOi咶U!9?u~w$]a!^1~c8䏍F|Ʈ`Ǫ}ظ>iە)~YU~W O'aPM2 /ᘠ݉㟬|ˢ\gv2K@r\ ړ5r9l';) 8^ѫ݄m+g~ 'چ$S~n:ӣ[7.i{xƒo}*$ D^"I@$c%i}1굒@syYܪ қ» U%s-ɶ}1@ҟn#@GDːI#eŠ/v$}ǣ`o%ɞNþuyԫ?lQ«3JH_r_׾135֋ |&#?)[#B'E؎xI/=tޥߠ\Rt#}[a:~ڋ4ڋ^KFqksy$_SO/ ϲ*٢g(o *`$ ǜ':I=)3 }q*؞98ҴX5??q͆B;^52W&z- 玉!W|SeCρ%V;̿dW2 E2۱/!K@{5I&X.U3Ÿx6SaygqD|_r˳%ʶ6C2cp<+xɓ8KprشQ\4eMNiٽI 4lk:Kab~qYnJyŇ@7vu/\m&6yԊi܅;aձ~\+$=>zZx oYȓL Kap8^#DZl^=x7*qڭpM+=^s##nyϿlj<8qK^ gvI!?Dq [#T\8on㴙r8|߱\oݒ!+ 36zF?3IS#CQ008țȝ?º7@V-CW̏׶(L}P(OpLIz#QDBw"e(L8<џ ޏ3[pm)x;FN{Du%n7ۻb W0_\/x*  EL8/շFD?^Kȸ nx-hkڽ- Uaa0G0CA1Z?L[j!\''0uq~V {^ +kMqrWK;'<I)^Й +=~YVp+89/GH=1AOas2_kUk]O0Wi> :da?g~1=8N'Iqt$)dZ?2}ʍPX/&~f?3(܉yqG nʗd =ԡ\qC|S!΋n(q*rsAS$΋,mGK6R>փq`0ұpս*|E뾾9J25 Zq{%M_>ޢ(.(>ԩB ~0Ϣ7 Bb$ѿ]cd[aB]Xf?Ro:MB>nfrٞH8Wt-g\~= q8b9v|eWmšO/B;<ݸv8-FGGF}]12*ix.Bq)1RI~/Oqg  ֮L[3!;]v\TB[#C(n1m1hG)I~2%z8. A{>`|BRH4>iYE%Ÿ-n/Dmᅯ-{O6%Oo8x.S lx-StJ-? m{v Eb\dO@ "oqa>)9RG̷ߒOIbV%;ޒ_P3†8?Vt8/|Cqc$/cQ8̐P1?vܳ*9MkMa&-[KV"Xo6.yz2 x4R͹McloWCESm%_RuɉK~Sj&yEqlWA?xuelUv/<08W[BkVqn ߩ$ŵ1^U9W%R_߅L\~ÿZouF@p\M G&]mŦc'6ʄⅨ8oU:R)~z1(K&h3c<^^&?3cћwP3c~gp(dwVҚjv|NR^3=k?0y{dṙHԃMbrH>A}%Չ9W@' <ٔ"5$|Ypx\9kb>cO(ސd_O;6~jW8uGOv P)nd<|i1uK>Sc |fhʼGWJfw{#x@M;yᳫ[! !vz !W2[|!܏ *)^q?b<WģJnj 0NC!C?=Sų2e(:N~GVw+kfOwQ'^.ƹvߝ_` LG݆Sa׿w%Bnî=͔Ƕˣ?jǕ_{!_:!}qq n~ípv'>omqomfjk(K߃vFv6Nq{j{6|DHM~%kퟂ۵#9V^exf~yȏA5x./$gִƒp0?3酁D-/p G%p||ts]΍ ȀoDrexK?@_Q8vs)I7 %ԁC/R;|gq. :W?op6, 6"C0a8Orķ 6pfbXݾ@ q(<#Yɮp?7.PwYӖ8{Iԕa}`l|ts,^p9Z)/|~>ίmʑ.v*y9^W;oh_y|-K5;[k}]~hwR~/&zA.RD3^LNt}ĉ:{L_"\EOx :_gsP 9##>GO>o#z%I&{We ,w01J[N8|U8C?7}ĹUn=QoT_OŮ ÅZr.{ɿ7UhUW =$CMEv*jVE/PN`(w#BsJCgmkz~~݌{DI'l ySϟk,棸,&@ݹezZH85\o<kaRwkْI^H~Lv(3A!>Z%suWQPOn_g_:Kss _3ؿU0z/_Efd^x!^9/πO{| 5%?~Ūw']pqv/N? ֿٟpײx/p֝͜ C:_~FPy+lW+܏qܷ@sosE!93Y~dz n"q)"y,l:CZ3bhϙk&zΔXӗ<|A}1N7iQZk(n8UcVeju:0v|~Nb6$ fv=dq{hA1܏ڬ^Q-ƯcFQc3 ӷ| nq~wX-]G$8֣ׯ-Gv/҂ӶFe&n"H26c>5xr=k=%?*yތ] )>qh294"l,Ͷ.F'D"Za%Jw_5p"Vٰ3ݙ6Sb=_E;{ɾq'dGfwoJ~ًp{ڹ4ˌ㿍[{ɾs^AN{Ȟ؃,q{݆z􍝾 [L,]5ό=dwfɱb5s?O<5?ȇv7ť65Ȉd?f󶸄n#3ѯNj]dOd9|<3KnnW3G: IsG̏I=yp繰+\׋_WӏpĤ1xy:M??kvv_. ~&{<3drڳC^]&;]EvƮ;|uVe{g&$y ɮN1qIvuf8ڻ팝ӳL뱓l1v./,Q;+iVw3ӥOIvx;Npgv ח8⤛Y bq t]9wb|JBu'OPc;^ގToރpGuEюڷxO={]1 l#=3:oܩk ׍}:fB}V3sߊӡdglEyp^[pHm!;c [n`TJЎ-d/gfFg3˙mEA]f36Wyۛꅱj 7} Sy?N,n"63q~ (A}NLdlD4vy<.lrGG lGo(D?GX٭>MfDk֗#BV$ٕ>wU| {`,ԕC3o~ס: 3a\EgdjǾąkOxʭ%{/cEQDHv5doe!Srpk^defqd%I [7eR{ũ0jhR8uw)Dt%+SE_JK|PJ1VLR+Яn}8$vꌇ}$.C{cqǘtôОe6o !"CfedcRk$;Icqy!ٯK35c ١%dbf:^xfI\%dwb,Iz%K/!;YL&ӣʬWXLSqL8QϊdgbfA8N[Lv'f XDžOB#{c1sw $R$EpC}Ƣ7,-.޷V3ȏEdbBKL >y[wv!٧H}$\Hv*oQ'U$٣Hbg٥ ɻb~٥H=ƟsSc?QFEg]$٥U$ CZ|٩o٫VL>r^ŘzG~휗#ɀ4}hb8ܗs~ꕆrs߇]ܚ1v%;c.ٵH]Wvʹ_ozp>͢loN<u85G~`91\'"|KAPf"x8 f2ٽ~sp߬[z s)a8g]!odv.kA̎s_D;w։Sqr[;d$_d+̎ei1UK g2G 9Lpz3 fo"JfI2u 3N2TJf?g0֮oGLdv#&qLgv"3,]޺c"Ә dvqaǝ:~3(S}8p?lR< Kg>STc'0 `x-qXPOOҵ?q8'3_oŸS,)whY)GX=~vڽ9&>~951={DfO1-qG?DfW9 A]u݆ Z^ʁdv"&ލq g1Ҹv/mQosk^k8~EP+/=Vc}0~(7tkq|l;nL"Lg~]'=+"?{?46\2]\GDbK~ŐLxo$O>sDfW|?ϷEԧ}d:7@A.~o8e6ߊ?lp%Bf'GxØ]ް'`\aOpZ(˜ 1͙ؽM4*hT_K>_8h5 x_./D7QkDh$7aof&P PW7o"] f6ɍx? bvl&N-vݚ +kf2$ 35s|25Af&Htd=PojLt> { o`oc=ݪ9&W˒΅,uJ\p<f7q@p0;Mٿ ~n@ыq6Ҟ 8> 6v)Gɯ7q=?NPObCcxq?"g:t~w($DPh18AS>Np_ǫyp?d繖b;N Lnb'юOQUcZ8w^ Chwo̎OgDy;jҤ8. ʗ]GT ODNf&ALa~c,be/%R^goWb2/dUSP?$uhMZvvj 1_8Q0/CzY(׋{~:^L/8vs|q̮в @_F9h73yƽ3N]z`y=FTо̎P(ex,_zי3|w3 A'r݇^ McN$wcvIPo7 庍L1|+.`qDU2{WS삺t+mf&xGp.hln߶y:]TX_!K.&?6%󸝙]g'S7qR㥨4^pc"HαЮ^*d:8okFQR?#G;8mp~ɮXu}D?4P_{ jg9G5./msٙv<\7E9.AMggִkLۖn~MtvS0nv( ?]!ũ9k)9Rypwn/D<1{xQo"َENpIevgA]C;90WӨyκS㺽Mo6|dN| p۶ˆaJueMRXkຶ\ʃẴ چc0fTNuN amZNLPo%" O $c )mfwцMmR{f&9o,qo+!V8`BףRI.VhobpV'8nV^po.Ik|iOJ!&VD=^-%/Kf?"xE|ðfa-`.\nYZEݡ -( &9mi~-0"SiבZ0;qb ",סzo^>Կ5v4wuhЮ?>if_[[̣0l2 _sf#Ht߮b:557x 4|ujsBn5N3[D}]9npETzv57z;^N_xFsfc"53fOG ū411̅;]f6 3o"yI8NSf/djb~cl4 WVqvzn_39:?Φ̮M.tfdbj0=|Mݓ wj2\ԓ5u*BĢz,3oLQxgǹKuV/u`z8*`vgw,oheBf&8a*z[voM|:2}Qk~A/Q9drgH~NW(фُ bY~{u)izC]߳v4~1B;TN]7uv3DoV/Σ?kS?E뿙?_xݾ'Ne5E uVSO5 q0uE^_SKgi_g~Hocz?D|?)p{þF}LJϼW|l,8f:~=leMSsĮ9Du,;a=nNj?Ǚu=YOAi7D<J |^??^ov\OeE>3*Pĥʁ[,yR{?c.V~x=m1a42d>.h8ӝ{b~K׸-#<QG>v|Jm}u+.X%ʎqݪ5o>[?;-b>pjBy*>UT^˭p[蟯F#wZyp]!;W->Ԗf؎?̣ͪrj\bGֹ,7:| h\)vZ6 +]8c/JG查#J~h.;`WC=1ι!z3|/s_WnFw.>l;Ԧ 3W#nz9nTu[5Eo~~u:fP*3b}@J<ŭ_sr_g Of>_džg>#b< mfKb7Vޢ<ɟ[k }>_~9r y\}VBeV9!,/Ecgd~L#ޏʿs#F]xz^>{!ũTPO јEVqMp}ѣi?)<>H7ce87va>ǫ|ǿ8__Cϯ_OwJ%b^Ygq~"t!<_1O2?=x] r Oo@ލ tAݥ0wth߀i@_(WE|~U\xq.Oq܍fdހq̟L'OLv!ǩ#h:Y>Χޫ^z׻P{c"‰4gGϩ[<&<<.G#26vmp;&ƛ[j[}K]1 i:*Y>8QwP = /OM`ϓ_Gq]O~>~߰t?ȟOr>;"C`KŸֿ>l4kq|7wE' o0诟y_sϋyFv=g}XS^y>O3!R6ļ /yN0l<#7a8 ]N9/isB1CM>Q}s麸ż֒%x|O#P/Koh|^Moks+썍v~7^ާ>K.L{O>s͟wk_o{kfk C'?;nGgz:!'~go'Ӽ?zÏ4"F_e>a~+ǟ~ui}ߗNӴUHgຊC;OӼ>gEul_7aGͻ,민2EBqq_ {Cܿcԍp]|bԏ4+b4ϊ- }W~~h<]o!W;v݊W~ p{Cu~S vnv`qM(bمtP}ڛ^ow'S;u1Ο^cv-,_w%Y~F;[LDu5mݬ +ѥhe5 un ;"_zעw(vI#G?]G S]?Zǎ&;'_vNͫDW][oO$ktO OK)k?Y_?'gZ+z.ПhZϣ>mJWqvGzxoM>|~M{D[^gI=]/}WL~Ƨ\g!Ɵ|ߗރST_6}}Wv^DNӷk.~-~>?]яc;r'+}}'R|ϦY~&'9ўzGrUo0?q]^_}#||[]W?=.1w}|])-^CoJ[Ϋ^WoDǩںş֟Ebr|=_._댾':/}?}66gϊ~s׽q8}=_?::<,-W%,y>4ov_|wG{nB=&ϐWqׯ?&ݝ܇p_~.۵p]68?EHm8]gu=:$x;.Haql>Y x\bkܟ P d7{^s)\ tbY<.7Qoiz(M%ʶ+q\Q76\q ;k\51o5Q)X.mWA31Nu`ƪ800 %rt:W9"xVUgqx[8W⬊uNȥpSOx.z Bg~O/ifp~)S//;-(~~^h_u9,喬U/+~] ~_,g{TSjHpUFHGr0qq+}ۙQsƶ9 ꩄrHlW<خjȽ5Q: ~n<َ?+tixڍY2 ֶITخaVװ]p]-qVb,sO'& kr}D9h_9gsz!OWM0ͻ/% ;hgʵ϶s/< ˼V4sŞ7A\s:!N1lOg\}RŞa\%wm\Q{R`&\ w߇7T_wuFB=]/]ōQ?/;Ͽ.t\é__ǯNB  r_4W1 | j,^OOw( ~?*U&N_7쯑dJܒ1.U!+e_mO|wRM E}㦣~q<Vo7_~ ~t?G?V7F{[?7,/M~x݇dd \FH>1LJ|9tcq.)#2X|?glYlj|xYXZAo7 Y6U֩x,oRŞuX<`A/3{1Df'4;yQ g.u,vNО,>`lScP]˄rP}ga,ި / T] CۊysfdE3nKxYPAPzwqfB?TN p2- x顛S!ۙ~GW.jAnz|N> Tv\YZcyNb?緼~ŋW;qR8oJ?Gi􋕞uM,jtvFd]2*cw-6[K'οkѣ0éwi". ڑ&fqJSWP?62)kB#jL /:M⃦dAY|Д0NrbuG2%8tqNm! Gšvvs퐯%ŢPzy3{ +C/Iey_uQwCjN~J.yEK~fYQ+2nھ<=GbfBg$6=ؾ`תq:Ed`Bv d I f}߯dȏ$SO+ڥW?|}|\=ɨ[U8vv v6v2Dvؽp/$ǭϜ q |KG~+ ??og0/|qqp}.8>AOfu+G?Lח'z> $3%Iw)IKۇ?Z_Kߓ>R>o{/J~QNw2`}:F[H!kC{HABW&+J}A^}SRtQIvx7,*Nvd#IDI籽 ۋ#^]$/>'$"u$?5|vaIwlOIg{ZnH nd֘Y ٞϮ|KU=!];]q+$ȢоSPCɹ˜hYmU>~/}m+~#%hWYR)4Pj\ 3ʑʁ<.GݡE!yq($c@;<-]$$H>w3pk۞"0}Ʒ $g0? H(I:G <wt~?-waِ|s@{0JV*џE]!$k?ׂ n UPhsvH9jDQPm\r"{۵R6v(-x6|Y+[lVX蛘6]'BH'x^HQ OI/͟ 7HgZ.~z/'[!$IgA?^pJ"^^:^j:1uAZ믷}U,(u$}:+mIO)x uvKG_ f~vs&HiFH _zNvQq?lWQs\.]! 긠WH%x[($=t_pWڮ~Mt{뢥_%ݜ$޾;$~?'Oz[}$/_}B^w<9%-VHiI-&m7IGmyDV!_{yc…mfzHm.6.^^.K!^pڭKS3xzy!CnmѮ3]_~M积_1wMǶ"R d x'F= Q_T3=v$Hծ$YFowt*z?Ix8~v)2o ǰ}T|-=װ݋C: $كHFޟKdO&`S?>Ěd"I-{۞QHv7Ad/#eip^AdWc ";[FrV"ϰkAke~;}Qy>>>~`㉇#p)q>n>=ڸH7_.}\xmC8Gwz6q$_q/_6O6U1=WsȟOf}0nDy~E{o7W)ߗ+slx?6kfѿ?I~탣w@P>kEvZ)QJo7Ϡ_?x/~O~g^utB4{w~~~o/ۏX"A&؞@S'e8ɿ\)Xף:s`*rO):s+y^v"eQBc뀂|Xo {f{MJߠ}%| U($'7HI&HIm{$?QlUuXN/ 7c{O~$]ׅG3ug}=Z_׳ɯ$?} Q?G>$I $uFT/@<h:?_:Au$!#^$XY o)<.y!tJ_wAs&;y>a>d{~, [kg&>Om~;{ Ɲ(z %k{Q{oFP}߿}ߵI뒺nEA~3mȏ%Ք:]~1OD|?ϧ~>XqE;4]A.z,V/M~Ѯޭ~3}ߨ9_-=tLw0I~z'?A`wEC~d?+S{,4S,}BoH~ƟB9]M!N7/Ƈ*a4ݐITNN/%?SĨNOi_Oy^|Nw[ncdzvZ衿~ϩ=y||^^߿_ү3_GU~~nn%Egub[FËV=q.Vȹi,ܗ#Wwytr]?_ w{p̐_ +=z&kݒ:ej΢93?=0'~޿;os{Y>9q>||^hc7lZgr;GmVG߾vbUY/m)u>}B_9z _끜l]I3ฤ}-[2_?=nd= L. B{7'?C?WwY?ܿ?*'3 &Z9 oV/ 8aX0,^3'%ha5QVa@ܯ(3 a;Z6_ 5&n`QݒCmiv)esXUU;%u1R/ڃ`;cvq!>|Mw*z7h?:?U2f` &sXec=sIW@o7wb<.NVU ucyQAdlSj8 K0}s?`[6vƌ-uuۼZv//D~C2^kֻ6X!1^j˫\#[6Ho?S-~_c=^)ƥvQ.'@}I*t >$nSRl>s?(qH&BSak^;ܿ~)~Q&.$Rz2B=~/+cѮ؉l[6GP̈́/~e^ɮpINʭ3rodxKfrI㮌4_lvƴHsܿw+TB>Oos۔LcQ8zKzƴ#Z%T:![2-X<O0uJ"A;0~Tl>u%>ƯƩ~(%>vyJN7 i\ -pB7:p}1Qr&4ިխff~"qZxDžsM]GYqat~9Y$G'}g+j74z=qqx9<`SZYIQqQa<nWrZ_mqtVq'۾tEEʣCϲZ%sX+8Nz(qjs f(}Lv`N!Q ٩1 y+*< ?;ȭP 0 x.)̍;BY8^>ql<7N- i|s/ E|8HCo\Y?SOTKӺ'0xSĝqMŻo[=!Q4ʢ%6JUP1w5&X~ gyͭP}Ī83h_Zuxo~_G.>οLW]qCz_zUeqsyd='3A#䯼~kM/C4!$I'lz"q0N6$_K>D#ەYҝHcҩH7c %Hq].F~8I?#ɿ#Bz?XΎG?kgO3ww_~ y*'wo$]$,SlIgG;-2n˨@vlhK$0Iy9_I'Ivjю͡Tg= MR˯.ѨHvFE{*?~C!EKK'zJdw-IvْZ^"kcH/QJhGQHH^A)LjʤYJd/E~˳v#F_׏HjT"}_/oFxBJ? ` f|*B *@xbI, o`U!qq,%gA}O_wDt5o$<: Qt6,״ᄏ$]QF-ҳ)n~֨xH'/AǓ3P*ΫA!]$I6z ˨<)V~ހq< >S|1>i%)Q1>KVXtF%_>Qգ߀tO#]:ɯ3W)tҒxl&գxtaP&H$tYtxu/F=+ĺΨԤ PO;Kzzw{{J_-I}G:_˨M~$y;um@n'=$.ZwLPcB30jsǫE5$Zd`D;2Iv`&Q3jQ*dga IN!q=}C{B%XS*F5%Ijd"p?RĪ.Q`UߕU!!2Z;l9B~$GV͵.+؆BK~=~ 1^*:a$1ʣ B6.4>n$xxR_ {19fu1i*Ny.AuPOE9?.Su8GFW:VgrtV/Z?묾c-[|N~LbَXb%:i틍d,Xz:= (B "h' o\\O |_ X>]W!t^l24/V|&}Ic\;\"t,GR׻z&3~51/H0}uAMߦS7ES#I|:,EaC CK2z.]/~YOvptq~̸vKn5L:nu+:BgŸsUwHsپP.ϙ,Pg-1ǬhύFkN\hGR-ufҶw(, Q#zSKX8o]>&=n6췻2%FJ= u1CZjY?gn)i/gݰ~t&cB^.Wؕm]Mp7g4ҹu;s]|lSP]˄gjwN.݀n`W@G0Z AwxŮpꢪ= ;1_sAzoxb?߅\r=1ڣ:%Mп_Qa}eLn4hTكHFngNR/z ft;=xZ}n#8+ |\B(t.);hoWx 73G0GFȣif(ۡ8_8r;*fW%8u~b;t>>y'߻.V ] y>V.O^Q\y ų+ԮvU, u4n Y;DٷO?y=t=]އก0zdW=\r.OؿU'%^=ϢЧ*Ïnק/|7ϻ/_^?1SSNnG*It})kyg.:=/v=pgyp/OWv̌!_=.!;0B+ɝOp+ر\O~pvv}7v޺w'a fJ'='(܊]93Mz@}IP' $[vj܎s"byFPOgiO8[F>x̙ᗽ{+vN_>+7̵R\pDʡ`-7sK @0P<_Fy /ݢSHT%_8Wԡp͗1Ћ6[w(ܡ&IPx}<1sY&B=?jR+LpKTp8wI-L/_ 'Cjxzɿ?ON^Q A;QB͟oD!~It% G%'nZ[*=qH)~:QXԦ n% ˖{+FzHesx{p?1_htn~ѯ򙎇~|FWp-\';ɉ8N,@4ߵFz<2/v+X!wDZ_Gs/n~}ax:ox!`؃_{sqX\S_k7. #J8.`q1DG_qZDFSwunɛ8Bl7thnQH~y$Iw$'>$<~, 80 n.veW9`uOdzBH6ݼ#EPuHƛ%yu I_ خտ|5X5?wt.WI",aQlUdp``~$I:+$$ցlWHczt,{Zq'cE^CMleo󽜸SAKzCK؏($alkiEB.vt4IG#I:Ik/sIFQ{5H&&NFVd2x~H#ټ{Ю $ [{u;t:?ު;`0Ol먓b{nGt?I'?ځq^V ;CI\)[h8Vdvۏ|7g_`]La96pN"i(ImbAI#ٶF.a~)I~$m3g_RA[|N.vد?E~,%I|5?E IN>v*e ݒ'ɿ$$S~مT2H{ 3j;A~Gm'& SAxE+$$Ҫ~V7UtJWr JUrtLSzHQHz%`^vtHG>J_YQ3k;J%ttބ|%<"{%GV]fbd)#:fh7 ^M3aoNTM/ˇ3*[ 1U!$32ֺP돔T!+=m"C~-_B ,xY8mI%Im_$3$`]qF!ϗ<2]!J$I'"I~%I'"t"'m?D$Q'P?g'i~ҏ~ #U!KlH_bGI?Gp/L$IW"II+܃.+D݄U! zHH+{Ho`ۃ: t67܇`㣂osӺ$ܹ3qwN@t #mjAAuxɺr*yhnZB{8xvmKmWI ɝ?w)~f8L';Iou vxIZ~Z痤u~IZ$?oA*kaL'=m;$I`NzvHt/I:m/:ȷtmK lH I`.%Q`El[i_𒉪Nnn/I ^m}IZ fZmu~f!IʹnLXmH;?\ʹ^.%i_сM'Yɻr0mh\7lԷ%i\rd- ܣс 8VNk?aGB9Dp=+ފ) pz9M̶̈ :ZזgVKfz$b<«(lӰ2~˭֫%t^v|~ۇvȘo1mkJzvIZwz$mkh]%)0xݶFBԷ(uyjZxIG`5yI_|ȶInVQ#*$پb7e}qcxMUɶ )m%{+1U!Ń$}d.?c8~76q=BHtJt KxX=n|g8?3<`݂m9㒤x_3apWH.xaOL ̶’ q)m)& R&IҀlK)>$*$)08ޛm)\B ICwbQcG($$Z{$S|;bwg[L:8_S/~BsE㐤x>lQ^HzI[h[ثЎ >[!ACt'$6 {q:#݆m.3$=x֭.tsNbNMqZ&t綅p??:/8]Kz`>6}QO|p*+XbOq:%Yݭ0}qZ 0%Yo~B~S~tK?j~?Iq?m Hפ\?FRQI7I需:'w~{n~!$ődϕ 颀Ow(+SKf3]"2lӚYJf1֬NJfo}L%w\끐&s |G!yd:OdWt^3kfa9ދs{ ,`, 9,BOz{<ӓqN+tdOEޣl:ӕMgz2A'LhD琜dLW6ʦ1= ӓ 61t<G;>Sί Nӯ/3o n//o}d?Ys y?Hמw}#?> i{=]ԏe_׃cJ{¨}{U?t=&!9u1NQrŝ2, y*΃C2`qA%p?MMl.9Aڦ<87#)d:hAd:hACc>tЂ|t^^~|}گfA>__~ Eys*S><40=_q|M&~a2_X&3{h`D`|F8^vNqs>'&2{Afo n$'Ld qKIѮ翀dvݜha{0CJ+{o^hSަoš]v2n#?ĒH41 c>Gllk"k~wd#\}Ψ?6&0;K vp)dv9hcQHql(nm}qծN3+dv;'8G~%1g62{qgdv>Yp,ĸZ^T~|.Ny1O~ i~35ytEٍevwOoOPO!~^=>[ܯd9dM>B}!;P{ĿS⻥ϴ數ow5?֯; izxGo<_?!omD_pCxf/{}h!|z|;Z Wî|Dwg?GqX~?78gS8~6?bľ_vGN_}_D./A:~ <['w}ؼ5_g!>ߟ]_Ww/Y?0͗zO'?8??cP'/-~ZA-~S|hzվ'T_\y==z߭/zy~;?q0n۬zX"Vv^>wc[dB?^w[PbzKHf~U;w7v3}yΟ#\ϛx0r25sѺ~ZSN4u{:o]5/sCz`RtRJ?{N_`vܮEU}??~O8_N\9~vx_J\{c>= ?o~u"`t;-nt;/ngZ9 vdܾۛq{kקW?t9]nwv|n' @}*Ջ"_>}>?;ΐyjCv*cRH>Bn`) ;\nv/t/3s`a'scn,vC?Q&{fnuhn75jnw-찹]6Svۗt~\/vwۧ`^_5O u1?L3A$UXNN\OPOLv}~f\^nԯcAbO8pBP!ch3)z\/v^Xi!np?AB׃q ?qHjALC_gD?'~KݿI {\/ؼZOkK~U©{?2OF~ot8ݿCvl[)pUm:f0Λ {_GI2?AoO~_"H_dwG'qJү_U~B ?Q(WgK_Զo_qzb25ܝ{Ƿ'~~wyW۲z'( _̓gnG(~4udRHA_Kǒ<&{E_d9vvsg'T#׍_G?)={{HZxt יM~<?S?Aq{䷽|sČb_c?9)=pZD/~1۱rwYc6~gY E3Ain̿79яCךfu_6r  y}oU5??9(͙sߵ+ _ǝw} j?z^k٨\> ??'o^?S`ζa3Lx5WM_vΊ8m,nMNjqx\9-ޜQ״Csy6]R2'KNqx>=_ 1.OI=~) ; xzg4R&2>/,-720N(iqEGבSD28]+mϒǹq/=+fjj_[fٿ{򸟜Oq)qBYз̎DY Iz|SAqs}"^*w z|V=~+2;A-/VđqexzPF& 񡊸Mz=IuyFdINtpQ]wmpFINtlZ~xvЯO} '`X!}C:dy0?(q HBP?bxָ|F$Ig =0X_e4=W&Z=`@:+I[n-QH@. 4BFT+"I:A31n QׅˈJzBhňFqQh7]a xP0:φ.:A=IyI 2bK^`t^1I%Yu?&ǡޘ2bKJ<%c ȈE$)䘺iytah3ˑ. rt`R2ؤDݗ[!$Q喌C/#鿌8DS!齀z/#$I%7Q|t8%>s5t^fK@NW>eEp8~\?8̌p}.LvIN Xzrx- ).08NtdWL0>$HQo¾ts&IqЌ͈O4IfħjF&q؜lF&I6`H@6wqJ&1Mkd⠠*!+2! z!$U쒉H$I:$`HD:$IҽuoFescQHz$#>e &NPu ؟I$Iz/I=cOn2nFbһIHf$[vjhGұI(n*JJ2 &%tRFRGIN 2<]!ꦰm|8_VH)d̛)B=uV.%魀uR>$Ige$#}tU2Hv./9FAJ:*I@>+ + $$$)iCJAvH!I`ð®8^K$0X'a?$9I}I>@0|H.I1]އ IO!x}V뻌DS!x$Ic ݏ)I'$I Isb~7HA oL: +2Xdʼ+JB9H`"}$:#$I _(2~l/5Ԥ_$0X`&Gz~1i˭o_/orwm1iH`!$iI qj!΋7:žW^'}w}W~vυx^?WsGz'I9/{ }o}op's=o>9-钀$#-$ ŪHfLa}%*Io$95P.e+YS2}OۑO݇v'=`!I:KaBd{?4UnIV \q!;}d؏Θz߄vBjQH)##馌7CFОт 583!_&M f&SFfKz(#3$ _+"B(IEI>B(# O8NJrSa I/ed!tRY ^QH:)III^JrӡYI/edy BI f#0X/ed#d먓X^ 0j|H'Lts 0;ꤐ Iz)#;饌/cAƾ{ڛˌgY9pH~M /$Q'eYtVOΩߦ7a6tX뱌ÒD;4Oz,#~/sKt\\\`=t\M:.IsIe&8IuI|U!z~\rԛ#8yHfuOBҁIrkE!L욌l)!pdmB^̮tE o]2$ ΡQ.8߀W|ڗoٞH OeMةܲO1,v~ҫIfwt+DC!ЌK3NMN:7Ix΃8O_+W;=wd+rff? >Pґ"#Wn^ +0*,GzA %Γͭ_t8ߢq& |C!%I7h"ݠQ8Ն- I/(Vn~(L:B\kPNA\OO*l[Qnu\ I!-~s+y>^??m(,ɩtO=b,:LB/9o$=$1%Iiq5+.!]Q.ɢQH:M`N(JL`Cq,JzLIe:L(1e;Zc1WtF1_JRNK #Q&'=&0Xi'$12FqaJm,ootAj s'ʟuK $%%˂(v :(AJ$)%IO)IzJISJ/$* d)WZg(#j\ I)9 ~nǔ$=Ώ:PR7k[o3~Ҥz?ޜ8>'__zw:Ʃ&z"ft%*ȢXnM! 鄁:a %o[.\tFYJWtuβ?%=Y>X\-ӫt+GzbIU(>νHQxX<$ QA됍'qh73Q%KR'IKߨDz($?0ҫWXŁ"L!ОèL<$q^ή%~@SEU_ndp\ JŒX$Vxd`Ttwp9(_ VdߨFz`ߨF$I I/BKZy^8~|._<ȎA?}~d AlG.B"$y>^_{~x5C#\ 0j$aH$cH~}5(.Q2xFM =0èq_ qRa-ː$ gpҩ4< O[ 5VIqk<]Qu\U!뒝$zW A$oS.X%ŋ =Q <*7<$?A>5CB-.תR_?ovy_ۨO~%ɿQgoKዂP'ZhRHdOa&=Ht׀"$q^!`vu_TTJht%Aj(- -y 5ApM515^1<jhRB.PTkhv{_'lW?ᅬ|˺{gk#>΅<.N"]VNnю]n,S\F;n!/pߝv5k/3&/fv;:pnBM8 0{̫_ZR;-r#v=qrAcx#^#nW"J_W!k+d#]?؁۵dt"u߁uod8vQ.(7}揝$ȵn2n|u:_p;/<1N~ICi>Yۍt`.-\'f$vFsB/!;'0=Q+Z/ҋv=-ٙ3w.]c:3{-}9r_<7gvfh4vv&eB0{.^327!iڎ}ƅw62nٽtv@]=wwF8##^$xY_Kn$_3r{%Af$M̿G+6!xrӶ1Anc;O02"iwަsݹ}[ng],ku݂=MnwӃNnC?-ih6Bm__}?hAmٽkOo6^NzNny?r;N'2؋b>W kzq AnԋvA{s>H.IŖjzVϽH r.7 2GG؇ vi7B^H `ذ -}P_n7Էn~H~hInG$q~^H r{!AFN?ۏ ] s Anԟ?g#;! 28 @ 귶pܾ'DlS#18r.gv3 n/3H82;-ANf_18۱ v, -cJg90FۿF =K~U`W۵rC=`Eu{!ܞeg+Cn2%iM]sZC}As3r;܎dWy%]g*v0~T&j 5wFJ] +v&7]png2ۙ %d83Kw$}ܮd+G~MHxFp;܎HaHn.^SpZz\\ r}pg[kk6 r=pA-,%v܎@q9ܞC' c= p{A>&9alc ߂\{,^מz^8- ~y!MMLj]ũ7}9>Ƕzނ D8޷ \[̙gp=3_%]7-8#ii;%'rqA7.hnb>k"[:; 78Oz⓸~ \l5 rpA=I\O|7u6]%'Gr~7%޸ot?\? 7 ~] rX Nzu?E=S~=qOod#A8dܒS}qz42{ r}oA}i\{=Q*IM~3%o<8}-{OCqM.w,{g* ];>[/zә>c r}_;c rl}% ?e Crق?mcgp=lwq\Z#=59a 2L =\/[ҹ'kqlAe 2lcѮG^ zgqY'7Þ#ә # fZ>l< ?g/T7f|m~ҙz猬g9\6r3; 2j;3su?:2=yU>^yEKg.-3O[n3<;_'Bc-jO3$~ wvI6⁓뱺 2T!Su57O(_=7'e?и 6z 1osO\c]R.\_V%+^\_V.dzZ}/\_V rم\ov!ח4nCz2kٿyrAe\U.czZ.L.\qG\v 0=IWh7\JO( > +\ֳ\P r}A \\ժ[uv}Mktr=,A=\ zQ%3̡&T6/<zOLͨ?azONɵ̟|TZ˴VZ=eLvu\Oi&}:t2}$w#/6>';Zu=z$֯{nrXdzJkWhByl 3Qc*;F^ 7qMϵ.a^&\M\/Ǖaz0 /Gm|j^u% ^p-0bzaz/?p}[u\EPW*z{ul_'x^f%={_6oi6t~L?[yIȇ/ߪMq_;,fMﲙx$t?gg" LOͨ %p AI L nzA۹^v$IzBT nAٺߺk;r]hzD;?$U7#i('ԗ>Fh+ogl/~?pb%i?0>Sz\69~3C/1q`|LQKg3OAq'a#b^|{n9 οyF纑n8O< 1~%ub^4c=cB7p> ׿~&_XpnAc}dA7덛3nuX;\6ӯZźs57܇x {n"hW+kWޒb.:[ύ:q.ſ"Qgc.٩KoylGm]d}R<#}ӌeHn#+R=1>tɮjٺL&5^'sg}i9 }&wʜqq\Aw[,Eܞw9g9AI| ϩ\8/32w\" ƹs|~8oMyElo2E_u.hbqDme< ɨ4R <8y5n络. -W̏ݯ 1?enBny ٘yx^: A \Lrx8"cv ҨvOE/9_ WϠOiԡ>0W: ϟ9qkPL%i:6Tk7~gcċxn9g3=&7oTwsN ϳu ϟ }=VG9(GF1tpo`:{  3Y?v߲իi̜{n>Ÿ__>쨽9&nm4mcusoN>'h7cq\XO<\k9yR̛^0wzׁXOFs:Tex ׽zy>\%Wޗg?ĴnurﻍΠ[+?< [o~.6rriދ<^K彶>8q2/잗߇=^3{R_a+;;ArAWCpO)v`!rGru; /XYKg7~$p{y(p{{Wz^r=M]3 {}^f_$J ̽L۳kB8#_pqW}>Gn#s7ۻ r{<Pg{g/oZع}snz[o$~> _nط̾|?w߭]=~ _gQAsJn~b]콣皘f#?1{v?q}779,GgJ\?3m7!vۂ*9g!n-wK+ vjwn qkعܞ[ue'!n6{w{%3;o;n}w KEF>0\ )ݼh>!n~qzEC0O"X~~ L'~!5R;" -܏ׂ}}TAq0h'b|~y?=58o'I5nx_ALOscߝ<P"2OdUf?Yq,b>4h̓Ƽ)η0~q>ӑ=3\'yD8#=ysgQw}~wş)UՎ}JL-Ny;~z/uvsX}ש :I̮s7#;ƛvsNMFlc}ȩbڦ:Vg zU?l]ߩ/|_ߞN`==³kUOQNw7U: _qQɍy˘p*ֵ *fV:urX| wfG:\wauuW(W:Arr?In;Wgﭛߍ]5#1z {NB;~cqi^WAceo8{h]i|_;/a4n>;]d)1nY]Gxjiw1޿u;8mqĉSƹql4ιyU_~G=?ܿNt簉k'j:3n~O=<ftg~[CSyWA,#+Qy9dK+fOg]sb}} :8O4(mp>}_L't|us,_.]*sﹿR?>Ѵ4ToݼF[=)s4icϙ۪sp203^C5.A_}_M#h~A i-_8۬֏W|%]NĽqvqgedvxvh'N9Uv}VȰzYpÊ5ډ^s2nW;mC VW^_܌nv]%A?K]=ʍp\UA^ޡv稟+vnUuoQMy+}} [}AX?[_wpo9A\'[Ry>ןsK:Vt~fkS}7et^i{kfG`#d߹OH&v;>)r~߸#ܯ>ܯɏ0?^ɣܟQO['yKR߹?܏ -h T ''qI0&˳.X ck?` rǘcslnk#~Qn3~3_[-`sǸo {E<SwM_<j(훏916Ʃ>Ī,'9 h^r\'_lAdΛL/-{rȔI%:]{kTk;v 囏x~nqO }>gWf(f gr tOr{V_GW\?.B?ʍp|H<̮-6O -y2b|+/!}>t 2?nB[ASz=*-5'FM4@yr*˳^/Y%ɹrAfrDzesk{lr;︶MW Y/s? ;n"{E+!/yAE~.pF>|(0Ev&~Kܟ;nessԾKc. r(FF:_`~'!woШ7w(7!{sulb#o%c*}K; = 3BO2bs]sJ^aLwT\ecl>틯D_ZE8 ,Wyе>;2 r?OJ~R9+_e~|_~_U~GsÛ/_]Cct-5ZKW5jAy&y ;r32-u/`f|~F o&ko1f* wAy zAOO!y Ny~>IME܄(&'nFHQn.F/̏Q΍7'wGos?VueT/_VNƾQۏjo^ /͐Mw;?_pݶe߰{E-w_;f|[]_7xѿW˿iͨ˿[^! sq! Q X>ٿ~7<$2,>???OS{Kl?$~|A/'_9OMgďWJ=~?ܟCurqGܿ#g-zK;!2]Fo`kkNw0 ڬœ }${۝#}j/j9_",>c_pZ./!ʹ~ ×{ٻS.'.rm2_gҺ@Nf?~pQO)Ag);?&dX8O){dJI$uRg1NՖQC%DΠ}dweI4mW I&ؤ^%& f\ fiW_ei:|~-,+)ޱKfk^"XK%^Ko}>TKnRtUWuHfJ2U*yIݿg^R7C7Ck%S_S_2[a]ũ2{OI˺)\?PMXZ)?dJI%%uA~? YmxW{FZ^K5.`nߔwJ3SA]P̾>(n/G>(ng/Kvޞţ%u;zAݎ^2xjPS񙟪 /nW/~4j--޼_I?jP^_jP^g~'>ulIݎ_RGoӍu? zU[qK]v=9ЏN$}$/n/$d9gu<-PN?"k,s}7!;wD^ KvA3= I>^-^Bv/o,߷K(5>*K}`Am}K * */H$wd|G ~/FRW\w&1@-7t}I_o c 1AP!]@R[ ;.zHf?7!ǰ~LCcHTWe~ \@PQv>OQ?իqJ $ubqP1]XR7’YĂL[*w c-7!%GNB]P0?U'a3upPEzA^gzAAC2Pׯ3ӈ_\ףȨ˨IBbh7F{Sn1/ KXK|9>e|TLg܏n=,Z+i^3|cӌw_0?҆9K *2QB; %u -͠w;0gx?hop3n*yl 5y9]?Mcߧ_iHLO)n_nW+I}SE3(Au)WxTOy wLv+d뫳 ȍp"MO&41J2i䛗-}uS~]/譞U e%FF:>þ`~8(S/j =czlF]O$UOZ~-&EJW'_&d4l>zCCkH _EjjzAt=mI]_[;%k3uTG3l?X{h1|oT[כjxں>`kDgă0寎o,Kza^B?];􍽒uwTW7%ٹP72c>ƒ{A>4?{#/=? d5-1;1rxuNMƭ͙g4ߙhjG՗Y?--yŴ1=8#Eqx}U2ei,|=l#t>~zקݠ MC\Z]/b|GvBkǾXm\ƠnnIq8uRJWx)rSx#%U3Ue%u{ZI8Ǫ;'ºδ1czFs:<3 B_+>gxiopZ+NKWعmcXu ں{ܟq᛺_7?vb~OBrvi S~+$?+8 ~5>,r/9>^%zi6K{g~?qiP_ Y^ĽTF=z7 BA$,$>BRSTNA}?]~KG=}GugͰVeN_'q܂`1Xdj\49-wgԿ )ߨo} jOUj_qD,p1/bUwo3Q?,ﭥ[VM^\"ԟjWq=އqN53:XD cU}-u}~ӴOc;$+1?IZ~*~*~$3W0NnDo5ǸosF6˧gAX~_깈vHy쇊ec1}!cZ7?_J|7 ygx~Ee(7X= ASR (Lk 3:\y(Q̏筯mO}0sa48K;dC}0.g~}'{׃]Cړc4O t0}#_F> igtJk5h/҃7[y{~71Y>ɸcCv|4~.IY~vϠMm˙qsy~}]x {/z6q ?C(J)avh7vhwf ?+w?cr}ͨ#4?3g;v7jo;$ֻAv} ZPkϲw"/=oAtn綃FeN5C;A/ڮڨ?](4K^Hwe|oў{ccT~* pNo0˛$8.(n` v,u`㳟X ,8i8|s*ψA~ngXa4 ?Q1@/?I~I "F~ hAw$w#75A?I 1=e!eBndBR?*Se2Y W d Z-~o~/o32[]o|]L?Ch7 fon>}3 ׮:S{oU?m(aoE}vt'=?Xx.g C?}'@?/33hGXof o!5 `~ݒ>jۧ.NDů?;xKx9=P 9?/o\e_{+g\Vo6>UPqdvޅϵ.LWk/Ok~}hO"ίA?GT͢\? K7 _S [Ey?r^can~i~egw~y- X|pBD׋.g?߿i^ffTu~aٯyo -^2?&f[yǿ\h>/|hPQ?ύKmt~꟦~j9ȧ =O£?r{STK^9=qobx}E{]Voe}Zl/SYqjMLOtio_wX{uCS%7gFF}*gVo.UC$~*92z_4ab_W~\-bn*yX%ݶ:ּK~/6z- UaDB3Ν]>|p< GI2!P %Np4)v _Gle /|?ẅ En.:pێ1tVJkrkST"=ɻOO!ٟZg9avUy|->Ѷ&!/lb }io_UrV?~.3BqB|{_Ǖ]}gzVg+̗Jn5_qR|W(|_r1ާ'ɼl!{h(G9Z08OWtNM E%_l;Dg,7__q>Rg;! |444Ԏ\1C~زK-;kW}'ޙHrTMk:,Tֵpbg8i# ndT:|3sӃ}k!1^L(}Ui?_ߏڮK ~r푛nE6jna 'v'l2dk–YZ'lK"DF-Ζ=_[c {zep a'VŧAg&~12 3p !1<Əc>UPUO*2>E8yQ|Q7$D9w!@IC֡҈-8Gv?9 ',33kg1X>,Uew9;XT浇ItT&orYBjzrH!V qUU "+ sq]h:۪=0>'%V!VϵTXubkZWֽ?UQ:T}dxapbd<?~ט?,փk Q޴qC5.x4J#^u~w}*1>U|ͯq^՞VP]ju?/8dujZG[}}(apBպ_O_y3[s!3, &|XmCrU'f$FI^sʜF?n?7lOXԳS8a])waլE2æP†a6O8Q u5CrFnNþ|#k\ˡjO8p1CN:ڝ@m/~7p^M V}(pYgZ4>pÙ?$6nŧS t.^ir7פ;t$b}c`bxS?:vG!CU?fϰc!KZgY7}v~j#a)" Tl",7.6.];^xɔv>j#ں3%`ث٦BCe anR ?p7wZ>S"j"lyr+2=mMi¯K83].'. Q pKu1 \Nxt/~I&#-MڳY5~(BWpɑF`ǃ^M l:믱] {I1l6asunN#0q6pÆG^ϓH8niQ_{?ᔽSkGCfth7pw8B'D95.QZ(H#dmhKy?֟p] Fw=g|/my.W:ˍBlw J%|~xBS>H 4d8{'2$B*<5O#b!p5Ac<`X$S.S!3AaݗjP8i8r}LA~ &,Bc0h+fxW6[=qͣ?Ϛxa‚lҙqyV.h<p눌W5)uj} ߦCɄUq߀ \z-A^D)o1J 9dDK>JmCٿ>9&!U\BxcoZݏfq,SU ԙmdB~}A9G0~c`9c?~1s..q:pmr)xރAzFG'<,( PGuU}45t{9'zNb ֏J۠\uң^~]7 _U&S7_jUN>^T/>R3ޏab}ą^Ѯ$oHM1UdVTUz*mU;X/UXPQޠU sڃU{2UxWKN+}ӏnꮷS"!l/?o*˃?6+ұoD{HTBD{>OW !DPES_E{ڙO'DXUۢuўת*|EC}VՏϨ.[Iv/]q"!eݶɮv;.ѮdQ*?b1}vX~__v(œQ|ڝkxB8O$ˏP?:.f;UxqEw7_@*?C##ӞJl!dm]L"dф;6pgq4aú1 -V+Q<={ể #pY jwڒ=4MXM36Bn0a7N?A}Od%TO.!:OZM$BvJRx×+ VIx,yH;'2 DqG8ͨ۱>BvG+4( L-WEL$ܯm*am2}0B׭3QkW4O._LiC1$V",J/ٹeaȓB],2=k$s 'd瘱YGw4hфiKKLBgn$19 ayF;M/o;+ψ"mcE!oQ!W>]G$7Z-Fg{)a !m潉R\n@۽9qT|N:|XLy< #,0rYWB Χ8OBqsnZu%Ӻɝ`B\)O)WT/ݦm>~u AZOY/^pc6FbypipVaU ?Zn_1#paЪ_AUx~Up?9 YO«PnsU~(G{c֪_Bcx~UMܯMhϙTB ϥգ>G*]iSkw9G̘R!362FZrXx; ڮa:T(|HutѠTB#?!ooM'X,'փ9Qaz>;SO~ T{_ F }#O^ SU{X~E)CGʈLhRUwxN|?(W,w`wVJ_C AzQϫ7 Qa_5#? r#^Uz;x_z} ՟uU?Wދ[]/TS_׫7ضCؕPz٭`5қQx۱z_9/I8Sޔ}EXkOܒ˘ߛ7aJs~]2RQNծOU+-4\ُI\+<<"[Ta'[ 'aǗ Kq36W~CۯU ʁ^֪)}9?F4ǔLtb~:nBUUlGm]܄XsyvERmwoz aXKo aRS8.azqG9.aj{øc?[\85`m}8e>^&S2I#Z:q{?vz ?k'^&Sr}a+zvJ.{XʦV\N9 xALYxWuFݒo.i"Kjuv['b?v.Nm)9yq.-=8Kw+9t/vB%yc\a۝#ٺI5%g]e_ rE|j#t~?! w_?=ougANr~ *@a~wx.]b]cFa7!9 T.9 dž~Q.K. v"K׬wI~[^ W$_ӎ=%Ttuۖ}c#1=Owi#|˺pHN6}'![Gy 1~m]SF-%O$MA~LOlo%|@"q}E=`aɱ"dOSp̀Cloi%uI~u֙N]Ce';0zހmo}>CkU6W$da퓜~ZY쒣ޚ\KR.=n?f 7:!?Sy>ǼT!Ki8';arª6ɱ9CؿjApy XO~Zrsn#|`>M~vl&8PA'#ݎ˜w2.?sCR%_<6!Ա} a{q.vcp@U¸ӯ9V}'a3 ߝ1yGu^.E\M*E?Wq?95w&9(7EJW'M#MyDcʸ!ϑ=]^XNNGNB/t|lYa6*ai"\OKFEE[t#AXK^>!\7|ʯ|𫗰s6 `SY'ak${:Cx"LC~ `^.7 ^G׆'o FT=x.^%bnVKc^<銓pO QsNށpB{`{b0_}]0jLq7~Z"}D.B_={ySzb9;rKmYE)!^1}UPk~q\~QUm3 X!gߗi|yɞ1uuRڴ=Nw%>b,!Kv?A8Sm'2}dOn쾥BBOl嘿Ӄg lTI/;a|)QkCtmg:߽zP!=3m`Ă,$lLW:,RN.\AطX!;ufnﶕOԬMh?yay?}6BA#>;R]LL-ٙy vٝC~UamC^.wiܛ^,:喇3 gMm&4vV-g:Az|%4? ;Gqb Xw2eb}0CvIS=_y:M\= C7*92_IvJ]l[xoZ3qO5e40?q|:>gvo_X^[mKv:{Ŧ|`:o,}~Ey_;$M G&/F&W Y7'!ØP%}LDܟ~c[o|>ǏbloO~TV췻A)ϓKݦ冃uB܄})˪}.7}GF%NӾQ:'"ȕJF L d6z%պ\&umt>=5}- ^[ikڌ<O:s>ĴO}}pLI8inBgd}w {)ٞA !)~U4}ԙݣ{}o>[O}SlWbjib#l}wg"D*|lv%J+f'\1p- ~Wt OqKޔk*zXx]f Zu8SPy#)k%s/wM ƯлRX벪e Ͷ\.z**} «`2ʇJ{E;cA=U?R@;*m,Y>d~!a}:@{IOQ?W*p]1BCxSzN\ D}X+c?yQhՏ*}`᫾,o*]<>zǪ)臚?쿪b~6'~^ݠ^Iު>1<@t:vt\߷Ve9)v k ?Pe/BUx/!v_H.%&=FkA9G;1U+rЎd糴یhߤB;% o$jixfW,]A_˧1..B[C{_4xٕTZvBlB]L Lk~9;ӱK|џ1~7TzӮgcG98^IN>}+Mi5_`ooVf`kE`;wͼlV ^r]v١+ :ұO_ $c>M+CMT4Pa_1@ e~&ہ8Il[EZ"D?4*?5 G?7&?8}m] 9&; ~~|ɯJ `'f&zSaj֟OOM zϗ2-&35Aذ*.B[è7V: Ok%!2B_SVϚd'<͹~A~L~N^$'U{d;OQ3YC?l M-_wtŁ?iuF- ߺ%qH~[St4 <!{ݒoo;կ;%ѯ oq#~.n#\G:c#dvBdyfz$M ѿXނL?y1PY?SH/ɉ~(M~*_&T16¦?g.cQO:5m $g 7!7E`MW՝ݲ@x/ᰱ[z,%<c!y]܄ͯ"ڤ^%7}$M~g$Dz!. FۿNsn.vMx_/E8ſ;vlo#d~gqu {Jٓ.Bu'%D?W[cU~U~U~-%_?Sr%"Џ,~A^Bkօ.°icw:dB 򓾵O{vIS|g$\vO!'=qWgw-c#w2t{BջNbzWdWdoJxd݉7Ż%3?¯_e'#jNj@8poްHBp#})pZ! 7\(Oq )OAxڽd,6(K675?! FCȦ4[`80g}}# qaF>'&u6º{xZBL"^ ʍO" 'ܺ""eͧ6DcɋFJ¿j[n!|r %|)10{aJA!B T?)d9 [ fvB W]?S cAq! YpG(˂fA` 0Z?0-V ؂lA [?-6\?8.dB {=?.Rd1 BvG8nT4hmǖL8`Hbg㠃NpTB1 %] "ɼl!| >:x#c'bxa< Z'n18BOݐFi{OfI!<謰;,֦1>U#1U*;L-r?a|->pOxsq>Fx<7n?vBCɿ^;ޙH0-NFA?rþ5r푛kM.Kبݺ1QʟߪDҫ#Ъ'S\X~UԞ_?aWZ62:ޡëk̏jL'"DYpX(z|e}{ǣbg8i#??'ɐmy[fiy̟R/%FlAحZv28p } LýazFtG3?n=yޛG j{;SªY&d :yG쮫th8Ӱ/!C U !d1C2#!K~Kq-yhCB[ ?Xզ)s9e[#N_;P%zzzZG).(ۙ)|bcw$b?~P5.E]U; 8ו<<97qu\.G6\YqL"#\c BF\W⺳ q8[8B\:ɸV1=V{_O}Ƈm=?q_cG 埼LDB,ʱ U 7} ub7 quj]j \/(%U|~uݸsi| A'ۿ4:s݁P«YVoN!]lK`BG#xW6[$tQa/OnHkS-BOB K~?CX&lʮ(x 1?(/c-UMX'9F'FTy&a3τ~)L^ f9{ڏ0ziw}30BߛJ{o0,V$3sΥbB9ƇURCߣ{ǃlN O8YU"8!43IVGbm83=i>jMHŽa;<{ШTg?l.'7޴H){֦\7QB7BxBDOO(<;c }8G^`g4$ ypÒQ#_H#,TӾ40{;Dɹ? Oaj0¶sտAȠC ՜78+Q|N8vmo ٹV8a|b W>_.pbNB~n$xƁ)qUqsi(aCٹP?YZ˗"rUxb~n O;=EX_(vO%D9Ʒa`(BUzRakGR:~WRӱn!cك _N$`B"!~A|!~bz/Lk8QCoi@b qUKcz\K"!806ƒ]uμepe#^ #K+B8};_D:(λ~Ea<\q\G:} s~ë?Ӭsip]N<A9tn$s7\Gip:)Ts%WL_y վ}^pB깣c_UUxxgYWxg6${qѡM`Bgpy 5OGBUvJ$:O~_4Bռ U Z,J#.w# q (JŸ>{"%+U,/֏;&G_T8#/պ˭*'׫I+Qo 7Q C%A_V~נUҨsK>Bp{.D?hO*{]? 'lV`-Zճ|ˍ"ݰ]Uz5mUTh՞ǪPت]nPih 'Dh߀]{ sWU@?* DK`Տ*W=Lh@BA?w"`E? fz!*/£c*(Ta*{/je/W9=t(u1OkLFh#}U?9*p\jN\=uVLK礳>TQo}ô 6VhVrPԪ]n*;z*^98-x_Uɨ_*{@uބ Ϗ|=Q}*}lެڵ*v_~ʮ'?3T[WWK}h{cxU}#UoSC}?:bc{#T X_E'T7YRW_xІtTgTս;:zo1jyW;C=qOer/=_ꋲ_rKU+$qfվ}jT}MW?f(??ʭ .w|׏$d#F΋/r!?yфL1pÅ" {!ƯJSGUkZ< |a  vе/]LƼaX{E5^}\kG!g83Np'nzs %T{Y1~̟x޼a  w_O~a >^6M.OXqK8a}3B܄Z=971E7z/P{,/ևjpGR gt(B87s+al=F_VH$wn@ IjOTBoU{\?^tC/mOO1׀A$=r*c1X~o?XC mIUOkRzO*!O߳*=>T1cڃ?k7!>O<׶]Hr?O,7C ' bxNUr?OPӷZ>_c}`V r~_`3;b=ij4SOTAWM 2}B AUx@A7Pp~ݤ# @MGK;oP0yxE=jFm]$I$u?TI@R"r/$u?1=ݯwAR I钺]~O&ۡKvْ:yGג$%u{oI=K&%u{I^_j}~i$U[0AW Z{I%1~/mc>$ݱ_X7UJ$Wc{̏7Tr^5jfGH%6E)~=_LOIER!bH(̏FtJ5$?vXB7CR?URaOCt>MaH2.B rO?7SWR?\-- IgI!ޠ%${QP3!~@$U|`x_#"c-~E$u?LwiN&O'Cu콡`BOWCR!apB$7`>0{LG" ypP!VF`BCR!ېl0?I[2CrЅz8$;qG*~pw=`"CR!lDq`JwCC\ڠ*1xCjX?6B?sx*Ɲ"z/ƻ[Ly\y Ej8Xs{JR̒%2B?JR$d H²_6M$d4 1<1=J̺.I̺?/I_\(3/_>X_I#H]Tnlg,no*EvڐPW"+H2%NB?n)Hb|~+Գi["jw_KVLcTqb4'-48(j޵{,Ϋ~ __?9>^R(Kq6OR&Hg=cˍoaI|`\&Ivٻ &I{0Bݯ䏏R+~${!g~Xv*O$>"eKȴ+!B>I{TBݏ$EX恮ɄdU?ʜ*Z2JzRuX-I_a{A~~$z1-J~$QۋK1=oK{/W4!w%dh-0@8]pBdY݄?Ϙ$GU(0?X) ʧ1Sjz͏&T؟޺J!8~B'y{PB_Xol!?[1>1>TrxӳZ^cU}p_(Wίؿq`c}XuK~/qL\~@c*_pUAgUm}0W`Iݏj_xW:<=t rmp:lfW Q[U+W?ѥb1.aG{@S!⸥{T~(W}8NXpd=#N{h;;{S'ǣUvV籽?:H_C_%Xo_8`+ҷBzMcU~6*XP}*X᫿ U/**?x 7*( ;qYB'Ig{XBWOp=c5?=Oew*}ʎEkXK5}j}쐭-پ΁C'-TU~c=_UTr__ @j=|ej?kcx+)'ʏT:YsunN#D?s)}=o5˧o\/xރ:??UjߌUs _AOZ=R{|VV1T_丟c~QO_X=/jcU'ݨ}jOb߃o~ѯ/ʿU?*~n~c`YG\~_B|w+ ]^:{w;OڙxB{{p' _'>j%b~UkxB}|߷q:(/۾wɄP;A9zH, {A>>U`{bzؾTQYM/_3b&VT?9p^3`8{<8Z}wP(:ᄘjgv[QU7w|T;7TX}?ߪ=Ug.y{/{U|(W^T)Vsg [ݏg6?7U~j0>l_~ߘE07V =xkS}OV GU~ϱ},U޿T%g{:>ëjUByv~rjG)BGU@v|O~b{jx_*|8#7;J%T}7=}DBr_Y읉d!k*䏟jI2j7nB{w;C-r?!B]m;'̎#D9|R9,֦=rێ12{dB^^rXJ!'Tɿ/|?*̤5%]t'Ʉ)NT۽"7Q1~]$!0Sq`Mm_ JKѶ&!'OݐFi*9WϪr D9rw:߹*_~v U`=U\4櫻$0|v}yyÙԤl:j~ĞsWc[OVwV~ qYpX(B| ;1vEދc':?c~1?Ν]V*/ߪslaEg %, MfZ[nH2n[wc%w%u?%b&@S,d{No:Wo#c69 d;Dž<.bb~֟1rwIT8a"{Kŕ'if*8 T3zQ?%^20 ub~zf!{!ݮHruc /ZU pIQ1 ܇_O#D?nqaBr!(qXO8~{=w@p_"aD# wa%~`/G'y ڜ8I_'J>z;Re'2=B=Ɨ+JJb%4b#l]aJEק~i{z* },B=ІɑrfF8^_f$!c5{Lv*)83_c,fLR)(W7XXX~M |L.up=#C횴b܊q|uQMyYj0<C}OX/x=L_>$G~p-ܯY=u?rUuq?q_c}΃=[νlߣ#}ؾ5UAocGŹw}Z_Z+ U-xކ'x)x^Mx~yLuox>zqBfCX~GŕIeD\X&t"a`E GX6"[*a V1~LWGS_uޚvb[|v;ONߕ2{Y'"(OuB;{BAD2C? \!pECK,F8P(6.PiOm%Ǵnr'phC ^X- #}]2asN2c6FZ7pgq4abn[%QX<E ؾ=}M xcu|@ ˃3w^y:䡍pb_pby8}pXu_?:?[-AƣQA9K}ϦUxl',_m~`=a^%USq]{f: QUm\'1,(u6\xP,!V=.u#?N+!u s:>LXoZ(uJZW8P7|cq}duqxTܱyȏzv01X/\0vp-EF.JWQ1mʞN#c݃ &ۓLɑ̱>>x놄kG_Q15DIew$oHS#oH!TO)xBfJW-{-(@᱄{7FC َ6DB|i[|R$p㓈"׎l ʧK$\ti`cb<#PoZRZ2}Aadw&t%-~=PWK&6jJFb+?\=PW/D2$B^y(!9F2;XB>ofFxs[Bn jVɄGFYNy?֏pK tP"%jH&\60¸7B%ǹK}ڐRPWă`BLӬᄿW6amFݞFW D9C8yރBq|C5ķZ(P5q|O5~K^42o|bu>T9}_U^Ӻ# uj]&\ǩ֍q=XйI*9/Uvj}ڇϾ7UZj}W?A9ֿ}+|Z`Q퇬¹ 3~:^a|?#q1؇ŴR}T,jAxe}\U_W5O>jֶLCq_0\q?/TUqݩڇ:n5F20\:ˇR:z8Bl?loUu<1>쏸N:+SU߻0~>B5x8S֯盪u9|]_K~c~v3'{.&{l)[{_Kp}_3_UVy}x:s _c,?T|MUxUWTcG( C~Q ڪ>S[\uϞ>AgOҧ.˦ԣ||f_'@XC~]q~꼬;zΤZwu_+TVGƇ텿ʋn/y>g<0_V9^5=<__|=VìX]7[=gV{z.}_eU^*6#ۢ\uNxnsZ?x?ϥ1<sf xQ9:H0?xN?0~Loҷz4bB,?ԏTBU}YmllO,KLH T雡J LimES=wm{{s+rN +tˠzzu*u/^3,G*?VS U}XիD=HԛP~_,J+"dh-[% &8Bt~fuoE Ꮃagt<XB̿s[3 1aϧi%:qhBw%Az|U9hDڙO=4$̖iQWL%ٗ幷AXxkKH%X@dBˇP؄jmX~ԴV3ϡ[~Bxb(-g^B mIxt/o/("e?w6p!ˑHպ\BU|k|01p- (I|y|$$pk$oZK 㮚r؇:lOa_ G2XlJnx0f~1{18>uF8pHpWB \Xn'zva=òSj~834|_KGXߪc~?`Qv wcxU(XʯJ{O՞߃`]~#dvɄ; o#,2{ oZ}#&w40W]/]LƼa<^6׍QW5 <{$BvE{%+0,Vᚖ1O"Qwg!5 \c E 1MX}ַaI{}KߋAc1>|ݝs{Q}X_1jP5ߠ1~G9by1=|JyA]'\O8z]6{EwQ9 ?oղE5#J-@a~< #T7`'ƏfUrUyJy.0˒Z"0&']w%aHڂݚHxC SWޜFKTE[J#Jun1?Ƈ=W>_.Ɓ)q]C1Dw= pn?8<K8kOǺi? r=/9ٓEFY0!{oFMJS1^?֬r?-~r4FN: V`]aͽ"VF`rþKṞ >Fg4$,vi8jG d?/(=j)9} OZI+ǽ_T9`d{W0sv%nCXB~&}q7ٽ\L:q$3:L8eڑ}oZ$!J$a;~'ݷ^ǰYlйʑS>H l:믱] ?:H_C;K $v-o'1?xT``u>?cyAޞi'}hB;]/Ky" y&K!z}LH sڙO#d]  Efx`{(Ws)w9 ;$eBn?$ωپ;po'*g;[pÙ?$\Cp{+Vi Y޾G;drp‰YG䭣 1=jbt &߫ʇZ@8p1U b]lK`BkɻvA˓ {5[,!|o&9~ݱB/p<#p|Kո;ؕ#qyռ7{bxpScq7j>V+{8aWUc|/<.X~O\/az cM8\Y]߅jNySZ^Ftp;vٴ>Ͻ'o{;!ߚ!P/2z_L:j?}"RPuXBB<9=ۛ~pBG?[<ڮK[ϗÒ_[֗__qcm۱id\Ar?gʱ8N86ᯝ cF *<87o$= OrG}Lz2UڪvvS] Vʕt~z=d쿨B1J_AVW[G}_A'b|>$4gȉ޷GF1~ahB|U{,}О@V0?X,mH']7!?cڍ]OhծCegX.+tKcEJލH!D9v\86/N&l~vi ]? 'Dy#"XԳS8aw Gzٻi>ҐkUR.q:pS7Q~T?B~n/x#{g7b_v/,yq0G,hEͻV6U߭U;JwTp\SϸnSPZ8jy.E]8p}A;P8/[AX/OUzX޲|LW5/c{a{bxe}L7XG~թaaq=7 x$jc~TAD*/qc}c{0(BU{ZcTo0~U}zSAKQկQ;ikc.K&w!pj">4BҐpН[~K ᠳo{zep al[0'gº/a3ybON(O&C! FlA2Kc׭ZXn[ gL˭7wll܄}Hbg8i#,Tӎv|u&ÜٴAM9avSYR }L8!S#}sjJnpݨh¯J%]t'Ʉ1W#) 5%1}3wK:0$Opާ'Ow@رʇUr.Vc.[z? G}l>bPް_`~;~߉ﰠmD4€A$*W}E*<'o (B\XQpDGc c\ˣ ^X-'v\U!3&d T8DXoZU=¥_f5$,uxS'a7N?Aɑ̱\/iDi(7 b:^An Wlߞ@N!w|;_A XkWנJ~+1~D`A/O%PoZ9_6?pISs,wh[ThONˆ/uwqjM+go!*^¹WF ]U+Mnܑu-ݺM?"||žtXʁLʺun&;X;awMy=;_s\v=Rvl:Wocp_)WNr t6ŠݒJl搬5IJnIǁ{+ǿ[5:еuH;=5nESTnrrs=dg]&\ZzpW2lqel9.YE~t]{:Lfe_ r.S.!wJV ']9?t~~u{.IX6%dwZvÛ1o)"V{O ~ê?E6Ss!loU3[-%Tů С_*9JVrv.6!E7!|~ygd?3Fr;Ԇ8nfy1//_.[}߳r8O8i7|g1߫_(?X>BϿg\״pZ/{ByN`T^ta!ui]x۝]fIn,S܄ͯ$ug Y}lُI!3W7ay A^/\BOǧ\&Krq6·VM%ȆWGߔOY?[.rv wV>Fr(V%;aJ: 7w9uq^xWÏǔLta%?*]M^?d'ܶuaJo7 vpKk_=Ih?ctQ7a _yNLs%9xN99A,Umg*ƇCCl?п{4/E|_M?٩Ko{/o\ӳy )wNx|k酸%I8~[1r{H'aqNtpK}݄(/ .BH#m#a5gܷ&=T\KL B%\{r N>$dv)8 OZ%n+>O'apwl\%섓=FU%?[6BKx+6BoSAy,ɟm8$? *Mh1|CXoW%_m𛪳_rx\Ci淓kOLJyd>xvEr &(Nn&i/!_Y?u[,Lb|kWhBCFLz+;*~c{b}a}O̱ګI: kݯ ?'cs`yM?H6-<#`J+WIx.f5e.&̜PQs9 tE.vN5ԯQϦsڝ3Bgp\/㍩|P/=lŏ !϶K6㝵園(71C]cj>%D9WſbM6D{^F36EU~QNCn~&W<%߃zu93w:{ G;>lWI'&l o?4;ܯkuhE^B}۹P}Rd_.9 nq$UrGx 1~Lʿ>;^B2$ۄu݄L?CӸnnB_g/!Ƈr{yw:&D]yܒ@Xַ64k0.EwuE?'|"D9h 0{6BCNv&lY bp- WrƘB=S?ڿMrhLԻ}znaν8N57PV4-}MI:Oa}@,3qb?2K8ߑ껵:n[TW9`k]݄E82Ml ޿%dNy9ƹ +ulEب2!/NsZHv`;1?"{gd+9*qr'9 S^UE9({fg'5o+VP޼ |f+EvxK8%;w/ɳpKF{'/!wR鼃p&k;R]$dne! ?u骍G6{ VjMKzq~aL[B}>n&QAs/!o*/ԏS4{뙜.OOD Ŝ޶F\k!*tF׿.Bx9s4~7+!և[[mo9IĵynBC}w{!0y8Z3/KxБ~7S5/k췐̯~X.2|)[DWn1r]~u; U8wL plU3ͯ82{l_IoظݤXto:G!?>}6Bzoq޿փkCبn^vBY:$1?ݘ~rAsDB6LE􇜄LA\=>pߛtJﭳAxd/>`0f)OvIXdl*$dv¯|pݬB=kѠ<}]M??읶(C2?\{F%Pn9Bk mؿ6<x.i?_كݒX^~=7[xGv^/'{ub|(^Խ LG߶Fb_>a$ƈIlICmA&bm A[XCĒDX2u[yוMn·i!8O{{XN(%; 1ҵ?Q{L;$܄=`==4rqyqg__ru<޳=p_0~^cc\yebԄi[~vJwrqX#fvAxgo.C󜻓CXkj. >h#=b#PG,F ]?/arǣq Z<1a-߇(XA9ѠÅߧp䷍y֌d#7a1fQ?^?}pK_벨)?^?rx: Ş8J_ ~h$y ݎBL18J9F5,B6B|>8@_\X_ {o/ol;w f#4{33/@=’Lد~~=cNVM(;~m^YJ;-Ыx/{ڄYDBǖ^& t<5?Ά\8~D>nka}RM˃8|А6ή#nq1L؃y qer6BW83qw~w ]Ei%^p[qǁQ܇g`1w-A2k0]9{h'yipX?xMi< yV8OcW{&}ka8R: n?s/}Vkq7pIX8on'lU0aoe =|X_)^/ty,?>oW,H_B?M8qǘY=>}yAE['`:qѴ =!ַ>\{6mvvn]M|l{cޏv=/Wτ]ݢqֽg-^L:Ɵ8Xug#=x=ߡ9:*tpҴY76;} zrTd#m~a^q17=M?9d'L_5fqBo!F^Pġ^8|®CX=lZ~pʼEj' 7XX5ɰN>NBLa~x?<rZ>p;}aFݻNBK&l>^Wm!d' ],O㱝pըBH$t}܄z&:]3ܶ%zǺ-N:5N’{E:-@(?i8%mD.EuB:^?읰anSPS[4M %o7.©kfO[W~uhzΊF(z~JٿM'(!RυRW1kx-jB'eqURWNP+bBGAx=SY`#:2Έ3(u1]9Qc]_JbEC(u\"(uP*uP*JQEȤ/:"P* ]P-UscK+(u^1ݓu8#(uNP*cqU|C|/(J]E1RwT/tn"ǗRUQoYU.B#L)u."^.+bp>.">_g˃}Ӿ_趨}o~o'F G}1 >/>_*ߴ#0}2]ӥn"w=_`כϴƟ2BFұ0^,:׊8c:I]lřQmKy 1GJc(/Oz}п\)WHaC<}qMR[:i{A(VB(FíˡA+ba7Sn#݊[̑ۧ~C̼Ldop2|相#IXojU\z7ϵ{do|Vƃs7"N;/b,/s82"vhw gE4,vMv !<6"Q2eGkL=}i-\g 5YWyO;ǣ-b#~nBSqZל`2?N5'!3ʃx=[ނ_ಈv<KN^3 E}<XTaQ?w;J,ā]5;%|_\q(V~x~#UeQveiv|hv,\&AsLuI.2Auꧧ?=WNp|!ף,NXJ//9N;_ѮY-BFjFlF;q#(t]?c燠E{0S{{,_ψwf_ƥ??I6WL(1SB|sEV3{y^B۹֮y{ rL$, \7yeqST_(֏g'}a^|!zR_zVyꊠKh=*h'M'B_2ۄuvBL5nobPoˋ~  pAz8:DF (V: #H:[:ǜ3N,S-+_NB|[_x/>E(WnBaOb#~g#z9ytQ[M:꨻:蠛̣.=س:L|)-q 0N^'xHH+qAL`~GC8(\ q86L6NaA- GxZ\N&CbH/q!^c\l8p};1ΪvBˍqȹ>(0Nzq1nڨf}>ַ㦋Pn5DE6=ƭ㦃Pz,i9Ϲ kbG;*'`#CX@6om#|m^. mE&Lx]?}6g_ApTQu\aLJ;K gRQpJe?~' i(wJ{L?_^Bio(3_1oBI!r+~*.|n,&?JE7g#߸}C(!o܏Y~/NMQډ*V8{bCi(:cS!V$vI8?HNEi'(:/ߩStSvy~j˺p^󳮴Q7I>zَ$~vBH+-:WR?nBL算V~"Zz-;n‘7N,J{?k {/S6^[ڗ)J{?HDE(C<i/hZ>O|Iڇ)2;-byXޛ^RӶ37:ҮLߓ%mWҮLӥݗ"ey)'i_XT 6Bxz ӵzAO%P?bkʭvuJ{gEiiv7OxjoVhc?cnPQ *z*W7aUA턐v}) W;b|/Zx@INEi7(:5Tj\XCm*J;PEi'b vT!?[iW( 턘.T!nTꧦ=Rtiσv~*$Ӆ'%}~Pe*!8Uv.8dϰ=n7/Xr'znBx>UQا: }GUjM(QQ?* {D/WT1%zڇsVst` }b~/~j0 xaK@ktBnܒ ~bv=Ic:;ܸ΍81?fgKG4'ͽzNկW ;[W~_M1W­գk[uGg9qBڱ+2DUig(U]+Uv~Vv~VnB崙+=lڸ /#m\sjSy^ϴ+v^|_Z; { 7vZ^$s_kHg~U<Gup=KUw(V{O趨=>'3q4ύo:v6RO> [GQ`?XE)BҿҟJRWyK({zM~ޚ/=q~~0]k/GkJKHEh?wTLQeRFg$Xp鯦QY21~l/3Sto9ٗIoVR) ?2ҏOL׮~jHH?=Exߝs2"1ϖ+Ta'7?w(U ,rK¾o`aX\uwy߫tI^Q)J9E_(׿WeSK?=E.O,֧V~~)i\XϦ%t%lm7[(&YT7*JFEߨ(KYDƗK/"E*x.'vO&2.;p}Rgq,,5ұPAWqeu? ɸ.I(AexEyPƝWT~_H*!8?tby_;W j":N\;-Z/[l65Bʫ>i}ЕbsЌ/"4O*[b`ڡޥ߲"^v 2mc*, v~Yߦ)k[^?QBOi9 \ ޏ+~ҏ\QW+Jq:yJ,Extán7]ΆNS1،n!~P.>Pҿ]ʭ=OSb:S/x|^ϛ[9-~KM[+J?w?sIvEgls}z7ZW)'?.Xҟ_Q(B}`}aMU RvrJ?~C{ +gN鷟&( /]R@A_R/;_M(=ϗVNgS~E3岘](7g0fJA"P_O]qo;!c~. ~B7A( vs®_bn|Yub}a:^~/ϋ:7mêwbԗPwvxAX~AvI} E/8f6BL3J ŷN"[y{G68 3T/! }cg%3o_z+REQ(NBgִE\!4O}B/g6?X|Q='ԯQ6RF-},5YowkI )bqn/~LiOG)m~B; :M8Obi٥N";h'/I+EfsN"Γ1cڼg_!av뱨K`ݢNz֧9YSu^Wqχkíϱ~?qj7sf璺~j#`}ba{7_fݯ}~H Oy{}my:Wh0ڸt^P~`~}p2P^<}ߘ?ԟ?q^8vq^ ky.|:F|^G }/!㮇uNp̭a_gu<}Q%'g<~ Ohs"gk0s:,fxȉ6$A(?L=kE(=1]*bno춘^*J=S?y2HSE'ևV_QѿvXy⣛[\zb]^ܾ~߸RgOv_]}Vmt_!dmʯP?؟bj8>7 _jZ8_6_.3p~o/?HsE8A% xQ\z;'sq<.AK_2'O s{; }>K`9 Ў̾ /+l7\;-z']}T?`߂?Uq_`ȝยp\!Z:^|˹@{mތbH瞟oǴ>p #0ίs*g~{n\o.p^Y9CͫLQܹΫ3n |xp2ܹ sp72)ηX{XE{\cF;|2^}qkv׷G|d#;m7E<3;ݺ:>k~ ~ocꯣm,9P 'KD))?/&)b?o/tϧ->i ? t,?j~_+UBOS?[D\fSKp3ɏ+w_8N@iYC"cq!-?w֯~thZe<\EgMG_Z?ԏ?aoߣ>3ܟz?PN@B=p6cI#)nj>\;8]Otv|g{et[0^h 82y8uPP u4&t<_.p~:O ϯ/餥vyA:ꬱ:aGV=qt~97.fƽ?|~/cگa::MҌ{t&u)Q#@]u*b;~t ~t}: pC{܏tq~8dszB'?2g_;FQ[p{X\!v+_du'q}Pis/ʺ/'o9~w;!%rr$ⴈΏrs~'Ρ"{~;~ԗijX~|>8/5֗T(ՃtPT7#$ɨó}f_K `a_*r~%k_g?;Bߟfπi/p'7naL7!c0n]8σϋ*"kfޡgaz.Ɲ;us'/$wW1?|;dދ6D}mqzwwgKmG$y1vθ z*~7Y=FD[C?^zN<:<6i:N;Udb+ {`#l]&/!"eeEMWRYlk3Q ~~ƫ턨L|ک"Z:㜮8i~ Ч9MP8 S[Ct%8]tNT[q::7p>%yzٜ>6K,zT/י^g\9zb-?Mk\|/ΏЯ='F?{wڹqtOƕ1q~65c_a?U9b~p=])orjC@+0W> .6cqzXܺp5wML\C=v߇.r㮡鹁b\0q-s>N ]rMWnn .߱\3rAsC]w->KƓbtޟοK;+^<짩|x.5[p7_}4tMi;eq?8 wr:Z\Be@cu2MXbmm)/l?Nsv_ѝYq>7Wq>3Ck+~GH݄ 7C8$Kt[Lv{v/ic#q[ś;_e1͢_BxnCvN"ix̹߮~~K?GY *w˜{Sf_m58`s&vN{sm =6ڝ1Vs.˹s .D  3o月ݿz#xs+S;P3vcܾq8WsԜ5;]=omnx]9󘞛qz5ay%'g2/*?wƜq֜)_z׆Ӭ5c5av?3PQcQί`SY?WӻdP s T G:8:ΐ"rN4wqr=Np|g/oRna{ KxB1YE WIJ!=X_wc ly>@Ou[hhSr:~atuSMuoD:MuPW-PfFg.l'=m)h<nh &^T/Ӈ3|>n{4|r4D'=f~gٯI˖ЯNv/!o\܋'ſ~t4އ{ܧ}!p߉oao4>FL?%m= MuBzt?cqf|Ndc\.ux&\Vkfx1/|v1!^㡽܄?ܟ%|PbQi:򫺶māٝOXMرz-rn`;R ;V'!.t%<[p՟7 ;T:?-!>羗pU^_Wi]9ѹNk Lbz|&Br~Ѱ]zd$Ba첈č^svB|ON0C/k&*]}kZl_A'E}^t챓0Gz.;1ΪB&F^ۨ섵|8;wYV{/s syb pB5p\/ClX>L7GO??އi:>a{IĽ/l^l{]6T1wޱ[ u ʚYNpqa\^+窠va~%<|wvZ]!G'Mȥx^0z6‘7N, ;|7{MW9 .ℸ,vꧺ]vzc:/kےvoi y.BHwtjpY=ÅN8#{z !n+{8 i\MU?L7Mȕ?b‡݄*}&t0%_#3_~#zUMn0'鯞sY_n¬ GXa.7!\_oXpxlvZh;\텫&!ҵx=>~IW#;Vv-vn] Mˏ6v:(jpGN/ñ!kNljPc Y?^Xl$l ]c_^"޸v\p+% !˿q˂ O1b#b't?9j':0.s5':,&tc܄=N浩6Kqb:^Bnrh%;.KhXן/PUJ8 wf␳5)~F^7ǗHpN&w[l")>PS;-6nnP/;KowZl&B/e~k-b_C(]XM/\NyRb}b̪58-jys C3!|n g_-\8܄ӵ]$:`@7Ks,).]{3 _#pѐh-uh A Dls[tpvBH[9TFxً vTp{-ըC8q Zچ,Ko)<$> 7*;k®Mѷ\[6%am/<܄BeNz~K7ቫmBئยu6Mp 4Zb[ǾwvbMbmv£oaدsX[`P-v_6B 잶LE: owo¼ˇ&O%@-)IovZl'P?\icؘ띄> b㛿=I 'KGc'wC_YOkNV0_֭x0оZ {7(`oŹssBϐ?[LiBxj돽8N!M |EI>0{>hpYjanm7z}6B|O`oKZn󯇞X7u->nu2>'z=l3>Wϰ.} mb߯-tb:{h)_yÿjә7,nB,ƫs8-,̾Vzm#p&t5Lc .W %뽢Z|`'8~?a}։9?\8;!ηLk8#78?2ίqq}zV^Iql !: .BXhKXߴA_>c'7߯ƞºוuiG$ s] vBKHةfヽ]pLyqC -1X˚l&hTIϧ{;zqέq#Z{/o"ky7\@ָf\pɭ3qd8>x=Os+m='m^|y|y wpj8o<[Ἑ9O{N<^x\ePށg9/{|?@{-!{ ⳱G.Q'Cm'!g7v$ kz& Octv0l;~{G{#GT8c'D&B{(B*G3 L{C^5~^BFbSc_;ɔs`ڋ!_={ѽ{1/MU8LGS.?--!;`ilOo*8@4wYfS;e+Fc;TkFex^MznqOǸ 9?@3P?qWWo HyS~ayЯРB=c _ֿn~\r&k@?d=)?G':687t[S@KzzڳiZiϊs{mʬSbR{>eʭi~vi~pI!&8G\iz5#'G~h0z<;_1?߹VS(7c? rԎ悗Ftq>żGdA:olv@Xhq1~ t-)wl ĸ,\B8x?|4_/:s~<*?mÊ?H/0(%g=ņg^>n5qLSx-nBqN!QNsUP?;8(i1_x8MȥJwrb՞O[ZzP8-:VsFA8aږ]Ly^Ȇlou6a"'>}~m^Y;!OA~=uP'!>!?_swry,jۣ;~ vp|GwʽG~aYߦ>’LBנcE!~NkW؎L=װ]0ۥwh;AZ?__E(uxyP7-A\ioĒE]kh ds?^uu#A8C_,ph׺B=xGn"֊u/ge){-?/Gk#_6=>?gC8'nFNs bo kXZ"趈37p {uٝS;W@-3yqd:x)ӟi1S8,p|ktsSc#31n{L v1W ,\k"M; s ]'!7`)EEȎG_b섟v KȍG _\ǣ)xԇ6žk: |y^.[evn 9wx̜'h7.r(/+M ^p=ƭ`}U˾37a ߋvԳ;3}+¾+ځhy3޿Nρd؎p~5z !ovըB3A?BEUtK9hs~:-Qӟ`sˡ?۱u^Z~ubK*8zdokZyӫpߕЏ ްv`ޟ&s?RV4x57!V !pnbO~)Ixn ~l'?b?5ekFgF?jO8k:ij:sP>͏u@gKK/.5?pq.$~7}; =k~?.X᜛W:^BOsP/=/yӞx[ wř27[)0i''k!7a9sdfϲHg9Nӱݠ!htwBГAWn)C쯘MQwt:p|dӡgY ;8pz(Ʌ,P'?p-84_l/߿6> s:'ЮYݒw>)'}ٻ|.q'>_B'ϟ~teӥC?Ka:WZ? NLZRS4~ѻvBn;1`bMw )f\)Ly"{j gwy^`sufj1OǞv^Cu\cߖW}cK~)m^­qzXjnMױn6]sz54"4c5t Y}XԿ3ݗdŹ+ya2mޙw`{xvB3δ~wP<i߃|`l?g4'_H돸Gu;b;t&.*`tӸqLU1-t[@< 6 +HxF߂K* N#Ưh(|7R+Wt ;bNštgˏ3RubpG oExݟ ]="Pt6Bi S;D&QObC !on̮e7;sLBE-z-aNһ _4eae!Oqx}N'n8Jᅷ~.V89cZwqj|1ss6rߏ[8Ho"90{#cqa.X܎~sAb̔v@N} Ukjt}芓PLpX̶q6~v C7avB=':)3Ba&f/V6ƫs @6'.?|//ͼwˢ^={?0 pX-o}>8iiǣ/ٹlJ#w"qÄ\8'9?8R8òOCǦTkV- 3>&wz"R?=cbE,cx,'3,Kl?\=Ale W89p# ta1Hi,pߩtW Jsaӱ?&FɜX?O?3kT !|qJsok#W o %\okSg|/+gl=4k`G5)KRC鎳u.b~~CmN;pN8Aw(:IzL kϧnB'oN83mi競JO ?'JO"ʼnu>#' $;;3Ϗ'R^z4)J&E(C}ՋR0]E|Z=I5Ea"t1?|cyGSwsLom%4l\I69RhRz)J7w0'8>ph=̯ҕx#6i7rak/lI$" |[x;α$]~>Ii%t Wġa% !,0$$+쬼20TXOX/|2(sUB v,a ܹndݟL$E˲&mT(ݫE@ρ٪Ƶ-X?PHް^LW vcbFeH"핹Q1vc:w=n12ߙ]wg[l'?7EaZ6o|߷i}oƎNKMW\y1ΞBW 'O6KJ(B$\Z(K9Ɵޙ&P4%<4WDŦboW,!/=ū&}}t-3ϧ?)azJ”,PXܒ."tJ͏L |Ps7zyR`WݴRCsVua!Ϧ^`a]JXux5g<MX{vQ#6wO"5w`u{|>XoXO zxc!G%^I$z?Pd=0'lCx1"q\0ᕇMÂn<$_tF$[֞0fgbk:arbzQ{|ha}+# E7{U ;:5ݤ#ZT,ဇC:}=BO%4b1s iEp91}kigg !sGFF*a"wN^rgDX-G\aOw `:@;"wkد 'v߁0-!c~x;sK߅V^~r  1؟i0|?֯i;5,/7㸿sib=/\m"!w8[p|65 ˳1=ȱf86q>}Xhfm݂\O[z[a:uW?7:וuaM׭cG{T+u:7{#4rϰ|߯lpۿO0OpgGכtgA{L'{vX݁a)hu/`? Wn#%u=~t3]w~{/G82~-1XZ#=Gh>.AU\JELU4a};*'bq]F\'b} Bu[?z 7>}8W tt<zt=ma>@\oazs5;z֭r$8y kpÝ <cs(=^9?L9=相>.W.?q=ȭ$<[a:p uspĭ0?u#wΝ۷=WA(뱄1>+ފp ]aCvM8ޢI"PaB՚\%ѫOƔZIxሺ!b@Y^pxB1N( Dgkdqo%Z`cb~Hx޶CvB1BwGBa/E(a/K$\ϗ# ~!- &by0ŗ !\DC'] t~Fj3# ' qpLP]CaןWy?sv]T)0"OFoW# ߏ?#1wx}ήuM"lP7꽦5 fqV[}b0kB#0SyG\'ܬZ7.m !Ǣ_M(ˊB6B?A(Or BwIn$B!A(NJ\&raODB1_&d{[W}G5?(@(?B {m=B16i !"I *\Ixh5[ 7l}Y >ppqkY8O#aowI{m:%b~\ {"T\Yc/'\>wҼ"t^) )"[=;}aSЋ ^%B1D(ybt0{ %l+ &5vTp'Wi]OM"#~aNxal;|!Ac }hy/ !􄺇[r׋󙫄b?=pIJ|*p?$P̧NvH ؤ$uO$}g:asBQRxB..]_%KwIX{BG85Y_pBL/?zY$m%,ۥ$B̏?׺po޽~pDZbLX;K!+~@<{ 4 't|=={($c uᥫW?͔puϏ#U1jܿDVۊ1XF;~ ~| ?*)A(l7P"^q1[X4>pF엫NM8QxV}(0،a]UB1 !lqX+ytŠIǚhB9Ul3Ɖ8B?w~qBX>?_( |E%2w,EP\s%c~˯Ksp={'bZM6a1k#_wi)K}瘎5#c?!Opدa'11b:w?a8NK {~|?\zj?W~L7}~=q7mq{\|6~8,xu!c=a:7.ch:r M }`:^Ͻ?n#Ogq@=y"'pTbW 3#0H9m{UGMxߝ 7}| +pRx~Zy^7x`,Kq^=? "➃EW19€Eo%Mӓ#RX:2#FXM-}pfN709r ]^o"ExH?8hEQ3&GvAFɑ*,60,8 E_S&ӟEouI$\X9scaQ ! ;D |^$Ba_aiDVRT'Pw$mᵎ-\%|V1+P Ÿ c_"<4r֭­޴]%KA(>WA]Q+JxxӟD+B`J Ew(2_W~үB~!oCzAw3l!#lg\;vo]`pw9`[{}ֽٻbqqa:^s" 9"8N8|r)8F551"2aN`$GI8J:{XB~\8ybZng2nߑ tͭ'0z_tꛭ?\a;Cj'p݋ln ppcf?O&XV] }u3nƭ_"b! -p"us2inϋon=4^|o3]cp~IrJ^qED~ y ~onMWܾ*wn򸯏~z@[Пc97^Mܾ8{7?r˵s@}盁Oϝfjo\筁W/wh'f`pkHQ`B+hBsD;M^OD{DshoqJEgb:gvhk9 ?X¯[ٔ1}ㅂk;F?nE"~Bo3^cyўĶVў>5x/Yuaw[xYh_q\`&֎Chk$c:^ߪ~ʑgC?kt`y`~[[w# Og]1w'ߑXu4!-_|ed;G([ oz_Of/5XZ4Mq˵cLXʛh~'? yY"!x=OaI$&}{>,_><_?&N.8e^:L~,r~\z'_Ѯi D?Se~5!=4S|;>>K7s>p9 B)iXԺT8/?7}s~_~蜟8~?}}/~x0O_ڱ~iq\q qKwO_5;Pğ "Dww ߗ з!Zvs! E<8:NB*a-Oח)!z~:!;./A;A-mr⼟0}^yP_@Q)PwQxBuPoM;K!O,2,pk֕:ׅո5vBn]Ex?L9]wtptXf @]ܷ9ā>跿gC q_tq qȹ}S?k֯џ}@]Ls +JhE1JfE2C(ơB?]Q;}P!+xˆ\ n%twaKGVȊRYQ)uKVR\)JaE;(tC1NJRXQ+V9cozO3lv!Gnϭ"M[\%pNl\ 9rcy^z|nn|X]c?+DtwJvEi(uNԑW~Q})HB짥"sc:ㆌqP*PanE u!P[P 2N(^3}Ld<E}pAKb<~/#); 8/'A !7cs8.8,(8,(8ҿQQ'WcxBxfSB? 1]_C1,߽4EZ\&A'.rYQMPtʟ))x  8+G"B0! 2~Cȥ "B+B,>xhXʉ2a{ڟӡ͛e\Ey(O7SơQo?{`<։'{7[xƔOay{LN=}e'EI1V2"S\2^ץ3I2C(EBMQɅĊ2~"`pU|_8_5}~<خpPm^ɬ;4ޟϕpͦ~ 'C0?KLi׿x_,'\=`z̴^LI ۹qc^_u"l)*!γV ʗD杻XѸ@1z8q]vLgӵuCpW9Lȥ8yܺec:UC()v~ua;' e|:ENQ 'u2>()9m08WCqe>EMϋ%B ~q,*eBEnݍݽJ\!>>?_Wϵ:SZ}K=)؞q#M~7|\X?X2b/|֔PSK1Βvע Goq~8M=rʸx=7-xbWe\Gŝi@(:*k#e|GEQQwT1?Gڡ(.kg_x/ĘYTޛjaVUt9ܟmWa:`S|M137Tq_8 EPBTGr? 鄭cʸ'P"L'|\'PUWpXBwRg"~eҏLQ)J1E釧(x_CT:ao*P*JE鿣(e[J?RE(݊GZP(J?HEo(m>U(?Qܒ$B韣(S HBR r}(CWc}I&E(Y\*|WUYK鿥ۋR&S +b:w/~ \#VvO|؎P)J?EEW U~1U82ra&f?R*b*z?Rx{9}\#|OHQE?Klkk鿪χX~,/m*;7#쿤."os;E?+,{Oį|$ t Rp?_}p 0?Y*u> QɊBd9cn҅?sx`yqχϥRwFߏWt?=c;0m'x_(7QkO1_}qeLί B߮(P+J$E(q-yt}c`ab }M߇VS~L/^8LR2 !z ţ?k_`Ȇ7x= k" 1= 0Bgg&aqI4# z/L _KyuscPz RAQ1(J=E/K^1 N"qROQ3(J}EϠ(ŷj#z RAQ3(bkP>C![="S!ևԯP>Jȥc~wt{哺<~~"8:A(u8ԿPBsRBQW(J EC(uJ&t(1"Oo(fB/H6vkշ1]*b;t{z}œ^p {/\J(sՕREQ+bԉQ~x?qJȥK=gEH(uoymLa1qD瑺=O(|x"< QR\}[(|JuELRGQ+ ,e=D(uNIWAqR^1cicsERHQ)J|E( Ϯ(߁((8'RHQ*J!ELE_Wq1I}$E(>(e ~'q+eEBQ+P))J=%EOI(N}-E(/&"Q"O #qe$EWIQ-)8MrCQ1)}2Qtߤ(žUBwJQRqe+E(~"KQEߺGG(e|S?2~ԃR\ԃRxBWQA)hRGTzQa/o#1oz=֗Rф͕'ebElo퓻^E/+xǡ~+{A}WE#VF)riϣ'ַKӹeW}|?O( qtz\:2"vmZ^DQ*?8?c~x?>/|"Ni+Bx,' v~_q<o/,;CBNO*8LROTQ*JPE(@Tm|0'RRTQs*B:^#@ROTQ*cpGQ*iʝ=IiB 1qS{W6 Ax1"q\0 E#3%;_a:LإG%^Bǡ:bs$B(]sU|3RUQ*J=WEs{sVu!'gi5Շ+ z~>`U +bL1 7}>f|n5g{ o6/P+J=EO({~,J} Eϣ(yN !|ahBm^ag!W )>oޞ ΰG'zBR'ZQC)JJEiO(uVzERHӥ"Oe!4-?X?X,/֯_RKRwItXREQ(J}ELQ2R/FQ(JE,ԣQʇt,scTxw#~X|^SyR/KQ)J/E (uIyRGQ$b^)J E(]JGE(.v, W~RGQ(JaEϣK=E(}"O)b}H$EOo|5= 'loRJ۫Tb:߅;."~R?OQ)|(u?/tӶr³p6 .ԅTtG`$y {M絧Fm#jRj:!B m}u3t\:[qf֍ə@hO1nPpe ŵ=C ^"˃}&gH{>G}8nߏ?bh߯qخL۩[j[?J׮]~~Dxg_tnR{ۿz܏sn'ݯ~=>Ojoz^ѪNAф"anޯe;E<.<~9Ӹ8L<'ax?8,8ϋRR_fgb=}\#sԶB6S;Als{_\:whEveWwx%L;:5;5GqE,>?]"G.B; d\VEԮKu3NBξy8p+GsKGs;ɣ/RD,>=ϴ~8~LnԮԾw8-nq?gtc:X_}vh+g^M*@Nя?_M#Cc~T"|B_>xkM҇OWߛ¾`xRwT+a০աi)K8#xˡ.u~qᶅ- &#D̫sE~(}aEs}wb:^r- pBE_Fb?FtFjF V/ { QtY .I0s0כꪘ>?=/p7K5[}J=8=+B61b^NJ].q0!HŊudEM ceQEŒQT u%b:'0?ƻxW36ݕPB.]& 5]qа^ ukx?.+/^\8( 5󜊷L; zҡDb^haw?D!O7c|g.tjcyN1^7>?֗P Z(r[g.<χb/@[fUv=!OqM8!/M!8q.}7_A ?ˏ̹x\j_|k86_883Q>xߚ6~%YE{*oh; m?Op? tK!\:lO~Ǹ7usq\@׷zx}QL$׏1m{؞qq!ܿ45ca~\X~B_@q|,@a]}q[?atomo !] A)_satcGrklwW۔zq.DȭWz{O\zד_S[+B}a:^!~ ~~!GI}Eqv~b:quR?R/CQe(rBO#4]( =xBL:P\P~mR(wB}.z$~j_Z)J'EW(]S$B)P(J'EG(EN(u.t'5%z#®#P)x<Ž*QkϧBb~ӟԔP(byyy>aynYT-\}a}c:^ Wu#U:0aRRӥ"/hh#ֿ{Poף3m=JE@O㹕ӹk_RoH~KUzRXQ*JEL~RXQ)}B(_aBߢ([~Q:=REQ^P(JE(uxԿVzB&P( XB7(`\)[Q|/P(uӈIO"vS~.u߿P*RG@Q#/RGQN':~b}X)}H=E?O*( P^ym3/L:"lW펻^M"z|vcw-D?"ҟ[Q(JEMQo+ (B(uV~ڊRCQg(bV_[Q(J=E7( ?SPz rAz鿭(1ۊ[Qk+JmE%ʊ.C aB(Vq:eO?W8,J)*ʸ2;P%U6B>A(11IǚCBx10!c}.7hC(__gK3o? :Sp?(y _,8*!֧+a2Wqte]E(*ʸ"pr M ?UBh|4Pq>҂?[QuV<`£>wPƅV+\b=P(ʸԊ2nL FVq~F,CPbM( A#(?@a DJE?(getE_]QcWÄ*PwW2?( e|{EwGq,,YvCsCPsEq^{P̧=E L ^QGJ~EW1ewmE((OQ)ΊQSv BLz^O\K{I΍V+E"l_="_i?yioߓU^\ӥ}W\!_#+b#_u~!\)Wv){FVKoE,x?(륞QCHQ(bGQ"7I%E㣰" t~b>x,CP񹤝[mXixK+7>>7W|_?Q'q>d} {ҿC#1rsa=pw鼖{X>"KRGQ &J?EnqQ*J?ZEW"ҏH8.㺀sqk| ۇӱ=q4'_8oy%}`ybsXU*γ"K?Ou(v/z,v"wX>fo7E: 1o¼x0gBgB{veMv6pu4$CyscsS?}bvv1Ys=acý]z/&˦ .9nzz-v fP)'r\[/Ҽz{P6aחudsV?%t 8EˊANo~Ex﹝*}%Ѱ0;M/l-{ ݄U?L7E!ㆷk/w$옧DEw븛o|N G}K7<3rXb#/9 q%n=Qyb~KzzcsOFpr>C'%v|)4*%B;YnrzoEcEwzb?ؠ5ۼ_'~7~ c~88W{_.F`?;`^_/{y|ͫ  |?m0O5\ Amֿ/{'߇6sq[OC\q&x>}3qFbmvUZWiQ77=nz#?} x?|nkF77q~Ǡc8_p~n7 'R܏7^/F=g}aQ>{Ծ~{c'+f#P?9K˾-p;zY{=Oq?2yЯC'?'kb;b-;9VOw~g0.i {ffcߞ\h.‰?N&Nºw|&,8>snF%,uŖ}5"lػAaO+.U{,mPsnXKƜ܄__|DBƃ' ]1WJf[lXTF`#~?pXlp5p%;^¡If.׿WiG^qy 0x-ֻ6pMXvlvZ{=E(O݄baȯy!n+{8 i\MsE,?>s\XߛUK(%uĺEM:mb!1z,)}nlk7M8ƉvLn!Fh%jz*W7aUAÄ. f\]{q!''u Ś/P| ?)꛾j--}j:WpysٔSb}Qs[s}Rwғ~>)??y^~zzW/KtKyKkzڑ~9M:/!tm[2nQ0]ﰟC,ψ vtw/3܄|1~>ojǴK`e7,v=>i`{ڃi뱽r _%rb9ONZ7j[tn 9vW{Gr; %Peq .ߝ G b.*t{a>C WŹˢ0ƟvBlg\:cb:\kHFNrYԮkN·l9~>xbsnVxuH'>s J|m8?6 g˃*Jq"}p uPn2#˜5W8]WpFxsO}5+-}o rU!6Oml't|.|U=+nNM[&~ٰ=)A|[* %fd;a:Q۽o7.]B BJJS/SS^ >iQu ]N;!>'{yMҌ{FXⳈv´EgXN: hyVbYq^&.BLNefF-%|vBq^%nBq~XB {qqZ>͢˃Y.en%zǦBҺR ^mZ۶B|YfըBgHO?l[o'|P^ʼI8IvBLqG‹lX *dW=)~>N²e#c1\uZ&t^_/k;iZwh?õ_ΟqzRhoL{bχej3b}^ z~rnz^BoΙwy 1,_o!1Q/!<0f]{/XPoZ=TJӛ|*Y~R/tyW|B!gCloOڹKxh/7!cp"R-?׶mp87Ϸ|K;skx~9;' ڷڳ}f?djO LgυThgZhOZhe٫lcc3=Wj=ivE`?Z~ٗpv3X?[Av=:^0/=ڱlO؞97CC\goG. MgKa>hjdމSϢj0.'f,λܩm9!h:)nEw"D{vj'Ю 쀴zփS!t}ȴ;zlO\?&׬]~/M'a==jW gEqyBjχp>34mMۜIjI~~'dO 7ƬyY6s1?Cz6 s pWϹ14;q?ԯjwQ7!^0ce'8 ׼"4xvӠR:RIlUWE<;!$N 9ytOԷ>_b' =ӭ߃}~yc}H?;M6.YЯWr<2H7!}}~u\Lx^}0(sglbm}a~x?d$]sK._^e섞ҏN,v)1N 6>pPv:ޟӽ.K1`M (ܥ7;-NchE\mE&onF3!?ⅿsz/!a:^oZ^|tƽoVGz?=~\׾6g_AxjDvB}D]HM7u%QwRNchG5KԱ_OC`i:+2׳:gS\e'\5yq׃k%#bq~Lua&׸2Ni'S25CqC(|mK\t_OzZas}aE-uc\ =sk '8wCKPϜ'x,kzqsqwE`,q0ixk\|0.nfj5fW@|!- sxX\\\ׇ 3izӝRϐ5y }ӡRog[ spzR_'!ks_F;Esofh#dw͏zԬ^.9d?9W-Ff\7kӵ~'AB_5u"ۻ;K!ӹtq?,o(o|x/!I{orVêwyؿaæsL8~q[j\u%|ͧ1naYm>ͬ6:-g_[rqGbrp&3cmWA x_{/Io(qԎKq!κWs/Łc:2/sbYاe>C)'C]6^)wMߧvQ<>_x^ȝwy.stj1EK j/h?cjo;`/ُ}ړpqWS^r`=!-II&l\X?krЀbXc[jj[]\USa⼦z\,/>P@2p:UC% PWуtoP7gBF41O.F-ԛ7}qbC@k\K;tPyXN_jw5].8-:18/t5)tsG\wW gn͗LOLp0u=e 7%Ci<@:fHrz}8>ѥ;ʍ F ~\};Izl86>c=4MI1~~G~Rk_^OkVOԗ47k|o@/X"Ү7<aϋ}~:přc1пm9a|4gOU-;{ 1ăK'ę}\X~xo\|7- ˹vfϵ|/Ok/\\=l/~ .yGȵ'\݂EԵPx_7bSq8.z۝B\S)ŸO[qG1M_hm&4?O-/3ElО0.&~_~\|Kֿ1q}A.N*Wy)3~81Sma'ޏ+jx51c\3.N wN_Cq ~;1L4<`viܤg7q82˳NgzY׳`~2>p`,Sin̴EgX1V: :50-#(q 2c.B\7ຂ[G0u~뵲eri.2>p7X ٕ"7ao!Tބ%=M?9d',?)X ]O[,q3{oe' U<vV^eX"uY{-K"]W8, 7Gi"\C(γ';!_|Hmr9qӵa1??O8 y8{+wh؎v6k!6Blf{-b;)7V-!}3)7!|'g|Iw2{y^Bˋ%^rΙwQT[Hv.~{ux;spԣAP?Z}mPty<;_vn WzS_{\/rO.jͥBj 13˗H׺Kn|'mc;uKy_,8 ['ats >@燦6i?ظlVJ?m|op|=M+Sl c[]qO֚ZqbGr0b 6qppU˜mEx=7_bҶ&rm:;u;-sN.a7s^ﶫV/!z@x utB=kQlFFa ,N՞O[ZzbOﰨ]Wq2c~x?v^EA{O8~O֟Vz=ͬCja|[}Pfw~4s<&?0)S_q oNs 81s. sZ<'1-/h'\9͌j[Kף=ӱ/}4}/ /2vZ~<83~W8?JwQb}'F{r77a~A8A_it߂o@ /_W2Mg!O_Hu ?ПLk߁k}?cd~GR./C8]C?0-?C5{3o6MtQMӍatiX=JȟdtgX=lԫtry4S:SuNuP[5cebՃt4}WFi2M~Q5Ծ?OlOzè:a\\ !3MgXT0u0uPt,Ajǁ3UEU'>/n5i5q8 PYqq(s'On;!ί b:;C87g\T1烁/7t8?LF-ۺPS~m 0Ϊ4.@1s:}cto?WiCi8%Nگ/Ǖ0nW:~q~_ Aȉo.. }s!6. |︞ t?>zXS/ncӾC/淦WK0߃Kp>Oqy,f=2+q 7L[<+ ?,7/?ZK;tYy{m%m@yқO~d.M<&6!fAXr.OzMug.if⮽섯xIدs+[a1A'K;)0ϡ6g?lbю nŷk񁝰Q.Ba vBL7ssbŽM(쐽[3덬Ng|\5yPϻ-'F˟wIŶffұ/g?;a*8 ?m \c1s; 9e]D'|PWʋM >I(B/E8΃^k L&k ;=;!ɯøE: -KxK=;9.p };XGNB'˧ǗovrXfヽ]0nxuJ%%zbWƆ{ _M8/z liu1uaWg,>PA8-vvnBnsvȸ-!c~on q?aavB+_bw&zI.Ĺ= }& n::M({=&aŭ; ݣg-%ZqUŞYAʑmk%&x;ii hg#iR+ {`v uVdPQѿvνзn>Ns4B=i:{>HMW'? w.h'auVjPRY|ǯ=μ"w{`7!w{ྗ?Ea:OsXԾ_HgEBϽ/o[~k$MLx]ύ?0޲'7^c˸AKċ1k:U9> lߘM/qA)-(ŹI8 7!Ϧv&ps;˯:NB{ 1Sz1?S^z67۬}mwʾ'P0-+t\BC8k½nn*y b8$lY.|bmӷ',M7q}Χ?AƨzN/}o{foj ZNvfWy~riZߩ]>x^Y^/fmOGLuH=_}m=[=El}J!l֠v_vWCx,j }h7-3{^o/m.|Ix=bqNb#7jlUqNsso','dTBGi~up=uq ;)+NBf'?݄x=ˋx=W_hyp>8sbS_uFˑ0X^||^=4?_/~@<P jfKC} Ukj#tc+%xovGv8,~-=&pvĹ+x,la%/a݄>p]Q~kXThknBq%z 9M(eoC8qZ6{J P99-zN.B?!e< ԞU{/<ڵ'E`Rx I+Dzf;m'$vmqs7 oA:;2LmX~q'qW QpފN}a{h{5fުC~8i)VıPDot2g0-n\c%n:>`C;!cUwph2'8/(|m6 ;=ha}faKk0$znm 3^W`:c9l~z竟I2]'A?O\IxsΪ"7>:MkɍW8>wxۿjeFxSj~1W曩7s ?noŮML?ZczǔU{j眦Mjzߦt79'_09S97+94kxn$;Mq`wf]nBC;w5ɰKva~x? ?u!W>CKDL편 |l} gZX~t"w;IverAvh`ڵqv~sv|hivh7oh]](E9کvկ졥_ph/ 3uAB̈́Rk3c4&k ~'d7!cx'_k߽GC-gӝ-?p;No"^0}џYwFhn%k>qCk瓽[+/y,x)}s<Yu߳k}eoh#tonm(mXzGIo&\uڗ'8 8=".PY9C=V X>fo7!`?qqp˚l&Dn@}?~fKfKom?. i|ii|?L23W~əť49/&]_e*R=-}UeӳE %=H{e6?{IR\̗k-\Sjx%\!ҭˆ\8!}nUBL_]$(_R 4Ss߱`=uVmq߹ݻ &<ܺDcwD˼~+!c>x,״=! ™= &6&ߜN9*}jx–?>6_sf8†ݽ u.L' Q 5g_R~!W]oSB[p++k3{^lc'c`| pvX_i(c݄6~CUt@X_Vv b!~5ꁇpfTR^Wm![^B!&B]ƛ0~VYǵaz;ᛇZ,jCf/qK=ުe#l<ksia)! yy'qYϏۍj_-k!L?g=[w~Ge_ lYp1auL\ǚ/KR#xgM?χ>H—vPx\ Z)YaŹIo p#v&#r 1ZX_X/ VXCvqpHm?JLx\Cr&43?%3¬;džʙ{i=$M*KxfS?z;pk| ~J8/m+{Ao;gvGdMb}Qpgb1 L>/VlaX=E{S.=a赊}|'0_yVŊ|V;˿H&bѠN<t>*ԞG=i2_Œ5{Odbɶ>6(|ͭ׿~k_}'k\)NBBXwU~(uvv^mFwĦvU<-W=t_Gg6Eb:\:2aή-.Y%l3Ɖ8BLYRa῿_Ciwa I6 R,)|e_~WR ||8.5GZ~&(}\g5YV{GGe\%_mE8˘?~87ߏ?F k*? '\|i`m [L"(f<I[nGROc$[Y/PolQ E6XlzwxK/N>z '\ m^!H7r'a7& #/sYa!Ϧ^Vuaι#⪛r/ z=lɞ \; Jg8nZ^4|ı|'O2P.b]Q.fޡvBLpAVѐJ';[,}WHO{.V:cII6D\$ar _C)r;r/L~ hk͢] <Nk Fг{E!9Fa:a6o 1CNwh,87 |sn'[)0(ݾw*ݤ#Zv· s}#9}/4Yq^h*UZ 09c=,Tl/˯ 3YaӰ=_gv@73Gk؀ۤ0œlE)?>73!sޘ_O!\oA}OM֞ъ0|W6 ˳Fx^a%aὲr~ΙB[bAn{fٳ?z W<'6 ,6~0g^A j2=q9?<g}`8B<ͪ'Uoz)|ejVo P|1wjw*}>#w8™k'Xk~ߜWjk(u߬Gq ONx>ՐBv9į%Q"'MCOp}o'>;/6) Q{5W>VܶzEyq<%:e54Gl>6m]?Ml _irQQۿL+??Z;y|nC`+{뻛^r?'W-j>\`[ q̓o%E0.z剶l lʝ}j+ʩbZF B9VC n~Pj81?9UW˩b%3}sh:.P{|{AÃĀHPBH]X'' ]ih}Y22 3<umg`1+b&#[v1vsEl5ekvECMϭG At3jk,"W"6&ز{"v|7IlSڅ+ZiўZV6^-UziP ұq7 @a }B |ZVɘIIn"z@g"ԓlBC',ܽ51t'+ky}9DsrJ3*vj@drBoü _WLt#Ӿ L.]=ZצAbsλR(" #ݳPDٓGTLBc DO[i5q4A= &v0f'Ԍ'O~#VL3m_B ~flm;nKՈ/6춮?<7Fo?d<^?UŢfHÕާJ9D?ʭqFq+7{#wr0"6N`y]mO=tq/aDD^^w}".Ap(Fh;/bq!Q~)Xi3"6OhE΢~j%Z}pXVϬ ?6G42TXGH0t3v=OIARd#~|Ł,1$_rX?ѣlpdIdꝴm/Y{vfNI M n6!F6x>sf;86?%-A,/Έ4|C#X5'CF"^QHp%W/bV,\I8}`s-Ya)<˱ .g3 ov0/(Ѱ8ш]9!K4: +WKaW==TpTK9H?{G5'?+XNZ~V/)4A2H|ݼ|uO昴(2d)uN8DhDGoE-3^A} YB<*\,fFb;U'`Ć=o.WpWӡ ^떄Hߏ [` qӷ1e}/w"v{"SuN͋DN&HK)/ئ'pt)$jNWypqRIttorַ2Ϸ[YK@ooT|n|秵Q) *2qy6yXy4!,г >se!v{/fkoΟFv1"0 gohܯa|-" WXlCMwR=|z WpiL4L(TCt #HЂw8Kddisz#α^5_4 \ݽF/z7Iy6G+n#T8s+8}""xqTz/\Ƚ:uNݡm@]mHݝ60GlvCghlpT4^T0#翸7!}BO>_UN&/:. 8UW4+g]^Z >?Xb0} Q$q?Ab?F"PdLB|Xs{Aphrcz'iRʍ^/"5LPPf43Z!jE@% ۸edUzlT&w:H)|zUliv q&$ b/ײ{.$פb{'"ASl,b"u8#V [>)bV_>-rG_"O$|HĬꚕ3SyImbPDzϘC+r&wF4.ԷEP׻ߺDa翞fh.iڄP~nvrRv҂졈JrGéܺ9UwEK~Bx/y| _cՏK"OJSN_[h<+rVw^%O WZ$OJ,/c,4~'\i~h~I)H1>|lI'DڎE&zD0"="0P_> 7-.j{G0O1]#y8t 㡓،J>_FϾY3K+E 6}8n-`|UM\G4:4BYUQKlrֳy*Dp F9KhsQЪISu q½Z|97_1m5;Z^`»þN$ፖW(##k8.s[*}v5x|y[wѺv1'-P[/=6CĊvt:>OFٿCFw2346 WQWLü紈4?#>"W>=c5n!'3Ůz`qM^PBK|kxd 䢑>c Z|6ߞgrov/y(SROq< 6@.7`B.2UsocOimez3ߐ[R6NMsI%1fvj+-s.0q^|񕍻,q&6YU:xTR>GF$>Y=kOuN-Ί{{̾;g!ts(4sXEWvA;\+WxZ{w^gM7d;?B.pDϪz6J\DH^&7?@{tS=%a}HKch<{)x6S^SlĎE#vshhG8λ)6F{D`!I4zɑh4hgH_ph)C}i4J_HD geil_cvfawEHdωz78Ӆͬo-UYp3-J m* zUXX|2)νR^x'˶p0H|˛WNU5LNSV#R73cǷUGb;\!ssj+ Rix3Tmq?Ms[Ui~r`uM?4q.-v}?n=mcr㕓9!6(t/ VwAڿ/uG-`ᨱ9 h=e>1&S9_ Z="m=uhڗLFL5(Qآy_Cw% ^.&\tƫN[$Qq& HxKpnt_ĥ 﫸 .QPՊ*WqFQP%4 Tֈcz 8f.P`!bxv'D]nz":<,0+! [EyV ?0:ߍF3Fi4pT/ Q)HW*OB楱 G%YJۜ$ tA)t3p΃:]γ<ӶH} v[xWwL:oz2&y+~<}+8?6Οek:3!},"GO^XShD DYRDDpוb5>'F?y ՚'"zi8ZIlև"$4>|x"(e q]w=j=>Qyt|^' k tE4(ؒ4ȑxvUOD?Mo߄|iy>}Bi}:qf$"?iFFj0qnĥHD*/뵚Hʟ|[aia+^-f#ScN) yfL7w[wmd=ȉ.<MrUXbΙoB8]]˹Ԉ3ak>kw]+qaz>SF4X'o5&]8' ۫C6b;NޫsTT;of7_!"A۹nf_Pu.Xi{YNrd2 |6߯F1) ދ\*3&k*f]Qw}TAd >K0w6:_of o=hC=goE;xh|&\Xxc bm>7/^0e4 F,ubGy·{|mRq, H`]ȏٝ';YlKٜ^Zwz =]tS$OORL i3u0`APP:PaQZ5Դ14u@LK5lrSY> \^jsA)hBd:\fR39gdP 5)T2ubYjHM ͙*UMTc.3I2SDfJL˘I`(6{ ֍iM1S84!\[Gt1zDfjLI`((F&DFj(3id̔62Nx/WAǘ﵈sq*{qWNaX(?D[5$/k&~)?'L_D3&B0LR fM0U*j)ƊDgBDfR_jILe_JTnzʄ5'qx+tf8xϾԄ~/HI(NT;6tAMJi9SFf+ lWtEFǵP`#LR jDϬ3J0-<2 b!-h6+4YΙX|Y Uݡ':D "[ Eq=)Kƨ-ҚX^x kJO| 0>IAWi!7Z,= 0= %2=WH$#5+N9lG$,g4Z(ͣQeg0qa"lшJg#S>,_=XU<|a/Td4[k5lt`gm&{5C2xxY:)4ao݋nU8O\o>5+صIuW àJ?aC0C0={HDzOs-s+|~ ǫ{]0?"833yq͵Cn-P&Pum L˾DQ dωh~X>|K()ce*3PƐ#2}Th(p ˶Dn귉h~`)^#/"?͑^%i8}?^8GMu;QF>ƞ;oExq4\5s#Ab{ C'Q2cjExH2_3Y|bvgYk{3p$qY1uft[/:ZѨ4#{#F; p)k~@} D,m'l(?vf ЋW/TπV-(gpL}f2ܤ4 P+>Kx:sS4 n 7sAw kW{*)kM:! bkx!zMȽ,;"e%i~:T1@LjOM NjGd&L0Ɉ,)IGX2›q|aMvTO)4сJx$s6xWqAYJg ؁*9U WrB(9`QtBQu B)9,?Ϳ>HTrtDÕ4Hɑ K,'K屈&Tcon^|Oi '>I?O3#: e00iN6~F\۷H:) ifkDiMH_?Q?Z^دS4)<1*ɋ^l yerlP׿ -[?.%[)ŖUsԭ1^\#\ix_:3#AnhFT6`Sn DLI/ﳶCN{Bf;=4 ~tuJi^zWۻ|i>-m0ЉCԈY,)/s엥{k_86}_hwE{)7xy^S|) |a}r:~/[sP'/a*!pى .c?Nk"ceq`8,,a| :}DkLb?d^lFWD" 7/m[;MF^>MFn{Hs|xةu tpt%L 4paDj}P6F@ZUσZ~/I 0(l ޓ55gc\;d x^G5>G`ĥwF F\}ַNh|2#pw7f'64Vш)˻?@4]><[WylthxY: Y>R?L(=y˷6mHeB L2E!W k{ z# 1Kz_A%qpM$Ⱦ¡)O|ChZHFS:D0#*sU/6L*$ D)OjPS? 8tHLMق޴AScqƋpy\m^bH׻c@t7^JCv{{]冩qZH;݌%%pZ.")7ݞAu.L,\2Q~V/XD+;ج7t~ᜦ[NvEb%X~ON~4>)^C]{-⸘tB}9HS}{h]wALs4nb"ohY(2A6೎@;}tXڡ#x78 :1&:`_[.y.uf$葹@>JJ[يwȐ;d*!CVV&˲;c֩0w{hY"e[J[J泂\~ٗ} Yf~ᕾLAC9@~Hz4ufdS_Fc4;E'ᖾOgt/lWg/d/kHeVM}p+Ȧ>;v?1=qĠk['J^F8f?|/s7KO7<7=ǸWjD֐f/H՘z^v{Y"w qbm;}2"})(/h "?9hơ+:ۿ 1q4>dَZD`~ )D (TɈCG(g6Yd#%1ӴFKI;!;&JoۣYC>S;RA~d=jh%i `WăߋWH@;.~.j[{'}W/!L‚wY1sݎ"_e|bi@*~ E6D3b#mA9JدGgkDk7S'WD~m"^~8vgsG'hEL#Z/PtRǒ}~O;/^꾠))Q*WS</> ـ)|H@YsLRhbnJ*6G~*Q3qܮ6K.q^kz}\B+߫`zKҭJ+LSs}5ی7V`1TV*m߽53byM+7(uR>|*9%\|$\;r`Gov"vjH4:x1~#vW&g8(皝|}߳^(. Aπ0z9&:p܁ o yqΒucÛ3ؑ&" rEz4Bt91]b0!EN'qx# &P h ^]$wmw&8n`.q6>TODV;xu[U bK,z_Hހ> QP,n #{o{g`J]?Y&[HDw}zW5`9k8#ҍmqL7i|tcnD8~^`oq X_%|L(\@h0+p'~W嵥V7_~gYB:4}1_|b=Dgyأ#ؽ؅TwdI틶K[١?ҫG45 >8ڵXě3MuGzsETzdydDCH#Qa/\b1/^3 <8y&A{4%k]iQHoR+/DZ\'ӥ>&x>B|Uä%[ ~f+nj}#pI3#X5fb5YktCvX8и8wIDL+g*iux.&ZϕABi}G׬/z6WDGΈ`l(|(DpͿ[xͶ6` (qYXĪ(a,ӻǒDwE,ZC`.n$@ bN*zDk m#r8Gj[# "E DpᔂHD DWox¸hDNNUT̿ AHF4Onx0"(9# HD_pۀQDpĥ+OE|S_"Wy8# 2DTGM^;V 63 ħO H XY>8 )VDZMP"i."}S9 ;" H)Ti?Kp#D:?:^t;Gty}wEW~`!HOJ#r16D{Sy$)k@5h|;"8{ֳJow֗@EyWOS(P'"J4?!{[y}i=zt{M}HY*wsyLw*}Hްuv1~Ui8ynSg9)+RBI Vʐ= RtB1J yT?oqjwj] Ei$fV/E H\a RyHU|$e"Gz٥??*^y^暎'VrM|[&{ZUɯ#%ʞE*pܘ+=Ow{1-k6I} 1ZGWDS8QO]W;O [ey%'tD;Ei4=>J*Q7t>Cʻ9i8kVrBIhnd͘7bzeOSq&ǣmi=xtMەʁsm%9LR|>OCm/%B?VZY꬝Ks<-oE|>0!]G-3QJԙwAI޻k0_7?Qz:%LOGTCTDET?RCDE}4շQ}c1MϨwkߜ{> 2ETt_R<-Ճ 7ËtߙKOmwDp;="Uv샨dW¡fDDN,x~D%;t5{ R; j7'pTG8!'XWe1~mV0bs [/sQPNY4b;9#]%qXؒV}6 Q!9{oûg n((.="^Y e-#+ѽ_aN(GiZgXDO#6m7 vSku{ ^"╌Hsw]' Qi-Tg9by7W>EI]pK4Y-u-k ˾<\Y2[rѶx2b·Eֱ }oa/+@9a ۅ;5"se!wߚd@t,;iAPDz8z|DzxΣ;Zz旖ևaGË40lZ~Z4}àJ?#H"i8yʳ(猟?H OIi8ɯ,/h҅"l~hD%t|7[TڟƯ4[Z_|tCi?ާ)W)\tL3>z"~7_!_4VBlaQz=<,ݹtDWtU-Ɉtw5OD_#* |`WHT@nmHӧyg LZ/ tu!4ܪW 3]6D9hWNH@hEi=vH6:<_y?PrDE=rqR*S%=  wT/C)(U^q" tܦݦNRH}:BTި(̉K sWcTC&/㷹 *7QR'*4}qǥog FTOUIh{*72y $:(i})G}{Llw,go5"Oqug~"ʐ:?O;~oY:gD~$ٯroO:/`;*ֈŞ"~0/n &DtO99xiC8{5/<O|6O7 ԁ P#pGES$]WE A$o^?CnlwC©K/yU5YSQ\8ue] )G)}đ:= RY:_pi(/uQF]vqLi1:D.ʊ6WL^~q8$.d+o~#w,-Gd89lt9;Sp):ӤN6K!n>Mo"ŋ7]x䮼ҡ._~TLf Q] K]yK{,]X-כ~$zJS#q6A\&~G#.{"nJ3vvzx; ~Ո|m/7hcgηc'y|8}bX?Oe?-"[9D4$C4'=]3O#OisTzKkk4]{"+ˣn}g:<&Q'icgFp|{;Oψ'G|yu>D.# P#ۊC *V=_tzрKXݣTQx^0-s+:D< =ˁW:|:=^׮Y33\;t~_[c5~߻X:$Abus!t&84 ({ޜkvncw\U#pY|44\RuFBu7 ۝b,/cbts,?,޷=|gs\Ehp;?lt*7eZ5HalܙHexY: )[^xo*{e1opKFzfg>m^ԈSF4X'o5&]8'޺˴! /j5M| LG_sϱk9z0~Vb{vb؎ f˟Yج^gJ&7 ɛó\B}&_xG$7ny  .TK\>>\"y->Π3<ӥCfqJxY:)G1#J>M'v6ZDO{Čá?W՛OFe-̈6b*jkrh>n/UEfHl}{`{-Kξ|[.ղ _&5"{Gb4W_ګP=lSsqдYDzex?ͬoG־Y`!~Ӯvm3nL-[jg܊r .kZzַs*L Hn|}, 4s[E7Jj " '>VWX|ǻ Ztc{r[~XoMd3/_U1 eGE:Ln81{{Oh,Q05E: -bC: y&i@oV#.Zqofoc{/>!*JQ~cOAuYUQKlfHf竓ظy 7[7V;B~7h/uHl8.s[*}o@Z[/JN sKq6c5DO@ް›qubNZ?{/ 2 V?.pt:>nAbFٿm/>mc>';< c6 B q;A nW9c {ǀ~gϱxXbzn$6wdY#^97\d@r(PF[[Pd:~vkRP"O?> fﷴ&Q]7'JrA3M㋬Jmp]hOk˗'~gCmzzXd:D0Jce}:/Pdy_Z"χz<-yҼJ>Vj1|޳vj ZDz^#W OW}K[(H]X)CŌCu;zI 9*\w@B*DvPzgCiinQ!\]!w_&P`q(?5PЛ{ͧ=~gl~YEr c9Zy;I!KVA;/G;Qn z;ՀS#E{j+_Ekso6}0yDvN[dWkQ<{XXGb|,]!޷tg>e!xE>1_{*t;F~gϑe/K 7Jd~%D?OVPʐNJ ư|X:o+_V_fa6^Fz_Y/`|_x_{Yz"&'q|Lsp:omn M]e-'ˬ 2 _> 1[5qvN #N1M(",Ԭ'Mq[8⌀7bȊ/4?6|#nMG!_٦p2aήu4" ã"/.v(~?Y>C_n[ցuu~\i@;=AxΩyb'!^5 ?Ps,E -SN8!~uD.s3h.1'?u(/-OJQ`cR@pV/X^~ ]UwazfWzvB Ad62`z\B\a_ MרM^%{QO*6,ZQx@l0g2[u\ߡB,;i_Dg~(\q'Rp-RQd ?Fsq<=J ĬNHMg*SYшzt8HpUg9nmHKaᅉe0oڄP6EV H.?KsB+b= U5Kwi␺+& p>MOISpH4˧I7e`7$X@CLq`J'p4<鱁`n'= <Hg ̄Tf<ԟ-%H0 zSpFqtIA3RJ?uK)9K˖(')dg<}]}>83wT)|gvYJTu۷鸲iN+ߥEƒݝ#G}Nӻ j#-A|Lwaл,;J&kIp:mһ.RC?^QKd,-1O+9P :ْB:ؕ>HHfdo逦>f@pƕW9x2ӂQi9)(]@/Nt-Ă\ ^`_9fًox=r$`s ϷlZ~y+7'•85ο|9uvhSmBYG3e^P#kO-ܯ_:;F#TQ>z_˾ OD>Ht.OD6oާCW12l]'MƔEg~Dc}ݒS9N1/~oC<;. "&@#-٢C\GTEAhJ^Vn#:w YX9mЭlFx TJZqKX.Ю"OD<zz/DN߷2BHSʏ/%5yDV _wA+}i~i{MX!RwĪ !'R4>8pؠн8+'S#p~en'#?懆kɺ$9D"HDfCw?8}b FTjZ>ѿKҿs̢QjDN`(ğе% VqZp,pM|P`37fbJK=Q ,]:qK99 =4JWTywd5lnX٪h%_仙J:.EhFV0Ll Ι8'l[8>0N{Lk_`xmb!JB7;uwɐ@>~P䘞76G"L<K.:Da-R02 + 9HC` R-Is4rpFV"L]%Q0)@T%"UHR`( )9NNZpC<C8l! W!IG"xXÇT(̓O"nهuWs?gapQboz4\|cVPc"?4<p2SH]RhbYm 9NyASqXg6ϵ/z!>a7lw78wV ij+.A<p+IuᎸx&_dَZЯ!(:89UG7Ew;2""Ɉ4--/ ck/]!=`D~}iSptwX9ek G>) 5t+S9qkU)H$ +?ɫ2%8>%xUD? iNX]GU:\ދe@`hd8!x¿k>MK'TpF4מ˗[jHp<5[r>CA%S}]\qn0|Y"b]kHuc-b9i Blk SʱuF"̥+"?ʛU&qΆ3H`/PWkAl L`Gjd P| gX=i b ^,ͩ?OT3qcr-ރa7Tt^L:~\2>TJG-R7ϊU!SEFTɈgӣ\{?="+G M`-m[eu_~.M%e"u8#n ڙ]˘:y!}K!.5HLC|" MogAA)FAS@p##AuA5k ?i9Nw]^[ցN>4vJ0~ Eڶŗ bi@DMOiC,ya1=qL[Ҫ` HGzIh>榏^9 sdjlXqvYpc:]T{AjQX>YShB /ϧ|VL.M;Sj[Hg4-SEt6Jy:$%_㌬e.CEoSFnBl\.Gn=w} Ŭ3jDQbT`0bԵ|FW]& { <_~OK|~>>_gJS:[NvE}D#F@}9ؾ['e;ze=:m'ֶ'#N" UH{Mb *>C{ b􈖦GۇgJ;pn#,P kSh}(J_$:k2eJA# m i$njނ[mN.G$+;&)41@6)|~?g=f}LٛE,KU?UŢT"@ ԍ/'$48ZI'/a96`(}4|~6Fo?QA:E7ao_U2ΌDL#TL HTݧndEa3ߡof8R{ Mt{\>+}+IL]됞i?3Ae_Tť_|:c04c3 >p3rs3G7 LEh ~ CT߽mmx Fsxh|$#sLpy]]1%⩀ٽo`Bb%Kb pz-3+2x0iqqCzjVDH$"z-[9+y4>G Dzs \aZ^G^ݿe4l׀XX5.^|ةu x-|g¥⨘~7@acx&tjxa=~ ;ʇ|eg+[Nu?.#\%>OEy!vz8uFmB2V\F#Z"ґ>4䛯xA ÃCX&av<#* x>w jg9jt(Xyf¦4 X?jVZ"u K̟.ԷE61g(!@pmH\J.TWvxoHÕӍGz]I-]7VXĔvZW2!µwCȧc),U;H_DHEb#f_)o)41T@lfgt7t>,FM@eRS˻?[[?xݢ@?~Os4"tƒizE/q8mY>RC~Z8S>]?$?w6 uJݦRۛ"nR,k:I=O qoQ'bJ989<{Y;5hB@×86ߋ DF鴈4Fn-Ft #$ d[8!w?$r?ب`ɧ X4"ޞiiдpSVE<OAJ?8H_+K Fb9nRE)rsɛ7\XX>i|U'VOFlyfe#@ӳV͑65}68Ji=1ɻ%(_*V3H 4XϪ@p\2E'kbk U-'vk\:z‰U禱X`~y8+"U+SE:}G;*x)y-q?/ wX?W]Z8vߗ*Dp[!ykɯypG/p{Ts wk׿ x·; >~g5+g M_nYVG7o>Ly'4 @>~Px"=`yW N,F=@D2A#ݳPā< p>+ƶJDs+"˒~H?Ҽ^ŀw%v?+\+NE%Rs}фG;-|p{éE)Jj1In?. >s|j ԐvK>o9N۪΅t;zDE_llBVuqvfVS .z8n7ΈB ךuM;UbJ$"v;7ͭC%l[ڱɝ Έ~b]}a yM#LH@=s "i{(=?pQ&$?+bZ"Vʐ=h nFjoJ4:AT8QBd..peF0bV,\3ծ( Zb\HӚ G]cnOD[C6>{T?o 8o2b{1mFDb^ ǢD@ «'~Db9ƅD`G[Ś`F wRKdphrTW"ՑR- +Lκ 1-,B1qAlzE=r n%Qd}/ZRfmHJOR(n(تlEZ)`RH8nO&& •򫔿[{MH84(Ћ e&sL,R4:Ӥ'O_RgJSԹk=+9:t{ H:p=tϔ~_-+Ip={ 2&!:wE.:/+>aRxC7AUl^t0 ixso|AHp%`,vM<γ鼜?6"]u ]l;n"]7C|C0"]&Gzi~캈!HףJrﵜ+7Z*oHs[D~Y~"I?8ɪw/DKnRDw㽺bM ]YFg1>S*ǙCFR֛K@TZGvuL Dڏi?hЪ"h8}_6հ#㜰1'HAɴJgsP}/:.QVh?"NǢ㊝ߣ,h գz6a\~0VO:? W0c"ۙQ tE#xn'X&8if hWN;v_SC}Ӏ63_Hz7 nqCtDDֻ9LBA\ WG{!~Ȧ{\WzB uBz~X©bH/|ֳ `;t-"_iCO OOf$\A-r?mH(5PuM5"ݧt}M}L.}Flߐ䗖 D.=\y ۵uB[ n}T6qO/\ m@7O'S/Y}DI3G>??T!~9i[=|p? 8vz{|X"6u{9oEx.oP_on_8!+320y# f ԿkӳWͩyJ?n鉒(fNkBn uƐy4&#a/+Sa. hs 5:ul逶{^YP6/{k1=8~n7ƪid?K9p`Qny7z@8ؠx"K888\\8.3q{ߑD&F0s{{{Od;ڦe{UhU| :hZ[3gX33ԋA}C &5R(,=ڀ%Y#rP En^ZMo6T2HwTOBz#R-uztQrY!=v%j@]EJ`xDWxXJ&̤wJZ|x/{I{*1|?Erm"WvYpx.tWWv9QwM\FM/<]N=ϬIt[m6_-⹍u_CKeϳˬiJTK'D \BdZ~sIz%GCm!wХe+qj9۶3$CT\ΞatteD)\:-^Bvb^z7ӎR ˯p}3Zz)RUe".mge+Gi%JD.1]v:tz-~s;Խ|pI3K=3vK,|<Ξ}s>i%o WlY1IyKm6MX"=GgtX֘ }5ی7 fGFNQ ?7(X1{c)q@{ho0rvn&|Dr Msz\||#v跆ݜ?qvvÿ;!vn^t۹ږ"6b; qJ50_>4B*a^"V 6-]!w[[; ſ7dAigM s;}Q|4^F>!V?wiu| ϙ?nѾNzy'aB |!1֧ 5gB~*Q޻ԟ3/9/V`y,׈|Ún>/0pEEk )xϏrT5H*5[ Myމϗ7&s#Oz~$*{OyԈ@ztg EkC$besFa\6qCl|8ݶ|>Fogn;$gGG8i\i.@O"kz5b3봈7fFWoQߕR [U=؆Cdߣ5C4=oξl /|3ڕ*7 outDҵpfq~i~O⼓C{g|u )!8kϫx"$Ҟ_:{s q͵CԈ3ϚQwpvTxz\ת|y'wVqӉ0-"1}WO{Xe_C "CJzNeQ/}u'QQj=m+$*'\S*CdeB@ r{^^CՙISLLB2$ޗgȾzxC-Ra:p&\RWlVlߗ3{b$i=qp0{y0˶n0a CTA!!Scvk<,aa`RயM4&d.0r3mF|8/<(\bi,_ⷱ0 F}Q8(rkFAJ#uqC.J/~14NHKjD1z`yl%҇q~̐]JؓfI}hTYxiE;y">lq$⣇gx g f+y_ƀ4tp Q@wj5(0@L^+QfE A8 xc &lw9K HydjJlov|0 K?8 U\Qf>>}`&~0{`?0&\Zi@.Sr. ?u^"ZDK]\JD럶I$x8%5Uy_ۧK}-tS89X0g:j|Yad0\i5:̥ 7X8=>P PK\a< K_EKd:vI/ 'RK%L\nbYT:躤Q/MZU9c9&nn߭2Glxyɮ !7k x`~cK^/Aq;b+9L.K@ѧDpH׍WE"2E9H/pt$@Wt~bgDzY [pFocl3ge8gb@EDq 47 aN nih:*4?<( hyX}Ǿ>ڙ/u mꛕLڈ!dz\$~|]Dže?,84Mѧlk\⇣ "I4g./bC+m'E̟1%q4'xAZ w Kk{A, ȤENK l E9,;#0QVNVnV)4>[|87]x\e闉~/#Z  Q* qrW)/QZG#;yF$"&߭kįuϭ8Cnש[vꆝJn&TuFY֘8Dp)# \N*qΏ#Ԉ?&D"؈5yīwATj?~.:U'D*T^\"_*T-)q{9{lm!x3@D^5bz?UwYDn fy~@/a f`7Fxu }cD310a^;"|h 1b0Aܹ!} ˤCt,f|Cof}~X.Χ|l3spz)|mk3{~!k,K ӡtnoK~80נr0F7 ދZ[ool¡޶Ng:׶!O65P{r*A=`.%qдYZD0< CJaW=\>܈rԨKGO-"7NDy:}KR[C鏴,{|J$lK#BO}r[CP ML 29zpWLiK6dLHVQJf*Jf Hgh̜ojA=9#G .ֆ>ET#/JtwNLIw_/2>pxшTwv'2! >'ov;91XvANEbϮ>jd[WT%xC;QT.J8ts>I1W<_6LDS z" !E& Et3jk V?R}H ʵnIF,XaN(b}]@,~ _Dz5{ݙjlW" @ʐcvr+"C#t(9 ՝#ٞ-{yx"}3"[QċjϢpE" ]@b";pED/š.KF\9s4"8ĹAÃO@VձPD?ǭ}6 Q!J50~F׻JpH2Blajbs Xd QX8и8vK@;c0b;y$"f-]|F#½\tzQTޙ#BCQ~O>#p1qA:}AY"|GT`4']둈=|g@|ȓPw\k=:#PD{O@m~nUpbDA1%RPD""EHA/Tͅqшak= i?G÷4Oսd H̍ӄ{&D ~eS N+~p/HH~}"&^(o "D>z" E/ֈ¼Dp߀H?1k63J~)qpOCs$" |ZUg'NQ ގxwDy="{{D ) $Rg^pϼH^!½"{D ̋-93 pH\4p/H^%#wúFpoȾn?" 9.}P"EQ}"az~΁ Vy! Z hDNg| WIۏ7*_}kTE'@tIEHq$ ~Eqt?`D/Ha*~u+#M~~n"̐/".`T*׵E8f}D:Sf] Ҷ>N=(y$DA"RV$Hwt!3"?twdD:?W:n^Am:~"wp:A+.V# [*?"]0 qU5wBw\큸r.6^!]EHt}H׏t}IןwLF$_5 ([OzX_ZoE#>g&]ʓ~kT@TA#="ħN^A!*0(D%=˒H5J>Q2ezIQһPrcN/-KH/uTwZoT?)?'*oTI0!j7mE,G,̰޴Ey>=F9!D":qMk)cEZDa#/:ODߥ_TEbO68OFhl&r~[lH'h;"XH:Έ4~?xh\B kVrF?L%h3xhHU|(ӞNT^iLwD!pi"iԹ6ϚHb'iJ_t辖P_sTOtܣr%c4¾M_)JJ5-Wre!qtCiq^)~sZIq v.=lH(E}qF>;bPؔt_vc]> Hv/VlH?  y#]Ŭ.sEv5EG"ajW{r=`GaZzԉv2Hv7H? 8ң33J!AnPb:,!4i"3c1V<Q)?ԎMSaW0uETrP>hVۣgdZ 4~MF A4;"}o座' *z8)_zzE#ExJ%]HfYi4J$?4/m^:#rB'ЇC+SI]D(zSa]~3bDrDDޢ Cl80D^;8thb`f>]=ph-"|Q-*uz7;&=<=D)F\ڤbW?{&&湲@d^L͌]6ek<]i].!|d,=/D[k(`l'u7W &ާx(!d_weЧ`]]5uit RlTDO:S SgwSg{TFoYZ>/''CoȂEU F̳XWD>u~Hé32+^D#*凞c?h.sSpaqWD%2=FͷvHս-SOp/E^dFޓzqz֋!H;z *1t߄}6^'$#j/ ou_vH>~6 ]~Ɋ4K?'tCJ$"*Qyiv פ"-[F;*H3iYJUz0xTJAKD3n籈tjv鱾nIJxT?etVzD22~鼅Sh?"y- >"+KC:Uy<:+-+9cޠOTopu]}jςOv Թ;-l䜮ciS4E; rq(sK*(hOz'_zz9h8)/To(¯ 0Lpf#[7TQ} m4ԎAnꭩǩ?.jpg[>Ώkʈ>_O~ݏPo"JeH_i8}}va-x"qA[pl,"_? 9D?پ[Yu"wct۟c2{ R/FT%{*p %#C_gX?d$Uߕ=Tf3es?Adz`e5.hl;d.K~aOZqݢ uh-q8<䗼ȑ$u4XvvԈ,uz2JډuEq-ܫ!Rǣ4VOSǺ+s*8IǮ6{ЙpK{"s,R0rD~gt>6$Rp>ql>~!44|ܬc\ZJMé\֮:(ʣఙ_*kyEIRq2M- "̪FT9OAHIG y& XݎctKS|o>/S/TP bƽ$n^j^<~dk=Ok>||G{J辯gbUe.>]*jD;{!rSz>ȰmOK\pV _utÖ*}?nkT j["=ܛ-4 =ܥF}H\ZJ#뿄}hWRnZ/b@ډ#™<**ǕK5&qHNVQ _c>ޕ;4\'7jMxb}&z#x0s6n{yB7OyG\G=eI3t#vh@Yi<_y|>u| ̈́\YxZݎR'=T!y5ՈݚMn@>: +znCՍ|:+^k_q|⚤5gP#vϟ.X#ݳ|֛km?hMcg._C\WjBUu-̥^Z gh{!lOVzD͠8Z_oSI\~e rԆ/V,]Hk5KB$n۷Iۘ-6-^W/^ғzt}uvj%.R}Cp#|z NɩF tZGZ_ "itB~Yb@ 08 o޿e.< hj]c3zRrq[.0Qw}ҡ| e~,?{%9t4|Gxh;9ͧ#e++Oާ%>,lzs>ݹr8?תR͹$|wEF !" _!pKon5- 8E`/S<ij0gVZM)wlmtݯte{^=hL#~Eu +>+t(?f-XJ8b@j'`ŹKx)}]G끻xDvXX֑9<,]hssy=bV~8]b5"5; c7qV!\x.=UzI%~Xqwblkiw3G~zD{c&OdAu/&{GnΞtuJi_@{" g$?jy6qU&wY4G.wz^ U,1 9/}3wT`c~\}=[mIuj@.7_SyΤnEyZa;uSϚڡC|>&ħ?>]t[˧?F9" `^8ڐ{,/M\~,goN?!r ǣTQ\^I}ksu^qCXtymig]>vZl\_-&LN'Z//~H?_t{6q1fۊ%*ħSVߟL,Ư)]]E%al|kZzߟ:.v Tc:iqo@=JyzF{6Ư}5bX[_3n S="菵i/{_6a6a|P\]L+Q6b.F:ʸ' S aA-׫by .lN+qvʻk`s?ybv{o&}6OO~7.ͷVy9+u[w~q?ȡcߠzD7􃛺|I[u+֥տY'u'G'SXυ 00 u$ O:Q oĺTLocko~ zNU.e{ \ K=ga$ 7w}m1:x1}kLpT?we*4>Ebq~*h0\RdK^ `\..=|QNҏӥQAdyu4*D_F.qe,ZG-C̗ByYg]4΄^zÑ8DflO',߅0nMz9} +|\#qYuˊ[Idz\dn@c>lXi9_)5o~7iL}ՋUҾR}͏@q^ ͯl_]݁y=Pf/!O3K]vw9]eȾٛP{&@jž\D)fCi I={*;.eTΈQ{$fF'{2h΄]c **OE{EFCֶ{^#\gΑER;J%dNo2{NTS,;OKZ$X㋬J$noK>F~nDf?+R;[E;ji,]fX:_\.^W}8n-*Kv2;]FR21+^ {^=evGWVդ~Viޡ7:bev۹:_k)\%c %}CڽSeIuD=# gsͮWdPq=_6W?^O fdnAh)(W.[;#u([u!k@sq](~mۏ+zz3NAec8.p Gw _̮fgY|#90 e6+7>k?%kaIHs{皤͜St~s^fW:GO|7#غ_ H͟M,^oWZ|1:RXo*zoz/&@u To5{=_DQo#2Ov~M^/]OϏ\7$|*FQ&ЬL y_Q/f.E#Nx_һxF8}Fɏ8^`<_t,i@$7e;CsZĖgG~9x~azkw /Ԉ9o//υk?T!?/jk.%?סb\i>앥?ŷvg b =Tvƀ/1yߚ0*;tih9Py^=oOVzS;n)Iq8HWqOwAn\خm7比1F*7L*}4WG!8Ur oϛXHơtkP]C){7KR18'C3l~U5r(x.ߋk|mZxnY 'Ӎ |{Kξ*~zVA`'/&wTi uUϠɼ_%~ߥ)~2֚FQmį&~㨟9Η%~ZK>  SG,{YpA(ɫmޞ~DW٣~_*o/g(pfDgqZ+w?W՛OM*T$ft!%"gn烢f( E?o]-'PʐNJSR?[#U?at6V?l18;Ӎ6J_ԿԿ9֧j >g+_[uluNjلUrZo  Sq}TDDѦHt[F pơ2mAzDp6DpXR Tn|C" .EZd+1umr&kH~C0 ~>WV^)xƯ"~jDQȵ]| E\ۧ 8Weg$b :y|oWhWϪGT q=~rAZxar0,!^FoZ.ZinmjvJ7{cZ :\=*w7Q)ܣA^: 7&UP+S"g][\;'ijx",c]@] ]zAᇬ:E m=D"n~.q*pCgF"(e qy<CE#ORj0.pF Hh>4qbVجE]U$Dqp sT=zVx"^pF"b0H!y_Ú+Յ+ğ_XShĂF",xkLDG73"+şt5bI9i|ZZez D^=i{+IԈ4~>Fp,SkyVʟR}~HW?m/ZtJ_:>~/nJL@'=;=i_ p}`~Vw~tҼඩ^tCGϟHt΅UA&Wۯ=MIiB~ie7l{LyQl4^+B!4.FCu w~E#Z*x4@T~t>m4^G't}D;]/t8-]4]+E=@z4~Uu'B1 ڟ?moZTb~~ҬKCV.KB IY"3.;y"Mo!"Ճ9x{1H4ֳ#zD-EJ}7!i)ƫOZϏk܌HIVe{!&Gzi#1Īp{y {~ beqFBZ }@!b$fV/E"GX D/4~>݇Pgfpw_DZ/k;&U^"ݗǩzs@bw-^z7I1'"^BxٷF5-e' 84}n$"Mojb,m]|y>i{7*T|?- A4>JVlOMh^!Q)vĵNш`G^t7 K8/_YrE{pXD ":t>\Y"F"Vʐ=z|kֺ"g޲׎U>mn*a@hĞJdCtl&cfpI !Θx11du\ڻ#5 n9#9qý6E"Oxg8DKx_[rJX4|?!}s4A=f版=A?' tG)+\$ާ'>ezXX@{_D"pͿ['}ҕ;#p"u4~ Di!-zĉ펨'[ O@kvk+A?#U\č@_DA' ȣT@V7{gxv/^t[& >=EAHi|pu2ΈwdB]"iO3B#Zbh3p91ǝy Ԫ hgk}A;c0b ;% *_h߁ш.KFE4bt7/ pKon;b' kBug3gDeXxd"#bCG+-by_Da=/rݳmzB}֭-KxQY4֭j"sw xFV{u,bLe|'"_'"/ I?/Rx>G rS3 ܲ~ՏTv׍Eq`>bZ $#xi^2&eyIiTl((Jb\KʱWN$4<{iHC}?aXؒV:bU"{}K{}{BgMt~@t~¡fDD:`bA"-"5^ "#@M:?W||}D2:b_|bݮAH@~zH?ǎrwFշk}넸ܨtFsS .z8n7ΈczH׏t}Iףn 7sA_Ntm ?+W F =TK vd=[Do0~8,(8LJ" nD ܈. )\L@pbC>% ؈.FI*"]>8 .l&k OppG>E/"p!}႘…1 e ;1QpA=ƀ(\xsg.6|9 d {up0qpA]p!ܤ 7]Vy.{]U9w_;-?*{m^p]z6\ӿ o]8x1r׭ ^w읮\!v<\yOfK`̾nxHX`|ynx(^٫ R+u/L?}K,gSطrz@Vո5r\m׵&fم5fq_TyMeUAo{N j[cip=✒_.$^:^PɍO\a͡a5s:!sږ"6b; 1.P#ҝy? bTXG.8n O|:MGͱN;ko5H=u pU/7ABl`\~*D8FKy!B*}0__ !j^.ptrw/o!t~^{4-B,HGs3ݍiin[j0 xtFgEN!>T>'S6lƛݯ$y051KJD\CZ0>a||gYXS5D||V;ҝޛM;tU(18yƽD[OTp->Sp`[x(Nec0bq.2TbYPS? dBFD?wR?w]qlp$8cpg{R!(t8 Q_Cr9ۯd \GHOKm\y%Z.pLzH_zo+ "싨q1MN'_ V`@= z<ӿ2_uP _ ܮS ':rs)|Ea^_8$x.9c<.gh~޽N%Ԉ0O0HG "\.P#ƪ1$V Zu1 >'@UeY7=l_2e $xWv0xfp1x0fAdzPYvpfgȫFdj\/Qul`?vp%:hܻ7Y:8+)6nG1'8Ͼ sC/̠́Hpd#9ȾSf(:ahX|{'sTc:=)~Ớj2oh(s,;  z ӥZ|BX?h8}>O6 @ŬF6 6. f#hF6SQG8A˯ݽc4P|bY=0</Dz7ӛOR?'N2HOJb8K6_$F"Y*Ǵ^ۚW:?X~:R2;Q.+Qy-)sԷJDQuPj'Hk1ҟzg6jzY?ZW+S֥étYugW>cCGB62\y!$S81O!dBy^k?٧yꬽ^yֿc GHr%NlN"|'=>y0opyCo \X mAC@BE>թFoUy$&$5c@$*^/\nEo=< Ev ϽG1t?`/]9$g-UPQ(3A{9VSԏ[#z>캃Sԣ\EW΂o'/8E_֬^@B=_|)Xˢê䴝hBht'۞i`B$r_XK ^s.0(i! ̈cN cl?чwDP[IB! $$OO\į>MO7͟'T.# 3UzmgA|f#Bչ=!&|E<\&!zʳ=8"qS :: K?/;dM8OLS,NzEyml']ڈ(lj9~~7tb܏T#E~H!9eKFt;9(='<] 鹫8{-M0I{ȭޡKz\o1~$WX<} u7#} tZ_hEss[]:9_5g۰1"&/J)CzT_zTUrX?(<}[k~U+X8B?p$k}↥2Y ؂)' ?`(+g4#}fL7ͿAGoy\cy=@O~\4?Do'P=Mov}ۀ%Ek?:dnǴ]_]F)V/e sߢM,9hjt4L Dwv;!"S竟q.8!:( A#}cюIãsG}ys,jvOF*?6ixxqр0'slDkŐC#+t(̾ ?j+5bGeGDp|wk#pz.ʊ_e&`uEi=pX+B'Y3?낽-vEZ6Ϳ2g#fr3^Ii+3cw>/Ozw581S-&{nh{Rx>Q˕@MlB~6}- e8CǞ{єbn|9~e/% _RsZ|+.[D!z(K4~ľO?w9͈9?t-G9$+p~=-|z]_>ɾ;+lYk|,Ol> KF@:F'#3./[ds1H_+pa)!S޵^ 0bxȃpI< ,%7Ya4@r|B#(C-"[n!q1D2Ǫw2(q\>3X>G], ǭcp> 'Cퟌn\8^kl>tQTWn{ L.pƾ3Lg3}|"hZ lz3lɎ?$T򉗊'7(b=^E燃f m^nQ^7ׅÇ<sU$wDaLوz/=#$e8pjoьx9Gy[fnס~:"vM1$ȏaAAzAEW>)lUZ3C|r92o !#!N3q+`k[wsE482KwFeT](D|[%b"j^6gF͆Cc9 hݰ%w{ "]WZ"o /ZygJoaFTNCU' 7첣i2OF'x tM6*3 Ed̯WZy Ou6&@>0Wo7|wUVEaF<%`=+\2dbH]pՍ?-9<60ܩ>/@0c f߶%3L_\e o{R0q4@xLf 谹 րfɞ Io4xgbVhzy~l|ьg`;-9<)֐S`'a߉fUNna˧BBZGmb؎ia8FwB qLŒ)i. u'a;)Ulq-|v.v }A|HWt-xUoGB6a|Gt{w:ڠtd4-z;py+PT( ϣX:|u yΙpURﷃi8 9>`2]̆# 1fy{\?kv9 `r[`MbvML1kݓ;.uYCVu? Ր8i ,cO9urW?ޠ9+gs™_]޹a3-[pq~O7 䝮 تW2F+LW3">L܁ofHu (2Uʂʏ35K,컳@))7{` >Û]7f.GoVz{k~0̠UKN_57`u432[VlH?VDASTDFb)fCa! ef>:yJ_4s?N?/;wYEز"O#-z 2;pfb\Y_/3VBޖL;/3`@ܾRgKۦw#/|F"Ug3!n 4鼠%=-zn}ُlPBvAg9I x74l!{v6B2[1ĉf v3ՅxYeTR8Gc| Y&M'g@f,d_dHGe̥|C)L# /7!K=uÞ5F%!dQ[hOMd "὚kK6;SM mtiWVgilF:mTO"yo~yX(p~J8-e,J9r1Lʫz^nV:oP*Z@*tTܦWT͙]e2H?IJPJߜvUp}|]`+];D*A*_'YfD֯E WDb|X4jaKA4!Rfq;b[.S _s?Dٯ| (!(!('+(k">Z;DNߧ% R/Zpm4"m/M]j C zT+GCy1pgTn"ƿ'3&QgL) Nsd7cG߿~̈[4)L`0?ŧOdMbe#cH ~ KԧKtyvK >B%Uت:`>]WZAz Kp>_}.N~/O^.r9S/-Z?x=ΐ`U튷3*{ieej4?%{>]>pGpq@,=B!^g'jߕVTU801 AQXÊ[fNzvi@? >>.Vߍ +xqܪ$n^upșA2+x8_Bŝ/O#eQD?AYOnD}ڑpDֻ̚hļy&@,1abẎ=#Y^.C,YFbg#V_iHYcdd%ݩ_pGJ-+ף"l6N_q qoFbXß6ip="ܔgA,P[ <E1!y]SԹ>Sb"ZSHUs<qċt_yVI:E~x{|  V <@k=7=A ܤ&^Nj]ˢc @5~gZI?{V.'oJ ʹ.G6 +{Ifw*G+,#7瞢Cl]DΉ*d@+Xrceqb$ZIB"=KpdPiJ'%nOMM˅қGtLz]8ǘ/:\zǶ{G̈#ˈ(K;VxCru ?T 䛑ޛ[|Č0 ᄣ%< V'W&wA'nyB!(DY!LC\i8~_^A j/>^I!M.##[uj`&:]m"8 A?C:x|GcS埖/7^|izo 憵_sM-H7αg2׭ y똚u4Oo_ۓbtƓD8CdKLqUBu_C- 6m/b!7g"ظ [z#[}ՋHo>"E:<^abYNpSlF7 [ʑleY Lo}FS"آ)>U*3_jzu1F![R8"u,}% qXZR#Ho[JXĞuBsܳofD>zCn/U?O֭ⴼnjoSɌH?U{RJuO[W=EԺ_n)?e}8DzkΔ9#nWk 7w"NLJ{U0&?֭t!/xVHXD:ͬ1N+6"tPP:)~^+ہ/f E{[2μ6|8)f"Y|͇OZhD g)D3!rҳ&*"**Y4tU"I h'ELw4D3)'эHSKHEI%߄zs/ _Q;=#X|LKn]:^?_1(TǽgPǿÿK)sb曰ȴLfDZ>rqEEv"N3o geVD\gY29*P%hL=NKjIx$ ? kAƤnxټ– `a:|3-[&{s!wvx?Ldʖ\ ˀHG2y5V6}a[5F׹kUm{t$yU\b/1/|Jሑlx։a009"a`_Dj;MmkjQ?>!+fD#B:A` "wɝ.q;it+!*c4E9)LL;O䤆Aԙ"50N \+7]pGT9cF &4<* ΂hRF~)Z|uAU4 >fU^4mlܓO=jۅNjSM,5.YLC4YRu,XݾִPDS"r9dr'ɠL:+9sD+ g23GNhhyY%Dq!K?X;RwDNrs'D3a wDm-OZT'zN4L^Ii{'/5\pDtFN̗ tњǨ!. fD꜖:6vQ7[D \S^i/uKs\:Ϧ :?P'YҖBBGOgc=BvJ-SMK'?THZα|Lc?Zt>퉮OK4"Rg̴A 3' Ni|4O;L:^D>>A/<_gzXg|ůZ#&AH&8 z#ގU1Vx "u쎈ћ |.1I#5߬Bc5ZVH 6&5{g8Deo ( 8"5p-#Y] S1pΈXrD"nuZ v!c/ñe˥JXq9G]p ; D 4>;"ww!"\Qw܅'uM'90:ò:!-;.-B'E!;"&x%=X; qޏ"|eAC\P+7Ï!wh{x맊Fs"^\M!> .o'1.Q"2AX!(|S(|`' Jw-Cab y/"¥aE.E º1qa|uc#aCf*;"lF=N%%;C5 14.3ME\ n[֬/E" lAV6gyWpq>lu`¹+|B$Ah@p,KO8vs5kgȶPDP C9bƘ@w5ү^s%~\ ߗ/uN,bN>rB*(뷸<=M3x#͛zqnꮬ q޿AI5FRUC +HMuL["5=)q^,p@?EQVH||rF˕;'(Ľj"=Ao.ɽs%u?f+KVBt[tܣk^A^H]:.qt^K-ǎ!y+4 Y:yNhE麀ĺC9GjD|juV竟:Ks]Ds4Z%<>vFIOD"HtܿSs'D 7pGxΧ_ W} D|+Hw{gDVHA}ғeE|pTwD,U FSB@pHt_~t:1._tX~hFDOh6·龜y {TNˈ("I >KPZr*7rYrNшگ01pVQ5ϗ<L}ʗvKw-wwĕ6 Br5 ֗fD0 Dt_"!QbaT.XΒވz.A/"3< bBO*"R9eVb"kvAUrxy]d'(nV([̘Y/?y)6u] KNwN6ǎ:E* EUJZW \qVV I劽ܢ4lV! 2ŲAZr_V <#/D\QH9ƃ7`D/lNY*/bh0oÿ! *a`!3G1z_3f1)_ owibIb];i8ϿӑTnHo#|ڨ녔+-,i@[N>#]##9%ıvׇXL n&V;>k[L v5i|^sRdx6UW24!׀F=b0 bbUmnN_vUpcҚOXقh1-ԀV(Q~] /=OؘUc^T,=cN̲Ӏ-οIXy~Wo,5 oׅ6#rﲫ/߯G"6IjyhςEY7 ب$O)ʰ:?N̜+pi1ݬ>/;Tf[ x<;jݲ(TG7a>~P6/&^&~Xg;OWbޕ: {aL;YũRM}~q >g>1zlFD\BLS! xwwt$eMgļk'6&6h/-O > f3ǡ{7SH_5xGCzDl~]!n#oCoϮKn% !79 Y|j!{B] 2?'R_.S RAN|~_^}ߵnA,Y^=ĩ?/_=aC| nψ}ZGlusZh{w jwTQ}]94}{}~Q$U9+E}O|3p9]4"<_ZM?%9~IjQũ ֥fyӿKNH:}ne~\P~pip|2FS3#Yy3!nakeY +I/5 ^ qfu>S.r5!޶[UYvXy?l~`9!_ٶz q|͈Z᳊>kD&+!, _R?BF "=p}xھ~[38ǂxեB&X:c5oNN-OlBlС-qUb v{_x-F`% |ͧ`D0;;&g@xސoA;ߡ$E˗?QO/o}h/>y혷kyHoX>D@ Hˋ3-sWg~Oǃ=؟X闧V5!n24p~>ҠpDYFbRɝ6z3XYvMj:_^}'~Wo)% yݏ}/߷}8ä܎T%_ENUTM\..ɩ\չ߹\<+=]ˌb:O 79 @xkZ}2n%K1sJꏏb\Er%v'I%9U}2%r8k%Á_bWNp:C4$8I1'i%-}~80rXUb z9z`\OQZy5T^r'Uߋ?#JLCI^dzz\IYo1S2M퀲ݪs\L[oe5z8WȬ py` 5 2Ux Z Z 4=TZlQPː[eM?oDe#"Nv8Gړq9^*!x︳=X!B;)OZ `u9 p#^+9b_r @sg+Cw[È8gLW\ :x2%͈qo̾]VBy1Dfϫ| LTϵ&T 0l y6O(H'6%[Z&X`yiy8Lxuxvޜ#k:s@݂ph="r;f/t]팷Z@7O wݟ̀#zUMcRT 5y@VgEzI?iZw->t<}C=tH5>("~GE:n%z㴖g:o\Y|I|T7tB# 9Yn"bUY:г[1tL9>H*OM=JmAP7tN.Z7tucޜFZ7}|w}y|Zm ng xj46YR-JXXw2d1~viC|}`^SgU\6 I\)惟T$|o_t~UϕbK6D֡|^ֺZFhxTYZPK bZpnAsOZ$ђF Ϳ%N-mu@ tr1]g3+ߌVi)„Hp\>}@q"r=-i:i>xx~i9rJ޶G6vh=ih8}?,,ؕtrΤ׃ak婪/Z?T?+g )/f%oKŖ[ِ*׺QNgL&VW'ѫ DW1zUI4^nDz֕F"05κQ>\;?Df#-3Ն9^,UCv4/g0#^lA:mTOjZOҶf`x>xFnnB%V,*4yƨǒ~vUMmt(zQ:Hf]DX}vSÑ2`TjNSjYJjjsR pyO5';jփ b )B?nkl:1Oc̙3Ssu!No, zC|w|шK9!>bD|jD.[/woȖ⵮i'#F0? QsE !;|7 ܽ('|u#K!], E|- 1 $S8"pABfı5!t(k}};/IRFE!h懖-?ZypKmOI7E/t|%H?8n7.{@D:7-x;"g4 Zh,ȼE-_/U0[r|lC* Z%HˆZR DjH-,$I"ZljYt&3\v,άDԒZTw`{#p",g,ei~ji%;Dھ,ޫCLEl."jYp-;"pkoCTYvq%1~_!WJӪ(ې_Yb>t&jlqpۜg}- W<]q we`pQ!@ |YUhz=@xbå^lh_PB#bɡXzMU̖Ak8עQw'Or3Tϳb qQy!e/`Z'6L,!/<>x^ev64+\zz՘kKl=8S,ޥM+vyL4fc!\5M_!^&C9Y!9G?S;qɛͺ`9gKfbuG\t}}|s`5 /Ğ[4` & []<^QÉB[X{*;.p\ǂ>H,|_o7UIž`i`G˘:{u{0* }O#7_=\k&Ri:"PQ ft  nc xO,IJ5cefXMMs*$T3ET1' (ԓ:<'<ʺ)n'ch%zb";B0.DqU:fMs>T ],|wt"gyg%sqw'xw9P5>%K 31#NVv< ұ$5imV<;VD1y?22^Ҝ4_-RoG:U~ehDL:wt|[+_ɺKjJשd=׽t|] t|Ibt??4)f2ng r߶2Y;'dP9TDDq#ۙg AdWbR6.iU.K"+ rC]QJԵuɔTW?I˵(}zuU^`eUE1[|2t x K"ሙdt,7nuL逓xz"eI˓\~DzO+'55sے۳=W Pw>dL| ,~pX`IWeI`.B|Q{ ElRkFDyOߏOoNf[U\߲AsЁ6=V:VAGτP݁ğ ^.&^"^@zK;VX&osnWU ⑮ladC=qMō͈ Z|/i"g#sPDYAT"i8}fH8Dp [lK$b|9HpkXm#:ʻMd Cn?}56pN5zDg ͩGy`}ztl 86_lٌJE>hZ' C8;`P"x#uGhDЙrDKuA=⌯WIoXia)6p:n*avO/dK5OO7 ilT%׺e8l.`ѹ]*\zNvqv'3랚N _,= Ӳ:RxIaG8ͺ^Xh3j%g++TN ,O{]V]?,͌X#pХTsYa7z@ XCZ~k /ۡQLJLas~{)j}ttu86Ko&`ew<4B/9>}vU^)'s !cO/;Έ`7憸nPDYUpC Djf@;zfEߧ铵qi~TQ9x_[M G1>^~TĕW㐏VKJXЌi)LL%F59敄X}@oݚ1YbQd ,K3 le*C(8Ŭ.xww7 j%YI/χ/ONQNҁvlkKrPMEҩĹ5M%]fc$ 8"X~F3@DG!h+epĦyLAl09_DpXsL5D{CbF@Ģ+K:c7 DYbF Ws [iRu{N* IY7n$A$S'?M"MC\i~eĂ5nFK˟+}߿u|; j/伆hDYVN=i溾MOv4N+Lr}B\׭3D0Agmb|>%{?mk€͘Ffb`T*' E|<$}t@TM|}ijIe uܞqX•C^[ƌ8jY(}cCLa Y!ԩ%+~\=07 +}x/!UfĬ@~xaq#gԛ̨pn=?u!,a6퀭k}ةC\f_E)X)Uyr6ϻÜ ryt=9/B,0Fuf.= xG7_}*΅nY$%7O 0tO~뱲zuzɜ;QX-({4uqnDcaaWиbtDNߧ/*SB= g(D~٣ Ϳ[p#e݂8+Gzٖ5g`Dx#dv O,ƌ`&aаN: \gDYpMiNx/  CaN+XO|H:{qC0- q[_tt||*1Q]~\hԡޫ:hgZR&VagRr_bC_C]E V}o "C,cV1ciz)Gåج/ HV銿fxڒB/یǎYyUBuqD 3[Ȟ@cW;Mwaל?Z!]Kr:yy>h[a^)ٟɘ՘8-[ϊ5̙F`#DgR B-i8}>/9"(I"Hw>;HRSgK ωF/M#Y"wE\y{5_DNANAY!JQ$pI" aOwqq.GSYW! W/-"H'[e4(*4T& 1ite'DNߧ+YF/g}(ĬyFLB@DpyN{\l]<ŝk/ŬH;PqCuRu5mxpmbp* ,8ń8׼ C4|͛w 3"z,6 Ï0DNk#kikWuDI{ԸDZ~{Κy~}\ڳ--݆>FR[i;F v'Z:m+[O?Gέ-Xi,SP)({[ *CPވ7MAۦ&#.xbTѻ!XY1$=F<4DPE5'Dp^4ш 'N(bT~q}u-}^_Z^V Ӵ"mO7WA۫ mXĆ+qDN?[L]wŨX߯:DP! B.Ik5a'?'+-N!9' xuNmmKbD俫vNy`_ktFǘF?z1=:vIM ?t"k$EE&ȋnuuxG8Y DeT""b"3{ݠSD&8(HCCE6E,ITFHInՅk:+S~2TQ׹jHeD`?+ KjDiTɊl /QeF/ :7 #||*14^{[x"ß%+a}筕@ 憚n.+[w$[ZvMoO+7[9/!i>=Ӯa Ҹx H~3a߁{X|B\3b+J o>^DSKq+ϫ9NMfh"<_$?0p)^.OKѝH+\6X߭(V*"~WpoIUizT;;Hdm}XX >o:5v9?;_eCVg9~͂#͈I ߁ǨctfD.BV$wGXw{ [רS.5#\:%{7/^.0qҥ NhW:p֒J/ϗt?j1J+k;^s';釨5opި88ˮ?ƀg~Dt;}(fWbلHKS"ҳ^W C9UFLY>Gqc tk@Zw"mZǍٷ\.!^fo?R k Wf 8|= "~wB~{PP6?b][ſ[V ~θAs㐅=4` ιwRؐRUɿ<ηAfmK/>kMA,@ f&vQXxɥ.{CGkdk Ak/Vv4DGA"I\#o`3{?ͱ" NN7ڦ7"ճ2#8zU9̬~n7|# mL+0x >y_:%/WgdEYS>XY-/sI!}6残$/'?Gr=f7Z=gzde{0iMXMB~z§ۼS1 \ W$Ě|2+=g:z`[[~cfV8YQ^pD!bLN\ލ.{VaX:58.\aF4'n[ sA;J϶L0}1+a}OoZ~.+dD$ǿ+H{2S|眺 [ +Tc]{>l]1v%D"+e|bzݲ;|̵qC? s3>k*p=[A]OlScx!/nokqZNp<@5~AC>Oy PXuAO9EK[4".- x0*^Hl />YnڰN :NZu]8&7ug\'f+KLlP$ůPF]ܷ_HzN:^=m)fqߎʾֲ T^6$hn i{>c-nmSTtG'u&&*!@-- - D'>ݬd:pc7+RaRw\w\b=\Attt'w;ϕ T 낕S֍͊H+G*I=G6,bS~ho]k7,-I?ӭu='" O5&?f=$ogQ/AoznZn{S΀띷i{yI},){聶+E3_'owkY(KNy o`>{f*c1O5X[lY}5͍ͿFDپKP4WgH/ݔҹ#}z; ~#yS2ceoH2JaB>$}!S`\v2)? >Ł^ՙA6)?xZ<I˞K-wl]!xf"\g5'lDWN[* O{O/=:\/?PpTֹ!nE;SNz挨j1A {dHŧS;&ރUhazlYH|g°t f.8 / n-%Da@xx:Dx:i u)_ùՊ|>4 B.Ui2)B>CzJk(keج˶-/ffޜnESudKhDo{EUA郥FrKukhN1o<˂8|L;zDkSp%I15X'Ge>ORX=K3/ >xq8Xszo=`G,#6*fB\r'}sIHm)B <柗cOjF1V:`\>)Ks-Ahoܘ&:s+viө" w_"7$ņa0 vo{(^7?3#qõix+];tK ~*D,i'Ct~TC9La$`==r+kl܁ubK6(a ܗ(_@ :?#Xn~^mSYl%XӤ[#F<ըG<DNe9q%=w95?ȻEE KTF$4:EӜyo:Ϙ@rGY~|/کIfq0{}J qixܒ\X,iKK\„x%}α /F%">KtiC(~7 JgVȿ@+7Wp`Hy:ԩ2GWLT2k@dCp·eAEP6 plB"(w'_WHD.AA.Bc4OߗMZQҗvV k`nn`FLU~hа/چ5R f2cO3A(tMRw`5ÛЈX"m&D?Mo)I;| j?=-Mi,J9r15⼗{^'˸z)<7Z״ۘi244|K4",Xe^*>s#J=/b5;~Wr t@DNoԾ4=4IC|@DZZ~)72!pOKfe؞kKגs_,Mn>RwaE$o&+   ]JUNl& hX4z$]#}LW'TBҗQڮ^^?g';`?q塪 iOh" Qk{@Rmo1>S(ǿÿ9SUsb ^}wnJl@X/Έw DB ⊋OY1< 7> wlHJMdA_FDNW埄_HގYS|BK1,.U5o7OpA5sg}3EW43YR\M/{S)Etvb5>"t9 :!60شz-B'E8糬+ƻU`ezVo")WF=p^M*(.Ww|"On< n:Zc' )/:Z2+뷸 Duu %Cf 5p-#Y] <[Bt8gwFoCߧ'+Ϗ>HT #4Ӆt 1xq~'FE7ohu8S΢WGi8Ojauh*<{c-?<Ҁs75EjI_iK(,&e\u% b_=(;QyX_Dޘtq>;M쫷E\[nd)DGL S1>߬|A5`m_5l`;dAGZ`x-7LhqF9 ''ь׸(<3"'w<4}҂~ g ȶm[^ȷR䞒⇆HGd:b7\l be+$wzz[)>1';!O\X0Dtħ3ֈI/e k?_Ɉd0g ;wt| y| ٍЬ櫌O/^ڌH5G]D]/V:XfɎ%d]\|E<A!~;3B9ݸiUkC{G 5x. E#3أk0_>i/#`=-5yMKiz!)!C;\8!W| p;4խ?8a wD^_Z>fu_8" \?y"h!wk'ěhΩ/X;"Uդ݂ZS3KDuS3~f>#F*n8xF@zxqр0'szApxvHJ'D8}E}?>M;ii&=$i44E#/W>hKj'tu'eoB&C,a?z8bc\8#R}cHӛ{OP8"^BU=XX0bT*\TC龈T~-57!jׯUS 2kn“:&q~O@DͿV/^4 kM E헶w-}C-}]{a"fǵ/?9z&A4}i|1;"o وx%mm;/{AdgnO eSfq#bRmhzhziht:Q+8!tPl.uEywFk:D~Bj9!>Rtk^A`Z41t("Xq UOȊшogq]wnCu++'D>uę"y#Y||1a] B yD9F!YjoCےsx[%p#?!ubn"Dj۲U}?>M}-+Vb|+/AԒj_CY:T/[YrD?|,h j}|2D"&3@[-A_F\t[#"pvhd@;" '5~i~h~iy:V{'P=IM -~pw_}O3}MǗk Cx " =pD ?4#k}x}4||g1:Q+&C#o,Y:.Üw$Dn 6聨ޠlAL+|2"35lAZpRRCZ)ꛗ -?"]RPޥazGC,ض8@DjHK~w}$G~pl}Pj?~ʇ* '<U~,un4OUko弒qs}/SIсO~̸O xa2!nӨa|D/PVb7x:d/1]}kB;Otkwn0VkBxN7"2M%*XC7"LεJN6Wdkԧh'4S5>uޮmj$g^\hyQv^I'H}j'^--Ҿ57+Q"Op8ix&)6]K;ȷ[ o cJ3 6+Q |v;[jLXGcČz~ʬ%+<k-ߺzX}*, wΫ|ފ ?ukUbְLj2UAM_b'*/V ~,osmubV(TYMҷ܆Czu bE_#h"0ib18i8JMaP.rCe;i冁/:E?oCR^/)M7x@tg1#y@*8d:oA$W3}yP/㗆|9)0ĬGU퍶d}ٯ-!gr*r .p~Hﶾp4(^EX"M O.~:~%z~6r|3/c 31[p9,ry6X¹5ȑ )dx,Y?QTX_-4ͦt, KȽڰA@oj-ъIEnDT) lb$ jGrWc G̴Swl@r\Ys1 f? R%rl.rn.rGgR|s:S;SBK dze2 EMZ,{@:ѺpD̈˥SMqrp;cp* ,{4=vZxx_≺_i)x%}3=T3ՀX<#"\ ϥ 95[!R"kpn Rl!YFD[Շqn.-oBpijQ 8Q;}𖧒y9IT 8Us$7g KPmAS+Ql F5{eMOXy4eMhAY3Lof ާ;"tL$}߲n =3bVr3*4淊(;i vzDspb*xN̻ӁE%%"_4?I(DEtAIZk'6#clu:˱K g5_ZiϾ߻x8#gX3nnjafY>*r<<^_1|_HMˉ#/_Q޼iem\`{ܮvDdyYr<-(+{ <)+ {DO4D+?Y{rԂ(Ǜ@+o)Nطwe X6XOU?^[ŚYA:KŖD>E}\P\0o>C,wwA#b=3;!6̈ bʒPv6T G2"m VӕXn l}_mvG,.[=N״`i:Q^ B-_Dy-HpA==i9B7EM(|K+U*mt&J)m^@mYFSMw|iJyBsl{Ԉu:bkNZiAs7O53"IO'w<KXh*q% m՛} >/ۋ .>" [2?;č_Ci8l>=̿wX o՝~]iVzd{HAپ\P//-mvoǍ)or.(o \>/YuA?`.(ۇ Ɨo]՞t9Q[#^8hAV{s]8BJY!w͗@bCo]{E{hݐ![{AŮ,W&H{r- K.+'ass1`?dxzUBވ `s*xKgD)A!DrDuؤp{m'\+t"U]߭(V*?T0 1_t:G_.UBhSvj 601`xHE|w:<߼xJ);TO}V^{kYN^I4SΎ(D]* KfD.XD=م`1l#kPkLi8Rr!~4\+~!Qv!-U޲KjAZ}A=pYH'қH~gP%f±ъl*QYV Vx,K-YW"21ͷ"dh3iT2&eHDƎ%R"; pa}& a'Ծ Y|e{wΈ8eBNXA /~աUW$Dyg޿E, tD:nqG v_wnlWfX+ՎY\gOe73~usEw ;xZ4~g_|;_gRqߎ0 ee+]~4޻C-齲KZ!yYkeBzLBNiY > '}W&ʩ#>8< 1K94~^h}WVm~\wFo:CWa4|럵 ooH Ν남yzЯ[g!c@\1:K(D{Hk#t&qr7ɛ-LL S/G" uFLE_߭nJyЛQ:&4C \hF4Y=A)]ϋb],DLl=5- qM!fD2W],^ B(U \--IC )!W γ;;[v=g']!҅_ %S"wbҿH;}C0l(i<&Gky:5OJ,oJ0h8y_҆߸c%4t)5>T 1e"_ 3랚r]ڛ Y7|c l?~"6 rJsqcNO7|&;xGyl{ hGb6neò7oX51Fm29Du|5+$_$ݑ}=jDKVd:ò:!pVz@$8`Lq@uN2]A8Q4>e#"=?)r]J% ]!>mV2uzB,kmէ,V:Y(9ƚz=xt_2 !/T4Z4~1Iӯ//^.'|v3!r{6+%k|CTs vtiH73JVQJ|#xYz[®ՌXbHwJmb@Y;o(-㍤6gZtI]~2,bp*ao= ;9IVaXs8^Ap4};E?wBd *|K{6"'G>>~,C"%s# B\P'jb ˒3t#W"-齏4< ޏMlDu`=b [+?a׻M̹wnmgAz+& voFDaBoEPvwdޱi-tV?,xXx|f##mיJM{2y|xex<$~UpO+X<Ͳ1Q"0W5ޱٙ7u LD!Z֏ ppHSm+ls}~ gז b]lPoĜBW 8B+-`$XȀ8[D>~o 7$}26b'\K`Q`)0CgKK}9>lq- WCtg;쫷!d-3߽|WY:{͹'4\'S}Gu]"=|ij{h囗-g_+)9gmfV޲,;+(m$s0%Ǹ~o'𙬡=&-hI&"*{z(Xk;z0$K(IsD֠}x?Y}J;7 a֌uK}#θ}y1r.I!IP9#t5G'${"/%b,>}#ʕwA^ )BeuStKawy s :Vg: ԫ άpѵ }C5Og^+)&HO'Ow<}*tM/T bpOfi? tn 1PmbPǾU;1.Z-7|[ↈAku{"ܟfZ"?@^"Mg|%闧Ve pB:\A2azLͺ~ =VD"mWL9r=0U,Sf!W n[9.7;!Q"NpW.9Ǘx[1Y=-pbшmWN°O.u@/foDX9!("~s!xD S|ùoDTBK=}h\g8T \}!LkFt<$s]Y9\!fz S˂ZQ 9EեA' :@ nQk"[đO.CVweOvsG9!-"\iX/mh*ԎE,YFbẎ=#E" F~,w/ym^!j FQai.9"jyƤ~ԴQn"z0/b%r9"RRWƥ>;cW g~5|daTfDeh&lsCiahĉR_Uĩ,&DAY&ϩat^~)¯O#[tޣڑj眝5шt^/P[or,vGm9'@qut}~t=C;#eB*X.`ۨ@+\KAQ5;$O zƿYQTߩ:>]S|N&Tg't?3`i /M6-S{f-V#b #R3.Oo'4_5|`=I5'EoU=oGϬmHR2(T\i|4\0K',IP9G|b/%i'=uJkɸ7K,/.2 鸮| 5~:!qgIϜ=(5tYV# ~_s^(?壕~NcSl麃K+?[9^9!SQpIZ^_ͬN9ÀkI ~x&42~l#S1GDppdB"#\ ρRk>Ҡp82#s#/|_:Q 8#C bRwwIzT8vM"d&0A÷;D]:u*/Uޚ<װ9uoA#AQ2UH"KJD&e-E ֞|wpeO,>{6WoۭF5d 06JƚMpqVpբ`7Y>\hAk8 P-P6 ^uP=1;X W[{YلH{?~mJAw Ub\I!=A2~m_rw|݌TiAsf_U&g@xP􄫌'GwfWT8-t /@x2W&{޸h/A2*`[3"ܣd@Lg g=bN|5#&5sg@ :D{b)lW8 % 47Mzrpk!#k@ WYz>s *X8_tۛr+̒8rs~.le@5`uW|ʌ8g#[zN&D81 8K;Է6 cD k3qqvϾv{ol6ep Ӷ5[X9-},cKUfĽǞfbȘ +> ڜnB|4(bsp`Ri<>p/dקDq-iuSn/TfJ?;J@=#ž|l噛n4jdP?^^ BznXqf`;\+ݵl U*\5SzbOM4'S~^%uE"~DfG=>8AǏz|Njz|HbS#~C w4>FͤNGDZʉ;%_d{.=}ZԾV oe2!jګVx"W1.~7uG8.aDiwiw2>} {װ#NX82ny;t\߿3qc #g9y8ҩ5VCvm'*2yt`Ȫ_Sy7?uImy.'rxdى[%fG5gbr¹<~/19^4S)3jhɯκyy'?y4\ w}W 帉K#j({jCNέˆpBU j2gH }A-5U0H  FLXH JIQM7Yb ~WixΫܣ8ĮD RCyS!p>M5LKuEd-j@M˗5"2cbVMpD펶SjL G;x ƏSl@>?(7kǀW€=]zO' -eYŽ \R!|!)S@RU f,@|3o dBtR.U ʅ] LJr|a/DjҸr]X(<'CȂS !LV^Uz1״q @+~_+ggт߼;[%}I#OT 3-_I2]na:1w{#;D X^T8DqO.AhDluGp BsqHÓ>X:!?X * 7E,0DpuG DAP Bpq-b:_#hCߓC3l0ѹ}5>HGO+J{2 8@$DlŚnn`FLU~:_;EA2h@$;wW:]mb’ 4"H 8HJa ˢݢ"zĈy>S?Cs_߇msoEa:ڵpc/ ؈._1\+ |b |X4,]Ň9UoyL%ud@U>%ADج.OQD}4׳wh{퉶7ieh'gvOeizdo,gJ7廼R]H×G\P+"!l &pz!)O_:eoANvA?Z BiiViz/.]n& Cq-!ywķ}B[r|)^wD>(E! 5ߧߣjo޻p&^Cҗʱ NAs>8y feo̾]VBeC؀X98/òن=_VXeƠ. )=e D2iMtt`MAaI83)Df0/Foe lz.**2)~~/tʾst]^Jw8Lj=:~G3&^J *ed|o|SμyL=j]vO+H ʾp>O> 7w>"e g+Q rPDGAPq*Hi|{4}4SA -_nE kɐńxi/ "E{ ez!*u4*=q{@:Z!f-Y/uJ b߱31pV{O9qnG,\:rD])<<]r:U%n,2_H;LZ`i3URÞemU(nVhjK 0=T3"8A'APQш`펨Pc׏EjoS)X'ebT~ gD ~bFJ_XX<Q6R>Cl4-x[%D0A5>.}0DpFp`ZV +'DpXt3"8ιy/\LEpHi>Jz|0W8z4jycYb;648kxNE0h8mDF̀aUReA)^0c{;L <`|qpiEz=pH,VT2eWhA<+8iFNXBl{0B>}^m,ڻ/xچ%)qQ5{պa:.w"85*J(34Ӆt p:B窳HQ7+[6XT.x J#mFt5;gůK#6?W>^1\ ;d:oQ o[U3n:$ vr̪0ƅ_ HewI,񓦤T.~E'e$M`ɤpM7'T!]jO[#FdU)vv#b\&I{hsO9Z;4/ίĈ'ޒª0"#_o/)Q$rAF=?y^`,\-oµ.NPU3"qDW8#>q+_2^a 9g2 af9f8'?>q%p|0r1\=u`3:3z7ҁN&g͜bmOM& AH2kfZ1֚>,ߵVr ?azg=Kc8q5 6uCD\̈b^POtqgZXHr6 /;|8ĈHWvȟlh,:Y}[nA$j;: |9vnzu$uQ^] k51ZȬW㠃u5_|z\@B-"HrJ/:U^6$y^AlWYF_u ]u9_6]! 7u?}ݮ46"}b77V g}GSu7S܀14>mΨľﳚ/>ŌHccw|ǹgg&%e(xpS=ޏ% ekT"Gp " ZSxB4NHLpk@(b9E<$$} {b E֬9V]Р[%ݓ;)&g约Yq}1"mT@tm[A'Wmp[DU.(Gfmn+O+ sHsf/$ߩ_OΏ||oQ2;@?X"pp:6AtDi8X#ƻCᲵlm(.V>ee7YsDe@g[_OEI'qǗ+Kv\lFtf_O-lF促 XO;VXZ}+xfCNV5Mc1$` })ĄL T+]p]: )LSHOTa|$ :LOPSl0AFarBp#BVziU?Ie%zi9 !֜[1w9͈4ˁD߹,KK h6!'~+Ռ[E " '};n7"M+4?"kE07aMSjDIa.AkRH]88&MOaB~UTէV}?Mٗu (}WB\IJ3HyܢƯ>M/mȟ o@tiT%ozk=m%sOFPU0B 64>#pjEӊ/ABa  =&s^섘 LR lQ lQ lR8f~s"~_+}4_}UعL秩rӢ6 /yU:_ |%J-h_HͷR5gwfI{o)O̝y\L'BvrB]N޲AȾ*#;!d_;Id!6g羼ׯ{Y^gK&nX@psֱypYbLt2!'Iϕesg0WUM8Cdt i?صA7 9:ĈR( ߫2ppoW$@N6 c&whc7:&p>9օ$ B\X}ENY~,qM\48>@ѥ슷5R:ʹ @R]^ʱזl7EWYI)B pʦmjtZq!ƃtOg,X^Lej^2LḧQJH ;W'ymqQNupqO cS(,/mA jހ>P`l`@on呀8+7Q NZ&8-+Vh˖8XdR(je5rI$*@r®îe~U_V<)Hn 2זw؎rqrHg@z/7-H2zOmvwjl'BԾ#_H1e,@jόs<߷r cƈé4ߊ#$Po鍕{xWLqُZVUmP[0̊_l|qM7&k8@Ȥ.dT6}9IAҀU9@\R=i=|ƕ km;ZEpwT:ۧRPkz%SqgA"`*@ǴSNkzRr UgxttyIf:x GxMGj'LԧIɼ}+i. ?;xmAꭜ~ޭ)1T;'_LT[t}+-q8>i3QZ) WI$Z:@r |ߓ!~NF6Y'$ Ti`OaGWhXVڣ?=GjG,N5Q 5 VYV/ӕ4{,btPhX<Ǚx p{8@LnU?Zػ݉r@˽tngkK *_˛ՃS?Ǵ8.h*:[ӷS-XEfzEB2EC2Ey2q8_@$sّC5--"E#8~s%Go2#;5t#L^(׷2(v[y{ɍV# J"Rʹ ,|F/0MP!W[r'./;@L.))))ꒉl<&HWJD2s\ٵ ./Iuq8ϭ|+ 'S=)Ђ@ا@:|K^O}G,NwOΔ;ea/Z iOH{6F ᴧdў8?=##9q|jWk0878b[/ P'7XvT *03IJ:TI* 1R FbK1 `0p#o?C#awTG舸#eR%%F}q9S(F\/pbrn_m m $6Eۃ2E[EۂDۃ8== ('l{;@LLLHsqhPf8~pfLL?Q)_\P*7VLіL8,̰M..l̶kh)L-P!Sy40{WO.|ڦ|օL<mk$gG>&-)c0}t .=gdށ\WT[>r$\vFjߋGeNQ">Qj׵٤&@Ѷz<pjQ-('6V|+.kWdj8=؄t6dv˟9T)GE=z vaK p'쑉߯R?nIԿ2~8"/fZX]H[}~*ܕRS3lK\-H2{^&#'Ɉ8~}zϔ;m~G@EB2EcC2[O+kٔ؂1#J&@~8@ј.mkL? [s$0׍+2}?Tdrz9 ηD(ӁӉE~8wϹ> ]W+?NzZ}nW^kIGA8[/< f=_ZeB.rn` aP3*f3N>GX{Xi](b)r)OOi!#=-d~2CFzzHOWi.[x*Ԗ;,xoଢ଼x5VqS DwW2EV2E2EX2q8x[Sնp}cyU=#n0ҋތD& 0ҋD0RuF?N/Ώ |̿wj6  /p3ux@WрE2@?u7S?~PXN\^&; /NszH=H5t2;zɔ_Ha Gdv$= q^cQf6eμ6B ;w(g0MXa/O^K'SQ^[6/3hH N~P*«n&@ ڄɿ? Z0Ju2'>ik/H RWt%!+F^2zo@ L'[%QO^Nce09ݼVGNug:o {ykƾW o0dzP({| z^~̌0= Jn,m}\z!A[ΛT4n鶧%)֔oq~zހ֥-z0e׈e{v8~RLR̍ wdwdq|{tJSёnLU"ӃЯ˧AScw^tX" ~5]).[OM( MۇqӺ |p ۽B&9~F }w$0N QqKWӃ3 yU\y#uW'6ANwt'N<t{ 9U6vθ# ~}g=;s|gd*G8?Jbuo"}絽0V:VC)B0Aǂ >n(u[$V2u-<NZqj BtX.0izc O{i-a-M:[p܃ CS|/z@sƩj +_UB )ķ6^=24Z9jgL0 N!ϭq} ='R?jWr8vu>5VH#ӛlH{ۮXqbI^Oa fLsOs j)Od7[_ t.0ϊcx ,j G~"ˌ,9zX4ny,WUaB/啂l?He֊ouERb5_J}1ZhpXI_wxs0tT΁۹V8E 5XX& (z'^]ݾ?}C=2`;y$^ep~hދ^ek}FA@|2gg7ay18@r$"m  8Roer0BHe;mb9j7^g=#dz̪:ץN\6ķ~wl ْ0@~é7 1 bhN`n{G(O>ϪxC?sx{LO8 nW52:DtK'mK(,$k)/youB('Ŀ^['7]<%;@4& p扣1K!iऋ.^ñQ_qhN';EB E})X=epq35 R:EZT k@bBzW+Bo\d !c98oDI=2 wJKP~⋸06kq8YN|c $q7_3\k9@s 2lo=A@l~X2G=z`=,nG?2`# WkPj=ZL dj7Ϟ(ḍZ6,Kq/擄 7`F@ԅjSYQ}k)%p<`.~`!wn+ xVjkG[8GL[8?&  Z6Zu+HbV/k<\i'҃%fhq8zǯ>t@qHK/G4YT2r=)5Lp`ޓ/b @997&_G٬#>m5 Z8N/X@g3|XHR8;vԢ]}`ڑ?e 9ʺ)PXq)2T#T.f/|^m!d`WK}6iR@ wuNg\؛M86GIaj ~8G@$c? nG? (;~ƽt7׳ !-t $yErC2¨@>bv6BmZe;h\wL `^iOHуZʱ85>^54^}X8}x?@ÕQ& {xk-?7<ó'o샋zWAz^栻e:3 @< pum!}8R9ɿ{3pO1^;^Y>םlNhJL 6 7@bƛN ׼e'<׼EYjjknwi) w(|0pMd:wk~0snFPb$ y% ~~qZ?`wh7@880d7Ϭ[ކ.p2ST:_;H e=ch#ÄLE՗<< [uľ;'#S3- R{ 3 vxwŒ+YGiNu U,8ja3 X ^<R S-pF=s6pPaw4;z<pˏ:TkE,<ޡ`^F5I6/~|uB 2d {JP}~#0[>VÉ@EF-o- ϨݯI=NF_k׏s-]|hpͿ +#4we=?ƾ4b﹟ xD#qlz iFRc$pan) ]wkjR˶qk8کuNѮx_>fLX>6)HjǎILϹ>6^t^PMkaM6)t|@5M8=^Za鞀pyL\Adž;L)f,D? T_.g=T/sdgskd2"Ta+ 2G6wy ϴ팀Qqk{}ۍpQ_jd``' vꟍWFlpZ~{cfxSZX#V?](>ׇJ}ڤBA#ٛ>3-A5&X0ԖSyS򑍄Ln|]1+?]& 6,l"iMS-6W;P;ÚxӾe7}B`QݓڡSGf|= >EM!VlĊjB8= _.\?P 7gSc|um! >9]G0ک2>Q;dO(5a+gqBpjN39@qp}?&iS1!0 1_k'md*&T;OU&h}łeײBFxO(ҋ5rq*O }[ػ}?A=ܹ|ѧoJpk"^vj,<;Tޭf[ֹUr58\*9.үR{=%1_Əf\vA- jze*:Tk;:|c F-~ԁ+ҏ9VeOC^&~_uB8n 8}R=i[JĮ[%x+V_sv@ׄm K+-j-H8٭UWےNJjX]M/T(?O4ouY jW|_So=Z e.W^G _yi+sruyZer2@<O13x4(ܡpFjZešXHu0}~b׆b Xmڑږ

xA+LV=0p&zfoZk4_4["cZpՌΚkuq~&Hde`O<ύͱO}C^Bm@X s&@ٞ95- ҫȟo3-c* kG]:bwSxU2}v!+[NR[͆'zx^ `zuYF@|<)ߗ%Ϊռ'`0^--$@dNa/m<j^z[>kq8cy$RWMNZka?ly[SO-p~qyP?4GF`ʢ:;>U;gm7~^-}ąt0$.|y2 r3HFrH\3Fr bX@ }&/;MH{ زwNhm|Zu833Ʋf ՖVZ ukZݣkVDZy5bG{g nO+nϸaAx-F<]0@ܿ;`@p^T{o,? 5T`ڍv* c9ɵrY,jrVjrkqKMnqR-˹㴵(<R7Y;U%;4뉋eΫ3Վr/,JRx^_7xP5pI 0uں^W1wq's, M8{څjMvR/'w zo,ҕ:-Ph6yb8pșy.NN7ן[-?j8=Oi Ap_[u/`le `@rw Ӆ}q> x,k7@~=s>jN V.ZXvt 9;kocsyw8> K<G-8x<Ɵ_ɍr>> VO2n>R WTʏ,K먖tPEQSmQхT`w3.5U?cmďD D"xL|P1\H#Z>AgveNdFpk ~ =8}8GqGQ?oI֍'*oePY}r7@ZpsGꮫ]VVk.$~Ph\Nĺj۰n2mFuH7Z5VOeUkl6Z،2s0f @lMZk>Vf`qqUө*U^ڝiW?5PJ\ktػUGֶjaypEcoDX_28@fp҅:e/ɖ;Y‘;ؑv܅GprM_W6RGo&֚&VTԪf?6GZoPCxW O&$ x΀j {*f2b5ON˱jN7B&b_8<䧦XZzvwqNn?wLMHs2?:5:oxuri@>u2h#QQ7"\Vvtr԰< GӯFfe_oy(sbCv.7&v^}=)z*{v6U@<yI~UEwZB!7Օz@$/Q0V*"=B?DZHۗ4Wt0 ݹ"Wv0~ @:s_O%nZt$qL~9xwO2QԮ/wPj##BP$Nݛ@[©-b*^#d˲6 |}\y|0l2yp89 ՝c<7= ѽNn3-Xj`0qB#|}=VxjZї]ՌC+EX@j2q/CvIwpNX֢ ,?H!w6i 5p~/Mtv7[糷۲|H1 V_8 lFMX2b`e2kX>kWܾMZI2UUb/la ZlBl(B͠6 C\Ryg: KVhP[zp7qxO qr0kCXjrp|8j~ppy:W*[a=mMbOm_Ķ 6PTӇoaEP€֦PˇV3$qT?kq w xR3,s5Nנ Qd.fxU , \d\L.r{e?;pF9G Hh枯MtE6حK9 ;:4!N ʩx4%ipc ޕA^&Η"jB.Ʌo# .7}>ErRc1Wgxt⳱ =`2\K>Q8CFidOk=Vɜ}@VGL,D')źW-`''$j'58LJONyޗq= y\a?!.p4v۱~ߖ߹eIߚx82(f۽_j":qP~US- y&*BoqZH^?yڼ :@N 8Gխ.1ॽr}hչC*/S1Kub1! ^p+-ֆ/w3rWںoM`N&E}u^'D[ʃZ^J_36S[egi^9Ƃ-WnJTYm9WMCZ˹jBtUĂ)bIOxnu Ǚ: `v2W 3`LLy /S_g իgИ0[L\Z uW@|__o[ ?@LFyif` )5)F!}p5{Gwk#F:b &FӌwwN9ޙSWZ"$𮸑3WInmZBZ|‹Op\^]|"Op7[nџRsEO5ډ.Rp^}N\i!M&)ܯ~G"֠/q`XK֎OjTbD 6Q)]S&r\Tí.W6z, ܮvR!]Mir nGu4EiߍNo\UE:== 1|6_o6>p|y z_5,9Ys: .&/Ɵ*ǿM|h_}tLEz͟Jj~;LIu27-09\>?GLgGYq”fòKKaXdau>+՜[d^MOĩnW a d}h vӈvrtt'wTJ-,4sԉijT+4ԹY4(nRWr,lƬAgV;Jl*yxoZf3KP1y7=zG[vQ8|Y\P10wQA"\b| v{8}j1 ^c앦0@sڻ^Nj =/;Ի䝷,~BqO.Hݒzd26]vJ[oQs{F9E/ߵ{.Mh^ܡ^LΞ ^ I6o52|Jr.ˇXn`Z26\TQ4Ƃh^RL̔60.Clw֟Lx?Oy¶,X$bL8qo_@zKĝCC+.c/ 5 XӱX}pzpki`ɞ_oNꞥdM=Ekd]M>,=Muz{vBgߩmG̻oZnR*q|R:Y|H\7wi@e-]QybhX:n'NW IhGxK6BDpֽ6##qGHYRmEFj0|cq8~jK2; ʴ(2xN͙:h_9W%)̍N@r}å$^ݧ~-^&NKD̈́x]p L Z$ NeTB@/]?/(G h!~fk_]ֿ^bk6ƠoɽQ-gitHN8\"ל~ީК .|ڡ`MM`YOxg!{d UvaթgC??/f`ߗ╾Sr#V8?R>ʹ ES[&\8;UlEć'?*]gT͍QM #L`$ @,8ӳWd/<#Ucc<~Pv;#|Q}wyJģPY}AxѩiXQ@j-{SJf;S}6u;ZGhրPD,S]zVhك1Q|,SJܵEOR>Yr0/b>U/Swr[gE3vp<;>=A 쾦DXwWHEzK1 ?hdp1pvz@>f z~ck89SmqT[\9{şP\,:#_\LNn=*ГkBE+;{/}WJG:w(R>X|zGvq 6hC6|wt̴0`I3mN|nRn(@ O4+j~~q|6E )wK| ŋVs]?FwqQy]=#yQ~}<=K ])]"-HT&f;5,XF! 7[2(SYڟ|y]# mJh3`џcO8<?0sL#yb?.qJ+YFH @t$lh+٤l?]\B7yNfvk fm;Z R ?zȄ9Sv:s;,RxO AQw{ gJpN}ɀ8|J!@s0R*q|{8=8vIsdyo@\Nq9z0HuN)4u0PyC̄^7H;o &0}2`go`aX/͋vߪ7`_G{8R="Wg!3u;8a|WwN/g7#~n)8dmD@}aFq֨D@_\d1 u^ ׉*!#O\wGM- 7pNMDOaNM1Ƣ1?όEd2/mUt2c6)a$mrqla @{o9ٗ%6{~qMr2-x'4Cf .=z&r\˳fl&"LEt% ӌN_]T>qII=З[K~,A/]_\y#`ǫKY^l.d*^)'z@5aU4$$n猻1JS 0mIe]ʔQ*W%FC~]*G7VR,UI> ˝B. ˵v QuS0„kf*OⓊ^wjf]1gT9?;|K2 qGq|V('jb 0ãbe7wj>~`5o5z=` NAh^f{8$c)3VDȦ;n)Ξ#:E>(dtJi_8edcc|{oۥo5I$+3m_iW2ǭ>2'Q?F[ lHUq8~ߜ.Vx"3n3*_螞/j42W-4< 1x 3JtH2/ ̱7?C9/T^;5!^ r:˜SK9'z~2tslmX@Y:w|B8>=s>x ]4CW_L<{yaX$v_z|a7eZe8zd92ɾku-7ʔ!҂Jm\lРg(ފٵۇkYTboykK h##~ǿHi z]'`΁p@5͍yݙhN'hOoTxf 4*r 2|mRpgF]ΪY0̺7w_;IL-;|~!=߶ye!2?l lhS<(3&ϼQ1ggt﵈P6/SX>΀Ԓ#l_{ Qe)Fam&d#=f;U , @v/Tz5t#ҩ%̵ w厏ޭ ؚnh#Q@ |vٛ2Y20/׹4S` Q1O 隋⌀Ğ3`J1tnH ,j[%\pUntʘ=. МoIL*r~+P4 " 17Sjp=I&=`rל^xk@pޞ9ZT -҂;>j8ȎFo$_bfI 㱍xRS7 1 ( W.K،tۚnS3mjF-H[ԏ,H#Vf.!xb0]FHC #=^a6Xq3#c/ n98?t;1*7#=a.:Eh\]l;nZ5,`0$^.;+NIw^_`@u|6գb3 cMހa^9-G %ri23iǍ9? /=9ӇÓ'e&4| Q{W@>:`=`9e)Fxe߹6eμ6gB=`hQqk97˛2$׷Z P>7$K* ! ϩS-8./y5u2q=( #g$Xr/wTۧʹ0%9n +fmܑ ?#gt`×dx<8 TI ǽ@21,k9p*3RzFHq8~*3f&q8,}+8m" .b[JoOCr$pCѮoa[q8~\ )'PN[C-+qFTRJl=;E4JHvdԌ,oʞ6S 9/ H.~'֔sr$z='xM~H1v~pQ,`n@j|G.Dg _fvNB$~ .agg{@P_@ ?4q uOO7qhSd{ŝ&u ''Db9duWb}x?sl,`Beqtdwۏ8@;ĝ+ n8a" 1pa]el @b7p Ͻ=~Om${F@9@=b# =wϖ5y. ;kqY@?^{=ᱎW/Gb&@me0po☇L8#n;7M/'岽YMikym Vm'|pfxpw]„7= @'.ō0]4{Qe?H侦W[1IWo}<|p]„QCn?Q`jIiF@طCI)OKL NK*h¥}[[Ray"eڕdI% 5_6˿.vۏԮh;Sm@ ~M~L թ=a֣5]T&Y4uVvyC=`S+=t/+`Cc>Mq{Qz@_#}ӇӏGvQy(\Æ%Vc09y\+ ?Wu&gOLE,qjyf9&@>4Rq|ĭQĭ^&˧hj 4SnUk+߶\ye Xb@ϭ\f DhPSm6Sk^aFr)y^Z`$x@z遑^`$*#z/S_]kXn۰Boz;cBz7{^A.0J6ӂHmyyҼ ;텲)2RHF3ɈTgL2RTFCɈP1D2E7?|B-$'=*/VӒ +4(g˩nLOp xWH׽ :rĘ|tfKtT0>+s8LSFuy@ѕL\!;^cA(_2Je'ͣf#")?ș3dw?@\!XV8=(3l}Y;n2p/=xDA L{P+Qbo2?|#= 9R6ȼjxvF č ][E_ }}>EO7.]/S* gfՆNnZ./T\g\lxKRxEf6;j1R>Ƣ,J$ZnTk3f[9fd8 i&ȜA0k-# H0k #b^5 Fz^{a_p~_z-'v!QQXQRF Vh ]RmOF,T;^`ڥTiQFWaQ%#H?"8O1}O-~N1pڜqGƇqQuFr% _Ǐӏ O\SOAjhZhZh!1 )f| h}D]3?oX/pkO4DgSwE1nh9 kIPtzx筗l0<9-R&8E[9>d*zxi72(Sl6 5©Fpbol1eF) 7U+4"QuO =uu/ HNnM-߉\aD[ %^qW ܌x qr8 vL>L@ D^<@&dxx~3^t _6ץL c*/hfݧP57W,h B SQ^s,{~jxo"MfzoJpNN?3Tf  `h0f U N+11%?# B; (:$9>3 2U'rhG~ōL;@xOЀ:CQ 8xjcvpS PW #W&fZ0AWܳ㗦Q.?{{ B`+[x+/m5 `y{hsE$s#Lc@Dׂ]ޑ2Li!4{PញSg>!矉YdF})X wPr 5}xE\a*o7巇SQ%F(7Kd_ [d>LR|Uhn{ E:\u{d e_=4o뽡&bO2ub©`F HNF^\uV>e #cYnj<;{9~l?iP4h')/)!KCQ6dՑBa[9rd͸͸1*FjUpyDIO3-tHn!zQwWHخu9gWtHכURk..wH/.3ҋˌ}zӋ͌m5bFz"3Z|t .SoV6?)FT< E;;nipSnRռ|CS~;dzE1[Y5zq|ج5{Bl-fBUF?(>I6/YAxǼUVR$gHx . S?})@⁑`}Q])8?&jSPu 6W)VEv| 1\Q@ s 3+- $/`'N Xdmp~,e `ukt}wI)/+ %@bf(sa%LwLp.$[O8w#aW5_ M~?7xj#Zg6~I~?ή$8ʶ0f|iA@v ~qaҶ 6SLs^[ugGi)BOnߟH2^ƛ=3L$IV$b pG/8g=Gko@ީQ!>?7ZzTӋ­N/JN/.o\}% A7?7E#8~X/=7s/`$H@|,nq `iØWy-3w9HI<NőQ4Ca[;4^_0 <# ,Pew!LuL2U!O; {,2SaD^H Fm|2Tr@g.XxnJP+yY hR7¯M*7ygz@iW)O eN&4#`àY2XL#sbps:<ZJ_E_y%klsuB`6h71D2t{n 8;ˀ`@s>xm9L#r;@яkgEl2#`q#S`Ez{,[cW_ﰞV2[!5VdLeZ2w/ ?/zI<wHNqh8Gvd(Z薉<x"]ZIW P<Yhrx<0l7Oog@<O~?aqm2qyVEqIfk-fyN;tAU ~oSwM2+8{SxBGXv{8 40j^;UOtzyzɚLH,D  VY1D[|o]} SX;7,w7}*rYJ[^ԬItf*㗾+3N [*\^j)j˃B^p}3yVH_ś'?4'PP~ܺH}&rJcer<(^L`;L$XY xw0oIg'.yxv $u-Xp8='H _e <ހXD[X(#o,@_aFEhS<qߵѓn݃mG sHURD20xC/?&#D`2Q@.I|K2?D1hhI9KAq|ϻmh.^[Y[A /&uXAK| V7}c X+7 Qaб%ʅx+̵{Z&-)#O>K~ϙ&@.'Ń◾!KJ]Y\_Vf_%+wFv^[Q;bEbSΔ`}? Ĩw8`%1d'LoK^/,n qz=9u~='0- Y'n:ȎpYZKW\40O, @_iڿw$;{8^]quI@sچ+o@ñM^(7Bh0 mksopn8@w9Z'7dW P*_ٵAc~de t +Jl=;0Wk[|O,ּ;%͘=Rl/yandHLA>oz{yz>V Zdp89 &]2ym+QPJTdl)+j[E!*_EuGzLQ}Rn)S}7 [j2$Fd4/7Jp-/#Z-y14Bnn)7@p3ڏ{x !H3 Sy` ]\\Wp*=*,o>7[(K#3ܚF q{Tj$OoTO­^s{,Ў58|+쿡6/SxD/@O#wvTؓc;i O]5UGRpH9[ ` =xy wΟpJyqSynCݎ'1 lp9c$q : &^fd{^/ZjN39O3-pTG?7U;1D x-Sէ)b>t;$ @Q]O& [d>V): 5\ƈ:#]<7mB{:*9*i`|=wxzfcbQt$(h猻ɍ07g}ׅVUK4l[W~!bJOjJHE~8UVR_W)cQݓR6kOuH}2p~5%2z4dGGw5 Fea.G^[ݐ"'E qru鍀nuFn7}NfMG37ECE6( 7Hb 5hEt@1PjC_ 1ĤDS.V,]H/SQ /\R=H.)BWKԶG1ɶLwjs9]'\QEQ@ʖq`JEB>4P& $N;o2=~g|;s)&L=v'} y4ǏCyweΏ*2P)8sk̈́Bހ 4hp@nt1ӏnԴ%#1}Gw e>) N`!tOyzKoWF \UfGvBt' 7 qLor`$MT +nu;rH8t& HzMxؓeʾz^=Ɂ_zts*xCSMGyi;M2P{ۮ9ӁGg[) I̴7Od͑ ~]{*w+|ͫJ ;RBq|`NW|йKB~ )>ItKTs3,9֤{ϳx /p1<>/y\ =`|蘒./V9 |#+ǓG xxfSi\͕4!q8z_=b˝oLVLkzZX3Ǯ"ϗΗ5=~UAG7&I:\~\S[hSW |[dP?}-A(ԧ0SߚdXȝ զx #M5$G* 7+T,T@tItٵ~@EhYG e qz@)]f)Fdg[zܐ7:TȅY{8SHZ񌹜WJ̶r0 kn2|Vq2q{TܖlRc4sC]#^搟o`A 0toF@.7Uzc6/L1ڜ~I7|Bn= X3!~4TLD: d$Z };3&pșv}?>NN?_lwzףq謐=4iAGa{##`ڊB)3.D@@ Z~Pˍq%9:f$S =`T鐛B ꈚ'AaA15#KoCz/O)%ì\̴@ryB8n N|mVLYfhjJ&1E /T '}:f45ϜHi3RGڌˏd; ߧp8uH#}V qHf;p\O^Ht<#]%# & 5J$Hٖ6g,;ju[6e63P(ؔLe`ac}Y@b3gYq'YHlI&5P ~??n7.z վ'߽',z4u` 8=6 >TWQ~ge*bb0 ܿ<2€,-炉#qZa Mq/>7StL?W]Pr3BфLr#.P[㑤9[.S͎O?BF ϵU<ˉ4YDrfL_ V7Pb3nY(#Y❱`@Q7Vc;#7&= ,:OiWu##8ƎWSJ2!ϕzIoƯ&g0|~ST"}_ oI=5q2gVkV N=ep *b<dJiSfR];eBls #hqB&'|a5!9 s*$2D![+s=藜jnЏI@?å~~hTJ?K6N, -0JH é`xU:^}qoS[&Iኾ?U_HfKY2< P]"?  99Oͷ@o}9yE|wEĄPDS2<+Bm$(naP-MltUl/tyg6&~]Ĵ|rQ<|Z!]on{b _fZv,v:=<7-xq+!lY2\$&[3lET\f::ϋ>pcT.@з<dC 8WO|(zv7m" >{26 3ҽ`FHz%t8w|yP @Nk4i'^1g N7烫?p*$NCZO]ÒJ4tP\nZ/ p~z:ŝ&u/-4_1MR;1 HR?F|rEvujOrိ&l 8~};yp~o u~pxÞ@ XRNGgJ,!3 < P@HRF:3΀&抴T xE߰J SK= Hlۦng u ~(ytDTm8X|du,_P-\%*cʱG_GkO!"MϫŏGT5gF\^Xq'G. еqُ ~k>E8 gpG QjZlmi<8MU" .0D@ y(Fuv|#1d 1M/N/|rm Yy6\̗Kqܔ- NN ~{ӭפ 8_vn,pIpb$0*џKN9}獶8Hm0 w $R$ħs&~)"ՆY;0K5=Gn}ۦk|C<B =i.:IU$@.:5?ëJT~&8í~{j+ʻk Bx"yP=`Lࣇ{>7>pQkG1ۻZE:s ?9@_@b> d#\M2FOI Y}KiSOߥ&}<? C86OQ7r@씎TsP8~_&S*oUjdP/ľirD@59(0O-.gy< (~E+jzWKOM.TZk)j" Ǝ׍j֩zV"^u2^Gӫ@{VsTQ}n}bQŻs@؃[!x?/_HT< ޷ِuM_ gg'c[%c=g3>\l@&]xBgnYOS[I$wK>3.1øҦ@нd:@Ѭ5㒏mi=h]N:DθOoYW!Ħ39jEۛ2mN^]#n$£&E/ Dr&:P)8C;HgNX(RR67X`ls!qK-v?s,w-+jS#`׿xXIww3(jJeN?By̿Ph77j4O~P08?􀍷ُH"爾dd nnsD4^Js|UA5%M|I3?0db ~ƿt@vc;naiBezpcӏ(sZBŸg N3u\>X//IoZ7'sBr xߥ4ٮ(` ~XKHJ6l59r2~wS] KtWt2z$$W=up]KIxuri6ev]}H9>3 ֧gѣV+v$`h~x@azJ5#pN[ݤ2v%p=)]8eav">Tc$d=<-IDAHDыȷizZkyNYbL- _֞LD:@{W]p:9+5x§&ۥ 0?52&n8gԶ^2-p^Nj52m3zX~15++?6%v$U/v;^wYF+Uߵ{MqP*>׊p{O~wӥ %tA(+%o;[ 6-B@3M: ,QX2P9䖇#ui23po!Gŭi<:Q_j ύ.2Um)ΞQPߛGe]w9KMah9k u;z#{SL.'߯2"'}KJ~)Y~._" yBH?+#g|lrx.5kW IM$e1vpȂd<"lS;DGp2KB3t:ld˂.l  k9mxk6#a~TC*YNlLa)H~?*dhoHl?oMkUϿ5I]5coVWtxȨآ]}N&FD!4fk c_rw>t_B9n^~DC[ 'Ó1XxGp6 9~p?K~۟A9Ewi:ppD;I;No8_1?;Q: C"tHW̅̃'S7*i&S<7sb8>˔ys_tϋ9tL,ҹsfR i=: lp~4I7oÅy^yݥsx\Ǒenم- ?$KpJ.PJz t~d+ԇXg` jZIxnuF7YUd>Y";uq~j0^A:Bs79f/ͷH~z$}jSÈvYe{7_\bծ&C~jO^e>_eA7g WĿ&v^= ֆ[5UںS45Z~W XdҀTũl@Xgp64u۽ugV+Z8'į-{Inǐz/&$G mNy4H&pzoZ{[ i-W[H@9+,)7 a&г~>F%5p-W@5mc>n8ΉvS #޽m hΗP~</I/PK[I0$AAhL(Ɏ%6GMs̿`Hձ#-Gv6*F}tK⧪ƽ}=qxhW!㹭-*!Tִm- &=Ɩe?^!/Jk~IxxʹPASWosٖRUQA7 j%Ŀ঵[ Sv` @b+)g$ $|l~|%,~=q|{8=gVN\o~;0Q=5wJKm~:(#ŋcmzY8yI`!i^QT'cIyl9(PTn@w{|fH]?OF?HлT]/{ݷEnqfcL?@>,f0k7Gom8T5bվi0OÃ\b| M\s8p@\_;\:W*Ol9m%9xg)on e/RF{u Iվ_߽+s" .\~f!bq+o= T4%{`d約J/)Ӳ!z}j;\v^& `(9m=oCqF¹k,:Iқ*/a*|(oQ"E.k6n"lݣ5@3 rxXG;xEm2K2Gjܮ<n-wpOy@G½:}ܿ~˧"MW"_MSH8qcsz/ J<~KWxxqͮOzc$sˉeN Jrv[W!ǟ!-L(|SyBqhO!~;|щ3p, 0=Ns51pq&QO.^f# n|qo+|=ڼ 5E,^QTa?;ۆuŃO46pixؠ i`ހ,ݔYV,DYsV y{=S n%n;MNN/Ϟ@NN^uhK0y>^-%._ ;MKgH}2Ro꘬e *M1ͨ ꋃ{š2J w]N$}'N H']p@ Hv:KzFeKhF䖸tL;`sj˭+Ĭ"#A`3͗[v\pw'aBI'Nu? j0C Fzh8HV~O*ᾀB5=+حQ*5_H}"#=4bE[@zHOɩ/`ukt+#wIp[$@Lc.WD#`3!'49(hzA6A汎? =eU~MOs: /V$ϭQ1}|o b^ēzKo?16?55!S ةNw{ A?GO"'ɺZ8mcno+eʞG$r9b^iE<~Ձ8>vMĆhO xO~s"`'s~%z]8xH؇SƪX=vU ?)j~Tdq9M h7$ A2{h6nP{7uz{e]A^~HR:ppQ| jco OsJ W跎ߦ֡|)fB1V_`xP<9:_ݧ'K3+Zx6Epzk6L,gkڕLOk$ h.M. t^4fEcFz{^e,hV˼I/ ߤoҋ7148@zKHJߡT_*Horڈ.4=$݄Hrq R@WzBCɶ؃Rb˿8=4wKk]hj[x0‚%ak-D1"axS= ĖB5z}V|V ñG9rlÞG5 =y6WW1r+;jkGbE5{TΏD7NGOO=3 KSFOvW|1wzU({X8>/ӏ=«y|Sd;?Z{`wX#;=[Zjqy`Ͼأ}q_@9z8#zSWZ=t+.7\θ^W P͓</✿ L`X/rdaRj7=&GĪÇ?hcy"*း_ wVopEhuĞ32 0SJI]JtQ<3 'yENW|8~k3ZzX31gyuxާ6Tx GxhL/NyY0 L8$aw<Z!{Vdf'?5q?˿4+= *=v) {sGP?1{4g] &"FfljIJ!#$)oX+6shK@~1j|O| jz9e^4EyX?EؼuZ2N}'8\7 P4CrQ,}45N[Nqߎ)R6gFwExiI "ODB(`sza:GoiR4TV0ݷ >! f~mͱ)^#OLypݝa8R__7;#rpWy{MC (Sʗtdz i\ \niS(@ѕ앦p@$*f8G+ v`FjGf[cNP[|QxN"YCr[גSL?$[: fA!5'CJpO)R9i8r0N8s2WH@OJ_O$: ĸ 5Ĉ}W`l#5+ŸįW,#ԏ-cKؒ?ߧfqzq~,F5_ؗ.?s9\j@K2ℏ`Pk`K RCФ_70Jܠ0%z2IU+c*@J&Pd2)#+WʹЀ˧r>~B-򦊢+xSsS؀[PʼjʾjU5~,/%Ƈ))ca,P&T4m,ڥK|M_ 6+/eQ @5G5A |}tθRGJai/#(rT/"-tUS{5{ <zkŊ\w_^KaQ\j3bC8[զ5OTRSɧe THb⯖q٦@ O ˮx[\{)?F'3M}wTvpx9q[&χ5DxC?A@SɌov3|8WR :ff,q Q}Vu+A0e8=X PbSÎ[va"]FLҟ~QO$_6SϩC۟ )as0Ǵ"y5u!E\ %?9hm`IWA'ܿp)^;X%>3IoV^3Q!kG{yXnU2_D! 3m*'R "Ǘѓꯜ686jB SHj e7r \FzC?G-0Č 3rSZuPo]]; fF@wcor2xXDE|i1b6xN"BvϏ8!,=D!/W k;ZB, O iRS)Ýnĝx W& A^] E-ޖQ^o͙3w6؄y3s86r1UxNfRG>fBأ??~>d8iXy?kX"3e aNf*JA8]zDNge/u&D>%J>^j9fĞ/׆wx s|h+!6Ě{FضXNIEpEl8?;qE3lnp2f'1 ~0p?I:f}?hym|r G }KE1gD@cs٤5l;q2NCFlp2?&'Ylq}J&Ilp2d | 03U{V'eٱ;3c8Eg68k/I̦'9l\q2U4_HGD~{Gc-.QwA-/Nf닓s~k>p/나$k7!Ghgc2wD|'❥ >#^Y#"G<3f0#]GNG awDvιؓW.]qj?ODv|h(n" &^4߆wizhz':zizW>6P/3!wenXfywF,~kDvk̛Dg}+"}ZcX8" @3sICLXeJ7{)N8F7S×wD<_|A$ NU~ bhϺ45dy"U^O2fD=旖Z~%oo}Om3>4L^֊D/SvT.& ^E.,g ;H`k=hDz.rGyءK5.I;G1w4_hyr Roz~" J-qkI^tbN<8A|/_#%BjY"gI״hyǷ>5oy[m ^Rfl0"-o?sA'/~T to p Quf]Ց P! GU |oxMy @[.9*zꅘZG"CixEEች3\LrӖ!;b~ہ"}'> lM +^vA<FAM{m-E]Eni8-hy (L~vzJTm.-HA/EBBpiV5' ^o}].}UqU3w=FjmﱅyG w^%ktK [ի(K=Et/  Ϳh,Z' !dݿNfDѾDD9(Z7OR"z WbJ)?R 9iF=utAlxAu=-ͺGBr\:%w%.y0܏Frz^9}:t17EߧIX_4_If_BO3w4kz5Z^BcD;(ܗ%Dh]nyJw_i)1z>LϏE-kHDz-<|ѬW͹{FRѽ }NFT#lbGG" |"H5 Gytw0D*#@T^H$oS=t"oPgmc;bc=BcTʏMcgyOaIe:ĭUjOBuTϥT~QyG2A$8GzXVG<, Bm9jSH*cɕRY*WLo/PN |T*R 3Ub>P9B|s24|rTN!cFk)2lsTBY\i8OGTr"B\| "+Gd>T9UM?=Ah(s!I 23Lr#!2~tDy0D?۶|rxwi:i>DCq2PQDm4"8"Z{tf6!t}kﺎ·tz4fa!p\R'Al__sE=:[bqKo8 2ќVD􀼼"?^+%̲cs@[ݥ{"-f#3ʙ;dzD?ۑ! ?U7@cV)9k / 4~Qʽľ;t(r;GZ4HWW!M/m a`H3"9ZQڷx8]aDHÙvN8C\u(ɔ mm~x!2_gH̷<'b>rE:a)M=?hj+ը0#ny#"}~IAg ψ i g`D&?)E#^P>O3tm mӚ!!#OdD&C>;~iZ0!EM>1@h\9"7";pF?D:>p:^hzIRgiWrӵrHG:tvʹ dp]+ybe#p~i#W4FL`uot9A>t}3haɞts4[$"]]Yy%o4 gB믭}#]߁ܑ/hp!+ xlBw0 G=Ҿh3 ]7>4t=Iˇ-^?ލ{?7\!]ˬP"ס!]&~׶ rRiL˟oh{ NBKꟖRV[)!ϔg:m%u1}ٻ{//D/#D{IyW4Ouٻ1YrDͺ#ncKNpRɾk+"Cmnz#}g9c4b\冧@,P[3GoHU4\ɧB/uqj[ GVHGO[SD;h{,x_>@d>?{ٻW!h#u,w<9@|o.z_4{6}{EFσ=?yQGsIhq~(ˑk|S"<)y#d7<&:_v44]'|c:7#ڽ# D8D먚WnBu ON}uAIscR/O >4\a'cÅn6oz(\;}nZ k+Fc[j%oo}u2mtm?oGQt]CAu&]i/H ErTޖP]T|4WQ}A*rd'"'~"}!o@i#8yx@߆÷ Xl@t:?)Sp:W6\*]W"VqK}%'|mzgh[qJpŹSaZʧcB/'s>a1:G/{=LO7H d Jy+iYzh<<~%?);uO˓?m'BŰ8mGJ* v,~ML+߽yB:wRK_E:bq&H\.Yd#u8Tm#F_N%!lp8R!uI˃zG[p`x:..YV d|.lMC.y))O]sE;_GJP8gfȔ>_bzϔJ%ruN3\0=QَyP.'B[ &h'_A;jx@):o F4+mm\_O2`;ҫ|WIGTQP7T/)1`_Ab ))\%Id%:=6#.j. `_ZIc\җJ=^d<o=t |Ww'gsTZ37|(5ddNVI,G%ӿ>fTd`oȨ`oNNwdhh9#ﮄHWLhoFTQU(u*#W41ڀoQ,C-bp%1 >{OʇϚ;ۀrfđ k}4ECv>NUiAMBbROve#rNF:/x-VYfis<'4o~t~\ﯙ .Y+LcA :% B g'KS{VX{[ =-nu wtG =o o_EwGo6!^Laň:ĉd]GV墓>T|qRկG/xmAU5Ye>l_.鹾qb2b'Jk".!V'_2Y:%9W}̈5z ÿ&qt.+|{Ͳ>I*}P^Wτlssn?V<ģ|1\/|xgc2HO7˄ 㵩&7!^s&RwZPNF=xnJ%.?m#~jD:DRqE&=4Q/%~i|v0/^(?҈O%`!{%^2ӠRoM0*t\畝xƌs4 ~ЈB .[um fLfʳgC,To p&NyyhF >qa$āꮔ93hEچrg?[G,%1Sy~l#O44ƯIOy᰻*5NO/=5fF?*OFޫ4U#>'FC@7AY}IH1Gx\7( gY*wIE7?:]A}S+b?r>XGO[9P9#!͈q ~x!`CrbhQy.þ_bs&塔WlF5D3"/?F.z_>A}iʏWy<r.Fid,Bg97#~dxěr;Ђ[x =V+{$󿣭V;?e/t|׌. g(*Q?Kt1x~e@{D%]J: i4TC5)a=irSK&Ϙ*)k$}t`\DLs]_*,ǿꗥnfĚߛz~0|q`,U3s}9tp˹sCu =r=oU ?X|vGa ~Mzt*l#b5_ahB=D[}|oEM{[~O.'jV4-tl7>8 Μ_!!]M 7摿%S~7Xpfg4 'B–Vr9l)g8^F.wW>FD/͟1X~ӽ'tԻbF(5 |[ 6ZqYagPC{#tp/zFDNXdg+/,VF24Ս698:Ǵ3:%eOu]uO~upd@L.ʵ jQ)Q*XOa=j:C.U4˯C{ :2_3ϤvpX/[T|v:I'QeՒy6U!XEenju6^#!3wM̐yEY3 Xg<̧88&fY./;U.yF S\qnr)w&`*cjV-+ q 1DFӮry,%1-咇Thu{; {%ΜL79IGHB{yh:= I-ʗ%ߢp?Q=i54}Ia^m/maG4oY$ QIB=H?Y{蟜_pa?}JVHR^<X+;jcgtnx|~)zeԌS};ykWYX_+YXurظI3?hJ:hSҩ[Ǧsqyv-_ya9%C\c UNxܹz7Ɣ~F2 ]iC_9=|ǀ8zuvuF񲳋1#Ny4WA^ssӥo_-סt;4k"X r|'o=y>sdNx@#4M{te^gFD8nl~Μ߂1zWry5sG_XoOq47Mo,zKT9>O;>KeFĭoWm-HBྏHxF-*@H8B~?>*w;ɭaLgs'E|.^oڇ{F~~"w]'> 竜p 3y׉f-ߟLs֬tL>ąG;b+?T[TN8&_:ɗc\)giə*L9)'/ rcB~McݿzU78w7fhNږ Q(&' ~+yvX:8'W&a #9erf=حl>2*:'lGd$ O*2MN&'8 yB"3Z{Cr[ jR98|}g=06vJ{;2y3HmAni0dr 19@N&G r;wt(<49|%ar4=[كM |arԂr8dr] 0yLlyfXYCdr^L?39ߕ<yLnR&~7}= 3y:|%'1~L^3y7<\|+9NcSJm \fƁLNp XkD]1yɁLo*T'oJnyA=vjBT~LW/ܴB>^(ǟxoLS񐎓d9x_&9 @&My_nYa};sy#]Mr1}aȂ3shRX%R.aUӣ0o2Ѥ UJy?+yT!wt^+yp4_<8Z*qD-+FT v\'Q_W|f{1sܵNF pvuY#E(pm' r 'Y.6F*fz6 L/tEA>\QYxǤ/6" Skj1mljB$Ɯ ֣cW֋d=Iכ(]*ZU׿+/ qjƗ~1*uBWʺ_(OP|?-l3Er2>N5 }ըNG8pNƵ)VKtMazS^Ta$\yOC7qЮØLޭ*^$!oyngL/ +T|_g0 3eu=*g1YLOzW0LϚg ko&!*ʹ9o懦ssGϙAfDfk*Loߟ3~NdrNlfhy<s$rΤ?(zN_);fDz1; ss]Z[:~?oumLN ~"Ieq!:]B9ހY&%9_Og_[2;uDP! WSۛ>($r߼[R 9礚TU9w%ʹ-?Uus^W9{a5ظ/|޷)a/澍އg{nF8ʽG2zC>Tz/vJqrz}r}@Ygig{]>pyk+<5=6m(7L(| Q֎Zѽx4ae ]ﮀs?J*'!Q C%D*3)Mog6U,.s)^"Q#ިX T&7@rMssNTOQ;@bG[y. \NX.=Ri[8a ?Y*7= >EOrO`U~?H^9'+ (K( Er N>5FlJق(s *j#"I/O"S7\"/m9C)AyPK[r\P?$rC$iP4/֚;Kv.OʨOD֧&a3:kH^7Z"J.XiqVX˗OG_.%Z+IIoԏ]"+St|Yj9 -tL-Á'dnVI%cW8/FTw.71OT3lS} W &J5~ҠOZ.X.:9\ǚmtotsPx{{zD?qdCCѳ`z.Epmw8m_~oǬ{>q.}扫yNC'岳g1/}kQ[H*5I> j7)zOLj`Oxvw }ᜇ[u* "Ϛ$OYB]Tstt]9{oXX&+!a=sH@>Po/ m6+WU }6EM{ۜB⥦}?z{ e|>Xj{QVnߤqApߤ_S֥ +ouLط'$O\o«to3J=Ek*G2kMBLa\!wBެ\Tr=Q?JKj" 9 ZVpn©ɮ]!87bf"G'yW /9>mk>qnF'+TjWy#gԤO]yO'9q.");2E2rYuG# zvqu ~MM=cs2c2+8Wzp`,ka'b갾=e2Oq-TT@~U!_qXOߧ+_CO8=qgr>ԷQ y0ذBp,%2d>Qpw<>rƌkjBo!w"B`zJ7`>1؏qº] 'O(j_HssS8bU+<:#4zc<@j7M`o gԎ&Fq{cL~*P)6w6Fjm;`rLNƤo\`Ƈ\ *o>&dr^sJ0!S{Ap.mv~{T1 g]ӫ~,N=e߻4 8ٽ<'؉v#; ==' ٛ,9wOJE 5#()cf0;9^ N-^kO #T2j P^/ٓ}i?@VhS -Lh4=Ba붷<5?=s ҹAnמu4X{ \~8ϭGuSܱUm'{ow{#iOcoK85#(,?;oT0&gEBa_ ȿ?#cQGLCbzQ E~b4'$ OBP?&$m|q|?_ar[ ?ŏJ'uZ:1~_t u?I#'a1 K"%tN B/?uoLp*x'/e<J fmi;˸>^1U.=1^1;)Y,&~Ϭv6_?B\bY'z]% qؚO89dcyFG5h/&Ľy_8H,NDk%;&Hq4\}hܑP;Jbrܱa*?cREF:fR, Jm9Ί]N HEF6E{ql˭X9QшLm@8ɽ#?#yp9c^!pqV*hM\LWT,4 zb^5N+m4,{ d\ҿ/z=/[jql@O1ޑ#t>Og5͉J%c[OGg6!73}6!Z-?>0P͇mWr2Vo Vd ?0Kf",<_4LUG&)6:P܁uE"9{=_CӁ=}ԺT;P)9~sO /wٿiCԥ`DQHϙu@tOeƥ +Bz!N@f S6Œ}aF>3;L_p  LA'0> 1"8ϧk R'f33̌qq"@ Sn”0NrgF8zaDOcT_''ɹfFnX1r*Jd<@uueu9d:2(9+ GGG:uAovN: )^ >48$ֽqE7} i<H~8ż İO2tqD<:j^I/DoFDum#n4GLC\WcmhUL B:QV~8/Qt]aMЌ8= wr NB쒰 K<M -Xgj%"/D,ҡ" ytA̞+xh b&ӈr@LdHvN塯5~Gpr Ūr 1b u? BVDV3t }0O >WHg a4;Gi>>+i qt'cqC<|w8"Յ3C\|$G+"nΕ8q{lQHM?=F Bߣ E߿Iψk6J(HVl*'OH{<˘3 ?0)`H>it譻}:"`w@xHU;H(Ox9Jшt|4F{c+;b p>O=jCUFflWNۓf&푴CE5kxB:^ xcs "kVX7rphD8Gl*͈m~k{oZ^s[(/i}/?}zE׼O':{2z~7߄O 6G.uLxPhD|E4~}:_wN׈AOz~<<=C%]?j֛t#_ p{{{<8i7"ί|^t%-uxyoC Z C=_I{tJdkNagD GѨb+k)gF Cy qbͦU5&9}"}~@ą~] @\0c7ĵSCܰzss;xHհSgFv/xQ7+y?#ABtCџUI87ĔCr+*"h 3t[ku ORbS.B4nkDpġ#BK o/>CϩHhSGDbk}q@C)ф~3 ? O;Gx">DA큶ڞh-0Đۇx!wH;\H !?ν+"M%{;5?*:4[2AtK{~ XS~MG Bnܝ+wsz›4\G}D̦$QÍ+>1(*odDZ~h}gJ;SHۣh Hrb|/ڿip "D w|kE=Ϳhϋ#r:[0[wWBdV*\?tr7"&Z Vpr1||B`Jn@!X'tƀK8%>DzQͨX 2í0j 0a ֽ1b rԓRoJ=*Q]wǾ~O;HWg'̋'Y7O[UaZ 0`{?;||p:_ŢKo5?{nbFd|" j~h}(室[4 XcBZZޢY|)iFyl#ˆFKjew Je̛'vPc&+4=|?ro%Qe*|Gݯ;[*UO[Vt?GޏLy?Ugr:\KN,jˢ4 ƺg$ C+*E95j9_m5p1HE ;&H/>Pc^A"ؚIbR\3mv+wKso)\.'s f-At<< ! Xzeɯ5 UKLcl#ǟX-a4b"o$93u8^a"[C #ګKU5*KpE*4}"]Bm-W]l0shX;keOWFFRHҌ|dbA;=rǫı?QRˍRVEr=fg\t#'-xL`uoĔVu AL{~bD4D7HDO9۵Hߧ[)˵\GbrY~p0 d~2d 2̑ yM/ͯ)!V4ΐ(hQi||G 52bQIREKO{}_S$}FThߧOT{:{v;2{f+}4"@C߰ʋ4Xfpw@|n|<* M%lOĬўu!nŏvvϽψ%Ubu}9]o,#6p2(<ؾ`oDÝ}ow?NAVK!ttW:H)<4-BO%9@t1I"mISy9iwD="?G$S6B:HN Á^ȄSsYckIJ^'@M@t Ht4tr(KA.mi8}_4C"o|xZeFrJ-/E*KQ/ |[ L^ Œ̈I^|d@A-FĐkI&>=k甿 6f`TrHcgo <,FOf pmA#z.8\B,23i)>ڌɹpDO "-o>Sݕ(Oz[[ATJ=)&O{ۣG11v<~^K2<K(q9,wHV!|Q"3W +?BE?4=4= pZ<7=^ ~3@wALX1{>iz틘!y'Y:"M'Q]#Eߣ$#ߖ,iiH띶8 NTd0"DNwjt!AC0 0vB.ޅ&d*Z8~N2~0^HTt{$Oۅv+M?|$;1C@XךWqr?= vmpctj4F=QO`z 4ݩ:EН ߽SHyl5~+T?&ft(wX;Z%Sɚp-XD*\ǣI_T/s.P7Nޕ*b SVjeLU,RyfP<lX&eHG]|C98NR_Ke:_|0'&DpG$Wϱ_53v5|,"[UTқE,G7lHo}qOrHaYDiDsV|WD1GAa=D4;\tFO+ƉNk:f)'"-?>kZ4tJ5Iy[?9u-9:D0 V/wlqE|gNo?yԨ%蒣UMEUMS-E¨yvgei~Z:Ukj"5w>MH][Fi}hzIyrk*[ ϫwd^?ly"w8 9)pl<fkIKSٜuU%_&tSn^~Ho (\xIOo.荲F9f X:~K85?Qj=` 4I $&Q $u ynpyG)52Wz7yE A%)O{Z'_ :"X$#etD4#KprxڻB "X!]26H@FOrrH9˷tBM~{*tȢV|]M=g;]l49[ϐ+*\ǚm$]@)P}s/43#C/ .͆gM']|D*_5RS G 4>FK2\?7U~ͨ\(B?w"Yz7HݢKҎ;u>wn>OߧwT&ZrX{bS Q/ܱ2=V9Lҫ-yd&g^2sWଊKFyJ3/ѹhV)w?t Fo6LG4UC+{Z`fH_Fļ yϷzIgpCa||C#!e`!=ge_^:ƀ(+HBM)j rLZrVR;G2yz%qk_oÉ&G4!;:|Q"WX<ԓ䔽r ]AQ\R^0\KML;@/4!NPY']+G#"82&m2!؋*=%;wizHe|>Q/8NdVzD6soBPVR=nlR"+gNP7!N H҂HyR/ Gf4mRnK59j^ǁ8^R/QVb4@S$JiKiAmoTmWE' }i.*9Ղ#zyΌf5̀IVLh/OX5RTݕ'iV&O|5B-_?6[ր'biAegMy"&`$#xfđD[]_؄Xk6;\A|n@/S=j+g)ڪ'߫Vv1Dpb`B$8=ߓ^Vz_# UMz ЩŸO6߫fV'{UTrINw-6jƧģīxbdݯ/ЀN *`E~ʙ)}k:$lBg-*+WiF4m,WΜ~ =⹍UZj~ւnV>#E~!,*yy3D&rUZmFi{95KҮX;aeGTmT-t]voڿ}ln熓wg:%WuPn竸\P~" b )=\+wuYݐ 7Aܞǧ͒]BC=Aw+2Ԭқ*m8p}2:6 3϶2+J=r~*^Laň:ĉi.6wϮ \ĬA*fsNA. fVzb d(d'Wx)\A <[ vv`FmPy^y_}mu<}隀 j2szՏ墔-?ZJz4A]MBTM.k@gFCv6o7J;틶? z3}_M D9!=`H=8b;3TcQC:N 4I|ZdKSx0lol] mR[:?ko:+6,[&7 ^ț^rz+^֐/8q8$7j[%95q\ \LKn0 =2xsܠ<71%D УaI[/Qɷ6N JN^KLsoql;Zӗ189?DG/BI{Mef4q2"5eIMIhLYkNȉV.D"Qs=!'BVa+D{O0 '4\sJGO='$1~ZWY=Ϳ ʚwX-{a`ұy 6Zs.~}my ZDv3iwk_[~k3 >kfe6Y 3~trxm!֚~9֨i=7{/ pkҧǾ!?3 ~ ٌG[P>YiyhO)Wy76hzU8]y,*[Zm'?'n)INO+*?3"X۟]ۘ`Z+?*9JƬBZӄ[;eD'R6ݝ# QtLCY\9(:鑲5rLv?[y睟LB0A mFSVrǬ\[l{ 8xhJ:ht[ie Sz$z%6ߡi`ow֝9+ݑK~`n9$N " 7̭4gNzg>шŖ)!'"Sn4>\ݫ H/]iV"MM?ͯ\$ ',7^7۾Gn@M}Eڷx?rv>OE+gA x7" _#hDk9KN7^0ր[=b7,b1 5XpӤՇ z[AҠr̈ңjp,bYB%Sˮ͏T̀p xDVI[EorF.;p@R%nzOԸkT;p9!#S/PgD:Eߧ[%o&X['揆im!zx?" ~Wrw_QvNr>w]W"3Kߝ+,q ]ߗ5Vݘ|]A7܊(o?S+3 ̌W+s(Tҭ%s͕B-*C _j0yJNZsQMG].L9?7rAQaOn>Glzo4"d"l~u(NQxu/"jo]^~LkEfDy3㸚|~& ʓ7!YjDpݘ^ F}MLI8M賓G!ʃ>B7 ŷ~D-n>b"M?m?e(jߴD?+Φ.(qfu<>FQ~GD+'D:I/4V^Ӂ$_irUH8fcEipZS?HE# i/Ρ`S}ߗ3+^>%91+_:ao3AY.'sRSf)X''f"7/NeJ`.>{%gu8 RD['pgAdt9θقwfI[SVSdf9YMNe`"3&0; />Sy3 1ʜOo-Հ)?b1̌#8#pVml1Gifvak-2G~?`f#Ү7A#Fn5 !2gRU>81x!J5Fx/;YsNfA+ )PE#Mc`9rT[R>"Hf׫CV|7XAi'3SG\`A$훶/~H/ߴC ?"35-L =%?toi#22qXi! mЎ<C{STђ˔C{iN^xɷqxDG_23/̗lϩT#ɲQ>?QjdfA9i}7ƜKfNpp2s rT/w ~VYrz~Qjt@DIg揻.ʉEYl1Ex"v|FlXRc#bj<V*Xͪ3&O}u\nC&*߃ q-,}e"τߙyENffR;f3n2"zf%:I;7foUT:3ŧI&}ܣ˜|tQN6;N9.^O//IEyUwD+!|/bU+!‡"~_IWl%F]y{%bbCf- 3#~Y̬n?l[_ ~ fovs sDNgJB{LɈ? gJE$ J/`9Qn _!!&tO#M2~mDzJ ѣ D/@,#W2FDeJO1"èLk:$oM&7_(gAupzDkɩ,~{ֽz9[ױl6n@r..I4=4J>sX%R=iׂX5,PhC3]]+6X#\WTl` ="f7"ڤt^5sUjw.ڤEeɛG[̈tHgDF2'gȧJ'5 ˷{\[Oҽ`j97.eƆ 2SԜ`9,E"Z#gǁ- RI2#Yѥg6tS6*0_eƇ~z,Qs}[yR6r B4Վ`Dnqvȼ>qW'ޝ.v<}#|"}k3ol4iD^W-N~i}Nom˒KgHHGJ22 GUC+\\Sďa7uL2gՄ.,yhAGg6Z&G[iVkp*KeKҊJ,jGA+Px!/ݲ#bT,O|#fx/zx#" ks˃<<=SDmfRIc)9?ryIe=0* o2 1ϩwy*5?g@4݇&[nDTi@t}-Ls]\.BC{ʲixpƺ(ĝǞH߿2&^ >Za " 7"M/̘o@OD_Ygdk5ߌX{rǍ_Gߘs}ځ:vw-m|\)!ىi;iDUӯ~z8tx(qq 4]"X'6"Z: qd]EcmHG33wF4>=&ioDߧc"~XyL䒓dr2NSKLrȨbaip7"M(!`"BZ&gO]d67>DHfb/[K۟t dAB$ILp2 N& r{\$<8Eeͷ\lj9QeQY6d_&4+R2k&t:w "{&+1ƸB챨G1 *4\>4#,([(L|r=aryK@⍞%m!n4.!"A` RKI_ ^?"\2k$g4 s4ZtpV@ȃ-BKcs@ӭ.~"2+Ȝ0@ 6o+" D4=4|HMHHJ'" F]Eg=4Ζ=gG޳$N z"XD|@鈯sLr(#2rTNp:s9KNzFMϰ8#:~sW"DڛN:0<A; Wt>S4\4EGLF`QҀcWeΆ`PGcxHe@؝h " 'k1%1TRc@H/(pcL7tJ7`s~f&IsEN Yd*ɉ[Kc*c,\@x#IՕnڊ_t"FO; > K/~5~|O0ɉ'2rJzO'ub,k$WotٌH jXSI OtEauhT)k'W*+*-?Sw_4G'B){ۓD't<+/E'񌎷tQzJ=:Oy70Jp5`B$@Z?YW{]B{v;X9))7]럣 xQ{E돕-'R4>M]Gu;]+}+ Bc19nȷߕ[<3<֗3̤'3qL*p2 ̄Q?UnH$R qn_+76Vp/*c|p|X?cƟWűf  ܨ5]|lHs8홽 ވ\G$͈HD<<&j{C`–]L_( sh_=B|$;5\c ~"q:'k#sp>o#k|lp22 }k6DKn{5^ ." )FGv9'x)tX D^ջzDc׻ч?#>7"("ٽt$"Hz p bC <7ޜܩW]B;HwQ7N?#>V"{z%TDCVh#z2N&Cѳ6܀<i;BÙ".'}Fn~i톶K%L q]5&qbWGy C͕?* AֹL/bEʸ!zU|w!bq E !3&GLw's(;%?p:Op~$ں7 )[XNf†!2儛 y*B oyJF"]/DQ8|!R3Ԍh̆"6={;Dܔoā?j?Qa4\hzVGԈ7;'Hᮤw{\Vig8y#vEGM햆; DpH駻@"솕햻#"Gl$"D8M/ t=#Z?ysSV: Ηt3/Z/4zwv(Hk$[!{4Us MpӆGMicO'dm9,njZDS*.U)B,XNHWĆvCшt٧RCS8-GvAǺ½ w"nNts➄^!2WHɼovCnD.z?b Q/ղ0GgsEZi%ǽa*&vB=/폶w3vEhzh{iM˗(oZ_d~HK'ʿE˛h<퓖7Z_~&973}4̼9Tzw?pJB{/!_ڽÂhC=iƿDާ4~.s\r3 {y lwg*E4~8#VHI~ICT@E#hgzxӒy^umxэH@?M@B~Oxì07"5FPT& % [^Q#a4˖WuA?k3\쎘YͶE#~ޱZ"uȐ͋EMk 2Y~!Q@M='H: 7(_#>M Fp "|oH!Or})9rG<{!tlsTĩ>s* D+7loGl*$͈m~蝣ԴވCnFakzg." <|w8" _Q3n7\n}/uLx5r8=}O>/V5/rg"CҰs*w-?#~8~Vl$FnS#;zHKcuĊ8?g>h4{!olDt^0"mOWHHmu#wFYͷ"/S BI6Hu'Y$5i'Jg `"}N|?}e͜fdyj[t3eM+}O;hBiձ vvo7JBvzt&\4~.)xC myA}޴ sE߅tSLz"N>1@h\9"7 2U1}#miO:(&9{ %7fd΄# ~Zyfo .L4Ҍ(z6@@$fόXW͜:3ԨҫfU:DV1xޱ&]Yr=MZ|c# XBVni8nG*Dkw+FGy#>Mͯ%[koH.7SM.oB<_2ã̈ӓ`B:0ꍴ0oL¢R38OzDFFO pMzAۼy3,h6ߛ1Iyh_vg:1BC5w "v&|}_d倾/ \":!Χ pjBdBd`_/E"U*J/rfw cj=Z-yG&~ LF;+Qyեd }_=nT;Y)!RmeNߧllZ4|` ;ȞEL- 7 w[9Z]GDžfZZo;bvge#p3o#?"xuA>5R0{]шͽtl}]: vIq?" =0imiDxL qZ DZN-87"m't( oy"j^)\Q9jv^>4w4]|PM5_P4"][{mQ><+Vfr_ߨ9(oy+jcYrZ8"5qѱi:xwYCdƜfjVT#Uj̎S{󄴏BfAс̊EYCozDDB" 9=h@~OtEKEz'5k)j2B_NSkէf8Yj_dN7yNj?&x)2;(2+(2gﺂO[:}Nѣ &]wkvc6VKѺAr%#2e ;id0k֍82)cE"wG%=0IyUC%\h*E"'*# $҃U$|m3jӭ,3҃ghhڮE kU Ӄc/aPcr':HnM76Ͻa[wC"=eUrPVkzm\^ݰ'%i_͡Q8D/BH d8!Nrq_/N揈tT14N毉3U=' u3HGo͗[ۯ܀ kG,TjEfaGtΤR O0>۽0,Di~5塔6T@ M 85䎚typ5Cu؁J3Nu&rdg/g@d7枓0s经њnɹSd; S!'ypĤbDZmzM5#@-ϣG$ߣF؆9t]"'tukǓo6\]Ar@Nvɮ8Q8'C4>=AyϳvNvEɎ9:]1s+";dGW-!ވ("pNZr?Tn]2jD,-L{,}gIegMm@HSL*5l .0 4Hz;zQέ/lVI˿ \mMTJT<@HZ!n)D3@}@[8@1 i RÀР!5H R}P_+# Qe"e4\dLdHZsWRGg+(!.Sq֬W^x+^Ѥhz4+I*iG3җ'1 Z߳Q;lգF匬msMu _ i֚4)'1DMiIjzv:j烚Τv7 jɠ=OU9S4~)POjg%~,otEH;h6;Ȣ%.?ҩ@d="i8*ihԇH* k@gx+9~"h!l.} "C;r~|" X)8VQ/ úpaDU*' >_u?D#Yb1/aJ p>DHksCn!8"`y#dF^3EMʛ9c-2Ԩ!MVWˑς8{dn:>i%4We?9PR.V vyeZy+Kh:ȍt> SF\" 5HĨ|Y"Z噸 "}/įELO! 1ُ IU-BߋS5ߒS{ $ HXTf|9NYBT~Wc[ǭrs۶S/ӗ3VIHL'7#N LM{R9LZ6m;{,%^j{B:^|Ҍ5u׺6?4YoXX&+aFblgޓVpt݋EByB$Lf+3Ih< |#flj4bv-F![zv;(1INRwؙQ1 Hj+技 -1!pgk1tEzD7JM8Ĥ+`REaP}ING (+OG9]c;$rRQ*JAD-4D4cCڿ@}(M>1n4C7Ft^4bB'y15b*6!zU|w!b+Cy U'Vzux"2# '3ǩ ]5]qYc"g D .֧>Q|hyaf9Fr쫩<ԍ:j pv̈y͞!iiu*5͈.*k?Zh=5qÏJw9~fc;d pW 1oNl_kٝr|bNd>,?Wdnj 15tK%mqs2~H{OK'멡&?4J9ry}fD^NPu"C6/v^ĢKT#۝%%̄oxhژ: lzM#%&-.P3%:^׶q.DF 8p\"i8htֹL/&*4#p~;sAL8힐rϙ(E4~}: NhksncDdVn9[Nfz"2+-畵D"b_DȬ s[e:"ioYUrjֳӲ 팈=׶E|XybҴNL*a*=OU<vSe:؀iYofD?GS8w'ܸ ~rFy9͓jJ}<ԩl gC"  Xl@79gpog}n5ut3~2 0PhkJ3WW37+^x:t쬼qtɀ?ҧrkr£-.v[ڹ~ ~#TMн4FjMJBd&6&yv̳/M=Aܹ2nq.f™!N#];#<0bĭ}#ntDNߧ߳O A齘TMx" #9av!wW 6_3ւؾlWwbyBy j'|v8ڡCr|c흖(BߗT? )<HC}ZrAu:<[#įRW]{J:JrիxgZ&L{+v; %>pBJ#2NN oDs{cnM^ e'}m Dd?^IJ.tQ'9`#ߎ#53#roU冲؜ZgAd3,g-͈4|v\wU բY.^%F׽Ҵ)/9.uw vLYLm.+UAB$8A$υ$Hía4Q(߯f- Z-8 P^ ^ݿCHUjJ (_n@ߒ?W\h|+y(g5b̑zJW@|SM6[F$3FuA̞+xhbq{#pk򉹇u.,Zxe-amDLPxbe)pk{Qn%MA.mw?Ț86rQ9w R ܩ! % +#6r4T~WxdfDجyF=_$RYgYSeIlI+ ?ĿbbD"vFjߣ;t,$?f?jFE"pk:¢YR` 8kGz@, 73ǩ%D1 ~?X|N{J:2~T.ɹ5 %{Cc_#hE+gA 8}w.c#Hu1d9m!extx>jhM\kL2GۛU"Hg<ތ#aY6FA%H0Ix9#t[??-+xhY*dvҽəűՕz#2cڜ63!2#ڜ_/tCdF9YCdF9i8MBn/]r!ZjQ~4 %p4"݌8z&DPyyʪ 7".Whܿf]q-4|ˠf&mVQ#ss"_oO9 >7H$,u!_exbhϺjEL`$">OSYɨ2&]s 0[,WtoK-ṳ̈̀CLrpf@\PqK4b 40 i4Q눳 Gɷv=F=\6yfH# bF@:P4B^'M.8i8AA4iP,M [גkӣ9M=kY/duN怂Y}?XA=G]LTZDtzD_s*}ҬvF?TBU>="CDuU`82OM_9IX* A?g߮n>̣'\x"2 e7PRSKKuRVSik/e{.97[ai]mLj^GΊeďQy#x8xbv/]{DG}?qt>;8T*o;"pkTдݾ:҉/N_Lmo#]XArn1b۴ 0>iVW_U)ރ_t]܏s@k4O 6HQ&oMgƵ5ƴob^-xSx[Hظ/we_dyLr,+坘v}ɧu,:(H凟.TwDv{[h(ze.I?=~;^p>|"B$T~d޾9F^ " g9kN*s~ӷ!EzSM?,t@'ʯtk"]+Dʇs/^3B2 ڻޤK0\qy%*U\~jhi%/7rD/Jt?C;9׹#f>lmY2/D78Tӄ8KBOͻ%Ә/JnA^+[}]RICk芼@z'mE O/RH oôwe.Vl7b;/TEރEށWz79ˢR-*R٘ fa>]n;k":v_NKK!-'N)'xzK^i5^WZzQ&^t1X +$y6Ȅ :&̿m ʆ-1!݉ ;ń!dJ{O,AxIe7 3boXȤ=OfRYP=1zʂ蹯'ʺ> ML*Dޫ4UBKF%?EI8JIzW&?&ɟ<[ɢ-_Zlk#gioxPgAKAI7mw-*'Ggi{HX="}ۈ9%dόHQO$ ~+'4~{Cˍuθق,׮zD* NdEYt@j1Z"ʚQyJW9Csv3"?$1͎~ $~Vם%Daot5 dr:6dA+<^RޏԹhzDAtA'Jm6Doc# Q 龎>X'&:M9@5܂khΓDv -͹="EEJa*]0UɦTkDD u~nDո-w bO,؜_? M&5/; j1[ bNWK h=[nz| l~3I&hB Diݬ2.bh^:]ٞԵM$=>zǏW67"kӀ%zf$M'WD3KVSTkːa u$ʿF~3M a(^:w't{μcƝtE>&f딳QH≤ty~*Ѩ=SYvLVlɾGȚ>О,F9IȠw2z:_\M>ʈ#U/!]UfMA$` Y4m%~:9S8a˫y8j!#aP$(ŝ}k}ty*8]|~KڜxC/$MWSb~GoX>. O𣼝ϼvR I|ol馞EB|(PWdzѶ!4֕i%iLHS7?KH}tYHIH"DH~@i.ikGu5j -C47GB ^P}a|M tFBdC}k;i:]o dtd59usѻAoZ;qF$9 9͈Er:N&Nwɔδlc·!i:-<MғKr}N >S/$M AN7 }c4w $|1@ƫQtv#z-IӪC~9G0c3rcfj!Ma$ň@.ݦiNbi۞@B۷@$M,t}t{tr<aHhS4 #t;0 óB\iU4^OCQ#S:EU2e:O4_B*4`AV9\yR-*, t9ҹTdˬerEV TZ/u*hIQ$3|s,iV;[crktZ@{GnD-ۺ Y!纺v`gWO&i:@k, Ef˩i{{#RݎRi$n,6&N},2 !s|rOf>a=g b4$ΛzUs(Vϫ2?ovY-_ ?A'GPT:C2ɜ\~|d+2흡 4$߽RX^\I&S@ O8m8H/Qj~f^1ٝ%wY,{Im==G%#(+"K|U,c/z= uI%Nڜef؁JoaeB, RHH]j@o4a] 4e}l/qݿ %$ W᫲7NW^ff7J)ߋwR*%M/s:I xMad_afGL/ >w;@w?㊜:br@솙1uM Qw!v۹֡ȆwrƕDBoodM9x$4+WLmIQ/$-)Ғ)i-%CRRty=K?7 RtyZS8񞶮ɜZo()4|Jq uf܁2cW-:##!ܸr9ֳNo͑in);_//z~oMpA/6m.O3}ߓɾjAϚ&܈Tk*ݴvRJF5]_]S#'^H~@X>tL1ՠl+ um޾2t痑@ҬCIrWv'[]TF߼ _  BuTZ L S`_qG0}+J0kaB%,·1]kŀrv/hӅ׳ AB8Gj{5;0W։WZg+cKkfZHTؗYhY[Qΰ3,}'dBo98/yf4o|L2)LXNM-hor2SUG?oꍂeeoHƶ[V Oi_V {I[Yki?l);$$9O[λS.R;HuzJJXdo!(;5|zQ_? .%ߩNHz>)sDnFtE~tI;%\ȇ|?ig&@뚜8@v./J֤J%?MW-v&?Xz_V}]Uk L62zNύ/.ŀIaq琪x~ zZnv@Xy>gU?iaԞ߼< 9ZliLMMۏ%ѧ{9qͤB&~WcٴUsjZ"iU ί׊lϤUI;կ.Em ,VkwO1oXF{aN oic=sm0 iw/!/ {d?2o!O߂ t KHN]Xlhaeˏ>9or Cs$scI/}J##߭$Le|!WE ԉq`"2tt?>]>;,wR<<^07B${ϦU h&'yy\9J yf1l}sUvVFuۙ;rJP̝$$D:[ X?Q柨fOQB%7S$5"OHB%*S4+CS Ofc뛩lՄlad!L,-kˉOYYJsMkެ{65lj?y V v5$s>;L2/ a/x> ͡%$_sL fؠzFyg{3L~o*B%^z$_~n=O~*_74yJժo~ -F+KozB-'!%`_ae$ {-u= ߦr8Z#'5# F#}x_:Gti:x~HEZ+$"=YiL%Wdݑ%Bpa{!k;GDL୑7~9Y izh>\wZvÑPe]5"N#ƭlHy`=?IsMc?.Z/6ރ,<8j<o7zn$"do%9; iCѳN H&G9hU-W xhD 䬃% aD&O<t~iu[FOYI?=>t}tԮwF(9}c׆!:ȶ\c_']SPSBMIu~ǫKH4A\S7eϛ>kr_օ>_T}>dɛEB~=x}N-aH\] 4{ mY)R޴Lț-MіθveoI#[/5 Hueʈ| A%QS(R2Zr2w,w[P$ؽޠ0)kӷ(_TJ)=n /XQ"V,ξvh$i/W8|w/fdgRlsI3^sIl$bH^DgoqHw:bdȅ6G.rrmίN?&Gx@Hhdׇ]G&<;qHEEdω5U_8k>0%y XRkMn-=b#ɀ&Ty<ۼ@}[F2G]XxOx<:Oק7 _*7G'@ f ^Fϫt`;$4|3V*6kz]H?\g:yֱ 䣇 fx&݂2X"XM'>dfAmك/AAbC4W}{=8W<:O6`Yn{߸ݤdL-a=JFkW/p+-rs1U t_iloJ6_q."K<'@%+ #He$a2hH-CUt}BT@bKXNaLW+ KI$Ս}rz;AN(w]\HUS+(!Ezuks ׆ՐO\:u Z\a^5!{v\]i<lߪ[ʪ3YrfD19zQ?isH_YJ=]㙶a!8݇Us]!UrB H] A?ӓiQs/j˃d7yi=yd[.9sdlZ!73Xi~٥Guqw< DЯ3"#w3 #j ozdYo"S-1Qy{޽Ҳ{cWcnigY'08jo0@>?73Pw@ֱ"zJuzj5ȾaHzA]0zKߒm}:V/+nx9WʚuI̦ׅn`톞z b׹v~!k'nۇmӃ>j}0dIV "~Z7 џrׅ#R8#zUb2_s|_Na?0.GUMw(VoA<0.> ȡ D(uE- 9YXH:?]ݞױy=]0 eXqkDBeЛ%&@56kUȀ})e850h4@@ ~#{hr@Rzf"l̛V[ȉGck$"} Ow9Z~-C^1 J"=kZ0"<ぬo̗3IӛNF6q1|32t`X8$M7Y??h5ft7^"Z"izjGݾ9t'-kI+l7D⏄ȥG*!W`tcfҰ]Ǟ4NDw<ҭ0H37l-z"7 KD9CҘeTpi¨ IH^fO$]Mx3R7G!H~kH~,gw;dkGMz|h:]ne5)I djWjO~ĠSC$䃚"i~ǶCzZ=s^}~NX.O7 .Իi:k.o$# jz3}z?M:mja0,~FﲯR.;+5$#\xl7 ? askv=f_s1d -I~mtZuV1A|F3M+lnۇzBafZ˹˚ĦR3[E\t47*FJt ZUënjᔤUT)-ʝp[ҤUBnT!U+5W1lUF|,l9@6IJ.rU~ì+r^v[֓r+،5PBLKGm"-!rmުJW`JMw9|ԡ9XrgZ۞*\*I~24MG~sd͊D6gUT"m5h?Q` ' ?].Yn2z;/hN|y>d9k4AO;}z*[zaV<> ZPzqǓq~|IO&azp'ew|oD>"Kn:t_mԃ͖.m[܀LWЪZBׯZ}A\Q3͈&|5 s72*0%$2NԨT@:]/=; 8T'zzDGţ ZMI y~):[J H Ύ=ѡ[o/?}a6)^WW`+I>M*JGv=2T=dT6h8$2]raf;AB,݈LzYY̶0& cXx[4a䊤`Y$IM[Hz<;r$IGyl+`Ɣg]PcJ]?^%d7i9cdq=[nT$戕!7Ugwc踴lze)ȳeՖk|W:wӕT":sT0d>Ch]ӿ{W,KYXH] CHHCxPU8F"K0]bWַ yQF yPQ;<+4)G\WU5(&smoC7Jl];7I97޼lTCޚF*4OB*49cқP Ӹ#]^-Ndd{&dR d ʱM[I/(&d"_ 9b{ Zjyk*vV_dċM۵J|2j꾀Ern09h{:21= wڳg Nj1tQx}jRIOlahFduz3%~Jo} ^{]t~6_m,)8Uoz OW8OO9·\۝]}/+Q(ɽ[ǫWU{&d?M °fYRkv|Q9eae |KBEQ|z]灟L?k=>XF"0 Q?Okֿ\3qDfR&0VQ뼝H9;dD|{b ;|Rqy~ Ci Tp0h+?)0$]ݟe+ε5"itN*[ g':8@&%؝ }]nd[b:m|xcŒF઺`iK;`Duػ%[vÌy[& 9\l1 f޺?7r:7)tϨyk<rl2\ 00]kuO, Y]ŬԎgz!n_]_haԼ}{d~5oَM`֙ ##3- AOwX~le0sZoQW5Qo?1=Uآ~ͳyu*WmQ3ɫu63ݵٮ(hмzw6+blǠyK?/uɀd$KC ̨g[ecӣ^m /j,nç`I!/NMg-_ϗ5T`F߲ `_W G78 EBǙqϣz^y&_4|Gibuw ]O\q1{Os3hzQ%>E_&{}P/&u\-wv!?sh^f0d\Ė},H20J]6}4sUp^'S7}Ҷ=c702ȟ2Ȟ& uk@B<&G@ Χ_ts]YUP C~<;NlL:ޒ;h 2;FNT}$7j|Fވ|鸌lׯ>vrx 팚 ]F*5uV&eZQ%/40`.#Ϝ0kde-$4zF*d"+C-J(wos=mmKq煞7q>LoHGv.Yg_wb^&7/ /_LbI$tD*k* x_aCC]C*kMGfYߒCf?E;o$=èHzgQH?hY6c$tuFI\]adsasdM_ZF%LJf3kM`fW;:=8Ncgdl疯Xo@N!YVn0_5f6Ls!!JM{yg_1^Za9}.' Y=~WVu:=:]ES Zn}MW+n&{U8.xI8 m}uٲQeDxnoxȕwIWj>#/'{s,ij@rާu^S=6ܴY^om:C)}/7 QmYM'4FnuDra:lߔ=褓]}ʋ=|Q"[9#ޯs*,?}ID?]q|BPiYtѤþ8,.Y~xAȬ61"s4\2GCKMȊ/c%O}=eN.qEW^  wB(7ԟpdip2J&z#~ֿZCw9悜S IviQFBS $ zA<0(T<B\*M2t0UKFpЮ~x'䳝Ԑr7_.6]v|b!g[4HգCm #>JNLJ#+g)Sn.WIkqiҒ4"IVrUma2|OiϢܖ/Nn[ـrQ釦uM UD5`k܀m7^z0dɖK]It1Y95_5ܶzQ5bY#\VsFB+OŞ;ȦߛUB$i~lqϢ'J3 ֏#2hOGOI>V0]zG5uGcz0]!?BeHF)?۶6xz?gz>'>Of;6ejkDP'B;&ϩm|$Tg=/ o;d|`&x+MˢA6SkjME M'%&/ϪW4ke 1 FtrUX7Sdr(OklTߢ rԳD,xkd42OJNHNÑEٷBRv"lȤ!Yg7vh_x0h֛}"Z&' 7^T~MoY]F>7@:׳AiaFDN3t54 _n߃e>gËݾI&_΀} xed=sN_ۄU&LbCk8[crz]>HDV9~ҵHwH<]/#)]][;x3~ ##&l{BÝm2fG4gtM]ϑd_ 5a™6dML"0-iLgsہM?4 K; 7H^S!~zQ,amM~$mjDi0xL:/(c K/g0LP1݈zggN $B#iP2l?+녳"As=z[ـNv+v64Ls&^ɬ ZdM լ1>"ٕ>i9!w@d;y!3sŀ,~XCr@usYۮ?GB|pjaiBz՞ DP4KVtA+;VJ׻*H}tM~k l ʱ@_PȤ. % @˼.z O\)\b:7*g77-i77cDx>րTX/UX/Qhj>f-QX/J+F@1֋~:h9IsQR9z[~$'#b;-85_lmeDT[]wO.S#ir%r%ޒvV%7`_L/P=<0G_pKMn/}١ܓZ#ykT!om*Ku.֥JIPDB$o *qqHSHӡZz ykUa{t8ZqAt\%}ZBk` 㵂41V<@.]e}ך26^kNZL^=\E15^z L @SU=̺rFQ>6ƞ)[]O0$#v2i%맼S޼O57B07?|›# ysEUu>Y[~NP֏ysus8BXa|xõRx458n9@b(zܐv97{۷6|{ț=s~8ڮj,<W?7{ě }l7$]]N]O6?$yxQ}?>1!|SU*=&[ӂ#geӟx'sooڎO;}^°}fIlV<@zYH,@$#䟓SqH^9*Us!F+]:6E7l<]GmD na~HHN?v y5nd'$T!C?(d~aH@xxfǟLAK W)2"g$k@B< $͏#j~H+F2-7 yݣpaV_䦈HktEt; E, Iz<vTW'dGE!vq#npdVJf,|Sh@W6Ȥ1dݍ15ysH;FFuubDN?eOcSIA]qrc4?H/IWJS±~+:yۋ\vHѤ" k]9'#!y` ! !0'r.9< b#!  >H^p>) *B(EkzBዄQH@IלB s-B̐d~~ \}j}z|x!=_ ?)HxgæSaSHk Bdr)H Ph M,oA#jK~nZ8Wm&@M FQlH~I$j\]-@=4IF~&P4Nm: NYmHz&i(sڜO6dx[TFWN+FaEGP-U &N ^@yd U{I=nqL瀡_Zţ路&U8m]iv~Y<!yhTaq cVw#/phd=m]4N z;# nbu/KىKF"  *F}0?l#E#y @B+ģ5þսb۱>#ÑN{#?X! !|9.K@BL/$-ujGu GBI/Bwd@>fucz"Uo叄w>sW DB[ I'[ *4. WB2^'zF^V9 !-{_BT$`έnrf@Tg9I/ɦO$JM_柦W./v-6J?wW*Y4&J?MұNSעoioioќ^FT! nΟ` n){NSx moJ 4~›Zm3O<1 {968h}Y]Ka—_g<[z4k'n ';JU wE6>ɖEPf;d׺UuG0ҰoFM BH{^Ω h,[T*;Y<3n㷲k65 IofϧE{BF.!YAtuxtQzL/eJ՛Hf7thϬ8'[a`v$0]j2AF.[lKWx3Wˡ 4(\y,`PY%^Y22x"Kl}UZ}ΈdPfejD=*#;W<.lJOj/!#W,K Ƿm@zIHl[kgW XB>MB c"X&B(Ⴤ~HP9<L"y^!Ӭ y[j%b<` XC1H4e$m|B!c9 GN&`@SQH<d͑:*ۇBta(_$o-j̐.HaDOח` |: 1R}yq!Mq0':Gi~} /:׏}z^=jK~'sڪ'"G""XABz'wCHXF& Rq1e% ~w}721ad몬ر(?bOTf:ɛs7򱁄ɕ7A~84 $oBZ7i0BGF >v8M GNB[;U yb!}.6}NBA?D i>4y i9Sh9{hhW})Y/}DYj~~ MHSIz=V|YDd=!Q"~Mr@> WDNI319zr"WtE1hssoG&]g$ M; % 抄>HB $ZΏ>{ЇQl8-3YHZS},o CH[:]\F.JW.6Iq'p Ε>Imo%_lYj6 X< uKB~Iyx !SDs }9hmx$pA笐KB($Et][@ yM!o(-А _+L -\QCTV|~#>ԓigF^W9B[0˾ȶk[ aG8m!HNc;!S=Ý}H>{@ae2H_ltVm<V@t<r&gԸH뒌dqH` e9r]#.so6Vl$W?~yޑ#HtA^HWjG<2N.Pہ9^ audcY1\6GX @lnc s^$]_jz z/KԄEYW:^0}u{dlx'g\IdqȎ:^@v]vlNh(rȑlc9e7;#ypua^w! cG!:vRȾavO@{I Y6]f%'"~'9یH!H{`Qr߄Wȣ@҆& kIYڰvN@i]З6~c^ IӆŤ;쪩nO_5q`X2_|Fsw@A4ywHn^GÐ+6k]l/3%\o1vǬ7@Y6Դ4mNRӆҼJH4RA4vHش!cO'"i5/ C҆: MB}~ IBE$vచ6Bhz#SZch$D@҆- E҆^UF0&m~Cu ^X⑴a7mM3y"g|r/o`>P8+늏 _ ;|Mh ufz iC|zm5IWޓyBO@I~ H aMq$_||@ W;_3µ쓐,凄4r [/ $.,<g!w]]w$+uBVHwY!4CB d$N+QcxKDxd@t-z!'h:| GBXHB]Vȿ M~}+O;TƾXf&5hPG'|튤hځ~*tBY&ѨMI+Q{zZ"itgߎ{#ih.A];_Y N96ɿ y-!]Wzѫzs.,IhM.GӻH5IcFǦFǦOF|@EzVh(;};qR~8ˏ#Ճ 'BА3:Xv~H^:ץOgtCǔ0$O<&K/=۽XޮGz. G}^z]B=BO UBy a>g$}^9y7Ą#-]7`0g$J۹ iy;6^HޮN ;-키5ޮOHˇ} Y-Ym\4M:ZiJJ;*UtJ;VnT OmڃD }wZ@#J'!M^u=I;>JK4`ʼno H> PA 4bP\ݑy/s>ٌ4 zش|* qAzyZO ߝ%l==Hc $:!w8? O{Ꝑ )g2H(w|gߡ I!n ﳖH~4xvEo|Z#/?Ā=~s7'q!Eֻ'~3Nx$ v۹IuYS<( +ʡo!H~ߥm>i@&ߧfwOc>c;xT2/ה 𼓐{|ޏ!ۡX$On1 FtCBD$@ڥC{hsE i"(\fCh[bK"N=X'\ףhOuS}Ddk~K`: :.\ohp4z$@07[]$ 84pI$5!-@J\@Ix8]e0(Z.)t.h̊-'xWBRT$ ,B0@$5> YcА i%K&R T ׁh#HI)0M'*]򩄌 uoI1O RpGys {e^}|1QB.M/}vӬR2*}vyRLԛ,GKm(>6ZFviRC=Mɦfș_I)ee6jx7~l ϕr^[Y«nMw} N LNBۮ{6wE \Vr[9jf8ΗZ Z쩤Ys[ݱ0($sT+6Q%95\M"nͨbD* L_fˏH>fgQ9 NW[\_tVNGX# hDӹNucn6jtG7Szt ?Nwi8<z'Ce冀_4 fފa`FdRdM۽P yaᮕ "[al~U Wnf@ֻK3/Y{]̦[K^ 6?iD.Ng+!I[W]q\~#7o4jֲo|c"s |pK'sHRyiouNq_H rqVsLG>[}LXx E:}|[c1z_U{VA'yCG9>L}^KOj1OIuyD<n_"#^}[IB ~ s/`9=?-sXiLNr>iN+Sb<'~2UjӇ,pf B}piCedEȌ >w cVU`DXz l7\ػ`>6Sdt|⡄@FpmL zaߺGNd99eq[o֩ݢ˱N kDiz *'Y޵8Ȧgz=`2f_t_?^Py|guef)7δawLdd!#azs3^=Ȉ  ke,TBtu˵F~?BBb2z fu!pp ޿76:A}g[ 4],p|ök#q(h78<ʠlt[[ _ gql4Y54\iwO+tXYdHÞs~KT*$w&64e?TbBcC29-=9#me։C;2"w.k~kvL/6z;^|dqݟ5K3 ЎYfj)L8\|YK&%M9hV^Ԍ 9v򰾑׿\\=DŽ[yE9ɘ #s:ʚ4=,vK~,|:8nw}v1WN_,sH0=XPGetu9u;b{)~ #M7=_ 9:?)ob'm( YY" u1,_QwʚzC&/]Wgb=]oKXN܈v ٿ,e$OW[y飄 22gA;`[6 dc#g0 SWln5"St?ۅ|WPȏ8伨DY'|35|_UȯCz{HGsJ}nx>+RGyiL>ir&eY+;zQObyFɴ^EG7^!3xD}ŻSeM>Ě+a 7QևcL?S5_k6ձ̻`@;>OP?<;4j}e%䙟 `gFwĴ~u#ԓu|}0Rq['0z\>8zҟ-:X]M>h'k`7LpҢ:zǷv).ܼY?^ߝ7k/ ~,iҀ| V10+ JE j֮ܲd;mI;B~p7|ŀt_NdC.d+,-E}7vl20kpnAk/$j{{ӧ'ݿHqP޿l2:@?(J޴}s~)E|Zgz5I!)Bڟ/oIqTU&lFM:解~>ڀ#-dDU/RB:`@^gyJRkԏJߗx1~uߞI_'ǨӏT_U[46c<`y]U麨pzt[_5g1!@<BO$oI#Aw$D i:@C&Gvד/VЅ^N4hvg u A.YBB@?$ʹ\0AOUC/E b3ȺolF=߯I9{ A*ÉZ_ IOty #ay \׹iF@aıh$^~H6OC,dU9*VIj2ر%;ᣠD2HVRLk@BI҈$r3M-3<|G柝ӈ<|ԡ9lA2'~GdB;ݚB xٮf_P~H2DC9!aH$A"C !ĉ3@yH;6@t< *ȤNÈ/P,w7(AiJV#P0ɰRBzR$2$J2 j3g^l}v$޺bQp<>p\e6#{Q9I3#uHzT; ?GۖC .yN[ iF42.g|Pw86߸{cWN2ټشbX:]G7H,<) H9{H6Z5I|.ױKf,BKHCy/!N/4u1RA<2f@e˧2g>iu2<6jN)_$@g*U>m6K΅v%y W+c9xb2(_@gX]v`kL2073P ~:팄Q4r(Q궬]x+h@QzMͬuVı;ƚ7f,7JHﴙc+/4e(ES dBQ=:1hS1 l3Q/'-Y?Q' 5pXe`N0Z;pB7!!g -[ : PssGBx$Cl.I m?)᪅ ͑$0B$ }< K) ͑zȅz0 \gxEa8#?!}pB]pU+3 @pB~^-0!WE !̦7p!srB-.H銄⑋*/F.?\a%rmQN=?|® ?I'yeɇP`x$ C>H#Y}[/^z.%o'"ƞ_{].~s x {-u=k: {|4]o}V$!n @B9IM$I}x?k' MGץk'HI{ܥH|j|r~7)I͟&' Y, iMI_PCNk2P EEVG0ݏGBl?4m_E!OձpE[ytLa>H<> \Y(ӲD$-~,xy/$=^10|V.O"?ao$tQvIд~\I.4.auђH>x@B$wE0nc CB' G0B&k= ɊY \hP\ېH^(B/-j6@:g%2P424ȳzWC^*s3+H:n]!i [^HEv18 "UH_('zy)0]۵^,-W$ ƻYH>^,˧{zg"}tG뗦{|zuuMK^|?vNMK$ ;c4֕i&i>gnD>&_~@7۟g]F?eWɇ{11.,mCd~J?o;DEs$}Z1 I9FG^Ohg^ԖgiiQI@rlWHZziWUy-{R=#z ୑H4I9tIR]$"v CNsq|^jNK~]>9###_uBz& p:BZonRUY0$]ndOzô |u $/G/w1p$t30{z!c@pFza YvvSH뙫[%$z4ӮBuZC=c}42lj!MZ/oRo)$nIU GYy ERx Kwwh>4=Mȿ>;N~7Ѕ.gd/>H]o|`3>HNNB|Xe!lrF䖑 猔 Y勤=iw`ؿ~/=;/.\xʇ1H]~w&߭NL$߽MW})9s<4u*9d|ֱy<~Ti.!egO)'׆#ur(#i Uڞ^Iۇ#M-Ӹ ˜\62GCKdAHe BI?}ID޽_T4ס{h{ ^'vӉ< mDGW=m/y5 7Xt+S!HB=mnch6|t5WC9Qj$ t}zfP$ #l3 YxRH& Y9hńh$Ma,#AK Í Bo CiɇWHSwEOp@pΕM;!aDdбS= /퍜[da|)]mP^uEtchҸQ #rWnQ"tI@13nAdogGL,& ]k Ptxds$d 94ތr!iLcS_s0N&=i'Q0v1Q4r%̿S ?9hlD8=$"i:]~ZW̛WK Bk.o$#ը'N$];ĽNHh烗W ng=i?h~O]z>p_)l<)NW^U1H"ݚE&#׼Y3`2Hz<7z4C HNつm3i>0e$u'TCwms$N-dYI$|ǍC{Wz"y37#MK}G/*牤t}{ČqBncg! a/7ɿ# YHHn芬4wvgd}mȢwD{z{ 5I۫f{Ǒ}<{I ]=Go :#m"&!X뉄ۡWR/W٣#M)@45 y#is@uj8R/ "(4n6Y " !HI/FczYy͸w+> 1qHhXMYjX y[!oG,va֕ ya! \x{o! CBtWBF+BC >YdM $ g[ُBޞVȿ = =m$B{Zo$oG+vH?N y;Z!o'xH:B_P ]1?ދ-vBS yL!MO=x{}rG|IϷ^~ۉ yGC;g?B^O'Tgr7Bz?HȊ/tW]aH^_- _BzDyA'yÿ<dSj >wi=Z܋0=0~=ɘSLݒr-'rnP\H$-tv#iGc@ۅ#iЯPm|MPHZ~Ԧ4VSSxܿ/C}[}A>>Wߠ~>KpjߧWBCh}ЫIm}^ji} #GԞo~.I,2.ݦiuF~BO>o_/Аz ~A>hoO/1i szՌGzV/&IerI=)7r^W@HG;rYi~Bz#R>wZG#h}'z/&aƤK%Q yw!.kW yd!, HYЯykl֪6#4A;#y?q!-nxGB|J$,-CHޏX sIý=5~Bꃄ~2~BSy y?O!^%[h֪D$7"yyS˗T.5% $*9]rji '#3+O /B鉤tRo. uGKrB}/R?, z=OzoU` 3$-B^+<ܝf@iG>T|t=t;zAϫy /?>ޅ}R=p5qi=?7 }/Xy" 煼#M~tF`b%O}=|!B -'=Ky !׏Ck4aH_(|?!0z2>^lR/}0$ je\9 NH?@D!a $ =N/v^Bx¦ C&8/xBw@y! -|A!# q4=DμH@HOg翞l#4 y\aeDdj^|G!9Bۻo$"`IWg$3!tymd ͷs#r uBKz_ӻO+BzZ3re(yQnbl VB/G.;P; 8eB\ZNZnZ!$r-:8dLZ.uވXIE_[H΀C1t!>GӤոG8mEvξ~Hڮk|o$mF۵vq8Gv|]8iGh57~]'mwu^U"4DuZ i 럄߂^ <$IQ)SBKViTsBU/,Mhi|\^?,ߥzi_ iy5sQR$Y:'!W-gqE%lmdߑA[Ykc-45 x>ր'rY۷;O57^.<Ƞaf|` :{0x{`SbȦ')7>y~[_ȮaiS ^ՔM_Ԏg`ZڃAOIJDIsU2Ux${p3hg\5pRr*MOa}~FٳC9vh@.y>L?_OjGw 0j8My;9?֡n6Zoc֒5C<̀̾+s];cw=ǖ[l52\? c>IlO;֬cZ)RH^sFdJGEVN~I¶qgᇦu۲6?eϴ붕n'4=m9\g\,WsSJ7yUgeH7Ϊ͓_,d斮g_`ӷt|vkKlOxn]ȇ[ ܖN;#c$IW3Y>1=WvP~zV9Ξa2yHEY s%nAȝ/'#gmz;O~ ;Q`La殐A4s7+{W_xfQ[ߞ'Se8;t.֠77^'G0e*]AFz$&! ӗvQsIp/' W.am-=\۶NO)=sF͈b.;p0"LX1'bRӵDFWSwɖq~ 6oϻW&뇰eP,/;Lsoٍyȟ/H# &5}Ѿ=/G0[ae[$![^1 u,1v%~ʏl{w*kuΰ9@IrߩPO{ML/rvҡiЄ,dCyN BfL^cpEc`8߭%t=τv.v#P(OBѨWW\|#*G3؜o"i>G8@(Z?XzMŖ[_Աj,Xj"=NKf-0q>+E}iBJF^Ƭnlr+|5<+1[fJHVn+.#Ydyub;z'g I-guv,xS}ݩN(Pz6 V}WOl* ¸lwk:Ö0fe(lѼ./~l]ӿJj`z[ljt`NGYs毞'V^QN2rE>l7tu>%`dvl_ͶlC,ʦK#ln Ȕқ. \r`X&#RN=m H`vPQdw-rА ldd9~>3^I6/2F33A9T\ѫ;F lO^0U̒`X4+db ͬSE,5M ]5ߺZi6`Hswr&Mf]^2"{}XyEAFf<V9`Q\྅J2X>"x$GwĴX2`+څ/aœ?-爵)'l'`6r|f:$|d$+/ftf{vlzW.c[f xX݈l3]6egoIr33~aFQwA3o֏Y9MHpɈ+9۟7" S|mDoGj| #izPK8 d;A#o52kYi~jL~,R28/A[z,Won|#PD?j~J)sy!T14@.F^OtT__?x~1n`OEY)^7qcan6g%#/d56{-{)4l%ڥHQWVo_"k:{ 4yRl=L( nRiIȋ_y.~U7f|Zޓso9 KN)4#gn%idSuٱ0 ;,GLǖ/ Ys~%i=Y :/g5 7mC=9]`x>֫uBF*$lܡKo`4@| 3qkl=16=v./dXJS{*_lzTrp˥$M^ŦO; `R{>J;MMM_h")J4%̤%66^ƈTڛSڛn^ov'X а$ 2"v(tG7~́UK|6"v*ݗTڙ)Ml)Ml7>UYg0mJ;y7Qڇ Qڙh>j.iw.G*Al*Al*Al)A)ӘJM?a@T.?bѲȲ=@cduXH_*Ni-`[rg(7*Q՟Alft5Ap oH}p,c˚zc(6c&6cv&B?}/a~J{?=8_^;ޘ\16JA2B9p|xfD( v(6 ‚m+-#i|8oܢ m7Ǧ=_BN;&veThp68('N 4 `Orzl2rbrUUϴ ~(A”|Bg/Up!#Xh?%#IH5ˏaSzt]qJ{.-6?ixKȯ<| ߥ@pJ3ifZB*l)l+4vW$]]NG]d61j]Tm gx͔_B*4v\™5e6y91s!`Tu YǦςh2.K]BAc@pҾK8Wiߥ޷!_  |Կ9Oi% Psiu/#$K8_i%\.To,To,k`s֠^R.ďz=ׂ^|=pWw)3~_!9疯Xo@MR+6i]vSU+dmf+c5S7ݵvS>[r>xܡ%}?3|gJf)}W,To 'l B=&MNsXoR;q)J{sMu|}x\kò`# }Ťܢg&7-X؈r -jUEUGWw)P8J}&CR;TA<)B;RHNsϜc2Z"T!Dsj$dƎ5, Z}&֯P،alZ z"ވ#A/x=bj=?{Z W&QO*l| ҟOeKZ}g/ߟPԗڌMV8|*5SJ;k#P1j[n}׿H`QO+)~_zmԏ+D =/tZ3wȮe&߁E~"ߩA;)Mk|R۴Skg仚M}TlPe۴Pi4={q#J69 ڧ5oͼƦ7V˛|Vy=9~b6B֬9V}f+}:j˖-[.!IojcЬz7*־rt}IBʱ*}_ߠQۇ<-ҩ7*8I1icLToޭY 5^[OĊvNj'ROTŠ2->\e%Q`^K9jf7M.Sף_?xR-[R2Rl9&8zK-bY+Ro|__G!Wtr\')ʭfZ%@=AZEaoJhgK,xw}%mIۃ,\zYdM+Vnpbӭ?SVEVΕw/mø,_PD?/|¶P$%tx6lKB7h?LP =kgvs+\SI3CB {2}|~[11t vn/ddF4jM3M|'ݝ# =`~e9(p6M%p`a)v?z)>OuUI"ÏQ7HIOR+MߓJEM(\SJ%cA|}nFDVΊf։C;Aweo/>+lv KWxQǦoݾ,k3KjMO(5uL4gI-ZEG+W|ȷ98j7¦aƳ^-:tV~ܳϳ)/ OYYS7Wm{m!~q||d4n&o.sEwq%BB~_K_a>.&,x"cA廃?.37ܑy]!I eyգRc#$>_SoX_4?5׈NiE\!.)+4E (廛fȇ[|QW6WƵP\\経$3"||؈pq>ԸqN <|քlgTl}HioY$h9;e8zfM6 yLJQ8@4>7Ju|!IR&8Jj%wcqԸM4ƁqFv\ZFB}7LW껭ƵKwވ j2T5y)5OnPSW[h8+{ZOʵȀTcqw+DܭNBwKjx0U8]jܮ]'|lDiqhklB\L;d+75A$ڱjqxkCB۔z~M}Sjq8qJ]!'on.XůSx\GK)P 6ɷ{׭Cy qd (^ak$0Ki|õwM5"fPQ]+(έCvǑ\^7oq42>^Gz\kq>yOT qC?UoF/f>0`~ N>Mho?. 4&]IyP1xJ?*-J3x\qry\OWUUҸjR<<QXQեDž_/fzkR;I<&=$9|_GzqgO N#IO9Vr~T.^ )_qg^>7RKRK[mZZm  vb6v*Aj- vZJ DžZZ9~ߛ6iyy>sfΜ9.h_j]iqordGtn%ylL^IrVz!Ky11bWq6Bk)?er$j㲭 dy#ž[^ Σ-"D;Q?ir/ Ŷ[49uᾡ'KC;M޶)Ma{/vCI]pl4~ yjgR++zg6̚HoxEHl8/{_?_s+&~VNx &Nh7U:%ra^.m0\_:xyr4ʕ78ѮШgB.6T)4ꩬ(w7E( 4) ؆ ;f;킷Վve;hϼ{>mb!m Q"ʍyn)p=kn% a6gyQ |Jg1󜌎P6d9(>ozS<:p?^6|e~(oDF7+_DhST>r?/zn6ͧ[1dpޤ)F%3#7m:"կ3{̓<1~Dי49x̛8Q鍃|,yna{5yi1'!~_֑w~BNѭ_"p]_!WgCi,>.d8o\'$)d}_{z~/4srp|5{";(4l_7:pN8m"73vl=.Pٺ Tn{_z XA|݄ ?6F W~urB^Y1rRbG!^nlll4mbuxU~`KadJ#p}RZy"[L6:cHSYu͟`Lݳ5vlM]>[Sat'(hס^ҙƟzpϫ3t\j ?BV[ڤ=6yrL' m\'4):j ;϶ZCP`Ma$λt—Un{t.M=j[QgSncXR($a+Vr<ۉj?F{bh=v]G {^wp>'~$K_q/ztn;xn=an lqj M 9o[}!mžmRؑ6)LrI7+ oƼFsBirE|$m5רĐ Fw=]jW5c^{l̳7>VC7iռw"ڕt4Yvm-PSOc l-^ًv:Mz "SZ3iv!6'[tɵ#V/MvMz[ vmηF>dKO/?q,[m kS^ZBt+ =[hTjzˇGyX<r]E')VŘL|}s[ۧ3vιIc}, =E/ZϏڀJEQPKQ6Cؿu ? ;khW4A2oCi7cQ1)>B̆8 zi&Q =NC'Эi(7M 7NB/Iy|$l^гu~}Q.W-ޞ3)L =DŮ$w4㻚Aaֈ8w:㻝OoR=IP}GW [u+YO:MzՊ=W}E?cHaK7ý?Tn;.}^YQ]-ɿkCNp}\s0+HBF00rOq4ag{˗v\?0~7 unN"? M#<^|^>Mpo>0WDB^VVE}wTE'e8#G<‡bOMv՞k9V4c77IXzKUCWO%xÍx~r9B#+;2+W|H'ڎ$ZZi?TY1r=ȕ$Ń|LV~?R p(+{|5OWm:^ڙ׹ }(UP 2S.<)BZ LL 3}^ 2û\!_n4, d 2yEnPa6=CoѤR?0'iieyǷjM'XfPPeOAoqMsjŗU# Wi?p7ö,0777Ѭ~)̒a 1c[f6`wC&F?p4a>MFyyk?kK[t]>p0`{8 "_ͳ1mɨ:!7Lߜ}# R8dO F ^0VNp~hogZ8s F.wV7oz-'!ZFMxGZBxUҮ.F8 >>p;Φ&VП0iñc.3U?Bc y=*>6X#>OG13!~t\#BD &xQismJ#0>{Fv \爀wy;-(Qt__R&+p)vy8aXRKI͟F!}jS*aǗ M.C8fwaI<}n;go([DJ7lH'Α) +x7Ma4j8غex7Kӊx|.ONn=Lx0h2{yl4o颋2W}BEZ6h+PnF(ɲ$7aN/d#{Xr] 6?$_!4qZ IN KJ!j- [# m z?Q ֮Q"GQhUk8No:Em}X|6N%a6WjW!1 \yq$yAjE?-CY{~2ϙS~RAQ I(N>3~4WMHB> ͳXB|{Hx:vnBxliPn+5dsj*!nm0܄T,r3S1Jw WVm<'y kZ#p~,c Dke[=z6 " g{(7s}ii^žg+Er_ѹ`ٯB8vڊфIA8}hBɯ7BJR8BWn?eK!?]u9 y3tW/_^{r='6p]7Xz/S >w2K}W踎_[;2y[HߛR(Տ^ Z [7p:=?8~aoBJKפk{տ鸊"~UzS ^AVz~{M0Φx"! 90)!rSz)CD1#|^\F,i63=;ͳٴOpқһB$GCqKhYB HԲr;`).{B~4sRV{[gꗢU1ȫm4B)x&i›̧ Q{e ?Z[Bkc|~$oE/+?L=HJ7ji{'-[#Csri*Y9۹ AF'NudN>/uh*}M/Kyh+tYKc ra3 u$_ZI.TD~4֕:Xwk97x+]gK]ݱrP^ 8JWI jx#f9%L(첷!]~X#MN&<9ۚ³>w^tkr=]))g,ap~O# +G0ᝊo'tH %A,7&2)cMnZz*&RnF!mIn', b!i=}U>CFU"y4ß-L>P3vr T H(C9 < '8QH :ݱ[~-܅_Z(n?.eq wF(43f .;޽_wdw=DX]꡹]w'!kE&jQ0Gym }-Y*s  !f_^Y_* AcB= 7r!DȅP#굅rB&Bބ8<~+t)yy(W7-CGM+֊b9EV[$aIs&s1=pR|ф3S~Exrn"ᩘF^i^”3V̟og޿lsK5Y-ˠr"_dV/L",PAB۔BOomǏ%˩em9\ٻV#zJ rDp~??Ԁ\QQ<8?֨~I4Wz#tB<fˏr8ѡ00]'j0`T1ǵ]&ѠR8_'ށ뫭~5B$~#^|.#,=y~(U.F9ID=i,W'Qe=w6'wuF=3Q/U=E=fɺBoˊCuo \'g+Gu8Ѓw xQIuCloBP+=cy\d#glR<ڿ~yuqGD:clzp]Syᅳ|5eNhsk&̈́>GѿUяϳG8e_i,8Ohb *;[Ͻs糘vdŸirt&k[No[s׹ [d<]<h"02\s] фQV.pvX"a! .Y2\7OyeS 'A830Л3 h8OOoFuM:_t !4zmam{4/Gۭ.,F;&P{I((n-JT$pT*G 鐆$<1\hS:WnňKۯC_7Z#d9S\0;o,~)\rLE0:*9Ww,tmNudޮ̈ky3)3zOs&; BJO1Nzw i>Gܘp ZBjѱ@H1:b$q/g .R&Lx pQu (R*2}{`"(!A;_Q~}&~2Y+y)1/ma0^C**+MFq q rٓR >+B(wcQ\E~nwspw"Qnrȩ Qȩ g#'CIQ!bS%eq!lۂ|7M:s7pv[>S:a rRZiT`^y d W#/s< L? l\e7k,^>5WB*gI^_Tr3 7[Ir>6\ڧk/ğ;.&?QϣM6ֲ|)0_ ,[|ygo<$l'G VL({mb/$m688=a}8!OU38zB~OO#~rL(|:*p~Wr.kw:օ~IiT7^pj¢z}E_QR[01ǯd1GlR`gcd"!68;(L*"Ϝ^7?a'Zz|*!!Ux{?ᄰq_GM$iKIs܏p?FS2B>~ҸOݾu7BlVm'3l5ԡ^B{û +乻[o_w_捱":[zIu\:aETmPy[[Osz?^c04kI~["c8^i4_p euV{?>Z(Ko7V&<-}F+QҨDQ(҈wZ"r(*1X L_JE~iDRi_ x4&)grDׄɍS7)"4B~ =oCձ!(ZҹQM/VM=KmA%rOk'ek|yNXW,h5N!VaaNJיսB8?+en-]DJGұ{ʇK⏍v~󑄇gҏO9 h T=TDU@E*󥪟b[ ?<- 無WU|}ξa痏H@,!S%9M~KT»?GW '+g­v $e[˂ לj,G>k_'asQ-}J~Z!W; t%#w?/L]L܋H3v@8d¾7U=tBT  ڎVv]B'ضJj&w>|%.7cGiUxfrG҂s&Qe?%ܚڱ'Z#ٚzk ۺ&חNuKA&[Nthm$nXgph?U(4o_Ai%Բ_]*%F (Ѩݺ۹LnB+wIq??6Cr4B*ZRdO|Lr[~mD|MQo"k-'mrgw}&qSNӛ(%^GA7H'X$Bs" k<'A껍c Q>5}6TwUxn8Bt$M9ps'aLEeuê "7 $4My8E!R bSc?B83yϱS?~B8iJa(|pdk ۲=#o~&zB^~y}/w#ǹ!j0 qiZUFZB뺐ЃlѠN*H.MM>{N'񝞚kldZ0Kx>YSB̤1:gB'䴯:~7I(tހn89O8 ;gR) \W5se:tt[zf?*X篑F9QzQozdLcvkJe/e9z]+]\5&p5O '7<"_*JyZE~=Z' $ܰ`ةC?OKrJ]E)߫[~ÆބtS=/0sCJ7F|+0bO/{ ɰ_2ȭr{^Lʑw]kxBH"&!_b{[o c'2Ʉ<\NQ#7<.GEz#Y5; q'/!n8N4(7_yܬQ~v˖D=a>[*/ߜp|9Sn)ʞB8qrsLKN '^g*&OYW'LE~<;oϪ훷_vK}J̧hyt;oyEVFQ0lCBoLf?uc{pK(;<ܸOcz^x W/޾Hɉ{BU7bYV.<½y/-yy[obY5VzϠWo^y=Xh1=?pfދ]B?kxu7oܫǂeנpi `h;4ԓM hA^>x^ ^@i_I^'[yR(5X^q矎wl|^Oݤxm|?@ ꓣdQd{l]L2n;ajs/pRĜ/gj;z[X'op,aR:LqstpxgK+}Q*yA_.Ž{JXxœ*IiZN^x}N"iH>G55_IhOH?8McuS$ O8 e> р{ ՈO n]?~L~9g !-;[ <H(q'5U#.K~Ҫv?$V\¯2 z7k,zo5B 9p3D?'_)CJS)DB)MD O(M粜YLNMz=Fa?{Hھ݂๵./ 1pBCp !D~>iC?KG̖ߣoW0akR 3*3E# 2\ˠ]k &2#\$2*>aeƯ7Y Ň 9+?w?isa\Xut~j83I':CsAtBȝ*C0$1lQ7PAwf} Gu !ٗU9cB-QkN^F'|\)xWko)$N/3L\Ջ3US::=2S㼷SYἵ;~k:T,˽n-Qz\Tѓ~q794ܞKoi&3RI|t&*,9pQg??33 nBdѥ{z=:O# ]K[p1M#;'\fǖy#823'1ր#w5n5"i3%(譅@:x]y8ZpL:#7\c;̰ls[<qy'}Y8qp{,˒x-p̂C)\Jbok]~Hͭnоӂyl[?=nB8"l8 -7:e`8oA`3үAkX ,.X_  ?Á ci_p: p}o7ІX_1}[`lа{} p<5\ {x  hP(K ˊuO+>}8 ϴpHz8ybq‚63 e ]{?~vcl>} _j!Oؾzaz@?ezmڇL Ǐڈe-ǂ&wV,WZ߶c֛pڃ cÊ}P?<k65ؗbϲӎ}4ǚ16d~k t|_C|`l`.` [O m:c6muN~(m4( M  #쫡/Bh0[i@o1eg   A,8B?c1C,CA~[0Op>Ҡ}Y1mP>iZ-ЗXq\1A54,c8Y``9cڷQK8e6`9 m4s_"}`^(w;7&kF3bߏzԎD1(3x>ֆf-K:f~h2ܧWƿ5kDd׶=/E/ާwW!?M|~O4ade4/data/fruits.rda0000644000176200001440000000306212576021756014020 0ustar liggesusers OOW hk5QU(QUEUJ*ˮP6KVi];ׁU7ɹwyw}3_>t?lzczZgӫ]yՍ/ ;~%귶bT`T -1q;_pnI&6nkrs'(}.=/g4Ͽ | ̶m=f\سc͞7{df35ٟ̾3{<_>~?8 M 7<e|\x? N|:yFpi\Wt`/ѧ'<_?tz&T^Ǽ/恇 z>z)OktCo37~ }41Ɓ7:qYtvu"006ݨyQ˓\9vEX:NӍ^EX:'E䫠;i3uzBz=vku|i>y1ax/ n/:%~3uYݯ2/q. :qg')Π':Q\ |VOߊ'qm9\lJ;:)kyxKqxY$kM/ߘ}-/x_<徾s2^S ~]/đ+_*Y]?ۇ] J%D<o2\[sA<^;<|V=ɟuW=$ux9/x;Kї[z}^T~bJJ>L=u}M~Sӯ%Ogyv.£2ob|람TH.QKS r?I$L;;t{ n//sn_-z8h|{xRvz1A^to.G_KdرE ˆhN%{d53?"ade4/data/buech.rda0000644000176200001440000000634712576021756013603 0ustar liggesusersY}pTowCHA)XSMG(")l6d7l4h 2`R,Ji3EZ@A uIIw}6Ù3ɹs};/W+c. hҀT502:DG}5WK9rI6_Z г@ǁz$t׀hPrX!@~ρzipl觶5mv!q@SƱ@m Tdڏtp|7݊2ބm~5Džj~NuF\9v{48)14X~ż 㰏oE:vw|PsZ0 ߛ p?^OܻIIIwt1 W:jNx]sTiܨePNzׯ|L; 9+Q?8<>7-Ϡ=zn֞aϢ=y:}jC~h40Nu{8M!}+_w}|+/LJqp{qc{x9393 s'Jǥ־I8|z֗!lAX0rleEXPlʌhU$l(_kDÁ&( UںH4TMԊ榆@f.pOXԚZR_ 5tD0ڈj<2ɞ(ʶ+[>jHYIʗ'eRVR(eUR$eUR,eUr%\9lzjRR9 6|K곚yB%ͷޑP>wl>UH} HXYw@^Ax5X2V @J'MCԹaV 84@ J [ -B;@OFڋ:P&'w>Ű uw0 ۍ6 vnj#A:av [B:P. oö`8F~P'"E꫈.EN|QtSjx Λ;ԟRELS.!9LNH&'"# sM{_Cx8C``q| H)DBg1?Bxңy4Nȫ!={ ~H8E$DHg$]'h<^Aq?C1uL73un䩈, |C5DoysD ~ɮ~5̋ޅ}BЗLz'%A*\EF'%(IhB<Z?\K.mRȕ-zc!3?4ӦZL$P=@V rMee.t-@o3f}p#=\m6h"l.B7^߫*N)[Cy&rB7#'19! BfcCNcrBZ !oa "/B^dw#|*rBmxN/ Woy /SNyNUʗwuHd&wVрCLCu ck Jnu2OR'u.gވzoSUײp y/WA:cý)5\^s<4^?X 8a\#U]Wh_i͐UqOsrupV@?UC/×^[~p/]odVc+_pn5/m-xϨm|&^͜O>^%'[4-"I}ɍk%8~ zK |6GZRK\~_CNncOg넿u'}>|GM/f ' x{g4OéT}*s:=a:ct̡^DFFՁKQ͝#UUP'Gb{ koMT$P]fcoRw}(,F K4D#7Ţpta#i¸ .[T !#P6Hz[U 1gu{qus3u5?^1TH] 28=e!)*H _$6&dKM @9t OVP@ECB1E*ZE 9TPDE$X&PL @3h t'PN @ "*h" *2"*Rh"*r"׭gH퀹%Bq4:NTܙpVətۧ5Eb Ձ}ƮH8idH i1;1+XȨq1E9efɼxtlŌ*-!H إuNi{S" /ade4/data/ecg.rda0000644000176200001440000000707412576021756013251 0ustar liggesusers \ TUJsLԱ&2,4Sʏs-'-K8MȘŨ[ &5M$d P~pA 9=ynj{{~uxn\./m^u\>wA׃~7uwǃB-Q;'XAmr=/^>hù +Ϲ# + P^ cu9FD/jn*wo7_2W?JuK6i 7ix؞WU'kFv#:UUX65WNק^)V9C͊zm &Ve**#R\„!f}XƟUk vN(5xGc%c[ԡ]z^tE;s}=u:5<{yi˝3fŀ?˓nv#^]0:ak۫]aB.ǻ}2N߹;f?r|sfFO.Kud3SѯW ~yᳮ!C}>z7,k%72C־C{b?Lg鈴 Sh _2Q h*J qUYذ<|l?5C@aXp>'@?? Ǭ_X'!' pCQ:2?8ڣdy>̳,?vNLPߥY1y6DIq@\r@)m1@̂ [K WYc:zBli{0zm*xe[AoПɜ|nVoϚrIgڵwGwA^84Ỏ hxnyy<;0|In}3rczj}O%gY^YHr~;z!w\e#_Cp{c]6>}yQ##Aqؠo왴?y>rg9ynFn DU~G;7Jg~NXUie*;]>}zWxųugn%! 3?ÚXv?=섕ժ7UOt2v7m`]^1x{7:ӧ9JhNJ׬KO1keI~9ٮ5 щe3[tg:|c^癥ç3n}ž1.=?gK?o8,+kOwbo#j̜֋hU;/VqHG=Η8M?E TJj{NP+gibM/wл% {O?îSs8A|`;vXX70-pM_ìS3Y; Bgq=My{XUz 8jVߒ_1n |s4Pt6PCqY`\#ףЛe z > pɯd}{a{/AO/K;@4Kq9&p dz@~ÿ/ ^屍v8?˪+yOiy/觲_ 'p97ky< ,/N>gx6SO}l 8^{(a!5U.zYor9˯tk; |IB=IGgmƅs Qu]6'P, \HCI.σ!A#R9N|Xto(k[g0z,'(yV'/*Veba{>}gR8v@dOَ$A֟ 9r3socRi?`%b?~чO<؞`?ސc{*{n`yV xYGaJ <{UhvuxG 1^<' J9'yTߧ0e/{!C;AOn(|tw=@|q>X߳3.|O6tB()R{Gq^`{?paU5ڮHU؛kBVJOHКp=1>!Őw7_q;5C'^ڏ-_< ΟD{)Oʛ:N%A9yInOx}V׃KyLo)_lr.cĴTʣ3v~+;G |\3fư1=leԻIM?$wDg_9HWY?AG|A/yy}m✯Ipį&kSvq(U;us?AJJC.>w2 ?|wDǵǧg讦9F_׏~A:}5X:81+2c#@nY /&Exr|*uvSt\s%5 3l@~~ť!?y("O\C g~b~en.Fu:=X?'}N҇"ɻo'ϗC˩9GwWgn|'kue?ľ^/*ϋi?1ȟs~fw3$ ٮ[z~ ] ~Uާq$_!AO0m٩)n'c{|f}#k^ㆯ.+guύ6>j7)Jgrm9˵dǁK9OI/7Yj8inWp '!(I%H+$}T,o'_~f} ۙ${(=1~ٟޓ<`s<'{k }oQ>>{H">5{sz_'Jt?䏲ϸ_̘vhzODVg21};oBMۃ7}z>)t*q[?a|@ade4/data/chats.rda0000644000176200001440000000043212576021756013604 0ustar liggesusers = 0B ;8888[[?&?kV?@ m%&g}ryi`ZP3p\ف7fIޑQ]Tu-/~||Q;߆Ya}?ҧu@b祏#u #qΊsk9>4*cN;EhC$+BHb<8J1LbyGv{lYʏCݯ:fw¡##c O./, TBzEade4/data/chevaine.rda0000644000176200001440000000704212576021756014270 0ustar liggesusers8iXTDz0D޸FDaE YȪ 00 0,*(AQAF%4bBA$YdGꍚyW~}Puj:M_MMNN%RW/Yrr/ sŇ{1J&f C<EK~8F z66.n2dH)}Em3>膿Am%*<NoόPx4ͺHs~/+rPK/Og9J*Nz{%xKӏ\*blP)>/H#|Ď[9 α/yN/_ +,~umAҿ+1C]_;.~K*Ҕ:HCm؟#R ZOϣzJL}QK_z:|Vg"{mDEE=s=֎:KPׯ-s:QXnqUFu>_j+NqǹkX=[q#sD=jIYOe8oH KGH7Ǐp4_ԼdJOq(_ivAuƊ~4~q'ztp# u9/SsXWT- [Ќ]isye 'a^S6pXi#11Ҽa{-n Y3Kfi,fi,M)]%#Hc3،46#Hc3،46#MHg3i4}FT D/q"9Ż񴨈!ҪQPNϑakZa?jg8 qzO]!2UE4lKZ6 HOq>kՒ,mm!\]jv9vTO!Lǡuv4j+];=dZ "kE Q-2bpz$$~VS|![!Qc.GeR@ԽcIFf> /LxHOɋ}q7q Ү2ײdao%mM=5C SOi.z3v_|!k¸װt탟T(ZJ WVez8;:bo>0ƨALN A̩,ne5BsG.kqqBPekAhLs{NmQ1 j6H';ۏ;{W%'EFͶN`l 17XCʊDTƄNlb3a.7'p*j{=+p5]4DY!I r\HZ&ȶ˅Q͚ mV(yg+?I'StNy7GIujkUpya'x|2U{<6lxAKhsmZ"M5t )?Xih@8ouX|ɓuK˯ɒ9AJ{\YQpֽvYՊ{́5YćE4/v Ya䊆*nJNع&pvpWfwS؊ y~/H;f>jcVxH,10n[h% pwC!a_ q?Ufuy;rZsjd 2MȓYBL,:¢C ,,:b4EGrm,_ NC^J=9$0Pek׼qso OQͳS2BvGχPH\/m'>M0vIIBI,[sY"] A0onm^}= 6dzz($LKx{2?&EL} \Oy u>Nհg²ϛ!A;?v E;}8xoAϚ ۂ=jMǮ[YMYRtMTWm_N MǦm-JgB KNY =Agƅ] ~z:/ DwQ?p+pj,b>=Ov6Xr*V<0*L!93C~6ʘLʠ3:,:΢9,: }*C02 f"=邏, &f:h,/s Zb6aِ xC5.Oo}3)zƠ&{z4 9>Laװ;wJ?Z UGMqsPbi?=t-)?D`H&ZݞCWt;wÕ⪇;{on|CI'g39>l#dl#1|ŵLxz)*_Q~b0L&8Zk]; A|gGOg/Dsh,S 럃%XgZl87LO+*Ǽ6zMdOv:${ AdDM}+.@7"5d:wK$"&}kUxAS0$jݹi.ٶ{ HxժԐ SMWZHwQ\r'o^9ߒ126 탭u-/:* xg>ݖ_рM ;N'Eq}Bpy WEdߒ鷤w_E\k _ $KA`4YFDrd].'}(4_<bh'C+ ߔk!sc[2F7kC!C)\WG4ade4/data/housetasks.rda0000644000176200001440000000060412576021756014674 0ustar liggesusers uAK0dzMZ AYmNmn٦.KG*btkBagriNLBH+d5V9i ͙JKB*j9{ɨ[vLgMIʑr>u 9IR ̻B"}A>"{q㵼PX#d<.S^>,:] ys^1a7q6MKj n1| 0j7->+H]\ 6SrGD(g`|a`8BKAz9ILfr^.YVscqvq C&]cDJ1o@sade4/data/ardeche.rda0000644000176200001440000000307212576021756014100 0ustar liggesusers MoFH}-i6EC#7mȰߧ%}KI9tfɝwfg^ߌͬgvOflTVwoջoni׿ϫu^Tm7ݎ~f ԯ0ȏ05r\2?~hd }s6 z5^:Gx^A{o\ c156KW?yw|??<~<;/՟c{&> [5ck-N|}o6Cۺee_oQ_g"&?GȽܫȽ7(1(1m$.͢,΢,΢,Σ<Σ<Σ<.".".".2.2.һzoWjW w+ )9%3 |Q:e'ju&?xLOssZ);vDݿ9?1s KgGj]Lؙ3cg΂Z iTw}D[.hMcӹY_G3WwM`?!G^~O+0%?uV~n@ʎw֊r([~k֖ȽܒZW.)7SWymu)fJl$)fG$1;~:8vq#VW_o7'WzRF':&U>ƚ6t??TE3\!ade4/data/abouheif.eg.rda0000644000176200001440000000063612576021756014664 0ustar liggesusers N@D@LēO옑H -i|ohЧ-Ixs7d}r)!DTDI!2'FO=eMyodM+nLE[.ul&:`D2WgfWR=|߂xWBeP9{j݅L$iHdp\Ccثب`Y-"cdˤ-'T R]$-=GrGum#FiȮ {(8@t1D91N@߂.̦)@QqKA7@W@`kVppuCjIIˤ%↔j".;.WuTi6e1 Ða0f0Lf sÒhqZW^^{}~ӹNade4/data/procella.rda0000644000176200001440000000220412576021756014302 0ustar liggesusers UMlE:ihMR*(]xul/Њ41"zXZ6 r)JBq@ *^rB Pν& ^C[8`3y٩j&^Bb$6@B!1x!dd?ڞk1ۦ&B {A(w[h-wlR]%mX F&깔2t" /DxB/n|d|o\OQ?,TѾGW%on_9Ѯqa>e9'!G CWǡxac_C9FȁG? 5/@|쯭룯o]Y[H:ƙ6̣]]:i*k ʭ̌XX7"p5̽$hݢփ-|S469X|frD*CrN6<sϩw@fwWYoBSHר;[BӢԯK!`VhOA聾=wȬoB6_kF t`G[vPߖ*7ޢ^c8 <_9t{R ade4/data/meau.rda0000644000176200001440000000245412576021756013437 0ustar liggesusersWMElD?nAf1ڝݑsfzWI $\BQ#9d 9f%{5L2)潪{^Uw,Kr;& !nc?.%挾/k:hQ?c)hNl9>ٟq8ʨ^4ArMۄ -=Mx0IOK >(a0Ax"a!!+1}1'9C}ra]` >sE̞ U7o_ yu߾kq+=YovǾ|lG\ ?Oa2a_8=Bngc_wdٍ\hYcr+8I?EY=c!=Szg:& P*lE<۰_lOnAþ2pi~s\'n":G\ߎuEX'mbui>y}og~\Ee/ dQXGIܪőWmThytoVbk/>WqDZgrJ_bmx0SrRVsl&,F8:S>3^Y#ҧ4}Zg4%F?#VwtlZz1G[fz~II~ۯָVKj]lכS֘߸\IW'IM)mZi3J+(m\#Unaγqgk;^?x3pbig$|t)Ӱd`79g4 eyi-iq '^~2>?u1c|?@qۓgjRr'DM$.rIh9OD:"%D,oYKDg :Y7zj~Ռ󙸝|z헡qjueb.JwMgT<޺澒\Rke6|Vz5ŰȟŠ-Vo}y\O1\?A;6{U)yV Made4/data/atlas.rda0000644000176200001440000001400112576021756013603 0ustar liggesusers] tyO\Be iWޅcv۱ldl,J#iծZ9 $!-6$$4)Nm (<BIiH)'1u M۴P]w̾,u;̽wmmQQR]ٿŭ4d -І) lDmNfsʧ&2\%l6wی"[} [C [c,mv ۜ"ۼ"3Eۢ""ے"ۙm拧'{ S9OɤR֙ }@3)#vb'vb7 vb7$vb7»f+<#<#<#<#м+мˊuO} 6dר!5Ő=d>7nר|1+~Yo?ɾ1}~ $Fuࣞ=ЏQz)lrבcfze;Bfl6H׭?6fMP  xq5 86!O A=Qo vxde$ג+)Ba6In&;qE9A=n/IېMfV T~tz"Q~ q8 w\z>f֣5Q1CT3 =|=P|Pzpp~Jy!q~~"?s\_H֣ڗG}Q$WQ+ )~7JQ*IWQzEs8x(f.8*f7'H/ \1a<|\[~—{fImPGo"{Ùt'C=+oH>"_Sȉ.M :45<ՠTS M54ՠT{g.o⮙{f._n{e.O.{d./cx^21c c>11|c c~31g ?c0F1`c#0F1d c#A2F1bc#!1F1Bbc#a3F1Œf0c#ƈ0F1"acD#ƈ𠅧YzĮWĮ_nPnX 41 21 21 21 21 21 21 4     OO_____Z@Z@Z@Z@Z@ZPZP@DP@DP@DP@DH@DB-$B-$B-$B-,-,-,-,-,-""-""-""-""-{Әh N*^-Kg Ĩ&ޟLZT{F܏GAǸ!1 p FKFqEbJ$xdդwQO]T{d>-j27Fz0ʅ<q=u,NᕔdF1ݤ_4! o~mȱ H6SHB?1wc8OC~8MCCϱ `}Ffԕ hթtRxUZ͑Vwuh2\:%{(fjm_Gպ6җJgIdҙ>2<ޛJ&9CKL4\2o]ZK]maƫۢ{Rivd ԙWLJ$BWY3Sh\d.Ώ[N%Fl]!Xz$O_]눾7!ذZKglQ:mHO a~GOƗM5HGM]odsgOΡ|P2#ߕ`9e$g|?+COo 8F(Wi] p-V7QkH~̈WF?0Φx7 $W]JpQXF|SS| /&y.\Hayag_~*Q&# |))Ga+ G aP0I$/QGUCSbmoZI8H@{spH&ҷ&*m_#1k1F.㷓h筡po'6 xv(FʷDQwg7=0[ʐ7+Rːl/~„k y vS>s>t QFjWH$ooz?OWԒ# sx2?3L)푏ov2I軥!U|Nmβ^s_j|z_S-'R^ ڗ㝤#]ryrO揓]^=ٮzx'psn~5ڟwʯj?5);]7E;eYuT.>[E:/v*V}K(x,NSWB~{^pH]4q͟bt';d}-yZj;vRe%߯;?*e{7',r:=J~m9S|t__+z&wC:qtn\}XbNӺ2zV$Sq~ cZ,HdK" NOLJs;0♞ԈhHd^%8'dGJ`}<3LW^H,ZNГZbqZπ[Y !!tNI7#Z2ǕK1t&Y//.^QLDFJFW*]ɍfe7Nl y ,!e~+bZ|ۨYEr LW`ycYq,`-YTA3xg\tիf FBӂĶ#q0eB?mx~S_W7=mXyU@\r(od IqQN Bڞc;B rjX۹9jN^%eo~ҥ=梘8_Wmhz:224&mU.7ϗlβXt;Ϣ/޲m|DOUnиNqqrqю=v3nc-굏>gQMLjl#:>ɷt'0%)Ť>SidF=ԖvdNUqg?sbߥjcO믯Ţ,`@HZ!e࠸Iu*Ĵ=vĴ3Ѡ:;>td*[-^gQk & UCs$函W86U~TxfK;Z_RÏvk}bs,寙aˉ[=嗽-osvj|zgmi`Y5C5x`gWo'bW_γl.|g/_bYAA!6@j>7ӹ :;#gsq<*h_[/_쒿d%DEK' o}ӣfK;Z_Rv[q'[Զ?ϳ;&ڭU:" U|bɳ!廙Mf @to5-U_Vm[ͲbNͷZYӂ4}!UU?٪ٱXtOgEp=wH[qprpz7!$)svJxmeK;z 3*z y9C]G92KwGo;h;-/s9}sͨI KYszQ#<=IR=m!fCs ܧ%7x6r/@Bی{@1F7sr(gJd3>eZTsdF `_8/87x3 >g7p\{&:ul=ӯg]psS%w[P/ZΣ62T j+|P9v apSY:k(W@ꞿwR~")YxLoIrZjY3حq!F?(!ɅΤ_Y,H+p J41DNz.cC5M-Й3o;sBܚ )߳E#y./b)B):p)KHK^Y>yv-gud'%"ZhNAmc;ٜT3i0<64m\^B|֤?ƥ}U1371㱏xˏZ;7h׹~~pbT}J tO~s XJ}W#ߪh\҇7-wA~7n:B( WS=׃ټ%ow<יv^'|Ovz w]tCngѣBx19nxl1N64-5߷ӌ_&= siGߡ'S}!?ۄpwy{~{6~gqq~I{!Oix"``͇ o'ַnW>5c4t;28ϯ?إfy̟M77fzL߁?ϓȵf(JZ /ƕ/%PO)|tB}7}KfoLIݽ#0yܼn>x{ӳ#p"+MnY:f÷ȷkw!kl&=m*|vVRm8,o kRl8~:~/?5㰋w^5?(/MnR_=zrn}M-E?ͬרB>ѿVݑKd f4jW.fC(;NN7s/?Gg7)wc4uMc'xYٍ6?Lo˯@? !zԒ~X=z%=? xx7F35G:6?1Oj+y\Z/; z$#:ߍߛ*a짦1S=a~gO5 Co>f\s X]ʯNGȡm(rnB?IObF.f%_lue200r #c1֟c}9I/-#`Bk|OiSڍ`Jn|^|U^vܢ׾zE?k \ߌgg)BpE#{cczpڷbxdki=|c_.0h)4ȗx7N2dpUٝC8#r}4y77*]z/v+ׂKiҧdK#1ӉY< ΫVeƢ|psw,Ӝr_Qת.o].9} }٨ՏQ_QzwF$AJaW=`ſ)_ֽԳR5x-9W9;mOYmjb]qWz{ZKz- Wƀivh,,c.C`~##JmLUyX@7wH|ʧwޝ?~ڳE'G3Pg1[}?dpkߨ\gpcO!պ6j e<}˦s"ָ@Yyn@k|TMڭ :ҳOC/Tm_*|cz-P?_iu+Uz-+s[N.ݩ;]Ӹ'V~)v}L3KP:\<緒džO\K.g V[zasx%:,/SM ;4>׉d!{&@ʕK6qk5/SbE[dϽL*o¹o[t9MA *~`~d?PS`9ԟ+XN &\3%b`"i|Un_ >àKzb$R}/a^ga5KjjGWt}g:?Q@^ϕ" 9z$=_/E8X&;0(xPar2ppǣ?C!mM,gWS!qIߓ~p4Oa9;eP?5]M|A߀^͏OHQi3?5M?]YNpԮwT>IйA~QPF|Ҹr 3>$/\zoGgŏ vsZjMvu#r%ğRf:Iq W&t ^О9ɾ?p/T@/S߱he0twΥ\k Y_]?&|l\K| Eҙ+[}~U߿ru(w:trdUϵyնSO|z>$p]{paYE߽!N4~9 |U/}|1[EP2=$Yvٖ[_Kur _ U,WR_jW _=cjS(ˏv<@v4~{7W\{kΓ=({zkKW+~`|8C6˔OvP-h0–))ugj%o{Vފ Thsidgl;W*ڇΕݻ]vwEO{$WwMcO\ZR4D^T.><􍁼du|U› +>>sEGr!Rvįmw|2s{UvUzK咊Y` ?1CAڗ|G_AOzS iPzK C~R.g\S>dP`ypn!ߞS?5/nc%ȟZމS\MфS{?_|I)ڏmQ}>-l^2?Yt^=1D붜w܍Ly/_3uh ʐ_dfj]H VCbpۯϩ](gcLi)OE4?^Zҿ9K?"Y+z sָNHR;4oDI|b[MR$p&ښ_ݣ(A~( ~o-<4rdhߒx63?ry_%|D^9"k ˵ջ}UNvvwjK<#ڈ]R!F~J$, nC֛`dţw@hGO}O}NԼq%pe#_)'֯W]!~kg.'u'/ϐd9q%xT2J<EZ7OEPC}$[o;5KSjGh3ͪeH).ʝJ'\"w ǃ1N$|g$..=P{e390[~}Э*%|Hv 1&u(I/~ȯ@j {9'5|AP.NA'gWryL%\\Kuo܊4o]KNiTM=.?N:8K?9'LZ]KN?H/!g|:.:q]+/G~#!)  37|\iB~嚏_8]v/ngi&_ޯй@Mǿ ^_c[gNޠG@a=5Z'Lc٬u&I6isJ_,:o]2xD~I;zvmʿO3+#|wf:%~Dz :ݫYsdlW{|lAl7bpԾ'cc90g-ke}\YZw?u~/xJJnQwi\_%ֵ4VVoWyWK8JT?GM~vF|JsP{%TC)zΑh߹Ivo`R\^\} k>qCz]jg b'RdDi~Oqo![GWO̊,oiZ'ӴH_nfiF~gCLH >U~FS쫍##URe7.^m~O=e߂yrtI9 ֹtΗwΎ ;>CLdO0F_ƀ{u.\ KO~JeU}[4?ob?7JO)nۥXC8|iYK\.XՓ/ש?_@evzҵoc&GQ7ּTK"/ݴGi.y^ߥu :\KWHEwUM `D| ^ɷ7t;7qZ(_,:Kt+\XX vK߳/YGR6i="{swh]̲{1:++t'yʧjJ>;C5G8GpG~0qw_d퇶i_Zyh,jq:w^X˖Vmqj_e:O^pޔ#'#vN|Wi)W`ISܢ}Fƻ5~P_k?H7گeJVK03l:]Y4 y3YL+ˡqrQz T>4dj(+3Jz@vF:<0Io.y ivOY$̓ !&=+{f}/So`䘬QO,2yx`i\$}%LzgY d&i>7p9GRztD~%όp8E22{*= }ݢוpoj[^sbGŜ8eg[dnSHyBV[dֱ2٫ub֑ԃ`/Q[< _ڠz&h kũ]K+;LvXAܫ0INY[2L~xT0ɺo@z쓣?1$떺2eOkѺoWEֹ[Tq:Ϭ(0h$?ޭ͉"N=nqFYĔFSӝSLd?+c&N}V##>0n6jo%xnΦ/TF;&NKvs& N?ڦ3n!&[ٚ~؈wo7ѢԈcf~r;G1A>DL1&@'*>_w5w k_Cj5ex~PgsssssӦjI$Bm6PDM"&jfS lja60ZM-̦fS`S`S`S`S`S`S`S`S`S`ShShShShShShShShShShSdSdSdSdSdSdSdSdSdSdSlSlSlSlSlSlSlSlSlSlSbSbSbSbSbSbSbSbSbSbSjSjSjSjSjS:?ܷƌhn3rĤ}ߞp{!1I!f3m^>\;7. VO_ rǼμpռmQN!~?\.n^ӝW_ya׿L73ߗl\y8ռ 5dK}k[Lƫ>U['ZMfLGՁZsEwWܶt:DW6<҅9N{b:^tE6:p-9_\Oy깊&=8vpvk>#&Omg4~.84S=My ػA=@4 ݣA`-zؾRZ1o͸PAK^./{EbncnYwM.5Z(+|N^z?Z7 W. ]ܮs$pw!7]&6e;@ϑn! _|.PT9{Az#E߃x_9Q&ƭ+Э֭mia^;ty(-9Su;'_˛pD *ߥCȧLB\?y:ܾu\߆{8ێ0g/es6Y yt&rjx~Nf3q6 }t3y@Aރ*yJ9]v:#3P?~:+r !_^!ZjT3'ko+`w~t[}? 0^aAվi:r0{j^_iI>o}&p3f;J9ȃr'Ow_RUN1]+Mqaa100&u}ȹ]Irs[j\CnMfiqݻiM<:mն|@{?̼f aPjAB&SOy}o 17J1p._#ht >迀2ެVҮ.6sa]il#槰+>|XRVȻӿGȿ.Lu!l:ۤoi Yݯy*v|Mji'{}o{i :sό;3荻wK Fp0q%ɜ~+8? !g`%NG*{?8AjQ 'WDդo\M0rq"kx[NoHoKW~1hOzs##Q)rGirD!7U{jʭ߃C/͂9[B?vSɛzM_"ޤoܘ(=Yu_sgg_>OI-rݏ%$ΎkQ]v Nb7; FuvfT䵛iUN7Mfp ]?A<`\pAmno߁7N=Ϡ?uo/}(ri>O~K|)Vo/2O8vkXA58[M`T-?k>6,3o#鶳kw.#~*6?j?F>f{F~tykxowڞ]s = ڡvt{>⿤^Yk16qו\Z~:ʟxpڋu33ğCOa qW2rkqzKȵ ^|W֕ѯ~yQ+rrvxڅFȹk`3x~FݷjL9~8ݾ38 w!&궭+SFKqlvkWF͇'ú}S4R5:)Z+:ۂ l}L/Q oݵ/^Adrk\DʛKzó蔴ؿgԾlѯ &niAUxR^=VSs:,vQl+|YzYWԭ+okUN^SW>ݦK;*OFn^BE*׭v-;4c>~rtDkGUtԨ1=k:Ѹ Dn~j|gwߡaQ'z&&)wj2i w ܎5#Wade4/data/banque.rda0000644000176200001440000001712512576021756013764 0ustar liggesusers r:vnɞTMUj^"S[8[m[{lˑI^~[kHvKu@̟aa߷a7~g3 ~ٯW0l_oۿ_mW߶i;cas~pw?~b{t~/󩟴Lۊ1_aڎ_>wwSsݹ۫8mű#;Fa/'4/9k4筰Sj=me~>i#(}3}NIcKG}Гur\%5t>:gfk;iwm}FOr]O}xr9ƶ\{.'euJIj/+cy枴bV挜cy(=X˜M5L2&181O/;FjX1S-h yHv'Nv\렬x-q뽬6"0ZPd.ItNYuQc\}C^Ҙrmd)7ҵ+ dN #ỉ1?ͼzӷ?7ͧt/tptpM:|w>Wo>>!o]}J%>?$4[ht(UTwɕ,W1Y]$vxLxNh#i^xic𘲲dUIJKK?=25ݖ/<4z;ly,XZ;Kw#mߒt2.D67^oi-].񓫡)mJdNsT.H7O|Nyh66vִeyKn~̒RNArR˼ҘcȜتAZ?%mf>H:m>sHiyiVem^;^i>V6Kɧ2Ky>59{ikmsA=|?f'sf}oqyvwo&߿h?m^Ək3?ƷhcŚqyn?OfNcwM͵z)ŏ}/cq=6ھy,brT0%~ {?:-Գrkv텰ѣAn?/7]=1L{m6niGjϯQyWFhGʯ¤V)bkM~eUH/WFb _h}r|~+mBW#wԗ_DD)W&r~aKW-鼬څc^|*kOmR^_d>d~$_yhvs=Je?~}ϯx{:ǯ|&;+mõQA&Q(cmH_uWywi/JddM09mKXþb 5xrk䵴cu!ͬd WƒkTolFf: 0#M !㷡^VZd;_m%Y|?zR']P-y5k-gdi}C4{ܥخn|.[lKׂZdgieښԺ>|ܚ-q>}̯u?kqź5W[Ư懒]y$=S j{Yʥ^mO{N㩶-V~oA8Sn\[{[>jcK9cCo]՘27?՛_ZZimZb۳V;Jy0շ5N7l=k=5֒KKx/kO-/oo֜˒X=UZ59k>u웲CRZJ}ZmiÚ{)p65KKki;'}}g~j1[TPӗL_%ڥ8νߚZZ1[Sa-̙Oَ䷖6o1}gfпƔj\~;*1?<7FS)}S7e?ۂ?hߐXF\mYs#7&m2ߌ׾4.Of(A~cNckfx7/;Ι4V2f2ޣ2ϖەڷCe_Sg\,=ד񴺓| oiԎ󘙑CvxK1&oZ!>Ph/ɶt]VWS5Κ2ϓscc2eL\e,4xILaHoWmžԕ11emQ[2di,c~/(c)I_j%C򄿕ܗ4&xud_А>s'dudqRIVsrw3qX^I?Dϫ^kkgo4JGzcN>LQiZٲ6g{ȖؖƦFMFG8,|s[ņ>L:##CzlOxs0$jc JvdOj-5cq'9&G̓z~/ȏmǘZl=?#oʮsc1SSLͣ-xҼ4M7wɋtK>%\ͫt_Ԫ5o-qc9>z^gt<ǩ:oyvZoZ>ipƾVr5/'?!ϓ~ ķWcӾԖStvmj.ηu9qY<ոmK_oO1ion]k%Zk[{k9ErZ5קSTksתЎCے{)sװG??aclmR6>دZz~m[׎׬/!Gz.2kG3Kck×[tO1מ8-15o;^괜2.Zi}=q,[Ӫ=~-Vͩ9WєyR.2޺oøo3GW.V\9Fq~sRi:WjW_?ڶZ?R.{'%ɱ4m;cms7; [cK6SXz-Jclr+ j_t\UllC8jKyY6yryRh}kkT04;J1R5g*cVɜC^c{rr6qVsNK쭭G̒ܭV#^xVJ KzTW+3 5fõ ۢt+yμhq8mϥv?Vֵ-TiL櫖|t yth`ӵJ/`NB{M/}Rs9^&ԍ_M}5f4;8bk6Μk|}Sϭ/!νh_9k4VkcM1Ԝ{OV9W:.ͭ'J~ڹRS%=`tG|(vЩFjm?8 srPmS՛Sۉik`̷߱bp|[O-[[clթ[a^%HJs5/s4>^qļuZˮ5mmi,%;:;e¼=#\zvsr_fx2dUv~j97Oԛ2.y|iڼ[_{C5~Gr&?jW9S-X ]-ްMrƚ9[F5ݒ<_m%۵[k>e[hpl ZZh?[R b6X%jx¿+kS%pZ@i s4}췩={űuxV{O˧S<}Mn}-fd<24L}Zr+jRSf:VN\'Bo l-Om<9&oZ-YoLo-}+^f0js>[-ņK*M|}5ha_o mKyW/T yW r5IC) WkySk\}-m;>+cUDNC--s/3bjK5_f6vi}Mc|vi+ŗcco*m4Mywm)7ZuV[{Z,Zyr]uI}jpR>h]ӞW힦tSh ݷl OkdTܒ91q{9?9ғ}9hcW97m*5*5,KgvG\*k㕶ƪ|~8>s/էO_&?ݾ{{K:xuG7_Pwo~<|wwןylǻw߮n0ͷoDۻϟ'ȑn™ߟ7/l.ҎI;6NH;1xK޻{&ټ{!żw{Yd 5L0Yd 5L0Yd 5lְYf 5lְYf 5lְYe 5\pYe 5\pYe 5|Yg 5|Yg 5|Y#d5BY#d5BY#d5bֈY#f5bֈY#f5bֈY5Y5Y5Y5Y5Y2k\fˬq5.eָY2k\&/`BjP.v ]@jP3P3P3P3P3P3P3P3P3P3PPPPPPPPPPPsPsPsPsPsPsPsPsPsPsPPPPPPPPPPP P P P P P P P P P PPPPPPPPPPP;@P;@P;@K]BjP%.v K%,1`K XbĀ%,1`K XbĀ%,1`K XbĀ%,1`K XbĀ%,1`K XbĀ%,1`K XbĀ%,1`K XbĀ%,1`K XbĀ%,1`K XbĀ%,1`K XbĀ%,1`K XbĀ%,1`K XbĀ%,1`K Xb XĂ%,`K,Xb XĂ%,`K,Xb XĂ%,`K,Xb XĂ%,`K,Xb XĂ%,`K,Xb XĂ%,`K,Xb XĂ%,`K,Xb XĂ%,`K,Xb XĂ%,`K,Xb XĂ%,`K,Xb XĂ%,`K,Xb XĂ%,`K,Xb XĂ%,q`KX8ā%,q`KX8ā%,q`KX8ā%,q`KX8ā%,q`KX8ā%,q`KX8ā%,q`KX8ā%,q`KX8ā%,q`KX8ā%,q`KX8ā%,q`KX8ā%,q`KX8ā%,q`KXxă%,`KFwzE?א^CZ[a,n<_-؉?KߞOOwC?9g??◟G紱p5:j_ߥo@ ΎPЮ=C HF=00ade4/data/steppe.rda0000644000176200001440000001041412576021756014003 0ustar liggesusersMLZnӸI\pfS6. 4m:\2c J I -]盤Rp!|8i|xhT~=R/~h.}q,t]_ܡcY6Iu|Bgsew׃-S.cy}ܹrdS\6i{?cv?RoG*m iL@8jum|so;>RǶC[,Xurs-k+:nm>zOH|겹_]C?Jǫz=Ly⺟)w7.k9[b7ls|M]Ŷy=~[|P?b(X!$>?廾{ez[On)VyW%?4'iBsl fצz}T޳tE7CiؾljB;>&| 8;T\m!kb=G>ύ+WBGT綯Mt5?عc[}?޿ ֓+>וgm}˻'޿\s|S}}Olm}kc?{hxޏuOݹuH3U==/RWr~M &bRy#}>sE}Q"TW]i+ڞ&crCsph^˸!45 q>W{Lۇgjm} v^ԉX~3@8빢~XcNˡ#4 ܵ\*{?ps*BI}ǪSV>StCUx؈_+׼T{C}=VoNvc'6CmIur"h+oz5˴S=T^͵Ƕ>y*R_m۹ng*g[_[9c=y2qP<:/|纝kr3mpy/}_\ryLK&&uL>%n}]^&Lr}ZG|wuyBZH+}/}Thj7,}nz {DZ,3BuCq=CC,OsSɉPo\}:x-xG}tz?.[r}  7=^&x?xudϔqm ? 6oX{rF THzL8KMS#{>+];>6}͟*w658Ou>xʥTO(C? 9Fhs >aC+7w{=}sjBϏ}{]qo;Ǣ>Ω>~[FBj><@ۓ !C,8|S2w_=D쥩=B!rp3y8B!BQyB!t !p"!BHop~BH I!B!$D B!BȠB!B~I B!28_^!B!1 BH'pB BȠ|!B!B>9)8@!B!#wB=>xB1%IуzUy]mG?_zM5ה^+XMTޮ}89VV%VV :HHHHHHHHHHHHHHHHHHfW͗Uo=|^ʯ~Խ(`Wzngši]uqhšI]vtfK3ݣLg3ӽt_f+3ݓLc1ӽNtf 3݃L_/ӽte2sRgHtJg(tJg(t(tF3 QBg:(tXguXguXguXguXguDgLtDgLtDgLtDgLtDgLtTgLuTgLuTgLuTgLuTgLuLgtLgtLgtLgtLg̴|jUUUcN:*Ҡϡϡϡϡϡϡϡϡϡϡϡϡϡ\"M"M"M!M!M!M!M!M!M!M!M!M!@Zi H+V @Z1H#m1H#m1H m &H m &H m)ҦH"m)ҦH"m)ҦH!mfH!mfH! .pK\"D%.pK\"D%.pK\"D%.pK\"D%.pK\"D%.pK\"D%.pK\"D%.pK\"D%.pK\"D%.pK\"D%.pK\"D%.pK\"D%.pK\" HD%.pK$\" HD%.pK$\" HD%.pK$\" HD%.pK$\" HD%.pK$\" HD%.pK$\" HD%.pK$\" HD%.pK$\" HD%.pK$\" HD%.pK$\" HD%.pK$\" HD%.pK$\" HD%.QpK\(D% .QpK\(D% .QpK\(D% .QpK\(D% .QpK\(D% .QpK\(D% .QpK\(D% .QpK\(D% .QpK\(D% .QpK\(D% .QpK\(D% .QpK\(D% .QpK\.).).).).).)%?FO.vY]>]\^-j/TUY?WrUvxgMyySn^-~Z7>R-u/˗Gz./nWYWv~/]gr^b~DnSwj)wynvb[މa/.v/o7&z:ԯ/oK/jX*w_Tum] vӧՋrrs].?ZVzs{Um>ԟ9j>6r,_(~Uֻ~|6^ץ߼ڬooP$>K[x{XV*Y7+ݩR=Mպxs;Ӷ>-*wW'O~]CmQ7Z7JCX 'A^ڽ0)>Lz~^]>+^ߖwn?i7/WwׇufY~[[\'O]bUT ʫ_ enade4/data/humDNAm.rda0000644000176200001440000000270712576021756014002 0ustar liggesusers [Ko6Imi[oƖ,zh XТ^YGި.__k&CrC25cLK3b`Y x8o4GSZy|n޴%~t~8OMkq19Ⱦnf'o^y=/~m(Nz&8;S>{b~nܤt9|[~/ܔ=7O?K-K{oNèE_L-B6:PB-nRK,bG4pDG4pDc66qlRK8c8Arq촰2 ePF ePF ePF 9s[ۈڳ~:(r;(:ȯpx"~TۍSZI嵤ݐʯPZߏjvbÛ/~rwn m_Ht+O9ƝK SS`fɷ,Rߡ&-:U|8h0mt} u&}I0hpJ^2[y} #Gm7mR_Gz6OU}NgI-]^od#츪Kh?D l߅CT|Xz:u +GLq{Ir哞7x#0{vu/ {%HςǛ4ڗu'u,ȩ ^ K鷔{ga@^x]\1TlCUw G.(|׵pES 'i+hվd 00zi >b\BP Z8&$x|8xrAade4/data/syndicats.rda0000644000176200001440000000035012576021756014502 0ustar liggesusers ]Kk1SApEHj""rdڀf$?/H"Y|IC֋$DPҥKpt^u;K*٨o0QSXS0K2jKahɞ3!sQԼɐ+mU,kR=mˋ(߉%;.*1h:Jyq|HH3*Ml>7==Kade4/data/tithonia.rda0000644000176200001440000000163112576021756014323 0ustar liggesusers ]UKhA^ӴGLki}`JM(bAy47IՊ 7gAV OAЛP^*҃:3 Iɋŀ(>WHR>mQ`eѼ^H93oHA`4.faC/ ? plRHWBJ9R6fr 2B*yCW幊5˕Y=3y$%\eszMe+KxR6l#R'o5`N.x4Z&Ͼ0&w,f!Oj߬;WB3RkAO|ךtȺ"ۦ0wn!&?avLSGzcƞM;Ky9Eunn:gC>~_i"槾qVCN3> l.s:.38ߓ.>ZC%mi%X,Q_PbQ,>_{M9-GNk^/zoLM[uDFӻuPQ{Q>ƽ`]mN!\=hZ*O,ǻ$E(3ý^H݋tfEף7/y}ϵ(ں3׷Go'~E7>EQ-ѻFh+:c<rLHk,//;F5FCX?6vxtS~}/.TЎM?q-a?ۀ]^]卽utQ?p:صY=V|q uu /O!7N܂6}'gcq:axal XG$>?8gr{h ߶[\]ΙX'`y_8}x1 p=)Yq^TהcgSqP7N7Mn-WFM)m{Av)iċԓq!ec۫g6gKBʼnCO'0/8+:] _\O$MϏ?n/GYt_¼q76o|L[j !f|kuy|縦KXm:o\}$=f~1W1e&^⼄v؎8OK$`I$P{4?0E8Ozven}soCg<agG\ҝuq?I t:Oདྷǎ$p<⾄S8IܻU]>TigbH Q}u<{1OOfozO]Iv#~E[_\}Mzc DZlhtu/ ѹ0nW%oUS!pU[u8/9BBڗ0S}y;1.SG3π/ )SO_|9P28,9¤00PqsXp& 7pňtFG?9w׹jDade4/data/westafrica.rda0000644000176200001440000002606412576021756014643 0ustar liggesusers} Uwfɾ #r7v+Tr`Íx 7ƍa~dRRAm r5&Z_Wz6 ^2RKWmoSAH%㱜4ۯ~Ǎ[+ ;(6v{>5 7nq0↟1U~W~4Js5 ?rx+F5}N9W*k~yѧmo8*/hؠ:Z_5S9QI}UQ /|$Jtv-[cR(/}NiTo;p#╧jF@5Jbnvܨ ?p-@WՕ)HQܠT:nJu߼~Q9Dfx^}k RVMV9 StM\ܰ/Wv)w5CARVt~'~tJWQqWIrpÎ~i~ZM{#H_n ڗ㗒'-/ܨQnʇ[K 7Y0ΫhfPW/SiyyRimJq +y˨wazr?/Js >v9/W޿S/~&nc*_9;q2jޗ߿C>p# fF0ոr0|SG9x.fԾ~/JdoY('=pAqF۸ܴxٟWh8Pr)AJnw7< 7=TWA9,<ɇ)P<٭wv@%f#ҲU7:qj -^7>'?~” ~+oB'T^ؾ_ KRqJ߱wnas9zgct?JՃ[+RR*?„}7(n8 ?y峔l$[ ~^ia7Jq3Үnx}G9anxr7Un}$H^T~RQ*o~߯zu+ߖJըrpuJoz^io,8J?:O]彔>tJn+X)%)LWحރOW?q~ cOZRoZ~\#SoU+=+ ~u/7* nzT/y~` /<ʿ[;O틱p# Nny.΁:/:*NR~)onaWj]r NrKa_ ÃP8 R|{5HS~,/冻}?} (λuˋo ~q[W^}6~T=Ƀ ګJWJ~9c)~)pʓW9GPp n2=P&-•{Fo]RR2 a Ymyvi{[+,^u+se,dʮUkU=[W/6~խZb֮\=k:Wuz[׮?Vt-d:wwYܺuժX5m]kYzK;W3w}Owii\gRkc!ڀkuig{r[~Դ-E]c{Y]ܻ өZ֐eĵfЫD䖐{6rA=#^h\\\\ɕ\ ɕ\ ɕ\ ɕ\ ɕ\ ɝFrg#Hl$w6;ɝFr s9H$w;ɝAr sܹH\$w.;ɝEr"sܹH\$w;ɝCr!yH<$w;ɝGr#H|$w>;ɝGr H$w].@r ܅HB$w!].Dr" ܅HBSxq-"ܳ{rEy= 7JDx%"^DW"+ᕈJDx%"^DW"+ᕈJDx%"^DW"+ᕈJDx%"^DW"+ᕈJDx%"^DW"+ᕈJDx%"^DW"+ᕈJDx%"^DW"+ᕈJDx%"^DW"+ᕈJDx%"^DW"+ᕈJDx%"^DW"+ᕈJDx%"^DW"+ᕈJDx%!^I$W+ ᕄJBx%!^I$W+ ᕄJBx%!^I$W+ ᕄJBx%!^I$W+ ᕄJBx%!^I$W+ ᕄJBx%!^I$W+ ᕄJBx%!^I$W+ ᕄJBx%!^I$W+ ᕄJBx%!^I$W+33l9핳4c!TfRwZjeZdRgd`yh~CP<=${SNRrbHf&"FFI*r"x)%ABف|%.'䘜V<%J2ƕ0 Mꕇ@ZddV J"%s %hI(MQtZf ȬU3-I5܌YWKr-,ʧxZNSX=UIjCL6G5-8ZN񁼚ɪ\̇rRNLlH˛XJڐ֙YyHNdVKPr(m'Z ITJKi5.gZڅRY۩vfFfe.˧NSjV)yLYNwi$Bf1/C}zfAX0脖6\&BMj):Ls**'XZ\詼 ^0{80Ħmz̙ܐb|.A{&dvRr>萳VnLN2ilm"Ͱ`'^mgh- E~2h^2)f$z LΛj LBˬP懒q={F`VKȅaaeШ 0ymM(B- i[h2 ZL 2C`L[:W9޽Jz@RC1 LɡXRIAvLk %j6.W\b5YtUe^h|Qi&"F qF< _Esd4 諚I5*<gyTbtRlK\ EkJ1X/fhd6j.C>>J$l `~Zd(,/F¦ܛVjRA!&v9)&e_(-`R-&jX[ IU+,[)-.Ϫzjp37Go@ oʼn;`sgr1ձaY: R{  J*d/7rw* Z 5pu_ݲM`7q X6#/9jelZVX&q^VQY`σ=ݟa*+a@7S^(UC t[rwIF p iaALoEմ֫YפJ%m͓'uP^57dcPR5E V %x9+Lwp\hxsDLeZY*_!לPMd,:Rc`y*_K9)&ᒅ 44kP bdrkRqhjM~3\N`a@ F0hΡ|N^ enBvȜOȅW-iP}2;lVaj9\$K\B 񦵦0RɐU apˉ!.( Tb2SX"~O@T.$C@aUM1 \RST7+\+b̥kO `ěb2bEN*WMǚ^_:CB")ZY L(*xa܉&GKj("MA\Zl#PjCtbYۂy%`45 ]̠\'u;Ї$2u@:Aq@-@G!:4pNDcG҃f"{sh-D ڀVMBtiF1(jDZtbt P-Cu49 уED @ G z6 . C ÀD>X Stah @ ZcЧ4 |8M?s!34r&|LFrG΄3{Lx=r&p #gușp=r&9nG΄Jτ'JF K,+j> yEgChk_7 [CƏfˉG ) ~d3'L}+e6p{|c;3D YBC*зCKF=N{ oz.h]@/}@Ct#uFw/CN43t)U@ 5BGmƳ. 7!}_Fн,]@}@/}~O9[kge 1'C/(RtK!(XHGAm @?ר!}ϟ0@@oH4l<;] t_H߷Ygu~=ίGu:Y#{d_wu~=ίGuwǛ/Zt^zr=>b:=L] ۮtF|59_i.n,7-9`'`s`=_`6X֢g.E5¶¶C {ٵ%JUhѥaѢ\MDFN7߮؟8뮷_=] ؟~Eƅm ¶gh-w#;a &V"8}pmfXF\h֚ivzUhsf&s>1kr1ͲXڟTbK`ԭ2m|vYYY]9v7S''+N!!Ά7 oڇ.} v|p.Y7~F8~hrTۏ.k&W%9'7qr&v?"g~{>uw/{ι~yع'Xztl|pG$҅=]I=p2q| -o^o#Oo-!۟>L6o͟#[vz/=Amc ?=_e*٪MWumݧ<_m?+_EΞDv_q|pMM#d}}SdC{vrҧ?|o9U%$B~-k޾:^$58Eh1'H7 w?K0c^9OPW~+4ru/]{79ջ޸aו7嗏r;Y%k6~i9)w͟kϚDN /K|c7,_N>1cSokM#~R^zÇ%$ 9/%,/[3ptQ AG1ŰsQ G1 p/p/p/p/p/p/p/p/pu/pe/pU/pE/p5/p%/p/p/p.p.p.p.p.p.p.p.pu.pe.pU.pE.p5.p%.p.p.PO%`^äsOs䬣_&ݓ~|?7>磌tw#nW) ~&ugæ?𣯟p 92a}sKIL}~(~2 s$Y|G#v,zfD8 ,$5÷ I]s/XN6Mc\@6]2vf2F'Κ0q}%"]0Zw.a/ּd<n(c {w{x}h{gs&J32\sλn4snƬ'<;ˣ7H =?$@S%gmy྿i+}B&ţ{n<П{wiQxi?dadvgu_~qDF/38j{W7=3>c<;#=7K%lObi7|O G.?ȓߣBb/S'I3hDҗ ̡'zG!T+dh̦I}Vi^Y@$Cr!lɽI5Azûr3䖑m>tln"9)6V,jI96kTޮZF;jZ*NM nω[w!o%א>fv6}ag1>}ںSIcn d./:w&?Hbqp໋{~yuZ}n{z"1]s( y(\6^{dd=O'o}jۻ۞"k_MGM7ɦqllzYɝ3_>a ~Iꛏ'-j3?2ǯ}Ѵ&]=kHTMLώS3G&~eN\9 g|·swr193}O7\| glyeϞG-o=v"겖#\4}=q%//ݛ_'#^9wpp,w."֋Ϟ#x_|.ɛyy[|N -_H޻~&Dl,YV:.#v_;w#7>mJo_C.G~VΕǤ/=taj5;r=FzH})s*C*CEȯbxzgOCJ!cER={!&J32wU*U |7U{I>wQ*T |T{9wMg*S |T{?!s?!3?!?!?!s?!3?!?!?!s?!3?!?!?!s?!3?!?!5Q$Yy5&cԤ̜߽Z&ٹ̹sSg٘eYa+\+<2BzcdX^.\*z`Uۼפ+w|]ZMwm۱e] .e{*_*m_ܯ'L\jӕsƻ>S 'Ԯ T+wTK p-H\K5uZ~zZțNKyC$M}ؓ_},?:^UC7rY_Rn:4uJ@df^v'>e}n-MzNu(7K݆Vp2yM$w{zx,|)y kzDO[ݻM+C5cUJt)F ^4oɿ}K7Ft"M޶wQo;|wEṛjUG{X_kս/\umQXC]-)8j'|ęuW/At"޼S⏣c[$o&"}Qeߺm2xiRAA@JA_ I=XG:@/sxSEV˼'3͹a_9vqzУ"۲/N.Hc+ ?L!tQ>g[>_{SÜM ^#A-c𗙒6;8_'8zɧ>~N /M<[>Usgxk.ϗg"}ntpT|n<__)9xy4],m-LaQbnBavնezt+6lm8hF6:ѥ61™2ƲX4V2 m0la `6 c0 `81p|Ml誌OOO(Fssss'O$>I|)SO7%bYTx^؀յ ade4/data/chickenk.rda0000644000176200001440000004425712576021756014276 0ustar liggesusers}\TM66-L:,lI%$TlVPEEA@PCPܹ{R>;sb|Ϝ3eK͕bXV""bXm*i|Jag-b"İ%/g^}XH]}xb'$R׿uZ K'u> 9/r~ރ;FEB-!N#- T~3Dz b<09Rf?T~XVV N\XW Y.BCSN7tx՟aoݭ@"IC$GIP,!a~ݠR]ӓNO*l' 3Y@qInI9$ R ENHQ|8bSc*cbq_-T_s֖r\8#K 9&PtxÞhB( x  >.$F\_ݻQ.'renSg_nP|FA|fg( q0u.\ [ͽjuHɻxTL9S02avz+]bA1`P^ $Fjªk1ydy*!rB '!^4QW4QB{EB]̇'՛oLw.r7,$K>䞾~k E_Bz'u{Ѱ=D?F×b%ןӡx>Yfdy%@1y들tTN׻!|KR{y_uq]9fYA~&YQkG8CF'S<тhO=Moz O5ǧAakyad)UΝ=fc"3SFPq, ivP{sPff9HK.Q<`.ro "|Al" -Ed ?'t68 e%~r~X?f[$wpt5036%s`{PyBYqUzh=.9 ><~Tlo=b^նy:x0;nwX'OD! iduv:݋$-蘷@IvxTKRb[Em Zv<4e#;w=4R| V VԸ}O'VA !Pˎ]su)B 5=k/û._HpS_#̈́ACgck Yp)AooQ_ aJx"p|xi>ҡg!QGDC3TIRuJe}=FC6tɳ钗 ~n2(YjieȜX1{D(,><s+"DƟ+Bdgq ^䶽 Y_ÂЇϯgl:KX a}H'dZw|HE 1x#|/08zn+O(RD(]><=[;t6Dʺ/wͅq _9Bkz@S !%k]%bo;>:8{<䦖|: JdLrb2Һ}֩ OzZ3)(BVuo{!1 j5!| 胅(roX5E'H2{7Z(Nb9*1Ub8uXoqHm}0d]YH*iרɐ{bO6=Hws~m]FշACgVrSX,d_cw7i,M.+}dsf |H۽!'{PQuG0ȻV5pdp$ ^fȀBGN!o+{Yi+T ol{!;xLyW(Yce7{&( İ Eb> ldӊҒAHd~Z+^"j%QeEK-eJpXTya򯥣 ;EL*AqȭK y!ͫ~go.Rh؊&,\4,V:CyցmCCiq\\{t|3/ D0oj2W+u91zs.o/ mgJT Ѻt*j{7}ڸo1*Un|8Ǯf?SV ٗ:;w)JHqݷ>Pi]nHd*Z!vfnͶZӞoOsn:R^} qnuI)z+ ?ԦwOz"lig.;rۮP"RPN+^~|ӾPB#KZb(?ajE- w`ݾy jO~?Vߧ?ʲT|5^Hn@2&+dOBM˜ɽ .W J0b½[!#jݽ?nAtyƧzέU%@f/a!+O4P}֥u_&WrN >Z1Bz( oy pܚP6w݄D2RTO3!i YNK# ʢ`nv5+^I[f8 {2(f}? Q ݜ,B߹A{]o@A]+@#zӤV1fD=gU}OuY\@Gz@vLJ8U1ECa` x;t$$;5 xzYSkBfo=rT+Hxxb^v~H>+,%b _FȍJA,i7Ȗ8tȢj 1H $G;KuN33Ԧϼt߽!:MwRH\ HZU|ܳ8(Szm L.lv=38-E;^x >z"|7;4>M(耖^ƗU DB'VR?N F"S;ޗG%l7(:>P#ZS 99UԱ$8(ʟ.1.|GY=.o%s]-eŒ霌:lXh_Oyp_ǡg'55zwMnmNFL@Kn)A4x(18lf TX~8mT9 TKiH7w;j%w|Q !Et2׎8l8w.hr]Q%}FĻn9w f`* 7\z>Ӷ}_aeg/]LOo'I݆D1|;BB'CـE;uG/Uu&Pfu[*{I2U&,;}dm*wG# ܸ2"oLqMkw[ȯV􀬭7j'C) ɧ%3͇vEg8z}&wmA@0ޛ5Cst[|[ .x}3l nxt"bZ=ujw԰/]Zb#CזfPZoϳ=v|' Uj>jPv5{$?2^6W,NKę~!P77fsޔSytiꚼxM06^qN2 6Kmj OWOIvq?ҋl6Y~йEuݡLiӸF8oPEgM)Pԯ}G$MET}:!<$ tzD# VyDg/6 DC^Yur^hS3!P8]t6C̡FdDZ0\u 2bމ/j+w P;rN_߽:w{: y#ozIGٕ` ε.. {AP=mkčy8v1Z3i $}AJ*~*(9MsEM9#9'JND΂6fSnHPA{NLP3|7o c4*]HNB  }L²#X \$,o5Sv"m6:]3X7} ,:*GݡPܦ~ꥤu;Ttj*i3#Vdʾ8dH"ޗΖ:(!A2>#V3cBYvuuq=U$2ZcxZQz$h4T\ !=D&YpHr<7-b] ^_ f)Ċ|^yD~$ֹ[ݠlKݙ>2FP5'zǺ.yϡflY?!Vѳv TF rrRD\}iOMS5Ph瑘U#3jlt!›%+zB҉ǭ$ȓwxV7Tl_\"I mɵgzyB,[HcO$X{4+q{׵)mL>ju:{8[E_}HLc xyl1cIY̞Ywr=RY(d;>놏Gcȃ~z[57wRCmяdAp ݞy_EUYYvD;Ƀnl=xd֞CFhw&C)NÉe6tcowo H$}HT yuyM>hO.y;OV{nC1]T1?·|8 ^ҷ|ݕ^-ħM)p Ȁ7:OgEW& ~fv oGU< QTKNjm' xyx^)!3ҿ2~W$ߓ#{[wl0oّ[ ß؁/CCi3:Ajٜ`ğIxqKR۝/.;#L}ڂů!щQvAkiJ})CoޒCe|}p B` aNfA!h1L)| svwkc  wX؋y0Mbi7?(S ޛi)m߳jz+{}r:[_&>K G) 1N+wݿ {KUn&V !NJ۞*aX߱n91k:n:c̄ /GPxlC p'G92>MYxK\s$\a6rnT6I/Hܨ)q>=KSzsGmJp-#G=!Х? x&ibxQ`hf1X$xix"dx/S/V ]*fF=kHKÍ;{M1傖ѶT&w!Y8x(tO1x5((1kxc}yx3ܰpn1<(khd|& {|ލ SEl!\A .^qmU ,#عK9!,xFDm5V+Hva]ujpiǟw@I- FJ{QIpv!GýVs⋽$ϊkbef;.K>W Oau!ebuBvE9qk*! SW+~ʗ =a|gG=-<ܘqW_ SN;ݷEXSi'éEp}#8.9UVx}PWk2zՀ?w<O†=\1I8eĮ.89 MM~)x4Ǻ1p n.{H\A1 yK*|{2tx|ϟ 3-W7| ܁{H[cO{YG %:˳A_ônXny3\yVc4n󽄮ޜ+fK(_:k^>< |bݲe="Px.oAH~=J;\=JH?j>U_s?xD&dMD8,r4Gdw'.#٪Ϻ@2ojx XۀO:dلkBBbiWA:Pv=:fPc׾WB}~ɐE`B2v1y!=kҙ;{.x;VT$$]g$v}E$|_ĴDjXGs s I[@jSVEcI?T\U("JĦ:օEC MHu6RDKH@?!.#< om0mPC #"D9w(|#;i_ȹcgBKv2HVAF]Qk &{⽜:v<%+a?R LnÝ1ۉ u3/}_`{K!5V®'3^x259]b- Cf} 8?zV;C6rcȹW"_2mSxЕop"0[ umӷ#DnS|TcxKtT~JCP@%c{&ۺ$\?_[r./T52)Q5%>SB Xuǀ) K28{\55= 113>[y:Zܼ=,bWHr᫰pOPb_N"\ $BA.K"4E |E Du)JCyH#7XL.T [}po~p@d$K] hARYˠg6Ovcxb>ja'+eo )dr/M̕;{{'wB+M=6ղ WP-DdsN;<RA;:\ ?{ąx80|^V.q_`j "D4^H'I;dȬGR|NXґȰ;TqClz)vz-??skSG)ead:z!oxC%"]a]Q+tEJu\UT56ĭ)skܚcs9ˏ­q9\.gWSW+Õp9s9\J\.J\.J\.J\.J\M*s5UrVrVrVrVrVrVrVrVrVrVrVrVrVrVrVrVrVrV宋*W*W*W*W**Wg5.g5.gu.gu.gu.gu.gu.gu\\\괌V LU**1UeTUSe)2iEF"#BUdl/͈`3"،6#͈`3"8#È0"8#È0 aqiJ4%F#MHSb)1ҔiJ4%F2#MHSf)3Ҕiʌ4eF2#MHSa0T*F WUe2|U+TUF*c*#MHSc1j5WUg3|+u uF:#???????<:::[`͠͠ ft`FlllllllllllllllllllllllllllllM6M6M ×&&&&&$$$$$$$[ƈ`fffffffPfPfPfPaPaPaPaPaPaN^srqqӔuӔààÜ40000000000000000000000000x(4FIzzz0'$$$A!A!A!9,9 9 9 9 9 aaaaa@==========s,rrcRH%J YZZq:Etߧ%ܾyrLCܮ(hJTN SxZO;m^{}{{zJ;r|zOCw;!Á{#vuᵓ^Z:ɦ(4?_5y}A)J/-WYܖGAu^9t!;?O&u7%垹;8G3=M0=yP0wYkO2Ky VGϙ}tsW^v<Ec(ӣyoqdy~^=,s98GG)z,'ݦߟ>mAd^}qu!o?MX0:.vO˥Σgy]OdΧ·ydS/^_:wh~mW^t>˅WoZ~<=)J~?q?NGϣ+Ϗ~Nz?xw>B R7:~q/k9_'~EK=LQzi9k^;qsљW_:قx s:o~rHg?UhhZOAzM-ͽ^>44_^ _-߆c44~7A;~7v?~uO9':i\v570 ݿoC5w?ʧX9 ݷk.9}._p\߶0 ;?_м梿Jy7v^sUqWG7[y,XSf9N|qM'l~} Ruk ]沣P;O ~T߆kC ӣr_M*h|cUUS5UN}Ks aJ[˿z46)O_crcgSF/o!h\so}zW Ʈ ʾQS(4u_&ϛnsW6U8/M[}4VP '4TvCN\az*Wu.'l|SIc-E'FMNL9FlJiis/aikb֊f&:1t?-H% O_ ϗ 4-?z7֟?OsaS~4orKs-/-( '~=O},_8??]d0+W: :?&Ox~{$H mA?A,h0ۂ05VSr:87izIW/JQڏh?NGorJwir)3 =1^l?_PY@GhoQj. xa~A>OdO>%2z>h9"~JDϣ+/Qxzmz8DϣN| ϯEϧcܥvzϣ)sX7^"a ] x#Ǵ0~]F( JG/xb57׎Eix;^|TQmz_#lyGa~a~h;y{XJS7׸RPinFOy} \~O?} +O56 k7xQ~Cؼ>oyՃBa??_~uhu(HƋT*/[Kؾ5xUz4Gظ(ڍ_aWC[[ 9Mo.MX9 zo?WA_}5ԟWAXSk^T<֯Io}q -{ͽ}M(*[ƾnϯ6o է. L>o.yJi(>rOO۾܆U9 5N(eW>2 ^npt? 7saz &򯯿 ~߀_~Sk|T nW)߆Uo52n'1l_=7C ]y O/ho ӳ|A~z ?a]7߸҇Oh\kjs׮z!D?d<ODHZ%ZW*Jtr0^(kg?Y::sw/s[nWl]vEVTvErb]vE\m]ܮHU[nW-+RՖjTvEݮ(뒠Og}[_*_s|TXO5TKcQ }lX3~^_~-y(b5_o}Ck0XUo.h|sįPG\z7u[oS5WM-/?ki8Oys_Sv4yt|R_4faOǫtDRY2iH1$d>w݄[њٷ5Hva/BZ+AQ!nt,O$$ \qv#Ln[!lzt7d DZ^?P+o=PဌrtEMDS̋4"q%vWB}t ]G% hUEz+'.< 4t2Bأg"6}=EsU\G{ j=b^B[g7HWtGwg i\"nV;f;X^e4+DYV"='D^"v^Z]JɏZFz v6D:EW& [ iㆵ:t% GG{E Sw`ЁHb~;HgGR!5Azhc#hwN!aĪOt>pi' Ҏ^AMaImUS4=N>9* ^&2i ҽ[_24!V1ыZ/ndPq7)ZYI 2EKŝb 쟧:BFڥSXn1 CMOdtZw35Y'' }Ξ8iһFXi30l hϗ(FpVdmN􇿐<¡!ü)kny{ɴt!4J/MEzO/(?NYN? گtAr#>BHkiv;ٞF*B ])݇#~XJwDiLIDۓ4={>e.HGtBH uV@ڋuA鎴IH;Fk Z|(k+g o$P8Alw|\C:ǩex~ٕFH#z(Ax5sE4)BL\E7qF5:Xb,k*Y Xaj̧bƘ֓^ו̫:z2]K7`j;t8+l9C ,xs)Ƅp?/\yQ +sxS oAQγŘ/4),q&7A&Z>(PtkOSt> ]=GOl'|ڟ}XבjW6+GQ\v,v.za=h7 }NU YqdI)om|]ƒi,MMؾ-NX1:b;adHQl=^m <^Gܿc8fY|8m9,%Əai!EWxZ9uX@QϫqYa{b;ucz=_ma h%o%(֘-n _fX-O-h=0?q{>iB!E q{^'' ֏Ɓn/ǚ[~ a+p?7+0ԕ+MGx 偄۟`!lp=ge gOE?tܝq^__n|+i=^ \t^L$tUz%~N}>J˧c)vkP:z/#tܦc:N˜ }.}>;`J>|de#<7b>q|-:ߠZeu[[)AWkpۅm,|+'/ pi}6/iyCQE)J֥eJªAE H-"RȪ2 W"nTfo9&4z0i!)HMFYQ(o@: JQ`UU ,I Bd9ϭ'L.~e{vUTYBB`s=vgo.bqHtI745+u&- `l + .0 INZa :򡄀J$d$/>/(ppr,9,&r8NB4V֋g ,u& ńñ #5%-6@H(P@Apl AЖRDcF6dF+ZHDбDXaR "** *EbET5#[T bAd[eAdAT $BT,+dXF#)RFU"ZT+`\E!RBID T+$i`1!%IJ$XEb &%HE$PUUdVЩ ȌEZdQb`Q@`VV PDTQR#`(,UETY"*$F-5 ,U#mUQjjȠAV b jJJL@q ZUbb + aQb1a+QE$E,a "TTre j۶*F0QdQEȸ"T+Y%ňŸF$Es)m`*;eXb,DU" 5YX)mtұiIM)L˂(9Uˌ+Ekmn6eJw+vf'8ۉ$I!!aTrJUF1@",F*0XHU@UƢ@)JbAL h&RU`m 4aR,YfPpo[׍"TD "Q j KE-•QmqXa)QlE%`Ve,4k ȰPF֢dPb9f[*LKmQ3*bp* DetTZ%-3& eKhbbƫ63*ԸiLuʋj;)p]ıh6RvںkRjecTs ZMMtޠ3}ð!! E'6 RĩZ֪1oJR޻vLF 2kfX+Z\نҶ3;)EpuX07hXL ";mfĥiFjX&m45UʋaX@1s+rb\nR[)r0w3 "DQTX6nKUV%R%F[UŹ\- [Kcm0m1 h%j3(3zu! dž/-M4*V%̸뻹w ʔ-GҊ;kQrܥ-kJQ1qpV(" ݷmXfZKJ*0eS2Î3YF)2PAQ]LmacSQd3}eβ@ӆapd۷u.ڬ1:m)tqwiw\[ͲC]`u 7܁z~? @ǡ=(=F w8c&{g#sRI$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I$I'^hN?91.yTIca2 hQ&c b愛̓55(Г3M 570`Ql0hyRaF۬]Wo*܁*>lyrI*uy&,%)sL N6FVAruVXJ*S [X[j4Ê&be28ǮX{17s5uw[YACxI-WJU  6]T%Wj´*x:k\kX^).,lbB4 5Yq1詬a[ T _ZF *R@qA_Tֈ7P,w> 9 T"")TUn9͖Mʘ|9K*Զ7&t\ 9 %hl+-)?D%p'NjinM;iS9֯ɮ}6MΦIENʿRlҝ+zjw('o3!ds@T$a}UPXh/%:Z}:uažd̖Bϲu"aUAZ%yLA2]("j]N3Ux/EHi؄@?@d Y¨Ť;3﯉mZx<_!c11)s;a@7!ٍpP(I$I$I$*߽C\㳗bi̥)JRYh?JRJYe 7&6DI$I$IF=DoSkkkZP䑆ar]ubPa\H 0 (0 .F$a\]uؔa#2a#$I$I$I4rG&ūVEJ 0 a!u]v%a֔1# ..B뮺.C" 0{{{{F4I$I$I$=!]u]u\]u]u\]u(.B뮺苮Rɔ]uڵjDI$I$I$ݺ[[SJYJR)JR)JR)JR)L]v666VVTI$I$I$+;#+3;Eh )JR)JRJYJR) 1`fI$I$I$e˜ʒcϳ뮥)JR)JR%JR)JR)MZhգFI$I$I&Lc5)JR)JR)Jl뮥)eYe$xn 0ͫV I$I$I$9ƉJR)JR)JS#5f222$I$I$I$ɑf)JR%)JR)HDDW<#@k`Ss.Ǩ:?I))-_S}F?リ[uuF3K_Ox[>׸sf}:u -s+ V# 7]H}n01{W^m2=63tZ1m)(\s\CD!(Yd U{9HRebsw"?eUCE aXJg$[n$_ 2P PLjRT(3,P|zV;e|xqFYY1TY[cۦ"ErҥbDق؞NAbʓ*NiP"Qg"ɇ.:19qBRQx|ύ*:WY$G}xf3r˗̴{M3m﹅8s.G.e=7-Yxs.8|L8)gNP޶1#:e抲Tȉ<1o6u{2qӉiCmo ]z^,g!&8"Uӝï@O~hՅ4V:g^_^z/J}:˂{{ߤ6s؆gv6`3.5?^/W5lwtʫށ%.^N8qT8.%׎U^Kmx_vx+o2'rN}}ܯ.E;qb1]*4[N:εH/&._Eh A״YFE'/)"m@3Ԓ=RNE(p)vȬ8ETDdTaDGz_yao/s̫zQ( ,0s<(G=IHkN9N ѝ͏6҉qϿ|fنb&-ŶfQ: t91Bwi}񁧼ߘylmVDUN Yڎ}on.@Æ8J[vq#i' ~Lַچr_;j9oZr\&6wD^r GKc컳xpz q8ɓW*i,WGe-㖛O'AŜvb"*bޗ$_X-tlߝ 3KM_D[Np[> \ҙLq֗NdKeJ؜nتFmK6_}hhp;{p:GSW777#eVʜm79s 뷒&jt:gHFZs4^9eLED>.y/kL`& @ 0N<܎|e,x-SAH yJfsHdiEk" e d6e7у BtF;:oR Qh6wPH m&kJ2.) Gvr|7ė(Eѯ^yvK8ð7ur:y /U䵮fP^7CgW ye} [[:ϜFeK㩋DMtão8L[)R/4E L1[a;BIzjNU12^aey9[ y%0Xı6vlv}mٵy@qk]G8oYT-*wg͇>Tf"/q=H lKk {a1,"O I :enX0 `+ QLf1szlg ;B:l\P; P)QFQw<^9h=IUzu ME ;k!ʹ<("u(O6;d{ҿG1sK33Fѩ)Վ61zp:/>S-~K{Nݴ'A"{dcsLvòn<%_XݔRhU Ԁǻږ=q0X)$)aPoO{Uy48[o*gNthed;PrXHDXͤ[PRVHl: bJx`o7WM@!p `P s `r+lOz <9א|_skn-pq 8 x>EpN'g@7dn|M@;0 4Z O2 m=ToV>@i{FVF6+~s4]ɋdHҪ*jr a"I0d#V{w!]u)ZJ<JsCнa?چcWXihE\ WgqX\!sT8vS_ywxYQR;|kade4/data/chazeb.rda0000644000176200001440000000116712576021756013744 0ustar liggesusers Un@;%PE%Z BAUJj;} bAMuP$RlUXVetŚ/hgνB0>3bSݯ !Lad)SBLW4zo<^xϐ e==a̻ >{7ǽkE[//~\!emUV%( bA?46J@h`wM*Yf _HwBCbf~fTYyR& tAqcHRp6k1jшu^qH'rw'E[(1( TEET;~tPF4mV*C}M_m^\o0EGxoDPK81bR\$iս;M]UNs;ٴI.\)yeݪMD&RL\NٺͺYy(]L.46kgmt=~[uVCHs!t@NMd q]uEs]w=60Cj bDu["ݙE\a$vT.f&LAtU7L#VљR\hID01H+?b]6jqmY'##3e#Ub%{'1;skgwr;9{ X='moyf[tJVYs zkz_̞m :>,wrwۍ-h0l6`_ H@5gr Q8Kqȓ&LKhK|̐Ir3k\d"wdҹ8"_'͐AL鶉xw|z|w4̦i6O_heտ ade4/data/t3012.rda0000644000176200001440000012452612576021756013266 0ustar liggesusersT 3ĉ!LΉ!wOػiQr!JDE@E"( "ID33ܿ9]߹=3T Zjժڻ[8ڥmWãgU0?<<|r)URs=Œf$hY] jj2_z|Yz'>Y7۸r}O7}͈Y27c&~vf\ Qh=ʣٹ2Ì_h 3*ק܌{0cL7oXLWzhk> :"fXS6{ ob̨GO5oDF3`Ffe&M<=T3,|fHkr͊z<̝fqk53-n4wsi\63ͷ'23+Ԥ ֬EḲZfDz͌_&{|t}gҠfͻkf0%uݭmO3b-g`iVVh6^ʹg/HzinlY#>_̴x+ݷС}uѳN 9l8 _C4RHz;)㨓#ovxx4=rÇVI< ˠ<27'mK}5otdY?3OK$[_ܿgr:CS=7ς s^ӹx6~t^_s^olZߔܿI):3[6ܿ}@b4oߎܿUA^^}4.[JrރFgyy[rPgK6+>o_}9>Mxaۘw71Fg+7-Fh{>k xYϹ}﵌=>I x浹|"7K -=/{Ohw_7C.oʳ;񱴕, R~GS~ zm>)C!O;ȈG׉`[ۀi7z]HOD?xǯHkF H.DDZ!؄Hˇ&?oF9m9qlFS~)? ݓqt|{ҎK~E~/{NoM>!H\#~wN=>O$s=&?!N7uyyåWéNG|xyЙS.NKcgkʵy{9ϞȏW/ '?oRp< y?|#,A;| HFa7,E88D.^zdop8:@s~]r$}3hCwc<ݨ؍>ex>C8" ~P.}'Qnk˧_>/ 'IDʻ˙~<ߥx;#ﴏ9;:=_8#RfʥPo2? N`.1,Ny~} :ߍv\棃q ~N?c s_á+z\Ϲ:ׯ,C\ZPoLV>之Ca_qˉN;/w١Йo<^~|͇ypTE ɇN}N?΅Ay8fC5`.l =I?_?k|ԔzN=so8 v%%N{g׺_84)/8v˯ =v>||G8^:جq']R~XH>KDuw!MyIsAs8k͇H{.tk:vN=sVs3!%Χ_)o|봿K|iÉY;#_iqt+Aܝ^gk02gzc};i쀇+A;DWnv࿋kc4xqq'mùOuu8?u3+qt5o1&C9,ѹ^m˅s_ggcISߵw"tU\w1Sُ?!.9.?3cL~Oqq pCͨkῊk8p0pk8y?:ȹos3}v9ecM>aw&οk8rx!!868:}.8s3g83c8./ c8;gm\zv0r汇p':E\p83θ@/u%N?_>teN?O}0]ɏss]t83\/U\Ϡsp;?q1'k83߉xθs}pWgj꣖Z>j꣖ڮ>jꣶڮ>jꣶڮ>j;𬒒g?Sg5?YϚr[woUܽUqV[woUܽUqV[woUܽ{Ku-[TwoRݽ{KuV[UwoUݽUuV[UwoUݽUuV[UwoܽUsV[5woܽUsV[5woܽUsV[uwoݽUwV[uwoݽUwV[uwo5ܽpV[ wo5ܽpV[ wo5ܽpV[Mwo5ݽtV[Mwo5ݽtV[MwoܽrV[-woܽrV[-woܽrV[mwoݽvV[mwoݽvVݛۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIۖmIj-y*rx-Gr{u6x4{g07kt$g&: ɫ[0{{=R竇;']w=v+3tpjÆ;?\/9R h"9]ڻg>|x$y 0Af ]Y)e -'/fiO\Z˴N_N]Jf7N.gacPW@)BQJffBa)HS=u~3 G^"%h+k&L8c4]YՎ5s0qJ(&3]X7CX <@wkCzfA'W4YyĽě~yM!ja- yJJX-nkå?mDH;D>yap$ 6h# imKؾ '[QӖZ WAz_mceΖ{'F?ɉY~5KYB&v# MKo~Oxw3UXh-:RXLV&I|-R+v ^Qwo8ZuaPa-M kB>k:2w ךQk&7֟څuֹB@GS:P`!uMʹa>oj9=X]K>bGs‹G'(xI3^ _j/-~0BikZbsaR!ax=^.!/+`2rosozδ:=&LPVP3?A9Šށ4}K8|OgFwbwlqc0+?1'3ׂ^{#$픛vA|׾}13&/Yc͵ l&+Fh`v)–FzBOYӌ"Iz~!ҳi`c#ol>ms^Iwfnߎv~R<6jyr~vGG;D{9e' UusgKjOg;)B?]z_'֥daUIlg?+QݚW'mydp9,>^CM[{mzEmږ< h𰿉+V+n#vxEK\^)qy5Vë;J=I^1c[ .R\)Q7gа O2moO 978oߋWkOG7ӧfϠK!ZC}:i6t|.. 9BfяmYılp,_ +VVZq/o%>ѦHzܤQAo:!1 6z[b*m?HL.IZfm'H_xV.V[rT%5)w" yOhemb蘳Yؿth )\B[ڑNm;hlv>*avk͕?-ʏ\v`J%6U ^AMㅍJͦ?+%_ ~ͣ=o9MzmOIZV>M؉Msaӧ))# HK|B$^(e-0|l6$J-훭F #>=.`Wks۷C|R5%*J K=wή2NM'1z Z[oޏs1W$;AbN.k=C~Mbcl<'_:l|yIxY \F&KXW(7v|Jg,]2-ߔ濯|yufm&cS99HG gDׅ3G?: |B+a;\7u򗓰EQ/=HLE%RIE CyٞpEgg &\s4&ݗrg_qOݿ(1瓴I_6?e.FMoW}bo$ e|KLY.̙/̦^6KX% C%%e: n^i6mŠ<ʽJh7$)qE|f _2LJ\"%J?blKh|u0PIn ڄ;}4vrat`VzLp/8XOGMƾ}0Sӱ|M]T(P4/kcO)…[nH2 wT/G@\S:+Cf{Q.nO}|A쳺YŽ_ٴlaedl[6LK˖/,(sXf٨v|!sẊWf+3|F+WLL'2MiϦ+ Vi9)}R.^|*t7ɩt3[<xJGr9BߐGtKtWsA[O/-y#A+nԲFr j$[iAi O;GPu3(BJH^7s[Wj%p ;J C/yc.: xC@^r7} hD:;~@|a+s7PM//Ǥ;oJ~ԟh?Kt/mxes]^˅$?fq2%Z;>&ϳoi{G;-n~wEmܔ%E/Ce#ӿ"R6`<g:&ïW@{St^_}&-}='?ծʯ r;y4.ao?pf߷򤰙o)TCXUo6tx]';^|CY}_@쐮^ YD7' KzW!}~foů4]~-9|B;΀/qw /طS9?eK`kK3\_r {sۜfK] 98 lOZ !ªHv$Xiy+pn_`<2{![>9X!%ȣ3o}MsTWz`6(vn*ۯZADYSj>ߢG" ϰ~\oR:rG?nTp z] #~|x` |RtNF3pufHRn

9v& >O O; t5esYb/ ECpHOL=ыY;VGi`-_a}ҍO 2 _H/ ]gYO~DvJ^_|"<.w1:vpuk1 o7Z:Τ>Z`kOz@鼸|K?3o>?Lǿ[.xbU)s[m X.{t&Ome_'ײ|s($}T?ڂ>]~o~ 'AjOw\WL"oEoͯe՞f5_,!9.=](>Μ/(~}?"%RIK>);Y8^+zK!~:"<&eѾ}5?_oK}_`;ek=m,>6dOW_ _jEPGXʕԗk̒)ofl!zPmɡ|_eZ:LJD-ؔc?/W>|9}Vw|f~C#~o?[j\|:K>W.yW#*F; ~J%fT%%N^xVX-%J=wŗ ndك%Y|Vu+??S{ |{Jz3_|:=A'>W}o5>E_7ԟE,F!~xqyއ75~j=~[t{/$qyOGK9{r|yK=D;?J" J ͦ`+3$/z2nș5{]V"~!~PHQKES>4"|Hex_ 4ɻHM_I_-JsZ ?,Rk*'yyoH;zB\,9zO;/Bl_ !PsO,~瓿H | K \}Ί/~׸ \? FJcf3W(:% vivĿܖ+tQ{>_ 7ok^,\NMD|,/̧_/;j]Lţ쇇~4x8\yX/j=4=Nm,xx-K#xnv1ca)B,M2˅+NyP^yIAub?o7Z#ԏf{Qf7={[}?~V{[l]~ǸU~tz~]C:e g@r/Vm\_^| Cv͸7C|gQw{ӏ&&_b?0DO4i 3zUD]_+"6VwGzxW;gU>sg3qg_n+mnGi6ջyIݼH{-y ƭ-Hqk(H9)M;/):o)e܊ܟ"":or7>+(}cߘƊ穝/j72Dύ6Z\%:g`z#{(t-]^=-~\L:N^m~uPhqE?g\iMzwEO㪡\hq_Rx_&:K~oS#;ƭj.ջrn!n7V{>E[u{ڻo`wꊮ;zɸ NHjεgE*w{5s~oL‡gln~x>.Z#\%:ot&]AϯcvR;ׇQק?׻R\z멷t5EտA_ӏ^,|FW{~hO{h'>D oB9{}>s#6DջnB׭o[[{?TvڽG5n/ݷ?q{߹qά{ė{ c0ͽsݝ*wY;UӔm΅F {Wտ}qAyU;w~ϸć;;_2>{U^qRNv) =:_6n8nW;?轝H[x ~1w=U6j77k蹵FoZq{ŷ;~ԸkdQVMcℹXno-7Cлq$m$Ƹ6nܜ5o7)Fqww]\{nSkh/z.u˸|^|fz~E?Bj\(>\яZWX._ʿzy'*.d\ɤ=pŗvJ*},!~;jJtぎHfW&/O_ i~ݸ҇qfA~{2q g|ПWޫon#VP_KPzoƋkO^Y뺿l\\_S]_z7w4nT71n\ԸɼCwBLQw~\_LzC's+t\]7g5ջO|#S\Ft7v~1}3Kd{+-T<ŸRnGč[> b֏wt޸E|8[\ݭ*^` CsGxڿ[ T|Ѹۈv>Dp7\㼷Bt{K{k55S㺿i#|<$:\W7ć4U@P4!~Cp|xDEOEC>oѐKKyp~<_s“YߠKd-ٯKcq/iCgZq-gdyc^@-qk Mv'E Rܪ ]`Q`0{ޓ>σ["u[u%sXI]&:=HωoTދ^׽UxU9zijv˫qm΍SN ^1Cs {U~K^47^πܗz6Bm~!_O!;Bc5BsğBppϒQ|,y~p/~ gOnϒ *_K,tHEX ҷ""|Q,XSg:HvG_dVUPY0tE.A!V9gE6nҫT{7Xޛ4DR<@=~y_){5iCfu&{|Co8=~gA2O-G&CmI7;Y348'v4}G?n϶l>9ᾂχ}v^VAQsůJDїIAzPt[)zߙEwi\Eo9)vV;ŬXU|)>o)ԛoJT%7Kp>Sģ/MIajpHגCoI"~%YJV~)?T_SjJՒ^JV?jRMķR:0K!sRKu*9L;TS[P|d|wW^F꾱oq/2^=_·}pæo[=wA';{3t_w6 8}ros޼/۹j&9o0w7&ypߵ~mj~_Q[+{~'+~B~)VE/sFO~˅)WVҮhW:to˯Lz{e~6`\_3~UG:wզX%W,,'%s yCN~4tޯ2c#wu>4q.'# }^{yܟ~ y Js~ߧռA6 7Pϓqo=!_L,9s?r&u/c/E_EW5̀'u+ e@ '`DHg<{ ?>sLp~Eaާ)%y?_ ,"^U#nB~z.?_Kw>{ҧנ,w#v}4*^lkP.q^A;Ee/^}@QzTFBwcT#jQ6t@_zI]8V|-"}B~/56p HʏcKt> K#g$|ľSD>B{l_qV9|@`˾`@"s&zm/Ȼ$ԸMןn^7ߑdo[ :ʭ%]R_穦DqAgkh} ޣi=L~埌=k)Si7U|=(U+=R.qj/8AF緝uo'fm9tƅB{@ӟOz_2o}' gڡy鿗_oty%z^@(y>7݈fݬ5_dlI؋ؙo/X?^8ռ U4f5Q/} \ _]Doz#~)}<(y J~4wު.t8y5~^G_iSL4?/2XAkSO~;iQJg$k#G!VPAeEgP yO9o֐@| 'A}%;|^AKe߂K6Rzw4߂JΥtR:Ut ]Wtɩ4hg.AL{g%җL)ɭC,P~pLwɱ0%eƜ.*Gfe쒜U~ҿ1!Boehm+yUvn҇I]e^|({CXCv\5%rN9OPn]~CxP|+wLey[-y8=/,?|#ɣ|3|ٗ%c$ķ/8?/>H,_f KwfsOp Ioď&/$Th/bHHЧ݁w%Ň[m_B =#zCv?wBJCBCo_#-=aeaā"aѲ+aT3s0~@',[?4W#lzl _؋'/i {Uz~U=Q7Erpt쒝ۣy:X@ŰC[/Lp%ͫ?7K؏cybn^"_ ;SZ3j^;j= R'᏾*7W|U wK+HS~֍WN''|M:[_K'·'٩pj`w"LE(#GTR1/"NzЙ|*QvT~E4F_J#=MIK/"ZnD"AW;٥\D?']Et}*})yG1wL׈yjF%\a?/JF|J_oDBN?Ł~^eįwC72=K":EdyԸ#J"ɟ!:#k)gPo:Xzx>CX["wdyhMzPv)1G66kd{مȶ 4o";ɞEv:[?O|/'r9^v/rz9|Zx<͏Eˑ|!uz>,|_B&-K5~c'c_iQ]zyOtDyInQ4ߢʿj>Fh].FU8eү:/Q֧(!TjCtG:MqFG5I{OThBG iQҗ쌣Ic ]UWTOɸJk>D @=sז #L”[D} zɴ|nC1݊}nhͧ/Q/WZ^պ?Eo_^7 I:h?_tEkܢS5ϢDהG|meGoѣ$豒OHG3H_L/CxF}詴;v?ʞD/~/4UK׊_ޢy}L4?} Pv3G?aCҟ轲k;ѻӎ t})}7EomJo#%.F(=^#&E5Eg>co4zM.4O _(B~x3>EO"sezC@LA٧//1>/_,&Jt$d &zb1usznjY b QO٭Zcɟ)y&\bfn,˚W127ĬOo|ݻ5cĀҏ똟/Z/bJ1?/9_NJbN9-\Ҽ}@lqZl]l!ҒSl֭Tͣ$ͫ؄ ,;iĦ, W&;!;[W>!XcX;@tǎ^Nb΁gecb<}q7H+C}W/C '{|{>Ժct, H_i>'-U}z(9Ւ٥qudN}\su\KqқqqڝN{h$nq^]NZ5w܇KqRsŷ'q/󟵏qNjh}/,y{OX`q|Qu|%~d %dWSoO<=>Cv84|;h݈Bn=d>_8^'~X.~)ƿ V{y.}Lx~`:KuV|'~IZ{ҟKƻI~I>e—񿁧hl+S?EeWPPrMzyP\rL(5x.~$8*IB%H/k=KȢh o%tߝО~ƗwCcPrOh%&O(I}TPA~S,alA s5O0$W%ܻk{ o$|bSnCpp3t쁮pP; ̄_n$p.;s9狃 _&ܧW%4}5D/$r/ 1B(1|/1C':BZ.Ob_bOš$Nҿĩ) gi܉oJd[owQͣĝ;=J+0Dka$^<oKI%4*J_*~&jN)$j?ɡd%5ڊ?IN $4TNMzcKG2Ih'<^HzC~IZI_I۠LfoIWIzL|MҸc53ėdSv)[h~%51or&w%g+[ۊɍov\ƂAWrGrd{&I IWHs6dqtLt'/ܥ5bNz(:zq-o!GaROIg.39Eg35&K.I 4I_?i (%=u&i8 ~jLu&F~z!Nj5Gݰ$CBTS&FcPrMe:tV]CK_,{R" i|IȮ%9'IM÷V¦JزY~~O3?L{ so~4)ӐcW?a) -%ӼI0'ԔH"=NH'$"oϽ3@w;?_);ev] %lį>gkM9HN Gů gi93ShgqA{ G }л>a}O=R<kRk%%lyqoJ^uJ*/J8xwbU\|aXo9֏Įҫ'S 5N䑨Ց$nT#z%*4b/3nš/.~,z kߖpV#\]'܁BAi_b /*oLz\rasvĞ/t".[/aԛvC@ny>=.qHp<_~w"(-c+×=!~k)q'+CMAcnQ7c q$~A)q-w@aA#'b}G"Ҽߒ8/@N~Z1]M=&.^oɓ-9&l~K#,>',ÎAm8OXSٯ|NMpUy>pN|k&\#Ĺue 7C_ e13zQp{| N`?,vy仔j&.ľ>~߫H\4߁\j֓3'~_x7|Ao~b;KĭJIŇHrĹVRMj~'#ی\[ٷI{K4WgqI_@&қCo!xPSYw8x&JҸI 9H'od/;Itn)s9v_ےq%>'^Ggr{!si=j\Gr*2J ![+H_ ȏK\)FpAoQPL~29@L7t"~y$nz8q##"-}$~'i7zwP߿/>\K$PkĕW^^$XrNkI 9y fs0rة3vмKjμiJ|1tθx}K$HJ,%͹L̹BeܯcGp*AGl/Er?= 3e 9+W L!u.>x]8pWM}so0Nk$D~6 Uq芢JSb5nq%s҇˅׈^<0*/C}Jh8f? Ǹuߔq$n[ƽ>wLٝ1_ Ρ'q#岴5}k@YC4UgqU3qNzk':coʎ}AدeWbwj݌/~~u:+(OMҋ/4cŧ7ebϱ/iΑ=-ďc;ˎvb۬>֓fQ`؊_lq!jYxF~C)7gҧwc~E1s14ޘeb|Dz֓db^|ck^̖̕b=EҧiGz3G$f-FY|>"9D(zhOv!nt'3jXz9c<"yDm~G+֟'QSe/iqTKjcT$QT>}}7U䦆`+Ep>b1[$D+o F #"B%DSFK#x3"3~=@F{v;ң Eʯ(5"*K"bh?k ̔<#4#"3uy=h'W7]"5O"EG !BhF4u5" wU W)x _-; ?}Go| C>gٙeW׊kd?Gg ] 9?|>F 9YG~|xWx;٩F9/uj7W!}ҳZCROtxKԗŰ+vYaIٟaG ;(? +{_o)?'l;U1Ȏq6HAX'am. [i~ݟ0!=zrt)~Coi?>ݭqn[DWf'dGBj^bCW..B (9ݤwʂ_hG#9p3th#9ԔCk 潝P~$Z^~Y(v,OZTv0QmiҧdCv!_ޅ|qBj?[YOCKC~rңo!ߤwk=ٻl y[:dm"-{2Jv&AH/)Ð.oG%ZoBғqBb_!B" )/=) <~{[Z+xA}Õ+!Ic{奒c T#;Y'j_SLpّ'KҾI-+JoTH[R_Fԫ$DWţ?T_&%<_fņErXMbɵe _a{gFK|<`|P_[XK~駖֧ )W Q'[lamBB)SX೪|z%ϲ#?h r< |ig;bO ?|[>V7w |+?̲PvrT击 ~?o+ s9 O_-#c9,m9&rI_O9wP,_y=w,CrWpvჟzւg-tQX쾰TGai鑵i j +Z#y>NXIVAZ~5 Ժb I{g'0f0Nk}j?dygyo/L[kF i~[?K:dM$Wk3ƕ%6^"w3OsWZi5ʤ|^]vD4"o,t9_`B=ȚC5_}qܦfFuyg­uպv~z9}H'wJߵXO*<x)?g7'}uzQf}3CVDt)DZyH:AXMtYd/ҬiCZ9ȴsZg=doN >>!mǴ紎=/>_׺F1mIΫt}xLмJ!ICP3}j:kHF{acO)ޑ~A ׻<3<~E fߒ%d}(,F.-ڽ~Τ=(AZ|;; :w@oF%3~gFw2|HK2$8[2e2S NzϝibzQ>5Q{qe+wΥDxB2ç̈́#dU 3eT"e9+uR據ӵeN/sjg_2yO;s9VIp$̜`\&/yev_3mNg6lF4ͣLk)a |K [Yq̊GL_v}P,DƽOM;* k tPF*)zВ9_lwyWvDG]xه~AirsɜB;9u!s M9S5sGOGO ?e.E}2_\)0Uohfim̷ٍdC{>Me'ԺC~L6Ͳ[437nOWWe3}K:KxSv9:pC[Zo2j?axO3 J ;a!i .Uw"'ܩbKi(RׅSa7;Jt8 + +FY#:#AՋ4+8MQE򰀞f+my^ik5a쿑aW:C22[*mKoߨt}[.*]OE^  ?1=їTѳ=^Ma7w!z8gN"WV; 05"DŽÎ(7Lχ\ Q}Tx[Y+@[3LzdFW(k3Zb~rW{Z߬2J JWP0M|7MYhMѴcu4o:oOu6l8GYw"ZY7f}ےrYoo+B0CP^3[.t1˟5&(Ĭ;WoG?:Z0>[F*wFf3of0lxپO*~']G?=& #:m?#@ҏߠr7s)=pvӭp+W_cWB)gn|R2s#v lNޅ,Rz zu-\/Ozfoؙu ]뚟_P-[w_uRfi{WFy}5|3և Y6b6OnjD>^2QS)s;vo@/ogm4֕7u{2}CHc=ߘ;+mϭ߼nnAoZ 䶏dM[߷#?Hs8ϛ+ WH9 d?J{~d^v{{}wV:րأ/a7)bfq|}!CؗX_u8~ꏩ |Q /:3[o/~|}= ǿ V<5Hk-AΉl>HWk+ZXTqo[,0rOm%1ڏJ6$A; D_BН =?R'?)a_d Z7.#=չ+Nl-Ejc >yc oꞰ- =Et-Nqn[`0u|ӯ";aT zf|ߠr D)d;E<[;o[j5mj#s-s:o3ufhiK=5Uq[K Y粧6 Z_y wt5t` ˿>Ogly Ŗu6k휤=/W:]-SmC!#胝r#]zԾ=>l&=':w @^t>i?4D0֡H.)8m ~(qaBF(nfC6~iųmC ־֖mtcX ~7BOkyO6ujϼx_ø( (Jӟ6eݝ?UDlSMAo'dwh{=f>TY陊ٞ6y΀OO6-t{J4t/tD/'E;:@?;M e|}}s:=I~o:[|d=z0I)h&SOݡ]}+3:DZQ6p<}~a\iz8kEOeC_4o7qpumÐHŵlܓB(`z8 M\B^krao&xq?ȓg[W\YiwGCGO3u*tOf0 I>]4 ӊfbofVvwY%y:]qtd K>ޖ< ~`\ԛqo4vK ?.Mg&gßZϙ= "E/b{u%sN.f?d˰`_.gme[^~}²fE{Y'KR222eЭxm^a>5U+/o3#NE 'ZD@/z(^ 꾧m5]m+_C }rmK?~߅:g=,qÕǺ9sYMEti[sCKx䶈yszo,ž Ssn{d:moNUv&7>u~l= ?3o3!: йl}zzރу}@7%m]u_ml=N/@ݛa=lM" =o ɖZ%Ў8b;Gmm2h`vCggtܯlgm=z"ҋxj?݄.eǼ8`2a4p~cSaևuMGW8IIw}?KWcOU>_u=O  :W<'ݱ'ROkg ] @^ߪ^Oۺo7֗>}D}%ԏyݗ[_/u/ 9">ƃAl݈ue?֥"ܙuAKj![ݣFtʵ ^s4O4w *!}[clnv~fsδ@o[Fgi]iGڞ`ud?QlO`_>3.:Gug#׮/;u'/e|:8`PPL #1=Ac8hg8q#G QñC }k{zޝ;v7sltD>l+ķc{sٺ]oe}=A݈tc=A' ydtv';qںOκ B{ة1q2?*sb%>ԗ}lhEN}ž/I\fZ7xx$Sfl s}4|2uO~y?wl'xyrpV. D/D2އ5o~ĺz?o-ß/m~]s[^~b=~§b 3?'^wl;ѯ->}ƾx+­ qmo{”>;p8wۏ'W;^q: 3=9Ϻ~˶+j{x5ס~S[=sݧKyA{{A_z%^X^iMEڽC?G%t?^J'@=Hkb+=0{h:yi|~%->㵮4IZIWd!{M{Ɏ۫뾆!v9Ծ^Wzf}޳] {C鿽q7aݞ%;ko%*sI{s!YS(7-*{ H~{#@RA]zUDuW0nu|a߶÷u^oi~~ zg~m!/{2e A.πȹ;ȧe@_1m GyU!j=g*g׋ɦ555hfP&{ dGU2AM=t/D%2cu-{h9=(;jeކ+3O+f/u^ZI{ZP~=OgC}u^e/x*%a!ݛ{y@ P'?f}CaT\>{! !=@E ~Doht=UCwJ#n~}];5>ss[oq>t 1czs[[f ) 7^g>nWkGL2q ߂ٟ#z8Y >Og/#yxyS] ^}%Ǘtu*J{׉]>MnqNt y܅w8?|8T\^P{{A)Nα^f/, Թ뫷$bҔa#(Fi/κ3{Hyb'7)T<^B~PqP/밟yc:粗~^Vq {9]^;"Ct`i}k{ɬU_Wh ֆ>4ϲM mu2+noPd O|#Fmk7ֽ{SMcͱXg[^5{{ooڹ7`tf\ٺ'o* 9vWz~O{s|?ދu{\/O=u{?t?%@W>}4"}}049e ӽkpFGW_cYDz^}|?~O jl>[ݯ_o0~Ii7;ٯ#t.l?s }?TyzQ; vaM?y~e'?9Sqbqw9.%29ʯrkvTԺ,{ <"~89µqD_s$n;R$G rTWa9#]pd(~DGf+P&99Ov{P_G_Y͵s4׽G> PuFG[m5拣~Gt-1HؾcS˅: 1~/wuTA\!#[ս5֗o<~Ma\u/~EW^ .v?,y.Ar/(oNb,gwx YT t. N~O3OkwJ,uO~Rw؏"u~ůV¾_{>wަ}A;g7G|VE۴"՗zW&^3iۧ8}=oӃzA'hþyrMkdSq Nu{?^N{硿X{+Gڍ^oG߾f_ZW&e߈߸Q}ڀuҲ{/Ǧvԓg>aq9.NUwul[v&[^"}M p~8rRK@[/YipiCxz)3ӈL*s{DO`g kg6G^0ǰrcމ}qe>;}؂z>^}FhyH7z xrh0NWLR>Tا'ֽIg8yF"уg-`,r[]YX/ϗ$ǾL˴ϰ>l~U+}\?o_8}WJF5ɫS_$\Y} ,a]Y>9\.8 y\ 񋧑tT5E88}Ǡާkt8Pu}99WOPMR3qNhG<qvClW4jKOhomG<BwyV]+ֳV?P-6;ϙЯ^#Hsc qA;kuڱ2v/[ݶE 38KiE!jGVjYk>ԾОB<%_2P3'џ6=^wi=7'ۯ+W _+s_ ^!?H^A=ܟ?ܣg?}8WG9=J{XGx_0g<=C9a|+p?0qw#?rG;_Ы_/I/mx=_xg3>*u.gTr_}Cg>ȹuwOn%b94#=%{Ý;8jfy>`7w>v;v{x~7zc۹ زė%Z73?6sr3}M'Ep?E>y#{O7V>r{W:O ={校#|>< zۋ/3@ ŷ͎Û:?23V) yfF_Z÷@{[jI{ȻmʥѮQf BYfsYK7)~a6QlH 7o-޻0*iOocOuƴO3-][*jd?$Ɵ Lq:71uaFa"Wp'f%'&&̊Z:3ʏ7~:7KbJT؅:6 nTԽ-ǚG}xjx ?޸+Ѹ}q]|4i_`pg\|01J_`qBzn?hdꞛqHq+;g6jo>)خ07?6G/f c PzhlT|X@g_[;73Vi?kO6^6މD~-PGj0(eQOqUi҅AŌ}Q=ѯzȫQNпFA(a#" U֊/§rK 7ű@W5)nit3/0&{/FP'󺷿} V~/?uȑc CF7FkhFc5Vkž|Ծ~S(1koc'j?hLivm71uEӭ1'$z<#t=vcuw1&k?gLziwUOQ9>!P 7~ B/?+%?Όl"}l=:[oYڏ͘?{#+FȥAFug*idjg_Z,ờt kQS5j̫*`$ q1:w4пYe4\{ FIT*iG 7|?42yO|(FaKqk=dޓg^9mYWfּQ<ٱ#oaŃ28~u&sַݲf~SW]S[io![I3_W3Q*_ߚH:2.g>Yoex?2Μ}H$ŕ2@$k3s_s>Z/3{Ȟev<(V̖M̬/=23}[S2Ⱦg+n* Y^qL/53)ۂ9c$dz/癞:0a]2ȏʸ%?'-|2~8?ԺqQKg ?X? ;vԹ[a9(GءVW =73>2ֶ!xqOfM2V>f2^3Jo2^<ɘ_2*1S1U\Ϳɚ*o#42A+G[OOe(.1D¾҇2+NYv>sF憰?vUE,gTվ9#Zq(}2"u%#v0:bR^> ˏ('?;<(܋^WCQuWyCY_~~ҽC>}%Mi~,}e@_yvҳ紾ϖO׹c:G4} ?J|RIqtѧ\ۜ%_v*Io!Oo8[zuu=ݦu$݀lz?-| _kӏEaz}) _3џ9U}d5_XQ'4~ҏί=ះδi׵]Jo}ٴ_to-G#jNvm>~O@5mʿyZiu^i]J{SbEh6_yjK6[v&K_Ҟ?~/5m6NQHˮM:6Ev43Uq 7iK+9MLMZO#.UZ?iL}j;^]~AZ{[k=K+fOJjfiBW4G UȴAͯZ_ iUe_Rަhi|7#-\)"N=I+[:b=.= JZ|~#ͺ z|i~XK(^fX^@ɭvPO~urᇴq5ZiX_k ZEZ2w@ >}zchG>':_zb}84XӗN6S H/ԺbuGڛ~z&-:PS`[7N~%E/= !{6ZZG- } xgQ-Yb-W=KMӖ] ޣ5iCzb i=TFNaf: 2 Z-A7 }Z-~,4-EZX ~w=vXga~|-?Ȃ?k,G)=rdy9kU뵽ȳ=+-ϲ9ᕻ+m>{(}o/<)01zWPny HczE҈qa94g9*W*-h\s^RV>bK}<_ <̫cv4 \OnFe6C'JLcƅִ[MaZCsRiLv|Ta'|%IH^T] 50/VC&f0S->vm,fij0%u_x/OlTR3'^z_M}VN>̘u\[bɻ9+/'Nsc~U4'=v1{Cj[@b-"<48_Xb,}RK%oؒyEAss9TaFRRY*5]HRBrkYK~]KO!K|1 ҫY䒰(/䥚+2+`HG#H5iW/MyyLO9f^ 4ra-qD/si2py66iSc}^ZХm3b<^v f3—>>J <=B[rw'/G3; ӳLyBs3<-}yyy(ϓ4o[v\Gi8WZ#ߠt Љ\l)Z7sݳJGg/Z竏svQJUROM>8R,$M"ihV,\u?XrOˎшIr,贺.؊m]{2 }-8c{ьi]OMMm kk~,L{Q3:y"j:v(A;ԑ7cyE%p5t9e>JKK۸Y@,ye}y/+vKAxFq BS>X3uF1K!{*P|!lnzkO^0W=뼫x e1v@ۮQ1boʮhK]u1.rqXU} akjۭyŝ]/'ek7oR|.e|@_Fe Ueڊ}: s.Ensgwnw/^{,bܖj7Ey9>||F¼{H|(rPxBy0c Ę'c]ͺ}Juj%dG,d\==/Un#4fߏn1AC]P_QMiTqr}L]d̋,cͰA^r]JҦ\#UboF< [X_Mqsm̼&<֍4./<'.!M9|FnGqvKf3/k \67'}{ܜoR`}2O8|P>6'/pkIGI܏MѲx̿vU2/{W5}=WZ|#BgK3.ӎE.`q5Oe7mQ⨧䎮w?*ly7lϖIYp~iwT|iJ||ymQ~H ށ6ϱp媮OuHm}r20gRU*㼆qnI[גO߁Z dYĬu i#H۷io)^w9l ^ȳȽ:d{ZʵIeاs-.M|!3kO{?$?2ۗqL `oy33Y&V!nuhw/:v.X1kA!Eܻ 0}0VUˏ)YFxf߱onoV Y3?"3~r0_bUl[*>U9oc4&|cؤIG'+<뗀M߫V!?>`QpkM{˼oQtJr{WV9j`TZeɯ*\>ۭ,u'rEZK{;>D!,^{*ٓgc8ɩS< oVPWa*~5p+xwg>z@>P VYzDIĩteX|J-& ͛0xqa8 o?0 n.RQqPqQPQ PE}44444i]҈!8p!8p!8\p%8\p%8\p#8<#8<#8|'8|'8|# 8# 8# 8:!qtCG8:!.qtK]G8%.qtG=G8z#qG=;wXYuXuYXY Xelff6lff6lfa6fsa6fsa6\fse6\fse6\fsc6ӣhgg ѦVտxUV{甝~O<|"q6o*yW o?Z,~V0ugSoF{8:FѡJq(P7;Ƹ?E8 CT!ִux: '}M}.,5ТZKεj-ZKcZKKj--QZT} 8 &@`ڲ=# ċҬhCm'Bv0vEZ,Vq0\'N;@W+=SC\F=o{ 4dALsb(,KABJ/)] %#B#>xG mYjZ[Hj˵`L7LH촫 Jw)߭Dade4/data/cnc2003.rda0000644000176200001440000000731712576021756013563 0ustar liggesusersuY tT~I&dFHHIXb̒,)Zk}Idd&XRVXaJʦ}%`}w\ڼ\4-]KτfЖIӴlfuF;3f4-.<9B~f/b@6]?%3WMd&V o?#}d"y^Cd>絽GBr}I|mgޟD^k޹NU&52ݥ&_v;ZvA?Io뗓ww_8Y'>yP|~T.#GОmQp/9 v#9^Gb<<̋C$BCfU~9~N;MגAt´,9 Nn7bl;_E>jf! >y o귏rXĉB?r w #_rs^ wCdDm6g0gKc~Eeax<ك'~Ve 0FN<l'# G'^ExXQy?ڱp+vn}f+wqpi:/'0{|PleV`KyL+"!O:|r^&>p p9'f!zI $Cq=Bjz8x^MD]OY~EX:|`)MyKݢhQȿ|n&,7|nQ7.ꈦ ;i' t#YmB<<.栽94)_=@sD] "oi'h;xEᷓޥCbK=AK(B&9hqrj*Z(rf>3*Q 7b,7\,{̆Z(/?1H.P_7?ʚsѿPOC cDڽ(ߋҿ<%h+yY~fgZWoHຣ$,=|8B7hc7iCʝ({W4B l=-~?B<jڵ@oAvMѴ?0`wۢi0/}t\ } |R$zu)4j? VM~Y\vȏU&*czdmԴ`AY;!U*~ 6\}+`Ӈ8Si[JXg0mwO9>cٛYzasY?Yb9TTv^惵 帑_2\:ʖ(2 pnGvsj.Kڱl'{/c<,|,~~c5UMݵK\[iKYӑ4=7ڴ.7Âc9{ߪ7iy^6mdLy48l'N H؈㬴!k$<]gJ¨53 1\s =N{嬆x-9lxX)wm ˸0k1y~c,"Agiw4ѤG)I&ۭǍhR.sSgmz")VvS wU/ln&nH%LcJSX#aN1<+7]#Y Kٳp"ilsxԄ+hT0f$aKtS ߼H㵇#zX);/eTJIX4 u.x-ʹXӐ@ ëRfuz˜a_TkaޢGUfBJDG)f]j Hœ\hK,a+MALh;zԔ2}QS\3ck[6+5r[u^zX::5-6*n] n5]) \-29C*2#Lu!Z6]-Ehә լ/o<#2[jM# Q,(93"aՂrOsYmUˀYV _`LiGꌨ (5 [fo%V*EYf>^F#"5+Q}0!mIO5j#INV-.C - _ٞ !Bh'[|ɗKFk|yX 4q<l8E(o]_w|y_TW5_Kl F4{ĀMvR y?g7J6hHquF fMe_ifu57A/0Kݠ=luȝݴ)c޷na΋5]F g1\+SFWfi,H#w, ZX኶ؚ ׌g@dP#e~JDяN]M=[cP{jemT@5Aρu)rx;҈XfvF JþBLWGuԿtzc)9fёaӖ0K <;d'tuV@eՐzvف2Q gc*-͵k|oQK-kgazЧ~5 a0 ͫ « « « « | B)4B)4B)4B)4B+4B+4B+4B+4B+4B (B (B (B (B (BShu N):VZBShu -Ђ -Ђ -Ђ -Ђ -Ђ -B -B -B -B -B ^+zVZ}@tM٥'+Wu1T"ade4/data/escopage.rda0000644000176200001440000000366312576021756014301 0ustar liggesusers uX TU~3άZjH;iD:1j"!e?D!!Q&QAHDHm ={w[ ÈQuD #rdiX,l/9W93to󝭒/>{*њ7iu?Rw}][r*Cm >;m'? ׿~\%к蜏j 亏~\%Cz^j }q̣XPٮN]R'\xUў߷Ltl{^7 8òܧ +Ҧ-[߂7o9qt֣춮}J-:罤ݖJxu>qSW?s[4,oۂs#a܄إ>%0?[]9r8z(ov ߍ* ^L.qKt=2Q"Pwe4ɫQ-y;NpNQN;q{zҾ;юG{:1?%/|9ڗynQ]zF<-01yo<3 [wݔΡ&/?[¿ȇ$;åU]zA^IU6xG%z,[A!~H!?c xQ%Usm7Xp+} kK?P?8`= ؟!?p:'a9/=l#{?&3yQ%g^/M}_#'/[ 8Ϟ_SqC\g DF_r} <.{CA ed<1.>d+P<0o(gZBy19yoBq*P`N_P>Jz)ǞO螙~g=/߃u|Ʒǟx<{[;doDWO~'&xA6S#Yg S%-_/;=w%/ߍ: Pߴ:1^ϡ߭bҐsr;HÅ ].}Rf\,Q*Ito. `kǙx5W^^>hwZ~ӎ@U@7V6jC&s2Ѵ| CuNt+Ūu9,;K갿Ta]_Y6ڱP믆$U^<\_^\ [Vfb`&+%K`4 AA3AKV÷X) SLE}5ljE=`ug<wZ+efb{iT,sj>y>.,Pc NWNT/;-fade4/data/avimedi.rda0000644000176200001440000000743712576021756014134 0ustar liggesusers ksiqN~A&<Ьb{F4I?B,!C*HQuAڅHCɂ],na,.+=YV۩nףZSֹ.3O{~Ukug}-yIQzEkYwJPNxEo^vlӮuczitnn?l٥]ҋWYMVy[ؔĻe[G76 >ll8ަx#E QM6ۦ-_5?6zY?wm/zmeݞWw6㔦ϟ-Z L] yW?['N?w9 H}`+Iw>~n((Mmo7w~g9[ ]P"`l{Lۏj{o~@֤e_PZRŻL3Lg~XkSkQߝl@jPI/5ߴmlϕm aiMKʾ,KYdJZڞ>.s(e~n,~WUE#> [4NZde璎wQKKwQT9Q~W5iOQ#V?vcQ>Mo+Ö4NW6֟ߕ|KjLFŻ}HJr<$;ŗO(*z՟EZ;qMYzet/8GgO{yo} .*JR;ǚg5O\9]l(%mQqd .@%؎woKܲگ}8 @(:%$Õ,۹_޴Q`+A aێ~U)m?Mn<}a\ʧ}SY eoyҽNY-inZwy._u|Ai +)Qe3\z[U>zIIV헕}RvݢijoǑ^Vm\M-Jێ~֋*E\9"I]`1}v^؞/eIZI"qakǴ\x._5l?\,+U/[~VT8a:Q7u_@HkGu۳Ԯ{qqqI۾B:u1-F~vl__z_i~s0s*o֟(ߙ_[޶_?Y} ~'zumg{>FluߙWzD;iQ4V]5Ycڇq(w)m{Qu /z=f1yuQE]?Umuu:/~.F;*nB|I祣[>oDl$I*s¦]pדb0]Wv غNuj=-go;+Cw>u>e@ %"Ptcwbuۏo-l/_~d@8:`# KwQT>6i{]\Q'ҷ^N~qَKI%]te-kiэI#[Ķ]3}&-@)I;Ev]t(w@H-gumi?IBu`qףZSf\3xڂ/Oo?q1G0=<9O?>/AWIYI_/iiGp-޿wa㧡O{>cOҟ;iڸ弎k_/3~ؗ{,韹 e~>s2!w h s&{g>qmޮaD8?5D+LD'LtDoةĩ:S N59TSNu9 hF5`k4X hF5d&k4YMhF5bkX-hF5ZbkYmhF5ڬf6kYF5:aktXF5e.ktY]F5ckX=F5zc^['I%IlH)ɖ$ےH+IQZ]VE.juQZ]HHHHHHHHHH5D!j QkZC5E)jMQkZSԚ5E%j-QkZKZD%j-QkZ[ڢE-jmQkZ[:uD#jQZG:uE+j]QZWԺuE'j=QZOzD'jbKHl -!%$Ė[BbKHl -!%$Ė[BbKHl -!%$Ė[BbKHl -!%$Ė[BbKHl -!%$Ė[BbKHl -!%$Ė[BbKHl -!%$Ė[BbKHl -!%$Ė[BbKHl -!%$Ė[BbKHl -!%$Ė[BbKHl -!%$Ė[BbKHl -!%$Ė[BbKHl -!%$!!ؙؒGrΜg_bԯ?T7j>_-haöm'c/8aj0]x]3Orh]lns޾I=I=O~^XoB ھ!Ğ1rl!Ğ{2N3wjϠ {&gsYjwU )O$$$$$$$$dx!/Bw>H{+o{o{ӽU,ٞr_婳w{npW;WBb/f{#g2#o2=;U;sg{oS\o¹/b9w>ñ8 rɌ[~՟/n;qy媵xyL.f S@ Ƚ: -: w›]9A}ߛ_8D'ܻ@er;nq3My,3U«U浧]M7}<QYM9zvrZUnswf@X媉4_kЛϝ=w[!ڟ?Pr;3g4~~vƞydfğg7s5{y$|k& Ͼ79 =PwnpTXgx*a퀧A0{G^;)W>;ǿܽs35|詺)|0o?~ ggJ>RMO&KwvNijade4/data/lizards.rda0000644000176200001440000000156312576021756014160 0ustar liggesusers T]HQ׿u ٜgWYfl*QAXAAK/=PPAdoJ`I79=g~l6A,PA(@ei=ˀ\ )[Uj6 -5^a^t]Q;g~g~PR2߻1u X|h; * `7 hH: hBvފz=`/`^U=tzm>@'͹q͟ 3&TE߃༽Ńuu7y]E>_|3N\W :TO/{$8GX39#iVrѝɫKzcIlU&/1Ás淫wl >Ne]k.ΜW Snb[0nG_@@.FrJ7!`|+b.6>8Jȕ#6쨳/a2E䥵>?GxMK`I*95JS16~췖Ѝh"Mk&'e}$jyr{ޙGU ~ݴ 'B23B#e ziesk0kZ*eMPntCwWV{د+GOա͒+11Ud)8TPBip6HpyNwA4sR FI W$ En:EqpJ`dO5)ZFidW.1' 3F$Ekju/j% ey'mmsn)+ۜGM݁kH *{>_2ade4/data/carni19.rda0000644000176200001440000000121312576021756013746 0ustar liggesusers uOh@ƳZq EBS?nFdWb-Ncd'a6.P$EDDū'O"JEjdF)2{N˧R$ɒWaHHR&7+WX:H= KNyg~ƹXu*!8/ݳ M+|B!_d켵]OWvMd̲Vz,Y}1bg=sq`itlzQ‰x1SÎޜt!`)-?∦WO {r4X֔ V8 &v4"thbYWlRJ&$at|)˸;1Q <'!+R!"4b~B`0׍pvkgv!<+q|Abz*t'GLX41my3=NΘa'CuaH=tr@r@r_r`7g{/~0ۙL\6F0>6~6O&^Ff`l=\66}l}|,~tec6d6ח5vu(h H Ëk:,2ڵFB_4k8eFGa{X_uCu}xXk2ƤKqVCf;l} Xo$@b1e hUlx&УTڨ^3F^v]۫_$gcN# Ljի~}3{@cT0]9G.:_u ѱ_k&-Fb#~C^P!#mM/P}^Hۯc|o)0ra$o*&H~־Uy.r[]7:۸ʯA5c%%v%vtXUJnݩl3)MS){ᨮ=.+ϱҽ zc8+Y@5աzͱ\3I{8 Ty =H|5_W<׺=>@~q45"0,)0Cߎ,)πB_ҏkt෱~E} EmXޠW%t4^-cO<ɍ 'E畛b9'7ZN*'>$'sCz>xR| Of#Bɹѹkk ҾNƷiyv=G){tޣ>]SR vɹ(m<^0]Ι9pp]X1\}mHΕ!2Dž~FGGp:/#OC=/:2>xP:͓(TH)[ޥ߼K iN}U_1|\EYΛD<'_LӇX߇t-ǩ`}gH仓M>%Y|Ry7P7dy'$n Aۤ糟+'7'q!wď ??.}J|U8E~-~ }g_G-!tY6C8.k籙aYNI-tY>xw[~ɺ?9p\d<4._xo=r s乾G@=o ~]S{VyCϿx/a{  y|z>{7/وǣm<U97ixTθTre#k4F1?Z/O"=?«EzR~*R'4KXA{;~{Oځ X߆[qv`f,MG۱ D<۰V,܊tߎ$dQ9nJ~<NHOg(qA7b)?߁mFzmH4]wN>E^7#('?I?owc'yw:\z|A>$?v9slwf견 6Ƒ1~j$Y}&sabNgt9l̇%+~4>h㘳\L+6g~ȏ`C1xgv~3J~OK"}3xH9H!f 0cf s|8͹"a:c]OG bzO7'7eo M߂q0R?gY/}r>ףK3B\߳rw,C3 ux;"GiNa^0r}+Sr~yRe9G͇_bο%꽁f7G)1_Q\ǹ;"j6Q#.8P̿9(cDg;\>tf/?|^zX\\j\I| e}Ώٍ|;ȗMCYE/ԏu$=?o|#s憨?KJ8y-=N>S8yx-tz)/~<$ZԴk`k|t`>͎S)P+(zB /@/R{>Tw#zíƬ<ׂ'vfج` _IaYKmVKA%-JDV.|c_vN:^B+{W mO~ uHygX5ɀJ回UGځHQ瑮ْ{aB@҈Ul*IX\Wd^s #bF)] i[%&YqIK3OVh XǩV O3 ܊S51I( U}"""r  =Z8@] D0@ B9U!UHfզ< ( N%0Աpg*뛊)Kn;%2KAQد+A X~i{i8hP E"}ߒ kVÅ>i'aOO94pFu4XkWBm,+ WBUzVQ 7y)"Uu}>̭B'߹ȵVٕOGʥ;!-bD1=a;?bS疤ݡubnokR.3+jȇ]Ja,a]؅/g:<=6 X#L$FHà&UG- $r,XwC$2OS"nKY},#V\g))܍D]X.'Z"C#F&6&4z8Kade4/data/bf88.rda0000644000176200001440000001025712576021756013257 0ustar liggesusersZqzU71b-^7-[)Ƹc+Kp'r;Z=)׿*tsDn.1Bw=\=#;F~rXޟp_7ysBߝr?sdnYE{*#oLEΡl!f C^qbNqo[:iS7AͣFzz?{]co0Nww><:Q~D{d_G 6ΡW֮k6U4Ou:;y~pv?uߺnvϵ15;EGMEQsqteNp_m~߯Nxv_0NSpxxtRm7W_Wv_tzPG[uiջM7 ־TzKDUo~QcRx8nkiЛ҂^}rZ}ܧej beKWri9om;X~j'p`l(]בvsެ i?w,p Gz` -[-L._ Ra}vIQVJfTo;-:t}^{t loV0;ۮ:zLcdSwkY7 /1x#f4pb.}W47_ֿTEWH[뇼 Ɗ7s{-^V\vO(:g%r|Qn`Ԏ&:Ehl։-]hVEUXE-F <ez峱&8eSwx(ςΦtkpw-t\3V+0 cwV8|av'SVEޖd~6+rCEǮ hz7jr{.huA2vU~U_?^m) ptjѹ鵻kUXEUxhS%FnikQ682L!3YboHoV.ӗG_θ'vQr׿鵼e6ͳe[hys?QwOˠnKw&]Er9VEo:2{t(D:.Xh^gw)?׼dw.WGi>~}73+r'c/jcnVD)mQ޷zPE*Z*ZN/"7r;n3)Z4p2+2[?]mSkg׼[C>m=3v_|)7zoLLp0haڵ07[FȹӤ?[L lrmpiJE]6~/vX_Khc4vq4RKyٻw $"m=zs["Ü31BfeX0whVEUXEF%+qnt?s~-~_+;Q<m IEA0:t*Q:$FԊla8av&T\J'r6k8~$IM2/Ja[m13~If+ND ̒xBm1 ȁur$d "SMA{KhǙCTZl3t*NOCM.&?x!q8l*|D,j[N s?89~JM,cHLa=360   P78 O,cf"x(8)„cCcmx)9Vńo(syd-qg* iئ|0ujO_O䱫?e7NQ .4 =n/"!mBٵ-E"^b0Iٹ&r>RҦ]ڪGhz8970{=Ȝ!?jľēHv"If?IEd?,NE_M'&W?HyN,>m1W%qA Tp?;Gr}oOʪHp z-βp)bF0"vN 5y ^`,9JH/1Tzy ڃ9Ǐ߹Ӝi/<@:^CӀ/QaP༎` TVc<0Igbp̫I8k0MR#.Ղ;Pax>e1g"%*TT(ڃf"ґ'$j2 TsDE|;qtYΑǪ \"gjNI%G|G{I3i˽D唨R\ *z/JdlLɱ> |&[Glat'>rƓ(fLy}ef7Q+I9iBp%gNlWT*al i-dlY@xS=Z_X*p}|inu7\C%ileZrK~* )Aױ,)B>~Ɩ9}#}̇#mӃc Ӊ'5ߐΏD䛳drkS^9Sz/(X7zX?Cx#?X^Oe0/?=xx~??agܮҺu?vMKa?F Sxóɾ>"(=?B!_H)G!w KwyWܒS3χUچXeM](z+_4>mBn!<~0P] \$B`w,?BcV9|\AsrmDνC,kυuWH+46BpܬJAQ5:ZD:?ݏg"-6~7B) ;_(5+rW:"|Wyk[y- Nn XS*N=C>S*%Bzade4/data/pap.rda0000644000176200001440000000256212576021756013270 0ustar liggesusers W]lUnKv?`Z ZL P~"-T@J5݁ٹÝڭ13N|S_!!1gxF hg;i#ĄIΞ{=삙_12Y#!#(Pbbdc6>,9N.HpQ@8F?P|h)>oh'.Fv#WeQWr*sa*hةΓu ݄HKf@T=rIH%T Ʃ,8[.Fk!xD!eԘ/\\:mP&V k6oUg\3h ],\8SSt%5plꥶCgWm;_gSk&M|+]+5WpQ$?~`{)  w<ȒbB1@>z 5 ^7]z.N}~վvWSW|M`gNY_AU{SվcAM'<](muiǸ [NKKR|ד_L:TÖ1.N}n b*n>;nm~Rsr٠M}|'|coh<'.|S\7-N\7/v:5wYrO:bg3E[m;CS۹5vaurr3U㰟^ ~>m;jgf7{7umuuq]\״f muy:55ţltޯ+w)>$wSq r͸|69G{kWS=;Nê,24ddȱ!O ܐ/ Ґ*r CDG#/pC"7D! npC"F7Bnp#!Fw8%yx< ~DLSLXSzz)% 24ddȱ!O ܐ/ Ґ-4hA ZhBР-4hA Zd"ȠE-2hA ZdmlmlmlmlmlN کD3]6lW:L;tISJYx7C W>w1UjF񍑦shm_ɇQ-޴i\ެo5=j:YPN`wMMxMOo4Mi7Tj35{Okn ~g. Mor^>_4MM)7!m|XbٿTUnk=+_ͣ!{P)L_i="2wW\2KV橏ueqTؙ1Wn:$MNJV1/,)B>pNIT<dz$4fIK5`/Rd8u%=RJɇJn{sMl}7a}?٦g#_~=L̓VFTZ,qQJԢ=B`MƩmcj 6LRg]B#i7)#3j?Qn=X`!64}0tawlbctZJ_< fjm͙\E-SyJi(KaW$ b"e YW^Mоl2'"4KAJ8%bAc*h缤EAG2/،Bi^?J#/Ea|4V08Нω(XF봒FN_B[&xTF0ZeuJabP1О^Q೔'B[ ~1*Ew bf?yvI*Cl2z16VyfOGKKϩH&{v)a+U ~ \EQA͌Z YfMYrKXu>>9f4&$&`]d7+m53}fՙ9/@;Q-S!*%B`f LPH vFt~e\l`EoZP6_Pt , F"KVgd-Kü,M_*>9c".3}Ձu|+'+LuÃwD@w6)J|(eKFZ _PؼZTl5UpȴTt rz<Ќ)).Z,7#ZXIs+`ŗRL$ I'ZV@bX-2,=|@(!P4cq)KQ & - le%p*-tX 42`oZZ{V)R*Պ  P r+5=!4%nՄiuDF {N>q O`M|&Yȵ9OL\ݩP96Q5̹L(A1e: gJ lQ\MYF&,W6(o:X %{Y@-o*/  QXKi2xb>nDlÐ:VtԪ>tUUNz2HvL:>VQ:6v^ވzauPi<: QPxu $A6]T&]\l9,-\qS\{Ǜnc0%"LFw!BGr1oKpSS6e+Fade4/data/perthi02.rda0000644000176200001440000003430212576021756014142 0ustar liggesusersBZh91AY&SY5h {|\}Uߠ@@@@I+|%@T@TJ UQZi!Q ( 1RIhI*HEUJQR(*s@ UAT)RHUGp|'S4L&JL2`QaS!h$FhMhh *ILJJCC#Q Fh1 !4ODzF$4z=M"n9׾v%1箞(eA2HvBnZfUMW>|=H4(sdP]:~]vVmsLI eߺZ6 QTxlVI5v2'eN<V^Z.}c`@"̦+!xS؎lIeen}ȿ_[RPc\ $U`* :kk?3v.)ӵK?[ߊv Nk4AFݍ0:*-I Ph|GJhdc.O!ɂ .z"M >5Ҕpc jLLg敥fIvz,xl%Z>"yW]IKp/H[|21uGM:nb%5W50E7 _b--=rOp%wM 3c 4t=P>qm>:Ay~?y T~\˳h=#mcI+PbV꿇eύD1aJxZp5~ͯ]|'K(Vi۾j `,pLj$:S+S!RaP1l+EUl)I!{9+  s^t V j]OT|FLdH9A;X'$bB;*&n,ơT%W]^@޻PBMJ]׹jTJ2ZU3!Q2*5/AEC]mU2V1]N8RE75/ UU Bg~YP,F+&jhES\:ң[wy@tAgRުK)n;[z\hCՒ*vHh"jSB 7slq)3ʚ_ Ьۧ"ᆈB jdEÜl.{^ P FD ʫSW˸*3E^u%J#?{gsuXDQ!bF]/IZ]hG,K2M#y xѯ~u2:aQpAO-R=hD]͇tt^h{C/5*eQ> n5 vMHՄ Z40dejJ{`CJ~ eb$0AJ֦o<þʁ)}Zׅ=٧vʃZz+'nXTT 5:}!"QDEDŽ9(K‚_lgW/ O}ciV3vE疭H! Hh!Ao=fsm՜eo/jޗ4AqڎZcSzb^w1 QvL2Cfem)3bogWGAdL[H]iaDhAP5J3և86]Ot.ߓp{$Snf_Wi̭dg% cA#*^P*>3tgVrpNmBGQox-23}7ԋBvsv)Xb04QKXNG#bc^&5q-Q6}bP=dA}I]AaGobj\s LO ڶx[lKV&109o)A,m9FF >û%xhzp*r,%շ@ڻ_"]dZYxƬFDTѮR>[΅ q1[x-{&Xp4Gh;uhj|E-:MVݻ=sGERB:/3 4"=3:J[9% 0Kims?XDž TU엜A%#ݧ-[nxEU\Uꈮ^TJ>觷ڴ~2To _U9 [@C(B VaғrWݷj$]rM>~0{.n]Ke`({xȰ>*P.c8NRz2GKi?w6qc XCWl\y`Ƅl-RΝPjQZx:@{]``(ȗXwmK ( (&_ Ui.eRTl_" vzoW= =sdx3mqt& m}UUV}*P=FQWu_m, 2i3ob|֧; ﷚4 3XYcxyc74Z o&|L2pa1.[\NK.zE}0HὓqFWFe -6 p^k50|܏>s͉- |e&;phFn ; 1Y;=d#x?J팃.*Yo |˭:m_4jzSb̀nU.t j&=Sszd [rK,&xAM9vIHH(NފYXJ_\S6@orq$؏+]hdh*HKj-C`=Z~ ,uTcGE;KUymJG^bp#jʚ@ZwB@NM7_OŎAge[-cMOi\\8yK6KQm*S#_*guhjH-c))q}T?:^\ *3؋)FUSm*ıӠC/z2t܂!h*BPifVlSNӾ t˦] U$gZgͅ>eX-1j;jYzEhX:1ߵ.IC5ꅖ@'bW-R҃vjYq7if^Kh/5Z<G؂֬Rŏ`ȥE{g㋢Ms{z|c],ӆ) < DVi5> S A/)C_ (1r}VB3KU< B:@zÎ$b&{lJlp1}kQMsHsm $Fګ2+L>3Xƫ &_5ǧTѱ_ {!ͻy ؔk[Ӝ["qv}^rthЦCaTdf_ <n+mǹÇI]vhje2\R,,ft41a*#7hSն1{qLVLY/u/ل}"NBf|?߽{0 PsTrzͦp \- := /C ]^_πkucCwL+٫~HJTU":hta3/`GͧSy3'B68i/ȍ>{ɯ.%/V\KS;^JZ*l︊@1u[Y&T@ -N&le/*%(Z;*|y%z#TA A>MBZ|ev`)%͗zR6Ӥ}Le\&CtAt@%+BI (TA18ꢨdB~&]WR1$FN;_ᯌ$|k0ޫK}SD"wh?b.򏳗lr#*̌6*B=&P|k:$^X-F_2Kd!UUC!ُ+!|ҫ_p0rCi nߝ/'`uJ9X3Y^ x:{bvd} /]+L\8#jjL 6RE')R4l9aVEkȃt 14 6>$Ey=Be߯(u3[§1_I 7[k)Gei'I(!gͶuy.>ðΖ2Mh^dXW IEn^4lWέ 1sT4̮DlA4gیga:QK8 PH-8Bq·ΜU&voA9 *" cF{YmHCޗ\LHMr`x(ZJJLPA)3;b{LA)[n*2'◓usiGNmZ.\ÃqV$}=%)ښ 2B;A)_4TW0i c=s̏:,4TXՔ/+ֱצFدJgx.𒣇Xa l^)&]FX 7w\՜x ڱDFPC[;>L!N;iGb2iRe:'u^N e ȗC=GAl~\0e?ńw]Xh xEkMķ&Ӏlghm0/[N5l{*nS@E<.. j%mb.Qk1c-*uVˊhN|uɜ0q;Lwn 1+ 3]BOo`8!S {GE'5u^ȉvh NӅ*ATf21I* um~ov,^}%8x>Ժ-k\{^;m{s(ђh<-|@JYnS^=,1c;}ta} "M_7ؔ2 }}k 4qWnd?BOkleq/5 \æv >\[M-k$:\Ĉ >A:e6]?M*ʕ 0\A˦9~ip<@T 2MDw0\{\M@ay)ZX V"Z۩9"vNy08!K{ޒ$ڡ7dP A`",ƙ#bsOe2U_(dknm=gJ_B2#ȬSZW! 4(,@ʇ֜DDr,7^Yغ!E?[d8D*UR=a|=ox]Q70(=:y"[U`@s*w;TfF>Y=Y‡?>c=gʺg_o֊rEî@-P*K8>~'}Yw&XOLJS暲M"7'q=d"!]uCV!M/Կ6{\xF 3 )O<0wJp[Xvƺ> 8DC VzQVxm{.<Ǐկvo;`-»`Xg"g_u,6fWzeDYTֹ'*|@(I4!YQq+eUi_gs.u~oSGM##g6B$a(N}mk x 7i:J~lyX~vݞnbӮ  V~K]׺^HQg~ Io+W4_8b дDr$GO6Q;60'zN̚~k~J@d/o~9Z)┅Z]RpQ/KU??mGAw{e{$U8 kԠ&=, H|o(BF#ޜNWpr"Aߦ$קX`N.q 浏Z9m=_{dOչwݷ;PˁASG0̸:ePly7O>/{;mKuSy= |N(3l՟8U,qѵۅHzfe 1?}*)V*]Ԋ%N2%3\Z+x={nZ#n.w\ikUj}BF˧E>!~㮥z?{nYZ_l:vm&aCF$q[95TT/Xx k|<*sQ/1m>LYvtz㸵d[ъMs17=Uj*\:_/^Ov\7b4$À+OX`~˰$q58U{sk"v3Qaijjl|#`M׭k61ZUrRL^Qg_XVS0^R^{RHg/"uXkKϝ`nY׷c\ȭ$קĻ?QҺFI}i(0WXQZ3΀kFO3lv\Lw\N۬澹م~=>֡'?@ʞ`:>~?s|._* 'ǝ+Q nÜ} |:oX|D\V >j׷ZfvL:mL<~]EIm/ӰM`F!cS~=XjqJ>|Tu7LU!qOzwn (~y8ΰ`oO#OKd [ϬG\EQ|SQ?u}aγDgQP挫U5AJ7o~N?zi_ݾ7/u- M4Oobw}><P[,T1Ok}|9"EXek2!ΆVie-d54ŌS_{i?68ɠ%[ "*|[BB}(*P@"?lo@^Q.)PEt " rrrW Rp8US_y?y;\;]u|_񪺽^cyt}Њ_["(' כw>E(*IQD"hB"D|ד@xNvB!ABU EP FI¸IURwI$Cs.ZֵkZֵkZֵkZֵqU*ΌJJJJJ*Jfffo`Ǐ<(2 ؝yCsw/]O9'gwgy ? mv ?7ӽIcIpcm!'o?#'Gcv dSD?ܕR:҉ 6TA[ovID'ݗG5/i'M5crݭx% ' zeNQ&%lHdbvQ$cM< S*Yv95tZj/б9siq khq'U8 4j9rNXkX۝kAR(ZU,d4w3 f6eڇ*gi Vs T̞2+n!k 3\MC;vF߷'CRigC3ujy͒-F]NHk;-!aU馤Iwp섦'%+2UaEmmLPٍILhυ˩?GIa[Ƹ'(L)!ɱTK%׃ko D0FA4đ˽h`݊aBhRPE/2GH6zGT%2 EOCFFU9Ԛ*,]T.(/[8qI;Ru֯gYJh΃3}mj0;UPhFYE0 s`3c*PEޅ ͝y ԻRi5L魧T|Z-9`juiEmdBPNoMqBw1{Z3t Cf-ˣHUa?2#ks ̍<XꑹZ&0k xkt\`h4YX-F2O1Vʫ>-N}zzw91#h[w #$?Dae5d/7c*Lӽjm*j4Ow$S 3Yade4/data/tintoodiel.rda0000644000176200001440000001004612576021756014656 0ustar liggesusersZypV!@Xٷ}; | $j he鴣B;ZQ*ҪcթZmں "VYw~]IfsϹgw{[J*H,o_'wāIK/s[i IXVs7Bs-C_}dw4C3ߏΚa$IMթVo Pճo9.yG͉tD8?-\;AEzhR3_vBkr7 h?nW0D>x^{?(7aۜ40?7{N~Xn M0; Xz@7 }gdeC=?'; a1}d3vglK(`ß W'b>yɂcԽ&ZJG7E\}_iw\z{./M@OQJxRW$u_#~*`_8@ ~鈻`:9@p|Y}Ͻe;Pw=O#s |0A Ayuq&çmbY}&&>N*cl5zۇ'z0NW}Z $,|qcigK %`yJ:;cGch5{.%:c~ z3>;ۑGA?Qԩx[~`.!W/օ}~~?OKYח_W/q_G~?"C% ''߾,ػx#_kYw:'wup{Aj}.q41ỵ(\ Nf! zpSQ}Ǿq5|J:#AA5q^ ԷSW ^zɾ;^}}ؿ58#^' m38dBP_ؕ#Ba>|܌8nbtvI^_>+#2> 7{xzB#9!C!}yҨaO_'jx FWC)7C=c//D>.G*}'njF-1i;ߤx.cQyZ}r_Ĺ)r9s6&xE#t^BpvO?}u{|!\/?y rO }aSx r {$q=y^YΆH댿|'$q els s_h-p)/ߜyS.ȝA4?(%|A!\_([wLrQWbw@LB}$7VG1XL{T0/KPҤBuZsr*D.O}8"2;#B x7me@?qɽ\o*ka RR"ΡUOU!=A՜hj&5^@e|1,a=v]S^8~x_ =g#u ާBdTSЧ[z{mez<@܋!uЋA@_-s(U6_ycē27_w{3㼪F4N55Qvb~{ \?__ͰyW!:e-_޿К81;tnr64W%. .reSSI!&)z0UrɹeCVf(:WFc8p㛮uM7(Ug\u=Fl*6`/*aGۗy<90ϯ鍍yaj%aF |mc2$p4裁 zex8ր8px z6 kDˀ[]$_?u"pR'Rfp53 8܀# xKp: Hkuɀ XˀKnѷ xC#6+(.]f$q,KW9zte lnΛ|7!ym > M ݆m@芬]я'`+*+s`#/|~iWV҃ھgAG9\^c2 չCON@_ޫgj'C>7x;{C؃+o/Ƀ7.dė16iO|f+E|kF|7yx!?_{VwǎFo^Ck-q緫x7\g =2WZ==<=xQT+>齯7x?T nw=2ʦi ȥypœyuyhÞhz9d9#'O7摣'O5j>9Sد`>ׯ^azGFHi!m#m6BFHiam#m6FXkam#mD6"FDۈhm#mDmdhoG%J}΍>q"$Y0x:QJ޶'Q5-!רO~(_ +b%JY 7Jqm>&2[JT;S qc86ade4/data/granulo.rda0000644000176200001440000000212312576021756014150 0ustar liggesusers [Ueǿo_9sFmjRξ3DQ ud:A%Qty!AAX=$D*%*X&cX^ >߷쳝9OmXgZo},Y4J)G9j~R.tqhsx|S[aMt"m;dW 6 dt.=uwq.|O'8mܗsu3v˹VrxJԳ3u99#RO.wcU{mzOf2)~ķX ]"IL7r>$I՗m? ?l^4\x{F "PN`ઁX_?mH,]/运T]-Powۍ!4<:b&zRs& Gɴ ^,qg#wp9ĿIw#|wzwHG?CfNW(yʦүoRyV2Շ+ā[E3u1vms+ef,yfJٻ&){S5O2wy|183-z-^r5JEёsi1:uZNi:Q%B0-5KH@H@H@H@0B#P0B#P0B#H0"#H0"#H0b#X0b#X0b T-#Q8ZYq~mV?i7&Ǣc͕V._P ade4/data/ggtortoises.rda0000644000176200001440000003302512576021756015057 0ustar liggesusers} dUua^ 5:F?FÝ讫*`1@ϛa_5tt$1! KHP"*Q >Qh4_uΩX׽kZkk9nV\y^Kr%ފCӳ[ss-󼼟͟0_uA|ߒ{-7+Jw[swB3NlI'?kNiԔRNOWNaNgpclH #QV4Ƨ'YsHk15’&gYi)r.+r%䖏NM_9:GZsQ@c91:%4gZSY:zzpK[2;slktP9{jR ؘ~ˣW>qmx}x||OX>><ұc ?}{J{"O{}ӿ,3 \}Cȿy?!ѾK0K I ?/.x/Z^^gٰ(}F}׆|0|]?p8q֘ȯg0?Om 7q~m0N;LwMvnܿLn _{sx>#)?t]o!E䩁܏b*a\]eݨx?~G~ P/.B{EO AuH޿|lG{wBv|A>/[8޿zctV{Gv]qi'۽ǚЫSK\>^P^M0$S7ÐGQ|M&?#)gIrc_s9,wv"7{VX koD`dx a$ȃB 2adC:} Wg /,0_okv^=b)e?퇜3j k3Ɲ))[| =|6оgz⯰`^*.a~h/E~n]qir1|<M##/n_ φskx}9pPYl Scd {5xڤ<${m] 蕤9?h'ϴ >/a|y&W炿sL76>L?|Ƌ|:_w&gB<z7t h}lA.XXNbF>{z_\1nCchcB;!݋v2沛n.%ӝg'imn]ۆb<1o+s8;ŏc |{n Y~9ndؿC8#w[Mk?_: xa aۉqx?yS;_ׇEaww_trrSv>]"gz(=SîПuk)2^s;OSY?#^q9`8ۡ] qḍ|z=̏^}?y 2RA E;vL܇C/}i?^}݊A=je+\kWWN™^ǚ%1b}eG? G˯r(J,*_~ /ᄆNh8ᄆNh8ᄆEQEQEQEQEQ%Q%Q%Q%Q%QeQeQeQeQeQQQQQQB_h ~/4F`y@0< `ƀUQUQUQUQUQ%|azYПNgIgE J J J J JԜRsJ)5ԜRsJ)5ԜRsJԊJԊJԊJԊJԊJJJJJJJJJJJJJJJJ*J*J*J*J*J_+~֯ZRWjJ_+6ڀRPjJm@ (6ԪJԪJԪJԪJԪJMmS[Ԗ8%NmS[Ԗ8%NmS[Ԗ8%NmS[Ԗ8%NmS[Ԗ8%NmS[Ԗ8%NmS[Ԗ8%NmS[Ԗ8%NmS[Ԗ8%NmS[Ԗ8%NmS[Ԗ8%NmS[Ԗ8%NmS[Ԗ8%NmS[Ԗ8%NmS[Ԗ8%NmS[Ԗ8%NmS[Ԗ8%NmSԀ85 N SԀ85 N SԀ85 N SԀ85 N Sj8NSj8NSj8NSjjjFԋԯij96;0\x*/Y,k]OI5u5G''g%&W{ E9<<]t ޥѩC^x/DcjJѫ,'aYnH)[@OIz-g|U޾:C>Q|sޟUNzLqG~ D{ ~3jS}'>4ٞ^@Ll{p' !_ y0-GQL;ok6&ӿ@[9D8= / >Mg?vV2?T{N 3P}ړ[,?vL9~|_מŇOW~X+lG/_cw|) #_pZ{P>vdK'_@0X>܈dڧF?s7wP{x>uP{&>^ vj]'S?@ L;? 9bbWo?j>%-rw{d>D1z }ʚEg#=oB nI3N苝G)C/~aw>-p{:ӟB'٣:r~F }M)7ce @)O =JG)c|hg}i5(η|WzriV;wQߜ7e{}Aq$zivУ} B{,|g|'@5YJ}j_1rG])8q5rm 6mt+?QO,zE'Y7@ =rWe;̍ƿ}H{O\@u>SfjTew)> Oi]/~:W(qa]Ց޾?kNU{c>Uz~!πSp_b2۔/=##by9?Iȶo=ʿ_^]G, *~Ͼ~H؇BSc_8Xgskٛɏx}';Z5+gZo9ИٔY6h^77, oQҟ&6[y=~}nEvi;Ui'W"t#dѻ|v㗩]ϔv!M7l"b?bߝ+>O>;r'`x+x ߌ>qLB#~apc1ɒNo2KF^'nځ =xoƏ;=ÿSr|ɷgHO'I#Y;y9,2v_8 ߜ8~ ]ߗ͔ U\gw0$"]={w0rCi;uךy9ٶ;E}C?틈?>,K+{; =v[SH<s3އ7 ĉs;Nn?'Ďdw܏}H._ _;oy-넅\7;Yrme ;;/////1Rߞ:gޏJ̷vqRnSWɠ{'m\boe/>_')whړ-Ϸt:$큜#Pĩ>{qXu9r{"'%?sMH< I ?s|ά~0%!yƑIa9,ȒۮIN1v2x>)bף Mv.c''y?܇`6Pr{\vD<"|.6싍27|Gf_D'b>{>W*&*q3? ?"߈W SR“|Q⧌s='gvd݈%jIK~}#RA$ٌe[eo 'Cd?Ycz8?aD|rKP~ݯz_| L>B~k~q=|_v2+az6^w3z9W' `OVx - s~'j]ʏOh 7'UNrז?BK0r@1qm)羳WD>c={i;?'zdy9ߌS>~þM'a?ߙ[Ks֗'-0N.ݬ?~6>^\0F9RܹFSΏ}rg&OlL;'pc2?rX(|LdSvp/>9ka>MD0 P)E|iwb:!NJDzk驕hqã+ZߜhjkQ6FКb3W̴ฏ:41:+&G?jN59*8gg-lL2|xv|eKl5[Sn,f(0fcvސ|Ouh8"5]WOz|4;JOi4y`> W@m|ʥܓw+ iM9( Wt:KܧXTi'Ydig…@t|WA'\iQ;>p,66 gdվ4lyGRB>r=O1_(dew|t,ߎ(.K< _ Y{de_EBd-&tld9\˟q:S. Q{aąC'8ʻf5b>vCluѱ]Ț/ |' _ :r/#tO}ml!zotyq]}/[6-1Eωc3ckx>nGi}hv6'*iEF>_,\4zUKw4v"+f8BЫ_\z.4ޣV~;X\?4DT,\qsg}p %ϯ .zvn=>y[iROii!fpݬ$غя^G=ꃤ 'sy"x&濰8/>wXىA2?EHG _LmMln MV}ObCa^|,8Zp-OQ\78\QaU{!Yw!xu;Վ&66EqQy\䧾O}~EqyʋWt1n_񢼧cF\~5~=I_`v2js].R9p,s/~d'NCT&v5W"_[؏χڭݱX:j!ډ45S q/6)u|DLQˮȏyOpχ髲<o]eܿ?:?x_6ZZQ'G^оdچ. ҧ}t~3x`zєm%2{zWW=nbdAn _(vq"&^ `5^#<ש+~#Mja:(jkQ >'mm)H>UѿgˎԦ.3h,.7<=;W>8p,i# Ѻr~XWIGcs:٘t辢9ϥos-/NsG;XhLa!} W7%١c`h;,n;/GV/Y`,Pw⍞)[: tUk{W Qs9S+0.uḄsy}xv3/Ec>sQV^^HWx>Oc=.]hӸ /3䜹4]q>b9Ƌ^r.Yf?\  З/kM]۝]Iۇɲ N{Q붐yU/}^ Yϙijh~}|{`Ԓb(O$0 ̅BKqцJ)g J`T-Q8b끠 jDIŖww&$A%r Zbs1qW)qW)qW9Qgޅpjssfヅޒ&I>s!^ʚx."}|u`jpc0v%5%?o͖Cqm/7fdeॿw fK~#D'bNOcdKN_J&3<]x͗Շ_u0i*/i̎6P^7KmIkr}kZ*Kӳ#sUrHz}vIxĵL9 ü|;敦~xP \S#q+(h}7}} }}%}}[),gVzabfrų#)cV>tAtro0 B&˱3a^=(G=;Z-z)򸴍<{y"P#_N~QJsSzhaG8|>_4ƗS~ghx/~"̳6|0"L⽑.Xrvwj='kN:+mµt1315~4Ev/8~ݿ .~_ref}/ ϧg^ -_zW#oSۀ7o3xέ( A,:ƳPS6~ȱR7dEFNd9t$‘eGNb9;$ʑHN9ه 3* MZ1:7VtE.n/}[&8+4{TWχp~%x[W`5^TXOR(ctzxC)WX %hG^Ox0dQoH 'M (6ʸVTAL9 dp_N9 d힓_NrɊ>'a$ rDŽҦj@BiWȢhᇾ~=OJ ׼e{=jXeJtH᭏A}X> @FߌB|/՟p=KсgBڂ4JсV(> 3 )MĮ*Er#'[99K]"m%uQIHq~-u)[r_H?{~G9ˌ ]xFz۰dsXXDɰnݍLn _ޛ?7Ma|zRo @{YO1 kOQoSt; ~a"W"wu=8[!Ŭ|lG{wb#Xek1Gw"ctV{GDR uَ-lfЧ|N̄[u-0vP}E{ zM3)O1~BCe7h]t?;1>%mۯG9ۆvma![V7?L;!ok7>0=У=AN음wah_I帎^p0saGC&4Ě>3eeϣrIḜBD\Uee srP.''srV.'z\.zd.z:z.@A^*]^+]^,]^-v^. ߂RsJ)5ԜRsJ)5ԜRsJ)R+*^ZQZQZQZQZIZIZIZI"JM7 eVVjeVVjeVVjeVVjeVQjVQjVQjVQjӧcYMu>(3\˻fM=fw諞Zk&æʹfz(/$-h Rлs S51|)s:ޯ®A}lm {  **_2O혐TI.{mkQĽyڦ-~>:u&8QWכ&Ļ(zHY.'cBJi,p]!ڈ2%W T\T\T\%8d1!z >vG^u}}}աa?oM}lo涹'4uO+K!ԳK(Q1v_<.o#U P7~ŀnUeW<%cHds^4&,IX/~}xt׵yKe\϶qx224 @Rlp3n;o@-wjl߳mF˩L]UaVUXeǀgRfí:^_OSxG]Ylx"F=ae\+ t9Qwt-t-t-t-\=6MfRb(w5KvGoGڣ9yRmn](>v~O ":𾃈hQk:2/)݃ok=qSxy{Lѽ]P;^޷cixhG"ډrFCwB=w뻋tڷ{W=hچm ճ~9?U5P4P4P4P4P4P4P4P4P4P4P4P4P4P4P4P4P4P$Pd #ɓslkt{^ _>{b_Kp[ H(ckCMTuX L'և'(yЂj"ʡ:A (㷘,Q!ݑ(xͤ_R?nOsCGh}?SgQx=𣝗WÔ1ô;ҽ˶tPeW{pppppppppppppppppppppppppppppp'%{LXTsjA5noł]_ɫnO{Gg=zż W@bǒT+>kC`h͡ҷ1La+N7Wn8\qtsʒydDŽxurK%ϱ(,N喱?#oGGG|wttи'OaoBȔCa}Ƭi`z&c:c=̏c~ot](-+%[e ]Ws1ME5^f.u@fzlJzz?>__NANxX&I.k|jz!e88Ә&eܿԜ>p`tꐩ|Ƴ6fVs?ggX@kiy1L`f!ade4/data/macon.rda0000644000176200001440000000067712576021756013612 0ustar liggesusers N@ 0$v> _@T]\qQ@ѷ S88&ڞ3g.OUZMUZ O|fV;tGV&o_s菋>5._'K{WR'f8v-OYGtJͷFƅCW{}?[O/2~to!Ηh=:ođi:_NAͧ`\Z]>:K݃|y L]?^;qEQ֡KA]_+C%|c]55/GιROml;w͇xz.;O|p,O2Yɀ;` 0x 0fx^VSFXםcy@kF1K잕L64i|:cӫ<"O y@ODN(]M& UwOb|Iږq7YtӒύ GDq 3$QkZIg*,q$NOpU T&=6ԃ=c1췭Ɓ~^&lL[|lRQ$9W1 gO>Nfٗާ(w6dvq{}/)Y͒{ؗRlqow$mS,'6#٨eս\E:I!nm˚2Yi]1@`K陪,"yN$ʾz(a,)yApK*[ūr~mm|ܙIMruG=1uC7qVI=V`| MgKkqq#3yE~1X?z?LdQ@l |K {Dֽɢ(>z@佮pԘoj׀_oP*93TX EXz@^'ߓ/S_rUuWvvםqMsem2k;4+8`K 6[ELbN_o N}V{[,Û~*h=1p/|`$aa~7T[2~@=aQ&9:EDsS|A rf7޹I{=FwJ8vqqb{3c3@Aɸ@ *eHP'oS{,U=UgQ_dMܻښ]e-ś{.n-mQ2)|Ƅ'/-Ut4rKSt% $:VG l? r l8;捫]**[!}^UiDu@hn>Hk-&[1awx" 2 Ϛ,IH7EN"&ZVA ٳϐG48أ㸽lQ>}|,$jpe8!Gؠ{8GGɧ>}i!g>FVCABEZ-U=  L 60`*>r#@\ 6r!F1QG:buĨ#F1@b4 h F1@b4Mh"F1D&b4-h!F 1ZBb-h!F1ڈF6bmh#F1ڈAbt F1:Abt]"F1E.btqq!0(O[RQJ9K9g,|eV; !oO}Tg}᳋7/Ck}YrHآ |3v*髺*%x_fr ϥ-_e٢-MY| /C׎gB`/MC>YP9z,P7_P ,׺7T؞N=xxp pCkV?fbxEչK>КX^7+ȭ0;ۅY-G49&Vե qbUm^xo#A51ˡolݷ|ۛCHus_Z7;bBHbK ,}lxaʟXh3msŔ^p+)<; e0M]_ 'ibCade4/data/mafragh.rda0000644000176200001440000005553213125167376014122 0ustar liggesusers} UwOAa w I a{:}T/KB_xH57= ?=O8TL;:;a>8ѢA&^'|\ztƅ{gZ{Y r@y9N[4 'A>3X7p/d轠gϰŗxkSglV7akn^w꯱*7]'9} 5ŒʍVv (Ug8>h\޽lI$W ν3́Էз?Y}Z3}?zU_zmxjgYNEy gw,q~6=L}GGY h/xU8vWyS/_|k򿉭W/E>Y 8tEkb^["aw[n^do|o:o7c`]mh' رƯ|ؽ] {N.):j&5Y+? I"@yxl 8}p%xx7䯲%߿ڢ.#S2@2vl؇;"{"m3gc  $#rٽK l8; NwÝV܉N0|O{*^E^=.C2.C2.C2.C2.C2.C2T.C2T.C2T.C2T.C2T.C24.C24.C24.C24.C24.#eD2"\Fˈp.#eD(2\FˈrQ.#eD(2b\Fˈq1.#eĸ2b\Fh2ZV.h2ZV.h2Z82\Fˈsq.#ec04'kkշI_i;^໎mmnՒS {׷moxTzPm^S}vH·QW}omoC}ͯhAy٧VVႳgm~離%Pvd]'7Vz_F'>lP?/寸J-:qz_+Շ7Svxnqq>s6U:^^CӀ|۫:#5otC c|qUުr}8 u7[շ|id?~?~> UV?ބy]poc=\c+޿IQCk^=I롕?VjmW;~xq,9]+omBW.2V_b?=zẉ^}քO±|./7ˡ/뇶m|5:VC}qqViXzyG?ֱk~!߫XQNcn>JDY^[ KZ[7VOz շѶIgz>"Wǻ5:Vjjwz.8fIVFJL}=# q>7v;􀓾ֳϧ+rH9Tr-oc;PKk0vVuCmgi&a|ouR*7OdZt^;<וVկfMzIM+·>oom׉7P߬u`ד@=^h[qVצ}>z7WVCa&us>jggMMdE^9ܦq\i=quc{S]7Wz^cm>3TC}ƣ'PC:OLL}&;/*ۙ\xU7!>HշUzq/~Hą?|d]7<@=/7km?Է oDO{z'a{]·7=\y\>+϶Ɏ_&p&;ɒ|{HO{m>:.ެ0u7V~lc}O뙓^_PߪU~e[|oluTr&jdA|%GUtZ9j`>g=+zU/2Y~tض>L6RwƻF/oMyo|` |4h hc`vUiWFi7FvDö}Ŷ5~Ķl}\&WUlr\&WUlr\&WUmrU\&WUmrU\&WUmrU\&Wlr5\&Wlr5\&WɍFlr#6܈Mn&7`ڈ0m=FXқ3GrрbPf l@i (׀k5`A l5P r9LA h3 r`9,A d1P r 9 A `/ r9tA \-P r9̂dA X+ F2"\FˈrQ.#eD(2\Fˈr1.#eĸ2b\Fˈq1.#er\F+er\F+er\Fˈsq.#eĹ821UvʳZ+cecUx',%]tb>/[*TqDQ=Uȏ=h\K>АGB9_MЫColE;BB(ugy,yX/,XBh >q" Vr+KUH!bKNzG}̿䤫PKNF5B7.~\Zrepre%ڀ> ו z9_._pvD><q <<ޠ;P\cc@Ϗ3A;@nx,c&8ބ#b'߬;xX/lanz(GWWB>o [t:[^(^<4$3*^臗xx}x=iLcХ=_x ǠyeRRZړ*x-P!-9)^zђHKN*^u[%'i/ZrR~4:aߞ$,Ғ2RqE1hI#m/ A=n{R} Z舜2R]1舜uS]P_HK9"P!Ǡ%NuAKc':Zw\kI 0rKfuLI<+w -y3,?كdk&2֌D!=D^b{bbzb{^Oy7*5KW^LR\9#71{E2x} `l`.;Zb/8/؛zRW:([^ߟ;=m5׷ϹKn_O=:=3.4s4?q89Ak=77zFWOC9oQl-{~_O\s{}ڲ'Bcg0OA;؟gVS)gA.OY= |1c}ؿyeFn_>`n?8n8|H}o.9cw=r}>vB}_k\_/R?z!>~8r{ |lA`7? i6 Nnx^a?_ |!~`wibx|Z8pM/,_*w}q<=7'5^EG;+'?[b1Gh><|,;Rgw u[@0\o9ho@;0/ QG.^|ʩ>M/? #={I8}#C? ^G13v WoWG!}Nhrx98|πq=?j \qSjOB sD[Pc=!>o\ssx |KY,P+? ~@y#>A9  Q//Uabp΃cߙh(Gsq|O9w-P.sp#n!Hю!a/H8X_~pUqY@v^Wy,و;c[p,6/4C{ ~C˯{7 QO '+Rgz0^'=OO:W9E{3P'qq8{"Ѯ_=cCp{~i<\}g;'29x>*Ї Q^ x<uЏӎ璇=y>ryyQoH.(c)M·^]sc97R5ry܎`~]B>"zO /Ϟԇu=88OcΓ%Ok@9^wy-Ps8:q !:_,7xqBU8yt(? i$a+u8A>0 ȿ>>^'q=F8V¸񍮅cV;+|W㳀%_q9py|v`.u_mD{j8oV*AyA}Ct8^+WXt][+@ -=cѯ`V{;A/E,9C?zBVNBs;L:wa3[ h0.*φclbAhhr#5ҭו<`@vV&ajmEq+ov6B(G9Yhq^۠\yxujg "^'= !5C;x?ae~><" P]wg^S^=KE=ryEay+ʯ܋,yw! N*}v?аUp me7[Yz7o}mnCî; לHU<[%RLZjV[-mueӕ,ug1<0s!G26lh)؜s5 ̲Bu1bGke~jp|쳹f6km؜AE}6o8 < y,l2nT+0%y^9@82{+_|O[Āh>S*aePl6|> y+c߲鐷̅c3_4}d|7k 7~ˠ| wC[ni7kS,0_[4 M^޼+lee|=e V^~YןKO@=g,=,҃4}>Xt;Kc>=rLyc,ocҗX ھG` 7K;C,j+3.X< 8.'qh+d~@>;7A>a_l:~ xe7ںxͼwX_m2_fe&;sfsrϼ'<,3^x@ 6A=SXJ>{:eAߞgo}7tWn|'n7Oc3\iXE'@,s:b~hɢHB~PC^]z=#Ny()A'?8E={}Az:v$?^.tA]Nlr"KloJz/cQc{R#$l_v%P.=p\:H_?_ "|z@q\\/4 _ޅs,(w?3y+rė1bwC~(Ϸn8F?D/# r[|&ro*eEOGPE'err>'p8.#EQrR~n-#v跰^P.U'~bEwD{>oG<ԏCwz iSQ/>1O _xpPCKzxr]^'rԛ ~^Jz8%oD/lO'C}E=tXCv 8F|m-9z}@{&CN}LO[7w8B!??`?Oy"!?%g}Q.+3.8>hQ# 'Cy7(aɇ}AAx7rc(o*'?g)Dc. pgĀzktګ?<,nƹ8h nvUiWFi7FK$-L$-L$-L$-L$-L4)$M!i ISHB4$M%i*ISIJT4$M#iIHF44i$M#iIIIIII(I(I(I(I(IIIIIIk%i$VJZIZ+Ik%i$-N$-N$-N$-N$-Nȗ(K% |BD!_/Qȗ(K% |BD!_/Qȗ(K% |BD!_/Qȗ(K% |BD!_/Qȗ(K% |BD!_/Qȗ(K% |BD!_/Qȗ(K% |BD!_/Qȗ(K% |BD!_/Qȗ(K% |BD!_/Qȗ(K% |BD!_/Qȗ(K% |BD!_/Qȗ(K% |BD!_/Qȗ(K% |JD%_/QɗKT%*|JD%_/QɗKT%*|JD%_/QɗKT%*|JD%_/QɗKT%*|JD%_/QɗKT%*|JD%_/QɗKT%*|JD%_/QɗKT%*|JD%_/QɗKT%*|JD%_/QɗKT%*|JD%_/QɗKT%*|JD%_/QɗKT%*|JD%_/QɗKT%*|JD%_/QɗhK4%|FD#_/ȗhK4%|FD#_/ȗhK4%|FD#_/ȗhK4%|FD#_/ȗhK4%|FD#_/ȗhK4%|FD#_/ȗhK4%|FD#_/ȗhK4%|FD#_/ȗhK4%|FD#_/ȗhK4%|FD#_/ȗhK4%|FD#_/ȗhK4%|FD#_/ȗhK4%|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I|I l/ T:>#\VZ/0ҩ962/i)TXF>I:\XNb^~?ۓLF*,?c|eT,,d:gdV႞\j etfSz97HFQ,2* j-LSL;zXH 0=4u1 VXhf.XНMwgl2㨡.[t2juSlΒk/.6ogg1K3K#%fqDz%3|1Z̦sF4Lude~#]n1Md>d#Dgs=IfSa6Fٴi\/òb!c.zٜڰf:{"l~Ym?3tv0`L²9o UHbc.Kjeaf8#%\|\ \֬P/fffflrbHr|D6e4zsEl\sD&9P٨6\\;Y0e 3ٰ059Yaf1f4I\ƽ`s@ f-lpM%R-a`U)-U[[ڔ+vR4+X&5:͘ojF],^%yk1A eӬ7&s <8KCb{D*bpMv4pM^0riַN9Ԫ$ҺҦʙVދ-cMh(96Ȓp1Eiyv}˯ַ*ǁ##*\a}5ł3g*v[*pM] |d&G'sΌaΗ"`r^*loc)#%O:=/\qvcю#ָtڟV\oqq/;Ҥ}uɫ_|ڿڿŶ}|s!N_k~xlރ[os6b=Q>A9?'C?ї]tҗD>?!C!h{Qn|mz/߹_~>pяbȇ>\G|55v 8<޾ȏ3r9Ne[nvD9.Dy辳Xvh/_XD. 'S}cÜļ>1O917ߍgM_.'@@rÿ;y:3zc〞,#=q>l'$ TloP>`97oުl4aPDȏ8~9 z 6_E~_ߜy8L7|ZhMu[kDE$U|4_$=]/9c^|^ymcGKWft 6;$pN}D`T]HC$z>AO7qi3 ~h*0O?W#Yv[*Ǯ5l˺<ד*G];=G߁/] +~^zyO:ȏ_'o`7_fC}%L6BSJ6PD(? @RyM}q,7N_4bNnX[Y9̙P8bYd2"p XMпyr8 mSbQj'~Erhnyf^,(8 K~y* Xhcmup>bJj)El38ڶfMΩ'űm º|Ylۘ6AYώ7)Pn焉&1oļ#efEPfPOP~<1FcS~̏dblXn_(:mz M&[;RymKMF[[Bboc%S ϳlcR[ckbPu15@_8ȦoVymN6'A{f~ E9Pu?mu}諨+mC6]t/ufk|=~Vm,/b틡z.6@_.~d^ikK6=. ޗk2upL e].*A nq >o\v/R>IwF/yFLciF*/)a~96p_65dz;y$ \Rh-S @8f8a5z+15-$RGdU7jΆUsqEK~[l[>ľEVKCP.^C?Q+~\{؛15w~6Qw㻋? [oK̥Q٦Ѹ85G ˙89~^_SFsɬ"APdt{UAC'o.oh&ѓ!I?=IWߜlI%VttKVgyK|5=φu74J4v'vK|&̫o/ƽXRM `Kj/ %3_17=y3n>FMqckzb=[S:Ѓ(Ǐ:~ ֦6c u75:%%kUA]+wu;opiT|M#-h hB^cK.!1h~QM `Kj/ [:3:Wxfwi֒M#|&V X32TqPP u1~n| w_Q<++(ѭ_[/=_yUkxĥ; _]^-1*w? .wwXc6:`da<[g_9tѾ u̠,O(A9θ~sE[#3~Ta`ckmJ"A{_W4&v׻;jonK'xɟN$@^) +F{9ژUI-)AU&}a&BMOjP7M]u7>whhĦaGfX?M^po 8/FK.`dB '5|}rقMw>ʙ@ @˧>f8HWGj3iai8(8µ&aJ p~ ɗϸ/4&F>"#kEs,8nr݉(Dc۽ɧɧkK>ljyԠW_g-wѷmpiAF~p A]@A1ǐnP >|B> ]|*mb-d aꪀot't}qeݦq4dQ(nK p= >J>NJ@AMԠ8L]{|{;cLp 9C@۝ȇQ2]+9|O(;OSɧt塸 a+a' U_w=/;߷c?ti[l@Xv;,YyCd{O|F>L#jceDj5 O ^zKou|'6|! Y" b8b=E)* @POJbQtwX#alE6<\88PPg}kOӓ%q[,\ / ˈϷ狐(pn("-DjcDj5 ۳:ϴ_Cߴ?4ڻզχkߙ/ o |֧""(;%sv.kc=Ejk7.]Ԩ(.ַ~'ΜҨϦ82q%$|WO*|7JҢI6~k a{V?2tg 4*iu? Źx= +bʈM/l|rcbb2"a#G_g>'>y]]?w'&vv ⵕ? _ApG0ȇȇȇjÇI&AÞչJ>q}C^9ҥQM#?oBDr0lGp.@R<泶.^>ƃn%J>|Xkm0$s?Zpس:>{ȓK׸4iP*9>A'^W'A\e(|Z+VaQ |5dhaey_лc٥u%F>nN TG ;$\X_K|\vPr_7PʙMo7!ϋϋӢIK8-kcXjk .$(O|`YXwu~ڥD' b\%F:%8$|+0NX㐚F# <?y`u_}Ood"0IC KK_lPM_"~U(W_V&&a== ѡ 潗>)=m@"Ԫ7ȇ*[d.0Ux/CXmJ&AX|t{V K}MӏWmi 8?pd!x%u@)aqPB E+a.lRµvRkչoMGM[E_}φ\wS4O-Zh oV 2OU4ES(W_"|` IM#{B0Zunx˶藜YvOfrɿ`@@~'^'(9~~?|E*^LB>F,5|覮wU _y.d\l]=*o/9度?Qb{93E*_|RJ~0uuBFf/==%Tff!pKN0!V1}}렒O_"|UxoVZM0{Ll1"$4!Yp<ߢXZY_pF"zUxDo L#!h{M͒iMݥ#6q,>'.P V@>:6'oGEߊF>"vU4i*$s/;Yy[R$ɯiUkmpT&sNi(oGaODUhE s+xkFRH`ss:_wU:uBʛNyO(>W3Py-זn||yz V([`n VjRJ~~0T(W>{ސ{m!F~tl|xT.ŽĎ V)[w-[#qRI~~gUm ?\ɽx;mpoDGZE@9ȏoA!D7~M`oU Vy7ۍ._e-LĮǿo;=ZriTjiýkUOpC>8q 7U Vu*EjYO~U V)[`oUzgJ*mRõ+QP\mhhW\?ԯno5 y@;|{> V*E&U5anϪ l/owz/C.r6| ,U,n7 ,@'C϶}|F>UzJ*e$s?upس*?ۮk{73Zgi(D^[q|8K㈂| |#U V)[7fU &a ’{/Dy֟};\L$ ("].@>#F*wf^߬뛥V hao^xg?B{r*WED"pe*"qF*{f"xUz}Z#oZM0=#C/{Ou#o|~F{,BXȢ|fH"PDZ7 -WUU)W |ޤϽPw,:_z∿Ǐ\ȥўF>[?w-ÌX oס|Ϸ{O^"zUUyDoVZM0=ɾi{yGν ےmX` 8Ew+'%d!w%G= +[`p^׬RįJ*ER/k&p)G T}mK|].=/?#|'O {,|ф(9}_v)W_"|UU)W75+5|SW|=s]wi/4qEB%s.%B>ߗ]z}J*ERįZ#oZM O2[sqitݒ>/z58ƻD"}J.U۽QJ*E8j#XjP76sW1;3۫| 3]_iW |vТxMs;tKUѯTU)W_^xkFRH`~~0ZuVF.yRO.ifѭd~3O)[ V|ī)Rxì2FoV)W_"|UUjYjP M]ǣK;vs߷ٍÇ!p9WHtwdU1R'V#o[F#Ѫ3yǭCv#^fKQ3M+9- /{O*{qY^2^Jj5 L˅'?RxJ୿h.FlA E$FD!? _a{k5xnVZM0C=ǧn\L߾G9t6&_Qg1ħ4}+]#>nvcJqBXm0$s?$pس*.Y<޿~{/J$!0\m0Iȏ|⍥L_`o5 uEjB_8?'}|{8'T|1@W֡ Oa)\EO4 ([`o5z}FY Ƴy%|Oܘ׻Ojwit"̟(! Š6#$Է$wqQ7.)\`p^QFEj ]kR[Kp?w^w}oy٥|Mu~ p%Gߕ^׬QDFmڸJMQkF NiSɛSw?gQ3ť,'J|.<(_A>,^g=5zFEjQįFZ楶rOzۿcnFl8Au1Pn8Ogn%](W_"~5j$Wj5 ”Ym9wmzOE]M m'QWcwCẁ](W_"~5(W_A%s?6#On$YF A?r#%U"|5(W^i$0r?uxkgnۢw}='_u݁h .:Us#_*|wr>^QDFEjѫEɇEjÇI *չuG|U~i\+-U~J#tn 9}(8(W^G6j|RJ~VoΜtzɱK|M#P~_ O =z8opUv`o^Q#jIM#hUQu'տzħaFL F|`Urˆ"lr0nb፤a,w /]{+D`4_:|QvE G>\5qR/ޫdVP0Fsk̭Q07VZM vC/on}znniaŁC$C |uaܭQpFY7k5-aYmt>G=򜷭 n:7u0i8r_(^l:OwkܭQpFoZYjP 4–~wy=^F#6|6HD+s`⋱#r0 ([3kqa5"fi$0RF7ZU`tE!:pW}s.<\ O}}\ aˬC< .oF{k#i! &5|5} =W~zǺuiT?0Р|S2a ?M@#3G(7#xX@j /]k?i*KDZX HJu9^%#9#tjRH`^w*0Zu֝x޿zq?|~BٛA!ww9a0( # ގPv#F{'\>KEJzGoPpv# a$s;9!94c ex,̒ikԦg4igX,b4t4K"+,-fɜ3[Xb.8pKX21Ē9Y%P c@3Yb76,],g㠗:KXҩ'Yb#,YD` KGt Kbv/;,7XZ X<'`6{_"`t ln0SFe/ o+V=c(t5K @2S\|m*Nl0yy.7rŁP1gBөLїYi l&0ʜñٞdBjXo|1؄!NWR)#)zR WD*6BFPȘZcpi1`T!5((7tw6&31̑L'P:U$YNf|IY\m gb530ӝ3VCɌeEm7e!l2WL'{\Wgs=IfYSlpYkiT_Uz,ӅTo:sq4fB=L}C&FK>\srÃy #L&{'7*$_1_5tB.Ō/4˚,.UHe3I6B1m$dv0f\!7W,ټ։s\6I7a4îA:jE`ӸH#φYd܃Q̙ӣ 6}P7HNױF`PKQ־ \;ewv! sl4\27BxN[63M0v}yEY<\2Λ8K؉(4P,)h`rF&p{se2nCs{*aDJkL|I l&ϴȦf_] sNl [˰1w%;@38匡$k)YΘ`3g>7z^F>ٗtK|` J3FWf' k}}SsW#THȩP:{]Ҽ02$s>foʕnP{[ɞaZ+4;v> ӮB*j(h.3-m_}ͶGm1~m&WUlr\&WUlr\&WUlrU\&WUmrU\&WUmrU\&Wlr5\&Wlr5\&Wlr#6܈Mn&7b5?gŦ幡+/=V+oygM%2. Õwi5eyFB[uu$)1oU(NKچip^W{ jܵ \}kqeS$Wݶ{tm xilZmaXtcccݏdNFGW[tۼ۞vs[.ҹ-kH <#.b%FlG*P{*Zv]tͺl[scU=~Sy9|`ȍaL%c_p]twS.Dži%~I޷_}CO 7ů_C;mr{%]O,\xz)xiz-ȩϣG6ajlQ9'qk6mܼ*Qt+e>Nf`A#WHRYKBH(!ӍX! .ᐴ1Lade4/data/woangers.rda0000644000176200001440000000563112576021756014335 0ustar liggesusersKl$GgpA"%3p0XApi{쁞Iϴ7C!!!H $$p A0Z(!ZYDQ6 PU~^իWj[/=dYV*?Pʕ:]nÈ'|Ve|lt=]-+(ixt<ELOk>@6yq4YQTȒ9 :k"hڿ$ٚuii4Y#w9b::9" xs)|)7mG?O(2G/MIi{Eٽ,θj&)Y>ؒ1_mjDAǤRM$(bʳy1}IN*=~IqTcNwMI4yqt>6*(bU>:icz\ˬ/b_0<>BYTT3y+`QDMu<䳈/H.|Q_rVD#_M|ј*l4ˊ8?rQYOIj[|ML sh.ǥ%4J+&ACצT^սTub{ǑH+~EWu\+ZLb5p-tکQ_C 9G٦堾lC%nb\cחrUEEm*/uXhG8lK TE ڬ5t"d h$[+-/C" H-]>ޯh)*gAy}pQX.y`\P ug]"<-WtP2INRĺ5V޻hX |]F;Rb3DZX'jRvk>z¥}r:,_a9[v{ѓ鍘?>vˏ&N|Gl}X//<Tyn!‡SD9rG\.ٟw^yvQ?:ֳ/yk RCNkT`ֹyӀI9ٝuSdzȯ}MV 8m8?{sPu<Ik`=dYU?e!J(u>tyZ'T !"Ջ=yvݜ$?zz-/j?vT? Cno.\x?/yA]]xݏsXO}/х{O[GW^գ_<_Gߝ?s7.^=w~cyݛڅrWA7ooVs~O}輁؅_3x11"APc;j ans4?~q'gݟ}t?&>?螚Vѧȕ.jF;<|0ade4/data/monde84.rda0000644000176200001440000000205012576021756013756 0ustar liggesusersmM[U_gf2)XЅP0֪$fN:q&ɤN5}n>3 ѝ ~Kŏv!n mQAJq#…+=}s9&S_jmZ5eMei2Yam{eMl̬d>oXeSUG֟W {]w5@xo~г|$/`M ?$躈y+64{—~o%]:,|$Wеw#}xȣ}xx7x8>NV x$OXj?Nc)L࣠3p2W7dȨ ޛ3ޟ[C('I][}(<3H+0[sB: 3qikSG1xnw63P`³{|:5)^ۈh>0:O|Vd|x^xo zxZ^S4ooup ཫ>q+~ߔ=~r&Ⱥ̳6HoS8zv`^F_sl5}ٞC#<=h7;닅|tw.Dvms۵}dž/] o숂Wn $Y⾢yWG$H)fTIG}0Yv<3ѿade4/data/carni70.rda0000644000176200001440000000371012576021756013747 0ustar liggesusers mWMn 7`ol!"XhF4 ; #:=3z&g!pDQr#Gr@")AA"{Uu;5z?ןoyk'=ZqӉ0m={ >}s$:Ktx+I*-MK1-e6Q({xnJfG^Wrx3k.h@y#k"{^?%j_c?UߩRM3 F/k9]&ڱ\f)m"21Yrw!ļ+b& =b F_RgA2if*Bm+eyp S}8zM 0R3g3Q,3̝=#$L{GnUbte  y2~0\2FHնLL'`PGdF<; `1GSuARQ).&{=߁d\hcb.< F><](F;8@3`iض-S5 &\6>{{{r2>1W>K=Br }kbԁƦ4=W!}yU"b9 z~-ŋobbA9нЋcp1 ]L.W*/rjѬtR@l}2t.s[yЀҙ.Zp2STOy/*!Dc$>D>nx8{l)<b. 3b$y&qM9֊ǖs&j*3gQfDI@St+ߔ5qVgy=²<")=gf1xs :Y;Nط9 ]6'q,ڔ0?N1yNmSEG9xf1wN|y0OUKSZ^[f11{+uVaR3Q?* NK4S\Kk~TVs29Mp,蠸@g&0q2S-S瀙 3- G΅GY',:Gy̔\vvDL9A 1Lljh{&6ΔRLW  -[+D~U*Qs#s9s99K7JMJh%kE*,Ϯrdz8B1k>|sss[.4x4n:qd2}wZvnIt۔3ġ4[w'eH6$C69i`=4rL1mPYbfɴh1M1Ea|gO$9rq4mn.1wIRv,`4=⺖]e{aXfwXfOK'|whuO$L6ڎ0eg8.hUļ usVMV6A70Iz'HqCGpC3yj]D~̸4G)|qoRN)>"[EnwH|K36 234D0m,P0,+\`$!ҍ$5\]'ISa\h{ P, xiye3&|zm %` e)w,VLEtZYY.2!a4m<`9#M2Yƻ 3);{&l0h'kenۤ.w%FEf&'n#OyaV%˽c"as%,K . KE( 1}vbeW?٧}Zjb(r_cl>`n> RK6˸?j  -}JҋxO)4к)G;uyn'W|5quxnԐ)'KjfoIy7N)5! (g!o@=S Fs,yCHb7Zo6݂&m[ފ3q=\[O9+9*0j}߮䋡WJ`}YaCc*Vޖ~h_)w.w3-C|]r= Lx߉'~ ҿ>)B U~TZ"[ Hq6mB=dyo|uvA~*&UW'A4 ȯ)אaꛈt1~kBF"TnC{Uuѿ cW@msSˡrZ0½ϝXrq;`s/Bo]9U׵.ܻ*юAjLحPuvC>M/fw*o U0.mpCǏAЯ7:tI_'k0))ۜu+Uh\eiw|el |1[SNnaPл!և (/Sk^1cPν|ʸ3^(?)hP=ctB5v[ -\42Wd.~&7@?,RvkrɿOwqꃒYF[OIs?|վ؀=RމMpGӏ3I?,?v%`~R~&k~ -?_<>.^-7X@3)Oۭsu_Lu]t%e'q~ߐ#L 00T} PY\#"d-/f 5gQS/t'YI鐖 Z=mXr#A*o$(P•ŸǯoHkseҀ  tčNHQfW wuP.0h-b%8\]X+EE ۡ:p5\#x@&@) P;HG@+P-P (i _@(5@ZMA@h!_6 TMnG2__A/\2ǠR.jrXAo:NC0;ʒP#"'MvSV" V䖒ϐ$xLIBrjade4/data/rhone.rda0000644000176200001440000000412512576021756013620 0ustar liggesusers Kl\Wǯ) 4ibTDƞ՝'8ԯ&Nz3=w27MIe ` HDHݔ XU+Q***TT{Z%F>|mfZWͺq~%?N ''#pQ8!zzՇ ЧONAO1S/sۯrnȋ-8Qcs9_vQO`Gz%+ѷf1N>?>~؏~ yaGOͧqǠG;=Ǚ' ^Q Ǚ/i?^_w@}IOSaꗾkϿG'~݉G'ӿ{ܟ_jݢ25uzF+omJaiw6C֏kG_~-?ɞNBwBU=c&_;fM~8X72+Ýq埂e~a9y5bJ" ;sgMy"'˺~y ǍZb p{9k׃1o=ws5Ck{d޻B$ghSOsκֹ݅\#~;<7b~|bW:Sguݣw6&= -=bEDǬ/oWˏc)ޏU/Oj?R<VTGѻ_c{~_tK]l~=˟h=Wq`غj]U J[ Pk%ՇGQ1WB5&ď?EUl6_ږ QJD5f鯭jDj$ŶJR B$/;JP,\6jT58ƀʾ۶zl+i[)국>귭c5`[GHZI#i}$>GHZ)#e}>RGHY)#qo4{ 3 |{cP+][3ụW"*_D_`z%KlzpF\` ZT9`Tɣ::3w8롍o/Ep|7&~^$ΛYEoܷkث7c(:u9$sĦo.籯(=8Mj~gEDq<`P^",px卽`uAوTQ8o1댯.ઋ˳ƎU獜~|iwIDٿBi3zhҁsċ<:S0zNKʇ:U3^0so7󾩟(~Nn5m7a1\מ:\^j>,W^[%-}PT%s}4rJ6oXade4/data/meaudret.rda0000644000176200001440000000253712576021756014320 0ustar liggesusersWMlENݤZ'%m!'E*RQڛx%{w?q \8܊PBP$nF= JJQQQ`Njn~oޛ7ݝY9}apiZFf2Z&\rZӁªg2)5-HwJƄƤB@Ӡ/'}@]潨&FbyFLk!1]yз@pU_]l@6ELz$]h|,cѡ?ˤ۔#4^Gx$&Y~s6?Gr* ? ;nrO8Γ!aQ Qƀ8_hs\߆m˰'9zZ7F?WS1(pt^2BgC}祫[WS3rKq޿vpLߊ~(?a zo/B8=:8'<:~Rw>!ƺ?A}^~(ُ_XlE)npRCuO|l0}DiC;o6\_;MwJBՙ'~i󊐿h8Ŀa5WèԙOaPe^x <9i9?#?'"v?lC6lC6l2ɖILe-lVۖ3?+sԶr%v: Nϑw=^0, †Me\O)v}H=,ZV>wBp3ܜ!2Ȉw(9 9B>5^xg ¦hJ. ;蘫Q?1WqI8B +JdWVU(dw8]o@O*q~a썛ng8&vS>vٷ8R?=ˆom֗6#>ׂy7'}Σ 7i A0>'xGBu! '"=/G|Lwf~Iɸya' ^eełk|(l7> |Ay|7_|(z~>&z6OJs8t?B~ߥ"g'5Lx~}Jsx%okrWviyE^@~'Yֶ8n6ϴ8z|sm҆vn ܯ׵bBU񵝮qyA^m? m2NO Nq|zlj?Yu7.U[֏r? |^ͫqKOuJIO'yl_ƭ/W?ګ4qK꾵g|Ee\#>a)zD'xGvAZmnnk& E֏y.cn]-Wħe.YZM\q5WEyYu5UW>*Ruuu~̇9[K7M{ʼ1БsKq\+o! w]O?, /gT^.zo͗OXYat^%ɇȈWE(3gY|*#:_7_s_ܗ{+nJ_~\͗~`|>O~6`#kc ~*6s#}8yn3}ĺ-n}pW S%~c=Y{ug/㳔?wA 3%tLg0x l/+mUj71~5"|(W[|AUylg;y֑O_֋2> |~尀jk=S{^֝ye=[?':ci*\\Yhh?7]Fל|}xGK[f݃݃8:=Bpw&ZV4u9mzs2>Uet)-h }y ӝ=^LkĿ.tkgw^m`\HA z/UEN%lzVnvr{{oJ^B8jnsÑӭC#ztgk{{w{{2;9:–z3nc8Qlpk}p4@ G;nGj%_n<<ڇQ2E˝8lgk`jEWZu(L;BW&r_6Pet3 ]*rm&Lj(V%>ת'FWI=7Zus+_&kI ~yݨ V/Lb/YѼ(T:uzSjOy}% bit^*q(z$rM 3zI]Cխ~έ'M'̰4ڕ| 6}߲eNLl:V W/:1kRI2͡` q`npXTIL7s 3~θR>1wuOTm̝mLt%Jhm5ؘ;K\#79`J5~(c D,~Юulszgߢy콩ó/!-# 'MQnheky;z.2TFWVWɌzҖo$vԍ3HRfM֦|rn1l<'Pi[1wb?}8eQtZa,D^J vYms,Mo*tn,c740zF8p ^V*~ҒB@O4IK| jԞPn[Liݸ6E GHFN[()ʨ4||,:ѣ%5?jW[gIC'cs03@C[Q0-٩|uZVSq|s[nmqw[7NݺFzBc 8[BFKx2^47hQҧޡ䦛MQ[)At]BW%:~$A&ȵ+7r1iܾ<w}9dt&RnN "L9rG}oo${&R tjAv5]l(CC1rE RA~!xTVix,׀ ;EߎMͰä@RtKl]7κ0zR3Cu {:rwí9pf&fL1E]C fU~wV2]rvm(@t&߳b+=q_떉q_V8q{N'|̐%*34w2#. "F n=@t-l32z Q Hv]{08wa 0U!&g9yC4%/Q5c-jjB|9$ ]I Β"^ 'KUnؾMD_rAl+hWiWтe-PtZyH w1%:5K aLC[Pzi5!MUkOR'&X,u HʀGrv NP<+yեE#[8 .2+p,   \p@HV^ f2dB|%\"Ƒ@t+!guu72o yCzdlCAPY摅l |kB#GK:Q+:1ϋ6#{MJYypKsR\Hib!l2FHG3[/b,SxGDKMwU0jHY{l!ȰwHe ?:A@N)9F` d1^l0OOL > 0Y-.tI>GvO4e(=سԦrpMlcH)E w*O rq _PEĎPo7` Imaz^ƀnwWRg Xz+ӳk|iCE9"fؘk 5 vit+(A T(s*m)@ 94T)Z̀2qJ]1-'K`!{UHc2/JuU̢XW Yڒd )JZ2 !M=O %}?4%j# "NiLцTDM[ f 4/e}jyp Hx\KIDBBKѩTqXDYp3 4d`PY!>A^I]u6u$yLp-Gyn@m6IaP5-x_IHè:dO'_ =iHF|Ɂ#l+s$ hLո:v-5>¸%{įQ2@WK=9ʩ,L R {_jo`KVY2UOɤ<'pB 95?{Tt+l IS[&JHgPjM.~rR~>AVygJԤH#W(ԇf3~4~k,T0?'NԃI!A&E^H!~2ɝhtXOg1sAI>IG p]kQoPSAL:^!oF~x+םyTq, ,قit|*(󓪹Kڪ +y:ZAt#8-~*iܭ|#e#I;-CA? xQ}w*FX|qÙT܍Dmx#vG:>V dkZydzI9*~gVn#v>'ӓ>Wh S3gn 7 ^3A 8.רQ~RA&~E%gbkz=Qc9)= m IeGQ!DzR &8nf+baHZwbxRw j^6[oB'z^W*ŠxF,ňY4_K7O/ w%y="ޒM:Y0cfxU}B1]Vxoڢf)o @1")2 QCZ*=O-vkRBi`3oVѷb\"pa qv yeM)%,{T>$2#cK/eN Sީ Iԍ(9E-pyEKuIp ;blz_9M]&i|M9Yx7;zdQh]v廘c)6³Mt9NhD{7? ]ӭ#S/~|0 ;2WQ{?W7VOè]YpԞ\Y>{[o ؙMv!pa6NR!%>0 ,b<0*ade4/data/olympic.rda0000644000176200001440000000256512576021756014167 0ustar liggesusers uVmh[UMWƢhu6MݺcgKܴ1fEq*~I;?&cRQ7DjQd0&Q"f{؈=}4#CW4i_nqky橣}UӚtb D`:{ŻWC럜<,{lws}{IKЏٻ?D`-~|'<-[GmЯ-t?m{ 1Euyqпt?l^[0(&_*үʇU>Uvj+_;6Jksv_!N3s,Eo)7Y'O?zhxqOW->^G?+~~sin 1w,s1_|r"9}{ȍ>/0D؏m΅6ºp>"ӈCF]DkuGXH|\sO^2(#ƼxO |saY4/{~?8ain~tz"bE}buq. 2O)~W3vwo6G.ְ/5N}&/yqzr`Wr݊Gu(|kމ!@q.{H{Ey/r~F8ɭwȺho9>b syߙ!ͳo!ag**SiŜY|_+ab~*]*i-*ޏj @ߺ kˏ8UG[c.c+amM"(askux<\/k[v5: 2y>L>ߺ|~ƶ̖NB+:͉x▙)[q)OK>ޜHsus:&JOH9\h[D߬ܔ!/]R-)Q\= %%ԧ~%Rn% (I0C0C0C0C0CH*I#|836|l4'D5xiډW556+1^+GN\!ƈ!7 &.Olj?Z&K|8A/_&?_ f>'̚Yk/=Jen\%iAade4/data/julliot.rda0000644000176200001440000002152212576021756014167 0ustar liggesusersyGq @cBHB0R---} KXq c!a5{ __uO'*H'HGZwQ?#Gt:+Vu:׆S6/n)_tVHu^C7cΊ7>oXm3%<'=V>'͡|Ȍ08c\}y9Fk~>MM5 Ϗ46]3<ƏN:+ۦ:G3xso<7ufc|W~d~E^oNj0k:iڑ ~NwmkR\I[k6ՙT{~Or/qP=/֝iyqI\o3Z?sfX'ƈH? 3"3Q9|~ܙacS~y=yӃۗ/xΥٗ~dW.o\ ?yys7/˛7~l;^ܾp٭ݺ|KOlom^>W7v6n?s>7O_7jsg{ksϞܬ!qgG/^[㛊O^x8'vMvvg's zq 7\q1jc׭zl-_oV[u S0u S0u S0u S0u S0u [ǰu [ǰu [ǰu [ǰu [ǰu Wpu Wpu Wpu Wpu Wpu _u _u _u _u _uQ1:FQ(EcuQ1u~_1u~_1u~cP1uAcP1uAcP1uacX1uacX1uaviشl:6=}6lGzDGzDG ,,,,,,,,,,<<<<<<<<<<тHt:R.NeASz5Vǫjn5jtVh5ZWjƓثF[-緜r~׉:x2yg]sxǜsy}mso>|Ǩ[( +wF3qkqecY,+e#n.+e#c\V$jߍW:{ȴ`5Z Ip$&. nHpcܜ`=KKpK[419_5=?3<7fk<}fkىc,ecY,:+M2.79.79.79|%I%&%&%&\d4ɸ";&|>;Upg_>kV>iX>,Y>,^>wqìqجqqY'i߿f}?[>}}whVU?XVoUY^UZ><|}j1vakR=իr%q_=e{g㞯ǽ$ZAh D+V Zh}'Zh}'Zh} 6 ڀh 6 ڀh 6 ڐhC 6$ڐhC 6$ڐhhAK ZbĠ%-1hAK ZbĠ%-1hAK ZbĠ%-1hAK ZbĠ%-1hAK ZbĠ%-1hAK ZbĠ%-1hAK ZbĠ%-1hAK ZbĠ%-1hAK ZbĠ%-1hAK ZbĠ%-1hAK ZbĠ%-1hAK ZbĠ%-1hAK ZbXĢ%-hEK,ZbXĢ%-hEK,ZbXĢ%-hEK,ZbXĢ%-hEK,ZbXĢ%-hEK,ZbXĢ%-hEK,ZbXĢ%-hEK,ZbXĢ%-hEK,ZbXĢ%-hEK,ZbXĢ%-hEK,ZbXĢ%-hEK,ZbXĢ%-hEK,ZbXĢ%-hCKZ8ġ%-qhCKZ8ġ%-qhCKZ8ġ%-qhCKZ8ġ%-qhCKZ8ġ%-qhCKZ8ġ%-qhCKZ8ġ%-qhCKZ8ġ%-qhCKZ8ġ%-qhCKZ8ġ%-qhCKZ8ġ%-qhCKZ8ġ%-qhCKZxģ%-hGK}>y=8!a[](Lʩ1)9Q{TV6;R6wtaNoo<~uM{ zFю<߁PM>ߙ$ț.7GL^>pM?||ô|$`xd{wPxLj96uif^>p%1c'V[2ӪA@WEJȭQǣ}oNiP2TA1'{c49ҧiz^4m4YK @I~@:v H^yK ?@ [wH^ o@M й ԬguBĬ%P_TH+cJ\j̼@bVh@F 4'A ԰}EĬ%P49ho&P3n/YC":;y~ jj+2ePCcnWN "0HC:6N5fP3nP "0(`Pss.iN jfTR 1+4Ts1odfPCnϔY}B׌r3w{KĬ PS235{LĬ PGtwu8NE jf_-t\IY"}R4=0jJZ̊ %492{et8%|f5վ+i1+ dΑAbHu|>7j_Ǖ 2] ŕw j-=:y\=8@ǕAj\[h͠f?:q%-fE`Q؊AMۣs3t\IY&}\k ҙV:Ŭ P͸ԴE:7PǥBұ76INF:.4P>)͵&4j|@#bjibǞ\4^?:sӨzJbj (6梑hǴN7 4q-f//蹾sШ=#zJ,bjibKsm:;N4H%FFbo.5Nw 4q-F*qi-`Q84PŎ hԴ;;ߟ:H%Fر7bQ[x4PŎ hԴ;;>H%F]i-bg7qސKl%.G154T4zsӈ{;c{;\b+:h4T@FizZ/vv|qnGSt\bK#mFu[ŞMzh;vG954Tco&jڋF͂>h[L@#F7UǏ^4bh;FQL@# UFM{s h4P>!͵^4bh;FQL@# UFM{sh;FQN@# UFwWǏ^4bh;FQL@# U\[N#/h4PŎ hԽ2:~bvG`w4FC4 hd*1jӈ h;%vG15{iTtШ̛F{g}{<@#h;%vG154TץЋF,_ vG(;hd(6Q^4bh;FQL@# U\[M#h;%vG154Tco.5N#/h4PŎ hԴ;7;h4PŎ hԴ;;X;QbwS#HC+͵^4bh;FQL@# Ul#͵^4h;QbwS#hF7Ҫ^4bh;FQL^qmFu-b*f|vG`w4Fرwb-bgvG`w4Jbj4 sm;;X;QbwS#HC;6N̵^4h;QbwS#HC4zӈ h;%vG154Tc\[L#bw-vG(F*vlk i,9F:.4P>)͵^4bh;ZVQL@# U4zsh;ZVQL@ņ߉ЋF,_-vG*;KAWxiԸ{VA8;Zh4P^B/vv|aw-vG(FQ@FM{ӈ h;Z%vG154TKsm;7;Zh4PŎ hԴ;;X;ZUbwS#HC;6Q^4h;ZUbwS#HC;6Q^4bh;ZVQL@# U4zӈ h;Z%vG154T4zsh;ZVQL@ņ\4Jzӈ h;Z%vG15{i4O-bϪ+l|vGbwFر7N5N#/h42 h~sXu8NN#/h4PŎ hԴ;7;Zh4P>!͵^4bh;ZVQL@# UFM{sh;ZVQN@# UFwWǏ^4bh;ZVQL@# U\[N#/h4PIsm;7;Zh4*QlE#S$iU;>F,_-vG*;C^y<*żyԸX5N+,wt~G);x.Mn:Sb|S#mGuxڲg)ox|t8G(F⑆zvll }y a}tX룘GFbd[h#V0xH!M@:H154Գcp.5# =>H)F⑆zvlţy,9G:HH:|rj$ig&.?;?XAz|WS#(Ql Az%>H154ԳcdߟG =>HJ|bj$ig&H Gٱ xb#V0| H

)Mvy  G=i#|Az%>H15 x'&H)F⑆zqi#|Az%>H154Գ&H154ԳdߟG` =>H+Axm.?;;Az| H<*&b+ȋw_|ʣdY,t H

*Mvy,9G:H<2 xt4g+>dPS#HC=vi#|>dPS#HC=4g+>dPS#HC=Ni#|>dეS#HC=i#V0|>d)F⑆zIi#V0|>d)F⑆zvOdY, H<*&|$ x0<O|*|& |h6 8x' 8T:vʜ~%`' ds)r_ x&do|+۝݀|?? Q~Ӏ< U~ۀ> S׀= WgĽCS}6.mnl5%v*Ν9){+hkwixg걱sf#U0?wiade4/data/atya.rda0000644000176200001440000000361012576021756013441 0ustar liggesusersZLU==IIo(YC3}w*%l6?\Vneb5rڨPsi\ZS7˖$YjӾ}\;{Ȭq{=~{{GEȦ(Jbk'B*qpZ\:#Œh*TBʾk}9ˉӹ?&w\J}>F^>|ߝ3WɆSхKǒ⻊i'<z9~ɲ(;^'%GOzZ>w(V{<jW7wT=g:"-޳gO7` o\%57Wy|4@F<{w3ږ˩}7W\~iϿ51C_[zz^֫Em5a T4SnmMMWhl}'πHӱ}8NKN37rm\wcwuw0ָq6T~YW{T; OPסOD=ih[pԢ09z CX}^ee8˟Dg ?ߜ/g<.?a=1L|ڐ<':A/ qE8)x9@N—Y6_#hao/܌x=>b_څ}Y vApo`@r `Qɜa'L< ^.ޯu#=yzt9γhphyPјAdKCT/+C35Cg{? 5 ?Qyn@gzNa\X!#^|$8q#iv8pKH8bd/z"+ej*9@DЋR:۠;fUy=߬ǚ$JjßtfҪ h-Z"Ty yY@Fs:". 9)<9;7q-b] B2L`p6d 2\ i 3\0aC;Ca&, @-s:2|Ry&rLg* Ce~MCa G2?bE(o}Wb~WD?rwe~.4?; )!bC՛0 !/z}MSvjkuz*Д@StA'Q?& U_lODQB6K76gYBE?WxL)/Y)omLfia$]Y]I.itjcѪb΍SIc1;b![)~>(Vo YRgdr{'38̖:S")pJ׉՚-޽EC;ئ 8KQҾʍ7>:wX½]v΢PQ(-dFG eo`":Q>l68̉u\"vd%u鸏$t1bTبf(Iu M`G?:gVӯ(HgRSXŁg ݹI5~\Kh7&t'Bxlɏz킛gxw̬JV{fpb'0)7M'5S%\Ö}VUb W:-=*$fA#A \cB^S͊OU2 㦍. Ǥb1,Mi[M[pƃɔ೅ Ȱbl)xa`rRѪj!Y@-s#v.ѦIJkdžk:,JqAw\DjWVWϮoA;)KN&İlk&\(.##lSJ@TwL^v-V *K-: U5Z) ade4/data/hdpg.rda0000644000176200001440000126317412576021756013443 0ustar liggesusersBZh91AY&SY͗ }1H@@aPKn:wZ'.ۢջLw"-n7nRC]V)Wr1Gc޴{۝uʴnWdT)۫7\1.v o%E޻o2u+Om!E+@݂]hͻWe3݀uGAMõ^^z۹t*TQ): 7s]:m^94V[D1ە[qp:o9p.yw{/|ߒȼz5+m}s84|n5kqK֖jr'wݜr8UχW_,NSyǖ}.e͗XUDױݺ(4\y,MtauS΄ԥ,>H}qOow>sOvYrCפ6꓾Ea ob WU/"1ӽm](#r3{ƴ.L/ʢLuw^F>^ĎNE_W=yGxK漋UA}ruBw%0?wW]vD"s2WVg8&[έGqcˏve{+"EBj|kVfKg_y8/agoW~Zvk?Qud.n0G~o H2M#ڲ}w(#ɏf8ɘ7.GldQ6f.5|]CǯFc-Epy}b}x;W6 \{/HZѮ"ᐽ|mzy(G'w8_.{|mǖC߹=};gZ7;zb&k1'];d$qs1tVoz;ZVokh4 >3wo7)o|\Au5=,o;$ !gZk_,{H'{f`D!|M?Oڧr>?M^i<խ^ PqNT(ܴߣX2Ebk#2o lӭ4Vp]kLoPr@'ArKmqݬ}z $/@60ܐk%7!"4YZ)5yzo~]ɡ@XHY`^J|w}blm.]/39G&eȲ1Gˏ†ڷ§`-dtrӑ"]˷w只ZTkQLIR*E Iz->Ǯf)aJjgТ*)Q(+>MzT$TQI4%,H'JtHH}g2 ofJXQvFY!'n,.ȝ{ONclntN'^ p̯^IudiZ/j#$db"/*/(14_%WeJ$2%b9"דyDR"%(nJ?ߠ纻f>'!BcCSԠh'[14XccHc+ KX2û~GQc/^@v_[8BFV׾f6ܪ}vOҋUҮя&E=1*6Mor1F}Hmɞ=ݒp3P:ZTm(%8֭i`'1QW%';Z]1qD&:PT [iHݯ%h^<6Ko˱&*"h;g<*AT˰HZ>e]Le2VYej4#YnWPUA2L!<.iz(URI*'gۣ.rv²Ye;S7 K]B&skhW [CBu/<ĚW3D (^bwb4A<n5=x )i 'l?  i`VtL$ś:OO_0;1 rb wWZNClW ֑5RQkVi B}(EGOˎ 4:Xtb7;]}/>Vq.g@=rӄ1$k_Z۸`"E D'_\F2>|1hϓnҦ_2jszH,UCeMk%cW=mnn~5XfNA|Hf?CیȎ{ggUQVoU틡'8dтv*~jIZԭG-BzoemRww4'ؘ#^"=xV$0 j&z`RHMrR2d<ԙ!YHT*N)XdXC0*L~~g6ձm#Cx{I0›npi5t3]aH%E@&&x*t'yĵKNw6G2x klc+ *c>1),RO2)NmdIzb+u +Ȍ\#\rQs)Jb^9 i|(WIfhʜ閟rïOR}cH4 ?+mCjZnyyBJL=CME3]>p&2FR Yu9OV G'J13Zni54PaRO  1Af.B(xg.om%)0Bg'1yX1ʢd}=.'3t(:LʕmEe<+aL:dB ,Kl}hD`M0\\=v(4V[NJ.ې.4:|1>> 6b\:kHj&>c# QZRٶu;:ؐ% J XF.5RXs3!_."o3AGew:. )b:3XSS̰n`؎{El6ݏ^Rxz'Fb6 KX5/$W.E0y:a ^|e}lߝ/MX 6j *_|6`\ [cbuv,W1) ,D :?pU#O}#C95y˄u& 'qzkBaq14> }G؜xDӉŕFff:M4LHڧη/Ĵ7b- 'v q+:pYAea4rUXjg+ŀ*gDE+ȼdEڍ}G1/CBv8H$(r8 yG_]ʱJ7!p,Z#gy`ՅlNslǫ)]QfvlFci_}<~aGEqY+baȲeIZ) ХWæSN&{="W*52g"uUHJ ғ5NICǻsfiw*s V\$[l !el 36g5N%} *pMRL1lF\g&|hN6_cV`viXY maV(1WuzrVp[vN{S$-T`$WdlY#k1b#NQW4]- |,"$/3jtnH^P&;cخ'= {ȷb͆d矗Εs":]*ۓSc F5xC1~((]Oj+{R Ld-7>;|iZ+FX݉R)? ۿ\WzrYYƳfi9 M$BهR;!Rt; /VT)0vySԡ<T@AH@ulUْ \{Оa+zd(cɵ汶-{=[F-#cMHP>2ttZ1b[9iտRC(r, ϳ߽F,}MG-$1(Bi"ǑBO+!XC2hyfg:i_HVf!gjs XcykҼ6[|kI G(ԕ w![p|TtjQ7S_|[_FHx[} K «²B@kK>u @1O"XWF܅pbq9 .z(^Z\3vJ**IY' )"'9 Y'xghS TX|~',bkǯκ ʹó^Rv().?$WsazZȦJBvpc0b&$^;'ol&J04Gj1Lyc<~`1mҗ<{ݻ4ꅘ4ĉ$_%X:_r[+W6\?m(55*JPθ_*G\*[V{jHAWtA6K=|roT}e!T?- cs}oXv!R4 MaBBs병Sәd $h ;+i}阨d̢Oz+#o!QOowTB6bZ!(s8k{$iߟ=,TZO%_ 4o]c׋_cg6sieds[uo!z \M \ )E)?5LLI Ǿ$VRJ3y./bDu1Z+Ɓ]*tŶ PhSŋ0"o3᎞?{Z5F5-TX(z?{QP#0CڻXv,8eLݝWR٩Y{gD듵INx/=wi (rfv^Čtl'= R(z=k7dD}rf8:`볬,4!7,Y}lXEΤ{}\oRVvIKP ĬZZ%>Gݩ/,t<71axv!ȶZ͌ʿdMr&Im^`̅{kZϺ_|ӊL B1=g*}dpas/PQE_;g?z|TY-kZO\[̖"9ڞHDHI!H!"**X8g/OrH-{R ¹b3ApLHIy۲*\^'vKsiu4&Qmm[b=o}9.qFs$Q\1P5w8$&Picۍ?|{#bY-QС3~}Tz%Յ8 X3^?"x~jq{[Ԝzo.9YZhL!/ ]G;U/̖Q D!P~S0ߗ-=7%("t[N(f&[zRRΨ֝s8uHKKfv%j[aCZj  xuq %{w^c/ )ŕ+ RB**5l_XGm}.k0U}fXMx d5(L=‰̥}RA74HF HNU|]dm!W\L5\ ld*}g,1/MSP eV La3+"{I"kƄS%d*kW϶s>5+vb>JiFmNݍ陳w$ֵo6io.KGg;ZUP#8ڥj!*z4>Ӓ'S/=o%(&$6h#G}mtt <%'2ޮչp4woxǎ@USoѕU HJHen^!٫Z0!' &DW'tVt Q:u<j|Z_vO-NdRLWƻf>_/60B770 ԣ5̉UDF'5]rFYhbQQDQ?[2} /vzEb'DZZ9c#>qfV#Fg>m.uH}ٛyƼZ(*f*c-Ξ" W>J\i˴׌VhV}Ea(w\`X:TupdNlYt9߿wyyLj:OUj26iAS'|bu>%a[,[/h':,e Qd'nC[&8ڝfұ/ݱJZnMGz4z˥6!Ƕ!;K=DRDz5V\G;gcIJt_s\.6im0ɟRLm =bS_D?i Eix9g%.}mTb0ͪz. 13d-[$i'2:&DNJiU/R(gfhcSZ{tՐ#C <:f4/ȺK/봼ν! d%X{Gnt'tco;,<+#]hF YZZBB39$  1TuL|ﯪ!Dj9b㽩K,cOkSrEnCABq_?bWCl }J_lyZj͗L!_%2-u$ȥXhǻY*$GBtq9oqoELflfV^}IF JXR{-1Rs%'RT-)B=[i%DžbaXcN:}ϥ_-5v:Uٞ:_BtT$Yڎb<-WoZ"d[ٸt4}x'|I7B*IC`y6-Z%ѻJNky2R%xA9)3ž۽y!͍:uyJ<@lIݟaz,c?{ʼnAX)22:T|R^-Ż<u?{†BzTOfد^t%֏툝&8x knaT#WsN蝃:iL4MbcϺAL.m-[h=ih$JIlbS;ֽOcIg4 IAY̕IgP[1W*R OmQ^wyuk5iP8y]Rl[oa, ]Nlb'/}Q W k"܆E_sv;fZ *`6܈Hg =:K'UW╥}dJvQw!)iBzw<:3K5l,dqO>w۫;"MdIvk B5Bdgkʼny.֌/^lI՜R3migY՚%fIgei|<ץKYpg6 ۺu՝ Ma"/H$ 0<x_V;%M˄i՘&LN3ጶujzcZs'y]ᵊL}KjsIcJNs4f%@'x-"%Q3dRHxQ{U,LJRy~P vCOnd c6|Xn&'lŰz_M4[ JQIIږ(6G zX\J5cT"oΆ2y:_)1kw?O𚬠&63dfX(6QPW}yl;}m5pU9i,"$9l' +l|{41.&ֻ_utbuݱΩ ]]Ya/}nl[ճzһmM*:k1ʙoע+0V5erR{qF:ҁi=8pȅx iL#`,p׊"41yKliJ[""[q:Ա:Ԉu,C[`L9%n4r뮇_w}rmMY['+[Vo'2gqC8nN CzffK'$s` *T2Z2pWs}:ᙋME`tq)5%m `]]-k\_yfl:|Ϻm mt4f7W&a1IhOSX^uց<}bw>Mj68&B'k^nSws_O?\&-njhi% cpjRZYķ# `GxQ`AbH0: `уⳕU~q̧'{-L;ݵ-fѼ=G #dO(;-e۴A0q]xs5X5,Ezf('N:-`p+c꤬3ѱȢd3t@LX&iQ\ا6MJQB7nzmH6obyKŝǝs+:0Q,n0k*]^fzv%qe- s:*:7ݯufs쏘Dz{dTff0-إD*Kub^s͇S& R[  ysΗqn=ݯ5meFMD \ݳ1ݏu%_?x~ -n;K<}B9JY?t5*!E3aOĕ<{5a3F=a~lF۵ V W>D&>H$ebm*(BQ5Q%iXv ҀK{i3\k+WtK\1hMTJ6>ALl9_ BŘn̳eq"@,5D϶F~߄?In.27*18qM;:Ѩ7qy!ԁ#zQD<uЬaj5xEou&+D*[ `|ދNSKz" ga$|CRwj?7f=^%щ7Uv."PZffɄW uT:k+,,Ț#cwߢl nVNc_Y >ٯ]ͭM_=w= sxm"nC [1nJqLp )|NJ~9L/<>(`.(맩 T@?62lorX܉A&1t߇˟~VWƗO (hQq oѯo#fݪE+=&ÚϹ6=Ņ_*KKFώi69jT&&Yh 6U̳me͵_)v.-n11y)SqL@2iQopR3]OY\}>Ѹ9}t͢K`B79bͯٔ owK kЖaVQ?٘kQ)6 1$)z~ٟd'2xI<뉀r%!Z%[KK8gzzy>11l*Q'LR*RR GO"w{\`LȄpVX>ؕ:znˮe!@ _! 4&ոr4XP5t^? CKvb ]`j:%|69/j׉[q \ڄMeFyUcAcG>n?KB+焅4 ݉Wq,А'&ɑ6B8ނ Nb# %IMo"wj۵$#slC(TZ=v&O޸Jᒞ[3Jbߝ ?geuVZ m LGKr)kiݶm?j}݁wws km?<w&iHȤc-\ܳqqr>ΧKK]q9e$o"rF,!9GeZyO{{Ê}v̀ԣE _!)4VZy/uK!Ä巚ݎn&mm&e_l!e -vioPs:Otf&ᅬD\ (1+$Dh2LYH0eJ|س$~Q(F2%Xx?߿̒)CȪ&Z_b`iDʦuK,JQu:&^fW8P'A؞/[Fqh7k, 5ܖ_xJ] <'?KK (\oL>dXPPGsO|.яHHdlئ,$q\,})Ltr&chƧ2=ʢ 8OQ R"@qޢF~*xYy?~2(QM,)nGw@tS)@:P)6v7c"G3Knbu^f}8ޣU*) z néfˬ{ )+%/Hc WP%pf6FN0*|3.e5t{HVsW @!)r ̚-BlS+.P4_e)oX.T`#!FĈ6Y7=ۭM?| =Ujy^6΄`ձ(=RЄ9(,v,@r)@+c!_o“9tAnT.1G;a~3&Ru\lcmY4Bhm1Z"vfȣg-b=~ h$m3>Ͼ-6+i%=hk ,dv:%i'Зe7vA^SzPS_1.e'ם.LJ>j5,*7wC"7mh+OᅨWqF_W4v"2vKUNqmg͑e\vLyś&I_LH 5hɉ\iyK"$u6TlIecEELi3ĥϒ@ZAkxlyE Gl*BPkS\FA`+BYw|I*yKApJ |!_vݛ dmlČm_F`|6;[SƩZBVL*fĴAO%q Q zɊkvE9}]Ϥ_l0SwhLPKW.:l߭ٓ=ҵKN^RdLut1 yJxԏЏe'$P_^d{.R+לlWp]]23 tY&+`HÌCzRؽBϮSӟ#zb uƍ3e*I)ivT6\g$j2NN<:eU.7EeτՋp '46;5XPv(~Y"c6eS28.LBś&ƪ v ( U`+[ÇPphM A Q#>(ۮ!, NOynVC R'w9E5: <#^j7 N iVEB"/DG䱬xs-"`bZkξXim|)6](mnoh\B2' o*c_.!5mgϊehjZX p-X,ZݚA= URq]|]I<2_|VJNcsb+h𻴥1}j{cn%rSM&7 6; ɾtybjONg4٭.5W$G 'B#77FP=b]N`׸+ft_ZZzt㵎:8Rψ8!Mcp?֋].D5T"3RoSЁ68НėכּezuvrRpdW\@11̅Ь)d] +,'RH'yq0/-ROk}E.3[k:wtxJFFrQrPF& PT`9-A#kD 㜋6!SA~`!5%|9N$LZ:iKǵ>1-Vq )V5nFP~޴ 5iFM JJKK-Ui׫yzBg||!3U1fĔ*@>a.hN:G35ݗ4-iB,8X$b/xF>箶)S_tVtG"n }Kzh$#'kUʧTJE5sVqB&J2qRVv,l8aGb^k3Vz NUgYizLJfYn ܞZ^Y qA\f5 Dx-ekFu&aKTړbێ[uݶPΫz\v\?hj?tgn&O_??/"hiApAc 1ݹ jN!%)ŗuicAdx4[#{(בu΄/j=icehf;siJn1 J(+2A!ʉj)G5#5a'13-ֳGKU2ØSs"VC^6[.VM( 8A-VqgX kO'Waǜ5ٮznR}nbk; Fm3Dq#㪾0zvNFeNU=Fլ1tcmkYMݟugם 27,0* ְa!N)|K#Nf5Tc@Pi~_$/ Aw9&a? JkuzٶwKgz[lxBnz^g[K,#m)ۖ뵱c 6q(r$S{iw$HVr|-S '( x\ZQj./u2/Y!w0DrC2$|Αd{ղs[IjTLl I|;^dr3ϳM-,(÷;s=7o~7N ta(9q8v\ s5XWb8fM+][f=Ɔzb[("2B)9XmnV,^qԑnwǻ⻙-xzdӹe)( )5Hc1{sI̱bgJ+%]t*:S=R];I{QiYFᛶܵ Ty!NXE1i\쓡wL]it)Nݡ-*_ޥQko8ϔrvԺXI_i7[o/2l;ӧf>n{o3o&suA8/-g{=B^؀@%[o\=yTLFet/EL$JRJ-\`-#?<Ag%Q<_daa#v}Ϝwu4nW㻟O.+*<3 N)Q;ƮR|0*ϱulOOP;,ş~z`4:tp4@Epkᅲ>uk%ݎpMb^W3=Maj*?ߟ=Yb^Uu#H~Fia 0{$-/0ͫl#Qj$)EvPȎ[SB`?<9e܂-&ZM#mD+\2&^Zŋ9`͵vd|p~C m\YwI$Iap4+6Y** C]U%NZH!DT&4klQhLZm{q0xw:RARD[{_.LLqrs@"I1dC(2c@L.==#"y:LV<BFnJ֓!dDXd_n?UB9INDTT1Ut3$r\98aT0F)<|L>3/3VJC&HV3+' +JfUb(ur]{]h)* zvޖoXbzf@[fMݶ6%, J\cF|rX|o-jV"̒ lf{ZPurVJ3 X_Os繴.Ss7"Fkݔlϰ*J4_uc!ԥG?nr(HŞw\Ov騱͋)F,l^;%uڝql1FEۺK☛qdf^yG#XKI^?+o>[*L$ &A[jMaL*eebk{:"{ K+0,hzV| T9?(n.dt5}_!2 f&T&Z<{ @`@B|s!!0J_ª?us2r HB֤w b`_SjwB4A*./s\ƹ PsBH~QK\V}Ɛ}@%j◓J_2.2,`H,!Ws&h ?]'I`[h}fuű %T %$M3lhUjY67v"|n9sNrے)4vΑ2"2qo}bIx.U󔼺܀D:^u5S"7Eȫ1[M,TDMޡ/wڿh D* LlbΩ5!rEwsi$N/Jj`ܻlAKؖ ak) Xh4%s1bY,![p8Cm[NDn6zJzyH^͵klQfF֍d3c| E1` M\갋4*4+Q%biXjg264IsO~pؓ~×^5x$]v1?5QGJՄG9ّҝ Jd[zBAzZYG(蚆DFIVIJEP+Bˆ"rW2jQ*\(Qz9VSR{ۙ W}X{Ȣ"#1IKTC{4D!cn҄hK{%Cj)MLኤfv+ ەYV;- qK81 S`Z 56֚ps5-'_ٺK)v  0tzwω@d_B%fw@?O׎.2߻{ Ȳ2!u,kp͋_L`|[J*]R͏X)Wrk3FrSgm%mh`ߣ \e9-b.I*߾mhߓ̶ؔ[J]HM*UY%>ea؈b{e[N1f.)n~%u~[m^z/ipB @Xbj\s@#}Pɖ[ߖj8e@$):jx]Jt+:@Uc6'RBGqp.ƕ˷l. [&q测5%k'7 ]dŷ}UP/uLx2ReuSh"T[ӦVZk)C:JV3]meae36O:CiǦQu&َ0` FkexeX367#Ul3gn $ջ-Ԙm{[̲ͣ6ݥW,٧ؤvI*{ҘrLUz<03;g'v"1a$%Ԃ f.md-C4IP1cѓ L=2J-\}ڥ"ͅ)j#[I= F_FTk7߭ߕToݍCqcL%v'c@>,@Q]e @e.[ORPϥWYjt d7"}` >(QEsi^&)εѳV7%E-+b|tw5ot6n?CPX˩[їg蒒XWQygln(: X4Out\(W/R^{7"Mp'Y'x^!)Le#اt')>CsS-Qm=}MJ J6[dӐf@#B1! qau39|;XXB9Ŏ;F㜼^@|$~VjD:CkGiو QfkDYD)'(&S#"DS "" *zt/viBm9OCDd#Cu@٬@P`,TXVz UT{^%v!,ƻ؝ӕ?1&FAF ̡G3Ml-[VE*U£ʉ\J<)>m"#Ȼt:&bdDz7|uf"yxbԘ[`Q\#N%ADyYH>QĎPsMa5CvQ9m;1eJcS8{y9BI'+FHLXQ #XRlbY$2S\?y%Ippu{)JxIܯنZŔ .7 4˞TZXЃ8%j8LM,VFv39֕bִdrKmk<ܲYHk½{Qm.e3&!f 5붹vڰVc _wѽ֏j9DNw|>jSh(:Z"\Q} I39;!'ˢy# W24AnF,Nli&Tzщ]Ouʒ-R/53=Rtr<ؖ0" y E%\y4yWAOWl(%\k\3†4D@<؍HHddGd^l"U夙VRj|"T=ae%+^&GmIa[lnI64Xs#l]KǛo0ɡǷO\F_qgk_BH~QOUzH]v)!)5kr:*$k (Zma˔]湭t33!R!0[qٛl5ҺYMͮ ~ICG!Tϯd.jm*Zdn z8 _X.5{džH^L FyT!پv`Hk,nm.DRms%“0_&uUԆ;{17Hm-cFݒyTA3dbcP*8Q{2 ϭBWE¼搎EQ̯[dwp@;`E JQl.C=#Bze3fkvYyRF]i`i{kIsGig1míWh.-.RK:lDBH9Zɝt-]jlݏ:3z*)|}W"12#ɴT*TSQm_>IqHM[!m(D1l3s->7/{U5#Igf6Yy64&ۤ)QGDX,&p-:!fڈS]{wg3Yo>oY^L7"%ll)6 )Ԋ-|nw ĤVޗ)>$լ.i͙LV-B9K̏zh}c]n )_;9]qGvvѧ]1k蛵UJ^]$n V! x˙d2%^A}KJτS$Bi!O .ima(I&)HatH?ËimBg99fx!!j<) Ŵ-66GnfҒR1bDޓ~V9' 2I>/e5lIMPm(>B/kv{jlf-V0x:ijgkKwm-kdS{RdBKH `9m[*bV H\mYMbj2>] vwx|O!mr-z!:$@OMw'DHDQkzȣ-gF̢'9sgq,EO.뤆QUJ;;bomy9}"auWeaTW3mmdiܸq3oDԼPFuV$!iKSj|z-ӄy9m/TGv;єyE^sqFEKZ2rUkp3wwyraac5іtk[UNΎT&0HņT \hRSB`3JgjM _@,Lx+Wie쐍bU1m6V_]3ogxsh2*4TYe.P3LbT.,Ds$T԰ęym!)U&}|ep 6&.m=[mF.F( ֧q:U5FK쫬+6acqa} 7#\mn8Ivu9|WSI:Ր%GI҉bn*Q*HB-UB$Vd^AEhF< L^/N\ =/.^ 蘕jI5EDz9ZS7YLTFZmb }m}}I9d6XhcU;2}EkgYKQqlT" luδ 4c_;݅YUQb"mM^]]H\,s:ZW8bm(91+\eT*M"P5|UO+[m- &Q1M)flr[wi 9r6!RӢbRW7Z͒2l)YE?֭uGT|&v$Yq1ηbh۠\\7zݒIk3_Z!Amzs5֌,n ̵u 0snm)(i-u"Fj+Ho% 5BZ$]qje޶]Jb\[\8M%%6b.֚3:><0k,q-aXb-_=EQm#026&컇_ $A3*QWl(9Auۗ]fXbNZ_r?:hL &ZL(w $katP@42&IG')GKnB*PѱPk) 4b)/>]O:f ֽʳ\*CJ}zdQ+u(L=R2X.BZMhR%{gzah"PV&3!tƀ M!$בJ[ yxZp`rd)LFN1d%*7Ifnn`KǖkVD&ܨ3*I<-l;:2f"F%z2>uD%DZ] G>t")[f-#OqtqiKX[61kK5j)B]qO[o6,u |J4/{N59*l !$9cmXI3%Q)\JO2C͆e%)iiO\q0oJ3}ݧJ eb3|Q b&!s/BxFLMQ:u0qz*!5(]}B[bRŘQ-{a.bG!D]և?ޙzwwD#Q5~-G&n$lwv WVųEA3b5fp=& #-9ь D͜C[r5*4h RFSH.a1料^ Ξw.1M&Ҙ`O$"Hʮ%uAb!줭%jմ-*'1TלE.`fPfE{ǜg i)"w\}|b\ u#P|ҞIhS9_]ӅDyx 2^k8O.c_L9-n)d)8:ܚ"*K1uDS =Qz2nu-fav,)p]([IbGH&oy[tԩ\2궫{C 7fQmvo^MwYEras;N՞$/ pVJBK۫}gދZ$1Z3tW* }YW/91mE}`Mm ˵*Bq$OHUyFbQn=Ϲc!h 1)0 [7_JiUp? ,@1nbQ-BL3 `LK+wő_)1yu5Z $L4\lR*V-VңV3]6SɫZTj]hF[4̱Z4 C0TJT5h, ±u.2kӻ~nOTgy}6)%i}zT۞QH#y [O>k#D C4̦2̻LlD*ZL9e8+;\>*M%%(JQjDE]!j"TMɱ,V 5cA#+s`'01x !$0,)e7)KmҎ,JcaL-nbeh$ϬLHs6RKf*Zt8#Ui FCdlf0C얛}IOѶrY,e+^l(S5 SoZz%3"(1e6h=wS/jw5}Q"ꞌP*.O)%9h=V="zxPks)Vw^݆l>;!0RUaFP ڰOdJZ0E>sќ'cّc^>=F>/Q(u =Is1HZomްd=pΙhOd$TBiʄ!1t*P1)ܑo?{]u=uvtPji@ D_ev`˫mb˥3L^G{k"~EϻൟkI ̹BR[m& eF6͹ akPkʘDu etڵLJae5L:ꭶL蘉?i^T^urYQؿ|aL 7^M +$F޽yYDsRyצ8y4Ѷ )&PmY]0;bs fڷLlr3AmDM`dLK*&&!$fgݺ2wWjwF{..Gd9qi[{QrH-qC8ρ$FBzEeY+LXNF.t&5u  .K) wpDH1D) 3NWDrAwnM&.q@\@=J*!|5ؕ.j޷#\E9'+SɺWFL2e _-SՉ3yz5KN^czsЄ"¡%}#݋l정=*s^^QO W^W´Q-5]FIQJՋTvfI|ͩBXR. l]"j_};z(|0khƮ'bwG3z\RJ-q筧x< sQF'MMł[]lȜno|lD[u*qFՙJ$2/a>(cT>u 0 bZ0%K!eu1:Hl:n9)sVmACx E٫׸v?'? ͣk5TYeQ؆,L=r7MJ9zx^UfkX4),(<ܳ$MDeĢkmkeS#:0[kz 3iZb6]ڗĒ@Zƴ晗i4z.ZiD]^)Q8wne˶TFyJ^eD|U$"mBGi{b !Ysg1)$ؔZfI_i([oj-nIv,-^& ?]ku=\1#xIu2 &Ñ58*_zTAp3]+:R;4ڌQd$R OP߻yq嚭|SV$֢5)d<.bCjF4ljXdd!?CJ ڮΝ72y,T-'K 5>Gյr*1cfgsj\Ye0ͦ%[Db5W|6wn/%jmy٘wQᨘO[ץ1![~jZIW]u}b**+WK\s̛5 tL|6P󵹮EyscѨ ym[HwrRJH*+*s`(M2\GtWpW6Qr`"PlE Ϻ5c&JfLhJ4%! dCr \sWywu\pU+sQICk4lUלŸi$" a$R\2 =:;PV(yAHJI~,`a)~🝵IJb+cb˽eE'I8Y֜BF莐0d)t,ˮƬh'nbvy)-zR 9mf۸86 Z6ަdVL6;MկS)߾o}w@'ҫUfJ.m{ۡތl"nxWe盽3|D%t/ 20HJ.ve꧅$)XaSR+W+BQ={JjZ\/$)*07;lEX#}Y0# vvK5ҦöP|lm1ywuͳئm8 o{66kf^qCN-j) v1[saM5,%do:MȗI'VTE XdYݺ& dž>ݵ>F#KpX>F2k$: _Jܒa ,T-CIMljjF~~*v$YsBe3 'CAZE贑Fz6cuq9UE*KTUlɵ eT<`OmZPƼ[Gq` धXS6kj&B [fw @kuǮv"1&ɬG$ckmn4ww>L}I!)$R_|&UK6։'i ąOQA`+bmA QX4Tm$*Hɒk{Z4[(EnTISR̘;q"aIį I9ߝgmyZ"Ƕ5 zE6H&dߤ;uKhTy yUO^fV>%HJ!Pٵ*.vʔLKGXL#eVQS;XYcm5@\]`Jve&&S54(waMmG;NU";XJR[;|WVPU?l~ɰcMjWFNB;8!$,ĉH*/([SesG3b3BVGHi)(R42 l4[V}nEcsjYUI ׮GZ6 ߍNt 0n_ tOr(FfxbEd jT*Y&EET_0Rϝ&Ɉ+Pe$d$[} $^92{ڏ3i= 7ǚka:K]hthC92Jũ uU hj޷=#䔱blw;=<='eHEDԏYݕJ'S9J<5SdAQ.U&U۔{'wsf[\k9I*K+~^s\!_UJ/݇^Zt(H'ue\Df`J\A5w.ۺ% i0b}e`\ИKDǯt%#Ͳ?RC\7.Dv`ԯ*{,I-*R'"ץ]Û7io(4ir[$8mBǙ WC@X/#x9Yh9ƥ훢W)|ŕ'yZD^jNXL@AMjA.|2HM;4Wz'`__OwR*:+|y~L! 4,F@옶2&]bڐ֢%t@0zfej![pB]xDY" %Cn߁#u>|F#+O,&??fͶfzl91&D)Ɔ1$i"$(e dwj}mC"ԍ}s|>ﻪy!u[+qgw^:[(@-H|Q)-s)jC 1OБ ԙl7KFRBBR L3/zR8at٨4Ӯ,iN%Bl>D[3C~ W v0O5xmKw$ }$ syVѴ/ ̟/WP8p_,i7̣DH+ziq(e$m)̱ǷFuX| %!%Yբf\7E/JjMJ"2 Q5)6#a^&#-Yg}^DR`"+&bXPI<1WTIšH!I`E7B*zJZ*c7P Vj*ĄsIe~b)DU~Qa]Ky)3ߘɓ4$)&<$4%GsY.gрE~mePN65F ˮ0z˕V$gc_/q[#2 H_7"ӝAǯ]8f)3/+3\b~~O"Itu\EGmƚI[byyHFuddѱ&z"ډ$=Rbx)URT;j>lY9KFJF+UcF={E[80m>رs+JLDhnQ_+%/7(!]wQwH ,;0¤ O'W! ZX9kEV[:FnU&Q'bT]h"lm |J'S ;\SXj!r.d;EDXE^:BT&FrxG$dH ˊQ@"^zha'9խ&TP>)c' (aZ DUO$7ֈ]ljyyʋ B + Fk^:*y>{RK ! mrwh9wG]bBH~[cՊχ@/D%Ol[B%1gy660#:=KG[,R,Ciq3J[,޸0 UCՖE`'1YB FvM&;8'6ZgkLJU+$yrCg05kna2X*,]6J M^I Z.a!q*fsΉ-lٱGd/x `B}$8$RZV6{DhsKpӣr"9YPmEEAѴTL밣IAomtr+Jxݻ 4Ǜa?V~ukѸݺ׊t+LXSeǒ݇}bE`N9TJ4Ir ֫1;"i# hd0|u>|>bH2z'0ԅ(KͶ -:h-!!?_`ͳ&ֱu T .nMd2ƚ\j:SkT4d* hIyJEyAR\߷eG |B՚]5 v-r˷I*UmEo..=KWo]#bƼmcok 0|:@-ҘfS1^μ'u\D@zF-/V_CUr@/!*A]jYuS9JyfmL.ֆgZ7m;Ru3IuLػ#rNpmȵiypGnLRrK.{X1/&5Rvy7lh=s2zųiaCBaqF3(d1;U ! :672̫65Qq$P{6sl)|ͿjlI ߟ?;EgsL(5ƥ;65cZ܃1}03r+փ"hibUTVFGz.9̍Y!W$vbh$aD/@#\s*Ҕ <2gi ˢ*\!ŠHΣD&C[VrluE&^xh(9MO;/KW}i0bVnRT\_g_1g+S픫'$t[_?!B-U|U4K̡y]FͦF$ 6*e6jv->]Jk5 06]Ǭli?wK<;[)Wh<]v'&Cg~j |Z6b/vy^-?MY`\R⹋'|&6{lI+̩ ڍEdzy_-=uWMvaۊvj[+(%\j ^Mc@b*C$+!$R&da^&kDW]72%]-]z96c.y|@yU t=\fi*$=NBi 5R]Ӭ9Ժ.76ȧ h*,%H{m7QJׯKht} Gm<qULڶW[;;mZc2C.Y%I2m\DrR/t쀲I YmV,a[!N!OHH(DDH?ZTc I!2X*0*D2ϨTH qD,w|w DFȋ{Dn^ffyUvzzyyh&a)aPt#JLʋU3@{(ezsk5Ȫ٪_w3#XZIˣRNrJXӗdARQzc֐ݻ*H>|F2*)*e\1HIW_H0b_YDbԠy (/42b80y2sQ;ІRxtżRɲTCH|rGeMGG6YR63(ujڍخ_6_\:C)h-ul Vv]!NՓ9F)Dyj(ٶR ѫ$3NFC %7w!#cbdk,.NtīgfBWDthVn[TXwۭݓS&& ^p2FKO+!9]+9a_pN񍍊$hbINl{yzcfl&Qhŵ4[wjkEhEHaI4".cm(m-Lm4ELR֬-ijUdѮ*ז-y6('_tGvL eAtS \L/O۵]>]zWTKYybFi.%J:9UVTQa&AZbzU{jlT6g5,AYh6{TӝsimQf.c˒';.PzءenbMj* +|mZQY#X*LmmKj25Y_ӰZ0Зmm3#k6gMm^/pFLQdsjOR1VM$+2C'ւ  R|g]5|ϛW|5[{lڪ]k:2l3SVt5 ` R?ksVմcnqcYQ+k͠+jN'bjm6]rl$~VlpzR Stv$p噵U5c:EuZi|^ו]sute#ZcZ{-r5˖ naL !I*yݼm˓-"hқ,jW^fDw]^wq&BY Y݈mBgpD$B]G]+)ssN֣Fѥ2LEow Ce4 Ǜ%W5Q%` ɴi1md +EXJ۴mLb|:#jFb@**F"WXrVtkZ (b%]("X&Vhߺ۠j(*'eIp\vʖO~4bI[W.DT`fa `=xj JXL|/1ZZU 9IJh:U:C[We&F5(G0T )4ԬViRZZTMR 4hbjB2B/S0pǼ|,fd͛3Oc>\'2M!QUڭfN+4]c,33#ɔ,Ie"6, &h_7Uj.AQ!dB<$"ئMIhIkZ/kɊKhk__fN,!?}Bq0qUf `",nnFd&mlkjD")HЅXZw RmRh[M'PlnwKsB@)EܢO4)mC b6&*6[2694 t$̼$RnUB0)uDIRS+%0!X2AIGBe'YRzh[K֦h5_5;, cLs5XFҰQ:HCc=*m-dw{-U(6 J[lXOUs?&2_-^9u{75Zommͬ;3,LֶX#"k2(I%HY &utBm`e:؍V U\󺭶ܩRfHb[++3oyU`*,"%V6[WսE1AQ7OX1Rڤ|ɰ6yښk&7)`4E=D XɔZQFcEB#[I1rS1b#FB?M 5 !1ۚnNE[mε64U*Z]$j74gu .:~bdM19{-syk^V1chuTDnn]XvKsMDThc"m1j"Ƃ"vb!Um7k)lZKD$K;mnKAecvڙIhد%Z&]ە_A$a ɅߞS y;%)٥wtYici5-SI22cUbMmTj)ѵ(MK=Qj*6Y54JSjL5[UHũ!Y5QT-QUe*2Foo޸ǃCR?iKB>|{)|oYfmZl+5fjY t)nֻڪz KqT+4&5wmد 6߭W5d9;5| ~5mɢƿ)SrmgnͫkC Dְ** ]^JU^^ThjF96Q;=3F",]a쁽XhHɔכTbdi5EVj4n2A1I! BQDi+3Dnv趻M"[jQ~-lJ5hMV4lPh,%d&j2Wxڌ_}צBBʷ gn('O7yJ]**Bпf^J#"fku٣ GJCսM#$ZIł'Nڇ~ .ʙ'ȤXWn͹^cWr޾sQ|kضjzum=j^WP3m2)|::uq3i2kO_+j߭ƣV5r:te[.R :~ǞT͵b޽m E!B Lcͯ*ͯ7W`E #&M%Q[-ysWMr5݉ܮݹI !Fl SFJ -BhڈYdJu| E9 \sY-{V[Vw"Ѡ04wVnkFF%mi7/ /7dot6cMcΕrCO" "(Ƶxb-nnZW4VANGsأl h,&Re(%1"Y*ږ!Vj+Jm۱ )э2(;Uͣ(6k&-V2imIյʭWjklRșVnV]]9_BP,mb wL "1%!$Fh$˥w0o_*(7oyRj2]z{r qIw7(*KlޥDA d-Z)mid_p lXl`Wml5A- m%n㮻.Wl.cjv'rXшO2+0 6˵\5;kn^ƼQlT3X&VDכ*4&M)SmnV&шR.m3Sf)ejbmM[+hUnZ6j6ح,VƢbѫ[յ\b8L_iV9[(ڍm}릕擶6v0̙DFHi&bչ[-`L251fƈLf`r+j<-K ܩٲUѢblU6:3Zj1"Emk$_V6}ֹf ;hR\.al0Ҳ!i&+aH2m-d ,VT2DHVe*1`aQL&/\cߗgDpJXv}??￧ SSFȞk,3aEQx):% IU>Y 528ҩrr*)MKm!\*@X]aCTf9"QfisaP T'0 (TeapKw\he+cp^]occQd^zV[lYpO"DC\̺3TIH%]I~ya()![D^VT%dmuؙ<ě)!$V%ov4~t&}[^U]B5:kE[m$>$*f*U]=^mhi'(/"Fj (,F ,*dD$R f̖d!I-LcQ)=i%Mue&Ŷ6^mjSd,VBQm6ƴmA 11&1",d$4E"d`ڙ&fġA R ȓ!K0L@"ŋ2$$2)2P2P"6hRȣViZͯ5EIPFIsTm98qᠶ4WEWwm5..mD0vKjEٚNmV?]5uzYح5riYrҡnrrݹO؏4Ym;ptQZڋEHlch  R$TQFT֦b6[FōVchFu j41$I3,EjKfZ29vB+jD@xoK%[k,AvW+dI`_*ype0'ݶmU!ZM=b۸[UmUڶ[#4Fƶ6j2_vK&Q31C)SH!" $h1$HRXu &MБ3IJ@ɠ`fj{ &JKH4JÔt@j2]+`QO??dMe{,J\A p;MjGn]hٺEUSn `fWkP҂ra\,Km Zvv gY:J(uNnmc1RTA]^p[]uNorNMKu.{qGR ݍtNf+v QTRBjSv-Nˡvim[1J0Y:h6\[X ݝ:^Nӻ;UXX0uw@@R0n4t4t{0!#;:˺kanK;nS.;m գɮ: ݪTͨk嬠Q"[B5Ca1|3),U}}g巭Q|͗{ֻ^w}}{Μh;E&cFfXnF_@w$km5ӥWMw9ֹ=Oc[_FKxӶwwIGA'Emݱ[lU`,K0d`ñz=B@{ym4 fh l4 i@1_wSѣ{ {7ħۀϳ=}o>}-5K;ϫvbhybEk|޽Kns1o뵞9lmu9:^PYw[uHm||%ѷ6hNhzwGln8:u`N@>ɶ@ f o`d m$i-B$* l!!VƠ*M,CEB+Z85`r+k9IH5*hTS@hRaJHI꒒fPBI??dʟTBPL?I3}P<֓12?'6b(. Y,2'N'C *ʘ 1eYIa0pSmS&aʼn&M qo|]B֟_ݾ3_y=!Q|jɓجg~iNy|d~r%<0ϽwywIci7ժ<-riyg}٦嫗&_`$}߸l+ |i^,o-D* )Zؼybv:GU঵٠r&FUcD߲bF>^˗xH;qV`b#+bP3w:h', Z$ZN՟}{سemũsY'%!_>Zؑw4OPGotS Em33WW7XjVv w\!#|`KÿyxjRe6Z:5Ʒ}ğW A{Wy^_&߸udWF^mX2`?<7w'Jo)y`)ő{Fv>Iɇ;ɝ{e0q0Kh.{78l/|4H FՕZdxPͭ4/P}㗘S"=5n BǤ[ Oö?[L/3%U^m{!k2S>D"Wtc$gD 1%ְIߥ*xUORw%.dD`T3 o6w<yj6BHNC,,r,f i Mg8ft] ),˕ f Qb+ Qˈ%FkPRMi2<:cO{Ճ:Ο?G咔n#idwQ֔Oք?&EP*fNeI>'VXr[*aTn־*gpV$.|, Õ?>A+`eF~2ClT{EL)5<.+!ml(*rji܍ x//CmS0±a{g2uS ĕF:LVcȬ[\o_JyL,JbV(@Zjĺ0n;#.YԠ.Zֳ vRM|߮P7'B}lI(B[bKv(]Zcv]/ǣlc9Hr I+$RrBy_RrIȿ~9UjKQ}TP:I #PDi=/vy{Uiҫu/`>xs)S[o{+|zW\)G 14 sZO"5^;ky.q. LM~JA$YckWvGq>DYu+{Pk"1y]lQ8Ձ(VŅ%gE颁̺y(8jw{ebB`hdxoZ;[}0ON~?_gzyPZjQ+W~Th'IФ\}}_>-Jd7UO`ޖ&[VP+/[:ۂⷢo (WпW/ޗM.%Ɓ6ާlI\cbW~^@p¤q~.^< 86~䟯؍l6F_u0Y%x.ϰ= 2[s2O!K upDm+Bb#T"ЫߎĆhl*bL|ADxx-j+ o1BƲ .MdhZ$˷%$lr<81Ѕi* n|0@h,^fg} MJ)9V%'\D K;Y0gu==^?Ds|u{!|ds d-lb,u6u&f«7zد9:Jf_g-Y5Ҿ~5PLġJNCb)ȉUv9uɇB_{&j'T,RWL}BQ-Ʃ1NЁ"Ŷ(2m)rteF՝m_uӽ1%qDi>q͎Fd-E!emmxD/Xb3^w&LN^BU%a|%!wҝ;.s5A9q2D~4 EIj-8VN&п)&.ESdRϿs:TֈגVݴrENrUf59Ff/NGɻʹc2J#Ƶ2UdJWZg&ns포?nnhQSj<@ѥY1zE6ֽuwslo>)k6ܞ}g'ϝ(lImR&P[Bՠ~7Ⱥ?yTR(-e Dgci]i-gC1pNPsefX+GM"MńoI\㍧Һ^K&JK0MQH w[5 _:b6BB^McS/wk> ՞] -x/S4J|,öhzt4$A)Ͻ}l{U/;lOQ + ckI_>wynC9e>zZS[ 5)3 2E0OxH>d}bQTFiҸafB/,Z-K `{16' u%!ۥ&5%aGQ{ 8g ^e[)综+`^nS7FWaOU0cU[-Or(菅9;LGv|dg"T^5m omraBT}>%H4^|C[x`f-$mK0v5I\ӎ4p_X+Mf#˷w95=%0 Yv""1,"ٖxC}) :9$s />h#rCZEk;a"ME8n3͔K=|lx>F1̙ryЄM74U،"Zsz7Q A*oÞ|zy@O > TobݎZJU8M,THTy>LJA/]vvNo [FIb) q Do8\X(4׭ %Bzhپ$_^R9;ʂsb]{,[08y;u|9#r4B#q%`'m5e5z{όbb 0oL]) suքehi_an f_<{gC.W2=<ʱ\lVQj[ uOm*zsb,gj}!Uزmup=yU^ g}@i_{Ԃ<υ_ؔ9C9'ͰL> ~ntLm0o$bYLrM|$I3UO8yYZ/>egך۶En\n )r(-j,[L| KQU'*zr#^>3Ⱥu&O@1ѷ g=cqn:k l%DG*|{+'Ӭ{8+b1N=5ፉDc{FZp3cR^V}wlO~eWhJ)%%(?`ee&NYfn(Qtm֯o ][E-bu3clK|&8"GcC5A8=TݍnGj#]IƉ=:=]←~{(&5M ױ9".ս'ϒʌ{k/-e@ڴ)A;#v3o__K6LgźDYL\ˑ[{,,NF>aԃ<'F׼^)B[H쾈2Ɏ>"Uݭt)%9; p˵>7eQ_ߺsK&'hUSAlt7l[,nak/0o\hT8MSGifTꅈZʥn4o9xI$hNczboR|hx0 Kof!  I`Ϋ'V{||R&׮I3S%C7k{Jkkm'mq@BXX]0m"͸Db̟tA/9&>Ii#}?<&$ ѫ7VaeK zof&#Y-yb$M{2LGCkmԖ(?|C.ƂU?͋17(\xP&ړ\ckJb.ʁj鶚'*eZw+YBEɝvw^AE ^vtUU#LHHU,_qlDFV-Am6q4XV[Jo(5,vCi2NiL+۳00EP(OE9X), :v]1}'bK7;3UA`Z[Iźȴ'[w;Щ"&yQ}t( '6LDm]{#4韫2Y^|B_6fk(b+ĪA5k6=`7vK;6D}~nES_?}|20"BX'Ko{Tu1zc%vK(J5JlhVw\cnG[|BrS&d/}#3(w{v̈́foj_{4dZ%8⍔ՠ2]fS]5N)Z̥mBS eJ݇zdre7rM֠ʦMPQ]|`.A1e[+"e\1w0d-AT_sIyo(5&*P(P4oOr;]u]IWCyH޽;OZ؈kx h>ixVF5a-ӮݶԶb:ۈ`c>9s7"ĤGQ 1o3G :>?+&Txn)fS<$BMg[%(fѱU݆JJI[nԶ| /ХL:1cMta•Ronbȣivv!f\SE aE3m&i_Och\ByrMIHFҢ/&أM 0+}w>Ww>, ']}ܥ'$7 rܶڍ;{Qb˵ɑoAоFT.#_ %^_WzDE^{s[m*=M\!R-hyһdXarNfDI<E;@+bdoD\v,#%C71"_skT3zod_v \|KhEa+1I'V_YsOh#n^oo)$EMҚL_Up&e2(2q>POzW޷X{Z!ճ޽p̈́;2\ֹ,؉\(`Ě0i0Jقwfc=wPV;Ňxֲ>%mS(%/O%s9*V]_MP3aET9ZʬGW吐|>SeUD:?v!X؄\(  c'K1,uIK<+ږG'ܘQM=~v'LhA~л]"V\sWDjv_L*ML# yDU_"Eyb=l d9$Ps{h_*%"7(y4L$ ӻ\wp@GΜi׋6}Tv8!7}{eS] l+T$sqLhZyc-RvX9mnH6 Cb!zRL'CQa<%'6[&E K-7z*V,XaKu*O;ZV' }c"VCn1}Ol,WszJ*Ϗ`@[iYvkS] e7PZj'j9c݋2GB̊F(޹0E( :rXfm2u(b)&PP&c珦hб* Yh3$T ϓ%C4 08V[ǒ(,Vί~ ݌D$7ORfKS2!"E@q/Lbޏ{7LxB|PBJ ͳ毆F툷9xLغݵBgGiDTg0%)9b1hlO | C ()2ȠD H URg>u jEoH/0U*|Ϯl>/N*sɾDb~NH|kyYD*fLTUy+XJay?'>S7zmk;XQ^qc ?Ujp2%9Td! %"u'>"dAMz>g'+>/Hp.)]6 T4ϣSؗG2 ;(QErU/{U%J1Tt/0btOufκSu,D-CA2z,Mj2*-<9~2Mѿ=,Wz!{鈴Wz~wv}֊I Q#^B#ը(f~F\yϗ޴ %aM}4Z`vքzwdx;DF?}{oۋ;y (a!KS֘|Yͦn񣮖WX'Mջn sޕ~!M}5@Z=rnuþU_2MJ l5Ϙ8$`^hD3=e;beH]W+(8NB}whjpޔW% S}|8h[w'ɵC>IYP޲UCQO{c!m^b1L.S.$}vQ;%,IvcZ'EH(q{rfr[sV_hR,dF[g|)e}3ox%;c͙ nȩrgLT;^fSVM v(m7_Jm%ˍkڷ.v7QKB[lk0GJHh9K^8s#%%,8\Md}ׄ[-ENf9a+ͶX`!- "]܁_Ss+E/35&o.=t;Yo:>"CLjl1:8D6j emMK a֣>Ϭk_h4Hк.Lg&YEx&,zƻjOzf]f_l^{ R}-L}3,1u=zФ< {e6nfanڦV)*SfnEzp3x& qMssD][-S5W&q݋56u>]6R7k -}]J,"tgׄl͓Za"Sj@ Y@-ǷampۇaA*|ҙ+hzYNaw ղ9KPc,[R)m}-}o_p)VgIϻMM wlY}oSϚ`%{BO'>wquu;G%2J* %Jѳ}!p̼ǘ֒BRM'{-,kLu{ {>cD:\_6zNTR}޽=7Br>B{ ҜF-&.e>i_Sk!AN_|  fS[s$kUx&|˷kV6iq]hJvC\LS IWXKim& XU2VU(ldT [|> Ϊ|]{)n&K,IAHb; #EjV<󛞍Fz' L/KVdTݥ+"pzleܖaPmj%*}b|y:#z!u91K EYNEN٩<[Z E1& :h˭ư+rKLkA@3v&}>8y:bJkz[CpO2)Jozh_O{HZ,:c%!h8; vfme&:6Q}eG{ Csc~-XCV,DkBwb(lOE1uzB{նY$ naSuvLuRLzوj3$<|ucڍ/ٚ5o__ifSW(yҞPNmگ- pyaYmbvC?1>G7 jY#RG6:Jݑyk/78ɥЉBm9x/O7nsOIψSoIy#9qm+wcuoW>%fWCׅ'DD\[zzP*62}xfњfϷ`k=VY w"쨓Z^V*@ٔ7Dİܥf}KY#ݼ.Z:;)?f9Wuo': aO%{KI̢$}{f)z BH'[YM}F[M6+i2[fv}(3y{pv>L"cΥ29b-Ywfili;M"#YΙBرdTal眕Z֦C^Q'=sj=#^Hu`#㜬=tng֩M0C6ëgȯgmWGST9i\1\YEv[lcs_||p>:mE^"N!' <[ugt%\2q3y+ ?V礟wvm[R|}J'7>C͂{בϙGdt͇B0߭oSØ^s"/YI -aݴ6U|4gu_}5"^Ͽ 4Tn *}z6NGPO'4=}8G^\eS[jB)}=>8Lye`mWNNH!ش!Mn9>/]jәB1&ۯz|'<ơzK}Vo CķF](uż_q˒>Y;Wm=h:fen#`e G]ۜv/'S>.8t>澧Z}Hń}N[ oy>FsRXhEP:*{f[\)GLv{ȲN[~ϭیi%TTϮtv|J .*m3;BlJXeZ~/ݪmT[l)0/Sz›}dYkor./"Ȳec+tإBW$m5G\%tF s(*פ?DKRfGy)מas?[o>q=PBQB|Ճ^=w9p$u&| {|"BRWIYhyhN KW2>ajg'e%0UOa4R~NgzmQM}nkۊߏ=ןڱBbfT9;1F} E˷͙ݺo,G(5xb .h+f+\/5.Xlq8"XL9;|4JE$|Y{lQH4Nw[իg'ץhљV*eъc n{JbM7B ⢯ K TOkp$*s: {cYSiv5F_uشe!cq V]_o;u2RBP$:f 5p}W vJ\@Z`x%N`R#K,F8"Lx- @=TZ=rQ̖_2A Qdfs_=ܷۑiY/&n촠3%X= X)]۶4?dz.^k*r-Gl]]%kY57KPmFKiY5ڝGkJfL4 矩?'᭳SM6UDH1UTu2W"2 q&'.Xqp蕊f]酵qE>M%.ĭGJj25x}w讛xl)x "H-HD4bn C},}"=vkdÀ7gO_ϵ󏯫$/CzQ'sI :ڽ>WtD>5!qű7vD@=m6Dž{F"OE 8ۤϛ}x)n_,;/5oѮ|e,$^SiL5ZfqEǽr2"Z+U{,߄%V*gegٳv+ m׋yn, ӞuA,4UxLt}Op}orNbq1@[nUDA`ְ +3"e=yAf&JӼDN!4c  AaSY h*MaLZH:CMIo,zu}'G?#ayd7xW^e!y w "O&S 3<>1œl>G/3X3Y|R琑h՗nGO>{`SO7o`+.v7sV=9Z1+{p^*3 4z2qx)`&ˌq-8 |jI(܇s:"6AO`D-6'a=q-Ev&<.po&T)w/ ˞ucC,k({s)HU9^c[!5LuEJ^!kmu䆗O.f _} ^-d+N!ΉN$3s/*F@tPwf^rJIk]OwwxX(BWlhVivu\CvͰ g3[y|-MeW?:V(~N ( PfTrc{92=V}9ٷٛ: Z6IJ ^۵g3Zw4|% .i5o!Qu`sjb;p̘ZkNՌ$darj뚉ȋfD-Zw~O*QFJh%@P&'Y{ۻ-ҶWZ$ en kՉГG}3gdJ!yLK>*_UҶ>I(/Ȥ#)u- wzGσ8IPk'^$Du:Nͬx.Xnݾuxq}|$q'2^ &.gn ,{L|-!iwNj0X)GZmlso|.ƍ13iFzʢESϳƞ6px_)Pߣ-!Į mBv`)xuf&Bnk0 p릢r(w]QlL@51\vD树ZS^ U YYšXSH&݀$NnWI${0?[rIʔB1m`pQmV,ƇV)##D. Gzы.iv#)蝔!7mF{"d煒q]6K![CSe[)iJHYוK Di A~o)e!*ש,FNL,>q6et8E[~vC&8~~Azx][==}Yb݉ӠpkuysI|ʉI}ތ]&(RL6Q ijGÞ=VCWϳ;S2yPV%-VjSB;ZH^qp1b)䇹|K78Y(2*GD9K7l|5Լuzg6OB6eȝرU6s;!sSrw{SkCو,ܢXUPT0MHU+yMq<'8_.{58|* W}Q|i]oD,:-Mue/ of8Ӝcے^L瘾Xe1!10L `cEbmm[bXkϦƴ?{ 3 JQqQYǼʞW+DfۣEz孴.q=԰x~.^b rxqD4=n+x:R0o|%H(Tm9ypLs]C{,X)jnk83o*Q LS4O|WB,'7:뼫7AU*X9νk{a@ܕ1Lx FH,&fxuN05!d.REx_=3䖁Eq6l[(vq"c3sxm! D 'c,W%X=o 1|آHMn!X kGWx].uNUIJ$-F`PDTBh}l^vݴۏ9}1PGgu.NT㧨غ(>Z/oNp#A Zj90%Ӗ-7lGTd{hzP#E#4Z Z+Qj+@$4jgwKkbUN^z('AF4ĵܤ @6A7f}nnF*Ú\%B52`UKu鉠(G[+X[2E8YD֯3RRVRXYUo"mΫLܼ߲eoEFկz§!Zu'\ӚDđbI(Q'J]熆71ȡj|w;-X|-v6+eōEBD %;j˲߾ko|l|Elո5s]D}߅[З#Mܥ%5=>~x O6=pL\*Ps݋謊\/1cunL-)(Ǒ5\Kvv{*y|dޝe6n|^L]јf__ҙUbkCnCɜt# -{'\qO~|Zc’}%(\F[/tBXM׭\s8&{u1=CՊ:5z۴I`NAA8wZW7_&םaYd/"]Цv dNm-HIʆ2>B%b`MvVc]:~L#W,Y@Ȋ1K;cMEyIF\)Tcsq͗=*QIj7 >t4 *cB-iVC^Y(+9ٺ3bhp 憽sv󥉅eN+7 W.0̯{rIFL׉Ra#u>w`]=\s\"*I톫zVd$:瞝1",'ϔ$Pm[v$U+Y6-OUo}V[v}YcXR'y)fcE a ^nO5dxLs67XBidUb^14`#u@Z5s#_LFDi57K\\4E+y|jf,  H}g#j~ZOrpíȚQ)+~T߯c3ϭevɑ w̿}j>zw řDG#]~iC/E)-1/L6;p&1hψ1""Q'6 5:k ,y̴%m՞-Z%cYx|5|.~LmƏ mԯmxV{ˏzo9ߐݭgp&şbܻ ~sz1$Tܜܦ$'Qv%2]_)pLnqg{X)ԮdX /]0@R\l"E"X'}k/}. "ڰݺ_gs93YIV mq1bhcYL&14ތM ~Ej4zWchݽ^-=* Jݣ=DWb粪NL&M]Q^YV ۱}OO5b[ޣ|ʒbB㻼2acyC/a?!$1ȥN&eQ ij~^J3/In0^蟝ԾMsZukU5NM7m`B&5bk H*+6%›ߩ̇5Eϭ1Pv< *1 ([i:d;Z`Np[,FQM6mlOiSXazY֬Gd#+}6Xۻ3ml)9ŗq,F<zcyľ|vJc!3,Zs1vVdd~1WWGB-`X`B1YEXIVYO'N^uumJjOUޱ47Vn ;sfS8;_$s<¯zt3#'gR -V5[>QC˰ӢT 6U1QmPbnUƘ|cs1jnS+[`Bh>l7}?4,*ҵW6;BEa-[ZFkLҐ0@ibH3Du-;Ɩk|wk("iimmG~>o T( II5LK#6u%j hV5%DZKGMB7ubAv%䚵 (ďԾɚ1;RnzKMUI[`kC}ί:YtҜ%U%6cZ'}z楋y5}z.qn,lpC.$iM}ݦa*U#V$ {,U5íK_|}BTRhյ{ l]wt^ꊙ ֳT^Lޥ@7G1n bL oX׭uD/*RJ6.9Kíy;Ez(mޱ5x&ک1 D/>#er&qt55m5 df4nUW`7i#[Q ٖ))lEYSk 4S46 +iYeAfGx L!&5iShNm>&Ie|xwm}0݅ڷLw_5ܷw|UW$Uȯ0bJ)6VM*J"ͨ6m-)/*UW>ooXRʪʬ?Ix Fw[>}|{|g}2k^[[rM^XynڥMSPmQ%hk55ͷ ]6=V6g-(.s9˜ۚa1˥U6VEF*5JA^GdsT]mY1(ٴ1WUʍ%Y6),Qj4V X-FMMANMaU^mfjԵUu5+r+|efkD%7-TZ/1 zmmSZTEkQ־UT+\|>x<`Ȣ>shK}*3Qc5#wzzs^DXC֢ #Ķ]{;[e/snk$Oz[UͷM)?ra d@=46dپ|ڻ)4 tY{ W+5nU7ݭ߽{j" ∇%*+mU\kFIC$b@INݿmtlKKemJ)W%mk`J,̀!"yvBmuZ,tuKh;53[Y3USQQF-jX VlاdD쫵Jrm2yկ7o"(uڬ+li3*1*P24M3E$P" fL-^VѪ(PFgBC ' KAݶ"uISf%h2mλQXFamK +W]$ IDF1Y#Г'04fm\VO2~PHJYY8`-JSuuU)&n$ԫUdTYu%9 ƭfp IL%ҥaVR534jJ;ἔ1E[VkZɌcFFl-i> N*tUNs4hW&-)q ASi6R7dUTl?_~9GuO5]R+auU港0<НKhta^e6fS$~Ԭ sEr=EXއcR):j} ~>7g2Z65ul^c^mH%H5IQLE-;\عGrWnushNxNu]()bhX-"$Rmeu \6ܭj1ӹs6ݤҲɶ߼5m-y5VZlMW/x[VX֍<ґC-[h)6jI֫tM7`cQF{zڨ}w?W \W&F tcjCX&lXPsmmkgq ?ma ?$* 9©moV$ Vy6Ǒ}\ł߷bId|ezB7 +T.ڑɑ1wnr($TAM4J\\7$?LVG{B R="pnz{R_#[ - *86ٛ{DJB ɏb$$= +<6"֢FIyEI/t$΁]Cc6I$@>0qPu6w0w(ɜץRքU(L^ 1= ^WvKgo͉)Xp ow9@hsfcZ6Ejw>}~9:w(^G' atU$~vOmRof{.4ٗŁ|VY7GF[Ys|O}{}u:IڶQUʧmIU*ZՍdo=o6n[is=B :v= B@̄I? `_?}TWȊ+R>|OԢ~_]O܊+.T~!*,m5Y_Jn7s_ߨR}񴵴Lfjx!w $V~I$-UQDҴ?ZhׇUERR*|fSOmeM^?fQhu G8W؏ߨJ;|^{ДZťzk+hf|xZGk̷12K( .=]5| Fy#U*O2*=izilVieZvm-?ylN`} m&dĖ;b]ʾ#)b2OmYÀ Kf&^\uɠNe$>31_P$KU%H(n ثGwY\1BuM#iojk׻;D^h5ĭ" nt" AT@Ȑ_ڪV-h!ӾhJ kY٨QUGWdOӥA:I$.{SEwJGܞvGmj< W: 8z۱ZJuâ:cg;x4ckC&ۈM3\hG^F jb ss;k3pvuc#,i&,ҘdQv0n~:U>*|_ݫil(ذ_ߓtm[aUmYAZ0Joj4e>z/Z669n;j|z:I%o:Gb@λݲXLw.Qlg{ ([1͋ ]Ύh91-rgm_E5PVە[z),L%MRD֍H%%)ؔq6fՔhY- h Fޤ~S歨lHI/`Blݽ{ܾ^zwx{m鵦m0PpiH Guۨ{6Z͝7wútt[U׋J\ @%Tĩ.=(ސL87ג_djnIOw]~\~4"LԢT%-tTy 6_}uyȐ ?wV/;bh_.س4Q"3(vҠ.[kSR`ͪFٔmdRW9*ݳhc]! \5" XuNNRH4S4u٦T|z#n-ΒQ.{ؒqɞݪ1vݶkkO3U8,;%gֶ0fGDeˬbڬ&-MX#=v[5'B;npV/a,{XEYcm*mLpQ:cu(6颢X,Q(eo67VlwSB_>AK$,ڼ>}3޾޸K7э7}uё5ʏ{ٲzDm)9Ej̶ _?j*2eGȲ@QeMeޠZZo[kG߱Gcmm3'~w?mxd6t튊!yvHy"dAmuc푩1*%-&Z] H(T_9M5I69ɝlLHb^[v#I4kj:+qlO/B^S,^6mאѷiL2F<.d%YW@x/%tHݗ*vz"؇<3,9tŸ녻E.9lf1 #X[3ae\٢e$V^l>m(e -)mB<)Kȑ@¿ kߣemaY$VvI߾c6(qBI_ ţ)fms4e*!LCn$TwvsKH #4%x.tRQQ$L &|((2U lݴyU8GgkRfUϑ$e*(hXTj/fè]OsFj+YH^K>ViV!ݳMu;V1S^MYYzFvUuB^ ؇ &$KT0ޒH %B}?uzVu*5www47`TFmz wBkC=09@騬^9]^  (V ,%l@! ۀl؁] ]l.XeTSՖ_3}XmJzLR{:b@q-lXx'tًD΂gkX /]v9=ؼKzاI!$'@5>ܟKtwpNjog/ e =\7{թm/^w.K{ b꣱,vtmO!gҎaqQ=xWB1=Քw]H׶%P.g2*鞵PE[)Kѻh,aݙ!$ChηYmƹ%"J"i&L>I.=3.*tD 9ɛ-b# >~:Qg{v!?~'*]^ZizQ;0+j"JGYX#\0g8|q|%ia:Q$!sA/sck|chA(* YFf/^BDTIowzR¹U_:ɉ-IHQ|Emd֖95DfϢ&s?i TC% SR o~;@̺ͬ]ҔZߟ7.܈7\߁!!>kz4(5scYhZ 4؊*z6о k䞯ymdԙv Ťu8V2-x]k7fN=6̲jbN>S>@L";HgQ0!y3+uvk[vwwnR*)EGK>Zh*+eRz bJ]I 2*=BTGu\f AÜxeHU&P $VԍnRCEs8lQڼfͫfcQ1cɗ{o̙oN,ngSs1jR$$dϥjYPkжZT"ME Av)@ 㜌2eBWnVI;l?!!?ƿnl-fPٽmJ2[kޤK$Q-JHM Ңm%y"TiBW8KYT٭,뻷ivd(7e*Ԇ,K8,6rֺI"DRMEz+LaNl;a(ʩX'Sbxjƌ8̶OgBj+ KBT&Yܒ׬/ дLs\\^1$֯HVbT#bG$]&7[T,[:y9paâ&U4a3(9r,ɑ^.+5۝-ԪfKgKͼld%^ⵅ%8x-R2(ZR3iњ*W[55E:صw;Q;jzCaR)N[xjDs9m5+Ju԰/I`9ibyjh>FˍU2&MU;؊+rw5OHHI'ϯdyPPQE&X[2Guk6Q 1ɶ5M϶=e;٘S+[ӊsiUN.ۍ`9a4H[< 1U^cE-6668k@EVgUI&.}sm1~eEuFW@w\G8SHi:%u뛎rR!2>i(K ݦɹ2`τ}FhhN~}SU4+WԯNS^EA9o$V+=|t)'-^!` lE9 p>?Q4C_>&d- #w%#e|ԊSg"F|B6a`}[B&vϑ3QS gͳ6#!x:[z6/*_"Ւ hBT=˃ft>DBbUϪXմJlHն6g Fa/ΥBiiٶfcR;kibg:neuaS NWZq f,mB;C?ǿmo5eԻ7nGt2nqjV ߵ6gz\ٶ}Z"m2R+.:VjJ,ܢ3*'WX伧fE+^$|1#՘>5ySPjay\1ywrQfLEADV׶׵UyKLȦĪ;gFS]0@Ȣk"*(2.kɶi+Ug7ah@찀 ';;u}$$~H ,z(k ??'v䢻ssPW-'umꊞd`ʔ}|iiDEM rw\r;69rl,Ycu3gZFʔOna-E/J)={A' ׉qf0ci>jV%fʝgy(J$Iwq=7MV5TW1Ԙg1TRHեvƐkrmj^$!{#m7QOp|߲Mr Q#W.k#Zq-66{p#6jث =\g \ɥڶV5[La RS87mc 4E/>~~!]zװ(zJ60 4ܻYW$~ϯr>AVC5bBgxEë'\a-vښ\%-R$$?K[vڤČYlTJ\^P(t?Ψ8gT%ܧ$*Y RD 2ufIV%$ɲP G(.f9HѰ rPCR^;=99zE3f!M43QӓeІ]qCj 9^3U!DI"@dWW'l\ؙv;wv8P13KɻqF@?[~~{4w=+^ZU*MBnE^WN]s0+c$f @,|>:k.+IdFkYJP+hMq‡1 >@tYUՆ.iqn-NV!gژ]OYTs%֕6Lbάi BΣmoغYen%q٘h+4JCYt;8h4lKax#4lWJۆ9[{D. b}"TP 7ZIT1"{ >](66BCl8lɥF!WΣEVE Ts9-[sd'?xX~ΣG\QK1kı/8Ml&un.fx6Rfx۫oDsmۚe|N{϶!#JXJKufoT%XZ8هGlw m)ico&$|; EFUԢhsJY0W>gEstzMO 2>gmY5vU$ؤojMj(YHD[T[o.Ksv"^GFzs"2[MAm1n> [YnԯE\sKڝ>/ahfpi\g5r8N,؂RU}7-W]gjeMĚ69={INV#ö6($|.S0Bv4Ԙq؈fbitkT+n4ZZ۴{$O快Nm$A5hM;rzWtgGmJ^Γ/UeɌEThX U<ƅ!,֫vٕj:7m͘6Աjmۈ[DRRZZq]jkNpGaToYcy]k51 _Ȧjܯm*^3hnEMBjsMzJo (HG;ε%h,l+%4Ɨm2=uJ[oAդ)EJ2 ̬7["2s;ʡG&|)-cj N1&ګR Sp QK($}38\v'Qzom]t7Gb3lm3) MRE7I j֝Tyv6e3, .rxMUjo)u"R,L̪]&p[c"#F\ldL*" Nfi7K NFy[x'4e9NFydOcMZ~s^6ELE*;ׇG1DFd9+|$>b;FS6bTII]m_~E6mƱͭvu^!#傉aJ% 溼fۣ26YEk0M:#9.-Tm fjEBEJXFZHl*Mv0Ɂ+BT-eA vdTG|5j|řB$TNKmjEE&EJƍ^b +.'7FΘ,JYya.$U0>'Ҿ|g*,.Ы#[{& $*}jyBfY$&| jPQrļʙYЇQbvE.'[Q!xECPDRHS)},kYȵk>Å*RMe;3l9_O!YX1ffan vJSM粖vTO Ot&Hfs(JmN8_$>bݦ5k.X9LX֥N+"&NW¯DCla0~v4D+%9B jl^ȶ}m{%&k"͚L%n;y,HoRd1*T}+]dEYa%|*ْ9 ה3dUlо(L A,C%CR|m> _oՙU^y^FzIv.Ļ]]5Yva*J²U_$-FcX>56m5,hYM]b^YqNvM~X d[`0I-QbnQEA4lY52RZl[DU6GZUtwP򀫦W%j4:N)6E%Iڈ"kdŲY+ޑ$V13cEj,j]ΧC2֮76ErF;i,&o<T:I'Kl6Mv٭dU݊6{mṶrU>iTveST #U$@`lo#o{lוQb_7~DIJSZD+iU]nyzZZk%XmWշKlE%Y6-SME4V-mlmF5k}k{^-lkkEGUC֩bya߽R'w.]ԅKӻWc&mn 6ت-k1U$mOykU:4B /=*Ffۭr6 hiD,Ѵ`5P%(I%!NגlkECc0&6L$،Z))rUBX" m[7yO5-yL|Wd~aS aFVm+_~{fG%K߿~S$sQkB`*$Ѓ1^R)IHTR)5*ʒl]l O'!lhM4+XuI/ɨY0~m~ή;w\Ad3w]2I&g5˦o+92*:ob@dPķ/<9˔QbeEAT!IbIGklcDE±UEO(TPj"$TQSD/hW@^pS^\];^H_)jVA%>-um"z"VG:w?RiJKDQ}'˩%hO/$T䅘_3EܑAyRe} ]ݟ{= ҨԪAG;y%БI(Ȉ/L*jEB"/p('W:PIHJˈ|k KIW1T5Ff٭TjVv. OBHjm[JHȲH)Ed+K&ZXCRTgzf0[`sb$ٴf˷y j2c%,HeH,)`Z7 !ګ3&:R:u,sRR:1n . <g$ZuMRqXb.f-kv 3zٛ_>O?V2*e2Mܛc!QUB"RZmR+mc I= +k~\aTX,2T-S>$~ۓӶV"4 Au!zx' s(Z5ǭZ-axUU%_-]#'^Ͱ,*QAq7Omf· s=v`GXw;j*&6_U5*ߴ$+uJ*Zk$R }m_5WͫOĖ(%RlR$$&E1AHQ0dF T ?][OE}qFi|+$`20Ƨqyݶ6!/* %Dy}XE ~{nKpZJoIRX-XT!ā2DdA PFh_ޕDdW'ԍ $ ]a̬V@2IL`kH#Qi\v#m $ "aS%Q撈%L-s-`L,׿k{Ty*=S՟_wIaaC NB |=6x%$czW.-O9CbSs5(hhEζ=guQNl$66ݯ`P^mRK+lKLw &&(ۦym *,5,kbK'ה!s9|)>Q2?oY%CyMbEbjXv NZ|SϗS`rAh@\\Bc5H˨9&Lz3 w$69\{7~ 34XE90L qtM蟝޼M382ֶQ Ua ?6ɵR LDߎr+7,y9Zdp$k/1]mo!!$W6-pŷiDOвlj\ƙd&5Z R-C\[tcE-B}O1,&-4dk۶[j5-;VJsќTcu 65ζ^Ԯ<@BJBOrJBP+=!"9% ¤QEiJaqr\QTc"4^j`=3媅#0-Rw٭oР&"?Pgk,.27{@VY''pFZ (^oFr~s2>52je٭hպo qiƐ+=~qjʩ\5$0 WAQ|*jSG}v.r.;vwI 0Wfwz l*6nDs}nǯ"^MUQHTI hdRݸsurecR86>j;rۼ(Bj=gjMQ@z1Z~7ipj]eNM L8}>|BK7i$㜛㻲EڳY\FkGzy[}FLYl\F-:r14kDʃ5˹lHу42ri[k-Wk [K|Oև,6،6`SF,-&Yk&$b6Ku8"_'2D!7=eh smD̼$[`ҽ)%(Hs]ۍ^1ێ(@2&!3I[ov4< $ߟo^$6xKNM_O)Կ&GGf(f"X MJLk {Fs)00U2ڑ Xh{jʹrhO36fp4k ٷqURYUU^J>;quy#ڴS ^JBbr؝󯺞٪)p)ŜADX+9*F?{ A)+9Ԛ ,cj Q MH!_V~dv RGRehxbʩ ΅M~3q{ǎn~ I!YiG9훖;rOՄ09E jqkC;cW\d}>N% 3<^m"sU[E&IyٚMzJ-S&W_R@?R]}9kR!xOcLR;| (2q4цr,e*$@59qW*<^)Se"Sk`ŏ۬P9QClDP]2e )SAg2@"9_+^ؔ F~G!4/$ wohGQ\E/]ݚhGg*-8"Fb0 fDwC<67ڷ2 fmfYRj4g,wV'WwEbn(5clM2n@(kѶbP*X6Թƹ/|qh(GvDnFCBʭsmW]Z|;FW9ǷX5"n} kۛD`ck BPR5/IkC]V`4:BN Mծev@׹AɟS]:]szaBXѮ[\R Q[ }۱zVcĝ"c,O4~[,LS 0hYswc,˙n֦,ֲdV($ 5 M]04ٳCf9c`<ڊkuq։o^UT~o8 +923>tr=y8LljHץ\)ZqM*ռgk_=plȰ 1*Vm]9KoCX 8*YoW!mG]>#NbV. [[zY&w}C5c#`+ywyiר9):-qgdYuo' M)4ťw6G[HqmX-.HxSy`qj"{/m5 Om9+-GhI) X@}J\גǥ/6D@U*AD';fC E_q犃ǙkPh?t|_,f5"a )3FPA}iV~_ 0`)w[{ (mqf>jk^MH^\|=; Mt!&c7sc\μ u4JB+8<ϑ2^{fk_ JL@5M/$HܼX+ņ8w*޴RC99  DŽNK-![n(1bgR C_4^M@' F) gv]wv]&"4|E 冁zH7F|>w좙0P^bj/kG1뜓E@_:y+3+5ɤ$ @D|SߪV "?۔y|'  O<.uho%۩W@ϱ?fMu*>Gҧ%(&y`Y%E'*VULm1,ˡsr]v݅ !3$w7PFVW\]*fgUM=\£Wh!\Ww WμMrh%Q1EDl btU$Kw4 }~ObS:]thVb˕,2&ڶrR_/oSmoYmī GhAIP >qy)g%}E,lѸ,*HN'c><$mdٓu̮.x>=B(H,TGsOٹƏ=VOTg l:Y|5ր#ȶ ]/oba-iUt#GR:q#Vā& cv푴6{K @=BZc|_Էbk5einբiZ*ZslkMi{5׽}?(HEYjv0钄}3(B[HbaG8ʮZd+c)LYI+R|&Bo+/MlR c`,A4tU͙YrDk-`*1I{9$|oѕ>1оmo߾4~ј=g˭Z6o:C S;jؒ&3p%hM+y&kRGW|jL뀐^eϋg (S &|l1Dч6a5jKo{yzuro>Ttg,Ȧ"M.nj(g> Ty}o\ȻH]")nv 9~lу $Dsۯ-$^DH=?'K10M͞boQj}ړqaaƽ T4>MfJD֦Yu08$ru ,L˜drc. gIQ2 };*v:KC*'-;{%У\qM:8mb5R+$6l/C9)zeRW8FOecW̦!BZe@_,iTVQlM^$/E279rtIb-.wt̗.F`9ْĀ&~ _/]vFwp̤;Lah]\拺B nk7-Ԃ\#vǜ;C3Ns˵7m4)LdC*J2LNQ;s̤ORfO`5l[KeUX6%9RS݃*"rC'iy'\&{lTDF;6B(*L0 D+۰g+b䨤:Q$lyQ!\0m[0*P!%Q}Of{=^ǯ7H 8s":ͺ6{ ^SC{-iLej)F̍׭}{FM4 "$3T_a]x b>W@ox!k&2sMN dQ9%;s7iKk1j՟,4cN&9-#^*)9|h3%(2]mR}lB[Ua%RVv!sMRLR6pDȍԨ-JOߟ1my- Bgۆzl4;vuޗj$Nr(@KU(N$҉nFɋcMOv吠ݺTQQB!*b]WIλcW[;aQ`[㮚(]M$ЫEBg?}b5&?>Ң2{b~ՍQ"3I}){'|IE51B GWv#3^vWg(%^_-BUPd(H eLP޽cȯxzKl͛6a~_\TE+ elcGFQ(hgxCO~ꌒL$ӷerne7Ɇ%RosCS(’ީj&>%z7+Ԭ)>Ĥr&HR,$=sϘw,05^bF*jETQ2'%a_0zBR+70Q LʙZ(EO*k"ikE3/qDH# ?k=sjE+X5*+˦"M@Kh;z̩(| I`I /ϦH*rk(lv<j*bMB(HK~ڥ\;ib%fP SbP16&2?Ǘf3͊T";ao|$KurβXIFv+5FHzp35j}>|$mgvϐΛmlMŢú)1F5TQ0W6Q%ޒw Yu W= !??*dT,yzºCSD KOG/>YE}T">V K%"104,4l*HbQ*Y)T(3QE8{TT–ϏwΜϝo<*>oyUY~Tfrgvۑw] Glg9 *JFoޛ{P߽zm6%% T3Z1kbַ %wrHw]$7Kn]i'u,) wbzoPU' B|'Yg%jӢh+vrvJ5:\2Kq Hz+sTKzסZ_X2hi'Znb%gwѵEUϲdR"^Z;J([,.,cwW1.d˼7ԚeII>'ϤQsW6 Q&}2_HD͡QI$Xg"[ ԭKO`Iߏ~^'t=D)N6r忝_A?֮Q/b}ɱr5ZȻWZj66ZJ%$d4jҲlfКEcRkcj@QQض-cXبѴm\a3 O5-_>YFAZ:X1X6Vn"#AP4EomkEd.ysCh-Wx(63lZ^FlXe6UxڬڛD+i^y8d}wR+`{xcAT>ғYɹP,HVF]*(X(,b6&m[mP$sIFrJ[%I"i ^cQUb[3Ty +^fUyS`ymo_4уI75" ^$!9Hx=̇$R!}^X7X&̬.ש[%[UScnު6\6ΓR&nˮ$b1ڵ/{JE˩,22˖n,P_IE hUDP(.wnTmR+}qlZtgӈlbFa}c LkC uO{?iYj*mPR/ yeKX bWPP-R2"FtI5xUvٶVBEsԴK=#mpQQY7.YeSwW-k~j/0B`"-Q%di-[|[,INpģb6"iD$P HjJ7(ىVV[6,Zۆۖ6[rnZ4HhNmu݉A4JE~RTY60IL(^1XK/}TWFrq*9xu\*{mo[BQ d_ s[kN\mdi f1vt c]z=UL!WU/jڟJzT^!ꚫ$QtKO<%㬴ԡ*AlF%( "[*ͩhPhA:,mJS+'-n _5L! \_Vlw_'{|՛__Ź'7w^v5zcc2ʘiiekEU-"*-&,m]is:ōaݮXW[nusF5W5묗j1$LLd)IQL-XQ0` &R.\)6`+",]ےN6,%ɬTDc`51ۺK&搱nrnvl_˩&/v\wUwv.F(%1Kr#6^yҶV6QTVbU%Fז%V5*5mV66|:5hWŷ6d"T˫^V'ՀәE[$`y`ʶi .)w%% m(ڿcU&jhllaڄUF^y6mxc[m|[svmwAъ8b \X1"+$BlIik]lmV`+vN|Ξs`3ڋvXYvz)6$>YmAfEVɲbͬ5U9l;W-­TNc̻kVkm̓tN[v?2l 6#g .>5C!eMMqaKٶRBnwv]l&,XbŨ@cFlhj+UBcn ̊CwZkk鳕Wa&̷*1j6؍ڋEWF,<%c\ 0sKXď[j;BT%[ZHvnQQDP"+Ar\ZḅW5:mth`kH6(p! F@I*`]nmR"DS FX)~$EV%~īn%YKI m5ڌ%˵'RQ7aݥ3nVdqPj5EciU6Wvlc#uWծwmd_3nTAAQFKdP@b 65cbcEI|WULlU5QBmwMC Zb+RX.E l"LI&PbbDiPVKU씬i&a+T&TVFTKPbɚT&cjjIb% URPެ~=ם]}müv}6||6͚iTՕZH|d{Ѱ[K$,em+ߏ&jjGo*ƨ6IyIҦbmGdmTRѲ6y05M7%bőK$+o@Hm1ݵWVaQ' $<q<#ζ${Ml-{6yמM7zT]ՋFК( $.k4V4%$fh~JƲr}v4EtFA,m^AKl33 C*TIʒC`QW-tS˻-y7&b]G#tq94l2wI_jH+!>5ɉ$Jf@̹,K#*r5.fAԢ)YVp,$wdY|xP$d ]uQ&X2Q||kb$^P0aLI @9 cTLP4Ki&L׻pI( .׌E%.׋XZﻩ ?dWE!mtmM5]ᑱ M+ͺ6RUQŴEED[EhU,$*N)au5ZieRIdj,k6BٶcmZUVU)E8;/0~[]UT[lF.mFrR23YkPHTۖu|r 3)if,×I ds!b kx`)V06VJ#֣P6[[3򼶮-I]ܹQ]tW6.kBQ,r܎7kFF; EKk9sͫШSW6 Lio-VDiT2Y,TJ׵n؛̥ mURyjhStjƣ*TW`KtMQ)*֭{TJKmA$Դ h M1@`aJjTԕ*р*ZT"yw׭zK=}^1oO֑_\b+K+[o)PUe*\62sλj-· MmG/$2@zɦ^2ܹ漉ѐҹq]BF꒮[,VLkX*rWMĔA+tU͹sQۚTjŵtd.j6Ur4fP]kѮj7cU*6anvOџ:Im>&WR  B2̾|6Ʊm"5 ,d4FMo53e|ec΁ ji|[[6UN ;EgEVE1DmDq3Isr7:Ō+wQrᄂ3\/w .k^m¼UB^I@%w0̅`ȡ(IIU8yb6T~E^Uvb+ K4h ,)a{޶ dZ$$HQTDm=kBlFJ4EfE,D;y TF۷0Ѣ1 }טVYG_mK`5z#ց{lmT\r}dڛGamU[&xWUƴZ/ik;lӹٮwTͳGI-}ʺ'l+]\]XNxOXj[T$XwTc!N֭TƈъP,^VkMD4` ?EliB>bR/7HEV3e[)lmQ=m[Tj6RԮ[U6UmUkfԾQp55jj4[)ud1F46di J P4(%?H^Z!&ʪ-LXВTRJ/Hyﹸ9):{WQvR7~d!UؘIX¼mS[oƨRگ1h^ir=zO;[^ֿCi TX&E-*"+ ͌W͐1J)Ѧ:q.1 5^!2!I) ( 6JQ5UȄJw4MɣH֤j4V޷Pތ[Ey B1 $P]ԈC#QcykLkNkWvC9Y2PO/ߴy/uO$'2L uITs .!\t%-(RW@XVv 7F魒da99BNs+"ֹQ`/\]nn7&fi]@)u"d!׮edE`~O+$Y&J m" "1Ef_PDE&䄽@@<Uc[fܐk_ڽP)[N;iwuv$KQ$FdL2(F 2F&QRbREDQ35ƛ^{/){,*yXEWEN洃2)umSjjv&j5U!HHj%#YBi B`~zۡrjj}ȶRMأhm ci64V5-Dh0l}ݵfrӱfXP4C)EQUk*ҶpC6fir'Q'v“NHO PhfLk PJBWU*.wPB66en5n9ۚu%&Mjmɖ5zA+&U-YbeY(&emf6d?'b`]۴Uvu Bi $D}lii$F4XQY1nbf( $DjSoSG!T;iV$ZO,/N%.)QWTjy(+ģ1Щ[ĥE8#.(+$k%Ӱ 1Cynw{6r6.8uۜuNEEvvMVwp{^{tcN:mc͝R:kBk%lgmچbclJʦ+7˦Ovs%wa֫;Ruů;m8A[ *hu7'gQ-=9v[0th4@mu\ddTZutQS,kNA@Vvu 0N; SARZT8d])Nen$}B&Z61`TnҤ.i}}=S^}ώ#}Zq=}|kq^uw⽝{Ƕos\sўƹ|)@2"UU,,)G)[Hw^.-2s S7vrwuEvtli^]R2:\AlmsLjlL9;f=sshX.{4(NlG.UGymaozg^pO>}g7۱ʆn# or[i{%U}šu4vvwruWަlلuȑ3TyQ۶/vmY]5O=8zt(@A h0PUP;A4A@8H() ZPdA(q( Z!{5!H *I( QH5`kkeARh4)Jf %(J$%)TQC)* OTm)S@?jT6TR~/?;Ca?e5ÉgZr9;m58xprݻ|}֢o Fyvaew}wpr.6|'Hln\d>:kسˉ5wQ?W!_oxr:Zr㑉arWxMb;^:qBEpVF8V [_xYwQ]4DW7!l N8|ת[ g|uEOlnŬpR^낞7QG}?XhηĴqH0%EIkhB_&'B P]vC*<~`eύSDt˾:ש`89J8eQXCk>i}ή'Mv߫;XypS.ԹE >_}6a?;XV9 $ZU6և+99%gC{xD  avndچ d>YKY/Cko'xu3oXc %'sguFIDXDmV M&Tl%K|[;kN s"2攰 >eR_ߢF( >VĻ/F*?4|H2]i8Zhi'6z‹r""+ ;?o.OJu p?.z$_)>t|&XNA 'hőZ6'֥`2eLuS^CV\:ۥbAVP&1.=zYHi.Eti78׫/|BÆcDYITa s d?'SN`VJi9$2s ݝV*)/ɷ,2'"pcRbJ8?ٛV|2 BHvbLwb]Mvj\/ *aÏvq8d(CpQu:LxQu&tXKWP]ǡ+֑y-5وsߒ }i~HJWSHyD9j"@!ߟGlv⥞ ^LԳب1Jݜ]g+4N/o`:,5wE\۬GuAŇ-Ph´Uosu|/lHJ#qUj %jaPv Ƭ䪑^eN=3<]|`-ILYٹiݖK-޵o4/&B> LLLLJɍVkT s뤙q)!Sԇ&IP2T+6e (S#mKJ:14iOpTXmlRi,d=¾ŇHdX2V3!Ƞ "9a2=$%L($xl*~Ss'y+1c:~q2`unwǂCf]?/X%-{֔9g.quw"!{luFTmP̖i; ?'l+ID?<a3?UZ((&ii{V;)+Y\j?cV XA8ڂaq-blTzX_)&4\T=wycv4WEy18vqWvfEQQ?iO nJ#3ǀx:9@nn3fUEWT|זy(Lь[$yh=J,HS%ơ28Oc+5?"un4Л+BőԶ;56A1׭8wͷ|IQܔxTq [a$+N4 |gk R}C,QH@'T)GLdWhx0])m!#N Hc\lZ[K0X[ZP@w꺀V^َzʽhU=f9>X{\}=|hn#.#]ʟK= u 롮'zfUn6$΢t.~NvaY2(WV*mfinηvHXbMc˯jg7m(k;\oǿƗ'VDst٤v#αޮ1 F\PɋS3@_DI3!m3kRs!noJַ%f 41'%V $1žة)6Cɵ:h|(M@" Ny|{G>x \o)}_[մ+'y3$NNbP۹vǗ" @`9)@WSQ&FZN_ޮZ8~iѢtE!{X  LHtlxKBjy)19mG[t4:T_-:i]cb6][yUib^IFj9Nت $`RZqp?ըOnFliV'Pvq8؉^?޹z2ducPQHVy6>÷W6S*ό$%*[]'ҊdG{7kёT|ԌTb)UW苩EŨkeU.0&%d+f@86Zjyp)Y⽝` aе5oi*iKմ:@ݯ{T׼))JTIiMW=2-<5=CF4P8i~6_8Ҟ-r "LE|e:EUmeʡ񋛩ɋh/%)GԳ39녔dϥ=ԇhM֐ ooz&͇{'XeeX*Uv}MM98Vjx\Xp DxKv\Hy%T(iQwEq^,DE4_ |$MIBw1ވMA1 5 kT'XH}=^/C.]xKUh$T(4 .*#? ?9G"g"Ui}mNf7a-رFx_5@b|tpfRXy.BVQ8R_ij2.^^ ppJF\t.IQu@* up=F7 y,w1Fkג"t&V_])!e=:æ4U1}WL7#v q^Gxcn#eUWϤ%)u3c/{n^Avv iIn݂Kxڭ䜂X,1:e 8ַĴ^Ŗ]nHh {&yEy"(ډvKF_?QdQc lMe_>{{qlMw`% YbS:&Wd?uv `Ǟ 4r?%%fs"׻jN8v(YUw&-Ugl̼($6( WȃMm }%[z|$H@sU8Uc0L35 O|Hf9b c?ϩ~Փ|3;YgNdINy=§ (TAxԲibjrvDtkm&ז(-E*X"+q|#ŘKL}ݽQǼ¾b=\M is١aDM#'Eŀ\Bitvy]J]7?BTf; 3P|S *][J"(ĴSuL.ž}hܝ$ЈR_P<~l){]gM>Tw23b϶8N&-RORbWhGD}B>fK**>u#Y`rD_y^cU:jRDK9h ]2gbix*^/$BV~(2ɟBhji0ŅꈆRUI@ yħ,$wSB>x;v6Ge*8w`h-}" ]?E<[X LڼdF3+6ĩ2j{2 6lwKd)˗^>M*>VV<̮VOw vl8«<#})ZŃuVKh>⵼!Ju>"m6mpno,[2^v:m4k(lc@a8">UݱTcl(WFK֬AfFBEKT֙aVO$3}D"ή$Z1YVjj\jت;cwOj,38ɔoma$$ODׯ+l^Ay=yŧ[2\+u*͏%_"hQ/_#Ԫ|MfzٝJ R&Yֈ8GN3؜Baq?OPh1+{;uv5)cGۢX^F;apRe3y )'JQ+|iB#*@fkކ8! /PXW35wv舯)wqѓl5"b])LM1ϧhk&ub 톏膯Y%_Q8(Go\d aOu%tOhT/[i,VT2[l=U$$4OKɹd# J*}MQDž0Q|i^udoBB>5l& Æ0"/#\ZKoMfA#%=%"%4OP1׊j6LQ *\<9wѼX@8ZiVIXBCp+̸^1XsIiHIhc!3Ӆ;F=%2U#0V@ yhxO4Lڜ޳E*;y#`Yh1KNxڙcy!L"tC&] 1uj6¹]1wxE3|r%%ݯNmz5~~s+"ļHt TOşJS!ʁ:͍e$Ln;2)nEhJeᜯy 7[fggmeO{o=K| ؜+,W_mriF#U<*ƈz3's&$1pH/h .`bmgƶVc"Joãӹok|%`"h,B45T@҉yޘjJ,صF뇄rnL;WtE_m1:JȗT侵9 K硂h|/[t)3-Mvݮ'{h/F{zAX[Q}Zq ݀^ S|Hy,I}JcGrwdz^*nŰ(_gzԉJYicxZn@2#VKgơV^є-acҺ=;XBϻw> FUbf<]m=8%V3İ倶ȇv +} 2/\T-c(mEw5hk0DJTQt 냅Q9.B̥hBhETf <`W${mhcz.J׈|#̳"GF}d_ڙ Y͙l\'M/f zZ+i al+Ծ4o:zx*3]iAB,Οmr#*Q8b9<<,x&=鯄g)2ӁFɵi/%#!rE@F2Ybk,DX}4 T2x':+9Vʣ#ͅ$)VD(ϣ[뢒^%)7ө z]U2d 5"=>gB+" aS:ّfgYY?٠HT$ כpMC5"w#s/ժW̛nҝs!O|:)Q[,q;sCx򔰹*]}5hz!*OX )TE8LYb9K殩 W 11VlH 4kֆ̢SeB_6:Dyv lɄ5mO *?am+FQ7g35_쑍ZJXZbq4Afxx!6YmyMOЯ[JOdFH'0X,}Ǟ!DkmH7x!=bbXV6ٔc! Z'3v2:08jUɗ?fڜ_:TRY=/T^5 aN1mm2x2tI{EjAцrCk%`Kv0̏^" (q *2.o,◿}iEI}t`!1^I/wy=9t0$sr#dg}ƉA P <DZ&XW%3Hզt h=pn MW!Nt#dվ[@E03۱8v%F]5{ ^'ȭR1(%ъ_l]{Lx\o]m(ssWb'" HBlu|:Q"D#yXaʥOB+- *U3Y(ܚ'|8 掊"Gis)<̆JNY'P~S{&oag߮:$`h Rٴ=!u(B~Qsc!E>5A"ג.s&}H)#̰(ÔLlf4*1ir'=oUFνuSW-/Z\{[", O4ŘpWo#0L.S*42(yf=+-96R)ocs3.l~s8Y2B!|Hncok}oY%41xD/.y#Ps}zmis[{\$2ȝf<[!Zcڈ-^Er )aqؙ@A M_{tWi{$,Si'' -fMXzc`t]2 koEo=1>!mϯٓg6}>ÔG@|JV݂Qzl|ޭqp vuRRehl]nM.\MPAU49?o }FK躯'z0#>&=D-tĴ[7ZѪ2. [B} RaLgJ؄T '&eVH,yY &֔~Ngycǔ7{ @PDF#ҕ5B~E\ƞ%*$zYrLp]ք}z,Jzv֍_ZM@ %x2ZJq뺶]}ݏ9އwaNJVǯDXxxz/6c˷l:_x-zxx2{X_!6V<̬._S%,v,:be|v7/$Yۣ,m,`T]X-O~ u)~(&tCxA 3!a5@$;gV N$I^V}?BYl <PXӯV+yҍT4WDTR6Ֆ,)=޼-!J"!X|Q6FE*4)s Iy^yBAD" f>6|BMlILWZzRÝB5e"]\EA D4 ~y:݌˫cby!nV7hq6v(rEv9r2/Ƃ3ŲQqWtv#̢J p0ͭwa. ),oNSw, ۱# T!pyݞI$;;ߋo9)j sČҒ]*CjK_|׺lIIDϾ$HF|M)n9RRw]s&:%(B\)1zՈkJR]59@|Zba uIETEm>6U+A!戨*b[hsAk}Hwc3!wvFHn~B;xp=݈XyNYz%ؤ̽d Wf#&Ɩyz4ML?>qV ׹o@!TȄ0(B߾Ӈ緽:0Iƌm%4.y.4ijƄݸջ?O@Դ|W3Y⨖bLX6)Od+[kVE$Bg8ey_VPQE;mCP3yIؑίETl~Ş1̏2w&$"#"~}`Pr R>xg bleRK2QD{ꢈ1^y깝N)8RLYb@V>T8;sČdɽ e39ϟ[ĈB__@V%>r"1_DDEw>z k*CǧgMyFNVr{$j"Y/z)|WTIIذ3D;ƞ%)X3&eT̚ɜ*yma S98e=a  3϶AJ3(| M 'ڐ5 nIab-aPXwV;euJJVQ- /`\eL\R麎 nZEuQŁzy UELNvL `yZdCKf ^>X f ҺRO Y^l^21!`V] %#8e3k's 3C]a4N, n= CF{ǔTՠ$F0Qק$*1֠ƽډR1cRÅ=/'ċ@>RobF<<Ԫ /f6۷{t$SKke&e',LgKPg %f{YuYw8j!G~ŏiFR-b,z`y{')0\{fphj$٥rcug`C]!_ F.0s /DĈ 3XqYzHF*(,(q E%Y[Fޛ-`*zzExmy#eD DE@.9 !}mce b;,>hԄ%RU]&IK]5ccGɪ-3Qs~oBO&FHԎü)̈Pԇ{f_Ye}gYHy| `g$B,DltӿE=XĽm o-۶5B&3ٱB `ssշqNA On&zOWęP'xbv+ݣYHO@d(@^s>0o: ɪ)4 -5d}ūvCv)Y nl E3/BŶMm}x=f>B|>zk, -kPFǿ7V)5Լ/~rxb>5'†gu}筮@~McV LHDyvk#kdcL|K? !Ii9u[8S5>G#@'moh/$8@Xw(G=iAz͔AV Kju_^Xݱ֋<تʚQ50ye-emϰIB /[9b0 buWuQ)/`MZ%Ѻ΢{ARogD|L8EuPZÃD/mSkT :'i_iHC:ۋʂ uM5.8dM%1C[ 2y}*O <^ukcSkpް%*2$)a]K&Ii+(žfAhrYgw6PTX+Au#K3+w`"o0<ȱce\-$ۙn6]@s}_U9`_h@5!5ѭw˞'e=bVˑÏ$=֐w9Cqebb$n+ ; C< -bwG::4ƚPQ{/y OfxT2_YQ`,&-33fW%~FnX.j L%%QװʟZڊyMZ_4D `;P2s3ԧ3;~u˫Xe1&3lO;@-S͚fSGٰ'U*6z6xBK}]rޠl#7،.ba񫆢Y0yiHr,M?sg(cik_2\ng^2ʸ@,@-.}_ȋadۧ r6 `Ⱥ+ϓ-sɌ]gku[JCTVxo` }yĕڴ('nKjV*Vu!=byor4ej#U1)=mE(%uyi펙<2 b*+tTˁˎ9hy|"\P$">.0L.L n7u;ek\j2|A<Σ MǵqΙmCc]r.YJ"ƣGæ{mI] Q^Ζ1+{ IeKjhH\m ((MR|~{f$!&PQ)ik(ӅR/XS!T^黙z\"SX:li *&0*pECiV'vmu,8 >w%f, ?=f(n7-vlZTiL lMv6̖ 4P;Ȳ9<ֽQ;ۅ&{ndjŖ;wM*MDW+@b1Zƚi Uq#/x /̻QbN vh >zu!=,OwI=0->yUCeYve&˘dY1꒒ۢMX20-oo{Of9+,#m]xY`;L3l8n V#[x+A44 _'iNIRY_Z8򞏃kbM1̼1s<)E`fV/|l0ubǘ<ih,0XD\3*c%Itts߶5mjZ@ԡmf]pb8zY^vϔI{̋ &3Y2:Grh|޷s͋\& SI8"&y=_ XYQ, XIό +{+uS1\r(pX 9%|jz$Q }B$"nmo<HJHO[RPDx+0$Q^<;m^tz~)ǎl[ ,G>E~XdT;mf0E*0Uq$5hr: K]z*F"5.H(e\H;zĺMM_ZyCcWJ19*F+pqOsj)μƴl\Q"'}PssQkSk㽍 |F,|[Hxՙ4 e{ `hmm)1.XM5/%c 1&fE< }.mq8 `ͺ̗ǯ ZBg@ϵi6Ց=)2ˠ)u%)k@bgڭێ&:Pc1S|·^D)Vƭl rČSW%oaސ|c@6Ag urI$Vz#d5X'g̚z0+(e6c @X7 =z`OfJ-Ioxycz^o{rĖ$ Lȧ""/ABh1-?cTf @]eŻZ[y}D%H]^ω+6~0Eo]JC8 g{8PR^~g$5u"\4sDZPܹ2EzGSlBhQË| ɓPAq\_>Vc"+){aYDs"ևn3KnΌ7<}v:'^mftbBП.BĊvr!o~S? !VфW.1)ѩnD_dh$-Tmۥcnbz_8o4&"v§vrK4絨sH)J+SYiJ Xl7%-̩6YpaLnI+ܶ8GK!1UL!R`'沅X'XS2O4G{mŅ[2;ճBRm8 @8 YY3-=.o ToiF)P([k"3V?AӃoΐTjްH*֗-}D`  έ9ghω}}m!k)wV(&J4&.L(mIpwV=%4_J;[wsHDBb3imuWؙ7}Ll뇇_6knG 2.|s0b-˟xm B|W@[ً25+i*=A>5&.ڃPKV)W\-}-v>cViNn>cwNTɻN68-mB2xW{yA8֖퍧^iGޖiq+.Qee`0&уK$žb˴Hxl2a<]iw&_jΗ]}}=*Amdƚ;̫xn~Kvuwo>o0Ut*_Cd XTUd6 5-d̦lU?翟m>{yMkU.A~ڤ_x"_Ļ~kmkɍcEb`Dm7-v R:vl5b7PG;Nm[F.j[]smTƂe Gf#+I9y6ךmȶ.^H>W7c̈XP"@MQ$;MVžmmy؏uVZt1kKn^h5T#^asש6Uu be$RUDUEUQLR6c 1@AF#AbRD@$bFm􋼈ƓH&CLӵck]zLҋMQV4m66Q=j5jKlZ׆LRA[W"aMVڞyeXv7q1[{mɲYC4 E^j;.6U-d֭56V>fh^jk@ӮncEnrjo y [@+[jErnnUG9i/5 3,"[UF\EEH%mTL$WTMQSdm~wm"٢R2@fkU^ 6[Yݷ} u{ƍ5Ս6+,V5I0bB*,McMFcDmv5ynmtS#\$wIQR9U8l]n8;annml/^hm uպFl;-.b %9#5wQ_֊-O-Rd]`~% K$?% T2ZL-Ǚ"U[rZKX֫tBkQ $t ++ ڶ&sTB2mcIcQXŌk@TQwt(FŻP4ͭMYZmRi-mo!DŋCZe'u3cS\mZ56frț2JQTQѳld0A 1h@amd>f lU+unti*j Afu*%Z,5W)y F+fǞ5Gj^kiU*;P2,BqSiF+U.խhUe7PNMmZvا4;Cf6r,V>ʎB}ٳgR P* v0p96"ʍ_,zBIW4%4W S+ycVnvl[i-f5&;kmZ^QE1=]5nW*͆U*:Uۑ jXɄF4lMm[Zl6Vhlj$xLQ,"ʉ` "=҅]YCzzt'dXcY'䑂ƍZ6T]jBsB%3![鍙TLʂ6c$F&4hMIDJF-cQcF؈'گJZ+M+Ԛ4Q*kQ(Lm'qWlfjTʫ6m{iWj+!,l,)$<PCn#fjzyک;fs!H2 4:NAx ~|5(=d5[xh @5Hs5JfLW*/ "g>σ/aB| Ba34m{E3TS7Y YcOv2s^nrOKm|{Ȩye}k666M,jbMUlQXB) 6,b- $f}_VTzj_\'tgx*Dσ|jO l~vo*E F꒲]0}y"qG ӊ1E8mɄM_L3v3#pa" Dm Ǘ;.:0Hh˳D_şDRƴjD.k-&󡯹PMi","{je Jt2,-Ǩ V5ŎuҡViyl hob8g7&'}H|eV︦c9&ZRV$Vɬ[+mgIm-5mVabB6B5iM<S՟3Q>Z]>9+nM4SVAA&!C&Jlh\%ߤ@j O͛MΔPWC5[+ͼ甞$ٲVTVr"Rʹ.m$F%~?TvqI$mUUW^ҚtlyО[.Ol,6N1#Ck7O1jak1ە[nJh&su6YfИ)k;Swe'!)JkéHC !; ryMke{\+'zJk*inq3.kaL4f"9j%C]z:ؖ\e5+U+ڊ8$ϗ:ր=36'WV6'+`g*6h5j5&W ҕjXB%sn+{2pX yHC߆;ިף `y֬*LVZ64\TIl/=3 'c>Hv.6=tҁCQ2O"QI{3jnњݍ1TNL(lW[5O%kVdZk^h#1Kd5mDWW.{+%уJ&W\=dOy|/l6mmTGSߟ}W23Ŕ)GHj2:/bz=K_@&y#>2䎳O2.;ǹݦ ^:6<)ja ]GJ;$I;x=l۶KM`sTYoy٧\=!!Ӝivڹ1a̬^}bޝr83\ǃ1lz4M][JmWvM,,\J5D..Y^}v]u;e BBW#{>>Q!\jJyr2zeI[ m^N'=e$kθ\»_jHZ{LjI%IR1$͘A1޵'*-2j64dZZ<)WO3BT[2ƽXߟ}uUe~iqm5cg>=`64a(TfDcb;om ?λ׺]FܰܲtqɆݤn%n)r9Q f& XT-k+c=hۙ[{?$k5%i-}"DEXSjXLQNG'W5ux08$;o0 \F <>1+|oyd*9;4LE5<(|0nz$+RDA}c5w{_-<2hݮߗi$!|gEU庱X!M $Ќ.LTKߚ=-x1)Ç:g&qSVBbڃv2^W5a9MY1+$rPe*9T%(eK/w9&HW[Nѵ$Zo3E-4}"a+-]R]u)fѦ!6%XmVi21Sk)u; .(^[vZZ%YNT6ZR.ۈ.&iIOisN7)Z2Ůa ŗ`nEwq,!cS!rr=VD 6T&?$EH85ƖlbtNBT*Z)LmsU^)#XCim=78ou.kӍPIw* ursIGBix397 .u8{{Y7V"*vwz BCԢp3QDI~"DOz|&Ԭ$ hDњV4ј<<٠RkZ ^u`z~ʷ /^lAN#-S.6sіً2.c.[%#T(u F+2=0@wtߺujgrQLuI9-/t:9h*#з5b rAJPLmYAgN#ҦQ''jo+6RjR%c6'h=Nw^U+s"54n.FPMV+G2{{ I^W8[v;i\$!>~D&־ݛ©\J{/'˧IX ɝ,w1o.D(R%%8:a9˝(B( s dRhF6Ek dװ{L;mY_{R"mw.m/<i) v`5Cj)zMdEQUx˅KIOڿmB6ڷtt=,G $-Ȃ,$m#cĽvثw3aIщ^Y(5y MUՎebUqMgnbLhkԒ 9l;n›m$E 0I 4/XOmsDK"_ړ#Q]tj!ե55[ⵚQtW{ 6rOp]Dnk`*mݙfĢ-Mi!4Rv{&rր=[]k`Ke⃦Z%,Lq' [ JRm0̕rbqNexy+X#^KQl"9̨EќJӼC)-*LG1lc2F:x 3ֱRɐIJ㱳I浰ir]N(lo%h #'R[B+t5 W[2ʋwN^f{K)VVnI!fF(DTSFkIֺC2yE1YK4cDjR@ X?Υ?swq%=$!^EQ$ȶ^[U}#,QF2k2,Wkb#lɅM+Қ1-{:+y0wKM<68\^D}ꈲl(>Ԛë0DCXF3f`nuH_q"KB2ݹ.q̷m Ķe[XjMmmK+\uTx!V,P'y(V[[ApA30Pe:v7r ~dKD?3u%DV+S\dwwEЂ$3wwJ|u [Bu'ԕj顡<;^,x!Q+Hɣ\M ҲfkfQ^Y2G!!)RDc9n9-SWcfs(h̸l̹DDsLU^]@ʽΨ BCkm[US@SPm.z"S]#*1Nt|` %#> Bʲ,UW8MФF4g,j̢kZ3Af5$ʦ.sg&:%^Am3m(8 |25խ72ݽ#Pɟo.t\90+UE`\r:XJʚءB2Z^|}OB%7fM+!/=)9Q'ĩyO k"J Z˒7duC!UQ`rGTGis)mʀͮf J*ualUkbfoCحJ[̷]^sĥ A[pAHvlT$f*L2tgx{RK!RKDsT¾**ZQ LڑK!!yKJ#qUSH2hs#K ,A52O(H0 >bp1>uI$6뙔Qۻ듣}ש7A TE) Rj3U}ƤTXдgŮѩf"9م61]vR myn/Q+ _BBC#"%~/3̻fi9s2s?&Ftm\ܱ {kD5TW.Z ۗΑr:E ba1B |>f\/k9 #,"OPȎ 0 0g K+C l(E4-œzo{b<۳s@Qw]rIXwyu %;;.ё%GʈZa=r,S^g_nIȦ{^gbtueoln66-jحA"ENn$OilT[D>JMϧTm*Q*5LZ;{lO5KΑbTz%RGE;q'&[fS*u@1儨IRg#3qZ/[,nl^St;ǭ͌"H֥Gv10H +6&AomUV{Bc?ԯpqL?bs6 ڳ-cQuy-v >FYpDR=[y!7{v $^fL+:P\2$s:A蕱FF# &W(5(:j`\=Db8}l8=DblaW.1\?mD˫vEsn?s'wJ-_f ^kVe DIm (ULR*V s4c+B-D.Î+f*I0mfBL!VL7Y$ip կ0JƳ53L4 + {MK>轣KŧUSi")u& k {fpMAKEĪL3C3װV)B\)\q#[;b].ۓnк%gk2!aݷ;F ̪*Wu&4mՐu mcM]H1kJ !&6%25ՕdX;M[k5 .:ذu[NSX.ԥm)+;qa`"'5O6dzTNBƝݐ/uu'ҘcBrN^WŠ3 *B(g:wnDZm>bNrg'hS&4œzr3kz^έpmZ:=$r 6T%QF EAX5LڍVŬRU-cQX",lhcb1͊2m5bXIEY6شU6MmM^n0ߋ$K\""}*-4DjZ&Q2MzgkhZUUH""c{Ȥ{y.(o+Qވ"jQ|Ni Nz0[+0K7Hi.ω4CY[yM$[`L#0VB ^BVf QFI+D*AuyIH>U7,ֲh]Slc&$ dټVCoͱ {ZH|2Ьn"PZ{kNU^4gl[*TQYlYu1$kEu[w^{zHZ QPW!{!W)v^.cc e2 BO@3ʸ8 ֌:+o=reT*O3&cgD 4^$S>_TBZ KUT>'UQQ"qGSNlE>0RMb֣dRƏSӻaR#?Z߻*rr|RDBM,c.تKɣb g/:5J;m$eڕMEHQƣDB׋om*jfԟ~q0hJƋRUK.S61Y!fכY-P[o"!*RUTUjE." HvvfbRT`E(fTb2 =Yy,ʖ/>QMYD`G7-I{*X ,Ypmr`G]ws텑r*ٗ $s8nvHcӻ}EX1D..O]RT*f\_Ϗ$I ?AcmwuhܒjAA!d2UE}MꒅD|I_ zJ̣TB D-ULԫ4M3I R2HSEQD/oMLqoaL>F|"0ȭBB[c[B (&W)I NkX_Hؔ"O""(z I6$.uM8,C2w=i;Ĥ09 ;ahWdp\!$˩2.?neMUDc+gBэ.m*&iYmf1R-DaVb4VR u]v++GbNٜnH9PliŒFa&{;mvj\bͱL]P-INav6)h:i{.̽0V!Kn7p@(˭ڶid'"@I }~J7IdLdiԌභ>wpI~_WE7,{C2 % @y\%$/6d?QL0 B£QpCnT!"aύߛފأh3_/Oć m/}MZx^[(m6 J$τSdYڬ2]eOyW_nJ ]J3ÚIS͑v{'9KF +bYsxpз[qm4ҝXjz:dva >`P/vtSGm bd4s4yH1jE5. kkvv $Qḫ+#6ٯkKw^E7kn!ЕD[l—w2aRZ GMv7[nn v%F/hmutemеå۬;%(x>?|2w׵wz)A؊}--et/RfD0f6I-ch?r^GʤT4S_NXIKD+⨁'M(-LW~Y721\AlÕ2ш(|>q&?k-vRLS)lW:ɶ1=Xꖄ[,khP݋ f5ߚo"c@$?AbdPVh&*MoJ})F3[M^UB&>yf;c^XGNC !7%sYG'VSԾlT\ EM wZD͵=ʆ rݗ[V!O~":zZ(Z0FJ 8еa1v$p!۸U/WY)1gȎx}O]3|_]y& ZW6!ڝٻlX\l ¯v_Kb $0Ȇs.[}, A GZRo*ѭ˕W]xhm JUn*qf*7r݆Y+1W|SL̒w zPʥi]6/$ 9Qn ,\ȼu͸5h!b4|)$Cb4Zѫh[vj6Eה%i&Fֹo|w&1&B*$J1DO,栴)-rL"I %zjDY2W,h$DAbJ(!2f $bZ(% )LB)!4( M(P$YX(R6ƒDC_Fэ$S$ьX1,Ӝ;2h"ߗVջђ!!ICRZ46)eh)ev!1zX(Pb+>C2CUF|O*@3$S J,k>GܕW$\>i+Bh@VE9L\ :bl]$`h)L1[`CvlIз$6rh[N;=*&HI!U7~ʠmR*P6V0;8Xd$cv$)~~]?w[u(XSB>M ݃ Ry_l[WF_"Wٟ"xtlLAyu}^p+ݯz\q3wu&' Ɖ&ɜBZ,] Q_"(wcbRDecV ֪F@d'aX #*zʰ:q-a„ke&C/E*fɽ2.um.pgw7]$Z&EϡSƱhOw̻sMӂImkkY[mBHj!U/mn}! RDL*UHm1u߯Iq0w7E5-ZRӶb""I (-oKsbmKC E&b1Rb4FU^xLkVfD]B4ֽ!JL0N2#ꍽPkDiCqs.Jl9Ʈwbyns3ΪT%u)Ȗ6I 3xsLěJ*9-MG̞K]gia|?U~_;~|(!`f()Œ9:VW5&RhFYW&]JS:>2f78U#i$O%g/[`u؋t+2r%nfݮ#RE'wipF0a#>GĤLPIϵj2K;c/Bv(ppCq-/f%l4Kk%uF-҆%Uo{h+3ϔL}]ү/kR >r,ڗ"0R>ͷ;`1WWF-[b y TY !aQ 1,k-햛g_XꬄQ)[uCF2o7.(IB^95<[]l&8VĨTe)n;QdurC~=&PJ5\hå&N5`jɆ1yy̛(Vl)S;ntaY'۪u#%|Ŵ)WYڝ 3mo;LdvĊX`#X\CkJ|Ou E*^lGE*ҝ^ȩ|*ٲ U|O"".@AMH}!!D25mriVeeI?$NB(PI䐒|XxHg..﷌`Z4ZY_)j}b *%Q&օ| OA Rܐ'LLm-{X"@9b 5 [FwIA;69OA!E?ڷD.jo$˚5vs\mҼ@#kUCB5|Op,yFF#,s\FTQ*R5dRPKLe~2mBu\$ ODΧS`U# 5wcI!uܹ\.W#Igerצ򗚡ʈ.d绊;!, ޛTz025BJ+ʣIڕtmO4|m1kJ{&鉵3Kl+nDFJݝvxaa7 6)IeaߛmT2LMj(Vś v'Ԅ B 2ki[QrӱɊ6u*7}:uCL[v(Z&̶U'7'i8@׃y#zD]ڰOq ;p#Dwn>pVXmkY*m՗{gw~{RKUZKEB7[[_P9!;d𰭭 p5TemQ¥[k.&$:G6jj׵gĚ{t!5Nٳi,+Y+hĄ=*1Ѫ3[{mdW5% imEV6*ki ͈̟98mⳠjv|ɦ+cUBlI6&MI& Lс@,F hM%Q#ڵj!?t#R֫#ɭ:l8)sPȿӟho\I򧅙|;XBAHZ$I!ԊJ>Ȳm{{d2z}EyI!6ЄS)2vH2>[qZ~ڥ4=ٖ6454m~ h#G3<4q]%>$@$%H|O VYr)YlHQOw]sֿU#!~s_U2eH"]Rr`yq! l׳ $P;[iMzHI|*)@ݍ{L/csJ#fY/SzY/ee 9h_~ᅐlPt*JкGlSݡ(F60q6bL&muB@)PUK}k8 JGV=6xty[?㷦M6"#蝮+/+"ҴX"Z`pk|rؚE_*MVmV~ݹD%$b]ݮ;ݑ4 Pi%uqѝCKTjQ)- R"T4D%9vz#6ʤuˢ p (fwBBNEcswqΎ\;mq>1+6G8c`̦N&rkuaʲ(!a" 4aգeVD 0(eFM!^`* u9o˕TN2A JD^Hztd(ʃFٙD;L5xY'ϕ*/uWSu(V{]n!DR:MQ@y1 $7#_6&3fX AeL/vS,L-g>ąuiA$?̐eZr+>im#l7 h^ŦXKZh[a#ZTP!-;m%زcgQ+)[T#s/b1F.4-Ԥ%٭(ǥ#eL@9a% ^jRA6D%KZwnwdq:YlWF60ajMqΥ2j]nF+ٛ%LxA $?ߌk_02Eo"؄'c_R J>6`WhY}mDjă/w/#6&vY}Ϙޒpfv2gls8gI(='/uŅtpna2םw-!$ b~¾;.aKyANV'[[v7eOX]L iPi2,AüLo:3*eNz2qߖĂRRv'WH0KXc`MKȝ92lwq!J.l57|"pO˥SM-9\$B-Rm%홢4-m&#X\؄m3^ySk;f@?F84ҹ,Ĺ97Ama40idq[Ҙo4vbaw{mա [خV!J>u<}H.OꖥDkjZdhhգDa&صU(J]ˮLIi؄3!W?sJfjk$;5͊0LרdQ"AF|bnEl/i*CYH+ǭׯe~z\$&9զpte@>OdYA>®lcMImrMp_M4 !c*'3 lhh*([J:|jR&ı0Kpsޕ4fۗrHI!>DH>VucП=>W)3ZLvj[fP#PXXEczYWٳhISFW\F#g\t*5+;B%f03ei3*3JC]^ZFrC0'j&+5bkM\"+Sv2=D6]f܇fe*DX$owglR2kFLݜ5lNvG6K|Y5zjo.oH<DU_ FDI2u0#uJ,%z]ѴmZR)Vͥ0vsjMJQXR1L-,6[w9x#J`S$B5?,r  UkFo4n Fݝ7wu[Ff0%(h˩`.Vf=ϝ)5).w=~8d ;A̦g.eHDMʱ[j~~{&Tũ6JAciztѧ&"ݺbt>DO)VaZejTC2ѽX֫;S(M`12uiL$%җcm`9vaU#F,v*1lr:Cga`\F۪:`bD$-f8fڒn(}W5Dm9|N;mR>HH~}~9BmrvpD Rz%^M3"bQIA24UE՟MYQ/mg"zaD}4XzAv7^F`d;^e4l)>Z5yeahVn:{8@Hl fEM};0dHߵ[7Y& )QF}xQ>f'ɳ˱6scy%9ȣ]]"6c\ЂռE`spTS&thd#x.ZH@@]03p^%k ^\f1i9 iju{1̦}kGsTYm<4U ³Yp+$&-7Y*{e;;rۋ{}Is-Q %L͡:ڰkf.5&4'eYbD` {Z@O_VQ4<__'my}ByKR_m+=wC3V"b5`=K\zb1i6 '޷<?33vXRcF/d}ux@`%7&a-yXދ2+PfƒyZ=\@$ A{,sDhv>s+%,8K2DQUҙ65m6&/'e|ؔ*QPAX9%Z#%JjϠ*M:X*z@ߏ փml)jfc֛IY!)vy*;CжleQU7)+&})jٰo YqjaaD@rMh!GVԔ[q@~S lc7'5|$J+^k' Pp6'YmbL{ (򠑣'<}fNzӆ 3QLFXXΧ5N$o1{aZ\ƄD1ݡB h '( xcVQn*j̊j]o4jd|&d \[=ث5]Γ،67 hh-iXӶEuXpm^o=w,]::)'TR{ȝ9u`w(F;e1J` .*q Hɤ2IDZg.kG0[,J暜yg2 ɑ^>KWGn h%NJ,w{we-XQ90F[l)r< R^2.٩vT,wpJSr dQ_/WVHHO?Y$'ibpD^Fg/Ack56rdSrugVH_L˔z}.GQ{ԏl ѕRdgkojtVٌͻxO}Z0L\s5wwKpNmҒTVB7Oݾy=Ar2X4lJ}JzP\ޯrIF 8JX-,RUYe1ZR?ågV6v+U6$R$"goN+3,S]r=f>"s_UA0XPFhm _5ȈFLRFI4(0Rm~|ϼ2%k('9υ9S($88̥DC QM%g>Qђ۹vߊ0U6>b۴aKIa]ζLE;vu]"+nAs]swyɝwNEt ܻz0͈n +m{UGꦥ Rb@;a>$~uVݔu=eKm C  I|HBaOk,sZm!R!ۂTA^L7U h%IKTuin(M1"-d5ձ1JC<'t OA* m+2ZWB~~CyMPv 2Zs2ڢ+dL[c.*]m!`Wvۜs-OQ?7OPX1jXٱr\6ع94TS>$IݳSJD 2'\M\s)h;F} `Ѭd$:eJzQHB2'YjDVDe3J1p[Z6bhŏ0M<)#)FX-SAJ#vߛگ64$1S[7 bZdbFl^kד"$d-TDTj,oEj*nPk|lvMJߊhUQF1RCxO0("̍ObĊI@lcV/WF/ȿ?5~1*ŶaʿsAoWVZ,jXʐXrJDB('DX<#dkCUŒ$H{V+_}bfj0SRhmdVTeء344HKH rwP Ļ*4S˨)QipsYj,J-blcgjl6YfVlZfR[cnU;sj=ݨiڭ7N3Z:_3 }"I|g|II@H)$Aɶ$"6)Juэ!ͩ9Cl{Fι.:EbEVMLک/ TmR"D`C)YsA'ִQ9lHZ%VSlMh.dEճmBI;wte*ԏ|cݚy6Bg_+3 5H(DEmjI UTovn'EqMmY^t^ZiXFNēvY}(~_6;vr۹u:u^~ز"և"B_{`tBwPf׽l_xLkWLlX Mds{x >Eb*ɠ0|劽oѴ-[ 9 j0#X,a N8kU[q[Skʏulfv|,PZl M*=/3h[UEElX"Y1VCb i$LFd%EN֫տM{tyM9ֲ's6cìiyY=mMbS ,7E koH5Km06CfѵLdq[JfC#/<(zT53,1c ٦`Bjڸ!ʒri/l۞HI>c+^fow%PFcj6.ʛUlM m%l%ugkuض*-jRPjEO2x|xwvnko#԰"^Ҡ*X@dڬDMZpkt$<]|ds?r`!-:8MywưesW4^ ;|Bj8FC,LLP 43bכwZ */?0dsmxSgpI@4MblGm.wqUwm1l!ZMx]=J]="Girj|CX ^kzp'E#LN(UU"l?ɫRDZAԓ7a~P??hE~Iy)x<ѕ&YULe9KJF4p%Ԕtć!Y,IdSPq}]ҹ#o֔YT9*IIp !m}7٦~GTj[ Seh$mWW`kەugPLUjXoZdFdWdQTV%`ѴAmsnX湷} WH,<5(+ϵrcz˶'n2aG[7!CT}{Ĭ a FIgvL3 ʹ̃iaI/s6Ptyٚ4KCZW;=2DRf RvƶCjd3d B>;y)*lPn.'emN7ivh46K3chmkn*U2b|LE3im]m~\5Q?;j9cŦL˱f5dx)뛚\RVmmiKRTelM6ي'kHckQ_̍uLT 4V԰eR% ZZqCJ.FRM24ĨĬmD*U2-]oÐ^:"fdNe@/aSEF3Ҹ2"(^ƽR"/ܵq1 hUvhړbr6l$ !""Ty65ҼPISrNT &ѵ#dy@qyѶչKIrVٍhuSv6%Fڿ0d\YiPdfyWhf66󓀵HSM0>~W,`Ѓ{"02UnWe k΀TAjwrƢ koMڳ[Um'QڣTguk\֮2ōwUȱFTVgw˘lwshVgSߟj)OJƑR BhgWR98cUū~CmmiO5f3Rm_~xyR\S$k hCY(o7W5֣Amd5!5vE4ThllZ([hzѳ5-PѤ̕'%NMWܥ ڔi-)\6#DbȆZ5jbշm$n}\YnjAsZ6UNsM*&.իZ$T[&0bƋ&#cF,ڊ- J53h#XX1i4mL6BƢ` FieV*.6mոU%5)_ۀL8EZʤ5 SU-*Z*k(&CHTU'Ib51 ov6/s[W߆Pa_Y֌h}IA"+O:K&"M I%%ε <4wvRKcͧ\ћr ]k6 l['0C brYURXN-!5b ^ʉK.-chSNLэIe9RѨ1'1mޮiZL6I5BQmm4g6dͱj6Zuw w.eFozC3fW5G7aINƼ3Fν1L v:) 6"%̊6`jBJ(-jhAY,HV[o0Bh-[TokxNO5CvјUruw.ѲeIb?5F#Z*YfPfE^rƱlRX-cAVNmsLIwuqݴfGe}ҶGJ$ "`@HCٮ.i dm8Уkv~ze6 FŭUֹݣX5B6V͑;ZmQ[&a'wW%+#vwZhkɺ+#hl_rmףpsiU{uN$dRwh\]\1vMU4'+s3su##m"jUʽGq&f wWsYd%QmJccDcRmUV5 2c"PSunյ1$hhh:SYlt+*Z6DMramQm]TJ2l5_2 ҝmM577wntZ4[**ETId-cVUQRHIZmQ2:_'P[wJbʡ%G7V\NmDPWX_^vmNVɵ+\ct*1tqR=eƠaE_3[ !;_Y^0]oӫ'ݜvfcnd;U864cus&b6FƐ lXnZ,Zf&)"LS EJ9[HmEͱ5I)*^!WxƁkHFlYkRaVIiCYBj-XЌJh)S$ԥDu~gϩޒO}%)kcE k ̓!1?dڲ2#y_~Ghelf; ᨰ>ͷW4kʓ^*lV̻ݶ1QFnkb-yZ*"DdF4X{6a2SLi4)Qh6WRH&Chk&r\meLRm%rnaWKD־~"mbA\QFm FAOZ):{҉H<G5L)Qi*1H_J$U2[m~kk}am6֢ͫm}|ͱyWQZtXٳ6ԇ8K Ƞґj nսv%r^DROzyb"yd֚QQO}(Wb#HQLƌhFYh~}O_,j3bi-DXhKc~JwrF$Cj Ho#md 1Y($IHD 3ǒ,X-ܯ_7A#SyZ"m~"ѱh]; dkMzzmvhDHt&Ll^)j|Dj]mH le?WO0Vb6ڪ [*[A})`) ʹMS7jnl` 455LmDLfڈcT&F-ZlE7HVڵ%;WQjڿz޾rkZH dfz]{E0D4yT9m;[)؝ۭf6эfX5f.l^%E{ڋ<mTmlk_6s fZƴM26v,հ[H9VAcmrr`v֮[kiO6$~RDlh%5ضt,DQԫ**6@Ho=~g]P5ˬm'ACXc9k_MeϮUfI L:bMڹڍU͙#Z-EEX%mgYt$ FM&ڀ-.Έ(ƊE_[[OׯlRl˲rm(ɤUC$:z2py(BAU/[EX`@9sǭ-$h3b-W[^R=oI(Pfmo'G\q+G* $̇$`OP֐롉[ 7WC˳jmf$Ȳ?KAMV+bXh+QUֻM6N qh4;drbѣ`6CR:U56mU]?ڛU[+!QST֩yQmb{/K3uufѱ~!gO{fɴSǚ臺6#ed@{U6vڽvܱ_kAIaQVڂQb;[7,QQ-iڵ;'"l[iVUZgÕ6}$#av1qؙ3mMZ#m+rk<+Mo35دjv5u\ر(mئY fB-EZ_z̛%a*T?TGhj-J IY-U Z4ZXb*&VRS(+$k+O^ 0T@vnMa ڔ>{+޷h-gvGVwwNSn=(ztP@Ӣ'cKGM v̻)+E]5VKmh[2eٻ۶9M۫GAPllkTS.TGm9!ݶVi֡JWrӹ.ܮs+kUĉvm ։v֘ 9+wL.t+tnnYpQܮ@KGU,gG{Steܭ5{[Yj]T(w(Ӱ\] W6m`av@t65iim^_y h-P"IPҴD{%l;7شiv };w;r|wҾ\2O׽C园}&Z)A$ɋubqs ǡݽw緻G׽tj'(:o;-IΨ @i$f>lCzzlmwz_c׽C^3{{Z=˦z{/ްlҏxc*"np C{=<;y={x=o]{չ>sAF޽6{w[ǔ@l3oF];vovK@9xV@.0|MpVO*w=O=Y !(u\Caw)F:fPWcAR3སh**e%ێ qvh}3:7MhuB,")=9KSHǛ 4݈P 4TBJGO"H)䤢T 4IJlS@ I*@OTSJRUU/qlʭFbSQ-GoŗvW+rsW{8#'kV[7JwoѠbrѤ)_]fru:jY-:)ߣu2˟eMŊt]=Y2]Rsav, o>ӝe}Ehu>[^IUpJJ8~|=w..Xs9^4A 4wڮ{լ+ns~qjwə~z` ~oX7wi- t[R}ng2?}:-ov^ߺ+w¸|sSkOtW]}^߷{Yہn˶cj yq{&kqҜN[X o`5w"ij &gQ NJÖCQnbr26_>py[uwW8,9s/u\Bu7L.6WwjOs\^zՕFwr,_Ve8qC #'/E;A,h#t̳$/dv/z%j36߲d}U~Qu,̈93: #Ȅoiu M_; =A={.f^M#iҬE;oi[ǔ/!1ϠƜ~v(S-e˴I>hMY~1 3$-Lu7ﳂ㮮m3򋷂)7o{1CA߳V˓ܼY߭WA k_L=vuL> VhYeai%hدte0(A@QD)Ň.6zq6SB HHKb(M Z}[ԘDCʊ\پ~q(UAs2"Z)m3ɶTA el^Īiˤ>IQ>~ӾSտԢ526)T J SjW_y5uw!re'OGaO>>7`lmxXXZ+O[@ڱrzV_WɑdR(Ym,.CeV-)B[Ϲ8tL=欀'.Gn1BȊ~ KD _'ڐGHBHŏwzwDʇ~P!^fؔћkS=^fr3|q&+*]?w}1}x-8%|i](, E-Ks+ϜqDJ"P3ҠF6JM aOMepC%kdM5}̚XЖyc=e,:&m!v߫ᒖ ޵>+)̡2 AXdW.X%pm$Bvv҅۫;P,M DlƼ9H;ZLoA{!0ȼw⡩М~osW%e+"GxVH1E _~V}>5bELR_]i9\XIB yroq@oLb~lϯn#l%+V*\k2wsaG"P'qaZA-nehۧ ƶhq+ RbcV1 EWnry1{lO~ncYt9:$v)XoONd(B<9wz̦GεݵF3dbEA&$qW 1Zt}fG6ZNYh],md0:>Na J$P 6$3[V؍CWNQQu՘ B.\EKgE=]b' }JbZOLӭ!??>hL[cJ\񡡭*Ab ߼͸Ğ#cQI(u"pb)rcr9XpX8( Q`@6D@m1%6ܴ=4nl껎&$k)=kbyDlBļ䡵ɷa%qіe]H|(K )B|a S kKJ_ӂT8?,`98L$2O;"*[철q_/y?ǯmQ l M/3`\"E,D;kع˽qEԵPҺ"T»DZIY*\GnzȖ@;λL[/vb%|!lݶgԙ zV_ 8WK/~sT*B袊ZvY\s-г@6/Pa{L^y3 -aXh68Xŏ+EH\3Իb7n'/LqAnW,SbW C]'W@v'YZ"Pg:sY2VH< &@M~_E##J?CZLkIȬ]ƴm.K]꟎ L] ~/'k aT0VgҴq?>lT5%}CRe;_0<{.1 `#**3\7lMW WQ7pZLj7Kucom| N܇4O0Cy 3+I̼B:ӊR[T뜳<3sY3тjNeLhM34$25dTAp=̛Ol@g]w#i1Srϗq"$Rdf)Ea3qnmcj/O{ 5 P&!V@ε湗0b2֊Lw6e"Z).eG,$@]ѭ/Ѭaoeoe-a5AcTO/se(*e/ wHWmMi&@yy 8$vShKf{,Q=##GVT&A\z"|E;F]o0E̠?w׏cQA]'~;bB}dϦf} iҞl) "W<木fɤ_X_eq }t?~MZ bʱH".6N77=3-Bi8]v+ˋyJSXqQړ3/7Xi`J|Aa "7JM|e8;u5븍6=eZmVY·PqlVJBb1qݵ@]9oƙZuNELʅhM:$fFe&u g1y1m_'KR~EkdW w1f 85zlufORth( ūGJ{7͢f!(ZD2V_xl ѻyz{i]R7eZXnKF I mjۿf,MӁ&yhBR$KbG" M&f̆~˹ mfm-NVWz˳0||[ ,CyxP 0[-`sc6k-4ҍt.(}u`q륏S. bxD@-|P}m =bݰ7E-PCYq!oFbݘ)۔ \lA'nWe4 &۔q$) [Oaķxi<%.Emsua&ZimELиYpQjc7(,Rr6Dá#g0>cIbxxYlmo7V(;cJnm:An37.cj6:~B>ɰHwߓ@bvȑQd!&Gaq)qӖ$#JXcI#@( OCNұ8m߾;qaQ-b^JFKVDR6VPr=(* n"[f]2:𻓛VX,z|s^ϥ"  zɥfvȉvcwMb.mã.ZWm0WԒeӖ@3r .Z~2ҷ zS>}XyP[h$AƐ K Ќzo0Zo9 ]dV">cVS?D .6GmRjbhsc_ 8) z{ʸ,QC-7.LOy}ox}OjJ.$\ޯs3 72|}k%T+,C !_߷^#;.9uԥ-ERRg!Y+YvUPR6WN|z꒲lJ1rns#s=\#D%~9MaQ;c~]UFE-ibɷo #h6)}˯K/+NSBʊ釉jVrQ2rL%C:'2뻱['KkKȀ!旵mVgњnl%6(-B9 $bIkϮ+^3r1r!m]ta@%^ y{r%I@#[8ѦEIQa b'9;mBY.xϽTEcAudƴP*0OQB j{ oXz9=Ox3}2%Ot`q篒ʕkkI2Cw2M2硵yd~S# 7[Bg6e9AᢰX(L6jQ@*Co'[V_r,,,F6Z 94D'd@#ctuT֊9 /lK5le ٗR- |֕M&6- ԩ/]!"/m2-؈*Ŕ$ߏ^cJĔ/m>u \D0X4NFE*?-DT|٘fvoey%0C!);6ݠ7P/$O!ɒVidm:bD7|6ldf*ޑJ K /ႃ%'9jNau3\J̳%]{a?od~zmPkj ytuƓ5ix|Z$>4|zx'\0C{w>ƃ >d'?DNPN-9ʵe)=+Ē>uE#[=%K܎s=O3-رZۍ-w33hv0-[b%wn{f^qFȡh;^Ƈk8*T~2IT=H%$ 5e)wT~a=ー),ӓ=)*եLz iҌk͚KfYL4ޭ`y V(&G M$`<O,r״Mrjb"+f$HtG.Y|t"@QyH  X2j vԛh_.H {.ź'uMy *#>NaݕH4ց] I4QhNh1?.OvYDpR( 49s$rd%_ ݗmZn˵b&u lKuIJs8HoU v%01PUSdG m r~^L^kn x<ՇZO1nM8h ..rjZTƺ?dV |-Y@[C T9Ja!R[O,SW~$}Afo_z'6y]ݐrdue(%-e1Jp̒j?RW5Ys gDk5wqqغ~mv#I68WϤ =Ͷ ]uV5+K P~_a,#o>O7&lELNo K/kle=R&Q=\FRKFh%uQԃ~м>XW[^xG}115ihX!{Zo#q-!-y‰Rk<]mQ#gm67^yLg`BEs@lRUwY@ɅЅ57 ,HBPڡA1ml|H0#?_lI/~)irSLyl-t1l>#I.4l*!y$JL< a i`,9g5@|a64ЗZWno[D!cjj\ϱ$*#0蝗j7v<\-lpG̊ sI=.6%ߖ_kIlˬ#t~#vr2> y9O:>BMsyχ %'>I.J+=M.yQ!)zFX]McJ7Tg#FS\"$,ϱiJm.$ET6,)R$c`BGn T"*bԺlգg2ì5W:I3ZHe!rgeWR(ew8$@64('K$M>/]Cm̈́Ng[89Pq3R3 #!"1Ew-N$. J,+>-OrQco"VAEAm$;ǥՕCtl;PS)q?xbL` PJb ?}M4ŀzZ筁*b'kug$"D1z%}3 7|ȫS9#4sb4oЧL1v,֝c|ھ3Ƶr%ǝm-|{O{[4G )Y⇞*xp0!~x;/ݕ54<]ܭ-xc2t̄E0+,*f!&leI;DSV/YYA=8>֥i TÍURz$! >̶ Egxq#ox7Wj .zd(<8Ġ$۳q9-i;ASJC؏~ӷf-|ͭQouQ3;K+'0iP|eh _s71ݿdi#1ŘxC"% F]6-^'Y*0;03S}dǶ ЛԲYt `4\ʗ={ŏBz{➕e C<_XwHF5,>_ o3 Ē] zxyY撧FAvERQsHT\ }nzK8$ȌV½J.$u踸-lkc蹜8 Nɮ7̷>[lkLO r돋 s fr^ԵnHkkq3F>nBפmL0.[Ͽ< 61i/v,@ A@Em?jB}bD7ˉF="$2V=o0Xη 7HdԼp6|a"O, u4x})$ D4 ~hrbJG0{3V#D|jk.eI|@]O2FŖJǍˮ"A , Jg3 b@ &.њ\o>ȼOR&:xuz")z MleY$P[ $mjy0Qec]M,e V D ^@Jc3l^TI46-SFVQ/\Ŝ؟M( T| ޝJ=%IUP[XW__V%>s㿿:<FzꅋI"gYG:Ɗ;ƥ&PR,WS[2ST RBg}93".mYy*dQ`ٟ̚I?!%&0ys+(%e #'-<.r&k]WF kQ-['}Y'rD6" V qo'=K#^`T&v7oްn )" S$,$*ه,-#ij5=Zkfz%4 d(ϛ;;y32{60⭖XLϊ&"[4A5BknQc8}O~y?;nϿ`~MƢ?9#M'h,P y\gZ}k«XtIn _q)A kpT ]9ծo^3*̏L7:CuX,5r+G ӄj/{- |н`gܷ&սo_VeJ5ܳmNm0EFQ7¯2HB,HPaQ9$ վzZA_S0cC-'LuF,g8j"O<|{Y"p/prry3liZݣ׺u*\ZG[f;߄ۂ";x5 NQ)e)HBh/.nQQDپg /1Tr{]GqR Ect$i ;`\ ipL,:&S)lf!awyjQu^g}lJMEhtukM;D>']~!'`Et}|CDleX;n*%mtVܛ irEn3㦘 s6io_zѫ K1'=ֹ\OLA.кVjFhLDV}}C@ z`#e@ꯔ|[km!/.Jލa'Vxts{k d\kfƧ`%P{*LHی~KkC1L+|QN탵zӓLXҪ?ߏ?vanFK`}{4 G\Q3 3y.l<_T( `q%u;I 3bz=ah)bMbeRxS1RδP]n){y, sq`w˓\y]oT'cNW2G,~Bb~m6bW15o=w[$u]My݊Ь^gMw`-9n\jW85+OUS6yF ׾su J7γuY2Gύtmn]3J3n6--h[;ym!2Q)zi槦=w"Nj-)V{q}Ǽlɼً؄= Z{J7hy I)a].5s.I;)`6QϲGm$,>†gq0B*=ۛ 0.SV9ަ3,Yl s#VJ&,J!nKKyZW:{g, Ny`Mm%;:Wev2.Tsb{ruw3Zf!Ā-JKw@!_S&aБED\k`f+NdJaLX|ܢT3VLb}NQ\̯su d2/\&N~D4,۬2ĺ(lM q]!IzU $ Lg"pת* K; _3>m7[ʄ啥]/U:5x|0ϰ{ϛF˞؞{z )jpIYWPRzO*Y맳{7!ȦKoĀ޻ef^ ΁|;XAz˪X@9▚4,[B/֓{x ZpvFƬ}u gĴdۛc-(Kc;wt|k~uﮨƓ^nKX?ZJNy)\"/bGYL?_sϠݕC4,(+FpLAJ 2|~uToms&TP?Ⱦk>5!Y{de/WEJY&EZ*I1UªR1o@Q Hfb+(kRqR\GeX$!ii[FI{ShzB' -wfYƔ!(3̑=ODe)jNp2^r:*[[/b&+%7mRQH$2js^t@H7TguP/WdpIk23?6o'PP Ɔ XR})>Q<\ɒ׶Գ."@ j}xK+NgˮS8/(0n ?.e-WbAAYPTLJyPO2jZ;O_{^ [@B:N=F4RD*ҕ\7|Ĝ~"xKXw[VfNa2N̞C޼Xvb*,4ʈӡ^N!&(OЄG\[Y~sO͝j1`Cj4c2r"3Ǻ`(yӮ*!{/b%MK,aXLу TKEr0뵫d]ynDs^!1kg)=1@N%Fhq$y`,ftcwmW[lP|tp$MҴZL*y*~gqF9瞢MsB4 3P _ 3 T,Y%hԺ1݋6r\9 S+6{m +rQ WmaU m8I60,d.$F?Z?Ry:ɭhvطg#7MWUL3]<_l#ݑB=sGW̭|l{vJ|5A{Tۣ3?}nܮ8檌xY(M'؅w])V !dW(oA[J XV e^˝fB\-}[QD+ƬDÖЖAVY |&R7AZ0R?dL\/^ݖdIBfѯOƗv_ DP/v5k70I2[,'VbF- bzV^`3_]"w֋n; Pyem1Ifx~>67ލh¦'y@ֲFfIae ^w ] 1,! 4gD@ 4愆#e" seE9OܖO;$$}z, /L0D|hU$wH 1}0, nTWaWaj~<;>}y8^ qؒ4vB^HzAIv<9b™-qT!^5F}n篰{az!eO0l%^SgWaJI5z{ D£5 ry#၍|yާ@SD*hkW-KYm4ƪā_[RUDH*`+D- .m{<+Hz; .]tpQ^pŋPGɾނf%E4o^e:~!!E_?5Q} A69k*!#:PvCbe%BO&uNw棄h't{4𞱺WZ!ᚯ޳g0'ҁbħ#}{S >Vh"mX@Zʾ00tcby@01HD祫zfs 6Ffleŝ?'W'~bz O&fv AzciYxԱs{g"V yYR;R_l)sr> x𘂟9!5ĸ8 ͡DnfX"f(*!^[p|g(<1n/Լ_7%gx@qXr.qR!yQ8<lk#-H,^6ў"Z 6gBm݉L*Tj h6}P_JӅ^Di>"¨}>C_4DQ1Za&NfTAdEj}ER,] -B͓i&QVp`aRzV@Kwi_ `NHAL1%gq":^v o).OLVȨR5@eabLpsY4.CbHלDkȧgɴǶ־vlI%'9}imķ{X@C)V3@*Z]WUXۈ 6mor' :DҟnyM"'ji[dIHF [m}'hzwk)6'̮Ag/B;FkV:1&k^m@v"Z/l&*̂3䷲+ȯ+d1[a]/*]"f2[<YT֕WDtΠUvm@7g>.S>łJ:ֵDs"(c~_6PpR#^f vDQa]R~ՕbCs#la2^^Ql nē'M<<8Vbڍ(𮶿5**;Q%$BTԞ;__Vko;eMDc >1[Ֆt}xQFI_hr=+ )kk&׬=8T"OԧX'kJ!1k. $ 4g5ly&VNM92dNeEiAL.dymm9'O<ՌbņJdMCֻ`9GnܝJfIS}~̞|ٴ\r0H"5m"aֈ1Q9ot_\_{}qF y>|H__8JN\Iy\dF|Wg9U\G٦d3 !x&b#z$mZKro)ZO&rU9B-TZy)urTdyJ9-%x{۽=nO{6SomlFl[|e%I_BYIV,cz2 ylĽcjP`oMcS Xc_H_`ν,eh){ӽ,z"-kۼ1qoMnԷaSΜ74QsL2!=\l]w]p !=/m_2ɾ^3肪Uz{ME_PVVW jZȘ6 cihxTUU(~_ib~Q.p_vYRnOZѐ.뿹?SMM,֦y pTq'D*AjV_շ1U\]~ɓ1mCQ}jFľ֚hnrW^G||תae)QE>徔0bDfQkhђˬ@4TA-`0cQb!hٖMj#BБ5EEhe6N;YV[|DL($(>E,&eE&fƌV@,QD%Ece\(W<5$jeMF8kI[kj[';45K̶f5hw+whu7b EW{m}(3 AEmps}gF(Usj}S԰V !O Q(Q.J֕Є0e ƉjRccu_7j4XXc6" KFE2[IM<ڙ/i4>H­Zh*ѭXV\NܺK6a5v:Fkij-V`1-4t뎙 >eO{Cm=KdڭR2M_4s6fV+#`|ޑ+d{yI*:늭}@J,O w^lcuv½$&EKI@b$Yvȑa1_[0vgO{־~""&D_}o65ڋa,lk56IRPX$ZH5hMJb }?o0M%UIBuX]AS %Eu9OEUO5qLSgc%'1➣:H, 8=wk1= aIMZ^~I\WL~4s}\V]=|K}.WBؑQl j>2*g jk3NRGcbh\em b0@r5["e/f59!|_y3E{1-\ݡ3#\ҞgrGٳ;7T2 ~ ɞCT Άi h^Z.>۽$9ISC5mv -0=0,K1z;qf\Y+Ekk?tOAmǨEq lq@[ضHq9 7"xn4BM4![sh@l4I TR &bUl7ޤKEI4֎nzMm3Һҕ`eXD6aWk x OBR}.hBfCkK6mvl8eVua}ZpWn3/P%YhC jVDUB aF4k$QQA>~ ZsɑNyvA׎;TZ`vԘ FBűEKLST,0ٗDX.;K v1K%*cMedKb0pf1i)a]K%eЈBvݼp,ɳ~\Ў.vNZm7 ] >VOdXXf6˶K#teV%"cL'@a4_Zk]Yk+{o!ZB&|֖ߪʓV\4|(ps8y0ØnFu11s[4,@ʋ1O/]Zwi*1Dͪr፛m[@2!0wN91JIf!GjIR-\\m,0nicj^۾벡?tm%LȲ,U~Sͥ]:0d$JJ0\9K@u,E]e҉XHAI<YŌTQM $(monrYl ?Su[ 1o٩6sX=%{ov҇?")Wj5ʹW5V6ENԫS *휨mLnNH|FICҗLV֛\]rd X$L1X,,'?k݅V TṶS|e9t4@<4DaԈ¼AhO<Z*A+km²ءm‹y«㒣I SprP(Ѫ]S$ .!p,TAwDQ^h.Q7\1h]s\36E3P_E \dLA*nLa$w.{O{%omٶG.}Q{$L9yE=ߜBHK?Q?fُB%U]H@>007~,%9@4e}ݎs{>QD[z $,|Ĺ> ?[niDa=cHM%C|P@/MF^8;B%?/*ƳmzDNj/Fe3עwقωc;%̨ZVJC'!WM+m^Lk-.nй%d.viq܃?Y9=B}!!_&FoLI@N .r< ÆRf[nC=<,Yj=r^I'$&mdf6BLf#ymă)mԛmzFAN4X<lF}Xu5g_ɧ"sR7 ט+eBJA<,D~w{]֟"#udyzxfց +B|}Ѥm&;hzVӱcXYmlpϓ[=3%Y|5Vcjr<|(ozyhpXa{8w|WϾm+M>x|J>梨,_>=kzkz汒A)È>L &s\Է-SoE1;׏ v))Gohytt9D$"L\bo<5^UF jVG"eʓүP}8EV嵧H60)s C:[l8جVAY]I{~o\Mh>#n5*&%ơE6S-qF=y E,M4PYtД㍚B#$cWiDgW}e}u%sͤ3Zx9Ǽ_=I @?j<}}=:N}@HATSF--x< }wB(g6߆yC Ze #&t?Vba]OD(To&Lߗ Fjs ,$v%P+U܈I+E-nOh0唣^r~}H%~gTg"ߚNOCIKG,c)O6"I:S؁yA] PĐ0S> H8"q[r.)(N'WvyCk$" TOV{@>!*Io~OcL"a.ʷEqv7b*1[j2_nlL*4Ȍc9 @$Hi[NYu@Ja a5i޷޸`FdIջX\!*(D [o0Hu#!o%fK\cΩՍ]RK$_?#v0^rI4NMGwH b2$-6 SwtyrVc$3+˱˶d(eD&H:yIy\IQ!r7.g:)sqb}K2OCo ~?;u+S4ϮQ4 "*i0L$:++Xy*_7C̬RUˆ=q^*,ok-%ȼ?>PymfO("" LK /4tՑr+f)|&G.e@rĈj]AŨ%) ^` H* oxSǬMI4S!L;4YBߛ{۟$?XQ@_#akj̥qVʭ@?}550[! ܚhmk)hB:!ԡ÷HO?D4a9(u">'T'j֖3:%r,aKLMRgRƧJ8 Hz4e-o32U<:]E'$$│K5A3Aaΰ WYZ=yj5ZբwaU"cmx 3u`#/N* U\TU7mɓÕ$IfE⬼^v&8&dZ"LQ{AE'U}Ns8HP/%خ!k^{I{Glus H|$( ~O(Ȏ⶞ь ;mN]&kLȪF^S$t+VmjnVa#ucn.m:FFVHAjĕU/GS8㭳[CRDRwx3HV"'*j%'a2U8v[;_`|k]D"޻=o'E9eڳ(禳hxG JQ lӄ$ReBBנ_0 V[hu2^wk!!$`gȷuhzY "9,"^됋 4i޸E16?^DXHuut2s]2(I0"*{Ha'0$ΩbJ|!!$vmmٶ*K2ٵ[{VkE#f`NٗwI:wd̙*7msR7eOb˻;yRKgX\mLRt#*rHr&7wbSҤB0H],C]ӷ5ʒ39q-dbzbבsTPW\Īʩ"+f%^cH޻4Jo~F unbݱ:BO%jت X#hRX1_ˆ‘H>?٦.0ڴDƅ& #$Ϲuv>g-0X= 4rV{gz[*=;i\o X&qԥi`vP@`٬ɉ9|1GV"Ӵ,2v]樠C[◣`PuBcEAdnjv!Zw֌ȁT!IIE0Ha~P7oTnS,yj?Gm9RZR^姣Z8& w'hv_^]^~{{=N]]&i1(QE "i(CDiJI1@j (ArFZɶ;]f) TSH7uL؉D)΃$$b4ThHL=wL od BIҹc'" ȫbC#bt؍:V셭Nc+zRTA$2J"%&_{&`ƘAQ D*%\"/?h/i*A,dFLhRTUFMvkQlVTgv-cIXDj\V҉^3L^7S{M=AR]O/25 -.-kKD$lB&#VV]T*S;`ΙHC=.`̪?T5Lm ~mJe~/BBjPmF zӆqfMZy_5;x{fTjYa@v*i]uN# Al8 ]&jjӹap-G]ygv5=thE)'0:6B4Tٛ-;e\4҈TƳ1Tұg9hFE`@q|]ϸpVB>ytplTٍ1EE^Uh]QZ>37Z<\-EF큎DM,%"HJHJԭ(Kݹ.JJKkemj B&MvF0wq}  ^,{^=cv]U1Z3a͆~Nt>o~t:,T W3BI5e#¿抈''A?v;/PWM2!]ȊlnE% Ȅb9E>?蠤%-n_quc2&m2޿WűF'ߏMsKjt=i* ^ybQzE5k/@r peǬ,*&\JZe~@=;Q^ΰ[a ձɒk 6f%!h1F%yGA!ʣ1 DC!5{uxdQEp>H8\'FRq\r+ " RNґ7ه ECش@z{&خ=d*RnV!Ec=m/c #f{Üdmu]2\pWQݢ3k DֻRH(ejٛMy ּp;P9j&PE|=d}bK5cXC9I_'nӿgZ%ZX#hיL EY>C(s>7$@~SOt>1SY2bp!UcX ߗҰZRz|*(z'Svr{yaa l2)4nlP ={ը:?}x04~{"o0oIE̚w*$[qГЈeW <#E~c!s:UXA攤"?>>eC$\RmݮlL|I;wy3 ʊUA|kQ8HnTY]nY*0pP92.N:(Duѱk^C:MmD,SXV;ؗi3Uh֥g.$hаXݷh$v+F~KzG K/H .;D@R<{] FA?;LdR)Qe e`gY81az%YNg5QnJ5Vx螶k7 kUcwobbz txIGJ)ur]^Ċmv'NqSO0 h(arA HzBCJX <@(LjYץomJ>^ع1mX(m,Zޕb*,`id%IzE*Iu[T"ҢyYd=#wL쮲h$Qf9G Mqb4o0kvuZFEͫSwqi֯@$~>c&m7Tef(Ft "%Ŝ9޻1E24R#3OJF+o53x?dxID'f> $"*{gZMY#QP*y(RmBZ:r4&(M;|n+iȪ<X0뽯h[e hH<ƨSYUXk}&uΠgd˒7!^XDJRzKq}}\Džq2:3`nZ0x@Xq.q9R?C,+,+.f˭GhZV 1oE)mJ:uҰٲf[{BH}"BI'i4Q`"r7naE,`nSwv?'P5 g5R.}C{Cl a1&\~ A|̊4,o`V*,[1C+ZS^Xꫥ5qb"=ĝz 2fT萹Ǝ˭-SrEcHycY)/p(u88VbӶ^ IVhaĻh{?Xt4(.rB Vt\ZtMFJcCːQj NFN.PelU1R@67.I J 2hr@B {m}|_~mZ]i1XbDqqzt{ۥYZ]e9{G2-jٶ GC)5`*#YuÂ(̲[ x ʋ& ;[UFzD?] eULU uɜr=% Uѷ8װUZBQQemc!sy)23#55L+ҤK(lGrVbR2/ ط[4SjGWی- fRȓTIRo]tCm`}KgOMm8T慠+T5-"[)azaPX<܊"t5gJBR$QM2ތ:%FQ2L<i|Qa!^JV_ iHY:TTf':pGl˹䗲XY8ٰhOޗ}1-lE=sBδ8FhԐ12'_x2;2dU#EkmhՅ՛;I&#ɕ(I nKRƉ2#EGn#jA.lݫ5R9ziZ]6.QHV1&mZE(t&<ሉF`zÌí6:S8UܻHYeqDq](3rpRVKH)aG8g6HUvkErzI?#ewJ:J.)s;<9۝Uмf>e80H += K(;/]M@tcM%\yeujQ1 ڑ}?K)rI!j5$O߭>T֥nӴ! `DćXZ5ډުR.uIˈF((/r2/St&[!|v/χ?ߗ(J3ʝ,vueg6$f[X_$^#^0YxM3w湯)q+!qiX>2N 2/#_;ys|!$]+0( ~hB[14\/uylIwk{#Ŷ3SȺ`݉t }k9ƭ}O2F Ǽxlp[9&zvICIhd # 2}qowme? }fhꇊ [GDHŔcV #wi F' >7sťIB̕YY.dvmw9͜(Qz{j FsEr.PmBlOs2K7ƍ橹T6kV-LVA. iH.f6rp!<Qce!٨i-"8\]C?do>;#Dѻk/Dg(NqXi=uOlo\$zrIqEyÔ SW(f~"\ i T"UtUHUUk;!!V 0/H Z?޴nm#9b݇v=,QI,(ݺswv&Lrª: 'rwfDL" (BUFg*#(, ne2f[gwn@!i]<\UWqZئ4,C"]m\Y^fq@! + $B#~YL%Hou?gZ$-b + ݺ2O\a~Z|7|BI! H֭bRbUEDaS ~hHcy=Cի4B"$E`Omop\@H0W=gbtLR2 b<WKGR+ acrWV.ԋْVwY̆'  }XT-io~~p1AL6S@7VfjD(sT͖$#ӻRfhG,*sZmob) {h(쩩kC{ Ф]d!ް*jƅ!T۲[^kV$B(yPԎF /SUO CBk3kPYaGԱb~).&+Owu6-YfHS#P$p/DT)$I*3WKJL'(L8uݷw7k]` @!9ktrL%"~BEU<IkIazEXD(XUZ''XyLWmYCuRSD҈, @Ē\U<3âdZy׽xq޼3a'7 5D-+ C?kj )$ym`zU"YZ&QmMdqz_*PQR=%,.$Yk"sZg>aC% /ٜ–yAb2f6jua^Gni WDeQhH5*(aļ<,.QA!U^@mIs9 !$BBW, xTxa^UdZܥd+xkÛ7.FME1?o[P zسx-xTTHxF a[[&uB6얠3uU,,yZw8.y7f4Hy/u)ɘ @ ͬª(.ê7bP]V^Ó%3 K{qAbkQH &ui! QEA N6%;t6X۷WB,HbYK`w%Uzۧ/&~u=V'0/2}]~eID~_r)b"1.S]EE^\ʉPOL_b8vL\}a MoT!? ?t7gC2))h\XPI̞&_CX5f2Od~pTOY_=>様OVDED~dT\`BLEbsֶI$VQbVܜT{-l_e*Vja-ȈЦ=~8u mH$W/k5J\Ŏ*[rM=JAi&CP ÕȂF"ѠE6-h EjlHQcD -u KzlFɬux1jcVTt:miJ.-4muB(][ ҲNNAAݞǛK)]w:Jm+DF,"}OyU_S 2{N2QnVz}DcCU}$Vϛr[{I?`AD%Z\.v幎\O/(ӡRIΑ]]m[_ITTEVt8] kmbkLnVWEf %QQ[Ym/z1#@ƬOxoϳ2K+1`f g=w/*=$4JL=M|{l Vh-D4ڔ˻y{?1E0UWc|z z6V ?uK S*J&cR Х\ TW 5q=r򂜒Feyr8nUR-95#Ѝ ˴EAIjey&R *H1Y؈f$&'mubgmhgv]C8 0ҥo5}gfې2 \ARFh%VGiəy{ϭؒuE3"F" Du fyMY#9ER]&мyQFYfUUxM Z,$ aUW߰(^vA2!1 ͐TE(QI)o~q9/{ۥ\Яh3nbT2VuԈEsB4Ȋ4j՞ػt!%I*BB4#j`*PO 1Cu%P״FzQ*;B<8!nD07J=lY^M,܍*U5OQy^bFR&xOvd6YXYDCd++JkX]04#*&x:lٹǣKZ"1*/*DH_{m~~2M?r!S(˓\hb* H".y+h" DD ^yW$iX3+D!$O]Me]ciC(BC$/wO]3jf)2ē-@tKu!EobЦ |'IY!w;hbnx2hQpH'Iu)[ fkWf֓[~E#S'TnCUw;^WIf$C/l+Q;dѵH^+ :j{m&hX@I$ET*TX%[q.4;\ n\ʪqpָ"ˠ5dRK>~_;Q:~ZThBD0mpI@O_Tc:w2bskRiӻ? ߸*,NхrIr*)Dd܊䦞YhU{fT\ڍҏqḫfxkb!.F1)FjAZLz@S-v|(.ZҽYx%-"0ܐDQuζZL33 Q?)]y皕iPyZBwvHqsII0(d/, +\vH)q0 А3$hQ!GNdڵ[^MWƼ|M&ؔi)dLb2!(DrxU|njAQ`d^HVBw VIzʄ;v*Ej1,TE֊U%㋃ :F! A&=f̛klhj>dmӪ:\ WlԽ*^2VLa%Z-n"fF]з{޼6cRb,[Zh[6NW_U_ UZԼ|V>ڊ.WSjm"}UJ?zѷw66^U~ TQ]H.;q: 1{ul=2M *̉$ u+$(g yqBD9\K2+<L!PQ2sHrn]]Ha3(˗ܭĘf" M X/;$ C(h|Y-*r51,Zɺ׼!2 %EIT4&6Fy/+fWWF?MLShٵgNԛin?3&ڽl`KwpM2QL&hHvJJ$F6K".K89]SwHI\W6}8$%EmĽO1Y}}7ڏtC4*$`ՁMSuܫn$4(*b6ł5I2cHmEڬ=qE$ؑqE:fM[Ys[*U]'RtEEDTsi{O"yQP"7JTVwr+FtvSvLUD=2)&t2ԛs2 rҙFɵ+<;ֳ[嚅iV;]3#Djwc*F_{6Mn"4*B6#b-WmbK=6S5i-^mr22"[666_JN6Mgnmyyp$0y{E͒H;0Z.y9Q] *\ L(3!Ӕ\15ݺDJUtmo!k6薖H~uI]JYi%.ҟ @ۛQW]MEA[Bmkd~?϶_lެUjwlEr%ӥP}4|y=fH_IȚʒ909a4lMT`II I*<]V$ ˱ڜKj+zz ˢQ#=5*,iw_|3B7qI]K>ؿd\]mvW5mhw[nVM=m+eڽnBٛXIMyQFͽګ[.ˑb湯ymWѫ|k &8 B!3bHb#Y-@m6~b+WτD#Zƪ(^͍&#md?ξM ڝE^|[Kfe[H*TZ_%\]}+dvڦ<&@ ;ku)^B읃my޻*\V]S{$vcJ6k-3$zvmvkirujIVJ6;*:Z+!D&"_2* )FGqQUUnZբ_ZƷ_6""Ѭ+n]ԍjbUN0ٵ47nlE5EEa%,Z-K MFMY*RfRYP[vSNűmAFZڡlP޵=mYs[YOd[I5VlE1X HcJIDbL$%DYIYPVt}Jф8!l2T%ȤR$@ mnQ %u`,0 $9Y;}gj$Diym_❡`beQh|"Vm%4[rؘSY*6j[Rڦ]j26Q+HKTx׍zO$Ǐ{q`NM`å laf9Z.=aUØW6c7!={6AeHtI#LmWZ+X6*fADYMm(Hƈ|mko4eڍT蛰{UmiR֭64|n]^UMMIbsr+vmIQ&lI ͌Ec\mFf6AIDfb4Q%0BfiFԻIm˥fM7m7(?'॔}yM#dlT[Tc3V%:O@®m6h[PQƶ6JH un*j+A&({ka~] YB*i9($ɘTXVHBIVK,g3 7!v((HI!JV炛R'槅`(* k!D'8*,"dHZOAvzpudZvv+$v%ҖTj*bڛ]u*+b.F[#U no}D|j 'o^REddmKIA^؜e2ٱ`f&66Jt|`4ce 쭅,#vmiK]@sb l䓉 +s# j 'kQTT%DU ѢƂ)ĥcj1$P4cmJWsv)`0ʓDJ!.kjJٶr,$R@EOԙE5(2⒡A B:" ؗjM;*VcdvteTR# ү8*?Vݍ#:eJ۠G^^''EvI&6޺6]59!ٴmٱ&&lm bWTG_ۨdӻjZ(|\K]oHj*3cllȌAi ׍5 oyIڭb۪J(Ribȕ-U4օ PK jѪLMu]Ђ k*)D ?ΑbWwߏ>i_{ҾV ,1ZΑmKkmmWz7Zn&]əL okVn2gDwM]m{He%hAV*Ldjd'OR16/qm8>M2 Ip<(u]KhVO8!ʒ,H ̋$֕4E!u%C' w|HUϔ(C ;/ &WS޳*R\i$B$TY1`Hc.lA$!PjGt 8 yQUVղ[YK{$^^}@;BBW ݒ{'1A O!jXWȒUuvkr6/.xi`ڱmjloW9oB?pxNЦl^MsS6eڎ !uJҘ U@CTJӅmmѨv궂Y[-~շ6٦ЬpIȉ*QъIVAXVSLKHV + eJ4) *U{֪ҵ%+tG߭[?nmv|6bHKZ+jmh6EFYp[4Xh~yzo(h[^kjFؾw]`t]܃[hU(l`u,64]nY)J_wVU 3u&#l$ (b@Ll]cvz(Fn*S99uPTzvhqfnl"̒ X}d[m,nkE! CHձlNYNԤ5VvZa6\αݻ e͵ـ(u/nw{R4M}^tj+Ρk'rvk5nހҊMISJ(İf>㢇dSy@!2IG.)㈈"EQP3bv^mȯl*+*i )lԛ\4:YV龹\45Gamug)ukzY槹Q\n]yWsa2ZjFR5xʼE"E(4[y]1Pd F8;H:1HlZ5آ*hRm,kyͿZV-%a5,j RY'Ohls[FiDBsyb^[S Vj%:/YONmDPTm檆#&utV歍r6&I-T_1][ Ykr]m|:+i9XQ4 fjM]*ȫ!+n=OVS1'2X$JөUV2TmHʬj(+E`J#RZЦfH,I"Yw).qrN`Τ-14_XS6?6)7ߪ6ߐe ehژYoܪͦjsTe"9^W*Km۶W[S64*CajKk,EiRFjRޚiS,Pcf_8g v$:KD3bP 2ЗR0᝶qVk]_VdrM9 ЇPEw,z6Ti"$4wX)-O{ho5+#) Z43ݝ[/5g l6؋`ң:@2R) P$Y6QڟؗڿzZc6 ' AHdZI$9 2Ts2,$7؞T,X(V[itH)cAf4oT:iQ"6 P[bFlbѶ+ TVbm߽*DaJU4eZm<8r{t#S.ȕI__\ߚL*Pȅ.kʤIMF[mUUDѶ6Ʌ+ocPлKalFTF3e$ZJ-kW4 TjQcXQhV1`4Q` ut Bh666ɱm62GUlO0*?ug.DDT12"Q֍[iZ$UY6JڢQlr6*|;Fh6C'Jjoi; %}IV Zu&9^n6mZQ^=l;;e]ʹqܱjݕRHcW4rI"t6"LHKbȔ!1l F@((+Z% ͭZmbmLFVYJ|5sQHvfSLAԌ-ضr`V{ST4li*Α5_R|=Q.T:tDSilMQ @4$-iI]Xu|p)[`REhTɬ$ʤ)(+$k6B  1wb=n#@8 uv.ƚ)@+kd.ܺ)6Swj%͍lf#Vݻ\k/{#;ʝMHR ݻ67;FrdnF3\l8{ݵv+x=8(Zwt3w0- QnfhQGJ)mvʊuclitnXw3;;"*M۶ku(: nst:Hvl `æKclql`hN۝sWN:d)EP{{Z7ww@x}J q ^z njZ G}aa{_3ъ۞sξ$5Ѹhw%Sݍ㝇) sט:7snꖳ݋=zٽgٗ vU{q TOnw{k=#g u@}{;}k/C j^P)/lqYkgGa{U)ѧDHrel7  fn UQڃMPU-jIS`V =\t8@\z! %F OȔjJԕ 4IBIS@UOI5%FU:uۮcwٹ'.8c'ǮmX1@.۴qŵy\Jn+%m՜̈t]:!cHEL[;ԗ }i}r<%^}?d^foI=[+#VeOZkwH4OBe+u%XnOכ1v_75ksb$R45y$Gٚ{]pTPz6|@l;J_\v䕁RB 20+,QMK"]$t >\܍ƢVna;2SȦ Eg&wZ<63y [2X&hu=Gүrkv'.m_9nN[>  P h$hh^:Տ|]bI -gyU/햣}Q/빨3ZmQJ#im%sqwoЎu[}pVX0ǂ,[Debؘld)~>B<{mp|qcstj>bȿ.WշO4/1 韹^jh6|`/Lvй_y~lӜ۽[>2}{˻ز"gDv9qPk>٫R\wCإh%g^?Ykoڥ󗕆߾u?/ֿF۩w:b_~=6Ŏ|B}~_s`wV}GR(utfs4s'/2nkYAVWDL+DyqInziyb\q=N-h?~YGW AatZvK)t#wo/!,k.4j'._8,!@Y28 5kgOmYmYU>OiǏ|(8źqåqYߊǝb s@1[2֣7fA(ȡQe,iwd-wϗyېK\8~İ^_.pt|i\nfj﫫ާTTL,Ϋ\/cbLX{io7@o5]q̘=4يV3v^ (xJ-Ϧ.wݯiKVXtwͮWi-FvJk>Z~ޓ]>دj]Q"2TAD"m,/@mbax^Rx[[kDi@lm9"nI4ȹL[ {|ϸϾ]qAs"%&cca&Kd9$p{[P!eb4h\} eKȝ,)lzw]29Ν)ȳQ&q6KL X;vq.$sHR1 Pjf+bf,Q 헸|۶^-J/TAtMì F/v)\Ż S'm4v7bRCQ[.PL'C6Z +Cs'T: tV&\egE-s-L`c:쯯Zm[# ja+&}"\v- ȗ^|ф[^-E6{ y=K'ʅY[/F\3j5Gi/j_eSuI1mY[N(ծ[w "8icxPƔOs1 獱rMkz=:˨R|Ơ+vAخ3rMAw^ך1W]*fXRw=eay34FVVJgCh5K3i[5T5ԧ;kx(}XP*>l) 8!sD_\m*O3΂yݲ=G\(:cZDrzͨF `+-.PuòuG䄑zO.Ýz  1 J"=s+tJBtb*k?ő,I2K -A 4`_t浏2ރQϾBY$%hcměs)Mio 1)Mс+ܫaYYJч8/(O+.Hx:Rյ=fTlEcQw*4&)e;{*̈nhS"Ef[~~|M\}q2Q3 "۳G#TnS}' eEk soVyگ iKWjcapwtoy$5Mwt-0c/w=ρ^__ ъQCitPeI0fM5 ;DcLW$v_$dbjlGH뚾ֶaTc7 Z)eB*j5f""6 <̺R?iv폭5P>&V)Cw9il6r5৯k "ᖛB)rC5q|6 Kc򒃏qo#7Qt'%FeeʍЅȸO}BFY;_`kU /:'Z,άmi{ּ5ԂmϥZ6Z 11bfLn,?'qХ 4aД7ؘ,hq7) <&v%dZY P&+jSq   b!N30!8-,k^zBc%6O6+0_=ޟY <;$.Ϯ`W:8U/d2 ZO ʬp^nϟdmOR8n gsOwiØ*3-y-N.yGMwHcQa)FK)@a(E.7T Z%nD)Oi`;Ml'6ږյ %"ŢBpiRg +oγ:MP^jk_OqFghEESIή(MۧᎷwϦ)׻CsȖ/8O}QuI !7aaWH ۦhmtAgɜz/}kSL@.8ھGa:އ# MK O'<8l8dZDzQ#EDo꽿ͲG]#1,Q%OO_h]ֻLZ0Pί*Py[{n'YMAOYdK&%uqH:`4۸@/v7#}S)*^w%*{6CޢBmxG[{TZigjɅl"5T3I{IcT ](HUQE̡v$RGPb^WѾOaDd7{zeBQQsT&(V.^5t,s;:L1r,˳&wɅ3dWV9nKQ!Xҫ$rBk *j 4!MK"Mȼt+mi,Q)նeV!l1,g-#f}OHG׭ېugv66RNaЫD`BKVٙ46;=W߇$} @ " H%?> hW]a٩y2|=w,׮>Rk3 ,ՠWr !&@8mAX]L_/wE?>"ؤX)B&E^ؓ"PXc`0hCr$S b G m"ʏ0*c D&B@dx}LM.vMئi@eb'qμSűXWviԯc]r/&L8hQ;hS3k_}_|eKUH _AH(6k-w>aY~|3g[ _\DEb8"Aq3`u !A;:'\EʧWTw_nM}")R7NşUSe\~[! +Y\{Α2 2X;O[m@*ع`Z$DȲI ?/^u/Di"!=?k1 y-O.gDMlVTk#Q6l+$^4N)R %[YL;|z-m4ɜketIl{˫ h.[Ls5[ϒ>^Eim$|8ti`y`] )RXLk[E&&m(\w"oaC{ܕ zjƁ|H@lْ96ZA!#1Iyvo]>rdlWPMF_#^lBuVc%k.y]P[aIAHns)OMuaKg_;qm%&w$=*ma#i =Í6Fdc1~a~tYgH;! [";k3&ɩ7CR7ñq[j F0Ob@ҽb(xmH̯5\(? \G2y=X|fl/rډ#~"X 8ҿW1*#j:>ڳ+w뒫3<=K9 dV:O7GUٺQC];Fєne'SަT} 3_#QvHblQtB_O@RnфLkֺ(!qF]j|]-@"NZ@ĉ"pp3l̪=J3=^l9%utJuD&WXE:e0)4’zeǙ1V7uG~ҥ-eo\V@Q%Pcۢ6sQ(~ϓo\Vy)Xv\1g^êg> q3bbNK ěٸf3+3rjc20!m<ӷ}8ˁIAko՛,ֶGóiB޹Y̚^^;!$]Eώ[,yzLyfEi[j/#nϚO퍛f{Ld@=}K̑An1j۲ɲ&{A,t6ł̋eW"sZ\s21-,io5ⱄI?!dPNPcf7"`ҷ˵'6M%W_ɅAb\^o2b>Lv0' #CW2pDgǑXHo CX>2\m8]'($i[:cvW;h@!AD2}{!#m=%Յ$ͪ^1gu4 xIbM*=gdZTzXlw璊~zݷat-_'X ,d?FgpB(#fuI׸Yo':ihJybo}JZF[gH(X.ƌwd /)cZ*E}L ґ ,RY`y 1 Tb1+YJpX "Hy߄JH{ćwobEPFEzvH "!Mn]_Jhu.GQ#*3c&oiS2^>wב421oG",r==Hi PU*joq5J+]PR:; uM'=mK?bLU2"ɔ pm[u+l,E[cE (Bm~9&ZNjwYuT'×wv/4c_-,5$qR7 ~2NuVPۂ(C/0nsJ[H xX%\GD%3,wF;צAzm1=ˬ]ͬ%jb\ID^}4eXHPC<ݹeW"QX*hT.6yD4'Q$Rܚb9,GS7i?JlD)E?0"Vq{cޱJ b"@آv2m8py 2j ]Yȹ~lkm+s,·?MŜ2"urt *?fgM)o dDtLr\NYpVg+Z~' Uc_qC/+M}l}22b#$TXGrgv2Va2'uoeԉؐV>KtSB«ay =N2F66,Y tȤw7$>p !qICLAFbyDG*ďRvޜQ{isE&1ZiwxMQ^5Ԝnx7Rd6ک;iC2W5X5- 1\Byq}ÿD>U@j?mZ,!AZ&?c^k5J4snهҲ8fPȼSj7%lUz WrbpӖ|׶pC5(Z&K NÆ,l_3/V()ѭ%v/Z 5 3kׂZkhըm 5"Lf&Oz$Z]-zj:)ǢRjRq{Q_rJ>wke4WmNzX[㣺w" qf2RHxΔcR^/.:6wkt">BEӻ{^yC/{J_!& >oY3=.*[^Ov)|aQ-O.%GUPfd*BSYa`CPȧ(2iG gpHXj:HHw#~L@ P0m2y2 p&ն'wsQbő9\%% oE|42Gݗ b`ٟ8I}h^#ijVWi,Hq[pBⴑ6RmY-٠MPLBt_Hv^j[ϏMO7v}3P(x!gwo%f\ҩA"lcEweZeF?߷5JoRrg>s.hBXA:cxTA#/B$J ]!!}&h E6{vPP6 w% VnͫjT0vƆ1OSC1kSZڀ h;u)X`M3-6 i3U~*) X`יTЗZ,Q`/ %]V5Ư) M^8g ޾ՁԲk-@j]pbYI_V^ӉNji ^{>>ƅH 5lg4m{][8uJajˡk;jF۷LsU}lbG=P)X:f[?` A8]i^)}H=iE 5+`J&bcDcDVaƌb}:5/jO >'d`u/SMw򟟊G E * (ݗБ6ڲLcn/"0vO&g EOv#s§{41 % F;$V? eZD "Z}r59IY߷dO2>{#$? 'L:hכ,-:q̨SmwoTN #&` e@Uħbm|iOq0i\tH@Shȋ/\I'zɞq5 Z+UCfhYz{|+oDCDv'maϿ{зbhhѨTsJdz6/_NᕲFeqK K O.-I"D[Ÿ:v5Xuxz ^ǺpTbK*%y֮:cM܁VPWhHҔ3Y1~j JW|3mԕ`T=X^=jPl^:;tḿx'9՜qn)4@8"&~\A |K@uo`^$V[L*t;0![IcMj UM}7vUŘ0!fqJS.k}d@&fgq5|:zyZfTsK Vdhgrm#?VT+X aѿM/պ}-C8yIYd [.#\D⼵[d_oU}.'S1>kDiņlS&R-J/{mh_˗L$|'Vw<^i:;uCh`ضyD^>NUI A<0mrZ1_Doޢ)ɐPC0RJzDJ!.+9+="ěuVvǙ=l״jb+.e@1@Xgk+Xx_='S9X"fV*)IR,3;q0d*eE֋nO5(']i$N Jġ.W31!ǹOW0gCL">pd}I/XדGR{y# 3ME9W*mbdPCF1Ey*I}ܲO(7{Dyv^\ʅ={'[rvN$yE2+{f]{m{qurٖT2,ES,$Incłwp$ȤuSݙҗ̌J3]_mWӷ4OYim'#1u!Nį]],H_Vݹ^czJp;݀zfz0F,71WUuLQ%3H K]D"y$F Lx1F:{lmfZqpBqc{[ۯMmB M \LC7O8U1c6Ep|ci>nzwR* bbڻP6ݐ/B r.qy=NM] l,CFE{{$- _Bp..e= 5aN]Ƽ! 7bgSsHz"Y_m*ҷ'^'^$N3dVG2 ?zܫВ}27J HJF ý_bN1&ηj/mHZ_VmS";E+D}NTiTb0aSWp jJB5r{S>dKhtg%L^v!3E޽ݦ<gB`yҥc;Q@cMk0C3fOw)8wwkZQy`4wv5ek7==´jZC;4NiUcH {pN]^sf#)'=(RI]RiӮyt F8yh?؂vwmle)kRL1e\ Ν]Q‚>xՕ- øx3YMoi8"WH$"b,!(\Vm,מ|vBk ns{=%Sx>z5Lc OgntO];bISJoz+Xk_u滂Η>A@ 03F*0ft,xcڤ )LfT#0`q3.ԖBRYmq] +7XKR+W0(!x4Ҿ++IsmFQ'><&XnvIR7, %iz:]N Zw={KPx7׭?NJD J2:m9 JNudR(ifWj]iYfaR V'hśD:vXDAxInB{hW[ n#=z|2wk+k^"w}.]K0q^ee9#f]5K+ ( dQBM0|DURfP/oS$q@*ԉfG)X#`V]]4sN9lm\Ww~a{ \&{:TDά;k#PkÇ+N q-CL+3I5O!(ᇑևsrG\ϕ"#{w{mH %,L^Ra'[.FuYB_b%^oIvE3(sPY-9.B֢\"^G..qkCmX΋H̽?=㎸SnMut[Jj?& Ps䝚,g[ L+.͵ ƩNQeȤqq ռcX i(.iiV\a (̼[Lcj\ . ˑ W}j&Aj}f۽aXы%뛸{)~W{@%t,lk~M[wO'wƊ$PkIZ]~8`lkE[g|$, tz~g/ESO\O +9RR|+ydOb^E9M\ft=V6ܿDd}l=2&B-KcQ6 EzW!H6U5flM {qxl61%cqY`ڞW IMa9n;.tB.MرZFvNZd^\i\p|JEu>y,Pz:!eӳ&К0 j?ZೌWs%DnD'#ɂm8`Ed&v5<,ieJ=9{2k*Bt"m=I7S۶Yľea}5Dppkۋ _1{بj(0*Sc~~x%Dr(]{dO^@@SȷpOA@6tj@86&4 >a0%gSupeqtzvO% N7vP-L3~`1؝xKWLhхk1|*1YO qqh*/s(KV ҤH-=fϋh3Qv[{jkp]Qnqr̞-BŖS t.xN+"X#FISƷR_yɭrLw).CY%*N5pɼUIm]M[Fo0e9 .dqnr{7;4 Y#WgSc=!,m  @hCݡ{8-獽7obYօ($fmڻ 仂o&3OZq"N(}mԅo7ycݻ'~_Sw^ ބ_qX5n+:BX ;jSxXZWjНg{M{0fkm$;kqKuQrܣ5_-cG%eaۇ0-.ROb8l`7ϻS:q]ΆdDt/JPT4(H56㎜%9C6m=FO5gӥuoZG3Z3>^7w|FeZ쑍Vy +iu-MqeC4Md Zwv9LeyȞ9wW0!*%l}U}己/2H̴JyCn\GRRC9PܹYd^~c!w>rCXԡyz]بtpR rbv뷲fW^ؤBu7qg%a?QF+wr=K {ѓ4M')AQ*Q{0GX6q!DLKya>6E쥲8޸`oFUd6ln>gJ#U#>(H,28OT+dKN[3 BO$Kq[5EcB,(`ؿ/9^8}S[|7]sN<^NŃ!)ź]d 2؞5}^lٝ?f&?^u^99*^lZG/Cm}ݘK M1֑fɘ"@ᇱ2Wi%Ӯ0Շ 7mҁ<v=ĥ҇/u4GZjQ2K.һjeCJ5?^];3 =1mKv6tc2 {S=mϙˡ^0VYs:x-Ҡ<"s¼vH;7Rd1/kUCVPX7}/>OqW4{3;ڒUu9nV{9ōN}eSsM:Y7e/P,Wjb$W7`+|&9n:[d;M{;zCIP^ᐰn"Is+H`IRjJTbC$++-oa*+1jydN'vK'Lgk mGϽƳNp SDfO\\m!(6Ѹ)gfIdz#Wss%l_v0mhv9G6S޳<Չ& m֐oBvR.<MyŏN}TI2v">6P$t&RԅR@RsWFYQ=/mVmt=ĤC)\f[c|Y:v*$؇YIe N ӡvVNlڐlCh}=yJKGGLNnv.݉2[SiK3OqA]WQ|aMCXA^ufUlBgy8/p-(Nz\荈kbPrfT3T-m딟fUDA\ލԐӓj,f;q>Ǭ8'U ڙGYiX9yg7֛շ 4O]l7Ĭ׻)KeiMqǒ.'rzY&UMmvgpdz>$%Yt ,& l`zvVLk,zӋp~"|3?\'NXiՊkҡT5*KU*YZbO(/[m9^-z){C]-;w>nGxYcZ/4fQJ(ma,+mӴzLkKNbF6^lN{ X[' [/&orfjU,[ϿȚnR^F'?|%Je<ʊvb֐Y!ǎH3TB=[ 0b^B'wwskYo;Z]ї?{i;w*!?_3#|]o9M]aBOl&Oq21tQL_/6b\-]x@>mDcq@X+] vh/P]* ˡV?+ >m#Oz2+iFhhgV?w5BM~ݑy`jQ*s]do8_""GHI~(SEU?oئ̿h~wɲᏮXjERI|Bk 0y+VO CbiM0%b,o_H(Fkl(VHLPzL7>&۫\&ܿD2{q9ڂ2愆[E>`ԅZE|?ٟa?/mB(*e>xh;ݾr2;#ˑ_%y?XET_݃i>ͪܥ7T1LJJ640 ck}ϭMwb`X{,F4PmiHcKRk$cAQ>+Ǡ]YwrzM}5K;[dcq8K|Jrp]dn'@ E{#M Dw%ʃeT+Kgm~?iG8#Vq̴{{u q|'&( T+Mc6& iifoyjLQqquKh ks.0 x<#"тbneD:Txw= He`NusL '^DnVWgRƩ4(HuH ?&1OLIci``io~ݕ]l}e`vYaԁ/3+Dej6{||(3M,=8%#18!-:,eiHvdɨ`܂jc7f%^R0b6 АN`eeae-= =^bC"hY:$"&15 ;CV=J.mle9uK;Y%@v\D ;@ꄤl}2dyaZQeul.Z W 2O((٭ΰRXlpǚ}y <4glt2%x:'6kL2ݸjn7S\ڧX s\˒F1Dv5e^m7]R@=mtY/Xw[maj:|  RMGjby[E8׊vRəY%wXXƿi};Yau ]]2ЛUa_x^/eF&q=:^rgeWIPLѷ^*qb){cFyчt|[ϻӹ _S$1|9l}_0 Z[p({ 7|/y`'FG NƭGvKFL|y)" mpג!<7bٗ1^'q,Һ1|8=vg0$Qo*)bbssM-)cDz7^q"F@6eN6wXBnFeZo__ۜcc)K|&LQ@#D߿}ڞ޽wwaߧo˼\-^}Q_A@U DA%DIU1P3QDDеL( * *h5 1MGf/I=Q`4U'mcX*6]3'ϒ4S׷U-(y HQC4<]N6” =CH20܃!C(8yP- I}9TzhС@v5H!LC %`r`;6@[4tB=r @+mdU#&cX"Fćz4#>OZ19c!'K註Y80ë] N@#H҇Kf Of~] 'SBiWI@j" MSDOP2쁉ZArÐDAA+/bD3EQ*J)(j'@nNyPPB̀0f+P;LATQOIJ".cMɈ1'Q'DICTsbJ(b!+yth!`xQڛG 'qqcLjY-6*)J)hwuTAMCTtfEQPԭA@V,LPAERSx~)6Kajh$HťiӉ)CZC14 JKI)))RH  HД-4;k1!Tzƪ"{b4ƈDY/mG!JN7mQCY@@0)[p(D9QWNcݢhĎZJB)hi&(J*PB"s](P0[-DU@SMIHQTAHUAEa(u4 H@)P!ĠLD'@ #BR4!A((hY$ (F@?H@)iȀBP>~ ))CAD% Iiq!KZJti Ц"BU!=*r"h(FCyUұ=*ŬE46("iG1)(}mH/<-,5'T)<**ē!Q$EBL*S ]" XQLEQDM``& !((b&J*ZJF >@CI Q@EE>B@4@PLTQSTU$RM>Zjb fV))$=EH" 9ES8bD`@eHTpdpdȩ"aPl2LA52MPB\ pʪw슦{|uGow9%r?>ߓcwm_ų3m]7fDuC"]}阷2T)I7j[kuôM5nZ_qN{Ҹ0[-!Uu7EL2cbY\'uy}  o[Po/{ߟRe)H"+Fv5lĚH5(h@QR$d#JS2뢺JaPaΞ!HJECr`.f/&|{iY_z\KlebOe;ho ?60H '& @#;н!XҖ@^}t;q>[5RE\Fjl\kF]e-ːM4e Ĺ)tuZ0P+95tD+[E\آUEX TL(NhUUɰJZ Ut^E2M2an6j))Jj * bJbJ")& ")#lITD60ҧ)H4tJ!ZW"O!G"n%(hSLtQl1@f"J CCRV"H$-al>JfJ_**B"$F)JDiJ: K 1~=r8fYaSzdf=t (Nft尮+p73jOvеCmv)2\7RŕJMu)KMehͤ*=y24Xz莦VՖ!U z_:ྵ \[,h̔Yh[L۶xX␄f Bm, SZM[.BIgĖ \tG6;9Q!Rݟr.xqe]z!{Ɋ7yUq|lZ/ eZτ¼ú0dF~O{9jsJP[*j M6qLKpIy*:Fǟ*T6d +7ylh8F#w$j4}g~Ͷa/ YdӣWik1j6FķᆰUUJxts}?3 [/<mIE$&~ zY:] &^J[kaXzts%CzA^.m NsE&EbÜ[ՙׯףVE|;l>lg[n\c(x$=г W<hM4"*^xh&ٲE]@ªO)nlxl׈$jk"J/A@<p[Jωm:"7.̿dXIv|ۻ˦hBik ?**tU &)(B Hj ``߻tj<7^UyWdʾX}]!)WˁN%J!,\5edkIBO 4FP  F5\?lM49,l[g4ԍOKdzQ<ԮlE!0’.cJ_Q*K¢y쵅ӭY~=K08to[w ȲTDED>mQoYm^ӟn-/f&Lke{jAb0DDzS`g-$s9DV)G̶ y΋Y^5D0û1Ux_\ncH_x-~qB|q-s:mEKE꒙Kd7L{w(E2+!CBM)_&(l\7Vw+7PfS•LsgFav ˹lMb B "(2r~LΈro8oxqNriUУ8XJë^o;cBԍY'SpJ:cugT`\kzI#fwwSˆw(}rcGXe|5k76u&$41@*0VHWJڶ-<4YMy|ꕞ|;B aI!u+S$rb^XW*AyBdSQxDJeFQx^B绑jPIzEIIl<:i*J[ytXՎŠ;ɧG'hF܎e3nJ#Q(P c?'*B`'EHneng>6sҶ:FK%yptfѵ[7 ;zQںJűH/ =ReY#FV0S04C&"-Dɩ%䊄@,ր`4j4{29{=k#ۖs9E\U"A>k/`_q Ch[=-HЭR'O4 /J3.2gF2U ([jE#^%{I49fRvxSjeZ mNKrtN,s>@pnc9 Q}e,BgMj:MI7d@@J*Q$ Q +,Sy*QA-^Jz&E鈆(pdB.dQT{3$EPQPTEr(aGbd*zEUe0DӮFtc D=C'E5QPRW}cYj"A|QUҽ/wFc.\QN{*8yФUJTɦ]t]hN`*)GUN iz>rbOErI%[mQGlF'k1]J1Qy<%* EALU2i** Jh]Jsq*#OUUb$GT`;/7PA""Ho8ǝkOC)܋>2u.z8MOS]pܠcl:jY'Hm Sj V b}[7ʈ¢j((( =J*()((f =JS긦2덌%K@y8?\iRtր()J*䮞!/w9A3j(c\؏@P_TOOX;"nݿeۍH6h0l3u0Ժ؜wNsҪ:T/W/YI|&l.Kp U*K|G~g%/tIf{EʋFE۩/mxxP"Dˬj0B;0j-ςb`GT3RTqݷ ջ6yqyn'a#)J}©QZ6-ȡ#rJz(޲,5zJ#J[ˣ5{T͕$?:3*f|WC7dޣ!`V/r&$z5G!IN5{]:>Rb98I撢ZUF(X~qJ:؟B\`$~;3wvU2+nJ->8Y*y>Yy}ŘyzYMx8,=Ie`Xdyic7g9 M16& 6E;xqf## ok(6XKC4;24]uaC!%UJ|%fl"լ%ODi}Iyڗ-]۳I-5MOD/gvO ^1bL^V(J!%/f#%.},DkOҐi) YBTs}a}J l(ooTR"m[|95&=u8e޳g{SW3ЦD^KƕzFl)jR&Y36[I4K[ch2sV9uνUT= TM9VPl@j H/OCtK [:ۋU2| P^$Aq-o"0}%'W򾡒rE({ꕘIN_)(sԹ^ߪ/]B^$P?OF#t%f硸TDdEUTXx&@yjE2nWA(*T*>3;=M1VT[b]#A))M)L$H\c_q/# ,4Iҍ&zܿ^TȪ*|m NZy1=,ݶF\֕T؇UCLe/Տk]/S #@WW'F]K)7HDRhάUࣲ-0߽~uny&pWX`jT|2®JfF"7*B $(=JQIFJBUv=P̢ nF0GDrգǃuዥQŲEj}!Sb@AR:YTn(Z󶫔?$VPDPUkVDPٯ`  [X) *^/>`+VdHjL- -U0KHͮ聪 .䃳I*IOz%IoOt`q*/xžZY2FxBc;.\,q!dHal*dnb9;sW[;Rrcn㵽_'2B[_tY7v:&{;41:sZi.?vy snהj?&HB}!$!tFChvcq:="Ü:i<є3Ea> )aʛ7.X HBVj1Fʺb1qc+RK*K\.4 ޱ)wvٝ샳%ItygEt)Ïczfф"ņo>ڡ[\8M3ǐdhER9^tJe<-|l&/Ri ҅pi6|F3}iKXfVv.{crU1wXV_Yv Y5:6 eطԼwex⭦^:o@dE!KSy2%@ue![K!W'ɻH«ʣWӷ9I8_Wd"ާ$aˍO%JEo?[HfLhe_zo;hEO&qڝD @Q4&ݺҏ&nHH0$FҔD6d-my%1"՛$LMH2S>b$ I&"+uK`aV4ƕM*7+ma )fU.9W4գyWFTqF0QaR)6:kSP##U[YJuwÑbm*\S4+riM6jo[m}It.sah%nQk1AHe ẓ́Jqv"]V@U_P!| R ڊӸL2Bm ɽx|SbճC%-.[nͷdaqE} wgrw.]D'?#uQ,Mu]r6}B)X0C @!"j;M0`QO>2+Ed'*\&j1b1abF$ x}\ZeUb޷晔slÄH '~։\d=+uK: Sԧ#s#v%11ZJۯJ#tfeD1` s9ɺs $7WCNdK{JP".dعֶ:]Tኧ3\3uYMk-Y`b5ofnmaILS@.\鍣u]n%ϟ }:<͘ciq-0 $3H9RhVRG ˳YKW[Q&][. WCA$އUƤen:u]})5DŽ^xXL|?EE=9qB5W;*垦Bf])aH\tJa沜%WD"2e$ q=)m\STk֎&؆BFi|f&(co}u߹3mfɭ79eE%߿"l &bĬL5A۾P'tG>Xڀa2۲Is)31vઌz9vByjUxjR`yUETZWǢ(a>{c:,+jvkuTS!֏Ez:5EREFˢfRy溉hnDVƺi}/^(I"O4h_| p7IݻSbL2صKj /7Efӭrs vŖykUrlE;ͺ\2hZ֮6"r snAz@*!U'jQtOyүZ P(A k |nYnO}zh;,D)KZvےAӎ]I|:,Jㅉ$Ç#-M;Dkވ0$F@tܑJ,-qsk1H(DB[ַq:s+ϒT'.7V1HF{{AST* *<340T-%h㻸!A.KTOvV,]aW @bIEE9Y j(b(_lg"KyQTQUp9* cTe&PZEh RXiR=b 1yOG̒+*Բ':EzW+ڒ i*"* 4HQSSED-QTm" ARb̈0rz$ZyJY*h1!֪6y{_4J34 &c6K}Q>*#{I2D%cfٛguŵkk;+VGxqvD8kZxwtEma$YoM=hjimֵo+gK csk*0nؾDE*^ɐJ8㯾 .l LUL/Bbx =QKvo=R$/KTxl!U΄jX-Rh:u=H,X(ScB>\l G򷌨o{YtW*]Bљ wsRg$̊C1(  NSʽ"agx]=C:*: RgGԯ ,,xSR6HU^z\gr IL "L#gdyٳ O ҊƘ"`RtM4EKլ1jઉ;(g߳%5 Fkp@8=i/H9}:N5K.1 c) &LGZVi{1l.d,&kR,˙dux[1M8w$s+U̸ZUPQUPN>SuD^zxz<=RO솠h+NyTkHvˤJCIЇLP0]j,d4hCҝ s#JR +.:@S4K#2{_JJ\4iLք!@K JLTR44)T*hhJ(*" Jh<E7DR"#!FHH?~3)i7l2ְ&љ$ Jɥlu8`4FƋY].,3Իj)G:i@5 Ѯ+k] E|厷3Rf;n.A$]b.m0MIo[u -AW[5KϮ 5m8̳kJzI` & T*H݇_]E _WbfŭoصєB%]|Ԥ-,f5">f}O-=Ye#sq16)e8T FYpv]Te u%5ƅ͵w|]Yk\Jc-sv6H-J1c Wi"hDbIcMu,{ewl"5ۮU-1 " FmS^I< 7O/".ңR׼NwlěJR7!BrmuX:Ar-Xn/zчo ,բ+ceZGdv ںI",@+9(RMBJVF"[5فiPYkTÝ%Rcb=ZE=K弰k^#$('Fg5:(x00YTp[ }[[$!%cEg{)d%jRm([S=}:ڈP=O!EI%XUjkR:ܸQAUrF&u8UtGa53Z3PGԩh 6AHBl.[Afu> lE|6<`u j|]Dڋ6BiR\T2$=RVlajl4>P 1nb^:ӷw xIX4it8[[9OAp"!;9w[E_6=J$yVv=ď&{ Ѫ51l\\5хκ몏 '~ܸ떂rbzVJHgv Sp))2>30CG1ձ$E]a njk⪇>ޚ؃-br4̩ļo9苡!l -]WW\=ByxFeD/]_%Rى"֒ "5Gr:r4-E5/9=5(f'v]RQ3 L),B= Ė>8C>LqmLVμ]& >V*ؘF$$fZF,A<Ғ zMZ@{zꬭOZd`Ļe0X磌B Чغ (bۮU;3gn6s^ 3ٶqn*"̗d^Qӡϥջ @!OJ|+vĖm%<^"u`Ǩ["6>U|@ZHjoĘu2Dq.z`LDv 6WQrBcH(ᔯhЇGB!0SyZ Th% Ahv_U=*fZ<۬umg"z$ "r (H;択yߣ`h{ja]Ն"BfEnDAQ͊mkJecz0yYho{QZ"uO#P+-즺dzլz&KiqC>kn0"u \9L#U:.l)I"fX d0)l(:j{;0ȳҍEGL粏/sW%^C:^U$V2>e)^˳DE k[5*eh]G#umwBs'9̈&0Dnj#!KAĔMEaV#?!JBf |U(Jj VbbT)ijH "bu%K1*P%!h"`(yd; $4P}q,D aV#=n7m+Ob[6Y\c;n'ǟP3 HtgD9]PIH2A@D(4'؂DY@?XƌX= *hrtr(y)D+eTyFjjpe)" )<b*QhA .O7ǖߎcUm|aB2'1m)`;h4Wū'DUWYu`\Ny Ej&U o>5C5h]iFz.uC+B(9oƻqwzӸvC# IA>W]poޘPHOE QIy vf|,YaB)T>dQE$ ywΗ%yn mmʱf٫Z5*4=TP2dFfBmlҬ OCҴh9ѦgU6؂N)D;:ׇ{'R^VekMqJ A,'Φly-[:j&Nu{n&uZGtbf[o 7b]KdTeT'}{wՈyȤC ϐ"4b7<ir&'jpaSn$^ja&Z Z=Djz*9Ev3\:-9Dg'Rѵs6݅^qRI$~.aE)GQDQRMDL7DPnAx^DPP" E^96x0(TѶАU<0E8m7[%s,/Z0LHۍ-!+o~vHqD! {= l2.SQJ\q&vܱ-q-ch@C+gz||Z \@&ѡ 2>z F6P"V\x2U״C*ryJiɭ9:0X # J"h;b Xs$Sk& Hr#趉P=QA7"~@?~/4]bo :ʪ˾*s_Sʚ%ETP^y:$DRdJ9ToiREҳDtʨ)fH(T!Fc9DRNaHU)KC $_EDD[ZgezM#~kvT~ywZF Ң/֞dLlThXlF붧C3uswx$ *Jޟ1wsX ,&Mo$VOՂ(*sRE_ W/L՚ZԽ%TTIQT5Z·Pwwd$!u! ǝO}wm|*S6Y)vR_8cb`1Iϑ d44́jp"Edn) .4tYs(\I'ӊ\O%Y#XcYtrTfXXta5\6iE lA<P,.bbm]\_leFZ{_\MDHRZu-ݵq?OECvЙ!EkIS)P̈*DB*%tQ JUUEp=jA^Yn!x^EEZyVI!&%܇EQgj5*]Nt2J='H]K2<"0B$pqo 5u6۽@%pDҹ.٧bE;N%;{ AqmmІ!2նۦ|(di .@1`^י0MISgr0s4u)34H(̌v؛ñLeJLaݓj (ƚ۬z,LpM:uwhDvk am$mFXW7m:(ʕLlhDjei-@'lꭴ5ɵb*%bVuy6ZAA}tk<^FZ#VaKScL)]Bf xآiCדKGj!niu@6I3Bq},κ='hW& &B맅RKUyb]RT~;~"w|"ꯦ܋4U$.%9FW,]mQ<A! ?{]o۶1[@P2\.iZf4-&V̪Aޱ;Z)̷ۣ`GNS:=m:u f.c+JZZBYmB*z-Ҫ`(>LtDDDH5Fml騗N-jIbj%R6CH#2UW~_ӌcvHXbd'JTOq{vs(f c"HM9y ^܂ѵW.{uS{֠}hW:j=]Vr)K !=\TBPJB,5Ju _,BXJMYS3kG-aᐺo ,Wf(,,3FR$$kހX~"*8@#+٢$QQV}duT{ٸ,}ʓCT"=J݉Vڋ%V"5ƶ:h'Fm43+@itCʈB-p-MUI5TDDհfPQh.!jx*DQU^ᣥĨ4vUR#ml[DPIkS60m9ъ`*bNڦdXtU1&<Ѱ,zچy칻I%u#Τ»Uެ%1),&[{]m_}l{HO+ZFeBɩS.|ƥřӓ9#.$|(Dr]tzTTꊒA-#+!I}R84E#^rJcrY v5N%n"&-[DAеsW167Y|H'@`KY5"|bJ[j\3e¼'Ϟ>I("5*+w*]$aPH!P&ХUZsuX$IddKoí\۝zx}UdcNByu|]rjٚQI$Y,c6{kzꤩ*t@@6{ʂYpż y6ZɅ̖o.6G*16u9s6enݐ3 떶=qNȅwMV<+&8 #5ܷ<իol曛Pw{Y"܄cSm__|?vqއ4&^̝吾q\aRIV>ʊOm9ܢ*"'fy(.Iˑplm$èT$غ$u.SњevsGh0Z0ҌTK"NO(ʧil~q&3j66*"(y{ iM,v9̜77.cȪ(( /*;۔9H~fM(QT/PҐV83vXZP  q).ߋuZ ץu?ޒOB{wkn/!Y8"Hp _J\ }3˵39\wm=T`Pz=F 0|knllֲ>6`}cWm(M E= ]T }Y\)f|⥆1 O_:H8$% SGퟦ~GO{@~=DK E AqS$ԩHRā." FL,i,QMAذhȩI@)eC\UD 1wDt-4LCCGN l]6l6clQQP8i" ["+g%%@TT5L-UUDTK44Jb@*hԥ1T1D- $#ER uDI ݆# " hhM RB6ʎ9L)h( t+M"&G|3R҇jԥ4Cdc-|3Yl TQQ"b -*!JEm6IAM D !AK~"DQyh!_QTO@P`b"j(ME kH_l4T %"Eπr d5*E J@RMK X\]:'ܫ҅--Cy i UB)HH; @ 4Sdz_ tqMS ps">yāCNdB('4 !*ĥ!MHDP3E5DQBŋ~ $KKwm?*z;ǚ/ J9`HH09_?z+b߷^8Ob)ݩoieЄHa'S2B.{mx^VyLٕrg| 3Qš$7*5"51r0.lK/[hfƚȹ (3v4*R!@ KICյh"&8 ڈ ꅠ2Ѝ%iuQ#DAM$_:0=T<  S(P""h"f |@)ff"oU!)) ?l*`P4D D Hڥ)L"mx`O7HR#Ca CdHe$E%p (TEp ߳TA-*u_B|m D"@50ޢ*>Oܛ{sdo-p%=[18^G{Ե3%|OV9)l)U4KKRЀ QHA0QP)4g'BVj&,QsFES'QTxNd4P]\bTiI/CSCi *$4RѨ`;%*VԎQYYjBZ tDmS@!!X;cS iM;jSAtDhUtq=!J|-(R-1 j{uk4E :MЃ̪LH,ґCHCBD"IP>$a=*Œ"b V) &* IjZij""b( H(&"((*hB*jd") (fZJBb`!*J`*hjh(H"%iR(Vb))($=ƣAZbZ*2-RU<! QE<O5-"LQlj*("Hi` "'b% YPpR)#T(;h* RP{&1IQUUB*"Х ,_8@ A$P 4"҅*[ ^C )VQMDEGlAzA)b,؊>I*D$PP- BM5.ZC K]4lГ}z J24PvkIFa*e''* (B"SLQUO/,"*"D*"0"U΢R"EZUBuU $T %Q)hp42Q!(1QJLTEC#$2D!0 6(iSMMTTQDE1DUPUD4X҅1QJ($PT "A HDH4 -ILB "E(@(JDJS+V 8L$ERFET!RX%Ay 80E00 r@$"@<$!B@VT l<%@.eAU-"S%~hըOIM~F~?y $Hl2L:BQHB4! Jƒ hʥB14JF"a^@Q|4DUIQEQVL\親*J(B$4I2X$q R,n3T9 2=uLJ8DT*DОvZqcV$hJPJ Ԃб*ĭQq0@Э"vsN+6J&MJTEPUV)2r =0c)bJQEAQgw."uPEtbs,USDjj7pp45KGή&@!jO|^UN}v @zG 'egbD"a[9"P4RT !J#H4sPrEDDT RPRёDE@Mx/FkeSڇM LTA$ *2pҲ> 2*bEp%PAL$ 4EBR2R D˜d$% Ή dщ"MIHPAAHA%UQ4UTQCUTh 4LQN)CMR (hE)b()/r jaCДq)j+:h j8+c:h )ZO0j.TAc2% f#"4E70:% &wR4_ H AD(HЅ".P$PJ4RPUITRQTI1EB4DU)i]!!"Bb-dŬ a!CT[BhB% "4BM h ] eaA$Ut%P`ttJP @] C lE>0C*i!Z1J&"%\cIaI(ihH"U4wUE14ԯ5;(0P@ssedd3u IU J.fcDgxP!;`0KAA)@VKCDDDABPDI1CMR@D~ (Xih )hq"ib@&i(VJU4B*)lP D!4#A)AC4LRTLͨ +KmEff 0Sl:4"4)BsH&!)ppiH¤k֝X9 "J'wLrJ{W{O"ba6mwBjrTb0CTK0KD$Bl"lN @r IRUBQT@31"@4 UE4 I@cTDCCM P#BMDJҔ Q4EAQ4H5 1R^ZJ%`M"IJ" !WNU9=> .9(J"(IrFDF%UYPH" 9PS" P~^}]>t}86n ,ǴKT4D|?~ъ窴?~Ja'lm/;?J\_PH!@22űQ$UV14 Sci4h =[ 6$ +R%R@ P:UD@R/"ɨN3HWNrEzö $N@R1!B%E pN2Fک EE2%9Í0Ц W%(PST+BpBwMQAօ(ZNnD4ДAQJD5]U=!BDT\b]:k&#tbıP)~î-j(("`b**0*u+[cKAHFLf3l/G TAdhwCIQ|5ZCV@ƒll$# e)6Q>4D O O8(:=h%"46Vh %ӉڈZ@ Q( (jBH(j"hi) |Ё*8 ">3y % =%1-,K!DU$@DARDHB3% D)DF (*CVdh߯a&BDZn JP$%4T@5@q8("Ii(h"""bEP (4T4 SH4DPTȡ )DQUP i¦Z'HhwSB:y A5"LUT,QjBQT"Jt@ZZq 5><)Jh*IH4WlFv+;T9Ŭ T !EXc]@HH!%;*+ " 4 ~<--CLMQE$5SKDTEEDLPDTUH$J $Ш">dˀQp艐2,LʠHq )E8eꔪh3@-#_ǟ|z_ߊ =#!ʩIbV32!Д5BSјavB[e 6 L҇swl:Ia)JV&_[@4BRAk&L*B{YJdBCBS{ˢ*l{ 1Dx j(ζ %V#ç^)@Ai(BjUSPTsrCM(qi "VAfN:")*d-RLDPEQU$% CJqD5d34Q1I@14TQ5HD#@SFҍ 8AWiwm()iH:ДFM#' Ѝ(:T| XBZ6t=;m5&DJD{WBm)ݩj6@t(O$} F Zi F()J* iQ) *(()*)J e"J)Aj(BV@fB! 0ijJ:tEGGvrȉD6ACJ?AaAw|蠩$@x*B1\t- TP%EA5((R5`p"DEPQXB'EUEG"JʾXDA(,Gr䋉' Ҵ TADSD H3 B%DKERRRETU1ULMDT!F9&"h&!&Z:Bz&VZRS4PkE1 ̣0  0#$1$)"D %(uu5A@*0 4#@~B:twS1*%l>CH à@{: 5fDe(QyTI! ""j!hk18ALI Х2H*EQ@*R ʀRTHB\EOT0D@NC &DSa aD9eT$TCer QAy @)p "8T=?HE$HB$DEAIpj)ս:"-.ؾQGt"T@!HHBWBA!-! ?{Z\^XBgJu@>OJ7oHPsh@РDR@)V 'X50E*0M&!t:WB  A[ʑ15me$"k#7cth\+C6H#M s9@PݔhWv $2 $4A_%Mt2!hy"){NI%5@>pg5`;;Lb* (=:+Pi;瞫eUHVaǽҎ7 ܏ j~QPma4TQD&yb7*h) ޾'k>]u#_ ThDT&uFZ B&)(4N\բiƲ=",sTW*e6 ?;tO)G2DH-5QAIR!@(PH@(JAPe$2H(3RP*`IPPEDDPSU@QJ)&hM05dL_jT^*3כD4 j)?bB!:t:JFl?J*ZX)B" s֗c)JAh)( JBeXJ*"((*i#<:#Jb4F,JLI")* " I*" CP$PT' IEMBPeм( +BIFC (s)iZ.+(~6UM* 19T2H%EYQ)3L35"U TE*SB(VZ@8PDT0ЀE`4QO jhi!aE L Ph\(+(P2"( a(HP ! FHU-# ( !UP <TL1$ )*?bLdFB@ 47Զw7vەEu] tU_^GTu%vwzDMMHH]WuÒۻ44tFi Chumw@uj^Zҷ`*vQjtִkMSISSÕpuI#uQ;4c+tP[ZMۅ۱nm*ֶu%lfۧvU([::+(v5NFjc+Ӯ aMƍg^.u:7y@آgpR** ͫӽb<4 gHl``  D!1kw8| {ӾlGj};+wGۻT} V{cڏQ>k_`nU.*% zzPFn[ס=lnA,]7N[n-6pJ7nu7{t׮WJ{ם}>}ݸ/rjݽP Ho*y;%$hƕ̓su]Hkys(/y]{mg ِsl۶/94O[m--ֻJ fl؝c<!]ջh -a@j7g&0 al ü{G qx4]"K*Ri(X':  @H ͭ5@ʄM"-V!P$ ]AR[EQ* HPQP@$#iRQ5*JJCR`hmR )%"bM`I꒑6JhcBI?qmۮصeҔm=d-=u +;21yN>HFth`Q(p8!y f>y\!<G.`MZ~(mA11kHo2|ad'Nz>}ևDR~?ן6Ikkn~=Fϧ(Vڷ8߻_~_L_4&o X}ü|',=~!*V`:7?b#ݘ,F&ajǽ>U{!օӚwĉϻ?fg5CNu~__Ѵ~2};enu[O}ӥ*Qz3TNҔM~M94ߗ+FO~_{9| ժ-TFmnR 3^8{{xBCQȨ" ļ12WV+EqU̱ySE-eOs3(|3RMf()OVR#ؽv" +[>"vP4Vic֎ZO,zD7B|Jj6/ҁ # bj؜rB1({¯*dV`ڍqQ,S:؈BVщ&YJX-YČ!YOVa梓 ^ : /D{f(D d8"D$?Tx`Q#W=C _>j2MwOjAGif d36[MCKf=}O/+-*Q"6hpu凶¾t4B*o L[]TX =5{p]l;Yh$1Ä6lb0lFMD#8dW.k@cǸ(ăʥZ@o_208@ի|~^Vо8qpA4s!E4|:qZ6&IbL_fn+@؉Vc 41Oѣ&SUgNۓ14]Hfx1ٌV'1ilԅX՞FzcQ.iRsQ08^;P_7hk3ucz^srCy}1Lg3g#XZnMl՟%|qC9K" b_(âU3g~&gOV6÷Xy=i-hy@Ry@y O9U|䙋2P_$!P 'k2M̨\]J!Xpa:C#W_fHƋ;Y[P>a^O"`eCϘsDkB_U3 `FT:OɄ52K>by+|&JwR bI&&'bh%Zxܼ6` dyϝV"ƗQ qA_ֺ,U֗ҔȞ :0\bi$&>'O3Y8<-oY>olE*g@~2캨X++HNL0ϙU-\ XI*]xWv'Eλ|}O.+FUiE e8FdG}|Z+.!yХ!iVk[C={W#zg2T"RPq~B?q*4V(CQUM14WeЅB8F2%_ZddG͋/~?d"o<ঢ়]ݰU iq. zYwL2LW2;IR?VmCk^ŕ`f蓎#b"ti7dew儆yvkeդs,DžM0fG̞_"}9YDx D_Zj4z#PJ$u |cX#Qۚ:wxG{{Ͻ!Ǧsr6r*L{)2q3%Q~wC99Brx`,psΓ5E^BG/g=L~e/mi{y <[7{_y!D=ز!GY+ 9Tn >6ihM\ȹr@܊)q"s> jr!S"A`TiT\J,[e_h<E9SiٽH4FHa,,o[u@2U 4f~Ҿms)ɝpn㩡A.m3bX4_D7<ގ#,Y֝ F%dUBUL@:Ռ|fY0Bي/A!lZ-:ր#+!Ɔ? sLxaطu1\&?D7h=xʚf.1bNE<9-+b16lS+ʫ Mv}Ƣ9$LjK9iqB=EbdNn绛yI5|cGD:5N[S,棛< W1o$Ɲ8TX-CCaժu"(@4=@ds! `,gqP+y-}\{Gڲs|x wk +_ޫ5dYX|RGM1nX[$^5=Y笠H}x E_;I[;{>ѻI#EO <0h-p W*2L aW*l1m"? ;VLa3'wTSkuaB5@YPdzgHt~1D>o 0Iح<46⏀ >@ ."`_/7Aw1pr6rt`0XTONH, U?wl8\9VB A9͍OǬ\sZT<3PssG1 ruLs{ں5dBXBe Vy^y:)\T3+i8E n^Oʣ} 1s|/ORe~eS'ݎP!ᕵu0(!,Wag~xغ<5-WǛC2Ц)x7̠<`}ϟgj ?0T9bw휭>ڃ\@tQQzߠi 'drLr rj{>zCEl KGs"JD՗L!ߧ9?,ס9 }A~0a ;eϣSVuMBl[ފx&=7R8IR`ƚ8;cQX4ڤhZQC ]o j(Dr6|e߭!bm9FW-+|'kl_#|l=G>(s_1Slu#Y]}|ޏﯟ|wR,c,qAipB(r8= pĤ{mPfn π={ KdCV[*,iݲHmE)Ȃm;@Snge5llTJ@ o籽R6)YYM_c~|op>VCugz;߾%j?'Uquj-:;IEqAvaV:9uZQX![.sqɰ4 M^*.6FHy)hl@jJ1oo<DB;/huuA;!i4YB\m fJYc2-%WU|{@ Lv51JFU_S09#sum\1Q9OܖA dJkGfGFj[X`K=X7&#Lm\!?IgPTq{?fV93Z7\ZY^5~jϥ`(ckM6ߣI:!F&Dick1pR0%Z-|('m -ƦO,#B@Er)܃|mDW ;wex$#Fg"$2_o/ 6qm!a韧 OL>#E(CNtkra_sVY!R9?iAif4cϩ=(xKyzyZzj\;W 4+*tsLs`Y>7vAuqQBAm.! IYeO~~ëF0ԨP_;l.R$Ps֜En7='!Ǜ$bˎ[Z|H-".1$%y̶5,t4<>OFQ!Ũ(~}CF\[P齬 kW{5k~q 럂'?45DkO|dyB!;N0r'k9ՙ!,z)Gv*DM(CؓͶ&KD71~ݎJD߳|oQ[Mɀnöq|d;MB kdXmJV-ȵH~BML!%%Io0RdDG:Z7BU{>cଜNp$ kYFH_]Z,F1eIЧLXc@twjX(:|<Ԫ5'/liL"18 Q^bd?Wd!|Nz'ZX(sN(NֿrGPNHcA.Xʩiƅ1 b tr;ܷ%bf,Em^j,Y<8LwcAS;p8ǟc8qOW޷ݨg!q/U4M"mU{W wVjW%f[̰&:]yP\y^(mn1)( H86%\:${emO4U 'z=/o;0 b#5lwUb [Eb2(RQ^lǼ K$5 JǸ5l˚UGЃ,ȩ[vD9D_%ju,ב)ox?DRI+cmף*N6颱3X'0_t7M!Fc.f0e-[\E ޽}^8zH0֣^kjƛ9.nז|ݹk Yv;z EbDF1e?e ԋu՟uN7hcyrf4"o^ yݺ_5 my{Sb`4V2޻W _Vdqs[pyG( GCBv*<}4nCV+7I1K#$!m=[vSfARKKhWB!P<̼!8l< qlµ[bS[DWt<{zIW9Faz]+͢^;\6X1umnS2e6JaWXǯi[mu3)hu7"#mqz.ED"f2&bW˔$aYtkĶ4(W6_^ 1\sepJd~g jR%0{ ]7rr)(Ebmv@vsdNT9oD7Ϧ}wdTLF3,E$kӿȵ<ȟs3Uɦթq}=bahqKeb(ipCƺE);R: }}PHXZ!m3͞GμShgFVzf\>X@3YM{uD'ܶ>2Vᄫs88HXl{O>{Tl{`3m.ժLYOXozrS92^N12).m))C] tǟj'Q˶:UY╤L˼tk"m6>v`F.B|PՙAk>)%,xO[c۩:% ҈AֶfM1cdbRRU_|`D񄃟>e T8 XBqRk78pm++`J)봪m<痳LlStwȎe+|ﶧ'd x19ǡ@m_-&+b&69. 탺QqOz=]D=_bdqen}uVfdz>#yyhK%7{b`!3]-Z&-/)98ϛ!}7edaF^jPٶ[zLNsa"zeW<7@)'%"'L!M{ .BH-m8\$/~9{k,";[d%$Ug3TYTgq0н䜒?)Ns;+C׎=tGXϱ:J/rEvPR3wjQ?\52Ī/)($ƶ{0e2(Ӕ.fхD8Y0Hݴ}Plѳ5l 1+}z€q26ͨʖ䄍B<`SP y쬘#7"}}oow/AeDy%zs6HlQGc' g~EPGe3$ f6JO1EYm־"jF|m'4RVoc3!f9ד:Otof@;㺯#8聘n1 jr~6FDK=dqEv`%9Ny1$EMQdn y<0˗i ] {z>B||)[rdb&7e^0+e kK6^*GeQnous13L+l@, a`Y *,Fc-B:i6Uzc}oxJc8AIF6Cg8GWapHk,%g,@K k(cD]_߾ɉjE" pC)+VE%`rõkl 4[RQu4?Vٔ!ܿ4G֚{MާĢn}Yؤm+;1s 1ekSk{rؓl@+0Gr;\t td0azf}LZ{XC)f*l'vJ&sv@x=[gf.b9 ̱ guG] RcRnj։<ֱ&eP'JzPd.6/j/SZy0 j]gWdM*# 7xuݱ $N ^kԷ2ymll.MFh}lNM~Dk!u~ϣ㟿'@۷b?~%@Ϫ5Z 8'/Zwρ{\Q ˾ f>h k(d;P P6UϙXz!9zg*&sD\bX.|RA 9OǽfKl UN~vPqh`بS+&ڇE`U./]lׅݭMWe@/9+[K;]ʹky%'6 nō[Zxz<|sO܇_XݼuB]lj',0Bn"10,b!au]ΛGL=T=P%UXާ;X ǮXb#Ik_ h0lWJ;ݣ3/u$^JW`n+UPa R\fj6P[kjXm@w0ʃ[ e5ěAPa!kvMbyb=i~ۑTAŚ߿Z  @ !JD JXBOE;2sMuTfOQܽ/W|,_.~bLosi{-e̥a}[ėlTcF2{3πH8]"0Q c! D7٩,z0ڋYo)u"/3[ֳ̇9 S"Nlr24>?n!äiac[wQ Y$kl,V_{U~)EP `[ؓ㟁zdq@ ȿ=m$4XlV_SΧƃQ41}ڊ!jA(24+?^7':\[X͙CkŬt N# 6qDN R+ԫ,;þ`Qb?W^TV4A3;QB/EYc$+'+5*fXɔTj<(؛9_2~_OjOW:)kHJiM{ȝE64ơ(,";}ڞߕl?IPR462I%aN3b eKb j(ؼ{8@)Ex–ӏoRHFbbcz<5c2̽ftlM%lB0+_Q^<Q,6xQEæJ!*dIjgئQ^Twn\Z7EcW{w?yv+55ıT) P~kjaf2f3>!h XSwX\D<&jb<0ݐRgAE~: ><%O݌X3H7颙9 JǟQ '}fW48JpHbfTrCtƎA PA]gQ_7{ճnaZ<6&SE/mr*osT{}H@>ƃ,q6lg)OF^F(Hkq`qH^18S1##rM '>O&3۱S* 4~> 䐫`#nB M̺kV]!xJmBi|ǒ'Q9͢MٗuT¢T+&뼊"Ǔ[~x$N(̑kؕ=y=R)Y-֤E熰S{'Q PWDNɒ+&oݱS"S"$*ո0rc2|K)63zz}Ag|*ѵ͋}n8C;ڼh60mmx^mn"DǙqyAÏz0?~{פm޺`~:wL}c9}dcg8nɭLn{h.n,MvȖj5Ko͊j6ٮ1nCx7?4,qE+:x݋FZer,}ݙ&QZVjy_-KUU}14$jf81_(_6A] pR* :X.%lW hRe~N>җƾJ ivsdOttL^p~ DFN7n''Fu Yi׾W6 o5yI߫XT0^k/  /%W6.:SŮ/A9eO'*w/bϞUstg!%ݕwmG^]GD<㿯0E ?6_{yq'*'És5^g=o9TPmšCR[fr!++Sٞ#>q0dN}au=e.բE"R 9|^58υvuZ<+bgi5| )_G\@6#N##A8ĕ, J{MSK|Fok {*X(ފYUqɘ#m쒝=i-,kؤtR)ǘdszognx-u\Q<bldb.n 344$2eOߋiTX5g*]=!}yyHr<F)< ]z9'(AG79XN=nUk&u;ա%k&_XԂ̙Dw_ Lbx67oe9q=tT׏ _Кyr>|by4treF"K}UD*u9wN I,$a ^u2QBÜOM%+p1١(ky rPSA=ZHI?}}*r--Q#_aJIrW[R#ݹaCnǓDpzԇ[Vz3V^[2eW !p2TV\lb{>񧈝(tl^.(0Jd*;֞|cXQ>tlm_]=4IAATt-bxVJ }7tަB7tw<|ϯ*:Z[ hq#^)lNNv"c@{ӹ;^t ),/ zJ%PuGCVe'E皌˟ n|'˟Gc{ ?3ϫ8YV,Nz $軮D'F`ЅQؐz$=^#87@*DB-kCiu& NkPhu)@UCilb^M:}u+_*G ~#2_"|],DԄ+_hbIiPQ{bNP \3nqx\)N3*mvd#g؞= 謔 z{hOhn9*Ai {%\0[-g!3ңOlpDD213cb0?+ݦ>MFQ50Du,"j:b@|Ї ڻKltv爉/w*Ts}NOxe$IRs te 80 %1&;%?c?I1 (OOb5+U$u/Xs+BDNĔgEx99,DӐLs/+*m?}J"&gڦjpr^999?&Z{'{{= ?R5_9yOk/[HlTay8_A±B$I*'cytS֤2ywl5mWYvcA|xBcO?";rϫe S"ā֊II˭ ۛ޷ϦT.y(y \&W$#!̉tX5c l[J^\UNK8&yhV-<ņJz((!]Үxh z(FP:X\sc؆.bT&}v/Rґ-#6HCWK8=>uR{7s6Tb}63S:" B ٵוּ"(&R~?*59@>4ɺsȢN|xd8F)_oba=S+ֱ] G@ z)CR%Rd[J"?|y~jhOӛyȌI͹th!$FW鮁xk\z_ZP_mZũ H" .1)EXڰD3E@Cejfk|]D,y !؉!,_fV-Lؕ4EX]PZ2IQlOlhx`@%9`&j6<$30•[z┣[ϵi&xŋme޻cd}vuDMsX۴c鿯h&?oIDE5Mmq]<`u3l5ϑJ)%.}ő9<'ID%fg | ?OQz"!*Is;Rp!r|`q)>YcQWgO~7/4gMP*Fu]mW/'k" Ǥ%"v,P+뤒YQ} \wT;g"+AE faP["8BY8_땶mm|kWmΓEU,?I<_sy_g9k?i6#l27 +=&">v}>g,컘^Is~$`!ъg=B>,i<Ƴ }II*Đ;Vu14gvM c%cu5*y<Ճh\]dč"aW2}l_ >9L|\9*VQ6u%Esd{iE`=g9°+"³d +^mEaQw d;;EDNAI˨xDw.!FO9F"蔋Cȯ#ʬ&Ao@fyD{Ŀc%vYXCr;_2bfezx|Y|zU=5Bs )IrGg酹mfk<{x\RK9Y{Kc}@>lx'c},+Ui}g2F_]^.AO7ۼS C>T^@«=y"G$[Qeh2m45֜t]6Іk#Vw0[Pˮ [IPǪR yR,JynI.3J=6p|5Ii${i}@G"Gԡl~~et•J*DqM$XO\YfqC\y@Mf;=50h{<޶A)Bx^X2kwB]lId0z&?n)Dc+G[=0NŒ],`Pi.&4pǞim}{Ɉ6hL_rLsv\lO XaY^Rem*Xg޾!ͻ!nKvI呉l{f[4]"I4.Rfi- U=JVmޘzlEC£)bq/)vj@ /$)EmxƻTFAR̰ 0}E!= jҒݼoyqbWа\iiT%6UX\rYޅd$IB'}}^@EceNB'mTUA((/QhDEf2ZQM>ҙ&3DUPue2b!7 c}}[TekPFCYM}xSۏh_{unY[3x{ˍ7" 1#\-+sdr8)2(FD&s %]P HʰuWf5/ Kgd -2+mA)QM,\cg3o_z>MY*0l45Ү6V!f@V}qHO.I3pj+ʮXC^tbFһj͌]145C$ v;dzk"0B^Pձ!R  L (BcC")iEX^> 0X-əKmcLj+۲gZTAo[tnIS_3\nB0^GW)'*#&d$i~OsFE^5 #=4ǍլiO/F[qݽ(61e#U̖1feqXل)1|I숢5ߓvإygbJZ1*7ipLjʾ Ys^yM5q-)h(uHbƽ7z#ղ\ : lԫԥ("ezvt!uM䕁u5lcJZBf+XQϓ]T0MKmrKXB<էX\\XcVHum:Å mYc]iacU 2 #kox,/R3=JXky6[=$#rbɭ=eEqJ*1%q\!XOYmkdm,:fqsǼ+eN2g ھˇ o{WJf.k]R❱/bWWgʲ+X!Ul~%̸﬷roHl9oXYNI=q oFWmNsͶf36 f\RB<]YS&, )mR9e_v hSWl}H>l/(BX[=m@"gMc\-ԍe}qum=r,,2x|{P6ч`#MŪm#V&5ʸ{ˌ*ͬ|dxkv[a.C,nh|zHdoJ@5%Dvu{Pj*(_xsemѠ=lΰ[лڛ`Jl}mϺ!{YlɀSW #oBc޵Ttvh:|3׉[A`ޞ8Uڬ}*K*Zx:Ok.}|52F)tozzx} 'f22o+'}>Hg[:E8vv!ۨh [N=5(IErz+6VׁB"9a(oB:s٣6ux,7V;mR[6k0d[ m9ًg!s6glá>@QThz!&)e5al%Fŀéx%\j <ۨjֻO*XKغ`"V)^K=Zpx[jۢp(8iu)V0seH_O2VU06J+#f_wZyn{>y n)}Uۥ@B'I%<{rlVA?lu3W-LѠmfu;aŴ6F]-oim/ôGi#j6^Z*EyD?Ӻ]f5V-5C5V[Aw56V6 1ZڹWCw[e۪WXB&{rhG+qNfV1Q& l-3*uj\dьtVȳTگyzl;+iSFkt6BEk*5j+F#I Q|koT\lF1XH-ů4mnmO3!vh؍Eƌzrݤ F[L-jW,E.U\i!wUqw!-*-m]z5ͲMss;Z%kP̕Mj6lm5lɾSysM3tC8&c#n6b,c,%,e P1Iu&2()cf2hha=+Q[{[UmJxfۅNo]R(H2`Ѣa1"*jŶ#bm?.yXոnhh6-˚5vզ4-6,6MKnp}}r9.\!rTYUA^$'y5lmf-Y3!?)/ h.ەQy.؇eKi҃dNk4cj*6H- kXUXc[c ڶM[VIzUW-%6j1εɴYk_5-Zl)VmV}k7UEcj5-/^eE:@hԑQkrmLrLt)RF$#1s띬fҶ%mEWa؇4飘ܐdK8ĺsMUsjD4f֪Bh'iFْm6Vѵ'>4Hߺt,M_~9cETUEj+mfV@2FWL`@B$ dVmmR֭lSaQmSo"mEp:u5mQO٪mx]a4Hda"rZFJTU9jyU#•7K*Uu*8.&<[-J`M0˸]NRUut(r}?LSw@{ηq;89;hS>1v։L $EOw[nGE*d A{7T] Z nu!y=ކ>={r!C2dVJ/ca/4A|vP řxd#]ZÝn¸u)WV‚ \Z ̌ ;gAЌe)՛fuvم[mhK氳} M98 l {Zf|B/iUց{;=+ 2Lyz<-buBLvͿTBZ]j dR:=۲ 1J_hteMň+ON{}QjGDO#j=jyP~zŚmBEF,[ڪ?QO0Q:]zޘLIK//rQMqz.^ee#KI<7^q3d6MjO:ӬZl[vL3,uÙ1yp.o5WRY&;々?59U^8e2nCjKR7V$ol[ \[OK $@ e;O/1 `w2M|{Ecmܹs$Gd0 k{ş~n|y_==&ހ=>9PVneαbXL<<44 ?ǻ$'U^$Ʉ0g%9:jg[kB6[ȗu26Қ??(Iif"C$̋="]~] 30脒DֺKmopxϯD|կrS21YĭmT|CD1gp+/ZNbMh1E7P*מȧ4EE(II2*S$μ\fBH$f6kֵo]OerCTLO۷n]\d0Q>Ž4ڒjJj d0$Pg޹ 7_Edb&L4D߶emTKCddڦјjlZuQ=m{'pmz^T5eg>0B"iCJfif#vQVwvٗ:*]ćrE߻dO r4; 0Ifm’"#sD(yNKXK#^hs$Ն"L**ڕ2+*iAKikzY]0Su B&zT[V[ցu̻k[k<7B"JkA&`,0Yl"x^F759 uJ^Whn=bxVdkyS!ͩS2b U^HtXSqly&c">լ·iXgUoU|js$̍q;5:Q? oseT+hΘTՆb!]ar,^5)1V1$h[-X71-ke6-:ӺiMkF۬F)5Nessq{?uPaQ&Gk@QVv0O$Wd&i"ٱ|u5{.o5krEfa&f&\qdMFE>:9 2v;-e)Z3qke/k,wn'ܫ683sy}">w&t(ܡV>>>REhAVB$ 4Bvկ)JQ Tℍ˔:W$ӻNvPήL)wr4QsP} ۞z 08$jhgSeqy3p>{$ Nd.C,Vi_0ZKO?<#Y:Gn4h+o:y0y | | jdsogpRlqȟkh4'R: DzB91-Y.[F9:![ $d~!O~sOnɺ8'M6޵ucxSǻtz86,@2{Uav,4S*74!8 k`ۦHEmfnDQXLiI+;c%WT9/;xLDž&1bժ;i/g@j:N&YJ vSVL>I9Q)-B"̌mԉ~}/F^>jΥ\$f..y0Z@&i42bZ0R~!!~y#e]v0aU|wxV(+ɘʈTŽdj+*Ԋ4r)"2ya1șeo{b3Ðiv)@1 % 9'I;D( iYjZϟ:/:X{tB ԪQ| >Je'#ucpi\'g Lbѻ|Nѷp !do;h'];TQ6ſp*1ڋ$!߻cևGmzq"Osc8#c^2n5u%.s%n3t81 e9QpU!fF1b(TWSb u1ɬA7϶Cd\I;Y#kb W{}QEDB< I<,w`Xa!DB o Ong@ô-}I童&|m[`TQE?b4,,m)iߛ)f 1ƻ%j˯x{ͅUVҼ(W͔hSRFځ6ˮ/[!I;͊lz+TA kҬIr>ү6zүskooHyt;46i(19v>NûqBpHeE{zg|*~FSM,UOTH/‰+;#s6[nXs.DxXV{2渮RAyH^R*褎*PE d}*}Q>xG2jFѻk{VxF[BWlZ+yN6mAzbR\Xݵ)+@%C[a-٘zn$E@V6P+* RBm* /7K[tV*y4!Tyt%whF;Ev!lgyzUGj!K m0;T!L;Lx^$*JB|%X@$ I+E {Xf1P,f 9B}=8U"·A<5Ŭf/\;V 1, [LM{={jʤkA5ю-"ܖSVkU(2Yˡ iLBqؗZ"2j$]6WKvG}>:sdou(ɮbȒ7N.di 7wr J1ẗU_$CT.jvQKQ^IDj<.mZsA%Jŋȗ^݇3sLFi=.|0N/"V3#(X[oeeAM{lRc!$O:+ O?*b,Z[>(e V,‚:(i dYP w^|]o4'Edf21+D׵E+&s 0G!YV5(4"DeT3\LmW[b L=BLVEQG%l#*Ҷ̲KE < )5R/kk'$XJ]rJHiV٭K5zԲ`6gM]i\IImURާO H @1; SB{ { !۹v(f溒].AUQjITRns '*$\t;P'QUY4g3Ȉ,<"<ӓbBmQH]5hܲ+A>P^%E^Bʡ<ђ*ư(I.3^ J$ͥ&{ <ʡBub@$!mrЪ:faaTJԪ GhqXԱ @.m35fw+}$~WjƿH &܊OfF `4t0}ڑdciDea+j |r2ַnB'_kv"Q*&PQeEN*IA$ke_\JCQQ1J(]y ~ &@ )ݴbR)-%et)%#:mXGd3R@I;} "3r<+n$]FNst6MϞ22b^Hr/xleZ31c[PƺM}!:ǯ7;uQJ »|IxI 9>A0t$ϖNf5h{(qKeΤĵLb:u\7ݑ~>SD(*MM\R~Y3펣ܡL՟,zr~$aS=k 銊] act_[AE-zE:>̈ak4hJCkT2|@BnhKD]H܎sY ڊY*k7c86²-=lU.wb7.ӀQ]9\_Xf~P}|;M#((6^fx#Uݛh en.zNC}J 3R֍ks91җ1/Iy9O"|-o;jDNAH1=5l  &r y%W\4sՒUny5 Oz hTGU=h:]'<_ ߲dZ,y9F}egUTLU)DOeQ\((4렸LG ia Fj=>Qc=UhRQd~Q1W}yL6sM B&U}s WNwpsN@컓a 7"Nݫv 馅y-1l$RZᮕ䭫Ok1rJ.eDUIcAE+AI$ S+*P.%č R/0V^6]\ ":XJo?>XVҤ Dj맼zKK+&=)͝U@=8TQcə u\yP~yH  C(yRMyzFANfz/;W9zΉy.+UMݢ/5BG$8v*Z:{kpc(N{"=-"𨃨/8'cP&ts]޷O?ZY)3II>zIaT"Q0\Bp11(ddh:I͡>psO>g"ɞOYmQm2^ki BmcjkuS`U2{9M-Z]>~Db f)2~ad'KTYĊ'bOi&I]$\Q3-ggEU.ةL;r(.>[W+"IAHg;%_[f!&)`)I* +z rB.M7UT@1kJGS ć=;Զ}I\@Tvm PQꝫ0湅*>^\'%cNI8Q1 1, b ) ^mř^L&dx D$$߃DzͶ{iYx0͵YlGBfl8 BT$ΆƒҐvֲm#GqhLNKa( kZ $HiPGZ̝ƓD@$Ja yvt`\i{gŞ3mc6.)a͊Gfc@iXCN&I]ps5nXR5CXXa;vEk沖mRpث:F;HR|GRImlTA7ogzpkecMmKQV5̭9v)ҀT;f'vM\WA%jFQjT^6w N}XH͂+0 pM2'8vu9%yE׾>'}қ; {l^g[doiyR͏Zdfde>5Rb}o Bzj?yT}"%HBlk}oîk=l*{G혎&^fWFŘh8]:%:#-){GsXĨyzzVR'ɕUu#ʴdͱɩz]wg݁T63L< 2sb:Mo;՛`Ь3>:"**;5Hfu-$%^}4E΅b,DU4=F՚QM0ٚzHe)͖ c\M h5dX͸.!3-lK^{uם0N>\~f]PC=jZ^4(-O߮۸z49v́aen=й.Rfacaּ%U<]cOOf/ܳ ƌG| PN Fd˾$1#{GL+Fvf|X}yk5;wn ej_q?t7[qEYKbjwvj&rm5Vܹk DQQ9Jj&DRcc6](1li0zݖCMj4YmNhcFڕH9,m\5& vݮmԦ6֐^ZװKi2¶C3mwyW]:3)*2clk+-˛cnwݽr[\Qի:GDBU^$EIT :XZ5tvQ˕5F5M#.nW1drn}tƚhJd($1ٲ,R]b5hi wwv-(ɰ $XB-Ђ^<ͧGf'쇩ZŽ^D6klɌ)R]m2iDꭻkc3esZ5~fѵFOvMgvjXEk5c/̈w:IL)s !r1coW:*'jm|Oq>;ȓVEK@ৎ{ qIr RT7΢60Q "$C$ Olz666Eܰga){nɛ ,W]4T\ 3-o>rҙa` g<_Y/ %cv,"H2Sb':R-՜W&g{AI(hϲ<@!KO٨kƶ DCBU<.b*vy-홍@ZTm968"NzͧuO(=ABM{F~f?C"W&:O$ /L5R0*mRB̭ Dk^rHـ;|uHk%xO#y^r$DWr-! ܫ2"u.sm4*I}cȨ*2L'a}׋ 31`y[ 0NU!VdKq)Mc.z|Z1samQJa^X%"9jbB76ct.-)ؔttE2imWf$!@@7 SRV ˓D|hՑEy-qDg[5T]dH"¢NJuRlj 5\tw1EIlR3J6\o5P{wpZQX*oQy(Q0I $~F3hdFu%G<*W*N䲩(Ӟ%'@ U:R[eRkHPk <,&e78׳7s9#|Ҏ_ԒܒnǼ0,EgD⛝;I[2TS4J 0C*ll]Q 0{ʼvZg/Gf{#k)C*+Æ5K%D #kFD.6xU- %, <<s-Xf()/F"{mq(ryfmZ_E?e陆ܗY'!$?YT(eRUFB+4/0Ͷ6#b d߻I>p.8: 8sG"0XZv FbW;ծdQ%F#Bb~96Te5666[ZJũ+-)GەkFZ/˿6zhEN[h4j_dm[Dئ`+BK:7OOU_29i\),gzL0by2HI?kC䘐' FkUb?sX܊ƼNtrʹ3Q)P*)S1dɴa#kvM,{W[cla_Kf"G ߵu*X(w*?љ $bq*q-eU8KNj@$ F*j-S>͙ldjfz.62a-k\~, aŠXwZrFƊA,TYE^/=~DB}qJnIWYhDA SC]Dkt4t:Dbjͬ"BɄu1ؑCڰ&gF#*M@ӱ ѝν; ^{SzћsݾId?E}`6z9ٶ\ XڅM1s.-vPhJB dM9%%.eb.˵.UY-3ma0i$a$/:Cޤ$ F YUy>2Oy}0X@^!xfKa0#()\BFEjT1yX)A.oa$uJcJh@R]t%5 7SH O;:_{&gUt֋7h.%AkOo Py^ BU#ykɕzE9Db1^g$UC碉YJ9<ރiORnH Gҋϵ CWJ(XPal(ЦgmnE.SHDU`S]fW,=*FvYl/=M=<*TE_V^E^ˏF(6KHFF. ^C ^TzFؐ/{φU(I6A+1@QT,m1|$DcJT485[2RB!6ԥ 7Nڲ-H_@5?ؙ(4RU\Fs!'U&a$2Pw$L2("u5%uvt{ORlmմ?y E^7(Ty3q]=DK7-^2mQ=]*/:/(%,{s +*s] DJȋW !$JCFo;I!Z^I$XnUYbFQDbQzVu˂I$Ql VE1=\ L傢S m&UmZVSVRfq&:fhad˩=9Õ'o>w,Hm0ٗkcJMT\nБeo)Ns+qvdvsm XR`lݥ)E=ՇKqƉ [*RZ)٥VДY-yVGSx _88MS!)$5TA*2B$S0s#Tª^#vv@vD][_0bn9$:*'UZ{S.sSnu7.XE3r\ &'uθ !$ G~O*Zx\C]D4|l8TQ8#nfy^u9Z>{s$(WjXEX=D$ RsSlvTbKhpHW#pEj`1i.jUƱ cرE_͹$PdkK@J4 [vJIM\/O,҄Jsӻ;cn\WMȓ4Ә3C6r Ȣ<*hڝ+".Ww\f 9{gzW C"^4qtMwwJ:@"XnWLA #Dn^QH]DntԄ"f0kgI!n\;cq.43-AQ1L55ғG5oih^}Yin"ņiIDPO\.L+ bKrqNcLRLHf(WT,!sJ"E+m#zF16볘a"F^ T%?Hcm2v󋋞FlSlɶ슳E6H+ KlZL09u؃m`@d6dpŗXg3Xqh[9y)g52TwpVkmsr$J*b+9yP+(zx8L**#ld0"R<{¨ֺLʈf@z/1{k8xu(]Lȩ^dH%vUUnyI7% =cWW.M/JU$$%`p5eSbk̢Qoѧ1Gpwk-[[-bɈmDmOw[[jΙo!"buoF7*,hɶlj6eËc䶺euT7` ,KL& b0\Kԥ5 捱G@oMr,:kKM%lDVZeUkenqMi,Z޲5@j6K@| $ykQ mkkJDHgI%PJI䠙iyzT.\3Iw\9Ô,$0+ʢ)Dʌ/0w**P%D$sDA&*nI)nEzr]%|B~)M\j4`;ICRAQRi5ĩ2.ISU,tm+. .hx"jϷ;.t$SE #ٜU/ s؍Hӣn ,()R9ͩ7qI tU(nr[INs7%uDɽqM=Yªlʓ;d N .+:Ld.Jk\mJ o^zW@XQh=g6ylm # :0h$jV&d#$2]4K-'9:yҹs*;OdktA_LUPENTаtwqpxOQ2YL"#HbB D(ExC sIoszb16%Å9؍Mʉlttf mlT{ |~?`RC+_`kMj^w.Why^.Urfc4ә^+4)(=%Vf3کS1fdԔQL&[ڻ1d6[u4 eY%-f.ѴhzUk^&4hZ,m\Ԛ eeW6*[5Q}^molnmwKcVeZ6V̽ek]O46jG<ͥl™Wm^؝OyWGͶnŊ=;mIuMf;&kkEhv#iFMDNշ6ܫsmfE%b9˘f*Rf,)c_ouOR&;8v1)( cXQhh(%&EQTFآ4b{QԺ۳=fΫA"`*{aU.hp8$]+(68aqjʛK]0eikhٹys}!$ (0ȑRr.y]v~[zaSx YIW R6QDW.XIƭ{'Qs^2!22ιxLR"$1<F |B𸜵+[AL4mmgtSRL-,"#0P,XiIW^azبWfyF+y։QSϗG%DFm¬jsh96B;&]Usf@ܵ$*+Kq$ۀLGyTYUf1AyAuw(Uڢny Zâzx/"B,֍Cɒc;] kxc`!Uuta%Vo^g5W$$RICsۯqL=[v+H$Ӄ$  |>>/WQ.㻗s{f*fр[(lieL85c#tIƥ0IkGd#9$ub!m =e]IpΌ SB||X;Clev׶y}EJ ,h<VSSKV& $UpQ-,%^lK! hT m)FZZh$;$S$%Ic,H;Z@bS[nn=oUTeL׭Ij;a(d(|oq}TOKުS)6G(c_? }^)ٴݹ;3Gvζ]Cnܭbhs-KMsU۷NT֋[֍Tvvw1cnvn-Θn;rMv4FjY]jQ Hd'Gd̐ucT 2E-3JCr;*TYdyֹsUrvn|hJ6t-vKyӤbbrnمf̊4w<ن1 BBԥd!&[.r5w+V@9ak Mj;]]can7n[Qd56"f3b){v:}飵튽cS<b6!9֙Jܶڵ'yC~^ca6#m6,yjeQ,ZV2Z{|l|ԶTyPӳBP^H& bBVW.-shb&"I9snQ%!w:PYIJ0#n9ۦELiĥĆWմ]SRwmk[Z_#6lk'B$YIQZj4ddfQmjP)d٘J!-LTU[2ř64օ+ګj$vbY~SF@fAf%G(;2Ԯ+0n&^ qwKwDkb}mqTҕ43fdبRmIliH3eh٭VsmT~uEGeeǟٻs~rg!.0ŴfF3ZeleCw3G];uAa%O4߮U5rFtvEMI؏5兪*iJ|ԕ](6[ZW#JFQ 4~WcE^V)U-D{듹*!ҮQ!'CJMTmhe`EQHB?<|W|lkj'{=WULWY;+Uv51e kJ]*[}6-xl36)'T2楘 vMCj?;6ݝnDKskͮjMǼ֊4P,D3dݩHD$(ƍ,#%ouk_4=bN׭;4TvO],Am[qٖ]E][.uͰkkv.y{5xs.cvkng m_m}ƼlQ 3*l1" JYk׼B.T!N\|JK()SO^Jhljx.SRԧ̼v-)Z-6ƈhuZp D6aOʹmQmLhͱ]6XGaYF쑩j*|Aڵ}ڹU v̶cAd*Im"6 F-lmAITDjآf[Mb2Z ~\KzW;fkmkmcijz*GCK52hԓ%Gc4 -TY O?JOkwJPN:g8q M$|adυ[ƻw/k>}e%iSmZKfmLQhYYRZ()V^-kf½WۼhnvEFţd{LNJEy^RJUՊ(-5zP&I1H"!J1#Jncw&ADM 6 ȄLUb,hBcfF) +Fѳm/j1mңDܹl2TcޙbLKp\˶`$bĘHX)33*I`.j失($AԽfS'E.HwJ.[r[ڹJc Us]= ꕩ\9"2„ee"mb,AktөWSPv舨kIQۚO=bOZ6I6GbVn&llu]RlHht䩭kW.siڨB#Ky$ HtV 5NsDap46y:B׶5^mxu /I]t)`c0" dг fXynk^Z0jhiHĂB]a]>;ZXKQ5W"4XUɞnjm{Z%7UU hmؒb;KyiݦHDTXnX6Ujph ]U 1mfʣm#Ebfڛ!x4ndF!fMBm;ow-6[DwpNv+5H"5/-Hk K6ٛdeZmRm*9H6J&d?ݵXR&$hѤTWnٳRo;XѤ4܊Rcl"11[Tڃi6N&3` $+Q+[LkcblHXğjfmSahѨhV,b)uoVRXmma<;~tF;ڬDme1FzB29u\ImkxU͙dـ+Kmͬmͳ)FmEl\|`D-f Q[DXlj1\;+giv)U-KR?M:;]&H԰SejϘmʾ/[ mIm[VmTR/ݧlmM֍h6V43ԫIq-TW,|J*-(YLp%tT1]||qo^WFYmdm#}wo(0UVm[JdSfNH%lڔьG|VDǛUFEFfd*)6w<~=zj孅T旘`QIEͩ|k[ `[ U,ҥ1cjhKBh"PL-2X\erݐ؛FuΫm ؍QDbR%IZF2bYA$ʔTJPEFՋFM6瞽􋻠#HU^SllKy'ΏvcV0]+2lXQQJI$Rn-MZZ>d-2Ae-Nm*׎;%MmE]FrFMEFHؽQkvնK+2٭弧**troy[[zejk\6?ˇm[IVAMCf "imMH2%4c".ͥf*+&|*bjdn?m4h5|\KQȪ5P +' )ydT 2}([ 6_ #5E}h* ΃Y3;)jɣdVd e4 YVK-)&AUmiK H.mRҫ-*m jR i"e(ifj[lmVm(V ʪ%aTHM4XXfTF65ي44mc[a-*)mf)*EKـH)(z *Hݼ  zHLbJv|>s2@-j+!jZ-RJP08$r2֘Pp,* lnCH9}XPW*- M )]==4PEhTߪ&Ti_돃WΟ5x^}\'ϑoq?8x~';Ǘ?F}?  #Oߦ?N~1??P%!!B6 +1SCRQ@.M4R 4)Q ҔD!E-4  P4USTPPPPP@RRSUREQ5TPU TKA 5E5E%5DMRCQHPA$ILQT]H~ ~&:( jbj(j " ""LDMxڊ&b *) j*hi")( 猀_1 T@ 4(C"net؂<% uy!@xjЪ  "a/Ġ?* ?D/,GsG[&C/Ӿa'^~>(MOAD0A2V?ۍK0JP7O:/mtw]~0=OOxzx9cXÖ09uu5llllllll#fflt5lllllllllllllllm?]oa{Y5glFdjff6jcffcfvFvFf6jfvFcf#S5٨llllllllllmdkdkdj:٨٨6kdkdk6j6j6jz6#B":1DpDl}Dj#Q٨٨j"#dr#Ffղ559"55#B#pDq<<1Ds:""9s"#":cyyyyQN1ǑǑ1Ë333љ&fffffffffffffffffffffffffffffffffffffffb51;fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb533133;fb5흳3;fffb53333ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffb#|iϱv{Ghi{Oi33333333333333333333333333UUU[ϟ>|UUWN|r]9ϗ+}:tϕϟ>u{UUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUÇ ӧN-:γ:γ;"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""#&MSs~Y+%s6A3E\TXf[\&c1 }1G=y53}[ż$!-LD1h;$Bн̞R,P|_tCQg'dL$8“b!su{!ףEɟVOE0'|3;r)@T tiNYk= L>Bzr>=J0vVڞ2vbvqeĕ &b&vk=*9薤2 ՒꇃsϮ YILS=@E2tēi gzo~*iZRҠ#T+3 B.q7loYw<^ q+|6@rU4a[QǷO5Xv|!XQ5*ƈpbfpP;?Xm@gt'<[_z=ɡۦ{/>M;9yՠ gRN[S9Մ0NPBW J}7p'9jsX/Rw)u;4}{)U䕆lQ\`I۔dؖ,AYӇ=gmbY&R ' (q8GАkiiw>wYၔL9m! ~Mb00P4@ 4Je 5vx[.lϾ1wlx['y:p:9{o=e*,E[V >b )Czr$Nz4Ս.'_MMhxss2=bSx_6w_=z5{|d񫼣fd4LN=aaaelI\91ц>e$>&R|8sjLiM\|C$ V Cu$+>wCjZfڤ'!CVUcKm.eX f ǻY:n{sI9Ovk=Ie=aYLM|ƱbKl0mJ@! ZUn_S>$ @"X;:9R"٬Kbnvn bib@de4gy;rj^N,&Kvjל Pr:ro=8kByC*S9C%bDpV,ץMy/dpm|Flq.;,]YJKXbmLmMk1pHqLe"[@W6qs^4&O, {4n!h_ U q6Z%E3Eģm_2r2E!m zIxa Zt\gWYL9b% Rq}{8qHHJkȤݵn pliHsL7JFN&cp#M'%o[B[h8g=ԥ=Xvf8 C $ uݦߗև8} !)9M)MԚo^̾x6G7o*l9P=~}/ڧi0*H[ׄy%=e=Vz<__.{[ոC׺òNxyVu\, ixiڕemvn@kֻgɥg̥aieB5Ֆ!1b ys35*ѭ3b,46iPUqIˍ"P8s =B(,m 6-*"Y 7S8Ez>絨͂xWVcZ@@s6Uŀ-QmB7v/xG1za : C\㴺/6Z_>4/  ]RRks՗mQƶ!&xFY`@ǾĤIu$%`#!KC!%gFzxѺ\M'}_ۥ J8e٠ܱn޹1 ~G-5Qp6s4g.ҤIJ&<W61:򝶶FΊ;Lo4Vak)+Jнy鰺 `ż>|gq B%Hd#9p#.e?4Ƭ,uĜ{Œ2yjb 2$osqsIwFk[1JUTcqMp̰! D1>~ѳkaz\ύ|k/I}.x305ͥ-‡fV6t,x5;e1K3Fcm/5cYaHȆLg!p5[M`ᛋ[5ka AR{=5N{R5mjgo@ި#nkm N3kY&^[czvok6("(,5~1Fo]^R@@g޳ϖ͗r_u b\f9q>9ͺ-9g{@-si5^g&dC!hrÎ{v{<ۡd;%DyQAE>ףϓQK.D~4՘0i(eAdBc0[QȪ30+TB 'W2#755뉺%qz_m吝iGtMl' ݊P9{AO#>ʈe|A6p*%c7|vkZ 3 O6Be7a~YJ@@"$.8b`((,LU#'fm.[mqb9(l!5 s.aV#0b Db$\ R9Xrۈ ZJDON`c5*1rV(&sYPd,fQTKkVe;,JYLL$HHV5Q! H`EH1~B>S=pacرbAL$qB@3uHΉ43JBw}΋~* w~aqєx}΂j */QiUTV<<آ#3J]̩f+ [Al7^JnȰQOX &a1q iQT ە"C<ٴքK,(5aͲ$%L 3/j3VhN3 @Mll)7Xd5#((FS]g7"0P#K,j#V#:޳ ke(EI C yįV$Lؠq0bH1c՜.TyF0JJZ\bֹՑ ".md쉛G LSґ=$ бIIH̚q}b?&b,Z6ҕ4䭗#mejarnᥬXځ@36[@fܵ!+"S, A\RDխ|}-+4B;ix:4Ha vd Lڥ<בybzӚ* y]oIuO5pj/hezCbD0#v´0rVT`@2X6Y\y'LHHʈ`CnJRn.ܵ`IaQȡDPH!Fmah `2B FHJpGPq lmթ)E7( `– U"Z[Pb mLE`VYDL [-a`1pg[O[[Qň,lb#c+Z^$\_ՖDkڋ66*K`61xBڞ}~5p(`XYHVpT0˫hlY1A}kMͶ/Վ &sC-M|l ؓ5@leChIf=v6TTR|'$M)NjĞ^nbY.Y^jX|6JkQ%eNv5̱ f%6'7Ax`=<]eu|&CR硬]0@K_2L=txO M!h/ b]4׳|LA>9q99m),m_Q_;KYqPYaeӔ'Yp,*(K[su\0#Nt٠Jy'$9 ʗG$:d3&i"}uٻbVx*4[jV3W++913U`O*{2dLXk݈4`NXa\iK6uyuـmN彐`/Z(,2J6JQwq;Q29ێ̌23K {R/$Cw#RARtsy\4ڐI@]=[3-J[a\7E Z<9`{'+KM&j0:Nk vmO7,B˪gK)uhU;+ҥ*Zp-Iu@r{Jy=I1`Fq#IX)yx÷RT\S!iX# yu7& ڑEjTolxQE.8'sA3Pv0t]/d0AHV:߱8/k9^'K,#`^g2`E l3CͺB"m[+g/~uy'e5e..a{اLo+'*vV5=,fǻ\<Z@xLjbbUX&&]YeN<'OjRC[Skg;CW'[EyÂ^M4TDj=?d=RO _1"O'F;#7EDcuo4x6]^zB$ӥIl\GqW[J̥ڱN"1]2 slqy;oУ c{^425b D*kVW:h12}Z'͜ğjЬTAYzG"% ǔu5q' J" a/-SV6ȶ\k6FGBYE$,S,qʊ7bPeB0! VDZ*2(QP*Jɵ$cF6j 2L,P-[S=_d}t]rLA.)o x.0/)'2O7.]wwrz:3};nݯw〭%IcwoDa^-<"Z8*Eq4ʄᔺ]D Ppڈ%%Uu[rXl>:l7&B-*kypdql,.7;vFW|J:Xn'[{;8kp\m r|MBGR3Blw|=J5Wo^B6cќ1sqeg]YѾ@x)B2뺤aPh$WMXQ0`29o\K4Z, 1QdbmY}oYa\_\fA0i8GH9Z:YiN.& 2[ H 6JJ'X9KdRd"HC9bjtk ԁm R&&z1jz 6i6v* IZ"EȜ5~1ZXXh|fe'@=[Ё@:Yvݐxry{z0E=%&3#}}z+)|om4/XƲi)Y*ٺ ۻWpsoDNZ/ʰc1@bJ6]h>L:ꭚm0 U&cK::<ؚgQA;a̭K}xB^$H۱cZUE` $ @e=^_65F5wpUy,>!P ŶJ{8!xbuTTEXDLu6-ƴDU_5b\&ӓuEpV,vkkkxn=qFKH-M]Hq+rma| V=qpUN9DX& x<3ly),)u)aj0ƥz$IZb5̕0@) 6<Ʌ:VSuԗpȂl"Ku'؝:()7"Vt>_oy4v2izNs)|IIՍnz\}[;aٮkBih 9Ɩ-"֘ kk4Cp*1hk7RE v3 v7{9_Wt~j svƶ 0)OnyE|*]"aQc1t-,P`)`|ަ[m4w@gH+p$vȚ]Re?P d$'bvOp꺂Gkryq ifZQK`)rW};nNQfs2VS ΢@gu?ʞώ(OOf,2ۜ&mpJÂVoydw}lWXݳfN9xuV02"m%K'pf$H,Ӫ: lzIeb/)g,bwQgy8=<_#{!)ı57H¸H"(T1Tue[w lsq@GxMӅ94`W2' Inݦ02ܛ p 8EbYhWeTm3z:6[ݶ,Zg ۚ$vnӎT ]4vmI*bG[ǕޑNwRO]4Gռ;D S5 b,`:pǪl~sU-=/9Wz:]fVTfyz޶VϫBܦ&(-HG7]exА$2]v]kMQ::#* RYZȋikQJJꁕ1$"0bd0;H@y, DĬkC&( %cT5 E 8q'# BRS4VG S(nSH @.&.;Ia&TѪ+ơ5g-S'zeVADi})>1L՛se]cn,7{q񔝒Y {umZVݢmHC*2B(vjKEWǹ hEAXQmRR|;N\^GEa;]$KϕnvԄD \MYFpn. xiPk)h2b"4aMV4 #՛m;ȷ 8 ղU;7yu'QHa1ӗgxOlMsFZm sC,유VÏ.ٛ6Otw ;ޫ:˾w;;{Tڣk$z1VnZufkb͜Nè;KMiFoÎmf8lFHmW?8GL-7-ɵ.zml|=ouol|{y_/ñx~Ttm=}}q=k+ _KGݿEoKϗv}Ǹ CC_U|~D}?F|ˇS=O}_~G~gvoovno~۷?iO{_{/]_|_Ex#q{m?ss_O }/}7?owG'>_g~꿝G_W?W~__'~_??g{߳??>>?|+_'y|;+8SҨ}~W>'ys<'|UE=UMP_U\&T@O E`A^ilRJi% Pit) kIY؝A()SB " H" jJ iUCADU%QTQP !HRDR%!BA(%(J'>>; E@PhB=xD2U^hUK`E1UDmxE ,wnH wwq ԊmyvZHkZ[9wM}U-kZ/{ (6[?mb{aRֵu[ >ncAlF~YVֵĺpk*sǟxqqp{KZG,#kZn#{q k"ֵn{XFֵ Zַ)RUt/{}r~{fff""fb""b"b"""""fbb&fffffffffffffffffffffff&bff*{vlٳf͑z;<\aޣtsLI訾U[*;{=1A>le<%* { v $ X9F"PYT*ATmECGF(y3g6 J)ց:" gP4ңm`( *%BUQ @4HV3 HbMQI#C"@ X֢1iYPH$VJl@-A1 2)~ *NuiDeWrW!zUa@y(3@4Х$!J(" IS,$2[̔74S5RCRUETQSTEZ ( xTVb )ȳ*@b$=cv$xEE--!SUUMU@DKM͚&fHX5TTK0UASRca*%'g$QbFu04h( fZfu*QQUAE ژF >\Ȉ*رDFRu`@`Cav KH,4Vᑰ2yo2(ŃYQX%l-(mJRbP&Ո,Y *,HFYHtE,KS<m+`(j`"!IZ4qH@Q Ns NO t"DS@wo=q[ׯN td\ç}zM B"s*@T@ 6@FI$DCbśl C0C0o.˜<<8xsŋ,DdHBߙ"LM0"'{w~MPD D@D Yb>PѺ&%)(id "j* hjj(&(!B(]Bb %W "Dr6ԗmVa}PڳOGHI2D6b&E`("+y#݈"bbj&j""*be@[(xc aIQM!FCɜ6,Xb(u"YCB,@D yyd-<|ֱn^ϸ}>V4(iZ@ &DT҄CP|ZZ(ю@*N( ~Y I([FP F"h%B! "d!  R!>SJeh|1,jKrdn\9bŋG6<緕o;mhLۣܶrC*{4CC0Cg$3|7g߿~::::D,#""(m=o7}[ pr Y\(B<&&&!eԹy>O%腠e N@9""R!H #@% B!HVQn(הǕWZk;Zk}t| !EADx¹}>_7qQňS #P1B{^{k`,,R 0D$y>O8ę(Nc<\SQ16+ 8]&H <a_]t+ð?~=4$hӈT>u)J R(aZi)9:{F?( t6,mQWxPNIB*$>]`;Ȟ{^w,XÙBȓcלD;z=EOS{$? G!W\9rE/saXsh:IQuz%T/l=LNAf?y}o5oB5 @9>ΊsDMAIH~X@P hZ$X`88EB=aGG9Eo|>i܍SDc&KmJ-L:ъ"P=rBJ *hj->*} s9 k bNXH$DARTDTT^D 4cЅt:O2RkJNm)+%ritiy*hJк]. (R&ZSNmkXYe`) YذdbdLZMhtTmIT!KrYK δ 2WAd9)/9]ۭغEP5L6*Z4G79OCzZO(QH("j52TJf;#`|{>>x%IE! R9 rhW$D%bE}b뤺n8V-;٬&؛/#`_="o3 L̓2, 看&s3*qM9!PhHs0"[´JYS6TJ#v,c!5buHc;2#Ye94[;JRjdz䕏P*FgZ;QP)!9ӣз]u&#b*6eHI^7w' quD. MD&|w1FK, >M}{nvkud/S3j%k2Vf[-Ԝ R1뭤k. `!oɅS`3,r%E%&"$\c2f [wPZ\E6+P Ki14i2B/xNC#_z{V`He[F J4JƁ.lu`-!eA 9h%bWA SF5yP3A5ΗB6ok!IRh qR;SM6`#*A˥7^U-oɈ{$S܂U@PP8*?SC! s2f׷Y!^b )n9EgKv7Yn2]F1s@=( Io~O8[c֛Pu`,dD˅UeD-!YZJ( ł KRzFW!YRbD)RZ"8a/j*Y8E kRwazp""Q.8_ÄT 3MvkP.3Kׄyv| 9rs痚(j"^j-STNJ*YzG(:dBDPιAAV Y:6lڈ*lyMJf-V(Zͻ44 ȰQRˁ2ٺk%[64X6y˝:zn؄$LH1>+R))DM 9vk&a3*H& $#RCP{ $@9*ѥ[@2dTua{aUs"JtSYhI 7ZCFW Cj<-ZT( UUHzS!F.aQDCR[s<@p_'ҾOXG\MBI!Jkk #5uEKV70$`#Dd0_m`Hjs%PA/U2 y*_O+(?0?2i)hJ􋓗:I*8JFV m'i<"6V؈i òk KYn6jlVͬ(/XBR+)k4lqJЈFTYUV3WlgjoВ@@=(`4"QTc~y{=gOgN12X2¬;zB )Y@ y0-%IzXɜHH%eU+3mP[*%jIDv-(,EAA@EFQm-L䊊FBkj1F_NIP$0d){? oFTsSR(1uYmFFX ,BbcA0cVZF%,KjȈXYʶDehIA fk]hEW*)Cd_[ / .UL>Ɓ/痺db'ϒ;f)hxm`٭mb4L5FzՋF4b1 {n([ suNjs[4Y2ŌkH P!@=>+(H4MM~U5% P:m (LCTPPRUb" Zi"JVl8I/ptbbآ+W]y=#ߓ 'N3ߡ6,LeiL}d֋X(eAN?Ǔu=;Smj"kYb 2.][DVilbB  h!% Ѿ*[sjXwIM"KݦjEfԞQhbV}`"$Z"d *@ѣA}dJ8@PFnY 4@IDbL%esr:%R"ڊ YZ*d۩ *VSm3'H}z}S0hl}'ml\mQYUS!.W1FK?#J`PSMMRQC31%D4PDUE@ҥQS%--,BPć~ս깷7[ݺ[g^,M6ZEq.>(%1#>'G:78LJTbvhj@DP93de/ݝ^QmIOv3_7NwcU"@5 X& "QE-aCVM4 5օ),@ʹ&hne g7amb[+3RuB8FT ,aaަJS[dsfe}Bɛe26[Zsۚj>@ 2>F_ jXJʕ eEYX!Ȩ&-% ) lg:ڞ HZ+Tr_4G7D|jo9"׮޼}zy?T:AR~m,BXv0wiu( `mA]sd`*6wsBFҗa֊* V Ŋ oS, 3@[f)ԄP֣j$mWd]-`26CąVQ AZЉ(KJʲUt"&Eǎ*0`c׼h# &۫QV.wҢQyBz>7vZs7rle1FK&`HXQ@`Q#Ը>31by9P!`DANBr 1b/6mZU\C"cS6@2-*QJ"ZQ )J-j$m j *0 AqYG"e )*6*,+mO$$u⨈Z1J,++0fu.W/5*5A! @j55 6ČۊV+EUgk-8ePTAX"XZQ1iMm1ǩ-r1Q+]ԢcthKqu֩v֜oC~@<|4EU5GJHh( h YTL1\αM"ۛ`x8r"&tqK4[s2dGY 7i2kr::a_HSZjE9*zq7AWRUF8NF^(Sh10]u1K[mH󘍵8ٓ!2lN=u;ˮJxNC:t.vuѲ< LXaH [AtB ^;ֽ^ M#ۖդMP ,irΟə>>ftlbw=U⹎dx|x=QT$i(3z,AM4SQjhj$T%Q4AIFZm@{|]ӳsXjJMiVZe6ڎZw &"/16ucR>;ȬkB6̙&~gbu<_6Xb1hmȠrkViM# фuɺ]1pƭ[Bfw tКkO 1_lyF¦-b6(HFgZI%Zb"& \^12X0+2";pwEPmbkA miPV+uÖ[TbڵbPEPc-F5s 1P $$pD"+jT-J `cQZ4-b L,CdaDUD@R!Q "ٰQES2uӧh=>P7wnVw6@{E>[b +e ~(QdA B1`QXQYZ+cbTYYQ`UDTU+HB[H `$vf3bzF鍺CH"/1:8ATXaF3RdYeJ,VTYEY ˛(T+bڣ(R:up9؉h*+Eb AbaV(eK ! XE 1bR 2,[EfC ۱Z=Q6D>NN^O jQ͘YiF:z>("bH}7B4+k Ԯ@QR)+AAdEVm,T3 h***V 2L η"m( ^G}qsnhfP@*(E YR#S71U9XUmJ&dL)n/t+חlF(Q1v$Xn:rc=/1bkҦ"dTAScEFh" ]e˗1FK%A񈀐tUQTT0LSDU5Q$QEEUQ5TMDUETMAD3DTQRToÿW}i[5g(P|f+ZJ(ѬE8,n(2U"m18µp)֋eUՆ#Tr RKJV抚R1%j *(TPZLj}>4F~ynIuR)AbP%bZTXVJXB(RQBDT(I%X#%UFkntԐ$A~s'>2Q!ĦE:(bQRUIPO/'u7grw;}(Klj-*9O'.TS-E~OGX*TB$$[ɒgs{|h5UX@7wF$f[T:tq3"L! ,O&^^Ξ1&J( B!FEP*;yp}I Bh>t-F,c4|,Ʈ,&w36hdHʈyaPE 񮷄$? ;}.~Th^Uwqxz+)0s7SEU۸bz..B6'j@T0[6-:k2O/'6DTr䦑䜵HU!)䜀)E )kC%H d2Val^!I1ֵu%Rh*VjL",3Rf*(ZBd.Rs%r./2s'ĄҸ K ?I5J]ݱcP3CPcvPSEFA19"dž؞fN16qhw"{Mu|v70fb""&"f"b&b""&ff"&f"&ffffffffffffffffffffffff&ffm7.U[{hٳf͛6DDDDDDDDDDDDDDDFQ/1!X"Y ~~{Ϗ5x P.Sw㨠)|!B^E_"R%X( J<ReJA&j ˍ 4(2j#L d[%QUPJPX(Ybd*$*`Q3CR؂(2ld@z.ZVI L%`ylѬ"-i]V xzGDAGl$jAO yOIS'nj+ J"TxABFG,f`0<$ɓ͌E1T@Y*xlykf T5Fh uI!%%4*xAUTP]ۇlhJUZa(A (-(bKBURJ+H- ՁNn B-QE!Y JB='iDd ME@𙙋<"+"c{ ;*+N zz^LbLp8>MbQ{\[ %ÓMh-2 'c/\*W-YAP^U9.uIeaH[RF(QV @TaҙL&M#UbHR4bf3@1XeBAhPP dL]BVi֪jk|!D/ܩ$o #d@X@||tWK:V(rNBAC$(b&^=Wq̝יQV `Zpv@FmhaX[I㺷RkG\<1"룣J[̺Z(KBd%Iuk ԜѩAeMC:EQeW *JP9* BeaPUԢ^DC:آ,Pɐ['qIS93b6mIO$5(Wht( e "YPB5[9b/'o9)CH`ZHEi C$ %ecTRQeN-Ů[.CFŹǛЂϓ55c{>=B T|Z<r(fTA||T̩M IN/)d"~c472hb|DHLUȩV@ppJA@wr݁VnjQLɺJ( v+ Ѭ\AMpWFpc=2uz*kG9-m,g 9 m*,dK-fG#\M(ݻCj fv" =5*I>O>I9"-* ;wψD#O1jب\lOSqw9D>I!+">~%!BBk_5W0u&a(:OR|f"9X1`򠯓ϓ|'*8hMEd=ZdɗdD}N}N|P%-҅ Cw,ĵ|d.r4/!(dPj dXEVc(C2XWEAJy, C9R (/S9@+GV"G*]oVPB:4 ϓף4|3%QDE՚i*zy}T%)#kU4 99D0jFH`Gcm,b6HE9`(-ڹ¡%nw6;^gdQPE!=ŬB K5bF,(صٵ(8{BK2I2I2lvLn.v:=g$E$I2B DOԶnނl{:1gSfNũ6ӹ8袥QDOo!(1Z$$ ZDScFb1m´u JͬVٶi&x" r=Tԇ^W%K) Rzi ߫ fʗ❧w&d7hbZ1X[[Y=TgKskl2ׄPO+y;;ojX\swE9EUTU"(O$%(yۨ=Op h܆((PrtR[\]"Q#HTThyώ7{/;Gj*]ht8hd3؝Z&EĮf9AHKF3X[nȳ]+HCz)hD<*BNMiI ݻ@p@a0&dd((h6*KҢ(զUaV\֜ū$!>'|D U31M[b)^@oGH{Cߜ^$!٘B- =`[-MPP=])]el!ZF"mI&]xN0rpq2QFA@yVؐd>!R)JP P(DѤ4@1 0ե <@yeT)jEs*D5IG+N]72v**arA8ŧ S]Tn͉ ;G)6LZPKי^ "K}\f9qNz 3Ԯ;K۱_0BBҔ'Mw߹7{9%`s'S&>./ )NGՅH0c[Ebʕ%%kh"H#lh2)-&nƸBhzڦ%֜*$6 u d㞗W9u gHv /s {`azE4GX2JQE`<@ Ja0sE4'(PDБ U44A@PR"*hUЙ)I"J*&B $JfF zB!JWx:y " \B:!NB)*Y()^s zGN4+N!УʨznB @)ihѥ&4Z:ECHdQU^P1vu/lȌv/`,…@Iq2QD0$*0\;gUTQTSDDU1QDTPU5Q5U1DQQI13UPS0U5DC0UDTI1 4,Mtq2*PQ̓@C2U$D 1 EE$ˆ؛)MQ$ɤ-bP_'p1:^83"PU{!D-v7cۨJh P~O~/WÌI$DBbTzԁ."QBK2YGgy~o5o$%$=L_Ic}g%H<̈QZRb$#՗csz^1&J(D/>6%RҖliIIYnJv7y9yyy9z8ę( _~▉0BزҖ$$$#L6nhӧN:q2QDh̐,IMD$$$$$'Y$Gt! _BdH}wI2K2dbm,0rd th URY(G(D} Bt)iKN~yGITD|hLFfpwh΍޷{DDLDDDDDDDL335\r˕UUUUoz4lٳf͛""""""""""""2dɓ&Lb!B !0TLj(4P;d=>J/:jG: I;K-Uͣ;Ԛ'sx()@ |ÅB@ >NOr*UEC*4z!zP1H)ۏA%4@";MA$1L-RS"C"1`Mr˓&ttdU4 0JC o)ɳ$E, 4\Q,'VM8tӧI%M (&-ӧN:q2QDL#+ *EP5ś4ӧN4QEiA!NNK6v9yyyyyyq2QD(*H$AXL%:tӧNs( R40A*0.oڪQž}ߦ.X'jA1s[_w788;\ffffb"""b&""""""ff"&fffffffffffffffffffffffffffjÅUҪhٳf͛6DDDDDDDDDDDDDDDD!)2!lڜ(HݞmK)xA۳Ҁy+M@"aBHҨ"(AI Qm&DiDH(mNDBp*J"h(h`h=':i"JJ"hhyN1P'Pp>&mF[!!P"$Rq,|xxPT , ]Ԟ$DzH, +r GRQ]]@ rtR984?P$0SJ E]QDت)"GFPREPd`! opf*H(bBeHSI@F&$rmTDUDP1=p_گovN^_'d%EUU m<9h RQ!GKZA Y!,/7x䴞LАM0P'w'`腤 *FG,UPՉQ^ 9]]S"@Jb;8P0s {HT(@P#@PPk,t ܈Y*Ai!%<!BT'qYda:M0""4piƎ:~_}y=$tH2JqA' abs+N *Ei<ƛ@.@$!>tӣ9QD D ȟ=4QEH104VtYsN8tӜ8cJB"(ŋtӧN4QE B:!UDᦋ<<<<<<9h D | (<0c%H0 p2 $"kE7tӧN8ę(d)  qs[;t#z=콆bf""&f""&"&fbb"""fb"ffff&ffffffffff&&ffffffffffjꪷh'NF9/SԍpeC&+o;ȝI䠠hBԯiSҌbiQP V @Ѐ(J!kfB=3z H0K!IRQdXlVeP[:X3 Ōb7'[,UFjEES)$*E2y\dD*ȊDyj" 0*XKUF*|نb-|fgMl*Ja̟ ]$'(,sdRED .*(=\*!A7[h4JV`Ҫ`a()V JZI !d 0#@,d^TpSo?o}qM^g$EI @:Xd.pYs/s(*~$C=8AtR#R Z@^9 yPL}{~驚+#[#QѰ~C oY7r1(R @Ё(Z iNƝ:tϯ\8p!![4#X Hf+Ȫ)u(D*MQ0RE L@*KBXQPtӧN9h%t2 C,"\uh6F:t9(CD"j#D6.iӧN:q2QF0J#y//////9h%hȈ0iӧN:sEQ]ir:tӬ4QE u0h:tӧYh$PC"!:}y8d-ƻ]DLDLDDDDLDLDLW.\rUUUUU2d%l^! TPjCEk¨ LDGjT]<=g9(QH ؁Ftb]:tӧYh%ˆ):M˚tӧN2QDhd@HaZtӧN2QD$6lp(Ad@HU$I .p$E p0@2h:tӧYh ʈ&6E[ZfjjPt~9n޷13313331333333333333333333333333333333UÅUn""""""""""""""""#&L2d c16E2,#|=ɉ.v ES8ysXWẘՖ%}(=\4#* 脪(3A:t:hiH#LHD! Ѝ&&"#!)@"b @H-ES QDȳQQ4S3R5D@L-]s4DR4DT@PS 4QEQw㩩*GDCQL5T0MX (RE2/{S0 zjF)""hdzTAzêmDAr$¸KL)2vjF@K4A)V W H b@C d4D6ALN m # 6 h/N+URڭ UVڰQ:}l`TL#$BG`E:4ӧc8X $E!P>^ҴBE1RH"%-x!C=@=âeJM-""J(peJdD p a:z:qh!WI!  lCbG8PTMTF,ѧN:u(T:4Sr:tӬ4QE !!QDdwF:ts(I44ЈCDVܹN:tk9I2B*'"|rx'qyLqf^M|xBѻuoeDٙ޷z޷qǍVꪪٳf͛6DDDDDDDDDDDDDD{=p~|v h|m,;AIfD^A:d[KRI5MD"=XWHd @U4TTH@U AOh HRS\& :ithi0 є `)5E 2TQQ\NUMHCqy#TT`@7HTDR P M=tJGգa XE J=y)LreZڳkawqY ,1:XHQRP0^j4EjN+\`{R=RlX\l2 U$$  FAeJ!R *%Ai)j)(iJ(" HI i*i( 'o3kHQ4L$EURT>E|TR#2T )a"b"x9@uEP*ڦ`^@LCIUUDETrwh鼰]7{>os$%P}s=_Z{@ DT4E"4#DGB4R%ߋ뮩 uJP)MߛT,ETUSE*͉XaU* E4C0 [~_GjUjo\Uc׍k~R}ϊx۱ێݢ<{{^jq;MgSǷYl`K|Z탦3i|^גyyymkǷE#f*o4_>=ߒyyyt+Xvڼc$NqSH>C_z^zyDfޏWjUQ7{mH>/ΧJB>I RD;0kHBX $H!B Gȟ=~_˿ϟEu/;VzQwZޝ[}*A6u|~Nx-Ng-Ӧ(w}GӧN1gGx]oێq: ӧM:!AD>d?&V~.@DDm+mekzY1bÿgk{ߴ۷n3{Rֵ ~#Ǐýz?Du'z}s럊>go #rk]{=nϙqG7Ǐ_׿dDOwOGAn{~ҷO~W=_~fC;ӯ]O|5^z#uVl|qϿ~?kTxLo~p[˿

/g~z~_&ŏJ>wʾ-ھ_xq6OOݻv?=8|_n==GkC4x>w{]]]_1Ǐ=]Kl~'߇eUUU_ȿFUU쯦6mmV(w馿o}w߽ T[m~O說/{UUUUUU/eUUU_ O說ʪkUUUU[ラ>>iUU*߶ʪ{{E~?c~Ï.[<}73ֵkCUUUUUUUUUUUU_m^>|*-꟞?[~UU_ʿml*k?}>O{l&*m-O~~Ǽ{M]BAK4Pade4/data/avijons.rda0000644000176200001440000003675212576021756014171 0ustar liggesusers} |řok$ccm98pSpm,I#it< &elC !7,YrKD I #, y(/y ]l6!lUѨfyNuIWMn?wnagsyb˜/{4C#u\YwWo}[΍ ^/cVw+1^9`_竞G{q:י&CCZX’"aip!\f²"ay@XY$4ia!4g}XOf{GV ~N/^0iOjKKmi--Ԗ Z'֞n孱޷:EA0k`Ӯ U#z?5獍Q;j~_J로u ʊzfs[皠kl'ofL/RwDOB_*v? 鯂O#}*ExX4|(z_ϔV.5yy~_?zQQO!9<Vׇri)`w/׆1ȷ8]kQuBy)-7Δ?z@2.ӻ|Hǧxܞۏ/cG\ڍvҋvF\S͎(g ؋2h_:8 x 1Ϗq㏻~(7 qcy?,e=@.zXQ^,qv@~n:fC/u1?חarϏhc,Q#Z:K%>x rD8zы&3Ϗ؂r1?ȥ =+tF;,Oa>Up^,~q?,OKwX@> ǩQMN23ڇ'7pqBy̿ﻛF^^/߆_0Q^'7?C_A,|p~v ^7_cu-_ه^9\>Z>b{:k6>^T!I98F)dc[p^ aZmğ=P1tzw٭7#Zg:`7sV5/a;>c<-yZ=-KH #!u$ԑ:RGuFΥ(2kn6nvKڢ-Jڢ-Jڢ-Jڢ-Jڢ-Jic6Fic6Fic6N8i㤍6N8i㤍6Nlf6٤&m6iIMlf@H[ik m 5@I[#ik$m5FHI[#iiiiii8i8i8i8i8iKiKiKiKiK6F\ˆKq #.a%0F\ˆKq #.a%0F\ˆKq #.a%0F\ˆKq #.a%0F\ˆKq #.a%0F\ˆKq #.a%0F\ˆKq #.a%0F\ˆKq #.a%0F\ˆKq #.a%0F\ˆKq #.a%0F\ˆKq #.a%0F\ˆKq #.a%0F\ˆKq #.%pN\‰K8q '.%pN\‰K8q '.%pN\‰K8q '.%pN\‰K8q '.%pN\‰K8q '.%pN\‰K8q '.%pN\‰K8q '.%pN\‰K8q '.%pN\‰K8q '.%pN\‰K8q '.%pN\‰K8q '.%pN\‰K8q '.%p&.Kl&.Kl&.Kl&.Kl&.Kl&.Kl&.Kl&.Kl&.Kl&.Kl&.Kl&.Kl&.Kl&.Kl&.Kl&.Kl&.Kl&.Kl&.Kl&.Kl&.Kl&.Kl[pٵ |α`ոI{;lo&]:O$+xX=f!*uS_,uLu%p7},^R4yvT|wuu=[)\[kO)(rȏ'e*_K/[5Q蚗jDL>W }&rq_Rm_V~Xl+&[7w(65^*/)\`B=K4]mGJ&A*?9[knOskoD׫X'~7PߺaaXRR־bVl1x!"IV|Mom"㝿~^sMWRG:M jXM3O 59v|,[Թص GLjs4nzyM&z-TzӍk-c%/iY_V&MlR>B)q4(O3':uv{J/v^kn=2ڤb|2Q.7,uesV71ek>Q o -n["}}=.`VO/v׹7Vh\9~ zZ}.p2iLvOd(XџKwUBbTy~zEͧMT}j^S렏QMU>\ukv3c8Xc"ϥALo答zUokf|UlS:TcZ5]bPԥ^'uNWE?CkSϭtcP/ڤסΐGz=OeʃqyR:.Ttr5eso3݃ W2t}O9S]i61VSms܋}[gy4&j0O-ܩgdM:4۪b 8Tsjea3g?l0__fgϒLD=f^ej}Ծ cR:ό}:yԺ-,nu/6{R-纼~Kkұ[蚛3g:rLx{~z&uBvDϋU.2DV:'_l+V0e럫; >mWX)Tn!>wbV9^ֻ-l`G)nzY#,G?Vz{rK>xW~>3WGni2"c?J-gK%}@o6 Ot io)y-%n^[UT )uC{2vؾس:uMzl<>i+qR9x9[b{C>n6ܘT~qrrtkcuyDZ?5dKTvoѯI}~¡-W'ΉU'2KZj*TFLcC-qsLQBkkn#쳟m]<ɡWj+˦GT~ƛz+-a sUGsrI9\R~N.)?'K%r$} I?H$} I?H$} I?H$} I?H$} I?H$} I?H$} I?H$} I?H$} I?H$} I?H$} I?H$} I?H$} I?H$} I?H6ڥ,~T 3-@OK%i zZ=ηKvηKJv'9|KL}kz`0ї¯9?ۙgC4շf87}A/oolg{}}l^84ߞg-=V|5Ȅ YqTߖh(-S ڙm SӮb8sDSnH;5s8m(Sߛnͻ|Ov@Pfp0SfXlGF,.JH&'/Bmk ԗTܔlkrmp3lk4=5϶[wj=j*nLcfEKU"-+ʌ3ra|'cP6:29]\*"i` їz3ԾceTxt]X0(?*arfȶf3`|:+,:408V鞡֬(GhP=0 *-3`0k6%Kwz,EC\A Rl6Ldei̠WYy"7(ГkAcgo-'!.؅Ţ0ˆ9R!xR`("`!XVruֻQazh9cY.h(V-ɤL ҂=u?rA.ݞ'֚!NeƘClG/>WZc` ]ˎ% x f{TS3F:/:#~>Yᚌ[&fq\uyHI>CULm~kɵs_ujT< Ns^J>C kjud%w+LwӬ9+_ ڶl #G>)BOt23b/{_J`"ʻg>BT|a79*hMQ52S͂Zӭ鎌F4eǟn4䗩1LI?iWv{o4;]Z{4*7 @i24|>P*{fhoȥ ubt4&3pq {$6iꞳ-8 XtGf5\Yo :]éWˀXxu7;\z'{B0ڶ&?$+ C%Ė5 VIKBN}ūclilI۸2[p/y .R, h"DN<8fBCDO@|'򮚐Du|ˀDzo{789LcB0Z7`/b RqnӎBBj/jsnvrڵi1Z'J 4>6xSWf~ɓpZٯ2 A0c 6[!_ȷ9>&PH1ڍӮ?k [̀>ל+8}E{*~@TS^JIsZz@Ԉ-iF.Qrэn\tuQ*A cś2# |cڝ8S_bQS y|9Hq4JJɇqywGɻ;JQJXXUؠ"v}+O:i8e>PtȄh!A\L 8Us$c`| O_?ϊsA 3oA Qs #v|rhH;"QzG$*ªf@X)=++wj~ӭԟoQ- WBD19 ΃iQg}rFEu(N׉8@  >gEϬ9^/ κ$S 3IB\vԋ{|CDȅGqy7ϢY&aV3 ,\?E=v=YhŢ-D " =GTװYx Cw(6͇ATƦ1(8kkֳN祏Md>PK8tkqāx|v Σ\'zHF}(Y>k8̮2c(_:=,x /|)`< pz]^`Dy 6O>4U( %( WNP36h|b S+Ͽ\~CKƋB_tBࠠ@.9[q09(vqE}V:< j_!+ 4_>pt뾿0B6~^8CF1ަA>4fH@~uA cś"˾z qZz;?զ۫| ~QoiNjA{jċ[@N>=|ғ6#Ǒ3w4F@рJ| j_!u^rg}sV?~fpKmk sx:!ʷ <;#8N@Ӏ#Vcgx@mꊀ/sקɜN S>>= BL˵2*ur> YF9Jw4No&~10az_:w]q,Q"eAa#{D^J+ ˆ;'nb8,^V3 ,haGZ'vt>;xՖ q7a/NbRx H=)/UŐOC@i 4&tMФI:ؠ:M]myGy]ݿs}+M|T2f&ٲ ҷ@:cPƐ_lVapN(#$_qF<~y2eDuLa`l  {d9ÞXtSE!k2E8^(םC!5 {Gf㗑/#_FJ<~f@Xx{Vak'u:ͼT+P, 0\!i%I1:*u# 0e×/uJzD=x{Va??]B_>9cZ@B!Vy$yGv×/#_FLz Uೊ]9'.u7w8Eeo) 4G0#`F>0͓I7:QBUؠH2yrϞ,bQzW_T29B$8?r<y3#O&>ªc%cfxAmϊ lk휽=rrG|!8\V[2a?Q[)Ci3mn@TI~Œ<}['fWψi 0 >u5ZE`Oӳ?axehnΪR~ɉܔO.4Q0#`FhfWG?j-ڳ"K>Lg\4E? RBÚBD\/W1zq\pӷ|~y3fǐXflP |M]-oߴhͿY2W\dAb>\K/#_F8Jd66FVͻkϷ+_/zo]9>hA)>NY\$}RG/#^FaUȲՂ7Yn:疭/8ٓ>T, ATKID,L b9ZQ9{3Z.F26F9}_UFBk)Y֜T &ǘAK-þ0"gnF܌9s ٪i 0b"0Zv7gn(st rW&NjQe#Uf^v'N܌9s3rfșU3A NP%nԏ NZtbpR, aةB!V0}#L5Hay6UǶi 02,76Ze, >lK\ ncSz {1N _ η`QУ 0<* eqٛ7#go&.9As`># W~в'<-ӟ]ӯXⶋ.9 ?)? ǣ>з]rfٛ%ˤGn(*glP OԦ h.k\[\t$Q! |99ssrə37囍 j_!_p>녜E89`@Y&)N> FM8 :I+vM|37'gnNܜ99s*q6a'G޹'8r5 X_(aw ,M/(/\yIgڛ.鍜99wsrifN7*66|M]'s2?9v.U, >|CUAbK?t #9aGGݜ99wsZͼJo66h|s7uEq]z:ˉ{Ip |LŢ{)[CC"@p!p&gQNg[}rGɹs75|ح٪aV3 ,מy'^i;'wk.ne- 2^  }!Y+An5c>|QOqq+ Xʷk99sri_N<|M:SmmeplwYz3>t\?7M qw9kWQ/B3×/'_NklU0c|VQ/ߞCN%5wN_+8bQ!a#t`dI׀z8_+sKNkr×/5~yklP aP2+3nY|9Nxt,ʗ2z:^ eH q+G>Fkr㗓/|f@XD+3:|3Gf?o)y9&8d!" !g\Ŗ/<8ysf/5Vi 0 N6/s}kn血E{G#.^r |a) !@.]<9yqubATV "L`gEֿ'6+?YS Ea>pੲ 88^c#alja[̀_{VfM#,#s}wfe )rx=~ۈO.4#G09m8qX:8jY\GYb޵%8Ţ˦g5&[Fڍnv0a)x_{VY,u}ΠET, M\ A(RوbWI?KF69kQhuxI[̀0<ڞAXj׵Iκk^xep0zbQsHBdm<"I\#8V޶9&l;J3aYy}?iz'g=3(Q/Fol 1v 2 ,?&?mZ&gmmrֶvͪme|nqTfpz[Κ/?/` mE!p&?cq#Nފ 3/^/̌%8Vy&mmr޶eu Nmma_EAeu{Y?}?YXfYxN$,\PwC9 CL+smM6mxjYJ=~v6?]_tqH2>X1qdɅGq9gmsM+sU2  N__{Ԏ%셖霈ȑ@dz1"/Z@W.ȏ&?~V9۶êdncfqŝ3pg8z,bQޛ Czs)yq]z/* )_н7ߦmrֶY&gm[:k \VڀKGUTfTapölnhS Xt]Y̧|4ƀ\z q7Ug󤅮IbQ41.KpR`ЗA Ď/Lik$#mmr޶yۦE U>c|Vkꊀo}_ܖf}ER=/(#o ɏyC>I, ?qϷޟ/{&gomZ&^;FO8d=hc[pi||cOEWiMM)xxT3p C~MmsMk1pĪ1i 0JoWqo^Uhpe_{WSE!:a!@U}lht|Ht{HWy*U*2`+גuM':Św>X[С,~(jċ5wP -mlZ{U쫱 >wdep'>b&]#}-""y-"}"ʺؒڸ"ӏW88k-:S(̂A&D*jPQ$<^2t\Ht[H(Z%>k2`+Q%–N9drWp O9E"P?7J"+ 1G"/ KDpx=Eeֳ,'-'_p,..A,qjw[XQ;_&1+WDl-ab4o"8"'[bDf~$»Ex8܉i"a'p"@Xݟ̦{JmD7ښ j“[zG4w\L(!؝6П9/ݛ8=RE_שade4/data/piosphere.rda0000644000176200001440000014052512576021756014510 0ustar liggesusers]\=/Sd/p" A{mQP\49-WI^^^^r\.׼^a6@@WK򯶦䏆@[PPB EKS-)J 0B) Q E?@!EYHOG>|e%3^({y#?ʖ;ˡꪯv+=A\WTΟvn UE~wtC9ÄQ9{x1Gr)2Y^7yZ(GHA8a2N{ AeOTr :Qt}SvWo߿:NZ_N;lCTj^suv* IbU>jzÃGV0h5QN#"L|a~1_D!}"#8I#g=cd/w#Ξ2 ق5s>6ɾ2^*?>@swdw*u,1GBU>]Ճ7ꞯQ\;zq1Wr'(O;tyu%\z _W`SR(y _ *);x!Ȝϟ'u\e+++ ny] l9Xj:T}k9}z7z|R~hevy0yev_]o\]vU hRDÈ9t:9:K>@R.U~N띏og#.9QN^AߋP_z\7 jg5TE)=xƯZPuV?+jveϯ,'qx5BaK˩~rrEٗÕGX=sn|.>Errr"vzNK:Ha(=Gr!azsguU6Vy=dHA~zNU_!Sv~긒uIUG|JW)p)JsՇS4-?B9cJ#f>C\ ?"_h~E~t~z)|RBq򉲓zy_Q9y%@@ 뭈͇(:VNkq}W&q~АOE1Ջ%~%\З)GĮwNb*ԇP1;̵oS's~GZDsf_\|Pl8zjsm sQ>|#.Voy*r㗃_!-9){HB]/P6_ Ճ^鸠j99]zK~^x#7"? P˼>㹪Q_En[a>r8~e[B>ODQ0W V Puޔ_hbH{d\U-Vy[*7ro~j>&x)uouzxn B9-Uqא*{GV(QxS$#VJBrRgq_3sAx&?ϯn(:w:C{ȥΕ+_s|@ɯ {v߃_uw)L'bOαחWxOd_W4Q•PۜB,NV>XZG/?NG@n"f3d>r^k_;s^Ir}BP6_ʝ錩E)j'lʔKr`}5Wu=,@]ǯ99^QxiʆUǕjу7O(*(W:E9㕤t}UoEಯ,+%G˕~\풃 jC~=TҔJWz)[x12T;0ߋ)s6ʧJNQ ^oRu=Gl9L/ʞz^U4^U>9~.;QUB8+[tEPuޢUS#6z);jEp]s~ESϯ~\s'/]MzsWn9l}9x"}8r+&aOu'uEEʦ+Bn+{ޒ+~U;U9ꖋ\bvSῊr䗋Y%{_ާ)D6#?כS](]QP}yN6`srUSzJs{rԹM{dϹA\FV+`.^rzăGn JD+8k79]=0z(σuc"c*谊=6ڏ1"S9y$ ;(τ3S]hT:& |ʧur""*.'ToP A~̌+S 3Yg!+-6TNr ?rsASǓ/uބ\;,->}t}%TrSi27azT>=}~$]sJEw(=Ug)ek9c cʴ!G:ѓԃҋm'Cv<*[qbrC?У(Snϥ]>amNIQ\a_*+*#fu\!JVIZk| ek5~W"λ~-z*rS.)~F6-ˡ1d+ cڞ/~!ypS <[P O_?DwvLWVe獌==g|xVw9]$`\r|Js+H)w'zɝe.ON> q}^~(7?3"*P|K[DQծ7sS7Vwײs]?41N);!xssܮuCQ+>)K|*?<= Otv@TX~{9>%k.?:"zYȯzWw+}a*=x@rstq4*E@Sy?z^@/E 9-'s!QE RA ʶmewr!ϕCoU~TST-SPuO]Uվ9}~!{rC=ZS]l/:߆Q˼^]^n;e#qCY RnuۛGホWyJ2GyO%rO$N99WV]5¿:_̯`*x#^K?<"^T_?)Ty9]]9-71GG^=Ϗx|&L^_u畕H(ʩ|QڮʶSN7"s^_&>ff+׌3!LM 3dy<=^|?!RWlqOD?j||oQkQ.N9p }v~u?My.+P|ǹ"M~m~^~~/@#xGN!wJV?K? mTO?j_=1GXx$i8|$eP+O\EtH}Υr~'ROS%+ls+GYʦZN^qAq.T|lQw='ROQj'e'dIzWutuv)"UU_UEK y}^1O~_=|LUyu_u++wAIWUwyArյBf^OCYwN?OO'xBF._]T9+>o⟧suVmTd9/g~Or6(;)DrTSu ._{񇂟#O_i9GrGUX91 ؔ~ߗy?S%CLMthY.dvD8?3iGg.%:2uED9 b*t:%)K>\pOO[נ>*ww=_U/Jq/|R=U(A9]~U9ʮG(+'UUi_7}#||T,8OR4Pu)znCi?WXQ|^!gU?EKWҞiUqϝ9vܷESWVqU.QR^^ƒB-zeϙT} ھ?΃G}+x`ԃ?X|oGyu׫ CPj^E@b(E[ > @NjcIlJF2 xMM渎ӔKO>rߵ 勨brl>se. Om8(}[Ql>}t<'Wb*rF(ۏP Qvv/OS2hIyl*̯h_}ʞϯr>*L|p\|}rl~7\q!E?OꟜq$p~.'!h~|\\K嗫Gt=G^~σ"s^Ϲڗ&O,9d-/̌7Ծ5f0OR鄟ڇ\>YR/Y )l}9FﳷWoOOr{\!N3KPC~1;widz.9~$>甝UߤsJ 3"gϗ[p6䈷UN._iW0)L5᷊e!WO%/n)u#t^㫢9coRg*>> So[\zЛk?=}}Vʮs)Wq'7yJS~E 9uR-FEr8ӱ,?^N0yq;9n#WW(}V5LN3>"DU/)PyJ㰘%\u{POTݟ\QNs~S=u/kcFj%TAAw„SgR#eɳa˥Ult>KRb*1P1<:ǟ25䮛b*^Ø2IR1w3Ss2y/T|'Ey\}^L]y({bzElx+"#$g+*o[ y= GN>MDD?eS)/[g&礿CHL犒x[*=7#rP22D>}n$uܹ)燪=|y="垇qNɵu~*Y\4Jnߣ/}n-u>95O?+OWZ?:6NGWg ;3\n2p`x|'WdcG/į )JgKi\5Fׇ#scj\t}ť?ϸr"Csr>>\Snݐׄzr}IT:>י={rы0׼+ᷠ+\;r{\Iq͟0W樗?H:Yn=Sr9T}\W7Ӑ>"r>0W{\PW>A|\UpCxFKr7 ڌu^Uğpy7HΟS.U/BUQğ.P]~SZ_NU'>%)Ov䂺9[uι~>JPLn!T::.0zie5{)Yʯn(;m'bvX/R/o.qނ_4SG~JCycy䏆@[PPBuGJ1qd:A!Y=d 55"[`&28 2ޯ dQ(=i0[ɑ?!]#d Gg`D@DHw&;8 4$ Ef)g=Buj1U' (:?)nHT@rtǔ[7", <+؍U/$( (0H558GPzEJ54w`#IAY}BXy"лV{D2n,1Y+'k0<)AHd78DrЏm!a5%DtLt4NVj(V+wXL}HMK07 %i&!YՐC10IWQ&[ 8}$O0'`PFI QB*J0I;K-m=ko s!Y}EP^Bڭ~QtQ!Y4#,(k0KT`>CrK0\i0JJ JFaD-Bږla'֫/X2;(d]YA!YfRn;+CT+YmBvJueAvAlQlQlQlQlQnlQnlQnlQnlQnlQlQlQlQlQlQlQlQlQlQ?8)))))))))))))޾l6/(l6/(l6/(l6/(l6/(l6/(l6?(l+϶? l+϶? l+϶? l+϶? l+϶? l+϶? ,+a]DdA!+(d TWvЍd2m!(BQlF"dE6m!(BQlF"dE6m!(BQlF"dE6m!(TOqeŕmW\Vpe[fwe7+]nvWvݕfwe7+]nvWvݕfwe7kfo(YЕlf!uererererercrcrcrcrcrgrgrgrgrg````bHȶm#!(BQlF"dE6m!(BQlF"dE6m!(BQlF"dE6mUƬ# YA!;UHn W(W(W(W(W(7(7(7(7(7(w(w(w(w(w((((,Fi2JfP ٩B*ՕtcEEEEEEEEEEEEEEEyEyEyEyEe5 `KLfPf;.ו-ʕ-ʕ-ʕ-ʕ-ʍ-ʍ-ʍ-ʍ-ʍ-ʝ-ʝ-ʝ-ʝ-ʝ-ʃ-ʃ-ʃ-ʃ-e#!FBlF"dE6m!(BQlF"dE6m!(BQlF"dE6m!(BQ2/1A@e, y4H qM{mmh*r/Kq5/IUyIs-Q&2ZX^ KY~7o*O$K/Krz*ڍQ{oV[o*V|.X.8eY+dp:Z+FpS\VVweFq:  a8Sޟ9a0;nXFSˆ \'/|p7MM"7\N2~,:/q%Qn/;,ַwMp9bY֯C|}[vmY_uV0㿍p޸~&lhI]W0IoSbw*䀺&8Sr`i#[v$>6v DN%xLrImvKm(@%\ߐ8[}p3[mBo6'?]&z5¤|Zov ›r7YL+|V? )_v 2+iHdyBH+YH{؉E&{\|˅J@>EUo1WV_/2i˓w5ɺGMEݼ mmRc L{w^[.G &]9_߽6QY4K8)ۥ0|X^mIog2G̺~`ZqPRYdESGޡj[w/ߛ"Gev W|u32Z7264kcT u-"P%J]fb&̍fRQ:K+iyf8gWfc\x~YW# dbzT:: jK: }%{zE_ +~ BE vF esm4$\-\͘fIlYA5.-Η (4p8?;-k8+a\.E٨uFv݄kp?{|}bW>c3Ղ˻q#ɏہ?a1.'OڑX 8|.Ǔ8p_剱^p~( rof '>]^Vn^bpC~˺O*Y9LЛ8=* ElҺs]__^N\ 1`|T/(Qw>GFDѽHKR{⨝jx/#PĵHG.vE~(|޳4hLLE~Ւ/}1݃FL`NUw(]ԥQDo^_7M^f^eoC=qq*FSךC;~p8bDwK&!|H3wQ?Y{AW[l+<ٮv4f%Xp.vt!>)mԷy PPmw]F|ꊙEEP.) E~2jWlB(`%2qŊuz2(KuG[ʁ6]|nfS2!mN7@Î5quQ}*ɞNQyycCRE%׍GTF}֟hyanȋY# ˑElDס+Qi"Qۏ4Qʼn^3"/"ɋUD>4n\O` Pv Y5@M_E؍KnӷzᎄYw}ԲaT֮ܨϦۑ{UueD(r( bxkNsDBTo ? dc7NUPg~\܄Mw'?['Gv8KL vq%+7=rիCAQ/N\E[4Uէ T¯yB;QJ)7k*G7܆YUYֲxtU0zYbɃN* _*_ hdpĊq-SeCeTEAَ֯B׸k*dY!rԞ>um{!5kj9?\8 T zhmrruyC5pFe,,?<9vk[6*Z;2̵1J-M5(:1Xr5ȡ%/' F: jS`TrqC-߷Cl9b+r38جqIH8 sF.wbgF@R񇌘ygiaJS_eED~%~̬>!-.= )t\*?".g:nG(2ز|_*Sz)G8MSɺя_GF:PL>L?Qrr\O/E>!7-KzR ._3~D#ݏ u=])>igg \H:y/L'zK`PC1# \@UD }H Ф~YF6iZ?ɣI?,T eQ#&ήnf'G3KYYtev;po ӧF>}B{]~A[`PTX@V'ORa<]OqY?1~T>]LgeigëE߬efCkQ?Gjb]l#F~Ȋ]r zGt i-,pdͦL  :Hƪ d#-P@ oڥ 02ڔLuyӡbMJf6pP |} ejfRś]8YMYA!QAa0];",2*"0ֈ$1wx"~DaYIxGtGdm-f7)8x+BEElPϪv;#Ю;8y'04kؽf׍  !(gWY#/aR[AOړ!/ ΕͤCN^] t\YΟ˪NxlrE:ttHѵbhpdXhXDxa=I狒\I+;8b2 M‘D [*?q2;w:Ѣx+&FOvsEȻ6U&=Wjrz|L*v-|5)^26TH!?.}u##""$_U,Jwj5_ZO2eL_U뒝tu$lfO]r!OA^V5IWq8U<۪,>/̣H&ݡTlMU x`LEْ(UoA8Tdmֆ^_R40eLLgrGKD*r'84,GXď[I~QTT>]QEf̉eFoet?.y㒭HerdltVS?KXYnR].CpKxȮS~YroBs̨`rV&uiuxH`gɤ{9H?28+;@r 8 4(9F_RQ=E(] rZw5XzdLP^B1d "'=!=\U m$w$8Y2pd^kHdxpDd`og*;O`(8M  F``_s¨c?u0ōu@ɯ%q J:>5[|Eݧ_/\`ds5cz:Msc䈳| x@?T(~R磿Ah~rɧ)? \C=SE__G9yJn]^s ,4R{p~~0@ɳ`Fݚ]`fd謁e -y6TuB}?qMʙ)]z9G J㻽.ohvm L>x;bt62ݰn.n[R cmkS`)ia0v›`LaM͉w5͡Վބ16U,9%W ~L~ph5 l߻ caj܁\h69-Xsؤ}z׻e:'}/]2sX/\m&nؾJ>D:oaʹTXv’F/Ú '&Є5kU9k0L8jc3oyӊE8lSx[V= 9&9'.fs46Lucduʇ0ky@Y^Ntt_3jտ̼)tO0}`F =>Z &p&~ ?t>S*L0/h S>/ޢ>|_,,33pm n5rXQPC]2v3'X3csѨoe,h;X9I!16ê1ml@9}aՕfn;;E#&8yVܼnoEXYxXh‚҇όY\~r,^qdoނevi17bkxl5av Ŏz ztv?6-zuނ4بS`ތ.`'g5 ݚUj~k(}# ֬xpnv|E[ڢ kϼV) Bh ڟ.RV_%X=`ʼn kMU薭LN]ˇ<:5yDW\5j7XG]':=66y;ls'&ydmkzvY ~ ׼̾<зMm3Qu~著=L7eZaY o& 3- `SF_{ L~jrLa٬`j `Una=¤fڗu,uI=֚'#x`t89éy 2`̲\\k ؿe56 aU9ZA`ScZ~b| î덆Kiھ^ ;^lKv(߮ǧ)5v_m{nۮ}0'lV_CoÖ+5?LKK+u~Rw"r!8#:'?3 T8\/WLtkSK8`ˋqcl'8H8r(npgNp8cKpqxN5N;kׄլc.mT .88yJ984ԩ"%k/K%殽qgNJVZK> {LԲuo:a7ڴͷG 5ۖX4l귥fTLXvӇ~CaIxzOG{T}?ͰobOšGJ VPҭB'XU벡o`z:z8+c޲D/ޞ :n`ϸ`藱 J>s]-O6덨X9k`e m'҂U̷ O.Ϥ/xQgk3X_hyaX!u,M æP߼,`cCw54ǟH+лT~i'Wa}f;ێ!z1~+fLF _ 9$7Ш ;/~xrQy0HO=,B&w4ܱũRȤݗ! *JJ>>sd6ϬddYlUYG~Bs.lՠNCȲߨ"Ie ]GR; N4}Y}hGG;Yh3j"!+R=pa=NB QW+ -_rTήn'2,0>DTzцCZG&1ߛɄvٰjd\Ҷ0Y5^,jV;UC]:f2sywdjdѾ +j]iYzvnU/]g؋'bbspK閅>JYޏ \=6'8=rXٖuO|o̟m323onUI3e`)s"u_yLe">uQd]n-#K;n+NzYwqn5LtYHۃ H|nodxcQJ;PNz$ڠM&NVzuџNJ }6x~P3=?d.jSk$dbied4"fw>ZGߢ+!KqaOՌK쏬k!iq,C}lt}lz?x&ō-"={ X6<^fPkegb5\OWduh7oKџg{A~eRB -_d2v C56g?Nfz1BUn6em:般 [Gdw_<29{μwQrh~M[Q L=zHuze<]Zxfwz?L73վʬ3yV߬_R:ְ=ڪd '/ԅ+$?Ƌ~m'R/f#'*Fi/tvV8wڴ y:9j-;Y)DC됑pBd,1n,e!S|;T 3‡dbX0ȡXbpbXƘEdO$P^| P?d%;Yx+\Tv22q;D/#'/ .cD?J%[bLLIzra} q:9 LccpyH>FXROO!b7sl ћ#eBEdoۃ/7r{tcR/#bW?zb;RvzXb~K\tc&>Ƹ} Ǵ3)I´ 9)r"olc0~ۉGү\)1)Wcb6l|kL-\p oEI{`&5oߌOnw3R_ҎX/nN˳xMj'؇\ȸBVd$~32Nq-q{Yz[v'!Ό۸~Aۯ8&^O̼\~VOȼ_eES_rqȱrhJX_|*V{qS8֟[ʼnc>RoO$#oWכC2ijNyߑ?`&_fD?H>?\#\2~B{^̼+MNG3[\xW;}pyUqT$a^p<' qAH˜;xY|r+d' ׳Aa\\8q?p91BմъA>RB>SCЛM,:duGi\e1-|=X2NzzCc>Ro,G;HMqk, U͝?anXSGROR߆-G%PyvvL{%p9?!1a+o5~j:.O?r݉~XIi^j'bkejX/WL+c5q~7\n󑏶tH!xܨby>U~T˭˯1J ֧/7p>!6KQTz7 #HğI<)ԇC>D>"8'DyaGy]q>fvœtqO\Xڷc}+e|c\NGbL.c2ښ/[\vdaO^M0?`=bf6BWnzׯ]5YX~2A].:c987<7h¦uIIl۱iW'NzH!0-˫pθmIkYC7NXr08W8?Α3'2druzU,q#c5"f[rq% qhkJ`-r?5tLVp=~^|~Xf54~ `}ȼק9ͱ^#mI`=vAVuq Qd^QE#/?2O"qK0N'rJxH1/.åe|2d؍Vrv5k\f; Իs=PSVt،*^bВҨnX,O[=ڞw,yjժðӸ%]ks6*J|1PA8o+P/J~F.鶹r5ݥ"V%?AO/*t^+Lud;%}%N~[3OyW7h |U ݾ쾫4ϫ,+/tN&,O,OVNiJsJi}^s_BwFn/yF~]yj,}5h15qg,r<۱CQt{7HxIP`)Յ*fȧujӑ_ ·I]PSSGn|a;b4+眻;9@>n'ލ6ν.ӄNVq7')*]_^iH+Tgwѝ mD5:}^*u/aprxw|}K=1 X"<_E6С*UL#+^[J<*#CP٣G,n<-;=L$*gmBTjɊZӖ ^j;$*lش TvOA"Qr{ohw6V9_+ثey=- >Dإn#/5M+ GdSgSmnCt}~Q:~d=(Y#ip>^S,|,Θ< 뱘 rY P+(X?]d~0\HL8q}u ";Qϸx~7dI#xLwUQ4l$Y/U/˵<*!Sp+뫁c)+|LI$}v!#t/Kc <7'8+U?}l_dky7Ae󩬏,,Al?84 ~qR*qhd]Z%g {?Vi; YxڥrvSO"{:jt93QqenE% ho4Lr=0)BGd3"c 3}@Omf*çOT ȮK@ }~뷶ΪN#kgAmC[3ZyP^-4}|T$ׅ'ã[~< (4y\-u}Kn:F$kQ}gFoUmԾ|F82?\wWxݷjm`#TJDng|m/uj}Wxe3.Nתjm2rU9h ޹yyrWkl\jlny#fĶ$-\.U5yuj'Kwt|:%>oqBW=9.Te9Ǣ' Qժ.ᝫ7G5=Ϸ- 1}{)sKy?ojy4jlr;ҨT*gD#[??70aWIk m%=4mժ7B.Z>Y|ؒīOw^\@Ϛ} m2&*G#w C˟ǔ8]홆4Y6[*3a=QRɯV"[OlFvox&eH旭 -J=ܪd?ml% Qt퇊wU`K3u$9t<9(X\Շ#GN?J g;rpS]v *ORTiq(^vf?߫Z/EP? ,\eERP\;WNɕU" 8K({ZɔKutXunί]Ջj<.JۉKk^\e'%P7cy"ۇ#3 SHQST[Uԏn?]1H澓dĞL99ҝ9G?I}LU*\Ođ)Ї~tzr裯>K.gHGj{צhlZGԍ~K ;]n|"Ԑ'~CS?֓@t;OnRvGAr|\HB9"5\T!ÊSrT<Ǵ\CIW:ċb0eq9MWr Ra:HzyLr(_ 8|78_/OQxI9OԗJ'T+ӹ(_#P]sw>QR sS vz5PUẜJ~H&a'E*;r_.8{;z(;^);~+ǥsIa+אԟ+{=VrnOLQۇ+^A}=grߥRPvKzzHOqGP/˯TܟWKi?ȯ_j:q9)>j=J͞ \㽲1e3]?Bx"Gr1ZfʩG@.ݗP)O5].,M;?rwyRtjғ׿9R9s}\.ziO>q ai/bZN-.=CT]zCq6<8M'=ѢNK~S[I~-%?ҷJ~-$_Gɯ UݤrOYK~~ҷ%XN,WE?_-\7w,_*:U<CNθ>q>.޸~޸>޸~ ҺIo?i\}uce" oKQ[/l"0m˯<nۺ_M܎'-GSn'ukʒ4=k<q~?wya2Kp4Rѧ !=Ej[O)[v.J+`>HZYx=0O}n֘J0׭}*MtccJZWO\&|vl?IOZېbX'n?un:mJJ5# ǠҔYJֶ6֡Yy QK-a2i}mlKnW,`%~U@~ #Mi$kVytK~%٘5@5?|>~Ș)vڔΦ,mV5pV!ԑtkeUgՍiiIːPT k"ҟ ?Ƽ"W@_8 ~\' S7~l_-~/Yզٵ:@M/ic!] ~B<0-%'^_QA>m.H}Fkd1R?A6D{U2KȋqukƎ?}HFyy.Gί.;RF{n#$櫅H/G2=$>D}R>\",`Dmw+L=^b8Te&ɹq~:{#"ӪDO>}=}+ r/hyROL1*rYWZVR$s$xDߑ~=2z7ƴ.GzNicRawթx?b&0io"z#aRSrI? щR_b'29bҘszts^Wp't2Ĕd"2PaӲd|&2nQ|$sQ|d\+V(?9.P|ԇعHLqB*].P|~2a|0SbYt}9_aH_vq>.19>?ZM'>>?_Sq;ퟆ?$!cHA=G#yڤRp%"K疝 D^ Om_/=>"> ja}H8<f#p £j QZOځ2:ii+U?<7]q7<|{Tiփ&A!!Mh é 5v)$4?X2}rK/$%+bmxަ~B:ǡbGK.t0: 5tcyUZ=,_}rX`GE# Iu #DŐ>$%^zesPan׃6j%D+L~~2RI7xqx~NZ#wh/HRH/g6G[zwoxwµ fRɊ'kX6g>=k9*$ ~) Ӝ\޷>~}Cqv#͜!AM.§?m;w@9.ȸ҂1bry|z 6%H95E{S^XjwK/o|-vΊE퍆";| j _U|ϩbWH;m_'8Ī+^8O _G\] _tk6Κ=7@{__sS x`KkPxaG__Ql:O OVO Ԍ籡 5Ɓw"]\F<5:x-)IoiOj꥚L۷X/jz]gCl@bG2S+΃"bZAsi GUYHhաKgH5 4`9-Uw'R}6zٓm\vuh<1Zux/)2)1-ߨJ@&BYu:B nC֖[gK\ic`n{)mxPJ|W :8T%|ܴ$>*=z/4W5 ^ =ѵ]qT,JFz玎^ʡvũAA+,?a!KfM=%^dRϒKDA%]3e "T S͹ǚi"xo:/a7c$c>AJ;YZc!㶕/Bk ?2m2n/u`fFp땹q0nQk

VB$Rgm;d*tӈbT J!&Ind4@dgZΐ^ς]+8aI]Kڞ풃@`I[ƧՅ*35 io ϭQ.>xԪTI^}6w+I-F+۟1X3WjuR4$w2`wop_'> bS}fܹ4>99gd+]/5>6;$:|3- /Q;h>,[gW8H}@eI lIN{}잵6о*.v q3=NL煿>xhR֬V -eב{w8]#q8.“z@|Pݘ%r4qe9;T,&zu_g4=)p$Y_־Nx']CC* )_< Onjo(_&鯕8l1֏ F>H 7k&Ъ ʷ'b6ϧ?/b?jݔʠuyMBkWQ6q_]?u9n6ewnDgx}bz"iR?Lg›R}=q t#!T?/F&:onM3}@~W[Z1fzrpPd(1C6.nX>H~4՝yjH4YK M;>3Ə u/9x>e߭ǿ@Uv.y< $S[?m E`X#t^Ҍ]}<[tr|:kZ>O930]f9˃ǯDsy&fEPyU0&i5W۫Mޱ鏮Ml*^QL/sJOkxݕ|'ql=Ểs/Pøx=8#c֙^:/?ם! <<7 'n#$]P؍Ä+ہÄo.U> d0v>MzNd뽌Yf zz|-o4\}NS>?ϊp2oZ.5]2LM߁xX#3*êN ak{aϬoiuynvWwo8,N$%Nw:&Jfb3ؕk^caoMJC\sy8Ŀڤ]a+^w; |8{_6x_R ; =ϢB$<|a8,tvK66}2xg#xRxXc+Ŀis%&ٮb鬼W[ H> %g^>z,^m@N xc@;B#z΢ON)KӀVg#V5H3"]{v^[ H8jA*Fyl ,4o\81n1!5u[TmZB_xZG/bVxܷ~?k%wۡPlxXqb^pN{nڭ< #jjW`W B!A3VTk 7{l]=FbB=ց4n ,7J"Y]UpsxݬJjpuuDO9½g7Zg8Qc9$"Z6^}d YU}m0;x/^#. g\_#2>ݻk<\(8tO!Bw8kƵ}JoɮMc̐Rk;K4[ nu<j^POj9j5rh{'/L5HgGv׃)aݔFQG3`..g7?]6V:ah7رoBpac>= u6\; j?~:*_Vb]_-qfp|}NpeCCfi"m`1z8Q2bd֐Vv"pyUG];4>č39o&dG?hgs|]g"\oOa/WJ@yC3: v-=S;,rX}QsU"Yg=մɂpd;C}+˺"__ K\&~8\6 e2!Fp8\ٻP?u`u{{h!زa#I`ؠ*`sćo,_ '';&.sl\vxPкXִanFK|7odb ܴQoj:}f[6Ν}+;aaY%amMڇ/46za>Z VTDگI(jFWI g;۲yLjNrٵp6.vNmspWK.=g4y Etj aםoNwe|Rrǯp)7gz:u;ynFW]iV҇˻? ]9uҫ|+nkM.-'VNw(Pz=)rV\0;x~4Soym\Idуjg^PnW+\yf>z>'r۹͔ _m'ƄN֭8v29lN7li5>J _!ԓC}Qqgg1~XWCqu+3;9ո[y2 [Miy-b7pk~Zvo^]cx`iz\14Zrn~}-pR!@\G_t]G6~yIOAB'iԅW = M.~~F{KAt n{pŬo>G%+lA~Pڦ!8Y&L}4.Ym_kُ78oÙ=+봟 yh{aŽj|aoǭƖgR^©R>g<9(3ٗp6Bvuctdp0xC8nSySqz =ۿڷ"T*5p{,J_nI}Q̯8jvn;8}ڿjw܆kuyֻ03-Vհ +vk[vo4")zY#'x:i <ܭ:7̛phĒo.X&.dе_F6o=6[9"~k3qU&>S^Nb=WT{2t`ХAﶋ~!niM.CCx_EPu?!!ļ5Ow?Z^Nmoc ʤzN4տo0t:. ԤP#pwZ7񵘖p'`W)V[a][X 'o:^Ӆ[u~( N:h|a^xg%NQ\5‰7 .;yW^p ppz0כ[xrwgp|]wQkqx7ez4kcc]qM޸֓28k78zo*=pf"]xmSɶ;}.i1b-mFshzz}6֬N*w#}ul/wnt!Gp߿.]tp*sY֭n{4mC&>ҁSܿlg gL~ۑlz(x{Dz362C57Ap3&)} ۷,׎b quiׁTݢjI-д*<T%oݩsKCG!K MWҿa<4pcUPE`n ->π9цEL/^vg Mԙv\Z$te6d8/~o[0Q/簡w([;jfS`JA/.CMz/t6:G+~f.lX r<|!/ Shoy MّδӊŮW:޶ J]lUjv7|}. hr㡘zm5>u5OJ._uOSF靳>uOipyˌfVL|^u >LԂ^\(xnKCECC_=e31WZĉBR#z g^W_yy!w3aϛ,Cf'v#T|m +f{Ьn׹o;vZ ;ނ^s\D(S:ލJQ8\ty zݨ^L7̄]ygp|B:׷K3iqN:Gyg9?d~#F.'crwbaR" zL?THVz >uh}s x#&{4q;kIzIxۇ#v!~w./gR:;܎Ğb#K&-rb=S^gZ2Di{/ dvxbԆ#96A/7zS^KwUkc齉n O*Y7z&ڧom~ <.U/-w۫;[lٴbxXdAA al? ;fvvKˀ^;: uwH}HQ |4q>jb5,5pH1v5S*hg'^悈|.]V!ŸՇ؎߼;VAe1L!]5_ =zbCVC Dž^!׌oe϶٢T!]0q:n\qHV"^ ͖#}-V%i!Ey]:\a$rS.H{o!j%*4׈i1`?i]MHk1=ͧ|/Szc4&f-0 iz~{R:fwغH0ͬ N>iE9xoMޑ[(람έa|{ yUÄq3AR[ѷF;{vךt1>pz!u- 27VYލzu>s5|ϼM%dXÛѝwL̼Wn^8T%k/j VV`%#Y>|dc!u ){럑ӻWwWGi"~ٗ?wxV9/~E>A-x`t8=@L[6{ZcH5)w ,g<'U>ƙ=;e̱>;vw4ȩLqС-'߂=ިV>{ٌG뷗cΌn K۟&i4kb" E} Vk~HY:XQѡ~u ,k): R4 ]Ko.Mx߫·ݗW ޛ})jd+oH~S2, G ^p:^ͱ)dTGW.M 7_l=HL-?I[/p*uxY c4nz׶ûz1~fBJ`b !@aAkkV;%;N>mVU$C](i/_ Rjݮ޲ďeEqナ/zq5$JL:&^ ĎMO_}" uYIтIn$D#'%S ńd_|x㽺6BOOI88v>_vu_ Bޯyr8<>q+A1軮8 ~TUZ82#\!H>tOjulbK6=N|$d>Ԟm.0#qśGb"?DKg.\!qԮ߶/BYPAޔwiM:uC{rcB0sC#HЫIxn$Dx M|(ɥ^_|Gx }P,k5ehi>(~):h!W΂YK,v%$U],uxl:|¢f~xT  etK72wExAk}xDxU2/fރ}<{P6Dugt9^_'a/W"C>>ַ'~-.~oK@EX*ľoA$P>}P푁dA8UO\\p~9D yOo>|dyjG~/ы/G #b=ya;yk!N;lBKC/\xe9ҩoj'݋:A ֽ{A,Q97բZ'i-Aڧ,!&ZT OHI'x*l{d?~i>5]&{tn ?>Vp&Y3fu lD!cוk:CBm^.S!6ZWL cφ>x$;WϮV{tf^Wھo]V'%R=xxfB Z혗NrQѳqGݗXv׻z!^l_ KhTD_rynz Yr1kX2vLxy\˜n!#z_ .khSp}c6o0nOѳҗn&6z@mEx-M桯'?\k? TxNǬKinړ*Bz[S6=_4FWHzjɬ<I!vũœ5N߬Wj[q8_]x˪lywm4m\c$,-)iir ӱiǜk,7ʅm /[꿟pb-E?y@̸&'Qú&Ar{IN t^Wd.Otb'=Mh Ĕ Ky+βIk[jz>KuZ?hK >N| yx˽Q9پ{r ^AB+\+jn1SU**ST2m/ŵO<7ƈ&BRFg%󧎣xj8On#I&#k&F:5ᡛ^#ˏJ`߬a7 a2Uی 3˕%>)MeN<+tb7~;@Ho"O9J]m0`]sdz/X}"U}_o85&wiB>'Lt)<ۥFEKgM}n|No__5ę4>8Y$HWVr߸m۸Mx/UFP gOSu'|?u .J'yÞDgm2 e]|$h $z,%i184I\ȭ ~iFnh~|.%= C:}H+j: mr$Em. >ul:b?_pX~/ ^Oн -y(izS?^\>Ho/@oMo4V*ui4~ {X|a|Ь~~P0ek5SaƈȠI~V3|/zwmHիTxW#Snh$ m׫6m ݶ[h#%T7\ Սht{zLYT[WD/+XIdhxn!襻]/<ޮnqӠT u!޽Ã֡"iEG|+7"AmKq f#E=/=Hwjw<鿒nKzEE7^Y6yYTd{}PᎭ{+YXba͐3i+k7H N>l $\Z"pjj囅JAʲ#7]qc]@t;-_}Ȱ#'6ס%A몒 ԛw[4 8<Pc먨owţ{wihW`W𢎰R9tdxtz瑑m`OEFո 2YC(n!.t_x OOKFI :pXP'לmAl}lC^{l@}Ŝ mZ=!#S ]N6ґ L/a5fE%6y 6d7mOuM=6# fW>tX'{-nNepfݟI*KXAᑫF?WvOWԂv:Ok+tD3oa{㵾@3 79 WbYVc"]՛w^ >_*br%py&փX#{UEF'SL# 8iBxR[ė%~s2Ě>UX6]u7=WNƒVSFӧN>44_΄UuV+8mATΠr W }>=yx8޴c@tH[y\e;i0S58է׉CLB`cpxCyVBxV)pW?|sEý+;ankM[MFpauj!N[~#uNB.cz-qir<\RFF09pvod0캷ːEs|uo7ݍKic酗.ufW mQ#ul. "^,zBpw&fvܐN_wG:3CeG.m+_?Ź=9477u\#޺ߎii ']7,>b i{ r G_M;O_N09dp2XT ^YX^|xasdѱ"3 7/.ixxK!`gc×WO?ӆkv{?/w*cĶ{-AFHY0FSxdzI;ݢNTG:6}c7'Zc4648nhWZSZ0\0ңhP)W#ϩNU<#׆]zSGzf Vr=": 4_rd3 [5ܩqtŒM%Ge)V*'Ë/ɁL$hv yiEG ϧ*ygt&1M m7vq/YYnZ Cw[c{x{nm(|[^Ň#E+;NtOimY(WrwBܴdqo%WЫp̰aybc%O>2<A:x ӋEz?هC_|&nG2xΏ c9dr=|ˑGR롇7⨔lZ q| 9\)oFϫyG<_6BXo]o2y7Y'(Wgx *H)hvb~m|?P >/>7D؎fOQl?rH7d`= `{Eaܮq`=>$t }u_A? ,*4m'-ue%挤wmBswOb<*t=sIU Üau^A._ӋBdCS>nE3t JnXAz?ӓva. e&;VZ/i͑}7!=:6sQ *{ƣ~1mjKEZ&wQQ\odhQ@j8U1 6ډD!(('NQXN7wV!@::h{M Zx$O)oM}ƿwE#&0@E[s2wᴆOCQ! ,h#(pg8Aiaf()&$Bic!  / nTX&ZĔipq#MWRUchpɱauKx˩Ppv!PcPD+t95+hf̚e=M z iMj2* &h֎pʂ}SƵWE`r&aWfлA‚ny\hT i6ʟP(XZ5'^xs'(db5䷞vn >u .WJ~0.]k&'ãE_Z怞2&dhyh/Y@VҘGBQe7vw:ZMcwc[ z2uįLOuOR"\ FU# Q .kmѾ[#d朋l|.Zolx+ϩcVkjT9 an.0Ia^0lt+h|2cpC?rד 5fEC -x:M>ߴv7{5y6% /C.Kp>UNpYS/_qkge\|nnVx NJs,b^.zG|A}{ݤheP J$^~/HUgmxwpA> <)aE(E b zfd1wtPm*-u\6| {Ƥ{:in9TtQyߏK1 U0h\6O 36 Rj^+[[ѱeߌ!X7]H'A/i`u6٧`Vn+=u+ؽk*^?|ѽt<# cKPSփQ^}ڭRWG[a8uf>˞ſi]Gж+1P/0L߯EaV'LnV)9!\jehC;z&a t P\:o/tj!h=P˨~!,T?0\+%[L$pC71  м[vOfX>lFbռCE&sY/C+e*.ngKHlY yfG ՠnskyhqâ+ԡNk7HmðGC{h]6CXB-=hj9)?ʶRWZJRJοlw_u]ŕ~B_*ϗI+y4/'z%-m'Tl9(=V^_$K>r_R?Z!=/zԟ'I~y~\Nr>TR]3͗O^\οG)_JEz^.,]^Һh!ʥtU8EAi ϧ#cBGKR*ƃʼn=^+# ~V5ZJ!Pcoy8y2ZD,`WNtZmMMM4T\%T0vRiju΍^Mri0w;xDy|/I@etZ⮯&Z{ ^!E7A~'!-*뵺Y0?2AYP @1~6rrGu~.$TAE/Nޫnz/(bWW^HlnY*KPwLsdAW㰞cjƦ;'Tݶwh//JŠ6t?3J#ore\_̇'MwtrX4Bܭ>p0]HSz++mmͮ7GY턔wk"fŁ*YA RƵ9}4(~෧_\GC;- d?6oEn_Py|8;(%Bn^?]^=qnjEb|g!*Amݷ#wAa88 ;Y2P?'.9JRX~*0CMȁyXs񊬒enZ' u-k(#zaygڅP5܆o߯,] iU/xr|5gw%<buj|9z:|{-,5m[~hvnPFÞx?7~Fxn(ZXtWjᒒceUW17tf*j((nػ0n=_˸EϨU7h%U[t܍ uuN^ ˯ʞI'lG-=r=]Îk+q6t)vv#T5ǓsHzp`(?IG(c Lp{5*?;d@_[8ms>B6 >|We=j7ʩ??խ4< tAL[=Wߛƭ8Z|2ϝZ3*:HyO̿COM:-uwvʂE+9  9Pfkim4| ښQ=ڂ0P,Ea xf6'Ǝ-ilY%&9TF};r+hr0#PQh_Ǫ'BOZOf\sZ2iy[:);3,6Q4fЦBvAg[xk]35~ #hy^"aa1zā]~ܟ..~\c]fn-{Oa:(6[lI$ζ'Lz(*$;ڷ Nc:5y#dk>r T|c)A~Қ9 Pv+ #N]~fc"yi{t?%mf?W~Ӝ,9.̂fas^On Щ.2\n0X?웟+@fz6]/l0m@ w./ Is 9Ԇ79n>w%[z2VG/_SiO <ދwG? `|aM01xtDbu1ncU9ºBj.o[PƮ^(ڵ:iG:Y4̽w:Eйs/SCzha{F#?z iFXJ~ BT(U@=ӫBb###b£"#Q{OMd?CȐN RB11ޱO >oxd)ąFVI;tl ([Q!cK%r}xoʁAՇ{V2\㢃&PIGX̐˴wkKMFM죃yjjQ)JqTROx*S)JiJiJiJiJi`oMFɈ^^<58*Q)JqTR<Ox*S) P) P) R)-R)-EG+V):ZSthMњ5EGk):ZSthMњ5EGk):ZSthMњ5EGk):=PBS(z EO)=PBS(z EO)=PBS(z EO)=PB1P J@)(` R0P J@)(` R0P J@)(` R0 zddt/h/GMDG8*Q)JTR<⩔JiJiJiJiJ(Ba P(F0 Q(Ba P(F0 Q(Ba P(F0 Q(BaG5P8J8J8Z-v;Gbhs9Z-v;Gbhs9Z-v;Wj m&GLFf`<5y9*Q)JqTR<Ox*S) P) P) R)-R)-"e(#F0 Q(Ba P(F0 Q(Ba P(F0 Q(Ba P(I1eSRG8*S)JTR'10uRI|g0sp%]:?J{m4˴<_<:0߼5DIUɪ]~uzrr{Mww5 ߬B[}LQ|j;U_nO2/59o;dZDnoetg\My}=GVXޔ|[ߥ-8]*}sVrV멬qk2執}T_Nv>c00{iv*˶/?qYC];1l]E3鱨H{4zN;?ۏa ی.Pt>q7CW.TEf0l$S6yYߙ+yQ f{pϟ~I'9Rm y7o2c>=]zUe뗽wo(ޚ=|quÔTa=[9[pO?_ӂo5ޮvhoȗU<>\7U/|Y=|یOeoYT9vT++|kW7 d#\~]e4|_~)b^}^f0T. oHvU_M\S^)|:eǧ c*n]禿urLַ0sZ|}\iQ+,u0- 탔=y u PwxVH{ 1% @ ]Р ]~;{b S?Frj\sd7R1kPioϦ?&UH]FD֔e##2!U]bkC Zb-!ց:ĀuG8Q:pԁuhG8p4 hG8&p4 MhG8p-hG 8Zp mhG86p mG8:ptG8ցc8ցc8ցc8ցc8ցc86c86c86c86c86cCrX[]SѺ6T-mhGEUT)5Ŷۚb[SlkmM)5VWluVWluVWluVWluVWluPl Pl Pl Pl Pl TlMTlMTlMTlMTlMRl-Rl-Rl-Rl-Rl-VlmVlmVlmVlmVlmQlQlQlQlQlŶۙSĞP] @2 ($|~գBY!ǿW 7QyɿeXð}d}ܟ~'⑐Ty A% ?/_K޾nc;?unn/kW{ɐKl?rdߔ_}cy:_4鿠t]Qrt)|vxʡC+wj'rob߿oוZ?^iHA-7.gn~?5x(x!ޗ{Zu9{^{_?:Mg}sl40.[<>n|>S%:/wOl ϠsWyP꾆GU|EaDž:zԾ_ ƟT]_mU>wׯ໯o3WtS.|mB )B47$ mMY?Oj)8Ɵr(UOSO.|o7LC/M0{bti`Q F$'y({/0 F(?ۍaM~?O~2O"{Mh$z῎9H0v>'N(RFa x0δbP*(Azı:A \&ޗEd25 ({Σ(;L48_>O` 3~ G~ L BLDSDE.,NSK0 lH0Oq0Ƞ?nNF(Nw_S$0bDp*@?qK1t $_/ /ea6n9*d.TD_BI8AxI04U}rpH]zQ?Nd>MrѡIV I,:d}:)^tcFAA 8;8n$8)'kP=2.4)׷b-5yWLC1 oGq2D͡򝽢3z(?C!@10buO #MN$w)$)I31)bI4I}}x',Ar跳`X0,9ˆF4'7dàs9K 5̒XCj&.oy_lվ)ԸfUa0ņ%ʽPmm?V"j<FFTg=M AZl0Wb*TH$-V<L#4RBՓ6NBI,z. 2CQ UsYĞSR/b>yFàBRh5Sq)p?O m ͠q;IEVG ڙEV2JQkWbaAh4 b[!G2^as6jA&3VQaQ´ͳb +W^D> w:x/ #ht1 "i O.+0,6f9b~rrǪW&'a,Fm6N($ŸR?GbfyI^SP¦:<:e7͋BPrmA9e*>1 `?ꊍ+V8$s2vUVQ:XBuTtO@ƎB/E!w Š*89ͮ_p+wkR;nx.2]Eo 0R2foade4/data/vegtf.rda0000644000176200001440000003016012576021756013616 0ustar liggesusers]|ՙQn6EU1SMIEVZ!v)R$. #!\K=4v|gwgwg4}+O{v͈D"5ZψE~ot4D"*fͶ0W'J t#q:Is춑IQ֭3]~6upVvr37L~u7ۖI^~qt?}nl"6k]F6{ %^ce4^'rn2^ls=]Zl);P4KmG("ٸ*>KV Z].\l1Y>ZWI/RA2Y8=~.ta~_>|LuIg'v?#|{72Wy݋{;{H$;.tW5~9=Wg{r-_j1^eaץ|T39ek3?F#5k?Vr?/#d(\JyUz(SoI>u|esJxW*˥\O%慩 J\RVJI9߽V$>*>KRj|X *ֳX^﹦+_;*S*w2T]¹Q]RJbOPkKC_µ%</\Un,zj(R:)6Vyn2/PB)s}i8'b٩uáT[)¥ǫ\j ߷P(S+E ۝M_{TL'^tiٿW;TR?DJp|G/S1b~ϛ mׯL{grs(Lc7^ep WG'J1+_Km#_IǥYq?lR8!yy/{dixw:y7<Ϥ?]=ExpqttaF:w;+OxG~!{=wus~kLÈJIǫl-|~)T=SW.hW_)iq =AU.vPJY?AXT&OKI^R:M,.-:3H,+>oV& זSq떠s9$Pb=/O %P%ɋK̅|>XLz|nQ1(E*n&}~8~ %Prui\T?R\ds2J8v=-pw60~K__BgAʖbfF祕xN jlm+ռ>5!G$ 1 ҟktVRRhTzB){B9Y[%9JP{CUryϞAe\3C RJ9>ouy.Tg*L!{R:ZC;BޥD2.*l3~fꑎڞm|sNI7x׫NKwt]=ڝ RHÏc~LHnICW]sJ!|TtmK|!J|UkMK&dRbwW. bLJ垛~*q}h}^#X Z>wEGߐr3Gfgxړn>Esy^uٞcfsye>q\=^E8o+r'/L6y%9OUs"^K(( }$x)5nER~ɇ?B ů뺴>Z,̦WstG|NW 훠=AI5GRZ|ۚ}N6>ӵ̠}.~ײ=|I;6)n|u'~f{o}R;\ߣdZ5t/å~uKy/}ӃByzoxū_2J׏۞syUdo\{X,d;(3Kgo]J)ǟ, }Rb]k+˾AUpi?Wo=v>΍rbK({L}kAI2vmI*iMTx]&[UWR<-Kt\ZבHjr9w Ű\R >t] Dv)J)WQTK1QW+m,\z}VHC<BqK5Wt.^> ry\ WoyRSTʜ |.7JC=o,>J5J瓝C&{B F*=~׼AH9+:|?R \MB^<)j[ m&)%V3bWRB Fr& ^}R99Q^z髆P1ž)՚jjhS1r鉒nP2KW5P&TrNu. q4w^ڞ| ۳j à$S-W}ƾX2Uڙ-a#~/\w|*K}WI8EySR8N\g_Bo(__!A6/+vU[^xgJ}o(dBsL^A5/[\~%7~|8s^>cB.}>r뾡> >¹-kNUwOLm){|W>Kr9?=L6w \ZwPAPȋX~C*MWr_džR~ \JuKwURvB){ -+2]g* ?y_9X⟻|hyLCT: RT(亴x0Ru %lR \:$"r@/LFgJ5si HP\QɿMx1Px/վ]J"²˽]e WZ&ݼ {[Q'?k> >kIےn[^mϴ.mbL3KWt=[͔cwlgLgOKc tȉQ_^uMW?+ 3Sh\:>3|uGg.Rk7sl:+a?|U^>^-WjR5~.) 9zrj/c $oJ%ŴWl+DO!#B/Ҡaw\%( Us Jv)4Ƚ|fPN:{I!߿C&KNfLcdP*WRżUڃ5ve7J}WJuHx]JΡܤk]rN*U_%Tꇩ4ҸOqi%͋ ΁J%U%JSj}A@)=~3 +^J jr1ZZJu WsJ.k#|ע*h+ݺJLe*kzAKԩRߊMW@}^G~Yi`|:gmӉz#N/9t"7Nd(>$=t谓sa*6<q(ڝp "# H|bFqjjoBvIРKb{H*&9Tas|71xo2.^ΖXTgK|dO"1HXUC$OG.%bx*D\T_ҋ%ⱛt^GDW$Dco%$2$Fa&㣎'lOȕb1'-ے=I Ad/DEȨI Hnf_5N"bt{lH"c`EdXP`cv 2ȠK8ev{팏I_HhL իS|&"Nd i _ZB'苍m71,26}`ꃨ>hStn}5mQsd:GQ9p:.9rl ӱa:6Ldž0ctl ӱulDQFԱulDQFԱulD펍vFcݱhwl;6펍vFcñplt86:Fcñtlt:6:NFcӱ6j;{v.\c1ru9s].\ӤnFc۱vlt;6ݎnFcDZql86z=FcDZt[[kɡ)Q9l9.9C&ZXkkmbM6&Ě)Lf5SbkX3Ś)LkQkQkQkQkQ.ZXkkb]v.ZXkbCu!:ZXkbSuN):ZXkbMKu.%ֺZXk]bKun-ֺZXkb[un-zZXk=bG5H],{IJ)b +)b +)b ++u.I1p)c ǘ1p)c ǘ1p)c ǘ1p)c ǘ1p)c ǘ1p)c ǘ1p)c ǘ1p)c ǘ1p)c ǘ1p)c ǘ1p)c ǘ1p)c ǘ1p)c ǘ1p)c ǘ1p)c ǘ1p)c ǘ1p)c ǘ1p)c ǘ1p)c ǘ1p)c ǘ1p)c5Sx^ DW+QᕨJTx%*^ DW+Q^ DK%QᒨpIT$*\. DK%QᒨpIT$*\. DK%QᒨpIT$jqI$r:Z\sM⦖/`E6,^J%Ѝ[ Li1 W]Ba(\OᚃvZp=ۛ@~•k'w},)mVTvkKUU{&K}5^wrOnry^Ko-.0GN{ae o%#~}eu*;}Se5߭pFeƅFn3e ?Pxe W7yNC s{ikzS} Hh _pSַqKcTϥIJ__^Lb)[p+n*"=w[ETϣww[8Fqx6o_[On/_!^Nӟ8}se~;8$HϺ Tu3(Z3~>2f?A,up8ulGo'";-p^MZ^˅Cxpyt>(\p[ d~5NW&=>Ixދ':'ΉP?_@C8>_p?(|rI38?ytn}.6r| /pH×2wr?]>A&ܑ~&wyOF(蹄;yvPRc𷌧WrTf>L{%a}|wR;GlmS80ϣtc1ōÏQXcjk]Ƕսս?@v{!?G8鯧em _OVtWYN٩2:?NzDaC-m8B.i!FzFNzL[N6Nn~v*?ʟq ӸxG9}~=sr~d{ws<#7s!> 7+Tit}owa}Ie\9\﹀Cߛwî}8~_co~~5<^w2Aƽ~mL?w/9[ܮ>_q??x?:@Ctzh+PC>r4wp1݇!}q~j=@:q2:k['nRcR:qNAߒ7.{5Y쎏'FzC9XͲ 9-!JFbRK=AU> tƬK+ݚ&.UD\yP߸2\:>O)߷|,;Y22k c7 NbYՎ^_àhKē$,:]UKcg_1v=AO6'ƆǀVƇFh,OYaN<r<{d|XOpA &)rg:r߸xmUoؖWBY?˞ygUٓ!gq\X6ifk& 8ǺVp8ϕ5h;0탧+"EcNu!(_m9`yFe `rҵ0Oҵ0yGtCNRgf4FـpyJW+`.hmf!*]&`.rivW/\tur!g*]]yjD8Sc:][#C;/OȯJǹpȯJS pȯJy pȯJ8Wk#`v9V0;\tmՀCU.5CU.̵CU6:itiң}Tc{1cty͵z\ e>~`8dr<;">1JS!9Pg˗Cn?ob`Z pJϕҵ 0}CVLpJvҵ0CVvf38~~ `nu-` 8k:$|t=04F3, Zz6`nȵ(=qG˟驈\`'իAݐϕ] 8s07\>!+]qNc-C>Ws+ϕ=yϕ8sF<pJss;ϕ`5\ t%"!o+]Ày1!w+])KD9Ý|K#:] l|{r!+=7CnW_ܮt敀CnWn̝CnWn̫ܮt=0ru`^8vy-ەsە;oCnW^]z!`^8vEpJ׋!+]/10D5%&`\!+=̽C.W0orJ8rN8rUw!+]\t08r뵀y;˕!+]r:<8ѾzpJ݀y˕7A!+]o̻\tD5据<񚓕?7"\|->< yZy+`>8i>|pJypJ׿CCVyZ|pJQiwcCV0`>8i띀$wSCV̧ W`8_:OCU> oW`pȿJק-!*]̷t}0߉jg\y5>l}7"ܪ|s= GȩJ#y p} >S/rNc{#h/2F}+PqݯǀCUrupȵJ7S!*]Vor- pȵJ׷s!*]/"mWz'|[șʇ~ET~ UY[kNԾC(淀탏wCT~ SpȝJOG!w*]?̟ܩt/` 8Nk?`8Ng?!w*]?_ܩt0i]yZM`Ci5` 8Ѿr[r;r{<8.yp]Jsp]Jןsp]Jןsp]J_s p]֘;Z: 0"'W3j"-o17j#_CVF4c4c4\sYcC9D1F#kqckqc&k8k1 p5Gh5Ƙ 8䚣<Ό17c3`yH11o@Z}d:[l_|cx. c!Wl=c,k`ŀ^u5 X8[ Kb)cWl]c,k`^up+1Nk` 0s& uzDΰOC6'lXHF9.H0),p%18ֵT0Ʃu-q#l]c8[ kaZ)pcpdzm[CdOغ0=7x7΀zܵ˯q&`z8 p0wm] 8p0wm] h][1sֵV0ùkjpں h][z0N#ݧ00q9.'Y1s`|u ƀt8l]m1`='[)|uEc8Ov瓭C0FiwE&"|k?}C&]s` Xwnz`̀u'bۺ nAt?o&'M3/.|R?]~`>fX0CumT; &S߆ceS cdr7Ba|O r I_0/ 8bM$jqźXBVniĸy­epbdO!#ZGLJyVX<>֎F{bEen}v%Y5PꜭVDzQ:mo@i72݂ jI̳CʟAЄ!0ϣ+f7]4=Z6]eR#NoY]{^hiñ]32L9JӇi \ë^۲c&JjM-'9g[7.h˜/Ʀ=nPI&i7x8c&noJmmߩ|;m9nN)=۾s?۾SnNd:}{{#pG8{۽? Y_;v )`jh~;W^+놋Qt. G0\E(: Ga8Qt.pqNQVKe/2nIq82X H"n;fZrB `&,?~bO:wplt |"`|h߲ I={Zq>U;#hÆvi\a(Vdade4/data/tortues.rda0000644000176200001440000000107512576021756014213 0ustar liggesusers [N1O."R+n+@m }KrUBaЇHI}t)YJWB;asDşG|unCDRz5,t6nҩH"hvN:uNBRhy} >@SO;Fw&F?WE]|Acf'Be~G_BN uId%%p =*TFwi*^0{~3~NLϭ'帞|Qss&noM~[5+d&nu;ZaE~L]w_YYu?{e@A}1s~ =rt=>(=K6寯bWc$xT- $swg˯節Q^ f~Lj q$_'"-5NWԬYWLդk9:O6td82 G#Ñpd82 O'Ódx2< OF #d2@FhWM a`ade4/data/trichometeo.rda0000644000176200001440000000426712576021756015036 0ustar liggesusers [oU-P( RCB sy(J[^;2Ɩ1rӵ+V X1&&DhЙtLKKs9w};e5Zy^u7y<1O7dGo'ST:_%_))EUN'H˚r:.52'oZ@=\Kr'r PnU-.fO>鯯q8ڔg>Gwr*w|,Hv~GLd AcJFӠ1`/m'@7qi7AwzXw3kEuڭ7YGI_Gy'}ӒuT2;];yT:@WjI .ttyW; ֭r5[)2 +_ݵڟ iRRkÔ/?epSOoa~~Ⱦ#vUߪ\-sS >ou~)y4sC>,t7/cѸTaotq{LvJװ}HZJz-9_ڟU/u/? I)rzK! YDsK_dJϗq)+U0oڗ^ޟ&޳FGQrMa/j>Ô[J+^EWxs{5<$~/8~8߭:NEʕꧫ[t>S.XU(9u3|v;̞ 왉fnTr>{TFd'&"yKcbl`#~,Ng:щ4㪂\Ӎd&ʇҟD6E*U 1Lfz9LuKrQ $\\ _0| _0| _0#@0#@0#&1 FL0b`#&3H&K܏r>Dz/ Ko4x~>}k%GG[~1w߇.&GoZ9>=y󵍇\(x8'~⿲y|Փ#a8A<7!t(_?#Wmsuw]Rn7 rAqX.y}?-k_lE͵K={)G=8Po@{H8I8D~A_촺?̌8ftwwKg9? .fsv^ZQozww\z y@/B q ;3;Qŵ? xnH; v*S&vmG )OO=Y//f-3U# U_tCCYW+J8e>#˸WwX8~_~Cc\Jg2%5]Żww߅׳=XVx?{tL&?S?NO-^->5 NӬkۓ73|kzvqِWhaQÜ4' 2Xk}`-% <nDgWUUj|S_}{iנ"_ Y=oO>NMm[\tՏ%G3)zRmdklDҪyT3ade4/data/elec88.rda0000644000176200001440000132025512576021756013603 0ustar liggesusers}xTEz5(*E ul پ͖ " z W#PQ+ػ1ػb{?}?3'E亖;sr3#߈(#,|K} fc,|_b,bi78r#I}Zc=9QooSWzUMN?vrZK>%b%*<_;|~I6^|?@ny_pNS$z36KRoO)=tK?֯?RR(zx%{1`|^'f釒&%?#W,ᘮLww0lbto\ii/ƟA~dK-~i2-|gwGxȡ?%])闌OU[#aiOA',Z)a=|.IKZxY>8U;I{8#.t?- >/QInR_2n I>%^I; xzI;ݎ1|އ>g'׏CMKs`DIwo'"JrJO_;HZF%~G%3H}vsR^#-#"W_IK?b_'ԗwOK=)?SkZ꯵ſ`/Htf8AR.I^ƿW#K=HxS/%=Wl)Rx-Yɸio)''Ւ~GK+~tC]Əy.KxAɿs7 J9v#-]ɒ>Q}o?2>w'|iC!6IOU>(|[3lQ߂2$|K6K%_c|__ҕ_֫ԿB)'OOx[s JOV;~HX]KNK_I{xl_?ӟ?K>Kt,hɷ*wTYK=6XKG~koit,hMR_2ޭ^R*??'S˥mrXǛuܫk9ؿ/+[xXc-m߿x|&697)c 8sS$'aS<[gKnt>M a~q'?KPҹc{NFv|kUyaM߻|&+)Z.ٚ_I?zyϽ*WK878LoHx)v;M֬_\: N¥p$\: N¥p$\: .[֩ujn[֩ujn[ѩytjGѩytjGѩytj^Wթyuj^Wթyuj^Wөtj>Oөtj>Oөtj~_שuj~_שuj~_ЩtjZ@ЩtjZ@Щtj%:ZNDVS+I=mCARG\rTϘYS9E$VYSS%WWͣYgΛ)o;2).=l3wϜ3gz>6…Us5eNB.yijʢi5MfޱfҢ_e;:*{\kKSGguB1{& x)ng=nwo7~J,ඉhA`0KKTn,`_B7۳W/K[}~MĖBZ/Olg%2-_4!RMl'7M_<*Kl~ 3RѦ_o5m i mKl k%T^Mv߈Mܦ_yo$lߘ߁MM M~~yMC~6ji%~c~&fsTͱKUFg.Glޞ9U ӦV \KM߻ʚf&&?hԦn:U9oz.Z3jm]<{jdI*rhU:+,:_%rz;j"]ܪ y1>ԜkASFr5s竑ZPt.Z,mLՒU L?]emœ*G|.\8fj4wIV(mrMzaVTLUWըf2~UwiM:a"zˣ SQ򦺬R%N$S[sJӄ2Z>i..QBapXdevOxgW"~jUYS5ڈjۿjjK*S[coM^o7_?_lF/eZ 6n_q: _]7v}v~{_]oïg}w.K~/oe]_~]~o ~Ż~~O?._`Jvo7/?_.w~ߐ]~߰]/o.ߨ] ~c߁w7߄/~~/Ɋ ?kr F mϚah  Cں5жD\g 7L;]m‘dkXdm:*Xoyx-D[H&Vk߯Lo -e~2%LgIoI*p1/f1ũŭ󭌏^jW1E_xҽPu|o#JjAWbvVez7_$n_p>ԟԧԯo]!9fm!ң[E,{|ZtoYJdV2[xWW2V0rS3?Ncy5V g1?+dNc~zs%'0]U#-dҏyMc{rHg1|?idy0RO cѿLozX%pӬnv|βR>)*V-審.d|5[-F,Oq~Y6~jr1coW[:9 OWMwd'S=˩x.ٽjq>%2W4Vfx7Td*/2=ᗝEN_j!{G1m@5-jHW;ђ^]{YϪm1PɹuܺNWY v!uVsZs_ՌWVﷶ_n>5_ާ%O+_ 'ok,υT';bz#mޗXFLN<=aɸ?%߿6HGc>8dyvƋŸ{":La}*^F"d+*/&Ju-9?GџZ_Oz9_gWTbcWoT<2s7^STғS'Enq.((޶g1dVoO*JsSN+y/Og<ә7n1ur3\Kl;(력@_b9P zպ,%KSX,dO"D.`y+鮬M)ڋ("GYWNcj=)ϙ/i?-Y l*<2[, w9(>p5~[WGG\cNU<>PE/TzMW +TWYqyE9|oc(+XA /z_mLNG+Qo{)?|*yR1G>Wd)W%?3OeM ?q ߉$Sx:oQMdjf<\Tnƫ eqK[UܩQ1{ƫWdEyy*%2YV/|/gK*=%Sz4WX|.R;jS =9⿂鮠IaUK󔚯_ƅ҃F%%fz$RUݪoLO7^k<1ٟU%r7L_|̇qآO"@5_XG]4 g7ǭNnћ)2O/n%?1}rk6"T̿#j?+{yTX<(KvU;{Oⷦ[lϛ3˷~[{ˋ^Rz-P^pp?L>P":X]HV}o^O{kl)q|bסu 'bj}ҿK-td=S;Dkt>Jnak_'LGH:ltE0kyS+YҩNNOُ-J?"Obz>NK^ :?zV_䝖~K.0| SzDU?Iz}AIWKu=g1]jOE.0%'3ߓRkSH?9 o?'Z*ކ"z5ZO2dzRk^Lp9F5ϰj*ySrɼWђ/s%7ܘ_ʧ?aW̗҇1?"'(+/z*eH Nɿg=q#R/mTjt`˻S ooN6sOm|̮ iIe36$Jd-Sğ,J$_čUXWM'n[G]kk7Ujq(̧J>l$GM3QzI꥕SOMfpފh\ iIՒܭeѿZПL`5i@d|*4ۇܘV)$LnVZ|꼩`=.<@2wg<]1]%'Op_[žb9|>J>$Q#DT<! ЭQe|*~ R|?Eӭn`5.'z '#:(|lR~'CF3+*pNbb\m!2ڏ)NvXU'CyPk-~ߋ\JO|/r[Kf/t:Wվ);t|H?WPҧ$Cmry=Iӂr`3!%W1ޝWJoY:/ET끈=Qz('r;%0_п+y et}3V;eo`|4;f9[-',ZHr"'ϕ}kΌBy}\6U?VXC 뀢7oN"ZuGDkWN]N%[QD+Z+HΟxP7ҽˉ|h/0}>fIs!}e~ȧVy\[ 6K![ \Te|/=lzf߭*{o?,-\ɭ^ؒTK#rЭ=;g>_ajWK>6ܭ[mfRmyno_mFb/#{>%Zg-tax\kϕE? r?"{YOJ Rrm2qV|4NJMTi-XkKί_gos*j=|Xf|Z}g=γZK69]ԋ ϭj}fqӿˉGR;TJKsŖpN+U eޅZ71^տ%]V=c*;rzYW'WzTKz,+_kI_/ ӑүY^HboLПjW{|wӒkRrK[oKxk9$f%Ւ-zˎxB3<֛<|N4oӈ Lܐ}3if8Վd~[wTm%2kjpN*59=_KsiԾӺd·ҒQmÙ?e\ sޓfeIXgy.Hb5Yu>W?u^W~ǨڏUFoLvyhv^8eP|5ٽSl6?}*J|䣖+N}'܂[T,:g?ws$Da3K/[h>=NIPD-nqKxMjjňV}kY_Z? ;wBXL",n%{*ſ2 7KR|oWDI|RA'[!d]0=eW!2yoep"ZOsܵ@eotR`<q*nOYxYWՋJoPGdScZ;NK.:?h)*7)}y]r;L_`9>v-=+y$-9=>]/;c oov6ϽE]WWsu·9KA0%sWvGbJWO3JM.b 2Ug.~89Z_%Nj yf|PMd<~ɾ:wVE%3Ε[p *'ex +Z F/,IJogDЭ-FQ+pm{[nv'Ol=yK%hfѐOkڧ+p/ڑC}$rl(^G?uXsu<[|^L&\kwV l4\}g$?t[rYŝ emKFkkݤT"YUhǕ~r|3_V%}Ʒs5VUՒܭmJ%_g,d?=ߧgw3uK-X%G&Uؒܡ,]Ӓ\Q!6Enm-ώu\/w vZhZM*hCV]+\YJ.m%䶒Kr[Vz\uu:E]cnNQX;S)uuڥPW۫S)uuu:E]\NVSU)uQu:E]SnNQT;S^u-u:E]JNQWRSԅ)>}:E]AnNQPS)ut{:E_=NQMۦSe)uti:E]4NLS)futW:E]+nNQJ;SutE:E]"NQWHS)}}3:E]nNQFSJT%*FJD]L,.:.[z>_N}wS]w;N}wS]w;NNͥSӗ;N}yS_^ԗ;N}yS_^tN}eS_YW;N}eS_YW;NNM_T;EN}QS_T;EN}QS_TN}=S_O;N}=S_O;NNM_Jԗ;N})S_Jԗ;N})S_JUN}S_EW;UN}S_EW;UNNM_@;N}S_@;N}S_@ N}S_;;ZNDVS\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\RDsI%%KJ4h.)\RDsI%%KJ4h.)\RDsI%%KJ4h.)\RDsI%%KJ4h.)\RDsI%%KJ4h.)\RDsI%%KJ4h.)\RDsI%%KJ4h.)\RDsI%%KJ4h.)\RDsI%%KJ4h.)\RDsI%%KJ4h.)\RDsI%%KJ4h.)\RDsI%%KJ4h.)\RDsI%mŊL;]nog7:tFN#]Hi4u:tF.#]He2u麌t]F.#]Hm6u麍tFn#]Hm1zt=F#]Hc1ztF^#]Hk5ztF>#]Hg3t}F>#]Ho7tF~#]Ho0 tF#݀nH7`0 |4i+WN_9 r|4i+WN_9 r|4i+WN_9 r|4i+WN_9 r|4i+WN_9 r|4i+WN_9 r|4i+WN_9 r|4i+WN_9 r|4i+WN_9 r|4i+WN_9 r|4i+WN_9 r|4i+WN_9 r|4i+W.\_ r|2e+W.\_ r|2e+W.\_ r|2e+W.\_ r|2e+W.\_ r|2e+W.\_ r|2e+W.\_ r|2e+W.\_ r|2e+W.\_ r|2e+W.\_ r|2e+W.\_ r|2e+W.\_ r|2e+W.\_ r|6m+Wn_ r|6m+Wn_ r|6m+Wn_ r|6m+Wn_ r|6m+Wn_ r|6m+Wn_ r|6m+Wn_ r|6m+Wn_ r|6m+Wn_ r|6m+Wn_ r|6m+Wn_ r|6m+Wn_ r|6m+W<_y |1c+W<_y |1c+W<_y |1c+W<_y |1c+W<_y |1c+W<_y |1c+W<_y |1c+W<_y |1c+W<_y |1c+W<_y |1c+W<_y |1c+W<_y |1c+W<_y |5k+W^_y |5k+W^_y |5k+W^_y |5k+W^_y |5k+W^_y |5k+W^_y |5k+W^_y |5k+W^_y |5k+W^_y |5k+W^_y |5k+W^_y |5k+W^_y |5k+W>|_ |3g+W>|_ |3g+W>|_ |3g+W>|_ |3g+W>|_ |3g+W>|_ |3g+W>|_ |3g+W>|_ |3g+W>|_ |3g+W>|_ |3g+W>|_ |3g+W>|_ |3g+W>|_ |7o+W~_ |7o+W~_ |7o+W~_ |7o+W~_ |7o+W~_ |7o+W~_ |7o+W~_ |7o+W~_ |7o+W~_ |7o+W~_ |7o+W~_ |7o+W~_ |7o+W_ |0*`UીW_ |0*`UીW_ |0*`UીW_ |0*`UીW_ |0*`UીW_ |0*`UીW_ |0*`UીW_ |0*`UીW_ |0*`UીW_ |0*`UીW_ |0*`UૄͶfkGfu@8ȫ`-P]E@8\*. ϊg3HqkwqV%m@(|<[>r}ի~ ˯.A"KX'5le2,8(*hKaD^.qbAm2Z/QMF\>b.ՠTX.)bdT:0^A.c^.w?jlrdxKrIVd9%pr)u% (P,+| F,X_‚.٭. `rY|_>>2"q[LG;< U|/ᩏ2]RTզQz")qġ'U6&T%\.b~-ՎtOi F,Y W5r\H|]]jXX\>(c2qULz>X3]y#pg~=п_H~-WѿDHυ%oKerJ^}ljV7Q.[r3WxTH?Ւc>WDZM $@]@Q}|&W9. [.ayK.Q_[!K%QD!/ҞH`-8>]u)78͂^ TE 2O zbuso@hd~&eD[.wW\0+%|d.zySD{ %+r$ ZsKRyWrR/Ǧ[.nrlf[]pr{٭YTSuDoW_*%9rik# ʥQ ndt1c rLAgRQZ/^.K%]X ^*.eʼ`ܮKqx#7uYV Z˺zɘ\%֕DiwR&A比\6J)}Q>T3"? _?L!zY*ӕB.Ѣ5&E[,H̃;kXؒQV=O[=SE#E%Ӣ=ƴdXQkA=BnzOuҟEqJ dےc[kV1d>ւ|ډhZok(=Fm2Y=1d}+z ч|.dK-ؒ^CQ!,GKz רK?װ"[~.sgsǨ`5A>e<-5D!D_LhAG1,C]NwzdZ2ޗ3ZcQ]꺑X^iLFC;2S+|.c~Zk[i`*P1-xe+=F-js%O%oTU!zCAgDoI,D!|kcȥY@-1ĭ3Fmr2~êGؙ^ccK2ʸT'Êڂ61U!Wz'u`z ÊVU!d%=̃dz,آ^!Zǐj1Ѫ(=̗-5>%@or1eD^CLaY3z%Ps$9Y+(-[[/ \@U!z+iwwlɗŶG2IYZR\Ka[u3ª^ﵯWSWSWSWSWSWSKuZDV|ijʢi5s[?ۚnMxw4o'N|9Y#~|n7<+'B}v ;NL|zםEsEy^|S'Wݻ9'QO 7sy8n< FwI4os{]"Ϻ9;<םьӷ޻w4WT5mќNϿN>ݶmn\1wi?l)-Aiii}sNdͳ"ڟ~~38tFϸ zCtݻ~wT4뵗jV^̱w]J4{Ѿm/6P41~]ԑEC{em |G헿)/zohtއ O4c[S|.>^>n{'F3nޱA&|1 [f-7p'n{]Wcv|Ѽjh/fR4߼.ݦ_'5=Yь#-Y^|hod|[mhVW>3~I_c? 3%еK? K#wF OtQy=u|,[YhLn޿踤hAyw+만/#1۞w7˧^ѿE3/?j¥E:mJgn!Q4@4'uu_yo/?Ozх'EՏM7_uå̋y͌_^6\_yUEC}O=tϿE ^NvhF];6NfY}ͨѻ>}*qN]OpG#%GwG;xz}3,PYK|8N]G?G }qA+j-hl|p5uxvէ`\Uk֨?*h}uGK;끳FE)3H;?ZS7z@4:wBqGc,9h%] :G:Ģќ}-+5i)9XƲkZpu4xA_|#:;m3K^Ǭr9_p}4w9h >9hB?o*5? <ÓԮ:1jc4B}4߻Fz3y|߄;tj4/TaWqRtEGUtPKlwetއe fF; 63;i*膋үQ\FLb_h颱w,{hL׫WEcuѸsO{4vЧGwhlU7zK4i'͉Ɨ>Euhʶ):huh탽ED#wÌwFζ͜W{A_}\.FO}XOt 4qM<; <-9)7no@LXvm%O&ye^,A}JZeaZeaZeaZeaʴpU2-\iL WeZ*UʴpU2-QiLKTeZ*UʴDU%2-QiLKTeZ*UʴDU%2-QiLKTeZ*UʴDU%2-QiLKTeZ*UʴDU%2-QiLKTeZ*UʴDU%2-QiLKTeZ*UʴDU%2-QiLLLLLLLLLLLLꬬiu]n~.YѶߟň/b{=f0O}'_,h$It]=--`[2n E+[1,b-0jXQ6%[lN)MF1nPXQ6cvh=SMl-`QYgVtE6 9Tƶtj+6q~$itm cl#-`m2ʁt1ALO6ْ1FҏU2O уu\H=Ү2,8M`$ٿ^exyLm_COw19ry[]VPJu|I~$=X8~$.&ʟ%=1Կ̓V>RprHZ/ſo)kh72OI?ğ#uޗ<*y.HyşS%ߣ^ZGO%|m{a ߬[ES$^ΰ%WI[Ip2Xu~yO ss 5VӐ\ҷkͿ'ɇCHrzvRI/S/[H]bEj6Pkx. ĺ9u\Nϛ,*ST%4p7i& %L%2[j!j] [/g Zi5=A%\KJm5-o>xd-ے-^[xEВ";qמּ[jgK:+5jчrXR1睙n_{혿_ cɯ,_/ʨ8K 5'$MOlO)>L;?HѦ1iteْG" 'QJ&qio{x`;Yoo\6*4K$]+aeJ'ߍ~~L^HaAwi=yzbȉY'a}O{M/㱎lk+g$$2ߦ)FsF?}lKڒF$Ӛhӈzm0x32_InoH86n +c5mz~-3ʙŶ~$edNOsۉ4&5%{Q2$[[fT80os\54o~9<ю2Ʀe۰EFjp2ɻ_we%d%u.s@"_=0l~G5nX~y;iCo̴iasSmjr?rjmW&\l/mx11ʬ ]kd]D.)ƪE6XLT]?R4mպU6yeܮjђ߷/:`s۱l.?lߌffۑY]&,i=wOQʓځs*'W'5Q)<Ϲs?U nT5lt+Y&k_vSϯ=Gsk~+=6' N? 8~x;puX~(2Ӏ9mD߫}w`aSFs8 Vo[l]*|{}mc>nM6xYoӀZ𬧶,_ˁ]vKكw؇0"`nD u!Ub;ӘtƛLg?zw1X؍|`}~ߠ0r=mhnlcxx3pDq8x8| 6K;0T;{OrZs)lSY^^^| xC-W^o  ( ʛ׮nNi.H/[z`Y>Gy73Ny9/y -\F0ơ~*0fk|x1Fe%w-ӻ':{՝q0oހw/%>Ӄy^F{#j,o#[/A7)G+#ñp|8u8пg QoRsG`Ʊ/q8C;V;oEG<8ϣ|ja[~;ʁw:6?9:8| 67}~gH7?푟z!0|?_ #:w1~7#?|D3evxxA۫ 8qqq21O=q'ӿF:cM(ǁ8rFO:ƳwD#I~vw{h,Q8x=8mSF4I?徎&?`=Kr=fznl%YYlysab9W-=1?;rIe0Y>(~q)N7=k_G}2E:>K~k)_Ƚ )O{.}rO:h#nr^`#g_nڸ#5 MrIvl?ʈypwvN'b=4:ۀ]vE=FUm`"h<ߍv:ؽ#pOd+īOFsoy9ܽ݋z$>x!0vW7E^ Oe#Ź@@%A "4 I.TKlp w"Can t'b^zF=:}b8~zDF[(>s|v O_g} 'wz׋pZ3C"#Ax%ƻ x.x ͺޯk:Cd["$~Ap<י7"3nL_'=; p  7D;x>) ߤ lr"a3OS/n&~G|8m7-<>0o7j_×pYZ;Oal)t6ya>fAlpz_V.$V0 D{";1~q1OK,Gr[a~Wr] peBo8[0707%bvpID;xl;w!^ <>gD5$bO9bo\>|Adx?|PNy`įD?g!ྫྷ%T`+/;0uQ$AHp9p`X@ϱ"?X+/C9}.=.`D>)v=s~SONsq\C ؋`Ypz؃v!_u8 ړr|*j ІjoK/!~~G'h1OͻX@_>[ҧ&.st3ǰ>)}\K^]3`^-xm A^)JIWzҋM7_%+e|L7J`~]gO>؀Q}Xw>r>r݇WoYO\<9z{jM3}Nz |A ϰ/F?_KwXFl_wn]wk-m_vEG}q"Mv fY߰}[C3>~H"Gbt;B|sDd||!sǙ]Dd&'@Nܱ'Oc/zq"0G/ Ob/ "D^nKb/%L\F,a 4{ݓ "M* IAw`fetGZ/6п޼ 56kN.mjEGGk!=3ё{C ;({'lػ?L~%tcޟlsL^P|{]Zn(3,GčD ; U{f:Şڞ~"Q9S|wr`wޞܞJà0b?SLc g// C;g? ~}ٷ#^{8tE}e_ EMU+.נd_bɾilKF?=YkQl%^A-uUDWMG?̞~XgLolb`=2"',v=X/ ӱ1;\"8ffJ|}R1Qgb~G킅Kv }/2 R/lLeg}Y93Lr`˷I*߷/gz ! G໬ڞ||gz "69U+y'!:U(w1..ʺ&k.; |5RVE1CV%0B֡7d9ٟ1 rw'fMdy]Fr@ΥoV_S/Y=P-i_"fc;>:#ެpq;o)p6ggO/(@FAs A|6MÙρ3 x9QAc|62_Y[WKv 38˼32o^|HrnB3Z 6d|~ ΢vUqC,Lb2o{g!evy,q 7^BXqAC9wï2qA6"w'lv V6)to8_e/[5 5ʙCXA؟BߍحT'c7b7=1?g@=f-9m#6>t=ڲ>RpV3Y~/m_b>.hMt:>>'3_B 7KOɏ_{bW^+Idz?{a0 ck/y G>|KEGq{w.9ϵ\)cQ,ۥ?2~/Y9(WdU3>Se엃߇sѠ?kIhY㊁YaeB9e q}^HuˍOnO6s'\|&G/ $6eowzўy؞E}L!;yƾ} l>fKD{eR꫖PT= QJw{-y ~4x~D꩎ĺ~9r-kAw'GR1_s益lCKY#XG+팏嬗eW1}}.J1U?McLf~'#BdGvC Qq/=r]C} qO+-a/z Pq?}_<:Qx?b;x;n({N| ܓ1w?/a8 Nkf}u^Y= \m)wccl~{v>)tgҍ_Ίz?P%q Bz6lƶ #0f"6c`/[D~1o~@}طwo7~Awp"z1bbW7e9!Dhitc"Y/+Iܟ?aX ރ[ݭDw`{2"6c^AZjx $"7Z^Ğ?!^dv|* bO3a{M1ndg? GA{|d=.cD({/1aT!x? &cE jp (~yۓDno;o??#p0Xj v^ ؕ!b_C%0`ս@x%lg84b?9쿛^#B.v:s:Ý ܧrCn7 q߱:]NAb(GG}?e x\&>'lklS'yx2N Nx|~ܧLn@v;GX=qSp A~{. `b|x7,/b}\/a/<z c}ť`*X 0p$v b7o9x;ӹ{6f?||j3 b!m64}} ϊ= $-ĭ؏{$0y۱Ǹq8'-WK'c8㛀OpxXĞeݛ~x_69؋eyŕ c?Pl 3gROe>>ً(Ó|W%nثcv- c}{31Ho? >#~| bp|\tW>Afc3b@ލ}:9OKrD#C#ؗb_0} V'0PNyxkHۂ$8oãx{|@y# (ߊV`WsnUݠ׈~=a@qv#ӻ3_POlų\܁Qgrx!gQ00Nj1Ɲ@ոNsޟy@ S% ȹ0#7~ȞDa\o|i|C#0N`tFa}q"XX|p/!r3t 1cDhBYx~CI\/%xU/"Ix_9/>E#ӣDg@މz8w*zjK }1y1 m㋿{ e - ^|9 +!W<{|T|KCZ>?bX7u] cϊS 3+/cm3>Dz|!G y)~'#om`m^ḯWl87Kr֏g9g8j&?O1L`~>{GG9a?rz| pۉԗ%2_{uk8VXWpXOü'1'킿Nr_-y9D[U,?7d$>  Xdzc'"O!(7⣾p~C$r arӕAQ\ź 9"0̌B/e;9 *Sv>O5uޡef1.pnCЬ?ohdAFhU[!9?fi@twu!rcj 쇹r:nnT<@ö{a ƆY6OрinP3?FY48y=`5)[P~b h ϼﯣL*]μ72?w0w?enr݈62Nli_f e q9]0N2'P?0_i`dwD.hhQ@ }hx ̽{B/dFNhP_ ՌOPތ eZ| O3@=dBy2.Ae\~qY*[IPތCwˌy.7c63P ψY@G"87c[%PgD0(2lDPF&|Q[v+f~L']F>6c?a?2c Q2VogSl/m f܆q@ɣGX?~_8xrA ݟ2H"7N7b0g|>|, Q'kf7^4C~ˤCO|`a1,2#O1h9/BfK.ȣo4 ;Yz{{,UOhШ `85̟9v<е7ވ7+bbPJ1YcYS8NAϬ4:NGӰ?'6[ס޳n\q+䷬({ݬoOe}}a#*R]OhXW{y{wy ~d|?q ̣bW/{/A}{}}Ѯ4l ;gwM0' hUH`C@`w" a"|Nfl`!j7'ol۰Kç\z~/fuuf ׈qUd(+/6#Q("h_J CA)|KDEx?D`%Rܧ8c,HiD~)/ "@ W tŎP↡Eu ߳~\kևx)_a#?FO$F"b.KT$vgˑ!ýa0/$3#`p)ʱ◩F,2zBhlLFF B#j'pk6"ٿ{~r_O_Rܟ9<ϬbDӑĽYl6#!lTGbQ V/zY[AK~~9/8 |} ۓk7gY#ُ_g`d\DZ^& PaFpd7r[d"yb dEid 9#J;S*`ȴ3.pfR/=%ρZd94|lPE~ \/-]d yq)֝n#r_y?x)xO"QcG>slG`ݔNʙw`=_컕r 6#7 9r= "7񋎷\z]H7z("}O=J_H_mKoyύ7P.5؇\^qw%+پWf" V}o"{Ӎ[(OqzXy;xy;;(7N'R$q/pofznv|}#{#yuk۱䯫#XO2_~y!:qr^M7Qn9r6#˖ p<)I0xuxDη'> Omd #N|,>ua>axp0cE(vnURl+|YG#{뉓<]曂_t)-lXVĽٯ)Zx*~ګ0Ve?EMagl`#ϡuDsa<`f.\R\{4*<J؏c]]\͗PNV0Ngn.H߮a Se d=ڒ~~|4GvB>}UN*-x삗G-#7M>Qp y23W D} y`걠q6`Do,x z`B)2ț{s7/ꀟ"\{_硴<8މ_v̿f`3:_?YN| c8*0(o-xɯA}Ϣ90G#P) cCX?!,O!"_>mg2)g~b>wż|7"$G#ǣD=:qq8ɨ/ljqG7*K0^(/@*;~ ѿqN3tD 0:~ 6 (Ѣ##EOcO;z2^?> ]Mϳ~ǡد.^r0_7?ݾ7~xk9t0to6M6wb8~cP慞44}YK^$o#}8n6oL毈e?}?>ۘW&h_D\Ad;?Laj[ džJne >q19#-G_.ӯ?p3 ( >WÝ>.[{{{=N7:LcpOȿTk_ Cs}cٟ_b}p6.䉇!Н[7cUЙPθx*#t 61C'c q m9t7BGme͐J%.8k#p㝆MP瓪D #F CqǛV̀P>By0"岟fbWDBo{ptv۰ߦ`W><1|l:$x) '"VN b_g1E>s:^ >q|Hf|9S&_=ỈR@~>?߳<aS6xc sÈl ކqj˱I7x <9sYJ1Ew2<&x Dq?94ssX0=ȉ[ړ<<\y.ϺK2mYw'b:x?[YU>g+el%GlZFļr¼ Nf}4 ]0|e&X28f>|.V`>x:sXt/XלL!'0,O5pukuq:X2DZOMOOWgH&xV"ǹ"݉y{"YXτQf!g`hVb{l'1zy ħ|#3oOݞ|;V`l&v 6(_iZ` ߶zRrp^M㼐&r=x|?o(ǖ`|zʃz;3:rqn+",ʙŔ[12}KQ,Ầ$Ϲn0>}Bd\ov*G7~R'sYyTOJ=&*m)TOxA=1]uLpD~e?tc?VXŕc4&{H|<5P5r{ g[+pވvs܆Őn>܅Ŕ~v[oc=|sQ q/?$sW[Yo>bo7\M!zZӘ#B(77> כF%tWo*U%!1 n>MƢ!7Ŗ0uhn'Oϥ hsY׸]g4v6Hٞ$܌wj7 yO'Gcʁnmf;bOFM."2W%r{z-wGd>Ck4V^,`DM~X$vv-8]P ^)L"^Ic' NĹ<.j f|+wvo/^flɂ/s }szF, f4:HV4^' ӘfT`>\<( a o i4N9g@)<Y]oS?|^H#hsia懛 ϕ4~8[xquQ`|kN#8e)FKb$FMb$FOb%FQb$%FSbD%FUbd%FWb%FYb%F[4.e%F_b&Fab$&FcbD&Febd&Fgb&Fib&Fkb&Fmb&Fob'Fqb$'FsbD'Fubd'Fwb'Fyb'F{b'F}b'Fb(Fb$(FbD(Fbd(Fb(i(FʈQQR"HR&ňR*R.S2HS6ňS:S>TBHTFňTJTNURHUVňUZU^VbHVfňVjVnWrHWvňWzW~XHFʈXȘFYHY-Sf1rg1h1i{lVlflvlllllll(QD"JQF2(qD#JQH)$(D$J&Q:JR =;0q~u"7a$=l7g 7^Pvfqsa.swj,&"ǡePrz)ʿKʼ,*1pz%7W8`5[Me,&jlZg9b:5J#ILL9'籽.lM\yܤ%": ]~xWRY[M[Ǔfl>q,t']T~xە忙f*so$(0Tߋy t7}/7:8J&sTzxMiчOP\ﰩap hpL>OdvAInMpDlKb`6D7po>߇A @vP_b EA> 군q+E{K`MprU`)g~CH{# ?5q/2oeq,7pd/o/=G8>g|''b^Ix-#+9Wb+4#p^pE8M"=\ }MW@T+)“b !Oa3DWjBbGQ]\, c-ԦHW`^,Z@> >tY.L ޡWʑCA#ꈢYF9(Gȣ><")G&J#ȥ#rDSlN9)G<ȧ#rDTR9R*GLȩA#rDUV9*G\ȫ#rDVZu#rW]9+GxH#rXa92,GyX#rY$e#rrY#rDZL#rZ8#6w#r[ˑp9".G)r..FSYs8/Z{A x+ RFXޅz,{w>:zE!e_QꯈHhVqECS4Z4㢨 ZYϢEbs)E`(Zt/b\ݏZkgފ~菆8c(xcyDg@= zp0`pDcAhs^?`D:` w.2`a+DkKSv#2QV}/26HsEe"c~;:? أ'<5Ag{qU GkWE/=cON\OdyH#^Fѝoэ wVE]pWF;с+:O?Ztxک],4IL`Q7@J.)R4񅘟h"ڱhgڅ>X2(tpYE6^T{Q'=/q7Cvo|4y^!n|^K9Mi+j_]|ytΧS9'2f8f py8w*x Z A:Ct\ͣ30^哈Jmdje&&c: dh BC=< 3ڸ1Ύ}p`jacܥ0Q+Q[p 9$/NVGjC/!jU˸.znwe9F2r*re}V@<wR+\q*68vPk:m˹;wSNG֬?|{̣AGG>Qx$M?^z.\Y*ja|3MȷWɫ":ȋM w{F>rvG>t)эOD DBiC|#t:_K>_q\yt%Ւg R\ˣjN\ya_8?-TpQ5#wY9_|e :c))?QFe\mv_C%4ھˎEKRxY׮w[4j1'_>^6#j>mQc >}[7Cih^~^0 þ!xWc"`f綊}!_q ]Cx#@hi2LX`% .{m6 d煠v)L T L>!}Nia(AH2,qǀGAp&t {.&{eBޗo}Ϸ @^~v `o|tػa{ޕP0۰ۂ6[|ޓBby}o>P,3,Lv{dәB(rjd B^}0hlPۉx'|TڧT0!'CQj?8rG}-u,,s //n>u{ #W/2/&b":c n*+!C?~;ANwݰ 4 59{@%'cASP9n,tr lbB/)@qr1!29kr]r2A 06~‰t< h#S1 <r8?禣/.}ѿr ퟛanGE>r A1+D stsK0sCboA>8 ?Id|e[CX>î 1v/g0<_<{m<-/9_?|[Ϋ^|"yy Lv7p)徘yXqYੜ5ɜX',4횳 -g j;l4!gGr8@)|2'w2ra9SY/sIybN`u7wBO]}Ϣ_طpuYh2&݉TURYqo*gPa9iTNd**i6fh8 0͆YETB fx1x0| o0n7ܷ-&}$]+'3ُcX߄pwx}ix&uI/Aq~~3߃61]} gPļ7|ǟ~s៞#]s7/59֕F*mvZQڵ Qv,p:Sxd̃xXںG0^qϗp-&̓cᙐ3Ul)O<O9}.Yƻga~ uVh#t,q5g!ih.1qY_Cp6428 3)sX !oYo(0h0|f>y|z Y( KYN?k2GCxXdz?! qs|ӨԛF,*{aNaRv^=Jd>8s+AʹSW0"e6ϣrV Yc94^H3Xn* \_ u>9<3;F^X;Tc ez?>ߟ0J!b:㘿ˁ1*24Ie~?QL~aw ʃODˋrџٟT,JrJT r~*~A%Y#TnJe۫$|L/RiJlM؄ι˹1*S6s399Y6Ot5J1 rFXG0n N9.nƦI޵ڝ6$rR,۸)ݟ4?{\~//X-,}@&aOF97qDanrb4*(QY}ʁ{2ރbh4e\M=눧YHD{{_?brPɛbnX~$O#~4BHc1^L%{wlRY// #h$1@ߌ+~2YFX/UlVsYx9WҘ(#8>j=Xv\~tAz\q}l#mK1bdFiD}m<|-a,e;,cyaC&#)S9F |X` .Q7O^狸鴀@+ꁇ2޵4A?ٌFŌRoQ=4&yF qFҨM u/YnJ=ߤycԽ9p7)se<|yfXznbP ?v|li*/neyY/p^|rlmnJyuuyӃ)slyol&|Gnw\5ܝrroAIc81I ɔ{kټ y񞻔FI#1箧z|(ߝpsb (s뙏;$ͧ(>E9u u;,/`r[7X/[)Wuʇ4&iĸׅ5Qy#?給g݁6`98|:`!7sNԏ;f:LI=D⅐E yr'2_|~x)"b;}n' e|2.ͭxlzxϻCwG?wN;BMx[)nhCcC9m7Oc?]cc.oo:ožxx?LoP">Fb_>B=>~p/ No)tCY{/ 70ܹ}޿[ [WFkY2wO0>e}Xp7^@76c_O߯ GǾf<_>> Oigl~c] =n@lN~g>9 nC96FELVGFO4s<<񶐗?~;= wBZ"I|7}/'{`/g&Bf"ݏPUDk;C;8˧G}O<8p|Ǽ<6I'pj3~lbŧsqޟC>?o_K),NJJΗ-dש܄o7_l|?J/u.~16]_Ftq/}I-U1ᾐ|A#_ssNs39y*yu`ދo$ϝ~x"x؞Gqe}q=ܫ)_y+\M"aI>cx幩)0jO~I y->a0Olt/f<ѱw>Eq[|' Ȼ qS| ~f"vޏέ?er=qse`<~|>N!,e)Ṡ'//5)I)ƺ/>lm`s3ʹAm_47OgG%3Vl !V ߽P%gSKW Em1PۿXp #\d}ľw!W&(Nҩ0Ҭ,t¾EL,>o.6;f@ >gveIAL_L}G$+@(yz{&.a~xQL_^6'/Bڏʓ~Tk%O߯AF}?g=n',LF.>&;s `o?CIwrQ~7~dE?xB~=`=dյ#췁r(OG_> swG@ӿ_2D_EMX~&Q|'?h 0<?]O=?۟dLϏvD;y4?|-D_z8 SX?a?;x99 Z0u[,ODI}Ӏ]_t6~.s^ ؿXb=:ṙ"faiJ'۸:|i]vݠM ʒVA;eriࣴ(eܨpb'b1pAVb{lnP4?Gi0|*~K |f:8a~ic`lf ":m?k 'ƣU@IV͂P͆p6Zo-O[XJSYLL,~giW@ɛvMI`bΏ5a<>X X<'9azzLItx*=q6}C4I?6}6YO|?)}"W`J?#}4ʟ G'2>~4}&a>"S4O:/J|TO&/JjB,^W^D71}A=a=L`|0Gz](l9vƇ~^SYs|Y53%L==0Jt=ca0Ӈ\0e>yUzNjy!i0(Gņa>3}|g鋘%el#؞Gǐh'"IfЄ9X"Cp HP$J /<={\k}糆{^Z}uQĹ3?fυN3WpDe3>Щt|>< G=H2NkRSEGg*J ?E(7zWg/i:VԦc "ijc"d<ܙyV|hM)1b=Qy2;psտT# r\E}Kue W_RL# y3yM܃FcHF̘H:-gżr3>R26h&{Ƨڼ"o+B2c~a+$c⏌muyOP{d$_I'cNtVE`'IqJ "2.3.7dT ]q(X"\"2vj.PVt _9El8 / @6]@EpDW"K%?=@M]w AB?`}z*"2#vg@9}KOvEky+CKeއ-_-@S'82<''ic3rQ_{Um|ɼ#@ݭuD=̓Րw)/PTz;&竀N#2qQrԧ,8 |U4r"%_aE Q|jG ˚2.ɘ'Վ w2ޅ3bwsѠ"3Uk!3}eC\ء.9M7c .Xw\ԖZ 2VDk^XT-}۠Ue,.>^"(w$/wWmB5_AGFÌ7 8Uz]Ƥ%y1Qq${轣OC##wd {1|8kxCzcƫ#j/9ь~rFx^r1uG?9'f h>|yuLG2:Qg\aF{;:EEec8CZ;w4wn{璦?wZX'X}GkX1>;\~^o]G.>߲eSX-Ȼ9y>"_}5|͵{JߛcrkI49bhk{@ʶ/C/^ʱ/"[^4y揗K/x)?vNq7+_P.T΁:4E)7%o%c5XF"ix8@&uokmy} :dTe~ ʹ{ћIU?z"yBR7oa RI#<!xԟ< azXJ\!SWzi6++u螺W۫ ?nUnRr}ǢGNtM:&Wj%\G=>$ZĦ..F\:rft8I}7[x7qMfldaD>Fr uxz xJ} #¡7=dH-8h"ߵmiWcSW|1+a{RRJj@zHHuү^j]2D=3=>P^u[tJHJVKs^9EGx|!z8s|~98:M){K瞳З=S EӟjWj<$0LUnj.yZI*U]Rk`Z mÌzGdbMmx@;z_a\p|(+u ;q7_C">h57"6߹2"*uw?S1^v v ҾWwԳȇ+75i\y G;o[tzD{Ͻ5 CL~c񭷩ێS,8-޽oi;U6yQ ޭm̯8ywwp{3NPneߖ{D4=+{Լh%ƗO|+v k>Ţg&H_eE'_MQ,g}~!݅)=z os_C/}]}?ICG6+iF.6}O#xN'=z-)>ME.>C9GkT9ZF}7=/mqƩow vYrw=wRSw|gsKCo"!ݏez|ׁ/{%ħq/ ]:]A~<^gwPC'ԸqKoY쁮.߭g]e"??̡U?%`sD?{Hkqo/яC 72_OQzk8Y'7:JVvJSMS{ƋGڌw)"ޱ&i(P󽽭L"bS;).iq{ <] z~} &O5?Ij_.1~.+|v^b^}U+0O|K.@DtE\WHgR Wd8jH$v $*2\!<J~S4S.; KކNyQQ_>[kҢw8v|Õ?a? W&"괟:5oMcZz"e}QYa6~{pZJ>Rg7H?t=Yn |l7TbqEnD{;{?nO~PGGSp:.oOmYIMt v->DC?NtwHxϡ4CA{ SEJ}iQɣǣD˅Գ!Q2bJr"CS}IO+8RFp+"[| th+1^އ;{7;x~{(cXYN㳊 ?'pgi'Qέy {{NhC;0vn~Nϛk~ ?_ϟ 7AN5n;2$L=`I ?#yCz^/H|A9@ͫҩ's}%匣>ZWppmN&;/K,W a גs˼r:ϫK W$*Õ*#G+ɈN?7t3PNaa4xahPpd'X/܏d(xpp'_J.NO k%\y 1zu`_K}EHڗ$+}A98iӬN%?}BNRƯ}$ߣ}\>8tMK ֩V_&#Rk̴R?jt㲹~SZv'iTnfYOwe⻫^M l&]S)Z5[35n["Z+n"-Nw;i[M|VβP~Ў>Z_l~Q\=Dڝ{ ),:)gv?ovܳٵt_<#\ Ikv܋lR 1tJkqo(sA{Hڹ݇%uծRw-^W)'jXgjh7sf Ov<։†XQJ*xźIinyV?zFbՅ˶[O7!?YL=~$+Ev-*~{Qqf i]FuErqΘuXVAkQյ!OJqPf?]Ӵr-z#~s=~sߺ8W@s=(z8q՛R,!37iOW#|RjJyO׮f]ͩV%WC-+\NwOWyAH& xDxFr`:#BL( 2^&˄0*fBL( -3f&̄4fBL( m3n&̈́™8*gBL( 3v&΄<gBL( 3~&τ@*hBM( -4&Є"Dx;tvFhBM( 4&t҄RJjiB/M( 4&tӄrNiB?M( 5&tv( =5&4ՄUjB[M }5&4քʚYJkBkM 5zP]kByMh 5&؄]q;t؄bjlBM( M6&tل2flBM( &TڄN6&ڄ^PlmBM 6&ۄ~PpnBW M(?SΆv|M9cW)9M=.\cij:h?rϊގ??kA Yp~sΒڽwE,P;KisF߱8<⬀\Ji%LC#tޫ~pd6#}f>p6`<6>-_ImOډ\9TwX86*):#¹Aʛ<[\B)o%rl-z'SsF]?!N UyƑ(z@Q۲+R`WJB/ZStqwY|wÄ~|M~PmxABj;:ԝ焎*C}KȟШloG{_`^Bd)Bo36@n_!d3;C[*y>O=Bi隧2fwBkfLx/c 1#pOrI_Ƒèp|0fBLȘ !3!e&̄4fBLȚ a3!mC&AGلę92w;:;rw;τ%>gBL 4kBM )4!& I4!&dф0FhBM 4!C&&҄XKiB2M 4!&Oy;ԄQ2jBHMH 15!&ՄUjBXMH q5!&քĚY2kBhMH 5!&ׄ]kBxMH 5!&؄a2lBMH 16!&ل$elBMH q6!&ڄDi22>&ڄ\lmBMȶ 6!&ۄ|pnBMȸ !7!&܄tv+M`Gf^}#N|D;ߗsɇ +8#e@\st Un EN?v?}.yȃ/ptʗqHq%½O :>zN;] |8+ٿ ?Bۋ~%:E()o8 0G"};Aiߎ NϠs#ijڽ䨌s;f'9xQ8k׷߽G?N9θ:FNGY=C7~m?Ggҗ/B}9!8 i!9=+_s1{}NS8m=X\ XJ |u` G,b~Z}Iy?g,]8u4}&h&>>zoGw4Hz^_۪#sw̜fg=INxz?Sz^)'Bd WJںroJ+-ٽpսG r/W`_Uw+|YsǺzz}".u p/+{j'?yH}ȁKװ.)oųPgvq窇w ԟ{&ẋ:kMXa r a+wN:XQO3kv<ƟUs7UƮ#ʺjVyx͑vNǺ< o1x^|o!ΗG/:]s;tû]wS oxQԣ񦩋%0^欕# R~lx<+Pg{׾xt$fXω]w6 .^I#*_9hK9U"5cMs7t nj p?{۟Yx]зRտ+S˻zqR~ 餿S4g>:עUmwP^0~[)v9yB.\pM=П71x-M_aͅ07G_?}OAay㒷γ:%hܺ Vx\E/WQ+y^tKpqMʼD^_\$\ bo{ra_w$McwD'\"& }G6\;Cx)c>dpA!7xgb=&:ANpϊ\P S\$/ G?:#Ar_PMr]C;zPttK~P?BkBݜ{ ͿV݅O= z`;ٍ{Ҿ>Z?G)==u81xeLtS߷yI.U^u_[Oe zL| zdm h8X9 ii$3ș\x{Xɝ`yJ 'b/o5ge?Y uNuFY5γ~+딬fg햵= YC1EYﳶkiYڭZ(yJP|#ATf2IdMPlUxf<)kMpɹנkz ՟#KSY䅓UNs3YoY+fv_eu?㬺`e=y,!ɵ3YY+DYjʗUE?_Я], Y^۬T'g ߧ樂Lʩ6<,v*{'+I<++)sV_Y˗UBV!ɩ h>O>odrvH[g̋ `Pt _U̓c3O3Ya{ nd(km]A/eE#mSO$27j\XՙdrX 22<U漗yfKnd<9]֌̷d7e5&s229h>s!O//A=t|U6́!@?>/KfoK.<>A̶3[3[hf>%= MFc>f֗|T!A' A5E.WX|[D=elٛçml'پwCy ev>-ρ_g( hC@!RNп2{2~,2s|;|ҏT&rcD= ,9&9~wyKh\FV!s\͗d~ʸۮyN^/=3+eJޖxv,7`*zCZiuNEI|rv$:#9N`-gOFV"d8+f0y1rH=cط*l^.dODo@Rv"UMY"*2 ϫOhooV'LYu* ?'Q؟5deKd==6hV; oԬg;uՅ*/Ǭе'^>5HvZWg <5FYStg fIeͦwbp<8X>#EuŻ->^/ʺ%6oj͋Yk:lzt3q=~Ev;v㳶{0+!<?c=/k;팏X? t7̳:,=(;B__J:,ߝG~^ua8;|4AǓge?SSNމ`[IS/iI>keoW&_ `\Tze2XF,#'H`?`iqAɠ;4.:?C#y|Dr3XҒ_GgJ6f%\l.:7؎z?:I)L>P|Zr>H X_Ôw >TzО?H'OEɿÃЍ ;@ZwnT_/{wPJ? Ly+WRE7;Ϳ{knJjOk?ՕFW?J:?Y4-⪴b?ciQZ]y߫]iҲi"]UCZ7Viϫ]i}(V i=~+!oi Hk)QvItޭQVIDZ%k]$u 3SFzSX'* xK+"OHO|C|.V񴴱1|PnZ<܊>/a|[z׳\;.b]6p]gOffAҙĀ]d_|ɉ왥%xztW%」ū K{~C|&iڞI.I[UZC-Һ10zjٴg/k xO{D8GQG-rGWjJ鴭 < ӎ0ײ)wyY mH}JMKKH ;hڕKR@-GdvImŚW>n [)oڝSd|$q'L?,+@p|> O$#Oz>z ,Hom%PH@ϯ{]i/ퟭF:Woy_ :hrڿ}^ ɔԹ6w1(>K>z_S[  |0Բ&qE8黚ԇPBc=CLӒ@6~_ iBJ{ILI{IP?{%o:RCaz5ČbLHW.1RU}홴Ϥ{f Oڶ0O27m (i?~GjNK!8}%>ԿR|GEGoo7Z #N=%/xKzo|5.|"_Tmgj}UCQ/_aф^O/>|'N*teo"~{_~бoG~./ZS?|62~'['u@3 IIk}l 1_x1Y«wY_;]+qdT'gw/d?`|oH\Qg-">|i[տ_?sog53.j>_A>GoJ=F>AdDlƼۘT^G=_5d sDWX<ޘH s[KC0g6yKi&GDgrdnfC x搆7M05Q[,ZLmXqfw=hw̗]1OuM>16'&=٘(+Q̻̐5og%3Hf:f隷3}R rkȌ YTę^8z Ty,HK^q1_Y(#8q7A_HpT\ȵAi osW)oj="y$0 +3Y@O'(o+0Eςx0m^uey#0T^Ԃ6Rwޯ8`Qڦ 9Ip&>Lwc4#G&6Ё`''/?Q+o; ]>:A͔ %}~\wCu'4@[`kull+و٣+UUmJ>\ AtLn~k$?=wwBi6~i> G9l绵 9?*J={C^3~z+E,H`P~9g 嬁Nk(o\ ?p$CϥA{qzdv ٞN5%9ٸʧ2He#!q;kd0oD!#p?~oDIb> w/2s#gV n5p[P5s=p#xPr5~$ U(z4襖p%Yazf~_\Sn?gLg#[Mȸpbo,rc_ƶP9mE^Xvcwbi]D+v%O=˯w+ ոk!#(J7q򍛥zUƭRqwVEEa|>iIUgZ†>_$&}˒{n5S}UoBICB*!]'ܥ#Rr -G@-aIv$LV kxou+qO)'l0Z|hkG5=q 8Tr-q8q>(9#8K;j3ڛމRdEIkI|Or'q:OxH\D7S_YɋӼ\L̍^w9q ~HzxN|xzA.P޹v# &!:'q@Ra#)YMrOR]RlH"r\ISr:ZgMJ v& wJ!+V7ӏi1mc ANב~oq!T TR=W%*7K2 QB⏄|T'+Ew"_'cBގ׸*~I&~:~3xyo~߫~KwjOG{A{5ɋ8T㎊pIqqJ-]wqqR<$븁GKjo"qR⿸B6s\%l~5Xx/J3DOpO[ߠ|y-݅obǩݱ#Uծ==,)zM}wli1*'ĖZ{s }<qgOGzc"fAL;)`o>Ǵ|yb:#z8ћod C{X}.ތ>y>N&z'O=#YUsГDsa_=<\37 G2%uitx4ߍi.88Yz]·EGݼ[SrsXx WNk)yBp,@[-|W.`5Αs`[%y.K^xA:<~pM!*8SWO T]U\kJ-gx]8r9f.%vWzkI/; yVyt;tIux' s.һe Y ]Jh*z.=$y>"Kl,S_]}*nA.F4E@]>l_*\e $q3=Hx >Ci g/%ouEk?(}CZv!Kº4v_HPEK^ Wpo|һ7惌k1J_}CYWdA _2wY>\B}9vepQ|;&~!.8*@.wz~AyϯY,iSϩ$,x_h߉,< {6e~9='<_/ C{G=|isǟ.î]@S'jlj]Hva.:\J. t:ׄ~~ _^B}tNo#?gy4_?]VŸWryQ'@C@k5IȻ){C~9NC0yϦ# zD6ŸO ei ofȕ| oGBx,׺&}]iGki,c W0^V+ćap;S7p |3|{ʃ^~r%-33fVd~Tx*i~?^U>#ۑ]Gb~{c|3=xqkkAЃ`2$ȍ? DúbYEGc5;qY*q4킿x1d2A 8H@1k |Sï0>^F~Y] D A￈\|Qc#Sz 8ij_eYg7h CgCߦۡ;חЫ _zbHm򡝯0~^Y''lz4|5uw#4 w_"gO\+\>%Fwķo\eg*YyUiZEI7OrSƁZ-Is+q+Iڑ1FH+UZ˫]6_~tijhW•JsW}\IKq=)zZZ\MWj[jUjsi5f#im!:JKqu"҂]B^. Fiu-?&כ-qT՛k^wBi.\Z޾ K][TrEgv#ײS\_Ѿ\ SoUw?F[ſuVB]r?fwQio*]Vjh;Yu{U'~r*p;Uo+ͥn.v4kF\cԣ(wo{&pGkpO'kwYG7Ƿe|R,|ϱfK^ݟҒ{=Ml/HtNb_OEOV{*~q[TzҤy*5<.KOs/1||x_}DǓwԿ SWrŃ!Qg z?{RNUӣ'VU|'a_Ys}~ސL_y'뙪sOpܸgfiiAO$.t6Կ|qK)O%=_(a%#:-9%-SӞtO"n]Ry!<]ӿ1?rYQT,F~ȯ0(PH߻!ϮjܺԼ ! ^p>7kv̵;s-\c1k~̵? s-&\d2 k̵C"s-\[d12|͵G$s-&\dQ2cͱas9f;l!6cͱcs9{lA6"co,es9li66cͱgs9 m6Fc9V3}is 9Sm6Xc1ks 9m6hc1ms 9m6xc1os 9n 7Ljc1qs 9Sn-7ǘc1ss 9qQ7Ǫcͱvs,cw5T/pIZtw_J8}ݚ_^-yzf6 KcϩOe@w''>tB?\\&>u.un,xpιr7ΕW_rʹQrŹG|~uzGsZֱ%G'A8$?P iO'ߠiK«[3. H.Jv~y*C|ܩzj\cߎqlqocCv߂'<-_7]@K~Y-+' CԮP$P-@U*_XVPKvBG(ZVPm(Q֩PA+=2]PE* Ր)t/_-7OCh U׼VwUCQ>H8ϥMy2ˤې?г} eCu]_z@~z} 5D#iVT~ e=X P[֥_떠⟐Px xP'}5JZ+҇~J@PzV}_Py?me-bqҿCIg $%D_#oH_Beޡ=9Cݚf+*x*:,xCִCky17T@Q/K/ Aq,}r?h ~Z5_9'(c17\#=+qV; _6Z? .rZgb|Oք"h?8,f~(XY|sϿŷ |]^/A'%w/H{;=wOܫ8i~*kN3zvl/|FVDž>7ϥ;e ;ROU-4^Ok >)/`ca`}Ê" 8Q+Th ǿ6?ե\z$x?-ﳠ%4nAW{iUy+K~+izg*pL<.,'+X˃ȏ`qXt1Ʊޗ9Uq\bq1׺k^̵/1ܾ6\#c1̘kg54ZsM56Isl\c1ks5:Zs͎v#k cg1XZsL91W@9k5cs1X]s̮9vk5c{͸4c~ͱ`s,c)#l6 >vcͱbsl9kl9}q+9lM6(c1es 9lm68c9|hs,9&#m6L>vZt},c=okm6^cͱlsl9Fm6ncͱnsl9m6~+=1%{9F付,+|d0?gߑEg%a\G+~wN?H:*y3qRIzo@M-s!ƓJF^s="GZ/QnoO<:cȯAZ_^g\BpnZp3unJp̓  [¥5+g9&ytr)Ez|p;zg޾oqɠ'{?}Ж9iG.ڻ6w45w ىh-񀴴}į4whvH\.鞈@P2:K@bPM&ѡY'ɥ$VEIwk:,mRkP <#|R=J;Hz%*-i:S=$}v%}&,K=Q4L(\XtM..٩%?|;~zIY(V]]%zvR%P|U@{.=o}nڕ$y8ڢW|5-a rDϸ?Կqq_x^Ag/Uq4~J#n7n"nb+K׸~ԣ)6V#S\%xͷqQ˩Ji|qT\毸XO㪨:^Gt8.!+K~ŕ{Ir:b/Cz=F}<.Άu'qMy ⯸|:W?ESS dr&K\׃>B:3rAkQ^m[\M*y瀟]<[L{A*y_".J7z^:o\QD~&zn.]bWc?=bb'bjEo#ۃ(o,ΤMRW{cN#ķl"z6ּۈzk%䌧ء 7Us7tO~,96?fqɌG}/9s,9gmvGܳq7/?Ea|.@,Vmgl?cy:&;`1i<%0 7ʽU_VwHw$GxN1nCCo⾧r(¤i'i~8XuuwI굕~B*WHMi+Uhyt&?rwrZ.v[.t 9ӪpZ$5Q[ X:ŠFAѷ)ۊ5*H鲯+g)Y׬R.C.,}eŴJ鶊*x>ntJ説/~uOb?Zx o:]>tDt }WƆPMӳM>x9|#Whc}A6i}lЮBB-׀x)b 6ڤP.^'(@1>ZB>˚zpbmCj͂~954};+q6ϵ,z oxL}cGCwC# b7a_gxoZz^VU4VгxǛ(-hӝH /ſ:AfwɭP#C-6 7^I?= yzoK{mZւ_/Bi/(c,oP4U *}w^^J%v*1EX/iɣPq_H֏Pcu[c&/+ҏ` % 'JiŘ9=xJֿDg֪_0ވg ގO{9?x/ h ?uWrߥbźz茷[iUU)|*w]yΆ" 1-/P-ĸT(  cW)ȱƁqʊI 9ՏJcAYB񦼋A\{tOoH3ˤ=P/Ͱ*}y#yr閺q9.C$OKY $҄ɫ ԁzNjˡxu98Z?.|^P_@˗:|{Db^}Л?ccܛ +khdO陡ٳyDmL=4qޓ7Lh1rb$:,a<|ѡO˭s'ڣq+ȸ:BcNBG5C?C<3BLx鞔| J}~Ӻ'ߠy$:p='{Q=᳟OGǠO$rOO|WdUXwuFU@IyX%Yה7UZV"*grgf}T5҉_"}BY[-/ +1g o@+)GϓX┮ R$,gS}b|ń%J\=zr _]A?.qݬ5&A֙@皬j..ߋO{tU3Wr0GW5G^(V ֳ5cUt5V?ڇLGCtWeBay[SKו P:>vOY޿wܽT74MR_n/{7IT@ߏZIbsM/Ύ*]K@qeV<.Lb(vJ I7ZpE)]Jޠk`!)L/C>HO{˻NZ1knN M:m?:֎;Ј%c1'Ɯrۼv161111ЭY9ɘɘ9ʘʘ9˘˘9̘nj̘ό9͘׌͘ߌ9Θ3y ms1a3@c4Bc>4Dc^4Fc~4Hc4Jc4Lc4Nc4Pc5Rc>5Tc^5Vc~5Xc5Zc5\c5^c5`c6sƜllϘyژ9ۘۘ9ܘǍܘύ9sfwom!:}?S.3KsI%ϕ"qc&:CWq_ZbjO:taD n50cU}bb> s1#rYp;hKb_ Q펙;fA9!fjl̥QS+00ʡ&|b~Wbvc>|qpJ۞19b&1 S1Eߘ6⃘FOL)sLqɏ¢WLA+vGq'p/Dm|+VG/FI͏EOR{w8")>nGD[=O!TɑC<&oi7EtAʼn:~:HﲄQ[oQX|zD QTϨ򌰙u]TyJGn#WEȥ'%"?Ҹ|?O6v$W^Ds4"w?"J-&IGDtS!0X!*UQQOT?r84 C#ItwiTҏ-Hwί0ɾcȇ=JE=K{G[#Qok':Fr"/gDHԢJ?WQIQܨ@-k|jZhwG`2^8j'Rd|vQߪKIh*ȫ[M|6T9⶜zBn%+/@zrMUOs5ߣ~ ɏ#zz~)[O we):UM|tk}sS碒xEE$c1><1-^$Wy> gqY<[Uf%f?f2U@1߈1WH>~-!D?rA#6=zNeue~s;}[(- Dةjwbs엖{x8Jwѓ>uGGxʍ{xeq?!CӂKwd>(<$9#Bp8![П9dV!W4oSC ~T\r?T2_"0wG Eb.{Sb3|QD&T"nuI(Um}vȓO =93 \"u_rvP{]k/NטqהnNO骙P {ZRv3rw uNp{%= ^ oCCp0Sh8n!P#pJ8C:Bq&}/4g Ew4k =p>l硅%6Zj̓VNpe-,[oQ0=q._ZԟVz^VW2XCQ.a͊{O#+QWXID_yRin>Ꙫ+fB/f{r#*vS»p?[)1I̥tPe)^^%&*) nYv??U`ϖ|HXWLXOHfq3NCw]9w9 :/=V{H^Z=5+HkY=tՅ[Vos{=q+.yzK5IC'θetOq']; 5IPSmNfQ?zwh .ZYpiZѠk=`ka1W8AyD|eJ?cJ.^Gr KleFmN nP6qp? AOp&[&r$}(CWX2ʺZ^R}I\ȝתur̈́ D܍P ܥ5;x꿑Ohܔp C*r*ߕ්g<^oC'ާ+, Ҍoҩktw.ƹKT&+&Q$ܡ/qM̸72Vf̌ۙqC3niԌkqkۛq3nqMθ7:Vg۝q3nyMϸ7>ևqhq4nƭиChq[4nƭѸ9Gi"q4nƭҸYn-ظm7Ny͓v7PjDۨq#5nԸ7TjT۪qc5nո7Xkd۬q5nָ7\{M׸Bok|ۯq6nMظ 7bVl܌۱qC6nMٸ-7f֬; UjJ<2gs 5Łk%^~K@U YOG"VyK g _aD-ʿ+—.s6ʏ]<B=)o&9J ylP]ȹ 0D=|@Fd7C2=F폜,:F~9V"{"gdV»x/z\*߬luǨ1 (O66"lbVksS߀LdO17_h7]VJ?Qtz]tj_w\MǓ;`{C\,d<ď1 Ѕ| #^2[zV}ҏBQ|F~b@!ڨF0 #~a~e|%פ9zm+~A@snW(Kn5<үY&WX@3CdA ZxSs LJx4#lksv#|fH#h\R7qadV|r*r|%M r/f99W팜=0M 9ЀUsB2CX,Ht5תzX Kk W+u~OeEV  ,+v`s"+8V+r.^N*J(+" h% ;\#haEY| ^ &aV`_‚lGw;9q~6Zub^8h c~Auzc8#wSB{'\yf^2PWU*iHn*2?@d+qUu~u^Pγo ωHG'$::ϓ6[9yLG׋ o.L'q^D?9q }GtJ8j|9wmMstX֡qaC%oK/ןꆿFKi;fPƹ |o{.9Gw맼(}q'1zᆕ ?4t=oU(\ Q)mlgy|>g!iBC~oI^9GG;_^|YrIgOQ} .wf3N 5:9YX{a/ Z>YxC=w&4+ >F+M!![ӧhg{g_X>ʦfWO]P"jQoWoDZrݮ]ʠlsݥe#}l9v|D,p~?:%I|#[&>FGeSĂdJZrî9uā]_[v,MiW3AnJN٭Gl-a^6*OJwY6GKn=;b<%]UG%h|K{Sazw4K{i<ڽG>Pn+taKbw[sx=Rh.۶[p?WhG~6[ϟi$ ۙݶ*s|_d[mJw$g6P;nv;VAS(=`~a#7~udh~SiKvP0v䘝OjP|r/d\s߫%dWͅvEy+MEND8.A|Xȅr9J:&K/] QDGe hf'}޷[';k /aJ ;ԧ OhY5^0-'Ϋ}MxXtIa#v㓑':[ywk ;v[V/k;>U0!}V(R[d/H;63M`bRZ;C|F5^oǑ|5|JQGU#MWUa9tY⃴DrZDKYQ>ty_"|?ޓoP||ƚ'xޱv̄og[5>e]nM~kıJwh MoF(=GH$ b<~ߏ;є7qH|jF; |nH7+(U|_+!g[C.:>ꋯT|KH^[}7b~]s2 5!X+ :H8vK8 3߬Qxi$,OSZ b QӥwZ3$ϭA;rq5q?OPz>KZ |..\V O\-b8߿+嬑>le|G~lڢ}S|mǰvhкۣt?—>GqE8ʑ߷9(r':ߟQI^z~S?[g0sUuIKRmeܿ5Χ z}]=$z|ɊwџKRccK+.{ h|e;XJBo-Y@%MXϔ@*5|h1%FH~_ϭ#ai=hǭQ:>^moxqs!'toyw{Li?4O\+nz}׷Ы*z|Ucp1'G`z'nmKXw5ou;2ozsLm0&5{FKv\h΅cVXzJZ:-vdWl\mmy *2Eq=ղIY#\iWUkmvi3=]W:~펹+^l!R$"Wv\AvKju*.5װrT+>?* ʐ.udwa\Uʮڥlivq~;#@}N z]?"a/>v6좲 ]-ncWW}~(+s5XɮrͦNf[6߿ʮ^vASN>nSС)mĮɠv*|/L@WB D:#.WB!T?:iws\踨~r\5]88~v8]aͮo/4{8>; w,nxtlxulw.hsSkXX(α@ <ʙ՟c {s(1Z.G?id5r<]3G{K\h~w4,W^g+uo +TGq}ķ~̧G`{@f'0UpsX/Jc5Vcwcu>H3XS)qי/}]E7W!O\eѫ#CH<.|Z>a--W뢯7DooRlFKoCy-L45p^!3r%:Q\:6оMߛ 3ѷ?fIzkdppuSRCw;;C|F@zZuxye]ɭͩZr׵*4$9+rYM:-K @OIAxl=[F+{Y(Hnr_օЭarNe[@NVNX]Gp^y_{uNU-CDq2Wt ~vIC-PG'\ddP|K%C P30xC^( 1@w=}!IY?~c0(#+C {UNɏcF|O(/K~*sJwo e .|!(I13N P?A(5Awp r rZ KPv==K p A>DGK@\d5NDl0͢s诹 d\r2ڱp%|5߯J~Am27 (Tp3YV-q,Lp;] |7| H~]x>=D @ǴN GnOPgguShs³Kȟ q_O [✬V\*YUX<'-_'Rly f.NbK Uq{ UBOqQ-ҿC8J,"ÜV1a].<|v>LD#czj0x''w, |d59'Ng u愦ByUVP?NFz:)yP_sU ' >@.zĉF?#7FK I5j]ӵ h%t+/;@{}x.1-^\+hօyHG/a|5 VrRj}e$\&\{4܄^]ᡝȶS<tg3?WKhPnD g=Xljo7:ND.zk>zOAhvkI24N(~uoh2L$' _^zQ}O7yK'"/Cݴ u ԑF#[ӌȻfǑDz|:?z:XyBDLO =+~L.5wK5;Ys׶ekn;Zs/50϶zԌ(S5zTOH#KQաEvy{)F۵Ť%%yHz ?I%ifoIZxHnM͊~v]ta9A&F17D;'xMŎc5w| _w|FNN¶ݤ' nm4̃i]5-uHL0t(FL{JwZCM/iУ{P1Կ4KچIrDXY +h9 pA 3K}m!_iN1i)-IjoZ4-m_Ut_T'Dӑu?uNZjſH_"|w ؟3J-O@s0~P_⽡4Dynv+ߖv?ӟE9յMK/=k/-//] +w%NU?zo<}}_|{GOįZV>}þ%{Oo7U| m>h{ڦT{}5}/_}wc!c {_|Hm5m%_cHcR|J~jL=Ηq틿S. g>̞_~oCE{Iy#D_Q~D~ 8o1f_#(:{W>UR+ޅ_z9L\]+|(.(m3o_ж?Pzݤ^{ݝQXzԳzoA(|1w{;JmJ{[jz6QXZ{#a5ֶ ^m,>>%y%ZAС+?ߟwP [_dܽG1V/K{7Axw7 .UfRU_!3.;7zo?Rs:BS_|0o4`i\o!~b~ayk"c^zO0kZ{Vzo8D2ߏGJ.1O|̼vQ_cƝLG=&y;A>3O]Vm=C~ P7V? V?6-h_=uO.@/?#4?_*F9~,t1w%7`>[5{4< %_k[pq%(9L?oi5姟XYGz&zP痢RY"X4:{,CZuYqǴ&kiȟvԧ6z xK{EH~H{A=Hɳ`{aҺA.ڞLD=}MƔӈ~#撻i-%Ҟ:>̺:{85KkK9֕vvO-Ի?i<=O?ϾB/m./+mu-s"$&h~I7H&@I#7 1ޡ3it_&|"T~vnߧ2 | ,oWPτ5.(s(OWڣqh;5>m .\X0$DiHd-ciێ yƏ5THS6AQeu]RMv7H^z ;K{z^bńE6/X__sBG_Ax E$WuEA\҆u~`:˜c]xA^$ۺ>/u҅ A$-c{g7LywE/>C}@A  z^fW#ʍߢ;I{8O~7[ѯOU')}'x ~&r 9N҆{MuL#X >EpzWaOWOo 1 .ǥE(tuErܺd)=sWYWsc6!*2ユ]q_8r8yP kau]Zf24Aef7ڤ9#zD w#g ؟Aq,G7&&i>B.*}';]]*-x.=Ʈ(7;^s>s|03Lo/}n'[t!jP.б'l}qݤA'HKGv ~[2-ӄmtqݖ~iˡIg/3EA=9YEHvd=uf\Av/^ _ӱ;'nG^{d<#/F~ öpo) {4o#'?ruo%y(4y>֤kZ8??z`o{(=![/(N׺H䰴6]Ǡ^vzCXw_d{\WnU 'ݙK|睑9\~ci~eȼg^ݎqvumGkc+Ean8h-ݺ$o|m?en|Ӥ7&ῆǚ l7bl$g((q8~u*]g0 Т,xHMv@'=(w x[xSް{y?~%/]"Kq#!pbim[VdMl{]zO]!}?9Q'[/p GhϣЏA~CR/ UNyjw[*M jOGiۋb)wv{Q-∰1iK)F/z{VQ _bé껈|5fZHGE)O~rd;K(H>ԫKWŤ~{ջqfy³D>KLߗxA-z઴3H'Jt(S-[8DG;Ԯ__JRJW>%ӔoO%^%կZgI|KnP%ʷT1ѽ$wJ.*ReՎRL(R|JTn!|7\X+]@啮]+X啾r/N>yP-Z-)3̻_z^]YS%:yUVj(Kr rL^9}Wz+]VC-MdYSWUԞR*R2Of~Gz/++C84ro_I桒oɕVt,\<Bߒ'_Œ?P~3D {U>C}jwRG\Vʧ'O%ֈ%XX-~)A%'QY߫w窼]TxuW ѧؗ>-~Wbx^ѧ_,,~*VNϋ^S{vݥnT}.T=NQE9® W?6S9E_Mt*%]N+Y_;S~O?4V<<EGEoEf{o-joUʯܪΪ'=W8p[XY;տ~ }_sѥvr%|Q/Ct.đR} SD?Ry;W1rR+(_U߁EB/WIJ3,[N^ωѷPe^.TB[ U= I>rB+/'9Q_pYu@+v%Ӟx~?]FڳGd[pI+gu<߮ziOe9WWrTt, bQpb3(Ogf,W@`^Tp ѭ O!7e5@C: l& Q #ec )8v>ǥ O!LORϵйxv'{S>N$_m|XzuPx;"E )O?!7_@vszAGDxPGǰf>(~MG)W~p\O/<<~[6-m|Uw|eC1sԧ#u?ʇ(6L>]{~EEWs:Tݕ(߫p} O>/9B,ܛqۛvF wE*Pu g|íe ?-S|"Mׁ^ބƲA@S*zT JI|+Md<筴 /N!Jw]C'|b]}.wt7qݙv>xTMGW/姟+$pɠ|G`azf5 ӟ/@KW]G:ahi:2nfy~ZGɅ[$lv'm- ɖn#lڣ0ܖr0Z!78 >| $tzB㟃Ň,w) |. 7|nL?=._0&Ζx>y2>8,l@~Dzб>9`ЅCFȃyc#xO|;J} C>{Rw'؈pLoD 5'@'_[5!}b5VG_ VUbSNJ/CVY}گpa 1WR7VQ?|\./#y ÷f.RNxrI|O&lw:Oxs%| ~1;k-|I+S>Wc~ɇ|* BH3oR8z} e R,\y$rD {)gybW8ڥџbpL%#XD3>w|*Xj#e.^Q ZRȧRANiRh/O{/W xOC_ BRTr{r),FASYR̷%F.Fo*I0?D)%> Q?>Gbu~H?Ǣ_ 'J| ;7~Ov~4W*S*rG鬗H=*#ϫTA"p5 oǪW}&|/Z,ꍿDؖx8::!ו| ?  3곎hP1&yC֙X=aD&ƚKv46.Ii'4ʃhQG㾆B[k#D>p+)츋+RTWH;bpDBڭw爣ɒ&DWa<)ABOjQM=Gɧ2tG4G[apѿn'UzWpI8Šqԃ ~嶄oёҎ^KoO~CW_Wķc2|6EYtYαWjonj8 =N7u]" 8[~vWxJIp3Ы嬬]0g isݾx!i#lE:/Oξ''8_ҸqVh R8k۹HZsƇsf/@sfwpݜg5~hZ]8 *r\ :\ɢ+EUQ㪢v*g0(~tUrehlUO>5~@Z+$e>p}s5o%lqj2W*>rUktiG׫.MͮZ%Fߝ-Cx%I^?\pc6@}%\;wp} = %9X]G~A5~\{藼#/yV:M>gI~=swzJ=|:A|&)0}C]n_F?~xqMocϛ?==O;F)5vbכؗ~+F{IλF/&oi^rYO/n29EO's\e.2IES)s\Tu*䆹\te.2aAsqH\e.2o\.sqȋE_/2Ea0sX\4f.3Ee2s\tf.>3Ei4sX\f.^3Em6s\f.~M9ƙa /)~vfQ~&GMZW-1?e2U^x3z$J99O~L9k觗~uI3̱:B/*{f3?uL@~z':;&T1pB'}>}qlڙ#uRk*_*%'9k;@Nrut|h (%k!JщI_5P1e:Pw:JԮhnY{`9ojla'TuQVUպrrN6ݶjhݣZ$j-5V߳D+lYVIӞ0'9%,Xw%zD#0@|met=uPV#Y%_&[M .4o5^m=][m`*`uġIֳ:]9[]m=ŇV7I^gկ:}{g3|ZYVK]Y| w#_ѧ(H ໍې8YyVRY/ʊm AY3 IkPaҜ4@P_piN~zr_Ppp 'ߏ|? Q458:C>/f#`w\D~g}@Nn_MҜp՗r搎>[}՛zn;AT.OsN!:ZguU$kqRa{=㳭v7kkN&kE[үmﶌyOd#)uIb57Ռ4'ZOzb?!k՘z[ fZk5jpi[WzU-}ӲE`=`2S/BNjp"X KUYw VUQ'Y[v-I+xMk-EGkcEoX崛nLXFUZV)yXe?ŐE@YE|JO(+b:w]碜k am YMxY^ҷBx< [^C'eh+Gh!0?QS'Km+4EFb#sё\d.F2%EJb-g>󘋚M"'sO:AP(sqH\,e.2OT*sq\le.2_X,sqHZgE\b.sQ\e.}W!q Xa/1s\Tf..30VA'|=D{giozK ҾAh:PshN ^uRGCd ^:y':%Я9t +6t_rwyy.;Cg5?XWȋ(t!?®?&Q/ʯU[XZg W%,DO+ŐVI/9iN,u{e5Jotie8,hr "u)+u+fiNJGE^g/Nֺ6%]XQi;ۈ8'%=F #lGla*Z>VXX/(V8"Xa5\Far]Ӳ"irjM!VR$evORVIkM̔ J݇YM|\T=S>໅RA3aw5[۞HR,S$%S25iwi~+ݪ ʯwOΚv!**_ k#-|UtH~M$>J$OhG;I;Lh"PG3h7 ŷ 񴛳Ϩ~?o?W}㉭_v/}KOƏ]G_U;_W{mx(_U_OX|ߌ1ωn]En!K=ɷ-|???vpeh?߱;ϽYA{!%!>ta9 .FHҽDoP#/!cgU8gK=)\{ 5O|-^rG5BS);bҸMsce<OrZCT_h2iGІ}Pq*(y}-lK=4.C}>=йԻ@ 2W=D6@ןЛMrVK 1g,%ǖSet0FY*~KSvbvLI'3(6Kb ǖl$^B R*VC2 }[VX_)<{OK\%vF_HŽaqx5/I߇b=rZ| ۗ.܍}Ci\fL]7-_KCxw쾇wRyݤb]w'H'| _P4|@Ç1GI^??'zk7|7k\8zЙ&BX4ֹ_?ZÛ@{X&>Ad" >?71&›S~:ޡf1t(ƎvA.|J9<_AY3@Y H8/-_5\( ~͏k$/RXa}/թ[:/Q?hū7 :jH۵,txw ה,^5*k$oՠQ'l]Fg@;=Tyg9jD{IǃPt8gm*N)ӣsE$ΊT?9ˏ&j7ҙlgvSgYj8x_J2k sѮhWP[⿐8t^,|Iw?NOǓ` Sd#ye8_u긫 j#W :p8{'% *8"yp.cN9]6Anӎ%'sC?RN]t:8^:@ן+oVɍN\|tγ3@B9N|EPrs!T/ޛF#MNus\qM#~0~O{ I9tYP,;uG~Fp|Nyu*xRtQ$:pf\)H{/A<1. ?WMzҞ'CƤg:q nis0G~P7y)zqczYBҌo_N? Ҽ FTgI,6+:tV8tV!Mw.8` ktiӣ.g-~7CޚҩƧ IDp}n< ]=s!o?_^=}Oe=v\d j}zyirj͝gWX.,G@'(hsW~WAWES{}Сg!Prz\u//AN~r5so>䔿\=ձ )#^ywTL Wo\oI_5Hcx5 Ļc @Cx;"Ck2ASdX7f gK5S5[#5Ŵg<s!4^l1N)cboK︆u\)--/x ?ҟBeWsq\UԞzZk>tċFW+x-5=▝ ׮:.Uc-#/T5iZekW Q}Vnɤeg*+oRWz#qθ f|kpbܗ+4L/' x Kx'5߄y s)?SF* e$p8aV kZ%=NY$"9I]̄4YNG%OhU}B+~65 uKѪ7 jPN59<t%VK HWE9V+ k%ժ!&Vsv9'Po5b:$GKhCz|I&rxJHiD{ U5?PV~B=K@Ή*N?Y NR.ǸH&^%Oeݑ,t&;H (,:e _՚V hg/.FGOqO|Lmt蚅\䛅\g\- s_[KMDHXO~pG'T¯'ʚID9p@?Bp rqE>s){2ՉSG i<&C<=J4L.Kbb?eԮMH0LH(;),dLlbړ ,sKb^Nf#fObejjObuĔEB=u/AWbFGK%O|WObZ4w,0Gb,eйzD"' s4'MȩXY牗i>K%6򂽒GX@dRK*&9J*y6&D{P'L!0YXF"$TVK>JJ|TYkRUeR5a'[NM~KM|Nrj%5|Ԑta[kIhW'4kR9a[+]4P4Xz5i{HǤүI$VcIiLq揤EV%,i\&I?k&m]Г#o?hƒoIs'4N?g| 8I@'{,8>雤}IܳB9Ug$IgOBzy=qtLI{g/=V}sO/w%ghKP{%~,WAvrLayOW/ūr3yZ|,WBVM|ȮK\@.Jmwyy)=˸L?E9'~@nNڜ-\ ?W!wˑe?~}d%ø34.~&@~i0肼vB.#ug7㿂$cI S,g0?>@S&f>=pqO?t:xyڙW.Wdy?K+-dýjCF~Պ^+qp"ujޤv7[c}wRB_tto|Umq&i7SEv?!Fk;g:r?;|4ލ|_@'zl=6ԧ|0 vR0H"GHyNBo{啤 b t^B_Rn$—:5^nA2ra1v%uf(M;|5 ?G;7 wxHσFbao#VJ1?jG"#:Yo͟I+/X;DESb^QreTRDrNꊨl(*Q.42R3FJ]_t0Qa)a>> :xNdҸ7j!iOšN%z:3ҎHI# hw}X8!/Q{7^Ta!nT l\d6tuҴ)h3H|h$]+lV6ZSHgnyUF\F?@?ֲVV;y ؑ22!wur:5: TC 5Iv!i0nR^tKi|S ;ɛ,)_sAV%- 4o03z_dG|5F ~~Z7:5!H˾04? 1S跁9`SߒV:-JshHG?Ny1q{;dOHkP?P-cb0Š3޾. D?2·˻\:T} r!octsk(2/~#Iл ?[;t#_藌Љ%Pr;̇9^ zIFբ<惑p?/ E E.f!ZWC76=|32bo ,.|.o/2^ @UC^{~y3Hb1_vzxX^F= ҎWR&H+R+VZD]0L餑VIo>m5þK:hʸh[Fc3P~}X=O u鏺u:YP=wW;vm)]X]x*G[W $$Ic1y`iad%y4la=`yiqg-b*1 z(}u(pt7M`R㽲򞻟/7qS?owGm?7Xwj}u1Zwϲ:&<*9w!F䡝׸wȞt־{] 63BMGw6XD6r Ɏu-=ؘi}PzнXv{qiL_t.p/XZG 79^Qux;*/e;ի},컴zBk~1)sewLYAY-ewA~[x#ANc(lDǿ#P0xg/翂Ң?hgktoUzwk,XVD)ş׮~ImN_d ǚ/?th'PR ծ(v5c8mW$Tnf{&^5 "zB#NpJyDGB;LiBoh^6x igD%̐VN 6B#V⍱:דΦ=9߿;e2I1zz饃7H\ڍWBS1Кv̄Ox']:kxӅuZoÓVu+^ByHh_Kx)Յ'5i_ GKoaoڙ_r =sM툿 >ǟaܞƟW_N^D/f ānj{w],D?EOR9yGxݛ}gx)$ #E90F-&g*^2-3vAO#ҭiN^zmRj^wFNr0`nfg([#3ok+| wx [vmxNVLCGs+|zx?aV{v*Qw~B?cz$(|zI=mEYOOg O3f~/]d٧A;~wO7;?0߯eбXx>d>q>- =o߄סun:5oxv=:z 9_R/xE|%S }DxB"|*PdRWHԓD ]@z H2q\UxBwT^/#w_5HN~<}G=sqKOq$qyC}O;q'q4-ӸNj_\{)0^q-Z~MZ/q͗mWS"ΩWEb\Y\Vq'0 V9O*/}L;}$>KWE—~"W\!饸ca\Wx8򧀒ӸR: ?4" #_8Гy2.Qvpq%qU5j#q)sANqO][2HJ9rSnPO0j0 yt ~{3ٱqFjҞ艆G}qk0NC(k:?i?gy2 kЮW-gvƅq)9*ߚVkGɸnY:r0@K;Bj/`|,߉qZvgГԳ~J?Gcs\Y㸛{GIgz|=}?XIJ/ć0j{C̯1"^튏8}b+:u"頗ex УqR} 8҄. C~}VnNrj8I:r7qsE1P\I7ȷ4xj<8NS@IW Z:|;[QЬnsչ߉o%Gs1W_1kzɡЧ\L&眯w$t>8'_tK^.EҘ4 io/@b@[஦:R]QYY-Ch'&548"tNn9aWY 1KwF OVͻβ>@#Qcpyg| Ю3;!Ā &\,vAWkƻӇ%*ȝԂZ;_?tc_-sy9Kۢߑ+yw\qXX49NH;%7#{).iy8v[jN?k+(td yOXX 8Z} ԩccN?4y{y}86aN?_sj=8VIY/%7OuXD쪅#_yiq~׺'lLJ_dSwe1tZ-yqo+Fcp81F EAb b3; C@ir3J;Q_[+>ώN݉q^ h1J:%wt8s#Yl7GMig#]G-o9_)ĘyQq,}x><舕#.?|d|%}|Qq@#98I@@brX= bjr$M qcu͢\bH:m{XGGE|H 7;ztq]B~:4'A?D۬..aFOKÀ5ѧ|(G^ [C䧑1GcٕVup{oBo7GO֓!;ѝM=1:Te8^K!b9:3I5~vjG3+MS3:G*ٔvק11~3z#M9U{>63|of Ny7^s}QqLD?Lbر~⿓X,K,Xb%b&i=,'{J0Y^NUUSqڰL9lx>»])>RʾsNc]3,y.릏HOS?ws_;r\J,xv8t&Zc_ow}~OEMҫ_vC;]K}Z;'s~GcN;K\r^" ;oCOO|U@vw|}%vR+ |Nˮt˛ź*{exqcΚ j$YV+f!(Vr!Z ]kijWI/+g+遼??ib}'OJOs)ϟɮsiM?nz&\:ЋXfe\I">׹;܎٦IFbDu+װEV;)Y'Wӓs/z+#w%ks@)EϭbD`}J-wGq^fmk1~8-XԳ (u8zq90 bc}3_n\Ol }HٸԄFRlqHyr@6B#n\Ld2csxk<4HylnFV>6t=Pp5O~ػp( .A{\ +n?\{614sp%ɂe&  Н̂cV 3$>MBp8P8﯍IG?ҽ1d# .,p^`z]gNj# 71{bс-99 . F5:ƫﲐ5oU2jo^Yw@, f-RTtcLnIѿg‡-VPe pNϑĄ/ЖVbi­s`߹("Me?Y|)֗b>"٠JZa'45T#rꚺ~֔&JZJZYR[ui8ʟ$MiTi&"meXKdZ?nF&u>eZD =߭mOGf)i4iֿAeYIXse`}(e}R8§a"o[Da3QR3ED -"kQLNYP;"X&`D&(>h\jƱCnI3[%Ae,juq4(7؎\JIiE`]KYӟk5XWhF.w N~A{>Ӗu.|u)IrٰDFSmӑ?\=n|r\Y[Qn ɏ-m ]4Z;2;_dXxH/3^iigmOyin'U8Љ߆>O3uIޣ?K\']G:md[n9MVԁtI}mV9HEԓc3*2/YZa-,VaY4a _q<^ZCA!g!g4ok|]ᇵD C糘?3,WV3-|/ _.TRGw[In8 ,L8-ÓHGh~/[LBN~U{¶i\!\'~}+~} {_tMƫFa}sS4[Ya\ }VRZˢT%W[.˞lVg$-b/T,wi`pzܲe購yRm!`=[F]Tǒ/GoK򩽖 T?Yf24:ʵ)?a)vB $z*<#y}"9 s*WS|ݮ_sxowoߋOg[8~,{$Jʼk^h${h}yKꟐאs?Br5B5B3! %moԧ Ӹe+4ᤰ/E[?C_!AB@ӫ~( Jh_JyS y!dO/=Z([*eSPC fgW\oِo\VCn!zϫҗ!G2!|2+u˦@|Hxt 3d3 O,>YЕG9~]@\PBrgCKBAL)=6QVC/ ;C pJ@JWŇ43vP\X:9ŸT|rDA~Kny_I>A1XVR,J>r-r>(y\-*zN}MŽjMENBql:GA[le/B,ⳜDkm9˪aѢ?r9ދU`,T\E='\;/A/T@4|}ϼLU3y9v(q\?<+=KGԞ©Թ=Sv}虂>}oXMӉDFz>IDI$Ol.|W.@ x={ƞSzN<*=zF)\gzO#rd?0n]g,'O&AZ6&*\-=3} ?<5FryLiy03^?yN9‡'A=n*T<3B홅|ϦsW ?_ ezgkW+ܯRF`C=˵d)g%hXzViY\a^Z|P2A~ {#zŸMAxx<[hOWC+{Uس]C:ƾ:Dx}ptv)}s >~k\PE%%Ky)u幤5_p~=|uum辏x}HWokި^i z>c~~)' y~5~}}|}{wos6U ͳ z9oaW=r\ǎ^vUKr̼p}pSg>ȼyAvs߂g5^wbK!-N3~=UxE6/A>'F2+/K=;|0o{: GM#M҄MNg= Q(5<П[o)dqvd WI–3s/a ^:l3|=l9mvIrA= Nmj cإ/ʩǖx!UZ5Zrӊ8Ne)'9]t-l'>[~W/UzqnYvYqZ,.K6́Gn?-sɩ[ ,x=O%ߌ ΗJqDM1Ә8O 0 kK?_S01lK֙rYMSX#NҐ㮔U֑[l9_x[.}9܍HN-ߖMڙ^:׎czzx2L/!k"2L/#B2L/%kb2L/'2L/)k /*ӫꅗueza^Yezq^]ez^a5fz^eufz^ifz^mK3L:3L^zgz^hz ^Uhz^hz)^hz9^/ /$MIӋyeiz]^Wizm^[tzd ΑYcq^yY.i'ri]0Cbڿ>-D~k5߷ݴf g|/n /G._H[_yzWlߜ&B?Uu+mإ;]{aƭ pj,^4OY!5N" J/D#{IqD= "JQMo0$'<%{ +g SW#QK+/VEhşN]F==4E)Vq1Xvx(-?N9||ƧS:1Z+";+nz h7/ўa)O떈:t֋xZïmd'D%5CNk}#?\i_yq;.qϟxq>s\;cmH2W@(s:gώ'ة>satا >"Jkw+*s wI;|evm|"Nj֓W[Q>C=PMgtY_oyҕuelH>ڳ5rsvmMyImN{vK^HNx\w| ^AyqwCV9S5Nv`~tel_&݁ƩqVyi %>sNY9_|N7vmOy#ɸxX_3Qu7(jnq0iq~gܸ}{pRwxKx©UXS".,.zJMTSWRjpzw)??Lhw7A!p*<|xۄU:Sp@@piSpSײ (1'pWӵxӽy%Y,9T$OpXj]]vS8bͩ/גᔷSo> (ݐӹFf7-i ZMӖӴvVk"WG'oz ^U`z^`z)Z«r0^xAp*KӋ0,L 04L ӋWrnz}^ W%k[ӫ21NL/+RyᵲJLOL/^3xј^5 Nk^xП׎cz2L/!k"2L/#B2L/%kb2L/^OozE^R /*NL/+2L/BӋ2L/ W%) /2#CYG)SYO@w&|Wttnz>d|8B>HO.67N=' =%+Ωsqm1轗w _ny Z r7W~ x4g/1{7{ғy7nʀҏM[n a䲎޽E>yQYƙz~'Γ xdDiW;A(ww=a::_p=^SzɫU"[X;Y,+oWq7iF{Uj"ϫ0o1NzNg2}¤&3AfhՙH8+n:>M4p[oPaꭏ_:Iyv1҄MO 2>OY$$lFPש^̈́axt?^}5]PZC S |uOeW#lyBjiݞ?`{k`Րa[3;b/İ yޖ6~ ^X 5lAWENKJyx_]/.{w|#᥼/:/#޻X%ʻd3VLw (>=_k Cu)zdgjtaaڵ i~uaAUnn, aB 9(yެo`ؿYL7FJwtg;Y R>o7 n\{zĐ6=y?pgމ$>̀0OW}^$HG2`Z'"h=&lÇ{Je Gr~Uc}J?|ƊGDlPGSӄ ~OI< z=kCyUóK|x_N>/p .jCo>TS@'U΃`o~ A9҅&'%qGq?D=A7=0^}0CG|R#C=z~ O}?mh:ʉwzt\aeE=rkv=(6Tߝߝzup^vߞ)~ߣBjN*EM_q~Oo\Vy7EM}Z}~޿G|9Ztlznܡ=z~#[rT~nPN oKBUTѼ&휢o$>*/򎃫(0sN;S&sigVa;C}޿ d*vv{=[Up,Tyw6;_wN;;Nz'7G߽*ݓ^gGw;?tW9w[λgDO޽Uνj=y6nARwTEToo g-ރn=W; QʣN?4TL=="/}*K RRZ,2*IUv=a>x@t>}ӻó|j *TP=[(",St>sy'}.:}'=EXW WyDx5gM\;^i5~REp6`O`}p9{ @E¯'=-nNzmo4{SO5xU7KC:6GXIk }ͫFIڡ7AtP;᱙u,gћboNI>֞GO|3Peї[t发'IZ/3ms~m ?.#v+: LǑŗEo@w( MӞ ? L>^g8% :+z ˉMTw ~eБ%kiʓ M*Qx80Ao{zf;U`흮Dw~<nyGûlГ~OxnҞk^V| >x;_퉢x4:A}UD6Q_ _:'K ĪEWuj_QY‘/KҭUsMI`;zy?ڙO'TYۥ_ޢ DOt^q;~8p?-s{ݍ~,$>)}~/r(QaOG};Eo[M&8+EBjock[pr0q QyV ;~ɔyEX$C$#MK |wogGqkϩoip AꯑCy_ɕakZj\xP?zicxKzj&lWeʑixե` ϋvx%GG6K2H N9*i?)\U}O>?b?yy;ӟ}HS=PǛUc5O{e'~uHNZ^6v~_"_,=H&]K|xT9v?N}#I~-|~?; zS3wxTA?򁾗DFF~_+:rxYr?pyz(߃ezO 3vs޻]'_xߚݕ(Hw?"MYn=輟+In+=nU.w'ǝUΝ!z~#SmM9TϝעNOyg"U{4Tw* ok>p*.C:/~ ~vro5P=7?TʿYo"[y_r=d 爵ۅۛw ;~TVﲏzWZޛ#]O꾿S=(|n.4Ry>M>gQ+vz=* &܇V™<~>ƒgӞۢ>{ve{T]揻,gnGҡw*$sy; DǝqϝμO9{y ҕşDQw{v=忝n_XAywd'=/w >(]Cw}꽳6ws7*mo#}꽛9U=ZswN>xYXUnlh~{_?**ީwٿy8)߽*Q{o+sn*>-lO>Q{];Hb^FϽ8< Ks-ODU@NOWqQ{L,tC\&TS&NX8šf,cpCX<7y}$LMThsd"7H&93|?yܾMd|w)1W>7bo.yC=ׇ̇ 9x7 EKߨ%@?q oi>1p472#chW7FoFRn fdy=w<:3G;C>qRptr tg<7&k;G1Scڞ蛉CNŤ͸q'>_tS,Txq9R=R{Șc/bgYWDd}Qk|> Mta|S?֯ȗKb_ %S~/}_"+cfA7v7W@7E%^&Ԗ+C˾1{o{4@Ǟܨ_-!}8,}nAnG>y.=y8A"":C"#爄aF8 2^ yߗWUu3߸*{Ǹ+en]B?Gߜ- <%nf䕓Eh/}Lƍ>ݏ?{{}sn<'ZdG)"rPD?۵e`Q~'ʶeOyзyi;3Nn,6j?أusӺ8Pf(Z[vq\q=pJoƉH?us۸qQqYvqE댫 }S"!z17]GU>n^y^3G9#':7Ǟžof%n{coxcT=)e"؝E„/cj1",2/sf1A}.z4t,=/0qėU:DY$=nܗez;, z'M¹2he?/~K`]čr\ zN_هHxT/-: UX7TU(Oϱ>Z"{ ܬĝ Ҏj3m)gS"yL^nWCR z+Za%*ZMe+sPu|UW~/+VqR!]Wvn˱T$a"Is$p?} #Wgq.Ǻ)G_/tHA^o/]*\5.X]ccfEB?þ׹+M EwY?פ߽߈[u}Gz-Y g;}\mȟ'{͖ѫeE.y9NWF}& ރڅZ ުA=(ڥuZr>OC)ډ,ڽn-{j=Lu#ʸ<QdE1z*eFϝ" bܮn)Wv!zV[{$wѧڍ;{c|tJU4&. xIVb* 114bZV1nbk 1R$SSrWY1U괫!Ϙr[LKr򺈩By6Q3L1dm s3Zwb"G5.c^H/ҸY" ָYq6Y yNyac#=sZdY\s]:&t?-,y^-%-]Sl0R* ?tc"qf,(~ʋԈm~mM( t`ءbSAQIsGӱk^K$_oUWbßl?4?=({X{#^oco¿ے;Kq5Hq'߸ o\0/7ZA+Bz 5"7qG\us4eƹOqx55ވk&lk-}AvS\7K h q7Pr_W-. .e'Z\2 G\Е+ Z ޏ /~/>V؇O'9{ y~?LVa>yR{bo "3[S~6Ԟ%o3}&3nh>y/vtQ~u{Q i8Jƾxy86Hb{2n;C_kc N 蟊*2zzBwW'j3A류ak(ivvKKS8UD뺘V;@b c'Q{wLE؋ҳ1ťb=O$Ѻ%oD?иr5smtZa_SCy[ʮo.Wڷ;[OƷ=[iAv^W[ξ|ڭ-y;{N+'sJ?ɞUg>]rc]f{&/L7Ck]3%E/3tk<.緣|oY+֒΀ouaAZҿs|N?ߡG9wN@kE@O9N>_.\}f#ϑzot~G&B]mN34iW5Z:jN%Dea儊NGNOr+O(X҅/QXzQ()NEtxЧtJWG@0_vDTuO~_G]W/^82%6<C y;Jc{䓗|C/A;wh4mJeiG"{IJ:sTF>趂%}9\ I:Ȏw4 MfgsŇu;Po;y:^|MOGw䰏#>pr~trdDָuc@x:ϑ{c r5 S_Ҏ^ qDԀߓICW=)y~3d~9Ґ.cAU=lCǎfgGSk8#/)㢍?G[Z;إ&\ я59+}A/mw&z"ڑ֊~k|sq }7DH oDvNzNgܵR1ǖc/mb< hh՘taY F2>=I9LN;]^,SXHK۞vMRxWۃR)0>4#e}##T<-d=&@Z] +|nf-4?[jN󡽃ɻ z^77مa߆kg1ye|6dV hɺpYY+g_fΞ#J|';vb[E#Ӽڤ)C}.}o_xov?o;Q\;_wF؟5#ݰW{[Z~cRol #婴`X~FI҅iɰ0ihzX&DXv’4jzaX%BfݰjV~_Dyf䫨Y1FIXMVEaN ;hW3S!cSiuM=` K=]-&] 3k6]Va]G쪰9B|K_٥/{|~ ;k~~˦de?/J6'vR;M_ > j!)mVꛘE_7/AOW{,sKo Ir?$XO}[,wyx}IV~X1ڛa kM?0l ?Z|TҙtO.d<| 7"?S^aYsaΰkM=x}ćp?aiv@'|\pAʛ|A47 |9|VcT)|'-7ɒѩ±CB=3!ۏ(i\ޟ%ւo-YZBf- UFjc-RXQo~hNk5Ԫ]zk lvnNY#ּ+uV)Mx%(a#kʪڏOPPVuv1ڝ.n ςнDGoJS:;NYfu#N5kXjj:m֝e;ءlݣn͑YwYWWziIFQA+w(%ֳekK:b֫V'GXTODQQLAjwD#"MQIg+$}QY%Uw#ꐯ.A.E\D =V^|IZA8LD̔G|ݤnY$_5"&KELwrʈB|"-Х\D7"=U%T.~#9~0 ko +^4aADuD`0@"Ÿ.&}Qz ">—j)) Pnf}$"Z,ܰz*ȸ zXix u'z7'{ѳiW̺Qaͦ-N?H~ߣuhR֏5XE.@?͖\Xt:]fnu4/vc$O]gMܶ Z}]WC:|I;ܚ6t {u/^֪>jnaU5k |r0_:5hߓA 'z$1%J?XQ+~D/AJR~!%kqXtF#!%_y!LjeH_?~v?5ÇDGB\07 \Grx}G@O"!1?Sg`M$gᣱa <1|hʺnǾy0 |Ipsc:s{+vtQ_'UOkaՆUw2'`a@kxݱ dr~+Uc6]ﲮyuQC| :+ד]`}acV:DZd❜znyv[nNc9-D,ּm9vY.-< .+}~^[zj<QxGZrlGxg `;b^ܣn78٧k}̇v ?hɞ?5߇#O#{MIF"7~0Xqx} r>%o3_4M,fJ٧Cyңw/|Ϥou2:~gx(뀻)ww9vɧmƥmmq4|,NJm'^=?&I/n^~l;m Oi~_Cl[՞|qȏ}[[M ɭ[_/Syy>A̓se ga{;vTy6}w0=5>^}|Lgh޲4hkb ]ځ鬯i;r2O 9oL^iB>L^o&g&},|Xs'C6Zz6E$mjڗvUo=V}!m_乼m| " ^;[&t@}϶yޚ4n"]817z6 ?߃u6q47K~A3smy?W?3 @=fzz 3iٝNsm ׂ͡ضT䫾[=֩u/Q]?~g2[0h}gk|mJ? }whrx,(~=7?dsӮj+Tc|UN_y*V堯\y*,vĢ7ba10~2ZO~ AkOJ1nKюOQH^6nؼaˏ(P|*/晔w)WRnI_\OuZE[)VrLO!FvVSʯR6k>K>]EJ\"+[KYy?v}*{,eI;i,e/O5R&R{Kv|){4e\7)?j;ec4E~ߩq#3N/9O9-<#}r6@")6Sʍ[u+g!-}B#(0 駋>H9m) O7Sni?6%/?ƅSпO/V@~1B苗Dž cGlEg^ƎAo)?;9{,y3;+Y߬E W[,vMD ^~SbTzΖy=J*^}ɭ)[9$DGŲзƯ-}>>r5:&pU9:j3jӮG& Eٚrk%O+ɏ-vNߑƞjՎ5NXvћC[?ָ{cMl9< =`vxɬC&3/N D.ߧ3M>zk&bޝǼ5z_K҅i%1Ra/g~]ݳ[j[A-A5Ծm#v&M l.T~Cs W~ux{`v[w8>~Aw"ȏ=;H~E 6d;r?Ў-qX_fclB^7×_Cu>7xk{Gow텩U῿K|Ҡ+ {=/_)Lػn#9{*iPigO8?wI_"_C>MRGVᗪ/Sҳ4{O\ j1ՂcLQ-v..k3fZ]Q;.뽠\ͪAץUtV 'za=]^A?f 7hծF^nA(7rri,hKft7hF[ҠUAߊAY꿠3O=]0%m?о:`F#0 f43f4`FOxM`F[0/ f3z`F{0? f3zMŒ.aF+E0S*f4 3Œ~aF0c2f4 3mÌaF0s:f43f43:ȋh!fޣ7 R>5QMT[^5YMV~5aMX[5iMZ5qM\[5yM^5M`[ƛ.~mlzȦw oe›n6Mg6Miӛ6Mk6Mmӛ6gB yp;L!;)oR,CfIB!ǐž7ħ΢'$žm=s߱8:E)69[Ϯwm6mmifwz#?NN7Px;ۻr]pkv?Ѿmfo6N?m ]ָ ^.?Пϗ(m窃xK\"_:v-Wg) _m =tϧx#&qnEYDcE.n<ëe}yG2x!UH0/A ͈YkO#]A+H,xUĻo9E'Uc"^|x#uG x/EeO#W24x _ 6zJQ^o-T̞H5~֬ ijokjH=Eצ? 1%ۘJ=lWq;ڗ&yw[{o͏>rL?ޞI{rv7|4oߣޕ9oYb ŋt1?%:NK韥x.V?Y ]ܯ{m6ioe7̾Qz3͛_'«'bPn/Nn_삎ox$&vy ?UbXJk%Yx~ [RE {̾}9ޏܞ r9;Mf? ]9x& N8Ǹ%s~#fQ4ZsxEb?eyد}Uu ݹxߔz:rp[%p.Crz%z-NQ_e^9=m"-`Ʋ]CAnDBob^E]oKIv[ ]W۫܂-K^21Σ1V)ba~<:~?߇Oݧu}7e7x rWB? 7"WOrc5k7kWʎV@+s5z,K^KӅ_e^1>Eo.@:>gxۖ+@M{r{m?;ʌijr2o=[Q-)ۭ*֕y ˼e2om]-/֗y ̼f3o[e-3֙y ͼfR3o[m-7֛y μgޒ3o͙[u-;֝y ϼg3o홷[}-?֟y м vyŭB!t[-E֢yѼhr4o= [-&JnY._4oe4[-NVyӼi5oD[-RVyԼujB5oT[-VVyռjނ5oŚd[5azQ𪐝02L/ k^az^!/DL?څWebz^(Wbz^,Wbz^0W%cz͘^4Weczݘ^8W΋r*1x1|L 2L!Ӌ*2L^Hkz)^KR o6E^ɺ|}:|u#k[:- rZk-iN 7^Qoup;oeo׮ߗ2ޣ^3_(/zq1iaZk)Lǩ_ Y{~:_E7I:t޿JW{w -\qczWz_ n 4k{-#Ljo+Nc5̃-e Khz z !75$D9uX,^Ao갠\ul>ہ;z$(ڞf9| .0>j?8 >`_ASN^p̏\cAGetM;Aho 7SA97htO)@kG40\| j-9g,򉒠 &th9}P}Ԉק|k@G $Re萙xA2ڑt*H.WFˡRecIq? ܫ|x~ Ų>W~=Eo= ]5ר%{l\M'\ NA'UPo 8f ؎X/y X%T9Kh%s- *:=md=@Y酀P2oe֫?ˬ[?GXKt)OrYз \2ռ,%{ {~G;m+"_A7_w˯〠f~H7q4q9HA9K%[87Mr19J};n&jsuOJN'\ ɵJME?(%}.ceVSϱ)S0LTL1] eHte&e>|kjO,_ju2;ȿ[\N7 :OŏZWz 0onk 0L|-) |F?H2B> 9ԮǧwN,p5Џy vB V KJi }IM\v Łñ²eۓ+Au'{`׽."4_ea?gr~$OGء3}:T)؉?{q,v@KsChx }3i{ 6\ʑ?hxCީ:se"h5#oXҞ3Φ s՞kp$qp5"}8 f n:n_pOo0Sxejg07ì㎉\; A>>'jO:n \mK;.-q>Mx& vׁ8'qO}xa?9K{wƝcr9vws>qؖL]GFG??)dz9J8V/=%u,Աc_|1GЎY?~O6cM1cƟc1V1OێGQ:s.c|:-OM{8:k:tt@Z"/ͤ/s}UOLJwmm;pqls7:_24N^='{hsѢ ulh,AWױ RIj}WtHxux'2_;PkbCo1Q`ڟ_ȭ1^qS)~pjcLz.;q+rO~J>=9o!rqPԎy:fq|ӑzEAs3X<|8ڂ\c'/_&~ _)ggMVTr'sDOqUS;²EΗ_u/HgF< ~M:rmlϙ й^1'ⓓk:N"u,+=LƓ,a"a w񻙆/):rV~sZNǻNܝ!+Hr,]vX ~x(qOF?f-cdg=@n;:t{T>s$XWat骪骥tՖ\IګݮuzC|v; AK]]4>\p5 i3{]t|zGDŽIks5Jt k\?1Y|uI\mjc|W}ics-PpIR?:qPxYs{i$zlt0.# :DP;w=ʹK۹gaD&{3ٚ5O:sC; :oe8ׅͤ`~[?w(Gszl0XdI/8WPrɕs)nr8w~$=cо=ʟ2Y{4Go\Zw;kR_͞/)qds/(Pv+Я>۴lz>Ѯf'@M~_.ֹ5RWls&lgWX/&-ChdE.2bƀw4tgrvajx_]N\N*?f;#`<п` Q' z&ED3U1k&Y?f4Igb,EB+Z1 ٬7gcvk$&:hsȒٟ&ܶr( K1|" 3/S8OPT8A{Wh4jx3V?-Yj1)M2W "G?SFD`:19*?z4`HdDnL]@t5?4ta/zniNNԟ+w Q?HE}'RZ(S5A3B WGQ]ګQM}nD9(VQ/YJFk <({佣#or&>FyXxD.LٲP#bJ+R,"%r=rYKе,$~$rX3_YV-9ڑvF#R̔E9m Cp1rf>Xzh|Ge:_O6VMih|DeD֐FVw NV^x0DV $sdi'KdQB|L#+{@w%eoKoh\ŲW$eTyeJ.戏e5d!|=Ҳoʞ_^K>Wf1ePUٓ'e/Z}nÇ~*=4k'2 ^22\;r; IF"g1or5::_ WgKos?H_DZD) 57M振6A{]ُv |9HWGfj~\]_Aj?!o]ZQDDgܜ3$.U%`J.4OGY~('ʷ5HjL`QKs/Ej(Ǩ'Q藨撣Q)>Fe/9L}SUrY${#jҠ)jYy$SϨN KEm]?S'Q{!G YQ#u~<|?YX敨 HgO]DtD/:\+hh.GS-KXCFWWj4414DwT;!{2L.G<=X(zeHhԸbStr9a󥿢ҎsUVUy9uA,h.Gߡ{xDG_ϝG?${?>3pTʳ"iOS`~5ٻq5.>w3C>{KɕތB_B^~Gu `>Gs1.:hɓP..᢬^(܂\ds{Mvle/rabW[ ';8Y儑:sh 2\a +rk^x6 -3 ?4?(.He)xy2)& 6rah*0}XVX~?e'ئAͫ7?2v̓Df WpkKb|/f\'eXʅoh kHWXM?~E \Lڨ&ɭٶ_gEom/+jCCXht|g}<Keѿw iSH!!t$=TFgf!g`7Wm7,S7/_Ks7S> `[ހ8߈ M͋9 h ?hߴg5bGζ$.n#9O"{x/˼X0]spm-=I=|?vRt_sa|S ig H 0skvOrqYp!,‡q s|!PG\΃Q,APlмlɅwӮ̄iw:2>E/\E}l @}V@;], B  rgg[thF2>%0 'AD ?+9t1,B/O{Y_p3X Ÿ;gCl%2 Џqc:g0N@A.3?"0g]@oX딿9`HwU?[\.=O?\_(zPkLӮ 4J}ypq+gz*`pfI%->c҅]҄iTpӚrҨ>i/-qRf[%Q3BVOwYs>}jɧv{|@W}ikҧCo$7SRVɝmK.36/#7]yPK+9]tZUr,bA8J<$|vG;]W rr|j^=Ӑ=dD[pogLD'Wʹ w.iP%c@jgrR1RſRٷCrP/ERYI96y;sX0RQQUI ;k(Յ4T; Zߥh|J~r{JuK\!Q)rQe4KG7=C8GP<>_o׷["WȽDEI[jAĵ%CtH#?-/&f _4Y>7Dw՗wxߝ/=.xTGdR?_$>~eŠ:m)JN~5?PSAKy!O5Fǽw}vK10/CmMj?KXSmZ< $yN}\ꊟudW;ҨNwAW]ߟB Chq+-8SEzǟpHɏcڻŠK_Sg_o-i;7&WZQO !oě4C(':|(ecqw,WQ~!˲AW=oOs>Nr<]ː^@}c%~ץBwG}AkW^Vs8~_mރ~E5woJ~^g|'N_>?v|~>߆BC垃o9byɹoM|o%?='>ST^rK# IQt:U7ODOiwU:64y*ߙ®E#ɟμS}a_5RJ!1ۢۇ>ط|4Nc}VN&kv$_Cau3طMo>6.yMg)ç%W|,C>cGm# tJz,bJ9hP-~រN6֗d>J]acU6˟cv3PF}v-wO(=ޓvm}vy.N~Qnr{~Rڝ2vSϴ nѩq4@F:C'ƉWHOo't:dq&PiczI W f\ާU#wqMo($qkʸE;n`q?Eϟjܓ G*Ռ] H;CXP{1y9xJ{ {v<%KR;Ofaƙ' jS/o]ZϑY ac-M:| "dp\aX8 #=Qҋ |?|na2Š6a#KOJW#]CN§1BkO z43S:O +L4KllE }(&O@}t=/v8zI^ .I^[ƳT/+ k<eVϯT͸&;ո8'7/Rn㜼3:-5N85dC\q"a[1SIRzc)܅#Pyaۥ_w36 z<0Om.ïzǒƞcPusc\*ݳ3V^#f W@J7_E{xJ/_z$}gR7oIK_ϣ/7ͧ1> a_Nz  &?r1<;/4` `o|yȘp Լff=57z5Q{co}lc:~(id'iSzc&r:gcp+c8OV1p++_0*R3e39nVn6Vϕo5Է}V^EhmmE}siВ;"y8~RxS %c. { ?wxTUMdfL23I&[fH'`PzU& h4 XADDTĨHR% (sx^~?ϜkZk-,{'Bcp8ǐākeH CKc0Cϱ5}Z0`*Oq2|L+d*힁CD?O3R(vnYaԆ'ebs P YW o2K'4eٹ?̎(mvhQ3 @^%?,فa'[Wfg/ gi >gIpr"}JƋ D-.+ i4/ض2)^y!4L8DSR] lcR`F#]2- MծU+Rd]dwUrS࡫$W--wbjw^yIٜu?ǴyTrZ; 7X|WSmzpL % "8_rf 45 28GKvC4;о^21:{PN6`9w>$?G;359iwG$+%S3ZΈJbOk.Ʉv'R$|#ɔJ7$Q0KKɒ ?G3TB<2'<'~Mhi}Wy_KՄGķ $}|a PNpkHH<6ߠ~a] lL(?O /jşS$KC\oi&M] }=iP?ŧBF=LEʋ(:ǝW⎦ qD6V]9EZGT<򴧬%qꟸ__q9?D}_&W|HZ[_[ǷT?ǷU{](|@ϑ?q tx؎Ky>W_@B}V{Bʎ_K gA=H+]Y@B?]Z ΄]cKxWtKx*U#K'y#ȏjG8)_g9+"YRȄߴJEe.T͋42 8 p6kZ,Y7o'ug*z8u rw 9'_2Ǚ| 柷:ksǹEν9B,P?8/Q˪sUt%UY"EwW"TЕ.G|H.BG\QWF\%D_W)2A7EW6J?p)v5!f;YףU󪫧W/3Q0g7:3osOKW] ЏC?\Cm?ߗ еN+u gkVXm¢_6ކo7jÝ7л>Xt]ivۊ}~͗iE{\K]3ymq8:Are)7O'\[-p㽿ut| zU5i+qG/-At$5>yZAgCȟr^Ɛfaj ß}AyO|a F:4e5Fr)Cy&Ҽe n%z|/1rI~}Om N!iG%~}Z0zVI)נL,嗠ܑaӠ5MucE5Jy@{R^kg>OOV9=@9`5>@=[AOm2Fs-1j=$oA S2O4l<Zz>zL1KN×ˢfd27fѮY߃rsj轗~9L>,gY܌U@"/ׁ_1^x]kc\ ƛ'4IyKxW.]>{_rl+1O5gH?J:{=|8ޟ cBlr9G(CrJC=x7pwᏲ{4e5ʥg8_~8 L㜎:5. /d/ku r&uYys_i=cp':rkȯap񔸡t)\)UƍY$oc<Ὧ|wB *Ϭ+*U66Yp\фLŒ#31U$˯:J{dbI9B%d\GGtOs0%JȸIa@\b@\ A5 # ZE.2}h.P/.:0q ?qЏC7.椮]G3s9"7G\!7A!DӬt%2+&d" гB8Kh%WSb8oVYWeB+Z{gaÅXQKGC9W}IW)TƸrC!`u?!2_\A]Q; )M %B_Y3ȕ:J8zR(͕gO@ȍC@c=?<yv|WT(^Ɨ5!vmjclABFAcBȌ3Iy~:Z5'mvo1_ I0ސgX>y5c]Wn03o/ ty 52(Ø-b|MMW(1P82D?ep1I!Dy 0&==Pc::h"NÙ-Aǀ3yk|8>Y Ժ..e wu͛W?o^\կQgz[XF7k56QFVx .0UKXZM'T[3WE !⯄ǩ # `}Q߱(^U½6 y@5ز[;cɖuٲ6}XX-keٖu۲v[onYǭv[s˚nY-ke}u޲[{˚u߲߱[;`y ,M >X;ay+,Ͱ~X;byK,M+X;cyk,ͱ;X ;dy,$˻tdy 7.qq+՞%)?'JDZ&q\5qx(&#.K긶gWG(.]E'qxҾ{DJ~W֭86k=_w/v(>""qrTb*.$DXKb{!'; Tc ;S\'9UZb,2%bq`4@}QbvkŰ3C|vƼ/+ҸyNŬ1\ӑHcbzT=cjd ծ.xj\ԧu||SOV7ingŷGsGԞ}of5[t OH=>_G!^.zD/=gghFOjމzGP^wϖR}}SMi1|_6%HFGSꓨ/:E]v?}ўVԃjiDף sњ;\`=NFOq//Pl6ѳ9};%)·/ z܎\&z.(&/nS/:H}˨%Ї+ H3j/G>~I.~ PGǒxĿ"_"B}I.o~aODwrW)r%J_ (5NjQoyn_s~Śy'i'{~7 Ϝ8E /Y=K=a%>7 4b]0vޢ/\NWڨe\%f Y% ?l9=61(,2KieƻT$fYfEih:]"?Ct Y !x/R668d5m@ [:Vڌ4uЄE*졃!̞>lTyGgc9}aXyыFFl{@6~(`|!_l|FI#Hc aN@ϘF?.26'hd>w5Elؓ48q<~TT@q8UFs*;#O8~ n>Xcsϙ;Cllt1jRzl=]#7z< DQr2ih+פ.~f?C6ԧmVv=Y4.:i} >*|K3ZrS4Y|/JZJ;?VZ(moW,@;sM;v?b}(o?/iSڊ2ߴyDiv5 LIjOӪkVH'>Lf^iMi_Қe7iiog.$m+mr+X(ӞMMSlPڳ&yt3/iCeK$z}zNA},s˴nꇴxO2fQj< PKjF8U6_%mikAY>z!Җ5{(E5ڹI&NY 9KNӮKŷi9*[F?C[#ոM;~e?8N{|=Oy N%gҐ+i]y?[wCla: EKEjܧ\K+c)/ɿY~WEm,]|zJw'UÒ6 v^R~Gd]S_O!/'S ?@~#q#v,F~m_SG؏K]K_R7k|"oRjH}S A}J}k'y6u/3CSyo">]RULy%S{iM͆xR;Cޤ>&~Hm# ]jsmjcҙTAXWsk&E #hW{Ieܦ~\c%oR_JgHT%GR e9P]j$H^&R?اVa$Çqc+Q{4_\џh7DܒrM_c%4V)k W?KAAw)[5l-eA{KYK9oHHYB9HH#92C4eJ"=|WB_ &\^)nQ)D+~ ӏ5$wS^@*)7-5>RZKHyu;jHL= qҀI>|RSy>Mg78z}K+kvyԻ+]q )iSw)\nT̔ɗ( ,~nk=z1|F~3ܦ_PiB!{[SJ~r>z,bS:XO.[qw:J}Џ{iNshOp'9rvO@;*i1Kj9iW/6gcd"(ǼR{C- ůT}kve̲Pr)aN'׽_̓|N N>2..e̗+ 7o# E .xVr;xH^#/[G ~+& R\VVg7ۿ~QK,ܨKkdϩ'74ߖ,yp:_KſW ,iFp)Gpir'C@9I{Ňq)K~c~Ct9dp0t'+~'%_OHN;Hu7ȏnK>F?wKԱ;A^{o-M bo 68Lz@gfN,XK=Իx`Y}FA=!yQC#]#M;]<̎y?IZ{+ ؑ<C~]_[ɋ4//X0qҨa>H?иkLs }]*ȵk0Z* $XJO p]^U%ya9. q8Ձc}Hw5Ni|NObaK? *75$]7i-EE_oyH|_ %s4 +g\!vDɋEH^r4 Kott+ot!-1Еtyzv d_~<{Gxl};ж?xҳhw[/hy7L{˾/(> 4*!#9[ jJ^j'^i5M_=@Hk T $o􎥾13nDɛiрIOU4~UciTRׁES@EQN,g5OZ-'ZK>:KRKFH Lܽ3.fCǒ -!6Vgo ?<606"/>h`xOr1ZrmJH{W[KXY_/>ofrp<|!_WQު w@CyA  =ޭÿכxS_R׊ |8Tbljo0Z9([Dψ?Rd[LRKtabzD(-xw>o7 Ch55?֢w~􌠧>H}SiTC?KG);W._A?93ؔuC i Q4F-==5|xz=y,A`GC6됮Iͻ޼כ'4O>ߌwc5nOޚ8Q#8~/~̮^мE}AKpz Ee÷/΢s(o7u/?YG-\s#NF^s!|u]E^|5ojSеNGG /?[sօ[Y|N Zew{{v:O|i~?y*x;/u%7i!BsOGc'Yc]s"zXOS;K_N^nlR2K=_FYE".'~0Ej/,Y_%~cJ1h {ב{RZ襻-z?TK{9I84_5|P>w;YR]4uiS}Û3 tӰ=F8L7{0Q?Q':Im4 AN8rǡ}^Cvk8Ȩ9TzGAnEPo(_nJRw}q/my s6# opѩ#q>MXxʝ??G@IEL.u2M';C?+\_F3΃ s }FO0Nȯ?_t]/PgjF~M ghNK ܈YA 5@=igokCp hɿTnNm~6&\}:8q8~~ ^1qz`M}N;O#|׎~h }!1 _X >%kAפtǐO C{0>ދQpwJ?tLťANR#RYnVE^T+ւNՄ wi[wS{Kn_zR'ȟ~ˁ3 4h›X! oY;#W8'u& (/"g^/"a<)g.K=鯗U/g|[ }CU@}V?|+_dL@+[տrqs>;PBHxb%J𹪑!\:嫿YXEfq@ք?L9nL_G&;vEFg'Xz!V GEpym_+7[KW^_ &6 @_me_"e*t<ˢ==F>k|x7g_7+(yK%}Gm*ꛎ>+y#lҷ9}Q?K-d[ }}f>5>D:a#>']7};BE۸uI$<;w'Byw~%~OGtI+VQ ۴c@;Q SZ !:T{iEV'iiHޥ5d(9KkD}^G( joLL;$/_i4~ʈ^i۴Hɯf'VH+!=#}>X:J.U^շAGɛZ {Ro7 YBF0p"^ a&Flp#ٟ8w%`M=ÌZn%=+{͋Fi {$619M}z+|a =+C&E=ߛ 'Fxİ-&=|=g[{4GƓ o}8ڶuE66rdF6UQz`ō@_p AQ5c?P)Dx38*=ipccJSTY؝ѶӹbLb̀fH\-{6/oG}Xp!dj70.XZL/襱J/Ցr7= MT^aj#u.|.\ ?,=?r8w} Ur_)ȡW 1o;А|nGƏOnm7^ͣ{2b/`WwSi sO3 6+5A$?* &xg?Y]S~dQxqE=?'ւkxN889?T2mOP:\fFp(ft%=Qa 54?Sfx89ߥtKo1mֽ@}^:Ѥ9|)|<6]=koJ70S|IC#Q=57MS] d3LZr%TCI)GLQ=M{8M?wɘNEC<5񃔎8#R23~ =ßv[ӦC0 # #w9]1dUrI |QzMģ`,00“Rs,}prS ȡeiGiYv[HsM fz^"t]a1]yTV\ g|U^z[iຉxz_@;PkWeO2@}"cw ݺDEЫ.pe93/ _8<3z &ch/Ϡq/PAџb^,@.`=r8vEqswǾKRJ#Y!q ġ_@6笗>|blCB8 Lr<)dкb={6*f&ƭ6WL-9g2^0FcEp %ƒYJ/-Z8 p!+Aźr&6JDU\mL 떱_ƨτU֕p}s}>yKIYr8o/^^_]C\pw=]kfit_ieSwFuCVlUU 6Ng/f/o/es죕c*n$qij&\v隆ZWW9_ޫz9;duw DuxYKB:j8X9P -=O1<^gx6]!l'f(tU{j_KGZل#b^DʏH*r@CU^Ds%hվ>ZE]#>E4q1#^EH:OE"99%SY#_P\FX">.:D"UEUw귨a:˂燔O ҲtEvbZ5STa6TDM=FF砝1⯨?QdQ:Ox9j,QS`=DyY|rUvӾtgT u+cojoa?r \UR99.]['lTӸLL/odWd,a $E-Tn[ TG6иlOzV=7|tQ[Y~JEȰ5B4JЧ !<>\I.4qH qN|A*{E_Ew?h-o7ȁȡEF|@|2!by5G<`Y[⻈%??Gi\_D>ݣ0XA|YD HK= Ϫ"Cm9΁4g3_i[yr`F{|ǨσÉ p[xW^~i3qEtq\|UppMcS;x ߫^/ԏ<#Kcw/}1,Wh.~rܧv;}/G׸vEoYxN~Viؿ.~>Ɲ}h颛}> }*Gkv@(zg/Dȵ*{.{IC-8}mEOFmo[[E@=/>=eqc~8@\my6[؂[fkUo[;6>hOgyAf [- OƵ1x-DTUH]HMwac_aaCIb҅SX*zP0t_r [j+M7E*'=o臼=ECM!@!q QOVUNk]+><":I }W?mQ?mS.Mƫu)0#0 Tk]P+d.Y0(~^T?nG~,j.K?|_=OZ`yN6Wtyp,^Em'ݫvާ=I1ӊr$o^ xo$iC,9g@gB/"ʂ㟬 3o,Va:?w/I,!ǩwGw"o#mz/)wZ:>_rk{|@#k;m7F@POĕ~eo3ᯣ-~wj؞X叧_3xT. A~y,d߫74Nšo1Y3SqE|qZ` Or6he%8;jgwo?3#*4]p,kOAGL$9 _K.d씅/cf8˳F)o zü%c"2;E/cg`<\< ɂn&tw$g3VKfTP[[5~2ifppM¥;yˌc"v3)r$cxKPI2h|gLe8K WHPy2^i"r3i>!}-7[Oc0eieE6^K̃ R5OeT2nǣ$.e,quI3I|N$_ y:@=8(-O;IQ>Nkg@FMߌjЫ棌{x_ޔH}cX'Xݝx_h=iGr+;\ҜvΦN7$} K"JWJV~k7rZ79XJ.wߓF}( 0e xMz!\W:qm'f8U*> 4F{6摨L[~~ _!{|)(=+2"Wjw NDenG^9©9 \W'䫧 | 蝘]OQ_rs*Т;l <cSbB/ODp(PzTF-yV3j3^z7MxHocЫ"N2C1Vz_S? _}9s@fG.~y.9诃Yjr׼b:}K:;f/E{vt,FkF' 's r7eYY3F\h㬡Yi՜ۓ.gjgkq g7zqsFs9Y!3Ή3A}7NR9Zs PIw0Shl&sIycFs5K%8h9GNܡG{,>s6;_xvI 9˃'K;ߒ4t_ւ͒ίxVΣcE':OJ$yrK:/Jpռww\ToWf-W!m~pU׬&jkKKp5jH@W YG\mzu=FzBv,%>rH;p ?5j2% ԯ(e//Ϯ6]?: GuSI,Uhb kbIi# ajmޮ+uSMvo p5#r=uK,O=mĘ Ғ͚QHKOC31D+A^X\;u}vo> ~9ԇPGwr?|LBF6a~)9Lg>K_:S\%eo)߄߬yWI88L >=ax!JK'0i1⃄S`s YMh)4VR5-Y4RcW~7ȯ9 SB E|Muyuu˞ٺ eDܹLں\ںlں|ںںzfuyuuuٵuuu9uYuyuuuٶuuu9uYuyuuuٷuuu9uYuyx./ g]>ew.+./.3.7.;seeeeeeee\o]eeQKN)\؏4nU?~MǨ/ qCK<Bt{\Mɷ⣸=qn@\5¡yBFͧq#(㈛Ε7|ޡ^iGQ8kdzx4V7C5OĽO>/{Y|o-oK-;걇?.iz_ V^2n9g"1㿅%q <Yԏx7'W;KBۢ[:BO(+z&TR= ~LA> #!@V?%TeTĆń&[ڙMOD}K.%<ǼIߧ/>m\Vs'vY m#_H1wȪg~~|j5~-,`6|omm޺TEq槍V 7jd>=sPa~ 5/v\~U Pܵˮ.eY̼_ \$}\stl731ƙĉ/yV>٤糆 gj\3?nH> Ӝ^\I3H8Bpx}z=|&N3'rTfڟWd?۳Y)M4|65w5c?$aү Oa˳ϐf9P=L?g~=ۇ N=ޛ-4_#/e5j0t\[#`g@y>'!+9SZOHm@]a.+~P_j'(oJTyk0iiUXDa5j3`WC3l6:yG+yY}T5ߪɸa*]w9ݬ>%U?"fdQS{ Sds_җJؿ}7sL8mJ=??|܁z<=쟬~*}Ix%;|ԗqA>F%|r}LC:xI~&3q(ȥ G?O$t&0=7("K )*2yD: j#k̋u^UDa=~}3}Ϧ0S&ʛMfm@/IM?KKK­KíK\*^^h]:n]Bn]Jn]Rn]Zn]bn]jn]rn]zn]n]n]~tO[[߹t]\n]~v.q.u.y.}...z޻sD%/ wj=|bykg_?80dJfp{VFŎ]FOhuT]VevM#oYK4xKk;]&\SRt KVo!'  A{@zPzSTw܇Jfp kWoJ^x_WgTwSQ߃̫D/8޾mݘgC|5CK]ng@O`bo ڙ~rHi7v>kE}+~"~S asBK4@^kAZyKxe~ӟuŗЧzR:A?ix^fV+oݫP?x~׼Mp<=gpٛ+#=h\xv>/WNQl O'3xt!i@g7Dgϫ|Ht,V{^Y#8,;>Y-2ْ󞅒yЋ(dς=O{A%J2t 򟿋$=E6N>jyL'"?e:yޖ@{vh{z}|zcIJ>#<_.%O<׸|N**y(~|lvhٖ#>~HgƇg5Vz=fCt~"{cpZ/p1|pYg%Szkp3/bIw+ xռ|& rh3Rr28TOx{R.Ы+|y=I CyN!_^;eeeeeeeeդP |mqAƦ ca`Τ :8WIk}WISXRgK~q" \&> \ 9_('>m| Ur%77tJDΔ:&uʂnR߇%ݑz=μIg7]ݨg7;Kv0=Z/0/Oz28 f0??/B?7 ȵW%G3.k\EW~|O[w 71.7^܂*}4Mgw2.~J? #g>~|Jq_Mk֕3@(Rd07Dno*\gqoZ+&,jm U4aSඡx1åWyOD#l4Ųވc]Ǻ&o<D#SSv ' [D=t;FEAEF(yjMX74CnnfцE;nIjUQPg>ll<dj8Q1E=UPa֩+h?r@&37抚1Z }Zϛ' R~>E kBz+ini|bE=S"?=s׀Eϱ*HgoJ53+ϞcOGg_L"X^˫byY,共2ű:w<Y^!Kdy,/ULBY^)Key,/ղ\Y^1Kfy,/UlY^xQxII)ag%m=;I8q>UJx[j%:GX|FDGԤF}O%9rJrU+:Շ i@{869hvlIY_ /q%Y~ aS~/u޲ X s^r{??C^ ۸"Kx, xƑ_}=Fؕ{0e ; c>moy4^zDez$*F˽.!?MTRdxx-,&soEJgVW<)%yg8^$g<4{C_=[|*y6UTZgy_|yo,Tg^ɚ}=ŇqZy&}zo4SM5<#P;U{0[sO'RA逷A0o9^>I}E^ODSN"q SJ}]j(;,}VN*_<Z%WiUFrͽKZb7ֽM)|'AI;{)ZPZpj{U{;o4s^%<{|o]VSϏ>MnTo3v,__ּΥsdw?'oc&8v̤?<~d Ga\'=J=pt7\r7nvץ^ikn7q/LƟyɝFh_[ nՑ\u7̧^ew''$=ǓZͺ{S^_[ߗWҽ~D[ivYHxzNj~rI×?4{z؉X#A&"w+7;P=&Quom~ |[a{{>y$G!$+ZɊ^&+Ɋ~(+Zʊ*+ʊ,+Zˊ޲.+ˊ0+Z̊ɬ2+̊>Ѭ4+Z͊^٬6+ڍuke=ɖukeӖڲ^[l˺mY-e 㖵ܲ[t˺nY-e޲[|˺߲`{pǛw6>X;ay+,YY/g/pJg˪Ay5dO;|q\־Vyw_g8Sb6t'ȺrA9'SN!X/^-iaP^:VVۊz_|e-@YI?m$ /W5lYRM|8 K~V9'D`tiҲrj+0@8PVO{ț/F>="DMࡉv^ tj'ku@[@}`1a&0!='`j(@t@Y#E?D>:`P z'ƅ@?8G_4#z/3>:O@=?$~GSyk_qR"/@ϕ;t* C[c4&Y-ᳶf m/ksgJ<_9rUpU~, ف ^Cބ~y6MkSSxU_h{QDv^]]ɧ(10>tHп1{\p,;,t&t遁YAE^ry8q?b'7k߂OVɋXX<[';E=?W~rݠ]@vnǏOO lռybt~* k@ y[W _p~C[xJ' xU.7$%_2EmhrDTVҼ [m#چ׃S?/E蠸68QA73Mi^i{յ ֠]) $&/~ 6;HQsgHP(ZY5"j1Hc/l y4[Z(:DծAH_MYmzxxl@tD^N-57uRľL#* =Qz^Ѕ>M=_ɉi[USE ?Bՠp& ES]ID5T5J}ޞ>穌7zzR*sVԆaEu܉ ÊB(+jN Ԋ2N(+*GXQ,VTbEXQ0VT%cEXQ4VTecEXQ8wrR>يⱢz(+NJ(!rbлykkg? ~iXlwq{lϿ! #͐ BlNFkH,N!/ ghvt qa74/uHd^V^y,Dq_EWN))J'*'V U)%T^Ӫwş$*ΒUbk[1KXIp-TxQVQ]`Vaʭ*-oKWbZi] V}}+}OW{+#?EK܃~]joe<4V>O~*_gH)Ir Vg!wH#}Xi $5C2v>d- yXyt5' ~J~k5!aBCn ^x - m%mQCs4 >B'LЗ4[nR;Cj)_S=CcIa!ŠYXI ֬SY-,GaaO3v-v:Ѫ#c¾W{._lmzmT[#k#z٪Ɩ'4egzƈl?nuʟ':ؖ~7Ŀw5nlQ|IzЯs?p{P^M7{uޫ^ǵs}S8Qi&:'*~i9¹B|1_}vwdMo_QV%Q"&`](ZFf%ǽ7G귷P޳ e>:A,}<+c+QD< vG(Taic?ۡfo z?f ˞Y>JivOd Vl`Fᅶ"i?l_0lg6Vx(zۮJ>ˁ oOᗀeo,zNOd b>]Bo;OUЍCAе7xڳ(Ƌ.!|mp?{ GWK>70w,E}nޒyU_@=ǐOCKy_:']mܠ`Q#wU~϶g[6/m4/^ 3^mm䩭{ Vy,_EBvPW.{?"/BEEϰ|oa/j^ {%O8G5ϫa OaҮDU?7]2\I 8+R~np'am#SfB'MkX)z ^վ$CUCר+ԾзrKEE?վ>O) m"C~M?y(&z1UQ7d뵍ū_!xU#d2uP3d lV-X'rcAHeT97NXDJX_Q _Vd '8K]y-Tѣ++T^e.+_S:iS;gIBNHnk}aӕ`bͲx89f,PVM'Z6};@NZ$PS3AY N`n4te^i66ANo:'}s|7ȼ=l\ZD۶jYNG4tw?p3@d7q"vžP 99y@9 f^z%e{ń!bF>w?w./9ه(*0Ni0N4rR?G=&!MyRGp"o%/9Zs]Ϲќ=T"knJ?<\==7tY-e4_7M<2mԌ4' 9)~'/-P7K,)\?4ʻb? .RŜl(9!C<_I)E"7&_YIʛgJ?O&\!뱹BzΞ0ߐ|Sg[+駷jAyEU^%oNMtT|O{o¯~@>'A_JFQeW\TjYͷWm$pJ%Zv/U:^y,s̗yNs9~gYBu9oXᴯAa2'O.乬NhƟKxlzcg(Q;|'6G787μ7jO9xp|ݟҿޏq~?w?NH+/r"o'w=1;\'1>$oAfvʚw,ab 2Rcm2nSD޷{ӶކYW>'׷ڣt+niy_̖ȑ݂[_sfSMg0އ\| \ @{@$hi3#lҀn9)kfkzuvGuf5d5EU.7iń̯)6)𧇛qܧ@^Lv 7N'{jF)*Ō?ovE#ˤPntLXQfErbzY2AYOԣy/TU*] 8=8=r;|ioe/\Uy=ȃҊ&7K7}g`9&q {ଧ5%K3~Jqoܸf+fqZ{ah/$QfynNjz}䆘%oݜkF28Muo\J??R.;yn#͞?q=,?\0s3JH菾T[y<7TƔ ȹ ̣6{0ߚqהN 㹁Ò7.nqG'l( ;^Ry7SѓR5NLkiTS#뻆ڻof0̿fa&7ddއ\5w8]n/H|Ve{$鯏ua迎dȺ*/!{\>iݮ}jZ2jwݠfWS®b6:G 4,bOaձ]Y+=PRHVѻb\9 w 55Fڡi K r@~od%FZV;?Y5L6SsR ku[YԨw}*Vkt~Gdus$z: ωߥP?%IJFdMQ fb,{)z'zEDb݉ ծDS暽[o;SbIDNzO$>KB>èӚ+?qj:4[$>'$>/&(kUi"ڙ'lkNwxVljO@ b?t&Sλa:ե'.?&.֔)UY_$9@YGП۲{5BS{]L- J 'U/KWVgY&)xOjΤzx$U&Q}r'uIDǤ;yOY5'&>Z' Q%M&Mv4E^$'t Wi&qoIڦfW"&}RNmI>Uw*btE|t~~!k/|v? ]U}i }%'ởʐ6w_&owvyGNIy-Q,p+g WOK$=#yDO'=% Lg'I3iO.9, I6 Wok$iN䬤 e7A臵'|&ZҶBkFyI޼VЍ>+D|pjF=F/NjIӐ##鿁AwAI]UI v$asR P:ȕZN&$]z֖,,Ct}/r/E%Y_]I'q|A9Sy 'xx>\tsԸvxqNw|IĹc<PxҔ?%4C\chGɴٛvAϙѠ\Y|sCzR?#qg9zJyKs~],\Bq5_S!+-:^,791NJJ/ֻ!}GB@?u,3S B 5( |1A^*[BI9gƞxhx-5:[`;@e &*^_l@iVWGy#b> _ΐ4;'zn#x];xܯ>{&ܭ=n;`5oNځ^h~Et͗n;.EܲNRD?l"Jk^O& 70g\g|HÇ:-5kQoTz%M+$X_gz- (Wyux}~,{詅e RX6-1|_K/ ?|K ܇>S{!MN6g@̩DM'Bڳj>#=tt~Z cItΈL0]5j}`Mlr7k@ @NfGL_ϑ}{?Qf*`n ю| 4cJωFJTT9}@s5`DvIDq&z=Ktȳ"#O5h?Sg|^O ^zz ɉDN|P3'fe3=|g 5W{͹c^\^[;3k.Q2 gO#:l|s)zr!sJ~lnAmڂD|\AțA"ٓ|/!G{2,n^{^p9r(CtssrL* ?Bh{OQ]wϾkeH]jg׷j_{Ǜ[4  쩋?QSP (7߳0yB]2򅜸p :(*'apY&  _$,+a%q2g\^%n /*MwHJ7jK8UQqY1QӢG^n:KcTg%B!XTO]VbC:#9^zx,ϥ;Dg4EaEWiz{iD(m@yQX=}9P\w_+_- ŚAw>IpT?8g>_ |zmf:W?oBXl܀ܒ#BZK5\o)g/=,>v@9OQSгٷ2˛Ⱥk_ 'Jkvu DS\5*"FKL4[v5$ޅ>yhGʼnf.WÉ7bf?BN\(g93&fȽ7-=]ڱD}w"AH{8$^_ 5\z\N t;}A8՚뀴{wxS]Uk/;rz~'"Ý_Bv'ܠh5.]Ϳ{/Ël'*h|C5N<2KN^ʅ/Џ3Vz褡ca?Ol5tmGĻu?|*K؂6u^FD;է}7 kM='\\AumթW\Ҳ=.xp5Oh>u5џ C8 f$пC 9 {9tiToտ75_Nnlq¼zHpeμUhgxޕ>\#oq$\ż5xo ީDwO/3%zsg$cŷQC6st=FF2 g]OgGhCxѲJ>(9l7E0sП%lDw5Ka~Kƛ'S~/!:'ҸH}nzק˜4zH#(ǢM@7Gr.a:l,ph€Ba'4&/cOt|g> n.lH;3r ?XAi%Կ[%}"Nl{sYE[ncMꝥ>GOOp?L03Z6C_^ iu@OJ?O+/QzYW/A/(}Si`=ZV^@yEW‰N捐sRe $ʊH~Ho q"sj|WH95 p|v8N!0`~cNtny Є[PХͫ ',4,^w '>*/I'vҞ@gNj }% |FRhޛu!D$9QyVGPV̓80φ.vn'9): P^LS8~ 'OI kX`' G=0|H=A@N /'z>) ݵ,Ѝ軓_ONP ٽ8y;' wM'^(qtoN-$_C%cAHmd+9A5||UtJ)sZg\ < $?]{'ȉZL[zzt]Ojj}xϩ32N<.䏋Szf ~@8w/'Z7}My81z}挓fй%h9R@ xh+߽A}҅-><>[A->͠NGׅoh7d<Wuspaf~7IA3Bn㻚!*eo{>4FZM)ߴj~ojI5F;iws%zm_+?{ʻx =(#ytaeNig'uO=ߏ1@\@w(s-?p#?n/t ^  ϙ!' 7&N=?>=:NR1:yjL Th?tDsR~t ͞ќh t-K~E1go1߿&-,z sRiW÷"e6^ hKѷ?+⫘rŠ_bJ_bʈn1vTcj_g1/c択1՘oſ1?N1ꇘGgobQc+>Xc/UxRV}PĶ>Iˉٱce }j(]z?b 96hŞU{co~q՟qQjG\2rog-5QqUڨqDu!߁GW\@3X0K q-)5g_:_Ѹ yGbSjwޟ.[*:ĭU?}۠~z.w_?.'`>X˛an->l b垄u۲ZV^kY-e%Ɩٲ*[VflY-e֖۲j[VnmY-e%ݲ[VvnY-eU+eW`3H>hD%gD=/轸Nn-SߊqTn|{ꗸjܛ7_tC?[+|8U4)#n7rgg _|F:|=|qwxx[^"63^_Iq ׋q֓dO6O9CDW 9YBM܎~wM "iW!:xpR?أآo> S~#]\_Nz;Gg?b"Hf3_{$HDp7XB]Ŝ{1bc#J#51+1Abfc^ɷhzc1]1O/cM[|1!ꇘ2Y^}x]3on^$Q9FTBt]ㄞMW?>swUws/bU|no*ߔ7+xQq|=DW\ ;P OyO{O垅`YJ.~zXq# fxS"##(sx^E-5&uzL_ < _R Vxfr6+Qn~GlIgu ŗY|k9ѩ6y[^x-b߇j/{EUޱ>[h:mY-eͶۖ۲~[p:nY-eM떵ݲ[x:oY-eͷ߲[;`y ,M }wVX ˛1PE{}qtJh [Gȋȟq,j a{ԏyh8>R(I9x"/CDt 98^ȱG(޶ǃAI|׌\7K3k ֦BG|K; ,y`)7^Q8E]c\B?֓ʌUEJo<5!zT+[>DXFr|]NQ0Rg3n[q]vWW:w+78AHF 3Cx\gds Ol}y53΋^By/S?"-yqhCjՖt3{?_A[qNznJoHN 8螌C5/g'݉=g>o{eQZg엜8wPwF[uKg}\!"4f|N2}@y7~Nn}^^@Oy3/88-9qE7l18r֣{ja`Ё G.!W jEԍ)q$?^}$>olpp&ilz9]n]Db^EydO?ݾnzٗx=K^S[=ժ.q 33^ڸgFg4Tip 螃𰤶'*r5xk\乴 Yڞ=bV^s^ҲxKYiŶy+j/@VV >_Eo7~9i/(lMݼ)ڼu/ PCDK+Ry[Na;r9kѐt/Fe7[8vf>I%ov^CVU7nh_vdh68Z{I{AС.3XwvKɂuVޢ{8qBk[7YKm =Ba |Y]N Qy+g\s~Ft͸^VZkib=5^<ې {ZMY<,rz^R{=3]tLRza?XGHD=V-ă0?x#/Ӈ*S9Z\^M>^ 'ŽGg.mO$k=nm_A񩻡]6AL=Un>O"=PhOXD9_yUhD?#>sGS;6.Zw(t +G4&&nJ%g77͓Ixw~I?V;hut6Ox.e՞4˚ty%G󟻴V3Ю{P'7K~/wrgoSCƏ/]5+i 4/[HqҼnC>*y.:x6vݕOC5OGSՠ?s(HEu'S|7L-ˌ˥eےwDR ZrܽKuwȹ'p}=9w~==g 0@9r]CIu EN#ߣ'sIS`^i.iqy8DO<-N9whxE+?Жe-]4g]laSKbHc7;6 `PԕU2P[@ Y5ٻ@'~s;|iTC^x] W*E>+/ѽQnг$ްXo.,~Atw&GzOo>ބoYe秐fտX_`܌S#& _{fIsY?ǞX')[Hcw`&q.;3vތ^X=$ާ.X9:bey k# +q;KO3yXJ_HmʭսeOrҟL9.ΉIu`/?,^XXXBE+&G(jWf/K!Ub0 /(Ry4툃aMJړ# k`4x9"|M=+<֥x`%++o|hǻ :oD+$2Rۑ, ~UӇ*V~> |Dc$c5@//%˟N9c5ͳZx I7b<`l8h 8m doWcYL6DVǩoe^?o;^CDfS'1 צƸ<r6s΃oS䗇5kD^1l_"?: +wg7GSH "Zqpy1xҾj_,Qؓ^yPGcDǀ=^HN^~=" d5D)yhhq@{Ǽ#g*t =:q6CgΤxwAuj}vׁ'߃BY)G=(?1gc Gr58ix8s']go8;.Љ~yg;~hhJtI>~h{Ψ Z6g{4^ )'+IC#gϾ!!lG3+.މAQ] wNϾ;(cf;o5[5oʛQ%,/,-.*UPP\ո@؜v^Q]D #s4ivG%= ~I '' D@t/!{7Db4ގ#zmV_Q=QWFn]^ʉS{Uj_/j%#j/tz QELƇgے;oI~⣨4[W펊dUDD#/=^I6>k#__^Sn3#h9G9K+rʉ|L~ԧ.ϓ'tYfU_os ɫ|?b3rKD"&]/vDGr`}cDP}jWD75"Pr/II O^/|D W@)| MzM? u*(6Ɖe ˋT_uƽثH{pR=_*_WR寐1Uu 8s,|@:Bx#D~T&:7©7L8selzGO{7g#NK>s;^~.¯~1W_ 4U6U":DwcC-CV's3Jur9NV;t&|J5*ce4G*kEGpp81Oa>݀5R3Wo¡&zg޾>j=^B!fJgs^`Ӆ(l{lC[q_SKŸ~m6}_xנ!4OҐ4%Sf]1pޫ-kY>zMd5S~<ȒM=_)'aqx͸z}^#a (Fh6k3/3~|D+ VŬT\Yc,sVJs,e²y>qZ8\FFו?C(w.ϗW?R6;{wzMEQ15ݫh\QWf(}2xPB*SSO,(>G|rřw=f ? T+=/Ÿ-ø,h*p潌ԫ"X% u mL;^:qn+z/RbFAXٌe^w،c&0/%0/,y[z˔z 3{Ҋ %*}Ҭ6 <ܟX; ʫlc>C}kK?2k#n6PH^J3# 21U3ř{?4MŗfҷȭK@Im[Z _#V-? sl*Mmqm^ Tp0 >RTٮ4#ßvRT򵃼fNȿlmwѓSQ1[yo;~Q9ٟpSCC. / ZQ;A|Ǽ8+|:[8|/K@ _ g(|piWә_'|{j_.7[{̹:OѸKzoE˔^$oX^iUy<\ү_!yl ]VQ57Պ0F]żWҟo@NAR{7Wrf9z7I?.~Y\6A5 Hye![wͷ7 dQuKUbL[[kmVd;lrIE߮O,X]Ay{Xs}7[gնo[or €̒lnq6Ĵ-T&#[Hl\h+C؅5KN*-jʮEqx uF^muT>c5~tauڑSsׇ߱Jͷa(srh*ݶɷW?"?RuPm@6=8V $恎q}-,+s2B*ЯM?z(7-\Ti+2F6;S)_A=M܍&JvK߅]} Y ;i%쀖ya?ʬFT׫xO0a[ F%l=|#RC"1lBi-7ƈ~aD_X'WXg#:>4H ePFW a5ɷ* ]9,~{1.5$2( t(UB Eph#|k H BX0. VBoZPrxAIPBR Ci\RCMKB-*?voSV :5в2FpqKXѪ6N%e.C3 Cx:qxk+l.66r#Y_AkkÑ\8j}moYkDhL}NDzV^R|n/ٶ7_{7>}QbwG93ܟ냸a-1a nU oŝ6xvNWy>Km>K8YO^EZ';a:9豄p sßC1a>A|jRϔ~v] }#D_m0V:"UO=r_wn$,+󔣹hXҢ:i܅j &j7'=N/yC"yxFuL6)oc1室oF{Ύy~Y [צE8 i'.+`2j_>.K7ej^ '3&[ ֔[5)::㮻?ǰ||]YX}`/s;tw9 Ma}O}?%D_ȱ?{ۯ6N:SKЧG肞OuyN=]ip4)|:_ަRo4;C,t# J~sy8G+OE ß< 9Dxb!ȥI㔋_+Ew.꿋}x@qeq[C۩ᇌ;ie$ԗ"E~ #=q߀]絠s5V9]~~,? w>MEGǚBaahagx|j%2g߭~f_wDgT?Gt?;tRYI-U?C8䮝0r;Gًc%^ݒg666.A?yΕ#SJ–m>ÛA֕AW'^a P~U-DcJԣb(&R#QH! `@ ""R4 H &Rgy|Y}g}r5߄_a~Ijs8@/ rotf~v=(7j«ڃN㼹Vh{N}II 3x.[#+Gn(+6?[X_ Mcثcx~jVA"^15`j_VcERyҢX1u@Z,VrV`% dyկrcZeuȍUNXE#Xߵ*bUѡ+Vuˢ~@jgVC¬k3DjE\n%lph r_[y?8c=<9zz0'ӠLVk 7p naAzl0ra-rۊZhT^ (5x2?$A{i\^Gn.`qu1rKG|W (ͪDz:êI[UZGPBC$rXҳVy5~ZI/wݢY҇V&(=jo/r/[OOD;N4X!@p_B 9W>Y!B:ʟ%7L ̭CA#h7I#awdg+^&[07W/+*yqb+sss%ӻv7O1αl揢}ES4wi1wh):(nh߷!߭knV;7-=;<-ͩzQt !d~^7n.X%: ieEW`DX\F;Zy{ᗢ)Kof8e^eΏ%]<+ϑ|~FG \0E56l^0]O~)O6ϱg`/M4i>b~$ڊ!<=eAS$%+<5&Nc)wh!`=@}||W4*shXm0"}@ (;#iO#Dc2ˎ2߆c~5>AL֋̃F`?Dxað·D5ߤ |CC!Gy_|K4-M_|r<^:@E2_MLM/ɑf_Ѷ̾G4*E_D;3{iHvnlv]avh>G&qN(܎yT;rh SUKzBv*mf!eFPCM }o]6@5 \tUOb~j\U< lG4[ r/MxQv0si>Ÿ!JS͐ ϛ.n2|OU 3]qS'?/Rq)qFҸ6iB! 4n5Yey+߫q+%Oe},0CYq"nq/hFM3S\izW\mү)WQ+q0 *ȃLPϏcq\QmK0.ɭ6tܡsV}8WK?:7H8O)6[wjo;eN&M%U)ڗrʩpޕ\0]W gɑ?zv9>#|J.< .WY0\w\dq+.?!o\-W]8FcS] %~5.?wu ƐosQJ娤9W EN@hpE_ڧ+sb*;V\Ks)p]m5ګ?xJ!]w7^ jN䷝#*W{}DepK| h|s1e1~\w*.*Qo`A:O!ŎY\(W?o:HR'{#on qY4ƃic v%y "ʳP~ ƾ&]KS ^6R;5._hiW* V>/1` NԸV^9U|q-4Kc3/ϩ?jqw^{]{G7n,6nyd7H_~/^GW}_+Cxm-J ʃ]A+{'~o<ŏS}O ??V;g|-~3~g;H/;~}Kd/{dr_= BH aŗP D+ʓPN7`B-ʑ+=P*,s.O8W*ȾOݝLk\NC~n5%X/{#L)WY]|5JhHh)o͠JB#g7UO  &?H&LN~.!]oC'QỌl4@Ca]'dv£麞?DZ3SSue;Ⱦx3^;E>O;+/P~/C:x,YtYq91j3DS0;P*-xN;h<0xkDz=+قx+<}-_9 fksld6#O^s)Ǧxb^fc 4 <6) E~;D>C>̖GjS/woQ`4NkkY?\gff5%qx~ev9syhW%w݆M&ת[-k􂹑qw=`^n5W]W0a-CO}8zs͟ͅ0)ƟOWОg_ҙW|?aL3G e0>DNe'dOӰ &bǍGnǡjDŽ9wHƓ~=fD1cfDSg(vPdoA>_{yV~諾LaoSȳ' / Qd|x;'{Xswݫ>/=tcaúc?W[<׎yz %gO ;Ls=eN`Ea)܊̺N ]h_l sfTjZFnHx'vV3?JR+7 B'r,;G2;L_~*dވ}xmʏ?ߤr-S}yKv3KȣXM|7%!oEjB~V n]c7Uև '~}En{ /_ceKxzza"_Dx#-6J,jxy>P,3ANN|i~C40qCmg6hXt\?/xoiw28U >gl6ق6{fګjlF۫jzmf۫jm۫jzn۫jn۫9j9꾽o;`{ lM N {a{3l7ޒj \/4–:'4[h1^&xl&;{Nor&&܄ZEMxN]%L&x>ROXR \xʽXD𵬷Iw=^ [v]wf xng PoU<ܹUOaQ⎒uv򸽒s5e9O]pm-7/VvVru?#}N~uwyב<'m\_F~^t\ M f͵Jn#]/ݸ{JאGJGm$,}m^zqWݫ*ޫZOj}jW;ڋ  [z<ғ_НIj"rtS/'>~f>Mݻ(ȁY R(o rG9g R~<ٓ?PzIxʪz4{L>'v߶- oN+K+|򒹹=7Yq=G2@Q?qCOzhamݖ=A;-GvV%=Tn $*V Mj#[$jfm6fXEWKS{5^]W[W{5^WksVoiꮽkګ갽Zzjr경곽mN۫굽j긽Zzn#O{^}Wy{^W~{/ Î7+ ,.WNiGwߞu ځ~,YΥ l ; m.lM{l9-wɜ70O^l)qeاT٤.lʆx7rAC݈㕩9 Z/ŬkǏ˭^/Y{aym]a[{W /h-Wg?yU\fVx`VB.oVZ R~#VD"MvJbNt,FR*IXyw˹7?xc=K=!xK k2Cu K8^'8, s^@YA]GbS}"A<7 ~2ץN<՘(~N0|WYcOcq=ahΌ7`C7xSoid bùVyHbWCЃŖ3k|4^7}PlV#4g:9zkuNε #O\17[O2Ϋ j׸o,}m,F|A^IKWZ1~5j|+pic-N>U ˵u?{x|ی3|xȮ2|)n,wwfawp`cZP]8]3/ӅGdGY8xwvxp&3#3g}z~nZLT({ )ĞG3aF?VO~}э>/ sgv1Ÿ^\Ӳ1Fseø*VЬ9Y9Ó2j^I^¹,<XxQ;G˰J/`p]pV¦(-6~$H<;T)^ k)4 C8Di!UЛ&הУZuݤ|.:EP(k4תf(n' +)eT0l#H\!TO!wrHp!RP|ߐ~{j!T7o\R^ oTayB:E [K^!MTo!9 o[*ĩvp\J>$,@ZoUKN%S;,FU/jdW:^]WgU4 QsUdwy((o I>%O~DPTr"_/%%|VrD!kɻwH.I!7$XV+$J:R|!%V[{y1BF8VUBM/ s;IHڝ>䫶}!5G &yT.LH%Car&OCbi $aKyN?z]%gBJQj:$;6P~!͐t!r "D>+I]GH-AuU~-&9ططތ$^VVnoɹǾǾRC݆۫>KT |ϙnjo%3ݙO_V<ᇱO>/^_@BL?!~p{;.w4]~>OH)׌9*Gge9+?~>V;|9VQ=WS}L^iB^Uf@${uW\IBfc9_5rǸKV >Vx YYĪC`y<56U6H2=Yj'ܞ gh>rY-=m+‹._q:7 McupAJ;f-aoA gĖ0㳲|0ަE"Vkg|AKhWK,{Uv+h+f|*ifvu<5g-3Nؤazp;;X+[{^퓗z;gc<0^w?|Cx #"wlOzgbĢ1.JXŽJ밖n;oܡūs/}yx%g^m `gEuSvN{iFqF擰 bw8=Wx8p/z{]">T2+7WXzfu%5& 7|_:iU4#5S_ VVc*s˄Xwu {[*LyͺRWYg*ePvV.ZeQKY=U]6Wc|Y)ak̍s-tp?Du׳ȱF*Sts0g ՂuU|jN'.#BްL~_BJ`>LڟSg#B_ӗA>8;.,:x-lnc3"K?gIo1傕d7/{l 7{QG VTsXFa$lxvX#0o ?M>O㬵:ԣ fMy*{P*򆚕iiOUU.URXf9@}ӏȯ3@yiLGmiy,l]iW)GifiGQ7p, p{4J US)ϋ*$, {Ymy9gb<v}ƽ{һ]aku[l9Vb7G# \5շq; eK|w,3uNaebf<Ǿɔ^5aW7Pwlލ~} xC6ڦL-Y+7fM}y}Q1c^ a9|ݼ:XAka7mJ8FFg^^7r%} V]̞;\Q?:;Y Iw;O]oXQ7/[/\Vܕvijl8m6;+\>C#5zYd=[a\ߵJ7w~F/;hO62u9=5 3z#҅oi -[xjgf~)ZU6Ai3tސyAÀԗY9W=ȋa6l&#g" Xٞ #-xi#⛃Ys!rt?G_d Ul^PlaSfeUU>-x^z,9J<'l9EΒv:)e&%вDb+%U0ş!rwbBs.Gq aPWb-3"sU$Ĥ ǃ俬Hl~1(1^ 9? eDS8ѯؐYK/U V;h6y#dobKϖ c"^aWmrHAz!H,I#[ jiωl-$~N~.5~&YA=ll&M)=xHf_O/&ޠОIOyTNo~[TV9EnAy.oV^Woګ7I_oeﭝ"#{}j^C"/z-]oA`yacOosBԛvO/ϼJ_z oTCTr̖>U}yG  ޕZn}ܿ^w_z/WYyKzO޼ rOR.y|\ #Gws|K[9)URQM"Iy|Gyo']-sxhg4줜ۤ[z{M S O>ӤS)wwjo37{cl\V6xv/Wx& Sd{g^ЎeO)_88 TB?>rކ^߂~@~'7CJ3qa◒Ob|ا33S8MJ|WO|GI}K[rD/b|/9'z aw8qd|rȡ&W~G81vCb) U?N,ĸ$}y]@<:LXW|KӅ4nya\! .Odb(;'Z廝go<7x.{³;;5ڃk=Oex>=c?&))I؏4{b'$r{}x0Xrߣo ׉gv+}[Om.?^ V{:b^GdT(Yhjw%<_=BLaV4Tv_awCrwA5>}K:z+=oGyxNȋ+@G>LyC|r>#?)y^ z(}K4)rA97WB?j'Nv'F_P%©S$b~FS'Kb00(zD颿 bS2TsOj;}%igWd;=yh.au(eCYPޓOJNntvB/yGGN9/%޿xT<'4 \u'{}EGz;~?N F?ق\֩3X^z[37wFc;E{OPvո.}~~~S @gj ߺ[hnCHF^ WР6K_}:֡.Cv㣽]HR=߀qYӾzP>s/mƋwiO^sOL1Leh'O3ٻ/dבcn=@{=wGG٘ʟ[Su`B?7JcyЇI ߕ=|&6`o}}ܔt?%<Ͱ_/ѷУuXϭ:f]  r֭-ϠnyƓg/O2ӭRXg}7x 㰽>2=@:7(Y82DHM9^a. ~nI9L!8bB k ITs_{a-4wjcp[z{Mq oJ6\ЋqkpЄ֪~5\)+D@SY3T1WO|hVIOp7 _++P/KTh_rȒ/8z9b6,=k.>S2?㰗r8cGσF0p,x7!~{v0<ϧOߡkOd?^WxeÇ9gtYLX9XcF{Ci>35N1:N'!I|o4=y?\ !`]8(9^'lA?sW1 Q3JwsWN3rpQ#@#m~RpEw0ӾR_7yosx hD~~|ØބN7|>N_3hp`iz .(=oei\9=4C^"9ZZh:erRj]\ ͯhf_}eǛ}ѯ}D4674Џoz^/ދЎzBy{^y_^|pSweڄeWNnk]ߝ9t2usƏv3h7m3@ z]+Ej # n rUKK=&үZ@OmaVeGD5Я7WT!DeC: 뒏ZZSmi]ͧshuDs9T& t*nVkk9tUꢽk@ >IN\XK4y&]>1ע}Fu}>y'M%;~iLb4։$\SjO5/RnBUŲП#j='U0j~W*b_UW+s*O*=m%VAoUq2z2V..58&4q:?Y+O+b_Td~@@{*'L+!JJ5)47sCSxh`+zL>9/; +-wnyvax@z ɄEo3\ SvaJƧ.z =a1I4<,Qַ\MUVE4YnQ,P¢UoqhD4+|WU:ľ-gӧfY=`'A# 78 >gԧ׺iRWR7A~=FN }{9"[,=ol}Zjlľm:|th>kvvNg7SA*{g'a.i]v3{ݞ&|a =Em1ѿ Ṡ_ֺ**zUHļm``oBS6l1ڑNa~8qL{K''Fϸ&HWf~u8sO׺9y,9(,̢}kȜ|v<:/gZ4Tx1/~|b j lkf=jp5c } ={v֝ F8m=Nafxnɭ.v]4es'nۛ^g?bo#X'ϼ0zecX.w/Rxdض~CPONsis>Lȼbfz?U{-|y-%?6ơW3@+ڦo^ ].d0}{"pGŒ;DZ{*8lQv<}K?nj--a G]̖]n\"SsB?~U/6ZPf ،`3lh6f@،!a3&lͨ6f`، a36l6f،!cf0Jl8(6#Xa،f0b`،ͨ60nlN#f<+'c3|l C6f #qd3lFPK0lFpO9 (e3lƔ͠U6 ƕad -e3lF_9 0!!f3l2a8h6#fٌ5f3ls6f ;qg3lF^20W}58%w&{C0$v `3nۉg;L-0_!U 5/1v$LtcӾ>]L&L7a yc_h_h_h_h_h_h_h_h_h_h_h_h_h_i_i_i_i_'i_/i_7i_?i_Gu9WY[]_acegikmoqsuwy{}ׁ׃ׇׅ׉׋׍׏בדוחיכםןסףץקש׫׭ׯױ׳f/|:&ljG#WB~'Ɓ[Ärj G kip4.$UM(xq 0$vT9%c ORoԫC? )?d2^ߑ3iBIyBiJ$>?^* UhOf&ȱ^a2ziIh|ZNk mW[ω!#޲O9ڛAy"?uk&ԡթǪl>Ɗ Cz S/X*E|>]XSvP<:Ԋ޸8ŠGP_<ԣVEcf،ac3nr86#ر<6f،d3lD6(af 0l&d3l͈R6cfPٌ*ae3lV#fhap f| 0f3lX F0g6f 5f3` ƛ̀q6Cf :Qg3l]f =ig3l6#fڌAAh3 m86#f(0[ء6f< Hi3$mƤ͠6f\ Li34mƦ6f|0@?0po=B&kI`yLVUU,VlVVֿY٫Y٬Y9gd;)%O*gcJSl%g}AØU\F>W ^rrv  آJfcl'w_Ҽ}ޭxCRO@- ݷ^Oc65ӵYx-ϯ#3CyA^'Bs@>c0ҹ&|Vc=th*$bϦ6vl=c.D.<0L*"*,IdCVWl!|J &[}5;~f lzF*}g+@:l%r{PA6* xxq_ZfS1F^+((8QS,` `Zc,,+'dA*`E؂] R,OOHNQE5RD6qatdnZ46kgt?sor ]9M1_FO*4[ kt8uwa_sؿWqBcwUac1e- Ulz5LzFpRRсџD!}cVZe7&Nn KP7&63{Q[ljk VpPT͟>l]qF7 IYFP y(JAUAALۓUv|8uwgL`LN&?UBo>Nw|-|5 =^F"9Q%JN|x/MȷJ͇qo:ӤېxwTyG~}'٤Nro\wIy='k{|B;(•π+*O & / 9I8 إ|\rZCq|\E{.U 9|42w]kg@SPE{^{@ݩ|{d7Z&S+U\`w+t;wyJ<ǐS~$<=r~{i~d4rG(hWABw[pio{nQF}%`>4U8Ngnȷ[B:=ϳ&ggyS6#<?wuTyhy8Ok7ϛ>)oFGw`s䱒oF.{N@.Ð^wm.Q`zv'CIY>UO*Osg đ)߁y>\ T$wT R bQCɽt_t ^*C-@(_+t ;,V4a/'\r+yg C/0R d0rཟ_/HEIy@}Z ڤ*B^zP- *g  } T<J>.rDJ^vThmɧPcyG+\K%£Br)Ur(_r+/|=H"eۃ*OH~W%ɡ`3"TE+EP{*Z^}1U)TW_$ȷ]ɱXq=/V)SXO)6Zqg *GlÅܡG_+ɝ,C(!{'E[X XNb1sJzSr+vPέvWXV*pWӼg)_O'x/5MY/C/ N^ "–HW<.kxp 5)B N'Hw ~ Ark]p griJ|=JNAyM\S6}g-ϔ~G9;+!B~T$;;|EZcgU G0~ Q| p7pCxv^^{Sx>Y/NyadSNA~KU"^)߁$_~tp;؝cx3NR~j 'p8p)gb-P= >NlVA_P;?+5W*WxP:-<#c3g?^y-Ux?%ɪPgԊIAA= G#h4! I>M;z$H 7GP*x[ I\iHnQ .װm'%|O*8W<{D_0|+\OA<)S@,8tF~xY4~cqZDp]pPic 6Q=|g7_1Rn4k߆1If&wqf/(S׸5񦌁(~1H<u}7`THgl4xzmGG3f9At0f2\ouQ  |O;Z$Xu"99N}紗ڿc| Ɨd'c_DGcJXU^}QV"@<^7#C =׋i0NI`͸:7Ѿ7ja3H[/uw<5 _%+Txc)4s|:Ņoy$rG| . %{XK\Ro#n[3QO;tS/xCتh-}[ 3ƶ)c»Y0v~xiAa>ä{T1k'8 )s.{8M9)yxī4N)|vŏ3bEaz%E kqM_]wu@s /`2I Ǿ `a-., jwf1x)q,I%[ C3fCH}L%5#K )xXGJ? R*>o|E)c?V@9=r bVK8D}S gKafLNP+>ʢQ )>AM&Cw uf?f(B@K8+/)¾ ZB_}r'ĉAS ~|o\O㑞лų60nE=d\z`Rh׹iǹt30=)s{O^ #W*|5Yxe_ %0`\suⷙċ.޸޺jqG_v!U|\"eGQOw¼]/'+fW^=yRq!kN}֧;n[ҧM0nYRsYԓo=rq:ouy4vi?֔E5m܋ ><+qZ>}KFqv}r`\=8z4q8}S0j=8}g*?nn)Qi즞vBlA>#sko>;{4 cv:/3ٴ60f0f+׈w v@;_5;Ɠ?ۜ|EŎӓ{~zTo/ߡz#!Cj7^iIyi%;_<=U}oR?I07CG|Ҏ ?[o |?Yރ<4>PT3&SOטoTbθ%c8dtn.0Fh?6ldHc4ѬSB;sƥ7 Qr_x?~al g~?"8Ùy6>,c,wgoؘ I0M0Rd=y33z|')z}iLjIn i(zc< k {}I}b5KRTSOj_4?M胙lBod|208hwj>h~4c {4XFh."fR:>(=002S\ؿnd;]|k҅G "́;$ h›/KV'lTϟ=O~I³{8Q+PZoXx]hxmbF/4^wur !oC{ʷ-cG^g,]qݙtŠBy~ Ȁ< \Akjz-9d_2ޖB.BU2wvcznc/;AS4N2w6q$[6ŅhΪw]ޫÈMKvpId%Uj9, nҢ.¯%|E0iJIۂA I5MڧФZ>I:}ä#s"ڶ]K'5цcVL()ҎeKjyle~ R=-$l4a]Pl~}tGe=k.tRfgo',i̢[jӤ9{|NrMݭ^TW+i0eW4NMId긇ʙŠIB'hT#!\¼/=>T{hGq.Rxh4^U8xL{6i-zjٻ?0z?w{;twRޝj7ѭ2syoaHPr.G,G/.#ݥe; rI||~zлՎ_W;AoW.#taO70 7=E9NE<'( dawk?1Ԏ}RT@z<)PFRaM˒h,'I0w YI|פD?z-II%Z*OR4֓JSkI'mлm)UKCuP;K)ޔ5I~oƛ.-_gFkƃWU=J=`'_,JzȡKzKu⧞:2^=~yɗ/y[&UD.Tb(wIG%}[K o]=;cW; Hz *蛕/,z*ټ?83U8z'*zf%rه|POoskocp rT^o0^7ae$}"ph)&[|0ֲ(vdd+'POn+SH.}A uj_k'.Q}%~T?OeYji?AH J%>J~8TK؋rH*==tlMl9^Nl>dFgbZlID_&VRaõ|q*xXn>JLSrl Rvg9~G>5wK*mn+ PvqK5A{zKFH$%ފRjnϞG=sVsJsB{z|zzl><<[O<ijJгBݳ$Y\|F~JΞo/G+Ln!p'/V{|,HhI#o龹Wz^>ڏ>OO]OgկoT}y:HxjǞjoNOԟ==Ǟ719<^R/j\ P{ @|r.M:c)k3vC>!vO㤧o#&_ixߔ>􌢼#)m<33=s󂅟/wkSg_!|FW5uu~ɂS"k$>!?vAqh/1NHd;ebGb9ω/3T]$6&;J$v.)n0N&8vhƷigY3]z0q>՚W$eH\u+7XJ\*}qqj?Q{=~A.DZ ΂Ԟ%KWyx;GKћG |^X-6ߙH0eԞ1WV]M&Ve^$oGמS/;i>NJ*:y^@|[¡ ɋ~e^ ;g>4YhO`C1էlj' aG p/S(G ] k(ڄzNq;ǣo-n}sc78uVvJKs%4e+]ʱr-}/ _9F"_s,ah_Fr kᲖ+W(^4%}h+_ߞ{86{}z lM rL9vv?3Cㇹ ށoncn>6q#t4lӾ?}N"[`G^ȋ|@?1>>皏>}yVy.#'FZ0ǡeSь{#6⚀7סxUv; smlejz}zS/'<]]EvB{|_җq/hwf*O3uA>JL+|Si?/k~h"ڜ9P }Dx9>N8XR`5=};"!Ksruc|FϿ0Z1GLsԺ9|>{Ql}Qaõ%cD5 qZ5c0~0'4g'`OFhN9>8}D~&9e療=dEC8=_?ּ֜ɶYZ_2g!tsϙק?sУbc5=f>f>z}>vX\\~kpq*ڇU(8 ֶb[.dEJV+J7U`9#yiԿ2GVZW =¥͡hBeOX!]ȯrsSI|,߫Y-"g"C+C~cGl=(vpw,ru$,bEIkHZ/JFr~vO+#l0V䯤yU?Dޥs%?A;/&}h<*H-Vda 1?.+`I<\>ڛKrCG`;z@ d>58Ӽ2yNmgc'N0O?>Bx(Q쯣̋8/Bsȱ97@޾Ɣ 7K^8qw8P͸o*>߅W4zr} Z݋=|iTkFM?ѐrɷy'oGs 8AwS۸_4|"zx;x YqًRai/Ez848 'u].͖\?\{Tn6Y/.u}\_K/*b5jFcW'{W[>]mp=MMգV}*.MvymvnU/.}r]ڣ+JNyJ^ɮC˲ԟgyQEs9KqyT^hOʇs#W;q~JzŹ$]8/S8&e*^w9D8n]m)o+Yz9+]8+I?9+uL)= Y$UXHrzw&9q\mJʯ^77zɥxxUǝڼGys: 8OYSG3_G;J>H@UߥWgC ku\|)Eq1%G+_S3gm;~V;q엾rS{s<A*VjcX'{1W1[#[M=i7~p5AHN]>±v)؞{O#i|LsLQ:ާ>SoP_Ig nByf_:j{1KEʱ~wu)@Hv*ΒPiVi$_gգ3BvkuI~$YEvףXʗ3Eu('9ޤ Eߌq>Ιss6 ڲ zx=|cpV+[y_yi/sOu[j;;xN~*Wn՗+@rsg\n\ d\TՄ\M.7xծ]I\$.;USrw]Of ۫=octe|A􊫷Aɻā?T5f1뚋0Ok>g/=%HoJ&E׵sH~vc$u 3wNs  }3%?1(4V5iUh 9d5`S7jFMŵhu8$.m6ep舏C}b>28_?4#x ~S?e]b_jwY]!_wVN;9YQ˄GEwh7|?^|?} 'քoPoډoۯ ٢zmMXۺEob6.a&tɷo=-ַFzзC'L +o|ȻFzѷB^H߷~!uGڕ{ۦ@=QHȷA O^[qܷ ^W yϩUV[C|_I+[Ay}_I>?!\${޷00^~[Unb97}-ooN+WFe[&`=|Ҟi 4U2j|u~#oo ~}kS_ob 6j^*o+~"wvޏ}:ȷ_Q1||BK;"zrEwfޤ.v%'Y=]<Լ> #3#/0WF0e*^Oh`ఢP ;ˈnrFK!F,vD\_alx99I^NF4aGr]Wͨ!Z Wkb/pyQ!ߛ*~sZsnV6؞vh)|6K?'/!WK]?rqwbk.j|#;hFngF?G?r+軔bOjq(t`+FH+ !/sh0Y5^<yAWw@#;3WwFn/' Sh)|,?áy2:ɋfaW8FGKc>ݑ ;ЮӯnSO43ڡ'`homg9SF+e%$jma3qUs͜Bєzk!o\h4p#CFvNz['{xK>oASF++lu07vOr֖gn^?G?y7}yѻUY Ԑ*7^>;GTS _dOFKAVҜUzs6ת mXeP73^w`UYV;f ;:sVivduyEc4:'?I֧sVpO\u]緤NNZ;}շ㬢*W:yn[6S;k r6>Zt}ju/VROӅg9#Eҿw[8CqxC#~*qxY W4Zl6;Bk yo]nw}1ćwF3^Fx-g=jyE9%܀|x_w5@)/lT\[7mv/q ,^t %I_9oV{x~F[e+*J_>H,.VVڻ_q9_2X0~$G,G) ǧ kFU®+JzZ֖&Չ+W%SRYϕ~pjC~re+×bӯ O>8qoƉyYrqf]9 y\y@xf\Jt.\s:U0 ;'{co4^1xGJaxcPr=:쮤 oygPqvەoWsmg3TONV\m鬂ʙ*tKgC5yAA[(=帏KW(CX,ڇg^l_a/wXkaA}G+,R C!}'>.S K1u`N6.C^C}up1&`G>"ϱ,7?#HgzeP*{bx91r= u$ӎp@>a=!=sG{Xm(g&85lgi)穗wJ5O"6ge8὎ ؊Ղt!j g3Om~MXi?U7vSN+Ũ [Pz;5ExA=vEvKA+v{.33Pc7k~^]+}Z5 KSTw|cޟx)Ɨeإ˱~PplfM|?2psg{m6帧3/bS0N/üɺf-xμ" yey@CSOB41yEuru {<ڋϥz4&wXF}y{+v[UN [7 5kkկK[W>SVV~?^"Ş›cj/ H:-w0'W2.j|K?YĪΉf:%Y{VXVyç>]g퓗+KkG3v퍳m҃yJZu.]dm6 OnLFYø۵礿$a^=y7 v㻛O>ww#|(EW|҉ #w{VfʻIXDz՟Ų{P5bZoZG9oO|`#w'>eXX e}u d#ZKoZ ?Pg +Y=$ kq!>hS׭"&7z{:z otpmubY(ְ·4Xoj|߇8T#@xC'C?i {kz=cv iEocZb-Xch FLD^.S]gt޻ `^z/`MxzC.i`9OכO±),`1'+-(V%? 4| WgkhCnc$|:txf4}4g;Ԟkm'H}7FI}}j*<@oM;šXL4$QcM|Úw3rdZQG{ic:Ś%6*+=ݤs>e>W89.YfggW >gs4U} 3ִN&?_#U@o>߿Ij[\kõ5k 2Ev3BV "wO;w3g<߉f}_e[Q`^Puz;ar݄ݷU66vȞvo{=C? (`PE{P*El)Qϱz!LVss6u~~Z#Ǽ^Ktu ˮGGb=KR.BOVT8FߡM~ؐ Ix#tjOfܡ<:ڟ8B o{y/=ˤwei/^ b+^Wp. Wռ_yS <*+Ol5CUSq-^>qߒvъJv vO^wYg4?=a[@'kwsYI㗿{$\ w4yݴNuJ?KO PvѠv(7/zn #]5??/RWJ/Ҳs/ָ;#>G 'hSsXI>ֺߥy?~?!a~y0zS^ #xwӿ\ɗ֑11)T9"(+bM/8Y8kG~s áyF~aBϜW5 $qpT!@:ߊ Ѐ({qұ.2{?B`:P={g!8]sm"w ܂uE—*󜅱L@fJq[3YxB 475Y,f?p6& wHfsOΓ!dǁ0,]>e; L \.peMR@o]ǦgZe+7l]娂P=AdC3(q-J T E?ۀ qMPIs÷܎sk* p+sc+=r mM5Hϥ~ ]_&3Q܄08H/~m»nࠖ ̃/G1p &uv?s3/԰')^ѹCJ55G-߻v?x G+Rڏfp|'\mp6 #Y*\c% n)|.Ʊ<\|LO.>tApҰ_`dm9:{+S4C9ؓxj`h'.lWGESǘF~9"Rt(A9#'d#9*?|QNjvWSr] w{a8MӱF8glP~c]p pgNB9΄ O1-9Ŏc38a׉/K7`] CJC)X?=.ؚȥl؊pR:4pc!_.LIh17cnI>1<1Wj]"}eŜS9cN>bN(1;#mF9Zo5pVb]2b>ΈN'8aoΘ1@ً2c5HTL}L q#b*r'?DRHb1pςWb @ ~}W1}P򉾣8}I WYsAKOѿn/GMCʘ[(}T&F\LnAȃr?@p#W像Ռ􏓿@Hߖ^v.}|Oh8`xL*}c+S$}q*߅{fQGz/_kN]I<ȅ5&_ya@briM9EqtLʃm9F~\pd G<[N>JS&Z$iw^M bh\rNKZ}SFƇ[='fWbZZ!|Ev^̋ߘY—8C{&Sdw̆;>Nղ `!ĬDr\lJn{~9' 1gOc~ENwb{O.[{bKucofleS[Kv`dI/6^m.Ƕ>iveoDl~ұ4ž2;={DMÞv~#cgh- a +cW.f~cwÝ7x'??b S)Sv}yYA>]yr܆Mta ae\@ALCY`ń>N# }7GC5gu.Kn՞ &֒yGdS,=6MZFv7Ut?؏K;2yn@KPI9G(cq6 %o3Y4;Ʋ0t&53@S2Z-a&{[ۂBJp0!{ls "GՏhg5Os#3,x︎nҞns./̧qYP9 å.0ک؝33O} }sg'L~쓓@0Ms32'_gΒ/DvP|"X4YXlQ ݑ&ދDpf^ӑvV{w>x[w#ir?=`zC䉞yUnM9.qZrtci( {TN.vɼWK*q5ol$rݘ+]/mWW |p_0|'>qnU:U0wAX' knͷ&k&.LrZ_?$!0W ^p;>{1J!uǸi[_SI(=▚rs=7 T̹W<#X_/{ Ό~fnD}|Tqn]n-GMjsk›wq;Aʹ,۠\.%2:(Β{/$=hnY"m~Ŀ]ss;(}a)A܃go StxiC~?O;,pמ'hWH9,;<^[+oTr,'z`׋r ;ɏp?={j;>ݥx7Gn?V"Ovw650/WG1E8kifn2}Np6OGN|}qǐ?'G鷧ı3ON΢q ++?k̛8o/i!y!?{w=({*~bԺ(=o6R jz<'cťOV8@Vh2Ͽ?.م嬨pJR {8f0VX).,tQ.x8W+v+au6leJX+{*G p^j@-^ZnsPZpk_JoЄ@F[#M@o&j57jl{ah yH'2[ ?nя3hhJ!C?-UW-թ{GRw%M=uOy+Gxާ}8:_v9HZUSU7~U]HbU֪^jҪH*AVaK;|G2#"VdgFTsmVB8VWd^` p^$#JG{-wMaNXf(if%{=)KA?}aGZ+wyp%{r&ѼLy4ϲGNPʒw E~_v,M|'x=ޞ z{.͞ k WbUeOUUTU?"L;xXWjNjTZ;yGϠ?g&;{"zSeդ`w5YC'[5Gaz^GvUiF&)ߍ.{0ա_jA:>#~s\)?ّVeHu=zԯoBZmrujխFpUK[TYVE(b婧r=,UV=Vtcx7S咽ohgN%j+3 b+V_IǾ CGk?dZE狠 ey!D B 2j/{^ȃ@V>K^VC|2oJNum6_Y̏h=߼|! {:Kza曗eOYǹyΓY9'yԺyZ{"S̳O1:q<~`e]d<[rG{ʷ C>ݾhDdUkxRe1^.͔JReڪR /#Cx2Kx\+N{єNRץJ8)_ߗ.|Q#O`~oTVnJU|;b*K+_̶XG(=SW#'$VJI& 􋲄Jw ¡ZIUěěF?J`ٚ!^V^l!o\OPP_~S|,tҗ.K-SZr)MV\ԕf(c)e2>LcydlqL-U)ӊǀ"V5SL }:ZLo7P32kk6^/cRүV&Axc]0t/E/\>|w(?34Ҕ^g?F;NRJ"Q7H.钥^XSK%9? gѾKK_dO˓_k~|!}N/i֥N~ژ:5f[(W;K9sD\B?sI/AM|nl5Jqtф _/cGkkBZK򫝖 PAzJ嗧![]?(:UQ[U?QN.|6A3j#lQ;gKvg&QjQjy4VQԮ^f;EՊG[g[rz&XFz+1ʒe0]aTl)̒#/JE!A/N#MD 5E@>џ|6<"jϚ/Uo2"-~7]xU1P~S!~D7|\PsGgR; K\p>Q(7U.OT|DoP^&^9< %Z vvD &uka*6V-l{Kr{k {CXi˰2|WF8,J +6̕؛R$ ~zA$\Kn+vm~j$V'\CzBWNC3(4;(_/tF.Z-\<>I']gHagB_nw[ ϐ_KN?B^3)lO._5'==! ݅^O;-75[,^z5EsX?{^|' '>9*wR1y]}~}_QykE ų7 7f%#~gwoƓ7U诏 ߄.9/@_SK>KN7S]~L $ߐ@""҉V>"J1rjCrh)|1 '0.Oaz+jøy0q7XxN2ΟVd=~Y߳c4h#}o7]T[n"S5EF&&)Ʃ5gEz$r>;z^]|(DVD,عԎwQ-KJQ(cgsf{4ṤK/ؽG *tNQ-ɣH 04R_)/*0ZTeRUQy+URo@։ :Ҝ20&lc(ϲ9a-ˣl|&c{Ti&~;E8\cnfPrsH?77:|CY sl<5@Wk0^є<&w}tzMosssz'+=(+==2dk~ LWxy< .h 泬vҩ~3Й5;D fѩ|f+yn֥ o{-44T1IacOI# i> E>d>]FX-YKfj#*+UXbV@fy1rAfE=0(M'叅1K;fj4 'YaR /]@(vhQ;OI<=F܍/ e 3D,<^0bژO~Q1P̢@ZEĠ0tH9 ߲xe;˸;L?2Ayb? Sk aӸi܇Q7hxN ai^f~<0^pp~χ||] Q/ϻVU>3MP]p.rb|-A=oNZ h:xK#Y~gۂq&ÁMSQWg= Cfw?ϹA Fa~jЏL~o"#|/Gja'C^{#F עբ}Ԣj~ SU⭎A}>@u(\?Ø[k:asmџٱPqh& *Pv>E?p om:艺AĞ[}10ӛk6ނq`az-ogs ),z9gg짮n0a/H=abGbNŬ3ˎ~KO;J%ݗ`P,fPMU¯`/J/ӿ f7[s}Xp\>fH| wّ.;Uc\x쁱3c~\F"qcc2,c7,O>hQ LBOBLf~2Ii<&:ìpU@[>o{GM9e^.KV svxxxvЌG3aCc0w q4;Sia<u sdGcGx2e8vꍅ5{v,]A.R/ػi0&1Oc|2fz>=k^?z4ZqC==DB@Ӎ,&DDDE@$% $#,I$g ?w}z֬ڧ١vڵԙ\y1\27Tf(qx:tλS9O!m*zԥ Lxo:{w;Ht3934u8}=F g:wq?b"#f1rq*yx>H}܃'t=?r.$~%Ȏrdz3j{yߺ yjwMʼq'Z;ɤ,ȳ}TY3]u.'K bf]ԗ{J.+3 Lo ɋ,=ϛ:K)4PhAg{q;A'tp6x?et6aܵ+ *l dpzw>d@Еӻ 6&‡1бv'g fWř0UuxM+Z߉$7i5l+ɕ}_1'ne;vĵwwR~_O\#Wq> LX>CYg{/%fJ8Hr/Wa_y_'}/%si=',}gŏsMVbMb(=Z`Eqb.)Znw)1'~H:}1_ǟWǯwOiQ1!Hkq>أuإuخyvl_'%*cryp/yI2ϋ~sY7OM|!뎌~n۪8VrN1m@1Ᾱk7l5[1k5;ߑż-8^bwI*At|-cKq?[ !޲>8N>֍։3wI| _&~H'V%֔&yz>+yzN%}= th)50]-94jЍ2<6'Wk\q5x167W[Y|"=UNA?y}՟~ Hp=$\3 Y|Ak#,k[ȼlq~IkNпS3RO4yퟮA]Wjp-;E\/ȕ 8b? >w w77h\k_bw|Ϸ]ٴ35uFi4fyn< ׾z=K5ŎF}ݤ^f=؏P(7@nx z$uuy;`{kM?9 aό 盭3B^Hy"o?d򬌹 )v"g0<yG޴d{7o"(Xh"@&C'y9-K0.eTVd ߽godP+!y> _O䍍|}?7&2GQ9E' ]d} e)+1JP{d Py#υwG>%>MV-F>?;Y졝AKr#.xqПO5~'̧Et[߳-:?^5}aM`~gOy128Zs}ዹ!|ςNg·%Z"/gdA-ːˡ sybVh%a*y^ְN VgQ#۴zRy#Ӵ>A_$OW7"s[tlUVy#ۤEOWyO|8v>]Ѯ6>Oy:`+V a= G~3ߐ,[Pk#ΐ7ۑߛ%ED.!MWʼ 9W|;ڡ?' [y {=%vq酵h^k>^;ZW;NrvkVsvPjmQŷ]b·x+׮y]IQ+j?ȞR;h5EڵkIj *ڭvXTA[UnڍuάLG\zG@遵[>Wڭ6u m#;CGmVQ mjjֵ6Vvֶ6Vvַ6Vvok߾q-rmr;.Wݝooo{{o[[[[[[[[w%;ߚ7ߞ7ߢ7ߦ7ߪ7߮-{Owu_4eo^_:Pm{ ε ?.,yUx!~\]p/x~kt_aE/.)cy~b_9*v~j[Pr/:m_rQE10jQ|ww1Uag/,xw_--EqEnݔ]'򧢒"W)\A<w/ʎ;tZW G'w%EKcUx s9? syu~c?},+zѯWcYų==g91쫑ЧNqUCw o  EEFN_}R< ݎWzQ9Gȣ|ЯʍW. zʺr<>޻',EޝbEY6CoCۦ}&e[f9"_}J^ȗ;sz:"kWr^Y3^%#֠W&*򡮀+ &| \"*D[Ն2_IcWGtj9mAy.sc1yzEfA,fuy"*] ~B~ۏρaG@#=̒42y2t}OMd:|;q0rϙYg#'GFlȂ**9 brB|zs蛜Ӈw([/3w@MRĮ2:x=hƹ}?vT>t7=;5] \[umF䴼 @q3ӝ%5޺/_e6`]{0\_JqmQnMWw8XN:g gpP;/CB-2J-:؎~`#EQ[]13L ӥGa›Lb$$Li:pEͭ} ]л(H31(} >p!0HF"L]l, 3Ip?C{/—3%n!}%᧻՟lOCkܘ3qztЊQYGq|s ![I6BtZc+eJu.ݔerULPr: yVs)8YZ)y$lBQi;R:[GcZΏ M9$ BcWg sޕB$gyBm?iw >kҜ tt~BL7IsazI*ŵW+6oj68 Q$|鿖ߝBلu1);O廅^I,ׄJ)7isG ;$yi3W x_qrC;}Z;~_q_S׌ vG' !Wט/VPRK*.{^h^]ɮDB*p|T%:;iuB2pVr-v: v5dg}Bjs yK.t>z+y\97q!5В)l?d^DJ\׬SBAVprB>2_ z.9?%c.O\9/[z~ nUۏpS s?y;!LWM]0^Vs;%$q'k\%рЌFg;j~ݝ5~wnKte5DuD4u7^\aw`].z$}/":N!/ZPS#IW!$էғl]jn 7)=#)zb> sIoO\'3 j}Oy˽Ctvo_*ȽV5Oo˾:K9EtpOf$ }=N{ ޴9Ptqw>O(s,3'%ݏ1fqɺ[oCw<@i+n%t?cb,_L zEaBB 庎~%߮$\7OŲBcFٵ r8}sc֕k1!s}k&M~>y΄CDW{oד>FXkt8U%"g:SNmtH=KKκÂT~ù%֯4.Ϛ?g6jyp;@LܡF҃B-)%zTuqBd=tN uk(Dh+t(c(Sg/&Wj /4\Eh,PQru&BhhB, M'BD!q鹡Cgbhnh"Mh߬+T)s| $/BdjQ(Hg顡_u.x.ny̅.Z ]f~rSu C77o((̣ztm((D/V=׭ZuVaNqЯ\VC++DjJ;MZo=s\xVs\._լ*4j߃A<ƹ'ZjV#P.N\hV5JYU2_vB^=*X'q}wXUj*J[ Qҳ,/yKY>';y<*>y,d4%xPsMw3` i~BTTw+YZ+ $+$J>m|~f*2@=*ʭDVK\ҟB7DŽnh]jdaZ([!c 9AC =<ڣs`h7RB[t. mڠЀЗw+Z!/t -C\;ZsvhBBJ>PH_hBBOwi܅C&1 Oo*<4Nwh4[H$"[h{ Z> W'DžO Jqǚ <jՒr3%. 55RBPÙk=B-|PtߐU?B3Cr. J ;WE0C^E iso:χ*oV>}i{Lqlu蓸DOtCw c>Ή*:|ϷZsIS0ʱbg8w*Ƹ̇uT~x@PU}i~*t"+ om?I!}|rrՐx?UUGsgP~9ڬY.d~&3t^ 5@7ߚ+9ʓ뿚wָFGkkFc~~ΪD9.?Ȼ.Yвô*]lY/ʶzKel[qGY>gRFǥUmu4%۝e[&{p+JOZuef jՕ"iVUYcjLIiebVO(G~E>KӖ&4 Jϑ5,[-)+aVڍJ7TJׯ(lqnDM՟j-4@i¥ڕⳕ6ɚTjh*ORTYJ=&iT&y(E}t-y?%s8NR J-lr/)t_%P%=W7ѥ!g-JlJ,@ aNWwEK)Dѡ:xbDSѱD=ODug ,KY|f9Z/?RP_~CQ"=ڵKU}%e5)IZG%R$KԺ.~H.xqN9wg< gMQExaѱxna3u}ek/gQUoz_NEMV5\D Pڈ.Qe JK/m&%_NяW~&oR2%j%E8j_FQo6E~ѧxr)T_.^E}rD s> >.~X+uŋ%J>%* ×=X?} R:b7V_8ϒQǒ\I[҃<⏒%dG5>KC-\Pq{LPdv¶H|N)"׻soÒ_|vyɅD%W.% bɭZ%oh+9P^W/ENRN_Cq>s]+Z~o`?y)5Y-5W/ w_$*K]X JcLu=Wi>Z:Y:^Q4z@W%JCDDA~~[^z 4J/Jm&}l;HiUXDeD2;jeZ_eZjyD.2կ2OGwϾ٥-zOg˾ ~.;I햝,zUv.eejcZeOpi`tQ=ZZ]REXjj7׸֢kt;^ #zX4#zw{QqDϠѫ~ik= >B;G_M!G7k1D|vʢch>ON3zXB{[2~~t蟹AE״^c ݘ"Z/1տ+1\^ԏ{^L>oLK/ZKYN1?Ur8ƕ-yOGG9Ί9}Nyy8FiGܿ|NE}0çs-oѯWwOI^G?I}OҟGkUm},хg_LY&rvZep^]X~frn%ywݑ9GK` YA|>,,lǠ++c? /)1AYgs R"AE7k8@9[ִIY'nӋş 8~(p0?ț8"l2pd2>Y|)p^ㆬ^܊w.>|"vп>y~V֊>IhEQ+PLX~_skҹ$8N3Y[̒9)bɹ꠬U#/AYU9_3L2$ .PTx#v96ϱ^IQx~3_XO[e' ( ?&fm픃3>㜑(ׄ.(;S}A6dөoU#xM}#sqӠtsIlߋ@'z7I\ EC\O+k헣># h 2JR_ (E[dEQHVF8?+6#Wfoi_W_|;O"%yKg_e;>zL0-<%9&g8K?R)ؓqlox_+Z)_Jp]hw_n o͌w_SQzSD2E j_ @Y%ZoYh_~~>Y7gƜ4u3FjG/ _uݑK#?>* ; (`W测/v?K^l%|hh# W[Hh}n s_qf`MIBkE%8 V/8c8Whgr&(S}f M7{O;;w:'(bGO8x `1dbx륃f Nh݆6VZCZ@iY =/bQ H}o`=  0311l"HɐAo-̢ܛߵ?.6@fr`y'J8Qop|klpi Nq,,Йq%Hl]?-T ýTw:3eG寿4XfIF6S,Xأqb,˰\.2\Et_)),00bN1ڞbwLXԡZߨ7)i3Mk ɢ1k>bPYrb֋1D풺1}2A9.sD ?s2lC=o yb~_%cG<\=b?%cDJz.6Eضy =Mb%c'jbWc` D̈́d=qXQxF|{Y㈽9#Q}q񚿸^\Ped k|\ w\[+)?G@+H{'qv q+ŭZ5*?>/ :œ7>J'+I|:cwė%u˸i{789_6ϸ#o|ŭey/nz[ZAP{d桟ƚϸzG܃W+1/q"1&sfyԿP,3~+x:|R/HYŸ_߯lu/>s<썿W_(3%LE0_sBw^H/} wUƧO7(M}R/vKr0C8߳硗||VHoXG} ~/qqkig%~274vSJ?>w/ט~7դr& UgAb!@<[qgeߚгF;d^!-wcK;54q%b=ξE]>Dz}Kt}5!Wl53 ze z>&'?}ɢO%[^|y cWاg>kV=m:HmO>!Gů4 NND<ϲk|ժײKE\ُT_1Hsw/0y`o0;a>L 1q"&nđ܉+_&ġbTL܊c1q-w~7q/&Ř87chL\1q7&ɵ f!cxL\1q?&8!7dL\32qG&%8%dL\s2qO&E8)7eL\"a݉2qZ&nq;q^jN؝,9_82WfLܙC3qi&N-ZfL{3qpř8;qs&ՙ8;wwC#+3;C'R~U#aVO_r!g%g7z/5 2fN\3 H<@)%[[3ㅮл0s|(xȕX}. ^H8k:'7Nc:a0!}o|vJwtLy~l+Ҕڂd+wGډc7Tr=[hqwe_`m\\*\)\#> [GFEp9[Fu@X-+ W ߵ4[+٠Dp1~ŔB%G}3Aψ3foLe+PL}I戏s>~OzNggްS`i`~&2 a3c?<0O :y_k ,־Xur6n!>}p`/0}5w8ΰww zNH  f~M|7&~'߼`0 'a&L0q&a a6L0q&ā'bFL+1q&&ġbVLk1q.&;q2јgcn7q:&nc~L 2qB&n"gdLK2qJ&n1&dL2qR&nQ*geL2qZ&nq.eL 3qb&nđ݉+CO7qg&N\3qk&Mлaa0 va0LX 0 &7p`!Lx 0&„Wp ~a1Lx 0&ÄwpaALx 1#&q3̂ 0a&LÄ/p`L  0&„Wp ~a1Lx 0&ÄwpaALx 1#&D dU8fL` 43g&@;k"6fL 3r&pҙ:fL h3n&q3pq0f&4fL l3n&N  nL 3u&@6fLvu-灿Gٜ=Ռ8']WMby:mG՗xvҳ!,47~g$8&M{2%v'"q]vĮv'eWI|,LiPћ+<}SrUuX;`TC@gեrQW_=Ux6&!~ > .FTݥepNwa(/C;U+hݡf?ݍ`~ Jt7s7za{(gR/Hp?LHf7utp[ !@c$NݼP.x>ן:Jp]Pur:(vaõKԵC|FmE+KzLLD] '_Eo[k-zzv!NzLr!îZ: M&KruqY^@s'? Wy_bw%\y=:/9ol {C-/;;~Z9FH8?@pV)sL-4>ھrg–h3ys+_m1TW'^]Lܬ~$W5i]&f_?0qv_CKGb{]ѠƗ#9i.Jl"=8hkk~UJL-,yH:XB|X\XXqSq\'}ܱUttlA&:8vtWߩ~::~E|lo}!JLn'LOLgC\\jRkՑHlD}%w[^GIg_fzN/u2o^%Y5ĕs اsR2%_9b6)<(m^,u^D=-;RlNju[G|8V!|^_=/_9'k9<=dp4_/7C(r։k꿫Kq7Wb3'U_tv`yD֭IKZkه=\35O:ָarCʵ~:up]* } zF ;qP/wXPr"g] IT y+ @ pQ@h,IcQ~¢g $U P3PC.i>Gx.}r`ףɌ/eI> @@ 8 cθk؃? hA0uA8w\̈́NفS@R{Д韛9x 5aiS2PӽrAW@.9yp_1x 7B{A\U@>SP@Fa/cna,_KNԗ>tz y]yI.Iyơ(ǁ-ʞLa1dqQt=qQ-iG.qQ~\$ҳ +ү8`}Ts Hn2pla>`×-x ܨK{Me`ßO@hDN=w! Ns$Ps$2zAj zDF=pD"+ |ݝ+a#ЛGa*c$Q#?q@}I}Bn_eoG!‘}G0rohyl&:*X] }ӑj g(@Cc~WBh[cs% CtnlѺVۭ> ҏ#A(0FxZG {2{ϳaGr@= |_c]]o"% 8/9n쓧pg\X_w>AnKA#͌n&Ԫ>?lB}WY=IV^HݾLW'k۾t}`w|GŹc]9ix:hgw v05}nw W?gauǜK3F0-KXQ;_%[ ^T*8Iߙ_ ]o'4pv~ IrcN$DN' q,gL២3ZhK/Ӌ{E²%)ϗң Dr]9W,i/"z7}[KsLoIx4^>N_e|1YK_D?׉7~Ecv$oj=TI"WHָ*^ji`KP[$]W#*tŦBBoAnrWҸ*+ <}DԺK/NgæwJr$at[X&$E%n^Nӯr$(%,N=%X%Nߑ/2+W/;?&ߩߌ+KKBWĂSD_LCкӼ#?GIA? ?X]O'FwYN]?8[6o ּ#5gNJ_ϔgs^}-$u(auf<_L|⿗ If >W%CiWj?@E4liBG@q2ʴSI>(1\9+ͼׂ(amlS,=vе=|ׁdsЭ|#~jَO5h.{+iW]MA_Y>|oGYS+SI_~U>K+1C*O>/R~+>1٪ܧ.ow]G7Rw/ӼÃqOS(N~9K{蘭,Poٴ7ޥӵC?a|Y };n.jmzmf[?}|;/(\?(52sp&YÛu_xkܨj o'&~+_qɿԆuߺµ7«K~^pe5eK5e /?uE?&^^-.&\,)\$KBxQ ks^My1?*/Hr. Yܿ#_ާ{/9^| )[_S>(KHxWdV1t}[OPB*oO_+?;) ޥ}$ܶge=e v}=|z_F<<8&/x:eQ 7Ay@k)ïkp Wf~a:?:@Dzć?:fЏ|;'Nd}Or=aLc~Mp*Wt w?$/~yv~o‡FwaFo YOЇ}߫i W)\pyP~"?Ґ{ I.ʂ.ZK}{YodA ڗyx. a4a:NE9\TF+,% %{qR؆KK |q|c t=~ 2a$:_î;^'Ū,h8JG2D<TNc!<݄>-39e<@d ?җ +ʓ\>sUWp5sa<\ C~.j1'6rLf?_7D59)LLq7EohVpS-ط[Pyo0هz,J҄F>+|3f?{Lzw9GYD؅DYp;OY,3GÇ]aW aw¯ W7{}*/pzڈFP9S*#[u@یo@^~g]L-M澗6?]u1b2zTxx}2Ax?9'82 ^(3ch˨·Rd :_ȕӠS7=&'` rk M} [ucxZs/@~ﳐa/ f\c.4:,8>ef/,} ۀ +Sf}|&OxseȿDŽ\ױ's]Ex39Jm̭~.˚;C~o;K߾|k.ǪD&')X-qoXWn0VC_Y 3_b HtRpm7_E}Kr+E-[^nonDw1Y|$_%?yͻw ϙX7}xH/7,^X(HF Cq_W)er'/ʟu?Xջ ?ʠ_6r/lxxwx xwxx#wx+x3wx;xCw􎷔ooooooCwƻ||xx7*su 4n~V 7%Z H3MٯIL^[5=B9TANP&Qw錷 aEUtkiD M"H}::jiuYqI7{b;VLú>RwpNal>P~S=XV{Pt_שXr~s5:W|Oqvo+AYW*ZZKlv􊼑vwe54hw~~tNIY.g'~(+ݑ:Vz'o?y?eK73ߝW_:d {dա$tnʸ{zmz?|b3/kZ!{w]_UtD>2on} #e'nØal'uJޘY*gjeŲYE)k߶'r]w`HP=u&o=]VjU~qU8,Y- ?dk\asd-?YDYVr{7Wi?_vV).^ğRYm势W!7V^sHK0[}\V(x;ON\mAQd}lDck`_վ(/}U/h_o= cMYyOk _kPD"x?j_ J~޹Z'2U.7(}3S XcM\ &4ފ;ދ*n;;b%{b)ƻb-b1;c5{c9ƻc=cA;dE{tǛwxxwxxwxxÌwxˌxӌwxx2>{qk}[ ϲ6v~h7N]LHS::)3S鏬)CG_]R")<)u:JyLNiK{ԞIN)tQovBs-ꔒ2I2E֔|Y'R贛2z.K2p͌oN)ηN)SgN0?O._{}׷㨇~ݟNq}T~. ErU֫Kj75#kjՓZL|Z\1N}u Bjy'5NXje.RK^ZjR .u-5yj\31שj%l/-=ii/]ᛗځ:ݥv8u wg*^itԙ7GRɋURza$GSgEq ^^־uJ'JHr(CAp|1ڇ~,9ځ~U%- a یzBzз~"4r+k_K[Zk EXVcۣ<ט4WN>zY: %q8|.,\XVTK-=5M]O<-}(QqlÒc)߲GO9>}09%<߳|zo/Wi$oSv}Rޗoz 7j=|"HIIkoE>qƾ{}'m9#zFfnNa0 |R=π܏⻔oN7q2\MILRRqT's0qL=IA3T)i)It{mg7/}qFC+N=/S@C1[zr{%S򈏒kK%_Iw\r@o1SqO'Q䋜[.>4?'_}灢g9e%\nekˀY)ꏕT呕u|QzpIXQVP"+)κ_bVe*WWªRX]1SVPV2+(덕CknVMeB+AYPC~g\BKɲ+V퇅u:kuӪZV@V[L1}V 2z8JF|k="h?@և~?~)|r=שÔMxzXm=(gʏ=sOQ_ʿ돻39GяxWz*Okm,/> {/Hc&>י6һVUVcO=Ɓrw_CYBa]SgeYˬ)?6>փj{DR̢UkVлVZձU5H?*"vVEZA+%޽Jk5g(J*T8SCewX1@YͭhŘZ UZV{ \)1o:/[ܺGU,`¬b%u(|[e^ 7<ݛ(,?#UT}]%Cm(f'13Or]YB?|wA11>/*KYhڇC[ig+jpCm _ȺZ!}%y chCk MS@hOzwCH&яwDŽR\j&7u>w8B#F=^wyB:Zzs-헡auL{3=J "/oe {B˛znsjjwBOrߓ} ;`?g`W63[Bf..Y5Ao '\/ʴaţw%Rˡ˱XBԹ.rWwu͛Y+LϏ͝U5+NRSv|l_q5_O|9mӾEb'溽Vc`WR6Ҏ| v HRWrPVU_5i5>S!mWcKU*>a9„Π}8Y}e U.(k>Ul]W~tѮ+[y/iw^}sE?~I^b~i>{yIxLݦyJ(kw]^8Woxߣj޽x'j^x3%o!5K9+Ҏh.yI_ 4?NڭOk>#A o{>6zxz᭧yeM5{AUʻ KKNė*_/7^Iy ::p=֡Mƽ/0e޼E޽d\cy's3K)d F&x=3AiNY߸|?{RAKOxv:$mѳQYBV&JQo碿g^G!wox&HL.uUےGWPu2}מW5/nZ7篃Ҏ=2gG'JVDCj{K"7|Ԭ("_ڰTYezO-LsƗ6FJyHioI^MM_yܯ6!ho$zU] {ڋҲ^i&!9锚֑~?liM?54րk*k~I懏Z=|<$/lZoimhoWu>֥fЯwpӴϨR;m,팭Ǽ0NmFH^ YK}?:@v hzh}՗KK|ʭ6G+-ׇwiuei렖߱Rc~'3$bp]r]SpZ迉y!9m ?OZv-紏sГuvkYgqݠg=db@.' p=p%L.>/G~\;DO!ŵ=͞XSVijS [z>|NuاHiӭ1CLa laGIyޙ}9#7<]$99EG]Ky=rpUxN^S﯌üO\Ws'_1GS-ϥv|87֐~_M}3~^]r7 @3}#478gdf <@7=l ݇QϛttN8OB?af^5|'~Zx */3ݶ_{nka دwyGh*;oM=7K v_Y9>CG~dW{<#K>O/YW[ {+hwWԆnv,p~nԉ2vS+?|x{3m֋ϋ4sLg{+(Ww_ ٍw:}w _. go_Ov煯)']UU:ɊmwR֍g;\Ng֓ݞw'n(e.r_]uc(/|m\w}~>{\zx"e1ygG/˔y:9*yU[Pz0>̻|p#p(n{(2G d7r3>P-|{tȻ1\g7~ob ǸO҅uy'^P^-.H[a7hD=v )۔RA:صgnkm}-=Ȏ0]YeK^6ۚIւ#[eP]u8 A]|W]v ]P:W2r:{GԻv5i T@WeUOOUO5i(:B9 ~(Olmw"ڃ9ºs` mN|o:h&/ݢ~({u%|ګ~w*j~RzV%IST~ȝv} >A^ey]b]Ms/L&zܳ)C~aw^s]ᳮS*RQ*|Kxv _A[Fay=xpri%|M=z 77 GGތFka~31ȋ)>hggfƀa22ړ0 ʱh9{|Y>ϳgBO?wgcl߯~?@>b< cx{!_=LY@ԅX[K1w-7饊<y +c>Ba*);ARKE}࿯xFEyֶ9cr`z^1_s>yܗwsoSS{ۧǶ+y݉|Ev_ٟw a8'Z~ƷGɩp~E9y(䨢ck߱gP-}*hľ9){؟vd_݅޲oܿ7^9J}7Ԟ]~foxfR2?"wƸm[9J{:6)ngCzE5>(]_̣+%sƹHv); :wq>XD#5Q߇ȭ䒙~z뻊~{2h&x&*2R[{!=| Pف!gz*69:z@r4 4sr_G_wrj]T⿏ Vsh*mi8CR/J5ZF+ܮo,([wi^,ʽp# O%҆F}o}Mzpo:L,aiQ"aI+눛7qNQb̻G%{ }w܂v$-GZ3m6m"zøC񡯴[N}Jǔqv"K[==9Ma^:J˱6-F{/ׇq& {.aqM͇ЏXXcdJ~iynW1_mۏqV`Zgܦ2k 3 NZ;Ӵ4th?~ʼA7 |]n~xs<7}߄zP2PNO*~C}%W1/ ]vA!=WNRL=qfRHJVdz_i;M]R?_Mk Ɵ:N1ZKu=%0 v8?SژڞzOiSI%}sܚڄ~7}̜LmF)=5"jAujQEjVn'G4TM#J'K>%.{՛O6yO>A&oS7Z/˼NJ^N^5yJnE%{R(a%_A29~q_R;S*$|H+>KέN"']WIRnEr-OîI5IW%n$cAVRk&*Y\g<WR2|O=ۋyt~SI+~hɄ$W_VZO }ϸ$t/st)iKLK}_jIZHZ|eܑhsydIoK_HO,(;3#ωI#eJ"#- I$/Kz}p 0zLϸz_ z'u$=OoA6Y%)кIzH)XۤЧc%^wIBOӤŔ@ߍ}gҮc̟̤ohPr0gs# f K?9/'''z$Xn#ɇKoMn('7g<"gP-39;Gm$FO5d{#MjO$++n,})Md;=mk 'IxO#dArK|=Ayb C'W5fiKO1vZO{g + _=g/?1Q1ٱə;kG&1?Y ?b>9rx_<Ϋ//b>w3t>N>L +F?.We/))g 7L)R=)22_˩j/%3RkRk=+N>SIyYtNy {JyMLTp$zh9L澩SR桯JYo:5eyuŗoWЏfrn9H}_ʱfS?JoK9~ Oyʩyojs|"'D#PVXYr4&ϐsj-]Gj}!$q/}Eagi]>yI%|s yq9y8)$BTktΟ38~KǴ7WzOrԕe9`-u"[m__rv -g8ǟ߰WdCk05rc+*]-`\4arHHsi>ocO}oX=g}C glV.rZ3pd3O* Ś|OQX5a%(75Aolizn,y$9¨@kNtp}?(C7Pc*e %iP֛8zެכ mѯa>%}tt}l]?w.U81S-ak4F-orHmB@_Wo,e: wslsEioVx5pe5Gȅ +mr5oc_B_u{'a7滛~eY]X7/H/_HשH՞uӬ'䮶ޏd $_k ߴD>'r_LjV^؄z)$ﻓ3L? Nr@&I.x'`KpCBN2èiNC!IHr6<$S4ME|$c4MF$s4M:ZϺu+$w|BX5OwaFnֆk2Im"u2 Fm Ftaփ:Y<_HSu^uZNGm I`m;_vN:cu:M}g>d_A?GXlEw@caV\G5"pNޜ$I-؟[[AGt< ȹvUn/j_uzuYυs +:+lze{7Z=gfWiWu{^cXfsrb(ɛ\i aA0@+\OY_Pgο(QudFc (Iq7(>nMPX55It֔r"T?iȋZ3+ >du]X(L̚37[糏,P29+ t"Wa6_Py5}u;~GF~sI@^@BYEȥkW,IKYg+VpXN%ʓONo瘏$?~w9f+غ({u7 {$ MxԹ._"Na1ێ~foAwmy-DqKZL:Gwa (VJ/+V\aWax-{($%N~?x0-' я{tζu]23q5qToŚO4/q->v_ZqK O2;nfNם=DvaNtqe4+O%h|(gbE Wkb?%pۢGhc`'I۞[cI[AҸcs1|"{̏\?c>1Et~nj\WCɅ.kW/'_~Z46DDh[|]ѕ4Uy^5h%7!~*K°gԯ?O^}s%w-^-KXS4P_aƙGXWZWyAFW*Σ_侞:/%GjFO{knjw2u4^{(a?-y?k&byɓkw">d s~D}(:KCl}Rt!$&Er(ǺyyP1MחF#l1q39*lnI;ic]ֺM塢_( .^Գpp/rwsE[R͹6q3ol煏Ox+`,v!v;Jr-vydCwк]v6bsKcoc]+<~x] i|qؗKVUqnlqWW/aocQ%z| G/$MS>d?Wg|}mE?ؤy[-~\[/zmi-A4/q=kD/9xrH {]w|%cQ߀sT-Q/q.9P2 R?grN8cwf=wy)$|C *!\nRzs0o_gо*K}EwJs/3m1^}D0%\<I|qnj Q/ *B>+ }FسOi“$8:)} H"pV߬e`=@B}$ڃ{,Qy-pڛ$_l)+"^BVy%|aQ_+\JIl Y=Pٞ#?,SH6S@{ {+=MM{VIH2d$%"PI$0H&iOB$ ;(˞=Fy{3 [PJ{)O=L(0ћloCg L$ ?&aT$= Sس*I2Hl<<'ݏۋu֋:"k"ygwg$j|E/vOY޲}HH~_2 'G–$P@">D`%$y~gMB}ڕsݹrH59a   oހ!a>`A$< I4:s,6o>#*xF#3Y*;m}H %*Ob''p>ȫ߁x&ND(u6Imd©4*OGN̞[ ? 'ȳO |HY|{CJb,ybquPn1 ?#h99 >G.,!QR2EWGAƷy jC=ba-Q?#Q<ׅǿ: ~e?tRINPg~aݝE偲?ekOEI w]o7яnui==pV{.&9OLp7\Rp%. Up'(E+R0 p WZwr 'j}Jvk? m]C\ruZ/Tԍ<ᔲ<_節zr(NN~}2}$HpS_7/%u^Tp EJKH>yQ>8<  EYr;\P=oYsyw\ewu`Z6+V_܋%ϩlzZkWѓdnA{7$ޗ{__/}vsVYfyG);0 3C8pN&xWIkuZVZګs]7[q?=yrWi))罙eݫWLtuY}|E4߾ܧS+KTUG _-͛|MD_Kʭt=}EW>|ӨO=D}DW_k/땯z79_# ?yaY}!wdݑW_|# GR_aYKX\{oP9/r/X;.wJtUUw U,;u,kQ~yi]yS~`7G5/]H{;Hxfz^l>u⼝w_=駼;!Aۡo <{  A3tS-l>Xozo7:zZތj:Ez+G7 =--8Jl3 ==4nϷC@퓞C"~W<[a.z{e V]Z6ڛnGTCqZߟ_xhW瞗_\tz<5:<8{ZJɿZ_Ksuyv)yRkE‹Xks5/Q~z~tޤ?j}Z?һj}K=GAj} ͆C|vN<)A-̏Z2Z FnSȟB%$CYW ~9_%TE1<:!:7Te0 j~CA>&,Z#] =l+ =G%y\w-Yd6בm{Qyi[33CXyE^`}s-GqGgS=@ 5ZޯP3(}+T=AȟȃЧo%| e6~gD}/_C]ݐݑ}G_՗/zMv@m;A;=oQhEhu/{chNw S4JhR}~16Qͧ te)Eh!g]2O_6ӟ-;ٞi';az^5ì#GGc1'O{E>'a"]޽-ۭ\:Zma\gZ|_%[Jf}03ekEҼ_[WU )GSQ2V^L`<񚍧;T3-Ӊg֗u7'gXqpE r᯿ +f;(wyTlJ{fm[7l1. z>Ӻ۴ql:}<|--(S7Utv koDUxXƬ6xy'돯y_īޕu*^>Q~ȣ̈́v)|O~~<⣵E/ e;vh.#+I;/`G1x3S鿬w<#p6o28KiKX9=_䘰OֽQ_rNc>+8sM;^#E2^%e2^'2^)2^+2^-2^/`+O/񚱾///3^=3^;^J54^DU4^Fu4^H㕼㥜ɼ4^M4^O5^Q%5^SE5^Ue5^W+{KkƋkk lKlƋll mKmƋmm nKnƋnn oKoƋoo& NTq5`LT2u.HD-(`LÝ("L0Q&XXUXXUX iXXB+Z+j+z+++++l occ];<7ݟ)J4y,w\h}YUQ 0Κ55-a@U}ZC>dh^r҃0XT; )O\爰.?P.J϶U[X~~uzzj JJNXT^/zCρòX;n٭'| SO-WK߶Vvd'~}򾝲[HZϖPS7s yz~|aγVwكWn?G܋y I;:Y};VOC*(K/G?u\U] wWu|ҫ^oYf}ȿhr =P?zv6\3;&::wl'^ڎg7^9HtwC'?/|]\^QL1✓ynbSmIQB _5UHn)mNΜM6> @tzw6l >KRҞUdpVv&3%()tBxI1g16}6gNvIZ:+@J€t 0er֓6n!<7Sc[c$]ã5#QH%&oC/Ã$]CAI0pN]_Һ¯okk .~}"(9<8GqjpM\__49px~= +ƫSI*Kt>#{COf 歑c͟pg+4 ;W$UzU Mz?eEzOnG?msYG حʱG  ᯲ސNt|W㸲sCg渀"= \:QӒq$u2eꙪĽ3H܇rq$Bdmr|q4*G|Law(|[㎟,L,/R+ğnK[BfBoE!>OBƟ@Ov_ 3%>ҸpHgl٪׸poc}=W)\7~~%i_|厩Nk^ߧy.٣|(aDt(^(/WRkWI໲5PqO45o7j-M(r9HOᐍ*]QM|xPZv-GcQM qGh\?Cza9hWut-qc1\qLf)>r̖&g2K$kV"Zg]ҪGy0Iہ3媠qn鸢uJWh%1<'旭&@BdWeKxUtu\2d܀_.ԡT tyXP%e4_љ(XRZbbƝxBZ?G0/zw~ -qujK:q\ErXr;VBV:2/+X u*r̥_l}z΀Js`=8V)-уJ?Пf|ՑUU =ԏ(FH8J.0Za(=+sYo)Yn0SI™Z'Sdѧl@1w VAFǯSO 4?D;߃~?_x']O^'˜~*<sȿ^pg#e=͹#Ɂwyq%^|Yza3ZqqN#;{Fr0v~.!b?}b'^Ko8y5:0+Hy"wָ5 Xڟ#|HMH)*4WO֡HܠHuC7" [/q]1F54RD||&zC+LHs"--Rd<"Ho<(XqY"O@|?}i ?#!L3/R^=}{oۄgE:Qlty,U֮H׆m_b>_1F^./CHL{2=6ҫ 7"}`[]|~A=`ؙE`8c7?(fdчu} V{5oF2EGu}D ;ʧyS1;uhd`~!n1Ѓmrkzw[3/0?/댼(<_os{@1yVV3kU~AiD+gIӑF'~h7"Kߏ< G iUd7 4PH0` (:Rw_N,eYu#  Dž53(+xF*^+k?TZrE"ӑ3>Ou*|2#I1@#tuސ*|s&-wf1p \͉䦜zGFW^=:Dm}t侓b" #' _I5y~:K;{Wƺ/a>(d+eo^ Ծ!*ozTPo/)v%|Q1Q-)w'wenMt _о}'׵?ϓ9|Nr.|NYgS??E)ؕ}=øh_>%=6|;E9r&epvsC;z熿WlyOӾIRO5*}< OYrg[3t[ j >>wd8(9[x!< _b_\^";|ZbRyhX s>\W 䥾|ܤ7ߣL{7S}S[9/SL[$8=@2zEnjD}LKA]bE7П"Я;܏}/t*bs-9s]8IlahA"=TXHGġC~=Dջ.}Cn_~>lW -s˿rL#LSwR]7_tYv*-+{ !R*(kv[w7Y5]3OKn+)nVLbj9XGږ;";[_5;vIiuѮ.%/^ڸ ɺ턗ո.:+uJZ ۊCꇋܹku}rBcQ:uyQ\?}F{i_r풔pmε)[#(>h.Α55OD'7$i񲖹\Eook7ru"NwǠЩt-|WzJQ돃煖+YiW)1*,">q":v5âsC;!|u$foLiΉ'-bGk>O{CtڝLOg|KEG'_u.ծ\A+R&p?%'8^b>м;g;359K縎HӂsuŁWΗOή/C C;Cy9|<هяXy"Km˴ΜYc"fpӹ@93to|b)L0s/(ە~'˙__+?_t.#tJ^\F{sQÇyn1[jC'y|عIʹqƹqV<<_#o[y9Zrι׉=Vx)iyek?pdމpd^s\@4];|xJs+dp˹3_Ǡq*BޓAu~Ϻ=9{yy{sFS::q#|GwtU#`A)RnIbrst{/9&M:{o^ w "MP,(%"(E""|>o?^?z{Δ={{:]Bq~h%%wlK҄EX;D⎐M;341&%.^y6y aUˍ5]uuSGr]Ow7ao^Ю'zJ/:<bzd{t6?'hzOw/{_w׻_w݇zNk״'깅~sSV5;@v.tE=2O0/*D<*=7ZAGVCQ?Q?B{>g7 r+w.1/oD]JVsXxw(ϸ2<YHDnh?b>.F!t.gk恦=xz\`w"YF>G_~@9QS=YQk)Uv.GQ0>ۢ\gEq{.ƍ0)g/K*jjCphP_n:+NxGDtA|>eo61^kjlLd|;w󁼦etS{a /L]UwJg˕p_ޫt~nwV^$UE/VURfbՠ\bӺuuڪ]ȩ'ji$gVX-ǖй V+ƽ֜$j(9gm];KS'춺(&]'Mޔ[QV1a|AA< ԍCYJk}F0. F΍&ja֛r&оx'Ҿ)o5YSΠ3NϐwΚ|U8/ÛWzw.uݬ;S;Yno+* ?«qۆ~`;^xw͠D;삮{b ^ww^nF~nO% B/?; } F~vA睿/c'8Iw_5DWLM9{2#*%9;tƗ(}oוg{]D B|mSTUv>k i)ޘCuD /֪4zVBo+Z/g]Y|EDY,B_-d\`(>z+}|\ΚρofULbʟW|v=J'3^k BdID%MrabuhbCq)lXo_orwAX(4Bֈ 7#9;?y5v};l U454M8umnvƃ+Xioƭ7|=7ՋqIV}gaw]KNҋ[E}[_䮁D)5o7~jj~)|Ҙ~jn(Q.q4t-E)Z5+W'JeX*Ul[ik ?f 7X{Ar_V ,2XeB(!UpS'%Ew{jtSdcew^n0w#XѲYQyζ #GdGgH"O xZȫ96_ql\v],qa迾~鼬݄kিTZm~λ* ̪ ޻x:Y[ MV篚GoPo1[qrPa㌸yz>^QY@i@w΃:|O¹GV vZ[J87j\')\%sX@VVY6ι Z58WU87_uEy_V@g*I%92s ,Y cdt9@Sg_ƭ3Xu:GJ:ڤs ͸>prVVOgsyͤ]:[:l!~sf ؀~8WuYzSusJ~`܋‚P7Ҕ21 O^Ogi\~V^ g6xqE[qQ;.K;~er|)8Ϊ?31i?*8>t|,+#㠼hCx8559j^8 $_ r86yeq,:x[ݱ |GttMyq,]@yv.?]a9Vo*zȟ8sk>9ܤ/5Njo%4/oB/a{ /9\c/E}C K9k81>CS.׆j ۑnx|t4|쨣9ޣ?mho;E8ZC {C떣G;dfŘ=C!bwdֵyȋܔj"by+rYθ˿;.r:cfxH2bE\Gd0Coda'6؂\ت׭m;Elnλݫ`%ޡ3`n wڸ o ^]{A] *7IYWx{QkŠ  eji-;9HgbExQ|AyllKf23j=0+刞K!l)xWS$BD՛x + '{5N5h٧l_? 4ylWKˎ-`NӺӞ?N3v볖E͐L;V-![Iu&dgp#PCBͦ9F,(_񾴆Jk KK Lьh;!%̢7)MӉv!󵚇,7><łn05!zHYFVeԳ:MvuńcNV!hrCw't-i,"!) L)kHk {KĸnGb|CzMC9W蟤Bi WObCU;F3Ѿ7p]pB_{KlnZC.j-a<3knp?$]x<)731)~&J }FChaYmB irBKhS?C?HUS]hg{hSjOh/'VPK>P?*R5:[?I x'UnSZ )|JXɤ[ D››TokUE#?Ү:kVW? y 社|!Ƨ7.>W=>Bxn-HVBsB5h q)\|V_2^8*A:VP(APqּ* Q^OEZ߂9;'K9]6+m/|@%:= ^vN|'^/Hk~8><~ ƣS`0r?~_A£~L??$|ϭM>k}>s?}3z0zg?xO΀O?[ rYF}̏]s:qsmp|l6| 8 Swٖ[fߠMy5+&Of<ƿQp[C?k1_Jђ)!_oΥyRHKz |?5.oH*:<<.ܪy^pWpQ0]U=ѥ[y[pF .*AyGY7UxTXN+Yx_Z*֏ApD^ՠsKO Nd~΄VҶ<]<-;wP]R*P!q%  %BIDžJ i%,ՆƭX֙T֯o 5B{x/CT +_&)W/^~.]&~* ,:.CUV1Gk~^ *rN@Am"5BWd:u#_)|_t,}*/$7y?}_:5:`OHS'ε)s\uPV`=wR-㳏@|ȗ50:d1yьF*&8J5_C|E_@F6:} ]cKeU6v;%G[ee7Acia&&Yuy^-oF|gיJczwU-RVx&ceVW Ucj (~3{n, \$~6ˋeP3n7jokLV1 (fQx񟐯Ƙ9ъ2z[8ppP:hQ~o/F/%2ztv]u.-#_(ѡm$׌ _gNCgUg[w\JyЭD̯6: bV!FWO^c4!'+QFԑǨż%oQ~TYhUN묥aO~ꁊ1LCX>O7iʋl+^PoR.Ju(Dap/kCe/Q9S8ǃ~ysBom'(*^_^ #^)|覠'iȯHFD}z,&#t%LQFD{jWʈR ۫t쟤:?Lf^߅֙|]|6̸')Ux.#ojK2JͷBp0+(lQ~w1>y aY!iTue^'tq)ii֝g;<=,yyPo?U9uڗ7fRq[:Che|Ο??V_*)E(>~p/WE;/ Sv̡29(?4\g`W"w/*|s$$g?>qP3k(~/GX~c^ v[h%㾢~YﰟH[7K*+rvP5%O~)cMWzF5Nt?>e迍~y阫UPR۱3c8C gKti%]Y9ÒM ǕO* ~p.XV\ǯrU=]j5nWeI-Wb$Z]es߸uJj1v'δ.뷫桫b]CevޔUϕ"~t9ꚣHRY3V5U Mq4t\{iTHk>F{rSϐj qA;WԻz0>]h_GY/]ees%KryʙZ\c$\? ~K;kw-LJ3-E=BHÿ)u\U uuVn;$z_Hq}φ+J.~f<Ѯu?YE7wiODw^;b"+w-uGo"-:CRa{n&+;^r]Zr͍i iʔW*_ Onn^;UݥHA䮴rE_wXPfq7n$l{G'񱻧䝻C؋z{kNػS`^P렛y_aQq"EH~Q1*^!r%\{)g z_z>$~u}X>NA걿qQe?:߃^?3jʺGmy#Q//Q(<-9L)xCZqڭF=WEEO#ʓ<H;x5K{QDEz\;y%8(}}_t߅5#͸]/msGoMZ ̳#)yyWe|*f}LyDӋ E^wmvDWS ] Ys:{"z2y::ZCܼ߼I}c#y<~\)ˍ]z+@z>aC}_".WbT/yB~~F`%]_Jn.]-炄g.N% ?C;~yLruB!zۙ&|vl"zRcC}nkI{])꺦ѿ`#W_gWwv6_5n a-cWMT =/ 9z}跥OKQn"_/tȓ!|Vzw=#PQ@%?u7<%̐1j tߩ97#̹9Wks-t.c?L҉~r[OqQ귓ug_Үӄm6(g )ʏ2KE|<+ǎCXgY(,q?W$} ™UrIwA0i3ǽP0scP݅9O_5)Ǖ[9SE wH9o+'ec@1 9ޔw\t /:;z~اVrرZ"_QjJN:@JZj5~~k-|@wiBwK%%ـn3ܢ]_vlb48._ӎL-Of\O${Ћ/8įT_<0W8 sZ>]zzP,튢i K'Nəp:O 6?&}ܝ0;i<͗pߓw"i/9}W,]3 ]⧤]J<#5脤ߤm"Lڪ踤-˅ 7+(m҆X7#CIZ' iRV/;&iS;7J'm@tfi<SVw?ߕ4|9rӴ3p4tms;Y$XU+7MRK=(lÖ%f4KIg9@mlߑ/=ςNa!/D??+$i~AYw,|zv1=Eiw@nͤɊvM/$M\ RDSIu4 =B.}:4u5 Jk^Kz\CIo"ƳMI%4V}ISoznB1䢟uHAm ̗R&wk,ȫɣ?L?StҌMgOALD? OFMBȼ|AukItkHAf]$n.ON0֣yo0wPzɤ_Q)IK?ϥto֣dz\vv_N ;";w2ۃ*:VQQI- [*(¿8l}KRcH#PD]#Eg$5.u]RCIuoKId_OɺTSw$TsRutQRA}Eݕdlʯ/K$f),-E&+("ﳎ~%m=m> Uw ޥCH;@ cx=)꯿A/*:*Z[uD7D ߒE~ۛ(;QC~=B{J$덏yVn'@+*(2aeV_RieiƷLKzu+;;Doj E?&J8OEч<Do7X7,ҊKFGQͺEc_ =+{ A0?i_|'џrS|*ya^ų?J@z _"ϋ'H$lN+\;?J%גWeuQTN*]コ,{(]}C^Y|}/g%tZ$); dߑ|&"$*8zNO~ÿ|=ۏ~87onGYD2>AS$E 3( ^YwoѮ?u_%H2i㻔Ѥ$OER [EP$UcY]ꇔ){QRM@-:T[2(3z' BFMjvK'@/l Qtk_Kj\k=vWtFzAORWVwmɺ.|ܻaU@$ !KaH tz(i qXx& /:U4>NE^rcRr dІL?gV/%R~<Ꟈ/l~DlFo~|}:ݽ;ZHZZ _WBY-;lc-z]G;6oTv{NӗTޑ8iW_~|o;SedWehٲslo+Ow&wS soE?>n-؍|g-XW XA|7:R,J/"p^D=8M oH,Xm*gN)}#ƻӒrv]ˑw(/IOw+^&xuʺx-j =膕0^)xᥘd ސ;U=t5;eA x 6+x>e]q;x(!.JB" IY-c-ڱ:.͎ϡWޙk~סmp~?rx.gYP((g@yZ˻$*X%yNCR[W>Vg ue5s]5׳ o(^7J&>t̙B2 b}ojK~t^pyv9Oh8~%u^y^-5r(%W+/^?<^&^;8c-+߮B^%JD0@F!o0CXp5%*vٮD9$;0#E( F6}FtVѸ;Aꮃń:5w%\GǂD)A>OQrk{^ Zk $kKޛDܑV~ӺMxDIe'Zy^$:+h(jhݵjG^G {"xW} ŏDm'qTtip cISZMGihq#ʫND6Fn;At]=O?y׃P\j~By0QmDEcݚ/"9(*k;L; $pAyDBDC}^ m5N+uPQ?w߆|X\XET ʙOD %Jj0lvϮSWGW{m#~qR!ה*ϼ-qsMz^2Emo 0 ^Br>ʃ|y=O_BdeF;y^yBaMg~(κ}a #˹p csIk\s <ٴ/a,s'Ѭ#^\go]kCٌ6FJ*f}-zZRa~缒(\?gXma䣳FA?a6x }D[]E/BTϷD%Z,4g$_P#Dis׼sxGإxN& S'(ͧcVF]I|Gf`G *(}4sYmYmeUwYY'Yuׇ䣿"> R}?((/?E4tY'3[|Y )…5.Z+4u&׿y6j^Ӵ};DwͿ']Wy7ڤ7 tO#}o qG'yLQ / rNV:WW4ɿcZg1~҄xFgjdoDZ^@M_t ;D;\ \M9yV~kM~,k^T)0PP/#(~\  ݨGt J? 7ypk|QeAYNa%S R|pTY}+Fς2BG?C?rӨ0i(e< =B{O _xf3nI_ h7<.֯¬,@E2ߵN"oj}~kzA^n5{UM+y-_{?<|9)=yw9zLl0CWo>yi{r?hߦo>_+o;˥WhyGMü-i gH_?JQ"Z|'ߟf|=:k=y 6Dd; Sȧ ԎҧHҬ{-iW k ᯦yO!?zϜt)-=_B_\%<{YWg1E3@>{ A xFIdG;a_sInw*E|{(黯y%::!YxU":+(\/%}hϗ},}됾ʞ*&t6ң(MZw&Rߩq E)v~yx  t[U _5mzI;iwA^}(~yIW߱OACQsߧ_O N'<Ҟ`KОIk27>.)jhߍ M;ے;CZ}H.G)$}gStn.\}_wTxP_,YA /"__zϩuԟ }37&z|(@'F^Ko;ߍF.G~Ekc11_x=;o~PzC懿#yO(r5yՋ㚲_:u_Sח<7bо}S#˿e9,}3ߙM߼Xj+/E?.y&neE*^+c{ilű:ק ^"kd{leNJ^*ke{l岽^%fOhW^7 g{l/xW^? h{m/5Oxm텴Z^L۫i{9m^T۫j{Ym텵^\۫k{ym¶^d۫l{m텶ҶZ^l۫m{0΍ aޫ ŠVʕ*ӎ%W -zA@=N=1ȍY7./XYPO'N"b[)c6i+y/AE74ra<͗MO5#B"OGWoP?r əȱ¾ȞA.ʹkl^Lؙ Q^ "EDq^t8KgCDfc|_Nsb1S"-/b1^>&G߹D=Ӆ9ex^(Ux_O)=՟ jOJ/|o7@>G)|Q {k՟GxO@t O8/O=# *~ q ϼ1ǒ?Fa>`Soܩ^K$<+~ wddbM525ßd QVpD/D5Nz^)K;_uOy {oqQF$n]ކ`x_J0C=/Sw?Jx5ExI| "}kþ4۰#0d;yr/ =GA8N~)G>-MzVGJ^N% N:O w'wg[1Ze0й|Et ?.} r$|;rWc|3_&+㽑vwRp c~NӮg8qH:>~[ ? ߔB?s^s|6RxNAyaZ"BE4""}<9i,FtWc7)bψj_3 r!^%cIEYkx^|Gl9CHDxD\|AY X׳ϱ>F(,/2IiFV׸Ef:cCodc!9!ZO"'Q,YWh;D&Dȷ{NӞ'lVYs JNOLtevxIK/;uD'.|rm}ޫ@VhG#т[~џˁ蓃es ~=~/:?C猢cj ה; K W.C]W5xm7n\?mxk8?dJ_ś} z!UQexc3̮~:M%Qg^-a/g_:"CX2%AI~g J 74n&ڷ8;|Wk-۾H=m'7N6?uiGyeS^TN]wJA4E]ÿӔ(vз3YFbwӶ<^>g{m%*^Fh{!mj^Ni{Am%J=^'^Zxqm/ l{xmEʶ:^'^i{[Wr?z^p+n{mE궗^x+o{x^}o{D`G QvU$`G%Q Ob(;"( ;jŽ*DYQXGӰn /ZZNrkkCy^g]2+../kkybIZ|n4st?L#Wg%Mz8MNr~bu?Z^ 8.2 o03 o7d D m C $' ?n:EP^0iG{d2NCwBO㰮Ū>t0:?4Tg:f=H>^/B1'c_-y)􏻘Fxgq~^1̜n;|lwh6v^m?;CG#QލcxOIo& 'Y9ܙ( /ȇW+D}GWu-E 2[宥>^韴|wENL~xSzj ;9/YYs/ s+$Gzy (SI/y@.\yKn$MK:!='IMU>po1:k@+yAy4~zJ@#`k[U|.?P B 4 4&* ѐ5| 4>'h'~t%lq E4}mS!7C-iwz 6;$Ju!/轞tI'/|`('ly$#A;nЁg|]K{C/ҍ(nЏ8iTD]-Cczqk_6e<7,ʋ%}*_՘5i_ur4|:r&j[V/XSK_-,Gʢ'P"ѾWu@o@ @(OޫJw~=9ޟk^Wi?r; @{DtQF1h@ȷy ѧw&=2P>㺟ܫż|cgwCcGjMh&lu0>hBMg??+;~c/;x_i_u7J$yQ9K8onǛW3$7A9Ye?(=#?>}eJRi^+{Z},( DHP/IzpPw*kt P53hg-_) X$28qiKs=(?n}Kn3-C e|1B|o~24c.ď?I`)`Oai//Ĉjӎ=*0R?RKW9)B%/Ӿ4? >a[%%GDVT{ {Tc´Uo&w`m;Wb]I}kXWk Bo R^ӻOG{ZTLls%-ޫ_Y ޛoQޟK?!נV+PF%=5 %9('T,&vBm?KBK;YޢB_d 'C&aT4aTg\TG \M e SQ0Φy{bkBj+ZmJrl7as훡O؅j>$ *0B|0,_%]sbBT$҆TW )*H(&xBL /k'/ /^Hȉfr>{~?Bsyq3rтz5I$8F hG! c /M'wNCȱgIћ@@t³wVja;S~/y'!.g@CB&[1;P@o=9||pk>y_jS^I_˚^%-">H%eȎxF􌿮oğ;>Cg_} >' ;~yf)닒$PAxgz5RLIŏ|C !3D?Z~"XN_R)m˒kQx<Y>ϿϪC5Zгg*-:ZL[x/튡pͯ` %>)EU@\?xn iռ$=z֊O=%g<$<+jO33;k%\LԻj/}1Omړ&ӃgCڥθ atدֳtK2辦t'Lg3Eg"3^xL~ 9x|q0N5=ߤH:>Hk{JWo?@O(; 8ۗ*0_ j?~b~BGYg\Aj?c _&@C(~µ|؟Yk4@iȵ 5^f[Hچ@D`rH#7x؞Hվ?O6-'؉r44^z&?'%7v!2d3/׺oIh t\r=śY˖EΏ9WP~I3^OqpB֧zb}_юf`pWѢ%]J<lc~ 9-!;LcN%vtpVe)hPqP,[ ;U+blV.P3v,TkIƮOn06vʲX#KvQ͸Ϥ~N~)ci勽O! ޓ$bjg{b,6$r_.kG(\G7Ѝ^@oBn @ a $01MH!l&j6!vsM[Z`n T8zg-Q.N!j*0H8793P%h'x@1#4@BQRBXOqꍫбIFLNVn;2ceRc?i+ 0+&7ښr07wJI%˧-GD+.+ WZKw\Y1H\NqĤq0.^[81H\ mJR+.zJ% dWG&8מvujׅu4Chpqd${2(F.ek3nW+Ớqџtma}Rоtڗ.U<0t\*dY 8Έ]҅i=.wSϋP_D0T?O! nO>zL! Z 7 xrݓ ,hܩ<ʘT`A{NC ʡR8풸J@ca"}r/O/i?&?H5zLxҾNNg1.=۩wT'&gmwP&LKi[U06<}x3zЂi V:bU (t$ qfKG- q'R >.-q;WUnzp #n!SJ€[~W\oRZJNqO\Ao>>dL^$Gbh~~"D CF-ծ5b.%=U[(R2Ķ@nFUd-U:]X^ Bl5KlOl}o#ےZ>=5b{K~EA'9ۇ Nl;LtmH?ﺭ`BM/֗*,+9b>964 _NXt2.a(|R(v[_)#3Ŧ DZo7hY gpj= -oGBۼx3ή5,B;db tּt.@GvGLV$݌v7pV T:x3U8SRQHҸLdcPI1PN2Rg,khń~Qg*pvߐ7<|Ko d I2*-N|xYzA %/sv4w"~҄`WL_uۿSR>Rj~oպq mZ1$t`~p'^*iK?{t)N/p9`kZ_+C 盘To3w]vx???3n.dcټEp.e THK |;Ù좺:Pu2-,seYw!} gتSnMֱ:ަqf}u+gu6!~w:9ٚ3$ @ʫZU5ށ*I) \ULƺ:VuXG>\EAZzSLYLYSPO3}]ӵ_0g{,[;#>8m9-0'MU\Y&LI\R\x!rl)8rRnXBr닳sMǎ:%M<Փ;Ha{z.w86w>{^\Q.ơ}#3(ᇝ $Q1ǝAiFz٠4#?>J@iƱ Pq?lZY#U)6@;6+V>C!בt'oϠ.O1!Ge_5!lNӦ7jDŽxhʓ?L%Ki]C]fďqQm?rAxSW ޑ!hW*7`K7;{;P*S<'G|w0TsEH?HA+IGS ٪^[xY)uU d} FW F(*P )son_`^`?|*E`Q0BtnK+h'E`g`/ѽIy#1.wQlѵ <_4~)g=l nX1U7ς J#:^FlLDz>z>8Z\Ro-%yS|xB4!osƽ1U~WfIQO|VXP/hA.HCs-5sQ1r/nu sķNܷD( ݄! ѱ < ANK$ѻ`%ʩA;9v]0h1 | _ئ lц|ѩtѱLѽpҝIhɺ,H@󤀥~HT y/єu!N>[‹ge'Iº~_:=Q|p774kj~毪qRi*}%5||9{|[у機z.i櫋^WG3 罩'~Ø:~P3R[1[c;?N¶EnlF|eV7xo88cam ϝ2WZ7#A܍%3»`Ut5H.*Q.3Z<6̗f(?lfpP/aşftg)L=>r;P6n׺zd0Ÿ{"7ηJ$_[G_Q㇓yv,ߗ}1S ֓t.ʹ z@{~y/~Gk0~ zfk̸h>Obv32x/B~Gsȷ` >6ۥg>b(ҿ&}qE-ߊ$ CG_;.1AʚW*ߖ|"fgE/T?\͔SG H̼<%p5(iQe=MwWo>'׀5J 6Daџx^3Q ܌?~~B-J++siPUA*3,ǕqVבױkҋo?U|O2Ro|6#+(H;mz~o-cbM116Mw#uXZc%~+4J2b"ckʟcJqgSz3x~zI N:eL2M8^>gc1Qf A R̃1~ 4ɧi VoboaokH3>=u^vyY9H }fS'Pr̋NCvmߩzgśm=?OstW+=+tWnɇ:IX;N~=;F\`_}}O1닾ط ^8ziitgvkFGvt]^0翧&טW'W'S" _{n]Pm@kiZIt tү q3ZvI B}G@-=-;Gx MS_WCVЭ.x8EF џv!!;4!jOW9!o !!\q YBސ_P(NrU"i! ڄ Q?CPޠ7L֧"C"L5VB6<אӆ$<&`- 9B{ nw5NhRޟ!+VH{H;;hCi#-wj>av߽sv!7[Cu3bŠNNз/i跅z׷CvAw4oC6Bs>&C=oB7o gWaw~B i!!xB>W˗~+o̡ ៕J軓*vlkI/)\,ڕ:PL2*5g4"YBԗF3O_E'Gle,A]("e.__)~I@o(.~*RSN{EJZQNarćELѣHeNi'Td"{RiJߥyPcͷ"GINjGX )na~X/lޒ #~yzi: ;"y6BtK{V>.  T?a>a'wa%_~E 5s#- whbGxi+MHr)v+aCuxo_x_ͿN{*oGSil-.2謹x12]5m8_F xQDdx_OށN@; ^x_=?iM;vW]# q[Dq3*Օ<󂐯FpEBz{â[Y?:F̣~D(E-2Gd>+kt"8 ߟu2\?ȣ3x F_g᧳S:ƗK6¯u8Pyp_[ޝk{ufI 9x_w/?k2+:[@&77׏fAy?Q'/+]$MH'"+?l=(XQ"f (|kR@j}3 !? r<'/A_ FJhx. @ߘI~]HEwp `<3Z%aftV6x4RJGǔ~><}֛ȸLxZ)}St3n^g|+):;#A?pn{lz^tS (ոA}7X~kxuO!~4n3EBt3t8|N=`{G_X5}zJc*Jɸ6՛]h/ Gz}K2u9rD/:GgX?r^ _M>'Lc]Jf+46BukUMhUK_2pv t^s /4c~-χs/)K8 zM@7}/(+J9g<ѩSR8Ca[/C8F9ep2O7}XzOf]> {_vG鮬]o|2]wAugG܁vg=Vn }4#1zDcEM0M 쳚6K>ބ( y-l(=F=ƭ,zҵ k$ 'U#z5o/UEDZDY&ND 0}mˡC/GT o?H(rGPyOeKS/W_|zvчEg_a<.ξ8rzrqu%i)ډe#G4sySugS4D)KN?ϤlEe6K??!cCNx<9ϟYկf?5`i-es,ɿٱ= ~iu.Ev}n}ىV"qdKZdSY#ta$V߂XcΎOY;"8qtʋ8&m"T-]"z/E_a5>#>gk{XuA\VX'ۈ5zV!"zJMx-R~)M]D8Ϣ¿qH{Dʺ;|T r8| {D<m}c-~|ń+ix ;Vpİ;7) jvGV5j_d%mޔR]^}~y㗩tEƭ9i18% tMߝboE;l@y;2^mi C!://8 ~N 璎?Q-_DT ;{poпx nS#_ҎOA TޟWL8{_8~xO2ѿ?^Kb{Ml/U,O.핱4^6c{}l/D"^%d{l/핲Tbղ\O^^2kf{len^:kg{l峽~ ^Bkh{meh{!x%m/W8OGxEMCl*G& ċ9]9r o<:K4[) Gr5#_G an(. U#DV:s~G4帵w({fepl!,-~t$ #>}ݵ# /˫∡>Qx }/I9GoinQvIrG9y%G5~zAyCcʩݟu\7;G5ΎKس3(>tNIk;A/p w1FehIGi%hur4 ڧ́zuKc͒|td.w1UԱ\rñqI.DZuoӾ%Bw湳7˴ t!q~ބ~;|+?Rg9: "0Y<䌟jEşN?嘒Ί*;hp&βjLoӺ "_r{Dy\8ɽ$RaPtVe5uVoЎ['y匣Q_XY( Լp|;9;v>."[)u\ݎZ !@0vs}mV$cX|*:8&P]n92xC.GuʩA^c>T-(z: m)o)ѝvD1?#ϋ<ɭl\̇?; ${oY^ ȅCg#g:RE`ُ&Vu<5O+ɊXCV$֒HPß@gYGM~i6Įjg"g{٪>Z&@gpCk61;.ۡ;UH3|_$qu>q%Iەx@H~Ϳt-1?9eeM$:)19Oj$j/"ī&~__. /Lh7 I;SN%ʁ^?BmɅGg# g,1mtpA싆;PW?u^u'DbKۜkso}wMڌg&6%l6Hxqg;(.fWOux?;+!+[Ŵ0WuѢM[_=1Lx.#st j >#-!!MOBdO\'T$nNTB2kI%3 5'm ҲV% iBδ&A;u!haO_N.8!vs&/ y.!'*!foB<ޗ$)GƄ#]aoQ1?~-i {Iޟd ^轨ZGi7X`J{? PVSO@VA>Ӟ_9ڟ.ܬ}o$7yA S_$ X3-zkdU;~nCIk5r)7ƴ/7{z&7x'd'>C֛xǧ˚ʏAz3}A8W^9ZmgiD i˚Ntoy_Otz|U/"ߐe)Vxb1c[wPZ\^C|N`p#a|ł{4~V^k ?@ɯg:|ܒ&sE-esFV%"x2Q{=dmlzʬgE5os|!By%߻ "功.~F{y;!33qIϸ ߣ8nJFߠu3ny$3VzKCeEBku3V^FУA\ Ư,ZmҒcq1> d݉K+,R~+GCVzC`qʐN&@Y7W~\X$.qZVKۦ]x;@_ɥ{t:~"~;(9|֛O%jŝ\;Kxyprnj&G)Pጙ';r%˓9,}Ɂtɗ;Sw[gU͟cɗ|7Hߑ+S›av!/oޗOx_*&x#94^'EwoJ^y+>^C5/z#~6dc﫚f޶#=ۗ}Hpw >q zO?W[Mֶnb_z#x: $8ԎgESB/J')!) &V; %8ԓ_N<ԓv"%8{SC_(@>ޓ;v$jjQx~^ݠoy=gy\ouV[QYQYnY-$#Me¥Xa(?l rJw > ̯O$Zy&(KJ霒_^,rXd=+fe 2?4?/wy_<@ nr6 eLސ̰i~\_4;~ᠼ Vռ 3iyy1ͯtvJQ9\pƥO~.m<./yl;Kk/̏CJ $oYN/|3^y̽|Q`Ζ}6H0wT.yw}+f Uᴇ 6kib>\2?`>g񣒠 0?6,9&ti>%mWԏy"soQKz}E;hקyπ2e6O<'HO"}%볆O '|~|5O1"?&/y|:8|1\x䮃S ^YlT4J`so_3_Cښirgkhf3's?zأp3+ӎ|9ԛ:Ǔo+GOvO]6y~?]!' XAܱq8 )Ҟp#:2O9 /y)s*;LLҗue^TԠyr.Sy[tyM _j i`^ Iy7ҔI?n)ɼ-¼"̻#Ϻ)h3pC4yH9_1G>1'g +gubeCoȦtvy{5 W֋>^\r(ʁScN<y/hNJK?"\.Ufg=VhV)](E Z0.(iio^,+ťXk)G2Z2WAEXMGzVyمWWVYU ʎn/m_!H ϐϸ`Bdt癕(̲("ii=LWy4GfUJ*7/_9Jk*Xz_CWU6:gwK +_NÏ$ .8%:qt[Y*ܳ_(և|ǭWE&+C<ң/YqZ8`8F+ԊVTDz}Nh*jzyi3N& ?·7X^E[^KR_ܻGn~e'.CڙPL%;бIT1oJ WW2w%+-iRWYV^Yg_q(u*h@4*OR@F*rTOꅏKha7@]R+x~*SC3 rй V%_C&A/V Thj] r )^+I"X VB?z-ڹvg7STVY)?ֵr_Ycٽsxe!hL;dvQ.vŏ ,:UbEkˏ<)s/QQΖQӎ*󪲯XieUC֘&)US!am\yY[zU9y:eM~ ȏd*b[냹dSt%B:͟0BJ1XJY?1eGz].ղbO zZXDEl>G!t{}E}mn-6t՝YweesߗU&F(ITY'^t* CTi"drj>UR+8QD%f[,lTq12ˢjZUWj!UTkΨ^Hl#xHHJDоkFQ E@ͺTYVv,j!ܩ(QOC9L{OiܢҪ ^W4"(EU99~Ki`Q*7:+PStU:;vYь_ty˓^&Țj_t?rSNёD]k4^hhi7]I]MV_tmyQ݀Tn75^_ѽdFK~FfXҴM#J.:E"z3z2z1Y&>dȗ[Irq9Z-Nmkpe]~G9;FU)=QZчgxr}q+&<)+h)4|pv\^W59}%{Yr)y}n <+䔼#m/&u1EDŽkZ'9]CL&11#Sr\^ƘZc;{5!$93Dr>f8z>1341es蒘Ţ{iK1|),f+f0fw _Š9q$cʋsL-=P1jMNA-fs:KeYua\ϑ-^.*CxǬiuX0S@/1K{3Z_bHJNe\KF3Fh73 $y3X:!u5IYL{ɳvЩ=tu:ә]K17tcӖ'+ y)|@zZc× ߯kݍVg>4܍ ?ԣ-Fk+=+%tiŴu5ŘMy*嗁IsYL"`AGr4brA\YDK*'Ck %2AL_.#GG ﲎ}wh^DoY4^+ 1z%gs;Cy7ݙ:|[^I77_Ve:]+G)+]wtG? RnҒьo-a|/Q  0܇(>D=m\JZi(Q]׮Z?.hw"#_vZ̶Dϵ~i!JQ̖A%9rވFc#l?5TT>u'(]KхՈ}MQfUP>Tn"O:mgCQI4|9+ D+,:Qh?S8ϯB\ȸ.dX# _/]"%սT=;̳:)/9%[_#.uy/^RyU~*a?6?{yS<׵o7o7Mʽ>!38/T]mo*?ƇYC=_~]{SǪgWǞr9V_vT{ѢeVgiOc |\f iA/n j7ZT/^iqޫy@ =qPʧ/d-kocj{jW=ݪH~ϻUf:0UuYAsVRNk»j<Ȯtޘ٭,cdޟD'q{"7a2(9Q7s2L?moC5YX8TcVJQXF{ɮb$Z_xÆcEm򡜁Bb ȩ>z!yk]v}>S֧X{+[؝YwH5;U~gmVm}oa4"ꎵ$nKr,{nP*W?]ݔ+d_:V?Z?Me-fvIv Jq'ڕE!%ǵ1YMZ+s}[ΐ/ ߑ ܂PǠk.jJ ~%vuOkWZ%յDk8=蚬ݖMR\&4wM &rV5Ni`i~Z\@JZҶ]}z/ՆI؅/U~&iM6Wy) =cbKr95r0 ~E$]h Z\Gwɿݑ'<^I~݇)*S,iιovTo9JeZGN87\ V~O;|MqE}iݨsYe}ݷJ8Kv:fܘ~ҹ\VNnrxq)ߝxyɾa)rqH.bssEݯe% 0)]iHݔf9]y&hbTy?ޗ)}cW,+ (kU/ fJa!,5JX2Y&VS97$~D+4z"WF*1`}a%?2QXǪZWXTj}&|oFzVn:i0\.l}|VcbKg5ts`s>lM6uGmG 7!=7#vbNNi͔E1'Vf 7w̏Y=X=eUz1ߓL q$'HrSI?bOQ7Mf~Ff^'7K8 Jiusߍ_*MT'wuUbǻ#=nȉ3(?;&F%w]r?1]X7:G'7 uᦧѮ̇@Wb#yڙWG;ȝ#n|o>`mU[V1=Vks+niBzՒےa3ioh$Ր 9cR_1V=Yu*]G1e-|ǬpTӬa߱mWMkܤ͝Ѣ/ U[kXsnUm֞ TC;}窰 u"ڰJ] ?I6-<)W v9A*V+Qv(ׅ/ZVCX VY]>z-I@˯UO%MUIWEҟ5TKE3@|{wgݟwn1Yh.ݦwޭڻW{7D?r+z8ʊY1HpX# !֜@,ح_" Vosv^=X-n`EUCz:vrނ~Whma|u5^OWZPkaLٜ=^Kf +h3f>+E1k4rJmLF{ $E([R& Ӿqh?Pz4hNBK5#YG{#YGp_p)rV0jppx]IUl}'ГSO )vL=䜃!g9$ J* (IDPreks?=g?wU+ժUw]8{]jk]݄wE\],b+_Ig E7Y5Eqt $k D0b{D{ԓٰr!]ًiE.3\#f̊U7 +_GxawtVы;qG7h!wt䎖')C4Qʛ̶o%$ !^H5W׬RG'BX 4fvoƬF {vޟoџ\`;=1p{|ND#k -wW̮4AN{1"D]ǵ 9I4vzD5= >^BE Z=| LJ$*;؛sГ͌s- >;[>/B#ϩ[D| b#g>Qxr7 '𽁉6&)WzzkD?ͻw4䎎^GKDOhut,䎾ј;:{gf9|w.9 E1kg.31[sfԛOj˅E)V:3^@47\rsɹeKT2k.\?(] rI _Xk_FNOB?%}s~{ݹ~!>͆Do3ѓD9SpkvS>Wyx7\ _DcD7c1)-G=p4eOeVAL>{ȩ$E4 uhy49.1DwcZhrk|2o,]2;yn1}iuP7ѕ{gӽtwF;SN{gսyuĺwf;[N{g׽uw;cN{gٽyvD{ڽvtw;qN;εs/\;jtjܹ׹wǝqܹ!wȝ;FM15c\-ȭ"*FT MN G8(k&t>/E8SڐI}<|(ITw Loݳ;pGh= wt6ч;qG'hwtvя;rGGy׷B\"9 ;79 _!__ѯS(П:r y OO"O&O*`߯w^C1p w; {G½CޱxppqwH;&wP찼q!pȸwh;6{ǽrw;F$&Swǝ rܹ"wȝKrܹ&wɝrܹ׹+j*/sucgs8;?#'2w(z"6],.Q|uiШ:|tr w^G6ч;yw4nю;qGCh]H~'RnY-D]9eurbir;vےkCmZ_йwAY.`=_O8ӿ\OkW,}M|Nd{{==de);^s0)6%;9a^1y97zd'R|^Ηn|F[ǹoh+8>-@>8{pveST" H`yܦk-9[nYrZ,If+",[EeӲZfYYY+Q~7vEYFe 7(˛[Ch-Z~#2|8F?HYzg(rveoczI)|Vhθ+wlK?w%g١9t?W[p>冃}R@ SsEHv(xz9[Y-WB?+cзjZwT4[8=TeszXM* `մ^=j84%<Ϟ{td P'rXeE*}7ru!{ ={O½G޳pa4{={OĽG3qT{,={OƽG޳qt{<={OȽG3r!{L='{OʽGzϊըDăDީ&'sUs޺vַss>WyZ7tcs)OX} Oȥz$ssד^raɨ DEsd;~N7Ҝz4{eMf9_t~W=kcl/+>ɾ{}9!~h"aCdK|3}A;d ׁߘ'1>Vp{z =Zq7'{._ݩŹ}څnK3h_=<y;I:sv?omWȾ@o0;-ћ`pj3~p-}?'~f~o!;3t;vsu*g8W*ޓXyN/=Wt}9=O{O=Ϲl{=]{׽v{ȯ{=g{OڽG޳={=o=q{=t{{]oȞ=|w>Ɖ4 55 66 77 8Ks.>5 _eLhJ/omex،YJ2#:Xg^3$neɈ_ _E856[2_6eB8)1;fH.- CJ˘3޴B;cȈ3V|gΈK2 ɰ Ϟo/KFWgv81ʘ]3V6V5Ѳ$#gDo+Y4#͌2,5m_F'g7M2άfgDD޺ <ΘY21 ]Dwʈs_֩ZZ?DܳGVJ_6_i9aR<˸D.D>Eʧ7$~kQxa0^CaG{c^k zAԴJثt_cc^Y˳s^FE:G|=X0codGMnMUM,YbOhW ݱZx^؇ZŲTYsk6eKd^m.e׬eDWb5zNVeb([*+hCo,o5կ=IٓyΡUx)e\G}W@Y]Z+ u^AѯСVYKxF]9$ZR ?s=k7O>a?-_xy2/&ەR?faV?k2{5h2/51y4UV_sSd׿= 4 o~_ײVr &?-/v*GѤ꿒.89gC߇68;k_Oo6"|% Uڈ#Zь׈FUP#ZX#J9K#Br5•;5ӟNl}CoPQl0 ,];4rP: xD{4g2P%_#&/[߿189]iz}\E_̹L_92r( ȶyx+ta1w@qo@T"Rn׈IaVlUgĮ=AMFL>1~Gq;7S<_t#X|>f@m(j 4$f0M'% Kɪs)MSrv܅PLп>7Z/z#/v\O_}挚]=4Q xyX TƸ\o)B;iw%s??p}ׄW &+(7sWf+T+vSB?-7.'"+,Mt 6bigKR6tUWlqm9vN+Xg2ގQVlHtXq l{ QІ6$A]Ԥ9a}[-9IپӔ=9ܝآ /`(6|GlYSl%Ll-ܜLM1lWzM]!39ځp#<9vY}ؿ7?֦<>xȝߋjz`D[=31۳a$l"vP+lmBll~ Ԏg}wv={B9Sysa*׹>C8[NٜwLv͹ǘ .\^S6[Ҡ漭>g=:οQ 򯹹֢]^9qegeќ_WӿWWÿXמLYmݯJ#Uo؛^TझcL4/'~${y?89{\="ҧ0YH3A4%.jJx6RϪgY.8g"ټ>' suF,^u_ϭzٕc\x_ēzh^B 5:E˜XH-[߈7?I9:;4ONxo%3;}ɾ^lξ\bʾrW,f?%1e%u5G[6GBwc ra .^;ΐs1sõl>ELpwAOjmx#YXWux~wo߁C[|fc"F-@}lT\o]yԔ(8~ᓟwye]e\8+}i1&I^Cn H^#WHeJzZy>ؽ&w?1M8ɍl1IJ;fC(m =u~DDof+m--W>?OE?}'MsvG0cKc%((owJ7K 귃W WHޟK[̧$ڡ=EculȜ4'd&I:ufN)T 8 ( /Ǐ F|I+G^ ^s}/ry"Ĕ[b%\\I]rtn7< qS)ID-(I(w?>Կ7G;amƞ<3gE\}G5:ߋw؛3#T9߼' ӨWGbk;$ 7 _ħ' j@+ɩ@M[ex G߃BK&>U?#G6A~h$p s}46ʉzG`5گ)z+N* #チyw99׶SrLz0Q TtXүdC{:诃N5]/z?NQ?yaU/T9Yi s~݊j~%?%ϯ+~6`*>VlW/~9$r;yQwi\$|OEc”,%9˫'ӿ/p) <{R0 :5Ny'CO?˷JaeSq&3`K|"y(:}>S\uى/볕-BN|gSv,l&}/>u kT)eKK>5u<';ID__|փe>?OK+}( /8EzVrGUxZzo|]c4-ag/M!(p."?,JK@S&Qf5 Mrh9YQ@c&ZiH@9VU|߾x0sa!M>X!l!ȣ9o}MmTAz_0eP픤R,Zj>o=CXf %ncw ׇԻO̯\@ $S|Z ~t#y` xWt zk|h-W [mMF;/f]0G`uHvN~ 8gI_JW>m%NsL 4((y(&: dD  4a6gx /ˎ;Wwf^v,p \2T2p=-q_ 4^KXv#%pU`ioo%0?i6#1v:Q>`&D~пC`Kr-n ʢ~K^o;iu/UFu-~|!c뵿Y{> y˳RXT {n",P_@A#!y2߀ /4~ӀJV`|Vd@tDk^x-:2/c:푼w0`DoxOż57S7^a3>Y|:mۋYi>&>Ta}G92W_z>oE`LwR4f?Ɠy32.M_.9_E+σO_~\>YoO&^a;Iȇ>|gHSYOqֻ LVf\[2(-%pGk-+/;9HVWykDOpg͓ -/O/ёgy/|3}DG<-zX' [yDO|j/o/;eZ'g4t#j/u 'oO,󎒜6~ _ݻE<rGyj/O_z ܗ^̣&sOM6sT{DO7_z5Dsr|s%qy7,g kt;$BGi,:/\&~znq=Eg~⯗s^^)<&ܫsn|ls_9 i/VrYH9K@GƓ$Eғ~#7ƓciΙErbJP8~sr~eݕOA|39:9ctLʴvdNs}OϪj׳ƛvBe;]>[ɶVɶ&ye#ߐm#}3;L1ۗ3:?gA{ks ?~\|&K}Y/Y~׸?KY[& GD#RKYǫMCG;_Ne:V,>aupƝef,k,kDU3~?K<|@K<kԎ QSQcjǣ_eh'+H;o's{gkW8v |d%h'\(_%lϵb<+n7RQfaƳm>_(?T?ϖj!l<`c,+< @dniНJb<N^_0AY_3*>ЗSt?n;5ig0P&>yOޓjfPCd=V^x ϣz-&埅DzhG=ލr!sH.QDV#{)_a<ةu`,-~ܟv+28藍 h Lt$:~=ƽ`}^{IN;Pޭ~}PƝz;N}]4;w 7+=/?RQF03O>#JX_=`x>N_)\":4\TvU;Q>AWи?JߒS{MNyxP<?÷Aܟ~sSCzFhytP&>έz-jqGx~\|s\ƓE['?qCQ~<OQo'O|,I=#|^jpHy>Bt=/]ϿQ;ux~GE}ﳼзz O`O 3+zOGES浧*j%=ANFpd}|Q?ֺxJ}'P;O.Nf\Ó=O O @}vOZiO<ծۯ=)/'iשǫ.o,zQ>"~x?ڢm8^7GAyRx.}ŷ'S{&BS/'|]4dt蜂zW3]eC⚇ua5ƃ O+nW{k/r?Lݦ/:fW_tܾuǸ}U~ \qv[;5uN{=pgüt>īЮBć;>Oۿ'~vDb<s'Ɲ§/΂iw$+8kA~s?wgZbb|ҟvw_s͙x/ڿgUڊo{㸾S/}_6qEݿ(hEif}Ve!xƕm(^]ћցlMx6E6M| W_=9I~3WXU%,;%~y6!;gk)1=aa3rp}aϲ<_ϋn. @>AދW~S|~~P=#ZpO9n.PS,Ls=o9'sƟsdpƙs={g7gFG3OϹLr˹i<]DoWEX/].GyKy>&k#=ZUj^i^5^) ~xU?!{ xXuZ~s.'{.PCʵI??gh1w,$޽{= iƒ\g?ޛ ޗ5>owHx[0&z>W5QůDGć\\OӴ̵Wʥi|Nh-|e+7+r*r/ϽIN}Mf ~,ɓK|ɓSɯqsy*K^y}A+櫤v{G]+~~>d5O[~O;p}gƙ sBWɪz>>~+v|u'Xc8+y>9ir~Oaӧ!5eqڻO7Ź:/3z8}zpo$'ֹyzwq.EcG<8[6}4n 79V_U\nQ?y`DS+){M& 'b+$~hW~7 , 8"*֔^o x9o02o[BߒoyW~<ޢh%,,bysz=CN,_O-?, jo ok6uy^~{I灋OyNDᏲ{S:7 }?Y|ėӾ{)__ ُ~+s~kN*iWR?[դeuw'H?yoC[X#\%usR~Eާɣ~S|̹GpnN@!zn?߃[w>/OC7)Iy"]|o[K6spտfPb_S?za } t?%?wsOdy#/t0 š`AQ+%/Gg*%' kOR+_ɿ;Yoۑ߀v;v;߇xXטLÆpS>G>{l_V9o =Ao @>|? :MD_bw>ƙM{~GwQ;-{E~?n~sao~[ ߷[M3oO_oï;͡ufGSv/R_4D\Qٯ4zA3@_~ƑyʾO}t?^!_c+";y2# |,*+(M|_`^> z6=]{{63og<P|֫\r nO?>5#GUe~8L8v& k+ot;0yiUɼYn0r0o~ d cqXYzUvMz-8j2_6xR1`!֋ހuG| "vw?<~I%ݔV@'K?ZswZBx^hW^H})`f4g\Xr X*X{>x1')H%{#L W B303s^se7 PXY| 'ρ%;ȿn9= ~(ɥ@)ouſ:KN'D;Ewfڻ*KnSςUl~  T\Ryt\:d!?Wp\"+ej,T]_@eIÄnRCuOBgſBe {ȯ.JMɧ0S#+_ķ<]z|P| >@x\z|D'j{K0ߝ ~*=~ / > DʯP)C4lHG;d提Q!iiĿ煳4_,^,կdv J!vwC^r/B~gCnɮB@oҗ3c)< .0i'fq] \@ o .C~~5}3/4MzSch>P;4\ e&*I/BJnoHo=_Bȏ֓ mH跷G!w_~7WdUS]wlK?WFbS_( ]-mҋwXI󡧖 OV3xrX6)˄]Xq&?%ba\W?a7*n2毰*ðcaJ{1JPV(iFYzV PFXc)t5_ {{)a:q͟79/l.KX[X;t^&.>݆ͫ%\hW$5aSIQt6 9*.oSex{ aox:Q< F=Fo\%^N;\r g  <>I>]~9x=6//a/5/o·H;N O# %Q/&:"% sKneoEea#bk 5/E|#JkzΌ)~HRvWDyQ")"V}F#^"ڈΚg"Z-4ΈchO2v_itDQV\Q&/}xKqTqTF[jhK{mWSD/CDϢ<6O~ZkBwua7"*̂y"(xz"zkO1Z%b~%b慈OЗUk-+s?joy)7udVÑҿ=y&2Lr,%;,#?8)%F6,E"H>}RC}\%DcJ!"Gڝ&>E~x?I;^hbK"WϑEnDz.3W͟>7#qkFD^F_-vOk9r( (܅|@͏_'$rUi#"/"1AS7wG~dב˯?8<.??S| \h*%[EV\΢"DG5MXR`T=GUH3f!WCr z?Q巢h~x*j?} (DߎsdWQ'wVBǷ~}ߨQ#:拨sYQyWcQ$[{ZDɯEE,9Ehފ.%;]E[ Գh8>$ ??`n)^_t[z=R|~_z=>r^8YPv=c<B~7A^IA=*F:x_jޏ1:n H_crc|Q}1yob?h>bIb\҃1U|>64\cZK1iқ1]pE{ka$fq.c/usJ;+oy{bV'1.9_HE⿘;csH^S,?+/'h|GlT0NrMP~%0-֦~cɧǦVol-JF~,^d?C$$ؙ9Lz;:إ/}NX~`:v:v?v2u,]);]-?N|Vqla{L0|9+= $}AW7.?cSX~5V֬G5Pv`#9Z ւ̚(|fE{uo[hFMw[^#O|ڒMN-!I~UzcuJd+=Wd(;Na/WYRojB~ ZCz-mб]8zDJ|`=8 +b_g5NJ/i*Σ0(GBdGq{xq)8C|\/kZH>qiqm,7IFHKF+.q}*={q)ṝ=;8?; 0⨸8kaݕ<KyeOŤ/%?5oǿ)ěj?>Uז? xCGy)c,#~EGRG'KW+"on2^K_ߖ^ſ'=n3!Hq%DRėS~)2Ⱦ 4oBԓ&%)[ Uo .\@WB)Dŏ L(87 y#/Pma?YWk<=Pt7r|s4?O$4}~}\.+G98(ſy&tN;jy&@qzP!✸3;U^c._Hf qSܴCIⲸ7qcRVC0_T~C\-J-8*>+Ly8? s5΃{$ ȎuW#cgAxw]":C|z<8zx8a⯃g;@Ep/')(CcE%_dayF''>z*B.C# (H>FUK7 HM}Ƀ}A1?;Ν,q.ӾOm/c?F9籜 Dh<|=cH\#b bW3t{3ls豋Rs?;X֗SN˟^I-ŏw}ߚ[za<-x$*No35=Z;??]a]!YWl!GrX+X+>nu䯾wk*޵v$' zN~lJ{7YJ7Ӆ~:zFi=<:B{|oz(|9~4Td[ /'^˧y/{0/xW$S`oJJ& ķ+Uq5ĵ^5#NmF> yt#N3s)qoD|Հ|Ыy-ΏWq~scq9d/qS[uZ?[`[/._7ƕ$,u^amFįY/4%/^/ w`ԞvCWWn]?=.nRp<*~[ze |ُ]P+w 9Z<[[~$;OqXnBXO} r9n Թ#fK?S}9OrՊK޷ӑ-a2빷x@#)gc}{fz~<IٵϴN.dalr_5oϯc=7༃:t_j*^gި VŮj~m(7D^/]yna~?Eݰ>i9MNE.w6~fg1?N,U=&oE-@r/!>ć&wo]_{[k&4ƕx!q$D*'nN(.`QܒPTEq\ /.7OzQzsҧ֓ g;;'!yO'g(yC{<Л +=`;5D< L^y!y"3%x!iܟ$3&O01OwgDv_A~tx%Kē׈O&&ɾq`_!|~vs0#T|q(&a#tDW/07m"[8o7S([B}WU||9ݍ3SOqcF Oe~<ً~]Wp-.UzlhWyċ_q{FF @?an\<+!~;F'd֓(;:Sʫv^oF~ a¢CǼġd\~摂[9_fa>Ƽqى=D<ַKeqm"H~ q֟ La3{}GʯX^ʺ1ֺkn0׳&.Kc5x0q3OYkEΑ9"~w5yT1 =ydױ_YNKߓǐ$Į!0шH]#dx~! G ws"\0|S0u/C_H3v9™?F~'W1=ILw{z4ԐLYL0g1%3q zi~&:ʏF}Ka=7?j>&>N{|&z!>OSo9z"z8zqP|T~+z=Kv=AFG?Fy:a:(;c↨ o//?F]TuVvuR\Q7gdQkQ_j>ZH x~V,7j"j.jqO>KqI H1Nz5T{pA5\ӨI3B4j|y*j懨9Ϩ)GeFvGQ=JQvQsgdgGGFo%7@/cq!roG5oFN oFf"^(N8":#6ɏE#րhV#b;brg"ޕG* o ˈ% 5oDWoUU*`:E~, _l!yՒ=Uc*p(V]f.ai0Gama]~%aUFXS!K0 oVT }$~QWM~>=( /?C~%tR#uTB?tfC:U CGϡ>ÄLJi\| }[ m$?Z5]XYZA -x}0P <OyO(] Bnk> 9/rZvrRy#+Ⳑ!k~ȗZ|x+S9!ˤ!,?DcLa5惐B֓}ݟ"=z^aQ,,>PK?8O?ާq[EWf'GW.WJ_HEGp+]pB\z8\C~:lJo{;Ip !`X58XzjEdIܲG|쐿qX#rN[.ȿYj}j.=>z#.7D>ǖh&)rٵe2~_XX:XډO֚--߈~Knjo,˛q,/KKs"K>Mx&8y J.A<\b%嵵k%H%fMN/?Y֋%)QV~DH ?I|M]nmM,=W|_-GPx8+xbDWZ?_Ŗs}Wl/f*Mr*VFXQɵm(-XZ#=_t){gEpP!/;,j~/ZI[X$O9OE寊ƋE# [ѐ4[`yO_ѪuO깠K n  :sA%3h j)yUAյ- J_m  J ?v ?zö\ap~[* Mj-\d.FygVml,仁u?:Fc_4~mmAg'_: Βϩ~\.Ze~GH~0S ۩3K9ꝅgW^{{,+ Lx.h1mIk^]F?szȗŃ qN?4zNτ>ٹvKp/?d=g)\ma鑽iE&}~=tg/1|{'y.s=¨M^J!;{9ٽ0Inlߞ+(Wr"ȸK^mͰW?wk]ioyv]KPn`cak{HE^@}#?moނv7=zug ce w.DndϤC+ =r|mC~޴8>}9\Nx~Cطç;5w?wL ѮUn=ֺ£@!' O Ekޱ_VxY-k+?ks}y~S?Ǝf~L&Iy~J/? 'I ˈ$E]v*}H*/9'WXrNjs IŧIZ'$M4MX҇Cp$Iy;MևdUr0OrK'$+M~Gz 5/~8U)8$eK;)Zs䔝:s*|C#Ut&v4ѸmgGO3c1pX1_r+;pҼcDsʊ_"~:(>q)8҃sh):ҤUgo*q$ɎD[By.G1٩_p)^wG+g)O'R7Q_=! a+iWXjr\SzP_v4: F{ [L_vastN|_Bn_C-B߃pm|WXУqGY x})? }QH1_XбX٩cYr go_jX }_"#O_݊cۡ[e]U/]q+?#Z‡ˎ48^j=ax(N3J '21OœuݻGsK/<7/! >WH4HXOX\5)>M(ŁFlwF 6JJ^]fRi*>T^F 7R\*H^xеN*U$}{*WT~ѨEywu2|xԨguKk}*uUn0^M&N6- ;vv0:uTFG_:VS*Y VwQ[g9/*wv`CaPatWj@N=N {*1zRs>zCѓ4-*W x/)iF/F+`<1~83Vy*v?]7 z=]^g ~VV]p)Ɔ*oD*o`l vsQ`Pq5{7KRn Cc{WןLD3kWKa)Gy?Z*{fمY*`{r ,~_K=A٭"=2;~ڌQѫT/1ㄱ͒}U.UTa*>&囹47 >TNryٍYSR hoVrZ\o\|nV*cV u'.g<_ZIUޝr~'y^jO  vq?-YӺլ\z|ά*3k*~3k)3!F'˩yޯLyCf5m]뚧vs_:1Uf*#= zч^ˢz5/}df?޺>Py`= =h(i>hF Rd}ـH >{V+rb ~B81p.EGŁ{9޷uA滊Q>FFL ;fx+/\RG SK{yt}>JЇ_{M>~N_L%ٜ2X婟_ ?N w4?p}#`GSo>i To\>A~'N0`<X愩C8O͑cCĆ!>Af *E)N5`3+Of8 M?c-?k*rw9s3*d.^.}|$X^sREe<;q]1zHsvK-]SO]OP^vʉ#N=ZƼ4W9r2Zsۊ/U+|_in~=Bc~{FFoVGs ~ jי|o'6 wW@+gn%~يmѺ܈_-? ޻0&[UK{U^ V0- *e.E8țq,/3__?R^PGo:܆TwFN{O g'^=HCGs|ۂ~a=@懍Åru6Opp{cSyJsw2xw N>C{>W܋=~3?1󞻹ٺ@kF[ߏu?(}8kO%@⛟~Eϰ:=gSkgߓw~Cб<|y1늣ĩG/'Ɏ i3@|F9 ڿ3[e7d^-!ėW?R|κ&~:q5kU+ڧ6/%o6/O02_7?e~ M3z3f#>B3S*c;|yx!/Eכ& ?OY>w|خo>o\G{C?*i@?yGqQ[_XoV%{gc@2re?cO3S2^84)j߿JG'Atz?gvE;oP<̕'rz/\\[3w}a.彝yjV)>uŸZ8i=Wlp4H?^;s@)N3<9}p).rU.(=pҾ]RYLyek :"qVuNDʟ;#Q9Z<3Vy gl0:OBWzO8ރ_O3 $U~8ř~'j,ٛrsP,5T\,Yp7'gY77.I+,'t:;睦S8 ?I:+|8,}SMg(F{g8S;J\~UBgupPYqWGj%?rQ9)3oÏc?&EM `3=V:7UwVqݦ^*,?Y?B}揊:8Ί?3/S7T_|U1\ߕ/sP*:2WbGի"gśZe#NjmsΦ'u6͵LÿTK-Pry(|o }h9>SȆEź`%z//~ ]oD0kX8i9.R:y|(wУ1̛v_k9Ay$:IC9ѧ kD~EA_Hao7pu=s嵜sE+} e>z~FA.!/53o ہ?\ެgz٠W\gi7C}~Icxutc}0x]֑cY+Czyl11Erl>R9 ~py~#Ao]_ a=0x"e} ʸY7K;?tȺg\#F8EL){ v4~΋8g0>s&L3{<9>"ⵅ_y⽅ ﹬/̭ ]7yr&>ynbgssчygvBV>ĹcY__.!XF}w 6NS?$0kp6aЋ-E! 넏:\|B7qڇvo碏i\-bbqۜO;U> /3ʓ7'p"O ߤQ!&LuN>r:u4(;Gߎ2t&nwDi~n{1w_}g'9;?#Ҏ цu@+%-u^L6η1N M:0'Q =jY >%kH>yFʏ:.yģjݼ}HӔu%jCӎ6'͇ks -[F^?깶GwV/7:;?:H^vݑ[G/u.9#?v-_!JaVZkqnμܔqA߁Kj!gqGtY!_sԀOUYT*]]կBRq𾋳tkޡ`u3uۺѯYW~kf۬-g3k Gq6g}B4ڒey֔E?uvdtO]Sg鎝~{`G= |I>z֛Oud >Hwt҉nL<ڑPGֱ`ݯ.JC\ԇL* 9oAP#FWy<녉{&=cߓ/;juMW疜c]u6亥Hj;s'v?DaA"vD'8 E;s^D/o\..1?x2q_g3DoΣ:%su}{@zLikϕE+UW6T!{qLYyWN͇.`_\yu>̕_'+Pqi*=0Wp2&t/qE(qEX+.y/JrҼ*R2㮲:*gqjUj =sU:U.U%?몧xU.}IWm!\S? T ?+*㪄|Zk} mlJ=W?k)PˡK/&.t);wAo6nrkJzUb7g]~qš/VG<+R}0WP~Z]% \Aʳ jpP~T򧾿ӹ|sW+_r+/qK]f]zhЕ%$x/_|Re)/~+]9rR@wy( iO}{Cv.yoG#H|{5]%/}NuWϯ/\#y|u7S _u-Ƿ9ty.K{ɏ\no852\1)8]y78Ӓ3ϼ^8DI=Siʻfh5C5_k)/u}YG)r}A,ae\ޠ_e_>iO˴ێ~߅X/OUy%77%߰Zpڷr|:$>}_ѓ r9fqW~GX7L|~. ө4/O-j?3"~*K z&5RZjBPvjZRyRR*ZVT RŏSSt>1QTꔜR+*NNR+ǂZߧVVW%Zǥֹ:@kjf96T,8P66Qܟv2<mø,fa3SHmx+K-LMӺ#֑Km#ozKt~!u+.Lm*vZ/ {j܇o_N|dj@]MuR;Bt|ڬ%|ڸ5r!\*~Hu\j%R+)ZQR+jI~\LMѼQ >:3r|{x}+ NRKuS)NNz 5F=5ZmjȭBwRRbAjS ԂKI^P:"5ɢ¿ U?Tp uYjS?_HͯRj@S> Gr)J^ z65;yԬ3zyI<3Oun1yOwݓ~CKp$pM7ȋ]#J|t8:[9hgH^&]ɗcvWV\\7oa=^ ] u:BrYa%_K߈.hik~s~Q[GGeC:_گɵW6]{ =/vٮv.Xmߵ9@>-CxzWxS&? e;< o~߆ȧN~?ѵu^䲏<֞:t=_޷C >X~Oޅ`;P>m'=ڤ\7*~qg\뉳OY~ϵqljD{@vrkΟ:TW؟ùR7@ZA߁3d_]6Ao0~[K;H;~vHkǺbwa߇WG5*Mޅ?Y:|:o TL?g5W\spg7zj5 LS)'@dֿ'1yŽG:> I]׀z5@/^̃=u_wd=\mCmZ7iuAeghLFnHQqȫ!<1& Mt6PY zge?2P\u Я**kUi#Hs yJAR/Ry>V J^ƅ^g%6:rn: |I7](u rYr9ˎ.t%OI$<>o v$G07KVaqeAzbs]%?JG-ZW~5qͮԳ}W(dx_NqE{D#O#hCYgbhߏc)d^ #oVJB~8y_<~U/wv>bb 7?Ar_NӹT!/ H;|+LEoÿ_yo8/@G.\[+Co(r܀,*^ǮQyuR8ε (:0qEtnU{(F[ :S8#>Ok9xsrG9Ww;~q)ΣybW7ayޟ`~!Cp`qy>S؃ngG8q>`=}} Ns;zu=y-ﴅs͜87qr37sN[䳎ל>&2'Y~J)LC'sr{2 'q~=N|eѾs- <%߳uޜ==ԑsN:q޹>rux:H5yLo^曼wIι&PjwF3\Nq*{9Ϲd[=V//d,顼By a;j|WycIPm޼<"]?Fd~yLr|s,×CsCz;י/A٭tN_2w 9 vRq͔6Vlr٘Mzȳ>Z}zl8wK]:W3k)/eTެY]O WV`VjVz¬xǸl|IqqQ78-=7Nid ꜛqTy+'g6ho:أxإ0N鏱]c,al\J߃/_OQ/4+tLqTy3cֳƢ dc1GNيz?@1A-}+X0F?#tNPZ?CW (a~OqSowbt]z;o '~;&ύTU ~3l۲smHP~h$1^s٫QWDQ=|Q)+kҨhïTͻZ#D{\AW5_T^̨FZws*ɾJ_E~ʨUG51j=W_y6M4\?{^<2 F+-{FkaFǔuHSjŮܡciagΊ3.t9FO7zWy|ևF?_Qc@1sKuF{2jg/ F[0sփ:jgFp=ו5Flz.(;~Q)jb\z9v~D]aZCWA/<$8`ny~ѕnegm>7ޙF-Mѷ:`W\g~Q[mcFM|uQ?ZTQ>ȨL5 }F] )2l3$+`p_7u^x]*s FzkeQ>ψҾY\*c> Ri?`*G5SҔO(5u^Vȅ}/C裧F)*{(.q<;njqUKkٹ8|n58j~s쓿uw+ة?cp6,8֧ WhԱTyOGfR꘮sIˎc Pp+?ucJA:?81PrpV\HW~Up/m%ߖu4TQW~Q]MG%鹃{:R9(뼎-}S%:"[ )"#8|Ȯs~:e7,#̥1/%ܑM3S*DqT#9)o)& Pg楔_JR≔p]rRŔonR~-ܤ|`z)kLJKY݀)t.eJߥ,LY"|,̑ޤ|$;I_R&*2F2B\p_0wb[JoQJw-Myџ֤tS) FJpaGCJg)'Hi.?RO9BamCXE*&;K)s)nNT+%BypCI~GQ=uIJHv-YAS +O)S|dg){NSJ~)=Jx5O.}HRKxQwywQH>"?|H|+P[J!&oLNFY׊ےL^ }HHJϒi~O/=J}d?%~ir_%;M6w[+[H>ɭ?Jn~^Tyd'7\\Tr]\G\[y* +{SH&t9~ZM4&;H=؋z3y S'./J:z!&ԒMϸzчʇi*@1TFœwda1Or'No_%g;>k^M&]y٤_un-tJ#~\ <,tvJUI˩0i'IZ":h,iռ4ŧ\ߓ+NLkdӒ&Q{@+iLҸ\$G^j#i{I}R_Oy>igIo)4@rJ޴5?$uSK &%+NJkdkBW$ROAw2NIoe_Iпn'I*6)FjMIOIh/H~"IRW~')$O󓲡WG'e;"ʊ/$S#٩ڱLvho-=ߐiyPzhY~~H}߾[lߩx;z6HduGZk?<}nSeߘJy+_u}RXfï:?k|}* @O$pmO;}dg'w v:}j9L.5߮=ySi6!rl>4 ^ /]uz]s|yx{k;ľ:h޵w)Wҵ޴ޝvѧw {cG- v5; zC@qhp*hcr~L=qD <8p/@Y}_.mYq}&MAPoL=Bp'r?=~4Qx\IS·_.Sl?x U zzWo(߄ZOyyD9۳u fnf\/.^Sz~8ڏzDzBA&yw;ۤu}?f37ҟU^wy_`J}і+ZwΣ_dbRV˒dI%$??)P* UR qp O_?ǸO.࿎1ћȱ|ǮW*cBŝZg0nß̫yy=yCt쓰w4.4 {E׳W,uYTLqZضOMojمmʶL~6Ry;[O[m=tɶl4}[nc_Vj'm5UUf\ [284ؒu[ٕ2{[IlVُ-xg[,(E0'aWuVNvY(~ ȸS>ԇ~CKGzi[k>5Czb % |l+Bt t/ddm[`>B?6_ ܲ[NŁlZOh?/L,LDme7-7'llIl)79LҀm.FE||h~c[U ~-N_['mγuE+>˶aӠF }6}# yDY7l۱ ~wyzh9gȿ/vܫ9ELpXbs ~cw}§Ӳ<]-ENKQY\?N}-A}Vmnc;ٶ>|߁?y ğ@(_`mNl?q(r 8mZN.cwǗp}m=3u =80ovPmq1.晝A6Ywo?WW_"Gƻ̓ >0 >bOβgZ9Ϲ!3n|ˑef\ϙq_eDO==2t&K??n^=5VnսKݻvKq3_xdVX eGemWnA~n,fO g\ϕz_Ƶ"ey?] 2(34a') "1POfMn"oen=5}CAܜj: ~IQO`J@_P&(IZD1nСfP 63'ij{Ki[]J_#>Mj6bl,d>MͨZuG[)('vs.*uYŨ=G!"GTTu ,;#:@YPGȫG**M J[H{k\}迧ǩ&lSjmѭͣCGEeSӅe~VeW!/͸HbUyoϲq gҸn mA6ّ;d/dq@ߋMͮe6E1I'YT}JIy5$vW8ɷo;d~S;if:Q1ƿƟɿ6Jf y&g3kW8;/|HAlߪL5Gh0L_:QRr#cZ,w\UGho`JU|AoE؄zIԃ/fz5s|Tzr[f%L>izkqdC&I3/&MAu!&|YNgj!a;~̡gZ9tV!1J [YIdAc>f7Nvfv#̲FMee!ZX,VvSYEn*T6љ}An9sws&ik;8}yo~{x?{<\y_6Fm$N/;C1nB/$lͣpK.Z]Bv.K9֞&zWrRq Y|ÑomخEx6`iϷ܇8+7d/nB:n9sΫ=Mum^+̷ˎܷ8o .y9ƕCפ87Ņ-yi9cw} cyA+W+yqrs}>>MwG^|? 3|_}al{#}Ү~bOʶo9ӛO\ȑ89?yI{{s]ԝc^GqGy}/ŗRO9X2|'9O|=)7G}I/])8m])BOm%/ES`99 1=)O;Z<>f9rڃyeaO Q,CJvW}83/=ޗm)%Gc>prk^|>|_0/ry.3 |r?Ŗ<)އ>w[0Ol2>[rtxങNYxKj}เŸrkcėu){un"gΏu [=Ay~|YOXX:8Wh?[#NSMUA9g'6~U~jU]dA~<pDQ^p>xm}m_C\h?wP Oxϣz}Ę:Ѳmc; k#{p居r#qb7/֧@l!cF<Kkl/ƞ+>c{ZǪ[{b+Uƺ zS{}:9~qS\=syl03ZyCwz3GoRƌG;_u}Vޫpڏ1 _,M;4˂Bv=u;Gt0=r9~rϚO{g'`'d'b'fN;utU|B"b*Uի'F F F F F F F F F F F(F(F(F(F(F(F(F(F(F(F$F$F$F$F$F$F$F$F$F$F,F,F,F,F,F,F,F,F,F,FE1*bTĨQ"FEU1bTŨQ*FUU1bĨQ&FM51jbĨQ.F]u1bŨQNƂjndVLj554|C 74|C 74|C -0C -0C -0BC -4BC -4BC -2"C -2"C -2bC mVswv;t|*Wa^3xg?xg=Vz.z{llvs?`?߹eCM,y9?11B1lmC"ade4/data/jv73.rda0000644000176200001440000001275112576021756013302 0ustar liggesusers= xTE/I8r @"HdL dDYtW<]P@QApY@@#+ªr{!5S.{TUWUׄ) F7P%\p'2\'LTn &%Ʃ/hEp(j^R>Fl+(=tzZv9JOOX+@+TzW+97ȇ99ClX̣`>Kۑz>ёM o`γV3!0C֗ϧ'x-y/?cI=z5C-iǵoԗ}wt\~_\{|{X >r3'];֛ҡd!紾Lpwd7COUr|/C/u^4?o^au˹qQt~vb@ >H;lSYØ)ON}(>\7T']O?qۧ~s =i{3{wɿ,O>~~9E0r|Ԗǖb2̅`P\Èd[(KD1R$i8[Yhg%{A5i^i/z9GawQD$ $ =;aN,%ⱔD,%a iiiiii!84F҈CqH#i!8aB&aB&aB&aB&aB&4F<҈GH#i#x4FH@ H#i$ 4FH@H#i$"D4F"HDH#i$!$4FHBIH# i$!$itGݍVtt=I9h}Aj+_}ڛr=a@p0ge~Sk2b7G?էR<մ\0vBSOS88z>P9'[g~`K=kg9G#GR,oDԗ'q$#7zwէX[D?ʀ]')NO1w'dӧ}k}ڟ~Jǩx0PKP͙~N֟bߡ zD CkZa:./J Gi7+ ]"B~"{ۄN K(q Z7_% W)yɭJCY;!I[SXХ)X9)~`q`^3Lh{wnZEŝHd{EF\cf̕9񽭋HKj"nR]7.r8Q"51wn"[lR]QCWC:"X4n y߯z}&V!s<=)V1@׋;+k䳞ͫ?lFv ѕG#YG\+`kU%mԃMg1 \?Zi]7.2{ѫ\SG[zr׿?_~`@{ٙB\ l{f+WGٷ|gи tmKW.?c2CG)_W>g6^kjB5eڿO?ָԔ\\5*@`N\-f.=7,]uj)L!QWq Zi{:Vkca}޾ 헆k;pqPS4ʹlt}5 @pmٮ,P!8Sr.;V$rp{Z8⽁йz <x0N%cB2{~.v<sN 1\S?jsӵ )Hy^nmg\'\ߢ=(ձ4 dduB(23PRK+ÿRS x_]Qz5=OZբ*xW ?РŀΉ|1Gs֨ 9W 4jѿT|Vxosng2Qi {6Eqt{"/ 63;b4RoG8jf~_֙WuƯ|]Í׏E7_3{ypܛplqL,ς>֭(tT,(O[07Bű)wA#gUS۞oh?ܶ%uжN0iވXSxɑP<\~,ͬ_Pp^em5/Y[7 (7Aϯ:Cpߡ=EqѦm|&OoFl^0_:l:Kl_CŁ_Z Jg'>p8Opcq~J= Jƴd8Vݷ8C/!kD՗q8GM/ZENu.6d[ڜ\/l`]6oO;r,-?k;p&?7wK O6;d;|?Z2|PбcMf{襌= _}t𙉐Ւy3A0F&f<~`F+\w!U!BBƖ.sߧ|70@/#>YUlG:ϋFM+!cz0@#mhg}AH?C|F.{gG*Wrw+\r4fEYo-6΅{ u}[#7 }>؟rwW]08~\]x*V á3whpYT?򳩽b= &pטnPPCKVZrױ;U ߖޑ\.F^4u%WE0%!妃?gbg{ {rFŐ}baqƭo]F5N#`r}7 烁w>~/-?do8dtžq=Apa2 s183ꌳZlɽ+4"=Z4?]tI6զ*(.h~n*47J6de(yq6hT1ϥzCQY^B }`C0k;>saWTn/ [{]ϔ9[[Kfzh9r]Tڴ͝6f@PzFm/ys4TdzAylLmKwbts6sAq#_+YΖ}  cx0ѸE w7KJCg9om&վBA>}ScUhv']"^3c6Y>um!+dep2f.rS-׮|E_[ܦy3払G;:Jмn%꾼&u`kzIwQyS咛$7\Q~0GF5p5s5pEJˮWu=fdr]dl-]Qe92k3w1}ˬ%]VqU?RRb/r RԻ|k/ً,AtSnL2RVYKe {\svyI"ZQGfe+umɑhS^.-ȱqu!V%F"'{q`=`Q78qKWﻡi/0:Ey~Fzmvut*x)y;֍ 7q/&w'm8o'uwmDoXc9(uz'oTuz%R{uN\/䈟0-/-I]9Iyz2N}k%Nՠ)3ǿ3P?i%ՠeP<E?NW.O}T:uE~{I?'1Ƹ5!~oq0oQߤŗ:_f]z? 'D\Pwg=~ qɳ.ه'K1(þ>뇺`~Xo񳏃+Fɇy]֝ǹjP?zB\+e;&9B|̿AA9zd7Nr ^ezG].QhNC}eo;|7(*y=?/ A}?n ;D|O^YPK?Tq'gǿ=?.8C+쭑$>J\'yU/r7#ye}u6C{Uܒ/X?tMy>߅b:o/S6sm=Gq (M zvǿ'x:ol'cRC|>zzf}b֑WF[86N?xؿn+-}u1amZ8zo>nM8?*/qBKSq%#)2[Zӟ4>=y+/?~HxXW|O"_"/߂٧$oA}*_K7߳ڇ ?ѫWqԉxGvȓQ;6QOȿmC_Yzk!<]oo7G_mdׂ;vm9_1y^j{/(Ng[>_Ýoz87}䮚]nZ|ʇg^sgGϑCA== #/|plpt퍝ga}`Φ+L?|<xH0\+(h4:4*hZT+U+S+WPTV0RaH #F*T0RaȄ #F&L02adȄ #F.\0raȅ #F.B0 a(QF!B0Ja(Q F)R0Ja#0:#0:#J0*aT¨Q F%J0 +0 +01p\LI}<7'쵧N؜M^=Aɏc톷6s{1s1uhWiݼFkVkmlv7+ǃqO/OD>G~~ =mPk̈́y9=f8ٝPL~_ٿx &ade4/data/casitas.rda0000644000176200001440000000163712576021756014141 0ustar liggesusers ]o mܴGecMZMMof5j"MH;ƘBT=o/Q%Q2((:=_\WE5K!Ou*ZV?TvE?Q'v5HNb|ּΈ.2aAb>#7tjY6kEI *JP}1 Kp:!XCwԶ<]UQr ST)JՇg8(&JkZ놤kxAn nw0Ƣ'OEq|)A5H*JPTME5TD {m#JǢ[^1jvFW SԜԞ9]&c+ii~GCemԆ^=ށhU|b/))R4Zn~ƹkan׽u뤫9zh٪zvo^<)PSU<ͣkVwm9!<(5CƹDRGp:uKdd[brf=<X>c,55L:[g(+ݓo~m!XP rU'W|2׼|B8' 9!(çf:z JR?Y~GɪUy[o$+H*wWW巳l}~tӖnF糛\dn ?MQ]@gCO]xshK;Wͣ6h$i>t M:wC2c K 4ԂYt^yj~tlZ`BSujAhЕ/[fNQb =I-hz|fclk~|MNM9G|79y]>PKW!'O3aᙟ!|w?ag: @x[g@~"~Z2B0{Aѩ@]㝽'߀y/QF=Yc<>1_&ɲ'^8ڣD8^@d5¬L"~rtk{?Ӝ'HߠAGw@tW UbN#p;/S#Ĝ9s* |\>$>Ԕ_z2d6 )aHFy8*jB]43+ H$8~5-w }Lpc?-@3ƒ(Kq!d\o4i4s4ݸ$ 08Z=vuxPƦ[5JkG R*.cMJi%1DKX֫'ũ[T) krZXKVvQFǪZQXC~!Cfh$l7N xTۗrKop#&05Qͨu[F)X:i6оXSii}UdudTӍp`)SㄊXD:2`q^4 4Kx\k%ڍԤn+"GяKa&:Pґ5J4@ҝ>v)'*K =p ASpU#4f l u)0:JZK!v Ϛn)A>:RFvf<gwшk Ktc윁@rv'76WfҺ_`+A498 c܁?Ǩ) g Bne9öIO<勏A}4wLlYKI'%~EL~ ,"7/{Z۾LYx}Cɘ\{B.S_jfB <_1sK wZBNNrɤkW /WN ? rʏp`XbpqhjOFU"nj* km ZD~a)8rlpM ]I0?OIŐ fZ58.; g';E;+%n\P0H*jC(,7ts皅5^iҔ\ /e?m }/ݮ?<!/NU"͆c bV~1!*M !SB2@@x+Nȯ3o_> a^}!t,wL`vnwO-l]Wm[?; ۚdWˡ;{xF=mxhXOL{Yw(7/yǤ2.T_ >"Y=i&}n%21uv{=u7/YWֶ:;ά犯ȏcp#Սv}*ݚmDB~P3檙P5ӄkяiIcd< 7v5j:Pda}8ʛ0={2;*l'SAjT< ,=XF'`"r0ԑ1Hgʠ"l hPF+U0 #;6Tݰ2V9J’9(AHmNA2xP%<Ata , $j CVJdcPV}v4Qg]*%Pv>B^Y$!D&!6N eG+T,K(&kbC9vJPHPɎ- RHccإmmX m:W]IUFчb%@VsNd@ji?`&Bade4/data/aminoacyl.rda0000644000176200001440000000643712576021756014471 0ustar liggesusers s\{/Ү_W7K_Į$ sHW8V *#U¢$yo©j9swt;_Yժ5{IV?;'/R|I4f.Lgq+>?=޹gsݨqJ?Gxw'>8<؍_uvQgS-vǩm{RL'y4:;U}{Rϩg)QgGKl=)MbA|>JLʢwwDw *y{OEʩm{>:tT>/'=[WǸJI 6KNh=jDkޠ+p=G>H4(Ht'ѭDHt;B9_Dy?&8Vk6mK۟-%ZLh?D=H4(M7nDD Y>Lh'Q'v/AȓKgRѳQ>|"HE-nuۋۋۏۏE[E[E[E[E[E[E[E[^ ~{o/^ ~{o/~~o?~~o?g+ɛ'/gC?I/.${gφ&|Ϟ^I>:;O5sI>tX??zś'/ً!A R6TS6k8Mzެ#N9mM[,qcyh{~nc^|7^S1ʼL:Wȡ)rKjyYyQjap', p4l\6uFFiS9ui9d`B&-t!ӂ ݵX<^9?]bGy5ˎ-tvJ>v~}Y5/G"ϊox;_>z٨\Ϫ<\~ {KK9쁆/yϴ_4I#י}~zS>oFEFKrO yo;-kQs^.c֩f/5{ۣ/xZ>e}XqY'#ux|Rgj"SR:{Ӌ+sй1pZ`ueA<zSA~MyS"p*I: 5}$ք7qBOvYsn)αV2c`҈alY`5O_Q]ڔNy{e [5.ulY'`<Ü]9Z78~.27i5铲 G5`KӹC. dKڢg?H[ O,ygtrfX1mV|NL=O8qX0ImߴбÖr3W|3- z;M ^[W,,~T]_ :`!vujZRÆFe\-ivAjl18ZwY1/x-?:l7G.}#0l,3&,[Zy|gրua>bZCCfBxVl=DR9p-v޳2gvo899MY!1kyP䍞?0_ZX+N߲r[IaYd n'`wg|_'W-/]?,Ǭ9X".}2xys֩mo?r۴8GIņ`ג-9ms(r 81q{Y~^,p̩Z)sKS9M8,/T o|+R7;nY, f{^gb'ϬE|Ej[S/Ikah3Vse?#jzo[9T|.k汲~.86TV-:=r9by dM]4 jBv9b_NK(s7϶-0En2U͒, \>+e7,OԞ;ߙBm P~R%1Us{={ lZ&gs[>ojPfq9bxIKbrNx;> %8}~[6!uk?ăw[TwyH,#rULk?/+յR{>'eNĩ_Cؠ1e*e-mvVqa7]o{Bo {܈k'|"/ֽoήB[-96<>,X欿٣yU)f#}|ܰko1>[j+$~8ޤ-> aMd|+}Λ8 -Z\1ۖXd_ؚ2N X.Ća<٦.0Ƙqq{Ca66k7P1 We9K'("{Usi)A՜+_9ka CkƊ]~dlX`j f^[-X `0qf pcn<دlL&unY`Ƕ=ι7}{^_}KuYM`Ӥˆˋ'nbm}8L[ĒU-l Mz/`WT} Jgk2>R{Xy&T۳Ne??D0,C5i 2wmTw= bfeA Bփ_pʅ֛.?t\{[\#|B~ɫ#WV`<|ce4 yqʅ`1u岳\[qMxUw3ץu#|דљ\֛1Kzk9X rI]n-WXEy ")WE2ގu ^ '7'OHn/KZuj]݋)u'Ο=d|%i_@ڵ#f)TN, h0]!cvՎ! B4K2vdL!/У(nqfy.AO9Q`Of ?n>s]>ENaz n-S.A!fJG2 HRtF&\W:.D1=~b{~]*D8I)>1> I&cTW΄,qUىvC͠P|Wnc).k(i }TO}Y=|xd`)kSk|^̢`y}ǎpgz$`0lYLj_U7 W߮e=W7G~En>fYv?{ Z}J"gZ=W,X–S__ EhLx@~9 ߷m; Խ~'낮sA@uca_3~q(_I4;~g_¡q"\ /ݝp|:kOP 鉵[C.Vl_K;/gZkL0+6-#uűO@z P7Y?'!Ӡps)g@tV}k@ d,ܟYI끝sOL3:CB/H y$ҾuE~l~XnH)9T܄\Y1#4=\hXs;qrPAD( un:XԾ7gs^?<޳]PzmiيT2ch&z&TfO?iRH7v}=-nXv\]fc;"S WfęmwI[vhꍉދXPN9Vp_7v{|)oPkY[ ӛ&iOj_w̏e}4#`>Wf`q3ucPTz+ͽPM7 /]h(oؗa[Zx/7fǎLAFDmEr*#HIzRD*9 % $I@IR J(2! 9d!CrȐC2!9!G9rȑCr#9ȡ@r(C P 9ȡ@r(CJP"9ȡD%r(C ]Q󕤶q-U,qGopI~< 8FUF2c|,vf=r+.|; v.SÄx.\GU@NF"XI0F'_H!N/. N7=APН?;C,wJ %d]&؊w,qXF&ީws-."3 28.c#+͏^;ˣ׎KȨ>WGF{?`qa‡e4iuK\F}QEqA0఻M.pu$~1`?}Lkɺ-A˵anqU&g@\jj/{Mv[8KD%q[7䅼ade4/data/microsatt.rda0000644000176200001440000000505712576021756014517 0ustar liggesusers Zs Ӗ,Ŏ,v*#OGMv6ibMf:LmCJN  pHL/-nb?0.J9kGoٙo]V/=݆ân{+S5Ow7e/\34z+8Wę',:| o9n\Y\yL_nR=fhDo+UK}$~:qѯ1<#\2}JhsT!7~龦z^gYX{YIG*)Eҡdj`6B;w 6k31YM]eqЇY~vG\c<}Ce?{oh={KS0f> C۞ft7ڳ/+>po.ybP; ][;,1<~_?6oMS|Mk.wYa0U*7 {~@>O",p0^bU5`\\} ƃc=ߦ1y xe\. -ߜ޻ҼH9|}y_.[`dd /iumޤ\fkX߅^8h ya>1muܥ ToLdc[x?h?}tB}X+h/_Xnk;E*H0gruK: +~~<0.xM qc66)ᅲqV\cȜ HFgb8aƿcrg<&僧^s70~`cRYR\)Rt}}?aw1 ƻ8bN1xlz?炱c۷J;8}^x+{YUxvB~e*ܹ\r~w_VXo񁪱 s)Oh5oKᭂQ L=֜UWDŽM_o><۝BFSQsguϽ7BZb3,p>1fO`{9y1}(~c+p9~aBۭ}Bl{mA؏*崿#^ ww|:7J ܡ{ٟq9XxPRSm}9 溢djMi]¼R[ x΁fRWct0*miJ,[4/a,Ƌׅ%=j1P}ئw0 xi^5 q óNJpo?8wzbHM%ñl EKN;7s cܸ|cZ4 e8feX+3șA ւ\pNn8e[e[e3 g}hHCF+dvC<C<CPܡ;kOoIbU뎞szr;d?t^կӳ K;8y~90pۣ{u䟣jt{G(~9C?8p[CD){?}=9?}ϭ՟^Q/^uNyVs{7~\$0< ThoѢ/ zJӂhL2z/A1sN<։:Q'+?t(N\ĉs8'Нvx9ɸZNr,'ɕI:$r@Dw萈X"b%"XD,e~s\mX["MOKD,DFKE,TRKE)bDL\{p  Ij$'p 8l4 "L2D,S pIݏ'Ov7 Dl{?0o%n:뼡^hwF_ ,Nk2ade4/data/bacteria.rda0000644000176200001440000002237412576021756014265 0ustar liggesusers7zXZi"6!X\$])TW"nRʟXaqjnj-&Q`ҏ WXƳ؊׾'b+X汚?*zt< uRvBTc ad3[&pkQ9@3SqZUl[w'z}b"/k~"{vNtOĽ7ZM56jK}:,TkJ-Ą*3BsOu;5}]^KDe-RؒhTP8Frws^8=;#0KW#ֽ,PFҭ-GMhcsZ:f\@inZ~žбzi_+M/-H3 }MjGR$k^ּa/)hx)RgP (U]MQ)DrtT{=cp$;N| PjPF? K{ltuTI-׆2N!0En&T!&&gȭx !'Seb0wpH&΋zJ5+*ʓ 9F3i@ʩ"?|zP^ˬhyB$%X8ImEYS=m%{4 K M9mhڿ %8eVquNɞq[E7F)a+xmz {\ F_,*Q 3gM} IەxE@OGAX0x*C&Zvce_Էҩ@}+.GFf"wIC:BHdE`N* ]oD(4AЫ#%~=Jj8zˊb : S~-$O_']Cw飒/ܱ3 L苽6iCnm=6e\X?mM+H*ˢú:O,٥O:0(!H()Pe3unlvz4u" ۳stĔ%:pb$g3pdƻL[zɾ_? &F~!_MT7x:/c)e~zm׭m Lur57!'K3){)_DA9&Ή9Qt,o;NmǙ"iXZ@䇸r,` nO8}::`uP0=5u1p'q4)S]|>բ\|(P,46 Mǹ-%đ0A:gJX?2>qZXn3Pp1TϘ{Vֹ($_#[ y}]$Qf]+6y~ݓsiNٯhbĝ\:ȶSoi8ǩOZ&]t"}yYnb-Az(RCSQDxeTbPZuUD$r/TfnUmԴǜ  xJqn}n:)UG֊_d$"W UEz;/D<ݨ QRLԴ6B=2]Pr>ܗst-^!m )ؤŬ48r >YկCS7cAZFpK5Nֲ3Oe2 V֔+dgGJ1pW0_ WmZߖDnx$lyX@i7qUMOYX/;t F_S)+$pk)8&7$2Ᾱ2AT_1[mߩe[]>ߔ+L b#aSDוnLbq@F_ w u#є*i^Wd<9_: ZhYXď,g{M#5c6p۠_e ߶n=y:fuQ0ÑrnxGXS(:(h<,pM ʴq۔Fs=V,z4*ldfJz nh'sjFbBIX,6`>w9on.Rʮ!Fok^aY^X*Ґ»F:sv 8d܉,[wFj9^2Esv.Ɇtyu MO'l1'vljSI|`Qh3wYIgxXIaT,yi-~n͚!Ujh/ |Wfԅ[ơq\z_n߀v ]ޞIYhm|?-^'~"Cd䴥.-ıq "{Q]@fy6 D ZWQ@69FTa)l:KmֲƯ!蛞hI“[ .{׊&2ӊ۸p 2(>Wd;nj2Zp {DVXPq ߿ S;|1*2ۉƢ-V/b*ݙg&5 ci} |w66\5npRdC{ON)o8uqAbi׵Di^Wv$i゙UnB/ HCMi2Ӧ&30Ìu ciVcđ-W̽/ʔ"=ź<;>c`]1z}C%.!yՋչ$'YƙuR!cFCQqPur f/8F$ͫO1-EBg50p/7C&lk<\ԵɝY&Os -5n(SU_@rƙaVrO;^;/|b!Nq@sy̲(XۓDh"UZ{]{Vs뵪ud܅V*Q͊ՊeEvnI2kҀBН+c񡺨z=/9y!fxڪP5b|DSSCw wKACUs܃tu_[k9vkj_XϞ 5!x1c~g)n0@œ>[i [gq|ܞZ˫KI,id/Md?و?ug]_=PKlXm.a .^$ B ܣC>%(,8_CN^S\AK-y%Κl`t'XMv&YT c ZeTuXWddIg jP| b)k{i~abO#vTRg0p:xUPUeEPpL'@p//j4JV`{}K)~\&qT-ЮAPCke )a.uL_c ./# LRMsBGi9N!x4D[kM}ugum"(g\Ձ6]|$1f!j3֯, +P´28;v0|kQ҉> ]YunrNKl!u tҔPɳȟ잍7Ahj̍]]Fay_?vЕ iDU)LLwq \Gȕ;<Wv5)>B!!tD ja[I͝Gdϻ"mcBSegSV/%ꎋr ;qwI-mH/ !PID˒Wa5kyCkB6#|$/1N4 ♵ :G)+@W"-*4;2+I!3Y)3}1LңC(Kh]6{lY~8 xѯ}=Ce V-&@`8xf^=fS9OHpN1SDH_ g)7;sA4Ĝm w}{niz]isi{ٷs1(CyNV]1z77UbݛZi%B-s;kS* ()Iq:\Y>  a {\s&0|`NsC| Qo0!_ż7Kx<%v 4bg,Z&Xa1oٛ=~/_b ho(r(tymJ:1k>?2f^`Үm[]A}&jI\7K`-mxeaケ~ CY#|5 lȳK5.~1 S>UѨޛ8^tܚUC/ֽ5p[ i5AqdFI-;) ʲ\g@pOQ) F)E]bz +˪]"ކKr}9CsFO<=7ukI0I*>n]`c18 -#W%7=>|Ed}fbk`%B· b(3#&t;Z iMCGdmX2@T{VGGO 43[. ˟+n7ab?v=/U?lwjMq;j::5bӐ鑛8Y> Zz>0N9}x%ji57)*,`'DkpVTڵfkVKׯSCQ@L皎U\uAN^(v#߭ۃ}%N@jӷZCE=: ԲVƜi9$Q1+yĮ2r+0kX0xð=o;Q&*/hV)KحC=)c-^,H6ݾV37rC/t=a/>55b"֢ZKl3-+p#Jǁez&[ Rˈv$yCBuh{2AVh9_(@ c>q#fr5OMY Ju:ωف'tugx"U^ 5cڜpůN ɷ}@D-_8Qh9Bڸl %F ӏbJlZC4ǃtrUB2ĈR + 3@*Y"`mNDeJȰhUrSu{/meijp, ꪌ]uS! /DYfC͌:{/U=v(hD.4uM'o҅s,I/MRLz e(J$W J,Oen}nf~%Pc; mX5Ai ~-]A.2ol aGhieMMx!(ATa^l< 2/#1xdAݰ9 B'2$G4%+Q,Aly`uI-8*C41>+'1R),gNvu%I hBDpj87W,oz²K/v*s*B:r9m&?` q{ ̩r&_Q㠖Ldf>ZZzV8JH`WeYp i :aU#XpakmyR;-.%f7? ,˲' ′Ir?07I& ~\%j̸[K‹LŔ  =qLG87eR\Npz&7aV53 ǂW/nȫZWhՌs:XjŠQVm_-DrJ\e[/|Y22LFbٔ* (>adFt&#)vnqo܎Y+~Sf wO1sHI Fxyr,㼉e$[nlV{M(ʡu#LaqIVK"Pצ}S LEJœ+Jo{+h$u;FV-$#AtHNT'] ж^N?<̙k:b|Ahfkg.m7;҈qUY"'{3Rrx PҹGUKb M&F&ˮQ^]HVYݱvyw(&6U[ +ЧB>Ri} ,5[!Ho@rOJcҀ'ĈyWWg(}8JlK@¬xeoljWmİ:D,Kv5`龐<ԉOw]HЋ~V.x}.za2XA`4?98016h/8ˉ[jNiVPv錑 B@/ksjyeA|LQ`O_kek/; R:5}2}XIgpzq/~Q832]AbNpmV{W/' E'z<8h(rLc{JhQxw0rQDKE6buj3@!z1Ls^PgV&*z{ʒ( 1;;d?d (x()ŅĢ36( pɥ2#.,¼j1Sfg8Lze$fnQ@.JF0;s"WtHKcNU}/A/('GHLSY2ൢtF :YnJd^P'?r6;rY7ZEėT_4D%b2\x;\ 㙫k")Օ,SPD-8YHo ]EFRG [ȖsC8[l nW*ÐjIRnXܹK׬B1e@v#:AbR`v{sa;z)n {" ),FYS 抋35.`v wdd镨|x-X~ڿX1UR 1N%8xƢvfg2GGFSqקtyB 2HϖIݘ(>0 YZade4/data/oribatid.rda0000644000176200001440000000703112576021756014301 0ustar liggesusers  pUu7/B!+( 2o0!1V/A$/ZԶӏX89ӎZێ:X˴*"B'}!᧶Ξsٳgِs2s;c"&T|*%2&T/Ҕx1P<"MvÊEZ l_$W,?<@k*y܋E*vٶc   0!N2tNX#=dx`.}&yuYQv*!eLP~dˁv惄6k6qY0k"&CД$4 snֆw؅̲)Zy~IYD%qX\lHN\6bǛv |>-ag_ԏ9َwa9۾ ~0cOfg{M93%ФHos,IL[L6q/>ڌM(Yf9!Z [Ci0hH#M%}$m >,o'Ҙb3OܳL 8 }֩&?Wyxz<cnfř(3ɗ XqŌYv*A ){h=d1KrLs9ia6=(ڃzƔMH}2̃viO40|:t8 .i,"3 xӄ}:zZ&$|?_JuԾ 0:wIpn 4Y~Hs|ap$zq\:OƬC~Ik ȍAs@Y H9dX!Rd.`$+~?xrD&ܷ裤~fd%:aB]{ Q?~>/5"u3p9Z So@/~f{HEI.@^ir]4fJEP`g/0R%l,=YhN3Yƻ4fCh}vO&<|(Ǜg=0e7;Qw8ތ'u6ytftdՏNGq<(OSgꄱѶe|;d`gf?.i3XG~ƁMrX,8#S/ fھLqx\Տ]*!Ӛ;mp$D$s3ߟQnwK;G14GglהmKc#~A!ۊ<1 7f LCc9.l6}Kw3`㿱d) #Qz>K;2''S0#w5|{ =@}flGv48  ,m?U$ՏŒv6 Gڌ+,f|1:OJO{\bKgg$}R ~ofs|Wou2o7;!oS*![AxTs*kgG}Ņ&wc^80g Ɗ1_4{쾛!= +[L< %LoHwf6i2PYLsllXg#-HG/ϙcJ|wxD'ϔc*ޚdkjz=[[WaY-To_7v55rKk3ׯd֬GرP׈uZj۱Xq?1._m,Mnújkv$7-MD;Ɂ~-֫Fn{k+ek\W۬gXornc/w[,^u}>6-J4=֫PW- ~cz.'\N{2vM;MEnN 1гCKZ @yA,Bc t\Х.t)K\4<_k~ïy5<G@h#y4<G@jA#y5؄IA!SaY-D|6'3S&gutG[c zzz;Gkh=˯y=ͯ ~.yk?4Wܓ=K+7t𚑣u߽/宊+~0ͫ m %ws~\>UJ6yK >ڽzy:vW]MP|Wy\p 9}ޱę>[ykݼvڭYKKx#C5|Ž-~W핈O}Y^}72O >[=5(f̫KߟK^zhzxe0ncCe۫S\3o͏7˯W|VJ(|T0_~Ap1r(g7]+f#G+=|jxrWP_;YͯJ魪-<\^ߔ_shtoY)>fZ~TvZy4'Xo1">xSJ#!;bӵsMO><{ӻryy·xS(ڣ9|GMBn8>e0|bϕ*=zQjS1w|O EJ_;҆Gސ˸\ܻRt,QhXm/;fJ?{$ ˮ;9]/){ݧ׻.NוGrGgO+F ]TWR4!|6+h:ut'\2܈qNqN>w youD4Di 4p?"|R s~@]G9ϔ#P?2nGM/r5}q =A11or@pCo 8rݎt4cn~ { wqQN+Nhrfʳ@~7sQ0y!x̧>%'S>,gݙ ,3C]|3R_ |J?o>+2oxp ca|?9Gm#:EO,1)Ŏ*@ade4/data/bsetal97.rda0000644000176200001440000001545312576021756014145 0ustar liggesusers =iwFrC%:h]slĜ4ŕ#)Ygsa@ho1V_;Ơ j1H;J]}TU|7Vknغ Z7wxC]#(wIgYpQK:K\U'w;?rBBVpI睢(F>͓h = {B.''T}40j?IctYiA%Jb(6sbn,bKܡ;GWn61pkEsx' 5jЋa~'K8 d#4,Oۋ'&];\͓,GNb/Μw:QŴ3OUF^SObK`ٷȊl]'L AE᭗I7;_:\hox98<8/ZQCns b!a%dnEؼ:8(1q~AlΆHm;.̪1E &UT|{FVoL655 z7}sNܳIf b7_y׋D0:"pq `!'/ \el٦Q荜>tfc_-V荗8Ղ‡b^f04Kk1X 2$bJ0evQd)ZnI-o摗 a~%(r(tv IX'Ơ'oAۺBM8:g>00t'Z8z}6I@իvGШ u{2Q[.Ȱ>:FM>4?;D!LChS 3A*Y2SIG_#036 F:psj Ү&JE$. `Cb/L}t:| 1CҰd#-ZcMy{6xI`C<.=F-Y.d9ˣ(ɦz,U N16PZFz7zŘ]p `)8Dwte˧(W)qtXvljB(O7'jT~$9+"c9G`J't4:Ή HImtg^M;!fqP%gNr181aFzJ$= Lpk nBZ38/ `Au;'#}"e1]_/ӽ &IW$u26ي"a*~K9ROє֤ ES2Ė]2TV[q7:9ɒV!?Cu&b-PoCqO}PA7 IKji&& 9y|}auxNTLnmq& <+׎;,| ~[ @a9EU JKjwn2?*PxV+%•(<|BPxk5:x@Bx0?!S?cPxvCQ~l['(Pxd-s9AsA.™wC.V{pKRSeK9#qOΜS (ׅEF]k#.9HhwQ*-c%7ňq(M+6xH=uKl,8afjM m3KaS'&Sk'M4Bx i }~oԁ41L^܎L- fl ^ܚ(IFn2qWjCl/yD\xXR6!={rrc89:7>ytgO^O>>=y$>99.w$^˾OL]B, R&_;ҋkGu/8}|6l>?/_>|6lg/_>5`YXeh21KHbe mҎΎ5ElMcYTv.}Ls9Md׶j-@@LUöID$?O4y2Աy<3ou1Y7>q_x:U:Ns*ٞ,`'sϟZX8U~ʏ ԍn:F_\Mu7OS݇URoVCya6~1pgh^âMns>9u(_~pe1͹7ݕ9_K/ێE Sv)>xMmʖ8EcTOXcpd0ٞ-M'bȍ4>JYue;4N.[4.\'9\ӵһ%W͋m} =χ\\8ōay2m&x},6ZSsUpou2I +r^'UĝƶQU} /ׁ{F2\tQ2(**=J53&qcӕ&MwݷqI Uzj'yR}OE*ݚMtd{V(0ɹi-Vq48!yh~,z\4>Op>EKag&n~!Vo Xݟ{>VuL}뻊Gl  |g Uq U2C/~9'# ?Ħc3ʏB:9S}n^wL>'7FKm֜qq*Ŷ@gzŔsuMsq4L~UMjsZns@|W&}jgJۼsB*vǂi4^56SWM`\B".庥\)vKRnȭyAwIG;$K{(fR"%.ɫOtEKH|w<|e~f}UvYYyKķ{ş ((7rJ Jw b]JQ^NT3l+57JR$߳-We?5VOUR=Q]S}:P">\'u=]}@iwF|mwF|mwF|o"]ķv.E|o!Ԭ_ GwwfkoyH_?+ b 27 {K%7Ɏ_d.;rCw\b&+:ognA(hj }6Ţ6,0*Ͱ.>aQ<MUfFly[jLMnUO0mޖV6Y>rL7}|Otۅ-old՚b:/*1oE3E>g n_5qõuuѶraAeBkj,2AcGGPj5Z=-݋\ՓL3himy7 Md68VuqKn/9=Im+'5~MU猶1=icvM f1Y*ff\6m2V/NI׍`ہ爁?/U٣Eܺ9-^YW֥oVugfIzS7P1S[h3U2*3CD.k9{0]z_츮lO4\Q l,IzUl}miUz:ϭM4?zlIc|tUGgO1/sʨq|(CԡBB90KbC5\0?I&@Ec#1Ry| dB~$VE[[1plʦdنopxh*EmxIyqu#7;+w2I)dB,ZkQחI&l;3Y☋\VAb\7m߁gEH4m•ֻd+iYU} Mc6JqQc}ͳ\9X o\1 p=N@.jbg[݉8hj2mC9ڎyGb 2O4uwnn6ظY&TE&ytlUiLM-ˍ;Trq0Kt~٫[o(iN˒ zWbx~aWe?[-b3 Lk8UUǏi)gqDZԙoN7]o@ה\R=+|obΦ>ڶGi_ G`͝kc:u )kޕ1nj>$_Ӻ>Iڄǁ"x,TVHƀRd7t=GܘdX9ul1ͅ>4HT4g/[R"U| 'z'~?]JQ%R%%&{2%.%yR"%ɫ) :^IRBc(a䧦'؋GeJG o댢X~h-'9R>B0L ʵd^KH}f隓(' e' O4oO^/U| ƋF > ^E.oQ%ɫJ"Jk/<'KX)њ4{%l%uF2#5Yv[˭=WiBU H&Wzade4/man/0000755000176200001440000000000013553312514011644 5ustar liggesusersade4/man/ktab.data.frame.Rd0000644000176200001440000000255113021372261015053 0ustar liggesusers\name{ktab.data.frame} \alias{ktab.data.frame} \title{Creation of K-tables from a data frame} \description{ creates K tables from a data frame. } \usage{ ktab.data.frame(df, blocks, rownames = NULL, colnames = NULL, tabnames = NULL, w.row = rep(1, nrow(df)) / nrow(df), w.col = rep(1, ncol(df))) } \arguments{ \item{df}{a data frame} \item{blocks}{an integer vector for which the sum must be the number of variables of df. Its length is the number of arrays of the K-tables} \item{rownames}{the row names of the K-tables (otherwise the row names of df)} \item{colnames}{the column names of the K-tables (otherwise the column names of df)} \item{tabnames}{the names of the arrays of the K-tables (otherwise "Ana1", "Ana2", \dots)} \item{w.row}{a vector of the row weightings} \item{w.col}{a vector of the column weightings} } \value{ returns a list of class \code{ktab}. See \code{\link{ktab}}. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(escopage) wescopage <- data.frame(scalewt(escopage$tab)) wescopage <- ktab.data.frame(wescopage, escopage$blo, tabnames = escopage$tab.names) plot(sepan(wescopage)) data(friday87) w <- data.frame(scale(friday87$fau, scal = FALSE)) w <- ktab.data.frame(w, friday87$fau.blo, tabnames = friday87$tab.names) kplot(sepan(w)) } \keyword{multivariate} ade4/man/ktab.match2ktabs.Rd0000644000176200001440000000324013021372261015250 0ustar liggesusers\name{ktab.match2ktabs} \alias{ktab.match2ktabs} \title{STATIS and Co-Inertia : Analysis of a series of paired ecological tables} \description{ Prepares the analysis of a series of paired ecological tables. Partial Triadic Analysis (see \code{\link{pta}}) can be used thereafter to perform the analysis of this k-table. } \usage{ ktab.match2ktabs(KTX, KTY) } \arguments{ \item{KTX}{an objet of class \code{ktab}} \item{KTY}{an objet of class \code{ktab}} } \value{ a list of class \code{ktab}, subclass \code{kcoinertia}. See \code{\link{ktab}} } \references{ Thioulouse J., Simier M. and Chessel D. (2004). Simultaneous analysis of a sequence of paired ecological tables. \emph{Ecology} \bold{85}, 272-283.. Simier, M., Blanc L., Pellegrin F., and Nandris D. (1999). Approche simultanée de K couples de tableaux : Application a l'étude des relations pathologie végétale - environnement. \emph{Revue de Statistique Appliquée}, \bold{47}, 31-46. } \author{Jean Thioulouse \email{Jean.Thioulouse@univ-lyon1.fr}} \section{WARNING }{ IMPORTANT : \code{KTX} and \code{KTY} must have the same k-tables structure, the same number of columns, and the same column weights. } \examples{ data(meau) wit1 <- withinpca(meau$env, meau$design$season, scan = FALSE, scal = "total") pcaspe <- dudi.pca(meau$spe, scale = FALSE, scan = FALSE, nf = 2) wit2 <- wca(pcaspe, meau$design$season, scan = FALSE, nf = 2) kta1 <- ktab.within(wit1, colnames = rep(c("S1","S2","S3","S4","S5","S6"), 4)) kta2 <- ktab.within(wit2, colnames = rep(c("S1","S2","S3","S4","S5","S6"), 4)) kcoi <- ktab.match2ktabs(kta1, kta2) ptacoi <- pta(kcoi, scan = FALSE, nf = 2) plot(ptacoi) kplot(ptacoi) } \keyword{multivariate} ade4/man/pcoscaled.Rd0000644000176200001440000000207012576021756014100 0ustar liggesusers\name{pcoscaled} \alias{pcoscaled} \title{Simplified Analysis in Principal Coordinates} \description{ performs a simplified analysis in principal coordinates, using an object of class \code{dist}. } \usage{ pcoscaled(distmat, tol = 1e-07) } \arguments{ \item{distmat}{an object of class \code{dist}} \item{tol}{a tolerance threshold, an eigenvalue is considered as positive if it is larger than \code{-tol*lambda1} where \code{lambda1} is the largest eigenvalue} } \value{ returns a data frame containing the Euclidean representation of the distance matrix with a total inertia equal to 1 } \references{Gower, J. C. (1966) Some distance properties of latent root and vector methods used in multivariate analysis. \emph{Biometrika}, \bold{53}, 325--338. } \author{Daniel Chessel } \examples{ a <- 1 / sqrt(3) - 0.2 w <- matrix(c(0,0.8,0.8,a,0.8,0,0.8,a, 0.8,0.8,0,a,a,a,a,0),4,4) w <- as.dist(w) w <- cailliez(w) w pcoscaled(w) dist(pcoscaled(w)) # w dist(pcoscaled(2 * w)) # the same sum(pcoscaled(w)^2) # unity } \keyword{array} ade4/man/s.multinom.Rd0000644000176200001440000001027412576021756014255 0ustar liggesusers\name{s.multinom} \alias{s.multinom} \title{Graph of frequency profiles (useful for instance in genetic)} \description{ The main purpose of this function is to draw categories using scores and profiles by their gravity center. Confidence intervals of the average position (issued from a multinomial distribution) can be superimposed. } \usage{ s.multinom(dfxy, dfrowprof, translate = FALSE, xax = 1, yax = 2, labelcat = row.names(dfxy), clabelcat = 1, cpointcat = if (clabelcat == 0) 2 else 0, labelrowprof = row.names(dfrowprof), clabelrowprof = 0.75, cpointrowprof = if (clabelrowprof == 0) 2 else 0, pchrowprof = 20, coulrowprof = grey(0.8), proba = 0.95, n.sample = apply(dfrowprof, 1, sum), axesell = TRUE, ...) } \arguments{ \item{dfxy}{\code{dfxy} is a data frame containing at least two numerical variables. The rows of \code{dfxy} are categories such as 1,2 and 3 in the triangular plot.} \item{dfrowprof}{\code{dfrowprof} is a data frame whose the columns are the rows of \code{dfxy}. The rows of \code{dfxy} are profiles or frequency distributions on the categories. The column number of \code{dfrowprof} must be equal to the row number of \code{dfxy}. \code{row.names(dfxy)} and \code{names(dfrowprof)} must be identical. } \item{translate}{a logical value indicating whether the plot should be translated(TRUE) or not. The origin becomes the gravity center weighted by profiles. } \item{xax}{the column number of \code{dfxy} for the x-axis } \item{yax}{the column number of \code{dfxy} for the y-axis } \item{labelcat}{a vector of strings of characters for the labels of categories } \item{clabelcat}{an integer specifying the character size for the labels of categories, used with \code{par("cex")*clabelcat} } \item{cpointcat}{an integer specifying the character size for the points showing the categories, used with \code{par("cex")*cpointcat} } \item{labelrowprof}{a vector of strings of characters for the labels of profiles (rows of \code{dfrowprof}) } \item{clabelrowprof}{an integer specifying the character size for the labels of profiles used with par("cex")*clabelrowprof} \item{cpointrowprof}{an integer specifying the character size for the points representative of the profiles used with par("cex")*cpointrowprof } \item{pchrowprof}{either an integer specifying a symbol or a single character to be used for the profile labels } \item{coulrowprof}{a vector of colors used for ellipses, possibly recycled} \item{proba}{a value lying between 0.500 and 0.999 to draw a confidence interval } \item{n.sample}{a vector containing the sample size, possibly recycled. Used \code{n.sample = 0} if the profiles are not issued from a multinomial distribution and that confidence intervals have no sense. } \item{axesell}{a logical value indicating whether the ellipse axes should be drawn} \item{\dots}{further arguments passed from the \code{s.label} for the initial scatter plot. } } \value{ Returns in a hidden way a list of three components : \item{tra}{a vector with two values giving the done original translation. } \item{ell}{a matrix, with 5 columns and for rows the number of profiles, giving the means, the variances and the covariance of the profile for the used numerical codes (column of \code{dfxy})} \item{call}{the matched call} } \author{Daniel Chessel } \examples{ par(mfrow = c(2,2)) par(mar = c(0.1,0.1,0.1,0.1)) proba <- matrix(c(0.49,0.47,0.04,0.4,0.3,0.3,0.05,0.05,0.9,0.05,0.7,0.25), ncol = 3, byrow = TRUE) proba.df <- as.data.frame (proba) names(proba.df) <- c("A","B","C") ; row.names(proba.df) <- c("P1","P2","P3","P4") w.proba <- triangle.plot(proba.df, clab = 2, show = FALSE) box() w.tri = data.frame(x = c(-sqrt(1/2),sqrt(1/2),0), y = c(-1/sqrt(6),-1/sqrt(6),2/sqrt(6))) L3 <- c("A","B","C") row.names(w.tri) <- L3 s.multinom(w.tri, proba.df, n.sample = 0, coulrowprof = "black", clabelrowprof = 1.5) s.multinom(w.tri, proba.df, n.sample = 30, coul = palette()[5]) s.multinom(w.tri, proba.df, n.sample = 60, coul = palette()[6], add.p = TRUE) s.multinom(w.tri, proba.df, n.sample = 120, coul = grey(0.8), add.p = TRUE) print(s.multinom(w.tri, proba.df[-3,], n.sample = 0, translate = TRUE)$tra) } \keyword{multivariate} \keyword{hplot} ade4/man/procella.Rd0000644000176200001440000000344412576021756013752 0ustar liggesusers\name{procella} \alias{procella} \docType{data} \title{Phylogeny and quantitative traits of birds} \description{ This data set describes the phylogeny of 19 birds as reported by Bried et al. (2002). It also gives 6 traits corresponding to these 19 species. } \usage{data(procella)} \format{ \code{procella} is a list containing the 2 following objects: \describe{ \item{tre}{is a character string giving the phylogenetic tree in Newick format.} \item{traits}{is a data frame with 19 species and 6 traits} }} \details{ Variables of \code{procella$traits} are the following ones: \cr site.fid: a numeric vector that describes the percentage of site fidelity\cr mate.fid: a numeric vector that describes the percentage of mate fidelity\cr mass: an integer vector that describes the adult body weight (g)\cr ALE: a numeric vector that describes the adult life expectancy (years)\cr BF: a numeric vector that describes the breeding frequencies\cr col.size: an integer vector that describes the colony size (no nests monitored) } \references{ Bried, J., Pontier, D. and Jouventin, P. (2002) Mate fidelity in monogamus birds: a re-examination of the Procellariiformes. \emph{Animal Behaviour}, \bold{65}, 235--246. See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps037.pdf} (in French). } \examples{ data(procella) pro.phy <- newick2phylog(procella$tre) plot(pro.phy,clabel.n = 1, clabel.l = 1) wt <- procella$traits wt$site.fid[is.na(wt$site.fid)] <- mean(wt$site.fid[!is.na(wt$site.fid)]) wt$site.fid <- asin(sqrt(wt$site.fid/100)) wt$ALE[is.na(wt$ALE)] <- mean(wt$ALE[!is.na(wt$ALE)]) wt$ALE <- sqrt(wt$ALE) wt$BF[is.na(wt$BF)] <- mean(wt$BF[!is.na(wt$BF)]) wt$mass <- log(wt$mass) wt <- wt[, -6] table.phylog(scalewt(wt), pro.phy, csi = 2) gearymoran(pro.phy$Amat,wt,9999) } \keyword{datasets} ade4/man/fourthcorner.Rd0000644000176200001440000002233213050632301014644 0ustar liggesusers\name{fourthcorner} \alias{fourthcorner} \alias{fourthcorner2} \alias{print.4thcorner} \alias{summary.4thcorner} \alias{plot.4thcorner} \alias{fourthcorner.rlq} \title{ Functions to compute the fourth-corner statistic } \description{ These functions allow to compute the fourth-corner statistic for abundance or presence-absence data. The fourth-corner statistic has been developed by Legendre et al (1997) and extended in Dray and Legendre (2008). The statistic measures the link between three tables: a table L (n x p) containing the abundances of p species at n sites, a second table R (n x m) with the measurements of m environmental variables for the n sites, and a third table Q (p x s) describing s species traits for the p species. } \usage{ fourthcorner(tabR, tabL, tabQ, modeltype = 6, nrepet = 999, tr01 = FALSE, p.adjust.method.G = p.adjust.methods, p.adjust.method.D = p.adjust.methods, p.adjust.D = c("global", "levels"), ...) fourthcorner2(tabR, tabL, tabQ, modeltype = 6, nrepet = 999, tr01 = FALSE, p.adjust.method.G = p.adjust.methods, ...) \method{print}{4thcorner}(x, varQ = 1:length(x$varnames.Q), varR = 1:length(x$varnames.R), stat = c("D", "D2"), ...) \method{summary}{4thcorner}(object,...) \method{plot}{4thcorner}(x, stat = c("D", "D2", "G"), type = c("table", "biplot"), xax = 1, yax = 2, x.rlq = NULL, alpha = 0.05, col = c("lightgrey", "red", "deepskyblue", "purple"), ...) fourthcorner.rlq(xtest, nrepet = 999, modeltype = 6, typetest = c("axes", "Q.axes", "R.axes"), p.adjust.method.G = p.adjust.methods, p.adjust.method.D = p.adjust.methods, p.adjust.D = c("global", "levels"), ...) } \arguments{ \item{tabR}{ a dataframe with the measurements of m environmental variables (columns) for the n sites (rows).} \item{tabL}{ a dataframe containing the abundances of p species (columns) at n sites (rows).} \item{tabQ}{ a dataframe describing s species traits (columns) for the p species (rows).} \item{modeltype}{ an integer (1-6) indicating the permutation model used in the testing procedure (see details). } \item{nrepet}{ the number of permutations } \item{tr01}{ a logical indicating if data in \code{tabL} must be transformed to presence-absence data (FALSE by default)} \item{object}{ an object of the class 4thcorner} \item{x}{ an object of the class 4thcorner} \item{varR}{ a vector with indices for variables in \code{tabR}} \item{varQ}{ a vector with indices for variables in \code{tabQ}} \item{type}{ results are represented by a table or on a biplot (see x.rlq)} \item{alpha}{ a value of significance level} \item{p.adjust.method.G}{a string indicating a method for multiple adjustment used for output tabG, see \code{\link[stats]{p.adjust.methods}} for possible choices} \item{p.adjust.method.D}{a string indicating a method for multiple adjustment used for output tabD/tabD2, see \code{p.adjust.methods} for possible choices} \item{p.adjust.D}{a string indicating if multiple adjustment for tabD/tabD2 should be done globally or only between levels of a factor ("levels", as in the original paper of Legendre et al. 1997)} \item{stat}{a character to specify if results should be plotted for cells (D and D2) or variables (G)} \item{xax}{an integer indicating which rlq axis should be plotted on the x-axis} \item{yax}{an integer indicating which rlq axis should be plotted on the y-axis} \item{x.rlq}{an object created by the \code{rlq} function. Used to represent results on a biplot (type should be "biplot" and object created by the \code{fourthcorner} functions)} \item{col}{a vector of length 4 containing four colors used for the graphical representations. The first is used to represent non-significant associations, the second positive significant, the third negative significant. For the 'biplot' method and objects created by the \code{fourthcorner.rlq} function, the second corresponds to variables significantly linked to the x-axis, the third for the y-axis and the fourth for both axes} \item{xtest}{an object created by the \code{rlq} function} \item{typetest}{a string indicating which tests should be performed} \item{\dots}{further arguments passed to or from other methods} } \details{ For the \code{fourthcorner} function, the link is measured by a Pearson correlation coefficient for two quantitative variables (trait and environmental variable), by a Pearson Chi2 and G statistic for two qualitative variables and by a Pseudo-F and Pearson r for one quantitative variable and one qualitative variable. The fourthcorner2 function offers a multivariate statistic (equal to the sum of eigenvalues of RLQ analysis) and measures the link between two variables by a square correlation coefficient (quant/quant), a Chi2/sum(L) (qual/qual) and a correlation ratio (quant/qual). The significance is tested by a permutation procedure. Different models are available: \itemize{ \item model 1 (\code{modeltype}=1): Permute values for each species independently (i.e., permute within each column of table L) \item model 2 (\code{modeltype}=2): Permute values of sites (i.e., permute entire rows of table L) \item model 3 (\code{modeltype}=3): Permute values for each site independently (i.e., permute within each row of table L) \item model 4 (\code{modeltype}=4): Permute values of species (i.e., permute entire columns of table L) \item model 5 (\code{modeltype}=5): Permute values of species and after (or before) permute values of sites (i.e., permute entire columns and after (or before) entire rows of table L) \item model 6 (\code{modeltype}=6): combination of the outputs of models 2 and 4. Dray and Legendre (2008) and ter Braak et al. (20012) showed that all models (except model 6) have inflated type I error. } Note that the model 5 is strictly equivalent to permuting simultaneously the rows of tables R and Q, as proposed by Doledec et al. (1996). The function \code{summary} returns results for variables (G). The function \code{print} returns results for cells (D and D2). In the case of qualitative variables, Holm's corrected pvalues are also provided. The function \code{plot} produces a graphical representation of the results (white for non significant, light grey for negative significant and dark grey for positive significant relationships). Results can be plotted for variables (G) or for cells (D and D2). In the case of qualitative / quantitative association, homogeneity (D) or correlation (D2) are plotted. } \value{ The \code{fourthcorner} function returns a a list where: \code{tabD} is a \code{krandtest} object giving the results of tests for cells of the fourth-corner (homogeneity for quant./qual.). \code{tabD2} is a \code{krandtest} object giving the results of tests for cells of the fourth-corner (Pearson r for quant./qual.). \code{tabG} is a \code{krandtest} object giving the results of tests for variables (Pearson's Chi2 for qual./qual.). The \code{fourthcorner2} function returns a list where: \code{tabG} is a \code{krandtest} object giving the results of tests for variables. \code{trRLQ} is a \code{krandtest} object giving the results of tests for the multivariate statistic (i.e. equivalent to \code{randtest.rlq} function). } \references{ Doledec, S., Chessel, D., ter Braak, C.J.F. and Champely, S. (1996) Matching species traits to environmental variables: a new three-table ordination method. \emph{Environmental and Ecological Statistics}, \bold{3}, 143--166. Legendre, P., R. Galzin, and M. L. Harmelin-Vivien. (1997) Relating behavior to habitat: solutions to the fourth-corner problem. \emph{Ecology}, \bold{78}, 547--562. Dray, S. and Legendre, P. (2008) Testing the species traits-environment relationships: the fourth-corner problem revisited. \emph{Ecology}, \bold{89}, 3400--3412. ter Braak, C., Cormont, A., and Dray, S. (2012) Improved testing of species traits-environment relationships in the fourth corner problem. \emph{Ecology}, \bold{93}, 1525--1526. Dray, S., Choler, P., Doledec, S., Peres-Neto, P.R., Thuiller, W., Pavoine, S. and ter Braak, C.J.F (2014) Combining the fourth-corner and the RLQ methods for assessing trait responses to environmental variation. \emph{Ecology}, \bold{95}, 14--21. doi:10.1890/13-0196.1 } \author{Stéphane Dray \email{stephane.dray@univ-lyon1.fr}} \seealso{ \code{\link{rlq}}, \code{\link{combine.4thcorner}}, \code{\link[stats]{p.adjust.methods}}} \examples{ data(aviurba) ## Version using the sequential test (ter Braak et al 2012) ## as recommended in Dray et al (2013), ## using Holm correction of P-values (only 99 permutations here) four.comb.default <- fourthcorner(aviurba$mil,aviurba$fau,aviurba$traits,nrepet=99) summary(four.comb.default) plot(four.comb.default, stat = "G") ## using fdr correction of P-values four.comb.fdr <- fourthcorner(aviurba$mil, aviurba$fau, aviurba$traits, nrepet = 99, p.adjust.method.G = 'fdr', p.adjust.method.D = 'fdr') summary(four.comb.fdr) plot(four.comb.fdr, stat = "G") ## Explicit procedure to combine the results of two models ## proposed in Dray and Legendre (2008);the above does this implicitly four2 <- fourthcorner(aviurba$mil,aviurba$fau,aviurba$traits,nrepet=99,modeltype=2) four4 <- fourthcorner(aviurba$mil,aviurba$fau,aviurba$traits,nrepet=99,modeltype=4) four.comb <- combine.4thcorner(four2, four4) summary(four.comb) plot(four.comb, stat = "G") } \keyword{ multivariate } ade4/man/sco.class.Rd0000644000176200001440000000503713021372261014023 0ustar liggesusers\name{sco.class} \alias{sco.class} \title{1D plot of a numeric score and a factor with labels} \description{ Draws evenly spaced labels, each label linked to the corresponding values of the levels of a factor. } \usage{ sco.class(score, fac, label = levels(fac), clabel = 1, horizontal = TRUE, reverse = FALSE, pos.lab = 0.5, pch = 20, cpoint = 1, boxes = TRUE, col = rep(1, length(levels(fac))), lim = NULL, grid = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0, 0), sub = "", csub = 1.25, possub = "bottomleft") } \arguments{ \item{score}{a numeric vector} \item{fac}{a factor} \item{label}{labels for the levels of the factor} \item{clabel}{a character size for the labels, used with \code{par("cex")*clabel}} \item{horizontal}{logical. If TRUE, the plot is horizontal} \item{reverse}{logical. If horizontal = TRUE and reverse=TRUE, the plot is at the bottom, if reverse = FALSE, the plot is at the top. If horizontal = FALSE, the plot is at the right (TRUE) or at the left (FALSE).} \item{pos.lab}{a values between 0 and 1 to manage the position of the labels.} \item{pch}{an integer specifying the symbol or the single character to be used in plotting points} \item{cpoint}{a character size for plotting the points, used with \code{par("cex")*cpoint}. If zero, no points are drawn} \item{boxes}{if TRUE, labels are framed} \item{col}{a vector of colors used to draw each class in a different color} \item{lim}{the range for the x axis or y axis (if horizontal = FALSE), if NULL, they are computed} \item{grid}{a logical value indicating whether a grid in the background of the plot should be drawn} \item{cgrid}{a character size, parameter used with par("cex")* \code{cgrid} to indicate the mesh of the grid} \item{include.origin}{a logical value indicating whether the point "origin" should belong to the plot} \item{origin}{the fixed point in the graph space, for example c(0,0) the origin axes} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} } \value{ The matched call. } \author{Stéphane Dray \email{stephane.dray@univ-lyon1.fr}} \examples{ data(meau) envpca <- dudi.pca(meau$env, scannf=FALSE) par(mfrow=c(2,1)) sco.class(envpca$li[,1],meau$design$season, col = 1:6) sco.class(envpca$li[,1],meau$design$season, col = 1:4, reverse = TRUE) } \keyword{multivariate} \keyword{hplot} ade4/man/taxo.eg.Rd0000644000176200001440000000211212576021756013505 0ustar liggesusers\name{taxo.eg} \alias{taxo.eg} \docType{data} \title{Examples of taxonomy} \description{ This data sets contains two taxonomies. } \usage{data(taxo.eg)} \format{ \code{taxo.eg} is a list containing the 2 following objects: \describe{ \item{taxo.eg[[1]]}{is a data frame with 15 species and 3 columns.} \item{taxo.eg[[2]]}{is a data frame with 40 species and 2 columns.} }} \details{ Variables of the first data frame are : genre (a factor genre with 8 levels), famille (a factor familiy with 5 levels) and ordre (a factor order with 2 levels).\cr Variables of the second data frame are : gen(a factor genre with 29 levels), fam (a factor family with 19 levels). } \examples{ data(taxo.eg) taxo.eg[[1]] as.taxo(taxo.eg[[1]]) class(taxo.eg[[1]]) class(as.taxo(taxo.eg[[1]])) tax.phy <- taxo2phylog(as.taxo(taxo.eg[[1]]), add.tools = TRUE) plot(tax.phy,clabel.l=1) par(mfrow = c(1,2)) table.phylog(tax.phy$Bindica,tax.phy) table.phylog(tax.phy$Bscores,tax.phy) par(mfrow = c(1,1)) radial.phylog(taxo2phylog(as.taxo(taxo.eg[[2]]))) } \keyword{datasets} ade4/man/mollusc.Rd0000644000176200001440000000337713021372261013616 0ustar liggesusers\name{mollusc} \alias{mollusc} \docType{data} \title{Faunistic Communities and Sampling Experiment} \description{ This data set gives the abundance of 32 mollusk species in 163 samples. For each sample, 4 informations are known : the sampling sites, the seasons, the sampler types and the time of exposure. } \usage{data(mollusc)} \format{ \code{mollusc} is a list of 2 objects. \describe{ \item{fau}{is a data frame with 163 samples and 32 mollusk species (abundance).} \item{plan}{contains the 163 samples and 4 variables.} } } \source{ Richardot-Coulet, M., Chessel D. and Bournaud M. (1986) Typological value of the benthos of old beds of a large river. Methodological approach. \emph{Archiv fùr Hydrobiologie}, \bold{107}, 363--383. } \examples{ data(mollusc) coa1 <- dudi.coa(log(mollusc$fau + 1), scannf = FALSE, nf = 3) if(adegraphicsLoaded()) { g1 <- s.class(coa1$li, mollusc$plan$site, ellipseSize = 0, starSize = 0, chullSize = 1, xax = 2, yax = 3, plot = FALSE) g2 <- s.class(coa1$li, mollusc$plan$season, ellipseSize = 0, starSize = 0, chullSize = 1, xax = 2, yax = 3, plot = FALSE) g3 <- s.class(coa1$li, mollusc$plan$method, ellipseSize = 0, starSize = 0, chullSize = 1, xax = 2, yax = 3, plot = FALSE) g4 <- s.class(coa1$li, mollusc$plan$duration, ellipseSize = 0, starSize = 0, chullSize = 1, xax = 2, yax = 3, plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) s.chull(coa1$li, mollusc$plan$site, 2, 3, opt = 1, cpoi = 1) s.chull(coa1$li, mollusc$plan$season, 2, 3, opt = 1, cpoi = 1) s.chull(coa1$li, mollusc$plan$method, 2, 3, opt = 1, cpoi = 1) s.chull(coa1$li, mollusc$plan$duration, 2, 3, opt = 1, cpoi = 1) par(mfrow = c(1, 1)) }} \keyword{datasets} ade4/man/dpcoa.Rd0000644000176200001440000000636513021372261013226 0ustar liggesusers\name{dpcoa} \alias{dpcoa} \alias{plot.dpcoa} \alias{print.dpcoa} \alias{summary.dpcoa} \title{Double principal coordinate analysis} \description{ Performs a double principal coordinate analysis } \usage{ dpcoa(df, dis = NULL, scannf = TRUE, nf = 2, full = FALSE, tol = 1e-07, RaoDecomp = TRUE) \method{plot}{dpcoa}(x, xax = 1, yax = 2, \dots) \method{print}{dpcoa} (x, \dots) \method{summary}{dpcoa} (object, \dots) } \arguments{ \item{df}{a data frame with samples as rows and categories (i.e. species) as columns and abundance or presence-absence as entries. Previous releases of \pkg{ade4} (<=1.6-2) considered the transposed matrix as argument.} \item{dis}{an object of class \code{dist} containing the distances between the categories.} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{RaoDecomp}{a logical value indicating whether Rao diversity decomposition should be performed} \item{nf}{if scannf is FALSE, an integer indicating the number of kept axes} \item{full}{a logical value indicating whether all non null eigenvalues should be kept} \item{tol}{a tolerance threshold for null eigenvalues (a value less than tol times the first one is considered as null)} \item{x, object}{an object of class \code{dpcoa}} \item{xax}{the column number for the x-axis} \item{yax}{the column number for the y-axis} \item{\dots}{\code{\dots} further arguments passed to or from other methods} } \value{ Returns a list of class \code{dpcoa} containing: \item{call}{call} \item{nf}{a numeric value indicating the number of kept axes} \item{dw}{a numeric vector containing the weights of the elements (was \code{w1} in previous releases of \pkg{ade4})} \item{lw}{a numeric vector containing the weights of the samples (was \code{w2} in previous releases of \pkg{ade4})} \item{eig}{a numeric vector with all the eigenvalues} \item{RaoDiv}{a numeric vector containing diversities within samples} \item{RaoDis}{an object of class \code{dist} containing the dissimilarities between samples} \item{RaoDecodiv}{a data frame with the decomposition of the diversity} \item{dls}{a data frame with the coordinates of the elements (was \code{l1} in previous releases of \pkg{ade4})} \item{li}{a data frame with the coordinates of the samples (was \code{l2} in previous releases of \pkg{ade4})} \item{c1}{a data frame with the scores of the principal axes of the elements} } \references{ Pavoine, S., Dufour, A.B. and Chessel, D. (2004) From dissimilarities among species to dissimilarities among communities: a double principal coordinate analysis. \emph{Journal of Theoretical Biology}, \bold{228}, 523--537. } \author{Daniel Chessel \cr Sandrine Pavoine \email{pavoine@mnhn.fr} \cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \examples{ data(humDNAm) dpcoahum <- dpcoa(data.frame(t(humDNAm$samples)), sqrt(humDNAm$distances), scan = FALSE, nf = 2) dpcoahum if(adegraphicsLoaded()) { g1 <- plot(dpcoahum) } else { plot(dpcoahum) } \dontrun{ data(ecomor) dtaxo <- dist.taxo(ecomor$taxo) dpcoaeco <- dpcoa(data.frame(t(ecomor$habitat)), dtaxo, scan = FALSE, nf = 2) dpcoaeco if(adegraphicsLoaded()) { g1 <- plot(dpcoaeco) } else { plot(dpcoaeco) } }} \keyword{multivariate} ade4/man/bwca.dpcoa.Rd0000644000176200001440000000543413047116774014152 0ustar liggesusers\name{bwca.dpcoa} \alias{bwca.dpcoa} \alias{bca.dpcoa} \alias{wca.dpcoa} \alias{randtest.betwit} \alias{summary.betwit} \alias{print.witdpcoa} \alias{print.betdpcoa} \title{ Between- and within-class double principal coordinate analysis } \description{ These functions allow to study the variations in diversity among communities (as in dpcoa) taking into account a partition in classes } \usage{ bwca.dpcoa(x, fac, cofac, scannf = TRUE, nf = 2, ...) \method{bca}{dpcoa}(x, fac, scannf = TRUE, nf = 2, \dots) \method{wca}{dpcoa}(x, fac, scannf = TRUE, nf = 2, \dots) \method{randtest}{betwit}(xtest, nrepet = 999, ...) \method{summary}{betwit}(object, ...) \method{print}{witdpcoa}(x, ...) \method{print}{betdpcoa}(x, ...) } \arguments{ \item{x}{an object of class \code{\link{dpcoa}}} \item{fac}{a factor partitioning the collections in classes} \item{scannf}{a logical value indicating whether the eigenvalues barplot should be displayed} \item{nf}{if scannf FALSE, a numeric value indicating the number of kept axes} \item{\dots}{further arguments passed to or from other methods} \item{cofac}{a cofactor partitioning the collections in classes used as a covariable} \item{nrepet}{the number of permutations} \item{xtest, object}{an object of class \code{betwit} created by a call to the function \code{bwca.dpcoa}} } \value{ Objects of class \code{betdpcoa}, \code{witdpcoa} or \code{betwit} } \references{ Dray, S., Pavoine, S. and Aguirre de Carcer, D. (2015) Considering external information to improve the phylogenetic comparison of microbial communities: a new approach based on constrained Double Principal Coordinates Analysis (cDPCoA). \emph{Molecular Ecology Resources}, \bold{15}, 242--249. doi:10.1111/1755-0998.12300 } \author{ Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \seealso{ \code{\link{dpcoa}} } \examples{ \dontrun{ ## First example of Dray et al (2015) paper con <- url("ftp://pbil.univ-lyon1.fr/pub/datasets/dray/MER2014/soilmicrob.rda") load(con) close(con) ## Partial CCA coa <- dudi.coa(soilmicrob$OTU, scannf = FALSE) wcoa <- wca(coa, soilmicrob$env$pH, scannf = FALSE) wbcoa <- bca(wcoa,soilmicrob$env$VegType, scannf = FALSE) ## Classical DPCoA dp <- dpcoa(soilmicrob$OTU, soilmicrob$dphy, RaoDecomp = FALSE, scannf = FALSE) ## Between DPCoA (focus on the effect of vegetation type) bdp <- bca(dp, fac = soilmicrob$env$VegType , scannf = FALSE) bdp$ratio ## 0.2148972 randtest(bdp) ## p = 0.001 ## Within DPCoA (remove the effect of pH) wdp <- wca(dp, fac = soilmicrob$env$pH, scannf = FALSE) wdp$ratio ## 0.5684348 ## Between Within-DPCoA (remove the effect of pH and focus on vegetation type) wbdp <- bwca.dpcoa(dp, fac = soilmicrob$env$VegType, cofac = soilmicrob$env$pH, scannf = FALSE) wbdp$ratio ## 0.05452813 randtest(wbdp) ## p = 0.001 } } \keyword{multivariate}ade4/man/dudi.Rd0000644000176200001440000000607413021372261013062 0ustar liggesusers\name{dudi} \alias{dudi} \alias{as.dudi} \alias{print.dudi} \alias{t.dudi} \alias{is.dudi} \alias{redo.dudi} \alias{summary.dudi} \alias{[.dudi} \title{Duality Diagram} \description{ \code{as.dudi} is called by many functions (\code{dudi.pca}, \code{dudi.coa}, \code{dudi.acm}, ...) and not directly by the user. It creates duality diagrams. \code{t.dudi} returns an object of class '\code{dudi}' where the rows are the columns and the columns are the rows of the initial \code{dudi}. \code{is.dudi} returns TRUE if the object is of class \code{dudi} \code{redo.dudi} computes again an analysis, eventually changing the number of kept axes. Used by other functions.\cr } \usage{ as.dudi(df, col.w, row.w, scannf, nf, call, type, tol = 1e-07, full = FALSE) \method{print}{dudi}(x, \dots) is.dudi(x) redo.dudi(dudi, newnf = 2) \method{t}{dudi}(x) \method{summary}{dudi}(object, \dots) \method{[}{dudi}(x,i,j) } \arguments{ \item{df}{a data frame with \emph{n} rows and \emph{p} columns} \item{col.w}{a numeric vector containing the row weights} \item{row.w}{a numeric vector containing the column weights} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} \item{call}{generally \code{match.call()}} \item{type}{a string of characters : the returned list will be of class \code{c(type, "dudi")}} \item{tol}{a tolerance threshold for null eigenvalues (a value less than tol times the first one is considered as null)} \item{full}{a logical value indicating whether all non null eigenvalues should be kept} \item{x, dudi, object}{objects of class \code{dudi}} \item{\dots}{further arguments passed to or from other methods} \item{newnf}{an integer indicating the number of kept axes} \item{i,j}{elements to extract (integer or empty): index of rows (i) and columns (j)} } \value{ as.dudi and all the functions that use it return a list with the following components : \item{tab}{a data frame with n rows and p columns} \item{cw}{column weights, a vector with n components} \item{lw}{row (lines) weights, a vector with p components} \item{eig}{eigenvalues, a vector with min(n,p) components} \item{nf}{integer, number of kept axes} \item{c1}{principal axes, data frame with p rows and nf columns} \item{l1}{principal components, data frame with n rows and nf columns} \item{co}{column coordinates, data frame with p rows and nf columns} \item{li}{row coordinates, data frame with n rows and nf columns} \item{call}{original call} } \references{Escoufier, Y. (1987) The duality diagram : a means of better practical applications In \emph{Development in numerical ecology}, Legendre, P. & Legendre, L. (Eds.) NATO advanced Institute, Serie G. Springer Verlag, Berlin, 139--156. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr}\cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \examples{ data(deug) dd1 <- dudi.pca(deug$tab, scannf = FALSE) dd1 t(dd1) is.dudi(dd1) redo.dudi(dd1,3) summary(dd1) } \keyword{multivariate} ade4/man/scatter.acm.Rd0000644000176200001440000000207112576021756014350 0ustar liggesusers\name{scatter.acm} \alias{scatter.acm} \title{Plot of the factorial maps in a Multiple Correspondence Analysis} \description{ performs the scatter diagrams of a Multiple Correspondence Analysis. } \usage{ \method{scatter}{acm}(x, xax = 1, yax = 2, mfrow=NULL, csub = 2, possub = "topleft", ...) } \arguments{ \item{x}{an object of class \code{acm}} \item{xax}{the column number for the x-axis} \item{yax}{the column number for the y-axis} \item{mfrow}{a vector of the form "c(nr,nc)", if NULL (the default) is computed by \code{n2mfrow}} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the legend position ("topleft", "topright", "bottomleft", "bottomright") in a array of figures} \item{\dots}{further arguments passed to or from other methods} } \author{Daniel Chessel} \examples{ data(lascaux) if(adegraphicsLoaded()) { plot(dudi.acm(lascaux$ornem, sca = FALSE)) } else { scatter(dudi.acm(lascaux$ornem, sca = FALSE), csub = 3) } } \keyword{multivariate} \keyword{hplot} ade4/man/friday87.Rd0000644000176200001440000000202312576021756013576 0ustar liggesusers\name{friday87} \alias{friday87} \docType{data} \title{Faunistic K-tables} \description{ This data set gives informations about sites, species and environmental variables. } \usage{data(friday87)} \format{ \code{friday87} is a list of 4 components. \describe{ \item{fau}{is a data frame containing a faunistic table with 16 sites and 91 species.} \item{mil}{is a data frame with 16 sites and 11 environmental variables.} \item{fau.blo}{is a vector of the number of species per group.} \item{tab.names}{is the name of each group of species.} } } \source{ Friday, L.E. (1987) The diversity of macroinvertebrate and macrophyte communities in ponds, \emph{Freshwater Biology}, \bold{18}, 87--104. } \examples{ data(friday87) wfri <- data.frame(scale(friday87$fau, scal = FALSE)) wfri <- ktab.data.frame(wfri, friday87$fau.blo, tabnames = friday87$tab.names) if(adegraphicsLoaded()) { g1 <- kplot(sepan(wfri), row.plabels.cex = 2) } else { kplot(sepan(wfri), clab.r = 2, clab.c = 1) } } \keyword{datasets} ade4/man/njplot.Rd0000644000176200001440000000200613021372261013432 0ustar liggesusers\name{njplot} \alias{njplot} \docType{data} \title{Phylogeny and trait of bacteria} \description{ This data set describes the phylogeny of 36 bacteria as reported by Perrière and Gouy (1996). It also gives the GC rate corresponding to these 36 species. } \usage{data(njplot)} \format{ \code{njplot} is a list containing the 2 following objects: \describe{ \item{tre}{is a character string giving the fission tree in Newick format.} \item{tauxcg}{is a numeric vector that gives the CG rate of the 36 species.} } } \source{ Data were obtained by Manolo Gouy \email{manolo.gouy@univ-lyon1.fr} } \references{ Perrière, G. and Gouy, M. (1996) WWW-Query : an on-line retrieval system for biological sequence banks. \emph{Biochimie}, \bold{78}, 364--369. } \examples{ data(njplot) njplot.phy <- newick2phylog(njplot$tre) par(mfrow = c(2,1)) tauxcg0 <- njplot$tauxcg - mean(njplot$tauxcg) symbols.phylog(njplot.phy, squares = tauxcg0) symbols.phylog(njplot.phy, circles = tauxcg0) par(mfrow = c(1,1)) } \keyword{datasets} ade4/man/multispati.rtest.Rd0000644000176200001440000000325213177053506015475 0ustar liggesusers\name{multispati.rtest} \alias{multispati.rtest} \title{Multivariate spatial autocorrelation test} \description{ This function performs a multivariate autocorrelation test. } \usage{ multispati.rtest(dudi, listw, nrepet = 99, ...) } \arguments{ \item{dudi}{an object of class \code{dudi} for the duality diagram analysis} \item{listw}{an object of class \code{listw} for the spatial dependence of data observations} \item{nrepet}{the number of permutations} \item{\dots}{further arguments passed to or from other methods} } \details{ We note X the data frame with the variables, Q the column weight matrix and D the row weight matrix associated to the duality diagram \emph{dudi}. We note L the neighbouring weights matrix associated to \emph{listw}. This function performs a Monte-Carlo Test on the multivariate spatial autocorrelation index : \deqn{r = \frac{X^{t}DLXQ}{X^{t}DXQ}}{r = t(X)DLXQ / t(X)DXQ} } \value{ Returns an object of class \code{randtest} (randomization tests). } \references{ Smouse, P. E. and Peakall, R. (1999) Spatial autocorrelation analysis of individual multiallele and multilocus genetic structure. \emph{Heredity}, \bold{82}, 561--573. } \author{Daniel Chessel \cr Sébastien Ollier \email{sebastien.ollier@u-psud.fr} } \seealso{\code{\link{dudi}},\code{\link[spdep]{mat2listw}}} \examples{ if (requireNamespace("spdep", quietly = TRUE)) { data(mafragh) maf.listw <- spdep::nb2listw(neig2nb(mafragh$neig)) maf.pca <- dudi.pca(mafragh$env, scannf = FALSE) multispati.rtest(maf.pca, maf.listw) maf.pca.ms <- multispati(maf.pca, maf.listw, scannf = FALSE) plot(maf.pca.ms) } } \keyword{multivariate} \keyword{spatial} \keyword{nonparametric} ade4/man/wca.coinertia.Rd0000644000176200001440000000417713175633655014706 0ustar liggesusers\name{wca.coinertia} \alias{wca.coinertia} \title{Within-class coinertia analysis} \description{ Performs a within-class analysis after a coinertia analysis } \usage{ \method{wca}{coinertia}(x, fac, scannf = TRUE, nf = 2, \dots) } \arguments{ \item{x}{a coinertia analysis (object of class \link{coinertia}) obtained by the function \link{coinertia}} \item{fac}{a factor partitioning the rows in classes} \item{scannf}{a logical value indicating whether the eigenvalues barplot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} \item{\dots}{further arguments passed to or from other methods} } \value{ An object of the class \code{witcoi}. Outputs are described by the \code{print} function } \details{ This analysis is equivalent to do a within-class analysis on each initial dudi, and a coinertia analysis on the two within analyses. This function returns additional outputs for the interpretation. } \references{ Franquet E., Doledec S., and Chessel D. (1995) Using multivariate analyses for separating spatial and temporal effects within species-environment relationships. \emph{Hydrobiologia}, \bold{300}, 425--431. } \note{ To avoid conflict names with the \code{base:::within} function, the function \code{within} is now deprecated and removed. To be consistent, the \code{withincoinertia} function is also deprecated and is replaced by the method \code{wca.coinertia} of the generic \code{wca} function. } \author{ Stéphane Dray \email{stephane.dray@univ-lyon1.fr} and Jean Thioulouse \email{jean.thioulouse@univ-lyon1.fr} } \seealso{\code{\link{coinertia}}, \code{\link{wca}} } \examples{ data(meaudret) pca1 <- dudi.pca(meaudret$env, scan = FALSE, nf = 4) pca2 <- dudi.pca(meaudret$spe, scal = FALSE, scan = FALSE, nf = 4) wit1 <- wca(pca1, meaudret$design$site, scan = FALSE, nf = 2) wit2 <- wca(pca2, meaudret$design$site, scan = FALSE, nf = 2) coiw <- coinertia(wit1, wit2, scannf = FALSE) coi <- coinertia(pca1, pca2, scannf = FALSE, nf = 3) coi.w <- wca(coi, meaudret$design$site, scannf = FALSE) ## coiw and coi.w are equivalent plot(coi.w) } \keyword{multivariate}ade4/man/uniquewt.df.Rd0000644000176200001440000000212212576021756014412 0ustar liggesusers\name{uniquewt.df} \alias{uniquewt.df} \title{Elimination of Duplicated Rows in a Array} \description{ An utility function to eliminate the duplicated rows in a array. } \usage{ uniquewt.df(x) } \arguments{ \item{x}{a data frame which contains duplicated rows} } \value{ The function returns a \code{y} which contains once each duplicated row of \code{x}.\cr \code{y} is an attribut 'factor' which gives the number of the row of \code{y} in which each row of \code{x} is found\cr \code{y} is an attribut 'length.class' which gives the number of duplicates in \code{x} with an attribut of each row of \code{y} with an attribut } \author{Daniel Chessel } \examples{ data(ecomor) forsub.r <- uniquewt.df(ecomor$forsub) attr(forsub.r, "factor") forsub.r[1,] ecomor$forsub[126,] #idem dudi.pca(ecomor$forsub, scale = FALSE, scann = FALSE)$eig # [1] 0.36845 0.24340 0.15855 0.09052 0.07970 0.04490 w1 <- attr(forsub.r, "len.class") / sum(attr(forsub.r,"len.class")) dudi.pca(forsub.r, row.w = w1, scale = FALSE, scann = FALSE)$eig # [1] 0.36845 0.24340 0.15855 0.09052 0.07970 0.04490 } \keyword{utilities} ade4/man/monde84.Rd0000644000176200001440000000201413021372261013401 0ustar liggesusers\name{monde84} \alias{monde84} \docType{data} \title{Global State of the World in 1984} \usage{data(monde84)} \description{ The \code{monde84} data frame gives five demographic variables for 48 countries in the world. } \format{ This data frame contains the following columns: \enumerate{ \item pib: Gross Domestic Product \item croipop: Growth of the population \item morta: Infant Mortality \item anal: Literacy Rate \item scol: Percentage of children in full-time education } } \source{ Geze, F. and Coll., eds. (1984) \emph{L'état du Monde 1984 : annuaire économique et géopolitique mondial}. La Découverte, Paris. } \examples{ data(monde84) X <- cbind.data.frame(lpib = log(monde84$pib), monde84$croipop) Y <- cbind.data.frame(lmorta = log(monde84$morta), lanal = log(monde84$anal + 1), rscol = sqrt(100 - monde84$scol)) pcaY <- dudi.pca(Y, scan = FALSE) pcaiv1 <- pcaiv(pcaY, X0 <- scale(X), scan = FALSE) sum(cor(pcaiv1$l1[,1], Y0 <- scale(Y))^2) pcaiv1$eig[1] #the same } \keyword{datasets} ade4/man/procuste.randtest.Rd0000644000176200001440000000201513050632301015607 0ustar liggesusers\name{procuste.randtest} \alias{procuste.randtest} \title{ Monte-Carlo Test on the sum of the singular values of a procustean rotation (in C). } \description{ performs a Monte-Carlo Test on the sum of the singular values of a procustean rotation. } \usage{ procuste.randtest(df1, df2, nrepet = 999, ...) } \arguments{ \item{df1}{a data frame} \item{df2}{a data frame} \item{nrepet}{the number of permutations} \item{\dots}{further arguments passed to or from other methods} } \value{ returns a list of class \code{randtest} } \references{ Jackson, D.A. (1995) PROTEST: a PROcustean randomization TEST of community environment concordance. \emph{Ecosciences}, \bold{2}, 297--303. } \author{Jean Thioulouse \email{Jean.Thioulouse@univ-lyon1.fr}} \examples{ data(doubs) pca1 <- dudi.pca(doubs$env, scal = TRUE, scann = FALSE) pca2 <- dudi.pca(doubs$fish, scal = FALSE, scann = FALSE) protest1 <- procuste.randtest(pca1$tab, pca2$tab, 999) protest1 plot(protest1,main="PROTEST") } \keyword{multivariate} \keyword{nonparametric} ade4/man/niche.Rd0000644000176200001440000000674613021372261013231 0ustar liggesusers\name{niche} \alias{niche} \alias{plot.niche} \alias{print.niche} \alias{niche.param} \alias{rtest.niche} \title{Method to Analyse a pair of tables : Environmental and Faunistic Data} \description{ performs a special multivariate analysis for ecological data. } \usage{ niche(dudiX, Y, scannf = TRUE, nf = 2) \method{print}{niche}(x, \dots) \method{plot}{niche}(x, xax = 1, yax = 2, \dots) niche.param(x) \method{rtest}{niche}(xtest,nrepet=99, \dots) } \arguments{ \item{dudiX}{a duality diagram providing from a function \code{dudi.coa}, \code{dudi.pca}, ... using an array sites-variables} \item{Y}{a data frame sites-species according to \code{dudiX$tab} with no columns of zero} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} \item{x}{an object of class \code{niche}} \item{\dots}{further arguments passed to or from other methods} \item{xax, yax}{the numbers of the x-axis and the y-axis} \item{xtest}{an object of class \code{niche}} \item{nrepet}{the number of permutations for the testing procedure} } \value{ Returns a list of the class \code{niche} (sub-class of \code{dudi}) containing : \item{rank}{an integer indicating the rank of the studied matrix} \item{nf}{an integer indicating the number of kept axes} \item{RV}{a numeric value indicating the RV coefficient} \item{eig}{a numeric vector with the all eigenvalues} \item{lw}{a data frame with the row weigths (crossed array)} \item{tab}{a data frame with the crossed array (averaging species/sites)} \item{li}{a data frame with the species coordinates} \item{l1}{a data frame with the species normed scores} \item{co}{a data frame with the variable coordinates} \item{c1}{a data frame with the variable normed scores} \item{ls}{a data frame with the site coordinates} \item{as}{a data frame with the axis upon niche axis} } \references{ Dolédec, S., Chessel, D. and Gimaret, C. (2000) Niche separation in community analysis: a new method. \emph{Ecology}, \bold{81}, 2914--1927. } \author{ Daniel Chessel\cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr}\cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \examples{ data(doubs) dudi1 <- dudi.pca(doubs$env, scale = TRUE, scan = FALSE, nf = 3) nic1 <- niche(dudi1, doubs$fish, scann = FALSE) if(adegraphicsLoaded()) { g1 <- s.traject(dudi1$li, plab.cex = 0, plot = FALSE) g2 <- s.traject(nic1$ls, plab.cex = 0, plot = FALSE) g3 <- s.corcircle(nic1$as, plot = FALSE) g4 <- s.arrow(nic1$c1, plot = FALSE) G1 <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) glist <- list() for(i in 1:ncol(doubs$fish)) glist[[i]] <- s.distri(nic1$ls, dfdistri = doubs$fish[, i], psub.text = names(doubs$fish)[i], plot = FALSE, storeData = TRUE) G2 <- ADEgS(glist, layout = c(5, 6)) G3 <- s.arrow(nic1$li, plab.cex = 0.7) } else { par(mfrow = c(2, 2)) s.traject(dudi1$li, clab = 0) s.traject(nic1$ls, clab = 0) s.corcircle(nic1$as) s.arrow(nic1$c1) par(mfrow = c(5, 6)) for (i in 1:27) s.distri(nic1$ls, as.data.frame(doubs$fish[,i]), csub = 2, sub = names(doubs$fish)[i]) par(mfrow = c(1, 1)) s.arrow(nic1$li, clab = 0.7) } data(trichometeo) pca1 <- dudi.pca(trichometeo$meteo, scan = FALSE) nic1 <- niche(pca1, log(trichometeo$fau + 1), scan = FALSE) plot(nic1) niche.param(nic1) rtest(nic1,19) data(rpjdl) plot(niche(dudi.pca(rpjdl$mil, scan = FALSE), rpjdl$fau, scan = FALSE)) } \keyword{multivariate} ade4/man/microsatt.Rd0000644000176200001440000000416713021372261014143 0ustar liggesusers\name{microsatt} \alias{microsatt} \docType{data} \title{Genetic Relationships between cattle breeds with microsatellites} \description{ This data set gives genetic relationships between cattle breeds with microsatellites. } \usage{data(microsatt)} \format{ \code{microsatt} is a list of 4 components. \describe{ \item{tab}{contains the allelic frequencies for 18 cattle breeds (Taurine or Zebu,French or African) and 9 microsatellites.} \item{loci.names}{is a vector of the names of loci.} \item{loci.eff}{is a vector of the number of alleles per locus.} \item{alleles.names}{is a vector of the names of alleles.} } } \source{ Extract of data prepared by D. Laloë \email{ugendla@dga2.jouy.inra.fr} from data used in: Moazami-Goudarzi, K., D. Laloë, J. P. Furet, and F. Grosclaude (1997) Analysis of genetic relationships between 10 cattle breeds with 17 microsatellites. \emph{Animal Genetics}, \bold{28}, 338--345. Souvenir Zafindrajaona, P.,Zeuh V. ,Moazami-Goudarzi K., Laloë D., Bourzat D., Idriss A., and Grosclaude F. (1999) Etude du statut phylogénétique du bovin Kouri du lac Tchad à l'aide de marqueurs moléculaires. \emph{Revue d'Elevage et de Médecine Vétérinaire des pays Tropicaux}, \bold{55}, 155--162. Moazami-Goudarzi, K., Belemsaga D. M. A., Ceriotti G., Laloë D. , Fagbohoun F., Kouagou N. T., Sidibé I., Codjia V., Crimella M. C., Grosclaude F. and Touré S. M. (2001)\cr Caractérisation de la race bovine Somba à l'aide de marqueurs moléculaires. \emph{Revue d'Elevage et de Médecine Vétérinaire des pays Tropicaux}, \bold{54}, 1--10. } \references{ See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps055.pdf} (in French). } \examples{ \dontrun{ data(microsatt) fac <- factor(rep(microsatt$loci.names, microsatt$loci.eff)) w <- dudi.coa(data.frame(t(microsatt$tab)), scann = FALSE) wit <- wca(w, fac, scann = FALSE) microsatt.ktab <- ktab.within(wit) plot(sepan(microsatt.ktab)) # 9 separated correspondence analyses plot(mcoa(microsatt.ktab, scan = FALSE)) plot(mfa(microsatt.ktab, scan = FALSE)) plot(statis(microsatt.ktab, scan = FALSE)) }} \keyword{datasets} ade4/man/RV.rtest.Rd0000644000176200001440000000170113050632301013610 0ustar liggesusers\name{RV.rtest} \alias{RV.rtest} \title{Monte-Carlo Test on the sum of eigenvalues of a co-inertia analysis (in R).} \description{ performs a Monte-Carlo Test on the sum of eigenvalues of a co-inertia analysis. } \usage{ RV.rtest(df1, df2, nrepet = 99, ...) } \arguments{ \item{df1, df2}{two data frames with the same rows} \item{nrepet}{the number of permutations} \item{\dots}{further arguments passed to or from other methods} } \value{ returns a list of class 'rtest' } \references{ Heo, M. & Gabriel, K.R. (1997) A permutation test of association between configurations by means of the RV coefficient. Communications in Statistics - Simulation and Computation, \bold{27}, 843-856. } \author{Daniel Chessel } \examples{ data(doubs) pca1 <- dudi.pca(doubs$env, scal = TRUE, scann = FALSE) pca2 <- dudi.pca(doubs$fish, scal = FALSE, scann = FALSE) rv1 <- RV.rtest(pca1$tab, pca2$tab, 99) rv1 plot(rv1) } \keyword{multivariate} \keyword{nonparametric} ade4/man/presid2002.Rd0000644000176200001440000000611013040362670013722 0ustar liggesusers\name{presid2002} \alias{presid2002} \docType{data} \title{Results of the French presidential elections of 2002} \description{ \code{presid2002} is a list of two data frames \code{tour1} and \code{tour2} with 93 rows (93 departments from continental Metropolitan France) and, 4 and 12 variables respectively . } \usage{data(presid2002)} \format{ \code{tour1} contains the following arguments:\cr the number of registered voters (\code{inscrits}); the number of abstentions (\code{abstentions}); the number of voters (\code{votants}); the number of expressed votes (\code{exprimes}) and, the numbers of votes for each candidate: \code{Megret}, \code{Lepage}, \code{Gluksten}, \code{Bayrou}, \code{Chirac}, \code{Le_Pen}, \code{Taubira}, \code{Saint.josse}, \code{Mamere}, \code{Jospin}, \code{Boutin}, \code{Hue}, \code{Chevenement}, \code{Madelin}, \code{Besancenot}.\cr\cr \code{tour2} contains the following arguments:\cr the number of registered voters (\code{inscrits}); the number of abstentions (\code{abstentions}); the number of voters (\code{votants}); the number of expressed votes (\code{exprimes}) and, the numbers of votes for each candidate: \code{Chirac} and \code{Le_Pen}. } \source{ Site of the ministry of the Interior, of the Internal Security and of the local liberties\cr \url{http://www.interieur.gouv.fr/Elections/Les-resultats/Presidentielles/elecresult__presidentielle_2002/} } \seealso{ This dataset is compatible with \code{elec88} and \code{cnc2003}} \examples{ data(presid2002) all((presid2002$tour2$Chirac + presid2002$tour2$Le_Pen) == presid2002$tour2$exprimes) \dontrun{ data(elec88) data(cnc2003) w0 <- ade4:::area.util.class(elec88$area, cnc2003$reg) w1 <- scale(elec88$tab$Chirac) w2 <- scale(presid2002$tour1$Chirac / presid2002$tour1$exprimes) w3 <- scale(elec88$tab$Mitterand) w4 <- scale(presid2002$tour2$Chirac / presid2002$tour2$exprimes) if(adegraphicsLoaded()) { g1 <- s.value(elec88$xy, w1, Sp = elec88$Spatial, pSp.col = "white", pgrid.draw = FALSE, psub.text = "Chirac 1988 T1", plot = FALSE) g2 <- s.value(elec88$xy, w2, Sp = elec88$Spatial, pSp.col = "white", pgrid.draw = FALSE, psub.text = "Chirac 2002 T1", plot = FALSE) g3 <- s.value(elec88$xy, w3, Sp = elec88$Spatial, pSp.col = "white", pgrid.draw = FALSE, psub.text = "Mitterand 1988 T1", plot = FALSE) g4 <- s.value(elec88$xy, w4, Sp = elec88$Spatial, pSp.col = "white", pgrid.draw = FALSE, psub.text = "Chirac 2002 T2", plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) par(mar = c(0.1, 0.1, 0.1, 0.1)) area.plot(w0) s.value(elec88$xy, w1, add.plot = TRUE) scatterutil.sub("Chirac 1988 T1", csub = 2, "topleft") area.plot(w0) s.value(elec88$xy, w2, add.plot = TRUE) scatterutil.sub("Chirac 2002 T1", csub = 2, "topleft") area.plot(w0) s.value(elec88$xy, w3, add.plot = TRUE) scatterutil.sub("Mitterand 1988 T1", csub = 2, "topleft") area.plot(w0) s.value(elec88$xy, w4, add.plot = TRUE) scatterutil.sub("Chirac 2002 T2", csub = 2, "topleft") }}} \keyword{datasets} ade4/man/dist.quant.Rd0000644000176200001440000000376613021372261014234 0ustar liggesusers\name{dist.quant} \alias{dist.quant} \title{Computation of Distance Matrices on Quantitative Variables} \description{ computes on quantitative variables, some distance matrices as canonical, Joreskog and Mahalanobis. } \usage{ dist.quant(df, method = NULL, diag = FALSE, upper = FALSE, tol = 1e-07) } \arguments{ \item{df}{a data frame containing only quantitative variables} \item{method}{an integer between 1 and 3. If NULL the choice is made with a console message. See details} \item{diag}{a logical value indicating whether the diagonal of the distance matrix should be printed by `print.dist'} \item{upper}{a logical value indicating whether the upper triangle of the distance matrix should be printed by `print.dist'} \item{tol}{used in case 3 of \code{method} as a tolerance threshold for null eigenvalues} } \details{ All the distances are of type \eqn{d=\|x-y\|_A = \sqrt{(x-y)^{t}A(x-y)}}{d = ||x-y||_A = sqrt((x-y)^t A (x-y))} \describe{ \item{1 = Canonical}{A = Identity} \item{2 = Joreskog}{\eqn{A=\frac{1}{diag(cov)}}{A = 1 / diag(cov)}} \item{3 = Mahalanobis}{A = inv(cov)} } } \value{ an object of class \code{dist} } \author{ Daniel Chessel \cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \examples{ data(ecomor) if(adegraphicsLoaded()) { g1 <- scatter(dudi.pco(dist.quant(ecomor$morpho, 3), scan = FALSE), plot = FALSE) g2 <- scatter(dudi.pco(dist.quant(ecomor$morpho, 2), scan = FALSE), plot = FALSE) g3 <- scatter(dudi.pco(dist(scalewt(ecomor$morpho)), scan = FALSE), plot = FALSE) g4 <- scatter(dudi.pco(dist.quant(ecomor$morpho, 1), scan = FALSE), plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) scatter(dudi.pco(dist.quant(ecomor$morpho, 3), scan = FALSE)) scatter(dudi.pco(dist.quant(ecomor$morpho, 2), scan = FALSE)) scatter(dudi.pco(dist(scalewt(ecomor$morpho)), scan = FALSE)) scatter(dudi.pco(dist.quant(ecomor$morpho, 1), scan = FALSE)) par(mfrow = c(1, 1)) }} \keyword{array} \keyword{multivariate} ade4/man/dudi.mix.Rd0000644000176200001440000000553113021372261013653 0ustar liggesusers\name{dudi.mix} \alias{dudi.mix} \title{Ordination of Tables mixing quantitative variables and factors} \description{ performs a multivariate analysis with mixed quantitative variables and factors. } \usage{ dudi.mix(df, add.square = FALSE, scannf = TRUE, nf = 2) } \arguments{ \item{df}{a data frame with mixed type variables (quantitative, factor and ordered)} \item{add.square}{a logical value indicating whether the squares of quantitative variables should be added} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} } \details{ If df contains only quantitative variables, this is equivalent to a normed PCA.\cr If df contains only factors, this is equivalent to a MCA.\cr Ordered factors are replaced by \code{poly(x,deg=2)}. \cr This analysis generalizes the Hill and Smith method.\cr The principal components of this analysis are centered and normed vectors maximizing the sum of the:\cr squared correlation coefficients with quantitative variables\cr squared multiple correlation coefficients with polynoms\cr correlation ratios with factors. \cr } \value{ Returns a list of class \code{mix} and \code{dudi} (see \link{dudi}) containing also \item{index}{a factor giving the type of each variable : f = factor, o = ordered, q = quantitative} \item{assign}{a factor indicating the initial variable for each column of the transformed table} \item{cr}{a data frame giving for each variable and each score:\cr the squared correlation coefficients if it is a quantitative variable\cr the correlation ratios if it is a factor\cr the squared multiple correlation coefficients if it is ordered} } \references{Hill, M. O., and A. J. E. Smith. 1976. Principal component analysis of taxonomic data with multi-state discrete characters. \emph{Taxon}, \bold{25}, 249-255.\cr\cr De Leeuw, J., J. van Rijckevorsel, and . 1980. HOMALS and PRINCALS - Some generalizations of principal components analysis. Pages 231-242 in E. Diday and Coll., editors. Data Analysis and Informatics II. Elsevier Science Publisher, North Holland, Amsterdam.\cr\cr Kiers, H. A. L. 1994. Simple structure in component analysis techniques for mixtures of qualitative ans quantitative variables. \emph{Psychometrika}, \bold{56}, 197-212. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(dunedata) dd1 <- dudi.mix(dunedata$envir, scann = FALSE) if(adegraphicsLoaded()) { g1 <- scatter(dd1, row.plab.cex = 1, col.plab.cex = 1.5) } else { scatter(dd1, clab.r = 1, clab.c = 1.5) } dd2 <- dudi.mix(dunedata$envir, scann = FALSE, add.square = TRUE) if(adegraphicsLoaded()) { g2 <- scatter(dd2, row.plab.cex = 1, col.plab.cex = 1.5) } else { scatter(dd2, clab.r = 1, clab.c = 1.5) } } \keyword{multivariate} ade4/man/is.euclid.Rd0000644000176200001440000000322613021372261014010 0ustar liggesusers\name{is.euclid} \alias{is.euclid} \alias{summary.dist} \title{Is a Distance Matrix Euclidean?} \description{ Confirmation of the Euclidean nature of a distance matrix by the Gower's theorem.\cr \code{is.euclid} is used in \code{summary.dist}.\cr } \usage{ is.euclid(distmat, plot = FALSE, print = FALSE, tol = 1e-07) \method{summary}{dist}(object, \dots) } \arguments{ \item{distmat}{an object of class 'dist'} \item{plot}{a logical value indicating whether the eigenvalues bar plot of the matrix of the term \eqn{-\frac{1}{2} {d_{ij}^2}}{-1/2 dij²} centred by rows and columns should be diplayed} \item{print}{a logical value indicating whether the eigenvalues of the matrix of the term \eqn{-\frac{1}{2} {d_{ij}^2}}{-1/2 dij²} centred by rows and columns should be printed} \item{tol}{a tolerance threshold : an eigenvalue is considered positive if it is larger than \code{-tol*lambda1} where \code{lambda1} is the largest eigenvalue.} \item{object}{an object of class 'dist'} \item{\dots}{further arguments passed to or from other methods} } \value{ returns a logical value indicating if all the eigenvalues are positive or equal to zero } \references{Gower, J.C. and Legendre, P. (1986) Metric and Euclidean properties of dissimilarity coefficients. \emph{Journal of Classification}, \bold{3}, 5--48. } \author{ Daniel Chessel \cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \examples{ w <- matrix(runif(10000), 100, 100) w <- dist(w) summary(w) is.euclid (w) # TRUE w <- quasieuclid(w) # no correction need in: quasieuclid(w) w <- lingoes(w) # no correction need in: lingoes(w) w <- cailliez(w) # no correction need in: cailliez(w) rm(w) } \keyword{array} ade4/man/randtest.dpcoa.Rd0000644000176200001440000000444013352722744015055 0ustar liggesusers\name{randtest.dpcoa} \alias{randtest.dpcoa} \title{ Permutation test for double principal coordinate analysis (DPCoA) } \description{ \code{randtest.dpcoa} calculates the ratio of beta to gamma diversity associated with DPCoA and compares the observed value to values obtained by permuting data. } \usage{ \method{randtest}{dpcoa}(xtest, model = c("1p","1s"), nrepet = 99, alter = c("greater", "less", "two-sided"), ...) } \arguments{ \item{xtest}{an object of class \code{dpcoa}} \item{model}{either "1p", "1s", or the name of a function, (see details)} \item{nrepet}{the number of permutations to perform, the default is 99} \item{alter}{a character string specifying the alternative hypothesis, must be one of "greater" (default), "less" or "two-sided"} \item{\dots}{further arguments passed to or from other methods} } \details{ Model 1p permutes the names of the columns of the abundance matrix. Model 1s permutes the abundances of the categories (columns of the abundance matrix, usually species) within collections (rows of the abundance matrix, usually communities). Only the categories with positive abundances are permuted. The null models were introduced in Hardy (2008). Other null model can be used by entering the name of a function. For example, loading the \code{picante} package of R, if \code{model=randomizeMatrix}, then the permutations will follow function \code{randomizeMatrix} available in picante. Any function can be used provided it returns an abundance matrix of similar size as the observed abundance matrix. Parameters of the chosen function can be added to \code{randtest.dpcoa}. For example, using parameter \code{null.model} of \code{randomizeMatrix}, the following command can be used: \code{randtest.dpcoa(xtest, model = randomizeMatrix, null.model = "trialswap")} } \value{ an object of class \code{randtest} } \references{ Hardy, O. (2008) Testing the spatial phylogenetic structure of local communities: statistical performances of different null models and test statistics on a locally neutral community. \emph{Journal of Ecology}, \bold{96}, 914--926 } \author{ Sandrine Pavoine \email{pavoine@mnhn.fr} } \seealso{ \code{\link{dpcoa}} } \examples{ data(humDNAm) dpcoahum <- dpcoa(data.frame(t(humDNAm$samples)), sqrt(humDNAm$distances), scan = FALSE, nf = 2) randtest(dpcoahum) } ade4/man/dist.prop.Rd0000644000176200001440000000533013021372261014051 0ustar liggesusers\name{dist.prop} \alias{dist.prop} \title{Computation of Distance Matrices of Percentage Data } \description{ computes for percentage data some distance matrices. } \usage{ dist.prop(df, method = NULL, diag = FALSE, upper = FALSE) } \arguments{ \item{df}{a data frame containing only positive or null values, used as row percentages} \item{method}{an integer between 1 and 5. If NULL the choice is made with a console message. See details} \item{diag}{a logical value indicating whether the diagonal of the distance matrix should be printed by `print.dist'} \item{upper}{a logical value indicating whether the upper triangle of the distance matrix should be printed by `print.dist'} } \details{ \describe{ \item{1 = Manly}{\eqn{d_1=\frac{1}{2} \sum_{i=1}^{K}{|{p_i-q_i}|}}{d1 = sum|p(i) - q(i)|/2}} \item{2 = Overlap index Manly}{\eqn{d_2=1-\frac{\sum_{i=1}^{K}{p_i q_i}}{\sqrt{\sum_{i=1}^{K}{p_i^2}}{\sqrt{\sum_{i=1}^{K}{q_i^2}}}}}{d2 = 1 - Sum(p(i)q(i))/sqrt(Sum(p(i)^2))/sqrt(Sum(q(i)^2))}} \item{3 = Rogers 1972 (one locus)}{\eqn{d_3=\sqrt{\frac{1}{2} \sum_{i=1}^{K}{(p_i-q_i)^2}}}{d3 = sqrt(0.5*Sum(p(i)-q(i)^2))}} \item{4 = Nei 1972 (one locus)}{\eqn{d_4=\ln{\frac{\sum_{i=1}^{K}{p_i q_i}}{\sqrt{\sum_{i=1}^{K}{p_i^2}}{\sqrt{\sum_{i=1}^{K}{q_i^2}}}}}}{d4 = -ln(Sum(p(i)q(i))/sqrt(Sum(p(i)^2))/sqrt(Sum(q(i)^2)))}} \item{5 = Edwards 1971 (one locus)}{\eqn{d_5=\sqrt{1-\sum_{i=1}^{K}{\sqrt{p_1 q_i}}}}{d5= sqrt (1 - (Sum(sqrt(p(i)q(i)))))}} } } \value{ returns a distance matrix, object of class \code{dist} } \references{ Edwards, A. W. F. (1971) Distance between populations on the basis of gene frequencies. \emph{Biometrics}, \bold{27}, 873--881. Manly, B. F. (1994) \emph{Multivariate Statistical Methods. A primer.}, Second edition. Chapman & Hall, London. Nei, M. (1972) Genetic distances between populations. \emph{The American Naturalist}, \bold{106}, 283--292. } \author{ Daniel Chessel \cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \examples{ data(microsatt) w <- microsatt$tab[1:microsatt$loci.eff[1]] if(adegraphicsLoaded()) { g1 <- scatter(dudi.pco(lingoes(dist.prop(w, 1)), scann = FALSE), plot = FALSE) g2 <- scatter(dudi.pco(lingoes(dist.prop(w, 2)), scann = FALSE), plot = FALSE) g3 <- scatter(dudi.pco(dist.prop(w, 3), scann = FALSE), plot = FALSE) g4 <- scatter(dudi.pco(lingoes(dist.prop(w, 4)), scann = FALSE), plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) scatter(dudi.pco(lingoes(dist.prop(w, 1)), scann = FALSE)) scatter(dudi.pco(lingoes(dist.prop(w, 2)), scann = FALSE)) scatter(dudi.pco(dist.prop(w, 3), scann = FALSE)) scatter(dudi.pco(lingoes(dist.prop(w, 4)), scann = FALSE)) par(mfrow = c(1, 1)) }} \keyword{array} \keyword{multivariate} ade4/man/multispati.Rd0000644000176200001440000001776713474205664014361 0ustar liggesusers\name{multispati} \alias{multispati} \alias{plot.multispati} \alias{summary.multispati} \alias{print.multispati} \title{Multivariate spatial analysis} \description{ These functions are deprecated. See the function \code{multispati} and the methods \code{plot.multispati}, \code{summary.multispati} and \code{print.multispati} in the package \code{adespatial}. This function ensures a multivariate extension of the univariate method of spatial autocorrelation analysis. By accounting for the spatial dependence of data observations and their multivariate covariance simultaneously, complex interactions among many variables are analysed. Using a methodological scheme borrowed from duality diagram analysis, a strategy for the exploratory analysis of spatial pattern in the multivariate is developped. } \usage{ multispati(dudi, listw, scannf = TRUE, nfposi = 2, nfnega = 0) \method{plot}{multispati}(x, xax = 1, yax = 2, ...) \method{summary}{multispati}(object, ...) \method{print}{multispati}(x, ...) } \arguments{ \item{dudi}{an object of class \code{dudi} for the duality diagram analysis} \item{listw}{an object of class \code{listw} for the spatial dependence of data observations} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nfposi}{an integer indicating the number of kept positive axes} \item{nfnega}{an integer indicating the number of kept negative axes} \item{x, object}{an object of class \code{multispati}} \item{xax, yax}{the numbers of the x-axis and the y-axis} \item{\dots}{further arguments passed to or from other methods} } \details{ This analysis generalizes the Wartenberg's multivariate spatial correlation analysis to various duality diagrams created by the functions (\code{dudi.pca}, \code{dudi.coa}, \code{dudi.acm}, \code{dudi.mix}...) If \emph{dudi} is a duality diagram created by the function \code{dudi.pca} and \emph{listw} gives spatial weights created by a row normalized coding scheme, the analysis is equivalent to Wartenberg's analysis. We note X the data frame with the variables, Q the column weights matrix and D the row weights matrix associated to the duality diagram \emph{dudi}. We note L the neighbouring weights matrix associated to \emph{listw}. Then, the \code{'multispati'} analysis gives principal axes v that maximize the product of spatial autocorrelation and inertia of row scores : \deqn{I(XQv)*\|XQv\|^2 = v^{t}Q^{t}X^{t}DLXQv}{I(XQv)*\|\|XQv\|\|^2 = t(v)t(Q)t(X)DLXQv} } \value{ Returns an object of class \code{multispati}, which contains the following elements : \item{eig}{a numeric vector containing the eigenvalues} \item{nfposi}{integer, number of kept axes associated to positive eigenvalues} \item{nfnega}{integer, number of kept axes associated to negative eigenvalues} \item{c1}{principle axes (v), data frame with p rows and (nfposi + nfnega) columns} \item{li}{principal components (XQv), data frame with n rows and (nfposi + nfnega) columns} \item{ls}{lag vector onto the principal axes (LXQv), data frame with n rows and (nfposi + nfnega) columns} \item{as}{principal axes of the dudi analysis (u) onto principal axes of multispati (t(u)Qv), data frame with dudi\$nf rows and (nfposi + nfnega) columns} } \references{ Dray, S., Said, S. and Debias, F. (2008) Spatial ordination of vegetation data using a generalization of Wartenberg's multivariate spatial correlation. \emph{Journal of vegetation science}, \bold{19}, 45--56. Grunsky, E. C. and Agterberg, F. P. (1988) Spatial and multivariate analysis of geochemical data from metavolcanic rocks in the Ben Nevis area, Ontario. \emph{Mathematical Geology}, \bold{20}, 825--861. Switzer, P. and Green, A.A. (1984) Min/max autocorrelation factors for multivariate spatial imagery. Tech. rep. 6, Stanford University. Thioulouse, J., Chessel, D. and Champely, S. (1995) Multivariate analysis of spatial patterns: a unified approach to local and global structures. \emph{Environmental and Ecological Statistics}, \bold{2}, 1--14. Wartenberg, D. E. (1985) Multivariate spatial correlation: a method for exploratory geographical analysis. \emph{Geographical Analysis}, \bold{17}, 263--283. Jombart, T., Devillard, S., Dufour, A.-B. and Pontier, D. A spatially explicit multivariate method to disentangle global and local patterns of genetic variability. Submitted to \emph{Genetics}. } \author{Daniel Chessel \cr Sebastien Ollier \email{sebastien.ollier@u-psud.fr} \cr Thibaut Jombart \email{t.jombart@imperial.ac.uk} } \seealso{\code{\link{dudi}},\code{\link[spdep]{mat2listw}}} \examples{ \dontrun{ if (requireNamespace("spdep", quietly = TRUE)) { data(mafragh) maf.xy <- mafragh$xy maf.flo <- mafragh$flo maf.listw <- spdep::nb2listw(neig2nb(mafragh$neig)) if(adegraphicsLoaded()) { g1 <- s.label(maf.xy, nb = neig2nb(mafragh$neig), plab.cex = 0.75) } else { s.label(maf.xy, neig = mafragh$neig, clab = 0.75) } maf.coa <- dudi.coa(maf.flo,scannf = FALSE) maf.coa.ms <- multispati(maf.coa, maf.listw, scannf = FALSE, nfposi = 2, nfnega = 2) maf.coa.ms ### detail eigenvalues components fgraph <- function(obj){ # use multispati summary sum.obj <- summary(obj) # compute Imin and Imax L <- spdep::listw2mat(eval(as.list(obj$call)$listw)) Imin <- min(eigen(0.5*(L+t(L)))$values) Imax <- max(eigen(0.5*(L+t(L)))$values) I0 <- -1/(nrow(obj$li)-1) # create labels labels <- lapply(1:length(obj$eig),function(i) bquote(lambda[.(i)])) # draw the plot xmax <- eval(as.list(obj$call)$dudi)$eig[1]*1.1 par(las=1) var <- sum.obj[,2] moran <- sum.obj[,3] plot(x=var,y=moran,type='n',xlab='Inertia',ylab="Spatial autocorrelation (I)", xlim=c(0,xmax),ylim=c(Imin*1.1,Imax*1.1),yaxt='n') text(x=var,y=moran,do.call(expression,labels)) ytick <- c(I0,round(seq(Imin,Imax,le=5),1)) ytlab <- as.character(round(seq(Imin,Imax,le=5),1)) ytlab <- c(as.character(round(I0,1)),as.character(round(Imin,1)), ytlab[2:4],as.character(round(Imax,1))) axis(side=2,at=ytick,labels=ytlab) rect(0,Imin,xmax,Imax,lty=2) segments(0,I0,xmax,I0,lty=2) abline(v=0) title("Spatial and inertia components of the eigenvalues") } fgraph(maf.coa.ms) ## end eigenvalues details if(adegraphicsLoaded()) { g2 <- s1d.barchart(maf.coa$eig, p1d.hori = FALSE, plot = FALSE) g3 <- s1d.barchart(maf.coa.ms$eig, p1d.hori = FALSE, plot = FALSE) g4 <- s.corcircle(maf.coa.ms$as, plot = FALSE) G1 <- ADEgS(list(g2, g3, g4), layout = c(1, 3)) } else { par(mfrow = c(1, 3)) barplot(maf.coa$eig) barplot(maf.coa.ms$eig) s.corcircle(maf.coa.ms$as) par(mfrow = c(1, 1)) } if(adegraphicsLoaded()) { g5 <- s.value(maf.xy, -maf.coa$li[, 1], plot = FALSE) g6 <- s.value(maf.xy, -maf.coa$li[, 2], plot = FALSE) g7 <- s.value(maf.xy, maf.coa.ms$li[, 1], plot = FALSE) g8 <- s.value(maf.xy, maf.coa.ms$li[, 2], plot = FALSE) G2 <- ADEgS(list(g5, g6, g7, g8), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) s.value(maf.xy, -maf.coa$li[, 1]) s.value(maf.xy, -maf.coa$li[, 2]) s.value(maf.xy, maf.coa.ms$li[, 1]) s.value(maf.xy, maf.coa.ms$li[, 2]) par(mfrow = c(1, 1)) } w1 <- -maf.coa$li[, 1:2] w1m <- apply(w1, 2, spdep::lag.listw, x = maf.listw) w1.ms <- maf.coa.ms$li[, 1:2] w1.msm <- apply(w1.ms, 2, spdep::lag.listw, x = maf.listw) if(adegraphicsLoaded()) { g9 <- s.match(w1, w1m, plab.cex = 0.75, plot = FALSE) g10 <- s.match(w1.ms, w1.msm, plab.cex = 0.75, plot = FALSE) G3 <- cbindADEg(g9, g10, plot = TRUE) } else { par(mfrow = c(1,2)) s.match(w1, w1m, clab = 0.75) s.match(w1.ms, w1.msm, clab = 0.75) par(mfrow = c(1, 1)) } maf.pca <- dudi.pca(mafragh$env, scannf = FALSE) multispati.randtest(maf.pca, maf.listw) maf.pca.ms <- multispati(maf.pca, maf.listw, scannf=FALSE) plot(maf.pca.ms) } }} \keyword{multivariate} \keyword{spatial} ade4/man/worksurv.Rd0000644000176200001440000000515413021372261014035 0ustar liggesusers\name{worksurv} \alias{worksurv} \docType{data} \title{French Worker Survey (1970)} \description{ The \code{worksurv} data frame gives 319 response items and 4 questions providing from a French Worker Survey. } \usage{data(worksurv)} \format{ This data frame contains the following columns: \enumerate{ \item pro: Professional elections. In professional elections in your firm, would you rather vote for a list supported by? \itemize{ \item \code{CGT} \item \code{CFDT} \item \code{FO} \item \code{CFTC} \item \code{Auton} Autonomous \item \code{Abst} \item \code{Nonaffi} Not affiliated \item \code{NR} No response} \item una: Union affiliation. At the present time, are you affiliated to a Union, and in the affirmative, which one? \itemize{ \item \code{CGT} \item \code{CFDT} \item \code{FO} \item \code{CFTC} \item \code{Auton} Autonomous \item \code{CGC} \item \code{Notaffi} Not affiliated \item \code{NR} No response} \item pre: Presidential election. On the last presidential election (1969), can you tell me the candidate for whom you havevoted? \itemize{ \item \code{Duclos} \item \code{Deferre} \item \code{Krivine} \item \code{Rocard} \item \code{Poher} \item \code{Ducatel} \item \code{Pompidou} \item \code{NRAbs} No response, abstention} \item pol: political sympathy. Which political party do you feel closest to, as a rule? \itemize{ \item \code{Communist} (PCF) \item \code{Socialist} (SFIO+PSU+FGDS) \item \code{Left} (Party of workers,\dots) \item \code{Center} MRP+RAD. \item \code{RI} \item \code{Right} INDEP.+CNI \item \code{Gaullist} UNR \item \code{NR} No response} } } \details{ The data frame \code{worksurv} has the attribute 'counts' giving the number of responses for each item. } \source{ Rouanet, H. and Le Roux, B. (1993) \emph{Analyse des données multidimensionnelles}. Dunod, Paris. } \references{ Le Roux, B. and Rouanet, H. (1997) Interpreting axes in multiple correspondence analysis: method of the contributions of points and deviation. Pages 197-220 in B. J. and M. Greenacre, editors. \emph{Visualization of categorical data}, Acamedic Press, London. } \examples{ data(worksurv) acm1 <- dudi.acm(worksurv, row.w = attr(worksurv, "counts"), scan = FALSE) if(adegraphicsLoaded()) { s.class(acm1$li, worksurv) } else { par(mfrow = c(2, 2)) apply(worksurv, 2, function(x) s.class(acm1$li, factor(x), attr(worksurv, 'counts'))) par(mfrow = c(1, 1)) } } \keyword{datasets} ade4/man/olympic.Rd0000644000176200001440000000325413047116774013623 0ustar liggesusers\name{olympic} \alias{olympic} \docType{data} \title{Olympic Decathlon} \description{ This data set gives the performances of 33 men's decathlon at the Olympic Games (1988). } \usage{data(olympic)} \format{ \code{olympic} is a list of 2 components. \describe{ \item{tab}{is a data frame with 33 rows and 10 columns events of the decathlon: 100 meters (100), long jump (long), shotput (poid), high jump (haut), 400 meters (400), 110-meter hurdles (110), discus throw (disq), pole vault (perc), javelin (jave) and 1500 meters (1500).} \item{score}{is a vector of the final points scores of the competition.} } } \source{ Example 357 in: \cr Hand, D.J., Daly, F., Lunn, A.D., McConway, K.J. and Ostrowski, E. (1994) \emph{A handbook of small data sets}, Chapman & Hall, London. 458 p. Lunn, A. D. and McNeil, D.R. (1991) \emph{Computer-Interactive Data Analysis}, Wiley, New York } \examples{ data(olympic) pca1 <- dudi.pca(olympic$tab, scan = FALSE) if(adegraphicsLoaded()) { if(requireNamespace("lattice", quietly = TRUE)) { g1 <- s1d.barchart(pca1$eig, p1d.hori = FALSE, plot = FALSE) g2 <- s.corcircle(pca1$co, plot = FALSE) g3 <- lattice::xyplot(pca1$l1[, 1] ~ olympic$score, type = c("p", "r")) g41 <- s.label(pca1$l1, plab.cex = 0.5, plot = FALSE) g42 <- s.arrow(2 * pca1$co, plot = FALSE) g4 <- superpose(g41, g42) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } } else { par(mfrow = c(2, 2)) barplot(pca1$eig) s.corcircle(pca1$co) plot(olympic$score, pca1$l1[, 1]) abline(lm(pca1$l1[, 1] ~ olympic$score)) s.label(pca1$l1, clab = 0.5) s.arrow(2 * pca1$co, add.p = TRUE) par(mfrow = c(1, 1)) }} \keyword{datasets} ade4/man/plot.phylog.Rd0000644000176200001440000001172513021372261014413 0ustar liggesusers\name{plot.phylog} \alias{plot.phylog} \alias{radial.phylog} \alias{enum.phylog} \title{Plot phylogenies} \description{ \code{plot.phylog} draws phylogenetic trees as linear dendograms. \cr \code{radial.phylog} draws phylogenetic trees as circular dendograms. \cr \code{enum.phylog} enumerate all the possible representations for a phylogeny. } \usage{ \method{plot}{phylog}(x, y = NULL, f.phylog = 0.5, cleaves = 1, cnodes = 0, labels.leaves = names(x$leaves), clabel.leaves = 1, labels.nodes = names(x$nodes), clabel.nodes = 0, sub = "", csub = 1.25, possub = "bottomleft", draw.box = FALSE, ...) radial.phylog(phylog, circle = 1, cleaves = 1, cnodes = 0, labels.leaves = names(phylog$leaves), clabel.leaves = 1, labels.nodes = names(phylog$nodes), clabel.nodes = 0, draw.box = FALSE) enum.phylog(phylog, no.over = 1000) } \arguments{ \item{x, phylog}{an object of class \code{phylog}} \item{y}{a vector which values correspond to leaves positions} \item{f.phylog}{a size coefficient for tree size (a parameter to draw the tree in proportion to leaves label)} \item{circle}{a size coefficient for the outer circle} \item{cleaves}{a character size for plotting the points that represent the leaves, used with \code{par("cex")*cleaves}. If zero, no points are drawn} \item{cnodes}{a character size for plotting the points that represent the nodes, used with \code{par("cex")*cnodes}. If zero, no points are drawn} \item{labels.leaves}{a vector of strings of characters for the leaves labels} \item{clabel.leaves}{a character size for the leaves labels, used with \code{par("cex")*clabel.leaves}. If zero, no leaves labels are drawn} \item{labels.nodes}{a vector of strings of characters for the nodes labels} \item{clabel.nodes}{a character size for the nodes labels, used with \code{par("cex")*clabel.nodes}. If zero, no nodes labels are drawn} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{draw.box}{if TRUE draws a box around the current plot with the function \code{box()}} \item{\dots}{further arguments passed to or from other methods} \item{no.over}{a size coefficient for the number of representations} } \details{ The vector y is an argument of the function \code{plot.phylog} that ensures to plot one of the possible representations of a phylogeny. The vector y is a permutation of the set of leaves \{1,2,\dots,f\} compatible with the phylogeny's topology. } \value{ The function \code{enum.phylog} returns a matrix with as many columns as leaves. Each row gives a permutation of the set of leaves \{1,2,\dots,f\} compatible with the phylogeny's topology. } \author{Daniel Chessel \cr Sébastien Ollier \email{sebastien.ollier@u-psud.fr} } \seealso{\code{\link{phylog}}} \examples{ data(newick.eg) par(mfrow = c(3,2)) for(i in 1:6) plot(newick2phylog(newick.eg[[i]], FALSE), clea = 2, clabel.l = 3, cnod = 2.5) par(mfrow = c(1,1)) \dontrun{ par(mfrow = c(1,2)) plot(newick2phylog(newick.eg[[11]], FALSE), clea = 1.5, clabel.l = 1.5, clabel.nod = 0.75, f = 0.8) plot(newick2phylog(newick.eg[[10]], FALSE), clabel.l = 0, clea = 0, cn = 0, f = 1) par(mfrow = c(1,1)) } par(mfrow = c(2,2)) w7 <- newick2phylog("(((((1,2,3)b),(6)c),(4,5)d,7)f);") plot(w7,clabel.l = 1.5, clabel.n = 1.5, f = 0.8, cle = 2, cnod = 3, sub = "(((((1,2,3)b),(6)c),(4,5)d,7)f);", csub = 2) w <- NULL w[1] <- "((((e1:4,e2:4)a:5,(e3:7,e4:7)b:2)c:2,e5:11)d:2," w[2] <- "((e6:5,e7:5)e:4,(e8:4,e9:4)f:5)g:4);" plot(newick2phylog(w), f = 0.8, cnod = 2, cleav = 2, clabel.l = 2) data(taxo.eg) w <- taxo2phylog(as.taxo(taxo.eg[[1]])) plot(w, clabel.lea = 1.25, clabel.n = 1.25, sub = "Taxonomy", csub = 3, f = 0.8, possub = "topleft") provi.tre <- "(((a,b,c,d,e)A,(f,g,h)B)C)D;" provi.phy <- newick2phylog(provi.tre) plot(provi.phy, clabel.l = 2, clabel.n = 2, f = 0.8) par(mfrow = c(1,1)) \dontrun{ par(mfrow = c(3,3)) for (j in 1:6) radial.phylog(newick2phylog(newick.eg[[j]], FALSE), clabel.l = 2, cnodes = 2) radial.phylog(newick2phylog(newick.eg[[7]],FALSE), clabel.l = 2) radial.phylog(newick2phylog(newick.eg[[8]],FALSE), clabel.l = 0, circle = 1.8) radial.phylog(newick2phylog(newick.eg[[9]],FALSE), clabel.l = 1, clabel.n = 1, cle = 0, cnode = 1) par(mfrow = c(1,1)) data(bsetal97) bsetal.phy = taxo2phylog(as.taxo(bsetal97$taxo[,1:3]), FALSE) radial.phylog(bsetal.phy, cnod = 1, clea = 1, clabel.l = 0.75, draw.box = TRUE, cir = 1.1) par(mfrow = c(1,1)) } \dontrun{ # plot all the possible representations of a phylogenetic tree a <- "((a,b)A,(c,d,(e,f)B)C)D;" wa <- newick2phylog(a) wx <- enum.phylog(wa) dim(wx) par(mfrow = c(6,8)) fun <- function(x) { w <-NULL lapply(x, function(y) w<<-paste(w,as.character(y),sep="")) plot(wa, x, clabel.n = 1.25, f = 0.75, clabel.l = 2, box = FALSE, cle = 1.5, sub = w, csub = 2) invisible()} apply(wx,1,fun) par(mfrow = c(1,1)) } } \keyword{hplot} ade4/man/steppe.Rd0000644000176200001440000000216213021372261013427 0ustar liggesusers\name{steppe} \alias{steppe} \docType{data} \title{Transect in the Vegetation} \description{ This data set gives the presence-absence of 37 species on 515 sites. } \usage{data(steppe)} \format{ \code{steppe} is a list of 2 components. \describe{ \item{tab}{is a data frame with 512 rows (sites) and 37 variables (species) in presence-absence.} \item{esp.names}{is a vector of the species names.} } } \source{ Estève, J. (1978) Les méthodes d'ordination : éléments pour une discussion. in J. M. Legay and R. Tomassone, editors. \emph{Biométrie et Ecologie}, Société Française de Biométrie, Paris, 223--250. } \examples{ par(mfrow = c(3,1)) data(steppe) w1 <- col(as.matrix(steppe$tab[,1:15])) w1 <- as.numeric(w1[steppe$tab[,1:15] > 0]) w2 <- row(as.matrix(steppe$tab[,1:15])) w2 <- as.numeric(w2[steppe$tab[,1:15] > 0]) plot(w2, w1, pch = 20) plot(dudi.pca(steppe$tab, scan = FALSE, scale = FALSE)$li[,1], pch = 20, ylab = "PCA", xlab = "", type = "b") plot(dudi.coa(steppe$tab, scan = FALSE)$li[,1], pch = 20, ylab = "COA", xlab = "", type = "b") par(mfrow = c(1,1)) } \keyword{datasets} ade4/man/dudi.acm.Rd0000644000176200001440000000562613021372261013623 0ustar liggesusers\name{dudi.acm} \alias{dudi.acm} \alias{acm.burt} \alias{acm.disjonctif} \alias{boxplot.acm} \title{Multiple Correspondence Analysis} \description{ \code{dudi.acm} performs the multiple correspondence analysis of a factor table.\cr \code{acm.burt} an utility giving the crossed Burt table of two factors table.\cr \code{acm.disjonctif} an utility giving the complete disjunctive table of a factor table.\cr \code{boxplot.acm} a graphic utility to interpret axes.\cr } \usage{ dudi.acm (df, row.w = rep(1, nrow(df)), scannf = TRUE, nf = 2) acm.burt (df1, df2, counts = rep(1, nrow(df1))) acm.disjonctif (df) \method{boxplot}{acm}(x, xax = 1, \dots) } \arguments{ \item{df, df1, df2}{data frames containing only factors} \item{row.w, counts}{vector of row weights, by default, uniform weighting} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} \item{x}{an object of class \code{acm}} \item{xax}{the number of factor to display} \item{\dots}{further arguments passed to or from other methods} } \value{ \code{dudi.acm} returns a list of class \code{acm} and \code{dudi} (see \link{dudi}) containing \item{cr}{ a data frame which rows are the variables, columns are the kept scores and the values are the correlation ratios} } \references{ Tenenhaus, M. & Young, F.W. (1985) An analysis and synthesis of multiple correspondence analysis, optimal scaling, dual scaling, homogeneity analysis ans other methods for quantifying categorical multivariate data. \emph{Psychometrika}, \bold{50}, 1, 91-119. Lebart, L., A. Morineau, and M. Piron. 1995. Statistique exploratoire multidimensionnelle. Dunod, Paris. } \seealso{ \code{\link{s.chull}}, \code{\link{s.class}} } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(ours) summary(ours) if(adegraphicsLoaded()) { g1 <- s1d.boxplot(dudi.acm(ours, scan = FALSE)$li[, 1], ours) } else { boxplot(dudi.acm(ours, scan = FALSE)) } \dontrun{ data(banque) banque.acm <- dudi.acm(banque, scann = FALSE, nf = 3) if(adegraphicsLoaded()) { g2 <- adegraphics:::scatter.dudi(banque.acm) } else { scatter(banque.acm) } apply(banque.acm$cr, 2, mean) banque.acm$eig[1:banque.acm$nf] # the same thing if(adegraphicsLoaded()) { g3 <- s1d.boxplot(banque.acm$li[, 1], banque) g4 <- scatter(banque.acm) } else { boxplot(banque.acm) scatter(banque.acm) } s.value(banque.acm$li, banque.acm$li[,3]) bb <- acm.burt(banque, banque) bbcoa <- dudi.coa(bb, scann = FALSE) plot(banque.acm$c1[,1], bbcoa$c1[,1]) # mca and coa of Burt table. Lebart & coll. section 1.4 bd <- acm.disjonctif(banque) bdcoa <- dudi.coa(bd, scann = FALSE) plot(banque.acm$li[,1], bdcoa$li[,1]) # mca and coa of disjonctive table. Lebart & coll. section 1.4 plot(banque.acm$co[,1], dudi.coa(bd, scann = FALSE)$co[,1]) }} \keyword{multivariate} ade4/man/dotcircle.Rd0000644000176200001440000000200112576021756014105 0ustar liggesusers\name{dotcircle} \alias{dotcircle} \title{Representation of n values on a circle} \description{ This function represents \emph{n} values on a circle. The \emph{n} points are shared out regularly over the circle and put on the radius according to the value attributed to that measure. } \usage{ dotcircle(z, alpha0 = pi/2, xlim = range(pretty(z)), labels = names(z), clabel = 1, cleg = 1) } \arguments{ \item{z}{: a numeric vector} \item{alpha0}{: polar angle to put the first value} \item{xlim}{: the ranges to be encompassed by the circle radius} \item{labels}{: a vector of strings of characters for the angle labels} \item{clabel}{: a character size for the labels, used with \code{par("cex")*clabel}} \item{cleg}{: a character size for the ranges, used with \code{par("cex")*cleg}} } \seealso{\code{\link[CircStats]{circ.plot}}} \author{ Daniel Chessel } \examples{ w <- scores.neig(neig(n.cir = 24)) par(mfrow = c(4,4)) for (k in 1:16) dotcircle(w[,k],labels = 1:24) par(mfrow = c(1,1)) } \keyword{hplot} ade4/man/coleo.Rd0000644000176200001440000000324512576021756013251 0ustar liggesusers\name{coleo} \alias{coleo} \docType{data} \title{Table of Fuzzy Biological Traits } \description{ This data set coleo (coleoptera) is a a fuzzy biological traits table. } \usage{data(coleo)} \format{ \code{coleo} is a list of 5 components. \describe{ \item{tab}{is a data frame with 110 rows (species) and 32 columns (categories).} \item{species.names}{is a vector of species names.} \item{moda.names}{is a vector of fuzzy variables names.} \item{families}{is a factor species family.} \item{col.blocks}{is a vector containing the number of categories of each trait.} } } \source{ Bournaud, M., Richoux, P. and Usseglio-Polatera, P. (1992) An approach to the synthesis of qualitative ecological information from aquatic coleoptera communities. \emph{Regulated rivers: Research and Management}, \bold{7}, 165--180. } \examples{ data(coleo) op <- par(no.readonly = TRUE) coleo.fuzzy <- prep.fuzzy.var(coleo$tab, coleo$col.blocks) fca1 <- dudi.fca(coleo.fuzzy, sca = FALSE, nf = 3) indica <- factor(rep(names(coleo$col), coleo$col)) if(adegraphicsLoaded()) { glist <- list() for(i in levels(indica)) { df <- coleo$tab[, which(indica == i)] names(df) <- coleo$moda.names[which(indica == i)] glist[i] <- s.distri(fca1$l1, df, psub.text = as.character(i), ellipseSize = 0, starSize = 0.5, plot = FALSE, storeData = TRUE) } G <- ADEgS(glist, layout = c(3, 3)) } else { par(mfrow = c(3, 3)) for(j in levels(indica)) s.distri(fca1$l1, coleo$tab[, which(indica == j)], clab = 1.5, sub = as.character(j), cell = 0, csta = 0.5, csub = 3, label = coleo$moda.names[which(indica == j)]) par(op) par(mfrow = c(1, 1)) }} \keyword{datasets} ade4/man/s.value.Rd0000644000176200001440000000732312576021756013526 0ustar liggesusers\name{s.value} \alias{s.value} \title{Representation of a value in a graph} \description{ performs the scatter diagram with the representation of a value for a variable } \usage{ s.value(dfxy, z, xax = 1, yax = 2, method = c("squaresize", "greylevel"), zmax=NULL, csize = 1, cpoint = 0, pch = 20, clegend = 0.75, neig = NULL, cneig = 1, xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, cgrid = 0.75, include.origin = TRUE, origin = c(0,0), sub = "", csub = 1, possub = "topleft", pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) } \arguments{ \item{dfxy}{a data frame with two coordinates} \item{z}{a vector of the values corresponding to the rows of \code{dfxy}} \item{xax}{column for the x axis} \item{yax}{column for the y axis} \item{method}{a string of characters \cr "squaresize" gives black squares for positive values and white for negative values with a proportional area equal to the absolute value. \cr "greylevel" gives squares of equal size with a grey level proportional to the value. By default the first choice} \item{zmax}{a numeric value, equal by default to max(abs(z)), can be used to impose a common scale of the size of the squares to several drawings in the same device} \item{csize}{a size coefficient for symbols} \item{cpoint}{a character size for plotting the points, used with \code{par("cex")*cpoint}. If zero, no points are drawn} \item{pch}{if \code{cpoint} > 0, an integer specifying the symbol or the single character to be used in plotting points} \item{clegend}{a character size for the legend used by \code{par("cex")*clegend}} \item{neig}{a neighbouring graph} \item{cneig}{a size for the neighbouring graph lines used with \code{par("lwd")*cneig}} \item{xlim}{the ranges to be encompassed by the x, if NULL they are computed} \item{ylim}{the ranges to be encompassed by the y, if NULL they are computed} \item{grid}{a logical value indicating whether a grid in the background of the plot should be drawn} \item{addaxes}{a logical value indicating whether the axes should be plotted} \item{cgrid}{a character size, parameter used with \code{par("cex")*cgrid} to indicate the mesh of the grid} \item{include.origin}{a logical value indicating whether the point "origin" should be belonged to the graph space} \item{origin}{the fixed point in the graph space, for example c(0,0) the origin axes} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{pixmap}{an object 'pixmap' displayed in the map background} \item{contour}{a data frame with 4 columns to plot the contour of the map : each row gives a segment (x1,y1,x2,y2)} \item{area}{a data frame of class 'area' to plot a set of surface units in contour} \item{add.plot}{if TRUE uses the current graphics window} } \value{ The matched call. } \author{Daniel Chessel} \examples{ if(!adegraphicsLoaded()) { xy <- cbind.data.frame(x = runif(500), y = runif(500)) z <- rnorm(500) s.value(xy, z) s.value(xy, z, method = "greylevel") data(rpjdl) fau.coa <- dudi.coa(rpjdl$fau, scan = FALSE, nf = 3) s.value(fau.coa$li, fau.coa$li[,3], csi = 0.75, cleg = 0.75) data(irishdata) par(mfrow = c(3, 4)) irq0 <- data.frame(scale(irishdata$tab, scale = TRUE)) for (i in 1:12) { z <- irq0[, i] nam <- names(irq0)[i] s.value(irishdata$xy, z, area = irishdata$area, csi = 3, csub = 2, sub = nam, cleg = 1.5, cgrid = 0, inc = FALSE, xlim = c(16, 205), ylim = c(-50, 268), adda = FALSE, grid = FALSE) } }} \keyword{multivariate} \keyword{hplot} ade4/man/woangers.Rd0000644000176200001440000001115413021372261013755 0ustar liggesusers\name{woangers} \alias{woangers} \docType{data} \title{Plant assemblages in woodlands of the conurbation of Angers (France)} \description{ This data set gives the presence of plant species in relevés of woodlands in the conurbation of Angers; and their biological traits. } \usage{data(woangers)} \format{ \code{woangers} is a list of 2 components. \enumerate{ \item flo: is a data frame that contains the presence/absence of species in each sample site. In the codes for the sample sites (first column of the data frame), the first three letters provide the code of the woodland and the numbers represent the 5 quadrats sampled in each site. Codes for the woodlands are based on either their local name when they have one or on the name of the nearest locality. \item traits: is a data frame that contains the values of the 13 functional traits considered in the paper. One trait can be encoded by several columns. The codes are as follows: \itemize{ \item Column 1: Species names; \item Column 2: \code{li}, nominal variable that indicates the presence (y) or absence (n) of ligneous structures; \item Column 3: \code{pr}, nominal variable that indicates the presence (y) or absence (n) of prickly structures; \item Column 4: \code{fo}, circular variable that indicates the month when the flowering period starts (from 1 January to 9 September); \item Column 5: \code{he}, ordinal variable that indicates the maximum height of the leaf canopy; \item Column 6: \code{ae}, ordinal variable that indicates the degree of aerial vegetative multiplication; \item Column 7: \code{un}, ordinal variable that indicates the degree of underground vegetative multiplication; \item Column 8: \code{lp}, nominal variable that represents the leaf position by 3 levels (\code{ros} = rosette, \code{semiros} = semi-rosette and \code{leafy} = leafy stem); \item Column 9: \code{le}, nominal variable that represents the mode of leaf persistence by 5 levels (\code{seasaes} = seasonal aestival, \code{seashib} = seasonal hibernal, \code{seasver} = seasonal vernal, \code{everalw} = always evergreen, \code{everparti} = partially evergreen); \item Columns 10, 11 and 12: fuzzy variable that describes the modes of pollination with 3 levels (\code{auto} = autopollination, \code{insects} = pollination by insects, \code{wind} = pollination by wind); this fuzzy variable is expressed as proportions, i.e. for each row, the sum of the three columns equals 1; \item Columns 13, 14 and 15: fuzzy variable that describes the life cycle with 3 levels (annual, monocarpic and polycarpic); this fuzzy variable is expressed as proportions, i.e. for each row, the sum of the three column equals 1; \item Columns 16 to 20: fuzzy variable that describes the modes of dispersion with 5 levels (\code{elaio} = dispersion by ants, \code{endozoo} = injection by animals, \code{epizoo} = external transport by animals, \code{wind} = transport by wind, \code{unsp} = unspecialized transport); this fuzzy variable is expressed as proportions, i.e. for each row, the sum of the three columns equals 1; \item Column 21: \code{lo}, quantitative variable that provides the seed bank longevity index; \item Column 22: \code{lf}, quantitative variable that provides the length of the flowering period. } } } \source{ Pavoine, S., Vallet, J., Dufour, A.-B., Gachet, S. and Daniel, H. (2009) On the challenge of treating various types of variables: Application for improving the measurement of functional diversity. \emph{Oikos}, \bold{118}, 391--402. } \examples{ # Loading the data data(woangers) # Preparating of the traits traits <- woangers$traits # Nominal variables 'li', 'pr', 'lp' and 'le' # (see table 1 in the main text for the codes of the variables) tabN <- traits[, c(1:2, 7, 8)] # Circular variable 'fo' tabC <- traits[3] tabCp <- prep.circular(tabC, 1, 12) # The levels of the variable lie between 1 (January) and 12 (December). # Ordinal variables 'he', 'ae' and 'un' tabO <- traits[, 4:6] # Fuzzy variables 'mp', 'pe' and 'di' tabF <- traits[, 9:19] tabFp <- prep.fuzzy(tabF, c(3, 3, 5), labels = c("mp", "pe", "di")) # 'mp' has 3 levels, 'pe' has 3 levels and 'di' has 5 levels. # Quantitative variables 'lo' and 'lf' tabQ <- traits[, 20:21] # Combining the traits ktab1 <- ktab.list.df(list(tabN, tabCp, tabO, tabFp, tabQ)) \dontrun{ # Calculating the distances for all traits combined distrait <- dist.ktab(ktab1, c("N", "C", "O", "F", "Q")) is.euclid(distrait) # Calculating the contribution of each trait in the combined distances contrib <- kdist.cor(ktab1, type = c("N", "C", "O", "F", "Q")) contrib dotchart(sort(contrib$glocor), labels = rownames(contrib$glocor)[order(contrib$glocor[, 1])]) } } \keyword{datasets} ade4/man/macaca.Rd0000644000176200001440000000250512576021756013353 0ustar liggesusers\name{macaca} \alias{macaca} \docType{data} \title{Landmarks} \description{ This data set gives the landmarks of a macaca at the ages of 0.9 and 5.77 years. } \usage{data(macaca)} \format{ \code{macaca} is a list of 2 components. \describe{ \item{xy1}{is a data frame with 72 points and 2 coordinates.} \item{xy2}{is a data frame with 72 points and 2 coordinates.} } } \source{ Olshan, A.F., Siegel, A.F. and Swindler, D.R. (1982) Robust and least-squares orthogonal mapping: Methods for the study of cephalofacial form and growth. \emph{American Journal of Physical Anthropology}, \bold{59}, 131--137. } \examples{ data(macaca) pro1 <- procuste(macaca$xy1, macaca$xy2, scal = FALSE) pro2 <- procuste(macaca$xy1, macaca$xy2) if(adegraphicsLoaded()) { g1 <- s.match(macaca$xy1, macaca$xy2, plab.cex = 0, plot = FALSE) g2 <- s.match(pro1$tabX, pro1$rotY, plab.cex = 0.7, plot = FALSE) g3 <- s.match(pro1$tabY, pro1$rotX, plab.cex = 0.7, plot = FALSE) g4 <- s.match(pro2$tabY, pro2$rotX, plab.cex = 0.7, plot = FALSE) G <- ADEgS(c(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2,2)) s.match(macaca$xy1, macaca$xy2, clab = 0) s.match(pro1$tabX, pro1$rotY, clab = 0.7) s.match(pro1$tabY, pro1$rotX, clab = 0.7) s.match(pro2$tabY, pro2$rotX, clab = 0.7) par(mfrow = c(1,1)) }} \keyword{datasets} ade4/man/dunedata.Rd0000644000176200001440000000142012576021756013726 0ustar liggesusers\name{dunedata} \alias{dunedata} \docType{data} \title{Dune Meadow Data} \description{ \code{dunedata} is a data set containing for 20 sites, environmental variables and plant species. } \usage{data(dunedata)} \format{ \code{dunedata} is a list with 2 components. \describe{ \item{envir}{is a data frame with 20 rows (sites) 5 columns (environnemental variables).} \item{veg}{is a data frame with 20 rows (sites) 30 columns (plant species).} } } \source{ Jongman, R. H., ter Braak, C. J. F. and van Tongeren, O. F. R. (1987) \emph{Data analysis in community and landscape ecology}, Pudoc, Wageningen. } \examples{ data(dunedata) summary(dunedata$envir) is.ordered(dunedata$envir$use) score(dudi.mix(dunedata$envir, scan = FALSE)) } \keyword{datasets} ade4/man/s.logo.Rd0000644000176200001440000000665313102043107013333 0ustar liggesusers\name{s.logo} \alias{s.logo} \alias{scatterutil.logo} \title{Representation of an object in a graph by a picture} \description{ performs the scatter diagrams using pictures to represent the points } \usage{ s.logo(dfxy, listlogo, klogo=NULL, clogo=1, rectlogo=TRUE, xax = 1, yax = 2, neig = NULL, cneig = 1, xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0, 0), sub = "", csub = 1.25, possub = "bottomleft", pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) } \arguments{ \item{dfxy}{a data frame with at least two coordinates} \item{listlogo}{a list of pixmap pictures} \item{klogo}{a numeric vector giving the order in which pictures of listlogo are used; if NULL, the order is the same than the rows of dfxy} \item{clogo}{a numeric vector giving the size factor applied to each picture} \item{rectlogo}{a logical to decide whether a rectangle should be drawn around the picture (TRUE) or not (FALSE)} \item{xax}{the column number for the x-axis} \item{yax}{the column number for the y-axis} \item{neig}{a neighbouring graph} \item{cneig}{a size for the neighbouring graph lines used with par("lwd")*\code{cneig}} \item{xlim}{the ranges to be encompassed by the x axis, if NULL, they are computed} \item{ylim}{the ranges to be encompassed by the y axis, if NULL, they are computed} \item{grid}{a logical value indicating whether a grid in the background of the plot should be drawn} \item{addaxes}{a logical value indicating whether the axes should be plotted} \item{cgrid}{a character size, parameter used with par("cex")* \code{cgrid} to indicate the mesh of the grid} \item{include.origin}{a logical value indicating whether the point "origin" should be belonged to the graph space} \item{origin}{the fixed point in the graph space, for example c(0,0) the origin axes} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{pixmap}{an object 'pixmap' displayed in the map background} \item{contour}{a data frame with 4 columns to plot the contour of the map : each row gives a segment (x1,y1,x2,y2)} \item{area}{a data frame of class 'area' to plot a set of surface units in contour} \item{add.plot}{if TRUE uses the current graphics window} } \value{ The matched call. } \author{Daniel Chessel and Thibaut Jombart \email{t.jombart@imperial.ac.uk}} \examples{ if(requireNamespace("pixmap", quietly = TRUE) & requireNamespace("sp", quietly = TRUE)) { if(!adegraphicsLoaded()) { data(ggtortoises) a1 <- ggtortoises$area area.plot(a1) rect(min(a1$x), min(a1$y), max(a1$x), max(a1$y), col = "lightblue") invisible(lapply(split(a1, a1$id), function(x) polygon(x[, -1],col = "white"))) s.label(ggtortoises$misc, grid = FALSE, include.ori = FALSE, addaxes = FALSE, add.p = TRUE) listico <- ggtortoises$ico[as.character(ggtortoises$pop$carap)] s.logo(ggtortoises$pop, listico, add.p = TRUE) } else { data(capitales, package = "ade4") # 'capitales' data doesn't work with ade4 anymore g3 <- s.logo(capitales$xy[sort(rownames(capitales$xy)), ], capitales$logo, Sp = capitales$Spatial, pbackground.col = "lightblue", pSp.col = "white", pgrid.draw = FALSE) } }} \keyword{multivariate} \keyword{hplot} ade4/man/nipals.Rd0000644000176200001440000000677313047116774013446 0ustar liggesusers\name{nipals} \alias{nipals} \alias{print.nipals} \alias{scatter.nipals} \title{Non-linear Iterative Partial Least Squares (NIPALS) algorithm} \description{ This function performs NIPALS algorithm, i.e. a principal component analysis of a data table that can contain missing values. } \usage{ nipals(df, nf = 2, rec = FALSE, niter = 100, tol = 1e-09) \method{scatter}{nipals}(x, xax = 1, yax = 2, clab.row = 0.75, clab.col = 1, posieig = "top", sub = NULL, ...) \method{print}{nipals}(x, ...) } \arguments{ \item{df}{a data frame that can contain missing values} \item{nf}{an integer, the number of axes to keep} \item{rec}{a logical that specify if the functions must perform the reconstitution of the data using the \code{nf} axes} \item{niter}{an integer, the maximum number of iterations} \item{tol}{a real, the tolerance used in the iterative algorithm} \item{x}{an object of class \code{nipals}} \item{xax}{the column number for the x-axis} \item{yax}{the column number for the y-axis} \item{clab.row}{a character size for the rows} \item{clab.col}{a character size for the columns} \item{posieig}{if "top" the eigenvalues bar plot is upside, if "bottom" it is downside, if "none" no plot} \item{sub}{a string of characters to be inserted as legend} \item{\dots}{further arguments passed to or from other methods} } \details{ Data are scaled (mean 0 and variance 1) prior to the analysis. } \value{ Returns a list of classes \code{nipals}: \item{tab}{the scaled data frame} \item{eig}{the pseudoeigenvalues} \item{rank}{the rank of the analyzed matrice} \item{nf}{the number of factors} \item{c1}{the column normed scores} \item{co}{the column coordinates} \item{li}{the row coordinates} \item{call}{the call function} \item{nb}{the number of iterations for each axis} \item{rec}{a data frame obtained by the reconstitution of the scaled data using the \code{nf} axes} } \references{ Wold, H. (1966) Estimation of principal components and related models by iterative least squares. In P. Krishnaiah, editors.\emph{Multivariate Analysis}, Academic Press, 391--420.\cr\cr Wold, S., Esbensen, K. and Geladi, P. (1987) Principal component analysis \emph{Chemometrics and Intelligent Laboratory Systems}, \bold{2}, 37--52. } \author{Stéphane Dray \email{stephane.dray@univ-lyon1.fr}} \seealso{\code{\link{dudi.pca}}} \examples{ data(doubs) ## nipals is equivalent to dudi.pca when there are no NA acp1 <- dudi.pca(doubs$env, scannf = FALSE, nf = 2) nip1 <- nipals(doubs$env) if(adegraphicsLoaded()) { if(requireNamespace("lattice", quietly = TRUE)) { g1 <- s1d.barchart(acp1$eig, psub.text = "dudi.pca", p1d.horizontal = FALSE, plot = FALSE) g2 <- s1d.barchart(nip1$eig, psub.text = "nipals", p1d.horizontal = FALSE, plot = FALSE) g3 <- lattice::xyplot(nip1$c1[, 1] ~ acp1$c1[, 1], main = "col scores", xlab = "dudi.pca", ylab = "nipals") g4 <- lattice::xyplot(nip1$li[, 1] ~ acp1$li[, 1], main = "row scores", xlab = "dudi.pca", ylab = "nipals") G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } } else { par(mfrow = c(2, 2)) barplot(acp1$eig, main = "dudi.pca") barplot(nip1$eig, main = "nipals") plot(acp1$c1[, 1], nip1$c1[, 1], main = "col scores", xlab = "dudi.pca", ylab = "nipals") plot(acp1$li[, 1], nip1$li[, 1], main = "row scores", xlab = "dudi.pca", ylab = "nipals") } \dontrun{ ## with NAs: doubs$env[1, 1] <- NA nip2 <- nipals(doubs$env) cor(nip1$li, nip2$li) nip1$eig nip2$eig }} \keyword{multivariate} ade4/man/dudi.pca.Rd0000644000176200001440000000727413021372261013627 0ustar liggesusers\name{dudi.pca} \alias{dudi.pca} \title{Principal Component Analysis} \description{ \code{dudi.pca} performs a principal component analysis of a data frame and returns the results as objects of class \code{pca} and \code{dudi}. } \usage{ dudi.pca(df, row.w = rep(1, nrow(df))/nrow(df), col.w = rep(1, ncol(df)), center = TRUE, scale = TRUE, scannf = TRUE, nf = 2) } \arguments{ \item{df}{a data frame with n rows (individuals) and p columns (numeric variables)} \item{row.w}{an optional row weights (by default, uniform row weights)} \item{col.w}{an optional column weights (by default, unit column weights)} \item{center}{a logical or numeric value, centring option\cr if TRUE, centring by the mean\cr if FALSE no centring\cr if a numeric vector, its length must be equal to the number of columns of the data frame df and gives the decentring} \item{scale}{a logical value indicating whether the column vectors should be normed for the row.w weighting} \item{scannf}{a logical value indicating whether the screeplot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} } \value{ Returns a list of classes \code{pca} and \code{dudi} (see \link{dudi}) containing the used information for computing the principal component analysis : \item{tab}{the data frame to be analyzed depending of the transformation arguments (center and scale)} \item{cw}{the column weights} \item{lw}{the row weights} \item{eig}{the eigenvalues} \item{rank}{the rank of the analyzed matrice} \item{nf}{the number of kept factors} \item{c1}{the column normed scores i.e. the principal axes} \item{l1}{the row normed scores} \item{co}{the column coordinates} \item{li}{the row coordinates i.e. the principal components} \item{call}{the call function} \item{cent}{the \emph{p} vector containing the means for variables (Note that if \code{center = F}, the vector contains \emph{p} 0)} \item{norm}{the \emph{p} vector containing the standard deviations for variables i.e. the root of the sum of squares deviations of the values from their means divided by \emph{n} (Note that if \code{norm = F}, the vector contains \emph{p} 1)} } \seealso{ \code{prcomp}, \code{princomp} in the \code{mva} library } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(deug) deug.dudi <- dudi.pca(deug$tab, center = deug$cent, scale = FALSE, scan = FALSE) deug.dudi1 <- dudi.pca(deug$tab, center = TRUE, scale = TRUE, scan = FALSE) if(adegraphicsLoaded()) { g1 <- s.class(deug.dudi$li, deug$result, plot = FALSE) g2 <- s.arrow(deug.dudi$c1, lab = names(deug$tab), plot = FALSE) g3 <- s.class(deug.dudi1$li, deug$result, plot = FALSE) g4 <- s.corcircle(deug.dudi1$co, lab = names(deug$tab), full = FALSE, plot = FALSE) G1 <- rbindADEg(cbindADEg(g1, g2, plot = FALSE), cbindADEg(g3, g4, plot = FALSE), plot = TRUE) G2 <- s1d.hist(deug.dudi$tab, breaks = seq(-45, 35, by = 5), type = "density", xlim = c(-40, 40), right = FALSE, ylim = c(0, 0.1), porigin.lwd = 2) } else { par(mfrow = c(2, 2)) s.class(deug.dudi$li, deug$result, cpoint = 1) s.arrow(deug.dudi$c1, lab = names(deug$tab)) s.class(deug.dudi1$li, deug$result, cpoint = 1) s.corcircle(deug.dudi1$co, lab = names(deug$tab), full = FALSE, box = TRUE) par(mfrow = c(1, 1)) # for interpretations par(mfrow = c(3, 3)) par(mar = c(2.1, 2.1, 2.1, 1.1)) for(i in 1:9) { hist(deug.dudi$tab[,i], xlim = c(-40, 40), breaks = seq(-45, 35, by = 5), prob = TRUE, right = FALSE, main = names(deug$tab)[i], xlab = "", ylim = c(0, 0.10)) abline(v = 0, lwd = 3) } par(mfrow = c(1, 1)) } } \keyword{multivariate} ade4/man/sarcelles.Rd0000644000176200001440000000316613175633655014132 0ustar liggesusers\name{sarcelles} \alias{sarcelles} \docType{data} \title{Array of Recapture of Rings} \description{ The data frame \code{sarcelles$tab} contains the number of the winter teals (\emph{Anas C. Crecca}) for which the ring was retrieved in the area \emph{i} during the month \emph{j} (\emph{n}=3049). } \usage{data(sarcelles)} \format{\code{sarcelles} is a list with the following components: \describe{ \item{tab}{a data frame with 14 rows-areas and 12 columns-months} \item{xy}{a data frame with the 2 spatial coordinates of the 14 region centers} \item{neig}{the neighbouring graph between areas, object of the class \code{neig}} \item{col.names}{a vector containing the month items} \item{nb}{a neighborhood object (class \code{nb} defined in package \code{spdep})} }} \source{ Lebreton, J.D. (1973). Etude des déplacements saisonniers des Sarcelles d'hiver, Anas c. crecca L., hivernant en Camargue à l'aide de l'analyse factorielle des correspondances. \emph{Compte rendu hebdomadaire des séances de l'Académie des sciences}, Paris, D, III, \bold{277}, 2417--2420. } \examples{ \dontrun{ if(!adegraphicsLoaded()) { # depends of pixmap if(requireNamespace("pixmap", quietly = TRUE)) { bkgnd.pnm <- pixmap::read.pnm(system.file("pictures/sarcelles.pnm", package = "ade4")) data(sarcelles) par(mfrow = c(4, 3)) for(i in 1:12) { s.distri(sarcelles$xy, sarcelles$tab[, i], pixmap = bkgnd.pnm, sub = sarcelles$col.names[i], clab = 0, csub = 2) s.value(sarcelles$xy, sarcelles$tab[, i], add.plot = TRUE, cleg = 0) } par(mfrow = c(1, 1)) } }}} \keyword{datasets}ade4/man/symbols.phylog.Rd0000644000176200001440000000313713021372261015123 0ustar liggesusers\name{symbols.phylog} \alias{symbols.phylog} \title{Representation of a quantitative variable in front of a phylogenetic tree} \description{ \code{symbols.phylog} draws the phylogenetic tree and represents the values of the variable by symbols (squares or circles) which size is proportional to value. White symbols correspond to values which are below the mean, and black symbols correspond to values which are over. } \usage{ symbols.phylog(phylog, circles, squares, csize = 1, clegend = 1, sub = "", csub = 1, possub = "topleft") } \arguments{ \item{phylog}{ an object of class \code{phylog}} \item{circles}{ a vector giving the radii of the circles} \item{squares}{ a vector giving the length of the sides of the squares} \item{csize}{ a size coefficient for symbols} \item{clegend}{ a character size for the legend used by \code{par("cex")*clegend}} \item{sub}{ a string of characters to be inserted as legend} \item{csub}{ a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{ a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} } \author{ Daniel Chessel \cr Sébastien Ollier \email{sebastien.ollier@u-psud.fr} } \seealso{\code{\link{table.phylog}} and \code{\link{dotchart.phylog}} for many variables} \examples{ data(mjrochet) mjrochet.phy <- newick2phylog(mjrochet$tre) tab0 <- data.frame(scalewt(log(mjrochet$tab))) par(mfrow=c(3,2)) for (j in 1:6) { w <- tab0[,j] symbols.phylog(phylog = mjrochet.phy, w, csi = 1.5, cleg = 1.5, sub = names(tab0)[j], csub = 3) } par(mfrow=c(1,1)) } \keyword{hplot} ade4/man/rtest.between.Rd0000644000176200001440000000157012576021756014740 0ustar liggesusers\name{rtest.between} \alias{rtest.between} \title{Monte-Carlo Test on the between-groups inertia percentage (in R). } \description{ Performs a Monte-Carlo test on the between-groups inertia percentage. } \usage{ \method{rtest}{between}(xtest, nrepet = 99, \dots) } \arguments{ \item{xtest}{an object of class \code{between}} \item{nrepet}{the number of permutations} \item{\dots}{further arguments passed to or from other methods} } \value{ a list of the class \code{rtest} } \author{Daniel Chessel } \references{ Romesburg, H. C. (1985) Exploring, confirming and randomization tests. \emph{Computers and Geosciences}, \bold{11}, 19--37. } \examples{ data(meaudret) pca1 <- dudi.pca(meaudret$env, scan = FALSE, nf = 3) rand1 <- rtest(bca(pca1, meaudret$design$season, scan = FALSE), 99) rand1 plot(rand1, main = "Monte-Carlo test") } \keyword{multivariate} \keyword{nonparametric} ade4/man/rlq.Rd0000644000176200001440000001055513021372261012732 0ustar liggesusers\name{rlq} \alias{rlq} \alias{print.rlq} \alias{plot.rlq} \alias{summary.rlq} \alias{randtest.rlq} \title{RLQ analysis } \description{ RLQ analysis performs a double inertia analysis of two arrays (R and Q) with a link expressed by a contingency table (L). The rows of L correspond to the rows of R and the columns of L correspond to the rows of Q. } \usage{ rlq(dudiR, dudiL, dudiQ, scannf = TRUE, nf = 2) \method{print}{rlq}(x, ...) \method{plot}{rlq}(x, xax = 1, yax = 2, ...) \method{summary}{rlq}(object, ...) \method{randtest}{rlq}(xtest,nrepet = 999, modeltype = 6,...) } \arguments{ \item{dudiR}{ a duality diagram providing from one of the functions dudi.hillsmith, dudi.pca, \dots } \item{dudiL}{ a duality diagram of the function dudi.coa } \item{dudiQ}{ a duality diagram providing from one of the functions dudi.hillsmith, dudi.pca, \dots } \item{scannf}{ a logical value indicating whether the eigenvalues bar plot should be displayed } \item{nf}{ if scannf FALSE, an integer indicating the number of kept axes } \item{x}{ an rlq object } \item{xax}{the column number for the x-axis} \item{yax}{the column number for the y-axis} \item{object}{ an rlq object } \item{xtest}{ an rlq object } \item{nrepet}{ the number of permutations } \item{modeltype}{the model used to permute data(2: permute rows of R, 4: permute rows of Q, 5: permute both, 6: sequential approach, see ter Braak et al. 2012)} \item{\dots}{further arguments passed to or from other methods} } \value{ Returns a list of class 'dudi', sub-class 'rlq' containing: \item{call}{call} \item{rank}{rank} \item{nf}{a numeric value indicating the number of kept axes} \item{RV}{a numeric value, the RV coefficient} \item{eig}{a numeric vector with all the eigenvalues} \item{lw}{a numeric vector with the rows weigths (crossed array)} \item{cw}{a numeric vector with the columns weigths (crossed array)} \item{tab}{a crossed array (CA)} \item{li}{R col = CA row: coordinates} \item{l1}{R col = CA row: normed scores} \item{co}{Q col = CA column: coordinates} \item{c1}{Q col = CA column: normed scores} \item{lR}{the row coordinates (R)} \item{mR}{the normed row scores (R)} \item{lQ}{the row coordinates (Q)} \item{mQ}{the normed row scores (Q)} \item{aR}{the axis onto co-inertia axis (R)} \item{aQ}{the axis onto co-inertia axis (Q)} } \references{ Doledec, S., Chessel, D., ter Braak, C.J.F. and Champely, S. (1996) Matching species traits to environmental variables: a new three-table ordination method. \emph{Environmental and Ecological Statistics}, \bold{3}, 143--166. Dray, S., Pettorelli, N., Chessel, D. (2002) Matching data sets from two different spatial samplings. \emph{Journal of Vegetation Science}, \bold{13}, 867--874. Dray, S. and Legendre, P. (2008) Testing the species traits-environment relationships: the fourth-corner problem revisited. \emph{Ecology}, \bold{89}, 3400--3412. ter Braak, C., Cormont, A., Dray, S. (2012) Improved testing of species traits-environment relationships in the fourth corner problem. \emph{Ecology}, \bold{93}, 1525--1526. } \author{Stéphane Dray \email{stephane.dray@univ-lyon1.fr}} \section{WARNING }{ IMPORTANT : row weights for \code{dudiR} and \code{dudiQ} must be taken from \code{dudiL}. } \note{A testing procedure based on the total coinertia of the RLQ analysis is available by the function \code{randtest.rlq}. The function allows to deal with various analyses for tables R and Q. Means and variances are recomputed for each permutation (PCA); for MCA, tables are recentred and column weights are recomputed.The case of decentred PCA (PCA where centers are entered by the user) for R or Q is not yet implemented. If you want to use the testing procedure for this case, you must firstly center the table and then perform a non-centered PCA on the modified table.} \seealso{ \code{\link{coinertia}}, \code{\link{fourthcorner}}} \examples{ data(aviurba) coa1 <- dudi.coa(aviurba$fau, scannf = FALSE, nf = 2) dudimil <- dudi.hillsmith(aviurba$mil, scannf = FALSE, nf = 2, row.w = coa1$lw) duditrait <- dudi.hillsmith(aviurba$traits, scannf = FALSE, nf = 2, row.w = coa1$cw) rlq1 <- rlq(dudimil, coa1, duditrait, scannf = FALSE, nf = 2) plot(rlq1) summary(rlq1) randtest(rlq1) fourthcorner.rlq(rlq1,type="Q.axes") fourthcorner.rlq(rlq1,type="R.axes") } \keyword{ multivariate } \keyword{ spatial } ade4/man/rhizobium.Rd0000644000176200001440000000634513040362670014152 0ustar liggesusers\name{rhizobium} \alias{rhizobium} \docType{data} \title{Genetic structure of two nitrogen fixing bacteria influenced by geographical isolation and host specialization} \description{ The data set concerns fixing bacteria belonging to the genus Sinorhizobium (Rhizobiaceae) associated with the plant genus Medicago (Fabaceae). It is a combination of two data sets fully available online from GenBank and published in two recent papers (see reference below). The complete sampling procedure is described in the Additional file 3 of the reference below. We delineated six populations according to geographical origin (France: F, Tunisia Hadjeb: TH, Tunisia Enfidha: TE), the host plant (\emph{M. truncatula} or similar symbiotic specificity: T, M. laciniata: L), and the taxonomical status of bacteria (S. meliloti: mlt, S. medicae: mdc). Each population will be called hereafter according to the three above criteria, e.g. THLmlt is the population sampled in Tunisia at Hadjeb from M. laciniata nodules which include S. meliloti isolates. S. medicae interacts with M. truncatula while S. meliloti interacts with both M. laciniata (S. meliloti bv. medicaginis) and M. truncatula (S. meliloti bv. meliloti). The numbers of individuals are respectively 46 for FTmdc, 43 for FTmlt, 20 for TETmdc, 24 for TETmlt, 20 for TELmlt, 42 for THTmlt and 20 for THLmlt. Four different intergenic spacers (IGS), IGSNOD, IGSEXO, IGSGAB, and IGSRKP, distributed on the different replication units of the model strain 1021 of S. meliloti bv. meliloti had been sequenced to characterize each bacterial isolate (DNA extraction and sequencing procedures are described in an additional file). It is noteworthy that the IGSNOD marker is located within the nod gene cluster and that specific alleles at these loci determine the ability of S. meliloti strains to interact with either M. laciniata or M. truncatula. } \usage{data(rhizobium)} \format{ \code{rhizobium} is a list of 2 components. \itemize{ \item dnaobj: list of dna lists. Each dna list corresponds to a locus. For a given locus, the dna list provides the dna sequences The ith sequences of all loci corresponds to the ith individual of the data set. \item pop: The list of the populations which each individual sequence belongs to. }} \source{ Pavoine, S. and Bailly, X. (2007) New analysis for consistency among markers in the study of genetic diversity: development and application to the description of bacterial diversity. \emph{BMC Evolutionary Biology}, \bold{7}, e156. } \examples{ # The functions used below require the package ape data(rhizobium) if(requireNamespace("ape", quietly = TRUE)) { dat <- prep.mdpcoa(rhizobium[[1]], rhizobium[[2]], model = c("F84", "F84", "F84", "F81"), pairwise.deletion = TRUE) sam <- dat$sam dis <- dat$dis # The distances should be Euclidean. # Several transformations exist to render a distance object Euclidean # (see functions cailliez, lingoes and quasieuclid in the ade4 package). # Here we use the quasieuclid function. dis <- lapply(dis, quasieuclid) mdpcoa1 <- mdpcoa(sam, dis, scann = FALSE, nf = 2) # Reference analysis plot(mdpcoa1) # Differences between the loci kplot(mdpcoa1) # Alleles projected on the population maps. kplotX.mdpcoa(mdpcoa1) } } \keyword{datasets} ade4/man/avimedi.Rd0000644000176200001440000000436212576021756013567 0ustar liggesusers\name{avimedi} \alias{avimedi} \docType{data} \title{Fauna Table for Constrained Ordinations} \description{ \code{avimedi} is a list containing the information about 302 sites : \cr frequencies of 51 bird species ; two factors (habitats and Mediterranean origin). } \usage{data(avimedi)} \format{ This list contains the following objects: \describe{ \item{fau}{is a data frame 302 sites - 51 bird species. } \item{plan}{is a data frame 302 sites - 2 factors : \code{reg} with two levels Provence (\code{Pr}, South of France) and Corsica (\code{Co}) ; \code{str} with six levels describing the vegetation from a very low matorral (1) up to a mature forest of holm oaks (6).} \item{nomesp}{is a vector 51 latin names. } } } \source{ Blondel, J., Chessel, D., & Frochot, B. (1988) Bird species impoverishment, niche expansion, and density inflation in mediterranean island habitats. \emph{Ecology}, \bold{69}, 1899--1917. } \examples{ \dontrun{ data(avimedi) coa1 <- dudi.coa(avimedi$fau, scan = FALSE, nf = 3) bet1 <- bca(coa1, avimedi$plan$str, scan = FALSE) wit1 <- wca(coa1, avimedi$plan$reg, scan=FALSE) pcaiv1 <- pcaiv(coa1, avimedi$plan, scan = FALSE) if(adegraphicsLoaded()) { g1 <- s.class(coa1$li, avimedi$plan$str:avimedi$plan$reg, psub.text = "Correspondences Analysis", plot = FALSE) g2 <- s.class(bet1$ls, avimedi$plan$str, psub.text = "Between Analysis", plot = FALSE) g3 <- s.class(wit1$li, avimedi$plan$str, psub.text = "Within Analysis", plot = FALSE) g41 <- s.match(pcaiv1$li, pcaiv1$ls, plabels.cex = 0, psub.text = "Canonical Correspondences Analysis", plot = FALSE) g42 <- s.class(pcaiv1$li, avimedi$plan$str:avimedi$plan$reg, plot = FALSE) g4 <- superpose(g41, g42, plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2,2)) s.class(coa1$li,avimedi$plan$str:avimedi$plan$reg, sub = "Correspondences Analysis") s.class(bet1$ls, avimedi$plan$str, sub = "Between Analysis") s.class(wit1$li, avimedi$plan$str, sub = "Within Analysis") s.match(pcaiv1$li, pcaiv1$ls, clab = 0, sub = "Canonical Correspondences Analysis") s.class(pcaiv1$li, avimedi$plan$str:avimedi$plan$reg, add.plot = TRUE) par(mfrow=c(1,1)) } }} \keyword{datasets} ade4/man/syndicats.Rd0000644000176200001440000000150113021372261014124 0ustar liggesusers\name{syndicats} \alias{syndicats} \docType{data} \title{Two Questions asked on a Sample of 1000 Respondents} \description{ This data set is extracted from an opinion poll (period 1970-1980) on 1000 respondents. } \usage{data(syndicats)} \format{ The \code{syndicats} data frame has 5 rows and 4 columns.\cr "Which politic family are you agreeing about?" has 5 response items : \code{extgauche} (extreme left) \code{left} \code{center} \code{right} and \code{extdroite} (extreme right)\cr "What do you think of the trade importance?" has 4 response items : \code{trop} (too important) \code{adequate} \code{insufficient} \code{nesaispas} (no opinion) } \source{ unknown } \examples{ data(syndicats) par(mfrow = c(1,2)) dudi1 <- dudi.coa(syndicats, scan = FALSE) score (dudi1, 1, TRUE) score (dudi1, 1, FALSE) } \keyword{datasets} ade4/man/apis108.Rd0000644000176200001440000000145613474205664013337 0ustar liggesusers\name{apis108} \docType{data} \alias{apis108} \title{Allelic frequencies in ten honeybees populations at eight microsatellites loci} \description{ This data set gives the occurences for the allelic form on 8 loci in 10 populations of honeybees. } \usage{data(apis108)} \format{ A data frame containing 180 rows (allelic forms on 8 loci) and 10 columns (populations of honeybees : El.Hermel, Al.Hoceima, Nimba, Celinda, Pretoria, Chalkidiki, Forli, Valenciennes, Umea and Seville). } \source{ \url{http://www.montpellier.inra.fr/URLB/apis/libanfreq.pdf}\cr Franck P., Garnery L., Solignac M. and Cornuet J.M. (2000) Molecular confirmation of a fourth lineage in honeybees from the Near-East. \emph{Apidologie}, \bold{31}, 167--180. } \examples{ data(apis108) str(apis108) names(apis108) } \keyword{datasets} ade4/man/oribatid.Rd0000644000176200001440000000423313620263006013726 0ustar liggesusers\name{oribatid} \alias{oribatid} \docType{data} \title{Oribatid mite} \description{ This data set contains informations about environmental control and spatial structure in ecological communities of Oribatid mites. } \usage{data(oribatid)} \format{ \code{oribatid} is a list containing the following objects : \describe{ \item{fau}{: a data frame with 70 rows (sites) and 35 columns (Oribatid species)} \item{envir}{: a data frame with 70 rows (sites) and 5 columns (environmental variables)} \item{xy}{: a data frame that contains spatial coordinates of the 70 sites} }} \details{ Variables of \code{oribatid$envir} are the following ones : \cr substrate: a factor with seven levels that describes the nature of the substratum\cr shrubs: a factor with three levels that describes the absence/presence of shrubs\cr topo: a factor with two levels that describes the microtopography\cr density: substratum density (\eqn{g.L^{-1}}{g.L^-1})\cr water: water content of the substratum (\eqn{g.L^{-1}}{g.L^-1}) } \source{ Data prepared by P. Legendre \email{Pierre.Legendre@umontreal.ca} and D. Borcard \email{borcardd@magellan.umontreal.ca} } \references{ Borcard, D., and Legendre, P. (1994) Environmental control and spatial structure in ecological communities: an example using Oribatid mites (\emph{Acari Oribatei}). \emph{Environmental and Ecological Statistics}, \bold{1}, 37--61. Borcard, D., Legendre, P., and Drapeau, P. (1992) Partialling out the spatial component of ecological variation. \emph{Ecology}, \bold{73}, 1045--1055. See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps039.pdf} (in French). } \examples{ data(oribatid) ori.xy <- oribatid$xy[, c(2, 1)] names(ori.xy) <- c("x","y") plot(ori.xy,pch = 20, cex = 2, asp = 1) if(requireNamespace("deldir", quietly = TRUE) & requireNamespace("spdep", quietly = TRUE)) { plot(deldir::deldir(ori.xy), add = TRUE) if(adegraphicsLoaded()) { s.label(ori.xy, nb = spdep::knn2nb(spdep::knearneigh(as.matrix(ori.xy), 3)), plab.cex = 0) } else { s.label(ori.xy, add.p = TRUE, clab = 0, neig = nb2neig(spdep::knn2nb(spdep::knearneigh(as.matrix(ori.xy), 3)))) } } } \keyword{datasets} ade4/man/escopage.Rd0000644000176200001440000000210413021372261013711 0ustar liggesusers\name{escopage} \alias{escopage} \docType{data} \title{K-tables of wine-tasting} \description{ This data set describes 27 characteristics of 21 wines distributed in four fields : rest, visual, olfactory and global. } \usage{data(escopage)} \format{ \code{escopage} is a list of 3 components. \describe{ \item{tab}{is a data frame with 21 observations (wines) and 27 variables. } \item{tab.names}{is the vector of the names of sub-tables : "rest" "visual" "olfactory" "global".} \item{blo}{is a vector of the numbers of variables for each sub-table.} } } \source{ Escofier, B. and Pagès, J. (1990) \emph{Analyses factorielles simples et multiples : objectifs, méthodes et interprétation} Dunod, Paris. 1--267. Escofier, B. and Pagès, J. (1994) Multiple factor analysis (AFMULT package). \emph{Computational Statistics and Data Analysis}, \bold{18}, 121--140. } \examples{ data(escopage) w <- data.frame(scale(escopage$tab)) w <- ktab.data.frame(w, escopage$blo) names(w)[1:4] <- escopage$tab.names plot(mfa(w, scan = FALSE)) } \keyword{datasets} ade4/man/sco.label.Rd0000644000176200001440000000456713021372261014004 0ustar liggesusers\name{sco.label} \alias{sco.label} \title{1D plot of a numeric score with labels} \description{ Draws evenly spaced labels, each label linked to the corresponding value of a numeric score. } \usage{ sco.label(score, label = names(score), clabel = 1, horizontal = TRUE, reverse = FALSE, pos.lab = 0.5, pch = 20, cpoint = 1, boxes = TRUE, lim = NULL, grid = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0, 0), sub = "", csub = 1.25, possub = "bottomleft") } \arguments{ \item{score}{a numeric vector} \item{label}{labels for the score} \item{clabel}{a character size for the labels, used with \code{par("cex")*clabel}} \item{horizontal}{logical. If TRUE, the plot is horizontal} \item{reverse}{logical. If horizontal = TRUE and reverse=TRUE, the plot is at the bottom, if reverse = FALSE, the plot is at the top. If horizontal = FALSE, the plot is at the right (TRUE) or at the left (FALSE).} \item{pos.lab}{a values between 0 and 1 to manage the position of the labels.} \item{pch}{an integer specifying the symbol or the single character to be used in plotting points} \item{cpoint}{a character size for plotting the points, used with \code{par("cex")*cpoint}. If zero, no points are drawn} \item{boxes}{if TRUE, labels are framed} \item{lim}{the range for the x axis or y axis (if horizontal = FALSE), if NULL, they are computed} \item{grid}{a logical value indicating whether a grid in the background of the plot should be drawn} \item{cgrid}{a character size, parameter used with par("cex")* \code{cgrid} to indicate the mesh of the grid} \item{include.origin}{a logical value indicating whether the point "origin" should belong to the plot} \item{origin}{the fixed point in the graph space, for example c(0,0) the origin axes} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} } \value{ The matched call. } \author{Stéphane Dray \email{stephane.dray@univ-lyon1.fr}, Jean Thioulouse} \examples{ data(meau) envpca <- dudi.pca(meau$env, scannf=FALSE) par(mfrow=c(2,1)) sco.label(envpca$l1[,1], row.names(envpca$l1), lim=c(-1,3.5)) sco.label(envpca$co[,1], row.names(envpca$co), reverse = TRUE, lim=c(-1,3.5)) } \keyword{multivariate} \keyword{hplot} ade4/man/s.hist.Rd0000644000176200001440000000235612576021756013362 0ustar liggesusers\name{s.hist} \alias{s.hist} \title{Display of a scatterplot and its two marginal histograms} \description{ performs a scatterplot and the two marginal histograms of each axis. } \usage{ s.hist(dfxy, xax = 1, yax = 2, cgrid = 1, cbreaks = 2, adjust = 1, ...) } \arguments{ \item{dfxy}{a data frame with two coordinates } \item{xax}{column for the x axis } \item{yax}{column for the y axis } \item{cgrid}{a character size, parameter used with \code{par("cex")*cgrid} to indicate the mesh of the grid } \item{cbreaks}{a parameter used to define the numbers of cells for the histograms. By default, two cells are defined for each interval of the grid displayed in \code{s.label}. With an increase of the integer \code{cbreaks}, the number of cells increases as well.} \item{adjust}{a parameter passed to \code{density} to display a kernel density estimation} \item{\dots}{further arguments passed from the \code{s.label} for the scatter plot} } \value{ The matched call. } \author{Daniel Chessel } \examples{ data(rpjdl) coa1 <- dudi.coa(rpjdl$fau, scannf = FALSE, nf = 4) s.hist(coa1$li) s.hist(coa1$li, cgrid = 2, cbr = 3, adj = 0.5, clab = 0) s.hist(coa1$co, cgrid = 2, cbr = 3, adj = 0.5, clab = 0) } \keyword{multivariate} \keyword{hplot} ade4/man/costatis.randtest.Rd0000644000176200001440000000233613050632301015602 0ustar liggesusers\name{costatis.randtest} \alias{costatis.randtest} \title{Monte-Carlo test on a Costatis analysis (in C).} \description{ Performs a Monte-Carlo test on a Costatis analysis. } \usage{ costatis.randtest(KTX, KTY, nrepet = 999, ...) } \arguments{ \item{KTX}{an objet of class ktab} \item{KTY}{an objet of class ktab} \item{nrepet}{the number of permutations} \item{\dots}{further arguments passed to or from other methods} } \value{ a list of the class \code{randtest} } \references{ Thioulouse J. (2011). Simultaneous analysis of a sequence of paired ecological tables: a comparison of several methods. \emph{Annals of Applied Statistics}, \bold{5}, 2300-2325. } \author{Jean Thioulouse \email{Jean.Thioulouse@univ-lyon1.fr}} \examples{ data(meau) wit1 <- withinpca(meau$env, meau$design$season, scan = FALSE, scal = "total") pcaspe <- dudi.pca(meau$spe, scale = FALSE, scan = FALSE, nf = 2) wit2 <- wca(pcaspe, meau$design$season, scan = FALSE, nf = 2) kta1 <- ktab.within(wit1, colnames = rep(c("S1","S2","S3","S4","S5","S6"), 4)) kta2 <- ktab.within(wit2, colnames = rep(c("S1","S2","S3","S4","S5","S6"), 4)) costatis1 <- costatis(kta1, kta2, scan = FALSE) costatis.randtest(kta1, kta2) } \keyword{multivariate} \keyword{nonparametric} ade4/man/varipart.Rd0000644000176200001440000000702613331075164013771 0ustar liggesusers\name{varipart} \alias{varipart} \alias{print.varipart} \title{Partition of the variation of a response multivariate table by 2 explanatory tables} \usage{ varipart(Y, X, W = NULL, nrepet = 999, type = c("simulated", "parametric"), scale = FALSE, \dots) \method{print}{varipart}(x, \dots) } \arguments{ \item{Y}{a vector, matrix or data frame or an object of class \code{dudi}. If not a \code{dudi} object, the data are trated by a principal component analysis (\code{dudi.pca}).} \item{X, W}{dataframes or matrices of explanatory (co)variables (numeric and/or factor variables). By default, no covariables are considered (\code{W} is \code{NULL}) and this case corresponds to simple caonical ordination.} \item{nrepet}{an integer indicating the number of permutations .} \item{type}{a character specifying the algorithm which should be used to adjust R-squared (either \code{"simulated"} or \ code{"parametric"}).} \item{scale}{If \code{Y} is not a dudi, a \code{logical} indicating if variables should be scaled} \item{\dots}{further arguments passed to \code{as.krandtest} or \code{as.randtest} (if no covariables are considered) for function \code{varipart}.} \item{x}{an object of class \code{varipart}} } \value{ It returns an object of class \code{varipart}. It is a \code{list} with: \describe{ \item{\code{test}}{the significance test of fractions [ab], [bc], and [abc] based on randomization procedure. An object of class \code{krandtest}} \item{\code{R2}}{unadjusted estimations of fractions [a], [b], [c], and [d]} \item{\code{R2.adj}}{adjusted estimations of fractions [a], [b], [c], and [d]} \item{\code{call}}{the matched call} } } \description{ The function partitions the variation of a response table (usually community data) with respect to two explanatory tables. The function performs the variation partitioning based on redundancy analysis (RDA, if \code{dudiY} is obtained by \code{dudi.pca}) or canonical correspondance analysis (CCA, if \code{dudiY} is obtained by \code{dudi.coa}) and computes unadjusted and adjusted R-squared. The significance of R-squared are evaluated by a randomization procedure where the rows of the explanatory tables are permuted. } \details{ Two types of algorithm are provided to adjust R-squared. The "simulated" procedure estimates the unadjusted R-squared expected under the null hypothesis H0 and uses it to adjust the observed R-squared as follows: R2.adj = 1 - (1 - R2) / (1 - E(R2|H0)) with R2.adj the adjusted R-squared and R2 the unadjusted R-squared. The "parametric" procedure performs the Ezequiel's adjustement on the unadjusted R-squared as: R2.adj = 1 - (1 - R2) / (1 - p / (n - 1)) where n is the number of sites, and p the number of predictors. } \examples{ data(mafragh) # PCA on response table Y Y <- mafragh$flo dudiY <- dudi.pca(Y, scannf = FALSE, scale = FALSE) # Variation partitioning based on RDA # without covariables vprda <- varipart(dudiY, mafragh$env) vprda # Variation partitioning based on RDA # with covariables and parametric estimation vprda <- varipart(dudiY, mafragh$env, mafragh$xy, type = "parametric") vprda names(vprda) } \references{ Borcard, D., P. Legendre, and P. Drapeau. 1992. Partialling out the spatial component of ecological variation. Ecology 73:1045. Peres-Neto, P. R., P. Legendre, S. Dray, and D. Borcard. 2006. Variation partitioning of species data matrices: estimation and comparison of fractions. Ecology 87:2614–2625. } \seealso{ \code{\link{pcaiv}} } \author{ Stephane Dray \email{stephane.dray@univ-lyon1.fr} and Sylvie Clappe \email{sylvie.clappe@univ-lyon1.fr} } ade4/man/butterfly.Rd0000644000176200001440000000427113175633655014173 0ustar liggesusers\name{butterfly} \alias{butterfly} \docType{data} \title{Genetics-Ecology-Environment Triple} \description{ This data set contains environmental and genetics informations about 16 \emph{Euphydryas editha} butterfly colonies studied in California and Oregon. } \usage{data(butterfly)} \format{\code{butterfly} is a list with the following components: \describe{ \item{xy}{a data frame with the two coordinates of the 16 \emph{Euphydryas editha} butterfly colonies} \item{envir}{a environmental data frame of 16 sites - 4 variables} \item{genet}{a genetics data frame of 16 sites - 6 allele frequencies} \item{contour}{a data frame for background map (California map)} \item{Spatial}{an object of the class \code{SpatialPolygons} of \code{sp}, containing the map} }} \source{ McKechnie, S.W., Ehrlich, P.R. and White, R.R. (1975). Population genetics of Euphydryas butterflies. I. Genetic variation and the neutrality hypothesis. \emph{Genetics}, \bold{81}, 571--594. } \references{ Manly, B.F. (1994) \emph{Multivariate Statistical Methods. A primer.} Second edition. Chapman & Hall, London. 1--215. } \examples{ data(butterfly) if(adegraphicsLoaded()) { if(requireNamespace("sp", quietly = TRUE)) { g1 <- s.label(butterfly$xy, Sp = butterfly$Spatial, pSp.col = "white", porigin.include = FALSE, plot = FALSE) g2 <- table.value(dist(butterfly$xy), plot = FALSE) g3 <- s.value(butterfly$xy, dudi.pca(butterfly$envir, scan = FALSE)$li[, 1], Sp = butterfly$Spatial, pori.inc = FALSE, pSp.col = "transparent", ppoints.cex = 2, plot = FALSE) ## mt <- mantel.randtest(dist(butterfly$xy), dist(butterfly$gen), 99) G <- ADEgS(list(g1, g2, g3), layout = c(2, 2), plot = TRUE) } } else { par(mfrow = c(2, 2)) s.label(butterfly$xy, contour = butterfly$contour, inc = FALSE) table.dist(dist(butterfly$xy), labels = row.names(butterfly$xy)) # depends of mva s.value(butterfly$xy, dudi.pca(butterfly$envir, scan = FALSE)$li[,1], contour = butterfly$contour, inc = FALSE, csi = 3) plot(mantel.randtest(dist(butterfly$xy), dist(butterfly$gen), 99), main = "genetic/spatial") par(mfrow = c(1,1)) }} \keyword{datasets}ade4/man/yanomama.Rd0000644000176200001440000000273212576021756013752 0ustar liggesusers\name{yanomama} \alias{yanomama} \docType{data} \title{Distance Matrices} \description{ This data set gives 3 matrices about geographical, genetic and anthropometric distances. } \usage{data(yanomama)} \format{ \code{yanomama} is a list of 3 components: \describe{ \item{geo}{is a matrix of 19-19 geographical distances} \item{gen}{is a matrix of 19-19 SFA (genetic) distances} \item{ant}{is a matrix of 19-19 anthropometric distances} } } \source{ Spielman, R.S. (1973) Differences among Yanomama Indian villages: do the patterns of allele frequencies, anthropometrics and map locations correspond? \emph{American Journal of Physical Anthropology}, \bold{39}, 461--480. } \references{ Table 7.2 Distance matrices for 19 villages of Yanomama Indians. All distances are as given by Spielman (1973), multiplied by 100 for convenience in: Manly, B.F.J. (1991) \emph{Randomization and Monte Carlo methods in biology} Chapman and Hall, London, 1--281. } \examples{ data(yanomama) gen <- quasieuclid(as.dist(yanomama$gen)) # depends of mva ant <- quasieuclid(as.dist(yanomama$ant)) # depends of mva par(mfrow = c(2,2)) plot(gen, ant) t1 <- mantel.randtest(gen, ant, 99); plot(t1, main = "gen-ant-mantel") ; print(t1) t1 <- procuste.rtest(pcoscaled(gen), pcoscaled(ant), 99) plot(t1, main = "gen-ant-procuste") ; print(t1) t1 <- RV.rtest(pcoscaled(gen), pcoscaled(ant), 99) plot(t1, main = "gen-ant-RV") ; print(t1) } \keyword{datasets} ade4/man/randxval.Rd0000644000176200001440000000346313047116774013770 0ustar liggesusers\name{randxval} \alias{randxval} \alias{krandxval} \alias{as.krandxval} \alias{print.krandxval} \alias{as.randxval} \alias{print.randxval} \title{Two-fold cross-validation} \description{Functions and classes to manage outputs of two-fold cross-validation for one (class \code{randxval}) or several (class \code{krandxval}) statistics} \usage{ as.krandxval(RMSEc, RMSEv, quantiles = c(0.25, 0.75), names = colnames(RMSEc), call = match.call()) \method{print}{krandxval}(x, ...) as.randxval(RMSEc, RMSEv, quantiles = c(0.25, 0.75), call = match.call()) \method{print}{randxval}(x, ...) } \arguments{ \item{RMSEc}{a vector (class \code{randxval}) or a matrix (class \code{krandxval}) with the root-mean-square error of calibration (statistics as columns and repetions as rows)} \item{RMSEv}{a vector (class \code{randxval}) or a matrix (class \code{krandxval}) with the root-mean-square error of validation (statistics as columns and repetions as rows)} \item{quantiles}{a vector indicating the lower and upper quantiles to compute} \item{names}{a vector of names for the statistics} \item{call}{the matching call} \item{x}{an object of class \code{randxval} or \code{krandxval}} \item{\dots}{other arguments to be passed to methods} } \value{an object of class \code{randxval} or \code{krandxval}} \references{Stone M. (1974) Cross-validatory choice and assessment of statistical predictions. \emph{Journal of the Royal Statistical Society}, 36, 111-147} \author{Stéphane Dray (\email{stephane.dray@univ-lyon1.fr})} \seealso{\code{\link{testdim.multiblock}}} \examples{ ## an example corresponding to 10 statistics and 100 repetitions cv <- as.krandxval(RMSEc = matrix(rnorm(1000), nrow = 100), RMSEv = matrix(rnorm(1000, mean = 1), nrow = 100)) cv if(adegraphicsLoaded()) plot(cv) } \keyword{htest} ade4/man/humDNAm.Rd0000644000176200001440000000246112576021756013440 0ustar liggesusers\name{humDNAm} \alias{humDNAm} \docType{data} \title{human mitochondrial DNA restriction data} \description{ This data set gives the frequencies of haplotypes of mitochondrial DNA restriction data in ten populations all over the world.\cr It gives also distances among the haplotypes. } \usage{data(humDNAm)} \format{ \code{humDNAm} is a list of 3 components. \describe{ \item{distances}{is an object of class \code{dist} with 56 haplotypes. These distances are computed by counting the number of differences in restriction sites between two haplotypes.} \item{samples}{is a data frame with 56 haplotypes, 10 abundance variables (populations). These variables give the haplotype abundance in a given population.} \item{structures}{is a data frame with 10 populations, 1 variable (classification). This variable gives the name of the continent in which a given population is located. } }} \source{ Excoffier, L., Smouse, P.E. and Quattro, J.M. (1992) Analysis of molecular variance inferred from metric distances among DNA haplotypes: application to human mitochondrial DNA restriction data. \emph{Genetics}, \bold{131}, 479--491. } \examples{ data(humDNAm) dpcoahum <- dpcoa(data.frame(t(humDNAm$samples)), sqrt(humDNAm$distances), scan = FALSE, nf = 2) plot(dpcoahum) } \keyword{datasets} ade4/man/macroloire.Rd0000644000176200001440000000763013021372261014270 0ustar liggesusers\name{macroloire} \alias{macroloire} \docType{data} \title{Assemblages of Macroinvertebrates in the Loire River (France)} \description{ A total of 38 sites were surveyed along 800 km of the Loire River yielding 40 species of Trichoptera and Coleoptera sampled from riffle habitats. The river was divided into three regions according to geology: granitic highlands (Region#1), limestone lowlands (Region#2) and granitic lowlands (Region#3). This data set has been collected for analyzing changes in macroinvertebrate assemblages along the course of a large river. Four criterias are given here: variation in 1/ species composition and relative abundance, 2/ taxonomic composition, 3/ Body Sizes, 4/ Feeding habits. } \usage{data(macroloire)} \format{ \code{macroloire} is a list of 5 components. \describe{ \item{fau}{is a data frame containing the abundance of each species in each station.} \item{traits}{is a data frame describes two traits : the maximal sizes and feeding habits for each species. Each trait is divided into categories. The maximal size achieved by the species is divided into four length categories: <= 5mm ; >5-10mm ; >10-20mm ; >20-40mm. Feeding habits comprise seven categories: engulfers, shredders, scrapers, deposit-feeders, active filter-feeders, passive filter-feeders and piercers, in this order. The affinity of each species to each trait category is quantified using a fuzzy coding approach. A score is assigned to each species for describing its affinity for a given trait category from "0" which indicates no affinity to "3" which indicates high affinity. These affinities are further transformed into percentage per trait per species.} \item{taxo}{is a data frame with species and 3 factors: Genus, Family and Order. It is a data frame of class "taxo": the variables are factors giving nested classifications.} \item{envir}{is a data frame giving for each station, its name (variable "SamplingSite"), its distance from the source (km, variable "Distance"), its altitude (m, variable "Altitude"), its position regarding the dams [1: before the first dam; 2: after the first dam; 3: after the second dam] (variable "Dam"), its position in one of the three regions defined according to geology: granitic highlands, limestone lowlands and granitic lowlands (variable "Morphoregion"), presence of confluence (variable "Confluence")} \item{labels}{is a data frame containing the latin names of the species.} } } \source{ Ivol, J.M., Guinand, B., Richoux, P. and Tachet, H. (1997) Longitudinal changes in Trichoptera and Coleoptera assemblages and environmental conditions in the Loire River (France). \emph{Archiv for Hydrobiologie}, \bold{138}, 525--557.\cr Pavoine S. and Doledec S. (2005) The apportionment of quadratic entropy: a useful alternative for partitioning diversity in ecological data. \emph{Environmental and Ecological Statistics}, \bold{12}, 125--138. } \examples{ data(macroloire) apqe.Equi <- apqe(macroloire$fau, , macroloire$morphoregions) apqe.Equi #test.Equi <- randtest.apqe(apqe.Equi, method = "aggregated", 99) #plot(test.Equi) \dontrun{ m.phy <- taxo2phylog(macroloire$taxo) apqe.Tax <- apqe(macroloire$fau, m.phy$Wdist, macroloire$morphoregions) apqe.Tax #test.Tax <- randtest.apqe(apqe.Tax, method = "aggregated", 99) #plot(test.Tax) dSize <- sqrt(dist.prop(macroloire$traits[ ,1:4], method = 2)) apqe.Size <- apqe(macroloire$fau, dSize, macroloire$morphoregions) apqe.Size #test.Size <- randtest.apqe(apqe.Size, method = "aggregated", 99) #plot(test.Size) dFeed <- sqrt(dist.prop(macroloire$traits[ ,-(1:4)], method = 2)) apqe.Feed <- apqe(macroloire$fau, dFeed, macroloire$morphoregions) apqe.Feed #test.Feed <- randtest.apqe(apqe.Feed, method = "aggregated", 99) #plot(test.Size) } } \keyword{datasets} ade4/man/score.pca.Rd0000644000176200001440000000224512576021756014024 0ustar liggesusers\name{score.pca} \alias{score.pca} \title{Graphs to Analyse a factor in PCA} \description{ performs the canonical graph of a Principal Component Analysis. } \usage{ \method{score}{pca}(x, xax = 1, which.var = NULL, mfrow = NULL, csub = 2, sub = names(x$tab), abline = TRUE, \dots) } \arguments{ \item{x}{an object of class \code{pca}} \item{xax}{the column number for the used axis} \item{which.var}{the numbers of the kept columns for the analysis, otherwise all columns} \item{mfrow}{a vector of the form "c(nr,nc)", otherwise computed by a special own function \code{n2mfrow}} \item{csub}{a character size for sub-titles, used with \code{par("cex")*csub}} \item{sub}{a vector of string of characters to be inserted as sub-titles, otherwise the names of the variables} \item{abline}{a logical value indicating whether a regression line should be added} \item{\dots}{further arguments passed to or from other methods} } \author{Daniel Chessel } \examples{ data(deug) dd1 <- dudi.pca(deug$tab, scan = FALSE) score(dd1) # The correlations are : dd1$co[,1] # [1] 0.7925 0.6532 0.7410 0.5287 0.5539 0.7416 0.3336 0.2755 0.4172 } \keyword{multivariate} \keyword{hplot} ade4/man/ardeche.Rd0000644000176200001440000000305313021372261013522 0ustar liggesusers\name{ardeche} \alias{ardeche} \docType{data} \title{Fauna Table with double (row and column) partitioning} \description{ This data set gives information about species of benthic macroinvertebrates in different sites and dates. } \usage{data(ardeche)} \format{ \code{ardeche} is a list with 6 components. \describe{ \item{tab}{is a data frame containing fauna table with 43 species (rows) and 35 samples (columns).} \item{col.blocks}{is a vector containing the repartition of samples for the 6 dates : july 1982, august 1982, november 1982, february 1983, april 1983 and july 1983.} \item{row.blocks}{is a vector containing the repartition of species in the 4 groups defining the species order.} \item{dat.fac}{is a date factor for samples (6 dates).} \item{sta.fac}{is a site factor for samples (6 sites).} \item{esp.fac}{is a species order factor (Ephemeroptera, Plecoptera, Coleoptera, Trichoptera).} } } \details{ The columns of the data frame \code{ardeche$tab} define the samples by a number between 1 and 6 (the date) and a letter between A and F (the site). } \source{ Cazes, P., Chessel, D., and Dolédec, S. (1988) L'analyse des correspondances internes d'un tableau partitionné : son usage en hydrobiologie. \emph{Revue de Statistique Appliquée}, \bold{36}, 39--54. } \examples{ data(ardeche) dudi1 <- dudi.coa(ardeche$tab, scan = FALSE) s.class(dudi1$co, ardeche$dat.fac) if(adegraphicsLoaded()) { s.label(dudi1$co, plab.cex = 0.5, add = TRUE) } else { s.label(dudi1$co, clab = 0.5, add.p = TRUE) } } \keyword{datasets} ade4/man/bsetal97.Rd0000644000176200001440000000642612576021756013606 0ustar liggesusers\name{bsetal97} \alias{bsetal97} \docType{data} \title{Ecological and Biological Traits} \description{ This data set gives ecological and biological characteristics of 131 species of aquatic insects. } \usage{data(bsetal97)} \format{ \code{bsetal97} is a list of 8 components.\cr \describe{ \item{species.names}{is a vector of the names of aquatic insects.} \item{taxo}{is a data frame containing the taxonomy of species: genus, family and order. } \item{biol}{is a data frame containing 10 biological traits for a total of 41 modalities. } \item{biol.blo}{is a vector of the numbers of items for each biological trait. } \item{biol.blo.names}{is a vector of the names of the biological traits. } \item{ecol}{is a data frame with 7 ecological traits for a total of 34 modalities. } \item{ecol.blo}{is a vector of the numbers of items for each ecological trait. } \item{ecol.blo.names}{is a vector of the names of the ecological traits. } } } \details{ The 10 variables of the data frame \code{bsetal97$biol} are called in \code{bsetal97$biol.blo.names} and the number of modalities per variable given in \code{bsetal97$biol.blo}. The variables are: female size - the body length from the front of the head to the end of the abdomen (7 length modalities), egg length - the egg size (6 modalities), egg number - count of eggs actually oviposited, generations per year (3 modalities: \eqn{\leq 1}{<= 1}, 2, > 2), oviposition period - the length of time during which oviposition occurred (3 modalities: \eqn{\leq 2}{<= 2} months, between 2 and 5 months, > 5 months), incubation time - the time between oviposition and hatching of the larvae (3 modalities: \eqn{\leq 4}{<= 4} weeks, between 4 and 12 weeks, > 12 weeks), egg shape (1-spherical, 2-oval, 3-cylindrical), egg attachment - physiological feature of the egg and of the female (4 modalities), clutch structure (1-single eggs, 2-grouped eggs, 3-egg masses), clutch number (3 modalities : 1, 2, > 2). The 7 variables of the data frame \code{bsetal97$ecol} are called in \code{bsetal97$ecol.blo.names} and the number of modalities per variable given in \code{bsetal97$ecol.blo}. The variables are: oviposition site - position relative to the water (7 modalities), substratum type for eggs - the substratum to which the eggs are definitely attached (6 modalities), egg deposition - the position of the eggs during the oviposition process (4 modalities), gross habitat - the general habitat use of the species such as temporary waters or estuaries (8 modalities), saturation variance - the exposure of eggs to the risk of dessication (2 modalities), time of day (1-morning, 2-day, 3-evening, 4-night), season - time of the year (1-Spring, 2-Summer, 3-Automn). } \source{ Statzner, B., Hoppenhaus, K., Arens, M.-F. and Richoux, P. (1997) Reproductive traits, habitat use and templet theory: a synthesis of world-wide data on aquatic insects. \emph{Freshwater Biology}, \bold{38}, 109--135. } \references{ See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps029.pdf} (in French). } \examples{ data(bsetal97) X <- prep.fuzzy.var(bsetal97$biol, bsetal97$biol.blo) Y <- prep.fuzzy.var(bsetal97$ecol, bsetal97$ecol.blo) plot(coinertia(dudi.fca(X, scan = FALSE), dudi.fca(Y, scan = FALSE), scan = FALSE)) } \keyword{datasets} ade4/man/dist.neig.Rd0000644000176200001440000000114613021372261014014 0ustar liggesusers\name{dist.neig} \alias{dist.neig} \title{Computation of the Distance Matrix associated to a Neighbouring Graph } \description{ This distance matrix between two points is the length of the shortest path between these points. } \usage{ dist.neig(neig) } \arguments{ \item{neig}{a neighbouring graph, object of class \code{neig}} } \value{ returns a distance matrix, object of class \code{dist} } \author{ Daniel Chessel \cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \examples{ data(elec88) d0 <- dist.neig(elec88$neig) plot(dist(elec88$xy),d0) } \keyword{array} \keyword{multivariate} ade4/man/table.value.Rd0000644000176200001440000000264212576021756014352 0ustar liggesusers\name{table.value} \alias{table.value} \alias{table.prepare} \title{Plot of the Arrays} \description{ presents a graph for viewing the numbers of a table by square sizes. } \usage{ table.value(df, x = 1:ncol(df), y = nrow(df):1, row.labels = row.names(df), col.labels = names(df), clabel.row = 1, clabel.col = 1, csize = 1, clegend = 1, grid = TRUE) } \arguments{ \item{df}{a data frame} \item{x}{a vector of values to position the columns} \item{y}{a vector of values to position the rows} \item{row.labels}{a character vector for the row labels} \item{col.labels}{a character vector for the column labels} \item{clabel.row}{a character size for the row labels} \item{clabel.col}{a character size for the column labels} \item{csize}{a coefficient for the square size of the values} \item{clegend}{a character size for the legend (if 0, no legend)} \item{grid}{a logical value indicating whether the grid should be plotted} } \author{ Daniel Chessel } \examples{ if(!adegraphicsLoaded()) { data(olympic) w <- olympic$tab w <- data.frame(scale(w)) wpca <- dudi.pca(w, scann = FALSE) par(mfrow = c(1, 3)) table.value(w, csi = 2, clabel.r = 2, clabel.c = 2) table.value(w, y = rank(wpca$li[, 1]), x = rank(wpca$co[, 1]), csi = 2, clabel.r = 2, clabel.c = 2) table.value(w, y = wpca$li[, 1], x = wpca$co[, 1], csi = 2, clabel.r = 2, clabel.c = 2) par(mfrow = c(1, 1)) }} \keyword{hplot} ade4/man/s.distri.Rd0000644000176200001440000000723712576021756013714 0ustar liggesusers\name{s.distri} \alias{s.distri} \title{Plot of a frequency distribution} \description{ performs the scatter diagram of a frequency distribution. } \usage{ s.distri(dfxy, dfdistri, xax = 1, yax = 2, cstar = 1, cellipse = 1.5, axesell = TRUE, label = names(dfdistri), clabel = 0, cpoint = 1, pch = 20, xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, origin = c(0,0), include.origin = TRUE, sub = "", csub = 1, possub = "bottomleft", cgrid = 1, pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) } \arguments{ \item{dfxy}{a data frame containing two columns for the axes} \item{dfdistri}{a data frame containing the mass distributions in columns} \item{xax}{the column number for the x-axis} \item{yax}{the column number for the y-axis} \item{cstar}{a number between 0 and 1 which defines the length of the star size} \item{cellipse}{a positive coefficient for the inertia ellipse size} \item{axesell}{a logical value indicating whether the ellipse axes should be drawn} \item{label}{a vector of strings of characters for the distribution centers labels} \item{clabel}{if not NULL, a character size for the labels, used with \code{par("cex")*clabel}} \item{cpoint}{a character size for plotting the points, used with \code{par("cex")*cpoint}. If zero, no points are drawn} \item{pch}{if \code{cpoint} > 0, an integer specifying the symbol or the single character to be used in plotting points} \item{xlim}{the ranges to be encompassed by the x, if NULL they are computed} \item{ylim}{the ranges to be encompassed by the y, if NULL they are computed} \item{grid}{a logical value indicating whether a grid in the background of the plot should be drawn} \item{addaxes}{a logical value indicating whether the axes should be plotted} \item{origin}{the fixed point in the graph space, for example c(0,0) the origin axes} \item{include.origin}{a logical value indicating whether the point "origin" should be belonged to the graph space} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{cgrid}{a character size, parameter used with par("cex")* \code{cgrid} to indicate the mesh of the grid} \item{pixmap}{an object 'pixmap' displayed in the map background} \item{contour}{a data frame with 4 columns to plot the contour of the map : each row gives a segment (x1,y1,x2,y2)} \item{area}{a data frame of class 'area' to plot a set of surface units in contour} \item{add.plot}{if TRUE uses the current graphics window} } \value{ The matched call. } \author{Daniel Chessel} \examples{ if(!adegraphicsLoaded()) { xy <- cbind.data.frame(x = runif(200, -1, 1), y = runif(200, -1, 1)) distri <- data.frame(w1 = rpois(200, xy$x * (xy$x > 0))) s.value(xy, distri$w1, cpoi = 1) s.distri(xy, distri, add.p = TRUE) w1 <- as.numeric((xy$x> 0) & (xy$y > 0)) w2 <- ((xy$x > 0) & (xy$y < 0)) * (1 - xy$y) * xy$x w3 <- ((xy$x < 0) & (xy$y > 0)) * (1 - xy$x) * xy$y w4 <- ((xy$x < 0) & (xy$y < 0)) * xy$y * xy$x distri <- data.frame(a = w1 / sum(w1), b = w2 / sum(w2), c = w3 / sum(w3), d = w4 / sum(w4)) s.value(xy, unlist(apply(distri, 1, sum)), cleg = 0, csi = 0.75) s.distri(xy, distri, clab = 2, add.p = TRUE) data(rpjdl) xy <- dudi.coa(rpjdl$fau, scan = FALSE)$li par(mfrow = c(3, 4)) for (i in c(1, 5, 8, 20, 21, 23, 26, 33, 36, 44, 47, 49)) { s.distri(xy, rpjdl$fau[, i], cell = 1.5, sub = rpjdl$frlab[i], csub = 2, cgrid = 1.5)} par(mfrow = c(1, 1)) }} \keyword{multivariate} \keyword{hplot} ade4/man/dist.dudi.Rd0000644000176200001440000000132413021372261014015 0ustar liggesusers\name{dist.dudi} \alias{dist.dudi} \title{Computation of the Distance Matrix from a Statistical Triplet } \description{ computes for a statistical triplet a distance matrix. } \usage{ dist.dudi(dudi, amongrow = TRUE) } \arguments{ \item{dudi}{a duality diagram, object of class \code{dudi}} \item{amongrow}{a logical value computing the distance if TRUE, between rows, if FALSE between columns.} } \value{ an object of class \code{dist} } \author{ Daniel Chessel \cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \examples{ data (meaudret) pca1 <- dudi.pca(meaudret$env, scan = FALSE) sum((dist(scalewt(meaudret$env)) - dist.dudi(pca1))^2) #[1] 4.045e-29 the same thing } \keyword{array} \keyword{multivariate} ade4/man/mstree.Rd0000644000176200001440000000302512576021756013443 0ustar liggesusers\name{mstree} \alias{mstree} \title{Minimal Spanning Tree} \description{ Minimal Spanning Tree } \usage{ mstree(xdist, ngmax = 1) } \arguments{ \item{xdist}{ an object of class \code{dist} containing an observed dissimilarity } \item{ngmax}{ a component number (default=1). Select 1 for getting classical MST. To add n supplementary edges k times: select k+1. } } \value{ returns an object of class \code{neig} } \author{Daniel Chessel} \examples{ data(mafragh) maf.coa <- dudi.coa(mafragh$flo, scan = FALSE) maf.mst <- ade4::mstree(dist.dudi(maf.coa), 1) if(adegraphicsLoaded()) { g0 <- s.label(maf.coa$li, plab.cex = 0, ppoints.cex = 2, nb = neig2nb(maf.mst)) } else { s.label(maf.coa$li, clab = 0, cpoi = 2, neig = maf.mst, cnei = 1) } xy <- data.frame(x = runif(20), y = runif(20)) if(adegraphicsLoaded()) { g1 <- s.label(xy, xlim = c(0, 1), ylim = c(0, 1), nb = neig2nb(ade4::mstree(dist.quant(xy, 1), 1)), plot = FALSE) g2 <- s.label(xy, xlim = c(0, 1), ylim = c(0, 1), nb = neig2nb(ade4::mstree(dist.quant(xy, 1), 2)), plot = FALSE) g3 <- s.label(xy, xlim = c(0, 1), ylim = c(0, 1), nb = neig2nb(ade4::mstree(dist.quant(xy, 1), 3)), plot = FALSE) g4 <- s.label(xy, xlim = c(0, 1), ylim = c(0, 1), nb = neig2nb(ade4::mstree(dist.quant(xy, 1), 4)), plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) for(k in 1:4) { neig <- mstree(dist.quant(xy, 1), k) s.label(xy, xlim = c(0, 1), ylim = c(0, 1), addax = FALSE, neig = neig) } }} \keyword{utilities} ade4/man/foucart.Rd0000644000176200001440000000532313021372261013574 0ustar liggesusers\name{foucart} \alias{foucart} \alias{plot.foucart} \alias{print.foucart} \title{K-tables Correspondence Analysis with the same rows and the same columns} \description{ K tables have the same rows and the same columns.\cr Each table is transformed by P = X/sum(X). The average of P is computing.\cr A correspondence analysis is realized on this average.\cr The initial rows and the initial columns are projected in supplementary elements. } \usage{ foucart(X, scannf = TRUE, nf = 2) \method{plot}{foucart}(x, xax = 1, yax = 2, clab = 1, csub = 2, possub = "bottomright", \dots) \method{print}{foucart}(x, \dots) } \arguments{ \item{X}{a list of data frame where the row names and the column names are the same for each table} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} \cr \item{x}{an object of class 'foucart'} \item{xax}{the column number of the x-axis} \item{yax}{the column number of the y-axis} \item{clab}{if not NULL, a character size for the labels, used with \code{par("cex")*clab}} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{\dots}{further arguments passed to or from other methods} } \value{ \code{foucart} returns a list of the classes 'dudi', 'coa' and 'foucart' \item{call}{origine} \item{nf}{axes-components saved} \item{rank}{rank} \item{blo}{useful vector} \item{cw}{vector: column weights} \item{lw}{vector: row weights} \item{eig}{vector: eigen values} \item{tab}{data.frame: modified array} \item{li}{data.frame: row coordinates} \item{l1}{data.frame: row normed scores} \item{co}{data.frame: column coordinates} \item{c1}{data.frame: column normed scores} \item{Tli}{data.frame: row coordinates (each table)} \item{Tco}{data.frame: col coordinates (each table)} \item{TL}{data.frame: factors for Tli} \item{TC}{data.frame: factors for Tco} } \references{Foucart, T. (1984) \emph{Analyse factorielle de tableaux multiples}, Masson, Paris. } \author{Pierre Bady \email{pierre.bady@univ-lyon1.fr}\cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(bf88) fou1 <- foucart(bf88, scann = FALSE, nf = 3) fou1 plot(fou1) data(meaudret) l1 <- split(meaudret$spe, meaudret$design$season) l1 <- lapply(l1, function(x) {row.names(x) <- paste("Sit",1:5,sep="");x}) fou2 <- foucart(l1, scan = FALSE) if(adegraphicsLoaded()) { kplot(fou2, row.plabels.cex = 2) } else { kplot(fou2, clab.r = 2) } } \keyword{multivariate} ade4/man/withinpca.Rd0000644000176200001440000000374513175633655014146 0ustar liggesusers\name{withinpca} \alias{withinpca} \title{Normed within principal component analysis} \description{ Performs a normed within Principal Component Analysis. } \usage{ withinpca(df, fac, scaling = c("partial", "total"), scannf = TRUE, nf = 2) } \arguments{ \item{df}{a data frame with quantitative variables} \item{fac}{a factor partitioning the rows of df in classes} \item{scaling}{a string of characters as a scaling option : \cr if "partial", the sub-table corresponding to each class is centred and normed.\cr If "total", the sub-table corresponding to each class is centred and the total table is then normed.} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} } \details{ This functions implements the 'Bouroche' standardization. In a first step, the original variables are standardized (centred and normed). Then, a second transformation is applied according to the value of the \code{scaling} argument. For "partial", variables are standardized in each sub-table (corresponding to each level of the factor). Hence, variables have null mean and unit variance in each sub-table. For "total", variables are centred in each sub-table and then normed globally. Hence, variables have a null mean in each sub-table and a global variance equal to one. } \value{ returns a list of the sub-class \code{within} of class \code{dudi}. See \code{\link{wca}} } \references{Bouroche, J. M. (1975) \emph{Analyse des données ternaires: la double analyse en composantes principales}. Thèse de 3ème cycle, Université de Paris VI. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(meaudret) wit1 <- withinpca(meaudret$env, meaudret$design$season, scannf = FALSE, scaling = "partial") kta1 <- ktab.within(wit1, colnames = rep(c("S1", "S2", "S3", "S4", "S5"), 4)) unclass(kta1) # See pta plot(wit1) } \keyword{multivariate} ade4/man/newick.eg.Rd0000644000176200001440000000273013047116774014017 0ustar liggesusers\name{newick.eg} \alias{newick.eg} \docType{data} \title{Phylogenetic trees in Newick format} \description{ This data set contains various exemples of phylogenetic trees in Newick format. } \usage{data(newick.eg)} \format{ \code{newick.eg} is a list containing 14 character strings in Newick format. } \source{ Trees 1 to 7 were obtained from the URL \cr \url{http://evolution.genetics.washington.edu/phylip/newicktree.html}. Trees 8 and 9 were obtained by Clémentine Carpentier-Gimaret. Tree 10 was obtained from Treezilla Data Sets . Trees 11 and 12 are taken from Bauwens and Díaz-Uriarte (1997). Tree 13 is taken from Cheverud and Dow (1985). Tree 13 is taken from Martins and Hansen (1997). } \references{ Bauwens, D. and Díaz-Uriarte, R. (1997) Covariation of life-history traits in lacertid lizards: a comparative study. \emph{American Naturalist}, \bold{149}, 91--111. Cheverud, J. and Dow, M.M. (1985) An autocorrelation analysis of genetic variation due to lineal fission in social groups of rhesus macaques. \emph{American Journal of Physical Anthropology}, \bold{67}, 113--122. Martins, E. P. and Hansen, T.F. (1997) Phylogenies and the comparative method: a general approach to incorporating phylogenetic information into the analysis of interspecific data. \emph{American Naturalist}, \bold{149}, 646--667. } \examples{ data(newick.eg) newick2phylog(newick.eg[[11]]) radial.phylog(newick2phylog(newick.eg[[7]]), circ = 1, clabel.l = 0.75) } \keyword{datasets} ade4/man/mjrochet.Rd0000644000176200001440000000437213175633655013770 0ustar liggesusers\name{mjrochet} \alias{mjrochet} \docType{data} \title{Phylogeny and quantitative traits of teleos fishes} \description{ This data set describes the phylogeny of 49 teleos fishes as reported by Rochet et al. (2000). It also gives life-history traits corresponding to these 49 species. } \usage{data(mjrochet)} \format{ \code{mjrochet} is a list containing the 2 following objects : \describe{ \item{tre}{is a character string giving the phylogenetic tree in Newick format.} \item{tab}{is a data frame with 49 rows and 7 traits.} }} \details{ Variables of \code{mjrochet$tab} are the following ones : tm (age at maturity (years)), lm (length at maturity (cm)), l05 (length at 5 per cent survival (cm)), t05 (time to 5 per cent survival (years)), fb (slope of the log-log fecundity-length relationship), fm (fecundity the year of maturity), egg (volume of eggs (\eqn{mm^{3}}{mm^3})). } \source{ Data taken from: \cr Summary of data - Clupeiformes : http://www.ifremer.fr/maerha/clupe.html \cr Summary of data - Argentiniformes : http://www.ifremer.fr/maerha/argentin.html \cr Summary of data - Salmoniformes : http://www.ifremer.fr/maerha/salmon.html \cr Summary of data - Gadiformes : http://www.ifremer.fr/maerha/gadi.html \cr Summary of data - Lophiiformes : http://www.ifremer.fr/maerha/loph.html \cr Summary of data - Atheriniformes : http://www.ifremer.fr/maerha/ather.html \cr Summary of data - Perciformes : http://www.ifremer.fr/maerha/perci.html \cr Summary of data - Pleuronectiformes : http://www.ifremer.fr/maerha/pleuro.html \cr Summary of data - Scorpaeniformes : http://www.ifremer.fr/maerha/scorpa.html \cr Phylogenetic tree : http://www.ifremer.fr/maerha/life_history.html } \references{ Rochet, M. J., Cornillon, P-A., Sabatier, R. and Pontier, D. (2000) Comparative analysis of phylogenic and fishing effects in life history patterns of teleos fishes. \emph{Oïkos}, \bold{91}, 255--270. } \examples{ data(mjrochet) mjrochet.phy <- newick2phylog(mjrochet$tre) tab <- log((mjrochet$tab)) tab0 <- data.frame(scalewt(tab)) table.phylog(tab0, mjrochet.phy, csi = 2, clabel.r = 0.75) if (requireNamespace("adephylo", quietly = TRUE)) { adephylo::orthogram(tab0[,1], ortho = mjrochet.phy$Bscores) } } \keyword{datasets} ade4/man/meaudret.Rd0000644000176200001440000000426513021372261013743 0ustar liggesusers\name{meaudret} \alias{meaudret} \docType{data} \title{Ecological Data : sites-variables, sites-species, where and when} \description{ This data set contains information about sites, environmental variables and Ephemeroptera Species. } \usage{data(meaudret)} \format{ \code{meaudret} is a list of 4 components. \describe{ \item{env}{is a data frame with 20 sites and 9 variables.} \item{fau}{is a data frame with 20 sites and 13 Ephemeroptera Species.} \item{design}{is a data frame with 20 sites and 2 factors. \itemize{ \item \code{season} is a factor with 4 levels = seasons. \item \code{site} is a factor with 5 levels = sites along the Meaudret river. } } \item{spe.names}{is a character vector containing the names of the 13 species.} } } \details{Data set equivalents to \code{\link{meau}}: site (6) on the Bourne (a Meaudret affluent) and oxygen concentration were removed. } \source{ Pegaz-Maucet, D. (1980) \emph{Impact d'une perturbation d'origine organique sur la dérive des macro-invertébrés benthiques d'un cours d'eau. Comparaison avec le benthos.} Thèse de 3ème cycle, Université Lyon 1, 130 p. Thioulouse, J., Simier, M. and Chessel, D. (2004) Simultaneous analysis of a sequence of paired ecological tables. \emph{Ecology}, \bold{85}, 1, 272--283. } \examples{ data(meaudret) pca1 <- dudi.pca(meaudret$env, scan = FALSE, nf = 4) pca2 <- bca(pca1, meaudret$design$season, scan = FALSE, nf = 2) if(adegraphicsLoaded()) { g1 <- s.class(pca1$li, meaudret$design$season, psub.text = "Principal Component Analysis", plot = FALSE) g2 <- s.class(pca2$ls, meaudret$design$season, psub.text = "Between dates Principal Component Analysis", plot = FALSE) g3 <- s.corcircle(pca1$co, plot = FALSE) g4 <- s.corcircle(pca2$as, plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) s.class(pca1$li, meaudret$design$season, sub = "Principal Component Analysis") s.class(pca2$ls, meaudret$design$season, sub = "Between dates Principal Component Analysis") s.corcircle(pca1$co) s.corcircle(pca2$as) par(mfrow = c(1, 1)) }} \keyword{datasets} ade4/man/acacia.Rd0000644000176200001440000000302413040362670013332 0ustar liggesusers\name{acacia} \alias{acacia} \docType{data} \title{Spatial pattern analysis in plant communities} \description{ Counts of individuals of \emph{Acacia ehrenbergiana} from five parallel transects of 32 quadrats. } \usage{data(acacia)} \format{ \code{acacia} is a data frame with 15 variables :\cr se.T1, se.T2, se.T3, se.T4, se.T5 are five numeric vectors containing quadrats counts of seedlings from transects 1 to 5 respectively;\cr sm.T1, sm.T2, sm.T3, sm.T4, sm.T5 are five numeric vectors containing quadrats counts of small trees (crown < 1 \eqn{m^{2}}{m^2} in canopy) of transects 1 to 5 respectively; \cr la.T1, la.T2, la.T3, la.T4, la.T5 are five numeric vectors containing quadrats counts of trees with large crown (crown > 1 \eqn{m^{2}}{m^2} in canopy) of transects 1 to 5 respectively. } \source{ Greig-Smith, P. and Chadwick, M.J. (1965) Data on pattern within plant communities. III. \emph{Acacia-Capparis} semi-desert scrub in the Sudan. \emph{Journal of Ecology}, \bold{53}, 465--474. } \references{ Hill, M.O. (1973) The intensity of spatial pattern in plant communities. \emph{Journal of Ecology}, \bold{61}, 225--235. } \examples{data(acacia) if(adegraphicsLoaded()) { gg <- s1d.barchart(acacia, p1d.horizontal = FALSE, psub.position = "topleft", plabels.cex = 0, ylim = c(0,20)) } else { par(mfcol = c(5, 3)) par(mar = c(2, 2, 2, 2)) for(k in 1:15) { barplot(acacia[, k], ylim = c(0, 20), col = grey(0.8)) ade4:::scatterutil.sub(names(acacia)[k], 1.5, "topleft") } par(mfcol = c(1, 1)) } } \keyword{datasets} ade4/man/suprow.pta.Rd0000644000176200001440000001117513553312514014262 0ustar liggesusers\name{suprow.pta} \alias{suprow.pta} \title{ Projections of Supplementary Rows for a Partial Triadic Analysis of K-tables } \description{ This function performs a projection of supplementary rows (i.e. supplementary individuals) for a Partial Triadic Analysis (\code{pta}) of K-tables. Computations are valid ONLY if the \code{pta} has been done on a K-Tables obtained by the \code{withinpca} function, followed by calls to the \code{ktab.within} and \code{t} functions. } \usage{ \method{suprow}{pta}(x, Xsup, facSup, \dots) } \arguments{ \item{x}{an object of class \code{pta}} \item{Xsup}{a table with the supplementary rows} \item{facSup}{a factor partitioning the rows of \code{Xsup}} \item{\dots}{further arguments passed to or from other methods} } \details{ This function computes the coordinates of the supplementary rows for a K-tables. The table of supplementary rows is standardized according to the 'Bouroche' standardization used in the Within Analysis of the original \code{pta}. In a first step, the table of supplementary rows is standardized (centred and normed) with the mean and variance of the original table of active individuals (i.e. the K-tables used in \code{pta}). Then, according to the \code{withinpca} procedure, a second transformation is applied. For "partial", supplementary rows are standardized in each sub-table (corresponding to each level of the factor) by the mean and variance of each corresponding sub-sample in the table of active individuals. Hence, supplementary rows have null mean and unit variance in each sub-table. For "total", supplementary rows are centred in each sub-table with the mean of each coresponding sub-sample in the table of active individuals and then normed with the global variance ot the table of active individuals. Hence, supplementary rows have a null mean in each sub-table and a global variance equal to one. } \value{ Returns a list with the transformed table \code{Xsup} in \code{tabsup} and the coordinates of the supplementary rows in \code{lisup}. } \author{ Benjamin Alric \email{benjamin.alric@irstea.fr} \cr Jean Thioulouse \email{jean.thioulouse@univ-lyon1.fr} } \references{Bouroche, J. M. (1975) \emph{Analyse des données ternaires: la double analyse en composantes principales}. Thèse de 3ème cycle, Université de Paris VI. } \examples{ data(meau) # Active rows actenv <- meau$env[meau$design$site != "S6", -c(5)] actfac <- meau$design$season[meau$design$site != "S6"] # Suplementary rows supenv <- meau$env[meau$design$site == "S6", -c(5)] supfac <- meau$design$season[meau$design$site == "S6"] # Total = active + suplementary rows totenv <- meau$env[, -c(5)] totfac <- meau$design$season # PTA with 6 sampling sites wittot <- withinpca(df = totenv, fac = totfac, scannf = FALSE, scaling = "partial") kta1tot <- ktab.within(wittot, colnames = rep(c("S1", "S2", "S3", "S4", "S5", "S6"), 4)) kta2tot <- t(kta1tot) pta1tot <- pta(kta2tot, scann = FALSE) # PTA with 5 sampling sites and site 6 added as supplementary element wit1 <- withinpca(df = actenv, fac = actfac, scannf = FALSE, scaling = "partial") kta1 <- ktab.within(wit1, colnames = rep(c("S1", "S2", "S3", "S4", "S5"), 4)) kta2 <- t(kta1) pta1 <- pta(kta2, scann = FALSE) supenv.pta <- suprow(x = pta1, Xsup = supenv, facSup = supfac) if (adegraphicsLoaded()) { # g1t = active + suplementary rows g1t <- s.label(pta1tot$Tli, labels = rownames(totenv), plabels = list(box = list(draw = FALSE), optim = TRUE), xlim = c(-6, 5), ylim = c(-5, 5), psub = list(text="Total", position="topleft"), plot = FALSE) # g1 = Active rows g1 <- s.label(pta1$Tli, labels = rownames(actenv), plabels = list(box = list(draw = FALSE), optim =TRUE), xlim = c(-6, 5), ylim = c(-5, 5), psub = list(text="Active", position="topleft"), pgrid = list(text=list(cex = 0)), plot = FALSE) # g2 = Supplementary rows g2 <- s.label(supenv.pta$lisup, plabels = list(box = list(draw = FALSE), optim = TRUE), ppoints = list(col = "red"), psub = list(text="Supplementary", position="topright"), pgrid = list(text=list(cex = 0)), plot = FALSE) # g3 = superposition of active and suplementary rows g3 <- g1 + g2 # Comparison of the total analysis and the analysis with supplementary rows ADEgS(list(g1t,g3)) } else { par(mfrow=c(2,2)) # g1t = active + suplementary rows g1t <- s.label(pta1tot$Tli, label = rownames(totenv), xlim = c(-6, 5), ylim = c(-5, 5), sub="Total") # g1 = Active rows g1 <- s.label(pta1$Tli, label = rownames(actenv), clabel = 1, xlim = c(-6, 5), ylim = c(-5, 5), sub="Active+Supplementary") # g2 = Supplementary rows g2 <- s.label(supenv.pta$lisup, clabel = 1.5, xlim = c(-6, 5), ylim = c(-5, 5), add.plot = TRUE) } } \keyword{multivariate}ade4/man/doubs.Rd0000644000176200001440000000773713040362670013264 0ustar liggesusers\name{doubs} \alias{doubs} \docType{data} \title{Pair of Ecological Tables} \description{ This data set gives environmental variables, fish species and spatial coordinates for 30 sites. } \usage{data(doubs)} \format{ \code{doubs} is a list with 4 components. \describe{ \item{env}{is a data frame with 30 rows (sites) and 11 environmental variables.} \item{fish}{is a data frame with 30 rows (sites) and 27 fish species.} \item{xy}{is a data frame with 30 rows (sites) and 2 spatial coordinates.} \item{species}{is a data frame with 27 rows (species) and 4 columns (names).} } } \details{ The rows of \code{doubs$env}, \code{doubs$fish} and \code{doubs$xy} are 30 sites along the Doubs, a French and Switzerland river. \code{doubs$env} contains the following variables: dfs - distance from the source (km * 10), alt - altitude (m), slo (\eqn{\ln(x + 1)}{log(x + 1)} where \emph{x} is the slope (per mil * 100), flo - minimum average stream flow (m3/s * 100), pH (* 10), har - total hardness of water (mg/l of Calcium), pho - phosphates (mg/l * 100), nit - nitrates (mg/l * 100), amm - ammonia nitrogen (mg/l * 100), oxy - dissolved oxygen (mg/l * 10), bdo - biological demand for oxygen (mg/l * 10). \code{doubs$fish} contains the abundance of the following fish species: \emph{Cottus gobio} (Cogo), \emph{Salmo trutta fario} (Satr), \emph{Phoxinus phoxinus} (Phph), \emph{Nemacheilus barbatulus} (Neba), \emph{Thymallus thymallus} (Thth), \emph{Telestes soufia agassizi} (Teso), \emph{Chondrostoma nasus} (Chna), \emph{Chondostroma toxostoma} (Chto), \emph{Leuciscus leuciscus} (Lele), \emph{Leuciscus cephalus cephalus} (Lece), \emph{Barbus barbus} (Baba), \emph{Spirlinus bipunctatus} (Spbi), \emph{Gobio gobio} (Gogo), \emph{Esox lucius} (Eslu), \emph{Perca fluviatilis} (Pefl), \emph{Rhodeus amarus} (Rham), \emph{Lepomis gibbosus} (Legi), \emph{Scardinius erythrophtalmus} (Scer), \emph{Cyprinus carpio} (Cyca), \emph{Tinca tinca} (Titi), \emph{Abramis brama} (Abbr), \emph{Ictalurus melas} (Icme), \emph{Acerina cernua} (Acce), \emph{Rutilus rutilus} (Ruru), \emph{Blicca bjoerkna} (Blbj), \emph{Alburnus alburnus} (Alal), \emph{Anguilla anguilla} (Anan). \code{doubs$species} contains the names of the 27 fish species. The four columns correspond to: 1 = scientific name (Genus species), 2 = French common name, 3 = English common name, 4 = Four character code. } \source{ Verneaux, J. (1973) \emph{Cours d'eau de Franche-Comté (Massif du Jura). Recherches écologiques sur le réseau hydrographique du Doubs. Essai de biotypologie}. Thèse d'état, Besançon. 1--257. } \references{ See a French description of fish species at \url{http://pbil.univ-lyon1.fr/R/pdf/pps047.pdf}.\cr Chessel, D., Lebreton, J.D. and Yoccoz, N.G. (1987) Propriétés de l'analyse canonique des correspondances. Une illustration en hydrobiologie. \emph{Revue de Statistique Appliquée}, \bold{35}, 4, 55--72. } \examples{ data(doubs) pca1 <- dudi.pca(doubs$env, scan = FALSE) pca2 <- dudi.pca(doubs$fish, scale = FALSE, scan = FALSE) coiner1 <- coinertia(pca1, pca2, scan = FALSE) if(adegraphicsLoaded()) { g1 <- s.corcircle(coiner1$aX, plot = FALSE) g2 <- s.value(doubs$xy, coiner1$lX[, 1], plot = FALSE) g3 <- s.value(doubs$xy, coiner1$lX[, 2], plot = FALSE) g4 <- s.arrow(coiner1$c1, plot = FALSE) g5 <- s.match(coiner1$mX, coiner1$mY, plot = FALSE) g6 <- s.corcircle(coiner1$aY, plot = FALSE) g7 <- s.arrow(coiner1$l1, plot = FALSE) g8 <- s.value(doubs$xy, coiner1$lY[, 1], plot = FALSE) g9 <- s.value(doubs$xy, coiner1$lY[, 2], plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4, g5, g6, g7, g8, g9), layout = c(3, 3)) } else { par(mfrow = c(3, 3)) s.corcircle(coiner1$aX) s.value(doubs$xy, coiner1$lX[, 1]) s.value(doubs$xy, coiner1$lX[, 2]) s.arrow(coiner1$c1) s.match(coiner1$mX, coiner1$mY) s.corcircle(coiner1$aY) s.arrow(coiner1$l1) s.value(doubs$xy, coiner1$lY[, 1]) s.value(doubs$xy, coiner1$lY[, 2]) par(mfrow = c(1, 1)) }} \keyword{datasets} ade4/man/buech.Rd0000644000176200001440000000447513175633655013247 0ustar liggesusers\name{buech} \alias{buech} \docType{data} \title{Buech basin} \description{ This data set contains informations about Buech basin characteristics. } \usage{data(buech)} \format{\code{buech} is a list with the following components: \describe{ \item{tab1}{a data frame with 10 environmental variables collected on 31 sites in Juin (1984)} \item{tab2}{a data frame with 10 environmental variables collected on 31 sites in September (1984)} \item{xy}{a data frame with the coordinates of the sites} \item{neig}{an object of class \code{neig}} \item{contour}{a data frame for background map} \item{nb}{the neighbouring graph between sites, object of the class \code{nb}} \item{Spatial}{an object of the class \code{SpatialPolygons} of \code{sp}, containing the map} }} \details{ Variables of \code{buech$tab1} and \code{buech$tab2} are the following ones:\cr pH ; Conductivity (\eqn{\mu} S/cm) ; Carbonate (water hardness (mg/l CaCO3)) ; hardness (total water hardness (mg/l CaCO3)) ; Bicarbonate (alcalinity (mg/l HCO3-)) ; Chloride (alcalinity (mg/l Cl-)) ; Suspens (particles in suspension (mg/l)) ; Organic (organic particles (mg/l)) ; Nitrate (nitrate rate (mg/l NO3-)) ; Ammonia (amoniac rate (mg/l NH4-)) } \source{ Vespini, F. (1985) \emph{Contribution à l'étude hydrobiologique du Buech, rivière non aménagée de Haute-Provence}. Thèse de troisième cycle, Université de Provence. Vespini, F., Légier, P. and Champeau, A. (1987) Ecologie d'une rivière non aménagée des Alpes du Sud : Le Buëch (France) I. Evolution longitudinale des descripteurs physiques et chimiques. \emph{Annales de Limnologie}, \bold{23}, 151--164. } \examples{ data(buech) if(adegraphicsLoaded()) { if(requireNamespace("sp", quietly = TRUE)) { g1 <- s.label(buech$xy, Sp = buech$Spatial, nb = buech$nb, pSp.col = "transparent", plot = FALSE) g2 <- s.value(buech$xy, buech$tab2$Suspens - buech$tab1$Suspens, Sp = buech$Spatial, nb = buech$nb, pSp.col = "transparent", plot = FALSE) G <- cbindADEg(g1, g2, plot = TRUE) } } else { par(mfrow = c(1,2)) s.label(buech$xy, contour = buech$contour, neig = buech$neig) s.value(buech$xy, buech$tab2$Suspens - buech$tab1$Suspens, contour = buech$contour, neig = buech$neig, csi = 3) par(mfrow = c(1,1)) }} \keyword{datasets}ade4/man/reconst.Rd0000644000176200001440000000332413021372261013605 0ustar liggesusers\name{reconst} \alias{reconst} \alias{reconst.pca} \alias{reconst.coa} \title{Reconstitution of Data from a Duality Diagram} \description{ Generic Function for the reconstitution of data from a principal component analysis or a correspondence analysis } \usage{ reconst (dudi, ...) \method{reconst}{pca}(dudi, nf = 1, ...) \method{reconst}{coa}(dudi, nf = 1, ...) } \arguments{ \item{dudi}{an object of class \code{dudi} used to select a method: pca or coa} \item{nf}{an integer indicating the number of kept axes for the reconstitution} \item{\dots}{further arguments passed to or from other methods} } \value{ returns a data frame containing the reconstituted data } \references{Gabriel, K.R. (1978) Least-squares approximation of matrices by additive and multiplicative models. \emph{Journal of the Royal Statistical Society}, B , \bold{40}, 186--196. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(rhone) dd1 <- dudi.pca(rhone$tab, nf = 2, scann = FALSE) rh1 <- reconst(dd1, 1) rh2 <- reconst(dd1, 2) par(mfrow = c(4,4)) par(mar = c(2.6,2.6,1.1,1.1)) for (i in 1:15) { plot(rhone$date, rhone$tab[,i]) lines(rhone$date, rh1[,i], lty = 2) lines(rhone$date, rh2[,i], lty = 1) ade4:::scatterutil.sub(names(rhone$tab)[i], 2, "topright")} data(chats) chatsw <- data.frame(t(chats)) chatscoa <- dudi.coa(chatsw, scann = FALSE) model0 <- reconst(chatscoa, 0) round(model0,3) round(chisq.test(chatsw)$expected,3) chisq.test(chatsw)$statistic sum(((chatsw-model0)^2)/model0) effectif <- sum(chatsw) sum(chatscoa$eig)*effectif model1 <- reconst(chatscoa, 1) round(model1, 3) sum(((chatsw-model1)^2)/model0) sum(chatscoa$eig[-1])*effectif } \keyword{multivariate} ade4/man/zealand.Rd0000644000176200001440000000431713175633655013572 0ustar liggesusers\name{zealand} \alias{zealand} \docType{data} \title{Road distances in New-Zealand} \description{ This data set gives the road distances between 13 towns in New-Zealand. } \usage{data(zealand)} \format{\code{zealand} is a list with the following components: \describe{ \item{road}{a data frame with 13 rows (New Zealand towns) and 13 columns (New Zealand towns) containing the road distances between these towns} \item{xy}{a data frame containing the coordinates of the 13 towns} \item{neig}{an object of class \code{neig}, a neighbour graph to visualize the map shape} \item{nb}{a neighborhood object (class \code{nb} defined in package \code{spdep})} }} \source{ Manly, B.F. (1994). \emph{Multivariate Statistical Methods. A primer.}, Second edition, Chapman and Hall, London, 1--215, page 172. } \examples{ data(zealand) d0 <- as.dist(as.matrix(zealand$road)) d1 <- cailliez (d0) d2 <- lingoes(d0) if(adegraphicsLoaded()) { G1 <- s.label(zealand$xy, lab = as.character(1:13), nb = zealand$nb) g1 <- s.label(cmdscale(dist(zealand$xy)), lab = as.character(1:13), nb = zealand$nb, psub.text = "Distance canonique", plot = FALSE) g2 <- s.label(cmdscale(d0), lab = as.character(1:13), nb = zealand$nb, psub.text = "Distance routiere", plot = FALSE) g3 <- s.label(cmdscale(d1), lab = as.character(1:13), nb = zealand$nb, psub.text = "Distance routiere / Cailliez", plot = FALSE) g4 <- s.label(cmdscale(d2), lab = as.character(1:13), nb = zealand$nb, psub.text = "Distance routiere / Lingoes", plot = FALSE) G2 <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { s.label(zealand$xy, lab = as.character(1:13), neig = zealand$neig) par(mfrow = c(2, 2)) s.label(cmdscale(dist(zealand$xy)), lab = as.character(1:13), neig = zealand$neig, sub = "Distance canonique", csub = 2) s.label(cmdscale(d0), lab = as.character(1:13), neig = zealand$neig, sub = "Distance routiere", csub = 2) s.label(cmdscale(d1), lab = as.character(1:13), neig = zealand$neig, sub = "Distance routiere / Cailliez", csub = 2) s.label(cmdscale(d2), lab = as.character(1:13), neig = zealand$neig, sub = "Distance routiere / Lingoes", csub = 2) }} \keyword{datasets}ade4/man/euro123.Rd0000644000176200001440000000251513040362670013335 0ustar liggesusers\name{euro123} \alias{euro123} \docType{data} \title{Triangular Data} \description{ This data set gives the proportions of employement in the primary, secondary and tertiary sectors for 12 European countries in 1978, 1986 and 1997. } \usage{data(euro123)} \format{ \code{euro123} is a list of 4 components. \describe{ \item{in78}{is a data frame with 12 rows and 3 variables.} \item{in86}{: idem in 1986} \item{in97}{: idem in 1997} \item{plan}{is a data frame with two factors to both organize the 3 tables.} } } \source{ Encyclopaedia Universalis, Symposium, Les chiffres du Monde. Encyclopaedia Universalis, Paris. 519. } \examples{ data(euro123) if(adegraphicsLoaded()) { g1 <- triangle.label(euro123$in78, addaxes = TRUE, plabels.cex = 0, plot = FALSE) g2 <- triangle.label(euro123$in86, addaxes = TRUE, plabels.cex = 0, plot = FALSE) g3 <- triangle.label(euro123$in97, addaxes = TRUE, plabels.cex = 0, plot = FALSE) g4 <- triangle.match(euro123$in78, euro123$in97, plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2,2)) triangle.plot(euro123$in78, addaxes = TRUE) triangle.plot(euro123$in86, addaxes = TRUE) triangle.plot(euro123$in97, addaxes = TRUE) triangle.biplot(euro123$in78, euro123$in97) par(mfrow = c(1,1)) }} \keyword{datasets} ade4/man/rpjdl.Rd0000644000176200001440000000347413102043107013243 0ustar liggesusers\name{rpjdl} \alias{rpjdl} \docType{data} \title{Avifauna and Vegetation} \description{ This data set gives the abundance of 51 species and 8 environmental variables in 182 sites. } \usage{data(rpjdl)} \format{ \code{rpjdl} is a list of 5 components. \describe{ \item{fau}{is the faunistic array of 182 sites (rows) and 51 species (columns).} \item{mil}{is the array of environmental variables : 182 sites and 8 variables.} \item{frlab}{is a vector of the names of species in French.} \item{lalab}{is a vector of the names of species in Latin.} \item{lab}{is a vector of the simplified labels of species.} } } \source{ Prodon, R. and Lebreton, J.D. (1981) Breeding avifauna of a Mediterranean succession : the holm oak and cork oak series in the eastern Pyrénées. 1 : Analysis and modelling of the structure gradient. \emph{Oïkos}, \bold{37}, 21--38. Lebreton, J. D., Chessel D., Prodon R. and Yoccoz N. (1988) L'analyse des relations espèces-milieu par l'analyse canonique des correspondances. I. Variables de milieu quantitatives. \emph{Acta Oecologica, Oecologia Generalis}, \bold{9}, 53--67. } \references{ See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps048.pdf} (in French). } \examples{ \dontrun{ data(rpjdl) coa1 <- dudi.coa(rpjdl$fau, scann = FALSE) pca1 <- dudi.pca(rpjdl$fau, scal = FALSE, scann = FALSE) if(adegraphicsLoaded()) { g1 <- s.distri(coa1$l1, rpjdl$fau, xax = 2, yax = 1, starSize = 0.3, ellipseSize = 0, plab.cex = 0) g2 <- s.distri(pca1$l1, rpjdl$fau, xax = 2, yax = 1, starSize = 0.3, ellipseSize = 0, plab.cex = 0) } else { s.distri(coa1$l1, rpjdl$fau, 2, 1, cstar = 0.3, cell = 0) s.distri(pca1$l1, rpjdl$fau, 2, 1, cstar = 0.3, cell = 0) } caiv1 <- pcaiv(coa1, rpjdl$mil, scan = FALSE) plot(caiv1) }} \keyword{datasets} ade4/man/julliot.Rd0000644000176200001440000000734213175633655013637 0ustar liggesusers\name{julliot} \alias{julliot} \docType{data} \title{Seed dispersal} \description{ This data set gives the spatial distribution of seeds (quadrats counts) of seven species in the understorey of tropical rainforest. } \usage{data(julliot)} \format{\code{julliot} is a list with the following components: \describe{ \item{tab}{a data frame with 160 rows (quadrats) and 7 variables (species)} \item{xy}{a data frame with the coordinates of the 160 quadrats (positioned by their centers)} \item{area}{a data frame with 3 variables returning the boundary lines of each quadrat. The first variable is a factor. The levels of this one are the row.names of \code{tab}. The second and third variables return the coordinates (x,y) of the points of the boundary line.} \item{Spatial}{an object of the class \code{SpatialPolygons} of \code{sp}, containing the map} }} \details{ Species names of \code{julliot$tab} are: \emph{Pouteria torta}, \emph{Minquartia guianensis}, \emph{Quiina obovata}, \emph{Chrysophyllum lucentifolium}, \emph{Parahancornia fasciculata}, \emph{Virola michelii}, and \emph{Pourouma spp}. } \references{ Julliot, C. (1992). Utilisation des ressources alimentaires par le singe hurleur roux, \emph{Alouatta seniculus} (Atelidae, Primates), en Guyane : impact de la dissémination des graines sur la régénération forestière. Thèse de troisième cycle, Université de Tours. Julliot, C. (1997). Impact of seed dispersal by red howler monkeys \emph{Alouatta seniculus} on the seedling population in the understorey of tropical rain forest. \emph{Journal of Ecology}, \bold{85}, 431--440. } \examples{ data(julliot) \dontrun{ if(adegraphicsLoaded()) { if(requireNamespace("sp", quietly = TRUE)) { obj1 <- sp::SpatialPolygonsDataFrame(Sr = julliot$Spatial, data = log(julliot$tab + 1)) g1 <- s.Spatial(obj1) g2 <- s.value(julliot$xy, scalewt(log(julliot$tab + 1)), Sp = julliot$Spatial, pSp.col = "white", pgrid.draw = FALSE) } } else { if(requireNamespace("splancs", quietly = TRUE)) { par(mfrow = c(3, 3)) for(k in 1:7) area.plot(julliot$area, val = log(julliot$tab[, k] + 1), sub = names(julliot$tab)[k], csub = 2.5) par(mfrow = c(1, 1)) par(mfrow = c(3, 3)) for(k in 1:7) { area.plot(julliot$area) s.value(julliot$xy, scalewt(log(julliot$tab[, k] + 1)), sub = names(julliot$tab)[k], csub = 2.5, add.p = TRUE) } par(mfrow = c(1, 1)) } }} if(adegraphicsLoaded()) { if(requireNamespace("sp", quietly = TRUE)) { g3 <- s.image(julliot$xy, log(julliot$tab + 1), span = 0.25) } g4 <- s.value(julliot$xy, log(julliot$tab + 1)) } else { if(requireNamespace("splancs", quietly = TRUE)) { par(mfrow = c(3, 3)) for(k in 1:7) s.image(julliot$xy, log(julliot$tab[, k] + 1), kgrid = 3, span = 0.25, sub = names(julliot$tab)[k], csub = 2.5) par(mfrow = c(1, 1)) par(mfrow = c(3, 3)) for(k in 1:7) s.value(julliot$xy, log(julliot$tab[, k] + 1), sub = names(julliot$tab)[k], csub = 2.5) par(mfrow = c(1, 1)) } } \dontrun{ if (requireNamespace("spdep", quietly = TRUE)) { neig0 <- nb2neig(spdep::dnearneigh(as.matrix(julliot$xy), 1, 1.8)) if(adegraphicsLoaded()) { g5 <- s.label(julliot$xy, nb = spdep::dnearneigh(as.matrix(julliot$xy), 1, 1.8)) } else { par(mfrow = c(1, 1)) s.label(julliot$xy, neig = neig0, clab = 0.75, incl = FALSE, addax = FALSE, grid = FALSE) } gearymoran(ade4:::neig.util.LtoG(neig0), log(julliot$tab + 1)) if (requireNamespace("adephylo", quietly = TRUE)) { adephylo::orthogram(log(julliot$tab[, 3] + 1), ortho = scores.neig(neig0)) } }} } \keyword{datasets}ade4/man/carni70.Rd0000644000176200001440000000326013175633655013413 0ustar liggesusers\name{carni70} \alias{carni70} \docType{data} \title{Phylogeny and quantitative traits of carnivora} \description{ This data set describes the phylogeny of 70 carnivora as reported by Diniz-Filho and Torres (2002). It also gives the geographic range size and body size corresponding to these 70 species. } \usage{data(carni70)} \format{ \code{carni70} is a list containing the 2 following objects: \describe{ \item{tre}{is a character string giving the phylogenetic tree in Newick format. Branch lengths are expressed as divergence times (millions of years)} \item{tab}{is a data frame with 70 species and two traits: size (body size (kg)) ; range (geographic range size (km)).} }} \source{ Diniz-Filho, J. A. F., and N. M. Tôrres. (2002) Phylogenetic comparative methods and the geographic range size-body size relationship in new world terrestrial carnivora. \emph{Evolutionary Ecology}, \bold{16}, 351--367. } \examples{ \dontrun{ if (requireNamespace("adephylo", quietly = TRUE) & requireNamespace("ape", quietly = TRUE)) { data(carni70) carni70.phy <- newick2phylog(carni70$tre) plot(carni70.phy) size <- scalewt(log(carni70$tab))[,1] names(size) <- row.names(carni70$tab) symbols.phylog(carni70.phy,size) tre <- ape::read.tree(text = carni70$tre) adephylo::orthogram(size, tre = tre) yrange <- scalewt(carni70$tab[,2]) names(yrange) <- row.names(carni70$tab) symbols.phylog(carni70.phy,yrange) adephylo::orthogram(as.vector(yrange), tre = tre) if(adegraphicsLoaded()) { g1 <- s.label(cbind.data.frame(size, yrange), plabel.cex = 0) g2 <- addhist(g1) } else { s.hist(cbind.data.frame(size, yrange), clabel = 0) } }}} \keyword{datasets} ade4/man/ktab.within.Rd0000644000176200001440000000214413021372261014351 0ustar liggesusers\name{ktab.within} \alias{ktab.within} \title{Process to go from a Within Analysis to a K-tables} \description{ performs the process to go from a Within Analysis to a K-tables. } \usage{ ktab.within(dudiwit, rownames = NULL, colnames = NULL, tabnames = NULL) } \arguments{ \item{dudiwit}{an objet of class \code{within}} \item{rownames}{the row names of the K-tables (otherwise the row names of \code{dudiwit$tab})} \item{colnames}{the column names of the K-tables (otherwise the column names \cr of \code{dudiwit$tab})} \item{tabnames}{the names of the arrays of the K-tables (otherwise the levels of the factor which defines the within-classes)} } \value{ a list of class \code{ktab}. See \code{\link{ktab}} } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(bacteria) w1 <- data.frame(t(bacteria$espcodon)) dudi1 <- dudi.coa(w1, scann = FALSE, nf = 4) wit1 <- wca(dudi1, bacteria$code, scannf = FALSE) kta1 <- ktab.within(wit1) plot(statis(kta1, scann = FALSE)) kta2 <- kta1[kta1$blo>3] kplot(mfa(kta2, scann = FALSE)) } \keyword{multivariate} ade4/man/quasieuclid.Rd0000644000176200001440000000164513021372261014444 0ustar liggesusers\name{quasieuclid} \alias{quasieuclid} \title{Transformation of a distance matrice to a Euclidean one} \description{ transforms a distance matrix in a Euclidean one. } \usage{ quasieuclid(distmat) } \arguments{ \item{distmat}{an object of class \code{dist}} } \details{ The function creates a distance matrice with the positive eigenvalues of the Euclidean representation. \cr Only for Euclidean distances which are not Euclidean for numeric approximations (for examples, in papers as the following example). } \value{ object of class \code{dist} containing a Euclidean distance matrice } \author{ Daniel Chessel \cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \examples{ data(yanomama) geo <- as.dist(yanomama$geo) is.euclid(geo) # FALSE geo1 <- quasieuclid(geo) is.euclid(geo1) # TRUE par(mfrow = c(2,2)) lapply(yanomama, function(x) plot(as.dist(x), quasieuclid(as.dist(x)))) par(mfrow = c(1,1))} \keyword{array} ade4/man/rtest.Rd0000644000176200001440000000156113050632301013266 0ustar liggesusers\name{rtest} \alias{rtest} \title{Class of the Permutation Tests (in R).} \description{ rtest is a generic function. It proposes methods for the following objects \code{between}, \code{discrimin}, \code{procuste} \code{\dots}\cr } \usage{ rtest(xtest, \dots) } \arguments{ \item{xtest}{an object used to select a method} \item{\dots}{further arguments passed to or from other methods; in \code{plot.randtest} to \code{hist}} } \value{ \code{rtest} returns an object of class \code{randtest} } \seealso{\code{\link{RV.rtest}}, \code{\link{mantel.rtest}}, \code{\link{procuste.rtest}}, \code{\link{randtest}}} \author{Daniel Chessel } \examples{ par(mfrow = c(2, 2)) for (x0 in c(2.4, 3.4, 5.4, 20.4)) { l0 <- as.randtest(sim = rnorm(200), obs = x0) print(l0) plot(l0, main = paste("p.value = ", round(l0$pvalue, dig = 5))) } par(mfrow = c(1, 1)) } \keyword{methods} ade4/man/atlas.Rd0000644000176200001440000001001213125167376013242 0ustar liggesusers\name{atlas} \alias{atlas} \docType{data} \title{Small Ecological Dataset} \description{\code{atlas} is a list containing three kinds of information about 23 regions (The French Alps) : \cr geographical coordinates, meteorology and bird presences.} \usage{data(atlas)} \format{ \code{atlas} is a list of 9 components: \describe{ \item{area}{is a convex hull of 23 geographical regions.} \item{xy}{are the coordinates of the region centers and altitude (in meters).} \item{names.district}{is a vector of region names.} \item{meteo}{is a data frame with 7 variables: min and max temperature in january; min and max temperature in july; january, july and total rainfalls.} \item{birds}{is a data frame with 15 variables (species).} \item{contour}{is a data frame with 4 variables (x1, y1, x2, y2) for the contour display of The French Alps.} \item{alti}{is a data frame with 3 variables altitude in percentage [0,800], ]800,1500] and ]1500,5000].} \item{Spatial}{is the map of the 23 regions of The French Alps (an object of the class \code{SpatialPolygons} of \code{sp}).} \item{Spatial.contour}{is the contour of the map of the 23 regions of the French Alps (an object of the class \code{SpatialPolygons} of \code{sp}).} }} \source{ Extract from: \cr Lebreton, Ph. (1977) Les oiseaux nicheurs rhonalpins. \emph{Atlas ornithologique Rhone-Alpes}. Centre Ornithologique Rhone-Alpes, Universite Lyon 1, 69621 Villeurbanne. Direction de la Protection de la Nature, Ministere de la Qualite de la Vie. 1--354. } \examples{ data(atlas) if(adegraphicsLoaded()) { if(requireNamespace("sp", quietly = TRUE)) { g11 <- s.Spatial(atlas$Spatial, pSp.col = "white", plot = FALSE) g12 <- s.label(atlas$area[, 2:3], plabels.cex = 0, plot = FALSE) g1 <- superpose(g11, g12, plot = FALSE) g2 <- s.label(atlas$xy, lab = atlas$names.district, Sp = atlas$Spatial, pgrid.dra = FALSE, pSp.col = "white", plot = FALSE) obj3 <- sp::SpatialPolygonsDataFrame(Sr = atlas$Spatial, data = atlas$meteo) g3 <- s.Spatial(obj3[, 1], nclass = 12, psub = list(position = "topleft", text = "Temp Mini January", cex = 2), plot = FALSE) g4 <- s.corcircle((dudi.pca(atlas$meteo, scann = FALSE)$co), plabels.cex = 1, plot = FALSE) G1 <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) obj5 <- sp::SpatialPolygonsDataFrame(Sr = atlas$Spatial, data = dudi.pca(atlas$meteo, scann = FALSE)$li) g5 <- s.Spatial(obj5[, 1], nclass = 12, psub = list(position = "topleft", text = "Principal Component Analysis analysis", cex = 1.5), plot = FALSE) coa1 <- dudi.coa(atlas$birds, scann = FALSE, nf = 1) obj6 <- sp::SpatialPolygonsDataFrame(Sr = atlas$Spatial, data = coa1$li) g6 <- s.Spatial(obj6[, 1], nclass = 12, psub = list(position = "topleft", text = "Correspondence analysis", cex = 1.5), plot = FALSE) g7 <- s.value(atlas$xy, coa1$li$Axis1, Sp = atlas$Spatial.contour, ppoints.cex = 2, porigin.include = FALSE, paxes.draw = FALSE, pSp.col = "white", plot = FALSE) g8 <- triangle.label(atlas$alti, plabels.cex = 0, plot = FALSE) G2 <- ADEgS(list(g5, g6, g7, g8), layout = c(2, 2)) } } else { op <- par(no.readonly = TRUE) par(mfrow = c(2, 2)) area.plot(atlas$area, cpoin = 1.5) area.plot(atlas$area, lab = atlas$names.district, clab = 1) x <- atlas$meteo$mini.jan names(x) <- row.names(atlas$meteo) area.plot(atlas$area, val = x, ncl = 12, sub = "Temp Mini January", csub = 2, cleg = 1) s.corcircle((dudi.pca(atlas$meteo, scann = FALSE)$co), clab = 1) area.plot(atlas$area, val = dudi.pca(atlas$meteo,scann=FALSE)$li[, 1], ncl = 12, sub = "Principal Component Analysis analysis", csub = 1.5, cleg = 1) birds.coa <- dudi.coa(atlas$birds, sca = FALSE, nf = 1) x <- birds.coa$li$Axis1 area.plot(atlas$area, val = x, ncl = 12, sub = "Correspondence analysis", csub = 1.5, cleg = 1) s.value(atlas$xy, x, contour = atlas$contour, csi = 2, incl = FALSE, addax = FALSE) triangle.plot(atlas$alti) par(op) par(mfrow = c(1, 1))} } \keyword{datasets}ade4/man/s.label.Rd0000644000176200001440000000677012576021756013476 0ustar liggesusers\name{s.label} \alias{s.label} \title{Scatter Plot} \description{ performs the scatter diagrams with labels. } \usage{ s.label(dfxy, xax = 1, yax = 2, label = row.names(dfxy), clabel = 1, pch = 20, cpoint = if (clabel == 0) 1 else 0, boxes = TRUE, neig = NULL, cneig = 2, xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0,0), sub = "", csub = 1.25, possub = "bottomleft", pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) } \arguments{ \item{dfxy}{a data frame with at least two coordinates} \item{xax}{the column number for the x-axis} \item{yax}{the column number for the y-axis} \item{label}{a vector of strings of characters for the point labels} \item{clabel}{if not NULL, a character size for the labels, used with \code{par("cex")*clabel}} \item{pch}{if \code{cpoint} > 0, an integer specifying the symbol or the single character to be used in plotting points} \item{cpoint}{a character size for plotting the points, used with \code{par("cex")*cpoint}. If zero, no points are drawn} \item{boxes}{if TRUE, labels are framed} \item{neig}{a neighbouring graph} \item{cneig}{a size for the neighbouring graph lines used with par("lwd")*\code{cneig}} \item{xlim}{the ranges to be encompassed by the x axis, if NULL, they are computed} \item{ylim}{the ranges to be encompassed by the y axis, if NULL, they are computed} \item{grid}{a logical value indicating whether a grid in the background of the plot should be drawn} \item{addaxes}{a logical value indicating whether the axes should be plotted} \item{cgrid}{a character size, parameter used with par("cex")* \code{cgrid} to indicate the mesh of the grid} \item{include.origin}{a logical value indicating whether the point "origin" should be belonged to the graph space} \item{origin}{the fixed point in the graph space, for example c(0,0) the origin axes} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{pixmap}{an object 'pixmap' displayed in the map background} \item{contour}{a data frame with 4 columns to plot the contour of the map : each row gives a segment (x1,y1,x2,y2)} \item{area}{a data frame of class 'area' to plot a set of surface units in contour} \item{add.plot}{if TRUE uses the current graphics window} } \value{ The matched call. } \author{Daniel Chessel} \examples{ if(!adegraphicsLoaded()) { layout(matrix(c(1, 2, 3, 2), 2, 2)) data(atlas) s.label(atlas$xy, lab = atlas$names.district, area = atlas$area, inc = FALSE, addax = FALSE) data(mafragh) s.label(mafragh$xy, inc = FALSE, neig = mafragh$neig, addax = FALSE) data(irishdata) s.label(irishdata$xy, inc = FALSE, contour = irishdata$contour, addax = FALSE) par(mfrow = c(2, 2)) cha <- ls() s.label(cbind.data.frame(runif(length(cha)), runif(length(cha))), lab = cha) x <- runif(50, -2, 2) y <- runif(50, -2, 2) z <- x^2 + y^2 s.label(data.frame(x, y), lab = as.character(z < 1)) s.label(data.frame(x, y), clab = 0, cpoi = 1, add.plot = TRUE) symbols(0, 0, circles = 1, add = TRUE, inch = FALSE) s.label(cbind.data.frame(runif(100, 0, 10), runif(100, 5, 12)), incl = FALSE, clab = 0) s.label(cbind.data.frame(runif(100, -3, 12), runif(100, 2, 10)), cl = 0, cp = 2, include = FALSE) }} \keyword{multivariate} \keyword{hplot} ade4/man/dudi.fca.Rd0000644000176200001440000000511613040362670013612 0ustar liggesusers\name{dudi.fca} \alias{dudi.fca} \alias{dudi.fpca} \alias{prep.fuzzy.var} \title{Fuzzy Correspondence Analysis and Fuzzy Principal Components Analysis} \description{ Theses functions analyse a table of fuzzy variables.\cr\cr A fuzzy variable takes values of type \eqn{a=(a_1,\dots,a_k)}{a=(a1,\dots,ak)} giving the importance of k categories.\cr\cr A missing data is denoted (0,...,0).\cr Only the profile a/sum(a) is used, and missing data are replaced by the mean profile of the others in the function \code{prep.fuzzy.var}. See ref. for details. } \usage{ prep.fuzzy.var (df, col.blocks, row.w = rep(1, nrow(df))) dudi.fca(df, scannf = TRUE, nf = 2) dudi.fpca(df, scannf = TRUE, nf = 2) } \arguments{ \item{df}{a data frame containing positive or null values} \item{col.blocks}{a vector containing the number of categories for each fuzzy variable} \item{row.w}{a vector of row weights} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} } \value{ The function \code{prep.fuzzy.var} returns a data frame with the attribute \code{col.blocks}. The function \code{dudi.fca} returns a list of class \code{fca} and \code{dudi} (see \link{dudi}) containing also \item{cr}{a data frame which rows are the blocs, columns are the kept axes, and values are the correlation ratios.} The function \code{dudi.fpca} returns a list of class \code{pca} and \code{dudi} (see \link{dudi}) containing also \enumerate{ \item cent \item norm \item blo \item indica \item FST \item inertia } } \references{Chevenet, F., Dolédec, S. and Chessel, D. (1994) A fuzzy coding approach for the analysis of long-term ecological data. \emph{Freshwater Biology}, \bold{31}, 295--309.} \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ w1 <- matrix(c(1,0,0,2,1,1,0,2,2,0,1,0,1,1,1,0,1,3,1,0), 4, 5) w1 <- data.frame(w1) w2 <- prep.fuzzy.var(w1, c(2, 3)) w1 w2 attributes(w2) data(bsetal97) w <- prep.fuzzy.var(bsetal97$biol, bsetal97$biol.blo) if(adegraphicsLoaded()) { g1 <- plot(dudi.fca(w, scann = FALSE, nf = 3), plabels.cex = 1.5) } else { scatter(dudi.fca(w, scann = FALSE, nf = 3), csub = 3, clab.moda = 1.5) scatter(dudi.fpca(w, scann = FALSE, nf = 3), csub = 3, clab.moda = 1.5) } \dontrun{ w1 <- prep.fuzzy.var(bsetal97$biol, bsetal97$biol.blo) w2 <- prep.fuzzy.var(bsetal97$ecol, bsetal97$ecol.blo) d1 <- dudi.fca(w1, scannf = FALSE, nf = 3) d2 <- dudi.fca(w2, scannf = FALSE, nf = 3) plot(coinertia(d1, d2, scannf = FALSE)) } } \keyword{multivariate} ade4/man/dist.ktab.Rd0000644000176200001440000001624713330604161014023 0ustar liggesusers\name{dist.ktab} \alias{dist.ktab} \alias{prep.binary} \alias{prep.circular} \alias{prep.fuzzy} \alias{ldist.ktab} \alias{kdist.cor} \title{Mixed-variables coefficient of distance} \description{ The mixed-variables coefficient of distance generalizes Gower's general coefficient of distance to allow the treatment of various statistical types of variables when calculating distances. This is especially important when measuring functional diversity. Indeed, most of the indices that measure functional diversity depend on variables (traits) that have various statistical types (e.g. circular, fuzzy, ordinal) and that go through a matrix of distances among species. } \usage{ dist.ktab(x, type, option = c("scaledBYrange", "scaledBYsd", "noscale"), scann = FALSE, tol = 1e-8) ldist.ktab(x, type, option = c("scaledBYrange", "scaledBYsd", "noscale"), scann = FALSE, tol = 1e-8) kdist.cor(x, type, option = c("scaledBYrange", "scaledBYsd", "noscale"), scann = FALSE, tol = 1e-8, squared = TRUE) prep.fuzzy(df, col.blocks, row.w = rep(1, nrow(df)), labels = paste("F", 1:length(col.blocks), sep = "")) prep.binary(df, col.blocks, labels = paste("B", 1:length(col.blocks), sep = "")) prep.circular(df, rangemin = apply(df, 2, min, na.rm = TRUE), rangemax = apply(df, 2, max, na.rm = TRUE)) } \arguments{ \item{x}{Object of class \code{ktab} (see details)} \item{type}{Vector that provide the type of each table in x. The possible types are "Q" (quantitative), "O" (ordinal), "N" (nominal), "D" (dichotomous), "F" (fuzzy, or expressed as a proportion), "B" (multichoice nominal variables, coded by binary columns), "C" (circular). Values in type must be in the same order as in x.} \item{option}{A string that can have three values: either "scaledBYrange" if the quantitative variables must be scaled by their range, or "scaledBYsd" if they must be scaled by their standard deviation, or "noscale" if they should not be scaled. This last option can be useful if the the values have already been normalized by the known range of the whole population instead of the observed range measured on the sample. If x contains data from various types, then the option "scaledBYsd" is not suitable (a warning will appear if the option selected with that condition).} \item{scann}{A logical. If TRUE, then the user will have to choose among several possible functions of distances for the quantitative, ordinal, fuzzy and binary variables.} \item{tol}{A tolerance threshold: a value less than tol is considered as null.} \item{squared}{A logical, if TRUE, the squared distances are considered.} \item{df}{Objet of class data.frame} \item{col.blocks}{A vector that contains the number of levels per variable (in the same order as in \code{df})} \item{row.w}{A vector of row weigths} \item{labels}{the names of the traits} \item{rangemin}{A numeric corresponding to the smallest level where the loop starts} \item{rangemax}{A numeric corresponding to the highest level where the loop closes} } \value{ The functions provide the following results: \item{dist.ktab}{returns an object of class \code{dist};} \item{ldist.ktab}{returns a list of objects of class \code{dist} that correspond to the distances between species calculated per trait;} \item{kdist.cor}{returns a list of three objects: "paircov" provides the covariance between traits in terms of (squared) distances between species; "paircor" provides the correlations between traits in terms of (squared) distances between species; "glocor" provides the correlations between the (squared) distances obtained for each trait and the global (squared) distances obtained by mixing all the traits (= contributions of traits to the global distances);} \item{prep.binary and prep.fuzzy}{returns a data frame with the following attributes: col.blocks specifies the number of columns per fuzzy variable; col.num specifies which variable each column belongs to;} \item{prep.circular}{returns a data frame with the following attributes: max specifies the number of levels in each circular variable.} } \references{ Pavoine S., Vallet, J., Dufour, A.-B., Gachet, S. and Daniel, H. (2009) On the challenge of treating various types of variables: Application for improving the measurement of functional diversity. \emph{Oikos}, \bold{118}, 391--402. } \author{Sandrine Pavoine \email{pavoine@mnhn.fr} } \details{ When preparing the object of class \code{ktab} (object x), variables of type "Q", "O", "D", "F", "B" and "C" should be of class \code{numeric} (the class \code{ordered} is not yet considered by \code{dist.ktab}); variables of type "N" should be of class \code{character} or \code{factor} } \seealso{ \code{\link[cluster]{daisy}} in the case of ratio-scale (quantitative) and nominal variables; and \code{\link{woangers}} for an application. } \examples{ # With fuzzy variables data(bsetal97) w <- prep.fuzzy(bsetal97$biol, bsetal97$biol.blo) w[1:6, 1:10] ktab1 <- ktab.list.df(list(w)) dis <- dist.ktab(ktab1, type = "F") as.matrix(dis)[1:5, 1:5] \dontrun{ # With ratio-scale and multichoice variables data(ecomor) wM <- log(ecomor$morpho + 1) # Quantitative variables wD <- ecomor$diet # wD is a data frame containing a multichoice nominal variable # (diet habit), with 8 modalities (Granivorous, etc) # We must prepare it by prep.binary head(wD) wD <- prep.binary(wD, col.blocks = 8, label = "diet") wF <- ecomor$forsub # wF is also a data frame containing a multichoice nominal variable # (foraging substrat), with 6 modalities (Foliage, etc) # We must prepare it by prep.binary head(wF) wF <- prep.binary(wF, col.blocks = 6, label = "foraging") # Another possibility is to combine the two last data frames wD and wF as # they contain the same type of variables wB <- cbind.data.frame(ecomor$diet, ecomor$forsub) head(wB) wB <- prep.binary(wB, col.blocks = c(8, 6), label = c("diet", "foraging")) # The results given by the two alternatives are identical ktab2 <- ktab.list.df(list(wM, wD, wF)) disecomor <- dist.ktab(ktab2, type= c("Q", "B", "B")) as.matrix(disecomor)[1:5, 1:5] contrib2 <- kdist.cor(ktab2, type= c("Q", "B", "B")) contrib2 ktab3 <- ktab.list.df(list(wM, wB)) disecomor2 <- dist.ktab(ktab3, type= c("Q", "B")) as.matrix(disecomor2)[1:5, 1:5] contrib3 <- kdist.cor(ktab3, type= c("Q", "B")) contrib3 # With a range of variables data(woangers) traits <- woangers$traits # Nominal variables 'li', 'pr', 'lp' and 'le' # (see table 1 in the main text for the codes of the variables) tabN <- traits[,c(1:2, 7, 8)] # Circular variable 'fo' tabC <- traits[3] tabCp <- prep.circular(tabC, 1, 12) # The levels of the variable lie between 1 (January) and 12 (December). # Ordinal variables 'he', 'ae' and 'un' tabO <- traits[, 4:6] # Fuzzy variables 'mp', 'pe' and 'di' tabF <- traits[, 9:19] tabFp <- prep.fuzzy(tabF, c(3, 3, 5), labels = c("mp", "pe", "di")) # 'mp' has 3 levels, 'pe' has 3 levels and 'di' has 5 levels. # Quantitative variables 'lo' and 'lf' tabQ <- traits[, 20:21] ktab1 <- ktab.list.df(list(tabN, tabCp, tabO, tabFp, tabQ)) distrait <- dist.ktab(ktab1, c("N", "C", "O", "F", "Q")) is.euclid(distrait) contrib <- kdist.cor(ktab1, type = c("N", "C", "O", "F", "Q")) contrib dotchart(sort(contrib$glocor), labels = rownames(contrib$glocor)[order(contrib$glocor[, 1])]) } } \keyword{multivariate} ade4/man/pcw.Rd0000644000176200001440000000354413047116774012742 0ustar liggesusers\name{pcw} \alias{pcw} \docType{data} \title{Distribution of of tropical trees along the Panama canal} \description{ Abundance of tropical trees, environmental variables and spatial coordinates for 50 sites. Data are available at \url{http://www.sciencemag.org/content/295/5555/666/suppl/DC1} but plots from Barro Colorado Island were removed. } \usage{data(pcw)} \format{ A list with 5 components. \describe{ \item{spe}{Distribution of the abundances of 778 species in 50 sites} \item{env}{Measurements of environmental variables for the 50 sites} \item{xy}{Spatial coordinates for the sites (decimal degrees)} \item{xy.utm}{Spatial coordinates for the sites (UTM)} \item{map}{Map of the study area stored as a SpatialPolygons object} } } \source{ Condit, R., N. Pitman, E. G. Leigh, J. Chave, J. Terborgh, R. B. Foster, P. Núnez, S. Aguilar, R. Valencia, G. Villa, H. C. Muller-Landau, E. Losos, and S. P. Hubbell. (2002) Beta-diversity in tropical forest trees. \emph{Science}, \bold{295}, 666–669. Pyke, C. R., R. Condit, S. Aguilar, and S. Lao. (2001) Floristic composition across a climatic gradient in a neotropical lowland forest. \emph{Journal of Vegetation Science}, \bold{12}, 553--566. } \references{ Dray, S., R. Pélissier, P. Couteron, M. J. Fortin, P. Legendre, P. R. Peres-Neto, E. Bellier, R. Bivand, F. G. Blanchet, M. De Caceres, A. B. Dufour, E. Heegaard, T. Jombart, F. Munoz, J. Oksanen, J. Thioulouse, and H. H. Wagner. (2012) Community ecology in the age of multivariate multiscale spatial analysis. \emph{Ecological Monographs}, \bold{82}, 257--275. } \examples{ if(adegraphicsLoaded()) { data(pcw) if(requireNamespace("spdep", quietly = TRUE)) { nb1 <- spdep::graph2nb(spdep::gabrielneigh(pcw$xy.utm), sym = TRUE) s.label(pcw$xy, nb = nb1, Sp = pcw$map) } }} \keyword{datasets} ade4/man/rtest.discrimin.Rd0000644000176200001440000000247712576021756015277 0ustar liggesusers\name{rtest.discrimin} \alias{rtest.discrimin} \title{ Monte-Carlo Test on a Discriminant Analysis (in R). } \description{ Test of the sum of a discriminant analysis eigenvalues (divided by the rank). Non parametric version of the Pillai's test. It authorizes any weighting. } \usage{ \method{rtest}{discrimin}(xtest, nrepet = 99, \dots) } \arguments{ \item{xtest}{an object of class \code{discrimin}} \item{nrepet}{the number of permutations} \item{\dots}{further arguments passed to or from other methods} } \value{ returns a list of class \code{rtest} } \author{Daniel Chessel } \examples{ data(meaudret) pca1 <- dudi.pca(meaudret$env, scan = FALSE, nf = 3) rand1 <- rtest(discrimin(pca1, meaudret$design$season, scan = FALSE), 99) rand1 #Monte-Carlo test #Observation: 0.3035 #Call: as.rtest(sim = sim, obs = obs) #Based on 999 replicates #Simulated p-value: 0.001 plot(rand1, main = "Monte-Carlo test") summary.manova(manova(as.matrix(meaudret$env)~meaudret$design$season), "Pillai") # Df Pillai approx F num Df den Df Pr(>F) # meaudret$design$season 3 2.73 11.30 27 30 1.6e-09 *** # Residuals 16 # --- # Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1 # 2.731/9 = 0.3034 } \keyword{multivariate} \keyword{nonparametric} ade4/man/mfa.Rd0000644000176200001440000000536113021372261012676 0ustar liggesusers\name{mfa} \alias{mfa} \alias{print.mfa} \alias{plot.mfa} \alias{summary.mfa} \title{Multiple Factorial Analysis} \description{ performs a multiple factorial analysis, using an object of class \code{ktab}. } \usage{ mfa(X, option = c("lambda1", "inertia", "uniform", "internal"), scannf = TRUE, nf = 3) \method{plot}{mfa}(x, xax = 1, yax = 2, option.plot = 1:4, \dots) \method{print}{mfa}(x, \dots) \method{summary}{mfa}(object, \dots) } \arguments{ \item{X}{K-tables, an object of class \code{ktab}} \item{option}{a string of characters for the weighting of arrays options : \describe{ \item{\code{lambda1}}{weighting of group k by the inverse of the first eigenvalue of the k analysis} \item{\code{inertia}}{weighting of group k by the inverse of the total inertia of the array k} \item{\code{uniform}}{uniform weighting of groups} \item{\code{internal}}{weighting included in \code{X$tabw}} } } \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} \item{x, object}{an object of class 'mfa'} \item{xax, yax}{the numbers of the x-axis and the y-axis} \item{option.plot}{an integer between 1 and 4, otherwise the 4 components of the plot are displayed} \item{\dots}{further arguments passed to or from other methods} } \value{ Returns a list including : \item{tab}{a data frame with the modified array} \item{rank}{a vector of ranks for the analyses} \item{eig}{a numeric vector with the all eigenvalues} \item{li}{a data frame with the coordinates of rows} \item{TL}{a data frame with the factors associated to the rows (indicators of table)} \item{co}{a data frame with the coordinates of columns} \item{TC}{a data frame with the factors associated to the columns (indicators of table)} \item{blo}{a vector indicating the number of variables for each table} \item{lisup}{a data frame with the projections of normalized scores of rows for each table} \item{link}{a data frame containing the projected inertia and the links between the arrays and the reference array} } \references{Escofier, B. and Pagès, J. (1994) Multiple factor analysis (AFMULT package), \emph{Computational Statistics and Data Analysis}, \bold{18}, 121--140. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(friday87) w1 <- data.frame(scale(friday87$fau, scal = FALSE)) w2 <- ktab.data.frame(w1, friday87$fau.blo, tabnames = friday87$tab.names) mfa1 <- mfa(w2, scann = FALSE) mfa1 plot(mfa1) data(escopage) w <- data.frame(scale(escopage$tab)) w <- ktab.data.frame(w, escopage$blo, tabnames = escopage$tab.names) plot(mfa(w, scann = FALSE)) } \keyword{multivariate} ade4/man/deug.Rd0000644000176200001440000000206012576021756013066 0ustar liggesusers\name{deug} \alias{deug} \docType{data} \title{Exam marks for some students} \description{ This data set gives the exam results of 104 students in the second year of a French University onto 9 subjects. } \usage{data(deug)} \format{ \code{deug} is a list of three components. \describe{ \item{tab}{is a data frame with 104 students and 9 subjects : Algebra, Analysis, Proba, Informatic, Economy, Option1, Option2, English, Sport.} \item{result}{is a factor of 104 components giving the final exam levels (A+, A, B, B-, C-, D).} \item{cent}{is a vector of required marks by subject to get exactly 10/20 with a coefficient.} } } \source{ University of Lyon 1 } \examples{ data(deug) # decentred PCA pca1 <- dudi.pca(deug$tab, scal = FALSE, center = deug$cent, scan = FALSE) if(adegraphicsLoaded()) { g1 <- s.class(pca1$li, deug$result, plot = FALSE) g2 <- s.arrow(40 * pca1$c1, plot = FALSE) G <- superpose(g1, g2, plot = TRUE) } else { s.class(pca1$li, deug$result) s.arrow(40 * pca1$c1, add.plot = TRUE) } } \keyword{datasets} ade4/man/bca.coinertia.Rd0000644000176200001440000000420413175633655014650 0ustar liggesusers\name{bca.coinertia} \alias{bca.coinertia} \title{Between-class coinertia analysis} \description{Performs a between-class analysis after a coinertia analysis} \usage{ \method{bca}{coinertia}(x, fac, scannf = TRUE, nf = 2, \dots) } \arguments{ \item{x}{a coinertia analysis (object of class \link{coinertia}) obtained by the function \link{coinertia}} \item{fac}{a factor partitioning the rows in classes} \item{scannf}{a logical value indicating whether the eigenvalues barplot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} \item{\dots}{further arguments passed to or from other methods} } \value{ An object of the class \code{betcoi}. Outputs are described by the \code{print} function } \details{ This analysis is equivalent to do a between-class analysis on each initial dudi, and a coinertia analysis on the two between analyses. This function returns additional outputs for the interpretation. } \references{ Franquet E., Doledec S., and Chessel D. (1995) Using multivariate analyses for separating spatial and temporal effects within species-environment relationships. \emph{Hydrobiologia}, \bold{300}, 425--431. } \note{ To avoid conflict names with the \code{base:::within} function, the function \code{within} is now deprecated and removed. To be consistent, the \code{betweencoinertia} function is also deprecated and is replaced by the method \code{bca.coinertia} of the new generic \code{bca} function. } \author{ Stéphane Dray \email{stephane.dray@univ-lyon1.fr} and Jean Thioulouse \email{jean.thioulouse@univ-lyon1.fr} } \seealso{\code{\link{coinertia}}, \code{\link{bca}}} \examples{ data(meaudret) pca1 <- dudi.pca(meaudret$env, scan = FALSE, nf = 4) pca2 <- dudi.pca(meaudret$spe, scal = FALSE, scan = FALSE, nf = 4) bet1 <- bca(pca1, meaudret$design$site, scan = FALSE, nf = 2) bet2 <- bca(pca2, meaudret$design$site, scan = FALSE, nf = 2) coib <- coinertia(bet1, bet2, scannf = FALSE) coi <- coinertia(pca1, pca2, scannf = FALSE, nf = 3) coi.b <- bca(coi,meaudret$design$site, scannf = FALSE) ## coib and coi.b are equivalent plot(coi.b) } \keyword{multivariate}ade4/man/wca.Rd0000644000176200001440000000644613175633655012733 0ustar liggesusers\name{wca} \alias{wca} \alias{wca.dudi} \title{Within-Class Analysis} \description{ Performs a particular case of an Orthogonal Principal Component Analysis with respect to Instrumental Variables (orthopcaiv), in which there is only a single factor as covariable. } \usage{ \method{wca}{dudi}(x, fac, scannf = TRUE, nf = 2, \dots) } \arguments{ \item{x}{a duality diagram, object of class \code{\link{dudi}} from one of the functions \code{dudi.coa}, \code{dudi.pca},...} \item{fac}{a factor partitioning the rows of \code{dudi$tab} in classes} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} \item{\dots}{further arguments passed to or from other methods} } \value{ Returns a list of the sub-class \code{within} in the class \code{dudi} \item{tab}{a data frame containing the transformed data (substraction of the class mean)} \item{call}{the matching call} \item{nf}{number of kept axes} \item{rank}{the rank of the analysis} \item{ratio}{percentage of within-class inertia} \item{eig}{a numeric vector containing the eigenvalues} \item{lw}{a numeric vector of row weigths} \item{cw}{a numeric vector of column weigths} \item{tabw}{a numeric vector of class weigths} \item{fac}{the factor defining the classes} \item{li}{data frame row coordinates} \item{l1}{data frame row normed scores} \item{co}{data frame column coordinates} \item{c1}{data frame column normed scores} \item{ls}{data frame supplementary row coordinates} \item{as}{data frame inertia axis onto within axis} } \references{ Benzécri, J. P. (1983) Analyse de l'inertie intra-classe par l'analyse d'un tableau de correspondances. \emph{Les Cahiers de l'Analyse des données}, \bold{8}, 351--358.\cr\cr Dolédec, S. and Chessel, D. (1987) Rythmes saisonniers et composantes stationnelles en milieu aquatique I- Description d'un plan d'observations complet par projection de variables. \emph{Acta Oecologica, Oecologia Generalis}, \bold{8}, 3, 403--426. } \note{ To avoid conflict names with the \code{base:::within} function, the function \code{within} is now deprecated and removed. It is replaced by the method \code{wca.dudi} of the new generic \code{wca} function. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(meaudret) pca1 <- dudi.pca(meaudret$env, scan = FALSE, nf = 4) wit1 <- wca(pca1, meaudret$design$site, scan = FALSE, nf = 2) if(adegraphicsLoaded()) { g1 <- s.traject(pca1$li, meaudret$design$site, psub.text = "Principal Component Analysis", plines.lty = 1:nlevels(meaudret$design$site), psub.cex = 1.5, plot = FALSE) g2 <- s.traject(wit1$li, meaudret$design$site, psub.text = "Within site Principal Component Analysis", plines.lty = 1:nlevels(meaudret$design$site), psub.cex = 1.5, plot = FALSE) g3 <- s.corcircle (wit1$as, plot = FALSE) G <- ADEgS(list(g1, g2, g3), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) s.traject(pca1$li, meaudret$design$site, sub = "Principal Component Analysis", csub = 1.5) s.traject(wit1$li, meaudret$design$site, sub = "Within site Principal Component Analysis", csub = 1.5) s.corcircle (wit1$as) par(mfrow = c(1,1)) } plot(wit1) } \keyword{multivariate}ade4/man/kplot.statis.Rd0000644000176200001440000000365612576021756014615 0ustar liggesusers\name{kplot.statis} \alias{kplot.statis} \title{Multiple Graphs of a STATIS Analysis} \description{ performs high level plots for a STATIS analysis, using an object of class \code{statis}. } \usage{ \method{kplot}{statis}(object, xax = 1, yax = 2, mfrow = NULL, which.tab = 1:length(object$tab.names), clab = 1.5, cpoi = 2, traject = FALSE, arrow = TRUE, class = NULL, unique.scale = FALSE, csub = 2, possub = "bottomright",\dots) } \arguments{ \item{object}{an object of class \code{statis}} \item{xax, yax}{the numbers of the x-axis and the y-axis} \item{mfrow}{parameter for the array of figures to be drawn} \item{which.tab}{a numeric vector containing the numbers of the tables to analyse} \item{clab}{a character size for the labels} \item{cpoi}{the size of points} \item{traject}{a logical value indicating whether the trajectories should be drawn in a natural order} \item{arrow}{a logical value indicating whether the column factorial diagrams should be plotted} \item{class}{if not NULL, a factor of length equal to the number of the total columns of the K-tables} \item{unique.scale}{if TRUE, all the arrays of figures have the same scale} \item{csub}{a character size for the labels of the arrays of figures used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{\dots}{further arguments passed to or from other methods} } \author{Daniel Chessel } \examples{ data(jv73) dudi1 <- dudi.pca(jv73$poi, scann = FALSE, scal = FALSE) wit1 <- wca(dudi1, jv73$fac.riv, scann = FALSE) kta1 <- ktab.within(wit1) statis1 <- statis(kta1, scann = FALSE) if(adegraphicsLoaded()) { g1 <- kplot(statis1, traj = TRUE, arrow = FALSE, plab.cex = 0, psub.cex = 2, ppoi.cex = 2) } else { kplot(statis1, traj = TRUE, arrow = FALSE, unique = TRUE, clab = 0, csub = 2, cpoi = 2) }} \keyword{multivariate} \keyword{hplot} ade4/man/divcmax.Rd0000644000176200001440000000546413146545706013610 0ustar liggesusers\name{divcmax} \alias{divcmax} \title{Maximal value of Rao's diversity coefficient also called quadratic entropy} \description{ For a given dissimilarity matrix, this function calculates the maximal value of Rao's diversity coefficient over all frequency distribution. It uses an optimization technique based on Rosen's projection gradient algorithm and is verified using the Kuhn-Tucker conditions. } \usage{ divcmax(dis, epsilon, comment) } \arguments{ \item{dis}{an object of class \code{dist} containing distances or dissimilarities among elements.} \item{epsilon}{a tolerance threshold : a frequency is non null if it is higher than epsilon.} \item{comment}{a logical value indicating whether or not comments on the optimization technique should be printed.} } \value{ Returns a list \item{value}{the maximal value of Rao's diversity coefficient.} \item{vectors}{a data frame containing four frequency distributions : \code{sim} is a simple distribution which is equal to \eqn{\frac{D1}{1^tD1}}{D1/1^tD1}, \code{pro} is equal to \eqn{\frac{z}{1^tz1}}{z/1^tz1}, where z is the nonnegative eigenvector of the matrix containing the squared dissimilarities among the elements, \code{met} is equal to \eqn{z^2}{z^2}, \code{num} is a frequency vector maximizing Rao's diversity coefficient.} } \references{ Rao, C.R. (1982) Diversity and dissimilarity coefficients: a unified approach. \emph{Theoretical Population Biology}, \bold{21}, 24--43. Gini, C. (1912) Variabilità e mutabilità. \emph{Universite di Cagliari III}, Parte II. Simpson, E.H. (1949) Measurement of diversity. \emph{Nature}, \bold{163}, 688. Champely, S. and Chessel, D. (2002) Measuring biological diversity using Euclidean metrics. \emph{Environmental and Ecological Statistics}, \bold{9}, 167--177. Pavoine, S., Ollier, S. and Pontier, D. (2005) Measuring diversity from dissimilarities with Rao's quadratic entropy: are any dissimilarities suitable? \emph{Theoretical Population Biology}, \bold{67}, 231--239. } \author{ Stéphane Champely \email{Stephane.Champely@univ-lyon1.fr} \cr Sandrine Pavoine \email{pavoine@mnhn.fr} } \examples{ data(elec88) # Dissimilarity matrix. d0 <- dist(elec88$xy/100) # Frequency distribution maximizing spatial diversity in France # according to Rao's quadratic entropy. France.m <- divcmax(d0) w0 <- France.m$vectors$num v0 <- France.m$value idx <- (1:94) [w0 > 0] if(!adegraphicsLoaded()) { # Smallest circle including all the 94 departments. # The squared radius of that circle is the maximal value of the # spatial diversity. w1 <- elec88$xy[idx, ]/100 w.c <- apply(w1 * w0[idx], 2, sum) plot(elec88$xy[, 1]/100, elec88$xy[, 2]/100, asp=1) symbols(w.c[1], w.c[2], circles = sqrt(v0), inches = FALSE, add = TRUE) s.value(elec88$xy/100, w0, add.plot = TRUE) } } \keyword{multivariate} ade4/man/sco.gauss.Rd0000644000176200001440000000520313021372261014033 0ustar liggesusers\name{sco.gauss} \alias{sco.gauss} \title{Relationships between one score and qualitative variables} \description{ Draws Gauss curves with the same mean and variance as the scores of indivivuals belonging to categories of several qualitative variables. } \usage{ sco.gauss(score, df, xlim = NULL, steps = 200, ymax = NULL, sub = names(df), csub = 1.25, possub = "topleft", legen =TRUE, label = row.names(df), clabel = 1, grid = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0, 0)) } \arguments{ \item{score}{a numeric vector} \item{df}{a dataframe containing only factors, number of rows equal to the length of the score vector} \item{xlim}{starting point and end point for drawing the Gauss curves} \item{steps}{number of segments for drawing the Gauss curves} \item{ymax}{max ordinate for all Gauss curves. If NULL, ymax is computed and different for each factor} \item{sub}{vector of strings of characters for the lables of qualitative variables} \item{csub}{character size for the legend} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{legen}{if TRUE, the first graphic of the series displays the score with evenly spaced labels (see \code{sco.label})} \item{label}{labels for the score} \item{clabel}{a character size for the labels, used with \code{par("cex")*clabel}} \item{grid}{a logical value indicating whether a grid in the background of the plot should be drawn} \item{cgrid}{a character size, parameter used with par("cex")*\code{cgrid} to indicate the mesh of the grid} \item{include.origin}{a logical value indicating whether the point "origin" should belong to the plot} \item{origin}{the fixed point in the graph space, for example c(0,0) the origin axes} } \details{ Takes one vector containing quantitative values (score) and one dataframe containing only factors that give categories to wich the quantitative values belong. Computes the mean and variance of the values in each category of each factor, and draws a Gauss curve with the same mean and variance for each category of each factor. Can optionaly set the start and end point of the curves and the number of segments. The max ordinate (ymax) can also be set arbitrarily to set a common max for all factors (else the max is different for each factor). } \value{ The matched call. } \author{Jean Thioulouse, Stéphane Dray \email{stephane.dray@univ-lyon1.fr}} \examples{ data(meau) envpca <- dudi.pca(meau$env, scannf=FALSE) dffac <- cbind.data.frame(meau$design$season, meau$design$site) sco.gauss(envpca$li[,1], dffac, clabel = 2, csub = 2) } \keyword{multivariate} \keyword{hplot} ade4/man/scatter.dudi.Rd0000644000176200001440000000326112576021756014537 0ustar liggesusers\name{scatter.dudi} \alias{scatter.dudi} \title{Plot of the Factorial Maps} \description{ performs the scatter diagrams of objects of class \code{dudi}. } \usage{ \method{scatter}{dudi}(x, xax = 1, yax = 2, clab.row = 0.75, clab.col = 1, permute = FALSE, posieig = "top", sub = NULL, \dots) } \arguments{ \item{x}{an object of class \code{dudi}} \item{xax}{the column number for the x-axis} \item{yax}{the column number for the y-axis} \item{clab.row}{a character size for the rows} \item{clab.col}{a character size for the columns} \item{permute}{if FALSE, the rows are plotted by points and the columns by arrows. If TRUE it is the opposite.} \item{posieig}{if "top" the eigenvalues bar plot is upside, if "bottom" it is downside, if "none" no plot} \item{sub}{a string of characters to be inserted as legend} \item{\dots}{further arguments passed to or from other methods} } \details{ \code{scatter.dudi} is a factorial map of individuals and the projection of the vectors of the canonical basis multiplied by a constante of rescaling. In the eigenvalues bar plot,the used axes for the plot are in black, the other kept axes in grey and the other in white. The \code{permute} argument can be used to choose between the distance biplot (default) and the correlation biplot (permute = TRUE). } \author{Daniel Chessel} \examples{ data(deug) scatter(dd1 <- dudi.pca(deug$tab, scannf = FALSE, nf = 4), posieig = "bottomright") data(rhone) dd1 <- dudi.pca(rhone$tab, nf = 4, scann = FALSE) if(adegraphicsLoaded()) { scatter(dd1, row.psub.text = "Principal component analysis") } else { scatter(dd1, sub = "Principal component analysis") } } \keyword{multivariate} \keyword{hplot} ade4/man/granulo.Rd0000644000176200001440000000245413021372261013602 0ustar liggesusers\name{granulo} \alias{granulo} \docType{data} \title{Granulometric Curves} \description{ This data set gives the repartition in diameter classes of deposit samples. } \usage{data(granulo)} \format{ \code{granulo} is a list of 2 components. \describe{ \item{tab}{contains the 49 deposit samples, 9 diameter classes, weight of grains by size class} \item{born}{contains the boundaries of the diameter classes} } } \source{ Gaschignard-Fossati, O. (1986) \emph{Répartition spatiale des macroinvertébrés benthiques d'un bras vif du Rhône. Rôle des crues et dynamique saisonnière.} Thèse de doctorat, Université Lyon 1. } \examples{ data(granulo) w <- t(apply(granulo$tab, 1, function (x) x / sum(x))) w <- data.frame(w) wtr <- data.frame(t(w)) wmoy <- data.frame(matrix(apply(wtr, 1, mean), 1)) d1 <- dudi.pca(w, scal = FALSE, scan = FALSE) wmoy <- suprow(d1, wmoy)$lisup if(adegraphicsLoaded()) { s.arrow(d1$c1, plab.cex = 1.5) s.distri(d1$c1, wtr, starSize = 0.33, ellipseSize = 0, add = TRUE, plab.cex = 0.75) s.label(wmoy, ppoints.cex = 5, plab.cex = 0, add = TRUE) } else { s.arrow(d1$c1, clab = 1.5) s.distri(d1$c1, wtr, cstar = 0.33, cell = 0, axesell = FALSE, add.p = TRUE, clab = 0.75) s.label(wmoy, cpoi = 5, clab = 0, add.p = TRUE) }} \keyword{datasets} ade4/man/procuste.rtest.Rd0000644000176200001440000000206413050632301015130 0ustar liggesusers\name{procuste.rtest} \alias{procuste.rtest} \title{ Monte-Carlo Test on the sum of the singular values of a procustean rotation (in R). } \description{ performs a Monte-Carlo Test on the sum of the singular values of a procustean rotation. } \usage{ procuste.rtest(df1, df2, nrepet = 99, ...) } \arguments{ \item{df1}{a data frame} \item{df2}{a data frame} \item{nrepet}{the number of permutations} \item{\dots}{further arguments passed to or from other methods} } \value{ returns a list of class \code{rtest} } \references{ Jackson, D.A. (1995) PROTEST: a PROcustean randomization TEST of community environment concordance. \emph{Ecosciences}, \bold{2}, 297--303. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(doubs) pca1 <- dudi.pca(doubs$env, scal = TRUE, scann = FALSE) pca2 <- dudi.pca(doubs$fish, scal = FALSE, scann = FALSE) proc1 <- procuste(pca1$tab, pca2$tab) protest1 <- procuste.rtest(pca1$tab, pca2$tab, 999) protest1 plot(protest1) } \keyword{multivariate} \keyword{nonparametric} ade4/man/table.dist.Rd0000644000176200001440000000137712576021756014205 0ustar liggesusers\name{table.dist} \alias{table.dist} \title{Graph Display for Distance Matrices} \description{ presents a graph for viewing distance matrices. } \usage{ table.dist(d, x = 1:(attr(d, "Size")), labels = as.character(x), clabel = 1, csize = 1, grid = TRUE) } \arguments{ \item{d}{an object of class \code{dist}} \item{x}{a vector of the row and column positions} \item{labels}{a vector of strings of characters for the labels} \item{clabel}{a character size for the labels} \item{csize}{a coefficient for the circle size} \item{grid}{a logical value indicating whether a grid in the background of the plot should be drawn} } \author{ Daniel Chessel } \examples{ data(eurodist) table.dist(eurodist, labels = attr(eurodist, "Labels")) } \keyword{hplot} ade4/man/table.paint.Rd0000644000176200001440000000300612576021756014344 0ustar liggesusers\name{table.paint} \alias{table.paint} \title{Plot of the arrays by grey levels} \description{ presents a graph for viewing the numbers of a table by grey levels. } \usage{ table.paint(df, x = 1:ncol(df), y = nrow(df):1, row.labels = row.names(df), col.labels = names(df), clabel.row = 1, clabel.col = 1, csize = 1, clegend = 1) } \arguments{ \item{df}{a data frame} \item{x}{a vector of values to position the columns, used only for the ordered values} \item{y}{a vector of values to position the rows, used only for the ordered values} \item{row.labels}{a character vector for the row labels} \item{col.labels}{a character vector for the column labels} \item{clabel.row}{a character size for the row labels} \item{clabel.col}{a character size for the column labels} \item{csize}{if 'clegend' not NULL, a coefficient for the legend size} \item{clegend}{a character size for the legend, otherwise no legend} } \author{ Daniel Chessel } \examples{ data(rpjdl) X <- data.frame(t(rpjdl$fau)) Y <- data.frame(t(rpjdl$mil)) layout(matrix(c(1,2,2,2,1,2,2,2,1,2,2,2,1,2,2,2), 4, 4)) coa1 <- dudi.coa(X, scan = FALSE) x <- rank(coa1$co[,1]) y <- rank(coa1$li[,1]) table.paint(Y, x = x, y = 1:8, clabel.c = 0, cleg = 0) abline(v = 114.9, lwd = 3, col = "red") abline(v = 66.4, lwd = 3, col = "red") table.paint(X, x = x, y = y, clabel.c = 0, cleg = 0, row.lab = paste(" ", row.names(X), sep = "")) abline(v = 114.9, lwd = 3, col = "red") abline(v = 66.4, lwd = 3, col = "red") par(mfrow = c(1, 1)) } \keyword{hplot} ade4/man/supcol.Rd0000644000176200001440000000324413021372261013436 0ustar liggesusers\name{supcol} \alias{supcol} \alias{supcol.coa} \alias{supcol.dudi} \title{Projections of Supplementary Columns} \description{ performs projections of supplementary columns. } \usage{ supcol(x, \dots) \method{supcol}{dudi}(x, Xsup, \dots) \method{supcol}{coa}(x, Xsup, \dots) } \arguments{ \item{x}{an object used to select a method} \item{Xsup}{an array with the supplementary columns (\code{Xsup} and \code{x$tab} have the same row number)} \item{\dots}{further arguments passed to or from other methods} } \details{ If \code{supcol.dudi} is used, the column vectors of \code{Xsup} are projected without prior modification onto the principal components of dudi with the scalar product associated to the row weightings of dudi. } \value{A list of two components: \item{\code{tabsup}}{data frame containing the array with the supplementary columns transformed or not} \item{\code{cosup}}{data frame containing the coordinates of the supplementary projections} } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(rpjdl) rpjdl.coa <- dudi.coa(rpjdl$fau, scan = FALSE, nf = 4) rpjdl.coa$co[1:3, ] supcol(rpjdl.coa, rpjdl$fau[, 1:3])$cosup #the same data(doubs) dudi1 <- dudi.pca(doubs$fish, scal = FALSE, scan = FALSE) if(adegraphicsLoaded()) { g1 <- s.arrow(dudi1$co, plot = FALSE) g2 <- s.arrow(supcol(dudi1, data.frame(scalewt(doubs$env)))$cosup, plab.cex = 2, plot = FALSE) G <- superpose(g1, g2, plot = TRUE) } else { s.arrow(dudi1$co) s.arrow(supcol(dudi1, data.frame(scalewt(doubs$env)))$cosup, add.p = TRUE, clab = 2) symbols(0, 0, circles = 1, inches = FALSE, add = TRUE) } } \keyword{multivariate} ade4/man/adegraphicsLoaded.Rd0000644000176200001440000000061613021372261015514 0ustar liggesusers\name{adegraphicsLoaded} \alias{adegraphicsLoaded} \title{Utility function to test if the package adegraphics is loaded} \description{This function check if the package adegraphics is loaded. Mainly used to run examples using either ade4 or adegraphics function } \usage{ adegraphicsLoaded() } \value{A logical} \author{Stéphane Dray (\email{stephane.dray@univ-lyon1.fr})} \keyword{ internal } ade4/man/avijons.Rd0000644000176200001440000001105313177051376013614 0ustar liggesusers\name{avijons} \alias{avijons} \docType{data} \title{Bird species distribution} \description{ This data set contains information about spatial distribution of bird species in a zone surrounding the river Rhône near Lyon (France). } \usage{data(avijons)} \format{\code{avijons} is a list with the following components: \describe{ \item{xy}{a data frame with the coordinates of the sites} \item{area}{an object of class \code{area}} \item{fau}{a data frame with the abundance of 64 bird species in 91 sites} \item{spe.names.fr}{a vector of strings of character with the species names in french} \item{Spatial}{an object of the class \code{SpatialPolygons} of \code{sp}, containing the map} }} \source{ Bournaud, M., Amoros, C., Chessel, D., Coulet, M., Doledec, S., Michelot, J.L., Pautou, G., Rostan, J.C., Tachet, H. and Thioulouse, J. (1990). \emph{Peuplements d'oiseaux et propriétés des écocomplexes de la plaine du Rhône : descripteurs de fonctionnement global et gestion des berges.} Rapport programme S.R.E.T.I.E., Ministère de l'Environnement CORA et URA CNRS 367, Univ. Lyon I. } \references{ Thioulouse, J., Chessel, D. and Champely, S. (1995) Multivariate analysis of spatial patterns: a unified approach to local and global structures. \emph{Environmental and Ecological Statistics}, \bold{2}, 1--14. See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps051.pdf} (in French). } \examples{ data(avijons) w1 <- dudi.coa(avijons$fau, scannf = FALSE)$li area.plot(avijons$area, center = avijons$xy, val = w1[, 1], clab = 0.75, sub = "CA Axis 1", csub = 3) \dontrun{ data(avijons) if(!adegraphicsLoaded()) { if(requireNamespace("pixmap", quietly = TRUE)) { pnm.eau <- pixmap::read.pnm(system.file("pictures/avijonseau.pnm", package = "ade4")) pnm.rou <- pixmap::read.pnm(system.file("pictures/avijonsrou.pnm", package = "ade4")) pnm.veg <- pixmap::read.pnm(system.file("pictures/avijonsveg.pnm", package = "ade4")) pnm.vil <- pixmap::read.pnm(system.file("pictures/avijonsvil.pnm", package = "ade4")) jons.coa <- dudi.coa(avijons$fau, scan = FALSE, nf = 4) par(mfcol = c(3, 2)) s.value(avijons$xy, jons.coa$li[, 1], pixmap = pnm.rou, inclu = FALSE, grid = FALSE, addax = FALSE, cleg = 0, sub = "F1+ROADS", csub = 3) s.value(avijons$xy, jons.coa$li[, 1], pixmap = pnm.veg, inclu = FALSE, grid = FALSE, addax = FALSE, cleg = 0, sub = "F1+TREES", csub = 3) s.value(avijons$xy, jons.coa$li[, 1], pixmap = pnm.eau, inclu = FALSE, grid = FALSE, addax = FALSE, cleg = 0, sub = "F1+WATER", csub = 3) s.value(avijons$xy, jons.coa$li[, 2], pixmap = pnm.rou, inclu = FALSE, grid = FALSE, addax = FALSE, cleg = 0, sub = "F2+ROADS", csub = 3) s.value(avijons$xy, jons.coa$li[, 2], pixmap = pnm.veg, inclu = FALSE, grid = FALSE, addax = FALSE, cleg = 0, sub = "F2+TREES", csub = 3) s.value(avijons$xy, jons.coa$li[, 2], pixmap = pnm.eau, inclu = FALSE, grid = FALSE, addax = FALSE, cleg = 0, sub = "F2+WATER", csub = 3) par(mfrow = c(1, 1)) } if(requireNamespace("spdep", quietly = TRUE) & requireNamespace("pixmap", quietly = TRUE)) { link1 <- area2link(avijons$area) lw1 <- apply(link1, 1, function(x) x[x > 0]) neig1 <- neig(mat01 = 1*(link1 > 0)) nb1 <- neig2nb(neig1) listw1 <- spdep::nb2listw(nb1,lw1) jons.ms <- multispati(jons.coa, listw1, scan = FALSE, nfp = 3, nfn = 2) summary(jons.ms) par(mfrow = c(2, 2)) barplot(jons.coa$eig) barplot(jons.ms$eig) s.corcircle(jons.ms$as) plot(jons.coa$li[, 1], jons.ms$li[, 1]) par(mfrow = c(1, 1)) par(mfcol = c(3, 2)) s.value(avijons$xy, jons.ms$li[, 1], pixmap = pnm.rou, inclu = FALSE, grid = FALSE, addax = FALSE, cleg = 0, sub = "F1+ROADS", csub = 3) s.value(avijons$xy, jons.ms$li[, 1], pixmap = pnm.veg, inclu = FALSE, grid = FALSE, addax = FALSE, cleg = 0, sub = "F1+TREES", csub = 3) s.value(avijons$xy, jons.ms$li[, 1], pixmap = pnm.eau, inclu = FALSE, grid = FALSE, addax = FALSE, cleg = 0, sub = "F1+WATER", csub = 3) s.value(avijons$xy, jons.ms$li[, 2], pixmap = pnm.rou, inclu = FALSE, grid = FALSE, addax = FALSE, cleg = 0, sub = "F2+ROADS", csub = 3) s.value(avijons$xy, jons.ms$li[, 2], pixmap = pnm.veg, inclu = FALSE, grid = FALSE, addax = FALSE, cleg = 0, sub = "F2+TREES", csub = 3) s.value(avijons$xy, jons.ms$li[, 2], pixmap = pnm.eau, inclu = FALSE, grid = FALSE, addax = FALSE, cleg = 0, sub = "F2+WATER", csub = 3) par(mfrow = c(1, 1)) }}}} \keyword{datasets}ade4/man/plot.between.Rd0000644000176200001440000000464313040362670014547 0ustar liggesusers\name{between} \alias{summary.between} \alias{print.between} \alias{plot.between} \alias{print.betcoi} \alias{plot.betcoi} \title{Between-Class Analysis} \description{ Outputs and graphical representations of the results of a between-class analysis.} \usage{ \method{plot}{between}(x, xax = 1, yax = 2, \dots) \method{print}{between}(x, \dots) \method{plot}{betcoi}(x, xax = 1, yax = 2, \dots) \method{print}{betcoi}(x, \dots) \method{summary}{between}(object, \dots) } \arguments{ \item{x,object}{an object of class \code{between} or \code{betcoi}} \item{xax, yax}{the column index of the x-axis and the y-axis} \item{\dots}{further arguments passed to or from other methods} } \references{ Dolédec, S. and Chessel, D. (1987) Rythmes saisonniers et composantes stationnelles en milieu aquatique I- Description d'un plan d'observations complet par projection de variables. \emph{Acta Oecologica, Oecologia Generalis}, \bold{8}, 3, 403--426. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr}\cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \seealso{\code{\link{bca.dudi}}, \code{\link{bca.coinertia}}} \examples{ data(meaudret) pca1 <- dudi.pca(meaudret$env, scan = FALSE, nf = 4) pca2 <- dudi.pca(meaudret$spe, scal = FALSE, scan = FALSE, nf = 4) bet1 <- bca(pca1, meaudret$design$site, scan = FALSE, nf = 2) bet2 <- bca(pca2, meaudret$design$site, scan = FALSE, nf = 2) if(adegraphicsLoaded()) { g1 <- s.class(pca1$li, meaudret$design$site, psub.text = "Principal Component Analysis (env)", plot = FALSE) g2 <- s.class(pca2$li, meaudret$design$site, psub.text = "Principal Component Analysis (spe)", plot = FALSE) g3 <- s.class(bet1$ls, meaudret$design$site, psub.text = "Between sites PCA (env)", plot = FALSE) g4 <- s.class(bet2$ls, meaudret$design$site, psub.text = "Between sites PCA (spe)", plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) s.class(pca1$li, meaudret$design$site, sub = "Principal Component Analysis (env)", csub = 1.75) s.class(pca2$li, meaudret$design$site, sub = "Principal Component Analysis (spe)", csub = 1.75) s.class(bet1$ls, meaudret$design$site, sub = "Between sites PCA (env)", csub = 1.75) s.class(bet2$ls, meaudret$design$site, sub = "Between sites PCA (spe)", csub = 1.75) par(mfrow = c(1,1)) } coib <- coinertia(bet1, bet2, scann = FALSE) plot(coib) } \keyword{multivariate} ade4/man/aravo.Rd0000644000176200001440000000446412576021756013264 0ustar liggesusers\name{aravo} \alias{aravo} \docType{data} \title{Distribution of Alpine plants in Aravo (Valloire, France)} \description{This dataset describe the distribution of 82 species of Alpine plants in 75 sites. Species traits and environmental variables are also measured. } \usage{data(aravo)} \format{ \code{aravo} is a list containing the following objects : \describe{ \item{spe}{is a data.frame with the abundance values of 82 species (columns) in 75 sites (rows).} \item{env}{is a data.frame with the measurements of 6 environmental variables for the sites.} \item{traits}{is data.frame with the measurements of 8 traits for the species.} \item{spe.names}{is a vector with full species names.} } } \details{The environmental variables are: \tabular{lll}{ Aspect \tab Relative south aspect (opposite of the sine of aspect with flat coded 0)\cr Slope \tab Slope inclination (degrees)\cr Form \tab Microtopographic landform index: 1 (convexity); 2 (convex slope); 3 (right slope); 4 (concave slope); 5 (concavity) \cr Snow \tab Mean snowmelt date (Julian day) averaged over 1997-1999 \cr PhysD \tab Physical disturbance, i.e., percentage of unvegetated soil due to physical processes \cr ZoogD \tab Zoogenic disturbance, i.e., quantity of unvegetated soil due to marmot activity: no; some; high } The species traits for the plants are: \tabular{ll}{ Height \tab Vegetative height (cm) \cr Spread \tab Maximum lateral spread of clonal plants (cm)\cr Angle \tab Leaf elevation angle estimated at the middle of the lamina\cr Area \tab Area of a single leaf\cr Thick \tab Maximum thickness of a leaf cross section (avoiding the midrib)\cr SLA \tab Specific leaf area\cr Nmass \tab Mass-based leaf nitrogen content\cr Seed \tab Seed mass } } \source{ Choler, P. (2005) Consistent shifts in Alpine plant traits along a mesotopographical gradient. \emph{Arctic, Antarctic, and Alpine Research}, \bold{37},444--453. } \examples{ data(aravo) coa1 <- dudi.coa(aravo$spe, scannf = FALSE, nf = 2) dudienv <- dudi.hillsmith(aravo$env, scannf = FALSE, nf = 2, row.w = coa1$lw) duditrait <- dudi.pca(aravo$traits, scannf = FALSE, nf = 2, row.w = coa1$cw) rlq1 <- rlq(dudienv, coa1, duditrait, scannf = FALSE, nf = 2) plot(rlq1) } \keyword{datasets} ade4/man/bacteria.Rd0000644000176200001440000000202413352723055013706 0ustar liggesusers\name{bacteria} \alias{bacteria} \docType{data} \title{Genomes of 43 Bacteria} \description{ \code{bacteria} is a list containing 43 species and genomic informations : codons, amino acid and bases. } \usage{data(bacteria)} \format{ This list contains the following objects: \describe{ \item{code}{is a factor with the amino acid names for each codon. } \item{espcodon}{is a data frame 43 species 64 codons. } \item{espaa}{is a data frame 43 species 21 amino acid. } \item{espbase}{is a data frame 43 species 4 bases. } } } \source{ Data prepared by J. Lobry \email{Jean.Lobry@univ-lyon1.fr} starting from \url{https://www.jcvi.org/}. } \examples{ data(bacteria) names(bacteria$espcodon) names(bacteria$espaa) names(bacteria$espbase) sum(bacteria$espcodon) # 22,619,749 codons if(adegraphicsLoaded()) { g <- scatter(dudi.coa(bacteria$espcodon, scann = FALSE), posi = "bottomleft") } else { scatter(dudi.coa(bacteria$espcodon, scann = FALSE), posi = "bottom") }} \keyword{datasets} ade4/man/bordeaux.Rd0000644000176200001440000000126112576021756013755 0ustar liggesusers\name{bordeaux} \alias{bordeaux} \docType{data} \title{Wine Tasting} \description{ The \code{bordeaux} data frame gives the opinions of 200 judges in a blind tasting of five different types of claret (red wine from the Bordeaux area in the south western parts of France). } \usage{data(bordeaux)} \format{ This data frame has 5 rows (the wines) and 4 columns (the judgements) divided in excellent, good, mediocre and boring. } \source{ van Rijckevorsel, J. (1987) \emph{The application of fuzzy coding and horseshoes in multiple correspondence analysis}. DSWO Press, Leiden (p. 32) } \examples{ data(bordeaux) bordeaux score(dudi.coa(bordeaux, scan = FALSE)) } \keyword{datasets} ade4/man/ecg.Rd0000644000176200001440000000335612576021756012711 0ustar liggesusers\name{ecg} \alias{ecg} \docType{data} \title{Electrocardiogram data} \description{ These data were measured during the normal sinus rhythm of a patient who occasionally experiences arrhythmia. There are 2048 observations measured in units of millivolts and collected at a rate of 180 samples per second. This time series is a good candidate for a multiresolution analysis because its components are on different scales. For example, the large scale (low frequency) fluctuations, known as baseline drift, are due to the patient respiration, while the prominent short scale (high frequency) intermittent fluctuations between 3 and 4 seconds are evidently due to patient movement. Heart rhythm determines most of the remaining features in the series. The large spikes occurring about 0.7 seconds apart the R waves of normal heart rhythm; the smaller, but sharp peak coming just prior to an R wave is known as a P wave; and the broader peak that comes after a R wave is a T wave. } \usage{data(ecg)} \format{ A vector of class \code{ts} containing 2048 observations. } \source{ Gust Bardy and Per Reinhall, University of Washington } \references{ Percival, D. B., and Walden, A.T. (2000) \emph{Wavelet Methods for Time Series Analysis}, Cambridge University Press. } \examples{ \dontrun{ # figure 130 in Percival and Walden (2000) if (requireNamespace("waveslim") == TRUE) { data(ecg) ecg.level <- haar2level(ecg) ecg.haar <- orthobasis.haar(length(ecg)) ecg.mld <- mld(ecg, ecg.haar, ecg.level, plot = FALSE) res <- cbind.data.frame(apply(ecg.mld[,1:5],1,sum), ecg.mld[,6:11]) par(mfrow = c(8,1)) par(mar = c(2, 5, 1.5, 0.6)) plot(as.ts(ecg), ylab = "ECG") apply(res, 2, function(x) plot(as.ts(x), ylim = range(res), ylab = "")) par(mfrow = c(1,1)) }} } \keyword{datasets} ade4/man/mcoa.Rd0000644000176200001440000000565613021372261013061 0ustar liggesusers\name{mcoa} \alias{mcoa} \alias{print.mcoa} \alias{summary.mcoa} \alias{plot.mcoa} \title{Multiple CO-inertia Analysis} \description{ performs a multiple CO-inertia analysis, using an object of class \code{ktab}. } \usage{ mcoa(X, option = c("inertia", "lambda1", "uniform", "internal"), scannf = TRUE, nf = 3, tol = 1e-07) \method{print}{mcoa}(x, \dots) \method{summary}{mcoa}(object, \dots) \method{plot}{mcoa}(x, xax = 1, yax = 2, eig.bottom = TRUE, \dots) } \arguments{ \item{X}{an object of class \code{ktab}} \item{option}{a string of characters for the weightings of the arrays options : \describe{ \item{"inertia"}{weighting of group k by the inverse of the total inertia of the array k} \item{"lambda1"}{weighting of group k by the inverse of the first eigenvalue of the k analysis} \item{"uniform"}{uniform weighting of groups} \item{"internal"}{weighting included in \code{X$tabw}} } } \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} \item{tol}{a tolerance threshold, an eigenvalue is considered positive if it is larger than \code{-tol*lambda1} where \code{lambda1} is the largest eigenvalue.} \item{x, object}{an object of class 'mcoa'} \item{\dots}{further arguments passed to or from other methods} \item{xax, yax}{the numbers of the x-axis and the y-axis} \item{eig.bottom}{a logical value indicating whether the eigenvalues bar plot should be added} } \value{ mcoa returns a list of class 'mcoa' containing : \item{pseudoeig}{a numeric vector with the all pseudo eigenvalues} \item{call}{the call-up order} \item{nf}{a numeric value indicating the number of kept axes} \item{SynVar}{a data frame with the synthetic scores} \item{axis}{a data frame with the co-inertia axes} \item{Tli}{a data frame with the co-inertia coordinates} \item{Tl1}{a data frame with the co-inertia normed scores} \item{Tax}{a data frame with the inertia axes onto co-inertia axis} \item{Tco}{a data frame with the column coordinates onto synthetic scores} \item{TL}{a data frame with the factors for Tli Tl1} \item{TC}{a data frame with the factors for Tco} \item{T4}{a data frame with the factors for Tax} \item{lambda}{a data frame with the all eigenvalues (computed on the separate analyses)} \item{cov2}{a numeric vector with the all pseudo eigenvalues (synthetic analysis)} } \references{ Chessel, D. and Hanafi, M. (1996) Analyses de la co-inertie de K nuages de points, \emph{Revue de Statistique Appliquée}, \bold{44}, 35--60. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(friday87) w1 <- data.frame(scale(friday87$fau, scal = FALSE)) w2 <- ktab.data.frame(w1, friday87$fau.blo, tabnames = friday87$tab.names) mcoa1 <- mcoa(w2, "lambda1", scan = FALSE) mcoa1 summary(mcoa1) plot(mcoa1) } \keyword{multivariate} ade4/man/t3012.Rd0000644000176200001440000000240313175633655012717 0ustar liggesusers\name{t3012} \alias{t3012} \docType{data} \title{Average temperatures of 30 French cities} \description{ This data set gives the average temperatures of 30 French cities during 12 months. } \usage{data(t3012)} \format{\code{t3012} is a list with the following components: \describe{ \item{xy}{a data frame with 30 rows (cities) and 2 coordinates (x, y)} \item{temp}{a data frame with 30 rows (cities) and 12 columns (months). Each column contains the average temperature in tenth of degree Celsius.} \item{contour}{a data frame with 4 columns (x1, y1, x2, y2) for the contour display of France} \item{Spatial}{an object of the class \code{SpatialPolygons} of \code{sp}, containing the map} }} \source{ Besse, P. (1979) \emph{Etude descriptive d'un processus; approximation, interpolation}. Thèse de troisième cycle, Université Paul Sabatier, Toulouse. } \examples{ data(t3012) data(elec88) if(adegraphicsLoaded()) { if(requireNamespace("sp", quietly = TRUE)) { s.arrow(t3012$xy, pori.ori = as.numeric(t3012$xy["Paris", ]), Sp = t3012$Spatial, pSp.col = "white", pgrid.draw = FALSE) } } else { area.plot(elec88$area) s.arrow(t3012$xy, ori = as.numeric(t3012$xy["Paris", ]), add.p = TRUE) }} \keyword{datasets}ade4/man/s.chull.Rd0000644000176200001440000000576212576021756013526 0ustar liggesusers\name{s.chull} \alias{s.chull} \title{Plot of the factorial maps with polygons of contour by level of a factor} \description{ performs the scatter diagrams with polygons of contour by level of a factor. } \usage{ s.chull(dfxy, fac, xax = 1, yax = 2, optchull = c(0.25, 0.5, 0.75, 1), label = levels(fac), clabel = 1, cpoint = 0, col = rep(1, length(levels(fac))), xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, origin = c(0,0), include.origin = TRUE, sub = "", csub = 1, possub = "bottomleft", cgrid = 1, pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) } \arguments{ \item{dfxy}{a data frame containing the two columns for the axes} \item{fac}{a factor partioning the rows of the data frame in classes} \item{xax}{the column number of x in \code{dfxy}} \item{yax}{the column number of y in \code{dfxy}} \item{optchull}{the number of convex hulls and their interval} \item{label}{a vector of strings of characters for the point labels} \item{clabel}{if not NULL, a character size for the labels, used with \code{par("cex")*clabel}} \item{cpoint}{a character size for plotting the points, used with \code{par("cex")*cpoint}. If zero, no points are drawn} \item{col}{a vector of colors used to draw each class in a different color} \item{xlim}{the ranges to be encompassed by the x axis, if NULL, they are computed} \item{ylim}{the ranges to be encompassed by the y axis, if NULL they are computed} \item{grid}{a logical value indicating whether a grid in the background of the plot should be drawn} \item{addaxes}{a logical value indicating whether the axes should be plotted} \item{origin}{the fixed point in the graph space, for example c(0,0) the origin axes} \item{include.origin}{a logical value indicating whether the point "origin" should be belonged to the graph space} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{cgrid}{a character size, parameter used with par("cex")* \code{cgrid} to indicate the mesh of the grid} \item{pixmap}{an object 'pixmap' displayed in the map background} \item{contour}{a data frame with 4 columns to plot the contour of the map : each row gives a segment (x1,y1,x2,y2)} \item{area}{a data frame of class 'area' to plot a set of surface units in contour} \item{add.plot}{if TRUE uses the current graphics window} } \value{ The matched call. } \author{Daniel Chessel} \examples{ xy <- cbind.data.frame(x = runif(200,-1,1), y = runif(200,-1,1)) posi <- factor(xy$x > 0) : factor(xy$y > 0) coul <- c("black", "red", "green", "blue") if(adegraphicsLoaded()) { s.class(xy, posi, ppoi.cex = 1.5, chullSize = c(0.25, 0.5, 0.75, 1), ellipseSize = 0, starSize = 0, ppoly = list(col = "white", border = coul)) } else { s.chull(xy, posi, cpoi = 1.5, col = coul) }} \keyword{multivariate} \keyword{hplot} ade4/man/pcaivortho.Rd0000644000176200001440000000760413040362670014317 0ustar liggesusers\name{pcaivortho} \alias{pcaivortho} \alias{summary.pcaivortho} \title{Principal Component Analysis with respect to orthogonal instrumental variables} \description{ performs a Principal Component Analysis with respect to orthogonal instrumental variables. } \usage{ pcaivortho(dudi, df, scannf = TRUE, nf = 2) \method{summary}{pcaivortho}(object, \dots) } \arguments{ \item{dudi}{a duality diagram, object of class \code{dudi}} \item{df}{a data frame with the same rows} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} \item{object}{an object of class \code{pcaiv}} \item{\dots}{further arguments passed to or from other methods} } \value{ an object of class 'pcaivortho' sub-class of class \code{dudi} \item{rank}{an integer indicating the rank of the studied matrix} \item{nf}{an integer indicating the number of kept axes} \item{eig}{a vector with the all eigenvalues} \item{lw}{a numeric vector with the row weigths (from \code{dudi})} \item{cw}{a numeric vector with the column weigths (from \code{dudi})} \item{Y}{a data frame with the dependant variables} \item{X}{a data frame with the explanatory variables} \item{tab}{a data frame with the modified array (projected variables)} \item{c1}{a data frame with the Pseudo Principal Axes (PPA)} \item{as}{a data frame with the Principal axis of \code{dudi$tab} on PAP} \item{ls}{a data frame with the projection of lines of \code{dudi$tab} on PPA} \item{li}{a data frame \code{dudi$ls} with the predicted values by X} \item{l1}{a data frame with the Constraint Principal Components (CPC)} \item{co}{a data frame with the inner product between the CPC and Y} \item{param}{a data frame containing a summary} } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr}\cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \references{ Rao, C. R. (1964) The use and interpretation of principal component analysis in applied research. \emph{Sankhya}, \bold{A 26}, 329--359.\cr\cr Sabatier, R., Lebreton J. D. and Chessel D. (1989) Principal component analysis with instrumental variables as a tool for modelling composition data. In R. Coppi and S. Bolasco, editors. \emph{Multiway data analysis}, Elsevier Science Publishers B.V., North-Holland, 341--352 } \examples{ \dontrun{ data(avimedi) cla <- avimedi$plan$reg:avimedi$plan$str # simple ordination coa1 <- dudi.coa(avimedi$fau, scan = FALSE, nf = 3) # within region w1 <- wca(coa1, avimedi$plan$reg, scan = FALSE) # no region the same result pcaivnonA <- pcaivortho(coa1, avimedi$plan$reg, scan = FALSE) summary(pcaivnonA) # region + strate interAplusB <- pcaiv(coa1, avimedi$plan, scan = FALSE) if(adegraphicsLoaded()) { g1 <- s.class(coa1$li, cla, psub.text = "Sans contrainte", plot = FALSE) g21 <- s.match(w1$li, w1$ls, plab.cex = 0, psub.text = "Intra Région", plot = FALSE) g22 <- s.class(w1$li, cla, plot = FALSE) g2 <- superpose(g21, g22) g31 <- s.match(pcaivnonA$li, pcaivnonA$ls, plab.cex = 0, psub.tex = "Contrainte Non A", plot = FALSE) g32 <- s.class(pcaivnonA$li, cla, plot = FALSE) g3 <- superpose(g31, g32) g41 <- s.match(interAplusB$li, interAplusB$ls, plab.cex = 0, psub.text = "Contrainte A + B", plot = FALSE) g42 <- s.class(interAplusB$li, cla, plot = FALSE) g4 <- superpose(g41, g42) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) s.class(coa1$li, cla, sub = "Sans contrainte") s.match(w1$li, w1$ls, clab = 0, sub = "Intra Région") s.class(w1$li, cla, add.plot = TRUE) s.match(pcaivnonA$li, pcaivnonA$ls, clab = 0, sub = "Contrainte Non A") s.class(pcaivnonA$li, cla, add.plot = TRUE) s.match(interAplusB$li, interAplusB$ls, clab = 0, sub = "Contrainte A + B") s.class(interAplusB$li, cla, add.plot = TRUE) par(mfrow = c(1,1)) }}} \keyword{multivariate} ade4/man/witwit.coa.Rd0000644000176200001440000000527713040362670014235 0ustar liggesusers\name{witwit.coa} \alias{witwit.coa} \alias{summary.witwit} \alias{witwitsepan} \title{Internal Correspondence Analysis} \description{ \code{witwit.coa} performs an Internal Correspondence Analysis. \code{witwitsepan} gives the computation and the barplot of the eigenvalues for each separated analysis in an Internal Correspondence Analysis. } \usage{ witwit.coa(dudi, row.blocks, col.blocks, scannf = TRUE, nf = 2) \method{summary}{witwit}(object, \dots) witwitsepan(ww, mfrow = NULL, csub = 2, plot = TRUE) } \arguments{ \item{dudi}{an object of class \code{coa} } \item{row.blocks}{a numeric vector indicating the row numbers for each block of rows} \item{col.blocks}{a numeric vector indicating the column numbers for each block of columns} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} \cr \item{object}{an object of class \code{witwit}} \item{\dots}{further arguments passed to or from other methods} \cr \item{ww}{an object of class \code{witwit}} \item{mfrow}{a vector of the form "c(nr,nc)", otherwise computed by a special own function 'n2mfrow'} \item{csub}{a character size for the sub-titles, used with \code{par("cex")*csub}} \item{plot}{if FALSE, numeric results are returned} } \value{ returns a list of class \code{witwit}, \code{coa} and \code{dudi} (see \link{as.dudi}) containing \item{rbvar}{a data frame with the within variances of the rows of the factorial coordinates} \item{lbw}{a data frame with the marginal weighting of the row classes} \item{cvar}{a data frame with the within variances of the columns of the factorial coordinates} \item{cbw}{a data frame with the marginal weighting of the column classes} } \references{ Cazes, P., Chessel, D. and Dolédec, S. (1988) L'analyse des correspondances internes d'un tableau partitionné : son usage en hydrobiologie. \emph{Revue de Statistique Appliquée}, \bold{36}, 39--54. } \author{ Daniel Chessel Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} Correction by Campo Elías PARDO \email{cepardot@cable.net.co} } \examples{ data(ardeche) coa1 <- dudi.coa(ardeche$tab, scann = FALSE, nf = 4) ww <- witwit.coa(coa1, ardeche$row.blocks, ardeche$col.blocks, scann = FALSE) ww summary(ww) if(adegraphicsLoaded()) { g1 <- s.class(ww$co, ardeche$sta.fac, plab.cex = 1.5, ellipseSi = 0, paxes.draw = FALSE, plot = FALSE) g2 <- s.label(ww$co, plab.cex = 0.75, plot = FALSE) G <- superpose(g1, g2, plot = TRUE) } else { s.class(ww$co, ardeche$sta.fac, clab = 1.5, cell = 0, axesell = FALSE) s.label(ww$co, add.p = TRUE, clab = 0.75) } witwitsepan(ww, c(4, 6)) } \keyword{multivariate} ade4/man/palm.Rd0000644000176200001440000000345413175633655013106 0ustar liggesusers\name{palm} \alias{palm} \docType{data} \title{Phylogenetic and quantitative traits of amazonian palm trees} \description{ This data set describes the phylogeny of 66 amazonian palm trees. It also gives 7 traits corresponding to these 66 species. } \usage{data(palm)} \format{ \code{palm} is a list containing the 2 following objects: \describe{ \item{tre}{is a character string giving the phylogenetic tree in Newick format.} \item{traits}{is a data frame with 66 species (rows) and 7 traits (columns).} } } \details{ Variables of \code{palm$traits} are the following ones: \cr rord: specific richness with five ordered levels\cr h: height in meter (squared transform)\cr dqual: diameter at breast height in centimeter with five levels \code{sout : subterranean}, \code{ d1(0, 5 cm)}, \code{ d2(5, 15 cm)}, \code{ d3(15, 30 cm)} and \code{ d4(30, 100 cm)}\cr vfruit: fruit volume in \eqn{mm^{3}}{mm^3} (logged transform)\cr vgrain: seed volume in \eqn{mm^{3}}{mm^3} (logged transform)\cr aire: spatial distribution area (\eqn{km^{2}}{km^2})\cr alti: maximum altitude in meter (logged transform)\cr } \source{ This data set was obtained by Clémentine Gimaret-Carpentier. } \examples{ \dontrun{ data(palm) palm.phy <- newick2phylog(palm$tre) radial.phylog(palm.phy,clabel.l=1.25) if (requireNamespace("adephylo", quietly = TRUE) & requireNamespace("ape", quietly = TRUE)) { tre <- ape::read.tree(text = palm$tre) adephylo::orthogram(palm$traits[, 4], tre) } dotchart.phylog(palm.phy,palm$traits[,4], clabel.l = 1, labels.n = palm.phy$Blabels, clabel.n = 0.75) w <- cbind.data.frame(palm.phy$Bscores[,c(3,4,6,13,21)], scalewt((palm$traits[,4]))) names(w)[6] <- names(palm$traits[4]) table.phylog(w, palm.phy, clabel.r = 0.75, f = 0.5) gearymoran(palm.phy$Amat, palm$traits[,-c(1,3)]) }} \keyword{datasets} ade4/man/macon.Rd0000644000176200001440000000057713021372261013234 0ustar liggesusers\name{macon} \alias{macon} \docType{data} \title{Wine Tasting} \usage{data(macon)} \description{ The \code{macon} data frame has 8 rows-wines and 25 columns-tasters. Each column is a classification of 8 wines (Beaujolais, France). } \source{ Foire Nationale des Vins de France, Mâcon, 1985 } \examples{ data(macon) s.corcircle(dudi.pca(macon, scan = FALSE)$co) } \keyword{datasets} ade4/man/table.phylog.Rd0000644000176200001440000000475113021372261014525 0ustar liggesusers\name{table.phylog} \alias{table.phylog} \title{Plot arrays in front of a phylogenetic tree} \description{ This function gives a graphical display for viewing the numbers of a table by square sizes in front of the corresponding phylogenetic tree. } \usage{ table.phylog(df, phylog, x = 1:ncol(df), f.phylog = 0.5, labels.row = gsub("[_]", " ", row.names(df)), clabel.row = 1, labels.col = names(df), clabel.col = 1, labels.nod = names(phylog$nodes), clabel.nod = 0, cleaves = 1, cnodes = 1, csize = 1, grid = TRUE, clegend = 0.75) } \arguments{ \item{df}{: a data frame or a matrix} \item{phylog}{: an object of class \code{'phylog'}} \item{x}{: a vector of values to position the columns} \item{f.phylog}{: a size coefficient for tree size (a parameter to draw the tree in proportion to leaves labels)} \item{labels.row}{: a vector of strings of characters for row labels} \item{clabel.row}{: a character size for the leaves labels, used with \code{par("cex")*clabel.row}. If zero, no row labels are drawn} \item{labels.col}{: a vector of strings of characters for columns labels} \item{clabel.col}{: a character size for the leaves labels, used with \code{par("cex")*clabel.col}. If zero, no column labels are drawn} \item{labels.nod}{: a vector of strings of characters for the nodes labels} \item{clabel.nod}{: a character size for the nodes labels, used with \code{par("cex")*clabel.nodes}. If zero, no nodes labels are drawn} \item{cleaves}{: a character size for plotting the points that represent the leaves, used with \code{par("cex")*cleaves}. If zero, no points are drawn} \item{cnodes}{: a character size for plotting the points that represent the nodes, used with \code{par("cex")*cnodes}. If zero, no points are drawn} \item{csize}{: a size coefficient for symbols} \item{grid}{: a logical value indicating whether the grid should be plotted} \item{clegend}{: a character size for the legend (if 0, no legend)} } \author{Daniel Chessel \cr Sébastien Ollier \email{sebastien.ollier@u-psud.fr} } \details{The function verifies that \code{sort(row.names(df))==sort(names(phylog$leaves))}. If \code{df} is a matrix the function uses \code{as.data.frame(df)}. } \seealso{\code{\link{symbols.phylog}} for one variable} \examples{ \dontrun{ data(newick.eg) w.phy <- newick2phylog(newick.eg[[9]]) w.tab <- data.frame(matrix(rnorm(620), 31, 20)) row.names(w.tab) <- sort(names(w.phy$leaves)) table.phylog(w.tab, w.phy, csi = 1.5, f = 0.5, clabel.n = 0.75, clabel.c = 0.5) } } \keyword{hplot} ade4/man/morphosport.Rd0000644000176200001440000000213013021372261014516 0ustar liggesusers\name{morphosport} \alias{morphosport} \docType{data} \title{Athletes' Morphology} \description{ This data set gives a morphological description of 153 athletes split in five different sports. } \usage{data(morphosport)} \format{ \code{morphosport} is a list of 2 objects. \describe{ \item{tab}{is a data frame with 153 athletes and 5 variables.} \item{sport}{is a factor with 6 items} } } \details{ Variables of \code{morphosport$tab} are the following ones: dbi (biacromial diameter (cm)), tde (height (cm)), tas (distance from the buttocks to the top of the head (cm)), lms (length of the upper limbs (cm)), poids (weigth (kg)).\cr The levels of \code{morphosport$sport} are: athl (athletics), foot (football), hand (handball), judo, nata (swimming), voll (volleyball). } \source{ Mimouni , N. (1996) \emph{Contribution de méthodes biométriques à l'analyse de la morphotypologie des sportifs}. Thèse de doctorat. Université Lyon 1. } \examples{ data(morphosport) plot(discrimin(dudi.pca(morphosport$tab, scan = FALSE), morphosport$sport, scan = FALSE)) } \keyword{datasets} ade4/man/kplot.foucart.Rd0000644000176200001440000000250212576021756014736 0ustar liggesusers\name{kplot.foucart} \alias{kplot.foucart} \title{Multiple Graphs for the Foucart's Correspondence Analysis} \description{ performs high level plots of a Foucart's Correspondence Analysis, using an object of class \code{foucart}. } \usage{ \method{kplot}{foucart}(object, xax = 1, yax = 2, mfrow = NULL, which.tab = 1:length(object$blo), clab.r = 1, clab.c = 1.25, csub = 2, possub = "bottomright", \dots) } \arguments{ \item{object}{an object of class \code{foucart} } \item{xax, yax}{the numbers of the x-axis and the y-axis} \item{mfrow}{a vector of the form 'c(nr,nc)', otherwise computed by as special own function \code{n2mfrow}} \item{which.tab}{vector of table numbers for analyzing} \item{clab.r}{a character size for the row labels} \item{clab.c}{a character size for the column labels} \item{csub}{a character size for the sub-titles used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{\dots}{further arguments passed to or from other methods} } \examples{ data(bf88) fou1 <- foucart(bf88, scann = FALSE, nf = 3) if(adegraphicsLoaded()) { g <- kplot(fou1, row.plab.cex = 0, psub.cex = 2) } else { kplot(fou1, clab.c = 2, clab.r = 0, csub = 3) } } \keyword{multivariate} \keyword{hplot} ade4/man/corvus.Rd0000644000176200001440000000246113040362670013456 0ustar liggesusers\name{corvus} \alias{corvus} \docType{data} \title{Corvus morphology} \description{ This data set gives a morphological description of 28 species of the genus Corvus split in two habitat types and phylogeographic stocks. } \usage{data(corvus)} \format{ \code{corvus} is data frame with 28 observations (the species) and 4 variables : \describe{ \item{wing}{: wing length (mm)} \item{bill}{: bill length (mm)} \item{habitat}{: habitat with two levels \code{clos} and \code{open}} \item{phylog}{: phylogeographic stock with three levels \code{amer}(America), \code{orien}(Oriental-Australian), \code{pale}(Paleoarctic-African)} } } \references{ Laiolo, P. and Rolando, A. (2003) The evolution of vocalisations in the genus Corvus: effects of phylogeny, morphology and habitat. \emph{Evolutionary Ecology}, \bold{17}, 111--123. } \examples{ data(corvus) if(adegraphicsLoaded()) { g1 <- s.label(corvus[, 1:2], plab.cex = 0, porigin.include = FALSE, pgrid.draw = FALSE, paxes.draw = TRUE, paxes.asp = "full", xlab = names(corvus)[2], ylab = names(corvus)[2], plot = FALSE) g2 <- s.class(corvus[, 1:2], corvus[, 4]:corvus[, 3], plot = FALSE) G <- superpose(g1, g2, plot = TRUE) } else { plot(corvus[, 1:2]) s.class(corvus[, 1:2], corvus[, 4]:corvus[, 3], add.p = TRUE) } } \keyword{datasets} ade4/man/plot.within.Rd0000644000176200001440000000436213040362670014416 0ustar liggesusers\name{within} \alias{print.within} \alias{summary.within} \alias{plot.within} \alias{plot.witcoi} \alias{print.witcoi} \title{Within-Class Analysis} \description{ Outputs and graphical representations of the results of a within-class analysis. } \usage{ \method{plot}{within}(x, xax = 1, yax = 2, \dots) \method{print}{within}(x, \dots) \method{plot}{witcoi}(x, xax = 1, yax = 2, \dots) \method{print}{witcoi}(x, \dots) \method{summary}{within}(object, \dots) } \arguments{ \item{x,object}{an object of class \code{within} or \code{witcoi}} \item{xax}{the column index for the x-axis} \item{yax}{the column index for the y-axis} \item{\dots}{further arguments passed to or from other methods} } \references{ Benzécri, J. P. (1983) Analyse de l'inertie intra-classe par l'analyse d'un tableau de correspondances. \emph{Les Cahiers de l'Analyse des données}, \bold{8}, 351--358.\cr\cr Dolédec, S. and Chessel, D. (1987) Rythmes saisonniers et composantes stationnelles en milieu aquatique I- Description d'un plan d'observations complet par projection de variables. \emph{Acta Oecologica, Oecologia Generalis}, \bold{8}, 3, 403--426. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr}\cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \seealso{\code{\link{wca.dudi}}, \code{\link{wca.coinertia}}} \examples{ data(meaudret) pca1 <- dudi.pca(meaudret$env, scan = FALSE, nf = 4) wit1 <- wca(pca1, meaudret$design$site, scan = FALSE, nf = 2) if(adegraphicsLoaded()) { g1 <- s.traject(pca1$li, meaudret$design$site, psub.text = "Principal Component Analysis", plines.lty = 1:length(levels(meaudret$design$site)), plot = FALSE) g2 <- s.traject(wit1$li, meaudret$design$site, psub.text = "Within site Principal Component Analysis", plines.lty = 1:length(levels(meaudret$design$site)), plot = FALSE) g3 <- s.corcircle (wit1$as, plot = FALSE) G <- ADEgS(list(g1, g2, g3), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) s.traject(pca1$li, meaudret$design$site, sub = "Principal Component Analysis", csub = 1.5) s.traject(wit1$li, meaudret$design$site, sub = "Within site Principal Component Analysis", csub = 1.5) s.corcircle (wit1$as) par(mfrow = c(1, 1)) } plot(wit1) } \keyword{multivariate} ade4/man/lizards.Rd0000644000176200001440000000320613047116774013614 0ustar liggesusers\name{lizards} \alias{lizards} \docType{data} \title{Phylogeny and quantitative traits of lizards} \description{ This data set describes the phylogeny of 18 lizards as reported by Bauwens and Díaz-Uriarte (1997). It also gives life-history traits corresponding to these 18 species. } \usage{data(lizards)} \format{ \code{lizards} is a list containing the 3 following objects : \describe{ \item{traits}{is a data frame with 18 species and 8 traits.} \item{hprA}{is a character string giving the phylogenetic tree (hypothesized phylogenetic relationships based on immunological distances) in Newick format.} \item{hprB}{is a character string giving the phylogenetic tree (hypothesized phylogenetic relationships based on morphological characteristics) in Newick format.} }} \details{ Variables of \code{lizards$traits} are the following ones : mean.L (mean length (mm)), matur.L (length at maturity (mm)), max.L (maximum length (mm)), hatch.L (hatchling length (mm)), hatch.m (hatchling mass (g)), clutch.S (Clutch size), age.mat (age at maturity (number of months of activity)), clutch.F (clutch frequency). } \references{ Bauwens, D., and Díaz-Uriarte, R. (1997) Covariation of life-history traits in lacertid lizards: a comparative study. \emph{American Naturalist}, \bold{149}, 91--111. See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps063.pdf} (in French). } \examples{ data(lizards) w <- data.frame(scalewt(log(lizards$traits))) par(mfrow = c(1,2)) wphy <- newick2phylog(lizards$hprA) table.phylog(w, wphy, csi = 3) wphy <- newick2phylog(lizards$hprB) table.phylog(w, wphy, csi = 3) par(mfrow = c(1,1)) } \keyword{datasets} ade4/man/rankrock.Rd0000644000176200001440000000113212576021756013753 0ustar liggesusers\name{rankrock} \alias{rankrock} \docType{data} \title{Ordination Table} \description{ This data set gives the classification in order of preference of 10 music groups by 51 students. } \usage{data(rankrock)} \format{ A data frame with 10 rows and 51 columns.\cr Each column contains the rank (1 for the favorite, \dots, 10 for the less appreciated)\cr attributed to the group by a student. } \examples{ data(rankrock) dudi1 <- dudi.pca(rankrock, scannf = FALSE, nf = 3) if(adegraphicsLoaded()) { g <- scatter(dudi1, row.plab.cex = 1.5) } else { scatter(dudi1, clab.r = 1.5) }} \keyword{datasets} ade4/man/piosphere.Rd0000644000176200001440000000231712576021756014145 0ustar liggesusers\name{piosphere} \alias{piosphere} \docType{data} \title{ Plant traits response to grazing } \description{ Plant species cover, traits and environmental parameters recorded around livestock watering points in different habitats of central Namibian farmlands. See the Wesuls et al. (2012) paper for a full description of the data set. } \usage{data(piosphere)} \format{ \code{piosphere} is a list of 4 components. \describe{ \item{veg}{is a data frame containing plant species cover} \item{traits}{is a data frame with plant traits} \item{env}{is a data frame with environmental variables} \item{habitat}{is a factor describing habitat/years for each site} } } \source{ Wesuls, D., Oldeland, J. and Dray, S. (2012) Disentangling plant trait responses to livestock grazing from spatio-temporal variation: the partial RLQ approach. \emph{Journal of Vegetation Science}, \bold{23}, 98--113. } \examples{ data(piosphere) names(piosphere) afcL <- dudi.coa(log(piosphere$veg + 1), scannf = FALSE) acpR <- dudi.pca(piosphere$env, scannf = FALSE, row.w = afcL$lw) acpQ <- dudi.hillsmith(piosphere$traits, scannf = FALSE, row.w = afcL$cw) rlq1 <- rlq(acpR, afcL, acpQ, scannf = FALSE) plot(rlq1) } \keyword{datasets} ade4/man/chickenk.Rd0000644000176200001440000000262312576021756013726 0ustar liggesusers\name{chickenk} \alias{chickenk} \docType{data} \title{Veterinary epidemiological study to assess the risk factors for losses in broiler chickens} \description{This data set contains information about potential risk factors for losses in broiler chickens} \usage{data(chickenk)} \format{ A list with 5 components: \describe{ \item{mortality}{a data frame with 351 observations and 4 variables which describe the losses (dependent dataset Y)} \item{FarmStructure}{a data frame with 351 observations and 5 variables which describe the farm structure (explanatory dataset)} \item{OnFarmHistory}{a data frame with 351 observations and 4 variables which describe the flock characteristics at placement (explanatory dataset)} \item{FlockCharacteristics}{a data frame with 351 observations and 6 variables which describe the flock characteristics during the rearing period (explanatory dataset)} \item{CatchingTranspSlaught}{a data frame with 351 observations and 5 variables which describe the transport, lairage conditions, slaughterhouse and inspection features (explanatory dataset)} } } \source{ Lupo C., le Bouquin S., Balaine L., Michel V., Peraste J., Petetin I., Colin P. \& Chauvin C. (2009) Feasibility of screening broiler chicken flocks for risk markers as an aid for meat inspection. \emph{Epidemiology and Infection}, 137, 1086-1098 } \examples{ data(chickenk) kta1 <- ktab.list.df(chickenk) } \keyword{datasets} ade4/man/PI2newick.Rd0000644000176200001440000000252113021372261013721 0ustar liggesusers\name{PI2newick} \alias{PI2newick} \title{Import data files from Phylogenetic Independance Package} \description{ This function ensures to transform a data set written for the Phylogenetic Independance package of Abouheif (1999) in a data set formatting for the functions of ade4. } \usage{ PI2newick(x) } \arguments{ \item{x}{is a data frame that contains information on phylogeny topology and trait values} } \value{ Returns a list containing : \item{tre}{: a character string giving the phylogenetic tree in Newick format} \item{trait}{: a vector containing values of the trait} } \references{ Abouheif, E. (1999) A method for testing the assumption of phylogenetic independence in comparative data. \emph{Evolutionary Ecology Research}, \bold{1}, 895--909. } \author{Sébastien Ollier \email{sebastien.ollier@u-psud.fr} \cr Daniel Chessel } \examples{ x <- c(2.0266, 0.5832, 0.2460, 1.2963, 0.2460, 0.1565, -99.0000, -99.0000, 10.1000, -99.0000, 20.2000, 28.2000, -99.0000, 14.1000, 11.2000, -99.0000, 21.3000, 27.5000, 1.0000, 2.0000, -1.0000, 4.0000, -1.0000, -1.0000, 3.0000, -1.0000, -1.0000, 5.0000, -1.0000, -1.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 0.0000) x <- matrix(x, nrow = 6) x <- as.data.frame(x) res <- PI2newick(x) dotchart.phylog(newick2phylog(res$tre), res$trait) } \keyword{manip} ade4/man/dist.binary.Rd0000644000176200001440000000554613021372261014366 0ustar liggesusers\name{dist.binary} \alias{dist.binary} \title{Computation of Distance Matrices for Binary Data} \description{ computes for binary data some distance matrice. } \usage{ dist.binary(df, method = NULL, diag = FALSE, upper = FALSE) } \arguments{ \item{df}{a matrix or a data frame with positive or null numeric values. Used with \code{as.matrix(1 * (df > 0))}} \item{method}{an integer between 1 and 10 . If NULL the choice is made with a console message. See details} \item{diag}{a logical value indicating whether the diagonal of the distance matrix should be printed by `print.dist'} \item{upper}{a logical value indicating whether the upper triangle of the distance matrix should be printed by `print.dist'} } \details{ Let be the contingency table of binary data such as \eqn{n_{11} = a}{n11 = a}, \eqn{n_{10} = b}{n10 = b}, \eqn{n_{01} = c}{n01 = c} and \eqn{n_{00} = d}{n00 = d}. All these distances are of type \eqn{d=\sqrt{1-s}}{d = sqrt(1 - s)} with \emph{s} a similarity coefficient. \describe{ \item{1 = Jaccard index (1901)}{S3 coefficient of Gower & Legendre \eqn{s_1 = \frac{a}{a+b+c}}{s1 = a / (a+b+c)}} \item{2 = Simple matching coefficient of Sokal & Michener (1958)}{S4 coefficient of Gower & Legendre \eqn{s_2 =\frac{a+d}{a+b+c+d}}{s2 = (a+d) / (a+b+c+d)}} \item{3 = Sokal & Sneath(1963)}{S5 coefficient of Gower & Legendre \eqn{s_3 =\frac{a}{a+2(b+c)}}{s3 = a / (a + 2(b + c))}} \item{4 = Rogers & Tanimoto (1960)}{S6 coefficient of Gower & Legendre \eqn{s_4 =\frac{a+d}{(a+2(b+c)+d)}}{s4 = (a + d) / (a + 2(b + c) +d)}} \item{5 = Dice (1945) or Sorensen (1948)}{S7 coefficient of Gower & Legendre \eqn{s_5 =\frac{2a}{2a+b+c}}{s5 = 2a / (2a + b + c)}} \item{6 = Hamann coefficient}{S9 index of Gower & Legendre (1986) \eqn{s_6 =\frac{a-(b+c)+d}{a+b+c+d}}{s6 = (a - (b + c) + d) / (a + b + c + d)}} \item{7 = Ochiai (1957)}{S12 coefficient of Gower & Legendre \eqn{s_7 =\frac{a}{\sqrt{(a+b)(a+c)}}}{s7 = a / sqrt((a + b)(a + c))}} \item{8 = Sokal & Sneath (1963)}{S13 coefficient of Gower & Legendre \eqn{s_8 =\frac{ad}{\sqrt{(a+b)(a+c)(d+b)(d+c)}}}{s8 = ad / sqrt((a + b)(a + c)(d + b)(d + c))}} \item{9 = Phi of Pearson}{S14 coefficient of Gower & Legendre \eqn{s_9 =\frac{ad-bc}{\sqrt{(a+b)(a+c)(b+d)(d+c)}}}{s9 = (ad - bc) / sqrt((a + b)(a + c)(d + b)(d + c))}} \item{10 = S2 coefficient of Gower & Legendre}{\eqn{s_1 = \frac{a}{a+b+c+d}}{s10 = a / (a + b + c + d)}} } } \value{ returns a distance matrix of class \code{dist} between the rows of the data frame } \references{Gower, J.C. and Legendre, P. (1986) Metric and Euclidean properties of dissimilarity coefficients. \emph{Journal of Classification}, \bold{3}, 5--48. } \author{ Daniel Chessel \cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \examples{ data(aviurba) for (i in 1:10) { d <- dist.binary(aviurba$fau, method = i) cat(attr(d, "method"), is.euclid(d), "\n")} } \keyword{array} \keyword{multivariate} ade4/man/bca.Rd0000644000176200001440000000705113175633655012677 0ustar liggesusers\name{bca} \alias{bca} \alias{bca.dudi} \title{Between-Class Analysis} \description{ Performs a particular case of a Principal Component Analysis with respect to Instrumental Variables (pcaiv), in which there is only a single factor as explanatory variable. } \usage{ \method{bca}{dudi}(x, fac, scannf = TRUE, nf = 2, \dots) } \arguments{ \item{x}{a duality diagram, object of class \code{\link{dudi}} from one of the functions \code{dudi.coa}, \code{dudi.pca},...} \item{fac}{a factor partitioning the rows of \code{dudi$tab} in classes} \item{scannf}{a logical value indicating whether the eigenvalues barplot should be displayed} \item{nf}{if scannf FALSE, a numeric value indicating the number of kept axes} \item{\dots}{further arguments passed to or from other methods} } \value{ Returns a list of class \code{\link{dudi}}, subclass 'between' containing \item{tab}{a data frame class-variables containing the means per class for each variable} \item{cw}{a numeric vector of the column weigths} \item{lw}{a numeric vector of the class weigths} \item{eig}{a numeric vector with all the eigenvalues} \item{rank}{the rank of the analysis} \item{nf}{an integer value indicating the number of kept axes} \item{c1}{a data frame with the column normed scores} \item{l1}{a data frame with the class normed scores} \item{co}{a data frame with the column coordinates} \item{li}{a data frame with the class coordinates} \item{call}{the matching call} \item{ratio}{the bewteen-class inertia percentage} \item{ls}{a data frame with the row coordinates} \item{as}{a data frame containing the projection of inertia axes onto between axes} } \references{ Dolédec, S. and Chessel, D. (1987) Rythmes saisonniers et composantes stationnelles en milieu aquatique I- Description d'un plan d'observations complet par projection de variables. \emph{Acta Oecologica, Oecologia Generalis}, \bold{8}, 3, 403--426. } \note{ To avoid conflict names with the \code{base:::within} function, the function \code{within} is now deprecated and removed. To be consistent, the \code{between} function is also deprecated and is replaced by the method \code{bca.dudi} of the new generic \code{bca} function. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(meaudret) pca1 <- dudi.pca(meaudret$env, scan = FALSE, nf = 4) pca2 <- dudi.pca(meaudret$spe, scal = FALSE, scan = FALSE, nf = 4) bet1 <- bca(pca1, meaudret$design$site, scan = FALSE, nf = 2) bet2 <- bca(pca2, meaudret$design$site, scan = FALSE, nf = 2) if(adegraphicsLoaded()) { g1 <- s.class(pca1$li, meaudret$design$site, psub.text = "Principal Component Analysis (env)", plot = FALSE) g2 <- s.class(pca2$li, meaudret$design$site, psub.text = "Principal Component Analysis (spe)", plot = FALSE) g3 <- s.class(bet1$ls, meaudret$design$site, psub.text = "Between sites PCA (env)", plot = FALSE) g4 <- s.class(bet2$ls, meaudret$design$site, psub.text = "Between sites PCA (spe)", plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) s.class(pca1$li, meaudret$design$site, sub = "Principal Component Analysis (env)", csub = 1.75) s.class(pca2$li, meaudret$design$site, sub = "Principal Component Analysis (spe)", csub = 1.75) s.class(bet1$ls, meaudret$design$site, sub = "Between sites PCA (env)", csub = 1.75) s.class(bet2$ls, meaudret$design$site, sub = "Between sites PCA (spe)", csub = 1.75) par(mfrow = c(1, 1)) } coib <- coinertia(bet1, bet2, scann = FALSE) plot(coib) } \keyword{multivariate}ade4/man/fission.Rd0000644000176200001440000000221312576021756013614 0ustar liggesusers\name{fission} \alias{fission} \docType{data} \title{Fission pattern and heritable morphological traits} \description{ This data set contains the mean values of five highly heritable linear combinations of cranial metric (GM1-GM3) and non metric (GN1-GN2) for 8 social groups of Rhesus Macaques on Cayo Santiago. It also describes the fission tree depicting the historical phyletic relationships. } \usage{data(fission)} \format{ \code{fission} is a list containing the 2 following objects : \describe{ \item{tre}{is a character string giving the fission tree in Newick format.} \item{tab}{is a data frame with 8 social groups and five traits : cranial metrics (GM1, GM2, GM3) and cranial non metrics (GN1, GN2)}} } \references{ Cheverud, J. and Dow, M.M. (1985) An autocorrelation analysis of genetic variation due to lineal fission in social groups of rhesus macaques. \emph{American Journal of Physical Anthropology}, \bold{67}, 113--122. } \examples{ data(fission) fis.phy <- newick2phylog(fission$tre) table.phylog(fission$tab[names(fis.phy$leaves),], fis.phy, csi = 2) gearymoran(fis.phy$Amat, fission$tab) } \keyword{datasets} ade4/man/gridrowcol.Rd0000644000176200001440000000413513175633655014325 0ustar liggesusers\name{gridrowcol} \alias{gridrowcol} \title{Complete regular grid analysis} \description{ This function defines objects to analyse data sets associated with complete regular grid. } \usage{ gridrowcol(nrow, ncol, cell.names = NULL) } \arguments{ \item{nrow}{size of the grid (number of rows)} \item{ncol}{size of the grid (number of columns)} \item{cell.names}{grid cell labels} } \value{ Returns a list containing the following items : \item{xy}{: a data frame with grid cell coordinates} \item{area}{: a data frame with three variables to display grid cells as areas} \item{neig}{: an object of class \code{'neig'} corresponding to a neighbouring graph of the grid (rook case)} \item{orthobasis}{: an object of class \code{'orthobasis'} corresponding to the analytical solution for the neighbouring graph} } \references{ Méot, A., Chessel, D. and Sabatier, D. (1993) Opérateurs de voisinage et analyse des données spatio-temporelles. \emph{in} J.D. Lebreton and B. Asselain, editors. Biométrie et environnement. Masson, 45-72. Cornillon, P.A. (1998) \emph{Prise en compte de proximités en analyse factorielle et comparative}. Thèse, Ecole Nationale Supérieure Agronomique, Montpellier. } \author{Sébastien Ollier \email{sebastien.ollier@u-psud.fr} \cr Daniel Chessel } \seealso{\code{\link{orthobasis}}, \code{\link[adephylo]{orthogram}}, \code{\link{mld}}} \examples{ w <- gridrowcol(8, 5) par(mfrow = c(1, 2)) area.plot(w$area, center = w$xy, graph = w$neig, clab = 0.75) area.plot(w$area, center = w$xy, graph = w$neig, clab = 0.75, label = as.character(1:40)) par(mfrow = c(1, 1)) if(adegraphicsLoaded()) { fac1 <- w$orthobasis names(fac1) <- as.character(signif(attr(w$orthobasis, "values"), 3)) s.value(w$xy, fac1, porigin.include = FALSE, plegend.drawKey = FALSE, pgrid.text.cex = 0, ylim = c(0, 10)) } else { par(mfrow = c(5,8)) for(k in 1:39) s.value(w$xy, w$orthobasis[, k], csi = 3, cleg = 0, csub = 2, sub = as.character(signif(attr(w$orthobasis, "values")[k], 3)), incl = FALSE, addax = FALSE, cgr = 0, ylim = c(0,10)) par(mfrow = c(1,1)) } } \keyword{spatial} ade4/man/randtest.amova.Rd0000644000176200001440000000205012576021756015067 0ustar liggesusers\name{randtest.amova} \alias{randtest.amova} \title{ Permutation tests on an analysis of molecular variance (in C).} \description{ Tests the components of covariance with permutation processes described by Excoffier et al. (1992). } \usage{ \method{randtest}{amova}(xtest, nrepet = 99, \dots) } \arguments{ \item{xtest}{an object of class \code{amova}} \item{nrepet}{the number of permutations} \item{\dots}{further arguments passed to or from other methods} } \value{ returns an object of class \code{krandtest} or \code{randtest} } \references{ Excoffier, L., Smouse, P.E. and Quattro, J.M. (1992) Analysis of molecular variance inferred from metric distances among DNA haplotypes: application to human mitochondrial DNA restriction data. \emph{Genetics}, \bold{131}, 479--491. } \author{Sandrine Pavoine \email{pavoine@mnhn.fr} } \examples{ data(humDNAm) amovahum <- amova(humDNAm$samples, sqrt(humDNAm$distances), humDNAm$structures) amovahum randtesthum <- randtest(amovahum, 49) plot(randtesthum) } \keyword{multivariate} \keyword{nonparametric} ade4/man/s.match.class.Rd0000644000176200001440000001074513021372261014576 0ustar liggesusers\name{s.match.class} \alias{s.match.class} \title{Scatterplot of two sets of coordinates and a partionning into classes} \description{ Performs a graphical representation of two sets of coordinates (different colors and symbols) and a partitionning into classes } \usage{ s.match.class(df1xy, df2xy, fac, wt = rep(1/nrow(df1xy), nrow(df1xy)), xax = 1, yax = 2, pch1 = 16, pch2 = 15, col1 = rep("lightgrey", nlevels(fac)), col2 = rep("darkgrey", nlevels(fac)), cpoint = 1, label = levels(fac), clabel = 1, cstar = 1, cellipse = 0, axesell = TRUE, xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0, 0), sub = "", csub = 1.25, possub = "bottomleft", pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) } \arguments{ \item{df1xy}{a dataframe with the first system of coordinates} \item{df2xy}{a dataframe with the secocnd system of coordinates} \item{fac}{a factor partitioning the rows of the data frame in classes} \item{wt}{a vector of weights} \item{xax}{a number indicating which column should be plotted on the x-axis} \item{yax}{a number indicating which column should be plotted on the x-axis} \item{pch1}{if \code{cpoint} > 0, an integer specifying the symbol or the single character to be used for plotting points} \item{pch2}{if \code{cpoint} > 0, an integer specifying the symbol or the single character to be used for plotting points} \item{col1}{a color for symbols} \item{col2}{a color for symbols} \item{cpoint}{a character size for plotting the points, used with \code{par("cex")*cpoint}. If zero, no points are drawn} \item{label}{a vector of strings of characters for the couple labels} \item{clabel}{if not NULL, a character size for the labels, used with \code{par("cex")*clabel}} \item{cstar}{a number between 0 and 1 which defines the length of the star size} \item{cellipse}{a positive coefficient for the inertia ellipse size} \item{axesell}{a logical value indicating whether the ellipse axes should be drawn} \item{xlim}{the ranges to be encompassed by the x axis, if NULL they are computed} \item{ylim}{the ranges to be encompassed by the y axis, if NULL they are computed} \item{grid}{a logical value indicating whether a grid in the background of the plot should be drawn} \item{addaxes}{a logical value indicating whether the axes should be plotted} \item{cgrid}{a character size, parameter used with par("cex")* \code{cgrid} to indicate the mesh of the grid} \item{include.origin}{a logical value indicating whether the point "origin" should belong to the graph space} \item{origin}{a fixed point in the graph space, for example c(0,0) for the origin of axes} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{pixmap}{a \code{pixmap} object} \item{contour}{a dataframe with 4 columns to plot the contour of the map : each row gives a segment (x1,y1,x2,y2)} \item{area}{a dataframe of class 'area' to plot an areal map} \item{add.plot}{if TRUE, add the plot to the current graphic device} } \value{ The matched call. } \author{ Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \seealso{ \code{\link{s.class}}, \code{\link{s.match}} } \examples{ xy <- data.frame(matrix(rnorm(100), 50, 2)) xy[, 1] <- xy[, 1] + rep(seq(0, 12, by = 3), rep(10, 5)) xy[, 2] <- xy[, 2] + rep(seq(0, 12, by = 3), rep(10, 5)) fac <- gl(5, 10) xy2 <- xy + matrix(rnorm(100), 50, 2) + 1 if(adegraphicsLoaded()) { mat <- rbind(xy, xy2) minmat <- apply(mat, 2, min) maxmat <- apply(mat, 2, max) lag <- 0.1 * abs(minmat - maxmat) xli <- c(minmat[1] - lag[1], maxmat[1] + lag[1]) yli <- c(minmat[2] - lag[2], maxmat[2] + lag[2]) g1 <- s.class(xy, fac, ellipseSize = 0, col = rep("grey45", nlevels(fac)), xlim = xli, ylim = yli, plabels.cex = 0, plot = FALSE) g2 <- s.class(xy2, fac, ellipseSize = 0, col = rep("grey75", nlevels(fac)), xlim = xli, ylim = yli, plabels.cex = 0, plot = FALSE) g3 <- s.match(g1@stats$means, g2@stats$means, xlim = xli, ylim = yli, plines.lwd = 2, psub.text = "xy -> xy2", plot = FALSE) g4 <- do.call("superpose", list(g1, g2)) g4@Call <- call("superpose", g1@Call, g2@Call) g4 <- do.call("superpose", list(g4, g3)) g4@Call <- call("superpose", g4@Call, g3@Call) g4 } else { s.match.class(xy, xy2, fac) } } \keyword{multivariate} \keyword{hplot} ade4/man/sepan.Rd0000644000176200001440000000363212576021756013256 0ustar liggesusers\name{sepan} \alias{sepan} \alias{plot.sepan} \alias{print.sepan} \alias{summary.sepan} \title{Separated Analyses in a K-tables} \description{ performs K separated multivariate analyses of an object of class \code{ktab} containing K tables. } \usage{ sepan(X, nf = 2) \method{plot}{sepan}(x, mfrow = NULL, csub = 2, \dots) \method{summary}{sepan}(object, \dots) \method{print}{sepan}(x, \dots) } \arguments{ \item{X}{an object of class \code{ktab}} \item{nf}{an integer indicating the number of kept axes for each separated analysis} \item{x, object}{an object of class 'sepan'} \item{mfrow}{a vector of the form "c(nr,nc)", otherwise computed by a special own function \code{n2mfrow}} \item{csub}{a character size for the sub-titles, used with \code{par("cex")*csub}} \item{\dots}{further arguments passed to or from other methods} } \value{ returns a list of class 'sepan' containing : \item{call}{a call order} \item{tab.names}{a vector of characters with the names of tables} \item{blo}{a numeric vector with the numbers of columns for each table} \item{rank}{a numeric vector with the rank of the studied matrix for each table} \item{Eig}{a numeric vector with all the eigenvalues} \item{Li}{a data frame with the row coordinates} \item{L1}{a data frame with the row normed scores} \item{Co}{a data frame with the column coordinates} \item{C1}{a data frame with the column normed coordinates} \item{TL}{a data frame with the factors for Li L1} \item{TC}{a data frame with the factors for Co C1} } \details{ The function plot on a \code{sepan} object allows to compare inertias and structures between arrays. In black, the eigenvalues of kept axes in the object 'sepan'. } \author{ Daniel Chessel } \examples{ data(escopage) w <- data.frame(scale(escopage$tab)) w <- ktab.data.frame(w, escopage$blo, tabnames = escopage$tab.names) sep1 <- sepan(w) sep1 summary(sep1) plot(sep1) } \keyword{multivariate} ade4/man/newick2phylog.Rd0000644000176200001440000001137213021372261014717 0ustar liggesusers\name{newick2phylog} \alias{newick2phylog} \alias{hclust2phylog} \alias{taxo2phylog} \alias{newick2phylog.addtools} \title{Create phylogeny} \description{ The first three functions ensure to create object of class \code{phylog} from either a character string in Newick format (\code{newick2phylog}) or an object of class \code{'hclust'} (\code{hclust2phylog}) or a taxonomy (\code{taxo2phylog}). The function \code{newick2phylog.addtools} is an internal function called by \code{newick2phylog}, \code{hclust2phylog} and \code{taxo2phylog} when \code{newick2phylog.addtools} = TRUE. It adds some items in \code{'phylog'} objects. } \usage{ newick2phylog(x.tre, add.tools = TRUE, call = match.call()) hclust2phylog(hc, add.tools = TRUE) taxo2phylog(taxo, add.tools = FALSE, root="Root", abbrev=TRUE) newick2phylog.addtools(res, tol = 1e-07) } \arguments{ \item{x.tre}{a character string corresponding to a phylogenetic tree in Newick format\cr (\url{http://evolution.genetics.washington.edu/phylip/newicktree.html})} \item{add.tools}{if TRUE, executes the function \code{newick2phylog.addtools}} \item{call}{call} \item{hc}{an object of class \code{hclust}} \item{taxo}{an object of class \code{taxo}} \item{res}{an object of class \code{phylog} (an internal argument of the function \code{newick2phylog})} \item{tol}{used in case 3 of \code{method} as a tolerance threshold for null eigenvalues} \item{root}{a character string for the root of the tree} \item{abbrev}{logical : if TRUE levels are abbreviated by column and two characters are added before} } \value{ Return object of class \code{phylog}. } \author{Daniel Chessel \cr Sébastien Ollier \email{sebastien.ollier@u-psud.fr} } \seealso{\code{\link{phylog}}, \code{\link{plot.phylog}}, \code{\link{as.taxo}}} \examples{ w <- "((((,,),,(,)),),(,));" w.phy <- newick2phylog(w) print(w.phy) plot(w.phy) \dontrun{ # newick2phylog data(newick.eg) radial.phylog(newick2phylog(newick.eg[[8]], FALSE), cnode = 1, clabel.l = 0.8) w <- NULL w[1] <- "(,((((((((((((((((,,(,(,))),),(((,(,)),(,)),),(,(,)),(,)),(((((" w[2] <- ",(,)),),),(,)),((((,((,),((,(,)),))),(,)),(,(,),,((,),(,)),)),(" w[3] <- "(((((,),),(,(,))),),(,)),(((,),),)))),((,,((,),)),(,)),((,),(,)" w[4] <- ")),(((((((((,,),),,),),((,),)),(,),((,),)),),(((((,),),),((,),)" w[5] <- "),(((,(,(,(,)))),(,)),(((,),(((((((,),),),,),(,)),(,)),)),((,)" w[6] <- ",))))),(,((,),(,)),((,(,)),)))),((((,(,(,))),((,(,)),,((,(,)),)" w[7] <- ",)),(((,),),(((,),),))),((,),))),((((((((((,,,,(,)),),((,),)),(" w[8] <- ",(,))),(((((((((,(,)),(,)),((((,((,),(,(,(,))))),((,),(,(,))))," w[9] <- "),((,),))),(((((((((,(,)),((,),(,))),),),),(((,((,),)),),((,((," w[10] <- "),)),)),(,)),(,(,(,)))),((((,(,)),(,)),(((,),(,)),(,),,(,))),(," w[11] <- "))),(,,,))),((((,),),),(((,(,(,))),((,),)),(,)))),(,)),),(,((,(" w[12] <- ",)),),(((,),),))),),(((,),),(,),(,(,))),(((,),(,)),((,),(,))))," w[13] <- "(((,),((,),)),(((((,,,,,),(,)),(,)),(,((,),))),))),(,(((((,((((" w[14] <- ",(,)),),),)),),((,((,),((,((,),(,))),))),)),((((,),(((,),(,(,))" w[15] <- "),)),),)),((,),)))),(((,((,,((,),)),)),),((,),))),((,),(,))),((" w[16] <- ",),)),(((((,),((,(,)),(((,(,)),(,(((,),),))),))),(,),,),),),,(," w[17] <- ")),((((,),,),),((,,,),((,),((,),))))),((((((,(,)),,(,)),,(,),(," w[18] <- "),),(((((,(,(,),)),(((,),,),(,))),),),),,,((,),)),),)),(((((,)," w[19] <- "(,(,)),),((,((,),),,),)),(((((((,),((((,,,),(,(,))),(((,(,)),)," w[20] <- "(,))),)),),),),(,)),),),((,),))),((,),)),(((((((((((,),),((((((" w[21] <- ",),),((,),)),(,)),),)),(,)),),((((((,),),(((,),),)),(,)),),(,))" w[22] <- ",),),),),(,)),),((,),(,),,,)),(,(,(,)))),),(,)),),);" phy1 <- newick2phylog(w,FALSE) phy1 radial.phylog(phy1, clabel.l = 0, circle = 2.2, clea = 0.5, cnod = 0.5) data(newick.eg) radial.phylog(newick2phylog(newick.eg[[8]], FALSE), cnode = 1, clabel.l = 0.8) # hclust2phylog data(USArrests) hc <- hclust(dist(USArrests), "ave") par(mfrow = c(1,2)) plot(hc, hang = -1) phy <- hclust2phylog(hc) plot(phy, clabel.l = 0.75, clabel.n = 0.6, f = 0.75) par(mfrow = c(1,1)) row.names(USArrests) names(phy$leaves) #WARNING not the same for two reasons row.names(USArrests) <- gsub(" ","_",row.names(USArrests)) row.names(USArrests) names(phy$leaves) #WARNING not the same for one reason USArrests <- USArrests[names(phy$leaves),] row.names(USArrests) names(phy$leaves) #the same table.phylog(data.frame(scalewt(USArrests)), phy, csi = 2.5, clabel.r = 0.75, f = 0.7) #taxo2phylog data(taxo.eg) tax <- as.taxo(taxo.eg[[1]]) tax.phy <- taxo2phylog(as.taxo(taxo.eg[[1]])) par(mfrow = c(1,2)) plot(tax.phy, clabel.l = 1.25, clabel.n = 1.25, f = 0.75) plot(taxo2phylog(as.taxo(taxo.eg[[1]][sample(15),])), clabel.l = 1.25, clabel.n = 1.25, f = 0.75) par(mfrow=c(1,1)) plot(taxo2phylog(as.taxo(taxo.eg[[2]])), clabel.l = 1, clabel.n = 0.75, f = 0.65) }} \keyword{manip} ade4/man/atya.Rd0000644000176200001440000000272413177053474013107 0ustar liggesusers\name{atya} \alias{atya} \docType{data} \title{Genetic variability of Cacadors} \description{ This data set contains information about genetic variability of \emph{Atya innocous} and \emph{Atya scabra} in Guadeloupe (France). } \usage{data(atya)} \format{\code{atya} is a list with the following components: \describe{ \item{xy}{a data frame with the coordinates of the 31 sites} \item{gen}{a data frame with 22 variables collected on 31 sites} \item{neig}{an object of class \code{neig}} \item{nb}{a neighborhood object (class \code{nb} defined in package \code{spdep})} }} \source{ Fievet, E., Eppe, F. and Dolédec, S. (2001) Etude de la variabilité morphométrique et génétique des populations de Cacadors (\emph{Atya innocous} et \emph{Atya scabra}) de l'île de Basse-Terre. Direction Régionale de L'Environnement Guadeloupe, Laboratoire des hydrosystèmes fluviaux, Université Lyon 1. } \examples{ \dontrun{ data(atya) if(requireNamespace("pixmap", quietly = TRUE)) { atya.digi <- pixmap::read.pnm(system.file("pictures/atyadigi.pnm", package = "ade4")) atya.carto <- pixmap::read.pnm(system.file("pictures/atyacarto.pnm", package = "ade4")) par(mfrow = c(1, 2)) pixmap:::plot(atya.digi) pixmap:::plot(atya.carto) points(atya$xy, pch = 20, cex = 2) } if(requireNamespace("spdep", quietly = TRUE)) { plot(neig2nb(atya$neig), atya$xy, col = "red", add = TRUE, lwd = 2) par(mfrow = c(1,1)) } }} \keyword{datasets}ade4/man/dudi.nsc.Rd0000644000176200001440000000232713021372261013641 0ustar liggesusers\name{dudi.nsc} \alias{dudi.nsc} \title{Non symmetric correspondence analysis} \description{ performs a non symmetric correspondence analysis. } \usage{ dudi.nsc(df, scannf = TRUE, nf = 2) } \arguments{ \item{df}{a data frame containing positive or null values} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} } \value{ Returns a list of class \code{nsc} and \code{dudi} (see \code{\link{dudi}}) containing also \item{N}{sum of the values of the initial table} } \references{Kroonenberg, P. M., and Lombardo R. (1999) Nonsymmetric correspondence analysis: a tool for analysing contingency tables with a dependence structure. \emph{Multivariate Behavioral Research}, \bold{34}, 367--396. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(housetasks) nsc1 <- dudi.nsc(housetasks, scan = FALSE) if(adegraphicsLoaded()) { g1 <- s.label(nsc1$c1, plab.cex = 1.25) g2 <- s.arrow(nsc1$li, add = TRUE, plab.cex = 0.75) } else { s.label(nsc1$c1, clab = 1.25) s.arrow(nsc1$li, add.pl = TRUE, clab = 0.75) # see ref p.383 }} \keyword{multivariate} ade4/man/triangle.plot.Rd0000644000176200001440000000776312576021756014743 0ustar liggesusers\name{triangle.plot} \alias{triangle.plot} \alias{triangle.biplot} \alias{triangle.param} \alias{triangle.posipoint} \alias{add.position.triangle} \title{Triangular Plotting} \description{ Graphs for a dataframe with 3 columns of positive or null values\cr \code{triangle.plot} is a scatterplot\cr \code{triangle.biplot} is a paired scatterplots\cr \code{triangle.posipoint}, \code{triangle.param}, \code{add.position.triangle} are utilitaries functions. } \usage{ triangle.plot(ta, label = as.character(1:nrow(ta)), clabel = 0, cpoint = 1, draw.line = TRUE, addaxes = FALSE, addmean = FALSE, labeltriangle = TRUE, sub = "", csub = 0, possub = "topright", show.position = TRUE, scale = TRUE, min3 = NULL, max3 = NULL, box = FALSE) triangle.biplot (ta1, ta2, label = as.character(1:nrow(ta1)), draw.line = TRUE, show.position = TRUE, scale = TRUE) } \arguments{ \item{ta, ta1, ta2,}{data frame with three columns, will be transformed in \bold{percentages} by rows} \item{label}{a vector of strings of characters for the point labels} \item{clabel}{if not NULL, a character size for the labels, used with \code{par("cex")*clabel}} \item{cpoint}{a character size for plotting the points, used with \code{par("cex")*cpoint}. If zero, no points are drawn} \item{draw.line}{a logical value indicating whether the lines into the triangle should be drawn} \item{addaxes}{a logical value indicating whether the principal axes should be drawn} \item{addmean}{a logical value indicating whether the mean should be plotted} \item{labeltriangle}{a logical value indicating whether the variable names should be wrote} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{show.position}{a logical value indicating whether the used triangle should be shown in the complete one} \item{scale}{a logical value indicating whether the smaller equilateral triangle containing the plot should be used} \item{min3}{If scale is FALSE, a vector of three values for the minima e.g. c(0.1,0.1,0.1) can be used} \item{max3}{If scale is FALSE a vector of three values for the maxima e.g. c(0.9,0.9,0.9) can be used} \item{box}{a logical value indicating whether a box around the current plot should be drawn} } \value{ \code{triangle.plot} returns an invisible matrix containing the coordinates used for the plot. The graph can be supplemented in various ways. } \author{ Daniel Chessel } \examples{ data(euro123) tot <- rbind.data.frame(euro123$in78, euro123$in86, euro123$in97) row.names(tot) <- paste(row.names(euro123$in78), rep(c(1, 2, 3), rep(12, 3)), sep = "") triangle.plot(tot, label = row.names(tot), clab = 1) par(mfrow = c(2, 2)) triangle.plot(euro123$in78, clab = 0, cpoi = 2, addmean = TRUE, show = FALSE) triangle.plot(euro123$in86, label = row.names(euro123$in78), clab = 0.8) triangle.biplot(euro123$in78, euro123$in86) triangle.plot(rbind.data.frame(euro123$in78, euro123$in86), clab = 1, addaxes = TRUE, sub = "Principal axis", csub = 2, possub = "topright") triangle.plot(euro123[[1]], min3 = c(0, 0.2, 0.3), max3 = c(0.5, 0.7, 0.8), clab = 1, label = row.names(euro123[[1]]), addax = TRUE) triangle.plot(euro123[[2]], min3 = c(0, 0.2, 0.3), max3 = c(0.5, 0.7, 0.8), clab = 1, label = row.names(euro123[[1]]), addax = TRUE) triangle.plot(euro123[[3]], min3 = c(0, 0.2, 0.3), max3 = c(0.5, 0.7, 0.8), clab = 1, label = row.names(euro123[[1]]), addax = TRUE) triangle.plot(rbind.data.frame(euro123[[1]], euro123[[2]], euro123[[3]])) par(mfrow = c(1, 1)) wtriangleplot <- cbind.data.frame(a = runif(100), b = runif(100), c = runif(100, 4, 5)) wtriangleplot <- triangle.plot(wtriangleplot) points(wtriangleplot, col = "blue", cex = 2) wtriangleplot <- colMeans(wtriangleplot) points(wtriangleplot[1], wtriangleplot[2], pch = 20, cex = 3, col = "red") rm(wtriangleplot) } \keyword{hplot} ade4/man/arrival.Rd0000644000176200001440000000152013102043107013556 0ustar liggesusers\name{arrival} \alias{arrival} \docType{data} \title{Arrivals at an intensive care unit} \description{ This data set gives arrival times of 254 patients at an intensive care unit during one day. } \usage{data(arrival)} \format{ \code{arrival} is a list containing the 2 following objects : \describe{ \item{times}{is a vector giving the arrival times in the form HH:MM} \item{hours}{is a vector giving the number of arrivals per hour for the day considered} }} \source{ Data taken from the Oriana software developped by Warren L. Kovach \email{sales@kovcomp.com} starting from \url{http://www.kovcomp.com/oriana/index.html}. } \references{ Fisher, N. I. (1993) \emph{Statistical Analysis of Circular Data}. Cambridge University Press. } \examples{ data(arrival) dotcircle(arrival$hours, pi/2 + pi/12) } \keyword{datasets} \keyword{chron} ade4/man/carniherbi49.Rd0000644000176200001440000000405013021372261014410 0ustar liggesusers\name{carniherbi49} \alias{carniherbi49} \docType{data} \title{Taxonomy, phylogenies and quantitative traits of carnivora and herbivora} \description{ This data set describes the taxonomic and phylogenetic relationships of 49 carnivora and herbivora species as reported by Garland and Janis (1993) and Garland et al. (1993). It also gives seven traits corresponding to these 49 species. } \usage{data(carniherbi49)} \format{ \code{carniherbi49} is a list containing the 5 following objects : \describe{ \item{taxo}{is a data frame with 49 species and 2 columns : 'fam', a factor family with 14 levels and 'ord', a factor order with 3 levels.} \item{tre1}{is a character string giving the phylogenetic tree in Newick format as reported by Garland et al. (1993).} \item{tre2}{is a character string giving the phylogenetic tree in Newick format as reported by Garland and Janis (1993).} \item{tab1}{is a data frame with 49 species and 2 traits: 'bodymass' (body mass (kg)) and 'homerange' (home range (km)).} \item{tab2}{is a data frame with 49 species and 5 traits: 'clade' (dietary with two levels \code{Carnivore} and \code{Herbivore}), 'runningspeed' (maximal sprint running speed (km/h)), 'bodymass' (body mass (kg)), 'hindlength' (hind limb length (cm)) and 'mtfratio' (metatarsal/femur ratio).} }} \source{ Garland, T., Dickerman, A. W., Janis, C. M. and Jones, J. A. (1993) Phylogenetic analysis of covariance by computer simulation. \emph{Systematics Biology}, \bold{42}, 265--292. Garland, T. J. and Janis, C.M. (1993) Does metatarsal-femur ratio predict maximal running speed in cursorial mammals? \emph{Journal of Zoology}, \bold{229}, 133--151. } \examples{ \dontrun{ data(carniherbi49) par(mfrow=c(1,3)) plot(newick2phylog(carniherbi49$tre1), clabel.leaves = 0, f.phylog = 2, sub ="article 1") plot(newick2phylog(carniherbi49$tre2), clabel.leaves = 0, f.phylog = 2, sub = "article 2") taxo <- as.taxo(carniherbi49$taxo) plot(taxo2phylog(taxo), clabel.nodes = 1.2, clabel.leaves = 1.2) par(mfrow = c(1,1)) }} \keyword{datasets} ade4/man/lingoes.Rd0000644000176200001440000000257613021372261013600 0ustar liggesusers\name{lingoes} \alias{lingoes} \title{Transformation of a Distance Matrix for becoming Euclidean} \description{ transforms a distance matrix in a Euclidean one. } \usage{ lingoes(distmat, print = FALSE, tol = 1e-07, cor.zero = TRUE) } \arguments{ \item{distmat}{an object of class \code{dist}} \item{print}{if TRUE, prints the eigenvalues of the matrix} \item{tol}{a tolerance threshold for zero} \item{cor.zero}{if TRUE, zero distances are not modified} } \value{ returns an object of class \code{dist} with a Euclidean distance } \references{Lingoes, J.C. (1971) Some boundary conditions for a monotone analysis of symmetric matrices. \emph{Psychometrika}, \bold{36}, 195--203. } \details{ The function uses the smaller positive constant k which transforms the matrix of \eqn{\sqrt{d_{ij}^2 + 2 \ast k}}{sqrt(dij² + 2*k)} in an Euclidean one } \author{ Daniel Chessel \cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \examples{ data(capitales) d0 <- capitales$dist is.euclid(d0) # FALSE d1 <- lingoes(d0, TRUE) # Lingoes constant = 2120982 is.euclid(d1) # TRUE plot(d0, d1) x0 <- sort(unclass(d0)) lines(x0, sqrt(x0^2 + 2 * 2120982), lwd = 3) is.euclid(sqrt(d0^2 + 2 * 2120981), tol = 1e-10) # FALSE is.euclid(sqrt(d0^2 + 2 * 2120982), tol = 1e-10) # FALSE is.euclid(sqrt(d0^2 + 2 * 2120983), tol = 1e-10) # TRUE the smaller constant } \keyword{array} \keyword{multivariate} ade4/man/meau.Rd0000644000176200001440000000413413040362670013063 0ustar liggesusers\name{meau} \alias{meau} \docType{data} \title{Ecological Data : sites-variables, sites-species, where and when} \description{ This data set contains information about sites, environmental variables and Ephemeroptera Species. } \usage{data(meau)} \format{ \code{meau} is a list of 3 components. \describe{ \item{env}{is a data frame with 24 sites and 10 physicochemical variables.} \item{fau}{is a data frame with 24 sites and 13 Ephemeroptera Species.} \item{design}{is a data frame with 24 sites and 2 factors. \itemize{ \item \code{season}: is a factor with 4 levels = seasons. \item \code{site}: is a factor with 6 levels = sites. } } } } \details{Data set equivalents to \code{\link{meaudret}}, except that one site (6) along the Bourne (a Meaudret affluent) and one physico chemical variable - the oxygen concentration were added. } \source{ Pegaz-Maucet, D. (1980) \emph{Impact d'une perturbation d'origine organique sur la dérive des macro-invertébrés benthiques d'un cours d'eau. Comparaison avec le benthos}. Thèse de 3ème cycle, Université Lyon 1, 130 p. Thioulouse, J., Simier, M. and Chessel, D. (2004) Simultaneous analysis of a sequence of paired ecological tables. \emph{Ecology}, \bold{85}, 1, 272--283. } \examples{ data(meau) pca1 <- dudi.pca(meau$env, scan = FALSE, nf = 4) pca2 <- bca(pca1, meau$design$season, scan = FALSE, nf = 2) if(adegraphicsLoaded()) { g1 <- s.class(pca1$li, meau$design$season, psub.text = "Principal Component Analysis", plot = FALSE) g2 <- s.class(pca2$ls, meau$design$season, psub.text = "Between seasons Principal Component Analysis", plot = FALSE) g3 <- s.corcircle(pca1$co, plot = FALSE) g4 <- s.corcircle(pca2$as, plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) s.class(pca1$li, meau$design$season, sub = "Principal Component Analysis") s.class(pca2$ls, meau$design$season, sub = "Between seasons Principal Component Analysis") s.corcircle(pca1$co) s.corcircle(pca2$as) par(mfrow = c(1, 1)) }} \keyword{datasets} ade4/man/kplot.mcoa.Rd0000644000176200001440000000351112576021756014213 0ustar liggesusers\name{kplot.mcoa} \alias{kplot.mcoa} \title{Multiple Graphs for a Multiple Co-inertia Analysis} \description{ performs high level plots of a Multiple Co-inertia Analysis, using an object of class \code{mcoa}. } \usage{ \method{kplot}{mcoa}(object, xax = 1, yax = 2, which.tab = 1:nrow(object$cov2), mfrow = NULL, option = c("points", "axis", "columns"), clab = 1, cpoint = 2, csub = 2, possub = "bottomright",\dots) } \arguments{ \item{object}{an object of class \code{mcoa}} \item{xax, yax}{the numbers of the x-axis and the y-axis} \item{which.tab}{a numeric vector containing the numbers of the tables to analyse} \item{mfrow}{a vector of the form 'c(nr,nc)', otherwise computed by as special own function \code{n2mfrow}} \item{option}{a string of characters for the drawing option \describe{ \item{"points"}{plot of the projected scattergram onto the co-inertia axes} \item{"axis"}{projections of inertia axes onto the co-inertia axes.} \item{"columns"}{projections of variables onto the synthetic variables planes.} } } \item{clab}{a character size for the labels} \item{cpoint}{a character size for plotting the points, used with \code{par("cex")}*cpoint. If zero, no points are drawn.} \item{csub}{a character size for the sub-titles, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{\dots}{further arguments passed to or from other methods} } \author{Daniel Chessel } \examples{ data(friday87) w1 <- data.frame(scale(friday87$fau, scal = FALSE)) w2 <- ktab.data.frame(w1, friday87$fau.blo, tabnames = friday87$tab.names) mcoa1 <- mcoa(w2, "lambda1", scan = FALSE) kplot(mcoa1, option = "axis") kplot(mcoa1) kplot(mcoa1, option = "columns") } \keyword{multivariate} \keyword{hplot} ade4/man/sco.distri.Rd0000644000176200001440000000515312576021756014231 0ustar liggesusers\name{sco.distri} \alias{sco.distri} \title{Representation by mean- standard deviation of a set of weight distributions on a numeric score} \description{ represents the mean- standard deviation of a set of weight distributions on a numeric score. } \usage{ sco.distri(score, df, y.rank = TRUE, csize = 1, labels = names(df), clabel = 1, xlim = NULL, grid = TRUE, cgrid = 0.75, include.origin = TRUE, origin = 0, sub = NULL, csub = 1) } \arguments{ \item{score}{a numeric vector} \item{df}{a data frame with only positive or null values} \item{y.rank}{a logical value indicating whether the means should be classified in ascending order} \item{csize}{an integer indicating the size segment} \item{labels}{a vector of strings of characters for the labels of the variables} \item{clabel}{if not NULL, a character size for the labels, used with \code{par("cex")*clabel}} \item{xlim}{the ranges to be encompassed by the x axis, if NULL they are computed} \item{grid}{a logical value indicating whether the scale vertical lines should be drawn} \item{cgrid}{a character size, parameter used with \code{par("cex")*cgrid} to indicate the mesh of the scale} \item{include.origin}{a logical value indicating whether the point "origin" should be belonged to the graph space} \item{origin}{the fixed point in the graph space, for example c(0,0) the origin axes} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} } \value{ returns an invisible data.frame with means and variances } \author{Daniel Chessel} \examples{ if(!adegraphicsLoaded()) { w <- seq(-1, 1, le = 200) distri <- data.frame(lapply(1:50, function(x) sample((200:1)) * ((w >= (- x / 50)) & (w <= x / 50)))) names(distri) <- paste("w", 1:50, sep = "") par(mfrow = c(1, 2)) sco.distri(w, distri, csi = 1.5) sco.distri(w, distri, y.rank = FALSE, csi = 1.5) par(mfrow = c(1, 1)) data(rpjdl) coa2 <- dudi.coa(rpjdl$fau, FALSE) sco.distri(coa2$li[, 1], rpjdl$fau, lab = rpjdl$frlab, clab = 0.8) data(doubs) par(mfrow = c(2, 2)) poi.coa <- dudi.coa(doubs$fish, scann = FALSE) sco.distri(poi.coa$l1[, 1], doubs$fish) poi.nsc <- dudi.nsc(doubs$fish, scann = FALSE) sco.distri(poi.nsc$l1[, 1], doubs$fish) s.label(poi.coa$l1) s.label(poi.nsc$l1) data(rpjdl) fau.coa <- dudi.coa(rpjdl$fau, scann = FALSE) sco.distri(fau.coa$l1[,1], rpjdl$fau) fau.nsc <- dudi.nsc(rpjdl$fau, scann = FALSE) sco.distri(fau.nsc$l1[,1], rpjdl$fau) s.label(fau.coa$l1) s.label(fau.nsc$l1) par(mfrow = c(1, 1)) } } \keyword{multivariate} \keyword{hplot} ade4/man/krandtest.Rd0000644000176200001440000000475613544647657014171 0ustar liggesusers\name{krandtest} \alias{krandtest} \alias{plot.krandtest} \alias{print.krandtest} \alias{as.krandtest} \alias{[.krandtest} \alias{[[.krandtest} \title{Class of the Permutation Tests (in C).} \description{ Plot, print and extract permutation tests. Objects of class \code{'krandtest'} are lists. } \usage{ as.krandtest(sim, obs, alter = "greater", call = match.call(), names = colnames(sim), p.adjust.method = "none", output = c("light", "full")) \method{plot}{krandtest}(x, mfrow = NULL, nclass = 10, main.title = x$names, ...) \method{print}{krandtest}(x, ...) \method{[}{krandtest}(x, i) \method{[[}{krandtest}(x, i) } \arguments{ \item{sim}{a matrix or data.frame of simulated values (repetitions as rows, number of tests as columns} \item{obs}{a numeric vector of observed values for each test} \item{alter}{a vector of character specifying the alternative hypothesis for each test. Each element must be one of "greater" (default), "less" or "two-sided". The length must be equal to the length of the vector obs, values are recycled if shorter.} \item{call}{a call order} \item{names}{a vector of names for tests} \item{p.adjust.method}{a string indicating a method for multiple adjustment, see \code{p.adjust.methods} for possible choices.} \item{output}{a character string specifying if all simulations should be stored (\code{"full"}). This was the default until \code{ade4} 1.7-5. Now, by default (\code{"light"}), only the distribution of simulated values is stored in element \code{plot} as produced by the \code{hist} function.} \item{x}{an object of class \code{'krandtest'}} \item{mfrow}{a vector of the form 'c(nr,nc)', otherwise computed by as special own function \code{n2mfrow}} \item{nclass}{a number of intervals for the histogram. Ignored if object output is \code{"light"}} \item{main.title}{a string of character for the main title} \item{\dots}{further arguments passed to or from other methods} \item{i}{numeric indices specifying elements to extract} } \value{ \code{plot.krandtest} draws the \emph{p} simulated values histograms and the position of the observed value. \code{[.krandtest} returns a \code{krandtest} object and \code{[[.krandtest} returns a \code{randtest} object. } \author{Daniel Chessel and Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \seealso{\code{\link{randtest}}} \examples{ wkrandtest <- as.krandtest(obs = c(0, 1.2, 2.4, 3.4, 5.4, 20.4), sim = matrix(rnorm(6*200), 200, 6)) wkrandtest plot(wkrandtest) wkrandtest[c(1, 4, 6)] wkrandtest[[1]] } \keyword{methods} ade4/man/ours.Rd0000644000176200001440000000640213021372261013120 0ustar liggesusers\name{ours} \alias{ours} \docType{data} \title{A table of Qualitative Variables} \usage{data(ours)} \description{ The \code{ours} (bears) data frame has 38 rows, areas of the "Inventaire National Forestier", and 10 columns. } \format{ This data frame contains the following columns: \enumerate{ \item altit: importance of the altitudinal area inhabited by bears, a factor with levels: \itemize{ \item \code{1} less than 50\% of the area between 800 and 2000 meters \item \code{2} between 50 and 70\% \item \code{3} more than 70\%} \item deniv: importance of the average variation in level by square of 50 km2, a factor with levels: \itemize{ \item \code{1} less than 700m \item \code{2} between 700 and 900 m \item \code{3} more than 900 m } \item cloiso: partitioning of the massif, a factor with levels: \itemize{ \item \code{1} a great valley or a ridge isolates at least a quarter of the massif \item \code{2} less than a quarter of the massif is isolated \item \code{3} the massif has no split} \item domain: importance of the national forests on contact with the massif, a factor with levels: \itemize{ \item \code{1} less than 400 km2 \item \code{2} between 400 and 1000 km2 \item \code{3} more than 1000 km2 } \item boise: rate of afforestation, a factor with levels: \itemize{ \item \code{1} less than 30\% \item \code{2} between 30 and 50\% \item \code{3} more than 50\% } \item hetra: importance of plantations and mixed forests, a factor with levels: \itemize{ \item \code{1} less than 5\% \item \code{2} between 5 and 10\% \item \code{3} more than 10\% of the massif } \item favor: importance of favorable forests, plantations, mixed forests, fir plantations, a factor with levels: \itemize{ \item \code{1} less than 5\% \item \code{2} between 5 and 10\% \item \code{3} more than 10\% of the massif } \item inexp: importance of unworked forests, a factor with levels: \itemize{ \item \code{1} less than 4\% \item \code{2} between 4 and 8\% \item \code{3} more than 8\% of the total area } \item citat: presence of the bear before its disappearance, a factor with levels: \itemize{ \item \code{1} no quotation since 1840 \item \code{2} 1 to 3 quotations before 1900 and none after \item \code{3} 4 quotations before 1900 and none after \item \code{4} at least 4 quotations before 1900 and at least 1 quotation between 1900 and 1940 } \item depart: district, a factor with levels: \itemize{ \item \code{AHP} Alpes-de-Haute-Provence \item \code{AM} Alpes-Maritimes \item \code{D} Drôme \item \code{HP} Hautes-Alpes \item \code{HS} Haute-Savoie \item \code{I} Isère \item \code{S} Savoie} } } \source{ Erome, G. (1989) \emph{L'ours brun dans les Alpes françaises. Historique de sa disparition}. Centre Ornithologique Rhône-Alpes, Villeurbanne. 120 p. } \examples{ data(ours) if(adegraphicsLoaded()) { s1d.boxplot(dudi.acm(ours, scan = FALSE)$l1[, 1], ours) } else { boxplot(dudi.acm(ours, scan = FALSE)) } } \keyword{datasets} ade4/man/scatter.Rd0000644000176200001440000000322513021372261013575 0ustar liggesusers\name{scatter} \alias{scatter} \alias{biplot.dudi} \alias{screeplot.dudi} \title{Graphical representation of the outputs of a multivariate analysis} \description{ \code{scatter} is a generic function that has methods for the classes \code{coa}, \code{dudi}, \code{fca}, \code{acm} and \code{pco}. It plots the outputs of a multivariate analysis by representing simultaneously the rows and the colums of the original table (biplot). The function \code{biplot} returns exactly the same representation. \cr The function \code{screeplot} represents the amount of inertia (usually variance) associated to each dimension. } \usage{ scatter(x, \dots) \method{biplot}{dudi}(x, \dots) \method{screeplot}{dudi}(x, npcs = length(x$eig), type = c("barplot", "lines"), main = deparse(substitute(x)), col = c(rep("black", x$nf), rep("grey", npcs - x$nf)), \dots) } \arguments{ \item{x}{an object of the class \code{dudi} containing the outputs of a multivariate analysis} \item{npcs}{the number of components to be plotted} \item{type}{the type of plot} \item{main}{the title of the plot} \item{col}{a vector of colors} \item{\dots}{further arguments passed to or from other methods} } \seealso{\code{\link{s.arrow}}, \code{\link{s.chull}}, \code{\link{s.class}}, \code{\link{s.corcircle}}, \code{\link{s.distri}}, \code{\link{s.label}}, \code{\link{s.match}}, \code{\link{s.traject}}, \code{\link{s.value}}, \code{\link{add.scatter}} } \author{Daniel Chessel \cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr}} \examples{ data(rpjdl) rpjdl.coa <- dudi.coa(rpjdl$fau, scannf = FALSE, nf = 4) screeplot(rpjdl.coa) biplot(rpjdl.coa) } \keyword{multivariate} \keyword{hplot} ade4/man/ichtyo.Rd0000644000176200001440000000232013021372261013422 0ustar liggesusers\name{ichtyo} \alias{ichtyo} \docType{data} \title{Point sampling of fish community} \description{ This data set gives informations between a faunistic array, the total number of sampling points made at each sampling occasion and the year of the sampling occasion. } \usage{data(ichtyo)} \format{ \code{ichtyo} is a list of 3 components. \describe{ \item{tab}{is a faunistic array with 9 columns and 32 rows.} \item{eff}{is a vector of the 32 sampling effort.} \item{dat}{is a factor where the levels are the 10 years of the sampling occasion.} } } \details{ The value \emph{n(i,j)} at the \emph{ith} row and the \emph{jth} column in \code{tab} corresponds to the number of sampling points of the \emph{ith} sampling occasion (in \code{eff}) that contains the \emph{jth} species. } \source{ Dolédec, S., Chessel, D. and Olivier, J. M. (1995) L'analyse des correspondances décentrée: application aux peuplements ichtyologiques du haut-Rhône. \emph{Bulletin Français de la Pêche et de la Pisciculture}, \bold{336}, 29--40. } \examples{ data(ichtyo) dudi1 <- dudi.dec(ichtyo$tab, ichtyo$eff, scannf = FALSE) s.class(dudi1$li, ichtyo$dat, wt = ichtyo$eff / sum(ichtyo$eff)) } \keyword{datasets} ade4/man/suprow.Rd0000644000176200001440000000600713252235512013473 0ustar liggesusers\name{suprow} \alias{suprow} \alias{suprow.coa} \alias{suprow.pca} \alias{suprow.dudi} \alias{suprow.fca} \alias{predict.dudi} \alias{suprow.acm} \alias{suprow.mix} \title{Projections of Supplementary Rows} \description{ This function performs a projection of supplementary rows (i.e. supplementary individuals). } \usage{ \method{suprow}{coa}(x, Xsup, \dots) \method{suprow}{dudi}(x, Xsup, \dots) \method{predict}{dudi}(object, newdata, \dots) \method{suprow}{pca}(x, Xsup, \dots) \method{suprow}{acm}(x, Xsup, \dots) \method{suprow}{mix}(x, Xsup, \dots) \method{suprow}{fca}(x, Xsup, \dots) } \arguments{ \item{x, object}{an object of class \code{dudi}} \item{Xsup, newdata}{an array with the supplementary rows} \item{\dots}{further arguments passed to or from other methods} } \details{ If \code{suprow.dudi} is used, the column vectors of Xsup are projected without prior modifications onto the principal components of dudi with the scalar product associated to the row weightings of dudi. } \value{ \code{predict} returns a data frame containing the coordinates of the supplementary rows. \code{suprow} returns a list with the transformed table \code{Xsup} in \code{tabsup} and the coordinates of the supplementary rows in \code{lisup}. } \references{ Gower, J. C. (1967) Multivariate analysis and multivariate geometry. \emph{The statistician}, \bold{17}, 13--28. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(euro123) par(mfrow = c(2, 2)) w <- euro123[[2]] dudi1 <- dudi.pca(w, scal = FALSE, scan = FALSE) if(adegraphicsLoaded()) { g11 <- s.arrow(dudi1$c1, psub.text = "Classical", psub.posi = "bottomright", plot = FALSE) g12 <- s.label(suprow(dudi1, w)$tabsup, plab.cex = 0.75, plot = FALSE) g1 <- superpose(g11, g12) g21 <- s.arrow(dudi1$c1, psub.text = "Without centring", psub.posi = "bottomright", plot = FALSE) g22 <- s.label(suprow(dudi1, w)$tabsup, plab.cex = 0.75, plot = FALSE) g2 <- superpose(g21, g22) g3 <- triangle.label(w, plab.cex = 0.75, label = row.names(w), adjust = FALSE, plot = FALSE) g4 <- triangle.label(w, plab.cex = 0.75, label = row.names(w), adjust = TRUE, plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { s.arrow(dudi1$c1, sub = "Classical", possub = "bottomright", csub = 2.5) s.label(suprow(dudi1, w), add.plot = TRUE, clab = 0.75) s.arrow(dudi1$c1, sub = "Without centring", possub = "bottomright", csub = 2.5) s.label(suprow(dudi1, w), clab = 0.75, add.plot = TRUE) triangle.plot(w, clab = 0.75, label = row.names(w), scal = FALSE) triangle.plot(w, clab = 0.75, label = row.names(w), scal = TRUE) } data(rpjdl) rpjdl.coa <- dudi.coa(rpjdl$fau, scann = FALSE, nf = 4) rpjdl.coa$li[1:3, ] suprow(rpjdl.coa,rpjdl$fau[1:3, ])$lisup #the same data(deug) deug.dudi <- dudi.pca(df = deug$tab, center = deug$cent, scale = FALSE, scannf = FALSE) suprow(deug.dudi, deug$tab[1:3, ])$lisup #the supplementary individuals are centered deug.dudi$li[1:3, ] # the same } \keyword{multivariate} ade4/man/dudi.coa.Rd0000644000176200001440000000273013021372261013616 0ustar liggesusers\name{dudi.coa} \alias{dudi.coa} \title{Correspondence Analysis} \description{ performs a correspondence analysis. } \usage{ dudi.coa(df, scannf = TRUE, nf = 2) } \arguments{ \item{df}{a data frame containing positive or null values} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} } \value{ returns a list of class \code{coa} and \code{dudi} (see \link{dudi}) containing \item{N}{the sum of all the values of the initial table} } \references{ Benzécri, J.P. and Coll. (1973) \emph{L'analyse des données. II L'analyse des correspondances}, Bordas, Paris. 1--620.\cr Greenacre, M. J. (1984) \emph{Theory and applications of correspondence analysis}, Academic Press, London. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(rpjdl) chisq.test(rpjdl$fau)$statistic rpjdl.coa <- dudi.coa(rpjdl$fau, scannf = FALSE, nf = 4) sum(rpjdl.coa$eig)*rpjdl.coa$N # the same if(adegraphicsLoaded()) { g1 <- s.label(rpjdl.coa$co, plab.cex = 0.6, lab = rpjdl$frlab, plot = FALSE) g2 <- s.label(rpjdl.coa$li, plab.cex = 0.6, plot = FALSE) cbindADEg(g1, g2, plot = TRUE) } else { par(mfrow = c(1,2)) s.label(rpjdl.coa$co, clab = 0.6, lab = rpjdl$frlab) s.label(rpjdl.coa$li, clab = 0.6) par(mfrow = c(1,1)) } data(bordeaux) db <- dudi.coa(bordeaux, scan = FALSE) db score(db) } \keyword{multivariate} ade4/man/gearymoran.Rd0000644000176200001440000000544313040362670014304 0ustar liggesusers\name{gearymoran} \alias{gearymoran} \title{Moran's I and Geary'c randomization tests for spatial and phylogenetic autocorrelation} \description{ This function performs Moran's I test using phylogenetic and spatial link matrix (binary or general). It uses neighbouring weights so Moran's I and Geary's c randomization tests are equivalent. } \usage{ gearymoran(bilis, X, nrepet = 999, alter=c("greater", "less", "two-sided")) } \arguments{ \item{bilis}{: a \emph{n} by \emph{n} link matrix where \emph{n} is the row number of X} \item{X}{: a data frame with continuous variables} \item{nrepet}{: number of random vectors for the randomization test} \item{alter}{a character string specifying the alternative hypothesis, must be one of "greater" (default), "less" or "two-sided"} } \details{ \code{bilis} is a squared symmetric matrix which terms are all positive or null. \code{bilis} is firstly transformed in frequency matrix A by dividing it by the total sum of data matrix : \deqn{a_{ij} = \frac{bilis_{ij}}{\sum_{i=1}^{n}\sum_{j=1}^{n}bilis_{ij}}}{a_ij = bilis_ij / (sum_i sum_j bilis_ij)} The neighbouring weights is defined by the matrix \eqn{D = diag(d_1,d_2, \ldots)} where \eqn{d_i = \sum_{j=1}^{n}bilis_{ij}}{d_i = sum_j bilis_ij}. For each vector x of the data frame X, the test is based on the Moran statistic \eqn{x^{t}Ax}{t(x)Ax} where x is D-centred. } \value{ Returns an object of class \code{krandtest} (randomization tests). } \references{ Cliff, A. D. and Ord, J. K. (1973) \emph{Spatial autocorrelation}, Pion, London. Thioulouse, J., Chessel, D. and Champely, S. (1995) Multivariate analysis of spatial patterns: a unified approach to local and global structures. \emph{Environmental and Ecological Statistics}, \bold{2}, 1--14. } \author{Sébastien Ollier \email{sebastien.ollier@u-psud.fr} \cr Daniel Chessel } \seealso{\code{\link[spdep]{moran.test}} and \code{\link[spdep]{geary.test}} for classical versions of Moran's test and Geary's one} \examples{ # a spatial example data(mafragh) tab0 <- (as.data.frame(scalewt(mafragh$env))) bilis0 <- neig2mat(mafragh$neig) gm0 <- gearymoran(bilis0, tab0, 999) gm0 plot(gm0, nclass = 20) \dontrun{ # a phylogenetic example data(mjrochet) mjr.phy <- newick2phylog(mjrochet$tre) mjr.tab <- log(mjrochet$tab) gearymoran(mjr.phy$Amat, mjr.tab) gearymoran(mjr.phy$Wmat, mjr.tab) if(adegraphicsLoaded()) { g1 <- table.value(mjr.phy$Wmat, ppoints.cex = 0.35, nclass = 5, axis.text = list(cex = 0), plot = FALSE) g2 <- table.value(mjr.phy$Amat, ppoints.cex = 0.35, nclass = 5, axis.text = list(cex = 0), plot = FALSE) G <- cbindADEg(g1, g2, plot = TRUE) } else { par(mfrow = c(1, 2)) table.value(mjr.phy$Wmat, csi = 0.25, clabel.r = 0) table.value(mjr.phy$Amat, csi = 0.35, clabel.r = 0) par(mfrow = c(1, 1)) } }} \keyword{spatial} \keyword{ts} ade4/man/neig.Rd0000644000176200001440000001155713177053561013074 0ustar liggesusers\name{neig} \alias{neig} \alias{neig.util.GtoL} \alias{neig.util.LtoG} \alias{print.neig} \alias{summary.neig} \alias{scores.neig} \alias{nb2neig} \alias{neig2nb} \alias{neig2mat} \title{Neighbourhood Graphs} \description{ \code{neig} creates objects of class \code{neig} with : \cr a list of edges\cr a binary square matrix\cr a list of vectors of neighbours\cr an integer (linear and circular graphs)\cr a data frame of polygons (area)\cr scores.neig returns the eigenvectors of neighbouring,\cr orthonormalized scores (null average, unit variance 1/n and null covariances) of maximal autocorrelation.\cr nb2neig returns an object of class \code{neig} using an object of class \code{nb} in the library 'spdep' neig2nb returns an object of class \code{nb} using an object of class \code{neig} neig2mat returns the incidence matrix between edges (1 = neighbour ; 0 = no neighbour) neig.util.GtoL and neig.util.LtoG are utilities. } \usage{ neig(list = NULL, mat01 = NULL, edges = NULL, n.line = NULL, n.circle = NULL, area = NULL) scores.neig (obj) \method{print}{neig}(x, \dots) \method{summary}{neig}(object, \dots) nb2neig (nb) neig2nb (neig) neig2mat (neig) } \arguments{ \item{list}{a list which each component gives the number of neighbours} \item{mat01}{a symmetric square matrix of 0-1 values} \item{edges}{a matrix of 2 columns with integer values giving a list of edges} \item{n.line}{the number of points for a linear plot} \item{n.circle}{the number of points for a circular plot} \item{area}{a data frame containing a polygon set (see \link{area.plot})} \item{nb}{an object of class 'nb'} \item{neig, x, obj, object}{an object of class 'neig'} \item{\dots}{further arguments passed to or from other methods} } \references{ Thioulouse, J., D. Chessel, and S. Champely. 1995. Multivariate analysis of spatial patterns: a unified approach to local and global structures. \emph{Environmental and Ecological Statistics}, \bold{2}, 1--14. } \author{Daniel Chessel } \examples{ if(!adegraphicsLoaded()) { if(requireNamespace("deldir", quietly = TRUE)) { data(mafragh) par(mfrow = c(2, 1)) provi <- deldir::deldir(mafragh$xy) provi.neig <- neig(edges = as.matrix(provi$delsgs[, 5:6])) s.label(mafragh$xy, neig = provi.neig, inc = FALSE, addax = FALSE, clab = 0, cnei = 2) dist <- apply(provi.neig, 1, function(x) sqrt(sum((mafragh$xy[x[1], ] - mafragh$xy[x[2], ]) ^ 2))) #hist(dist, nclass = 50) mafragh.neig <- neig(edges = provi.neig[dist < 50, ]) s.label(mafragh$xy, neig = mafragh.neig, inc = FALSE, addax = FALSE, clab = 0, cnei = 2) par(mfrow = c(1, 1)) data(irishdata) irish.neig <- neig(area = irishdata$area) summary(irish.neig) print(irish.neig) s.label(irishdata$xy, neig = irish.neig, cneig = 3, area = irishdata$area, clab = 0.8, inc = FALSE) irish.scores <- scores.neig(irish.neig) par(mfrow = c(2, 3)) for(i in 1:6) s.value(irishdata$xy, irish.scores[, i], inc = FALSE, grid = FALSE, addax = FALSE, neig = irish.neig, csi = 2, cleg = 0, sub = paste("Eigenvector ",i), csub = 2) par(mfrow = c(1, 1)) a.neig <- neig(n.circle = 16) a.scores <- scores.neig(a.neig) xy <- cbind.data.frame(cos((1:16) * pi / 8), sin((1:16) * pi / 8)) par(mfrow = c(4, 4)) for(i in 1:15) s.value(xy, a.scores[, i], neig = a.neig, csi = 3, cleg = 0) par(mfrow = c(1, 1)) a.neig <- neig(n.line = 28) a.scores <- scores.neig(a.neig) par(mfrow = c(7, 4)) par(mar = c(1.1, 2.1, 0.1, 0.1)) for(i in 1:27) barplot(a.scores[, i], col = grey(0.8)) par(mfrow = c(1, 1)) } if(requireNamespace("spdep", quietly = TRUE)) { data(mafragh) maf.rel <- spdep::relativeneigh(as.matrix(mafragh$xy)) maf.rel <- spdep::graph2nb(maf.rel) s.label(mafragh$xy, neig = neig(list = maf.rel), inc = FALSE, clab = 0, addax = FALSE, cne = 1, cpo = 2) par(mfrow = c(2, 2)) w <- matrix(runif(100), 50, 2) x.gab <- spdep::gabrielneigh(w) x.gab <- spdep::graph2nb(x.gab) s.label(data.frame(w), neig = neig(list = x.gab), inc = FALSE, clab = 0, addax = FALSE, cne = 1, cpo = 2, sub = "relative") x.rel <- spdep::relativeneigh(w) x.rel <- spdep::graph2nb(x.rel) s.label(data.frame(w), neig = neig(list = x.rel), inc = FALSE, clab = 0, addax = FALSE, cne = 1, cpo = 2, sub = "Gabriel") k1 <- spdep::knn2nb(spdep::knearneigh(w)) s.label(data.frame(w), neig = neig(list = k1), inc = FALSE, clab = 0, addax = FALSE, cne = 1, cpo = 2, sub = "k nearest neighbours") all.linked <- max(unlist(spdep::nbdists(k1, w))) z <- spdep::dnearneigh(w, 0, all.linked) s.label(data.frame(w), neig = neig(list = z), inc = FALSE, clab = 0, addax = FALSE, cne = 1, cpo = 2, sub = "Neighbourhood contiguity by distance") par(mfrow = c(1, 1)) } }} \keyword{utilities} ade4/man/pta.Rd0000644000176200001440000000641513021372261012720 0ustar liggesusers\name{pta} \alias{pta} \alias{print.pta} \alias{plot.pta} \title{Partial Triadic Analysis of a K-tables} \description{ performs a partial triadic analysis of a K-tables, using an object of class \code{ktab}. } \usage{ pta(X, scannf = TRUE, nf = 2) \method{plot}{pta}(x, xax = 1, yax = 2, option = 1:4, \dots) \method{print}{pta}(x, \dots) } \arguments{ \item{X}{an object of class \code{ktab} where the arrays have 1) the same dimensions 2) the same names for columns 3) the same column weightings} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} \item{x}{an object of class 'pta'} \item{xax, yax}{the numbers of the x-axis and the y-axis} \item{option}{an integer between 1 and 4, otherwise the 4 components of the plot are displayed} \item{\dots}{further arguments passed to or from other methods} } \value{ returns a list of class 'pta', sub-class of 'dudi' containing : \item{RV}{a matrix with the all RV coefficients} \item{RV.eig}{a numeric vector with the all eigenvalues (interstructure)} \item{RV.coo}{a data frame with the scores of the arrays} \item{tab.names}{a vector of characters with the array names} \item{nf}{an integer indicating the number of kept axes} \item{rank}{an integer indicating the rank of the studied matrix} \item{tabw}{a numeric vector with the array weights} \item{cw}{a numeric vector with the column weights} \item{lw}{a numeric vector with the row weights} \item{eig}{a numeric vector with the all eigenvalues (compromis)} \item{cos2}{a numeric vector with the \eqn{\cos^2}{cos²} between compromise and arrays} \item{tab}{a data frame with the modified array} \item{li}{a data frame with the row coordinates} \item{l1}{a data frame with the row normed scores} \item{co}{a data frame with the column coordinates} \item{c1}{a data frame with the column normed scores} \item{Tli}{a data frame with the row coordinates (each table)} \item{Tco}{a data frame with the column coordinates (each table)} \item{Tcomp}{a data frame with the principal components (each table)} \item{Tax}{a data frame with the principal axes (each table)} \item{TL}{a data frame with the factors for Tli} \item{TC}{a data frame with the factors for Tco} \item{T4}{a data frame with the factors for Tax and Tcomp} } \references{ Blanc, L., Chessel, D. and Dolédec, S. (1998) Etude de la stabilité temporelle des structures spatiales par Analyse d'une série de tableaux faunistiques totalement appariés. \emph{Bulletin Français de la Pêche et de la Pisciculture}, \bold{348}, 1--21.\cr\cr Thioulouse, J., and D. Chessel. 1987. Les analyses multi-tableaux en écologie factorielle. I De la typologie d'état à la typologie de fonctionnement par l'analyse triadique. \emph{Acta Oecologica, Oecologia Generalis}, \bold{8}, 463--480. } \author{ Pierre Bady \email{pierre.bady@univ-lyon1.fr}\cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(meaudret) wit1 <- withinpca(meaudret$env, meaudret$design$season, scan = FALSE, scal = "partial") kta1 <- ktab.within(wit1, colnames = rep(c("S1", "S2", "S3", "S4", "S5"), 4)) kta2 <- t(kta1) pta1 <- pta(kta2, scann = FALSE) pta1 plot(pta1) } \keyword{multivariate} ade4/man/toxicity.Rd0000644000176200001440000000251312576021756014021 0ustar liggesusers\name{toxicity} \alias{toxicity} \docType{data} \title{Homogeneous Table} \description{ This data set gives the toxicity of 7 molecules on 17 targets expressed in -log(mol/liter) } \usage{data(toxicity)} \format{ \code{toxicity} is a list of 3 components. \describe{ \item{tab}{is a data frame with 7 columns and 17 rows} \item{species}{is a vector of the names of the species in the 17 targets} \item{chemicals}{is a vector of the names of the 7 molecules} } } \source{ Devillers, J., Thioulouse, J. and Karcher W. (1993) Chemometrical Evaluation of Multispecies-Multichemical Data by Means of Graphical Techniques Combined with Multivariate Analyses. \emph{Ecotoxicology and Environnemental Safety}, \bold{26}, 333--345. } \examples{ data(toxicity) if(adegraphicsLoaded()) { table.image(toxicity$tab, labelsy = toxicity$species, labelsx = toxicity$chemicals, nclass = 7, ptable.margin = list(b = 5, l = 25, t = 25, r = 5), ptable.y.pos = "left", pgrid.draw = TRUE) table.value(toxicity$tab, labelsy = toxicity$species, labelsx = toxicity$chemicals, ptable.margin = list(b = 5, l = 5, t = 25, r = 26)) } else { table.paint(toxicity$tab, row.lab = toxicity$species, col.lab = toxicity$chemicals) table.value(toxicity$tab, row.lab = toxicity$species, col.lab = toxicity$chemicals) }} \keyword{datasets} ade4/man/randtest.between.Rd0000644000176200001440000000165612576021756015430 0ustar liggesusers\name{randtest.between} \alias{randtest.between} \title{Monte-Carlo Test on the between-groups inertia percentage (in C). } \description{ Performs a Monte-Carlo test on the between-groups inertia percentage. } \usage{ \method{randtest}{between}(xtest, nrepet = 999, \dots) } \arguments{ \item{xtest}{an object of class \code{between}} \item{nrepet}{the number of permutations} \item{\dots}{further arguments passed to or from other methods} } \value{ a list of the class \code{randtest} } \references{ Romesburg, H. C. (1985) Exploring, confirming and randomization tests. \emph{Computers and Geosciences}, \bold{11}, 19--37. } \author{Jean Thioulouse \email{Jean.Thioulouse@univ-lyon1.fr}} \examples{ data(meaudret) pca1 <- dudi.pca(meaudret$env, scan = FALSE, nf = 3) rand1 <- randtest(bca(pca1, meaudret$design$season, scan = FALSE), 99) rand1 plot(rand1, main = "Monte-Carlo test") } \keyword{multivariate} \keyword{nonparametric} ade4/man/score.Rd0000644000176200001440000000321712576021756013262 0ustar liggesusers\name{score} \alias{score} \alias{scoreutil.base} \title{Graphs for One Dimension} \description{ score is a generic function. It proposes methods for the objects 'coa', 'acm', 'mix', 'pca'.} \usage{ score(x, ...) scoreutil.base(y, xlim, grid, cgrid, include.origin, origin, sub, csub) } \arguments{ \item{x}{an object used to select a method} \item{\dots}{further arguments passed to or from other methods} \item{y}{a numeric vector} \item{xlim}{the ranges to be encompassed by the x axis, if NULL they are computed} \item{grid}{a logical value indicating whether the scale vertical lines should be drawn} \item{cgrid}{a character size, parameter used with \code{par("cex")*cgrid} to indicate the mesh of the scale} \item{include.origin}{a logical value indicating whether the point "origin" should be belonged to the graph space} \item{origin}{the fixed point in the graph space, for example 0 the origin axis} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} } \details{ \code{scoreutil.base} is a utility function - not for the user - to define the bottom of the layout of all \code{score}. } \seealso{\code{\link{sco.boxplot}}, \code{\link{sco.distri}}, \code{\link{sco.quant}} } \author{Daniel Chessel } \examples{ \dontrun{ par(mar = c(1, 1, 1, 1)) ade4:::scoreutil.base (runif(20, 3, 7), xlim = NULL, grid = TRUE, cgrid = 0.8, include.origin = TRUE, origin = 0, sub = "Uniform", csub = 1)} # returns the value of the user coordinate of the low line. # The user window id defined with c(0,1) in ordinate. # box() } \keyword{multivariate} \keyword{hplot} ade4/man/s.image.Rd0000644000176200001440000000663513040362670013467 0ustar liggesusers\name{s.image} \alias{s.image} \title{ Graph of a variable using image and contour } \description{ performs a scatterplot } \usage{ s.image(dfxy, z, xax = 1, yax = 2, span = 0.5, xlim = NULL, ylim = NULL, kgrid = 2, scale = TRUE, grid = FALSE, addaxes = FALSE, cgrid = 0, include.origin = FALSE, origin = c(0, 0), sub = "", csub = 1, possub = "topleft", neig = NULL, cneig = 1, image.plot = TRUE, contour.plot = TRUE, pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) } \arguments{ \item{dfxy}{ a data frame containing the two columns for the axes } \item{z}{ a vector of values on the \code{dfxy} rows } \item{xax}{ the column number of x in \code{dfxy} } \item{yax}{ the column number of y in \code{dfxy} } \item{span}{ the parameter alpha which controls the degree of smoothing } \item{xlim}{ the ranges to be encompassed by the x-axis, if NULL they are computed } \item{ylim}{ the ranges to be encompassed by the y-axis, if NULL they are computed } \item{kgrid}{ a number of points used to locally estimate the level line through the nodes of the grid, used by \code{kgrid*sqrt(length(z))} } \item{scale}{ if TRUE, data are centered and reduced } \item{grid}{ if TRUE, the background grid is traced } \item{addaxes}{ a logical value indicating whether the axes should be plotted } \item{cgrid}{ a character size, parameter used with par("cex")* \code{cgrid} to indicate the mesh of the grid } \item{include.origin}{ a logical value indicating whether the point "origin" should be belonged to the graph space } \item{origin}{ the fixed point in the graph space, for example c(0,0) the origin axes } \item{sub}{ a string of characters to be inserted as legend } \item{csub}{ a character size for the legend, used with \code{par("cex")*csub} } \item{possub}{ a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright") } \item{neig}{ an object of class \code{neig} } \item{cneig}{ a size for the neighbouring graph lines used with \code{par("lwd")*cneig} } \item{image.plot}{ if TRUE, the image is traced } \item{contour.plot}{ if TRUE, the contour lines are plotted } \item{pixmap}{ an object 'pixmap' displayed in the map background } \item{contour}{ a data frame with 4 columns to plot the contour of the map : each row gives a segment (x1,y1,x2,y2) } \item{area}{ a data frame of class 'area' to plot a set of surface units in contour } \item{add.plot}{ if TRUE uses the current graphics window } } \value{ The matched call. } \author{Daniel Chessel} \examples{ if(!adegraphicsLoaded()) { if(requireNamespace("splancs", quietly = TRUE)) { wxy <- data.frame(expand.grid(-3:3, -3:3)) names(wxy) <- c("x", "y") z <- (1 / sqrt(2)) * exp(-(wxy$x ^ 2 + wxy$y ^ 2) / 2) par(mfrow = c(2, 2)) s.value(wxy, z) s.image(wxy, z) s.image(wxy, z, kgrid = 5) s.image(wxy, z, kgrid = 15) par(mfrow = c(1, 1)) } \dontrun{ data(t3012) if(requireNamespace("splancs", quietly = TRUE)) { par(mfrow = c(3, 4)) for(k in 1:12) s.image(t3012$xy, scalewt(t3012$temp[, k]), kgrid = 3) par(mfrow = c(1, 1)) } data(elec88) if(requireNamespace("splancs", quietly = TRUE)) { par(mfrow = c(3,4)) for(k in 1:12) s.image(t3012$xy, scalewt(t3012$temp[, k]), kgrid = 3, sub = names(t3012$temp)[k], csub = 3, area = elec88$area) par(mfrow = c(1, 1)) } } }} \keyword{hplot} ade4/man/carni19.Rd0000644000176200001440000000172112576021756013413 0ustar liggesusers\name{carni19} \alias{carni19} \docType{data} \title{Phylogeny and quantative trait of carnivora} \description{ This data set describes the phylogeny of carnivora as reported by Diniz-Filho et al. (1998). It also gives the body mass of these 19 species. } \usage{data(carni19)} \format{ \code{carni19} is a list containing the 2 following objects : \describe{ \item{tre}{is a character string giving the phylogenetic tree in Newick format.} \item{bm}{is a numeric vector which values correspond to the body mass of the 19 species (log scale).} }} \source{ Diniz-Filho, J. A. F., de Sant'Ana, C.E.R. and Bini, L.M. (1998) An eigenvector method for estimating phylogenetic inertia. \emph{Evolution}, \bold{52}, 1247--1262. } \examples{ data(carni19) carni19.phy <- newick2phylog(carni19$tre) par(mfrow = c(1,2)) symbols.phylog(carni19.phy,carni19$bm-mean(carni19$bm)) dotchart.phylog(carni19.phy, carni19$bm, clabel.l=0.75) par(mfrow = c(1,1)) } \keyword{datasets} ade4/man/mantel.rtest.Rd0000644000176200001440000000172013050632301014542 0ustar liggesusers\name{mantel.rtest} \alias{mantel.rtest} \title{Mantel test (correlation between two distance matrices (in R).) } \description{ Performs a Mantel test between two distance matrices. } \usage{ mantel.rtest(m1, m2, nrepet = 99, ...) } \arguments{ \item{m1}{an object of class \code{dist}} \item{m2}{an object of class \code{dist}} \item{nrepet}{the number of permutations} \item{\dots}{further arguments passed to or from other methods} } \value{ an object of class \code{rtest} (randomization tests) } \references{Mantel, N. (1967) The detection of disease clustering and a generalized regression approach. \emph{Cancer Research}, \bold{27}, 209--220. } \author{ Daniel Chessel \cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \examples{ data(yanomama) gen <- quasieuclid(as.dist(yanomama$gen)) geo <- quasieuclid(as.dist(yanomama$geo)) plot(r1 <- mantel.rtest(geo,gen), main = "Mantel's test") r1 } \keyword{array} \keyword{nonparametric} ade4/man/banque.Rd0000644000176200001440000001164313021372261013406 0ustar liggesusers\name{banque} \alias{banque} \docType{data} \title{Table of Factors} \description{ \code{banque} gives the results of a bank survey onto 810 customers. } \usage{data(banque)} \format{ This data frame contains the following columns: \enumerate{ \item csp: "Socio-professional categories" a factor with levels \itemize{ \item \code{agric} Farmers \item \code{artis} Craftsmen, Shopkeepers, Company directors \item \code{cadsu} Executives and higher intellectual professions \item \code{inter} Intermediate professions \item \code{emplo} Other white-collar workers \item \code{ouvri} Manual workers \item \code{retra} Pensionners \item \code{inact} Non working population \item \code{etudi} Students} \item duree: "Time relations with the customer" a factor with levels \itemize{ \item \code{dm2} <2 years \item \code{d24} [2 years, 4 years[ \item \code{d48} [4 years, 8 years[ \item \code{d812} [8 years, 12 years[ \item \code{dp12} >= 12 years} \item oppo: "Stopped a check?" a factor with levels \itemize{ \item \code{non} no \item \code{oui} yes} \item age: "Customer's age" a factor with levels \itemize{ \item \code{ai25} [18 years, 25 years[ \item \code{ai35} [25 years, 35 years[ \item \code{ai45} [35 years, 45 years[ \item \code{ai55} [45 years, 55 years[ \item \code{ai75} [55 years, 75 years[} \item sexe: "Customer's gender" a factor with levels \itemize{ \item \code{hom} Male \item \code{fem} Female} \item interdit: "No checkbook allowed" a factor with levels \itemize{ \item \code{non} no \item \code{oui} yes } \item cableue: "Possess a bank card?" a factor with levels \itemize{ \item \code{non} no \item \code{oui} yes } \item assurvi: "Contrat of life insurance?" a factor with levels \itemize{ \item \code{non} no\cr \item \code{oui} yes} \item soldevu: "Balance of the current accounts" a factor with levels \itemize{ \item \code{p4} credit balance > 20000 \item \code{p3} credit balance 12000-20000 \item \code{p2} credit balance 4000-120000 \item \code{p1} credit balance >0-4000 \item \code{n1} debit balance 0-4000 \item \code{n2} debit balance >4000 } \item eparlog: "Savings and loan association account amount" a factor with levels \itemize{ \item \code{for} > 20000 \item \code{fai} >0 and <20000 \item \code{nul} nulle } \item eparliv: "Savings bank amount" a factor with levels \itemize{ \item \code{for} > 20000 \item \code{fai} >0 and <20000 \item \code{nul} nulle } \item credhab: "Home loan owner" a factor with levels \itemize{ \item \code{non} no \item \code{oui} yes } \item credcon: "Consumer credit amount" a factor with levels \itemize{ \item \code{nul} none \item \code{fai} >0 and <20000 \item \code{for} > 20000 } \item versesp: "Check deposits" a factor with levels \itemize{ \item \code{oui} yes \item \code{non} no } \item retresp: "Cash withdrawals" a factor with levels \itemize{ \item \code{fai} < 2000 \item \code{moy} 2000-5000 \item \code{for} > 5000 } \item remiche: "Endorsed checks amount" a factor with levels \itemize{ \item \code{for} >10000 \item \code{moy} 10000-5000 \item \code{fai} 1-5000 \item \code{nul} none } \item preltre: "Treasury Department tax deductions" a factor with levels \itemize{ \item \code{nul} none \item \code{fai} <1000 \item \code{moy} >1000 } \item prelfin: "Financial institution deductions" a factor with levels \itemize{ \item \code{nul} none \item \code{fai} <1000 \item \code{moy} >1000 } \item viredeb: "Debit transfer amount" a factor with levels \itemize{ \item \code{nul} none \item \code{fai} <2500 \item \code{moy} 2500-5000 \item \code{for} >5000} \item virecre: "Credit transfer amount" a factor with levels \itemize{ \item \code{for} >10000 \item \code{moy} 10000-5000 \item \code{fai} <5000 \item \code{nul} aucun} \item porttit: "Securities portfolio estimations" a factor with levels \itemize{ \item \code{nul} none \item \code{fai} < 20000 \item \code{moy} 20000-100000 \item \code{for} >100000} } } \source{ anonymous } \examples{ data(banque) banque.acm <- dudi.acm(banque, scannf = FALSE, nf = 3) apply(banque.acm$cr, 2, mean) banque.acm$eig[1:banque.acm$nf] # the same thing if(adegraphicsLoaded()) { g <- s.arrow(banque.acm$c1, plabels.cex = 0.75) } else { s.arrow(banque.acm$c1, clab = 0.75) }} \keyword{datasets} ade4/man/mafragh.Rd0000644000176200001440000001107213177053533013546 0ustar liggesusers\name{mafragh} \alias{mafragh} \docType{data} \title{Phyto-Ecological Survey} \description{ This data set gives environmental and spatial informations about species and sites. } \usage{data(mafragh)} \format{\code{mafragh} is a list with the following components: \describe{ \item{xy}{the coordinates of 97 sites} \item{flo}{a data frame with 97 sites and 56 species} \item{neig}{the neighbourhood graph of the 97 sites (an object of class \code{neig})} \item{env}{a data frame with 97 sites and 11 environmental variables} \item{partition}{a factor classifying the 97 sites in 7 classes} \item{area}{a data frame of class \code{area}} \item{tre}{a character providing the phylogeny as a newick object} \item{traits}{a list of data frame. Each data frame provides the value of biological traits for plant species} \item{nb}{the neighbourhood graph of the 97 Mafragh sites (an object of class \code{nb})} \item{Spatial}{the map of the 97 Mafragh sites (an object of the class \code{SpatialPolygons} of \code{sp})} \item{spenames}{a data frame with 56 rows (species) and 2 columns (names)} \item{Spatial.contour}{the contour of the Magragh map (an object of the class \code{SpatialPolygons} of \code{sp})} }} \source{ de Bélair, Gérard and Bencheikh-Lehocine, Mahmoud (1987) Composition et déterminisme de la végétation d'une plaine côtière marécageuse : La Mafragh (Annaba, Algérie). \emph{Bulletin d'Ecologie}, \bold{18}(4), 393--407. Pavoine, S., Vela, E., Gachet, S., de Bélair, G. and Bonsall, M. B. (2011) Linking patterns in phylogeny, traits, abiotic variables and space: a novel approach to linking environmental filtering and plant community assembly. \emph{Journal of Ecology}, \bold{99}, 165--175. doi:10.1111/j.1365-2745.2010.01743.x } \references{See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps053.pdf} (in French).} \examples{ data(mafragh) coa1 <- dudi.coa(mafragh$flo, scan = FALSE) pca1 <- dudi.pca(mafragh$xy, scan = FALSE) if(adegraphicsLoaded()) { g1 <- s.label(mafragh$xy, nb = mafragh$nb, psub.text = "Samples & Neighbourhood graph", plot = FALSE) g2 <- s.value(mafragh$xy, coa1$li[, 1], psub.text = "Axis 1 - COA", plot = FALSE) g3 <- s.value(mafragh$xy, pca1$li[, 1], psub.text = "Axis 1 - PCA", plot = FALSE) g4 <- s.class(pca1$li, mafragh$partition, psub.text = "Plane 1-2 - PCA", plot = FALSE) g5 <- s.class(coa1$li, mafragh$partition, psub.text = "Plane 1-2 - COA", plot = FALSE) g6 <- s.class(mafragh$xy, mafragh$partition, chullSize = 1, ellipseSize = 0, starSize = 0, ppoints.cex = 0, plot = FALSE) G <- ADEgS(c(g1, g2, g3, g4, g5, g6), layout = c(3, 2)) } else { par(mfrow = c(3, 2)) s.label(mafragh$xy, inc = FALSE, neig = mafragh$neig, sub = "Samples & Neighbourhood graph") s.value(mafragh$xy, coa1$li[, 1], sub = "Axis 1 - COA") s.value(mafragh$xy, pca1$li[, 1], sub = "Axis 1 - PCA") s.class(pca1$li, mafragh$partition, sub = "Plane 1-2 - PCA") s.class(coa1$li, mafragh$partition, sub = "Plane 1-2 - COA") s.chull(mafragh$xy, mafragh$partition, optchull = 1) par(mfrow = c(1, 1)) } \dontrun{ link1 <- area2link(mafragh$area) neig1 <- neig(mat01 = 1*(link1 > 0)) nb1 <- neig2nb(neig1) if(adegraphicsLoaded()) { if(requireNamespace("sp", quietly = TRUE)) { g7 <- s.label(mafragh$xy, Sp = mafragh$Spatial, pSp.col = "white", plot = FALSE) g8 <- s.label(mafragh$xy, Sp = mafragh$Spatial, pSp.col = "white", nb = nb1, plab.cex = 0, pnb.node.cex = 0, ppoints.cex = 0, plot = FALSE) G <- ADEgS(c(g7, g8), layout = c(2, 1)) } } else { par(mfrow = c(2, 1)) area.plot(mafragh$area, center = mafragh$xy, clab = 0.75) area.plot(mafragh$area, center = mafragh$xy, graph = neig1) par(mfrow = c(1, 1)) } if(requireNamespace("spdep", quietly = TRUE)) { lw1 <- apply(link1, 1, function(x) x[x > 0]) listw1 <- spdep::nb2listw(nb1, lw1) coa1 <- dudi.coa(mafragh$flo, scan = FALSE, nf = 4) ms1 <- multispati(coa1, listw1, scan = FALSE, nfp = 2, nfn = 0) summary(ms1) if(adegraphicsLoaded()) { if(requireNamespace("lattice", quietly = TRUE)) { g9 <- s1d.barchart(coa1$eig, p1d.hori = FALSE, plot = FALSE) g10 <- s1d.barchart(ms1$eig, p1d.hori = FALSE, plot = FALSE) g11 <- s.corcircle(ms1$as, plot = FALSE) g12 <- lattice::xyplot(ms1$li[, 1] ~ coa1$li[, 1]) G <- ADEgS(list(g9, g10, g11, g12), layout = c(2, 2)) } } else { par(mfrow = c(2, 2)) barplot(coa1$eig) barplot(ms1$eig) s.corcircle(ms1$as) plot(coa1$li[, 1], ms1$li[, 1]) par(mfrow = c(1, 1)) } } }} \keyword{datasets}ade4/man/chats.Rd0000644000176200001440000000356113036107775013251 0ustar liggesusers\name{chats} \alias{chats} \docType{data} \title{Pair of Variables} \description{ This data set is a contingency table of age classes and fecundity classes of cats \emph{Felis catus}. } \usage{data(chats)} \format{ \code{chats} is a data frame with 8 rows and 8 columns.\cr The 8 rows are age classes (age1, \dots, age8).\cr The 8 columns are fecundity classes (f0, f12, f34, \dots, fcd).\cr The values are cats numbers (contingency table). } \source{ Legay, J.M. and Pontier, D. (1985) Relation âge-fécondité dans les populations de Chats domestiques, Felis catus. \emph{Mammalia}, \bold{49}, 395--402. } \examples{ data(chats) chatsw <- as.table(t(chats)) chatscoa <- dudi.coa(data.frame(t(chats)), scann = FALSE) if(adegraphicsLoaded()) { g1 <- table.value(chatsw, ppoints.cex = 1.3, meanX = TRUE, ablineX = TRUE, plabel.cex = 1.5, plot = FALSE) g2 <- table.value(chatsw, ppoints.cex = 1.3, meanY = TRUE, ablineY = TRUE, plabel.cex = 1.5, plot = FALSE) g3 <- table.value(chatsw, ppoints.cex = 1.3, coordsx = chatscoa$c1[, 1], coordsy = chatscoa$l1[, 1], meanX = TRUE, ablineX = TRUE, plot = FALSE) g4 <- table.value(chatsw, ppoints.cex = 1.3, meanY = TRUE, ablineY = TRUE, coordsx = chatscoa$c1[, 1], coordsy = chatscoa$l1[, 1], plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) table.cont(chatsw, abmean.x = TRUE, csi = 2, abline.x = TRUE, clabel.r = 1.5, clabel.c = 1.5) table.cont(chatsw, abmean.y = TRUE, csi = 2, abline.y = TRUE, clabel.r = 1.5, clabel.c = 1.5) table.cont(chatsw, x = chatscoa$c1[, 1], y = chatscoa$l1[, 1], abmean.x = TRUE, csi = 2, abline.x = TRUE, clabel.r = 1.5, clabel.c = 1.5) table.cont(chatsw, x = chatscoa$c1[, 1], y = chatscoa$l1[, 1], abmean.y = TRUE, csi = 2, abline.y = TRUE, clabel.r = 1.5, clabel.c = 1.5) par(mfrow = c(1, 1)) }} \keyword{datasets} ade4/man/kplot.Rd0000644000176200001440000000074412576021756013302 0ustar liggesusers\name{kplot} \alias{kplot} \title{Generic Function for Multiple Graphs in a K-tables Analysis} \description{ Methods for \code{foucart}, \code{mcoa}, \code{mfa}, \code{pta}, \code{sepan}, \code{sepan.coa} and \code{statis} } \usage{ kplot(object, ...) } \arguments{ \item{object}{an object used to select a method} \item{\dots}{further arguments passed to or from other methods} } \examples{ methods(plot) methods(scatter) methods(kplot) } \keyword{multivariate} \keyword{hplot} ade4/man/tintoodiel.Rd0000644000176200001440000000342513177053605014316 0ustar liggesusers\name{tintoodiel} \alias{tintoodiel} \docType{data} \title{Tinto and Odiel estuary geochemistry} \description{ This data set contains informations about geochemical characteristics of heavy metal pollution in surface sediments of the Tinto and Odiel river estuary (south-western Spain). } \usage{data(tintoodiel)} \format{\code{tintoodiel} is a list with the following components: \describe{ \item{xy}{a data frame that contains spatial coordinates of the 52 sites} \item{tab}{a data frame with 12 columns (concentration of heavy metals) and 52 rows (sites)} \item{neig}{an object of class \code{neig}} \item{nb}{the neighbourhood graph of the 52 sites (an object of class \code{nb})} }} \source{ Borrego, J., Morales, J.A., de la Torre, M.L. and Grande, J.A. (2002) Geochemical characteristics of heavy metal pollution in surface sediments of the Tinto and Odiel river estuary (south-western Spain). \emph{Environmental Geology}, \bold{41}, 785--796. } \examples{ data(tintoodiel) if(!adegraphicsLoaded()) { \dontrun{ if(requireNamespace("pixmap", quietly = TRUE)) { estuary.pnm <- pixmap::read.pnm(system.file("pictures/tintoodiel.pnm", package = "ade4")) s.label(tintoodiel$xy, pixmap = estuary.pnm, neig = tintoodiel$neig, clab = 0, cpoi = 2, cneig = 3, addax = FALSE, cgrid = 0, grid = FALSE) }} estuary.pca <- dudi.pca(tintoodiel$tab, scan = FALSE, nf = 4) if(requireNamespace("spdep", quietly = TRUE)) { estuary.listw <- spdep::nb2listw(neig2nb(tintoodiel$neig)) estuary.pca.ms <- multispati(estuary.pca, estuary.listw, scan = FALSE, nfposi = 3, nfnega = 2) summary(estuary.pca.ms) par(mfrow = c(1, 2)) barplot(estuary.pca$eig) barplot(estuary.pca.ms$eig) par(mfrow = c(1, 1)) }}} \keyword{datasets}ade4/man/inertia.dudi.Rd0000644000176200001440000000615713303603121014511 0ustar liggesusers\name{inertia.dudi} \alias{inertia} \alias{inertia.dudi} \alias{print.inertia} \alias{summary.inertia} \title{Decomposition of inertia (i.e. contributions) in multivariate methods} \description{ Computes the decomposition of inertia to measure the contributions of row and/or columns in multivariate methods } \usage{ \method{inertia}{dudi}(x, row.inertia = FALSE, col.inertia = FALSE, ...) \method{print}{inertia}(x, ...) \method{summary}{inertia}(object, sort.axis = 1, subset = 5, ...) } \arguments{ \item{x, object}{a duality diagram, object of class \code{dudi} for \code{inertia.dudi}. An object of class \code{inertia} for the methods \code{print} and \code{summary}} \item{row.inertia}{if TRUE, returns the decomposition of inertia for the rows} \item{col.inertia}{if TRUE, returns the decomposition of inertia for the columns} \item{sort.axis}{the kept axis used to sort the contributions in decreasing order} \item{subset}{the number of rows and/or columns to display in the summary} \item{\dots}{further arguments passed to or from other methods} } \value{ An object of class \code{inertia}, i.e. a list containing : \item{tot.inertia}{repartition of the total inertia between axes} \item{row.contrib}{contributions of the rows to the total inertia} \item{row.abs}{absolute contributions of the rows (i.e. decomposition per axis)} \item{row.rel}{relative contributions of the rows} \item{row.cum}{cumulative relative contributions of the rows (i.e. decomposition per row)} \item{col.contrib}{contributions of the columns to the total inertia} \item{col.abs}{absolute contributions of the columns (i.e. decomposition per axis)} \item{col.rel}{relative contributions of the columns} \item{col.cum}{cumulative relative contributions of the columns (i.e. decomposition per column)} \item{nf}{the number of kept axes} } \references{ Lebart, L., Morineau, A. and Tabart, N. (1977) \emph{Techniques de la description statistique, méthodes et logiciels pour la description des grands tableaux}, Dunod, Paris, 61--62.\cr\cr Volle, M. (1981) \emph{Analyse des données}, Economica, Paris, 89--90 and 118\cr\cr Lebart, L., Morineau, L. and Warwick, K.M. (1984) \emph{Multivariate descriptive analysis: correspondence and related techniques for large matrices}, John Wiley and Sons, New York.\cr\cr Greenacre, M. (1984) \emph{Theory and applications of correspondence analysis}, Academic Press, London, 66.\cr\cr Rouanet, H. and Le Roux, B. (1993) \emph{Analyse des données multidimensionnelles}, Dunod, Paris, 143--144.\cr\cr Tenenhaus, M. (1994) \emph{Méthodes statistiques en gestion}, Dunod, Paris, p. 160, 161, 166, 204.\cr\cr Lebart, L., Morineau, A. and Piron, M. (1995) \emph{Statistique exploratoire multidimensionnelle}, Dunod, Paris, p. 56,95-96.\cr } \details{Contributions are printed in percentage and the sign is the sign of the coordinates} \author{ Daniel Chessel \cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr}\cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(housetasks) coa1 <- dudi.coa(housetasks, scann = FALSE) res <- inertia(coa1, col = TRUE, row = FALSE) res summary(res) } \keyword{multivariate} ade4/man/multiblock.Rd0000644000176200001440000000171313341514240014275 0ustar liggesusers\name{multiblock} \alias{summary.multiblock} \alias{print.multiblock} \title{Display and summarize multiblock objects} \description{Generic methods print and summary for mulitblock objects} \usage{ \method{summary}{multiblock}(object, ...) \method{print}{multiblock}(x, ...) } \arguments{ \item{object}{an object of class multiblock created by \code{\link{mbpls}} or \code{\link{mbpcaiv}}} \item{x}{an object of class multiblock created by \code{\link{mbpls}} or \code{\link{mbpcaiv}}} \item{\dots}{other arguments to be passed to methods} } \references{Bougeard, S. and Dray S. (2018) Supervised Multiblock Analysis in R with the ade4 Package. \emph{Journal of Statistical Software}, \bold{86} (1), 1-17. \url{http://doi.org/10.18637/jss.v086.i01}} \author{Stéphanie Bougeard (\email{stephanie.bougeard@anses.fr}) and Stéphane Dray (\email{stephane.dray@univ-lyon1.fr})} \seealso{ \code{\link{mbpls}}, \code{\link{mbpcaiv}} } \keyword{multivariate} ade4/man/discrimin.coa.Rd0000644000176200001440000000235113021372261014651 0ustar liggesusers\name{discrimin.coa} \alias{discrimin.coa} \title{Discriminant Correspondence Analysis } \description{ performs a discriminant correspondence analysis. } \usage{ discrimin.coa(df, fac, scannf = TRUE, nf = 2) } \arguments{ \item{df}{a data frame containing positive or null values} \item{fac}{a factor defining the classes of discriminant analysis} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} } \value{ a list of class \code{discrimin}. See \code{\link{discrimin}} } \references{ Perriere, G.,Lobry, J. R. and Thioulouse J. (1996) Correspondence discriminant analysis: a multivariate method for comparing classes of protein and nucleic acid sequences. \emph{CABIOS}, \bold{12}, 519--524.\cr Perriere, G. and Thioulouse, J. (2003) Use of Correspondence Discriminant Analysis to predict the subcellular location of bacterial proteins. \emph{Computer Methods and Programs in Biomedicine}, \bold{70}, 2, 99--105. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(perthi02) plot(discrimin.coa(perthi02$tab, perthi02$cla, scan = FALSE)) } \keyword{multivariate} ade4/man/randtest.pcaiv.Rd0000644000176200001440000000210213102043107015040 0ustar liggesusers\name{randtest.pcaiv} \alias{randtest.pcaiv} \alias{randtest.pcaivortho} \title{Monte-Carlo Test on the percentage of explained (i.e. constrained) inertia} \description{ Performs a Monte-Carlo test on on the percentage of explained (i.e. constrained) inertia. The statistic is the ratio of the inertia (sum of eigenvalues) of the constrained analysis divided by the inertia of the unconstrained analysis. } \usage{ \method{randtest}{pcaiv}(xtest, nrepet = 99, ...) \method{randtest}{pcaivortho}(xtest, nrepet = 99, ...) } \arguments{ \item{xtest}{an object of class \code{pcaiv}, \code{pcaivortho} or \code{caiv}} \item{nrepet}{the number of permutations} \item{\dots}{further arguments passed to or from other methods} } \value{ a list of the class \code{randtest} } \author{Stéphane Dray \email{stephane.dray@univ-lyon1.fr}, original code by Raphaël Pélissier} \examples{ data(rpjdl) millog <- log(rpjdl$mil + 1) coa1 <- dudi.coa(rpjdl$fau, scann = FALSE) caiv1 <- pcaiv(coa1, millog, scan = FALSE) randtest(caiv1) } \keyword{multivariate} \keyword{nonparametric} ade4/man/scalewt.Rd0000644000176200001440000000420313021372261013567 0ustar liggesusers\name{scalewt} \alias{covwt} \alias{varwt} \alias{scalewt} \alias{meanfacwt} \alias{varfacwt} \alias{covfacwt} \alias{scalefacwt} \title{Compute or scale data using (weighted) means, variances and covariances (possibly for the levels of a factor)} \description{ These utility functions compute (weighted) means, variances and covariances for dataframe partitioned by a factor. The scale transforms a numeric matrix in a centred and scaled matrix for any weighting. } \usage{ covwt(x, wt, na.rm = FALSE) varwt(x, wt, na.rm = FALSE) scalewt(df, wt = rep(1/nrow(df), nrow(df)), center = TRUE, scale = TRUE) meanfacwt(df, fac = NULL, wt = rep(1/nrow(df), nrow(df)), drop = FALSE) varfacwt(df, fac = NULL, wt = rep(1/nrow(df), nrow(df)), drop = FALSE) covfacwt(df, fac = NULL, wt = rep(1/nrow(df), nrow(df)), drop = FALSE) scalefacwt(df, fac = NULL, wt = rep(1/nrow(df), nrow(df)), scale = TRUE, drop = FALSE) } \arguments{ \item{x}{a numeric vector (\code{varwt}) or a matrix (\code{covwt}) containg the data.} \item{na.rm}{a logical value indicating whether NA values should be stripped before the computation proceeds.} \item{df}{a matrix or a dataframe containing the data.} \item{fac}{a factor partitioning the data.} \item{wt}{a numeric vector of weights.} \item{drop}{a logical value indicating whether unused levels should be kept.} \item{scale}{a logical value indicating whether data should be scaled or not.} \item{center}{a logical value indicating whether data should be centered or not.} } \details{ Functions returns biased estimates of variances and covariances (i.e. divided by n and not n-1) } \value{ For \code{varwt}, the weighted variance. For \code{covwt}, the matrix of weighted co-variances. For \code{scalewt}, the scaled dataframe. For other function a list (if \code{fac} is not null) of dataframes with approriate values } \author{Stéphane Dray \email{stephane.dray@univ-lyon1.fr}} \examples{ data(meau) w <- rowSums(meau$spe) varwt(meau$env, w) varfacwt(meau$env, wt = w) varfacwt(meau$env, wt = w, fac = meau$design$season) covfacwt(meau$env, wt = w, fac = meau$design$season) scalewt(meau$env, wt = w) } \keyword{utilities} ade4/man/fruits.Rd0000644000176200001440000000521413021372261013444 0ustar liggesusers\name{fruits} \alias{fruits} \docType{data} \title{Pair of Tables} \description{ 28 batches of fruits -two types- are judged by two different ways.\cr They are classified in order of preference, without ex aequo, by 16 individuals.\cr 15 quantitative variables described the batches of fruits.\cr } \usage{data(fruits)} \format{ \code{fruits} is a list of 3 components: \describe{ \item{typ}{is a vector returning the type of the 28 batches of fruits (peaches or nectarines).} \item{jug}{is a data frame of 28 rows and 16 columns (judges).} \item{var}{is a data frame of 28 rows and 16 measures (average of 2 judgements).} } } \details{ \code{fruits$var} is a data frame of 15 variables: \enumerate{ \item taches: quantity of cork blemishes (0=absent - maximum 5) \item stries: quantity of stria (1/none - maximum 4) \item abmucr: abundance of mucron (1/absent - 4) \item irform: shape irregularity (0/none - 3) \item allong: length of the fruit (1/round fruit - 4) \item suroug: percentage of the red surface (minimum 40\% - maximum 90\%) \item homlot: homogeneity of the intra-batch coloring (1/strong - 4) \item homfru: homogeneity of the intra-fruit coloring (1/strong - 4) \item pubesc: pubescence (0/none - 4) \item verrou: intensity of green in red area (1/none - 4) \item foncee: intensity of dark area (0/pink - 4) \item comucr: intensity of the mucron color (1=no contrast - 4/dark) \item impres: kind of impression (1/watched - 4/pointillé) \item coldom: intensity of the predominating color (0/clear - 4) \item calibr: grade (1/<90g - 5/>200g) } } \source{ Kervella, J. (1991) Analyse de l'attrait d'un produit : exemple d'une comparaison de lots de pêches. Agro-Industrie et méthodes statistiques. Compte-rendu des secondes journées européennes. Nantes 13-14 juin 1991. Association pour la Statistique et ses Utilisations, Paris, 313--325.} \examples{ data(fruits) pcajug <- dudi.pca(fruits$jug, scann = FALSE) pcavar <- dudi.pca(fruits$var, scann = FALSE) if(adegraphicsLoaded()) { g1 <- s.corcircle(pcajug$co, plot = FALSE) g2 <- s.class(pcajug$li, fac = fruits$type, plot = FALSE) g3 <- s.corcircle(pcavar$co, plot = FALSE) g4 <- s.class(pcavar$li, fac = fruits$type, plot = FALSE) G1 <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) G2 <- plot(coinertia(pcajug, pcavar, scan = FALSE)) } else { par(mfrow = c(2,2)) s.corcircle(pcajug$co) s.class(pcajug$li, fac = fruits$type) s.corcircle(pcavar$co) s.class(pcavar$li, fac = fruits$type) par(mfrow = c(1,1)) plot(coinertia(pcajug, pcavar, scan = FALSE)) } } \keyword{datasets} ade4/man/wca.rlq.Rd0000644000176200001440000000370413021372261013501 0ustar liggesusers\name{wca.rlq} \alias{wca.rlq} \alias{plot.witrlq} \alias{print.witrlq} \title{ Within-Class RLQ analysis } \description{ Performs a particular RLQ analysis where a partition of sites (rows of R) is taken into account. The within-class RLQ analysis search for linear combinations of traits and environmental variables of maximal covariance. } \usage{ \method{wca}{rlq}(x, fac, scannf = TRUE, nf = 2, ...) \method{plot}{witrlq}(x, xax = 1, yax = 2, ...) \method{print}{witrlq}(x, ...) } \arguments{ \item{x}{an object of class rlq (created by the \code{rlq} function) for the \code{wca.rlq} function. An object of class \code{witrlq} for the \code{print} and \code{plot} functions} \item{fac}{a factor partitioning the rows of R} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} \item{xax}{the column number for the x-axis} \item{yax}{the column number for the y-axis} \item{\dots}{further arguments passed to or from other methods} } \value{ The \code{wca.rlq} function returns an object of class 'betrlq' (sub-class of 'dudi'). See the outputs of the \code{print} function for more details. } \references{ Wesuls, D., Oldeland, J. and Dray, S. (2012) Disentangling plant trait responses to livestock grazing from spatio-temporal variation: the partial RLQ approach. \emph{Journal of Vegetation Science}, \bold{23}, 98--113. } \author{ Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \seealso{ \code{\link{rlq}}, \code{\link{wca}}, \code{\link{wca.rlq}} } \examples{ data(piosphere) afcL <- dudi.coa(log(piosphere$veg + 1), scannf = FALSE) acpR <- dudi.pca(piosphere$env, scannf = FALSE, row.w = afcL$lw) acpQ <- dudi.hillsmith(piosphere$traits, scannf = FALSE, row.w = afcL$cw) rlq1 <- rlq(acpR, afcL, acpQ, scannf = FALSE) wrlq1 <- wca(rlq1, fac = piosphere$habitat, scannf = FALSE) wrlq1 plot(wrlq1) } \keyword{multivariate} ade4/man/mbpcaiv.Rd0000644000176200001440000001004713341514041013550 0ustar liggesusers\name{mbpcaiv} \alias{mbpcaiv} \title{Multiblock principal component analysis with instrumental variables} \description{Function to perform a multiblock redundancy analysis of several explanatory blocks \eqn{(X_1, \dots, X_k)}, defined as an object of class \code{ktab}, to explain a dependent dataset $Y$, defined as an object of class \code{dudi}} \usage{ mbpcaiv(dudiY, ktabX, scale = TRUE, option = c("uniform", "none"), scannf = TRUE, nf = 2) } \arguments{ \item{dudiY}{an object of class \code{dudi} containing the dependent variables} \item{ktabX}{an object of class \code{ktab} containing the blocks of explanatory variables} \item{scale}{logical value indicating whether the explanatory variables should be standardized} \item{option}{an option for the block weighting. If \code{uniform}, the block weight is equal to $1/K$ for \eqn{(X_1, \dots, X_K)} and to $1$ for $X$ and $Y$. If \code{none}, the block weight is equal to the block inertia} \item{scannf}{logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{integer indicating the number of kept dimensions} } \value{A list containing the following components is returned: \item{call}{the matching call} \item{tabY}{data frame of dependent variables centered, eventually scaled (if \option{scale=TRUE}) and weighted (if \option{option="uniform"})} \item{tabX}{data frame of explanatory variables centered, eventually scaled (if \option{scale=TRUE}) and weighted (if \option{option="uniform"})} \item{TL, TC}{data frame useful to manage graphical outputs} \item{nf}{numeric value indicating the number of kept dimensions} \item{lw}{numeric vector of row weights} \item{X.cw}{numeric vector of column weighs for the explanalatory dataset} \item{blo}{vector of the numbers of variables in each explanatory dataset} \item{rank}{maximum rank of the analysis} \item{eig}{numeric vector containing the eigenvalues} \item{lX}{matrix of the global components associated with the whole explanatory dataset (scores of the individuals)} \item{lY}{matrix of the components associated with the dependent dataset} \item{Yc1}{matrix of the variable loadings associated with the dependent dataset} \item{Tli}{matrix containing the partial components associated with each explanatory dataset} \item{Tl1}{matrix containing the normalized partial components associated with each explanatory dataset} \item{Tfa}{matrix containing the partial loadings associated with each explanatory dataset} \item{cov2}{squared covariance between lY and Tl1} \item{Yco}{matrix of the regression coefficients of the dependent dataset onto the global components} \item{faX}{matrix of the regression coefficients of the whole explanatory dataset onto the global components} \item{XYcoef}{list of matrices of the regression coefficients of the whole explanatory dataset onto the dependent dataset} \item{bip}{block importances for a given dimension} \item{bipc}{cumulated block importances for a given number of dimensions} \item{vip}{variable importances for a given dimension} \item{vipc}{cumulated variable importances for a given number of dimensions} } \references{Bougeard, S., Qannari, E.M. and Rose, N. (2011) Multiblock Redundancy Analysis: interpretation tools and application in epidemiology. \emph{Journal of Chemometrics}, \bold{23}, 1-9 Bougeard, S. and Dray S. (2018) Supervised Multiblock Analysis in R with the ade4 Package. \emph{Journal of Statistical Software}, \bold{86} (1), 1-17. \url{http://doi.org/10.18637/jss.v086.i01} } \author{Stéphanie Bougeard (\email{stephanie.bougeard@anses.fr}) and Stéphane Dray (\email{stephane.dray@univ-lyon1.fr})} \seealso{\code{\link{mbpls}}, \code{\link{testdim.multiblock}}, \code{\link{randboot.multiblock}}} \examples{ data(chickenk) Mortality <- chickenk[[1]] dudiY.chick <- dudi.pca(Mortality, center = TRUE, scale = TRUE, scannf = FALSE) ktabX.chick <- ktab.list.df(chickenk[2:5]) resmbpcaiv.chick <- mbpcaiv(dudiY.chick, ktabX.chick, scale = TRUE, option = "uniform", scannf = FALSE) summary(resmbpcaiv.chick) if(adegraphicsLoaded()) plot(resmbpcaiv.chick) } \keyword{multivariate} ade4/man/jv73.Rd0000644000176200001440000000370413175633655012744 0ustar liggesusers\name{jv73} \alias{jv73} \docType{data} \title{K-tables Multi-Regions} \description{ This data set gives physical and physico-chemical variables, fish species, spatial coordinates about 92 sites. } \usage{data(jv73)} \format{\code{jv73} is a list with the following components: \describe{ \item{morpho}{a data frame with 92 sites and 6 physical variables} \item{phychi}{a data frame with 92 sites and 12 physico-chemical variables} \item{poi}{a data frame with 92 sites and 19 fish species} \item{xy}{a data frame with 92 sites and 2 spatial coordinates} \item{contour}{a data frame for mapping} \item{fac.riv}{a factor distributing the 92 sites on 12 rivers} \item{Spatial}{an object of the class \code{SpatialLines} of \code{sp}, containing the map} }} \source{ Verneaux, J. (1973) Cours d'eau de Franche-Comté (Massif du Jura). Recherches écologiques sur le réseau hydrographique du Doubs. Essai de biotypologie. Thèse d'Etat, Besançon. } \references{ See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps047.pdf} (in French). } \examples{ data(jv73) w <- split(jv73$morpho, jv73$fac.riv) w <- lapply(w, function(x) t(dudi.pca(x, scann = FALSE))) w <- ktab.list.dudi(w) if(adegraphicsLoaded()) { if(requireNamespace("sp", quietly = TRUE)) { g11 <- s.label(jv73$xy, Sp = jv73$Spatial, pori.incl = FALSE, plab.cex = 0.75, plot = FALSE) g12 <- s.class(jv73$xy, jv73$fac.riv, ellipseSize = 0, pellipses.axes.draw = FALSE, starSize = 0, ppoints.cex = 0, plab.cex = 1.25, plot = FALSE) g1 <- superpose(g11, g12, plot = TRUE) g2 <- kplot(sepan(w), perm = TRUE, row.plab.cex = 0, posieig = "none") } } else { s.label(jv73$xy, contour = jv73$contour, incl = FALSE, clab = 0.75) s.class(jv73$xy, jv73$fac.riv, add.p = TRUE, cell = 0, axese = FALSE, csta = 0, cpoi = 0, clab = 1.25) kplot(sepan(w), perm = TRUE, clab.r = 0, clab.c = 2, show = FALSE) }} \keyword{datasets}ade4/man/supdist.Rd0000644000176200001440000000567613125167376013655 0ustar liggesusers\name{supdist} \alias{supdist} \title{ Projection of additional items in a PCO analysis } \description{ This function takes the grand distance matrix between all items (Active + Supplementary). It computes the PCO of the distance matrix between Active items, and projects the distance matrix of Supplementary items in this PCO. } \usage{supdist(d, fsup, tol = 1e-07)} \arguments{ \item{d}{Grand distance matrix between all (Active + Supplementary) items} \item{fsup}{A factor with two levels giving the Active (level `A') or Supplementary (level `S') status for each item in the distance matrix.} \item{tol}{Numeric tolerance used to evaluate zero eigenvalues} } \value{ \item{coordSup}{Coordinates of Supplementary items projected in the PCO of Active items} \item{coordAct}{Coordinates of Active item} \item{coordTot}{Coordinates of Active plus Supplementary items} } \references{ Computations based on the Methods section of the following paper: Pele J, Abdi H, Moreau M, Thybert D, Chabbert M (2011) Multidimensional Scaling Reveals the Main Evolutionary Pathways of Class A G-Protein-Coupled Receptors. PLoS ONE 6(4): e19094. \url{https://doi.org/10.1371/journal.pone.0019094} } \author{Jean Thioulouse} \seealso{\code{\link{dudi.pco}}, \code{\link{suprow}}} \examples{ data(meau) ## Case 1: Supplementary items = subset of Active items ## Supplementary coordinates should be equal to Active coordinates ## PCO of active items (meau dataset has 6 sites and 10 variables) envpca1 <- dudi.pca(meau$env, scannf = FALSE) dAct <- dist(envpca1$tab) pco1 <- dudi.pco(dAct, scannf = FALSE) ## Projection of rows 19:24 (winter season for the 6 sites) ## Supplementary items must be normalized f1 <- function(w) (w - envpca1$cent) / envpca1$norm envSup <- t(apply(meau$env[19:24, ], 1, f1)) envTot <- rbind.data.frame(envpca1$tab, envSup) dTot <- dist(envTot) fSA1 <- as.factor(rep(c("A", "S"), c(24, 6))) cSup1 <- supdist(dTot, fSA1) ## Comparison (coordinates should be equal) cSup1$coordSup[, 1:2] pco1$li[19:24, ] data(meaudret) ## Case 2: Supplementary items = new items ## PCO of active items (meaudret dataset has only 5 sites and 9 variables) envpca2 <- dudi.pca(meaudret$env, scannf = FALSE) dAct <- dist(envpca2$tab) pco2 <- dudi.pco(dAct, scannf = FALSE) ## Projection of site 6 (four seasons, without Oxyg variable) ## Supplementary items must be normalized f1 <- function(w) (w - envpca2$cent) / envpca2$norm envSup <- t(apply(meau$env[seq(6, 24, 6), -5], 1, f1)) envTot <- rbind.data.frame(envpca2$tab, envSup) dTot <- dist(envTot) fSA2 <- as.factor(rep(c("A", "S"), c(20, 4))) cSup2 <- supdist(dTot, fSA2) ## Supplementary items vs. real items if(!adegraphicsLoaded()) { par(mfrow = c(1, 2)) s.label(pco1$li) s.label(rbind.data.frame(pco2$li, cSup2$coordSup[, 1:2])) } else { gl1 <- s.label(pco1$li, plabels.optim = TRUE) gl2 <- s.label(rbind.data.frame(pco2$li, cSup2$coordSup[, 1:2]), plabels.optim = TRUE) ADEgS(list(gl1, gl2)) } } \keyword{multivariate}ade4/man/rhone.Rd0000644000176200001440000000226413021372261013245 0ustar liggesusers\name{rhone} \alias{rhone} \docType{data} \title{Physico-Chemistry Data} \description{ This data set gives for 39 water samples a physico-chemical description with the number of sample date and the flows of three tributaries. } \usage{data(rhone)} \format{ \code{rhone} is a list of 3 components. \describe{ \item{tab}{is a data frame with 39 water samples and 15 physico-chemical variables.} \item{date}{is a vector of the sample date (in days).} \item{disch}{is a data frame with 39 water samples and the flows of the three tributaries.} } } \source{ Carrel, G., Barthelemy, D., Auda, Y. and Chessel, D. (1986) Approche graphique de l'analyse en composantes principales normée : utilisation en hydrobiologie. \emph{Acta Oecologica, Oecologia Generalis}, \bold{7}, 189--203. } \examples{ data(rhone) pca1 <- dudi.pca(rhone$tab, nf = 2, scann = FALSE) rh1 <- reconst(pca1, 1) rh2 <- reconst(pca1, 2) par(mfrow = c(4,4)) par(mar = c(2.6,2.6,1.1,1.1)) for (i in 1:15) { plot(rhone$date, rhone$tab[,i]) lines(rhone$date, rh1[,i], lwd = 2) lines(rhone$date, rh2[,i]) ade4:::scatterutil.sub(names(rhone$tab)[i], 2, "topright") } par(mfrow = c(1,1)) } \keyword{datasets} ade4/man/corkdist.Rd0000644000176200001440000000422313050632301013745 0ustar liggesusers\name{corkdist} \alias{corkdist} \alias{mantelkdist} \alias{RVkdist} \alias{print.corkdist} \alias{summary.corkdist} \alias{plot.corkdist} \title{Tests of randomization between distances applied to 'kdist' objetcs} \description{ The mantelkdist and RVkdist functions apply to blocks of distance matrices the mantel.rtest and RV.rtest functions. } \usage{ mantelkdist (kd, nrepet = 999, ...) RVkdist (kd, nrepet = 999, ...) \method{plot}{corkdist}(x, whichinrow = NULL, whichincol = NULL, gap = 4, nclass = 10,\dots) } \arguments{ \item{kd}{a list of class \code{kdist}} \item{nrepet}{the number of permutations} \item{x}{an objet of class \code{corkdist}, coming from RVkdist or mantelkdist} \item{whichinrow}{a vector of integers to select the graphs in rows (if NULL all the graphs are computed)} \item{whichincol}{a vector of integers to select the graphs in columns (if NULL all the graphs are computed)} \item{gap}{an integer to determinate the space between two graphs} \item{nclass}{a number of intervals for the histogram} \item{\dots}{further arguments passed to or from other methods} } \value{ a list of class \code{corkdist} containing for each pair of distances an object of class \code{randtest} (permutation tests). } \details{ The \code{corkdist} class has some generic functions \code{print}, \code{plot} and \code{summary}. The plot shows bivariate scatterplots between semi-matrices of distances or histograms of simulated values with an error position. } \author{ Daniel Chessel \cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \examples{ data(friday87) fri.w <- ktab.data.frame(friday87$fau, friday87$fau.blo, tabnames = friday87$tab.names) fri.kc <- lapply(1:10, function(x) dist.binary(fri.w[[x]], 10)) names(fri.kc) <- substr(friday87$tab.names, 1, 4) fri.kd <- kdist(fri.kc) fri.mantel <- mantelkdist(kd = fri.kd, nrepet = 999) plot(fri.mantel, 1:5, 1:5) plot(fri.mantel, 1:5, 6:10) plot(fri.mantel, 6:10, 1:5) plot(fri.mantel, 6:10, 6:10) s.corcircle(dudi.pca(as.data.frame(fri.kd), scan = FALSE)$co) plot(RVkdist(fri.kd), 1:5, 1:5) data(yanomama) m1 <- mantelkdist(kdist(yanomama), 999) m1 summary(m1) plot(m1) } \keyword{nonparametric} ade4/man/triangle.class.Rd0000644000176200001440000000700012576021756015052 0ustar liggesusers\name{triangle.class} \alias{triangle.class} \title{ Triangular Representation and Groups of points } \description{ Function to plot triangular data (i.e. dataframe with 3 columns of positive or null values) and a partition \cr } \usage{ triangle.class(ta, fac, col = rep(1, length(levels(fac))), wt = rep(1, length(fac)), cstar = 1, cellipse = 0, axesell = TRUE, label = levels(fac), clabel = 1, cpoint = 1, pch = 20, draw.line = TRUE, addaxes = FALSE, addmean = FALSE, labeltriangle = TRUE, sub = "", csub = 1, possub = "bottomright", show.position = TRUE, scale = TRUE, min3 = NULL, max3 = NULL) } \arguments{ \item{ta}{ a data frame with 3 columns of null or positive numbers } \item{fac}{ a factor of length the row number of \code{ta} } \item{col}{ a vector of color for showing the groups } \item{wt}{ a vector of row weighting for the computation of the gravity centers by class } \item{cstar}{ a character size for plotting the stars between 0 (no stars) and 1 (complete star) for a line linking a point to the gravity center of its belonging class. } \item{cellipse}{ a positive coefficient for the inertia ellipse size } \item{axesell}{ a logical value indicating whether the ellipse axes should be drawn } \item{label}{ a vector of strings of characters for the labels of gravity centers } \item{clabel}{ if not NULL, a character size for the labels, used with \code{par("cex")*clabel} } \item{cpoint}{ a character size for plotting the points, used with \code{par("cex")*cpoint}. If zero, no points are drawn } \item{pch}{ if \code{cpoint} > 0, an integer specifying the symbol or the single character to be used in plotting points } \item{draw.line}{ a logical value indicating whether the triangular lines should be drawn } \item{addaxes}{ a logical value indicating whether the axes should be plotted } \item{addmean}{ a logical value indicating whether the mean point should be plotted } \item{labeltriangle}{ a logical value indicating whether the varliable labels of \code{ta} should be drawn on the triangular sides } \item{sub}{ a string of characters for the graph title } \item{csub}{ a character size for plotting the graph title } \item{possub}{ a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright") } \item{show.position}{ a logical value indicating whether the sub-triangle containing the data should be put back in the total triangle } \item{scale}{a logical value for the graph representation : the total triangle (FALSE) or the sub-triangle (TRUE) } \item{min3}{ if not NULL, a vector with 3 numbers between 0 and 1 } \item{max3}{ if not NULL, a vector with 3 numbers between 0 and 1. Let notice that \code{min3}+\code{max3} must equal c(1,1,1) } } \author{ Daniel Chessel} \examples{ if(!adegraphicsLoaded()) { data(euro123) par(mfrow = c(2, 2)) x <- rbind.data.frame(euro123$in78, euro123$in86, euro123$in97) triangle.plot(x) triangle.class(x, as.factor(rep("G", 36)), csta = 0.5, cell = 1) triangle.class(x, euro123$plan$an) triangle.class(x, euro123$plan$pays) triangle.class(x, euro123$plan$an, cell = 1, axesell = TRUE) triangle.class(x, euro123$plan$an, cell = 0, csta = 0, col = c("red", "green", "blue"), axesell = TRUE, clab = 2, cpoi = 2) triangle.class(x, euro123$plan$an, cell = 2, csta = 0.5, axesell = TRUE, clab = 1.5) triangle.class(x, euro123$plan$an, cell = 0, csta = 1, scale = FALSE, draw.line = FALSE, show.posi = FALSE) par(mfrow = c(2, 2)) }} \keyword{ hplot } ade4/man/kplot.sepan.Rd0000644000176200001440000000621112576021756014402 0ustar liggesusers\name{kplot.sepan} \alias{kplot.sepan} \alias{kplotsepan.coa} \title{Multiple Graphs for Separated Analyses in a K-tables} \description{ performs high level plots for Separed Analyses in a K-tables, using an object of class \code{sepan}. } \usage{ \method{kplot}{sepan}(object, xax = 1, yax = 2, which.tab = 1:length(object$blo), mfrow = NULL, permute.row.col = FALSE, clab.row = 1, clab.col = 1.25, traject.row = FALSE, csub = 2, possub = "bottomright", show.eigen.value = TRUE,\dots) kplotsepan.coa(object, xax = 1, yax = 2, which.tab = 1:length(object$blo), mfrow = NULL, permute.row.col = FALSE, clab.row = 1, clab.col = 1.25, csub = 2, possub = "bottomright", show.eigen.value = TRUE, poseig = c("bottom", "top"), \dots) } \arguments{ \item{object}{an object of class \code{sepan}} \item{xax, yax}{the numbers of the x-axis and the y-axis} \item{which.tab}{a numeric vector containing the numbers of the tables to analyse} \item{mfrow}{parameter for the array of figures to be drawn, otherwise use n2mfrow} \item{permute.row.col}{if TRUE the rows are represented by arrows and the columns by points, if FALSE it is the opposite} \item{clab.row}{a character size for the row labels} \item{clab.col}{a character size for the column labels} \item{traject.row}{a logical value indicating whether the trajectories between rows should be drawn in a natural order} \item{csub}{a character size for the sub-titles, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{show.eigen.value}{a logical value indicating whether the eigenvalues bar plot should be drawn} \item{poseig}{if "top" the eigenvalues bar plot is upside, if "bottom", it is downside} \item{\dots}{further arguments passed to or from other methods} } \details{ \code{kplot.sepan} superimposes the points for the rows and the arrows for the columns using an adapted rescaling such as the \code{scatter.dudi}.\cr \code{kplotsepan.coa} superimposes the row coordinates and the column coordinates with the same scale. } \author{Daniel Chessel } \examples{ data(escopage) w1 <- data.frame(scale(escopage$tab)) w1 <- ktab.data.frame(w1, escopage$blo, tabnames = escopage$tab.names) sep1 <- sepan(w1) if(adegraphicsLoaded()) { kplot(sep1, posieig = "none") } else { kplot(sep1, show = FALSE) } data(friday87) w2 <- data.frame(scale(friday87$fau, scal = FALSE)) w2 <- ktab.data.frame(w2, friday87$fau.blo, tabnames = friday87$tab.names) if(adegraphicsLoaded()) { kplot(sepan(w2), row.plabel.cex = 1.25, col.plab.cex = 0) } else { kplot(sepan(w2), clab.r = 1.25, clab.c = 0) } data(microsatt) w3 <- dudi.coa(data.frame(t(microsatt$tab)), scann = FALSE) loci.fac <- factor(rep(microsatt$loci.names, microsatt$loci.eff)) wit <- wca(w3, loci.fac, scann = FALSE) microsatt.ktab <- ktab.within(wit) if(adegraphicsLoaded()) { kplotsepan.coa(sepan(microsatt.ktab), posieig = "none", col.plab.cex = 0, row.plab.cex = 1.5) } else { kplotsepan.coa(sepan(microsatt.ktab), show = FALSE, clab.c = 0, mfrow = c(3,3), clab.r = 1.5) } } \keyword{multivariate} \keyword{hplot} ade4/man/skulls.Rd0000644000176200001440000000265612576021756013472 0ustar liggesusers\name{skulls} \alias{skulls} \docType{data} \title{Morphometric Evolution} \description{ This data set gives four anthropometric measures of 150 Egyptean skulls belonging to five different historical periods. } \usage{data(skulls)} \format{ The \code{skulls} data frame has 150 rows (egyptean skulls) and 4 columns (anthropometric measures). The four variables are the maximum breadth (V1), the basibregmatic height (V2), the basialveolar length (V3) and the nasal height (V4). All measurements were taken in millimeters. } \details{ The measurements are made on 5 groups and 30 Egyptian skulls. The groups are defined as follows :\cr 1 - the early predynastic period (circa 4000 BC)\cr 2 - the late predynastic period (circa 3300 BC)\cr 3 - the 12th and 13th dynasties (circa 1850 BC)\cr 4 - the Ptolemiac period (circa 200 BC)\cr 5 - the Roman period (circa 150 BC)\cr } \source{ Thompson, A. and Randall-Maciver, R. (1905) \emph{Ancient races of the Thebaid}, Oxford University Press. } \references{ Manly, B.F. (1994) \emph{Multivariate Statistical Methods. A primer}, Second edition. Chapman & Hall, London. 1--215.\cr The example is treated pp. 6, 13, 51, 64, 72, 107, 112 and 117. } \examples{ data(skulls) pca1 <- dudi.pca(skulls, scan = FALSE) fac <- gl(5, 30) levels(fac) <- c("-4000", "-3300", "-1850", "-200", "+150") dis.skulls <- discrimin(pca1, fac, scan = FALSE) if(!adegraphicsLoaded()) plot(dis.skulls, 1, 1) } \keyword{datasets} ade4/man/ktab.list.df.Rd0000644000176200001440000000251613021372261014415 0ustar liggesusers\name{ktab.list.df} \alias{ktab.list.df} \title{Creating a K-tables from a list of data frames. } \description{ creates a list of class \code{ktab} from a list of data frames } \usage{ ktab.list.df(obj, rownames = NULL, colnames = NULL, tabnames = NULL, w.row = rep(1, nrow(obj[[1]])), w.col = lapply(obj, function(x) rep(1 / ncol(x), ncol(x)))) } \arguments{ \item{obj}{a list of data frame} \item{rownames}{the names of the K-tables rows (otherwise, the row names of the arrays)} \item{colnames}{the names of the K-tables columns (otherwise, the column names of the arrays)} \item{tabnames}{the names of the arrays of the K-tables (otherwise, the names of the obj if they exist, or else "Ana1", "Ana2", \dots)} \item{w.row}{a vector of the row weightings in common with all the arrays} \item{w.col}{a list of the vector of the column weightings for each array} } \details{ Each element of the initial list have to possess the same names and row numbers } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \value{ returns a list of class \code{ktab}. See \code{\link{ktab}} } \examples{ data(jv73) l0 <- split(jv73$morpho, jv73$fac.riv) l0 <- lapply(l0, function(x) data.frame(t(scalewt(x)))) kta <- ktab.list.df(l0) kplot(sepan(kta[c(2, 5, 7, 10)]), perm = TRUE) } \keyword{multivariate} ade4/man/coinertia.Rd0000644000176200001440000000612513021372261014107 0ustar liggesusers\name{coinertia} \alias{coinertia} \alias{print.coinertia} \alias{plot.coinertia} \alias{summary.coinertia} \title{Coinertia Analysis} \description{ The coinertia analysis performs a double inertia analysis of two tables. } \usage{ coinertia(dudiX, dudiY, scannf = TRUE, nf = 2) \method{plot}{coinertia} (x, xax = 1, yax = 2, \dots) \method{print}{coinertia} (x, \dots) \method{summary}{coinertia} (object, \dots) } \arguments{ \item{dudiX}{a duality diagram providing from one of the functions dudi.coa, dudi.pca, \dots} \item{dudiY}{a duality diagram providing from one of the functions dudi.coa, dudi.pca, \dots} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} \cr \item{x, object}{an object of class 'coinertia'} \item{xax, yax}{the numbers of the x-axis and the y-axis} \item{\dots}{further arguments passed to or from other methods} } \value{ Returns a list of class 'coinertia', sub-class 'dudi' containing: \item{call}{call} \item{rank}{rank} \item{nf}{a numeric value indicating the number of kept axes} \item{RV}{a numeric value, the RV coefficient} \item{eig}{a numeric vector with all the eigenvalues} \item{lw}{a numeric vector with the rows weigths (crossed table)} \item{cw}{a numeric vector with the columns weigths (crossed table)} \item{tab}{a crossed table (CT)} \item{li}{CT row scores (cols of dudiY)} \item{l1}{Principal components (loadings for cols of dudiY)} \item{co}{CT col scores (cols of dudiX)} \item{c1}{Principal axes (cols of dudiX)} \item{lX}{Row scores (rows of dudiX)} \item{mX}{Normed row scores (rows of dudiX)} \item{lY}{Row scores (rows of dudiY)} \item{mY}{Normed row scores (rows of dudiY)} \item{aX}{Correlations between dudiX axes and coinertia axes} \item{aY}{Correlations between dudiY axes and coinertia axes} } \references{ Dolédec, S. and Chessel, D. (1994) Co-inertia analysis: an alternative method for studying species-environment relationships. \emph{Freshwater Biology}, \bold{31}, 277--294.\cr Dray, S., Chessel, D. and J. Thioulouse (2003) Co-inertia analysis and the linking of the ecological data tables. \emph{Ecology}, \bold{84}, 11, 3078--3089. } \section{WARNING}{ IMPORTANT : \code{dudi1} and \code{dudi2} must have identical row weights. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(doubs) dudi1 <- dudi.pca(doubs$env, scale = TRUE, scan = FALSE, nf = 3) dudi2 <- dudi.pca(doubs$fish, scale = FALSE, scan = FALSE, nf = 2) coin1 <- coinertia(dudi1,dudi2, scan = FALSE, nf = 2) coin1 summary(coin1) if(adegraphicsLoaded()) { g1 <- s.arrow(coin1$l1, plab.cex = 0.7) g2 <- s.arrow(coin1$c1, plab.cex = 0.7) g3 <- s.corcircle(coin1$aX, plot = FALSE) g4 <- s.corcircle(coin1$aY, plot = FALSE) cbindADEg(g3, g4, plot = TRUE) g5 <- plot(coin1) } else { s.arrow(coin1$l1, clab = 0.7) s.arrow(coin1$c1, clab = 0.7) par(mfrow = c(1,2)) s.corcircle(coin1$aX) s.corcircle(coin1$aY) par(mfrow = c(1,1)) plot(coin1) }} \keyword{multivariate} ade4/man/apqe.Rd0000644000176200001440000000327313021372261013061 0ustar liggesusers\name{apqe} \alias{apqe} \alias{print.apqe} \title{Apportionment of Quadratic Entropy} \description{ The hierarchical apportionment of quadratic entropy defined by Rao (1982). } \usage{ apqe(samples, dis = NULL, structures) \method{print}{apqe}(x, full = FALSE, \dots) } \arguments{ \item{samples}{a data frame with haplotypes (or genotypes) as rows, populations as columns and abundance or presence-absence as entries} \item{dis}{an object of class \code{dist} computed from Euclidean distance. If \code{dis} is null, equidistances are used.} \item{structures}{a data frame that contains, in the jth row and the kth column, the name of the group of level k to which the jth population belongs} \item{x}{an object of class \code{apqe}} \item{full}{a logical value that indicates whether the original data ('distances', 'samples', 'structures') should be printed} \item{\dots}{\code{\dots} further arguments passed to or from other methods} } \value{ Returns a list of class \code{apqe} \item{call}{call} \item{results}{a data frame that contains the components of diversity.} } \references{ Rao, C.R. (1982) Diversity: its measurement, decomposition, apportionment and analysis. \emph{Sankhya: The Indian Journal of Statistics}, \bold{A44}, 1--22. Pavoine S. and Dolédec S. (2005) The apportionment of quadratic entropy: a useful alternative for partitioning diversity in ecological data. \emph{Environmental and Ecological Statistics}, \bold{12}, 125--138. } \author{Sandrine Pavoine \email{pavoine@mnhn.fr} } %\seealso{\code{\link{randtest.apqe}}} \examples{ data(ecomor) ecomor.phylog <- taxo2phylog(ecomor$taxo) apqe(ecomor$habitat, ecomor.phylog$Wdist) } \keyword{multivariate} ade4/man/score.coa.Rd0000644000176200001440000000471413176355152014023 0ustar liggesusers\name{score.coa} \alias{score.coa} \alias{reciprocal.coa} \title{Reciprocal scaling after a correspondence analysis} \description{ performs the canonical graph of a correspondence analysis. } \usage{ \method{score}{coa}(x, xax = 1, dotchart = FALSE, clab.r = 1, clab.c = 1, csub = 1, cpoi = 1.5, cet = 1.5, ...) reciprocal.coa(x) } \arguments{ \item{x}{an object of class \code{coa}} \item{xax}{the column number for the used axis} \item{dotchart}{if TRUE the graph gives a "dual scaling", if FALSE a "reciprocal scaling"} \item{clab.r}{a character size for row labels} \item{clab.c}{a character size for column labels} \item{csub}{a character size for the sub-titles, used with \code{par("cex")*csub}} \item{cpoi}{a character size for the points} \item{cet}{a coefficient for the size of segments in standard deviation} \item{\dots}{further arguments passed to or from other methods} } \value{return a data.frame with the scores, weights and factors of correspondences (non zero cells)} \details{ In a "reciprocal scaling", the reference score is a numeric code centred and normalized of the non zero cells of the array which both maximizes the variance of means by row and by column. The bars are drawn with half the length of this standard deviation. } \references{Thioulouse, J. and Chessel D. (1992) A method for reciprocal scaling of species tolerance and sample diversity. \emph{Ecology}, \bold{73}, 670--680. } \author{Daniel Chessel } \examples{ layout(matrix(c(1,1,2,3), 2, 2), resp = FALSE) data(aviurba) dd1 <- dudi.coa(aviurba$fau, scan = FALSE) score(dd1, clab.r = 0, clab.c = 0.75) recscal <- reciprocal.coa(dd1) head(recscal) abline(v = 1, lty = 2, lwd = 3) sco.distri(dd1$l1[,1], aviurba$fau) sco.distri(dd1$c1[,1], data.frame(t(aviurba$fau))) # 1 reciprocal scaling correspondence score -> species amplitude + sample diversity # 2 sample score -> averaging -> species amplitude # 3 species score -> averaging -> sample diversity layout(matrix(c(1,1,2,3), 2, 2), resp = FALSE) data(rpjdl) rpjdl1 <- dudi.coa(rpjdl$fau, scan = FALSE) score(rpjdl1, clab.r = 0, clab.c = 0.75) if (requireNamespace("MASS", quietly = TRUE)) { data(caith, package = "MASS") score(dudi.coa(caith, scan = FALSE), clab.r = 1.5, clab.c = 1.5, cpoi = 3) data(housetasks) score(dudi.coa(housetasks, scan = FALSE), clab.r = 1.25, clab.c = 1.25, csub = 0, cpoi = 3) } par(mfrow = c(1,1)) score(rpjdl1, dotchart = TRUE, clab.r = 0) } \keyword{multivariate} \keyword{hplot} ade4/man/seconde.Rd0000644000176200001440000000130012576021756013556 0ustar liggesusers\name{seconde} \alias{seconde} \docType{data} \title{Students and Subjects} \description{ The \code{seconde} data frame gives the marks of 22 students for 8 subjects. } \usage{data(seconde)} \format{ This data frame (22,8) contains the following columns: - HGEO: History and Geography - FRAN: French literature - PHYS: Physics - MATH: Mathematics - BIOL: Biology - ECON: Economy - ANGL: English language - ESPA: Spanish language } \source{ Personal communication } \examples{ data(seconde) if(adegraphicsLoaded()) { scatter(dudi.pca(seconde, scan = FALSE), row.plab.cex = 1, col.plab.cex = 1.5) } else { scatter(dudi.pca(seconde, scan = FALSE), clab.r = 1, clab.c = 1.5) } } \keyword{datasets} ade4/man/s.kde2d.Rd0000644000176200001440000000530213474205664013376 0ustar liggesusers\name{s.kde2d} \alias{s.kde2d} \title{ Scatter Plot with Kernel Density Estimate } \description{ performs a scatter of points without labels by a kernel Density Estimation in One or Two Dimensions } \usage{ s.kde2d(dfxy, xax = 1, yax = 2, pch = 20, cpoint = 1, neig = NULL, cneig = 2, xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0, 0), sub = "", csub = 1.25, possub = "bottomleft", pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) } \arguments{ \item{dfxy}{ a data frame with at least two coordinates } \item{xax}{ the column number for the x-axis } \item{yax}{ the column number for the y-axis} \item{pch}{ if \code{cpoint} > 0, an integer specifying the symbol or the single character to be used in plotting points } \item{cpoint}{ a character size for plotting the points, used with \code{par("cex")*cpoint}. If zero, no points are drawn } \item{neig}{ a neighbouring graph } \item{cneig}{ a size for the neighbouring graph lines used with par("lwd")*\code{cneig} } \item{xlim}{ the ranges to be encompassed by the x axis, if NULL, they are computed } \item{ylim}{ the ranges to be encompassed by the y axis, if NULL, they are computed } \item{grid}{ a logical value indicating whether a grid in the background of the plot should be drawn } \item{addaxes}{ a logical value indicating whether the axes should be plotted } \item{cgrid}{ a character size, parameter used with par("cex")* 'cgrid' to indicate the mesh of the grid } \item{include.origin}{ a logical value indicating whether the point "origin" should be belonged to the graph space } \item{origin}{ the fixed point in the graph space, for example c(0,0) the origin axes } \item{sub}{ a string of characters to be inserted as legend } \item{csub}{ a character size for the legend, used with \code{par("cex")*csub} } \item{possub}{ a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright") } \item{pixmap}{ an object \code{pixmap} displayed in the map background } \item{contour}{ a data frame with 4 columns to plot the contour of the map : each row gives a segment (x1,y1,x2,y2) } \item{area}{ a data frame of class 'area' to plot a set of surface units in contour } \item{add.plot}{ if TRUE uses the current graphics window } } \value{ The matched call. } \author{ Daniel Chessel } \examples{ # To recognize groups of points if(!adegraphicsLoaded()) { data(rpjdl) coa1 <- dudi.coa(rpjdl$fau, scannf = FALSE, nf = 3) s.kde2d(coa1$li) } } \keyword{multivariate} \keyword{hplot} ade4/man/vegtf.Rd0000644000176200001440000000372113175633655013265 0ustar liggesusers\name{vegtf} \alias{vegtf} \docType{data} \title{Vegetation in Trois-Fontaines} \description{ This data set contains abundance values (Braun-Blanquet scale) of 80 plant species for 337 sites. Data have been collected by Sonia Said and Francois Debias. } \usage{data(vegtf)} \format{\code{vegtf} is a list with the following components: \describe{ \item{veg}{a data.frame with the abundance values of 80 species (columns) in 337 sites (rows)} \item{xy}{a data.frame with the spatial coordinates of the sites} \item{area}{a data.frame (area) which define the boundaries of the study site} \item{sp.names}{a vector containing the species latin names} \item{nb}{a neighborhood object (class \code{nb} defined in package \code{spdep})} \item{Spatial}{an object of the class \code{SpatialPolygons} of \code{sp}, containing the map} }} \source{ Dray, S., Said, S. and Debias, F. (2008) Spatial ordination of vegetation data using a generalization of Wartenberg's multivariate spatial correlation. \emph{Journal of vegetation science}, \bold{19}, 45--56. } \examples{ if(requireNamespace("spdep", quietly = TRUE)) { data(vegtf) coa1 <- dudi.coa(vegtf$veg, scannf = FALSE) ms.coa1 <- multispati(coa1, listw = spdep::nb2listw(vegtf$nb), nfposi = 2, nfnega = 0, scannf = FALSE) summary(ms.coa1) plot(ms.coa1) if(adegraphicsLoaded()) { g1 <- s.value(vegtf$xy, coa1$li[, 1], Sp = vegtf$Spatial, pSp.col = "white", plot = FALSE) g2 <- s.value(vegtf$xy, ms.coa1$li[, 1], Sp = vegtf$Spatial, pSp.col = "white", plot = FALSE) g3 <- s.label(coa1$c1, plot = FALSE) g4 <- s.label(ms.coa1$c1, plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) s.value(vegtf$xy, coa1$li[, 1], area = vegtf$area, include.origin = FALSE) s.value(vegtf$xy, ms.coa1$li[, 1], area = vegtf$area, include.origin = FALSE) s.label(coa1$c1) s.label(ms.coa1$c1) } }} \keyword{datasets}ade4/man/s.class.Rd0000644000176200001440000001047012576021756013514 0ustar liggesusers\name{s.class} \alias{s.class} \title{Plot of factorial maps with representation of point classes} \description{ performs the scatter diagrams with representation of point classes. } \usage{ s.class(dfxy, fac, wt = rep(1, length(fac)), xax = 1, yax = 2, cstar = 1, cellipse = 1.5, axesell = TRUE, label = levels(fac), clabel = 1, cpoint = 1, pch = 20, col = rep(1, length(levels(fac))), xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, origin = c(0,0), include.origin = TRUE, sub = "", csub = 1, possub = "bottomleft", cgrid = 1, pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) } \arguments{ \item{dfxy}{a data frame containing the two columns for the axes} \item{fac}{a factor partitioning the rows of the data frame in classes} \item{wt}{a vector of the point weightings of the data frame used for computing the means (star centers) and the ellipses of dispersion} \item{xax}{the column number of x in \code{dfxy}} \item{yax}{the column number of y in \code{dfxy}} \item{cstar}{a number between 0 and 1 which defines the length of the star size} \item{cellipse}{a positive coefficient for the inertia ellipse size} \item{axesell}{a logical value indicating whether the ellipse axes should be drawn} \item{label}{a vector of strings of characters for the point labels} \item{clabel}{if not NULL, a character size for the labels, used with \code{par("cex")*clabel}} \item{cpoint}{a character size for plotting the points, used with \code{par("cex")*cpoint}. If zero, no points are drawn} \item{pch}{if \code{cpoint} > 0, an integer specifying the symbol or the single character to be used in plotting points} \item{col}{a vector of colors used to draw each class in a different color} \item{xlim}{the ranges to be encompassed by the x, if NULL they are computed} \item{ylim}{the ranges to be encompassed by the y, if NULL they are computed} \item{grid}{a logical value indicating whether a grid in the background of the plot should be drawn} \item{addaxes}{a logical value indicating whether the axes should be plotted} \item{origin}{the fixed point in the graph space, for example c(0,0) the origin axes} \item{include.origin}{a logical value indicating whether the point "origin" should be belonged to the graph space} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{cgrid}{a character size, parameter used with par("cex")* \code{cgrid} to indicate the mesh of the grid} \item{pixmap}{an object 'pixmap' displayed in the map background} \item{contour}{a data frame with 4 columns to plot the contour of the map : each row gives a segment (x1,y1,x2,y2)} \item{area}{a data frame of class 'area' to plot a set of surface units in contour} \item{add.plot}{if TRUE uses the current graphics window} } \value{ The matched call. } \author{Daniel Chessel} \examples{ if(!adegraphicsLoaded()) { xy <- cbind.data.frame(x = runif(200, -1, 1), y = runif(200, -1, 1)) posi <- factor(xy$x > 0) : factor(xy$y > 0) coul <- c("black", "red", "green", "blue") par(mfrow = c(2, 2)) s.class(xy, posi, cpoi = 2) s.class(xy, posi, cell = 0, cstar = 0.5) s.class(xy, posi, cell = 2, axesell = FALSE, csta = 0, col = coul) s.chull(xy, posi, cpoi = 1) par(mfrow = c(1, 1)) \dontrun{ data(banque) dudi1 <- dudi.acm(banque, scannf = FALSE) coul = rainbow(length(levels(banque[, 20]))) par(mfrow = c(2, 2)) s.label(dudi1$li, sub = "Factorial map from ACM", csub = 1.5, possub = "topleft") s.class(dudi1$li, banque[, 20], sub = names(banque)[20], possub = "bottomright", cell = 0, cstar = 0.5, cgrid = 0, csub = 1.5) s.class(dudi1$li, banque[, 20], csta = 0, cell = 2, cgrid = 0, clab = 1.5) s.class(dudi1$li, banque[, 20], sub = names(banque)[20], possub = "topright", cgrid = 0, col = coul) par(mfrow = c(1, 1)) par(mfrow = n2mfrow(ncol(banque))) for(i in 1:(ncol(banque))) s.class(dudi1$li, banque[, i], clab = 1.5, sub = names(banque)[i], csub = 2, possub = "topleft", cgrid = 0, csta = 0, cpoi = 0) s.label(dudi1$li, clab = 0, sub = "Common background") par(mfrow = c(1, 1)) } }} \keyword{multivariate} \keyword{hplot} ade4/man/table.cont.Rd0000644000176200001440000000451512576021756014202 0ustar liggesusers\name{table.cont} \alias{table.cont} \title{Plot of Contingency Tables} \description{ presents a graph for viewing contingency tables. } \usage{ table.cont(df, x = 1:ncol(df), y = 1:nrow(df), row.labels = row.names(df), col.labels = names(df), clabel.row = 1, clabel.col = 1, abmean.x = FALSE, abline.x = FALSE, abmean.y = FALSE, abline.y = FALSE, csize = 1, clegend = 0, grid = TRUE) } \arguments{ \item{df}{a data frame with only positive or null values} \item{x}{a vector of values to position the columns} \item{y}{a vector of values to position the rows} \item{row.labels}{a character vector for the row labels} \item{col.labels}{a character vetor for the column labels} \item{clabel.row}{a character size for the row labels} \item{clabel.col}{a character size for the column labels} \item{abmean.x}{a logical value indicating whether the column conditional means should be drawn} \item{abline.x}{a logical value indicating whether the regression line of y onto x should be plotted} \item{abmean.y}{a logical value indicating whether the row conditional means should be drawn} \item{abline.y}{a logical value indicating whether the regression line of x onto y should be plotted} \item{csize}{a coefficient for the square size of the values} \item{clegend}{if not NULL, a character size for the legend used with \code{par("cex")*clegend}} \item{grid}{a logical value indicating whether a grid in the background of the plot should be drawn} } \author{ Daniel Chessel } \examples{ data(chats) chatsw <- data.frame(t(chats)) chatscoa <- dudi.coa(chatsw, scann = FALSE) par(mfrow = c(2,2)) table.cont(chatsw, abmean.x = TRUE, csi = 2, abline.x = TRUE, clabel.r = 1.5, clabel.c = 1.5) table.cont(chatsw, abmean.y = TRUE, csi = 2, abline.y = TRUE, clabel.r = 1.5, clabel.c = 1.5) table.cont(chatsw, x = chatscoa$c1[,1], y = chatscoa$l1[,1], abmean.x = TRUE, csi = 2, abline.x = TRUE, clabel.r = 1.5, clabel.c = 1.5) table.cont(chatsw, x = chatscoa$c1[,1], y = chatscoa$l1[,1], abmean.y = TRUE, csi = 2, abline.y = TRUE, clabel.r = 1.5, clabel.c = 1.5) par(mfrow = c(1,1)) \dontrun{ data(rpjdl) w <- data.frame(t(rpjdl$fau)) wcoa <- dudi.coa(w, scann = FALSE) table.cont(w, abmean.y = TRUE, x = wcoa$c1[,1], y = rank(wcoa$l1[,1]), csi = 0.2, clabel.c = 0, row.labels = rpjdl$lalab, clabel.r = 0.75) }} \keyword{hplot} ade4/man/aminoacyl.Rd0000644000176200001440000000246513021372261014111 0ustar liggesusers\name{aminoacyl} \alias{aminoacyl} \docType{data} \title{Codon usage} \description{ \code{aminoacyl} is a list containing the codon counts of 36 genes encoding yeast aminoacyl-tRNA-synthetase(S.Cerevisiae). } \usage{data(aminoacyl)} \format{ \code{aminoacyl} is a list containing the 5 following objects: \describe{ \item{genes}{is a vector giving the gene names.} \item{localisation}{is a vector giving the cellular localisation of the proteins (M = mitochondrial, C = cytoplasmic, I = indetermined, CI = cyto and mito).} \item{codon}{is a vector containing the 64 triplets.} \item{AA}{is a factor giving the amino acid names for each codon.} \item{usage.codon}{is a dataframe containing the codon counts for each gene.} } } \source{ Data prepared by D. Charif \email{Delphine.Charif@versailles.inra.fr} starting from:\cr \url{http://www.expasy.org/sprot/} } \references{ Chiapello H., Olivier E., Landes-Devauchelle C., Nitschké P. and Risler J.L (1999) Codon usage as a tool to predict the cellular localisation of eukariotic ribosomal proteins and aminoacyl-tRNA synthetases. \emph{Nucleic Acids Res.}, \bold{27}, 14, 2848--2851. } \examples{ data(aminoacyl) aminoacyl$genes aminoacyl$usage.codon dudi.coa(aminoacyl$usage.codon, scannf = FALSE) } \keyword{datasets} ade4/man/kdisteuclid.Rd0000644000176200001440000000367113620262626014451 0ustar liggesusers\name{kdisteuclid} \alias{kdisteuclid} \title{a way to obtain Euclidean distance matrices} \description{ a way to obtain Euclidean distance matrices } \usage{ kdisteuclid(obj, method = c("lingoes", "cailliez", "quasi")) } \arguments{ \item{obj}{an object of class \code{kdist}} \item{method}{a method to convert a distance matrix in a Euclidean one} } \value{ returns an object of class \code{kdist} with all distances Euclidean. } \references{ Gower, J.C. and Legendre, P. (1986) Metric and Euclidean properties of dissimilarity coefficients. \emph{Journal of Classification}, \bold{3}, 5--48. Cailliez, F. (1983) The analytical solution of the additive constant problem. \emph{Psychometrika}, \bold{48}, 305--310. Lingoes, J.C. (1971) Somme boundary conditions for a monotone analysis of symmetric matrices. \emph{Psychometrika}, \bold{36}, 195--203. Legendre, P. and Anderson, M.J. (1999) Distance-based redundancy analysis: testing multispecies responses in multifactorial ecological experiments. \emph{Ecological Monographs}, \bold{69}, 1--24. Legendre, P., and L. Legendre. (1998) Numerical ecology, 2nd English edition edition. Elsevier Science BV, Amsterdam. } \author{ Daniel Chessel \cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \examples{ w <- c(0.8, 0.8, 0.377350269, 0.8, 0.377350269, 0.377350269) # see ref. w <- kdist(w) w1 <- c(kdisteuclid(kdist(w), "lingoes"), kdisteuclid(kdist(w), "cailliez"), kdisteuclid(kdist(w), "quasi")) print(w, print = TRUE) print(w1, print = TRUE) data(eurodist) par(mfrow = c(1, 3)) eu1 <- kdist(eurodist) # an object of class 'dist' plot(data.frame(unclass(c(eu1, kdisteuclid(eu1, "quasi")))), asp = 1) title(main = "Quasi") abline(0,1) plot(data.frame(unclass(c(eu1, kdisteuclid(eu1, "lingoes")))), asp = 1) title(main = "Lingoes") abline(0,1) plot(data.frame(unclass(c(eu1, kdisteuclid(eu1, "cailliez")))), asp = 1) title(main = "Cailliez") abline(0,1) } \keyword{multivariate} \keyword{utilities} ade4/man/originality.Rd0000644000176200001440000000407013021372261014461 0ustar liggesusers\name{originality} \alias{originality} \title{Originality of a species } \description{ computes originality values for species from an ultrametric phylogenetic tree. } \usage{ originality(phyl, method = 5) } \arguments{ \item{phyl}{an object of class phylog} \item{method}{a vector containing integers between 1 and 7. } } \details{ 1 = Vane-Wright et al.'s (1991) node-counting index 2 = May's (1990) branch-counting index 3 = Nixon and Wheeler's (1991) unweighted index, based on the sum of units in binary values 4 = Nixon and Wheeler's (1991) weighted index 5 = QE-based index 6 = Isaac et al. (2007) ED index 7 = Redding et al. (2006) Equal-split index } \value{ Returns a data frame with species in rows, and the selected indices of originality in columns. Indices are expressed as percentages. } \references{ Isaac, N.J.B., Turvey, S.T., Collen, B., Waterman, C. and Baillie, J.E.M. (2007) Mammals on the EDGE: conservation priorities based on threat and phylogeny. \emph{PloS ONE}, \bold{2}, e--296. Redding, D. and Mooers, A. (2006) Incorporating evolutionary measures into conservation prioritization. \emph{Conservation Biology}, \bold{20}, 1670--1678. Pavoine, S., Ollier, S. and Dufour, A.-B. (2005) Is the originality of a species measurable? \emph{Ecology Letters}, \bold{8}, 579--586. Vane-Wright, R.I., Humphries, C.J. and Williams, P.H. (1991). What to protect? Systematics and the agony of choice. \emph{Biological Conservation}, \bold{55}, 235--254. May, R.M. (1990). Taxonomy as destiny. \emph{Nature}, \bold{347}, 129--130. Nixon, K.C. and Wheeler, Q.D. (1992). Measures of phylogenetic diversity. In: \emph{Extinction and Phylogeny} (eds. Novacek, M.J. and Wheeler, Q.D.), 216--234, Columbia University Press, New York. } \author{ Sandrine Pavoine \email{pavoine@mnhn.fr} } \examples{ data(carni70) carni70.phy <- newick2phylog(carni70$tre) ori.tab <- originality(carni70.phy, 1:7) names(ori.tab) dotchart.phylog(carni70.phy, ori.tab, scaling = FALSE, yjoining = 0, ranging = FALSE, cleaves = 0, ceti = 0.5, csub = 0.7, cdot = 0.5) } \keyword{multivariate} ade4/man/s.traject.Rd0000644000176200001440000000567112576021756014052 0ustar liggesusers\name{s.traject} \alias{s.traject} \title{Trajectory Plot} \description{ performs the scatter diagram with trajectories. } \usage{ s.traject(dfxy, fac = factor(rep(1, nrow(dfxy))), ord = (1:length(fac)), xax = 1, yax = 2, label = levels(fac), clabel = 1, cpoint = 1, pch = 20, xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, edge = TRUE, origin = c(0,0), include.origin = TRUE, sub = "", csub = 1, possub = "bottomleft", cgrid = 1, pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) } \arguments{ \item{dfxy}{a data frame containing two columns for the axes} \item{fac}{a factor partioning the rows of the data frame in classes} \item{ord}{a vector of length equal to fac. The trajectory is drawn in an ascending order of the ord values} \item{xax}{the column number for the x-axis} \item{yax}{the column number for the y-axis} \item{label}{a vector of strings of characters for the point labels} \item{clabel}{if not NULL, a character size for the labels, used with \code{par("cex")*clabel}} \item{cpoint}{a character size for plotting the points, used with \code{par("cex")*cpoint}. If zero, no points are drawn} \item{pch}{if \code{cpoint} > 0, an integer specifying the symbol or the single character to be used in plotting points} \item{xlim}{the ranges to be encompassed by the x, if NULL they are computed} \item{ylim}{the ranges to be encompassed by the y, if NULL they are computed} \item{grid}{a logical value indicating whether a grid in the background of the plot should be drawn} \item{addaxes}{a logical value indicating whether the axes should be plotted} \item{edge}{if TRUE the arrows are plotted, otherwhise only the segments} \item{origin}{the fixed point in the graph space, for example c(0,0) the origin axes} \item{include.origin}{a logical value indicating whether the point "origin" should be belonged to the graph space} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{cgrid}{a character size, parameter used with \code{par("cex")*cgrid} to indicate the mesh of the grid} \item{pixmap}{aan object 'pixmap' displayed in the map background} \item{contour}{a data frame with 4 columns to plot the contour of the map : each row gives a segment (x1,y1,x2,y2)} \item{area}{a data frame of class 'area' to plot a set of surface units in contour} \item{add.plot}{if TRUE uses the current graphics window} } \value{ The matched call. } \author{Daniel Chessel} \examples{ if(!adegraphicsLoaded()) { rw <- function(a) { x <- 0 for(i in 1:49) x <- c(x, x[length(x)] + runif(1, -1, 1)) x } y <- unlist(lapply(1:5, rw)) x <- unlist(lapply(1:5, rw)) z <- gl(5, 50) s.traject(data.frame(x, y), z, edge = FALSE) }} \keyword{multivariate} \keyword{hplot} ade4/man/testdim.multiblock.Rd0000644000176200001440000000366213341514146015757 0ustar liggesusers\name{testdim.multiblock} \alias{testdim.multiblock} %- Also NEED an '\alias' for EACH other topic documented here. \title{Selection of the number of dimension by two-fold cross-validation for multiblock methods} \description{Function to perform a two-fold cross-validation to select the optimal number of dimensions of multiblock methods, \emph{i.e.}, multiblock principal component analysis with instrumental Variables or multiblock partial least squares} \usage{ \method{testdim}{multiblock}(object, nrepet = 100, quantiles = c(0.25, 0.75), ...) } \arguments{ \item{object}{an object of class multiblock created by \code{\link{mbpls}} or \code{\link{mbpcaiv}}} \item{nrepet}{integer indicating the number of repetitions} \item{quantiles}{a vector indicating the lower and upper quantiles to compute} \item{\dots}{other arguments to be passed to methods} } \value{An object of class \code{krandxval}} \references{Stone M. (1974) Cross-validatory choice and assessment of statistical predictions. \emph{Journal of the Royal Statistical Society}, \bold{36}, 111-147. Bougeard, S. and Dray S. (2018) Supervised Multiblock Analysis in R with the ade4 Package. \emph{Journal of Statistical Software}, \bold{86} (1), 1-17. \url{http://doi.org/10.18637/jss.v086.i01} } \author{Stéphanie Bougeard (\email{stephanie.bougeard@anses.fr}) and Stéphane Dray (\email{stephane.dray@univ-lyon1.fr})} \seealso{\code{\link{mbpcaiv}}, \code{\link{mbpls}}, \code{\link{randboot.multiblock}}, \code{\link{as.krandxval}}} \examples{ data(chickenk) Mortality <- chickenk[[1]] dudiY.chick <- dudi.pca(Mortality, center = TRUE, scale = TRUE, scannf = FALSE) ktabX.chick <- ktab.list.df(chickenk[2:5]) resmbpcaiv.chick <- mbpcaiv(dudiY.chick, ktabX.chick, scale = TRUE, option = "uniform", scannf = FALSE) ## nrepet should be higher for a real analysis test <- testdim(resmbpcaiv.chick, nrepet = 10) test if(adegraphicsLoaded()) plot(test) } \keyword{multivariate} ade4/man/westafrica.Rd0000644000176200001440000001031413040362670014261 0ustar liggesusers\name{westafrica} \alias{westafrica} \docType{data} \title{Freshwater fish zoogeography in west Africa} \description{ This data set contains informations about faunal similarities between river basins in West africa. } \usage{data(westafrica)} \format{ \code{westafrica} is a list containing the following objects : \describe{ \item{tab}{: a data frame with absence/presence of 268 species (rows) at 33 embouchures (columns)} \item{spe.names}{: a vector of string of characters with the name of species} \item{spe.binames}{: a data frame with the genus and species (columns) of the 256 species (rows)} \item{riv.names}{: a vector of string of characters with the name of rivers} \item{atlantic}{: a data frame with the coordinates of a polygon that represents the limits of atlantic (see example)} \item{riv.xy}{: a data frame with the coordinates of embouchures} \item{lines}{: a data frame with the coordinates of lines to complete the representation (see example)} \item{cadre}{: a data frame with the coordinates of points used to make the representation (see example)} }} \source{ Data provided by B. Hugueny \email{hugueny@mnhn.fr}. Paugy, D., Traoré, K. and Diouf, P.F. (1994) Faune ichtyologique des eaux douces d'Afrique de l'Ouest. In \emph{Diversité biologique des poissons des eaux douces et saumâtres d'Afrique. Synthèses géographiques}, Teugels, G.G., Guégan, J.F. and Albaret, J.J. (Editors). Annales du Musée Royal de l'Afrique Centrale, Zoologie, \bold{275}, Tervuren, Belgique, 35--66. Hugueny, B. (1989) \emph{Biogéographie et structure des peuplements de Poissons d'eau douce de l'Afrique de l'ouest : approches quantitatives}. Thèse de doctorat, Université Paris 7. } \references{ Hugueny, B., and Lévêque, C. (1994) Freshwater fish zoogeography in west Africa: faunal similarities between river basins. \emph{Environmental Biology of Fishes}, \bold{39}, 365--380. } \examples{ data(westafrica) if(!adegraphicsLoaded()) { s.label(westafrica$cadre, xlim = c(30, 500), ylim = c(50, 290), cpoi = 0, clab = 0, grid = FALSE, addax = 0) old.par <- par(no.readonly = TRUE) par(mar = c(0.1, 0.1, 0.1, 0.1)) rect(30, 0, 500, 290) polygon(westafrica$atlantic, col = "lightblue") points(westafrica$riv.xy, pch = 20, cex = 1.5) apply(westafrica$lines, 1, function(x) segments(x[1], x[2], x[3], x[4], lwd = 1)) apply(westafrica$riv.xy,1, function(x) segments(x[1], x[2], x[3], x[4], lwd = 1)) text(c(175, 260, 460, 420), c(275, 200, 250, 100), c("Senegal", "Niger", "Niger", "Volta")) par(srt = 270) text(westafrica$riv.xy$x2, westafrica$riv.xy$y2-10, westafrica$riv.names, adj = 0, cex = 0.75) par(old.par) rm(old.par) } # multivariate analysis afri.w <- data.frame(t(westafrica$tab)) afri.dist <- dist.binary(afri.w,1) afri.pco <- dudi.pco(afri.dist, scannf = FALSE, nf = 3) if(adegraphicsLoaded()) { G1 <- s1d.barchart(afri.pco$li[, 1:3], p1d.horizontal = FALSE, plabels.cex = 0) } else { par(mfrow = c(3, 1)) barplot(afri.pco$li[, 1]) barplot(afri.pco$li[, 2]) barplot(afri.pco$li[, 3]) } if(requireNamespace("spdep", quietly = TRUE)) { # multivariate spatial analysis afri.neig <- neig(n.line = 33) afri.nb <- neig2nb(afri.neig) afri.listw <- spdep::nb2listw(afri.nb) afri.ms <- multispati(afri.pco, afri.listw, scannf = FALSE, nfposi = 6, nfnega = 0) if(adegraphicsLoaded()) { G2 <- s1d.barchart(afri.ms$li[, 1:3], p1d.horizontal = FALSE, plabels.cex = 0) g31 <- s.label(afri.ms$li, plabels.cex = 0.75, ppoints.cex = 0, nb = afri.nb, plot = FALSE) g32 <- s.value(afri.ms$li, afri.ms$li[, 3], plot = FALSE) g33 <- s.value(afri.ms$li, afri.ms$li[, 4], plot = FALSE) g34 <- s.value(afri.ms$li, afri.ms$li[, 5], plot = FALSE) G3 <- ADEgS(list(g31, g32, g33, g34), layout = c(2, 2)) } else { par(mfrow = c(3, 1)) barplot(afri.ms$li[, 1]) barplot(afri.ms$li[, 2]) barplot(afri.ms$li[, 3]) par(mfrow = c(2, 2)) s.label(afri.ms$li, clab = 0.75, cpoi = 0, neig = afri.neig, cneig = 1.5) s.value(afri.ms$li, afri.ms$li[, 3]) s.value(afri.ms$li, afri.ms$li[, 4]) s.value(afri.ms$li, afri.ms$li[, 5]) } summary(afri.ms) } par(mfrow = c(1, 1)) plot(hclust(afri.dist, "ward.D"), h = -0.2) } \keyword{datasets} ade4/man/disc.Rd0000644000176200001440000000236412576021756013073 0ustar liggesusers\name{disc} \alias{disc} \title{Rao's dissimilarity coefficient} \description{ Calculates the root square of Rao's dissimilarity coefficient between samples. } \usage{ disc(samples, dis = NULL, structures = NULL) } \arguments{ \item{samples}{a data frame with elements as rows, samples as columns, and abundance, presence-absence or frequencies as entries} \item{dis}{an object of class \code{dist} containing distances or dissimilarities among elements. If \code{dis} is NULL, equidistances are used.} \item{structures}{a data frame containing, in the jth row and the kth column, the name of the group of level k to which the jth population belongs.} } \value{ Returns a list of objects of class \code{dist} } \references{ Rao, C.R. (1982) Diversity and dissimilarity coefficients: a unified approach. \emph{Theoretical Population Biology}, \bold{21}, 24--43. } \author{Sandrine Pavoine \email{pavoine@mnhn.fr} } \examples{ data(humDNAm) humDNA.dist <- disc(humDNAm$samples, sqrt(humDNAm$distances), humDNAm$structures) humDNA.dist is.euclid(humDNA.dist$samples) is.euclid(humDNA.dist$regions) \dontrun{ data(ecomor) dtaxo <- dist.taxo(ecomor$taxo) ecomor.dist <- disc(ecomor$habitat, dtaxo) ecomor.dist is.euclid(ecomor.dist) } } \keyword{multivariate} ade4/man/multispati.randtest.Rd0000644000176200001440000000333413177053572016164 0ustar liggesusers\name{multispati.randtest} \alias{multispati.randtest} \title{Multivariate spatial autocorrelation test (in C)} \description{ This function performs a multivariate autocorrelation test. } \usage{ multispati.randtest(dudi, listw, nrepet = 999, ...) } \arguments{ \item{dudi}{an object of class \code{dudi} for the duality diagram analysis} \item{listw}{an object of class \code{listw} for the spatial dependence of data observations} \item{nrepet}{the number of permutations} \item{\dots}{further arguments passed to or from other methods} } \details{ We note X the data frame with the variables, Q the column weights matrix and D the row weights matrix associated to the duality diagram \emph{dudi}. We note L the neighbouring weights matrix associated to \emph{listw}. This function performs a Monte-Carlo Test on the multivariate spatial autocorrelation index : \deqn{r = \frac{trace(X^{t}DLXQ)}{trace(X^{t}DXQ)}}{r = trace(t(X)DLXQ) / trace(t(X)DXQ)} } \value{ Returns an object of class \code{randtest} (randomization tests). } \references{ Smouse, P. E. and Peakall, R. (1999) Spatial autocorrelation analysis of individual multiallele and multilocus genetic structure. \emph{Heredity}, \bold{82}, 561--573. } \author{Daniel Chessel \cr Sébastien Ollier \email{sebastien.ollier@u-psud.fr} } \seealso{\code{\link{dudi}},\code{\link[spdep]{mat2listw}}} \examples{ if (requireNamespace("spdep", quietly = TRUE)) { data(mafragh) maf.listw <- spdep::nb2listw(neig2nb(mafragh$neig)) maf.pca <- dudi.pca(mafragh$env, scannf = FALSE) multispati.randtest(maf.pca, maf.listw) maf.pca.ms <- multispati(maf.pca, maf.listw, scannf = FALSE) plot(maf.pca.ms) } } \keyword{multivariate} \keyword{spatial} \keyword{nonparametric} ade4/man/aviurba.Rd0000644000176200001440000000357513021372261013571 0ustar liggesusers\name{aviurba} \alias{aviurba} \docType{data} \title{Ecological Tables Triplet} \description{ This data set is a list of information about 51 sites : bird species and environmental variables. \cr A data frame contains biological traits for each species. } \usage{data(aviurba)} \format{ This list contains the following objects: \describe{ \item{fau}{is a data frame 51 sites 40 bird species. } \item{mil}{is a data frame 51 sites 11 environmental variables (see details). } \item{traits}{is a data frame 40 species 4 biological traits (see details).} \item{species.names.fr}{is a vector of the species names in french. } \item{species.names.la}{is a vector of the species names in latin. } \item{species.family}{is a factor : the species families. } } } \details{ \code{aviurba$mil} contains for each site, 11 habitat attributes describing the degree of urbanization. The presence or absence of farms or villages, small buildings, high buildings, industry, fields, grassland, scrubby areas, deciduous woods, coniferous woods, noisy area are noticed. At least, the vegetation cover (variable 11) is a factor with 8 levels from a minimum cover (R5) up to a maximum (R100).\cr \code{aviurba$traits} contains four factors : feeding habit (insectivor, granivore, omnivore), feeding stratum (ground, aerial, foliage and scrub), breeding stratum (ground, building, scrub, foliage) and migration strategy (resident, migrant). } \source{ Dolédec, S., Chessel, D., Ter Braak,C. J. F. and Champely S. (1996) Matching species traits to environmental variables: a new three-table ordination method. \emph{Environmental and Ecological Statistics}, \bold{3}, 143--166. } \examples{ data(aviurba) a1 <- dudi.coa(aviurba$fau, scan = FALSE, nf=4) a2 <- dudi.acm(aviurba$mil, row.w = a1$lw, scan = FALSE, nf = 4) plot(coinertia(a1, a2, scan = FALSE)) } \keyword{datasets} ade4/man/cnc2003.Rd0000644000176200001440000000260712576021756013221 0ustar liggesusers\name{cnc2003} \alias{cnc2003} \docType{data} \title{Frequenting movie theaters in France in 2003} \description{ \code{cnc2003} is a data frame with 94 rows (94 departments from continental Metropolitan France)and 12 variables. } \usage{data(cnc2003)} \format{ This data frame contains the following variables: \describe{ \item{popu}{is the population department in million inhabitants. } \item{entr}{is the number of movie theater visitors in million. } \item{rece}{is the takings from ticket offices. } \item{sean}{is the number of proposed shows in thousands. } \item{comm}{is the number of equipped communes in movie theaters (units). } \item{etab}{is the number of active movie theaters (units). } \item{salle}{is the number of active screens. } \item{faut}{is the number of proposed seats. } \item{artes}{is the number of movie theaters offering "Art and Essay" movies. } \item{multi}{is the number of active multiplexes. } \item{depart}{is the name of the department. } \item{reg}{is the administrative region of the department. } } } \source{ National Center of Cinematography (CNC), september 2003\cr } \seealso{ This dataset is compatible with \code{elec88} and \code{presid2002}} \examples{ data(cnc2003) sco.quant(cnc2003$popu, cnc2003[,2:10], abline = TRUE, csub = 3) } \keyword{datasets} ade4/man/dagnelie.test.Rd0000644000176200001440000000661713176355462014705 0ustar liggesusers\name{dagnelie.test} \alias{dagnelie.test} \title{Dagnelie multinormality test} \usage{ dagnelie.test(x) } \arguments{ \item{x}{Multivariate data table (\code{matrix} or \code{data.frame}).} } \description{ Compute Dagnelie test of multivariate normality on a data table of n objects (rows) and p variables (columns), with n > (p+1). } \value{A list containing the following results: \item{Shapiro.Wilk}{W statistic and p-value} \item{dim}{dimensions of the data matrix, n and p} \item{rank}{the rank of the covariance matrix} \item{D}{Vector containing the Mahalanobis distances of the objects to the multivariate centroid} } \details{ Dagnelie's goodness-of-fit test of multivariate normality is applicable to multivariate data. Mahalanobis generalized distances are computed between each object and the multivariate centroid of all objects. Dagnelie’s approach is that, for multinormal data, the generalized distances should be normally distributed. The function computes a Shapiro-Wilk test of normality of the Mahalanobis distances; this is our improvement of Dagnelie’s method. The null hypothesis (H0) is that the data are multinormal, a situation where the Mahalanobis distances should be normally distributed. In that case, the test should not reject H0, subject to type I error at the selected significance level. \cr Numerical simulations by D. Borcard have shown that the test had correct levels of type I error for values of n between 3p and 8p, where n is the number of objects and p is the number of variables in the data matrix (simulations with 1 <= p <= 100). Outside that range of n values, the results were too liberal, meaning that the test rejected too often the null hypothesis of normality. For p = 2, the simulations showed the test to be valid for 6 <= n <= 13 and too liberal outside that range. If H0 is not rejected in a situation where the test is too liberal, the result is trustworthy.\cr Calculation of the Mahalanobis distances requires that n > p+1 (actually, n > rank+1). With fewer objects (n), all points are at equal Mahalanobis distances from the centroid in the resulting space, which has \code{min(rank,(n-1))} dimensions. For data matrices that happen to be collinear, the function uses \code{ginv} for inversion.\cr This test is not meant to be used with univariate data; in simulations, the type I error rate was higher than the 5\% significance level for all values of n. Function \code{shapiro.test} should be used in that situation. } \examples{ # Example 1: 2 variables, n = 100 n <- 100; p <- 2 mat <- matrix(rnorm(n*p), n, p) (out <- dagnelie.test(mat)) # Example 2: 10 variables, n = 50 n <- 50; p <- 10 mat <- matrix(rnorm(n*p), n, p) (out <- dagnelie.test(mat)) # Example 3: 10 variables, n = 100 n <- 100; p <- 10 mat <- matrix(rnorm(n*p), n, p) (out <- dagnelie.test(mat)) # Plot a histogram of the Mahalanobis distances hist(out$D) # Example 4: 10 lognormal random variables, n = 50 n <- 50; p <- 10 mat <- matrix(round(exp(rnorm((n*p), mean = 0, sd = 2.5))), n, p) (out <- dagnelie.test(mat)) # Plot a histogram of the Mahalanobis distances hist(out$D) } \references{ Dagnelie, P. 1975. L'analyse statistique a plusieurs variables. Les Presses agronomiques de Gembloux, Gembloux, Belgium.\cr Legendre, P. and L. Legendre. 2012. Numerical ecology, 3rd English edition. Elsevier Science BV, Amsterdam, The Netherlands.\cr } \author{ Daniel Borcard and Pierre Legendre } ade4/man/as.taxo.Rd0000644000176200001440000000261313021372261013505 0ustar liggesusers\name{as.taxo} \alias{as.taxo} \alias{dist.taxo} \title{Taxonomy} \description{ The function \code{as.taxo} creates an object of class \code{taxo} that is a sub-class of \code{data.frame}. Each column of the data frame must be a factor corresponding to a level \emph{j} of the taxonomy (genus, family, \dots). The levels of factor \emph{j} define some classes that must be completly included in classes of factor \emph{j+1}.\cr A factor with exactly one level is not allowed. A factor with exactly one individual in each level is not allowed. The function \code{dist.taxo} compute taxonomic distances. } \usage{ as.taxo(df) dist.taxo(taxo) } \arguments{ \item{df}{a data frame} \item{taxo}{a data frame of class \code{taxo}} } \value{ \code{as.taxo} returns a data frame of class \code{taxo}. \code{dist.taxo} returns a numeric of class \code{dist}. } \author{Daniel Chessel \cr Sébastien Ollier \email{sebastien.ollier@u-psud.fr} } \seealso{\code{\link{taxo2phylog}} to transform an object of class \code{taxo} into an object of class \code{phylog} } \examples{ data(taxo.eg) tax <- as.taxo(taxo.eg[[1]]) tax.phy <- taxo2phylog(as.taxo(taxo.eg[[1]]),add.tools=TRUE) par(mfrow = c(1,2)) plot(tax.phy, clabel.l = 1.25, clabel.n = 1.25, f = 0.75) plot(taxo2phylog(as.taxo(taxo.eg[[1]][sample(15),])), clabel.l = 1.25, clabel.n = 1.25, f = 0.75) par(mfrow = c(1,1)) all(dist.taxo(tax)==tax.phy$Wdist) } \keyword{manip} ade4/man/mantel.randtest.Rd0000644000176200001440000000167113050632301015232 0ustar liggesusers\name{mantel.randtest} \alias{mantel.randtest} \title{Mantel test (correlation between two distance matrices (in C).) } \description{ Performs a Mantel test between two distance matrices. } \usage{ mantel.randtest(m1, m2, nrepet = 999, ...) } \arguments{ \item{m1}{an object of class \code{dist}} \item{m2}{an object of class \code{dist}} \item{nrepet}{the number of permutations} \item{\dots}{further arguments passed to or from other methods} } \value{ an object of class \code{randtest} (randomization tests) } \references{Mantel, N. (1967) The detection of disease clustering and a generalized regression approach. \emph{Cancer Research}, \bold{27}, 209--220. } \author{Jean Thioulouse \email{Jean.Thioulouse@univ-lyon1.fr}} \examples{ data(yanomama) gen <- quasieuclid(as.dist(yanomama$gen)) geo <- quasieuclid(as.dist(yanomama$geo)) plot(r1 <- mantel.randtest(geo,gen), main = "Mantel's test") r1 } \keyword{array} \keyword{nonparametric} ade4/man/randboot.multiblock.Rd0000644000176200001440000000376213341514053016114 0ustar liggesusers\name{randboot.multiblock} \alias{randboot.multiblock} \title{Bootstraped simulations for multiblock methods} \description{Function to perform bootstraped simulations for multiblock principal component analysis with instrumental variables or multiblock partial least squares, in order to get confidence intervals for some parameters, \emph{i.e.}, regression coefficients, variable and block importances} \usage{ \method{randboot}{multiblock}(object, nrepet = 199, optdim, ...) } \arguments{ \item{object}{an object of class multiblock created by \code{\link{mbpls}} or \code{\link{mbpcaiv}}} \item{nrepet}{integer indicating the number of repetitions} \item{optdim}{integer indicating the optimal number of dimensions, \emph{i.e.}, the optimal number of global components to be introduced in the model} \item{\dots}{other arguments to be passed to methods} } \value{A list containing objects of class \code{krandboot}} \references{Carpenter, J. and Bithell, J. (2000) Bootstrap confidence intervals: when, which, what? A practical guide for medical statisticians.\emph{Statistics in medicine}, 19, 1141-1164. Bougeard, S. and Dray S. (2018) Supervised Multiblock Analysis in R with the ade4 Package. \emph{Journal of Statistical Software}, \bold{86} (1), 1-17. \url{http://doi.org/10.18637/jss.v086.i01}} \author{Stéphanie Bougeard (\email{stephanie.bougeard@anses.fr}) and Stéphane Dray (\email{stephane.dray@univ-lyon1.fr})} \seealso{\code{\link{mbpcaiv}}, \code{\link{mbpls}}, \code{\link{testdim.multiblock}}, \code{\link{as.krandboot}}} \examples{ data(chickenk) Mortality <- chickenk[[1]] dudiY.chick <- dudi.pca(Mortality, center = TRUE, scale = TRUE, scannf = FALSE) ktabX.chick <- ktab.list.df(chickenk[2:5]) resmbpcaiv.chick <- mbpcaiv(dudiY.chick, ktabX.chick, scale = TRUE, option = "uniform", scannf = FALSE, nf = 4) ## nrepet should be higher for a real analysis test <- randboot(resmbpcaiv.chick, optdim = 4, nrepet = 10) test if(adegraphicsLoaded()) plot(test$bipc) } \keyword{multivariate} ade4/man/randboot.Rd0000644000176200001440000000335313047116774013757 0ustar liggesusers\name{randboot} \alias{as.krandboot} \alias{print.krandboot} \alias{as.randboot} \alias{print.randboot} \alias{randboot} \title{Bootstrap simulations} \description{Functions and classes to manage outputs of bootstrap simulations for one (class \code{randboot}) or several (class \code{krandboot}) statistics} \usage{ as.krandboot(obs, boot, quantiles = c(0.025, 0.975), names = colnames(boot), call = match.call()) \method{print}{krandboot}(x, ...) as.randboot(obs, boot, quantiles = c(0.025, 0.975), call = match.call()) \method{print}{randboot}(x, ...) randboot(object, ...) } \arguments{ \item{obs}{a value (class \code{randboot}) or a vector (class \code{krandboot}) with observed statistics} \item{boot}{a vector (class \code{randboot}) or a matrix (class \code{krandboot}) with the bootstrap values of the statistics} \item{quantiles}{a vector indicating the lower and upper quantiles to compute} \item{names}{a vector of names for the statistics} \item{call}{the matching call} \item{x}{an object of class \code{randboot} or \code{krandboot}} \item{object}{an object on which bootstrap should be perform} \item{\dots}{other arguments to be passed to methods} } \value{an object of class \code{randboot} or \code{krandboot}} \references{Carpenter, J. \& Bithell, J. (2000) Bootstrap confidence intervals: when, which, what? A practical guide for medical statisticians.\emph{Statistics in medicine}, 19, 1141-1164} \author{Stéphane Dray (\email{stephane.dray@univ-lyon1.fr})} \seealso{\code{\link{randboot.multiblock}}} \examples{ ## an example corresponding to 10 statistics and 100 repetitions bt <- as.krandboot(obs = rnorm(10), boot = matrix(rnorm(1000), nrow = 100)) bt if(adegraphicsLoaded()) plot(bt) } \keyword{htest} ade4/man/statico.Rd0000644000176200001440000000403413021372261013575 0ustar liggesusers\name{statico} \alias{statico} \title{STATIS and Co-Inertia : Analysis of a series of paired ecological tables} \description{ Does the analysis of a series of pairs of ecological tables. This function uses Partial Triadic Analysis (\link{pta}) and \link{ktab.match2ktabs} to do the computations. } \usage{ statico(KTX, KTY, scannf = TRUE) } \arguments{ \item{KTX}{an objet of class ktab} \item{KTY}{an objet of class ktab} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} } \details{ This function takes 2 ktabs and crosses each pair of tables of these ktabs with the function \link{ktab.match2ktabs}. It then does a partial triadic analysis on this new ktab with \link{pta}. } \value{ a list of class ktab, subclass kcoinertia. See \link{ktab} } \references{ Thioulouse J. (2011). Simultaneous analysis of a sequence of paired ecological tables: a comparison of several methods. \emph{Annals of Applied Statistics}, \bold{5}, 2300-2325. Thioulouse J., Simier M. and Chessel D. (2004). Simultaneous analysis of a sequence of paired ecological tables. \emph{Ecology} \bold{85}, 272-283. Simier, M., Blanc L., Pellegrin F., and Nandris D. (1999). Approche simultanée de K couples de tableaux : Application a l'étude des relations pathologie végétale - environnement. \emph{Revue de Statistique Appliquée}, \bold{47}, 31-46. } \author{Jean Thioulouse \email{jean.thioulouse@univ-lyon1.fr}} \section{WARNING }{ IMPORTANT : KTX and KTY must have the same k-tables structure, the same number of columns, and the same column weights. } \examples{ data(meau) wit1 <- withinpca(meau$env, meau$design$season, scan = FALSE, scal = "total") spepca <- dudi.pca(meau$spe, scale = FALSE, scan = FALSE, nf = 2) wit2 <- wca(spepca, meau$design$season, scan = FALSE, nf = 2) kta1 <- ktab.within(wit1, colnames = rep(c("S1","S2","S3","S4","S5","S6"), 4)) kta2 <- ktab.within(wit2, colnames = rep(c("S1","S2","S3","S4","S5","S6"), 4)) statico1 <- statico(kta1, kta2, scan = FALSE) plot(statico1) kplot(statico1) } \keyword{multivariate} ade4/man/scatter.fca.Rd0000644000176200001440000000255713021372261014334 0ustar liggesusers\name{scatter.fca} \alias{scatter.fca} \title{Plot of the factorial maps for a fuzzy correspondence analysis} \description{ performs the scatter diagrams of a fuzzy correspondence analysis. } \usage{ \method{scatter}{fca}(x, xax = 1, yax = 2, clab.moda = 1, labels = names(x$tab), sub = NULL, csub = 2, \dots) } \arguments{ \item{x}{an object of class \code{fca}} \item{xax}{the column number for the x-axis} \item{yax}{the column number for the y-axis} \item{clab.moda}{the character size to write the modalities} \item{labels}{a vector of strings of characters for the labels of the modalities} \item{sub}{a vector of strings of characters to be inserted as legend in each figure} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{\dots}{further arguments passed to or from other methods} } \author{Daniel Chessel } \references{ Chevenet, F., Dolédec, S. and Chessel, D. (1994) A fuzzy coding approach for the analysis of long-term ecological data. \emph{Freshwater Biology}, \bold{31}, 295--309. } \examples{ data(coleo) coleo.fuzzy <- prep.fuzzy.var(coleo$tab, coleo$col.blocks) fca1 <- dudi.fca(coleo.fuzzy, sca = FALSE, nf = 3) if(adegraphicsLoaded()) { plot(fca1) } else { scatter(fca1, labels = coleo$moda.names, clab.moda = 1.5, sub = names(coleo$col.blocks), csub = 3) } } \keyword{multivariate} \keyword{hplot} ade4/man/baran95.Rd0000644000176200001440000000563213021372261013375 0ustar liggesusers\name{baran95} \alias{baran95} \docType{data} \title{African Estuary Fishes} \description{ This data set is a list containing relations between sites and fish species linked to dates. } \usage{data(baran95)} \format{ This list contains the following objects: \describe{ \item{fau}{is a data frame 95 seinings and 33 fish species. } \item{plan}{is a data frame 2 factors : date and site. The \code{date} has 6 levels (april 1993, june 1993, august 1993, october 1993, december 1993 and february 1994) and the \code{sites} are defined by 4 distances to the Atlantic Ocean (km03, km17, km33 and km46). } \item{species.names}{is a vector of species latin names. } } } \source{ Baran, E. (1995) \emph{Dynamique spatio-temporelle des peuplements de Poissons estuariens en Guinée (Afrique de l'Ouest)}. Thèse de Doctorat, Université de Bretagne Occidentale. Data collected by net fishing sampling in the Fatala river estuary. } \references{ See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps027.pdf} (in French). } \examples{ data(baran95) w <- dudi.pca(log(baran95$fau + 1), scal = FALSE, scann = FALSE, nf = 3) w1 <- wca(w, baran95$plan$date, scann = FALSE) fatala <- ktab.within(w1) stat1 <- statis(fatala, scan = FALSE, nf = 3) mfa1 <- mfa(fatala, scan = FALSE, nf = 3) if(adegraphicsLoaded()) { g1 <- s.class(stat1$C.Co, baran95$plan$site, facets = baran95$plan$date, pellipses.axes.draw = FALSE, ppoints.cex = 0.5, plot = FALSE) n1 <- length(g1@ADEglist) g2 <- ADEgS(lapply(1:n1, function(i) s.label(stat1$C.Co, plabels.cex = 0, ppoints.cex = 0.5, plot = FALSE)), positions = g1@positions, plot = FALSE) G1 <- superpose(g2, g1, plot = TRUE) G2 <- kplot(stat1, arrow = FALSE, traject = FALSE, class = baran95$plan$site, col.plabels.cex = 0, ppoints.cex = 0.5) g3 <- s.class(mfa1$co, baran95$plan$site, facets = baran95$plan$date, pellipses.axes.draw = FALSE, ppoints.cex = 0.5, plot = FALSE) n2 <- length(g3@ADEglist) g4 <- ADEgS(lapply(1:n2, function(i) s.label(mfa1$co, plabels.cex = 0, ppoints.cex = 0.5, plot = FALSE)), positions = g3@positions, plot = FALSE) G3 <- superpose(g4, g3, plot = TRUE) } else { par(mfrow = c(3, 2)) w2 <- split(stat1$C.Co, baran95$plan$date) w3 <- split(baran95$plan$site, baran95$plan$date) for (j in 1:6) { s.label(stat1$C.Co[,1:2], clab = 0, sub = tab.names(fatala)[j], csub = 3) s.class(w2[[j]][, 1:2], w3[[j]], clab = 2, axese = FALSE, add.plot = TRUE) } par(mfrow = c(1, 1)) kplot(stat1, arrow = FALSE, traj = FALSE, clab = 2, uni = TRUE, class = baran95$plan$site) #simpler par(mfrow = c(3, 2)) w4 <- split(mfa1$co, baran95$plan$date) for (j in 1:6) { s.label(mfa1$co[, 1:2], clab = 0, sub = tab.names(fatala)[j], csub = 3) s.class(w4[[j]][, 1:2], w3[[j]], clab = 2, axese = FALSE, add.plot = TRUE) } par(mfrow = c(1, 1)) } } \keyword{datasets} ade4/man/orthobasis.Rd0000644000176200001440000001215113175633655014324 0ustar liggesusers\name{orthobasis} \alias{orthobasis} \alias{orthobasis.neig} \alias{orthobasis.line} \alias{orthobasis.circ} \alias{orthobasis.mat} \alias{orthobasis.haar} \alias{print.orthobasis} \alias{is.orthobasis} \alias{summary.orthobasis} \alias{plot.orthobasis} \title{Orthonormal basis for orthonormal transform} \description{ These functions returns object of class \code{'orthobasis'} that contains data frame defining an orthonormal basis. \code{orthobasic.neig} returns the eigen vectors of the matrix N-M where M is the symmetric \emph{n} by \emph{n} matrix of the between-sites neighbouring graph and N is the diagonal matrix of neighbour numbers. \cr \code{orthobasis.line} returns the analytical solution for the linear neighbouring graph. \cr \code{orthobasic.circ} returns the analytical solution for the circular neighbouring graph. \cr \code{orthobsic.mat} returns the eigen vectors of the general link matrix M. \cr \code{orthobasis.haar} returns wavelet haar basis. } \usage{ orthobasis.neig(neig) orthobasis.line(n) orthobasis.circ(n) orthobasis.mat(mat, cnw=TRUE) orthobasis.haar(n) \method{print}{orthobasis}(x,..., nr = 6, nc = 4) \method{plot}{orthobasis}(x,...) \method{summary}{orthobasis}(object,...) is.orthobasis(x) } \arguments{ \item{neig}{is an object of class \code{neig}} \item{n}{is an integer that defines length of vectors} \item{mat}{is a \emph{n} by \emph{n} phylogenetic or spatial link matrix} \item{cnw}{if TRUE, the matrix of the neighbouring graph is modified to give Constant Neighbouring Weights} \item{x, object}{is an object of class \code{orthobasis}} \item{nr, nc}{the number of rows and columns to be printed} \item{\dots}{: further arguments passed to or from other methods} } \value{ All the functions return an object of class \code{orthobasis} containing a data frame. This data frame defines an orthonormal basis with various attributes: \cr \item{names}{names of the vectors} \item{row.names}{row names of the data frame} \item{class}{class} \item{values}{optional associated eigenvalues} \item{weights}{weights for the rows} \item{call}{: call} } \references{ Misiti, M., Misiti, Y., Oppenheim, G. and Poggi, J.M. (1993) Analyse de signaux classiques par décomposition en ondelettes. \emph{Revue de Statistique Appliquée}, \bold{41}, 5--32. Cornillon, P.A. (1998) \emph{Prise en compte de proximités en analyse factorielle et comparative}. Thèse, Ecole Nationale Supérieure Agronomique, Montpellier. } \author{Sébastien Ollier \email{sebastien.ollier@u-psud.fr} \cr Daniel Chessel } \note{the function \code{orthobasis.haar} uses function \code{\link[waveslim]{wavelet.filter}} from package waveslim.} \seealso{ \code{\link{gridrowcol}} that defines an orthobasis for square grid, \code{\link{phylog}} that defines an orthobasis for phylogenetic tree, \code{\link[adephylo]{orthogram}} and \code{\link{mld}} } \examples{ # a 2D spatial orthobasis w <- gridrowcol(8, 8) if(adegraphicsLoaded()) { g1 <- s.value(w$xy, w$orthobasis[, 1:16], pleg.drawKey = FALSE, pgri.text.cex = 0, ylim = c(0, 10), porigin.include = FALSE, paxes.draw = FALSE) g2 <- s1d.barchart(attr(w$orthobasis, "values"), p1d.horizontal = FALSE, labels = names(attr(w$orthobasis, "values")), plabels.cex = 0.7) } else { par(mfrow = c(4, 4)) for(k in 1:16) s.value(w$xy, w$orthobasis[, k], cleg = 0, csi = 2, incl = FALSE, addax = FALSE, sub = k, csub = 4, ylim = c(0, 10), cgri = 0) par(mfrow = c(1, 1)) barplot(attr(w$orthobasis, "values")) } # Haar 1D orthobasis w <- orthobasis.haar(32) par(mfrow = c(8, 4)) par(mar = c(0.1, 0.1, 0.1, 0.1)) for (k in 1:31) { plot(w[, k], type = "S", xlab = "", ylab = "", xaxt = "n", yaxt = "n", xaxs = "i", yaxs = "i", ylim = c(-4.5, 4.5)) points(w[, k], type = "p", pch = 20, cex = 1.5) } # a 1D orthobasis w <- orthobasis.line(n = 33) par(mfrow = c(8, 4)) par(mar = c(0.1, 0.1, 0.1, 0.1)) for (k in 1:32) { plot(w[, k], type = "l", xlab = "", ylab = "", xaxt = "n", yaxt = "n", xaxs = "i", yaxs = "i", ylim = c(-1.5, 1.5)) points(w[, k], type = "p", pch = 20, cex = 1.5) } if(adegraphicsLoaded()) { s1d.barchart(attr(w, "values"), p1d.horizontal = FALSE, labels = names(attr(w, "values")), plab.cex = 0.7) } else { par(mfrow = c(1, 1)) barplot(attr(w, "values")) } w <- orthobasis.circ(n = 26) #par(mfrow = c(5, 5)) #par(mar = c(0.1, 0.1, 0.1, 0.1)) # for (k in 1:25) # dotcircle(w[, k], xlim = c(-1.5, 1.5), cleg = 0) par(mfrow = c(1, 1)) #barplot(attr(w, "values")) \dontrun{ # a spatial orthobasis data(mafragh) w <- orthobasis.neig(mafragh$neig) if(adegraphicsLoaded()) { s.value(mafragh$xy, w[, 1:8], plegend.drawKey = FALSE) s1d.barchart(attr(w, "values"), p1d.horizontal = FALSE) } else { par(mfrow = c(4, 2)) for(k in 1:8) s.value(mafragh$xy, w[, k], cleg = 0, sub = as.character(k), csub = 3) par(mfrow = c(1, 1)) barplot(attr(w, "values")) } # a phylogenetic orthobasis data(njplot) phy <- newick2phylog(njplot$tre) wA <- phy$Ascores wW <- phy$Wscores table.phylog(phylog = phy, wA, clabel.row = 0, clabel.col = 0.5) table.phylog(phylog = phy, wW, clabel.row = 0, clabel.col = 0.5) }} \keyword{spatial} \keyword{ts} ade4/man/statis.Rd0000644000176200001440000000546712576021756013467 0ustar liggesusers\name{statis} \alias{statis} \alias{print.statis} \alias{plot.statis} \title{STATIS, a method for analysing K-tables} \description{ performs a STATIS analysis of a \code{ktab} object. } \usage{ statis(X, scannf = TRUE, nf = 3, tol = 1e-07) \method{plot}{statis}(x, xax = 1, yax = 2, option = 1:4, \dots) \method{print}{statis}(x, \dots) } \arguments{ \item{X}{an object of class 'ktab'} \item{scannf}{a logical value indicating whether the number of kept axes for the compromise should be asked} \item{nf}{if \code{scannf} FALSE, an integer indicating the number of kept axes for the compromise} \item{tol}{a tolerance threshold to test whether the distance matrix is Euclidean : an eigenvalue is considered positive if it is larger than \code{-tol*lambda1} where \code{lambda1} is the largest eigenvalue} \item{x}{an object of class 'statis'} \item{xax, yax}{the numbers of the x-axis and the y-axis} \item{option}{an integer between 1 and 4, otherwise the 4 components of the plot are dispayed} \item{\dots}{further arguments passed to or from other methods} } \value{ \code{statis} returns a list of class 'statis' containing : \item{RV}{a matrix with the all RV coefficients} \item{RV.eig}{a numeric vector with all the eigenvalues} \item{RV.coo}{a data frame with the array scores} \item{tab.names}{a vector of characters with the names of the arrays} \item{RV.tabw}{a numeric vector with the array weigths} \item{C.nf}{an integer indicating the number of kept axes} \item{C.rank}{an integer indicating the rank of the analysis} \item{C.li}{a data frame with the row coordinates} \item{C.Co}{a data frame with the column coordinates} \item{C.T4}{a data frame with the principal vectors (for each table)} \item{TL}{a data frame with the factors (not used)} \item{TC}{a data frame with the factors for Co} \item{T4}{a data frame with the factors for T4} } \references{ Lavit, C. (1988) \emph{Analyse conjointe de tableaux quantitatifs}, Masson, Paris.\cr\cr Lavit, C., Escoufier, Y., Sabatier, R. and Traissac, P. (1994) The ACT (Statis method). \emph{Computational Statistics and Data Analysis}, \bold{18}, 97--119. } \author{ Daniel Chessel } \examples{ data(jv73) kta1 <- ktab.within(withinpca(jv73$morpho, jv73$fac.riv, scann = FALSE)) statis1 <- statis(kta1, scann = FALSE) plot(statis1) dudi1 <- dudi.pca(jv73$poi, scann = FALSE, scal = FALSE) wit1 <- wca(dudi1, jv73$fac.riv, scann = FALSE) kta3 <- ktab.within(wit1) data(jv73) statis3 <- statis(kta3, scann = FALSE) plot(statis3) if(adegraphicsLoaded()) { s.arrow(statis3$C.li, pgrid.text.cex = 0) kplot(statis3, traj = TRUE, arrow = FALSE, plab.cex = 0, psub.cex = 3, ppoi.cex = 3) } else { s.arrow(statis3$C.li, cgrid = 0) kplot(statis3, traj = TRUE, arrow = FALSE, unique = TRUE, clab = 0, csub = 3, cpoi = 3) } statis3 } \keyword{multivariate} ade4/man/trichometeo.Rd0000644000176200001440000000270113040362670014454 0ustar liggesusers\name{trichometeo} \alias{trichometeo} \docType{data} \title{Pair of Ecological Data} \description{ This data set gives for trappong nights informations about species and meteorological variables. } \usage{data(trichometeo)} \format{ \code{trichometeo} is a list of 3 components. \describe{ \item{fau}{is a data frame with 49 rows (trapping nights) and 17 species.} \item{meteo}{is a data frame with 49 rows and 11 meteorological variables.} \item{cla}{is a factor of 12 levels for the definition of the consecutive night groups} } } \source{ Data from P. Usseglio-Polatera } \references{ Usseglio-Polatera, P. and Auda, Y. (1987) Influence des facteurs météorologiques sur les résultats de piégeage lumineux. \emph{Annales de Limnologie}, \bold{23}, 65--79. (code des espèces p. 76) See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps034.pdf} (in French). } \examples{ data(trichometeo) faulog <- log(trichometeo$fau + 1) pca1 <- dudi.pca(trichometeo$meteo, scan = FALSE) niche1 <- niche(pca1, faulog, scan = FALSE) if(adegraphicsLoaded()) { g1 <- s.distri(niche1$ls, faulog, plab.cex = 0.6, ellipseSize = 0, starSize = 0.3, plot = FALSE) g2 <- s.arrow(7 * niche1$c1, plab.cex = 1, plot = FALSE) G <- superpose(g1, g2, plot = TRUE) } else { s.label(niche1$ls, clab = 0) s.distri(niche1$ls, faulog, clab = 0.6, add.p = TRUE, cell = 0, csta = 0.3) s.arrow(7 * niche1$c1, clab = 1, add.p = TRUE) }} \keyword{datasets} ade4/man/randtest.Rd0000644000176200001440000000563713544647657014015 0ustar liggesusers\name{randtest} \alias{randtest} \alias{as.randtest} \alias{plot.randtest} \alias{print.randtest} \title{Class of the Permutation Tests (in C).} \description{\code{randtest} is a generic function. It proposes methods for the following objects \code{between}, \code{discrimin}, \code{coinertia} \code{\dots} } \usage{ randtest(xtest, \dots) as.randtest(sim, obs, alter = c("greater", "less", "two-sided"), output = c("light", "full"), call = match.call(), subclass = NULL) \method{plot}{randtest}(x, nclass = 10, coeff = 1, \dots) \method{print}{randtest}(x, \dots) } \arguments{ \item{xtest}{an object used to select a method} \item{x}{an object of class \code{randtest}} \item{\dots}{further arguments passed to or from other methods; in \code{plot.randtest} to \code{hist}} \item{output}{a character string specifying if all simulations should be stored (\code{"full"}). This was the default until \code{ade4} 1.7-5. Now, by default (\code{"light"}), only the distribution of simulated values is stored in element \code{plot} as produced by the \code{hist} function.} \item{nclass}{a number of intervals for the histogram. Ignored if object output is \code{"light"}} \item{coeff}{to fit the magnitude of the graph. Ignored if object output is \code{"light"}} \item{sim}{a numeric vector of simulated values} \item{obs}{a numeric vector of an observed value} \item{alter}{a character string specifying the alternative hypothesis, must be one of "greater" (default), "less" or "two-sided"} \item{call}{a call order} \item{subclass}{a character vector indicating the subclasses associated to the returned object} } \value{ \code{as.randtest} returns a list of class \code{randtest}.\cr \code{plot.randtest} draws the simulated values histograms and the position of the observed value. } \details{ If the alternative hypothesis is "greater", a p-value is estimated as: (number of random values equal to or greater than the observed one + 1)/(number of permutations + 1). The null hypothesis is rejected if the p-value is less than the significance level. If the alternative hypothesis is "less", a p-value is estimated as: (number of random values equal to or less than the observed one + 1)/(number of permutations + 1). Again, the null hypothesis is rejected if the p-value is less than the significance level. Lastly, if the alternative hypothesis is "two-sided", the estimation of the p-value is equivalent to the one used for "greater" except that random and observed values are firstly centered (using the average of random values) and secondly transformed to their absolute values. Note that this is only suitable for symmetric random distribution. } \seealso{\link{mantel.randtest}, \link{procuste.randtest}, \link{rtest}} \examples{ par(mfrow = c(2,2)) for (x0 in c(2.4,3.4,5.4,20.4)) { l0 <- as.randtest(sim = rnorm(200), obs = x0) print(l0) plot(l0,main=paste("p.value = ", round(l0$pvalue, dig = 5))) } par(mfrow = c(1,1)) } \keyword{methods} ade4/man/tortues.Rd0000644000176200001440000000151712576021756013655 0ustar liggesusers\name{tortues} \alias{tortues} \docType{data} \title{Morphological Study of the Painted Turtle} \description{ This data set gives a morphological description (4 characters) of 48 turtles. } \usage{data(tortues)} \format{ a data frame with 48 rows and 4 columns (length (mm), maximum width(mm), height (mm), gender). } \source{ Jolicoeur, P. and Mosimann, J. E. (1960) Size and shape variation in the painted turtle. A principal component analysis. \emph{Growth}, \bold{24}, 339--354. } \examples{ data(tortues) xyz <- as.matrix(tortues[, 1:3]) ref <- -svd(xyz)$u[, 1] pch0 <- c(1, 20)[as.numeric(tortues$sexe)] plot(ref, xyz[, 1], ylim = c(40, 180), pch = pch0) abline(lm(xyz[, 1] ~ -1 + ref)) points(ref,xyz[, 2], pch = pch0) abline(lm(xyz[, 2] ~ -1 + ref)) points(ref,xyz[, 3], pch = pch0) abline(lm(xyz[, 3] ~ -1 + ref)) } \keyword{datasets} ade4/man/amova.Rd0000644000176200001440000000360312576021756013251 0ustar liggesusers\name{amova} \alias{amova} \alias{print.amova} \title{Analysis of molecular variance} \description{ The analysis of molecular variance tests the differences among population and/or groups of populations in a way similar to ANOVA. It includes evolutionary distances among alleles. } \usage{ amova(samples, distances, structures) \method{print}{amova}(x, full = FALSE, \dots) } \arguments{ \item{samples}{a data frame with haplotypes (or genotypes) as rows, populations as columns and abundance as entries} \item{distances}{an object of class \code{dist} computed from Euclidean distance. If \code{distances} is null, equidistances are used.} \item{structures}{a data frame containing, in the jth row and the kth column, the name of the group of level k to which the jth population belongs} \item{x}{an object of class \code{amova}} \item{full}{a logical value indicating whether the original data ('distances', 'samples', 'structures') should be printed} \item{\dots}{further arguments passed to or from other methods} } \value{ Returns a list of class \code{amova} \item{call}{call} \item{results}{a data frame with the degrees of freedom, the sums of squares, and the mean squares. Rows represent levels of variability.} \item{componentsofcovariance}{a data frame containing the components of covariance and their contribution to the total covariance} \item{statphi}{a data frame containing the phi-statistics} } \references{ Excoffier, L., Smouse, P.E. and Quattro, J.M. (1992) Analysis of molecular variance inferred from metric distances among DNA haplotypes: application to human mitochondrial DNA restriction data. \emph{Genetics}, \bold{131}, 479--491. } \author{Sandrine Pavoine \email{pavoine@mnhn.fr} } \seealso{\code{\link{randtest.amova}}} \examples{ data(humDNAm) amovahum <- amova(humDNAm$samples, sqrt(humDNAm$distances), humDNAm$structures) amovahum } \keyword{multivariate} ade4/man/sco.boxplot.Rd0000644000176200001440000000337012576021756014421 0ustar liggesusers\name{sco.boxplot} \alias{sco.boxplot} \title{Representation of the link between a variable and a set of qualitative variables} \description{ represents the link between a variable and a set of qualitative variables. } \usage{ sco.boxplot(score, df, labels = names(df), clabel = 1, xlim = NULL, grid = TRUE, cgrid = 0.75, include.origin = TRUE, origin = 0, sub = NULL, csub = 1) } \arguments{ \item{score}{a numeric vector} \item{df}{a data frame with only factors} \item{labels}{a vector of strings of characters for the labels of variables} \item{clabel}{if not NULL, a character size for the labels, used with \code{par("cex")*clabel}} \item{xlim}{the ranges to be encompassed by the x axis, if NULL they are computed} \item{grid}{a logical value indicating whether the scale vertical lines should be drawn} \item{cgrid}{a character size, parameter used with \code{par("cex")*cgrid} to indicate the mesh of the scale} \item{include.origin}{a logical value indicating whether the point "origin" should be belonged to the graph space} \item{origin}{the fixed point in the graph space, for example 0 the origin axis} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} } \author{ Daniel Chessel } \examples{ w1 <- rnorm(100,-1) w2 <- rnorm(100) w3 <- rnorm(100,1) f1 <- gl(3,100) f2 <- gl(30,10) sco.boxplot(c(w1,w2,w3), data.frame(f1,f2)) data(banque) banque.acm <- dudi.acm(banque, scan = FALSE, nf = 4) par(mfrow = c(1,3)) sco.boxplot(banque.acm$l1[,1], banque[,1:7], clab = 1.8) sco.boxplot(banque.acm$l1[,1], banque[,8:14], clab = 1.8) sco.boxplot(banque.acm$l1[,1], banque[,15:21], clab = 1.8) par(mfrow = c(1,1)) } \keyword{multivariate} \keyword{hplot} ade4/man/variance.phylog.Rd0000644000176200001440000000473013175633655015244 0ustar liggesusers\name{variance.phylog} \alias{variance.phylog} \title{The phylogenetic ANOVA} \description{ This function performs the variance analysis of a trait on eigenvectors associated to a phylogenetic tree. } \usage{ variance.phylog(phylog, z, bynames = TRUE, na.action = c("fail", "mean")) } \arguments{ \item{phylog}{: an object of class \code{phylog}} \item{z}{: a numeric vector of the values corresponding to the variable} \item{bynames}{: if TRUE checks if \code{z} labels are the same as \code{phylog} leaves label, possibly in a different order. If FALSE the check is not made and \code{z} labels must be in the same order than \code{phylog} leaves label} \item{na.action}{: if 'fail' stops the execution of the current expression when \code{z} contains any missing value. If 'mean' replaces any missing values by mean(\code{z})} } \details{ \code{phylog$Amat} defines a set of orthonormal vectors associated the each nodes of the phylogenetic tree. \cr \code{phylog$Adim} defines the dimension of the subspace \bold{A} defined by the first \code{phylog$Adim} vectors of \code{phylog$Amat} that corresponds to phylogenetic inertia. \cr \code{variance.phylog} performs the linear regression of \code{z} on \bold{A}. } \value{ Returns a list containing \item{lm}{: an object of class \code{lm} that corresponds to the linear regression of \code{z} on \bold{A}.} \item{anova}{: an object of class \code{anova} that corresponds to the anova of the precedent model.} \item{smry}{: an object of class \code{anova} that is a summary of the precedent object.} } \references{ Grafen, A. (1989) The phylogenetic regression. \emph{Philosophical Transactions of the Royal Society London B}, \bold{326}, 119--156. Diniz-Filho, J. A. F., Sant'Ana, C.E.R. and Bini, L.M. (1998) An eigenvector method for estimating phylogenetic inertia. \emph{Evolution}, \bold{52}, 1247--1262. } \author{Sébastien Ollier \email{sebastien.ollier@u-psud.fr} \cr Daniel Chessel } \seealso{\code{\link{phylog}}, \code{\link{lm}}} \examples{ data(njplot) njplot.phy <- newick2phylog(njplot$tre) variance.phylog(njplot.phy,njplot$tauxcg) par(mfrow = c(1,2)) table.phylog(njplot.phy$Ascores, njplot.phy, clabel.row = 0, clabel.col = 0.1, clabel.nod = 0.6, csize = 1) dotchart.phylog(njplot.phy, njplot$tauxcg, clabel.nodes = 0.6) if (requireNamespace("adephylo", quietly = TRUE) & requireNamespace("ape", quietly = TRUE)) { tre <- ape::read.tree(text = njplot$tre) adephylo::orthogram(njplot$tauxcg, tre = tre) } } \keyword{models} ade4/man/chevaine.Rd0000644000176200001440000000163613474205664013734 0ustar liggesusers\name{chevaine} \docType{data} \alias{chevaine} \title{Enzymatic polymorphism in Leuciscus cephalus} \description{ This data set contains a list of three components: spatial map, allellic profiles and sample sizes. } \usage{data(chevaine)} \format{ This data set is a list of three components: \describe{ \item{tab}{ a data frame with 27 populations and 9 allelic frequencies (4 locus)} \item{coo}{ a list containing all the elements to build a spatial map} \item{eff}{ a numeric containing the numbers of fish samples per station} } } \references{ Guinand B., Bouvet Y. and Brohon B. (1996) Spatial aspects of genetic differentiation of the European chub in the Rhone River basin. \emph{Journal of Fish Biology}, \bold{49}, 714--726. See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps054.pdf} (in French). } \examples{ data(chevaine) names(chevaine) str(chevaine) } \keyword{datasets} ade4/man/bca.rlq.Rd0000644000176200001440000000411413021372261013450 0ustar liggesusers\name{bca.rlq} \alias{bca.rlq} \alias{plot.betrlq} \alias{print.betrlq} \title{ Between-Class RLQ analysis } \description{ Performs a particular RLQ analysis where a partition of sites (rows of R) is taken into account. The between-class RLQ analysis search for linear combinations of traits and environmental variables maximizing the covariances between the traits and the average environmental conditions of classes. } \usage{ \method{bca}{rlq}(x, fac, scannf = TRUE, nf = 2, ...) \method{plot}{betrlq}(x, xax = 1, yax = 2, ...) \method{print}{betrlq}(x, ...) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{x}{an object of class rlq (created by the \code{rlq} function) for the \code{bca.rlq} function. An object of class \code{betrlq} for the \code{print} and \code{plot} functions} \item{fac}{a factor partitioning the rows of R} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} \item{xax}{the column number for the x-axis} \item{yax}{the column number for the y-axis} \item{\dots}{further arguments passed to or from other methods} } \value{ The \code{bca.rlq} function returns an object of class 'betrlq' (sub-class of 'dudi'). See the outputs of the \code{print} function for more details. } \references{ Wesuls, D., Oldeland, J. and Dray, S. (2012) Disentangling plant trait responses to livestock grazing from spatio-temporal variation: the partial RLQ approach. \emph{Journal of Vegetation Science}, \bold{23}, 98--113. } \author{ Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \seealso{\code{\link{rlq}}, \code{\link{bca}}, \code{\link{wca.rlq}} } \examples{ data(piosphere) afcL <- dudi.coa(log(piosphere$veg + 1), scannf = FALSE) acpR <- dudi.pca(piosphere$env, scannf = FALSE, row.w = afcL$lw) acpQ <- dudi.hillsmith(piosphere$traits, scannf = FALSE, row.w = afcL$cw) rlq1 <- rlq(acpR, afcL, acpQ, scannf = FALSE) brlq1 <- bca(rlq1, fac = piosphere$habitat, scannf = FALSE) brlq1 plot(brlq1) } \keyword{ multivariate } ade4/man/mariages.Rd0000644000176200001440000000301013021372261013710 0ustar liggesusers\name{mariages} \alias{mariages} \docType{data} \title{Correspondence Analysis Table} \description{ This array contains the socio-professionnal repartitions of 5850 couples. } \usage{data(mariages)} \format{ The \code{mariages} data frame has 9 rows and 9 columns. The rows represent the wife's socio-professionnal category and the columns the husband's socio-professionnal category (1982).\cr Codes for rows and columns are identical : agri (Farmers), ouva (Farm workers), pat (Company directors (commerce and industry)), sup (Liberal profession, executives and higher intellectual professions), moy (Intermediate professions), emp (Other white-collar workers), ouv (Manual workers), serv (Domestic staff), aut (other workers). } \source{ Vallet, L.A. (1986) Activité professionnelle de la femme mariée et détermination de la position sociale de la famille. Un test empirique : la France entre 1962 et 1982. \emph{Revue Française de Sociologie}, \bold{27}, 656--696. } \examples{ data(mariages) w <- dudi.coa(mariages, scan = FALSE, nf = 3) if(adegraphicsLoaded()) { g1 <- scatter(w, met = 1, posi = "bottomleft", plot = FALSE) g2 <- scatter(w, met = 2, posi = "bottomleft", plot = FALSE) g3 <- scatter(w, met = 3, posi = "bottomleft", plot = FALSE) ## g4 <- score(w, 3) G <- ADEgS(list(g1, g2, g3), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) scatter(w, met = 1, posi = "bottom") scatter(w, met = 2, posi = "bottom") scatter(w, met = 3, posi = "bottom") score(w, 3) par(mfrow = c(1, 1)) }} \keyword{datasets} ade4/man/phylog.Rd0000644000176200001440000001101413047116774013442 0ustar liggesusers\name{phylog} \alias{phylog} \alias{print.phylog} \alias{phylog.extract} \alias{phylog.permut} \title{Phylogeny} \description{ Create and use objects of class \code{phylog}. \cr \code{phylog.extract} returns objects of class \code{phylog}. It extracts sub-trees from a tree. \cr \code{phylog.permut} returns objects of class \code{phylog}. It creates the different representations compatible with tree topology. } \usage{ \method{print}{phylog}(x, ...) phylog.extract(phylog, node, distance = TRUE) phylog.permut(phylog, list.nodes = NULL, distance = TRUE) } \arguments{ \item{x, phylog}{: an object of class \code{phylog}} \item{\dots}{: further arguments passed to or from other methods} \item{node}{: a string of characters giving a node name. The functions extracts the tree rooted at this node.} \item{distance}{: if TRUE, both functions retain branch lengths. If FALSE, they returns tree with arbitrary branch lengths (each branch length equals one)} \item{list.nodes}{: a list which elements are vectors of string of character corresponding to direct descendants of nodes. This list defines one representation compatible with tree topology among the set of possibilities.} } \value{ Returns a list of class \code{phylog} : \item{tre}{: a character string of the phylogenetic tree in Newick format whithout branch length values} \item{leaves}{: a vector which names corresponds to leaves and values gives the distance between leaves and nodes closest to these leaves} \item{nodes}{: a vector which names corresponds to nodes and values gives the distance between nodes and nodes closest to these leaves} \item{parts}{: a list which elements gives the direct descendants of each nodes} \item{paths}{: a list which elements gives the path leading from the root to taxonomic units (leaves and nodes)} \item{droot}{: a vector which names corresponds to taxonomic units and values gives distance between taxonomic units and the root} \item{call}{: call} \item{Wmat}{: a phylogenetic link matrix, generally called the covariance matrix. Matrix values \eqn{Wmat_{ij}}{Wmat_ij} correspond to path length that lead from root to the first common ancestor of the two leaves i and j} \item{Wdist}{: a phylogenetic distance matrix of class \code{'dist'}. Matrix values \eqn{Wdist_{ij}}{Wdist_ij} correspond to \eqn{\sqrt{d_{ij}}} where \eqn{d_{ij}}{d_ij} is the classical distance between two leaves i and j} \item{Wvalues}{: a vector with the eigen values of Wmat} \item{Wscores}{: a data frame with eigen vectors of Wmat. This data frame defines an orthobasis that could be used to calculate the orthonormal decomposition of a biological trait on a tree.} \item{Amat}{: a phylogenetic link matrix stemed from Abouheif's test and defined in Ollier et al. (submited)} \item{Avalues}{: a vector with the eigen values of Amat} \item{Adim}{: number of positive eigen values} \item{Ascores}{: a data frame with eigen vectors of Amat. This data frame defines an orthobasis that could be used to calculate the orthonormal decomposition of a biological trait on a tree.} \item{Aparam}{: a data frame with attributes associated to nodes.} \item{Bindica}{: a data frame giving for some taxonomic units the partition of leaves that is associated to its} \item{Bscores}{: a data frame giving an orthobasis defined by Ollier et al. (submited) that could be used to calculate the orthonormal decomposition of a biological trait on a tree.} \item{Bvalues}{: a vector giving the degree of phylogenetic autocorrelation for each vectors of Bscores (Moran's form calculated with the matrix Wmat)} \item{Blabels}{: a vector giving for each nodes the name of the vector of Bscores that is associated to its} } \references{ Ollier, S., Couteron, P. and Chessel, D. (2006) Orthonormal transform to decompose the variance of a life-history trait across a phylogenetic tree. \emph{Biometrics} Biometrics, \bold{62}, 2, 471--477. } \author{Daniel Chessel \cr Sébastien Ollier \email{sebastien.ollier@u-psud.fr} } \seealso{\code{\link{newick2phylog}}, \code{\link{plot.phylog}}} \examples{ marthans.tre <- NULL marthans.tre[1] <-"((((1:4,2:4)a:5,(3:7,4:7)b:2)c:2,5:11)d:2," marthans.tre[2] <- "((6:5,7:5)e:4,(8:4,9:4)f:5)g:4);" marthans.phylog <- newick2phylog(marthans.tre) marthans.phylog if(requireNamespace("ape", quietly = TRUE)) { marthans.phylo <- ape::read.tree(text = marthans.tre) marthans.phylo par(mfrow = c(1, 2)) plot(marthans.phylog, cnode = 3, f = 0.8, cle = 3) plot(marthans.phylo) par(mfrow = c(1, 1)) } } \keyword{manip} ade4/man/score.mix.Rd0000644000176200001440000000165712576021756014064 0ustar liggesusers\name{score.mix} \alias{score.mix} \title{Graphs to Analyse a factor in a Mixed Analysis} \description{ performs the canonical graph of a mixed analysis. } \usage{ \method{score}{mix}(x, xax = 1, csub = 2, mfrow = NULL, which.var = NULL, \dots) } \arguments{ \item{x}{an object of class \code{mix}} \item{xax}{the column number for the used axis} \item{csub}{a character size for the sub-titles, used with \code{par("cex")*csub}} \item{mfrow}{a vector of the form "c(nr,nc)", otherwise computed by a special own function \code{n2mfrow}} \item{which.var}{the numbers of the kept columns for the analysis, otherwise all columns } \item{\dots}{further arguments passed to or from other methods} } \author{Daniel Chessel } \examples{ data(lascaux) w <- cbind.data.frame(lascaux$colo, lascaux$ornem) dd <- dudi.mix(w, scan = FALSE, nf = 4, add = TRUE) score(dd, which = which(dd$cr[,1] > 0.3)) } \keyword{multivariate} \keyword{hplot} ade4/man/lascaux.Rd0000644000176200001440000000443513040362670013600 0ustar liggesusers\name{lascaux} \alias{lascaux} \docType{data} \title{Genetic/Environment and types of variables} \description{ This data set gives meristic, genetic and morphological data frame for 306 trouts. } \usage{data(lascaux)} \format{ \code{lascaux} is a list of 9 components. \describe{ \item{riv}{is a factor returning the river where 306 trouts are captured} \item{code}{vector of characters : code of the 306 trouts} \item{sex}{factor sex of the 306 trouts} \item{meris}{data frame 306 trouts - 5 meristic variables} \item{tap}{data frame of the total number of red and black points} \item{gen}{factor of the genetic code of the 306 trouts} \item{morpho}{data frame 306 trouts 37 morphological variables} \item{colo}{data frame 306 trouts 15 variables of coloring} \item{ornem}{data frame 306 trouts 15 factors (ornementation)} } } \source{ Lascaux, J.M. (1996) \emph{Analyse de la variabilité morphologique de la truite commune (Salmo trutta L.) dans les cours d'eau du bassin pyrénéen méditerranéen}. Thèse de doctorat en sciences agronomiques, INP Toulouse. } \references{ See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps022.pdf} (in French). } \examples{ data(lascaux) if(adegraphicsLoaded()) { g1 <- s1d.barchart(dudi.pca(lascaux$meris, scan = FALSE)$eig, psub.text = "Meristic", p1d.horizontal = FALSE, plot = FALSE) g2 <- s1d.barchart(dudi.pca(lascaux$colo, scan = FALSE)$eig, psub.text = "Coloration", p1d.horizontal = FALSE, plot = FALSE) g3 <- s1d.barchart(dudi.pca(na.omit(lascaux$morpho), scan = FALSE)$eig, psub.text = "Morphometric", p1d.horizontal = FALSE, plot = FALSE) g4 <- s1d.barchart(dudi.acm(na.omit(lascaux$orne), scan = FALSE)$eig, psub.text = "Ornemental", p1d.horizontal = FALSE, plot = FALSE) G <- ADEgS(c(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2,2)) barplot(dudi.pca(lascaux$meris, scan = FALSE)$eig) title(main = "Meristic") barplot(dudi.pca(lascaux$colo, scan = FALSE)$eig) title(main = "Coloration") barplot(dudi.pca(na.omit(lascaux$morpho), scan = FALSE)$eig) title(main = "Morphometric") barplot(dudi.acm(na.omit(lascaux$orne), scan = FALSE)$eig) title(main = "Ornemental") par(mfrow = c(1,1)) } } \keyword{datasets} ade4/man/kplot.pta.Rd0000644000176200001440000000376312576021756014071 0ustar liggesusers\name{kplot.pta} \alias{kplot.pta} \title{Multiple Graphs for a Partial Triadic Analysis} \description{ performs high level plots of a Partial Triadic Analysis, using an object of class \code{pta}. } \usage{ \method{kplot}{pta}(object, xax = 1, yax = 2, which.tab = 1:nrow(object$RV), mfrow = NULL, which.graph = 1:4, clab = 1, cpoint = 2, csub = 2, possub = "bottomright", ask = par("ask"), ...) } \arguments{ \item{object}{an object of class \code{pta}} \item{xax, yax}{the numbers of the x-axis and the y-axis} \item{which.tab}{a numeric vector containing the numbers of the tables to analyse} \item{mfrow}{parameter of the array of figures to be drawn, otherwise the graphs associated to a table are drawn on the same row} \item{which.graph}{an option for drawing, an integer between 1 and 4. For each table of which.tab, are drawn : \describe{ \item{1}{the projections of the principal axes} \item{2}{the projections of the rows} \item{3}{the projections of the columns} \item{4}{the projections of the principal components onto the planes of the compromise} } } \item{clab}{a character size for the labels} \item{cpoint}{a character size for plotting the points, used with \code{par("cex")}*cpoint. If zero, no points are drawn.} \item{csub}{a character size for the sub-titles, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{ask}{a logical value indicating if the graphs requires several arrays of figures} \item{\dots}{further arguments passed to or from other methods} } \author{Daniel Chessel } \examples{ data(meaudret) wit1 <- wca(dudi.pca(meaudret$spe, scan = FALSE, scal = FALSE), meaudret$design$season, scan = FALSE) kta1 <- ktab.within(wit1, colnames = rep(c("S1", "S2", "S3", "S4", "S5"), 4)) kta2 <- t(kta1) pta1 <- pta(kta2, scann = FALSE) kplot(pta1) kplot(pta1, which.graph = 3) } \keyword{multivariate} \keyword{hplot} ade4/man/procuste.Rd0000644000176200001440000001123713040362670014002 0ustar liggesusers\name{procuste} \alias{procuste} \alias{plot.procuste} \alias{print.procuste} \alias{randtest.procuste} \title{Simple Procruste Rotation between two sets of points} \description{ performs a simple procruste rotation between two sets of points. } \usage{ procuste(dfX, dfY, scale = TRUE, nf = 4, tol = 1e-07) \method{plot}{procuste}(x, xax = 1, yax = 2, \dots) \method{print}{procuste}(x, \dots) \method{randtest}{procuste}(xtest, nrepet = 999, \dots) } \arguments{ \item{dfX, dfY}{two data frames with the same rows} \item{scale}{a logical value indicating whether a transformation by the Gower's scaling (1971) should be applied} \item{nf}{an integer indicating the number of kept axes} \item{tol}{a tolerance threshold to test whether the distance matrix is Euclidean : an eigenvalue is considered positive if it is larger than \code{-tol*lambda1} where \code{lambda1} is the largest eigenvalue.} \cr \item{x, xtest}{an objet of class \code{procuste}} \item{xax}{the column number for the x-axis} \item{yax}{the column number for the y-axis} \item{nrepet}{the number of repetitions to perform the randomization test} \item{\dots}{further arguments passed to or from other methods} } \value{ returns a list of the class \code{procuste} with 9 components \item{d}{a numeric vector of the singular values} \item{rank}{an integer indicating the rank of the crossed matrix} \item{nf}{an integer indicating the number of kept axes} \item{tabX}{a data frame with the array X, possibly scaled} \item{tabY}{a data frame with the array Y, possibly scaled} \item{rotX}{a data frame with the result of the rotation from array X to array Y} \item{rotY}{a data frame with the result of the rotation from array Y to array X} \item{loadX}{a data frame with the loadings of array X} \item{loadY}{a data frame with the loadings of array Y} \item{scorX}{a data frame with the scores of array X} \item{scorY}{a data frame with the scores of array Y} \item{call}{a call order of the analysis} } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \references{ Digby, P. G. N. and Kempton, R. A. (1987) Multivariate Analysis of Ecological Communities. \emph{Population and Community Biology Series}, Chapman and Hall, London.\cr\cr Gower, J.C. (1971) Statistical methods of comparing different multivariate analyses of the same data. In \emph{Mathematics in the archaeological and historical sciences}, Hodson, F.R, Kendall, D.G. & Tautu, P. (Eds.) University Press, Edinburgh, 138--149.\cr\cr Schönemann, P.H. (1968) On two-sided Procustes problems. \emph{Psychometrika}, \bold{33}, 19--34.\cr\cr Torre, F. and Chessel, D. (1994) Co-structure de deux tableaux totalement appariés. \emph{Revue de Statistique Appliquée}, \bold{43}, 109--121.\cr\cr Dray, S., Chessel, D. and Thioulouse, J. (2003) Procustean co-inertia analysis for the linking of multivariate datasets. \emph{Ecoscience}, \bold{10}, 1, 110-119. } \examples{ data(macaca) pro1 <- procuste(macaca$xy1, macaca$xy2, scal = FALSE) pro2 <- procuste(macaca$xy1, macaca$xy2) if(adegraphicsLoaded()) { g1 <- s.match(pro1$tabX, pro1$rotY, plab.cex = 0.7, plot = FALSE) g2 <- s.match(pro1$tabY, pro1$rotX, plab.cex = 0.7, plot = FALSE) g3 <- s.match(pro2$tabX, pro2$rotY, plab.cex = 0.7, plot = FALSE) g4 <- s.match(pro2$tabY, pro2$rotX, plab.cex = 0.7, plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) s.match(pro1$tabX, pro1$rotY, clab = 0.7) s.match(pro1$tabY, pro1$rotX, clab = 0.7) s.match(pro2$tabX, pro2$rotY, clab = 0.7) s.match(pro2$tabY, pro2$rotX, clab = 0.7) par(mfrow = c(1,1)) } data(doubs) pca1 <- dudi.pca(doubs$env, scal = TRUE, scann = FALSE) pca2 <- dudi.pca(doubs$fish, scal = FALSE, scann = FALSE) pro3 <- procuste(pca1$tab, pca2$tab, nf = 2) if(adegraphicsLoaded()) { g11 <- s.traject(pro3$scorX, plab.cex = 0, plot = FALSE) g12 <- s.label(pro3$scorX, plab.cex = 0.8, plot = FALSE) g1 <- superpose(g11, g12) g21 <- s.traject(pro3$scorY, plab.cex = 0, plot = FALSE) g22 <- s.label(pro3$scorY, plab.cex = 0.8, plot = FALSE) g2 <- superpose(g21, g22) g3 <- s.arrow(pro3$loadX, plab.cex = 0.75, plot = FALSE) g4 <- s.arrow(pro3$loadY, plab.cex = 0.75, plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) s.traject(pro3$scorX, clab = 0) s.label(pro3$scorX, clab = 0.8, add.p = TRUE) s.traject(pro3$scorY, clab = 0) s.label(pro3$scorY, clab = 0.8, add.p = TRUE) s.arrow(pro3$loadX, clab = 0.75) s.arrow(pro3$loadY, clab = 0.75) par(mfrow = c(1, 1)) } plot(pro3) randtest(pro3) data(fruits) plot(procuste(scalewt(fruits$jug), scalewt(fruits$var))) } \keyword{multivariate} ade4/man/chazeb.Rd0000644000176200001440000000123412576021756013400 0ustar liggesusers\name{chazeb} \alias{chazeb} \docType{data} \title{Charolais-Zebus} \description{ This data set gives six different weights of 23 charolais and zebu oxen. } \usage{data(chazeb)} \format{ \code{chazeb} is a list of 2 components. \describe{ \item{tab}{is a data frame with 23 rows and 6 columns.} \item{cla}{is a factor with two levels "cha" and "zeb". } } } \source{ Tomassone, R., Danzard, M., Daudin, J. J. and Masson J. P. (1988) \emph{Discrimination et classement}, Masson, Paris. p. 43 } \examples{ data(chazeb) if(!adegraphicsLoaded()) plot(discrimin(dudi.pca(chazeb$tab, scan = FALSE), chazeb$cla, scan = FALSE)) } \keyword{datasets} ade4/man/dotchart.phylog.Rd0000644000176200001440000000434313021372261015243 0ustar liggesusers\name{dotchart.phylog} \alias{dotchart.phylog} \title{Representation of many quantitative variables in front of a phylogenetic tree} \description{ \code{dotchart.phylog} represents the phylogenetic tree and draws Cleveland dot plot of each variable. } \usage{ dotchart.phylog(phylog, values, y = NULL, scaling = TRUE, ranging = TRUE, yranging = NULL, joining = TRUE, yjoining = NULL, ceti = 1, cdot = 1, csub = 1, f.phylog = 1/(1 + ncol(values)), ...) } \arguments{ \item{phylog}{ an object of class \code{phylog}} \item{values}{ a vector or a data frame giving the variables} \item{y}{ a vector which values correspond to leaves positions} \item{scaling}{ if TRUE, data are scaled} \item{ranging}{ if TRUE, dotplots are drawn with the same horizontal limits} \item{yranging}{ a vector with two values giving the horizontal limits. If NULL, horizontal limits are defined by lower and upper values of data} \item{joining}{ if TRUE, segments join each point to a central value} \item{yjoining}{ a vector with the central value. If NULL, the central value equals 0} \item{ceti}{ a character size for editing horizontal limits, \cr used with \code{par("cex")*ceti}} \item{cdot}{ a character size for plotting the points of the dot plot, used with \code{par("cex")*cdot}} \item{csub}{ a character size for editing the names of variables, \cr used with \code{par("cex")*csub}} \item{f.phylog}{ a size coefficient for tree size (a parameter to draw the tree in proportion to leaves labels)} \item{\dots}{ further arguments passed to or from other methods} } \author{ Daniel Chessel \cr Sébastien Ollier \email{sebastien.ollier@u-psud.fr} } \seealso{\code{\link{symbols.phylog}} and \code{\link{table.phylog}}} \examples{ # one variable tre <- c("((A,B),(C,D));") phy <- newick2phylog(tre) x <- 1:4 par(mfrow = c(2,2)) dotchart.phylog(phy, x, scaling = FALSE) dotchart.phylog(phy, x) dotchart.phylog(phy, x, joining = FALSE) dotchart.phylog(phy, x, scaling = FALSE, yjoining = 0, yranging = c(-1, 5)) par(mfrow = c(1,1)) # many variables data(mjrochet) phy <- newick2phylog(mjrochet$tre) tab <- data.frame(log(mjrochet$tab)) dotchart.phylog(phy, tab, ceti = 0.5, csub = 0.6, cleaves = 0, cdot = 0.6) par(mfrow=c(1,1)) } \keyword{hplot} ade4/man/ggtortoises.Rd0000644000176200001440000000467213175633655014531 0ustar liggesusers\name{ggtortoises} \alias{ggtortoises} \docType{data} \title{Microsatellites of Galapagos tortoises populations} \description{ This data set gives genetic relationships between Galapagos tortoises populations with 10 microsatellites. } \usage{data(ggtortoises)} \format{\code{ggtortoises} is a list with the following components: \describe{ \item{area}{a data frame designed to be used in the \code{area.plot} function} \item{ico}{a list of three pixmap icons representing the tortoises morphotypes} \item{pop}{a data frame containing meta informations about populations} \item{misc}{a data frame containing the coordinates of the island labels} \item{loc}{a numeric vector giving the number of alleles by marker} \item{tab}{a data frame containing the number of alleles by populations for 10 microsatellites} \item{Spatial}{an object of the class \code{SpatialPolygons} of \code{sp}, containing the map} }} \source{ M.C. Ciofi, C. Milinkovitch, J.P. Gibbs, A. Caccone, and J.R. Powell (2002) Microsatellite analysis of genetic divergence among populations of giant galapagos tortoises. \emph{Molecular Ecology} \bold{11}: 2265-2283. } \references{ M.C. Ciofi, C. Milinkovitch, J.P. Gibbs, A. Caccone, and J.R. Powell (2002). Microsatellite analysis of genetic divergence among populations of giant galapagos tortoises. \emph{Molecular Ecology} \bold{11}: 2265-2283. See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps069.pdf} (in French). } \examples{ if(requireNamespace("pixmap", quietly=TRUE)) { data(ggtortoises) if(adegraphicsLoaded()) { if(requireNamespace("sp", quietly = TRUE)) { g1 <- s.logo(ggtortoises$pop, ggtortoises$ico[as.character(ggtortoises$pop$carap)], Sp = ggtortoises$Spatial, pbackground.col = "lightblue", pSp.col = "white", pgrid.draw = FALSE, ppoints.cex = 0.5) g1 <- s.label(ggtortoises$misc, pgrid.draw = FALSE, porigin.include = FALSE, paxes.draw = FALSE, add = TRUE) } } else { a1 <- ggtortoises$area area.plot(a1) rect(min(a1$x), min(a1$y), max(a1$x), max(a1$y), col = "lightblue") invisible(lapply(split(a1, a1$id), function(x) polygon(x[, -1], col = "white"))) s.label(ggtortoises$misc, grid = FALSE, include.ori = FALSE, addaxes = FALSE, add.p = TRUE) listico <- ggtortoises$ico[as.character(ggtortoises$pop$carap)] s.logo(ggtortoises$pop, listico, add.p = TRUE) } }} \keyword{datasets}ade4/man/irishdata.Rd0000644000176200001440000000615713175633655014130 0ustar liggesusers\name{irishdata} \alias{irishdata} \docType{data} \title{Geary's Irish Data} \description{ This data set contains geographical informations about 25 counties of Ireland. } \usage{data(irishdata)} \format{\code{irishdata} is a list of 13 components: \describe{ \item{area}{a data frame with polygons for each of the 25 contiguous counties} \item{county.names}{a vector with the names of the 25 counties} \item{xy}{a data frame with the coordinates centers of the 25 counties} \item{tab}{a data frame with 25 rows (counties) and 12 variables} \item{contour}{a data frame with the global polygon of all the 25 counties} \item{link}{a matrix containing the common length between two counties from \code{area}} \item{area.utm}{a data frame with polygons for each of the 25 contiguous counties expressed in Universal Transverse Mercator (UTM) coordinates} \item{xy.utm}{a data frame with the UTM coordinates centers of the 25 counties} \item{link.utm}{a matrix containing the common length between two counties from \code{area.utm}} \item{tab.utm}{a data frame with the 25 counties (explicitly named) and 12 variables} \item{contour.utm}{a data frame with the global polygon of all the 25 counties expressed in UTM coordinates} \item{Spatial}{the map of the 25 counties of Ireland (an object of the class \code{SpatialPolygons} of \code{sp})} \item{Spatial.contour}{the contour of the map of the 25 counties of Ireland (an object of the class \code{SpatialPolygons} of \code{sp})} }} \source{ Geary, R.C. (1954) The contiguity ratio and statistical mapping. \emph{The incorporated Statistician}, \bold{5}, 3, 115--145. Cliff, A.D. and Ord, J.K. (1973) \emph{Spatial autocorrelation}, Pion, London. 1--178. } \examples{ data(irishdata) if(adegraphicsLoaded()) { if(requireNamespace("sp", quietly = TRUE)){ g1 <- s.label(irishdata$xy.utm, Sp = irishdata$Spatial, pSp.col = "white", plot = FALSE) g21 <- s.label(irishdata$xy.utm, Sp = irishdata$Spatial, pSp.col = "white", plab.cex = 0, ppoints.cex = 0, plot = FALSE) g22 <- s.label(irishdata$xy.utm, Sp = irishdata$Spatial.contour, pSp.col = "transparent", plab.cex = 0, ppoints.cex = 0, pSp.lwd = 3, plot = FALSE) g2 <- superpose(g21, g22) g3 <- s.corcircle(dudi.pca(irishdata$tab, scan = FALSE)$co, plot = FALSE) score <- dudi.pca(irishdata$tab, scannf = FALSE, nf = 1)$li$Axis1 names(score) <- row.names(irishdata$Spatial) obj <- sp::SpatialPolygonsDataFrame(Sr = irishdata$Spatial, data = as.data.frame(score)) g4 <- s.Spatial(obj, plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } } else { par(mfrow = c(2, 2)) area.plot(irishdata$area, lab = irishdata$county.names, clab = 0.75) area.plot(irishdata$area) apply(irishdata$contour, 1, function(x) segments(x[1], x[2], x[3], x[4], lwd = 3)) s.corcircle(dudi.pca(irishdata$tab, scannf = FALSE)$co) score <- dudi.pca(irishdata$tab, scannf = FALSE, nf = 1)$li$Axis1 names(score) <- row.names(irishdata$tab) area.plot(irishdata$area, score) par(mfrow = c(1, 1)) }} \keyword{datasets}ade4/man/kcponds.Rd0000644000176200001440000000533213177053521013601 0ustar liggesusers\name{kcponds} \alias{kcponds} \docType{data} \title{Ponds in a nature reserve} \description{ This data set contains informations about 33 ponds in De Maten reserve (Genk, Belgium). } \usage{data(kcponds)} \format{\code{kponds} is a list with the following components: \describe{ \item{tab}{a data frame with 15 environmental variables (columns) on 33 ponds (rows)} \item{area}{an object of class \code{area}} \item{xy}{a data frame with the coordinates of ponds} \item{neig}{an object of class \code{neig}} \item{nb}{the neighbourhood graph of the 33 sites (an object of class \code{nb})} \item{Spatial}{an object of the class \code{SpatialPolygons} of \code{sp}, containing the map} }} \details{ Variables of \code{kcponds$tab} are the following ones : depth, area, O2 (oxygen concentration), cond (conductivity), pH, Fe (Fe concentration), secchi (Secchi disk depth), N (NNO concentration), TP (total phosphorus concentration), chla (chlorophyll-a concentration), EM (emergent macrophyte cover), FM (floating macrophyte cover), SM (submerged macrophyte cover), denMI (total density of macroinvertebrates), divMI (diversity macroinvertebrates) } \source{ Cottenie, K. (2002) Local and regional processes in a zooplankton metacommunity. PhD, Katholieke Universiteit Leuven, Leuven, Belgium. \cr \url{http://www.kuleuven.ac.be/bio/eco/phdkarlcottenie.pdf} } \examples{ data(kcponds) w <- as.numeric(scalewt(kcponds$tab$N)) if(adegraphicsLoaded()) { if(requireNamespace("sp", quietly = TRUE)) { g1 <- s.label(kcponds$xy, Sp = kcponds$Spatial, pSp.col = "white", nb = kcponds$nb, plab.cex = 0, paxes.asp = "fill", plot = FALSE) g2 <- s.label(kcponds$xy, Sp = kcponds$Spatial, pSp.col = "white", plabels.cex = 0.8, paxes.asp = "fill", plot = FALSE) g3 <- s.value(kcponds$xy, w, psub.text = "Nitrogen concentration", paxe.asp = "fill", plot = FALSE) G <- rbindADEg(g1, g2, g3, plot = TRUE) } } else { par(mfrow=c(3, 1)) area.plot(kcponds$area) s.label(kcponds$xy, add.p = TRUE, cpoi = 2, clab = 0) s.label(kcponds$xy, add.p = TRUE, cpoi = 3, clab = 0) s.label(kcponds$xy, add.p = TRUE, cpoi = 0, clab = 0, neig = kcponds$neig, cneig = 1) area.plot(kcponds$area) s.label(kcponds$xy, add.p = TRUE, clab = 1.5) s.value(kcponds$xy, w, cleg = 2, sub = "Nitrogen concentration", csub = 4, possub = "topright", include = FALSE) par(mfrow = c(1, 1)) } \dontrun{ par(mfrow = c(3, 1)) pca1 <- dudi.pca(kcponds$tab, scan = FALSE, nf = 4) if(requireNamespace("spdep", quietly = TRUE)) { multi1 <- multispati(pca1, spdep::nb2listw(neig2nb(kcponds$neig)), scannf = FALSE, nfposi = 2, nfnega = 1) summary(multi1) } par(mfrow = c(1, 1)) }} \keyword{datasets}ade4/man/housetasks.Rd0000644000176200001440000000152612576021756014341 0ustar liggesusers\name{housetasks} \alias{housetasks} \docType{data} \title{Contingency Table} \description{ The \code{housetasks} data frame gives 13 housetasks and their repartition in the couple. } \usage{data(housetasks)} \format{ This data frame contains four columns : wife, alternating, husband and jointly. Each column is a numeric vector. } \source{ Kroonenberg, P. M. and Lombardo, R. (1999) Nonsymmetric correspondence analysis: a tool for analysing contingency tables with a dependence structure. \emph{Multivariate Behavioral Research}, \bold{34}, 367--396 } \examples{ data(housetasks) nsc1 <- dudi.nsc(housetasks, scan = FALSE) if(adegraphicsLoaded()) { s.label(nsc1$c1, plab.cex = 1.25) s.arrow(nsc1$li, add = TRUE, plab.cex = 0.75) } else { s.label(nsc1$c1, clab = 1.25) s.arrow(nsc1$li, add.pl = TRUE, clab = 0.75) }} \keyword{datasets} ade4/man/pcaiv.Rd0000644000176200001440000001502313102043107013223 0ustar liggesusers\name{pcaiv} \alias{pcaiv} \alias{plot.pcaiv} \alias{print.pcaiv} \alias{summary.pcaiv} \title{Principal component analysis with respect to instrumental variables} \description{ performs a principal component analysis with respect to instrumental variables. } \usage{ pcaiv(dudi, df, scannf = TRUE, nf = 2) \method{plot}{pcaiv}(x, xax = 1, yax = 2, \dots) \method{print}{pcaiv}(x, \dots) \method{summary}{pcaiv}(object, \dots) } \arguments{ \item{dudi}{a duality diagram, object of class \code{dudi}} \item{df}{a data frame with the same rows} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} \cr \item{x, object}{an object of class \code{pcaiv}} \item{xax}{the column number for the x-axis} \item{yax}{the column number for the y-axis} \item{\dots}{further arguments passed to or from other methods} } \value{ returns an object of class \code{pcaiv}, sub-class of class \code{dudi} \item{tab}{a data frame with the modified array (projected variables)} \item{cw}{a numeric vector with the column weigths (from \code{dudi})} \item{lw}{a numeric vector with the row weigths (from \code{dudi})} \item{eig}{a vector with the all eigenvalues} \item{rank}{an integer indicating the rank of the studied matrix} \item{nf}{an integer indicating the number of kept axes} \item{c1}{a data frame with the Pseudo Principal Axes (PPA)} \item{li}{a data frame \code{dudi$ls} with the predicted values by X} \item{co}{a data frame with the inner products between the CPC and Y} \item{l1}{data frame with the Constraint Principal Components (CPC)} \item{call}{the matched call} \item{X}{a data frame with the explanatory variables} \item{Y}{a data frame with the dependant variables} \item{ls}{a data frame with the projections of lines of \code{dudi$tab} on PPA} \item{param}{a table containing information about contributions of the analyses : absolute (1) and cumulative (2) contributions of the decomposition of inertia of the dudi object, absolute (3) and cumulative (4) variances of the projections, the ration (5) between the cumulative variances of the projections (4) and the cumulative contributions (2), the square coefficient of correlation (6) and the eigenvalues of the pcaiv (7)} \item{as}{a data frame with the Principal axes of \code{dudi$tab} on PPA} \item{fa}{a data frame with the loadings (Constraint Principal Components as linear combinations of X} \item{cor}{a data frame with the correlations between the CPC and X } } \references{ Rao, C. R. (1964) The use and interpretation of principal component analysis in applied research. \emph{Sankhya}, \bold{A 26}, 329--359.\cr\cr Obadia, J. (1978) L'analyse en composantes explicatives. \emph{Revue de Statistique Appliquee}, \bold{24}, 5--28.\cr\cr Lebreton, J. D., Sabatier, R., Banco G. and Bacou A. M. (1991) Principal component and correspondence analyses with respect to instrumental variables : an overview of their role in studies of structure-activity and species- environment relationships. In J. Devillers and W. Karcher, editors. \emph{Applied Multivariate Analysis in SAR and Environmental Studies}, Kluwer Academic Publishers, 85--114. Ter Braak, C. J. F. (1986) Canonical correspondence analysis : a new eigenvector technique for multivariate direct gradient analysis. \emph{Ecology}, \bold{67}, 1167--1179.\cr\cr Ter Braak, C. J. F. (1987) The analysis of vegetation-environment relationships by canonical correspondence analysis. \emph{Vegetatio}, \bold{69}, 69--77.\cr\cr Chessel, D., Lebreton J. D. and Yoccoz N. (1987) Propriétés de l'analyse canonique des correspondances. Une utilisation en hydrobiologie. \emph{Revue de Statistique Appliquée}, \bold{35}, 55--72.\cr\cr } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr}\cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \examples{ # example for the pcaiv data(rhone) pca1 <- dudi.pca(rhone$tab, scan = FALSE, nf = 3) iv1 <- pcaiv(pca1, rhone$disch, scan = FALSE) summary(iv1) plot(iv1) # example for the caiv data(rpjdl) millog <- log(rpjdl$mil + 1) coa1 <- dudi.coa(rpjdl$fau, scann = FALSE) caiv1 <- pcaiv(coa1, millog, scan = FALSE) if(adegraphicsLoaded()) { G1 <- plot(caiv1) # analysis with c1 - as - li -ls # projections of inertia axes on PCAIV axes G2 <- s.corcircle(caiv1$as) # Species positions g31 <- s.label(caiv1$c1, xax = 2, yax = 1, plab.cex = 0.5, xlim = c(-4, 4), plot = FALSE) # Sites positions at the weighted mean of present species g32 <- s.label(caiv1$ls, xax = 2, yax = 1, plab.cex = 0, plot = FALSE) G3 <- superpose(g31, g32, plot = TRUE) # Prediction of the positions by regression on environmental variables G4 <- s.match(caiv1$ls, caiv1$li, xax = 2, yax = 1, plab.cex = 0.5) # analysis with fa - l1 - co -cor # canonical weights giving unit variance combinations G5 <- s.arrow(caiv1$fa) # sites position by environmental variables combinations # position of species by averaging g61 <- s.label(caiv1$l1, xax = 2, yax = 1, plab.cex = 0, ppoi.cex = 1.5, plot = FALSE) g62 <- s.label(caiv1$co, xax = 2, yax = 1, plot = FALSE) G6 <- superpose(g61, g62, plot = TRUE) G7 <- s.distri(caiv1$l1, rpjdl$fau, xax = 2, yax = 1, ellipseSize = 0, starSize = 0.33) # coherence between weights and correlations g81 <- s.corcircle(caiv1$cor, xax = 2, yax = 1, plot = FALSE) g82 <- s.arrow(caiv1$fa, xax = 2, yax = 1, plot = FALSE) G8 <- cbindADEg(g81, g82, plot = TRUE) } else { plot(caiv1) # analysis with c1 - as - li -ls # projections of inertia axes on PCAIV axes s.corcircle(caiv1$as) # Species positions s.label(caiv1$c1, 2, 1, clab = 0.5, xlim = c(-4, 4)) # Sites positions at the weighted mean of present species s.label(caiv1$ls, 2, 1, clab = 0, cpoi = 1, add.p = TRUE) # Prediction of the positions by regression on environmental variables s.match(caiv1$ls, caiv1$li, 2, 1, clab = 0.5) # analysis with fa - l1 - co -cor # canonical weights giving unit variance combinations s.arrow(caiv1$fa) # sites position by environmental variables combinations # position of species by averaging s.label(caiv1$l1, 2, 1, clab = 0, cpoi = 1.5) s.label(caiv1$co, 2, 1, add.plot = TRUE) s.distri(caiv1$l1, rpjdl$fau, 2, 1, cell = 0, csta = 0.33) s.label(caiv1$co, 2, 1, clab = 0.75, add.plot = TRUE) # coherence between weights and correlations par(mfrow = c(1, 2)) s.corcircle(caiv1$cor, 2, 1) s.arrow(caiv1$fa, 2, 1) par(mfrow = c(1, 1)) } } \keyword{multivariate} ade4/man/mdpcoa.Rd0000644000176200001440000001766513040362670013414 0ustar liggesusers\name{mdpcoa} \alias{mdpcoa} \alias{kplotX.mdpcoa} \alias{prep.mdpcoa} \title{Multiple Double Principal Coordinate Analysis} \description{ The DPCoA analysis (see \code{\link{dpcoa}}) has been developed by Pavoine et al. (2004). It has been used in genetics for describing inter-population nucleotide diversity. However, this procedure can only be used with one locus. In order to measure and describe nucleotide diversity with more than one locus, we developed three versions of multiple DPCoA by using three ordination methods: multiple co-inertia analysis, STATIS, and multiple factorial analysis. The multiple DPCoA allows the impact of various loci in the measurement and description of diversity to be quantified and described. This method is general enough to handle a large variety of data sets. It complements existing methods such as the analysis of molecular variance or other analyses based on linkage disequilibrium measures, and is very useful to study the impact of various loci on the measurement of diversity. } \usage{ mdpcoa(msamples, mdistances = NULL, method = c("mcoa", "statis", "mfa"), option = c("inertia", "lambda1", "uniform", "internal"), scannf = TRUE, nf = 3, full = TRUE, nfsep = NULL, tol = 1e-07) kplotX.mdpcoa(object, xax = 1, yax = 2, mfrow = NULL, which.tab = 1:length(object$nX), includepop = FALSE, clab = 0.7, cpoi = 0.7, unique.scale = FALSE, csub = 2, possub = "bottomright") prep.mdpcoa(dnaobj, pop, model, ...) } \arguments{ \item{msamples}{A list of data frames with the populations as columns, alleles as rows and abundances as entries. All the tables should have equal numbers of columns (populations). Each table corresponds to a locus;} \item{mdistances}{A list of objects of class 'dist', corresponding to the distances among alleles. The order of the loci should be the same in msamples as in mdistances;} \item{method}{One of the three possibilities: "mcoa", "statis", or "mfa". If a vector is given, only its first value is considered;} \item{option}{One of the four possibilities for normalizing the population coordinates over the loci: "inertia", "lambda1", "uniform", or "internal". These options are used with MCoA and MFA only;} \item{scannf}{a logical value indicating whether the eigenvalues bar plots should be displayed;} \item{nf}{if scannf is FALSE, an integer indicating the number of kept axes for the multiple analysis;} \item{full}{a logical value indicating whether all the axes should be kept in the separated analyses (one analysis, DPCoA, per locus);} \item{nfsep}{if full is FALSE, a vector indicating the number of kept axes for each of the separated analyses;} \item{tol}{a tolerance threshold for null eigenvalues (a value less than tol times the first one is considered as null);} \item{object}{an object of class 'mdpcoa';} \item{xax}{the number of the x-axis;} \item{yax}{the number of the y-axis;} \item{mfrow}{a vector of the form 'c(nr,nc)', otherwise computed by as special own function 'n2mfrow';} \item{which.tab}{a numeric vector containing the numbers of the loci to analyse;} \item{includepop}{a logical indicating if the populations must be displayed. In that case, the alleles are displayed by points and the populations by labels;} \item{clab}{a character size for the labels;} \item{cpoi}{a character size for plotting the points, used with 'par("cex")'*cpoint. If zero, no points are drawn;} \item{unique.scale}{if TRUE, all the arrays of figures have the same scale;} \item{csub}{a character size for the labels of the arrays of figures used with 'par("cex")*csub';} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright");} \item{dnaobj}{a list of dna sequences that can be obtained with the function \code{read.dna} of the ape package;} \item{pop}{a factor that gives the name of the population to which each sequence belongs;} \item{model}{a vector giving the model to be applied for the calculations of the distances for each locus. One model should be attributed to each locus, given that the loci are in alphabetical order. The models can take the following values: "raw", "JC69", "K80" (the default), "F81", "K81", "F84", "BH87", "T92", "TN93", "GG95", "logdet", or "paralin". See the help documentation for the function "dist.dna" of ape for a describtion of the models.} \item{\dots}{\code{\dots} further arguments passed to or from other methods} } \value{ The functions provide the following results: \item{dist.ktab}{returns an object of class \code{dist};} } \details{ An object obtained by the function mdpcoa has two classes. The first one is "mdpcoa" and the second is either "mcoa", or "statis", or "mfa", depending on the method chosen. Consequently, other functions already available in ade4 for displaying graphical results can be used: With MCoA, - plot.mcoa: this function displays (1) the differences among the populations according to each locus and the compromise, (2) the projection of the principal axes of the individual analyses onto the synthetic variables, (3) the projection of the principal axes of the individual analyses onto the co-inertia axes, (4) the squared vectorial covariance among the coinertia scores and the synthetic variables; - kplot.mcoa: this function divides previous displays (figures 1, 2, or 3 described in plot.mcoa) by giving one plot per locus. With STATIS, - plot.statis: this function displays (1) the scores of each locus according to the two first eigenvectors of the matrix \emph{Rv}, (2) the scatter diagram of the differences among populations according to the compromise, (3) the weight attributed to each locus in abscissa and the vectorial covariance among each individual analysis with the notations in the main text of the paper) and the compromise analysis in ordinates, (4) the covariance between the principal component inertia axes of each locus and the axes of the compromise space; - kplot.statis: this function displays for each locus the projection of the principal axes onto the compromise space. With MFA, - plot.mfa: this function displays (1) the differences among the populations according to each locus and the compromise, (2) the projection of the principal axes of the individual analyses onto the compromise, (3) the covariance between the principal component inertia axes of each locus and the axes of the compromise space, (4) for each axis of the compromise, the amount of inertia conserved by the projection of the individual analyses onto the common space. - kplot.mfa: this function displays for each locus the projection of the principal axes and populations onto the compromise space. } \references{ Pavoine, S. and Bailly, X. (2007) New analysis for consistency among markers in the study of genetic diversity: development and application to the description of bacterial diversity. \emph{BMC Evolutionary Biology}, \bold{7}, e156.\cr Pavoine, S., Dufour, A.B. and Chessel, D. (2004) From dissimilarities among species to dissimilarities among communities: a double principal coordinate analysis. \emph{Journal of Theoretical Biology}, \bold{228}, 523--537. } \author{Sandrine Pavoine \email{pavoine@mnhn.fr} } \seealso{ \code{\link{dpcoa}} } \examples{ # The functions used below require the package ape data(rhizobium) if (requireNamespace("ape", quietly = TRUE)) { dat <- prep.mdpcoa(rhizobium[[1]], rhizobium[[2]], model = c("F84", "F84", "F84", "F81"), pairwise.deletion = TRUE) sam <- dat$sam dis <- dat$dis # The distances should be Euclidean. # Several transformations exist to render a distance object Euclidean # (see functions cailliez, lingoes and quasieuclid in the ade4 package). # Here we use the quasieuclid function. dis <- lapply(dis, quasieuclid) mdpcoa1 <- mdpcoa(sam, dis, scannf = FALSE, nf = 2) # Reference analysis plot(mdpcoa1) # Differences between the loci kplot(mdpcoa1) # Alleles projected on the population maps. kplotX.mdpcoa(mdpcoa1) } } \keyword{multivariate} ade4/man/divc.Rd0000644000176200001440000000267313047116774013100 0ustar liggesusers\name{divc} \alias{divc} \title{Rao's diversity coefficient also called quadratic entropy} \description{ Calculates Rao's diversity coefficient within samples. } \usage{ divc(df, dis, scale) } \arguments{ \item{df}{a data frame with elements as rows, samples as columns, and abundance, presence-absence or frequencies as entries} \item{dis}{an object of class \code{dist} containing distances or dissimilarities among elements. If \code{dis} is NULL, Gini-Simpson index is performed.} \item{scale}{a logical value indicating whether or not the diversity coefficient should be scaled by its maximal value over all frequency distributions.} } \value{ Returns a data frame with samples as rows and the diversity coefficient within samples as columns } \references{ Rao, C.R. (1982) Diversity and dissimilarity coefficients: a unified approach. \emph{Theoretical Population Biology}, \bold{21}, 24--43. Gini, C. (1912) Variabilità e mutabilità. \emph{Universite di Cagliari III}, Parte II. Simpson, E.H. (1949) Measurement of diversity. \emph{Nature}, \bold{163}, 688. Champely, S. and Chessel, D. (2002) Measuring biological diversity using Euclidean metrics. \emph{Environmental and Ecological Statistics}, \bold{9}, 167--177. } \author{Sandrine Pavoine \email{pavoine@mnhn.fr} } \examples{ data(ecomor) dtaxo <- dist.taxo(ecomor$taxo) divc(ecomor$habitat, dtaxo) data(humDNAm) divc(humDNAm$samples, sqrt(humDNAm$distances)) } \keyword{multivariate} ade4/man/costatis.Rd0000644000176200001440000000316413021372261013763 0ustar liggesusers\name{costatis} \alias{costatis} \title{STATIS and Co-Inertia : Analysis of a series of paired ecological tables} \description{ Analysis of a series of pairs of ecological tables. This function uses Partial Triadic Analysis (\link{pta}) and \link{coinertia} to do the computations. } \usage{ costatis(KTX, KTY, scannf = TRUE) } \arguments{ \item{KTX}{an objet of class ktab} \item{KTY}{an objet of class ktab} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} } \details{ This function takes 2 ktabs. It does a PTA (partial triadic analysis: \link{pta}) on each ktab, and does a coinertia analysis (\link{coinertia}) on the compromises of the two PTAs. } \value{ a list of class coinertia, subclass dudi. See \link{coinertia} } \references{ Thioulouse J. (2011). Simultaneous analysis of a sequence of paired ecological tables: a comparison of several methods. \emph{Annals of Applied Statistics}, \bold{5}, 2300-2325. } \author{Jean Thioulouse \email{Jean.Thioulouse@univ-lyon1.fr}} \section{WARNING }{ IMPORTANT : KTX and KTY must have the same k-tables structure, the same number of columns, and the same column weights. } \examples{ data(meau) wit1 <- withinpca(meau$env, meau$design$season, scan = FALSE, scal = "total") pcaspe <- dudi.pca(meau$spe, scale = FALSE, scan = FALSE, nf = 2) wit2 <- wca(pcaspe, meau$design$season, scan = FALSE, nf = 2) kta1 <- ktab.within(wit1, colnames = rep(c("S1","S2","S3","S4","S5","S6"), 4)) kta2 <- ktab.within(wit2, colnames = rep(c("S1","S2","S3","S4","S5","S6"), 4)) costatis1 <- costatis(kta1, kta2, scan = FALSE) plot(costatis1) } \keyword{multivariate} ade4/man/sco.match.Rd0000644000176200001440000000464213021372261014013 0ustar liggesusers\name{sco.match} \alias{sco.match} \title{1D plot of a pair of numeric scores with labels} \description{ Draws evenly spaced labels, each label linked to the corresponding values of two numeric score. } \usage{ sco.match(score1, score2, label = names(score1), clabel = 1, horizontal = TRUE, reverse = FALSE, pos.lab = 0.5, wmatch = 3, pch = 20, cpoint = 1, boxes = TRUE, lim = NULL, grid = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0, 0), sub = "", csub = 1.25, possub = "bottomleft") } \arguments{ \item{score1}{a numeric vector} \item{score2}{a numeric vector} \item{label}{labels for the score} \item{clabel}{a character size for the labels, used with \code{par("cex")*clabel}} \item{horizontal}{logical. If TRUE, the plot is horizontal} \item{reverse}{logical. If horizontal = TRUE and reverse=TRUE, the plot is at the bottom, if reverse = FALSE, the plot is at the top. If horizontal = FALSE, the plot is at the right (TRUE) or at the left (FALSE).} \item{pos.lab}{a values between 0 and 1 to manage the position of the labels.} \item{wmatch}{a numeric values to specify the width of the matching region in the plot. The width is equal to wmatch * the height of character} \item{pch}{an integer specifying the symbol or the single character to be used in plotting points} \item{cpoint}{a character size for plotting the points, used with \code{par("cex")*cpoint}. If zero, no points are drawn} \item{boxes}{if TRUE, labels are framed} \item{lim}{the range for the x axis or y axis (if horizontal = FALSE), if NULL, they are computed} \item{grid}{a logical value indicating whether a grid in the background of the plot should be drawn} \item{cgrid}{a character size, parameter used with par("cex")* \code{cgrid} to indicate the mesh of the grid} \item{include.origin}{a logical value indicating whether the point "origin" should belong to the plot} \item{origin}{the fixed point in the graph space, for example c(0,0) the origin axes} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} } \value{ The matched call. } \author{Stéphane Dray \email{stephane.dray@univ-lyon1.fr}} \examples{ sco.match(-5:5,2*(-5:5)) } \keyword{multivariate} \keyword{hplot} ade4/man/ade4.package.Rd0000644000176200001440000000253513341520114014337 0ustar liggesusers\name{ade4-package} \alias{ade4-package} \alias{ade4} \docType{package} \title{The ade4 package} \description{This package is developed in the Biometry and Evolutionary Biology Lab (UMR CNRS 5558) - University Lyon 1. It contains Data Analysis functions to analyse Ecological and Environmental data in the framework of Euclidean Exploratory methods, hence the name ade4.\cr ade4 is characterized by (1) the implementation of graphical and statistical functions, (2) the availability of numerical data, (3) the redaction of technical and thematic documentation and (4) the inclusion of bibliographic references. \cr To cite ade4, please use \code{citation("ade4")}. } \author{Stéphane Dray, Anne-Béatrice Dufour, and Jean Thioulouse. Contributions from Daniel Borcard, Stéphanie Bougeard, Thibaut Jombart, Pierre Legendre, Jean R. Lobry, Sébastien Ollier, Sandrine Pavoine and Aurélie Siberchicot. Based on earlier work by Daniel Chessel.} \references{ Dray S and Dufour A (2007). “The ade4 Package: Implementing the Duality Diagram for Ecologists.” _Journal of Statistical Software_, *22*(4), pp. 1-20. doi: 10.18637/jss.v022.i04 (URL: http://doi.org/10.18637/jss.v022.i04). See ade4 website: \url{http://pbil.univ-lyon1.fr/ADE-4/} } \keyword{manip} \keyword{multivariate} \seealso{\code{ade4TkGUI}, \code{adegenet}, \code{adehabitat}, \code{adegraphics}} ade4/man/chatcat.Rd0000644000176200001440000000176513021372261013546 0ustar liggesusers\name{chatcat} \alias{chatcat} \docType{data} \title{Qualitative Weighted Variables} \description{ This data set gives the age, the fecundity and the number of litters for 26 groups of cats. } \usage{data(chatcat)} \format{ \code{chatcat} is a list of two objects : \describe{ \item{tab}{is a data frame with 3 factors (age, feco, nport). } \item{eff}{is a vector of numbers. } } } \details{ One row of \code{tab} corresponds to one group of cats.\cr The value in \code{eff} is the number of cats in this group. } \source{ Pontier, D. (1984) \emph{Contribution à la biologie et à la génétique des populations de chats domestiques (Felis catus).} Thèse de 3ème cycle. Université Lyon 1, p. 67. } \examples{ data(chatcat) summary(chatcat$tab) w <- acm.disjonctif(chatcat$tab) # Disjonctive table names(w) <- c(paste("A", 1:5, sep = ""), paste("B", 1:5, sep = ""), paste("C", 1:2, sep = "")) w <- t(w*chatcat$num)%*%as.matrix(w) w <- data.frame(w) w # BURT table } \keyword{datasets} ade4/man/sco.quant.Rd0000644000176200001440000000235412576021756014063 0ustar liggesusers\name{sco.quant} \alias{sco.quant} \title{Graph to Analyse the Relation between a Score and Quantitative Variables} \description{ represents the graphs to analyse the relation between a score and quantitative variables. } \usage{ sco.quant (score, df, fac = NULL, clabel = 1, abline = FALSE, sub = names(df), csub = 2, possub = "topleft") } \arguments{ \item{score}{a numeric vector} \item{df}{a data frame which rows equal to the score length} \item{fac}{a factor with the same length than the score} \item{clabel}{character size for the class labels (if any) used with \code{par("cex")*clabel}} \item{abline}{a logical value indicating whether a regression line should be added} \item{sub}{a vector of strings of characters for the labels of variables} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} } \author{Daniel Chessel } \examples{ w <- runif(100, -5, 10) fw <- cut (w, 5) levels(fw) <- LETTERS[1:5] wX <- data.frame(matrix(w + rnorm(900, sd = (1:900) / 100), 100, 9)) sco.quant(w, wX, fac = fw, abline = TRUE, clab = 2, csub = 3) } \keyword{hplot} \keyword{multivariate} ade4/man/bicenter.wt.Rd0000644000176200001440000000120112576021756014362 0ustar liggesusers\name{bicenter.wt} \alias{bicenter.wt} \title{Double Weighted Centring} \description{ This function creates a doubly centred matrix. } \usage{ bicenter.wt(X, row.wt = rep(1, nrow(X)), col.wt = rep(1, ncol(X))) } \arguments{ \item{X}{a matrix with n rows and p columns} \item{row.wt}{a vector of positive or null weights of length n} \item{col.wt}{a vector of positive or null weights of length p} } \value{ returns a doubly centred matrix } \author{ Daniel Chessel } \examples{ w <- matrix(1:6, 3, 2) bicenter.wt(w, c(0.2,0.6,0.2), c(0.3,0.7)) w <- matrix(1:20, 5, 4) sum(bicenter.wt(w, runif(5), runif(4))^2) } \keyword{utilities} ade4/man/tithonia.Rd0000644000176200001440000000375312576021756013773 0ustar liggesusers\name{tithonia} \alias{tithonia} \docType{data} \title{Phylogeny and quantitative traits of flowers} \description{ This data set describes the phylogeny of 11 flowers as reported by Morales (2000). It also gives morphologic and demographic traits corresponding to these 11 species. } \usage{data(tithonia)} \format{ \code{tithonia} is a list containing the 2 following objects : \describe{ \item{tre}{is a character string giving the phylogenetic tree in Newick format.} \item{tab}{is a data frame with 11 species and 14 traits (6 morphologic traits and 8 demographic).} }} \details{ Variables of \code{tithonia$tab} are the following ones : \cr morho1: is a numeric vector that describes the seed size (mm)\cr morho2: is a numeric vector that describes the flower size (mm)\cr morho3: is a numeric vector that describes the female leaf size (cm)\cr morho4: is a numeric vector that describes the head size (mm)\cr morho5: is a integer vector that describes the number of flowers per head \cr morho6: is a integer vector that describes the number of seeds per head \cr demo7: is a numeric vector that describes the seedling height (cm)\cr demo8: is a numeric vector that describes the growth rate (cm/day)\cr demo9: is a numeric vector that describes the germination time\cr demo10: is a numeric vector that describes the establishment (per cent)\cr demo11: is a numeric vector that describes the viability (per cent)\cr demo12: is a numeric vector that describes the germination (per cent)\cr demo13: is a integer vector that describes the resource allocation\cr demo14: is a numeric vector that describes the adult height (m)\cr } \source{ Data were obtained from Morales, E. (2000) Estimating phylogenetic inertia in Tithonia (Asteraceae) : a comparative approach. \emph{Evolution}, \bold{54}, 2, 475--484. } \examples{ data(tithonia) phy <- newick2phylog(tithonia$tre) tab <- log(tithonia$tab + 1) table.phylog(scalewt(tab), phy) gearymoran(phy$Wmat, tab) gearymoran(phy$Amat, tab) } \keyword{datasets} ade4/man/ungulates.Rd0000644000176200001440000000361513175633655014163 0ustar liggesusers\name{ungulates} \alias{ungulates} \docType{data} \title{Phylogeny and quantitative traits of ungulates.} \description{ This data set describes the phylogeny of 18 ungulates as reported by Pélabon et al. (1995). It also gives 4 traits corresponding to these 18 species. } \usage{data(ungulates)} \format{ \code{fission} is a list containing the 2 following objects : \describe{ \item{tre}{is a character string giving the phylogenetic tree in Newick format.} \item{tab}{is a data frame with 18 species and 4 traits} }} \details{ Variables of \code{ungulates$tab} are the following ones : \cr afbw: is a numeric vector that describes the adult female body weight (g) \cr mnw: is a numeric vector that describes the male neonatal weight (g) \cr fnw: is a numeric vector that describes the female neonatal weight (g) \cr ls: is a numeric vector that describes the litter size \cr } \source{ Data were obtained from Pélabon, C., Gaillard, J.M., Loison, A. and Portier, A. (1995) Is sex-biased maternal care limited by total maternal expenditure in polygynous ungulates? \emph{Behavioral Ecology and Sociobiology}, \bold{37}, 311--319. } \examples{ data(ungulates) ung.phy <- newick2phylog(ungulates$tre) plot(ung.phy,clabel.l=1.25,clabel.n=0.75) ung.x <- log(ungulates$tab[,1]) ung.y <- log((ungulates$tab[,2]+ungulates$tab[,3])/2) names(ung.x) <- names(ung.phy$leaves) names(ung.y) <- names(ung.x) plot(ung.x,ung.y) abline(lm(ung.y~ung.x)) symbols.phylog(ung.phy,ung.x-mean(ung.x)) dotchart.phylog(ung.phy,ung.x,cle=1.5,cno=1.5,cdot=1) if (requireNamespace("adephylo", quietly = TRUE) & requireNamespace("ape", quietly = TRUE)) { tre <- ape::read.tree(text = ungulates$tre) adephylo::orthogram(ung.x, tre) ung.z <- residuals(lm(ung.y~ung.x)) names(ung.z) <- names(ung.phy$leaves) dotchart.phylog(ung.phy,ung.z,cle=1.5,cno=1.5,cdot=1,ceti=0.75) adephylo::orthogram(ung.z, tre) } } \keyword{datasets} ade4/man/s.match.Rd0000644000176200001440000000576612576021756013517 0ustar liggesusers\name{s.match} \alias{s.match} \title{Plot of Paired Coordinates} \description{ performs the scatter diagram for a paired coordinates. } \usage{ s.match(df1xy, df2xy, xax = 1, yax = 2, pch = 20, cpoint = 1, label = row.names(df1xy), clabel=1, edge = TRUE, xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0,0), sub = "", csub = 1.25, possub = "bottomleft", pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) } \arguments{ \item{df1xy}{a data frame containing two columns from the first system} \item{df2xy}{a data frame containing two columns from teh second system} \item{xax}{the column number for the x-axis of both the two systems} \item{yax}{the column number for the y-axis of both the two systems} \item{pch}{if \code{cpoint} > 0, an integer specifying the symbol or the single character to be used in plotting points} \item{cpoint}{a character size for plotting the points, used with \code{par("cex")*cpoint}. If zero, no points are drawn } \item{label}{a vector of strings of characters for the couple labels} \item{clabel}{if not NULL, a character size for the labels, used with \code{par("cex")*clabel} } \item{edge}{If TRUE the arrows are plotted, otherwise only the segments are drawn} \item{xlim}{the ranges to be encompassed by the x axis, if NULL they are computed} \item{ylim}{the ranges to be encompassed by the y axis, if NULL they are computed} \item{grid}{a logical value indicating whether a grid in the background of the plot should be drawn} \item{addaxes}{a logical value indicating whether the axes should be plotted} \item{cgrid}{a character size, parameter used with par("cex")* \code{cgrid} to indicate the mesh of the grid} \item{include.origin}{a logical value indicating whether the point "origin" should be belonged to the graph space} \item{origin}{the fixed point in the graph space, for example c(0,0) the origin axes} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{pixmap}{aan object \code{pixmap} displayed in the map background} \item{contour}{a data frame with 4 columns to plot the contour of the map : each row gives a segment (x1,y1,x2,y2)} \item{area}{a data frame of class 'area' to plot a set of surface units in contour} \item{add.plot}{if TRUE uses the current graphics window} } \value{ The matched call. } \author{Daniel Chessel} \examples{ if(!adegraphicsLoaded()) { X <- data.frame(x = runif(50, -1, 2), y = runif(50, -1, 2)) Y <- X + rnorm(100, sd = 0.3) par(mfrow = c(2, 2)) s.match(X, Y) s.match(X, Y, edge = FALSE, clab = 0) s.match(X, Y, edge = FALSE, clab = 0) s.label(X, clab = 1, add.plot = TRUE) s.label(Y, clab = 0.75, add.plot = TRUE) s.match(Y, X, clab = 0) par(mfrow = c(1, 1)) }} \keyword{multivariate} \keyword{hplot} ade4/man/maples.Rd0000644000176200001440000000260613317647300013422 0ustar liggesusers\name{maples} \alias{maples} \docType{data} \title{Phylogeny and quantitative traits of flowers} \description{ This data set describes the phylogeny of 17 flowers as reported by Ackerly and Donoghue (1998). It also gives 31 traits corresponding to these 17 species. } \usage{data(maples)} \format{ \code{tithonia} is a list containing the 2 following objects : \describe{ \item{tre}{is a character string giving the phylogenetic tree in Newick format.} \item{tab}{is a data frame with 17 species and 31 traits} } } \references{ Ackerly, D. D. and Donoghue, M.J. (1998) Leaf size, sapling allometry, and Corner's rules: phylogeny and correlated evolution in Maples (Acer). \emph{American Naturalist}, \bold{152}, 767--791. } \examples{ data(maples) phy <- newick2phylog(maples$tre) dom <- maples$tab$Dom bif <- maples$tab$Bif if (requireNamespace("adephylo", quietly = TRUE) & requireNamespace("ape", quietly = TRUE)) { phylo <- ape::read.tree(text = maples$tre) adephylo::orthogram(dom, tre = phylo) adephylo::orthogram(bif, tre = phylo) par(mfrow = c(1, 2)) dotchart.phylog(phy, dom) dotchart.phylog(phy, bif, clabel.nodes = 0.7) par(mfrow = c(1, 1)) plot(bif, dom, pch = 20) abline(lm(dom~bif)) summary(lm(dom~bif)) cor.test(bif, dom) pic.bif <- ape::pic(bif, phylo) pic.dom <- ape::pic(dom, phylo) cor.test(pic.bif, pic.dom) } } \keyword{datasets} ade4/man/elec88.Rd0000644000176200001440000000663013175633655013244 0ustar liggesusers\name{elec88} \alias{elec88} \docType{data} \title{Electoral Data} \description{ This data set gives the results of the presidential election in France in 1988 for each department and all the candidates. } \usage{data(elec88)} \format{\code{elec88} is a list with the following components: \describe{ \item{tab}{a data frame with 94 rows (departments) and 9 variables (candidates)} \item{res}{the global result of the election all-over the country} \item{lab}{a data frame with two variables: \code{elec88$lab$dep} is a vector containing the names of the 94 french departments, \code{elec88$lab$reg} is a vector containing the names of the 21 French administrative regions.} \item{area}{the data frame of 3 variables returning the boundary lines of each department. The first variable is a factor. The levels of this one are the row.names of \code{tab}. The second and third variables return the coordinates (x, y) of the points of the boundary line.} \item{contour}{a data frame with 4 variables (x1, y1, x2, y2) for the contour display of France} \item{xy}{a data frame with two variables (x, y) giving the position of the center for each department} \item{neig}{the neighbouring graph between departments, object of the class \code{neig}} \item{nb}{the neighbouring graph between departments, object of the class \code{nb}} \item{Spatial}{the map of the french departments in Lambert II coordinates (an object of the class \code{SpatialPolygons} of \code{sp})} \item{Spatial.contour}{the contour of the map of France in Lambert II coordinates (an object of the class \code{SpatialPolygons} of \code{sp})} }} \source{Public data} \seealso{This dataset is compatible with \code{presid2002} and \code{cnc2003}} \examples{ data(elec88) apply(elec88$tab, 2, mean) summary(elec88$res) pca1 <- dudi.pca(elec88$tab, scale = FALSE, scannf = FALSE) if(adegraphicsLoaded()) { if(requireNamespace("sp", quietly = TRUE)) { data1 <- as.data.frame(as.numeric(rownames(elec88$tab) == "D25")) rownames(data1) <- row.names(elec88$Spatial) obj1 <- sp::SpatialPolygonsDataFrame(Sr = elec88$Spatial, data = data1) g1 <- s.Spatial(obj1, psub.text = "", plot = FALSE) g2 <- s.Spatial(obj1, psub.text = "", nb = elec88$nb, pnb.node.cex = 0, plot = FALSE) data3 <- as.data.frame(elec88$xy[, 1] + elec88$xy[, 2]) rownames(data3) <- row.names(elec88$Spatial) obj3 <- sp::SpatialPolygonsDataFrame(Sr = elec88$Spatial, data = data3) g3 <- s.Spatial(obj3, psub.text = "", plot = FALSE) data4 <- as.data.frame(pca1$li[, 1]) rownames(data4) <- row.names(elec88$Spatial) obj4 <- sp::SpatialPolygonsDataFrame(Sr = elec88$Spatial, data = data4) g4 <- s.Spatial(obj4, psub.text = "F1 PCA", plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } } else { par(mfrow = c(2, 2)) plot(elec88$area[, 2:3], type = "n", asp = 1) lpoly <- split(elec88$area[, 2:3], elec88$area[, 1]) lapply(lpoly, function(x) {points(x, type = "l"); invisible()}) polygon(elec88$area[elec88$area$V1 == "D25", 2:3], col = 1) area.plot(elec88$area, graph = elec88$neig, lwdg = 1) polygon(elec88$area[elec88$area$V1 == "D25", 2:3], col = 1) area.plot(elec88$area, val = elec88$xy[, 1] + elec88$xy[, 2]) area.plot(elec88$area, val = pca1$li[, 1], sub = "F1 PCA", csub = 2, cleg = 1.5) par(mfrow = c(1, 1)) }} \keyword{datasets}ade4/man/randtest.coinertia.Rd0000644000176200001440000000426513021372261015735 0ustar liggesusers\name{randtest.coinertia} \alias{randtest.coinertia} \title{Monte-Carlo test on a Co-inertia analysis (in C).} \description{ Performs a Monte-Carlo test on a Co-inertia analysis. } \usage{ \method{randtest}{coinertia}(xtest, nrepet = 999, fixed=0, \dots) } \arguments{ \item{xtest}{an object of class \code{coinertia}} \item{nrepet}{the number of permutations} \item{fixed}{when non uniform row weights are used in the coinertia analysis, this parameter must be the number of the table that should be kept fixed in the permutations} \item{\dots}{further arguments passed to or from other methods} } \value{ a list of the class \code{randtest} } \references{ Dolédec, S. and Chessel, D. (1994) Co-inertia analysis: an alternative method for studying species-environment relationships. \emph{Freshwater Biology}, \bold{31}, 277--294. } \author{Jean Thioulouse \email{Jean.Thioulouse@univ-lyon1.fr} modified by Stéphane Dray \email{stephane.dray@univ-lyon1.fr}} \note{A testing procedure based on the total coinertia of the analysis is available by the function \code{randtest.coinertia}. The function allows to deal with various analyses for the two tables. The test is based on random permutations of the rows of the two tables. If the row weights are not uniform, mean and variances are recomputed for each permutation (PCA); for MCA, tables are recentred and column weights are recomputed. If weights are computed using the data contained in one table (e.g. COA), you must fix this table and permute only the rows of the other table. The case of decentred PCA (PCA where centers are entered by the user) is not yet implemented. If you want to use the testing procedure for this case, you must firstly center the table and then perform a non-centered PCA on the modified table. The case where one table is treated by hill-smith analysis (mix of quantitative and qualitative variables) will be soon implemented.} \examples{ data(doubs) dudi1 <- dudi.pca(doubs$env, scale = TRUE, scan = FALSE, nf = 3) dudi2 <- dudi.pca(doubs$fish, scale = FALSE, scan = FALSE, nf = 2) coin1 <- coinertia(dudi1,dudi2, scan = FALSE, nf = 2) plot(randtest(coin1)) } \keyword{multivariate} \keyword{nonparametric} ade4/man/pap.Rd0000644000176200001440000000171312576021756012726 0ustar liggesusers\name{pap} \alias{pap} \docType{data} \title{Taxonomy and quantitative traits of carnivora} \description{ This data set describes the taxonomy of 39 carnivora. It also gives life-history traits corresponding to these 39 species. } \usage{data(pap)} \format{ \code{pap} is a list containing the 2 following objects : \describe{ \item{taxo}{is a data frame with 39 species and 3 columns.} \item{tab}{is a data frame with 39 species and 4 traits.} }} \details{ Variables of \code{pap$tab} are the following ones : genre (genus with 30 levels), famille (family with 6 levels), superfamille (superfamily with 2 levels).\cr Variables of \code{pap$tab} are Group Size, Body Weight, Brain Weight, Litter Size. } \source{ Data taken from the phylogenetic autocorrelation package } \examples{ data(pap) taxo <- taxo2phylog(as.taxo(pap$taxo)) table.phylog(as.data.frame(scalewt(pap$tab)), taxo, csi = 2, clabel.nod = 0.6, f.phylog = 0.6) } \keyword{datasets} ade4/man/ade4-deprecated.Rd0000644000176200001440000000257113474205664015064 0ustar liggesusers\encoding{UTF-8} \name{Deprecated functions} \alias{ade4-deprecated} \title{Deprecated functions in ade4} \description{ The functions/data listed below are deprecated. The R code of the deprecated functions are stored for memory in the file \code{ade4-deprecated.R}. - \code{between}: replaced by \code{bca} \cr - \code{betweencoinertia}: replaced by \code{bca.coinertia} \cr - \code{char2genet}: replaced by \code{df2genind} and \code{genind2genpop} in the \code{adegenet} package \cr - \code{count2genet}: replaced by \code{df2genind} and \code{genind2genpop} in the \code{adegenet} package \cr - \code{dist.genet}: replaced by \code{dist.genpop} in the \code{adegenet} package \cr - \code{EH}: replaced by \code{EH} in the \code{adiv} package \cr - \code{freq2genet}: replaced by \code{df2genind} and \code{genind2genpop} in the \code{adegenet} package \cr - \code{fuzzygenet}: replaced by \code{df2genind} in the \code{adegenet} package \cr - \code{optimEH}: replaced by \code{optimEH} in the \code{adiv} package \cr - \code{orisaved}: replaced by \code{orisaved} in the \code{adiv} package \cr - \code{orthogram}: replaced by \code{orthogram} in the \code{adephylo} package \cr - \code{randEH}: replaced by \code{randEH} in the \code{adiv} package \cr - \code{within}: replaced by \code{wca} \cr - \code{withincoinertia}: replaced by \code{wca.coinertia} \cr } ade4/man/dudi.hillsmith.Rd0000644000176200001440000000453613021372261015057 0ustar liggesusers\name{dudi.hillsmith} \alias{dudi.hillsmith} \title{ Ordination of Tables mixing quantitative variables and factors } \description{ performs a multivariate analysis with mixed quantitative variables and factors.} \usage{dudi.hillsmith(df, row.w = rep(1, nrow(df))/nrow(df), scannf = TRUE, nf = 2) } \arguments{ \item{df}{ a data frame with mixed type variables (quantitative and factor) } \item{row.w}{ a vector of row weights, by default uniform row weights are used } \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} } \details{ If \code{df} contains only quantitative variables, this is equivalent to a normed PCA.\cr If \code{df} contains only factors, this is equivalent to a MCA.\cr This analysis is the Hill and Smith method and is very similar to \code{dudi.mix} function. The differences are that \code{dudi.hillsmith} allow to use various row weights, while \code{dudi.mix} deals with ordered variables.\cr The principal components of this analysis are centered and normed vectors maximizing the sum of :\cr squared correlation coefficients with quantitative variables\cr correlation ratios with factors\cr } \value{ Returns a list of class \code{mix} and \code{dudi} (see \link{dudi}) containing also \item{index}{a factor giving the type of each variable : f = factor, q = quantitative} \item{assign}{a factor indicating the initial variable for each column of the transformed table} \item{cr}{a data frame giving for each variable and each score:\cr the squared correlation coefficients if it is a quantitative variable\cr the correlation ratios if it is a factor } } \references{ Hill, M. O., and A. J. E. Smith. 1976. Principal component analysis of taxonomic data with multi-state discrete characters. \emph{Taxon}, \bold{25}, 249-255. } \author{Stéphane Dray \email{stephane.dray@univ-lyon1.fr}\cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \seealso{ \code{dudi.mix}} \examples{ data(dunedata) attributes(dunedata$envir$use)$class <- "factor" # use dudi.mix for ordered data dd1 <- dudi.hillsmith(dunedata$envir, scann = FALSE) if(adegraphicsLoaded()) { g <- scatter(dd1, row.plab.cex = 1, col.plab.cex = 1.5) } else { scatter(dd1, clab.r = 1, clab.c = 1.5) }} \keyword{multivariate} ade4/man/abouheif.eg.Rd0000644000176200001440000000335312576021756014324 0ustar liggesusers\name{abouheif.eg} \alias{abouheif.eg} \docType{data} \title{Phylogenies and quantitative traits from Abouheif} \description{ This data set gathers three phylogenies with three sets of traits as reported by Abouheif (1999). } \usage{data(abouheif.eg)} \format{ \code{abouheif.eg} is a list containing the 6 following objects : \describe{ \item{tre1}{is a character string giving the first phylogenetic tree made up of 8 leaves.} \item{vec1}{is a numeric vector with 8 values.} \item{tre2}{is a character string giving the second phylogenetic tree made up of 7 leaves.} \item{vec2}{is a numeric vector with 7 values.} \item{tre3}{is a character string giving the third phylogenetic tree made up of 15 leaves.} \item{vec3}{is a numeric vector with 15 values.} }} \source{ Data taken from the phylogenetic independence program developped by Ehab Abouheif } \references{ Abouheif, E. (1999) A method for testing the assumption of phylogenetic independence in comparative data. \emph{Evolutionary Ecology Research}, \bold{1}, 895--909. } \examples{ data(abouheif.eg) par(mfrow=c(2,2)) symbols.phylog(newick2phylog(abouheif.eg$tre1), abouheif.eg$vec1, sub = "Body Mass (kg)", csi = 2, csub = 2) symbols.phylog(newick2phylog(abouheif.eg$tre2), abouheif.eg$vec2, sub = "Body Mass (kg)", csi = 2, csub = 2) dotchart.phylog(newick2phylog(abouheif.eg$tre1), abouheif.eg$vec1, sub = "Body Mass (kg)", cdot = 2, cnod = 1, possub = "topleft", csub = 2, ceti = 1.5) dotchart.phylog(newick2phylog(abouheif.eg$tre2), abouheif.eg$vec2, sub = "Body Mass (kg)", cdot = 2, cnod = 1, possub = "topleft", csub = 2, ceti = 1.5) par(mfrow = c(1,1)) w.phy=newick2phylog(abouheif.eg$tre3) dotchart.phylog(w.phy,abouheif.eg$vec3, clabel.n = 1) } \keyword{datasets} ade4/man/veuvage.Rd0000644000176200001440000000175513021372261013600 0ustar liggesusers\name{veuvage} \alias{veuvage} \docType{data} \title{Example for Centring in PCA} \description{ The data come from the INSEE (National Institute of Statistics and Economical Studies). It is an array of widower percentages in relation with the age and the socioprofessional category. } \usage{data(veuvage)} \format{ \code{veuvage} is a list of 2 components. \describe{ \item{tab}{is a data frame with 37 rows (widowers) 6 columns (socio-professional categories)} \item{age}{is a vector of the ages of the 37 widowers. } } } \details{ The columns contain the socioprofessional categories:\cr 1- Farmers, 2- Craftsmen, 3- Executives and higher intellectual professions,\cr 4- Intermediate Professions, 5- Others white-collar workers and 6- Manual workers.\cr } \source{ unknown } \examples{ data(veuvage) par(mfrow = c(3,2)) for (j in 1:6) plot(veuvage$age, veuvage$tab[,j], xlab = "age", ylab = "pourcentage de veufs", type = "b", main = names(veuvage$tab)[j]) } \keyword{datasets} ade4/man/hdpg.Rd0000644000176200001440000000602213474205664013066 0ustar liggesusers\name{hdpg} \alias{hdpg} \docType{data} \title{Genetic Variation In Human Populations} \description{ This data set gives genotypes variation of 1066 individuals belonging to 52 predefined populations, for 404 microsatellite markers. } \usage{data(hdpg)} \format{ \code{hdpg} is a list of 3 components. \cr \describe{ \item{tab}{ is a data frame with the genotypes of 1066 individuals encoded with 6 characters (individuals in row, locus in column), for example \sQuote{123098} for a heterozygote carrying alleles \sQuote{123} and \sQuote{098}, \sQuote{123123} for a homozygote carrying two alleles \sQuote{123} and, \sQuote{000000} for a not classified locus (missing data). } \item{ind}{ is a a data frame with 4 columns containing information about the 1066 individuals: \code{hdpg$ind$id} containing the Diversity Panel identification number of each individual, and three factors \code{hdpg$ind$sex}, \code{hdpg$ind$population} and \code{hdpg$ind$region} containing the names of the 52 populations belonging to 7 major geographic regions (see details). } \item{locus}{ is a dataframe containing four columns: \code{hdpg$locus$marknames} a vector of names of the microsatellite markers, \code{hdpg$locus$allbyloc} a vector containing the number of alleles by loci, \code{hdpg$locus$chromosome} a factor defining a number for one chromosome and, \code{hdpg$locus$maposition} indicating the position of the locus in the chromosome. } } } \details{ The rows of \code{hdpg$pop} are the names of the 52 populations belonging to the geographic regions contained in the rows of \code{hdpg$region}. The chosen regions are: America, Asia, Europe, Middle East North Africa, Oceania, Subsaharan AFRICA. \cr The 52 populations are: Adygei, Balochi, Bantu, Basque, Bedouin, Bergamo, Biaka Pygmies, Brahui, Burusho, Cambodian, Columbian, Dai, Daur, Druze, French, Han, Hazara, Hezhen, Japanese, Kalash, Karitiana, Lahu, Makrani, Mandenka, Maya, Mbuti Pygmies, Melanesian, Miaozu, Mongola, Mozabite, Naxi, NewGuinea, Nilote, Orcadian, Oroqen, Palestinian, Pathan, Pima, Russian, San, Sardinian, She, Sindhi, Surui, Tu, Tujia, Tuscan, Uygur, Xibo, Yakut, Yizu, Yoruba. \cr \code{hdpg$freq} is a data frame with 52 rows, corresponding to the 52 populations described above, and 4992 microsatellite markers. } \source{ Extract of data prepared by the Human Diversity Panel Genotypes (invalid http://research.marshfieldclinic.org/genetics/Freq/FreqInfo.htm) prepared by Hinda Haned, from data used in: Noah A. Rosenberg, Jonatahan K. Pritchard, James L. Weber, Howard M. Cabb, Kenneth K. Kidds, Lev A. Zhivotovsky, Marcus W. Feldman (2002) Genetic Structure of human Populations \emph{Science}, \bold{298}, 2381--2385. Lev A. Zhivotovsky, Noah Rosenberg, and Marcus W. Feldman (2003). Features of Evolution and Expansion of Modern Humans, Inferred from Genomewide Microsatellite Markers \emph{Am. J. Hum. Genet}, \bold{72}, 1171--1186. } \examples{ data(hdpg) names(hdpg) str(hdpg) } \keyword{datasets} ade4/man/discrimin.Rd0000644000176200001440000000343713021372261014116 0ustar liggesusers\name{discrimin} \alias{discrimin} \alias{plot.discrimin} \alias{print.discrimin} \title{Linear Discriminant Analysis (descriptive statistic)} \description{ performs a linear discriminant analysis. } \usage{ discrimin(dudi, fac, scannf = TRUE, nf = 2) \method{plot}{discrimin}(x, xax = 1, yax = 2, \dots) \method{print}{discrimin}(x, \dots) } \arguments{ \item{dudi}{a duality diagram, object of class \code{dudi}} \item{fac}{a factor defining the classes of discriminant analysis} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} \cr \item{x}{an object of class 'discrimin'} \item{xax}{the column number of the x-axis} \item{yax}{the column number of the y-axis} \item{\dots}{further arguments passed to or from other methods} } \value{ returns a list of class 'discrimin' containing : \item{nf}{a numeric value indicating the number of kept axes} \item{eig}{a numeric vector with all the eigenvalues} \item{fa}{a matrix with the loadings: the canonical weights} \item{li}{a data frame which gives the canonical scores} \item{va}{a matrix which gives the cosines between the variables and the canonical scores} \item{cp}{a matrix which gives the cosines between the components and the canonical scores} \item{gc}{a data frame which gives the class scores} } \seealso{\code{lda} in package \code{MASS} } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(chazeb) dis1 <- discrimin(dudi.pca(chazeb$tab, scan = FALSE), chazeb$cla, scan = FALSE) dis1 if(!adegraphicsLoaded()) plot(dis1) data(skulls) plot(discrimin(dudi.pca(skulls, scan = FALSE), gl(5,30), scan = FALSE)) } \keyword{multivariate} ade4/man/ktab.Rd0000644000176200001440000000650713021372261013057 0ustar liggesusers\name{ktab} \alias{ktab} \alias{is.ktab} \alias{c.ktab} \alias{[.ktab} \alias{print.ktab} \alias{t.ktab} \alias{row.names.ktab} \alias{row.names<-.ktab} \alias{col.names} \alias{col.names.ktab} \alias{col.names<-} \alias{col.names<-.ktab} \alias{tab.names} \alias{tab.names.ktab} \alias{tab.names<-} \alias{tab.names<-.ktab} \alias{ktab.util.names} \alias{ktab.util.addfactor} \title{the class of objects 'ktab' (K-tables)} \description{ an object of class \code{ktab} is a list of data frames with the same row.names in common.\cr a list of class 'ktab' contains moreover : \describe{ \item{blo}{: the vector of the numbers of columns for each table} \item{lw}{: the vector of the row weightings in common for all tables} \item{cw}{: the vector of the column weightings} \item{TL}{: a data frame of two components to manage the parameter positions associated with the rows of tables} \item{TC}{: a data frame of two components to manage the parameter positions associated with the columns of tables} \item{T4}{: a data frame of two components to manage the parameter positions of 4 components associated to an array} } } \usage{ \method{c}{ktab}(...) \method{[}{ktab}(x,i,j,k) is.ktab(x) \method{t}{ktab}(x) \method{row.names}{ktab}(x) \method{col.names}{ktab}(x) tab.names(x) col.names(x) ktab.util.names(x) } \arguments{ \item{x}{an object of the class \code{ktab}} \item{\dots}{a sequence of objects of the class \code{ktab}} \item{i,j,k}{elements to extract (integer or empty): index of tables (i), rows (j) and columns (k)} } \details{ A 'ktab' object can be created with :\cr a list of data frame : \code{\link{ktab.list.df}}\cr a list of \code{dudi} objects : \code{\link{ktab.list.dudi}}\cr a data.frame : \code{\link{ktab.data.frame}}\cr an object \code{within} : \code{\link{ktab.within}}\cr a couple of \code{ktab}s : \code{\link{ktab.match2ktabs}}\cr } \value{ \code{c.ktab} returns an object \code{ktab}. It concatenates K-tables with the same rows in common. \cr \code{t.ktab} returns an object \code{ktab}. It permutes each data frame into a K-tables. All tables have the same column names and the same column weightings (a data cube). \cr \code{"["} returns an object \code{ktab}. It allows to select some arrays in a K-tables. \cr \code{is.ktab} returns TRUE if x is a K-tables. \cr \code{row.names} returns the vector of the row names common with all the tables of a K-tables and allowes to modifie them.\cr \code{col.names} returns the vector of the column names of a K-tables and allowes to modifie them.\cr \code{tab.names} returns the vector of the array names of a K-tables and allowes to modifie them.\cr \code{ktab.util.names} is a useful function. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \examples{ data(friday87) wfri <- data.frame(scale(friday87$fau, scal = FALSE)) wfri <- ktab.data.frame(wfri, friday87$fau.blo) wfri[2:4, 1:5, 1:3] c(wfri[2:4], wfri[5]) data(meaudret) wit1 <- withinpca(meaudret$env, meaudret$design$season, scan = FALSE, scal = "partial") kta1 <- ktab.within(wit1, colnames = rep(c("S1","S2","S3","S4","S5"), 4)) kta2 <- t(kta1) if(adegraphicsLoaded()) { kplot(sepan(kta2), row.plab.cex = 1.5, col.plab.cex = 0.75) } else { kplot(sepan(kta2), clab.r = 1.5, clab.c = 0.75) } } \keyword{multivariate} ade4/man/tarentaise.Rd0000644000176200001440000000356313021372261014274 0ustar liggesusers\name{tarentaise} \alias{tarentaise} \docType{data} \title{Mountain Avifauna} \description{ This data set gives informations between sites, species, environmental and biolgoical variables. } \usage{data(tarentaise)} \format{ \code{tarentaise} is a list of 5 components. \describe{ \item{ecol}{is a data frame with 376 sites and 98 bird species.} \item{frnames}{is a vector of the 98 French names of the species.} \item{alti}{is a vector giving the altitude of the 376 sites in m.} \item{envir}{is a data frame with 14 environmental variables.} \item{traits}{is a data frame with 29 biological variables of the 98 species.} } } \details{ The attribute \code{col.blocks} of the data frame \code{tarentaise$traits} indicates it is composed of 6 units of variables. } \source{ Original data from Hubert Tournier, University of Savoie and Philippe Lebreton, University of Lyon 1. } \references{ Lebreton, P., Tournier H. and Lebreton J. D. (1976) Etude de l'avifaune du Parc National de la Vanoise VI Recherches d'ordre quantitatif sur les Oiseaux forestiers de Vanoise. \emph{Travaux Scientifiques du parc National de la vanoise}, \bold{7}, 163--243. Lebreton, Ph. and Martinot, J.P. (1998) Oiseaux de Vanoise. Guide de l'ornithologue en montagne. \emph{Libris}, Grenoble. 1--240. Lebreton, Ph., Lebrun, Ph., Martinot, J.P., Miquet, A. and Tournier, H. (1999) Approche écologique de l'avifaune de la Vanoise. \emph{Travaux scientifiques du Parc national de la Vanoise}, \bold{21}, 7--304. See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps038.pdf} (in French). } \examples{ data(tarentaise) coa1 <- dudi.coa(tarentaise$ecol, sca = FALSE, nf = 2) s.class(coa1$li, tarentaise$envir$alti, wt = coa1$lw) \dontrun{ acm1 <- dudi.acm(tarentaise$envir, sca = FALSE, nf = 2) s.class(acm1$li, tarentaise$envir$alti) } } \keyword{datasets} ade4/man/ecomor.Rd0000644000176200001440000000767712576021756013451 0ustar liggesusers\name{ecomor} \alias{ecomor} \docType{data} \title{Ecomorphological Convergence} \description{ This data set gives ecomorphological informations about 129 bird species. } \usage{data(ecomor)} \format{ \code{ecomor} is a list of 7 components. \describe{ \item{forsub}{is a data frame with 129 species, 6 variables (the feeding place classes): foliage, ground , twig , bush, trunk and aerial feeders. These dummy variables indicate the use (1) or no use (0) of a given feeding place by a species. } \item{diet}{is a data frame with 129 species and 8 variables (diet types): Gr (granivorous: seeds), Fr (frugivorous: berries, acorns, drupes), Ne (frugivorous: nectar), Fo (folivorous: leaves), In (invertebrate feeder: insects, spiders, myriapods, isopods, snails, worms), Ca (carnivorous: flesh of small vertebrates), Li (limnivorous: invertebrates in fresh water), and Ch (carrion feeder). These dummy variables indicate the use (1) or no use (0) of a given diet type by a species.} \item{habitat}{is a data frame with 129 species, 16 dummy variables (the habitats). These variables indicate the species presence (1) or the species absence (0) in a given habitat.} \item{morpho}{is a data frame with 129 species abd 8 morphological variables: wingl (Wing length, mm), taill (Tail length, mm), culml (Culmen length, mm), bilh (Bill height, mm), bilw (Bill width, mm), tarsl (Tarsus length, mm), midtl (Middle toe length, mm) and weig (Weight, g).} \item{taxo}{is a data frame with 129 species and 3 factors: Genus, Family and Order. It is a data frame of class \code{'taxo'}: the variables are factors giving nested classifications.} \item{labels}{is a data frame with vectors of the names of species (complete and in abbreviated form.} \item{categ}{is a data frame with 129 species, 2 factors : 'forsub' summarizing the feeding place and 'diet' the diet type.} }} \source{ Blondel, J., Vuilleumier, F., Marcus, L.F., and Terouanne, E. (1984). Is there ecomorphological convergence among mediterranean bird communities of Chile, California, and France. In \emph{Evolutionary Biology} (eds M.K. Hecht, B. Wallace and R.J. MacIntyre), 141--213, \bold{18}. Plenum Press, New York. } \references{ See a data description at \url{http://pbil.univ-lyon1.fr/R/pdf/pps023.pdf} (in French). } \examples{ data(ecomor) ric <- apply(ecomor$habitat, 2, sum) s.corcircle(dudi.pca(log(ecomor$morpho), scan = FALSE)$co) forsub <- data.frame(t(apply(ecomor$forsub, 1, function (x) x / sum(x)))) pca1 <- dudi.pca(forsub, scan = FALSE, scale = FALSE) w1 <- as.matrix(forsub)%*%as.matrix(pca1$c1) if(adegraphicsLoaded()) { g1 <- s.arrow(pca1$c1, plot = FALSE) g2 <- s.label(w1, plab.cex = 0, ppoi.cex = 2, plot = FALSE) G1 <- superpose(g1, g2, plot = TRUE) } else { s.arrow(pca1$c1) s.label(w1, clab = 0, add.p = TRUE, cpoi = 2) } diet <- data.frame(t(apply(ecomor$diet, 1, function (x) x / sum(x)))) pca2 <- dudi.pca(diet, scan = FALSE, scale = FALSE) w2 <- as.matrix(diet)%*%as.matrix(pca2$c1) if(adegraphicsLoaded()) { g3 <- s.arrow(pca2$c1, plot = FALSE) g4 <- s.label(w2, plab.cex = 0, ppoi.cex = 2, plot = FALSE) G2 <- superpose(g3, g4, plot = TRUE) } else { s.arrow(pca2$c1) s.label(w2, clab = 0, add.p = TRUE, cpoi = 2) } \dontrun{ dmorpho <- dist.quant(log(ecomor$morpho), 3) dhabitat <- dist.binary(ecomor$habitat, 1) dtaxo <- dist.taxo(ecomor$taxo) mantel.randtest(dmorpho, dhabitat) RV.rtest(pcoscaled(dmorpho), pcoscaled(dhabitat), 999) procuste.randtest(pcoscaled(dmorpho), pcoscaled(dhabitat)) ecophy <- taxo2phylog(ecomor$taxo, add.tools=TRUE) table.phylog(ecomor$habitat, ecophy, clabel.n = 0.5, f = 0.6, clabel.c = 0.75, clabel.r = 0.5, csi = 0.75, cleg = 0) plot(ecophy, clabel.n = 0.75, clabel.l = 0.75, labels.l = ecomor$labels[,"latin"]) mantel.randtest(dmorpho, dtaxo) mantel.randtest(dhabitat, dtaxo) }} \keyword{datasets} ade4/man/kplot.mfa.Rd0000644000176200001440000000335112576021756014041 0ustar liggesusers\name{kplot.mfa} \alias{kplot.mfa} \title{Multiple Graphs for a Multiple Factorial Analysis} \description{ performs high level plots of a Multiple Factorial Analysis, using an object of class \code{mfa}. } \usage{ \method{kplot}{mfa}(object, xax = 1, yax = 2, mfrow = NULL, which.tab = 1:length(object$blo), row.names = FALSE, col.names = TRUE, traject = FALSE, permute.row.col = FALSE, clab = 1, csub = 2, possub = "bottomright", \dots) } \arguments{ \item{object}{an object of class \code{mfa}} \item{xax, yax}{the numbers of the x-axis and the y-axis} \item{mfrow}{a vector of the form 'c(nr,nc'), otherwise computed by a special own function \code{n2mfrow}} \item{which.tab}{vector of the numbers of tables used for the analysis} \item{row.names}{a logical value indicating whether the row labels should be inserted} \item{col.names}{a logical value indicating whether the column labels should be inserted} \item{traject}{a logical value indicating whether the trajectories of the rows should be drawn in a natural order} \item{permute.row.col}{if TRUE, the rows are represented by vectors and columns by points, otherwise it is the opposite} \item{clab}{a character size for the labels} \item{csub}{a character size for the sub-titles, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{\dots}{further arguments passed to or from other methods} } \author{Daniel Chessel } \examples{ data(friday87) w1 <- data.frame(scale(friday87$fau, scal = FALSE)) w2 <- ktab.data.frame(w1, friday87$fau.blo, tabnames = friday87$tab.names) mfa1 <- mfa(w2, scann = FALSE) kplot(mfa1) } \keyword{multivariate} \keyword{hplot} ade4/man/capitales.Rd0000644000176200001440000000441713175633655014122 0ustar liggesusers\name{capitales} \alias{capitales} \docType{data} \title{Road Distances} \description{ This data set gives the road distances between 15 European capitals and their coordinates. } \usage{data(capitales)} \format{\code{capitales} is a list with the following components: \describe{ \item{xy}{a data frame containing the coordinates of capitals} \item{area}{a data frame containing three variables, designed to be used in area.plot function} \item{logo}{a list of pixmap objects, each one symbolizing a capital} \item{Spatial}{an object of the class \code{SpatialPolygons} of \code{sp}, containing the map} \item{dist}{a dist object the road distances between 15 European capitals} }} \examples{ data(capitales) attr(capitales$dist, "Labels") index <- pmatch(tolower(attr(capitales$dist, "Labels")), names(capitales$logo)) w1 <- capitales$area if(adegraphicsLoaded()) { if(requireNamespace("sp", quietly = TRUE)) { g1 <- s.label(capitales$xy, lab = rownames(capitales$xy), porigin.include = FALSE, plot = FALSE) g2 <- s.logo(capitales$xy[sort(rownames(capitales$xy)), ], capitales$logo, Sp = capitales$Spatial, pbackground.col = "lightblue", pSp.col = "white", pgrid.draw = FALSE, plot = FALSE) g3 <- table.value(capitales$dist, ptable.margin = list(b = 5, l = 5, t = 15, r = 15), ptable.x.tck = 3, ptable.y.tck = 3, plot = FALSE) g4 <- s.logo(pcoscaled(lingoes(capitales$dist)), capitales$logo[index], plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } } else { if(requireNamespace("pixmap", quietly = TRUE)) { par(mfrow = c(2, 2)) s.label(capitales$xy, lab = attr(capitales$dist, "Labels"), include.origin = FALSE) area.plot(w1) rect(min(w1$x), min(w1$y), max(w1$x), max(w1$y), col = "lightblue") invisible(lapply(split(w1, w1$id), function(x) polygon(x[, -1], col = "white"))) s.logo(capitales$xy, capitales$logo, klogo = index, add.plot = TRUE, include.origin = FALSE, clogo = 0.5) # depends on pixmap table.dist(capitales$dist, lab = attr(capitales$dist, "Labels")) # depends on mva s.logo(pcoscaled(lingoes(capitales$dist)), capitales$logo, klogo = index, clogo = 0.5) # depends on pixmap par(mfrow = c(1, 1)) } } } \keyword{datasets}ade4/man/clementines.Rd0000644000176200001440000000263313021372261014440 0ustar liggesusers\name{clementines} \alias{clementines} \docType{data} \title{Fruit Production} \description{ The \code{clementines} is a data set containing the fruit production of 20 clementine trees during 15 years. } \usage{data(clementines)} \format{ A data frame with 15 rows and 20 columns } \source{ Tisné-Agostini, D. (1988) \emph{Description par analyse en composantes principales de l'évolution de la production du clémentinier en association avec 12 types de porte-greffe}. Rapport technique, DEA Analyse et modélisation des systèmes biologiques, Université Lyon 1. } \examples{ data(clementines) op <- par(no.readonly = TRUE) par(mfrow = c(5, 4)) par(mar = c(2, 2, 1, 1)) for(i in 1:20) { w0 <- 1:15 plot(w0, clementines[, i], type = "b") abline(lm(clementines[, i] ~ w0)) } par(op) pca1 <- dudi.pca(clementines, scan = FALSE) if(adegraphicsLoaded()) { g1 <- s.corcircle(pca1$co, plab.cex = 0.75) g2 <- s1d.barchart(pca1$li[, 1], p1d.hori = FALSE) } else { s.corcircle(pca1$co, clab = 0.75) barplot(pca1$li[, 1]) } op <- par(no.readonly = TRUE) par(mfrow = c(5, 4)) par(mar = c(2, 2, 1, 1)) clem0 <- pca1$tab croi <- 1:15 alter <- c(rep(c(1, -1), 7), 1) for(i in 1:20) { y <- clem0[,i] plot(w0, y, type = "b", ylim = c(-2, 2)) z <- predict(lm(clem0[, i] ~ croi * alter)) points(w0, z, pch = 20, cex = 2) for(j in 1:15) segments(j, y[j], j, z[j]) } par(op) par(mfrow = c(1, 1)) } \keyword{datasets} ade4/man/score.acm.Rd0000644000176200001440000000227312576021756014022 0ustar liggesusers\name{score.acm} \alias{score.acm} \title{Graphs to study one factor in a Multiple Correspondence Analysis} \description{ performs the canonical graph of a Multiple Correspondence Analysis. } \usage{ \method{score}{acm}(x, xax = 1, which.var = NULL, mfrow = NULL, sub = names(oritab), csub = 2, possub = "topleft", \dots) } \arguments{ \item{x}{an object of class \code{acm}} \item{xax}{the column number for the used axis} \item{which.var}{the numbers of the kept columns for the analysis, otherwise all columns} \item{mfrow}{a vector of the form "c(nr,nc)", otherwise computed by a special own function \code{n2mfrow}} \item{sub}{a vector of strings of characters to be inserted as sub-titles, otherwise the variable names of the initial array} \item{csub}{a character size for the sub-titles} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{\dots}{further arguments passed to or from other methods} } \author{Daniel Chessel} \examples{ data(banque) banque.acm <- dudi.acm(banque, scann = FALSE, nf = 3) score(banque.acm, which = which(banque.acm$cr[, 1] > 0.2)) } \keyword{multivariate} \keyword{hplot} ade4/man/perthi02.Rd0000644000176200001440000000166312576021756013607 0ustar liggesusers\name{perthi02} \alias{perthi02} \docType{data} \title{Contingency Table with a partition in Molecular Biology} \description{ This data set gives the amino acids of 904 proteins distributed in three classes. } \usage{data(perthi02)} \format{ \code{perthi02} is a list of 2 components. \describe{ \item{tab}{is a data frame 904 rows (proteins of 201 species) 20 columns (amino acids).} \item{cla}{is a factor of 3 classes of protein} } The levels of \code{perthi02$cla} are \code{cyto} (cytoplasmic proteins) \code{memb} (integral membran proteins) \code{peri} (periplasmic proteins) } \source{ Perriere, G. and Thioulouse, J. (2002) Use of Correspondence Discriminant Analysis to predict the subcellular location of bacterial proteins. \emph{Computer Methods and Programs in Biomedicine}, \bold{70}, 2, 99--105. } \examples{ data(perthi02) plot(discrimin.coa(perthi02$tab, perthi02$cla, scan = FALSE)) } \keyword{datasets} ade4/man/combine.4thcorner.Rd0000644000176200001440000000555713050632301015461 0ustar liggesusers\name{combine.4thcorner} \alias{combine.randtest.rlq} \alias{combine.4thcorner} \alias{p.adjust.4thcorner} \title{Functions to combine and adjust the outputs 3-table methods} \description{Functions to combine and adjust the outputs of the \code{fourthcorner} and \code{randtest.rlq} functions created using permutational models 2 and 4 (sequential approach). } \usage{ combine.randtest.rlq(obj1, obj2, ...) combine.4thcorner(four1,four2) p.adjust.4thcorner(x, p.adjust.method.G = p.adjust.methods, p.adjust.method.D = p.adjust.methods, p.adjust.D = c("global", "levels")) } \arguments{ \item{four1}{ an object of the class 4thcorner created with modeltype = 2 (or 4)} \item{four2}{ an object of the class 4thcorner created with modeltype = 4 (or 2)} \item{obj1}{an object created with \code{randtest.rlq} and modeltype = 2 (or 4)} \item{obj2}{an object created with \code{randtest.rlq} and modeltype = 4 (or 2)} \item{x}{ an object of the class 4thcorner} \item{p.adjust.method.G}{a string indicating a method for multiple adjustment used for output tabG, see \code{\link[stats]{p.adjust.methods}} for possible choices} \item{p.adjust.method.D}{a string indicating a method for multiple adjustment used for output tabD/tabD2, see \code{p.adjust.methods} for possible choices} \item{p.adjust.D}{a string indicating if multiple adjustment for tabD/tabD2 should be done globally or only between levels of a factor ("levels", as in the original paper of Legendre et al. 1997)} \item{\dots}{further arguments passed to or from other methods} } \details{ The functions combines the outputs of two objects (created by \code{fourthcorner} and \code{randtest.rlq} functions) as described in Dray and Legendre (2008) and ter Braak et al (2012). } \value{ The functions return objects of the same class than their argument. They simply create a new object where pvalues are equal to the maximum of pvalues of the two arguments. } \references{ Dray, S. and Legendre, P. (2008) Testing the species traits-environment relationships: the fourth-corner problem revisited. \emph{Ecology}, \bold{89}, 3400--3412. ter Braak, C., Cormont, A., and Dray, S. (2012) Improved testing of species traits-environment relationships in the fourth corner problem. \emph{Ecology}, \bold{93}, 1525--1526. } \author{Stéphane Dray \email{stephane.dray@univ-lyon1.fr}} \seealso{ \code{\link{rlq}}, \code{\link{fourthcorner}}, \code{\link[stats]{p.adjust.methods}} } \examples{ data(aravo) four2 <- fourthcorner(aravo$env, aravo$spe, aravo$traits, nrepet=99,modeltype=2) four4 <- fourthcorner(aravo$env, aravo$spe, aravo$traits, nrepet=99,modeltype=4) four.comb <- combine.4thcorner(four2,four4) ## or directly : ## four.comb <- fourthcorner(aravo$env, aravo$spe, aravo$traits, nrepet=99,modeltype=6) summary(four.comb) plot(four.comb, stat = "G") } \keyword{ multivariate } ade4/man/randtest.discrimin.Rd0000644000176200001440000000256212576021756015755 0ustar liggesusers\name{randtest.discrimin} \alias{randtest.discrimin} \title{ Monte-Carlo Test on a Discriminant Analysis (in C).} \description{ Test of the sum of a discriminant analysis eigenvalues (divided by the rank). Non parametric version of the Pillai's test. It authorizes any weighting. } \usage{ \method{randtest}{discrimin}(xtest, nrepet = 999, \dots) } \arguments{ \item{xtest}{an object of class \code{discrimin}} \item{nrepet}{the number of permutations} \item{\dots}{further arguments passed to or from other methods} } \value{ returns a list of class \code{randtest} } \author{Jean Thioulouse \email{Jean.Thioulouse@univ-lyon1.fr} } \examples{ data(meaudret) pca1 <- dudi.pca(meaudret$env, scan = FALSE, nf = 3) rand1 <- randtest(discrimin(pca1, meaudret$design$season, scan = FALSE), 99) rand1 #Monte-Carlo test #Observation: 0.3035 #Call: as.randtest(sim = sim, obs = obs) #Based on 999 replicates #Simulated p-value: 0.001 plot(rand1, main = "Monte-Carlo test") summary.manova(manova(as.matrix(meaudret$env)~meaudret$design$season), "Pillai") # Df Pillai approx F num Df den Df Pr(>F) # meaudret$design$season 3 2.73 11.30 27 30 1.6e-09 *** # Residuals 16 # --- # Signif. codes: 0 `***' 0.001 `**' 0.01 `*' 0.05 `.' 0.1 ` ' 1 # 2.731/9 = 0.3034 } \keyword{multivariate} \keyword{nonparametric} ade4/man/kdist.Rd0000644000176200001440000000602713522570653013264 0ustar liggesusers\name{kdist} \alias{kdist} \alias{c.kdist} \alias{print.kdist} \alias{[.kdist} \alias{as.data.frame.kdist} \title{the class of objects 'kdist' (K distance matrices)} \description{ An object of class \code{kdist} is a list of distance matrices observed on the same individuals } \usage{ kdist(..., epsi = 1e-07, upper = FALSE) } \arguments{ \item{\dots}{ a sequence of objects of the class \code{kdist}. } \item{epsi}{ a tolerance threshold to test if distances are Euclidean (Gower's theorem) using \eqn{\frac{\lambda_n}{\lambda_1}} is larger than -epsi. } \item{upper}{ a logical value indicating whether the upper of a distance matrix is used (TRUE) or not (FALSE). } } \value{ returns an object of class 'kdist' containing a list of semidefinite matrices. } \details{ The attributs of a 'kdist' object are:\cr \code{names}: the names of the distances\cr \code{size}: the number of points between distances are known\cr \code{labels}: the labels of points\cr \code{euclid}: a logical vector indicating whether each distance of the list is Euclidean or not.\cr \code{call}: a call order\cr \code{class}: object 'kdist'\cr } \references{ Gower, J. C. (1966) Some distance properties of latent root and vector methods used in multivariate analysis. \emph{Biometrika}, \bold{53}, 325--338. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr}} \examples{ # starting from a list of matrices data(yanomama) lapply(yanomama,class) kd1 = kdist(yanomama) print(kd1) # giving the correlations of Mantel's test cor(as.data.frame(kd1)) pairs(as.data.frame(kd1)) # starting from a list of objects 'dist' data(friday87) fri.w <- ktab.data.frame(friday87$fau, friday87$fau.blo, tabnames = friday87$tab.names) fri.kd = lapply(1:10, function(x) dist.binary(fri.w[[x]],2)) names(fri.kd) = friday87$tab.names unlist(lapply(fri.kd,class)) # a list of distances fri.kd = kdist(fri.kd) fri.kd s.corcircle(dudi.pca(as.data.frame(fri.kd), scan = FALSE)$co) # starting from several distances data(ecomor) d1 <- dist.binary(ecomor$habitat, 1) d2 <- dist.prop(ecomor$forsub, 5) d3 <- dist.prop(ecomor$diet, 5) d4 <- dist.quant(ecomor$morpho, 3) d5 <- dist.taxo(ecomor$taxo) ecomor.kd <- kdist(d1, d2, d3, d4, d5) names(ecomor.kd) = c("habitat", "forsub", "diet", "morpho", "taxo") class(ecomor.kd) s.corcircle(dudi.pca(as.data.frame(ecomor.kd), scan = FALSE)$co) data(bsetal97) X <- prep.fuzzy.var(bsetal97$biol, bsetal97$biol.blo) w1 <- attr(X, "col.num") w2 <- levels(w1) w3 <- lapply(w2, function(x) dist.quant(X[,w1==x], method = 1)) names(w3) <- names(attr(X, "col.blocks")) w3 <- kdist(list = w3) s.corcircle(dudi.pca(as.data.frame(w3), scan = FALSE)$co) data(rpjdl) w1 = lapply(1:10, function(x) dist.binary(rpjdl$fau, method = x)) w2 = c("JACCARD", "SOKAL_MICHENER", "SOKAL_SNEATH_S4", "ROGERS_TANIMOTO") w2 = c(w2, "CZEKANOWSKI", "S9_GOWER_LEGENDRE", "OCHIAI", "SOKAL_SNEATH_S13") w2 <- c(w2, "Phi_PEARSON", "S2_GOWER_LEGENDRE") names(w1) <- w2 w3 = kdist(list = w1) w4 <- dudi.pca(as.data.frame(w3), scan = FALSE)$co w4 } \keyword{multivariate} ade4/man/scatter.coa.Rd0000644000176200001440000000405313040362670014342 0ustar liggesusers\name{scatter.coa} \alias{scatter.coa} \title{Plot of the factorial maps for a correspondence analysis} \description{ performs the scatter diagrams of a correspondence analysis. } \usage{ \method{scatter}{coa}(x, xax = 1, yax = 2, method = 1:3, clab.row = 0.75, clab.col = 1.25, posieig = "top", sub = NULL, csub = 2, \dots) } \arguments{ \item{x}{an object of class \code{coa}} \item{xax}{the column number for the x-axis} \item{yax}{the column number for the y-axis} \item{method}{an integer between 1 and 3 \cr 1 Rows and columns with the coordinates of lambda variance\cr 2 Columns variance 1 and rows by averaging\cr 3 Rows variance 1 and columns by averaging} \item{clab.row}{a character size for the rows} \item{clab.col}{a character size for the columns} \item{posieig}{if "top" the eigenvalues bar plot is upside,vif "bottom" it is downside, if "none" no plot} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{\dots}{further arguments passed to or from other methods} } \references{Oksanen, J. (1987) Problems of joint display of species and site scores in correspondence analysis. \emph{Vegetatio}, \bold{72}, 51--57. } \author{Daniel Chessel} \examples{ data(housetasks) w <- dudi.coa(housetasks, scan = FALSE) if(adegraphicsLoaded()) { g1 <- scatter(w, method = 1, psub.text = "1 / Standard", posieig = "none", plot = FALSE) g2 <- scatter(w, method = 2, psub.text = "2 / Columns -> averaging -> Rows", posieig = "none", plot = FALSE) g3 <- scatter(w, method = 3, psub.text = "3 / Rows -> averaging -> Columns ", posieig = "none", plot = FALSE) G <- ADEgS(list(g1, g2, g3), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) scatter(w, method = 1, sub = "1 / Standard", posieig = "none") scatter(w, method = 2, sub = "2 / Columns -> averaging -> Rows", posieig = "none") scatter(w, method = 3, sub = "3 / Rows -> averaging -> Columns ", posieig = "none") par(mfrow = c(1, 1)) }} \keyword{multivariate} \keyword{hplot} ade4/man/ade4-internal.Rd0000644000176200001440000000060612576021756014575 0ustar liggesusers\name{ade4-internal} \alias{testdiscrimin} \alias{testertrace} \alias{testertracenu} \alias{testertracenubis} \alias{testinter} \alias{testprocuste} \alias{testmantel} \alias{testertracerlq} \alias{testamova} \alias{dudi.type} \alias{fac2disj} \title{Internal ade4 functions} \description{ Internal ade4 functions } \details{ These are not to be called by the user. } \keyword{ internal } ade4/man/dudi.pco.Rd0000644000176200001440000000463713021372261013645 0ustar liggesusers\name{dudi.pco} \alias{dudi.pco} \alias{scatter.pco} \title{Principal Coordinates Analysis} \description{ \code{dudi.pco} performs a principal coordinates analysis of a Euclidean distance matrix and returns the results as objects of class \code{pco} and \code{dudi}. } \usage{ dudi.pco(d, row.w = "uniform", scannf = TRUE, nf = 2, full = FALSE, tol = 1e-07) \method{scatter}{pco}(x, xax = 1, yax = 2, clab.row = 1, posieig = "top", sub = NULL, csub = 2, \dots) } \arguments{ \item{d}{an object of class \code{dist} containing a Euclidean distance matrix.} \item{row.w}{an optional distance matrix row weights. If not NULL, must be a vector of positive numbers with length equal to the size of the distance matrix} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} \item{full}{a logical value indicating whether all the axes should be kept} \item{tol}{a tolerance threshold to test whether the distance matrix is Euclidean : an eigenvalue is considered positive if it is larger than \code{-tol*lambda1} where \code{lambda1} is the largest eigenvalue.}\cr\cr \item{x}{an object of class \code{pco}} \item{xax}{the column number for the x-axis} \item{yax}{the column number for the y-axis} \item{clab.row}{a character size for the row labels} \item{posieig}{if "top" the eigenvalues bar plot is upside, if "bottom" it is downside, if "none" no plot} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{\dots}{further arguments passed to or from other methods} } \value{ \code{dudi.pco} returns a list of class \code{pco} and \code{dudi}. See \code{\link{dudi}} } \references{Gower, J. C. (1966) Some distance properties of latent root and vector methods used in multivariate analysis. \emph{Biometrika}, \bold{53}, 325--338. } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(yanomama) gen <- quasieuclid(as.dist(yanomama$gen)) geo <- quasieuclid(as.dist(yanomama$geo)) ant <- quasieuclid(as.dist(yanomama$ant)) geo1 <- dudi.pco(geo, scann = FALSE, nf = 3) gen1 <- dudi.pco(gen, scann = FALSE, nf = 3) ant1 <- dudi.pco(ant, scann = FALSE, nf = 3) plot(coinertia(ant1, gen1, scann = FALSE)) } \keyword{array} \keyword{multivariate} ade4/man/area.plot.Rd0000644000176200001440000001164413177050747014037 0ustar liggesusers\name{area.plot} \alias{area.plot} \alias{poly2area} \alias{area2poly} \alias{area2link} \alias{area.util.contour} \alias{area.util.xy} \alias{area.util.class} \title{Graphical Display of Areas} \description{ 'area' is a data frame with three variables.\cr The first variable is a factor defining the polygons.\cr The second and third variables are the xy coordinates of the polygon vertices in the order where they are found. area.plot : grey levels areas mapping poly2area takes an object of class 'polylist' (maptools package) and returns a data frame of type area.\cr area2poly takes an object of type 'area' and returns a list of class 'polylist'\cr area2link takes an object of type 'area' and returns a proximity matrix which terms are given by the length of the frontier between two polygons. \cr area.util.contour,area.util.xy and area.util.class are three utility functions. } \usage{ area.plot(x, center = NULL, values = NULL, graph = NULL, lwdgraph = 2, nclasslegend = 8, clegend = 0.75, sub = "", csub = 1, possub = "topleft", cpoint = 0, label = NULL, clabel = 0, ...) area2poly(area) poly2area(polys) area2link(area) area.util.contour(area) area.util.xy(area) } \arguments{ \item{x}{a data frame with three variables} \item{center}{a matrix with the same row number as x and two columns, the coordinates of polygone centers. If NULL, it is computed with \code{area.util.xy}} \item{values}{if not NULL, a vector which values will be mapped to grey levels. The values must be in the same order as the values in \code{unique(x.area[,1])}} \item{graph}{if not NULL, \code{graph} is a neighbouring graph (object of class "neig") between polygons} \item{lwdgraph}{a line width to draw the neighbouring graph} \item{nclasslegend}{if \code{value} not NULL, a number of classes for the legend} \item{clegend}{if not NULL, a character size for the legend, used with \code{par("cex")*clegend}} \item{sub}{a string of characters to be inserted as sub-title} \item{csub}{a character size for the sub-titles, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-titles position ("topleft", "topright", "bottomleft", "bottomright")} \item{cpoint}{if positive, a character size for drawing the polygons vertices (check up), used with \code{par("cex")*cpoint}} \item{label}{if not NULL, by default the levels of the factor that define the polygons are used as labels. To change this value, use label. These labels must be in the same order than \code{unique(x.area[,1])}} \item{clabel}{if not NULL, a character size for the polygon labels, \cr used with \code{par("cex")*clabel}} \item{polys}{a list belonging to the 'polylist' class in the spdep package} \item{area}{a data frame of class 'area'} \item{\dots}{further arguments passed to or from other methods} } \value{ poly2area returns a data frame 'factor,x,y'. \cr area2poly returns a list of class \code{polylist}. \cr } \author{ Daniel Chessel } \examples{ data(elec88) par(mfrow = c(2, 2)) area.plot(elec88$area, cpoint = 1) area.plot(elec88$area, lab = elec88$lab$dep, clab = 0.75) area.plot(elec88$area, clab = 0.75) # elec88$neig <- neig(area = elec88$area) area.plot(elec88$area, graph = elec88$neig, sub = "Neighbourhood graph", possub = "topright") par(mfrow = c(1, 1)) \dontrun{ par(mfrow = c(3, 3)) for(i in 1:9) { x <- elec88$tab[,i] area.plot(elec88$area, val = x, sub = names(elec88$tab)[i], csub = 3, cleg = 1.5) } par(mfrow = c(1, 1)) if(adegraphicsLoaded()) { if(requireNamespace("sp", quietly = TRUE)) { s.value(elec88$xy, elec88$tab, Sp = elec88$Spatial, method = "color", psub.text = names(elec88$tab), psub.cex = 3, pSp.col = "white", pgrid.draw = FALSE, porigin.include = FALSE) } } else { par(mfrow = c(3, 3)) for(i in 1:9) { x <- elec88$tab[, i] s.value(elec88$xy, elec88$tab[, i], contour = elec88$contour, meth = "greylevel", sub = names(elec88$tab)[i], csub = 3, cleg = 1.5, incl = FALSE) } par(mfrow = c(1, 1)) } if(!adegraphicsLoaded()) { data(irishdata) par(mfrow = c(2, 2)) w <- ade4:::area.util.contour(irishdata$area) xy <- ade4:::area.util.xy(irishdata$area) area.plot(irishdata$area, cpoint = 1) apply(w, 1, function(x) segments(x[1], x[2], x[3], x[4], lwd = 3)) area.plot(irishdata$area, clabel = 1) s.label(xy, area = irishdata$area, incl = FALSE, clab = 0, cpoi = 3, addax = FALSE, contour = w) s.label(xy, area = irishdata$area, incl = FALSE, addax = FALSE, contour = w) par(mfrow = c(1, 1)) } } data(irishdata) w <- irishdata$area[c(42:53, 18:25), ] w w$poly <- as.factor(as.character(w$poly)) area.plot(w, clab = 2) points(68, 59, pch = 20, col = "red", cex = 3) points(68, 35, pch = 20, col = "red", cex = 3) points(45, 12, pch = 20, col = "red", cex = 3) sqrt((59 - 35) ^ 2) + sqrt((68 - 45) ^ 2 + (35 - 12) ^ 2) area2link(w) } \keyword{hplot} ade4/man/add.scatter.Rd0000644000176200001440000001175612576021756014352 0ustar liggesusers\name{add.scatter} \alias{add.scatter} \alias{add.scatter.eig} \title{Add graphics to an existing plot} \description{ \code{add.scatter} is a function which defines a new plot area within an existing plot and displays an additional graphic inside this area. The additional graphic is determined by a function which is the first argument taken by \code{add.scatter}. It can be used in various ways, for instance to add a screeplot to an ordination scatterplot (\code{add.scatter.eig}).\cr The function \code{add.scatter.eig} uses the following colors: black (represented axes), grey(axes retained in the analysis) and white (others). } \usage{ add.scatter(func,posi = c("bottomleft","bottomright","topleft","topright"), ratio = 0.2, inset = 0.01, bg.col = 'white') add.scatter.eig(w, nf = NULL, xax, yax, posi = "bottomleft", ratio = .25, inset = 0.01, sub = "Eigenvalues", csub = 2 * ratio) } \arguments{ \item{func}{an - evaluated - function producing a graphic} \item{posi}{a character vector (only its first element being considered) giving the position of the added graph. Possible values are "bottomleft" (="bottom"),"bottomright","topleft" (="top"),"topright", and "none" (no plot).} \item{ratio}{the size of the added graph in proportion of the current plot region} \item{inset}{the inset from which the graph is drawn, in proportion of the whole plot region. Can be a vector of length 2, giving the inset in x and y. If atomic, same inset is used in x and y} \item{bg.col}{the color of the background of the added graph} \item{w}{numeric vector of eigenvalues} \item{nf}{the number of retained factors, NULL if not provided} \item{xax}{first represented axis} \item{yax}{second represented axis} \item{sub}{title of the screeplot} \item{csub}{size of the screeplot title} } \value{ The matched call (invisible). } \details{ \code{add.scatter} uses \code{par("plt")} to redefine the new plot region. As stated in \code{par} documentation, this produces to (sometimes surprising) interactions with other parameters such as "mar". In particular, such interactions are likely to reset the plot region by default which would cause the additional graphic to take the whole plot region. To avoid such inconvenient, add \code{par([other options], plt=par("plt"))} when using \code{par} in your graphical function (argument \code{func}). } \seealso{\code{\link{scatter}} } \author{Thibaut Jombart \email{t.jombart@imperial.ac.uk}} \examples{ data(microsatt) w <- dudi.coa(data.frame(t(microsatt$tab)), scann = FALSE, nf = 3) if(adegraphicsLoaded()) { a1 <- rnorm(100) b1 <- s1d.barchart(sort(a1), p1d.horizontal = FALSE, plot = FALSE) h1 <- s1d.hist(a1, pgrid.draw = FALSE, porigin.draw = FALSE, pbackground.col = "grey", plot = FALSE, ppoly.col = "white", ppoly.alpha = 1) g1 <- insert(h1, b1, posi = "topleft", plot = FALSE) a2 <- rnorm(100) b2 <- s1d.barchart(sort(a2), p1d.horizontal = FALSE, plot = FALSE) h2 <- s1d.hist(a2, pgrid.draw = FALSE, porigin.draw = FALSE, pbackground.col = "grey", plot = FALSE, ppoly.col = "white", ppoly.alpha = 1) g2 <- insert(h2, b2, posi = "topleft", inset = c(0.25, 0.01), plot = FALSE) a3 <- rnorm(100) b3 <- s1d.barchart(sort(a3), p1d.horizontal = FALSE, plot = FALSE) h3 <- s1d.hist(a3, pgrid.draw = FALSE, porigin.draw = FALSE, pbackground.col = "grey", plot = FALSE, ppoly.col = "white", ppoly.alpha = 1) g3 <- insert(h3, b3, posi = "bottomleft", inset = 0.4, ratio = 0.2, plot = FALSE) a4 <- rnorm(100) b4 <- s1d.barchart(sort(a4), p1d.horizontal = FALSE, plot = FALSE) h4 <- s1d.hist(a4, pgrid.draw = FALSE, porigin.draw = FALSE, pbackground.col = "grey", plot = FALSE, ppoly.col = "white", ppoly.alpha = 1) g4 <- insert(h3, b3, posi = "bottomright", ratio = 0.3, plot = FALSE) G1 <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2), plot = TRUE) g5 <- s.label(w$co, plot = FALSE) g6 <- plotEig(w$eig, w$nf, psub = list(text = "Eigenvalues"), pbackground = list(box = TRUE), plot = FALSE) G2 <- insert(g6, g5, posi = "bottomright", ratio = 0.25) } else { par(mfrow=c(2,2)) f1 <- function(a){ opar=par("mar","xaxt","yaxt","plt") on.exit(par(opar)) par(mar=rep(.1,4),xaxt="n",yaxt="n",plt=par("plt")) hist(a,xlab="",ylab="",main="",col="white",proba=TRUE) lines(seq(-4,4,le=50),dnorm(seq(-4,4,le=50)),col="red") } a <- rnorm(100) barplot(sort(a)) add.scatter(f1(a),posi="topleft",bg.col="grey") a <- rnorm(100) barplot(sort(a)) add.scatter(f1(a),posi="topleft",bg.col="grey",inset=c(.25,.01)) a <- rnorm(100) barplot(sort(a)) add.scatter(f1(a),posi="topleft",bg.col="grey",inset=.25,ratio=.1) a <- rnorm(100) barplot(sort(a)) add.scatter(f1(a),posi="bottomright",bg.col="grey",ratio=.3) par(mfrow=c(1,1)) s.label(w$co) add.scatter.eig(w$eig,w$nf,posi="bottomright",1,2) } } \keyword{multivariate} \keyword{hplot} ade4/man/santacatalina.Rd0000644000176200001440000000236113040362670014737 0ustar liggesusers\name{santacatalina} \alias{santacatalina} \docType{data} \title{Indirect Ordination} \description{ This data set gives the densities per hectare of 11 species of trees for 10 transects of topographic moisture values (mean of several stations per class). } \usage{data(santacatalina)} \format{ a data frame with 11 rows and 10 columns } \source{ Gauch, H. G. J., Chase, G. B. and Whittaker R. H. (1974) Ordination of vegetation samples by Gaussian species distributions. \emph{Ecology}, \bold{55}, 1382--1390. } \examples{ data(santacatalina) coa1 <- dudi.coa(log(santacatalina + 1), scan = FALSE) # 2 factors if(adegraphicsLoaded()) { g1 <- table.value(log(santacatalina + 1), plot = FALSE) g2 <- table.value(log(santacatalina + 1)[, sample(10)], plot = FALSE) g3 <- table.value(log(santacatalina + 1)[order(coa1$li[, 1]), order(coa1$co[, 1])], plot = FALSE) g4 <- scatter(coa1, posi = "bottomright", plot = FALSE) G <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) } else { par(mfrow = c(2, 2)) table.value(log(santacatalina + 1)) table.value(log(santacatalina + 1)[, sample(10)]) table.value(log(santacatalina + 1)[order(coa1$li[, 1]), order(coa1$co[, 1])]) scatter(coa1, posi = "bottomright") par(mfrow = c(1, 1)) }} \keyword{datasets} ade4/man/kdist2ktab.Rd0000644000176200001440000000333713021372261014176 0ustar liggesusers\name{kdist2ktab} \alias{kdist2ktab} \title{ Transformation of K distance matrices (object 'kdist') into K Euclidean representations (object 'ktab') } \description{ The function creates a \code{ktab} object with the Euclidean representations from a \code{kdist} object. Notice that the euclid attribute must be TRUE for all elements. } \usage{ kdist2ktab(kd, scale = TRUE, tol = 1e-07) } \arguments{ \item{kd}{ an object of class \code{kdist} } \item{scale}{ a logical value indicating whether the inertia of Euclidean representations are equal to 1 (TRUE) or not (FALSE). } \item{tol}{ a tolerance threshold, an eigenvalue is considered equal to zero if \code{eig$values} > (\code{eig$values[1} * tol) } } \value{ returns a list of class \code{ktab} containing for each distance of \code{kd} the data frame of its Euclidean representation } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr}} \examples{ data(friday87) fri.w <- ktab.data.frame(friday87$fau, friday87$fau.blo, tabnames = friday87$tab.names) fri.kd <- lapply(1:10, function(x) dist.binary(fri.w[[x]], 10)) names(fri.kd) <- substr(friday87$tab.names, 1, 4) fri.kd <- kdist(fri.kd) fri.ktab <- kdist2ktab(kd = fri.kd) fri.sepan <- sepan(fri.ktab) plot(fri.sepan) tapply(fri.sepan$Eig, fri.sepan$TC[,1], sum) # the sum of the eigenvalues is constant and equal to 1, for each K tables fri.statis <- statis(fri.ktab, scan = FALSE, nf = 2) round(fri.statis$RV, dig = 2) fri.mfa <- mfa(fri.ktab, scan = FALSE, nf = 2) fri.mcoa <- mcoa(fri.ktab, scan = FALSE, nf = 2) apply(fri.statis$RV, 1, mean) fri.statis$RV.tabw plot(apply(fri.statis$RV, 1, mean), fri.statis$RV.tabw) plot(fri.statis$RV.tabw, fri.statis$RV.tabw) } \keyword{multivariate} ade4/man/bf88.Rd0000644000176200001440000000277612576021756012727 0ustar liggesusers\name{bf88} \alias{bf88} \docType{data} \title{Cubic Ecological Data} \description{ \code{bf88} is a list of 6 data frames corresponding to 6 stages of vegetation. \cr Each data frame gives some bird species informations for 4 counties. } \usage{data(bf88)} \format{ A list of six data frames with 79 rows (bird species) and 4 columns (counties).\cr The 6 arrays (S1 to S6) are the 6 stages of vegetation.\cr The attribut 'nomesp' of this list is a vector of species French names. } \source{ Blondel, J. and Farre, H. (1988) The convergent trajectories of bird communities along ecological successions in european forests. \emph{Oecologia} (Berlin), \bold{75}, 83--93. } \examples{ data(bf88) fou1 <- foucart(bf88, scann = FALSE, nf = 3) fou1 if(adegraphicsLoaded()) { g1 <- scatter(fou1, plot = FALSE) g2 <- s.traject(fou1$Tco, fou1$TC[, 1], plines.lty = 1:length(levels(fou1$TC[, 1])), plot = FALSE) g3 <- s.traject(fou1$Tco, fou1$TC[, 2], plines.lty = 1:length(levels(fou1$TC[, 2])), plot = FALSE) g41 <- s.label(fou1$Tco, plot = FALSE) g42 <- s.label(fou1$co, plab.cex = 2, plot = FALSE) g4 <- superpose(g41, g42, plot = FALSE) G1 <- ADEgS(list(g1, g2, g3, g4), layout = c(2, 2)) G2 <- kplot(fou1, row.plab.cex = 0, psub.cex = 2) } else { par(mfrow = c(2,2)) scatter(fou1) s.traject(fou1$Tco, fou1$TC[, 1]) s.traject(fou1$Tco, fou1$TC[, 2]) s.label(fou1$Tco) s.label(fou1$co, add.p = TRUE, clab = 2) par(mfrow = c(1, 1)) kplot(fou1, clab.c = 2, clab.r = 0, csub = 3) }} \keyword{datasets} ade4/man/mld.Rd0000644000176200001440000000551013175633655012724 0ustar liggesusers\name{mld} \alias{mld} \alias{haar2level} \title{Multi Level Decomposition of unidimensional data} \description{ The function \code{mld} performs an additive decomposition of the input vector \code{x} onto sub-spaces associated to an orthonormal orthobasis. The sub-spaces are defined by levels of the input factor \code{level}. The function \code{haar2level} builds the factor \code{level} such that the multi level decomposition corresponds exactly to a multiresolution analysis performed with the haar basis. } \usage{ mld(x, orthobas, level, na.action = c("fail", "mean"), plot = TRUE, dfxy = NULL, phylog = NULL, ...) haar2level(x) } \arguments{ \item{x}{is a vector or a time serie containing the data to be decomposed. This must be a dyadic length vector (power of 2) for the function \code{haar2level}.} \item{orthobas}{is a data frame containing the vectors of the orthonormal basis.} \item{level}{is a factor which levels define the sub-spaces on which the function \code{mld} performs the additive decomposition.} \item{na.action}{ if 'fail' stops the execution of the current expression when \code{x} contains any missing value. If 'mean' replaces any missing values by mean(\code{x}).} \item{plot}{if TRUE plot \code{x} and the components resulting from the decomposition.} \item{dfxy}{is a data frame with two coordinates.} \item{phylog}{is an object of class \code{phylog}.} \item{\dots}{further arguments passed to or from other methods.} } \value{ A data frame with the components resulting from the decomposition. } \references{ Mallat, S. G. (1989) A theory for multiresolution signal decomposition: the wavelet representation. \emph{IEEE Transactions on Pattern Analysis and Machine Intelligence}, \bold{11}, 7, 674--693. Percival, D. B. and Walden, A. T. (2000) \emph{Wavelet Methods for Time Series Analysis}, Cambridge University Press. } \author{Sébastien Ollier \email{sebastien.ollier@u-psud.fr}} \seealso{ \code{\link{gridrowcol}}, \code{\link{orthobasis}}, \code{\link[adephylo]{orthogram}}, \code{\link[waveslim]{mra}} for multiresolution analysis with various families of wavelets } \examples{ \dontrun{ # decomposition of a time serie data(co2) x <- log(co2) orthobas <- orthobasis.line(length(x)) level<-rep("D", 467) level[1:3]<-rep("A", 3) level[c(77,78,79,81)]<-rep("B", 4) level[156]<-"C" level<-as.factor(level) res <- mld(x, orthobas, level) sum(scale(x, scale = FALSE) - apply(res, 1, sum)) } # decomposition of a biological trait on a phylogeny data(palm) vfruit<-palm$traits$vfruit vfruit<-scalewt(vfruit) palm.phy<-newick2phylog(palm$tre) level <- rep("F", 65) level[c(4, 21, 3, 6, 13)] <- LETTERS[1:5] level <- as.factor(level) res <- mld(as.vector(vfruit), palm.phy$Bscores, level, phylog = palm.phy, clabel.nod = 0.7, f.phylog=0.8, csize = 2, clabel.row = 0.7, clabel.col = 0.7) } \keyword{ts} \keyword{spatial} ade4/man/dudi.dec.Rd0000644000176200001440000000252213021372261013606 0ustar liggesusers\name{dudi.dec} \alias{dudi.dec} \title{Decentred Correspondence Analysis} \description{ performs a decentred correspondence analysis. } \usage{ dudi.dec(df, eff, scannf = TRUE, nf = 2) } \arguments{ \item{df}{a data frame containing positive or null values} \item{eff}{a vector containing the reference distribution. Its length is equal to the number of rows of df} \item{scannf}{a logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{if scannf FALSE, an integer indicating the number of kept axes} } \value{ Returns a list of class \code{dec} and \code{dudi} (see \code{\link{dudi}}) containing also \item{R}{sum of all the values of the initial table} } \references{Dolédec, S., Chessel, D. and Olivier J. M. (1995) L'analyse des correspondances décentrée: application aux peuplements ichtyologiques du haut-Rhône. \emph{Bulletin Français de la Pêche et de la Pisciculture}, \bold{336}, 29--40.} \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(ichtyo) dudi1 <- dudi.dec(ichtyo$tab, ichtyo$eff, scan = FALSE) sum(apply(ichtyo$tab, 2, function(x) chisq.test(x, p = ichtyo$eff/sum(ichtyo$eff))$statistic)) sum(dudi1$eig) * sum(ichtyo$eff) # the same s.class(dudi1$li, ichtyo$dat, wt = ichtyo$eff/sum(ichtyo$eff)) } \keyword{multivariate} ade4/man/s.arrow.Rd0000644000176200001440000000505112576021756013540 0ustar liggesusers\name{s.arrow} \alias{s.arrow} \title{Plot of the factorial maps for the projection of a vector basis} \description{ performs the scatter diagrams of the projection of a vector basis. } \usage{ s.arrow(dfxy, xax = 1, yax = 2, label = row.names(dfxy), clabel = 1, pch = 20, cpoint = 0, boxes = TRUE, edge = TRUE, origin = c(0,0), xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, cgrid = 1, sub = "", csub = 1.25, possub = "bottomleft", pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) } \arguments{ \item{dfxy}{a data frame containing the two columns for the axes} \item{xax}{the column number of x in \code{dfxy}} \item{yax}{the column number of y in \code{dfxy}} \item{label}{a vector of strings of characters for the point labels} \item{clabel}{if not NULL, a character size for the labels used with par("cex")*\code{clabel}} \item{pch}{if \code{cpoint} > 0, an integer specifying the symbol or the single character to be used in plotting points} \item{cpoint}{a character size for plotting the points, used with par("cex")*\code{cpoint}. If zero, no points are drawn.} \item{boxes}{if TRUE, labels are framed} \item{edge}{a logical value indicating whether the arrows should be plotted} \item{origin}{the fixed point in the graph space, by default c(0,0) the origin of axes. The arrows begin at \code{cent}.} \item{xlim}{the ranges to be encompassed by the x-axis, if NULL they are computed} \item{ylim}{the ranges to be encompassed by the y-axis, if NULL they are computed} \item{grid}{a logical value indicating whether a grid in the background of the plot should be drawn} \item{addaxes}{a logical value indicating whether the axes should be plotted} \item{cgrid}{a character size, parameter used with \code{par("cex")*cgrid}, to indicate the mesh of the grid} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the legend position ("topleft", "topright", "bottomleft", "bottomright")} \item{pixmap}{an object 'pixmap' displayed in the map background} \item{contour}{a data frame with 4 columns to plot the contour of the map : each row gives a segment (x1,y1,x2,y2)} \item{area}{a data frame of class 'area' to plot a set of surface units in contour} \item{add.plot}{if TRUE uses the current graphics window} } \value{ The matched call. } \author{Daniel Chessel } \examples{ s.arrow(cbind.data.frame(runif(55,-2,3), runif(55,-3,2))) } \keyword{multivariate} \keyword{hplot} ade4/man/ktab.list.dudi.Rd0000644000176200001440000000361013021372261014745 0ustar liggesusers\name{ktab.list.dudi} \alias{ktab.list.dudi} \title{Creation of a K-tables from a list of duality diagrams} \description{ creates a list of class \code{ktab} from a list of duality diagrams. } \usage{ ktab.list.dudi(obj, rownames = NULL, colnames = NULL, tabnames = NULL) } \arguments{ \item{obj}{a list of objects of class 'dudi'. Each element of the list must have the same row names for \code{$tab} and even for \code{$lw}} \item{rownames}{the row names of the K-tables (otherwise the row names of the \code{$tab})} \item{colnames}{the column names of the K-tables (otherwise the column names of the \code{$tab})} \item{tabnames}{the names of the arrays of the K-tables (otherwise the names of the \code{obj} if they exist, or else "Ana1", "Ana2", \dots)} } \value{ returns a list of class \code{ktab}. See \code{\link{ktab}} } \author{ Daniel Chessel \cr Anne-Béatrice Dufour \email{anne-beatrice.dufour@univ-lyon1.fr} } \examples{ data(euro123) pca1 <- dudi.pca(euro123$in78, scale = FALSE, scann = FALSE) pca2 <- dudi.pca(euro123$in86, scale = FALSE, scann = FALSE) pca3 <- dudi.pca(euro123$in97, scale = FALSE, scann = FALSE) ktabeuro <- ktab.list.dudi(list(pca1, pca2, pca3), tabnames = c("1978", "1986", "1997")) if(adegraphicsLoaded()) { kplot(sepan(ktabeuro)) } else { kplot(sepan(ktabeuro), mfr = c(2, 2), clab.c = 1.5) } data(meaudret) w1 <- split(meaudret$env,meaudret$design$season) ll <- lapply(w1, dudi.pca, scann = FALSE) kta <- ktab.list.dudi(ll, rownames <- paste("Site", 1:5, sep = "")) if(adegraphicsLoaded()) { kplot(sepan(kta), row.plab.cex = 1.5, col.plab.cex = 0.75) } else { kplot(sepan(kta), clab.r = 1.5, clab.c = 0.75) } data(jv73) w <- split(jv73$poi, jv73$fac.riv) wjv73poi <- lapply(w, dudi.pca, scal = FALSE, scan = FALSE) wjv73poi <- lapply(wjv73poi, t) wjv73poi <- ktab.list.dudi(wjv73poi) kplot(sepan(wjv73poi), permut = TRUE, traj = TRUE) } \keyword{multivariate} ade4/man/statico.krandtest.Rd0000644000176200001440000000331213125167376015607 0ustar liggesusers\name{statico.krandtest} \alias{statico.krandtest} \title{Monte-Carlo test on a Statico analysis (in C).} \description{ Performs the series of Monte-Carlo coinertia tests of a Statico analysis (one for each couple of tables). } \usage{ statico.krandtest(KTX, KTY, nrepet = 999, ...) } \arguments{ \item{KTX}{an objet of class ktab containing the environmental data} \item{KTY}{an objet of class ktab containing the species data} \item{nrepet}{the number of permutations} \item{\dots}{further arguments passed to or from other methods} } \details{ This function takes 2 ktabs and does a coinertia analysis with \link{coinertia} on each pair of tables. It then uses the \link{randtest} function to do a permutation test on each of these coinertia analyses. } \value{ krandtest, a list of randtest objects. See \link{krandtest} } \references{ Thioulouse J. (2011). Simultaneous analysis of a sequence of paired ecological tables: a comparison of several methods. \emph{Annals of Applied Statistics}, \bold{5}, 2300-2325. } \author{Jean Thioulouse \email{jean.thioulouse@univ-lyon1.fr}} \section{WARNING }{ IMPORTANT : KTX and KTY must have the same k-tables structure, the same number of columns, and the same column weights. } \examples{ data(meau) wit1 <- withinpca(meau$env, meau$design$season, scan = FALSE, scal = "total") spepca <- dudi.pca(meau$spe, scale = FALSE, scan = FALSE, nf = 2) wit2 <- wca(spepca, meau$design$season, scan = FALSE, nf = 2) kta1 <- ktab.within(wit1, colnames = rep(c("S1","S2","S3","S4","S5","S6"), 4)) kta2 <- ktab.within(wit2, colnames = rep(c("S1","S2","S3","S4","S5","S6"), 4)) statico1 <- statico(kta1, kta2, scan = FALSE) kr1 <- statico.krandtest(kta1, kta2) plot(kr1) } \keyword{multivariate} ade4/man/cailliez.Rd0000644000176200001440000000276213620262567013745 0ustar liggesusers\name{cailliez} \alias{cailliez} \title{Transformation to make Euclidean a distance matrix} \description{ This function computes the smallest positive constant that makes Euclidean a distance matrix and applies it. } \usage{ cailliez(distmat, print = FALSE, tol = 1e-07, cor.zero = TRUE) } \arguments{ \item{distmat}{an object of class \code{dist}} \item{print}{if TRUE, prints the eigenvalues of the matrix} \item{tol}{a tolerance threshold for zero} \item{cor.zero}{if TRUE, zero distances are not modified} } \value{ an object of class \code{dist} containing a Euclidean distance matrix. } \references{ Cailliez, F. (1983) The analytical solution of the additive constant problem. \emph{Psychometrika}, \bold{48}, 305--310.\cr Legendre, P. and Anderson, M.J. (1999) Distance-based redundancy analysis: testing multispecies responses in multifactorial ecological experiments. \emph{Ecological Monographs}, \bold{69}, 1--24.\cr Legendre, P., and Legendre, L. (1998) \emph{Numerical ecology}, 2nd English edition edition. Elsevier Science BV, Amsterdam.\cr } \author{ Daniel Chessel \cr Stéphane Dray \email{stephane.dray@univ-lyon1.fr} } \examples{ data(capitales) d0 <- capitales$dist is.euclid(d0) # FALSE d1 <- cailliez(d0, TRUE) # Cailliez constant = 2429.87867 is.euclid(d1) # TRUE plot(d0, d1) abline(lm(unclass(d1)~unclass(d0))) print(coefficients(lm(unclass(d1)~unclass(d0))), dig = 8) # d1 = d + Cte is.euclid(d0 + 2428) # FALSE is.euclid(d0 + 2430) # TRUE the smallest constant } \keyword{array} ade4/man/mbpls.Rd0000644000176200001440000000751513341514176013263 0ustar liggesusers\name{mbpls} \alias{mbpls} \title{Multiblock partial least squares} \description{Function to perform a multiblock partial least squares (PLS) of several explanatory blocks \eqn{(X_1, \dots, X_k)} defined as an object of class \code{ktab}, to explain a dependent dataset $Y$ defined as an object of class \code{dudi}} \usage{ mbpls(dudiY, ktabX, scale = TRUE, option = c("uniform", "none"), scannf = TRUE, nf = 2) } \arguments{ \item{dudiY}{an object of class \code{dudi} containing the dependent variables} \item{ktabX}{an object of class \code{ktab} containing the blocks of explanatory variables} \item{scale}{logical value indicating whether the explanatory variables should be standardized} \item{option}{an option for the block weighting. If \code{uniform}, the block weight is equal to $1/K$ for \eqn{(X_1, \dots, X_K)} and to $1$ for $X$ and $Y$. If \code{none}, the block weight is equal to the block inertia} \item{scannf}{logical value indicating whether the eigenvalues bar plot should be displayed} \item{nf}{integer indicating the number of kept dimensions} } \value{A list containing the following components is returned: \item{call}{the matching call} \item{tabY}{data frame of dependent variables centered, eventually scaled (if \option{scale=TRUE}) and weighted (if \option{option="uniform"})} \item{tabX}{data frame of explanatory variables centered, eventually scaled (if \option{scale=TRUE}) and weighted (if \option{option="uniform"})} \item{TL, TC}{data frame useful to manage graphical outputs} \item{nf}{numeric value indicating the number of kept dimensions} \item{lw}{numeric vector of row weights} \item{X.cw}{numeric vector of column weighs for the explanalatory dataset} \item{blo}{vector of the numbers of variables in each explanatory dataset} \item{rank}{maximum rank of the analysis} \item{eig}{numeric vector containing the eigenvalues} \item{lX}{matrix of the global components associated with the whole explanatory dataset (scores of the individuals)} \item{lY}{matrix of the components associated with the dependent dataset} \item{Yc1}{matrix of the variable loadings associated with the dependent dataset} \item{cov2}{squared covariance between lY and TlX} \item{Tc1}{matrix containing the partial loadings associated with each explanatory dataset (unit norm)} \item{TlX}{matrix containing the partial components associated with each explanatory dataset} \item{faX}{matrix of the regression coefficients of the whole explanatory dataset onto the global components} \item{XYcoef}{list of matrices of the regression coefficients of the whole explanatory dataset onto the dependent dataset} \item{bip}{block importances for a given dimension} \item{bipc}{cumulated block importances for a given number of dimensions} \item{vip}{variable importances for a given dimension} \item{vipc}{cumulated variable importances for a given number of dimensions} } \references{Bougeard, S., Qannari, E.M., Lupo, C. and Hanafi, M. (2011). From multiblock partial least squares to multiblock redundancy analysis. A continuum approach. \emph{Informatica}, 22(1), 11-26 Bougeard, S. and Dray S. (2018) Supervised Multiblock Analysis in R with the ade4 Package. \emph{Journal of Statistical Software}, \bold{86} (1), 1-17. \url{http://doi.org/10.18637/jss.v086.i01}} \author{Stéphanie Bougeard (\email{stephanie.bougeard@anses.fr}) and Stéphane Dray (\email{stephane.dray@univ-lyon1.fr})} \seealso{\code{\link{mbpls}}, \code{\link{testdim.multiblock}}, \code{\link{randboot.multiblock}}} \examples{ data(chickenk) Mortality <- chickenk[[1]] dudiY.chick <- dudi.pca(Mortality, center = TRUE, scale = TRUE, scannf = FALSE) ktabX.chick <- ktab.list.df(chickenk[2:5]) resmbpls.chick <- mbpls(dudiY.chick, ktabX.chick, scale = TRUE, option = "uniform", scannf = FALSE) summary(resmbpls.chick) if(adegraphicsLoaded()) plot(resmbpls.chick) } \keyword{multivariate} ade4/man/casitas.Rd0000644000176200001440000000253213474205664013575 0ustar liggesusers\name{casitas} \docType{data} \alias{casitas} \title{Enzymatic polymorphism in Mus musculus} \description{ This data set is a data frame with 74 rows (mice) and 15 columns (loci enzymatic polymorphism of the DNA mitochondrial). Each value contains 6 characters coding for two allelles. The missing values are coding by '000000'. } \usage{data(casitas)} \format{ The 74 individuals of \code{casitas} belong to 4 groups: \describe{ \item{1}{24 mice of the sub-species \emph{Mus musculus domesticus}} \item{2}{11 mice of the sub-species \emph{Mus musculus castaneus}} \item{3}{9 mice of the sub-species \emph{Mus musculus musculus}} \item{4}{30 mice from a population of the lake Casitas (California)} } } \source{ Exemple du logiciel GENETIX. Belkhir k. et al. GENETIX, logiciel sous WindowsTM pour la génétique des populations. Laboratoire Génome, Populations, Interactions CNRS UMR 5000, Université de Montpellier II, Montpellier (France). \cr \url{http://kimura.univ-montp2.fr/genetix/} } \references{ Orth, A., T. Adama, W. Din and F. Bonhomme. (1998) Hybridation naturelle entre deux sous espèces de souris domestique \emph{Mus musculus domesticus} et \emph{Mus musculus castaneus} près de Lake Casitas (Californie). \emph{Genome}, \bold{41}, 104--110. } \examples{ data(casitas) str(casitas) names(casitas) } \keyword{datasets} ade4/man/testdim.Rd0000644000176200001440000000331213021372261013576 0ustar liggesusers\name{testdim} \alias{testdim} \alias{testdim.pca} \title{ Function to perform a test of dimensionality} \description{ This functions allow to test for the number of axes in multivariate analysis. The procedure \code{testdim.pca} implements a method for principal component analysis on correlation matrix. The procedure is based on the computation of the RV coefficient. } \usage{ testdim(object, ...) \method{testdim}{pca}(object, nrepet = 99, nbax = object$rank, alpha = 0.05, ...) } \arguments{ \item{object}{ an object corresponding to an analysis (e.g. duality diagram, an object of class \code{dudi})} \item{nrepet}{ the number of repetitions for the permutation procedure} \item{nbax}{ the number of axes to be tested, by default all axes} \item{alpha}{ the significance level} \item{\dots}{ other arguments} } \value{ An object of the class \code{krandtest}. It contains also: \item{nb}{The estimated number of axes to keep} \item{nb.cor}{The number of axes to keep estimated using a sequential Bonferroni procedure} } \references{ Dray, S. (2008) On the number of principal components: A test of dimensionality based on measurements of similarity between matrices. \emph{Computational Statistics and Data Analysis}, \bold{Volume 52}, 2228--2237. doi:10.1016/j.csda.2007.07.015 } \author{Stéphane Dray \email{stephane.dray@univ-lyon1.fr}} \seealso{\code{\link{dudi.pca}}, \code{\link{RV.rtest}},\code{\link{testdim.multiblock}}} \examples{ tab <- data.frame(matrix(rnorm(200),20,10)) pca1 <- dudi.pca(tab,scannf=FALSE) test1 <- testdim(pca1) test1 test1$nb test1$nb.cor data(doubs) pca2 <- dudi.pca(doubs$env,scannf=FALSE) test2 <- testdim(pca2) test2 test2$nb test2$nb.cor } \keyword{ multivariate } ade4/man/scatterutil.Rd0000644000176200001440000000711313021372261014473 0ustar liggesusers\name{scatterutil} \alias{scatterutil} \alias{scatterutil.base} \alias{scatterutil.sco} \alias{scatterutil.chull} \alias{scatterutil.eigen} \alias{scatterutil.ellipse} \alias{scatterutil.eti.circ} \alias{scatterutil.eti} \alias{scatterutil.grid} \alias{scatterutil.legend.bw.square} \alias{scatterutil.legend.square.grey} \alias{scatterutil.legendgris} \alias{scatterutil.scaling} \alias{scatterutil.star} \alias{scatterutil.sub} \alias{scatterutil.convrot90} \title{Graphical utility functions} \description{ These are utilities used in graphical functions. } \details{ The functions scatter use some utilities functions : \describe{ \item{scatterutil.base}{defines the layer of the plot for all scatters} \item{scatterutil.sco}{defines the layer of the plot for sco functions} \item{scatterutil.chull}{plots the polygons of the external contour} \item{scatterutil.eigen}{plots the eigenvalues bar plot} \item{scatterutil.ellipse}{plots an inertia ellipse for a weighting distribution} \item{scatterutil.eti.circ}{puts labels on a correlation circle} \item{scatterutil.eti}{puts labels centred on the points} \item{scatterutil.grid}{plots a grid and adds a legend} \item{scatterutil.legend.bw.square}{puts a legend of values by square size} \item{scatterutil.legend.square.grey}{puts a legend by squares and grey levels} \item{scatterutil.legendgris}{adds a legend of grey levels for the areas} \item{scatterutil.scaling}{to fit a plot on a background bipmap} \item{scatterutil.star}{plots a star for a weighting distribution} \item{scatterutil.sub}{adds a string of characters in sub-title of a graph} \item{scatterutil.convrot90}{is used to rotate labels} } } \seealso{\code{\link{s.arrow}}, \code{\link{s.chull}}, \code{\link{s.class}}, \code{\link{s.corcircle}}, \code{\link{s.distri}}, \code{\link{s.label}}, \code{\link{s.match}}, \code{\link{s.traject}}, \code{\link{s.value}}, \code{\link{add.scatter}} } \author{Daniel Chessel, Stéphane Dray \email{stephane.dray@univ-lyon1.fr}} \examples{ par(mfrow = c(3,3)) plot.new() ade4:::scatterutil.legendgris(1:20, 4, 1.6) plot.new() ade4:::scatterutil.sub("lkn5555555555lkn", csub = 2, possub = "bottomleft") ade4:::scatterutil.sub("lkn5555555555lkn", csub = 1, possub = "topleft") ade4:::scatterutil.sub("jdjjl", csub = 3, possub = "topright") ade4:::scatterutil.sub("**", csub = 2, possub = "bottomright") x <- c(0.5,0.2,-0.5,-0.2) ; y <- c(0.2,0.5,-0.2,-0.5) eti <- c("toto", "kjbk", "gdgiglgl", "sdfg") plot(x, y, xlim = c(-1,1), ylim = c(-1,1)) ade4:::scatterutil.eti.circ(x, y, eti, 2.5) abline(0, 1, lty = 2) ; abline(0, -1, lty = 2) x <- c(0.5,0.2,-0.5,-0.2) ; y <- c(0.2,0.5,-0.2,-0.5) eti <- c("toto", "kjbk", "gdgiglgl", "sdfg") plot(x, y, xlim = c(-1,1), ylim = c(-1,1)) ade4:::scatterutil.eti(x, y, eti, 1.5) plot(runif(10,-3,5), runif(10,-1,1), asp = 1) ade4:::scatterutil.grid(2) abline(h = 0, v = 0, lwd = 3) x <- runif(10,0,1) ; y <- rnorm(10) ; z <- rep(1,10) plot(x,y) ; ade4:::scatterutil.star(x, y, z, 0.5) plot(x,y) ; ade4:::scatterutil.star(x, y, z, 1) x <- c(runif(10,0,0.5), runif(10,0.5,1)) y <- runif(20) plot(x, y, asp = 1) # asp=1 is essential to have perpendicular axes ade4:::scatterutil.ellipse(x, y, rep(c(1,0), c(10,10)), cell = 1.5, ax = TRUE) ade4:::scatterutil.ellipse(x, y, rep(c(0,1), c(10,10)), cell = 1.5, ax = TRUE) x <- c(runif(100,0,0.75), runif(100,0.25,1)) y <- c(runif(100,0,0.75), runif(100,0.25,1)) z <- factor(rep(c(1,2), c(100,100))) plot(x, y, pch = rep(c(1,20), c(100,100))) ade4:::scatterutil.chull(x, y, z, opt = c(0.25,0.50,0.75,1)) par(mfrow = c(1,1)) } \keyword{multivariate} \keyword{hplot} ade4/man/s.corcircle.Rd0000644000176200001440000000366012576021756014357 0ustar liggesusers\name{s.corcircle} \alias{s.corcircle} \title{Plot of the factorial maps of a correlation circle} \description{ performs the scatter diagram of a correlation circle. } \usage{ s.corcircle(dfxy, xax = 1, yax = 2, label = row.names(df), clabel = 1, grid = TRUE, sub = "", csub = 1, possub = "bottomleft", cgrid = 0, fullcircle = TRUE, box = FALSE, add.plot = FALSE) } \arguments{ \item{dfxy}{a data frame with two coordinates } \item{xax}{the column number for the x-axis} \item{yax}{the column number for the y-axis} \item{label}{a vector of strings of characters for the point labels} \item{clabel}{if not NULL, a character size for the labels, used with \code{par("cex")*clabel}} \item{grid}{a logical value indicating whether a grid in the background of the plot should be drawn} \item{sub}{a string of characters to be inserted as legend} \item{csub}{a character size for the legend, used with \code{par("cex")*csub}} \item{possub}{a string of characters indicating the sub-title position ("topleft", "topright", "bottomleft", "bottomright")} \item{cgrid}{a character size, parameter used with par("cex")*\code{cgrid} to indicate the mesh of the grid} \item{fullcircle}{a logical value indicating whether the complete circle sould be drawn} \item{box}{a logical value indcating whether a box should be drawn} \item{add.plot}{if TRUE uses the current graphics window} } \value{ The matched call. } \author{Daniel Chessel} \examples{ if(!adegraphicsLoaded()) { data (olympic) dudi1 <- dudi.pca(olympic$tab, scan = FALSE) # a normed PCA par(mfrow = c(2, 2)) s.corcircle(dudi1$co, lab = names(olympic$tab)) s.corcircle(dudi1$co, cgrid = 0, full = FALSE, clab = 0.8) s.corcircle(dudi1$co, lab = as.character(1:11), cgrid = 2, full = FALSE, sub = "Correlation circle", csub = 2.5, possub = "bottomleft", box = TRUE) s.arrow(dudi1$co, clab = 1) par(mfrow = c(1, 1)) }} \keyword{multivariate} \keyword{hplot} ade4/man/RVdist.randtest.Rd0000644000176200001440000000135713050632301015166 0ustar liggesusers\name{RVdist.randtest} \alias{RVdist.randtest} \title{Tests of randomization on the correlation between two distance matrices (in R).} \description{ performs a RV Test between two distance matrices. } \usage{ RVdist.randtest(m1, m2, nrepet = 999, ...) } \arguments{ \item{m1, m2}{two Euclidean matrices} \item{nrepet}{the number of permutations} \item{\dots}{further arguments passed to or from other methods} } \value{ returns a list of class 'randtest' } \references{ Heo, M. & Gabriel, K.R. (1997) A permutation test of association between configurations by means of the RV coefficient. Communications in Statistics - Simulation and Computation, \bold{27}, 843-856. } \author{Daniel Chessel } \keyword{multivariate} \keyword{nonparametric} ade4/DESCRIPTION0000644000176200001440000000271713621233757012615 0ustar liggesusersPackage: ade4 Version: 1.7-15 Date: 2020-02-13 Title: Analysis of Ecological Data: Exploratory and Euclidean Methods in Environmental Sciences Author: Stéphane Dray , Anne-Béatrice Dufour , and Jean Thioulouse , with contributions from Thibaut Jombart, Sandrine Pavoine, Jean R. Lobry, Sébastien Ollier, Daniel Borcard, Pierre Legendre, Stéphanie Bougeard and Aurélie Siberchicot. Based on earlier work by Daniel Chessel. Maintainer: Aurélie Siberchicot Depends: R (>= 2.10) Imports: graphics, grDevices, methods, stats, utils, MASS, pixmap, sp Suggests: ade4TkGUI, adegraphics, adephylo, ape, CircStats, deldir, lattice, spdep, splancs, waveslim Description: Tools for multivariate data analysis. Several methods are provided for the analysis (i.e., ordination) of one-table (e.g., principal component analysis, correspondence analysis), two-table (e.g., coinertia analysis, redundancy analysis), three-table (e.g., RLQ analysis) and K-table (e.g., STATIS, multiple coinertia analysis). The philosophy of the package is described in Dray and Dufour (2007) . License: GPL (>= 2) URL: http://pbil.univ-lyon1.fr/ADE-4 BugReports: https://github.com/sdray/ade4/issues Encoding: UTF-8 NeedsCompilation: yes Packaged: 2020-02-13 09:06:03 UTC; stephane Repository: CRAN Date/Publication: 2020-02-13 11:50:07 UTC ade4/src/0000755000176200001440000000000013621210573011656 5ustar liggesusersade4/src/phylog.c0000644000176200001440000002210312576021756013335 0ustar liggesusers#include #include #include #include #include "adesub.h" void gearymoran (int *param, double *data, double *bilis, double *obs, double *result, double *obstot, double *restot); void VarianceDecompInOrthoBasis (int *param, double *z, double *matvp, double *phylogram, double *phylo95,double *sig025, double *sig975, double *test1, double *test2, double*test3, double *test4, double *test5); void gearymoran (int *param, double *data, double *bilis, double *obs, double *result, double *obstot, double *restot) { /* Declarations des variables C locales */ int nobs, nvar, nrepet, i, j, k, krepet, kvar ; int *numero; double provi; double *poili; double **mat, **tab, **tabperm; /* Allocation memoire pour les variables C locales */ nobs = param[0]; nvar = param [1]; nrepet = param [2]; vecalloc(&poili,nobs); taballoc(&mat,nobs,nobs); taballoc(&tab,nobs,nvar); taballoc(&tabperm,nobs,nvar); vecintalloc (&numero, nobs); /* Dfinitions des variables C locales */ k = 0; for (i=1; i<=nvar; i++) { for (j=1; j<=nobs; j++) { tab[j][i] = data[k] ; k = k+1 ; } } k = 0; provi = 0; for (j=1; j<=nobs; j++) { for (i=1; i<=nobs; i++) { mat[i][j] = bilis[k] ; provi = provi + bilis[k]; k = k+1 ; } } for (j=1; j<=nobs; j++) { for (i=1; i<=nobs; i++) { mat[i][j] = mat[i][j]/provi ; } } /* mat contient une distribution de frquence bivarie */ for (j=1; j<=nobs; j++) { provi = 0; for (i=1; i<=nobs; i++) { provi = provi + mat[i][j] ; } poili[j] = provi; } /* poili contient la distribution marginale le test sera du type xtPx avec x centr norm pour la pondration marginale et A = QtFQ soit la matrice des pij-pi.p.j */ matmodifcn(tab,poili); /* le tableau est normalis pour la pondration marginale de la forme*/ for (j=1; j<=nobs; j++) { for (i=1; i<=nobs; i++) { mat[i][j] = mat[i][j] -poili[i]*poili[j] ; } } for (kvar=1; kvar<=nvar; kvar++) { provi = 0; for (j=1; j<=nobs; j++) { for (i=1; i<=nobs; i++) { provi = provi + tab[i][kvar]*tab[j][kvar]*mat[i][j] ; } } obs[kvar-1] = provi; } k=0; /* les rsultats se suivent par simulation */ for (krepet=1; krepet<=nrepet; krepet++) { getpermutation (numero, krepet); matpermut (tab, numero, tabperm); matmodifcn (tabperm,poili); for (kvar=1; kvar<=nvar; kvar++) { provi = 0; for (j=1; j<=nobs; j++) { for (i=1; i<=nobs; i++) { provi = provi + tabperm[i][kvar]*tabperm[j][kvar]*mat[i][j] ; } } result[k] = provi; k = k+1; } } /* libration mmoire locale */ freevec(poili); freetab(mat); freeintvec(numero); freetab(tab); freetab(tabperm); } void VarianceDecompInOrthoBasis (int *param, double *z, double *matvp, double *phylogram, double *phylo95,double *sig025, double *sig975, double *R2Max, double *SkR2k, double*Dmax, double *SCE, double *ratio) { /* param contient 4 entiers : nobs le nombre de points, npro le nombre de vecteurs nrepet le nombre de permutations, posinega la nombre de vecteurs de la classe posi qui est nul si cette notion n'existe pas. Exemple : la base Bscores d'une phylognie a posinega = 0 mais la base Ascores a posinega prendre dans Adim z est un vecteur nobs composantes de norme 1 pour la pondration uniforme. matvp est une matrice nobsxnpro contenant en colonnes des vecteurs orthonorms pour la pondration uniforme. En gn La procdure placera dans phylogram les R2 de la dcomposition de z dans la base matvp dans phylo95 les quantiles 0.95 des R2 dans sig025 les quantiles 0.025 des R2 cumuls dans sig975 les quantiles 0.975 des R2 cumuls Ecrit l'origine pour les phylognies peut servir pour une base de vecteurs propres de voisinage */ /* Declarations des variables C locales */ int nobs, npro, nrepet, i, j, k, n1, n2, n3, n4; int irepet, posinega, *numero, *vecrepet; double **vecpro, *zperm, *znorm; double *locphylogram, *modelnul; double a1, provi, **simul, *copivec, *copicol; /* Allocation memoire pour les variables C locales */ nobs = param[0]; npro = param [1]; nrepet = param [2]; posinega = param[3]; vecalloc (&znorm, nobs); vecalloc (&zperm, nobs); vecalloc (&copivec, npro); vecalloc (&copicol, nrepet); taballoc (&vecpro, nobs, npro); taballoc (&simul, nrepet, npro); vecalloc (&locphylogram, npro); vecalloc (&modelnul, npro); vecintalloc (&numero, nobs); vecintalloc (&vecrepet, nrepet); /* Dfinitions des variables C locales */ for (i = 1 ; i<= nobs; i++) znorm[i] = z[i-1]; for (i = 1 ; i<= npro; i++) modelnul[i] = (double) i/ (double) npro; k = 0; for (j=1; j<=npro; j++) { for (i=1; i<=nobs; i++) { vecpro[i][j] = matvp[k] ; k = k+1 ; } } /* calcul du phylogramme observ */ for (j = 1; j<= npro; j++) { provi = 0; for (i=1; i<=nobs; i++) provi = provi + vecpro[i][j]*znorm[i]; provi = provi*provi/nobs/nobs; locphylogram[j] = provi; } for (i =1 ; i<= npro ; i++) phylogram[i-1] = locphylogram[i]; /* calcul des simulations Chaque ligne de simul est un phylogramme aprs permutation des donnes */ for (irepet=1; irepet<=nrepet; irepet++) { getpermutation (numero, irepet); vecpermut (znorm, numero, zperm); provi = 0; for (j = 1; j<= npro; j++) { provi = 0; for (i=1; i<=nobs; i++) provi = provi + vecpro[i][j]*zperm[i]; provi = provi*provi/nobs/nobs; simul[irepet][j] = provi; } } /* calcul du test sur le max du phylogramme */ for (irepet=1; irepet<=nrepet; irepet++) { for (j=1; j<=npro; j++) copivec[j] = simul[irepet][j]; R2Max[irepet] = maxvec(copivec); provi=0; for (j=1; j<=npro; j++) provi = provi + j*simul[irepet][j]; SkR2k[irepet] =provi; if (posinega>0) { provi=0; for (j=1; j0) { provi=0; for (j=1; j #include #include #include #include "adesub.h" #include "divsub.h" void testamova(double *distab, int *l1, int *c1, int *samtab, int *l2, int *c2,int *strtab, int *l3, int *c3, int *indicstr, int *nbhapl, int *npermut, double *divtotal, double *df, double *result); void permut(double **a, int **b, int **c, int *som, int increm, double *sst, int *prindicstr, double *prdf, double *res); /*****************************************************************/ void testamova(double *distab, int *l1, int *c1, int *samtab, int *l2, int *c2, int *strtab, int *l3, int *c3, int *indicstr, int *nbhapl, int *npermut, double *divtotal, double *df, double *result) { /* Declarations de variables C locales */ double **ditab, *vdf, *vsigma, *vtest; int i, j, k, lenvtest, lenvdf, seuil, **satab, **sttab; /* Allocation memoire pour les variables C locales */ taballoc(&ditab, *l1, *c1); tabintalloc(&satab, *l2, *c2); tabintalloc(&sttab, *l3, *c3); if(indicstr[0] != 0){ lenvdf = *c3 + 3; lenvtest = lenvdf - 1; } else{ lenvdf = 3; lenvtest = 1; } vecalloc(&vdf, lenvdf); vecalloc(&vsigma, lenvdf); vecalloc(&vtest, lenvtest); /* On recopie les objets R dans les variables C locales */ k = 0; for (i = 1; i <= *l1; i++) { for (j = 1; j <= *c1; j++) { ditab[i][j] = distab[k]; k = k + 1; } } k = 0; for (i = 1; i <= *l2; i++) { for (j = 1; j <= *c2; j++) { satab[i][j] = samtab[k]; k = k + 1; } } k = 0; for (i = 1; i <= *l3; i++) { for (j = 1; j <= *c3; j++) { sttab[i][j] = strtab[k]; k = k + 1; } } k=0; for (i = 1; i <= lenvdf; i++) { vdf[i] = df[k]; k = k + 1; } /* Calculs */ seuil = 0; k = 0; for(i = 1; i <= npermut[0]; i++){ seuil = seuil + 1; permut(ditab, satab, sttab, nbhapl, seuil, divtotal, indicstr, vdf, vtest); for(j = 1; j <= lenvtest; j++){ result[j - 1 + k] = vtest[j]; } k = k + lenvtest; } /* les resultats des tests vont etre renvoyes sous la forme d un vecteur. * Ce vecteur sera transforme en plusieurs object MonteCarlo dans la fonction .R */ freetab(ditab); freeinttab(satab); freeinttab(sttab); freevec(vdf); freevec(vsigma); freevec(vtest); } /***************************************************************/ void permut(double **a, int **b, int **c, int *som, int increm, double *sst, int *prindicstr, double *prdf, double *res) /*-------------------------------------------------- * realise les permutations * a est le tableau distances * b est le tableau samples * c est le tableau structure * som contient la somme des termes de samples * increm va servir dans la fonction getpermutation pour determiner des nombres aleatoires * sst est la diversit totale (qui est constante) * prindicstr indique la presence d un "vrai" tableau structures * prdf contient les degres de liberte --------------------------------------------------*/ { int i, j, k, l, m, n, ligb, colb, colc, colderoule, lenprss, lenprn, lennumhapld, *xd, *newxd, **deroule, **newderoule, **newderouled, *xp , *newxp, *unduplicxp, *unduplicxdprxp, *newunduplicxdprxp, *pralea, compt, lignewderoule, nbniveaux, **csim, *dersamples, *numhaplp, *numhapld, *numhaplt, *numsamples, *ressoms, *repnumsam, *numhaplsim, **bsim, *newh, *news, *newsd, *newst, *newg, *newgd, *numgroup, *numgroud; double *prss, *prms, *prn, *prsigma; /* dersamples contient samples deroule comme dans asvector samples*/ ligb = b[0][0]; colb = b[1][0]; lennumhapld = colb * ligb; colc = c[1][0]; vecintalloc(&numhaplp, ligb); vecintalloc(&numhapld, lennumhapld); vecintalloc(&dersamples, lennumhapld); vecintalloc(&numhaplt, som[0]); vecintalloc(&numhaplsim, som[0]); vecintalloc(&numsamples, colb); vecintalloc(&repnumsam, som[0]); vecintalloc(&ressoms, colb); vecintalloc(&pralea, som[0]); tabintalloc(&bsim, ligb, colb); tabintalloc(&csim, colb, colc); vecintalloc(&numgroup, colb); vecintalloc(&numgroud, som[0]); vecintalloc(&xp, som[0]); vecintalloc(&newxp, som[0]); vecintalloc(&xd, som[0]); vecintalloc(&newxd, som[0]); vecintalloc(&unduplicxp, som[0]); vecintalloc(&unduplicxdprxp, som[0]); vecintalloc(&newunduplicxdprxp, som[0]); vecintalloc(&newh, som[0]); vecintalloc(&news, som[0]); vecintalloc(&newsd, som[0]); vecintalloc(&newst, som[0]); vecintalloc(&newg, som[0]); vecintalloc(&newgd, som[0]); if(prindicstr[0] != 0){ colderoule = 2 + colc + 1; } else{ colderoule = 2; } tabintalloc(&deroule, som[0], colderoule); tabintalloc(&newderoule, som[0], colderoule); tabintalloc(&newderouled, som[0], colderoule); if(prindicstr[0] != 0){ lenprss = colc + 3; k = 0; j = colc + 1; for(i = 1; i <= j; i++){ k = k + i; } lenprn = k; } else{ lenprss = 3; lenprn = 1; } vecalloc(&prss, lenprss); vecalloc(&prms, lenprss); vecalloc(&prn, lenprn); vecalloc(&prsigma, lenprss); for(i = 1; i <= ligb; i++){ numhaplp[i] = i; } repdvecint(numhaplp, colb, numhapld); k = 0; for(j = 1; j <= colb; j++){ for(i = 1; i <= ligb; i++){ dersamples[k + i] = b[i][j]; } k = k + ligb; } repintvec(numhapld, dersamples, numhaplt); for(i = 1; i <= colb; i++){ numsamples[i] = i; } popsum(b, ressoms); repintvec(numsamples, ressoms, repnumsam); getpermutation(pralea, increm); vecintpermut(numhaplt, pralea, numhaplsim); getinttable(numhaplsim, repnumsam, bsim); sums(a, bsim, c, som, sst, prindicstr, prss); means(prss, prdf, prms); nvalues(bsim, c, som, prdf, prindicstr, prn); sigmas(prms, prn, prsigma); res[1] = prsigma[1]; if(prindicstr[0] != 0){ for(i = 1; i <= som[0]; i++){ deroule[i][1] = numhaplt[i]; deroule[i][2] = repnumsam[i]; } for(j = 1; j <= colc; j++){ for(i = 1; i <= colb; i++){ numgroup[i] = c[i][j]; } repintvec(numgroup, ressoms, numgroud); for(i = 1; i <= som[0]; i++){ deroule[i][2 + j] = numgroud[i]; } } for(i = 1; i <= som[0]; i++){ deroule[i][colderoule] = 1; } /* le tableau deroule contient en ligne les individus et en colonne: * 1ere colonne: le numero de l'haplotype de chaque individu * 2eme colonne: le numero de l'echantillon auquel appartient chaque individu * eventuellement, 3eme colonne: le numero du groupe auquel appartient chaque individu (premier groupement) * (ie premiere colonne de structures) * eventuellement, 4eme colonne: le numero du groupe auquel appartient chaque individu (deuxieme groupement) * (ie deuxieme colonne de structures) * ... * derniere colonne: un vecteur de 1 */ for(i = 2; i <= colderoule - 1; i++){ if(i != colderoule - 1){ for(k = 1; k <= colb; k++){ numgroup[k] = c[k][i - 1]; } nbniveaux = maxvecint(numgroup); } else{ nbniveaux = 1; } compt = 0; for(k = 1; k <= nbniveaux; k++){ m = 1; for(j = 1; j <= som[0]; j++){ if(deroule[j][i + 1] == k){ for(l = 1; l <= colderoule; l++){ newderoule[m][l] = deroule[j][l]; } m = m + 1; } } /* newderoule contient le tableau deroule restreint aux individus du groupe k * pour le groupement i + 1 */ for(j = 1; j <= m - 1; j++){ xp[j] = newderoule[j][i]; } xp[0] = m - 1; /* xp contient le numero du groupe, pour le groupement i, de chaque individu * appartenant au groupe k pour le groupement i + 1. * Nous allons permuter les goupes de niveau i au sein des groupes de niveau i + 1 */ unduplicint(xp, unduplicxp); /* unduplicxp contient les numeros des groupes pour le groupement i auquels appartiennent * les individus du groupe k pour le groupement i + 1.*/ lignewderoule = m - 1; if(unduplicxp[0] == 1){ for(j = 1; j <= lignewderoule; j++){ for(l = 1; l <= colderoule; l++){ newderouled[j + compt][l] = newderoule[j][l]; } } } else{ if(i == 2){ pralea[0] = m - 1; getpermutation(pralea, increm); for(j = 1; j <= lignewderoule; j++){ newderouled[j + compt][1] = newderoule[j][1]; m = pralea[j]; newderouled[j + compt][2] = newderoule[m][2]; for(l = 3; l <= colderoule; l++){ newderouled[j + compt][l] = newderoule[j][l]; } } } else{ for(j = 1; j <= m - 1; j++){ xd[j] = newderoule[j][i-1]; } xd[0] = m - 1; changeintlevels(xd, newxd); vpintunduplicvdint(xp, newxd, unduplicxdprxp); lignewderoule = m - 1; pralea[0] = unduplicxdprxp[0]; getpermutation(pralea, increm); vecintpermut(unduplicxdprxp, pralea, newunduplicxdprxp); for(j = 1; j <= m-1; j++){ l = newxd[j]; newxp[j] = newunduplicxdprxp[l]; } for(j = 1; j <= lignewderoule; j++){ for(l = 1; l <= i - 1; l++){ newderouled[j + compt][l] = newderoule[j][l]; } newderouled[j + compt][i] = newxp[j]; for(l = i + 1; l <= colderoule; l++){ newderouled[j + compt][l] = newderoule[j][l]; } } } } compt = compt + lignewderoule; } /* Les permutations terminees, on reconstruit les tableaux. */ for(j = 1; j <= som[0]; j++){ newh[j] = newderouled[j][1]; news[j] = newderouled[j][2]; } getinttable(newh, news, bsim); /* Le tableau samples (b) est reconstruit. */ for(j = 3; j <= colderoule - 1; j++){ for(l = 1; l <= som[0]; l++){ newg[l] = newderouled[l][j]; } vpintunduplicvdint(newg, news, newgd); unduplicint(news, newsd); newst[0] = newsd[0]; getneworder(newsd, newst); for(l = 1; l <= colb; l++){ n = newst[l]; csim[l][j - 2] = newgd[n]; } } /* Le tableau structures (c) est reconstruit. * Il reste a calculer la valueur simulee de sigma: */ sums(a, bsim, csim, som, sst, prindicstr, prss); means(prss, prdf, prms); nvalues(bsim, csim, som, prdf, prindicstr, prn); sigmas(prms, prn, prsigma); res[i] = prsigma[i]; } } else { res[1] = prsigma[2]; } freeintvec(numhaplp); freeintvec(numhapld); freeintvec(dersamples); freeintvec(numhaplt); freeintvec(numhaplsim); freeintvec(numsamples); freeintvec(repnumsam); freeintvec(ressoms); freeintvec(pralea); freeinttab(bsim); freeinttab(csim); freeintvec(numgroup); freeintvec(numgroud); freeintvec(xp); freeintvec(newxp); freeintvec(xd); freeintvec(newxd); freeintvec(unduplicxp); freeintvec(unduplicxdprxp); freeintvec(newunduplicxdprxp); freeintvec(newh); freeintvec(news); freeintvec(newsd); freeintvec(newst); freeintvec(newg); freeintvec(newgd); freeinttab(deroule); freeinttab(newderoule); freeinttab(newderouled); freevec(prss); freevec(prms); freevec(prn); freevec(prsigma); } ade4/src/testrlq.c0000644000176200001440000001446312576021756013543 0ustar liggesusers#include #include #include #include #include "adesub.h" #include void testertracerlq ( int *npermut, double *pcRr, int *npcR, double *pcQr, int *npcQ, double *plLr, int *nplL, double *pcLr, int *npcL, double *tabRr, double *tabQr, double *tabLr, int *assignRr, int *assignQr, int *indexRr, int *nindexR, int *indexQr, int *nindexQ, int *typQr, int *typRr, double *inersimul, int *modeltype); void testertracerlq ( int *npermut, double *pcRr, int *npcR, double *pcQr, int *npcQ, double *plLr, int *nplL, double *pcLr, int *npcL, double *tabRr, double *tabQr, double *tabLr, int *assignRr, int *assignQr, int *indexRr, int *nindexR, int *indexQr, int *nindexQ, int *typQr, int *typRr, double *inersimul, int* modeltype) { /* Declarations des variables C locales */ double **XR, **XQ, **XL,**initR, **initQ, *pcR, *pcQ, *plL,*pcL, **ta,**provi; int i, j, k, lL,cL, cR, cQ; double inertot, s1, inersim, a1; int *numero1, *numero2,*assignR,*assignQ, *indexR, *indexQ; int typR, typQ; /* On recopie les objets R dans les variables C locales */ lL = *nplL; cL = *npcL; cQ = *npcQ; cR = *npcR; typR = *typRr; typQ = *typQr; /* Allocation memoire pour les variables C locales */ vecalloc (&pcR, cR); vecalloc (&pcQ, cQ); vecalloc (&plL, lL); vecalloc (&pcL, cL); vecintalloc (&numero1, lL); vecintalloc (&numero2, cL); taballoc (&XR, lL, cR); taballoc (&XQ, cL, cQ); taballoc (&initR, lL, cR); taballoc (&initQ, cL, cQ); taballoc (&XL, lL, cL); taballoc (&ta, cR, cQ); taballoc (&provi,cR,cL); /* if typ == 8 (i.e. HillSmith Analysis)*/ if (typR == 8) { vecintalloc(&assignR,cR); for (i=1; i<=cR; i++) { assignR[i] = assignRr[i-1]; } vecintalloc(&indexR,*nindexR); for (i=1; i<=*nindexR; i++) { indexR[i] = indexRr[i-1]; } } if (typQ == 8) { vecintalloc(&assignQ,cQ); for (i=1; i<=cQ; i++) { assignQ[i] = assignQr[i-1]; } vecintalloc(&indexQ,*nindexQ); for (i=1; i<=*nindexQ; i++) { indexQ[i] = indexQr[i-1]; } } /* On recopie les objets R dans les variables C locales */ k = 0; for (i=1; i<=lL; i++) { for (j=1; j<=cR; j++) { initR[i][j] = tabRr[k]; XR[i][j] = tabRr[k]; k = k + 1; } } k = 0; for (i=1; i<=cL; i++) { for (j=1; j<=cQ; j++) { initQ[i][j] = tabQr[k]; XQ[i][j] = tabQr[k]; k = k + 1; } } k = 0; for (i=1; i<=lL; i++) { for (j=1; j<=cL; j++) { XL[i][j] = tabLr[k]; k = k + 1; } } for (i=1; i<=cR; i++) { pcR[i] = pcRr[i-1]; } for (i=1; i<=cQ; i++) { pcQ[i] = pcQr[i-1]; } for (i=1; i<=cL; i++) { pcL[i] = pcLr[i-1]; } for (i=1; i<=lL; i++) { plL[i] = plLr[i-1]; } /* Calculs */ for (i=1; i<=lL;i++) { for (j=1;j<=cL;j++) { XL[i][j]=XL[i][j]*plL[i]*pcL[j]; } } if (typR == 8) { matcentragehi(XR,plL,indexR,assignR); } else {matcentrage (XR, plL, typR); } if (typQ == 8) { matcentragehi(XQ,pcL,indexQ,assignQ); } else {matcentrage (XQ, pcL, typQ); } prodmatAtBC (XR, XL, provi); prodmatABC (provi,XQ, ta); inertot = 0; for (i=1;i<=cR;i++) { a1 = pcR[i]; for (j=1;j<=cQ;j++) { s1 = ta[i][j]; inertot = inertot + s1 * s1 * a1 * pcQ[j]; } } inersimul[0] = inertot; k = 0; /* Permutation */ for (k=1; k<=*npermut; k++) { if((*modeltype==2) || (*modeltype==5)) { /* modeltype=2 permute R (i.e. row of L) */ getpermutation (numero1,k); matpermut (initR, numero1, XR); } if((*modeltype==4) || (*modeltype==5)) { /* modeltype=4 permute Q (i.e. column of L) */ getpermutation (numero2,2*k); matpermut (initQ, numero2, XQ); } if((*modeltype==2) || (*modeltype==5)) { /* modeltype=2 permute R (i.e. row of L) */ if (typR == 8) { for(j=1;j<=cR;j++){ if(indexR[assignR[j]]==2){ pcR[j]=0; } } for(i=1;i<=lL;i++){ for(j=1;j<=cR;j++){ if(indexR[assignR[j]]==2){ pcR[j]=pcR[j]+XR[i][j]*plL[i]; } } } matcentragehi(XR,plL,indexR,assignR); /* on recalcule le poids colonne pour les qualitatives */ } else { /* on recalcule le poids colonne pour les qualitatives pour une acm*/ if (typR == 2) { for(j=1;j<=cR;j++){ pcR[j]=0; } for(i=1;i<=lL;i++){ for(j=1;j<=cR;j++){ pcR[j]=pcR[j]+XR[i][j]*plL[i]; } } for(j=1;j<=cR;j++){ pcR[j]=pcR[j]/(*nindexR); } } matcentrage (XR, plL, typR); } } if((*modeltype==4) || (*modeltype==5)) { /* modeltype=4 permute Q (i.e. column of L) */ if (typQ == 8) { /* on recalcule le poids colonne pour les qualitatives*/ for(j=1;j<=cQ;j++){ if(indexQ[assignQ[j]]==2){ pcQ[j]=0; } } for(i=1;i<=cL;i++){ for(j=1;j<=cQ;j++){ if(indexQ[assignQ[j]]==2){ pcQ[j]=pcQ[j]+XQ[i][j]*pcL[i]; } } } matcentragehi(XQ,pcL,indexQ,assignQ); } else { /* on recalcule le poids colonne pour les qualitatives pour une acm*/ if (typQ == 2) { for(j=1;j<=cQ;j++){ pcQ[j]=0; } for(i=1;i<=cL;i++){ for(j=1;j<=cQ;j++){ pcQ[j]=pcQ[j]+XQ[i][j]*pcL[i]; } } for(j=1;j<=cQ;j++){ pcQ[j]=pcQ[j]/(*nindexQ); } } matcentrage (XQ, pcL, typQ); } } prodmatAtBC (XR, XL, provi); prodmatABC (provi,XQ, ta); inersim = 0; for (i=1;i<=cR;i++) { a1 = pcR[i]; for (j=1;j<=cQ;j++) { s1 = ta[i][j]; inersim = inersim + s1 * s1 * a1 * pcQ[j]; } } inersimul[k]=inersim; } freeintvec(numero1); freeintvec(numero2); if (typR == 8) { freeintvec(assignR); freeintvec(indexR); } if (typQ == 8) { freeintvec(assignQ); freeintvec(indexQ); } freetab(XR); freetab(initR); freetab(XL); freetab(ta); freetab(provi); freetab(XQ); freetab(initQ); freevec(plL); freevec(pcL); freevec(pcQ); freevec(pcR); } /*********************************/ ade4/src/init.c0000644000176200001440000000751413071726411012776 0ustar liggesusers#include #include #include // for NULL #include /* .C calls */ extern void gearymoran(void *, void *, void *, void *, void *, void *, void *); extern void MSTgraph(void *, void *, void *, void *); extern void quatriemecoin(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void quatriemecoin2(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void quatriemecoinRLQ(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void testamova(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void testdimRVpca(void *, void *, void *, void *, void *, void *, void *, void *); extern void testdiscrimin(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void testdistRV(void *, void *, void *, void *, void *); extern void testertrace(void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void testertracenu(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void testertracenubis(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void testertracerlq(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void testinter(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); extern void testmantel(void *, void *, void *, void *, void *); extern void testmultispati(void *, void *, void *, void *, void *, void *, void *, void *); extern void testprocuste(void *, void *, void *, void *, void *, void *, void *); extern void VarianceDecompInOrthoBasis(void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *, void *); static const R_CMethodDef CEntries[] = { {"gearymoran", (DL_FUNC) &gearymoran, 7}, {"MSTgraph", (DL_FUNC) &MSTgraph, 4}, {"quatriemecoin", (DL_FUNC) &quatriemecoin, 18}, {"quatriemecoin2", (DL_FUNC) &quatriemecoin2, 17}, {"quatriemecoinRLQ", (DL_FUNC) &quatriemecoinRLQ, 30}, {"testamova", (DL_FUNC) &testamova, 15}, {"testdimRVpca", (DL_FUNC) &testdimRVpca, 8}, {"testdiscrimin", (DL_FUNC) &testdiscrimin, 10}, {"testdistRV", (DL_FUNC) &testdistRV, 5}, {"testertrace", (DL_FUNC) &testertrace, 9}, {"testertracenu", (DL_FUNC) &testertracenu, 14}, {"testertracenubis", (DL_FUNC) &testertracenubis, 15}, {"testertracerlq", (DL_FUNC) &testertracerlq, 22}, {"testinter", (DL_FUNC) &testinter, 12}, {"testmantel", (DL_FUNC) &testmantel, 5}, {"testmultispati", (DL_FUNC) &testmultispati, 8}, {"testprocuste", (DL_FUNC) &testprocuste, 7}, {"VarianceDecompInOrthoBasis", (DL_FUNC) &VarianceDecompInOrthoBasis, 12}, {NULL, NULL, 0} }; void R_init_ade4(DllInfo *dll) { R_registerRoutines(dll, CEntries, NULL, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } ade4/src/Makevars0000644000176200001440000000006312576021756013364 0ustar liggesusers PKG_LIBS = $(LAPACK_LIBS) $(BLAS_LIBS) $(FLIBS) ade4/src/adesub.c0000644000176200001440000010106213021372261013262 0ustar liggesusers#include #include #include #include #include "adesub.h" /***********************************************************************/ double traceXtdLXq (double **X, double **L, double *d, double *q) /* Produit matriciel XtDLXQ avec LX comme lag.matrix */ { /* Declarations de variables C locales */ int j, i, lig, col; double **auxi, **A, trace; /* Allocation memoire pour les variables C locales */ lig = X[0][0]; col = X[1][0]; taballoc(&auxi, lig, col); taballoc(&A, col, col); /* Calcul de LX */ prodmatABC(L, X, auxi); /* Calcul de DLX */ for (i=1;i<=lig;i++) { for (j=1;j<=col;j++) { auxi[i][j] = auxi[i][j] * d[i]; } } /* Calcul de XtDLX */ prodmatAtBC(X,auxi,A); /* Calcul de trace(XtDLXQ) */ trace=0; for (i=1;i<=col;i++) { trace = trace + A[i][i] * q[i]; } /* Liberation des reservations locales */ freetab (auxi); freetab (A); return(trace); } /***********************************************************************/ void tabintalloc (int ***tab, int l1, int c1) /*-------------------------------------------------- * Allocation de memoire dynamique pour un tableau * d'entiers (l1, c1) --------------------------------------------------*/ { int i, j; *tab = (int **) calloc(l1+1, sizeof(int *)); if ( *tab != NULL) { for (i=0;i<=l1;i++) { *(*tab+i)=(int *) calloc(c1+1, sizeof(int)); if ( *(*tab+i) == NULL ) { for (j=0;jj) k=j; for (n=1; n<=col; n++) { z = a[j][n]; a[j][n]=a[k][n]; a[k][n] = z; } } } /*************************/ void aleapermutvec (double *a) { /* permute au hasard les elements du vecteur a Manly p. 42 Le vecteur est modifie from Knuth 1981 p. 139*/ int lig, i,j, k; double z; lig = a[0]; for (i=1; i<=lig-1; i++) { j=lig-i+1; k = (int) (j*alea()+1); /*k = (int) (j*genrand()+1);*/ if (k>j) k=j; z = a[j]; a[j]=a[k]; a[k] = z; } } /***********************************************************************/ void DiagobgComp (int n0, double **w, double *d, int *rang) /*-------------------------------------------------- * Diagonalisation * T. FOUCART Analyse factorielle de tableaux multiples, * Masson, Paris 1984,185p., p. 62. D'après VPROP et TRIDI, * de LEBART et coll. --------------------------------------------------*/ { double *s, epsilon; double a, b, c, x, xp, q, bp, ab, ep, h, t, u , v; double dble; int ni, i, i2, j, k, jk, ijk, ij, l, ix, m, m1, isnou; vecalloc(&s, n0); a = 0.000000001; epsilon = 0.0000001; ni = 100; if (n0 == 1) { d[1] = w[1][1]; w[1][1] = 1.0; *rang = 1; freevec (s); return; } for (i2=2;i2<=n0;i2++) { b=0.0; c=0.0; i=n0-i2+2; k=i-1; if (k < 2) goto Et1; for (l=1;l<=k;l++) { c = c + fabs((double) w[i][l]); } if (c != 0.0) goto Et2; Et1: s[i] = w[i][k]; goto Etc; Et2: for (l=1;l<=k;l++) { x = w[i][l] / c; w[i][l] = x; b = b + x * x; } xp = w[i][k]; ix = 1; if (xp < 0.0) ix = -1; /* q = -sqrt(b) * ix; */ dble = b; dble = -sqrt(dble); q = dble * ix; s[i] = c * q; b = b - xp * q; w[i][k] = xp - q; xp = 0; for (m=1;m<=k;m++) { w[m][i] = w[i][m] / b / c; q = 0; for (l=1;l<=m;l++) { q = q + w[m][l] * w[i][l]; } m1 = m + 1; if (k < m1) goto Et3; for (l=m1;l<=k;l++) { q = q + w[l][m] * w[i][l]; } Et3: s[m] = q / b; xp = xp + s[m] * w[i][m]; } bp = xp * 0.5 / b; for (m=1;m<=k;m++) { xp = w[i][m]; q = s[m] - bp * xp; s[m] = q; for (l=1;l<=m;l++) { w[m][l] = w[m][l] - xp * s[l] - q * w[i][l]; } } for (l=1;l<=k;l++) { w[i][l] = c * w[i][l]; } Etc: d[i] = b; } /* for (i2=2;i2= h) { l = m; h = d[m]; } } if (l == i) { goto Etb; } else { d[l] = d[i]; d[i] = h; } for (m=1;m<=n0;m++) { h = w[m][i]; w[m][i] = w[m][l]; w[m][l] = h; } Etb:; } /* for (ij=2;ij<=n0;ij++) */ *rang = 0; for (i=1;i<=n0;i++) { if (d[i] / d[1] < epsilon) d[i] = 0.0; if (d[i] != 0.0) *rang = *rang + 1; } freevec(s); } /* DiagoCompbg */ /***********************************************************************/ void freeintvec (int *vec) /*-------------------------------------------------- * liberation de memoire pour un vecteur --------------------------------------------------*/ { free((char *) vec); } /***********************************************************************/ void freetab (double **tab) /*-------------------------------------------------- * Allocation de memoire dynamique pour un tableau (l1, c1) --------------------------------------------------*/ { int i, n; n = *(*(tab)); for (i=0;i<=n;i++) { free((char *) *(tab+i) ); } free((char *) tab); } /***********************************************************************/ void freevec (double *vec) /*-------------------------------------------------- * liberation de memoire pour un vecteur --------------------------------------------------*/ { free((char *) vec); } /***********************************************************************/ void getpermutation (int *numero, int repet) /*---------------------- * affectation d'une permutation aleatoire des n premiers entiers * dans dans un vecteur d'entiers de dimension n * vecintalloc prealable exige * *numero est un vecteur d'entier * repet est un entier qui peut prendre une valeur arbitraire * utilise dans le germe du generateur de nb pseudo-aleatoires * si on l'incremente dans des appels repetes (e.g. simulation) garantit * que deux appels donnent deux resultats distincts (seed=clock+repet) ------------------------*/ { int i, n; int *alea; n=numero[0]; vecintalloc (&alea,n); /*------------- * numerotation dans numero -----------*/ for (i=1;i<=n;i++) { numero[i]=i; } /*------------- * affectation de nombres aleatoires dans alea ----------------*/ GetRNGstate(); for (i=1;i<=n;i++) { alea[i]= (int) (unif_rand() * RAND_MAX); } PutRNGstate(); trirapideint (alea , numero, 1, n); freeintvec (alea); } /***********************************************************************/ void matcentrage (double **A, double *poili, int typ) { /* Modification of the original table for different analyses. typ=1 no modification (PCA on original variable) typ=2 ACM (matmodifcm) typ=3 normed and centred PCA (matmodifcn) typ=4 centred PCA (matmodifcp) typ=5 normed and non-centred PCA (matmodifcs) typ=6 COA (matmodiffc) typ=7 FCA (matmodiffc) typ=8 Hill-smith (use matcentagehi in this case) */ if (typ == 1) { return; } else if (typ == 2) { matmodifcm (A, poili); return; } else if (typ == 3) { matmodifcn (A, poili); return; } else if (typ == 4) { matmodifcp (A, poili); return; } else if (typ == 5) { matmodifcs (A, poili); return; } else if (typ == 6) { matmodiffc (A, poili); return; } else if (typ == 7) { matmodifcm (A, poili); return; } } /***********************************************************************/ void matcentragehi (double **tab, double *poili, int *index, int *assign) { /*centrage d'un tableau de hill smith tab tableau avec quantitatives et qualitatives disjonctifs complets poili vecteur poids lignes index indique si chaque variables est quanti (1) ou quali (2) assign vecteur entier qui donne l'index de la variable pour chaque colonne */ int l1,c1,i,j,nquant=0,nqual=0,jqual=1,jquant=1; double **tabqual, **tabquant; l1 = tab[0][0]; c1 = tab[1][0]; for(j=1;j<=c1;j++){ if(index[assign[j]]==2){ nqual=nqual+1; } else if (index[assign[j]]==1){ nquant=nquant+1; } } taballoc(&tabqual,l1,nqual); taballoc(&tabquant,l1,nquant); for (j=1;j<=c1;j++){ if (index[assign[j]]==2) { for (i=1; i<=l1;i++) { tabqual[i][jqual]=tab[i][j]; } jqual=jqual+1; } else if (index[assign[j]]==1){ for (i=1; i<=l1;i++) { tabquant[i][jquant]=tab[i][j]; } jquant=jquant+1; } } matmodifcm (tabqual, poili); matmodifcn (tabquant, poili); jqual=1; jquant=1; for (j=1;j<=c1;j++) { if (index[assign[j]]==2) { for (i=1;i<=l1;i++) { tab[i][j] = tabqual[i][jqual]; } jqual=jqual+1; } else if (index[assign[j]]==1) { for (i=1;i<=l1;i++) { tab[i][j] = tabquant[i][jquant]; } jquant=jquant+1; } } freetab(tabqual); freetab(tabquant); return; } /***********************************************************************/ void matmodifcm (double **tab, double *poili) /*-------------------------------------------------- * tab est un tableau n lignes, m colonnes * disjonctif complet * poili est un vecteur n composantes * la procedure retourne tab centre par colonne * pour la ponderation poili (somme=1) * centrage type correspondances multiples --------------------------------------------------*/ { double poid; int i, j, l1, m1; double *poimoda; double x, z; l1 = tab[0][0]; m1 = tab[1][0]; vecalloc(&poimoda, m1); for (i=1;i<=l1;i++) { poid = poili[i]; for (j=1;j<=m1;j++) { poimoda[j] = poimoda[j] + tab[i][j] * poid; } } for (j=1;j<=m1;j++) { x = poimoda[j]; if (x==0) { for (i=1;i<=l1;i++) tab[i][j] = 0; } else { for (i=1;i<=l1;i++) { z = tab[i][j]/x - 1.0; tab[i][j] = z; } } } freevec (poimoda); } /***********************************************************************/ void matmodifcn (double **tab, double *poili) /*-------------------------------------------------- * tab est un tableau n lignes, p colonnes * poili est un vecteur n composantes * la procedure retourne tab norme par colonne * pour la ponderation poili (somme=1) --------------------------------------------------*/ { double poid, x, z, y, v2; int i, j, l1, c1; double *moy, *var; l1 = tab[0][0]; c1 = tab[1][0]; vecalloc(&moy, c1); vecalloc(&var, c1); /*-------------------------------------------------- * calcul du tableau centre/norme --------------------------------------------------*/ for (i=1;i<=l1;i++) { poid = poili[i]; for (j=1;j<=c1;j++) { moy[j] = moy[j] + tab[i][j] * poid; } } for (i=1;i<=l1;i++) { poid=poili[i]; for (j=1;j<=c1;j++) { x = tab[i][j] - moy[j]; var[j] = var[j] + poid * x * x; } } for (j=1;j<=c1;j++) { v2 = var[j]; if (v2<=0) v2 = 1; v2 = sqrt(v2); var[j] = v2; } for (i=1;i<=c1;i++) { x = moy[i]; y = var[i]; for (j=1;j<=l1;j++) { z = tab[j][i] - x; z = z / y; tab[j][i] = z; } } freevec(moy); freevec(var); } /***********************************************************************/ void matmodifcs (double **tab, double *poili) /*-------------------------------------------------- * tab est un tableau n lignes, p colonnes * poili est un vecteur n composantes * la procedure retourne tab standardise par colonne * pour la ponderation poili (somme=1) --------------------------------------------------*/ { double poid, x, z, y, v2; int i, j, l1, c1; double *var; l1 = tab[0][0]; c1 = tab[1][0]; vecalloc(&var, c1); /*-------------------------------------------------- * calcul du tableau standardise --------------------------------------------------*/ for (i=1;i<=l1;i++) { poid=poili[i]; for (j=1;j<=c1;j++) { x = tab[i][j]; var[j] = var[j] + poid * x * x; } } for (j=1;j<=c1;j++) { v2 = var[j]; if (v2<=0) v2 = 1; v2 = sqrt(v2); var[j] = v2; } for (i=1;i<=c1;i++) { y = var[i]; for (j=1;j<=l1;j++) { z = tab[j][i]; z = z / y; tab[j][i] = z; } } freevec(var); } /***********************************************************************/ void matmodifcp (double **tab, double *poili) /*-------------------------------------------------- * tab est un tableau n lignes, p colonnes * poili est un vecteur n composantes * la procedure retourne tab centre par colonne * pour la ponderation poili (somme=1) --------------------------------------------------*/ { double poid; int i, j, l1, c1; double *moy, x, z; l1 = tab[0][0]; c1 = tab[1][0]; vecalloc(&moy, c1); /*-------------------------------------------------- * calcul du tableau centre --------------------------------------------------*/ for (i=1;i<=l1;i++) { poid = poili[i]; for (j=1;j<=c1;j++) { moy[j] = moy[j] + tab[i][j] * poid; } } for (i=1;i<=c1;i++) { x = moy[i]; for (j=1;j<=l1;j++) { z = tab[j][i] - x; tab[j][i] = z; } } freevec(moy); } /***********************************************************************/ void matmodiffc (double **tab, double *poili) /*-------------------------------------------------- * tab est un tableau n lignes, m colonnes * de nombres positifs ou nuls * poili est un vecteur n composantes * la procedure retourne tab centre doublement * pour la ponderation poili (somme=1) * centrage type correspondances simples --------------------------------------------------*/ { double poid; int i, j, l1, m1; double *poimoda; double x, z; l1 = tab[0][0]; m1 = tab[1][0]; vecalloc(&poimoda, m1); for (i=1;i<=l1;i++) { x = 0; for (j=1;j<=m1;j++) { x = x + tab[i][j]; } if (x!=0) { for (j=1;j<=m1;j++) { tab[i][j] = tab[i][j]/x; } } } for (i=1;i<=l1;i++) { poid = poili[i]; for (j=1;j<=m1;j++) { poimoda[j] = poimoda[j] + tab[i][j] * poid; } } for (j=1;j<=m1;j++) { x = poimoda[j]; if (x==0) { /*err_message("column has a nul weight (matmodiffc)");*/ } for (i=1;i<=l1;i++) { z = tab[i][j]/x - 1.0; tab[i][j] = z; } } freevec (poimoda); } /***********************************************************************/ void matpermut (double **A, int *num, double **B) { /*--------------------------------------- * A est une matrice n-p * B est une matrice n-p * num est une permutation aleatoire des n premiers entiers * B contient en sortie les lignes de A permutees * ---------------------------------------*/ int lig, col,lig1, col1, lig2, i, j, k; lig = A[0][0]; col = A[1][0]; lig1 = B[0][0]; col1 = B[1][0]; lig2 = num[0]; if ( (lig!=lig1) || (col!=col1) || (lig!=lig2) ) { return; } for (i=1; i<=lig; i++) { k=num[i]; for (j=1; j<=col; j++) { B[i][j] = A[k][j]; } } } /***********************************************************************/ void prodmatABC (double **a, double **b, double **c) /*-------------------------------------------------- * Produit matriciel AB --------------------------------------------------*/ { int j, k, i, lig, col, col2; double s; lig = a[0][0]; col = a[1][0]; col2 = b[1][0]; for (i=1;i<=lig;i++) { for (k=1;k<=col2;k++) { s = 0; for (j=1;j<=col;j++) { s = s + a[i][j] * b[j][k]; } c[i][k] = s; } } } /***********************************************************************/ void prodmatAdBC (double **a, double *d, double **b, double **c) /*-------------------------------------------------- * Produit matriciel AdB (d is a diagonal matrix stored in a vector) --------------------------------------------------*/ { int j, k, i, lig, col, col2; double s; lig = a[0][0]; col = a[1][0]; col2 = b[1][0]; for (i=1;i<=lig;i++) { for (k=1;k<=col2;k++) { s = 0; for (j=1;j<=col;j++) { s = s + a[i][j] * d[j] * b[j][k]; } c[i][k] = s; } } } /***********************************************************************/ void prodmatAtAB (double **a, double **b) /*-------------------------------------------------- * Produit matriciel AtA --------------------------------------------------*/ { int j, k, i, lig, col; double s; lig = a[0][0]; col = a[1][0]; for (j=1;j<=col;j++) { for (k=j;k<=col;k++) { s = 0; for (i=1;i<=lig;i++) { s = s + a[i][k] * a[i][j]; } b[j][k] = s; b[k][j] = s; } } } /***********************************************************************/ void prodmatAtBC (double **a, double **b, double **c) /*-------------------------------------------------- * Produit matriciel AtB --------------------------------------------------*/ { int j, k, i, lig, col, col2; double s; lig = a[0][0]; col = a[1][0]; col2 = b[1][0]; for (j=1;j<=col;j++) { for (k=1;k<=col2;k++) { s = 0; for (i=1;i<=lig;i++) { s = s + a[i][j] * b[i][k]; } c[j][k] = s; } } } /***********************************************************************/ double maxvec (double *vec) /*-------------------------------------------------- * calcul le max d'un vecteur --------------------------------------------------*/ { int i, len; double x; x = vec[1]; len = vec[0]; for (i=1;i<=len;i++) { if (vec[i] > x) x = vec[i]; } return(x); } /***********************************************************************/ void prodmatAAtB (double **a, double **b) /*-------------------------------------------------- * Produit matriciel B = AAt --------------------------------------------------*/ { int j, k, i, lig, col; double s; lig = a[0][0]; col = a[1][0]; for (j=1;j<=lig;j++) { for (k=j;k<=lig;k++) { s = 0; for (i=1;i<=col;i++) { s = s + a[j][i] * a[k][i]; } b[j][k] = s; b[k][j] = s; } } } /***********************************************************************/ void prodmatAtBrandomC (double **a, double **b, double **c, int*permut) /*-------------------------------------------------- * Produit matriciel AtB * les lignes de B sont permutees par la permutation permut --------------------------------------------------*/ { int j, k, i, i0, lig, col, col2; double s; lig = a[0][0]; col = a[1][0]; col2 = b[1][0]; for (j=1;j<=col;j++) { for (k=1;k<=col2;k++) { s = 0; for (i=1;i<=lig;i++) { i0 = permut[i]; s = s + a[i][j] * b[i0][k]; } c[j][k] = s; } } } /***********************************************************************/ void sqrvec (double *v1) /*-------------------------------------------------- * Racine carree des elements d'un vecteur --------------------------------------------------*/ { int i, c1; double v2; c1 = v1[0]; for (i=1;i<=c1;i++) { v2 = v1[i]; /* if (v2 < 0.0) err_message("Error: Square root of negative number (sqrvec)");*/ v2 = sqrt(v2); v1[i] = v2; } } /***********************************************************************/ void taballoc (double ***tab, int l1, int c1) /*-------------------------------------------------- * Allocation de memoire dynamique pour un tableau (l1, c1) --------------------------------------------------*/ { int i, j; if ( (*tab = (double **) calloc(l1+1, sizeof(double *))) != 0) { for (i=0;i<=l1;i++) { if ( (*(*tab+i)=(double *) calloc(c1+1, sizeof(double))) == 0 ) { return; for (j=0;j t) { dernier = dernier + 1; trildswap (x, dernier, j); trildintswap (num, dernier, j); } } trildswap (x, gauche, dernier); trildintswap (num, gauche, dernier); trild (x, num, gauche, dernier-1); trild (x, num, dernier+1, droite); } /**************************/ void trildintswap (int *v, int i, int j) { int provi; provi=v[i]; v[i]=v[j]; v[j]=provi; } /***********************************************************************/ void trildswap (double *v, int i, int j) /*-------------------------------------------------- * Echange les valeurs de deux double --------------------------------------------------*/ { double provi; provi=v[i]; v[i]=v[j]; v[j]=provi; } /***********************************************************************/ void trirap (double *x , int *num) /*-------------------------------------------------- * Tri d'un tableau de double par ordre croissant * avec conservation du rang dans un tableau entier. --------------------------------------------------*/ { int i, n, *num2, gauche, droite; double *x2; n = x[0]; gauche = 1; droite = n; vecalloc(&x2, n); vecintalloc(&num2, n); for (i=1;i<=n;i++) num[i] = i; trild(x, num, gauche, droite); for (i=1;i<=n;i++) { x2[i] = x[n - i + 1]; num2[i] = num[n - i + 1]; } for (i=1;i<=n;i++) { x[i] = x2[i]; num[i] = num2[i]; } freevec(x2); freeintvec(num2); } /***********************************************************************/ void trirapideint (int *x , int *num, int gauche, int droite) { int j, dernier, milieu, t; if ( (droite-gauche)<=0) return; milieu = (gauche+droite)/2; trirapideintswap (x, gauche, milieu); trirapideintswap (num, gauche, milieu); t=x[gauche]; dernier=gauche; for (j = gauche+1; j<=droite; j++) { if (x[j] < t) { dernier = dernier + 1; trirapideintswap (x, dernier, j); trirapideintswap (num, dernier, j); } } trirapideintswap (x, gauche, dernier); trirapideintswap (num, gauche, dernier); trirapideint (x, num, gauche, dernier-1); trirapideint (x, num, dernier+1, droite); } /***********************************************************************/ void trirapideintswap (int *v, int i, int j) { int provi; provi=v[i]; v[i]=v[j]; v[j]=provi; } /***********************************************************************/ void vecalloc (double **vec, int n) /*-------------------------------------------------- * Allocation de memoire pour un vecteur de longueur n --------------------------------------------------*/ { if ( (*vec = (double *) calloc(n+1, sizeof(double))) != 0) { **vec = n; return; } else { return; } } /***********************************************************************/ void vecintalloc (int **vec, int n) /*-------------------------------------------------- * Allocation de memoire pour un vecteur d'entiers de longueur n --------------------------------------------------*/ { if ( (*vec = (int *) calloc(n+1, sizeof(int))) != NULL) { **vec = n; return; } else { return; } } /***********************************************************************/ void vecpermut (double *A, int *num, double *B) { /*--------------------------------------- * A est un vecteur n elements * B est une vecteur n elements * num est une permutation aleatoire des n premiers entiers * B contient en sortie les elements de A permutees * ---------------------------------------*/ int lig, lig1, lig2, i, k; lig = A[0]; lig1 = B[0]; lig2 = num[0]; if ( (lig!=lig1) || (lig!=lig2) ) { /*err_message ("Illegal parameters (vecpermut)"); closelisting();*/ } for (i=1; i<=lig; i++) { k=num[i]; B[i] = A[k]; } } /***********************************************************************/ /*=====================================================================*/ /* MODELES DE PERMUTATION */ /*=====================================================================*/ void permutmodel1(double **X1,double **X1permute,int *ligL,int *colL) { /* permute each column independently */ /* Declaration des variables locales */ double *a; int i,j,k,ligL1,colL1; ligL1=*ligL; colL1=*colL; /* Allocation memoire pour les variables C locales */ vecalloc(&a, ligL1); /* Permutation de la matrice */ for(j=1;j<=colL1;j++) { for(i=1;i<=ligL1;i++) { a[i]=X1[i][j]; } aleapermutvec (a); /* Construction de la matrice X1permute*/ for(k=1;k<=ligL1;k++) { X1permute[k][j]=a[k]; } } freevec(a); } void permutmodel3(double **X1,double **X1permute,int *ligL,int *colL) { /*****************************************************************/ /* Fonction qui permute selon le model 3 de la methode du 4e coin*/ /*****************************************************************/ /* permutation a l"interieur de chaque ligne (site) independamement */ /* Declaration des variables locales */ double *a; int i,j,k,ligL1,colL1; ligL1=*ligL; colL1=*colL; /* Allocation memoire pour les variables C locales */ vecalloc(&a, colL1); /* Permutation de la matrice */ for(i=1;i<=ligL1;i++) { for(j=1;j<=colL1;j++) { a[j]=X1[i][j]; } aleapermutvec (a); /* Construction de la matrice contenant les vecteurs permutees */ for (k=1; k<=colL1; k++) { X1permute[i][k]=a[k]; } } freevec(a); } /*=====================================================================*/ void permutmodel4(double **X1, double **X1permute, int *ligL, int *colL) { /*****************************************************************/ /* Fonction qui permute selon le model 4 de la methode du 4e coin*/ /*****************************************************************/ /* permute des colonnes */ /* Declaration des variables locales */ int i,j,ligL1,colL1; ligL1=*ligL; colL1=*colL; double **X1transposee; taballoc(&X1transposee,colL1,ligL1); /* Transposee de X1 */ for (i=1; i<=ligL1; i++) { for (j=1; j<=colL1; j++) { X1transposee[j][i]=X1[i][j]; } } aleapermutmat (X1transposee); //Retransposons la matrice for (j=1; j<=colL1; j++) { for (i=1; i<=ligL1; i++) { X1permute[i][j]=X1transposee[j][i]; } } freetab(X1transposee); } /*=====================================================================*/ void permutmodel2(double **X1, double **X1permute, int *ligL, int *colL) { /*****************************************************************/ /* Fonction qui permute selon le model 2 de la methode du 4e coin*/ /*****************************************************************/ /* permute des lignes */ int i,j,ligL1,colL1; ligL1=*ligL; colL1=*colL; for (j=1; j<=colL1; j++) { for (i=1; i<=ligL1; i++) { X1permute[i][j]=X1[i][j]; } } aleapermutmat (X1permute); } /*=====================================================================*/ void permutmodel5(double **X1, double **X1permute, int *ligL, int *colL) { /*****************************************************************/ /* Fonction qui permute selon le model 5 (new)*/ /*****************************************************************/ /* permute des lignes puis des colonnes*/ int i,j,ligL1,colL1; double **X1transposee; ligL1=*ligL; colL1=*colL; taballoc(&X1transposee,colL1,ligL1); for (j=1; j<=colL1; j++) { for (i=1; i<=ligL1; i++) { X1permute[i][j]=X1[i][j]; } } aleapermutmat (X1permute); /* perm lignes */ /* Transposee de X1permute */ for (i=1; i<=ligL1; i++) { for (j=1; j<=colL1; j++) { X1transposee[j][i]=X1permute[i][j]; } } aleapermutmat (X1transposee); /* perm colonnes */ //Retransposons la matrice for (j=1; j<=colL1; j++) { for (i=1; i<=ligL1; i++) { X1permute[i][j]=X1transposee[j][i]; } } freetab(X1transposee); } ade4/src/adesub.h0000644000176200001440000000434312576021756013311 0ustar liggesusers#include #include #include #include #include int dtodelta (double **data, double *pl); void initvec (double *v1, double r); double alea (void); void aleapermutvec (double *a); void aleapermutmat (double **a); void aleapermutmat (double **a); void aleapermutvec (double *a); void DiagobgComp (int n0, double **w, double *d, int *rang); void freeinttab (int **tab); void freeintvec (int *vec); void freetab (double **tab); void freevec (double *vec); void getpermutation (int *numero, int repet); void matcentrage (double **A, double *poili, int typ); void matcentragehi (double **tab, double *poili, int *index, int *assign); void matmodifcm (double **tab, double *poili); void matmodifcn (double **tab, double *poili); void matmodifcp (double **tab, double *poili); void matmodifcs (double **tab, double *poili); void matmodiffc (double **tab, double *poili); void matpermut (double **A, int *num, double **B); double maxvec (double *vec); void prodmatAAtB (double **a, double **b); void prodmatABC (double **a, double **b, double **c); void prodmatAdBC (double **a, double *d, double **b, double **c); void prodmatAtAB (double **a, double **b); void prodmatAtBC (double **a, double **b, double **c); void prodmatAtBrandomC (double **a, double **b, double **c, int*permut); double traceXtdLXq (double **X, double **L, double *d, double *q); void sqrvec (double *v1); void taballoc (double ***tab, int l1, int c1); void tabintalloc (int ***tab, int l1, int c1); void trild (double *x , int *num, int gauche, int droite); void trildintswap (int *v, int i, int j); void trildswap (double *v, int i, int j); void trirap (double *x , int *num); void trirapideint (int *x , int *num, int gauche, int droite); void trirapideintswap (int *v, int i, int j); void vecalloc (double **vec, int n); void vecintalloc (int **vec, int n); void vecpermut (double *A, int *num, double *B); void permutmodel1(double **X1,double **X1permute,int *ligL,int *colL); void permutmodel2(double **X1,double **X1permute,int *ligL,int *colL); void permutmodel3(double **X1,double **X1permute,int *ligL,int *colL); void permutmodel4(double **X1,double **X1permute,int *ligL,int *colL); void permutmodel5(double **X1,double **X1permute,int *ligL,int *colL); ade4/src/divsub.h0000644000176200001440000000170212576021756013336 0ustar liggesusers#include #include #include #include #include "adesub.h" void popweighting(int **b, int *som, double *res); void popsum(int **b, int *res); void newsamples(int **b, int *vstru, int **res); void alphadiv(double **a, int **b, int *som, double *res); void sums(double **a, int **b, int **c, int *som, double *sst, int *prindicstr, double *res); int maxvecint (int *vec); void means(double *psse, double *pdf, double *res); void nvalues(int **b, int **c, int *som, double *pdf, int *prindicstr, double *res); void repintvec(int *vecp, int *vecd, int *res); void repdvecint(int *vecp, int nbd, int *res); void sigmas(double *pms, double *pn, double *res); void getinttable(int *vp, int *vd, int **res); void unduplicint(int *vecp, int *res); void vpintunduplicvdint(int *vecp, int *vecd, int *res); void changeintlevels(int *vecp, int *res); void getneworder(int *vecp, int *res); void vecintpermut (int *A, int *num, int *B); ade4/src/testdim.c0000644000176200001440000001531412576021756013512 0ustar liggesusers#include #include #include #include #include #include #include #include #include #include #include #include #include #include "adesub.h" /* Test of Dimensionality (Dray, CSDA, 2007) */ int svd(double **X, double **vecU, double **vecVt, double *vecD); int svdd(double **X,double *vecD); void recX(double **Xi, double **XU, double **XVt, double *D, int i); double denum(double *vec, int i, int ncol); void testdimRVpca (int *ok, double *tabXR, int *nrow, int *ncol, int *nrepet, int *nbaxtest, double *sim1, double *obs1); /*================================================================= */ void testdimRVpca (int *ok, double *tabXR, int *nrow, int *ncol, int *nrepet, int *nbaxtest, double *sim1, double *obs1) { /* RV */ /* one test for each axis (RVDIM2) */ double **X, **result1, **XU, **XV, *D, **Xperm; double **Xi, **Riperm, **Ri, *Dperm; int nr,nc,nb,i,j,k,rankX, toto; nr = *nrow; nc = *ncol; nb = nc; if(nrrankX) nbaxtest[0]=rankX; taballoc (&result1, *nrepet, *nbaxtest); for(i=1;i<=*nbaxtest;i++) { recX(Xi,XU,XV,D,i); obs1[i-1]=pow(D[i],2)/denum(D,i,rankX); /*RV*/ for(k=1;k<=*nrepet;k++){ for(j=1;j<=nb;j++) Dperm[j]=0; permutmodel1(Ri,Riperm,&nr,&nc); toto=svdd(Riperm,Dperm); if(toto < 0) ok[0] = -1; result1[k][i]=pow(Dperm[1],2)/denum(Dperm,1,toto); } for(j=1;j<=nr;j++){ for(k=1;k<=nc;k++){ Ri[j][k]=Ri[j][k]-Xi[j][k]; } } } /* return values to R */ k = 0; for (i=1; i<=*nrepet; i++) { for (j=1; j<=*nbaxtest; j++) { sim1[k]= result1[i][j]; k = k + 1; } } freetab(X); freetab(Xperm); freetab(XU); freetab(XV); freevec(D); freetab(result1); freetab(Xi); freetab(Riperm); freetab(Ri); freevec(Dperm); } /*================================================================= */ /* renvoie ui*di*t(vi) dans Xi*/ void recX(double **Xi, double **XU, double **XV, double *D, int i){ int k,j,nr,nc; nr=(int)Xi[0][0]; nc=(int)Xi[1][0]; for(k=1;k<=nr;k++){ for(j=1;j<=nc;j++){ Xi[k][j]=D[i]* XU[k][i]* XV[j][i]; } } } /*================================================================= */ /* svd d'une matrice , renvoie le rang de X, U, D et t(V) */ /*DGESVD( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT, $ WORK, LWORK, INFO ) */ int svd(double **X, double **vecU, double **vecVt, double *vecD) { int i,j, k,error,nr,nc,lwork,nbax,rankX,ldvt; char jobu='S',jobvt='A'; double *A,*U, *D, *V; double work1,*work; nr=(int)X[0][0]; nc=(int)X[1][0]; nbax=nc; ldvt=nc; if (nr0.5) lwork++; work=(double *)calloc((size_t)lwork,sizeof(double)); /* actual call */ F77_NAME(dgesvd)(&jobu, &jobvt,&nr, &nc,A, &nr, D,U,&nr,V,&ldvt,work, &lwork,&error); free(work); if (error) { Rprintf("error in svd: %d\n", error); return(-1); } i = 0; rankX=0; for ( j = 1; j <= nbax; j++) { for (k = 1; k <= nr; k++) { vecU[k][j] = U[i]; i++; } vecD[j]=D[j-1]; if (D[j-1]/D[0]>0.00000000001) rankX=rankX+1; } i = 0; for (k = 1; k <= nc; k++) { for ( j = 1; j <= nbax; j++){ vecVt[k][j] = V[i]; i++; } } free(A); free(D); free(U); free(V); return(rankX); } /* ============================= */ /*================================================================= */ /* svd d'une matrice , renvoie le rang de X et D */ /*DGESVD( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT, $ WORK, LWORK, INFO ) renvoie seulement les valeurs singulieres, pas les vecteurs -> plus rapide */ int svdd(double **X, double *vecD) { int i,j, k,error,nr,nc,lwork,nbax,rankX,ldvt; char jobu='N',jobvt='N'; double *A,*U,*D,*V; double work1,*work; nr=(int)X[0][0]; nc=(int)X[1][0]; nbax=nc; ldvt=nc; if (nr0.5) lwork++; work=(double *)calloc((size_t)lwork,sizeof(double)); /* actual call */ F77_NAME(dgesvd)(&jobu, &jobvt,&nr, &nc,A, &nr, D,U,&nr,V,&ldvt,work, &lwork,&error); free(work); if (error) { Rprintf("error in svd: %d\n", error); return(-1); } rankX=0; for ( j = 1; j <= nbax; j++) { vecD[j]=D[j-1]; if (D[j-1]/D[0]>0.00000000001) rankX=rankX+1; } free(A); free(D); free(U); free(V); return(rankX); } /* ============================= */ double denum(double *vec, int i, int ncol){ int j; double tot=0; for(j=i;j<=ncol;j++){ tot=tot+pow(vec[j],4); } tot=sqrt(tot); return(tot); } ade4/src/tests.c0000644000176200001440000006067612600021415013172 0ustar liggesusers#include #include #include #include #include "adesub.h" double betweenvar (double **tab, double *pl, double *indica); double inerbetween (double *pl, double *pc, int moda, double *indica, double **tab); void testdiscrimin(int *npermut,double *rank,double *pl1,int *npl,double *indica1,int *nindica,double *tab1, int *il1, int *ic1,double *inersim); void testertrace (int *npermut,double *pc1r, double *pc2r, double *tab1r, int *l1r, int *c1r,double *tab2r, int *c2r,double *inersimul); void testertracenu (int *npermut,double *pc1r, double *pc2r, double *plr, double *tab1r, int *l1r, int *c1r,double *tab2r, int *c2r,double *tabinit1r,double *tabinit2r, int *typ1r, int *typ2r,double *inersimul); void testertracenubis ( int *npermut,double *pc1r, double *pc2r, double *plr, double *tab1r, int *l1r, int *c1r,double *tab2r, int *c2r,double *tabinit1r,double *tabinit2r, int *typ1r, int *typ2r, int *ntabr,double *inersimul); void testinter( int *npermut,double *pl1,int *npl,double *pc1,int *npc,int *moda1,double *indica1,int *nindica,double *tab1, int *l1, int *c1,double *inersim); void testmantel(int *npermut1,int *lig1,double *init11,double *init21,double *inersim); void testprocuste(int *npermut1,int *lig1,int *c11,int *c21,double *init11,double *init21,double *inersim); void testmultispati (int *npermut, int *lig1, int *col1, double *tab, double *mat, double *lw, double *cw, double *inersim) ; void testdistRV(int *npermut1,int *lig1,double *init11,double *init21,double *RV); void MSTgraph (double *distances, int *nlig, int *ngmax, double *voisi); /**************************/ void MSTgraph (double *distances, int *nlig, int *ngmax, double *voisi) { int N, NITP, KP, i, k, j, lig; double **DM, **voisiloc, *UI, CST, D, UK; double a0; int **MST, *JI, *NIT, IMST, NI, numg, numgmax; double borne = 1.0e20; lig = N = *nlig; numgmax=*ngmax; taballoc (&DM, N, N); taballoc (&voisiloc, N, N); tabintalloc (&MST, 2, N); vecalloc (&UI, N); vecintalloc (&JI, N); vecintalloc (&NIT, N); k = 0; for (i=1; i<=lig; i++) { for (j=1; j<=lig; j++) { DM[i][j] = distances[k]; k = k + 1; } } for (i=1; i<=N; i++) DM[i][i] = borne; for (numg=1; numg<=numgmax; numg++) { /* Algorithm 422, Kevin & Whitney Comm. ACM 15, 273, 1972 */ CST = 0.; NITP = N -1; KP = N; IMST = 0; for (i=1; i<=NITP; i++) { NIT[i] = i; UI[i] = DM [i][KP]; JI[i] = KP; } while (NITP > 0) { for (i=1; i<=NITP; i++) { NI = NIT[i]; D = DM[NI][KP]; if (UI[i]>D) { UI[i] = D; JI[i] = KP; } } UK = UI[1]; for (i=1; i<=NITP; i++) { if (UI[i]<=UK) { UK = UI[i]; k = i; } } IMST = IMST + 1; MST[1][IMST] = NIT[k]; MST[2][IMST] = JI[k]; CST = CST + UK; KP = NIT[k]; UI[k]=UI[NITP]; NIT[k] = NIT[NITP]; JI[k]=JI[NITP]; NITP = NITP - 1; } for (i=1; i<=IMST; i++) { voisiloc [MST[1][i]] [MST[2][i]] = numg; voisiloc [MST[2][i]] [MST[1][i]] = numg; DM [MST[1][i]] [MST[2][i]] = borne; DM [MST[2][i]] [MST[1][i]] = borne; } } for (i=1; i<=lig; i++) { for (j=1; j<=lig; j++) { a0 = voisiloc [i][j]; if ( (a0>0) && (a0<=numgmax) ){ voisiloc [i][j] = 1; } else voisiloc [i][j] = 0; } } k = 0; for (i=1; i<=lig; i++) { for (j=1; j<=lig; j++) { voisi[k]=voisiloc[i][j]; k = k + 1; } } freetab (DM); freetab (voisiloc); freeinttab (MST); freevec (UI); freeintvec (JI); freeintvec (NIT); } /*********************************************/ void testdistRV(int *npermut1,int *lig1,double *init11,double *init21,double *RV) { /* Declarations de variables C locales */ int i, j, k, lig, i0, j0, npermut, *numero, isel; double **m1, **m2, *pl; double trace, trace0, car1, car2, a0; /* Allocation memoire pour les variables C locales */ npermut = *npermut1; lig = *lig1; taballoc(&m1, lig, lig); taballoc(&m2, lig, lig); vecintalloc (&numero, lig); vecalloc (&pl, lig); /* On recopie les objets R dans les variables C locales */ k = 0; for (i=1; i<=lig; i++) { for (j=1; j<=lig; j++) { m1[i][j] = init11[k]; k = k + 1; } } k = 0; for (i=1; i<=lig; i++) { for (j=1; j<=lig; j++) { m2[i][j] = init21[k]; k = k + 1; } } /* m1 et m2 sont des matrices de distances simples */ initvec(pl, 1.0/(double)lig); dtodelta (m1, pl); dtodelta (m2,pl); car1 = 0; trace=0; car2 = 0; for (i=1; i<=lig; i++) { for (j=1; j<=lig; j++) { car1 = car1 + m1[i][j]*m1[i][j]; trace = trace + m1[i][j]*m2[i][j]; car2 = car2 + m2[i][j]*m2[i][j]; } } car1 = sqrt ( (double) car1); car2 = sqrt ( (double) car2); a0 = trace/car1/car2; if (a0<-1) a0 = -1; if (a0>1) a0 = 1; RV[0] = a0; for (isel=1; isel<=npermut; isel++) { getpermutation (numero, isel); trace0=0; for (i=1; i<=lig; i++) { i0 = numero[i]; for (j=1; j<=lig; j++) { j0 = numero[j]; trace0 = trace0 + m1[i][j]*m2[i0][j0]; } } a0 = trace0/car1/car2; if (a0<-1) a0 = -1; if (a0>1) a0 = 1; RV[isel] = a0; } freevec(pl); freeintvec(numero); freetab (m1); freetab (m2); } /*********************************************/ /* On commence par une première version ou l'on importe la liste listw sous forme matricielle. On pourrait suivre la logique de Bivand qui est plus judicieuse, surtout quand les matrices L on beaucoup de 0. Il travaille avec des listes et calcul le produit L%*%X par la fonction lagw.c. */ void testmultispati (int *npermut, int *lig1, int *col1, double *tab, double *mat, double *lw, double *cw, double *inersim) { /* Declarations de variables C locales */ int i, j, k, lig, col, nper, *numero; double **X, **L, **Xperm; double *d, *q, *dperm; /* Allocation memoire pour les variables C locales */ nper = *npermut; lig = *lig1; col= *col1; taballoc(&X, lig, col); taballoc(&L, lig, lig); taballoc(&Xperm, lig, col); vecintalloc (&numero, lig); vecalloc(&dperm, lig); vecalloc(&d, lig); vecalloc(&q, col); /* On recopie les objets R dans les variables C locales */ k = 0; for (j=1; j<=col; j++) { for (i=1; i<=lig; i++) { X[i][j] = tab[k]; k = k + 1; } } k = 0; for (i=1; i<=lig; i++) { for (j=1; j<=lig; j++) { L[j][i] = mat[k]; k = k + 1; } } k=0; for (i=1; i<=lig; i++) { d[i]=lw[k]; k = k + 1; } k=0; for (i=1; i<=col; i++) { q[i]=cw[k]; k = k + 1; } /* On calcul la valeur observée */ inersim[0]=traceXtdLXq(X, L, d, q); /* On calcul les valeurs pour chaque simulation */ for (j=1; j<=nper; j++) { getpermutation(numero, j); matpermut(X, numero ,Xperm); vecpermut(d, numero, dperm); inersim[j]=traceXtdLXq(Xperm, L, dperm, q); } /* Libération des réservations locales */ freetab(X); freetab(L); freetab(Xperm); freeintvec(numero); freevec(dperm); freevec(d); freevec(q); } /*********************************************/ void testmantel(int *npermut1, int *lig1, double *init11, double *init21, double *inersim) { /* Declarations de variables C locales */ int i, j, k, lig, i0, j0, npermut, *numero, isel; double **m1, **m2; double trace, trace0, moy1, moy2, car1, car2, a0; /* Allocation memoire pour les variables C locales */ npermut = *npermut1; lig = *lig1; taballoc(&m1, lig, lig); taballoc(&m2, lig, lig); vecintalloc (&numero, lig); /* On recopie les objets R dans les variables C locales */ k = 0; for (i=1; i<=lig; i++) { for (j=1; j<=lig; j++) { m1[i][j] = init11[k]; k = k + 1; } } k = 0; for (i=1; i<=lig; i++) { for (j=1; j<=lig; j++) { m2[i][j] = init21[k]; k = k + 1; } } trace=0; moy1 = 0; moy2=0; car1 = 0; car2 = 0; for (i=1; i<=lig; i++) { for (j=1; j<=lig; j++) { trace = trace + m1[i][j]*m2[i][j]; if (j>i) { moy1 = moy1 + m1[i][j]; moy2 = moy2 + m2[i][j]; car1 = car1 + m1[i][j]*m1[i][j]; car2 = car2 + m2[i][j]*m2[i][j]; } } } trace = trace/2; a0 = trace - moy1*moy2*2/lig/(lig-1); a0 = a0/ sqrt ( (double) (car1 - moy1*moy1*2/lig/(lig-1)) ); a0 = a0/ sqrt ( (double) (car2 - moy2*moy2*2/lig/(lig-1)) ); trace = a0; inersim[0] = a0; for (isel=1; isel<=npermut; isel++) { getpermutation (numero, isel); trace0=0; for (i=1; i<=lig; i++) { i0 = numero[i]; for (j=1; j<=lig; j++) { j0 = numero[j]; trace0 = trace0 + m1[i][j]*m2[i0][j0]; } } trace0 = trace0/2; a0 = trace0 - moy1*moy2*2/lig/(lig-1); a0 = a0/ sqrt ( (double) (car1 - moy1*moy1*2/lig/(lig-1)) ); a0 = a0/ sqrt ( (double) (car2 - moy2*moy2*2/lig/(lig-1)) ); inersim[isel] = a0; } freetab(m1); freetab(m2); freeintvec(numero); } /*********************************************/ void testprocuste( int *npermut1, int *lig1, int *c11, int *c21, double *init11, double *init21, double *inersim) { /* Declarations de variables C locales */ int i, j, k, lig, c1, c2, npermut, rang, *numero; double **tabperm, **init1, **init2, tinit, tsim; double **cov, **w, *valpro, *tvecsim; /* Allocation memoire pour les variables C locales */ npermut = *npermut1; lig = *lig1; c1 = *c11; c2 = *c21; /* if (c1<=c2) { taballoc(&tabperm, lig, c1); taballoc(&init1, lig, c1); taballoc(&init2, lig, c2); } else { taballoc(&tabperm, lig, c2); taballoc(&init1, lig, c2); taballoc(&init2, lig, c1); res=c1; c1=c2; c2=res; } */ taballoc(&tabperm, lig, c1); taballoc(&init1, lig, c1); taballoc(&init2, lig, c2); taballoc(&cov, c1, c2); taballoc(&w, c1, c1); vecalloc(&valpro,c1); vecintalloc (&numero, lig); vecalloc(&tvecsim, npermut); /* On recopie les objets R dans les variables C locales */ k = 0; for (i=1; i<=lig; i++) { for (j=1; j<=c1; j++) { init1[i][j] = init11[k]; k = k + 1; } } k = 0; for (i=1; i<=lig; i++) { for (j=1; j<=c2; j++) { init2[i][j] = init21[k]; k = k + 1; } } /* Calculs */ tinit = 0; prodmatAtBC (init1, init2, cov); prodmatAAtB (cov,w); DiagobgComp(c1, w, valpro, &rang); for (i=1;i<=rang;i++) { tinit=tinit+sqrt(valpro[i]); } for (k=1; k<=npermut; k++) { getpermutation (numero,k); matpermut (init1, numero, tabperm); prodmatAtBC (tabperm, init2, cov); prodmatAAtB (cov,w); DiagobgComp(c1, w, valpro, &rang); tsim=0; for (i=1;i<=rang;i++) { tsim=tsim+sqrt(valpro[i]); } tvecsim[k] = tsim; } inersim[0] = tinit; for (k=1; k<=npermut; k++) { inersim[k] = tvecsim[k]; } freetab(tabperm); freetab(cov); freetab(init1); freetab(init2); freetab(w); freevec(tvecsim); freevec(valpro); freeintvec(numero); } /*********************************************/ void testdiscrimin( int *npermut, double *rank, double *pl1, int *npl, double *indica1, int *nindica, double *tab1, int *il1, int *ic1, double *inersim) { /* Declarations de variables C locales */ int l1, c1; double **tab, **tabp, *pl, *plp, *indica, rang; int i, j, k, *numero; /* Allocation memoire pour les variables C locales */ l1 = *il1; c1 = *ic1; rang = *rank; vecalloc (&pl, *npl); vecalloc (&plp, *npl); vecalloc (&indica, *nindica); taballoc (&tab, l1, c1); taballoc (&tabp, l1, c1); vecintalloc(&numero, l1); /* On recopie les objets R dans les variables C locales */ k = 0; for (i=1; i<=l1; i++) { for (j=1; j<=c1; j++) { tab[i][j] = tab1[k]; k = k + 1; } } for (i=1; i<=*npl; i++) { pl[i] = pl1[i-1]; } for (i=1; i<=*nindica; i++) { indica[i] = indica1[i-1]; } /* Calculs inertie initiale est stockee dans le premier element du vecteur des simulations */ inersim[0] = betweenvar(tab, pl, indica)/rang; for (k=1; k<=*npermut; k++) { getpermutation (numero, k); matpermut (tab, numero, tabp); vecpermut (pl, numero, plp); inersim[k] = betweenvar (tabp, plp, indica)/rang; } freevec (pl); freevec (plp); freevec (indica); freetab (tab); freetab (tabp); freeintvec (numero); } /*********************************************/ double betweenvar (double **tab, double *pl, double *indica) { double *m, s, bvar, *indicaw; int i, j, l1, c1, ncla, icla; l1 = tab[0][0]; c1 = tab[1][0]; ncla = indica[1]; for (i=1;i<=l1;i++) { if (indica[i] > ncla) ncla = indica[i]; } vecalloc(&m, ncla); vecalloc(&indicaw, ncla); bvar = 0; for (j=1;j<=c1;j++) { for (i=1;i<=ncla;i++) { m[i] = 0; indicaw[i] = 0; } for (i=1;i<=l1;i++) { icla = indica[i]; indicaw[icla] = indicaw[icla] + pl[i]; m[icla] = m[icla] + tab[i][j] * pl[i]; } s = 0; for (i=1;i<=ncla;i++) { s = s + m[i] * m[i] / indicaw[i]; } bvar = bvar + s; } freevec(m); freevec(indicaw); return (bvar); } /************************************/ void testinter( int *npermut, double *pl1, int *npl, double *pc1, int *npc, int *moda1, double *indica1, int *nindica, double *tab1, int *l1, int *c1, double *inersim) { /* Declarations de variables C locales */ double **tab, **tabp, *pl, *plp, *pc, *indica; int moda, i, j, k; int *numero; /* Allocation memoire pour les variables C locales */ moda = *moda1; vecalloc (&pl, *npl); vecalloc (&plp, *npl); vecalloc (&pc, *npc); vecalloc (&indica, *nindica); taballoc (&tab, *l1, *c1); taballoc (&tabp, *l1, *c1); vecintalloc(&numero, *l1); /* On recopie les objets R dans les variables C locales */ k = 0; for (i=1; i<=*l1; i++) { for (j=1; j<=*c1; j++) { tab[i][j] = tab1[k]; k = k + 1; } } for (i=1; i<=*npl; i++) { pl[i] = pl1[i-1]; } for (i=1; i<=*npc; i++) { pc[i] = pc1[i-1]; } for (i=1; i<=*nindica; i++) { indica[i] = indica1[i-1]; } /* Calculs inertie initiale est stockee dans le premier element du vecteur des simulations */ inersim[0] = inerbetween (pl, pc, moda, indica, tab); for (k=1; k<=*npermut; k++) { getpermutation (numero,k); matpermut (tab, numero, tabp); vecpermut (pl, numero, plp); inersim[k] = inerbetween (plp, pc, moda, indica, tabp); } freetab(tab); freetab(tabp); freevec(pl); freevec(plp); freevec(pc); freevec(indica); freeintvec(numero); } /************************************/ double inerbetween (double *pl, double *pc, int moda, double *indica, double **tab) { int i, j, k, l1, rang; double poi, inerb, a0, a1, s1; double **moy; double *pcla; l1 = tab[0][0]; rang = tab[1][0]; taballoc (&moy, moda, rang); vecalloc (&pcla, moda); for (i=1;i<=l1;i++) { k = (int) indica[i]; poi = pl[i]; pcla[k]=pcla[k]+poi; } for (i=1;i<=l1;i++) { k = (int) indica[i]; poi = pl[i]; for (j=1;j<=rang;j++) { moy[k][j] = moy[k][j] + tab[i][j]*poi; } } for (k=1;k<=moda;k++) { a0 = pcla[k]; for (j=1;j<=rang;j++) { moy[k][j] = moy[k][j]/a0; } } inerb = 0; for (i=1;i<=moda;i++) { a1 = pcla[i]; for (j=1;j<=rang;j++) { s1 = moy[i][j]; inerb = inerb + s1 * s1 *a1 * pc[j]; } } freetab (moy); freevec (pcla); return inerb; } /*****************/ void testertrace ( int *npermut, double *pc1r, double *pc2r, double *tab1r, int *l1r, int *c1r, double *tab2r, int *c2r, double *inersimul) { /* Declarations des variables C locales */ double **X1, **X2, *pc1, *pc2, **cov; int i, j, k, l1, c1, c2; double poi, inertot, s1, inersim; int *numero; /* On recopie les objets R dans les variables C locales */ l1 = *l1r; c1 = *c1r; c2 = *c2r; /* Allocation memoire pour les variables C locales */ vecalloc (&pc1, c1); vecalloc (&pc2, c2); vecintalloc(&numero, l1); taballoc (&X1, l1, c1); taballoc (&X2, l1, c2); taballoc(&cov, c2, c1); /* On recopie les objets R dans les variables C locales */ k = 0; for (i=1; i<=l1; i++) { for (j=1; j<=c1; j++) { X1[i][j] = tab1r[k]; k = k + 1; } } k = 0; for (i=1; i<=l1; i++) { for (j=1; j<=c2; j++) { X2[i][j] = tab2r[k]; k = k + 1; } } for (i=1; i<=c1; i++) { pc1[i] = pc1r[i-1]; } for (i=1; i<=c2; i++) { pc2[i] = pc2r[i-1]; } /* Calculs */ for (j=1;j<=c1;j++) { poi = sqrt(pc1[j]); for (i=1; i<=l1;i++) { X1[i][j]=X1[i][j]*poi; } } for (j=1;j<=c2;j++) { poi = sqrt(pc2[j]); for (i=1; i<=l1;i++) { X2[i][j]=X2[i][j]*poi; } } prodmatAtBC (X2, X1, cov); inertot = 0; for (i=1;i<=c2;i++) { for (j=1;j<=c1;j++) { s1 = cov[i][j]; inertot = inertot + s1 * s1; } } inertot = inertot / l1 / l1; inersimul[0] = inertot; for (k=1; k<=*npermut; k++) { getpermutation (numero,k); prodmatAtBrandomC (X2, X1, cov, numero); inersim = 0; for (i=1;i<=c2;i++) { for (j=1;j<=c1;j++) { s1 = cov[i][j]; inersim = inersim + s1 * s1; } } inersimul[k] = inersim / l1 / l1; } freevec (pc1); freevec (pc2); freeintvec (numero); freetab (X1); freetab (X2); freetab (cov); } /*****************/ void testertracenu ( int *npermut, double *pc1r, double *pc2r, double *plr, double *tab1r, int *l1r, int *c1r, double *tab2r, int *c2r, double *tabinit1r, double *tabinit2r, int *typ1r, int *typ2r, double *inersimul) { /* Declarations des variables C locales */ double **X1, **X2, **init1, **init2, *pc1, *pc2, *pl, **cov; int i, j, k, l1, c1, c2; double poi, inertot, s1, inersim, a1; int *numero1, *numero2; int typ1,typ2; /* On recopie les objets R dans les variables C locales */ l1 = *l1r; c1 = *c1r; c2 = *c2r; typ1 = *typ1r; typ2 = *typ2r; /* Allocation memoire pour les variables C locales */ vecalloc (&pc1, c1); vecalloc (&pc2, c2); vecalloc (&pl, l1); vecintalloc (&numero1, l1); vecintalloc (&numero2, l1); taballoc (&X1, l1, c1); taballoc (&X2, l1, c2); taballoc (&init1, l1, c1); taballoc (&init2, l1, c2); taballoc (&cov, c2, c1); /* On recopie les objets R dans les variables C locales */ k = 0; for (i=1; i<=l1; i++) { for (j=1; j<=c1; j++) { init1[i][j] = tab1r[k]; k = k + 1; } } k = 0; for (i=1; i<=l1; i++) { for (j=1; j<=c2; j++) { init2[i][j] = tab2r[k]; k = k + 1; } } for (i=1; i<=c1; i++) { pc1[i] = pc1r[i-1]; } for (i=1; i<=c2; i++) { pc2[i] = pc2r[i-1]; } for (i=1; i<=l1; i++) { pl[i] = plr[i-1]; } /* Calculs */ inertot = 0; for (i=1; i<=l1;i++) { poi = pl[i]; for (j=1;j<=c1;j++) { init1[i][j]=init1[i][j]*poi; } } prodmatAtBC (init2, init1, cov); for (i=1;i<=c2;i++) { a1 = pc2[i]; for (j=1;j<=c1;j++) { s1 = cov[i][j]; inertot = inertot + s1 * s1 * a1 * pc1[j]; } } inersimul[0] = inertot; k = 0; for (i=1; i<=l1; i++) { for (j=1; j<=c1; j++) { init1[i][j] = tabinit1r[k]; k = k + 1; } } k = 0; for (i=1; i<=l1; i++) { for (j=1; j<=c2; j++) { init2[i][j] = tabinit2r[k]; k = k + 1; } } for (k=1; k<=*npermut; k++) { getpermutation (numero1,k); getpermutation (numero2,2*k); matpermut (init1, numero1, X1); matpermut (init2, numero2, X2); /* calcul de poids colonnes dans le cas d'une acm*/ if (typ1 == 2) { for(j=1;j<=c1;j++){ pc1[j]=0; } for(i=1;i<=l1;i++){ for(j=1;j<=c1;j++){ pc1[j]=pc1[j]+X1[i][j]*pl[i]; } } } if (typ2 == 2) { for(j=1;j<=c2;j++){ pc2[j]=0; } for(i=1;i<=l1;i++){ for(j=1;j<=c2;j++){ pc2[j]=pc2[j]+X2[i][j]*pl[i]; } } } matcentrage (X1, pl, typ1); matcentrage (X2, pl, typ2); for (i=1; i<=l1;i++) { poi = pl[i]; for (j=1;j<=c1;j++) { X1[i][j]=X1[i][j]*poi; } } prodmatAtBC (X2, X1, cov); inersim = 0; for (i=1;i<=c2;i++) { a1 = pc2[i]; for (j=1;j<=c1;j++) { s1 = cov[i][j]; inersim = inersim + s1 * s1 * a1 * pc1[j]; } } inersimul[k] = inersim; } freevec (pc1); freevec (pc2); freevec (pl); freeintvec (numero1); freeintvec (numero2); freetab (X1); freetab (X2); freetab (init1); freetab (init2); freetab (cov); } /*****************/ void testertracenubis ( int *npermut, double *pc1r, double *pc2r, double *plr, double *tab1r, int *l1r, int *c1r, double *tab2r, int *c2r, double *tabinit1r, double *tabinit2r, int *typ1r, int *typ2r, int *ntabr, double *inersimul) { /* Declarations des variables C locales */ double **X1, **X2, **init1, **init2, *pc1, *pc2, *pl, **cov; int i, j, k, l1, c1, c2; double poi, inertot, s1, inersim, a1; int *numero1, *numero2, ntab; int typ1, typ2; /* On recopie les objets R dans les variables C locales */ l1 = *l1r; c1 = *c1r; c2 = *c2r; ntab = *ntabr; typ1 = *typ1r; typ2 = *typ2r; /* Allocation memoire pour les variables C locales */ vecalloc (&pc1, c1); vecalloc (&pc2, c2); vecalloc (&pl, l1); vecintalloc (&numero1, l1); vecintalloc (&numero2, l1); taballoc (&X1, l1, c1); taballoc (&X2, l1, c2); taballoc (&init1, l1, c1); taballoc (&init2, l1, c2); taballoc (&cov, c2, c1); /* On recopie les objets R dans les variables C locales */ k = 0; for (i=1; i<=l1; i++) { for (j=1; j<=c1; j++) { init1[i][j] = tab1r[k]; k = k + 1; } } k = 0; for (i=1; i<=l1; i++) { for (j=1; j<=c2; j++) { init2[i][j] = tab2r[k]; k = k + 1; } } for (i=1; i<=c1; i++) { pc1[i] = pc1r[i-1]; } for (i=1; i<=c2; i++) { pc2[i] = pc2r[i-1]; } for (i=1; i<=l1; i++) { pl[i] = plr[i-1]; } inertot = 0; for (i=1; i<=l1;i++) { poi = pl[i]; for (j=1;j<=c1;j++) { init1[i][j]=init1[i][j]*poi; } } prodmatAtBC (init2, init1, cov); for (i=1;i<=c2;i++) { a1 = pc2[i]; for (j=1;j<=c1;j++) { s1 = cov[i][j]; inertot = inertot + s1 * s1 * a1 * pc1[j]; } } inersimul[0] = inertot; k = 0; for (i=1; i<=l1; i++) { for (j=1; j<=c1; j++) { X1[i][j] = tab1r[k]; k = k + 1; } } for (i=1; i<=l1;i++) { poi = pl[i]; for (j=1;j<=c1;j++) { X1[i][j]=X1[i][j]*poi; } } k = 0; for (i=1; i<=l1; i++) { for (j=1; j<=c2; j++) { X2[i][j] = tab2r[k]; k = k + 1; } } for (i=1; i<=l1;i++) { poi = pl[i]; for (j=1;j<=c2;j++) { X2[i][j]=X2[i][j]*poi; } } if (ntab == 1) { k = 0; for (i=1; i<=l1; i++) { for (j=1; j<=c2; j++) { init2[i][j] = tabinit2r[k]; k = k + 1; } } } else { k = 0; for (i=1; i<=l1; i++) { for (j=1; j<=c1; j++) { init1[i][j] = tabinit1r[k]; k = k + 1; } } } for (k=1; k<=*npermut; k++) { if (ntab == 1) { getpermutation (numero2,k); matpermut (init2, numero2, X2); /* Recompute column weights for an acm*/ if (typ2 == 2) { for(j=1;j<=c2;j++){ pc2[j]=0; } for(i=1;i<=l1;i++){ for(j=1;j<=c2;j++){ pc2[j]=pc2[j]+X2[i][j]*pl[i]; } } } matcentrage (X2, pl, typ2); } else { getpermutation (numero1,k); matpermut (init1, numero1, X1); /* poids colonne recalculé si acm*/ if (typ1 == 2) { for(j=1;j<=c1;j++){ pc1[j]=0; } for(i=1;i<=l1;i++){ for(j=1;j<=c1;j++){ pc1[j]=pc1[j]+X1[i][j]*pl[i]; } } } matcentrage (X1, pl, typ1); } prodmatAtBC (X2, X1, cov); inersim = 0; for (i=1;i<=c2;i++) { a1 = pc2[i]; for (j=1;j<=c1;j++) { s1 = cov[i][j]; inersim = inersim + s1 * s1 * a1 * pc1[j]; } } inersimul[k] = inersim; } freevec (pc1); freevec (pc2); freevec (pl); freeintvec (numero1); freeintvec (numero2); freetab (X1); freetab (X2); freetab (init1); freetab (init2); freetab (cov); } ade4/src/divsub.c0000644000176200001440000004067412576021756013344 0ustar liggesusers#include #include #include #include #include "adesub.h" #include "divsub.h" /***************************************************************/ void popweighting(int **b, int *som, double *res) /*-------------------------------------------------- * Calcule les poids des samples muij * b est le tableau samples * som est la somme des termes de b * res est le vecteur ou on doit mettre les poids * les poids sont en frequences --------------------------------------------------*/ { int i, j, lig, col; lig = b[0][0]; col = b[1][0]; for(j = 1; j <= col; j++){ res[j] = 0; for(i = 1; i <= lig; i++){ res[j] = (double) b[i][j] / (double) som[0] + res[j]; } } } /***************************************************************/ void popsum(int **b, int *res) /*-------------------------------------------------- * Calcule les effectifs des samples * b est le tableau samples * res est le vecteur ou on doit mettre les effectifs --------------------------------------------------*/ { int i, j, lig, col; lig = b[0][0]; col = b[1][0]; for(j = 1; j <= col; j++){ res[j] = 0; for(i = 1; i <= lig; i++){ res[j] = (double) b[i][j] + res[j] ; } } } /***************************************************************/ void newsamples(int **b, int *vstru, int **res) /*-------------------------------------------------- * Recalcule la matrice samples pour un niveau hirarchique suprieur * b est le tableau samples et c est le tableau structures --------------------------------------------------*/ { int i, j, interm, col, lig; col = b[1][0]; lig = b[0][0]; for(i = 1; i <= lig; i++){ for(j = 1; j <= col; j++){ interm = vstru[j]; res[i][interm] = res[i][interm] + (double) b[i][j]; } } } /***************************************************************/ void alphadiv(double **a, int **b, int *som, double *res) /*-------------------------------------------------- * Calcule les diversites au sein de chaque sample ou niveau hierarchique superieur * a est le tableau distance et b est le tableau samples, * som est la somme de tous les termes de b, * res contiendra les diversites --------------------------------------------------*/ { double **transi, **transib, *respoids, **bmod; /* bmod va contenir le tableau b mais avec les frequences pour chaque colonne * ie la somme des termes de chaque colonne vaut 1*/ int i, j, cola, colb, ligb; colb = b[1][0]; cola = a[1][0]; ligb = b[0][0]; taballoc(&transi, colb, cola); taballoc(&transib, colb, colb); taballoc(&bmod, ligb, colb); vecalloc(&respoids, colb); popweighting(b, som, respoids); for(i = 1; i <= ligb; i++){ for(j = 1; j <= colb; j++){ bmod[i][j] = (double) b[i][j] / respoids[j] / (double) som[0]; } } prodmatAtBC(bmod, a, transi); prodmatABC(transi, bmod, transib); for(j = 1; j <= colb; j++) { res[j] = transib[j][j]; } /* la diversite est dans la diagonale de transib */ freetab(transi); freetab(transib); freetab(bmod); freevec(respoids); } /***************************************************************/ void sums(double **a, int **b, int **c, int *som, double *sst, int *prindicstr, double *res) /*-------------------------------------------------- * Calcule les sommes des carres des ecarts * les resultats sont donnes de alpha moyen a total --------------------------------------------------*/ { double *resdiva, *respoids, *lesgammas, somdesres; int i, j, l, seuil, colb, ligb, **newb, *stru, newcolb, colc, lenres; colb = b[1][0]; ligb = b[0][0]; colc = c[1][0]; lenres = res[0]; vecalloc(&resdiva, colb); vecalloc(&respoids, colb); vecintalloc(&stru, colb); vecalloc(&lesgammas, colc); /* stru va contenir une des colonnes de la matrice c * resdiva va contenir un vecteur de diversite intra a un des niveau hierarchique */ for(i = 1; i <= colb; i++){ stru[i] = c[i][1]; } newcolb = maxvecint(stru); tabintalloc(&newb, ligb, newcolb); alphadiv(a, b, som, resdiva); popweighting(b, som, respoids); res[1] = 0; for(i = 1; i <= colb; i++){ res[1] = resdiva[i] * respoids[i] * (double) som[0] + res[1]; } if(prindicstr[0] != 0){ for(j = 1; j <= colc; j++){ for(i = 1; i <= ligb; i++){ for(l = 1; l <= newcolb;l++){ newb[i][l] = 0; } } /* il faut reinitialiser la matrice newb */ for(i = 1; i <= colb; i++){ stru[i] = c[i][j]; } newsamples(b, stru, newb); newb[1][0] = maxvecint(stru); alphadiv(a, newb, som, resdiva); popweighting(newb, som, respoids); lesgammas[j] = 0; seuil = newb[1][0]; for(i = 1; i <= seuil; i++){ lesgammas[j] = resdiva[i] * respoids[i] * (double) som[0] + lesgammas[j]; } } for(i = 1; i <= colc; i++){ somdesres = 0; for(j = 1; j <= i; j++){ somdesres = somdesres + res[j]; } res[i + 1] = lesgammas[i] - somdesres; } } seuil = lenres - 1; if(prindicstr[0] != 0){ res[seuil] = sst[0] * (double) som[0] - lesgammas[colc]; } else{ res[seuil] = sst[0] * (double) som[0] - res [1]; } res[lenres] = sst[0] * (double) som[0]; freevec(resdiva); freevec(respoids); freeintvec(stru); freevec(lesgammas); freeinttab(newb); } /***************************************************************/ int maxvecint (int *vec) /*-------------------------------------------------- * calcul le max d'un vecteur d'entier --------------------------------------------------*/ { int i, len, x; x = vec[1]; len = vec[0]; for (i = 1; i <= len; i++) { if (vec[i] > x) x = vec[i]; } return(x); } /***************************************************************/ void means(double *pss, double *pdf, double *res) /*-------------------------------------------------- * Calcule les carres moyen * les resultats sont donnes de alpha moyen a total * pss contient les sommes des carres * pdf contient les degres de liberte --------------------------------------------------*/ { int i, lenpss; lenpss = pss[0]; for(i = 1; i <= lenpss; i++){ res[i] = pss[i] / pdf[i]; } } /***************************************************************/ void nvalues(int **b, int **c, int *som, double *pdf, int *prindicstr, double *res) /*-------------------------------------------------- * Calcule les valeurs n qui permettent de calculer les sigmas * b contient le tableau samples * c contient le tableau structures * som contient la somme totale des elements de samples * pdf contient les degres de liberte --------------------------------------------------*/ { double *np, *nd, interm, *prres, *ddlutil, *ddlutilt; int i, j, k, l, m, colb, colc, ligb, lenpdf, lennp, lennd, lenddlutil, lenddlutild, collessoms, *ddlutild, *prddlutild, *repstrp, *repstrd, *ressoms, **lessoms, *numsamples, *repnumsam, *nbind, *nbindtemp, newcolb, intermint, **newb, *stru; /* sumsamples va contenir les numeros des samples 1 2 etc * repnumsam contient le numero du sample auquel appartient chaque occurence * lessoms contient en ligne les individus ou occurences et en colonne les groupes * en entree il contient les effectifs du groupe auquel appartient une occurence */ colb = b[1][0]; colc = c[1][0]; ligb = b[0][0]; lenpdf = pdf[0]; lenddlutil = lenpdf - 2; if(prindicstr[0] != 0){ collessoms = colc + 2; } else{ collessoms = 2; } lennp = collessoms - 1; vecintalloc(&nbindtemp, colb); vecintalloc(&nbind, som[0]); vecintalloc(&ressoms, colb); tabintalloc(&lessoms, som[0], collessoms); vecintalloc(&numsamples, colb); vecintalloc(&repnumsam, som[0]); vecintalloc(&repstrp, colb); vecintalloc(&repstrd, som[0]); vecalloc(&np, lennp); vecalloc(&ddlutil, lenddlutil); vecalloc(&prres, lennp); vecintalloc(&stru, colb); for(i = 1; i <= colb; i++){ numsamples[i] = i; } for(i = 1; i <= colb; i++){ stru[i] = c[i][1]; } newcolb = maxvecint(stru); tabintalloc(&newb, ligb, newcolb); if(prindicstr[0] != 0){ lennd = 0; for(i = 1; i <= colc; i++){ lennd = lennd + i; } lenddlutild = 0; k = colc + 1; for(i = 1; i <= k; i++){ lenddlutild = lenddlutild + i; } } else{ lennd = 1; lenddlutild = 1; } vecalloc(&nd, lennd); vecintalloc(&ddlutild, lenddlutild); vecalloc(&ddlutilt, lenddlutild); vecintalloc(&prddlutild, lennp); popsum(b, nbindtemp); repintvec(numsamples, nbindtemp, repnumsam); repintvec(nbindtemp, nbindtemp, nbind); for(i = 1; i <= som[0]; i++){ lessoms[i][1] = som[0]; lessoms[i][collessoms] = nbind[i]; } k = lenpdf - 1; for(i = 2; i <= k; i++){ ddlutil[i - 1] = pdf[i]; } if(prindicstr[0] != 0){ for(j = 1; j <= colc; j++){ for(i = 1; i <= ligb; i++){ for(l = 1; l <= newcolb; l++){ newb[i][l] = 0; } } /* il faut reinitialiser la matrice newb */ for(i = 1; i <= colb; i++){ stru[i] = c[i][j]; } newsamples(b, stru, newb); intermint = maxvecint(stru); newb[1][0] = intermint; ressoms[0] = intermint; popsum(newb, ressoms); for(i = 1; i <= colb; i++){ k = stru[i]; repstrp[i] = ressoms[k]; } repintvec(repstrp, nbindtemp, repstrd); for(i = 1; i <= som[0]; i++){ lessoms[i][collessoms - j] = repstrd[i]; } } } for(j = 2; j <= collessoms; j++){ interm = 0; for(i = 1; i <= som[0]; i++){ interm = (double) lessoms[i][j] / (double) lessoms[i][j - 1] + interm; } np[j - 1] = (double) som[0] - interm; } if(prindicstr[0] != 0){ k = 0; for(i = 1; i <= lennp; i++){ k = k + i; prres[i] = k; res[k] = np[lennp - i + 1]; } } else{ for(i = 1; i <= lennp; i++){ res[i] = np[i]; } } if(prindicstr[0] != 0){ l = 1; for(i = 2; i <= colc + 1; i++){ interm = i + 1; for(j = interm; j <= collessoms; j++){ nd[l] = 0; for(k = 1; k <= som[0]; k++){ interm = 1 / (double) lessoms[k][i - 1]; interm = 1 / (double) lessoms[k][i] - interm; nd[l] = (double) lessoms[k][j] * interm + nd[l]; } l = l + 1; } } interm = 0; k = colc + 1; for(i = 1; i <= k; i++){ interm = interm + i; prres[i] = interm; } interm = 1; for(i = 1; i <= colc; i++){ j = prres[i] + 1; k = prres[i + 1] - 1; for(l = j; l <= k; l++){ m = lennd - interm + 1; res[l] = nd[m]; interm = interm + 1; } } for(i = 1; i <= colc + 1; i++){ prddlutild[i] = i; } repintvec(prddlutild, prddlutild, ddlutild); for(i = 1; i <= lenddlutild; i++){ k= ddlutild[i]; ddlutilt[i] = ddlutil[k]; res[i] = res[i] / ddlutilt[i]; } } else{ res[1] = np[1] / ddlutil[1]; } freeintvec(nbindtemp); freeintvec(nbind); freeintvec(ressoms); freeinttab(lessoms); freeintvec(numsamples); freeintvec(repnumsam); freeintvec(repstrp); freeintvec(repstrd); freevec(np); freevec(ddlutil); freevec(prres); freeintvec(stru); freeinttab(newb); freevec(nd); freeintvec(ddlutild); freevec(ddlutilt); freeintvec(prddlutild); } /***************************************************************/ void repintvec(int *vecp, int *vecd, int *res) /*-------------------------------------------------- * correspond a la fonction rep de R avec un vecteur en deuxieme partie * res doit avoir la longueur de la somme des termes de vecd --------------------------------------------------*/ { int i, j, k, lenvecp, indic, seuil; lenvecp = vecp[0]; k = 0; for(i = 1; i <= lenvecp; i++){ seuil = vecd[i]; for(j = 1; j <= seuil; j++){ indic = k + j; res[indic] = vecp[i]; } k = k + seuil; } } /***************************************************************/ void repdvecint(int *vecp, int nbd, int *res) /*-------------------------------------------------- * correspond a la fonction rep de R avec un nombre en deuxieme partie * res doit avoir la longueur de nbd multiplier par la longueur de vecp * sans compter la case 0 --------------------------------------------------*/ { int i, j, k, lenvecp, indic; lenvecp = vecp[0]; k = 0; for(i = 1; i <= nbd; i++){ for(j = 1; j <= lenvecp; j++){ indic = k + j; res[indic] = vecp[j]; } k = k + lenvecp; } } /***************************************************************/ void sigmas(double *pms, double *pn, double *res) /*-------------------------------------------------- * calcule les variances ou covariances de l'amova * pms contient les carres moyens * pn contient les valeurs n --------------------------------------------------*/ { double si; int i, j, k, lenpms, lenindex, *index; lenpms = pms[0]; lenindex = lenpms - 1; vecintalloc(&index, lenindex); res[1] = pms[1]; res[2] = pms[2] / pn[1] - res[1] / pn[1]; if(lenpms >= 3){ k = 2; for(i = 3; i <= lenpms - 1; i++){ si = 0; for(j = 2; j <= i-1; j++){ si = pn[k] * res[j] + si; k = k + 1; } res[i] = pms[i] - res[1] - si; res[i] = res[i] / pn[k]; k = k + 1; } } for(i = 1; i <= lenpms - 1; i++){ res[lenpms] = res[lenpms] + res[i]; } freeintvec(index); } /***************************************************************/ void getinttable(int *vp, int *vd, int **res) /*-------------------------------------------------- * calcule une table a partir de deux facteurs ie des deux vecteurs dont les termes vont de 1 n * les niveaux de vp seront mis en lignes (haplotypes) * les niveaux de vd seront mis en colonnes (samples) --------------------------------------------------*/ { /* attention pour generaliser la fonction, il faudra surement modifier a * pour que les niveaux soient dans le mme ordre qu'au dbut*/ int i, j, k, lig, nivvp, nivvd; lig = vp[0]; nivvp = maxvecint(vp); nivvd = maxvecint(vd); for(i = 1; i <= nivvp; i++){ for(j = 1; j <= nivvd; j++){ res[i][j] = 0; for(k = 1; k <= lig; k++){ if(vp[k] == i && vd[k] == j){ res[i][j] = res[i][j] + 1; } } } } } /***************************************************************/ void unduplicint(int *vecp, int *res) /*-------------------------------------------------- * --------------------------------------------------*/ { int i, j, k, lenvecp, compteur; lenvecp = vecp[0]; k = 1; res[1] = vecp[1]; for(i = 2; i <= lenvecp; i++){ compteur = 0; for(j = 1; j <= k; j++){ if(vecp[i] != res[j]){ compteur = compteur + 1; } } if(compteur == k){ res[k + 1] = vecp[i]; k = k + 1; } } res[0] = k; } /***************************************************************/ void vpintunduplicvdint(int *vecp, int *vecd, int *res) /*-------------------------------------------------- * on prend les termes de vecp tels que vecd ne soit pas dupliqu * cela correspond vecp[!duplicated(vecd)] --------------------------------------------------*/ { int i, j, k, lenvecp, compteur, *resinterm; lenvecp = vecp[0]; vecintalloc (&resinterm, lenvecp); k = 1; resinterm[1] = vecd[1]; res[1] = vecp[1]; for(i = 1; i <= lenvecp; i++){ compteur = 0; for(j = 1; j <= k; j++){ if(vecd[i] != resinterm[j]){ compteur = compteur + 1; } if(compteur == k){ resinterm[k + 1] = vecd[i]; res[k + 1] = vecp[i]; k = k + 1; } } } res[0] = k; freeintvec(resinterm); } /***************************************************************/ void changeintlevels(int *vecp, int *res) /*-------------------------------------------------- * on va numroter les levels de vecp de 1 n --------------------------------------------------*/ { int i, j, k, l, lenvecp, lenundup, *unduplicvecp; vecintalloc (&unduplicvecp, vecp[0]); lenvecp = vecp[0]; unduplicint(vecp, unduplicvecp); lenundup = unduplicvecp[0]; for(i = 1; i <= lenvecp; i++){ for(j = 1; j <= lenundup; j++){ k = vecp[i]; l = unduplicvecp[j]; if(k == l){ res[i] = j; } } } freeintvec(unduplicvecp); } /***************************************************************/ void getneworder(int *vecp, int *res) /*-------------------------------------------------- * donne les ordres pour un facteur ie avec des numros de 1 n --------------------------------------------------*/ { int i, k, lenvecp; lenvecp = vecp[0]; for(i = 1; i <= lenvecp; i++){ k = vecp[i]; res[k] = i; } } /***************************************************************/ void vecintpermut (int *A, int *num, int *B) { /*--------------------------------------- * A est un vecteur n elements * B est une vecteur n elements * num est une permutation alatoire des n premiers entiers * B contient en sortie les elements de A permutes * ---------------------------------------*/ int lig, lig1, lig2, i, k; lig = A[0]; lig1 = B[0]; lig2 = num[0]; if ( (lig!=lig1) || (lig!=lig2) ) { /*err_message ("Illegal parameters (vecpermut)"); closelisting();*/ } for (i=1; i<=lig; i++) { k=num[i]; B[i] = A[k]; } } ade4/src/fourthcorner.c0000644000176200001440000015630712634231211014551 0ustar liggesusers#include #include #include #include #include #include "adesub.h" /*=============================================================*/ double calculcorr (double **L, double *varx, double *vary); void vecstandar (double *tab, double *poili, double n); void calculkhi2 (double **obs, double *res); double calculkhi2surn (double **obs); double calculF (double **XL, double **XQual, double *XQuant, double *D); double calculcorratio (double **XL, double **XQual, double *XQuant); void quatriemecoin (double *tabR, double *tabL, double *tabQ, int *ncolR, int *nvarR, int *nlL, int *ncL, int *ncolQ, int *nvarQ,int *nrepet, int *modeltype, double *tabD, double *tabD2, double *tabG, int *RtypR,int *RtypQ, int *RassignR, int *RassignQ); void quatriemecoin2 (double *tabR, double *tabL, double *tabQ , int *ncolR, int *nvarR, int *nlL, int *ncL, int *ncolQ, int *nvarQ,int *nrepet, int *modeltype, double *tabG, double *trRLQ, int *RtypR,int *RtypQ, int *RassignR, int *RassignQ); void quatriemecoinRLQ (double *tabR, double *tabL, double *tabQ, int *ncolR, int *nvarR, int *nlL, int *ncL, int *ncolQ, int *nvarQ, int *nrepet, int *modeltype, double *tabD, double *tabD2, double *tabG, int *nrowD, int *ncolD, int *nrowG, int *ncolG, int *RtypR, int *RtypQ, int *RassignR, int *RassignQ, double *c1, double *l1, int *typeTest, int *naxes, int *typAnalRr, int *typAnalQr, double *pcRr, double *pcQr); /*=============================================================*/ void quatriemecoin (double *tabR, double *tabL, double *tabQ, int *ncolR, int *nvarR, int *nlL, int *ncL, int *ncolQ, int *nvarQ,int *nrepet, int *modeltype, double *tabD, double *tabD2, double *tabG, int *RtypR,int *RtypQ, int *RassignR, int *RassignQ) { /* Calcul quatrieme coin */ /* couplage quantitative/quantitative OU qualitative/quantitative OU qualitative/qualitative */ /* resutlats dans tabD statistique pour chaque cellule (homogeneite ds le cas quanti/quali)*/ /* resutlats dans tabD2 statistique pour chaque cellule (r ds le cas quanti/quali)*/ /* tabG resutlats globaux (Chi2 pour quali/quali) observes */ /* typR et typQ vecteur avec le type de chaque variable (1=quant, 2=qual) longueur nvarR et nvarQ */ /* assignR et assignQ vecteur avec le numero de variable pour chaque colonne de R et Q longueur ncolR et ncolQ */ /* le tableau est transpose par rapport a l'article original mais on garde la typologie des modeles par rapport a espece/site et non ligne colonne Par exemple, model 1 permute dans les espece independament (lignes dans l'article original), donc dans chaque colonne ici... */ /* Declarations de variables C locales */ double **XR,**XL,**XQ,**XD,**LtR, **XG, **XD2; double **XLpermute, **contingxy; double *varx, *vary, **tabx,**taby,resF=0, *reschi2G, *indica; int i,j,k,l,lL,cL,cQ,cR,vR,vQ, *nvR, *nvQ, *assignR, *assignQ, *typR, *typQ,dimx=0,dimy=0,npermut; /* Allocation memoire pour les variables C locales */ cR = *ncolR; cQ = *ncolQ; vR = *nvarR; vQ = *nvarQ; cL = *ncL; lL = *nlL; taballoc (&XR, lL, cR); taballoc (&XL, lL, cL); taballoc (&XLpermute, lL, cL); taballoc (&XQ, cL, cQ); taballoc (&XD, *nrepet + 1, cQ * cR); taballoc (&XG, *nrepet + 1, vQ * vR); taballoc (&XD2, *nrepet + 1, cQ * cR); vecintalloc (&nvR, vR); vecintalloc (&nvQ, vQ); vecintalloc (&typR, vR); vecintalloc (&typQ, vQ); vecintalloc (&assignR, cR); vecintalloc (&assignQ, cQ); /* Passage des objets R en C */ k = 0; for (i=1; i<=lL; i++) { for (j=1; j<=cL; j++) { XL[i][j] = tabL[k]; k = k + 1; } } k = 0; for (i=1; i<=lL; i++) { for (j=1; j<=cR; j++) { XR[i][j] = tabR[k]; k = k + 1; } } k = 0; for (i=1; i<=cL; i++) { for (j=1; j<=cQ; j++) { XQ[i][j] = tabQ[k]; k = k + 1; } } for (i=1; i<=cR; i++) { assignR[i]=RassignR[i-1]; } for (i=1; i<=cQ; i++) { assignQ[i]=RassignQ[i-1]; } for (i=1; i<=vR; i++) { typR[i]=RtypR[i-1]; } for (i=1; i<=vQ; i++) { typQ[i]=RtypQ[i-1]; } /* Numero de colonne auquel commence une variable */ nvR[1]=1; nvQ[1]=1; for (i=2;i<=cR;i++) { if (assignR[i]!=assignR[i-1]){nvR[assignR[i]]=i;} } for (i=2;i<=cQ;i++) { if (assignQ[i]!=assignQ[i-1]){nvQ[assignQ[i]]=i;} } /*-----------------------------------*/ /* ---- calculs valeurs observes ----*/ /*-----------------------------------*/ for (i=1;i<=vQ;i++){ for (j=1;j<=vR;j++){ /* quantitatif et quantitatif */ /*-----------------------------*/ if ((typQ[i]==1)&(typR[j]==1)) { vecalloc (&varx, lL); /*variable de R*/ for (k=1;k<=lL;k++){ varx[k]=XR[k][(nvR[j])]; /*on remplit vary avec la variable j de R*/ } vecalloc (&vary, cL); /*variable de Q*/ for (l=1;l<=cL;l++){ vary[l]=XQ[l][(nvQ[i])]; /*on remplit vary avec la variable i de Q*/ } XG[1][(i - 1) * vR + j]=calculcorr(XL,varx,vary); XD[1][(nvQ[i] - 1) * cR + (nvR[j])]= XG[1][(i - 1) * vR + j]; XD2[1][(nvQ[i] - 1) * cR + (nvR[j])]= XG[1][(i - 1) * vR + j]; freevec(varx); freevec(vary); } /* qualitatif et qualitatif */ /*---------------------------*/ if ((typQ[i]==2)&(typR[j]==2)) { if (j==vR) {dimx=cR-nvR[j]+1;} else {dimx=nvR[j+1]-nvR[j];} if (i==vQ) {dimy=cQ-nvQ[i]+1;} else {dimy=nvQ[i+1]-nvQ[i];} taballoc (&tabx, lL,dimx); /*variable de R*/ for (k=1;k<=dimx;k++){ for (l=1;l<=lL;l++){ tabx[l][k]=XR[l][(nvR[j])+k-1]; /*on remplit tabx avec la variable j de R*/ } } taballoc (&taby, cL,dimy); /*variable de Q*/ for (k=1;k<=dimy;k++){ for (l=1;l<=cL;l++){ taby[l][k]=XQ[l][(nvQ[i])+k-1]; /*on remplit taby avec la variable i de Q*/ } } /* Construction du tableau de contingence */ /* produit D=QtLtR */ taballoc(&contingxy,dimy,dimx); taballoc (&LtR, cL, dimx ); prodmatAtBC(XL,tabx,LtR); prodmatAtBC(taby,LtR,contingxy); vecalloc(&reschi2G,2); calculkhi2(contingxy,reschi2G); /*calcul du G*/ XG[1][(i - 1) * vR + j]= reschi2G[1]; /* XG2[i][j]= reschi2G[2]; */ for (k=1;k<=dimx;k++){ for (l=1;l<=dimy;l++){ /*on remplit D et D2 avec les valeurs observes*/ XD[1][(nvQ[i] + l-1 - 1) * cR + (nvR[j] + k-1)]=contingxy[l][k]; XD2[1][(nvQ[i] + l-1 - 1) * cR + (nvR[j] + k-1)]=contingxy[l][k]; } } freetab(tabx); freetab(taby); freetab(contingxy); freetab(LtR); freevec(reschi2G); } /* Q quantitatif et R qualitatif */ /*--------------------------------*/ if ((typQ[i]==1)&(typR[j]==2)) { if (j==vR) {dimx=cR-nvR[j]+1;} else {dimx=nvR[j+1]-nvR[j];} taballoc (&tabx, lL,dimx); /*variable de R*/ for (k=1;k<=dimx;k++){ for (l=1;l<=lL;l++){ tabx[l][k]=XR[l][(nvR[j])+k-1]; /*on remplit tabx avec la variable j qualitative de R*/ } } vecalloc (&vary, cL); for (l=1;l<=cL;l++){ vary[l]=XQ[l][(nvQ[i])]; /*on remplit vary avec la variable i de Q*/ } taballoc (&LtR, cL, lL ); /* on transpose L*/ for (l=1;l<=lL;l++){ for (k=1;k<=cL;k++){ LtR[k][l]=XL[l][k]; } } /* Calcul de D et du pseudo F */ vecalloc (&varx, dimx); /*va contenir les valeurs d. une par modalite*/ resF=calculF(LtR, tabx, vary, varx); XG[1][(i - 1) * vR + j]= resF; for (k=1;k<=dimx;k++){ XD[1][(nvQ[i] -1) * cR + nvR[j] + k-1]=varx[k]; /*on remplit D avec les valeurs observes*/ } vecalloc(&indica,lL); for (k=1;k<=dimx;k++){ for (l=1;l<=lL;l++){ indica[l]=tabx[l][k]; } /*on remplit D2 avec les valeurs observes*/ XD2[1][(nvQ[i] - 1) * cR + nvR[j] + k-1]=calculcorr(XL,indica,vary); } freevec(indica); freetab(tabx); freevec(vary); freevec(varx); freetab(LtR); } /* R quantitatif et Q qualitatif */ /*--------------------------------*/ if ((typQ[i]==2)&(typR[j]==1)) { if (i==vQ) {dimy=cQ-nvQ[i]+1;} else {dimy=nvQ[i+1]-nvQ[i];} taballoc (&taby, cL,dimy); /*variable de Q*/ for (k=1;k<=dimy;k++){ for (l=1;l<=cL;l++){ taby[l][k]=XQ[l][(nvQ[i])+k-1]; /*on remplit taby avec la variable i qualitative de Q*/ } } vecalloc (&varx, lL); for (l=1;l<=lL;l++){ varx[l]=XR[l][(nvR[j])]; /*on remplit vary avec la variable j de R*/ } /* Calcul de D et du pseudo F */ vecalloc (&vary, dimy); /*va contenir les valeurs d. une par modalite*/ resF=calculF(XL, taby, varx, vary); XG[1][(i - 1) * vR + j]= resF; for (k=1;k<=dimy;k++){ XD[1][(nvQ[i] + k-1 -1) * cR + nvR[j]]=vary[k]; /*on remplit D avec les valeurs observes*/ } vecalloc(&indica,cL); for (k=1;k<=dimy;k++){ for (l=1;l<=cL;l++){ indica[l]=taby[l][k]; } XD2[1][(nvQ[i] +k-1 -1) *cR + nvR[j]]=calculcorr(XL,varx,indica); /*on remplit D avec les valeurs observes*/ } freevec(indica); freetab(taby); freevec(vary); freevec(varx); } } /* fin boucle sur les colonnes*/ } /* fin boucle sur les lignes*/ /*----------------------------------------*/ /*----------------------------------------*/ /* ---- DEBUT PERMUTATIONS ----*/ /*----------------------------------------*/ /*----------------------------------------*/ for (npermut=1; npermut<=*nrepet;npermut++) /* Boucle permutation*/ { /* modele de permutation 1*/ if(*modeltype==1) { permutmodel1(XL,XLpermute,&lL,&cL); } /* modele de permutation 2*/ if(*modeltype==2) { permutmodel2(XL,XLpermute,&lL,&cL); } /* modele de permutation 3*/ if(*modeltype==3) { permutmodel3(XL,XLpermute,&lL,&cL); } /* modele de permutation 4*/ if(*modeltype==4) { permutmodel4(XL,XLpermute,&lL,&cL); } /* modele de permutation 5*/ if(*modeltype==5) { permutmodel5(XL,XLpermute,&lL,&cL); } /* Calcul des statistiques pour la permutation k*/ /*----------------------------------------*/ /* ---- calculs des valeurs permutees ----*/ /*----------------------------------------*/ for (i=1;i<=vQ;i++){ for (j=1;j<=vR;j++){ /* quantitatif et quantitatif */ /*-----------------------------*/ if ((typQ[i]==1)&(typR[j]==1)) { vecalloc (&varx, lL); /*variable de R*/ for (k=1;k<=lL;k++){ varx[k]=XR[k][(nvR[j])]; /*on remplit vary avec la variable j de R*/ } vecalloc (&vary, cL); /*variable de Q*/ for (l=1;l<=cL;l++){ vary[l]=XQ[l][(nvQ[i])]; /*on remplit vary avec la variable i de Q*/ } XG[npermut + 1][(i - 1) * vR + j]=calculcorr(XLpermute,varx,vary); XD[npermut + 1][(nvQ[i] - 1) * cR + (nvR[j])]= XG[npermut + 1][(i - 1) * vR + j]; XD2[npermut + 1][(nvQ[i] - 1) * cR + (nvR[j])]= XG[npermut + 1][(i - 1) * vR + j]; freevec(varx); freevec(vary); } /* qualitatif et qualitatif */ /*---------------------------*/ if ((typQ[i]==2)&(typR[j]==2)) { if (j==vR) {dimx=cR-nvR[j]+1;} else {dimx=nvR[j+1]-nvR[j];} if (i==vQ) {dimy=cQ-nvQ[i]+1;} else {dimy=nvQ[i+1]-nvQ[i];} taballoc (&tabx, lL,dimx); /*variable de R*/ for (k=1;k<=dimx;k++){ for (l=1;l<=lL;l++){ tabx[l][k]=XR[l][(nvR[j])+k-1]; /*on remplit tabx avec la variable j de R*/ } } taballoc (&taby, cL,dimy); /*variable de Q*/ for (k=1;k<=dimy;k++){ for (l=1;l<=cL;l++){ taby[l][k]=XQ[l][(nvQ[i])+k-1]; /*on remplit taby avec la variable i de Q*/ } } /* Construction du tableau de contingence */ /* produit D=QtLtR */ taballoc(&contingxy,dimy,dimx); taballoc (&LtR, cL, dimx ); prodmatAtBC(XLpermute,tabx,LtR); prodmatAtBC(taby,LtR,contingxy); vecalloc(&reschi2G,2); calculkhi2(contingxy,reschi2G); /*calcul du G*/ XG[npermut + 1][(i - 1) * vR + j]=reschi2G[1]; /* XG2sim[i][j]=reschi2G[2]; */ for (k=1;k<=dimx;k++){ for (l=1;l<=dimy;l++){ /*on remplit D avec les valeurs observes*/ XD[npermut + 1][(nvQ[i] + l-1 - 1) * cR + (nvR[j] + k-1)]=contingxy[l][k]; XD2[npermut + 1][(nvQ[i] + l-1 - 1) * cR + (nvR[j] + k-1)]=contingxy[l][k]; } } freevec(reschi2G); freetab(tabx); freetab(taby); freetab(contingxy); freetab(LtR); } /* Q quantitatif et R qualitatif */ /*--------------------------------*/ if ((typQ[i]==1)&(typR[j]==2)) { if (j==vR) {dimx=cR-nvR[j]+1;} else {dimx=nvR[j+1]-nvR[j];} taballoc (&tabx, lL,dimx); /*variable de R*/ for (k=1;k<=dimx;k++){ for (l=1;l<=lL;l++){ tabx[l][k]=XR[l][(nvR[j])+k-1]; /*on remplit tabx avec la variable j qualitative de R*/ } } vecalloc (&vary, cL); for (l=1;l<=cL;l++){ vary[l]=XQ[l][(nvQ[i])]; /*on remplit vary avec la variable i de Q*/ } taballoc (&LtR, cL, lL ); /* on transpose L*/ for (l=1;l<=lL;l++){ for (k=1;k<=cL;k++){ LtR[k][l]=XLpermute[l][k]; } } /* Calcul de D et du pseudo F */ vecalloc (&varx, dimx); /*va contenir les valeurs d. une par modalite*/ resF=calculF(LtR, tabx, vary, varx); XG[npermut + 1][(i - 1) * vR + j]= resF; for (k=1;k<=dimx;k++){ XD[npermut + 1][(nvQ[i] -1) * cR + nvR[j] + k-1]=varx[k]; /*on remplit D avec les valeurs observes*/ } vecalloc(&indica,lL); for (k=1;k<=dimx;k++){ for (l=1;l<=lL;l++){ indica[l]=tabx[l][k]; } /*on remplit D avec les valeurs observes*/ XD2[npermut + 1][(nvQ[i] - 1) * cR + nvR[j] + k-1]=calculcorr(XLpermute,indica,vary); } freevec(indica); freetab(tabx); freevec(vary); freevec(varx); freetab(LtR); } /* Q qualitatif et R quantitatif */ /*--------------------------------*/ if ((typQ[i]==2)&(typR[j]==1)) { if (i==vQ) {dimy=cQ-nvQ[i]+1;} else {dimy=nvQ[i+1]-nvQ[i];} taballoc (&taby, cL,dimy); /*variable de Q*/ for (k=1;k<=dimy;k++){ for (l=1;l<=cL;l++){ taby[l][k]=XQ[l][(nvQ[i])+k-1]; /*on remplit taby avec la variable i qualitative de Q*/ } } vecalloc (&varx, lL); for (l=1;l<=lL;l++){ varx[l]=XR[l][(nvR[j])]; /*on remplit varx avec la variable j de R*/ } /* Calcul de D et du pseudo F */ vecalloc (&vary, dimy); /*va contenir les valeurs d. une par modalite*/ resF=calculF(XLpermute, taby, varx, vary); XG[npermut + 1][(i - 1) * vR + j]= resF; for (k=1;k<=dimy;k++){ /*on remplit D avec les valeurs observes*/ XD[npermut + 1][(nvQ[i] + k-1 -1) * cR + nvR[j]]=vary[k]; } vecalloc(&indica,cL); for (k=1;k<=dimy;k++){ for (l=1;l<=cL;l++){ indica[l]=taby[l][k]; } /*on remplit D avec les valeurs observes*/ XD2[npermut + 1][(nvQ[i] +k-1 -1) *cR + nvR[j]]=calculcorr(XLpermute,varx,indica); } freevec(indica); freetab(taby); freevec(vary); freevec(varx); } } /* fin boucle sur les colonnes*/ } /* fin boucle sur les lignes*/ } /* fin boucle permutation . npermut incremente*/ /* On renvoie les valeurs dans R*/ k = 0; for (npermut = 1; npermut <= (*nrepet) + 1; npermut++) { for (j=1; j<= cQ * cR; j++) { tabD[k]= XD[npermut][j]; /* D observe */ tabD2[k]= XD2[npermut][j]; /* D observe */ k = k + 1; } } k = 0; for (npermut = 1; npermut <= (*nrepet) + 1; npermut++) { for (j=1; j<= vQ * vR ; j++) { tabG[k]= XG[npermut][j]; /* G observe */ k = k + 1; } } freetab(XR); freetab(XL); freetab(XQ); freetab(XLpermute); freetab(XD); freetab(XG); freetab(XD2); freeintvec (nvR); freeintvec (nvQ); freeintvec (typR); freeintvec (typQ); freeintvec (assignR); freeintvec (assignQ); } /*=============================================================*/ /*==================================================================*/ void quatriemecoin2 (double *tabR, double *tabL, double *tabQ , int *ncolR, int *nvarR, int *nlL, int *ncL, int *ncolQ, int *nvarQ,int *nrepet, int *modeltype, double *tabG, double *trRLQ, int *RtypR,int *RtypQ, int *RassignR, int *RassignQ) { /* Calcul quatrieme coin de type rlq (r2, rapport de correlation ou chi2/n */ /* couplage quantitative/quantitative OU qualitative/quantitative OU qualitative/qualitative */ /* tabG resutlats globaux (Chi2/n pour quali/quali) observes */ /* typR et typQ vecteur avec le type de chaque variable (1=quant, 2=qual) longueur nvarR et nvarQ */ /* assignR et assignQ vecteur avec le numero de variable pour chaque colonne de R et Q longueur ncolR et ncolQ */ /* le tableau est transpose par rapport a l'article original mais on garde la typologie des modeles par rapport a espece/site et non ligne colonne Par exemple, model 1 permute dans les espece independament (lignes dans l'article original), donc dans chaque colonne ici... */ /* Declarations de variables C locales */ double **XR,**XL,**XQ,**LtR, **XG; double **XLpermute,**contingxy; double *varx, *vary, **tabx,**taby; int i,j,k,l,lL,cL,cQ,cR,vR,vQ, *nvR, *nvQ, *assignR, *assignQ, *typR, *typQ,dimx=0,dimy=0,npermut; /* Allocation memoire pour les variables C locales */ cR = *ncolR; cQ = *ncolQ; vR = *nvarR; vQ = *nvarQ; cL = *ncL; lL = *nlL; taballoc (&XR, lL, cR); taballoc (&XL, lL, cL); taballoc (&XLpermute, lL, cL); taballoc (&XQ, cL, cQ); taballoc (&XG, *nrepet + 1, vQ * vR); vecintalloc (&nvR, vR); vecintalloc (&nvQ, vQ); vecintalloc (&typR, vR); vecintalloc (&typQ, vQ); vecintalloc (&assignR, cR); vecintalloc (&assignQ, cQ); /* Passage des objets R en C */ k = 0; for (i=1; i<=lL; i++) { for (j=1; j<=cL; j++) { XL[i][j] = tabL[k]; k = k + 1; } } k = 0; for (i=1; i<=lL; i++) { for (j=1; j<=cR; j++) { XR[i][j] = tabR[k]; k = k + 1; } } k = 0; for (i=1; i<=cL; i++) { for (j=1; j<=cQ; j++) { XQ[i][j] = tabQ[k]; k = k + 1; } } for (i=1; i<=cR; i++) { assignR[i]=RassignR[i-1]; } for (i=1; i<=cQ; i++) { assignQ[i]=RassignQ[i-1]; } for (i=1; i<=vR; i++) { typR[i]=RtypR[i-1]; } for (i=1; i<=vQ; i++) { typQ[i]=RtypQ[i-1]; } /* Numero de colonne auquel commence une variable */ nvR[1]=1; nvQ[1]=1; for (i=2;i<=cR;i++) { if (assignR[i]!=assignR[i-1]){nvR[assignR[i]]=i;} } for (i=2;i<=cQ;i++) { if (assignQ[i]!=assignQ[i-1]){nvQ[assignQ[i]]=i;} } /*-----------------------------------*/ /* ---- calculs valeurs observes ----*/ /*-----------------------------------*/ for (i=1;i<=vQ;i++){ for (j=1;j<=vR;j++){ /* quantitatif et quantitatif */ /*-----------------------------*/ if ((typQ[i]==1)&(typR[j]==1)) { vecalloc (&varx, lL); /*variable de R*/ for (k=1;k<=lL;k++){ varx[k]=XR[k][(nvR[j])]; /*on remplit vary avec la variable j de R*/ } vecalloc (&vary, cL); /*variable de Q*/ for (l=1;l<=cL;l++){ vary[l]=XQ[l][(nvQ[i])]; /*on remplit vary avec la variable i de Q*/ } XG[1][(i - 1) * vR + j]=pow(calculcorr(XL,varx,vary),2); freevec(varx); freevec(vary); } /* qualitatif et qualitatif */ /*---------------------------*/ if ((typQ[i]==2)&(typR[j]==2)) { if (j==vR) {dimx=cR-nvR[j]+1;} else {dimx=nvR[j+1]-nvR[j];} if (i==vQ) {dimy=cQ-nvQ[i]+1;} else {dimy=nvQ[i+1]-nvQ[i];} taballoc (&tabx, lL,dimx); /*variable de R*/ for (k=1;k<=dimx;k++){ for (l=1;l<=lL;l++){ tabx[l][k]=XR[l][(nvR[j])+k-1]; /*on remplit tabx avec la variable j de R*/ } } taballoc (&taby, cL,dimy); /*variable de Q*/ for (k=1;k<=dimy;k++){ for (l=1;l<=cL;l++){ taby[l][k]=XQ[l][(nvQ[i])+k-1]; /*on remplit taby avec la variable i de Q*/ } } /* Construction du tableau de contingence */ /* produit D=QtLtR */ taballoc(&contingxy,dimy,dimx); taballoc (&LtR, cL, dimx ); prodmatAtBC(XL,tabx,LtR); prodmatAtBC(taby,LtR,contingxy); XG[1][(i - 1) * vR + j]= calculkhi2surn(contingxy); freetab(tabx); freetab(taby); freetab(contingxy); freetab(LtR); } /* Q quantitatif et R qualitatif */ /*--------------------------------*/ if ((typQ[i]==1)&(typR[j]==2)) { if (j==vR) {dimx=cR-nvR[j]+1;} else {dimx=nvR[j+1]-nvR[j];} taballoc (&tabx, lL,dimx); /*variable de R*/ for (k=1;k<=dimx;k++){ for (l=1;l<=lL;l++){ tabx[l][k]=XR[l][(nvR[j])+k-1]; /*on remplit tabx avec la variable j qualitative de R*/ } } vecalloc (&vary, cL); for (l=1;l<=cL;l++){ vary[l]=XQ[l][(nvQ[i])]; /*on remplit vary avec la variable i de Q*/ } taballoc (&LtR, cL, lL ); /* on transpose L*/ for (l=1;l<=lL;l++){ for (k=1;k<=cL;k++){ LtR[k][l]=XL[l][k]; } } /* Calcul du rapport de correlation*/ XG[1][(i - 1) * vR + j]= calculcorratio(LtR, tabx, vary); freetab(tabx); freevec(vary); freetab(LtR); } /* R quantitatif et Q qualitatif */ /*--------------------------------*/ if ((typQ[i]==2)&(typR[j]==1)) { if (i==vQ) {dimy=cQ-nvQ[i]+1;} else {dimy=nvQ[i+1]-nvQ[i];} taballoc (&taby, cL,dimy); /*variable de Q*/ for (k=1;k<=dimy;k++){ for (l=1;l<=cL;l++){ taby[l][k]=XQ[l][(nvQ[i])+k-1]; /*on remplit taby avec la variable i qualitative de Q*/ } } vecalloc (&varx, lL); for (l=1;l<=lL;l++){ varx[l]=XR[l][(nvR[j])]; /*on remplit vary avec la variable j de R*/ } /* Calcul du rapport de correlation */ XG[1][(i - 1) * vR + j]= calculcorratio(XL, taby, varx); freetab(taby); freevec(varx); } trRLQ[0]=trRLQ[0] + XG[1][(i - 1) * vR + j]; } /* fin boucle sur les colonnes*/ } /* fin boucle sur les lignes*/ /*----------------------------------------*/ /*----------------------------------------*/ /* ---- DEBUT PERMUTATIONS ----*/ /*----------------------------------------*/ /*----------------------------------------*/ for (npermut=1; npermut<=*nrepet;npermut++) /* Boucle permutation*/ { /* modele de permutation 1*/ if(*modeltype==1) { permutmodel1(XL,XLpermute,&lL,&cL); } /* modele de permutation 2*/ if(*modeltype==2) { permutmodel2(XL,XLpermute,&lL,&cL); } /* modele de permutation 3*/ if(*modeltype==3) { permutmodel3(XL,XLpermute,&lL,&cL); } /* modele de permutation 4*/ if(*modeltype==4) { permutmodel4(XL,XLpermute,&lL,&cL); } /* modele de permutation 5*/ if(*modeltype==5) { permutmodel5(XL,XLpermute,&lL,&cL); } /* Calcul des statistiques pour la permutation k*/ /*----------------------------------------*/ /* ---- calculs des valeurs permutees ----*/ /*----------------------------------------*/ for (i=1;i<=vQ;i++){ for (j=1;j<=vR;j++){ /* quantitatif et quantitatif */ /*-----------------------------*/ if ((typQ[i]==1)&(typR[j]==1)) { vecalloc (&varx, lL); /*variable de R*/ for (k=1;k<=lL;k++){ varx[k]=XR[k][(nvR[j])]; /*on remplit vary avec la variable j de R*/ } vecalloc (&vary, cL); /*variable de Q*/ for (l=1;l<=cL;l++){ vary[l]=XQ[l][(nvQ[i])]; /*on remplit vary avec la variable i de Q*/ } XG[npermut + 1][(i - 1) * vR + j]=pow(calculcorr(XLpermute,varx,vary),2); freevec(varx); freevec(vary); } /* qualitatif et qualitatif */ /*---------------------------*/ if ((typQ[i]==2)&(typR[j]==2)) { if (j==vR) {dimx=cR-nvR[j]+1;} else {dimx=nvR[j+1]-nvR[j];} if (i==vQ) {dimy=cQ-nvQ[i]+1;} else {dimy=nvQ[i+1]-nvQ[i];} taballoc (&tabx, lL,dimx); /*variable de R*/ for (k=1;k<=dimx;k++){ for (l=1;l<=lL;l++){ tabx[l][k]=XR[l][(nvR[j])+k-1]; /*on remplit tabx avec la variable j de R*/ } } taballoc (&taby, cL,dimy); /*variable de Q*/ for (k=1;k<=dimy;k++){ for (l=1;l<=cL;l++){ taby[l][k]=XQ[l][(nvQ[i])+k-1]; /*on remplit taby avec la variable i de Q*/ } } /* Construction du tableau de contingence */ /* produit D=QtLtR */ taballoc(&contingxy,dimy,dimx); taballoc (&LtR, cL, dimx ); prodmatAtBC(XLpermute,tabx,LtR); prodmatAtBC(taby,LtR,contingxy); XG[npermut + 1][(i - 1) * vR + j]=calculkhi2surn(contingxy); /*calcul du chi/n*/ freetab(tabx); freetab(taby); freetab(contingxy); freetab(LtR); } /* Q quantitatif et R qualitatif */ /*--------------------------------*/ if ((typQ[i]==1)&(typR[j]==2)) { if (j==vR) {dimx=cR-nvR[j]+1;} else {dimx=nvR[j+1]-nvR[j];} taballoc (&tabx, lL,dimx); /*variable de R*/ for (k=1;k<=dimx;k++){ for (l=1;l<=lL;l++){ tabx[l][k]=XR[l][(nvR[j])+k-1]; /*on remplit tabx avec la variable j qualitative de R*/ } } vecalloc (&vary, cL); for (l=1;l<=cL;l++){ vary[l]=XQ[l][(nvQ[i])]; /*on remplit vary avec la variable i de Q*/ } taballoc (&LtR, cL, lL ); /* on transpose L*/ for (l=1;l<=lL;l++){ for (k=1;k<=cL;k++){ LtR[k][l]=XLpermute[l][k]; } } /* Calcul de D et du pseudo F */ XG[npermut + 1][(i - 1) * vR + j]= calculcorratio(LtR, tabx, vary); freetab(tabx); freevec(vary); freetab(LtR); } /* Q qualitatif et R quantitatif */ /*--------------------------------*/ if ((typQ[i]==2)&(typR[j]==1)) { if (i==vQ) {dimy=cQ-nvQ[i]+1;} else {dimy=nvQ[i+1]-nvQ[i];} taballoc (&taby, cL,dimy); /*variable de Q*/ for (k=1;k<=dimy;k++){ for (l=1;l<=cL;l++){ taby[l][k]=XQ[l][(nvQ[i])+k-1]; /*on remplit taby avec la variable i qualitative de Q*/ } } vecalloc (&varx, lL); for (l=1;l<=lL;l++){ varx[l]=XR[l][(nvR[j])]; /*on remplit varx avec la variable j de R*/ } /* Calcul de D et du pseudo F */ XG[npermut + 1][(i - 1) * vR + j]= calculcorratio(XLpermute, taby, varx); freetab(taby); freevec(varx); } trRLQ[npermut] = trRLQ[npermut] + XG[npermut + 1][(i - 1) * vR + j]; } /* fin boucle sur les colonnes*/ } /* fin boucle sur les lignes*/ } /* fin boucle permutation . npermut incremente*/ /* On renvoie les valeurs dans R*/ k = 0; for (npermut = 1; npermut <= (*nrepet) + 1; npermut++) { for (j=1; j<= vQ * vR ; j++) { tabG[k]= XG[npermut][j]; /* G observe */ k = k + 1; } } freetab(XR); freetab(XL); freetab(XQ); freetab(XLpermute); freetab(XG); freeintvec (nvR); freeintvec (nvQ); freeintvec (typR); freeintvec (typQ); freeintvec (assignR); freeintvec (assignQ); } /*=============================================================*/ void quatriemecoinRLQ (double *tabR, double *tabL, double *tabQ, int *ncolR, int *nvarR, int *nlL, int *ncL, int *ncolQ, int *nvarQ, int *nrepet, int *modeltype, double *tabD, double *tabD2, double *tabG, int *nrowD, int *ncolD, int *nrowG, int *ncolG, int *RtypR, int *RtypQ, int *RassignR, int *RassignQ, double *c1, double *l1, int *typeTest, int *naxes, int *typAnalRr, int *typAnalQr, double *pcRr, double *pcQr) { /* Calcul quatrieme coin sur analyse RLQ*/ /* couplage quantitative/quantitative OU qualitative/quantitative */ /* resultats dans tabD statistique pour chaque cellule (homogeneite ds le cas quanti/quali)*/ /* resultats dans tabD2 statistique pour chaque cellule (r ds le cas quanti/quali)*/ /* tabG resutlats globaux observes */ /* typR et typQ vecteur avec le type de chaque variable (1=quant, 2=qual) longueur nvarR et nvarQ */ /* assignR et assignQ vecteur avec le numero de variable pour chaque colonne de R et Q longueur ncolR et ncolQ */ /* le tableau est transpose par rapport a l'article original mais on garde la typologie des modeles par rapport a espece/site et non ligne colonne Par exemple, model 1 permute dans les espece independament (lignes dans l'article original), donc dans chaque colonne ici... */ /* Declarations de variables C locales */ double **XR,**XL,**XQ,**XD, **XD2, **XG, **LtR; double **XLpermute; double *varx, *vary, **tabx,**taby,resF=0, *indica; int i,j,k,l,lL,cL,cQ,cR,vR,vQ, *nvR, *nvQ, *assignR, *assignQ, *typR, *typQ,dimx=0,dimy=0,npermut; int typAnalR, typAnalQ; double **tabc1, **tabl1, **axesR, **axesQ, *pcR, *pcQ, **initR, **initQ, Ntot=0.0, *pcL, *plL; /* Allocation memoire pour les variables C locales */ cR = *ncolR; cQ = *ncolQ; vR = *nvarR; vQ = *nvarQ; cL = *ncL; lL = *nlL; typAnalR = *typAnalRr; typAnalQ = *typAnalQr; vecalloc (&pcR, cR); vecalloc (&pcQ, cQ); vecalloc (&pcL, cL); vecalloc (&plL, lL); if ((*typeTest==1) || (*typeTest==2)) { /*axes or R.axes R. axes measures the link between table R and axes (axesQ)*/ taballoc (&tabc1, cQ, *naxes); taballoc (&axesQ, cL, *naxes); } if ((*typeTest==1) || (*typeTest==3)) { /*axes or Q.axes*/ taballoc (&tabl1, cR, *naxes); taballoc (&axesR, lL, *naxes); } taballoc (&initR, lL, cR); taballoc (&initQ, cL, cQ); taballoc (&XR, lL, cR); taballoc (&XL, lL, cL); taballoc (&XLpermute, lL, cL); taballoc (&XQ, cL, cQ); taballoc (&XD, *nrepet + 1, (*nrowD) * (*ncolD)); taballoc (&XG, *nrepet + 1, (*nrowG) * (*ncolG)); taballoc (&XD2, *nrepet + 1, (*nrowD) * (*ncolD)); vecintalloc (&nvR, vR); vecintalloc (&nvQ, vQ); vecintalloc (&typR, vR); vecintalloc (&typQ, vQ); vecintalloc (&assignR, cR); vecintalloc (&assignQ, cQ); /* Passage des objets R en C */ k = 0; for (i=1; i<=lL; i++) { for (j=1; j<=cL; j++) { XL[i][j] = tabL[k]; Ntot = Ntot + tabL[k]; k = k + 1; } } k = 0; for (i=1; i<=lL; i++) { for (j=1; j<=cR; j++) { XR[i][j] = tabR[k]; initR[i][j] = tabR[k]; k = k + 1; } } k = 0; for (i=1; i<=cL; i++) { for (j=1; j<=cQ; j++) { XQ[i][j] = tabQ[k]; initQ[i][j] = tabQ[k]; k = k + 1; } } if ((*typeTest==1) || (*typeTest==2)) { /*axes or R.axes*/ k = 0; for (i=1; i<=cQ; i++) { for (j=1; j<= *naxes; j++) { tabc1[i][j] = c1[k]; k = k + 1; } } } if ((*typeTest==1) || (*typeTest==3)) { /*axes or Q.axes*/ k = 0; for (i=1; i<=cR; i++) { for (j=1; j<= *naxes; j++) { tabl1[i][j] = l1[k]; k = k + 1; } } } /* Compute row and column weights*/ for (i=1; i<=lL; i++) { for (j=1; j<=cL; j++) { pcL[j]=pcL[j] + XL[i][j] / Ntot; plL[i]=plL[i] + XL[i][j] / Ntot; } } for (i=1; i<=cR; i++) { assignR[i]=RassignR[i-1]; } for (i=1; i<=cQ; i++) { assignQ[i]=RassignQ[i-1]; } for (i=1; i<=vR; i++) { typR[i]=RtypR[i-1]; } for (i=1; i<=vQ; i++) { typQ[i]=RtypQ[i-1]; } for (i=1; i<=cR; i++) { pcR[i] = pcRr[i-1]; } for (i=1; i<=cQ; i++) { pcQ[i] = pcQr[i-1]; } /* Numero de colonne auquel commence une variable */ nvR[1]=1; nvQ[1]=1; for (i=2;i<=cR;i++) { if (assignR[i]!=assignR[i-1]){nvR[assignR[i]]=i;} } for (i=2;i<=cQ;i++) { if (assignQ[i]!=assignQ[i-1]){nvQ[assignQ[i]]=i;} } /*-----------------------------------*/ /* ---- calculs valeurs observes ----*/ /*-----------------------------------*/ if ((*typeTest==1) || (*typeTest==2)) { /*axes or R.axes compute lQ= Q * Dq * c1 (axesQ linear combination of traits) */ if (typAnalQ == 8) { matcentragehi(XQ,pcL,typQ,assignQ); } else { matcentrage (XQ, pcL, typAnalQ); } prodmatAdBC(XQ,pcQ, tabc1,axesQ); } if ((*typeTest==1) || (*typeTest==3)) { /*axes or Q.axes*/ if (typAnalR == 8) { matcentragehi(XR,plL,typR,assignR); } else {matcentrage (XR, plL, typAnalR); } prodmatAdBC(XR,pcR, tabl1,axesR); } if (*typeTest==1){ vecalloc (&vary, cL); /* Q axes*/ vecalloc (&varx, lL); /* R axes*/ /* axes and axes */ for (i=1;i<= *naxes;i++){ for (j=1;j<= *naxes;j++){ for (k=1;k<=lL;k++){ varx[k]=axesR[k][j]; /* fill 'varx' the j-th linear combination of R variables*/ } for (l=1;l<=cL;l++){ vary[l]=axesQ[l][i]; /*fill 'vary' the i-th linear combination of Q variables */ } XG[1][(i-1) * (*ncolG) +j]=calculcorr(XL,varx,vary); XD[1][(i-1) * (*ncolD) +j]=XG[1][(i-1) * (*ncolG) +j]; XD2[1][(i-1) * (*ncolD) +j]=XG[1][(i-1) * (*ncolG) +j]; } } freevec(varx); freevec(vary); } if (*typeTest==2){ /* R.axes*/ vecalloc (&vary, cL); /* Q axis */ for (i=1;i<= *naxes;i++){ for (l=1;l<=cL;l++){ vary[l]=axesQ[l][i]; /* fill 'vary' the i-th linear combination of Q variables */ } for (j=1;j<= vR;j++){ /* R quantitative */ if (typR[j]==1) { vecalloc (&varx, lL); for (k=1;k<=lL;k++){ varx[k]=XR[k][(nvR[j])]; /* remplit varx avec la variable de R*/ } XG[1][(i-1) * (*ncolG) + j]=calculcorr(XL,varx,vary); XD[1][(i-1) * (*ncolD) + (nvR[j])]=XG[1][(i-1) * (*ncolG) +j]; XD2[1][(i-1) * (*ncolD) + (nvR[j])]=XG[1][(i-1) * (*ncolG) +j]; freevec(varx); } /* R qualitative */ if (typR[j]==2) { if (j==vR) {dimx=cR-nvR[j]+1;} else {dimx=nvR[j+1]-nvR[j];} taballoc (&tabx, lL,dimx); /*variable de R*/ for (k=1;k<=dimx;k++){ for (l=1;l<=lL;l++){ tabx[l][k]=XR[l][(nvR[j])+k-1]; /*on remplit tabx avec la variable j qualitative de R*/ } } taballoc (&LtR, cL, lL ); /* on transpose L*/ for (l=1;l<=lL;l++){ for (k=1;k<=cL;k++){ LtR[k][l]=XL[l][k]; } } /* Calcul de D et du pseudo F */ vecalloc (&varx, dimx); /*va contenir les valeurs d. une par modalite*/ resF=calculF(LtR, tabx, vary, varx); XG[1][(i-1) * (*ncolG) +j]= resF; for (k=1;k<=dimx;k++){ XD[1][(i-1) * (*ncolD) + (nvR[j]) + k-1]=varx[k]; /*on remplit D avec les valeurs observes*/ } vecalloc(&indica,lL); for (k=1;k<=dimx;k++){ for (l=1;l<=lL;l++){ indica[l]=tabx[l][k]; } XD2[1][(i-1) * (*ncolD) + (nvR[j]) + k-1]=calculcorr(XL,indica,vary); /*on remplit D avec les valeurs observes*/ } freevec(indica); freetab(tabx); freevec(varx); freetab(LtR); } } } freevec(vary); } if (*typeTest==3){ /* Q.axes*/ for (j=1;j<= *naxes;j++){ vecalloc (&varx, lL); /*R axis*/ for (l=1;l<=lL;l++){ varx[l]=axesR[l][j]; /* fill 'varx' the j-th linear combination of R variables */ } for (i=1;i<= vQ;i++){ /* Q quantitative */ if (typQ[i]==1) { vecalloc (&vary, cL); for (k=1;k<=cL;k++){ vary[k]=XQ[k][(nvQ[i])]; /* remplit vary avec la variable de Q*/ } XG[1][(i-1) * (*ncolG) + j]=calculcorr(XL,varx,vary); XD[1][(nvQ[i]-1) * (*ncolD) + j]=XG[1][(i-1) * (*ncolG) + j]; XD2[1][(nvQ[i]-1) * (*ncolD) + j]=XG[1][(i-1) * (*ncolG) + j]; freevec(vary); } /* Q qualitative */ if (typQ[i]==2) { if (i==vQ) {dimy=cQ-nvQ[i]+1;} else {dimy=nvQ[i+1]-nvQ[i];} taballoc (&taby, cL,dimy); /*variable de Q*/ for (k=1;k<=dimy;k++){ for (l=1;l<=cL;l++){ taby[l][k]=XQ[l][(nvQ[i])+k-1]; /*on remplit taby avec la variable i qualitative de Q*/ } } /* Calcul de D et du pseudo F */ vecalloc (&vary, dimy); /*va contenir les valeurs d. une par modalite*/ resF=calculF(XL, taby, varx, vary); XG[1][(i-1) * (*ncolG) + j]= resF; for (k=1;k<=dimy;k++){ XD[1][(nvQ[i]-1+ k-1) * (*ncolD) + j ]=vary[k]; /*on remplit D avec les valeurs observes*/ } vecalloc(&indica,cL); for (k=1;k<=dimy;k++){ for (l=1;l<=cL;l++){ indica[l]=taby[l][k]; } XD2[1][(nvQ[i]-1+ k-1) * (*ncolD) + j ]=calculcorr(XL,varx,indica); /*on remplit D avec les valeurs observes*/ } freevec(indica); freetab(taby); freevec(vary); } } } freevec(varx); } /*----------------------------------------*/ /*----------------------------------------*/ /* ---- DEBUT PERMUTATIONS ----*/ /*----------------------------------------*/ /*----------------------------------------*/ for (npermut=1; npermut<=*nrepet;npermut++) /* Boucle permutation*/ { /* modele de permutation 2*/ if(*modeltype==2) { permutmodel2(XL,XLpermute,&lL,&cL); } /* modele de permutation 4*/ if(*modeltype==4) { permutmodel4(XL,XLpermute,&lL,&cL); } /* modele de permutation 5*/ if(*modeltype==5) { permutmodel5(XL,XLpermute,&lL,&cL); } /* Calcul des statistiques pour la permutation k*/ /*----------------------------------------*/ /* ---- calculs des valeurs permutees ----*/ /*----------------------------------------*/ /* Get the original tables */ for (i=1; i<=cL; i++) { for (j=1; j<=cQ; j++) { XQ[i][j] = initQ[i][j]; } } for (i=1; i<=lL; i++) { for (j=1; j<=cR; j++) { XR[i][j] = initR[i][j]; } } /* Re-compute row and column weights*/ for (i=1; i<=lL; i++) {plL[i]=0;} for (j=1; j<=cL; j++) {pcL[j]=0;} for (i=1; i<=lL; i++) { for (j=1; j<=cL; j++) { pcL[j]=pcL[j] + XLpermute[i][j] / Ntot; plL[i]=plL[i] + XLpermute[i][j] / Ntot; } } if ((*typeTest==1) || (*typeTest==2)) { /*axes or R.axes */ if((*modeltype==4) || (*modeltype==5)) { /* modeltype=4 permute Q (i.e. column of L) */ if (typAnalQ == 8) { /* on recalcule le poids colonne pour les qualitatives*/ for(j=1;j<=cQ;j++){ if(typQ[assignQ[j]]==2){ pcQ[j]=0; } } for(i=1;i<=cL;i++){ for(j=1;j<=cQ;j++){ if(typQ[assignQ[j]]==2){ pcQ[j]=pcQ[j]+XQ[i][j]*pcL[i]; } } } matcentragehi(XQ,pcL,typQ,assignQ); } else { /* on recalcule le poids colonne pour les qualitatives pour une acm*/ if (typAnalQ == 2) { for(j=1;j<=cQ;j++){ pcQ[j]=0; } for(i=1;i<=cL;i++){ for(j=1;j<=cQ;j++){ pcQ[j]=pcQ[j]+XQ[i][j]*pcL[i]; } } for(j=1;j<=cQ;j++){ pcQ[j]=pcQ[j]/(cQ); } } matcentrage (XQ, pcL, typAnalQ); } } prodmatAdBC(XQ,pcQ, tabc1,axesQ); } if ((*typeTest==1) || (*typeTest==3)) { /*axes or Q.axes*/ /* compute new weights and recenter columns of R and Q */ if((*modeltype==2) || (*modeltype==5)) { /* modeltype=2 permute R (i.e. row of L) */ if (typAnalR == 8) { for(j=1;j<=cR;j++){ if(typR[assignR[j]]==2){ pcR[j]=0; } } for(i=1;i<=lL;i++){ for(j=1;j<=cR;j++){ if(typR[assignR[j]]==2){ pcR[j]=pcR[j]+XR[i][j]*plL[i]; } } } matcentragehi(XR,plL,typR,assignR); /* on recalcule le poids colonne pour les qualitatives */ } else { /* on recalcule le poids colonne pour les qualitatives pour une acm*/ if (typAnalR == 2) { for(j=1;j<=cR;j++){ pcR[j]=0; } for(i=1;i<=lL;i++){ for(j=1;j<=cR;j++){ pcR[j]=pcR[j]+XR[i][j]*plL[i]; } } for(j=1;j<=cR;j++){ pcR[j]=pcR[j]/(cR); } } matcentrage (XR, plL, typAnalR); } } prodmatAdBC(XR,pcR, tabl1,axesR); } if (*typeTest==1){ vecalloc (&vary, cL); /* Q axes*/ vecalloc (&varx, lL); /* R axes*/ /* axes and axes */ for (i=1;i<= *naxes;i++){ for (j=1;j<= *naxes;j++){ for (k=1;k<=lL;k++){ varx[k]=axesR[k][j]; /* fill 'varx' the j-th linear combination of R variables*/ } for (l=1;l<=cL;l++){ vary[l]=axesQ[l][i]; /*fill 'vary' the i-th linear combination of Q variables */ } XG[npermut+1][(i-1) * (*ncolG) +j]=calculcorr(XLpermute,varx,vary); XD[npermut+1][(i-1) * (*ncolD) +j]=XG[npermut+1][(i-1) * (*ncolG) +j]; XD2[npermut+1][(i-1) * (*ncolD) +j]=XG[npermut+1][(i-1) * (*ncolG) +j]; } } freevec(varx); freevec(vary); } if (*typeTest==2){ /* R.axes*/ vecalloc (&vary, cL); /* Q axis */ for (i=1;i<= *naxes;i++){ for (l=1;l<=cL;l++){ vary[l]=axesQ[l][i]; /* fill 'vary' the i-th linear combination of Q variables */ } for (j=1;j<= vR;j++){ /* R quantitative */ if (typR[j]==1) { vecalloc (&varx, lL); for (k=1;k<=lL;k++){ varx[k]=XR[k][(nvR[j])]; /* remplit varx avec la variable de R*/ } XG[npermut+1][(i-1) * (*ncolG) + j]=calculcorr(XLpermute,varx,vary); XD[npermut+1][(i-1) * (*ncolD) + (nvR[j])]=XG[npermut+1][(i-1) * (*ncolG) +j]; XD2[npermut+1][(i-1) * (*ncolD) + (nvR[j])]=XG[npermut+1][(i-1) * (*ncolG) +j]; freevec(varx); } /* R qualitative */ if (typR[j]==2) { if (j==vR) {dimx=cR-nvR[j]+1;} else {dimx=nvR[j+1]-nvR[j];} taballoc (&tabx, lL,dimx); /*variable de R*/ for (k=1;k<=dimx;k++){ for (l=1;l<=lL;l++){ tabx[l][k]=XR[l][(nvR[j])+k-1]; /*on remplit tabx avec la variable j qualitative de R*/ } } taballoc (&LtR, cL, lL ); /* on transpose L*/ for (l=1;l<=lL;l++){ for (k=1;k<=cL;k++){ LtR[k][l]=XLpermute[l][k]; } } /* Calcul de D et du pseudo F */ vecalloc (&varx, dimx); /*va contenir les valeurs d. une par modalite*/ resF=calculF(LtR, tabx, vary, varx); XG[npermut+1][(i-1) * (*ncolG) +j]=resF; for (k=1;k<=dimx;k++){ XD[npermut+1][(i-1) * (*ncolD) + (nvR[j]) + k-1]=varx[k]; } vecalloc(&indica,lL); for (k=1;k<=dimx;k++){ for (l=1;l<=lL;l++){ indica[l]=tabx[l][k]; } XD2[npermut+1][(i-1) * (*ncolD) + (nvR[j]) + k-1]=calculcorr(XLpermute,indica,vary); } freevec(indica); freetab(tabx); freevec(varx); freetab(LtR); } } } freevec(vary); } if (*typeTest==3){ /* Q.axes*/ for (j=1;j<= *naxes;j++){ vecalloc (&varx, lL); /*R axis*/ for (l=1;l<=lL;l++){ varx[l]=axesR[l][j]; /* fill 'varx' the j-th linear combination of R variables */ } for (i=1;i<= vQ;i++){ /* Q quantitative */ if (typQ[i]==1) { vecalloc (&vary, cL); for (k=1;k<=cL;k++){ vary[k]=XQ[k][(nvQ[i])]; /* remplit vary avec la variable de Q*/ } XG[npermut+1][(i-1) * (*ncolG) + j]=calculcorr(XLpermute,varx,vary); XD[npermut+1][(nvQ[i]-1) * (*ncolD) + j]=XG[npermut+1][(i-1) * (*ncolG) + j]; XD2[npermut+1][(nvQ[i]-1) * (*ncolD) + j]=XG[npermut+1][(i-1) * (*ncolG) + j]; freevec(vary); } /* Q qualitative */ if (typQ[i]==2) { if (i==vQ) {dimy=cQ-nvQ[i]+1;} else {dimy=nvQ[i+1]-nvQ[i];} taballoc (&taby, cL,dimy); /*variable de Q*/ for (k=1;k<=dimy;k++){ for (l=1;l<=cL;l++){ taby[l][k]=XQ[l][(nvQ[i])+k-1]; /*on remplit taby avec la variable i qualitative de Q*/ } } /* Calcul de D et du pseudo F */ vecalloc (&vary, dimy); /*va contenir les valeurs d. une par modalite*/ resF=calculF(XLpermute, taby, varx, vary); XG[npermut+1][(i-1) * (*ncolG) + j]= resF; for (k=1;k<=dimy;k++){ XD[npermut+1][(nvQ[i]-1+ k-1) * (*ncolD) + j ]=vary[k]; } vecalloc(&indica,cL); for (k=1;k<=dimy;k++){ for (l=1;l<=cL;l++){ indica[l]=taby[l][k]; } XD2[npermut+1][(nvQ[i]-1+ k-1) * (*ncolD) + j ]=calculcorr(XLpermute,varx,indica); } freevec(indica); freetab(taby); freevec(vary); } } } freevec(varx); } } /* fin boucle permutation . npermut incremente*/ /* On renvoie les valeurs dans R*/ k = 0; for (npermut = 1; npermut <= (*nrepet) + 1; npermut++) { for (j=1; j<=(*nrowD) * (*ncolD); j++) { tabD[k]= XD[npermut][j]; /* D observe */ tabD2[k]= XD2[npermut][j]; /* D observe */ k = k + 1; } } k = 0; for (npermut = 1; npermut <= (*nrepet) + 1; npermut++) { for (j=1; j<=(*ncolG) * (*nrowG); j++) { tabG[k]= XG[npermut][j]; /* G observe */ k = k + 1; } } freetab(XR); freetab(XL); freetab(XQ); freetab(XLpermute); freetab(XD); freetab(XG); freetab(XD2); freeintvec (nvR); freeintvec (nvQ); freeintvec (typR); freeintvec (typQ); freeintvec (assignR); freeintvec (assignQ); freevec (pcR); freevec (pcQ); freevec (pcL); freevec (plL); freetab(initR); freetab(initQ); if ((*typeTest==1) || (*typeTest==2)) { /*axes or R.axes R. axes measures the link between table R and axes (axesQ)*/ freetab(tabc1); freetab(axesQ); } if ((*typeTest==1) || (*typeTest==3)) { /*axes or Q.axes*/ freetab(tabl1); freetab(axesR); } } /*==================================================================*/ /*==================== Utilities =====================*/ /*==================================================================*/ void calculkhi2 (double **obs, double *res){ /* calcul le chi2 et G pour une table de contingence */ /* les deux statistiques sont mises dans res. nl et nc sont nb de lignes et de colonnes */ /* res1 contient chi2 et res2 contient G */ double **theo,tot=0; double *rowsum,*colsum,res1,res2; int i,j,nl,nc; nl=obs[0][0]; nc = obs[1][0]; taballoc (&theo, nl, nc); vecalloc (&rowsum,nl); vecalloc (&colsum,nc); /* calcul des totaux*/ for (i=1; i<=nl; i++) { for (j=1; j<=nc; j++) { rowsum[i] = rowsum[i]+obs[i][j]; colsum[j] = colsum[j]+obs[i][j]; tot=tot+obs[i][j]; } } /* calcul des effectis theoriques*/ for (i=1; i<=nl; i++) { for (j=1; j<=nc; j++) { theo[i][j] = rowsum[i]*colsum[j]/tot; } } /* calcul des statistiques*/ res1=0; res2=0; for (i=1; i<=nl; i++) { for (j=1; j<=nc; j++) { res1 = res1+pow(theo[i][j]-obs[i][j],2)/theo[i][j]; /* chi2*/ if (obs[i][j]>0) res2= res2+2*obs[i][j]*log(obs[i][j]/theo[i][j]); /* G */ } } freevec(rowsum); freevec(colsum); freetab(theo); res[1]=res1; res[2]=res2; } /*==================================================================*/ double calculkhi2surn (double **obs){ /* calcul le chi2 sur n pour une table de contingence */ /* nl et nc sont nb de lignes et de colonnes */ double **theo,tot=0; double *rowsum,*colsum,res1; int i,j,nl,nc; nl=obs[0][0]; nc = obs[1][0]; taballoc (&theo, nl, nc); vecalloc (&rowsum,nl); vecalloc (&colsum,nc); /* calcul des totaux*/ for (i=1; i<=nl; i++) { for (j=1; j<=nc; j++) { rowsum[i] = rowsum[i]+obs[i][j]; colsum[j] = colsum[j]+obs[i][j]; tot=tot+obs[i][j]; } } /* calcul des effectis theoriques*/ for (i=1; i<=nl; i++) { for (j=1; j<=nc; j++) { theo[i][j] = rowsum[i]*colsum[j]/tot; } } /* calcul des statistiques*/ res1=0; for (i=1; i<=nl; i++) { for (j=1; j<=nc; j++) { res1 = res1+pow(theo[i][j]-obs[i][j],2)/theo[i][j]; /* chi2*/ } } freevec(rowsum); freevec(colsum); freetab(theo); res1=res1/tot; return(res1); } /*==================================================================*/ void vecstandar (double *tab, double *poili, double n) /*-------------------------------------------------- * tab est un vecteur * poili est un vecteur n composantes avec somme par ligne (somme total dans n) * la procedure retourne tab norme par colonne * pour la ponderation poili variance en 1/n --------------------------------------------------*/ { double poid, z, v2,x; int i, l1; double moy=0, var=0; l1 = tab[0]; /*-------------------------------------------------- * calcul du tableau centre/norme --------------------------------------------------*/ for (i=1;i<=l1;i++) { poid = poili[i]; moy = moy + tab[i] * (poid/n); } for (i=1;i<=l1;i++) { poid=poili[i]; x = tab[i] - moy; var = var + (poid/n) * x * x; } v2 = var; if (v2<=0) v2 = 1; v2 = sqrt(v2); var = v2; for (i=1;i<=l1;i++) { z = (tab[i] - moy)/var; tab[i] = z; } } /*=============================================================*/ double calculcorr (double **XL, double *varx, double *vary){ /* calcul la correlation entre varx (n) et vary (p) avec le lien exprime par L (n,p) */ int i,j,l1,c1; double sumL=0, *poiR, *poiQ, *Ly, res=0; l1 = XL[0][0]; c1 = XL[1][0]; vecalloc (&poiR, l1); vecalloc (&poiQ, c1); vecalloc (&Ly, l1); /* normalisation des deux vecteurs avec poids provenant de L*/ for (i=1; i<=l1; i++) { for (j=1; j<=c1; j++) { poiR[i] = poiR[i]+XL[i][j]; poiQ[j] = poiQ[j]+XL[i][j]; sumL=sumL+XL[i][j]; } } vecstandar(varx, poiR, sumL); vecstandar(vary, poiQ, sumL); /* calcul de D*/ for (i=1; i<=l1; i++) { for (j=1; j<=c1; j++) { Ly[i]=Ly[i]+XL[i][j]*vary[j]; } } for (i=1; i<=l1; i++) {res=res+(Ly[i]*varx[i]);} res=res/sumL; freevec(poiR); freevec(poiQ); freevec(Ly); return(res); } /*=========================================================================*/ double calculF(double **XL, double **XQual, double *XQuant, double *D){ /* Fonction qui prend une variable quantitative (n) et une qualitative (p) et une table de contingence L (n p) qui calcul la valeur de D et la valeur d'un pseudo F (var inter/var intra) */ /* If the permutation is not valid for the class i, D[i] = -999. If the complete permutation is not valid F=-999*/ /* Calcul de la valeur de d et F pour ces deux variables */ double *SY,*SY2,SX=0, SX2=0,*compt,tot=0,F; int lL,cL, i, j, nclass,*classvec,kk=0; double ScIntra, ScTotal,temp; lL = XL[0][0]; cL = XL[1][0]; nclass = XQual[1][0]; /* Allocation locale */ vecalloc (&compt,nclass); vecalloc(&SY,nclass); vecalloc(&SY2,nclass); vecintalloc(&classvec,cL); /* compt contient le nombre d'individus par classe et classvec le numero de classe de chaque individu*/ for (i=1; i<=cL; i++) { for (j=1; j<=nclass; j++){ if (XQual[i][j]==1){ classvec[i]=j; } } } /* Calcul des statistiques*/ for (i=1; i<=lL; i++) // Pour chaque ligne de XL { for (j=1; j<=cL; j++) // Pour chaque colone de XL { if(XL[i][j]>0)// Si XL' n'est pas nul { compt[classvec[j]]=compt[classvec[j]]+XL[i][j];/*nb d'individu par classe*/ tot=tot+XL[i][j]; /*nb total d'individu*/ SX=SX+XL[i][j]*XQuant[i]; /* somme des x */ SX2=SX2+XL[i][j]*XQuant[i]*XQuant[i]; /* somme des x^2 */ SY[classvec[j]]=SY[classvec[j]]+XL[i][j]*XQuant[i]; SY2[classvec[j]]=SY2[classvec[j]]+XL[i][j]*XQuant[i]*XQuant[i]; } } } ScTotal=SX2-(SX*SX)/tot; /* Calcul de ScIntra */ ScIntra=0; //initialisation for (i=1;i<=nclass; i++) { if(compt[i]>1) { temp=SY2[i]-(SY[i]*SY[i])/(double)compt[i]; D[i]=temp/ScTotal; ScIntra=ScIntra+temp; kk=kk+1; } else { D[i]=-999;} } if (kk<=1) {F=-999;} else {F=((ScTotal-ScIntra)/(double)(kk-1))/(ScIntra/(double)(tot-kk));} freevec(SY); freevec(SY2); freevec(compt); freeintvec(classvec); return(F); } /*=========================================================================*/ double calculcorratio(double **XL, double **XQual, double *XQuant){ /* Fonction qui prend une variable quantitative (n) et une qualitative (p) et une table de contingence L (n p) qui calcul la valeur du rapport de correlation (SS inter/SS total) */ /* Calcul de la valeur de d et F pour ces deux variables */ double *SY,*SY2,SX=0, SX2=0,*compt,tot=0,F; int lL,cL, i, j, nclass,*classvec,kk=0; double ScIntra, ScTotal,temp; lL = XL[0][0]; cL = XL[1][0]; nclass = XQual[1][0]; /* Allocation locale */ vecalloc (&compt,nclass); vecalloc(&SY,nclass); vecalloc(&SY2,nclass); vecintalloc(&classvec,cL); /* compt contient le nombre d'individus par classe et classvec le numero de classe de chaque individu*/ for (i=1; i<=cL; i++) { for (j=1; j<=nclass; j++){ if (XQual[i][j]==1){ classvec[i]=j; } } } /* Calcul des statistiques*/ for (i=1; i<=lL; i++) // Pour chaque ligne de XL { for (j=1; j<=cL; j++) // Pour chaque colone de XL { if(XL[i][j]>0)// Si XL' n'est pas nul { compt[classvec[j]]=compt[classvec[j]]+XL[i][j];/*nb d'individu par classe*/ tot=tot+XL[i][j]; /*nb total d'individu*/ SX=SX+XL[i][j]*XQuant[i]; /* somme des x */ SX2=SX2+XL[i][j]*XQuant[i]*XQuant[i]; /* somme des x^2 */ SY[classvec[j]]=SY[classvec[j]]+XL[i][j]*XQuant[i]; SY2[classvec[j]]=SY2[classvec[j]]+XL[i][j]*XQuant[i]*XQuant[i]; } } } ScTotal=SX2-(SX*SX)/tot; /* Calcul de ScIntra */ ScIntra=0; //initialisation for (i=1;i<=nclass; i++) { if(compt[i]>1) { temp=SY2[i]-(SY[i]*SY[i])/(double)compt[i]; ScIntra=ScIntra+temp; kk=kk+1; } } if (kk<=1) {F=-999;} else {F=((ScTotal-ScIntra)/(ScTotal));} freevec(SY); freevec(SY2); freevec(compt); freeintvec(classvec); return(F); } ade4/R/0000755000176200001440000000000013621207675011301 5ustar liggesusersade4/R/plot.phylog.R0000644000176200001440000002227012576021756013710 0ustar liggesusers"plot.phylog" <- function (x, y = NULL, f.phylog = 0.5, cleaves = 1, cnodes = 0, labels.leaves = names(x$leaves), clabel.leaves = 1, labels.nodes = names(x$nodes), clabel.nodes = 0, sub = "", csub = 1.25, possub = "bottomleft", draw.box = FALSE, ...) { if (!inherits(x, "phylog")) stop("Non convenient data") leaves.number <- length(x$leaves) leaves.names <- names(x$leaves) nodes.number <- length(x$nodes) nodes.names <- names(x$nodes) if (length(labels.leaves) != leaves.number) labels.leaves <- names(x$leaves) if (length(labels.nodes) != nodes.number) labels.nodes <- names(x$nodes) leaves.car <- gsub("[_]"," ",labels.leaves) nodes.car <- gsub("[_]"," ",labels.nodes) mar.old <- par("mar") on.exit(par(mar=mar.old)) par(mar = c(0.1, 0.1, 0.1, 0.1)) if (f.phylog < 0.05) f.phylog <- 0.05 if (f.phylog > 0.95) f.phylog <- 0.95 maxx <- max(x$droot) plot.default(0, 0, type = "n", xlab = "", ylab = "", xaxt = "n", yaxt = "n", xlim = c(-maxx*0.15, maxx/f.phylog), ylim = c(-0.05, 1), xaxs = "i", yaxs = "i", frame.plot = FALSE) x.leaves <- x$droot[leaves.names] x.nodes <- x$droot[nodes.names] if (is.null(y)) y <- (leaves.number:1)/(leaves.number + 1) else y <- (leaves.number+1-y)/(leaves.number+1) names(y) <- leaves.names xcar <- maxx*1.05 xx <- c(x.leaves, x.nodes) if (clabel.leaves > 0) { for (i in 1:leaves.number) { text(xcar, y[i], leaves.car[i], adj = 0, cex = par("cex") * clabel.leaves) segments(xcar, y[i], xx[i], y[i], col = grey(0.7)) } } yleaves <- y[1:leaves.number] xleaves <- xx[1:leaves.number] if (cleaves > 0) { for (i in 1:leaves.number) { points(xx[i], y[i], pch = 21, bg=1, cex = par("cex") * cleaves) } } yn <- rep(0, nodes.number) names(yn) <- nodes.names y <- c(y, yn) for (i in 1:length(x$parts)) { w <- x$parts[[i]] but <- names(x$parts)[i] y[but] <- mean(y[w]) b <- range(y[w]) segments(xx[but], b[1], xx[but], b[2]) x1 <- xx[w] y1 <- y[w] x2 <- rep(xx[but], length(w)) segments(x1, y1, x2, y1) } if (cnodes > 0) { for (i in nodes.names) { points(xx[i], y[i], pch = 21, bg="white", cex = cnodes) } } if (clabel.nodes > 0) { scatterutil.eti(xx[names(x.nodes)], y[names(x.nodes)], nodes.car, clabel.nodes) } x <- (x.leaves - par("usr")[1])/(par("usr")[2]-par("usr")[1]) y <- y[leaves.names] xbase <- (xcar - par("usr")[1])/(par("usr")[2]-par("usr")[1]) if (csub>0) scatterutil.sub(sub, csub=csub, possub=possub) if (draw.box) box() if (cleaves > 0) points(xleaves, yleaves, pch = 21, bg=1, cex = par("cex") * cleaves) return(invisible(list(xy=data.frame(x=x, y=y), xbase= xbase, cleaves=cleaves))) } "radial.phylog" <- function (phylog, circle = 1, cleaves = 1, cnodes = 0, labels.leaves = names(phylog$leaves), clabel.leaves = 1, labels.nodes = names(phylog$nodes), clabel.nodes = 0, draw.box = FALSE) { if (!inherits(phylog, "phylog")) stop("Non convenient data") leaves.number <- length(phylog$leaves) leaves.names <- names(phylog$leaves) nodes.number <- length(phylog$nodes) nodes.names <- names(phylog$nodes) if (length(labels.leaves) != leaves.number) labels.leaves <- names(phylog$leaves) if (length(labels.nodes) != nodes.number) labels.nodes <- names(phylog$nodes) if (circle<0) stop("'circle': non convenient value") leaves.car <- gsub("[_]"," ",labels.leaves) nodes.car <- gsub("[_]"," ",labels.nodes) opar <- par(mar = par("mar"), srt = par("srt")) on.exit(par(opar)) par(mar = c(0.1, 0.1, 0.1, 0.1)) dis <- phylog$droot dis <- dis/max(dis) rayon <- circle dis <- dis * rayon dist.leaves <- dis[leaves.names] dist.nodes <- dis[nodes.names] plot.default(0, 0, type = "n", asp = 1, xlab = "", ylab = "", xaxt = "n", yaxt = "n", xlim = c(-2, 2), ylim = c(-2, 2), xaxs = "i", yaxs = "i", frame.plot = FALSE) d.rayon <- rayon/(nodes.number - 1) alpha <- 2 * pi * (1:leaves.number)/leaves.number names(alpha) <- leaves.names x <- dist.leaves * cos(alpha) y <- dist.leaves * sin(alpha) xcar <- (rayon + d.rayon) * cos(alpha) ycar <- (rayon + d.rayon) * sin(alpha) if (clabel.leaves>0) { for (i in 1:leaves.number) { segments(xcar[i], ycar[i], x[i], y[i], col = grey(0.7)) } for (i in 1:leaves.number) { par(srt = alpha[i] * 360/2/pi) text(xcar[i], ycar[i], leaves.car[i], adj = 0, cex = par("cex") * clabel.leaves) segments(xcar[i], ycar[i], x[i], y[i], col = grey(0.7)) } } if (cleaves > 0) { for (i in 1:leaves.number) points(x[i], y[i], pch = 21, bg="black", cex = par("cex") * cleaves) } ang <- rep(0, length(dist.nodes)) names(ang) <- names(dist.nodes) ang <- c(alpha, ang) for (i in 1:length(phylog$parts)) { w <- phylog$parts[[i]] but <- names(phylog$parts)[i] ang[but] <- mean(ang[w]) b <- range(ang[w]) a.seq <- c(seq(b[1], b[2], by = pi/180), b[2]) lines(dis[but] * cos(a.seq), dis[but] * sin(a.seq)) x1 <- dis[w] * cos(ang[w]) y1 <- dis[w] * sin(ang[w]) x2 <- dis[but] * cos(ang[w]) y2 <- dis[but] * sin(ang[w]) segments(x1, y1, x2, y2) } if (cnodes > 0) { for (i in 1:length(phylog$parts)) { w <- phylog$parts[[i]] but <- names(phylog$parts)[i] ang[but] <- mean(ang[w]) points(dis[but] * cos(ang[but]), dis[but] * sin(ang[but]), pch = 21, bg="white", cex = par("cex") * cnodes) } } points(0, 0, pch = 21, cex = par("cex") * 2, bg = "red") if (clabel.nodes > 0) { delta <- strwidth(as.character(length(dist.nodes)), cex = par("cex") * clabel.nodes) for (j in 1:length(dist.nodes)) { i <- names(dist.nodes)[j] par(srt = (ang[i] * 360/2/pi + 90)) x1 <- dis[i] * cos(ang[i]) y1 <- dis[i] * sin(ang[i]) symbols(x1, y1, delta, bg = "white", add = TRUE, inches = FALSE) text(x1, y1, nodes.car[j], adj = 0.5, cex = par("cex") * clabel.nodes) } } if (draw.box) box() return(invisible()) } ####################################################################################### enum.phylog<-function (phylog, no.over=1000) { # Pour chaque phylogénie phylog, il existe un grand nombre de représentations # toutes équivalentes ssociées à la même topologie # Il y en a exactement 2^k pour une phylogénie résolue # (que des dichotomies), ou k représente le nombre de noeuds # Cette fonction énumère tous les possibles if (!inherits(phylog, "phylog")) stop("Object 'phylog' expected") leaves.number<- length(phylog$leaves) leaves.names<- names(phylog$leaves) # les descendants sont pris par la racine parts <- rev(phylog$parts) nodes.number<- length(parts) nodes.names<- (names(parts)) nodes.dim <- unlist(lapply(parts,length)) perms.number <- prod(gamma(nodes.dim+1)) if (perms.number>no.over) { cat("Permutation number =",perms.number,"( no.over =", no.over,")\n") return(invisible()) } "perm" <- function(cha=as.character(1:n),a=matrix(1,1,1)) { n0 <- ncol(a) n <- length(cha) if (n0 == n) { a <- apply(a,c(1,2),function(x) cha[x]) return(a) } fun1 <- function(x) { xplus <- length(x)+1 fun2 <- function (j) { if (j==1) w <- c(xplus,x) else if (j==xplus) w <- c(x,xplus) else w <- c(x[1:j-1],xplus,x[j:length(x)]) return(w) } return(sapply(1:(length(x)+1) , fun2)) } a <- matrix(unlist(apply(a,1,fun1)),ncol=n0+1,byrow=TRUE) Recall(cha,a) } res <- matrix (1,1,1) lw <- lapply(parts,perm) names(lw) <- nodes.names res <- lw[[1]] lw[[1]]<- NULL "permtot" <- function (matcar) { n1 <- nrow(res) ; n2 <- nrow(matcar) p1 <- ncol(res) ; p2 <- ncol(matcar) f1 <- function(x) unlist(apply(res,1,function(y) c(y,x))) res <<- matrix(unlist(apply(matcar,1,f1)),n1*n2, p1+p2,byrow=TRUE) } lapply(lw, permtot) ############################################## fac <- factor(rep(1:nodes.number,nodes.dim)) renum <- function (cha) { cha <- split(cha, fac) names(cha) <- nodes.names w <- cha[[1]] for (j in nodes.names[-1]) { k <- which(w==j) wcha <- cha[[j]] if (k==1) w <- c(wcha,w[-k]) else if (k == length(w)) w <- c(w[-k],wcha) else w <- c(w[1:(k-1)],wcha,w[(k+1):length(w)]) } res <- 1:leaves.number names(res) <- w return(res[leaves.names]) } return(t(apply(res,1,renum))) } ade4/R/dudi.pco.R0000644000176200001440000000724413211775710013133 0ustar liggesusers"dudi.pco" <- function (d, row.w = "uniform", scannf = TRUE, nf = 2, full = FALSE, tol = 1e-07) { if (!inherits(d, "dist")) stop("Distance matrix expected") if (full) scannf <- FALSE distmat <- as.matrix(d) n <- ncol(distmat) rownames <- attr(d, "Labels") if (any(is.na(d))) stop("missing value in d") if (is.null(rownames)) rownames <- as.character(1:n) if (any(row.w == "uniform")) { row.w <- rep(1, n) } else { if (length(row.w) != n) stop("Non convenient length(row.w)") if (any(row.w < 0)) stop("Non convenient row.w (p<0)") if (any(row.w == 0)) stop("Non convenient row.w (p=0)") } row.w <- row.w/sum(row.w) delta <- -0.5 * bicenter.wt(distmat * distmat, row.wt = row.w, col.wt = row.w) wsqrt <- sqrt(row.w) delta <- delta * wsqrt delta <- t(t(delta) * wsqrt) eig <- eigen(delta, symmetric = TRUE) lambda <- eig$values w0 <- lambda[n]/lambda[1] if (w0 < -tol) warning("Non euclidean distance") r <- sum(lambda > (lambda[1] * tol)) if (scannf) { if (exists("ade4TkGUIFlag")) { nf <- ade4TkGUI::chooseaxes(lambda, length(lambda)) } else { barplot(lambda) cat("Select the number of axes: ") nf <- as.integer(readLines(n = 1)) messageScannf(match.call(), nf) } } if (nf <= 0) nf <- 2 if (nf > r) nf <- r if (full) nf <- r res <- list() res$eig <- lambda[1:r] # valeurs propres variances des coordonnees res$rank <- r # rang de la representation euclidienne res$nf <- nf # nombre de facteurs conserves res$cw <- rep(1, r) # poids des colonnes unitaires w <- t(t(eig$vectors[, 1:r]) * sqrt(lambda[1:r]))/wsqrt w <- data.frame(w) names(w) <- paste("A", 1:r, sep = "") row.names(w) <- rownames res$tab <- w # res$tab contient la representation euclidienne globale # tous les scores de variance lambda superieure a tol*(la plus grande) res$li <- data.frame(w[, 1:nf]) names(res$li) <- names(res$tab)[1:nf] # res$li contient la representation euclidienne # les nf premiers scores conserves # cas particulier d'un tableau de coordonnees dont on fait l'ACP w <- eig$vectors[, 1:nf]/wsqrt w <- data.frame(w) names(w) <- paste("RS", 1:nf, sep = "") row.names(w) <- rownames res$l1 <- w # res$l1 contient les scores normes # pour la ponderation des individus # Cette pco admet une ponderation de centrage arbitraire # plus generale que cmdscale w <- data.frame(diag(1, r)) row.names(w) <- names(res$tab) res$c1 <- data.frame(w[, 1:nf]) names(res$c1) <- paste("CS", (1:nf), sep = "") # res$c1 contient le debut de la base canonique # cas particulier d'un tableau de coordonnees dont on fait l'ACP w <- data.frame(matrix(0, r, nf)) w[1:nf, 1:nf] <- diag(sqrt(lambda[1:nf]),nrow=nf) names(w) <- paste("Comp", (1:nf), sep = "") row.names(w) <- names(res$tab) res$co <- w # res$co indique que la variable est le composante * la norme res$lw <- row.w # re$lw est le poids des lignes introduits si non uniforme res$call <- match.call() class(res) <- c("pco", "dudi") return(res) } "scatter.pco" <- function (x, xax = 1, yax = 2, clab.row = 1, posieig = "top", sub = NULL, csub = 2, ...) { if (!inherits(x, "pco")) stop("Object of class 'pco' expected") opar <- par(mar = par("mar")) on.exit(par(opar)) coolig <- x$li[, c(xax, yax)] s.label(coolig, clabel = clab.row, sub=sub, csub=csub) add.scatter.eig(x$eig, x$nf, xax, yax, posi = posieig, ratio = 1/4) } ade4/R/procuste.rtest.R0000644000176200001440000000167513050632301014421 0ustar liggesusers"procuste.rtest" <- function (df1, df2, nrepet = 99, ...) { if (!is.data.frame(df1)) stop("data.frame expected") if (!is.data.frame(df2)) stop("data.frame expected") l1 <- nrow(df1) if (nrow(df2) != l1) stop("Row numbers are different") if (any(row.names(df2) != row.names(df1))) stop("row names are different") X <- scale(df1, scale = FALSE) Y <- scale(df2, scale = FALSE) var1 <- apply(X, 2, function(x) sum(x^2)) var2 <- apply(Y, 2, function(x) sum(x^2)) tra1 <- sum(var1) tra2 <- sum(var2) X <- X/sqrt(tra1) Y <- Y/sqrt(tra2) X <- as.matrix(X) Y <- as.matrix(Y) obs <- sum(svd(t(X) %*% Y)$d) if (nrepet == 0) return(obs) perm <- matrix(0, nrow = nrepet, ncol = 1) perm <- apply(perm, 1, function(x) sum(svd(t(X) %*% Y[sample(l1), ])$d)) w <- as.randtest(obs = obs, sim = perm, call = match.call(), ...) return(w) } ade4/R/ktab.list.df.R0000644000176200001440000000325212576021756013713 0ustar liggesusers"ktab.list.df" <- function (obj, rownames = NULL, colnames = NULL, tabnames = NULL, w.row = rep(1, nrow(obj[[1]])), w.col = lapply(obj, function(x) rep(1/ncol(x), ncol(x)))) { obj <- as.list(obj) if (any(unlist(lapply(obj, function(x) !inherits(x, "data.frame"))))) stop("list of 'data.frame' object expected") nblo <- length(obj) res <- list() nlig <- nrow(obj[[1]]) blocks <- unlist(lapply(obj, function(x) ncol(x))) cn <- unlist(lapply(obj, names)) if (is.null(rownames)) rownames <- row.names(obj[[1]]) else if (length(rownames) != length(row.names(obj[[1]]))) stop("Non convenient rownames length") if (is.null(colnames)) colnames <- cn else if (length(colnames) != length(cn)) stop("Non convenient colnames length") if (is.null(names(obj))) tn <- paste("Ana", 1:nblo, sep = "") else tn <- names(obj) if (is.null(tabnames)) tabnames <- tn else if (length(tabnames) != length(tn)) stop("Non convenient tabnames length") if (nlig != length(w.row)) stop("Non convenient length for w.row") n1 <- unlist(lapply(w.col, length)) n2 <- unlist(lapply(obj, ncol)) if (any(n1 != n2)) stop("Non convenient length in w.col") for (i in 1:nblo) { res[[i]] <- obj[[i]] } lw <- w.row cw <- unlist(w.col) names(cw) <- NULL names(blocks) <- tabnames res$blo <- blocks res$lw <- lw res$cw <- cw class(res) <- "ktab" row.names(res) <- rownames col.names(res) <- colnames tab.names(res) <- tabnames res <- ktab.util.addfactor(res) res$call <- match.call() return(res) } ade4/R/sco.quant.R0000644000176200001440000000215212576021756013341 0ustar liggesusers"sco.quant" <- function (score, df, fac = NULL, clabel = 1, abline = FALSE, sub = names(df), csub = 2, possub = "topleft") { if (!is.vector(score)) stop("vector expected for score") if (!is.numeric(score)) stop("numeric expected for score") if (!is.data.frame(df)) stop("data.frame expected for df") if (nrow(df) != length(score)) stop("Not convenient dimensions") if (!is.null(fac)) { fac <- factor(fac) if (length(fac) != length(score)) stop("Not convenient dimensions") } opar <- par(mar = par("mar"), mfrow = par("mfrow")) on.exit(par(opar)) par(mar = c(2.6, 2.6, 1.1, 1.1)) nfig <- ncol(df) par(mfrow = n2mfrow(nfig)) for (i in 1:nfig) { plot(score, df[, i], type = "n") if (!is.null(fac)) { s.class(cbind.data.frame(score, df[, i]), fac, axesell = FALSE, add.plot = TRUE, clabel = clabel) } else points(score, df[, i]) if (abline) { abline(lm(df[, i] ~ score)) } scatterutil.sub(sub[i], csub, possub) } } ade4/R/bca.coinertia.R0000644000176200001440000001532513175633655014140 0ustar liggesusersbca.coinertia <- function (x, fac, scannf = TRUE, nf = 2, ...) { if (!inherits(x, "coinertia")) stop("Xect of class coinertia expected") if (!is.factor(fac)) stop("factor expected") appel <- as.list(x$call) dudiX <- eval.parent(appel$dudiX) dudiY <- eval.parent(appel$dudiY) ligX <- nrow(dudiX$tab) if (length(fac) != ligX) stop("Non convenient dimension") mean.w <- function(x, w, fac, cla.w) { z <- x * w z <- tapply(z, fac, sum)/cla.w return(z) } cla.w <- tapply(dudiX$lw, fac, sum) tabmoyX <- apply(dudiX$tab, 2, mean.w, w = dudiX$lw, fac = fac, cla.w = cla.w) tabmoyX <- data.frame(tabmoyX) row.names(tabmoyX) <- levels(fac) names(tabmoyX) <- names(dudiX$tab) tabmoyY <- apply(dudiY$tab, 2, mean.w, w = dudiY$lw, fac = fac, cla.w = cla.w) tabmoyY <- data.frame(tabmoyY) row.names(tabmoyY) <- levels(fac) names(tabmoyY) <- names(dudiY$tab) dudimoyX <- as.dudi(tabmoyX, dudiX$cw, as.vector(cla.w), scannf = FALSE, nf = nf, call = match.call(), type = "bet") dudimoyY <- as.dudi(tabmoyY, dudiY$cw, as.vector(cla.w), scannf = FALSE, nf = nf, call = match.call(), type = "coa") res <- coinertia(dudimoyX, dudimoyY, scannf = scannf, nf = nf) res$call <- match.call() ## cov=covB+covW, donc ce n'est pas vrai pour les carres et donc la coinertie ##res$ratio <- sum(res$eig)/sum(x$eig) U <- as.matrix(res$l1) * unlist(res$lw) U <- data.frame(as.matrix(dudiY$tab) %*% U) row.names(U) <- row.names(dudiY$tab) names(U) <- names(res$lY) res$lsY <- U U <- as.matrix(res$c1) * unlist(res$cw) U <- data.frame(as.matrix(dudiX$tab) %*% U) row.names(U) <- row.names(dudiX$tab) names(U) <- names(res$lX) res$lsX <- U ratioX<-unlist(res$mX[1,]/res$lX[1,]) res$msX<-data.frame(t(t(res$lsX)*ratioX)) row.names(res$msX) <- row.names(res$lsX) names(res$msX) <- names(res$mX) ratioY<-unlist(res$mY[1,]/res$lY[1,]) res$msY<-data.frame(t(t(res$lsY)*ratioY)) row.names(res$msY) <- row.names(res$lsY) names(res$msY) <- names(res$mY) U <- as.matrix(res$l1) * unlist(res$lw) U <- data.frame(t(as.matrix(x$l1)) %*% U) row.names(U) <- paste("AxcY", (1:x$nf), sep = "") names(U) <- paste("AxbcY", (1:res$nf), sep = "") res$acY <- U names(res$aY)<-names(res$lY)<-names(res$lsY)<-names(res$acY) U <- as.matrix(res$c1) * unlist(res$cw) U <- data.frame(t(as.matrix(x$c1)) %*% U) row.names(U) <- paste("AxcX", (1:x$nf), sep = "") names(U) <- paste("AxbcX", (1:res$nf), sep = "") res$acX <- U names(res$aX)<-names(res$lX)<-names(res$lsX)<-names(res$acX) class(res) <- c("betcoi", "dudi") return(res) } plot.betcoi <- function(x, xax = 1, yax = 2, ...) { if (!inherits(x, "betcoi")) stop("Use only with 'betcoi' objects") if (x$nf == 1) { warnings("One axis only : not yet implemented") return(invisible()) } if (xax > x$nf) stop("Non convenient xax") if (yax > x$nf) stop("Non convenient yax") appel <- as.list(x$call) fac <- eval.parent(appel$fac) def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) nf <- layout(matrix(c(1, 2, 3, 4, 4, 5, 4, 4, 6), 3, 3), respect = TRUE) par(mar = c(0.1, 0.1, 0.1, 0.1)) s.arrow(x$aX, xax, yax, sub = "X axes", csub = 2, clabel = 1.25) s.arrow(x$aY, xax, yax, sub = "Y axes", csub = 2, clabel = 1.25) scatterutil.eigen(x$eig, wsel = c(xax, yax)) s.match.class(df1xy = x$msX, df2xy = x$msY, fac = fac, clabel = 1.5) # wt? s.arrow(x$l1, xax = xax, yax = yax, sub = "Y Canonical weights", csub = 2, clabel = 1.25) s.arrow(x$c1, xax = xax, yax = yax, sub = "X Canonical weights", csub = 2, clabel = 1.25) } print.betcoi <- function (x, ...) { if (!inherits(x, "betcoi")) stop("to be used with 'betcoi' object") cat("Between coinertia analysis\n") cat("call: ") print(x$call) cat("class: ") cat(class(x), "\n") cat("\n$rank (rank) :", x$rank) cat("\n$nf (axis saved) :", x$nf) cat("\n$RV (RV coeff) :", x$RV) cat("\n\neigenvalues: ") l0 <- length(x$eig) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n\n") else cat("\n\n") sumry <- array("", c(3, 4), list(1:3, c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$eig", length(x$eig), mode(x$eig), "Eigenvalues") sumry[2, ] <- c("$lw", length(x$lw), mode(x$lw), paste("Row weigths (for ", eval(x$call[[2]])$call[[3]], " cols)", sep="")) sumry[3, ] <- c("$cw", length(x$cw), mode(x$cw), paste("Col weigths (for ", eval(x$call[[2]])$call[[2]], " cols)", sep="")) print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(17, 4), list(1:17, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$tab", nrow(x$tab), ncol(x$tab), "Crossed Table (CT)") sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), paste("CT row scores (cols of ", eval(x$call[[2]])$call[[3]], ")", sep="")) sumry[3, ] <- c("$l1", nrow(x$l1), ncol(x$l1), paste("CT normed row scores (cols of ", eval(x$call[[2]])$call[[3]], ")", sep="")) sumry[4, ] <- c("$co", nrow(x$co), ncol(x$co), paste("CT col scores (cols of ", eval(x$call[[2]])$call[[2]], ")", sep="")) sumry[5, ] <- c("$c1", nrow(x$c1), ncol(x$c1), paste("CT normed col scores (cols of ", eval(x$call[[2]])$call[[2]], ")", sep="")) sumry[6, ] <- c("$lX", nrow(x$lX), ncol(x$lX), paste("Class scores (for ", eval(x$call[[2]])$call[[2]], ")", sep="")) sumry[7, ] <- c("$mX", nrow(x$mX), ncol(x$mX), paste("Normed class scores (for ", eval(x$call[[2]])$call[[2]], ")", sep="")) sumry[8, ] <- c("$lY", nrow(x$lY), ncol(x$lY), paste("Class scores (for ", eval(x$call[[2]])$call[[3]], ")", sep="")) sumry[9, ] <- c("$mY", nrow(x$mY), ncol(x$mY), paste("Normed class scores (for ", eval(x$call[[2]])$call[[3]], ")", sep="")) sumry[10, ] <- c("$lsX", nrow(x$lsX), ncol(x$lsX), paste("Row scores (rows of ", eval(x$call[[2]])$call[[2]], ")", sep="")) sumry[11, ] <- c("$msX", nrow(x$msX), ncol(x$msX), paste("Normed row scores (rows of ", eval(x$call[[2]])$call[[2]], ")", sep="")) sumry[12, ] <- c("$lsY", nrow(x$lsY), ncol(x$lsY), paste("Row scores (rows of ", eval(x$call[[2]])$call[[3]], ")", sep="")) sumry[13, ] <- c("$msY", nrow(x$msY), ncol(x$msY), paste("Normed row scores (rows of ", eval(x$call[[2]])$call[[3]], ")", sep="")) sumry[14, ] <- c("$aX", nrow(x$aX), ncol(x$aX), paste("Corr ", eval(x$call[[2]])$call[[2]], " axes / betcoi axes", sep="")) sumry[15, ] <- c("$aY", nrow(x$aY), ncol(x$aY), paste("Corr ", eval(x$call[[2]])$call[[3]], " axes / betcoi axes", sep="")) sumry[16, ] <- c("$acX", nrow(x$acX), ncol(x$acX), paste("Corr ", eval(x$call[[2]])$call[[2]], " coinertia axes / betcoi axes", sep="")) sumry[17, ] <- c("$acY", nrow(x$acY), ncol(x$acY), paste("Corr ", eval(x$call[[2]])$call[[3]], " coinertia axes / betcoi axes", sep="")) print(sumry, quote = FALSE) cat("\n") } ade4/R/witwit.R0000644000176200001440000001067212576021756012763 0ustar liggesusers"witwit.coa" <- function (dudi, row.blocks, col.blocks, scannf = TRUE, nf = 2) { if (!inherits(dudi, "coa")) stop("Object of class coa expected") lig <- nrow(dudi$tab) col <- ncol(dudi$tab) row.fac <- rep(1:length(row.blocks),row.blocks) col.fac <- rep(1:length(col.blocks),col.blocks) if (length(col.fac)!=col) stop ("Non convenient col.fac") if (length(row.fac)!=lig) stop ("Non convenient row.fac") tabinit <- as.matrix(eval.parent(as.list(dudi$call)$df)) tabinit <- tabinit/sum(tabinit) # tabinit contient les pij wrmat <- rowsum(tabinit,row.fac, reorder = FALSE)[row.fac,] wrvec <- tapply(dudi$lw,row.fac,sum)[row.fac] wrvec <- as.numeric(wrvec) wrvec <- dudi$lw/wrvec wrmat <- wrmat*wrvec # wrmat contient les pi.*pd(i)j/pd(i)+ wcmat <- rowsum(t(tabinit),col.fac, reorder = FALSE)[col.fac,] wcvec <- tapply(dudi$cw,col.fac,sum)[col.fac] wcvec <- as.numeric(wcvec) wcvec <- dudi$cw/wcvec wcmat <- t(wcmat*wcvec) # wcmat contient les pj.*pim(j)/p+m(j) wcmat <- wrmat+wcmat wrmat <- rowsum(tabinit,row.fac, reorder = FALSE) wrmat <- t(rowsum(t(wrmat),col.fac, reorder = FALSE)) wrmat <- wrmat[row.fac,col.fac] wrmat <- wrmat*wrvec wrmat <- t(t(wrmat)*wcvec) # wrmat contient les pi.*p.j*pd(i)m(j)/pd(i)+/p+m(j) tabinit <- tabinit-wcmat+wrmat # le tableau est doublement centré par classe de lignes et de colonnes tabinit <- tabinit/dudi$lw tabinit <- t(t(tabinit)/dudi$cw) tabinit <- data.frame(tabinit) ww <- as.dudi(tabinit, dudi$cw, dudi$lw, scannf = scannf, nf = nf, call = match.call(), type = "witwit") class(ww) <- c("witwit", "coa", "dudi") wr <- ww$li*ww$li*wrvec wr <- rowsum(as.matrix(wr),row.fac, reorder = FALSE) cha <- names(row.blocks) if (is.null(cha)) cha <- as.character(1:length(row.blocks)) wr <- data.frame(wr) names(wr) <- names(ww$li) row.names(wr) <- cha ww$lbvar <- wr ww$lbw <- tapply(dudi$lw,row.fac,sum) wr <- ww$co*ww$co*wcvec wr <- rowsum(as.matrix(wr),col.fac, reorder = FALSE) cha <- names(col.blocks) if (is.null(cha)) cha <- as.character(1:length(col.blocks)) wr <- data.frame(wr) names(wr) <- names(ww$co) row.names(wr) <- cha ww$cbvar <- wr ww$cbw <- tapply(dudi$cw,col.fac,sum) return(ww) } "summary.witwit" <- function (object, ...) { if (!inherits(object, "witwit")) stop("For 'witwit' object") cat("Internal correspondence analysis\n") cat("class: ") cat(class(object)) cat("\n$call: ") print(object$call) cat(object$nf, "axis-components saved") cat("\neigen values: ") l0 <- length(object$eig) cat(signif(object$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n") else cat("\n") cat("\n") cat("Eigen value decomposition among row blocks\n") nf <- object$nf nrb <- nrow(object$lbvar) aa <- as.matrix(object$lbvar) sumry <- array("", c(nrb + 1, nf + 1), list(c(row.names(object$lbvar), "mean"), c(names(object$lbvar), "weights"))) sumry[(1:nrb), (1:nf)] <- round(aa, digits = 4) sumry[(1:nrb), (nf + 1)] <- round(object$lbw, digits = 4) sumry[(nrb + 1), (1:nf)] <- round(object$eig[1:nf], digits = 4) print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(nrb + 1, nf), list(c(row.names(object$lbvar), "sum"), names(object$lbvar))) aa <- object$lbvar * object$lbw aa <- 1000 * t(t(aa)/object$eig[1:nf]) sumry[(1:nrb), (1:nf)] <- round(aa, digits = 0) sumry[(nrb + 1), (1:nf)] <- rep(1000, nf) print(sumry, quote = FALSE) cat("\n") cat("Eigen value decomposition among column blocks\n") nrb <- nrow(object$cbvar) aa <- as.matrix(object$cbvar) sumry <- array("", c(nrb + 1, nf + 1), list(c(row.names(object$cbvar), "mean"), c(names(object$cbvar), "weights"))) sumry[(1:nrb), (1:nf)] <- round(aa, digits = 4) sumry[(1:nrb), (nf + 1)] <- round(object$cbw, digits = 4) sumry[(nrb + 1), (1:nf)] <- round(object$eig[1:nf], digits = 4) print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(nrb + 1, nf), list(c(row.names(object$cbvar), "sum"), names(object$cbvar))) aa <- object$cbvar * object$cbw aa <- 1000 * t(t(aa)/object$eig[1:nf]) sumry[(1:nrb), (1:nf)] <- round(aa, digits = 0) sumry[(nrb + 1), (1:nf)] <- rep(1000, nf) print(sumry, quote = FALSE) cat("\n") } ade4/R/dudi.R0000644000176200001440000001632313211775710012351 0ustar liggesusers"as.dudi" <- function (df, col.w, row.w, scannf, nf, call, type, tol = 1e-07, full = FALSE) { if (!is.data.frame(df)) stop("data.frame expected") lig <- nrow(df) col <- ncol(df) if (length(col.w) != col) stop("Non convenient col weights") if (length(row.w) != lig) stop("Non convenient row weights") if (any(col.w < 0)) stop("col weight < 0") if (any(row.w < 0)) stop("row weight < 0") if (full) scannf <- FALSE transpose <- FALSE if(lig tol) if (scannf) { if (exists("ade4TkGUIFlag")) { nf <- ade4TkGUI::chooseaxes(eig, rank) } else { barplot(eig[1:rank]) cat("Select the number of axes: ") nf <- as.integer(readLines(n = 1)) messageScannf(call, nf) } } if (nf <= 0) nf <- 2 if (nf > rank) nf <- rank if (full) nf <- rank res$eig <- eig[1:rank] res$rank <- rank res$nf <- nf col.w[which(col.w == 0)] <- 1 row.w[which(row.w == 0)] <- 1 dval <- sqrt(res$eig)[1:nf] if(!transpose){ col.w <- 1/sqrt(col.w) auxi <- eig1$vectors[, 1:nf] * col.w auxi2 <- sweep(df.ori, 2, res$cw, "*") auxi2 <- data.frame(auxi2%*%auxi) auxi <- data.frame(auxi) names(auxi) <- paste("CS", (1:nf), sep = "") row.names(auxi) <- make.unique(names(res$tab)) res$c1 <- auxi names(auxi2) <- paste("Axis", (1:nf), sep = "") row.names(auxi2) <- row.names(res$tab) res$li <- auxi2 res$co <- sweep(res$c1,2,dval,"*") names(res$co) <- paste("Comp", (1:nf), sep = "") res$l1 <- sweep(res$li,2,dval,"/") names(res$l1) <- paste("RS", (1:nf), sep = "") } else { row.w <- 1/sqrt(row.w) auxi <- eig1$vectors[, 1:nf] * row.w auxi2 <- t(sweep(df.ori,1,res$lw,"*")) auxi2 <- data.frame(auxi2%*%auxi) auxi <- data.frame(auxi) names(auxi) <- paste("RS", (1:nf), sep = "") row.names(auxi) <- row.names(res$tab) res$l1 <- auxi names(auxi2) <- paste("Comp", (1:nf), sep = "") row.names(auxi2) <- make.unique(names(res$tab)) res$co <- auxi2 res$li <- sweep(res$l1,2,dval,"*") names(res$li) <- paste("Axis", (1:nf), sep = "") res$c1 <- sweep(res$co,2,dval,"/") names(res$c1) <- paste("CS", (1:nf), sep = "") } res$call <- call class(res) <- c(type, "dudi") return(res) } "is.dudi" <- function (x) { inherits(x, "dudi") } "print.dudi" <- function (x, ...) { cat("Duality diagramm\n") cat("class: ") cat(class(x)) cat("\n$call: ") print(x$call) cat("\n$nf:", x$nf, "axis-components saved") cat("\n$rank: ") cat(x$rank) cat("\neigen values: ") l0 <- length(x$eig) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n") else cat("\n") sumry <- array("", c(3, 4), list(1:3, c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$cw", length(x$cw), mode(x$cw), "column weights") sumry[2, ] <- c("$lw", length(x$lw), mode(x$lw), "row weights") sumry[3, ] <- c("$eig", length(x$eig), mode(x$eig), "eigen values") print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(5, 4), list(1:5, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$tab", nrow(x$tab), ncol(x$tab), "modified array") sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), "row coordinates") sumry[3, ] <- c("$l1", nrow(x$l1), ncol(x$l1), "row normed scores") sumry[4, ] <- c("$co", nrow(x$co), ncol(x$co), "column coordinates") sumry[5, ] <- c("$c1", nrow(x$c1), ncol(x$c1), "column normed scores") print(sumry, quote = FALSE) cat("other elements: ") if (length(names(x)) > 11) cat(names(x)[12:(length(x))], "\n") else cat("NULL\n") } "t.dudi" <- function (x) { if (!inherits(x, "dudi")) stop("Object of class 'dudi' expected") res <- list() res$tab <- data.frame(t(x$tab)) res$cw <- x$lw res$lw <- x$cw res$eig <- x$eig res$rank <- x$rank res$nf <- x$nf res$c1 <- x$l1 res$l1 <- x$c1 res$co <- x$li res$li <- x$co res$call <- match.call() class(res) <- c("transpo", "dudi") return(res) } "redo.dudi" <- function (dudi, newnf = 2) { if (!inherits(dudi, "dudi")) stop("Object of class 'dudi' expected") appel <- as.list(dudi$call) if (appel[[1]] == "t.dudi") { dudiold <- eval.parent(appel[[2]]) appel <- as.list(dudiold$call) appel$nf <- newnf appel$scannf <- FALSE dudinew <- eval.parent(as.call(appel)) return(t.dudi(dudinew)) } appel$nf <- newnf appel$scannf <- FALSE eval.parent(as.call(appel)) } screeplot.dudi <- function (x, npcs = length(x$eig), type = c("barplot","lines"), main = deparse(substitute(x)), col = c(rep("black",x$nf),rep("grey",npcs-x$nf)), ...){ type <- match.arg(type) pcs <- x$eig xp <- seq_len(npcs) if (type == "barplot") barplot(pcs[xp], names.arg = 1:npcs, main = main, ylab = "Inertia", xlab = "Axis", col = col, ...) else { plot(xp, pcs[xp], type = "b", axes = FALSE, main = main, xlab = "Axis", ylab = "Inertia", col = col, ...) axis(2) axis(1, at = xp, labels = 1:npcs) } invisible() } biplot.dudi <- function (x, ...){ scatter(x, ...) } summary.dudi <- function(object, ...){ cat("Class: ") cat(class(object)) cat("\nCall: ") print(object$call) cat("\nTotal inertia: ") cat(signif(sum(object$eig), 4)) cat("\n") l0 <- length(object$eig) cat("\nEigenvalues:\n") vec <- object$eig[1:(min(5, l0))] names(vec) <- paste("Ax",1:length(vec), sep = "") print(format(vec, digits = 4, trim = TRUE, width = 7), quote = FALSE) cat("\nProjected inertia (%):\n") vec <- (object$eig / sum(object$eig) * 100)[1:(min(5, l0))] names(vec) <- paste("Ax",1:length(vec), sep = "") print(format(vec, digits = 4, trim = TRUE, width = 7), quote = FALSE) cat("\nCumulative projected inertia (%):\n") vec <- (cumsum(object$eig) / sum(object$eig) * 100)[1:(min(5, l0))] names(vec)[1] <- "Ax1" if(l0>1) names(vec)[2:length(vec)] <- paste("Ax1:",2:length(vec),sep="") print(format(vec, digits = 4, trim = TRUE, width = 7), quote = FALSE) if (l0 > 5) { cat("\n") cat(paste("(Only 5 dimensions (out of ",l0, ") are shown)\n", sep="",collapse="")) } cat("\n") } ########### [.dudi ########### "[.dudi" <- function (x, i, j) { ## i: index of rows ## j: index of columns res <- unclass(x) if(!missing(i)){ res$tab <- res$tab[i, , drop = FALSE] res$li <- res$li[i, , drop = FALSE] res$l1 <- res$l1[i, , drop = FALSE] res$lw <- res$lw[i, drop = FALSE] res$lw <- res$lw / sum(res$lw) } if(!missing(j)){ res$tab <- res$tab[, j, drop = FALSE] res$co <- res$co[j, , drop = FALSE] res$c1 <- res$c1[j, , drop = FALSE] res$cw <- res$lw[j, drop = FALSE] } class(res) <- class(x) res$call <- match.call() return(res) } ade4/R/as.taxo.R0000644000176200001440000000264612576021756013013 0ustar liggesusers"as.taxo" <- function (df) { if (!inherits(df, "data.frame")) stop("df is not a data.frame") nc <- ncol(df) for (i in 1:nc) { w <- df[, i] if (!is.factor(w)) stop(paste("column", i, "of" ,deparse(substitute(df)),"is not a factor")) if (nlevels(w) == 1) stop(paste("One level in column", i, "of" ,deparse(substitute(df)))) if (nlevels(w) == length(w)) stop(paste("Column", i, "of" ,deparse(substitute(df)),"has one row in each class")) } for (i in 1:(nc - 1)) { t <- table(df[, c(i, i + 1)]) w <- apply(t, 1, function(x) sum(x != 0)) if (any(w != 1)) { print(w) stop(paste("non hierarchical design", i, "in", i + 1)) } } fac <- as.character(df[, nc]) for (i in (nc - 1):1) fac <- paste(fac,as.character(df[, i]),sep=":") df <- df[order(fac), ] class(df) <- c("data.frame", "taxo") return(df) } "dist.taxo" <- function(taxo) { if (!inherits(taxo, "taxo")) stop("class 'taxo' expected") distance<-matrix(2,nrow(taxo),nrow(taxo)) diag(distance)<-0 for (k in ncol(taxo):1) { toto=as.matrix( acm.disjonctif(as.data.frame(taxo[,k]))) distance = distance + 2*(1-toto%*%t(toto)) } dimnames(distance) <- list(row.names(taxo),row.names(taxo)) return(as.dist(sqrt(distance))) } ade4/R/mld.R0000644000176200001440000001222112576021756012200 0ustar liggesusers"mld"<- function (x, orthobas, level, na.action = c("fail", "mean"), plot=TRUE, dfxy = NULL, phylog = NULL, ...) { # on fait les vérifications sur x if (!is.numeric(x)) stop("x is not numeric") nobs <- length(x) if (any(is.na(x))) { if (na.action == "fail") stop(" missing values in 'x'") else if (na.action == "mean") x[is.na(x)] <- mean(na.omit(x)) else stop("unknown method for 'na.action'") } # on fait les vérifications sur orthobas (class, dimension, orthogonalité, orthonormalité) if (!inherits(orthobas, "data.frame")) stop ("'orthobas' is not a data.frame") if (nrow(orthobas) != nobs) stop ("non convenient dimensions") if (ncol(orthobas) != (nobs-1)) stop (paste("'orthobas' has",ncol(orthobas),"columns, expected:",nobs-1)) vecpro <- as.matrix(orthobas) w <- t(vecpro/nobs)%*%vecpro if (any(abs(diag(w)-1)>1e-07)) { stop("'orthobas' is not orthonormal for uniform weighting") } diag(w) <- 0 if ( any( abs(as.numeric(w))>1e-07) ) stop("'orthobas' is not orthogonal for uniform weighting") # on calcule les différents vecteurs associés à la décomposition orthonormale de la variable # si x n'est pas centrée, on la centre pour la pondération uniforme if (mean(x)!=0) x <- x-mean(x) # on calcul les coefficients de corrélation entre la variable et les vecteurs de la base coeff <- t(vecpro/nobs)%*%as.matrix(x) # on calcul les vecteurs associés à la décomposition et au facteur level if (!is.factor(level)) stop("'level' is not a factor") if (length(level) != (nobs-1)) stop (paste("'level' has",length(level),"values, expected:",nobs-1)) res <- matrix(0, nrow = nobs, ncol = nlevels(level)) coeff <- split(coeff, level) vecpro <- as.data.frame(t(vecpro)) vecpro <- split(vecpro, level) for (i in 1:nlevels(level)) res[,i] <- t(vecpro[[i]])%*%as.matrix(coeff[[i]]) res <- as.data.frame(res) names(res) <- paste("level", levels(level), sep=" ") # on fait les sorties graphiques si elles sont demandées: c'est pas parfait mais c'est pour donner une idée if (plot==TRUE){ # rajouter les données circulaires if (is.ts(x)){ # pour les séries temporelles u <- attributes(x)$tsp tab <- ts(res, start = u[1], end = u[2], frequency = u[3]) tab <- ts.union(x, tab) u <- range(tab) opar <- par(mfrow = par("mfrow"), mar = par("mar")) on.exit(par(opar)) mfrow <- n2mfrow(nlevels(level)+1) par(mfrow = mfrow) par(mar = c(2.5, 5, 1.5, 0.6)) plot.ts(x, ylim = u, ylab = "x", main = "multi-levels decomposition") for (i in 1:nlevels(level)) plot(tab[,i+1], ylim = u, ylab = names(res)[i], main = "") } if (is.vector(x)){ if (!is.null(dfxy)){ # pour les données 2 D opar <- par(mfrow = par("mfrow"), mar = par("mar")) on.exit(par(opar)) mfrow <- n2mfrow(nlevels(level)+1) par(mfrow = mfrow) par(mar = c(0.6, 2.6, 0.6, 0.6)) s.value(dfxy, x, sub = "x", ...) for (i in 1:nlevels(level)) if (max((1:(nobs-1))[level == levels(level)[i]])<(nobs/2)){ s.image(dfxy, res[,i]) s.value(dfxy, res[,i], sub = names(res)[i], add.plot=TRUE, ...) } else s.value(dfxy, res[,i], sub = names(res)[i], ...) } else { if (!is.null(phylog)){ # pour les données associées à une phylogénie tab <- cbind.data.frame(x, res) row.names(tab) <- names(phylog$leaves) table.phylog(tab, phylog, ...) } else { # pour les transects par(mfrow = c(nlevels(level)+1,1)) par(mar = c(2, 5, 1.5, 0.6)) u <- range(cbind(x, res)) w <- trunc(u) w <- c(w[1],0,w[2]) plot(x, type="h", ylim = u, axes = FALSE, ylab = "x", main = "multi-levels decomposition") axis(side = 2, at = w, labels = as.character(w)) for (i in 1:nlevels(level)){ plot(res[,i], type="h", ylim = u, axes = FALSE, ylab = names(res)[i], main = "") axis(side = 2, at = w, labels = as.character(w)) } v <- seq(0, nobs, by = (nobs/10)) axis(side=1, at = v, labels = as.character(v)) } } } } return(res) } ############################################################################# haar2level <- function(x){ # cette fonction calcul le facteur level pour lequel l'analyse mld correspond # à l'analyse mra de la library(waveslim) # on vérifie que x=2**a a <- log(length(x))/log(2) b <- floor(a) if ((a-b)^2>1e-10) stop ("Haar is not a power of 2") #on construit les J niveaux de décomposition u <- LETTERS[1:a] v <- rep(2,a)**(0:(a-1)) level <- rep(u, v) level <- as.factor(level) return(level) } ade4/R/ktab.data.frame.R0000644000176200001440000000270212576021756014351 0ustar liggesusers"ktab.data.frame" <- function (df, blocks, rownames = NULL, colnames = NULL, tabnames = NULL, w.row = rep(1, nrow(df))/nrow(df), w.col = rep(1, ncol(df))) { if (!inherits(df, "data.frame")) stop("object 'data.frame' expected") nblo <- length(blocks) if (sum(blocks) != ncol(df)) stop("Non convenient 'blocks' parameter") if (is.null(rownames)) rownames <- row.names(df) else if (length(rownames) != length(row.names(df))) stop("Non convenient rownames length") if (is.null(colnames)) colnames <- names(df) else if (length(colnames) != length(names(df))) stop("Non convenient colnames length") if (is.null(names(blocks))) tn <- paste("Ana", 1:nblo, sep = "") else tn <- names(blocks) if (is.null(tabnames)) tabnames <- tn else if (length(tabnames) != length(tn)) stop("Non convenient tabnames length") for (x in c("lw", "cw", "blo", "TL", "TC", "T4")) tabnames[tabnames == x] <- paste(x, "*", sep = "") indica <- as.factor(rep(1:nblo, blocks)) res <- list() for (i in 1:nblo) { res[[i]] <- df[, indica == i] } names(blocks) <- tabnames res$lw <- w.row res$cw <- w.col res$blo <- blocks class(res) <- "ktab" row.names(res) <- rownames col.names(res) <- colnames tab.names(res) <- tabnames res <- ktab.util.addfactor(res) res$call <- match.call() return(res) } ade4/R/foucart.R0000644000176200001440000001536413276234364013101 0ustar liggesusers"foucart" <- function (X, scannf = TRUE, nf = 2) { if (!is.list(X)) stop("X is not a list") nblo <- length(X) if (!all(unlist(lapply(X, is.data.frame)))) stop("a component of X is not a data.frame") # vérification que chaque tableau de la liste a les # mêmes dimensions blocks <- unlist(lapply(X, ncol)) if (length(unique(blocks)) != 1) stop("non equal col numbers among array") blocks <- unlist(lapply(X, nrow)) if (length(unique(blocks)) != 1) stop("non equal row numbers among array") r.n <- row.names(X[[1]]) for (i in 1:nblo) { r.new <- row.names(X[[i]]) if (any(r.new != r.n)) stop("non equal row.names among array") } # vérification que chaque tableau de la liste a les # mêmes noms unique.col.names <- names(X[[1]]) for (i in 1:nblo) { c.new <- names(X[[i]]) if (any(c.new != unique.col.names)) stop ("non equal col.names among array") } # vérification que chaque tableau de la liste supporte # une analyse des correspondances for (i in 1:nblo) { if (any(X[[i]] < 0)) stop(paste("negative entries in data.frame", i)) if (sum(X[[i]]) <= 0) stop(paste("Non convenient sum in data.frame", i)) } X <- ktab.list.df(X) auxinames <- ktab.util.names(X) blocks <- X$blo nblo <- length(blocks) tnames <- tab.names(X) tabm <- X[[1]]/sum(X[[1]]) for (k in 2:nblo) tabm <- tabm + X[[k]]/sum(X[[k]]) tabm <- tabm/nblo row.names(tabm) <- row.names(X) names(tabm) <- unique.col.names fouc <- dudi.coa(tabm, scannf = scannf, nf = nf) fouc$call <- match.call() class(fouc) <- c("foucart", "coa", "dudi") cooli <- suprow(fouc, X[[1]])$lisup for (k in 2:nblo) { cooli <- rbind(cooli, suprow(fouc, X[[k]])$lisup) } row.names(cooli) <- auxinames$row fouc$Tli <- cooli cooco <- supcol(fouc, X[[1]])$cosup for (k in 2:nblo) { cooco <- rbind(cooco, supcol(fouc, X[[k]])$cosup) } row.names(cooco) <- auxinames$col fouc$Tco <- cooco fouc$TL <- X$TL fouc$TC <- X$TC fouc$blocks <- blocks fouc$tab.names <- tnames fouc$call <- match.call() return(fouc) } "kplot.foucart" <- function (object, xax = 1, yax = 2, mfrow = NULL, which.tab = 1:length(object$blo), clab.r = 1, clab.c = 1.25, csub = 2, possub = "bottomright", ...) { if (!inherits(object, "foucart")) stop("Object of type 'foucart' expected") opar <- par(ask = par("ask"), mfrow = par("mfrow"), mar = par("mar")) on.exit(par(opar)) if (is.null(mfrow)) mfrow <- n2mfrow(length(which.tab)) par(mfrow = mfrow) nblo <- length(object$blo) if (length(which.tab) > prod(mfrow)) par(ask = TRUE) rank.fac <- factor(rep(1:nblo, object$rank)) nf <- ncol(object$li) coolig <- object$Tli[, c(xax, yax)] coocol <- object$Tco[, c(xax, yax)] names(coocol) <- names(coolig) cootot <- rbind.data.frame(coocol, coolig) if (clab.r > 0) cpoi <- 0 else cpoi <- 2 for (ianal in which.tab) { coolig <- object$Tli[object$TL[, 1] == levels(object$TL[,1])[ianal], c(xax, yax)] coocol <- object$Tco[object$TC[, 1] == levels(object$TC[,1])[ianal], c(xax, yax)] s.label(cootot, clab = 0, cpoi = 0, sub = object$tab.names[ianal], csub = csub, possub = possub) s.label(coolig, clab = clab.r, cpoi = cpoi, add.p = TRUE) s.label(coocol, clab = clab.c, add.p = TRUE) } } "plot.foucart" <- function (x, xax = 1, yax = 2, clab = 1, csub = 2, possub = "bottomright", ...) { if (!inherits(x, "foucart")) stop("Object of type 'foucart' expected") opar <- par(ask = par("ask"), mfrow = par("mfrow"), mar = par("mar")) on.exit(par(opar)) par(mfrow = c(2, 2)) cootot <- x$li[, c(xax, yax)] auxi <- x$co[, c(xax, yax)] names(auxi) <- names(cootot) cootot <- rbind.data.frame(cootot, auxi) auxi <- x$Tli[, c(xax, yax)] names(auxi) <- names(cootot) cootot <- rbind.data.frame(cootot, auxi) auxi <- x$Tco[, c(xax, yax)] names(auxi) <- names(cootot) cootot <- rbind.data.frame(cootot, auxi) s.label(cootot, clabel = 0, cpoint = 0, sub = "Rows (Base)", csub = csub, possub = possub) s.label(x$li, xax, yax, clabel = clab, add.plot = TRUE) s.label(cootot, clabel = 0, cpoint = 0, sub = "Columns (Base)", csub = csub, possub = possub) s.label(x$co, xax, yax, clabel = clab, add.plot = TRUE) s.label(cootot, clabel = 0, cpoint = 0, sub = "Rows", csub = csub, possub = possub) s.class(x$Tli, x$TL[, 2], xax = xax, yax = yax, axesell = FALSE, clabel = clab, add.plot = TRUE) s.label(cootot, clabel = 0, cpoint = 0, sub = "Columns", csub = csub, possub = possub) s.class(x$Tco, x$TC[, 2], xax = xax, yax = yax, axesell = FALSE, clabel = clab, add.plot = TRUE) } "print.foucart" <- function (x, ...) { cat("Foucart's COA\n") cat("class: ") cat(class(x)) cat("\n$call: ") print(x$call) cat("table number:", length(x$blo), "\n") cat("\n$nf:", x$nf, "axis-components saved") cat("\n$rank: ") cat(x$rank) cat("\neigen values: ") l0 <- length(x$eig) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n") else cat("\n") cat("blo vector ", length(x$blo), " blocks\n") sumry <- array("", c(3, 4), list(rep("", 3), c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$cw", length(x$cw), mode(x$cw), "column weights") sumry[2, ] <- c("$lw", length(x$lw), mode(x$lw), "row weights") sumry[3, ] <- c("$eig", length(x$eig), mode(x$eig), "eigen values") print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(5, 4), list(rep("", 5), c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$tab", nrow(x$tab), ncol(x$tab), "modified array") sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), "row coordinates") sumry[3, ] <- c("$l1", nrow(x$l1), ncol(x$l1), "row normed scores") sumry[4, ] <- c("$co", nrow(x$co), ncol(x$co), "column coordinates") sumry[5, ] <- c("$c1", nrow(x$c1), ncol(x$c1), "column normed scores") print(sumry, quote = FALSE) cat("\n **** Intrastructure ****\n\n") sumry <- array("", c(4, 4), list(rep("", 4), c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$Tli", nrow(x$Tli), ncol(x$Tli), "row coordinates (each table)") sumry[2, ] <- c("$Tco", nrow(x$Tco), ncol(x$Tco), "col coordinates (each table)") sumry[3, ] <- c("$TL", nrow(x$TL), ncol(x$TL), "factors for Tli") sumry[4, ] <- c("$TC", nrow(x$TC), ncol(x$TC), "factors for Tco") print(sumry, quote = FALSE) cat("\n") } ade4/R/fourthcorner2.R0000644000176200001440000001554513050632301014220 0ustar liggesusers"fourthcorner2" <- function(tabR, tabL, tabQ, modeltype = 6,nrepet = 999, tr01 = FALSE, p.adjust.method.G = p.adjust.methods, ...) { ## tabR ,tabL, tabQ are 3 data frames containing the data ## permut.model is the permutational model and can take 6 values (1:6). 6 corresponds to the combined approach ## ------------------------------- ## Test of the different arguments ## ------------------------------- if (!is.data.frame(tabR)) stop("data.frame expected") if (!is.data.frame(tabL)) stop("data.frame expected") if (!is.data.frame(tabQ)) stop("data.frame expected") if (any(is.na(tabR))) stop("na entries in table") if (any(is.na(tabL))) stop("na entries in table") if (any(tabL<0)) stop("negative values in table L") if (any(is.na(tabQ))) stop("na entries in table") p.adjust.method.G <- match.arg(p.adjust.method.G) if (sum(modeltype==(1:6))!=1) stop("modeltype should be 1, 2, 3, 4, 5 or 6") if(modeltype == 6){ test1 <- fourthcorner2(tabR, tabL, tabQ, modeltype = 2,nrepet = nrepet, tr01 = tr01, p.adjust.method.G = p.adjust.method.G, ...) test2 <- fourthcorner2(tabR, tabL, tabQ, modeltype = 4,nrepet = nrepet, tr01 = tr01, p.adjust.method.G = p.adjust.method.G, ...) res <- combine.4thcorner(test1,test2) res$call <- res$tabG$call <- res$trRLQ$call <- match.call() return(res) } nrowL <- nrow(tabL) ncolL <- ncol(tabL) nrowR <- nrow(tabR) nrowQ <- nrow(tabQ) nvarQ <- ncol(tabQ) nvarR <- ncol(tabR) if (nrowR != nrowL) stop("Non equal row numbers") if (nrowQ != ncolL) stop("Non equal row numbers") ## transform the data into prsence-absence if trO1 = TRUE if (tr01) { cat("Values in table L are 0-1 transformed\n") tabL <- ifelse(tabL==0,0,1) } ## ------------------------------------------ ## Create the data matrices for R and Q ## Transform factors into dsjunctive tables ## tabR becomes matR and tabQ becomes matQ ## ------------------------------------------ ## For tabR matR <- matrix(0, nrowR, 1) provinames <- "tmp" assignR <- NULL k <- 0 indexR <- rep(0, nvarR) for (j in 1:nvarR) { ## Get the type of data ## The type is store in the index vector (1 for numeric / 2 for factor) if (is.numeric(tabR[, j])) { indexR[j] <- 1 matR <- cbind(matR, tabR[, j]) provinames <- c(provinames, names(tabR)[j]) k <- k + 1 assignR <- c(assignR, k) } else if (is.factor(tabR[, j])) { indexR[j] <- 2 if (is.ordered(tabR[, j])) warning("ordered variables will be considered as factor") w <- fac2disj(tabR[, j], drop = TRUE) cha <- paste(substr(names(tabR)[j], 1, 5), ".", names(w), sep = "") matR <- cbind(matR, w) provinames <- c(provinames, cha) k <- k + 1 assignR <- c(assignR, rep(k, length(cha))) } else stop("Not yet available") } matR <- data.frame(matR[, -1]) names(matR) <- provinames[-1] ncolR <- ncol(matR) ## ---------- ## For tabQ matQ <- matrix(0, nrowQ, 1) provinames <- "tmp" assignQ <- NULL k <- 0 indexQ <- rep(0, nvarQ) for (j in 1:nvarQ) { ## Get the type of data ## The type is store in the index vector (1 for numeric / 2 for factor) if (is.numeric(tabQ[, j])) { indexQ[j] <- 1 matQ <- cbind(matQ, tabQ[, j]) provinames <- c(provinames, names(tabQ)[j]) k <- k + 1 assignQ <- c(assignQ, k) } else if (is.factor(tabQ[, j])) { indexQ[j] <- 2 if (is.ordered(tabQ[, j])) warning("ordered variables will be considered as factor") w <- fac2disj(tabQ[, j], drop = TRUE) cha <- paste(substr(names(tabQ)[j], 1, 5), ".", names(w), sep = "") matQ <- cbind(matQ, w) provinames <- c(provinames, cha) k <- k + 1 assignQ <- c(assignQ, rep(k, length(cha))) } } matQ <- data.frame(matQ[, -1]) names(matQ) <- provinames[-1] ncolQ <- ncol(matQ) ## ---------- ##----- create objects to store results -------# tabG <- matrix(0,nrepet + 1, nvarR * nvarQ) trRLQ <- rep(0, nrepet + 1) res <- list() ##------------------ ## Call the C code ##------------------ res <- .C("quatriemecoin2", as.double(t(matR)), as.double(t(tabL)), as.double(t(matQ)), as.integer(ncolR), as.integer(nvarR), as.integer(nrowL), as.integer(ncolL), as.integer(ncolQ), as.integer(nvarQ), as.integer(nrepet), modeltype = as.integer(modeltype), tabG = as.double(tabG), trRLQ = as.double(trRLQ), as.integer(indexR), as.integer(indexQ), as.integer(assignR), as.integer(assignQ), PACKAGE="ade4")[c("tabG", "trRLQ")] ##-------------------------------------------------------------------# ## Outputs # ##-------------------------------------------------------------------# res$varnames.R <- names(tabR) res$colnames.R <- names(matR) res$varnames.Q <- names(tabQ) res$colnames.Q <- names(matQ) res$indexQ <- indexQ res$assignQ <- assignQ res$assignR <- assignR res$indexR <- indexR ## set invalid permutation to NA (in the case of levels of a factor with no observation) res$tabG <- ifelse(res$tabG < (-998), NA, res$tabG) ## Reshape the tables res$tabG <- matrix(res$tabG, nrepet + 1, nvarR * nvarQ, byrow=TRUE) ## Create vectors to store type of statistics and alternative hypotheses names.stat.G <- vector(mode="character") alter.G <- rep("greater", nvarQ * nvarR) for (i in 1:nvarQ){ for (j in 1:nvarR){ ## Type of statistics for G if ((res$indexR[j]==1)&(res$indexQ[i]==1)) names.stat.G <- c(names.stat.G, "r^2") if ((res$indexR[j]==1)&(res$indexQ[i]==2)) names.stat.G <- c(names.stat.G, "Eta^2") if ((res$indexR[j]==2)&(res$indexQ[i]==1)) names.stat.G <- c(names.stat.G, "Eta^2") if ((res$indexR[j]==2)&(res$indexQ[i]==2)) names.stat.G <- c(names.stat.G, "Chi2/sum(L)") } } provinames <- apply(expand.grid(res$varnames.R, res$varnames.Q), 1, paste, collapse=" / ") res$tabG <- as.krandtest(obs = res$tabG[1, ], sim = res$tabG[-1, ,drop = FALSE], names = provinames, alter = alter.G, call = match.call(), p.adjust.method = p.adjust.method.G, ...) res$trRLQ <- as.randtest(obs = res$trRLQ[1], sim = res$trRLQ[-1], alter = "greater", call = match.call(), ...) res$tabG$statnames <- names.stat.G res$call <- match.call() res$model <- modeltype res$npermut <- nrepet class(res) <- c("4thcorner", "4thcorner.rlq") return(res) } ade4/R/sco.distri.R0000644000176200001440000000534312576021756013514 0ustar liggesusers"sco.distri" <- function (score, df, y.rank = TRUE, csize = 1, labels = names(df), clabel = 1, xlim = NULL, grid = TRUE, cgrid = 0.75, include.origin = TRUE, origin = 0, sub = NULL, csub = 1) { if (!is.vector(score)) stop("vector expected for score") if (!is.numeric(score)) stop("numeric expected for score") if (!is.data.frame(df)) stop("data.frame expected for df") if (any(df < 0)) stop("data >=0 expected in df") n <- length(score) if ((nrow(df) != n)) stop("Non convenient match") n <- length(score) nvar <- ncol(df) opar <- par(mar = par("mar")) on.exit(par(opar)) par(mar = c(0.1, 0.1, 0.1, 0.1)) ymin <- scoreutil.base(y = score, xlim = xlim, grid = grid, cgrid = cgrid, include.origin = include.origin, origin = origin, sub = sub, csub = csub) ymax <- par("usr")[4] ylabel <- strheight("A", cex = par("cex") * max(1, clabel)) * 1.4 xmin <- par("usr")[1] xmax <- par("usr")[2] xaxp <- par("xaxp") nline <- xaxp[3] + 1 v0 <- seq(xaxp[1], xaxp[2], le = nline) if (grid) { segments(v0, rep(ymin, nline), v0, rep(ymax, nline), col = gray(0.5), lty = 1) } rect(xmin, ymin, xmax, ymax) sum.col <- apply(df, 2, sum) labels <- labels[sum.col > 0] df <- df[, sum.col > 0] nvar <- ncol(df) sum.col <- apply(df, 2, sum) df <- sweep(df, 2, sum.col, "/") y.distri <- (nvar:1) if (y.rank) { y.distri <- drop(score %*% as.matrix(df)) y.distri <- rank(y.distri) } ylabel <- strheight("A", cex = par("cex") * max(1, clabel)) * 1.4 y.distri <- (y.distri - min(y.distri))/(max(y.distri) - min(y.distri)) y.distri <- ymin + ylabel + (ymax - ymin - 2 * ylabel) * y.distri res <- matrix(0,nvar,2) for (i in 1:nvar) { w <- df[, i] y0 <- y.distri[i] x.moy <- sum(w * score) x.et <- sqrt(sum(w * (score - x.moy)^2)) res[i,1] <- x.moy res[i,2] <- x.et * x.et x1 <- x.moy - x.et * csize x2 <- x.moy + x.et * csize etiagauche <- TRUE if ((x1 - xmin) < (xmax - x2)) etiagauche <- FALSE segments(x1, y0, x2, y0) if (clabel > 0) { cha <- labels[i] cex0 <- par("cex") * clabel xh <- strwidth(cha, cex = cex0) xh <- xh + strwidth("x", cex = cex0) if (etiagauche) x0 <- x1 - xh/2 else x0 <- x2 + xh/2 text(x0, y0, cha, cex = cex0) } points(x.moy, y0, pch = 20, cex = par("cex") * 2) } res <- as.data.frame(res) names(res) <- c("mean","var") rownames(res) <- names(df) invisible(res) } ade4/R/discrimin.R0000644000176200001440000001161712576021756013415 0ustar liggesusers"discrimin" <- function (dudi, fac, scannf = TRUE, nf = 2) { if (!inherits(dudi, "dudi")) stop("Object of class dudi expected") if (!is.factor(fac)) stop("factor expected") lig <- nrow(dudi$tab) if (length(fac) != lig) stop("Non convenient dimension") rank <- dudi$rank dudi <- redo.dudi(dudi, rank) deminorm <- as.matrix(dudi$c1) * dudi$cw deminorm <- t(t(deminorm)/sqrt(dudi$eig)) cla.w <- tapply(dudi$lw, fac, sum) mean.w <- function(x) { z <- x * dudi$lw z <- tapply(z, fac, sum)/cla.w return(z) } tabmoy <- apply(dudi$l1, 2, mean.w) tabmoy <- data.frame(tabmoy) row.names(tabmoy) <- levels(fac) cla.w <- cla.w/sum(cla.w) X <- as.dudi(tabmoy, rep(1, rank), as.vector(cla.w), scannf = scannf, nf = nf, call = match.call(), type = "dis") res <- list() res$eig <- X$eig res$nf <- X$nf res$fa <- deminorm %*% as.matrix(X$c1) res$li <- as.matrix(dudi$tab) %*% res$fa w <- scalewt(dudi$tab, dudi$lw) res$va <- t(as.matrix(w)) %*% (res$li * dudi$lw) res$cp <- t(as.matrix(dudi$l1)) %*% (dudi$lw * res$li) res$fa <- data.frame(res$fa) row.names(res$fa) <- names(dudi$tab) names(res$fa) <- paste("DS", 1:X$nf, sep = "") res$li <- data.frame(res$li) row.names(res$li) <- row.names(dudi$tab) names(res$li) <- names(res$fa) w <- apply(res$li, 2, mean.w) res$gc <- data.frame(w) row.names(res$gc) <- as.character(levels(fac)) names(res$gc) <- names(res$fa) res$cp <- data.frame(res$cp) row.names(res$cp) <- names(dudi$l1) names(res$cp) <- names(res$fa) res$call <- match.call() class(res) <- "discrimin" return(res) } "plot.discrimin" <- function (x, xax = 1, yax = 2, ...) { if (!inherits(x, "discrimin")) stop("Use only with 'discrimin' objects") if ((x$nf == 1) || (xax == yax)) { if (inherits(x, "coadisc")) { appel <- as.list(x$call) df <- eval.parent(appel$df) fac <- eval.parent(appel$fac) lig <- nrow(df) if (length(fac) != lig) stop("Non convenient dimension") lig.w <- apply(df, 1, sum) lig.w <- lig.w/sum(lig.w) cla.w <- as.vector(tapply(lig.w, fac, sum)) mean.w <- function(x) { z <- x * lig.w z <- tapply(z, fac, sum)/cla.w return(z) } w <- apply(df, 2, mean.w) w <- data.frame(t(w)) sco.distri(x$fa[, xax], w, clabel = 1, xlim = NULL, grid = TRUE, cgrid = 1, include.origin = TRUE, origin = 0, sub = NULL, csub = 1) return(invisible()) } appel <- as.list(x$call) dudi <- eval.parent(appel$dudi) fac <- eval.parent(appel$fac) lig <- nrow(dudi$tab) if (length(fac) != lig) stop("Non convenient dimension") sco.quant(x$li[, 1], dudi$tab, fac = fac) return(invisible()) } if (xax > x$nf) stop("Non convenient xax") if (yax > x$nf) stop("Non convenient yax") fac <- eval.parent(as.list(x$call)$fac) def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) layout(matrix(c(1, 2, 3, 4, 4, 5, 4, 4, 6), 3, 3), respect = TRUE) par(mar = c(0.2, 0.2, 0.2, 0.2)) s.arrow(x$fa, xax = xax, yax = yax, sub = "Canonical weights", csub = 2, clabel = 1.25) s.corcircle(x$va, xax = xax, yax = yax, sub = "Cos(variates,canonical variates)", csub = 2, cgrid = 0, clabel = 1.25) scatterutil.eigen(x$eig, wsel = c(xax, yax)) s.class(x$li, fac, xax = xax, yax = yax, sub = "Scores and classes", csub = 2, clabel = 1.5) s.corcircle(x$cp, xax = xax, yax = yax, sub = "Cos(components,canonical variates)", csub = 2, cgrid = 0, clabel = 1.25) s.label(x$gc, xax = xax, yax = yax, sub = "Class scores", csub = 2, clabel = 1.25) } "print.discrimin" <- function (x, ...) { if (!inherits(x, "discrimin")) stop("to be used with 'discrimin' object") cat("Discriminant analysis\n") cat("call: ") print(x$call) cat("class: ") cat(class(x), "\n") cat("\n$nf (axis saved) :", x$nf) cat("\n\neigen values: ") l0 <- length(x$eig) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n\n") else cat("\n\n") sumry <- array("", c(5, 4), list(1:5, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$fa", nrow(x$fa), ncol(x$fa), "loadings / canonical weights") sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), "canonical scores") sumry[3, ] <- c("$va", nrow(x$va), ncol(x$va), "cos(variables, canonical scores)") sumry[4, ] <- c("$cp", nrow(x$cp), ncol(x$cp), "cos(components, canonical scores)") sumry[5, ] <- c("$gc", nrow(x$gc), ncol(x$gc), "class scores") print(sumry, quote = FALSE) cat("\n") } ade4/R/score.pca.R0000644000176200001440000000172712576021756013312 0ustar liggesusers"score.pca" <- function (x, xax = 1, which.var = NULL, mfrow = NULL, csub = 2, sub = names(x$tab), abline = TRUE, ...) { if (!inherits(x, "pca")) stop("Object of class 'pca' expected") if (x$nf == 1) xax <- 1 if ((xax < 1) || (xax > x$nf)) stop("non convenient axe number") def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) oritab <- eval.parent(as.list(x$call)[[2]]) nvar <- ncol(oritab) if (is.null(which.var)) which.var <- (1:nvar) if (is.null(mfrow)) mfrow <- n2mfrow(length(which.var)) par(mfrow = mfrow) if (prod(par("mfrow")) < length(which.var)) par(ask = TRUE) par(mar = c(2.6, 2.6, 1.1, 1.1)) score <- x$l1[, xax] for (i in which.var) { y <- oritab[, i] plot(score, y, type = "n") points(score, y, pch = 20) if (abline) abline(lm(y ~ score)) scatterutil.sub(sub[i], csub = csub, "topleft") } } ade4/R/bca.R0000644000176200001440000001106013175633655012154 0ustar liggesusers"bca" <- function (x, ...) UseMethod("bca") "bca.dudi" <- function (x, fac, scannf = TRUE, nf = 2, ...) { if (!inherits(x, "dudi")) stop("Object of class dudi expected") if (!is.factor(fac)) stop("factor expected") lig <- nrow(x$tab) if (length(fac) != lig) stop("Non convenient dimension") cla.w <- tapply(x$lw, fac, sum) mean.w <- function(x, w, fac, cla.w) { z <- x * w z <- tapply(z, fac, sum)/cla.w return(z) } tabmoy <- apply(x$tab, 2, mean.w, w = x$lw, fac = fac, cla.w = cla.w) tabmoy <- data.frame(tabmoy) row.names(tabmoy) <- levels(fac) names(tabmoy) <- names(x$tab) res <- as.dudi(tabmoy, x$cw, as.vector(cla.w), scannf = scannf, nf = nf, call = match.call(), type = "bet") res$ratio <- sum(res$eig)/sum(x$eig) U <- as.matrix(res$c1) * unlist(res$cw) U <- data.frame(as.matrix(x$tab) %*% U) row.names(U) <- row.names(x$tab) names(U) <- names(res$c1) res$ls <- U U <- as.matrix(res$c1) * unlist(res$cw) U <- data.frame(t(as.matrix(x$c1)) %*% U) row.names(U) <- names(x$li) names(U) <- names(res$li) res$as <- U class(res) <- c("between", "dudi") return(res) } "plot.between" <- function (x, xax = 1, yax = 2, ...) { bet <- x if (!inherits(bet, "between")) stop("Use only with 'between' objects") appel <- as.list(bet$call) fac <- eval.parent(appel$fac) dudi <- eval.parent(appel$x) if ((bet$nf == 1) || (xax == yax)) { lig <- nrow(dudi$tab) if (length(fac) != lig) stop("Non convenient dimension") sco.quant(bet$ls[, 1], dudi$tab, fac = fac) return(invisible()) } if (xax > bet$nf) stop("Non convenient xax") if (yax > bet$nf) stop("Non convenient yax") def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) layout(matrix(c(1, 2, 3, 4, 4, 5, 4, 4, 6), 3, 3), respect = TRUE) par(mar = c(0.2, 0.2, 0.2, 0.2)) s.arrow(bet$c1, xax = xax, yax = yax, sub = "Canonical weights", csub = 2, clabel = 1.25) s.arrow(bet$co, xax = xax, yax = yax, sub = "Variables", csub = 2, cgrid = 0, clabel = 1.25) scatterutil.eigen(bet$eig, wsel = c(xax, yax)) s.class(bet$ls, fac, wt = dudi$lw, xax = xax, yax = yax, sub = "Scores and classes", csub = 2, clabel = 1.25) s.corcircle(bet$as, xax = xax, yax = yax, sub = "Inertia axes", csub = 2, cgrid = 0, clabel = 1.25) s.label(bet$li, xax = xax, yax = yax, sub = "Classes", csub = 2, clabel = 1.25) } "print.between" <- function (x, ...) { if (!inherits(x, "between")) stop("to be used with 'between' object") cat("Between analysis\n") cat("call: ") print(x$call) cat("class: ") cat(class(x), "\n") cat("\n$nf (axis saved) :", x$nf) cat("\n$rank: ", x$rank) cat("\n$ratio: ", x$ratio) cat("\n\neigen values: ") l0 <- length(x$eig) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n\n") else cat("\n\n") sumry <- array("", c(3, 4), list(1:3, c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$eig", length(x$eig), mode(x$eig), "eigen values") sumry[2, ] <- c("$lw", length(x$lw), mode(x$lw), "group weigths") sumry[3, ] <- c("$cw", length(x$cw), mode(x$cw), "col weigths") print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(7, 4), list(1:7, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$tab", nrow(x$tab), ncol(x$tab), "array class-variables") sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), "class coordinates") sumry[3, ] <- c("$l1", nrow(x$l1), ncol(x$l1), "class normed scores") sumry[4, ] <- c("$co", nrow(x$co), ncol(x$co), "column coordinates") sumry[5, ] <- c("$c1", nrow(x$c1), ncol(x$c1), "column normed scores") sumry[6, ] <- c("$ls", nrow(x$ls), ncol(x$ls), "row coordinates") sumry[7, ] <- c("$as", nrow(x$as), ncol(x$as), "inertia axis onto between axis") print(sumry, quote = FALSE) cat("\n") } summary.between <- function(object, ...){ thetitle <- "Between-class analysis" cat(thetitle) cat("\n\n") NextMethod() appel <- as.list(object$call) dudi <- eval.parent(appel$x) cat(paste("Total unconstrained inertia (", deparse(appel$x), "): ", sep = "")) cat(signif(sum(dudi$eig), 4)) cat("\n\n") cat(paste("Inertia of", deparse(appel$x), "explained by", deparse(appel$fac), "(%): ")) cat(signif(object$ratio * 100, 4)) cat("\n\n") } ade4/R/dist.dudi.R0000644000176200001440000000147412576021756013323 0ustar liggesusers"dist.dudi" <- function (dudi, amongrow = TRUE) { if (!inherits(dudi, "dudi")) stop("Object of class 'dudi' expected") if (amongrow) { x <- t(t(dudi$tab) * sqrt(dudi$cw)) x <- x %*% t(x) y <- diag(x) x <- (-2) * x + y x <- t(t(x) + y) x <- (x + t(x))/2 diag(x) <- 0 x <- as.dist(sqrt(abs(x))) attr(x, "Labels") <- row.names(dudi$tab) attr(x, "method") <- "DUDI" return(x) } else { x <- as.matrix(dudi$tab) * sqrt(dudi$lw) x <- t(x) %*% x y <- diag(x) x <- (-2) * x + y x <- t(t(x) + y) x <- (x + t(x))/2 diag(x) <- 0 x <- as.dist(sqrt(abs(x))) attr(x, "Labels") <- names(dudi$tab) attr(x, "method") <- "DUDI" return(x) } } ade4/R/dudi.pca.R0000644000176200001440000000174612576021756013125 0ustar liggesusers"dudi.pca" <- function (df, row.w = rep(1, nrow(df))/nrow(df), col.w = rep(1, ncol(df)), center = TRUE, scale = TRUE, scannf = TRUE, nf = 2) { df <- as.data.frame(df) nc <- ncol(df) if (any(is.na(df))) stop("na entries in table") f1 <- function(v) sum(v * row.w)/sum(row.w) f2 <- function(v) sqrt(sum(v * v * row.w)/sum(row.w)) if (is.logical(center)) { if (center) { center <- apply(df, 2, f1) df <- sweep(df, 2, center) } else center <- rep(0, nc) } else if (is.numeric(center) && (length(center) == nc)) df <- sweep(df, 2, center) else stop("Non convenient selection for center") if (scale) { norm <- apply(df, 2, f2) norm[norm < 1e-08] <- 1 df <- sweep(df, 2, norm, "/") } else norm <- rep(1, nc) X <- as.dudi(df, col.w, row.w, scannf = scannf, nf = nf, call = match.call(), type = "pca") X$cent <- center X$norm <- norm X } ade4/R/s.arrow.R0000644000176200001440000000344212576021756013024 0ustar liggesusers"s.arrow" <- function (dfxy, xax = 1, yax = 2, label = row.names(dfxy), clabel = 1, pch = 20, cpoint = 0, boxes = TRUE, edge = TRUE, origin = c(0, 0), xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, cgrid = 1, sub = "", csub = 1.25, possub = "bottomleft", pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) { arrow1 <- function(x0, y0, x1, y1, len = 0.1, ang = 15, lty = 1, edge) { d0 <- sqrt((x0 - x1)^2 + (y0 - y1)^2) if (d0 < 1e-07) return(invisible()) segments(x0, y0, x1, y1, lty = lty) h <- strheight("A", cex = par("cex")) if (d0 > 2 * h) { x0 <- x1 - h * (x1 - x0)/d0 y0 <- y1 - h * (y1 - y0)/d0 if (edge) arrows(x0, y0, x1, y1, angle = ang, length = len, lty = 1) } } dfxy <- data.frame(dfxy) opar <- par(mar = par("mar")) on.exit(par(opar)) par(mar = c(0.1, 0.1, 0.1, 0.1)) coo <- scatterutil.base(dfxy = dfxy, xax = xax, yax = yax, xlim = xlim, ylim = ylim, grid = grid, addaxes = addaxes, cgrid = cgrid, include.origin = TRUE, origin = origin, sub = sub, csub = csub, possub = possub, pixmap = pixmap, contour = contour, area = area, add.plot = add.plot) if (grid & !add.plot) scatterutil.grid(cgrid) if (addaxes & !add.plot) abline(h = 0, v = 0, lty = 1) if (cpoint > 0) points(coo$x, coo$y, pch = pch, cex = par("cex") * cpoint) for (i in 1:(length(coo$x))) arrow1(origin[1], origin[2], coo$x[i], coo$y[i], edge = edge) if (clabel > 0) scatterutil.eti.circ(coo$x, coo$y, label, clabel, origin, boxes) if (csub > 0) scatterutil.sub(sub, csub, possub) box() invisible(match.call()) } ade4/R/mantel.randtest.R0000644000176200001440000000107413211777166014533 0ustar liggesusers"mantel.randtest" <- function(m1, m2, nrepet = 999, ...) { if (!inherits(m1, "dist")) stop("Object of class 'dist' expected") if (!inherits(m2, "dist")) stop("Object of class 'dist' expected") n <- attr(m1, "Size") if (n != attr(m2, "Size")) stop("Non convenient dimension") m1 <- as.matrix(m1) m2 <- as.matrix(m2) col <- ncol(m1) isim<-testmantel(nrepet, col, as.matrix(m1), as.matrix(m2)) obs<-isim[1] return(as.randtest(sim = isim[-1], obs = obs, call = match.call(), subclass = "mantelrtest", ...)) } ade4/R/supdist.R0000644000176200001440000000456013126705062013115 0ustar liggesusers"supdist" <- function (d, fsup, tol = 1e-07) { # # This function takes a distance matrix between Supplementary and Active items. # It computes the PCO of the distance matrix between Active items, and projects # the distance matrix between Supplementary and Active elements in this PCO. # Jean Thioulouse 06/2017. Based on : https://doi.org/10.1371/journal.pone.0019094 # if (!inherits(d, "dist")) stop("Distance matrix expected") n <- attr(d, "Size") if (class(fsup) != "factor") stop("Argument fsup must be a factor") if (length(fsup) != attr(d, "Size")) stop("Incompatible factor length") if (length(levels(fsup)) != 2) stop("The factor must have exactly two levels") if (any(levels(fsup) != c("A","S"))) stop("The factor must give the Active (A) / Supplementary (S) status for each item in the distance matrix") # distance matrix between Supplementary and Active items DSup <- as.matrix(d)[fsup == "S", fsup == "A", drop = FALSE] nS <- table(fsup)[2] nA <- table(fsup)[1] nT <- nS + nA Id <- diag(nrow = nA) One <- matrix(1, nrow = nA, ncol = nA) # distance matrix between Active items DAct <- as.matrix(d)[fsup == "A", fsup == "A"] # squared distances DAct <- DAct * DAct # Double centering, cross-product matrix SAct <- -0.5 * (Id - One * 1 / nA) %*% DAct %*% (Id - One * 1 / nA) # PCO of Active items eigAct<- eigen(SAct) rAct <- sum(eigAct$values > (eigAct$values[1] * tol)) # coordinates of Active items FAct <- t(t(eigAct$vectors[, 1:rAct]) * sqrt(eigAct$values[1:rAct])) OneS <- matrix(1, nrow = nS, ncol = nA) # squared distances between Supplementary and Active items DSup <- DSup * DSup # Double centering, cross-product matrix SSup <- -0.5 * (Id - One * 1 / nA) %*% (t(DSup) - DAct %*% t(OneS) * 1 / nA) # coordinates of Supplementary items FSup <- t(SSup) %*% t(t(FAct) * 1 / eigAct$values[1:rAct]) # conversion to dataframes and creation of the returned object # Supplementary items FSup <- as.data.frame(FSup) names(FSup) <- paste("A", 1:rAct, sep = "") row.names(FSup) <- attr(d, "Labels")[fsup == "S"] # Active items FAct <- as.data.frame(FAct) names(FAct) <- paste("A", 1:rAct, sep = "") row.names(FAct) <- attr(d, "Labels")[fsup == "A"] # Active + Supplementary items FTot <- rbind.data.frame(FAct, FSup) res <- list(coordSup = FSup, coordAct = FAct, coordTot = FTot) return(res) } ade4/R/rtest.discrimin.R0000644000176200001440000000327313050632301014532 0ustar liggesusers "rtest.discrimin" <- function (xtest, nrepet = 99, ...) { if (!inherits(xtest, "discrimin")) stop("'discrimin' object expected") appel <- as.list(xtest$call) dudi <- eval.parent(appel$dudi) fac <- eval.parent(appel$fac) lig <- nrow(dudi$tab) if (length(fac) != lig) stop("Non convenient dimension") rank <- dudi$rank dudi <- redo.dudi(dudi, rank) dudi.lw <- dudi$lw dudi <- dudi$l1 if ((!(identical(all.equal(dudi.lw,rep(1/nrow(dudi), nrow(dudi))),TRUE)))) { if(as.list(eval.parent(appel$dudi)$call)[[1]] == "dudi.acm" ) stop ("Not implemented for non-uniform weights in the case of dudi.acm") else if(as.list(eval.parent(appel$dudi)$call)[[1]] == "dudi.hillsmith" ) stop ("Not implemented for non-uniform weights in the case of dudi.hillsmith") else if(as.list(eval.parent(appel$dudi)$call)[[1]] == "dudi.mix" ) stop ("Not implemented for non-uniform weights in the case of dudi.mix") } between.var <- function(x, w, group, group.w) { z <- x * w z <- tapply(z, group, sum)/group.w return(sum(z * z * group.w)) } inertia.ratio <- function(perm = TRUE) { if (perm) { sigma <- sample(lig) Y <- dudi[sigma, ] Y.w <- dudi.lw[sigma] } else { Y <- dudi Y.w <- dudi.lw } cla.w <- tapply(Y.w, fac, sum) ww <- apply(Y, 2, between.var, w = Y.w, group = fac, group.w = cla.w) return(sum(ww)/rank) } obs <- inertia.ratio(perm = FALSE) sim <- unlist(lapply(1:nrepet, inertia.ratio)) return(as.randtest(sim, obs, call = match.call(), ...)) } ade4/R/plot.4thcorner.R0000644000176200001440000002712013050632301014273 0ustar liggesusersplot.4thcorner <- function(x, stat = c("D", "D2", "G"), type = c("table", "biplot"), xax = 1, yax = 2, x.rlq = NULL, alpha = 0.05, col = c("lightgrey", "red", "deepskyblue", "purple"),...) { ## function to display the results obtained with the fourthcorner, fourthcorner2 or fourthcorner.rlq functions ## biplot available only for D and D2 stats stat <- match.arg(stat) type <- match.arg(type) appel <- as.list(x$call) fctn <- appel[[1]] if(!inherits(x, "4thcorner") & !inherits(x, "4thcorner.rlq")) stop("x must be of class '4thcorner' or '4thcorner.rlq'") if(inherits(x, "4thcorner.rlq") & stat != "G") stop("stat should be 'G' for object of class '4thcorner.rlq' (created by the 'fourthcorner2' function)") if(type == "biplot" & stat == "G") stop("'biplot not available for the 'G' statistic") if((stat == "D2" | stat=="D")){ ## For D and D2 stats res <- data.frame(matrix(1, length(x$colnames.Q),length(x$colnames.R))) names(res) <- x$colnames.R row.names(res) <- x$colnames.Q if(stat == "D2") { xrand <- x$tabD2 } else { xrand <- x$tabD } for(i in 1:nrow(res)){ for(j in 1:ncol(res)){ ## in res, 1 corresponds to white, 2 to dark grey and 3 to light grey idx.var <- ncol(res) * (i - 1) + j if(!is.na(xrand$adj.pvalue[idx.var])){ if(xrand$adj.pvalue[idx.var] < alpha){ ## for significant associations res[i,j] <- ifelse(xrand$alter[idx.var]=="greater", 2, 3) if((x$indexR[x$assignR[j]]==1) != (x$indexQ[x$assignQ[i]]==1)){ if(stat == "D") ## homogeneity has no sign and test only "positive" association res[i,j] <- 2 if(stat == "D2") ## sign of the correlation (two-sided test) res[i,j] <- ifelse(xrand$obs[idx.var] > 0, 2, 3) } else if((x$indexR[x$assignR[j]]==1) & (x$indexQ[x$assignQ[i]]==1)){ ## sign of the correlation (two-sided test) res[i,j] <- ifelse(xrand$obs[idx.var] > 0, 2, 3) } else if((x$indexR[x$assignR[j]]==2) & (x$indexQ[x$assignQ[i]]==2)){ ## sign relative to the mean of permuted values res[i,j] <- ifelse(xrand$obs[idx.var] > xrand$expvar$Expectation[idx.var], 2, 3) } } } } } } else if(stat=="G"){ ## for G stats res <- data.frame(matrix(1, length(x$varnames.Q),length(x$varnames.R))) names(res) <- x$varnames.R row.names(res) <- x$varnames.Q xrand <- x$tabG for(i in 1:nrow(res)){ for(j in 1:ncol(res)){ idx.var <- ncol(res) * (i - 1) + j if(xrand$adj.pvalue[idx.var] < alpha){ res[i,j] <- ifelse(xrand$alter[idx.var]=="greater", 2, 3) if((x$indexR[j]==1) & (x$indexQ[i]==1)){ ## sign of the correlation (two-sided test) res[i,j] <- ifelse(xrand$obs[idx.var] > 0, 2, 3) } } } } } table4thcorner <- function (df, stat, assignR, assignQ, col) { ## plot results as a table with white, light grey and dark grey x1 <- 1:ncol(df) y <- nrow(df):1 opar <- par(mai = par("mai"), srt = par("srt")) on.exit(par(opar)) table.prepare(x = x1, y = y, row.labels = row.names(df), col.labels = names(df), clabel.row = 1, clabel.col = 1, grid = FALSE, pos = "paint") xtot <- x1[col(as.matrix(df))] ytot <- y[row(as.matrix(df))] xdelta <- (max(x1) - min(x1))/(length(x1) - 1)/2 ydelta <- (max(y) - min(y))/(length(y) - 1)/2 ##valgris <- c("white","grey20","grey80") z <- unlist(df) rect(xtot - xdelta, ytot - ydelta, xtot + xdelta, ytot + ydelta, col = col[1:3][z], border = "grey90") if((stat == "D") | (stat == "D2")){ idR <- which(diff(assignR)==1) idQ <- which(diff(assignQ)==1) if(length(idR) > 0) segments(sort(unique(xtot))[idR]+xdelta, max(ytot+ydelta), sort(unique(xtot))[idR]+xdelta, min(ytot-ydelta), lwd=2) if(length(idQ) > 0) segments(max(xtot+xdelta), sort(unique(ytot), decreasing = TRUE)[idQ+1]+ydelta, min(xtot-xdelta), sort(unique(ytot), decreasing = TRUE)[idQ+1]+ydelta, lwd=2) } rect(min(xtot) - xdelta, min(ytot) - ydelta, max(xtot) + xdelta, max(ytot) + ydelta, col = NULL) } biplot.rlq4thcorner <- function (res.4thcorner, obj.rlq, stat, alpha, xax, yax, clab.traits, clab.env, col) { ## plot associations between variables on a biplot opar <- par(mar = par("mar")) on.exit(par(opar)) coolig <- obj.rlq$li[, c(xax, yax)] coocol <- obj.rlq$c1[, c(xax, yax)] s.label(coolig, clabel = 0, cpoint = 0, xlim = 1.2 * range(coolig[,1])) born <- par("usr") k1 <- min(coocol[, 1])/born[1] k2 <- max(coocol[, 1])/born[2] k3 <- min(coocol[, 2])/born[3] k4 <- max(coocol[, 2])/born[4] k <- c(k1, k2, k3, k4) coocol <- 0.9 * coocol/max(k) idx.pos <- which(t(res.4thcorner)==2, arr.ind=TRUE) ## positive association idx.neg <- which(t(res.4thcorner)==3, arr.ind=TRUE) ## negative association idx.tot <- list(unique(c(idx.pos[,1],idx.neg[,1])), unique(c(idx.pos[,2],idx.neg[,2]))) par(mar = c(0.1, 0.1, 0.1, 0.1)) ## variables with no significant links if(length(idx.tot[[1]]) > 0) { scatterutil.eti(coolig[-idx.tot[[1]],1], coolig[-idx.tot[[1]],2],label=row.names(coolig)[-idx.tot[[1]]], clabel = clab.env, boxes = FALSE, coul = rep(col[1], nrow(coolig) - length(idx.tot[[1]]))) scatterutil.eti(coocol[-idx.tot[[2]],1], coocol[-idx.tot[[2]],2],label=row.names(coocol)[-idx.tot[[2]]], clabel = clab.traits, boxes = FALSE, coul = rep(col[1], nrow(coocol) - length(idx.tot[[2]]))) } else { scatterutil.eti(coolig[,1], coolig[,2],label=row.names(coolig), clabel = clab.env, boxes = FALSE, coul = rep(col[1], nrow(coolig))) scatterutil.eti(coocol[,1], coocol[,2],label=row.names(coocol), clabel = clab.traits, boxes = FALSE, coul = rep(col[1], nrow(coocol))) } if(nrow(idx.pos) > 0) segments(coolig[idx.pos[,1],1],coolig[idx.pos[,1],2],coocol[idx.pos[,2],1],coocol[idx.pos[,2],2], lty = 1, lwd = 2, col = col[2]) if(nrow(idx.neg) > 0) segments(coolig[idx.neg[,1],1],coolig[idx.neg[,1],2],coocol[idx.neg[,2],1],coocol[idx.neg[,2],2], lty = 1, lwd = 2, col = col[3]) if(length(idx.tot[[1]]) > 0) { scatterutil.eti.circ(coolig[idx.tot[[1]],1], coolig[idx.tot[[1]],2], label=row.names(coolig)[idx.tot[[1]]], clabel = clab.env, boxes = FALSE) ##s.label(coolig[idx.tot[[1]],], clabel = clab.env, add.plot = TRUE) ##scatterutil.eti(coocol[idx.tot[[2]],1], coocol[idx.tot[[2]],2],label=row.names(coocol)[idx.tot[[2]]], clabel = clab.traits, boxes = TRUE,bg = 'grey') scatterutil.eti.circ(coocol[idx.tot[[2]],1], coocol[idx.tot[[2]],2],label=row.names(coocol)[idx.tot[[2]]], clabel = clab.traits, boxes = FALSE) points(coolig[idx.tot[[1]],], pch = 17) points(coocol[idx.tot[[2]],], pch = 19) } } biplot.axesrlq4thcorner <- function(res.4thcorner, coo, alpha, xax, yax, type.axes, col){ opar <- par(mar = par("mar")) on.exit(par(opar)) s.label(coo, clabel = 0, cpoint = 0) if(type.axes == "R.axes") res.4thcorner <- res.4thcorner[c(xax,yax),] if(type.axes == "Q.axes"){ res.4thcorner <- res.4thcorner[,c(xax,yax)] res.4thcorner <- t(res.4thcorner) } ##idx.pos.xax <- which(res.4thcorner[1,] == 2) ## positive association with xax ##idx.pos.yax <- which(res.4thcorner[2,] == 2) ## positive association with yax ##idx.neg.xax <- which(res.4thcorner[1,] == 3) ## negative association with xax ##idx.neg.yax <- which(res.4thcorner[2,] == 3) ## negative association with yax ##idx.tot <- unique(c(idx.pos.xax, idx.pos.yax, idx.neg.xax, idx.neg.yax)) idx.xax <- which((res.4thcorner[1,] > 1) & (res.4thcorner[2,] == 1)) idx.yax <- which((res.4thcorner[1,] == 1) & (res.4thcorner[2,] > 1)) idx.both <- which((res.4thcorner[1,] > 1) & (res.4thcorner[2,] > 1)) idx.tot <- c(idx.xax, idx.yax, idx.both) par(mar = c(0.1, 0.1, 0.1, 0.1)) if(length(idx.tot) > 0) { scatterutil.eti(coo[-idx.tot,1], coo[-idx.tot,2],label=row.names(coo)[-idx.tot], clabel = 1, boxes = FALSE, coul = rep(col[1], nrow(coo) - length(idx.tot))) } else { scatterutil.eti(coo[,1], coo[,2],label=row.names(coo), clabel = 1, boxes = FALSE, coul = rep(col[1], nrow(coo))) } if(length(idx.xax) > 0) scatterutil.eti(coo[idx.xax,1], coo[idx.xax,2],label=row.names(coo)[idx.xax], clabel = 1, boxes = TRUE, coul = rep(col[2], length(idx.xax))) if(length(idx.yax) > 0) scatterutil.eti(coo[idx.yax,1], coo[idx.yax,2],label=row.names(coo)[idx.yax], clabel = 1, boxes = TRUE, coul = rep(col[3], length(idx.xax))) if(length(idx.both) > 0) scatterutil.eti(coo[idx.both,1], coo[idx.both,2],label=row.names(coo)[idx.both], clabel = 1, boxes = TRUE, coul = rep(col[4], length(idx.both))) } if(type=="table"){ table4thcorner(res, stat = stat, assignR = x$assignR, assignQ = x$assignQ, col = col) } else if(type=="biplot"){ if(fctn =="fourthcorner" | fctn =="fourthcorner2"){ if (!inherits(x.rlq, "rlq")) stop("'x.rlq' should be of class 'rlq'") biplot.rlq4thcorner(res.4thcorner = res, obj.rlq = x.rlq, stat = stat, alpha = alpha, xax = xax, yax = yax, clab.traits = 1, clab.env = 1, col = col) } else if(fctn=="fourthcorner.rlq"){ obj.rlq <- eval(appel$xtest, sys.frame(0)) type.axes <- eval(appel$typetest, sys.frame(0)) if(type.axes == "axes") stop("The option 'axes' is only implemented for pedagogic purposes and is not relevant to analyse data") if(type.axes == "R.axes") coo <- obj.rlq$li[, c(xax, yax)] if(type.axes == "Q.axes") coo <- obj.rlq$co[, c(xax, yax)] biplot.axesrlq4thcorner(res.4thcorner = res, coo = coo, alpha = alpha, xax = xax, yax = yax, type.axes = type.axes, col = col) } } } ade4/R/mfa.R0000644000176200001440000001712112662336475012176 0ustar liggesusers"mfa" <- function (X, option = c("lambda1", "inertia", "uniform", "internal"), scannf = TRUE, nf = 3) { if (!inherits(X, "ktab")) stop("object 'ktab' expected") if (option[1] == "internal") { if (is.null(X$tabw)) { warning("Internal weights not found: uniform weigths are used") option <- "uniform" } } lw <- X$lw cw <- X$cw sepan <- sepan(X, nf = 4) nbloc <- length(sepan$blo) indicablo <- factor(rep(1:nbloc, sepan$blo)) rank.fac <- factor(rep(1:nbloc, sepan$rank)) ncw <- NULL tab.names <- names(X)[1:nbloc] auxinames <- ktab.util.names(X) option <- match.arg(option) if (option == "lambda1") { for (i in 1:nbloc) { ncw <- c(ncw, rep(1/sepan$Eig[rank.fac == i][1], sepan$blo[i])) } } else if (option == "inertia") { for (i in 1:nbloc) { ncw <- c(ncw, rep(1/sum(sepan$Eig[rank.fac == i]), sepan$blo[i])) } } else if (option == "uniform") ncw <- rep(1, sum(sepan$blo)) else if (option == "internal") ncw <- rep(X$tabw, sepan$blo) ncw <- cw * ncw tab <- X[[1]] for (i in 2:nbloc) { tab <- cbind.data.frame(tab, X[[i]]) } names(tab) <- auxinames$col anaco <- as.dudi(tab, col.w = ncw, row.w = lw, nf = nf, scannf = scannf, call = match.call(), type = "mfa") nf <- anaco$nf afm <- list() afm$tab.names <- names(X)[1:nbloc] afm$blo <- X$blo afm$TL <- X$TL afm$TC <- X$TC afm$T4 <- X$T4 afm$tab <- anaco$tab afm$eig <- anaco$eig afm$rank <- anaco$rank afm$li <- anaco$li afm$l1 <- anaco$l1 afm$nf <- anaco$nf afm$lw <- anaco$lw afm$cw <- anaco$cw afm$co <- anaco$co afm$c1 <- anaco$c1 projiner <- function(xk, qk, d, z) { w7 <- t(as.matrix(xk) * d) %*% as.matrix(z) iner <- apply(w7 * w7 * qk, 2, sum) return(iner) } link <- matrix(0, nbloc, nf) for (k in 1:nbloc) { xk <- X[[k]] q <- ncw[indicablo == k] link[k, ] <- projiner(xk, q, lw, anaco$l1) } link <- as.data.frame(link) names(link) <- paste("Comp", 1:nf, sep = "") row.names(link) <- tab.names afm$link <- link w <- matrix(0, nbloc * 4, nf) i1 <- 0 i2 <- 0 matl1 <- as.matrix(afm$l1) for (k in 1:nbloc) { i1 <- i2 + 1 i2 <- i2 + 4 tab <- as.matrix(sepan$L1[sepan$TL[, 1] == levels(sepan$TL[,1])[k], ]) if (ncol(tab) > 4) tab <- tab[, 1:4] if (ncol(tab) < 4) tab <- cbind(tab, matrix(0, nrow(tab), 4 - ncol(tab))) tab <- t(tab * lw) %*% matl1 for (i in 1:min(nf, 4)) { if (tab[i, i] < 0) { for (j in 1:nf) tab[i, j] <- -tab[i, j] } } w[i1:i2, ] <- tab } w <- data.frame(w) names(w) <- paste("Comp", 1:nf, sep = "") row.names(w) <- auxinames$tab afm$T4comp <- w w <- matrix(0, nrow(sepan$TL), ncol = nf) i1 <- 0 i2 <- 0 for (k in 1:nbloc) { i1 <- i2 + 1 i2 <- i2 + length(lw) qk <- ncw[indicablo == k] xk <- as.matrix(X[[k]]) w[i1:i2, ] <- (xk %*% (qk * t(xk))) %*% (matl1 * lw) } w <- data.frame(w) row.names(w) <- auxinames$row names(w) <- paste("Fac", 1:nf, sep = "") afm$lisup <- w afm$tabw <- X$tabw afm$call <- match.call() class(afm) <- c("mfa", "list") return(afm) } "plot.mfa" <- function (x, xax = 1, yax = 2, option.plot = 1:4, ...) { if (!inherits(x, "mfa")) stop("Object of type 'mfa' expected") nf <- x$nf if (xax > nf) stop("Non convenient xax") if (yax > nf) stop("Non convenient yax") opar <- par(mar = par("mar"), mfrow = par("mfrow"), xpd = par("xpd")) on.exit(par(opar)) mfrow <- n2mfrow(length(option.plot)) par(mfrow = mfrow) for (j in option.plot) { if (j == 1) { coolig <- x$lisup[, c(xax, yax)] s.class(coolig, fac = as.factor(x$TL[, 2]), label = row.names(x$li), cellipse = 0, sub = "Row projection", csub = 1.5) add.scatter.eig(x$eig, x$nf, xax, yax, posi = "topleft", ratio = 1/5) } if (j == 2) { coocol <- x$co[, c(xax, yax)] s.arrow(coocol, sub = "Col projection", csub = 1.5) add.scatter.eig(x$eig, x$nf, xax, yax, posi = "topleft", ratio = 1/5) } if (j == 3) { s.corcircle(x$T4comp[x$T4[, 2] == levels(x$T4[,2])[1], ], fullcircle = FALSE, sub = "Component projection", possub = "topright", csub = 1.5) add.scatter.eig(x$eig, x$nf, xax, yax, posi = "bottomleft", ratio = 1/5) } if (j == 4) { plot(x$link[, c(xax, yax)]) scatterutil.grid(0) title(main = "Link") par(xpd = TRUE) scatterutil.eti(x$link[, xax], x$link[, yax], label = row.names(x$link), clabel = 1) } if (j == 5) { scatterutil.eigen(x$eig, wsel = 1:x$nf, sub = "Eigen values", csub = 2, possub = "topright") } } } "print.mfa" <- function (x, ...) { if (!inherits(x, "mfa")) stop("non convenient data") cat("Multiple Factorial Analysis\n") cat(paste("list of class", class(x))) cat("\n$call: ") print(x$call) cat("$nf:", x$nf, "axis-components saved\n\n") sumry <- array("", c(6, 4), list(1:6, c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$tab.names", length(x$tab.names), mode(x$tab.names), "tab names") sumry[2, ] <- c("$blo", length(x$blo), mode(x$blo), "column number") sumry[3, ] <- c("$rank", length(x$rank), mode(x$rank), "tab rank") sumry[4, ] <- c("$eig", length(x$eig), mode(x$eig), "eigen values") sumry[5, ] <- c("$lw", length(x$lw), mode(x$lw), "row weights") sumry[6, ] <- c("$tabw", length(x$tabw), mode(x$tabw), "array weights") print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(11, 4), list(1:11, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$tab", nrow(x$tab), ncol(x$tab), "modified array") sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), "row coordinates") sumry[3, ] <- c("$l1", nrow(x$l1), ncol(x$l1), "row normed scores") sumry[4, ] <- c("$co", nrow(x$co), ncol(x$co), "column coordinates") sumry[5, ] <- c("$c1", nrow(x$c1), ncol(x$c1), "column normed scores") sumry[6, ] <- c("$lisup", nrow(x$lisup), ncol(x$lisup), "row coordinates from each table") sumry[7, ] <- c("$TL", nrow(x$TL), ncol(x$TL), "factors for li l1") sumry[8, ] <- c("$TC", nrow(x$TC), ncol(x$TC), "factors for co c1") sumry[9, ] <- c("$T4", nrow(x$T4), ncol(x$T4), "factors for T4comp") sumry[10, ] <- c("$T4comp", nrow(x$T4comp), ncol(x$T4comp), "component projection") sumry[11, ] <- c("$link", nrow(x$link), ncol(x$link), "link array-total") print(sumry, quote = FALSE) cat("other elements: ") if (length(names(x)) > 19) cat(names(x)[20:(length(mfa))], "\n") else cat("NULL\n") } "summary.mfa" <- function (object, ...) { if (!inherits(object, "mfa")) stop("non convenient data") cat("Multiple Factorial Analysis\n") cat("rows:", nrow(object$tab), "columns:", ncol(object$tab)) l0 <- length(object$eig) cat("\n\n$eig:", l0, "eigen values\n") cat(signif(object$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n") else cat("\n") } ade4/R/randtest.coinertia.R0000644000176200001440000000544613050632301015215 0ustar liggesusers"randtest.coinertia" <- function(xtest, nrepet = 999, fixed = 0, ...) { if(!inherits(xtest,"dudi")) stop("Object of class dudi expected") if(!inherits(xtest,"coinertia")) stop("Object of class 'coinertia' expected") appel <- as.list(xtest$call) dudiX <- eval.parent(appel$dudiX) dudiY <- eval.parent(appel$dudiY) ## X table X <- dudiX$tab X.cw <- dudiX$cw X.lw <- dudiX$lw appelX <- as.list(dudiX$call) apx <- appelX$df Xinit <- eval.parent(appelX$df) ## Test the different cases typX <- dudi.type(dudiX$call) if(typX == 2) Xinit <- acm.disjonctif(Xinit) if(!(typX %in% (1:7))) stop ("Not yet available") ## Y table Y <- dudiY$tab Y.cw <- dudiY$cw Y.lw <- dudiY$lw appelY <- as.list(dudiY$call) apy <- appelY$df Yinit <- eval.parent(appelY$df) ## Test the different cases typY <- dudi.type(dudiY$call) if(typY == 2) Yinit <- acm.disjonctif(Yinit) if(!(typY %in% (1:7))) stop ("Not yet available") if(identical(all.equal(X.lw, Y.lw), TRUE)) { if(identical(all.equal(X.lw, rep(1/nrow(X), nrow(X))), TRUE)) { isim <- testertrace(nrepet, X.cw, Y.cw, X, Y, nrow(X), ncol(X), ncol(Y)) } else { if(fixed == 0) { cat("Warning: non uniform weight. The results from simulations\n") cat("are not valid if weights are computed from analysed data.\n") isim <- testertracenu(nrepet, X.cw, Y.cw, X.lw, X, Y, nrow(X), ncol(X), ncol(Y), Xinit, Yinit, typX, typY) if(typX == 2) isim[-1] <- isim[-1]/ncol(eval.parent(appelX$df)) if(typY == 2) isim[-1] <- isim[-1]/ncol(eval.parent(appelY$df)) } else if(fixed == 1) { cat("Warning: non uniform weight. The results from permutations\n") cat("are valid only if the row weights come from the fixed table.\n") cat("The fixed table is table X : ") print(apx) isim <- testertracenubis(nrepet, X.cw, Y.cw, X.lw, X, Y, nrow(X), ncol(X), ncol(Y), Xinit, Yinit, typX, typY, fixed) if(typY == 2) isim[-1] <- isim[-1]/ncol(eval.parent(appelY$df)) } else if (fixed==2) { cat("Warning: non uniform weight. The results from permutations\n") cat("are valid only if the row weights come from the fixed table.\n") cat("The fixed table is table Y : ") print(apy) isim <- testertracenubis(nrepet, X.cw, Y.cw, X.lw, X, Y, nrow(X), ncol(X), ncol(Y), Xinit, Yinit, typX, typY, fixed) if(typX == 2) isim[-1] <- isim[-1]/ncol(eval.parent(appelX$df)) } else stop ("Error : fixed must be =< 2") } ## RV computed using the coinertia isim <- isim/sqrt(sum(dudiX$eig^2))/sqrt(sum(dudiY$eig^2)) obs <- isim[1] return(as.randtest(sim = isim[-1], obs = obs, call = match.call(), ...)) } else { stop ("Equal row weights expected") } } ade4/R/bicenter.wt.R0000644000176200001440000000151012576021756013647 0ustar liggesusers"bicenter.wt" <- function (X, row.wt = rep(1, nrow(X)), col.wt = rep(1, ncol(X))) { X <- as.matrix(X) n <- nrow(X) p <- ncol(X) if (length(row.wt) != n) stop("length of row.wt must equal the number of rows in x") if (any(row.wt < 0) || (sr <- sum(row.wt)) == 0) stop("weights must be non-negative and not all zero") row.wt <- row.wt/sr if (length(col.wt) != p) stop("length of col.wt must equal the number of columns in x") if (any(col.wt < 0) || (st <- sum(col.wt)) == 0) stop("weights must be non-negative and not all zero") col.wt <- col.wt/st row.mean <- apply(row.wt * X, 2, sum) col.mean <- apply(col.wt * t(X), 2, sum) col.mean <- col.mean - sum(row.mean * col.wt) X <- sweep(X, 2, row.mean) X <- t(sweep(t(X), 2, col.mean)) return(X) } ade4/R/dudi.acm.R0000644000176200001440000000727612576021756013126 0ustar liggesusers"dudi.acm" <- function (df, row.w = rep(1, nrow(df)), scannf = TRUE, nf = 2) { if (!all(unlist(lapply(df, is.factor)))) stop("All variables must be factors") df <- as.data.frame(df) X <- acm.disjonctif(df) lig <- nrow(X) col <- ncol(X) var <- ncol(df) if (length(row.w) != lig) stop("Non convenient row weights") if (any(row.w < 0)) stop("row weight < 0") row.w <- row.w/sum(row.w) col.w <- apply(X, 2, function(x) sum(x*row.w)) if (any(col.w == 0)) stop("One category with null weight") X <- t(t(X)/col.w) - 1 col.w <- col.w/var X <- as.dudi(data.frame(X), col.w, row.w, scannf = scannf, nf = nf, call = match.call(), type = "acm") rcor <- matrix(0, ncol(df), X$nf) rcor <- row(rcor) + 0 + (0+1i) * col(rcor) floc <- function(x) { i <- Re(x) j <- Im(x) x <- X$l1[, j] * X$lw qual <- df[, i] poicla <- unlist(tapply(X$lw, qual, sum)) z <- unlist(tapply(x, qual, sum))/poicla return(sum(poicla * z * z)) } rcor <- apply(rcor, c(1, 2), floc) rcor <- data.frame(rcor) row.names(rcor) <- names(df) names(rcor) <- names(X$l1) X$cr <- rcor return(X) } "boxplot.acm" <- function (x, xax = 1, ...) { # correction d'un bug par P. Cornillon 29/10/2004 if (!inherits(x, "acm")) stop("Object of class 'acm' expected") if ((xax < 1) || (xax > x$nf)) stop("non convenient axe number") def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) oritab <- eval.parent(as.list(x$call)[[2]]) nvar <- ncol(oritab) if (nvar <= 7) sco.boxplot(x$l1[, xax], oritab[, 1:nvar], clabel = 1) else if (nvar <= 14) { par(mfrow = c(1, 2)) sco.boxplot(x$l1[, xax], oritab[, 1:(nvar%/%2)], clabel = 1.3) sco.boxplot(x$l1[, xax], oritab[, (nvar%/%2 + 1):nvar], clabel = 1.3) } else { par(mfrow = c(1, 3)) if ((a0 <- nvar%/%3) < nvar/3) a0 <- a0 + 1 sco.boxplot(x$l1[, xax], oritab[, 1:a0], clabel = 1.6) sco.boxplot(x$l1[, xax], oritab[, (a0 + 1):(2 * a0)], clabel = 1.6) sco.boxplot(x$l1[, xax], oritab[, (2 * a0 + 1):nvar], clabel = 1.6) } } "acm.burt" <- function (df1, df2, counts = rep(1, nrow(df1))) { if (!all(unlist(lapply(df1, is.factor)))) stop("All variables must be factors") if (!all(unlist(lapply(df2, is.factor)))) stop("All variables must be factors") if (nrow(df1) != nrow(df2)) stop("non convenient row numbers") if (length(counts) != nrow(df2)) stop("non convenient row numbers") g1 <- acm.disjonctif(df1) g1 <- g1 * counts g2 <- acm.disjonctif(df2) burt <- as.matrix(t(g1)) %*% as.matrix(g2) burt <- data.frame(burt) names(burt) <- names(g2) row.names(burt) <- names(g1) return(burt) } "acm.disjonctif" <- function (df) { acm.util.df <- function(i) { cl <- df[,i] cha <- names(df)[i] n <- length(cl) cl <- as.factor(cl) x <- matrix(0, n, length(levels(cl))) x[(1:n) + n * (unclass(cl) - 1)] <- 1 dimnames(x) <- list(row.names(df), paste(cha,levels(cl),sep=".")) return(x) } G <- lapply(1:ncol(df), acm.util.df) G <- data.frame (G, check.names = FALSE) return(G) } fac2disj<- function(fac, drop = FALSE) { ## Returns the disjunctive table corrseponding to a factor n <- length(fac) fac <- as.factor(fac) if(drop) fac <- factor(fac) x <- matrix(0, n, nlevels(fac)) x[(1:n) + n * (unclass(fac) - 1)] <- 1 dimnames(x) <- list(names(fac), as.character(levels(fac))) return(data.frame(x, check.names = FALSE)) } ade4/R/kplot.sepan.R0000644000176200001440000000771712576021756013700 0ustar liggesusers"kplot.sepan" <- function (object, xax = 1, yax = 2, which.tab = 1:length(object$blo), mfrow = NULL, permute.row.col = FALSE, clab.row = 1, clab.col = 1.25, traject.row = FALSE, csub = 2, possub = "bottomright", show.eigen.value = TRUE, ...) { if (!inherits(object, "sepan")) stop("Object of type 'sepan' expected") opar <- par(ask = par("ask"), mfrow = par("mfrow"), mar = par("mar")) on.exit(par(opar)) nbloc <- length(object$blo) if (is.null(mfrow)) mfrow <- n2mfrow(length(which.tab)) par(mfrow = mfrow) if (length(which.tab) > prod(mfrow)) par(ask = TRUE) rank.fac <- factor(rep(1:nbloc, object$rank)) nf <- ncol(object$Li) neig <- max(object$rank) appel <- as.list(object$call) X <- eval.parent(appel$X) names.li <- row.names(X[[1]]) for (ianal in which.tab) { coolig <- object$Li[object$TL[, 1] == levels(object$TL[,1])[ianal], c(xax, yax)] row.names(coolig) <- names.li coocol <- object$Co[object$TC[, 1] == levels(object$TC[,1])[ianal], c(xax, yax)] row.names(coocol) <- names(X[[ianal]]) if (permute.row.col) { auxi <- coolig coolig <- coocol coocol <- auxi } if (clab.row > 0) cpoi <- 0 else cpoi <- 2 if (!traject.row) s.label(coolig, clabel = clab.row, cpoint = cpoi) else s.traject(coolig, clabel = 0, cpoint = 2) born <- par("usr") k1 <- min(coocol[, 1])/born[1] k2 <- max(coocol[, 1])/born[2] k3 <- min(coocol[, 2])/born[3] k4 <- max(coocol[, 2])/born[4] k <- c(k1, k2, k3, k4) coocol <- 0.7 * coocol/max(k) s.arrow(coocol, clabel = clab.col, add.plot = TRUE, sub = object$tab.names[ianal], csub = csub, possub = possub) w <- object$Eig[rank.fac == ianal] if (length(w) < neig) w <- c(w, rep(0, neig - length(w))) if (show.eigen.value) add.scatter.eig(w, nf, xax, yax, posi = c("bottom","top"), ratio = 1/4) } } "kplotsepan.coa" <- function (object, xax = 1, yax = 2, which.tab = 1:length(object$blo), mfrow = NULL, permute.row.col = FALSE, clab.row = 1, clab.col = 1.25, csub = 2, possub = "bottomright", show.eigen.value = TRUE, poseig = c("bottom", "top"), ...) { if (!inherits(object, "sepan")) stop("Object of type 'sepan' expected") opar <- par(ask = par("ask"), mfrow = par("mfrow"), mar = par("mar")) on.exit(par(opar)) nbloc <- length(object$blo) if (is.null(mfrow)) mfrow <- n2mfrow(length(which.tab)) par(mfrow = mfrow) if (length(which.tab) > prod(mfrow)) par(ask = TRUE) rank.fac <- factor(rep(1:nbloc, object$rank)) nf <- ncol(object$Li) neig <- max(object$rank) appel <- as.list(object$call) X <- eval.parent(appel$X) names.li <- row.names(X[[1]]) for (ianal in which.tab) { coocol <- object$C1[object$TC[, 1] == levels(object$TC[,1])[ianal], c(xax, yax)] row.names(coocol) <- names(X[[ianal]]) coolig <- object$Li[object$TL[, 1] == levels(object$TL[,1])[ianal], c(xax, yax)] row.names(coolig) <- names.li if (permute.row.col) { auxi <- coolig coolig <- coocol coocol <- auxi } if (clab.col > 0) cpoi <- 0 else cpoi <- 3 s.label(coocol, clabel = 0, cpoint = 0, sub = object$tab.names[ianal], csub = csub, possub = possub) s.label(coocol, clabel = clab.col, cpoint = cpoi, add.plot = TRUE) s.label(coolig, clabel = clab.row, add.plot = TRUE) if (permute.row.col) { auxi <- coolig coolig <- coocol coocol <- auxi } w <- object$Eig[rank.fac == ianal] if (length(w) < neig) w <- c(w, rep(0, neig - length(w))) if (show.eigen.value) add.scatter.eig(w, nf, xax, yax, posi = poseig, ratio = 1/4) } } ade4/R/randtest.R0000644000176200001440000000463413211776316013255 0ustar liggesusers"randtest" <- function (xtest, ...) { UseMethod("randtest") } "as.randtest" <- function (sim, obs, alter = c("greater", "less", "two-sided"), output = c("light", "full"), call = match.call(), subclass = NULL ) { output <- match.arg(output) if(output == "full") res <- list(sim = sim, obs = obs) else res <- list(obs = obs) res$alter <- match.arg(alter) sim <- na.omit(sim) res$rep <- length(sim) res$expvar <- c(Std.Obs=(res$obs-mean(sim))/sd(sim),Expectation=mean(sim),Variance=var(sim)) if(res$alter=="greater"){ res$pvalue <- (sum(sim >= obs) + 1)/(length(sim) + 1) } else if(res$alter=="less"){ res$pvalue <- (sum(sim <= obs) + 1)/(length(sim) + 1) } else if(res$alter=="two-sided") { sim0 <- abs(sim-mean(sim)) obs0 <- abs(obs-mean(sim)) res$pvalue <- (sum(sim0 >= obs0) + 1)/(length(sim) +1) } ## compute histogram (mainly used for 'light' randtest) if(length(sim) > 0){ r0 <- c(sim, obs) l0 <- max(sim) - min(sim) w0 <- l0/(log(length(sim), base = 2) + 1) xlim0 <- range(r0) + c(-w0, w0) h0 <- hist(sim, plot = FALSE, nclass = 10) res$plot <- list(hist = h0, xlim = xlim0) } res$call <- call class(res) <- "randtest" if(output == "light") class(res) <- c(subclass, class(res), "lightrandtest") return(res) } "print.randtest" <- function (x, ...) { if (!inherits(x, "randtest")) stop("Non convenient data") cat("Monte-Carlo test\n") cat("Call: ") print(x$call) cat("\nObservation:", x$obs, "\n") cat("\nBased on", x$rep, "replicates\n") cat("Simulated p-value:", x$pvalue, "\n") cat("Alternative hypothesis:", x$alter, "\n\n") print(x$expvar) } "plot.randtest" <- function (x, nclass = 10, coeff = 1, ...) { if (!inherits(x, "randtest")) stop("Non convenient data") if(!inherits(x, "lightrandtest") & nclass != 10){ r0 <- c(x$sim, x$obs) l0 <- max(x$sim) - min(x$sim) w0 <- l0/(log(length(x$sim), base = 2) + 1) w0 <- w0 * coeff xlim0 <- range(r0) + c(-w0, w0) h0 <- hist(x$sim, plot = FALSE, nclass = nclass) } else { h0 <- x$plot$hist xlim0 <- x$plot$xlim } y0 <- max(h0$counts) plot(h0, xlim = xlim0, col = grey(0.8), ...) lines(c(x$obs, x$obs), c(y0/2, 0)) points(x$obs, y0/2, pch = 18, cex = 2) invisible() } ade4/R/disc.R0000644000176200001440000000600212576021756012346 0ustar liggesusersdisc <- function(samples, dis = NULL, structures=NULL){ # checking of user's data and initialization. if (!inherits(samples, "data.frame")) stop("Non convenient samples") if (any(samples < 0)) stop("Negative value in samples") if (any(apply(samples, 2, sum) < 1e-16)) stop("Empty samples") if (!is.null(dis)) { if (!inherits(dis, "dist")) stop("Object of class 'dist' expected for distance") if (!is.euclid(dis)) stop("Euclidean property is expected for distance") dis <- as.matrix(dis) if (nrow(samples)!= nrow(dis)) stop("Non convenient samples") } if (is.null(dis)) dis <- (matrix(1, nrow(samples), nrow(samples)) - diag(rep(1, nrow(samples)))) * sqrt(2) if (!is.null(structures)){ if (!inherits(structures, "data.frame")) stop("Non convenient structures") m <- match(apply(structures, 2, function(x) length(x)), ncol(samples), 0 ) if (length(m[m == 1]) != ncol(structures)) stop ("Non convenient structures") m <- match(tapply(1:ncol(structures), as.factor(1:ncol(structures)), function(x) is.factor(structures[, x])), TRUE , 0) if(length(m[m == 1]) != ncol(structures)) stop ("Non convenient structures") } # Intern functions : ##Diversity <- function(d2, nbhaplotypes, freq) { ## div <- nbhaplotypes/2*(t(freq)%*%d2%*%freq) ##} Structutil <- function(dp2, Np, unit){ if (!is.null(unit)) { modunit <- model.matrix(~ -1 + unit) sumcol <- apply(Np, 2, sum) Ng <- modunit * sumcol lesnoms <- levels(unit) } else{ Ng <- as.matrix(Np) lesnoms <- colnames(Np) } sumcol <- apply(Ng, 2, sum) Lg <- t(t(Ng) / sumcol) colnames(Lg) <- lesnoms Pg <- as.matrix(apply(Ng, 2, sum) / nbhaplotypes) rownames(Pg) <- lesnoms deltag <- as.matrix(apply(Lg, 2, function(x) t(x) %*% dp2 %*% x)) ug <- matrix(1, ncol(Lg), 1) dg2 <- t(Lg) %*% dp2 %*% Lg - 1 / 2 * (deltag %*% t(ug) + ug %*% t(deltag)) colnames(dg2) <- lesnoms rownames(dg2) <- lesnoms return(list(dg2 = dg2, Ng = Ng, Pg = Pg)) } Diss <- function(dis, nbhaplotypes, samples, structures){ structutil <- list(0) structutil[[1]] <- Structutil(dp2 = dis, Np = samples, NULL) diss <- list(sqrt(as.dist(structutil[[1]]$dg2))) if(!is.null(structures)){ for(i in 1:length(structures)){ structutil[[i+1]] <- Structutil(structutil[[1]]$dg2, structutil[[1]]$Ng, structures[,i]) } diss <- c(diss, tapply(1:length(structures), factor(1:length(structures)), function(x) sqrt(as.dist(structutil[[x + 1]]$dg2)))) } return(diss) } # main procedure. nbhaplotypes <- sum(samples) diss <- Diss(dis^2, nbhaplotypes, samples, structures) names(diss) <- c("samples", names(structures)) # Interface. if (!is.null(structures)) { return(diss) } return(diss$samples) } ade4/R/gridrowcol.R0000644000176200001440000000711312576021756013603 0ustar liggesusers"gridrowcol" <- function (nrow,ncol, cell.names=NULL) { # Résultats utilisés dans le thèse de Cornillon p. 15 # corrections de 2 coquilles bas de p. 15 nrow <- as.integer(nrow) if (nrow < 1) stop("nrow nonpositive") ncol <- as.integer(ncol) if (ncol < 1) stop("ncol nonpositive") ncell <- nrow*ncol xy<-matrix(0,nrow,ncol) xy <- cbind(as.numeric(t(col(xy))),as.numeric(t(row(xy)))) if (!is.null(cell.names)) { if (length(cell.names)!=nrow*ncol) cell.names <- NULL } if (is.null (cell.names)) { cell.names <- paste("R",xy[,2],"C",xy[,1],sep="") } xy <- data.frame(xy) names(xy)=c("x","y") row.names(xy) = cell.names xy$"y" <- nrow+1-xy$"y" res<- list(xy=xy) area <- rep(row.names(xy),rep(4,ncell)) area <- as.factor(area) w <- cbind(xy$"x"-0.5,xy$"x"-0.5,xy$"x"+0.5,xy$"x"+0.5) w <- as.numeric(t(w)) area <- cbind.data.frame(area,w) w <- cbind(xy$"y"-0.5,xy$"y"+0.5,xy$"y"+0.5,xy$"y"-0.5) w <- as.numeric(t(w)) area <- cbind.data.frame(area,w) names(area) <- c("cell","x","y") res$area <- area d0 <- as.matrix(dist.quant(xy,1)) d0 <- 1*(d0<1.2) diag(d0) <-0 pvoisi <- unlist(apply(d0,1,sum)) naret <- sum(pvoisi) pvoisi <- pvoisi/naret d0 <- neig(mat01=d0) res$neig <- d0 xy$"y" <- nrow+1-xy$"y" # numero de colonne en x et numero de ligne en y "glin" <- function (n) { n<-n "vecpro" <- function(k) { x <- cos(k*pi*((1:n)-0.5)/n) x <- x/sqrt(sum(x*x)) # print(x) } w <- unlist(lapply(0:(n-1),vecpro)) w <- matrix(w,n) } orthobasis <- glin(nrow)%x%glin(ncol) # ce paragrahe calcule les valeurs de xtEx pour les vecteurs de orthobasis # et permet de vérifier qu'il s'agit bien des vecteurs propres # et que les valeurs propres sont bien celles qui sont calculées # d0=neig2mat(d0) # d1=apply(d0,1,sum) # d0=diag(d1)-d0 # fun2 <- function(x) { # w=d0*x # return(sum(t(w)*x)) # } # lambda <- unlist(apply(orthobasis,2,fun2)) # print(lambda) # res$lambda <- lambda pirow <- pi/nrow picol<- pi/ncol salpha <- (sin((0:(nrow-1))*pirow/2))^2 sbeta <- (sin((0:(ncol-1))*picol/2))^2 z <- rep(sbeta,nrow)+rep(salpha,rep(ncol,nrow)) z <- 4*z/nrow/ncol w <- order(z)[-1] z <- z[w] orthobasis <- sqrt(ncell)*orthobasis[,w] orthobasis <- data.frame(orthobasis) val <- unlist(lapply(orthobasis,function(x) sum(x*x*pvoisi))) val <- val - z*ncell*ncell/naret ord <- rev(order(val)) orthobasis <- orthobasis[,ord] val <- val[ord] names(orthobasis) = paste("S",1:(ncell-1),sep="") row.names(orthobasis) = row.names(res$xy) # Les valeurs sont calculées à partir des valeurs propres de l'opérateur de lissage # Ce sont des valeurs de l'indice de Moran xtFx/v(x) v en 1/n # print(unlist(lapply(orthobasis,function(x) sum(x*x*pvoisi)))) attr(orthobasis,"values") <- val attr(orthobasis,"weights") <- rep(1/ncell,ncell) attr(orthobasis,"call") <- match.call() attr(orthobasis,"class") <- c("orthobasis","data.frame") res$orthobasis <- orthobasis # ces ordres vérifient qu'on a bien trouvé les indices de Moran # d0 = neig2mat(d0) # d0 = d0/sum(d0) # Moran type W # moran <- unlist(lapply(orthobasis,function(x) sum(t(d0*x)*x))) # print(moran) # plot(moran,attr(orthobasis,"values")) # abline(lm(attr(orthobasis,"values")~moran)) # print(summary(lm(attr(orthobasis,"values")~moran))) return(res) } ade4/R/triangle.class.R0000644000176200001440000000675412576021756014353 0ustar liggesusers######################### triangle.class ###################################### "triangle.class" <- function (ta, fac, col = rep(1, length(levels(fac))), wt = rep(1, length(fac)),cstar = 1, cellipse = 0, axesell = TRUE, label = levels(fac), clabel = 1, cpoint = 1, pch=20, draw.line = TRUE, addaxes = FALSE, addmean = FALSE, labeltriangle = TRUE, sub = "", csub = 1, possub = "bottomright", show.position = TRUE, scale = TRUE, min3 = NULL, max3 = NULL) { # modifiée le 18/11/2004 par cohérence avec triangle.param seg <- function(a, b, col = par("col")) { segments(a[1], a[2], b[1], b[2], col = col) } ta <- data.frame(ta) if (!is.data.frame(ta)) stop("Non convenient selection for ta") if (any(is.na(ta))) stop("NA non implemented") if (!is.factor(fac)) stop("factor expected for fac") if (ncol(ta)!=3) stop("3 columns expected for ta") if (nrow(ta)!=length(fac)) stop ("Non convenient dimension") dfdistri <- fac2disj(fac) * wt coul <- col w1 <- unlist(lapply(dfdistri, sum)) dfdistri <- t(t(dfdistri)/w1) nam <- names(ta) ta <- t(apply(ta, 1, function(x) x/sum(x))) d <- triangle.param(ta, scale = scale, min3 = min3, max3 = max3) opar <- par(mar = par("mar")) on.exit(par(opar)) A <- d$A B <- d$B C <- d$C xy <- d$xy xymoy <- as.matrix(t(dfdistri)) %*% as.matrix(xy) mini <- d$mini maxi <- d$maxi if (show.position) add.position.triangle(d) par(mar = c(0.1, 0.1, 0.1, 0.1)) plot(0, 0, type = "n", xlim = c(-0.8, 0.8), ylim = c(-0.6, 1), xlab = "", ylab = "", xaxt = "n", yaxt = "n", asp = 1, frame.plot = FALSE) seg(A, B) seg(B, C) seg(C, A) text(C[1], C[2], labels = paste(mini[1]), pos = 2) text(C[1], C[2], labels = paste(maxi[3]), pos = 4) if (labeltriangle) text((A + C)[1]/2, (A + C)[2]/2, labels = nam[1], cex = 1.5, pos = 2) text(A[1], A[2], labels = paste(maxi[1]), pos = 2) text(A[1], A[2], labels = paste(mini[2]), pos = 1) if (labeltriangle) text((A + B)[1]/2, (A + B)[2]/2, labels = nam[2], cex = 1.5, pos = 1) text(B[1], B[2], labels = paste(maxi[2]), pos = 1) text(B[1], B[2], labels = paste(mini[3]), pos = 4) if (labeltriangle) text((B + C)[1]/2, (B + C)[2]/2, labels = nam[3], cex = 1.5, pos = 4) if (draw.line) { nlg <- 10 * (maxi[1] - mini[1]) for (i in 1:(nlg - 1)) { x1 <- A + (i/nlg) * (B - A) x2 <- C + (i/nlg) * (B - C) seg(x1, x2, col = "lightgrey") x1 <- A + (i/nlg) * (B - A) x2 <- A + (i/nlg) * (C - A) seg(x1, x2, col = "lightgrey") x1 <- C + (i/nlg) * (A - C) x2 <- C + (i/nlg) * (B - C) seg(x1, x2, col = "lightgrey") } } if (cpoint > 0) for (i in 1:ncol(dfdistri)) { points(xy[dfdistri[,i] > 0,],pch = pch, cex = par("cex") * cpoint, col=coul[i]) } if (cstar > 0) for (i in 1:ncol(dfdistri)) { scatterutil.star(xy[,1], xy[,2], dfdistri[, i], cstar = cstar, coul[i]) } if (cellipse > 0) for (i in 1:ncol(dfdistri)) { scatterutil.ellipse(xy[,1], xy[,2], dfdistri[, i], cellipse = cellipse, axesell = axesell, coul[i]) } if (clabel > 0) scatterutil.eti(xymoy[,1], xymoy[,2], label, clabel, coul = col) if (csub > 0) scatterutil.sub(sub, csub, possub) } ade4/R/variance.phylog.R0000644000176200001440000000416312576021756014523 0ustar liggesusers"variance.phylog" <- function (phylog, z, bynames = TRUE, na.action = c("fail", "mean")) { if (!is.numeric(z)) stop("z is not numeric") n <- length(z) if (!inherits(phylog, "phylog")) stop("Object of class 'phylog' expected") if (n != length(phylog$leaves)) stop("Non convenient dimension") if (bynames) { if (is.null(names(z))) stop("names(z) is NULL & bynames = TRUE") w1 <- sort(names(z)) w2 <- sort(names(phylog$leaves)) if (!all(w1 == w2) & bynames) { stop("names(z) non convenient for 'phylog' : bynames = FALSE ?") } z <- z[names(phylog$leaves)] } if (any(is.na(z))) { if (na.action == "fail") stop(" missing values in 'z'") else if (na.action == "mean") z[is.na(z)] <- mean(na.omit(z)) else stop("unknown method for 'na.action'") } res <- list() z <- (z - mean(z))/sqrt(var(z)) w1 <- sort(names(z)) w2 <- sort(names(phylog$leaves)) if (!all(w1 == w2)) { warning("names(z) non convenient for 'phylog' : we use the names of the leaves in 'phylog'") names(z) <- names(phylog$leaves) } z <- z[names(phylog$leaves)] df <- cbind.data.frame(z, phylog$Ascores[, 1:phylog$Adim]) begin <- paste(names(df)[1], "~", sep = "") fmla <- as.formula(paste(begin, paste(names(df)[-1], collapse = "+"))) lm0 <- lm(fmla, data = df) res$lm <- lm0 res$anova <- anova(lm0) a1 <- sum(res$anova$"Sum Sq"[1:phylog$Adim]) df1 <- phylog$Adim r1 <- a1/df1 a2 <- res$anova$"Sum Sq"[1 + phylog$Adim] df2 <- res$anova$Df[1 + phylog$Adim] r2 <- a2/df2 Fvalue <- r1/r2 proba <- 1 - pf(Fvalue, df1, df2) dig1 <- max(getOption("digits") - 2, 3) sumry <- array(0, c(2, 5), list(c("Phylogenetic", "Residuals"), c("Df", "Sum Sq", "Mean Sq", "F value", "Pr(>F)"))) sumry[1, ] <- c(df1, a1, r1, Fvalue, proba) sumry[2, 1:3] <- c(df2, a2, r2) sumry[2, 4:5] <- NA res$sumry <- data.frame(sumry, check.names = FALSE) class(res$sumry) <- c("anova", "data.frame") return(res) } ade4/R/pcoscaled.R0000644000176200001440000000162412576021756013366 0ustar liggesusers"pcoscaled" <- function (distmat, tol = 1e-07) { if (!inherits(distmat, "dist")) stop("Object of class 'dist' expected") if (!is.euclid(distmat)) stop("Euclidean distance expected") lab <- attr(distmat, "Labels") distmat <- as.matrix(distmat) n <- ncol(distmat) if (is.null(lab)) lab <- as.character(1:n) delta <- -0.5 * bicenter.wt(distmat * distmat) eig <- eigen(delta, symmetric = TRUE) w0 <- eig$values[n]/eig$values[1] if ((w0 < -tol)) stop("Euclidean distance matrix expected") ncomp <- sum(eig$values > (eig$values[1] * tol)) x <- as.matrix(eig$vectors[, 1:ncomp]) variances <- eig$values[1:ncomp] x <- sweep(x,2,sqrt(variances),"*") inertot <- sum(variances) x <- x/sqrt(inertot) x <- x*sqrt(n) x <- data.frame(x) names(x) <- paste("C", 1:ncomp, sep = "") row.names(x) <- lab return(x) } ade4/R/s.match.R0000644000176200001440000000426712576021756012774 0ustar liggesusers"s.match" <- function (df1xy, df2xy, xax = 1, yax = 2, pch = 20, cpoint = 1, label = row.names(df1xy), clabel = 1, edge = TRUE, xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0, 0), sub = "", csub = 1.25, possub = "bottomleft", pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) { arrow1 <- function(x0, y0, x1, y1, len = 0.1, ang = 15, lty = 1, edge) { d0 <- sqrt((x0 - x1)^2 + (y0 - y1)^2) if (d0 < 1e-07) return(invisible()) segments(x0, y0, x1, y1, lty = lty) h <- strheight("A", cex = par("cex")) if (d0 > 2 * h) { x0 <- x1 - h * (x1 - x0)/d0 y0 <- y1 - h * (y1 - y0)/d0 if (edge) arrows(x0, y0, x1, y1, angle = ang, length = len, lty = 1) } } df1xy <- data.frame(df1xy) df2xy <- data.frame(df2xy) if (!is.data.frame(df1xy)) stop("Non convenient selection for df1xy") if (!is.data.frame(df2xy)) stop("Non convenient selection for df2xy") if (any(is.na(df1xy))) stop("NA non implemented") if (any(is.na(df2xy))) stop("NA non implemented") n <- nrow(df1xy) if (n != nrow(df2xy)) stop("Non equal row numbers") opar <- par(mar = par("mar")) on.exit(par(opar)) par(mar = c(0.1, 0.1, 0.1, 0.1)) coo <- scatterutil.base(dfxy = rbind.data.frame(df1xy, df2xy), xax = xax, yax = yax, xlim = xlim, ylim = ylim, grid = grid, addaxes = addaxes, cgrid = cgrid, include.origin = include.origin, origin = origin, sub = sub, csub = csub, possub = possub, pixmap = pixmap, contour = contour, area = area, add.plot = add.plot) for (i in 1:n) { arrow1(coo$x[i], coo$y[i], coo$x[i + n], coo$y[i + n], lty = 1, edge = edge) } if (cpoint > 0) points(coo$x[1:n], coo$y[1:n], pch = pch, cex = par("cex") * cpoint) if (clabel > 0) { a <- (coo$x[1:n] + coo$x[(n + 1):(2 * n)])/2 b <- (coo$y[1:n] + coo$y[(n + 1):(2 * n)])/2 scatterutil.eti(a, b, label, clabel) } box() invisible(match.call()) } ade4/R/s.match.class.R0000644000176200001440000000650012576021756014070 0ustar liggesuserss.match.class <- function(df1xy, df2xy, fac, wt = rep(1/nrow(df1xy),nrow(df1xy)), xax = 1, yax = 2, pch1 = 16, pch2 = 15, col1 = rep("lightgrey",nlevels(fac)), col2 = rep("darkgrey",nlevels(fac)), cpoint = 1, label = levels(fac), clabel = 1, cstar = 1, cellipse = 0, axesell = TRUE,xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0, 0), sub = "", csub = 1.25, possub = "bottomleft", pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) { df1xy <- data.frame(df1xy) df2xy <- data.frame(df2xy) if (!is.data.frame(df1xy)) stop("Non convenient selection for df1xy") if (!is.data.frame(df2xy)) stop("Non convenient selection for df2xy") if (any(is.na(df1xy))) stop("NA non implemented") if (any(is.na(df2xy))) stop("NA non implemented") n <- nrow(df1xy) if (n != nrow(df2xy)) stop("Non equal row numbers") if (!is.factor(fac)) stop("factor expected for fac") dfdistri <- fac2disj(fac) * wt w1 <- unlist(lapply(dfdistri, sum)) dfdistri <- t(t(dfdistri)/w1) coox1 <- as.matrix(t(dfdistri)) %*% df1xy[, xax] cooy1 <- as.matrix(t(dfdistri)) %*% df1xy[, yax] coox2 <- as.matrix(t(dfdistri)) %*% df2xy[, xax] cooy2 <- as.matrix(t(dfdistri)) %*% df2xy[, yax] if (nrow(df1xy) != nrow(dfdistri)) stop(paste("Non equal row numbers", nrow(df1xy), nrow(dfdistri))) opar <- par(mar = par("mar")) on.exit(par(opar)) par(mar = c(0.1, 0.1, 0.1, 0.1)) coo <- scatterutil.base(dfxy = rbind.data.frame(df1xy, df2xy), xax = xax, yax = yax, xlim = xlim, ylim = ylim, grid = grid, addaxes = addaxes, cgrid = cgrid, include.origin = include.origin, origin = origin, sub = sub, csub = csub, possub = possub, pixmap = pixmap, contour = contour, area = area, add.plot = add.plot) points(cbind(coox1,cooy1),pch=pch1,cex=4 * par("cex") * cpoint,col=col1) points(cbind(coox2,cooy2),pch=pch2,cex=4 * par("cex") * cpoint,col=col2) coo1=list(x=coo$x[1:n],y=coo$y[1:n]) coo2=list(x=coo$x[(n+1):(2*n)],y=coo$y[(n+1):(2*n)]) if (cpoint > 0){ for (i in 1:ncol(dfdistri)) { points(coo1$x[dfdistri[, i] > 0], coo1$y[dfdistri[, i] > 0], pch = pch1, cex = par("cex") * cpoint, col = col1[i]) points(coo2$x[dfdistri[, i] > 0], coo2$y[dfdistri[, i] > 0], pch = pch2, cex = par("cex") * cpoint, col = col2[i]) } } if (cstar > 0) { for (i in 1:ncol(dfdistri)) { scatterutil.star(coo1$x, coo1$y, dfdistri[, i], cstar = cstar, col1[i]) scatterutil.star(coo2$x, coo2$y, dfdistri[, i], cstar = cstar, col2[i]) } } if (cellipse > 0) { for (i in 1:ncol(dfdistri)) { scatterutil.ellipse(coo1$x, coo1$y, dfdistri[, i], cellipse = cellipse, axesell = axesell, col1[i]) scatterutil.ellipse(coo2$x, coo2$y, dfdistri[, i], cellipse = cellipse, axesell = axesell, col2[i]) } } for (i in 1:n) { segments(coox1[i], cooy1[i], coox2[i], cooy2[i], lty = 1, lwd=2) } if (clabel > 0) { a <- (coox1 + coox2)/2 b <- (cooy1 + cooy2)/2 scatterutil.eti(a, b, label, clabel) } box() invisible(match.call()) } ade4/R/RVdist.randtest.R0000644000176200001440000000132213050632301014440 0ustar liggesusers"RVdist.randtest" <- function (m1, m2, nrepet=999, ...) { if (!inherits(m1, "dist")) stop("Object of class 'dist' expected") if (!inherits(m2, "dist")) stop("Object of class 'dist' expected") if (!is.euclid(m1)) stop ("Euclidean matrices expected") if (!is.euclid(m2)) stop ("Euclidean matrices expected") n <- attr(m1, "Size") if (n != attr(m2, "Size")) stop("Non convenient dimension") m1 <- as.matrix(m1) m2 <- as.matrix(m2) res <- .C("testdistRV", as.integer(nrepet), as.integer (n), as.double(m1), as.double(m2), RV=double(nrepet+1),PACKAGE="ade4")$RV obs=res[1] return(as.randtest(sim = res[-1], obs = obs, call = match.call(), ...)) } ade4/R/dotchart.phylog.R0000644000176200001440000000727412576021756014551 0ustar liggesusers"dotchart.phylog" <- function(phylog, values, y = NULL, scaling = TRUE, ranging = TRUE, yranging = NULL, joining = TRUE, yjoining = NULL, ceti = 1, cdot = 1, csub = 1, f.phylog = 1/(1 + ncol(values)), ...) { # l'argument scaling décide si l'on normalise les données ou non # l'argument ranging décide si l'on adopte une échelle commune pour toutes les séries ou non # l'argument yranging permet de fixer l'échelle commune à toutes les séries lorsque ranging = TRUE. Par défaut, l'échelle # commune est choisit en prenant les valeurs extrêmes de l'ensemble des valeurs # l'argument joining décide si'lon rajoute ou non des traits verticaux qui relie chaque point à un axe horizontal # l'argument yjoining définit le niveau de l'axe horizontal. Par défaut, il s'agit de la moyenne de chaque série. # les autres arguments sont des arguments graphiques: # ceti pour la taille des absisses # cdot pour la taille des carrés # csub pour la taille du titre de chaque série # f.phylog pour la taille relative de la phylogénie if (!inherits(phylog, "phylog")) stop("Non convenient data") if (is.vector(values)) values <- as.data.frame(values) if (!is.data.frame(values)) stop("'values' is not a data frame") if (!is.numeric(as.matrix(values))) stop("'values' is not numeric") n <- nrow(values) nvar <- ncol(values) names.var <- names(values) if (length(phylog$leaves) != n) stop("Non convenient length") if (scaling == TRUE){ values <- scalewt(values) values <- as.data.frame(values) names(values) <- names.var } w <- plot.phylog(x = phylog, y = y, clabel.leaves = 0, f.phylog = f.phylog, ...) mar.old <- par("mar") on.exit(par(mar = mar.old)) par(mar = c(0.1, 0.1, 0.1, 0.1)) par(usr = c(0, 1, -0.05, 1)) x1 <- w$xbase space <- (1 - w$xbase - (w$xbase - max(w$xy$x))/2*nvar)/nvar x2 <- x1 + space fun1 <- function(x) {x1 + (x2 - x1) * (x - x1.use)/(x2.use - x1.use)} ret <- cbind.data.frame(values,w$xy[,"y"]) for(i in 1:nvar){ if (ranging == TRUE){ if (is.null(yranging)) val.ref <- pretty(range(values), 4) else val.ref <- pretty(yranging, 4) } else val.ref <- pretty(values[,i], 4) x1.use <- min(val.ref) x2.use <- max(val.ref) xleg <- fun1(val.ref) miny <- 0 maxy <- max(w$xy$y) nleg <- length(xleg) segments(xleg, rep(miny, nleg), xleg, rep(maxy, nleg), col = grey(0.85)) segments(w$xy$x, w$xy$y, rep(max(w$xy$x), n), w$xy$y, col = grey(0.85)) segments(rep(xleg[1], n), w$xy$y, rep(max(xleg), n), w$xy$y, col = grey(0.85)) if (cdot > 0) points(fun1(values[,i]), w$xy$y, pch = 15, cex = cdot, bg = 1) if (ceti > 0){ if (trunc(i/2) < (i/2)) text(xleg, rep((miny - 0.05)*2/3, nleg), as.character(val.ref), cex = par("cex") * ceti) else text(xleg, rep((miny - 0.05)*1/3, nleg), as.character(val.ref), cex = par("cex") * ceti) } if (joining == TRUE){ if (is.null(yjoining)) origin <- mean(values[,i]) else origin <- 0 segments(fun1(origin), miny, fun1(origin), maxy, lty = 2, col = grey(0.50)) segments(fun1(values[,i]), w$xy$y, fun1(origin), w$xy$y, col = grey(0.50)) } if (csub > 0) text(xleg[3], 1 - (1-max(w$xy$y))/3, names(values)[i], cex = par("cex") * csub) ret[,i] <- fun1(values[,i]) x1 <- x1 + space + (w$xbase - max(w$xy$x))/2 x2 <- x2 + space + (w$xbase - max(w$xy$x))/2 } return(invisible(ret)) } ade4/R/inertia.dudi.R0000644000176200001440000001407213303603121013766 0ustar liggesusers"inertia" <- function (x, ...) UseMethod("inertia") "inertia.dudi" <- function (x, row.inertia = FALSE, col.inertia = FALSE, ...) { if (!inherits(x, "dudi")) stop("Object of class 'dudi' expected") nf <- x$nf inertia <- x$eig cum <- cumsum(inertia) ratio <- cum/sum(inertia) * 100 tot.inertia <- cbind.data.frame(inertia, cum, ratio) rownames(tot.inertia) <- paste0("Ax", 1:length(ratio)) names(tot.inertia)[3] <- "cum(%)" listing <- list(tot.inertia = tot.inertia) if (row.inertia) { w <- x$tab * sqrt(x$lw) w <- sweep(w, 2, sqrt(x$cw), "*") w <- w * w listing$row.contrib <- apply(w, 1, sum)/sum(w) * 100 w <- x$li * x$li * x$lw listing$row.abs <- sweep(w, 2, x$eig[1:nf], "/") * 100 w <- x$tab w <- sweep(w, 2, sqrt(x$cw), "*") d2 <- apply(w * w, 1, sum) w <- x$li * x$li w <- sweep(w, 1, d2, "/") w <- w * sign(x$li) names(w) <- names(x$li) listing$row.rel <- data.frame(w) * 100 w <- x$li * x$li w <- sweep(w, 1, d2, "/") w <- data.frame(t(apply(w, 1, cumsum))) names(w) <- names(x$li) remain <- 1 - w[, ncol(w)] listing$row.cum <- cbind.data.frame(w, remain) * 100 names(listing$row.cum) <- paste0("Axis", c(1, if(nf > 1) paste(1,2:nf, sep =":") else NULL, paste0(nf+ 1, ":", length(ratio)))) } if (col.inertia) { w <- x$tab * sqrt(x$lw) w <- sweep(w, 2, sqrt(x$cw), "*") w <- w * w listing$col.contrib <- apply(w, 2, sum)/sum(w) * 100 w <- x$co * x$co * x$cw listing$col.abs <- sweep(w, 2, x$eig[1:nf], "/") * 100 names(listing$col.abs) <- paste0("Axis", 1:nf) w <- x$tab w <- sweep(w, 1, sqrt(x$lw), "*") d2 <- apply(w * w, 2, sum) w <- x$co * x$co w <- sweep(w, 1, d2, "/") w <- w * sign(x$co) names(w) <- paste0("Axis", 1:ncol(w)) listing$col.rel <- data.frame(w) * 100 w <- x$co * x$co w <- sweep(w, 1, d2, "/") w <- data.frame(t(apply(w, 1, cumsum))) names(w) <- names(x$co) remain <- 1 - w[, ncol(w)] listing$col.cum <- cbind.data.frame(w, remain) * 100 names(listing$col.cum) <- paste0("Axis", c(1, if(nf > 1) paste(1,2:nf, sep =":") else NULL, paste0(nf+ 1, ":", length(ratio)))) } listing$nf <- nf listing$call <- match.call() class(listing) <- c("inertia", class(listing)) return(listing) } print.inertia <- function(x, ...){ cat("Inertia information:") cat("\nCall: ") print(x$call) cat("\nDecomposition of total inertia:\n") print(format(x$tot.inertia, digits = 4, trim = TRUE, width = 7), quote = FALSE) if(!is.null(x$row.abs)){ cat("\nRow contributions (%):\n") print(format(x$row.contrib, digits = 4, trim = TRUE, width = 7), quote = FALSE) cat("\nRow absolute contributions (%):\n") print(format(x$row.abs, digits = 4, trim = TRUE, width = 7), quote = FALSE) cat("\nSigned row relative contributions:\n") print(format(x$row.rel, digits = 4, trim = TRUE, width = 7), quote = FALSE) cat("\nCumulative sum of row relative contributions (%):\n") print(format(x$row.cum, digits = 4, trim = TRUE, width = 7), quote = FALSE) } if(!is.null(x$col.abs)){ cat("\nColumn contributions (%):\n") print(format(x$col.contrib, digits = 4, trim = TRUE, width = 7), quote = FALSE) cat("\nColumn absolute contributions (%):\n") print(format(x$col.abs, digits = 4, trim = TRUE, width = 7), quote = FALSE) cat("\nSigned column relative contributions:\n") print(format(x$col.rel, digits = 4, trim = TRUE, width = 7), quote = FALSE) cat("\nCumulative sum of column relative contributions (%):\n") print(format(x$col.cum, digits = 4, trim = TRUE, width = 7), quote = FALSE) } } summary.inertia <- function(object, sort.axis = 1, subset = 5, ...){ cat("\nTotal inertia: ") cat(signif(sum(object$tot.inertia$inertia), 4)) cat("\n") call <- as.list(object$call)$x tab <- eval.parent(call)$tab subset <- min(subset, dim(tab)) nf <- object$nf if(sort.axis > nf) stop("Non convenient axis for sorting contributions (sort.axis parameter).") l0 <- nrow(object$tot.inertia) cat("\nProjected inertia (%):\n") vec <- (object$tot.inertia$inertia / sum(object$tot.inertia$inertia) * 100)[1:(min(nf, l0))] names(vec) <- paste("Ax", 1:length(vec), sep = "") print(format(vec, digits = 4, trim = TRUE, width = 7), quote = FALSE) if (l0 > nf) { cat("\n") cat(paste("(Only ", nf, " dimensions (out of ", l0, ") are shown)\n", sep = "", collapse = "")) } cat("\n") if(!is.null(object$row.abs)){ cat("\nRow absolute contributions (%):\n") idx <- apply(object$row.abs, 2, order, decreasing = TRUE) idx <- unique(as.vector(idx[1:subset, sort.axis])) print(format(object$row.abs[idx, ], digits = 4, trim = TRUE, width = 7), quote = FALSE) cat("\n") cat("\nRow relative contributions (%):\n") idx <- apply(abs(object$row.rel), 2, order, decreasing = TRUE) idx <- unique(as.vector(idx[1:subset, sort.axis])) print(format(abs(object$row.rel[idx, ]), digits = 4, trim = TRUE, width = 7), quote = FALSE) } if(!is.null(object$col.abs)){ cat("\nColumn absolute contributions (%):\n") idx <- apply(object$col.abs, 2, order, decreasing = TRUE) idx <- unique(as.vector(idx[1:subset, sort.axis])) print(format(object$col.abs[idx, ], digits = 4, trim = TRUE, width = 7), quote = FALSE) cat("\nColumn relative contributions (%):\n") idx <- apply(abs(object$col.rel), 2, order, decreasing = TRUE) idx <- unique(as.vector(idx[1:subset, sort.axis])) print(format(abs(object$col.rel[idx, ]), digits = 4, trim = TRUE, width = 7), quote = FALSE) } }ade4/R/multispati.R0000644000176200001440000001622313474205664013625 0ustar liggesusers"multispati" <- function(dudi, listw, scannf=TRUE, nfposi=2, nfnega=0) { .Deprecated(new="multispati", package="ade4", msg="This function is now deprecated. Please use the 'multispati' function in the 'adespatial' package.") if(!inherits(dudi,"dudi")) stop ("object of class 'dudi' expected") if(!inherits(listw,"listw")) stop ("object of class 'listw' expected") if(listw$style!="W") stop ("object of class 'listw' with style 'W' expected") NEARZERO <- 1e-14 dudi$cw <- dudi$cw fun <- function (x) spdep::lag.listw(listw,x,TRUE) tablag <- apply(dudi$tab,2,fun) covar <- t(tablag)%*%as.matrix((dudi$tab*dudi$lw)) covar <- (covar+t(covar))/2 covar <- covar * sqrt(dudi$cw) covar <- t(t(covar) * sqrt(dudi$cw)) covar <- eigen(covar, symmetric = TRUE) res <- list() res$eig <- covar$values[abs(covar$values)>NEARZERO] ndim <- length(res$eig) covar$vectors <- covar$vectors[, abs(covar$values)>NEARZERO] if (scannf) { barplot(res$eig) cat("Select the first number of axes (>=1): ") nfposi <- as.integer(readLines(n = 1)) cat("Select the second number of axes (>=0): ") nfnega <- as.integer(readLines(n = 1)) } if (nfposi <= 0) nfposi <- 1 if (nfnega<=0) nfnega <- 0 if(nfposi > sum(res$eig > 0)){ nfposi <- sum(res$eig > 0) warning(paste("There are only",sum(res$eig>0),"positive factors.")) } if(nfnega > sum(res$eig < 0)){ nfnega <- sum(res$eig < 0) warning(paste("There are only",sum(res$eig< 0),"negative factors.")) } res$nfposi <- nfposi res$nfnega <- nfnega agarder <- c(1:nfposi,if (nfnega>0) (ndim-nfnega+1):ndim else NULL) dudi$cw[which(dudi$cw == 0)] <- 1 auxi <- data.frame(covar$vectors[, agarder] /sqrt(dudi$cw)) names(auxi) <- paste("CS", agarder, sep = "") row.names(auxi) <- names(dudi$tab) res$c1 <- auxi auxi <- as.matrix(auxi)*dudi$cw auxi1 <- as.matrix(dudi$tab)%*%auxi auxi1 <- data.frame(auxi1) names(auxi1) <- names(res$c1) row.names(auxi1) <- row.names(dudi$tab) res$li <- auxi1 auxi1 <- as.matrix(tablag)%*%auxi auxi1 <- data.frame(auxi1) names(auxi1) <- names(res$c1) row.names(auxi1) <- row.names(dudi$tab) res$ls <- auxi1 auxi <- as.matrix(res$c1) * unlist(dudi$cw) auxi <- data.frame(t(as.matrix(dudi$c1)) %*% auxi) row.names(auxi) <- names(dudi$li) names(auxi) <- names(res$li) res$as <- auxi res$call <- match.call() class(res) <- "multispati" return(res) } "summary.multispati" <- function (object, ...) { .Deprecated(new="summary.multispati", package="ade4", msg="This method is now deprecated. Please use the 'summary.multispati' method in the 'adespatial' package.") norm.w <- function(X, w) { f2 <- function(v) sum(v * v * w)/sum(w) norm <- apply(X, 2, f2) return(norm) } if (!inherits(object, "multispati")) stop("to be used with 'multispati' object") cat("\nMultivariate Spatial Analysis\n") cat("Call: ") print(object$call) appel <- as.list(object$call) dudi <- eval.parent(appel$dudi) listw <- eval.parent(appel$listw) ## les scores de l'analyse de base nf <- dudi$nf eig <- dudi$eig[1:nf] cum <- cumsum (dudi$eig) [1:nf] ratio <- cum/sum(dudi$eig) w <- apply(dudi$l1,2,spdep::lag.listw,x=listw) moran <- apply(w*as.matrix(dudi$l1)*dudi$lw,2,sum) res <- data.frame(var=eig,cum=cum,ratio=ratio, moran=moran) cat("\nScores from the initial duality diagramm:\n") print(res) ## les scores de l'analyse spatiale ## on recalcule l'objet en gardant tous les axes eig <- object$eig nfposi <- object$nfposi nfnega <- object$nfnega nfposimax <- sum(eig > 0) nfnegamax <- sum(eig < 0) ms <- multispati(dudi=dudi, listw=listw, scannf=FALSE, nfposi=nfposimax, nfnega=nfnegamax) ndim <- dudi$rank nf <- nfposi + nfnega agarder <- c(1:nfposi,if (nfnega>0) (ndim-nfnega+1):ndim else NULL) varspa <- norm.w(ms$li,dudi$lw) moran <- apply(as.matrix(ms$li)*as.matrix(ms$ls)*dudi$lw,2,sum) res <- data.frame(eig=eig,var=varspa,moran=moran/varspa) cat("\nMultispati eigenvalues decomposition:\n") print(res[agarder,]) return(invisible(res)) } "print.multispati" <- function(x, ...) { .Deprecated(new="print.multispati", package="ade4", msg="This method is now deprecated. Please use the 'print.multispati' method in the 'adespatial' package.") cat("Multispati object \n") cat("class: ") cat(class(x)) cat("\n$call: ") print(x$call) cat("\n$nfposi:", x$nfposi, "axis-components saved") cat("\n$nfnega:", x$nfnega, "axis-components saved") #cat("\n$rank: ") #cat(x$rank) cat("\nPositive eigenvalues: ") l0 <- sum(x$eig >= 0) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n") else cat("\n") cat("Negative eigenvalues: ") l0 <- sum(x$eig <= 0) cat(sort(signif(x$eig, 4))[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n") else cat("\n") cat('\n') sumry <- array("", c(1, 4), list(1, c("vector", "length", "mode", "content"))) sumry[1, ] <- c('$eig', length(x$eig), mode(x$eig), 'eigen values') print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(4, 4), list(1:4, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$c1", nrow(x$c1), ncol(x$c1), "column normed scores") sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), "row coordinates") sumry[3, ] <- c("$ls", nrow(x$ls), ncol(x$ls), 'lag vector coordinates') sumry[4, ] <- c("$as", nrow(x$as), ncol(x$as), 'inertia axes onto multispati axes') print(sumry, quote = FALSE) cat("other elements: ") if (length(names(x)) > 8) cat(names(x)[9:(length(names(x)))], "\n") else cat("NULL\n") } "plot.multispati" <- function (x, xax = 1, yax = 2, ...) { .Deprecated(new="plot.multispati", package="ade4", msg="This method is now deprecated. Please use the 'plot.multispati' method in the 'adespatial' package.") if (!inherits(x, "multispati")) stop("Use only with 'multispati' objects") appel <- as.list(x$call) dudi <- eval.parent(appel$dudi) nf <- x$nfposi + x$nfnega if ((nf == 1) || (xax == yax)) { sco.quant(x$li[, 1], dudi$tab) return(invisible()) } if (xax > nf) stop("Non convenient xax") if (yax > nf) stop("Non convenient yax") f1 <- function () { opar <- par(mar = par("mar")) on.exit(par(opar)) m <- length(x$eig) par(mar = c(0.8, 2.8, 0.8, 0.8)) col.w <- rep(grey(1), m) # elles sont toutes blanches col.w[1:x$nfposi] <- grey(0.8) if (x$nfnega>0) col.w[m:(m-x$nfnega+1)] = grey(0.8) j1 <- xax if (j1>x$nfposi) j1 = j1-x$nfposi +m -x$nfnega j2 <- yax if (j2>x$nfposi) j2 = j2-x$nfposi +m -x$nfnega col.w[c(j1,j2)] = grey(0) barplot(x$eig, col = col.w) scatterutil.sub(cha ="Eigen values", csub = 2, possub = "topright") } def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) layout(matrix(c(3, 3, 1, 3, 3, 2), 3, 2)) par(mar = c(0.2, 0.2, 0.2, 0.2)) f1() s.arrow(x$c1, xax = xax, yax = yax, sub = "Canonical weights", csub = 2, clabel = 1.25) s.match(x$li, x$ls, xax = xax, yax = yax, sub = "Scores and lag scores", csub = 2, clabel = 0.75) } ade4/R/s.image.R0000644000176200001440000000363312576021756012756 0ustar liggesuserss.image <- function(dfxy, z, xax=1, yax=2, span=0.5, xlim = NULL, ylim = NULL, kgrid=2, scale=TRUE, grid = FALSE, addaxes = FALSE, cgrid = 0, include.origin = FALSE, origin = c(0, 0), sub = "", csub = 1, possub = "topleft", neig = NULL, cneig = 1, image.plot=TRUE, contour.plot=TRUE, pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) { dfxy <- data.frame(dfxy) if(scale) z <- scalewt(z) if(length(z) != nrow(dfxy)) stop(paste("Non equal row numbers", nrow(dfxy), length(z))) opar <- par(mar = par("mar")) on.exit(par(opar)) par(mar = c(0.1, 0.1, 0.1, 0.1)) xy <- dfxy[,c(xax,yax)] names(xy) <- c("x","y") scatterutil.base(dfxy = xy, xax = xax, yax = yax, xlim = xlim, ylim = ylim, grid = grid, addaxes = addaxes, cgrid = cgrid, include.origin = include.origin, origin = origin, sub = sub, csub = csub, possub = possub, pixmap = pixmap, contour = contour, area = area, add.plot = add.plot) w <- cbind.data.frame(xy,z) ngrid <- floor(kgrid*sqrt(nrow(w))) if (ngrid<5) ngrid<-5 lo <- loess(z~x+y,data=w,span=span) xg <- seq(from=par("usr")[1],to=par("usr")[2],le=ngrid) yg <- seq(from=par("usr")[3],to=par("usr")[4],le=ngrid) gr <- expand.grid(xg, yg) names(gr) <- names(xy) mod <- predict(lo,newdata=gr) if(is.null(area)) { polyin <- w[chull(xy),] grin <- splancs::inpip(gr,polyin) mod[-grin] <- NA } else { grin <- rep(0,nrow(gr)) larea <- split(area[,2:3],area[,1]) lapply(larea,function(x) grin <<- grin+splancs::inout(gr,x)) mod[!grin] <- NA } mod <- matrix(mod,ngrid,ngrid) if(image.plot) image(xg,yg,mod,add=TRUE, col=gray((32:0)/32)) if(contour.plot) contour(xg,yg,mod,add=TRUE,labcex=1,lwd=2,nlevels=5,levels=pretty(z,7)[-c(1,7)],col="red") invisible(match.call()) } ade4/R/randtest.rlq.R0000644000176200001440000000727413050632301014037 0ustar liggesusersrandtest.rlq <- function(xtest, nrepet = 999, modeltype = 6, ...) { if (!inherits(xtest,"dudi")) stop("Object of class dudi expected") if (!inherits(xtest,"rlq")) stop("Object of class 'rlq' expected") if (!(modeltype %in% c(2, 4, 5, 6))) stop("modeltype should be 2, 4, 5 or 6") if(modeltype == 6){ test1 <- randtest.rlq(xtest, modeltype = 2, nrepet = nrepet, output = "full", ...) test2 <- randtest.rlq(xtest, modeltype = 4, nrepet = nrepet, output = "full", ...) res <- combine.randtest.rlq(test1,test2) res$call <- match.call() return(res) } appel <- as.list(xtest$call) dudiR <- eval.parent(appel$dudiR) dudiQ <- eval.parent(appel$dudiQ) dudiL <- eval.parent(appel$dudiL) R.cw <- dudiR$cw appelR <- as.list(dudiR$call) Rinit <- as.data.frame(eval.parent(appelR$df)) ## Test the different cases typR <- dudi.type(dudiR$call) ## index can take two values (1 quantitative / 2 factor) if(typR %in% c(1,3,4,5,6,7)) { indexR <- rep(1,ncol(Rinit)) assignR <- 1:ncol(Rinit) } else if (typR == 2) { indexR <- rep(2, ncol(Rinit)) assignR <- rep(1:ncol(Rinit), apply(Rinit, 2, function(x) nlevels(as.factor(x)))) Rinit <- acm.disjonctif(Rinit) } else if (typR == 8) { indexR <- ifelse(dudiR$index == 'q', 1, 2) assignR <- dudiR$assign res <- matrix(0, nrow(Rinit), 1) for (j in 1:(ncol(Rinit))) { if (indexR[j] == 1) { res <- cbind(res, Rinit[, j]) } else if (indexR[j] == 2) { w <- fac2disj(Rinit[, j], drop = TRUE) res <- cbind(res, w) } } Rinit <- res[,-1] } else stop ("Not yet available") Q.cw <- dudiQ$cw appelQ <- as.list(dudiQ$call) Qinit <- as.data.frame(eval.parent(appelQ$df)) typQ <- dudi.type(dudiQ$call) if (typQ %in% c(1,3,4,5,6,7)) { indexQ <- rep(1,ncol(Qinit)) assignQ <- 1:ncol(Qinit) } else if (typQ == 2) { indexQ <- rep(2,ncol(Qinit)) assignQ <- rep(1:ncol(Qinit), apply(Qinit, 2, function(x) nlevels(as.factor(x)))) Qinit <- acm.disjonctif(Qinit) } else if (typQ == 8) { indexQ <- ifelse(dudiQ$index == 'q',1,2) assignQ <- dudiQ$assign res <- matrix(0, nrow(Qinit), 1) for (j in 1:(ncol(Qinit))) { if (indexQ[j] == 1) { res <- cbind(res, Qinit[, j]) } else if (indexQ[j] == 2) { w <- fac2disj(Qinit[, j], drop = TRUE) res <- cbind(res, w) } } Qinit <- res[,-1] } else stop ("Not yet available") L <- dudiL$tab L.cw <- dudiL$cw L.lw <- dudiL$lw isim <- testertracerlq(nrepet, R.cw, Q.cw, L.lw, L.cw, Rinit, Qinit, L, typQ, typR,indexR, assignR, indexQ, assignQ, modeltype) obs <- isim[1] return(as.randtest(isim[-1], obs, call = match.call(), ...)) } combine.randtest.rlq <- function(obj1, obj2, ...) { if(!inherits(obj1, "randtest") | !inherits(obj2, "randtest")) stop("Not a 'randtest' object") call1 <- as.list(obj1$call) call2 <- as.list(obj2$call) if((call1[[1]] != "randtest.rlq") | (call2[[1]] != "randtest.rlq")) stop("Objects must obtained by the 'randtest.rlq' function") ## if argument is missing, modeltype = 5 (default) if(is.null(call1$modeltype) | is.null(call2$modeltype)) stop("modeltype(s) must be 2 or 4") ## modeltype 2 and 4 should be combined modeltypes <- c(call1$modeltype, call2$modeltype) if(sum(sort(modeltypes) == c(2,4))!=2) stop("modeltype(s) must be 2 and 4") sim <- cbind(obj1$sim, obj2$sim) colnames(sim) <- paste("Model",modeltypes) res <- as.krandtest(sim, c(obj1$obs,obj2$obs), alter = c(obj1$alter, obj2$alter), call=match.call(), p.adjust.method = "none", ...) res$comb.pvalue <- max(obj1$pvalue, obj2$pvalue) return(res) } ade4/R/statico.R0000644000176200001440000000573513125167376013106 0ustar liggesusers"statico" <- function (KTX, KTY, scannf = TRUE) { #### #### STATICO analysis #### k-table analysis of the cross-tables at each date of two ktabs #### Jean Thioulouse, 06 Nov 2009 #### This function takes 2 ktabs. It crosses each pair of tables of these ktabs #### and does a partial triadic analysis on this new ktab. #### if (!inherits(KTX, "ktab")) stop("The first argument must be a 'ktab'") if (!inherits(KTY, "ktab")) stop("The second argument must be a 'ktab'") #### Parameters of first ktab lwX <- KTX$lw cwX <- KTX$cw ncolX <- length(cwX) bloX <- KTX$blo ntabX <- length(KTX$blo) #### Parameters of second ktab lwY <- KTY$lw nligY <- length(lwY) cwY <- KTY$cw ncolY <- length(cwY) bloY <- KTY$blo ntabY <- length(KTY$blo) #### Tests of coherence of the two ktabs if (ncolX != ncolY) stop("The two ktabs must have the same column numbers") if (any(cwX != cwY)) stop("The two ktabs must have the same column weights") if (ntabX != ntabY) stop("The two ktabs must have the same number of tables") if (!all(bloX == bloY)) stop("The two tables of one pair must have the same number of columns") #### compute the crossed ktab kcoi <- ktab.match2ktabs(KTX, KTY) #### pta on the ktab res <- pta(kcoi, scannf = scannf) return(res) } "statico.krandtest" <- function (KTX, KTY, nrepet = 999, ...) { if (!inherits(KTX, "ktab")) stop("The first argument must be the environmental 'ktab'") if (!inherits(KTY, "ktab")) stop("The second argument must be the species 'ktab'") #### crossed ktab res <- list() #### Parameters of first ktab lwX <- KTX$lw cwX <- KTX$cw ncolX <- length(cwX) bloX <- KTX$blo ntabX <- length(KTX$blo) #### Parameters of second ktab lwY <- KTY$lw nligY <- length(lwY) cwY <- KTY$cw ncolY <- length(cwY) bloY <- KTY$blo ntabY <- length(KTY$blo) #### Tests of coherence of the two ktabs if (ncolX != ncolY) stop("The two ktabs must have the same column numbers") if (any(cwX != cwY)) stop("The two ktabs must have the same column weights") if (ntabX != ntabY) stop("The two ktabs must have the same number of tables") if (!all(bloX == bloY)) stop("The two tables of one pair must have the same number of columns") ntab <- ntabX indica <- as.factor(rep(1:ntab, KTX$blo)) lw <- split(cwX, indica) ksim <- matrix(0, nrow=nrepet, ncol=ntab, dimnames=list(NULL, tab.names(KTX))) kobs <- vector("numeric", ntab) #### Compute coinertias and randtests for (i in 1:ntab) { tx <- t(as.matrix(KTX[[i]])) ty <- t(as.matrix(KTY[[i]])) pcax <- dudi.pca(tx, row.w=lw[[i]], col.w=lwX, scannf=FALSE) pcay <- dudi.pca(ty, scale = FALSE, row.w=lw[[i]], col.w=lwY, scannf=FALSE) coin1 <- coinertia(pcax, pcay, scannf=FALSE) tmp <- randtest(coin1, nrepet = nrepet, output = "full") ksim[,i] <- tmp$sim kobs[i] <- tmp$obs } #### Return a krandtest as.krandtest(ksim, kobs, call = match.call(), ...) } ade4/R/testdim.R0000644000176200001440000000377013050632301013064 0ustar liggesusers"testdim" <- function (object, ...) UseMethod("testdim") "testdim.pca" <- function(object, nrepet = 99, nbax = object$rank, alpha = 0.05, ...){ if (!inherits(object, "dudi")) stop("Object of class 'dudi' expected") if (!inherits(object, "pca")) stop("Object of class 'pca' expected") appel <- as.list(object$call) appel$scale <- eval.parent(appel$scale) appel$center <- eval.parent(appel$center) if (is.null(appel$scale)) appel$scale <- TRUE if (is.null(appel$center)) appel$center <- TRUE if (!(is.logical(appel$center))) stop("Not implemented for decentred PCA") if (!(appel$center == TRUE && appel$scale == TRUE)) stop("Only implemented for PCA on correlation matrix (center=TRUE and scale=TRUE)") X <- as.matrix(object$tab) if (!(identical(all.equal(object$lw,rep(1/nrow(X), nrow(X))),TRUE))) stop("Not implemented for non-uniform row weights") if (!(identical(all.equal(object$cw,rep(1, ncol(X))),TRUE))) stop("Not implemented for non-uniform column weights") if (nbax<1) stop("Incorrect number of axes") nbax <- ifelse(nbax>min(nrow(X),ncol(X)),min(nrow(X),ncol(X)),nbax) res <- list() res <- .C("testdimRVpca", ok = as.integer(0), as.double(t(X)), as.integer(nrow(X)), as.integer(ncol(X)), as.integer(nrepet),nbax=as.integer(nbax),sim=as.double(rep(0,nbax*nrepet)),obs=as.double(rep(0,nbax)),PACKAGE="ade4")[c("ok","obs","sim")] if(res$ok < -0.5){ stop("Error in the svd decomposition") } else { res <- res[-1] } res$sim <- matrix(res$sim[1:(nbax*nrepet)],nrepet,nbax,byrow=TRUE) res$obs <- res$obs[1:nbax] res <- as.krandtest(sim=res$sim,obs=res$obs,names=paste("Axis", 1:length(res$obs)),call=match.call(), ...) nb <- which(res$pvalue>alpha) if(length(nb)==0) {res$nb <- length(res$obs)} else {res$nb <- min(nb)-1} nb2 <- which(res$pvalue>(alpha/1:length(res$obs))) if(length(nb2)==0) {res$nb.cor <- length(res$obs)} else {res$nb.cor <- min(nb2)-1} return(res) } ade4/R/dudi.hillsmith.R0000644000176200001440000000614612666306731014355 0ustar liggesusers"dudi.hillsmith" <- function (df, row.w=rep(1, nrow(df))/nrow(df), scannf = TRUE, nf = 2) { df <- as.data.frame(df) if (!is.data.frame(df)) stop("data.frame expected") df <- data.frame(df) nc <- ncol(df) nl <- nrow(df) row.w <- row.w/sum(row.w) if (any(is.na(df))) stop("na entries in table") index <- rep("", nc) for (j in 1:nc) { w1 <- "q" if (is.factor(df[, j])) w1 <- "f" if (is.ordered(df[, j])) stop("use dudi.mix for ordered data") index[j] <- w1 } res <- matrix(0, nl, 1) provinames <- "0" col.w <- NULL col.assign <- NULL k <- 0 center <- vector(mode = "numeric", length = 0) norm <- vector(mode = "numeric", length = 0) for (j in 1:nc) { if (index[j] == "q") { var.tmp <- scalewt(df[, j], wt = row.w) center <- c(center, attr(var.tmp, "scaled:center")) norm <- c(norm, attr(var.tmp, "scaled:scale")) res <- cbind(res, var.tmp) provinames <- c(provinames, names(df)[j]) col.w <- c(col.w, 1) k <- k + 1 col.assign <- c(col.assign, k) } else if (index[j] == "f") { w <- fac2disj(df[, j], drop = TRUE) center <- c(center, NA) norm <- c(norm, NA) cha <- paste(substr(names(df)[j], 1, 5), ".", names(w), sep = "") col.w.provi <- drop(row.w %*% as.matrix(w)) w <- t(t(w)/col.w.provi) - 1 col.w <- c(col.w, col.w.provi) res <- cbind(res, w) provinames <- c(provinames, cha) k <- k + 1 col.assign <- c(col.assign, rep(k, length(cha))) } } res <- data.frame(res) names(res) <- make.names(provinames, unique = TRUE) row.names(res) <- row.names(df) res <- res[, -1] names(col.w) <- provinames[-1] X <- as.dudi(res, col.w, row.w, scannf = scannf, nf = nf, call = match.call(), type = "mix") X$assign <- factor(col.assign) X$index <- factor(index) rcor <- matrix(0, nc, X$nf) rcor <- row(rcor) + 0 + (0 + (0+1i)) * col(rcor) floc <- function(x) { i <- Re(x) j <- Im(x) if (index[i] == "q") { if (sum(col.assign == i)) { w <- X$l1[, j] * X$lw * X$tab[, col.assign == i] return(sum(w)^2) } else { w <- X$lw * X$l1[, j] w <- X$tab[, col.assign == i] * w w <- apply(w, 2, sum) return(sum(w^2)) } } else if (index[i] == "f") { x <- X$l1[, j] * X$lw qual <- df[, i] poicla <- unlist(tapply(X$lw, qual, sum)) z <- unlist(tapply(x, qual, sum))/poicla return(sum(poicla * z * z)) } else return(NA) } rcor <- apply(rcor, c(1, 2), floc) rcor <- data.frame(rcor) row.names(rcor) <- names(df) names(rcor) <- names(X$l1) X$cr <- rcor X$center <- center X$norm <- norm return(X) } ade4/R/kdist2ktab.R0000644000176200001440000000317112576021756013472 0ustar liggesusers"kdist2ktab" <- function (kd, scale = TRUE, tol=1e-07) { if (!inherits(kd,"kdist")) stop ("objet 'kdist' expected") if (!all(attr(kd,"euclid"))) stop ("Euclidean distances expected") ndist <- length(kd) nind <- attributes(kd)$size distnames <- attributes(kd)$names if(is.null(distnames)) distnames <- paste("D", 1:ndist, sep = "") rnames <-attributes(kd)$label if(is.null(rnames)) rnames <- as.character(1:nind) "representationeuclidienne" <- function (x) { # x est un vecteur demi-matrice du kdist d <- matrix(0,nind,nind) d[col(d) (eig$values[1] * tol)) d <- eig$vectors[, 1:ncomp] variances <- eig$values[1:ncomp] d <- t(apply(d, 1, "*", sqrt(variances))) # d est une représentation euclidienne if (scale) { inertot <- sum(variances) d <- d/sqrt(inertot) d = d*sqrt(nrow(d)) } d <- data.frame(d) row.names(d) <- rnames names(d) <- paste("C", 1:ncomp, sep = "") return(d) } res <- lapply(kd, representationeuclidienne) names (res) <- distnames for (k in 1:ndist) { cha <- distnames[k] ncomp <- ncol(res[[k]]) names(res[[k]]) <- paste(substring (cha,1,4), 1:ncomp,sep="") } w.row <- rep(1,nind)/nind w.col <- lapply(res, function(x) rep(1, ncol(x))) res <- ktab.list.df (res, w.row=w.row,w.col=w.col ) return(res) } ade4/R/utilities.R0000644000176200001440000000327313211775710013437 0ustar liggesusersdudi.type <- function(x){ ## Test the different types of dudi ## typ=1 no modification (PCA on original variable) ## typ=2 ACM ## typ=3 normed and centred PCA ## typ=4 centred PCA ## typ=5 normed and non-centred PCA ## typ=6 COA ## typ=7 FCA ## typ=8 Hill-smith ## typ=9 Decentred PCA if(!is.call(x)) stop("Argument x should be a 'call' object") x <- match.call(eval(x[[1]]),call = x) ## fill arguments names call.list <- as.list(x) dudi.name <- deparse(call.list[[1]]) call.list <- modifyList(formals(dudi.name), call.list[-1]) ## fill with default for unused arguments if (dudi.name == "dudi.pca") { call.list$scale <- eval(call.list$scale) call.list$center <- eval(call.list$center) if(!(is.logical(call.list$center))) typ <- 9 if (!call.list$center & !call.list$scale) typ <- 1 if (!call.list$center & call.list$scale) typ <- 5 if (call.list$center & !call.list$scale) typ <- 4 if (call.list$center & call.list$scale) typ <- 3 } else if (dudi.name == "dudi.fpca") { typ <- 4 } else if (dudi.name == "dudi.coa") { typ <- 6 } else if (dudi.name == "dudi.fca") { typ <- 7 } else if (dudi.name == "dudi.acm") { typ <- 2 } else if (dudi.name == "dudi.hillsmith") { typ <- 8 } else stop ("Not yet available") return(typ) } adegraphicsLoaded <- function() { ## check if adegraphics is loaded "package:adegraphics"%in%search() } messageScannf <- function(oldCall, myNf) { newcall <- as.list(oldCall) newcall$scannf <- FALSE newcall$nf <- myNf message("\nYou can reproduce this result non-interactively with: \n", c(as.call(newcall)), "\n") }ade4/R/s.logo.R0000644000176200001440000000622012576021756012627 0ustar liggesusers"s.logo" <- function (dfxy, listlogo, klogo=NULL, clogo=1, rectlogo=TRUE, xax = 1, yax = 2, neig = NULL, cneig = 1, xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0, 0), sub = "", csub = 1.25, possub = "bottomleft", pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) { dfxy <- data.frame(dfxy) if (!is.list(listlogo)) stop (paste(deparse(substitute(listlogo)),' is not a list')) nlogo <- length(listlogo) if(is.null(klogo)) klogo <- 1:nlogo npoi <- nrow(dfxy) classico <- unlist(lapply(listlogo, function(x) (charmatch("pixmap",class(x))==1))) if (is.null(classico)) stop(paste(deparse(substitute(listlogo)),'is not a list of pixmap objects')) if (any(is.na(classico))) stop(paste(deparse(substitute(listlogo)),'is not a list of pixmap objects')) if (!all(classico)) stop(paste(deparse(substitute(listlogo)),'is not a list of pixmap objects')) klogo <- rep(klogo,length=npoi) if (any(klogo>nlogo)) stop('invalid index') rectlogo=rep(rectlogo,length=npoi) if (!is.logical(rectlogo)) stop(paste(deparse(substitute(rectlogo)),'is not logical')) clogo=rep(clogo,length=npoi) if (!is.numeric(clogo)) stop(paste(deparse(substitute(clogo)),'is not numeric')) opar <- par(mar = par("mar")) on.exit(par(opar)) par(mar = c(0.1, 0.1, 0.1, 0.1)) coo <- scatterutil.base(dfxy = dfxy, xax = xax, yax = yax, xlim = xlim, ylim = ylim, grid = grid, addaxes = addaxes, cgrid = cgrid, include.origin = include.origin, origin = origin, sub = sub, csub = csub, possub = possub, pixmap = pixmap, contour = contour, area = area, add.plot = add.plot) if (!is.null(neig)) { if (is.null(class(neig))) neig <- NULL if (class(neig) != "neig") neig <- NULL deg <- attr(neig, "degrees") if ((length(deg)) != (length(coo$x))) neig <- NULL } if (!is.null(neig)) { fun <- function(x, coo) { segments(coo$x[x[1]], coo$y[x[1]], coo$x[x[2]], coo$y[x[2]], lwd = par("lwd") * cneig) } apply(unclass(neig), 1, fun, coo = coo) } scatterutil.logo(coo$x, coo$y, listlogo, klogo, clogo, rectlogo) box() invisible(match.call()) } "scatterutil.logo" <- function(coox,cooy,lico,kico,cico,rico) { drawlogo <- function (pixmap, x , y, clogo=1, rectangle = TRUE) { w <- par("usr") luser <- w[2]-w[1] lpixe <- 96*(par("pin")[1])/clogo llogo <- attr(pixmap,"size")[2] l <- llogo*luser/lpixe/2 huser <- w[4]-w[3] hpixe <- 96*(par("pin")[2])/clogo hlogo <- attr(pixmap,"size")[1] h <- hlogo*huser/hpixe/2 pixmap::addlogo(pixmap, c(x-l,x+l),c(y-h,y+h)) if (rectangle) rect(x-l,y-h,x+l,y+h) } for (k in 1:length(coox)) { x <- coox[k] y <- cooy[k] numico <- kico[k] clogo <- cico[numico] pixmap <- lico[[numico]] rec <- rico[numico] drawlogo(pixmap, x , y, clogo, rec) #text(x,y,as.character(k),cex=3) } } ade4/R/scatter.dudi.R0000644000176200001440000000155712576021756014027 0ustar liggesusers"scatter.dudi" <- function (x, xax = 1, yax = 2, clab.row = .75, clab.col = 1, permute = FALSE, posieig = "top", sub = NULL, ...) { if (!inherits(x, "dudi")) stop("Object of class 'dudi' expected") opar <- par(mar = par("mar")) on.exit(par(opar)) coolig <- x$li[, c(xax, yax)] coocol <- x$c1[, c(xax, yax)] if (permute) { coolig <- x$co[, c(xax, yax)] coocol <- x$l1[, c(xax, yax)] } s.label(coolig, clabel = clab.row) born <- par("usr") k1 <- min(coocol[, 1])/born[1] k2 <- max(coocol[, 1])/born[2] k3 <- min(coocol[, 2])/born[3] k4 <- max(coocol[, 2])/born[4] k <- c(k1, k2, k3, k4) coocol <- 0.9 * coocol/max(k) s.arrow(coocol, clabel = clab.col, add.plot = TRUE, sub = sub, possub = "bottomright") add.scatter.eig(x$eig, x$nf, xax, yax, posi = posieig, ratio = 1/4) } ade4/R/s.traject.R0000644000176200001440000000601212576021756013322 0ustar liggesusers"s.traject" <- function (dfxy, fac = factor(rep(1, nrow(dfxy))), ord = (1:length(fac)), xax = 1, yax = 2, label = levels(fac), clabel = 1, cpoint = 1, pch = 20, xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, edge = TRUE, origin = c(0, 0), include.origin = TRUE, sub = "", csub = 1, possub = "bottomleft", cgrid = 1, pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) { opar <- par(mar = par("mar")) par(mar = c(0.1, 0.1, 0.1, 0.1)) on.exit(par(opar)) dfxy <- data.frame(dfxy) if (!is.data.frame(dfxy)) stop("Non convenient selection for dfxy") if (any(is.na(dfxy))) stop("NA non implemented") if (!is.factor(fac)) stop("factor expected for fac") if (length(fac) != nrow(dfxy)) stop("Non convenient length (fac)") if (length(ord) != nrow(dfxy)) stop("Non convenient length (ord)") coo <- scatterutil.base(dfxy = dfxy, xax = xax, yax = yax, xlim = xlim, ylim = ylim, grid = grid, addaxes = addaxes, cgrid = cgrid, include.origin = include.origin, origin = origin, sub = sub, csub = csub, possub = possub, pixmap = pixmap, contour = contour, area = area, add.plot = add.plot) arrow1 <- function(x0, y0, x1, y1, length = 0.15, angle = 15, lty = 1, edge) { d0 <- sqrt((x0 - x1)^2 + (y0 - y1)^2) if (d0 < 1e-07) return(invisible()) segments(x0, y0, x1, y1, lty = lty) h <- strheight("A", cex = par("cex")) x0 <- x1 - h * (x1 - x0)/d0 y0 <- y1 - h * (y1 - y0)/d0 if (edge) arrows(x0, y0, x1, y1, angle = 15, length = 0.1, lty = 1) } trajec <- function(X, cpoint, clabel, label) { if (nrow(X) == 1) return(as.numeric(X[1, ])) x <- X$x y <- X$y ord <- order(X$ord) fac <- as.numeric(X$fac) dmax <- 0 xmax <- 0 ymax <- 0 for (i in 1:(length(x) - 1)) { x0 <- x[ord[i]] y0 <- y[ord[i]] x1 <- x[ord[i + 1]] y1 <- y[ord[i + 1]] arrow1(x0, y0, x1, y1, lty = fac, edge = edge) if (cpoint > 0) points(x0, y0, pch = (14 + fac)%%25, cex = par("cex") * cpoint) d0 <- sqrt((origin[1] - (x0 + x1)/2)^2 + (origin[2] - (y0 + y1)/2)^2) if (d0 > dmax) { xmax <- (x0 + x1)/2 ymax <- (y0 + y1)/2 dmax <- d0 } } if (cpoint > 0) points(x[ord[length(x)]], y[ord[length(x)]], pch = (14 + fac)%%25, cex = par("cex") * cpoint) return(c(xmax, ymax)) } provi <- cbind.data.frame(x = coo$x, y = coo$y, fac = fac, ord = ord) provi <- split(provi, fac) w <- lapply(provi, trajec, cpoint = cpoint, clabel = clabel, label = label) w <- t(data.frame(w)) if (clabel > 0) scatterutil.eti(w[, 1], w[, 2], label, clabel) box() invisible(match.call()) } ade4/R/corkdist.R0000644000176200001440000001325313050632301013232 0ustar liggesusers########## mantelkdist ############### ########## RVkdist ################### ########## print.corkdist ############ ########## summary.corkdist ########## ########## plot.corkdist ############# "mantelkdist" <- function(kd, nrepet = 999, ...) { if (!inherits(kd,"kdist")) stop ("Object of class 'kdist' expected") res <- list() ndist <- length(kd) nind <- attr(kd, "size") if (nrepet<=99) nrepet <- 99 w <- matrix(0,ndist,ndist) numrow <- row(w)[row(w)>col(w)] numcol <- col(w)[row(w)>col(w)] w <- cbind.data.frame(I = numrow,J = numcol) numrow <- attr(kd, "names")[numrow] numcol <- attr(kd, "names")[numcol] cha <- paste(numrow,numcol,sep="-") row.names(w) <- cha attr(res,"design") <- w kdistelem2dist <- function (i) { m1 <- matrix(0, nind, nind) m1[row(m1) > col(m1)] <- kd[[i]] m1 <- m1 + t(m1) m1 <- as.dist(m1) m1 } k <- 0 for(i in 1:(ndist-1)) { m1 <- kdistelem2dist(i) for(j in (i+1):ndist) { m2 <- kdistelem2dist(j) k <- k+1 w <- mantel.randtest (m1, m2, nrepet, ...) w$call <- match.call() res[[k]] <- w } } names (res) <- cha attr (res,"call") <- match.call() attr (res,"test") <- "Mantel's tests" class(res) <- c("corkdist","list") return(res) } "RVkdist" <- function(kd, nrepet = 999, ...) { if (!inherits(kd,"kdist")) stop ("Object of class 'kdist' expected") if (any(!attr(kd,"euclid"))) stop ("Euclidean matrices expected") res=list() ndist <- length(kd) nind <- attr(kd, "size") if (nrepet<=99) nrepet <- 99 w <- matrix(0,ndist,ndist) numrow <- row(w)[row(w)>col(w)] numcol <- col(w)[row(w)>col(w)] w <- cbind.data.frame(I = numrow,J = numcol) numrow <- attr(kd, "names")[numrow] numcol <- attr(kd, "names")[numcol] cha <- paste(numrow,numcol,sep="-") row.names(w) <- cha attr(res,"design") <- w kdistelem2dist <- function (i) { m1 <- matrix(0, nind, nind) m1[row(m1) > col(m1)] <- kd[[i]] m1 <- m1 + t(m1) m1 <- as.dist(m1) m1 } k <- 0 for(i in 1:(ndist-1)) { m1 <- kdistelem2dist(i) for(j in (i+1):ndist) { m2 <- kdistelem2dist(j) k <- k+1 w <- RVdist.randtest (m1, m2, nrepet, ...) w$call <- match.call() res[[k]] <- w } } names (res) <- cha attr (res,"call") <- match.call() attr (res,"test") <- "RV tests" class(res) <- c("corkdist","list") return(res) } "print.corkdist" <- function (x, ...) { if (!inherits(x,"corkdist")) stop ("Object 'corkdist' expected") cat(attr (x,"test"),"for 'kdist' object\n") cat("class: ") ; cat(class(x),"\n") cat ("Call: ") ; print(attr (x,"call")) cat("\n") ; cat(names(x)[1],"\n") print.randtest (x[[1]]) if (length(x)>2) { cat("\n") ; cat(names(x)[2],"\n") print.randtest (x[[2]]) } if (length(x)==3) { cat("\n") ; cat(names(x)[3],"\n") print.randtest (x[[3]]) } if (length(x)>3) { cat("...\n") } cat("list of",length (x), "'randtest' objects\n") } summary.corkdist <- function (object, ...) { if (!inherits(object,"corkdist")) stop ("Object 'corkdist' expected") design <- attr(object, "design") cat(attr (object,"test"),"for 'kdist' object\n") cat ("Call: ") ; print(attr (object,"call")) ndig0 <- nchar(as.character(as.integer(object[[1]]$rep))) pval <- round(unlist(lapply(object, function(x) x$pvalue)), digits = ndig0) ndist <- max(design$I) res <- matrix(0,ndist,ndist) res[row(res) <= col(res)] <- NA dist.names <- names(eval.parent(as.list(attr(object,"call"))$kd)) dimnames(res) <- list(dist.names, as.character(1:length(dist.names))) res[row(res) > col(res)] <- pval cat("Simulated p-values:\n") print(res, na = "-", ...) } plot.corkdist <- function (x, whichinrow = NULL, whichincol = NULL, gap = 4, nclass = 10, ...) { kdistelem2delta <- function (i) { m1 <- matrix(0, nind, nind) m1[row(m1) > col(m1)] <- kd[[i]] m1 <- m1 + t(m1) m1 <- -m1*m1/2 m1 <- bicenter.wt(m1) return(m1[row(m1) > col(m1)]) } if (!inherits(x,"corkdist")) stop ("Object of class 'corkdist' expected") kd <- eval.parent(as.list(attr(x,"call"))$kd) design <- attr(x, "design") ndist <- length (kd) if (is.null(whichinrow)) whichinrow <- 1:ndist if (is.null(whichincol)) whichincol <- 1:ndist labels = names(kd) nind <- attr(kd, "size") old.par <- par(no.readonly = TRUE) on.exit(par(old.par)) oma <- c(2, 2, 1, 1) par(mfrow = c(length(whichinrow), length(whichincol)), mar = rep(gap/2, 4), oma = oma) for (i in whichinrow) { for (j in whichincol) { if (i==j) { plot.default(0,0,type="n",asp=1, xlab="", ylab="",xaxt="n",yaxt="n", xlim=c(0,1), ylim=c(0,1), xaxs="i", yaxs="i", frame.plot=FALSE) l.wid <- strwidth(labels, "user") cex.labels <- max(0.8, min(2, 0.9/max(l.wid))) text(0.5, 0.5, labels[i], cex = cex.labels, font = 1) } else if (i>j) { n0 <- (1:nrow(design))[design$I==i & design$J==j] titre <- row.names(design)[n0] plot(x[[n0]], main = titre, nclass = nclass) } else if (j>i) { if (attr(x,"test")=="Mantel's tests") plot(kd[[i]],kd[[j]]) else { plot(kdistelem2delta(i),kdistelem2delta(j)) } } } } } ade4/R/wca.R0000644000176200001440000001045013175633655012203 0ustar liggesuserswca <- function (x, ...) UseMethod("wca") "wca.dudi" <- function (x, fac, scannf = TRUE, nf = 2, ...) { if (!inherits(x, "dudi")) stop("Object of class dudi expected") if (!is.factor(fac)) stop("factor expected") lig <- nrow(x$tab) if (length(fac) != lig) stop("Non convenient dimension") cla.w <- tapply(x$lw, fac, sum) mean.w <- function(x, w, fac, cla.w) { z <- x * w z <- tapply(z, fac, sum)/cla.w return(z) } tabmoy <- apply(x$tab, 2, mean.w, w = x$lw, fac = fac, cla.w = cla.w) tabw <- unlist(tapply(x$lw, fac, sum)) tabw <- tabw/sum(tabw) tabwit <- x$tab - tabmoy[fac, ] res <- as.dudi(tabwit, x$cw, x$lw, scannf = scannf, nf = nf, call = match.call(), type = "wit") res$ratio <- sum(res$eig)/sum(x$eig) U <- as.matrix(res$c1) * unlist(res$cw) U <- data.frame(as.matrix(x$tab) %*% U) row.names(U) <- row.names(x$tab) names(U) <- names(res$li) res$ls <- U U <- as.matrix(res$c1) * unlist(res$cw) U <- data.frame(t(as.matrix(x$c1)) %*% U) row.names(U) <- names(x$li) names(U) <- names(res$li) res$as <- U res$tabw <- tabw res$fac <- fac class(res) <- c("within", "dudi") return(res) } "plot.within" <- function (x, xax = 1, yax = 2, ...) { if (!inherits(x, "within")) stop("Use only with 'within' objects") if ((x$nf == 1) || (xax == yax)) { return(invisible()) } if (xax > x$nf) stop("Non convenient xax") if (yax > x$nf) stop("Non convenient yax") fac <- x$fac def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) layout(matrix(c(1, 2, 3, 4, 4, 5, 4, 4, 6), 3, 3), respect = TRUE) par(mar = c(0.2, 0.2, 0.2, 0.2)) s.arrow(x$c1, xax = xax, yax = yax, sub = "Canonical weights", csub = 2, clabel = 1.25) s.arrow(x$co, xax = xax, yax = yax, sub = "Variables", csub = 2, clabel = 1.25) scatterutil.eigen(x$eig, wsel = c(xax, yax)) s.class(x$ls, fac, wt = x$lw, xax = xax, yax = yax, sub = "Scores and classes", csub = 2, clabel = 1.5, cpoint = 2) s.corcircle(x$as, xax = xax, yax = yax, sub = "Inertia axes", csub = 2, cgrid = 0, clabel = 1.25) s.class(x$li, fac, wt = x$lw, xax = xax, yax = yax, axesell = FALSE, clabel = 0, cstar = 0, sub = "Common centring", csub = 2) } "print.within" <- function (x, ...) { if (!inherits(x, "within")) stop("to be used with 'within' object") cat("Within analysis\n") cat("call: ") print(x$call) cat("class: ") cat(class(x), "\n") cat("\n$nf (axis saved) :", x$nf) cat("\n$rank: ", x$rank) cat("\n$ratio: ", x$ratio) cat("\n\neigen values: ") l0 <- length(x$eig) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n\n") else cat("\n\n") sumry <- array("", c(5, 4), list(1:5, c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$eig", length(x$eig), mode(x$eig), "eigen values") sumry[2, ] <- c("$lw", length(x$lw), mode(x$lw), "row weigths") sumry[3, ] <- c("$cw", length(x$cw), mode(x$cw), "col weigths") sumry[4, ] <- c("$tabw", length(x$tabw), mode(x$tabw), "class weigths") sumry[5, ] <- c("$fac", length(x$fac), mode(x$fac), "factor for grouping") print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(7, 4), list(1:7, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$tab", nrow(x$tab), ncol(x$tab), "array class-variables") sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), "row coordinates") sumry[3, ] <- c("$l1", nrow(x$l1), ncol(x$l1), "row normed scores") sumry[4, ] <- c("$co", nrow(x$co), ncol(x$co), "column coordinates") sumry[5, ] <- c("$c1", nrow(x$c1), ncol(x$c1), "column normed scores") sumry[6, ] <- c("$ls", nrow(x$ls), ncol(x$ls), "supplementary row coordinates") sumry[7, ] <- c("$as", nrow(x$as), ncol(x$as), "inertia axis onto within axis") print(sumry, quote = FALSE) cat("\n") } summary.within <- function(object, ...) { thetitle <- "Within-class analysis" cat(thetitle) cat("\n\n") NextMethod() appel <- as.list(object$call) dudi <- eval.parent(appel$x) cat(paste("Total unconstrained inertia (", deparse(appel$x), "): ", sep = "")) cat(signif(sum(dudi$eig), 4)) cat("\n\n") cat(paste("Inertia of", deparse(appel$x), "independent of", deparse(appel$fac), "(%): ")) cat(signif(object$ratio * 100, 4)) cat("\n\n") } ade4/R/mcoa.R0000644000176200001440000002535413211775710012347 0ustar liggesusers"mcoa" <- function (X, option = c("inertia", "lambda1", "uniform", "internal"), scannf = TRUE, nf = 3, tol = 1e-07) { if (!inherits(X, "ktab")) stop("object 'ktab' expected") option <- option[1] if (option == "internal") { if (is.null(X$tabw)) { warning("Internal weights not found: uniform weigths are used") option <- "uniform" } } lw <- X$lw nlig <- length(lw) cw <- X$cw ncol <- length(cw) nbloc <- length(X$blo) indicablo <- X$TC[, 1] veclev <- levels(X$TC[,1]) Xsepan <- sepan(X, nf = 4) rank.fac <- factor(rep(1:nbloc, Xsepan$rank)) tabw <- NULL auxinames <- ktab.util.names(X) if (option == "lambda1") { for (i in 1:nbloc) tabw <- c(tabw, 1/Xsepan$Eig[rank.fac == i][1]) } else if (option == "inertia") { for (i in 1:nbloc) tabw <- c(tabw, 1/sum(Xsepan$Eig[rank.fac == i])) } else if (option == "uniform") { tabw <- rep(1, nbloc) } else if (option == "internal") tabw <- X$tabw else stop("Unknown option") for (i in 1:nbloc) X[[i]] <- X[[i]] * sqrt(tabw[i]) Xsepan <- sepan(X, nf = 4) normaliserparbloc <- function(scorcol) { for (i in 1:nbloc) { w1 <- scorcol[indicablo == veclev[i]] w2 <- sqrt(sum(w1 * w1)) if (w2 > tol) w1 <- w1/w2 scorcol[indicablo == veclev[i]] <- w1 } return(scorcol) } recalculer <- function(tab, scorcol) { for (k in 1:nbloc) { soustabk <- tab[, indicablo == veclev[k]] uk <- scorcol[indicablo == veclev[k]] soustabk.hat <- t(apply(soustabk, 1, function(x) sum(x * uk) * uk)) soustabk <- soustabk - soustabk.hat tab[, indicablo == veclev[k]] <- soustabk } return(tab) } tab <- as.matrix(X[[1]]) for (i in 2:nbloc) { tab <- cbind(tab, X[[i]]) } names(tab) <- auxinames$col tab <- tab * sqrt(lw) tab <- t(t(tab) * sqrt(cw)) compogene <- list() uknorme <- list() valsing <- NULL nfprovi <- min(c(20, nlig, ncol)) for (i in 1:nfprovi) { af <- svd(tab) w <- af$u[, 1] w <- w/sqrt(lw) compogene[[i]] <- w w <- af$v[, 1] w <- normaliserparbloc(w) tab <- recalculer(tab, w) w <- w/sqrt(cw) uknorme[[i]] <- w w <- af$d[1] valsing <- c(valsing, w) } pseudoeig <- valsing^2 if (scannf) { barplot(pseudoeig) cat("Select the number of axes: ") nf <- as.integer(readLines(n = 1)) messageScannf(match.call(), nf) } if (nf <= 0) nf <- 2 acom <- list() acom$pseudoeig <- pseudoeig w <- matrix(0, nbloc, nf) for (i in 1:nbloc) { w1 <- Xsepan$Eig[rank.fac == i] r0 <- Xsepan$rank[i] if (r0 > nf) r0 <- nf w[i, 1:r0] <- w1[1:r0] } w <- data.frame(w) row.names(w) <- Xsepan$tab.names names(w) <- paste("lam", 1:nf, sep = "") acom$lambda <- w w <- matrix(0, nlig, nf) for (j in 1:nf) w[, j] <- compogene[[j]] w <- data.frame(w) names(w) <- paste("SynVar", 1:nf, sep = "") row.names(w) <- row.names(X) acom$SynVar <- w w <- matrix(0, ncol, nf) for (j in 1:nf) w[, j] <- uknorme[[j]] w <- data.frame(w) names(w) <- paste("Axis", 1:nf, sep = "") row.names(w) <- auxinames$col acom$axis <- w w <- matrix(0, nlig * nbloc, nf) covar <- matrix(0, nbloc, nf) i1 <- 0 i2 <- 0 for (k in 1:nbloc) { i1 <- i2 + 1 i2 <- i2 + nlig urk <- as.matrix(acom$axis[indicablo == veclev[k], ]) tab <- as.matrix(X[[k]]) urk <- urk * cw[indicablo == veclev[k]] urk <- tab %*% urk w[i1:i2, ] <- urk urk <- urk * acom$SynVar * lw covar[k, ] <- apply(urk, 2, sum) } w <- data.frame(w, row.names = auxinames$row) names(w) <- paste("Axis", 1:nf, sep = "") acom$Tli <- w covar <- data.frame(covar) row.names(covar) <- tab.names(X) names(covar) <- paste("cov2", 1:nf, sep = "") acom$cov2 <- covar^2 w <- matrix(0, nlig * nbloc, nf) i1 <- 0 i2 <- 0 for (k in 1:nbloc) { i1 <- i2 + 1 i2 <- i2 + nlig tab <- acom$Tli[i1:i2, ] tab <- as.matrix(sweep(tab, 2, sqrt(colSums((tab*sqrt(lw))^2)), "/")) w[i1:i2, ] <- tab } w <- data.frame(w, row.names = auxinames$row) names(w) <- paste("Axis", 1:nf, sep = "") acom$Tl1 <- w w <- matrix(0, ncol, nf) i1 <- 0 i2 <- 0 for (k in 1:nbloc) { i1 <- i2 + 1 i2 <- i2 + ncol(X[[k]]) urk <- as.matrix(acom$SynVar) tab <- as.matrix(X[[k]]) urk <- urk * lw w[i1:i2, ] <- t(tab) %*% urk } w <- data.frame(w, row.names = auxinames$col) names(w) <- paste("SV", 1:nf, sep = "") acom$Tco <- w var.names <- NULL w <- matrix(0, nbloc * 4, nf) i1 <- 0 i2 <- 0 for (k in 1:nbloc) { i1 <- i2 + 1 i2 <- i2 + 4 urk <- as.matrix(acom$axis[indicablo == veclev[k], ]) tab <- as.matrix(Xsepan$C1[indicablo == veclev[k], ]) urk <- urk * cw[indicablo == veclev[k]] tab <- t(tab) %*% urk for (i in 1:min(nf, 4)) { if (tab[i, i] < 0) { for (j in 1:nf) tab[i, j] <- -tab[i, j] } } w[i1:i2, ] <- tab var.names <- c(var.names, paste(Xsepan$tab.names[k], ".a", 1:4, sep = "")) } w <- data.frame(w, row.names = auxinames$tab) names(w) <- paste("Axis", 1:nf, sep = "") acom$Tax <- w acom$nf <- nf acom$TL <- X$TL acom$TC <- X$TC acom$T4 <- X$T4 class(acom) <- "mcoa" acom$call <- match.call() return(acom) } "plot.mcoa" <- function (x, xax = 1, yax = 2, eig.bottom = TRUE, ...) { if (!inherits(x, "mcoa")) stop("Object of type 'mcoa' expected") nf <- x$nf if (xax > nf) stop("Non convenient xax") if (yax > nf) stop("Non convenient yax") opar <- par(mar = par("mar"), mfrow = par("mfrow"), xpd = par("xpd")) on.exit(par(opar)) par(mfrow = c(2, 2)) coolig <- x$SynVar[, c(xax, yax)] for (k in 2:nrow(x$cov2)) { coolig <- rbind.data.frame(coolig, x$SynVar[, c(xax, yax)]) } names(coolig) <- names(x$Tl1)[c(xax, yax)] row.names(coolig) <- row.names(x$Tl1) s.match(x$Tl1[, c(xax, yax)], coolig, clabel = 0, sub = "Row projection", csub = 1.5, edge = FALSE) s.label(x$SynVar[, c(xax, yax)], add.plot = TRUE) coocol <- x$Tco[, c(xax, yax)] s.arrow(coocol, sub = "Col projection", csub = 1.5) valpr <- function(x) { opar <- par(mar = par("mar")) on.exit(par(opar)) born <- par("usr") w <- x$pseudoeig col <- rep(grey(1), length(w)) col[1:nf] <- grey(0.8) col[c(xax, yax)] <- grey(0) l0 <- length(w) xx <- seq(born[1], born[1] + (born[2] - born[1]) * l0/60, le = l0 + 1) w <- w/max(w) w <- w * (born[4] - born[3])/4 par(mar = c(0.1, 0.1, 0.1, 0.1)) if (eig.bottom) m3 <- born[3] else m3 <- born[4] - w[1] w <- m3 + w rect(xx[1], m3, xx[l0 + 1], w[1], col = grey(1)) for (i in 1:l0) rect(xx[i], m3, xx[i + 1], w[i], col = col[i]) } s.corcircle(x$Tax[x$T4[, 2] == 1, ], fullcircle = FALSE, sub = "First axis projection", possub = "topright", csub = 1.5) valpr(x) plot(x$cov2[, c(xax, yax)]) scatterutil.grid(0) title(main = "Pseudo-eigen values") par(xpd = TRUE) scatterutil.eti(x$cov2[, xax], x$cov2[, yax], label = row.names(x$cov2), clabel = 1) } "print.mcoa" <- function (x, ...) { if (!inherits(x, "mcoa")) stop("non convenient data") cat("Multiple Co-inertia Analysis\n") cat(paste("list of class", class(x))) l0 <- length(x$pseudoeig) cat("\n\n$pseudoeig:", l0, "pseudo eigen values\n") cat(signif(x$pseudoeig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n") else cat("\n") cat("\n$call: ") print(x$call) cat("\n$nf:", x$nf, "axis saved\n\n") sumry <- array("", c(11, 4), list(1:11, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$SynVar", nrow(x$SynVar), ncol(x$SynVar), "synthetic scores") sumry[2, ] <- c("$axis", nrow(x$axis), ncol(x$axis), "co-inertia axis") sumry[3, ] <- c("$Tli", nrow(x$Tli), ncol(x$Tli), "co-inertia coordinates") sumry[4, ] <- c("$Tl1", nrow(x$Tl1), ncol(x$Tl1), "co-inertia normed scores") sumry[5, ] <- c("$Tax", nrow(x$Tax), ncol(x$Tax), "inertia axes onto co-inertia axis") sumry[6, ] <- c("$Tco", nrow(x$Tco), ncol(x$Tco), "columns onto synthetic scores") sumry[7, ] <- c("$TL", nrow(x$TL), ncol(x$TL), "factors for Tli Tl1") sumry[8, ] <- c("$TC", nrow(x$TC), ncol(x$TC), "factors for Tco") sumry[9, ] <- c("$T4", nrow(x$T4), ncol(x$T4), "factors for Tax") sumry[10, ] <- c("$lambda", nrow(x$lambda), ncol(x$lambda), "eigen values (separate analysis)") sumry[11, ] <- c("$cov2", nrow(x$cov2), ncol(x$cov2), "pseudo eigen values (synthetic analysis)") print(sumry, quote = FALSE) cat("other elements: ") if (length(names(x)) > 14) cat(names(x)[15:(length(x))], "\n") else cat("NULL\n") } "summary.mcoa" <- function (object, ...) { if (!inherits(object, "mcoa")) stop("non convenient data") cat("Multiple Co-inertia Analysis\n") appel <- as.list(object$call) X <- eval.parent(appel$X) lw <- sqrt(X$lw) cw <- X$cw ncol <- length(cw) nbloc <- length(X$blo) nf <- object$nf for (i in 1:nbloc) { cat("Array number", i, names(X)[[i]], "Rows", nrow(X[[i]]), "Cols", ncol(X[[i]]), "\n") eigval <- unlist(object$lambda[i, ]) eigval <- zapsmall(eigval) eigvalplus <- zapsmall(cumsum(eigval)) w <- object$Tli[object$TL[, 1] == levels(object$TL[,1])[i], ] w <- w * lw varproj <- zapsmall(apply(w * w, 2, sum)) varprojplus <- zapsmall(cumsum(varproj)) w1 <- object$SynVar w1 <- w1 * lw cos2 <- apply(w * w1, 2, sum) cos2 <- cos2^2/varproj cos2[is.infinite(cos2)] <- NA cos2 <- zapsmall(cos2) sumry <- array("", c(nf, 6), list(1:nf, c("Iner", "Iner+", "Var", "Var+", "cos2", "cov2"))) sumry[, 1] <- round(eigval, digits = 3) sumry[, 2] <- round(eigvalplus, digits = 3) sumry[, 3] <- round(varproj, digits = 3) sumry[, 4] <- round(varprojplus, digits = 3) sumry[, 5] <- round(cos2, digits = 3) sumry[, 6] <- round(object$cov2[i, ], digits = 3) print(sumry, quote = FALSE) cat("\n") } } ade4/R/randboot.R0000644000176200001440000000154512576021756013243 0ustar liggesusersrandboot <- function (object, ...) { UseMethod("randboot") } as.randboot <- function(obs, boot, quantiles = c(0.025, 0.975), call = match.call()){ ## obs: observed value of the statistic ## boot: a vector (length n) with bootstrapped values ## n: number of repetitions res <- list(obs = obs, boot = boot, rep = length(na.omit(boot))) res$stats <- obs - quantile(boot - obs, probs = rev(quantiles), na.rm = TRUE) names(res$stats) <- rev(names(res$stats)) res$call <- call class(res) <- "randboot" return(res) } print.randboot <- function(x, ...){ if (!inherits(x, "randboot")) stop("Non convenient data") cat("Bootstrap\n") cat("Call: ") print(x$call) cat("\nObservation:", x$obs, "\n") cat("\nBased on", x$rep, "replicates\n") cat("\nConfidence Interval:\n") print(x$stats) } ade4/R/mantel.rtest.R0000644000176200001440000000250213211777243014041 0ustar liggesusers"mantel.rtest" <- function (m1, m2, nrepet = 99, ...) { if (!inherits(m1, "dist")) stop("Object of class 'dist' expected") if (!inherits(m2, "dist")) stop("Object of class 'dist' expected") n <- attr(m1, "Size") if (n != attr(m2, "Size")) stop("Non convenient dimension") permutedist <- function(m) { w0 <- sample.int(attr(m, "Size")) m <- as.matrix(m) return(as.dist(m[w0, w0])) } mantelnoneuclid <- function(m1, m2, nrepet) { obs <- cor(unclass(m1), unclass(m2)) if (nrepet == 0) return(obs) perm <- matrix(0, nrow = nrepet, ncol = 1) perm <- apply(perm, 1, function(x) cor(unclass(m1), unclass(permutedist(m2)))) w <- as.randtest(obs = obs, sim = perm, call = match.call(), subclass = "mantelrtest", ...) return(w) } if (is.euclid(m1) & is.euclid(m2)) { tab1 <- pcoscaled(m1) obs <- cor(dist.quant(tab1, 1), m2) if (nrepet == 0) return(obs) perm <- rep(0, nrepet) perm <- unlist(lapply(perm, function(x) cor(dist(tab1[sample(n), ]), m2))) w <- as.randtest(obs = obs, sim = perm, call = match.call(), subclass = "mantelrtest", ...) return(w) } w <- mantelnoneuclid(m1, m2, nrepet = nrepet) return(w) } ade4/R/print.4thcorner.R0000644000176200001440000000345012576021756014473 0ustar liggesusers"print.4thcorner" <- function(x,varQ = 1:length(x$varnames.Q), varR = 1:length(x$varnames.R), stat = c("D","D2"), ...){ stat <- match.arg(stat) if(!inherits(x, "4thcorner.rlq")){ if(stat=="D"){ xrand <- x$tabD } else { xrand <- x$tabD2 } idx.colR <- which(x$assignR %in% varR) idx.colQ <- which(x$assignQ %in% varQ) idx.vars <- sort(as.vector(outer(X = idx.colQ, Y = idx.colR, function(X,Y) length(x$assignR) * (X - 1) + Y))) } else { xrand <- x$tabG idx.vars <- 1:length(xrand$names) } cat("Fourth-corner Statistics\n") cat("------------------------\n") cat("Permutation method ",x$model," (",x$npermut," permutations)\n") cat("\nAdjustment method for multiple comparisons: ", xrand$adj.method, "\n") cat("call: ",deparse(x$call),"\n\n") cat("---\n\n") ## idx.vars <- length(x$assignR) * (idx.colQ - 1) + idx.colR sumry <- list(Test = xrand$names, Stat= xrand$statnames, Obs = xrand$obs, Std.Obs = xrand$expvar[, 1], Alter = xrand$alter) sumry <- as.matrix(as.data.frame(sumry)) if (any(xrand$rep[1] != xrand$rep)) { sumry <- cbind(sumry[, 1:4], N.perm = xrand$rep) } sumry <- cbind(sumry, Pvalue = xrand$pvalue) if (xrand$adj.method != "none") sumry <- cbind(sumry, Pvalue.adj = xrand$adj.pvalue) signifpval <- symnum(xrand$adj.pvalue, corr = FALSE, na = FALSE, cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1), symbols = c("***", "**", "*", ".", " ")) sumry <- cbind(sumry,signifpval) colnames(sumry)[ncol(sumry)] <- " " sumry <- sumry[idx.vars, , drop = FALSE] rownames(sumry) <- 1:nrow(sumry) print(sumry, quote = FALSE, right = TRUE) cat("\n---\nSignif. codes: ", attr(signifpval, "legend"), "\n") invisible(sumry) } ade4/R/randtest.dpcoa.R0000644000176200001440000000235213352722646014340 0ustar liggesusersrandtest.dpcoa <- function(xtest, model = c("1p","1s"), nrepet = 99, alter = c("greater", "less", "two-sided"), ...){ if (!inherits(xtest, "dpcoa")) stop("Type 'dpcoa' expected") appel <- as.list(xtest$call) df0 <- eval.parent(appel$df) df <- as.data.frame(t(df0)) dis <- eval.parent(appel$dis) if(is.character(model)) model <- model[1] if(nrow(df) < 3) stop("df is too small for a permutation test") obs <- apqe(df, dis) obs <- obs$results[1,]/obs$results[3,] funrandomization <- function(i){ if(is.function(model)) simdf <- as.data.frame(t(model(df0, ...))) else{ if(model=="1s"){ funperm <- function(x){ begin <- (1:length(x))[x>0] if(length(begin)==1) return(x) else{ end <- sample(begin) simx <- x simx[begin] <- x[end] return(simx) } } simdf <- sapply(df, funperm) } else{ if(model=="1p") simdf <- df[sample(1:nrow(df)), ] else stop("The definition of the parameter 'model' is not correct") } } sim <- apqe(simdf, dis) sim <- sim$results[1,]/sim$results[3,] return(sim) } ressim <- sapply(1:nrepet, funrandomization) res <- as.randtest(obs = obs, sim = ressim, alter = alter, call = match.call(), ...) return(res) } ade4/R/randtest.amova.R0000644000176200001440000000352513050632301014337 0ustar liggesusersrandtest.amova <- function(xtest, nrepet = 99, ...) { if (!inherits(xtest, "amova")) stop("Object of class 'amova' expected for xtest") if (nrepet <= 1) stop("Non convenient nrepet") distances <- as.matrix(xtest$distances) / 2 samples <- as.matrix(xtest$samples) structures <- xtest$structures ddl <- xtest$results$Df ddl[1:(length(ddl) - 1)] <- ddl[(length(ddl) - 1):1] sigma <- xtest$componentsofcovariance$Sigma lesss <- xtest$results$"Sum Sq" if (is.null(structures)) { structures <- cbind.data.frame(rep(1, nrow(samples))) indic <- 0 } else { for (i in 1:ncol(structures)) { structures[, i] <- factor(as.numeric(structures[, i])) } indic <- 1 } if (indic != 0) { longueurresult <- nrepet * (length(sigma) - 1) res <- testamova(distances, nrow(distances), nrow(distances), samples, nrow(samples), ncol(samples), structures, nrow(structures), ncol(structures), indic, sum(samples), nrepet, lesss[length(lesss)] / sum(samples), ddl, longueurresult) restests <- matrix(res, nrepet, length(sigma) - 1, byrow = TRUE) alts <- rep("greater", length(names(structures)) + 1) permutationtests <- as.krandtest(sim=restests,obs=sigma[(length(sigma) - 1):1],names = paste("Variations", c("within samples", "between samples", paste("between", names(structures)))), alter=c("less", alts), call = match.call(), ...) } else { longueurresult <- nrepet * (length(sigma) - 2) res <- testamova(distances, nrow(distances), nrow(distances), samples, nrow(samples), ncol(samples), structures, nrow(structures), ncol(structures), indic, sum(samples), nrepet, lesss[length(lesss)] / sum(samples), ddl, longueurresult) permutationtests <- as.randtest(sim = res, obs = sigma[1], ...) } return(permutationtests) } ade4/R/divcmax.R0000644000176200001440000000661712576021756013073 0ustar liggesusersdivcmax <- function(dis, epsilon = 1e-008, comment = FALSE) { # inititalisation if(!inherits(dis, "dist")) stop("Distance matrix expected") if(epsilon <= 0) stop("epsilon must be positive") if(!is.euclid(dis)) stop("Euclidean property is expected for dis") D2 <- as.matrix(dis)^2 / 2 n <- dim(D2)[1] result <- data.frame(matrix(0, n, 4)) names(result) <- c("sim", "pro", "met", "num") relax <- 0 # determination de la valeur initiale x0 x0 <- apply(D2, 1, sum) / sum(D2) result$sim <- x0 # ponderation simple objective0 <- t(x0) %*% D2 %*% x0 if (comment == TRUE) print("evolution of the objective function:") xk <- x0 # grande boucle de test des conditions de Kuhn-Tucker repeat { # boucle de test de nullite du gradient projete repeat { maxi.temp <- t(xk) %*% D2 %*% xk if(comment == TRUE) print(as.character(maxi.temp)) #calcul du gradient deltaf <- (-2 * D2 %*% xk) # determination des contraintes saturees sature <- (abs(xk) < epsilon) if(relax != 0) { sature[relax] <- FALSE relax <- 0 } # construction du gradient projete yk <- ( - deltaf) yk[sature] <- 0 yk[!(sature)] <- yk[!(sature)] - mean(yk[!( sature)]) # test de la nullite du gradient projete if (max(abs(yk)) < epsilon) { break } # determination du pas le plus grand compatible avec les contraintes alpha.max <- as.vector(min( - xk[yk < 0] / yk[yk < 0])) alpha.opt <- as.vector( - (t(xk) %*% D2 %*% yk) / ( t(yk) %*% D2 %*% yk)) if ((alpha.opt > alpha.max) | (alpha.opt < 0)) { alpha <- alpha.max } else { alpha <- alpha.opt } if (abs(maxi.temp - t(xk + alpha * yk) %*% D2 %*% ( xk + alpha * yk)) < epsilon) { break } xk <- xk + alpha * yk } # verification des conditions de KT if (prod(!sature) == 1) { if (comment == TRUE) print("KT") break } vectD2 <- D2 %*% xk u <- 2 * (mean(vectD2[!sature]) - vectD2[sature]) if (min(u) >= 0) { if (comment == TRUE) print("KT") break } else { if (comment == TRUE) print("relaxation") satu <- (1:n)[sature] relax <- satu[u == min(u)] relax <-relax[1] } } if (comment == TRUE) print(list(objective.init = objective0, objective.final = maxi.temp)) result$num <- as.vector(xk, mode = "numeric") result$num[result$num < epsilon] <- 0 # ponderation numerique xk <- x0 / sqrt(sum(x0 * x0)) repeat { yk <- D2 %*% xk yk <- yk / sqrt(sum(yk * yk)) if (max(xk - yk) > epsilon) { xk <- yk } else break } x0 <- as.vector(yk, mode = "numeric") result$pro <- x0 / sum(x0) # ponderation propre result$met <- x0 * x0 # ponderation propre restot <- list() restot$value <- divc(cbind.data.frame(result$num), dis)[,1] restot$vectors <- result return(restot) } ade4/R/rtest.between.R0000644000176200001440000000300613050632301014174 0ustar liggesusers"rtest.between" <- function (xtest, nrepet = 99, ...) { if (!inherits(xtest, "dudi")) stop("Object of class dudi expected") if (!inherits(xtest, "between")) stop("Type 'between' expected") appel <- as.list(xtest$call) dudi1 <- eval.parent(appel[[2]]) ## could work with bca (appel$x) or between (appel$dudi) fac <- eval.parent(appel$fac) X <- dudi1$tab X.lw <- dudi1$lw X.lw <- X.lw/sum(X.lw) if ((!(identical(all.equal(X.lw,rep(1/nrow(X), nrow(X))),TRUE)))) { if(as.list(dudi1$call)[[1]] == "dudi.acm" ) stop ("Not implemented for non-uniform weights in the case of dudi.acm") else if(as.list(dudi1$call)[[1]] == "dudi.hillsmith" ) stop ("Not implemented for non-uniform weights in the case of dudi.hillsmith") else if(as.list(dudi1$call)[[1]] == "dudi.mix" ) stop ("Not implemented for non-uniform weights in the case of dudi.mix") } X.cw <- sqrt(dudi1$cw) X <- t(t(X) * X.cw) inertot <- sum(dudi1$eig) inerinter <- function(perm = TRUE) { if (perm) sel <- sample(nrow(X)) else sel <- 1:nrow(X) Y <- X[sel, ] Y.lw <- X.lw[sel] cla.w <- tapply(Y.lw, fac, sum) Y <- apply(Y * Y.lw, 2, function(x) tapply(x, fac, sum)/cla.w) inerb <- sum(apply(Y, 2, function(x) sum(x * x * cla.w))) return(inerb/inertot) } obs <- inerinter(FALSE) sim <- unlist(lapply(1:nrepet, inerinter)) return(as.randtest(sim, obs, call = match.call(), ...)) } ade4/R/randtest-internal.R0000644000176200001440000000755212600020650015051 0ustar liggesuserstestdiscrimin <- function(npermut, rank, pl, indica, tab, l1, c1) .C("testdiscrimin", as.integer(npermut), as.double(rank), as.double(pl), as.integer(length(pl)), as.double(indica), as.integer(length(indica)), as.double(t(tab)), as.integer(l1), as.integer(c1), inersim = double(npermut+1), PACKAGE="ade4")$inersim testertrace <- function(npermut, pc1, pc2, tab1, tab2, l1, c1, c2) .C("testertrace", as.integer(npermut), as.double(pc1), as.double(pc2), as.double(t(tab1)), as.integer(l1), as.integer(c1), as.double(t(tab2)), as.integer(c2), inersim = double(npermut+1), PACKAGE="ade4")$inersim testertracenu <- function(npermut, pc1, pc2, pl, tab1, tab2, l1, c1, c2, Xinit, Yinit, typX, typY) .C("testertracenu", as.integer(npermut), as.double(pc1), as.double(pc2), as.double(pl), as.double(t(tab1)), as.integer(l1), as.integer(c1), as.double(t(tab2)), as.integer(c2), as.double(t(Xinit)), as.double(t(Yinit)), as.integer(typX), as.integer(typY), inersim = double(npermut+1), PACKAGE="ade4")$inersim testertracenubis <- function(npermut, pc1, pc2, pl, tab1, tab2, l1, c1, c2, Xinit, Yinit, typX, typY, fixed) .C("testertracenubis", as.integer(npermut), as.double(pc1), as.double(pc2), as.double(pl), as.double(t(tab1)), as.integer(l1), as.integer(c1), as.double(t(tab2)), as.integer(c2), as.double(t(Xinit)), as.double(t(Yinit)), as.integer(typX), as.integer(typY), as.integer(fixed), inersim = double(npermut+1), PACKAGE="ade4")$inersim testinter <- function(npermut, pl, pc, moda, indica, tab, l1, c1) .C("testinter", as.integer(npermut), as.double(pl), as.integer(length(pl)), as.double(pc), as.integer(length(pc)), as.integer(moda), as.double(indica), as.integer(length(indica)), as.double(t(tab)), as.integer(l1), as.integer(c1), inersim = double(npermut+1), PACKAGE="ade4")$inersim testprocuste <- function(npermut, lig, c1, c2, tab1, tab2) .C("testprocuste", as.integer(npermut), as.integer(lig), as.integer(c1), as.integer(c2), as.double(t(tab1)), as.double(t(tab2)), inersim = double(npermut+1), PACKAGE="ade4")$inersim testmantel <- function(npermut, col, tab1, tab2) .C("testmantel", as.integer(npermut), as.integer(col), as.double(t(tab1)), as.double(t(tab2)), inersim = double(npermut+1), PACKAGE="ade4")$inersim testamova <- function(distab, l1, c1, samtab, l2, c2, strtab, l3, c3, indic, nbhapl, npermut, divtotal, df, r2) .C("testamova", as.double(t(distab)), as.integer(l1), as.integer(c1), as.integer(t(samtab)), as.integer(l2), as.integer(c2), as.integer(t(strtab)), as.integer(l3), as.integer(c3), as.integer(indic), as.integer(nbhapl), as.integer(npermut), as.double(divtotal), as.double(df), result = double(r2), PACKAGE="ade4")$result testertracerlq <- function (npermut, pcR, pcQ, plL, pcL, tabR, tabQ, tabL, typQ, typR, indexR, assignR, indexQ, assignQ, modeltype) .C("testertracerlq", as.integer(npermut), as.double(pcR), as.integer(length(pcR)), as.double(pcQ), as.integer(length(pcQ)), as.double(plL), as.integer(length(plL)), as.double(pcL), as.integer(length(pcL)), as.double(t(tabR)), as.double(t(tabQ)), as.double(t(tabL)), as.integer(assignR), as.integer(assignQ), as.integer(indexR), as.integer (length(indexR)), as.integer(indexQ), as.integer (length(indexQ)), as.integer(typQ), as.integer(typR), inersim = double(npermut+1), modeltype=as.integer(modeltype), PACKAGE = "ade4")$inersim ade4/R/procuste.R0000644000176200001440000001114313050632301013250 0ustar liggesusers"procuste" <- function (dfX, dfY, scale = TRUE, nf = 4, tol = 1e-07) { dfX <- data.frame(dfX) dfY <- data.frame(dfY) if (!is.data.frame(dfX)) stop("data.frame expected") if (!is.data.frame(dfY)) stop("data.frame expected") if (nrow(dfY) != nrow(dfX)) stop("Row numbers are different") if (any(row.names(dfY) != row.names(dfX))) stop("row names are different") X <- scale(dfX, scale = FALSE) Y <- scale(dfY, scale = FALSE) if (scale) { X <- X/sqrt(sum(apply(X, 2, function(x) sum(x^2)))) Y <- Y/sqrt(sum(apply(Y, 2, function(x) sum(x^2)))) } X <-as.matrix(X) Y <- as.matrix(Y) PS <- t(X) %*% Y svd1 <- svd(PS) rank <- sum((svd1$d/svd1$d[1]) > tol) if (nf > rank) nf <- rank u <- svd1$u[, 1:nf] v <- svd1$v[, 1:nf] scorX <- X %*% u scorY <- Y %*% v rotX <- X %*% u %*% t(v) rotY <- Y %*% v %*% t(u) res <- list() X <- data.frame(X) row.names(X) <- row.names(dfX) names(X) <- names(dfX) Y <- data.frame(Y) row.names(Y) <- row.names(dfY) names(Y) <- names(dfY) res$d <- svd1$d res$rank <- rank res$nf <- nf u <- data.frame(u) row.names(u) <- names(dfX) names(u) <- paste("ax", 1:nf, sep = "") v <- data.frame(v) row.names(v) <- names(dfY) names(v) <- paste("ax", 1:nf, sep = "") scorX <- data.frame(scorX) row.names(scorX) <- row.names(dfX) names(scorX) <- paste("ax", 1:nf, sep = "") scorY <- data.frame(scorY) row.names(scorY) <- row.names(dfX) names(scorY) <- paste("ax", 1:nf, sep = "") if ((nf == ncol(dfX)) & (nf == ncol(dfY))) { rotX <- data.frame(rotX) row.names(rotX) <- row.names(dfX) names(rotX) <- names(dfY) rotY <- data.frame(rotY) row.names(rotY) <- row.names(dfX) names(rotY) <- names(dfX) res$rotX <- rotX res$rotY <- rotY } res$tabX <- X res$tabY <- Y res$loadX <- u res$loadY <- v res$scorX <- scorX res$scorY <- scorY res$call <- match.call() class(res) <- "procuste" return(res) } "plot.procuste" <- function (x, xax = 1, yax = 2, ...) { if (!inherits(x, "procuste")) stop("Use only with 'procuste' objects") if (x$nf == 1) { warnings("One axis only : not yet implemented") return(invisible()) } if (xax > x$nf) stop("Non convenient xax") if (yax > x$nf) stop("Non convenient yax") def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) layout(matrix(c(1, 2, 3, 4, 4, 5, 4, 4, 6), 3, 3), respect = TRUE) par(mar = c(0.1, 0.1, 0.1, 0.1)) s.arrow(x$loadX, xax, yax, sub = "X loadings", csub = 2, clabel = 1.25) s.arrow(x$loadY, xax, yax, sub = "Y loadings", csub = 2, clabel = 1.25) scatterutil.eigen(x$d^2, wsel = c(xax, yax)) s.match(x$scorX, x$scorY, xax, yax, clabel = 1.5, sub = "Row scores (X -> Y)", csub = 2) s.label(x$scorX, xax = xax, yax = yax, sub = "X row scores", csub = 2, clabel = 1.25) s.label(x$scorY, xax = xax, yax = yax, sub = "Y row scores", csub = 2, clabel = 1.25) } "print.procuste" <- function (x, ...) { cat("Procustes rotation\n") cat("call: ") print(x$call) cat(paste("class:", class(x))) cat(paste("\nrank:", x$rank)) cat(paste("\naxis number:", x$nf)) cat("\nSingular value decomposition: ") l0 <- length(x$d) cat(signif(x$d, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n") else cat("\n") cat("tabX data.frame ", nrow(x$tabX), " ", ncol(x$tabX), " scaled table X\n") cat("tabY data.frame ", nrow(x$tabY), " ", ncol(x$tabY), " scaled table Y\n") cat("scorX data.frame ", nrow(x$scorX), " ", ncol(x$scorX), " X row scores\n") cat("scorY data.frame ", nrow(x$scorY), " ", ncol(x$scorY), " Y row scores\n") cat("loadX data.frame ", nrow(x$loadX), " ", ncol(x$loadX), " X loadings\n") cat("loadY data.frame ", nrow(x$loadY), " ", ncol(x$loadY), " Y loadings\n") if (length(names(x)) > 12) { cat("other elements: ") cat(names(x)[11:(length(x))], "\n") } } "randtest.procuste" <- function(xtest, nrepet = 999, ...) { if(!inherits(xtest,"procuste")) stop("Object of class 'procuste' expected") lig <- nrow(xtest$tabX) c1 <- ncol(xtest$tabX) c2 <- ncol(xtest$tabY) isim <- testprocuste(nrepet, lig, c1, c2, as.matrix(xtest$tabX), as.matrix(xtest$tabY)) obs <- isim[1] return(as.randtest(isim[-1], obs, call = match.call(), ...)) } ade4/R/costatis.R0000644000176200001440000000765213050632301013247 0ustar liggesusers"costatis" <- function (KTX, KTY, scannf = TRUE) { #### #### COSTATIS analysis #### coinertia analysis of the compromises of two ktabs #### Jean Thioulouse, 06 Nov 2009 #### This function takes 2 ktabs. It does a partial triadic analysis on each ktab, #### and does a coinertia analysis on the compromises of the PTAs. #### normalise.w <- function(X, w) { # Correction d'un bug signale par Sandrine Pavoine le 21/10/2006 f2 <- function(v) sqrt(sum(v * v * w)) norm <- apply(X, 2, f2) X <- sweep(X, 2, norm, "/") return(X) } if (!inherits(KTX, "ktab")) stop("The first argument must be a 'ktab'") if (!inherits(KTY, "ktab")) stop("The second argument must be a 'ktab'") #### Parameters of first ktab lwX <- KTX$lw cwX <- KTX$cw ncolX <- length(cwX) bloX <- KTX$blo ntabX <- length(KTX$blo) #### Parameters of second ktab lwY <- KTY$lw nligY <- length(lwY) cwY <- KTY$cw ncolY <- length(cwY) bloY <- KTY$blo ntabY <- length(KTY$blo) #### Tests of coherence of the two ktabs if (ncolX != ncolY) stop("The two ktabs must have the same column numbers") if (any(cwX != cwY)) stop("The two ktabs must have the same column weights") if (ntabX != ntabY) stop("The two ktabs must have the same number of tables") if (!all(bloX == bloY)) stop("The two tables of one pair must have the same number of columns") #### pta on KTX if (scannf) cat("PTA of first KTab\n") ptaX <- pta(KTX, scannf = scannf) #### pta on KTY if (scannf) cat("PTA of second KTab\n") ptaY <- pta(KTY, scannf = scannf) #### coinertia analysis of compromises acpX=dudi.pca(t(ptaX$tab), center=FALSE, scannf=FALSE, nf=ptaX$nf) acpY=dudi.pca(t(ptaY$tab), center=FALSE, scannf=FALSE, nf=ptaY$nf) if (scannf) cat("Coinertia analysis of the two compromises\n") res <- coinertia(acpX, acpY, scannf = scannf) #### projection of the rows of the two original ktables U <- as.matrix(res$c1) * unlist(res$cw) supIX <- normalise.w(t(as.matrix(KTX[[1]])) %*% U, acpX$lw) for (i in 2:ntabX) { supIX <- rbind(supIX, normalise.w(as.matrix(t(KTX[[i]])) %*% U, acpX$lw)) } row.names(supIX) <- paste(KTX$TC[,1],KTX$TC[,2], sep="") res$supIX <- as.data.frame(supIX) names(res$supIX) <- paste("XNorS", (1:res$nf), sep = "") U <- as.matrix(res$l1) * unlist(res$lw) supIY <- normalise.w(t(as.matrix(KTY[[1]])) %*% U, acpY$lw) for (i in 2:ntabY) { supIY <- rbind(supIY, normalise.w(as.matrix(t(KTY[[i]])) %*% U, acpY$lw)) } row.names(supIY) <- paste(KTY$TC[,1],KTY$TC[,2], sep="") res$supIY <- as.data.frame(supIY) names(res$supIY) <- paste("YNorS", (1:res$nf), sep = "") # class(res) <- c("costatis", class(res)) return(res) } "costatis.randtest" <- function (KTX, KTY, nrepet = 999, ...) { if (!inherits(KTX, "ktab")) stop("The first argument must be a 'ktab'") if (!inherits(KTY, "ktab")) stop("The second argument must be a 'ktab'") #### Parameters of first ktab lwX <- KTX$lw cwX <- KTX$cw ncolX <- length(cwX) bloX <- KTX$blo ntabX <- length(KTX$blo) #### Parameters of second ktab lwY <- KTY$lw nligY <- length(lwY) cwY <- KTY$cw ncolY <- length(cwY) bloY <- KTY$blo ntabY <- length(KTY$blo) #### Tests of coherence of the two ktabs if (ncolX != ncolY) stop("The two ktabs must have the same column numbers") if (any(cwX != cwY)) stop("The two ktabs must have the same column weights") if (ntabX != ntabY) stop("The two ktabs must have the same number of tables") if (!all(bloX == bloY)) stop("The two tables of one pair must have the same number of columns") #### pta on KTX ptaX <- pta(KTX, scannf = FALSE) #### pta on KTY ptaY <- pta(KTY, scannf = FALSE) #### coinertia analysis of compromises acpX=dudi.pca(t(ptaX$tab), center=FALSE, scannf=FALSE, nf=ptaX$nf) acpY=dudi.pca(t(ptaY$tab), center=FALSE, scannf=FALSE, nf=ptaY$nf) res <- coinertia(acpX, acpY, scannf = FALSE) rtest1 <- randtest(res, nrepet = nrepet, ...) return(rtest1) } ade4/R/pta.R0000644000176200001440000002465512576021756012226 0ustar liggesusers"pta" <- function (X, scannf = TRUE, nf = 2) { # 21/08/02 Correction d'un bug suite à message de G. BALENT balent@toulouse.inra.fr if (!inherits(X, "ktab")) stop("object 'ktab' expected") auxinames <- ktab.util.names(X) sepa <- sepan(X, nf = 4) blocks <- X$blo nblo <- length(blocks) tnames <- tab.names(X) lw <- X$lw lwsqrt <- sqrt(X$lw) nl <- length(lw) r.n <- row.names(X[[1]]) for (i in 1:nblo) { r.new <- row.names(X[[i]]) if (any(r.new != r.n)) stop("non equal row.names among array") } if (length(unique(blocks)) != 1) stop("non equal col numbers among array") unique.col.names <- names(X[[1]]) for (i in 1:nblo) { c.new <- names(X[[i]]) if (any(c.new != unique.col.names)) stop("non equal col.names among array") } indica <- as.factor(rep(1:nblo, blocks)) w <- split(X$cw, indica) cw <- w[[1]] for (i in 1:nblo) { col.w.new <- w[[i]] if (any(cw != col.w.new)) stop("non equal column weights among array") } cwsqrt <- sqrt(cw) nc <- length(cw) atp <- list() for (i in 1:nblo) { w <- as.matrix(X[[i]]) * lwsqrt w <- t(t(w) * cwsqrt) atp[[i]] <- w } atp <- matrix(unlist(atp), nl * nc, nblo) RV <- t(atp) %*% atp ak <- sqrt(diag(RV)) RV <- sweep(RV, 1, ak, "/") RV <- sweep(RV, 2, ak, "/") dimnames(RV) <- list(tnames, tnames) atp <- list() inter <- eigen(as.matrix(RV)) if (any(inter$vectors[, 1] < 0)) inter$vectors[, 1] <- -inter$vectors[, 1] is <- inter$vectors[, (1:min(c(nblo, 4)))] tabw <- as.vector(is[, 1]) is <- t(t(is) * sqrt(inter$values[1:ncol(is)])) is <- as.data.frame(is) row.names(is) <- tnames names(is) <- paste("IS", 1:ncol(is), sep = "") atp$RV <- RV atp$RV.eig <- inter$values atp$RV.coo <- is atp$tabw <- tabw tab <- X[[1]] * tabw[1] for (i in 2:nblo) { tab <- tab + X[[i]] * tabw[i] } tab <- as.data.frame(tab, row.names = row.names(X)) names(tab) <- unique.col.names comp <- as.dudi(tab, col.w = cw, row.w = lw, nf = nf, scannf = scannf, call = match.call(), type = "pta") atp$rank <- comp$rank nf <- atp$nf <- comp$nf atp$tab <- comp$tab atp$lw <- comp$lw atp$cw <- comp$cw atp$eig <- comp$eig atp$li <- comp$li atp$co <- comp$co atp$l1 <- comp$l1 atp$c1 <- comp$c1 w1 <- matrix(0, nblo * 4, nf) w2 <- matrix(0, nblo * 4, nf) i1 <- 0 i2 <- 0 for (k in 1:nblo) { i1 <- i2 + 1 i2 <- i2 + 4 tab1 <- as.matrix(sepa$L1[X$TL[, 1] == levels(X$TL[,1])[k], ]) tab1 <- t(tab1 * lw) %*% as.matrix(comp$l1) tab2 <- as.matrix(sepa$C1[X$TC[, 1] == levels(X$TC[, 1])[k], ]) tab2 <- (t(tab2) * cw) %*% as.matrix(comp$c1) for (i in 1:min(nf, 4)) { if (tab2[i, i] < 0) { for (j in 1:nf) tab2[i, j] <- -tab2[i, j] } if (tab1[i, i] < 0) { for (j in 1:nf) tab1[i, j] <- -tab1[i, j] } } w1[i1:i2, ] <- tab1 w2[i1:i2, ] <- tab2 } w1 <- data.frame(w1, row.names = auxinames$tab) w2 <- data.frame(w2, row.names = auxinames$tab) names(w2) <- names(w1) <- paste("C", 1:nf, sep = "") atp$Tcomp <- w1 atp$Tax <- w2 tab <- as.matrix(X[[1]]) w <- as.matrix(comp$c1) cooli <- t(t(tab) * cw) %*% w for (k in 2:nblo) { tab <- as.matrix(X[[k]]) cooliauxi <- t(t(tab) * cw) %*% w cooli <- rbind(cooli, cooliauxi) } cooli <- data.frame(cooli, row.names = auxinames$row) atp$Tli <- cooli tab <- as.matrix(X[[1]]) w <- as.matrix(comp$l1) * lw cooco <- t(tab) %*% w for (k in 2:nblo) { tab <- as.matrix(X[[k]]) coocoauxi <- t(tab) %*% w cooco <- rbind(cooco, coocoauxi) } cooco <- data.frame(cooco, row.names = auxinames$col) atp$Tco <- cooco normcompro <- sum(atp$eig) indica <- as.factor(rep(1:nblo, sepa$rank)) w <- split(sepa$Eig, indica) normtab <- unlist(lapply(w, sum)) covv <- rep(0, nblo) w1 <- atp$tab * lwsqrt w1 <- t(t(w1) * cwsqrt) for (k in 1:nblo) { wk <- X[[k]] * lwsqrt wk <- t(t(wk) * cwsqrt) covv[k] <- sum(w1 * wk) } atp$cos2 <- covv/sqrt(normcompro)/sqrt(normtab) atp$TL <- X$TL atp$TC <- X$TC atp$T4 <- X$T4 atp$blo <- X$blo atp$tab.names <- tnames atp$call <- match.call() class(atp) <- c("pta", "dudi") if (!inherits (X,"kcoinertia")) return(atp) # Modifs pour prendre en compte STATICO # on a affaire a une pta de type STATICO # nblo nombre de tableau blocks <- X$supblo nblo <- length(blocks) w <- NULL for (i in 1:nblo) w <- c(w, 1:blocks[i]) w <- cbind.data.frame(factor(rep(1:nblo, blocks)), factor(w)) names(w) <- c("T", "I") atp$supTI <- w supTInames <- as.data.frame(matrix(unlist(strsplit(auxinames$Trow, "[.]")), ncol=2, byrow=T)) levels(atp$supTI$T) <- atp$tab.names levels(atp$supTI$I) <- supTInames[,2] # atp$supTI <- auxinames$Trow # atp$supTI <- as.data.frame(matrix(unlist(strsplit(auxinames$Trow, "[.]")), ncol=2, byrow=T)) # names(atp$supTI) <- c("T", "I") lw <- X$suplw lw <- split(lw, factor(rep(1:length(blocks),blocks))) lw <- lapply(lw, function(x) x/sum(x)) lw <- unlist(lw) # les lignes d'origine en supplémentaires X w <- X$supX%*%as.matrix(atp$l1*atp$lw) # Correction des row names - JT 7 - Jan 2014 w <- data.frame(w, row.names = auxinames$Trow) w <- scalewt(w, lw, center = FALSE, scale = TRUE) w <- as.data.frame(w) names(w) <- gsub("RS","sco",names(atp$l1)) atp$supIX <- w # les lignes d'origine en supplémentaires Y w <- X$supY%*%as.matrix(atp$c1*atp$cw) # Correction des row names - JT - 7 Jan 2014 w <- data.frame(w, row.names = auxinames$Trow) w <- scalewt(w, lw, center = FALSE, scale = TRUE) w <- as.data.frame(w) names(w) <- gsub("RS","sco",names(atp$l1)) atp$supIY <- w return(atp) } "plot.pta" <- function (x, xax = 1, yax = 2, option = 1:4, ...) { if (!inherits(x, "pta")) stop("Object of type 'pta' expected") nf <- x$nf if (xax > nf) stop("Non convenient xax") if (yax > nf) stop("Non convenient yax") def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) mfrow <- n2mfrow(length(option)) par(mfrow = mfrow) for (j in option) { if (j == 1) { coolig <- x$RV.coo[, c(1, 2)] s.corcircle(coolig, label = x$tab.names, cgrid = 0, sub = "Interstructure", csub = 1.5, possub = "topleft", fullcircle = TRUE) l0 <- length(x$RV.eig) add.scatter.eig(x$RV.eig, l0, 1, 2, posi = "bottomleft", ratio = 1/4) } if (j == 2) { coolig <- x$li[, c(xax, yax)] s.label(coolig, sub = "Compromise", csub = 1.5, possub = "topleft", ) add.scatter.eig(x$eig, x$nf, xax, yax, posi = "bottomleft", ratio = 1/4) } if (j == 3) { cooco <- x$co[, c(xax, yax)] s.arrow(cooco, sub = "Compromise", csub = 1.5, possub = "topleft") } if (j == 4) { plot(x$tabw, x$cos2, xlab = "Tables weights", ylab = "Cos 2") scatterutil.grid(0) title(main = "Typological value") par(xpd = TRUE) scatterutil.eti(x$tabw, x$cos2, label = x$tab.names, clabel = 1) } } } "print.pta" <- function (x, ...) { cat("Partial Triadic Analysis\n") cat("class:") cat(class(x), "\n") cat("table number:", length(x$blo), "\n") cat("row number:", length(x$lw), " column number:", length(x$cw), "\n") cat("\n **** Interstructure ****\n") cat("\neigen values: ") l0 <- length(x$RV.eig) cat(signif(x$RV.eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n") else cat("\n") cat(" $RV matrix ", nrow(x$RV), " ", ncol(x$RV), " RV coefficients\n") cat(" $RV.eig vector ", length(x$RV.eig), " eigenvalues\n") cat(" $RV.coo data.frame ", nrow(x$RV.coo), " ", ncol(x$RV.coo), " array scores\n") cat(" $tab.names vector ", length(x$tab.names), " array names\n") cat("\n **** Compromise ****\n") cat("\neigen values: ") l0 <- length(x$eig) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n") else cat("\n") cat("\n $nf:", x$nf, "axis-components saved") cat("\n $rank: ") cat(x$rank, "\n\n") sumry <- array("", c(5, 4), list(rep("", 5), c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$tabw", length(x$tabw), mode(x$tabw), "array weights") sumry[2, ] <- c("$cw", length(x$cw), mode(x$cw), "column weights") sumry[3, ] <- c("$lw", length(x$lw), mode(x$lw), "row weights") sumry[4, ] <- c("$eig", length(x$eig), mode(x$eig), "eigen values") sumry[5, ] <- c("$cos2", length(x$cos2), mode(x$cos2), "cosine^2 between compromise and arrays") print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(5, 4), list(rep("", 5), c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$tab", nrow(x$tab), ncol(x$tab), "modified array") sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), "row coordinates") sumry[3, ] <- c("$l1", nrow(x$l1), ncol(x$l1), "row normed scores") sumry[4, ] <- c("$co", nrow(x$co), ncol(x$co), "column coordinates") sumry[5, ] <- c("$c1", nrow(x$c1), ncol(x$c1), "column normed scores") print(sumry, quote = FALSE) cat("\n **** Intrastructure ****\n\n") sumry <- array("", c(7, 4), list(rep("", 7), c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$Tli", nrow(x$Tli), ncol(x$Tli), "row coordinates (each table)") sumry[2, ] <- c("$Tco", nrow(x$Tco), ncol(x$Tco), "col coordinates (each table)") sumry[3, ] <- c("$Tcomp", nrow(x$Tcomp), ncol(x$Tcomp), "principal components (each table)") sumry[4, ] <- c("$Tax", nrow(x$Tax), ncol(x$Tax), "principal axis (each table)") sumry[5, ] <- c("$TL", nrow(x$TL), ncol(x$TL), "factors for Tli") sumry[6, ] <- c("$TC", nrow(x$TC), ncol(x$TC), "factors for Tco") sumry[7, ] <- c("$T4", nrow(x$T4), ncol(x$T4), "factors for Tax Tcomp") print(sumry, quote = FALSE) cat("\n") } ade4/R/randtest.pcaivortho.R0000644000176200001440000000204113131142667015415 0ustar liggesusers"randtest.pcaivortho" <- function (xtest, nrepet = 99, ...) { if (!inherits(xtest, "dudi")) stop("Object of class dudi expected") if (!inherits(xtest, "pcaivortho")) stop("Type 'pcaivortho' expected") appel <- as.list(xtest$call) dudi1 <- eval.parent(appel$dudi) df <- data.frame(eval.parent(appel$df)) y <- as.matrix(dudi1$tab) inertot <- sum(dudi1$eig) sqlw <- sqrt(dudi1$lw) sqcw <- sqrt(dudi1$cw) fmla <- as.formula(paste("y ~", paste(names(df), collapse = "+"))) mf <- model.frame(fmla,data=cbind.data.frame(y,df)) mt <- attr(mf,"terms") x <- model.matrix(mt,mf) wt <- outer(sqlw, sqcw) ## Fast function for computing sum of squares of the fitted table obs <- sum((lm.wfit(y = y,x = x, w = dudi1$lw)$residuals * wt)^2) / inertot isim <- c() for(i in 1:nrepet) isim[i] <- sum((lm.wfit(y = y,x = x[sample(nrow(x)),], w = dudi1$lw)$residuals * wt)^2) / inertot return(as.randtest(sim = isim, obs = obs,call = match.call(), ...)) } ade4/R/lingoes.R0000644000176200001440000000152012576021756013064 0ustar liggesusers"lingoes" <- function (distmat, print = FALSE, tol = 1e-07, cor.zero = TRUE) { if (is.euclid(distmat)) { warning("Euclidean distance found : no correction need") return(distmat) } distmat <- as.matrix(distmat) delta <- -0.5 * bicenter.wt(distmat * distmat) lambda <- eigen(delta, symmetric = TRUE, only.values = TRUE)$values lder <- lambda[ncol(distmat)] if(cor.zero){ distmat <- distmat * distmat distmat[distmat > tol] <- sqrt(distmat[distmat > tol] + 2 * abs(lder)) } else { distmat <- sqrt(distmat * distmat + 2 * abs(lder)) } if (print) cat("Lingoes constant =", round(abs(lder), digits = 6), "\n") distmat <- as.dist(distmat) attr(distmat, "call") <- match.call() attr(distmat, "method") <- "Lingoes" return(distmat) } ade4/R/fourthcorner.R0000644000176200001440000002405013050632301014125 0ustar liggesusers"fourthcorner" <- function(tabR, tabL, tabQ, modeltype = 6,nrepet = 999, tr01 = FALSE, p.adjust.method.G = p.adjust.methods, p.adjust.method.D = p.adjust.methods, p.adjust.D = c("global","levels"), ...) { ## tabR ,tabL, tabQ are 3 data frames containing the data ## permut.model is the permutational model and can take 6 values (1:6) 6 corresponds to the combination of 2 and 4 ## ------------------------------- ## Test of the different arguments ## ------------------------------- if (!is.data.frame(tabR)) stop("data.frame expected") if (!is.data.frame(tabL)) stop("data.frame expected") if (!is.data.frame(tabQ)) stop("data.frame expected") if (any(is.na(tabR))) stop("na entries in table") if (any(is.na(tabL))) stop("na entries in table") if (any(tabL<0)) stop("negative values in table L") if (any(is.na(tabQ))) stop("na entries in table") p.adjust.D <- match.arg(p.adjust.D) p.adjust.method.D <- match.arg(p.adjust.method.D) p.adjust.method.G <- match.arg(p.adjust.method.G) if (sum(modeltype==(1:6))!=1) stop("modeltype should be 1, 2, 3, 4, 5 or 6") if(modeltype == 6){ test1 <- fourthcorner(tabR, tabL, tabQ, modeltype = 2,nrepet = nrepet, tr01 = tr01, p.adjust.method.G = p.adjust.method.G, p.adjust.method.D = p.adjust.method.D, p.adjust.D = p.adjust.D, ...) test2 <- fourthcorner(tabR, tabL, tabQ, modeltype = 4,nrepet = nrepet, tr01 = tr01, p.adjust.method.G = p.adjust.method.G, p.adjust.method.D = p.adjust.method.D, p.adjust.D = p.adjust.D, ...) res <- combine.4thcorner(test1,test2) res$call <- res$tabD2$call <- res$tabD$call <- res$tabG$call <- match.call() return(res) } nrowL <- nrow(tabL) ncolL <- ncol(tabL) nrowR <- nrow(tabR) nrowQ <- nrow(tabQ) nvarQ <- ncol(tabQ) nvarR <- ncol(tabR) if (nrowR != nrowL) stop("Non equal row numbers") if (nrowQ != ncolL) stop("Non equal row numbers") ## transform the data into presence-absence if trO1 = TRUE if (tr01) { cat("Values in table L are 0-1 transformed\n") tabL <- ifelse(tabL==0,0,1) } ## ------------------------------------------ ## Create the data matrices for R and Q ## Transform factors into disjunctive tables ## tabR becomes matR and tabQ becomes matQ ## ------------------------------------------ ## For tabR matR <- matrix(0, nrowR, 1) provinames <- "tmp" assignR <- NULL k <- 0 indexR <- rep(0, nvarR) for (j in 1:nvarR) { ## Get the type of data ## The type is store in the index vector (1 for numeric / 2 for factor) if (is.numeric(tabR[, j])) { indexR[j] <- 1 matR <- cbind(matR, tabR[, j]) provinames <- c(provinames, names(tabR)[j]) k <- k + 1 assignR <- c(assignR, k) } else if (is.factor(tabR[, j])) { indexR[j] <- 2 if (is.ordered(tabR[, j])) warning("ordered variables will be considered as factor") w <- fac2disj(tabR[, j], drop = TRUE) cha <- paste(substr(names(tabR)[j], 1, 5), ".", names(w), sep = "") matR <- cbind(matR, w) provinames <- c(provinames, cha) k <- k + 1 assignR <- c(assignR, rep(k, length(cha))) } else stop("Not yet available") } matR <- data.frame(matR[, -1]) names(matR) <- provinames[-1] ncolR <- ncol(matR) ## ---------- ## For tabQ matQ <- matrix(0, nrowQ, 1) provinames <- "tmp" assignQ <- NULL k <- 0 indexQ <- rep(0, nvarQ) for (j in 1:nvarQ) { ## Get the type of data ## The type is stored in the index vector (1 for numeric / 2 for factor) if (is.numeric(tabQ[, j])) { indexQ[j] <- 1 matQ <- cbind(matQ, tabQ[, j]) provinames <- c(provinames, names(tabQ)[j]) k <- k + 1 assignQ <- c(assignQ, k) } else if (is.factor(tabQ[, j])) { indexQ[j] <- 2 if (is.ordered(tabQ[, j])) warning("ordered variables will be considered as factor") w <- fac2disj(tabQ[, j], drop = TRUE) cha <- paste(substr(names(tabQ)[j], 1, 5), ".", names(w), sep = "") matQ <- cbind(matQ, w) provinames <- c(provinames, cha) k <- k + 1 assignQ <- c(assignQ, rep(k, length(cha))) } } matQ <- data.frame(matQ[, -1]) names(matQ) <- provinames[-1] ncolQ <- ncol(matQ) ## ---------- ##----- create objects to store results -------# tabD <- matrix(0,nrepet + 1, ncolR * ncolQ) tabD2 <- matrix(0,nrepet + 1, ncolR * ncolQ) tabG <- matrix(0,nrepet + 1, nvarR * nvarQ) res <- list() ##------------------ ## Call the C code ##------------------ res <- .C("quatriemecoin", as.double(t(matR)), as.double(t(tabL)), as.double(t(matQ)), as.integer(ncolR), as.integer(nvarR), as.integer(nrowL), as.integer(ncolL), as.integer(ncolQ), as.integer(nvarQ), as.integer(nrepet), modeltype = as.integer(modeltype), tabD = as.double(tabD), tabD2 = as.double(tabD2), tabG = as.double(tabG), as.integer(indexR), as.integer(indexQ), as.integer(assignR), as.integer(assignQ), PACKAGE="ade4")[c("tabD","tabD2","tabG")] ##-------------------------------------------------------------------# ## Outputs # ##-------------------------------------------------------------------# res$varnames.R <- names(tabR) res$colnames.R <- names(matR) res$varnames.Q <- names(tabQ) res$colnames.Q <- names(matQ) res$indexQ <- indexQ res$assignQ <- assignQ res$assignR <- assignR res$indexR <- indexR ## set invalid permutation to NA (in the case of levels of a factor with no observation) res$tabD <- ifelse(res$tabD < (-998), NA, res$tabD) res$tabG <- ifelse(res$tabG < (-998), NA, res$tabG) ## Reshape the tables res$tabD <- matrix(res$tabD, nrepet + 1, ncolR * ncolQ, byrow=TRUE) res$tabD2 <- matrix(res$tabD2, nrepet + 1, ncolR * ncolQ, byrow=TRUE) res$tabG <- matrix(res$tabG, nrepet + 1, nvarR * nvarQ, byrow=TRUE) ## Create vectors to store type of statistics and alternative hypotheses names.stat.D <- vector(mode="character") names.stat.D2 <- vector(mode="character") names.stat.G <- vector(mode="character") alter.G <- vector(mode="character") alter.D <- vector(mode="character") alter.D2 <- vector(mode="character") for (i in 1:nvarQ){ for (j in 1:nvarR){ ## Type of statistics for G and alternative hypotheses if ((res$indexR[j]==1)&(res$indexQ[i]==1)){ names.stat.G <- c(names.stat.G, "r") alter.G <- c(alter.G, "two-sided") } if ((res$indexR[j]==1)&(res$indexQ[i]==2)){ names.stat.G <- c(names.stat.G, "F") alter.G <- c(alter.G, "greater") } if ((res$indexR[j]==2)&(res$indexQ[i]==1)){ names.stat.G <- c(names.stat.G, "F") alter.G <- c(alter.G, "greater") } if ((res$indexR[j]==2)&(res$indexQ[i]==2)){ names.stat.G <- c(names.stat.G, "Chi2") alter.G <- c(alter.G, "greater") } } } for (i in 1:ncolQ){ for (j in 1:ncolR){ ## Type of statistics for D and alternative hypotheses idx.vars <- ncolR * (i-1) + j if ((res$indexR[res$assignR[j]]==1)&(res$indexQ[res$assignQ[i]]==1)){ names.stat.D <- c(names.stat.D, "r") names.stat.D2 <- c(names.stat.D2, "r") alter.D <- c(alter.D, "two-sided") alter.D2 <- c(alter.D2, "two-sided") } if ((res$indexR[res$assignR[j]]==1)&(res$indexQ[res$assignQ[i]]==2)){ names.stat.D <- c(names.stat.D, "Homog.") names.stat.D2 <- c(names.stat.D2, "r") alter.D <- c(alter.D, "less") alter.D2 <- c(alter.D2, "two-sided") } if ((res$indexR[res$assignR[j]]==2)&(res$indexQ[res$assignQ[i]]==1)){ names.stat.D <- c(names.stat.D, "Homog.") names.stat.D2 <- c(names.stat.D2, "r") alter.D <- c(alter.D, "less") alter.D2 <- c(alter.D2, "two-sided") } if ((res$indexR[res$assignR[j]]==2)&(res$indexQ[res$assignQ[i]]==2)){ names.stat.D <- c(names.stat.D, "N") names.stat.D2 <- c(names.stat.D2, "N") alter.D <- c(alter.D, "two-sided") alter.D2 <- c(alter.D2, "two-sided") } } } provinames <- apply(expand.grid(res$colnames.R, res$colnames.Q), 1, paste, collapse=" / ") res$tabD <- as.krandtest(obs = res$tabD[1, ], sim = res$tabD[-1, , drop = FALSE], names = provinames, alter = alter.D, call = match.call(), p.adjust.method = p.adjust.method.D, ...) res$tabD2 <- as.krandtest(obs = res$tabD2[1, ], sim = res$tabD2[-1, , drop = FALSE], names = provinames, alter = alter.D2, call = match.call(), p.adjust.method = p.adjust.method.D, ...) if(p.adjust.D == "levels"){ ## adjustment only between levels of a factor (corresponds to the original paper of Legendre et al. 1997) for (i in 1:nvarQ){ for (j in 1:nvarR){ idx.varR <- which(res$assignR == j) idx.varQ <- which(res$assignQ == i) idx.vars <- nvarR * (idx.varQ - 1) + idx.varR res$tabD$adj.pvalue[idx.vars] <- p.adjust(res$tabD$pvalue[idx.vars], method = p.adjust.method.D) res$tabD2$adj.pvalue[idx.vars] <- p.adjust(res$tabD2$pvalue[idx.vars], method = p.adjust.method.D) } } res$tabD$adj.method <- res$tabD2$adj.method <- paste(p.adjust.method.D, "by levels") } provinames <- apply(expand.grid(res$varnames.R, res$varnames.Q), 1, paste, collapse=" / ") res$tabG <- as.krandtest(obs = res$tabG[1, ], sim = res$tabG[-1, ,drop = FALSE], names = provinames, alter = alter.G, call = match.call(), p.adjust.method = p.adjust.method.G, ...) res$tabD$statnames <- names.stat.D res$tabD2$statnames <- names.stat.D2 res$tabG$statnames <- names.stat.G res$call <- match.call() res$model <- modeltype res$npermut <- nrepet class(res) <- "4thcorner" return(res) } ade4/R/krandxval.R0000644000176200001440000000324012576021756013417 0ustar liggesusersas.krandxval <- function(RMSEc, RMSEv, quantiles = c(0.25, 0.75), names = colnames(RMSEc), call = match.call()){ ## RMSEc: n x p matrix with residual mean square error of calibration ## RMSEv: n x p matrix with residual mean square error of validation ## n: number of repetitions, p: number of statistics if(nrow(RMSEc) != nrow(RMSEv)) stop("Both RMSE should be computed on the same number of repetitions") if(ncol(RMSEc) != ncol(RMSEv)) stop("Both RMSE should be computed on the same number of statistics") res <- list(RMSEc = RMSEc, RMSEv = RMSEv, rep = nrow(RMSEc)) ## compute stats for RMSEc res$repRMSEc <- colSums(!is.na(res$RMSEc)) res$statsRMSEc <- cbind.data.frame(Mean = colMeans(res$RMSEc, na.rm = TRUE), t(apply(res$RMSEc,2, quantile, probs = quantiles, na.rm = TRUE))) rownames(res$statsRMSEc) <- names ## compute stats for RMSEv res$repRMSEv <- colSums(!is.na(res$RMSEc)) res$statsRMSEv <- cbind.data.frame(Mean = colMeans(res$RMSEv, na.rm = TRUE), t(apply(res$RMSEv,2, quantile, probs = quantiles, na.rm = TRUE))) rownames(res$statsRMSEv) <- names res$call <- call class(res) <- "krandxval" return(res) } print.krandxval <- function(x, ...){ if (!inherits(x, "krandxval")) stop("Non convenient data") cat("Two-fold cross-validation\n") cat("Call: ") print(x$call) cat("\nResults for", ncol(x$RMSEc), "statistics\n\n") cat("Root mean square error of calibration:\n") print(cbind.data.frame(N.rep = x$repRMSEc, x$statsRMSEc)) cat("\nRoot mean square error of validation:\n") print(cbind.data.frame(N.rep = x$repRMSEv, x$statsRMSEv)) } ade4/R/rlq.R0000644000176200001440000001670713317647343012237 0ustar liggesusers"plot.rlq" <- function (x, xax = 1, yax = 2, ...) { if (!inherits(x, "rlq")) stop("Use only with 'rlq' objects") if (x$nf == 1) { warnings("One axis only : not yet implemented") return(invisible()) } if (xax > x$nf) stop("Non convenient xax") if (yax > x$nf) stop("Non convenient yax") def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) layout(matrix(c(1, 1, 3, 1, 1, 4, 2, 2,5,2,2,6,8,8,7), 3, 5), respect = TRUE) par(mar = c(0.1, 0.1, 0.1, 0.1)) s.label(x$lR[, c(xax, yax)], sub = "R row scores",csub = 2,clabel = 1.25) s.label(x$lQ[, c(xax, yax)], sub = "Q row scores",csub = 2,clabel = 1.25) s.corcircle(x$aR, xax, yax, sub = "R axes", csub = 2, clabel = 1.25) s.arrow(x$l1, xax = xax, yax = yax, sub = "R Canonical weights", csub = 2, clabel = 1.25) s.arrow(x$c1, xax = xax, yax = yax, sub = "Q Canonical weights", csub = 2, clabel = 1.25) s.corcircle(x$aQ, xax, yax, sub = "Q axes", csub = 2, clabel = 1.25) scatterutil.eigen(x$eig, wsel = c(xax, yax)) } "print.rlq" <- function (x, ...) { if (!inherits(x, "rlq")) stop("to be used with 'rlq' object") cat("RLQ analysis\n") cat("call: ") print(x$call) cat("class: ") cat(class(x), "\n") cat("\n$rank (rank) :", x$rank) cat("\n$nf (axis saved) :", x$nf) ## cat("\n$RV (RV coeff) :", x$RV) cat("\n\neigen values: ") l0 <- length(x$eig) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n\n") else cat("\n\n") sumry <- array("", c(3, 4), list(1:3, c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$eig", length(x$eig), mode(x$eig), "Eigenvalues") sumry[2, ] <- c("$lw", length(x$lw), mode(x$lw), paste("Row weigths (for", x$call[[2]], "cols)")) sumry[3, ] <- c("$cw", length(x$cw), mode(x$cw), paste("Col weigths (for", x$call[[4]], "cols)")) print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(11, 4), list(1:11, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$tab", nrow(x$tab), ncol(x$tab), paste("Crossed Table (CT): cols(", x$call[[2]], ") x cols(", x$call[[4]], ")", sep="")) sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), paste("CT row scores (cols of ", x$call[[2]], ")", sep="")) sumry[3, ] <- c("$l1", nrow(x$l1), ncol(x$l1), paste("Principal components (loadings for ", x$call[[2]], " cols)", sep="")) sumry[4, ] <- c("$co", nrow(x$co), ncol(x$co), paste("CT col scores (cols of ", x$call[[4]], ")", sep="")) sumry[5, ] <- c("$c1", nrow(x$c1), ncol(x$c1), paste("Principal axes (loadings for ", x$call[[4]], " cols)", sep="")) sumry[6, ] <- c("$lR", nrow(x$lR), ncol(x$lR), paste("Row scores (rows of ", x$call[[2]], ")", sep="")) sumry[7, ] <- c("$mR", nrow(x$mR), ncol(x$mR), paste("Normed row scores (rows of ", x$call[[2]], ")", sep="")) sumry[8, ] <- c("$lQ", nrow(x$lQ), ncol(x$lQ), paste("Row scores (rows of ", x$call[[4]], ")", sep="")) sumry[9, ] <- c("$mQ", nrow(x$mQ), ncol(x$mQ), paste("Normed row scores (rows of ", x$call[[4]], ")", sep="")) sumry[10, ] <- c("$aR", nrow(x$aR), ncol(x$aR), paste("Corr ", x$call[[2]], " axes / rlq axes", sep="")) sumry[11, ] <- c("$aQ", nrow(x$aQ), ncol(x$aQ), paste("Corr ", x$call[[3]], " axes / coinertia axes", sep="")) print(sumry, quote = FALSE) cat("\n") } "rlq" <- function( dudiR, dudiL, dudiQ , scannf = TRUE, nf = 2) { normalise.w <- function(X, w) { f2 <- function(v) sqrt(sum(v * v * w)/sum(w)) norm <- apply(X, 2, f2) X <- sweep(X, 2, norm, "/") return(X) } if (!inherits(dudiR, "dudi")) stop("Object of class dudi expected") lig1 <- nrow(dudiR$tab) if (!inherits(dudiL, "dudi")) stop("Object of class dudi expected") if (!inherits(dudiL, "coa")) stop("dudi.coa expected for table L") lig2 <- nrow(dudiL$tab) col2 <- ncol(dudiL$tab) if (!inherits(dudiQ, "dudi")) stop("Object of class dudi expected") lig3 <- nrow(dudiQ$tab) if (lig1 != lig2) stop("Non equal row numbers") if (any((dudiR$lw - dudiL$lw)^2 > 1e-07)) stop("Non equal row weights") if (col2 != lig3) stop("Non equal row numbers") if (any((dudiL$cw - dudiQ$lw)^2 > 1e-07)) stop("Non equal row weights") tabcoiner <- t(as.matrix(dudiR$tab)) %*% diag(dudiL$lw) %*% (as.matrix(dudiL$tab)) %*% diag(dudiL$cw) %*% (as.matrix(dudiQ$tab)) tabcoiner <- data.frame(tabcoiner) names(tabcoiner) <- names(dudiQ$tab) row.names(tabcoiner) <- names(dudiR$tab) if (nf > dudiR$nf) nf <- dudiR$nf if (nf > dudiQ$nf) nf <- dudiQ$nf coi <- as.dudi(tabcoiner, dudiQ$cw, dudiR$cw, scannf = scannf, nf = nf, call = match.call(), type = "rlq") U <- as.matrix(coi$c1) * unlist(coi$cw) U <- data.frame(as.matrix(dudiQ$tab) %*% U) row.names(U) <- row.names(dudiQ$tab) names(U) <- paste("AxcQ", (1:coi$nf), sep = "") coi$lQ <- U U <- normalise.w(U, dudiQ$lw) row.names(U) <- row.names(dudiQ$tab) names(U) <- paste("NorS", (1:coi$nf), sep = "") coi$mQ <- U U <- as.matrix(coi$l1) * unlist(coi$lw) U <- data.frame(as.matrix(dudiR$tab) %*% U) row.names(U) <- row.names(dudiR$tab) names(U) <- paste("AxcR", (1:coi$nf), sep = "") coi$lR <- U U <- normalise.w(U, dudiR$lw) row.names(U) <- row.names(dudiR$tab) names(U) <- paste("NorS", (1:coi$nf), sep = "") coi$mR <- U U <- as.matrix(coi$c1) * unlist(coi$cw) U <- data.frame(t(as.matrix(dudiQ$c1)) %*% U) row.names(U) <- paste("Ax", (1:dudiQ$nf), sep = "") names(U) <- paste("AxcQ", (1:coi$nf), sep = "") coi$aQ <- U U <- as.matrix(coi$l1) * unlist(coi$lw) U <- data.frame(t(as.matrix(dudiR$c1)) %*% U) row.names(U) <- paste("Ax", (1:dudiR$nf), sep = "") names(U) <- paste("AxcR", (1:coi$nf), sep = "") coi$aR <- U ## remove RV which is probably wrong or at least not defined ## RV <- sum(coi$eig)/sqrt(sum(dudiQ$eig^2))/sqrt(sum(dudiR$eig^2)) ## coi$RV <- RV return(coi) } "summary.rlq" <- function (object, ...) { if (!inherits(object, "rlq")) stop("to be used with 'rlq' object") thetitle <- "RLQ analysis" cat(thetitle) cat("\n\n") NextMethod() appel <- as.list(object$call) dudiL <- eval.parent(appel$dudiL) dudiR <- eval.parent(appel$dudiR) dudiQ <- eval.parent(appel$dudiQ) norm.w <- function(X, w) { f2 <- function(v) sqrt(sum(v * v * w)/sum(w)) norm <- apply(X, 2, f2) return(norm) } util <- function(n) { return(sapply(1:n, function(x) paste(1:x, collapse = ""))) } eig <- object$eig[1:object$nf] covar <- sqrt(eig) sdR <- norm.w(object$lR, dudiR$lw) sdQ <- norm.w(object$lQ, dudiQ$lw) corr <- covar/sdR/sdQ U <- cbind.data.frame(eig, covar, sdR, sdQ, corr) row.names(U) <- as.character(1:object$nf) res <- list(EigDec = U) cat("\nEigenvalues decomposition:\n") print(U) cat(paste("\nInertia & coinertia R (", deparse(appel$dudiR),"):\n", sep="")) inertia <- cumsum(sdR^2) max <- cumsum(dudiR$eig[1:object$nf]) ratio <- inertia/max U <- cbind.data.frame(inertia, max, ratio) row.names(U) <- util(object$nf) res$InerR <- U print(U) cat(paste("\nInertia & coinertia Q (", deparse(appel$dudiQ),"):\n", sep="")) inertia <- cumsum(sdQ^2) max <- cumsum(dudiQ$eig[1:object$nf]) ratio <- inertia/max U <- cbind.data.frame(inertia, max, ratio) row.names(U) <- util(object$nf) res$InerQ <- U print(U) cat(paste("\nCorrelation L (", deparse(appel$dudiL),"):\n", sep="")) max <- sqrt(dudiL$eig[1:object$nf]) ratio <- corr/max U <- cbind.data.frame(corr, max, ratio) row.names(U) <- 1:object$nf res$CorL <- U print(U) } ade4/R/score.coa.R0000644000176200001440000001556412576021756013315 0ustar liggesusers"score.coa" <- function (x, xax = 1, dotchart = FALSE, clab.r = 1, clab.c = 1, csub = 1, cpoi = 1.5, cet = 1.5, ...) { if (!inherits(x, "coa")) stop("Object of class 'coa' expected") if (x$nf == 1) xax <- 1 if ((xax < 1) || (xax > x$nf)) stop("non convenient axe number") "dudi.coa.dotchart" <- function(dudi, numfac, clab) { if (!inherits(dudi, "coa")) stop("Object of class 'coa' expected") sli <- dudi$li[, numfac] sco <- dudi$co[, numfac] oli <- order(sli) oco <- order(sco) a <- c(sli[oli], sco[oco]) gr <- as.factor(rep(c("Rows", "Columns"), c(length(sli), length(sco)))) lab <- c(row.names(dudi$li)[oli], row.names(dudi$co)[oco]) if (clab > 0) labels <- lab else labels <- NULL dotchart(a, labels = labels, groups = gr, pch = 20) } if (dotchart) { clab <- clab.r * clab.c dudi.coa.dotchart(x, xax, clab) return(invisible()) } def.par <- par(mar = par("mar")) on.exit(par(def.par)) par(mar = c(0.1, 0.1, 0.1, 0.1)) sco.distri.class.2g <- function(score, fac1, fac2, weight, labels1 = as.character(levels(fac1)), labels2 = as.character(levels(fac2)), clab1, clab2, cpoi, cet) { nvar1 <- nlevels(fac1) nvar2 <- nlevels(fac2) ymin <- scoreutil.base(y = score, xlim = NULL, grid = TRUE, cgrid = 0.75, include.origin = TRUE, origin = 0, sub = NULL, csub = 0) ymax <- par("usr")[4] ylabel <- strheight("A", cex = par("cex") * max(1, clab1, clab2)) * 1.4 xmin <- par("usr")[1] xmax <- par("usr")[2] xaxp <- par("xaxp") nline <- xaxp[3] + 1 v0 <- seq(xaxp[1], xaxp[2], le = nline) segments(v0, rep(ymin, nline), v0, rep(ymax, nline), col = gray(0.5), lty = 1) rect(xmin, ymin, xmax, ymax) sum.col1 <- unlist(tapply(weight, fac1, sum)) sum.col2 <- unlist(tapply(weight, fac2, sum)) sum.col1[sum.col1 == 0] <- 1 sum.col2[sum.col2 == 0] <- 1 weight1 <- weight/sum.col1[fac1] weight2 <- weight/sum.col2[fac2] y.distri1 <- tapply(score * weight1, fac1, sum) y.distri1 <- rank(y.distri1) y.distri2 <- tapply(score * weight2, fac2, sum) y.distri2 <- rank(y.distri2) + nvar1 + 2 y.distri <- c(y.distri1, y.distri2) ylabel <- strheight("A", cex = par("cex") * max(1, clab1, clab2)) * 1.4 y.distri1 <- (y.distri1 - min(y.distri))/(max(y.distri) - min(y.distri)) y.distri1 <- ymin + ylabel + (ymax - ymin - 2 * ylabel) * y.distri1 y.distri2 <- (y.distri2 - min(y.distri))/(max(y.distri) - min(y.distri)) y.distri2 <- ymin + ylabel + (ymax - ymin - 2 * ylabel) * y.distri2 for (i in 1:nvar1) { w <- weight1[fac1 == levels(fac1)[i]] y0 <- y.distri1[i] score0 <- score[fac1 == levels(fac1)[i]] x.moy <- sum(w * score0) x.et <- sqrt(sum(w * (score0 - x.moy)^2)) x1 <- x.moy - cet * x.et x2 <- x.moy + cet * x.et etiagauche <- TRUE if ((x1 - xmin) < (xmax - x2)) etiagauche <- FALSE segments(x1, y0, x2, y0) if (clab1 > 0) { cha <- labels1[i] cex0 <- par("cex") * clab1 xh <- strwidth(cha, cex = cex0) xh <- xh + strwidth("x", cex = cex0) yh <- strheight(cha, cex = cex0) * 5/6 if (etiagauche) x0 <- x1 - xh/2 else x0 <- x2 + xh/2 rect(x0 - xh/2, y0 - yh, x0 + xh/2, y0 + yh, col = "white", border = 1) text(x0, y0, cha, cex = cex0) } points(x.moy, y0, pch = 20, cex = par("cex") * cpoi) } for (i in 1:nvar2) { w <- weight2[fac2 == levels(fac2)[i]] y0 <- y.distri2[i] score0 <- score[fac2 == levels(fac2)[i]] x.moy <- sum(w * score0) x.et <- sqrt(sum(w * (score0 - x.moy)^2)) x1 <- x.moy - cet * x.et x2 <- x.moy + cet * x.et etiagauche <- TRUE if ((x1 - xmin) < (xmax - x2)) etiagauche <- FALSE segments(x1, y0, x2, y0) if (clab2 > 0) { cha <- labels2[i] cex0 <- par("cex") * clab2 xh <- strwidth(cha, cex = cex0) xh <- xh + strwidth("x", cex = cex0) yh <- strheight(cha, cex = cex0) * 5/6 if (etiagauche) x0 <- x1 - xh/2 else x0 <- x2 + xh/2 rect(x0 - xh/2, y0 - yh, x0 + xh/2, y0 + yh, col = "white", border = 1) text(x0, y0, cha, cex = cex0) } points(x.moy, y0, pch = 20, cex = par("cex") * cpoi) } } if (inherits(x, "witwit")) { y <- eval.parent(as.list(x$call)[[2]]) oritab <- eval.parent(as.list(y$call)[[2]]) } else oritab <- eval.parent(as.list(x$call)[[2]]) l.names <- row.names(oritab) c.names <- names(oritab) oritab <- as.matrix(oritab) a <- x$co[col(oritab), xax] a <- a + x$li[row(oritab), xax] a <- a/sqrt(2 * x$eig[xax] * (1 + sqrt(x$eig[xax]))) a <- a[oritab > 0] aco <- col(oritab)[oritab > 0] aco <- factor(aco) levels(aco) <- c.names ali <- row(oritab)[oritab > 0] ali <- factor(ali) levels(ali) <- l.names aw <- oritab[oritab > 0]/sum(oritab) sco.distri.class.2g(a, aco, ali, aw, clab1 = clab.c, clab2 = clab.r, cpoi = cpoi, cet = cet) scatterutil.sub("Rows", csub = csub, possub = "topleft") scatterutil.sub("Columns", csub = csub, possub = "bottomright") } "reciprocal.coa" <- function (x) { if (!inherits(x, "coa")) stop("Object of class 'coa' expected") if (inherits(x, "witwit")) { y <- eval.parent(as.list(x$call)[[2]]) oritab <- eval.parent(as.list(y$call)[[2]]) } else oritab <- eval.parent(as.list(x$call)[[2]]) l.names <- row.names(oritab) c.names <- names(oritab) oritab <- as.matrix(oritab) f1 <- function(x,oritab,xax){ a <- x$co[col(oritab), xax] a <- a + x$li[row(oritab), xax] a <- a/sqrt(2 * x$eig[xax] * (1 + sqrt(x$eig[xax]))) a <- a[oritab > 0] } res <- sapply(1:x$nf,f1,x=x,oritab=oritab) aco <- col(oritab)[oritab > 0] aco <- factor(aco) levels(aco) <- c.names ali <- row(oritab)[oritab > 0] ali <- factor(ali) levels(ali) <- l.names aw <- oritab[oritab > 0]/sum(oritab) res <- cbind.data.frame(res,Row=ali,Col=aco,Weight=aw) names(res)[1:x$nf] <- paste("Scor",1:x$nf,sep="") rownames(res) <- paste(ali,aco,sep="") return(res) } ade4/R/s.multinom.R0000644000176200001440000001077712576021756013547 0ustar liggesusers "s.multinom" <- function (dfxy, dfrowprof, translate = FALSE, xax=1, yax=2, labelcat = row.names(dfxy), clabelcat = 1, cpointcat = if (clabelcat == 0) 2 else 0, labelrowprof = row.names(dfrowprof), clabelrowprof = 0.75, cpointrowprof = if (clabelrowprof == 0) 2 else 0, pchrowprof = 20, coulrowprof = grey(0.8), proba = 0.95, n.sample = apply(dfrowprof,1,sum), axesell = TRUE, ... ) { if (proba<0.5) proba <- 0.5 if (proba>0.999) proba <- 0.999 coeff <- sqrt(-2*log(1-proba)) # les scores forment un data.frame comme dans toute fonction s dfxy <- data.frame(dfxy) dfrowprof <- data.frame(dfrowprof) if (!(inherits(dfxy,"data.frame"))) stop ("data.frame expected for dfxy") if (!(inherits(dfrowprof,"data.frame"))) stop ("data.frame expected for dfrowprof") # les noms des lignes de dfxy sont les noms des colonnes de dfrowprof nrowprof <- nrow(dfrowprof) ncat <- ncol(dfrowprof) if (nrow(dfxy)!= ncat) stop ("non convenient matching : nrow(dfxy)!= ncat") if (all(row.names(dfxy)!= names(dfrowprof))) stop ("non convenient matching : row.names(dfxy)!= names(dfrowprof)") n.sample <- rep(n.sample, len = nrowprof) wt <- rep(1, nrowprof)/nrowprof if (sum(n.sample)>0) wt <- n.sample/sum(n.sample) coulrowprof <- rep(coulrowprof, len = nrowprof) x <- dfxy[,xax] y <- dfxy[,yax] util.ellipse <- function(param, coeftai) { vx <- param[3] ; cxy <- param[4]; vy <- param[5] lig <- 100 if (vx < 0) vx <- 0 ; if (vy < 0) vy <- 0 if (vx == 0 && vy == 0) return(NULL) covmat <- matrix(c(vx,cxy,cxy,vy),2,2) cov.eig <- eigen(covmat, symmetric =TRUE) l1 = sqrt(max(0,cov.eig$values[1])) l2 = sqrt(max(0,cov.eig$values[2])) c11 <- coeftai * cov.eig$vectors[1,1] * l1 c12 <- (-coeftai) * cov.eig$vectors[2,1] * l2 c21 <- coeftai * cov.eig$vectors[2,1] * l1 c22 <- coeftai * cov.eig$vectors[1,1] * l2 angle <- 2 * pi * (1:lig)/lig x <- param[1] + c11 * cos(angle) + c12 * sin(angle) y <- param[2] + c21 * cos(angle) + c22 * sin(angle) res <- list(x = x, y = y, seg1 = c(param[1] + c11, param[2] + c21, param[1] - c11, param[2] - c21), seg2 = c(param[1] + c12, param[2] + c22, param[1] - c12, param[2] - c22)) return (res) } calcul.rowprof<- function(k) { w1 <- dfrowprof[k,] if (sum(w1)<1e-07) stop (paste("number",k,"profile without data")) w1 <- w1/sum(w1) mx <- sum(w1*x) my <- sum(w1*y) x0 <- x-mx y0 <- y-my vx <- sum(w1*x0*x0) vy <- sum(w1*y0*y0) cxy <- sum(w1*x0*y0) return(c(mx,my,vx,cxy,vy)) } draw.rowprof<- function(k) { w <- as.numeric(unlist(res[k,])) if (n.sample[k] >0) cell <- coeff/sqrt(n.sample[k]) else cell <- 0 ell <- util.ellipse(w, cell) if (!is.null(ell)) { polygon(ell$x, ell$y,border=coulrowprof[k],col=coulrowprof[k], lwd=2) if (axesell) { segments(ell$seg1[1], ell$seg1[2], ell$seg1[3], ell$seg1[4]) #, lty = 2 segments(ell$seg2[1], ell$seg2[2], ell$seg2[3], ell$seg2[4]) #, lty = 2 } } } opar <- par(mar = par("mar")) par(mar = c(0.1, 0.1, 0.1, 0.1)) on.exit(par(opar)) # calcul des paramètres de position et dispersion res <- t( matrix(unlist(lapply(1:nrowprof,calcul.rowprof)),nrow=5)) res <- as.data.frame(res) names(res) <- c("mx","my","vx","cxy","vy") if (translate) { mgene <- c(sum(wt*res$mx),sum(wt*res$my)) res[,1:2] <- sweep(res[,1:2],2,mgene,"-") dfxy <- sweep(dfxy[,c(xax,yax)],2,mgene,"-") } else mgene <- c(0,0) row.names(res) <- labelrowprof row.names(res) <- labelrowprof s.label(dfxy, 1, 2, clabel = 0, cpoint = cpointcat, ...) s.arrow(dfxy, add.plot = TRUE,origin = -mgene,clabel = clabelcat, label = labelcat) s.chull(dfxy, add.plot = TRUE, fac = factor(rep(1,ncat)), optchull = 1, clabel = 0) for (k in 1:nrowprof) draw.rowprof(k) if (clabelrowprof > 0) scatterutil.eti(as.numeric(res$mx), as.numeric(res$my),labelrowprof, clabelrowprof, coul = coulrowprof) if (clabelrowprof == 0) points(as.numeric(res$mx), as.numeric(res$my), pch=pchrowprof, cex=par("cex")*cpointrowprof) box() res[,1:2] <- sweep(res[,1:2],2,mgene,"+") return(invisible(list(ell=res,tra=mgene,call=match.call()))) } ade4/R/table.cont.R0000644000176200001440000000402412576021756013457 0ustar liggesusers"table.cont" <- function (df, x = 1:ncol(df), y = 1:nrow(df), row.labels = row.names(df), col.labels = names(df), clabel.row = 1, clabel.col = 1, abmean.x = FALSE, abline.x = FALSE, abmean.y = FALSE, abline.y = FALSE, csize = 1, clegend = 0, grid = TRUE) { opar <- par(mai = par("mai"), srt = par("srt")) on.exit(par(opar)) if (any(df < 0)) stop("Non negative values expected") df <- df/sum(df) table.prepare(x = x, y = y, row.labels = row.labels, col.labels = col.labels, clabel.row = clabel.row, clabel.col = clabel.col, grid = grid, pos = "leftbottom") xtot <- x[col(as.matrix(df))] ytot <- y[row(as.matrix(df))] coeff <- diff(range(x))/15 z <- unlist(df) sq <- sqrt(abs(z)) w1 <- max(sq) sq <- csize * coeff * sq/w1 for (i in 1:length(z)) symbols(xtot[i], ytot[i], squares = sq[i], bg = "white", fg = 1, add = TRUE, inches = FALSE) f1 <- function(x,xval) { w1 <- weighted.mean(xval, x) xval <- (xval - w1)^2 w2 <- sqrt(weighted.mean(xval, x)) return(c(w1, w2)) } if (abmean.x) { val <- y w <- t(apply(df, 2, f1,xval=val)) points(x, w[, 1], pch = 20, cex = 2) segments(x, w[, 1] - w[, 2], x, w[, 1] + w[, 2]) } if (abmean.y) { val <- x w <- t(apply(df, 1, f1,xval=val)) points(w[, 1], y, pch = 20, cex = 2) segments(w[, 1] - w[, 2], y, w[, 1] + w[, 2], y) } df <- as.matrix(df) x <- x[col(df)] y <- y[row(df)] df <- as.vector(df) if (abline.x) { abline(lm(y ~ x, weights = df)) } if (abline.y) { w <- coefficients(lm(x ~ y, weights = df)) if (w[2] == 0) abline(h = w[1]) else abline(c(-w[1]/w[2], 1/w[2])) } br0 <- pretty(z, 4) l0 <- length(br0) br0 <- (br0[1:(l0 - 1)] + br0[2:l0])/2 sq0 <- sqrt(abs(br0)) sq0 <- csize * coeff * sq0/w1 sig0 <- sign(br0) if (clegend > 0) scatterutil.legend.bw.square(br0, sq0, sig0, clegend) } ade4/R/discrimin.coa.R0000644000176200001440000000453412576021756014156 0ustar liggesusers"discrimin.coa" <- function (df, fac, scannf = TRUE, nf = 2) { if (!is.factor(fac)) stop("factor expected") lig <- nrow(df) if (length(fac) != lig) stop("Non convenient dimension") dudi.coarp <- function(df) { if (!is.data.frame(df)) stop("data.frame expected") if (any(df < 0)) stop("negative entries in table") if ((N <- sum(df)) == 0) stop("all frequencies are zero") df <- df/N row.w <- apply(df, 1, sum) col.w <- apply(df, 2, sum) if (any(col.w == 0)) stop("null column found in data") df <- df/row.w df <- sweep(df, 2, col.w) X <- as.dudi(df, 1/col.w, row.w, scannf = FALSE, nf = 2, call = match.call(), type = "coarp", full = TRUE) X$N <- N class(X) <- "dudi" return(X) } dudi <- dudi.coarp(df) rank <- dudi$rank deminorm <- as.matrix(dudi$c1) * dudi$cw deminorm <- t(t(deminorm)/sqrt(dudi$eig)) cla.w <- as.vector(tapply(dudi$lw, fac, sum)) mean.w <- function(x) { z <- x * dudi$lw z <- tapply(z, fac, sum)/cla.w return(z) } tabmoy <- apply(dudi$l1, 2, mean.w) tabmoy <- data.frame(tabmoy) row.names(tabmoy) <- levels(fac) X <- as.dudi(tabmoy, rep(1, rank), cla.w, scannf = scannf, nf = nf, call = match.call(), type = "dis") res <- list(eig = X$eig) res$nf <- X$nf res$fa <- deminorm %*% as.matrix(X$c1) res$li <- as.matrix(dudi$tab) %*% res$fa w <- scalewt(dudi$tab, dudi$lw) res$va <- t(as.matrix(w)) %*% (res$li * dudi$lw) res$cp <- t(as.matrix(dudi$l1)) %*% (dudi$lw * res$li) res$fa <- data.frame(res$fa) row.names(res$fa) <- names(dudi$tab) names(res$fa) <- paste("DS", 1:X$nf, sep = "") res$li <- data.frame(res$li) row.names(res$li) <- row.names(dudi$tab) names(res$li) <- names(res$fa) w <- apply(res$li, 2, mean.w) res$gc <- data.frame(w) row.names(res$gc) <- as.character(levels(fac)) names(res$gc) <- names(res$fa) res$va <- data.frame(res$va) row.names(res$va) <- names(dudi$tab) names(res$va) <- names(res$fa) res$cp <- data.frame(res$cp) row.names(res$cp) <- names(dudi$l1) names(res$cp) <- names(res$fa) res$call <- match.call() class(res) <- c("coadisc", "discrimin") return(res) } ade4/R/dpcoa.R0000644000176200001440000001323513312501047012501 0ustar liggesusersdpcoa <- function (df, dis = NULL, scannf = TRUE, nf = 2, full = FALSE, tol = 1e-07, RaoDecomp = TRUE) { if (!inherits(df, "data.frame")) stop("df is not a data.frame") if (any(df < 0)) stop("Negative value in df") if (any(rowSums(df) < tol)) stop("Remove empty samples") nesp <- ncol(df) nrel <- nrow(df) if (!is.null(dis)) { if (!inherits(dis, "dist")) stop("dis is not an object 'dist'") n1 <- attr(dis, "Size") if (nesp != n1) stop("Non convenient dimensions") if (!is.euclid(dis)) stop("an Euclidean matrix is needed") } if (is.null(dis)) { dis <- (matrix(1, nesp, nesp) - diag(rep(1, nesp))) * sqrt(2) rownames(dis) <- colnames(dis) <- names(df) dis <- as.dist(dis) } if (is.null(attr(dis, "Labels"))) attr(dis, "Labels") <- names(df) d <- as.matrix(dis) d <- (d^2) / 2 w.samples <- rowSums(df)/sum(df) w.esp <- colSums(df)/sum(df) dfp <- as.matrix(sweep(df, 1, rowSums(df), "/")) ## Eigenanalysis pco1 <- dudi.pco(dis, row.w = w.esp, full = TRUE) wrel <- data.frame(dfp %*% as.matrix(pco1$li)) row.names(wrel) <- rownames(df) res <- as.dudi(wrel, rep(1, ncol(wrel)), w.samples, scannf = scannf, nf = nf, call = match.call(), type = "dpcoa", tol = tol, full = full) ## lw was w2 ## li was l2 w <- as.matrix(pco1$li) %*% as.matrix(res$c1) w <- data.frame(w) row.names(w) <- names(df) res$dls <- w ## was l1 res$dw <- w.esp ## was w1 res$co <- res$l1 <- NULL ## Returns some infomation related to Rao Entropy if(RaoDecomp){ res$RaoDiv <- apply(dfp, 1, function(x) sum(d * outer(x, x))) fun1 <- function(x) { w <- -sum(d * outer (x, x)) return(sqrt(w)) } dnew <- matrix(0, nrel, nrel) idx <- dfp[col(dnew)[col(dnew) < row(dnew)], ] - dfp[row(dnew)[col(dnew) < row(dnew)], ] dnew <- apply(idx, 1, fun1) attr(dnew, "Size") <- nrel attr(dnew, "Labels") <- rownames(df) attr(dnew, "Diag") <- TRUE attr(dnew, "Upper") <- FALSE attr(dnew, "method") <- "dis" attr(dnew, "call") <- match.call() class(dnew) <- "dist" res$RaoDis <- dnew Bdiv <- crossprod(w.samples, (as.matrix(dnew)^2)/2) %*% w.samples Tdiv <- crossprod(w.esp, d) %*% (w.esp) Wdiv <- Tdiv - Bdiv divdec <- data.frame(c(Bdiv, Wdiv, Tdiv)) names(divdec) <- "Diversity" rownames(divdec) <- c("Between-samples diversity", "Within-samples diversity", "Total diversity") res$RaoDecodiv <- divdec } class(res) <- "dpcoa" return(res) } plot.dpcoa <- function(x, xax = 1, yax = 2, ...) { if (!inherits(x, "dpcoa")) stop("Object of type 'dpcoa' expected") nf <- x$nf if (xax > nf) stop("Non convenient xax") if (yax > nf) stop("Non convenient yax") opar <- par(no.readonly = TRUE) on.exit (par(opar)) par(mfrow = c(2,2)) s.corcircle(x$c1[, c(xax, yax)], cgrid = 0, sub = "Principal axes", csub = 1.5, possub = "topleft", fullcircle = TRUE) add.scatter.eig(x$eig, length(x$eig), xax, yax, posi = "bottomleft", ratio = 1/4) X <- as.list(x$call)[[2]] X <- eval.parent(X) s.distri(x$dls[, c(xax, yax)], t(X), cellipse = 1, cstar = 0, sub = "Categories & Collections", possub = "bottomleft", csub = 1.5) s.label(x$dls[, c(xax, yax)], sub = "Categories", possub = "bottomleft", csub = 1.5) if(!is.null(x$RaoDiv)) s.value(x$li[, c(xax, yax)], x$RaoDiv, sub = "Rao Divcs") else s.label(x$li[, c(xax, yax)], sub = "Collections", possub = "bottomleft", csub = 1.5) } summary.dpcoa <- function(object, ...){ summary.dudi(object, ...) } print.dpcoa <- function (x, ...) { if (!inherits(x, "dpcoa")) stop("to be used with 'dpcoa' object") cat("Double principal coordinate analysis\n") cat("call: ") print(x$call) cat("class: ") cat(class(x), "\n") cat("\n$nf (axis saved) :", x$nf) cat("\n$rank: ", x$rank) cat("\n\neigen values: ") l0 <- length(x$eig) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n\n") else cat("\n\n") nr <- ifelse(!is.null(x$RaoDecomp), 4, 3) sumry <- array("", c(nr, 4), list(1:nr, c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$dw", length(x$dw), mode(x$dw), "category weights") sumry[2, ] <- c("$lw", length(x$lw), mode(x$lw), "collection weights") sumry[3, ] <- c("$eig", length(x$eig), mode(x$eig), "eigen values") if(nr == 4) sumry[4, ] <- c("$RaoDiv", length(x$RaoDiv), mode(x$RaoDiv), "diversity coefficients within collections") print(sumry, quote = FALSE) cat("\n") if(!is.null(x$RaoDecomp)){ sumry <- array("", c(1, 3), list(1:1, c("dist", "Size", "content"))) sumry[1, ] <- c("$RaoDis", attributes(x$RaoDis)$Size, "distances among collections") print(sumry, quote = FALSE) cat("\n") } sumry <- array("", c(nr, 4), list(1:nr, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$dls", nrow(x$dls), ncol(x$dls), "coordinates of the categories") sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), "coordinates of the collections") sumry[3, ] <- c("$c1", nrow(x$c1), ncol(x$c1), "scores of the principal axes of the categories") if(nr == 4) sumry[4, ] <- c("$RaoDecodiv", 3, 1, "decomposition of diversity") print(sumry, quote = FALSE) } ade4/R/kplot.mfa.R0000644000176200001440000000300712576021756013321 0ustar liggesusers"kplot.mfa" <- function (object, xax = 1, yax = 2, mfrow = NULL, which.tab = 1:length(object$blo), row.names = FALSE, col.names = TRUE, traject = FALSE, permute.row.col = FALSE, clab = 1, csub = 2, possub = "bottomright", ...) { if (!inherits(object, "mfa")) stop("Object of type 'mfa' expected") opar <- par(ask = par("ask"), mfrow = par("mfrow"), mar = par("mar")) on.exit(par(opar)) if (is.null(mfrow)) mfrow <- n2mfrow(length(which.tab)) par(mfrow = mfrow) if (length(which.tab) > prod(mfrow)) par(ask = TRUE) for (ianal in which.tab) { coolig <- object$lisup[object$TL[, 1] == levels(object$TL[,1])[ianal], c(xax, yax)] coocol <- object$co[object$TC[, 1] == levels(object$TC[,1])[ianal], c(xax, yax)] if (permute.row.col) { auxi <- coolig coolig <- coocol coocol <- auxi } cl <- clab * row.names if (cl > 0) cpoi <- 0 else cpoi <- 2 s.label(coolig, clabel = cl, cpoint = cpoi) if (traject) s.traject(coolig, clabel = 0, add.plot = TRUE) born <- par("usr") k1 <- min(coocol[, 1])/born[1] k2 <- max(coocol[, 1])/born[2] k3 <- min(coocol[, 2])/born[3] k4 <- max(coocol[, 2])/born[4] k <- c(k1, k2, k3, k4) coocol <- 0.7 * coocol/max(k) s.arrow(coocol, clabel = clab * col.names, add.plot = TRUE, sub = object$tab.names[ianal], possub = possub, csub = csub) } } ade4/R/kplot.statis.R0000644000176200001440000000356312576021756014074 0ustar liggesusers"kplot.statis" <- function (object, xax = 1, yax = 2, mfrow = NULL, which.tab = 1:length(object$tab.names), clab = 1.5, cpoi = 2, traject = FALSE, arrow = TRUE, class = NULL, unique.scale = FALSE, csub = 2, possub = "bottomright", ...) { if (!inherits(object, "statis")) stop("Object of type 'statis' expected") opar <- par(ask = par("ask"), mfrow = par("mfrow"), mar = par("mar")) on.exit(par(opar)) if (is.null(mfrow)) mfrow <- n2mfrow(length(which.tab)) par(mfrow = mfrow) if (length(which.tab) > prod(mfrow)) par(ask = TRUE) nf <- ncol(object$C.Co) if (xax > nf) stop("Non convenient xax") if (yax > nf) stop("Non convenient yax") cootot <- object$C.Co[, c(xax, yax)] label <- TRUE if (!is.null(class)) { class <- factor(class) if (length(class) != length(object$TC[, 1])) class <- NULL else label <- FALSE } for (ianal in which.tab) { coocol <- cootot[object$TC[, 1] == levels(object$TC[,1])[ianal], ] if (unique.scale) s.label(cootot, clabel = 0, cpoint = 0, sub = object$tab.names[ianal], possub = possub, csub = csub) else s.label(coocol, clabel = 0, cpoint = 0, sub = object$tab.names[ianal], possub = possub, csub = csub) if (arrow) { s.arrow(coocol, clabel = clab, add.plot = TRUE) label <- FALSE } if (label) s.label(coocol, clabel = clab, cpoint = cpoi, add.plot = TRUE) if (traject) s.traject(coocol, clabel = 0, add.plot = TRUE) if (!is.null(class)) { f1 <- as.factor(class[object$TC[, 1] == levels(object$TC[,1])[ianal]]) s.class(coocol, f1, clabel = clab, cpoint = 2, pch = 20, axesell = FALSE, cellipse = 0, add.plot = TRUE) } } } ade4/R/suprow.pta.R0000644000176200001440000000410313553312514013535 0ustar liggesusers"suprow.pta" <- function(x, Xsup, facSup, ...) { if (!inherits(x, "pta")) stop("Object of class 'pta' expected") if(!inherits(Xsup, "data.frame")) stop("Object of class 'data.frame' expected") if(!is.factor(facSup)) stop("factor expected") lig <- nrow(Xsup) if(length(facSup) != lig) stop("Non convenient dimension") appel <- as.list(x$call) kta2 <- eval.parent(appel$X) appel.kta2 <- as.list(kta2$call) kta1 <- eval.parent(appel.kta2$x) appel.kta1 <- as.list(kta1$call) wit1 <- eval.parent(appel.kta1$dudiwit) appel.wit1 <- as.list(wit1$call) ok <- (appel.wit1[[1]] == "withinpca") && (appel.kta1[[1]] == "ktab.within") && (appel.kta2[[1]] == "t.ktab") && (appel[[1]] == "pta") if (!ok) stop("Non convenient call sequence") dfX <- eval.parent(appel.wit1$df) facX <- eval.parent(appel.wit1$fac) dfXw <- scalewt(dfX, center = TRUE, scale = TRUE) mean.dfXw <- attr(dfXw, "scaled:center") var.dfXw <- attr(dfXw, "scaled:scale") Xsupmean <- sweep(Xsup, 2, mean.dfXw, "-") Xsupw <- sweep(Xsupmean, 2, var.dfXw, "/") scaling <- appel.wit1$scaling if (scaling == "total") { dfXw <- scalewt(dfXw, center = FALSE, scale = TRUE) dfXw2 <- data.frame() for (i in levels(facX)) { w <- dfXw[facX == i, ] w <- scalewt(w, center = TRUE, scale = FALSE) dfXw2 <- rbind(dfXw2, w) mean.w <- attr(w, "scaled:center") Xsupw[facSup == i, ] <- sweep(Xsupw[facSup == i, ], 2, mean.w, "-") } dfXw2 <- scalewt(dfXw2, center = FALSE, scale = TRUE) var.dfXw2 <- attr(dfXw2, "scaled:scale") Xsupw <- sweep(Xsupw, 2, var.dfXw2, "/") } if (scaling == "partial") { for (i in levels(facX)) { w <- dfXw[facX == i, ] w <- scalewt(w, center = TRUE, scale = TRUE) mean.w <- attr(w, "scaled:center") var.w <- attr(w, "scaled:scale") Xsupw[facSup == i, ] <- sweep(Xsupw[facSup == i, ], 2, mean.w, "-") Xsupw[facSup == i, ] <- sweep(Xsupw[facSup == i, ], 2, var.w, "/") } } coosup <- as.matrix(Xsupw) %*% (as.matrix(x$c1) * x$cw) return(list(tabsup = Xsupw, lisup = coosup)) }ade4/R/sco.match.R0000644000176200001440000001116212576021756013306 0ustar liggesusers"sco.match" <- function(score1, score2, label = names(score1), clabel = 1, horizontal = TRUE, reverse = FALSE, pos.lab = 0.5, wmatch=3,pch = 20, cpoint = 1, boxes = TRUE, lim = NULL, grid = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0,0), sub = "", csub = 1.25, possub = "bottomleft"){ if(!is.vector(score1)) stop("score1 should be a vector") if(!is.vector(score2)) stop("score2 should be a vector") nval <- length(score1) if(nval != length(score2)) stop("length of 'score1' or 'score2' is not convenient") if(is.null(label)) label <- 1:nval if(nval != length(label)) stop("length of 'label' is not convenient") if (pos.lab>1 | pos.lab<0) stop("pos.lab should be between 0 and 1") oldpar <- par(mar=rep(0.1, 4)) on.exit(par(oldpar)) res <- scatterutil.sco(score = c(score1,score2), lim = lim, grid = grid, cgrid = cgrid, include.origin = include.origin, origin = origin, sub = sub, csub = csub, horizontal = horizontal, reverse = reverse) if(horizontal){ if(reverse) { points(score1, rep(1- res[3], nval), pch = pch, cex = par("cex") * cpoint) abline(h=1- wmatch*res[3]) points(score2, rep(1- wmatch*res[3], nval), pch = pch, cex = par("cex") * cpoint) segments(score1,rep(1- res[3], nval),score2,rep(1- wmatch*res[3], nval)) } else { points(score1, rep(res[3], nval), pch = pch, cex = par("cex") * cpoint) abline(h=wmatch*res[3]) points(score2, rep(wmatch*res[3], nval), pch = pch, cex = par("cex") * cpoint) segments(score1,rep(res[3], nval),score2,rep(wmatch*res[3], nval)) } if(clabel>0){ if(is.null(pos.lab)) pos.lab <- 0.5 if(reverse){ pos.lab <- 1 - wmatch * res[3] - pos.lab * (1 - wmatch * res[3]) pos.elbow <- 1 - wmatch * res[3] - (1 - wmatch * res[3] - pos.lab)/5 } else { pos.lab <- wmatch * res[3] + pos.lab * (1 - wmatch * res[3]) pos.elbow <- wmatch * res[3] + (pos.lab - wmatch * res[3])/5 } for (i in 1:nval) { xh <- strwidth(paste(" ", label[order(score2)][i], " ", sep = ""), cex = par("cex") * clabel) tmp <- scatterutil.convrot90(xh,0) yh <- tmp[2] yreg <- res[1] + (res[2] - res[1])/(nval + 1) * i segments(score2[order(score2)][i],pos.elbow ,yreg, pos.lab) if(reverse) { segments(score2[order(score2)][i], 1 - wmatch * res[3], score2[order(score2)][i], pos.elbow) scatterutil.eti(yreg, pos.lab - yh/2, label[order(score2)][i], clabel = clabel, boxes = boxes, horizontal = FALSE) } else { segments(score2[order(score2)][i], wmatch * res[3], score2[order(score2)][i], pos.elbow) scatterutil.eti(yreg, pos.lab + yh/2, label[order(score2)][i], clabel = clabel, boxes = boxes, horizontal = FALSE) } } } } else { if(reverse){ points(rep(1 - res[3], nval), score1, pch = pch, cex = par("cex") * cpoint) abline(v=1- wmatch*res[3]) points(rep(1- wmatch*res[3], nval), score2, pch = pch, cex = par("cex") * cpoint) segments(rep(1- res[3], nval),score1,rep(1- wmatch*res[3], nval), score2) } else { points(rep(res[3], nval), score1, pch = pch, cex = par("cex") * cpoint) abline(v=wmatch*res[3]) points(rep(wmatch*res[3], nval), score2, pch = pch, cex = par("cex") * cpoint) segments(rep(res[3], nval),score1,rep(wmatch*res[3], nval), score2) } if(clabel>0){ if(is.null(pos.lab)) pos.lab <- 0.5 if(reverse){ pos.lab <- 1 - wmatch * res[3] - pos.lab * (1 - wmatch * res[3]) pos.elbow <- 1- wmatch * res[3] - (1 - wmatch * res[3]- pos.lab)/5 } else { pos.lab <- wmatch * res[3] + pos.lab * (1 - wmatch * res[3]) pos.elbow <- wmatch * res[3] + (pos.lab - wmatch * res[3])/5 } for (i in 1:nval) { xh <- strwidth(paste(" ", label[order(score2)][i], " ", sep = ""), cex = par("cex") * clabel) yreg <- res[1] + (res[2] - res[1])/(nval + 1) * i segments(pos.elbow,score2[order(score2)][i],pos.lab ,yreg) if(reverse) { segments(1 - wmatch * res[3],score2[order(score2)][i], pos.elbow, score2[order(score2)][i]) scatterutil.eti(pos.lab - xh/2, yreg, label[order(score2)][i], clabel = clabel, boxes = boxes, horizontal = TRUE) } else { segments(wmatch * res[3],score2[order(score2)][i], pos.elbow, score2[order(score2)][i]) scatterutil.eti(pos.lab + xh/2, yreg, label[order(score2)][i], clabel = clabel, boxes = boxes, horizontal = TRUE) } } } } invisible(match.call()) } ade4/R/dagnelie.test.R0000644000176200001440000000371413176354711014156 0ustar liggesusersdagnelie.test <- function(x) { epsilon <- sqrt(.Machine$double.eps) X <- as.matrix(x) n <- nrow(X) p <- ncol(X) dim <- c(n, p) names(dim) <- c("n", "p") # Centre the data matrix by columns x.cent <- scale(X, center = TRUE, scale = FALSE) rank.x <- qr(cov(X))$rank if (n < (rank.x + 2)) stop("n =", n, ", rank =", rank.x, ", hence n<(rank+2). The test requires n>(rank+1)") # Compute inverse of the dispersion matrix if (rank.x == p) { invS <- solve(cov(X)) # Use normal inverse } else { invS <- ginv(cov(X)) } # Use generalized inverse if rank.x < p # Mahalanobis distances between the objects and the multidimensional mean # vector of all objects (Legendre & Legendre 2012, eq. 4.54 p. 193) # Calculation simplified for centred data; it only uses a row vector of # centred data D <- as.vector(rep(0, n)) for (i in 1:n) { temp <- x.cent[i,] D[i] <- sqrt(t(temp) %*% invS %*% temp) } if ((max(D) - min(D)) < epsilon) { warning("All D values are equal. A valid Dagnelie test cannot be computed") return(list( dim = dim, rank = rank.x, D = D )) } # Shapiro-Wilk test on vector D multinorm <- shapiro.test(D) # Warning messages if (p == 1) { warning("Test too liberal for univariate data") } else { if (n < 3 * p) { warning("Test too liberal, n < 3*p") } else { warning("Test too liberal, n > 8*p") } if (p == 2) { if (n < 6) warning("Test too liberal, p = 2, n < 6") if (n > 13) warning("Test too liberal, p = 2, n > 13") } } out <- list( Shapiro.Wilk = multinorm, dim = dim, rank = rank.x, D = D ) return(out) } ade4/R/randtest.between.R0000644000176200001440000000217613050632301014666 0ustar liggesusers"randtest.between" <- function(xtest, nrepet = 999, ...) { if (!inherits(xtest,"dudi")) stop("Object of class dudi expected") if (!inherits(xtest,"between")) stop ("Type 'between' expected") appel <- as.list(xtest$call) dudi1 <- eval.parent(appel[[2]]) ## could work with bca (appel$x) or between (appel$dudi) fac <- eval.parent(appel$fac) X <- dudi1$tab X.lw <- dudi1$lw if ((!(identical(all.equal(X.lw,rep(1/nrow(X), nrow(X))),TRUE)))) { if(as.list(dudi1$call)[[1]] == "dudi.acm" ) stop ("Not implemented for non-uniform weights in the case of dudi.acm") else if(as.list(dudi1$call)[[1]] == "dudi.hillsmith" ) stop ("Not implemented for non-uniform weights in the case of dudi.hillsmith") else if(as.list(dudi1$call)[[1]] == "dudi.mix" ) stop ("Not implemented for non-uniform weights in the case of dudi.mix") } inertot <- sum(dudi1$eig) isim <- testinter(nrepet, dudi1$lw, dudi1$cw, length(unique(fac)), fac, dudi1$tab, nrow(X), ncol(X))/inertot obs <- isim[1] return(as.randtest(sim = isim[-1], obs = obs, call = match.call(), ...)) } ade4/R/RV.rtest.R0000644000176200001440000000151313050632301013073 0ustar liggesusers"RV.rtest" <- function (df1, df2, nrepet = 99, ...) { if (!is.data.frame(df1)) stop("data.frame expected") if (!is.data.frame(df2)) stop("data.frame expected") l1 <- nrow(df1) if (nrow(df2) != l1) stop("Row numbers are different") if (any(row.names(df2) != row.names(df1))) stop("row names are different") X <- scale(df1, scale = FALSE) Y <- scale(df2, scale = FALSE) X <- X/(sum(svd(X)$d^4)^0.25) Y <- Y/(sum(svd(Y)$d^4)^0.25) X <- as.matrix(X) Y <- as.matrix(Y) obs <- sum(svd(t(X) %*% Y)$d^2) if (nrepet == 0) return(obs) perm <- matrix(0, nrow = nrepet, ncol = 1) perm <- apply(perm, 1, function(x) sum(svd(t(X) %*% Y[sample(l1), ])$d^2)) w <- as.randtest(obs = obs, sim = perm, call = match.call(), ...) return(w) } ade4/R/withinpca.R0000644000176200001440000000340712576021756013420 0ustar liggesusers"withinpca" <- function (df, fac, scaling = c("partial", "total"), scannf = TRUE, nf = 2) { if (!inherits(df, "data.frame")) stop("Object of class 'data.frame' expected") if (!is.factor(fac)) stop("factor expected") lig <- nrow(df) if (length(fac) != lig) stop("Non convenient dimension") cla.w <- tapply(rep(1, length(fac)), fac, sum) df <- data.frame(scalewt(df)) mean.w <- function(x) tapply(x, fac, sum)/cla.w tabmoy <- apply(df, 2, mean.w) tabw <- cla.w tabw <- tabw/sum(tabw) tabwit <- df tabwit <- tabwit - tabmoy[fac, ] scaling <- match.arg(scaling) if (scaling == "total") { tabwit <- scalewt(tabwit, center = FALSE, scale = TRUE) } else if (scaling == "partial") { for (j in levels(fac)) { w <- tabwit[fac == j, ] w <- scalewt(w) tabwit[fac == j, ] <- w } } tabwit <- data.frame(tabwit) df <- tabwit + tabmoy[fac, ] dudi <- as.dudi(df, row.w = rep(1, nrow(df))/nrow(df), col.w = rep(1, ncol(df)), scannf = FALSE, nf = 4, call = match.call(), type = "tmp") X <- as.dudi(tabwit, row.w = rep(1, nrow(df))/nrow(df), col.w = rep(1, ncol(df)), scannf = scannf, nf = nf, call = match.call(), type = "wit") X$ratio <- sum(X$eig)/sum(dudi$eig) U <- as.matrix(X$c1) * unlist(X$cw) U <- data.frame(as.matrix(dudi$tab) %*% U) row.names(U) <- row.names(dudi$tab) names(U) <- names(X$c1) X$ls <- U U <- as.matrix(X$c1) * unlist(X$cw) U <- data.frame(t(as.matrix(dudi$c1)) %*% U) row.names(U) <- names(dudi$li) names(U) <- names(X$li) X$as <- U X$tabw <- tabw X$fac <- fac class(X) <- c("within", "dudi") return(X) } ade4/R/ade4-deprecated.R0000644000176200001440000010376013474205664014350 0ustar liggesusers"between" <- function (dudi, fac, scannf = TRUE, nf = 2) { .Deprecated(new="bca", package="ade4", msg="To avoid some name conflicts, the 'between' function is now deprecated. Please use 'bca' instead") res <- bca(x=dudi, fac=fac, scannf = scannf, nf = nf) res$call <- match.call() return(res) } "betweencoinertia" <- function (obj, fac, scannf = TRUE, nf = 2) { .Deprecated(new="bca", package="ade4", msg="To avoid some name conflicts, the 'betweencoinertia' function is now deprecated. Please use 'bca.coinertia' instead") res <- bca(x=obj, fac=fac, scannf = scannf, nf = nf) res$call <- match.call() return(res) } "within" <- function (dudi, fac, scannf = TRUE, nf = 2) { .Deprecated(new="wca", package="ade4", msg="To avoid some name conflicts, the 'within' function is now deprecated. Please use 'wca' instead") res <- wca(x=dudi, fac=fac, scannf = scannf, nf = nf) res$call <- match.call() return(res) } "withincoinertia" <- function (obj, fac, scannf = TRUE, nf = 2){ .Deprecated(new="wca", package="ade4", msg="To avoid some name conflicts, the 'withincoinertia' function is now deprecated. Please use 'wca.coinertia' instead") res <- wca(x=obj, fac=fac, scannf = scannf, nf = nf) res$call <- match.call() return(res) } "orthogram"<- function (x, orthobas = NULL, neig = NULL, phylog = NULL, nrepet = 999, posinega = 0, tol = 1e-07, na.action = c("fail", "mean"), cdot = 1.5, cfont.main = 1.5, lwd = 2, nclass, high.scores = 0, alter=c("greater", "less", "two-sided"), ...) { .Deprecated(new="orthogram", package="ade4", msg="This function is now deprecated. Please use the 'orthogram' function in the 'adephylo' package.") "orthoneig" <- function (obj) { if (!inherits(obj, "neig")) stop("Object of class 'neig' expected") b0 <- neig.util.LtoG(obj) deg <- attr(obj, "degrees") m <- sum(deg) n <- length(deg) b0 <- -b0/m + diag(deg)/m # b0 est la matrice D-P eig <- eigen (b0, symmetric = TRUE) w0 <- abs(eig$values)/max(abs(eig$values)) w0 <- which(w01) { # on ajoute le vecteur dérivé de 1n w <- cbind(rep(1,n),eig$vectors[,w0]) # on orthonormalise l'ensemble w <- qr.Q(qr(w)) # on met les valeurs propres à 0 eig$values[w0] <- 0 # on remplace les vecteurs du noyau par une base orthonormée contenant # en première position le parasite eig$vectors[,w0] <- w[,-ncol(w)] # on enlève la position du parasite w0 <- (1:n)[-w0[1]] } w0=rev(w0) rank <- length(w0) values <- n-eig$values[w0]*n eig <- eig$vectors[,w0]*sqrt(n) eig <- data.frame(eig) row.names(eig) <- names(deg) names(eig) <- paste("V",1:rank,sep="") attr(eig,"values")<-values eig } if (!is.numeric(x)) stop("x is not numeric") nobs <- length(x) if (!is.null(neig)) { orthobas <- orthoneig(neig) } else if (!is.null(phylog)) { if (!inherits(phylog, "phylog")) stop ("'phylog' expected with class 'phylog'") orthobas <- phylog$Bscores } if (is.null(orthobas)){ stop ("'orthobas','neig','phylog' all NULL") } if (!inherits(orthobas, "data.frame")) stop ("'orthobas' is not a data.frame") if (nrow(orthobas) != nobs) stop ("non convenient dimensions") if (ncol(orthobas) != (nobs-1)) stop (paste("'orthobas' has",ncol(orthobas),"columns, expected:",nobs-1)) vecpro <- as.matrix(orthobas) npro <- ncol(vecpro) if (any(is.na(x))) { if (na.action == "fail") stop("missing value in 'x'") else if (na.action == "mean") x[is.na(x)] <- mean(na.omit(x)) else stop("unknown method for 'na.action'") } w <- t(vecpro/nobs)%*%vecpro if (any(abs(diag(w)-1)>tol)) { # print(abs(diag(w)-1)) stop("'orthobas' is not orthonormal for uniform weighting") } diag(w) <- 0 if ( any( abs(as.numeric(w))>tol) ) stop("'orthobas' is not orthogonal for uniform weighting") if (nrepet < 99) nrepet <- 99 if (posinega !=0) { if (posinega >= nobs-1) stop ("Non convenient value in 'posinega'") if (posinega <0) stop ("Non convenient value in 'posinega'") } # préparation d'un graphique à 6 fenêtres # 1 pgram # 2 pgram cumulé # 3-6 Tests de randomisation def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) layout (matrix(c(1,1,2,2,1,1,2,2,3,4,5,6),4,3)) par(mar = c(0.1, 0.1, 0.1, 0.1)) par(usr = c(0,1,-0.05,1)) # layout.show(6) z <- x - mean(x) et <- sqrt(mean(z * z)) if ( et <= tol*(max(z)-min(z))) stop ("No variance") z <- z/et sig50 <- (1:npro)/npro w <- .C("VarianceDecompInOrthoBasis", param = as.integer(c(nobs,npro,nrepet,posinega)), observed = as.double(z), vecpro = as.double(vecpro), phylogram = double(npro), phylo95 = double(npro), sig025 = double(npro), sig975 = double(npro), R2Max = double(nrepet+1), SkR2k = double(nrepet+1), Dmax = double(nrepet+1), SCE = double(nrepet+1), ratio = double(nrepet+1), PACKAGE="ade4" ) ylim <- max(c(w$phylogram, w$phylo95)) z0 <- apply(vecpro, 2, function(x) sum(z * x)) names(w$phylogram) <- as.character(1:npro) phylocum <- cumsum(w$phylogram) lwd0=2 fun <- function (y, last=FALSE) { delta <- (mp[2]-mp[1])/3 sel <- 1:(npro - 1) segments(mp[sel]-delta,y[sel],mp[sel]+delta, y[sel],lwd=lwd0) if(last) segments(mp[npro]-delta,y[npro],mp[npro]+delta, y[npro],lwd=lwd0) } y0 <- phylocum - sig50 h.obs <- max(y0) x0 <- min(which(y0 == h.obs)) par(mar = c(3.1, 2.5, 2.1, 2.1)) mp <- barplot(w$phylogram, col = grey(1 - 0.3 * (sign(z0) > 0)), ylim = c(0, ylim * 1.05)) scores.order <- (1:length(w$phylogram))[order(w$phylogram, decreasing=TRUE)[1:high.scores]] fun(w$phylo95,TRUE) abline(h = 1/npro) if (posinega!=0) { verti = (mp[posinega]+mp[posinega+1])/2 abline (v=verti, col="red",lwd=1.5) } title(main = "Variance decomposition",font.main=1, cex.main=cfont.main) box() obs0 <- rep(0, npro) names(obs0) <- as.character(1:npro) barplot(obs0, ylim = c(-0.05, 1.05)) abline(h=0,col="white") if (posinega!=0) { verti = (mp[posinega]+mp[posinega+1])/2 abline (v=verti, col="red",lwd=1.5) } title(main = "Cumulative decomposition",font.main=1, cex.main=cfont.main) points(mp, phylocum, pch = 21, cex = cdot, type = "b") segments(mp[1], 1/npro, mp[npro], 1, lty = 1) fun(w$sig975) fun(w$sig025) arrows(mp[x0], sig50[x0], mp[x0], phylocum[x0], angle = 15, length = 0.15, lwd = 2) box() if (missing(nclass)) { nclass <- as.integer (nrepet/25) nclass <- min(c(nclass,40)) } plot.randtest (as.randtest (w$R2Max[-1],w$R2Max[1],call=match.call(), output = "full"),main = "R2Max",nclass=nclass) if (posinega !=0) { plot.randtest (as.randtest (w$ratio[-1],w$ratio[1],call=match.call(), output = "full"),main = "Ratio",nclass=nclass) } else { plot.randtest (as.randtest (w$SkR2k[-1],w$SkR2k[1],call=match.call(), output = "full"),main = "SkR2k",nclass=nclass) } plot.randtest (as.randtest (w$Dmax[-1],w$Dmax[1], call=match.call(), output = "full"),main = "DMax",nclass=nclass) plot.randtest (as.randtest (w$SCE[-1],w$SCE[1], call=match.call(), output = "full"),main = "SCE", nclass=nclass) w$param <- w$observed <- w$vecpro <- NULL w$phylogram <- NULL w$phylo95 <- w$sig025 <- w$sig975 <- NULL if (posinega==0) { w <- as.krandtest(obs=c(w$R2Max[1],w$SkR2k[1],w$Dmax[1],w$SCE[1]),sim=cbind(w$R2Max[-1],w$SkR2k[-1],w$Dmax[-1],w$SCE[-1]),names=c("R2Max","SkR2k","Dmax","SCE"),alter=alter,call=match.call(), ...) } else { w <- as.krandtest(obs=c(w$R2Max[1],w$SkR2k[1],w$Dmax[1],w$SCE[1],w$ratio[1]),sim=cbind(w$R2Max[-1],w$SkR2k[-1],w$Dmax[-1],w$SCE[-1],w$ratio[-1]),names=c("R2Max","SkR2k","Dmax","SCE","ratio"),alter=alter,call=match.call(), ...) } if (high.scores != 0) w$scores.order <- scores.order return(w) } "EH" <- function(phyl, select = NULL) { .Deprecated(new="EH", package="ade4", msg="This function is now deprecated. Please use the 'EH' function in the 'adiv' package.") if (!inherits(phyl, "phylog")) stop("unconvenient phyl") if(is.null(phyl$Wdist)) phyl <- newick2phylog.addtools(phyl) if (is.null(select)) return(sum(phyl$leaves) + sum(phyl$nodes)) else { if(!is.numeric(select)) stop("unconvenient select") select <- unique(select) nbesp <- length(phyl$leaves) nbselect <- length(select) if(any(is.na(match(select, 1:nbesp)))) stop("unconvenient select") phyl.D <- as.matrix(phyl$Wdist^2 / 2) if(length(select)==1) return(max(phyl.D)) if(length(select)==2) return(phyl.D[select[1], select[2]] + max(phyl.D)) fun <- function(i) { min(phyl.D[select[i], select[1:(i - 1)]]) } res <- phyl.D[select[1], select[2]] + max(phyl.D) + sum(sapply(3:nbselect, fun)) return(res) } } "orisaved" <- function(phyl, rate = 0.1, method = 1) { .Deprecated(new="orisaved", package="ade4", msg="This function is now deprecated. Please use the 'orisaved' function in the 'adiv' package.") if (!inherits(phyl, "phylog")) stop("unconvenient phyl") if(is.null(phyl$Wdist)) phyl <- newick2phylog.addtools(phyl) if (any(is.na(match(method, 1:2)))) stop("unconvenient method") if (length(method) != 1) stop("only one method can be chosen") if (length(rate) != 1) stop("unconvenient rate") if (!is.numeric(rate)) stop("rate must be a real value") if (!(rate>=0 & rate<=1)) stop("rate must be between 0 and 1") if (rate == 0) return(0) phy.h <- hclust(phyl$Wdist^2 / 2) nbesp <- length(phy.h$labels) Rate <- round(seq(0, nbesp, by = nbesp * rate)) Rate <- Rate[-1] phyl.D <- as.matrix(phyl$Wdist^2 / 2) Orig <- (solve(phyl.D)%*%rep(1, nbesp) / sum(solve(phyl.D))) OrigCalc <- function(i) { if (method == 1) { return(sum(unlist(lapply(split(Orig, cutree(phy.h, i)), max)))) } if (method == 2) { return(sum(unlist(lapply(split(Orig, cutree(phy.h, i)), min)))) } } res <- c(0, sapply(Rate, OrigCalc)) return(res) } "randEH" <- function(phyl, nbofsp, nbrep = 10) { .Deprecated(new="randEH", package="ade4", msg="This function is now deprecated. Please use the 'randEH' function in the 'adiv' package.") if (!inherits(phyl, "phylog")) stop("unconvenient phyl") if(is.null(phyl$Wdist)) phyl <- newick2phylog.addtools(phyl) if (length(nbofsp)!= 1) stop("unconvenient nbofsp") nbesp <- length(phyl$leaves) if (!((0 <= nbofsp) & (nbofsp <= nbesp))) stop("unconvenient nbofsp") nbofsp <- round(nbofsp) if (nbofsp == 0) return(rep(0, nbrep)) if (nbofsp == nbesp) { return(rep(EH(phyl), nbrep)) } simuA1 <- function(i, phy) { comp = sample(1:nbesp, nbofsp) if (nbofsp == 2) { phyl.D <- as.matrix(phyl$Wdist^2 / 2) resc <- (max(phyl.D) + phyl.D[comp[1], comp[2]]) } else { if (nbofsp == 1) resc <- max(phyl$Wdist^2 / 2) else { resc <- EH(phyl, select = comp) } } return(resc) } res <- sapply(1:nbrep, simuA1, phyl) return(res) } "optimEH" <- function(phyl, nbofsp, tol = 1e-8, give.list = TRUE) { .Deprecated(new="optimEH", package="ade4", msg="This function is now deprecated. Please use the 'optimEH' function in the 'adiv' package.") if (!inherits(phyl, "phylog")) stop("unconvenient phyl") if(is.null(phyl$Wdist)) phyl <- newick2phylog.addtools(phyl) phy.h <- hclust(phyl$Wdist^2 / 2) nbesp <- length(phy.h$labels) if (length(nbofsp) != 1) stop("unconvenient nbofsp") if (nbofsp == 0) return(0) if (!((0 < nbofsp) & (nbofsp <= nbesp))) stop("unconvenient nbofsp") nbofsp <- round(nbofsp) sp.names <- phy.h$labels if (nbofsp == nbesp) { res1 <- EH(phyl) sauv.names <- sp.names } else { phyl.D <- as.matrix(phyl$Wdist^2 / 2) Orig <- (solve(phyl.D)%*%rep(1, nbesp) / sum(solve(phyl.D))) Orig <- as.data.frame(Orig) car1 <- split(Orig, cutree(phy.h, nbofsp)) name1 <- lapply(car1,function(x) rownames(x)[abs(x - max(x)) < tol]) sauv.names <- lapply(name1, paste, collapse = " OR ") comp <- as.character(as.vector(lapply(name1, function(x) x[1]))) nb1 <- as.vector(sapply(comp, function(x) (1:nbesp)[sp.names == x])) if (nbofsp == 2) res1 <- max(phyl$Wdist^2 / 2) * 2 else { if (nbofsp == 1) res1 <- max(phyl$Wdist^2 / 2) else { res1 <- EH(phyl, select = nb1) } } } if (give.list == TRUE) return(list(value = res1, selected.sp = cbind.data.frame(names = unlist(sauv.names)))) else return(res1) } "dist.genet" <- function (genet, method = 1, diag = FALSE, upper = FALSE) { .Deprecated(new="dist.genet", package="ade4", msg="This function is now deprecated. Please use the 'dist.genpop' function in the 'adegenet' package.") METHODS = c("Nei","Edwards","Reynolds","Rodgers","Provesti") if (all((1:5)!=method)) { cat("1 = Nei 1972\n") cat("2 = Edwards 1971\n") cat("3 = Reynolds, Weir and Coockerman 1983\n") cat("4 = Rodgers 1972\n") cat("5 = Provesti 1975\n") cat("Select an integer (1-5): ") method <- as.integer(readLines(n = 1)) } if (all((1:5)!=method)) (stop ("Non convenient method number")) if (!inherits(genet,"genet")) stop("list of class 'genet' expected") df <- genet$tab col.blocks <- genet$loc.blocks nloci <- length(col.blocks) d.names <- genet$pop.names nlig <- nrow(df) if (is.null(names(col.blocks))) { names(col.blocks) <- paste("L", as.character(1:nloci), sep = "") } f1 <- function(x) { a <- sum(x) if (is.na(a)) return(rep(0, length(x))) if (a == 0) return(rep(0, length(x))) return(x/a) } k2 <- 0 for (k in 1:nloci) { k1 <- k2 + 1 k2 <- k2 + col.blocks[k] X <- df[, k1:k2] X <- t(apply(X, 1, f1)) X.marge <- apply(X, 1, sum) if (any(sum(X.marge)==0)) stop ("Null row found") X.marge <- X.marge/sum(X.marge) df[, k1:k2] <- X } # df contient un tableau de fréquence df <- as.matrix(df) if (method == 1) { d <- df%*%t(df) vec <- sqrt(diag(d)) d <- d/vec[col(d)] d <- d/vec[row(d)] d <- -log(d) d <- as.dist(d) } else if (method == 2) { df <- sqrt(df) d <- df%*%t(df) d <- 1-d/nloci diag(d) <- 0 d <- sqrt(d) d <- as.dist(d) } else if (method == 3) { denomi <- df%*%t(df) vec <- apply(df,1,function(x) sum(x*x)) d <- -2*denomi + vec[col(denomi)] + vec[row(denomi)] diag(d) <- 0 denomi <- 2*nloci - 2*denomi diag(denomi) <- 1 d <- d/denomi d <- sqrt(d) d <- as.dist(d) } else if (method == 4) { loci.fac <- rep( names(col.blocks),col.blocks) loci.fac <- as.factor(loci.fac) ltab <- lapply(split(df,loci.fac[col(df)]),matrix,nrow=nlig) "dcano" <- function (mat) { daux <- mat%*%t(mat) vec <- diag(daux) daux <- -2*daux+vec[col(daux)] daux <- daux + vec[row(daux)] diag(daux) <- 0 daux <- sqrt(daux/2) d <<- d+daux } d <- matrix(0,nlig,nlig) lapply(ltab, dcano) d <- d/length(ltab) d <- as.dist(d) } else if (method ==5) { w0 <- 1:(nlig-1) "loca" <- function (k) { w1 <- (k+1):nlig resloc <- unlist(lapply(w1, function(x) sum(abs(df[k,]-df[x,])))) return(resloc/2/nloci) } d <- unlist(lapply(w0,loca)) } attr(d, "Size") <- nlig attr(d, "Labels") <- d.names attr(d, "Diag") <- diag attr(d, "Upper") <- upper attr(d, "method") <- METHODS[method] attr(d, "call") <- match.call() class(d) <- "dist" return(d) } "fuzzygenet" <- function(X) { .Deprecated(new="fuzzygenet", package="ade4", msg="This function is now deprecated. Please use the 'df2genind' function in the 'adegenet' package.") if (!inherits(X, "data.frame")) stop ("X is not a data.frame") nind <- nrow(X) #################################################################################### "codred" <- function(base, n) { # fonction qui fait des codes de noms ordonnés par ordre # alphabétique de longueur constante le plus simples possibles # base est une chaîne de charactères, n le nombre qu'on veut w <- as.character(1:n) max0 <- max(nchar(w)) "fun1" <- function(x) while ( nchar(w[x]) < max0) w[x] <<- paste("0",w[x],sep="") lapply(1:n, fun1) return(paste(base,w,sep="")) } ################################################################################### # ce qui touche au loci loc.names <- names(X) nloc <- ncol(X) loc.codes <- codred("L",nloc) names(loc.names) <- loc.codes names(X) <- loc.codes "cha6car" <- function(cha) { # pour compléter les chaînes de caratères par des zéros devant n0 <- nchar(cha) if (n0 == 6) return (cha) if (n0 >6) stop ("More than 6 characters") cha = paste("0",cha,sep="") cha = cha6car(cha) } X <- apply(X,c(1,2),cha6car) # Toutes les chaînes sont de 6 charactères suppose que le codage est complet # ou qu'il ne manque des zéros qu'au début "enumallel" <- function (x) { w <- as.character(x) w1 <- substr(w,1,3) w2 <- substr(w,4,6) w3 <- sort(unique (c(w1,w2))) return(w3) } all.util <- apply(X,2,enumallel) # all.util est une liste dont les composantes sont les noms des allèles ordonnés # peut comprendre 000 pour un non typé # on conserve le nombre d'individus typés par locus dans vec1 "compter" <- function(x) { # compte le nombre d'individus typés par locus num0 <- x!="000000" num0 <- sum(num0) return(num0) } vec1 <- unlist(apply(X,2, compter)) names(vec1) <- loc.codes # vec1 est le vecteur des effectifs d'individus typés par locus "polymor" <- function(x) { if (any(x=="000")) return(x[x!="000"]) return(x) } "nallel" <- function(x) { l0 <- length(x) if (any(x=="000")) return(l0-1) return(l0) } vec2 <- unlist(lapply(all.util, nallel)) names(vec2) <- names(all.util) # vec2 est le vecteur du nombre d'allèles observés par locus all.names <- unlist(lapply(all.util, polymor)) # all.names contient les nomds des alleles sans "000" loc.blocks <- unlist(lapply(all.util, nallel)) names(loc.blocks) <- names(all.util) all.names <- unlist(lapply(all.util, polymor)) w1 <- rep(loc.codes,loc.blocks) w2 <- unlist(lapply(loc.blocks, function(n) codred(".",n))) all.codes <- paste(w1,w2,sep="") all.names <- paste(rep(loc.names, loc.blocks),all.names,sep=".") names(all.names) <- all.codes # all.names est le nouveau nom des allèles w1 <- as.factor(w1) names(w1) <- all.codes loc.fac <- w1 "manq"<- function(x) { if (any(x=="000")) return(TRUE) return(FALSE) } missingdata <- unlist(lapply(all.util, manq)) "enumindiv" <- function (x) { x <- as.character(x) n <- length(x) w1 <- substr(x, 1, 3) w2 <- substr(x, 4, 6) "funloc1" <- function (k) { w0 <- rep(0,length(all.util[[k]])) names(w0) <- all.util[[k]] w0[w1[k]] <- w0[w1[k]]+1 w0[w2[k]] <- w0[w2[k]]+1 # ce locus n'a pas de données manquantes if (!missingdata[k]) return(w0) # ce locus a des données manquantes mais pas cet individu if (w0["000"]==0) return(w0[names(w0)!="000"]) #cet individus a deux données manquantes if (w0["000"]==2) { w0 <- rep(NA, length(w0)-1) return(w0) } # il doit y avoir une seule donnée manquante stop( paste("a1 =",w1[k],"a2 =",w2[k], "Non implemented case")) } w <- as.numeric(unlist(lapply(1:n, funloc1))) return(w) } ind.all <- apply(X,1,enumindiv) ind.all <- data.frame(t(ind.all)) names(ind.all) <- all.names nind <- nrow(ind.all) # ind.all contient un tableau individus - alleles codé # ******* pour NA pour les manquants # 010010 pour les hétérozygotes # 000200 pour les homozygotes all.som <- apply(ind.all,2,function(x) sum(na.omit(x))) #all.som contient le nombre d'allèles présents par forme allélique names(all.som) = all.names center <- split(all.som, loc.fac) center <- lapply(center, function(x) 2*x/sum(x)) center <- unlist(center) names(center) <- all.codes "modifier" <- function (x) { x[is.na(x)]=center[is.na(x)] return(x/2) } ind.all <- t(apply(ind.all, 1, modifier)) ind.all <- as.data.frame(ind.all) names(ind.all) <- all.codes attr(ind.all,"col.blocks") <- vec2 attr(ind.all,"all.names") <- all.names attr(ind.all,"loc.names") <- loc.names attr(ind.all,"row.w") <- rep(1/nind, nind) attr(ind.all,"col.freq") <- center/2 attr(ind.all,"col.num") <- as.factor(rep(loc.names,vec2)) return(ind.all) } "char2genet" <- function(X,pop,complete=FALSE) { .Deprecated(new="char2genet", package="ade4", msg="This function is now deprecated. Please use the 'df2genind' and 'genind2genpop' functions in the 'adegenet' package.") if (!inherits(X, "data.frame")) stop ("X is not a data.frame") if (!is.factor(pop)) stop("pop is not a factor") nind <- length(pop) if (nrow(X) != nind) stop ("pop & X have non convenient dimension") # tri des lignes par ordre alphabétique des noms de population # tri par ordre alphabétique des noms de loci X <- X[order(pop),] X <- X[,sort(names(X))] pop <- sort(pop) # comme pop[order(pop)] #################################################################################### "codred" <- function(base, n) { # fonction qui fait des codes de noms ordonnés par ordre # alphabétique de longueur constante le plus simples possibles # base est une chaîne de charactères, n le nombre qu'on veut w <- as.character(1:n) max0 <- max(nchar(w)) "fun1" <- function(x) while ( nchar(w[x]) < max0) w[x] <<- paste("0",w[x],sep="") lapply(1:n, fun1) return(paste(base,w,sep="")) } #################################################################################### # Ce qui touche aux populations npop <- nlevels(pop) pop.names <- as.character(levels(pop)) pop.codes <- codred("P", npop) names(pop.names) <- pop.codes levels(pop) <- pop.codes #################################################################################### # Ce qui touche aux individus nind <- nrow(X) ind.names <- row.names(X) ind.codes <- codred("", nind) names(ind.names) <- ind.codes ################################################################################### # ce qui touche au loci loc.names <- names(X) nloc <- ncol(X) loc.codes <- codred("L",nloc) names(loc.names) <- loc.codes names(X) <- loc.codes "cha6car" <- function(cha) { # pour compléter les chaînes de caratères par des zéros devant n0 <- nchar(cha) if (n0 == 6) return (cha) if (n0 >6) stop ("More than 6 characters") cha = paste("0",cha,sep="") cha = cha6car(cha) } X <- as.data.frame(apply(X,c(1,2),cha6car)) # Toutes les chaînes sont de 6 charactères suppose que le codage est complet # ou qu'il ne manque des zéros qu'au début "enumallel" <- function (x) { w <- as.character(x) w1 <- substr(w,1,3) w2 <- substr(w,4,6) w3 <- sort(unique (c(w1,w2))) return(w3) } all.util <- lapply(X,enumallel) # all.util est une liste dont les composantes sont les noms des allèles ordonnés # Correction d'un bug mis en evidence par Amalia # amalia@mail.imsdd.meb.uni-bonn.de # La liste etait automatiquement une matrice quand le nombre d'allele par locus est constant # peut comprendre 000 pour un non typé # on conserve le nombre d'individus typés par locus et par populations "compter" <- function(x) { num0 <- x!="000000" num0 <- split(num0,pop) num0 <- as.numeric(unlist(lapply(num0,sum))) return(num0) } Z <- unlist(apply(X,2, compter)) Z <- data.frame(matrix(Z,ncol=nloc)) names(Z) <- loc.codes row.names(Z) <- pop.codes # Z est un data.frame populations-locus des effectifs d'individus ind.full <- apply(X,1,function (x) !any(x == "000000")) "polymor" <- function(x) { if (any(x=="000")) return(x[x!="000"]) return(x) } "nallel" <- function(x) { l0 <- length(x) if (any(x=="000")) return(l0-1) return(l0) } loc.blocks <- unlist(lapply(all.util, nallel)) names(loc.blocks) <- names(all.util) all.names <- unlist(lapply(all.util, polymor)) w1 <- rep(loc.codes,loc.blocks) w2 <- unlist(lapply(loc.blocks, function(n) codred(".",n))) all.codes <- paste(w1,w2,sep="") all.names <- paste(rep(loc.names, loc.blocks),all.names,sep=".") names(all.names) <- all.codes w1 <- as.factor(w1) names(w1) <- all.codes loc.fac <- w1 "manq"<- function(x) { if (any(x=="000")) return(TRUE) return(FALSE) } missingdata <- unlist(lapply(all.util, manq)) "enumindiv" <- function (x) { x <- as.character(x) n <- length(x) w1 <- substr(x, 1, 3) w2 <- substr(x, 4, 6) "funloc1" <- function (k) { w0 <- rep(0,length(all.util[[k]])) names(w0) <- all.util[[k]] w0[w1[k]] <- w0[w1[k]]+1 w0[w2[k]] <- w0[w2[k]]+1 # ce locus n'a pas de données manquantes if (!missingdata[k]) return(w0) # ce locus a des données manquantes mais pas cet individu if (w0["000"]==0) return(w0[names(w0)!="000"]) #cet individus a deux données manquantes if (w0["000"]==2) { w0 <- rep(NA, length(w0)-1) return(w0) } # il doit y avoir une seule donnée manquante stop( paste("a1 =",w1[k],"a2 =",w2[k], "Non implemented case")) } w <- as.numeric(unlist(lapply(1:n, funloc1))) return(w) } ind.all <- apply(X,1,enumindiv) ind.all <- data.frame(t(ind.all)) names(ind.all) <- all.codes nallels <- length(all.codes) # ind.all contient un tableau individus - alleles codé # ******* pour NA pour les manquants # 010010 pour les hétérozygotes # 000200 pour les homozygotes ind.all <- split(ind.all, pop) "remplacer" <- function (a,b) { if (all(!is.na(a))) return(a) if (all(is.na(a))) return(b) a[is.na(a)] <- b[is.na(a)] return(a) } "sommer"<- function (x){ apply(x,2,function(x) sum(na.omit(x))) } all.pop <- matrix(unlist(lapply(ind.all,sommer)),nrow = nallels) all.pop = as.data.frame(all.pop) names(all.pop) <- pop.codes row.names(all.pop) <- all.codes center <- apply(all.pop,1,sum) center <- split(center, loc.fac) center <- unlist(lapply(center, function(x) x/sum(x))) names(center) <- all.codes "completer" <- function (x) { moy0 <- apply(x,2,mean, na.rm=TRUE) y <- apply(x, 1, function(a) remplacer(a,moy0)) return(y/2) } ind.all <- lapply(ind.all, completer) res <- list() pop.all <- unlist(lapply(ind.all,function(x) apply(x,1,mean))) pop.all <- matrix(pop.all, ncol=nallels, byrow=TRUE) pop.all <- data.frame(pop.all) names(pop.all) <- all.codes row.names(pop.all) <- pop.codes # 1) tableau de fréquences alléliques popualations-lignes # allèles-colonnes indispensable pour la classe genet res$tab <- pop.all # 2) marge du précédent calculé sur l'ensemble des individus typés par locus res$center <- center # 3) noms des populations renumérotées P001 ... P999 # le vecteur contient les noms d'origine res$pop.names <- pop.names # 4) noms des allèles recodé L01.1, L01.2, ... # le vecteurs contient les noms d'origine. res$all.names <- all.names # 5) le vecteur du nombre d'allèles par loci res$loc.blocks <- loc.blocks # 6) le facteur répartissant les allèles par loci res$loc.fac <- loc.fac # 7) noms des loci renumérotées L01 ... L99 # le vecteur contient les noms d'origine res$loc.names <- loc.names # 8) le nombre de gènes qui ont permis les calculs de fréquences res$pop.loc <- Z # 9) le nombre d'occurences de chaque forme allélique dans chaque population # allèles eln lignes, populations en colonnes res$all.pop <- all.pop ####################################################### if (complete) { n0 <- length(all.codes) # nrow(ind.all[[1]]) ind.all <- unlist(ind.all) ind.all <- matrix(ind.all, ncol=n0, byrow=TRUE) ind.all <- data.frame(ind.all) ind.all <- ind.all[ind.full,] pop.red <- pop[ind.full] names(ind.all) <- all.codes row.names(ind.all) <- ind.codes[ind.full] ind.all <- 2*ind.all # ind.all <- split(ind.all,pop.red) # ind.all <- lapply(ind.all,t) # 10) les typages d'individus complets # ind.all est une liste de matrices allèles-individus # ne contenant que les individus complètement typés # avec le codage 02000 ou 01001 res$comp <- ind.all res$comp.pop <- pop.red } class(res) <- c("genet", "list") return(res) } "count2genet" <- function (PopAllCount) { .Deprecated(new="count2genet", package="ade4", msg="This function is now deprecated. Please use the 'df2genind' and 'genind2genpop' functions in the 'adegenet' package.") # PopAllCount est un data.frame qui contient des dénombrements #################################################################################### "codred" <- function(base, n) { # fonction qui fait des codes de noms ordonnés par ordre # alphabétique de longueur constante le plus simples possibles # base est une chaîne de charactères, n le nombre qu'on veut w <- as.character(1:n) max0 <- max(nchar(w)) "fun1" <- function(x) while ( nchar(w[x]) < max0) w[x] <<- paste("0",x,sep="") lapply(1:n, fun1) return(paste(base,w,sep="")) } if (!inherits(PopAllCount,"data.frame")) stop ("data frame expected") if (!all(apply(PopAllCount,2,function(x) all(x==as.integer(x))))) stop("For integer values only") PopAllCount <- PopAllCount[sort(row.names(PopAllCount)),] PopAllCount <- PopAllCount[,sort(names(PopAllCount))] npop <- nrow(PopAllCount) w1 <- strsplit(names(PopAllCount),"[.]") loc.fac <- as.factor(unlist(lapply(w1, function(x) x[1]))) loc.blocks <- as.numeric(table(loc.fac)) nloc <- nlevels(loc.fac) loc.names <- as.character(levels(loc.fac)) pop.codes <- codred("P", npop) loc.codes <- codred("L",nloc) names(loc.blocks) <- loc.codes pop.names <- row.names(PopAllCount) names(pop.names) <- pop.codes w1 <- rep(loc.codes,loc.blocks) w2 <- unlist(lapply(loc.blocks, function(n) codred(".",n))) all.codes <- paste(w1,w2,sep="") all.names <- names(PopAllCount) names(all.names) <- all.codes names(loc.names) <- loc.codes all.pop <- as.data.frame(t(PopAllCount)) names(all.pop) <- pop.codes row.names(all.pop) <- all.codes center <- apply(all.pop,1,sum) center <- split(center,loc.fac) center <- unlist(lapply(center, function(x) x/sum(x))) names(center) <- all.codes PopAllCount <- split(all.pop,loc.fac) "pourcent" <- function(x) { x <- t(x) w <- apply(x,1,sum) w[w==0] <- 1 x <- x/w return(x) # retourne un tableau populations-allèles } PopAllCount <- lapply(PopAllCount,pourcent) tab <- data.frame(provi=rep(1,npop)) lapply(PopAllCount, function(x) tab <<- cbind.data.frame(tab,x)) tab <- tab[,-1] names(tab) <- all.codes row.names(tab) <- pop.codes res <- list() res$tab <- tab res$center <- center res$pop.names <- pop.names res$all.names <- all.names res$loc.blocks <- loc.blocks res$loc.fac <- loc.fac res$loc.names <- loc.names res$pop.loc <- NULL res$all.pop <- all.pop res$complet <- NULL class(res) <- c("genet","list") return(res) } "freq2genet" <- function (PopAllFreq) { .Deprecated(new="freq2genet", package="ade4", msg="This function is now deprecated. Please use the 'df2genind' and 'genind2genpop' functions in the 'adegenet' package.") # PopAllFreq est un data.frame qui contient des fréquences alléliques #################################################################################### "codred" <- function(base, n) { # fonction qui fait des codes de noms ordonnés par ordre # alphabétique de longueur constante le plus simples possibles # base est une chaîne de charactères, n le nombre qu'on veut w <- as.character(1:n) max0 <- max(nchar(w)) nformat <- paste("%0",max0,"i",sep="") "fun1" <- function(x) w[x] <<- sprintf(nformat,x) # "fun1" <- function(x) while ( nchar(w[x]) < max0) w[x] <<- paste("0",x,sep="") lapply(1:n, fun1) return(paste(base,w,sep="")) } if (!inherits(PopAllFreq,"data.frame")) stop ("data frame expected") if (!all(apply(PopAllFreq,2,function(x) all(x>=0)))) stop("Data >= 0 expected") if (!all(apply(PopAllFreq,2,function(x) all(x<=1)))) stop("Data <= 1 expected") PopAllFreq <- PopAllFreq[sort(row.names(PopAllFreq)),] PopAllFreq <- PopAllFreq[,sort(names(PopAllFreq))] npop <- nrow(PopAllFreq) w1 <- strsplit(names(PopAllFreq),"[.]") loc.fac <- as.factor(unlist(lapply(w1, function(x) x[1]))) loc.blocks <- as.numeric(table(loc.fac)) nloc <- nlevels(loc.fac) loc.names <- as.character(levels(loc.fac)) pop.codes <- codred("P", npop) loc.codes <- codred("L",nloc) names(loc.blocks) <- loc.codes pop.names <- row.names(PopAllFreq) names(pop.names) <- pop.codes w1 <- rep(loc.codes,loc.blocks) w2 <- unlist(lapply(loc.blocks, function(n) codred(".",n))) all.codes <- paste(w1,w2,sep="") all.names <- names(PopAllFreq) names(all.names) <- all.codes names(loc.names) <- loc.codes all.pop <- as.data.frame(t(PopAllFreq)) names(all.pop) <- pop.codes row.names(all.pop) <- all.codes center <- apply(all.pop,1,mean) center <- split(center,loc.fac) center <- unlist(lapply(center, function(x) x/sum(x))) names(center) <- all.codes PopAllFreq <- split(all.pop,loc.fac) "pourcent" <- function(x) { x <- t(x) w <- apply(x,1,sum) w[w==0] <- 1 x <- x/w return(x) # retourne un tableau populations-allèles } PopAllFreq <- lapply(PopAllFreq,pourcent) tab <- data.frame(provi=rep(1,npop)) lapply(PopAllFreq, function(x) tab <<- cbind.data.frame(tab,x)) tab <- tab[,-1] names(tab) <- all.codes row.names(tab) <- pop.codes res <- list() res$tab <- tab res$center <- center res$pop.names <- pop.names res$all.names <- all.names res$loc.blocks <- loc.blocks res$loc.fac <- loc.fac res$loc.names <- loc.names res$pop.loc <- NULL res$all.pop <- all.pop res$complet <- NULL class(res) <- c("genet","list") return(res) }ade4/R/neig.R0000644000176200001440000001543412576021756012357 0ustar liggesusers"neig" <- function (list = NULL, mat01 = NULL, edges = NULL, n.line = NULL, n.circle = NULL, area = NULL) { if (!is.null(list)) { n <- length(list) output <- matrix(0, n, n) for (i in 1:n) { w <- list[[i]] if (length(w) > 0) output[i, w] <- 1 } output <- output + t(output) output <- 1 * (output > 0) w.output <- as.vector(apply(output, 1, sum)) names(w.output) <- as.character(1:n) if (!is.null(attr(list, "region.id"))) names(w.output) <- attr(list, "region.id") output <- neig.util.GtoL(output) } else if (!is.null(mat01)) { output <- neig.util.GtoL(mat01) w.output <- as.vector(apply(mat01, 1, sum)) if (!is.null(rownames(mat01))) names(w.output) <- rownames(mat01) else if (!is.null(colnames(mat01))) names(w.output) <- colnames(mat01) else names(w.output) <- as.character(1:(nrow(mat01))) } else if (!is.null(edges)) { output <- edges G <- neig.util.LtoG(edges) w.output <- as.vector(apply(G, 1, sum)) names(w.output) <- as.character(1:length(w.output)) } else if (!is.null(n.line)) { output <- cbind(1:(n.line - 1), 2:n.line) G <- neig.util.LtoG(output) w.output <- as.vector(apply(G, 1, sum)) names(w.output) <- as.character(1:n.line) } else if (!is.null(n.circle)) { output <- cbind(1:(n.circle - 1), 2:n.circle) output <- rbind(output, c(n.circle, 1)) G <- neig.util.LtoG(output) w.output <- as.vector(apply(G, 1, sum)) names(w.output) <- as.character(1:n.circle) } else if (!is.null(area)) { fac <- area[, 1] levpoly <- unique(fac) npoly <- length(levpoly) ng1 <- 0 ng2 <- 0 k <- 0 for (i in 1:(npoly - 1)) { t1poly <- paste(area[fac == levpoly[i], 2], area[fac == levpoly[i], 3], sep = "000") for (j in (i + 1):npoly) { t2poly <- paste(area[fac == levpoly[j], 2], area[fac == levpoly[j], 3], sep = "000") if (any(t1poly %in% t2poly)) { k <- k + 1 ng1[k] <- i ng2[k] <- j } } } output <- cbind(ng1, ng2) G <- neig.util.LtoG(output) w.output <- as.vector(apply(G, 1, sum)) names(w.output) <- as.character(levpoly) } attr(output, "degrees") <- w.output attr(output, "call") <- match.call() class(output) <- "neig" output } "nb2neig" <- function (nb) { if (!inherits(nb, "nb")) stop("Non convenient data") res <- neig(list = nb) w <- attr(nb, "region.id") if (is.null(w)) w <- as.character(1:length(nb)) names(attr(res, "degrees")) <- w return(res) } "neig2nb" <- function (neig) { if (!inherits(neig, "neig")) stop("Non convenient data") w1 <- attr(neig, "degrees") n <- length(w1) region.id <- names(w1) if (is.null(region.id)) region.id <- as.character(1:n) G <- neig.util.LtoG(neig) res <- split(G, row(G)) res <- lapply(res, function(x) which(x > 0)) attr(res, "region.id") <- region.id attr(res, "gal") <- FALSE attr(res, "call") <- match.call() class(res) <- "nb" return(res) } "neig2mat" <- function (neig) { # synonyme de neig.util.GtoL plus simple de mémorisation # donne la matrice d'incidence sommet-sommet en 0-1 if (!inherits(neig,"neig")) stop ("Object 'neig' expected") deg <- attr(neig, "degrees") n <- length(deg) labels <- names(deg) neig <- unclass(neig) G <- matrix(0, n, n) for (i in 1:n) { w <- neig[neig[, 1] == i, 2] if (length(w) > 0) G[i, w] <- 1 } G <- G + t(G) G <- 1 * (G > 0) if (is.null(labels)) labels <- paste("P",1:n,sep="") dimnames(G) <- list(labels,labels) return(G) } "neig.util.GtoL" <- function (G) { G <- as.matrix(G) n <- nrow(G) if (ncol(G) != n) stop("Square matrix expected") # modif du any samedi, mai 31, 2003 at 16:19 if (any(t(G) != G)) stop("Symetric matrix expected") if (sum(G == 0 | G == 1) != n * n) stop("0-1 values expected") if (sum(diag(G) != 0)) stop("Null diagonal expected") G <- G * (row(G) < col(G)) G <- (row(G) + 0 + (0+1i) * col(G)) * G G <- as.vector(G) G <- G[G != 0] G <- cbind(Re(G), Im(G)) return(G) } "neig.util.LtoG" <- function (L, n = max(L)) { L <- unclass(L) if (ncol(L) != 2) stop("two col expected") no.is.int <- function(x) x != as.integer(x) if (any(apply(L, c(1, 2), no.is.int))) stop("Non integer value found") if (n < max(L)) stop("Non convenient 'n' parameter") G <- matrix(0, n, n) for (i in 1:n) { w <- L[L[, 1] == i, 2] if (length(w) > 0) G[i, w] <- 1 } G <- G + t(G) G <- 1 * (G > 0) return(G) } "print.neig" <- function (x, ...) { deg <- attr(x, "degrees") n <- length(deg) labels <- names(deg) df <- neig.util.LtoG(x) for (i in 1:n) { w <- c(".", "1")[df[i, 1:i] + 1] cat(labels[i], " ", w, "\n", sep = "") } invisible(df) } "summary.neig" <- function (object, ...) { cat("Neigbourhood undirected graph\n") deg <- attr(object, "degrees") size <- length(deg) cat("Vertices:", size, "\n") cat("Degrees:", deg, "\n") m <- sum(deg)/2 cat("Edges (pairs of vertices):", m, "\n") } "scores.neig" <- function (obj) { tol <- 1e-07 if (!inherits(obj, "neig")) stop("Object of class 'neig' expected") b0 <- neig.util.LtoG(obj) deg <- attr(obj, "degrees") m <- sum(deg) n <- length(deg) b0 <- -b0/m + diag(deg)/m # b0 est la matrice D-P eig <- eigen (b0, symmetric = TRUE) w0 <- abs(eig$values)/max(abs(eig$values)) w0 <- which(w01) { # on ajoute le vecteur dérivé de 1n w <- cbind(rep(1,n),eig$vectors[,w0]) # on orthonormalise l'ensemble w <- qr.Q(qr(w)) # on met les valeurs propres à 0 eig$values[w0] <- 0 # on remplace les vecteurs du noyau par une base orthonormée contenant # en première position le parasite eig$vectors[,w0] <- w[,-ncol(w)] # on enlève la position du parasite w0 <- (1:n)[-w0[1]] } w0=rev(w0) rank <- length(w0) values <- n-eig$values[w0]*n eig <- eig$vectors[,w0]*sqrt(n) eig <- data.frame(eig) row.names(eig) <- names(deg) names(eig) <- paste("V",1:rank,sep="") attr(eig,"values")<-values eig } ade4/R/summary.4thcorner.R0000644000176200001440000000247712576021756015044 0ustar liggesusers"summary.4thcorner" <- function(object,...){ cat("Fourth-corner Statistics\n") cat("------------------------\n") cat("Permutation method ",object$model," (",object$npermut," permutations)\n") if(inherits(object, "4thcorner.rlq")){ cat("trRLQ statistic","\n\n") cat("---\n\n") print(object$trRLQ) } else { cat("\nAdjustment method for multiple comparisons: ", object$tabG$adj.method, "\n") xrand <- object$tabG sumry <- list(Test = xrand$names, Stat= xrand$statnames, Obs = xrand$obs, Std.Obs = xrand$expvar[, 1], Alter = xrand$alter) sumry <- as.matrix(as.data.frame(sumry)) if (any(xrand$rep[1] != xrand$rep)) { sumry <- cbind(sumry[, 1:4], N.perm = xrand$rep) } sumry <- cbind(sumry, Pvalue = format.pval(xrand$pvalue)) if (xrand$adj.method != "none") { sumry <- cbind(sumry, Pvalue.adj = format.pval(xrand$adj.pvalue)) } signifpval <- symnum(xrand$adj.pvalue, corr = FALSE, na = FALSE, cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1), symbols = c("***", "**", "*", ".", " ")) sumry <- cbind(sumry,signifpval) colnames(sumry)[ncol(sumry)] <- " " rownames(sumry) <- 1:nrow(sumry) print(sumry, quote = FALSE, right = TRUE) cat("\n---\nSignif. codes: ", attr(signifpval, "legend"), "\n") invisible(sumry) } } ade4/R/dudi.coa.R0000644000176200001440000000150213252237303013077 0ustar liggesusers"dudi.coa" <- function (df, scannf = TRUE, nf = 2) { df <- data.matrix(df) storage.mode(df) <- "double" df <- as.data.frame(df) if (!is.data.frame(df)) stop("data.frame expected") if (any(df < 0)) stop("negative entries in table") if ((N <- sum(df)) == 0) stop("all frequencies are zero") df <- df/N row.w <- apply(df, 1, sum) col.w <- apply(df, 2, sum) df <- df/row.w df <- sweep(df, 2, col.w, "/") - 1 if (any(is.na(df))) { fun1 <- function(x) { if (is.na(x)) return(0) else return(x) } df <- apply(df, c(1, 2), fun1) df <- data.frame(df) } X <- as.dudi(df, col.w, row.w, scannf = scannf, nf = nf, call = match.call(), type = "coa") X$N <- N return(X) } ade4/R/scalewt.R0000644000176200001440000001171312576022342013063 0ustar liggesusersvarwt <- function(x, wt, na.rm = FALSE) { ## compute weighted biased (divided by n) variance if (na.rm) { wt <- wt[i <- !is.na(x)] x <- x[i] } sum.wt <- sum(wt) mean.wt <- sum(x * wt) / sum(wt) res <- sum(wt * (x - mean.wt)^2, na.rm = na.rm) / sum.wt return(res) } covwt <- function(x, wt, na.rm = FALSE) { ## compute weighted biased (divided by n) covariance matrix x <- as.matrix(x) if (na.rm) { x <- na.omit(x) wt <- wt[- attr(x,"na.action")] } wt <- wt / sum(wt) mean.x <- colSums(wt * x) x <- sqrt(wt) * sweep(x, 2, mean.x, FUN = "-", check.margin = FALSE) res <- crossprod(x) / sum(wt) return(res) } scalewt <- function (df, wt = rep(1/nrow(df), nrow(df)), center = TRUE, scale = TRUE) { df <- as.matrix(df) mean.df <- FALSE if(center){ mean.df <- apply(df, 2, weighted.mean, w = wt) df <- sweep(df, 2, mean.df, "-") } var.df <- FALSE if(scale){ f <- function(x, w) sum(w * x^2) / sum(w) var.df <- apply(df, 2, f, w = wt) temp <- var.df < 1e-14 if (any(temp)) { warning("Variables with null variance not standardized.") var.df[temp] <- 1 } var.df <- sqrt(var.df) df <- sweep(df, 2, var.df, "/") } if (is.numeric(mean.df)) attr(df, "scaled:center") <- mean.df if (is.numeric(var.df)) attr(df, "scaled:scale") <- var.df return(df) } meanfacwt <- function(df, fac = NULL, wt = rep(1/nrow(df), nrow(df)), drop = FALSE) { ## return res: rows are groups, columns variables df <- data.frame(df) if(identical(all.equal(wt, rep(1 / nrow(df), nrow(df))), TRUE)) { ## uniform weights if(is.null(fac)) { ## no factor res <- colMeans(df) } else { fac <- as.factor(fac) if(drop) fac <- factor(fac) res <- t(sapply(split(df,fac),colMeans)) } } else { if(is.null(fac)) { ## no factor res <- apply(df, 2, weighted.mean, w = wt) } else { fac <- as.factor(fac) if(drop) fac <- factor(fac) df.list <- split(df, fac) wt.list <- split(wt, fac) if(ncol(df) > 1) res <- t(sapply(1:nlevels(fac), function(x) apply(df.list[[x]], 2, weighted.mean, w = wt.list[[x]]))) else res <- as.matrix(sapply(1:nlevels(fac), function(x) apply(df.list[[x]], 2, weighted.mean, w = wt.list[[x]]))) rownames(res) <- names(df.list) } } return(res) } covfacwt <- function(df, fac = NULL, wt = rep(1/nrow(df), nrow(df)), drop = FALSE) { df <- data.frame(df) nr <- nrow(df) if(identical(all.equal(wt, rep(1/nrow(df), nrow(df))), TRUE)) { ## uniform weights if(is.null(fac)) { ## no factor res <- cov(df) * (nr - 1) / nr } else { fac <- as.factor(fac) if(drop) fac <- factor(fac) ## to drop unused levels res <- lapply(split(df,fac), function(x) cov(x) * (nrow(x) - 1) / nrow(x)) } } else { if(is.null(fac)) {## no factor res <- covwt(df, wt = wt) } else { fac <- as.factor(fac) if(drop) fac <- factor(fac) df.list <- split(df, fac) wt.list <- split(wt, fac) res <- lapply(1:nlevels(fac), function(x) covwt(df.list[[x]], wt = wt.list[[x]])) names(res) <- names(df.list) } } return(res) ## liste, matrix var/covar, 1 element=1 group (order according to levels(fac)) } ## attention works only with data.frame or matrix varfacwt <- function(df, fac = NULL, wt = rep(1 / nrow(df), nrow(df)), drop = FALSE) { df <- data.frame(df) nr <- nrow(df) if(identical(all.equal(wt, rep(1 / nrow(df), nrow(df))), TRUE)) { ## uniform weights if(is.null(fac)) { ## no factor res <- apply(df, 2, var) * (nr - 1) / nr } else { fac <- as.factor(fac) if(drop) fac <- factor(fac) df.list <- split(df, fac) res <- t(sapply(1:nlevels(fac), FUN = function(x) {apply(df.list[[x]], 2, function(y) var(y) * (NROW(y) - 1) / NROW(y))})) } } else { if(is.null(fac)) { ## no factor res <- apply(df, 2, varwt, wt = wt) } else { fac <- as.factor(fac) if(drop) fac <- factor(fac) df.list <- split(df, fac) wt.list <- split(wt, fac) res <- t(sapply(1:nlevels(fac), FUN = function(x) {apply(df.list[[x]], 2, varwt, wt = wt.list[[x]])})) rownames(res) <- names(df.list) } } return(res) } scalefacwt <- function(df, fac = NULL, wt = rep(1 / nrow(df), nrow(df)), scale = TRUE, drop = FALSE) { mean.df <- meanfacwt(df = df, fac = fac, wt = wt) if(scale) var.df <- varfacwt(df = df, fac = fac, wt = wt) else var.df <- FALSE if(is.null(fac)) res <- scale(df, scale = sqrt(var.df), center = mean.df) else { fac <- as.factor(fac) if(drop) fac <- factor(fac) df.list <- split(df, fac) res <- lapply(1:nlevels(fac), function(x) as.data.frame(scale(df.list[[x]], scale = ifelse(scale, sqrt(var.df[x,]), FALSE), center = mean.df[x,]))) res <- unsplit(res,fac) } return(res) } ade4/R/sco.gauss.R0000644000176200001440000000451112576021756013334 0ustar liggesusers################################ # Gauss curves on score categories ################################ # Takes one vector containing quantitative values and one dataframe of factors # giving categories to wich these values belong. Computes the mean and variance # of the values in each category for each factor, and draws a Gauss curve with # the same mean and variance for each category and each factor. # Can optionaly set the start and end point of the curves (xlim) and the number # of segments. ################################ "sco.gauss" <- function(score, df, xlim = NULL, steps = 200, ymax = NULL, sub = names(df), csub = 1.25, possub = "topleft", legen = TRUE, label = row.names(df), clabel = 1, grid = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0,0) ) { if (!is.vector(score)) stop("score should be a vector") if (!is.numeric(score)) stop("score should be numeric") if (!is.data.frame(df)) stop("df should be a data.frame") if (nrow(df) != length(score)) stop("Wrong dimensions for df and score") if (!all(unlist(lapply(df, is.factor)))) stop("All variables in df must be factors") opar <- par(mar = par("mar"), mfrow = par("mfrow")) on.exit(par(opar)) par(mar=rep(0.1, 4)) nfig <- ncol(df) par(mfrow = n2mfrow(nfig+1)) if (legen){ par(mfrow = n2mfrow(nfig+1)) sco.label(score = score, label = label, clabel = clabel, grid = grid, cgrid = cgrid, include.origin = include.origin, origin = origin ) } else { par(mfrow = n2mfrow(nfig)) } for (i in 1:nfig) { res <- scatterutil.sco(score = score, lim = xlim, grid = grid, cgrid = cgrid, include.origin = include.origin, origin = origin, sub = sub[i], csub = csub, horizontal = TRUE, reverse = FALSE) nlevs <- nlevels(df[,i]) means <- by(score, df[,i], mean) sds <- by(score, df[,i], sd) xi <- seq(res[1], res[2], by=(res[2]-res[1])/steps) yi <- lapply(1:nlevs,function(x) dnorm(xi, means[[x]], sds[[x]])) if(is.null(ymax)){ maxy <- (max(unlist(yi))) * 1.15 } else { maxy <- ymax } for (j in 1:nlevs) { lines(xi, yi[[j]] * (1 - res[3])/maxy + res[3]) xmaxi <- xi[which.max(yi[[j]])] ymaxi <- max(yi[[j]]) text(xmaxi, ymaxi * (1 - res[3])/maxy + res[3], levels(df[,i])[j], pos=3, offset=.2, cex=clabel * par("cex")) } } invisible(match.call()) } ade4/R/dist.prop.R0000644000176200001440000000516012576021756013352 0ustar liggesusers"dist.prop" <- function (df, method = NULL, diag = FALSE, upper = FALSE) { METHODS <- c("d1 Manly", "Overlap index Manly", "Rogers 1972", "Nei 1972", "Edwards 1971") if (!inherits(df, "data.frame")) stop("df is not a data.frame") if (any(df < 0)) stop("non negative value expected in df") dfs <- apply(df, 1, sum) if (any(dfs == 0)) stop("row with all zero value") df <- df/dfs if (is.null(method)) { cat("1 = d1 Manly\n") cat("d1 = Sum|p(i)-q(i)|/2\n") cat("2 = Overlap index Manly\n") cat("d2=1-Sum(p(i)q(i))/sqrt(Sum(p(i)^2)/sqrt(Sum(q(i)^2)\n") cat("3 = Rogers 1972 (one locus)\n") cat("d3=sqrt(0.5*Sum(p(i)-q(i)^2))\n") cat("4 = Nei 1972 (one locus)\n") cat("d4=-ln(Sum(p(i)q(i)/sqrt(Sum(p(i)^2)/sqrt(Sum(q(i)^2))\n") cat("5 = Edwards 1971 (one locus)\n") cat("d5= sqrt (1 - (Sum(sqrt(p(i)q(i))))\n") cat("Selec an integer (1-5): ") method <- as.integer(readLines(n = 1)) } nlig <- nrow(df) d <- matrix(0, nlig, nlig) d.names <- row.names(df) df <- as.matrix(df) fun1 <- function(x) { p <- df[x[1], ] q <- df[x[2], ] w <- sum(abs(p - q))/2 return(w) } fun2 <- function(x) { p <- df[x[1], ] q <- df[x[2], ] w <- 1 - sum(p * q)/sqrt(sum(p * p))/sqrt(sum(q * q)) return(w) } fun3 <- function(x) { p <- df[x[1], ] q <- df[x[2], ] w <- sqrt(0.5 * sum((p - q)^2)) return(w) } fun4 <- function(x) { p <- df[x[1], ] q <- df[x[2], ] if (sum(p * q) == 0) stop("sum(p*q)==0 -> non convenient data") w <- -log(sum(p * q)/sqrt(sum(p * p))/sqrt(sum(q * q))) return(w) } fun5 <- function(x) { p <- df[x[1], ] q <- df[x[2], ] w <- sqrt(1 - sum(sqrt(p * q))) return(w) } index <- cbind(col(d)[col(d) < row(d)], row(d)[col(d) < row(d)]) method <- method[1] if (method == 1) d <- unlist(apply(index, 1, fun1)) else if (method == 2) d <- unlist(apply(index, 1, fun2)) else if (method == 3) d <- unlist(apply(index, 1, fun3)) else if (method == 4) d <- unlist(apply(index, 1, fun4)) else if (method == 5) d <- unlist(apply(index, 1, fun5)) else stop("Non convenient method") attr(d, "Size") <- nlig attr(d, "Labels") <- d.names attr(d, "Diag") <- diag attr(d, "Upper") <- upper attr(d, "method") <- METHODS[method] attr(d, "call") <- match.call() class(d) <- "dist" return(d) } ade4/R/suprow.R0000644000176200001440000001357513252235102012760 0ustar liggesusers"suprow" <- function (x, ...) UseMethod("suprow") "predict.dudi" <- function(object, newdata, ...){ return(suprow(x = object, Xsup = newdata, ...)$lisup) } "suprow.coa" <- function (x, Xsup, ...) { Xsup <- data.frame(Xsup) if (!inherits(x, "dudi")) stop("Object of class 'dudi' expected") if (!inherits(x, "coa")) stop("Object of class 'coa' expected") if (!inherits(Xsup, "data.frame")) stop("Xsup is not a data.frame") if (ncol(Xsup) != ncol(x$tab)) stop("non convenient col numbers") lwsup <- apply(Xsup, 1, sum) lwsup[lwsup == 0] <- 1 Xsup <- sweep(Xsup, 1, lwsup, "/") coosup <- as.matrix(Xsup) %*% as.matrix(x$c1) coosup <- data.frame(coosup, row.names = row.names(Xsup)) names(coosup) <- names(x$li) # bug 25/11/2004 On reproduisait bien les coordonnées supplémentaires # mais pas les valeurs du tableau, donc pas de transferts possibles en inter-intra # voir fiche QR8 cwsup <- x$cw cwsup[cwsup == 0] <- 1 Xsup <- sweep(Xsup, 2, cwsup, "/") # le centrage n'est pas indispensable Xsup <- Xsup-1 Xsup[,cwsup == 1] <- 0 return(list(tabsup = Xsup, lisup = coosup)) } "suprow.dudi" <- function (x, Xsup, ...) { # modif pour Culhane, Aedin" # suprow renvoie une liste à deux éléments tabsup et lisup warning("The use of the 'suprow.dudi' method requires that the supplementary table has been transformed as the original table") Xsup <- data.frame(Xsup) if (!inherits(x, "dudi")) stop("Object of class 'dudi' expected") if (!inherits(Xsup, "data.frame")) stop("Xsup is not a data.frame") if (ncol(Xsup) != ncol(x$tab)) stop("non convenient col numbers") # bug 25/11/2004 vue par fiche QR8 coosup <- as.matrix(Xsup) %*% (as.matrix(x$c1) * x$cw) coosup <- data.frame(coosup, row.names = row.names(Xsup)) names(coosup) <- names(x$li) return(list(tabsup = Xsup, lisup = coosup)) } "suprow.pca" <- function (x, Xsup, ...) { Xsup <- data.frame(Xsup) if (!inherits(x, "dudi")) stop("Object of class 'dudi' expected") if (!inherits(x, "pca")) stop("Object of class 'pca' expected") if (!inherits(Xsup, "data.frame")) stop("Xsup is not a data.frame") if (ncol(Xsup) != ncol(x$tab)) stop("non convenient col numbers") f1 <- function(w) (w - x$cent)/x$norm Xsup <- t(apply(Xsup, 1, f1)) coosup <- as.matrix(Xsup) %*% (as.matrix(x$c1) * x$cw) coosup <- data.frame(coosup, row.names = row.names(Xsup)) names(coosup) <- names(x$li) return(list(tabsup = Xsup, lisup = coosup)) } "suprow.acm" <- function (x, Xsup, ...) { Xsup <- data.frame(Xsup) if (!inherits(x, "dudi")) stop("Object of class 'dudi' expected") if (!inherits(x, "acm")) stop("Object of class 'acm' expected") if (!inherits(Xsup, "data.frame")) stop("Xsup is not a data.frame") if (ncol(Xsup) != nrow(x$cr)) stop("non convenient col numbers") appel <- as.list(x$call) Xori <- as.data.frame(eval.parent(appel$df)) for(j in 1:ncol(Xsup)){ ## modify Xsup to ensure that factors have the same levels ## than the original table Xsup[,j] <- factor(Xsup[,j], levels = levels(Xori[,j])) if(any(is.na(Xsup[,j]))) stop(paste("the factor", names(Xsup)[j] ,"in Xsup contains unknown levels)")) } nvar <- ncol(Xsup) Xsup <- acm.disjonctif(Xsup) Xsup <- t(t(Xsup)/ (x$cw * nvar)) - 1 coosup <- Xsup %*% (as.matrix(x$c1) * x$cw) coosup <- data.frame(coosup, row.names = row.names(Xsup)) names(coosup) <- names(x$li) return(list(tabsup = Xsup, lisup = coosup)) } "suprow.mix" <- function (x, Xsup, ...) { Xsup <- data.frame(Xsup) appel <- as.list(x$call) if (!inherits(x, "dudi")) stop("Object of class 'dudi' expected") if (!inherits(x, "mix")) stop("Object of class 'mix' expected") if (appel[[1]] != "dudi.hillsmith") stop("Not yet implemented for 'dudi.mix'. Please use 'dudi.hillsmith'.") if (!inherits(Xsup, "data.frame")) stop("Xsup is not a data.frame") if (ncol(Xsup) != nrow(x$cr)) stop("non convenient col numbers") Xori <- as.data.frame(eval.parent(appel$df)) res <- matrix(0, nrow(Xsup), 1) for(j in 1:ncol(Xsup)){ if (x$index[j] == "q") { var.tmp <- scale(Xsup[,j], scale = x$norm[j], center = x$center[j]) res <- cbind(res, var.tmp) } else if(x$index[j] == "f"){ ## modify Xsup to ensure that factors have the same levels ## than the original table Xsup[,j] <- factor(Xsup[,j], levels = levels(factor(Xori[,j]))) if(any(is.na(Xsup[,j]))) stop(paste("the factor", names(Xsup)[j] ,"in Xsup contains unknown levels)")) var.tmp <- fac2disj(Xsup[, j], drop = FALSE) col.w <- x$cw[x$assign == j] var.tmp <- t(t(var.tmp)/col.w) - 1 res <- cbind(res, var.tmp) } } res <- res[,-1] coosup <- res %*% (as.matrix(x$c1) * x$cw) coosup <- data.frame(coosup, row.names = row.names(Xsup)) names(coosup) <- names(x$li) res <- data.frame(res, row.names = row.names(Xsup)) names(res) <- names(x$tab) return(list(tabsup = res, lisup = coosup)) } "suprow.fca" <- function (x, Xsup, ...) { Xsup <- data.frame(Xsup) if (!inherits(x, "dudi")) stop("Object of class 'dudi' expected") if (!inherits(x, "fca")) stop("Object of class 'fca' expected") if (ncol(Xsup) != ncol(x$tab)) stop("non convenient col numbers") Xsup <- sweep(Xsup, 2, length(x$blo)*x$cw, "/") - 1 coosup <- as.matrix(Xsup) %*% (as.matrix(x$c1) * x$cw) coosup <- data.frame(coosup, row.names = row.names(Xsup)) names(coosup) <- names(x$li) return(list(tabsup = Xsup, lisup = coosup)) }ade4/R/ktab.within.R0000644000176200001440000000254412576021756013655 0ustar liggesusers"ktab.within" <- function (dudiwit, rownames = NULL, colnames = NULL, tabnames = NULL) { if (!inherits(dudiwit, "within")) stop("Result from within expected for dudiwit") fac <- dudiwit$fac nblo <- nlevels(fac) res <- list() blocks <- rep(0, nblo) if (is.null(rownames)) rownames <- names(dudiwit$tab) else if (length(rownames) != length(names(dudiwit$tab))) stop("Non convenient rownames length") if (is.null(colnames)) colnames <- unlist(split(row.names(dudiwit$tab), fac)) else if (length(colnames) != length(row.names(dudiwit$tab))) stop("Non convenient colnames length") if (is.null(tabnames)) tabnames <- levels(fac) else if (length(tabnames) != nblo) stop("Non convenient tabnames length") cw <- NULL for (i in 1:nblo) { k <- levels(fac)[i] w1 <- dudiwit$lw[fac == k] w1 <- w1/sum(w1) cw <- c(cw, w1) res[[i]] <- data.frame(t(dudiwit$tab[fac == k, ])) blocks[i] <- ncol(res[[i]]) } names(blocks) <- tabnames res$lw <- dudiwit$cw res$cw <- cw res$blo <- blocks class(res) <- "ktab" row.names(res) <- rownames col.names(res) <- colnames tab.names(res) <- tabnames res <- ktab.util.addfactor(res) res$call <- match.call() res$tabw <- dudiwit$tabw return(res) } ade4/R/pcaivortho.R0000644000176200001440000000541012576021756013604 0ustar liggesusers"pcaivortho" <- function (dudi, df, scannf = TRUE, nf = 2) { lm.pcaiv <- function(x, df, weights, use) { if (!inherits(df, "data.frame")) stop("data.frame expected") reponse.generic <- x begin <- "reponse.generic ~ " fmla <- as.formula(paste(begin, paste(names(df), collapse = "+"))) df <- cbind.data.frame(reponse.generic, df) lm0 <- lm(fmla, data = df, weights = weights) if (use == 0) return(predict(lm0)) else if (use == 1) return(residuals(lm0)) else if (use == -1) return(lm0) else stop("Non convenient use") } if (!inherits(dudi, "dudi")) stop("dudi is not a 'dudi' object") df <- data.frame(df) if (!inherits(df, "data.frame")) stop("df is not a 'data.frame'") if (nrow(df) != length(dudi$lw)) stop("Non convenient dimensions") weights <- dudi$lw isfactor <- unlist(lapply(as.list(df), is.factor)) for (i in 1:ncol(df)) { if (!isfactor[i]) df[, i] <- scalewt(df[, i], weights) } tab <- data.frame(apply(dudi$tab, 2, lm.pcaiv, df = df, use = 1, weights = dudi$lw)) X <- as.dudi(tab, dudi$cw, dudi$lw, scannf = scannf, nf = nf, call = match.call(), type = "pcaivortho") X$X <- df X$Y <- dudi$tab U <- as.matrix(X$c1) * unlist(X$cw) U <- as.matrix(dudi$tab) %*% U U <- data.frame(U) row.names(U) <- row.names(dudi$tab) names(U) <- names(X$li) X$ls <- U U <- as.matrix(X$c1) * unlist(X$cw) U <- data.frame(t(as.matrix(dudi$c1)) %*% U) row.names(U) <- names(dudi$li) names(U) <- names(X$li) X$as <- U return(X) } summary.pcaivortho <- function(object, ...){ thetitle <- "Orthogonal principal component analysis with instrumental variables" cat(thetitle) cat("\n\n") NextMethod() appel <- as.list(object$call) dudi <- eval.parent(appel$dudi) cat(paste("Total unconstrained inertia (",deparse(appel$dudi),"): ", sep = "")) cat(signif(sum(dudi$eig), 4)) cat("\n\n") cat(paste("Inertia of" ,deparse(appel$dudi),"not explained by", deparse(appel$df), "(%): ")) cat(signif(sum(object$eig) / sum(dudi$eig) * 100, 4)) cat("\n\n") cat("Decomposition per axis:\n") sumry <- array(0, c(object$nf, 7), list(1:object$nf, c("iner", "inercum", "inerC", "inercumC", "ratio", "R2", "lambda"))) sumry[, 1] <- dudi$eig[1:object$nf] sumry[, 2] <- cumsum(dudi$eig[1:object$nf]) varpro <- apply(object$ls, 2, function(x) sum(x * x * object$lw)) sumry[, 3] <- varpro sumry[, 4] <- cumsum(varpro) sumry[, 5] <- cumsum(varpro)/cumsum(dudi$eig[1:object$nf]) sumry[, 6] <- object$eig[1:object$nf]/varpro sumry[, 7] <- object$eig[1:object$nf] print(sumry, digits = 3) invisible(sumry) } ade4/R/divc.R0000644000176200001440000000202012576021756012345 0ustar liggesusersdivc <- function(df, dis = NULL, scale = FALSE){ # checking of user's data and initialization. if (!inherits(df, "data.frame")) stop("Non convenient df") if (any(df < 0)) stop("Negative value in df") if (!is.null(dis)) { if (!inherits(dis, "dist")) stop("Object of class 'dist' expected for distance") if (!is.euclid(dis)) warning("Euclidean property is expected for distance") dis <- as.matrix(dis) if (nrow(df)!= nrow(dis)) stop("Non convenient df") dis <- as.dist(dis) } if (is.null(dis)) dis <- as.dist((matrix(1, nrow(df), nrow(df)) - diag(rep(1, nrow(df)))) * sqrt(2)) div <- as.data.frame(rep(0, ncol(df))) names(div) <- "diversity" rownames(div) <- names(df) for (i in 1:ncol(df)) { if(sum(df[, i]) < 1e-16) div[i, ] <- 0 else div[i, ] <- (t(df[, i]) %*% (as.matrix(dis)^2) %*% df[, i]) / 2 / (sum(df[, i])^2) } if(scale == TRUE){ divmax <- divcmax(dis)$value div <- div / divmax } return(div) } ade4/R/kplot.pta.R0000644000176200001440000000636212576021756013351 0ustar liggesusers"kplot.pta" <- function (object, xax = 1, yax = 2, which.tab = 1:nrow(object$RV), mfrow = NULL, which.graph = 1:4, clab = 1, cpoint = 2, csub = 2, possub = "bottomright", ask = par("ask"), ...) { if (!inherits(object, "pta")) stop("Object of type 'pta' expected") def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) show <- rep(FALSE, 4) if (!is.numeric(which.graph) || any(which.graph < 1) || any(which.graph > 4)) stop("`which' must be in 1:4") show[which.graph] <- TRUE if (is.null(mfrow)) { mfcol <- c(length(which.tab), length(which.graph)) par(mfcol = mfcol) } else par(mfrow = mfrow) par(ask = ask) if (show[1]) { for (ianal in which.tab) { coo2 <- object$Tax[object$T4[, 1] == levels(object$T4[,1])[ianal], c(xax, yax)] row.names(coo2) <- as.character(1:4) s.corcircle(coo2, clabel = clab, cgrid = 0, sub = row.names(object$RV)[ianal], csub = csub, possub = possub) } } if (show[2]) { par(mar = c(0.1, 0.1, 0.1, 0.1)) coo1 <- object$li[, c(xax, yax)] cootot <- object$Tli[, c(xax, yax)] names(cootot) <- names(coo1) coofull <- coo1 for (i in which.tab) coofull <- rbind.data.frame(coofull, cootot[object$TL[, 1] == levels(object$TL[,1])[i], ]) for (ianal in which.tab) { scatterutil.base(coofull, 1, 2, xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0, 0), sub = row.names(object$RV)[ianal], csub = csub, possub = possub, pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) coo2 <- cootot[object$TL[, 1] == levels(object$TL[,1])[ianal], 1:2] s.label(coo2, add.plot = TRUE, clabel = clab, label = row.names(object$Tli)[object$TL[, 1] == levels(object$TL[,1])[ianal]]) } } if (show[3]) { par(mar = c(0.1, 0.1, 0.1, 0.1)) coo1 <- object$co[, c(xax, yax)] cootot <- object$Tco[, c(xax, yax)] names(cootot) <- names(coo1) coofull <- coo1 for (i in which.tab) coofull <- rbind.data.frame(coofull, cootot[object$TC[, 1] == levels(object$TC[,1])[i], ]) for (ianal in which.tab) { scatterutil.base(coofull, 1, 2, xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0, 0), sub = row.names(object$RV)[ianal], csub = csub, possub = possub, pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) coo2 <- object$Tco[object$TC[, 1] == levels(object$TC[,1])[ianal], c(xax, yax)] s.arrow(coo2, add.plot = TRUE, clabel = clab, sub = row.names(object$RV)[ianal], csub = csub, possub = possub) } } if (show[4]) { for (ianal in which.tab) { coo2 <- object$Tcomp[object$T4[, 1] == levels(object$T4[,1])[ianal], c(xax, yax)] row.names(coo2) <- as.character(1:4) s.corcircle(coo2, clabel = clab, cgrid = 0, sub = row.names(object$RV)[ianal], csub = csub, possub = possub) } } } ade4/R/is.euclid.R0000644000176200001440000000173612576021756013314 0ustar liggesusers"is.euclid" <- function (distmat, plot = FALSE, print = FALSE, tol = 1e-07) { if (!inherits(distmat, "dist")) stop("Object of class 'dist' expected") if(any(distmat -tol)) } "summary.dist" <- function (object, ...) { if (!inherits(object, "dist")) stop("For use on the class 'dist'") cat("Class: ") cat(class(object), "\n") cat("Distance matrix by lower triangle : d21, d22, ..., d2n, d32, ...\n") cat("Size:", attr(object, "Size"), "\n") cat("Labels:", attr(object, "Labels"), "\n") cat("call: ") print(attr(object, "call")) cat("method:", attr(object, "method"), "\n") cat("Euclidean matrix (Gower 1966):", is.euclid(object), "\n") } ade4/R/ktab.list.dudi.R0000644000176200001440000000270612576021756014252 0ustar liggesusers"ktab.list.dudi" <- function (obj, rownames = NULL, colnames = NULL, tabnames = NULL) { obj <- as.list(obj) if (any(unlist(lapply(obj, function(x) !inherits(x, "dudi"))))) stop("list of object 'dudi' expected") nblo <- length(obj) res <- list() lw <- obj[[1]]$lw cw <- NULL blocks <- unlist(lapply(obj, function(x) ncol(x$tab))) for (i in 1:nblo) { if (any(obj[[i]]$lw != lw)) stop("Non equal row weights among arrays") res[[i]] <- obj[[i]]$tab cw <- c(cw, obj[[i]]$cw) } cn <- unlist(lapply(obj, function(x) names(x$tab))) if (is.null(rownames)) rownames <- row.names(obj[[1]]$tab) else if (length(rownames) != length(row.names(obj[[1]]$tab))) stop("Non convenient rownames length") if (is.null(colnames)) colnames <- cn else if (length(colnames) != length(cn)) stop("Non convenient colnames length") if (is.null(names(obj))) tn <- paste("Ana", 1:nblo, sep = "") else tn <- names(obj) if (is.null(tabnames)) tabnames <- tn else if (length(tabnames) != length(tn)) stop("Non convenient tabnames length") names(blocks) <- tabnames res$blo <- blocks res$lw <- lw res$cw <- cw class(res) <- "ktab" row.names(res) <- rownames col.names(res) <- colnames tab.names(res) <- tabnames res <- ktab.util.addfactor(res) res$call <- match.call() return(res) } ade4/R/s.label.R0000644000176200001440000000307112576021756012747 0ustar liggesusers"s.label" <- function (dfxy, xax = 1, yax = 2, label = row.names(dfxy), clabel = 1, pch = 20, cpoint = if (clabel == 0) 1 else 0, boxes = TRUE, neig = NULL, cneig = 2, xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0, 0), sub = "", csub = 1.25, possub = "bottomleft", pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) { dfxy <- data.frame(dfxy) opar <- par(mar = par("mar")) on.exit(par(opar)) par(mar = c(0.1, 0.1, 0.1, 0.1)) coo <- scatterutil.base(dfxy = dfxy, xax = xax, yax = yax, xlim = xlim, ylim = ylim, grid = grid, addaxes = addaxes, cgrid = cgrid, include.origin = include.origin, origin = origin, sub = sub, csub = csub, possub = possub, pixmap = pixmap, contour = contour, area = area, add.plot = add.plot) if (!is.null(neig)) { if (is.null(class(neig))) neig <- NULL if (class(neig) != "neig") neig <- NULL deg <- attr(neig, "degrees") if ((length(deg)) != (length(coo$x))) neig <- NULL } if (!is.null(neig)) { fun <- function(x, coo) { segments(coo$x[x[1]], coo$y[x[1]], coo$x[x[2]], coo$y[x[2]], lwd = par("lwd") * cneig) } apply(unclass(neig), 1, fun, coo = coo) } if (clabel > 0) scatterutil.eti(coo$x, coo$y, label, clabel, boxes) if (cpoint > 0 & clabel < 1e-6) points(coo$x, coo$y, pch = pch, cex = par("cex") * cpoint) box() invisible(match.call()) } ade4/R/krandtest.R0000644000176200001440000001157613544647657013451 0ustar liggesusers"as.krandtest" <- function (sim, obs, alter="greater", call = match.call(), names = colnames(sim), p.adjust.method = "none", output = c("light", "full")) { output <- match.arg(output) if(output == "full") res <- list(sim = sim, obs = obs) else res <- list(obs = obs) if(length(obs)!=length(alter)) alter <- rep(alter, length = length(obs)) res$alter <- alter ## Invalid permutations are stored as NA res$rep <- apply(sim, 2, function(x) length(na.omit(x))) res$ntest <- length(obs) res$expvar <- data.frame(matrix(0, res$ntest, 3)) if(!is.null(names)){ res$names <- names } else { res$names <- paste("test", 1:res$ntest, sep="") } names(res$expvar) <- c("Std.Obs","Expectation","Variance") res$pvalue <- rep(0,length(obs)) for(i in 1:length(obs)){ vec.sim <- na.omit(sim[,i]) if(length(vec.sim > 0)){ ## compute histogram (mainly used for 'light' randtest) r0 <- c(vec.sim, obs[i]) l0 <- max(vec.sim) - min(vec.sim) w0 <- l0/(log(length(vec.sim), base = 2) + 1) xlim0 <- range(r0) + c(-w0, w0) h0 <- hist(vec.sim, plot = FALSE, nclass = 10) res$plot[[i]] <- list(hist = h0, xlim = xlim0) } res$alter[i] <- match.arg(res$alter[i], c("greater", "less", "two-sided")) res$expvar[i,1] <- (obs[i] - mean(vec.sim)) / sd(vec.sim) res$expvar[i,2] <- mean(vec.sim) res$expvar[i,3] <- sd(vec.sim) if(res$alter[i]=="greater"){ res$pvalue[i] <- (sum(vec.sim >= obs[i]) + 1)/(res$rep[i] + 1) } else if(res$alter[i]=="less"){ res$pvalue[i] <- (sum(vec.sim <= obs[i]) + 1)/(res$rep[i] + 1) } else if(res$alter[i]=="two-sided") { sim0 <- abs(vec.sim - mean(vec.sim)) obs0 <- abs(obs[i] - mean(vec.sim)) res$pvalue[i] <- (sum(sim0 >= obs0) + 1) / (res$rep[i] +1) } } p.adjust.method <- match.arg(p.adjust.method, p.adjust.methods) res$adj.pvalue <- p.adjust(res$pvalue, method = p.adjust.method) res$adj.method <- p.adjust.method res$call <- call class(res) <- "krandtest" if(output == "light") class(res) <- c(class(res), "lightkrandtest") return(res) } "plot.krandtest" <- function (x, mfrow = NULL, nclass = 10, main.title = x$names, ...) { if (!inherits(x, "krandtest")) stop("to be used with 'krandtest' object") if (is.null(mfrow)) mfrow = n2mfrow(x$ntest) def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) par(mfrow = mfrow) par(mar = c(3.1, 2.5, 2.1, 2.1)) if (length(main.title)!=length(x$names)) main.title <- x$names if(inherits(x, "lightkrandtest")) { for (k in 1:x$ntest) { y0 <- max(x$plot[[k]]$hist$counts) plot(x$plot[[k]]$hist, xlim = x$plot[[k]]$xlim, col = grey(0.8), main = main.title[k], ...) lines(c(x$obs[k], x$obs[k]), c(y0/2, 0)) points(x$obs[k], y0/2, pch = 18, cex = 2) } } else { for (k in 1:x$ntest) { plot.randtest(as.randtest(x$sim[,k], x$obs[k], call = match.call()), main = main.title[k], nclass = nclass) } } } "print.krandtest" <- function (x, ...) { if (!inherits(x, "krandtest")) stop("to be used with 'krandtest' object") cat("class:", class(x), "\n") ## dig0 <- ceiling (log(x$rep)/log(10)) cat("Monte-Carlo tests\n") cat("Call: ") print(x$call) cat("\nNumber of tests: ", x$ntest, "\n") cat("\nAdjustment method for multiple comparisons: ", x$adj.method, "\n") sumry <- list(Test = x$names, Obs = x$obs, Std.Obs = x$expvar[,1], Alter = x$alter) sumry <- as.data.frame(sumry) row.names(sumry) <- 1:x$ntest if(any(x$rep[1] != x$rep)){ sumry <- cbind(sumry[,1:4], N.perm = x$rep) } else { cat("Permutation number: ", x$rep[1], "\n") } sumry <- cbind(sumry, Pvalue = x$pvalue) if(x$adj.method != "none") sumry <- cbind(sumry, Pvalue.adj = x$adj.pvalue) print(sumry) cat("\n") } "[.krandtest" <- function(x, i) { res <- list() if (!inherits(x, "lightkrandtest")) if(length(i) == 1) res$sim <- x$sim[, i, drop = FALSE] else res$sim <- x$sim[, i] res$obs <- x$obs[i] res$alter <- x$alter[i] res$rep <- x$rep[i] res$ntest <- length(i) res$expvar <- x$expvar[i, ] res$names <- x$names[i] res$pvalue <- x$pvalue[i] res$plot <- x$plot[i] res$adj.pvalue <- x$adj.pvalue[i] res$adj.method <- x$adj.method res$call <- match.call() class(res) <- class(x) return(res) } "[[.krandtest" <- function(x, i) { if(length(i) != 1) stop("Only one element can be selected: 'i' must be an index of length at 1.") obj <- x[i] res <- list() if (!inherits(x, "lightkrandtest")) res$sim <- obj$sim res$obs <- obj$obs res$alter <- obj$alter res$rep <- obj$rep res$expvar <- obj$expvar res$pvalue <- obj$pvalue res$plot <- obj$plot res$call <- match.call() class(res) <- "randtest" if (inherits(x, "lightkrandtest")) class(res) <- c(class(res), "lightrandtest") return(res) } ade4/R/triangle.plot.R0000644000176200001440000002363612576021756014222 0ustar liggesusers######################### triangle.plot ###################################### "triangle.plot" <- function (ta, label = as.character(1:nrow(ta)), clabel = 0, cpoint = 1, draw.line = TRUE, addaxes = FALSE, addmean = FALSE, labeltriangle = TRUE, sub = "", csub = 0, possub = "topright", show.position = TRUE, scale = TRUE, min3 = NULL, max3 = NULL, box = FALSE) { seg <- function(a, b, col = par("col")) { segments(a[1], a[2], b[1], b[2], col = col) } nam <- names(ta) ta <- t(apply(ta, 1, function(x) x/sum(x))) d <- triangle.param(ta, scale = scale, min3 = min3, max3 = max3) opar <- par(mar = par("mar")) on.exit(par(opar)) A <- d$A B <- d$B C <- d$C xy <- d$xy mini <- d$mini maxi <- d$maxi if (show.position) add.position.triangle(d) par(mar = c(0.1, 0.1, 0.1, 0.1)) plot(0, 0, type = "n", xlim = c(-0.8, 0.8), ylim = c(-0.6, 1), xlab = "", ylab = "", xaxt = "n", yaxt = "n", asp = 1, frame.plot = FALSE) seg(A, B) seg(B, C) seg(C, A) text(C[1], C[2], labels = paste(mini[1]), pos = 2) text(C[1], C[2], labels = paste(maxi[3]), pos = 4) if (labeltriangle) text((A + C)[1]/2, (A + C)[2]/2, labels = nam[1], cex = 1.5, pos = 2) text(A[1], A[2], labels = paste(maxi[1]), pos = 2) text(A[1], A[2], labels = paste(mini[2]), pos = 1) if (labeltriangle) text((A + B)[1]/2, (A + B)[2]/2, labels = nam[2], cex = 1.5, pos = 1) text(B[1], B[2], labels = paste(maxi[2]), pos = 1) text(B[1], B[2], labels = paste(mini[3]), pos = 4) if (labeltriangle) text((B + C)[1]/2, (B + C)[2]/2, labels = nam[3], cex = 1.5, pos = 4) if (draw.line) { nlg <- 10 * (maxi[1] - mini[1]) for (i in 1:(nlg - 1)) { x1 <- A + (i/nlg) * (B - A) x2 <- C + (i/nlg) * (B - C) seg(x1, x2, col = "lightgrey") x1 <- A + (i/nlg) * (B - A) x2 <- A + (i/nlg) * (C - A) seg(x1, x2, col = "lightgrey") x1 <- C + (i/nlg) * (A - C) x2 <- C + (i/nlg) * (B - C) seg(x1, x2, col = "lightgrey") } } if (cpoint > 0) points(xy, pch = 20, cex = par("cex") * cpoint) if (clabel > 0) scatterutil.eti(xy[, 1], xy[, 2], label, clabel) if (addaxes) { pr0 <- dudi.pca(ta, scale = FALSE, scannf = FALSE)$c1 w1 <- triangle.posipoint(apply(ta, 2, mean), mini, maxi) points(w1[1], w1[2], pch = 16, cex = 2) a1 <- pr0[, 1] x1 <- a1[1] * A + a1[2] * B + a1[3] * C seg(w1 - x1, w1 + x1) a1 <- pr0[, 2] x1 <- a1[1] * A + a1[2] * B + a1[3] * C seg(w1 - x1, w1 + x1) } if (addmean) { m <- apply(ta, 2, mean) w1 <- triangle.posipoint(m, mini, maxi) points(w1[1], w1[2], pch = 16, cex = 2) w2 <- triangle.posipoint(c(m[1], mini[2], 1 - m[1] - mini[2]), mini, maxi) w3 <- triangle.posipoint(c(1 - m[2] - mini[3], m[2], mini[3]), mini, maxi) w4 <- triangle.posipoint(c(mini[1], 1 - m[3] - mini[1], m[3]), mini, maxi) points(w2[1], w2[2], pch = 20, cex = 2) points(w3[1], w3[2], pch = 20, cex = 2) points(w4[1], w4[2], pch = 20, cex = 2) seg(w1, w2) seg(w1, w3) seg(w1, w4) text(w2[1], w2[2], labels = as.character(round(m[1], digits = 3)), cex = 1.5, pos = 2) text(w3[1], w3[2], labels = as.character(round(m[2], digits = 3)), cex = 1.5, pos = 1) text(w4[1], w4[2], labels = as.character(round(m[3], digits = 3)), cex = 1.5, pos = 4) } if (csub > 0) scatterutil.sub(sub, csub, possub) if (box) box() return(invisible(xy)) } ######################### triangle.posipoint ###################################### "triangle.posipoint" <- function (x, mini, maxi) { x <- (x - mini)/(maxi - mini) x <- x/sum(x) x1 <- (x[2] - x[1])/sqrt(2) y1 <- (2 * x[3] - x[2] - x[1])/sqrt(6) return(c(x1, y1)) } ######################### add.position.triangle ###################################### "add.position.triangle" <- function (d) { par(mar = c(0.1, 0.1, 0.1, 0.1)) w <- matrix(0, 3, 3) w[1, 1] <- d$mini[1] w[1, 2] <- d$mini[2] w[1, 3] <- d$maxi[3] w[2, 1] <- d$maxi[1] w[2, 2] <- d$mini[2] w[2, 3] <- d$mini[3] w[3, 1] <- d$mini[1] w[3, 2] <- d$maxi[2] w[3, 3] <- d$mini[3] A <- triangle.posipoint(c(0, 0, 1), c(0, 0, 0), c(1, 1, 1)) B <- triangle.posipoint(c(1, 0, 0), c(0, 0, 0), c(1, 1, 1)) C <- triangle.posipoint(c(0, 1, 0), c(0, 0, 0), c(1, 1, 1)) a <- triangle.posipoint(w[1, ], c(0, 0, 0), c(1, 1, 1)) b <- triangle.posipoint(w[2, ], c(0, 0, 0), c(1, 1, 1)) c <- triangle.posipoint(w[3, ], c(0, 0, 0), c(1, 1, 1)) plot(0, 0, type = "n", xlim = c(-0.71, 4 - 0.71), ylim = c(-4 + 0.85, 0.85), xlab = "", ylab = "", xaxt = "n", yaxt = "n", asp = 1, frame.plot = FALSE) polygon(c(A[1], B[1], C[1]), c(A[2], B[2], C[2])) polygon(c(a[1], b[1], c[1]), c(a[2], b[2], c[2]), col = grey(0.75)) par(new = TRUE) } ######################### triangle.biplot ###################################### "triangle.biplot" <- function (ta1, ta2, label = as.character(1:nrow(ta1)), draw.line = TRUE, show.position = TRUE, scale = TRUE) { seg <- function(a, b, col = 1) { segments(a[1], a[2], b[1], b[2], col = col) } nam <- names(ta1) ta1 <- t(apply(ta1, 1, function(x) x/sum(x))) ta2 <- t(apply(ta2, 1, function(x) x/sum(x))) d <- triangle.param(rbind(ta1, ta2), scale = scale) opar <- par(mar = par("mar")) on.exit(par(opar)) A <- d$A B <- d$B C <- d$C xy <- d$xy mini <- d$mini maxi <- d$maxi if (show.position) add.position.triangle(d) par(mar = c(0.1, 0.1, 0.1, 0.1)) plot(0, 0, type = "n", xlim = c(-0.8, 0.8), ylim = c(-0.6, 1), xlab = "", ylab = "", xaxt = "n", yaxt = "n", asp = 1, frame.plot = FALSE) seg(A, B) seg(B, C) seg(C, A) text(C[1], C[2], labels = paste(mini[1]), pos = 2) text(C[1], C[2], labels = paste(maxi[3]), pos = 4) text((A + C)[1]/2, (A + C)[2]/2, labels = nam[1], cex = 1.5, pos = 2) text(A[1], A[2], labels = paste(maxi[1]), pos = 2) text(A[1], A[2], labels = paste(mini[2]), pos = 1) text((A + B)[1]/2, (A + B)[2]/2, labels = nam[2], cex = 1.5, pos = 1) text(B[1], B[2], labels = paste(maxi[2]), pos = 1) text(B[1], B[2], labels = paste(mini[3]), pos = 4) text((B + C)[1]/2, (B + C)[2]/2, labels = nam[3], cex = 1.5, pos = 4) if (draw.line) { nlg <- 10 * (maxi[1] - mini[1]) for (i in (1:(nlg - 1))) { x1 <- A + (i/nlg) * (B - A) x2 <- C + (i/nlg) * (B - C) seg(x1, x2, col = "lightgrey") x1 <- A + (i/nlg) * (B - A) x2 <- A + (i/nlg) * (C - A) seg(x1, x2, col = "lightgrey") x1 <- C + (i/nlg) * (A - C) x2 <- C + (i/nlg) * (B - C) seg(x1, x2, col = "lightgrey") } } nl <- nrow(ta1) for (i in (1:nl)) { arrows(xy[i, 1], xy[i, 2], xy[i + nl, 1], xy[i + nl, 2], length = 0.1, angle = 15) } points(xy[1:nrow(ta1), ]) text(xy[1:nrow(ta1), ], label, pos = 4) } ######################### triangle.param ###################################### "triangle.param" <- function (ta, scale = TRUE, min3 = NULL, max3 = NULL) { if (ncol(ta) != 3) stop("Non convenient data") if (min(ta) < 0) stop("Non convenient data") if ((!is.null(min3)) & (!is.null(max3))) scale <- TRUE cal <- matrix(0, 9, 3) tb <- t(apply(ta, 1, function(x) x/sum(x))) mini <- apply(tb, 2, min) maxi <- apply(tb, 2, max) mini <- (floor(mini/0.1))/10 maxi <- (floor(maxi/0.1) + 1)/10 mini[mini<0] <- 0 maxi[maxi>1] <- 1 if (!is.null(min3)) mini <- min3 if (!is.null(max3)) maxi <- min3 ampli <- maxi - mini amplim <- max(ampli) # correction d'un bug trouvé par J. Lobry 15/11/2004 if (!all(ampli==amplim)) { for (j in 1:3) { k <- amplim - ampli[j] while (k > 0) { if ((k > 0) & (maxi[j] < 1)) { maxi[j] <- maxi[j] + 0.1 k <- k - 1 } if ((k > 0) & (mini[j] > 0)) { mini[j] <- mini[j] - 0.1 k <- k - 1 } } } } cal[1, 1] <- mini[1] cal[1, 2] <- mini[2] cal[1, 3] <- 1 - cal[1, 1] - cal[1, 2] cal[2, 1] <- mini[1] cal[2, 2] <- maxi[2] cal[2, 3] <- 1 - cal[2, 1] - cal[2, 2] cal[3, 1] <- maxi[1] cal[3, 2] <- mini[2] cal[3, 3] <- 1 - cal[3, 1] - cal[3, 2] cal[4, 1] <- mini[1] cal[4, 3] <- mini[3] cal[4, 2] <- 1 - cal[4, 1] - cal[4, 3] cal[5, 1] <- mini[1] cal[5, 3] <- maxi[3] cal[5, 2] <- 1 - cal[5, 1] - cal[5, 3] cal[6, 1] <- maxi[1] cal[6, 3] <- mini[3] cal[6, 2] <- 1 - cal[6, 1] - cal[6, 3] cal[7, 2] <- mini[2] cal[7, 3] <- mini[3] cal[7, 1] <- 1 - cal[7, 2] - cal[7, 3] cal[8, 2] <- mini[2] cal[8, 3] <- maxi[3] cal[8, 1] <- 1 - cal[8, 2] - cal[8, 3] cal[9, 2] <- maxi[2] cal[9, 3] <- mini[3] cal[9, 1] <- 1 - cal[9, 2] - cal[9, 3] mini <- apply(cal, 2, min) mini <- round(mini, digits = 4) maxi <- apply(cal, 2, max) maxi <- round(maxi, digits = 4) ampli <- maxi - mini if (!scale) { mini <- c(0, 0, 0) maxi <- c(1, 1, 1) } A <- c(-1/sqrt(2), -1/sqrt(6)) B <- c(1/sqrt(2), -1/sqrt(6)) C <- c(0, 2/sqrt(6)) xy <- t(apply(tb, 1, FUN = triangle.posipoint, mini = mini, maxi = maxi)) # pour avoir en sortie une matrice des coordonnées dimnames(xy) <- list(row.names(ta),c("x","y")) return(list(A = A, B = B, C = C, xy = xy, mini = mini, maxi = maxi)) } ade4/R/s.chull.R0000644000176200001440000000245512576021756013004 0ustar liggesusers"s.chull" <- function (dfxy, fac, xax = 1, yax = 2, optchull = c(0.25, 0.5, 0.75, 1), label = levels(fac), clabel = 1, cpoint = 0, col = rep(1, length(levels(fac))), xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, origin = c(0, 0), include.origin = TRUE, sub = "", csub = 1, possub = "bottomleft", cgrid = 1, pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) { dfxy <- data.frame(dfxy) opar <- par(mar = par("mar")) par(mar = c(0.1, 0.1, 0.1, 0.1)) on.exit(par(opar)) coo <- scatterutil.base(dfxy = dfxy, xax = xax, yax = yax, xlim = xlim, ylim = ylim, grid = grid, addaxes = addaxes, cgrid = cgrid, include.origin = include.origin, origin = origin, sub = sub, csub = csub, possub = possub, pixmap = pixmap, contour = contour, area = area, add.plot = add.plot) scatterutil.chull(coo$x, coo$y, fac, optchull = optchull, col=col) if (cpoint > 0) for (i in 1:nlevels(fac)) { points(coo$x[fac == levels(fac)[i]], coo$y[fac == levels(fac)[i]], pch = 20, cex = par("cex") * cpoint, col=col[i]) } if (clabel > 0) { coox <- tapply(coo$x, fac, mean) cooy <- tapply(coo$y, fac, mean) scatterutil.eti(coox, cooy, label, clabel, coul = col) } box() invisible(match.call()) } ade4/R/table.paint.R0000644000176200001440000000213212576021756013625 0ustar liggesusers"table.paint" <- function (df, x = 1:ncol(df), y = nrow(df):1, row.labels = row.names(df), col.labels = names(df), clabel.row = 1, clabel.col = 1, csize = 1, clegend = 1) { x <- rank(x) y <- rank(y) opar <- par(mai = par("mai"), srt = par("srt")) on.exit(par(opar)) table.prepare(x = x, y = y, row.labels = row.labels, col.labels = col.labels, clabel.row = clabel.row, clabel.col = clabel.col, grid = FALSE, pos = "paint") xtot <- x[col(as.matrix(df))] ytot <- y[row(as.matrix(df))] xdelta <- (max(x) - min(x))/(length(x) - 1)/2 ydelta <- (max(y) - min(y))/(length(y) - 1)/2 coeff <- diff(range(xtot))/15 z <- unlist(df) br0 <- pretty(z, 6) nborn <- length(br0) coeff <- diff(range(x))/15 numclass <- cut.default(z, br0, include.lowest = TRUE, labels = FALSE) valgris <- seq(1, 0, le = (nborn - 1)) h <- csize * coeff rect(xtot - xdelta, ytot - ydelta, xtot + xdelta, ytot + ydelta, col = gray(valgris[numclass])) if (clegend > 0) scatterutil.legend.square.grey(br0, valgris, h/2, clegend) } ade4/R/s.class.R0000644000176200001440000000431412576021756012776 0ustar liggesusers"s.class" <- function (dfxy, fac, wt = rep(1, length(fac)), xax = 1, yax = 2, cstar = 1, cellipse = 1.5, axesell = TRUE, label = levels(fac), clabel = 1, cpoint = 1, pch = 20, col = rep(1, length(levels(fac))), xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, origin = c(0, 0), include.origin = TRUE, sub = "", csub = 1, possub = "bottomleft", cgrid = 1, pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) { opar <- par(mar = par("mar")) par(mar = c(0.1, 0.1, 0.1, 0.1)) on.exit(par(opar)) dfxy <- data.frame(dfxy) if (!is.data.frame(dfxy)) stop("Non convenient selection for dfxy") if (any(is.na(dfxy))) stop("NA non implemented") if (!is.factor(fac)) stop("factor expected for fac") dfdistri <- fac2disj(fac) * wt coul <- col w1 <- unlist(lapply(dfdistri, sum)) dfdistri <- t(t(dfdistri)/w1) coox <- as.matrix(t(dfdistri)) %*% dfxy[, xax] cooy <- as.matrix(t(dfdistri)) %*% dfxy[, yax] if (nrow(dfxy) != nrow(dfdistri)) stop(paste("Non equal row numbers", nrow(dfxy), nrow(dfdistri))) coo <- scatterutil.base(dfxy = dfxy, xax = xax, yax = yax, xlim = xlim, ylim = ylim, grid = grid, addaxes = addaxes, cgrid = cgrid, include.origin = include.origin, origin = origin, sub = sub, csub = csub, possub = possub, pixmap = pixmap, contour = contour, area = area, add.plot = add.plot) if (cpoint > 0) for (i in 1:ncol(dfdistri)) { pch <- rep(pch, length = nrow(dfxy)) points(coo$x[dfdistri[,i] > 0], coo$y[dfdistri[,i] > 0], pch = pch[dfdistri[,i] > 0], cex = par("cex") * cpoint, col=coul[i]) } if (cstar > 0) for (i in 1:ncol(dfdistri)) { scatterutil.star(coo$x, coo$y, dfdistri[, i], cstar = cstar, coul[i]) } if (cellipse > 0) for (i in 1:ncol(dfdistri)) { scatterutil.ellipse(coo$x, coo$y, dfdistri[, i], cellipse = cellipse, axesell = axesell, coul[i]) } if (clabel > 0) scatterutil.eti(coox, cooy, label, clabel, coul = col) box() invisible(match.call()) } ade4/R/orthobasis.R0000644000176200001440000003001613276062336013600 0ustar liggesusers## define 'orthobasis' as a subclass of 'data.frame'. This allows to introduce an 'orthobasis' object in slot @data in sp objects. setOldClass(c("orthobasis","data.frame")) ## TODO NEW is.orthobasis <- function(x){ if(!inherits(x,"orthobasis")) return(FALSE) wt <- attr(x,"weights") x <- as.matrix(x) # vectors should be centred test <- isTRUE(all.equal(rep(0, ncol(x)), apply(x, 2, weighted.mean, w = wt), check.attributes = FALSE)) # test orthogonality if(test){ test <- test & isTRUE(all.equal(diag(1,ncol(x)), crossprod(x*wt,x), check.attributes = FALSE)) } return(test) } ## TODO updated print.orthobasis <- function(x,..., nr = 6, nc = 4) { cat("Orthobasis with", nrow(x),"rows and", ncol(x),"columns\n") cat("Only", min(nr, nrow(x)), "rows and", min(nc, ncol(x)) , "columns are shown\n") print.data.frame(x[1:min(nr, nrow(x)), 1:min(nc, ncol(x)), drop = FALSE]) } ## TODO new summary.orthobasis <- function(object,...) { if (!inherits(object,"orthobasis")) stop ("for 'orthobasis' object") cat("Orthonormal basis: ") n <- nrow(object) p <- ncol(object) cat("data.frame with",n,"rows and",ncol(object),"columns\n") cat("----------------------------------------------------------------\n") cat("Columns form a centred orthonormal basis (i.e. 1n-orthogonal)\n") cat("for the inner product defined by the 'weights' attribute\n") cat("----------------------------------------------------------------\n") w <- attributes(object) cat("\nAttributes:\n") if (!is.null(w$names)) cat("- names:", w$names[1],"...",w$names[p],"\n") if (!is.null(w$row.names)) cat("- row.names:", w$row.names[1],"...",w$row.names[n],"\n") if (!is.null(w$weights)) cat("- weights:", w$weights[1],"...",w$weights[n],"\n") if (!is.null(w$values)) cat("- values:", w$values[1],"...",w$values[p],"\n") if (!is.null(w$class)) cat("- class:", w$class,"\n") if (!is.null(w$call)) cat("- call:", deparse(w$call), "\n\n") } ## TODO new plot.orthobasis <- function(x,...){ table.value(x,...) } orthobasis.mat <- function(mat, cnw=TRUE) { if (!is.matrix(mat)) stop ("matrix expected") if (any(mat<0)) stop ("negative value in 'mat'") if (nrow(mat)!=ncol(mat)) stop ("squared matrix expected") mat <- (mat+t(mat))/2 nlig <- nrow(mat) if (is.null(dimnames(mat))) { w <- paste("P",1:nrow(mat),sep="") dimnames(mat) <- list(w,w) } labels <- dimnames(mat)[[1]] if (cnw) { margi <- apply(mat,1,sum) margi <- max(margi)-margi mat <- mat+diag(margi) } mat <- mat/sum(mat) wt <- rep ((1/nlig),nlig) # calculs extensibles à une pondération quelconque wt <- wt/sum(wt) # si mat wt est la pondération marginale associée à mat # tot = sum(mat) # mat = mat-matrix(wt,nlig,nlig,byrow=TRUE)*wt*tot # encore plus particulier mat = mat-1/nlig/nlig # en général les précédents sont des cas particuliers U <- matrix(1,nlig,nlig) U <- diag(1,nlig)-U*wt mat <- U%*%mat%*%t(U) wt <- sqrt(wt) mat <- t(t(mat)/wt) mat <- mat/wt eig <- eigen(mat,symmetric = TRUE) w0 <- abs(eig$values)/max(abs(eig$values)) tol <- 1e-07 w0 <- which(w01) { # on ajoute le vecteur dérivé de 1n w <- cbind(wt,eig$vectors[,w0]) # on orthonormalise l'ensemble w <- qr.Q(qr(w)) # on met les valeurs propres à 0 eig$values[w0] <- 0 # on remplace les vecteurs du noyau par une base orthonormée contenant # en première position le parasite eig$vectors[,w0] <- w[,-ncol(w)] # on enlève la position du parasite w0 <- (1:nlig)[-w0[1]] } mat <- eig$vectors[,w0]/wt mat <- data.frame(mat) row.names(mat) <- labels names(mat) <- paste("S",1:(nlig-1),sep="") attr(mat,"values") <- eig$values[w0] attr(mat,"weights") <- rep(1/nlig,nlig) attr(mat,"call") <- match.call() attr(mat,"class") <- c("orthobasis","data.frame") return(mat) } "orthobasis.haar" <- function(n) { # on définit deux fonctions : appel = match.call() a <- log(n)/log(2) b <- floor(a) if ((a-b)^2>1e-10) stop ("Haar is not a power of 2") # la première est écrite par Daniel et elle donne la démonstration (par analogie avec la fonction qui construit la base Bscores) # que la base Bscores est exactement la base de Haar quand on prend une phylogénie régulière résolue. "haar.basis.1" <- function (n) { pari <- matrix(c(1,n),1) "div2" <- function (mat) { res <- NULL for (k in 1 : nrow(mat)) { n1 <- mat[k,1] n2 <- mat[k,2] diff <- n2-n1 if (diff <=0) break n3 <- floor((n1+n2)/2) res <- rbind(res,c(n1,n3),c(n3+1,n2)) } if (!is.null(res)) pari <<- rbind(pari,res) return(res) } mat <- div2(pari) while (!is.null(mat)) mat <- div2(mat) res <- NULL for (k in 1:nrow(pari)) { x<-rep(0,n) x[(pari[k,1]):(pari[k,2])] <- 1 res <-c(res,x) } res = matrix(res,n) res <- qr.Q(qr(res)) res <- res[, -1] * sqrt(n) res <- data.frame(res) row.names(res) <- paste("u",1:n,sep="") names(res) <- paste("B",1:(n-1),sep="") return(res) } # la seconde exploite les potentialités de la librairie waveslim, en remarquant qu'il existe un lien étroit entre la définition des filtres et la définition # des bases. Cette stratégie permettra à l'avenir de définir les bases associées à d'autres famille de fonctions. "haar.basis.2" <- function (n) { J <- a #nombre de niveau res <- matrix(0, nrow = n,ncol = n-1) filter.seq <- "H" #filtre correspondant au niveau 1 h <- waveslim::wavelet.filter(wf.name = "haar", filter.seq = filter.seq) #paramètre du filtre au niveau 1 k <- 0 for(i in 1:J){ z <- rep(h,2**(J-i)) x <- 1:n y <- rep((n-1-k):(n-2**(J-i)-k),rep(2**i,2**(J-i))) for(j in 1:n) res[x[j],y[j]] <- z[j] k <- k+2**(J-i) filter.seq <- paste(filter.seq, "L", sep = "") h <- waveslim::wavelet.filter(wf.name = "haar", filter.seq = filter.seq) } res <- res*sqrt(n) res <- data.frame(res) row.names(res) <- paste("u", 1:n, sep = "") names(res) <- paste("B", 1:(n-1), sep = "") return(res) } # suivant que n est grand (n > 257) ou non, on choisit l'une des deux stratégies : if (n < 257) res <- haar.basis.1(n) else res <- haar.basis.2(n) attr(res,"values") <- NULL attr(res,"weights") <- rep(1/n,n) attr(res,"call") <- appel attr(res,"class") <- c("orthobasis","data.frame") return(res) } "orthobasis.line" <- function (n) { appel <- match.call() # solution de Cornillon p. 12 res <- NULL for (k in 1:(n-1)) { x <- cos(k*pi*(2*(1:n)-1)/2/n) x <- sqrt(n)*x/sqrt(sum(x*x)) res <-c(res,x) } res=matrix(res,n) res <- data.frame(res) row.names(res) <- paste("u",1:n,sep="") names(res) <- paste("B",1:(n-1),sep="") w <- (1:(n-1))*pi/2/n valpro <- 4*(sin(w)^2)/n poivoisi <- c(1,rep(2,n-2),1) poivoisi <- poivoisi/sum(poivoisi) norm <- unlist(apply(res, 2, function(a) sum(a*a*poivoisi))) y <- valpro*n*n/2/(n-1) val <- norm - y attr(res,"values") <- val attr(res,"weights") <- rep(1/n,n) attr(res,"call") <- appel attr(res,"class") <- c("orthobasis","data.frame") # vérification locale. Ce paragraphe vérifie que les vecteurs et les valeurs # proposée par Cornillon p. 12 sont bien les vecteurs propres de l'opérateur de voisinage # rangée dans la solution analytique par variance locale croissante # l'article de Méot est erroné et a donné le graphe circulaire pour le graphe linéaire # d0=neig2mat(neig(n.lin=n)) # d0 = d0/n # d1=apply(d0,1,sum) # d0=diag(d1)-d0 # fun2 <- function(x) { # z <- sum(t(d0*x)*x)/n # z <- z/sum(x*x) # return(z) # } # lambda <- unlist(apply(res,2,fun2)) # print(lambda) # print(attr(res,"values")) # plot(lambda,attr(res,"values")) # abline(lm(attr(res,"values")~lambda)) # print(coefficients(lm(attr(res,"values")~lambda))) # vérification que les valeurs dérivées des valeurs propres sont exactement des indices de Moran # d = neig2mat(neig(n.lin=n)) # d = d/sum(d) # Moran type W # moran <- unlist(lapply(res,function(x) sum(t(d*x)*x))) # print(moran) # plot(moran,attr(res,"values")) # abline(lm(attr(res,"values")~moran)) # print(summary(lm(attr(res,"values")~moran))) return(res) } "orthobasis.circ" <- function (n) { appel = match.call() if (n<3) stop ("'n' too small") "vecprosin" <- function(k) { x <- sin(2*k*pi*(1:n)/n) x <- x/sqrt(sum(x*x)) } "vecprocos" <- function(k) { x <- cos(2*k*pi*(1:n)/n) x <- x/sqrt(sum(x*x)) } "valpro" <- function(k,bis=TRUE) { x <- (4/n)*((sin(k*pi/n))^2) if (bis) x <- c(x,x) return(x) } k <- floor(n/2) if (k==n/2) { #n est pair w1 <- matrix(unlist(lapply(1:k,vecprocos)),n,k) w2 <- matrix(unlist(lapply(1:(k-1),vecprosin)),n,k-1) res <- cbind(w1,w2) res[,seq(1,2*k-1,by=2)]<-w1 res[,seq(2,2*k-2,by=2)]<-w2 vp <- unlist(lapply(1:(k-1),valpro)) vp <- c(vp, valpro(k,FALSE)) } else { # n est impair w1 <- matrix(unlist(lapply(1:k,vecprocos)),n,k) w2 <- matrix(unlist(lapply(1:k,vecprosin)),n,k) res <- cbind(w1,w2) res[,seq(1,2*k-1,by=2)]<-w1 res[,seq(2,2*k,by=2)]<-w2 vp <- unlist(lapply(1:k,valpro)) } res=sqrt(n)*res res <- as.data.frame(res) row.names(res) <- paste("u",1:n,sep="") names(res) <- paste("B",1:(n-1),sep="") attr(res,"values") <- 1 - n*vp/2 attr(res,"weights") <- rep(1/n,n) attr(res,"call") <- appel attr(res,"class") <- c("orthobasis","data.frame") # vérification qu'on a exactement des indices de Moran à partie des valeurs propres # d = neig2mat(neig(n.cir=n)) # d = d/sum(d) # Moran type W # moran <- unlist(lapply(res,function(x) sum(t(d*x)*x))) # print(moran) # plot(moran,attr(res,"values")) # abline(lm(attr(res,"values")~moran)) # print(summary(lm(attr(res,"values")~moran))) return(res) } "orthobasis.neig" <- function( neig) { appel = match.call() if(!inherits(neig,"neig")) stop ("object of class 'neig' expected") n <- length(attr(neig,"degree")) m <- sum(attr(neig,"degree")) poivoisi <- attr(neig,"degree")/m if (is.null(names(poivoisi))) names(poivoisi) <- as.character(1:n) d0 = neig2mat(neig) d0 = diag(poivoisi)-d0/m eig <- eigen(d0, symmetric = TRUE) ######## tol <- 1e-07 w0 <- abs(eig$values)/max(abs(eig$values)) w0 <- which(w01) { # on ajoute le vecteur dérivé de 1n wt <- rep(1,n) w <- cbind(wt,eig$vectors[,w0]) # on orthonormalise l'ensemble w <- qr.Q(qr(w)) # on met les valeurs propres à 0 eig$values[w0] <- 0 # on remplace les vecteurs du noyau par une base orthonormée contenant # en première position le parasite eig$vectors[,w0] <- w[,-ncol(w)] # on enlève la position du parasite w0 <- (1:n)[-w0[1]] } w0 <- rev(w0) valpro <- eig$values[w0] eig <- eig$vectors[,w0] eig <- as.data.frame(eig)*sqrt(n) z <- apply(eig,2,function(x) sum(x*x*poivoisi)) z <- z - valpro*n w <- rev(order(z)) z <- z[w] eig <- eig[,w] row.names(eig) <- names(poivoisi) names(eig) <- paste("VP", 1:(n-1), sep = "") attr(eig,"values") <- z attr(eig,"weights") <- rep(1/n,n) attr(eig,"call") <- appel attr(eig,"class") <- c("orthobasis","data.frame") return(eig) } ade4/R/statis.R0000644000176200001440000001566213211775710012740 0ustar liggesusers"statis" <- function (X, scannf = TRUE, nf = 3, tol = 1e-07) { if (!inherits(X, "ktab")) stop("object 'ktab' expected") lw <- X$lw nlig <- length(lw) cw <- X$cw ncol <- length(cw) ntab <- length(X$blo) indicablo <- X$TC[, 1] tab.names <- tab.names(X) auxinames <- ktab.util.names(X) statis <- list() sep <- list() lwsqrt <- sqrt(lw) for (k in 1:ntab) { ak <- sqrt(cw[indicablo == levels(X$TC[,1])[k]]) wk <- as.matrix(X[[k]]) * lwsqrt wk <- t(t(wk) * ak) wk <- wk %*% t(wk) sep[[k]] <- wk } ############## calcul des RV ########### sep <- matrix(unlist(sep), nlig * nlig, ntab) RV <- t(sep) %*% sep ak <- sqrt(diag(RV)) RV <- sweep(RV, 1, ak, "/") RV <- sweep(RV, 2, ak, "/") dimnames(RV) <- list(tab.names, tab.names) statis$RV <- RV ############## diagonalisation de la matrice des RV ########### eig1 <- eigen(RV, symmetric = TRUE) statis$RV.eig <- eig1$values if (any(eig1$vectors[, 1] < 0)) eig1$vectors[, 1] <- -eig1$vectors[, 1] tabw <- eig1$vectors[, 1] statis$RV.tabw <- tabw w <- t(t(eig1$vectors) * sqrt(eig1$values)) w <- as.data.frame(w) row.names(w) <- tab.names names(w) <- paste("S", 1:ncol(w), sep = "") statis$RV.coo <- w[, 1:min(4, ncol(w))] ############## combinaison des operateurs d'inertie normes ########### sep <- t(t(sep)/ak) C.ro <- rowSums(sweep(sep,2,tabw,"*")) C.ro <- matrix(unlist(C.ro), nlig, nlig) ############## diagonalisation du compromis ########### eig1 <- eigen(C.ro, symmetric = TRUE) rm(C.ro) eig <- eig1$values rank <- sum((eig/eig[1]) > tol) if (scannf) { barplot(eig[1:rank]) cat("Select the number of axes: ") nf <- as.integer(readLines(n = 1)) messageScannf(match.call(), nf) } if (nf <= 0) nf <- 2 if (nf > rank) nf <- rank statis$C.eig <- eig[1:rank] statis$C.nf <- nf statis$C.rank <- rank wref <- eig1$vectors[, 1:nf] rm(eig1) wref <- wref/lwsqrt w <- data.frame(t(t(wref) * sqrt(eig[1:nf]))) row.names(w) <- row.names(X) names(w) <- paste("C", 1:nf, sep = "") statis$C.li <- w w <- as.matrix(X[[1]]) for (k in 2:ntab) { w <- cbind(w, as.matrix(X[[k]])) } w <- w * lw w <- t(w) %*% wref w <- data.frame(w, row.names = auxinames$col) names(w) <- paste("C", 1:nf, sep = "") statis$C.Co <- w sepanL1 <- sepan(X, nf = 4)$L1 w <- matrix(0, ntab * 4, nf) i1 <- 0 i2 <- 0 for (k in 1:ntab) { i1 <- i2 + 1 i2 <- i2 + 4 tab <- as.matrix(sepanL1[X$TL[, 1] == levels(X$TL[,1])[k], ]) tab <- t(tab * lw) %*% wref for (i in 1:min(nf, 4)) { if (tab[i, i] < 0) { for (j in 1:nf) tab[i, j] <- -tab[i, j] } } w[i1:i2, ] <- tab } w <- data.frame(w, row.names = auxinames$tab) names(w) <- paste("C", 1:nf, sep = "") statis$C.T4 <- w w <- as.matrix(statis$C.li) * lwsqrt w <- w %*% t(w) w <- w/sqrt(sum(w * w)) w <- as.vector(unlist(w)) sep <- sep * unlist(w) w <- apply(sep, 2, sum) statis$cos2 <- w statis$tab.names <- tab.names statis$TL <- X$TL statis$TC <- X$TC statis$T4 <- X$T4 class(statis) <- "statis" return(statis) } "plot.statis" <- function (x, xax = 1, yax = 2, option = 1:4, ...) { if (!inherits(x, "statis")) stop("Object of type 'statis' expected") nf <- x$C.nf if (xax > nf) stop("Non convenient xax") if (yax > nf) stop("Non convenient yax") opar <- par(mar = par("mar"), mfrow = par("mfrow"), xpd = par("xpd")) on.exit(par(opar)) mfrow <- n2mfrow(length(option)) par(mfrow = mfrow) for (j in option) { if (j == 1) { coolig <- x$RV.coo[, c(1, 2)] s.corcircle(coolig, label = x$tab.names, cgrid = 0, sub = "Interstructure", csub = 1.5, possub = "topleft", fullcircle = TRUE) l0 <- length(x$RV.eig) add.scatter.eig(x$RV.eig, l0, 1, 2, posi = "bottomleft", ratio = 1/4) } if (j == 2) { coolig <- x$C.li[, c(xax, yax)] s.label(coolig, sub = "Compromise", csub = 1.5, possub = "topleft", ) add.scatter.eig(x$C.eig, x$C.nf, xax, yax, posi = "bottomleft", ratio = 1/4) } if (j == 4) { cooax <- x$C.T4[x$T4[, 2] == 1, ] s.corcircle(cooax, xax, yax, fullcircle = TRUE, sub = "Component projection", possub = "topright", csub = 1.5) add.scatter.eig(x$C.eig, x$C.nf, xax, yax, posi = "bottomleft", ratio = 1/5) } if (j == 3) { plot(x$RV.tabw, x$cos2, xlab = "Tables weights", ylab = "Cos 2") scatterutil.grid(0) title(main = "Typological value") par(xpd = TRUE) scatterutil.eti(x$RV.tabw, x$cos2, label = x$tab.names, clabel = 1) } } } "print.statis" <- function (x, ...) { cat("STATIS Analysis\n") cat("class:") cat(class(x), "\n") cat("table number:", length(x$RV.tabw), "\n") cat("row number:", nrow(x$C.li), " total column number:", nrow(x$C.Co), "\n") cat("\n **** Interstructure ****\n") cat("\neigen values: ") l0 <- length(x$RV.eig) cat(signif(x$RV.eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n") else cat("\n") cat(" $RV matrix ", nrow(x$RV), " ", ncol(x$RV), " RV coefficients\n") cat(" $RV.eig vector ", length(x$RV.eig), " eigenvalues\n") cat(" $RV.coo data.frame ", nrow(x$RV.coo), " ", ncol(x$RV.coo), " array scores\n") cat(" $tab.names vector ", length(x$tab.names), " array names\n") cat(" $RV.tabw vector ", length(x$RV.tabw), " array weigths\n") cat("\nRV coefficient\n") w <- x$RV w[row(w) < col(w)] <- NA print(w, na = "") cat("\n **** Compromise ****\n") cat("\neigen values: ") l0 <- length(x$C.eig) cat(signif(x$C.eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n") else cat("\n") cat("\n $nf:", x$C.nf, "axis-components saved") cat("\n $rank: ") cat(x$C.rank, "\n") sumry <- array("", c(6, 4), list(rep("", 6), c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$C.li", nrow(x$C.li), ncol(x$C.li), "row coordinates") sumry[2, ] <- c("$C.Co", nrow(x$C.Co), ncol(x$C.Co), "column coordinates") sumry[3, ] <- c("$C.T4", nrow(x$C.T4), ncol(x$C.T4), "principal vectors (each table)") sumry[4, ] <- c("$TL", nrow(x$TL), ncol(x$TL), "factors (not used)") sumry[5, ] <- c("$TC", nrow(x$TC), ncol(x$TC), "factors for Co") sumry[6, ] <- c("$T4", nrow(x$T4), ncol(x$T4), "factors for T4") print(sumry, quote = FALSE) cat("\n") } ade4/R/scatter.fca.R0000644000176200001440000000122612576021756013624 0ustar liggesusers"scatter.fca" <- function (x, xax = 1, yax = 2, clab.moda = 1, labels = names(x$tab), sub = NULL, csub = 2, ...) { opar <- par(mfrow = par("mfrow")) on.exit(par(opar)) if ((xax == yax) || (x$nf == 1)) stop("Unidimensional plot (xax=yax) not yet implemented") par(mfrow = n2mfrow(length(x$blo))) oritab <- eval.parent(as.list(x$call)[[2]]) indica <- factor(rep(names(x$blo), x$blo)) for (j in levels(indica)) s.distri(x$l1, xax= xax, yax=yax, oritab[, which(indica == j)], clabel = clab.moda, sub = as.character(j), cellipse = 0, cstar = 0.5, csub = csub, label = labels[which(indica == j)]) } ade4/R/score.mix.R0000644000176200001440000000540112576021756013335 0ustar liggesusers"score.mix" <- function (x, xax = 1, csub = 2, mfrow = NULL, which.var = NULL, ...) { if (!inherits(x, "mix")) stop("For 'mix' object") if (x$nf == 1) xax <- 1 lm.pcaiv <- function(x, df, weights, use) { if (!inherits(df, "data.frame")) stop("data.frame expected") reponse.generic <- x begin <- "reponse.generic ~ " fmla <- as.formula(paste(begin, paste(names(df), collapse = "+"))) df <- cbind.data.frame(reponse.generic, df) lm0 <- lm(fmla, data = df, weights = weights) if (use == 0) return(predict(lm0)) else if (use == 1) return(residuals(lm0)) else if (use == -1) return(lm0) else stop("Non convenient use") } def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) oritab <- eval.parent(as.list(x$call)[[2]]) nvar <- length(x$index) if (is.null(which.var)) which.var <- (1:nvar) index <- as.character(x$index) if (is.null(mfrow)) par(mfrow = n2mfrow(length(which.var))) if (prod(par("mfrow")) < length(which.var)) par(ask = TRUE) sub <- names(oritab) par(mar = c(2.6, 2.6, 1.1, 1.1)) score <- x$l1[, xax] for (i in which.var) { type.var <- index[i] col.var <- which(x$assign == i) if (type.var == "q") { if (length(col.var) == 1) { y <- x$tab[, col.var] plot(score, y, type = "n") points(score, y, pch = 20) abline(lm(y ~ score), lwd = 2) } else { y <- x$tab[, col.var] plot(score, y[, 1], type = "n") points(score, y[, 1], pch = 20) score.est <- lm.pcaiv(score, y, w = rep(1, nrow(y))/nrow(y), use = 0) ord0 <- order(y[, 1]) lines(score.est[ord0], y[, 1][ord0], lwd = 2) } } else if (type.var == "f") { y <- oritab[, i] moy <- unlist(tapply(score, y, mean)) plot(score, score, type = "n") h <- (max(score) - min(score))/40 abline(h = moy) segments(score, moy[y] - h, score, moy[y] + h) abline(0, 1) scatterutil.eti(moy, moy, label = as.character(levels(y)), clabel = 1) } else if (type.var == "o") { y <- x$tab[, col.var] plot(score, y[, 1], type = "n") points(score, y[, 1], pch = 20) score.est <- lm.pcaiv(score, y, w = rep(1, nrow(y))/nrow(y), use = 0) ord0 <- order(y[, 1]) lines(score.est[ord0], y[, 1][ord0]) } scatterutil.sub(sub[i], csub, "topleft") } } ade4/R/supcol.R0000644000176200001440000000251612576021756012737 0ustar liggesusers"supcol" <- function (x, ...) UseMethod("supcol") "supcol.coa" <- function (x, Xsup, ...) { # modif pour Culhane, Aedin" # supcol renvoie une liste à deux éléments tabsup et cosup Xsup <- data.frame(Xsup) if (!inherits(x, "dudi")) stop("Object of class 'dudi' expected") if (!inherits(x, "coa")) stop("Object of class 'coa' expected") if (!inherits(Xsup, "data.frame")) stop("Xsup is not a data.frame") if (nrow(Xsup) != nrow(x$tab)) stop("non convenient row numbers") cwsup <- apply(Xsup, 2, sum) cwsup[cwsup == 0] <- 1 Xsup <- sweep(Xsup, 2, cwsup, "/") coosup <- t(as.matrix(Xsup)) %*% as.matrix(x$l1) coosup <- data.frame(coosup, row.names = names(Xsup)) names(coosup) <- names(x$co) return(list(tabsup=Xsup, cosup=coosup)) } "supcol.dudi" <- function (x, Xsup, ...) { Xsup <- data.frame(Xsup) if (!inherits(x, "dudi")) stop("Object of class 'dudi' expected") if (!inherits(Xsup, "data.frame")) stop("Xsup is not a data.frame") if (nrow(Xsup) != nrow(x$tab)) stop("non convenient row numbers") coosup <- t(as.matrix(Xsup)) %*% (as.matrix(x$l1) * x$lw) coosup <- data.frame(coosup, row.names = names(Xsup)) names(coosup) <- names(x$co) return(list(tabsup=Xsup, cosup=coosup)) } ade4/R/mbpcaiv.R0000644000176200001440000002511713621207552013045 0ustar liggesusersmbpcaiv <- function(dudiY, ktabX, scale = TRUE, option = c("uniform", "none"), scannf = TRUE, nf = 2) { ## ------------------------------------------------------------------------------- ## Some tests ##-------------------------------------------------------------------------------- if (!inherits(dudiY, "dudi")) stop("object 'dudi' expected") if (!inherits(ktabX, "ktab")) stop("object 'ktab' expected") if (any(row.names(ktabX) != row.names(dudiY$tab))) stop("ktabX and dudiY must have the same rows") if (!(all.equal(ktabX$lw/sum(ktabX$lw), dudiY$lw/sum(dudiY$lw)))) stop("ktabX and dudiY must have the same row weights") if (nrow(dudiY$tab) < 6) stop("Minimum six rows are required") if (any(ktabX$blo < 2)) stop("Minimum two variables per explanatory block are required") if (!(is.logical(scale))) stop("Non convenient selection for scaling") if (!(is.logical(scannf))) stop("Non convenient selection for scannf") if (nf < 0) nf <- 2 ## Only works with centred pca (dudi.pca with center=TRUE) with uniform row weights # if (!any(dudi.type(dudiY$call) == c(3,4))) # stop("Only implemented for centred pca") # Vérifier la formule / arrondi #if (any(dudiY$lw != 1/nrow(dudiY$tab))) # stop("Only implemented for uniform row weights") option <- match.arg(option) ## ------------------------------------------------------------------------------- ## Arguments and data transformation ## ------------------------------------------------------------------------------- ## Preparation of the data frames Y <- scalewt(as.matrix(dudiY$tab), wt = dudiY$lw, center = TRUE, scale = scale) nblo <- length(ktabX$blo) Xk <- lapply(unclass(ktabX)[1 : nblo], scalewt, wt = ktabX$lw, center = TRUE, scale = scale) nr <- nrow(Y) ncolY <- ncol(Y) ## Block weighting if (option[1] == "uniform"){ Y <- Y / sqrt(sum(dudiY$eig)) ## Here we use biased variance. We should use Y <- Y / sqrt(nr/(nr-1)*sum(dudiY$eig)) for unbiased estimators for (k in 1 : nblo){ Xk[[k]] <- Xk[[k]] / sqrt((nblo/nr) * sum(diag(crossprod(Xk[[k]])))) ## same : Xk[[k]] <- Xk[[k]] / sqrt((nblo/(nr-1)) * sum(diag(crossprod(Xk[[k]])))) for unbiased estimators } } X <- cbind.data.frame(Xk) colnames(X) <- col.names(ktabX) ncolX <- ncol(X) maxdim <- qr(X)$rank ##----------------------------------------------------------------------- ## Prepare the outputs ##----------------------------------------------------------------------- ## Yc1 (V in Bougeard et al): was c1 ## lY (U): was ls ## Ajout: de Yco (cov(Y, lX)) -> norme total = eig ## lX (T): was li ## faX (W*): was Wstar ## Tl1 (Tk): was Tk ## Ajout: Tli (Tk non normé = Tk2) norme total = eig ## Tfa (Wk): was Wk ## Ajout: cov2 (cov^2(lY, Tl1)) ## XYcoef: (Beta) was beta ## bip, bipc ## vip, vipc ## Suppression: W ## Suppression: l1 ## Suppression de C (remplacé par Yco) ## Suppression de Ak (remplacé par cov2) dimlab <- paste("Ax", 1:maxdim, sep = "") res <- list(tabX = X, tabY = as.data.frame(Y), nf = nf, lw = ktabX$lw, X.cw = ktabX$cw, blo = ktabX$blo, rank = maxdim, eig = rep(0, maxdim), TL = ktabX$TL, TC = ktabX$TC) res$Yc1 <- matrix(0, nrow = ncolY, ncol = maxdim, dimnames = list(colnames(dudiY$tab), dimlab)) res$lX <- res$lY <- matrix(0, nrow = nr, ncol = maxdim, dimnames = list(row.names(dudiY$tab), dimlab)) res$cov2 <- Ak <- matrix(0, nrow = nblo, ncol = maxdim, dimnames = list(names(ktabX$blo), dimlab)) res$Tfa <- lapply(1:nblo, function(k) matrix(0, nrow = ncol(Xk[[k]]), ncol = maxdim, dimnames = list(colnames(Xk[[k]]), dimlab))) res$Tli <- res$Tl1 <- rep(list(matrix(0, nrow = nr, ncol = maxdim, dimnames = list(row.names(dudiY$tab), dimlab))), nblo) res$faX <- matrix(0, nrow = ncolX, ncol = maxdim, dimnames = list(col.names(ktabX), dimlab)) lX1 <- res$lX W <- res$faX ##----------------------------------------------------------------------- ## Compute components and loadings by an iterative algorithm ##----------------------------------------------------------------------- Y <- as.matrix(Y) X <- as.matrix(X) f1 <- function(x) lm.wfit(x = x, y = Y, w = res$lw)$fitted.values for(h in 1 : maxdim) { ## iterative algorithm ## Compute the matrix M for the eigenanalysis M <- lapply(lapply(Xk, f1), function (x) crossprod(x * sqrt(res$lw))) M <- Reduce("+", M) ## Compute the loadings V and the components U (Y dataset) eig.M <- eigen(M) if (eig.M$values[1] < sqrt(.Machine$double.eps)) { res$rank <- h-1 ## update the rank break } res$eig[h] <- eig.M$values[1] res$Yc1[, h] <- eig.M$vectors[, 1, drop = FALSE] res$lY[, h] <- Y %*% res$Yc1[, h] ## Compute the loadings Wk and the components Tk (Xk datasets) covutcarre <- 0 covutk <- rep(0, nblo) for (k in 1 : nblo) { lm1 <- lm.wfit(x = Xk[[k]], y = res$lY[, h], w = res$lw) res$Tfa[[k]][, h] <- lm1$coefficients / sqrt(sum(res$lw * lm1$fitted.values^2)) res$Tl1[[k]][, h] <- scalewt(lm1$fitted.values, wt = res$lw) res$Tli[[k]][, h] <- lm1$fitted.values covutk[k] <- crossprod(res$lY[, h] * res$lw, res$Tl1[[k]][, h]) res$cov2[k, h] <- covutk[k]^2 covutcarre <- covutcarre + res$cov2[k, h] } for(k in 1 : nblo) { Ak[k, h] <- covutk[k] / sqrt(sum(res$cov2[,h])) res$lX[, h] <- res$lX[, h] + Ak[k, h] * res$Tl1[[k]][, h] } lX1[, h] <- res$lX[, h] / sqrt(sum(res$lX[, h]^2)) ## use ginv to avoid NA in coefficients (collinear system) W[, h] <- tcrossprod(ginv(crossprod(X)), X) %*% res$lX[, h] ## Deflation of the Xk datasets on the global components T Xk <- lapply(Xk, function(y) lm.wfit(x = as.matrix(res$lX[, h]), y = y, w = res$lw)$residuals) X <- as.matrix(cbind.data.frame(Xk)) } ##----------------------------------------------------------------------- ## Compute regressions coefficients ##----------------------------------------------------------------------- ## Use of the original (and not the deflated) datasets X and Y X <- as.matrix(res$tabX) Y <- as.matrix(res$tabY) ## Computing the regression coefficients of X onto the global components T (Wstar) ## res$faX <- lm.wfit(x = X, y = res$lX, w = res$lw)$coefficients ## lm is not used to avoid NA coefficients in the case of not full rank matrices res$faX[, 1] <- W[, 1, drop = FALSE] A <- diag(ncolX) if(maxdim >= 2){ for(h in 2:maxdim){ a <- crossprod(lX1[, h-1], X) / sqrt(sum(res$lX[, h-1]^2)) A <- A %*% (diag(ncolX) - W[, h-1] %*% a) res$faX[, h] <- A %*% W[, h] X <- X - tcrossprod(lX1[, h-1]) %*% X } } ## Computing the regression coefficients of X onto Y (Beta) res$Yco <- t(Y) %*% diag(res$lw) %*% res$lX norm.li <- diag(crossprod(res$lX * sqrt(res$lw))) ##res$C <- t(lm.wfit(x = res$lX, y = Y, w = res$lw)$coefficients) ##res$XYcoef <- lapply(1:ncolY, function(x) t(apply(sweep(res$faX, 2 , res$C[x,], "*"), 1, cumsum))) res$XYcoef <- lapply(1:ncolY, function(x) t(apply(sweep(res$faX, 2 , res$Yco[x,] / norm.li, "*"), 1, cumsum))) names(res$XYcoef) <- colnames(dudiY$tab) ## Computing the intercept X <- cbind.data.frame(lapply(unclass(ktabX)[1 : nblo], scalewt, wt = dudiY$lw, center = FALSE, scale = scale)) if (any(apply(X, 2, weighted.mean, w = dudiY$lw) < sqrt(.Machine$double.eps)) == FALSE & scale == TRUE) { ## i.e. center=F, scale=T meanY <- apply(sweep(as.matrix(dudiY$tab), 2, sqrt(apply(dudiY$tab, 2, varwt, wt = dudiY$lw)), "/"), 2, weighted.mean, w = dudiY$lw) meanX <- apply(sweep(as.matrix(X), 2, sqrt(apply(X, 2, varwt, wt = dudiY$lw)), "/"), 2, weighted.mean, w = dudiY$lw) } else { meanY <- apply(as.matrix(dudiY$tab), 2, weighted.mean, w = dudiY$lw) meanX <- apply(as.matrix(X), 2, weighted.mean, w = dudiY$lw) } res$intercept <- lapply(1:ncolY, function(x) (meanY[x] - meanX %*% res$XYcoef[[x]])) names(res$intercept) <- colnames(dudiY$tab) ##----------------------------------------------------------------------- ## Variable and block importances ##----------------------------------------------------------------------- ## Block importances res$bip <- Ak^2 if (nblo == 1 | res$rank ==1) res$bipc <- res$bip else res$bipc <- t(sweep(apply(sweep(res$bip, 2, res$eig, "*") , 1, cumsum), 1, cumsum(res$eig), "/")) ## Variable importances WcarreAk <- res$faX^2 * res$bip[rep(1:nblo, ktabX$blo),] res$vip <- sweep(WcarreAk, 2, colSums(WcarreAk), "/") if (nblo == 1 | res$rank ==1) res$vipc <- res$vip else res$vipc <- t(sweep(apply(sweep(res$vip, 2, res$eig, "*") , 1, cumsum), 1, cumsum(res$eig), "/")) ##----------------------------------------------------------------------- ## Modify the outputs ##----------------------------------------------------------------------- if (scannf) { barplot(res$eig[1:res$rank]) cat("Select the number of global components: ") res$nf <- as.integer(readLines(n = 1)) messageScannf(match.call(), res$nf) } if(res$nf > res$rank) res$nf <- res$rank ## keep results for the nf dimensions (except eigenvalues and lX) res$eig <- res$eig[1:res$rank] res$lX <- res$lX[, 1:res$rank] res$Tfa <- do.call("rbind", res$Tfa) res$Tl1 <- do.call("rbind", res$Tl1) res$Tli <- do.call("rbind", res$Tli) res <- modifyList(res, lapply(res[c("Yc1", "Yco", "lY", "Tfa", "Tl1", "Tli", "cov2", "faX", "vip", "vipc", "bip", "bipc")], function(x) x[, 1:res$nf, drop = FALSE])) res$XYcoef <- lapply(res$XYcoef, function(x) x[, 1:res$nf, drop = FALSE]) res$intercept <- lapply(res$intercept, function(x) x[, 1:res$nf, drop = FALSE]) res$call <- match.call() class(res) <- c("multiblock", "mbpcaiv") return(res) } ade4/R/p.adjust.4thcorner.R0000644000176200001440000000323212576021756015065 0ustar liggesusersp.adjust.4thcorner <- function(x, p.adjust.method.G = p.adjust.methods, p.adjust.method.D = p.adjust.methods, p.adjust.D = c("global", "levels")){ if(!inherits(x, "4thcorner") & !inherits(x, "4thcorner.rlq")) stop("x must be of class '4thcorner' or '4thcorner.rlq'") p.adjust.D <- match.arg(p.adjust.D) p.adjust.method.D <- match.arg(p.adjust.method.D) p.adjust.method.G <- match.arg(p.adjust.method.G) ## for objects created by fourthcorner, fourthcorner2 or fourthcorner.rlq x$tabG$adj.pvalue <- p.adjust(x$tabG$pvalue, method=p.adjust.method.G) x$tabG$adj.method <- p.adjust.method.G ## tabD and tabD2 (i.e. not fourthcorner2) if(!inherits(x, "4thcorner.rlq")){ if(p.adjust.D == "global"){ x$tabD$adj.pvalue <- p.adjust(x$tabD$pvalue, method=p.adjust.method.D) x$tabD2$adj.pvalue <- p.adjust(x$tabD2$pvalue, method=p.adjust.method.D) x$tabD$adj.method <- x$tabD2$adj.method <- p.adjust.method.D } if(p.adjust.D == "levels"){ ## adjustment only between levels of a factor (corresponds to the original paper of Legendre et al. 1997) for (i in 1:length(x$varnames.Q)){ for (j in 1:length(x$varnames.R)){ idx.varR <- which(x$assignR == j) idx.varQ <- which(x$assignQ == i) idx.vars <- length(x$varnames.R) * (idx.varQ - 1) + idx.varR x$tabD$adj.pvalue[idx.vars] <- p.adjust(x$tabD$pvalue[idx.vars], method = p.adjust.method.D) x$tabD2$adj.pvalue[idx.vars] <- p.adjust(x$tabD2$pvalue[idx.vars], method = p.adjust.method.D) } } x$tabD$adj.method <- x$tabD2$adj.method <- paste(p.adjust.method.D, "by levels") } } return(x) } ade4/R/uniquewt.df.R0000644000176200001440000000061212576021756013676 0ustar liggesusers"uniquewt.df" <- function (x) { x <- data.frame(x) col <- ncol(x) w <- unlist(x[1]) for (j in 2:col) { w <- paste(w, x[, j], sep = "") } w <- factor(w, unique(w)) levels(w) <- 1:length(unique(w)) select <- match(1:length(w), w)[1:nlevels(w)] x <- x[select, ] attr(x, "factor") <- w attr(x, "len.class") <- as.vector(table(w)) return(x) } ade4/R/multiblock.R0000644000176200001440000002104113621207675013567 0ustar liggesusersrandboot.multiblock <- function(object, nrepet = 199, optdim, ...) { if (!inherits(object, "multiblock")) stop("Object of type 'mbpcaiv' or 'mbpls' expected") if ((optdim < 0) | (optdim > object$rank)) stop("Wrong number for optimal dimension") ## get some arguments appel <- as.list(object$call) method <- as.character(appel[[1]]) scale <- eval.parent(appel$scale) option <- eval.parent(appel$option) X <- eval.parent(appel$ktabX) Y <- eval.parent(appel$dudiY) nr <- nrow(Y$tab) ncY <- ncol(Y$tab) h <- object$rank nblo <- length(object$blo) ## number of X tables ncX <- sum(X$blo) ## total number of variables in X ## prepare the outputs res <- list() res$XYcoef <- list() res$XYcoef <- rep(list(matrix(0, ncol = ncX, nrow = nrepet, dimnames = list(NULL, colnames(object$tabX)))), ncY) res$bipc <- matrix(0, ncol = nblo, nrow = nrepet) colnames(res$bipc) <- names(X$blo) res$vipc <- matrix(0, ncol = ncX, nrow = nrepet) colnames(res$vipc) <- colnames(object$tabX) ## bootstrap and outputs for (i in 1 : nrepet){ s <- sample(x = nr, replace = TRUE) Xboot <- X[, s, ] Yboot <- Y[s, ] resboot <- do.call(method, list(dudiY = Yboot, ktabX = Xboot, scale = scale, option = option, scannf = FALSE, nf = as.integer(optdim))) for (k in 1:ncY) res$XYcoef[[k]][i, ] <- resboot$XYcoef[[k]][, optdim] res$bipc[i, ] <- resboot$bipc[, optdim] res$vipc[i, ] <- resboot$vipc[, optdim] } thecall <- match.call() res$XYcoef <- lapply(1:ncY, function(x) as.krandboot(obs = object$XYcoef[[x]][, optdim], boot = res$XYcoef[[x]], call = thecall)) names(res$XYcoef) <- colnames(object$tabY) res$bipc <- as.krandboot(obs = object$bipc[, optdim], boot = res$bipc, call = thecall, ...) res$vipc <- as.krandboot(obs = object$vipc[, optdim], boot = res$vipc, call = thecall, ...) return(res) } testdim.multiblock <- function(object, nrepet = 100, quantiles = c(0.25, 0.75), ...){ if (!inherits(object, "multiblock")) stop("Object of type 'mbpcaiv' or 'mbpls' expected") ## get some arguments appel <- as.list(object$call) method <- as.character(appel[[1]]) scale <- eval.parent(appel$scale) option <- eval.parent(appel$option) X <- eval.parent(appel$ktabX) Y <- eval.parent(appel$dudiY) nr <- nrow(Y$tab) q <- ncol(Y$tab) h <- object$rank ## prepare outputs dimlab <- paste("Ax", (1 : h), sep = "") RMSEV <- RMSEC <- matrix(NA, nrow = nrepet, ncol = h) colnames(RMSEV) <- colnames(RMSEC) <- dimlab rownames(RMSEV) <- rownames(RMSEC) <- 1:nrepet ## Two-fold cross validation Nc <- round(2 * nr / 3) Nv <- nr - Nc for(i in 1 : nrepet) { ## Dividing X and Y into calibration (Xc, Yc) and validation (Xv, Yv) datasets s <- sample(x = nr, size = Nc) Xc <- X[, s, ] Xv <- X[, -s, ] Yc <- Y[s, ] Yv <- Y[-s, ] ## Applying the multiblock method to the calibration/validation datasets rescal <- do.call(method, list(dudiY = Yc, ktabX = Xc, scale = scale, option = option, scannf = FALSE, nf = h)) resval <- do.call(method, list(dudiY = Yv, ktabX = Xv, scale = scale, option = option, scannf = FALSE, nf = h)) ## Compute Root Mean Square Errors of Calibration (RMSEC) and Validation (RMSEV) nblo <- length(Xc$blo) Xc.mat <- cbind.data.frame(unclass(Xc)[1:nblo]) Xv.mat <- cbind.data.frame(unclass(Xv)[1:nblo]) for(j in 1 : min(rescal$rank, resval$rank, h)){ XYcoef.cal <- sapply(rescal$XYcoef, function(x) x[, j]) intercept.cal <- sapply(rescal$intercept, function(x) x[, j]) residYc <- as.matrix(Yc$tab) - (matrix(rep(intercept.cal, each = Nc), ncol = q) + as.matrix(Xc.mat) %*% XYcoef.cal) RMSEC[i, j] <- sqrt(sum(residYc^2) / (Nc * q)) residYv <- as.matrix(Yv$tab) - (matrix(rep(intercept.cal, each = Nv), ncol = q) + as.matrix(Xv.mat) %*% XYcoef.cal) RMSEV[i, j] <- sqrt(sum(residYv^2) / (Nv * q)) } } res <- as.krandxval(RMSEC, RMSEV, call = match.call(), quantiles = quantiles) return(res) } summary.multiblock <- function(object, ...) { if (!inherits(object, "multiblock")) stop("to be used with 'mbpcaiv' or 'mbpls' object") thetitle <- ifelse(inherits(object, "mbpcaiv"), "Multiblock principal component analysis with instrumental variables", "Multiblock partial least squares") cat(thetitle) cat("\n\n") Xk <- ktab.data.frame(df = object$tabX, blocks = object$blo, tabnames = names(object$blo)) k <- length(object$blo) h <- object$rank appel <- as.list(object$call) ## Summary for eigenvalues and inertia summary.dudi(object) ## Summary for the variances of Y and X explained by the global component (lX) varT <- diag(crossprod(object$lX * object$lw, object$lX)) covarTY <- diag(tcrossprod(crossprod(object$lX * object$lw, as.matrix(object$tabY)))) varexplTY <- (covarTY/varT) / sum(covarTY/varT) * 100 varexplTYcum <- cumsum(varexplTY) / sum(varexplTY) * 100 covarTX <- diag(tcrossprod(crossprod(object$lX * object$lw, as.matrix(object$tabX)))) varexplTX <- (covarTX/varT) / sum(covarTX/varT) * 100 varexplTXcum <- cumsum(varexplTX) / sum(varexplTX) * 100 cat(paste("Inertia explained by the global latent, i.e.,", deparse(substitute(object$lX)), "(in %): \n\n")) sumry <- array(0, c(object$nf, 4), list(1:object$nf, c("varY", "varYcum", "varX", "varXcum"))) sumry[, 1] <- varexplTY[1 : object$nf] sumry[, 2] <- varexplTYcum[1 : object$nf] sumry[, 3] <- varexplTX[1 : object$nf] sumry[, 4] <- varexplTXcum[1 : object$nf] rownames(sumry) <- colnames(object$lX)[1:object$nf] cat(paste(deparse(appel$dudiY), "$tab", " and ", deparse(appel$ktabX), ": \n", sep = '')) print(sumry, digits = 3) ## Summary for the variances of Xk explained by the global component (lX) sumryk <- list() for (j in 1:k) { covarTXk <- diag(tcrossprod(crossprod(object$lX * object$lw, as.matrix(Xk[[j]])))) varexplTXk <- (covarTXk/varT) / sum(covarTXk/varT) * 100 varexplTXkcum <- cumsum(varexplTXk) / sum(varexplTXk) * 100 sumryk[[j]] <- cbind.data.frame(varXk = varexplTXk[1 : object$nf], varXkcum = varexplTXkcum[1 : object$nf]) cat("\n") cat(paste(names(object$blo[j])), ":\n", sep = '') print(sumryk[[j]], digits = 3) } names(sumryk) <- names(object$blo) res <- c(list(YandX = sumry), sumryk) invisible(res) } print.multiblock <- function (x, ...) { if (!inherits(x, "multiblock")) stop("to be used with 'mbpcaiv' or 'mbpls' object") thetitle <- ifelse(inherits(x, "mbpcaiv"), "Multiblock principal component analysis with instrumental variables", "Multiblock partial least squares") cat(thetitle) cat(paste("\nlist of class", class(x))) l0 <- length(x$eig) cat("\n\n$eig:", l0, "eigen values\n") cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n") else cat("\n") cat("\n$call: ") print(x$call) cat("\n$nf:", x$nf, "axis saved\n\n") showed.names <- c("nf", "call", "eig", "lX", "lY", "Tli", "Yco", "faX", "bip", "bipc", "vip", "vipc", "cov2") sumry <- array("", c(10, 4), list(1:10, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$lX", nrow(x$lX), ncol(x$lX), "global components of the explanatory tables") sumry[2, ] <- c("$lY", nrow(x$lY), ncol(x$lY), "components of the dependent data table") sumry[3, ] <- c("$Tli", nrow(x$Tli), ncol(x$Tli), "partial components") sumry[4, ] <- c("$Yco", nrow(x$Yco), ncol(x$Yco), "inertia axes onto co-inertia axis") sumry[5, ] <- c("$faX", nrow(x$faX), ncol(x$faX), "loadings to build the global components") sumry[6, ] <- c("$bip", nrow(x$bip), ncol(x$bip), "block importances") sumry[7, ] <- c("$bipc", nrow(x$bipc), ncol(x$bipc), "cumulated block importances") sumry[8, ] <- c("$vip", nrow(x$vip), ncol(x$vip), "variable importances") sumry[9, ] <- c("$vipc", nrow(x$vipc), ncol(x$vipc), "cumulated variable importances") sumry[10, ] <- c("$cov2", nrow(x$cov2), ncol(x$cov2), "squared covariance between components") if(inherits(x, "mbpls")) sumry <- sumry[-3,] print(sumry, quote = FALSE) cat("other elements: ") cat(names(x)[!(names(x)%in%showed.names)], "\n") } ade4/R/kplot.mcoa.R0000644000176200001440000000513112576021756013475 0ustar liggesusers"kplot.mcoa" <- function (object, xax = 1, yax = 2, which.tab = 1:nrow(object$cov2), mfrow = NULL, option = c("points", "axis", "columns"), clab = 1, cpoint = 2, csub = 2, possub = "bottomright", ...) { if (!inherits(object, "mcoa")) stop("Object of type 'mcoa' expected") opar <- par(ask = par("ask"), mfrow = par("mfrow"), mar = par("mar")) on.exit(par(opar)) option <- option[1] if (option == "points") { if (is.null(mfrow)) mfrow <- n2mfrow(length(which.tab) + 1) par(mfrow = mfrow) if (length(which.tab) > prod(mfrow) - 1) par(ask = TRUE) par(mar = c(0.1, 0.1, 0.1, 0.1)) coo1 <- object$SynVar[, c(xax, yax)] cootot <- object$Tl1[, c(xax, yax)] names(cootot) <- names(coo1) coofull <- coo1 for (i in which.tab) coofull <- rbind.data.frame(coofull, cootot[object$TL[, 1] == levels(object$TL[,1])[i], ]) s.label(coo1, clabel = clab, sub = "Reference", possub = "bottomright", csub = csub) for (ianal in which.tab) { scatterutil.base(coofull, 1, 2, xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0, 0), sub = row.names(object$cov2)[ianal], csub = csub, possub = possub, pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) coo2 <- cootot[object$TL[, 1] == levels(object$TL[,1])[ianal], 1:2] s.match(coo1, coo2, clabel = 0, add.plot = TRUE) s.label(coo1, clabel = 0, cpoint = cpoint, add.plot = TRUE) } return(invisible()) } if (is.null(mfrow)) mfrow <- n2mfrow(length(which.tab)) par(mfrow = mfrow) if (option == "axis") { if (length(which.tab) > prod(mfrow)) par(ask = TRUE) for (ianal in which.tab) { coo2 <- object$Tax[object$T4[, 1] == levels(object$T4[,1])[ianal], c(xax, yax)] row.names(coo2) <- as.character(1:4) s.corcircle(coo2, clabel = clab, sub = row.names(object$cov2)[ianal], csub = csub, possub = possub) } return(invisible()) } if (option == "columns") { if (length(which.tab) > prod(mfrow)) par(ask = TRUE) for (ianal in which.tab) { coo2 <- object$Tco[object$TC[, 1] == levels(object$TC[,1])[ianal], c(xax, yax)] s.arrow(coo2, clabel = clab, sub = row.names(object$cov2)[ianal], csub = csub, possub = possub) } return(invisible()) } } ade4/R/apqe.R0000644000176200001440000001114612576021756012357 0ustar liggesusersapqe <- function(samples, dis = NULL, structures = NULL){ # checking of user's data and initialization. if (!inherits(samples, "data.frame")) stop("Non convenient samples") if (any(as.matrix(samples) <= -1e-8)) stop("Negative value in samples") nhap <- nrow(samples) ; nsam <- ncol(samples) if (!is.null(dis)) { if (!inherits(dis, "dist")) stop("Object of class 'dist' expected for distance") if (!is.euclid(dis)) stop("Euclidean property is expected for distance") dis <- as.matrix(dis)^2 if (nrow(samples)!= nrow(dis)) stop("Non convenient samples") } if (is.null(dis)) dis <- (matrix(1, nhap, nhap) - diag(rep(1, nhap))) * 2 if (!is.null(structures)) { if (!inherits(structures, "data.frame")) stop("Non convenient structures") m <- match(apply(structures, 2, function(x) length(x)), ncol(samples), 0) if (length(m[m == 1]) != ncol(structures)) stop("Non convenient structures") m <- match(tapply(1:ncol(structures), as.factor(1:ncol(structures)), function(x) is.factor(structures[, x])), TRUE , 0) if (length(m[m == 1]) != ncol(structures)) stop("Non convenient structures") } # intern functions (computations of the sums of squares and mean squares): Diversity <- function(d2, nbhaplotypes, freq){ # diversity index according to Rao s quadratic entropy div <- nbhaplotypes / 2 * (t(freq) %*% d2 %*% freq) } Ssd.util <- function(dp2, Np, unit){ # Dissimilarity between two groups. Weight and composition of a group. if (!is.null(unit)) { modunit <- model.matrix(~ -1 + unit) sumcol <- apply(Np, 2, sum) Ng <- modunit * sumcol lesnoms <- levels(unit) } else{ Ng <- as.matrix(Np) lesnoms <- colnames(Np) } sumcol <- apply(Ng, 2, sum) Lg <- t(t(Ng) / sumcol) colnames(Lg) <- lesnoms Pg <- as.matrix(apply(Ng, 2, sum) / nbhaplotypes) rownames(Pg) <- lesnoms deltag <- as.matrix(apply(Lg, 2, function(x) t(x) %*% dp2 %*% x)) ug <- matrix(1, ncol(Lg), 1) dg2 <- t(Lg) %*% dp2 %*% Lg - 1 / 2 * (deltag %*% t(ug) + ug %*% t(deltag)) colnames(dg2) <- lesnoms rownames(dg2) <- lesnoms return(list(dg2 = dg2, Ng = Ng, Pg = Pg)) } Ssd <- function(dis, nbhaplotypes, samples, structures) { # Computation of the sum of squared deviation. Ph <- as.matrix(apply(samples, 1, sum) / nbhaplotypes) ssdt <- nbhaplotypes / 2 * t(Ph) %*% dis %*% Ph ssdutil <- list(0) ssdutil[[1]] <- Ssd.util(dp2 = dis, Np = samples, NULL) if (!is.null(structures)) { for (i in 1:length(structures)) { if (i != 1) { unit <- structures[(1:length(structures[, i]))[!duplicated(structures[, i - 1])], i] unit <- factor(unit, levels = unique(unit)) } else unit <- factor(structures[, i], levels = unique(structures[, i])) ssdutil[[i + 1]] <- Ssd.util(ssdutil[[i]]$dg2, ssdutil[[i]]$Ng, unit) } } diversity <- c(ssdt, unlist(lapply(ssdutil, function(x) nbhaplotypes / 2 * t(x$Pg) %*% x$dg2 %*% x$Pg))) diversity2 <- c(diversity[-1], 0) ssdtemp <- diversity - diversity2 ssd <- c(ssdtemp[length(ssdtemp):1], ssdt) return(ssd) } # main procedure. nbhaplotypes <- sum(samples) ssd <- Ssd(dis, nbhaplotypes, samples, structures) / nbhaplotypes # Interface. if (!is.null(structures)) { lesnoms1 <- rep("Between", ncol(structures) + 1) lesnoms2 <- c(names(structures)[ncol(structures):1], "samples") lesnoms3 <- c("", rep("Within", ncol(structures))) lesnoms4 <- c("", names(structures)[ncol(structures):1]) lesnoms <- c(paste(lesnoms1, lesnoms2, lesnoms3, lesnoms4), "Within samples", "Total") } else lesnoms <- c("Between samples", "Within samples", "Total") results <- data.frame(ssd) names(results) <- c("diversity") rownames(results) <- lesnoms sourceofvariation <- c(paste("Variations ", rownames(results)[1:(nrow(results) - 1)]), "Total variations") call <- match.call() res <- list(call = call, results = results, dis = as.dist(dis), samples = samples, structures = structures) class(res) <- "apqe" return(res) } print.apqe <- function(x, full = FALSE, ...){ if (full == TRUE) print(x) else print(x[-((length(x) - 2):length(x))]) } ade4/R/scatter.acm.R0000644000176200001440000000163612576021756013640 0ustar liggesusers"scatter.acm" <- function (x, xax = 1, yax = 2, mfrow=NULL, csub = 2, possub = "topleft", ...) { if (!inherits(x, "acm")) stop("For 'acm' object") if (x$nf == 1) { score.acm(x, 1) return(invisible()) } def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) oritab <- eval.parent(as.list(x$call)[[2]]) nvar <- ncol(oritab) # modif samedi, juin 11, 2005 at 15:38 # message de Ivailo Stoyanov istoyanov@ecolab.bas.bg if (is.null(mfrow)) mfrow = n2mfrow(nvar) old.par <- par(no.readonly = TRUE) on.exit(par(old.par)) par(mfrow = mfrow) if (prod(mfrow)0)<2) return (NULL) sumcol <- apply(x,2,sum) if (sum(sumcol>0)<2) return (NULL) return(dudi.coa(x, scannf = FALSE)$eig) } names(listbloc) <- t(outer(names(rowblo),names(colblo),function(x,y) paste(x,y,sep="/"))) result <- lapply(listbloc,fun1) if (!plot) return(result) opar <- par(ask = par("ask"), mfrow = par("mfrow"), mar = par("mar")) on.exit(par(opar)) par(mar = c(0.6, 2.6, 0.6, 0.6)) nbloc <- length(result) if (is.null(mfrow)) mfrow <- n2mfrow(nbloc) par(mfrow = mfrow) if (nbloc > prod(mfrow)) par(ask = TRUE) neig <- max(unlist(lapply(result,length))) maxeig <- max(unlist(result)) for (ianal in 1:nbloc) { w <- result[[ianal]] su0 <- names(result)[ianal] scatterutil.eigen(w, xmax = neig, ymax = maxeig, wsel = 0, sub = su0, csub = csub, possub = "topright",yaxt="s") } return(invisible(result)) } ade4/R/wca.coinertia.R0000644000176200001440000001413013175633655014156 0ustar liggesuserswca.coinertia <- function (x, fac, scannf = TRUE, nf = 2, ...) { if (!inherits(x, "coinertia")) stop("Object of class coinertia expected") if (!is.factor(fac)) stop("factor expected") appel <- as.list(x$call) dudiX <- eval.parent(appel$dudiX) dudiY <- eval.parent(appel$dudiY) ligX <- nrow(dudiX$tab) if (length(fac) != ligX) stop("Non convenient dimension") mean.w <- function(x, w, fac, cla.w) { z <- x * w z <- tapply(z, fac, sum)/cla.w return(z) } cla.w <- tapply(dudiX$lw, fac, sum) tabmoyX <- apply(dudiX$tab, 2, mean.w, w = dudiX$lw, fac = fac, cla.w = cla.w) tabmoyY <- apply(dudiY$tab, 2, mean.w, w = dudiY$lw, fac = fac, cla.w = cla.w) tabwitX <- dudiX$tab - tabmoyX[fac, ] names(tabwitX) <- names(dudiX$tab) row.names(tabwitX) <- row.names(dudiX$tab) tabwitY <- dudiY$tab - tabmoyY[fac, ] names(tabwitY) <- names(dudiY$tab) row.names(tabwitY) <- row.names(dudiY$tab) dudiwitX <- as.dudi(tabwitX, dudiX$cw, dudiX$lw, scannf = FALSE, nf = nf, call = match.call(), type = "wit") dudiwitY <- as.dudi(tabwitY, dudiY$cw, dudiY$lw, scannf = FALSE, nf = nf, call = match.call(), type = "wit") res <- coinertia(dudiwitX, dudiwitY, scannf = scannf, nf = nf) res$call <- match.call() ## cov=covB+covW, donc ce n'est pas vrai pour les carres et donc la coinertie ## res$ratio <- sum(res$eig)/sum(x$eig) U <- as.matrix(res$l1) * unlist(res$lw) U <- data.frame(as.matrix(dudiY$tab) %*% U) row.names(U) <- row.names(dudiY$tab) names(U) <- names(res$l1) res$lsY <- U U <- as.matrix(res$c1) * unlist(res$cw) U <- data.frame(as.matrix(dudiX$tab) %*% U) row.names(U) <- row.names(dudiX$tab) names(U) <- names(res$c1) res$lsX <- U ratioX<-unlist(res$mX[1,]/res$lX[1,]) res$msX<-data.frame(t(t(res$lsX)*ratioX)) row.names(res$msX) <- row.names(res$lsX) names(res$msX) <- names(res$mX) ratioY<-unlist(res$mY[1,]/res$lY[1,]) res$msY<-data.frame(t(t(res$lsY)*ratioY)) row.names(res$msY) <- row.names(res$lsY) names(res$msY) <- names(res$mY) U <- as.matrix(res$l1) * unlist(res$lw) U <- data.frame(t(as.matrix(x$l1)) %*% U) row.names(U) <- paste("AxcY", (1:x$nf), sep = "") names(U) <- paste("AxwcY", (1:res$nf), sep = "") res$acY <- U names(res$aY)<-names(res$lY)<-names(res$lsY)<-names(res$acY) U <- as.matrix(res$c1) * unlist(res$cw) U <- data.frame(t(as.matrix(x$c1)) %*% U) row.names(U) <- paste("AxcX", (1:x$nf), sep = "") names(U) <- paste("AxwcX", (1:res$nf), sep = "") res$acX <- U names(res$aX)<-names(res$lX)<-names(res$lsX)<-names(res$acX) class(res) <- c("witcoi","dudi") return(res) } plot.witcoi <- function(x, xax = 1, yax = 2, ...) { if (!inherits(x, "witcoi")) stop("Use only with 'witcoi' objects") if (x$nf == 1) { warnings("One axis only : not yet implemented") return(invisible()) } if (xax > x$nf) stop("Non convenient xax") if (yax > x$nf) stop("Non convenient yax") appel <- as.list(x$call) fac <- eval.parent(appel$fac) def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) nf <- layout(matrix(c(1, 2, 3, 4, 4, 5, 4, 4, 6), 3, 3), respect = TRUE) par(mar = c(0.1, 0.1, 0.1, 0.1)) s.arrow(x$aX, xax, yax, sub = "X axes", csub = 2, clabel = 1.25) s.arrow(x$aY, xax, yax, sub = "Y axes", csub = 2, clabel = 1.25) scatterutil.eigen(x$eig, wsel = c(xax, yax)) s.match.class(df1xy = x$msX, df2xy = x$msY, fac = fac, clabel = 1.5) # wt? s.arrow(x$l1, xax = xax, yax = yax, sub = "Y Canonical weights", csub = 2, clabel = 1.25) s.arrow(x$c1, xax = xax, yax = yax, sub = "X Canonical weights", csub = 2, clabel = 1.25) } print.witcoi <- function (x, ...) { if (!inherits(x, "witcoi")) stop("to be used with 'witcoi' object") cat("Within coinertia analysis\n") cat("call: ") print(x$call) cat("class: ") cat(class(x), "\n") cat("\n$rank (rank) :", x$rank) cat("\n$nf (axis saved) :", x$nf) cat("\n$RV (RV coeff) :", x$RV) cat("\n\neigen values: ") l0 <- length(x$eig) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n\n") else cat("\n\n") sumry <- array("", c(3, 4), list(1:3, c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$eig", length(x$eig), mode(x$eig), "eigen values") sumry[2, ] <- c("$lw", length(x$lw), mode(x$lw), "row weigths (crossed array)") sumry[3, ] <- c("$cw", length(x$cw), mode(x$cw), "col weigths (crossed array)") print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(17, 4), list(1:17, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$tab", nrow(x$tab), ncol(x$tab), "crossed array (CA)") sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), "Y col = CA row: coordinates") sumry[3, ] <- c("$l1", nrow(x$l1), ncol(x$l1), "Y col = CA row: normed scores") sumry[4, ] <- c("$co", nrow(x$co), ncol(x$co), "X col = CA column: coordinates") sumry[5, ] <- c("$c1", nrow(x$c1), ncol(x$c1), "X col = CA column: normed scores") sumry[6, ] <- c("$lX", nrow(x$lX), ncol(x$lX), "row coordinates (X)") sumry[7, ] <- c("$mX", nrow(x$mX), ncol(x$mX), "normed row scores (X)") sumry[8, ] <- c("$lY", nrow(x$lY), ncol(x$lY), "row coordinates (Y)") sumry[9, ] <- c("$mY", nrow(x$mY), ncol(x$mY), "normed row scores (Y)") sumry[10, ] <- c("$lsX", nrow(x$lsX), ncol(x$lsX), "supplementary row coordinates (X)") sumry[11, ] <- c("$msX", nrow(x$msX), ncol(x$msX), "supplementary normed row scores (X)") sumry[12, ] <- c("$lsY", nrow(x$lsY), ncol(x$lsY), "supplementaryrow coordinates (Y)") sumry[13, ] <- c("$msY", nrow(x$msY), ncol(x$msY), "supplementary normed row scores (Y)") sumry[14, ] <- c("$aX", nrow(x$aX), ncol(x$aX), "within axis onto within co-inertia axis (X)") sumry[15, ] <- c("$aY", nrow(x$aY), ncol(x$aY), "within axis onto within co-inertia axis (Y)") sumry[16, ] <- c("$acX", nrow(x$acX), ncol(x$acX), "co-inertia axis onto within co-inertia axis (X)") sumry[17, ] <- c("$acY", nrow(x$acY), ncol(x$acY), "co-inertia axis onto within co-inertia axis (Y)") print(sumry, quote = FALSE) cat("\n") }ade4/R/sco.class.R0000644000176200001440000001024612576021756013321 0ustar liggesusers"sco.class" <- function(score, fac, label = levels(fac), clabel = 1, horizontal = TRUE, reverse = FALSE, pos.lab = 0.5, pch = 20, cpoint = 1, boxes = TRUE, col = rep(1, length(levels(fac))), lim = NULL, grid = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0,0), sub = "", csub = 1.25, possub = "bottomleft"){ if(!is.vector(score)) stop("score should be a vector") nval <- length(score) if(is.null(label)) label <- 1:nlevels(fac) if(nlevels(fac) != length(label)) stop("length of 'label' is not convenient") if (pos.lab>1 | pos.lab<0) stop("pos.lab should be between 0 and 1") if (!is.factor(fac)) stop("factor expected for fac") oldpar <- par(mar=rep(0.1, 4)) on.exit(par(oldpar)) res <- scatterutil.sco(score = score, lim = lim, grid = grid, cgrid = cgrid, include.origin = include.origin, origin = origin, sub = sub, csub = csub, horizontal = horizontal, reverse = reverse) ymean <- tapply(score,fac,mean) y2 <- rep(0, nlevels(fac)) if(horizontal){ if(reverse) { points(score, rep(1- res[3], nval), pch = pch, cex = par("cex") * cpoint, col=col[fac]) } else { points(score, rep(res[3], nval), pch = pch, cex = par("cex") * cpoint, col=col[fac]) } if(clabel>0){ if(is.null(pos.lab)) pos.lab <- 0.5 if(reverse){ pos.lab <- 1 - res[3] - pos.lab * (1 - res[3]) pos.elbow <- 1- res[3] - (pos.lab - res[3])/5 } else { pos.lab <- res[3] + pos.lab * (1 - res[3]) pos.elbow <- res[3] + (pos.lab - res[3])/5 } for (i in 1:nlevels(fac)) { xh <- strwidth(paste(" ", label[order(ymean)][i], " ", sep = ""), cex = par("cex") * clabel) tmp <- scatterutil.convrot90(xh,0) yh <- tmp[2] y2[i] <- res[1] + (res[2] - res[1])/(nlevels(fac) + 1) * i if(reverse) { scatterutil.eti(y2[i], pos.lab - yh/2, label[order(ymean)][i], clabel = clabel, boxes = boxes, horizontal = FALSE, coul = col[order(ymean)][i]) } else { scatterutil.eti(y2[i], pos.lab + yh/2, label[order(ymean)][i], clabel = clabel, boxes = boxes, horizontal = FALSE, coul = col[order(ymean)][i]) } } for (i in 1:nval) { lev <- which(levels(fac)==fac[i]) segments(score[i],pos.elbow ,y2[which(order(ymean)==lev)], pos.lab, col = col[lev]) if(reverse) { segments(score[i], 1 - res[3], score[i], pos.elbow, col = col[lev]) } else { segments(score[i], res[3], score[i], pos.elbow, col = col[lev]) } } } } else { if(reverse){ points(rep(1 - res[3], nval), score, pch = pch, cex = par("cex") * cpoint, col=col[fac]) } else { points(rep(res[3], nval), score, pch = pch, cex = par("cex") * cpoint, col=col[fac]) } if(clabel>0){ if(is.null(pos.lab)) pos.lab <- 0.5 if(reverse){ pos.lab <- 1 - res[3] - pos.lab * (1 - res[3]) pos.elbow <- 1- res[3] - (pos.lab - res[3])/5 } else { pos.lab <- res[3] + pos.lab * (1 - res[3]) pos.elbow <- res[3] + (pos.lab - res[3])/5 } for (i in 1:nlevels(fac)) { xh <- strwidth(paste(" ", label[order(ymean)][i], " ", sep = ""), cex = par("cex") * clabel) y2[i] <- res[1] + (res[2] - res[1])/(nlevels(fac) + 1) * i if(reverse) { scatterutil.eti(pos.lab - xh/2, y2[i], label[order(ymean)][i], clabel = clabel, boxes = boxes, horizontal = TRUE, coul = col[order(ymean)][i]) } else { scatterutil.eti(pos.lab + xh/2, y2[i], label[order(ymean)][i], clabel = clabel, boxes = boxes, horizontal = TRUE, coul = col[order(ymean)][i]) } } for (i in 1:nval) { lev <- which(levels(fac)==fac[i]) segments(pos.elbow,score[i],pos.lab ,y2[which(order(ymean)==lev)], col = col[lev]) if(reverse) { segments(1 - res[3],score[i], pos.elbow, score[i], col = col[lev]) } else { segments(res[3],score[i], pos.elbow, score[i], col = col[lev]) } } } } invisible(match.call()) } ade4/R/s.kde2d.R0000644000176200001440000000414313176355060012655 0ustar liggesusers"s.kde2d" <- function(dfxy, xax = 1, yax = 2, pch = 20, cpoint = 1, neig = NULL, cneig = 2, xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0, 0), sub = "", csub = 1.25, possub = "bottomleft", pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) { # kde2d is a function of the library MASS # Venables, W. N. and Ripley, B. D. (2002) _Modern Applied # Statistics with S._ Fourth edition. Springer. # "kde2d" <- function (x, y, h, n = 25, lims = c(range(x), range(y))) { # nx <- length(x) # if (length(y) != nx) # stop("Data vectors must be the same length") # gx <- seq(lims[1], lims[2], length = n) # gy <- seq(lims[3], lims[4], length = n) # if (missing(h)) # h <- c(bandwidth.nrd(x), bandwidth.nrd(y)) # h <- h/4 # ax <- outer(gx, x, "-")/h[1] # ay <- outer(gy, y, "-")/h[2] # z <- matrix(dnorm(ax), n, nx) %*% t(matrix(dnorm(ay), n, # nx))/(nx * h[1] * h[2]) # return(list(x = gx, y = gy, z = z)) # } # "bandwidth.nrd" <- function(x) { # r <- quantile(x, c(0.25, 0.75)) # h <- (r[2] - r[1])/1.34 4 * 1.06 * min(sqrt(var(x)), h) * length(x)^(-1/5) # } opar <- par(no.readonly = TRUE) on.exit(par(opar)) par(mar=c(0.1,0.1,0.1,0.1)) s.label(dfxy, xax = xax, yax = yax, clabel = 0, pch = pch, cpoint = cpoint, neig = neig, cneig = cneig, xlim = xlim, ylim = ylim, grid = grid, addaxes = addaxes, cgrid = cgrid, include.origin = include.origin, origin = origin, sub = sub, csub = csub, possub = possub, pixmap = pixmap, contour = contour, area = area, add.plot = add.plot) x <- as.numeric(dfxy[,xax]) y <- as.numeric(dfxy[,yax]) xykde = kde2d(x, y, lims=par("usr")) zlim = range(xykde$z, finite = TRUE) lev=seq(zlim[1],zlim[2],le=8) lev=lev[2:7] # col0 = gray(seq(0,.9,len=6)) # col0 = heat.colors(6) # col0 = rainbow(6) col0="blue" contour(xykde,add=TRUE,lwd=2,col=col0,levels=lev,drawlabels=FALSE) invisible(match.call()) } ade4/R/kdist.R0000644000176200001440000002207112576021756012546 0ustar liggesusers# kdist # création jeudi, avril 3, 2003 at 13:57 # as.data.frame.kdist # création jeudi, avril 3, 2003 at 13:57 # print.kdist # création jeudi, avril 3, 2003 at 13:57 # [.kdist # création jeudi, avril 3, 2003 at 13:57 # c.kdist # création jeudi, avril 3, 2003 at 13:57 #################### kdist ################################# "kdist" <- function (..., epsi = 1e-07, upper=FALSE) { is.dist <- function(x) { if (!inherits(x,"dist")) return (FALSE) else return (TRUE) } is.matrix.dist <- function(m) { m <- as.matrix(m) n <- ncol(m) ; p <- nrow(m) if (any(is.na(m))) return ("NA values not allowed in m") if (n != p) return ("Square matrix expected") if (sum(diag(m)^2) != 0) return ("0 in diagonal expected") if (min(m) < 0) return ("non negative value expected") if (sum((t(m) - m)^2) != 0) return ("Symetric matrice expected") return (NULL) } triinftodist <- function(x) { n0 <- length(x) n <- sqrt(1 + 8 * n0) n <- (1 + n)/2 a <- matrix(0, ncol = n, nrow = n) a[row(a) > col(a)] <- x a <- a+t(a) return(a) } trisuptodist <- function(x) { n0 <- length(x) n <- sqrt(1 + 8 * n0) n <- (1 + n)/2 a <- matrix(0, ncol = n, nrow = n) a[row(a) < col(a)] <- x a <- a+t(a) return(a) } vecttovect <- function(x,upper) { attributes(x) <- NULL if (upper) { m <- trisuptodist(x) return(m[row(m) > col(m)]) } else { return (x) } } as.kdist.dist <- function(list.obj) { # une liste d'objets de la classe dist f1 <- function(x) { attributes(x) <- NULL return(as.vector(x)) } n <- length(list.obj) res <- lapply(list.obj,is.dist) size <- unlist(lapply(list.obj,function(x) attr(x,"Size"))) if (any(size!=size[1])) stop ("Non equal dimension") size <- unique(size) retval <- lapply(list.obj, f1) res <- unlist(lapply(list.obj,is.euclid ,tol=epsi)) if (is.null(names(retval))) { names(retval) <- as.character(1:n) } attr(retval, "size") <- size attr(retval, "labels") <- attr(list.obj[[1]],"Labels") if(is.null(attr(retval, "labels"))) attr(retval, "labels") <- as.character(1:size) attr(retval, "euclid") <- res return(retval) } as.kdist.matrix <- function(list.obj) { # une liste d'objets de la classe matrix n <- length(list.obj) res <- lapply(list.obj,is.matrix.dist) for (i in 1:n) { if (!is.null(res[[i]])) stop (paste ("object",i,"(",res[[i]],")")) } size <- unlist(lapply(list.obj,ncol)) if (any(size!=size[1])) stop ("Non equal dimension") list.obj =lapply(list.obj,as.dist) return (as.kdist.dist(list.obj)) } as.kdist.vector <- function(list.obj,upper=upper) { n <- length(list.obj) w <- unlist(lapply(list.obj,length)) if (any(w!=w[1])) stop ("Non equal length") w <- unique(w) size <- 0.5*(1+sqrt(1+8*w)) if (size!=as.integer(size)) stop ("Non convenient dimension") retval <- lapply(list.obj, vecttovect, upper=upper) attr(retval, "size") <- size attr(retval, "labels") <- as.character(1:size) euclid <- logical(n) for (i in 1:n) { euclid[i] <- is.euclid(as.dist(triinftodist(retval[[i]])),tol = epsi) } if (is.null(names(retval))) { names(retval) <- as.character(1:length(list.obj)) } attr(retval, "euclid") <- euclid return(retval) } list.obj <- list(...) compo.names <- as.character(substitute(list(...)))[-1] for (j in 1:length(list.obj)) { X <- list.obj[[j]] if (is.data.frame(X)) { init.names <- names(X) X <- as.matrix(X) X <- split(X,col(X)) } else if (is.list(X)) { init.names <- names(X) } else { X <- list(X) init.names <- compo.names[j] } if (all(unlist(lapply(X, is.dist)))) list.obj[[j]] <- as.kdist.dist(X) else if (all(unlist(lapply(X, is.matrix)))) list.obj[[j]] <- as.kdist.matrix(X) else if (all(unlist(lapply(X, is.vector)))) list.obj[[j]] <- as.kdist.vector(X,upper=upper) else stop("Non convenient data") if (length(list.obj[[j]])==length(init.names) ) names(list.obj[[j]]) <- init.names names(list.obj[[j]]) <- make.names(names(list.obj[[j]])) } n <- length(list.obj) size <- attr(list.obj[[1]],"size") compo.eff <- unlist(lapply(list.obj,length)) dist.names <- unlist(lapply(list.obj,names)) if (any(unlist(lapply(list.obj,function(x) attr(x,"size")))!=size)) stop ("arguments imply differing size") euclid <- unlist(lapply(list.obj,function(x) attr(x,"euclid"))) labels <- attr(list.obj[[1]],"labels") retval <- list(NULL) k <- 0 for (i in 1:n) { lab <- attr(list.obj[[i]],"labels") if( any(lab!=labels) ) stop ("arguments imply differing labels") w <- list.obj[[i]] attributes(w) <- NULL for (j in 1:compo.eff[[i]]) { k <- k+1 retval[[k]] <- w[[j]] } } names(retval) <- dist.names attr(retval,"size") <- size attr(retval, "labels") <- labels attr(retval, "euclid") <- euclid attr(retval, "call") <- match.call() class(retval) <- "kdist" return(retval) } ############# as.data.frame.kdist ###################### "as.data.frame.kdist" <- function(x, row.names=NULL, optional=FALSE,...) { if (!inherits (x, "kdist")) stop ("object 'kdist' expected") res <- as.data.frame(unclass(x)) nind <- attr(x,"size") w <- matrix(0,nind,nind) numrow <- row(w)[row(w)>col(w)] numcol <- col(w)[row(w)>col(w)] numrow <- attr(x, "labels")[numrow] numcol <- attr(x, "labels")[numcol] cha <- paste(numrow,numcol,sep="-") row.names(res) <- cha return(res) } ########## print.kdist ################################# "print.kdist" <- function(x,print.matrix.dist=FALSE,...) { cat("List of distances matrices\n") cat("call: ") print(attr(x,"call")) cat(paste("class:",class(x))) n <- length(x) cat(paste("\nnumber of distances:",n)) npoints <- attr(x,"size") cat(paste("\nsize:", npoints)) cat("\nlabels:\n") labels <- attr(x,"labels") print(labels) euclid <- attr(x,"euclid") print1 <- function (x,size,labels,...) # modif error sur CRAN DAILY 18/11:2004 # from print.dist de stats { df <- matrix(0, size, size) df[row(df) > col(df)] <- x df <- format(df) df[row(df) <= col(df)] <- "" dimnames(df) <- list(labels, labels) print(df, quote = FALSE, ...) } for (i in 1:n) { w <- x[[i]] cat(names(x)[i]) if (euclid[i]) cat(": euclidean distance\n") else cat(": non euclidean distance\n") if (print.matrix.dist) { print1(w,npoints,labels,...) cat("\n") } } } ######################## [.kdist ####################### "[.kdist" <- function(object,selection) { retval <- unclass(object)[selection] n <- attr(object,"size") labels <- attr(object,"labels") euclid <- attr(object,"euclid") euclid <- euclid[selection] attr(retval, "size") <- n attr(retval, "labels") <- labels attr(retval, "euclid") <- euclid attr(retval, "call") <- match.call() class(retval) <- "kdist" return(retval) } ######################## c.kdist ########################### c.kdist <- function(...) { x <- list(...) n <- length(x) compo.names <- as.character(substitute(list(...)))[-1] compo.eff <- unlist(lapply(x,length)) dist.names <- unlist(lapply(x,names)) rep.names <- paste(rep(compo.names,compo.eff),dist.names,sep=".") if (any(lapply(x,class)!="kdist")) stop ("arguments imply object without 'kdist' class") size <- attr(x[[1]],"size") if (any(unlist(lapply(x,function(x) attr(x,"size")))!=size)) stop ("arguments imply differing size") euclid <- unlist(lapply(x,function(x) attr(x,"euclid"))) labels <- attr(x[[1]],"labels") if (length(unique(dist.names))!=length(dist.names)) dist.names <- rep.names names(euclid) <- dist.names retval <- list(NULL) k <- 0 for (i in 1:n) { lab <- attr(x[[i]],"labels") if( any(lab!=labels) ) stop ("arguments imply differing labels") w <- x[[i]] attributes(w) <- NULL for (j in 1:compo.eff[[i]]) { k <- k+1 retval[[k]] <- w[[j]] } } attr(retval,"names") <- dist.names attr(retval,"size") <- size attr(retval, "labels") <- labels attr(retval, "euclid") <- euclid attr(retval, "call") <- match.call() class(retval) <- "kdist" return(retval) } ade4/R/score.acm.R0000644000176200001440000000222412576021756013300 0ustar liggesusers"score.acm" <- function (x, xax = 1, which.var = NULL, mfrow = NULL, sub = names(oritab), csub = 2, possub = "topleft", ...) { if (!inherits(x, "acm")) stop("Object of class 'acm' expected") if (x$nf == 1) xax <- 1 if ((xax < 1) || (xax > x$nf)) stop("non convenient axe number") def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) oritab <- eval.parent(as.list(x$call)[[2]]) nvar <- ncol(oritab) if (is.null(which.var)) which.var <- (1:nvar) if (is.null(mfrow)) par(mfrow = n2mfrow(length(which.var))) if (prod(par("mfrow")) < length(which.var)) par(ask = TRUE) par(mar = c(2.6, 2.6, 1.1, 1.1)) score <- x$l1[, xax] for (i in which.var) { y <- oritab[, i] moy <- unlist(tapply(score, y, mean)) plot(score, score, type = "n") h <- (max(score) - min(score))/40 abline(h = moy) segments(score, moy[y] - h, score, moy[y] + h) abline(0, 1) scatterutil.eti(moy, moy, label = as.character(levels(y)), clabel = 1.5) scatterutil.sub(sub[i], csub = csub, possub = possub) } } ade4/R/score.R0000644000176200001440000000462412576021756012547 0ustar liggesusers"score" <- function (x, ...) UseMethod("score") "scoreutil.base" <- function (y, xlim, grid, cgrid, include.origin, origin, sub, csub) { if (is.null(xlim)) { x1 <- y if (include.origin) x1 <- c(x1, origin) x1 <- c(x1 - diff(range(x1)/10), x1 + diff(range(x1))/10) xlim <- range(x1) } ylim <- c(0, 1) plot.default(0, 0, type = "n", xlab = "", ylab = "", xaxt = "n", yaxt = "n", xlim = xlim, ylim = ylim, xaxs = "i", yaxs = "i", frame.plot = FALSE) href <- max(3, 2 * cgrid, 2 * csub) href <- strheight("A", cex = par("cex") * href) if (grid) { xaxp <- par("xaxp") nline <- xaxp[3] + 1 v0 <- seq(xaxp[1], xaxp[2], le = nline) segments(v0, rep(par("usr")[3], nline), v0, rep(par("usr")[3] + href, nline), col = gray(0.5), lty = 1) segments(0, par("usr")[3], 0, par("usr")[3] + href, col = 1, lwd = 3) if (cgrid > 0) { a <- (xaxp[2] - xaxp[1])/xaxp[3] cha <- paste("d = ", a, sep = "") cex0 <- par("cex") * cgrid xh <- strwidth(cha, cex = cex0) yh <- strheight(cha, cex = cex0) + strheight(" ", cex = cex0)/2 x0 <- strwidth(" ", cex = cex0) y0 <- strheight(" ", cex = cex0)/2 x1 <- par("usr")[1] y1 <- par("usr")[3] rect(x1 + x0, y1 + y0, x1 + xh + x0, y1 + yh + y0, col = "white", border = 0) text(x1 + xh/2 + x0/2, y1 + yh/2 + y0/2, cha, cex = cex0) } } y1 <- rep(par("usr")[3] + href/2, length(y)) y2 <- rep(par("usr")[3] + href, length(y)) segments(y, y1, y, y2) if (csub > 0) { cha <- as.character(sub) if (all(c(length(cha) > 0, !is.null(cha), !is.na(cha), cha != ""))) { cex0 <- par("cex") * csub xh <- strwidth(cha, cex = cex0) yh <- strheight(cha, cex = cex0) x0 <- strwidth(" ", cex = cex0) y0 <- strheight(" ", cex = cex0) x1 <- par("usr")[2] y1 <- par("usr")[3] rect(x1 - x0 - xh, y1, x1, y1 + yh + y0, col = "white", border = 0) text(x1 - xh/2 - x0/2, y1 + yh/2 + y0/2, cha, cex = cex0) } } rect(par("usr")[1], par("usr")[3], par("usr")[2], par("usr")[3] + href) return(par("usr")[3] + href) } ade4/R/bca.rlq.R0000644000176200001440000001234112576021756012751 0ustar liggesusers"bca.rlq" <- function (x, fac, scannf = TRUE, nf = 2, ...) { if (!inherits(x, "rlq")) stop("Object of class rlq expected") if (!is.factor(fac)) stop("factor expected") appel <- as.list(x$call) dudiR <- eval.parent(appel$dudiR) dudiL <- eval.parent(appel$dudiL) dudiQ <- eval.parent(appel$dudiQ) ligR <- nrow(dudiR$tab) if (length(fac) != ligR) stop("Non convenient dimension") cla.w <- tapply(dudiR$lw, fac, sum) mean.w <- function(x, w, fac, cla.w) { z <- x * w z <- tapply(z, fac, sum)/cla.w return(z) } tabmoyR <- apply(dudiR$tab, 2, mean.w, w = dudiR$lw, fac = fac, cla.w = cla.w) tabmoyR <- data.frame(tabmoyR) row.names(tabmoyR) <- levels(fac) names(tabmoyR) <- names(dudiR$tab) tabmoyL <- apply(dudiL$tab, 2, mean.w, w = dudiL$lw, fac = fac, cla.w = cla.w) tabmoyL <- data.frame(tabmoyL) row.names(tabmoyL) <- levels(fac) names(tabmoyL) <- names(dudiL$tab) dudimoyR <- as.dudi(tabmoyR, dudiR$cw, as.vector(cla.w), scannf = FALSE, nf = nf, call = match.call(), type = "bet") dudimoyL <- as.dudi(tabmoyL, dudiL$cw, as.vector(cla.w), scannf = FALSE, nf = nf, call = match.call(), type = "coa") res <- rlq(dudimoyR, dudimoyL, dudiQ, scannf = scannf, nf = nf) res$call <- match.call() U <- as.matrix(res$l1) * unlist(res$lw) U <- data.frame(as.matrix(dudiR$tab) %*% U) row.names(U) <- row.names(dudiR$tab) names(U) <- names(res$l1) res$lsR <- U U <- as.matrix(res$c1) * unlist(res$cw) U <- data.frame(t(as.matrix(x$c1)) %*% U) row.names(U) <- names(x$c1) names(U) <- names(res$c1) res$acQ <- U U <- as.matrix(res$l1) * unlist(res$lw) U <- data.frame(t(as.matrix(x$l1)) %*% U) row.names(U) <- names(x$l1) names(U) <- names(res$l1) res$acR <- U class(res) <- c("betrlq", "dudi") return(res) } "print.betrlq" <- function (x, ...) { if (!inherits(x, "betrlq")) stop("to be used with 'betrlq' object") cat("Between RLQ analysis\n") cat("call: ") print(x$call) cat("class: ") cat(class(x), "\n") cat("\n$rank (rank):", x$rank) cat("\n$nf (axis saved):", x$nf) cat("\n\neigen values: ") l0 <- length(x$eig) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n\n") else cat("\n\n") sumry <- array("", c(3, 4), list(1:3, c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$eig", length(x$eig), mode(x$eig), "eigen values") sumry[2, ] <- c("$lw", length(x$lw), mode(x$lw), "row weigths (crossed array)") sumry[3, ] <- c("$cw", length(x$cw), mode(x$cw), "col weigths (crossed array)") print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(14, 4), list(1:14, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$tab", nrow(x$tab), ncol(x$tab), "crossed array (CA)") sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), "R col = CA row: coordinates") sumry[3, ] <- c("$l1", nrow(x$l1), ncol(x$l1), "R col = CA row: normed scores") sumry[4, ] <- c("$co", nrow(x$co), ncol(x$co), "Q col = CA column: coordinates") sumry[5, ] <- c("$c1", nrow(x$c1), ncol(x$c1), "Q col = CA column: normed scores") sumry[6, ] <- c("$lR", nrow(x$lR), ncol(x$lR), "class coordinates (R)") sumry[7, ] <- c("$lsR", nrow(x$lsR), ncol(x$lsR), "supplementary row coordinates (R)") sumry[8, ] <- c("$mR", nrow(x$mR), ncol(x$mR), "class normed scores (R)") sumry[9, ] <- c("$lQ", nrow(x$lQ), ncol(x$lQ), "row coordinates (Q)") sumry[10, ] <- c("$mQ", nrow(x$mQ), ncol(x$mQ), "normed row scores (Q)") sumry[11, ] <- c("$aR", nrow(x$aR), ncol(x$aR), "axes onto between-RLQ axes (R)") sumry[12, ] <- c("$aQ", nrow(x$aQ), ncol(x$aQ), "axes onto between-RLQ axes (Q)") sumry[13, ] <- c("$acR", nrow(x$acR), ncol(x$acR), "RLQ axes onto between-RLQ axes (R)") sumry[14, ] <- c("$acQ", nrow(x$acQ), ncol(x$acQ), "RLQ axes onto between-RLQ axes (Q)") print(sumry, quote = FALSE) cat("\n") } "plot.betrlq" <- function (x, xax = 1, yax = 2, ...) { if (!inherits(x, "betrlq")) stop("Use only with 'betrlq' objects") if (x$nf == 1) { warnings("One axis only : not yet implemented") return(invisible()) } if (xax > x$nf) stop("Non convenient xax") if (yax > x$nf) stop("Non convenient yax") fac <- eval.parent(as.list(x$call)$fac) def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) layout(matrix(c(1, 1, 3, 1, 1, 4, 2, 2, 5, 2, 2, 6, 8, 8, 7), 3, 5), respect = TRUE) par(mar = c(0.1, 0.1, 0.1, 0.1)) s.class(x$lsR[, c(xax, yax)], fac = fac, sub = "R row scores and classes", csub = 2, clabel = 1.25) s.label(x$lQ[, c(xax, yax)], sub = "Q row scores", csub = 2, clabel = 1.25) s.corcircle(x$aR, xax, yax, sub = "R axes", csub = 2, clabel = 1.25) s.arrow(x$l1, xax = xax, yax = yax, sub = "R Canonical weights", csub = 2, clabel = 1.25) s.corcircle(x$aQ, xax, yax, sub = "Q axes", csub = 2, clabel = 1.25) s.arrow(x$c1, xax = xax, yax = yax, sub = "Q Canonical weights", csub = 2, clabel = 1.25) scatterutil.eigen(x$eig, wsel = c(xax, yax)) } ade4/R/betwitdpcoa.R0000644000176200001440000002112013050632301013705 0ustar liggesuserswca.dpcoa <- function (x, fac, scannf = TRUE, nf = 2, ...){ if (!inherits(x, "dpcoa")) stop("Object of class dpcoa expected") if (!is.factor(fac)) stop("factor expected") tabw <- tapply(x$lw, fac, sum) tabw <- tabw/sum(tabw) tabwit <- scalefacwt(x$tab, fac = fac, wt = x$lw, scale = FALSE, drop = FALSE) res <- as.dudi(tabwit, x$cw, x$lw, scannf = scannf, nf = nf, call = match.call(), type = "witdpcoa") res$ratio <- sum(res$eig)/sum(x$eig) U <- as.matrix(res$c1) * unlist(res$cw) U <- data.frame(as.matrix(x$tab) %*% U) row.names(U) <- row.names(x$tab) names(U) <- names(res$li) res$ls <- U U <- as.matrix(res$c1) * unlist(res$cw) U <- data.frame(t(as.matrix(x$c1)) %*% U) row.names(U) <- names(x$li) names(U) <- names(res$li) res$as <- U res$tabw <- tabw res$fac <- fac res$co <- res$l1 <- NULL ## add species information res$dw <- x$dw dis <- eval.parent(as.list(x$call)$dis) U <- as.matrix(dudi.pco(dis, row.w = x$dw, full = TRUE)$li) %*% as.matrix(res$c1) U <- data.frame(U) row.names(U) <- attr(dis, "Labels") res$dls <- U class(res) <- c("witdpcoa", "within", "dudi") return(res) } bca.dpcoa <- function(x, fac, scannf = TRUE, nf = 2, ...){ if (!inherits(x, "dpcoa")) stop("Object of class dpcoa expected") if (!is.factor(fac)) stop("factor expected") tabw <- tapply(x$lw, fac, sum) tabw <- as.vector(tabw/sum(tabw)) tabmoy <- meanfacwt(df = x$tab, fac = fac, wt = x$lw, drop = FALSE) res <- as.dudi(data.frame(tabmoy), x$cw, tabw, scannf = scannf, nf = nf, call = match.call(), type = "betdpcoa") res$ratio <- sum(res$eig)/sum(x$eig) U <- as.matrix(res$c1) * unlist(res$cw) U <- data.frame(as.matrix(x$tab) %*% U) row.names(U) <- row.names(x$tab) names(U) <- names(res$li) res$ls <- U U <- as.matrix(res$c1) * unlist(res$cw) U <- data.frame(t(as.matrix(x$c1)) %*% U) row.names(U) <- names(x$li) names(U) <- names(res$li) res$as <- U res$fac <- fac res$co <- res$l1 <- NULL ## add species information res$dw <- x$dw dis <- eval.parent(as.list(x$call)$dis) U <- as.matrix(dudi.pco(dis, row.w = x$dw, full = TRUE)$li) %*% as.matrix(res$c1) U <- data.frame(U) row.names(U) <- attr(dis, "Labels") res$dls <- U class(res) <- c("betdpcoa", "between", "dudi") return(res) } bwca.dpcoa <- function(x, fac, cofac, scannf = TRUE, nf = 2, ...){ if (!inherits(x, "dpcoa")) stop("Object of class dpcoa expected") if (!is.factor(fac) || !is.factor(cofac) ) stop("factor expected") cofac01 <- model.matrix( ~ -1 + cofac) fac01 <- model.matrix( ~ -1 + fac) x.resid <- lm.wfit(x = cofac01, y = fac01, w = x$lw)$residuals tab <- lm.wfit(x = x.resid, y = as.matrix(x$tab), w = x$lw)$fitted.values res <- as.dudi(data.frame(tab), x$cw, x$lw, scannf = scannf, nf = nf, call = match.call(), type = "betwitdpcoa") res$ratio <- sum(res$eig)/sum(x$eig) U <- as.matrix(res$c1) * unlist(res$cw) U <- data.frame(as.matrix(x$tab) %*% U) row.names(U) <- row.names(x$tab) names(U) <- names(res$li) res$ls <- U U <- as.matrix(res$c1) * unlist(res$cw) U <- data.frame(t(as.matrix(x$c1)) %*% U) row.names(U) <- names(x$li) names(U) <- names(res$li) res$as <- U res$fac <- fac res$cofac <- cofac res$co <- res$l1 <- NULL ## add species information res$dw <- x$dw dis <- eval.parent(as.list(x$call)$dis) U <- as.matrix(dudi.pco(dis, row.w = x$dw, full = TRUE)$li) %*% as.matrix(res$c1) U <- data.frame(U) row.names(U) <- attr(dis, "Labels") res$dls <- U class(res) <- c("betwitdpcoa", "betwit", "dudi") return(res) } randtest.betwit <- function(xtest, nrepet = 999, ...){ if (!inherits(xtest, "betwit")) stop("Object of class 'betwit' expected") appel <- as.list(xtest$call) dudi1 <- eval.parent(appel$x) fac <- eval.parent(appel$fac) cofac <- eval.parent(appel$cofac) inertot <- sum(dudi1$eig) cofac01 <- model.matrix( ~ -1 + cofac) fac01 <- model.matrix( ~ -1 + fac) x.resid <- lm.wfit(x = cofac01, y = fac01, w = dudi1$lw)$residuals lm1 <- lm.wfit(x = cofac01, y = as.matrix(dudi1$tab), w = dudi1$lw) Y.r <- lm1$residuals Y.f <- lm1$fitted.values wt <- outer(sqrt(dudi1$lw), sqrt(dudi1$cw)) obs <- sum((lm.wfit(y = Y.f + Y.r, x = x.resid, w = dudi1$lw)$fitted.values * wt)^2)/inertot isim <- c() ## permutation under reduced-model for (i in 1:nrepet) isim[i] <- sum((lm.wfit(y = Y.f + Y.r[sample(nrow(Y.r)), ], x = x.resid, w = dudi1$lw)$fitted.values * wt)^2)/inertot return(as.randtest(isim, obs, call = match.call(), ...)) } summary.betwit <- function(object, ...){ thetitle <- "Between within-class analysis" cat(thetitle) cat("\n\n") NextMethod() appel <- as.list(object$call) dudi <- eval.parent(appel$x) cat(paste("Total unconstrained inertia (", deparse(appel$x), "): ", sep = "")) cat(signif(sum(dudi$eig), 4)) cat("\n\n") cat(paste("Inertia of", deparse(appel$x), "independent of", deparse(appel$cofac), "explained by", deparse(appel$fac), "(%): ")) cat(signif(object$ratio * 100, 4)) cat("\n\n") } print.witdpcoa <- function (x, ...){ if (!inherits(x, "witdpcoa")) stop("to be used with 'witdpcoa' object") cat("Within double principal coordinate analysis\n") cat("call: ") print(x$call) cat("class: ") cat(class(x), "\n") cat("\n$nf (axis saved) :", x$nf) cat("\n$rank: ", x$rank) cat("\n$ratio: ", x$ratio) cat("\n\neigen values: ") l0 <- length(x$eig) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n\n") else cat("\n\n") sumry <- array("", c(5, 4), list(1:5, c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$dw", length(x$dw), mode(x$dw), "category weights") sumry[2, ] <- c("$lw", length(x$lw), mode(x$lw), "collection weights") sumry[3, ] <- c("$eig", length(x$eig), mode(x$eig), "eigen values") sumry[4, ] <- c("$tabw", length(x$tabw), mode(x$tabw), "class weigths") sumry[5, ] <- c("$fac", length(x$fac), mode(x$fac), "factor for grouping") print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(5, 4), list(1:5, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$dls", nrow(x$dls), ncol(x$dls), "coordinates of the categories") sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), "coordinates of the collections") sumry[3, ] <- c("$c1", nrow(x$c1), ncol(x$c1), "scores of the principal axes of the categories") sumry[4, ] <- c("$ls", nrow(x$ls), ncol(x$ls), "projection of the original collections") sumry[5, ] <- c("$as", nrow(x$as), ncol(x$as), "dpcoa axes onto wca axes") print(sumry, quote = FALSE) } print.betdpcoa <- function (x, ...){ if (!inherits(x, "betdpcoa")) stop("to be used with 'betdpcoa' object") cat("Between double principal coordinate analysis\n") cat("call: ") print(x$call) cat("class: ") cat(class(x), "\n") cat("\n$nf (axis saved) :", x$nf) cat("\n$rank: ", x$rank) cat("\n$ratio: ", x$ratio) cat("\n\neigen values: ") l0 <- length(x$eig) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n\n") else cat("\n\n") sumry <- array("", c(4, 4), list(1:4, c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$dw", length(x$dw), mode(x$dw), "category weights") sumry[2, ] <- c("$lw", length(x$lw), mode(x$lw), "collection weights") sumry[3, ] <- c("$eig", length(x$eig), mode(x$eig), "eigen values") sumry[4, ] <- c("$fac", length(x$fac), mode(x$fac), "factor for grouping") print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(5, 4), list(1:5, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$dls", nrow(x$dls), ncol(x$dls), "coordinates of the categories") sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), "coordinates of the classes") sumry[3, ] <- c("$c1", nrow(x$c1), ncol(x$c1), "scores of the principal axes of the categories") sumry[4, ] <- c("$ls", nrow(x$ls), ncol(x$ls), "coordinates of the collections") sumry[5, ] <- c("$as", nrow(x$as), ncol(x$as), "dpcoa axes onto wca axes") print(sumry, quote = FALSE) } ade4/R/ktab.match2ktabs.R0000644000176200001440000000355312576021756014557 0ustar liggesusers"ktab.match2ktabs" <- function (KTX, KTY) { if (!inherits(KTX, "ktab")) stop("The first argument must be a 'ktab'") if (!inherits(KTY, "ktab")) stop("The second argument must be a 'ktab'") #### crossed ktab res <- list() #### Parameters of first ktab lwX <- KTX$lw cwX <- KTX$cw ncolX <- length(cwX) bloX <- KTX$blo ntabX <- length(KTX$blo) #### Parameters of second ktab lwY <- KTY$lw nligY <- length(lwY) cwY <- KTY$cw ncolY <- length(cwY) bloY <- KTY$blo ntabY <- length(KTY$blo) #### Tests of coherence of the two ktabs if (ncolX != ncolY) stop("The two ktabs must have the same column numbers") if (any(cwX != cwY)) stop("The two ktabs must have the same column weights") if (ntabX != ntabY) stop("The two ktabs must have the same number of tables") if (!all(bloX == bloY)) stop("The two tables of one pair must have the same number of columns") ntab <- ntabX indica <- as.factor(rep(1:ntab, KTX$blo)) lw <- split(cwX, indica) #### Compute crossed ktab for (i in 1:ntab) { tx <- as.matrix(KTX[[i]]) ty <- as.matrix(KTY[[i]]) res[[i]] <- as.data.frame(tx %*% (t(ty) * lw[[i]])) } #### Complete crossed ktab structure res$lw <- lwX res$cw <- rep(lwY,ntab) blo <- rep(nligY,ntab) res$blo <- blo #### Enregistrement des tableaux de départ res$supX <- KTX[[1]] res$supY <- KTY[[1]] for (i in 2:ntab) { res$supX <- cbind(res$supX, KTX[[i]]) res$supY <- cbind(res$supY, KTY[[i]]) } res$supX=t(res$supX) res$supY=t(res$supY) res$supblo <- KTX$blo res$suplw <- cwX res$call <- match.call() class(res) <- c("ktab", "kcoinertia") col.names(res) <- rep(row.names(KTY),ntab) row.names(res) <- row.names(KTX) tab.names(res) <- tab.names(KTX) res <- ktab.util.addfactor(res) return(res) } ade4/R/phylog.R0000644000176200001440000002623512576021756012740 0ustar liggesusers"print.phylog" <- function (x, ...) { phylog <- x if (!inherits(phylog, "phylog")) stop("for 'phylog' object") leaves.n <- length(phylog$leaves) nodes.n <- length(phylog$nodes) cat("Phylogenetic tree with",leaves.n,"leaves and",nodes.n,"nodes\n") cat("$class: ") cat(class(phylog)) cat("\n$call: ") print(phylog$call) cat("$tre: ") l0 <- nchar(phylog$tre) if (l0 < 50) cat(phylog$tre, "\n") else { cat(substring(phylog$tre, 1, 25)) cat("...") cat(substring(phylog$tre, l0 - 26, l0), "\n") } cat("\n") n1 <-paste("$",names(phylog)[2:6],sep="") sumry <- array(" ", c(length(n1), 3), list(n1, c("class", "length", "content"))) # leaves k <- 1; sumry[k,1] <- "numeric" ; sumry[k,2] <- as.character(length(phylog$leaves)) sumry[k,3] <- "length of the first preceeding adjacent edge" #nodes k <- 2 ; sumry[k,1] <- "numeric" ; sumry[k,2] <- as.character(length(phylog$nodes)) sumry[k,3] <- "length of the first preceeding adjacent edge" #parts k <-3; sumry[k,1] <- "list";sumry[k,2] <- as.character(length(phylog$parts)) sumry[k,3] <- "subsets of descendant nodes" #paths k = 4; sumry[k,1] <- "list";sumry[k,2] <- as.character(length(phylog$paths)) sumry[k,3] <- "path from root to node or leave" #droot k = 5; sumry[k,1] <- "numeric";sumry[k,2] <- as.character(length(phylog$droot)) sumry[k,3] <- "distance to root" print.noquote(sumry) cat("\n") if (is.null(phylog$Wmat)) return(invisible()) n1 <- names(phylog)[-(1:7)] n1 <- paste("$",n1,sep="") sumry <- array(" ", c(length(n1), 3), list(n1, c("class", "dim", "content"))) # 8 Wmat k = 1 sumry[k,1] <- "matrix" sumry[k,2] <- paste(nrow(phylog$Wmat),ncol(phylog$Wmat),sep="-") sumry[k,3] <- "W matrix : root to the closest ancestor" #9 Wdist k = 2 sumry[k,1] <- "dist" ; sumry[k,2] <- as.character(length(phylog$Wdist)) sumry[k,3] <- "Nodal distances" # 10 Wvalues k = 3 sumry[k,1] <- "numeric" sumry[k,2] <- length(phylog$Avalues) sumry[k,3] <- "Eigen values of QWQ/sum(Q)" #11 "Wscores" k = 4 sumry[k,1] <- "data.frame" sumry[k,2] <- paste(nrow(phylog$Wscores),ncol(phylog$Wscores),sep="-") sumry[k,3] <- "Eigen vectors of QWQ '1/n' normed" #12 "Amat" k = 5 sumry[k,1] <- "matrix" sumry[k,2] <- paste(nrow(phylog$Amat),ncol(phylog$Amat),sep="-") sumry[k,3] <- "Topological proximity matrix A" #13 Avalues k = 6 sumry[k,1] <- "numeric" sumry[k,2] <- length(phylog$Avalues) sumry[k,3] <- "Eigen values of QAQ matrix" #14 Adim k = 7 sumry[k,1] <- "integer" sumry[k,2] <- "1" sumry[k,3] <- "number of positive eigen values of QAQ" #15 Ascores k = 8 sumry[k,1] <- "data.frame" sumry[k,2] <- paste(nrow(phylog$Ascores),ncol(phylog$Ascores),sep="-") sumry[k,3] <- "Eigen vectors of QAQ '1/n' normed" #16 Aparam k = 9 sumry[k,1] <- "data.frame" sumry[k,2] <- paste(nrow(phylog$Aparam),ncol(phylog$Aparam),sep="-") sumry[k,3] <- "Topological indices for nodes" # 17 Bindica k = 10 sumry[k,1] <- "data.frame" sumry[k,2] <- paste(nrow(phylog$Bindica),ncol(phylog$Bindica),sep="-") sumry[k,3] <- "class indicator from nodes" # 18 Bscores k = 11 sumry[k,1] <- "data.frame" sumry[k,2] <- paste(nrow(phylog$Bscores),ncol(phylog$Bscores),sep="-") sumry[k,3] <- "Topological orthonormal basis '1/n' normed" # 19 Bvalues # 20 Blabels k=12 sumry[k,1] <- "character" sumry[k,2] <- length(phylog$Blabels) sumry[k,3] <- "Nodes labelling from orthonormal basis" print.noquote(sumry) return(invisible()) } ####################################################################################### "phylog.extract" <- function (phylog, node, distance = TRUE){ local <- lapply(phylog$paths, function(x) sum(x == node)) tu.names <- names(which(local == 1)) tre <- phylog$tre local1 <- paste(tu.names, ")", sep = "") local2 <- paste(tu.names, ",", sep = "") local3 <- paste(tu.names, ";", sep = "") tu.pos1 <- unlist(lapply(local1, function(x) regexpr(x, tre))) tu.pos2 <- unlist(lapply(local2, function(x) regexpr(x, tre))) tu.pos3 <- unlist(lapply(local3, function(x) regexpr(x, tre))) tu.pos <- cbind(tu.pos1, tu.pos2, tu.pos3) tu.pos <- apply(tu.pos, 1, function(x) x[which(x != -1)]) leave.pos <- min(tu.pos) node.pos <- tu.pos[which(tu.names == node)] res <- substr(tre, leave.pos, node.pos - 1) res <- paste(res, node, sep = "") res <- paste(res, ";", sep = "") n.fermante <- length(unlist(gregexpr(")", res))) n.ouvrante <- length(unlist(gregexpr("(", res, fixed = TRUE))) parentheses <- rep("(", n.fermante - n.ouvrante) parentheses <- paste(parentheses, collapse = "") res <- paste(parentheses, res, sep = "") if (distance){ nodes.names <- names(phylog$nodes) leaves.names <- names(phylog$leaves) "tre2tre" <- function(res){ for (i in 1:length(leaves.names)) { res <- sub(paste(leaves.names[i], ",", sep = ""), paste(leaves.names[i], ":", phylog$leaves[i], ",", sep = ""), res) } for (i in 1:length(leaves.names)) { res <- sub(paste(leaves.names[i], ")", sep = ""), paste(leaves.names[i], ":", phylog$leaves[i], ")", sep = ""), res) } for (i in 1:length(nodes.names)) { res <- sub(paste(nodes.names[i], ",", sep = ""), paste(nodes.names[i], ":", phylog$nodes[i], ",", sep = ""), res) } for (i in 1:length(nodes.names)) { res <- sub(paste(nodes.names[i], ")", sep = ""), paste(nodes.names[i], ":", phylog$nodes[i], ")", sep = ""), res) } return(res) } res <- tre2tre(res) } add.t <- !is.null(phylog$Wmat) res <- newick2phylog(res, add.tools = add.t, call = match.call()) return(res) } ####################################################################################### phylog.permut <- function(phylog,list.nodes = NULL, distance = TRUE){ if (is.null(list.nodes)) list.nodes <- lapply(phylog$parts,function(a) if (length(a)==1) a else sample(a)) ############################# adddistances<-function(){ # cette fonction assure la conversion de tre # en son équivalent muni des distances for(i in 1:length(leaves.names)) { tre<<- sub(paste(leaves.names[i],",",sep=""),paste(leaves.names[i],":",phylog$leaves[i],",",sep=""),tre,fixed=TRUE) } for(i in 1:length(leaves.names)) { tre<<- sub(paste(leaves.names[i],")",sep=""),paste(leaves.names[i],":",phylog$leaves[i],")",sep=""),tre,fixed=TRUE) } for(i in 1:length(nodes.names)) { tre<<- sub(paste(nodes.names[i],",",sep=""),paste(nodes.names[i],":",phylog$nodes[i],",",sep=""),tre,fixed=TRUE) } for(i in 1:length(nodes.names)) { tre<<- sub(paste(nodes.names[i],")",sep=""),paste(nodes.names[i],":",phylog$nodes[i],")",sep=""),tre,fixed=TRUE) } } ############################# extract<-function(node) { # extrait de tre le sous-arbre enraciné au noeud node # il serait intéressant de traduire cett fonction en C, # en ne travaillant que sur les chaines de caractères newick # node.number<- grep(node, nodes.names) # on détermine la feuilles la plus à gauche associée au noeud # utilise la liste phylogparts contenant les descendants leave <- node k <- 0 while(length(grep(leave,leaves.names))==0) { k <- k+1 leave <- phylogparts[[leave]][1] } #on construit la chaine de caractère associée à l'arbre enraciné au noeud if (regexpr(paste(leave,")",sep=""),tre) == -1) { leave.pos <- regexpr(paste(leave,",",sep=""),tre) } else { leave.pos <- regexpr(paste(leave,")",sep=""),tre) } if (regexpr(paste(node,")",sep=""),tre) == -1) { node.pos <- regexpr(paste(node,",",sep=""),tre) } else { node.pos <- regexpr(paste(node,")",sep=""),tre) } res<-substr(tre,leave.pos,node.pos-1) res<-paste(res,node,sep="") if (k==0) parentheses<-"" else parentheses<-"(" if(k > 1) { for(i in 2:k){ parentheses<-paste(parentheses,"(", sep="") } } res<-(paste(parentheses, res, sep="")) return(res) } ############################# permute <- function (node) { # cette fonction assure la permutation dans tre des branches descendantes du noeud node # on remplace l'ordre initial conservé dans phylogparts[[node]] # par l'ordre final conservé dans list.nodes[[node]] # phylogparts[[node]] est mis à jour à la sortie new.part <- list.nodes[[node]] if (length(new.part)==1) return(invisible()) old.part <- phylogparts[[node]] if (all (old.part==new.part)) return(invisible()) for (k in 1:(length(new.part)-1)) { if (old.part[k]!=new.part[k]) { n1 <- old.part[k] n2 <- new.part[k] u1 <- extract(n1) u1.pos <- regexpr(paste(u1,"[,\\);]",sep=""),tre) u1.fin <- u1.pos+attr(u1.pos,"match.length")-1 lastcar1 <- substring(tre, u1.fin, u1.fin) u2 <- extract(n2) u2.pos<-regexpr(paste(u2,"[,\\);]",sep=""),tre) u2.fin <- u2.pos+attr(u2.pos,"match.length")-1 lastcar2 <- substring(tre, u2.fin, u2.fin) tre <<- sub(paste(u1,lastcar1,sep=""),"Restunlogicielformidable",tre,fixed = TRUE) tre <<- sub(paste(u2,lastcar2,sep=""), paste(u1,lastcar2,sep=""),tre,fixed=TRUE) tre <<- sub("Restunlogicielformidable",paste(u2,lastcar1,sep=""), tre,fixed=TRUE) old.part[old.part==n1] <- "1234564789" old.part[old.part==n2] <- n1 old.part[old.part=="1234564789"] <- n2 } } phylogparts[[node]] <<- new.part } ############################# verif <- function(node) { new.part <- sort(list.nodes[[node]]) old.part <- sort(phylogparts[[node]]) if (!(all(new.part==old.part))) return (FALSE) return (TRUE) } if(!inherits(phylog,"phylog")) stop ("Object with class 'phylog' expected") nodes.names<- names(phylog$nodes) leaves.names<- names(phylog$leaves) new.names <- names(list.nodes) phylogparts <- phylog$parts if (any(!new.names%in%nodes.names)) stop ("Non convient name in 'list.nodes'") wverif <- unlist(lapply(new.names,verif)) if (any(!wverif)) stop ("Non convient content in 'list.nodes'") tre <- phylog$tre add.t <- !is.null(phylog$Wmat) for (node in new.names) permute(node) if (distance) adddistances () res <- newick2phylog(tre, add.tools= add.t, call = match.call()) return(res) } ade4/R/mbpls.R0000644000176200001440000002421513621207675012545 0ustar liggesusersmbpls <- function(dudiY, ktabX, scale = TRUE, option = c("uniform", "none"), scannf = TRUE, nf = 2) { ## ------------------------------------------------------------------------------- ## Some tests ##-------------------------------------------------------------------------------- if (!inherits(dudiY, "dudi")) stop("object 'dudi' expected") if (!inherits(ktabX, "ktab")) stop("object 'ktab' expected") if (any(row.names(ktabX) != row.names(dudiY$tab))) stop("ktabX and dudiY must have the same rows") if (!(all.equal(ktabX$lw/sum(ktabX$lw), dudiY$lw/sum(dudiY$lw)))) stop("ktabX and dudiY must have the same row weights") if (nrow(dudiY$tab) < 6) stop("Minimum six rows are required") if (any(ktabX$blo < 2)) stop("Minimum two variables per explanatory block are required") if (!(is.logical(scale))) stop("Non convenient selection for scaling") if (!(is.logical(scannf))) stop("Non convenient selection for scannf") if (nf < 0) nf <- 2 ## Only works with centred pca (dudi.pca with center=TRUE) with uniform row weights #if (!any(dudi.type(dudiY$call) == c(3,4))) # stop("Only implemented for centred pca") # Vérifier la formule / arrondi #if (any(dudiY$lw != 1/nrow(dudiY$tab))) # stop("Only implemented for uniform row weights") option <- match.arg(option) ## ------------------------------------------------------------------------------- ## Arguments and data transformation ## ------------------------------------------------------------------------------- ## Preparation of the data frames Y <- scalewt(as.matrix(dudiY$tab), wt = dudiY$lw, center = TRUE, scale = scale) nblo <- length(ktabX$blo) Xk <- lapply(unclass(ktabX)[1 : nblo], scalewt, wt = ktabX$lw, center = TRUE, scale = scale) nr <- nrow(Y) ncolY <- ncol(Y) ## Block weighting if (option[1] == "uniform"){ Y <- Y / sqrt(sum(dudiY$eig)) ## Here we use biased variance. We should use Y <- Y / sqrt(nr/(nr-1)*sum(dudiY$eig)) for unbiased estimators for (k in 1 : nblo){ Xk[[k]] <- Xk[[k]] / sqrt((nblo/nr) * sum(diag(crossprod(Xk[[k]])))) ## same : Xk[[k]] <- Xk[[k]] / sqrt((nblo/(nr-1)) * sum(diag(crossprod(Xk[[k]])))) for unbiased estimators } } X <- cbind.data.frame(Xk) colnames(X) <- col.names(ktabX) ncolX <- ncol(X) maxdim <- qr(X)$rank ##----------------------------------------------------------------------- ## Prepare the outputs ##----------------------------------------------------------------------- ## Yc1 (V in Bougeard et al): was c1 ## lY (U): was ls ## Ajout: de Yco (cov(Y, lX)) -> norme total = eig ## lX (T): was li ## faX (W*): was Wstar ## TlX (Tk): was Tk ## Tfa (Wk): was Wk Tc1 !!!!!!!!! ## Ajout: cov2 (cov^2(lY, Tl1)) ## XYcoef: (Beta) was beta ## bip, bipc ## vip, vipc ## Suppression: W ## Suppression: l1 ## Suppression de C (remplacé par Yco) ## Suppression de Ak (remplacé par cov2) dimlab <- paste("Ax", 1:maxdim, sep = "") res <- list(tabX = X, tabY = as.data.frame(Y), nf = nf, lw = ktabX$lw, X.cw = ktabX$cw, blo = ktabX$blo, rank = maxdim, eig = rep(0, maxdim), TL = ktabX$TL, TC = ktabX$TC) res$Yc1 <- matrix(0, nrow = ncolY, ncol = maxdim, dimnames = list(colnames(dudiY$tab), dimlab)) res$lX <- res$lY <- matrix(0, nrow = nr, ncol = maxdim, dimnames = list(row.names(dudiY$tab), dimlab)) res$cov2 <- Ak <- matrix(0, nrow = nblo, ncol = maxdim, dimnames = list(names(ktabX$blo), dimlab)) res$Tc1 <- lapply(1:nblo, function(k) matrix(0, nrow = ncol(Xk[[k]]), ncol = maxdim, dimnames = list(colnames(Xk[[k]]), dimlab))) res$TlX <- rep(list(matrix(0, nrow = nr, ncol = maxdim, dimnames = list(row.names(dudiY$tab), dimlab))), nblo) res$faX <- matrix(0, nrow = ncolX, ncol = maxdim, dimnames = list(col.names(ktabX), dimlab)) lX1 <- res$lX W <- res$faX ##----------------------------------------------------------------------- ## Compute components and loadings by an iterative algorithm ##----------------------------------------------------------------------- Y <- as.matrix(Y) X <- as.matrix(X) f1 <- function(x) crossprod(x * res$lw, Y) for(h in 1 : maxdim) { ## iterative algorithm ## Compute the matrix M for the eigenanalysis M <- lapply(lapply(Xk, f1), crossprod) M <- Reduce("+", M) ## Compute the loadings V and the components U (Y dataset) eig.M <- eigen(M) if (eig.M$values[1] < sqrt(.Machine$double.eps)) { res$rank <- h-1 ## update the rank break } res$eig[h] <- eig.M$values[1] res$Yc1[, h] <- eig.M$vectors[, 1, drop = FALSE] res$lY[, h] <- Y %*% res$Yc1[, h] ## Compute the loadings Wk and the components Tk (Xk datasets) covutk <- rep(0, nblo) for (k in 1 : nblo) { res$Tc1[[k]][, h] <- crossprod(Xk[[k]] * res$lw, res$lY[, h]) res$Tc1[[k]][, h] <- res$Tc1[[k]][, h] / sqrt(sum(res$Tc1[[k]][, h]^2)) res$TlX[[k]][, h] <- Xk[[k]] %*% res$Tc1[[k]][, h] covutk[k] <- crossprod(res$lY[, h] * res$lw, res$TlX[[k]][, h]) res$cov2[k, h] <- covutk[k]^2 } for(k in 1 : nblo) { Ak[k, h] <- covutk[k] / sqrt(sum(res$cov2[,h])) res$lX[, h] <- res$lX[, h] + Ak[k, h] * res$TlX[[k]][, h] } lX1[, h] <- res$lX[, h] / sqrt(sum(res$lX[, h]^2)) ## use ginv to avoid NA in coefficients (collinear system) W[, h] <- tcrossprod(ginv(crossprod(X)), X) %*% res$lX[, h] ## Deflation of the Xk datasets on the global components T Xk <- lapply(Xk, function(y) lm.wfit(x = as.matrix(res$lX[, h]), y = y, w = res$lw)$residuals) X <- as.matrix(cbind.data.frame(Xk)) } ##----------------------------------------------------------------------- ## Compute regressions coefficients ##----------------------------------------------------------------------- ## Use of the original (and not the deflated) datasets X and Y X <- as.matrix(res$tabX) Y <- as.matrix(res$tabY) ## Computing the regression coefficients of X onto the global components T (Wstar) ## res$faX <- lm.wfit(x = X, y = res$lX, w = res$lw)$coefficients ## lm is not used to avoid NA coefficients in the case of not full rank matrices res$faX[, 1] <- W[, 1, drop = FALSE] A <- diag(ncolX) if(maxdim >= 2){ for(h in 2:maxdim){ a <- crossprod(lX1[, h-1], X) / sqrt(sum(res$lX[, h-1]^2)) A <- A %*% (diag(ncolX) - W[, h-1] %*% a) res$faX[, h] <- A %*% W[, h] X <- X - tcrossprod(lX1[, h-1]) %*% X } } ## Computing the regression coefficients of X onto Y (Beta) res$Yco <- t(Y) %*% diag(res$lw) %*% res$lX norm.li <- diag(crossprod(res$lX * sqrt(res$lw))) ##res$C <- t(lm.wfit(x = res$lX, y = Y, w = res$lw)$coefficients) ##res$XYcoef <- lapply(1:ncolY, function(x) t(apply(sweep(res$faX, 2 , res$C[x,], "*"), 1, cumsum))) res$XYcoef <- lapply(1:ncolY, function(x) t(apply(sweep(res$faX, 2 , res$Yco[x,] / norm.li, "*"), 1, cumsum))) names(res$XYcoef) <- colnames(dudiY$tab) ## Computing the intercept X <- cbind.data.frame(lapply(unclass(ktabX)[1 : nblo], scalewt, wt = dudiY$lw, center = FALSE, scale = scale)) if (any(apply(X, 2, weighted.mean, w = dudiY$lw) < sqrt(.Machine$double.eps)) == FALSE & scale == TRUE) { ## i.e. center=F, scale=T meanY <- apply(sweep(as.matrix(dudiY$tab), 2, sqrt(apply(dudiY$tab, 2, varwt, wt = dudiY$lw)), "/"), 2, weighted.mean, w = dudiY$lw) meanX <- apply(sweep(as.matrix(X), 2, sqrt(apply(X, 2, varwt, wt = dudiY$lw)), "/"), 2, weighted.mean, w = dudiY$lw) } else { meanY <- apply(as.matrix(dudiY$tab), 2, weighted.mean, w = dudiY$lw) meanX <- apply(as.matrix(X), 2, weighted.mean, w = dudiY$lw) } res$intercept <- lapply(1:ncolY, function(x) (meanY[x] - meanX %*% res$XYcoef[[x]])) names(res$intercept) <- colnames(dudiY$tab) ##----------------------------------------------------------------------- ## Variable and block importances ##----------------------------------------------------------------------- ## Block importances res$bip <- Ak^2 if (nblo == 1 | res$rank ==1) res$bipc <- res$bip else res$bipc <- t(sweep(apply(sweep(res$bip, 2, res$eig, "*") , 1, cumsum), 1, cumsum(res$eig), "/")) ## Variable importances WcarreAk <- res$faX^2 * res$bip[rep(1:nblo, ktabX$blo),] res$vip <- sweep(WcarreAk, 2, colSums(WcarreAk), "/") if (nblo == 1 | res$rank ==1) res$vipc <- res$vip else res$vipc <- t(sweep(apply(sweep(res$vip, 2, res$eig, "*") , 1, cumsum), 1, cumsum(res$eig), "/")) ##----------------------------------------------------------------------- ## Modify the outputs ##----------------------------------------------------------------------- if (scannf) { barplot(res$eig[1:res$rank]) cat("Select the number of global components: ") res$nf <- as.integer(readLines(n = 1)) messageScannf(match.call(), res$nf) } if(res$nf > res$rank) res$nf <- res$rank ## keep results for the nf dimensions (except eigenvalues and lX) res$eig <- res$eig[1:res$rank] res$lX <- res$lX[, 1:res$rank] res$Tc1 <- do.call("rbind", res$Tc1) res$TlX <- do.call("rbind", res$TlX) res <- modifyList(res, lapply(res[c("Yc1", "Yco", "lY", "Tc1", "TlX", "cov2", "faX", "vip", "vipc", "bip", "bipc")], function(x) x[, 1:res$nf, drop = FALSE])) res$XYcoef <- lapply(res$XYcoef, function(x) x[, 1:res$nf, drop = FALSE]) res$intercept <- lapply(res$intercept, function(x) x[, 1:res$nf, drop = FALSE]) res$call <- match.call() class(res) <- c("multiblock", "mbpls") return(res) } ade4/R/s.corcircle.R0000644000176200001440000000620512576021756013637 0ustar liggesusers"s.corcircle" <- function (dfxy, xax = 1, yax = 2, label = row.names(df), clabel = 1, grid = TRUE, sub = "", csub = 1, possub = "bottomleft", cgrid = 0, fullcircle = TRUE, box = FALSE, add.plot = FALSE) { arrow1 <- function(x0, y0, x1, y1, len = 0.1, ang = 15, lty = 1, edge) { d0 <- sqrt((x0 - x1)^2 + (y0 - y1)^2) if (d0 < 1e-07) return(invisible()) segments(x0, y0, x1, y1, lty = lty) h <- strheight("A", cex = par("cex")) if (d0 > 2 * h) { x0 <- x1 - h * (x1 - x0)/d0 y0 <- y1 - h * (y1 - y0)/d0 if (edge) arrows(x0, y0, x1, y1, angle = ang, length = len, lty = 1) } } scatterutil.circ <- function(cgrid, h, grid) { cc <- seq(from = -1, to = 1, by = h) col <- "lightgray" if(grid){ for (i in 1:(length(cc))) { x <- cc[i] a1 <- sqrt(1 - x * x) a2 <- (-a1) segments(x, a1, x, a2, col = col) segments(a1, x, a2, x, col = col) } } symbols(0, 0, circles = 1, inches = FALSE, add = TRUE) segments(-1, 0, 1, 0) segments(0, -1, 0, 1) if (cgrid <= 0 | !grid) return(invisible()) cha <- paste("d = ", h, sep = "") cex0 <- par("cex") * cgrid xh <- strwidth(cha, cex = cex0) yh <- strheight(cha, cex = cex0) + strheight(" ", cex = cex0)/2 x0 <- strwidth(" ", cex = cex0) y0 <- strheight(" ", cex = cex0)/2 x1 <- par("usr")[2] y1 <- par("usr")[4] rect(x1 - x0, y1 - y0, x1 - xh - x0, y1 - yh - y0, col = "white", border = 0) text(x1 - xh/2 - x0/2, y1 - yh/2 - y0/2, cha, cex = cex0) } origin <-c(0,0) df <- data.frame(dfxy) if (!is.data.frame(df)) stop("Non convenient selection for df") if ((xax < 1) || (xax > ncol(df))) stop("Non convenient selection for xax") if ((yax < 1) || (yax > ncol(df))) stop("Non convenient selection for yax") x <- df[, xax] y <- df[, yax] if (add.plot) { for (i in 1:length(x)) arrow1(0, 0, x[i], y[i], len = 0.1, ang = 15, edge = TRUE) if (clabel > 0) scatterutil.eti.circ(x, y, label, clabel) return(invisible()) } opar <- par(mar = par("mar")) on.exit(par(opar)) par(mar = c(0.1, 0.1, 0.1, 0.1)) x1 <- x y1 <- y x1 <- c(x1, -0.01, +0.01) y1 <- c(y1, -0.01, +0.01) if (fullcircle) { x1 <- c(x1, -1, 1) y1 <- c(y1, -1, 1) } x1 <- c(x1 - diff(range(x1)/20), x1 + diff(range(x1))/20) y1 <- c(y1 - diff(range(y1)/20), y1 + diff(range(y1))/20) plot(x1, y1, type = "n", ylab = "", asp = 1, xaxt = "n", yaxt = "n", frame.plot = FALSE) scatterutil.circ(cgrid = cgrid, h = 0.2,grid=grid) for (i in 1:length(x)) arrow1(0, 0, x[i], y[i], len = 0.1, ang = 15, edge = TRUE) if (clabel > 0) scatterutil.eti.circ(x, y, label, clabel,origin) if (csub > 0) scatterutil.sub(sub, csub, possub) if (box) box() invisible(match.call()) } ade4/R/pcaiv.R0000644000176200001440000001561613102043107012515 0ustar liggesusers"pcaiv" <- function (dudi, df, scannf = TRUE, nf = 2) { lm.pcaiv <- function(x, df, weights, use) { if (!inherits(df, "data.frame")) stop("data.frame expected") reponse.generic <- x begin <- "reponse.generic ~ " fmla <- as.formula(paste(begin, paste(names(df), collapse = "+"))) df <- cbind.data.frame(reponse.generic, df) lm0 <- lm(fmla, data = df, weights = weights) if (use == 0) return(predict(lm0)) else if (use == 1) return(residuals(lm0)) else if (use == -1) return(lm0) else stop("Non convenient use") } if (!inherits(dudi, "dudi")) stop("dudi is not a 'dudi' object") df <- data.frame(df) if (!inherits(df, "data.frame")) stop("df is not a 'data.frame'") if (nrow(df) != length(dudi$lw)) stop("Non convenient dimensions") weights <- dudi$lw isfactor <- unlist(lapply(as.list(df), is.factor)) for (i in 1:ncol(df)) { if (!isfactor[i]) df[, i] <- scalewt(df[, i], weights) } tab <- data.frame(apply(dudi$tab, 2, lm.pcaiv, df = df, use = 0, weights = dudi$lw)) X <- as.dudi(tab, dudi$cw, dudi$lw, scannf = scannf, nf = nf, call = match.call(), type = "pcaiv") X$X <- df X$Y <- dudi$tab U <- as.matrix(X$c1) * unlist(X$cw) U <- as.matrix(dudi$tab) %*% U U <- data.frame(U) row.names(U) <- row.names(dudi$tab) names(U) <- names(X$li) X$ls <- U U <- as.matrix(X$c1) * unlist(X$cw) U <- data.frame(t(as.matrix(dudi$c1)) %*% U) row.names(U) <- names(dudi$li) names(U) <- names(X$li) X$as <- U w <- apply(X$ls, 2, function(x) coefficients(lm.pcaiv(x, df, weights, -1))) w <- data.frame(w) names(w) <- names(X$l1) X$fa <- w fmla <- as.formula(paste("~ ", paste(names(df), collapse = "+"))) w <- scalewt(model.matrix(fmla, data = df)[,-1], weights) * weights w <- t(w) %*% as.matrix(X$l1) w <- data.frame(w) X$cor <- w if (inherits(dudi, "coa")) class(X) <- c("caiv", class(X)) return(X) } "plot.pcaiv" <- function (x, xax = 1, yax = 2, ...) { if (!inherits(x, "pcaiv")) stop("Use only with 'pcaiv' objects") if (x$nf == 1) { warnings("One axis only : not yet implemented") return(invisible()) } if (xax > x$nf) stop("Non convenient xax") if (yax > x$nf) stop("Non convenient yax") def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) layout(matrix(c(1, 2, 3, 4, 4, 5, 4, 4, 6), 3, 3), respect = TRUE) par(mar = c(0.1, 0.1, 0.1, 0.1)) # modif mail P. Giraudoux 25/10/2004 s.arrow(na.omit(x$fa), xax, yax, sub = "Loadings", csub = 2, clabel = 1.25) s.arrow(na.omit(x$cor), xax = xax, yax = yax, sub = "Correlation", csub = 2, clabel = 1.25) s.corcircle(x$as, xax, yax, sub = "Inertia axes", csub = 2) s.match(x$li, x$ls, xax, yax, clabel = 1.5, sub = "Scores and predictions", csub = 2) if (inherits(x, "caiv")) s.label(x$co, xax, yax, clabel = 0, cpoint = 3, add.plot = TRUE) if (inherits(x, "caiv")) s.label(x$co, xax, yax, clabel = 1.25, sub = "Species", csub = 2) else s.arrow(x$c1, xax = xax, yax = yax, sub = "Variables", csub = 2, clabel = 1.25) scatterutil.eigen(x$eig, wsel = c(xax, yax)) } "print.pcaiv" <- function (x, ...) { if (!inherits(x, "pcaiv")) stop("to be used with 'pcaiv' object") if (inherits(x, "caiv")) cat("Canonical correspondence analysis\n") else cat("Principal Component Analysis with Instrumental Variables\n") cat("call: ") print(x$call) cat("class: ") cat(class(x), "\n") cat("\n$rank (rank) :", x$rank) cat("\n$nf (axis saved) :", x$nf) cat("\n\neigen values: ") l0 <- length(x$eig) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n\n") else cat("\n\n") sumry <- array("", c(3, 4), list(rep("", 3), c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$eig", length(x$eig), mode(x$eig), "eigen values") sumry[2, ] <- c("$lw", length(x$lw), mode(x$lw), "row weigths (from dudi)") sumry[3, ] <- c("$cw", length(x$cw), mode(x$cw), "col weigths (from dudi)") print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(3, 4), list(rep("", 3), c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$Y", nrow(x$Y), ncol(x$Y), "Dependant variables") sumry[2, ] <- c("$X", nrow(x$X), ncol(x$X), "Explanatory variables") sumry[3, ] <- c("$tab", nrow(x$tab), ncol(x$tab), "modified array (projected variables)") print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(4, 4), list(rep("", 4), c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$c1", nrow(x$c1), ncol(x$c1), "PPA Pseudo Principal Axes") sumry[2, ] <- c("$as", nrow(x$as), ncol(x$as), "Principal axis of dudi$tab on PAP") sumry[3, ] <- c("$ls", nrow(x$ls), ncol(x$ls), "projection of lines of dudi$tab on PPA") sumry[4, ] <- c("$li", nrow(x$li), ncol(x$li), "$ls predicted by X") print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(4, 4), list(rep("", 4), c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$fa", nrow(x$fa), ncol(x$fa), "Loadings (CPC as linear combinations of X") sumry[2, ] <- c("$l1", nrow(x$l1), ncol(x$l1), "CPC Constraint Principal Components") sumry[3, ] <- c("$co", nrow(x$co), ncol(x$co), "inner product CPC - Y") sumry[4, ] <- c("$cor", nrow(x$cor), ncol(x$cor), "correlation CPC - X") print(sumry, quote = FALSE) cat("\n") } summary.pcaiv <- function(object, ...){ if (inherits(object, "caiv")) thetitle <- "Canonical correspondence analysis" else thetitle <- "Principal component analysis with instrumental variables" cat(thetitle) cat("\n\n") NextMethod() appel <- as.list(object$call) dudi <- eval.parent(appel$dudi) cat(paste("Total unconstrained inertia (", deparse(appel$dudi), "): ", sep = "")) cat(signif(sum(dudi$eig), 4)) cat("\n\n") cat(paste("Inertia of", deparse(appel$dudi), "explained by", deparse(appel$df), "(%): ")) cat(signif(sum(object$eig) / sum(dudi$eig) * 100, 4)) cat("\n\n") if (!inherits(object, "caiv")) { cat("Decomposition per axis:\n") sumry <- array(0, c(object$nf, 7), list(1:object$nf, c("iner", "inercum", "inerC", "inercumC", "ratio", "R2", "lambda"))) sumry[, 1] <- dudi$eig[1:object$nf] sumry[, 2] <- cumsum(dudi$eig[1:object$nf]) varpro <- apply(object$ls, 2, function(x) sum(x * x * object$lw)) sumry[, 3] <- varpro sumry[, 4] <- cumsum(varpro) sumry[, 5] <- cumsum(varpro)/cumsum(dudi$eig[1:object$nf]) sumry[, 6] <- object$eig[1:object$nf]/varpro sumry[, 7] <- object$eig[1:object$nf] print(sumry, digits = 3) invisible(sumry) } } ade4/R/table.phylog.R0000644000176200001440000001115412576021756014020 0ustar liggesusers"table.phylog" <- function (df, phylog, x = 1:ncol(df), f.phylog = 0.5, labels.row = gsub("[_]"," ",row.names(df)), clabel.row = 1, labels.col = names(df), clabel.col = 1, labels.nod = names(phylog$nodes), clabel.nod = 0, cleaves = 1, cnodes = 1, csize = 1, grid = TRUE, clegend=0.75) { df <- as.data.frame(df) if (!inherits(df,"data.frame")) stop ("data.frame expected for 'df'") if (!inherits(phylog,"phylog")) stop ("class 'phylog' expected for 'phylog'") leave.names <- names(phylog$leaves) node.names <- names(phylog$nodes) n.leave <- length(leave.names) n.node <- length(node.names) if (f.phylog > 0.8) f.phylog <- 0.8 if (f.phylog < 0.2) f.phylog <- 0.2 opar <- par(mai = par("mai"), srt = par("srt")) on.exit(par(opar)) w1 <- sort(row.names(df)) w2 <- sort(names(phylog$leaves)) if (!all(w1 == w2)) { print.noquote("names from 'df'") print(w1) print.noquote("names from 'phylog'") print(w2) stop ("non convenient matching information") } df <- df[names(phylog$leaves), ] # df données phylog structure frame() labels.row <- paste(" ", labels.row, " ", sep = "") labels.col <- paste(" ", labels.col, " ", sep = "") cexrow <- par("cex") * clabel.row strx <- 0.1 if (cexrow > 0) { strx <- max( strwidth(labels.row, units = "inches", cex = cexrow))+0.1 } cexcol <- par("cex") * clabel.col stry <- 0.1 if (cexcol > 0) { stry <- max( strwidth(labels.col, units = "inches", cex = cexcol))+0.1 } par(mai = c(0.1, 0.1, stry, strx)) #nc <- ncol(df) #x <- 1/2/nc+(0:(nc-1))/nc # modif du 06/01/2005 le oaramètre x avait été oublié intermin <- abs(min(diff(sort(x)))) intertot <- abs(max(x)-min(x)) x <- (x-min(x)+intermin)/(intertot+2*intermin) x <- (1 - f.phylog) * x + f.phylog nl <- nrow(df) y <- 1/2/nl+((nl-1):0)/nl par(new = TRUE) plot.default(0, 0, type = "n", xlab = "", ylab = "", xaxt = "n", yaxt = "n", xlim = c(-0.075,1), ylim = c(0,1), xaxs = "i", yaxs = "i", frame.plot = FALSE) if (cexrow > 0) { for (i in 1:length(y)) { text(1.01, y[i], labels.row[i], adj = 0, cex = cexrow, xpd = NA) segments(1, y[i], 1.01, y[i], xpd = NA) } } if (cexcol > 0) { par(srt = 90) for (i in 1:length(x)) { text(x[i], 1.01, labels.col[i], adj = 0, cex = cexcol, xpd = NA) segments(x[i], 1.0, x[i], 1.01,, xpd = NA) } par(srt = 0) } if (grid) { col <- "lightgray" for (i in 1:length(y)) segments(1,y[i], f.phylog, y[i], col = col) for (i in 1:length(x)) segments(x[i], 0, x[i], 1, col = col) } rect(f.phylog, 0, 1, 1) xtot <- x[col(as.matrix(df))] ytot <- y[row(as.matrix(df))] coeff <- diff(range(xtot))/15 z <- unlist(df) sq <- sqrt(abs(z)) w1 <- max(sq) sq <- csize * coeff * sq/w1 for (i in 1:length(z)) { if (sign(z[i]) >= 0) { symbols(xtot[i], ytot[i], squares = sq[i], bg = "black", fg = "white", add = TRUE, inches = FALSE) } else { symbols(xtot[i], ytot[i], squares = sq[i], bg = "white", fg = "black", add = TRUE, inches = FALSE) } } br0 <- pretty(z, 4) l0 <- length(br0) br0 <- (br0[1:(l0 - 1)] + br0[2:l0])/2 sq0 <- sqrt(abs(br0)) sq0 <- csize * coeff * sq0/w1 sig0 <- sign(br0) dis <- phylog$droot dn <- phylog$droot[node.names] names(y) <- leave.names x <- dis x <- (x/max(x)) * f.phylog for (i in 1:n.leave) { segments(f.phylog, y[i], x[i], y[i], col = grey(0.7)) points(x[i], y[i], pch = 20, cex = par("cex") * cleaves) } newlab <- as.character(1:length(phylog$nodes)) newx <- NULL newy <- NULL yn <- rep(0, length(dn)) names(yn) <- names(dn) y <- c(y, yn) for (i in 1:n.node) { w <- phylog$parts[[i]] if (clabel.nod>0) newlab[i] <- labels.nod[i] but <- names(phylog$parts)[i] y[but] <- mean(y[w]) newy[i] <- y[but] newx[i] <- x[but] b <- range(y[w]) segments(x[but], b[1], x[but], b[2]) x1 <- x[w] y1 <- y[w] x2 <- rep(x[but], length(w)) segments(x1, y1, x2, y1) } if (cnodes > 0) points(newx, newy, pch = 21, bg="white", cex = par("cex") * cnodes, xpd=NA) if (clabel.nod>0) (scatterutil.eti(newx,newy,newlab,clabel.nod)) if (clegend > 0) scatterutil.legend.bw.square(br0, sq0, sig0, clegend) } ade4/R/gearymoran.R0000644000176200001440000000204313050632301013547 0ustar liggesusers"gearymoran" <- function (bilis, X, nrepet = 999,alter = c("greater", "less", "two-sided")) { alter <- match.arg(alter) ## bilis doit être une matrice bilis <- as.matrix(bilis) nobs <- ncol(bilis) # bilis doit être carrée if (nrow(bilis) != nobs) stop ("'bilis' is not squared") # bilis doit être symétrique bilis <- (bilis + t(bilis))/2 # bilis doit être à termes positifs (voisinages) if (any(bilis<0)) stop ("term <0 found in 'bilis'") test.names <- names(X) X <- data.matrix(X) if (nrow(X) != nobs) stop ("non convenient dimension") nvar <- ncol(X) res <- .C("gearymoran", param = as.integer(c(nobs,nvar,nrepet)), data = as.double(X), bilis = as.double(bilis), obs = double(nvar), result = double (nrepet*nvar), obstot = double(1), restot = double (nrepet), PACKAGE="ade4" ) res <- as.krandtest(obs = res$obs, sim = matrix(res$result, ncol = nvar, byrow = TRUE), names = test.names, alter = alter) return(res) } ade4/R/amova.R0000644000176200001440000002312112576021756012530 0ustar liggesusersamova <- function(samples, distances = NULL, structures = NULL) { # checking of user's data and initialization. if (!inherits(samples, "data.frame")) stop("Non convenient samples") if (any(samples < 0)) stop("Negative value in samples") nhap <- nrow(samples) ; if (!is.null(distances)) { if (!inherits(distances, "dist")) stop("Object of class 'dist' expected for distances") if (!is.euclid(distances)) stop("Euclidean property is expected for distances") distances <- as.matrix(distances)^2 if (nrow(samples)!= nrow(distances)) stop("Non convenient samples") } if (is.null(distances)) distances <- (matrix(1, nhap, nhap) - diag(rep(1, nhap))) * 2 if (!is.null(structures)) { if (!inherits(structures, "data.frame")) stop("Non convenient structures") m <- match(apply(structures, 2, function(x) length(x)), ncol(samples), 0) if (length(m[m == 1]) != ncol(structures)) stop("Non convenient structures") m <- match(tapply(1:ncol(structures), as.factor(1:ncol(structures)), function(x) is.factor(structures[, x])), TRUE , 0) if (length(m[m == 1]) != ncol(structures)) stop("Non convenient structures") } # intern functions (computations of the sums of squares and mean squares) : #Diversity <- function(d2, nbhaplotypes, freq) { # diversity index according to Rao s quadratic entropy # div <- nbhaplotypes / 2 * (t(freq) %*% d2 %*% freq) # return(div) #} Ssd.util <- function(dp2, Np, unit) { # Deductions of the distances between two groups. # Deductions of the weight and composition of a group. if (!is.null(unit)) { modunit <- model.matrix(~ -1 + unit) sumcol <- apply(Np, 2, sum) Ng <- modunit * sumcol lesnoms <- levels(unit) } else { Ng <- as.matrix(Np) lesnoms <- colnames(Np) } sumcol <- apply(Ng, 2, sum) Lg <- t(t(Ng)/sumcol) colnames(Lg) <- lesnoms Pg <- as.matrix(apply(Ng, 2, sum) / nbhaplotypes) rownames(Pg) <- lesnoms deltag <- as.matrix(apply(Lg, 2, function(x) t(x) %*% dp2 %*% x)) ug <- matrix(1, ncol(Lg), 1) dg2 <- t(Lg) %*% dp2 %*% Lg - 1 / 2 * (deltag %*% t(ug) + ug %*% t(deltag)) colnames(dg2) <- lesnoms rownames(dg2) <- lesnoms return(list(dg2 = dg2, Ng = Ng, Pg = Pg)) } Ssd <- function(distances, nbhaplotypes, samples, structures) { # Computation of the sum of squared deviation. Ph <- as.matrix(apply(samples, 1, sum) / nbhaplotypes) ssdt <- nbhaplotypes / 2 * t(Ph) %*% distances %*% Ph ssdutil <- list(0) ssdutil[[1]] <- Ssd.util(dp2 = distances, Np = samples, NULL) if (!is.null(structures)) { for (i in 1:length(structures)) { if (i != 1) { unit <- structures[(1:length(structures[, i])) [!duplicated(structures[, i - 1])], i] unit <- factor(unit, levels = unique(unit)) } else unit <- factor(structures[, i], levels = unique(structures[, i])) ssdutil[[i + 1]] <- Ssd.util(ssdutil[[i]]$dg2, ssdutil[[i]]$Ng, unit) } } diversity <- c(ssdt, unlist(lapply(ssdutil, function(x) nbhaplotypes / 2 * t(x$Pg) %*% x$dg2 %*% x$Pg))) diversity2 <- c(diversity[-1], 0) ssdtemp <- diversity - diversity2 ssd <- c(ssdtemp[length(ssdtemp):1], ssdt) return(ssd) } Nbunits <- function(structures2) { # nb of units in each levels. return(apply(structures2, 2, function(x) length(levels(as.factor(x))))) } Ddl <- function(nbunits, nbhaplotypes) { # degrees of freedom. ddl1 <- c(nbunits, nbhaplotypes, nbhaplotypes) ddl2 <- c(1, nbunits, 1) ddl <- ddl1 - ddl2 return(as.vector(ddl)) } N <- function(structures, samples, nbhaplotypes, ddl) { # n values. nbind1temp <- apply(samples, 2, sum) nbind1 <- rep(nbind1temp, nbind1temp) nbhapl <- rep(nbhaplotypes, nbhaplotypes) if (!is.null(structures)) { nbind <- lapply(as.list(structures), function(x) tapply(nbind1temp, x, sum)[as.numeric(x)]) nbind <- lapply(nbind, function(x) rep(x, nbind1temp)) nbind <- c(list(nbhapl), nbind[length(nbind):1], list(nbind1)) } else nbind <- c(list(nbhapl), list(nbind1)) n1 <- as.vector(tapply((2:length(nbind)), as.factor(2:length(nbind)), function(x) (nbhaplotypes - (sum((nbind[[x]]) / nbind[[x-1]]))))) ddlutil <- ddl[(length(ddl) - 2):1] if (!is.null(structures)) { N2 <- function(x) { tapply((x + 1):length(nbind), as.factor((x + 1):length(nbind)), function(i) sum(nbind[[i]] * (1 / nbind[[x]] - 1 / nbind[[x - 1]]))) } n <- rep(0, sum(1:(dim(structures)[2] + 1))) n1 <- n1[length(n1):1] n[cumsum(1:(dim(structures)[2] + 1))] <- n1 if ((length(nbind) - 1) >= 2) { n2 <- as.vector(unlist(tapply(2:(length(nbind) - 1), as.factor(2:(length(nbind) - 1)), N2))) n2 <- n2[length(n2):1] n[-(cumsum(1:(dim(structures)[2] + 1)))] <- n2 } ddlutil <- ddlutil[rep(1:(dim(structures)[2] + 1), 1:(dim(structures)[2] + 1))] } else n <- n1 n <- n / ddlutil return(n) } Cm <- function(ssd, ddl) { # mean squares. return(c(ssd / ddl)) } Sigma <- function(cm, n) { # covariance components. cmutil <- cm[(length(cm) - 1):1] sigma2W <- cmutil[1] res <- rep(0, length(cm) - 1) res[1] <- sigma2W res[2] <- (cmutil[2] - sigma2W) / n[1] if (length(res) > 2) { for (i in 3:(length(cm) - 1)) { index <- cumsum(c(2, (2:(length(cm) - 1)))) ni <- n[index[i - 2]:(index[i - 1] - 2)] nj <- n[index[i - 1] - 1] si <- ni * res[2:(i - 1)] res[i] <- (cmutil[i] - sigma2W - sum(si)) / nj } } sigma2t <- sum(res) return(c(res[length(res):1], sigma2t)) } Pourcent <- function(sigma) { # covariance percentages. return(sigma / sigma[length(sigma)] * 100) } Procedure <- function(distances, nbhaplotypes, samples, structures, ddl) { ssd <- Ssd(distances, nbhaplotypes, samples, structures) cm <- Cm(ssd, ddl) n <- N(structures, samples, nbhaplotypes, ddl) sigma <- Sigma(cm, n) return(list(ssd = ssd, cm = cm, sigma = sigma, n = n)) } Statphi <- function(sigma) { # Phi-statistics. f <- rep(0, length(sigma) - 1) if (length(sigma) == 3) { f <- rep(0, 1) } f[1] <- (sigma[length(sigma)] - sigma[length(sigma) - 1]) / sigma[length(sigma)] if (length(f) > 1) { s1 <- cumsum(sigma[(length(sigma) - 1):2])[-1] s2 <- sigma[(length(sigma) - 2):2] f[length(f)] <- sigma[1] / sigma[length(sigma)] f[2:(length(f) - 1)] <- s2 / s1 } return(f) } # main procedure. nbhaplotypes <- sum(samples) if (!is.null(structures)) { structures2 <- cbind.data.frame(structures[length(structures):1], as.factor(colnames(samples, do.NULL = FALSE))) } else structures2 <- as.data.frame(as.factor(colnames(samples, do.NULL = FALSE))) nbunits <- Nbunits(structures2) ddl <- Ddl(nbunits, nbhaplotypes) proc <- Procedure(distances, nbhaplotypes, samples, structures, ddl) ssd <- proc$ssd cm <- proc$cm sigma <- proc$sigma # Interface. if (!is.null(structures)) { lesnoms1 <- rep("Between", ncol(structures) + 1) lesnoms2 <- c(names(structures)[ncol(structures):1], "samples") lesnoms3 <- c("", rep("Within", ncol(structures))) lesnoms4 <- c("", names(structures)[ncol(structures):1]) lesnoms <- c(paste(lesnoms1, lesnoms2, lesnoms3, lesnoms4), "Within samples", "Total") } else lesnoms <- c("Between samples", "Within samples", "Total") pourcent <- Pourcent(sigma) results <- data.frame(ddl, ssd, cm) names(results) <- c("Df", "Sum Sq", "Mean Sq") rownames(results) <- lesnoms sourceofvariation <- c(paste("Variations ", rownames(results)[1:(nrow(results) - 1)]), "Total variations") componentsofcovariance <- data.frame(sigma, pourcent) names(componentsofcovariance) <- c("Sigma", "%") rownames(componentsofcovariance) <- sourceofvariation call <- match.call() res <- list(call = call, results = results, componentsofcovariance = componentsofcovariance, distances = as.dist(distances), samples = samples, structures = structures) f <- Statphi(sigma) statphi <- as.data.frame(f) names(statphi) <- "Phi" lesnoms1 <- c(rep("Phi", length(f))) if (length(f) == 1) { lesnoms2 <- c("samples") lesnoms3 <- c("total") } else { lesnoms2 <- c(rep("samples", 2), names(structures)) lesnoms3 <- c("total", names(structures), "total") } rownames(statphi) <- paste(lesnoms1, lesnoms2, lesnoms3, sep = "-") res <- list(call = call, results = results, componentsofcovariance = componentsofcovariance, statphi = statphi, distances = as.dist(distances), samples = samples, structures = structures) class(res) <- "amova" return(res) } print.amova <- function(x, full = FALSE, ...) { if (full == TRUE) print(x) else print(x[-((length(x) - 2):length(x))]) } ade4/R/randxval.R0000644000176200001440000000214112576021756013243 0ustar liggesusersas.randxval <- function(RMSEc, RMSEv, quantiles = c(0.25, 0.75), call = match.call()){ ## RMSEc: a vector (length n) with residual mean square error of calibration ## RMSEv: a vector (length n) with residual mean square error of validation ## n: number of repetitions if(length(RMSEc) != length(RMSEv)) stop("Both RMSE should be computed on the same number of repetitions") res <- list(RMSEc = RMSEc, RMSEv = RMSEv, rep = c(length(na.omit(RMSEc)), length(na.omit(RMSEv)))) res$stats <- rbind(quantile(RMSEc, probs = quantiles, na.rm = TRUE), quantile(RMSEv, probs = quantiles, na.rm = TRUE)) res$stats <- cbind(Mean = c(mean(RMSEc), mean(RMSEv)), res$stats) rownames(res$stats) <- c("RMSEc", "RMSEv") res$call <- call class(res) <- "randxval" return(res) } print.randxval <- function(x, ...){ if (!inherits(x, "randxval")) stop("Non convenient data") cat("Two-fold cross-validation\n") cat("Call: ") print(x$call) cat("\nRoot mean square error of calibration and validation:\n") print(cbind.data.frame(N.rep = x$rep, x$stats)) } ade4/R/scatterutil.R0000644000176200001440000005257512715366676014017 0ustar liggesusers############ scatterutil.base ################# "scatterutil.base" <- function (dfxy, xax, yax, xlim, ylim, grid, addaxes, cgrid, include.origin, origin, sub, csub, possub, pixmap, contour, area, add.plot) { df <- data.frame(dfxy) if (!is.data.frame(df)) stop("Non convenient selection for df") if ((xax < 1) || (xax > ncol(df))) stop("Non convenient selection for xax") if ((yax < 1) || (yax > ncol(df))) stop("Non convenient selection for yax") x <- df[, xax] y <- df[, yax] if (is.null(xlim)) { x1 <- x if (include.origin) x1 <- c(x1, origin[1]) x1 <- c(x1 - diff(range(x1)/10), x1 + diff(range(x1))/10) xlim <- range(x1) } if (is.null(ylim)) { y1 <- y if (include.origin) y1 <- c(y1, origin[2]) y1 <- c(y1 - diff(range(y1)/10), y1 + diff(range(y1))/10) ylim <- range(y1) } if (!is.null(pixmap)) { if (is.null(class(pixmap))) pixmap <- NULL if (is.na(charmatch("pixmap", class(pixmap)))) pixmap <- NULL } if (!is.null(contour)) { if (!is.data.frame(contour)) contour <- NULL if (ncol(contour) != 4) contour <- NULL } if (!is.null(area)) { if (!is.data.frame(area)) area <- NULL if (!is.factor(area[, 1])) area <- NULL if (ncol(area) < 3) area <- NULL } if ( !add.plot) plot.default(0, 0, type = "n", asp = 1, xlab = "", ylab = "", xaxt = "n", yaxt = "n", xlim = xlim, ylim = ylim, xaxs = "i", yaxs = "i", frame.plot = FALSE) if (!is.null(pixmap)) { pixmap::plot(pixmap, add = TRUE) } if (!is.null(contour)) { apply(contour, 1, function(x) segments(x[1], x[2], x[3], x[4], lwd = 1)) } if (grid & !add.plot) scatterutil.grid(cgrid) if (addaxes & !add.plot) abline(h = 0, v = 0, lty = 1) if (!is.null(area)) { nlev <- nlevels(area[, 1]) x1 <- area[, 2] x2 <- area[, 3] for (i in 1:nlev) { lev <- levels(area[, 1])[i] a1 <- x1[area[, 1] == lev] a2 <- x2[area[, 1] == lev] polygon(a1, a2) } } if (csub > 0) scatterutil.sub(sub, csub, possub) return(list(x = x, y = y)) } ############ scatterutil.chull ################# "scatterutil.chull" <- function (x, y, fac, optchull = c(0.25, 0.5, 0.75, 1), col=rep(1,length(levels(fac)))) { if (!is.factor(fac)) return(invisible()) if (length(x) != length(fac)) return(invisible()) if (length(y) != length(fac)) return(invisible()) for (i in 1:nlevels(fac)) { x1 <- x[fac == levels(fac)[i]] y1 <- y[fac == levels(fac)[i]] long <- length(x1) longinit <- long cref <- 1 repeat { if (long < 3) break if (cref == 0) break num <- chull(x1, y1) x2 <- x1[num] y2 <- y1[num] taux <- long/longinit if ((taux <= cref) & (cref == 1)) { cref <- 0.75 if (any(optchull == 1)) polygon(x2, y2, lty = 1, border=col[i]) } if ((taux <= cref) & (cref == 0.75)) { if (any(optchull == 0.75)) polygon(x2, y2, lty = 5, border=col[i]) cref <- 0.5 } if ((taux <= cref) & (cref == 0.5)) { if (any(optchull == 0.5)) polygon(x2, y2, lty = 3, border=col[i]) cref <- 0.25 } if ((taux <= cref) & (cref == 0.25)) { if (any(optchull == 0.25)) polygon(x2, y2, lty = 2, border=col[i]) cref <- 0 } x1 <- x1[-num] y1 <- y1[-num] long <- length(x1) } } } ############ scatterutil.eigen ################# "scatterutil.eigen" <- function (w, nf = NULL, xmax = length(w), ymin=min(0,min(w)), ymax = max(w), wsel = 1, sub = "Eigenvalues", csub = 2, possub = "topright",box=FALSE,yaxt="n") { opar <- par(mar = par("mar"),plt=par("plt")) on.exit(par(opar)) par(mar = c(0.8, 2.8, 0.8, 0.8),plt=par("plt")) if (length(w) < xmax) w <- c(w, rep(0, xmax - length(w))) # modif by TJ to handle 3 colors (respented/kept/others) col.w <- rep("white", length(w)) if(!is.null(nf)) {col.w[1:nf] <- "grey"} col.w[wsel] <- "black" # barplot(w, col = col.w, ylim = c(ymin, ymax)*1.1,yaxt=yaxt) scatterutil.sub(cha = sub, csub = max(.8,csub), possub = possub) if(box) box() } ############ scatterutil.ellipse ################# "scatterutil.ellipse" <- function (x, y, z, cellipse, axesell, coul = rep(1,length(x))) { if (any(is.na(z))) return(invisible()) if (sum(z * z) == 0) return(invisible()) util.ellipse <- function(mx, my, vx, cxy, vy, coeff) { lig <- 100 epsi <- 1e-10 x <- 0 y <- 0 if (vx < 0) vx <- 0 if (vy < 0) vy <- 0 if (vx == 0 && vy == 0) return(NULL) delta <- (vx - vy) * (vx - vy) + 4 * cxy * cxy delta <- sqrt(delta) l1 <- (vx + vy + delta)/2 l2 <- vx + vy - l1 if (l1 < 0) l1 <- 0 if (l2 < 0) l2 <- 0 l1 <- sqrt(l1) l2 <- sqrt(l2) test <- 0 if (vx == 0) { a0 <- 0 b0 <- 1 test <- 1 } if ((vy == 0) && (test == 0)) { a0 <- 1 b0 <- 0 test <- 1 } if (((abs(cxy)) < epsi) && (test == 0)) { if(vx > vy){ a0 <- 1 b0 <- 0 } else { a0 <- 0 b0 <- 1 } test <- 1 } if (test == 0) { a0 <- 1 b0 <- (l1 * l1 - vx)/cxy norm <- sqrt(a0 * a0 + b0 * b0) a0 <- a0/norm b0 <- b0/norm } a1 <- 2 * pi/lig c11 <- coeff * a0 * l1 c12 <- (-coeff) * b0 * l2 c21 <- coeff * b0 * l1 c22 <- coeff * a0 * l2 angle <- 0 for (i in 1:lig) { cosinus <- cos(angle) sinus <- sin(angle) x[i] <- mx + c11 * cosinus + c12 * sinus y[i] <- my + c21 * cosinus + c22 * sinus angle <- angle + a1 } return(list(x = x, y = y, seg1 = c(mx + c11, my + c21, mx - c11, my - c21), seg2 = c(mx + c12, my + c22, mx - c12, my - c22))) } z <- z/sum(z) m1 <- sum(x * z) m2 <- sum(y * z) v1 <- sum((x - m1) * (x - m1) * z) v2 <- sum((y - m2) * (y - m2) * z) cxy <- sum((x - m1) * (y - m2) * z) ell <- util.ellipse(m1, m2, v1, cxy, v2, cellipse) if (is.null(ell)) return(invisible()) polygon(ell$x, ell$y, border=coul) if (axesell) segments(ell$seg1[1], ell$seg1[2], ell$seg1[3], ell$seg1[4], lty = 2, col=coul) if (axesell) segments(ell$seg2[1], ell$seg2[2], ell$seg2[3], ell$seg2[4], lty = 2, col=coul) } ############ scatterutil.eti.circ ################# "scatterutil.eti.circ" <- function (x, y, label, clabel, origin=c(0,0), boxes=TRUE) { if (is.null(label)) return(invisible()) # message de JT warning pour R 1.7 modif samedi, mars 29, 2003 at 14:31 if (any(is.na(label))) return(invisible()) if (any(label == "")) return(invisible()) # modif mercredi, juillet 2, 2003 at 17:26 # pour les cas où le centre n'est pas l'origine xref <- x - origin[1] yref <- y - origin[2] for (i in 1:(length(x))) { cha <- as.character(label[i]) cha <- paste(" ", cha, " ", sep = "") cex0 <- par("cex") * clabel xh <- strwidth(cha, cex = cex0) yh <- strheight(cha, cex = cex0) * 5/6 if ((xref[i] > yref[i]) & (xref[i] > -yref[i])) { x1 <- x[i] + xh/2 y1 <- y[i] } else if ((xref[i] > yref[i]) & (xref[i] <= (-yref[i]))) { x1 <- x[i] y1 <- y[i] - yh } else if ((xref[i] <= yref[i]) & (xref[i] <= (-yref[i]))) { x1 <- x[i] - xh/2 y1 <- y[i] } else if ((xref[i] <= yref[i]) & (xref[i] > (-yref[i]))) { x1 <- x[i] y1 <- y[i] + yh } # modif JT du 7 dec 2005 # le bloc if(boxes) ne doit contenir que la fonction rect, sinon ca plante # si boxes = FALSE if (boxes) { rect(x1 - xh/2, y1 - yh, x1 + xh/2, y1 + yh, col = "white", border = 1) } text(x1, y1, cha, cex = cex0) } } ############ scatterutil.eti ################# "scatterutil.convrot90" <- function(xh,yh){ xusr <- par("usr") tmp <- xh xh <- yh/(xusr[4]-xusr[3])*par("pin")[2] xh <- xh/ par("pin")[1] * (xusr[2]-xusr[1]) yh <- tmp/(xusr[2]-xusr[1])* par("pin")[1] yh <- yh/ par("pin")[2] * (xusr[4]-xusr[3]) return(c(xh,yh)) } "scatterutil.eti" <- function (x, y, label, clabel, boxes = TRUE, coul = rep(1, length(x)), horizontal = TRUE, bg = "white") { if (length(label) == 0) return(invisible()) if (is.null(label)) return(invisible()) if (any(label == "")) return(invisible()) cex0 <- par("cex") * clabel for (i in 1:(length(x))) { cha <- as.character(label[i]) cha <- paste(" ", cha, " ", sep = "") x1 <- x[i] y1 <- y[i] xh <- strwidth(cha, cex = cex0) yh <- strheight(cha, cex = cex0) * 5/3 if(!horizontal){ tmp <- scatterutil.convrot90(xh,yh) xh <- tmp[1] yh <- tmp[2] } if (boxes) { rect(x1 - xh/2, y1 - yh/2, x1 + xh/2, y1 + yh/2, col = bg, border = coul[i]) } if(horizontal){ text(x1, y1, cha, cex = cex0, col = coul[i]) } else { text(x1, y1, cha, cex = cex0, col = coul[i], srt = 90) } } } ############ scatterutil.sco ################# "scatterutil.sco" <- function(score, lim, grid, cgrid, include.origin, origin, sub, csub, horizontal, reverse){ if (is.null(lim)) { x1 <- score if (include.origin) x1 <- c(x1, origin) x1 <- c(x1 - diff(range(x1)/10), x1 + diff(range(x1))/10) lim <- range(x1) } if(horizontal){ ylim <- c(0, 1) xlim <- lim } else { xlim <- c(0,1) ylim <- lim } plot.default(0, 0, type = "n", xlab = "", ylab = "", xaxt = "n", yaxt = "n", xlim = xlim, ylim = ylim, xaxs = "i", yaxs = "i", frame.plot = FALSE) if (grid) { if(horizontal){ axp <- par("xaxp") } else { axp <- par("yaxp") } nline <- axp[3] + 1 v0 <- seq(axp[1], axp[2], le = nline) if(horizontal){ segments(v0, rep(0, nline), v0, rep( 1, nline), col = gray(0.5), lty = 1) segments(0, 0 , 0, 1, col = 1, lwd = 3) } else { segments(rep(0, nline), v0, rep( 1, nline), v0, col = gray(0.5), lty = 1) segments(0, 0 , 1, 0, col = 1, lwd = 3) } if (cgrid > 0) { a <- (axp[2] - axp[1])/axp[3] cha <- paste(" d = ", a," ",sep = "") cex0 <- par("cex") * cgrid xh <- strwidth(cha, cex = cex0) yh <- strheight(cha, cex = cex0) * 5/3 x0 <- strwidth(" ", cex = cex0) y0 <- strheight(" ", cex = cex0)/2 if(horizontal){ if(reverse){ x1 <- par("usr")[1] y1 <- par("usr")[4] rect(x1 + x0, y1 - y0 -yh, x1 + xh + x0, y1 - y0, col = "white", border = "white") text(x1 + xh/2 + x0, y1 - yh/2 - y0, cha, cex = cex0) } else { x1 <- par("usr")[1] y1 <- par("usr")[3] rect(x1 + x0, y1 + y0, x1 + xh + x0, y1 + yh + y0, col = "white", border = "white") text(x1 + xh/2 + x0, y1 + yh/2 + y0, cha, cex = cex0) } } else { tmp <- scatterutil.convrot90(xh,yh) xh <- tmp[1] yh <- tmp[2] tmp <- scatterutil.convrot90(x0,y0) x0 <- tmp[1] y0 <- tmp[2] if(reverse) { x1 <- par("usr")[2] y1 <- par("usr")[4] rect(x1 - x0 - xh, y1 - y0 - yh, x1 - x0, y1 - y0, col = "white", border = "white") text(x1 - xh/2 - x0, y1 - yh/2 - y0, cha, cex = cex0, srt=270) } else { x1 <- par("usr")[1] y1 <- par("usr")[4] rect(x1 + x0, y1 - y0 - yh, x1 + xh + x0, y1 - y0, col = "white", border = "white") text(x1 + xh/2 + x0, y1 - yh/2 - y0, cha, cex = cex0, srt=90) } } } } href <- max(3, 2 * cgrid, 2 * csub) href <- strheight("A", cex = par("cex") * href) if(!horizontal){ tmp <- scatterutil.convrot90(0,href) href <- tmp[1] } if (csub > 0) { cha <- as.character(sub) y1 <- par("usr")[3] + href/2 if (all(c(length(cha) > 0, !is.null(cha), !is.na(cha), cha != ""))) { cha <- paste(" ",cha," ",sep="") cex0 <- par("cex") * csub xh <- strwidth(cha, cex = cex0) yh <- strheight(cha, cex = cex0) *5/3 x0 <- strwidth(" ", cex = cex0)/2 y0 <- strheight(" ", cex = cex0)/2 if(horizontal){ if(reverse) { x1 <- par("usr")[2] y1 <- par("usr")[4] rect(x1 - x0 - xh, y1 - y0 -yh, x1 -x0, y1 - y0, col = "white", border = "white") text(x1 - xh/2 - x0, y1 - yh/2 - y0, cha, cex = cex0) } else { x1 <- par("usr")[2] y1 <- par("usr")[3] rect(x1 - x0 - xh, y1 + y0, x1 -x0, y1 + yh + y0, col = "white", border = "white") text(x1 - xh/2 - x0, y1 + yh/2 + y0, cha, cex = cex0) } } else { tmp <- scatterutil.convrot90(xh,yh) xh <- tmp[1] yh <- tmp[2] tmp <- scatterutil.convrot90(x0,y0) x0 <- tmp[1] y0 <- tmp[2] if(reverse) { x1 <- par("usr")[2] y1 <- par("usr")[3] rect(x1 - x0 - xh, y1 + y0, x1 - x0 , y1 + yh + y0, col = "white", border = "white") text(x1 - xh/2 - x0, y1 + yh/2 + y0, cha, cex = cex0,srt=270) } else { x1 <- par("usr")[1] y1 <- par("usr")[3] rect(x1 + x0, y1 + y0, x1 + x0 + xh, y1 + yh + y0, col = "white", border = "white") text(x1 + xh/2 + x0, y1 + yh/2 + y0, cha, cex = cex0,srt=90) } } } } box() if(horizontal){ if(reverse){ abline( h = par("usr")[4] - href) } else { abline( h = par("usr")[3] + href) } return(c(min = par("usr")[1] , max = par("usr")[2], href = href)) } else { if(reverse) { abline( v = par("usr")[2] - href) } else { abline( v = par("usr")[1] + href) } return(c(min = par("usr")[3] , max = par("usr")[4], href = href)) } } ############ scatterutil.grid ################# "scatterutil.grid" <- function (cgrid) { col <- "lightgray" lty <- 1 xaxp <- par("xaxp") ax <- (xaxp[2] - xaxp[1])/xaxp[3] yaxp <- par("yaxp") ay <- (yaxp[2] - yaxp[1])/yaxp[3] a <- min(ax, ay) v0 <- seq(xaxp[1], xaxp[2], by = a) h0 <- seq(yaxp[1], yaxp[2], by = a) abline(v = v0, col = col, lty = lty) abline(h = h0, col = col, lty = lty) if (cgrid <= 0) return(invisible()) cha <- paste(" d = ", a, " ", sep = "") cex0 <- par("cex") * cgrid xh <- strwidth(cha, cex = cex0) yh <- strheight(cha, cex = cex0) * 5/3 x1 <- par("usr")[2] y1 <- par("usr")[4] rect(x1 - xh, y1 - yh, x1 + xh, y1 + yh, col = "white", border = 0) text(x1 - xh/2, y1 - yh/2, cha, cex = cex0) } ############ scatterutil.legend.bw.square ################# "scatterutil.legend.bw.square" <- function (br0, sq0, sig0, clegend) { br0 <- round(br0, digits = 6) cha <- as.character(br0[1]) for (i in (2:(length(br0)))) cha <- paste(cha, br0[i], sep = " ") cex0 <- par("cex") * clegend yh <- max(c(strheight(cha, cex = cex0), sq0)) h <- strheight(cha, cex = cex0) y0 <- par("usr")[3] + yh/2 + h/2 ltot <- strwidth(cha, cex = cex0) + sum(sq0) + h rect(par("usr")[1] + h/4, y0 - yh/2 - h/4, par("usr")[1] + ltot + h/4, y0 + yh/2 + h/4, col = "white") x0 <- par("usr")[1] + h/2 for (i in (1:(length(sq0)))) { cha <- br0[i] cha <- paste(" ", cha, sep = "") xh <- strwidth(cha, cex = cex0) text(x0 + xh/2, y0, cha, cex = cex0) z0 <- sq0[i] x0 <- x0 + xh + z0/2 if (sig0[i] >= 0) symbols(x0, y0, squares = z0, bg = "black", fg = "white", add = TRUE, inches = FALSE) else symbols(x0, y0, squares = z0, bg = "white", fg = "black", add = TRUE, inches = FALSE) x0 <- x0 + z0/2 } invisible() } ############ scatterutil.legend.square.grey ################# "scatterutil.legend.square.grey" <- function (br0, valgris, h, clegend) { if (clegend <= 0) return(invisible()) br0 <- round(br0, digits = 6) nborn <- length(br0) cex0 <- par("cex") * clegend x0 <- par("usr")[1] + h x1 <- x0 for (i in (2:(nborn))) { x1 <- x1 + h cha <- br0[i] cha <- paste(cha, "]", sep = "") xh <- strwidth(cha, cex = cex0) if (i == (nborn)) break x1 <- x1 + xh + h } yh <- max(strheight(paste(br0), cex = cex0), h) y0 <- par("usr")[3] + yh/2 + h/2 rect(par("usr")[1] + h/4, y0 - yh/2 - h/4, x1 - h/4, y0 + yh/2 + h/4, col = "white") x0 <- par("usr")[1] + h for (i in (2:(nborn))) { symbols(x0, y0, squares = h, bg = gray(valgris[i - 1]), add = TRUE, inches = FALSE) x0 <- x0 + h cha <- br0[i] if (cha < 1e-05) cha <- round(cha, digits = 3) cha <- paste(cha, "]", sep = "") xh <- strwidth(cha, cex = cex0) if (i == (nborn)) break text(x0 + xh/2, y0, cha, cex = cex0) x0 <- x0 + xh + h } invisible() } ############ scatterutil.legendgris ################# "scatterutil.legendgris" <- function (w, nclasslegend, clegend) { l0 <- as.integer(nclasslegend) if (l0 == 0) return(invisible()) if (l0 == 1) l0 <- 2 if (l0 > 10) l0 <- 10 h0 <- 1/(l0 + 1) mid0 <- seq(h0/2, 1 - h0/2, le = l0 + 1) qq <- quantile(w, seq(0, 1, le = l0 + 1)) w0 <- as.numeric(cut(w, br = qq, inc = TRUE)) w0 <- seq(0, 1, le = l0)[w0] opar <- par(new = par("new"), mar = par("mar"), usr = par("usr")) on.exit(par(opar)) par(new = TRUE) par(mar = c(0.1, 0.1, 0.1, 0.1)) plot(0, 0, type = "n", xlab = "", ylab = "", xaxt = "n", yaxt = "n", xlim = c(0, 2), ylim = c(0, 1.5)) rect(rep(0, l0), seq(h0/2, by = h0, le = l0), rep(h0, l0), seq(3 * h0/2, by = h0, le = l0), col = gray(seq(1, 0, le = l0))) text(rep(h0, 9), mid0, as.character(signif(qq, digits = 2)), pos = 4, cex = par("cex") * clegend) box(col = "white") } ############ scatterutil.scaling ################# "scatterutil.scaling" <- function (refold, refnew, xyold) { refold <- as.matrix(data.frame(refold)) refnew <- as.matrix(data.frame(refnew)) meanold <- apply(refold, 2, mean) meannew <- apply(refnew, 2, mean) refold0 <- sweep(refold, 2, meanold) refnew0 <- sweep(refnew, 2, meannew) sold <- sqrt(sum(refold0^2)) snew <- sqrt(sum(refnew0^2)) xyold <- sweep(xyold, 2, meanold) xyold <- t(t(xyold)/sold) xynew <- t(t(xyold) * snew) xynew <- sweep(xynew, 2, meannew, "+") xynew <- data.frame(xynew) names(xynew) <- names(xyold) row.names(xynew) <- row.names(xyold) return(xynew) } ############ scatterutil.star ################# "scatterutil.star" <- function (x, y, z, cstar, coul = rep(1,length(x))) { z <- z/sum(z) x1 <- sum(x * z) y1 <- sum(y * z) for (i in which(z > 0)) { hx <- cstar * (x[i] - x1) hy <- cstar * (y[i] - y1) segments(x1, y1, x1 + hx, y1 + hy, col=coul) } } ############ scatterutil.sub ################# "scatterutil.sub" <- function (cha, csub, possub = "bottomleft") { cha <- as.character(cha) if (length(cha) == 0) return(invisible()) if (is.null(cha)) return(invisible()) if (is.na(cha)) return(invisible()) if (any(cha == "")) return(invisible()) if (csub == 0) return(invisible()) cex0 <- par("cex") * csub cha <- paste(" ", cha, " ", sep = "") xh <- strwidth(cha, cex = cex0) yh <- strheight(cha, cex = cex0) * 5/3 if (possub == "bottomleft") { x1 <- par("usr")[1] y1 <- par("usr")[3] rect(x1, y1, x1 + xh, y1 + yh, col = "white", border = 0) text(x1 + xh/2, y1 + yh/2, cha, cex = cex0) } else if (possub == "topleft") { x1 <- par("usr")[1] y1 <- par("usr")[4] rect(x1, y1, x1 + xh, y1 - yh, col = "white", border = 0) text(x1 + xh/2, y1 - yh/2, cha, cex = cex0) } else if (possub == "bottomright") { x1 <- par("usr")[2] y1 <- par("usr")[3] rect(x1, y1, x1 - xh, y1 + yh, col = "white", border = 0) text(x1 - xh/2, y1 + yh/2, cha, cex = cex0) } else if (possub == "topright") { x1 <- par("usr")[2] y1 <- par("usr")[4] rect(x1, y1, x1 - xh, y1 - yh, col = "white", border = 0) text(x1 - xh/2, y1 - yh/2, cha, cex = cex0) } } ade4/R/scatter.coa.R0000644000176200001440000000272112576021756013636 0ustar liggesusers"scatter.coa" <- function (x, xax = 1, yax = 2, method = 1:3, clab.row = 0.75, clab.col = 1.25, posieig = "top", sub = NULL, csub = 2, ...) { if (!inherits(x, "dudi")) stop("Object of class 'dudi' expected") if (!inherits(x, "coa")) stop("Object of class 'coa' expected") nf <- x$nf if ((xax > nf) || (xax < 1) || (yax > nf) || (yax < 1) || (xax == yax)) stop("Non convenient selection") method <- method[1] if (method == 1) { coolig <- x$li[, c(xax, yax)] coocol <- x$co[, c(xax, yax)] names(coocol) <- names(coolig) s.label(rbind.data.frame(coolig, coocol), clabel = 0, cpoint = 0, sub = sub, csub = csub) # samedi, mars 29, 2003 at 15:35 correction SD pour ZAN s.label(coolig, clabel = clab.row, add.plot = TRUE) s.label(coocol, clabel = clab.col, add.plot = TRUE) } else if (method == 2) { coocol <- x$c1[, c(xax, yax)] coolig <- x$li[, c(xax, yax)] s.label(coocol, clabel = clab.col, sub = sub, csub = csub) s.label(coolig, clabel = clab.row, add.plot = TRUE) } else if (method == 3) { coolig <- x$l1[, c(xax, yax)] coocol <- x$co[, c(xax, yax)] s.label(coolig, clabel = clab.col, sub = sub, csub = csub) s.label(coocol, clabel = clab.row, add.plot = TRUE) } else stop("Unknown method") add.scatter.eig(x$eig, x$nf, xax, yax, posi = posieig, ratio = 1/4) } ade4/R/kplot.foucart.R0000644000176200001440000000227412576021756014226 0ustar liggesusers"kplot.foucart" <- function (object, xax = 1, yax = 2, mfrow = NULL, which.tab = 1:length(object$blo), clab.r = 1, clab.c = 1.25, csub = 2, possub = "bottomright", ...) { if (!inherits(object, "foucart")) stop("Object of type 'foucart' expected") opar <- par(ask = par("ask"), mfrow = par("mfrow"), mar = par("mar")) on.exit(par(opar)) if (is.null(mfrow)) mfrow <- n2mfrow(length(which.tab)) par(mfrow = mfrow) if (length(which.tab) > prod(mfrow)) par(ask = TRUE) coolig <- object$Tli[, c(xax, yax)] coocol <- object$Tco[, c(xax, yax)] names(coocol) <- names(coolig) cootot <- rbind.data.frame(coocol, coolig) if (clab.r > 0) cpoi <- 0 else cpoi <- 2 for (ianal in which.tab) { coolig <- object$Tli[object$TL[, 1] == levels(object$TL[,1])[ianal], c(xax, yax)] coocol <- object$Tco[object$TC[, 1] == levels(object$TC[,1])[ianal], c(xax, yax)] s.label(cootot, clabel = 0, cpoint = 0, sub = object$tab.names[ianal], csub = csub, possub = possub) s.label(coolig, clabel = clab.r, cpoint = cpoi, add.plot = TRUE) s.label(coocol, clabel = clab.c, add.plot = TRUE) } } ade4/R/dist.quant.R0000644000176200001440000000344612576021756013527 0ustar liggesusers"dist.quant" <- function (df, method = NULL, diag = FALSE, upper = FALSE, tol = 1e-07) { METHODS <- c("Canonical", "Joreskog", "Mahalanobis") df <- data.frame(df) if (!inherits(df, "data.frame")) stop("df is not a data.frame") if (is.null(method)) { cat("1 = Canonical\n") cat("d1 = ||x-y|| A=Identity\n") cat("2 = Joreskog\n") cat("d2=d2 = ||x-y|| A=1/diag(cov)\n") cat("3 = Mahalanobis\n") cat("d3 = ||x-y|| A=inv(cov)\n") cat("Selec an integer (1-3): ") method <- as.integer(readLines(n = 1)) } nlig <- nrow(df) d <- matrix(0, nlig, nlig) d.names <- row.names(df) fun1 <- function(x) { sqrt(sum((df[x[1], ] - df[x[2], ])^2)) } df <- as.matrix(df) index <- cbind(col(d)[col(d) < row(d)], row(d)[col(d) < row(d)]) method <- method[1] if (method == 1) { d <- unlist(apply(index, 1, fun1)) } else if (method == 2) { dfcov <- cov(df) * (nlig - 1)/nlig jor <- diag(dfcov) jor[jor == 0] <- 1 jor <- 1/sqrt(jor) df <- t(t(df) * jor) d <- unlist(apply(index, 1, fun1)) } else if (method == 3) { dfcov <- cov(df) * (nlig - 1)/nlig maha <- eigen(dfcov, symmetric = TRUE) maha.r <- sum(maha$values > (maha$values[1] * tol)) maha.e <- 1/sqrt(maha$values[1:maha.r]) maha.v <- maha$vectors[, 1:maha.r] maha.v <- t(t(maha.v) * maha.e) df <- df %*% maha.v d <- unlist(apply(index, 1, fun1)) } else stop("Non convenient method") attr(d, "Size") <- nlig attr(d, "Labels") <- d.names attr(d, "Diag") <- diag attr(d, "Upper") <- upper attr(d, "method") <- METHODS[method] attr(d, "call") <- match.call() class(d) <- "dist" return(d) } ade4/R/nipals.R0000644000176200001440000001144213176060730012706 0ustar liggesusers"nipals" <- function(df, nf=2, rec=FALSE,niter=100, tol = 1e-9){ # df est un data frame contenant eventuellement des valeurs manquantes (NA) # nf nombre de facteurs a conserver # rec, si rec=T, la reconstitution des donnees sur les nf premiers axes est realisee # ********************************************************************************** # df is a data frame which can contain missing values (NA) # nf number of axes to keep # rec, if rec=T, data recontsitution is performed with the nf first axes # n.max.iter= maximum number of iterations df <- data.frame(df) tol<-1e-9 # tol pour la convergence nc <- ncol(df) nr <- nrow(df) nr.na <- apply(df, 2, function(x) sum(!is.na(x))) if (rec) x<-list(li=matrix(0,nr,nf),c1=matrix(0,nc,nf),co=matrix(0,nc,nf), eig=rep(0,nf),nb=rep(0,nf),rec=matrix(0,nr,nc)) else x<-list(li=matrix(0,nr,nf),c1=matrix(0,nc,nf),co=matrix(0,nc,nf), eig=rep(0,nf),nb=rep(0,nf)) row.names(x$c1)<-names(df) row.names(x$co)<-names(df) row.names(x$li)<-row.names(df) #X<-scale(df, center=T, scale=T, na.rm=TRUE) cmeans <- colMeans(df, na.rm=TRUE) csd <- apply(df, 2, sd, na.rm=TRUE) * sqrt((nr.na - 1) / nr.na) X <- sweep(sweep(df, 2, cmeans, "-"), 2, csd, "/") x$tab<-X for (h in 1:nf) { th<-X[,1] ph1<-rep(1/sqrt(nc),nc) ph2<-rep(1/sqrt(nc),nc) diff<-rep(1,nc) nb<-0 while (sum(diff^2, na.rm=TRUE)>tol & nb<=niter) { for (i in 1:nc) { the<-th[!is.na(X[,i])] ph2[i]<-sum(X[,i]*th, na.rm=TRUE)/sum(the*the,na.rm=TRUE) } ph2<-ph2/sqrt(sum(ph2*ph2,na.rm=TRUE)) for (i in 1:nr) { ph2e<-ph2[!is.na(X[i,])] th[i]<-sum(X[i,]*ph2, na.rm=TRUE)/sum(ph2e*ph2e,na.rm=TRUE) } diff<-ph2-ph1 ph1<-ph2 nb<-nb+1 } if(nb>niter) stop(paste("Maximum number of iterations reached for axis", h)) X<-X-th%*%t(ph1) x$nb[h]<-nb # nombre d'iterations (number of iterations) x$li[,h]<-th # coordonnees des lignes (row coordinates) x$c1[,h]<-ph1 # coordonnees des colonnes de variance unit' (columns coordinates of unit variance) x$eig[h]<-sum(th*th,na.rm=TRUE)/(nr-1) # valeurs propres (pseudo-eigenvalues) x$co[,h]<-x$c1[,h]*sqrt(x$eig[h]) # coord. col. de variance lambda (column coordinates of variance lambda) } if (rec) { for (h in 1:nf) { x$rec<-x$rec+x$li[,h]%*%t(x$c1[,h]) # tableau reconstitue (reconstitued data) } } if (rec){ x$rec=as.data.frame(x$rec) names(x$rec)<-names (df) row.names(x$rec)<-row.names(df) } x$call<-match.call() x$nf<-nf class(x)<-"nipals" if(any(diff(x$eig)>0)) warning("Eigenvalues are not in decreasing order. Results of the analysis could be problematics") return(x) } print.nipals<-function (x, ...) { cat("NIPALS ANALYSIS\n") cat("class: ") cat(class(x)) cat("\n$call: ") print(x$call) cat("\n$nf:", x$nf, "axis-components saved") cat("\neigen values: ") l0 <- length(x$eig) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n") else cat("\n") sumry <- array("", c(2, 4), list(1:2, c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$nb", length(x$nb), mode(x$nb), "number of iterations") sumry[2, ] <- c("$eig", length(x$eig), mode(x$eig), "eigen values") print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(4, 4), list(1:4, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$tab", nrow(x$tab), ncol(x$tab), "modified array") sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), "row coordinates") sumry[3, ] <- c("$co", nrow(x$co), ncol(x$co), "column coordinates") sumry[4, ] <- c("$c1", nrow(x$c1), ncol(x$c1), "column normed scores") print(sumry, quote = FALSE) cat("other elements: ") if (length(names(x))==8) cat("NULL\n") else cat("$rec", "reconstituted data", "\n") } scatter.nipals<-function (x, xax = 1, yax = 2, clab.row = 0.75, clab.col = 1, posieig = "top", sub = NULL, ...) { if (!inherits(x, "nipals")) stop("Object of class 'nipals' expected") opar <- par(mar = par("mar")) on.exit(par(opar)) coolig <- x$li[, c(xax, yax)] coocol <- x$c1[, c(xax, yax)] s.label(coolig, clabel = clab.row) born <- par("usr") k1 <- min(coocol[, 1])/born[1] k2 <- max(coocol[, 1])/born[2] k3 <- min(coocol[, 2])/born[3] k4 <- max(coocol[, 2])/born[4] k <- c(k1, k2, k3, k4) coocol <- 0.9 * coocol/max(k) s.arrow(coocol, clabel = clab.col, add.plot = TRUE, sub = sub, possub = "bottomright") add.scatter.eig(x$eig, x$nf, xax, yax, posi = posieig, ratio = 1/4) } ade4/R/dudi.nsc.R0000644000176200001440000000112412576021756013133 0ustar liggesusers"dudi.nsc" <- function (df, scannf = TRUE, nf = 2) { df <- as.data.frame(df) col <- ncol(df) if (any(df < 0)) stop("negative entries in table") if ((N <- sum(df)) == 0) stop("all frequencies are zero") row.w <- apply(df, 1, sum)/N col.w <- apply(df, 2, sum)/N df <- t(apply(df, 1, function(x) if (sum(x) == 0) col.w else x/sum(x))) df <- sweep(df, 2, col.w) df <- data.frame(col * df) X <- as.dudi(df, rep(1, col)/col, row.w, scannf = scannf, nf = nf, call = match.call(), type = "nsc") X$N <- N return(X) } ade4/R/s.distri.R0000644000176200001440000000377612576021756013202 0ustar liggesusers"s.distri" <- function (dfxy, dfdistri, xax = 1, yax = 2, cstar = 1, cellipse = 1.5, axesell = TRUE, label = names(dfdistri), clabel = 0, cpoint = 1, pch = 20, xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, origin = c(0, 0), include.origin = TRUE, sub = "", csub = 1, possub = "bottomleft", cgrid = 1, pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) { opar <- par(mar = par("mar")) par(mar = c(0.1, 0.1, 0.1, 0.1)) on.exit(par(opar)) dfxy <- data.frame(dfxy) dfdistri <- data.frame(dfdistri) if (!is.data.frame(dfxy)) stop("Non convenient selection for dfxy") if (!is.data.frame(dfdistri)) stop("Non convenient selection for dfdistri") if (any(dfdistri < 0)) stop("Non convenient selection for dfdistri") if (nrow(dfxy) != nrow(dfdistri)) stop("Non equal row numbers") if (any(is.na(dfxy))) stop("NA non implemented") w1 <- unlist(lapply(dfdistri, sum)) label <- label dfdistri <- t(t(dfdistri)/w1) coox <- as.matrix(t(dfdistri)) %*% as.matrix(dfxy[, xax]) cooy <- as.matrix(t(dfdistri)) %*% as.matrix(dfxy[, yax]) coo <- scatterutil.base(dfxy = dfxy, xax = xax, yax = yax, xlim = xlim, ylim = ylim, grid = grid, addaxes = addaxes, cgrid = cgrid, include.origin = include.origin, origin = origin, sub = sub, csub = csub, possub = possub, pixmap = pixmap, contour = contour, area = area, add.plot = add.plot) if (cpoint > 0) points(coo$x, coo$y, pch = pch, cex = par("cex") * cpoint) if (cstar > 0) for (i in 1:ncol(dfdistri)) { scatterutil.star(coo$x, coo$y, dfdistri[, i], cstar = cstar) } if (cellipse > 0) for (i in 1:ncol(dfdistri)) { scatterutil.ellipse(coo$x, coo$y, dfdistri[, i], cellipse = cellipse, axesell = axesell) } if (clabel > 0) scatterutil.eti(unlist(coox), unlist(cooy), label, clabel) box() invisible(match.call()) } ade4/R/procuste.randtest.R0000644000176200001440000000150613050632301015075 0ustar liggesusers"procuste.randtest" <- function(df1, df2, nrepet = 999, ...) { if (!is.data.frame(df1)) stop("data.frame expected") if (!is.data.frame(df2)) stop("data.frame expected") l1 <- nrow(df1) if (nrow(df2) != l1) stop("Row numbers are different") if (any(row.names(df2) != row.names(df1))) stop("row names are different") X <- scale(df1, scale = FALSE) Y <- scale(df2, scale = FALSE) var1 <- apply(X, 2, function(x) sum(x^2)) var2 <- apply(Y, 2, function(x) sum(x^2)) tra1 <- sum(var1) tra2 <- sum(var2) X <- X/sqrt(tra1) Y <- Y/sqrt(tra2) lig<-nrow(X) c1<-ncol(X) c2<-ncol(Y) isim<-testprocuste(nrepet, lig, c1, c2, as.matrix(X), as.matrix(Y)) obs<-isim[1] return(as.randtest(sim = isim[-1], obs = obs, call = match.call(), ...)) } ade4/R/ktab.R0000644000176200001440000002452612620331641012343 0ustar liggesusers########### is.ktab ########### "is.ktab" <- function (x) inherits(x, "ktab") ########### [.ktab ########### "[.ktab" <- function (x, i, j, k) { ## i: index of blocks ## j: index of rows ## k: index of columns ## select blocks blocks <- x$blo nblo <- length(blocks) if(missing(i)) i <- 1:nblo if (is.logical(i)) i <- which(i) if (any(i > nblo)) stop("Non convenient selection") indica <- as.factor(rep(1:nblo, blocks)) res <- unclass(x)[i] tabw <- x$tabw[i] cw <- x$cw cw <- split(cw, indica) cw <- cw[i] ## select columns if(!missing(k)){ res <- lapply(res, function(z) z[, k, drop = FALSE]) cw <- lapply(cw, function(z) z[k, drop = FALSE]) } cw <- unlist(cw) blocks <- unlist(lapply(res, function(z) ncol(z))) ## select rows lw <- x$lw if(!missing(j)){ res <- lapply(res, function(z) z[j,, drop = FALSE]) lw <- lw[j, drop = FALSE] } res$lw <- lw / sum(lw) res$cw <- cw res$tabw <- tabw nblo <- length(blocks) res$blo <- blocks class(res) <- "ktab" res <- ktab.util.addfactor(res) res$call <- match.call() return(res) } ########### print.ktab ########### "print.ktab" <- function (x, ...) { if (!inherits(x, "ktab")) stop("to be used with 'ktab' object") cat("class:", class(x), "\n") ntab <- length(x$blo) cat("\ntab number: ", ntab, "\n") sumry <- array("", c(ntab, 3), list(1:ntab, c("data.frame", "nrow", "ncol"))) for (i in 1:ntab) { sumry[i, ] <- c(names(x)[i], nrow(x[[i]]), ncol(x[[i]])) } print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(4, 4), list((ntab + 1):(ntab + 4), c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$lw", length(x$lw), mode(x$lw), "row weigths") sumry[2, ] <- c("$cw", length(x$cw), mode(x$cw), "column weights") sumry[3, ] <- c("$blo", length(x$blo), mode(x$blo), "column numbers") sumry[4, ] <- c("$tabw", length(x$tabw), mode(x$tabw), "array weights") print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(3, 4), list((ntab + 5):(ntab + 7), c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$TL", nrow(x$TL), ncol(x$TL), "Factors Table number Line number") sumry[2, ] <- c("$TC", nrow(x$TC), ncol(x$TC), "Factors Table number Col number") sumry[3, ] <- c("$T4", nrow(x$T4), ncol(x$T4), "Factors Table number 1234") print(sumry, quote = FALSE) cat("\n") cat((ntab + 8), "$call: ") print(x$call) cat("\n") cat("names :\n") for (i in 1:ntab) { cat(names(x)[i], ":", names(x[[i]]), "\n") } cat("\n") indica <- as.factor(rep(1:ntab, x$blo)) w <- split(x$cw, indica) cat("Col weigths :\n") for (i in 1:ntab) { cat(names(x)[i], ":", w[[i]], "\n") } cat("\n") cat("Row weigths :\n") cat(x$lw) cat("\n") } ########### c.ktab" ########### "c.ktab" <- function (...) { x <- list(...) n <- length(x) if (any(lapply(x, class) != "ktab")) stop("arguments imply object without 'ktab' class") nr <- unlist(lapply(x, function(x) nrow(x[[1]]))) if (length(unique(nr)) != 1) stop("arguments imply object with non constant row numbers") lw <- x[[1]]$lw nr <- length(lw) noms <- row.names(x[[1]][[1]]) res <- NULL cw <- NULL blocks <- NULL for (i in 1:n) { if (any(x[[i]]$lw != lw)) stop("arguments imply object with non constant row weights") if (any(row.names(x[[i]][[1]]) != noms)) stop("arguments imply object with non constant row.names") blo.i <- x[[i]]$blo nblo.i <- length(blo.i) res <- c(res, unclass(x[[i]])[1:nblo.i]) cw <- c(cw, x[[i]]$cw) blocks <- c(blocks, blo.i) } names(res) <- make.names(names(res), TRUE) res$lw <- lw res$cw <- cw res$blo <- blocks class(res) <- "ktab" res <- ktab.util.addfactor(res) res$call <- match.call() return(res) } ########### t.ktab" ########### "t.ktab" <- function (x) { if (!inherits(x, "ktab")) stop("object 'ktab' expected") blocks <- x$blo nblo <- length(blocks) res <- x r.n <- row.names(x[[1]]) for (i in 1:nblo) { r.new <- row.names(x[[i]]) if (any(r.new != r.n)) stop("non equal row.names among array") } if (length(unique(blocks)) != 1) stop("non equal col numbers among array") c.n <- names(x[[1]]) for (i in 1:nblo) { c.new <- names(x[[i]]) if (any(c.new != c.n)) stop("non equal col.names among array") } new.row.names <- names(x[[1]]) indica <- as.factor(rep(1:nblo, blocks)) w <- split(x$cw, indica) col.w <- w[[1]] for (i in 1:nblo) { col.w.new <- w[[i]] if (any(col.w != col.w.new)) stop("non equal column weights among array") } for (j in 1:nblo) { w <- x[[j]] w <- data.frame(t(w)) row.names(w) <- new.row.names res[[j]] <- w blocks[j] <- ncol(w) } res$lw <- col.w res$cw <- rep(x$lw, nblo) res$blo <- blocks class(res) <- "ktab" res <- ktab.util.addfactor(res) res$call <- match.call() return(res) } ########### row.names.ktab ########### "row.names.ktab" <- function (x) { if (!inherits(x, "ktab")) stop("to be used with 'ktab' object") ntab <- length(x$blo) cha <- attr(x[[1]], "row.names") for (i in 1:ntab) { if (any(attr(x[[i]], "row.names") != cha)) warnings(paste("array", i, "and array 1 have different row.names")) } return(cha) } ########### row.names<-.ktab ########### "row.names<-.ktab" <- function (x, value) { if (!inherits(x, "ktab")) stop("to be used with 'ktab' object") ntab <- length(x$blo) old <- attr(x[[1]], "row.names") if (!is.null(old) && length(value) != length(old)) stop("invalid row.names length") value <- as.character(value) if (any(duplicated(value))) stop("duplicate row.names are not allowed") for (i in 1:ntab) { attr(x[[i]], "row.names") <- value } x } ########### col.names ########### "col.names" <- function (x) UseMethod("col.names") ########### col.names<- ########### "col.names<-" <- function (x, value) UseMethod("col.names<-") ########### col.names.ktab ########### "col.names.ktab" <- function (x) { if (!inherits(x, "ktab")) stop("to be used with 'ktab' object") ntab <- length(x$blo) cha <- unlist(lapply(1:ntab, function(y) attr(x[[y]], "names"))) return(cha) } ########### col.names<-.ktab ########### "col.names<-.ktab" <- function (x, value) { if (!inherits(x, "ktab")) stop("to be used with 'ktab' object") ntab <- length(x$blo) old <- unlist(lapply(1:ntab, function(y) attr(x[[y]], "names"))) if (!is.null(old) && length(value) != length(old)) stop("invalid col.names length") value <- as.character(value) indica <- as.factor(rep(1:ntab, x$blo)) for (i in 1:ntab) { if (any(duplicated(value[indica == i]))) stop("duplicate col.names are not allowed in the same array") attr(x[[i]], "names") <- value[indica == i] } x } ########### tab.names ########### # fonction générique "tab.names" <- function (x) UseMethod("tab.names") ########### tab.names.ktab ########### # méthode pour ktab "tab.names.ktab" <- function (x) { if (!inherits(x, "ktab")) stop("to be used with 'ktab' object") ntab <- length(x$blo) cha <- names(x)[1:ntab] return(cha) } ########### tab.names<- ########### # fonction générique "tab.names<-" <- function (x, value) UseMethod("tab.names<-") ########### tab.names<-.ktab ########### # méthode pour ktab # les tab.names d'un ktab est le vecteur des noms des k premières composantes # ce nombre de tableaux est la longueur de la composante blo "tab.names<-.ktab" <- function (x, value) { if (!inherits(x, "ktab")) stop("to be used with 'ktab' object") ntab <- length(x$blo) old <- tab.names(x)[1:ntab] if (!is.null(old) && length(value) != length(old)) stop("invalid tab.names length") value <- as.character(value) if (any(duplicated(value))) stop("duplicate tab.names are not allowed") names(x)[1:ntab] <- value x } ########### ktab.util.names ########### # utilitaire qui récupère dans un ktab # une liste de 3 éléments # les noms des lignes "." les noms des tableaux # les noms des colonnes sans duplicats # les noms des tableaux "." 1234 # pour donner des étiquettes aux TL, TC et T4 dans les graphiques "ktab.util.names" <- function (x) { w <- row.names(x) w1 <- paste(w, as.character(x$TL[, 1]), sep = ".") w <- col.names(x) if (any(duplicated(w))) w <- paste(w, as.character(x$TC[, 1]), sep = ".") w2 <- w w <- tab.names(x) l0 <- length(w) w3 <- paste(rep(w, rep(4, l0)), as.character(1:4), sep = ".") # Cas d'un ktab de type kcoinertie if (!inherits (x,"kcoinertia")) return(list(row = w1, col = w2, tab = w3)) # w4 <- paste(rep(tab.names(x), each=nrow(x$supX)/length(tab.names(x))), row.names(x$supX), sep=".") # Admettre des ktabs ayant des nombres de lignes (colonnes) différents w4 <- paste(rep(tab.names(x), x$supblo), row.names(x$supX), sep=".") return(list(row = w1, col = w2, tab = w3, Trow=w4)) } ########### ktab.util.addfactor<- ########### ## utility used for ktab objects ## add the componenst TL TC and T4 ## x is an object of class ktab not yet finished (should contains tables, lw and blo) # we obtain the col number (unique for each table) and the number of row (common to all tables) "ktab.util.addfactor" <- function (x) { blocks <- x$blo nlig <- length(x$lw) nblo <- length(x$blo) rowname <- row.names(x) colname <- col.names(x) blocname <- tab.names(x) w <- cbind.data.frame(gl(nblo, nlig, labels = blocname), factor(rep(1:nlig, nblo), labels = rowname)) names(w) <- c("T", "L") x$TL <- w w <- NULL for (i in 1:nblo) w <- c(w, 1:blocks[i]) w <- cbind.data.frame(factor(rep(1:nblo, blocks), labels = blocname), factor(colname)) names(w) <- c("T", "C") x$TC <- w w <- cbind.data.frame(gl(nblo, 4, labels = blocname), factor(rep(1:4, nblo))) names(w) <- c("T", "4") x$T4 <- w x } ade4/R/symbols.phylog.R0000644000176200001440000001172212576021756014422 0ustar liggesusers"symbols.phylog" <- function (phylog, circles, squares, csize = 1, clegend = 1, sub = "", csub = 1, possub = "topleft") { if (!inherits(phylog, "phylog")) stop("Non convenient data") count <- 0 if (!missing(circles)) { count <- count + 1 data <- circles type <- 2 } if (!missing(squares)) { count <- count + 1 data <- squares type <- 1 } if (count > 1) stop("no more than one symbol type must be specified") if (csize <= 0) { data <- NULL } if (!is.null(data)) { if (is.null(names(data))) names(data) <- names(phylog$leaves) if (length(data) != length(phylog$leaves)) data <- NULL if (!is.null(data)) { w1 <- sort(names(data)) w2 <- sort(names(phylog$leaves)) if (!all(w1 == w2)) { print(w1) print(w2) warning("names(data) non convenient for 'phylog' : we use the names of the leaves in 'phylog'") names(data) <- names(phylog$leaves) } data <- data[names(phylog$leaves)] } } opar <- par(mar = par("mar")) on.exit(par(opar)) par(mar = c(0.1, 0.1, 0.1, 0.1)) plot.default(0, 0, type = "n", xlab = "", ylab = "", xaxt = "n", yaxt = "n", ylim = c(-0.2, 1.05), xlim = c(0, 1), xaxs = "i", yaxs = "i", frame.plot = TRUE) symbol.max <- csize/20 if (symbol.max > 0.5) symbol.max <- 0.5 dis <- phylog$droot dis <- 1 - ((1 - symbol.max) * dis/max(dis)) xinit <- dis[names(phylog$leaves)] dn <- dis[names(phylog$nodes)] n <- length(xinit) yinit <- (n:1)/(n + 1) names(yinit) <- names(phylog$leaves) x <- dis yn <- rep(0, length(dn)) names(yn) <- names(dn) y <- c(yinit, yn) legender <- function(br0, sq0, sig0, clegend, type) { br0 <- round(br0, digits = 6) cha <- as.character(br0[1]) for (i in (2:(length(br0)))) cha <- paste(cha, br0[i], sep = " ") cex0 <- par("cex") * clegend yh <- max(c(strheight(cha, cex = cex0), sq0)) h <- strheight(cha, cex = cex0) y0 <- par("usr")[3] + yh/2 + h x0 <- par("usr")[1] + h/2 for (i in (1:(length(sq0)))) { cha <- br0[i] cha <- paste(" ", cha, sep = "") xh <- strwidth(cha, cex = cex0) text(x0 + xh/2, y0, cha, cex = cex0) z0 <- sq0[i] x0 <- x0 + xh + z0/2 if (sig0[i] >= 0) { if (type == 1) symbols(x0, y0, squares = z0, bg = "black", fg = "white", add = TRUE, inches = FALSE) else if (type == 2) symbols(x0, y0, circles = z0/2, bg = "black", fg = "white", add = TRUE, inches = FALSE) } else { if (type == 1) symbols(x0, y0, squares = z0, bg = "white", fg = "black", add = TRUE, inches = FALSE) else if (type == 2) symbols(x0, y0, circles = z0/2, bg = "white", fg = "black", add = TRUE, inches = FALSE) } x0 <- x0 + z0/2 } invisible() } for (i in 1:length(phylog$parts)) { w <- phylog$parts[[i]] but <- names(phylog$parts)[i] y[but] <- mean(y[w]) b <- range(y[w]) segments(b[1], x[but], b[2], x[but]) x1 <- x[w] y1 <- y[w] x2 <- rep(x[but], length(w)) segments(y1, x1, y1, x2) } if (!is.null(data)) { sq <- sqrt(abs(data)) w1 <- max(sq) sq <- symbol.max * sq/w1 if (type == 1) { for (i in 1:n) { if (sign(data[i]) >= 0) { symbols(yinit[i], xinit[i], squares = sq[i], bg = "black", fg = "white", add = TRUE, inches = FALSE) } else { symbols(yinit[i], xinit[i], squares = sq[i], bg = "white", fg = "black", add = TRUE, inches = FALSE) } } } else if (type == 2) { for (i in 1:n) { if (sign(data[i]) >= 0) { symbols(yinit[i], xinit[i], circles = sq[i]/2, bg = "black", fg = "white", add = TRUE, inches = FALSE) } else { symbols(yinit[i], xinit[i], circles = sq[i]/2, bg = "white", fg = "black", add = TRUE, inches = FALSE) } } } if (clegend > 0) { br0 <- pretty(data, 4) l0 <- length(br0) br0 <- (br0[1:(l0 - 1)] + br0[2:l0])/2 sq0 <- sqrt(abs(br0)) sq0 <- symbol.max * sq0/w1 sig0 <- sign(br0) legender(br0, sq0, sig0, clegend = clegend, type = type) } } if (csub > 0) scatterutil.sub(sub, csub, possub) } ade4/R/fourthcorner.rlq.R0000644000176200001440000002413613050632301014727 0ustar liggesusersfourthcorner.rlq <- function(xtest, nrepet = 999, modeltype = 6, typetest = c("axes","Q.axes","R.axes"), p.adjust.method.G = p.adjust.methods, p.adjust.method.D = p.adjust.methods, p.adjust.D = c("global","levels"), ...) { ## test RLQ axes if (!inherits(xtest, "dudi")) stop("Object of class dudi expected") if (!inherits(xtest, "rlq")) stop("Object of class 'rlq' expected") if (!(modeltype %in% c(2, 4, 5, 6))) stop("modeltype should be 2, 4, 5 or 6") if(modeltype == 6){ test1 <- fourthcorner.rlq(xtest, modeltype = 2,nrepet = nrepet, typetest = typetest, p.adjust.method.G = p.adjust.method.G, p.adjust.method.D = p.adjust.method.D, p.adjust.D = p.adjust.D, ...) test2 <- fourthcorner.rlq(xtest, modeltype = 4,nrepet = nrepet, typetest = typetest, p.adjust.method.G = p.adjust.method.G, p.adjust.method.D = p.adjust.method.D, p.adjust.D = p.adjust.D, ...) res <- combine.4thcorner(test1, test2) res$call <- res$tabD2$call <- res$tabD$call <- res$tabG$call <- match.call() return(res) } p.adjust.D <- match.arg(p.adjust.D) p.adjust.method.D <- match.arg(p.adjust.method.D) p.adjust.method.G <- match.arg(p.adjust.method.G) typetest <- match.arg(typetest) appel <- as.list(xtest$call) dudiR <- eval.parent(appel$dudiR) dudiQ <- eval.parent(appel$dudiQ) dudiL <- eval.parent(appel$dudiL) tabR.cw <- dudiR$cw appelR <- as.list(dudiR$call) tabR <- Rinit <- eval.parent(appelR$df) ## Test the different cases ## typ=1 no modification (PCA on original variable) ## typ=2 ACM ## typ=3 normed and centred PCA ## typ=4 centred PCA ## typ=5 normed and non-centred PCA ## typ=6 COA ## typ=7 FCA ## typ=8 Hill-smith typR <- dudi.type(dudiR$call) ##------- index can takes 2 values (1 for quantitative / 2 for factor) --------# if (typR %in% c(1, 3, 4, 5, 6, 7)) { indexR <- rep(1, ncol(Rinit)) assignR <- 1:ncol(Rinit) } else if (typR == 2) { indexR <- rep(2, ncol(Rinit)) assignR <- rep(1:ncol(Rinit), apply(Rinit, 2, function(x) nlevels(as.factor(x)))) Rinit <- acm.disjonctif(Rinit) } else if (typR == 8) { provinames <- "tmp" indexR <- ifelse(dudiR$index == "q", 1, 2) assignR <- as.numeric(dudiR$assign) res <- matrix(0, nrow(Rinit), 1) for (j in 1:(ncol(Rinit))) { if (indexR[j] == 1) { res <- cbind(res, Rinit[, j]) provinames <- c(provinames,names(Rinit)[j]) } else if (indexR[j] == 2) { w <- fac2disj(Rinit[, j], drop = TRUE) res <- cbind(res, w) provinames <- c(provinames, paste(substr(names(Rinit)[j], 1, 5), ".", names(w), sep = "")) } } Rinit <- res[,-1] colnames(Rinit) <- provinames[-1] } else stop ("Not yet available") tabQ.cw <- dudiQ$cw appelQ <- as.list(dudiQ$call) tabQ <- Qinit <- eval.parent(appelQ$df) typQ <- dudi.type(dudiQ$call) if (typQ %in% c(1, 3, 4, 5, 6, 7)) { indexQ <- rep(1,ncol(Qinit)) assignQ <- 1:ncol(Qinit) } else if (typQ == 2) { indexQ <- rep(2, ncol(Qinit)) assignQ <- rep(1:ncol(Qinit),apply(Qinit, 2, function(x) nlevels(as.factor(x)))) Qinit <- acm.disjonctif(Qinit) } else if (typQ == 8) { provinames <- "tmp" indexQ <- ifelse(dudiQ$index=="q",1,2) assignQ <- as.numeric(dudiQ$assign) res <- matrix(0, nrow(Qinit), 1) for (j in 1:(ncol(Qinit))) { if (indexQ[j] == 1) { res <- cbind(res, Qinit[, j]) provinames <- c(provinames,names(Qinit)[j]) } else if (indexQ[j] == 2) { w <- fac2disj(Qinit[, j]) res <- cbind(res, w) provinames <- c(provinames, paste(substr(names(Qinit)[j], 1, 5), ".", names(w), sep = "")) } } Qinit <- res[,-1] colnames(Qinit) <- provinames[-1] } else stop ("Not yet available") appelL <- as.list(dudiL$call) tabL <- eval.parent(appelL$df) tabL.cw <- dudiL$cw tabL.lw <- dudiL$lw ncolQ <- ncol(Qinit) ncolR <- ncol(Rinit) nvarR <- ncol(tabR) nvarQ <- ncol(tabQ) ## Dimensions for D ang G matrices naxes <- xtest$nf if(typetest=="axes"){ ncolD <- ncolG <- naxes nrowD <- nrowG <- naxes typeTestN <- 1 } else if (typetest=="Q.axes"){ ncolD <- ncolG <- naxes nrowD <- ncolQ nrowG <- nvarQ typeTestN <- 3 } else if(typetest=="R.axes"){ ncolD <- ncolR ncolG <- nvarR nrowD <- nrowG <- naxes typeTestN <- 2 } ##----- create objects to store results -------# tabD <- matrix(0, nrepet + 1, nrowD * ncolD) tabD2 <- matrix(0, nrepet + 1, nrowD * ncolD) tabG <- matrix(0, nrepet + 1, nrowG * ncolG) res <- list() ##------------------ ## Call the C code ##------------------ res <- .C("quatriemecoinRLQ", as.double(t(Rinit)), as.double(t(tabL)), as.double(t(Qinit)), as.integer(ncolR), as.integer(nvarR), as.integer(nrow(tabL)), as.integer(ncol(tabL)), as.integer(ncolQ), as.integer(nvarQ), as.integer(nrepet), modeltype = as.integer(modeltype), tabD = as.double(tabD), tabD2 = as.double(tabD2), tabG = as.double(tabG), as.integer(nrowD), as.integer(ncolD), as.integer(nrowG), as.integer(ncolG), as.integer(indexR), as.integer(indexQ), as.integer(assignR), as.integer(assignQ), as.double(t(xtest$c1)), as.double(t(xtest$l1)), as.integer(typeTestN), as.integer(naxes), as.integer(typR), as.integer(typQ), as.double(tabR.cw), as.double(tabQ.cw), PACKAGE="ade4")[c("tabD","tabD2","tabG")] ##-------------------------------------------------------------------# ## Outputs # ##-------------------------------------------------------------------# if(typetest == "axes"){ res$varnames.Q <- res$colnames.Q <- names(xtest$lQ) res$varnames.R <- res$colnames.R <- names(xtest$lR) res$assignR <- res$assignQ <- 1:naxes res$indexR <- res$indexQ <- rep(1,naxes) } else if (typetest == "Q.axes"){ res$varnames.Q <- names(tabQ) res$colnames.Q <- colnames(Qinit) res$varnames.R <- res$colnames.R <- names(xtest$lR) res$indexQ <- indexQ res$assignQ <- assignQ res$assignR <- 1:naxes res$indexR <- rep(1,naxes) } else if(typetest == "R.axes"){ res$varnames.Q <- res$colnames.Q <- names(xtest$lQ) res$varnames.R <- names(tabR) res$colnames.R <- colnames(Rinit) res$indexR <- indexR res$assignR <- assignR res$assignQ <- 1:naxes res$indexQ <- rep(1,naxes) } ## set invalid permutation to NA (in the case of levels of a factor with no observation) res$tabD <- ifelse(res$tabD < (-998), NA, res$tabD) res$tabG <- ifelse(res$tabG < (-998), NA, res$tabG) ## Reshape the tables res$tabD <- matrix(res$tabD, nrepet + 1, nrowD * ncolD, byrow = TRUE) res$tabD2 <- matrix(res$tabD2, nrepet + 1, nrowD * ncolD, byrow = TRUE) res$tabG <- matrix(res$tabG, nrepet + 1, nrowG * ncolG, byrow = TRUE) ## Create vectors to store type of statistics and alternative hypotheses names.stat.D <- vector(mode="character") names.stat.D2 <- vector(mode="character") names.stat.G <- vector(mode="character") alter.G <- vector(mode="character") alter.D <- vector(mode="character") alter.D2 <- vector(mode="character") for (i in 1:nrowG){ for (j in 1:ncolG){ ## Type of statistics for G and alternative hypotheses if ((res$indexR[j]==1)&(res$indexQ[i]==1)){ names.stat.G <- c(names.stat.G, "r") alter.G <- c(alter.G, "two-sided") } if ((res$indexR[j]==1)&(res$indexQ[i]==2)){ names.stat.G <- c(names.stat.G, "F") alter.G <- c(alter.G, "greater") } if ((res$indexR[j]==2)&(res$indexQ[i]==1)){ names.stat.G <- c(names.stat.G, "F") alter.G <- c(alter.G, "greater") } } } for (i in 1:nrowD){ for (j in 1:ncolD){ ## Type of statistics for D and alternative hypotheses if ((res$indexR[res$assignR[j]]==1)&(res$indexQ[res$assignQ[i]]==1)){ names.stat.D <- c(names.stat.D, "r") names.stat.D2 <- c(names.stat.D2, "r") alter.D <- c(alter.D, "two-sided") alter.D2 <- c(alter.D2, "two-sided") } if ((res$indexR[res$assignR[j]]==1)&(res$indexQ[res$assignQ[i]]==2)){ names.stat.D <- c(names.stat.D, "Homog.") names.stat.D2 <- c(names.stat.D2, "r") alter.D <- c(alter.D, "less") alter.D2 <- c(alter.D2, "two-sided") } if ((res$indexR[res$assignR[j]]==2)&(res$indexQ[res$assignQ[i]]==1)){ names.stat.D <- c(names.stat.D, "Homog.") names.stat.D2 <- c(names.stat.D2, "r") alter.D <- c(alter.D, "less") alter.D2 <- c(alter.D2, "two-sided") } } } provinames <- apply(expand.grid(res$colnames.R, res$colnames.Q), 1, paste, collapse=" / ") res$tabD <- as.krandtest(obs = res$tabD[1, ], sim = res$tabD[-1, , drop = FALSE], names = provinames, alter = alter.D, call = match.call(), p.adjust.method = p.adjust.method.D, ...) res$tabD2 <- as.krandtest(obs = res$tabD2[1, ], sim = res$tabD2[-1, , drop = FALSE], names = provinames, alter = alter.D2, call = match.call(), p.adjust.method = p.adjust.method.D, ...) if(p.adjust.D == "levels"){ ## adjustment only between levels of a factor (corresponds to the original paper of Legendre et al. 1997) for (i in 1:nrowG){ for (j in 1:ncolG){ idx.varR <- which(res$assignR == j) idx.varQ <- which(res$assignQ == i) idx.vars <- ncolG * (idx.varQ - 1) + idx.varR res$tabD$adj.pvalue[idx.vars] <- p.adjust(res$tabD$pvalue[idx.vars], method = p.adjust.method.D) res$tabD2$adj.pvalue[idx.vars] <- p.adjust(res$tabD2$pvalue[idx.vars], method = p.adjust.method.D) } } res$tabD$adj.method <- res$tabD2$adj.method <- paste(p.adjust.method.D, "by levels") } provinames <- apply(expand.grid(res$varnames.R, res$varnames.Q), 1, paste, collapse=" / ") res$tabG <- as.krandtest(obs = res$tabG[1, ], sim = res$tabG[-1, , drop = FALSE], names = provinames, alter = alter.G, call = match.call(), p.adjust.method = p.adjust.method.G, ...) res$tabD$statnames <- names.stat.D res$tabD2$statnames <- names.stat.D2 res$tabG$statnames <- names.stat.G res$call <- match.call() res$model <- modeltype res$npermut <- nrepet class(res) <- "4thcorner" return(res) } ade4/R/dist.neig.R0000644000176200001440000000071112576021756013311 0ustar liggesusers"dist.neig" <- function (neig) { if (!inherits(neig, "neig")) stop("Object of class 'neig' expected") res <- neig.util.LtoG(neig) n <- nrow(res) auxi1 <- res auxi2 <- res for (itour in 2:n) { auxi2 <- auxi2 %*% auxi1 auxi2[res != 0] <- 0 diag(auxi2) <- 0 auxi2 <- (auxi2 > 0) * itour if (sum(auxi2) == 0) break res <- res + auxi2 } return(as.dist(res)) } ade4/R/randtest.discrimin.R0000644000176200001440000000216413050632301015213 0ustar liggesusers"randtest.discrimin" <- function(xtest, nrepet=999, ...) { if (!inherits(xtest, "discrimin")) stop("'discrimin' object expected") appel <- as.list(xtest$call) dudi <- eval.parent(appel$dudi) fac <- eval.parent(appel$fac) lig <- nrow(dudi$tab) if (length(fac) != lig) stop ("Non convenient dimension") rank <- dudi$rank dudi <- redo.dudi(dudi,rank) X <- dudi$l1 X.lw <- dudi$lw # dudi et dudi.lw sont soumis a la permutation # fac reste fixe if ((!(identical(all.equal(X.lw,rep(1/nrow(X), nrow(X))),TRUE)))) { if(as.list(dudi$call)[[1]] == "dudi.acm" ) stop ("Not implemented for non-uniform weights in the case of dudi.acm") else if(as.list(dudi$call)[[1]] == "dudi.hillsmith" ) stop ("Not implemented for non-uniform weights in the case of dudi.hillsmith") else if(as.list(dudi$call)[[1]] == "dudi.mix" ) stop ("Not implemented for non-uniform weights in the case of dudi.mix") } isim <- testdiscrimin(nrepet, rank, X.lw, fac, X, nrow(X), ncol(X)) obs <- isim[1] return(as.randtest(isim[-1], obs, call = match.call(), ...)) } ade4/R/wca.rlq.R0000644000176200001440000001222412576021756012776 0ustar liggesusers"wca.rlq" <- function (x, fac, scannf = TRUE, nf = 2, ...) { if (!inherits(x, "rlq")) stop("Object of class rlq expected") if (!is.factor(fac)) stop("factor expected") appel <- as.list(x$call) dudiR <- eval.parent(appel$dudiR) dudiL <- eval.parent(appel$dudiL) dudiQ <- eval.parent(appel$dudiQ) ligR <- nrow(dudiR$tab) if (length(fac) != ligR) stop("Non convenient dimension") cla.w <- tapply(dudiR$lw, fac, sum) mean.w <- function(x, w, fac, cla.w) { z <- x * w z <- tapply(z, fac, sum)/cla.w return(z) } tabmoyR <- apply(dudiR$tab, 2, mean.w, w = dudiR$lw, fac = fac, cla.w = cla.w) tabmoyR <- data.frame(tabmoyR) tabwitR <- dudiR$tab - tabmoyR[fac, ] tabmoyL <- apply(dudiL$tab, 2, mean.w, w = dudiL$lw, fac = fac, cla.w = cla.w) tabmoyL <- data.frame(tabmoyL) tabwitL <- dudiL$tab - tabmoyL[fac, ] dudiwitR <- as.dudi(tabwitR, dudiR$cw, dudiR$lw, scannf = FALSE, nf = nf, call = match.call(), type = "wit") dudiwitL <- as.dudi(tabwitL, dudiL$cw, dudiL$lw, scannf = FALSE, nf = nf, call = match.call(), type = "coa") res <- rlq(dudiwitR, dudiwitL, dudiQ, scannf = scannf, nf = nf) res$call <- match.call() U <- as.matrix(res$l1) * unlist(res$lw) U <- data.frame(as.matrix(dudiR$tab) %*% U) row.names(U) <- row.names(dudiR$tab) names(U) <- names(res$l1) res$lsR <- U U <- as.matrix(res$c1) * unlist(res$cw) U <- data.frame(t(as.matrix(x$c1)) %*% U) row.names(U) <- names(x$c1) names(U) <- names(res$c1) res$acQ <- U U <- as.matrix(res$l1) * unlist(res$lw) U <- data.frame(t(as.matrix(x$l1)) %*% U) row.names(U) <- names(x$l1) names(U) <- names(res$l1) res$acR <- U class(res) <- c("witrlq", "dudi") return(res) } "print.witrlq" <- function (x, ...) { if (!inherits(x, "witrlq")) stop("to be used with 'witrlq' object") cat("Within RLQ analysis\n") cat("call: ") print(x$call) cat("class: ") cat(class(x), "\n") cat("\n$rank (rank):", x$rank) cat("\n$nf (axis saved):", x$nf) cat("\n\neigen values: ") l0 <- length(x$eig) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n\n") else cat("\n\n") sumry <- array("", c(3, 4), list(1:3, c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$eig", length(x$eig), mode(x$eig), "eigen values") sumry[2, ] <- c("$lw", length(x$lw), mode(x$lw), "row weigths (crossed array)") sumry[3, ] <- c("$cw", length(x$cw), mode(x$cw), "col weigths (crossed array)") print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(14, 4), list(1:14, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$tab", nrow(x$tab), ncol(x$tab), "crossed array (CA)") sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), "R col = CA row: coordinates") sumry[3, ] <- c("$l1", nrow(x$l1), ncol(x$l1), "R col = CA row: normed scores") sumry[4, ] <- c("$co", nrow(x$co), ncol(x$co), "Q col = CA column: coordinates") sumry[5, ] <- c("$c1", nrow(x$c1), ncol(x$c1), "Q col = CA column: normed scores") sumry[6, ] <- c("$lR", nrow(x$lR), ncol(x$lR), "row coordinates (R)") sumry[7, ] <- c("$lsR", nrow(x$lsR), ncol(x$lsR), "supplementary row coordinates (R)") sumry[8, ] <- c("$mR", nrow(x$mR), ncol(x$mR), "normed row scores (R)") sumry[9, ] <- c("$lQ", nrow(x$lQ), ncol(x$lQ), "row coordinates (Q)") sumry[10, ] <- c("$mQ", nrow(x$mQ), ncol(x$mQ), "normed row scores (Q)") sumry[11, ] <- c("$aR", nrow(x$aR), ncol(x$aR), "axes onto within-RLQ axes (R)") sumry[12, ] <- c("$aQ", nrow(x$aQ), ncol(x$aQ), "axes onto within-RLQ axes (Q)") sumry[13, ] <- c("$acR", nrow(x$acR), ncol(x$acR), "RLQ axes onto within-RLQ axes (R)") sumry[14, ] <- c("$acQ", nrow(x$acQ), ncol(x$acQ), "RLQ axes onto within-RLQ axes (Q)") print(sumry, quote = FALSE) cat("\n") } "plot.witrlq" <- function (x, xax = 1, yax = 2, ...) { if (!inherits(x, "witrlq")) stop("Use only with 'witrlq' objects") if (x$nf == 1) { warnings("One axis only : not yet implemented") return(invisible()) } if (xax > x$nf) stop("Non convenient xax") if (yax > x$nf) stop("Non convenient yax") fac <- eval.parent(as.list(x$call)$fac) def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) layout(matrix(c(1, 1, 3, 1, 1, 4, 2, 2, 5, 2, 2, 6, 8, 8, 7), 3, 5), respect = TRUE) par(mar = c(0.1, 0.1, 0.1, 0.1)) s.class(x$lsR[, c(xax, yax)], fac = fac, sub = "R row scores and classes", csub = 2, clabel = 1.25) s.label(x$lQ[, c(xax, yax)], sub = "Q row scores", csub = 2, clabel = 1.25) s.corcircle(x$aR, xax, yax, sub = "R axes", csub = 2, clabel = 1.25) s.arrow(x$l1, xax = xax, yax = yax, sub = "R Canonical weights", csub = 2, clabel = 1.25) s.corcircle(x$aQ, xax, yax, sub = "Q axes", csub = 2, clabel = 1.25) s.arrow(x$c1, xax = xax, yax = yax, sub = "Q Canonical weights", csub = 2, clabel = 1.25) scatterutil.eigen(x$eig, wsel = c(xax, yax)) } ade4/R/table.dist.R0000644000176200001440000000124612576021756013462 0ustar liggesusers"table.dist" <- function (d, x = 1:(attr(d, "Size")), labels = as.character(x), clabel = 1, csize = 1, grid = TRUE) { opar <- par(mai = par("mai"), srt = par("srt")) on.exit(par(opar)) if (!inherits(d, "dist")) stop("object of class 'dist expected") table.prepare(x, x, labels, labels, clabel, clabel, grid, "leftbottom") n <- attr(d, "Size") d <- as.matrix(d) xtot <- x[col(d)] ytot <- x[row(d)] coeff <- diff(range(x))/n z <- as.vector(d) sq <- sqrt(z * pi) w1 <- max(sq) sq <- csize * coeff * sq/w1 symbols(xtot, ytot, circles = sq, fg = 1, bg = grey(0.8), add = TRUE, inches = FALSE) } ade4/R/mdpcoa.R0000644000176200001440000002034412576021756012674 0ustar liggesusersmdpcoa <- function(msamples, mdistances = NULL, method = c("mcoa", "statis", "mfa"), option = c("inertia", "lambda1", "uniform", "internal"), scannf = TRUE, nf = 3, full = TRUE, nfsep = NULL, tol = 1e-07) { if(!is.null(mdistances)){ if(length(msamples) != length(mdistances)) stop("uncorrect data") } method <- method[1] nbloci <- length(msamples) npop <- ncol(msamples[[1]]) if(nbloci == 1) stop("multiloci data are needed") if(any(nfsep < 2)) stop("The number of axes kept for the separated analyses should be higher than 1") YesY <- list() YesX <- list() option <- option[1] valoption <- rep(0, nbloci) if (option == "internal") { if (is.null(msamples$tabw) && is.null(mdistances$tabw)) { warning("Internal weights not found: uniform weigths are used") option <- "uniform" } else{ if (is.null(msamples$tabw) || is.null(mdistances$tabw)) valinternal <- c(msamples$tabw, mdistances$tabw) else{ valinternal <- msamples$tabw } } } if(full == TRUE || !is.null(nfsep)) scansep <- FALSE else scansep <- TRUE for(i in 1:nbloci) { if(!is.null(nfsep[i])){ nf1 <- nfsep[i] } else nf1 <- 2 dpcoasep <- dpcoa(data.frame(t(msamples[[i]])), mdistances[[i]], scannf = scansep, full = full, nf = nf1, tol = tol) YesY[[i]] <- dpcoasep$li YesX[[i]] <- dpcoasep$dls if (option == "lambda1") valoption[i] <- 1/(dpcoasep$eig[1]) else if (option == "inertia") { valoption[i] <- 1/sum(dpcoasep$eig) } else if (option == "uniform") { valoption[i] <- 1 } else if (option == "internal") valoption[i] <- valinternal[i] } names(YesY) <- names(msamples) names(YesX) <- names(msamples) weig1 <- as.vector(apply(msamples[[1]], 2, sum)) sum1 <- sum(msamples[[1]]) for(i in 2:nbloci) { weig1 <- weig1 + as.vector(apply(msamples[[i]], 2, sum)) sum1 <- sum1 + sum(msamples[[i]]) } weig1 <- weig1/sum1 YesY <- ktab.list.df(YesY, w.row = weig1, w.col = lapply(YesY, function(x) rep(1, ncol(x)))) coord <- list() if(method == "mcoa") { mdpcoa1 <- mcoa(YesY, option[1], scannf = scannf, nf = nf) nf <- mdpcoa1$nf increm <- lapply(YesY, ncol) increm <- c(0, cumsum(as.vector(unlist(increm)))) for(i in 1:nbloci) { X <- mdpcoa1$Tli[(1:npop) + npop * (i - 1), ] norm <- apply(X * X * YesY$lw, 2, sum) norm[norm <= tol * max(norm)] <- 1 coord[[i]] <- sqrt(valoption[i]) * (as.matrix(YesX[[i]]) %*% as.matrix(mdpcoa1$axis[(increm[i]+1):increm[i+1], ])) %*% diag(1/sqrt(norm)) } coordX <- t(cbind.data.frame(lapply(coord,t))) mdpcoa1$cosupX <- coordX mdpcoa1$nX <- as.vector(unlist(lapply(YesX, nrow))) class(mdpcoa1) <- c("mdpcoa", "mcoa") } if(method == "statis") { mdpcoa1 <- statis(YesY, scannf = scannf, nf = nf) nf <- mdpcoa1$C.nf coY <- list() coX <- list() norm <- apply(mdpcoa1$C.li * mdpcoa1$C.li * YesY$lw, 2, sum) norm[norm <= tol * max(norm)] <- 1 for(i in 1:nbloci) { coY[[i]] <- as.matrix(YesY[[i]])%*%t(YesY[[i]])%*%diag(YesY$lw)%*%as.matrix(mdpcoa1$C.li[, 1:nf])%*%diag(1/norm) coX[[i]] <- as.matrix(YesX[[i]])%*%t(YesY[[i]])%*%diag(YesY$lw)%*%as.matrix(mdpcoa1$C.li[, 1:nf])%*%diag(1/norm) } coordY <- t(cbind.data.frame(lapply(coY,t))) coordX <- t(cbind.data.frame(lapply(coX,t))) mdpcoa1$cosupY <- coordY mdpcoa1$cosupX <- coordX mdpcoa1$nX <- as.vector(unlist(lapply(YesX, nrow))) class(mdpcoa1) <- c("mdpcoa", "statis") } if(method == "mfa") { mdpcoa1 <- mfa(YesY, option[1], scannf = scannf, nf = nf) nf <- mdpcoa1$nf for(i in 1:nbloci) { interm <- (valoption[i]* t(YesY[[i]])) interm2 <- as.matrix(mdpcoa1$l1) * mdpcoa1$lw coord[[i]] <- (as.matrix(YesX[[i]])%*% interm)%*% interm2 } coordX <- t(cbind.data.frame(lapply(coord,t))) mdpcoa1$nX <- as.vector(unlist(lapply(YesX, nrow))) mdpcoa1$cosupX <- coordX class(mdpcoa1) <- c("mdpcoa", "mfa") } return(mdpcoa1) } kplotX.mdpcoa <- function(object, xax = 1, yax = 2, mfrow = NULL, which.tab = 1:length(object$nX), includepop = FALSE, clab = 0.7, cpoi = 0.7, unique.scale = FALSE, csub = 2, possub = "bottomright") { if (!inherits(object, "mdpcoa")) stop("Object of type 'mdpcoa' expected") opar <- par(ask = par("ask"), mfrow = par("mfrow"), mar = par("mar")) on.exit(par(opar)) if (is.null(mfrow)) mfrow <- n2mfrow(length(which.tab)) par(mfrow = mfrow) if (length(which.tab) > prod(mfrow)) par(ask = TRUE) nbloc <- length(object$nX) increm <- rep(1:nbloc, object$nX) nf <- ncol(object$cosupX) if (xax > nf) stop("Non convenient xax") if (yax > nf) stop("Non convenient yax") cootot <- object$cosupX[, c(xax, yax)] label <- TRUE if(inherits(object, "mcoa")) namloci <- rownames(object$cov2) else namloci <- object$tab.names for (ianal in which.tab) { coocol <- cootot[increm == ianal, ] if (unique.scale) s.label(cootot, clabel = 0, cpoint = 0, sub = namloci[ianal], possub = possub, csub = csub) else s.label(coocol, clabel = 0, cpoint = 0, sub = namloci[ianal], possub = possub, csub = csub) if (label) s.label(coocol, clabel = ifelse(includepop, 0, clab), cpoint = cpoi, add.plot = TRUE) if (includepop) { if(inherits(object, "mcoa")) s.label(object$Tl1[object$TL[, 1] == levels(object$TL[,1])[ianal], c(xax, yax)], clabel = clab, cpoint = 0, add.plot = TRUE) else if (inherits(object, "statis")){ npop <- nrow(object$C.li) s.label(object$cosupY[(1:npop) + npop * (ianal - 1), c(xax, yax)], clabel = clab, cpoint = 0, add.plot = TRUE) } else if (inherits(object, "mfa")){ npop <- nrow(object$li) s.label(object$lisup[(1:npop) + npop * (ianal - 1), c(xax, yax)], clabel = clab, cpoint = 0, add.plot = TRUE) } } } } prep.mdpcoa <- function(dnaobj, pop, model, ...) { if(!is.factor(pop)) stop("pop should be a factor") fun1 <- function(x){ sam1 <- model.matrix(~ -1 + pop) colnames(sam1) <- levels(pop) sam1 <- as.data.frame(sam1) dis1 <- ape::dist.dna(dnaobj[[x]], model[x], ...) prep <- lapply(dnaobj[[x]], paste, collapse= "") prep <- unlist(prep) lprep <- length(prep) prepind <- (1:lprep)[!duplicated(prep)] fprep <- factor(prep, levels = unique(prep)) sam1 <- apply(sam1, 2, function(x) tapply(x, fprep, sum)) sam1 <- as.data.frame(sam1) rownames(sam1) <- paste("a", 1:nrow(sam1), sep="") dis1 <- as.dist(as.matrix(dis1)[prepind, prepind]) attributes(dis1)$Labels <- rownames(sam1) alleleseq <- dnaobj[[x]][!duplicated(prep)] names(alleleseq) <- rownames(sam1) res <- list(pop = sam1, dis = dis1, alleleseq = alleleseq) return(res) } sauv <- lapply(1:length(dnaobj), fun1) sam <- lapply(sauv, function(x) x[[1]]) dis <- lapply(sauv, function(x) x[[2]]) alleleseq <- lapply(sauv, function(x) x[[3]]) names(dis) <- names(alleleseq) <- names(sam) <- names(dnaobj) return(list(sam = sam, dis = dis, alleleseq = alleleseq)) } ade4/R/dudi.fca.R0000644000176200001440000001033012576021756013100 0ustar liggesusers"dudi.fca" <- function (df, scannf = TRUE, nf = 2) { df <- as.data.frame(df) if (!is.data.frame(df)) stop("data.frame expected") if (is.null(attr(df, "col.blocks"))) stop("attribute 'col.blocks' expected for df") if (is.null(attr(df, "row.w"))) stop("attribute 'row.w' expected for df") bloc <- attr(df, "col.blocks") row.w <- attr(df, "row.w") indica <- attr(df, "col.num") nvar <- length(bloc) col.w <- apply(df * row.w, 2, sum) df <- sweep(df, 2, col.w, "/") - 1 col.w <- col.w/length(bloc) X <- as.dudi(df, col.w, row.w, scannf = scannf, nf = nf, call = match.call(), type = "fca") rcor <- matrix(0, nvar, X$nf) rcor <- row(rcor) + 0 + (0+1i) * col(rcor) floc <- function(x) { i <- Re(x) j <- Im(x) if (i == 1) k1 <- 0 else k1 <- cumsum(bloc)[i - 1] k2 <- k1 + bloc[i] k1 <- k1 + 1 z <- X$co[k1:k2, j] poicla <- X$cw[k1:k2] * nvar return(sum(poicla * z * z)) } rcor <- apply(rcor, c(1, 2), floc) rcor <- data.frame(rcor) row.names(rcor) <- names(bloc) names(rcor) <- names(X$l1) X$cr <- rcor X$blo <- bloc X$indica <- indica return(X) } "prep.fuzzy.var" <- function (df, col.blocks, row.w = rep(1, nrow(df))) { if (!is.data.frame(df)) stop("data.frame expected") if (!is.null(row.w)) { if (length(row.w) != nrow(df)) stop("non convenient dimension") } if (sum(col.blocks) != ncol(df)) { stop("non convenient data in col.blocks") } if (is.null(row.w)) row.w <- rep(1, nrow(df))/nrow(df) row.w <- row.w/sum(row.w) if (is.null(names(col.blocks))) { names(col.blocks) <- paste("FV", as.character(1:length(col.blocks)), sep = "") } f1 <- function(x) { a <- sum(x) if (is.na(a)) return(rep(0, length(x))) if (a == 0) return(rep(0, length(x))) return(x/a) } k2 <- 0 col.w <- rep(1, ncol(df)) for (k in 1:(length(col.blocks))) { k1 <- k2 + 1 k2 <- k2 + col.blocks[k] X <- df[, k1:k2] X <- t(apply(X, 1, f1)) X.marge <- apply(X, 1, sum) X.marge <- X.marge * row.w X.marge <- X.marge/sum(X.marge) X.mean <- apply(X * X.marge, 2, sum) nr <- sum(X.marge == 0) if (nr > 0) { nc <- col.blocks[k] X[X.marge == 0, ] <- rep(X.mean, rep(nr, nc)) cat(nr, "missing data found in block", k, "\n") } df[, k1:k2] <- X col.w[k1:k2] <- X.mean } attr(df, "col.blocks") <- col.blocks attr(df, "row.w") <- row.w attr(df, "col.freq") <- col.w col.num <- factor(rep((1:length(col.blocks)), col.blocks)) attr(df, "col.num") <- col.num return(df) } "dudi.fpca" <- function (df, scannf = TRUE, nf = 2) { if (!is.data.frame(df)) stop("data.frame expected") if (is.null(attr(df, "col.blocks"))) stop("attribute 'col.blocks' expected for df") if (is.null(attr(df, "row.w"))) stop("attribute 'row.w' expected for df") bloc <- attr(df, "col.blocks") row.w <- attr(df, "row.w") indica <- attr(df, "col.num") nvar <- length(bloc) col.w <- unlist(lapply(bloc, function(k) rep(1/k,k))) X <- dudi.pca (df, row.w = row.w, col.w = col.w, center = TRUE, scale = FALSE, scannf = scannf, nf = nf) X$call <- match.call() X$blo <- bloc X$indica <- indica w1 <- unlist(lapply(X$tab,function(x) sum(x*x*row.w))) w1 <- unlist(tapply(w1*col.w,indica,sum)) w2 <- tapply(X$cent,indica,function(x) 1-sum(x*x)) ratio <- w1/sum(w1) w1 <- cbind.data.frame(inertia=w1,max=w2,FST=w1/w2) row.names(w1) <- names(bloc) X$FST <- w1 row.names(w1) <- names(bloc) floc1 <- function(ifac) tapply(col.w*X$co[,ifac]*X$co[,ifac],indica,sum) w2 <- unlist(lapply(1:X$nf,floc1)) w2 <- matrix(w2,nvar,X$nf) w3 <- X$eig[1:X$nf] w2 <- t(apply(w2,1,function(x) x/w3)) w2 <- as.data.frame(w2) names(w2)=paste("Ax",1:X$nf,sep="") row.names(w2) <- names(bloc) w2 <- cbind.data.frame(w2,total=ratio) w2 <- round(1000*w2,0) X$inertia <- w2 return(X) } ade4/R/coinertia.R0000644000176200001440000002556113276234364013413 0ustar liggesusers"coinertia" <- function (dudiX, dudiY, scannf = TRUE, nf = 2) { normalise.w <- function(X, w) { # Correction d'un bug siganle par Sandrine Pavoine le 21/10/2006 f2 <- function(v) sqrt(sum(v * v * w)) norm <- apply(X, 2, f2) X <- sweep(X, 2, norm, "/") return(X) } if (!inherits(dudiX, "dudi")) stop("Object of class dudi expected") lig1 <- nrow(dudiX$tab) col1 <- ncol(dudiX$tab) if (!inherits(dudiY, "dudi")) stop("Object of class dudi expected") lig2 <- nrow(dudiY$tab) col2 <- ncol(dudiY$tab) if (lig1 != lig2) stop("Non equal row numbers") if (any((dudiX$lw - dudiY$lw)^2 > 1e-07)) stop("Non equal row weights") tabcoiner <- t(as.matrix(dudiY$tab)) %*% (as.matrix(dudiX$tab) * dudiX$lw) tabcoiner <- data.frame(tabcoiner) names(tabcoiner) <- names(dudiX$tab) row.names(tabcoiner) <- names(dudiY$tab) if (nf > dudiX$rank) nf <- dudiX$rank if (nf > dudiY$rank) nf <- dudiY$rank if ((lig1 tol) if (scannf) { if (exists("ade4TkGUIFlag")) { nf <- ade4TkGUI::chooseaxes(w1$values, rank) } else { barplot(w1$values[1:rank]) cat("Select the number of axes: ") nf <- as.integer(readLines(n = 1)) messageScannf(match.call(), nf) } } if (nf <= 0) nf <- 2 if (nf > rank) nf <- rank res$eig <- w1$values[1:rank] res$rank <- rank res$nf <- nf w1 <- w1$vectors[,1:nf] U <- t(dudiY$tab)%*%w1 U <- normalise.w(U, dudiY$cw) res$l1 <- U res$l1 <- as.data.frame(res$l1) names(res$l1) <- paste("RS", (1:nf), sep = "") row.names(res$l1) <- names(dudiY$tab) U <- t(t(U)*sqrt(res$eig[1:nf])) res$li <- U res$li <- as.data.frame(res$li) names(res$li) <- paste("Axis", (1:nf), sep = "") row.names(res$li) <- names(dudiY$tab) U <- as.matrix(dudiY$tab) U <- U*dudiY$lw U <- U%*%(as.matrix(res$l1)*dudiY$cw) U <- t(dudiX$tab)%*%U res$co <- U res$co <- as.data.frame(res$co) names(res$co) <- paste("Comp", (1:nf), sep = "") row.names(res$co) <- names(dudiX$tab) U <- t(t(U)/sqrt(res$eig[1:nf])) res$c1 <- U res$c1 <- as.data.frame(res$c1) names(res$c1) <- paste("CS", (1:nf), sep = "") row.names(res$c1) <- names(dudiX$tab) U <- as.matrix(res$c1) * dudiX$cw U <- data.frame(as.matrix(dudiX$tab) %*% U) row.names(U) <- row.names(dudiX$tab) names(U) <- paste("AxcX", (1:res$nf), sep = "") res$lX <- U U <- normalise.w(U, dudiX$lw) names(U) <- paste("NorS", (1:res$nf), sep = "") res$mX <- U U <- as.matrix(res$l1) * dudiY$cw U <- data.frame(as.matrix(dudiY$tab) %*% U) row.names(U) <- row.names(dudiY$tab) names(U) <- paste("AxcY", (1:res$nf), sep = "") res$lY <- U U <- normalise.w(U, dudiY$lw) names(U) <- paste("NorS", (1:res$nf), sep = "") res$mY <- U U <- as.matrix(res$c1) * dudiX$cw U <- data.frame(t(as.matrix(dudiX$c1)) %*% U) row.names(U) <- paste("Ax", (1:dudiX$nf), sep = "") names(U) <- paste("AxcX", (1:res$nf), sep = "") res$aX <- U U <- as.matrix(res$l1) * dudiY$cw U <- data.frame(t(as.matrix(dudiY$c1)) %*% U) row.names(U) <- paste("Ax", (1:dudiY$nf), sep = "") names(U) <- paste("AxcY", (1:res$nf), sep = "") res$aY <- U res$call <- match.call() class(res) <- c("coinertia", "dudi") } else { res <- as.dudi(tabcoiner, dudiX$cw, dudiY$cw, scannf = scannf, nf = nf, call = match.call(), type = "coinertia") U <- as.matrix(res$c1) * unlist(res$cw) U <- data.frame(as.matrix(dudiX$tab) %*% U) row.names(U) <- row.names(dudiX$tab) names(U) <- paste("AxcX", (1:res$nf), sep = "") res$lX <- U U <- normalise.w(U, dudiX$lw) names(U) <- paste("NorS", (1:res$nf), sep = "") res$mX <- U U <- as.matrix(res$l1) * unlist(res$lw) U <- data.frame(as.matrix(dudiY$tab) %*% U) row.names(U) <- row.names(dudiY$tab) names(U) <- paste("AxcY", (1:res$nf), sep = "") res$lY <- U U <- normalise.w(U, dudiY$lw) names(U) <- paste("NorS", (1:res$nf), sep = "") res$mY <- U U <- as.matrix(res$c1) * unlist(res$cw) U <- data.frame(t(as.matrix(dudiX$c1)) %*% U) row.names(U) <- paste("Ax", (1:dudiX$nf), sep = "") names(U) <- paste("AxcX", (1:res$nf), sep = "") res$aX <- U U <- as.matrix(res$l1) * unlist(res$lw) U <- data.frame(t(as.matrix(dudiY$c1)) %*% U) row.names(U) <- paste("Ax", (1:dudiY$nf), sep = "") names(U) <- paste("AxcY", (1:res$nf), sep = "") res$aY <- U } RV <- sum(res$eig)/sqrt(sum(dudiX$eig^2))/sqrt(sum(dudiY$eig^2)) res$RV <- RV return(res) } "plot.coinertia" <- function (x, xax = 1, yax = 2, ...) { if (!inherits(x, "coinertia")) stop("Use only with 'coinertia' objects") if (x$nf == 1) { warnings("One axis only : not yet implemented") return(invisible()) } if (xax > x$nf) stop("Non convenient xax") if (yax > x$nf) stop("Non convenient yax") def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) layout(matrix(c(1, 2, 3, 4, 4, 5, 4, 4, 6), 3, 3), respect = TRUE) par(mar = c(0.1, 0.1, 0.1, 0.1)) s.corcircle(x$aX, xax, yax, sub = "X axes", csub = 2, clabel = 1.25) s.corcircle(x$aY, xax, yax, sub = "Y axes", csub = 2, clabel = 1.25) scatterutil.eigen(x$eig, wsel = c(xax, yax)) s.match(x$mX, x$mY, xax, yax, clabel = 1.5) s.arrow(x$l1, xax = xax, yax = yax, sub = "Y Canonical weights", csub = 2, clabel = 1.25) s.arrow(x$c1, xax = xax, yax = yax, sub = "X Canonical weights", csub = 2, clabel = 1.25) } "print.coinertia" <- function (x, ...) { if (!inherits(x, "coinertia")) stop("to be used with 'coinertia' object") cat("Coinertia analysis\n") cat("call: ") print(x$call) cat("class: ") cat(class(x), "\n") cat("\n$rank (rank) :", x$rank) cat("\n$nf (axis saved) :", x$nf) cat("\n$RV (RV coeff) :", x$RV) cat("\n\neigenvalues: ") l0 <- length(x$eig) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n\n") else cat("\n\n") sumry <- array("", c(3, 4), list(1:3, c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$eig", length(x$eig), mode(x$eig), "Eigenvalues") sumry[2, ] <- c("$lw", length(x$lw), mode(x$lw), paste("Row weigths (for", x$call[[3]], "cols)")) sumry[3, ] <- c("$cw", length(x$cw), mode(x$cw), paste("Col weigths (for", x$call[[2]], "cols)")) print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(11, 4), list(1:11, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$tab", nrow(x$tab), ncol(x$tab), paste("Crossed Table (CT): cols(", x$call[[3]], ") x cols(", x$call[[2]], ")", sep="")) sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), paste("CT row scores (cols of ", x$call[[3]], ")", sep="")) sumry[3, ] <- c("$l1", nrow(x$l1), ncol(x$l1), paste("Principal components (loadings for ", x$call[[3]], " cols)", sep="")) sumry[4, ] <- c("$co", nrow(x$co), ncol(x$co), paste("CT col scores (cols of ", x$call[[2]], ")", sep="")) sumry[5, ] <- c("$c1", nrow(x$c1), ncol(x$c1), paste("Principal axes (loadings for ", x$call[[2]], " cols)", sep="")) sumry[6, ] <- c("$lX", nrow(x$lX), ncol(x$lX), paste("Row scores (rows of ", x$call[[2]], ")", sep="")) sumry[7, ] <- c("$mX", nrow(x$mX), ncol(x$mX), paste("Normed row scores (rows of ", x$call[[2]], ")", sep="")) sumry[8, ] <- c("$lY", nrow(x$lY), ncol(x$lY), paste("Row scores (rows of ", x$call[[3]], ")", sep="")) sumry[9, ] <- c("$mY", nrow(x$mY), ncol(x$mY), paste("Normed row scores (rows of ", x$call[[3]], ")", sep="")) sumry[10, ] <- c("$aX", nrow(x$aX), ncol(x$aX), paste("Corr ", x$call[[2]], " axes / coinertia axes", sep="")) sumry[11, ] <- c("$aY", nrow(x$aY), ncol(x$aY), paste("Corr ", x$call[[3]], " axes / coinertia axes", sep="")) print(sumry, quote = FALSE) cat("\n") cat(paste("CT rows = cols of ", x$call[[3]], " (", nrow(x$li), ") / CT cols = cols of ", x$call[[2]], " (", nrow(x$co),")", sep="")) cat("\n") } "summary.coinertia" <- function (object, ...) { if (!inherits(object, "coinertia")) stop("to be used with 'coinertia' object") thetitle <- "Coinertia analysis" cat(thetitle) cat("\n\n") NextMethod() appel <- as.list(object$call) dudiX <- eval.parent(appel$dudiX) dudiY <- eval.parent(appel$dudiY) norm.w <- function(X, w) { f2 <- function(v) sqrt(sum(v * v * w)/sum(w)) norm <- apply(X, 2, f2) return(norm) } util <- function(n) { x <- "1" for (i in 2:n) x[i] <- paste(x[i - 1], i, sep = "") return(x) } eig <- object$eig[1:object$nf] covar <- sqrt(eig) sdX <- norm.w(object$lX, dudiX$lw) sdY <- norm.w(object$lY, dudiX$lw) corr <- covar/sdX/sdY U <- cbind.data.frame(eig, covar, sdX, sdY, corr) row.names(U) <- as.character(1:object$nf) res <- list(EigDec = U) cat("Eigenvalues decomposition:\n") print(U) cat(paste("\nInertia & coinertia X (", deparse(appel$dudiX),"):\n", sep="")) inertia <- cumsum(sdX^2) max <- cumsum(dudiX$eig[1:object$nf]) ratio <- inertia/max U <- cbind.data.frame(inertia, max, ratio) row.names(U) <- util(object$nf) res$InerX <- U print(U) cat(paste("\nInertia & coinertia Y (", deparse(appel$dudiY),"):\n", sep="")) inertia <- cumsum(sdY^2) max <- cumsum(dudiY$eig[1:object$nf]) ratio <- inertia/max U <- cbind.data.frame(inertia, max, ratio) row.names(U) <- util(object$nf) res$InerY <- U print(U) RV <- sum(object$eig)/sqrt(sum(dudiX$eig^2))/sqrt(sum(dudiY$eig^2)) cat("\nRV:\n", RV, "\n") res$RV <- RV invisible(res) } ade4/R/mstree.R0000644000176200001440000000110212576021756012717 0ustar liggesusersmstree <- function(xdist, ngmax=1) { if(!inherits (xdist,"dist")) stop ("Object of class 'dist' expected") xdist <- as.matrix(xdist) nlig=nrow(xdist) xdist <- as.double(xdist) if (ngmax<=1) ngmax=1 if (ngmax>=nlig) ngmax=1 ngmax=as.integer(ngmax) voisi=as.double(matrix(0,nlig,nlig)) #MSTgraph (double *distances, int *nlig, int *ngmax, double *voisi) mst = .C("MSTgraph", distances = xdist, nlig = nlig, ngmax = ngmax, voisi = voisi,PACKAGE="ade4")$voisi mst = matrix(mst, nlig, nlig) mst = neig (mat01=mst) return(mst) } ade4/R/sco.label.R0000644000176200001440000000737712576021756013306 0ustar liggesusers################################ ## Evenly spaced labels for a score ################################ ## Can be used as a legend for the Gauss curve function. ## Takes one vector of quantitative values (abscissae) and draws lines connecting ## these abscissae to evenly spaced labels. ################################ "sco.label" <- function(score, label = names(score), clabel = 1, horizontal = TRUE, reverse = FALSE, pos.lab = 0.5, pch = 20, cpoint = 1, boxes = TRUE, lim = NULL, grid = TRUE, cgrid = 1, include.origin = TRUE, origin = c(0,0), sub = "", csub = 1.25, possub = "bottomleft"){ if(!is.vector(score)) stop("score should be a vector") nval <- length(score) if(is.null(label)) label <- 1:nval if(nval != length(label)) stop("length of 'label' is not convenient") if (pos.lab>1 | pos.lab<0) stop("pos.lab should be between 0 and 1") oldpar <- par(mar=rep(0.1, 4)) on.exit(par(oldpar)) res <- scatterutil.sco(score = score, lim = lim, grid = grid, cgrid = cgrid, include.origin = include.origin, origin = origin, sub = sub, csub = csub, horizontal = horizontal, reverse = reverse) if(horizontal){ if(reverse) { points(score, rep(1- res[3], nval), pch = pch, cex = par("cex") * cpoint) } else { points(score, rep(res[3], nval), pch = pch, cex = par("cex") * cpoint) } if(clabel>0){ if(is.null(pos.lab)) pos.lab <- 0.5 if(reverse){ pos.lab <- 1 - res[3] - pos.lab * (1 - res[3]) pos.elbow <- 1- res[3] - (pos.lab - res[3])/5 } else { pos.lab <- res[3] + pos.lab * (1 - res[3]) pos.elbow <- res[3] + (pos.lab - res[3])/5 } for (i in 1:nval) { xh <- strwidth(paste(" ", label[order(score)][i], " ", sep = ""), cex = par("cex") * clabel) tmp <- scatterutil.convrot90(xh,0) yh <- tmp[2] y2 <- res[1] + (res[2] - res[1])/(nval + 1) * i segments(score[order(score)][i],pos.elbow ,y2, pos.lab) if(reverse) { segments(score[order(score)][i], 1 - res[3], score[order(score)][i], pos.elbow) scatterutil.eti(y2, pos.lab - yh/2, label[order(score)][i], clabel = clabel, boxes = boxes, horizontal = FALSE) } else { segments(score[order(score)][i], res[3], score[order(score)][i], pos.elbow) scatterutil.eti(y2, pos.lab + yh/2, label[order(score)][i], clabel = clabel, boxes = boxes, horizontal = FALSE) } } } } else { if(reverse){ points(rep(1 - res[3], nval), score, pch = pch, cex = par("cex") * cpoint) } else { points(rep(res[3], nval), score, pch = pch, cex = par("cex") * cpoint) } if(clabel>0){ if(is.null(pos.lab)) pos.lab <- 0.5 if(reverse){ pos.lab <- 1 - res[3] - pos.lab * (1 - res[3]) pos.elbow <- 1- res[3] - (pos.lab - res[3])/5 } else { pos.lab <- res[3] + pos.lab * (1 - res[3]) pos.elbow <- res[3] + (pos.lab - res[3])/5 } for (i in 1:nval) { xh <- strwidth(paste(" ", label[order(score)][i], " ", sep = ""), cex = par("cex") * clabel) y2 <- res[1] + (res[2] - res[1])/(nval + 1) * i segments(pos.elbow,score[order(score)][i],pos.lab ,y2) if(reverse) { segments(1 - res[3],score[order(score)][i], pos.elbow, score[order(score)][i]) scatterutil.eti(pos.lab - xh/2, y2, label[order(score)][i], clabel = clabel, boxes = boxes, horizontal = TRUE) } else { segments(res[3],score[order(score)][i], pos.elbow, score[order(score)][i]) scatterutil.eti(pos.lab + xh/2, y2, label[order(score)][i], clabel = clabel, boxes = boxes, horizontal = TRUE) } } } } invisible(match.call()) } ade4/R/dist.ktab.R0000644000176200001440000044135213522570777013326 0ustar liggesusersdist.ktab <- function(x, type, option = c("scaledBYrange", "scaledBYsd", "noscale"), scann = FALSE, tol = 1e-8) { #******************************************************# # Parameters are checked # #******************************************************# if(!inherits(x, "ktab")) stop("x is not an object of class ktab") if(any(is.na(match(type, c("Q", "O", "N", "D", "F", "B", "C"))))) stop("incorrect type: available values for type are O, Q, N, D, F, B and C") if(length(x$blo) != length(type)) stop("incorrect length for type") if(!is.numeric(tol)) stop("tol is not a numeric") #*****************************************************# # If scann is TRUE, the functions of distance # #*****************************************************# if(scann == TRUE){ if(any(type == "F")){ cat("Choose your metric for fuzzy variables\n") cat("1 = d1 Manly\n") cat("d1 = Sum|p(i)-q(i)|/2\n") cat("2 = Overlap index Manly\n") cat("d2 = 1-Sum(p(i)q(i))/sqrt(Sum(p(i)^2))/sqrt(Sum(q(i)^2))\n") cat("3 = Rogers 1972 (one locus)\n") cat("d3 = sqrt(0.5*Sum(p(i)-q(i)^2))\n") cat("4 = Edwards 1971 (one locus)\n") cat("d4 = sqrt(1-(Sum(sqrt(p(i)q(i)))))\n") cat("Selec an integer (1-4): ") methodF <- as.integer(readLines(n = 1)) if (methodF == 4) methodF <- 5 } if(any(type == "B")){ cat("Choose your metric for binary variables\n") cat("1 = JACCARD index (1901) S3 coefficient of GOWER & LEGENDRE\n") cat("s1 = a/(a+b+c) --> d = sqrt(1 - s)\n") cat("2 = SOKAL & MICHENER index (1958) S4 coefficient of GOWER & LEGENDRE \n") cat("s2 = (a+d)/(a+b+c+d) --> d = sqrt(1 - s)\n") cat("3 = SOKAL & SNEATH(1963) S5 coefficient of GOWER & LEGENDRE\n") cat("s3 = a/(a+2(b+c)) --> d = sqrt(1 - s)\n") cat("4 = ROGERS & TANIMOTO (1960) S6 coefficient of GOWER & LEGENDRE\n") cat("s4 = (a+d)/(a+2(b+c)+d) --> d = sqrt(1 - s)\n") cat("5 = CZEKANOWSKI (1913) or SORENSEN (1948) S7 coefficient of GOWER & LEGENDRE\n") cat("s5 = 2*a/(2*a+b+c) --> d = sqrt(1 - s)\n") cat("6 = S9 index of GOWER & LEGENDRE (1986)\n") cat("s6 = (a-(b+c)+d)/(a+b+c+d) --> d = sqrt(1 - s)\n") cat("7 = OCHIAI (1957) S12 coefficient of GOWER & LEGENDRE\n") cat("s7 = a/sqrt((a+b)(a+c)) --> d = sqrt(1 - s)\n") cat("8 = SOKAL & SNEATH (1963) S13 coefficient of GOWER & LEGENDRE\n") cat("s8 = ad/sqrt((a+b)(a+c)(d+b)(d+c)) --> d = sqrt(1 - s)\n") cat("9 = Phi of PEARSON = S14 coefficient of GOWER & LEGENDRE\n") cat("s9 = (ad-bc)/sqrt((a+b)(a+c)(b+d)(d+c)) --> d = sqrt(1 - s)\n") cat("10 = S2 coefficient of GOWER & LEGENDRE\n") cat("s10 = a/(a+b+c+d) --> d = sqrt(1 - s) and unit self-similarity\n") cat("Select an integer (1-10): ") methodB <- as.integer(readLines(n = 1)) } methodO <- 0 if(any(type == "O")){ cat("Choose your metric for ordinal variables\n") cat("1 = ranked variables treated as quantitative variables\n") cat("2 = Podani (1999)'s formula\n") cat("Select an integer (1-2): ") methodO <- as.integer(readLines(n = 1)) } if(any(c(type == "Q", methodO == 1))){ cat("Choose your metric for quantitative variables\n") cat("1 = Euclidean\n") cat("d1 = Sum((x(i)-y(i))^2)/n\n") cat("2 = Manhattan\n") cat("d2= Sum(|x(i)-y(i)|)/n\n") cat("Select an integer (1-2): ") methodQ <- as.integer(readLines(n = 1)) } } else{ methodQ <- 1 methodF <- 2 methodB <- 1 methodO <- 1 } nlig <- nrow(x[[1]]) ntype <- length(unique(type)) if(any(type=="D")) napres <- TRUE else napres <- any(is.na(unlist(x[(1:length(x$blo))]))) d.names <- rownames(x[[1]]) treatment <- function(i) { #*****************************************************# # Ordinal data # #*****************************************************# if(type[i] == "O"){ #*****************************************************# # Data are checked # #*****************************************************# transrank <- function(u){ return(rank(u, na.last = "keep")) } df <- apply(x[[i]], 2, transrank) #*****************************************************# if(methodO == 1){ if(!any(is.na(df))){ cmax <- apply(df, 2, max, na.rm = TRUE) cmin <- apply(df, 2, min, na.rm = TRUE) df <- as.data.frame(scale(df, center = cmin, scale = (cmax - cmin))) if(methodQ == 1){ thedis <- dist.quant(df, method = 1) } else{ mat <- matrix(0, nlig, nlig) index <- cbind(col(mat)[col(mat) < row(mat)], row(mat)[col(mat) < row(mat)]) fun1.OQ <- function(tab){ fun2.OQ <- function(u) { # start return(sqrt(sum(abs(tab[u[1], ] - tab[u[2], ])))) # end } d <- unlist(apply(index, 1, fun2.OQ)) attr(d, "Size") <- nlig attr(d, "Labels") <- d.names attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "method") <- "quantitative" attr(d, "call") <- match.call() class(d) <- "dist" return(d) } thedis <- fun1.OQ(df) } thedis[thedis < tol] <- 0 nbvar <- ncol(x[[i]]) if(napres){ ntvar <- matrix(ncol(df), nrow(df), nrow(df)) } } else{ cmax <- apply(df, 2, max, na.rm = TRUE) cmin <- apply(df, 2, min, na.rm = TRUE) df <- as.data.frame(scale(df, center = cmin, scale = ifelse((cmax - cmin) 1){ for (k in 2:length(interm)){ mat <- interm[[k]] + mat } } ntvar <- mat # calculation of the sum of distances funfin2.ONA <- function(u){ u[is.na(u)] <- 0 return(u) } res <- lapply(listdis, funfin2.ONA) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) } } else{ ##################################################### # Podani's distance # ##################################################### df2 <- cbind.data.frame(df[, apply(df, 2, function(u) !all(is.na(u)))]) if(ncol(df2) == 0) stop("one of the quantitative data frames is full of NA") if(ncol(df) != ncol(df2)){ warning("a column full of NA in the quantitative or ordinal data set ", i) df <- as.data.frame(df2) } if(!all(unlist(lapply(df, is.numeric)))) stop("Incorrect definition of the quantitative variables") #*****************************************************# cmax <- apply(df, 2, max, na.rm = TRUE) cmin <- apply(df, 2, min, na.rm = TRUE) if(ncol(df)>1) granks <- apply(df, 2, table) else granks <- list(as.vector(apply(df, 2, table))) grankmax <- as.vector(unlist(lapply(granks, function(u) u[length(u)]))) grankmin <- as.vector(unlist(lapply(granks, function(u) u[1]))) if(ncol(df)>1) uranks <- apply(df, 2, function(u) sort(unique(u))) else uranks <- list(as.vector(apply(df, 2, function(u) sort(unique(u))))) mat <- matrix(0, nlig, nlig) index <- cbind(col(mat)[col(mat) < row(mat)], row(mat)[col(mat) < row(mat)]) fun1.OP <- function(k){ r <- df fun2.OP <- function(u){ if(any(is.na(c(r[u[1], k], r[u[2], k])))){ return(NA)} else{ if(r[u[1], k] == r[u[2], k]){ return(0)} else{ val <- (abs(r[u[1], k] - r[u[2], k]) - (granks[[k]][uranks[[k]] == r[u[1], k]] - 1)/2 - (granks[[k]][uranks[[k]] == r[u[2], k]] - 1)/2) / ((cmax[k] - cmin[k]) - (grankmax[k] - 1)/2 - (grankmin[k] - 1)/2) return(val) } } } d <- unlist(apply(index, 1, fun2.OP)) attr(d, "Size") <- nlig attr(d, "Labels") <- d.names attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "method") <- "quantitative" attr(d, "call") <- match.call() class(d) <- "dist" return(d) } lis <- as.list(1:ncol(df)) listdis <- lapply(lis, fun1.OP) if(napres){ listmat <- lapply(listdis, as.matrix) funfin1.OP <- function(u){ u[!is.na(u)] <- 1 u[is.na(u)] <- 0 return(u) } interm <- lapply(listmat, funfin1.OP) mat <- interm[[1]] if(length(interm) > 1){ for (k in 2:length(interm)){ mat <- interm[[k]] + mat } } ntvar <- mat } else nbvar <- ncol(x[[i]]) # calculation of the sum of distances funfin2.OP <- function(u){ u[is.na(u)] <- 0 return(u) } res <- lapply(listdis, funfin2.OP) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) } } #*****************************************************# # Quantitative data # #*****************************************************# if(type[i] == "Q"){ #*****************************************************# # Data are checked # #*****************************************************# df <- x[[i]] df2 <- cbind.data.frame(df[, apply(df, 2, function(u) !all(is.na(u)))]) if(ncol(df2) == 0) stop("one of the quantitative data frames is full of NA") if(ncol(df) != ncol(df2)){ warning("a column full of NA in the quantitative or ordinal data set ", i) df <- as.data.frame(df2) } if(!all(unlist(lapply(df, is.numeric)))) stop("Incorrect definition of the quantitative variables") #*****************************************************# if(option[1] == "scaledBYsd"){ df <- as.data.frame(scale(df)) if(length(unique(type)) > 1) warning("the option scaledBYsd should not be chosen in case of mixed variables") } if(option[1] == "scaledBYrange") { cmax <- apply(df, 2, max, na.rm = TRUE) cmin <- apply(df, 2, min, na.rm = TRUE) df <- as.data.frame(scale(df, center = cmin, scale = ifelse((cmax - cmin) 1){ for (k in 2:length(interm)){ mat <- interm[[k]] + mat } } ntvar <- mat # calculation of the sum of distances funfin2.QNA <- function(u){ u[is.na(u)] <- 0 return(u) } res <- lapply(listdis, funfin2.QNA) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) } } #*****************************************************# # Nominal data # #*****************************************************# if(type[i] == "N"){ #*****************************************************# # Data are checked # #*****************************************************# df <- x[[i]] df2 <- cbind.data.frame(df[, apply(df, 2, function(u) !all(is.na(u)))]) if(ncol(df2) == 0) stop("one of the nominal data frames is full of NA") if(ncol(df) != ncol(df2)){ warning("a column full of NA in the nominal data sets") df <- as.data.frame(df2) } verif <- function(u){ if(!is.factor(u)){ if(!is.character(u)) stop("Incorrect definition of the nominal variables") } } lapply(df, verif) #*****************************************************# if(!any(is.na(df))){ FUN <- function(u){ m <- model.matrix(~-1 + as.factor(u)) return(dist(m) / sqrt(2)) } lis <- as.list(df) res <- lapply(lis, FUN) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) nbvar <- ncol(df) if(napres){ ntvar <- matrix(ncol(df), nrow(df), nrow(df)) } } else{ mat <- matrix(0, nlig, nlig) index <- cbind(col(mat)[col(mat) < row(mat)], row(mat)[col(mat) < row(mat)]) fun1.NNA <- function(vect){ fun2.NNA <- function(u) { if(any(is.na(c(vect[u[1]], vect[u[2]])))) return(NA) else{ if(vect[u[1]] == vect[u[2]]){ return(0) } else return(1) } } d <- unlist(apply(index, 1, fun2.NNA)) attr(d, "Size") <- nlig attr(d, "Labels") <- d.names attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "method") <- "nominal" attr(d, "call") <- match.call() class(d) <- "dist" return(d) } if(ncol(df) == 1) lis <- list(df[, 1]) else lis <- as.list(df) listdis <- lapply(lis, fun1.NNA) listmat <- lapply(listdis, as.matrix) funfin1.NNA <- function(u){ u[!is.na(u)] <- 1 u[is.na(u)] <- 0 return(u) } interm <- lapply(listmat, funfin1.NNA) mat <- interm[[1]] if(length(interm) > 1){ for (k in 2:length(interm)){ mat <- interm[[k]] + mat } } ntvar <- mat # calculation of the sum of distances funfin2.NNA <- function(u){ u[is.na(u)] <- 0 return(u) } res <- lapply(listdis, funfin2.NNA) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) } } #*****************************************************# # Dichotomous data # #*****************************************************# if(type[i] == "D"){ #*****************************************************# # Data are checked # #*****************************************************# df <- x[[i]] df2 <- cbind.data.frame(df[, apply(df, 2, function(u) !all(is.na(u)))]) if(ncol(df2) == 0) stop("one of the nominal data frames is full of NA") if(ncol(df) != ncol(df2)){ warning("a column full of NA in the dichotomous data sets") df <- as.data.frame(df2) } verif <- function(u){ if(any(!u[!is.na(u)] %in% c(0, 1))) stop("Dichotomous variables should have only 0, and 1") } lapply(df, verif) #*****************************************************# mat <- matrix(0, nlig, nlig) index <- cbind(col(mat)[col(mat) < row(mat)], row(mat)[col(mat) < row(mat)]) fun1.D <- function(vect){ fun2.D <- function(u) { if(any(is.na(c(vect[u[1]], vect[u[2]])))) return(NA) else{ if(vect[u[1]] == vect[u[2]]){ if(vect[u[1]] == 1) return(0) else return(NA) } else return(1) } } d <- unlist(apply(index, 1, fun2.D)) attr(d, "Size") <- nlig attr(d, "Labels") <- d.names attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "method") <- "nominal" attr(d, "call") <- match.call() class(d) <- "dist" return(d) } if(ncol(df) == 1) lis <- list(df[, 1]) else lis <- as.list(df) listdis <- lapply(lis, fun1.D) listmat <- lapply(listdis, as.matrix) funfin1.D <- function(u){ u[!is.na(u)] <- 1 u[is.na(u)] <- 0 return(u) } interm <- lapply(listmat, funfin1.D) mat <- interm[[1]] if(length(interm) > 1){ for (k in 2:length(interm)){ mat <- interm[[k]] + mat } } ntvar <- mat # calculation of the sum of distances funfin2.D <- function(u){ u[is.na(u)] <- 0 return(u) } res <- lapply(listdis, funfin2.D) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) } #*****************************************************# # Fuzzy data # #*****************************************************# if(type[i] == "F"){ #*****************************************************# # Data are checked # #*****************************************************# df <- x[[i]] df2 <- df[, apply(df, 2, function(u) !all(is.na(u)))] if(ncol(df2) == 0) stop("one of the fuzzy data frames is full of NA") if(ncol(df) != ncol(df2)){ stop("a column full of NA in the fuzzy data sets") } if(!all(unlist(lapply(df, is.numeric)))) stop("Incorrect definition of the fuzzy variables") if(is.null(attributes(df)$col.blocks)) stop("The fuzzy data set must be prepared with the function prep.fuzzy") #*****************************************************# blocs <- attributes(x[[i]])$col.blocks fac <- as.factor(rep(1:length(blocs), blocs)) lis <- split(as.data.frame(t(x[[i]])), fac) lis <- lapply(lis, t) lis <- lapply(lis, cbind.data.frame) if(!any(is.na(x[[i]]))){ if(methodF!=3 & methodF!=4) res <- lapply(lis, function(u) dist.prop(u, method = methodF)) else res <- lapply(lis, function(u) dist.prop(u, method = methodF)^2) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) nbvar <- length(blocs) if(napres){ ntvar <- matrix(length(blocs), nrow(df), nrow(df)) } } else{ fun1.FNA <- function(mtflo){ res <- matrix(0, nlig, nlig) positions <- apply(mtflo, 1, function(u) any(is.na(u))) dfsansna <- mtflo[!positions, ] if(methodF!=3 & methodF!=4) resdis <- as.matrix(dist.prop(dfsansna, method = methodF)) else resdis <- as.matrix(dist.prop(dfsansna, method = methodF)^2) res[!positions, !positions] <- as.vector(resdis) res[positions, ] <- NA res[, positions] <- NA return(as.dist(res)) } listdis <- lapply(lis, fun1.FNA) listmat <- lapply(listdis, as.matrix) funfin1.FNA <- function(u){ u[!is.na(u)] <- 1 u[is.na(u)] <- 0 return(u) } interm <- lapply(listmat, funfin1.FNA) mat <- interm[[1]] if(length(interm) > 1){ for (k in 2:length(interm)){ mat <- interm[[k]] + mat } } ntvar <- mat # calculation of the sum of distances funfin2.FNA <- function(u){ u[is.na(u)] <- 0 return(u) } res <- lapply(listdis, funfin2.FNA) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) } } #*****************************************************# # Binary data # #*****************************************************# if(type[i] == "B"){ #*****************************************************# # Data are checked # #*****************************************************# if(!all(unlist(lapply(x[[i]], is.numeric)))) stop("Incorrect definition of the binary variables") if(is.null(attributes(x[[i]])$col.blocks)) stop("The binary data set must be prepared with the function prep.binary") if(any(is.na(match(as.vector(as.matrix(x[[i]])), c(0, 1, NA))))) stop("The binary data set must be prepared with the function prep.binary") #*****************************************************# blocs <- attributes(x[[i]])$col.blocks fac <- as.factor(rep(1:length(blocs), blocs)) lis <- split(as.data.frame(t(x[[i]])), fac) lis <- lapply(lis, t) lis <- lapply(lis, cbind.data.frame) if(!any(is.na(x[[i]]))){ res <- lapply(lis, function(u) dist.binary(u, method = methodB)^2) if(any(is.na(unlist(res)))) stop("Rows of zero for binary variables") mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) nbvar <- length(blocs) if(napres){ ntvar <- matrix(length(blocs), nlig, nlig) } } else{ fun1.BNA <- function(mtbin){ res <- matrix(0, nlig, nlig) positions <- apply(mtbin, 1, function(u) any(is.na(u))) dfsansna <- mtbin[!positions, ] resdis <- as.matrix(dist.binary(dfsansna, method = methodB)^2) res[!positions, !positions] <- as.vector(resdis) res[positions, ] <- NA res[, positions] <- NA return(as.dist(res)) } listdis <- lapply(lis, fun1.BNA) listmat <- lapply(listdis, as.matrix) funfin1.BNA <- function(u){ u[!is.na(u)] <- 1 u[is.na(u)] <- 0 return(u) } interm <- lapply(listmat, funfin1.BNA) mat <- interm[[1]] if(length(interm) > 1){ for (k in 2:length(interm)){ mat <- interm[[k]] + mat } } ntvar <- mat # calculation of the sum of distances funfin2.BNA <- function(u){ u[is.na(u)] <- 0 return(u) } res <- lapply(listdis, funfin2.BNA) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) } } #*****************************************************# # Circular data # #*****************************************************# if(type[i] == "C"){ #*****************************************************# # Data are checked # #*****************************************************# df <- x[[i]] df2 <- cbind.data.frame(df[, apply(df, 2, function(u) !all(is.na(u)))]) if(ncol(df2) == 0) stop("the circular data frames ", i, " is full of NA") if(ncol(df) != ncol(df2)){ warning("a column full of NA in the circular data sets") df <- as.data.frame(df2) } if(is.null(attributes(df)$max)) stop("The circular data sets must be prepared with the function prep.circular") verif <- function(u){ if(any(u[!is.na(u)] < 0)) stop("negative values in circular variables") } lapply(df, verif) #*****************************************************# d.names <- row.names(x[[i]]) nlig <- nrow(x[[i]]) mat <- matrix(0, nlig, nlig) index <- cbind(col(mat)[col(mat) < row(mat)], row(mat)[col(mat) < row(mat)]) odd <- function(u){ ifelse(abs(u/2 - floor(u/2)) < 1e-08, FALSE, TRUE) } if(!any(is.na(df))){ fun1.C <- function(nucol){ vect <- x[[i]][, nucol] maxi <- attributes(df)$max[nucol] vect <- vect / maxi fun2.C <- function(u) { if(odd(maxi)) return((2 * maxi /(maxi - 1)) * min(c(abs(vect[u[1]] - vect[u[2]]), (1 - abs(vect[u[1]] - vect[u[2]]))), na.rm = TRUE)) else return(2 * min(c(abs(vect[u[1]] - vect[u[2]]), (1 - abs(vect[u[1]] - vect[u[2]]))), na.rm = TRUE)) } d <- unlist(apply(index, 1, fun2.C)) attr(d, "Size") <- nlig attr(d, "Labels") <- d.names attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "method") <- "circular" attr(d, "call") <- match.call() class(d) <- "dist" return(d) } lis <- as.list(1:ncol(df)) res <- lapply(lis, fun1.C) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) nbvar <- ncol(x[[i]]) if(napres){ ntvar <- matrix(ncol(x[[i]]), nrow(df), nrow(df)) } } else{ fun1.CNA <- function(nucol){ vect <- x[[i]][, nucol] maxi <- attributes(df)$max[nucol] vect <- vect / maxi fun2.CNA <- function(u){ if(any(is.na(c(vect[u[1]], vect[u[2]])))) return(NA) else{ if(odd(maxi)) return((2 * maxi /(maxi - 1)) * min(c(abs(vect[u[1]] - vect[u[2]]), (1 - abs(vect[u[1]] - vect[u[2]]))), na.rm = TRUE)) else return(2 * min(c(abs(vect[u[1]] - vect[u[2]]), (1 - abs(vect[u[1]] - vect[u[2]]))), na.rm = TRUE)) } } d <- unlist(apply(index, 1, fun2.CNA)) attr(d, "Size") <- nlig attr(d, "Labels") <- d.names attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "method") <- "circular" attr(d, "call") <- match.call() class(d) <- "dist" return(d) } lis <- as.list(1:ncol(df)) listdis <- lapply(lis, fun1.CNA) listmat <- lapply(listdis, as.matrix) funfin1.CNA <- function(u){ u[!is.na(u)] <- 1 u[is.na(u)] <- 0 return(u) } interm <- lapply(listmat, funfin1.CNA) mat <- interm[[1]] if(length(interm) > 1){ for (k in 2:length(interm)){ mat <- interm[[k]] + mat } } ntvar <- mat # calculation of the sum of distances funfin2.CNA <- function(u){ u[is.na(u)] <- 0 return(u) } res <- lapply(listdis, funfin2.CNA) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) } } if(!napres) return(list(nbvar, thedis)) else return(list(ntvar, thedis)) } # Last calculations interm <- as.list(1:length(x$blo)) names(interm) <- paste("iteration", 1:length(x$blo), sep="") res <- lapply(interm, treatment) if(!napres) nbvar <- sum(unlist(lapply(res, function(u) u[[1]]))) else{ listntvar <- lapply(res, function(u) u[[1]]) mat <- listntvar[[1]] if(length(listntvar) > 1){ for (k in 2:length(listntvar)){ mat <- listntvar[[k]] + mat } } ntvar <- mat + diag(rep(1, nlig)) } dis <- lapply(res, function(u) u[[2]]) mat <- dis[[1]]^2 if(length(dis) > 1){ for (k in 2:length(dis)){ mat <- dis[[k]]^2 + mat } } if(!napres){ disglobal <- sqrt(mat / nbvar) } else{ disglobal <- as.dist(sqrt(as.matrix(mat) / ntvar)) } attributes(disglobal)$Labels <- d.names return(disglobal) } prep.binary <- function (df, col.blocks, labels = paste("B", 1:length(col.blocks), sep = "")) { if (!is.data.frame(df)) stop("data.frame expected") if (sum(col.blocks) != ncol(df)) { stop("non convenient data in col.blocks") } if (is.null(names(col.blocks))) { names(col.blocks) <- paste("FV", as.character(1:length(col.blocks)), sep = "") } df2 <- df[, apply(df, 2, function(u) !all(is.na(u)))] bloc <- rep(1:length(col.blocks), col.blocks) bloc <- as.factor(bloc[apply(df, 2, function(u) !all(is.na(u)))]) col.blocks <- as.vector(table(bloc)) df <- df2 if (any(df[!is.na(df)] < 0)) stop("non negative value expected in df") d.names <- row.names(df) nlig <- nrow(df) df <- as.matrix(1 * (df > 0)) f1 <- function(x, k) { a <- sum(x) if (is.na(a)) { return(rep(NA, length(x))) cat("missing data found in block", k, "\n") } if (a == 0) return(rep(NA, length(x))) return(x) } k2 <- 0 for (k in 1:(length(col.blocks))) { k1 <- k2 + 1 k2 <- k2 + col.blocks[k] X <- df[, k1:k2] X <- t(apply(X, 1, f1, k = k)) df[, k1:k2] <- X } df <- as.data.frame(df) attr(df, "col.blocks") <- col.blocks col.num <- factor(rep((1:length(col.blocks)), col.blocks)) attr(df, "col.num") <- col.num attr(df, "Labels") <- labels return(df) } prep.circular <- function (df, rangemin = apply(df, 2, min, na.rm = TRUE), rangemax = apply(df, 2, max, na.rm = TRUE)) { if (!is.data.frame(df)) stop("data.frame expected") veriffun <- function(i){ if(rangemin[i] > min(df[i], na.rm = TRUE)) stop("Incorrect minimum in rangemin") if(rangemax[i] < max(df[i], na.rm = TRUE)) stop("Incorrect maximum in rangemax") } sapply(1:ncol(df), veriffun) df1 <- sweep(df, 2, rangemin, "-") max2 <- rangemax - rangemin attr(df1, "max") <- max2 + 1 return(df1) } prep.fuzzy <- function (df, col.blocks, row.w = rep(1, nrow(df)), labels = paste("F", 1:length(col.blocks), sep = "")) { if (!is.data.frame(df)) stop("data.frame expected") if (!is.null(row.w)) { if (length(row.w) != nrow(df)) stop("non convenient dimension") } if (sum(col.blocks) != ncol(df)) { stop("non convenient data in col.blocks") } df2 <- df[, apply(df, 2, function(u) !all(is.na(u)))] bloc <- rep(1:length(col.blocks), col.blocks) bloc <- as.factor(bloc[apply(df, 2, function(u) !all(is.na(u)))]) col.blocks <- as.vector(table(bloc)) df <- df2 if (is.null(row.w)) row.w <- rep(1, nrow(df))/nrow(df) row.w <- row.w/sum(row.w) if (is.null(names(col.blocks))) { names(col.blocks) <- paste("FV", as.character(1:length(col.blocks)), sep = "") } f1 <- function(x, k) { a <- sum(x) if (is.na(a)) { return(rep(NA, length(x))) cat("missing data found in block", k, "\n") } if (a == 0) return(rep(NA, length(x))) return(x/a) } k2 <- 0 col.w <- rep(1, ncol(df)) for (k in 1:(length(col.blocks))) { k1 <- k2 + 1 k2 <- k2 + col.blocks[k] X <- df[, k1:k2] X <- t(apply(X, 1, f1, k = k)) X.marge <- apply(X, 1, sum, na.rm = TRUE) X.marge <- X.marge * row.w X.marge <- X.marge/sum(X.marge, na.rm = TRUE) X.mean <- apply(X * X.marge, 2, sum) df[, k1:k2] <- X col.w[k1:k2] <- X.mean } attr(df, "col.blocks") <- col.blocks attr(df, "row.w") <- row.w attr(df, "col.freq") <- col.w attr(df, "Labels") <- labels col.num <- factor(rep((1:length(col.blocks)), col.blocks)) attr(df, "col.num") <- col.num return(df) } ldist.ktab <- function(x, type, option = c("scaledBYrange", "scaledBYsd", "noscale"), scann = FALSE, tol = 1e-8) { #******************************************************# # Parameters are checked # #******************************************************# if(!inherits(x, "ktab")) stop("x is not an object of class ktab") if(any(is.na(match(type, c("Q", "O", "N", "D", "F", "B", "C"))))) stop("incorrect type: available values for type are O, Q, N, D, F, B and C") if(length(x$blo)!=length(type)) stop("incorrect length for type") if(!is.numeric(tol)) stop("tol is not a numeric") #*****************************************************# # If scann is TRUE, the functions of distance # #*****************************************************# if(scann == TRUE){ if(any(type == "F")){ cat("Choose your metric for fuzzy variables\n") cat("1 = d1 Manly\n") cat("d1 = Sum|p(i)-q(i)|/2\n") cat("2 = Overlap index Manly\n") cat("d2 = 1-Sum(p(i)q(i))/sqrt(Sum(p(i)^2))/sqrt(Sum(q(i)^2))\n") cat("3 = Rogers 1972 (one locus)\n") cat("d3 = sqrt(0.5*Sum(p(i)-q(i)^2))\n") cat("4 = Edwards 1971 (one locus)\n") cat("d4 = sqrt(1 - (Sum(sqrt(p(i)q(i)))))\n") cat("Selec an integer (1-4): ") methodF <- as.integer(readLines(n = 1)) if (methodF == 4) methodF <- 5 } if(any(type == "B")){ cat("Choose your metric for binary variables\n") cat("1 = JACCARD index (1901) S3 coefficient of GOWER & LEGENDRE\n") cat("s1 = a/(a+b+c) --> d = sqrt(1 - s)\n") cat("2 = SOKAL & MICHENER index (1958) S4 coefficient of GOWER & LEGENDRE \n") cat("s2 = (a+d)/(a+b+c+d) --> d = sqrt(1 - s)\n") cat("3 = SOKAL & SNEATH(1963) S5 coefficient of GOWER & LEGENDRE\n") cat("s3 = a/(a+2(b+c)) --> d = sqrt(1 - s)\n") cat("4 = ROGERS & TANIMOTO (1960) S6 coefficient of GOWER & LEGENDRE\n") cat("s4 = (a+d)/(a+2(b+c)+d) --> d = sqrt(1 - s)\n") cat("5 = CZEKANOWSKI (1913) or SORENSEN (1948) S7 coefficient of GOWER & LEGENDRE\n") cat("s5 = 2*a/(2*a+b+c) --> d = sqrt(1 - s)\n") cat("6 = S9 index of GOWER & LEGENDRE (1986)\n") cat("s6 = (a-(b+c)+d)/(a+b+c+d) --> d = sqrt(1 - s)\n") cat("7 = OCHIAI (1957) S12 coefficient of GOWER & LEGENDRE\n") cat("s7 = a/sqrt((a+b)(a+c)) --> d = sqrt(1 - s)\n") cat("8 = SOKAL & SNEATH (1963) S13 coefficient of GOWER & LEGENDRE\n") cat("s8 = ad/sqrt((a+b)(a+c)(d+b)(d+c)) --> d = sqrt(1 - s)\n") cat("9 = Phi of PEARSON = S14 coefficient of GOWER & LEGENDRE\n") cat("s9 = (ad-bc)/sqrt((a+b)(a+c)(b+d)(d+c)) --> d = sqrt(1 - s)\n") cat("10 = S2 coefficient of GOWER & LEGENDRE\n") cat("s10 = a/(a+b+c+d) --> d = sqrt(1 - s) and unit self-similarity\n") cat("Select an integer (1-10): ") methodB <- as.integer(readLines(n = 1)) } methodO <- 0 if(any(type == "O")){ cat("Choose your metric for ordinal variables\n") cat("1 = ranked variables treated as quantitative variables\n") cat("2 = Podani (1999)'s formula\n") cat("Select an integer (1-2): ") methodO <- as.integer(readLines(n = 1)) } if(any(c(type == "Q", methodO == 1))){ cat("Choose your metric for quantitative variables\n") cat("1 = Euclidean\n") cat("d1 = Sum((x(i)-y(i))^2)/n\n") cat("2 = Manhattan\n") cat("d2= Sum(|x(i)-y(i)|)/n\n") cat("Select an integer (1-2): ") methodQ <- as.integer(readLines(n = 1)) } } else{ methodQ <- 1 methodF <- 2 methodB <- 1 methodO <- 1 } nlig <- nrow(x[[1]]) ntype <- length(unique(type)) if(any(type=="D")) napres <- TRUE else napres <- any(is.na(unlist(x[(1:length(x$blo))]))) d.names <- rownames(x[[1]]) treatment <- function(i) { #*****************************************************# # Ordinal data # #*****************************************************# if(type[i] == "O"){ #*****************************************************# # Data are checked # #*****************************************************# transrank <- function(u){ return(rank(u, na.last = "keep")) } df <- apply(x[[i]], 2, transrank) #*****************************************************# if(methodO == 1){ cmax <- apply(df, 2, max, na.rm = TRUE) cmin <- apply(df, 2, min, na.rm = TRUE) df <- as.data.frame(scale(df, center = cmin, scale = ifelse((cmax - cmin)1) granks <- apply(df, 2, table) else granks <- list(as.vector(apply(df, 2, table))) grankmax <- as.vector(unlist(lapply(granks, function(u) u[length(u)]))) grankmin <- as.vector(unlist(lapply(granks, function(u) u[1]))) if(ncol(df)>1) uranks <- apply(df, 2, function(u) sort(unique(u))) else uranks <- list(as.vector(apply(df, 2, function(u) sort(unique(u))))) mat <- matrix(0, nlig, nlig) index <- cbind(col(mat)[col(mat) < row(mat)], row(mat)[col(mat) < row(mat)]) fun1.OP <- function(k){ r <- df fun2.OP <- function(u){ if(any(is.na(c(r[u[1], k], r[u[2], k])))){ return(NA)} else{ if(r[u[1], k] == r[u[2], k]){ return(0)} else{ val <- (abs(r[u[1], k] - r[u[2], k]) - (granks[[k]][uranks[[k]] == r[u[1], k]] - 1)/2 - (granks[[k]][uranks[[k]] == r[u[2], k]]-1)/2) / ((cmax[k] - cmin[k]) - (grankmax[k] - 1)/2 - (grankmin[k] - 1)/2) return(ifelse(sqrt(val) < tol, 0, sqrt(val))) } } } d <- unlist(apply(index, 1, fun2.OP)) attr(d, "Size") <- nlig attr(d, "Labels") <- d.names attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "method") <- "quantitative" attr(d, "call") <- match.call() class(d) <- "dist" return(d) } lis <- as.list(1:ncol(df)) thedis <- lapply(lis, fun1.OP) names(thedis) <- names(x[[i]]) } } #*****************************************************# # Quantitative data # #*****************************************************# if(type[i] == "Q"){ #*****************************************************# # Data are checked # #*****************************************************# df <- x[[i]] df2 <- cbind.data.frame(df[, apply(df, 2, function(u) !all(is.na(u)))]) if(ncol(df2) == 0) stop("one of the quantitative data frames is full of NA") if(ncol(df) != ncol(df2)){ warning("a column full of NA in the quantitative data set ", i) df <- as.data.frame(df2) } if(!all(unlist(lapply(df, is.numeric)))) stop("Incorrect definition of the quantitative variables") #*****************************************************# if(option[1] == "scaledBYsd") df <- as.data.frame(scale(df)) if(option[1] == "scaledBYrange") { cmax <- apply(df, 2, max, na.rm = TRUE) cmin <- apply(df, 2, min, na.rm = TRUE) df <- as.data.frame(scale(df, center = cmin, scale = ifelse((cmax - cmin) d = sqrt(1 - s)\n") cat("2 = SOKAL & MICHENER index (1958) S4 coefficient of GOWER & LEGENDRE \n") cat("s2 = (a+d)/(a+b+c+d) --> d = sqrt(1 - s)\n") cat("3 = SOKAL & SNEATH(1963) S5 coefficient of GOWER & LEGENDRE\n") cat("s3 = a/(a+2(b+c)) --> d = sqrt(1 - s)\n") cat("4 = ROGERS & TANIMOTO (1960) S6 coefficient of GOWER & LEGENDRE\n") cat("s4 = (a+d)/(a+2(b+c)+d) --> d = sqrt(1 - s)\n") cat("5 = CZEKANOWSKI (1913) or SORENSEN (1948) S7 coefficient of GOWER & LEGENDRE\n") cat("s5 = 2*a/(2*a+b+c) --> d = sqrt(1 - s)\n") cat("6 = S9 index of GOWER & LEGENDRE (1986)\n") cat("s6 = (a-(b+c)+d)/(a+b+c+d) --> d = sqrt(1 - s)\n") cat("7 = OCHIAI (1957) S12 coefficient of GOWER & LEGENDRE\n") cat("s7 = a/sqrt((a+b)(a+c)) --> d = sqrt(1 - s)\n") cat("8 = SOKAL & SNEATH (1963) S13 coefficient of GOWER & LEGENDRE\n") cat("s8 = ad/sqrt((a+b)(a+c)(d+b)(d+c)) --> d = sqrt(1 - s)\n") cat("9 = Phi of PEARSON = S14 coefficient of GOWER & LEGENDRE\n") cat("s9 = (ad-bc)/sqrt((a+b)(a+c)(b+d)(d+c)) --> d = sqrt(1 - s)\n") cat("10 = S2 coefficient of GOWER & LEGENDRE\n") cat("s10 = a/(a+b+c+d) --> d = sqrt(1 - s) and unit self-similarity\n") cat("Select an integer (1-10): ") methodB <- as.integer(readLines(n = 1)) } methodO <- 0 if(any(type == "O")){ cat("Choose your metric for ordinal variables\n") cat("1 = ranked variables treated as quantitative variables\n") cat("2 = Podani (1999)'s formula\n") cat("Select an integer (1-2): ") methodO <- as.integer(readLines(n = 1)) } if(any(c(type == "Q", methodO == 1))){ cat("Choose your metric for quantitative variables\n") cat("1 = Euclidean\n") cat("d1 = Sum((x(i)-y(i))^2)/n\n") cat("2 = Manhattan\n") cat("d2= Sum(|x(i)-y(i)|)/n\n") cat("Select an integer (1-2): ") methodQ <- as.integer(readLines(n = 1)) } } else{ methodQ <- 1 methodF <- 2 methodB <- 1 methodO <- 1 } nlig <- nrow(x[[1]]) ntype <- length(unique(type)) if(any(type=="D")) napres <- TRUE else napres <- any(is.na(unlist(x[(1:length(x$blo))]))) d.names <- rownames(x[[1]]) ldist.ktab2 <- function(x, type, option = c("scaledBYrange", "scaledBYsd", "noscale"), tol = 1e-8) { treatment <- function(i) { #*****************************************************# # Ordinal data # #*****************************************************# if(type[i] == "O"){ #*****************************************************# # Data are checked # #*****************************************************# transrank <- function(u){ return(rank(u, na.last = "keep")) } df <- apply(x[[i]], 2, transrank) #*****************************************************# if(methodO == 1){ cmax <- apply(df, 2, max, na.rm = TRUE) cmin <- apply(df, 2, min, na.rm = TRUE) df <- as.data.frame(scale(df, center = cmin, scale = ifelse((cmax - cmin)1) granks <- apply(df, 2, table) else granks <- list(as.vector(apply(df, 2, table))) grankmax <- as.vector(unlist(lapply(granks, function(u) u[length(u)]))) grankmin <- as.vector(unlist(lapply(granks, function(u) u[1]))) if(ncol(df)>1) uranks <- apply(df, 2, function(u) sort(unique(u))) else uranks <- list(as.vector(apply(df, 2, function(u) sort(unique(u))))) mat <- matrix(0, nlig, nlig) index <- cbind(col(mat)[col(mat) < row(mat)], row(mat)[col(mat) < row(mat)]) fun1.OP <- function(k){ r <- df fun2.OP <- function(u){ if(any(is.na(c(r[u[1], k], r[u[2], k])))){ return(NA)} else{ if(r[u[1], k] == r[u[2], k]){ return(0)} else{ val <- (abs(r[u[1], k] - r[u[2], k]) - (granks[[k]][uranks[[k]]==r[u[1], k]] - 1)/2 - (granks[[k]][uranks[[k]]==r[u[2], k]]-1)/2) / ((cmax[k]-cmin[k]) - (grankmax[k] - 1)/2 - (grankmin[k] - 1)/2) return(ifelse(sqrt(val) < tol, 0, sqrt(val))) } } } d <- unlist(apply(index, 1, fun2.OP)) attr(d, "Size") <- nlig attr(d, "Labels") <- d.names attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "method") <- "quantitative" attr(d, "call") <- match.call() class(d) <- "dist" return(d) } lis <- as.list(1:ncol(df)) thedis <- lapply(lis, fun1.OP) names(thedis) <- names(x[[i]]) } } #*****************************************************# # Quantitative data # #*****************************************************# if(type[i] == "Q"){ #*****************************************************# # Data are checked # #*****************************************************# df <- x[[i]] df2 <- cbind.data.frame(df[, apply(df, 2, function(u) !all(is.na(u)))]) if(ncol(df2) == 0) stop("one of the quantitative data frames is full of NA") if(ncol(df) != ncol(df2)){ warning("a column full of NA in the quantitative data set ", i) df <- as.data.frame(df2) } if(!all(unlist(lapply(df, is.numeric)))) stop("Incorrect definition of the quantitative variables") #*****************************************************# if(option[1] == "scaledBYsd") df <- as.data.frame(scale(df)) if(option[1] == "scaledBYrange") { cmax <- apply(df, 2, max, na.rm = TRUE) cmin <- apply(df, 2, min, na.rm = TRUE) df <- as.data.frame(scale(df, center = cmin, scale = ifelse((cmax - cmin) 1){ for (k in 2:length(interm)){ mat <- interm[[k]] + mat } } ntvar <- mat # calculation of the sum of distances funfin2.ONA <- function(u){ u[is.na(u)] <- 0 return(u) } res <- lapply(listdis, funfin2.ONA) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) } } else{ ##################################################### # Podani's distance # ##################################################### df2 <- cbind.data.frame(df[, apply(df, 2, function(u) !all(is.na(u)))]) if(ncol(df2) == 0) stop("one of the quantitative data frames is full of NA") if(ncol(df) != ncol(df2)){ warning("a column full of NA in the quantitative or ordinal data set ", i) df <- as.data.frame(df2) } if(!all(unlist(lapply(df, is.numeric)))) stop("Incorrect definition of the quantitative variables") #*****************************************************# cmax <- apply(df, 2, max, na.rm = TRUE) cmin <- apply(df, 2, min, na.rm = TRUE) if(ncol(df)>1) granks <- apply(df, 2, table) else granks <- list(as.vector(apply(df, 2, table))) grankmax <- as.vector(unlist(lapply(granks, function(u) u[length(u)]))) grankmin <- as.vector(unlist(lapply(granks, function(u) u[1]))) if(ncol(df)>1) uranks <- apply(df, 2, function(u) sort(unique(u))) else uranks <- list(as.vector(apply(df, 2, function(u) sort(unique(u))))) mat <- matrix(0, nlig, nlig) index <- cbind(col(mat)[col(mat) < row(mat)], row(mat)[col(mat) < row(mat)]) fun1.OP <- function(k){ r <- df fun2.OP <- function(u){ if(any(is.na(c(r[u[1], k], r[u[2], k])))){ return(NA)} else{ if(r[u[1], k] == r[u[2], k]){ return(0)} else{ val <- (abs(r[u[1], k] - r[u[2], k]) - (granks[[k]][uranks[[k]]==r[u[1], k]] - 1)/2 - (granks[[k]][uranks[[k]]==r[u[2], k]]-1)/2) / ((cmax[k]-cmin[k]) - (grankmax[k] - 1)/2 - (grankmin[k] - 1)/2) return(val) } } } d <- unlist(apply(index, 1, fun2.OP)) attr(d, "Size") <- nlig attr(d, "Labels") <- d.names attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "method") <- "quantitative" attr(d, "call") <- match.call() class(d) <- "dist" return(d) } lis <- as.list(1:ncol(df)) listdis <- lapply(lis, fun1.OP) if(napres){ listmat <- lapply(listdis, as.matrix) funfin1.OP <- function(u){ u[!is.na(u)] <- 1 u[is.na(u)] <- 0 return(u) } interm <- lapply(listmat, funfin1.OP) mat <- interm[[1]] if(length(interm) > 1){ for (k in 2:length(interm)){ mat <- interm[[k]] + mat } } ntvar <- mat } else nbvar <- ncol(x[[i]]) # calculation of the sum of distances funfin2.OP <- function(u){ u[is.na(u)] <- 0 return(u) } res <- lapply(listdis, funfin2.OP) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) } } #*****************************************************# # Quantitative data # #*****************************************************# if(type[i] == "Q"){ #*****************************************************# # Data are checked # #*****************************************************# df <- x[[i]] df2 <- cbind.data.frame(df[, apply(df, 2, function(u) !all(is.na(u)))]) if(ncol(df2) == 0) stop("one of the quantitative data frames is full of NA") if(ncol(df) != ncol(df2)){ warning("a column full of NA in the quantitative or ordinal data set ", i) df <- as.data.frame(df2) } if(!all(unlist(lapply(df, is.numeric)))) stop("Incorrect definition of the quantitative variables") #*****************************************************# if(option[1] == "scaledBYsd") df <- as.data.frame(scale(df)) if(option[1] == "scaledBYrange") { cmax <- apply(df, 2, max, na.rm = TRUE) cmin <- apply(df, 2, min, na.rm = TRUE) df <- as.data.frame(scale(df, center = cmin, scale = ifelse((cmax - cmin) 1){ for (k in 2:length(interm)){ mat <- interm[[k]] + mat } } ntvar <- mat # calculation of the sum of distances funfin2.QNA <- function(u){ u[is.na(u)] <- 0 return(u) } res <- lapply(listdis, funfin2.QNA) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) } } #*****************************************************# # Nominal data # #*****************************************************# if(type[i] == "N"){ #*****************************************************# # Data are checked # #*****************************************************# df <- x[[i]] df2 <- cbind.data.frame(df[, apply(df, 2, function(u) !all(is.na(u)))]) if(ncol(df2) == 0) stop("one of the nominal data frames is full of NA") if(ncol(df) != ncol(df2)){ warning("a column full of NA in the nominal data sets") df <- as.data.frame(df2) } verif <- function(u){ if(!is.factor(u)){ if(!is.character(u)) stop("Incorrect definition of the nominal variables") } } lapply(df, verif) #*****************************************************# if(!any(is.na(df))){ FUN <- function(u){ m <- model.matrix(~-1 + as.factor(u)) return(dist(m) / sqrt(2)) } lis <- as.list(df) res <- lapply(lis, FUN) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) nbvar <- ncol(df) if(napres){ ntvar <- matrix(ncol(df), nrow(df), nrow(df)) } } else{ mat <- matrix(0, nlig, nlig) index <- cbind(col(mat)[col(mat) < row(mat)], row(mat)[col(mat) < row(mat)]) fun1.NNA <- function(vect){ fun2.NNA <- function(u) { if(any(is.na(c(vect[u[1]], vect[u[2]])))) return(NA) else{ if(vect[u[1]] == vect[u[2]]){ return(0) } else return(1) } } d <- unlist(apply(index, 1, fun2.NNA)) attr(d, "Size") <- nlig attr(d, "Labels") <- d.names attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "method") <- "nominal" attr(d, "call") <- match.call() class(d) <- "dist" return(d) } if(ncol(df) == 1) lis <- list(df[, 1]) else lis <- as.list(df) listdis <- lapply(lis, fun1.NNA) listmat <- lapply(listdis, as.matrix) funfin1.NNA <- function(u){ u[!is.na(u)] <- 1 u[is.na(u)] <- 0 return(u) } interm <- lapply(listmat, funfin1.NNA) mat <- interm[[1]] if(length(interm) > 1){ for (k in 2:length(interm)){ mat <- interm[[k]] + mat } } ntvar <- mat # calculation of the sum of distances funfin2.NNA <- function(u){ u[is.na(u)] <- 0 return(u) } res <- lapply(listdis, funfin2.NNA) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) } } #*****************************************************# # Dichotomous data # #*****************************************************# if(type[i] == "D"){ #*****************************************************# # Data are checked # #*****************************************************# df <- x[[i]] df2 <- cbind.data.frame(df[, apply(df, 2, function(u) !all(is.na(u)))]) if(ncol(df2) == 0) stop("one of the nominal data frames is full of NA") if(ncol(df) != ncol(df2)){ warning("a column full of NA in the dichotomous data sets") df <- as.data.frame(df2) } verif <- function(u){ if(any(!u[!is.na(u)] %in% c(0, 1))) stop("Dichotomous variables should have only 0, and 1") } lapply(df, verif) #*****************************************************# mat <- matrix(0, nlig, nlig) index <- cbind(col(mat)[col(mat) < row(mat)], row(mat)[col(mat) < row(mat)]) fun1.D <- function(vect){ fun2.D <- function(u) { if(any(is.na(c(vect[u[1]], vect[u[2]])))) return(NA) else{ if(vect[u[1]] == vect[u[2]]){ if(vect[u[1]] == 1) return(0) else return(NA) } else return(1) } } d <- unlist(apply(index, 1, fun2.D)) attr(d, "Size") <- nlig attr(d, "Labels") <- d.names attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "method") <- "nominal" attr(d, "call") <- match.call() class(d) <- "dist" return(d) } if(ncol(df) == 1) lis <- list(df[, 1]) else lis <- as.list(df) listdis <- lapply(lis, fun1.D) listmat <- lapply(listdis, as.matrix) funfin1.D <- function(u){ u[!is.na(u)] <- 1 u[is.na(u)] <- 0 return(u) } interm <- lapply(listmat, funfin1.D) mat <- interm[[1]] if(length(interm) > 1){ for (k in 2:length(interm)){ mat <- interm[[k]] + mat } } ntvar <- mat # calculation of the sum of distances funfin2.D <- function(u){ u[is.na(u)] <- 0 return(u) } res <- lapply(listdis, funfin2.D) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) } #*****************************************************# # Fuzzy data # #*****************************************************# if(type[i] == "F"){ #*****************************************************# # Data are checked # #*****************************************************# df <- x[[i]] df2 <- df[, apply(df, 2, function(u) !all(is.na(u)))] if(ncol(df2) == 0) stop("one of the fuzzy data frames is full of NA") if(ncol(df) != ncol(df2)){ stop("a column full of NA in the fuzzy data sets") } if(!all(unlist(lapply(df, is.numeric)))) stop("Incorrect definition of the fuzzy variables") if(is.null(attributes(df)$col.blocks)) stop("The fuzzy data set must be prepared with the function prep.fuzzy") #*****************************************************# blocs <- attributes(x[[i]])$col.blocks fac <- as.factor(rep(1:length(blocs), blocs)) lis <- split(as.data.frame(t(x[[i]])), fac) lis <- lapply(lis, t) lis <- lapply(lis, cbind.data.frame) if(!any(is.na(x[[i]]))){ if(methodF!=3 & methodF!=4) res <- lapply(lis, function(u) dist.prop(u, method = methodF)) else res <- lapply(lis, function(u) dist.prop(u, method = methodF)^2) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) nbvar <- length(blocs) if(napres){ ntvar <- matrix(length(blocs), nrow(df), nrow(df)) } } else{ fun1.F <- function(mtflo){ res <- matrix(0, nlig, nlig) positions <- apply(mtflo, 1, function(u) any(is.na(u))) dfsansna <- mtflo[!positions, ] if(methodF!=3 & methodF!=4) resdis <- as.matrix(dist.prop(dfsansna, method = methodF)) else resdis <- as.matrix(dist.prop(dfsansna, method = methodF)^2) res[!positions, !positions] <- as.vector(resdis) res[positions, ] <- NA res[, positions] <- NA return(as.dist(res)) } listdis <- lapply(lis, fun1.F) listmat <- lapply(listdis, as.matrix) funfin1.F <- function(u){ u[!is.na(u)] <- 1 u[is.na(u)] <- 0 return(u) } interm <- lapply(listmat, funfin1.F) mat <- interm[[1]] if(length(interm) > 1){ for (k in 2:length(interm)){ mat <- interm[[k]] + mat } } ntvar <- mat # calculation of the sum of distances funfin2.F <- function(u){ u[is.na(u)] <- 0 return(u) } res <- lapply(listdis, funfin2.F) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) } } #*****************************************************# # Binary data # #*****************************************************# if(type[i] == "B"){ #*****************************************************# # Data are checked # #*****************************************************# if(!all(unlist(lapply(x[[i]], is.numeric)))) stop("Incorrect definition of the binary variables") if(is.null(attributes(x[[i]])$col.blocks)) stop("The binary data set must be prepared with the function prep.binary") if(any(is.na(match(as.vector(as.matrix(x[[i]])), c(0, 1, NA))))) stop("The binary data set must be prepared with the function prep.binary") #*****************************************************# blocs <- attributes(x[[i]])$col.blocks fac <- as.factor(rep(1:length(blocs), blocs)) lis <- split(as.data.frame(t(x[[i]])), fac) lis <- lapply(lis, t) lis <- lapply(lis, cbind.data.frame) if(!any(is.na(x[[i]]))){ res <- lapply(lis, function(u) dist.binary(u, method = methodB)^2) if(any(is.na(unlist(res)))) stop("Rows of zero for binary variables") mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) nbvar <- length(blocs) if(napres){ ntvar <- matrix(length(blocs), nlig, nlig) } } else{ fun1.BNA <- function(mtbin){ res <- matrix(0, nlig, nlig) positions <- apply(mtbin, 1, function(u) any(is.na(u))) dfsansna <- mtbin[!positions, ] resdis <- as.matrix(dist.binary(dfsansna, method = methodB)^2) res[!positions, !positions] <- as.vector(resdis) res[positions, ] <- NA res[, positions] <- NA return(as.dist(res)) } listdis <- lapply(lis, fun1.BNA) listmat <- lapply(listdis, as.matrix) funfin1.BNA <- function(u){ u[!is.na(u)] <- 1 u[is.na(u)] <- 0 return(u) } interm <- lapply(listmat, funfin1.BNA) mat <- interm[[1]] if(length(interm) > 1){ for (k in 2:length(interm)){ mat <- interm[[k]] + mat } } ntvar <- mat # calculation of the sum of distances funfin2.BNA <- function(u){ u[is.na(u)] <- 0 return(u) } res <- lapply(listdis, funfin2.BNA) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) } } #*****************************************************# # Circular data # #*****************************************************# if(type[i] == "C"){ #*****************************************************# # Data are checked # #*****************************************************# df <- x[[i]] df2 <- cbind.data.frame(df[, apply(df, 2, function(u) !all(is.na(u)))]) if(ncol(df2) == 0) stop("the circular data frames ", i, " is full of NA") if(ncol(df) != ncol(df2)){ warning("a column full of NA in the circular data sets") df <- as.data.frame(df2) } if(is.null(attributes(df)$max)) stop("The circular data sets must be prepared with the function prep.circular") verif <- function(u){ if(any(u[!is.na(u)] < 0)) stop("negative values in circular variables") } lapply(df, verif) #*****************************************************# d.names <- row.names(x[[i]]) nlig <- nrow(x[[i]]) mat <- matrix(0, nlig, nlig) index <- cbind(col(mat)[col(mat) < row(mat)], row(mat)[col(mat) < row(mat)]) odd <- function(u){ ifelse(abs(u/2 - floor(u/2)) < 1e-08, FALSE, TRUE) } if(!any(is.na(df))){ fun1.C <- function(nucol){ vect <- x[[i]][, nucol] maxi <- attributes(df)$max[nucol] vect <- vect / maxi fun2.C <- function(u) { if(odd(maxi)) return((2 * maxi /(maxi - 1)) * min(c(abs(vect[u[1]] - vect[u[2]]), (1 - abs(vect[u[1]] - vect[u[2]]))), na.rm = TRUE)) else return(2 * min(c(abs(vect[u[1]] - vect[u[2]]), (1 - abs(vect[u[1]] - vect[u[2]]))), na.rm = TRUE)) } d <- unlist(apply(index, 1, fun2.C)) attr(d, "Size") <- nlig attr(d, "Labels") <- d.names attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "method") <- "circular" attr(d, "call") <- match.call() class(d) <- "dist" return(d) } lis <- as.list(1:ncol(df)) res <- lapply(lis, fun1.C) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) nbvar <- ncol(x[[i]]) if(napres){ ntvar <- matrix(ncol(x[[i]]), nrow(df), nrow(df)) } } else{ fun1.CNA <- function(nucol){ vect <- x[[i]][, nucol] maxi <- attributes(df)$max[nucol] vect <- vect / maxi fun2.CNA <- function(u){ if(any(is.na(c(vect[u[1]], vect[u[2]])))) return(NA) else{ if(odd(maxi)) return((2 * maxi /(maxi - 1)) * min(c(abs(vect[u[1]] - vect[u[2]]), (1 - abs(vect[u[1]] - vect[u[2]]))), na.rm = TRUE)) else return(2 * min(c(abs(vect[u[1]] - vect[u[2]]), (1 - abs(vect[u[1]] - vect[u[2]]))), na.rm = TRUE)) } } d <- unlist(apply(index, 1, fun2.CNA)) attr(d, "Size") <- nlig attr(d, "Labels") <- d.names attr(d, "Diag") <- FALSE attr(d, "Upper") <- FALSE attr(d, "method") <- "circular" attr(d, "call") <- match.call() class(d) <- "dist" return(d) } lis <- as.list(1:ncol(df)) listdis <- lapply(lis, fun1.CNA) listmat <- lapply(listdis, as.matrix) funfin1.CNA <- function(u){ u[!is.na(u)] <- 1 u[is.na(u)] <- 0 return(u) } interm <- lapply(listmat, funfin1.CNA) mat <- interm[[1]] if(length(interm) > 1){ for (k in 2:length(interm)){ mat <- interm[[k]] + mat } } ntvar <- mat # calculation of the sum of distances funfin2.CNA <- function(u){ u[is.na(u)] <- 0 return(u) } res <- lapply(listdis, funfin2.CNA) mat <- res[[1]] if(length(res) > 1){ for (k in 2:length(res)){ mat <- res[[k]] + mat } } thedis <- mat thedis[thedis < tol] <- 0 thedis <- sqrt(thedis) } } if(!napres) return(list(nbvar, thedis)) else return(list(ntvar, thedis)) } # Last calculations interm <- as.list(1:length(x$blo)) names(interm) <- paste("iteration", 1:length(x$blo), sep="") res <- lapply(interm, treatment) if(!napres) nbvar <- sum(unlist(lapply(res, function(u) u[[1]]))) else{ listntvar <- lapply(res, function(u) u[[1]]) mat <- listntvar[[1]] if(length(listntvar) > 1){ for (k in 2:length(listntvar)){ mat <- listntvar[[k]] + mat } } ntvar <- mat + diag(rep(1, nlig)) } dis <- lapply(res, function(u) u[[2]]) mat <- dis[[1]]^2 if(length(dis) > 1){ for (k in 2:length(dis)){ mat <- dis[[k]]^2 + mat } } if(!napres){ disglobal <- sqrt(mat / nbvar) } else{ disglobal <- as.dist(sqrt(as.matrix(mat) / ntvar)) } attributes(disglobal)$Labels <- d.names return(disglobal) } ldis <- ldist.ktab2(x, type, option, tol = 1e-8) disglob <- dist.ktab2(x, type, option, tol = 1e-8) tabvec <- cbind.data.frame(lapply(ldis, as.vector)) vecglo <- as.vector(disglob) if(squared){ paircov <- cov(tabvec^2, use = "pairwise.complete.obs") paircor <- cor(tabvec^2, use = "pairwise.complete.obs") glocor <- cor(tabvec^2, vecglo^2, use = "pairwise.complete.obs") colnames(glocor) <- "global distance" } else{ paircov <- cov(tabvec, use = "pairwise.complete.obs") paircor <- cor(tabvec, use = "pairwise.complete.obs") glocor <- cor(tabvec, vecglo, use = "pairwise.complete.obs") colnames(glocor) <- "global distance" } return(list(paircov = paircov, paircor = paircor, glocor = glocor)) } ade4/R/reconst.R0000644000176200001440000000276112576021756013111 0ustar liggesusers"reconst" <- function (dudi, ...) { UseMethod("reconst") } "reconst.pca" <- function (dudi, nf = 1, ...) { if (!inherits(dudi, "dudi")) stop("Object of class 'dudi' expected") if (nf > dudi$nf) stop(paste(nf, "factors need >", dudi$nf, "factors available\n")) if (!inherits(dudi, "pca")) stop("Object of class 'dudi' expected") cent <- dudi$cent norm <- dudi$norm n <- nrow(dudi$tab) p <- ncol(dudi$tab) res <- matrix(0, n, p) for (i in 1:nf) { xli <- dudi$li[, i] yc1 <- dudi$c1[, i] res <- res + matrix(xli, n, 1) %*% matrix(yc1, 1, p) } res <- t(apply(res, 1, function(x) x * norm)) res <- t(apply(res, 1, function(x) x + cent)) res <- data.frame(res) names(res) <- names(dudi$tab) row.names(res) <- row.names(dudi$tab) return(res) } "reconst.coa" <- function (dudi, nf = 1, ...) { if (!inherits(dudi, "dudi")) stop("Object of class 'dudi' expected") if (nf > dudi$nf) stop(paste(nf, "factors need >", dudi$nf, "factors available\n")) if (!inherits(dudi, "coa")) stop("Object of class 'dudi' expected") pl <- dudi$lw pc <- dudi$cw n <- dudi$N res0 <- outer(pl,pc)*n res <- data.frame(res0) names(res) <- names(dudi$tab) row.names(res) <- row.names(dudi$tab) if (nf ==0) return(res) for (i in 1:nf) { xli <- dudi$li[, i] yc1 <- dudi$c1[, i] res <- res + outer(xli,yc1)*res0 } return(res) } ade4/R/PI2newick.R0000644000176200001440000000426312576021756013226 0ustar liggesusers"PI2newick" <- function(x){ # cette fonction permet de convertir les fichiers d'entrée du logiciel PI # d'Abouheif au format newick (on récupère également les valeurs associées # aux feuilles) # x est une matrice qui vient de la lecture des fichiers .txt: x <- read.table("PI1.txt", h = FALSE) # il a autant de lignes qu'il y a de feuilles-1; dans le cas d'une phylogénie résolue, c'est le nombre de noeuds # il y a 6 colonnes: Contrast value/ Left tip value/ Right tip value/ Left node name/ Right node name/ Unresolved nodes group # on prépare le terrain nodes.group <- as.factor(x[, 6]) x <- x[, -c(1,6)] x[,c(3,4)] <-x[,c(3,4)] + 1 x[x == -99] <- 0 nleaves <- nrow(x) + 1 nnodes <- sum(nodes.group==0)+length(levels(nodes.group))-1 # on récuupère les valeurs associées aux feuilles values <- as.vector(t(as.matrix(x[,c(1,2)]))) values <- values[values!=0] for (i in 1:nleaves) x[x==values[i]] <- i #print(x) # on construit la chaine de charactère au format newick names(x) <- c("Ext", "Ext", "I", "I") tre <- NULL if (nodes.group[1]==0){ u <- x[1,] v <- names(x)[u!=0] w <- u[u!=0] u <- paste(v, w, sep="") tre <- paste("(", u[1], ",", u[2], ")Root;", sep="") } else stop("the Root must be resolved: will be programmed later") # le cas ou il y a plusieurs feuilles et un noeud reste à faire j <- 2 for (i in 2:nnodes){ if (nodes.group[j]==0){ u <- x[j,] v <- names(x)[u!=0] w <- u[u!=0] u <- paste(v, w, sep="") u <- paste("(", u[1], ",", u[2], ")", paste("I", i,sep=""), sep="") tre <- gsub(paste("I", j,sep=""), u, tre) j <- j + 1 } else{ u <- nodes.group[j] v <- sum(nodes.group==u) w <- x[j:(j+v-1), 1:2] w <- as.vector(as.matrix(w)) w <- w[w!=0] w <- sort(w) y <- paste(rep("Ext", v+1), w, sep="") z <- y[1] for (i in 2:(v+1)) z <- paste(z, y[i], sep=",") z <- paste("(", z, ")", paste("I", j,sep=""), sep="") tre <- gsub(paste("I", j,sep=""), z, tre) j <- j + v } } return(list(tre = tre, trait = values)) } ade4/R/rtest.R0000644000176200001440000000007413050632301012546 0ustar liggesusers"rtest" <- function (xtest, ...) { UseMethod("rtest") } ade4/R/multispati.rtest.R0000644000176200001440000000217713050632301014746 0ustar liggesusers"multispati.rtest" <- function (dudi, listw, nrepet = 99, ...) { if(!inherits(listw,"listw")) stop ("object of class 'listw' expected") if(listw$style!="W") stop ("object of class 'listw' with style 'W' expected") if (!(identical(all.equal(dudi$lw,rep(1/nrow(dudi$tab), nrow(dudi$tab))),TRUE))) { stop ("Not implemented for non-uniform weights") } n <- length(listw$weights) fun.lag <- function (x) spdep::lag.listw(listw,x,TRUE) fun <- function (permuter = TRUE) { if (permuter) { permutation <- sample(n) y <- dudi$tab[permutation,] yw <- dudi$lw[permutation] } else { y <-dudi$tab yw <- dudi$lw } y <- as.matrix(y) ymoy <- apply(y, 2, fun.lag) ymoy <- ymoy*yw y <- y*ymoy indexmoran <- sum(apply(y,2,sum)*dudi$cw) return(indexmoran) } inertot <- sum(dudi$eig) obs <- fun (permuter = FALSE)/inertot if (nrepet == 0) return(obs) perm <- unlist(lapply(1:nrepet, fun))/inertot w <- as.randtest(obs = obs, sim = perm, call = match.call(), ...) return(w) } ade4/R/sco.boxplot.R0000644000176200001440000000542112576021756013702 0ustar liggesusers"sco.boxplot" <- function (score, df, labels = names(df), clabel = 1, xlim = NULL, grid = TRUE, cgrid = 0.75, include.origin = TRUE, origin = 0, sub = NULL, csub = 1) { if (!is.vector(score)) stop("vector expected for score") if (!is.numeric(score)) stop("numeric expected for score") if (!is.data.frame(df)) stop("data.frame expected for df") if (!all(unlist(lapply(df, is.factor)))) stop("All variables must be factors") n <- length(score) if ((nrow(df) != n)) stop("Non convenient match") n <- length(score) nvar <- ncol(df) nlev <- unlist(lapply(df, nlevels)) opar <- par(mar = par("mar")) on.exit(par(opar)) par(mar = c(0.1, 0.1, 0.1, 0.1)) ymin <- scoreutil.base(y = score, xlim = xlim, grid = grid, cgrid = cgrid, include.origin = include.origin, origin = origin, sub = sub, csub = csub) n1 <- sum(nlev) ymax <- par("usr")[4] ylabel <- strheight("A", cex = par("cex") * max(1, clabel)) * 1.4 yunit <- (ymax - ymin - nvar * ylabel)/n1 y1 <- ymin + ylabel xmin <- par("usr")[1] xmax <- par("usr")[2] xaxp <- par("xaxp") nline <- xaxp[3] + 1 v0 <- seq(xaxp[1], xaxp[2], le = nline) for (i in 1:nvar) { y2 <- y1 + nlev[i] * yunit rect(xmin, y1, xmax, y2) if (clabel > 0) { text((xmin + xmax)/2, y1 - ylabel/2, labels[i], cex = par("cex") * clabel) } param <- tapply(score, df[, i], function(x) quantile(x, seq(0, 1, by = 0.25))) moy <- tapply(score, df[, i], mean) nbox <- length(param) namebox <- names(param) pp <- ppoints(n = (nbox + 2), a = 1) pp <- pp[2:(nbox + 1)] ypp <- y1 + (y2 - y1) * pp hbar <- (y2 - y1)/nbox/4 if (grid) { segments(v0, rep(y1, nline), v0, rep(y2, nline), col = gray(0.5), lty = 1) } for (j in 1:nbox) { stat <- unlist(param[j]) amin <- stat[1] aq1 <- stat[2] amed <- stat[3] aq2 <- stat[4] amax <- stat[5] rect(aq1, ypp[j] - hbar, aq2, ypp[j] + hbar, col = "white") segments(amed, ypp[j] - hbar, amed, ypp[j] + hbar, lwd = 2) segments(amin, ypp[j], aq1, ypp[j]) segments(amax, ypp[j], aq2, ypp[j]) segments(amin, ypp[j] - hbar, amin, ypp[j] + hbar) segments(amax, ypp[j] - hbar, amax, ypp[j] + hbar) points(moy[j], ypp[j], pch = 20) if (clabel > 0) { text(amax, ypp[j], namebox[j], pos = 4, cex = par("cex") * clabel * 0.8, offset = 0.2) } } y1 <- y2 + ylabel } invisible() } ade4/R/multispati.randtest.R0000644000176200001440000000224213050632301015422 0ustar liggesusers"multispati.randtest" <- function (dudi, listw, nrepet = 999, ...) { if(!inherits(dudi,"dudi")) stop ("object of class 'dudi' expected") if(!inherits(listw,"listw")) stop ("object of class 'listw' expected") if(listw$style!="W") stop ("object of class 'listw' with style 'W' expected") "testmultispati"<- function(nrepet, nr, nc, tab, mat, lw, cw) { .C("testmultispati", as.integer(nrepet), as.integer(nr), as.integer(nc), as.double(as.matrix(tab)), as.double(mat), as.double(lw), as.double(cw), inersim=double(nrepet+1), PACKAGE="ade4")$inersim } tab<- dudi$tab nr<-nrow(tab) nc<-ncol(tab) mat<-spdep::listw2mat(listw) lw<- dudi$lw cw<- dudi$cw if (!(identical(all.equal(lw,rep(1/nrow(tab), nrow(tab))),TRUE))) { stop ("Not implemented for non-uniform weights") } inersim<- testmultispati(nrepet, nr, nc, tab, mat, lw, cw) inertot<- sum(dudi$eig) inersim<- inersim/inertot obs <- inersim[1] w <- as.randtest(sim = inersim[-1], obs = obs, call = match.call(), ...) return(w) } ade4/R/sepan.R0000644000176200001440000001275612576021756012547 0ustar liggesusers"sepan" <- function (X, nf = 2) { if (!inherits(X, "ktab")) stop("object 'ktab' expected") complete.dudi <- function(dudi, nf1, nf2) { pcolzero <- nf2 - nf1 + 1 w <- data.frame(matrix(0, nrow(dudi$li), pcolzero)) names(w) <- paste("Axis", (nf1:nf2), sep = "") dudi$li <- cbind.data.frame(dudi$li, w) w <- data.frame(matrix(0, nrow(dudi$li), pcolzero)) names(w) <- paste("RS", (nf1:nf2), sep = "") dudi$l1 <- cbind.data.frame(dudi$l1, w) w <- data.frame(matrix(0, nrow(dudi$co), pcolzero)) names(w) <- paste("Comp", (nf1:nf2), sep = "") dudi$co <- cbind.data.frame(dudi$co, w) w <- data.frame(matrix(0, nrow(dudi$co), pcolzero)) names(w) <- paste("CS", (nf1:nf2), sep = "") dudi$c1 <- cbind.data.frame(dudi$c1, w) return(dudi) } lw <- X$lw cw <- X$cw blo <- X$blo ntab <- length(blo) tab <- as.data.frame(X[[1]]) j1 <- 1 j2 <- as.numeric(blo[1]) auxi <- as.dudi(tab, col.w = cw[j1:j2], row.w = lw, nf = nf, scannf = FALSE, call = match.call(), type = "sepan") if (auxi$nf < nf) auxi <- complete.dudi(auxi, auxi$nf + 1, nf) Eig <- auxi$eig Co <- auxi$co Li <- auxi$li C1 <- auxi$c1 L1 <- auxi$l1 row.names(Li) <- paste(row.names(Li), j1, sep = ".") row.names(L1) <- paste(row.names(L1), j1, sep = ".") row.names(Co) <- paste(row.names(Co), j1, sep = ".") row.names(C1) <- paste(row.names(C1), j1, sep = ".") rank <- auxi$rank for (i in 2:ntab) { j1 <- j2 + 1 j2 <- j2 + as.numeric(blo[i]) tab <- as.data.frame(X[[i]]) auxi <- as.dudi(tab, col.w = cw[j1:j2], row.w = lw, nf = nf, scannf = FALSE, call = match.call(), type = "sepan") Eig <- c(Eig, auxi$eig) row.names(auxi$li) <- paste(row.names(auxi$li), i, sep = ".") row.names(auxi$l1) <- paste(row.names(auxi$l1), i, sep = ".") row.names(auxi$co) <- paste(row.names(auxi$co), i, sep = ".") row.names(auxi$c1) <- paste(row.names(auxi$c1), i, sep = ".") if (auxi$nf < nf) auxi <- complete.dudi(auxi, auxi$nf + 1, nf) Co <- rbind.data.frame(Co, auxi$co) Li <- rbind.data.frame(Li, auxi$li) C1 <- rbind.data.frame(C1, auxi$c1) L1 <- rbind.data.frame(L1, auxi$l1) rank <- c(rank, auxi$rank) } res <- list() res$Li <- Li res$L1 <- L1 res$Co <- Co res$C1 <- C1 res$Eig <- Eig res$TL <- X$TL res$TC <- X$TC res$T4 <- X$T4 res$blo <- blo res$rank <- rank res$tab.names <- names(X)[1:ntab] res$call <- match.call() class(res) <- c("sepan", "list") return(res) } "summary.sepan" <- function (object, ...) { if (!inherits(object, "sepan")) stop("to be used with 'sepan' object") cat("Separate Analyses of a 'ktab' object\n") x1 <- object$tab.names ntab <- length(x1) indica <- factor(rep(1:length(object$blo), object$rank)) nrow <- nlevels(object$TL[, 2]) sumry <- array("", c(ntab, 9), list(1:ntab, c("names", "nrow", "ncol", "rank", "lambda1", "lambda2", "lambda3", "lambda4", ""))) for (k in 1:ntab) { eig <- zapsmall(object$Eig[indica == k], digits = 4) l0 <- min(length(eig), 4) sumry[k, 4 + (1:l0)] <- round(eig[1:l0], digits = 3) if (length(eig) > 4) sumry[k, 9] <- "..." } sumry[, 1] <- x1 sumry[, 2] <- rep(nrow, ntab) sumry[, 3] <- object$blo sumry[, 4] <- object$rank print(sumry, quote = FALSE) } "plot.sepan" <- function (x, mfrow = NULL, csub = 2, ...) { if (!inherits(x, "sepan")) stop("Object of type 'sepan' expected") opar <- par(ask = par("ask"), mfrow = par("mfrow"), mar = par("mar")) on.exit(par(opar)) par(mar = c(0.6, 2.6, 0.6, 0.6)) nbloc <- length(x$blo) if (is.null(mfrow)) mfrow <- n2mfrow(nbloc) par(mfrow = mfrow) if (nbloc > prod(mfrow)) par(ask = TRUE) rank.fac <- factor(rep(1:nbloc, x$rank)) nf <- ncol(x$Li) neig <- max(x$rank) maxeig <- max(x$Eig) for (ianal in 1:nbloc) { w <- x$Eig[rank.fac == ianal] scatterutil.eigen(w, xmax = neig, ymax = maxeig, wsel = 1:nf, sub = x$tab.names[ianal], csub = csub, possub = "topright",yaxt="s") } } "print.sepan" <- function (x, ...) { if (!inherits(x, "sepan")) stop("to be used with 'sepan' object") cat("class:", class(x), "\n") cat("$call: ") print(x$call) sumry <- array("", c(4, 4), list(1:4, c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$tab.names", length(x$tab.names), mode(x$tab.names), "tab names") sumry[2, ] <- c("$blo", length(x$blo), mode(x$blo), "column number") sumry[3, ] <- c("$rank", length(x$rank), mode(x$rank), "tab rank") sumry[4, ] <- c("$Eig", length(x$Eig), mode(x$Eig), "All the eigen values") print(sumry, quote = FALSE) sumry <- array("", c(6, 4), list(1:6, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$Li", nrow(x$Li), ncol(x$Li), "row coordinates") sumry[2, ] <- c("$L1", nrow(x$L1), ncol(x$L1), "row normed scores") sumry[3, ] <- c("$Co", nrow(x$Co), ncol(x$Co), "column coordinates") sumry[4, ] <- c("$C1", nrow(x$C1), ncol(x$C1), "column normed coordinates") sumry[5, ] <- c("$TL", nrow(x$TL), ncol(x$TL), "factors for Li L1") sumry[6, ] <- c("$TC", nrow(x$TC), ncol(x$TC), "factors for Co C1") print(sumry, quote = FALSE) } ade4/R/dist.binary.R0000644000176200001440000000705013522571036013647 0ustar liggesusers"dist.binary" <- function (df, method = NULL, diag = FALSE, upper = FALSE) { METHODS <- c("JACCARD S3", "SOKAL & MICHENER S4", "SOKAL & SNEATH S5", "ROGERS & TANIMOTO S6", "CZEKANOWSKI S7", "GOWER & LEGENDRE S9", "OCHIAI S12", "SOKAL & SNEATH S13", "Phi of PEARSON S14", "GOWER & LEGENDRE S2") if (!(inherits(df, "data.frame") | inherits(df, "matrix"))) stop("df is not a data.frame or a matrix") df <- as.matrix(df) if(!is.numeric(df)) stop("df must contain numeric values") if (any(df < 0)) stop("non negative value expected in df") nlig <- nrow(df) d.names <- row.names(df) if(is.null(d.names)) d.names <- 1:nlig nlig <- nrow(df) df <- as.matrix(1 * (df > 0)) if (is.null(method)) { cat("1 = JACCARD index (1901) S3 coefficient of GOWER & LEGENDRE\n") cat("s1 = a/(a+b+c) --> d = sqrt(1 - s)\n") cat("2 = SOKAL & MICHENER index (1958) S4 coefficient of GOWER & LEGENDRE \n") cat("s2 = (a+d)/(a+b+c+d) --> d = sqrt(1 - s)\n") cat("3 = SOKAL & SNEATH(1963) S5 coefficient of GOWER & LEGENDRE\n") cat("s3 = a/(a+2(b+c)) --> d = sqrt(1 - s)\n") cat("4 = ROGERS & TANIMOTO (1960) S6 coefficient of GOWER & LEGENDRE\n") cat("s4 = (a+d)/(a+2(b+c)+d) --> d = sqrt(1 - s)\n") cat("5 = CZEKANOWSKI (1913) or SORENSEN (1948) S7 coefficient of GOWER & LEGENDRE\n") cat("s5 = 2*a/(2*a+b+c) --> d = sqrt(1 - s)\n") cat("6 = S9 index of GOWER & LEGENDRE (1986)\n") cat("s6 = (a-(b+c)+d)/(a+b+c+d) --> d = sqrt(1 - s)\n") cat("7 = OCHIAI (1957) S12 coefficient of GOWER & LEGENDRE\n") cat("s7 = a/sqrt((a+b)(a+c)) --> d = sqrt(1 - s)\n") cat("8 = SOKAL & SNEATH (1963) S13 coefficient of GOWER & LEGENDRE\n") cat("s8 = ad/sqrt((a+b)(a+c)(d+b)(d+c)) --> d = sqrt(1 - s)\n") cat("9 = Phi of PEARSON = S14 coefficient of GOWER & LEGENDRE\n") cat("s9 = ad-bc)/sqrt((a+b)(a+c)(b+d)(d+c)) --> d = sqrt(1 - s)\n") cat("10 = S2 coefficient of GOWER & LEGENDRE\n") cat("s10 = a/(a+b+c+d) --> d = sqrt(1 - s) and unit self-similarity\n") cat("Select an integer (1-10): ") method <- as.integer(readLines(n = 1)) } a <- df %*% t(df) b <- df %*% (1 - t(df)) c <- (1 - df) %*% t(df) d <- ncol(df) - a - b - c if (method == 1) { d <- a/(a + b + c) } else if (method == 2) { d <- (a + d)/(a + b + c + d) } else if (method == 3) { d <- a/(a + 2 * (b + c)) } else if (method == 4) { d <- (a + d)/(a + 2 * (b + c) + d) } # correction d'un bug signalé par Christian Düring else if (method == 5) { d <- 2*a/(2 * a + b + c) } else if (method == 6) { d <- (a - (b + c) + d)/(a + b + c + d) } else if (method == 7) { d <- a/sqrt((a+b)*(a+c)) } else if (method == 8) { d <- a * d/sqrt((a + b) * (a + c) * (d + b) * (d + c)) } else if (method == 9) { d <- (a * d - b * c)/sqrt((a + b) * (a + c) * (b + d) * (d + c)) } else if (method == 10) { d <- a/(a + b + c + d) diag(d) <- 1 } else stop("Non convenient method") d <- sqrt(1 - d) # if (sum(diag(d)^2)>0) stop("diagonale non nulle") d <- as.dist(d) attr(d, "Size") <- nlig attr(d, "Labels") <- d.names attr(d, "Diag") <- diag attr(d, "Upper") <- upper attr(d, "method") <- METHODS[method] attr(d, "call") <- match.call() class(d) <- "dist" return(d) } ade4/R/kdisteuclid.R0000644000176200001440000000430312576021756013732 0ustar liggesuserskdisteuclid <- function(obj,method=c("lingoes","cailliez","quasi")) { if (is.null(class(obj))) stop ("Object of class 'kdist' expected") if (class(obj)!="kdist") stop ("Object of class 'kdist' expected") choice <- match.arg(method) lingo.1 <- function(x,size) { mat <- matrix(0, size, size) mat[row(mat) > col(mat)] <- x mat <- mat + t(mat) delta <- -0.5 * bicenter.wt(mat*mat) lambda <- eigen(delta, symmetric = TRUE, only.values = TRUE)$values lder <- lambda[ncol(mat)] mat <- sqrt(mat * mat + 2 * abs(lder)) mat <- unclass(mat[row(mat) > col(mat)]) print(paste("Lingoes constant =", abs(lder))) return(mat) } quasi.1 <- function(x,size) { mat <- matrix(0, size, size) mat[row(mat) > col(mat)] <- x mat <- mat + t(mat) delta <- -0.5 * bicenter.wt(mat*mat) eig <- eigen(delta, symmetric = TRUE) ncompo <- sum(eig$value>0) tabnew <- t( t(eig$vectors[,1:ncompo])*sqrt(eig$values[1:ncompo]) ) mat <- unclass(dist.quant(tabnew,1)) print(paste("First ev =", eig$value[1], "Last ev =", eig$value[size])) return(mat) } cailliez.1 <- function(x,size) { mat <- matrix(0, size, size) mat[row(mat) > col(mat)] <- x mat <- mat + t(mat) m1 <- matrix(0,size,size) m1 <- rbind(m1,-diag(size)) m2 <- -bicenter.wt(mat*mat) m2 <- rbind(m2, 2*bicenter.wt(mat)) m1 <- cbind(m1,m2) lambda <- eigen(m1,only.values = TRUE)$values c <- max(Re(lambda)[Im(lambda)<1e-08]) print(paste("Cailliez constant =", c)) return(x+c) } n <- attr(obj,"size") ndist <- length(obj) euclid <- attr(obj,"euclid") for (i in 1:ndist) { if (!euclid[i]) { if (choice=="lingoes") obj[[i]] <- lingo.1(obj[[i]],n) else if (choice=="cailliez") obj[[i]] <- cailliez.1(obj[[i]],n) else if (choice=="quasi") obj[[i]] <- quasi.1(obj[[i]],n) else (stop ("unknown method")) } } attr(obj, "euclid") <- rep(TRUE, ndist) attr(obj, "call") <- match.call() return(obj) } ade4/R/s.hist.R0000644000176200001440000000666112576021756012647 0ustar liggesusers"s.hist" <- function(dfxy, xax = 1, yax = 2, cgrid=1, cbreaks=2, adjust=1,...) { def.par <- par(no.readonly = TRUE)# save default, for resetting... layout(matrix(c(2,4,1,3),2,2,byrow=TRUE), c(3,1), c(1,3), TRUE) ## pour avoir des quadrillages compatibles if (cbreaks>=1) cbreaks <- floor(cbreaks) else if (cbreaks<0.1) cbreaks <- 2 else cbreaks <- 1/floor(1/cbreaks) ## tracé du nuage s.label(dfxy,xax,yax,cgrid=cgrid,...) par(mar=c(0.1,0.1,0.1,0.1)) ## quadrillage du plan col <- "lightgray" lty <- 1 xmin <- par("xaxp")[1] xmax <- par("xaxp")[2] xampli <- par("xaxp")[3] ax <- (xmax-xmin)/xampli/cbreaks ymin <- par("yaxp")[1] ymax <- par("yaxp")[2] yampli <- par("yaxp")[3] ay <- (ymax-ymin)/yampli/cbreaks a <- min(ax, ay) while ((xmin-a)>par("usr")[1]) xmin<-xmin-a while ((xmax+a)par("usr")[3]) ymin<-ymin-a while ((ymax+a) xmax) v0 <- c(v0,par("usr")[2]) if (par("usr")[3] < ymin) h0 <- c(par("usr")[3],h0) if (par("usr")[4] > ymax) h0 <- c(h0,par("usr")[4]) abline(v = v0[v0!=0], col = col, lty = lty) abline(h = h0[h0!=0], col = col, lty = lty) if (cgrid > 0) { a1 = round(a, digits = 3) cha <- paste(" d = ", a1, " ", sep = "") cex0 <- par("cex") * cgrid xh <- strwidth(cha, cex = cex0) yh <- strheight(cha, cex = cex0) * 5/3 x1 <- par("usr")[2] y1 <- par("usr")[4] rect(x1 - xh, y1 - yh, x1 + xh, y1 + yh, col = "white", border = 0) text(x1 - xh/2, y1 - yh/2, cha, cex = cex0) } para<-par("usr") abline(h = 0, v = 0, lty = 1) box() ## calcul des histogrammes nlig <- nrow(dfxy) w <- dfxy[,xax] xhist <- hist(w, breaks=v0,plot=FALSE) xdens <- density(w,adjust=adjust) xdensx <- xdens[[1]] xdensy <- xdens[[2]]*nlig*a w <- dfxy[,yax] yhist <- hist(w, breaks=h0,plot=FALSE) ydens <- density(w,adjust=adjust) ydensx <- ydens[[2]]*nlig*a ydensy <- ydens[[1]] top <- max(c(xhist$counts, yhist$counts)) leg <- pretty(0:top) leg <- leg[-c(1,length(leg))] ## l'histogramme des x plot.default(0, 0, type = "n", xlab = "", ylab = "", xaxt = "n", yaxt = "n", xaxs = "i", yaxs = "i", frame.plot = TRUE) par(usr=c(para[1:2],c(0,top))) abline(h=leg,lty=2) rect(xhist$mids-a/2,rep(0,length(xhist$mids)),xhist$mids+a/2,xhist$counts,col=grey(0.8)) lines(xdensx,xdensy) ## l'histogramme des y plot.default(0, 0, type = "n", xlab = "", ylab = "", xaxt = "n", yaxt = "n", xaxs = "i", yaxs = "i", frame.plot = TRUE) par(usr=c(c(0,top),para[3:4])) abline(v=leg,lty=2) rect(rep(0,length(yhist$mids)),yhist$mids-a/2,yhist$counts,yhist$mids+a/2,col=grey(0.8)) lines(ydensx,ydensy) ## la légende dans le petit carré plot.default(0, 0, type = "n", xlab = "", ylab = "", xaxt = "n", yaxt = "n", xaxs = "i", yaxs = "i", frame.plot = FALSE) par(usr=c(c(0,top),c(0,top))) print(leg) symbols(rep(0,length(leg)),rep(0,length(leg)),circles = leg,lty=2, inches = FALSE, add=TRUE) scatterutil.eti (sqrt(0.5)*leg, sqrt(0.5)*leg, as.character(leg), clabel=1) ## restauration des paramètres par(def.par)#- reset to default invisible(match.call()) } ade4/R/dudi.dec.R0000644000176200001440000000170412576021756013107 0ustar liggesusers"dudi.dec" <- function (df, eff, scannf = TRUE, nf = 2) { df <- as.data.frame(df) if (!is.data.frame(df)) stop("data.frame expected") lig <- nrow(df) if (any(df < 0)) stop("negative entries in table") if ((sum(df)) == 0) stop("all frequencies are zero") if (length(eff) != lig) stop("non convenient dimension") if (any(eff) <= 0) stop("non convenient vector eff") rtot <- sum(eff) row.w <- eff/rtot col.w <- apply(df, 2, sum) col.w <- col.w/rtot df <- sweep(df, 1, eff, "/") df <- sweep(df, 2, col.w, "/") - 1 if (any(is.na(df))) { fun1 <- function(x) { if (is.na(x)) return(0) else return(x) } df <- apply(df, c(1, 2), fun1) df <- data.frame(df) } X <- as.dudi(df, col.w, row.w, scannf = scannf, nf = nf, call = match.call(), type = "dec") X$R <- rtot return(X) } ade4/R/combine.4thcorner.R0000644000176200001440000000656513050632301014743 0ustar liggesuserscombine.4thcorner <- function(four1,four2){ if(!inherits(four1, "4thcorner") || !inherits(four2, "4thcorner") ) stop("objects must be of class '4thcorner'") if(four1$call[[1]] != four2$call[[1]]) stop("can not combine objects created by different functions") if(four1$call[[1]]=="fourthcorner.rlq"){ if(four1$call$xtest != four2$call$xtest) stop("can not combine objects: different 'rlq' objects") } else { if(four1$call$tabR != four2$call$tabR) stop("can not combine objects: different tables R") if(four1$call$tabL != four2$call$tabL) stop("can not combine objects: different tables L") if(four1$call$tabQ != four2$call$tabQ) stop("can not combine objects: different tables Q") } ## test longueur (i.e. meme tableaux pour lignes et colonnes) ## test adjustment res <- four1 ## For tabG if(four1$tabG$adj.method != four2$tabG$adj.method) stop("can not combine objects: diferent adjustment methods for tabG") for(i in 1:length(res$tabG$names)){ idx <- ifelse(four2$tabG$adj.pvalue[i] > four1$tabG$adj.pvalue[i], 1, 2) if(idx==1) { tmp <- four2 } else if(idx==2){ tmp <- four1 } res$tabG$expvar[i,] <- tmp$tabG$expvar[i,] res$tabG$pvalue[i] <- tmp$tabG$pvalue[i] res$tabG$adj.pvalue[i] <- tmp$tabG$adj.pvalue[i] res$tabG$plot[[i]] <- tmp$tabG$plot[[i]] if(!inherits(res$tabG, "lightkrandtest")) res$tabG$sim[,i] <- tmp$tabG$sim[,i] } res$tabG$call <- match.call() if(!inherits(res, "4thcorner.rlq")){ if(four1$tabD$adj.method != four2$tabD$adj.method) stop("can not combine objects: diferent adjustment methods for tabD") if(four1$tabD2$adj.method != four2$tabD2$adj.method) stop("can not combine objects: diferent adjustment methods for tabD2") for(i in 1:length(res$tabD$names)){ ## For tabD idx <- ifelse(four2$tabD$adj.pvalue[i] > four1$tabD$adj.pvalue[i], 1, 2) idx <- ifelse(is.na(idx), 1, idx) ## NA could occur in the case of factor with one level. In this case, return the first output if(idx == 1) { tmp <- four2 } else if(idx == 2){ tmp <- four1 } res$tabD$expvar[i,] <- tmp$tabD$expvar[i,] res$tabD$pvalue[i] <- tmp$tabD$pvalue[i] res$tabD$adj.pvalue[i] <- tmp$tabD$adj.pvalue[i] res$tabD$plot[[i]] <- tmp$tabD$plot[[i]] if(!inherits(res$tabD, "lightkrandtest")) res$tabD$sim[,i] <- tmp$tabD$sim[,i] ## For tabD2 idx <- ifelse(four2$tabD2$adj.pvalue[i] > four1$tabD2$adj.pvalue[i], 1, 2) if(idx==1) { tmp <- four2 } else if(idx==2){ tmp <- four1 } res$tabD2$expvar[i,] <- tmp$tabD2$expvar[i,] res$tabD2$pvalue[i] <- tmp$tabD2$pvalue[i] res$tabD2$adj.pvalue[i] <- tmp$tabD2$adj.pvalue[i] res$tabD2$plot[[i]] <- tmp$tabD2$plot[[i]] if(!inherits(res$tabD2, "lightkrandtest")) res$tabD2$sim[,i] <- tmp$tabD2$sim[,i] } res$tabD2$call <- res$tabD$call <- match.call() } else { ## For trRLQ idx <- ifelse(four2$trRLQ$pvalue > four1$trRLQ$pvalue, 1, 2) if(idx==1) { tmp <- four2 } else if(idx==2){ tmp <- four1 } res$trRLQ <- tmp$trRLQ res$trRLQ$call <- match.call() } res$call <- match.call() res$model <- paste("Comb.", four1$model, "and", four2$model) class(res) <- c(class(res), "combine") return(res) } ade4/R/dudi.mix.R0000644000176200001440000001003413252715721013137 0ustar liggesusers"dudi.mix" <- function (df, add.square = FALSE, scannf = TRUE, nf = 2) { df <- as.data.frame(df) if (!is.data.frame(df)) stop("data.frame expected") row.w <- rep(1, nrow(df))/nrow(df) f1 <- function(v) { moy <- sum(v)/length(v) v <- v - moy et <- sqrt(sum(v * v)/length(v)) return(v/et) } df <- data.frame(df) nc <- ncol(df) nl <- nrow(df) if (any(is.na(df))) stop("na entries in table") index <- rep("", nc) for (j in 1:nc) { w1 <- "q" if (is.factor(df[, j])) w1 <- "f" if (is.ordered(df[, j])) w1 <- "o" index[j] <- w1 } res <- matrix(0, nl, 1) provinames <- "0" col.w <- NULL col.assign <- NULL k <- 0 for (j in 1:nc) { if (index[j] == "q") { if (!add.square) { res <- cbind(res, f1(df[, j])) provinames <- c(provinames, names(df)[j]) col.w <- c(col.w, 1) k <- k + 1 col.assign <- c(col.assign, k) } else { w <- df[, j] deg.poly <- 2 w <- sqrt(nl - 1) * poly(w, deg.poly) cha <- paste(names(df)[j], c(".L", ".Q"), sep = "") res <- cbind(res, as.matrix(w)) provinames <- c(provinames, cha) col.w <- c(col.w, rep(1, deg.poly)) k <- k + 1 col.assign <- c(col.assign, rep(k, deg.poly)) } } else if (index[j] == "o") { w <- as.numeric(df[, j]) deg.poly <- min(nlevels(df[, j]) - 1, 2) w <- sqrt(nl - 1) * poly(w, deg.poly) if (deg.poly == 1) cha <- names(df)[j] else cha <- paste(names(df)[j], c(".L", ".Q"), sep = "") res <- cbind(res, as.matrix(w)) provinames <- c(provinames, cha) col.w <- c(col.w, rep(1, deg.poly)) k <- k + 1 col.assign <- c(col.assign, rep(k, deg.poly)) } else if (index[j] == "f") { w <- fac2disj(df[, j], drop = TRUE) cha <- paste(substr(names(df)[j], 1, 5), ".", names(w), sep = "") col.w.provi <- apply(w, 2, function(x) sum(x*row.w)) w <- t(t(w)/col.w.provi) - 1 col.w <- c(col.w, col.w.provi) res <- cbind(res, w) provinames <- c(provinames, cha) k <- k + 1 col.assign <- c(col.assign, rep(k, length(cha))) } } res <- data.frame(res) names(res) <- make.names(provinames, unique = TRUE) res <- res[, -1] names(col.w) <- provinames[-1] X <- as.dudi(res, col.w, row.w, scannf = scannf, nf = nf, call = match.call(), type = "mix") X$assign <- factor(col.assign) X$index <- factor(index) rcor <- matrix(0, nc, X$nf) rcor <- row(rcor) + 0 + (0+1i) * col(rcor) floc <- function(x) { i <- Re(x) j <- Im(x) if (index[i] == "q") { if (sum(col.assign == i)) { w <- X$l1[, j] * X$lw * X$tab[, col.assign == i] return(sum(w)^2) } else { w <- X$lw * X$l1[, j] w <- X$tab[, col.assign == i, drop = FALSE] * w w <- apply(w, 2, sum) return(sum(w^2)) } } else if (index[i] == "o") { w <- X$lw * X$l1[, j] w <- X$tab[, col.assign == i, drop = FALSE] * w w <- apply(w, 2, sum) return(sum(w^2)) } else if (index[i] == "f") { x <- X$l1[, j] * X$lw qual <- df[, i] poicla <- unlist(tapply(X$lw, qual, sum)) z <- unlist(tapply(x, qual, sum))/poicla return(sum(poicla * z * z)) } else return(NA) } rcor <- apply(rcor, c(1, 2), floc) rcor <- data.frame(rcor) row.names(rcor) <- names(df) names(rcor) <- names(X$l1) X$cr <- rcor X } ade4/R/add.scatter.R0000644000176200001440000000502312576021756013622 0ustar liggesusers###################################################### # Function to add sub-graphics to an existing plot # Thibaut Jombart 2007 # (t.jombart@imperial.ac.uk) ###################################################### # Note: this function uses par("plt"), which interacts with other par() # otions # When addgraph is used with a function which uses par(), it is safer to # add along other options: par([other options],plt=par("plt")) ####################### # Function add.scatter ####################### add.scatter <- function(func,posi=c("bottomleft","bottomright","topleft","topright"),ratio=.2,inset=.01,bg.col='white'){ if(tolower(posi[1])=="none") return() if(ratio>.99) ratio <- .99 if(ratio<0) ratio <- .2 # set inset in x and y if(length(inset)==2) { inset.x <- inset[1] inset.y <- inset[2] } else{ inset.x <- inset[1] inset.y <- inset[1] } inset[inset<0] <- 0 plotreg0 <- par('plt') plotreg <- plotreg0 + c(inset.x,-inset.x,inset.y,-inset.y) # restore full plot region and previous graphic parameters on exit on.exit(par(plt=plotreg0)) # handle position # "top" and "bottom" are considered as "topleft" and "bottomleft" posi <- tolower(posi[1]) if(posi=="bottomleft" || posi=="bottom") { x1 <- plotreg[1] y1 <- plotreg[3] }else if(posi=="topleft" || posi=="top") { x1 <- plotreg[1] y1 <- plotreg[4]-ratio }else if(posi=="bottomright") { x1 <- plotreg[2]-ratio y1 <- plotreg[3] }else if(posi=="topright") { x1 <- plotreg[2]-ratio y1 <- plotreg[4]-ratio }else stop("Unknown position required") x2 <- x1+ratio y2 <- y1+ratio # clean subplot region par(plt=c(x1,x2,y1,y2),new=TRUE) plot.new() polygon(c(-0.1, 1.1, 1.1, -0.1), c(-0.1, -0.1, 1.1, 1.1), border = NA, col = bg.col) # draw the subplot # beware: if func uses par, it must specify "par(...,plt=par("plt",...)" # (due to weired par interaction, e.g. with par(mar)) par(plt=c(x1,x2,y1,y2),new=TRUE) eval(func) return(invisible(match.call())) } # end add.scatter ########################### # Function add.scatter.eig ########################### "add.scatter.eig" <- function (w, nf=NULL, xax, yax, posi = "bottomleft", ratio = .25, inset = .01, sub="Eigenvalues",csub=2*ratio){ opar <- par("mar","xaxt","yaxt") on.exit(par(opar)) par(mar=rep(.1,4),xaxt="n",yaxt="n") fgraph <- function(){ scatterutil.eigen(w, nf=nf, wsel=c(xax,yax), sub=sub, csub=csub, box=TRUE) } add.scatter( fgraph(), posi=posi, ratio=ratio, inset=inset) } # end add.scatter.eig ade4/R/kplot.R0000644000176200001440000000007512576021756012561 0ustar liggesusers"kplot" <- function (object, ...) { UseMethod("kplot") } ade4/R/varipart.R0000644000176200001440000001107113336535770013257 0ustar liggesusersvaripart <- function(Y, X, W = NULL, nrepet = 999, type = c("simulated", "parametric"), scale = FALSE, ...){ type <- match.arg(type) if (!inherits(Y, "dudi")) { response.generic <- as.matrix(scalewt(Y, scale = scale)) lw <- rep(1/NROW(Y), NROW(Y)) sqlw <- sqrt(lw) sqcw <- sqrt(rep(1, NCOL(Y))) wt <- outer(sqlw, sqcw) inertot <- sum((response.generic * wt)^2) param.ok <- TRUE } else { inertot <- sum(Y$eig) lw <- Y$lw sqlw <- sqrt(lw) sqcw <- sqrt(Y$cw) param.ok <- dudi.type(Y$call) %in% c(4, 5) response.generic <- as.matrix(Y$tab) wt <- outer(sqlw, sqcw) } # fast computation of R2/adjusted R2test.QR <- function(df){ df <- data.frame(df) mf <- model.matrix(~., df) x <- scalewt(mf[, -1, drop = FALSE], scale = FALSE, wt = lw) * sqrt(lw) response.generic <- response.generic * wt Q <- qr(x, tol = 1e-06) Yfit.X <- qr.fitted(Q, response.generic) obs <- sum(Yfit.X^2) isim <- c() for (i in 1:nrepet) isim[i] <- sum(qr.fitted(Q, response.generic[sample(length(lw)),])^2) r2 <- c(obs, isim) / inertot ## adjustment p <- Q$rank if (type == "parametric") { if (param.ok) { r2.adj <- 1 - (1 - r2) / (1 - p / (nrow(x) - 1)) } else stop("parametric correction can only be used for objects created by dudi.pca with center = TRUE") } else if (type == "simulated") r2.adj <- 1 - (1 - r2) / (1 - mean(r2[-1])) return(list(r2 = r2, r2.adj = r2.adj)) } R2test.lmwfit <- function(df){ df <- data.frame(df) fmla <- as.formula(paste("response.generic ~", paste(names(df), collapse = "+"))) mf <- model.frame(fmla, data = cbind.data.frame(response.generic,df)) mt <- attr(mf,"terms") x <- model.matrix(mt, mf) ## Fast function for computing sum of squares of the fitted table obs <- sum((lm.wfit(y = response.generic, x = x, w = lw)$fitted.values * wt)^2) isim <- c() for (i in 1:nrepet) isim[i] <- sum((lm.wfit(y = response.generic, x = x[sample(nrow(x)),], w = lw)$fitted.values * wt)^2) r2 <- c(obs, isim) / inertot ## adjustment p <- ncol(x) - 1 ## we remove 1 for the intercept if (type == "parametric") { if (param.ok) { r2.adj <- 1 - (1 - r2) / (1 - p / (nrow(x) - 1)) } else stop("parametric correction can only be used for objects created by dudi.pca with center = TRUE") } else if (type == "simulated") r2.adj <- 1 - (1 - r2) / (1 - mean(r2[-1])) return(list(r2 = r2, r2.adj = r2.adj)) } R2test <- R2test.lmwfit if (identical(all.equal(lw, rep(1/length(lw), length(lw))), TRUE)) R2test <- R2test.QR rda.ab <- R2test(X) if (is.null(W)) { res <- list(R2.adj = rda.ab$r2.adj[1]) if (nrepet > 0) { test <- as.randtest(obs = rda.ab$r2[1], sim = rda.ab$r2[-1], call = match.call(), ...) res[["test"]] <- test } } else { rda.bc <- R2test(W) rda.abc <- R2test(cbind(X, W)) a.adj <- rda.abc$r2.adj[1] - rda.bc$r2.adj[1] c.adj <- rda.abc$r2.adj[1] - rda.ab$r2.adj[1] b.adj <- rda.abc$r2.adj[1] - a.adj - c.adj d.adj <- 1 - rda.abc$r2.adj[1] a <- rda.abc$r2[1] - rda.bc$r2[1] c <- rda.abc$r2[1] - rda.ab$r2[1] b <- rda.abc$r2[1] - a - c d <- 1 - rda.abc$r2[1] res <- list(R2 = c(a = a, b = b, c = c, d = d), R2.adj = c(a = a.adj, b = b.adj, c = c.adj, d = d.adj)) if (nrepet > 0) { test <- as.krandtest(obs = c(rda.ab$r2[1], rda.bc$r2[1], rda.abc$r2[1]), sim = cbind(rda.ab$r2, rda.bc$r2, rda.abc$r2)[-1,], names = c("ab", "bc", "abc"), call = match.call(), ...) res[["test"]] <- test } } res$call <- match.call() class(res) <- c("varipart", "list") return(res) } print.varipart <- function(x, ...){ if (!inherits(x, "varipart")) stop("to be used with 'varipart' object") cat("Variation Partitioning\n") cat("class: ") cat(class(x), "\n") cat("\nTest of fractions:\n") print(x$test) if (!is.null(x[["R2"]])) { cat("\nIndividual fractions:\n") print(x$R2) } cat("\nAdjusted fractions:\n") print(x$R2.adj) } ade4/R/area.plot.R0000644000176200001440000002233612576021756013321 0ustar liggesusers########### area.plot ################ ########### area.util.contour ################ ########### area.util.xy ################ ########### area2poly ################ ########### poly2area ################ ########### area2link ################ ########### area.util.class ################ "area.plot" <- function (x, center= NULL, values = NULL, graph = NULL, lwdgraph = 2, nclasslegend = 8, clegend = 0.75, sub = "", csub = 1, possub = "topleft", cpoint = 0, label = NULL, clabel = 0, ...) { # modif vendredi, mars 28, 2003 at 07:35 ajout de l'argument center # doit contenir les centres des polygones (autant de coordonnées que de classes dans area[,1]) # si il est nul et utilisé il est calculé comme centre de gravité des sommets du polygones # avec area.util.xy(x) # si il est non nul, doit être de dimensions (nombre de niveaux de x[,1] , 2) et # contenir les coordonnées dans l'ordre de unique(x[,1]) x.area <- x if(dev.cur() == 1) plot.new() opar <- par(mar = par("mar")) #, new = par("new") on.exit(par(opar)) par(mar = c(0.1, 0.1, 0.1, 0.1)) if (!is.factor(x.area[, 1])) stop("Factor expected in x.area[1,]") fac <- x.area[, 1] lev.poly <- unique(fac) nlev <- nlevels(lev.poly) x1 <- x.area[, 2] x2 <- x.area[, 3] r1 <- range(x1) r2 <- range(x2) plot(r1, r2, type = "n", asp = 1, xlab = "", ylab = "", xaxt = "n", yaxt = "n", frame.plot = FALSE) if (!is.null(values)) { if (!is.vector(values)) values <- as.vector(values) if (length(values) != nlev) values <- rep(values, le = nlev) br0 <- pretty(values, nclasslegend - 1) nborn <- length(br0) h <- diff(range(x1))/20 numclass <- cut.default(values, br0, include.lowest = TRUE, labels = FALSE, right = TRUE) valgris <- seq(1, 0, le = (nborn - 1)) } if (!is.null(graph)) { if (class(graph) != "neig") stop("graph need an object of class 'ng'") } if (cpoint != 0) points(x1, x2, pch = 20, cex = par("cex") * cpoint) for (i in 1:nlev) { a1 <- x1[fac == lev.poly[i]] a2 <- x2[fac == lev.poly[i]] if (!is.null(values)) polygon(a1, a2, col = grey(valgris[numclass[i]])) else polygon(a1, a2) } if (!is.null(graph) | (clabel > 0)) { if (!is.null(center)) { center = as.matrix(center) if (ncol(center)!=2) center <- NULL if (nrow(center)!=length(lev.poly)) center <-NULL } if (!is.null(center)) w=list(x=center[,1],y=center[,2]) else w <- area.util.xy(x.area) } if (!is.null(graph)) { for (i in 1:nrow(graph)) { segments(w$x[graph[i, 1]], w$y[graph[i, 1]], w$x[graph[i, 2]], w$y[graph[i, 2]], lwd = lwdgraph) } } if (clabel > 0) { if (is.null(label)) label <- as.character(unique(x.area[,1])) scatterutil.eti(w$x, w$y, label, clabel = clabel) } scatterutil.sub(sub, csub, possub) if (!is.null(values)) scatterutil.legend.square.grey(br0, valgris, h, clegend) } "area.util.contour" <- function (area) { poly <- area[, 1] x <- area[, 2] y <- area[, 3] res <- NULL f1 <- function(x) { if (x[1] > x[3]) { s <- x[1] x[1] <- x[3] x[3] <- s s <- x[2] x[2] <- x[4] x[4] <- s } if (x[1] == x[3]) { if (x[2] > x[4]) { s <- x[2] x[2] <- x[4] x[4] <- s } } return(paste(x[1], x[2], x[3], x[4], sep = "A")) } for (i in 1:(nlevels(poly))) { xx <- x[poly == levels(poly)[i]] yy <- y[poly == levels(poly)[i]] n0 <- length(xx) xx <- c(xx, xx[1]) yy <- c(yy, yy[1]) z <- cbind(xx[1:n0], yy[1:n0], xx[2:(n0 + 1)], yy[2:(n0 + 1)]) z <- apply(z, 1, f1) res <- c(res, z) } res <- res[table(res)[res] < 2] res <- unlist(lapply(res, function(x) as.numeric(unlist(strsplit(x, "A"))))) res <- matrix(res, ncol = 4, byrow = TRUE) res <- data.frame(res) names(res) <- c("x1", "y1", "x2", "y2") return(res) } "area.util.xy" <- function (area) { fac <- area[, 1] lev.poly <- unique(fac) npoly <- length(lev.poly) x <- rep(0, npoly) y <- rep(0, npoly) for (i in 1:npoly) { lev <- lev.poly[i] a1 <- area[fac == lev, 2] a2 <- area[fac == lev, 3] x[i] <- mean(a1) y[i] <- mean(a2) } cbind.data.frame(x = x, y = y, row.names = as.character(lev.poly)) } "area2poly" <- function (area) { if (!is.factor(area[, 1])) stop("Factor expected in area[,1]") fac <- area[, 1] lev.poly <- unique(fac) nlev <- nlevels(lev.poly) label.poly <- as.character(lev.poly) x1 <- area[, 2] x2 <- area[, 3] res <- list() for (i in 1:nlev) { a1 <- x1[fac == lev.poly[i]] a2 <- x2[fac == lev.poly[i]] res <- c(res, list(as.matrix(cbind(a1, a2)))) attr(res[[i]],"bbox") <- c(min(res[[i]][,1]),min(res[[i]][,2]),max(res[[i]][,1]),max(res[[i]][,2])) } r0 <- matrix(0, nlev, 4) r0[, 1] <- tapply(x1, fac, min) r0[, 2] <- tapply(x2, fac, min) r0[, 3] <- tapply(x1, fac, max) r0[, 4] <- tapply(x2, fac, max) class(res) <- "polylist" attr(res, "region.id") <- label.poly attr(res, "region.rect") <- r0 # message de Stéphane Dray du 06/02/2004 attr(res,"maplim") <- list(x=range(x1),y=range(x2)) return(res) } "poly2area" <- function (polys) { if (!inherits(polys, "polylist")) stop("Non convenient data") if (!is.null(attr(polys, "region.id"))) reg.names <- attr(polys, "region.id") else reg.names <- paste("R", 1:length(polys), sep = "") area <- data.frame(polys[[1]]) area <- cbind(rep(reg.names[1], nrow(area)), area) names(area) <- c("reg", "x", "y") for (i in 2:length(polys)) { provi <- data.frame(polys[[i]]) provi <- cbind(rep(reg.names[i], nrow(provi)), provi) names(provi) <- c("reg", "x", "y") area <- rbind.data.frame(area, provi) } area$reg <- factor(area$reg) return(area) } "area2link" <- function(area) { # création vendredi, mars 28, 2003 at 14:49 if (!is.factor(area[, 1])) stop("Factor expected in area[,1]") fac <- area[, 1] levpoly <- unique(fac) npoly <- length(levpoly) res <- matrix(0,npoly,npoly) dimnames(res) <- list(as.character(levpoly),as.character(levpoly)) fun1 <- function(niv) { # X est un n-2 système de coordonnées xy # On vérifie que c'est une boucle (sommaire) X <- area[fac == niv, 2:3] n <- nrow(X) if (any(X[1,]!=X[n,])) X <- rbind(X,X[1,]) n <- nrow(X) w <- paste(X[1:(n-1),1],X[1:(n-1),2],X[2:(n),1],X[2:(n),2],sep="/") w <- c(w,paste(X[2:(n),1],X[2:(n),2],X[1:(n-1),1],X[1:(n-1),2],sep="/")) } w <- lapply(levpoly,fun1) # w est une liste de vecteurs qui donnent les arêtes des polygones en charactères # du type x1/y1/x2/y2 fun2 <- function (cha) { w <- as.numeric(strsplit(cha,"/")[[1]]) res <- sqrt((w[1]-w[3])^2+(w[2]-w[4])^2) res } res <- matrix(0,npoly,npoly) x1 <- col(res)[col(res) < row(res)] x2 <- row(res)[col(res) < row(res)] lw <- cbind(x1,x2) fun3 <- function (x) { a <- w[[x[1]]] b <- w[[x[2]]] wd <- 0 wab <- unlist(lapply(a, function(x) x%in%b)) if (sum(wab)>0) wd <- sum(unlist(lapply(a[wab], fun2))) wd/2 } w <- apply(lw,1,fun3) res[col(res) < row(res) ] <- w res <- res+t(res) dimnames(res) <- list(as.character(levpoly),as.character(levpoly)) return(res) } "area.util.class" <- function (area,fac) { if (nlevels(area[,1]!= length(fac))) stop ("non convenient matching") lreg <- split (as.character(unique(area[,1])),fac) "contour2poly" <- function(x) { a <- paste(x[,1],x[,2],sep="_") b <- paste(x[,3],x[,4],sep="_") a <- cbind(a,b) points <- a[1,1] rowcur <- 1 colcur <- 1 npts <- nrow(x) for (k in (1:(npts-2))) { colnew <- 3-colcur curnew <- a[rowcur,colnew] points <- c(points,curnew) a <- a[-rowcur,] coo <- which(a==curnew, arr.ind=TRUE) rowcur <- coo[1,1] colcur <- coo[1,2] } colnew <- 3-colcur curnew <- a[rowcur,colnew] points <- c(points,curnew) return(matrix(as.numeric(unlist(strsplit(points,"_"))), ncol=2, byrow=TRUE)) } "souscontour" <- function(k) { sel <- unlist(lapply(lreg[[k]],function(x) which(area[,1]==x))) area.sel <- area[sel,] area.sel[,1] <- as.factor(as.character(area.sel[,1])) w <- area.util.contour(area.sel) w <- contour2poly(w) w <- cbind(rep(k,nrow(w)),w) return(w) } lcontour <- lapply(1:nlevels(fac),souscontour) w <- lcontour[[1]] for (k in 2:length(lcontour)) w <- rbind.data.frame(w,lcontour[[k]]) w[,1] <- as.factor(levels(fac)[w[,1]]) return(w) } ade4/R/krandboot.R0000644000176200001440000000221312576021756013407 0ustar liggesusersas.krandboot <- function(obs, boot, quantiles = c(0.025, 0.975), names = colnames(boot), call = match.call()){ ## obs: a vector (length p) with observed value of the statistic ## boot: a matrix (n p) with bootstrapped values ## n: number of repetitions, p number of statistics if(ncol(boot) != length(obs)) stop("Wrong number of statistics") res <- list(obs = obs, boot = boot) res$rep <- apply(boot, 2, function(x) length(na.omit(x))) res$stats <- t(sapply(1:length(obs), function(i) obs[i] - quantile(boot[,i] - obs[i], probs = rev(quantiles), na.rm = TRUE))) colnames(res$stats) <- rev(colnames(res$stats)) if(is.null(names)) names <- 1: nrow(res$stats) rownames(res$stats) <- names res$call <- call class(res) <- "krandboot" return(res) } print.krandboot <- function(x, ...){ if (!inherits(x, "krandboot")) stop("Non convenient data") cat("Multiple bootstrap\n") cat("Call: ") print(x$call) cat("\nNumber of statistics: ", length(x$obs), "\n") cat("\nConfidence Interval:\n") print(cbind.data.frame(N.rep = x$rep, Obs = x$obs, x$stats)) } ade4/R/table.value.R0000644000176200001440000001626612576021756013643 0ustar liggesusers"table.prepare" <- function (x, y, row.labels, col.labels, clabel.row, clabel.col, grid, pos) { cexrow <- par("cex") * clabel.row cexcol <- par("cex") * clabel.col wx <- range(x) wy <- range(y) maxx <- max(x) maxy <- max(y) minx <- min(x) miny <- min(y) dx <- diff(wx)/(length(x)) dy <- diff(wy)/(length(y)) if (cexrow > 0) { ## ncar <- max(nchar(paste(" ", row.labels, " ", sep = ""))) ## strx <- par("cin")[1] * ncar * cexrow/2 + 0.1 strx <- max(strwidth(paste(" ", row.labels, " ", sep = ""), units = "inches", cex=cexrow)) } else strx <- 0.1 if (cexcol > 0) { ##ncar <- max(nchar(paste(" ", col.labels, " ", sep = ""))) ##stry <- par("cin")[1] * ncar * cexcol/2 + 0.1 stry <- max(strwidth(paste(" ", col.labels, " ", sep = ""), units = "inches", cex=cexcol)) } else stry <- 0.1 if (pos == "righttop") { par(mai = c(0.1, 0.1, stry, strx)) xlim <- wx + c(-dx, 2 * dx) ylim <- wy + c(-2 * dy, 2 * dy) plot.default(0, 0, type = "n", xlab = "", ylab = "", xaxt = "n", yaxt = "n", xlim = xlim, ylim = ylim, xaxs = "i", yaxs = "i", frame.plot = FALSE) if (cexrow > 0) { for (i in 1:length(y)) { ynew <- seq(miny, maxy, le = length(y)) ynew <- ynew[rank(y)] text(maxx + 2 * dx, ynew[i], row.labels[i], adj = 0, cex = cexrow, xpd = NA) segments(maxx + 2 * dx, ynew[i], maxx + dx, y[i]) } } if (cexcol > 0) { par(srt = 90) for (i in 1:length(x)) { xnew <- seq(minx, maxx, le = length(x)) xnew <- xnew[rank(x)] text(xnew[i], maxy + 2 * dy, col.labels[i], adj = 0, cex = cexcol, xpd = NA) segments(xnew[i], maxy + 2 * dy, x[i], maxy + dy) } par(srt = 0) } if (grid) { col <- "lightgray" for (i in 1:length(y)) segments(maxx + dx, y[i], minx - dx, y[i], col = col) for (i in 1:length(x)) segments(x[i], miny - dy, x[i], maxy + dy, col = col) } rect(minx - dx, miny - dy, maxx + dx, maxy + dy) return(invisible()) } if (pos == "phylog") { par(mai = c(0.1, 0.1, stry, strx)) xlim <- wx + c(-dx, 2 * dx) ylim <- wy + c(-dy, 2 * dy) plot.default(0, 0, type = "n", xlab = "", ylab = "", xaxt = "n", yaxt = "n", xlim = xlim, ylim = ylim, xaxs = "i", yaxs = "i", frame.plot = FALSE) if (cexrow > 0) { for (i in 1:length(y)) { ynew <- seq(miny, maxy, le = length(y)) ynew <- ynew[rank(y)] text(maxx + 2 * dx, ynew[i], row.labels[i], adj = 0, cex = cexrow, xpd = NA) segments(maxx + 2 * dx, ynew[i], maxx + dx, y[i]) } } if (cexcol > 0) { par(srt = 90) xnew <- x[2:length(x)] x <- xnew for (i in 1:length(x)) { text(xnew[i], maxy + 2 * dy, col.labels[i], adj = 0, cex = cexcol, xpd = NA) segments(xnew[i], maxy + 2 * dy, x[i], maxy + dy) } par(srt = 0) } minx <- min(x) if (grid) { col <- "lightgray" for (i in 1:length(y)) segments(maxx + dx, y[i], minx - dx, y[i], col = col) for (i in 1:length(x)) segments(x[i], miny - dy, x[i], maxy + dy, col = col) } rect(minx - dx, miny - dy, maxx + dx, maxy + dy) rect(-dx, miny - dy, minx - dx, maxy + dy) return(c(0, minx - dx)) } if (pos == "leftbottom") { par(mai = c(stry, strx, 0.05, 0.05)) xlim <- wx + c(-2 * dx, dx) ylim <- wy + c(-2 * dy, dy) plot.default(0, 0, type = "n", xlab = "", ylab = "", xaxt = "n", yaxt = "n", xlim = xlim, ylim = ylim, xaxs = "i", yaxs = "i", frame.plot = FALSE) if (cexrow > 0) { for (i in 1:length(y)) { ynew <- seq(miny, maxy, le = length(y)) ynew <- ynew[rank(y)] w9 <- strwidth(row.labels[i], cex = cexrow) text(minx - w9 - 2 * dx, ynew[i], row.labels[i], adj = 0, cex = cexrow, xpd = NA) segments(minx - 2 * dx, ynew[i], minx - dx, y[i]) } } if (cexcol > 0) { par(srt = -90) for (i in 1:length(x)) { xnew <- seq(minx, maxx, le = length(x)) xnew <- xnew[rank(x)] text(xnew[i], miny - 2 * dy, col.labels[i], adj = 0, cex = cexcol, xpd = NA) segments(xnew[i], miny - 2 * dy, x[i], miny - dy) } par(srt = 0) } if (grid) { col <- "lightgray" for (i in 1:length(y)) segments(maxx + 2 * dx, y[i], minx - dx, y[i], col = col) for (i in 1:length(x)) segments(x[i], miny - 2 * dy, x[i], maxy + dy, col = col) } rect(minx - dx, miny - dy, maxx + dx, maxy + dy) return(invisible()) } if (pos == "paint") { dx <- diff(wx)/(length(x) - 1)/2 dy <- diff(wy)/(length(y) - 1)/2 par(mai = c(0.2, strx, stry, 0.1)) xlim <- wx + c(-dx, dx) ylim <- wy + c(-dy, dy) plot.default(0, 0, type = "n", xlab = "", ylab = "", xaxt = "n", yaxt = "n", xlim = xlim, ylim = ylim, xaxs = "i", yaxs = "i", frame.plot = TRUE) if (cexrow > 0) { ynew <- seq(miny, maxy, le = length(y)) ynew <- ynew[rank(y)] ##w9 <- strwidth(row.labels, cex = cexrow) ##text(minx - w9 - 3 * dx/4, ynew, row.labels, adj = 0, cex = cexrow, xpd = NA) mtext(at = ynew, side = 2, text = paste(row.labels," ", sep = ""), adj = 1, cex = cexrow, las = 1) } if (cexcol > 0) { xnew <- seq(minx, maxx, le = length(x)) xnew <- xnew[rank(x)] ## par(srt = 90) ## text(xnew, maxy + 3 * dy/4, col.labels, adj = 0, cex = cexcol, xpd = NA) mtext(at = xnew, side = 3, text = paste(" ", col.labels, sep = ""), adj = 0, cex = cexcol, las = 2) par(srt = 0) } return(invisible()) } } "table.value" <- function (df, x = 1:ncol(df), y = nrow(df):1, row.labels = row.names(df), col.labels = names(df), clabel.row = 1, clabel.col = 1, csize = 1, clegend = 1, grid = TRUE) { opar <- par(mai = par("mai"), srt = par("srt")) on.exit(par(opar)) table.prepare(x = x, y = y, row.labels = row.labels, col.labels = col.labels, clabel.row = clabel.row, clabel.col = clabel.col, grid = grid, pos = "righttop") xtot <- x[col(as.matrix(df))] ytot <- y[row(as.matrix(df))] coeff <- diff(range(xtot))/15 z <- unlist(df) sq <- sqrt(abs(z)) w1 <- max(sq) sq <- csize * coeff * sq/w1 for (i in 1:length(z)) { if (sign(z[i]) >= 0) { symbols(xtot[i], ytot[i], squares = sq[i], bg = 1, fg = 0, add = TRUE, inches = FALSE) } else { symbols(xtot[i], ytot[i], squares = sq[i], bg = "white", fg = 1, add = TRUE, inches = FALSE) } } br0 <- pretty(z, 4) l0 <- length(br0) br0 <- (br0[1:(l0 - 1)] + br0[2:l0])/2 sq0 <- sqrt(abs(br0)) sq0 <- csize * coeff * sq0/w1 sig0 <- sign(br0) if (clegend > 0) scatterutil.legend.bw.square(br0, sq0, sig0, clegend) } ade4/R/newick2phylog.R0000644000176200001440000005347712576021756014233 0ustar liggesusers"newick2phylog" <- function (x.tre, add.tools = TRUE, call =match.call()) { complete <- function(x.tre) { # Si la chaîne est en plusieurs morceaux elle est rassemblée if (length(x.tre) > 1) { w <- "" for (i in 1:length(x.tre)) w <- paste(w, x.tre[i], sep = "") x.tre <- w } # Si les parenthèses gauches et droites ont des effectifs différents -> out ndroite <- nchar(gsub("[^)]","",x.tre)) ngauche <- nchar(gsub("[^(]","",x.tre)) if (ndroite !=ngauche) stop (paste (ngauche,"( versus",ndroite,")")) # on doit trouver un ; if (regexpr(";", x.tre) == -1) stop("';' not found") # Tous les commentaires entre [] sont supprimés i <- 0 kint <- 0 kext <- 0 arret <- FALSE if (regexpr("\\[", x.tre) != -1) { x.tre <- gsub("\\[[^\\[]*\\]", "", x.tre) } x.tre <- gsub(" ", "", x.tre) # On ne peut supprimer les . qui sont dans les distances ! # x.tre <- gsub("[.]","_", x.tre, ext = FALSE) while (!arret) { i <- i + 1 # examen de la chaîne par couple de charactères if (substr(x.tre, i, i) == ";") arret <- TRUE # (, c'est une feuille sans label if (substr(x.tre, i, i + 1) == "(,") { kext <- kext + 1 add <- paste("Ext", kext, sep = "") x.tre <- paste(substring(x.tre, 1, i), add, substring(x.tre, i + 1), sep = "") i <- i + 1 } # ,, c'est une feuille sans label else if (substr(x.tre, i, i + 1) == ",,") { kext <- kext + 1 add <- paste("Ext", kext, sep = "") x.tre <- paste(substring(x.tre, 1, i), add, substring(x.tre, i + 1), sep = "") i <- i + 1 } # ,) c'est une feuille sans label else if (substr(x.tre, i, i + 1) == ",)") { kext <- kext + 1 add <- paste("Ext", kext, sep = "") x.tre <- paste(substring(x.tre, 1, i), add, substring(x.tre, i + 1), sep = "") i <- i + 1 } # (: c'est une feuille sans label avec distance else if (substr(x.tre, i, i + 1) == "(:") { kext <- kext + 1 add <- paste("Ext", kext, sep = "") x.tre <- paste(substring(x.tre, 1, i), add, substring(x.tre, i + 1), sep = "") i <- i + 1 } # ,: c'est une feuille sans label avec distance else if (substr(x.tre, i, i + 1) == ",:") { kext <- kext + 1 add <- paste("Ext", kext, sep = "") x.tre <- paste(substring(x.tre, 1, i), add, substring(x.tre, i + 1), sep = "") i <- i + 1 } # ), c'est un noeud sans label else if (substr(x.tre, i, i + 1) == "),") { kint <- kint + 1 add <- paste("I", kint, sep = "") x.tre <- paste(substring(x.tre, 1, i), add, substring(x.tre, i + 1), sep = "") i <- i + 1 } # )) c'est un noeud sans label else if (substr(x.tre, i, i + 1) == "))") { kint <- kint + 1 add <- paste("I", kint, sep = "") x.tre <- paste(substring(x.tre, 1, i), add, substring(x.tre, i + 1), sep = "") i <- i + 1 } # ): c'est un noeud sans label avec distance else if (substr(x.tre, i, i + 1) == "):") { kint <- kint + 1 add <- paste("I", kint, sep = "") x.tre <- paste(substring(x.tre, 1, i), add, substring(x.tre, i + 1), sep = "") i <- i + 1 } # ); c'est la racine sans label else if (substr(x.tre, i, i + 1) == ");") { add <- "Root" x.tre <- paste(substring(x.tre, 1, i), add, substring(x.tre, i + 1), sep = "") i <- i + 1 } } # extraction de l'information non structurelle lab.points <- strsplit(x.tre, "[(),;]")[[1]] lab.points <- lab.points[lab.points != ""] # recherche de la présence des longueurs no.long <- (regexpr(":", lab.points) == -1) # si il n'y avait aucune longueur if (all(no.long)) { lab.points <- paste(lab.points, ":", c(rep("1", length(no.long) - 1), "0.0"), sep = "") } # si il y en vait partout sauf à la racine else if (no.long[length(no.long)]) { lab.points[length(lab.points)] <- paste(lab.points[length(lab.points)], ":0.0", sep = "") } # si il y en a et il n'y en a pas -> out else if (any(no.long)) { print(x.tre) stop("Non convenient data leaves or nodes with and without length") } w <- strsplit(x.tre, "[(),;]")[[1]] w <- w[w != ""] leurre <- make.names(w, unique = TRUE) leurre <- gsub("[.]","_", leurre) for (i in 1:length(w)) { old <- paste(w[i]) x.tre <- sub(old, leurre[i], x.tre,fixed = TRUE) } # extraction des labels et des longueurs w <- strsplit(lab.points, ":") label <- function(x) { # ici on peut travailler sur les labels lab <- x[1] lab <- gsub("[.]","_", lab) return (lab) } longueur <- function(x) { long <- x[2] return (long) } labels <- unlist(lapply(w, label)) longueurs <- unlist(lapply(w, longueur)) # ici on peut travailler sur les labels labels <- make.names(labels, TRUE) labels <- gsub("[.]","_", labels) w <- labels for (i in 1:length(w)) { new <- w[i] x.tre <- sub(leurre[i], new, x.tre) } # on les a remis à leur place cat <- rep("", length(w)) for (i in 1:length(w)) { new <- w[i] if (regexpr(paste("\\)", new, sep = ""), x.tre) != -1) cat[i] <- "int" else if (regexpr(paste(",", new, sep = ""), x.tre) != -1) cat[i] <- "ext" else if (regexpr(paste("\\(", new, sep = ""), x.tre) != -1) cat[i] <- "ext" else cat[i] <- "unknown" } return(list(tre = x.tre, noms = labels, poi = as.numeric(longueurs), cat = cat)) } res <- complete(x.tre) poi <- res$poi nam <- res$noms names(poi) <- nam cat <- res$cat res <- list(tre = res$tre) res$leaves <- poi[cat == "ext"] names(res$leaves) <- nam[cat == "ext"] res$nodes <- poi[cat == "int"] names(res$nodes) <- nam[cat == "int"] listclass <- list() dnext <- c(names(res$leaves), names(res$nodes)) listpath <- as.list(dnext) names(listpath) <- dnext x.tre <- res$tre while (regexpr("[(]", x.tre) != -1) { a <- regexpr("\\([^\\(\\)]*\\)", x.tre) n1 <- a[1] + 1 n2 <- n1 - 3 + attr(a, "match.length") chasans <- substring(x.tre, n1, n2) chaavec <- paste("\\(", chasans, "\\)", sep = "") nam <- unlist(strsplit(chasans, ",")) w1 <- strsplit(x.tre, chaavec)[[1]][2] parent <- unlist(strsplit(w1, "[,\\);]"))[1] listclass[[parent]] <- nam x.tre <- gsub(chaavec, "", x.tre) w2 <- which(unlist(lapply(listpath, function(x) any(x[1] == nam)))) for (i in w2) { listpath[[i]] <- c(parent, listpath[[i]]) } } res$parts <- listclass res$paths <- listpath dnext <- c(res$leaves, res$nodes) names(dnext) <- c(names(res$leaves), names(res$nodes)) res$droot <- unlist(lapply(res$paths, function(x) sum(dnext[x]))) res$call <- call class(res) <- "phylog" if (!add.tools) return(res) return(newick2phylog.addtools(res)) } "hclust2phylog" <- function (hc, add.tools = TRUE) { if (!inherits(hc, "hclust")) stop("'hclust' object expected") labels.leaves <- make.names(hc$labels, TRUE) nnodes <- nrow(hc$merge) labels.nodes <- paste("Int", 1:nnodes, sep = "") l.bra <- matrix("$", nnodes, 2) for (i in nnodes:1) { for (j in 1:2) { if (hc$merge[i, j] < 0) l.bra[i, j] <- as.character(hc$height[i]) else l.bra[i, j] <- as.character(hc$height[i] - hc$height[hc$merge[i, j]]) } } l.eti <- matrix("$", nnodes, 2) for (i in nnodes:1) { for (j in 1:2) { if (hc$merge[i, j] > 0) l.eti[i, j] <- labels.nodes[hc$merge[i, j]] else l.eti[i, j] <- labels.leaves[-hc$merge[i, j]] } } tre <- paste("(", l.eti[nnodes, 1], ":", l.bra[nnodes, 1], ",", l.eti[nnodes, 2], ":", l.bra[nnodes, 2], ")Root:0.0;", sep = "") for (j in (nnodes - 1):1) { w <- paste("(", l.eti[j, 1], ":", l.bra[j, 1], ",", l.eti[j, 2], ":", l.bra[j, 2], ")", labels.nodes[j], ":", sep = "") tre <- gsub(paste(labels.nodes[j], ":", sep = ""), w, tre) } res <- newick2phylog(tre, add.tools, call=match.call()) return(res) } taxo2phylog <- function (taxo, add.tools = FALSE, root = "Root", abbrev = TRUE) { if (!inherits(taxo, "taxo")) stop("Object 'taxo' expected") nc <- ncol(taxo) for (k in 1:nc) { w <- as.character(k) w <- paste("l", w, sep="") w1 <- levels(taxo[,k]) if (abbrev) w1 <- abbreviate(w1) levels(taxo[,k]) <- paste(w, w1,sep="") } leaves.names <- row.names(taxo) res <- paste(root,";",sep="") x <- taxo[, nc] xred <- as.character(levels(x)) w <- "(" for (i in xred) w <- paste(w, i, ",", sep = "") res <- paste(w, ")", res, sep = "") res <- sub(",\\)", "\\)", res) for (j in nc:1) { x <- taxo[, j] if (j>1) y <- taxo[, j - 1] else y <- as.factor(leaves.names) for (k in 1:nlevels(x)) { w <- "(" old <- as.character(levels(x)[k]) yred <- unique(y[x == levels(x)[k]]) yred <- as.character(yred) for (i in yred) w <- paste(w, i, ",", sep = "") w <- paste(w, ")", old, sep = "") w <- sub(",\\)", "\\)", w) res <- gsub(old, w, res) } } return(newick2phylog(res, add.tools, call = match.call())) } "newick2phylog.addtools" <- function(res, tol =1e-07) { nleaves <- length(res$leaves) # nombre de feuilles nnodes <- length(res$nodes) # nombre de noeuds node.names <- names(res$nodes) # noms des feuilles leave.names <- names(res$leaves) # noms des noeuds dimnodes<-unlist(lapply(res$parts,length)) # nombres de descendants immédiats de chaque noeud effnodes <- dimnodes # recevra le nombre de descendants total de chaque noeud wnodes <- lgamma(dimnodes+1) # recevra le logarithme du nombre de permuations compatibles # avec la sous-arborescence associée à chaque noeud # les matrices de proximité # a <- matrix(0, nleaves, nleaves) ia <- as.numeric(col(a)) ja <- as.numeric(row(a)) a <- cbind(ia, ja)[ia < ja, ] # a contient la liste des couples de feuilles floc1 <- function(x) { # x est un couple de numéros de deux feuilles i, avec i1) { # on ajoute le vecteur dérivé de 1n w <- cbind(rep(1,nleaves),eig$vectors[,w0]) # on orthonormalise l'ensemble w <- qr.Q(qr(w)) # on met les valeurs propres à 0 eig$values[w0] <- 0 # on remplace les vecteurs du noyau par une base orthonormée contenant # en première position le parasite eig$vectors[,w0] <- w[,-ncol(w)] # on enlève la position du parasite w0 <- (1:nleaves)[-w0[1]] } rank <- length(w0) res$Avalues <- eig$values[w0]*nleaves ############################# # la composante Avalues contient les valeurs propres de QAQ ############################# res$Adim <- sum(res$Avalues>tol) ############################# # la composante Adim contient le nombre de valeurs propres positives # associées à la composante positive de la variance ############################# w <- eig$vectors[,w0]*sqrt(nleaves) w <- data.frame(w) row.names(w) <- leave.names names(w) <- paste("A",1:rank,sep="") res$Ascores <- w ############################# # la composante Ascores contient une base orthobormée de l'orthogonal de n # pour la pondération uniforme. Elle définit un phylogramme ############################# # Complément : la valeur des noeuds # floc3 <- function(k) { # k est un numéro de noeud # x est un vecteur comportant un nom de noeud et des noms de descendants # de ce noeud. # A la fin parts wnodes contient le logarithme # du nombre de permutations compatibles de chaque sous-arbre # et effnodes contient le nombre de descendants de chaque sous-arbre y <- res$parts[[k]] x <- y[y%in%names(res$nodes)] n1 <- names(res$parts)[k] if (length(x)<=0) return(NULL) effnodes[n1] <<- effnodes[n1] - length(x) + sum(effnodes[x]) wnodes[n1] <<- wnodes[n1] + sum(wnodes[x]) return(NULL) } lapply(1:length(res$parts),floc3) # typolo.value <- 1-exp(wnodes-lgamma(effnodes+1)) abandon ####res$Aparam <- data.frame(x1=I(dimnodes), x2=I(effnodes), x3=I(wnodes), x4=I(typolo.value)) res$Aparam <- data.frame(ndir=dimnodes, nlea=effnodes, lnperm=I(wnodes)) ############################# # la composante Aparam est un data.frame de paramètre sur l'ensemble des noeuds # x1 = nombre de descendants directs # x2 = nombre de feuilles descendantes # x3 = log du nombre de permutations compatibles avec la phylogénie extraite # x4 = 1-rapport du nombre de permutations compatibles sur le nombre de permutations totales # pour la phylogénie extraite dans ce noeud # cet indice vaut 0 si le noeud est final et est maximal à la racine # attention il ne vaut pas 1 mais 1-epsilon quand il est affiché 1 ############################# # Complément : la base B # w1 <- matrix(0, nleaves, nnodes) ####x1 <- res$Aparam$x2 #le nombre de feuilles descendantes x1 <- res$Aparam$lnperm #on trie sur le log des permutations # on calcule une matrice auxiliaire pour avoir la liste des feuilles descendantes # pour chacun des noeuds dimnames(w1) <- list(leave.names, names(x1)) for (i in leave.names) { ancetres <- res$paths[[i]] ancetres <- rev(ancetres)[-1]#rev(ancetres[-1])[-1] w1[i, ancetres] <- 1 } w1 <- cbind(w1, diag(1, nleaves)) dimnames(w1)[[2]] <- c(names(x1),leave.names) x1 <- c(x1, rep(-1,nleaves)) names(x1) <-dimnames(w1)[[2]] # La matrice w1 contient 1 en i-j si la feuille i descend du noeud j ###################################### # on construit une famille d'indicatrices de classes # Une arête de l'arborescence est un lien de descendance # Chaque noeud et chaque feuille (à l'expection de la racine) a un seul ascendant # Il y a n+f-1 arêtes. Le noeud j a m(j) descendants # Les feuilles n'en n'ont pas. Donc m(1)+m(2)+ ... + m(n) = n+f-1 # Il y a n+f-1 arêtes réparties en n blocs. # Il y a donc n+f-1-n=f-1 descendants indicateurs DI quand on enlève une arête descendante par noeud # Rien n'est conservé pour un noeud avec un seul descendant # Pour chaque DI on utilise l'indicatrice de la classe des feuilles descendant de cet noeud # la composante Bindica contient f-1 indicatrices de classes de feuilles # names (w) contient des noms de descendants # nomuni contient les noms de DI pour l'étiquetage final #################################### funnoe <- function (noeud) { # renvoie pour un noeud une liste dont chaque composante est un descendant immédiat du noeud # caractérisé par la liste des feuilles qui en descendent sous forme de matrice # d'indicatrices. Le dernier descendant immédiat du noeud est éliminé. x <- res$parts[[noeud]] # les descendants immédiats xval <- x1[x] # le nombre de feuilles descendantes des descendants xval <- rev(sort(xval)) # triée x <- names(xval) # on récupère lesquels x <- x[-length(x)] # on enlève le dernier if (length(x) ==0) return(NULL) if (length(x) ==1) xmat <- matrix(w1[,x],ncol=1,dimnames=list(leave.names,noeud)) else { xmat <- w1[,x] dimnames(xmat)[[2]] <- rep(noeud, ncol(xmat)) } return (list(xmat, x)) # les noms des colonnes de xmat repète le nom du noeud # dans y on a le nom des descendants retenus } nomuni <- NULL w <- matrix(1,nleaves,1) dimnames(w) <- list(leave.names, "un") for (i in names(x1)[1:nnodes]) { provi <- funnoe(i) if (!is.null(provi)) { w <-cbind(w, provi[[1]]) nomuni <- c(nomuni,provi[[2]]) } } w <- w[,-1] nomrepet <- dimnames(w)[[2]] names(nomrepet) <- nomuni dimnames(w)[[2]] <- nomuni names(nomuni) <- nomuni ############################# # Les indicatrices sont classées par ordre décroissant # de xtQWQx la variance phylogénétique formelle de l'indicatrice centrée # Bindica n'a qu'une valeur pédagogique et ne sert pas explicitement # mais la procédure est simple # 1) définition des indicatrices, il y en a toujours f-1 # 2) rangement par valeur décroissante de la forme quadratique # Ce rangement est conservé dans res$Bindica # les valeurs du critère de rangement dans Bvalues # 3) rajout de 1n devant # 4) orthonormalisation # on obtient toujours une base orthonormée de l'orthogonal de 1n ############################# w.val <- x1[nomuni] # trie par ordre descendant w.val <- rev(sort(w.val)) # lesquels w <- w[,names(w.val)] # nomrepet / w sont triés nomrepet <- nomrepet[names(w.val)] res$Bindica <- as.data.frame(w) w <- cbind(rep(1,nleaves),w) w <- qr.Q(qr(w)) w <- w[, -1] * sqrt(nleaves) w <- data.frame(w) row.names(w) <- leave.names names(w) <- paste("B",1:(nleaves-1),sep="") res$Bscores <- w ### res$Bvalues <- w.val lw <- lapply(node.names, function (x) which(nomrepet==x)) names(lw) <- node.names fun1 <- function (x) { if (length(x)==0) return("x") if (length(x)==1) return(as.character(x)) y <- x[1] for(k in 2:length(x)) y <- paste(y,x[k],sep="/") return(y) } lw <- unlist(lapply(lw, fun1)) res$Blabels <- lw return(res) } ade4/R/cailliez.R0000644000176200001440000000160612576021756013225 0ustar liggesusers"cailliez" <- function (distmat, print = FALSE, tol = 1e-07, cor.zero = TRUE) { if (is.euclid(distmat)) { warning("Euclidean distance found : no correction need") return(distmat) } distmat <- as.matrix(distmat) size <- ncol(distmat) m1 <- matrix(0, size, size) m1 <- rbind(m1, -diag(size)) m2 <- -bicenter.wt(distmat * distmat) m2 <- rbind(m2, 2 * bicenter.wt(distmat)) m1 <- cbind(m1, m2) lambda <- eigen(m1, only.values = TRUE)$values c <- max(Re(lambda)[Im(lambda) < tol]) if (print) cat(paste("Cailliez constant =", round(c, digits = 5), "\n")) if(cor.zero){ distmat[distmat > tol] <- distmat[distmat > tol] + c distmat <- as.dist(distmat) } else { distmat <- as.dist(distmat + c) } attr(distmat, "call") <- match.call() attr(distmat, "method") <- "Cailliez" return(distmat) } ade4/R/scatter.R0000644000176200001440000000013312576021756013070 0ustar liggesusers############ scatter ################# "scatter" <- function (x, ...) UseMethod("scatter") ade4/R/quasieuclid.R0000644000176200001440000000104612576021756013737 0ustar liggesusers"quasieuclid" <- function (distmat) { if (is.euclid(distmat)) { warning("Euclidean distance found : no correction need") return(distmat) } res <- as.matrix(distmat) n <- ncol(res) delta <- -0.5 * bicenter.wt(res * res) eig <- eigen(delta, symmetric = TRUE) ncompo <- sum(eig$value > 0) tabnew <- eig$vectors[, 1:ncompo] * rep(sqrt(eig$values[1:ncompo]), rep(n, ncompo)) res <- dist(tabnew) attributes(res) <- attributes(distmat) attr(res, "call") <- match.call() return(res) } ade4/R/randtest.pcaiv.R0000644000176200001440000000204313276234364014351 0ustar liggesusers"randtest.pcaiv" <- function (xtest, nrepet = 99, ...) { if (!inherits(xtest, "dudi")) stop("Object of class dudi expected") if (!inherits(xtest, "pcaiv")) stop("Type 'pcaiv' expected") appel <- as.list(xtest$call) dudi1 <- eval.parent(appel$dudi) df <- data.frame(eval.parent(appel$df)) y <- as.matrix(dudi1$tab) inertot <- sum(dudi1$eig) sqlw <- sqrt(dudi1$lw) sqcw <- sqrt(dudi1$cw) fmla <- as.formula(paste("y ~", paste(names(df), collapse = "+"))) mf <- model.frame(fmla, data = cbind.data.frame(y, df)) mt <- attr(mf, "terms") x <- model.matrix(mt, mf) wt <- outer(sqlw, sqcw) ## Fast function for computing sum of squares of the fitted table obs <- sum((lm.wfit(y = y,x = x, w = dudi1$lw)$fitted.values * wt)^2) / inertot isim <- rep(NA, nrepet) for(i in 1:nrepet) isim[i] <- sum((lm.wfit(y = y, x = x[sample(nrow(x)), ], w = dudi1$lw)$fitted.values * wt)^2) / inertot return(as.randtest(sim = isim, obs = obs, call = match.call(), ...)) } ade4/R/niche.R0000644000176200001440000001270313050632301012475 0ustar liggesusers"niche" <- function (dudiX, Y, scannf = TRUE, nf = 2) { if (!inherits(dudiX, "dudi")) stop("Object of class dudi expected") lig1 <- nrow(dudiX$tab) if (!is.data.frame(Y)) stop("Y is not a data.frame") lig2 <- nrow(Y) if (lig1 != lig2) stop("Non equal row numbers") w1 <- apply(Y, 2, sum) if (any(w1 <= 0)) stop(paste("Column sum <=0 in Y")) Y <- sweep(Y, 2, w1, "/") w1 <- w1/sum(w1) tabcoiner <- t(as.matrix(Y)) %*% (as.matrix(dudiX$tab)) tabcoiner <- data.frame(tabcoiner) names(tabcoiner) <- names(dudiX$tab) row.names(tabcoiner) <- names(Y) if (nf > dudiX$nf) nf <- dudiX$nf nic <- as.dudi(tabcoiner, dudiX$cw, w1, scannf = scannf, nf = nf, call = match.call(), type = "niche") U <- as.matrix(nic$c1) * unlist(nic$cw) U <- data.frame(as.matrix(dudiX$tab) %*% U) row.names(U) <- row.names(dudiX$tab) names(U) <- names(nic$c1) nic$ls <- U U <- as.matrix(nic$c1) * unlist(nic$cw) U <- data.frame(t(as.matrix(dudiX$c1)) %*% U) row.names(U) <- names(dudiX$li) names(U) <- names(nic$li) nic$as <- U return(nic) } "plot.niche" <- function (x, xax = 1, yax = 2, ...) { if (!inherits(x, "niche")) stop("Use only with 'niche' objects") if (x$nf == 1) { warnings("One axis only : not yet implemented") return(invisible()) } if (xax > x$nf) stop("Non convenient xax") if (yax > x$nf) stop("Non convenient yax") def.par <- par(no.readonly = TRUE) on.exit(par(def.par)) layout(matrix(c(1, 2, 3, 4, 4, 5, 4, 4, 6), 3, 3), respect = TRUE) par(mar = c(0.1, 0.1, 0.1, 0.1)) s.corcircle(x$as, xax, yax, sub = "Axis", csub = 2, clabel = 1.25) s.arrow(x$c1, xax, yax, sub = "Variables", csub = 2, clabel = 1.25) scatterutil.eigen(x$eig, wsel = c(xax, yax)) s.label(x$ls, xax, yax, clabel = 0, cpoint = 2, sub = "Samples and Species", csub = 2) s.label(x$li, xax, yax, clabel = 1.5, add.plot = TRUE) s.label(x$ls, xax, yax, clabel = 1.25, sub = "Samples", csub = 2) s.distri(x$ls, eval.parent(as.list(x$call)[[3]]), cstar = 0, axesell = FALSE, cellipse = 1, sub = "Niches", csub = 2) } "print.niche" <- function (x, ...) { if (!inherits(x, "niche")) stop("to be used with 'niche' object") cat("Niche analysis\n") cat("call: ") print(x$call) cat("class: ") cat(class(x), "\n") cat("\n$rank (rank) :", x$rank) cat("\n$nf (axis saved) :", x$nf) cat("\n$RV (RV coeff) :", x$RV) cat("\n\neigen values: ") l0 <- length(x$eig) cat(signif(x$eig, 4)[1:(min(5, l0))]) if (l0 > 5) cat(" ...\n\n") else cat("\n\n") sumry <- array("", c(3, 4), list(1:3, c("vector", "length", "mode", "content"))) sumry[1, ] <- c("$eig", length(x$eig), mode(x$eig), "eigen values") sumry[2, ] <- c("$lw", length(x$lw), mode(x$lw), "row weigths (crossed array)") sumry[3, ] <- c("$cw", length(x$cw), mode(x$cw), "col weigths (crossed array)") print(sumry, quote = FALSE) cat("\n") sumry <- array("", c(7, 4), list(1:7, c("data.frame", "nrow", "ncol", "content"))) sumry[1, ] <- c("$tab", nrow(x$tab), ncol(x$tab), "crossed array (averaging species/sites)") sumry[2, ] <- c("$li", nrow(x$li), ncol(x$li), "species coordinates") sumry[3, ] <- c("$l1", nrow(x$l1), ncol(x$l1), "species normed scores") sumry[4, ] <- c("$co", nrow(x$co), ncol(x$co), "variables coordinates") sumry[5, ] <- c("$c1", nrow(x$c1), ncol(x$c1), "variables normed scores") sumry[6, ] <- c("$ls", nrow(x$ls), ncol(x$ls), "sites coordinates") sumry[7, ] <- c("$as", nrow(x$as), ncol(x$as), "axis upon niche axis") print(sumry, quote = FALSE) cat("\n") } "niche.param" <- function(x) { if (!inherits(x, "niche")) stop("Object of class 'niche' expected") appel <- as.list(x$call) X <- eval.parent(appel[[2]])$tab Y <- eval.parent(appel[[3]]) w1 <- apply(Y, 2, sum) if (any(w1 <= 0)) stop(paste("Column sum <=0 in Y")) Y <- sweep(Y, 2, w1, "/") calcul.param <- function(freq,mil) { inertia <- sum(freq * mil * mil) m <- apply(freq * mil, 2, sum) margi <- sum(m^2) mil <- t(t(mil) - m) tolt <- sum(freq * mil * mil) u <- m/sqrt(sum(m^2)) z <- mil %*% u tolm <- sum(freq * z * z) tolr <- tolt - tolm w <- c(inertia, margi, tolm, tolr) names(w) <- c("inertia", "OMI", "Tol", "Rtol") w1 <- round(w[2:4]/w[1], digits = 3) * 100 names(w1) <- c("omi", "tol", "rtol") return(c(w, w1)) } res <- apply(Y, 2, calcul.param,mil=X) t(res) } rtest.niche <- function(xtest, nrepet = 99,...){ if (!inherits(xtest, "dudi")) stop("Object of class dudi expected") if (!inherits(xtest, "niche")) stop("Type 'niche' expected") appel <- as.list(xtest$call) X <- eval.parent(appel$dudiX)$tab Y <- eval.parent(appel$Y) w1 <- apply(Y, 2, sum) if (any(w1 <= 0)) stop(paste("Column sum <=0 in Y")) Y <- sweep(Y, 2, w1, "/") calcul.margi <- function(freq,mil) { m <- apply(freq * mil, 2, sum) return(sum(m^2)) } obs <- apply(Y,2,calcul.margi,mil=X) ## we compute and test the average marginality for all species (OMI.mean) obs <- c(obs, OMI.mean = mean(obs)) sim <- sapply(1:nrepet,function(x) apply(apply(Y,2,sample),2,calcul.margi,mil=X)) sim <- rbind(sim, OMI.mean=apply(sim,2,mean)) res <- as.krandtest(obs=obs,sim=t(sim), ...) return(res) } ade4/R/dotcircle.R0000644000176200001440000000333612576021756013403 0ustar liggesusers"dotcircle" <- function (z,alpha0=pi/2,xlim=range(pretty(z)),labels=names(z),clabel=1,cleg=1) { if (!is.numeric(z)) stop("z is not numeric") n <- length(z) if (n<=2) stop ("length(z)<3") if (is.null (labels)) clabel <- 0 if (length(labels)!=length(z)) clabel <- 0 alpha <- alpha0-(1:n)*2*pi/n leg <- xlim leg0 <- (leg-min(leg))/(max(leg)-min(leg))*0.8+0.2 z0 <- (z-min(leg))/(max(leg)-min(leg))*0.8+0.2 opar <- par(mar = par("mar"),srt=par("srt")) on.exit(par(opar)) par(mar = c(0.1, 0.1, 0.1, 0.1)) x <- z0*cos(alpha) y <- z0*sin(alpha) plot( c(0,0), type = "n", ylab = "", asp = 1, xaxt = "n", yaxt = "n", frame.plot = FALSE, xlim=c(-1.2,1.2), ylim=c(-1.2,1.2)) # if (clabel > 0) scatter.util.eti.circ(x, y, label, clabel) # if (csub > 0) scatter.util.sub(sub, csub, possub) # if (box) box() symbols(0, 0, circles=0.2,inches=FALSE,add=TRUE) for (i in 1:2) { symbols(0, 0, circles=leg0[i],inches=FALSE,add=TRUE,fg=grey(0.5)) } points(x,y,type="o",pch=20,cex=2) segments(x[n],y[n],x[1],y[1]) segments(0.2*cos(alpha),0.2*sin(alpha),x,y) if (clabel>0) { for (i in 1:n) { par(srt=alpha[i]*360/2/pi) text(1.1*cos(alpha[i]),1.1*sin(alpha[i]),labels[i],adj=0,cex=par("cex")*clabel) segments(cos(alpha[i]),sin(alpha[i]),1.1*cos(alpha[i]),1.1*sin(alpha[i]),col=grey(0.5)) } } par(srt=0) if (cleg>0) { s.label(cbind.data.frame(c(0.2,0,-0.2,0),c(0,-0.2,0,0.2)), label=as.character(rep(leg[1],4)),add.plot=TRUE,clabel=cleg) s.label(cbind.data.frame(c(1,0,-1,0),c(0,-1,0,1)), label=as.character(rep(leg[2],4)),clabel=cleg, add.plot=TRUE) } } ade4/R/s.value.R0000644000176200001440000000664312576021756013014 0ustar liggesusers"s.value" <- function (dfxy, z, xax = 1, yax = 2, method = c("squaresize", "greylevel"), zmax=NULL, csize = 1, cpoint = 0, pch = 20, clegend = 0.75, neig = NULL, cneig = 1, xlim = NULL, ylim = NULL, grid = TRUE, addaxes = TRUE, cgrid = 0.75, include.origin = TRUE, origin = c(0, 0), sub = "", csub = 1, possub = "topleft", pixmap = NULL, contour = NULL, area = NULL, add.plot = FALSE) { # modif samedi, novembre 29, 2003 at 08:43 le coefficient de taille # est rapporté aux bornes utilisateurs pour reproduire les mêmes # valeurs sur plusieurs fenêtres dfxy <- data.frame(dfxy) if (length(z) != nrow(dfxy)) stop(paste("Non equal row numbers", nrow(dfxy), length(z))) opar <- par(mar = par("mar")) on.exit(par(opar)) par(mar = c(0.1, 0.1, 0.1, 0.1)) coo <- scatterutil.base(dfxy = dfxy, xax = xax, yax = yax, xlim = xlim, ylim = ylim, grid = grid, addaxes = addaxes, cgrid = cgrid, include.origin = include.origin, origin = origin, sub = sub, csub = csub, possub = possub, pixmap = pixmap, contour = contour, area = area, add.plot = add.plot) if (!is.null(neig)) { if (is.null(class(neig))) neig <- NULL if (class(neig) != "neig") neig <- NULL deg <- attr(neig, "degrees") if ((length(deg)) != (length(coo$x))) neig <- NULL } if (!is.null(neig)) { fun <- function(x, coo) { segments(coo$x[x[1]], coo$y[x[1]], coo$x[x[2]], coo$y[x[2]], lwd = par("lwd") * cneig) } apply(unclass(neig), 1, fun, coo = coo) } method <- method [1] if (method == "greylevel") { br0 <- pretty(z, 6) nborn <- length(br0) coeff <- diff(par("usr")[1:2])/15 numclass <- cut.default(z, br0, include.lowest = TRUE, labels = FALSE) valgris <- seq(1, 0, le = (nborn - 1)) h <- csize * coeff for (i in 1:(nrow(dfxy))) { symbols(coo$x[i], coo$y[i], squares = h, bg = gray(valgris[numclass[i]]), add = TRUE, inches = FALSE) } scatterutil.legend.square.grey(br0, valgris, h/2, clegend) if (cpoint > 0) points(coo$x, coo$y, pch = pch, cex = par("cex") * cpoint) } else if (method == "squaresize") { coeff <- diff(par("usr")[1:2])/15 sq <- sqrt(abs(z)) if (is.null(zmax)) zmax <- max(abs(z)) w1 <- sqrt(zmax) sq <- csize * coeff * sq/w1 for (i in 1:(nrow(dfxy))) { if (sign(z[i]) >= 0) { symbols(coo$x[i], coo$y[i], squares = sq[i], bg = "black", fg = "white", add = TRUE, inches = FALSE) } else { symbols(coo$x[i], coo$y[i], squares = sq[i], bg = "white", fg = "black", add = TRUE, inches = FALSE) } } br0 <- pretty(z, 4) l0 <- length(br0) br0 <- (br0[1:(l0 - 1)] + br0[2:l0])/2 sq0 <- sqrt(abs(br0)) sq0 <- csize * coeff * sq0/w1 sig0 <- sign(br0) if (clegend > 0) scatterutil.legend.bw.square(br0, sq0, sig0, clegend) if (cpoint > 0) points(coo$x, coo$y, pch = pch, cex = par("cex") * cpoint) } else if (method == "circlesize") { print("not yet implemented") } if (!add.plot) box() invisible(match.call()) } ade4/R/originality.R0000644000176200001440000001300112576021756013753 0ustar liggesusersoriginality <- function (phyl, method = 5) { if (!inherits(phyl, "phylog")) stop("unconvenient phyl") if (any(is.na(match(method, 1:7)))) stop("unconvenient method") nbMeth <- length(method) nbesp <- length(phyl$leaves) nbnodes <- length(phyl$nodes) resWeights <- as.data.frame(matrix(0, nbesp, nbMeth)) rownames(resWeights) <- names(phyl$leaves) for (k in 1:nbMeth) { meth <- method[k] if (meth == 1) { interm <- (unlist(lapply(phyl$paths, length))[1:length(phyl$leaves)] - 1) res <- max(interm)/interm/sum(max(interm)/interm) resWeights[, k] <- res names(resWeights)[k] <- "VW" } if (meth == 2) { nbesp <- length(phyl$leaves) es1 <- lapply(phyl$paths[1:nbesp], function(x) x[-length(x)]) fun <- function(x) { interm <- 0 for (i in 1:length(x)) { interm <- interm + length(phyl$parts[[x[i]]]) } return(interm) } es2 <- lapply(es1, fun) es2 <- unlist(es2) res <- max(es2)/es2/sum(max(es2)/es2) resWeights[, k] <- res names(resWeights)[k] <- "M" } if (meth == 3) { len <- length(phyl$path) nam <- names(phyl$path) NbPerNode <- cbind.data.frame(Nb = rep(0, len)) rownames(NbPerNode) <- nam NbPerNode[1:nbesp, ] <- 1 for (i in (nbesp + 1):len) { NbPerNode[i, ] <- sum(NbPerNode[phyl$parts[[i - nbesp]], ]) } BinPerNode <- cbind.data.frame(Nb = rep(0, len)) CoPerNode <- NbPerNode - 1 for (i in 1:(len - nbesp)) { index <- phyl$parts[[i]] len.index <- length(index) interm <- sapply(index, function(x) CoPerNode[x, ]) if (sum(interm) == 0) { BinPerNode[index, ] <- 0 } else { if (len.index == 2) { if (interm[1] == interm[2]) { BinPerNode[index, ] <- 1/2 } else { BinPerNode[index[rank(interm)], ] <- c(0, 1) } } else { if (length(unique(interm)) == 1) { BinPerNode[index[rank(interm)], ] <- 1/len.index } else { Rank.1 <- as.factor(rank(interm)) Rank.1 <- as.numeric(Rank.1) nb.groups <- length(unique(interm)) if (nb.groups == 2) Rank.2 <- c(0, 1) else Rank.2 <- c(((nb.groups - 1):1)/nb.groups, 0)[nb.groups:1] BinPerNode[index, ] <- Rank.2[Rank.1] } } } } res <- lapply(phyl$path[1:nbesp], function(x) if (length(x) > 2) sum(BinPerNode[x[2:(length(x) - 1)], ]) else BinPerNode[x[2], ]) res <- 1/(unlist(res) + 1) res <- res/sum(res) resWeights[, k] <- res names(resWeights)[k] <- "NWU*" } if (meth == 4) { len <- length(phyl$path) nam <- names(phyl$path) NbPerNode <- cbind.data.frame(Nb = rep(0, len)) rownames(NbPerNode) <- nam NbPerNode[1:nbesp, ] <- 1 for (i in (nbesp + 1):len) { NbPerNode[i, ] <- sum(NbPerNode[phyl$parts[[i - nbesp]], ]) } res <- lapply(phyl$path[1:nbesp], function(x) sum(NbPerNode[x[2:(length(x) - 1)], ])) res <- 1/unlist(res) res <- res/sum(res) resWeights[, k] <- res names(resWeights)[k] <- "NWW" } if (meth == 5) { D <- as.matrix(phyl$Wdist^2/2) res <- solve(D) %*% rep(1, nbesp)/sum(solve(D)) resWeights[, k] <- res names(resWeights)[k] <- "QEbased" } if (meth == 6) { pathsp <- phyl$paths[1:nbesp] mat1 <- matrix(0, nbesp, nbnodes) colnames(mat1) <- names(phyl$nodes) for(i in 1:nbesp){ pathi <- phyl$path[[i]] pathi <- pathi[-length(pathi)] mat1[i, pathi] <- 1 } wedges <- cbind.data.frame(apply(mat1, 2, sum)) rownames(wedges) <- names(phyl$nodes) ndescendents <- unlist(lapply(phyl$parts, length)) reslist <- lapply(pathsp, function(x) sum(c(unlist(phyl$nodes[x[-length(x)]])/wedges[x[-length(x)], ], phyl$leaves[x[length(x)]]))) res <- unlist(reslist) resWeights[, k] <- res names(resWeights)[k] <- "ED" } if (meth == 7) { pathsp <- phyl$paths[1:nbesp] ndescendents <- unlist(lapply(phyl$parts, length)) reslist <- lapply(pathsp, function(x) sum(c(unlist(phyl$nodes[x[-length(x)]]) / rev(cumprod(rev(ndescendents[x[-length(x)]]))), phyl$leaves[x[length(x)]]))) res <- unlist(reslist) resWeights[, k] <- res names(resWeights)[k] <- "eqsplit" } } return(resWeights) } ade4/MD50000644000176200001440000007352713621233757011426 0ustar liggesusers94b7ffcbd71a2a1badc222bbf8afc28d *ChangeLog f2098884983273a5f9630d4c74eb60c6 *DESCRIPTION b3dfbcf921ee696ec2bf371625b722db *NAMESPACE 6b677d2c1862d14d17ab0760f9760dcc *R/PI2newick.R 6997af57a25d43dc445092f3e845f2f1 *R/RV.rtest.R 8d43bff953af1f5d49b5e0fb16930a34 *R/RVdist.randtest.R 1fdb71cdc0f09024023a31cca767b3fa *R/add.scatter.R 0e734d91e2532e26077a357142983255 *R/ade4-deprecated.R 37c6a7f3ff5716e26988e23536784027 *R/amova.R 502c2b9fe7384a6d6d943775d23fcdde *R/apqe.R 7c7f969bf79e951b76459a2698dea1d4 *R/area.plot.R d10254f930b2a6a1c3a507d970be7440 *R/as.taxo.R 28de7a5efcd33a5dc64401650bc74fc4 *R/bca.R 19bd5c75a70fa8c8e3b16272e593bb78 *R/bca.coinertia.R 5a937fd30b98a03aebd50605c074eb89 *R/bca.rlq.R f860364cf5a51defe284ab21a88526f2 *R/betwitdpcoa.R 4489dabaa47765166b862d92290a057d *R/bicenter.wt.R 8dd0cd8dbf02182874ef72baeef006f1 *R/cailliez.R fe5999c594d12797ca6cddb017ae8a42 *R/coinertia.R 97425c6e480c2d00d7e601784350b55a *R/combine.4thcorner.R f0cc6df07e1c34e4d40080be726cd705 *R/corkdist.R c261b9d96653ab1d25f145db848a51e5 *R/costatis.R 962d566498247728b9f271993d25bd47 *R/dagnelie.test.R 9adbb2fcae2d3358747b872c126dc2d5 *R/disc.R 762df1c0044c90877cac71e453700e9d *R/discrimin.R 217c5464655177b2f2e3bedee5bc41c9 *R/discrimin.coa.R e73d7b2f41ad8eeec62d4798d22cb2ca *R/dist.binary.R 6a6eb7ef3a48d06ff13a5d16037cd2d0 *R/dist.dudi.R ad03f97042424cb32369bbc2e1ec7777 *R/dist.ktab.R cd4d8a3837676bb9d15f841a71514603 *R/dist.neig.R 73f5fd3c1ff02495564a1ee5956a8d9f *R/dist.prop.R ed17c38210a61edefa8d99ce1660b4ce *R/dist.quant.R 066c74aeba262b3c77d83739bd535d40 *R/divc.R 450778247278a7850aefbd03df04c018 *R/divcmax.R d1f0a2ec832232c3949b1d4068686239 *R/dotchart.phylog.R 7a9423dfee35852fc3545c3339d02414 *R/dotcircle.R 93829a3ce3aec8fe7c4d8a445830c23f *R/dpcoa.R 43df3b834e8caea88dae1b5ef6e3e347 *R/dudi.R 5d0c689352e79593b6b6b5bbeb3af82a *R/dudi.acm.R bb4c6c9720d6faba1fbb08cf960ef654 *R/dudi.coa.R a4b3f615781a3b1c8e44ad4942cb9165 *R/dudi.dec.R 50c539904d02771ba1bc2d8eb82dec29 *R/dudi.fca.R 61fd028d5ac9f33fc708617fb9ffb64f *R/dudi.hillsmith.R ff12dab0c407cd15bc3397e27b59c25d *R/dudi.mix.R 3eca194874645a2361ae28ac402478a7 *R/dudi.nsc.R 80d3bfcd008d5b1d9711fe5818a10081 *R/dudi.pca.R aa5542ff757e1e30a36436ae1e4da323 *R/dudi.pco.R 031a44a634bb5f432693708c3768aef5 *R/foucart.R 8088980976b1cd67f9759db87789062b *R/fourthcorner.R 60336b42bd5ee95f3ae4145506d31979 *R/fourthcorner.rlq.R 89a593d1a3097687949a2e59bbcfdd38 *R/fourthcorner2.R d2f63c500851905fe0398b3fa4dae7ab *R/gearymoran.R 4b51d288b3c7c57a485f7728676e0c56 *R/gridrowcol.R b54921287a7845457bc2f46761ef9c5a *R/inertia.dudi.R acf786e3e3c41f3820cae2ec95b94607 *R/is.euclid.R 0ba557d20dd2b8a01c4e0c7f9cc1e334 *R/kdist.R 167e53424152b046f2561f4cba06872f *R/kdist2ktab.R 242af7a73495c2e49f6f2ab7a1b0b716 *R/kdisteuclid.R 4ca5a0f36f5ca08f490e6b77f313d0ee *R/kplot.R e65a05209dd28ad95d88317e5d337154 *R/kplot.foucart.R cb3eaec7d1072769e1278736dcdc65b7 *R/kplot.mcoa.R 1fb6e092daa52d9946284c5085b8bb65 *R/kplot.mfa.R 4c200de691bde98b9066efbef53379ac *R/kplot.pta.R dabf8b637a1eb66f1208dcdc920504f3 *R/kplot.sepan.R 4c71c804258b9bc07e9bf8311a8dbcec *R/kplot.statis.R ebf1adeb0f4edeb226c99e22d31523ca *R/krandboot.R 8440c7cb6606d8e962780e58d691c9f0 *R/krandtest.R bd8808a1e276364ec39159e3f0c20519 *R/krandxval.R 85deed07d28fe236504f0c13eacf1b67 *R/ktab.R 255ee82b258fe012a20bd04b37522ec6 *R/ktab.data.frame.R fe0c5da3c6f3a120ecde9f7ba600bf8b *R/ktab.list.df.R eb9fd47df55510b979820e3f3e528aab *R/ktab.list.dudi.R 9d4a9f10a538cbf896a72535ea0961b3 *R/ktab.match2ktabs.R d7b3319992f78918e90fcd49bf16e23e *R/ktab.within.R 6aa6c74464a2d1a55b2562561795cdc2 *R/lingoes.R 865f71d4617be075737dd1d22e37297d *R/mantel.randtest.R 282b41479955a96001a1b35768643bb0 *R/mantel.rtest.R f494217bd4284707773bef0441402956 *R/mbpcaiv.R e5a18eae0dbb3b3da88ad67340da0036 *R/mbpls.R f2069eaaf0ff7a8c492ca744e26241db *R/mcoa.R 7df34204586cf5a1d8851262ccf62b0b *R/mdpcoa.R 7c3bc2cbb167182b3fcddbd2d882c628 *R/mfa.R bc8897b6d8e662fa44e5b162fed075cb *R/mld.R c1e78e310e6e2bc4466825be29723bec *R/mstree.R 874c603e0edd7ce3207da8d2d17f8d7e *R/multiblock.R 5e8940534b80bb3d5e6dafffabfa5a49 *R/multispati.R c27c23c9df3020fbab16df8c5177ca67 *R/multispati.randtest.R ede7143b536c3c385b3f02685273a718 *R/multispati.rtest.R 0beb439167940efc89826a46821b217b *R/neig.R fd838d2e4e5dfd6fe33a979856943fe3 *R/newick2phylog.R 5b6be61c1ce090ebc3d7c2fad52e9a1b *R/niche.R a5939daada55ec456b59114d9f8ccbb1 *R/nipals.R e66347d5ded70e8e4e7813992cc61db1 *R/originality.R 91b2d6977ee59f2c277f25cc8a8ed8b7 *R/orthobasis.R 521653f773c0cd262df985b09fb16b48 *R/p.adjust.4thcorner.R c55d5f7719d4967dca129e6442923802 *R/pcaiv.R 430d40e502d64d32b46514eef65b1b77 *R/pcaivortho.R 9c5939393dc9d930a76ed5198ca13dbb *R/pcoscaled.R 7fb5aae46168406971e84d0ab89029fc *R/phylog.R c3a560292c8d32a4255facfa5fdfbd92 *R/plot.4thcorner.R 3096ec927cccc0f3884de2589da19a98 *R/plot.phylog.R 348263fd55483db1486392c794f10f87 *R/print.4thcorner.R 912cf5227f77a178e3a816c7ac722a32 *R/procuste.R d3da45b867073b05dcff18c59e7aa4c7 *R/procuste.randtest.R 36ed83c95f350afb554284f83ee73e0b *R/procuste.rtest.R b9ea3592cbc6bd086555067572cdf291 *R/pta.R 83adfebc61e4cf82a35faa164fbfdec0 *R/quasieuclid.R 724fb865747d7a8e3d135b34f3f2dc55 *R/randboot.R 78de2c2c0e973cd080e01a5d96c94414 *R/randtest-internal.R 744ab897f6c77dc8ec232c9e83caed17 *R/randtest.R 07f51d6442a757fd5317b7e61389e13e *R/randtest.amova.R 02c2e72ec7f369bf34a1691e8db38832 *R/randtest.between.R b59ad08ad77ab61c9415d1d37f5899fc *R/randtest.coinertia.R 9c990f7f1bb883b8bf50d47c13ff67ba *R/randtest.discrimin.R c1f24646f76da2d109250246b9359e58 *R/randtest.dpcoa.R 5d9e9ff4cc2f01ec6973e7678bdab54f *R/randtest.pcaiv.R d494a580b2eb22f88afc106cde1a0ac0 *R/randtest.pcaivortho.R 35e9b020452713720e3c6a51d937c152 *R/randtest.rlq.R 2c43d2ad5a0a2c0508d5df3ad671707f *R/randxval.R 7702275332a65be5ac06e6c9239d06fa *R/reconst.R 4a52f92708a582c01c519edd230b501d *R/rlq.R 0f0308ccb9f7888ad2f97d8f1b13de9a *R/rtest.R 83e60a3ab815d5dddcdbf97d74bc2bfe *R/rtest.between.R 1c3f5d3b4ce4db19cc4842035fc7c75f *R/rtest.discrimin.R 37f03878e48caf84b7e21949c0403372 *R/s.arrow.R ee7438d4ae55f221a0d5fd5e2673ae42 *R/s.chull.R 2354f21cf9e15b3d6a558a5d3be3c291 *R/s.class.R aca9b2053b00c8a285477b1d82497e8a *R/s.corcircle.R b11ecd30666290a614164d1c9e933ac5 *R/s.distri.R 3097b3b56620aef1a0268c218134cb3b *R/s.hist.R 2dd98e6fd768f9193ee7db30ba44fef2 *R/s.image.R 67bed191875128229cccad6411a44305 *R/s.kde2d.R be929b7c75019b547824ed6ec8319a45 *R/s.label.R 724ecfed04fce15e683a466ddf8d1f1c *R/s.logo.R c74d15198a58d51c8a7fdd71a7b386e3 *R/s.match.R 4b690bf8b363093006d16f245905037d *R/s.match.class.R 00fe604bc5ee1e759955d7c4921ecd00 *R/s.multinom.R 5476ea737de231e36c59555006f6d8d4 *R/s.traject.R 22c03c187ff4696e5b8c786f9b6c7a96 *R/s.value.R f2c8fbdd4f688cf81a6012d27b6b8244 *R/scalewt.R a33c87d64739e5a33918a6d23a1c0829 *R/scatter.R b8c39feef57fc4df49f577e6f93d16ac *R/scatter.acm.R 75ee34c98af22b79254625ad67e04270 *R/scatter.coa.R c13595137e55e094a400e873921a74af *R/scatter.dudi.R 0d2c370a3abd0e4715c2b49ad2979a65 *R/scatter.fca.R 57b4cc465aa38d950e9972b9305dcc89 *R/scatterutil.R 31b7f139c1a72ed48b150058424dbb21 *R/sco.boxplot.R fee5ae7ff8af4dd378d7a942f4d2b694 *R/sco.class.R 9ef8135934d952ba979d9ee5632df19e *R/sco.distri.R 7e509c1b0ae74783603be56049ef56af *R/sco.gauss.R 19e7719adf1d4879e96c1c23e9a53049 *R/sco.label.R f46b610e8da21161bf7092671fc38ddd *R/sco.match.R 7847c55980e360e43a983958804d02cb *R/sco.quant.R bc1f1118378060e2c1d355373a9f678e *R/score.R f0baedc9da6b042275c3319b4cca3e02 *R/score.acm.R dacda9698d458c48c8b8c49e838e7b1e *R/score.coa.R db96b4cbb4c11ca86b0a544075255b9a *R/score.mix.R 9e9449fffafbff1d9c12ca85bca86bde *R/score.pca.R d67e8a64c7a071245ace529759b5d933 *R/sepan.R de0654a2aee115e8ae7fc40fb244886e *R/statico.R 3e938376057c60fbe88a4b8c8e9832ac *R/statis.R 91c6e96e5a83ae05746a1de1288c145c *R/summary.4thcorner.R 834b2cb4dffc468ba24caaeb0283c40c *R/supcol.R 75906367d78ef6392d01d1768daf8f79 *R/supdist.R c9a63e6c11929fa56e927d8537a410e2 *R/suprow.R c3e87c6f6f8239a62e083de02646648c *R/suprow.pta.R 19128aaadc6cb691920aaeb97679551c *R/symbols.phylog.R bc70ddf20e036e5273144e0628a20165 *R/table.cont.R 471ba8b286985e644cf15d7ff3f2bdb7 *R/table.dist.R 5cf4e431a04010a26419c634a0098ffa *R/table.paint.R d0b935b44a81934e3f4c89bb14cc4265 *R/table.phylog.R 3f7d897a61a6cd27d87c8567f544db25 *R/table.value.R 98c9a30099d8ed5c8201fdde18741876 *R/testdim.R cfb7cb01b37b71aa72172191bb85e38a *R/triangle.class.R faf7e25c608e2b48cd4162840d6cd414 *R/triangle.plot.R 86ade522f518bf2f86527fdd34fc488d *R/uniquewt.df.R 2cfbbd8d156fbe40952cd517f7d80c8a *R/utilities.R a5e3adba52299bbc266614bfb129c5dc *R/variance.phylog.R 4083a4882d7479a53e0335e349c8dcb3 *R/varipart.R 25899983bb398dbc252ef20a1067cc4f *R/wca.R 890181d1f162d8070b7a20705203aac4 *R/wca.coinertia.R fc7ad0d60c544e7fb0cda0fbb4f1c0a1 *R/wca.rlq.R ae76386dca7368d10a0fe45f5359b695 *R/withinpca.R 6dc08edd27a3613101e7d5cb8a8fd166 *R/witwit.R 120a205bd4dd852cb90b6e3cadd2c5cd *R/witwitsepan.R c06998c47095079d17dd3cd12e08a21e *data/abouheif.eg.rda e0cd641217952ecfc5a848b94eba4c09 *data/acacia.rda 2ca97a8b530f94fc412e0ba8d1967934 *data/aminoacyl.rda ddf7f1a15044529ff08ae157d528d460 *data/apis108.rda 9a6731c18c01ba678c35477a35d552a5 *data/aravo.rda 85ddd5f1083fd1ffea26364971b0b4ea *data/ardeche.rda 60bff6ac74b649f60434b86119915b80 *data/arrival.rda baaf2393a8bf4630f06255e7d58525c4 *data/atlas.rda 00bf611f96db4e5cf4ddc1b993853a18 *data/atya.rda 6e85f7cd5c140429cbca04b53e119257 *data/avijons.rda 714b789d5c33d57e095985b91ad6ee89 *data/avimedi.rda c201b7c166f8f914e213276102febb5e *data/aviurba.rda 995d8041ebf53149d9b51ae3e4f4f322 *data/bacteria.rda 3ff3565706153bba0aa8afd05ddcbdfe *data/banque.rda f4c9d1b93bf3d6044f18ec25a89e0977 *data/baran95.rda 2831bfb86a947a8775e4bbb94bb6eac1 *data/bf88.rda a492cdc12034ec1bffc719895179b3be *data/bordeaux.rda 39b9e5073f77c1eb3da496cc9ba33158 *data/bsetal97.rda de02bb44d29e9724b7fef4cc9ec680a3 *data/buech.rda 293123afc55f8fd4af350a34ce5c95b1 *data/butterfly.rda 3a2da41103bf31ec31ef9daa782c0c79 *data/capitales.rda fb47d6532985c28847275ecc7fedfc0b *data/carni19.rda c09984a0fbefea5a3f817cf606146584 *data/carni70.rda 84cc2eb9ff3e4ff524dd35eb82d3768b *data/carniherbi49.rda 36f3715058d30cac5eeb03bffe608984 *data/casitas.rda 13f3afae64fc9fde7d4c32ae0d991491 *data/chatcat.rda 5173982c5d87f689dd7d3c8dd50d3e6d *data/chats.rda 5a29afed782ef8691fb71e4091790ab0 *data/chazeb.rda 77e300127ee8fa1efa881c370a50cc68 *data/chevaine.rda f205a37d806899850cdeb864871592c9 *data/chickenk.rda c9db3e21c3bf21931517c7017d9704be *data/clementines.rda da954f02932de9549e1be4de4578fb85 *data/cnc2003.rda f9163193c51ca5fe0d240658081a63bb *data/coleo.rda 185b1d8aa1697eb0e9058ba644761b4e *data/corvus.rda 1a95a113ec1093c3365d1fe0d6e4eefb *data/datalist 95616ce8d746e812ebfbb2b87335edb4 *data/deug.rda b31d118f38cc7320dc7c321af9ff3137 *data/doubs.rda 6a9950d11a5bbe60211bc6e44fa0d4e6 *data/dunedata.rda e32092be2dfac9d9177c130d2ce01404 *data/ecg.rda 04e6a1ae9ed040d9067e657356c3dac3 *data/ecomor.rda 353c4cfae2a2adb79a9e8f0f66b40e20 *data/elec88.rda 8cada6d2d5221694d00ff3ea82f47cd9 *data/escopage.rda d833e03cf7cb5fc4b2012d975efd93ef *data/euro123.rda 385270f3002c5de9db96705ca6e40908 *data/fission.rda 82eef08fc1975120e6e183edef19ebbf *data/friday87.rda a10686bc396f59063a152426f2b47ee9 *data/fruits.rda c17e1f4d322a5811abb42a798b6a9db3 *data/ggtortoises.rda 16312dde9b3940f84fda2d0099e05e23 *data/granulo.rda 941ac27ed358b66e73eca2973f8d2ced *data/hdpg.rda c8b4793917873e0ba1b2b41b4be7bf27 *data/housetasks.rda 3c94d9c413d82bc9ddf6380357eefe74 *data/humDNAm.rda 35dccfdb5e933712ec2e5ef2058925e5 *data/ichtyo.rda ef60fda084e593c7c6ac266844e70a6d *data/irishdata.rda 04e7a6403832f9cc8ed968128aafece3 *data/julliot.rda 8e21cf3fd4f3f1ad49f147e0b15a3391 *data/jv73.rda b62c1dc15942b5ddb2d9163f64cc99d9 *data/kcponds.rda 5cf1ca3b1d313e7448e125427c33a8f2 *data/lascaux.rda d31937e2535ffe6fe6c0d72d25347aa4 *data/lizards.rda 8b0e617649b8c3b09b0f77ccd513c273 *data/macaca.rda fb0125ffc901336a5a54272b71687cec *data/macon.rda 278ba53cc2f0b50a2f6a70a2b8866a7d *data/macroloire.rda efd9c8ab4579e9631e2c030db1273ad9 *data/mafragh.rda 54f190b119437306366726f1706a003d *data/maples.rda 40d2bd58d9455ac595caf066fb24280a *data/mariages.rda 54c19ca68460205ffad1cb5b66ff1c1d *data/meau.rda 8dc0b8a7473e67c8cdf2644ff3a99e31 *data/meaudret.rda e581cf483d88f2cd3d3fcf13cf59886a *data/microsatt.rda f9b33e218603ee0ab52f253996e22fe5 *data/mjrochet.rda c5d7c2c9762f51845c2305bdd32d38b2 *data/mollusc.rda b970f77213d53e337775de895f08cdf8 *data/monde84.rda 1a6ae42c36bba890770a037a38b2c27e *data/morphosport.rda 3df25195c0f6b47833b7bfec7bd1c139 *data/newick.eg.rda 21a9dac9147550b1818c0f6d223d0d2a *data/njplot.rda 14c3816b86c150044ba874685f9d0647 *data/olympic.rda c2b7754b8a9f9048565b443dd258925c *data/oribatid.rda 70d32a1186c9b3dd0dbb7e2cefa31248 *data/ours.rda dcf24d8a524b736c8e9bafe76ab56e06 *data/palm.rda 80fc6faa84e9cb3f2f2cc8f114773fbe *data/pap.rda 218316e327f2876faa054d4b43cc7c40 *data/pcw.rda 22b873e3ba7543183adb5ca6f0e8992e *data/perthi02.rda 7b7c1a8fbfce35281b31641dd671fcfb *data/piosphere.rda 8c4dd064c8401a5e1816ab34c95a5af0 *data/presid2002.rda 09955da04f6c0d7ce2cdaa0be3fe694f *data/procella.rda b185edf10d338f98b831feb73213974d *data/rankrock.rda cfcb6aade1f15e4838c608613ed7986a *data/rhizobium.rda 687a7a973b9cae96c3589493bcfb1639 *data/rhone.rda ba73041332b4802db7e475336ab8cede *data/rpjdl.rda e1746c3cdbbea94e22f55ff22db1cad8 *data/santacatalina.rda 1c4dcff821765ad3f03e17baa63b9d56 *data/sarcelles.rda 5a350431bafaa85f65723526397aa2f3 *data/seconde.rda 2b1850fa88fa8dba364698a57acf3938 *data/skulls.rda bce6c68208129721faa086c1ec962763 *data/steppe.rda 850c34b67025bed8a26f14f5c8963209 *data/syndicats.rda cee374da7a165f0295ed916fa00294ac *data/t3012.rda 847055f5f129e0ec9f265542bd447c6a *data/tarentaise.rda 3e48c8e9f0be80a55435b610d8ed6e10 *data/taxo.eg.rda a8f4ddbaee7768272dbdf96cb8bb2e87 *data/tintoodiel.rda 5f589f8835b6ded6a70dfe8312be8817 *data/tithonia.rda 1a2da3050df84b4f88847a28934b952b *data/tortues.rda 3e4395cfb385380204db2569cb0f4407 *data/toxicity.rda f933701b341a9a8774537b4024b6af9b *data/trichometeo.rda e30d7b713ffad63530009e2233314dea *data/ungulates.rda e1d273fdc612332e6befb89cd3776561 *data/vegtf.rda 32c9418b646e5ab74c9c992f084603f0 *data/veuvage.rda c9a9bbcebcfd8761e29065a97e6d0b6d *data/westafrica.rda 1f59b5375c15279995bf64273d079550 *data/woangers.rda 53df52b0b8de963f7cd1ed72ff171da5 *data/worksurv.rda 55cd9d01e39691f67acfd1ffdd607652 *data/yanomama.rda f19df1a99aa3d39631422b7b247f4511 *data/zealand.rda 2552cb1686c21b5b3b70c944e35aad7d *inst/CITATION a134ce28598a2867b151d0cf11e944b7 *inst/pictures/atyacarto.pnm 6a427fa2a11dc07d5b2686fa50405d28 *inst/pictures/atyadigi.pnm d62a9968f404a5d984e336ebd95f68e9 *inst/pictures/avijonseau.pnm 0941cfeae8504c03218ced2d60e242b9 *inst/pictures/avijonsrou.pnm 7934a9b9ce8a7ede9a352db4d3285751 *inst/pictures/avijonsveg.pnm f4f9d4748e332ffe2df9aff488a5f0af *inst/pictures/avijonsvil.pnm 2ca9e0460d805cc86e18f393bb9a0356 *inst/pictures/butterfly.pnm b8cba30aa7aade7e983120a365353fec *inst/pictures/capitales.pnm fd5e6efc32eea941728ba23444038fad *inst/pictures/fatala.pnm b370622c8bf09dfe071a7ffeb46ba05d *inst/pictures/france_sm00.pnm bae85092a512c2dcb7898f35626c9a69 *inst/pictures/ireland.pnm 53343ad8450770f6033539cc253665da *inst/pictures/paris.pnm ddc70df388a9749473b91e043cd9241c *inst/pictures/sarcelles.pnm 87829cd565c28ba216b7be12d9e54bf9 *inst/pictures/tintoodiel.pnm 2ca9eaa8028226469e5b1784c7ab109c *man/PI2newick.Rd fec860e43d6d6501d35097506c112ecc *man/RV.rtest.Rd b8dafab047ca08f8950974ebf8bbc54a *man/RVdist.randtest.Rd 8d654e1dedf1443cb5e90b1f13678fdd *man/abouheif.eg.Rd ff29b060033e5dce219e38dc81825a7f *man/acacia.Rd c7e90a20b622ba479c37187eb255a7db *man/add.scatter.Rd 7985f70da05d1696bde6d65eeff7ad26 *man/ade4-deprecated.Rd b1507f756729f1164a1efd34a3b626b9 *man/ade4-internal.Rd e61beaf727c5182a9324cd60844b599f *man/ade4.package.Rd e3b0339a997676fb728a424b20db4ebe *man/adegraphicsLoaded.Rd a8af05ea4d586e8c7b625a1f0339682f *man/aminoacyl.Rd 249b4c19f78f6aa3474ecc5f7e177075 *man/amova.Rd 970ff230f7e4c37b8db612c5dfdfa7bb *man/apis108.Rd 208ec14214b92c594f5cfe076af1cac8 *man/apqe.Rd 18ca41e0078353333d595ad74220dc6a *man/aravo.Rd 2b3a479de8f346040a701a4cb10d3d98 *man/ardeche.Rd 447412b7f57ebf964e0be55eb27fe7f3 *man/area.plot.Rd 4ffac3a403122350d3bf25b048d22108 *man/arrival.Rd 26759451a77308d6f556575ec677e0d7 *man/as.taxo.Rd d48c9dd29ea109fc24fd73d9b82ec60e *man/atlas.Rd f0cba96fb22a52646c8b24985117704e *man/atya.Rd 1bdea97edb5f00aa921d3d9a3002140f *man/avijons.Rd 5b46f1b3eb76344f4bb52728b124c7be *man/avimedi.Rd dabc0712d7712db91faa37724853c41e *man/aviurba.Rd 5c8a0ee4db834548090f4c69c236986d *man/bacteria.Rd 3bc4630371d25aa72f07bf1f7b866479 *man/banque.Rd 820bd2c569ba9044f27a5159f8b3ce41 *man/baran95.Rd 8feb1f2e871b5671c1754cb3e3ccff45 *man/bca.Rd db74fbae620c3ee406ef36e59d757d9a *man/bca.coinertia.Rd 0f75a3e12fa45b42c763b204b74c6d33 *man/bca.rlq.Rd d87c50343421d615eec0183992e282c5 *man/bf88.Rd 0880389fbba8c8cd00662898e49456bd *man/bicenter.wt.Rd 070c77d1a50db9af402a00411374540e *man/bordeaux.Rd 658377f307a06c176d610177a928a71f *man/bsetal97.Rd 54aeb9d389d5b11a58808ccf6c8a4465 *man/buech.Rd 629fd7b535eb008a7c798080b4f2ee76 *man/butterfly.Rd c29141ff24a81ba211d3a1e2222ac9bc *man/bwca.dpcoa.Rd 7cfada60ad3ecab55ceb38d595b1fa11 *man/cailliez.Rd 10cbbd758037ebc5dc5897390c32ab97 *man/capitales.Rd d0ab9fd2335bbc6fc9ccf329c3e79b7b *man/carni19.Rd f24f566df0b44c9b44180a3aa3565ad3 *man/carni70.Rd 8db45c0d262f6993068d8a78141550bf *man/carniherbi49.Rd d5ec74578ed136724aed7b89f862c67b *man/casitas.Rd 36917a4def5673847ad737e21ca0ff09 *man/chatcat.Rd 148d03c767a82f8d666d5862eaaa3b46 *man/chats.Rd db6510a81935c5bb821a0f631a001db0 *man/chazeb.Rd ed535328bfc9a7bec9b12f178aac8851 *man/chevaine.Rd ba42eda2b1386ec657937901943ca286 *man/chickenk.Rd 303f97951f27ed47f4b1c2d972960a96 *man/clementines.Rd 5b4f9b96b33f6b48c86eb5abef0f5491 *man/cnc2003.Rd b9cfd25c0a5c666048798f1619febd3f *man/coinertia.Rd 51c3ef8a67231886efec2490346394c8 *man/coleo.Rd 9d545c250b95c360a40d8a5e3e672e80 *man/combine.4thcorner.Rd d97ed33dbd06ae7dccf149e0574a014c *man/corkdist.Rd 1bc1d38379b7e4daf4d83b41a79848ea *man/corvus.Rd b436dd64c87718dcebeaded19a4a3c88 *man/costatis.Rd 10c185d7d25ce53ca6478f3c8327ec8d *man/costatis.randtest.Rd d8263059c926c53fac90b997bcb6bd12 *man/dagnelie.test.Rd bf6d529b62f5005a0892368041cf16a0 *man/deug.Rd b707cfe0f6f33b2355c6653dadfbc815 *man/disc.Rd 1c3f434d90018336b808c1a286143d30 *man/discrimin.Rd 30c9421e4bb3c2adcd0a4bbb568ab3f4 *man/discrimin.coa.Rd 722ea45480bc97122a7a5e2285a9486f *man/dist.binary.Rd ef1758a31c80808665c088526667bcae *man/dist.dudi.Rd 977087338f8fce066c7db8b9868c8d36 *man/dist.ktab.Rd 5ccf470ce27b4a31abf024f13cc08e2b *man/dist.neig.Rd 74cc1ac08c5cae5d0695e07ed2e40487 *man/dist.prop.Rd 0a8a26a56402c536e2e39aad6e8665aa *man/dist.quant.Rd 94453f0cf98a70313df87f6f1d4cc518 *man/divc.Rd 5f91f9182629a0ccb925b2b169824bde *man/divcmax.Rd 339344fbce5bd0c61335905b96f56f8e *man/dotchart.phylog.Rd 0176997c403c432a383e50bc1be21167 *man/dotcircle.Rd 8678be67589a18ccb09cbdb3e9d91b19 *man/doubs.Rd 6bf1dae5e7ff35dc6b82855aa0c5212c *man/dpcoa.Rd 5cb31aacec4e5a5cedf8dc73f63e0a11 *man/dudi.Rd 48c88109b49496de6fc3ae2258e53624 *man/dudi.acm.Rd 789c707ec785d9bfaa0ee93395be8dc6 *man/dudi.coa.Rd e40e83d83a2b6a59cff2760838b99642 *man/dudi.dec.Rd 842ee0f2df3ab14d0d0192adb0dd86ff *man/dudi.fca.Rd d63c6d6c11fd20cbcb05b9be4f67e822 *man/dudi.hillsmith.Rd de3017b09b056bf751c4c66217b81743 *man/dudi.mix.Rd 405e040667a89cfb8e760505c09ec518 *man/dudi.nsc.Rd 6017431cc04ba009531fd20f33a70038 *man/dudi.pca.Rd c3e278b9d1dd0e24b61e4238a76b60f1 *man/dudi.pco.Rd ed0ad98b7d8dc3cb78b34d0c9018b326 *man/dunedata.Rd 81b756ac1f475729660d896041568336 *man/ecg.Rd 92dacd83d6238b53a3d2d74c68245f66 *man/ecomor.Rd 4cfd83d1c2b87d2921e3955065f439be *man/elec88.Rd f68bf1a1d100b206d6a10f29e2543ebe *man/escopage.Rd 02c85de52e3cb2703dc8d4e7537e2134 *man/euro123.Rd 4a3db474ec918ed1eb517b9d65605982 *man/fission.Rd 2d9e0e91e23b9c28a9eb80b4079a1692 *man/foucart.Rd 2107a61245d9c09a5a3df1784778ad2f *man/fourthcorner.Rd 3adeabc79ad58a8adf4fbb9353ce07f5 *man/friday87.Rd e2bea0a520462821a036f271409f33f8 *man/fruits.Rd c90c906094000915af6e610beb8fc0d8 *man/gearymoran.Rd 9a6010d352e9734c29a91fbe423f37f5 *man/ggtortoises.Rd 600bfb1450a9c03464de8198195d6f82 *man/granulo.Rd 38ccaeabba9710759fa0a92563943b7d *man/gridrowcol.Rd 18306e14e56a4a4180ce12b65c89c4db *man/hdpg.Rd 657fa22c3ec73f707d87bc3a1aa4dad4 *man/housetasks.Rd 34ede9cd77aadc0483270ce83d94f3c8 *man/humDNAm.Rd 329d66616200815109272f705f9c3721 *man/ichtyo.Rd fef0c091668bf981097e16fabb7430bf *man/inertia.dudi.Rd 98d0888f042416514b285c4f054c644f *man/irishdata.Rd d8932e7c9545fb802e44acaee5e715c2 *man/is.euclid.Rd faa31ce6d9bc268b91f6db62072891fa *man/julliot.Rd 2bbbff77a1a6fa0d5bb10828c61153bb *man/jv73.Rd 5be96bdf1fbbbc7963849c03b4b3b3e2 *man/kcponds.Rd afc00e97c0ed1bf5b8eb912e21fdd0b6 *man/kdist.Rd b0961249596434ce3a0159a22b41af52 *man/kdist2ktab.Rd 5c5bf2d6728f253c759d57886e8f2920 *man/kdisteuclid.Rd ea9e77da2931e615fed14ccd10c32182 *man/kplot.Rd 53c3dcbe1d9f87d9ef79a254c73cdf1f *man/kplot.foucart.Rd d92e7fefc64d4187c7072ef645c6539d *man/kplot.mcoa.Rd ae5401351ae377a42eccede83c644d3c *man/kplot.mfa.Rd 868a49832171df02105a2159a34029f3 *man/kplot.pta.Rd 671cc100f0f4fec221fb23c26b6a5f2f *man/kplot.sepan.Rd 2caa270bbf015958aeae072475d64cc4 *man/kplot.statis.Rd 8f5b862f8043398cce7c49367f83192d *man/krandtest.Rd 178ec4ef0849a18731765c8fefe50a25 *man/ktab.Rd 8794927f88fd6a392b53fd9ff91ccb65 *man/ktab.data.frame.Rd 798f0ef80c974286bd5024505ca2641e *man/ktab.list.df.Rd 8231d3791679798e63bed555ab5feb8f *man/ktab.list.dudi.Rd ab8a36023c98addf300753ed0d827d7c *man/ktab.match2ktabs.Rd 70785906914389698f7427b66c7bebaa *man/ktab.within.Rd 8079d383b8fe439a05b5327598c2d8c0 *man/lascaux.Rd a60aec1e73f6e5e44469dc5cae1b6515 *man/lingoes.Rd d4c0558a22707b775e0ff79c7771adf3 *man/lizards.Rd ffb4c26da7697a5ed7b1e1edec99d13e *man/macaca.Rd 2e0a5f29e020638da962402a07c41c94 *man/macon.Rd 738d6ad074c9750d7f583d3580886a35 *man/macroloire.Rd c40f56186a3d99fe9595d6ca4c031e53 *man/mafragh.Rd 1788956ebdf5d538cbf564ace0d3cbec *man/mantel.randtest.Rd 8b4cdae21e7d8f90d7fcaa9a5250a054 *man/mantel.rtest.Rd fe18b1f6484a339f1641fc864446894e *man/maples.Rd e5bd6190c3964632a6eac8982a5244c9 *man/mariages.Rd 2083f479afedf29247df0fdc61395abc *man/mbpcaiv.Rd d2d5dd3666ef4cadcb90ab0ac181a0d9 *man/mbpls.Rd 4fff9cfa974199382a0386f57f28f21a *man/mcoa.Rd faf07f3c20cd21f6fac74cc9aeecac1d *man/mdpcoa.Rd 701ca4c18001cbe33d42124c74595898 *man/meau.Rd 2355ad84cecb81f9ce4049f03cd6e0c8 *man/meaudret.Rd ac960a48feb4766da9573ff16151f247 *man/mfa.Rd 0e88267c33091f0751d7e888a694076f *man/microsatt.Rd 4525661b5b0a4452380d0cfe0ba851ba *man/mjrochet.Rd 9b85eb13d70e3c2a6a468da3aeea7be9 *man/mld.Rd f31cd1638fb6c92a04344cc4f6f232da *man/mollusc.Rd 5ae787bce8773ba944d9daffc2ac6640 *man/monde84.Rd aa0678333c8ba7621a3470615cd2a9f1 *man/morphosport.Rd e5c6a90a580066a1cb959074111a49bd *man/mstree.Rd 0a66f03fa824c011f95cc83fffe697a6 *man/multiblock.Rd cecb185ac49a0adafc53cbd8471efb90 *man/multispati.Rd 025c831146e303e447aaa9ff8bfd5823 *man/multispati.randtest.Rd 30f6c9a3a1689cae14882fb9d301d778 *man/multispati.rtest.Rd 3df1c08ac1bb6e3f651e3f3c9d47f52b *man/neig.Rd 325c49fee3e2a9e96334ce6cf5ab4ac6 *man/newick.eg.Rd d7bcade1864c48d2b12ac37fc293069c *man/newick2phylog.Rd df1d19ece13db1186c4d62deacce8829 *man/niche.Rd 3eb9fb98b456ccd5b2eeffefff2833d7 *man/nipals.Rd f02b2779f45cf6fd48bf2925804aa82a *man/njplot.Rd d9c4a1e91ba04f2a2eb913dd6d2fa695 *man/olympic.Rd 9bdee9281c16e39dcf1a0f1fcc1726c7 *man/oribatid.Rd 4f57c9b6bb73c1a91f282680be86b243 *man/originality.Rd e2da1e1d881391b948bf64693f153391 *man/orthobasis.Rd 379903c55f52fde22eaafe09521c9386 *man/ours.Rd f9b9b774c9a3c9e21f9f29744a8df996 *man/palm.Rd 768133bce2da5715356183b211eb76f5 *man/pap.Rd b33e7fc3381597afc498baead8ca5047 *man/pcaiv.Rd 0fd2c833f564dc8b178b8328c0573d70 *man/pcaivortho.Rd e5af7e7dca04d7a7914bdae08c680c55 *man/pcoscaled.Rd d4a610cb68738e3538148f6836eac7ee *man/pcw.Rd 0608d931a3b59ae1577b1b39560db4d1 *man/perthi02.Rd 568f545e65ad7feb3b70f9b725af2690 *man/phylog.Rd 2696ba19f5ba9f562ba5f3ba2ad0833d *man/piosphere.Rd 1002aa586842dd548805751aaaf8e59d *man/plot.between.Rd e2d88196076415810091c8368d110dd2 *man/plot.phylog.Rd 1ecaf862a6ae3394050be4b63ee96ab9 *man/plot.within.Rd 9cee92f46a8db2514211816cb6f16e98 *man/presid2002.Rd 1e74d3ade86110c4032df7c415a8c3e0 *man/procella.Rd dec90bd68c3510fb1b3aa8f763513309 *man/procuste.Rd 4baf94d13d9feb9f5d82a1af9e857d42 *man/procuste.randtest.Rd fa31dc1287612217fae3ac3d8589324e *man/procuste.rtest.Rd 92f7f004083ccb02f0a6c54342127372 *man/pta.Rd b497a56dd3ede8cd6c40d7316397a682 *man/quasieuclid.Rd dbabb33255dfdbc2a709b9f43b16c644 *man/randboot.Rd b3312d143490ca1848f89e91c3bb7eb0 *man/randboot.multiblock.Rd 66af2805133b21892d1a27c25998c46a *man/randtest.Rd 2146def722f2489173b73281f8f7eb5b *man/randtest.amova.Rd 1d37cb1c819aa6421c568e977eb13787 *man/randtest.between.Rd 98604c474760ad89b67a8b974a70e095 *man/randtest.coinertia.Rd 10a0f0962fd8f6bd115b4a3112686ce4 *man/randtest.discrimin.Rd 66586dadf5d8e68388a3671a42044344 *man/randtest.dpcoa.Rd 91a19c1a4b2c57b93f32f755dd564898 *man/randtest.pcaiv.Rd 82d7f423171d3aaad0ff11c740e3362a *man/randxval.Rd f5ce90e1dae92961860a0309aea92340 *man/rankrock.Rd 441fd1709665d44ff5456cdc95ddcbfb *man/reconst.Rd 35cf26198b4ca8737e051a2655273e58 *man/rhizobium.Rd a068b5837203265eb7012a9a1bd61f28 *man/rhone.Rd 1233ef0ae7fd4262559be81b05ce3c69 *man/rlq.Rd 474ec9251055e58191346ebe5fee402e *man/rpjdl.Rd b4ad2dad4b74501f452f59563b138a98 *man/rtest.Rd 02bfc1370d63102629e8f7edb7bfc76d *man/rtest.between.Rd 9c7b66c21c5d4f32662fe905fe3bc12d *man/rtest.discrimin.Rd 75cfe60badb83d52fdaf2d3908652b67 *man/s.arrow.Rd adedd8cd01431202e894ad79a0177a2f *man/s.chull.Rd 4987f998e8500c73d077c9d9f43eba42 *man/s.class.Rd b6a38cfcf4b0ca26692e1077c155dccb *man/s.corcircle.Rd 7e446aecefbca6590e7572252d027a7a *man/s.distri.Rd 2a7e048a9a7a20bc350e2a9d8ad7dd27 *man/s.hist.Rd 42603cdc29372482b4979b4a5e13bdc0 *man/s.image.Rd 5c9ec162f2d537f6a19b52a55943c907 *man/s.kde2d.Rd 8ab446112c535068bd8cc452f830599d *man/s.label.Rd 970aa00c1f1866dcf169062589f3c010 *man/s.logo.Rd eeebdfc6d77794d7f360ce7088c67dec *man/s.match.Rd e8ce1fe0be8a0b4d5058d8c81fa3bbbc *man/s.match.class.Rd 18c41aa3fcedc0469aa6079555f6845c *man/s.multinom.Rd f8025fb61bf804fc9e081f8edfc020e6 *man/s.traject.Rd 55e61133e6e8a6b9787769816216460c *man/s.value.Rd 73a771465fb9492a137f8cad033d2dd0 *man/santacatalina.Rd 53275d8e30488ed1fe4c2315792d9475 *man/sarcelles.Rd b136f551f263a4d26610cb4213f538e9 *man/scalewt.Rd 42e9ab9e0d7594ed094881850e02e181 *man/scatter.Rd b8b85a697a1c1ba4cfb03dfad676e145 *man/scatter.acm.Rd c8034596c0bca197e7a689bd45be5fe9 *man/scatter.coa.Rd 5e3db1c877c39b924e6d0e0c063c3f85 *man/scatter.dudi.Rd f7cecc1a6d7e418f92f18f46a6b7a252 *man/scatter.fca.Rd adf482c4778f67ccaca56028c58b61b4 *man/scatterutil.Rd 26b859f8c11cf01acb18f2eca360ad80 *man/sco.boxplot.Rd 5da43fdc6e9e027391b469f9f019da72 *man/sco.class.Rd 45c53593c5dd8ded54cdfae6b6f6595f *man/sco.distri.Rd 071abca8a4e36cdea2725d6824549dbb *man/sco.gauss.Rd 25e8ea1e87af4dc20c21c9141aabe39e *man/sco.label.Rd 1fcc29ad6bb4340d9c22b0cde95a6d8e *man/sco.match.Rd 5931a415d98abfafbe8720e95f467b5b *man/sco.quant.Rd aed87c3484cbf079ec9b2ba53f2fa756 *man/score.Rd 6927cab2a6b4469a433b7822367799d4 *man/score.acm.Rd 183665050715937265902950be08968e *man/score.coa.Rd 3abba411d10073654e78d88d72403dd9 *man/score.mix.Rd cbd5e28da2093acd082e1923f82906f0 *man/score.pca.Rd 18ea79b764e5a8bea14b8f06e962c25c *man/seconde.Rd bb6f2336d57376429a2e84ec462744d8 *man/sepan.Rd 16351ed0f5c40dd8b128271b179c0aa7 *man/skulls.Rd 5ecf543f433718af31e3eb57654091ef *man/statico.Rd 9740b09dbad578d527d7cd536a570806 *man/statico.krandtest.Rd 17a8cc9d63d55909ecfe70bdd7468d0c *man/statis.Rd 715910d3844db60390d7db3042ab4442 *man/steppe.Rd e7bb33c3766623f999c645948417efbe *man/supcol.Rd a3e6a34dd8837531d1d88578af895761 *man/supdist.Rd bbcc6af7809354956215e40b4df6fbf6 *man/suprow.Rd e169a8e85a52bd18ba2b72d95453cdd8 *man/suprow.pta.Rd ebe8f79b0d7da4bd698db7a34a9f9637 *man/symbols.phylog.Rd 7f17d062ca1a936f7d1bf014ee68211c *man/syndicats.Rd 5e491778d14df4d6d7176b6ec7041577 *man/t3012.Rd c3b3418666f768284734aba678e4bfb7 *man/table.cont.Rd 7f6c33833a5afee6817b23c39af0ad33 *man/table.dist.Rd 7c49125e5c9d4fffcfb86bdff089261f *man/table.paint.Rd 37ea5dccf8b175379d8eb3ccbb4f1117 *man/table.phylog.Rd c66f9faac41f71051012371bbce689be *man/table.value.Rd 5dda2bd3b7a9baec7611872a472320d0 *man/tarentaise.Rd 49707fd1338711908204bc755bff9b74 *man/taxo.eg.Rd a52e54243d7afbe5ede4597a081c7637 *man/testdim.Rd 3183df2fe77649d04a60823bc095af96 *man/testdim.multiblock.Rd a7dd35af6744709d16b452fcfe204d1c *man/tintoodiel.Rd 0873ff2c03cfa3379873314253f90b90 *man/tithonia.Rd 1234e35f8fdc5cae3b06ff17652f6f78 *man/tortues.Rd b5132611cbe8e6b8d1f9ee36f8f45baf *man/toxicity.Rd fc6642ac2232b0d4203eac93cea1ff4f *man/triangle.class.Rd 590a7ba738e054b1f98a3b5d7535f22a *man/triangle.plot.Rd 072319bb6d874d9cce400f88a83c42a6 *man/trichometeo.Rd e852befdc36a81e8785d75b7cf4c0f1e *man/ungulates.Rd 77ba948fc7720a971e8c3724e0f0a023 *man/uniquewt.df.Rd 990dce46e5096ae2710a21272b40cbfe *man/variance.phylog.Rd 444080d8d1ca325add04965c6a51c54c *man/varipart.Rd bb50bf8f6978c7cce94bb949afd3366a *man/vegtf.Rd ba7ac081a6b0ab9ad0dcd1fe5671a2d5 *man/veuvage.Rd 7632fa15447224d022a1ce1ee19d2e94 *man/wca.Rd dd01a7db1ebf01941a5e02aabe23bb41 *man/wca.coinertia.Rd 2f25eb71ec39a2079827111ce0d8715c *man/wca.rlq.Rd c9b8af02f0a4a32ab9e0c3ac301cb0c4 *man/westafrica.Rd aa2f3cb1d6b20cda51fcf9f9b1c9d06f *man/withinpca.Rd 34b753759df0c097d0fc1dfe64eb06d1 *man/witwit.coa.Rd 9079945124583c41853266f4a304f761 *man/woangers.Rd 35411625d5ade47e15a7f7e7fd2cedd7 *man/worksurv.Rd b978356bfee2c64f580b00627871d74b *man/yanomama.Rd d84be4d7646beb8de45bb49da9df027d *man/zealand.Rd f009e46fcf131d28ea4ead122961b7bd *src/Makevars 59abb5710b0205fc3d0eb2eb9e4968fe *src/adesub.c 8e83ec3b39df34630603252541e3be32 *src/adesub.h 70502ca4cdafe52d2ee60a011beecfaa *src/divsub.c bf3fa1832a9ebe1627b7bb8a57ea5b55 *src/divsub.h 76b73e7de30910fd7666940f0282643f *src/fourthcorner.c ed585e22ef9df65e023b54dc4b6086aa *src/init.c e3fec5314fbc54452665e4f36f4c266f *src/phylog.c 599529f6552210ac430a65607ffcec84 *src/testamova.c 3e4345a9feeb0a988171bdd8428960bf *src/testdim.c e076cea18e7ee8f858376b48061a7fdf *src/testrlq.c 8a604cec2e96f73cd96c55281b88a466 *src/tests.c ade4/inst/0000755000176200001440000000000013342306231012041 5ustar liggesusersade4/inst/CITATION0000644000176200001440000000435313342306231013203 0ustar liggesusersbibentry(bibtype = "Article", title = "The {ade4} Package: Implementing the Duality Diagram for Ecologists", author = c(person(given = "St\\'ephane", family = "Dray"), person(given = "Anne--B\\'eatrice", family = "Dufour")), journal = "Journal of Statistical Software", year = "2007", volume = "22", number = "4", pages = "1--20", doi = "10.18637/jss.v022.i04", header = "To cite ade4 in publications use:" ) bibentry(bibtype = "Article", title = "Supervised Multiblock Analysis in {R} with the {ade4} Package", author = c(person(given = "St\\'ephanie", family = "Bougeard", email = "stephanie.bougeard@anses.fr"), person(given = "St\\'ephane", family = "Dray", email = "stephane.dray@univ-lyon1.fr")), journal = "Journal of Statistical Software", year = "2018", volume = "86", number = "1", pages = "1--17", doi = "10.18637/jss.v086.i01" ) bibentry(bibtype = "Article", title = "The {ade4} Package -- {I}: One-Table Methods", author = c(person(given = "Daniel", family = "Chessel"), person(given = "Anne-B\\'eatrice", family = "Dufour"), person(given = "Jean", family = "Thioulouse")), journal = "R News", year = "2004", volume = "4", number = "1", pages = "5--10", url = "https://cran.r-project.org/doc/Rnews/" ) bibentry(bibtype = "Article", title = "The {ade4} Package -- {II}: Two-Table and {K}-Table Methods", author = c(person(given = "St\\'ephane", family = "Dray"), person(given = "Anne-B\\'eatrice", family = "Dufour"), person(given = "Daniel", family = "Chessel")), journal = "R News", year = "2007", volume = "7", number = "2", pages = "47--52", url = "https://cran.r-project.org/doc/Rnews/" ) ade4/inst/pictures/0000755000176200001440000000000012576021756013715 5ustar liggesusersade4/inst/pictures/avijonseau.pnm0000644000176200001440000030337312576021756016606 0ustar liggesusersP5 394 254 255 LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLade4/inst/pictures/fatala.pnm0000644000176200001440000012675712576021756015703 0ustar liggesusersP5 214 208 255 ade4/inst/pictures/butterfly.pnm0000644000176200001440000015433312576021756016462 0ustar liggesusersP5 222 250 255 ade4/inst/pictures/tintoodiel.pnm0000644000176200001440000145561712576021756016626 0ustar liggesusersP5 560 744 255 ade4/inst/pictures/ireland.pnm0000644000176200001440000017140312576021756016055 0ustar liggesusersP5 213 292 255 LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLade4/inst/pictures/atyadigi.pnm0000644000176200001440000060573412576021756016243 0ustar liggesusersP5 369 541 255 ade4/inst/pictures/capitales.pnm0000644000176200001440000034531312576021756016407 0ustar liggesusersP5 374 314 255 lLlLlLlLlLlLLlLlLLlLlLLlLlLLlLlLLlLlLLlLlLLlLlLLlLlLLlLlLLlLlLLlLlLlLLlLlLLlLLlLlLLlLLlLlLLlLLlLlLlLLLlLlLlLLlLLlLlLLlLLlLlLLlLLlLlLLlLLlLlLLlLLlLlLLlLLlLlLLlLLlLlLLlLLlLlLLlLLlLlLLlLLlLlLLlLLlLlLLlLLlLlLLLlLLLlLLLlLLlLlLlLLlLLlLLlLLlLLlLLlLLlLlLLlLLlLLlLLlLLlLLlLLlLLlLlLLlLLlLLlLLLlLLlLlLLLlLLlLlLLlLLlLLlLLlLLlLLlLLlLLLlLLlLLlLLlLLlLLLlLLlLLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLLlLLlLLLLLlLLlLLLLlLLlLLlLLLlLLlLLlLLLlLLlLLLLlLLlLLlLLLLLlLlLlLLlLLLLLlLLlLLlLLlLLLLlLLLlLLlLLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLlLLlLLlLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLLlLLlLLlLLlLLLLlLLlLLlLLlLLLLlLLlLLlLLlLLLLlLLlLlLLlLLlLLLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLlLLlLLlLLlLLlLlLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLLlLLlLLlLLLlLLlLLlLLlLLlLLlLLlLLlLLLlLLlLLlLLlLLlLLlLLlLLlLLlLlLLlLLlLLlLLLlLLlLlLLlLLlLLLlLLlLLlLLlLLLLlLLLlLlLLlLLLLlLLLlLLlLLLLlLLlLLLlLLLLlLLlLLLLlLLLlLLlLLLLlLLlLLlLLLLlLLlLLlLLLLlLLlLLlLLLlLLlLLlLLlLLlLLlLLLlLLlLLlLLLLlLLlLLlLLLLlLLlLLLlLLLLlLLlLLLLLlLLLlLLlLlLLLLlLLlLlLLLLlLLlLlLLLLlLLlLLLlLLlLLlLLlLLlLLlLLlLLlLLlLLLlLLlLLLLlLLlLLLLlLLLlLLLLlLLlLlLLLLlLlLLLlLlLLlLLlLlLLLlLLlLLLLlLLlLLLLlLLlLLLLlLLLLLlLLLLlLLLLlLlLLLLlLLlLLLLlLLlLLLLlLLLLLlLLLLlLLLLlLLLLlLLLLlLLLlLLlLLlLLlLLlLLlLLLlLLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLLlLLlLLlLLlLLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLLlLLlLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLLlLLlLLlLLlLLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLlLLlLLlLLlLLlLlLLlLLlLLlLLlLlLLlLLlLLlLLlLlLLlLLlLLlLLlLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLLlLLlLlLLlLLlLLlLLLLlLlLLlLLlLLlLLlLLlLLLLLlLLlLLlLlLLlLLlLLLlLLlLLlLlLLlLLlLLLlLLlLLlLlLLlLLlLLlLLlLLlLlLLlLLlLLlLLlLLlLlLLlLlLLlLLlLLlLlLLlLlLLlLLlLLlLLlLLlLlLLlLLlLLlLLlLLlLLlLLlLLLlLLlLLlLLlLLlLLlLLlLLlLLLlLLlLLlLLlLLlLLlLLlLLLlLLlLLlLLlLLlLLlLLLLlLLlLLlLLlLlLlLLlLLLLlLLlLLlLLlLLlLLlLLLLlLLlLLLlLLLlLLLlLLLLlLLlLLlLLlLLlLLlLLlLLLlLlLLlLLlLLlLLlLlLLlLLlLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLlLLlLLlLLlLLlLLlLLlLLlLLLlLLlLlLLlLLlLLlLLLlLLlLlLLlLLlLLlLLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLlLLlLLlLLlLLlLLlLlLLlLLlLlLLlLLlLLlLLLlLlLLlLLlLLlLLLlLLlLLlLLlLLLlLLlLLlLLlLLLlLLlLLlLLlLLlLLlLLlLLlLLlLlLLlLLlLLlLLlLLlLLlLlLLLlLLlLLlLlLLlLLlLLLLlLLlLLlLLlLLlLLlLLLLlLLlLLlLLLlLLlLLLLlLLlLLlLLlLlLLLLlLLlLLlLLlLLLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLlLLlLLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLLlLlLLlLLlLLlLLlLLlLLlLLlLLLLLlLLlLLlLlLLlLLlLlLLlLLlLlLlLlLlLlLlLLlLLlLLlLLlLlLlLlLlLlLlLlLLlLLlLLlLLlLlLlLlLlLlLlLlLLlLLlLLlLLlLlLlLlLlLlLlLlLlLLlLLlLLlLLlLlLlLlLlLlLlLlLlLLlLLlLLlLlLlLlLlLlLlLlLlLlLlLlLLlLlLlLlLlLlLlLlLLlLlLlLlLlLlLlLlLLlLlLlLlLlLlLLlLlLLlLLlLLlLLlLLlLLlLLlLlLLlLLlLLlLLlLLlLlLlLLlLLlLLlLLlLLlLLlLLlLade4/inst/pictures/avijonsrou.pnm0000644000176200001440000030420512576021756016634 0ustar liggesusersP5 394 255 255 LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLade4/inst/pictures/atyacarto.pnm0000644000176200001440000060573412576021756016437 0ustar liggesusersP5 369 541 255 ade4/inst/pictures/avijonsveg.pnm0000644000176200001440000030337312576021756016615 0ustar liggesusersP5 394 254 255 LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLade4/inst/pictures/avijonsvil.pnm0000644000176200001440000030337312576021756016626 0ustar liggesusersP5 394 254 255 LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLade4/inst/pictures/france_sm00.pnm0000644000176200001440000140730412576021756016537 0ustar liggesusersP6 351 377 255 kIiᾷj[męܺɫ[޽^cX^߼Ṙ_eֱճis⻦E{Mے4)rtCXỲ~~|״^ܾwgWTɷǩxX;㼸dz|^D丩=æέܸ⺷ǠiXʻz~xĆyPڿͱçGj[JݟQIXЭ~|}ljṖ.Wg*ɮHlپܿٿݿٿڿڽݾھܾڌՙܺԳȭܶ[uG皾ʬӴղʪȭ=&ԙϰȩʫʬ޶ղɬӵ㺻^x~}}}}}}}~}}}|}|}}}{}}}l|~}ỷ~|ʬhֆkˀ|{}}}ḹ~|{&N݉}}}⻚~|}|||⹧~|~}{⼜¨D㼖ѭ|||}}{|~}}}}~|}}}}|||~|}|}|~yjἧ|{ֳ|~}ɮxjvz~|}⾹||||~}⺙|~{⺚}}ᾨ||~ȼЭ}{§ܺ}~yܺ_z߼W}}}}}}~|~|}|~}}}{}}{}}}}}o޼⼹~|ȫ||zɭtjb~~|u⺸|~{}}}۷}~Ớ}~Բ~~|ܵ~|ɮɬf⼱ǻỚέờ׳⼜⹚ϭȽ㼰žƼ۹Ṋլ|~}||~~|}~}y}{|}}}}{}}}̭㺷}}}Ȯṅ˿|~}cx{|~}|||㺝{}z|}ǻ~|}|~}ϭ伤J=e⼝}}}}~~~ɮ|~}~|z~}~|}}{~~~}{|Ȯʮ}}{|}Ƽ⺛}{~㼶|{}}}ܶU|{~|}}}}|~}ܾ|~}~~|ڍ{}||~}޿~|}~|}ֳ໸|~{ȫʮ|~}ǭy}|}z{}}}ɬ~~~⾚}}{~|ֱ}}}ֳ㼫ܵI,⼚}|||~~~~ɭ}}~|}}}}}}}}}}}}}}}ȫ}}}}}}ɬ⼝~}y㺷|~}۳|~}i~|}|}|~}|~}}}}}}}}}{~|}۹ܸ㺷}}{ȭ⺱|~{~}{ݸ~|ɬ}}}~|}ớ}}{ִ}}}ǻ}}}ɬ۷X߾⼚||z}||||ɮ}}{}}{~}{Ƽ}}}}}}}}}}}}ȫ}}}}}}ɬ⼚|~}⺸}}}Ἷ|||ņ}}}}}}}}}{|{}||}}}}|}w}{|ç|~}㼷}}}ȫṔ㺾|~{¨}~Ƭݶ}}}}~{}z亙~}{ݸ{Ȯʪ὾}{~̭ݸ{\_J]⼝}}}|||}ȫ}}}}}{~|}}}}}}}}}}}}ȫ}}}}}}ɬ⼛|~}ȼἺ}}}ȭ~z~|⼗̮}}~~~}}{}~|||~~~}}{{|~|{}}}}}}}~}|x}}}~~j}~໥}}{}}}~||z}}Ŀ||zɮ{~|}Ȯὢ|~{}}}⼝|~|~}y⻹}}}ѮЮj:ߺⷸ⼛||~}}{||zȫ~|{}|ܸ}|z}}}ղ}}}}}}}}}}}}ȫ}}}}}}ɬ⼝}}ⷷ}|ȫ}}{{}|WVwe⼚~|}{|}}}ɭ~|}|~}Ἠ}}}}}}}}}}}}}}}ȫ}}}}}}ɬ⼚}}}⻷}}ʪ}|i_ç^⼛{|~|}|~}ʮ~|}}}}ʪ|{}}}}}}}}}}}}ȫ}}}}}}ɬ⼚~|}໺}}}ἷ}}}⸗ʣʮίbZي⼰~}{ֶ|~}~~|ܺ|~}~|}Ỏ}}{}}}}}}}}}}}}ȫ}}}}}}ɬ⼙{|⺷}}}ϯ}}}ȼR[ǻ~ֳ7ձ|~}}}}{}z~|}ȼ}}}}}}}}}}}}}}}ȫ}}}}}}ɬ⼚~~㼸}}}~|zy⻵QH߽԰èȮԳƻ⻶۷⺸ֳ㼷ֳǻɬǼְzikDɬȫ}~yƼ^xQJޢ޾⼾ȼմϰ>߽⹇M\؆fǻϰȼ}}}ݶGXߙõȷĶgCjݬgȼЮ\l,⺶l{ɬɬܶаɬճGX~|Ǽ,ʦXIȫ~~~}}ȼ~}y|~{Ю㸜~~MƝ}}}}}{Ṝ|}ɬ㼺~~}{~}}۹ȭ}}|~}|~}}{|èɺ}}}~||||ϯ}|||z}}}ū}}{}}}|}ɨ亸^_j⺠k⸷z[oab]{ɬ{|~}~yݺ{|~⼚}~Zƛ~|{}z⼙ɫ⺽~|}ʧݶ~~~ȫ}}{ʪȫ~|}}éˮ|~}ȫ㼸~|ܺ~||}}}}⺨~~}}}}}}ɬ⺘NZ⾵ܷαae݅ylEܽʪ}}~~~⹲~}{㼎{}|Ἓ}}}}}}|~}§㺛~|}ȫọ||~ǽʬ۷ɮ|~{~}{ⷺ}}{㼫{}z亍}}{ǽ|||~}y{}|ճ㼍~}{}}ɮjQ^jWU⻋MPἢܸ{޾ڿŶɛȭ~}{~~~ʬ|}۷[^~~~⼚~}{~~~⻛}}{ǭִ}}}}}}մʬ~|}|~}մ}}}~|}ղ}}}ȼ⺩}~}}{~|}~}{ͯ}||||ɩ߿|h7{\Ṧ̹ɶƉF`4߿ԲEWʬ~|z~}}}}ߺkꋔ|||Ἓ}}}ȼ||z}~ֳ~|}ʪɭ|~}~|ʮ~|}{|}}}}}}ʪ}}}}}{Ǫ㼶||z}}{|||Ю}}⺸{}z}~ȮBXjحQbx߾ֳ_r[]lDu޿ȫ}}}}}}}{~}{yʼX3›}~㺚}}}ȫ{}z~|ȩɬ|||~|⻷}{}|}ɬǬ}}{}~~|}}}Ȯ}~y}}}ȯ⺷|||~}{}~Ị~|ด}}}ղ~|}ˬhaRkK⻘dqsp)L|zӈ߿԰ίzʬ}~~|}~~~wἜ}}}Ṝ~|}ȭ~||~}ʮԳ~|}}|ݸմɭ~~~|~yȭɬ|}}}{ݶ|}|~{Բ|~}ự~~~}}}|~{㸩}}}ž}}⺚|~}ɮcm҅9^lTὸUƱ}~y|}P_z~}|q⺚|~}}{~ɬ⺍}}{}}{˧⼃}}}Ĥ}|z}}ɭɬ||~}}}{Ṥ|~{ἓ{}z}}|~}}}~~㼛||zʪ߿K^j⻔I޾k^~|}}}{}|ۺṝ}}}Ṛ}}}ɫ⼻}}}}}}}~ɬ⾰}}}ܸܵ}}|~}ʪȭ||~ɫ|~{ɺ}}ܹʪ|~}ղ~~{}|⼃~|}}}}Ϯⷚ}}ɫớykXy{z}ҵk־eԶίP߿T}}}~|ky~||}⼜~|}⾜|||ɬܷ|~}}}}}}{ȫݶ~~~}}}ֳʪ||z|~}~|}}}~~~㼧}}}||~}~ƺ~|}}{ỡ}{~⼝}}}ʭ߿߽߿ZwD[z[ṋϬ;HآDϮɬȫЮʮմϮˮܳϯɬʬݸέǽԳܶɮɮȫ˭ϭέǽԳȫʪӳɬϬϭʬܵˆT^rQkÉHil_hܵܺа}}}մմƼܵ|~}kezgtNm;޾*DJE{㺒ϭӵʪԶɮ\mzӶǷǘ>ݒVfhLSkzèֳ⺋|}~¨㺺aὦ^Qaa{ZXJIzɬܸͯܵճ¨ȼȼǻ⺡ứt7/⾹Ƥ⼶>;,ծŤŷӯTὖϴǻԳȭ~|¨۹а[ ի⺵-*#=9-<90 idQ⼵<:.ӯ.+"~h㺘w  >:/ zr_YWBṙu<:.(*EHOlw}7;>4*+-xRV_TĽ۷۷}}ֳ⻲έֳ㼜ƼЮίʪ余ӵỜⷹ㼝¨wṶhtҮ㺵?9-㼵{o_Ÿyq^?8.=82>:1?8.sཱུ=:1ܾilw}lw}5:=46;?5:>4<>]fmR߻Ƽݳ㺝z|yè|||۷⼝~|}ʬ}}}~~}}Ю}}}}}{y}|⺱{}||~y}~ȭְ}~~||~{}}{}}}~|~}ʫ}~{|ܸȼ}}ܹ]⾈g<:.ƥߺ=90⺵<71jcQ,,"ธuYVE㼧ùѳ QPY`lw}4߿gQxR⻘QQƽ⻫ʬݶڷ׳մTrf໴PTh^lkl]q__jxWޭTUU{jPY䞛ȼ·ܵ۷žԳKU{=hlxh7[{Tɽ䮫㺰l߿ZFI߽x^UɷŶ޾Q_Wvԭv殨?>:`\S䕖ǭ||~|~}}}}}{|۷ʪz{}}}|~{~~~|||ϰ}}êz{⾚㺝ɫ~|}}ƺứ|~{}}ۺž^gۭGxAz̔J޿ṷzk䝚ɬ}}}ɯ|~yɬ~|}ȫ~~~⼚ܵ|||ɬ}}⺝ṛɬ|~{⺃~|ϯ}}{ɮiyvT̵6俹@=8{szp|q䞛Ȯ~|}ݶ}}}ɬ}}ʬ|~}մ}}ȼ۸ֵ~}{὚㻙ɯ{||~yȫ|~}}}㼷V|߿ܿk&hύ⾸?><|s||tplc㭪}}{߽˪}~Ľ}}}ȫ~~~ȭʮɬմ}}⹚ຝ˧~~ǻ|~{~}y⹟Ľְ}޾ṙ^w{x㿸B>;zp}q䎊@<9PMFȾܺè¨~|}ɫƼ}|ɬ}}ȭִ|||έ||zɬ㽚~|}~|⹚⾚ɬ||~ɩ}}}ͱTY6R4w㿷@::{q{uojdC<6߭|~}ṙʫ}}{ɩ|~}㼃~~|}}}⼜Ổɬ}}{ɮ}}{¨~|}ἚhzӨ࿶{ebnh[ړi{ӑ6_俸?><{o{s ៘{q~||~}ɩ~|}ɫ}}}ֳ}}{z~ʻ}{|¨}}{}}}¨ɬ}}}ȫа}}㺸}~έ|~}=⼈̑ik7Tb⼋HQ3_'㿷A=:{q{p B<9>=80/-A<9т⾷έմɩ㻺ԳʪִᾷɮϱαײԲ㸺ǽɬɬ9lcxugٶɉ{ӒDl(j㿷A>9{r|s///ȶɺݶ}}}ݷ]h޼z⺷ɷ⹶xixSQ6N44lwPkw?<7{s{pȸrkarke۸ϭܹ|j^jxf຦㺇͹^xkl'^76)4j~|p㾸A>7{p{u㝛 ?>:/-.3.*č}}{}}{}~ݴ۳ʪs߿R(8Fۿi\4C7'x_3k'^xi*hտȵ䟜ɽܧЭЭhwi`iܵDxmy D4l^DPPl5\e~|}}}}Գղմ~|}㼜Ἔ۷մ}}̪}}|}|~y|||ɮ}}}}}ļ㼫}}{~~~|}z~|~y}}{۵ϯ|~}z~}}~yʯ}{|}~~~©ê}}ίxEl㸨^m6A26jl43P4y_Ȯµ~|⻟⼝ɮ||~¬ܶȫ}|ȭʪ}}}㺄||||~}ɬ|~}⺔ܻǽ|~}ç~|}~|ȫ}}{ȫ⾰~~|Ӳݸṡܺykv⹘˪74O]6ik66^̈́մéȼ}}{作⻚㼤~ɬ}}ɬɬ||z~|ȫ}~~}y{}|ܷ|~yմ}}{⻍}}}}ʮ}}{Ȯɪ}}}ʮȼ}}}մմ۸ỷ7\k3\lmUA௫ܵƼܵǽ~ݸz~}⻛ṚϮ|}ʪ}{~ʻȫ}}}ǻ}}{|~}}}ɮ}}}ʬྜ}}}~|}Ȯ}|xȮݸ}}{۷ɬɫܸWJ4lm4*(m垚αЮݶὧ}ǻ㼶~~~㸝亝Ἰ~|ȭɬ}}}ʮճɬ}}}ɮ~~~~|ɬƼ}|zǭ}~ȫṛ~~|~|}ȫ}}}}}{մ}|έ|~}ɩ߼kPQ[կԳ¶䅅ίʭڹ⻾}}}ຜṐղȫ}}ɩȮ}}}ʬ~|æ}}}}}}὚|~{ܷ~}{}{ݷ~}{ɫ~|ɮ~~~Ю}~yèɩ~~ɫ4 R^8S强⼹៚乩Ѯ~}{ղè|}}⼣|~{ܵz{ɮ~|ɬɫ{}|ɬϭ~~|⾹}}{~}{}}㺸|}۷㺰Գʪ|~{ɫ໐޺⻜α7^6Q3 \aԆ¨㺋ȒݶⷑɬἍʬṿἷֳӬЭݶž⼷մȫմԴ⺷ǽȭ⺷ίϭǽܷ§մղմаǻɺܺ_kvB徺ǻ›ί~㷻ǽǼwQ6 6k'AJʃȫԳǼ棤ۺ⾩ڹǮʭjk%^kl˟xo||||{ǽݟܸ~|}մ¦ܺέD66kl+,14ku~kv|aqܸ̚|~{ܸ⻛ѿ*5 k lklwPY`QX`6;>OV^4<>yEHO3;>lu|hwzkv|iv~49 A>9׆زƼȫմݸŽļ㽜ɮ^ lQ75336w6;A4=;㿸#^^Vȸ槤z~Գ⼞Ϯཛɩ6ji3465l{CHK韱6;Aku~luz69>3kt{mx~ku~kv|5;92;@Y49@=8㾸>=8侸=<8@<9߶ͯ۷࿽ϮЮ3Rkk yp`oZgmx6<<6;>iv~ku~hvku~jwkty(+0DIO^2/*ƺA=:D<:㽺A>9QNEǻ¨ɬܸܺڹƻ^kP'6ED\6'aoYj5:=5:>͡\,c 6;?lw{iv|BIOw)-0mv{iv|iv~P18 Ό NNF=>8⿹>=9䜚A=<䎊~漹ֳ۷~|}Ἡ36jyLA>9㰨2.-0<4;Akv|nvy(,/5:> nu{kv|kv|',/3:@[c\V! >=8 Ź0/+/.*1.)`]XD<:侹A<9`\S 1-*./*㟚ƻɬέ⼃ί6)Nk^?>< 佺I韱R㿸ȺǷ ㅅ~}yȼȭϮAklȸ  n៘/.*MLGolcЅ˪ݶֳаɬ(\ _杙@=8@<9㵲¨~}y|}||zְµSCC \lm_qöЋϴϯg6R\Zcť}}{~ݶkkاblonӎ|sƿǾ㮫ݺE^io^lc\VB=9ڕ>lv4.A>7 ֿǺ_lttl_Q䏈~rke A<9@<9A=:0/+/.,וTpfkaȸ@<9`]X}ݕ߽`l_J翷>=9~|p{qplcqjb㞚⟙sje a\Vqjd PMDބϮѮS^wl`a1.) {uPMFQLF{o|s~zq~{r{r|qC;9`[W|s>=81.'>=9Ⱦṫ⺸}}{u{l_p^⾸ @=8@<9@=80/*/0+""|qzt|q{o2.-@<9{pzp‹݌ֳݸϯJڧɥzY忷@<9QNG{p{s{r|qA<9|q{qʹǽ⟚}|}~~~⦣аylQ㾸?>:yr{q |s|qnkd|sB=9{r{qʹܰ羸C;9|s{pytQLHNMHyr䎊C;8ȸ{qa]T`[UokbPMFB=:|qzvӢǽŗ۹ɶrkc佷sjaoma nkb>=9@=8a\VPMHribȶ㡙|}ǻԅ~pi_olcokbȻ⩡VA=:A=:~~~ݷA=9宧"|s_\S A=:~{rc\T}q2-*||p@<9QNG QLHz⽹kkRQlȶPNO! __WB=:>=9ok`@<9.0+ `]Xplc寫Ϯ\t`_k`ONL]^VA>9䑊 @<9ם{s@=6>=8>=8俸 栚/.*Ǽܺ_:^埙c_\ "//1//->>6@=6qjd@=8NNFPMHǸ@<9@=8A=:ȸPMF䍌èYE|s|q{qzp{p䮨{r~ys|pzrzt|qzrplaA=:QLF{p002>?A?>: A=<plc_\SȌhlKu^oW ȹ! @=8B=: ?>: ^[V{r0./aa_@=8ᎊ>?:OLE}q2/*./)a]TA<9olc2,,{s./*ojdƵ_\UȶхĽxTKJZ[NWSf>=;䰦_\Uᯩ! A=:B=7ȸA<9䐉@=8䝙!!```ȸǺῷՎ~ɹ~徸Ⱥ㰨|s ȵ 1,)݊ƼY~l?>9B>=_\Wa^UA<8~{rǷ@=6䐉`]Vb^]oprOOQ`]X侸! zvȸ㯩feaUOGM/.*qj`zp"  zq{qojd 2.+>=9 1-*rke䯩 !"ȺQLH㠙 A<6 ʪUl^w]5./*հplcokb@<9ב@=8Ǻqlhpproompmf㠚{rǼPLIkZl[U\lcyco1-*ȸPMDNNF@<9 @<9ż|q|qbZW]]QfffD^`XFpl@<; {pzp{r">=;>=9A=:yoᐉ俹ok`ɒw{sA>9yvQXk~B=:㟘okbrkc?>9@=6@=8 ==;>?9 ⟘olc˝^䰧ǶK|s䯧zrǵ|qzp㿹|sǸ}qǃzqA=:?>9plc佺g䟘5:=X@<9`\Q@=8ƹɽBU^k0<1-,Ǻa]T៚Rjak^,9{r䮧QNIRNE~|pzr㏋@=8A<9rkc|lSLBńݵ_19;1p  @<= QLFa]T侹0./ǁzr{uqj`QLFolcokbǸ㍌ǻ_>>6&,/:B=92.- 㿹 ok`{sPMHǷ `]VzrB=:ƺȸǺƺȶվȹԾ㋊H`j^A>9 ྸ>=9B<<2.->=8>=9@<9>=9>=8 A=</.)//-A<9`[U >=91-,@<91.)B=9^]X>=9/.)//-㡙?>9 _\UᡙB=72/*QMJzpÏM>=9俷A>9@<9Š/.,㠚 MME|sA=:㾸Ƿ!㮨B=9⑊nl`_[PǺ~QMD  {sƽ{q猋ǽɬǭϲέαϮϮʬ۷ݶʬɬɭʪаɩȫȮϯ˯Բճʪճk1:9|pC;8㾸=>9|PMH`[Uqj`կnkb2.-=<8俹@<9㾸QKK>=9䞚ztΌ@=8qlfnl`忹>=8pmfzr͋è}}}}~¨⻚㺚⼛~~~|α}}{}}}۷}}}⼐}}}laraRS6:PLI>=9?>:! @=8 Ʒ@<90/*./*/.)Ȝ㐉RMIC>8俷A<8 OOGzp}qA>9㿹a\V "㾸?>:}qzr{r{u@=8~|p{p̙Ἠ亜⼝ɮ}}}ȮçἸ}}{~~|մ}}~|}մ|~{|||۷xpƼ㿹ŷ׿~|o ! b[U@=6{p5+*ȸ ⭩RMI@<9㿹B=:友rke䱨>=8᠚ojd{p{sqjd@=8@<9 c\RyoʛỌ㺜⺛Ṅȼ⹷~~|~|}۵}~~~|ƻ}}}Բ~~ƼyL1.)QNIǺĀ{w PMHA=<>=9#?>:zrջ@<9⡘/0* //-ǎ/.*0/*1-* 0/+{u{q/.*"|sA=<ok`PMH|s|wҍϭϰ|~{ǽǻ}}}а໚⼛ϯ}}}Ѯὸ}}}|}մ}}㺡⺊iuh䠚`]Vok`ĿԞ|ső|s~|pƏԏA<8B=:pkeC;8ǹĠyrA=:qj`QMD㐉@<9QLH|lQLFQLHǺplcA>9rkaǹRMGRMGǻzozs{p@<9qjbolc{p宫|~}~|}ớ⺚ʮ⼺}|}~}}}ֱ~|⼇N`[Uȸ {u/.* /.)QLF|s {q sjcnkd~{r1-.TJH|q! {splaB=7@=8䯪ộȫɩ㸣⹋ݶϲ໰ṷ}}~~~մ}}ʮ}}}ɮ}}}ɮU?>9{oA<9䎊okb ᝙|qzr|q@=8⭩B=9}rokb㟙|s>=9"d[V؃ִܸ}}}⼩~|}ݺέϴ⺦~|Ǿ⹻}{||||Ṿ}|z~}y}}{ִճ}}}A>9|q{r@=8a\V{q{r~|p Ǹ㰨{pPMH {rzr{s德A>7㾸?>9{q͆ܵݸȭճձɬ۷ɫɬմǬ۷Գɬ˫ԲɬǮɮԵЮɭʬаazrnkb⟙A=:zpzp@<9`[W|q{r{r{uɍ2/*|s{pyrzp@<9ԟ_\W ϭ+^J^ȸ {r|vpke|sQMDA>9QLF|q{r{r㿷A>9yo{p|sԃžɮɩίЭ5N`垚㞚 `^R~{r`]T mme{s{o ^[T{p1-,a\Vyr/.,{q>>6A=:@<;Ā|s}q徸A>9Ⱙ{rqjb 㿸ڷݶr[^qjoqmd@<;ם{u侸Ր|s䝙|qƺ{pƹȸ|qܸ۷ȭϯ亲ճi_@=8Ú㺩ܺ}~ֳ~|}ǻܸ⼲⼃ЭǽݺЮk{qplc㿸⾄ϯ۷èӳܸɩǽܳЮ⺓Gǹ䠛ļʭ}}}}}}ԳϰƬܷЮªݹờ¦ȫֳִȮܵkJ^iȺܸǽ|~}¨ճ||~ʻƼ亰=a.]Lᦢݶƻʪֳ}}մ⼨ܺܵ~|}`bJ|~}ѮܵȫϮɬն㹡⹻ݶЭ~|ױճmoT~㯪ֳɺ}}{|~}ʪ~|}Ȯª᷁ϮίT^k_D=5?>:@<9@=8c\TD<9ȸridȽy~x۹~|ܸմ}}{⼸~|}}}ϭմϰ]yxiuvtm {qɠɽ·̺Ԯṿ⺱§ȫ}|ݸܺ3䟘⡘羸#㾹ȸԡ{oǼǵ֟{rǼńɧȼ⾋ʻ㺱ֳ~}{ίUE{njvS`t[i@=8ȸ?;:plcǺ ⼹A>9/.*c\V|q!A<9/0+qjbplc ǹ}}}۷㻹ܷǼǻϮ㼚|~}\@<91-*/.,@=8ǼǸ@<9ſῷA>5俹==5吉a_S?>:~{rolgzp䯫ܶ۷㸠ִϲȮܵQA=: ~zo@<9㡚 >?: zs`\SA>9 -/,@<9`[U=>9 ǻ!A<8 {qA>9⿷B=:@=8@<9>?9{r{qʩ㼄⼰_l*A<8B=:  ƷA<9䠚A<9ǸOLED<:A=:?>9@=6?>:|p{q䥢}}{}}}çʻ~|}ǻJ_?;8omaB=9?>:Ȼnkb@=8A<6NMI/.*`]X1.)}ɹc\Role濷@<9㐉a\V>=8|qzpו⹣}}}kXR?>9 @=8..,/.,|p?>:A=<>=8/.*A<8>=9B<<>>6Ǹ䝙NNFB=9A<9>?:@<9 NMH@=8./*a\V|q?>:zt{s}~⾚ȼ߽ܵxSAl@<;Ƿ1-*@=8C;9bZW䏋{r1-,plc>=9ojd侸㿸伹@<9ԡzoƹƵᄅȮžݶCW]6ǵA=:okbticA<9`]Tǹ䠙ǻSLDƸŅǻ⹚Ǿʮ۵Գˬݶ=QMDRMGpke㭪ʬɭ|~{ճỄܺk{r 㮩ϰմĽݶ۷ݶN琉|qȺܶιܸⷣ㺋Ȯ!؉ϯ߽⹛մỚǯƼ~|}ܸЮԵ`p}}Գª}}ۺ}}}ݳܵ}}}¦~|}[㮩ϭȮ~|}}}}⼚Ṥyk^֦Բȭֳ¦ϯ⾚̭⼝ȼ㼲ϲƻṰ⻴ǻ㼰ӲԳ㼜ˬ㼰㼝ˬɮܷԵh^̈́}}ݸԳ}}}ɫɬ}|¨ղ||~èܸ||z~|}ͯɫ}}{ɬݸִɫȮ|||⻝ʪǩɩ⾛ȫɺ}~⼜~~|||ḛ~~ʯ}{~ɫϯ}}Դq:㬬մ{}z}}{ʪ}~ȩ|~}ȫ|}|||ܷ亜⼜佚⻝Ṛ|~{}{~ܺ}}}ⷃṿWE^役⻪|~}ǻ㼙|~}㹸}}{}}Ὢ~~~ȭἜⷜԶ~ṝܺ}}~~~۷|}}}}~~ṛĨWՀ|{ȫ|~{ἲ⺷}{}zɮ|||⹙ໜ|}|~{~|}ܷ⾜ê}}{~~|§~|}|~}⺜⺸~|}⸰|~}zy¦}}}Ἰ}}}}{|⺔ֲ⻛㼚α|}ཚἪ}}}}}~}{}}}~~|⻆ֳȫܹܸʮfݶɬֳ}}ϰ}}}ýṺ}}{~~|⻿}}ɯȮɩ㼜ȬȮʪᷚ⹶{zª幜ʬǭֱ㼛}}}㼋~}{~|}ɬ{}zȭݶ㼷`€{ϭܷ侤Э㼜մŽ߽㼜ǻ⹰伱⼲⼠ܸĽŽԲǻ⻾⺙ȭ⼓ֳSȼ߾ǻϰѮSȼϯợ¨yFXɽ~ϯ㼩`U]ȽδմȼvȼͰնȮߺϯJ҃ϯ⻷ܺհɯɭ|||ƜܸɧݸȩܸḥΰЮm䵲ۺ|~{⹣Ϯհǻ}}ֳ⻷d⍌㼸ܵ۵~~ܵ仾ັ۵~|ճ}}{ղ۷kՃֵƼỾ⼓ȫɬܵ|~}մ㻱۸üL̝ƼɽǾЭ⼂ղ¨ϰɫԳ㸣ǺlnՃ~ίŽɽ䬫ǻέ⼠Բħ`Ⱦʻմ||~~|}׳⾱ȫˮ㼊ɩ㮫㮪ӵаϭἈݷ⺱ն`|}ֳ㿹ֱʬܸЬϯæղ]ʚǻ¶ϯỔܶ⹷ܵɮȫQV_Ѥ۷ᅅǻԳ}~ӲớԳܶܵR1wB}~ֳմ攕ɬߺ۷~|}~~|Ϭ״{{}NSτ⺤|~{Ĩܵаܴ۷}}Ϯܸdl~Pn}}ȼݞ԰}{~ǼƼɩղKxP⿸Ǽ|~}·~~ʬ⼚ղ|}ªnF||~αǽⷷ۴˯lܶݹĽ㺚ܸܺC>;ǺojdmmeD<9 ok`PMHǷ/.,A>9QNI {qƹ0/+>=8ȸῸ槤ܺȭܸ㼓ۺݶǽܸE_ᾸNND! >=9|s! Ƿ~zo?>9pke1-, ȸ㑉~NMH{q|qۅ¦ܸŨ~~|}|z¦㺫k]O1-*|s~ysA=<#㡙`]Tǹ0/*_\U|q/.)㮨plazp|q澸ƺǸ䮩ܵƻֳܸܸԴЮ`jUq俸@=8zr|tA>9=>6@<9==;{p|s>=9侸OOG!{s{r䰨  ƹA<8 `]V_\U=?4!..,è|~}žƺղl侸@=8|q{r@<9! ᝙a]T rjg{sȶ-/,ǺƵ㰪 zr{r ǷǺA;;"Ǽдɩ|ݸuxῷA=:{s|rA>9@<9{s >?9~{r徸 |s @=8Ʒ⿹"{q|q`]Tpkeplca\Vȸ2.+㰨RNEA>9Ѓ~а۳`cRB>;=<8@=6@<9A>9A>9ȸqjb㟙qjbɶPKE @<92.+PLI{pƺ@=8plc㝙 --+ȸ{q{pǵ "?>:@<9@=8ʜl`\S>=8zr`]Tzr{p   {uqmb@<9ʚcRx㏋ȸD;9{o|s{p{sokb{prkcNMI">=8͛xN㏊Ǻ䡙{sQLH2/*{pΌ{rzrzt{u{p㐉C;9c\Tɶ|s㞚ϋܷ=@<9plc{p㝛QLHǿܸM摉~@<9 ޵}}}ȫpPMFA>9ȶ׃޶(764k'O䌌ȫ k\'D䃅ħ7PB5*]PP4&Q4ǽ~|ϯk5liQC636'*6[óDx 7l5Pyhpdj~卌3Ql33R(PW>Xϗ) PCQpV]PMH?>9@=8@=8㤥ljl+ yC3&mQX^ ᯩ łݷix5jlXa]Tzr㠙B=:ՍǺ|p⿸ՏȻ{pԎ֟|sᦣƼ'YW#./*>=9㞚~{r_\UB=:{p`]V 䟘~|o`]V/.)?><{roma/.*QNGzp {q櫫ɮ|~{||~⼝~|}~}{}}}~}{|}|~{⽄}}}|~{ľ|~{{}|ʭױ}|z}~è㼰|~}i6Xmzr{u|p|p! |s~1-*a\V|srkc䎊~ole"ѕȮ}}{}~Эɬ|~}~}{ʮɬճϯ~|}}}}}}}}ǭ⹧~|Ṅ}~yǼup{q{u~|pΌ {u{p~{r`^RQNGA>9>=9㾸A=:侸@=8?>9_\S{u~|pzr"ȵԕ~|ɬ}}}}}ɬ}}}}}}㼷}}{µ|}}}}|~{ɩղ}}}}}ݶè~~~b``/.*Ʒ徸 ztzq{sztA<9A>9A<6A=:A=:_\U|s}q{o|s䏋QMDϧɬ}}}}}ɬ}}}}}}㼐~|ɫ~~~ª}}}~|ȯ㼩|~}ȼ}}ǽjjlhjwk㎊@<;`[U㭪{A>9`[W_\SsjczrQLH⑊ױܵɬ}}}}}ɬ}}}}}}۷}}{|{⺻{{{}}}}{|ȫղ}}{yS^ju/.*!zp|s1-*]]U nja#{rqjdǹ>=9隚"}q_\U/.)"qjd`[W2.- `]Typ/.,`[U{pǺῸ¦۷ɬ}}}}}ɬ}}}}}}ȼ~~ɯ}}}z{}}{ȫ⼡|~{Ƽ@mkyko{sztƹǷ㿹⾸{u⾹ǶŹ|s㾸Ǒ}ُ{|qǺb[Uʫɬ}}}}}ɬ}}}}}}⺦|~}|}{}|ճ~|}~|Ȯª}|}}{۷j^O5Ql* Qv㿸ɬ}}}}}ɬ}}}}}}⼃~~~||~}}}}|}ɫȮ|||}}} 577&)Q2ljUP|~}ϯɬ}}}}}ɬ}}}}}}έ~~~}{|⻸}}}}}}~|ʫɪ}}}}}}E3DDP3 PlymԾӵɬ}}}}}ɬ}}}}}}ự|~yç~}{}}ܸ}}{~|}~~||~~|}}}{ɫ}}|~}jiA5N)(6imkxl\O㟜ȫ۷ȬǫܺȫȪϰȫϮܺȬȬܺȫɯȫȫɯȫ۹ɪɬ6*llQy]y^5i6dlmքȻA634[l\4P64[ 3O](vهȼ7nЄϮή)}??7ƺA<8@=6՞֮|~}ͯi./*zr䯧RMIqjd⣥ƷQLHQNIȸ䍋2.+plcQLH՞zs՟{oyp՟|p⮨ztA<9䕔k>?:-0' /.*`]Vzt {q2-)RMJ{r"{o|s2.-QLF|s  sjaojfƷbZW2/*||p?>9玌rke zr>=8䯩A=:䎊rkcolcokbǺ0/*?>9Ʒʞf䰧㠚/.,nkb_\Wȶzra\X"@<9@=8a]T~|p{r|s"ȴ}tzr㾸A>7A>9{qA<6{u{ozr@=8䧤êKᾸ |s{u Ǻ>=8A>7^[V}r{szr{uzt|s⿷?>:>>6|qA=:zt|s|s|s㼹__[澸A>9ᎊ~# ~zq|q`]V_\W zr|qᎊA=:qjb}qPKE{o~|p㾸@=8oleplanl`pla>=8zr݋ȼ)T㿹@<9nkb>=9qjdztɹQLHojd@=8{szr䎊@?;QLFojd>>6`\S䡙㞚ŁzrԂ{sǷ㰨okbἹ {r`[U?>9" `[U|s1-,`]V{s{uΌA=:njapke1.)B>5~|pQMJ/.*VTbp侸2.+RMIplc0,+|t|s1.)0-(|q?>:a]T{p |qnkdA=: >=9rkc{s!@=6@<9PMFPMHojfC<4佷侶{q㏋ǼՎ{pȴǏ㠚zr҂ž^㽹A>9@<9?>:QLI㯧?>9?<7=<7|s 㠙|qzrA=:B=:qjb䢚D=7A=:|q{u|s{u@=8|p~{rA<8>?9@<90/+A=:㰧ONJ1-, ?>:B=:㝙̓ϰ޾yPlbg{ִݾ{⿹@<9{p|splanl`ȶ/.,|m}q1-,ȹ @<9A<8>=9!A;;㿸ⷙRx_e⺶a俸B=9 "ȸ"zt ƹomapi_.-)᠙A=:Ⱥ䎌""|}ϲXܑU]ْhz޾u佷រ==;澸 ?>?:{r㞛=<80/-/.)0/+1-*1-*_\S qjb㬨 ?>:B=9/.,ȶ㼻ȼ㧤WG޾q־ӾǸ㿷ſ㭪ݸJbr孪໖чK݅¨eTiŁɮrR{߿߽_Ō~|ϰԲɨ߽ܺ[݆^6]{߽w侺|}ֳɪȫD]bgݶkѧ~~~⽹_kl̂Ϭ{gߺ䟚jzmȈέ⹷Plf÷Ghq䟘㢚塙ݾS]C;8ȵ@=8rkaƹȿϯZ٠x@=8/.)1-*@=8ƶ䦣XޠdA>9"~zq@=8?><zt"A>9 Ⱥ>=9!!>=9㭪ݺ⺶ElA>9 A=:@=8! 䝛@:: TME~|}ճZv@<9rkaA>9A=<>=9~okbԿƹ1-,b[Q̦⺶gkyǷƹA=:@=8?>9{u{r㿹A>9>=9A<9A>9ole߄}}{{}|vm޾G`plcA<9A=:0/*@<9A<9ȼB=7@=8俹 #@<9NNFȸb[U Ʒ|q?>9hc_}}}|}}~hjkD<:A=:?<5plc>=9 /.)zt>=8NNF ȸhdc||~㔗ܒ̗Ҕ񧵾褭A;;NNF"sk`ȸrkaƷ>=9ȸ1.)/.*ȸ>=9E;9堛"`]VQLF{n||r㝙ǹ`\S?>:҂yt@?;QLF0|}}{|~}|~{~|}ح}}î~||~}~}{}}}ܡ򇋎ܒ@<9@=6|s >=8@<9@<9 澶 PMF>=9nkb/.,PMH%79)}}}|~}|}܎|}|||}}}Ă}}󡮴~}{~|}ZA>7 䟙\]U>=9B=:B=9b[U_ZVȸ 0/+䮨tjaX|||}}}|}}}{~}{}}}}~}}ْ}}|}~|}w>=9?>:A=>6C>;|s~|p}qyo䞚/.,A>9ȸA>7A~~|~}{~|}~|}}}~}{ڝ~|}򪵻~|}~~~}}p?>< 䠙]^PB=:./)>=8`[W`[Xҁ{oPLKǸ./*Ź|}{}|}}}؎}{~}~|}ͺ~}{𒙟޹}|z|}iEvA<9@=6|q"QNIzq㠙>=9徻 `\S㮨0/*zt^^V ~@<9^|||}}}}}}־~~|ܱ}~ï|}~||||}}}|||ܡ򉊌܎j_a殨{prkcȸQLF Ⱥ ojdomaǷrkeȸȵ./*1,)ƹ㝙 >=9pi_RMIǺ>=8 tkf|jc攙˚Ԓ褭꤭kPz\_wfdq俶ȸỨTlkqskԨ߽:T㺘ˉP㑊s㸵fqprrtqssegKỊAV:!/.*X9;F`ƹmRCk{mzbcG翸Z]!k]Wplc@<9A=: 2/*B>=@<;ȸxfmTɈ䷶ƠZouT|m?2[D@<9NUixX{RIjys}A>7Ǻ/.,2.-ɶ@<97:?"CGPx3:@'+.߿*߿zlyOtY\f\Y~@<=㿷 !lw}6;>jw}\iqRXX߽V_}ֽN?_b`Ղ{q|qA=:⡚]]S_\WXPW_!mv{Zgm4;A㼙Rkjj^urqe޾ǽ||~}}{ȸC;8ᮨ>=8ƷR5}4m)Xhwż\gm˒durtd(CLQLFA;;yt|s{p1erh3;=3;>jw}iv|6;?ɬ۷㾸/.)>=;k2<>6;>6;A@=6A>9㟙b[Ua\VPW_mvkv|46:=mv}>=9俹  PY` mv{46;>*+-(,-^gnBIQlv*+-lv ^gn]hn jwjw6;?7;>OV^)-0iv~5oٰ׿rkaȸƺ/., (*>hki 6:=5:>DIO]hn⺷㿸?>9'+l(+07;>6;>4`>=9=>8pQORᾋ㾸B<<_ ̺69>x]fk)-05=@CJPOZ`lw}iv|lu|lw} lvkv|46;?7;>OX]',0PW]lw}lu|4;A6:=3:@iv|c_Qoz5:>_|LkvɮÖ{ᾸA<8?>9>=9 `[UE<5-6;?"6;A\gm_fn3:@ 49㿸 @=8okb2-)@<91.)ׂ{s Ʒ㎋!忷A>9a\Xa\V.-)B=9>=92-*B>=a\Vqif ǼB=92.+A>9wfƼ}~|~}}}}}~㽷".-+ᮧqjd@=8zr`\S! ǵ@=4 䟛A<8@<;zpzrȸ?>=8>=9{qzt>=;?><㿸A=9{o{q㠙 1-*PMH#A;;{r{qvnbllϲ~࿹A=:ƹ2-)ɶB=:~zoplc! ƿ>=;#毧??7@=8{rzp ǹ@?:B=9~{r{svY^ձ㿹>=8 @<;@=8{u {pA<8俹A>9~rMNF2.+>=9@=8|q{sǸ㑊>=9|szp|aiA˪ʦǷplcgef  hd[okbȶ|pQNI2.-A=:ǹplcplc `[WA<8omaƹ㟙㟙  pke|sokbǷ㟙6]V_xS޶|{մ㤤Ƽ|}yp~{tߟ㠚`]VVr>\԰ǻݽȩǼȼ|~}ㆅֳ۵Ǽـ|syt~|p |qoma Ƿtku~i=t⺊Ԯ|{޸۹ʬȸzrȁzpt+-,]fm V`[Wlα}穡¶̗æ⾰~~~||~ v^ekkv|꟱Jƺȸ׿žɺԲˮȬϭ}~}~ۺճɫȵ}}sj[hpCHLlu~(,/(-0yOX_)M[Obf  PMHokbSKI^^V㠙NMH|q/.*nkbܵ⺙1-,BJM39PMD㳦QNIǻ鿸DIM6;?7:?2<{r{q/.,ɻzpb]W}qkɩ~|}Ϯ}|z]hnv kʑ1-,?>9QMD{s㠙?;:PMDVϯṶ'+, "(,//>㿹PMF ӏokbA>9 s⺺}}{}}}ⷱմ㸷ǽƻǽļղ}}}Žίձh ]hn]hn(,/',0lu|*+-\gk(,//PY{oA<9ǵ/.,{uA<8~3--MLGplaa\Xp⹶~|}}}}~έὛ||z|||}}}ɬ㺍~~|㼺~}y⼸}~}}}ڹ㺸||~ἡṩղ|}߾ZܢW÷ȸ㺝|}Ϭǭֳ⺚}Ẫz~ϭ}}}}~έ㼸~|⾸|z{}}{|~}⹷}~ִ~}{ֱֳϯ}}}έϿ}}}_m໱~~~ȫ⼛}}⼵|~{㻾}}}{}z㺸}}⼷}}}}}{⺷}}}㺔~|Ǽݺ~}{…ȼυ㼪||z㙞꧶諳Zܵz~{|ɭᾚ|||㼜|||㸛}}{¨¨{}|⹸}}}⼸}}}Ǯ}~yǭֳ۸~|}ʻéЈ~Ľɯܶ||||~}y}}}Rܳ~|}~|}}}}⻛|~{}}մܸ~}{}}}ܶ۹~|{}zܺṹ}}{ỷ~~~}}{}}}ɭǽἸ۹ǵiȅ}}}}]𿸰z~}䥤մ}}~|}㼜}ʬè}}}}}}}}}|~}ç⼸}}}⼷}}}Գ|~{}}}⺱㽽|}~|}gՓ}}}}x⽹H㸣|~}⺛~|㼩~|}~~⼸}}}㼸~~ⷜ}}}}}}۷ྲྀǦYڅ}}¾}{|}}}B佹}~O⻯ɮ໲|~}Ὓ|~{⻍||z¨||zỷ|~}Ἰ}}}Ƽ~|~|}z~}ǻϯ{ѷ|~}{}zݫmỸ}}{}}}~в㼜~|}а}{|~|Գִ}}}}~yϯ㼷~~~㼸~~⾍||z}}}⼪߿k^}}}~~||~}W䟚Pʮײȼɬɪ㺸ʫɮƻɬɯèȫа争Ы^luBE񃄆Ԩ}}}mựܷeQ m'[䙞kύʹmṲzM^&[QN6y3P54`2]AkM]6^FAx6OP6xx7QAcƼ¤U25_x''^F D^x]DN D8i4llQ4)ml)^'l]Ol`⾱߿RD3li6w47iC]ykNDPy'5lxvɮɪɪȫܷͯͱɦȮʮ֯ͱɬԳɬɯȫϮݺɬȮɬֳͯȪܺ[kkkQx676kyj36 346'64mlN7 4li 5665B65jè~|}~|}ª|~}~|}⻚~|~|۴~~ݶɩ~~~|~{ܵ}z~|qA4Bu^4wjyQ C D'&67 i㼨}}}|~}㺛}|ϰ}}}Ṇα~|}{~մ~~~ɬ~}{ʬǼ~|}Ϯȼ~|t )mx\Dx']^P'y^CyB*& yQ[*) DA4^vZ'⹋|~}}}}ɬ||~⼓ϯ|~{ǭố}}۷~|}ʭ~|}Ȯ~|}ȫ⺩~~ԲzӮ'4Q 4*( 6)E^O5)'4 Z*4)^ \)D6 hl75DQ[<ί}ǻž}}Ϯ|~}}}}ᷛȫ|~}ɬộ{|~ճɭ|~{ễֱ}}{µCRujQ⼽}}~~~}}}||z⾑Э||~¥⻔~~~|~}Ӳǭ}}{ϰ~}{}}⸶ȇPEộʫɬ~~ֱ}{}||~}ѭ{|~⼆а}}}}}}ճɬ|||ɮ¦~|}ṷ~~|ɬ|~{⺤_G3ܶ|}໩}ݵ~|}⺡}}}~ڸè{}|}}}ɮ|~}ȫ㼢~|ϯž~|¨[y4۵ʬմֳɫݸȫմֳȩίɬɭɫմʬմʮմȮȫݸʬ۵ܵʪЮȭЮݶǭֳI~k⼨xq^zq`Ÿԭ|o_t່gyq^xq^԰Ǹyq^{o_~|q_xq_zr_ԯӯyr_|o^j⻩zr_xq^ǶkbS㺘̆y44mUnŤ::.ԭ.)%կjcQzr[zr]⾘syq^㾷\UE.*!֮=90ƧίģNF9]UJzr_vƥ?8.԰.)%<:-߼Xڅ,[D3ahsộsjeQĥ⼷xr\\VFԯJH9ţicS㸦vŤYVEJH<ӭZWHtmcWš?8.zq`v~j[UEicSiMG9ծ߽;y^kYnzr_xq^ỵ|q]<:-?8.|q]ṵ}r^ƪ;9,Ǣ<8/;9,{p\{o_;8/vicM-*#ἶkdTxq_޾k~_A^]457&xnỈi|p`Ʒ⸵zr]MG9MG9Ÿxr\㼹~hǸ<8/ԮLI:NG=j|q[ù?9-<90~h?80Ỹys[{s^ἴT 6i\P3Px5WkŷgeP<:.亷yp_⹊k԰JH;;81jaRúԫLF:KH9԰⻩jŸidQ<8-=90=90ƹ>7-⼶zr_{p^߼Xx_ y6j]alcRxq_ibPw⻸{p^Ա[TDzq`[UGƷ⻙tmaSyq\icSἉfNF;{p^yq^uŸZTFyq^YVEӱjcQzq`ibPx=9.ţ::0ծ=90㼴zr]zr_㺕E,6646m)Dlx⻵97mlljB⺷W] 4_Q7CNm QKwy67\66vCBBd\^ǸŶƷ߿elx㼙Q.EjỶ⽸⼷Zὦl㼷㼷Ṹ⹉ВhVJ㼵~fg[Rqy]⻵㼷㾶߽DG޽⾵[ŸƷƷXߺl^㼉PkὥkbSlz⺨zc\dJWԯwhƥŤԮհøǣӱgjǦǸ|q]⼨{s\Ÿ⺷ũŇh_T]P[5=9-Ŷ԰.)#ҮƤ[UEὥ\UE?8.ƥ?8.lkdRNH:ģԮMG;ƣMG;Ἃgxq^{p^nKH9Ǥծ߼⺩e_k^߼\ؠAԯYVG⻙uӯԲ|q_NF;ӯ㽱yq^ys[=9.jcPǸgdSũLI:JH9ǢjdTŸzr]~hkdR~kk⺕tŸZRih]ỵyq^㸷zo]yp_>:.@9/zr]zr_ĺMG;@91<8/?80=9.ṸOE;yq^}j@7.zr_la,6{ԘdỴyp_Ẹxs]zr_<90?8.{p^yq\㸗v[UEծ=9.<90=90=82⼶yr`zr_=9.yq^⺸TJ[MG;Ἁ~hzq`MF<ȥjcQt[UGӳ⼧|p`zr_ŸMG;KH9Ÿyq\⺸xr\xrZ<:-{p^ṙWrkG^g؝xjhjeR~h>7-|p`{p^qZTHԳ?9+ծŸOE;-*%Ӯǧ?9-]TEZTD=82ǢỸ{n]|q]=9.{p^㼵Cf⾙hvz|Ӧ̨⺵mǤø㼷Ǥ{p^Ʒƣiwղ⼷ԫ⽸ղծԯƧƣ԰úǥհ޾RgٸI߮O_fڭgzջ߾g٭kṶǓߺṘ̓`WFۿyeade4/inst/pictures/paris.pnm0000644000176200001440000073577712576021756015601 0ustar liggesusersP5 560 437 255 ade4/inst/pictures/sarcelles.pnm0000644000176200001440000020252612576021756016415 0ustar liggesusersP5 317 211 255 LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL