afex/0000755000176200001440000000000014076173262011205 5ustar liggesusersafex/NAMESPACE0000644000176200001440000000424714076034124012424 0ustar liggesusers# Generated by roxygen2: do not edit by hand S3method(afex_plot,afex_aov) S3method(afex_plot,default) S3method(afex_plot,merMod) S3method(afex_plot,mixed) S3method(anova,afex_aov) S3method(anova,mixed) S3method(fitted,afex_aov) S3method(nice,afex_aov) S3method(nice,anova) S3method(nice,mixed) S3method(predict,afex_aov) S3method(print,afex_aov) S3method(print,mixed) S3method(print,nice_table) S3method(residuals,afex_aov) S3method(summary,afex_aov) S3method(summary,mixed) export(afex_options) export(afex_plot) export(all_fit) export(aov.car) export(aov4) export(aov_4) export(aov_car) export(aov_ez) export(compare.2.vectors) export(ems) export(ez.glm) export(interaction_plot) export(lmer) export(lmer_alt) export(mixed) export(nice) export(nmkbw) export(oneway_plot) export(round_ps) export(round_ps_apa) export(set_default_contrasts) export(set_deviation_contrasts) export(set_effects_contrasts) export(set_sum_contrasts) export(set_treatment_contrasts) export(test_levene) export(test_sphericity) importFrom(car,Anova) importFrom(lme4,findbars) importFrom(lme4,getME) importFrom(lme4,glmer) importFrom(lme4,glmerControl) importFrom(lme4,isGLMM) importFrom(lme4,isREML) importFrom(lme4,lmerControl) importFrom(lme4,nobars) importFrom(lmerTest,lmer) importFrom(methods,as) importFrom(methods,is) importFrom(parallel,clusterApplyLB) importFrom(parallel,clusterCall) importFrom(parallel,clusterEvalQ) importFrom(parallel,clusterExport) importFrom(reshape2,dcast) importFrom(stats,"contrasts<-") importFrom(stats,aggregate) importFrom(stats,anova) importFrom(stats,as.formula) importFrom(stats,coef) importFrom(stats,fitted) importFrom(stats,formula) importFrom(stats,logLik) importFrom(stats,model.frame) importFrom(stats,model.matrix) importFrom(stats,optim) importFrom(stats,p.adjust) importFrom(stats,predict) importFrom(stats,qt) importFrom(stats,reshape) importFrom(stats,residuals) importFrom(stats,sd) importFrom(stats,setNames) importFrom(stats,symnum) importFrom(stats,t.test) importFrom(stats,terms) importFrom(stats,update) importFrom(stats,wilcox.test) importFrom(stats,xtabs) importFrom(utils,packageVersion) afex/README.md0000644000176200001440000005555314076011251012466 0ustar liggesusers # afex: Analysis of Factorial EXperiments [![CRAN status](https://www.r-pkg.org/badges/version/afex)](https://CRAN.R-project.org/package=afex) [![monthly downloads](https://cranlogs.r-pkg.org/badges/last-month/afex)](https://github.com/singmann/afex) [![total downloads](https://cranlogs.r-pkg.org/badges/grand-total/afex)](https://r-pkg.org/pkg/afex) [![Research software impact](http://depsy.org/api/package/cran/afex/badge.svg)](http://depsy.org/package/r/afex) [![Travis-CI Build Status](https://travis-ci.org/singmann/afex.svg?branch=master)](https://travis-ci.org/singmann/afex) [![R build status](https://github.com/singmann/afex/workflows/R-CMD-check/badge.svg)](https://github.com/singmann/afex/actions) The main functionalities provided by `afex` are: 1. Interfaces for estimating standard ANOVAs with any number or combination of within-subjects or between-subjects variables (the ANOVA functions are `aov_car()`, `aov_ez()`, and `aov_4()` which all fit the same model but differ in the way to specify the ANOVA model). 2. Function `mixed()` provides an interface for mixed models analysis (estimated via `lme4` `lmer` or `glmer`) that automatically obtains *p*-values for fixed effects model terms (i.e., main effects and interactions). 3. `afex_plot()` visualizes results from factorial experiments combining estimated marginal means and uncertainties associated with the estimated means in the foreground with a depiction of the raw data in the background. 4. All `afex` model objects (i.e., ANOVA and mixed models) can be passed to `emmeans` for follow-up/post-hoc/planned contrast analysis. For `afex` support visit: [afex.singmann.science](http://afex.singmann.science/) ## Installation - `afex` is available from CRAN so the current stable version can be installed directly via: `install.packages("afex")` - To install the latest development version you will need the [`devtools`](https://github.com/r-lib/devtools) package: `devtools::install_github("singmann/afex@master")` ## ANOVA functionality To calculate an ANOVA, `afex` requires the data to be in the long format (i.e., one row per data point/observation). An ANOVA can then be calculated via one of three functions that only differ in how the model components are specified, but not in the output. Note that in contrast to base `lm` or `aov`, `afex` ANOVA functions always require the specification of a subject identifier column (the id-column), because in case there are multiple observations per participant and cell of the design, these multiple observations are aggregated (i.e., averaged) per default. - In `aov_ez` the columns containing id variable, dependent variable, and factors need to be specified as character vectors. - `aov_car` behaves similar to standard `aov` and requires the ANOVA to be specified as a formula containing an `Error` term (at least to identify the id variable). - `aov_4` allows the ANOVA to be specified via a formula similar to `lme4::lmer` (with one random effects term). A further overview is provided by the [vignette](https://cran.r-project.org/package=afex/vignettes/afex_anova_example.html). The following code provides a simple example for an ANOVA with both between- and within-subject factors. For this we use the lexical-decision and word naming latencies reported by Freeman, Heathcote, Chalmers, and Hockley (2010), see also `?fhch2010`. As is commonly done, we use the natural logarithm of the response times, `log_rt`, as dependent variable. As independent variable we will consider the between-subjects factor `task` (`"naming"` or `"lexdec"`) as well as the within-subjects-factors `stimulus` (`"word"` or `"nonword"`) and `length` (with 3 levels, 3, 4, or 5 letters). ``` r library("afex") # examples data set with both within- and between-subjects factors (see ?fhch2010) data("fhch2010", package = "afex") fhch <- fhch2010[ fhch2010$correct,] # remove errors str(fhch2010) # structure of the data #> 'data.frame': 13222 obs. of 10 variables: #> $ id : Factor w/ 45 levels "N1","N12","N13",..: 1 1 1 1 1 1 1 1 1 1 ... #> $ task : Factor w/ 2 levels "naming","lexdec": 1 1 1 1 1 1 1 1 1 1 ... #> $ stimulus : Factor w/ 2 levels "word","nonword": 1 1 1 2 2 1 2 2 1 2 ... #> $ density : Factor w/ 2 levels "low","high": 2 1 1 2 1 2 1 1 1 1 ... #> $ frequency: Factor w/ 2 levels "low","high": 1 2 2 2 2 2 1 2 1 2 ... #> $ length : Factor w/ 3 levels "4","5","6": 3 3 2 2 1 1 3 2 1 3 ... #> $ item : Factor w/ 600 levels "abide","acts",..: 363 121 202 525 580 135 42 368 227 141 ... #> $ rt : num 1.091 0.876 0.71 1.21 0.843 ... #> $ log_rt : num 0.0871 -0.1324 -0.3425 0.1906 -0.1708 ... #> $ correct : logi TRUE TRUE TRUE TRUE TRUE TRUE ... ``` ``` r # estimate mixed ANOVA on the full design: aov_ez("id", "log_rt", fhch, between = "task", within = c("stimulus", "length")) aov_car(log_rt ~ task * stimulus * length + Error(id/(stimulus * length)), data = fhch) ## equivalent: aov_car(log_rt ~ task + Error(id/(stimulus * length)), data = fhch) aov_4(log_rt ~ task * stimulus * length + (stimulus * length|id), data = fhch) ## equivalent: aov_4(log_rt ~ task + (stimulus * length|id), data = fhch) # the three calls return the same ANOVA table: ``` #> Warning: More than one observation per cell, aggregating the data using mean #> (i.e, fun_aggregate = mean)! #> Contrasts set to contr.sum for the following variables: task #> Anova Table (Type 3 tests) #> #> Response: log_rt #> Effect df MSE F ges p.value #> 1 task 1, 43 0.23 13.38 *** .221 <.001 #> 2 stimulus 1, 43 0.01 173.25 *** .173 <.001 #> 3 task:stimulus 1, 43 0.01 87.56 *** .096 <.001 #> 4 length 1.83, 78.64 0.00 18.55 *** .008 <.001 #> 5 task:length 1.83, 78.64 0.00 1.02 <.001 .358 #> 6 stimulus:length 1.70, 72.97 0.00 1.91 <.001 .162 #> 7 task:stimulus:length 1.70, 72.97 0.00 1.21 <.001 .298 #> --- #> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '+' 0.1 ' ' 1 #> #> Sphericity correction method: GG ### Plotting with `afex_plot` ANOVA models can be used for plotting via `afex_plot`: ``` r a <- aov_ez("id", "log_rt", fhch, between = "task", within = c("stimulus", "length")) #> Warning: More than one observation per cell, aggregating the data using mean #> (i.e, fun_aggregate = mean)! ``` ``` r afex_plot(a, "task", "stimulus", "length") #> Warning: Panel(s) show a mixed within-between-design. #> Error bars do not allow comparisons across all means. #> Suppress error bars with: error = "none" ``` ![](man/figures/README-unnamed-chunk-6-1.png) `afex_plot` returns a `ggplot2` plot object which allows simple customization: ``` r library("ggplot2") afex_plot(a, "task", "stimulus", "length") + theme_bw() #> Warning: Panel(s) show a mixed within-between-design. #> Error bars do not allow comparisons across all means. #> Suppress error bars with: error = "none" ``` ![](man/figures/README-unnamed-chunk-7-1.png) ### Follow-up Tests with `emmeans` Follow-up tests with `emmeans` need to be specified in two steps. 1. Decide which factors of model should be involved in tests. Use these factors to set-up reference grid of marginal means using `emmeans()`. 2. Specify set of tests on reference grid from step 1. Either custom contrasts as a `list` and using `contrast()` or a convenience function such as `pairs()`. ``` r library("emmeans") ## set up reference grid using only length em1 <- emmeans(a, "length") em1 #> length emmean SE df lower.CL upper.CL #> X4 -0.1087 0.0299 43 -0.169 -0.04834 #> X5 -0.0929 0.0296 43 -0.153 -0.03310 #> X6 -0.0653 0.0290 43 -0.124 -0.00679 #> #> Results are averaged over the levels of: task, stimulus #> Confidence level used: 0.95 ## test all pairwise comparisons on reference grid: pairs(em1) #> contrast estimate SE df t.ratio p.value #> X4 - X5 -0.0159 0.00768 43 -2.065 0.1092 #> X4 - X6 -0.0434 0.00782 43 -5.555 <.0001 #> X5 - X6 -0.0276 0.00602 43 -4.583 0.0001 #> #> Results are averaged over the levels of: task, stimulus #> P value adjustment: tukey method for comparing a family of 3 estimates ## only test specified tests con <- list( "4vs5" = c(-1, 1, 0), "5vs6" = c(0, -1, 1) ) contrast(em1, con, adjust = "holm") #> contrast estimate SE df t.ratio p.value #> 4vs5 0.0159 0.00768 43 2.065 0.0449 #> 5vs6 0.0276 0.00602 43 4.583 0.0001 #> #> Results are averaged over the levels of: task, stimulus #> P value adjustment: holm method for 2 tests ``` ## Mixed Models Function `mixed()` fits a mixed model with `lme4::lmer` (or `lme4::glmer` if a `family` argument is passed) and then calculates *p*-values for fixed effects model terms using a variety of methods. The formula to `mixed` needs to be the same as in a call to `lme4::lmer`. The default method for calculation of *p*-values is `'S'` (Satterthwaite) which only works for linear mixed models (i.e., no `family` argument). A similar method that provides a somewhat better control of Type I errors for small data sets is `'KR'` (Kenward-Roger), but it can require considerable RAM and time. Other methods are , similar to `'KR'` but requires less RAM), `'PB'` (parametric bootstrap), and `'LRT'` (likelihood-ratio test). More examples are provided in the [vignette](https://cran.r-project.org/package=afex/vignettes/afex_mixed_example.html), here we use the same example data as above, the lexical decision and word naming latencies collected by Freeman et al. (2010). To avoid long computation times we only consider the two factors `task` and `length` (omitting `stimulus` is probably not a fully sensible model). Because mixed models easily allow it, we will consider crossed-random effects for participants (`id`) and items (`tem`). ``` r library("afex") # examples data set with both within- and between-subjects factors (see ?fhch2010) data("fhch2010", package = "afex") fhch <- fhch2010[ fhch2010$correct,] # remove errors str(fhch2010) # structure of the data #> 'data.frame': 13222 obs. of 10 variables: #> $ id : Factor w/ 45 levels "N1","N12","N13",..: 1 1 1 1 1 1 1 1 1 1 ... #> $ task : Factor w/ 2 levels "naming","lexdec": 1 1 1 1 1 1 1 1 1 1 ... #> $ stimulus : Factor w/ 2 levels "word","nonword": 1 1 1 2 2 1 2 2 1 2 ... #> $ density : Factor w/ 2 levels "low","high": 2 1 1 2 1 2 1 1 1 1 ... #> $ frequency: Factor w/ 2 levels "low","high": 1 2 2 2 2 2 1 2 1 2 ... #> $ length : Factor w/ 3 levels "4","5","6": 3 3 2 2 1 1 3 2 1 3 ... #> $ item : Factor w/ 600 levels "abide","acts",..: 363 121 202 525 580 135 42 368 227 141 ... #> $ rt : num 1.091 0.876 0.71 1.21 0.843 ... #> $ log_rt : num 0.0871 -0.1324 -0.3425 0.1906 -0.1708 ... #> $ correct : logi TRUE TRUE TRUE TRUE TRUE TRUE ... ``` For the random-effects grouping factors we begin with the maximal random effect structure justified by the design (see Barr, Levy, Scheepers, & Tily, 2013). In this case this is by-subject random intercepts and by-subjects random slopes for `stimulus` and by-item random intercepts and by-item random slopes for `task`. ``` r m1 <- mixed(log_rt ~ task * length + (length | id) + (task | item), fhch) #> Contrasts set to contr.sum for the following variables: task, length, id, item #> Fitting one lmer() model. #> boundary (singular) fit: see ?isSingular #> [DONE] #> Calculating p-values. [DONE] ``` Fitting this model produces a critical convergence warning, that the fit is singular. This warning usually indicates that the data does not provide enough information for the request random effect parameters. In a real analysis it would therefore be a good idea to iteratively reduce the random effect structure until the warning disappears. A good first step would be to remove the correlations among random effect terms as shown below. This warning is also shown if we simply print the model object, but not if we call the `nice()` method. ``` r m1 #> Warning: lme4 reported (at least) the following warnings for 'full': #> * boundary (singular) fit: see ?isSingular #> Mixed Model Anova Table (Type 3 tests, S-method) #> #> Model: log_rt ~ task * length + (length | id) + (task | item) #> Data: fhch #> Effect df F p.value #> 1 task 1, 44.79 13.47 *** <.001 #> 2 length 2, 325.75 6.03 ** .003 #> 3 task:length 2, 303.20 0.33 .722 #> --- #> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '+' 0.1 ' ' 1 nice(m1) #> Mixed Model Anova Table (Type 3 tests, S-method) #> #> Model: log_rt ~ task * length + (length | id) + (task | item) #> Data: fhch #> Effect df F p.value #> 1 task 1, 44.79 13.47 *** <.001 #> 2 length 2, 325.75 6.03 ** .003 #> 3 task:length 2, 303.20 0.33 .722 #> --- #> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '+' 0.1 ' ' 1 ``` If we call the `anova()` method a slightly different output is shown in which the p-values are not rounded in the same way and the warning is shown again. ``` r anova(m1) #> Warning: lme4 reported (at least) the following warnings for 'full': #> * boundary (singular) fit: see ?isSingular #> Mixed Model Anova Table (Type 3 tests, S-method) #> #> Model: log_rt ~ task * length + (length | id) + (task | item) #> Data: fhch #> num Df den Df F Pr(>F) #> task 1 44.789 13.4676 0.0006431 *** #> length 2 325.751 6.0252 0.0026948 ** #> task:length 2 303.203 0.3263 0.7218281 #> --- #> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 ``` We can also get the default `lme4` output if we call the `summary` method. However, note that in contrast to the previous methods, results are shown for factor-levels and not model-terms which is usually not interpretable for factors with more than two levels. This is the case for `length` here. The problem is that factors with *k* levels are mapped to *k* − 1 parameters and at the same time the intercept represent the (unweighted) grand mean. This means that factor-levels cannot be mapped in a 1-to-1 manner to the parameters and thus cannot be uniquely interpreted. ``` r summary(m1) #> Linear mixed model fit by REML. t-tests use Satterthwaite's method [ #> lmerModLmerTest] #> Formula: log_rt ~ task * length + (length | id) + (task | item) #> Data: data #> #> REML criterion at convergence: 7624.2 #> #> Scaled residuals: #> Min 1Q Median 3Q Max #> -5.9267 -0.5900 -0.1018 0.4789 5.2673 #> #> Random effects: #> Groups Name Variance Std.Dev. Corr #> item (Intercept) 0.0115697 0.10756 #> task1 0.0104578 0.10226 0.47 #> id (Intercept) 0.0374095 0.19342 #> length1 0.0003298 0.01816 0.16 #> length2 0.0001008 0.01004 0.11 -0.96 #> Residual 0.0925503 0.30422 #> Number of obs: 12960, groups: item, 600; id, 45 #> #> Fixed effects: #> Estimate Std. Error df t value Pr(>|t|) #> (Intercept) -0.089098 0.029470 44.980778 -3.023 0.004119 ** #> task1 -0.108035 0.029439 44.788920 -3.670 0.000643 *** #> length1 -0.020756 0.007810 226.871782 -2.658 0.008425 ** #> length2 -0.003746 0.007466 380.252651 -0.502 0.616203 #> task1:length1 0.005719 0.007568 206.598906 0.756 0.450727 #> task1:length2 -0.004627 0.007214 353.248363 -0.641 0.521640 #> --- #> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1 #> #> Correlation of Fixed Effects: #> (Intr) task1 lngth1 lngth2 tsk1:1 #> task1 0.118 #> length1 0.056 0.007 #> length2 0.021 0.002 -0.526 #> tsk1:lngth1 0.007 0.058 0.329 -0.173 #> tsk1:lngth2 0.003 0.022 -0.174 0.349 -0.528 #> optimizer (nloptwrap) convergence code: 0 (OK) #> boundary (singular) fit: see ?isSingular ``` ### Reducing the Random Effect Structure Because of the singular fit warning, we reduce the random effect structure. Usually a good starting point is removing the correlations among the random effects parameters. This can be done in `afex::mixed` even for factors by combining the double bar notation `||` with `expand_re = TRUE`. We do so for both random effects terms. ``` r m2 <- mixed(log_rt ~ task * length + (length || id) + (task || item), fhch, expand_re = TRUE) #> Contrasts set to contr.sum for the following variables: task, length, id, item #> Fitting one lmer() model. #> boundary (singular) fit: see ?isSingular #> [DONE] #> Calculating p-values. [DONE] ``` However, the singular fit warning remains. We therefore inspect the random effect estimates to see which random effect parameter is estimated to be near to zero. ``` r summary(m2)$varcor #> Groups Name Std.Dev. #> item re2.task1 0.101197 #> item.1 (Intercept) 0.106844 #> id re1.length2 0.000000 #> id.1 re1.length1 0.012294 #> id.2 (Intercept) 0.193419 #> Residual 0.304373 ``` As shown above, one parameter of the by-participant random slope for `length` is estimated to be almost zero, `re1.length2`. We therefore remove the by-participant random slope for `length` in the next model which does not show any convergence warnings. ``` r m3 <- mixed(log_rt ~ task * length + (1 | id) + (task || item), fhch, expand_re = TRUE) #> Contrasts set to contr.sum for the following variables: task, length, id, item #> Fitting one lmer() model. [DONE] #> Calculating p-values. [DONE] m3 #> Mixed Model Anova Table (Type 3 tests, S-method) #> #> Model: log_rt ~ task * length + (1 | id) + (task || item) #> Data: fhch #> Effect df F p.value #> 1 task 1, 44.74 13.52 *** <.001 #> 2 length 2, 597.20 6.67 ** .001 #> 3 task:length 2, 592.82 0.40 .668 #> --- #> Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '+' 0.1 ' ' 1 ``` ### Plotting with `afex_plot` Objects returned by `mixed` can be used for plotting with `afex_plot`. However, two things need to be considered. - The `id` argument of `afex_plot` allows specifying over which random effects grouping factors the data plotted in the background should be averaged over. Per default this uses all random effects grouping factors. In the present case this would mean that all data points are shown resulting in a very busy plot. When choosing only one of the random effects grouping factor, data points in the background show average response for each level of that factor. For example, when setting `id = "id"` here each data point in the background shows the mean `log_rt` of one participant (i.e., level of `id`). - Estimated marginal means in the foreground are estimated via `emmeans` which per default attempts to estimate the degrees of freedom using the expensive Kenward-Roger method unless the number of data points is high (as here). This can produce quite some status messages (not shown here). Use `emmeans::emm_options(lmer.df = "asymptotic")` to suppress this calculation. ``` r library("ggplot2") ## all data points shown afex_plot(m3, "task", "length") + theme_bw() ``` ![](man/figures/README-unnamed-chunk-17-1.png) ``` r ## data points show IDs afex_plot(m3, "task", "length", id = "id") + theme_bw() ``` ![](man/figures/README-unnamed-chunk-18-1.png) ``` r ## data points show items afex_plot(m3, "task", "length", id = "item") + theme_bw() ``` ![](man/figures/README-unnamed-chunk-19-1.png) ### Follow-up Tests with `emmeans` Follow-up tests with `emmeans` need to be specified in two steps. 1. Decide which factors of model should be involved in tests. Use these factors to set-up reference grid of marginal means using `emmeans()`. 2. Specify set of tests on reference grid from step 1. Either custom contrasts as a `list` and using `contrast()` or a convenience function such as `pairs()`. For mixed models, `emmeans` attempts to estimate the degrees of freedom. The method can be set via `emm_options(lmer.df = ...)`. Here we use `"asymptotic"` which does not estimate the degrees of freedom, but sets them to infinity. ``` r library("emmeans") emm_options(lmer.df = "asymptotic") ## set up reference grid using only length em2 <- emmeans(m3, "length") #> NOTE: Results may be misleading due to involvement in interactions em2 #> length emmean SE df asymp.LCL asymp.UCL #> 4 -0.1099 0.0304 Inf -0.169 -0.05040 #> 5 -0.0924 0.0304 Inf -0.152 -0.03296 #> 6 -0.0642 0.0304 Inf -0.124 -0.00469 #> #> Results are averaged over the levels of: task #> Degrees-of-freedom method: asymptotic #> Confidence level used: 0.95 ## test all pairwise comparisons on reference grid: pairs(em2) #> contrast estimate SE df z.ratio p.value #> 4 - 5 -0.0175 0.0126 Inf -1.384 0.3495 #> 4 - 6 -0.0457 0.0126 Inf -3.618 0.0009 #> 5 - 6 -0.0282 0.0126 Inf -2.238 0.0649 #> #> Results are averaged over the levels of: task #> Degrees-of-freedom method: asymptotic #> P value adjustment: tukey method for comparing a family of 3 estimates ## only test specified tests con <- list( "4vs5" = c(-1, 1, 0), "5vs6" = c(0, -1, 1) ) contrast(em2, con, adjust = "holm") #> contrast estimate SE df z.ratio p.value #> 4vs5 0.0175 0.0126 Inf 1.384 0.1665 #> 5vs6 0.0282 0.0126 Inf 2.238 0.0504 #> #> Results are averaged over the levels of: task #> Degrees-of-freedom method: asymptotic #> P value adjustment: holm method for 2 tests ``` ## References Barr, D. J., Levy, R., Scheepers, C., & Tily, H. J. (2013). Random effects structure for confirmatory hypothesis testing: Keep it maximal. *Journal of Memory and Language*, 68(3), 255-278. Freeman, E., Heathcote, A., Chalmers, K., & Hockley, W. (2010). Item effects in recognition memory for words. *Journal of Memory and Language*, 62(1), 1-18. ## Code of Conduct Please note that `afex` is released with a [Contributor Code of Conduct](https://contributor-covenant.org/version/2/0/CODE_OF_CONDUCT.html). By contributing to this project, you agree to abide by its terms. afex/data/0000755000176200001440000000000014076067000012106 5ustar liggesusersafex/data/md_15.1.rda0000644000176200001440000000071413664111747013656 0ustar liggesusersUN@4ţGOM֓|֖n&MJ)+|@\`c4jDo盝ٙnG>c S1jXUȲ.^`Lm&6c5ac@NLAY\|0oG>y//,YH<78NA Hc O-yF;8<öd9s0K[fG] mJBhEABP% j2v+m{oZقDAECrI%hșI):XW w`/kɵnaB:y:Sk欟Sqݻ Iɬ:m}($3s?)]BZv{ɥ"\7I6mcN@4.X{S]\1ksxC K.CO9CZ<*kWeafex/data/obk.long.rda0000644000176200001440000000132613664111747014323 0ustar liggesusersYn@yC"B,#>UBذ$NpvʶF>e]7L_b7:bK'̝w{⯟!M)RȋG!g2]'y(9  +J (+)DO`mu^t+ ܥ5"&qD SoI#>FMZj(VDZ:)4uowCϗ?Uy< /{c&+݌Vz Csi@$o &صac +[A[g_װd~׃sQ =4>ʟMꈈt_r]0v+1c-.WU{̧t!m2v8Nt';v..P0_8<`7Շc;^sKS{_%>]T\\ \ǣiOZi)ס<ڹ[ʥ8(vz>ppE?vO4Q>~ڗN }ދT%;tt&(a` 4J/1)\؁j+IUϏƵf&Q١E,&nX;#%afex/data/md_16.4.rda0000644000176200001440000000063613664111747013665 0ustar liggesusersBZh91AY&SYLb7@@y-A51f$` #@1j4oT44D%OTfi &@h#И0LQG4DRllx@ꋯܫF(Kus!2HCtEQnn{3]}]W:ލhX`,q,`՝e{m=7pԦ.AhC7II=~ ) J9]!!wX#Ґ`I#H@B`@f4G[hhK'*eТ/%"ŭ~(hUTDR$"L?9}H\%! vh6c_m*7 H$c%^O*l~e;?ܑN$6<afex/data/md_16.1.rda0000644000176200001440000000045713664111747013663 0ustar liggesusersK0ߒnsQۮ"lvЃ =&`˧fɰY|K_WyJgxs._ȈcSI0bԧWƨRo2P.[dAA\1b29,*iBֲ[;Dܚteo_ WjY)?Kv;y枽I6VKcc'. V֪;x9@Kinx~ޟb9F*"۔^q><2~.u.B"LiVZJ+Z7Gafex/data/laptop_urry.rda0000644000176200001440000000554214076011251015161 0ustar liggesusers t7` "l3$!$wV^aI"B"((` *jiRj}ZJQ@TA`;sNbN~gޙhyJ/Ll\[-ߖC[AYة5-ώrJ/<^Ih0N_Lc<5lvއm=0!.Az#⾾ȥH?e{9rr%2\!W#kbd0r-2\܀܈܄܂ GF GH D0d7A##QH)r+22!H2DR H !uH Q$đDr2LB&#Sd*F!HҌ܎LGf -L$BZ6d62iG"D涅"d1c.'nd) Y@~DV!!klFtkLq<㤁F 4G؝%𱆏5|c ?[=?=?=?\gI:PSC] jQCZyTN%TN%JͩԜJͩԜJMSjRӔ4)5MiJMSjRӕt+5]JMWjRӕ\Jͥ\Jͥ\Jͥ\Jͥ\J­캕]\wLz.mߞnhsa> ?N[Bq|x_ȗ:m_l|b|-Eٿf3W姞3ҭM\}~̓|+t^vŗ[v v%6\ݜy2ɵy̳[y6/VYBZαۺjӚ#qXcγu'WkP|ʮ>:nY/;01c\[Ck<лyμtYMIϺ5W%!8!`3 /??}DWn(8[}‡I_ >PC|q;?h~2eχSvCtJa؃_yCYO= *_youi y{L}_jׇ7ӏڷZCaC:}|tRV ;[-C~j3 1y@: Ck6UG!>T\/郄CP}ƴY/n|bXACF,^^~?y߰4uܺ?}"ϔ+[ c-T~N'[ӏvu ʼ|y;oGnYDD*Hs^x.3U2⾿3 8_bIg% 9Qýc0ԍn$Ys=7}uɫ Ϸ̔2$_ݓ.zs{|gO 2.]v vϞ'A~YY+r`B|yO=Z]h]8 x7rqEd~, xj*fWk dI JD-ךBL,W@d_T#YU+=}Ư9{E[.{i->U9 NԿgڡ~#݆?.qvsE[B"z RϘ6`y@T0_]Rhj+bl{!<.HyOq7r"eCy潏m3١RN+e^h?_X&_`q}8S԰M4m2;6q N%v Ȇ_հ}uޗˍ\AzP_Oy$=h"0V[0aT!ɨQOwCBk̢qS>'9;*6̭wO}7!$;/vJE8%{{w.=۔'G ?Tʬ:s~zP$^hQ^kg-Zoq&#^"Iu-ϊכOe g\M y|" 8HDBS_jMj_ װ-Mrث ϵyrܣm~s{:~oxkclLw^m $,~Kdy'6;Ҏ]0eafex/data/sk2011.1.rda0000644000176200001440000000242113664111747013667 0ustar liggesusersBZh91AY&SY@s'./{ߠ@<uycC@&iy2=C@h4L4@C?R&iCOP4F=*SMTS`&h #0L@pi@ M@bDSyO(CL驠ix `UDBSEð(R2 AQK34QA bD2ʁ2ґ"p`eR)i hR&* !T"XbGX ̤ @hB!$JiEdj(&(" HF` df!& hÂAHB*,X!DbjQ XIA4 \( 6ҔjZfmR J* L*VNHiEIJʆHIYc $bV'nB|YL*\w*sYgK$Nf44@1+Я^v@8`jӞ V dEq9sP,DL7m{&UD3<RS3|6knApA0_CO _fc%33Sɨey:,+ LUkYQGH`*9ʊTށfd󢈘-G$Q fBSB1nLyR˙kvB]m~(23{)֢ft &%cbvTf Tpʫ;@Л |yTMZgib"këmki^24®,dʒEStTQױ]C[QNY" v,(0W旽>E|PxXDձ4P,,) zT^UTD@~nfͯkmj+B~ (E|R"(ȈdL2B¸AT5  &ZW{bz(>fZdL@H/]ѐ P &ak$Lp Mp6jdPC^ /2DM o+ɓ=;P?4\D" „— R(@ \͚-+dĊLH$DFd03V/+I'F-J,PD_1T]81XJaak{PWb(IfDE0o͏X$(Ƨ~UM(@l}ڔnd1=2zx JH sDafex/data/stroop.rda0000644000176200001440000115210713667760652014155 0ustar liggesusersBZh91AY&SY557Է&`L0& LI`&(R64`F&`L#M02z&f@AɦidLh02hUTTS1QO0..QL܉O/g)䄧%?t%J|8)"S℧ʼnOO OO O%>8JJJJ|xP)"S䄧ɉO*%?%>XJJ|)"S愧͉O:%>xJ|)"S脧щOJ%>J}8)"SꄧħՉOZ%>J}x)"S섧ىOOj%?%>JJ})"S݉Oz%>JJJ})"SO%?J~8)"SOO O%?8J~x)"SO%?XJJ~))"SSSN N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)SBSTSs N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8Jp)S N%8JpID*R~WDWRh%6(S)JmUSM%4Jh)SbSDMM%6%4JhS%=k%< M%4Jh)Sx)SDM%4Jh)SDM< OS)SDM%4Jh)SDM%4Jh)SDM%4Jh)SDM%4Jh)SDM%4Jh)SDM%4Jh)SDM%4Jh)SDM%4Jh)SDM%4Jh)SDM%4Jh)SDM%4Jh)SDM%< OSDM%4Jh)SDM%4Jh)SDM%4Jh)SDM%4Jh)SDM%4Jh)SDM%4Jh)SDMJxM%4Jh))Jh)SDM%4Jh)SDM%4Jh)SDM%4Jh)SDMK%< M%4Jh)SDM%4Jh)SDz%<) M%4Jh)SDM%4Jh)SDM%4Jh)SDM%4Jh)SDM%4Jh)SDM%4Jh)SDM%4Jh)SDM%4Jh)SDM%;<) O Jx%< OISD)%4JvM%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)Z%4J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L%0J`)S L1AY&SYU5o"@@` xP@]d*>9ai  )ڪJ`)j414ɣC a40@IꨪTz))QIOU=@ m UQSUl[hD%%0Dĥ Qa$2D2b P,M2Q#vҒ\QZJDA-#J1ܮ!b12` ESe!Ģll!Sx OS)HBQ)%>8SO%>XSO%>xSO%>SO%>SO%>ؔSO%>SO%?SO%?8SO%?XSO%?xSO%?SO%?ħJ) O%?D$|$Hry @ԓÏ.}:BB;]}jsyyyyq7pslͶͳfmm6mB̕*~߿]u]uUUUUUu]qu}袊((?z㎝:tUUUUUUx[k75›-p[5nkfͶmgUUUUUUU]uG}[ofVq[ngs8k}fY3l;rtzUUUUUUW9ߞG}Yfsp77 sp77 lͶ37UUUUUUUy}~fj[k}o77 sp77 芼xv۳ת<<|{vn snc1k5fYުʪy}wߙfk5fFc1f3뮼뮺뮺w~yf%%%%%%%2t򪪪ǜ珏nݼ͍7ުʪ8㎺;35k3Zֳ5k3ZUZUWL0XI$I$I$II\p9ys<UUUUU^ ^ {/`q{>ǵGSpJz}&ɲmhZ-E8hZ-EhZ8Z-nEhZ-Z-EhZ-EhqhMZ-EhOG)碒Qe5{bCXO$]@0Ġ 4jijMTѡ@U@Sr*@1UTTTP$UE1LEB*( ĵQMTEAR( *BV(B",i@W)@V^3!8@$PHH Z-O6lUdMe @ KWUUP %xM4h412bh0 09F#A&&2M4h412bh0 09F#A&&25ITTGh~@hFj44f=Cda42 F@фɓ@dFHx"EQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQG|HEQ|ȣhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh >(B >(G}QG8QB >(Bf}Q"? (GE(h~DQQG?2(=QGE~QGE("ފ;"yQQG>QE4Q?(ȣQQGƊ>QGE"(QGQ >=|jE*UB(ϔR._z|U/F!f)*Iy~vT6I*IyTDDO>DDO>DDO?DDO<DO?hDO?DO"O;a8DOB$NDNDNDN JatD7DMtD7DMxD7MxD7M"sNp9'8D8D wD"a0DL"&D"a0DL"&D"a0DL"&D"a0B!)hiJZ"R!)hiJZ,KC*RʔD2,Q KC*RʔD2,Q KC*RYR*ʔVT , U)aKR %]ppppܐ1DN:"'DD舝"tDN:"'DD舝"p"'"p"'"qB'"qB'"vB'd"vB'd"vB'd"rNP9B'(D"&ȉ"l"&ȉ"mB&Љ"mB&Љ"mB&Љ"mB&Љ9B'(D"|P)+8z!""* $ 0x<>@( @ BpLFL0 bd44# i` 244 4a4Ca&&CL U@F FFF JSzoz?OGzRSMUPh0& @Jx< 4A hD 4A hD jjjjjjjP=*@== 7@t 7@t 7@t 7@t 7@t 7@t 7@t 7@t 7@t 7@?yAz~R`A:~1ArA{ =ă~lu H;|D~AH? ԃrA@P>z@hU}t<Am~[[mz-F10Xmi(2)`$%S-$ KF4DFJ3&AU&DHHSEe, R4H" #3 (J"2F 3I"aQdHL`4IlbJ4 6#PBh1 F2a$&IJHjA$44#`2PРB(fL"l&e3E ɥđIad S I"A $21 PH0 M4L2(1$HbfAEQ`[mJL,)a2H&X6J""RdfcEddYha` ɂa #&ThSe&R`dI$12&f A!LfdDA6`@` RI&R))!$ $Ld$EE&LѶ(j,*5 AA3E 32RC$B! ahfS)3)2(E(P) 2e)ICe"bPHDԈ2d&LiA@H$dɓF X,l1AbF FAbLfi b2 fi3(M$f҈*R"3amH,X)4)#$#EQ4e)CjlBRddD$CE)IMIX*&`bLddb2`FM$J2C!FQ%6KLHPLѱ4hD! B`AHd$J#If F1J3aX) 0dDLJ"2Qb5 `IPd)"d$ ))5`RIhV2&H c2LdT2Ѭf35ID&I$2QH&)B%c HH"H6(F#() 0d4Qa,IȦEK"ALİEJ&E4hĉ)4"AKMDET bYadM#("i3b&P2!DBBP@dThc&3iL#)&M$@@di4M!P2D"hɄJ PhMM 2f`m  #$D!IhBDdHF$ & MDce&%d$ 1 P̢`LI,(&hY@` F4@&`f D2121I `(0Q 0#@AH(&SLĈiL$ "Fc$I%&D2(6XfCfQDf,jbiIbc$!A%LicbFhЄ!l@`"4JCDcHC"%,̉Hb),`ԙ(R`эLQY X،IX3 %h-USD-*"6b3FQI DL"a&A D #D3B2PDbB)Jbfb 1(121 Y0RFDD& "1@ A22QE!F& `&)Z&L2h#"1&d32%1(@lcHhDL"C b0IL20CfD+$&4X#D (H# Ec`Q$01̳M"dC EM0"0fBfX1b4U!(P2RQFR6L"&XQ#FЌR(,!@4ii)0L`ؑaLЈY0$DbE"CH 2(L!00Q#A" d(J$d1&L€H *0A,1!RJ"L*K,ɩ)IA &eF@B,If4(B#DHE 2H$)4"!!2LdI 2B$`L,*30A $3C1d3@ab%̃Q@ 20aALa"c $$dc6%2 hѥBdɦ2PJ5HeRd2`$1 `!"B0CF""c*! @ I!)A#,L(3JIȀY,b6$"TblD&H"`! J$i%(*I$hP$!I3& $hd2&i$bPY)` d  )2",RQ0 )( D) h)3Dh(DbFQE D(EITi5cE؈1 Qa6ؒѨD-MA%Q24E2e#$bLBf#3`cK3I6Dc(` a6QIX Ca $"L"fH!`ehfL"T@42R@#) L4P(Lffc444dLF) DE D(Ė`KijDYiHa14d)` E#ARBSIHQa)D)L&dD&A"fPD bJ) CI,ɔ1&04MAdAI$0R!I 12f4CJjI$iD)4fbE012HlIE&4ERl"e6M $A AS(B,"%$ &hTdء2lBi#b*(dƣ ,P#X,Iƒ- f$d13D"d+L$HhPBe2)44HBRFĔIdĒD%dɍDF*1fi4"F),FAFf5 Q,%Q%h("DHQ-F-3&"Ɠh)--MXdѤCPE%#) 4I3(fI *$hRhbdDE!0L b IP@&@d$@&Jb h0cQ 4ZAh2DI2BD!4% 2, f Ie(L&FI@Ě%4$a&fLD$DcHĉHa$əL(Č$ IĀid,5$$XI#Q4aLئFfD2kF@F,McX2 Y"e&FFJIAPbbM$aiddD6M%%#X("b& 3MPfRI&J)F DH2S!%B2H"3F$ɠ- 4F`dHdfL RHDQ10%2,"E&H"HI(%*j" JH224S4I Je( I fhiXLfȥS)R#$2DFȒfQ%C JEd K22 &@X$ $a0QMb0HA2̡PD&l 6a(H H1Db"( Be1!H1QdP&@J*LK2cJAD#J"F!Ib(Qai4LD J)L$JP&Dh2J6IL$ЂX)RhJA#(f26i33C(e B 4Q(Y0D"4AS#Fa&)e1$HB (12$FQaőc3A0 "d"&X"S$44$S(lc`(ɲEdQF d&IhBB(MdQFL[C$PJfؤ6%Z֖ƉHYDd$dQPE#(ddBH3!4I’b@6f3M &FF!D3a1)Fia#IJ0YHK0b @Ɔ"DJh&f1$̒(0Q fą)L HAP0e2DBS(#H@$f!)S2*iDf BhH 21  )LPJSL C)EQ&F !AHdHf FM1B$1dhH)IIM"#a!$Qb2idAQQ@a d"%LjLQF 1Ej  dd3(f 1iɐ21(L$B %2B"E(1E4D6`"cd#!R&D&"MDbь`D+5QAM"14 QhQ hō( R1HCE` MiIDTLI 6i@аhM̉E aMI!0M$lI@lF$ clLJ R 26$6&MC"Ԧ1T1k`ؒ4EEljJ@dhآi1lkl ChѱbрũK@JSA BLЌ,LBPLd PBB!$$&&Pb4bJ2a `"%eBdB,  #`Bl"`Fa "HhLiQ6@TCc@X M1#DԒ2E YK&Hi ̔f62A&Ch%2$M"R&E*i,ȨĒL E((H"0DFHȠf`"3Jb,l 4faRZfQE !IJlLAHEQ0@1Ca&bLm$DLb&(dAC2dbƙRQ*@b[0l*",lD`ف! M"F3a&f$#)I2Zm%؋P "KPIB)HB@Q*6JLm$5Fؑ(1TLI$Zb$01 62@JQ%Faj `4l6QEjI)4dɂ42 H "hfbKL))6!2DQ&$`"CHԛ,X(F #QUUƈ%DbH#Dm"Z,X b B4(fI %&FlPb%bI(KIc$bH2Ɣ #@U%"&Q4J JZ"@ƣi!h652"ƊF5 EɶX*-jhض̉,%ʢJ[Jl6$*-R QdC3(Qi2,1hLbA,`2d,HPBJ!1!14MF̘ $3&a5 ҦLI҄$Ƙc"i@b0A&f!P&$"̙Dh& FI)3B%22Fd aİPTE AAbJ hi$)#a2RQ(eڋAFd1EX1ԌQ1$&h!Kh! &!*2Dbi14Ȉ`@,Hɴ) I&!(#Ē, b24 "ĥHIL6"a d32R RJ4C1L( *L4h$ ,,$4M&T$,Z* afIL )4Had 2 c$&A% 3)R34 1MQ&$Ai&LY$Fc5Hlh$1J$(lI1L!,R@b4HiEA4dQĉD0$Ad4($6$LfS CJ@Ai$0 $)LRQb0F Y IDZf6bHb@D)&B3(c( HD %4fH6ċMHb%ERMIeLbc$JHSJ% ARLJ%I4H 4I # DHRJ&iLlL 2$)(јҘI"L0!b(d2Q#3(,B@A DH#fm$ bR!"`D00F4! 4lY1cDiƱK!ɁH!DlYQ #4XLlbY#4bbAE-F Em2$Si&FJb4RP)(iaHF14MJ$44IJ$J0IB,RDcBS1Ib $Q"3`)A%,ɌRdF E fE@$Li$L  &M(f&&b`3"65) J4 1c" hJJ4K&$dJQ!,BFR$H#Iѥ L5LddDde@)XL)$AI 1&Jɢ@%F&b ! B$i#,6A%4&B1 ,)0B@,#aH!CH2 Qb)4bI1&ɉ L[fPBQL,LBTX@d $L$#F@0ъP0hBoJdDRL@Fƍ&QI)JK&LbIQEQb0FLD ѱh,`F4Z%5ERR R E)6FRI!b0%I,d,)5DI$RHQ"6)5i4!`Fm0021K"EI d,`5͖2DU ,Y* h@ecEIXب!dD ҚXD5ZDZ"(HfD&Kc`lEP! &bb2iCP A$$QCdA&$)ĉJL1 D MM4@I,MaJ&!@K"BbАłfC I"BL2aBK2 & 1e#CeC%0Q&CD#4M3af3FfhR I)P&lA Qf"2P$f RbjHJ LiHF2HHŋ"bģE*dD6`F!0H̡d I)FahFƍ $CJ& #) &&(̦HifAE%H(BBEL`̱XB!01# %!DFdCa( I@Y2(XPV4i6Qcc a$)H4DELdHX1E%62aI[lTTF4 `"S#) "ɱ $b(bm2+"b0ȴJ1 bXEI+E ؍ "Fъ"Ł(RE4P((46%&1F$Td&B 1dllFd1!XbƢ($!"j64hEL%bũ6`H؍ Xؓb mkIF0b&kfPl`X(ERFdآ#XъlEca1R4ДHJ+h)6(aKFH" j$Ģ&ƀ$j54QIi(BY @h ѣ"V6+3fLlfQ![JQj5FfjE$+HI%QBL+S k $`bQh6FHI 2TkƈRQV[ d"LX̩F iSe$A6 Lh3J1JI#Ae6E6 ДdȊ42F` "$4HB 2dHZHH 1( QDhXRa0&$ĐbSELde $2@QMLHDRR4DF6RdHRHbP "cd"$ʘ̦F"4Q aA1 ,RbJ`hFe b`1) $P"P`l&hQFIHDaJ3&Xc30 L!RfjI2bPƚP1aj"$I bh2(ԚfE$A *M"#1TX6VD4PI`6(Fh،mhL͍ b4ddRQh1eƨ%DؐimY5! LA`&Y4R %HE12YaRQILZư`H F &Ɋ0L,F)*fI1F4R@cIEIXI& Ʊ*FƊ-QQbKPmd16-FƱ`5"lhXشUK& Z#bB$lQ(ŤFɪ(ѬT`@lF bFc)E2,PE&QI b)LVfEbѤ%D`QL04cDbQQbm"b&B"b&#QAcAhi4AlV Ѡj4IQjM5dh[%mb4V(($h(&QF-"$b2Tj-djZ6IXS 1&"4HI2I% d#i$Kc&f(!#DQ V4hELQQc`L*B 6dlTBfhm64ccPbPdV4TQIETbQѩ* c`Z54h6kё--h++cjV4P&2Z*KPh6jƱVSdŒS%fEjS+V((22LIRi"M#"hi B &AH`ȆLB0i$*$4D&I#0)ƈMF ! K 0Ȥң! Dbc"S!@3!!"chƍ($4Da6fiP1&" f(J1%f !5$cĊdQ33F6lJQ"0!$(a ɍ0hL%1BLD"a"#̚lhB63$–C!fb3 0"0%FI(H H#"PŌ14bIDf F2I! da  h`24E20M12!dIE4 "&@dI4@S$&2& %HH0LLRclA4ē!"HHHDJ KC “bJi4F6QPF%`J(I"Le$ A0H #0bѢ"V$!b06#"M df",C2(2Y$4PH$f`P2Ф!& `hI"!I4dS$Pc i) P$ 0MLL bRэ0 D0$D,2aJ)D !,DFi6B$ٌ̤f&&mƍ!d(, Pdl!XF @F$2T$*IBJh,HPP"& "JP$̀D&6I"Fd6MD@0S0fhTRF5%ɱHi,0J&"0m3%! l ɢ4cDhشlDTX4EBcR&C$lhS X#cC-҈CaH$aI",$B AL)2QPHQID2!cM`a &B"h!P$Ʌ*LSDd@33ѰHd1cL)K#$FEQIȢK"&&̳ccPI!bLlB "%3AJFdbE"BJa4LRLDL6H"KI$A IA@AL4" ! Ŋ+I XL$1آM M!IP%!eHXXHH4%1"HihȲB &c&(dQh$TRQ,SH"IIDXEP%1 b(4X0L13Md,bSfE"FJ5ЄIF&L؊MY5F,)IQMMlXcmF$&J5$X61H)Dh #P bDc`f#jLF"2Dłabb-64hHJi"IDLjhŌZ&ȂXFʑ,,j 3F*L6iZ3bƢ"T1LV#F2`1S$VIXQhm,LY4iH$M2cfFДI4kdU3lfc)ةILFI"c&f2QIDlb ,̛1YD f$DTHh)$l!DIT HŲdҠLRLLDPA`M" 4X)c`MHTmI3I3A14 a2RDE1)FLRhc HDd2Ld33-)F2I"%@3f X4IJ0ɖ15ҍ!LQ) ldf! dPQL1f6@" AX(2ɉ(ecI6$Ɍa*B X ْ5I*R &a04IdDȋE! Rf" D"A2h(jDPT$-EEcS6F5j$0Ii4lIXH)b #QR"RmƓA $Rؒ(LdF a# i22Ed0PQ h؃F6LBfAL-55@ ,k3"- IF#dDf 2%KTL`*0Qe)`PdDK@h AEFQb4Z4j4QhD(a (1@5FF&DlRQ(dF)5I&hRY)$ I" K (,b,TV55F&CTA DVaF,RIL23m5ZXֆ!h,Y L4fhdX((cF 4bDV"LI&bDkQIAQF-`i"ECEMZM-h)A@6,A3h1Ebk",J@JYP"ŒÅdE3)ѦLe%D "Fɒ2J2(RE)H0$ lKc#FBL`b)AI J,a$&D&5$ (!%)d$Lb%!(3$2bPbm AEDlĉ0F"fD(a dA(& 06-*R ̰DHSQi$"1` 4 @*fE&ŢLH",Y"dlIL`41) &P`lS$1(Tm64DȀ҉%3h1EAmbFd,L*aI#d F( Rj%Fщ$1bb`ĒlTXFE4`Z,iI$$͍XPQRcR 6" `b(1(Q(X!(LFȄe5m`Ʉ P&*5TF&$A5 Z,%&Rh"JXFdE ѣbI6, 1Eɩ2TTU0%cEEQبьATEd"J4-*S$5P5d1"F5ɩVclXThmFalZK*LRi#(Vb#Hhэ HQɶţ1) !JTb6561Z#!F4cDAb`eDIM#lTE@RD@QcjK%10&5cbd$6hZ6A,Z$ M4ZFF4ZKQj6jj((Ij-3ر*LmRa5V5a,ch(Q6i* 1Q&V-Tͣljȑ clV%6$ &f DV4XDLI$QE56EBh6-4lllH!+bF4 ,jMc3,QQQX*4hh1(ՂQlS&AC%K6EEbmPia00h6J,&!`F*Ģi1flbHmcXڢSPTL̘i"S2Q1B&X"ȡeĥ$SAJ$hS 4*ea*Sb"FHb$̐LHXc 6e2cFDbјф *(F$#f)E%` $Yɢ !Q$&&FA,bBEТaJXLB(P$Ɗ2X0$%H&HVRQK "dF13FтLRhId$ LX)#LRbJ(kc4fPY h0@EIaLlDFZ-F 1Hf2DQ4ؤ!Il5b( #`l%FdHJ16HŊX؍e mEb**S%X&llcFH6,HJ"СEIEmFc-Qb(hMCI(#d0cDX$ŌPdTƄ,DJ٘j,"$i1i* E50MP6-"ƱHllb TF0ɨ#F`+ 1+hآ ɣV"bƐ3,lk%%l,c`IX2T cE&Ze3F+a,e@ɢfS*MH FXQIQb) bdbBƱ Q!bC5%$TZ63)T`ѨXQhlX$ɭ2Mh-j5#EF"jHFhƍdYQXMddbcI(i )-F ѱbbV(6 4` (ƴ`cF 2(K!ͤJKF4b-EIcɦh!#ch1$ȌV41$Ec!cc%V"6"+Ib*5QTlJjƱRS #Eb+FMFj1V,QFԭBj,XEţhFZ&Ѷ*MbcQIb",[4VEacmf(زmB[lXb,m&C(Ɖ4@-&QR`f%je(l!-!Al(Dj5ƈ؍6#R&Hj11dPhѤ1PZcb6E4Z5Ѩ+56ѴmjKF6Ulbɨch(mH4Z 4kcQlFڐ&ƤcV6ڢ65$F`X Hإ)Y5Vmƈ&m6 c%E( & QfJ hō4H F ġhXɤ,̩40$ b LjB"F))2E2I1aƌLi0M1Xb- %(T$b3& #DE$%$bţiJhM (! Ei hfdѣ Id Q""AC2TcF0eaiddYF&PAD% HL1S M( !D,i &dhd"4"D@i#6$mL#Q1c$,3*J0L$(JL͑#a C&Cd"c&3 ("1#Dla4Q IC6*"cƤL`2bP"LD&IdE0QI Q  Pd!6%!(0"C@F0&M!3 HHA" #PE2$L4HABBсJ`44HBRRBbf# 6 1&&*$AC6(di"2lE iDLe٥H0dF XL2 Le$h$@E-DF& $%m$aBA3M İ&,RbE,JHlCSѴ!F 20d&TF(j21bJ B%bčfRa,bFc1R(b$ddH!$P") 2)#A2#3 f ɉ MFу`+J1Rb#FԠce$bBX(Q4 % " PCKB$dfEe1""D1I&PEd!B*M$S &a0F$14#0a4f2@!$12@`Iœ&H!%L`D) )$dТXDE%"(1),0H (a5 @0$$lB!e$!(A22FLIb*2AF$IF f1I#D IF6),BELc ) BHiA2AAC(d31Z5JQ3-16"PlIAEbR,dљi 6J,&,FK&XH$FR#hH (PAH4,&b4FaI#BIfCF**BPRh,TBhƣa+b`f*5F$J4aa1@R# hH)T1dF ѬDLJ$j",Y,d"ZBمUZ1AbfJ&PhlM@HQimRbAKDlM2%H[6RQ$X21db!0ldDh0Bhm%%2ڢ,fdMd "j&Ȥllm*XVKEDJ&R1Ԉ ɊĉHE"e3b #$eX#E&fRFhi5bdĒHL4!P(Qъɓ$M)@ĈHMFƦR*# abFQF,,1DȠ$dJC&eJ%$@QDL,#ɢi$"M&`AhHɣ$XT(fPRa #e$#2# e$DVI)2TBM$fBJT2 b0FBX*B4E@*"H&LF&b!6)HiljLE$A!EXƍTE!Q3c26"DL4Lf`DD4iD&h4Y,((f"5J-6*#$* RE2lhAAcT&)KdTX-!D ( 2!lR!Ph6I(!12d2Mb(ba(-lE&I1EPIH%ŤH(5!*AUJ4d*0HlPC@؅4*L+!2F5FF""+bRP`2%%j)LFCX2(kmh ,HEQd4AQ&ѱEXѨ-$Q"l` (HQH(F-"Qh6Ch`iIb6b,b 4LZ1FQEhbTDi, Rj"1F6D*4FhԘKQ`Ũ(Md EIQXFKdF6 ,b4FllkdMhAF4@lM[C[ɬƂ̣)fЄ" 2l4XHCƔ1#) 0M%J $af&eAH2& D` "YH $2H@PEI bJ(HFQ $h(&Df2D$R@%%!b3(Q%1Xhd)"RD@$ h$ S(6L!&ٙ1B0lQQ&62 Dj(J2clPi1 hV#e,ID@ 4K$CdЕD Z2h1bKb IE@#JB`XJdE$,Q`FX#Dl`F&Xh``REhB ,(X4` FLAIX &Z46QDFAD2 bhXd*5&#Q)`XJMc%F(؈"(#FbhL5Ĵ$ 15 hKlU%шJai)(–Q Y*$h4S@4REŰdTZ(MTQب%1 cQ[MRdɌEPZJ1YLF3(,)Qcd,cbcd1,fLѨ$`bƍ!,!0ml&`62X#m3$b$c2X1AQX1a D 6ѱ,ZZ*1 #ci*TB0QQ6TmlRbM65Hh(6V$F"Ѣ(ƋBlAS0mbQcm4Aa Q6 Ic)baQ [mM*X(6E)U2 QE(h&"QF66%$DlQbc%EQ,Q*,QE** i66jQh,ZMXVM6KEQmbF(4U&&@ѣE%E1Q6[ch$آ"D(-Qa 0hIb&ѭ65chX4bf$llThDQQ#1TkVTAbdd`#B $EcA4XhbdlT0 ETjFB$" "m%HP3DȰ("@S`BBf)1X&Jl m&L@),hEe 6 JJ"6 XلͅC (h`ƊɓDѩcXPPQ!)*4V*"M2 $IQ4cjB)ZJ0!bF &Df`2Z1AX J` Cc`؀4E%EQJ4RF11RI*4lkF)Ld30XX$F( @4I+Kc#bQj*42S2AEi $HcDdŢ66Ţ)+% 5cF 6(j4F5M` IDh-(ƨ$*2dL Xh)-֌Zf#J) -&F̊(!PT l!TEi(FfE%!cclыd,EFC%$l1a4b+&ш,4Y4R&15Kh1h-1f45(Z *,hj+%YF ŲcFDFDmэ1E" ƱDj-F-4bV4Rj1,Z mEKRVB$hJbIM,Q cQ`(16I%c`ՊQV6؍AQDa1X1Rh-E)6Xجj BQj(McPFZ4Th-bF6[EBbbcYŬY$QEbPh֙lb6 RIDQŰIAPQ5E&F 1RIi4BV,`Ebm,TkFlDhmlTkFԅ hشZcIhk`(2ؒѪJI"FX,`Ƣ*Q&ڍ["(h Dj Ѵc-PY56B*4&ѨXPbɃi Z,dX+ZhbC&E,cjH#IRV#QMX-B `,RXi5Q͔ث&&jXEEX(4Vm j1&M`&EaY V֊MXb#"hQ%ѢɶFmmhFm4X`ll$4Qb0EB6MF QDZƱ[Jih$H2Ƅ5a#(фAh,Rl"bQM L(,bT2!H4E@ŔJQJ@dTl,f&1" #D6I "HAIcLщ4I4PFԐ(l6dD0&Hh #4&RQ$3!5R"dȠ2lfA$VHL6э &2PTX4EhEZfTQBcAH"XQF5E&"*R`4H(l4L$lZ,%`BdXP56LQ4TAhE6fADF,UD2ḅblhƂ(ɉhkE1TdE$(J5bRfX4hƋPdIƍc%cY-F,jQi`6cE*11Xؓi ɂшب" +3E #"FAńƢ؋%b1֋@V5AE$fcb)*"D6c&EDBb$IEEPTlT`"ŢDZPX MkDѱRVLmARA4[l)6-F,kBh kѴIcXEY)6" EF ƒJɄbQZ"hhcXضc#m(Q&1L-2HQ@mVj5H&"dfFElb*"6+b(c`4h ERl4Xؐ#Rlj*6$IFQK(i#DXZ`1L(hQmXmIQ6PmQlElh[-RQF FQbQF60h5i+lTXjƊЁ%V64QZhh6+F64lV0kٛE"Em$X*+6(֍El[DFcL)EŃc06E,V#F#IhQAhlj5EQQki3PՊb",bE[XeclZQZ(F-"k,E4c-E*5b bEaTZ,X[FMDb`+QQ ZTIKAhAh,h(QDjJ6KV"ԑEIԉe MFBƢ؃Zl3Dlkci+c1V65FVѱFуX,[I5MXiMDlI`)R[S(1bcIlZ#hhڋj+j4VQ I$hК0EbcZ(5j4EFjŶX ؓjbI-ea[l‹р(Qz2 ew;}@Tq$rA$rAA4h9s@ҁҁҁҁҁҁҁЃ d#AAAAAAAAAAAAAAAA, Aa* 1PXA Tb) P2Y@Ae) P2Y@Ae) TA`EwP;u@IA؃b;v ;v A؃bDDDDDDDhhhhhhhhh4Ɓ@xnpApA(P8q@@xP<(nne5|NwOA` >(P,)VU(al)lI4%,ڳV51i62&ѓm6d6jRJIMmMm[3jU&jbJ%TQ% A&m5H#Z6-uRI J#X Ub&CFM000&2i$(р`BIJj @5%%F@M?" C"-ѶdAcH "IƔD$,ja$hѩ1bD$QI(22&!$1IIP%`,,1IɔRY32eAE$C,iE`M0T&2 4"bE@ LbSJ (FXBHD $BRI0d,c$10R&SB0fƀka(61IfD dɆADi&e1P$@Df)&ii4D4DDPbL4؂$ad%%6eJLDIh$ c$L(2X H) f0TMbM1 Ƴ(™&H3)a($ B&E2#1, 46iI#(`K$B`D&"AA&LBf"`Hdb`F1bd0(R,RI%4EdIA†ldQiEcD4)Dci fX#D4DIc&Dd#FRdQD A )$eHIHL&h0(J)!Bh2#" BLID""00d)1"I$BdҘ h,fdM؃ @HDŋə2(HAVHD(2EHJCd,TlH R3BI0, Ȉ )d&*DFI24F F"0YlY`@E(4@,&M H532EX)E20i&XT R62 &@AL$hHe06 DŒFJ5 hR!0ؠH`2`L؆$1KR!A @S dIi2DfF,́ AH1D$R’@JMƘdl$&2B3 FM")P$bTi Ќɦ3IDf! hɓ12(I&Q2̉!2 B!$4%,IъDБIK (I6,dMI!#()$F$E-2&X1, 1bԦDFm1 (ıEPQ1ABd̘iPȓA!%&QDDl)M3)I (`#&$""&E B Q6`آj ( 0TA4Ie d,ILD0&)+#d&ȆI")2i,2bfe))( BId@ 554i$LH"IbD4TiDI 0$!I DAD"61#HБ F2Id(`D& B*`AS2D)C) 3ddR)LdBMI$dB1FDI0da&34$&HFb40Тf63(C22fFB$ `%e4S )Q$1Z ,JM1()H R!(ƒ0FBbY(XAI S)I&X2aa3 De ̒L4h$dIIC RX$#0 i%$HP,FI)2"I2 Ƞ%)$Y3L„,Ld#MXD0L#ef F1144P0bJEJ!I"Bə$ &ch(4!6E&Ic" i$#M&lQd,"$BlT`$#QihM)2Ab!33I"X!%Xf(#)&D K 2b"DC(SI%&(…B0a"P%2D$$I&e5(AɂBfM&D#$Y&&a f)Ę)IRa$CD$)aMdA&L`ƍ&L0T&H j4PDJ@dX!H,R4IePLLRSI@Fc$6F`4M(ƈ "33%%ْI$ES2hf (b"m(MAH1IdԤbFAdeP2ikb6 AIDKDQD Bc&eɤjɒ6FMQ6bk$i6CL-lk EDVI5QFmEkM!)45-ElmQL (b2ّh&К Dib4hi"IeD3 LQ0TM d bBL@3IF dBI6&$#"&d!14dD2%& K!c!(0!P&LHL(B!,)%3 aeQPQDTEM(D0ldLb2bC4i&(@J J$R"%2D5i2L@ Ffcc1dS 2f$2,0H#3%)&ABDd!(((,1 H)LLRh&20M1)f 3 2))2H#QhQ&$P5PC44ٖ6#$HD(ɦFIdF"DC&a4Ē  03F(ѣJ$PS&d5 HFDB`40)a4"I"D d,1( $1I(,&R` I4ĘAHa&aD)e Jd@ (RcE!!!`RJS!YFFhDX1D HԂc",!$$`%)1&#RJIRh Af @*1H ) e)EJb4X!"#$$E@hcEL%LI"J!J" 34 !)$"̔)`L2fdJ1IJ&3e H 2HHc - 1"@& IQI%R3ILɐ&L@R4e0L bARH6)4A" I)F1 $ 0c&% -L""l&# 4d4DȄ4dAHdLR1i(JL$SM&“! ,ȱFH14DMPlILX# TF(̑KY,F 6)LC lc$ɠcDL1dĐəرE Ȅư1H(LE@cA3F5QFȘHlb2fd R!A$QF0,Aa(4PZLA , Lbؤb6+&F 6" 4Tj$j!MĒIhcmj0B1Ңi&c "SLII,fb&RC22$XS)$L(2"f&Q" $$!%D0ĀM2E2Xɒ4D 2@Lb),ED"i)$!IdDd%F0%2!"fɢ &I 4Ed$d40PK$I6ILdP ,$D+2)& %%124A2DҔd$ LJB1`Ĉ ",@h (D1т$ eE QJDE CAl14c3V,Q2҃ Y#i0ZH &E1Q(FDY 6(Dm% Ģ *Y4$eF6ƢDJD11$42eI)EJA01Y4QQE$4`ؘEF0 $Fai+"ERV&Q5cHj"F؈FX)$6ɢ؍d)0hM%Id+F 1REc& HHF,I̐Q m&*(cAb(ƓS1cFB)$b4S-%Ő#4Q6F6bEF62Dh1&556ƋQ5,Rɂ#lbŒ AB!S&TĢF ̦iBbMF !I&abLMLƙ1"FC(M4R@40%"iE""` T%$i $(HL IR D BTd ɓRElmFh01IaLXH)f2A2ȢbF3FF`@M4hh$MXR &j@aC)&$lLdD!2Dh،h("J c,%C(D)2hE&`aF $$PIR1e%%bL"Hf4%h I$B2dِĒc,A0" c#1,fRm0B411!(DI!&! JhQbB2ƣFEj2$ IS,(#RbFI H&!(DDŔؒ&2B`dd)%2 M# i@bdI0 Df$jcII&Ȕ"fLi ``$0Q `$33B,$SIXE& $bB)PdLHD))& !32ФE0C!DDā0aeDlXQL̘ FF$f"d 1II&M%H"&Q,4D152bIɄ`aP1 dQQ͉(4![!YI E4A1e$0&TC4#I)&#LHd̲!A&bA,Q!2H(" h((Q)36$TP $d$ AFX$JBL X&F  I !LHH%(@QD4AaaL(ز3`,dȅ0a)"%!0bLR%i"d) $ &A3$ 3&M i24 ,%BicB`R&&2a" Q2LLK,I”,C @,2 ehIdJII4ji @a"d`h̠lX E-dSMCX64 #0ɔƍCA&bL,E"4fH)4(QPh$$J65) C4EH b6 "4A,IEL`,RF",֐(`RhA"QXl[EREM%E%k"f$3F1P$E 1!#-f "a &(41I hd)D4Q$Qi1 @!D5 R)3* d "(Iib$4FFTd$ 2)A L3IFd$!3cd"P6IBM,f&D!̰Q$a3$#24 3dFHBZ"H)"1Ph$Б&ؘ (fi6-$ɤf$e FlF$I(H&l%d%B#Fd#Q3DآȤ&d DF1I "I $)Q 1Ae$##%*,PTm#* $*4i4,@C#FA(f$D MDҠ$1B2a!F3bƢXFPXFŢ6 mI@e ,Z4Y`!j0 "- @mQQLKAlb0m3Q`LHmFZ"h`1bd" ,h0 1h4b0Bl!cPXX0jeE4I%cF*)5mFj4m6&)F F(Vi J* 6ɵkL6@1 cZB6"JXI0If$$K(L$ 6ЄH4&`4hfD`i%@ - ADJ$XB(`,0L Ɛ"IB4$͐JQ&0›H  RI2Q j#bf$Mf3(ѢdILT ً1IB cRa4ɱPM)$Z,$6"1he R#,i) i#IM%0JR E6(!"41 &Rm DZ E1̌f%JREcbF,i1b",ibMF"1ōA`iFƤ 4fV$hQQdJ4fXKIE2 I SXɑ2l (",A6M ,Q-IEQllF"EDd4bFi6"A*fTTlQcjHTƂPjZ1I-FцbbPl$FI̊ 1#&d(Ęѩ R`X#3QF((,h%`hQ"T%kbMJ̣AԖ6-F؋̪f I%X j,XŢ*ƢшTXBZɡ AH&FPcHY lhJC@Q,%AU$"&1@hTQdL1EQ ) mRXdF5"chljmAjLLi),X-2TԊIKœEU@VXբ6(f"4a"4FaQd̠(D!i1lY&V&D$ Q)I#Q  P" Ƃ%)&A,aIID,P2dCBIC0DF )D&"edYm cAbPHbEfDEɠaS(bL$6bB4#4фDe)E4Q! &&B 2$)IIHLldA$4 ɆX(D" 4 QID d3A"Q4RI2eL`&L&RbA(2" P(P&$2L0 Z0I&Dȁ)4HF"4Dc E" %!c!IQ0 `2&ld̈SI 1l4JT!2F% F$$X!"l&!dJLALQIPi L2BƈhL(4@̍DEEJ`Y`JL!؋&D B)2 L"Ŕ1SEY$1&*$&DI"HlcQdI"H1&1 Q4) 2e5&fJeL"l̰Ѥ$ĔFLɨQE0$4IELcc*-M"2 *LSE0)TLb"2 3aLh)M0lD `@ "I 4 A&RLADAICJ #LD1h&La( F hLc ! 3H&f)$,(DDDRM% Ja(&YL#$Af D؊C02D" Ef $Bd!1P`I!ai13EDc,!Di"M1-ThHĚ(h $cDf 2EX "TF%a$hXĘ2RIId 626 FEcQDB & &ŒL,%"1ф FŘ2iMT$D&1EFѶ-&Ě IE((01&K&ŤLEY+!lfL Fc!؉IF*b,hƩ$т%FJiA%$6MQ,X؋C K% (i6L F TDQZa2 lXa4#i"am +4*Phc J2SJe LCMh,461fY"4b@Q22Ƀ h ؘ33P0@`e0"4&#BR"@%#a c6b4hlJLK F*$3dEMH( JLɐiLIbBI6,ISQ FJ"!a&( %FP a#$Q"TFHc% %,b lLI$ECJ$B)4jLh4)BTFj $(cDaE@,3J","64(&#QcF"M)4j64 FbɌJfE!D`6BQcDM0DVi6*PMFѱM(XDQI&`EJ-!Dm )چ EHT)h +fhPj4(&*KLьd,d50 F,QbIb*("6,j dhDd4bL$X(5m%EEQCTIŌ$l3P2ADl)F4bQE%[,F&h2#$i j4AlThRFM&2`Ii0PKIXRFHQa$P"XԔdِbDQclEX &4QPhM6(QUIe$dJ"4X(32IIجZ6&0j1lM BYFf&`J@3-$Xē"#b (`dJB3$"F& "I1FT#Ɠe 2*c&e&i (2C 2Hi0h&)K#(Ę4(J$5%"3 $I)M21D2a2QD13,Ƃ I,4($$2IADdĦD60P0`hRV"$LTb"%HI(H5&HDlb"بQ2)fmFAhY1&,bdhDl)1Ƣ,XEȦ2Ѣ"I5&Ѣ$ `TME$J4d(hы2L[P3, XƓ$J6-f̍(BԅH I,AEb $FT`( dQ4FMd0Y-H %FKQRhF"*U) ԑQQŤ"5(LY4bR12K#f)AITDE0RXcJcc!EL2 &BQQ LEX$̂Bbb 64bfb$j4Ti-ckDd15l&V+%`1A*#51V+b-j2h)&bATV֓dK1AB,lI5 FCcE2QPHj-(#BS"McIQ 2@(!Ql10F 3m!i 4i5 `1b`aFDFQhbѬd4Vɶ,bi(*-&4hضm-Em!RT `c&&cmb4!0F6ƒ 2Fmid1d(CFm&Ԭc42dd2Ŕ"DhHdFQL03&D,b(!B-X& (4 6dA"lBd4Pb,Icc I()4 Ld14F$LQDi2bLPbd(DiF5dlHc"e2X#FI0͌R-E,Rb#EJ$LY(ZJ I6 5 6b$ lQlXmKDc#APED[4fQ4c2ѬjM$̡T2 Y)0lY#bh%BC hF*JDca* 62b(I %D0lffPDlЅbE#Z5Jf-!4j4ɬh)&b4`V6,QCJShآe TbDL lVъƱk,LM#hb) QADjaPm"$@chА6ƊdTlhPdF" m EhmlhMQbZTi#cQlQFXDVFbQDFM-Ed(-Z mci#XFLRb(DfU0M eX 52 Fh1X((H2T[Q"-QV4 F*+dŋQA* Fmbj#+j5DZ6QMk `ƍ I5QQABHH6AB*,hIh6hE e(Q ţ%b6+F,F&bZѣ!Xj#hlXƃb--mTUJY h$AhAm?V&EF4FDԉ%(D! iH &BL(F)X A0MIdЈ! !1)"FLFLJD#KThf2Hi$Qh$,F0֓I0PQFfL%D!CbQQH&3I12cȐBh0h(6P)@YM6,†aRb4H1$ɘlh)̐,1DIJH,Q4FbJ 6 2R0)&LS$kHB&&1EM" (&B41% 4Lf,e`)0f2(TJBe(Le&(2IRC4bBL&4#BIDe2CH3aC&@IFXR H%&„2dC(RdL"D"BC1@ 4bhɌA& K&3 (1HbL! 2Xd5Sh(M Bd2f6Db*eD$زh`@&̵&4ci1b5h4b" %&h0X F"4X`$؍ bQF&e3R0Y J%4dDK fT14d!L!&,a4c),$ 2400d٤lJXI4SB1(a#!)F4`@$bLfJ0&h`$& M̙DbH,h6LCb04`d `b3b(b ceL`Tf1F5,!m3Ik&1(Dd*LRQHHD đ5"M$CRX(SD6i1hFP Qc01D4 1 `F K2XFd(т(C$+!f&0b0U!"a"6) 1ب 1%6CEiab*(̘1!#I5E$36 $(ٕFKl"*1lXPRYѱc"1IEcjMX"M"(2U *"5MʒbD 1 BHFL!4`R)I((i0 I& L(DHI&[Ȓh0bP)1 $ @ J%df a"d(4@a 2(E1 ѣ4b6)$% B$(LS IbBИ2XƓ-26EDDXL2#l K!@2S#D4)4&JM!`&,X!IFLPi6#" Ԕ4C,d14F(d @M(`Ɠ"TRh#LhlcDF# Ť0MQ2(6J3 !&lX,ƣ ̊"M` ę$2LmV&FbB1LZ m$ccQT&eB2IPLI!3m!cE$`Ilhѱ()1!jM%DDhRJ  6 %Ɗ HdL֒$#3i#`TY D1PTlDhkc$I#1%Tl$l*("X!2Q4l1QLbɨHY$,bBMѓFM a,C#b EIRmF)+R`ёJV )MhTZ0b4QM*Pd[IhQQE"PPc$h1LQlXH4bm"ljl X!1(i4E4,XFaS d&6LA"Cc4ɦ&fH(؈ &1&"a b#AiѤdH1 fcRi $ ƈH" f a4P`bJ)0P 1b(X1IDB"S"(̖mBi0FƢPűli0R LV4bSi2F!̆ɴhY$0bc EP)(dX1Ii5#j+ R4$(H؍$bțF0bi#X ,m%Ei5h%!Dh")1I"4m%F1d1Y,%c$46K%AF1H* cb6fV$cd&Ě)5VPbb b@LXlTRQ&J$66Aj4%!Z 64kI`,ZeJmj#H*$E F4Q&hAf*-&M34TmEQ$QjM0bЛLLhHLc22!QQ͠MM HF&`"Ţ6ō FKИ6*J*65mDґX)ōƃ%cd11,`J6kLM!L(lmaIQƴ*ma3"U&4͍Q ƍjɱ[%!cZ j* $5$fQ`(- b!-FS)6ŌE)-Ij-cE EhP,m bb-mhi a cDFQōl-Ehڈ̴Q"bM$F635FhэEcKҘZal eLDE#2db &S% Je"F004JFD6D̙(HdJ6Rȩ!La4Q!Q"`2d4K0(QAFИBHFM!$hBcDI$CJdTee!)&*HJi2A Q%LlY h("#Ic&V#6eL*6(0F,ET0LQѢh(baB %d$ljJ hT(6# XZL%c%cAL QRZ 60(1T-,b")!6 AƊQFTlLI*(fQh؀(2Z A0Qd4QXh(К-F4l`-E"- b1cTIF !&Ѣ$EbX `j1P4mU-QAY1Qш6$b((2X؍Xэb*f3h65*Eb5EF$QŢ6M% &LmJXcb(FlTQѨ,b6b`ƌQ`Mɱl[Hj-AF4QdHdDPE%TdAd#cZdX-&4Fkh،ƊiXJj("A%؍PQlXƦEj#QثTj6,lkFƪfэEAlmFX&Khm(jPBPlmF-cm6*1Q41T,EѢFE#VRHlF I&QZ(QIcQQBƊŋFl1cQE1lj4kMAbf4cbc(ђűh6+TllDэFFԕmJĒjH65ch 136V#kFɍ(Y+[FōJTFM%IAhFflbK,bŭ-TU5Y̤"!6MM$Z1e$Q4M1!D&R` IfLABa$BQ "!̂IRD EE&"4+ ($ђ%V,LE0f"l&&i3FB&hԥ&Qf6IC@Бi61&#b(,cE3HLD5hlTDc$mHQ3BlQ`**Q $3SLX,XؠFȕQ6LPjI F6ɐJɤ(5 IF),Q4&",jl TZ56đEQh*1b#PʋlI bV1lch̍[E*Tm ɣFemhXhŤ&k "*QX EEcLزEEIEQI6KF6Ѱ,TmEX TՓXcmETX-F&6)F6FQQTP"FƢ+ccDE(dEŋELPQhmFFFblc$ʊ6MF*lIlѪZBlTm1bEDU&h6Iljj QDj$IFFcDjƨ-I&V-AƈI&fl4DAEQU%hc- mF5P3"Q65Rb6"Sb`hhjLj4-`@DhɲQ%hDi(Z*Hڢ6FjƌV c"chbEj lQ*cEFkcb(Dj"+$LTjcZ1h[&بcbhڊKb"1la,mhEE`5mEV$̚h"ѴjE-L5Xj-QVMF4FkI+-EI-dō[F Ũ4!ڍVQA,Q- lfl1mF*66(AQT)(@OPDA]pʪ QPnFlmMFMU2ncj٨jj+tV:2:驝mviBTV 4:4W5XNUW#Z6\Z1l_3nuj2- WI!(B@RPvte(ӔQwnbEVo[t(P%!ZE+B(iV 4uZ #FPzjQ meakQ4tҔ -#}`Ҕ(QXuCPui6:t)P:JQ+557@tm Qh6hŶQmX,mq:VSC\mMX3+t+UJ4:GZSM.tHHkZM @4PRh21ʂV EM-R&̄B4mG6UMXEsks!AB .:@жZPRt| t IJYAMqLt5fea/mղZr-3ttY[Д4 i(H(WJi@t- еHQHD#BMBPMC:NНtV(uzg[ʮj4mFZѭؒ%l]@&8)4CKIӥZEĔCF]#u)tAB4 ikPmumrb5ҥ:4hҴSCECBRsZ9jƃQ5mShAni!]tkB:JG"ЌyV*-kkE,B:tPTH!A yDTF+kj.Imծr-s4hhD]"h]:Hi ]@j\ەآi*`+P&]-CFt*P- H +N!M+Mht:)4TDBRJRtӤtqMVm3S:rJb6+r-α̮`(: B%z (=M:ZDvHh_@:4SHF4ub-sTXFXIH&(օM"B!4鞘l+l)H%.4E(J4&ІHh)6ҷD:jζP%F +XuZu+t #:M!>Ovi t41"hu+ ewvtwvt cJAH4ЍR1:NtM֖Utûbu7575F*cmbטţW(tc@-Bi@КFFS@ 4#II#ġl:d4 PFP6-+BmMcuGX: mXWG-N8+1)@hcdɨՌjٻ2&% Z]%"ӧtζ鶡RК4At% 'B+mbֲjX[qt*tjVwrÐtn):fR ƣeIB)t&"BvK44h҆ZMDJ4ťt:J]h :VtwqѩXV1 ] &M#&\-\RviEM4hFZj-FjܬQQbmPVg:RJ &ր&1rnXѠ4([i)tYQЬoYZŊ+nG1ܮ\ۜb6n9P4N!$4Ȕ!)B#M`p͠ѭs%B6Ť6thZJQI)Ji *R4iAКMHچ +ZR4;aOZSz] @ 1)5ݑЅ])J>' WHhti i^:i WV&(%4iV CNt%+S[VǦ=jlՕj-sc`9hcAF@Nhqim% UEr͵W7#mr66]6Ěsj,tnruXij64^z e1Bi mK>{Q'w:0Zbk6\+\m]lXsǣn5fV:jnJF(E (Ӻ+r)ƣKgYlP}$5BSHi CCt.- uB i([Zv@GF="t-"h)6 NMGXTkrcmG6dѴQWo י 4ih_B-7ͷcsT4 % Z]tѧZ d *P:t.= RKIJ5NM PҚ}zQ:ئζ:%nkܭ bFHҔ4F&B -4zzA(F):ZihPt룥c:r6yb\0hڢK4 iB P] BRhG UfΛ)ŝ\r-bnV\kh4-ѥ(]+Ѷ] tP )@R\*~j+Q\k\5cEB RuT킀.JѣZ鱷76mF::BMA4 "P턭h =(}Bu@ R:P:mBh(SAқQX Rr^WbōyErڋ&t:âճ+ 6ыF-hʨ[͹nZ*(CBUNvAlb(7Y2ΔԚ5sEBlj.[rѮQr.ܨ,ldMP#IF4V5c4E&H픤1 H;`i)HC5ZPӠ5'v^j݅Ν( h@>:J)4hs\ɍsDEᮗ.Q5ʮVsj5HR4!it҆.NІ-p5͊\QPjBנNG=Ć[#HJJi+KZ6ƴ i BJ֍@-4:thJBSJBHikKH҅- ДeоĎ(ٻ'CB].JCJA%6MWkFQnh-snDk-b(NW@Һ+BM)i5B:(sk1Fخr.kM ZF1RSl4lhBPVTV!lFtjIhە\EFsY2m:tRh(M% Eh (ht:BZTWυr9[:J-&HiCF4FƍshjIgY+Uк `J .H! GL+:mMe!RT:Phht퐠ӡ)44(N ڕBz.ЕtHE:B.JVbh%שּ^!(6wll[Em!ڃIl.)J.%SI(t΅K9mZF554!H) \B%)0S4IA::4)BSkE E)ҧZm4h'Cִ.4 ki hcEX9bղ4#M(haE-;eV:C(+V6驔GZ MMBmsrcH5{3]M씡 PS}BtZ體pZ.h["6Ţtu=yEjt)ynW؍Qb(:CCAN-1juCaOՍ[)LZ\sA+bjk6(s.BiF(Ft!@tJA[(nW@h(:(A: ۧ'J̣>:撔t:PӢ*73[ko/*l`t M4@t Jл:O@+@i4K@i6)J(lI@i4H)4AIJ!K)l!tR':4DfEntrGX۔ZQn\j+76Q<׉[y"1mQ*5cE 5ƤEq.mytn喳ӬCzhzF4:Vhiͺ[;w;[ţQj5c\rZT֊VM:uL]W8,PiSHMRڋcTX4li5F9h-Zj+#5AiJ4SMHkN4i.WBtٺF #IlRJ[ At)} ttiQ m\*m6\C@ (iv%&)+eaz)WBB)4-=zn(f%i %;d:]m֒CiZ:JbM@`-*DҔ4FzWIAI@4V쾺it )V bH:]IH{^ *}#=r5͢sAFG5\4j[EWXguʺp)6hC݄!I IBRJSعslQE-bULZcNMiJt|)(ylQyvFƸsl&kIW˚ю-DiH4qiht FIH1)R*1sJumz.)Ybѫ3\Q\ۓHhN&=Il#CzBS%FرX˸;Em+jeP]ZKaogKSS\nynV(nW)-wuFűBN]:GE;dQ%\ѮshѬJѡ )HPWBzQiJF t T4uc&EQRlhV { JGM%֍ RR T$ui*4 `JsZ(d-ҴW+(S +uFQ1Ltĥ"JD:m-ͮVEcj[ݨ^TV-h+bk^m )BS@i S@KM* Oz 4'lнP nrە˅\vuit(4iTU1ښCܺ=t&H4`ИtOHI ҁzz֖uZhӈt'viSJѵ54[ܱkusC 4 ;4ѠQB5@ĚtM%FAb˛#^أcW7,nQ>lkjXƱk(ktVEth] Q%:&%+tt tJM%R]T:CӧJMWlVJ[5ʋKw]5*@g[zee(˔Zw\-EE[Rݺ& 9nnU˚,jbmcm,ccd:Q[<ͮQc9E)GKEFѷ-sF[+oƮOw+. pFmrQ9Qb(ꔮcmQtP{%%+tzGIדjmFܫshҺ'A1h +Cl5so5ymt.rђŊ܈͋tkr+PbܹvƮ[t.A()ѢܮrkKA47cZuQ@mkvu(u!szɼלDDl;bN6tIjç]:+4(ܷ0Z$#`Źgv#Fɱgsk7#Z-@ZAHhGJQXۻQjLV)h@hX(iWH+@MGlJN$:D:]J4ֺӢ}uJI+H & M/ѡ)uIJR(jzzt:Ν)@;#kF4'JЅX˛Ԛכ^IX $j5mPt(ikJijGCO!IcIHnJm離gBmqzz)+E{M:ĦڗJtSA4t4= mLۣ(-57_-jtY+cўsP% ˗Vx_?}Jd]ƀGvѮ#E`ӷrsU%w`/v-櫅F\!LKvSCMtPT5@h5s印nZ,wuJCM:}"tPhtj1nX+r7+o+IHѠ5JE!nZ-cDV]ݣWb 9'ITONTt=PS:vѪG6K6sx]5r+]ӲcEs (tz: 8M 5Hb SHoicZM=(Ѭ].ZᮘnX(5QDnrѨ\;#AIk(pnj-D&Ѣ+s[et(54W7,V9[o F5uo7r)ΨW1T_-5ybѱ]75h(Ӡ)&Bbshѵ幨y\[л\ pMrf:`J tQ9wb*w_/ ym ssPbr';qb6s\[NW{tHI@օ4ZkC]:M$F)CHU6bMҚ.Ɔ! \VBc*W+΂n0+Н:݊)@覆 "cM! Q#KN)Yet[e45&ĺP . h"E\džnc`rJ5^̚4s" щWdZ,I2-[ܫӥ.tp5ywj^ ClRRPi1LsPn\luN뛔AE1iuj-md{Wfn]irѻۮsD>GLK}lc11zh1AY&SY+xԔ@`|$Q" $T%QJ"(RQHUPR SDB*PQBUkT$RaTE$QE*@EA*U *UB%PB$R*R (QRT(JF((*DAB J 4 4@!$L &$FiMI%Fj")TUV *eBTa))ThӶUЁ]@Vζu6Q΃:Pa@iWI@tҭ hh MaPJV)i(ҴPcV+c:gMl*QulH%B:GBJV%t #@#JО+H&Uaw6lǡ+aq҅(R)CS4PPvHBU(zSJ4جLu[1[+:+ :P B)dh]"JHitHW@Q@P4SV°S)S4JSBPR tlP(Kb?C@B JCKtѵl³StVՔ:aZJFhBKn(XVe]lemЬAg鳦QYC:ڙ wAFA(W]m[ 2ºn[SBA4+AJѥZiCB:4M+JBRJ*@Mj4iVh]:җ`t4PhWBRn!CκmeVV6(PzZ@) i@ҋhe:L)ΗIJ4@@S@ZJWAFNjmY'ML1YNjYJQ(hZBЍ/B(Qд:JJ VitN5JiFR@P(T)Q:Qh@к5ZPֆҍ 4]hQBiU9l\(+c+`N6t+j@FSA4KfY Ε]6jNt5m:lCghQ鎂GZCJRhM4NtIC_JJP ֒t k@&4V ] H)4AtQt /ď@5N :HR)N% (۠VMmC JQ4Х1CSmƨB4ҺZPB."4:)кSCGB] +hh44hBI(4 6ɶe<)5f)ìmP]Cj͝!HRBiA InFtj}lEЦJA]4Pi4:4(H/KM P&)DtJtmA+uXVaoM:ju[(tbT GBRMZJ4 AJtBچ)%!l&@ҭ)%uCQJW@ iDtRi ҝ=HhuI &[i JД:ۢSuuZM+iR ")tJд'BRl2t Y&!@h@4%-*i hM)BЍ!M!J4iTtlجnmCPn:]RP)CJGtJaiAJ ҡKC^á)JGNL7CӢkHB  :::4hCl!ZM)AIv z:JjlF ƖN(tW@PAJJ4A+ctc+: H;a ITB: 4.4:Pt:b(])v0 : :l҅ CH45H αP޷t5 ͠bCBMi(FFmҌ:)7LKbՊSn:P-Cҝ H:V&ru7@:jA^4)Bt٧l NH M#)hhMtl-e5 c(:2TGXVڳS2 cWF>`R 4.@ Ү4GHiR%hR H}ѳj::RFuVEД$ӻJ;DV5YBV gL΅ ̢Tژnlg:SBt+l M4 R44+it DM"J:WJ4%.ѤM #CHCJҡJ:RiUCIJMǠSnnL7T(nu蠦ݐ;].SN:JZIJN4 !'q:ht)҅:JK@ht X:SB[)҅ҭnA(Ztt+l(VV#: )QJHtٽgXzVjj5SQLiHS-RTiҎR RiTКT( Кč"Pl%&B:A4Wi@A4F]htR D)Bi[)44 ̴))}=Vne]+ J֝ӡ҆t (V4(􆕤BR4bm&)ѫ7MtPH+m֮MYNfuecVt+ր:SB%+ t 4IN CHR B([+R'RƑDm)iѠ (E AHRZvB Н#K`4q MBi] BP4 @҃k2+ll(ՅcelS۠V:2YJ:M4i4#>4'BH=iHRM*fs Zh6!hP&#B'ցOJZTl:]1bұelouRҔB&J]k@(Ti(LtMbꔠZM [Ƭ2bY gtºnEnVP4)ҚZ tCJ WIBД1 hBE]/ҥ(Uz.#ց)Sl&] +iQ#t܅lmYr+5a+[-:2@} *tkХR%*MP) *) %#]*FuJtRQHP6ף= :Pt:ƭlhDiT [B J *ZA J;a4(JCCJۭCuj`J!H[(R( huо J4>BJR 6SHRtNiT.:CKНttQۣueڕkH PZM P@:t&jM)&Bik 4!hibB*h A@CEt *(j΅o]f) @Ҕ"= /@Ai60֗І4+i]4#BДb:[gUTu tiJ@)@RHPP+R-L٫gXRhMӠJ֔Q(iSBP Z@Z;#e,:cV(cIЭ5J:::ht 7d (B)iZU( A@V96: cP R4*:)J.0h@փF= e(=:NQg]S+,5 n]cu1[7Z% M +JAR&(GN4:iWBH4(R4)*Q SM?P#)[tmEV覔д"h Ҕ@]]#ZVٺQ P&h]!>N.4hFرCIT%@Xt˻+(+(اXT*kBh4Rh %44hҔ-6Bi BGl-iдA4:@ PtоضQz EK@:EZ6Vj 6fX:l2V(Va]::) tt%#:J:V[m"Z+oEb 3fmU *&)]% (;`)4)l;8] KRhPtJB4 @tt4E)WK@ h4!ES1hhjhCIJ5h-+(4 BiM @ithSAl!((NҦ&BӢ&P]hBz 5t4кNh] klCБ J1Ӣ Ai֓C(M#)tt]DtT(i]  P!HSFM-4  J(PEY:b[`L=aXzuYOOXu (ҍ%!t &HӤt:PCB it(4AKZP4*B *VhJvR4WzF( it Y(S+n]*}"BiGJZA-tҔДT-liBJZt#kgw Xur*:r5lEcMf; lSPuV+ tiӥ:^씚:m7Xtrlњ І::B&]* S(:Vj:PuQ4R i(t.6JkBRcetBZQ((4-iХiJu+I֍RPJ hFBfQ2gYJD) ].h 4.к @4hVhT)l@(hi镺e)J:ڷZҝ,@(kEThR(Ji` J bhZFM) HQA[)ЭDIhTJJtRh4h4mFBQ4&)H4RhtCBCHh SlCAJh@Hm4M RLF)MJӤ :4=)B#Zf5 t#H5BP4%:=cjaQYXJ4 R`X0*A- TiSE-OHMJSe XnUBKHZ^wSn+:t(βBhkH& SiM+@JhhtHi zz4 thttH&=D[PuZQ:fηYn]tQ:N:zRB"t(7(+4bQҦSдR. @h4'Z4KH^t:B5IKCH"4JR44)-&i % @ҔTuuN)(:R:V2:g[gMMR].4ѥ)h)B)M:Z  7[(ΕGvP}:J44)O҇GLd@X[b#,GErCMQZVҔ4iBҍ:GJQ( iD})izZ .JtQ e JTYV鴒ebeHBk+2%eaΝb@iZvA!J=:)ӣ4}zN(B)Sunn2JG:S:tulF^ Ji ZBh)ҔFEhkMXuQY[5aڋ)Ctej*Z[RϦzmPtQMY:f隇]e`gF ) F:zziCB4b4+HGVh4tK֍(P b)itC@hZhzCA@t mH[ +:mMrVՍX4.4 @IE !ؤj*l[+7!HAuBE+Ut@i)Vإ 4 RP4Wzjuѝ:*Y:w9A@[dMu퐣htKmК^44P] Ĩi:4AlMhMF)Wi((N4hGT(zCuj  JDM Nt 4Hd(KT.jOAҍ3VM*hJѡRh )iЦкOF[VrF(αVYVB ))AJit.H&z>AOAt&}:itVztE mZ]WBIm)z.GHtM IJht&лt:Ž)3:ZH(i@bBth4Bt=4 -*B(i7ZYgE4&@h%m .RhBh Pj7L-ZQRm(F+J 3Ѻ1F+7LnS:f:BօmGAl#ZGT)Z(ZPҴ aF!SE&HЅ5izR +4@;aA+ChV2TVb9ntGKT+:/HvuAZuK@SltKHi ZhhBCA)CNT`ij Gҽ ҍ QT ҾHRdF)ZB*U!lҚ(S)*!)1 ЍFZWKtYXVSmXWwc]htZ]h:SBjtE iҚJ%#E)BN@}*fSru:Pn)JeIІ]&5im֦ս1ӭ tΰ^(jmT)ڱZ#] i% )(JDu]3[ecAұAK= К D 4@:QД!ZWJQ tPJtބ`>)6B4P SGBj+*p[9]:5Tåt%.)*ihYҦVåmA44 h@ѢИ5M:ء,6tՉ4BiB()tuСT5!A+JtЎ uC(t @:tOCOCBꒀ4Д(w X9fEuJHhc M J5@hҚ&&iZJKaE!Ѡ4h pzu:nEj: !. wbgzî+A itR4iMiJV i襡Z)b @4MiC%M V44h PОzt: !M HJtF4GAB@itН.z] i(ĩN!4@Jq՘&[gL=1g(uSCFN P4% h t܀R:M GVSzٹ+7[sEЮ-&$J)mn77Bt Ai4)AJl'K*AM(ДM%U+JJ4# )MFKJ++N &;Hh%L:+fmNJӭLth4ӡzB }/@u>E/tiB%_GHe;h( -&#JB[S:nlr::J ]R():Qæշ%ݝ QF)К]&J3]l T)SBZW=%)H^Ri]-"R:Bi4ҝ :BiJ62Ӥ4M V1 i1B=i)(hІ֩W:C(4ih5 %SIh(#maCZ DiCJZ֐ABi:VSN4PCq%- JQzWNE: ORU)[zR+5aE: ʢtގ ++:c6+wmjڳJ]1Y&F(}:)BJ֔G4:@tg[0wu:4iCN-Z@T)Mti: %4J(M-!҆:ZJ ցJV6 YXXPVR2SmSl:Pe3fSGL Et WJf4K"R4)uEݚ=zhR{AѺtV=!I"P'K(t:u@袷]fFNhM :t] 3+BEttˠ=@ I:jgF{VAF (h F@Zt-!+FCBBBP-&JPH:t4=@;i^kE;jҽ HetB=JW4lRPS(hV "n=Ht uIgGX)GEf6e:nf.e:âXQi ҎCA@iZLWY}: kjQiR:ӧg&ZtJQmLQ̣:Sj4(қ`tltMPiUHhkAim4NF(.#%WNBLtgNK@iХ+M=45BhKZhfR֒HB4-4iKӠh:h lGl#v+Z "ZST&4.zW@[ @IZM}Hu4:@@:][R)t&)B)) )S@B>=4 Jz,ԆNfK)i*QKBLuVXꗤ:S^!N54 F* !J:X jZP@%H&4 S@h(ċCK"i(O)( ZUӡiRJiAѠ[`)&QHM#QHJ^?I4 M(VP4@d44]+GZlC@zE=)HСJ)zN(MJi4iBi:U ִiZMPhZ!KiT6ƒi) z!hR"hC+t+OLV])oYM BSOH(N:V5+nAɝjcl$z)) i$HKT "M4&(h=Wc7ҳ}!P)]hZP Z)M*"i -ҥ (th RӤ$Ц(: KJOWXu2?IgCڳ:elօ5: 4%& UP:@htG[m)XuYCI: %)t4/z 6r[ [e Ln]2SiAAE% :,B]@% ѭ)BP]:P)M Bұ:5n#6n6uwB-J4PAt#iVMS)([`ܶt[bhh 4)%,HreҊXrkeR֟G@IZVcS((MU& #(Ѕ Ѥt 频((AFFJhJ;YhWI@!#Tyg[}nb=VĤ+fe4)7JjVtSS5a۬t[tݲMMAHiCA)(h} z J HH) j }EiBR]ne Z] l!M-&RZP htV ӪenSetƚ )Gֆh^ti GJC@:hHրit!BGF%hh)CE&@R@:ZtJ b:$JFBBi4.iҽ#J:A)*E H:P(NSՙFlft::53ﹼmtlgT+7鞙LzܔSTB ZJl m-oCǬBP jl]gXrhtd zt(SKt}#H M4`JmEe2+gTnJhSJ(i=q9C+l#H0i i)Ih"~Et~PH[%.ELlmjíЧzFZ?HN4:N+u*CR@tMUh i&:t2nM^VK2(5~ӡk)zB!4 .`)SEiҥ:P Y7Lt:mYFttec+:΂:XV΍NԦΛt+= zQγ4#tSHF]M(hC@ZM-Pi)h4#R@SHh:D HKlRhPt%R4MKZH֍:J5=-)tB CHitt$J:i((h]iRCT5CSSu[qiiAtiSBt:ӧ@X5 VEQkV΄tI4Th5M)]=ᡠ:1 @:)4liuΛ\UF::7U%h44-M-)Sפzq&%ЁF t5fS:E wvIt5B]k:g]̧N3tΫtQdγ@>E 4JKa -P %R:R=@kKJit)lJAGBL'Qӥ4)m[)mMJ)E:u) AMb]VڱeQGyVSHCA RGM!J QКT@z"P#PP Dč%1&:gN:ft:CH) IB)MCB,F:T!i%)HGnBm Ht)N+mFΙ,(PXeQBWl uE*].TH)lSnu:JmhujttQF}oF΄4H44Bփ@;t+H3lzv :)GT&*% Ӡ4FRBM!M-=:MQQ v hӠ)MABtVh;ۯ΃ jlҚf;i#A QRNΙ[( J:CHjdvFPX6Zh+41SuPT @4:QѤth $ݗVo[uVYݕ4/E)@:ҚJ"QT&&T)дBt'iZ`ѤMGI)*к?@zkPq#wu][ jҦE&CF JhvP4 Z[U7:)w"PRh : #JTК@iM- )EH(ii5KIКR.IZI4JJZ CJZRն뒔IbAGUXuJP44M(P.#VMb4JGJ kF +HRMi*.zCBDP )!UCvMt$AhAeEEE45X4)m67LJЪo]]RhkATPK JVn:Ȣ"h6hNHUHN-4QFAM(Mе)b ))KoC@RUQ^Ӣ=0jRiIHQlꀡJVR4:CKAѠP+IM4(umII3H[ "!M%!TѪu):^衕t5%ƇN]h :J)F62&*F'@RT4t4գU RR]A4z -wd -QMш:M Eh:&\CJ߻&$))4 t-6εeVU(zuGUY%4+V7JQH:S4A+j>ܲIBRL@R;b҆%m#* -h1Pe4.+V:۬-TuE")l$K+R5ihm nGJƭXQTZ(W֪+J)EӶ*[U1YؖKXɝ*PК@̴4VZJ=&(hjM&ƪѡӶERSCIC:=mTU~D{S:+ T3MBۤmw B> (CH-!B= 7jg:t7Cz+(B)])4&vYZ(޲[JCt4&hT4!Ft-hB() &)t&JZi4MIO@i)= JkHSt4+΅m'BJw#hJ.˜thPhhSE.R&l4P tMCji #]+Hht&f)tPSI^Оt)z4% R]izR/i4H=!Dh4A].IjTH>4tR-G@hJ].*i(4M.a:M$Δj.YFVtKM A3 ֍ZB?Jh>(Ĵ@!Зc4'HiM i(B@ht[iJT4SoGC:3R24i(i4PmvOס ){ H:!=z}P.:[:P=OC6iC΀JDtRAz)?A/Cd4hg&h`O(]- ҅% ֗A~\F.ڃ@fZKbXth=وİow}|W:b.%qmӦS룪{hJM-Jl@=/Mq&Stt uelUe:CCIii4]rVeSGFv=nO*H::PiVQ[C7(hai6PѠkΒۣQEntVMU hkI iMh4Д&AUc!=5IӢIAи !Ϡ=IX%uV;(bzն&+gFhF V;`SKUEPUub;bzZ}z7j(-*l.V=wOݵkMRLƘh(eQ.}hbRO)C䖶(NCЯП_Sl{HԂF 26ΔxUUUꪪUU_ x>e**Bl  ڀـ5 `- jZkT0m6hPi`kFhԊ RJ%TQJ)TP%( T TA%+@ШJ)TIU%I(iMRJ)Z4VҩBJ*J[ BQ (JDI@ @( @Z%$Ph@PQ!llҊiA(!A (+fT$*DZKl*TiU(IZh%(P iP%Eo@H RwD$ l 2lـh@ k@`- `P@604 Pm/Zf MN}NU:;HRECvsOf Bi̱{gD焐JI"e{ٯ5jYfĢ @RMEV jOHi5Kkw-wt QhO3ך~wm\BޖíD}_Z^5fnꕇko$@SQ-}}꿜Iᄦ[Wwm:*A%_g)Z6I=2ȯpԞ$aTaV+(aG ze[3*Ֆ+I le6R5JM}pU`{h7)$|hxS|Xt7{N<E;OeUX&ub[ccyӤ eѠF9[lËfo] UA= T gؑdEQ6Y4Qq"(Zr(P)ѯ֞'=j(̍Dq:ݴ{ %RlDwc>!>ղLΗC=4X>eO y=:z&;<džaw3ْb\B2øuBX&^3jO/-f\LIŹ]=ֽbn~8seww 00f~0qdI{áCV4{.[*/%Pmm6-Tu9uH.i2Mg~ēl9LBX|vlBļJtڻXG\Z+sB|5ƂjVG nwlfu8^{(/<ߕgx{6W5e$"4'n׫srIT%YaQZs{fƛ,,U4yg7 !O^/,]Ps6~t,BOE*+b79&{YN!=Dp@J]r;b@8ΩkRN~{kG`qux@N囱Y:]>ە;gv% ח?%'y,ّEʲC&`>/ܙffww~?zvֱ Hmg n{ƶD!{'M SYCJ3mbCĶsѕ=np) Q`ilدJXsoW3v9Оu ѝ¥K>{Sғqs,g۹ܻPGА)3;{$ZT%ь`)hk DTdd10Rx֗yuyfRt9sz/:K CzEh!^ۜ}Ć,-Զs3$^n5(=owGm|玽v}/`5q΄D^õ,em9E3Ni!n5#d[)$4HݺT|@i{1ٳsTR#ȑ&(G]V]m9lrHJ6f6Vzya$zҖ"ְkEbՄKuׯO]xdIk)F1d3J:w۠yzv{;foVzYK})GuPD'z;tWq) l:kDR"{nR@zY᝙ϋH6tٌǥhFBQ]J ,GgίD]('}[,vkmG>X{[3Ӎ]Bivt{?Lg\&7wh(Ki mm_y>+h^ýNx^Ԑ%}iX~vW=zz?k|VZGc+v^~gzON'Ωu缃ʽXZDlѢkȱ'mq0e̝Чxq:qsmPy|Q'lԞ- s׷τlQHEsoqD 4JDlc,1j嬍, ʳo78FP8pHql}^јψO,9O)w;|OLfe f?~vsuOY_O֎@ݰ^nL mk6B?3Dآer1|[9 poNDzrXkhwγ1 1B'tz̳ӔыMZH0&816o0e!Vcof[m9dVz2lEG̓!+,q"B)V~X' R'+IVЏ@,R%ijzNs YyϫժdgYLp%vi;ZpY]` 2[*WJ${nON6m"|r1Uqo8NX\MGfIxK;f;]oVuޯ/.}x;g{MΌ_ JG뽴`K%>#nV1sB$R$!,^~n.Y.8P)U<Dzh(΢ά>ًՆW([,R$ivӀ\T};1H?;ucфwt{ԯGwxr,&;vi-ǞHk̝뻎_)ǯMt[gw$&1Xv5a+in9ݮ,5e#ͩjfoJQqpA.:ԪIoRhc>pXrhui |mXY|[I4|C:w:wK=m\O]~^,P?T:mz@a$/M:4!ä7wNy?I':Emk/^7g󼏻{edSݚl69:`03Y+ZvnL0o>oݩN~lt:[7ٽ-8XncΉ8u^1?;/ dXnS%PwVb>Il%Avxۤ3>;4C~;3۾&7ű%`NMMIRKoXS<0>N[[,/zDDIfـ 6`je[5Ԥ&bK6Ex ǭa ]׮/YY~a DCE8iwݖ/,0~)YHfWL3k~t˸2/.!4Rt E3]Z[G'>Q?/s{5}w J~hw.=uQTP ΝpH<AYɇ)7V:Kظˍ6eu*؋ܢvDSxl |vz햀HtCgELZq'Dh0>yRԇ}۸t_YT>=.gkإij %.fvhg:_:<׺0Ňn}w{/FW\oxcKbS/2Kw0 =ȍXBԪuf ^ZBV^٘/SwX TIzCmse*?h)ƲI anes:'XɋykilD ׺!*y²]5̧Et'ʼn;bRѝwݘIӟxꨢptٓv{?aoZND qe`j]tsGiUDˢ>;^ 3XQq2v蜆#1ל`\_^E2RV(ʨ3ьoa{YnZK&P{}ܒ9e>;ۦf~7ӮYc۶owNZvق+ugt_6޽1;~(l_t ^.-z^v?4*ѢZ! %e"ȕ#oMeR HBv4`J1="AXL9vm0-6vW΃.֬9[t8Dg7]xc"O{QĔ[J:tӚ= 0\~8AݴJ\ltbSo76rlu(emk۽sF N/`@\'W)LLE+i*lM/;SZ$Fd!V#أvwIJ-'~<O +1Rݽu ow)KͶtHX@}cݷ޷}BxO)=9}_AӖ(Qk{ # h\b [%{mLqL "Zgy}#_+iλXt( N -aG[vM2FF.=nH qI|b0] ޘOj|ǵz$SU[A;L)Pdf#jE!ǣjܱBh<4wG]2άn,. koA<{D%YL):Y0o9n Hlu*R$t(u615~*I~AV4qKbT*M ƵsDZ5;6m%1fzQHt|c˝CyGwYx~1k=R(&xN.3Q5#%'1XA=,K |^Q$JX^6vBFkst%G**ic1AJ/yzo ׳_7o ZQ("}4â,Ե=/I`+k4¿/~^2"cb0s$X`;0ݝ:B`Z+ s#q2/nyN;ܭic9V2 :t q^4%f޼uLլӭ"mh"&PX20Ӯh0_-Ti4kǼf(á:?Vh.'RwRǓs&z .̲m)ڔgLŞn 27=r11%~8[vWr(jV(Y-pi)e#TmLJ[ZʀA՟|6ы0e)4.h/)PpuٰjiK|G}ФE7|cү+ueQWPYJtΓ* \NK*?k A(0sz<ݲU#ž[\cFm,MD$<Ɖj&Z2:794ha3{c*Bs\d|3QǀfD 1Ʌ!(2?( ]_ڷE547?nybA2f${:eme#`e巶%[3 nRSWP#7. 6m&gChO97БJ4v秜tC;6U o^1b9. rZzJsUT":AvB[*~)vui%h@ׯ Pɽ*y^4R':FJ7T$k!VDsJ{熣ʇ@EB*A,WB' (y^+ǒQ fB$/'=26-M%vbNtN;^Ɗp-)<}-GǓ?YaՏܛ.^ޖ> WjM kvV|}ó~:6YX>#KM+}h{:f[VȰr 7#& =O9Yl{rpL++~ȗ6<{BٷԈmw1Z*7uҳģtmqaȸ3҅s [TvfLo08Y'[ V^ng 6QmAoC$(Dq 0Tѯ*QUEea63ł <pW$}!Һ{ @ײ3|,1|V8.R:Byj]`V~cO3]b9yF6݆ MMN25dB+ҍ^L0 iGn#URwT~.z)+j籏״pi4 +BNL6<6`Aqa0Epݏ +pv͍_CvΔ(Xs0JGZG>J+wȠF{vUd;rJy=Z' `iR/)OeuѴW֔^Hx_t+ kVgY#7Wt~U1P ƍ>0h3̡oJ_LR2R.0n2N =xr,~38p}ؓǥG~Q; $_pP2g@[6St܅rYeLBAJkRpq#]xfTxWǔݩF=ХGqrn{N,B* "FV'q#@! Ϭ8i<*sqm9HSQ^=: ux1ҏE&4g% n5z3^zWâ^Ofl!)x.bCn]{z|?ѻoGZ2%Nd9vsR7Ft/M%?(p#mjel ܾA F5%+ı|p(mՔ$'dmǿle&vγp4iܩdDQT 8Q#xƵ8@!R'3ȕSAǮprPV>H؄H\k"ZӚ[8@^J/e̕wuZse'*d^cܾv#*Ͷx2;cb6M_PY_<9k^|+3e*FR>~th)J\yZӲ>aOdE3j)bk(Y(f >h'1:э,vzec2#Y>)r;V4Ӯ.9h+z3F8WDt.:cɀ<= G]郬_y~݇:UVQ+h:3.Kн!G2UbtcNbMW.ZG3DՄ5-Q|v8^}ǐZ5߸CK2<\l:%Rku0tYΈ~TפJZJYr-Z[JOB{0cҀyRMv}Q.lzn3NPTS;հ\ ^Cxz܎R+ʑ h*H2ܒ&O=x̀H Βf؟m"h%WAH&z#qe6(n'ٺ54~m g+<v?ՆU +ϯG5r»ѶWYI<>xVL # %$#:›)?nmKĦL̘r06_ ^l%mmͳvQ +;'*AM"?rXEAl-6 PnU1eVPTۖyC\8zҞR֢ wYv& =ec2M|K$1-קji osLBAhî5"ˬhFm78 v,*ƹLqK7 ˇgEΝ bf]m6{W0<7>!~[H$*˯~gc~FSq{fZӟTW0ȎLe<|9e[a-] }++0mƟ*Vh * d &<ǐ+=~tu%Z$(eYǗ9?)h9 K*9@ Y۷*yjJ>LhBdjs7}ܜESv+slվ 9uεm[[IB~rw}6Sԥ7uRN\ 遝%'9E%UR0+lOi+s*ks J%`&: !E笆] Ї6Ȭ."}C;]zxE-VoBɼ+?CC_Gnۦ~~.TLmFmU1kh!݀&X`xqslɔ U/7"AO\TZGm$]5'ɮ +y:YJr]lQ XώaG XP8NC%]$_/ #T!H+ĴOŦ4l"|ur4 jyI(s<ݡ~A>HHZXsT2XB5cr 7Խs1ƍ{{?P?4oP7X_j&AY9Ue^!>RI7p$s 9!ju.'w"ϰNʳspd6+ZH~o{Y )"Oiiya"}D㒎rp'/eS9X UFVYvVIC2{!Xn[ܡ/cwn񬈟|y99jz >9UL"̃!K4@Puaky5c/U뚦Ծ :L|Cؿ'*l1zb`+1+Y(t)~4HIrozZhxʎ_)!`!Ĵx_:Xk;v{{F:c8'onS*_C+dJ3E(S$yM0wrp>%џ|$ՆN JIʛQ I d5߉ڜ/=%'Y4P{j#fx4xڳ1roh/b>2& m5E*)fy%"X[#5ǻ[;h)r-E iּ~T\#As. C.O<"nk-Xp8.=r .[e˒hI;[cs"RP]3C0 ҧͤG (mʩ͗Ƽv p~dqLWgk^U); E t2VWȮ$OS`RO5KZC$,qE˽@,J\ huXo dI:ܲkya!.{`%Zz'Z,4R3/qu_al$;3pGi͹3xAm%(!gqX gFI<+w2V 8\P0YjUJcXZv|V;K}h 0ҲpW-A3ml|2[xʣdLQoGu=oX0Zs =ֿhG_(#[:/}cOmwfƬQ9L,Lq>ys0KOܲ4u? R#seQ]˳o5'A.ƍQҍ@;gZBv(u#4k,,P\mo8e!2yHxu?#bLW:?l[ sV\wȽ_bC?0t0\d!ǖԅmb ĺWe1^:*H&űO}!KRE2cOSbb3lzn"E`IaYf6%?Oښ8琔4dѝS5R|.L7Ry x_D-m/EDVqpP\U`R~H%MR`xv<XĶl%euoGݤ;x+EҮNZ#:Q9S C=|JaPƞ_ozt^61ͺ|#TЋCMбͤ Zo=WO29d=^"n%SH׫4 Kׯ~ڑ)K9~{t.h˱B(fI/oG*1w9Hhj9>a~M^"~]Y!ݯ FKpʎEV:pp󞭓>a GVSMcPiɡjP-zoy.Ykvf*Y/dOPZ#?̳Jo+݄&yF\VO3϶J\uu7vG`Mzȋ=9M}2vO}Ngf0,9AU\1E25>iH5`cl[K)Y^*`*VyNxKִz x"rjh%UV#"bwJ7t\uQ|]h֌d8n9>gȆX4c[uTgX<` 8,*{%R.-^ hӧ$ڮeCaSjZz8NtZ:/V0Jh]B23N _Ul<̨xZpd/HPҒB}j-ZA/ {lQZΥdǖjTJJˎQj $+[jO)/Dg9Rx9s~b4&j*)9nQ(Wd5 Z ae9l)69@oa7ס,Ƥixw֢KhK{zӿieˆLFBJi=<)H$h. .!˸?_ف[rD" NwJGS|׳5im6ǧ[ GN6bŵqw ¸_]VuH× sa~ b-kyBnfܹh%,as)W1 &m7Tұ^r&E6n!N0.?f%ܸL8{13`Z5x~R\YWeȖD%ujA8LM:GO8d 4m:;^ԏect:)5`ibprdk enQW)5Bc=E }1% Wԝ ZG:f1atriL* l>!   Zhک$fnh2^fog#<$[O;~ "Tl6@& *Go{Ƈ^(L@ٖ^I:xWEy*ep")U6^NL Ć!{S2B5rV[Q.v7Bn;r/1r%: W`v=dܗuq}Y+P7D' H(始ww5c=3x6U?]4ABi6;K\D]4@~Tzy0 p6w.Q9Fh)čո' .Nb)GlR-~| <d CVr ԅQJrKr 5R֬e,AI7`kqq|hgwHT\Vy m*Ti?R%7GLwڥpC*T5 C KZ6{fXn]Wx Ml*> f#VGG1i}7L2Ưޑ6!Z͆W1V}&dEH诟L񬗉e2l+_6uZMI3apYpfIhP "Ũ{h!ǝ2Ŀ؛1$=u U<^/w7IͩqiAh,x=焘n2_ 4o*M·Nof*J,y@췻y[p AȰCjH9dE~Ο aL WZMϝPq;`@: Zq 3AVE/>? >KR}7_{eAL.A0ho@#!4j$6󖶻8^As1^$uvIFueȉU:U2mm z'x c{=h {bYmLwTecrt| ٣ӤXw8`-Xԡ'RQ@_CW2>^N)u^mk~!@Fo!r0 ΃([ {/t>֐A0kHTqyJ%wC>b߻DD_ˋ-Q?R^)CNr6%=d>(BTAII.T`rOb4%,.tqh,d.? Qjd bZdwʅiyʒ7,X~譈$GƊH߽@̄R}j.ۏ[9hL<$ \VۗWj`Ni;RwU߮{M1aN C^ΦG=ViitFoUŜQ &! 2뇦TwQnU 1 ^[>˭@]kn)uƣxg#zzc5zeahו!F}UZ_]%u/NqB 4gڷoNr9@F_ 8Ĉ<̡pJ_!4s;#Zf,JWdR_KFPsJ`I3+'`HNM\fA^EѰ 5^xzKOi(=o"6ROU8"_S0taO,P8b΋GL,B'*EnXk>!uCbCX$8A/oNze> f oɫ,ǃy2.BT<}̟n@WTăF!oͅ3iw>ݪGgYd2üׅst/W&e!a`` vMV:]]V|/R6)y//_۶y!<HV=ˎ 7q;͞i6pwFx}II4hV"5[y&B= N,7pŹvdGqJI싽c~Hڎ+Y k|%9P]AX~U7x-+{( OjKFkT3{͡-ԹL*{uC\H-]w^:<=3yn0Xmzak øq{"ZL!\ `#w;a}!hH҅ndu LzOo}l f?-KAO) \2d_|bZ/.;Ƭ g; )6A1gwb`J{yyJy\kRCܧu9§k .H:: cW|jt3g4J{_Ыد ŰnI*oOf*ow O\>`5 #zf21d"h~ە V ʛnb& s9>/]YDz8:p{I&!Vy4$Kyb2QtVTRm WXZ#\E1"t}J-)r0m%?sVĿ+_άnJNg2I R|0W@PN`*}aY`8#!.kܒpz.F7ȏ*%\7X?YO9ώ pK'1k8r0P]'oOu _Ǖ+<|Vj] kki7#>3CVm%8_f1v99ؔG5wQȜ7 oܐ6iHHoҐL^MrT I!v$3WBcS' UN,3^OhgP^=Yj+kgmn_": mJh+7op %;+I؆Cr:;*"aQ $>♄_DHQ-][JE=EqfջxڼɃ0Q#A"՟9&GcSVPȤ9PNX2V`B,]4za8T_r~6tuZ]#xbF,f<0Hc !z̥ 5&S/gwG,%J:#,fSSٮb%уO(l|Ltem^J=&W}Yd =50CK~RYpJ,`Anb. '-pe ЁwGniHڌLR)g=IEvfx xUߜKpm 3[r(M݅1 ZGXp 'n,vTԵ| 2f"vuMފ(cH׳{e8Naà6 j5%L $;{d"y4~EC=6 <\^^eT8†E gN$[WµU2==oWרVH'}<Bرon:#VN"FRDk4nů &9,چMa aiΊBG=KOBm"j:3"D5:pgey^Kׄ֕H*|dě3I+XCqAl[oR7bWPsDWFHdm3. *TẌ́<b)pqSʒSY 7ZfK?&b{.}2E͵}0'(q#-E7(dv U a#I%*6CmCW/`aru49((%wB'[P|ݝQ%oSDɪU%ۣY {h`{V44BFb(H)^hx5 /RG:sPOm}C۫@|DnN;R|;b[F_Լؘ0Wn=<+S衷 q26i&% R8Kpް?τt>3$uMذg wbt0.RAC b?xmfwώK+ȱ@'#}ѡg\UNO lQĉ.q9.IҡʌΩDE^ 5;iV477Tb(bj狎zn7/5)[hĪ O]ȋņa?!|ڹ#z"8sp7%ٴX *WN4x# C*R;_I$m]HVI|Rt|Rv1 -%-& *Fm$4!P/7Xn :Fg*b?hQy^~.6m> =-Z̞+GOQvwfsfzSz=It#xX^~ei/PBRo'b= 9,*I_67A&6"XFi b0-;2z,@rX٧x´jf&Bn0L#J2+qLQ>@G]dlgl#T`XDPkIZK[&'Tnsn-WM>4^;J f4$߼AȌX7Lx͆d;98ep^[EN-=~$%"N(橜XnȧU 2Orɷ8: fJS+f,ԙydQoA,Ռw4)3Pz%˖];['j D͵WHHV'XpHnsJnJ3k2榦U݁YN8\V61\2'yTl47:L,iZ=u(_XR 05VbV(5†؂,_nFq87%+&*|&K(͖\)OHW}}VG1WO=גd gg}bUiNՖYC%< QϘIf< F;[ʗYl5JFÒ vY[4[$աM5ῆ[Ðg N:AhL9i:oR#df?S9](e(m $QLW(woSʨ\!71L5clENycdͩPxhŪρjRQfgY7O 3=B`bx޲K] :oLśS*,MVחutdt')@܉i$P$6 58'=ߪ4T&Oу8+/ieR3ُ3UMOSnYK+ [p2Enc M #2̰mg:R:> 2"id獆axV|ЬgB}`ώ aِ% 5BυЄ=lJ%)f"N-ji MvO]7k8o \e\ʞS=O`Uv3,uHU&23L_ - ?R bV))It~"eݰsDHCD$ډu2m9_Թ~"i&[ݏ/5Ms"ix։^KَǃXzaǘ<^ X| ip{Ľfp%]䊡$|hj#(Hst$q nR ˧_fBa Rpy|2Uƀ(H2 _Ձ*!e~Xު.%gs~XVc *0L~ߦ16OϭXF&fs\[ޣ4ȷgA\L laJ¤_é>9S$RŚGEl0X(RtATZ':p<9b)u?ȋT ie2|,>kywt_73tZ:&'HV$UU(UT$^©?$i>CG6ߜr:2XF/2NV`!1>w(HͳfUQ8f\8ZgJExtĬ<@J:Օbs&]LhCKr=i@OCPgoM^1]CaFO GDޏx.֭ ڲ%UC0vkA4F%hKP}uMV:Gx.%$fje?/Fxѹ@t\.(SՂHfJjg秢NTrk: _Jߦ滖 ]D@J"UJ>f 9q@GgQIKHIjh7Tx#758em;='n$?y:ƆzS3ͩq?F>ԁT]ͽtdIPv^dmgh*#-<}lJ3"wt6–5rSWza'?:k_ĻV|z>¦Cw`Db+slfDF|o߼}&ǃWMX䔂H ŴF6wuҸ3W6N6SpyOT@lUj*d܂n"B~gu:piur!dr%T,KTQ,1?D.۱f "3zRLP1ځ]EI/i ' |7X|X;xE&s6j9t: DIsh{H&Bp=k*'\A2wF)Bo~hM&X@D~ƁAʗ#dHFP)6Darې~3c5ϋgx&w2+& B F%z /h2YDNA߄816ɼ<{&A,H K UN@*1 ƶ <jgRiw?[!oBR  5xJ3o= 4%`Lbs%1*T+!fX}U׷Kɰƃe\dN]8!}HM?,C3U˳Lփ`9 !{,5ȣX0Gd>J\O~α-ȝ |ED4Po٪bX[TJ$5JX|y1TJ\ N2+HΞJzX 9~$z5$S:g<*s^9)ZQ=-*MW:]1)'u/BS FLCbݒ4Z4>7P+.+ʘCWOoc9Ĕ<τ܈ueۓ}Nܯqywi8bitNTOI%'7F_=D3O ; e.FII0" q,\!_\ ߙHPQaX[^IgU.ϿМ8dCr͙3RZV`HAA Gف*;G/UH ;bBT^ %HcC9LKg~||!'/- $` N頟RV bꅷ.{Bɗp#/}zb(crҭ41ȫ8!S8#pΏӰ)V]m~VVkz-gNm![c|l%C:5{ΆE$4Il~'~c8sccdI:WK#k90'ICp+8hmu t- q=PL(v.N_n=9G,Vbl(KᕶPe5*T/Fܷ[ "~M,ͺY %vbpL!B/[)kYk-RO ~Ŋ fWv#fJ+}=dyN`xn*b'ԯ m' *HY3_ޭF31b{i(QzјHH|Cg v@ӛU%"U[9Aj1E^[np~7fޟL: _(܃j`qa+P|j@jJy9҄aT N}G,h5'[[/;b(5p>9p`UaMȿ;uR W>xd*bKd4J-׶hfq-[qNZX^ѡıFN|hBƽ6F[P6R!ƩMReGr5eX+8>(-qJ1 d'!qpRmփU;PޮWlf2#V5A)kq~g)keUmጮ~\l{els l=\A"GЗ شm*{,+(\Ob$,ֽ̹Z86 FA'?v\'.P ArK0QʍoYP²In?oƲP ߘDOI1$iL!҈T )%19AŚ G)egc#EJ8/(YP Bz-^{"=aB1R=*aY\D j݅9i!M<7[fbBu'@2"!] ̭ S$؉/ XШuw*&k*@@ ItA!?~mN*]rD2kGqDw(I9 k)QZC" '2$ Br֕t68[p>|' A܏٤f~>W{]74>QO腹]3ab({vfrYR jĉf߹\BӒ,* #XO*^koVnHDP!G|}O~ & gX/QV 5SU2!' ˁ]v!f]pyZv/Zca迮:K8DΒDINNj6-b&e7ٯAz:ٽ SS&751A9/:JʅIKv2wؘs|\xsznAp) mX]]*~lf3'<!8T?aJw͒R鐳:GzC&_&VQ*YmbsUy O ±;?"M&]@="4p1l&TŐ^,)?BdtB[ kwD5MO ^[&n} }!j(ɶIǺGٜ,bWgdgG=*v*Rm }CKLjz fl|&N\ Jp60>U7dI(^GS sn;:C;l)l`vʭp灯Pr9}!- W m2٠)EUOԶ;3~ Y\/m)gc<:RWWv>$llFcMz tEie-GXocSM:&(NKKSD9x}wvf!Dž\Q3mۿ 0*P>|RTm'ַ+*~:1<"mp}0 8h qJb:S~̒ufQ$>U*g*e`V qWMuW8e B 74|. Hd7JڙX4Y9_|7jK(~-}iz@` n020֧i7z>YNm$BE13쬺4NͬIR\FYv\̣/p0<~{cP(v,}ԣ*j>O+a<FmHF8?EEiF L=z\7SH4F0 4Tw#>wPlj!(:Ûvq]49T+t \10pyT'l7I}=+g#ʾ$M[Yo]NX|y":XM 4(=t1~!j<9vd@޽XSR;CO8m/Ix^r3reurᬔfo =[友-Ȣ4n*P':r{@7t#CD4pŁ>yU}T+C­"%W<< y<ӫ)Y.2cĦ-SJz^@3 EfKh* @ Pe 82&\].m8frE$*W(d$Vn4Qov^-hF%Ӊ, V!8, ZH@&1@xzr3/!n7WeVa M7(P5oT uOY=8!'yO%d_>|"QeC [h/ 9G@(=Ȕzp s?QWz%Bg6߱HsEprd{"0Rc 1ۄ2E_%, ]'FtFMkc Y]J<#eQ*3u|zA!FIC伉.R9@1aO%0<}fQP05xxPRy,U%F0 A-4RA5C }9cLu4txr(t#:ǚ@R 4x;1 Vo3_Vڠril1aCquY6#"r`n}dK݆IH*m科FcZNo9G"@EU-vI"Ӱ8;JZ|iwGXg,p%Ђ(jC KO8#;*g}va+羊FweIE6?tkաޕôLS]A&srN(gt*.9*S 9:̟'&< gv$gu+V:/`WqTi1CIR!8j:EeIWXgJ͆LFG"K؞z7)"' )d}" )PlY3Dg#1BaOuPYȪGٗZ N;$BɪVt<b{Ɠ-oajǗ>%jXZ2L:Z8^r[I(o2̋/Q8lpnq^ i)(5J@v2h#xɇi  ̊V6#LiAI ?(Q2|D*$hA)X˗RT_.)b;:V^y1T$8f*زu?|:\oUi^i~-J*sw|_IoF"&[ܾF,*4j)uv]C6'< p?rU:C- Vb.+Dm.qs%0 LqTɀxh@$r:4|ɘypB"K[شkb~}@)g>4XDjmh@~u =0znd-asvVrV^N4ST8Hm.$XIFJ垶oh;]3LA]UI:z54яC O7U== .IlHw[h[EHC<}ђÿ!Aӏ5q 7*Ínq8@K/YtY 7 \p^+ο㠭ܓxb(CJ& ia&2'Ki8ScJ@72D|IPdY) )[.Rl"dx.F,v*G޹:uxx6hQMRx:p(iG4"Whx~ BA15c\.56ܠķQl~g[OK~ 廬qw%55[V$\ zoػj+{(q-Ŧ(5vF@LyQC_8UkQ [t3uBr+0 EΪk_H6ffg)0 Bm堎`̓ 3)1SZX`r/O66:N3, xAeVYj8[0YP7l Hj넫2dEgM!bñPS|v?1L%|76C( n^BϻO"m 2m\;QAya_5ƥT}yLƊfVu__A)(dP0"y"oz+9Ia DJt6:;Mk::':͐儴v&tkO4&QDJCp˾zZݹI?|)Qq|y^a=EKK'.ld@9+2@^G_;G틌:b"ˈk҅*[ C_'3BML2jOC|LEp磍LHq4\dNz޺ۏDM4)|eێ~^5]j+bQ 9ۢpI))p2v>zK ]L]7?l{44EƖK05pd7a&b ,ԙ,0&+Bh% Z6bJ! d41}KTOII_1ʮNSuW)GKx740FUʮɊ|9ilSCI *r5z5}c^fL_HUc Ć)0Pn?Y 732A2i(f^ ATD,-Bu΅Ď>ZM`[N&-(6Ј7uh# KwXgeyEVdqT=oT{CC-Yꬡ!6x8 N٨C \)^EF^*#&|m^ղ6N=(2^Tq3,{Hkm|ВEVlYb?OF&vڦCk^e Vg_L9 ώh65=6ԾXf%%f+8m|B2R B$osr/N!T* )V9ےȀlUZ[B*aZ ¾q3ryN>i=L51括6~z ֎5r|qRFj!0t'B' d0y`$"9.ɗC6QD'QtXZU:q.i`}۹K?7/[uCy9I9F39sc;F5yä?Sg)' X=7%?T?" K$xj_إ(,"$B [Jt!O谳r,r\2L(ӣ82M/hJ->Zdw7HK QB0Ŝ.~: <&ZBIg{Tf]Q9~l@} 5rZT"(7S2ph̚b_1}F 告&jcPH<:%>tq`.7>TU 5(gT*'}eӟ & ڎT߼ Mǎipd IM}2QeJ;P }}s@u'9r.AXHd()X)Ċ(ژ&g{zu]ruj̡<7G[F x<-CѫU!JG*bGY9ԅ$yxwN0c&&6#jJю3LĄ$5^ow z8Uٙ70ڨB`DK"sJVf7VLC洎SR[2#VUj @׍WQ;qzW9BX":]5J 0+?5vۧ}e=X;N& $/;d>6OQ àzPhv+Brzc(cɩoKӈ-V!́d4 ll ڰN3O%W!Jo'G>)xM^ՍІe"uL_C tHG^c{2j8rPx[t;y% GjaD#(jG9n,ty;C|Y&+H_$aD@+"*iJU߆*pשd`oǯHk2\{;a\I6@}V!Ip #f =J [:$ {ڬ&&ga& 4N,ýᓄ ȠǦdYR#<}1֋E|$=^_\~z=uRv7Ye͝nv3muqI~P  ^|][O6I:Zof)r:ۈE46#w248 ~.  Eb-a+K朸TTG\1 Sj$hR O8KJ}*:Ứ=WVi|*%Q_nb&>< 9q40ؐ^6{=:RHMV|#! QagGm,w9ȃ~P:#n{CV ^؟7'vu4IA\)M$"~y^a5AuZ{;eץdA?1#VUI!K~2G ()Ax3cXH§W,^$ҹEj>2_#8>YN'G<P[i޺(~GLHZi6/wXV΅,) {\ 1c% hW͂+Aуz~<Ϥ`BvM_ p0 lh4ѱ\D',6ʙ[K3|[r { h0] G8o$p~噃h d]+[D&HqqPSx7ŽU^Wb3tLڗ KSPJO5yFdtx@5i^%FMgގܾ+_kh\qJV>h5~1%e=fa+A)6 7nF57EbDd/jɘ7 lt:H7LPqAP.|̢\3z%mXlS,;V\b:aDJQ Кl;e.?+ﹾ%X, fr^aQ咣UŲc NpCf7#~+<5(m# .ftCK=.EWG}QGXw'O‰.~ByJG،+EWbf˄hr=VmK?0]NS r/;Уª/\xk=o_vZ84S9Q]܊uGtoQmnqu!9D^5{f\ ]GMr'3p/B2:R>|9qD9 @wi[y0("Jr߿QdJ.N*$YX|d@'CeyYXKF:921?$g* 5s>H4Mz1tBOT:K¼V[Wa{J[Ί=U*J?Gᷙ}~Rq_xrwx6 ;КiTpR۴Is&(%ZDJ{Z|P\>>#@£U$+ uؚ7*7i'H8 +a]V&{QB"\g `웂, x]@><*N3>@At&d'+#iKuh6~s30e+,oDgGji!"Zf amЋ2$0W:3HFCVL^o6LoA;yĘZ =mku a< 'Y " F+xb"*]X8g/[T03ߠ)dO&;ikXl8x:%~1E 84ɻQhM%vNmk5,*(=9 - #-X[/-%U&?h@ uM$ ڳ:2fT># M~Ŵ ĀK?:( NO͵jFb7v XuHpz DRe"c1I )*![UƗEs)X@eJnM7^ʜ^z {[eN$ɆjFEif6?$GvGE#G )X2C@MXފT(jfJS 4{d#B>捿^^rXibz>g`Sy(!Jn Um[^ 2<آIt/<8.# a_-9z$9TO9>mi1 ]% 1 <٢3G!vDä{B"u,'tUИsM6u|X6LM{˜*Cc?gWDaKv')&dl5}$/6k5c}*a!T_28m1 rU'ajkpFƎ.p]8X ⇗ʨr6VhV|vɿ{BetI0#B3Nos8@?;aQ֠: 0`I+Imƒ,GCd ;HlToÜ K̳~:Y_! 4hxWٲy#" ܨ//k{kŖ|^ _:0Qv`#z;go(1WԗNM$Fd[9-4eIAMH-S -GA/(6OM>"yK=AўTmAp,Z H6?U3IaVAsXJƑ e;!6Ohz֩ 0/gHp^,toY]t/Ӂ#Ц i;:[qӈ2s<:&JD&a|t7ULct9 Y(em⽌h?QR4p!z=(ib֑œwY 2Pcΐ:RV͢)U1Jp8 j5 {IsɄ`R}9WZsowBQU!&5JvinьX.c}k 2rMǽ(4Tc`ͽVXPLBjUMOvs I!Y{,́F ԑrC\BNX٣R! 1v&V2=Ql8煉F8ӣh+e\Xw=mx`cD\u[%BZx{8GBUmϒ/4ndT Di׃yBO3) ̮Z*/\yqnQtRDDϫQ1bJGBfBЦ"Qd^Z^q]`q$jConT/`KwK{Hɏcs^(Wt/m6&4Z`y<[ī0F[l5&]VQM FSxDGoܟ%xEHQ6!(7k!nJGG۲ɲ^]>oq[k Qw4RWl{̅EBtJy!]^?qU!:c36M ھ~%Fk5bF8͙Kͅ{L"sX:4=5 \x I8z `HޗDևJi%ydۜW:Ǚ72XG/d?Hz̼@#H}dV \ !#T^A[8IhSezFElr"\G H6L]bDpE3s X|rws{& RO\s$Pv.; `.,r2ٚUh%UUhrmHA-xñ6|Yl\"E2JZ U>lƿ¶ݼU(##kd;by,N?KQ{7ȯ*yT螨};)Jt2%M]:h _ѽe,0-&,f4Sq25C4~ ;9L^=q (2־+(2dA5a<яo'm,lDZzeБ_{ۯ՝_n]8Fx 3\ .ڂG. M|0W!@pR VyEF_§yF;<>X4R,&{_&G/ÜZСA,UF{0Z @I} C斩e":ZC!,sxF%K 0j;ZCj8`B-] e=Yn*XG0Cd[M3 vT`ʝhc߰ k ՚E0[zBGo Cm TO-3uחU^p^S9|:N_rӊ|`rrݣ*یsnTOZFE0qt&eD,n|hT=ߙKoB#>upIeD0"q_xgN(t}ֵQ#2Lald#矽ʉۨ1ǠdD(,[Z"TY3!D^Pq)U9;ۮ.ht5Y^u1Z`sq$[-Su|bF[}\tͰ*?wd!tH1v/2=X5nJCK7xB'C18h(- 2/rrr L'TdgrkHa5U 9Ty/88?1 t,bmnmg'~tJLC&ՙHbpIK|)e1n 75 ţ*Q[Z4Sӹ1C}\#d-r#ўBJ_`թK}b,9"FZ#cĪWU:x2ZI*R@/T-r₸3O,mhtZj18]?iRV1`'h. 8y3d K Bc-,tX4↠!NazaI@EPBeK䲮ԍ۝H-{ϼoZu#GhtAPK֐*3S8ΗF䊀cls/$h L?{ANɹU^5vSo0J]7D}RgJvvEb60ج7O)47:A&V $ Y4唆z/ʬZ魙+f}vR,v.״#AlOq9RfAe` BsKgyAX` p~&y<`!`30tJQ U&˾K*"ݎ8wJJbM}`PN$ h2W.'&H[MY=ru#Ƥ;=G$84= j2H6C[GxG˚PM)4֢n\zf7FmQ߉G.\$G}h0x$9?}xS] `SZ_QKTAQ\t!jjQ1F#Z~Mh幸ر5ujO'3q΍+7jU2T0`ҋFhyf˓8hԬGdۛ -V)WG4jh6_wSW:~oR"i_:5^ĺ 2iD{ě}FDxFې#2Šc4"hFi>z49OFۄvQM[\,hFsmŒ9`Tt}~h:\9kGH K5xhzٹɓM!970b$ ga3*Ya/HTM=NؕW:Q0Kv<Q&NH>/w/r]0H5RI^>r8~-4@Me6Nd^Z d]JwڨiQZ\592nD7p2v\o<op5_ n\EVsrW@ 3ĉ9^ObHf2Q~tcjL``__aMq/a6ɦN]GRPvٙ{z5MˈSbQ &Sq l*ήT߷Akf2fÝSá (;El/Tu׹rBX* *QTIF@MSYgݳ3JT+>{@b+:վEVO~!V<:l )`tN<N%Al7 lҬKh@ z]:;u([;vs=!?R42;|4LDug! Y/F}5{LvwQ)AᩋfIo>z'ȶ` QH"5zm/G?0wa$l~j`95B/⤮wկOݬ:)K=( y }b n\e90`dJxgntL#ƕLKm0ozRGU}KT/EȦ#q á-9㣵ŭ>hF`Wj_<5|K0k6/n;9\t&ak1؞UL)'kk"WdfZ@pQS|3> |ܓ$'Vi5s+8sתxy7qS6heπC1Vmz*tQ\:!<?8z\127Xi\FHj֏}m@Iwϛ˞b"+r"ImFi1]Jo$|=ѭ(vn+Iv :mP_Hjֽ}gde0B!7@qynUVk*Q4z:Ky,cXxO$ |HDi!, aRCyGJWzT?yx}TݿiP:E09AePQp)tsܜ&Ofw5pUu#%ͪ w.Y`1@&m]-9!+ * YL[-mNf:\v aIdTe&ƿ罘[⫛5) *~eJ⺙LmS]^ˣ.,)VcȹݟBbp eޙ9)bGGP7hpЬDUOk"ޫC@dFM'u̢\ϛlK%=0 c#?:2a$>$+,+>%ҠBV| S@UkcrQ+XVQcw]EdA"Vh T^l'Kp]^dgBtx D`#DLz &!!-[阼e3 V蛖hH@%nf]HLTDJISgto<Py-&X(͂5W'Գ"0fR=~Z(oGE9͡4P>7@rʫ,wXe`px2{V˕q {j㲎?OCnġG";hEYn#_d?cmY7ٰ+3oD 0c< k9%@B7jEq&M XG려}=ʇF쳝XVReʸǞA#㡯qw9F||  1T1ӐBpGRqGp+1G ڐA/zn2zn-gy_LeK$yB88(`AdȔpj A2U(t(]2gmxXVa a-rٸx.N(UJI_-74 _m7߼Fٺ! ޲x>πqhV$gyd$xD|6ۤZm _cG2dOkFxRDR㘫BWĕib0̄f v>zgfI:"z 0wB @ֺ)wCo^P$L;i`0}Օg͈?tB.A0uxKz.E<߸ЮWa<䄒0{I+h :"p,s%z/ngݰ8 ˪l)+|7ve1"=jDӵ4˪ hjS͐|~/=A']TK¦ǭ;nx;)R'5\e itĂ bg2跉JզxNUrJ7x8!.HqGIYJKٙ,#{(s{QXk$I}>a6^Ճ܅mF:5@t4븹Jgs~nC:f)IW< j9:>;Hc~R1:j$BKa'81,岵5dB)yp*t|bu[*YA;4>@n_Gi|,`D=tՖ>ɏnƫL='8Ih4vYNGʗ8KdQwj\wu;s 33nB ҡ r]D+y톩"]tp(TiC?`]A|d/nɶFaUan&VJ}xP054HC18AgJ؍23)Le#`<jĔpW-1kp(<$}$C+נr,w91zNAw(ak$SvJ߱p 5f̈eK൲KQV3Kll3̴̍!бKJ|ҟV#1 T l 5"K`o;-*xOFX=RݜeQEtS) 랼;#ү+21#ܿfv4mo3Kj˩W`ZQ|E AI&t0q4݃y# L;袼.DW{&drus$EEyLzqh)VI; %]HH eh2LvZ5k{4HO-B޼dzM$nFB}e5Y|g MH^fߓ?QVTDv% | 9,ƙUao:+^۾'{|H1;')uI1{f9B_Gϒ}hHklF"蛬 2D(ky'6j,g[;Yv&u2 \Jړ buL*5w.۴D:MX>wc& Ǯ 5˨ҵ\Jp#kz<J_+M.D9O,Wl޿ASx-^?Xic6$&Sïxcux4WWW<mYvA68_/F၂uKҗ:s5wG=˵lA, 3'/ΑN[,~2/X>nX;fnؚ6~dzc]kcf3Ɗ64.rv43BW. n`7FNK߅x&WrTRf:Sz17RD թfTV@$'"].M]sU_Z<^݈yER% ("R0DwEmSMg3.LOAzg7 ʧkh.ll#[r \pL.j3j?ĝAD.m&g6L+*SDADx?B`iN5PİVb!dA)ĝ8I3^Df|jڀgc[y s5^>!am,x:9[dž f/jsAr=>^o\<954+}G͖%֤ͬ:O%+a7:=r=|X_ =d==@T74;!Tˉ mC\UI#goLvܶ)]4"|4X呫},SjYw |ՠRH4%gҸ53}uDvX1D)ꖱGoϢ&Z0@*vg)]jtdzi{ *ZK8a Y"A4 sۥK|,=6ܲ|bAp+馺hB)A!/c'#,[ʐY'łP߮(@f"UpyG^cnyʞÓ9(AC1Gę cZCOmfL+A;#>F'K d4ze7*dWJT{HvL zSxUhqQ@h=6z{O{x)G)#mVZÄK1&Awt@ݓr!J(͟2=6C(5?YT{)Lax)B$m%y,+Rk 1GB_Ye<8e+̩lԒjqI|4#:Eq(A4 m@ێu75HF_c)'d`+@iᑁ>~geU!~vF(H7N_'RNTEW]M٩DPnu\ᘷO#~PVL)rX|\U//6>ըsZPF Ii{?\2vtI+7B$uSU0+&瑓nO?UJu~zSr$&lU\B=V!fݐ$%zφI| ӟIkLN.%g{~=+dJ8:H ]A vdv&GńNH1q+׍Wʎ%k"2o"dp `M've1:N7dx97fS;wNV͊sCީ܂lJ2˅avF8R%-F>t~) &^9lH>y< e{~ u2LZRi7x5~#zDbE(AףI%⍾pZC疄6,[kc e"e$b7CV+4ӅW(#34RҽZX{7maha_jBl2XJB[{WG@Drh1(8pʎ3EQN+b;")Gl9J'9Nӝ 8dOc r'Jr쌖H4nJis\VKU^R_h6eMgs]UH<+j$9@.vWjAbCL8s;o1|3T(UApv^?t?zlzDvz#EK mѵG<w˕'at[qhvwsOT!WYbRӹPY -펵$5U8+Dm&`Z!G£~Xdȏxʎ튽]\y &`BOhnq#z3KxS'w2k *dhD>)uhaE7{8Q">ZS>Zՠ?CL=i Ki. @<)'YHfo[{&/pcsm (0+9׹BaE4H (%qD4M-Z J'!\/ߖlT@[y)fZNX p m7JUǓi-ᡴ~D ùAgI2.KVGk}cʂEsj~b?(C0Zf+`ɚ#&Wd*:nƵoO=U@.vM4H81`n]0k#Aff%nܬ W(>[c L|"%RP<5~W/WNiJm|qV1s:Yŕ5Gp{T KHe ]stK(jI*QR|W:΄B6Л+(޿ʽ1K)1wk;ħ| Tiq*vsAJ]_2'~6 &/!앀<ޕBJFgGsԕ1zptbRSu"yu!jąbkOKO'X TT3<4Q[cliKM eSU<@q'Svr$G'0ڦl<+P\p\9FF]?Iϴ*};WAޗB3w7aНS YBev` ;٠:U@r5O/ 5vOa&40B+dLJaI9ϯґǚ wAm"lT ݵ29ĩҥOŢPAk1>F4m(uj/4MjJX&\.Z+/-Dbѳ Nydj @ߣʖ +8=vAvI+,9e(P YP#$ة߿sHx8 z&MBɡA`?>Vc؊og&Hð1{p!aX >D[3MRZ%bO|q/e'Ώ(MC+zۡ$GbWjJ4-ؔYd@K[BNu|[G#gYw3U}ג/ $Tku`͒he% A,![q-F LxHs)PGQ;@SBDn_GԜswA۝J}NށP wKO׃qH })Lo+걱2l UHݐG:1 d:O&m4-V V-6xh.^Jr%SKcqgWsF:iT .j `YLN648Xo(V_#XyUrBS]Ako4e'#vuqM$c |/\#[ Id{z6@@_WLR-(^h$D2$xJua?FQf4`"NAo>¡VJEjtJBv*YDZ /,"!6 wTҭYŒV=n({-S5F,Ӗ(P%+y1#%PF菋5BIZii=׻~ln V4%q+r[@'ZRrBr]#$TfNwLN Fy$b %gÙKGN9@hӌ[Jqq0ԝ&#IS ;.~'qE? Ʉ%.TAPƆ^&_RH4`zmjW.A )Xx8\t!ڤ )&jV6T[- ^KNOi4ip  9]H v H̨vϊ8.×),ҟG%]${yG_+{ncъ8X#vFmY]C?y\SUOw OղE*'6Ry>̤^i1)dlu]'A$^ڥ `}> rn,_pORXڤ~}cDbs~XK3q.E5k%㨂XXruh)ԑt/%9@oVvOa؎\Wiqp eיmT4~U8aSb V{qMc7 1.i|lКW-Q *r' %Gi? OrͶrOU 0oB:|<%Cϣ "jp6x)#c(Wwo@7AIf+1P : ,qKi_\ڥ1 ؇F0IE.+3Ԙ@k(<y&굏\'jpв?`Ui(WARyyGOU. x4g7b!{O6Azl@!BcL24HDZyIHٕEteڷkؿfg{l-:nÐ N nABvpKJQ^1DVW_IV` Roz}GLj`,~kFc&WcxqƁ$>Ӽ>fv_5g,m1+#6p;V 0p^ Xj{^$tH_S,P;ZQCY|4Lћt+־I!h3&n:kW޹l$ph|J# }p%ѡ~3Ãm?J||+^oz *[Jz!eKw@ftl>d3#o[ł^wDh@6T0 pjY ;3{e)O$(xR[0PgS)"~[QOšD?P 9HN[4Aity뵱Ͷ v!َp_,l1 !)S)ih#RUP:e=M.9^Xw15s$Hz|2!FjjJ|U. J' >.~?߆J8\Q`.}03hm w#pY(JWS) lߪpX 8BE@zrvaIh q;mNh_/hq.YɴH/J=lkH@ŦV^z3\f!#,zM .dU gCt{дpL謉ۘɢJ9FsL}ol3 \瞗(͔|G~r,T-z/Y |KOU6?g}x-=HHA2 ΋Aa2I `ySУ9*MqU/Mũt sK_r0]ɭWw}.K'J{ޡ/ *f|9knAl޹HPzg929̋ɱxU،۲.`rF{# ^f FΒ NI$.6u9TiQ~CΙAF%c ;'`\"2G I>$~^n=vZ8ƥIGJn3]^C_8x_"@8rS7}[i֜7%^ $Tk>M ]XC9k;7vˈ]|bwSk=ԢK| QJe_cn@1nz5t>7K'-R#F#%;1ܿge{ҏYQdRiWYy)wM`&s  SF!|5&A E} yWXruj:+%>v0H5M4NYI )o~{WLs #d gUVܧI`! 2+-Š@${A0?OI~oߏ=aאbg!.bB!M BitR] *: *RJHJ(iA SB-RQtP T@-% :HMR4"P J ([&*( D(PiiJҔi*4y4!JM :Ӡ1:)4 %B*:BhJQ #4h4JSBPtSJ4H- "G@)ZR@R!l(Sii *"CH&ҚFH)]BK@ҭ-MRP- *iBt"B @HZM-JiGTJDq h#lU)Jt% @tRkBP4 S@ҔR4hR!A@* K P +Jh @SJД@] 4.*RtWM!JP)IE4r IIBR4%R*PJAh(@: BR.J J:B/et!(QҮ4% ) iGBF)(Jf *MЦҺJU4 Z] 4 ҆* % нA媤t.F(4:DХ(Kiit ]+l"rA!JЁIIm?U;?Lj! ڦHE (܏Y\r98*ƳAvv{/.3+zO*[B?X?ahN l5<1pKH>+,w4zq̒@TBd;fg 1Wg`@%`yXk^O Z;>)Y CqkK1\DᾌAIcUh8LV79{>Ȉ)_rߠ5}/#w_ML96FiOX 1PΫPrξ[JQW)G3 8x1E*@T!O[Tw Q< $RAJdCogakԅEY2,[́TMT!/}8:rKjVo!ߦRֱU+ku\F6C5AǑFN2)@Jȝ}Hn `ʹBEExHb P&G}6 $.8 LxQh #( q3+-bMG|@Aƹ8ǠOz9=uİQN0$mhk##oFә*+b'??#,aZӂ(vc3cRF$ HOw{XRd@m[-VLn{p6`.S7@He b&c[m /{%cf6PݷɃbB33_O$2Xs F1yiZԌ~ׁsCBwrLXW$E{0;:3dβ`ƶI%en)9pߒ]p -ٲX]-{}meސlͩvGV3 JgPǍ&?9Ÿ~~ h(XNB:TLRb<,~EHe 4,O?Hi( hE].]^( S&:Koї/&2]eHA - r+נa(8~z1b ҩ3\J|"TDqE>MOݯ,-N`R Ϧ9Y]̛׻ʾ>!pl_O-s8Oy\k㚅8,0Qٳ6 X1_>rR-Ӏ !tjv2G-MƱeߚ_UR"6dӵZ#k4p<OjyBuQH2@1 M cB V:]4wy6eNB"VMԎo fZb ,>:ۂFe`qNQ^ 2u*4i"8ِ݋OؚzfCpXhFWyjH,ԭMrjX+˄E H,y{:Go^h.D_ :>4 eT(j8m.Z}? )z^_oWIj7%a85Ɋ&ƾifryx27$aގלV~;hQiZ a@6@{2Aq06tw?şB /(-\+j{YrW1"Vj ^F.㣪$ W:hkp@m1c.E10GG$| ,)n}\T 9e nO}#MW ,EnubdXD* 3_U|1dAo&Y9*G1 Ló1vbm@7hosKxfM}?bVjt?ao.-*;zH-DqͯJ 7jr$^Dx:r}Nxkf=uM{H)Eأ{4/9z U8eF֩ȣ Y\JOv÷NK9z7U}7=UFo,ͧ:Թv%]~^~lM^n<)a[u"Mcp -~:}4kLw _"dxC]O2]O|^}38ZZҎxm8cfIFkm {2 *8ggbiѺzUys$6^n ʛD@&r{5RޛcڂtSE?} 'R-!Z.)\8FkD%l@ʘ&BTۻ.zzs ǘ"2Trgt/a{:&>zjK>rKv7s5i_;ZxU͞K /=R^G pe3*1FH CRaڝ[!4о\Oʦ0)3I޼vRW|[M7{;o=>p3}Pլz9EՐ3t XG.q9u.a*זK) t/\,hn{1]X=]׶)5[taX}m fcXgHSN[eF`AQ[t&~TH(jﴥ^zçmg};%m{bN#0^%旛s's>S$ϙ"8F {MMXVgDaxbXH,O.#!@}pht){cFvRKvPq-b CRqӅMaF7Yi,62ӦqW%[:>T2 YzFԧbR1X m\bRP -`s~4!)V$B9 u؞g޻>;H\E16M?fƝbRXbxf4#ʵ7{Y/]ng>mQ-{]oP.ޝ^+VT:-GZ٭FF,F\HExEx,i [dãB v'O{*zL88]kbq;1s{ktΉq,_26>e9auM^['NXV`>ֺ6CYR RQ~ݠYz+Ke׬^Ca0y Eag>:^+1vKN܆sL>=~ZセITo7)<Ĩ(?@=Ǫ~-lf' Kq&p!ؒ.k$'M%#Ν ӓ**'^)IH'KYUR0$,b5e@gY^'M>wۤ )>d$heFZ9B|]}j&j?kvm{ V?IYwffϱHARwӽ4 'n{ʸeP"p&-a\eDq`Mw1&κWRBі ,'M{|jKT$IšgL1жcLzĭ%XElI=Dz_qEzMj5bgGdDVveIUYr6$`jSL#%i9zX#wo,! T),Ҝe#XBp$GgGSY`YCGkX+j-:^b ^GlwgyEERXfW&7L`;W؀mOy?> Bv ~מ{y]ݹ *#<4kp+I#;Ť879c{-\i1DXv./ۈ;H@CO8')~-۶"MmnظxZhYKcz ;`f|ЅҎӳ~jwzDŽ"M7>hם~޾o:dl&W{,^6).a_gm76<{oƨ* ^Gkb媵["?Ե* v֠1md@Y{yiJXk6ǻgHyv˭X2vٸpb^o7qXŇYbM]y,6v&!8x2XĘӰ\P#;{ט[{z:KTza@;Sۦ]~0{eg=_;jޙ9?-X_he-ώg@AĀxy{H5h׶)"2j+xU ^Mo(eiH ,i5-DK DaU^c>wEhbhJ~{4Sr^Fv1:dk~ާ}5n{"$>XJp>v;xϻcIAU};{6oon\뛛[1 9k $<ꆭIe])_=7zp*b(E`pzBecla//ؓl iۋJYl4yțkNÞif9=mS%hax@xV,{{;+"{|{3оlB^Ɲ폺>Dz>BMw-ʌm:t 3T}XN 1ܬ@, a}e #<4Gĵ))`c1n"ɫ9S^0̪VNYOBGu8Flpq/̍ .%:D]xk0C$NoNh))0ޞsS 5Kݍ{ :ćI6uۇy־6>4&տÜ9$>3nXj F܂!fAEInY@( KM)ק40 RY'zYPJm&!rÞ1¾,e(j` ]sR4zzhWӧ \wHm{~;#_zӰ*[mzc1;MM=q~xaPkBxB@TkoV= i4jVg{vβǽLvOwbBgGNE/`*ՎOv3ki O :5GI[xiNvNO_]=ko gl^u=>"e~X&]z7^wIK"oD>>sɫ8R'iRLf܂*6HL4Wrpq)س\͙IZMu'ΈqNJ<6fŶ<2{]픁&6n{hy)Y{;nj!;BD՜@Kbb,Hzɹ{؇ݞ7>ΤBteќ. a*oa@<#^o؇6놎+ǨD7% sCYީUkJ!X-u(uk Rtތ>,XK)ܚW&I1"+ =S>ϱ?]/v]u@ď{:67Y&pv(i[Drύ}MвעMOu/yBm1hLzow쯻ϯ S[*T}~;G"\ܫ 1dK`$Z[|&b&L09R9" ɦf9X ;vt-1߷y1>oh٢޼q]|tNIH|fϭ1iGY;]:BP*RUdHq|#e;bJvޚNQ%87VŖb%eJ"XjWq#zT_N3{uķ?5~vvR;ˮeG0oTȡZkӷ*MC(C;KR;[my S7Y=l'u%ZNf=&ΒSΘv\t]Pezeج%ͱ6v3 ~=P<mU&fwiRd+4J/d$9 QjDoNm0@1gAa0u/txɦJ2R3W/we,5hO7LXΓw~);]+'{G#Yoג@)xg}О5hN V8r} ȽKcY@Rκ%(rNsfC':A[%cjtqz `)۫^3GX'FV7u^G D k_[ѻY靌?9Փ+.[8اoxzӾ|hry׵DtGۣϠIKܣބDD<}?**ܸ<6s3<%R 񸥶1d,oej) l, jZz?̳t iNJcZH#Ym޳9ˢ(%9v4m|D6#76T*x}_y7:ma{#foϴdn=f䓒s|#O#|&^iqvCͥ햪*G3s&mSUT!1YZ[R`v>IYE魳CݓxUb) ō vZP/4ӧؔa޻3t^^jgٙNlBx/l;l,o=Tx^b5t=xBYK/=iL8aݱ#Dxf f`s]Bil u&G!/n4&b'=ghPH_l߯{<,K, qffڜZfi7烯T?>~IEѭ!//~ۧ}yJ:;֫9vޟw 7Қd}W|P|P={tWo߯a_{~yFek+:Z|k{է5[8*V#9[=HIQ`vDJYw 6>Xqo{l4k:L2:p崊8w]^whnΧmec. ־|3z"InZnt-3kaXwR7IT;Y@gmN^ݎṲ̈̀fff7` q]vu]NgqK^l CHo|e|"!w~'t>$Skws勢/^ެ0b}oi=/c$$yLϑ)>=gYb8/|SФww}H.C}wb^q V|O_V>:C8u4cSU_WI5+9=ECk*YyW)hBeufJGgٿ_t yޛrŮut `Kx='UMgha7_' #bI-nwFӉUf᫧@,Bi;/w"=I6T(;ؤ+㭙6(xvnX<)-B ^h; Duy1"h)Hr(U vTLf#z]P$9nIk[(50h\eE lK k_+[k$o h2Cަfp:LlʲN}Ө*i G:tWN)`j $MIc`YV"'YAxVDH˦F fݝ4Wˉ%(K 0OW2b%[}8zc/eU*mLx@u1&p2ܪ-۹>  HL^D94"JGZ}t|mLȡxul:X@qktcg%=B?xQtb/r=J^bE~zz6\} Ү0(:-T4CORpᬯ Rف!&p >Hn4]Vgd'D N1+2zqX{8pLN=E9N! vO> @#e.ךmkHF?]"ݕ18E 3)5j5Cו6CCr#Vhk1wD^QR2&zWg&zF"FR5~Uj(osP甚1zx_x@[Ⳓ Jvv#2qv?o\ȓz&֜,2b8Q >!ж@G`o{P%!Kq<[bסhǬ$kJENBp[9^\m#n('6MEӬۄx*L-09B(vqZFξ x V82]8In7(ɊYœ>4wR5 wPh[ȖQY4FP¼:4Bzrhr}G!X*L:0Tfˎ;FЖ1#xh)?4GTVcBֽX( {핁>UIKD($lj-~ G^ć^eO]H^v@ȯ`h.4YB\L5wj6!8jzMc$0(˝wvU$Bw&QllBNП'!?y|&deCCAh<8Ԉ:M9AND/wO-;oVsDŽkMM2Y'3W<# ݸb_vϣ  I>QKrDLYv< /7"=esat7#TpPj6 .sfDb7'`M${ ^DQs7Hd$珿h@"O]GnZD=e9Rc9Cs hB{wx‰:`Ȁ9}>1yuIWH|x 3D/>x2Hy/O)Õ? ѓuO\.oH[f둘Eo5 4࣠\SwttzCdwxl^dwF3u9~#阰/BEi'>{EFq }}%JU(#^,oR,dcPQb > Qٺ0Dic.FlF-jv%ܙTXZq}(6( i?7c YbEh]2n}ʅr/n1aA-PP!i@44!ME/%!֐M`5AC( )ZE!sRhM&Ilh4-iyh )Zl#ThBM:ABNKNЦh4@Ě'9"PQHc\T@RVFКj@LACFsRGS9h4Ql'ˠhqiH:]:4 5bBrP䔭lĔ5N4!VҮ:J ))bF g C|u=};2%jt@SPHœ7:ך5fK|_HCʳᆺao=@hy]fzC$#$iGW\r#t.Bg @_M܁jX|j|hdm¢vx1Tljabm(i#*9U XG|W32C ( 1C]h -Vm 3b;Da,X< grQ) qnZHd5D/{Mc v<=whdH~$> {?]':@eս4*mÍnı7;zw峘 ʳIj^C˂ {CF-zgO/`(¾U_eQ$hC)/jayܭ=UlɤAG۶wJQTiSH#b61ћBg 'ih  @Zj\ rd֡a#8v|&ԻN"\<"= WMm~G|7?=gG!41T( U/6*$o|!HXp@xs?Y\'emacx3o3mrYܮ yB̄Oc gp%fyqR`30$B Ӻ0/[ƈ_C?XqӪx'}9C}V o8As ĄĚ[!uRaF(HRhBmݥNr6E洮q4=s)\/w`JN!Q.ei$ȇ5K陯;R[f F8B,Mc75ŭVdqV^wࢤ,18Kԋ9|2iGUP1=zw᱉{a9`1,Ŧ0Nӷ|hfL[,L=[0}ogMwۼe) ;;;AٵRlq|'ݡ= Y;I/͚o]tff 3=\xxt^(MP`JYmĬcE9Pr ٳce6҄I#ʦ͉e9ؕNRm5%ܺ'1`A Q$ڜlJKןߵ)/f~-;:I+۬?;ڶww 'ZڎsTPTGsn'o6n*kԮ/}:nMlz~yZmI Nab2,3ͱN21e] ^'+\+界 Iu:,^t;{A#m)v޼I\ncwMZz='v|cE7^wwy|w7<,k4w[N>VSXjsߏwM~zU̡m!Xl۷6J8yff3 ~j,;&WrveR(3NkiŅlVւ4.lCt﯎V5-q0uXWޏ^X|! ٚo("gYg;| SQf1mYh=q>nu>KyaҲ m'lKNmh#2&a\;K·;ğgr˻ F{YN]X>ԙН8-!]7v{qb~{{1ڸK%o{|~n+.۽@AP z[P }mH8Ya 7=xfQi`TRF*GTڝ}u$Pus̒ kYY )UX* `AhKftߣ),ǙĶCzΦ?m'$cto{|CͣK[9}n'8tD}x^\ܘ:(nRSTvkDl+q־ưEC\/gF^# %"`)ƢkĆ=^;^j-e.弆1o^`2Bk׹EG*݄u *ޏamc3xÅ@6YfJ! ^f ]xÝWxЉ`Ye<ΚQOzΟcVdcḑݍҒ,e:BQjrb4 %D4R1CAE%R-4PSAERHEU%AEP E4DCBD!ATHRI@QBC@@BRST ABIKT5CDECHQC0@P#BQJRST R%5MU HЭST4RPBQJSIAE-#M T-)E!I@- Q4- D!AJRP@4-1-P@PRU@RP414%-%-"PC@KE % R% "U+%*B (1IҤE4R4@!@R "RCB-"IH@SH4%ҥ-R4B4PR#TH H 4# 4-4PR*PS@% P4R$J4@PR4ATAJP BH!@H% SCE%BHIM#I@ HTH+M *RU D)M L@% !HД4)HPHҔ*PCB* @#@ЅMP4DP4P%CHBU*U)HR-RRJ4"J RR-+AHH€')6-`JA5]"B`]}ȕ uJGfΔ{I20:}q@YקCx-#,{͉7.3B/guuMLv::[,>mŶ}I\Iei)BXc:3:T,Rj]KѶTɐŒFmnb zoMFm5zɶ1v؁"`@@SЖR[*EByہD蚮 4fѽc;^!תT)k%ŖvoYtqSMnyai; [ܡuY޽bl̓g0c},/i(2gzqhCue*sKH+q"鶤mmQ4'F"9P!zw;J9JKU!˭nԌOK;ܤ ⁴գ {S2x:WD &7돝SiT~^%|;_Bx)T1^ bHŖsJlѤaYT!i}u"m\YrjTǣX[6 Gw'ggLڠc\i&%\`ۑX ˵wn3`>R{άvwrYw {QWZS׈PڣZwFx;RI:R-EF :glWwh'^HV}ǚq:\;m,wLv=."jˬ%צ46R%PڝgDeXNvud F3ݚi^bZIj ٠n{&ԸK]jIJ|Nv~h?S}ۨWp:]Tav܈]GmΈU{d{l$b(-Yb 65u6ieF`+`EKX c(t /] £>.1D[ҹXu,V0ӭ #0y0oiBq6zHv?>É}}:x͖^XKsQP" =C1XbNVX cC,ozJq*ՖŬBUEEZIA.ywk:]ݹw"\*5A 2ZV5 i\FbbMyp@ -,׈mMMO]=ⶵzLˍ`s/#Y6gz2wgI|@"y=Cpq͊H{wnir{=V_}guߛ tXju (v8H,񲯖JmF1dS-$`<ћ2++J1cA$m UX+DGíf8s:sc ߳=Ost2&9g^?۾? 5VwF,k~,&N,bcf%;PP? GwV9غn^jcJ3wIs҉83?_z٨!ތys1,8ql)qbw`@vǬ*vӴ9pۍ?v]hwwj&I{i0UOv-۽^m'׺hWS>, zz2zb.}_KK;faYFO_:/`v'*T* X#O]95ibn5Ikaumc;H-?mn*ճ)F5%|e"r+K/l',ow9WB[VJ<'X)}X`XNwהCm M e5f?u;SNK?ؼE-]糠>ap״;mwu*I WD`{EWr82!?΀`DTy-f))G_^r×,6ZJV͵Z!!ҧ޳$o-಑׽kGjZ +`r^64JlqK6boy5ң*Qٱ=`0WQZ:eNk (Bt4k7&k&%tݏxխp|:*$ @>V@%",$+If6}C+b`Z9ǃXldvC{]]cdeJ]6tG 2b'N;cyRv]KMf'{A@WyG^Ҕ푀`NՍ 6~ۍ4Il!DDAxT5`ŋҀy;B^aݶCbJh -+#mNL+1>ԆZ,<nmmű1\Tt]c5tO{@μ;Zu_IWK=ݦ'_ޖuݞ# /_ݩs?=GwڴLlEgvݷGP} B $)*VEF[o3sV'ORXpz fjs>& DXk)R:!-z(G{3ז7m'wCXp;|Фh @2{q#ƏG=xeӱ@ۃl0_>3;Єqs]6% }/~_<ZէШ(>@B$AU@sh BZKR1*.P bpR(.a,Mt9ggksv%:8qబbx ^ؤaJE$Éj\cB՟ouvNіvǪYDYꭷp}5]z_9'>frbAG@ EPꊌ")B*{7M\k&m%1]RAE{][G[k3{RQYua-HT׶;䤝G6$)^qG2őFxTq^]G\+7]XЅYA}3JBP~%Cセ-tq=y|Of%ܺ;"n]q?9"ࠌ*@Ƞyxz|3#=9SQQ$O݌ H+q(BYf>-8^ٜhmї<Ɓ૖#/4(R2B84@49c\b2"Vѯz(]Rk8kw*';f)3o4ݬ"R EѝϮ<+.v.U@) >Xm2dq#;erIa)KIV69%-lkd٥7 \ w{z5mlTf%w6|vWv wtoWޟg'{ (S('s#QRwRt1Օ~cܝ5 ֋K-7o.?Χ,Z~aooo5ASPU`DA0(, y O(TDL|!#F<&ܖATVw5.GSS׉I@:ÎTm%Gb*^Rw1}`)Ҍ%ׄwVmw81v5dM)/u;PȆysߺP JNv˥5%9[VwpȪ# @  =|rYeV%A#Jl6!Vݮ9-l.[YKT{-t1%u.혂9l*"|<{/rNNATBFgRLرf+$VA#*\T "[mII&˃(Ĉ$,cD ̺uĉzЅ94"tr KYaxGoc9t"IF{Ny;;igoHX(y`Zz{XݚY5eώKrxrxmW4wih^TU!U}ޛ ݵYk)K޳Fc'^,2,k3RD{\A%%"T bH I!BTRBQIJ ID)DE$*TJ(ԖPSBF B)m&C,klP&ʩ,d*@  v2e$TUT .=Wi&3UXBJJaE@4PiHА+,$0Y $€TU`l(@0h( 0 Xa@(* J( QB6"$@ LJ(R"$T@%R%EE@* %PJTPP@) H) UH` ( L!BRRJ`#DT` (@4P P0Ҩ(PLT$h ` 0`*  H`J @ YJ @ V0i-Q`cmLYelȶْeUU@N>(U*bK * Q@( 4*3@mT(JTmBJ`QJ$ҥ)2 ,ZSZ@j-liMeRkP(*?'?nE?ry&}vg`{hQ Yc=- J+-"H*tQ]*OHkmEm4n-fvr3&[88P%zDEC,;M+lu9n`XӖ3nZB͒a4BT-*R-3vh5rE,$BD\L)WCt.;^ܔzVPI>~L _frJgm N:߫:fimv_/I~{]Cm?|\rHyE9]O3Әz8liQd5'Բ|^GѵŮ3$()dw :/oRf!A](t۳QG^]/oޞ^+卯r:hDGgO{%b*ݞ{;G@pi}u=ǴT닓\e|ЧxOzb} 6s>O$iH|~߭"=/8E{"~_᜺=ȗ?6s'fw\]n}x9w2 "({y͂ٻ͹>x^?k=i7e=ϼxќTQ@>uZon~̽\dQ#{O-{{t 4|rQ}j1vr>'X E??l{׍zx JbHd4%UM9pZ(biJhs,,;+;w$uD˸Β+6MgGm:r\K*N::9>ؒ>۸#μ ),(9sk5r]NOۓ샨NNՇpIZTz 2t ߛoY!{ܷ*A?wR~HIPD 6jMf8m.\' &9,A~DqCm$ଲCfm;-9ĐpqIeZ'Am׾[]> Dam΄UY"C>^䣹;2+ Qj+e]%fep3m_ ==Q BA(x{ Ծz~o}IByc{On$mf^RAE=;@E"/(WB VE!E.q:{kߔaE<$i0yB=ţjgI߯;=ʇYɛa2ij6㯛Zv^=^W&Csݖn3᳞cyg|"|+Xg6맽\4|#? _K?/3.*2=^reM6lZ,wlG(+c q Z44Ysyʋp,.[@_?i<]=}ecl-ׯ?}Ǿu;|u;JaI-pJ=0oi]_*#ѯ؟;}?=_\y쯖"U۰\)3dT| $ϯGQyͺK;.%/Ru{#M '&B]q!&v}_%rrM%H]l!))=z;Bw>$0ծ |ȧxϞ\o79AWr(5]'y ?G2WWfF~E͢Š9~6{ȲvxJr'HSd!׋3€zxNEӳ˳r9HN')^'3d/W94Y=I3"ؠɤ<:h:(7yyEAϵGG CWxU4Ysȍt*H{IzMAhsI/2[lrK//'dU]nkQV){yWmh^Q|R%Me!n$󰢊}qzOLgXF31N70(2KHEN]wJY2/'xyEOў'gz{?^ 'N%M/|ND/d~lLs<ھ6$6`ϓ242(/xB)!b]Uǿ4^.T_~}}GN~]įH *;ޔ_e^Q0X[}^" {n{tߏ[r'[_Ѿϥ)q^+Cx׿?Gsƞ]^Y \.bH?뿫?W~|g7.v:_uy*OWcN=Ҿt?No:<;t7:9 .=uߋ;2ӛ]uP?U7+ =vnq^*Fb{Ǽw KS&yn^fYU^CP~oT߫;&W_ *8ʲ:>V'G+kz\?t>AzO]*`^Jz|9S'gDT R6l;1Bmgg!moYrpu®lقa >NnudDm`,e-=;\ BQQ +7$T*_~GDFVkEG=$,ymas8vێJب֭Z>eQGŢ\^P糞ƫ$5q^QԦ hL6.ۨJ%Ld<ޏϑlQgezdSs#9Y2&VeQzi]KYtT'rIwU)=2O͢!s4hЈA_9QA -JQ($dW_^$WguEB2/Lߐ^_Ary<'?64] LsXeD7|1$!>A?1"FIfc*sz&܎r1SiÓavLP "x]$GTauТ䝥,kW>EEyIBeѠln̻kD=ll+OVDZ6xQ͘4BEl]qU䘨x"Oa鞙$Ga>\3~~F`Tn3/׻C‹-U^Ns|xOyyyق'4ф/l';ӃBMLӨe 4B\z@q{Ǥw<-Yemf"HR{U@k_E2'-($Ty-/zaz;܊,7qfؘ mj钦 m'=^¨zyQ͍)׶6u[pZ+F"G ~}bgto^IM{~}|?^̼~g{aL%C^̉oo_|nb>_?E>t){۬1Voo+~'<*TUڷlU/ 댅^Zs{ǔ'eEC@8Wt^st͹{4EϹo=?G*~{?ޠiXHPA xͤ/c&9ohD= AWo^ ܜ7.1탁<9)\]u>;O,\; a{okw9?(OrYUKM}kem‚M(2N;6;o $N3Z)BJzV{we]Q߇y|חIOnʎ+B{AڀnbaRW賸v[d"2gu\uISE+A@SHDx%"@h)Z㚔eݝ@E~2w;uwiQ\S'GBE'QQwIT9OmE\O...8*. *", :2;ʎ(".qqqEŚFi~+::IJ-I8":ϕ޸㣣?-?u KDCT!BGGs?7Y]튐ND:͇E$aAwj/k_]'qJtwe#K^yǙdadr6j Z_,1uu"(俯WqϷeYvNQAprw[hwi _:PGD7.;:(s;#3wzDݦj+˳gmk}_ē?,$Ddh\ 6 SPDWy|ʟ&;(;dQU`5Dp6}})}mK࠾wlt$?.vfI]}~_׵:w{;:x/H( |cOU'/I_ً,U_6ʍt&Ώ} "', U=c돔fmͷH|6ke9i 3S~{{ߎg͈}ﬣ(~ ,u9Y;[I,Q}^^Yp1DZ.kX爋<ǁ DE**"}&8@:wmSeJtkW[-%wx8FF9Nl$A#&nu RF@ySPUszT(Z m6Z9k2ZM!"fJJ.&<]#ʢ骥8eem5"t(wiajIdd*^vuYqm/mH Ay)NitO ;9yE\s7slfn{gNgYRVֶݝEyo/ 89.öyeW5˲ .,: ,Mm%Ô][1*ɶج,ӳg% Ցgd]#mml^d 3b&^lK'⌎nŦGdud!3KaA"C2΃#;ٻ::^{礗C;azPyGc[@ ef7ۭ8N ;{y7ө,u_ӳ/N,~m+,f츬BٴinmY HJ u;)~efhUĵ+'QpI)L2fL.Yxmk*+,C2LT ^aINjnE^eYZ5i|S9!(%sayWk&ZS<Դz'^ L@w"hlzd_ (*^yE xƞy0GG5cSxEEӱHTI$'9e|}Q:OhUʽ[-{,rԊTEy2!  l3نzySo{ĿalQcdߞGzm:}5 }n{Qz^cAw/ yRJװ>nr{Z!G"j2PGyȢ R=r~n]dUkjFc>3)l3&Ca~.3ž[rnϋOmr$z##u&|z0j=Hy8t:(,c=yׅ9vWdǿ,cn-[vLy9g u]?A[r,$Y0"Xnt2~$?8*n&vmk=N/Ϙ՜YV^4dg|![R`{ʬWo 9m(NNoz2J8[!0atuwl®[m&̕`,X)0M~f̶kѲk^폽{ =u%V~N:XE_?F_CT SI0%Eh>9$U%f&+\n(ϕ%70C){}9;IWj4/V~J!TVykSC/V98[*fcc#fOkwGk}.2A Y#I$T>c?vOj+LZ&[fƀwJs AG蛭 +E~&Ѥ@PUF:ǥmw%p4s1Yg=]H_fiգiC{ o,7<a52m6_'d5+ty76>A |Da.},FoX°MU GT|}5`MRCSr=$XYG3Evn3 Ә)7>]dnUr0tM}*3ᵕ)]\_c&ՋSVRDZ(^ǰ# n= 9^-]ll+*yh`gq}Ruov}db=z'[adVh֘ 匦*}1KDC?Q-0ZYƲE(hȰ]F C w^FɑdVM{>Z}% ֯q}*Kf$ѲAXE[&6FV ].-GGi )IIjOc"[ji+])Z9t65UxVW=6"2Up8HF:V 9ks~*|Bu Th*lIW㥑Nb ?fw>"N>&BqTniM L"d+cJM/t)y)(={W/GL{GfghNg:hn1nEkӭi- I hoZk&j=1"FmR993~Xx\y6b^sW#=^Fɯ|1 S"ڡ. Y۬Gg=uֶ` 4njOt9d'P,ʵHbCޘK6H#V,ܪIsKS Ʀ?N]`|z4RG]rk%̃h/j^P[ Tӟ%og-? ŷ›>Y=*fS1Ѹ~ls.r'f 9p * Eh3gZΰڊ^[::?Tvݜ0yܪ4?wNc7[_VpMv;SFg&a,)p$ZFϙ~ /p=wdyQLc,5٤d@$qDfY#/l*/9D^%?QsWEףbhSr^ a$#%KDlCA(Xb0}KTVd e= ޴2q3VHoA` N<ɂų̣SJ%f!?"7J5)ː22ku4Z7 !CO5=;:W9 9J 0{M;D=]C/4źga(CS 93N2O8>x¸uƚIHIh|1'N+}.ƢԚny(\meXp O~MÝkgjZ l<^ǔW. _a̛Mk-j.qiϖe럪)0h _ ciM@(KʎsmԆiH[6XX]pn!*47[ ]Zu<={@ڹ(Rrfelpy~m[S nN=Ggog_oU̬.vn? åwɗ<R]h\ Ƚj] Ȟzg,[AiiD|xfNhkyR4lsv~%uN{hG !h-WtMމʲ_E-䝧폞iAļJp=i{ H(>M5CS iIKJډį«[0+I&R {|nL_[i˻4rs=̔Jڒ_;VD[mJo.m ?FmjF- QcBSIϑ_.g]~{~whFa(K3C~9W<\x7dƼ8H8 7(9q}֟yF߲4{Ey (] xQ z*n6A k76Sۖs',PW{a 7XWJe--xZ 5Ԩ@a%:$!#-b$2/stz,IneLg2kʫ8Y½V@_H ܧH;m+gf $rUfEѐt4^fcGGR(^L7W ʴlh:JR\ rg6>k݋| @dmZб-Mc>L zyU C;5QyHnA/e~[yY6}՞͘:Nǐt> EZҽbŎn;9V ::I;Ϲ$T6s+-{OW[9:Q"bGfL=rK1" d~w.kSOmpI26Hc}6[0eMNLW,!yBO[q񑺙Վ*$C\fѵzX L-=ƈlY>KSm,noeY9JK."k5`ka.X5S+嶮 Dn@ jxH6'3;>:Tlu/;b{NWFn/>|K- rx/R< (^D)6)JŪ",caO1/,'К , [8$n.khĝGOQ0W+ˠG6Y';S~ JsC3t+ 4fy!5ϙl?[U[ul2?^I9I'7 [wj!Yyo^%GP&w4?Q.` h-x8.Y ':79I۟&%gIwN<͠lBdd+$6BaufӆPSrV"%W$& ==0"6!aר-8K9)= >NuD%rޒײLHm`MQj1,ۻc, gyǯyOQm oESx;_՞vlB' [8n{&/[+aPq9LUٚ%g| ^јZޝ5DnU5fUfΖf/~@ZdBDo+f (p`.VSgݮbLwSF0-d)17;/ ؀+$ ha9cLuM( I]vs$M &0WG$1aRy1_\vVkVϚ"2I`rlc u윗I\vش֐Sb [$#`d$󞇇aZR}t6()͵!]L,6M4 `h+*oCCˇT:5͚rlf߉iM92m9}Ic=tW7O2OcV |%T䥪fGwGVW[qW=q*cSw'T5J 1+,2kܟ ~D%Us?6>~;0NkKМ3K␴l:I(ZA 9PU.ilE*e /t F%~XT U"vj"ݝG76U90Ndz<Ī&3Q^9ق&vuv9&vV+B?LTOLNXU s3@BL 5]Pb55pp <ņl~Ҥtfv^.-*V4j&-z"κbNsu؎8Ⱥ Nc)KۗҕR%`%]-:NDƎ6cgY|}ӟYN~5x5,bS!7Gk{iL#WݪAXꙬLG/peottVzEH/|;nSOokG >ε-T;`y">my{ {+Ww(y7xʔIшam7W,yg@8Cq.gm![E+ؾպ740`:l+-5X=̟۫Px@uf?\NMl[|ǩ)Yˉ ? ԤjvPSnFw vL'߇m%9FJh9u±j,ٻ(U_WEXwxϟS[HeX|j^'l]Oz^;>˫*VQkkmo׀zF63kj|r ۿtWօr+IoMVO٪OClٲ\{ H1a7#T9f?AfJ-?P~~RyM5H\>`c]H td`9 ,~C B} [V'7kNF^!9|U _fB#ڻWeWڞVu};zcer'53fH"B}Ӻz)-u,z=&1Fb,Ag}1(envln^^rd#T8(Ȗʼ;=}"$Jc\}T:wv:^;tq+Cc1[C;fKg ȋ`6'xe٤AM'c'u}{7},,}Ԇ6#N񘽋MRsa7ZHT!h$d]FoƔʣ#|wiݱ3GKl&"h}S+X'cf_q%AΞ/Tw0eu)%2, MDUR4,6oJ hН6YZ+2B;9^WWE`pkaFaX=~w >`X7h01uTuBvc`:j|^(I3&4.p Gn *gG^fWp#J$+]c[$˰ حܮiJ< BQS\Ưff"iz̊ 'ǖX'Z?cqU27nkpG fn0 d/(xKLpx2g4tsf@ 9_]07յ =m=L>s=&qRoðLH"q<=! 0ַX'-.#bl 1\#AVXfV[GOOAR T$}5k(%sw7?wN_r8ʃ. gsWi͜.>xφב6pkhs%D1́~,ؽ zV#!l&'|y]U{׫A=N >YLh?GYB~s4osR ^j0EUߦ_ODӁX4ŵɨ#ɛpLm;qg&f0.&\0Y`<2~xÚ~%u eN-܎icF?& LE7x@)ibFV]_}oK:5O˺Buڥ\NnAd :4kn'qEj`T͛K5 g4OwV0,cwFS{WJ'fAu)~᳾^up!4Kp61)σgTl|hU#$>}]"b:8>m4Y+J bvԔSU ,L\Eæwi'mܻݝj:w}M[mh8(U՘;(e0Znu30ۼ,]ݴw&gSsoؼ!oS򦾰o4)cDcMӡZ?Ӳ!Bi;wR`T[V~@WK}'bͷH3,dL3zHU^B] 4g)8P$׿;RRs3CO2M75S,G?M 7to*P銺+}'*s=J+k& lԼ1BOx+&menuD!`26)(rЏ:, æQޥ=cFnLg>]>.CtAқB-`Y_|ǁqc1@wkJW~"P~yeCG!jNKY}_]Xd!MAlK띷OEPxOipt!ȁ'$hxwoq=䎴Mu6w.;y:fFyTJ/}3ғ36GGeYi׭ гrWB:0b xq#;$#X1nt͛'kފQ'9#Jk&KhL3g;13~Tx^p8wV6}'_IËg_5NF3 j|p9KggVȚ#E:HU`7_2r0 J7ldbP7K+jjEqX(6| 3tqAPwG!"BӒB͌ھ7=.GIz~?1XN ul.e*9Y};Y_3f:V LFxټd,ΙGﱢ9581hcI#[s8:r͕L:U$q6AddZn.k:T{P^{'$Q%2Zcαy rȃ-~$p: Gfmfޝ4 Rr:0ؔYerǍCk]MVS_`*ͬhؽ&"XkII`ò:=EQ%;W 'f˘-uPIiѶn-bpJכ[ tJ>#IZE4K5DxL`bia7.jc.GOIs Puq#sɶgaRxVb7*…3Rcqiݬ# jh2S3V]=g:2|SF߳QhZ4^a 6Lc.+FHo ."Ϩ$d 7QݕB]4$+-7)/x%n0JDAv|? kMж{Vѿedua Վ|rtxꮭ=D]q5c nJ[%Ղb9%9/#W{+w5#6wu7 7/3CJW'[[VarzoN˶Ks.sjekJv)zɛedaߙO'Z'g^μR9PO+=\^rl⯖MCQ}_cb곏39XiV~W^gMϸIv<[/}[^/ܖԛ{{96wFyz`}Gx *TGe^u[Y^8=xEW-Z*qC΂\fm϶?~9޷ǕxN"~DZb:L?~KKr=G"E+H^1;~U۹em>.,j$T?;'o#醙 Vo:{>uK#_}̛Fxs-8m8e0u<'M7'%jFsjkԁ,Z%VZlKąv? euidkvY!CK&ŕ<^' i:EôRB3%1+Փ+$gekg5y7{`t^)fkV@fP[Fϗ튟5"ΞN :6,-f'JM9lP]V `c±:zV;pW읯;N6 *þ9GRl{x2R5\6c[SFO';}UD*tY&݃c[:*&ѓ<{Pb`:(r:՟3)?">pv~:b><,Y$.]7Md|l=E~ָv@NQǔR3 VQVɂ9k¸È5 Uc&uŬ+KҎ NNTh=}3m\'? z9WMiB.ږl웬3?z=bLn_YFtp@\fmܘ\2ꩍa5Os}2 m k, p*gFC{*u)D k;_Pu}ڔm5n:jh+a=ڤ Md1VRk,;M5WMuf%,\l7ypieYS Lͩ@|X^3_&ԛ0kp< MZ]9aCdY!j0z5d85H6]W&$^t4zsR,)j{(P/K@etk&T[jۿ(`cv߫4P1ZhIȏRp)W $^ЧCfړTZï_ ~YYt07OTJQ;Ď #g7}H sN74H$!<"b%mE[ V&>sCEpLo2FR >Hcmis^0wMo$~Ҵ7 AT=( NI*]#1ۑZ0st%Sad'rT_<-'&x+΢e rLfwn׍{)8e%yL&0k4™;%< 8h!&Xd.C]t n Qr^@-8/jn#sjY*4: h/#aN5l+eG 8Tƪ|_4xÅdflkZmFn" Empۖ(cn5_U-3yVIS.=6kt6aU0L>Ys7cʔnoER1$hTz5JYl᩶놼_(6E>qؾTlMeGRmZ%B= ͹yHskGaս8sRu3E'6 RKk_6ᴆBlHK)&VA -晗&,&,̗P Y\r ys}M%鳺g|dyu3Xl3DySwL$Ñ `͗h 8o ڕX),1-@soq &ŕ}܊c{>ہZQ\8k0oS<kخ!IaCWl0h u 쇂G7gY6S0hmɦoL]QN^VYk/F`Y2m)5wrCƪ-'J爫;ؽ/W- +ӕvlVhh`Rʙ5) /kj4$(X%9wԱ+f#ʱSq4Zw%m<55&U`ѴV,/#^$*Z.\9g9}%߬*g8y Ptrv(5%5^!wpRXw=SJ٘<0 W?7j!oCwJyL!25<[![r85<-QԱUmsz;Ҥ@YsdQ u=yU_!pI8kx͠xY^oC"f#SL 叔0pa9.Ufl^o1l0"_ M@sǥ*}6)qHŷ[4)~o\s@u4=\6cpy4r0mO.GNYz:Wzqǣ!93tsT\]_ &>۔/,/3Na S7eS>UtScsD #>:~(X6yX3~͓X<94:iόZJի]nN7D#W5 {9֓N/U%t/*n鍜iYBXFz6 Tej'/ՉƄ#AgΜf} ڍYqM岞 ԇa%z ^DIȝ@MMa ?jк,F4sZ ci~,#0i=l=Yh5K2Ai`۴?Hw9mXD뾢d"O#V+wv?3Q|[܊ |VY">WoI(e8{VRݕYMZPk89avW~==ʗF 0]'=m'8Eů3Z\;0i3!X/iErG%oGʙ)K>]nJ8Cw77JZJnHE39rfH0XfDM~Ai3el,luwϊ/ Q/eamES2{. QʾMBbssB\Pϓ Co$ j{NkVy817e0sR(s7[e|~OurާwȠK8;HmCZU~E+׍'k )B#f`p۔fD7Ty`&#zU\oQd3?V^X/Y;ȧ͝nPsʖWJkkHhq=H{g~` ̀ FqT5=5xx ^ͯ?~*lIfςTK&*YӴm͸636{ާڎizU[675W4@95p-ܭmQ}iX)8d< 5^֮6/N4\>8]ucO7ێv~ueSˆmGTh?IQ'cPl&,eJNn(Uf'XX-3>;äuk"Oӧ~͈T麷Iz4k/0Mr{Zwq5gK^OonU89FvV[x0e`$PgG+a& Sҡ /s TX|DOv{{M,r%E {;j?cWR;bNQœ<4uͣ08.`X32ykya؏ZjY7kݗ,V(h ʫ~/Q'P&R%rZ/`èшlcC)@'B̄IIr >kgfnӏ'rEA1N_Z;'cUFyZ bM`=ڛ&԰g9>,vw6{ c۴_G.Y:b"o;@;[0m U/KE8aY;_C,ʐT=̛pMTpԱ RV,]Y݅1q6‘D}gfVZ:w) Wnv/c)i~=>Wgկ>70dA^{-]wSAsgtU0cFTO\XHXUQЂu҅ m]{3`o~_H<~%jl,ǎmSk4zvR>O&n^#_o%z򟸵ʁk9ihc'ßuyT/V#1NaF]l25NG6ш^/VNZwضt3gTdח`نw?kL"ZѷгH-<<ɗ94}nu=XZ>mӳIL|CK;.Q4}K[{:<|it}Km`iݘPX, }43UI}ǂasBOHQT 㼲nN1i[vw3FVnV5z#yHaz!f9LylX㍴pH61#l&s2|ҭ,,%]jkOFZEgڵlbxyNqUl!8I1g$omRFvy>ch9R+e(P"KMQ!Gvf<$'n'3,ᐛZٔ)l^А08&j 6$LhW!:\; bN˦pPڢZ7s7[ۘ{q\H`:p57Aw7X[OY:ni4\n>S *, ęO Y;VaNu跷`%'H~u8΢uzgMjQF $=hqg\%Yr4+VVB֎%)&]P+Jī?*.Cz̗!S`DG;=5PԜKF$Ϊ͕U1 k"Nm)b7](VWx}˴gRl&h<$LeUhGC)@[B:_}#%5|IR~.0a۸|#]uOmǭC4, #/We٪}(|?57 Cˀchvt $5+WOLRl10hxhj<` Q4 I#Aw+bx#=G 4 ug͓N}4Xg~>|܏_=m,Z&ll-"[*$w?=9|7k-"4_vwVUgHDz̓mw`R͑-y]yNnU9~Ia\+!)9~h4_fiټSqk[:MΪo/c|Q0V̤Q]1D 0nzay=aby?(##`ɋ{-ԙO4 ~A*Rdx"Có[m ؒ `.*FlW<7,Bt<9Ӛ!Ge~Lʼs<[``ބ+MnsBG#lFJֱ%GA"j@JкC<)%z%ٯ:xg 'KEṉ,-4l<䭗nі)Dpz[&xZ-<. \qhfķ+Ol˒gVGN$U)'mKFV\ ){ {*9sG~ԝfTFU%fs+J^ΊqkKꯆEG2IANYe¢ ;#k|  ʂ7fI)dL Hi%6!i,?9zY бtfsɌ2dL+vWu(yÒk%R[[ŘKCT=(3? I^=&ĞҔOXߏ*|U溯nW,wѲF~"NBXk7Smj1oҬ&r|$lr2)$v A!}ޗAܼ+嬚 4dP#|cNN[BqQڽ_f9#}5@KU,ߙfԳtC}.p;̈́cƲp.TB[R<Z"q% [cRTr£}6 0OA [!$jP‰<,&]<1#(Nk[`e%^u:&>HBJXd쮔Ig]Yə1F PX#Lp9.C.o[p^hv\ĕƼъx1\G_~.|گ~7~7s[ػ٭ 3k*_ӛ{w#fѧGQ TԱ0`c{~|Y{ۨGƜ#O;_`f,-\Y(Uy2SJFy}^QH6 T~ %)6̚=G.k{o7T,eDo-u"ip\iG߫6׶Gp-uyd FUhvkRrp#Ts(:ݕ߿+A+k4ft uxvZa *!.zpZ-25a}EGr;nVnK|iRG>1#L!|U‘f+WMϘ!ELV0TY9n;^~mEypJz\#pRZ)7/z-aw];nVl ?`I.@O'#cj=)VUϠK>G ?=]!ťfgNSsnLhpenÌ@d.Rʨ\Z;/݉ĴtU9 S8PהPJl݌ha>hۧfZA NM̷haKCf^C5|BDkgO G ~nr*5|*\0W} Ҏ; ؍y pڐ)Pn䰸~޳x<0=hfܥZZ[\_7k k&##}"]}& 88+$1I2{iSbG%y>y +٨VmgBČ~ RعwOzwIE!A-|~-CxEe}:.fFZЃ5fgDkч}~9]" }d-`Q+ 5 *x͹fKk/B*;-XI4vHZs^x`d ifn|ojoEVFbf/ wCS#[QV TӢ3ZZh,ݻХ33gױCI6[S;'e[6>L52N }8i} w0/ APeq8Â]^7)s&nvl/nEoHZYќ/G D|t~G9M;P%69h~jPv2zG,n =y/SIk%j}/U|A_N:ys{՘'^QhWDOCೀ69d֮!.vp&ґ5 <qʰ4 ?;Egw"kJ7M݄ ][_Hxub(84Ym 7N}U<gf=꺑P(zjbaarl|*d;&J=C¥:[Ƞ4\̩N` ۓdY2 4 Lݎ`Ae! yh3ü5+g̓ hn"{qi17z..rֻŮGjsߏ{ 2 cӢO~𧆲}9}sQb"bfMIVED iq{:?O|ddx)uK-a֚ɘӱ%4 U{܄J.V[Ӯnu!,Be)^Hzl;,*N|s1Kc+Q\[lVf 4V113ܪ~]&p T9 -5+( oF}d\g1烾S6ިjasCǏQ\tXOpT pεdu+|Gɞ7_-{>ÓǀW074uD? (Qݱg<(jZEU"i[)H%ʵ:=N> %.)ilX+:5dɆut4ă.ī՜kd9oC_ylYf_sll/#Ѥ]#>&Gͽ&68cm2YW3- 7v)33ъIRVc#< ^K4&7&Wiwzo#y&ޖZPd ^0[%뺓{2)ogߠtk/ft;4'X7z|zP;D]]w߂y9lCSy՛U*Ĥk-5HȉP\L]Eɭ~ʶXkNm59!AGܺ>JF)#u ySϺ "곴őJO+ѥ_?7~=-^FW]ײÑPf||jC|i7wĥ !]LUR~hl#,rԭG8?,l5|n> Cb-[>`W7ӂ޷Xvf' U;U .l;e ۔Qn[z-KxŵzQ;^haM ?s;}uD,ў7ﳪԼy5 4[0O. ͓vAsyw\|t)]}-tqcSg3,s5G,L&ߣ/O,b6\C*~2:LHa9h=r¦=)[XWkH1U_vٓn2C Z."vֵqBʹ.tz5D=hT7:bw'/w YxfJ5!7>I>zxgia-}W/Lgj֋awۓ#I_B{fۑˆshZ\yY06ӭ,;'M>v{7u^$_g[WK˂n_fV}~^N2f=ls-~Gkx8uG"{plY@bIl HL`X8Yq ``Zi N NM4, V!4\7 <6`+m}7(ݩQD{{OKH Y6 Qdq'p^nh+hҎ"p˒t Z(6vŠl{;1$ǘe@9)IddJ՜;;%y a1=w4y[Ga{XއdoX%mYޮ\m0[>- NFKɀ>c#'?2tsVU'r;o(UJ!H'Po%7[}1ei,cĦ&o0dC=l:cŵBUnuĵfǫrSm=vM`ߎfyƎ yUT+!v@] ZI)?AR1)m{T-uϗ(o]o6t-| 5gO>Òr,N ]9f~^&djNͬ} ѮZ'XA 6BX2|m6<|B"t( fэ:٨$Oۋٌ/DZkZ[Ml6ID;K=m#<5c^B݆tXq6,ߒsϭtnj 6y̭G)+I攡5i@}fV`}+:&Ⱊ-*GaJϛrz]]AleEmFFh嘿8ՔD"au]ţrwJv&ul"Ɲ~5}%Mdœ:mٔ_'JHvӅOcIJXZ Nwiy 1*6Xژ;8,k"H Ca;.dN[PY\a8=̭s{gVsf|G'r<[6ޏ5:پyK$׷;bߠC#J,`빧nJZgU G,t7dUG?Fh: l0DoCJ[|6/#x,C~ :SsL*jϧ#jLMiUfO"Ow޶&VV+u g iX>97@{Ett ַ(w▭zU]w oM^i室|![B"9ofXWݹ~ӷ]yS|l"Hz:z:̻BC?ўW Y҈( F%)ON'\8z8m;\d(}~a+08G w)Hѣӭۺeyª4xG<]XIzZpOE z&AS8mRpHcbԘH sZsͨƼ9ysQrHTiI ˕RnnVrm) Hh73Rnc!5?R?4vv¤%yn-C9s)iG`ړT3 xVޜ\~ԓ"b#?Mͼ]*WV]>cOR۶S'$*$OoIf+[xN=QstOМh`壻7[3< [`me!F]7V0*}K Mrȝr޺y(JSdᩥՔ[o: cr,W!PsS-}k< G.%͊HBcz|;0x?! h, Hk /80=O\yMn3#}iO$Y;{;H'H#UtU˴vV;qo;?Y6dVS:j2۽c wz14 ƈ̆Ƹ}]ШFT>ߜֱCJFYDCޘwmcuHu6ꛧ,?u\v<\m/BN%^!Ӫ-@eJ*TwQVZXlrls;r ;g)euɽFEroQ+zﳦ;k}-F8'l=uwQj*?Il=ӴAMwbC rn$]&uqiH5wypy'Wx1'^7+ 3`Tbf;I$\ ,s]Y_/G@; UgO̧r+Vuz:ѭFBlF%&arGce|ȧC~*Vj-[7EGʨd(OۛM-`xCg#v*e:*zL6s˞|Z2OP -7JiƧ @uaͰ6kN_KP>. qrra &Q VFB$V7iVmRk^7n\Μ0=4e!&B"&`-ɴ?*XϖI|t~1+ޮ޽׻CV2kOk*+u㯡Weϗ#z=:2m֢'R >V*O~iļl#t:k~^}n5]~|ɓK}K{yy Z`GsimwwGw5>Z"Ɵ#|x]Y!2uw(%+kUK?sKC8+BE7Kw[\hIТ5d4_/jz?nm6G=gT c?^xmM.WgPw}( ]i]Y) hx~:#W$\$oEyiԅn)wDi}+R-d7 SEUηVvtj V ͈K8eQf!ٛN"4]ogi c|& 2DyhF<w4t}~d-ݙUCt,It rL~²MFA& $#ssOk5Jil 3X?Yu~,~Gk Hs.ֳuv1)F7EڂVE0!tE}bxQ=Q%֕*,B;Ms*iAR(˫`$mz[ dKؑ"^5Œ2d~=/L1Zz&GcFբ˳V2VpiNuumYN=bE|{ְ՝A Gm8Z'@̻e31Wui=Uv:fR-On0pkâ!,Nf<ՅG4W]OE *fq:7z7ܾ򩑃l{+#P\Ij۴wR?˟"!d>2Mp 2@Y2 Gt+&Y;<"*Zl3®fVэ/Z@*z\K.RϛRwa|f{̝2F5Fr}qN<FܨSK*1I&M~K–F7o!I}>ߺν2>]Oʉlᮊm=ӧjF" WxlcENΦvHFK\w(1&qd>BO!Qm3;\SxrEk],O#6rw00RYzƸ) D P9)B*uJaŭf&GOFg-(Ո"o1,Znv.ny.% İ w}YӢJL渚l ف*lUSpp<[I@YhSuF_^A Pl~MPeNeכB92Ӆ<i9a(yz`VN<8:|=N e P@B7[lqNTQj(j'"Gݣy>Ja"p v1p@+p/BX sQvNhE/Ea+K8J/5Ytc ^OάZhgzU=A)YOyuF^jNK2{֜+:ɩ ?R\ٯt?Z!UCA>3WAx!.A/O…$h郙sM^Ogr395=>ZpnuʂA!ݖO |;TgU;#pwxP]k6!{{_sZ%; yB*LLmnk3}=.d6sx{OO.Z(؃[//7?_SqftQ3O#9qy:mNEe'ڄy4:49E}837g)&SӬƠU7·^ξzis1AbGYbMVFn(5͖ZevdAms!5.V{YfmfkQåC)vmpANM]Cē"G)T l/׭7|˼d-e)sT| g=aW *:= *[=Ygg;3jMKEB]YPn 4eO};Cq ?l lxr aNr2T~V[`c痶|3IzƦ!cC,,ܥ zGI|[~mRq2AF ;3/Ll"UK<8kM2PoO`t i; 3hU+z6GĸVi=!i| nwtvDVT =vD™ZS^r{"a%G@8+ZͣKw7%uY ?7`x,_4l~Cvp[5jVij7HyQ}@T-Ne 5mOs^8m˘AyIqӒ>n`1'Zqap_w* ~RR >m_$ 8Ƞa6D5& hqb&M3;ZY@[fD21*eykWdM}^>J? [M疎mcc _qy7U*4j*ѤU}tp`@v1 Yv;z㈧:M_YGC͠Ĉp.Gt6F)n4)o#%]F@sR6FOѝ_ 0&wOǷ౰2G`w5DfT{]%uK|U>k058iڈ'Rdk($RϗM"y>g| ϓz^ܶ5a (SyQۈ[YUxy2~ESFSJ:;aS:؍{6ِs2H[z|Í}~p>xJWڧ&c ~ʋ5s,A|1t֯xo69K|9S3=|m.Vq6˚w5:_۾泼=n.۔:=H%7w wk9tsޕϚRțON[9#Krbqt0xΔiJ=%qkô],n"7k+,Ҿi[vxB"UuFYa6+U7;ab]T3EAt\JԕRl!qúλV8#@O 88s#8sll{QoS&p:'rnn) ̻d3U>؂CG9;7*~r5ǯTm_;KDRX̞I74 b]0h'v=64;wNHttO(r{Ϯ"X c떠 nn$J+q=ٜ@bF:ψ.y=/t-Xlv`0YWq]y9,P #RG6hjtvc|`jc-6]Ux< !ݍKGWT#1vOYk RJzT{KhAREfTMv. $i i:`ê=r*T,opfM[2a48[HMiAp j@q{Y^FWN.$˜˂Oz9&9sqZnwk, 6P7EGo&c~% DZ[@i{jL{IHDB 1ƭ{Ȅqfq㜌:`cDp@R\J J*]j{X^&wzv=uFP35.7 QĚnIuqkVت9ÁiqY=lړ>({E755\5Y/Ėǖa{AڋyX*yܣ f;rsZCG<6˘5t8օF޹Z t0GO{b9t7}dV*լδ1|r9rW(2u*߲\j\u `z_ϛvy=XhE Fdn5o}#R SR'w׽5mmpv)_JSJ?;P Q-s]ݾMFE#+x?cb[k :g-F8].=! YG[kwnҸcֽmg#wfWf'lGxyzqu}fkXkr᭗ZU5&qgh\K+6w~u-VnxPzY~?y3s5xS}e}#h#h3-6w9#{">/w~+=S^9͓}k$k ǭ$x a`|&Q._kϣS4B]tY7gH)ձ:r[O$79KFp+7A H^GJ9X QL;"KcWZqsY5Km M'[WU% nV^WJ]#.i#]aG:f8={Hlf锄UzylfO;ENDq |H֘- O@3Zx1p[UBYpgc~XtN)rzIH*Y=f7w} ?Ȟj=g<&CMwLǶc[к[ƕU}1W8w!}DeӌiV ^.%~ֶ$!p?N9u ( O<4.V67zt[tCQ.Ǚqlge=d]7z)He=]KmɍsލP lWL}eq|xǂr(Gf;*\9?,gִ[{!&ӫK+ɒ[ÌV×Q(c:kEmPhXR%'Et/Ce{,FN3ma_cKJ1sMq=me?|[%)F-N\?gϿ =8yu{|_MYV,BXixm:mi 1#pm1.ZQγsiv< GimutZb@E] Sat(]tst&@Yx  %0܆00Ih iqH3M1;Mt658:~Y;mb6Ț ?wzQp%?b"%tdwzfռfX52et9)-%"[}11s:N͏)x~%9Y-(D_[u>/ǡyA3&]'|_&/rIA9"oz%)m&Ab<]-{>Ikb"!꟠;jt:'r(JV&Õյ?NnV2(='V9A1s0dNc #*^R`&^ѡ!4Ii?)z਻C9,H|OڴbfؑӥrGPbzʆZ\;6MC T>fwZo fn}N[\ռڕ\Zr߹|6l1~1߰[ X֋K}U{tҨ^;NxݱAKEVg|ͫJZ!+.7GOi'~ܸErawɶxs)}DsNȔ>zyz.8Lyl`1{nT'ŏK37fiN:uvI:Cv6h~k,Oro3T*wgA>8ĮWچ=D٣) ҍq~ksKådl:Z13ND8?60RKv\A& OѮ-MP,{ÂE FnWzZHH3F[zM:'i8i'br Uh2R&f$ز7kN>sm-`TӅ*$V\aޙ>| 0T`ksOl6Jp!CӺQjN+e՘;ic( H+\EdFܐIJݶe-/<Ro'e٤$&Y'dB m,iV Udpy _Vmg+iZ :'3#TUObWUvoYL\HKq0jrs =whܠ5+<,'%꯹-݀زr6źlhdo#r,Jxעİ'ZDijrM"@*M Q6?JTrsc+b 7DO^5Q#X%TrL" nI8 vbIwh҅Ree6m]V-Td%zE[nkJ0>Hj[1ݎbΒ+BCsmڝWЙh%uK޼_0zH%4to!}9ޗߪ|!Bϳb+|c3v2hZM9XnBWl!N!kOhq· -wja+t^ &/ʢ\uhoFiF8(qF5i'^7mdAϕ~M]Vl<'P-+`czaaeA7d6KG1" l4mMS#GoEII8cXÇ[Y^(wtRCa~``G%ɭ8KyzlhiAR*tt:I;:t|ȕHrWI2 :w ]];\27Gěζ2b v/̡ o-wQAjalӥ)f{٠u @2Vh3'dI6q&tsflcce&l0P5 )1XZ˿rώpsisshu_Qf&6YsQ#/ޥBfw-9~xu˃w8o~fSkY:G]zh? s}oꐶ6y?8ͻζ2iN7+qDWZRMTxmul[bNWJe3=jUYSOћ9U>$@m5Z9ew|>{ttd'ܠ~񭇱GFuB8_@ӗ<13=3f7ey#X&.IG 32}vFҠX2qopH*r @8a*%d^|'AkLk00_$Y:CaY#i\HUې0ro,.jikzNp$lN(OԹq%3)ژdkad0p<.Y`h9G.g+OEѮ2ܘAWKEV!S@<|å]+#jr, +O57zx%:ublv"\l<;\q9KUzeLc}oPcj+g$N\t35k0Luk9:bġguV;Fjh2#WmlLinVq, ա Uب#9u`Y1(T1Ӗ7FZQc㪬vM9*r+£oL{6$'ŃSv>؝ ௔X6ڠ+NBM0g[ 2aqfhX:6d9r\ɋ)ٍ!ui o΍IJeȫT PHu9FVp7ydTou"F]6\\e7xײ["Onpd gt b= =P:ۤLpXl0|lٷ~^K5vۗ҉9啁-o}9#yfTPuPY8^PpP9ս[J>Fbہ~+/t{|Vow`mk\L{WP uMx=::)n s{ηQ72_^jn^3}^9`#QR0͒mV-z_[͹#յ9 3MWʖdg,^V}}nY04X[{㹇|~}IŝD Ib;6KQ2+ӢjSgOI sLȏ- ],D uZY^St'?<ßɸ|2+/mjV$'S˲s%# +_VnBIN֒Ml(9jDz4}sUɚm1q7aZ=wRRYlOIK1[NiVrk\33s{)H<֩B)zEp9-igf:Cy_PdM2ʥG0Co.9gpB:҂86%2$F[S]4ixz5|BJLqe"eM"ԙ'"v0ޚސݦN`T]L+úmbD?\YF}+Xsg9kޏlƂ YrTj9s5Un#xr7yfG9* 􈝍Gт6O;!}I &s+Z@eץ=IY9gq]XϷ͝oH{P^5u˙=/T`)^gHuӾzpdjYIuQvʉ0Y75|P8LC^]m79 <2vkCS~?KHU&kS3$)(FnqgfBaNؽ5B׫ ;7nm_kڒ%ܨw:ZA!5{xN ҕ:)MYA㨳yju&4p|/:j&VAMY cK5c~Ǻ+uV;L ǓXR+d#E+:i[e@d+RIхvY>3.9Xt1WHZAꮄ*Gjm r b 9vbut}am MN.N(ѕLbS)U2V-_ vPLϡu2-{-.[+>FO̝, rc ÇY[4Y lyD7N{Yw7 {[=aM+{hD3Fnoa.Ŗogmh$Y2$ʺ"B5tƬW4b^_֩겲y i۳q4$1jXj.`VFwBSTdם܂;NHsӴ͚9%vB`gmnfF;Zz_ۭI*N8Z˚#5}(5;CoD|CW&ŷycjIlr3 .a;e) oR*Rv~ҿzxn;C>S5G=ROU)NO{3@q>+\ҧմlb2b woq f8_mٷALVnknimQ)]ћ>G@u#JgrR,X$ ȩ5$IҟuPbIXh`R_~\'h}[T qߝGY&Zv_BecOM`]qq2sgujJVJub NdV]}l#a]2%b>}[Qj/F6\.Ssc+Z$W_-Z4h)9ApkCͫ5ԐN&{kuR!~3{{Y%tZI.iSYm<حJfݔJג|WNcT49b?]fxyXÕeBZqV, @=Yc7C+:bUYzev\'|qeOQæ:g1he bZoG 9 @BHݠ`k3=G=&8S|<YFqvbs&ޘt[U > ̐NRK'ofFsԦ#_O 5K͒WVps%sg)pun$XNNS \)-K7 U/c8 w'g]]Q" ~Hum9 vJ~!؆`u'Ŏ!K>ǯRF]`IK$VUS ~*KF8V&).7+G!P KSqGتYvNISw\汐:K1s#[y0%nc'-LFTAa [!f6BrU ^pnN]7TqfuNy'jK.p"&忪 :)gqAc#˶hƹW+Չa\ʰ.}%nΔFiգ'fǚIJj$: V<9Y%xEZ!9֔xzQs@ $I6vҏlbcv8)L9X&: }ismi64̿bQ>i Kep#(N^xهo`C_Wwi9f̓LF97;Z A|$[p]]4k3&cJuHJS|]쨿GV; h\%,b S/|kOXQ;TV\k꺮w!T:H1!ÇV ؾ$;#:P5Ի'@h'G؉KC(S!؁[f oH;A؃ޛSne4!AGs"y_HI;W szGH/hE\P5V_6W"o),T7HZN ftY-KzbX7A ax717v!NݗY׾Z©x%t4c7_d?#zY(cJY1K9@2ͣSV*FqW'zpKpך>TE^^Ϻv50qi?3fI۴|(XwjvY3r%lB//O|om6xG¡T_{Hf<ͶŖf6峙󛅩.8 Wsn"fی)N8 ^X_ij7|:|iuM_TH4*f-W}__>Vm]iw.%8 ڙܖgQG tǕ\6rMo}sT]|wmr="qR %m.ql,t wGvgn.VaZӡ1!aD:g| 1tw7vE nq oRŻ"O- S鋕1-S dUCOXfDbyn?d! ,»;lOHG9=>4omO쎀NBWȼ쵳,'|ꂸSW 'Xhͅyeø2\7]N_FI<zCo7 CL v4xy#d ,ʵ=)@t2s`$qd\9`(QB{v ʷmiM9 )loO4J5Ƶ{d2k2ךG=K{܈^ե1 H~w]mkֶyc^u}_J7sZ7OP#+,ӵ*Sn$A0e6kŧ[fx38\m*?ʒWͻ4ҝT>F®[& |7#%g L!%)6_U}N;lͼ%2޹z~Po7z\sNHStk<*7d5Zdưi؞TCppHyl@JOu]#.2%Emzُ#r+ rienv@TU`d(կH5lBa|xR+/g#\9;)]*`U —(Qs#"g[N Ϝ`t!Xq( fMmy-sU+ʣG VssjX8,W̯=ބ۞'җԺ"fj1|hrw:Wbոnh`Z1@UHGLx1<**Izi z. יRю{;YјQS|kV#ߍlLsoM}|,#+ Kβnx9m1;p"USsGk~zwefHsaWqu[VA͌l߬#lAtYU(˯ w𡯯~CdA;=vٓ$£ց3}ix{קGr`u'qNR=|>n}Tq]}C3glۉ_ʪ+wkK9\k ZlZ]+.`` i >.=mU?l͜MC0(dj7'J}ȹW!< *w8KF^WyBWqBC`rD>f''nӏ%UTU5 rt[ ,ne̙o5URe5qhzɴ0#iֽhTA˳6lԐBGB<^,kzث=ZG p/fEyJ>ݾuV$w`!-k6 H7g$4ogZz| f9z73fSOapW0bI@&lݷgLhҥPmbmFҫ^BWY.cCAd2XLnQ!P*u6,W. l2z6 _ f$. M9Կ$WFw:݆5;ޜ63Ե*ۡ #Kͅ]F29A_VJH='@Q77C9GH #m un9.,]\8n[kR0kk}߫4Bq5z_"(˾Pn@;Az |9یuDzڀU[Wa]lJlT¾)":-c\J=i% ++bb\fһ5$3@Kpe*]';ݍЧ*=,m3O-GD(uqԂWq*Ŵڄg5i$e4GТ7]6—QbMҼ+VTiˎum#7,I\a҄t˗|F+9['d^mVY%wO]IIB'6;J`#r6|Q_ñ!6QeO""l7gy6 cQGb7;`jҤܤU {vl'j/ȩV 2T@@qAܭ|jyG;\Iy7϶+͓0Ϯ9'ןP=JZ;f˻.QB yW_Z[>ܣ2cbZfui:(bO'ZGNqM]oR+JvsH k/QPHjLvB723elH{Ǹʢ|̎\;TJ94l-і/ok@|P} "Cdg0K&γgŽښe,ȉe XXʡ&;dG4\1[֙Qo6 N^k=E8{=PQ [U]GnBA$^SV;nxR֭R?r:?N(9gby .>.ܤ٬7(Sʏ]y9^~T\-Rv\٭-l7hөUb `I z9I%E(;L`xl@'At2՗*lFSԧTy j9R8FH늹,7xToz3xj _3OTaV*"?*crXkQR )%'Ca"7)j6F00m p&QfӌP+tg3dfbX]bf坜Ru -GCD9-v؆QAQkȵ۹wSLbJ.TPpGdYpdgQYжVa.o]1C3lY}_3hZzi8ݸ8M96GZ"k'M[#qD8MV}uJ7n^˞WjqJY2gz6 ;Ew0w#6(1 UM( ppOfgu҆;zIQW_rQ@vwHg u_ ǎF#󊍜\/Aɹ+Ӯ'qWh $ɾeǞ]mv^rF@R@V~{eK|*NГfYCʜM͹:È|Xk4 >\7:- Y〬{#ۚh)'2&$1gĚJ@|7Fc+҂Aq5]Qל=9[SHC@ͥ cu"{&huU\2TW)&lQ,;v<481.wh}Ve{egbW@Ȩ۹;w_'gŸwb'*9>cL)''Ӎ])o EcBdd2'"3IQ?yXi>G"u@/߾/,;X')2j>#3+CovnWIH#%_Yd#I'`A+؅M4W&ˌZV,1`ŔZZ2i3JÇuUez1 -mhaH\~nm e^A" ]v*#4e"J[7 6 ;VA 0 z!k:e ev®|Hz<4r&%eY__~鳝il;~kg%nr[cBroqrXkʶ*&k?\r7G[L᝙ß7D() ׬i>7GU8*wZQR'!{[z#H`=(nK}]֕Ű6^8mŮL+\6 Bf$ 3>v~4dm{kC[j5pӨYH]Ͻ?:֟i)GmQp.0ЅV/Q Y@T z1{N4Zaso]iò5figqkvGi$ھ*]X?aH,Ч% &$76pf3Ü]|6H..%? 'Zukn'KtGl57{a@p~B5W`gWҊJ@ݗ:; ЏNYZ| 㛈&4>srLW2" ,lP,Q23ЍZ>;U$9aed}*eB=(CI!wȁ%xh.,j($0.A6b AE4- Nhzbn۹7cFޓCYgiu>6 3IVU4!jQH»ܯ+-=_#-u19E+<[Bs,NvO"sOG=u# Jb0Š&갅;㷗H0!>{wX{$k6t*ugѼ'G\7pfe6MǢǙ–el]N -vbs`G  SCh圲۲߫v@iNMN~읊c%#GSS}&ώNWiĻy~UK&mfO>ˍLTv{4f"ZЗ|NV՘mi ɓKp6@r-%!hߞ}ܟYItWvZDa`s0κ~$ kYJK6e2ʮM1yuD9;koe0E+T#@He5ќƀ$;}^{e0 7D/D7[,Bo9ᒥ3<=Cu'$է{p9خ96R=gvx][@DYia+qh+nɴugTơF9Oc0vo^1Y3;\C KԨ~#@^]rjMUzXt*&%eNHX^)Z"8aP*р&"bQIɎztH~Ň= ;;wMo?GS'l=jS̚-@i>qGm(sMo&E):fI4ŲFGCt/Yԟ# 6h1X!xXWC&?8˖pO|(lO~콉.F fgBys1`rBzjͼeيT^:-zƁvqt2&BM^iyIliu?+^qwbBYN&lj*j%H+Txo.|ZRYHy/ܭX6𴯭9!k$}G[9R'un t٫}svJ_="s|qzW!ʑ:G~؇.]jA-yr\xg&vˬ}i7/9NӲ$ H`YqA$\ZF w VZeK5:s 1ʙf`ݗ+Dbe6XcSv|ϫ]ا@pS\=/rN\UVf ]e!}@0@fE0ލ9Fst\Z`w<> 6iXt bw.Gp"T7VFT?m9rґIO9g{5X~So(H>l)9r543α@&s|)Kr!*;rcoC59C6iGѥJ 5%/TNKP),G˺KH<_vcRq0J G +}tk^E&\f:)&"aL%}lY V+Vwr3hW ˭Jt6IQH3EN;!}kVEQ_Rn>VIgݾ'+8s@A¾Dpr(Qəy;Ⱥ~vti9OVq>hg{1%?Oe׻rL0FeҖtAt&S_}B~3q'SeP(;Z{ŵ[ғ ;FK'0kg1gk8ׇWVڐxoq[)2x*NEL}hy^#FMF; ß# ;ӫN-i9VgNwѷq&ۓfsZ>nqJF=OM J\Ae %EG?-m(Lnjl7Hv'eא'w^D .P%W T1{EW?Z_0>렒}9a Aw5B#n364cVA7]즨jJׯWf:d ܺ.K7_kz2|6 }I8C؋ B"i\j 9."OiHB0<]MaNe]213H2ڱauFXx6W]Nv7k}kӷ_hRg{k@dPt=뇈3GZp(2ĐlĖ˖F;A$$2N3̿Sl;X+3Ƕ*Kog(Ƽ*4 G/ǜi8/1D7` &FgnK]]=f.CIENM7¯?Z:myoWYlXcЮшpdpד{-ֶPc[nyMQX\v-G 5~&9IgU60[:2hBK$7@ܣ8_ůdnqD/e+?;:Z~j=WMtNWѠ+)$mRઍVL{IVʓuYӛ@qmV'S;S8BT"ty䗼b^Cˋ&#*L:e*ՕpSe5TZwxұ~=,gl-_AH[02¨AuwVHQ>jK{$b>.yڌ0d#<^#Mz@~73;㍬͑6sj7|Q2, 1s^Τpn[徢wr>Pק f['{MNl4޸uA ۖe]nڸKЋ['6R o{bͥD4h]B({}?PkS[lܷW'OL{<̝G%)w>UtT"'~r>zũkAw4(šlvssα9;ш:}amUu>][r:SInU}èo׳ }+Z^ۦtm+H @KZ9 A4/ɱFFLs N~N(7E YaPU_*|cq:QtN_ɹ}7uTo)xaڮl9tu֛+x66=A[m \N|<,',y媻*f|5_\w9;w:kl[vH !Zc'Td#!ͪp>o&YoBEkEhG2lc+VϝR(Œ-p,>Odnc:˲}P1@PbewAv.pTNY+ՠ"F7U騕"-9^L&(N_Y:tÞ^#R N(FŅvWa@]7}vgixV%J5wlx&,Nͮm ' (ql>瓔r7 w* %:zm;D J'0 JLKѩwC $M2 S2n秣Y:Qw3c???/RO RHZlz-0rw<ݪ]ZqS4'ul3-ŹY*WBXiS7LjЯOwD|jv/[=9ή{^q{s|997OĄ#ct,NrhGArԫ3j7|+Sq>Ex$KUm_ޛ+l̡!Iq-3}Z#U~^kN|NZZMIJf W$MLln=1@ ˚ësʕ0ZDcO!wȊVRs:yeRt{ ~d 'IHv}=[+L C1%/NۈU51=ns5֡GaJqdMl]\p@8s̑G$̪GV4%tMѥ I5f2;ݸs5-w-:IdTl\~tӄdQѪT?esdWG5`e!t;$^?ewvwڢ0=sF25X3Gv1ً0.t0/aZ*wAWXP0G7ogvR5[tyyx= nyq[}Yy2#-`2g`\ѤKl{J3OoKXggBw%S&p*=R&u.smԢ&FZL8mQ`gE["6I#CO]kn*F+(B79.PsnM5.NSrmm2:.օ~],L%,`0*m{hesR (ܽ/Rs˻+[7_!~)1wx@^_<و2/Iy3ĮBld֭]l, Pc^LJO8O4E 0ąBD2 Xrdh۶:0?ࣾ,~?-ܱǔd3lsY$b qLĐ.^o=ai28}#4n:VF`޺C!?E) &z;^S'p#&gA'm[rtV/HhP3MeZ<9)6wuVˈ5J6b66;EY{n8G˷ xq$$é/G f}(:P/[݀^? IןZҁ<; Cx+>:yFIt-SЁWvtI*V r5T ZFߟf]m8ܔCMZՈߠ3ݥSd.H;/.f;w=k弿2,GiY @"-"oxYXbͰp9#^ߴqӑjZSN] OWI Iy2}Yz`Y{r3N漷-F}tL֧GQv6Fi٪ü̍8FqR:N"v*pKX>c>`r`fHԪG*&IPt<}]_WEt&bDxRxۉ.[ΤwJS&հ,3m ]rbhz3DI} o=3#m [ C72Raw VL JL& \k`{/;$p6`xу;I3 c]6iU9X^`Ti@utlf306S:GnA 3=DM+ǰdНCNͭgyW^{$tӆwnX%NH,Nr+;""!t@cJYhϵwk+cP놣&>>ԇT? My\]%Ԣ=e6L&2i'! Z:qw峸K˲?''I_ TGc~ap4X- #\2PՏ\S'X{ꍟeuIpy?sZe}V5RG#9Ү<QB) +]cD>?Mͤ{scborﵬ޺Z.vKsbVQZYЫ*7e{/횚.ubVYf0XN ɵ1qOr;=lT^~Cpagv3w/褩ۥ+-CAuW#ó~F3?_<~\JwŖ] OT꺨?Ks-j?Im9oX3< '7ߟ~ё|wh;5C[+ٗ-{Mܴ9>UZT;&[e;:s'Z)`֟*.@Ħ]m(%ljD>V99VT)>(ߺ&nYP#֭].}Ϫ벗iܕ}rJڥͳAB~dBðNx:lNUӹ zsZr%0\b^5hVj0r̪`eI>Yr3,1}Ij&6k*Ka'v]u$8:4łփG^miqTćd\&M``RGrXe}uٷ N|g:ů˒Ek:ޙzEo݀jӷ>3mu8}5;OFM<`[ f%bؤݑqw D0p0llW*phk:HxVzp:qLJ:B,ךW2}p3Wi:5c o]hxh)Ul(4vuґ{uL2HBzJWߡį: O_1jR^ "_RkE_7C^[zR:<
%o&r*Fa1T!9T!b2n !udF_ѹ7^u 3aLymUf ,Y5 }6HϕU"ܗn;vX٩kzz:Y1`7y`(L)A$H8;n;!^49 Zf>Txɘ 6Ew&vjd dRDbK!J1rg$abǕDI!ǹ5rF1^Tحֳg -PvSϑ1"uw3z59ebzb؃Ę:C˺_߹q#ꮔLw}=Ցg _>{{"]o&toB"@7[*ˊΈ m&?@(3t&UFIb_#KZbͩMޑkl߃wQ(!Mx J%Nh3Sxifpk'oC^~'Z#zMkcqć"q 5P MAC(9>y+  2^>NZыF}sپU=~sE]~sI! irC43@g<1։` JWA &b #H'd qrƼjH' "aorF8{7dNT}`cЄ%YPM"6Z-.P sV֛!u椸*#C_NMoϣ;On* D`r A(כμ?ldSFj_j+CUv6'[냥N{ct{хWL밪۶߄+lrgpIQgtvJ.2'AjX_ZۜFYT- g 5j4{I?!+lس÷N2#KeeaCnf;{D[9 mFAÈSy6rPʑx`59PZ,] m*a{M;ѓ,{*1a8bSN\q9eZۦ_2Z BVsc'tݑ`AH&R 1MO ?;lCoȭe9ɛYzѣ~b[$[Gs`s/A_5?VלUL>&Tl+)KՕ ad0ϰر F)`1J^ָ?}RN[,x<~Zރ-+8Y7\WpM5)HLDž4"Ôճ]Q: 2Bs90qyl#m7*ORvz& Ͷof9cվ#𕆸o5j#fMoĩ-ΔLh Ae~bt.kGTI2L'rjZ0HhpZ <{?=F9-{\hM!t_oP} ݊&v,!EJifB>~}2+NYs͆ c\PK[=C VzɐևB3U~R\.~Įw] fŐi볞mX^v&|lN" {{G̺8S@a3j]eV Ymz+M ۙ9-} ]&^kyi&j@ar[R&E[*wpIvɵɩUfoxuلQ=?Ns=%dP "vJ%~_qv@?$rt r ;q2GIߨ/)3 &><ǦZ pfqVkmfb4FQe>_}m? !N*=ZS{yGYmb 9s7,pMHqk'w?O109Jc-Rb,96ħ0[mOm$R%<̊E ԝucӂE3;-;N = K7k&o|ceg̓'Vl/a-D4H~g6ֺ[zu܄ZRPŸĚ C4TsFQ'a`ɐ_(Xpezpaj.~EMI3g:$~^- __z7/tMM94&קXKBC9b,3\M}JA/=Ù9yLs;<%c\Wxn= A=btΜ,3Ejtmc#;]˝vxI')'o^pFn쥴B(Ch)!H\6D2Ӊ]\P n%&6St3]n^}62l~vu#V9pE4mW+`g)޲ȅ~1yϖvVfmRcU PR0KT8@fVQnT.t!32mh\/~#]KvLw>VMk_x޷߆c(k|XV y)b<Ѧ/ ئOݭfkُ%vMgy.Fv#O]JƀvS$:\ݘ^_ˌ=G@9Pl49Q7JImw:'i׷Ӕݚb\f:]xPF#e:oR2`eGI.mGIQ%>}R~]扷{+aY?1 cജP:96qF~S~S!(%r]ި5d*r%kLsY lړz2P(edbemvFf9^7]Uh%I4z^fv hIw5:.lIk">%ā3]i$ʠ (PjE&qD%kz__\sthY[X$5kJg/~Uׄd8`ҽ5T]gX@[Wk?:ߠKc.M D{}Doܛ#.:| ,_)-azB8GiZ0]fFoȠWv8pj&`҂Fqi@3 խ- /Sꁯdg>Q6i&^^shFl2P$cǓX- u?=c(q|~v~kn8kvkx@>s!4Ði}m#Sv7m*9mTx$K+1h0AXe`eӜ~H1roTL>MJ+I׼X>Z{M#͖M̽{PнR'~6idrhzUZnQG5Q dj#, %HS*?=Zw5wڏ,K2*y{ֳlɒ2mDDSٴ()9&IC.#/!x{/%HUgqqK?|o6"|rsXRա`\lϲ6ɜBa֔Οݷfoď3y民Xg -tQh:vieݓf߁ڿϫ؍'f ]L~Zk;Cdц8rQ,""G>Ub|qmK[/2ۨ!8guN?ԫ{V@h^^L}|diEtY_!?(__?;}[ШfE|'%D+ ~vq1Z )*jߞ9x}SeB`BtRbh589!xu~llVS;:IJM+P=5v,+ق'qk& P0'~M&;Y~{ُ7)F>h'LQy#͢< ʚCC:5s &eԱ>/5HNr|Cg/fy<+݂>/ v٠EoYl9Y>$orMxLdʿ=Һ wkn˩kk-vF1Qd0^B0/YL0,_S RN.v[1޹Q)ai}"SuWץ*xU[U,9[euinP|6|c * !"Q2 yR THGdY"*&$|ӗ8$Ϛ<kp$5&+ (.5D$]r;Ji>?pбƷs&B0w-LWnԤ?-:A^8%'K#&HJ8؊Qar8ʘbF#H!Ö[@0q3$ͯ{-s(ITԲ. 1DN=]:ɗ}lgٮhA ,ʈ JhFb NPF  d'j$aSaNNl Obv"x7d 򀸭j$)F8w>JS}$k:scl!B$#4$w͐V2Sr3XGc%P=r%zʰB aw*[g>~SWÈ08Ϛ `Ӊ (*)q 4N |O٠s/b0tp `o)v%M ]ΘdJ?[w )0"yyp5~ g1*@+ &rA,h< 0^Z{œ;ٴ> 3D8}IW Qb -@:cY%a a(N#04x%Qspʈ, ҚY9[ ka&"󳳮S`: #t2č߻A(l=iG=~]V~8nGٳק>T~VLcM487t^0I3ߦ7ճa% IxIAUDgp!jn7ׁi5 0` z2v@RQ<#! #IqqPHӲƼg't\rG$TQ<3D{.Ȟ3͈d`4 Y-s5*BgpXwN\|3y~(*M6v@l)j6C 9& dFOgK ՍW;i!a1^s@HE^c}^!ClĤ31upmw¬зǮڑA9СUjSN[]`rt`1!OB 2'۞\cA5F|}VMh&s]qnAƞK)ϭ]*wg{9rS9g.(!oB0[G cClbɉ DVcI%oڝa =r !Hnw P*Ss0DlB :$quqH *zDewpAy<ܷ޹o[0T(~3ܷͣ[{W^oloz}__Ɯ'koRqϼ|}no~/Ѡ qUW* ?OAӗ$4ku\wtEE|ˢ*+,]g*: ,ίfByU땓L9$2(V vE1e JZBͶۜ׀¤"|2RIh1 6jHE~'{n]q]`gGvyx;oAI^qwRGtK'yi6s97 mLKyJ (ydk#Q|WYy ?_*m[o9+~ߧ\(?=_{m L[W$+k_o1z0iҦ{^t_ޡq~>^(TNU 5(4FzOoFN3Х_yʥ8X Ȫ$ɹ !Y$8^{FYUQOlGY4D?ܗDyE5w ǩ3MQCm0{TkMO)=J%/IWĨ볲\?= ɒe{o329*R_#݇]5.TB[i"evf-uh?WBO(H5=<8D}lRSr fJ&d]7R>po;?0+=SW_/#=>RdE QZovQ>Awed_޹E1ޫQy1o^NDFTb`d?^R'(XgQW'{lmdjagyzs1VFV4U 1򴕱{'k1Y˸Ӭyu\7/as9vDEP|ϙ݂ #8Tn@2ۮ*"(GQrvȓ?qPS|նvuye.u~-9 N]|mHC-Ӣ㣈t9l(9w'Yvfi48 (˲VwYQuMk%~;㎤.rBO]ˎP V e[4&ؿ=wi NJI/׼F:;strǔ%C7:$SG^SnX)&+;=~_x﬘Ċ(CMc^t]qXf۵Yh?{} $L}jbs=wEE ܯ*zȨ iW̋)$ Ȓy!ԴT~c %'KnckkD?6yvN1Dv ^!%O]چ{JpR*'mfmf߿PSrTGDCDKSA*Uz32~z\EE)~pbPԵ-##TWǷ*t3.a綇8?Ok>B5.C;R=Oh UQdEi/ =J'mL=C<!7.WϮRI/ohJQF )3s>.Jȹldv&r7I\3@ޤhP&-+E&x_/@+-%zyR"_iZF˜Ù"E}Ύ{/l>>وy|6=_ͧnZ}7 o/?noy$s/O,|}'{݋.\ t n幝}o󪊖1NdloDE !'3o2>D Nf(hr7l6=/\oG3uaVVvyIY.G_d%{dtBH}(W'ws*=FMNwѫaM=ԹI98]VQ:->Op:п_I^Aux\C2 l'؂Q6E=A>/̜(^Ov$ugd5<W ;];mDDDeVddP^ /t 3)1amB|ʋʽP+O׆y4Z>?-C!?eǼ%ۆf/Q`Y5"b]U\o GǮb{ם6ޙN2e~O~|Yγe䈈~gz}]XUb'}7ǒ{|o"{/|;w}W=weљaϞA/iw}PFsz玺. {ʮfy\#˾w,`*kz9Õco^}_<=yy?׷z9^<2JK7: [g"!eweYZmW@H~,PXۭf+9v;vZbn+G&m$ //{GTB D E 2یΤy^G\_nnYeۯ%9U{ۯl+S,7/VT$=sl!C۽y Y>5_8kR'_vox{9"yӁMyT(C4ܘ3Pa2lf7cIE{ywxfYu5^"FYѵKooo7};>JI}wM゚_,5)AO[Nj̟͆J.|o #xxsYw9zX/=W˨nߧxw_m_xn&?=ѹݧ6y9=(Fg̊弹#3vro{v :o\"TE**}q-MQEzyn\]53KyrScc #9.(fwg_'OF~{*+U'n=7w'+B56Hr_AHR$ꢇje\|ptxL#09 ^ kx[UyسD٠e2(wnW]|Mm6*8ݗ=e9d5GL%gUZvʞO#>_5i2{;G~?__xE屯gFB/}~/]_޳v0 ['?mu]w.T?U?3@eB&s%x6LۦQd\(𬟴g._{K'Ҳ9썕?oGZ<~ܞ!f{~c}&7tM4P_.Kg׼]s9 HKyᆒWgw}勵w}l{׍ sCzE0Oϳ>8#:==`> `, `Fa=mGV]9gBvRZcW6^,1 F̓WDo_oL\}FeobZp-{ߦO1=_ҁXGl߅սw p"󁗐2pН{DMH]$궨lFW@\J!MSq?H!}e#%]*GޤL~GJ#*ng<ϵU/`$p 7G o[`O\J]5%Y(oD0arQJnuu?/oLGa줦_^_s>Që*0wRqRMAHcQ 4 Y~ _|"%i{1<~n8 "?|cN9H qbGXNI"cBA /i4 (EQd`'Ppĩ[sӷA lwüK"ؚsx_r9C)x` (1AsЏmZ]*3 -$@QQ2r,/4y.6[" z= ~`;◰JT=n/ud~?qeB9~f3g}N-2{KrAlրU^;_ d&0~"OH˄(cOg(mQ~=@_i |?_W֣D5+w5__>CG"x7p2$#8؆HC)1&O?E?g‡r|ꁃ8'\D!tY,dMu-C&/}oSz{r\=:l L/\e=4 ($($h(BmGA =g4|ږZQ"Q. ,C8&\[?rͿ@uXg:٢v"I~rȖх12BinOU(ovhOXC8,wjuyC4\c_ e89J)}y#7-^ZM7/ b ,L\p!Sβ)Ȕ"!}{=tה1>v /j?A) •rF~wߚWos!#'ˡBCN_@PBL x98La23| &9%IE;uQRleDN9 j*ɠP l^KF5Szu+óÃ@P ʊd"(f HM9%PU`$Tk`-:r+2ZU`p&+f{{dcl[/AD &v2HKgDIR:]R} +ȦF  O{| {NB~G|Bf0>1L(G,4٪Vxm)U2(`/ZxqsC'!!>$Ȑ\h h21x6 ݵT}3rٍb$1qŚ 0MO HmMiN~9:?Qbegc>|lbl 0*kUbD)`uB[qHی[k1㈧?ww!,q3N3^8$ ڸEYbƪ4ZHQq{Uā($ v79Bs7B<-&tT'B,=( !>(QMA&$H-e<+As?FΑ\ý~M }tEpݽʔI@EE,~u^6ވAkӈ |M GL>BYH'!Ed!QϯP9yj}ymc}ƒF8nR|!6MMTWKyTHktVOAMD3L P<6`+a]S'02(s BSGO7# /,p-ӣxD3\!gt tM0dž1 q0sxF<% nc s9ۇcDOYS^$ª{w;ɠDoz^%B B63# Ҟ!@2yQ i#ȋ$X"Y h%sa2YG !YEtD1\|~gһʿjb'74O ">5h*%POk|)?* -NmN5AN̐CÖ]{1P5e<]`DqOM±DdL3PPg-{vp(RIT @a8roog=iK[|xsxE 01j+5W ل :ݰL<L΁Nk1))LgӬ"\HG= jj}P<,=RM)@t^d†D4ޜ#DLvD&psG#j  xz7Aխ|ǧRTU~cez}sGf}{g~e@<_7`ۥz75:^s@/kcIn;r;i^X9G"w~dxPC<0~ ݫ}ߘ$pH-TlGP-#S?IS_W &_6ů n^4OΏ2*;Uo/1!F$5⚚[I wٵD1Q  aPm9J(5P=3f0Ɉ2N`|p |=-Cv.z|7Z<ՏvG,*W*ΐ g  #Znɋ>)`ْa G(a׽O{]:';,1WؑO?cX}{aqvSݼX CSOqJ-#bwfMД,BXESQ sK@AG "ިVQ0J?-j9srB[Sۚ'DXb;@qTuhER袾?!V?pT^!w_– 밙'նdEXπV UeAXdPs 6vB&'|!jGDcW̵y ƧB?ug0:c4=Ly}ط%ǿ#CPr" OH9sc3?k}(GO$R-Wç]ǕY{>]>1{Vκ:PQi7zVo-s+au3':,Z>9u랎^9wJT~X j ;mvYvMdQT1hVam`&[l۬:&`m/gnG=7"'m%Yqy*YdP:@mJ;le lڊC+TIKk9EMնFlg&Q5(BG;.PNEl99<{h󳜡;C&9Evq6HrJme9%9F`Gc2mpiγ, tBfj)c)Fb,õ~QODcZvQ6iniܠq#η*L3Yg3rmn֒"Oڄ*9AG{Kh!IE\Ire/`.x,/t4VdRi"JFN~{u]HIexvfE [lmvtYœ VvHl{yW(3 bfVT:^Svk&igeve4*>a_۴>2ODU3i|A|kX;0+ {}ܞ)3 bdɦ?aL^"Qay莏o@??lXD޹]y4c8$?|o||-h7{vK\Ș{䪁J J+d&əz 2r~=cR)N[P dAĶ]y&@R9!y Ӭ*.L)l'>R-/*;?'W]eISn:. 4L4s04 Z)(2ND2u!IBtrq__"CC9SB2s,*p'tq'~; 踸$)$ȋTr'rt\]kct]q ybJ Lfj/4࿍q%q'Q895QKS&fdcN"(vptL%G6(H됣0_7i^E܈$Dm.;~’)v"::/ttG)YvDqwYt tu$}=\PpD 'WZn:+CwgHQ-+.9ar׼(̞gGGq܇9w8qО~;չrk>kCߗ~xR]wMk-IS*]]8Ihd43,~Qy޾|ΏaE]nRJY߬{W #L'E4=:G,ڢr23UUQ~آ}?Yg*569;WW}?b4+y?>7}xh;z79t]n ?3z' ,fc +B]~iʘo?7;G{J}~np?~{8kۗ T縞pnlEz^<>]{on}{ 0 "?h$'l /){~92c .F}~]󻮼o]uAU_f8Ye$ZZ G1ON"2$Ce3NK@5GXԽw9ÈRIȓڶϖBiXNDdGie5[nY-;v f3yFifJyb98orr Kj8IzZFڵYbf ={ݵ,Q3>w(mرKnk'ⳗt({hwL)S\E<\OB"(!{liټ#"6˳m'NrGJt%1L7''&maem9M YIiƉ6;SN*җTBxGE{nڬkyJC)0+u޽e e!mƝYj{ޞ鞞U{l-P#gFM:R84++oLH'BJ1 "]$O( 2*Ozy;ͣm$wE|JM^ ft>_IIir{l/([l(L CȂbȉ۔snka@LNxng)?r^+{2tbzERGAY܈i~o̩)C#[YÞƮYfb⣉:*y쐣…Jd)}d/"Fڙ0grR_~Ye fs5dn= E1KŹۺIb;2NbYVuc/0-ݟxzEXd*a<㲡=C(< eO>vn[^˜m_wĊβzMLY{ϜN3H}Kn%RSh =a(y?~&Ŷwϟ}c;m2E @ H!H%(PUBPDД(-%TPJBIIB4Q(,@RR H(U)TBRШ-- %% !Pд4% )@PE#HP  -MPP4Ҕ@P- P-R""HPQ?<eH}d-?V)~ ى]`rlXA+J N;mZ;."+QvYEٻyvTQtuYqGqזIwQRy[Q5JN'OG( V$N:Yv݊ऱgt,zEqsDw'_n;YB'VF/0g|'MEJf!weI^iuH3-vwg$eNGI9e5TJ'߈$:}:wbFYpVݛ*/(_v/ˆ9r 8v5Yi#9d:+,[w`t6Sp")bh~3IDxTyy^=UD|G~tt {b98ᖗ-,c=Behe-dt%Y:.οAQu><宝ffƳm9BO:?[vG߽6W\rwκ뾮xy~b ^]\^%sC,m| 7i+h[b..GG9˗9Zr6띶Ga*ǘ-]sNng2:޹:>+ )<9zYG=.[7ly^?##;Q JNZnkJI6k;}?/&'}/'}'%/8j)V}>z"4찀Zug_u$Iܟ8찊N҂dpY٧۽dXTX ^qa]zdy|t4G__|_ ~1SH, Kb;VwBwo~ӳxhۇ 'o?<8W]?>x֙#ݑSuMgWDw7w減t2*KNJt[;ddNHݞξ|||on^^a< ϵ_@g=$)G'66٠"g>^Cr t~sgI W ْg=;O }+>CoJm#J&{c34J(!/^Ve'2>gb@eKQo:$]+ܢEj{H/#UaoV s?M&U+}OO]z0|5*i=N˫:.uS}em›טo#grc?|o9np̲er= 怪~￶Wބ%~}>ìK"Gݽ/y9fq߆s68[x*~uE|o⫑˿w?_^~:8fE.~\3i|sʹηE +BZ|ɠ Hhˊ㎊8]]emȊg:./;⃠{i"]e'%D~9W˳#b=~oQEAyYG4EpCf{!x@J&.t!!rpEI S9?2""y"8K9Ȥ"r=4N)"β\gbBPtt_+J 謌[cn~ y Z"dQZI'9lJShqItq𴙹3JwB/:*GNjae.x"mSYaϜO׽''oG?}y\z* ֆ?v&on}m9X 3•/uu0/\AuW_½Dx>F2K*j+@Qf{~g>|K/ {}~}~Uw䠣蠇4ϤnrϓNtѠ/54\?NuVa\ /{zx|xᆲ"?Q<}sٸV,o^؟lϼ?gݏ~s~:/V}9_yMNsEO{J(e27bnqT_o2.;wߤ҂{  rXGCCr!|/(dP<Ηn^Vuy;7hEJh.Wx4T@lr:ԈWEGx՞5w"JyYØlO# !r2{͒K x ǎª(kg\6:$ tQLԾo#:'BrTsW{y'd:Q섓^xVugV]ehY^!~>Y("hL]<[0w87a6mEg|qGi_?:;4=ainG:.O7Cv_b2ç JV]WVR44@b(; M"$) 5ؽ)J_v{ˏWSHO UWy~iiC`h<(x+D񋙙gۆe]m?}hy?c/^ؗ-m>/.?Z^Y(?ߦ*SҜ oDxۃI*tgtyoCϛA{w<Ȫ 'giAw1wcUT_?^qw9ǔ|חӭ_}}'yO{Wo\T@ߏզ}rvEFOXHTpgW>ǃ9[.A~AПܯ-?ߟx?_+O}~]˝aVק+Jן# d3=}~i <(BpQle$qs\W'[vB2ˢ94%Ъ𞋕мg8J_ΨO'HrD%'<鉱:4q}AוiӳϿw5VDgqIG;m[d^.4xУʨ>WDB:^}ӣӿ[%n mNef'N5RPNRk)xr &wjItq>vy;1χ^zb'*,%ywD3vV797{P 0BR4Q q!WGBy!N@yi3K-mV^v}ӝ8'%$>cs4޷}Gr/-"u>)32LUʹͽs+BnGVK#6G+!$ CHLoN:ydͰCK]G2)/Do5g3zc"1BM@mNIh^_{M!slY[?^}?Ԍ=r J/n8wϏ_o3{vU^V\]6yB)blBJ8Ar M)ÞD"C=uǒMn< 4^a2r϶}BsbTF^tФ#u'%g*~{GMG~7 Yz]KI=?~?hyPCUoA~ng].MɺҊR(GBc՜eWk؜2}cNWߝ=!^q:!'~aA{B?z9LǶ2{9}c>>c3}}W'=JA&!{~U^~RDC[_ RM:.={=_.]k]n濟Wf{,+`~ʣjѽz-nv?)6Ky|}H'"=şƿoNoo{ս^{q{_3~ =*xC |wp+u;a=eS>]>oύ<~~?=;^×[c:΋|y( PY TV1?s ;OfeMi=T9̺:;;9̹><C]g #~Z*"+oݘ@yNF0OL84K:βݶK.ڊ.6Dۀe`41'7)s'޴9-)IJW%|'e}bYgGq-Q'RRB]s:! _d1G%*ZZ"Sl30hB&sT*Jb 4\]G_*( $UwGGEpqqBVYV:N-3i)ibJVbYíSaIEJOҀ&(YEmEQAyZrQݜYtqHFVi"EtTVʿQw~".(XPwMJtlGM8QyQחY{h;%9߳:X\]%N۰">wo_׬누8#YYe~3ˈ;..*[ְCpEMn8v]G=|ȗ^/ald+F{t]fGG36rM(zzy>O&n'(XMs2ѧ.97"wѡJkI!)9(tefu>y0#"QFEARP!A%P>pn۶.Vr2x_~}V#T%?=I}|{~69/ҏ}ة Ӣ+'gɻnfأQ(!&EYTQeSoYaκι T `B C~nO53Y_s}}/Z ~{~koQg =n>e<>TWUˈO3W7kF~{w:ǮpU,~RIGŘE\'Kl rܜ6I{֨mo/Kti8 snȒ嵭# 6-rtv%ȶڰ q(ĕޓD;8㼳-$unα68Ycɠ!!GYFe)6bpQg[X8[vn8ڛYz+lIq ԋMMOėQA$^o-mL-v n;VQ;))H21 ?=** ۶G ;'ٲƴ6ZVmm;i{,{ bdV-[ݹqs` וiR2:KmjUE窾mE3Я̣mja9jSvL܈n;Twf3i[+/P/ sBp 2t=b/N+2M'kGY`(P(KP/+Rv:r8 "2m[qnk[M-۲:m6dEfSbkS󬈬ę+ .nM~z儜͇j IobDs3a^g"(/g6zeJwY#nD7'6ė1"TOJǬ^yO8iDh&@QfQfJFK- I35&{^ioka 8Yve y0fIZȌh\?qM(m1id_Cܕs#qhf#, QP_?_ ߌD\%r\eݟqL?~z{3幦^Ҋ( + k@$_ ( fer *9d%"Rw-|~0zrJ % )(((XknjdNdV]])"@(󢼳twE'qo߳ ⋢J:#݆txR1KI@r2i]q)Ĕ?ꤾVtRQ z6^Y ѰnDKVIƆߋ8T c;7y (WG)qA򳋶ՙuw\twI9qwGWEg&Uo|3(s_/F~|#*CU6i}]%dD4nc%$RQHwHEAu׽a5'EII8fݺr:[Dtmg"pN.ӊmVGwYn:NC3DmAA\Pvqt6ۑtۻ(b^ZtHY'uAiN#8JjI/_GI._#b| R([I{i8ytY9NN6;mo%B󽵛F). ' \CtPFEIn[4)~&B~Vz)Vsw %_EL7"^}{֓gZ|mZb|88䤻+vD$uW ýں#$o=SDAI@XPW!>l{,|p|qœ߇.xe(o^nئٷ`Oz>|o{gғ~׽{̮OHE@`S@I T Ƚq`??gtW;{?~'~on}swC\*(=*(H*ߨ{?^j6Ϗ[wBb{}o vpV$\#OOo*{K~}[}}gsssz׬DU@VPa O:pP8䐄9 IhDؗ,Џm hX!YrlTV qlFaͺ(RDAX dyx(G :hbFփGmi.f" d޼RdW.UhZTo螘)=Yee\Md%!S >D}gYfsёYqUcd֌eCDBTg&W2eȯ*޼B|9źO|$ˋfqx[ wmѵ=ϙ<3`h(Msmȴ蜅߶D\>#8pph! {Iݨ}w^{pJ=F~6}_!.faNU:xO ǐ4\+}Q}^sT|ԂSDxdCz1DD@aa}޲aDYnO|Ӗ}^Z?_;&׽ߓuQ$@$$A_gMw '7|{iyl0O^쵿?>=뜷\7 u<9APFP>#l7t2>Ns6}>G>H(Xe$Orz1)zX=y!g8fmsqc;߯-ױz_T4z<(Ce5 :5$@l B gDaT! E%U*JTJUh20(*&mJҪ1 (@P!KXT=XJmEBZeQ e&f*3%fldmi341&iKV3i$dVVVm-Y-4VU[2SXVlalֵUYZS-mUlS4,F٬2֛[M5le Ujmki, RM"Z1T---,Lj+VڶiVTЛmY-l+Q-m -l I4ѱljS 6Y#VMmjʴmB6ʙ*2cUk`,Hce1KK` 5lS0l P$s%RMhU6 L3 TP mV%y)) *(jhļ@, 4S%)D4ڨ lb@Y4l2 % ME" у(XP*"S4T O &%USCL2 d4hɡUO UPh4SJI*hhSF ~ JJM) 4Td50F hѦMЙxUO(B h*2$.m6D=..;ˍ([uGck N9(CkwYgZ'IYeݜ,3,p-:̻ⲲJ[h]ז"Q ]q"gmaCJanI3VZJJ& 8M:CmnӢmgg%$љ-#jN'HmNqNI@v] Nywlaݗmd,mYlܳvL T#h.G- yiOimyNn7)*r8Z†{v25"6i7M`Imfq!vZ3D$k[$jt=hdkEZb1ɘMRNHAGk"xa]u}>cS1٪Q1 (&.(z'X*}TQ?DlULkG4S3ݺCl:";лíty\u-.(䭲SAq)N. #=MI% A'DKKo{ lH^{32>ūmW?|@QIYhffy.{EUD?@KQ:̸::BN,9’8<ЦpQeGGpHZڵY"8wm݅m8۲88q"{\ {ǘrsA'D{vP8+N +7"$Lی{M(|3eaG>Ҋ3鱈Iz[{ykfδ=:9v}$>s4O Xmڣ#uLz:{:hvR*{S>x޼+'5G'½I7^=zɼ];xa}UGɐ!Uը3W?vϜnmϋ|S`D`Gz@=)kJhj'C.:mU]~YGtGtWqQ\ugfR-: RIJFh!&0㋎"+#:)(() ",싊8).+N)-GqttnuIJSӠѩ)KtqtI]viٗDrSK=K;!=Aq ptT}Ҵ.(NB2˄ݝlYnrJR9K4r˳mvu l.YQv)X ĉ5/ki_dv8R9T7P&@^N8d"t฻ED~别cM"NG(tj8ql`'6 lemN;nѵr$A"vY8t#,C;3[MH,#rpl첄;LYmdgl)k[\Ȏ.$S&dE&NdFFY@!kI%u,s2:3tY6#q6rl֎N8k*;sMh8ڎmgkbIy*sItJj{Q$=Jgܽ8Y9gug5MCD Iݓ֎,›Qvm6:33mKhjnn]\KrL *m@;mfG]֢ĨҎ+)AuM\U+R ʬڋl-fuѡ\f۵tQ$W$&wAǙu!Н"t6ӧ+mȊ;J3H{f"fD3euE'=5!($WKk\հO3(Wmn̪F糓k9:ݸKk օ8I}A 9i<=/7hYnH8hL?~xWeLfvLA֗{d E%~y}?}>];{>+~_gz{y UApHA%vyc:=hUB?ы{ӭx9N)y#@쳼5ܡBJgQZI bbC?&'pձfEGxLZn_W!+,;nc#ߌJ#]fd#i vi"es,e'eh3A[>=kKs=&Y|p38 @$L-vʪZ2WmOR C̳ ̎TD ps6m~ iiaNDGEy4n .YKu^qeK_+&Hu8='BO'Ӆf4 POCbyJ!Ŧ6,½zU_K@D(bݶ]CS|}HH}O}Bz%jXQΎV#E͸MAJD,?Ԋr/8(ȿv9}d㓷)9*@J { (s,n[0ąH'fheUR ͓mdTw#݉iE-)( %{e!|^iDXsKIsU^4/] ;I䐐2=Ztzf(Jx_ͣ]@ِT!{1#*`ύ.e7dx2-f hs~ZrA/מv̆ANFPP_ЇmGMǸf]V=Ʋ,qڙCX;;*Ww(Tfcx<| ט#oV>Yc(P>bwnV Ҡ`ΟyMN2}gZauYVUH i8 ?ܽa]YR5JHa5^4Λ,]E1{OCą$ЧQuaTjӚ`rC [Y>~W{_Km@=ΙZhw0%o2Gkح~k]p`iƻ͚XvJ fخէxaʟ<|/W |z}%=m/7LM2M+'snZ2\I`GAIj=sKޑV? ˨e'dG$1J}jM m.(}f31c* Hv_d?O(7կ=33@ȒՂ~ E612| %, Qvv+Mfљ/q0x7iId$4i@+ XW:hxy. ߡ}YăP ~{ʛ1)?yp !}e2zTMy-R[_FMs[Ľ7ZsM&.O/9nz t=&; i: R5]6SGFbwTm BSq7^ %0Y,9jQ׮hE ܍~&S3ygUE /4ً;8MNߢ˵  T.m6_{Tsi fŌ] *G+b=Eيb P~VSjhvYj( hQ^Kڿ4՗1x\[iwGÊcAr}\l稬e6u$j+Wpsa5cSC46QYq_U{AaDCt٬4w䒣9o5<-z(_g4}s?;,#7ndUOzגCᄆa}4> \owj8U& 9ϲ DX^45҈QcD9ָes.$Il_nEq5GA "j[h+BP؃TGt(px_L$ߨsZ#h_skhGyt]W|WK&YbZ զ\ ) -[нEƉy}b(36΋\GZ*FJчJ|̽(i;xVp_/uhcOIo-cMoqXFnW OS|wv mX"CD{DCnޝ#A햖 ±w7/%8;:DUkXr]oi,V`$x<]MD'4Q>vF@=wgyԼ|ᰛ[𓆄V,6סInV2u:C K{\OX)j>KASeÇ[%h<`~8#LsBUt3$7FzKK>ZSo8;K\Z rCV튙'2*I;wiT6IwLq= Im<f687I Xtf3*d7P,]Lzkf8FUUJzVQyrt{V(\܄R?9CފiH3 v"R"mA2vXǖ\WSnma3a]`m uQa/{Dט\nscy42kq|U&s^4J +my|$+M鸟-6(ž+tO8gQV# e&9CtQyUV-sj%Ck_=nFfXpSV5F]Q1\;*(\׿>8óoقsLkEΐU0GExB/?:Xni᳌VB8өjmtN8d:v VnQm#.[(zI5H1c4r۸S:0fsY UΒ\[ȃ`G0>b )=Xh 4}J}>xEŁ[DyQz^嬖4{\"EZq%5~@MoTEBٝ)0 ]&S[kXTcv֙ƹ4 q8]$@`t[gt!;/Xr7#|VgKG;McA'W1 |x^eiv%A@{n,D[%kg,[o;V lXNϝ{mb]zxq;$(_u B;ڝawyzٽ ^lޜo[ZMj<~8 39":DK8P7F,jb2C6ǑN,* QhT93]vΰ'iNG8#s3JjSنw\;0HUzA#PY~s+$%^rX'8whZ ^jCWT>gH`SɆ^([B5.P=b6S<@-%vj=~C~5v!JhCeXghvT'7Ib&UV(6qzpaoֆcz% US6qiP6T@c!ӷ}j.wʩz,u)g$.|':RόkMX R2M.XXÜkWl"-MH*t#'=Rg#x-y=5d- jg3+ut-C|NԷoU&m{glejq3Gtr*~m\~iDhq3cY{}ˡ6i3a?/{q6;uf^ر 8 H!owvbm:f`gRBG_>45j[3$M4Eeš:LH3fZ͡9W3^I->t@{84b+gɰ2a-7eΐyTT՘K '73Oio7p"~𱗋8C0JmnI[M{ Pd b>S_t{MiFhhJ\5c/btw&#rR JP_$:ְ(jM } Aʭ`Ēf=P:4)ΤW ɟy%骽)To\Šk,W_lp?4Uj; 6s_p1߰n@zY"Ć2f>+Bǹt)ێ– 3"m-;/>N]s'C]:yҎ $].yUl[nVI\2B&5pj0N_!S_sךL\p܀!T@;^`r}rܴ6 PV"}UB>^ KE:fV`ž[PZT7eܦ.a2 hX3dN d[ХKopz9\$,et?V :+]S~^ZF#,a`lmbSv"拊5^8鶱ZtVX>=>2^`sLdb 2Qdl/aW7ܧKbT!|PåGynڗT<#*jW #)[Cj;㕎e8kJ.MB>V9@ENg|-Z|¸H2ӊs\z-Bϸ+i%>jӑy&z#䴪K+{糘gC8˻ C:qmvQ:m涜 5.^qS]H{%;j> sOYK\E qB<- '.SBp9_CpάeZZ{jw-LL"&uӔý+mew/#?Z -m&],g X0kLBG=ZRO.i b܍šH &g赗31bx*UQ(kvNoo5n)|Š͓Q|/ƴ- 8=̰R<ۜDs<\8YRvPݥjA2ە=XmjG+V2^g lJ|Y»Żv^( q=VCe}T񠽫c8# HgD{<]&q.׎?sTkb3a6_,FS>aNɘ\@} tΤKKJ>%1@96ט&d'PU%2 |mVBϨW'wprA& %Zb޵UxţᆽȲ6+w]4Na2殆Aq x)^ {TDٕK~zF8nۨ 괮'Ύ5H6CD퇑m#)oVzm* >sg[ݯ\QB2][-ѸL.uyzYU}B*gק ; xh$ns]iJݮ>dR~i@cM]ϴ/D[1+N{*ӗx`&~V;6c;QeL~u '\#8kҖ cɔOy= , &ݩ0 y̰z -coQ g凕| 1~z| ߅fhSB)^k$z&i[(&Wڅ YnEu$9AI'p GҶ;XՆ:8S~c" /#z۝XWv&\kjyI0VeItS+} xT6X i0mi \W͹lϚVobp}9Y8M'EJi.,Ou@ucsu1v_86:XJ!#\X.)$T:]3["猷_\L\ ÅZ/OR>Oξ:X^>x^W6X'վ73﫟6V3̛O QqxC-ЕJᗼ1k69#dyГEٵg%Z–DAh,$K'(Ȇ>յbeY7WoN)z3R9S7IgߩtqOc9  jk@Ƥӻ>nH5;/ߜQ{!vxg C8i'/6] 0*{H 7~tzF|jw`}+ +f21$I[+@Kk>5>^$..F~)ry m:+NWps8-Y%H/ۦTtk(8F"O Ę/0Wu{H5&/Ѹz ѭO^DҦGay3=Vˊ7Ma{ؽTKSեXdUƭ-)@RwLoU$˱_0 yy'OPS7:J^/VEsӝ{O5Ӂpj=o v$-vjt@#8/# œLbWR c8} Liwv>8Ke:a> fgH7jJrQZC}Z'I nTlA."ߛ=%< !E+ʉvz^~Jy/NәHv# $'*B65uQYd%э 0i^̸ß>R.o'`z~60Q(s?C,N. Ip壢U%3mk)]CLf4QCUC&0q"jTD 4a%ΖiB(ɆKC6\{{Um+Rmwkah|7UmhfXvӤܦtۻz4;_qx % e'{ܤ BaD!dLJ-^CP޽ݣ%cz36g;V,$4dvF' ׺'~  x=WhT8RQʧBF-JX,wK|iN:wGiXWtXw4M`_aǽ!]ۖkqPkogG/f6s2<Жc^Xccz rrF ;L='BDBQ*}q< =/YO|g`mHfT~*Sj1b__B#7Db_#Qޚ82m_f.S?z=/Ґ[)}}s>a$,x)OؼTK E=6 &a=L;'X RpVbڡ0a$ϱ!+k@rW3Rf_*y5\`6h6 WJ:l:OvTbc* gxbNU>a&GZ@'H!g [cK$}R tPw-oG)څ?bT;2r1X5^zؠsWji|܍ޤ2{ca遘ٸGjw`qCmll6o&iBp0j#b⊄K?͉2NjWӜOO_,Yj Ь^٤+q`)!W)#ĭ9OpNWt+VqL9Q\(/jwf_]:emb*"˔*B rb_'7}Ds8/1? d6Q=j,{h=S5U w9qNC㜻W۾>(?VUJJbz-t\RĽ$mE7oWq;qeͮՀyq nqhrbR҂c9>yx<+]_JL2X?ه-Z3ytٴkcS\NBdw WMWR(f|֬U} nlz ފW 8xbF<,.Nqܼ\G=Ntp0ȣXD;LDw׻+$wıI!}R(fƏ!nD*--ݱ@g}9{=-DcUK v֏3eFLSxgoæ p!bۍ~rE5_ٓEe 3}~[vLhn!]h[Wndz3Shcf'Llu?^~b8:E< '=Zc0Ch'\~R8ø?cvo>bڑ_X &{֐Hv٩ְOp3mkRwNQviu(y2R'_dxt%i%#"s[qżX6B0bXAEe CTU`)?Fv#׼l$nR6]H}̈́c3[XVok3Dl)g^dxJJt6>';TNzJsw[iSNRs쭱7,z^Kz}D4Ht~-:g߳(PwXI%L9Z^66ԪOP p Љ.KB\Vw{n7ZKZRVWc8.gEZ#>@p"QT%K}RH}x]u _$ZIYfG\׫˝B'[iw1=bjᆼ3yHk7Ż>Ci=?Be/h.06'c|^/cݝ;o 9)3>uؾ\, #yc֪$&\^|35+{d̗ɖZGgڍq ME=rˇJB{x% !{nLOVpwϨu.Kkj;1%*Dd|w!b Y_i }OB{3At Kt3R]% USN*N)χvB0K>󾍆ߤӺߝӷ~"EoT< RqcWuW( c|ڜ34ҝn-יѿϋkZa5ᠬR˳3"7lIk6#g>lNquГ#}97oaw%]٧dbS_u՗Y/^'0zl*% cn-,,?,h;9}Z%mJhQ0DpܗXOvL~61 <\[w?E6lĠVh#p=/5B я8B S,YȣޮNŋ(gSrt'y&q(Q:~Ro'Zn^ӨksNXTo 8:٠U Ns֦וf~\'&ME-NGRG]7YGԞ|Lvbryc^\ O[Cá т niNcn\dk [x:5;'O0FYټ/=3xǘUѫBݚm1//۔SSiqݧ>^fR_@w62;ֽ+gahdb;M*oRLb a$;ip[s j+U3ϓ(sxo4 5M ήɊ±]7:߯_եh=*>x(Qe׎7@Ԯb͎sp +pZPzB]ʦBmp_9jjbs&uXRmm=Cڞd}axbk.؜}~ތB h/,*)k.OyϾ&#^j GE꽱LmC0WYYEޕ>l3'P[gjsΎ6% pIUI+LkgϽ58D !hz`{(Ky|D! @dAz%vhVdF $ ]miH:>LS֙`*e۱81AVWjM D_i9cinWg:ĩ#>5DqJVG8EbX<9|RJkvk͝hr#C<s~DB$<ב+%=;g`3wwQc27MDNwǩ˜/pxǰ.c q']b5P^_4J^!z`V|GiżpJR3jP;CCeqS&#SI`VX1k?cK7,*eIg2$/T{*++ h\O ,OYe8”0LSTge4EȲ0ƑK eWmGwީ4M t-x#–y@zu|,o{K00+ڐk<;0s9{.,wjƦe{ỺW{+HMύv+/-$O+(qS3$5fj e*̫HFB޵^9iwtз=*ei!k$:dA28Yp8yoOCsE 4K;e2ĭyLڑ9|,:T.7i+ݔ4! ;yf;LۖeÍB͐E#LWq!Ԉq|A#@=Ws"t!r EW],a]3B ߫9*9 н1^kfY]|ü ȥ\pg@s"۔>'(pRnZEŵl%g*5H޺փr- cw"k&#yQq&ũ\'cXa۶RMNj>i{op2@vd))6'}^׭=_J )x3FY,zTi?%hkZOXzp5X|3~=a2qaSeꨚɞ{@ī>|6y󧣸QS;~>S_-%ᛝ)7&w>?DႧׇoy}M GzE2P-}+$wXk,%3ÁZqqrk2+';'۲=wY1C':dԟyA`q%박=pHڳ n0եb5B) 5AƒgaVT wCηy'bˁ=,Tfu%o%9i,'f֩֫Cgh[mB)/hkFx>OOY#`{4LD >98!sV/;SQpYq互$}8^b >۾ wX!4^Y'b q4/Mu v|@w$i@,|_^kۀ\_7j\>l^Mtuc7FOW]yB~$QoV.Ք's;Tp^\BNyrboSg%H_,50ȺjZz+OeEDz:v%#h1&}yy\ٞnnZ.kfAn ŽP1_I:좗ٱC+~2ssy u{Y HɝVf3922!ۤ 2tTXTϢ ΙC J)CFUS9}QyQ_eq`1y©ZFPz=Z23?}}ޗ3Usb^{v9e`\%ZC~;uy ,jYZ[0 #Zoԛ*[.4?~хszݛ4l[coiG\o!(DP+YD!o m#=mTZ(e _ub=Qx\sRs+3Hqi'_%Ya9jKޛaGBױӰ=V+L(rdžWv AiC`.cJ(qr5BRY|$C7Z},fߙ§u펹|FPd,^{b/XoPDޣ80s7# ! uM}WZ0vq#n$ }uwtISH߶W9Ҫ^1j )m/ KaZO| { wI=p\l w*WI ;Uk 4ۋ&Ķ{nT5lc&}sW, a6^7rJ]BZus"i=^v {QemD ,ZrscQ8ZDpj-lKp)-voVS6,*yn |`-s>`ΓP*|ЬYad%_Lnq滭lJC3_}c#߷DkϲeZ\>tA4sn1i-a`1l}PϤc(RK`swxA/f-AcZ <ܛ>zcV+lcZ \ߋFa͉I#m?^zO"prMLޞ#VK7Owk/=J Mx2{&%'cOYHVIAyxrMEbo/LlwV:ds~2n:JiBN>ZXuo3ҢW箈UTVǣ9z_rk:ѯm6EeIwZH#D|v{1>zöA&bK}3=%m3MWn%BNIZ3 :p>ax0bҜyw n{RUZ>3Ku%sT[VZxڤv<~m{Q}w}بCć9J`'Q %\yBTcJ3m[gϗV\D=`0r^mq+\x`t/]gw{>SphGAכH>':GSxڤUa%2n45>0DyӐ%>JP;ǚY̞)lɓt#o!ꣳѣOh.vx'<@m)N"1U;v*f6"% ˧ܫz)"u;I:nˢKiZ{ p-ӵJ˴)=.Ŏ Y;q_J$`.hHE:Rڬwϴ{d/-`6g&kymqY&6ׇK~'5.W~]Sqc1r{oAsW]>}[cseUCƵ;^I6dY1R.$1g=|IAG*wZQVzVJ{osܧ3 I{_Q:Wcde1?H`bGo,~ _6s! tsIծ]/qêβ3v/\f'/`#kz֪J%P \]^z3X}EE*Jy5Ó;aV|ۜlN=wN ;Klz|BTBx JUT˓:CkX/ U(nց\G`"g*YtmȜ4؎k>}Od1Ғ'1Momd˔_%>lqR"~UC%W}(<|oSTG/bg˄ԓK͖P60q/6k]+l?I5V Kag/`ǔ㱙b14Ҕ %{a!ukϻ:Xm% s|kE09d`_WqǗ9 9^}T6IGC CY|Vi#ôwzX:U(H;!N?R1Cc~aF ᆎ7*''@{&8Nijnufc&Vً|TՁR~{D  U`HICh9EhM;`|cۖ>&ۿB4kq -@> krֆgK :oz (Ԩ\WoSİO^ X& ]4ն/_.+9> ͢ն^blo emsI+ -nJyqڑ[;,ZqSbKKK Nt[qƴb4:RYR4ݓccyb̥zډنQ /}es:8e'ol|sF~FLiGx5p{q+֭x&x=AYtpmP#6҂oBA+ҭ|⹼@+i9>ns m[uKD^9釩%qYPOU9h]X/'۴M<7rF`kw0װN@5Чzܺt [sI]5ǎWF^Ԅ^7f4PMjp{( } ap3Y,+!j+rz_ϲpowڬb^q %4tuEؽ ;>(t>3'as? HL򗭒}b$ґ! t`Z.H AwY%6BO9^{uHhN{ 'Z>Rtin᫿1\u $"L̢*-?*J_N͓/4פryD')!F]Wv2iA&~MZP_ mĝ4QfթY8H}\<8i7kɸu"`v}x=ZZpE"=xmujgDTjկQݛTh5Z[[guaV<%]bKRvd$5koͺ&L= fڦP4aR oU:$S|nZ^-wQ[&-?h.dotR@T 6_dxJ9tݣ;:AdvUp]+p-w3'5kVehm9HoH'WS.hJPHaANvryJ¾nWU6!<B򿢜T| `P|6cKkcS LZaGKr[7"[0l^ҒhvC~:KXM9=@>F&i}cc76s3^Q32-RgT НT3n,Oir&XQ NMڴguUH{Ui'˚Ҷ&⇬o71.dfB'lRmIC'jT H)7O5C%)֠m#x,KUA9=(Ȗ:[Z1b9^%kԯCE<4 8LeOs}} P1 9nЂڴ1ɴ)tyd Z#cn%z(X% D]E%\Ref :)4A!D'} E'P8G߻X{Ky[Ki8Ds {u-Z,5qIV1oSWiv"`QI~9wۑx EZoҪbV {mN(4Pzyi1AbG_5X_zSйb/{R' O^ޔn`2kyR=k&ﺣ| "/^2 h>SxkC{ m!= T(?;MNMC wKcOU[C{krCoŧЖ&v/\ZvYεkSImkK7_I}=\p `K^2ЕiCU}s: 9CNX!SOq#< w2ԴE-JU}l!,٥@ܝI頱?jbzQ.QI N*hb!]57G tC;^pyZM|2;$B|zoOE0^QT8eٲe_2R`|Gl99h&5j΂p*<+&;|[ױM)+ip^> Kч~L[IWˇ4q |){!udm|"ȹn2ChXʋ 27ynY}i@SŬ%!M#+ս5Ip uj EVkn ]D/T83yM!η!La4OOR~NQ8㉝]4&R\M!0K uiRw Ge0% \]\Xy_tLdl0AgrYyᘔExhH{si} [oi_EY^\#rt=Ϡt[[c̹x1[vyAV6 caӌka Xtt.u;FǢڍܫ$y{Rw(xWx eYΛ+!|%լ3_Qe?u Dnي̎7[K\Y\fwѴ<[Z =rvRfpBqš9t v=%>i1˷%`#sHaۖV5VHF.+_ 3o,YL9.Ï6뾶7{a,-Hگ ^|&^ `Р9HΘܳeJ귔46$_GMU3GKTrR?^ "kM{N18u N}};x(]ı:/P ܥlM^\wlV8j}c៖h]Z浥 >rLS *! j]ܛ~^aYnr 5Zaf p$]E|PPz}}ՁD˜q>kg*wPokB|j <^pW*eqAmA>hp C G5)[Yvgl=Huq*Lw[YJNkhkRųR_5MGl7'U*C;Uٱ|%.yEPF+ymbp1w~_ŝW$;Գfw9,31mwH]v&j9FLZ aH0-~bjo ӷ4zq0.a|+Q}8LFm ~y?F5Ty{AtۗBU,>ԡs%MFv +w] 3kix-:mKA z/V=X9pN>@^=5ZJgm4MZ`ɳgQ]e8R6c]g@> 7_9o~GBk6堬Heӭ~G9DM(4o].dlofzT,.XB۔(bo =E5yy-9<6:5*.nl?f0R-7kH-$lS+]9JpWM] ^XKח^``P͡^/m2JT釡|x 'Dq 5"ZNoK` q Qdulk*}J@wU/}Yќ)azOlO\FLhs/ߧAlOJB:,`&%\g_Z1B [~v޸&VJl)Tr;U=}<Ь 7D-۽F~ۻ+ZʅR|ŹݧE6~c1sS.[3*ɹȶq:Zƚ'Aum(7%>2SV5;fv ͱ*iEu{ ]}_G 0-P0qZ4MF ֌bޅi1;SǨY'h}PZWz>2lU4hK95آ#$Mj6.3n249 Y f :g%8hesSB{a)DOVz5*Uq* z`s|@:8.}gpFߤrL%Ron4Q@zU>x)o(ȨZ 2ǓKP#&odVs/Wf 2N\[ZQ1LB8RGoszΉKhk¾chWZx&QPXғ`q̂y')}WɡhvX8 ކy NWSMGe!{$1 JaBw%I *ú}W q9C.Ѭ(mG4r*yx0#inbZ^Hohc/Ģ'㠲XY7#%w瑱v]ﲱmF@<[ͪemK{Ԏ'":Z)m /%FBi4 nZ5ܠg8fg)3OŞ^O;|e"2aC7m +\NJX)rYwvm*Z*-W>qEՖjkAfv.l%a\ڴħ,˹q%}-0lyoas|=/^I>'@]pj 첖7=N'N܍m}(I_SĻI=h{Zܷ~+6x&a17M@Ięx1YgI>ͬgI%kC {)OS,ʈ.}U,lzu3J'[SK}TP/!MCQS831zMO 6?.|wG'l]X؀mD|z"OJH1.o}\i 9wC2lv̉tTs`_,KkHYה֝tGk slyiڔfKyraY~ t{id6cA#RZ߰.KCs=`yWݒYĮio$ zK30(9hDԒ_/c֝ qg`utb,0<-|Yv>C56|clK &ҕ ʬ]N{ʶ&%mQ?`/$;79bgZ+3RG5XR*pbh&@F73Gsɫ%%7i v!5l̫kJ,o iOÚc'~mFOlv`=dk}s{K83"'50lK-O_ggŪ.>P X!CrBP@ 9!)nZaf&sy\wA;׽K\diw1v&wdlc[R|+D߿&R.dqǺai {6's`rn#5/#yy'/1-3u Sb>|)lfhf܎m3{nxY@%nN /=:`m^gOg:M>;Mٴ[MU!g%m}@!@,HFҌTXH5:Os&]l6|YOڕ^xn8u{YctʼnV-ѣpيv C?sc/)O4&ȌIEkv:}#]Y,òO};)}~g 4+̍`m8 Jܻ)1~$Fi%J<,dP$sGg9n}Zm~V-?]t)ep{u+!5_58{EY/nٍkaЍ8.uLmg ΆRif/C+wtǽMV,!d(MH"CMϡ} Ńq5/]&!rPd;Gyi?Z2G|$rGa 7=%%)?tXA6 "x>œ|S#&Zvг(^:N*$\xz{MW0oZ=oqrՉi{ }2a,pG93(}pN-&+sxaF)+v}}Cu5 b1™™ YOlь>8fGo#-Kh~:G QrH;l |* (sIo>GTzoH cfw4 tBI!'t:Mf?Fֺpo'x/0Ѝ{K;&&p8D. Eu(uy~+G+e o' 6CctLtN<6U>cO X_6%p@+A$<yGARR(-'`5~=utBHV:|gXL}mtP [= ?9<dUE;JK AQCKQ1~={".V] F/Ava)ylpnalt@ uEdn>g0/m#:\;Q 4W PB Hcm"8i^Or9&OWw}km8D>5rA@d!zB,g5r#׭8?%uɴc+1C87FY<Ci0=JȼDch_Z׭>!KhՖJ9u!jlĦ/kɽBTuܮIeU4kN *NtyZ*JDL"AMvQ^lɈtY-zL5Щg>,gf ܋JB'grL=Tu=[5Up|{D`6iPHlp׷,Vù2RML4I0䎟Co}u;zU !K LJ2_TֱŧHzia鈽zV݃XÃuW"Jp:NA㷪H;{|aNж7;?ĞV[y_YLRIs k2}WBX%^_ݻ\pVQԞ1Q:C|k*Nh*tJGM۟~^Ai"ʺ;K342mXP`J O)gbuP"x'c89Ko?A}}jQk/ |j;p;f 7s"p41̼ gB%77rP-Zv@g^x0?|E!_4>ALCj^p6L -5p.KS,Ƅd:e3j=氽]O}HN"+&|sضVۖ׫_Ɲ\wvMihwݽHN![ҵ)ę`!^iW5~3Hp8mVPY&O\,X 7{*B1F4CҬΆTR_N2㢈Yq"p_EbtV#= 6wƒ'HQoae j!V,pb[@P@~hRj|Qі6YEߋK觝4]^ÕwQ~bCLSV%VKJ|Ué$J^Tv$}FVfZˀTo7RnNp%YXTzq\zɇϢi+jwE56~J+Xmq˂eʹaoåVœ~ fMyD+-i^#˵&-b>'0 p5Oכ̳Ywh`U 'o$e8OlfQf(R=I]}ո.fb~nBȕIDmhHo`*CK{ڇ绝g9U8Cq/S7 0 ^5wQTk4 "ޠ5)B$o&&uk ccLWaWqѹFM)E:AHCB@~7Z >yPEx)VX SX}bxI8L? -K^'l’K~POy# u=/)Lf{ 髙md=XkFo4ᘌ-4 Q%]E ˌJneoɲj;R$V'S R><"ڞ2 ׯ?I$jZǛ踳J!Re')c"w`2ͻpj'hyLf5,xLf'[i%޹@SWU r)"i wz J3k ɑ .`Б6iumq_+J.J"Tazäy7X񇩤OL]4;HuF=h9߯TyCan6ѯ}e n`$'aˏ!"LpZ̬|8N=_X^B(*>pM.#gklkߴF|:Ue-?} _]|G q3k.JH* k#RB],I5zg]'||iC~r=ΥԊQqh, xob3O|gBȏ?A"4eď >7zv G!J~)'qkzz [b=^`?`iX4?~?C?R)j))K)(i(R]wqG$]@w!B6t!JӶL..$*(J :.$:,:˸;4,88Qe6⤊-G]DuEm(*2IDtw9 <9tqZ$IigdPVwXTqAw3\Dq㣥E]YS_5.#nrw$GRv۶w$PNB n:: iٔn²b+fQ'[A7&tW{dWߺxU^53]=+v YT̵4ٲcvv`,+;CZH4ӯFZrt$uҌ4Z$fQC\;$[nhcUmi "%Οjr9̴D$ӋM3A Fv6lMӌ4YbI~\R5DH; C/m4,kkm1iGIa6NtֲLGlu36d"K%!v=X,'8f kjPD]>PfVI'!a3ʲf Ip'6m(3pݔRJb郦x 3EH;IT])˵y̼.Z!\:S" B'4r%Pf-S8iۻnE(6TgbR*+z>83MkSj]ݧ]m:gIxķ"#ޥUdG%j4@eF<}_gy+z>?T(h?.%m=q96^/k %YYeۜVEeYGTVVwق4tN %%F+!gY mFV[hem싐=ARt;{VsAS;'6OckOA:x9wp񳣺yEW ל6݅1Q#:(O{Cخ*:˼*.."ʾVP5N2t)4U{DhЙ#EgKrzQ5D,Rrm˽(";m (ǙsO#C k9v被n~oOr|>6NR5y? ?>ǡkh"~גiJk٥~DC<+HH83.âmo;)=2(.qYYo=LJŠi)S]!_kSf,m;/{r\AJ<\ZpĖn'6;3dvg:BfnD7'tWy{eD0q 4[g^ޢVP%"3s[!;l/KN8%)N࣍w͙D!n58^[n34 fD2Bi&!(d5jl9dlk0Ĭј^Q}BtgemvH6,Q>WH1"&MI$# H}N蘞h3NE̷tDMME'Q%K7I98kY<(a=7}>''DUD=Os٨ LV#gIIEL;*ά+:֧4!T=&IBih큢 !vk^⋺_/".)8 AAqKMH품"RixM(΍==!E(Z][`^3"/)޻<$z:tuA-`b\<'A6cS!&*Mtk6) zu;(iFwaE7%f۳δ%;^řKNڂiz5@ճCA4ݢ'jEݝ!s^]za'J45Kr0Nxnzۍ;#%i:yI$iy_FR7s^v.JO)2ڹ9j#k2VFT!~{/f%,=oY&I㧔Jbz+lB?_NO?i_PxQGZt8'YZaRB;/&h_Jݔ馯. jS 0z$ן$iYY7}n{;h#Zo^ph.#sl4>f4]/MŒ[^j[=ƅ%hfQDA<1^,bq>)CjRR 6:6ݓGf P} L=tz8d|a+,z)[7WZyXߨgP% ,@ܽRsY'42޳"BS=\7}x֊d|e'%Ln Kɼjϴ|@7@ɘs"|W\odCp`ލY[/)CoP7 8u?bԥnMM*4Y{> kV}ׯz ay1*k$05CbcT ufd9״S\4sw<2"~O]9}'s/H@S3uf4DZ w/ņ0"]oFg^mr09 ;"bI)Ȭ5gzfai?B4-1}Zu5rMZ^{nIEr4{$;x53fZ1n5Y&(+t~'yLW2@JEћډIyQkop{;TazGЯs `&_3< -{ ]s͇[; U=ܭ%fF 06Iv`D$#L5*HiC|9ZGry:}+G@i 繞%n@_XJٟYӳ14@*G ,?^[€G-絬kL%a3|jGWۓ,4- 塨[>ه=ҸiIZ}`؅qOaC}L#gZrm%[2<9yqK)5:_{lif8ڼܚ(asS(@$aq/RmYΘ s@B$|ͳ_/f2_IR.S$wZC,W1[5%aݤ0co\ %ZNt66`(>t8gt+:Zf!KiχڲݤZ-?[ֺ9MsP^S l|Kdg]$t+'v&~fז&}-ӧ=!7֓uDaVͰY/I!m+j]=փ^yl)$?}w*#W_Fĵ=E$ZG@~ JW;`zga}exbf0쏊4?m ګ k(o8qgQ0K =o3G,76zQ镢;_u%@7; jIƶ?3W/o#bR=Bu'K)CF$i^!K4o/ݷ,%=dV6%OԯzK@(g]5CMϱpp[T~Z$1x.c\s3R"۱5䩇橓X5աm"!'>hEsUJǼȓ K,$! ,!5'Jʪj!rtqUD?:"ObZK:"֔V]uwIGЀFD):<ä ;tkqul.; .3+;s :.6EM.r@ ^֯kWۓ32qҎk ;N:-$DʒP:s^$pV֦V"/nLRWEcÛ#ag>p(18lmC (($tp`mӝ+N[Y's$,wli:۱{k0_zg׬PӒ37^zmhO/jU%i؜+Fkz9DTy=VITslgpǂj",<ya=I}/RK6GĤƒȍ֔Xcزʍ;1;l1LyjO QzRN^dKX67#V>|UO*'=SP>&Z5 !ҽJJi+..*2(mvptqEŖw%9\EwQĕ6"gD;-wqGm2:/ ;EC(+4V՝ fNB:8FwduyluDWc]+ )"!Ί siY2VU]uwIR\p\D:mͥQ ' OuBGY5Yt8N% t.N$ȷkvt]lmgT3޷EI mʋ1R"LE.kc&Yjlvq&egacSl:MuȈl(蕱ۇ4ҼRGg$̼Mu P=9)VͫTy3ZJbZD؍?쇞xY ;tyI^̀*{b*$ *"u9PǺێm~9Dw"9^d \9s[fі0;9NͰ~x)Nt= 6)Dyy|H)24 .vWdV]n3+k(EyvIآH⸵YW 2^=@*a $[g2 a Hiȡ)N]5ӴjPfbֺ]'Iɮ% M:4inExW% f^ɞDeGYrQai+k=B'uIH+)Uu=W])qBI^L?S!l%QcǙAS~TQ? N;v[nq]svyapu9f붷pdB:N"+K8*Am :*.sͷYa ^QiМ7GrI'wNw%YҙÎ("85SV%+v+I1Cċ#(HA ;:(ڛq 8I^Z) ݙ8܈I³EQvpG;k:"Nqm6FJ&ہO؝k$J$Fӂi l$OutL-DRu¯)4m%)vزwYEP{m܏I jJ;ktޥl܍Zus yVatRjfh{pՐp圅Ei6Zdk6GaUk(U(]"#K%4R <ԼR2IkAzatsJ&!Du{\0xlP{)43 7{ Wц'Y $[V>tNE=/xO|/|8>r Eˢд'ife(7UD>Z"} Ŷjju[w{qQ<68M(죬mvSn ʍ9#E=jCuT#:ݛ(d 2OuA!')HC!精ݧd$R^u^_nI%[j;+˯*mGg(^yw}Gp>|܊$lwھbT xS$*BED#+uȃ^2*k:^btimK27PP^PQ>m*!C( J|񚢚*fr%i^YVvv^yyG$I n H;l9s+N=Nr$ۻ3n,dNG8mi8G==Qv28ki Ğݣ'^ ध({63rs۷2pB(",3YٱR=v$Q"Uh[PE^$}Zf҄<(Q]pԥURO/ ;(e&˶6̎[ Ȋvr,r+<h/8%ryC2{HeN1qىY3I*# LmVcfϗ^Z:ֳdgthbۅ y^ e "=/= ==J)<=*[W*Օ& Lr>qܨTETxyn94U\[\HE%g;6(&[ln͕]7bb>9x@@=@PW{W 蒒+-J䠓K&eR.Y'vSX%;ґ,"FYhGA!(82chq`358NFd&p91i ,J8N6'g@8&v@-)Mkm5QYֳsAvr.D$6ȓB% r%Wg x.ً3;D2, B֭vmm;lie@u@HL/YOn<96FYtݓ-(DL=R"<+bPDEU uѪ£$1T~'gK͎UfL8[iڶ 5㲱!M[Yh v[1O23yme{WPR)dfnp6ìK8sϾϓIvPnuyU}痠zSYe650izA5(n " svmٗ 1Eo{#;rdZWAz':wX8gVFEssΘOA*+H3[GjVyɑE)*Ok9SQJ0{U y%ѻ*]w/wuѮێ2*z14h3EF^ib.LWxaASAOTA`ꂂR FTC#.; .N::ʸIZ Jِ5Jt&!.:(㨮B8;舻]zwEEIQ]]u%EeYvTIt]qq^X]m$.:.(]DtY$eb\IE] m"E8ITqDqܝgPt벴#( ERdF ̳#;*;f ֈ6/+$!Ǚ.!8"sfէRIeE!6Q9٠3uw'nUH]͍Rhi %YyQ$fe[jE^RAx!?1ZzehNzS'lLJIH,m-\=rnqf>dq5*/BZtEa󠈂EIT DB@TOtUHDu@@!$15֊"tٸ㜥;K$Fq-[-nfslVueemnȻ-N3˽yh<#",rygNݵmZUekf$i3;$]\hMww$c62v3Mg$ HfYMDrSdV6ַmIgAqY$RnGTȽ glfx2ۡA=aa*Ͷe&T-Lt햢:͐qVtD[[n>};Ύ&&ldv--s7"ə Um*OBmŗh)'-o{֝f&r\=Ȫii+ΏnuHѷ0Wy>{EZ`wg2vE{m5ӤZy՗I=Ҩ#'ě0{XgjL C<8ygB$=s{9P{]g.tFxY\6" S9!ϷFq)fDݸWet!㻹¨.z*Y[ :6K_a@!CH+#JEV/m7d6?,eLNm.d8T; :5Ir(.YYbH}Al-5L)V= ^c~*C?~qd%< Qcb5s2g CIcu0a}p88< 2ƜVRr#h^>釴.r~~{ׯR0/x*8}V*:F'v7ogmr anNĕ~J>\Xb|6:*.}_|R*')V!;lp|K3WpbZ|UC ]HhSʙLT̴K/'%w ې^}&.`q`dF,W5$i4[V"g˅P:~l5٠ r𘤀GQRI\PmakOsc/؇8)-F#) !u/1*8L1Zv|"3PEM5~[ՠu: O0b&?. I3b16ଟhceJѷqh5IKHP[mfK3Ӗ6ѽgs6.>s"UupuB :&o ̜{1XT56 KCHsQaair7-L+jb쩞/ɕ Z:tOù^{RCʕ@yTsuN*Sl*;{:]EV狛vb/=:,k:/ؽϐ@Y>ʝMy+T-S#?=31*̓:oKip )Olxd4}QXm$^=cfO[8 gt9Nw^bӗ>a6exU)b#x e{4#'`ސL9 6# 3S7/-72fqIHXcjOuVK%(#|HCOl.]GC\SC:EO. |8=,ց+sCD",8n+rn7ec~ݰGP#}ՠfL\͡+x}!䰱k{&##wƖb|7YXߍSI2oDRD[ 3DBvFlʄSi~Mz]Tgݚ.;u%1;)AMcm39 IÊR4؁okt!; $qHfV 'C^}/1x%Vu5Ư1ARt"\~}I(Y\qԙ([r<ȍ\guzQ(˚+ l*W{̞БIs$J9Z9 VLcY6H5 û}S+Fu kfLIS' V9wniR-Kq)F+'7Qz"O|7'6!3ar>3)ub X6I5%e0YLCI4lb^%rL[9l*O#R-|Ă˳hofAEي7sEW *Ef43 YB4 ؁Fz⅛)S}d뙘}ۖ{-Hs\ ce&ՔδO20>=N4zq/(XwJ|XA ~VU^XnÊTo9ʡ?VM#SSlKuN(l6#j@a 2q`B^7Q٤@|LFm/Bfkqs'uIA2zRWel Q tzћa/!,-D[ۄ j IDr`l?dyF<#;K h9SfV2y9I %gO]q6$];ݟFJ"ٻ* e":{&YPjƧ_]qj6˓uyb=Q$~/댨"0ppv S_jxazY#BG h#cA!m\ŠR{m0cM p_Ly[}(Wp%\S:. t8VI CF}^cZ ++p߅C[xR `IŖcZxg<0f])61VR !k{AV`ͣ )e$ARAVyf˭\yt4g%̠8E!T_jJ%fRe2cvN ocǨv:('^ -NZozĺQ.6X||[݅3%I?2E^t!9wKNnF=̾aZ寸,d )WClx j _NPb r4r*w0|0mN83bgY&Cs2;(ZŀZAً<?ٞ$k֜"5?6x%?gE?T%U#AEE^k82m~8'9~6dYB[cd|q|fߛ<qđ $2pLӑkF] oSC[ 7tTu6Wwq8 g{.&sL;UZP1qH6Lboe#́C $ywzH@m<0)XSZDyμMx1 MY4T> zp<]J6w?5i@ȴv#&Fސ!n{umjrnh#S+\FfhByl}ܱx粏}e7y(Zn­gO11ܥ5oBw NT+<&9^;QVr^zh˪ZHnoG`EDj@MzƨDeٵ;cYdk ՖG2Mڒ9q O6F0IL%!{x?\2Dd:5"9 D3no˜ƅ^亄sbθBH~' Qэ/D&jϰ=5p~ѺvύhknLhl~v\ Wr)- P/0 :% uJ?Im7L$}JbͲGgA2 (weWCq5΀+Ez{P]V}m%[GIi/ =f̭2i"nv6^Xfu-@=N-u'rI*JWSAc>YdD(+=is j _` eUw97+ђ;%lľu2q9&s95 |+Mپp;zL92Nihgź3ܒZZR1j4@&LdB:sJEzCU{=GpYl+ ȕlEfӗNvc7=9[hT+#*8#_U]FxvPڥ0sR[We>_D}[hD^.r2*uЍ{lēt93ĺyRÒ;[TΆyDdB.dfHK}Cc|gh7SdX3 EnKV=& N M5v9%}:^ @*0I_GdpYt!'aY͂}^)Nc,"o DdMEx YLמ iĐ đ52r1z[98ꌻP>S]gY <"j̣ x$$;%`*ҚHATw97+rwURhQ 6sQJȪ*X<z 7Zi>C3L|@zRHU-{><K/vX.0^MG竜v8jߧ#zBP~6 Y|& qYUq 0XSaq5bDɇ,WwU| 2s{y`8=صZС@sanl|.Jf9X +oУ#R$Q076[BlBݥ6ZlH|)%4_1FHdAV20fE,!n\!"T7P4nonaIZgvlCâ-/4cG7I~Y H|;72%B/ Q-{( Gz߽8e `],tn01|U%Fp$\N.FP7Z0y}4V#P@] ᙿ ^r,(^]%e*%j{#]^  Uwp؊C(c.#'\ ߄S<B Dp~μ?qt30;`PSp[ KqpfP)Sp&k*zt{]o*@/9ꡢݱ1C}=j{lW׼wqj:>ҕeXlM9Ww+Fv/h{9qǕnM2GQ"dPUB?yݎgC"W*jB'|TUYWn w2(eD;ت[9'&VwxecTb<bF^}6@VfťO3Y>&"+]G,7bi^CrO2˯hv'lH"Bv O)"8l.Eۭ pt!؈Qj]C~f_54pW6X Oibpo& "$'Y!O]uXxaa#"FΌsgaT0x pːb pxEzr Abk, cH4TOUQp}`V 7 jDLDk e-6߈__{ΰm9,h*ۚ2nʋuTNM wR3 2-#iق3%ᮆE`4y9^ q0';2n - d6hc T>P"9Rw*E%>G$[h^E|Hrn:iaۘq;+-9>P@g9KM Y$<PB`3W>Ctm~J})Ug y:LQr>k Ha:C2sLp0#O\0*%DFZ{`~E/cK`mnϑ(UݕO5/ڥqfmaQy/u}TZDrmoo3GAAd!>fUK%- 5Yc6Ϲj\Ic=|yx e"C^:cF*R%;#%MnR:͢N$ ѧ'{U~(efi3@ X; zjsU Ü'hȍaƛ%6/JjIAT$s{F"VseNzCGͪ gZ~>5|L|^;ʝ;I9:z'˃v\=j|eCy~)A851;M.Ϊ}v2&\Y1ϲ;V@ /{ 2!1ޝ=T~ t>0*aMa=`g%AB5 {҄G"Q*@RJY ߓF>| n,Jͯq%̓U+|zR7x;tp2; Y428#7 ,7tԺko8 ʭ|@cn0C=8ksv2V ThZ6X${M5N@ .]z52%u`RNwzQ8h w1Bg!! trҥtu1uKqC\n;ޖHR.<=Ά|'yY}ƒP, ٝ[ўxwk4c `s)Gʘmpkq^F>7r}վ3KULAUL)i9Gd|j͹hKL9ߟêcݟ%ik$ 'L.rZlb% X<9%\Oo*>\*h!5R*=wХ7"7]帾 ѫrʷ= M%Nzska?Ja\2i[/][%q5EW=WA4}KsRs\QubUI@t3;o6mJQbqB=3 +UQQ3tcMo^*VtnJp8o67gH~(xK0IrvF*xogO*<(dX5@|2Uf(Bo%A{_ےC`/J6z"Ӥ0u6u+Yꡎ /%VE o!y3lRU~NHg 7ZTOƹYr,*l}gQθMA N"c ,;5AlK3$F1cR5r,v1;X5S=70kun+&:Z%(rr` Li˗ e`ֵV4Q^TCZb^G`ێR>i"wyRߥơ "0$o z}rtv}'DJ1& '۵͋FIu 8nðLpdMV+ܳB#F6TMо"k+w?vch "JQrGНWnۯδߏ@|%S@@yf7ըwszkc#f rQ=ik 7H S G2RځX = 3OaA 'w[yp z%5xƻ %ņrAn ~|…2 ߪYLbNxU_ m `'ՋJ5leW#_Y6EW0 xi6LVfeeD`)Vx~vȧ.N.- 9\^0,6">O8K|L0c\s:H|,q"bt#({8 ~0pZkהQ0x;D~36n[{kjm0`]xMaC3w(ϣr:%fGem 9I/XQa1Μ6ۆm Ml `Իذo_=z}ӺFpZDLIIg/xX#ЂLº;%ގyYꇊhbʑ " q]/q#\bΟbR9]IdsQC$N<>l\f n?koP}W.J5?ǵ\ᅃ ;x2'gÕǷ):;Jn2` -Ћ'x۷b۵"vzSi)mWuŕZd`ojʇ#ȝ ?4*Ւ5:_b&ͪ p0;9i?"6C e!s#Zv b ƜutGv;XnlC.oH M6\'mrN0Tv0WftZ?hM,U(omyjtYY('z%:G?RL?\7v<,(4` (WeA-pKx/"Mǯw>??h=|OH?+=W*%y$GA]v3#(LUTԀgD5A*&+Nh0A sȬkxW 8^[P˺Bj3ɖ%wH;l $ܥ16J /_gwtbx}V0EAw@CRX hΩ /]|,m`F`u< CK@/~>Bw]zKOݵbu̾=ŶAR^aCa;ϋe?{:]utX[7N"@Ɩ4?,o͑a1 T3Q~-KqJ jL~ڶ4BD=`O GI`U$:7I<,Rؾ.zPHLJ9ߣtiX@X,.8 ˻G19˜'Ą[oht]+uL<+7q8X5HH)%vaR0DGq*hZAؑۮ-i[O6\^GiFwu;ud& fid;m, Po([Q}phCHBw 7 6 mR*V !?B h{3QUN\8B!(qR]Ёwxl@J *f˰~5٩)!0sY{yGM~*<4D̫X*i*ɊF#; 4YTV'/4h"8#S`J{"u7τ\T 4`%_廦q^? 64x٣8YK}A{9mX Rc`ј!.|e~,LZ[np@YzС9E^xN!Ōy*7ټ*{Gr`Hc55\oM=d)Ʌ 22bE(joq |&om eE~VIF=y%xոf9$êӋg4:"g 2Qhԍ ڞHaم6ke䒑@p-!"Ib0LPxլf F"2 Kr  =NBi,uzs+N[n[m&:jR(>qRc7Y>Y"<[s`槕mճ.3deebE v<92r bގ:Tב4~~ڛ3rSrNN?+F@~U#f>(+Vs(bd)E j p"j $Q;[ʰ:sR3%~C WEx;[M0#Ptac$ǻV_mR3D~Ic2gbwnUc@TjJٜ%S|8uuݔ[c^殥 cD}O"1slΑhlb3_GI9b*+ς ΚU[=M]ɦ4鋕psm& !ŜHM#ԀʺL5ԘęE`{@ cz^F(`YK0Oa^LModR Njp!3-wu!*:ɢO _dg GJтI[` RH6);$B>H7pE B+ӼYxY驾 J䬮+}SxjmDF&y U6 F(8E;n_SyvE=ܶ W&t12E<]A1,J,ݳt_T]X81{L̚ ҇ZS:\kuyK'.t Zx[p縂Đw7A#q t GX'[;W38C1mnS^orH.%T7FQ */\e b}@*IF!M9A9D}#j sé'j"FJYkYb?SB'Ǵm̩HfI€Z4 73<'^%oD9[bHӡ\覆ҳh ϕva ol>F˻Ԭ;Ѕ31s gO5÷ lUKh,h@yկdJ*zL;u}XPho  oJv@m:7okMEICft0>N 3&84H0 CNZn/>%:~#V(ϛv'_0#Fp2:sDFZ/7tIZ+V(j?hM2a`#XvΓ\0 קmΚYXxUzµ9W9UM -xx+J0s uA Q?61l̚%4h0Mn䈍4ɊdB ;JHЁcǜ1R*ZY.V ӡТJC+r1!ޞ M=u ei! Z7G%H%pJa&dw+j兝}PO|+IrDɹ:긖$ڟ+ɕ5$FcaJ+߶.r&bCN=gJ,c(f+"7*<~;į?#<;T 0d$_K-U&f8̕/u"jC7\=+}rbXT5% o^om@}wpk&ez~LPG|r* 8Ǎ8 ( !G`~I3 "ѽ/\2(}ӣe}n߃Z,+z<4J6!<^7{Vڮ"6x >M=A>qA1ž,|u[^Q5?}C!Azbu>Zp7MXlFM;">3L6 %g+5ihLH*(hJzrLo3|@"T|h Ů%,&zЃ8ȁ6fҾ4V]voSh+hk(nd{$H/@JQnj2heşvQIȣ%s@Thd֡H0tG6Я2AКɇv_ ?Gg!B[.)`Q$ě>gMh/u7X>hc˂#|-L E1U~z53|Ĩ"# ^^m0Sd@-քm^ޓB8약pdDJ̉<1t'J>;s40ߍ2Ki̚h~)Q=0omRQk c9?E^%b ,Qq&oJQm8F`S[z |xZ)O‡VH31q1EE" Xs9)+ (J"Oz!}&B6,is> aQhgr8Zhސg٤ET '!-sPDB6%]iHQ8 ]wJg$@bv/e/@YŧXO#&G0rVeH?O2\ZGK:?h+#1*e<0Sυ}@6q$G Mgq^y%$bDNC%+8JMq*>Mw wFNN5N~ g~4(r$vOtv;RK]%L+l,  i Q^s߳f9+1`ތ_dwQWI|>JX-j3M f=tZ3{#2~`Эbb976F #0Yg|%aoda/ b“V75S" 1܅0 (rX$1F0΋=pQ[\Gf5U3>1$,5Kh #?=MxXozcP nHbz_:j۞DL}ZXZzcb1^]Z-}}9qFT_"G8 `ekuÜۇvT,QT2p`{8=|8 싗ިH /5"U !oIp yh-b(&[y=zRH:dHEVƿ  *e}>Z*_7?Tk=zw%cI݌nSל+ η6]cV\kSf7JQ@tj\| %=D}ȯs##q9=jxYl8}{#n)̻ީ \!Ӫ;"=n;QxlLn=KQw~`-_&=s]WE:Qai|OӤRye}- Z=OUK~Q\Gby.%N=fw<20^Wq[_-dZP80@ C,S6yh) bkCHE϶4:Oғ bA։F_p*_k)arɍR8%GTʆ{Ϛ,{wO!_r:SKqD@MO(^*Գ֩]d(*ׅ0%FOkW2!$Pq/禬>93 ̊u]kA,Sa c9(9yR nPkn%̽zfaX2n& 0z&҃Ũ5ft6$K(}A>l .ޓi}m-#Aig_#s2KXiШDUWU37)CgL%q?Kl,,XUiK;KpלA[V6JL Gm|@i@ :ΰy8D;:. ߍxNWô5̈́'K_[kwG}':>WD v>AS>@izߨ{ k6QFtʨճF lQIhw@MR Z%p;1YE-ܙb4l\F2sZ>qɣ(n,W~z Cx#J95zsk0xy}P]|s4yuJQ5j1"M0=훫62% |TP˫TfX1% E"ѶwcG Tkn Ƀp;+6+SQ>Sr aTJ tekaj8h$. wN_MʕeЇ{>g~C.E4[v=+"g"";i+)M `1`Ba)ޫ%bIJEȲ5 Q ^N+NDylLE #wK?$ #⑛gYd硩еI佹)bMͬqT&{Z$ z8N+YRLBY68AJL)͎R>\wrNy3+n1Kn_{!_--Q2Kj~t56p. *m5=Fd7*G|w%U-'E )'}h$- ӅeS{aS*"U 7 ֗.OLFPc!Wsj* :u- X0EL/<PBڠ1E8zUy  >֦ե@ڴXMج+϶ JQ78\iYDHǐNE}k3xn= ^ש(J#aI^$I峎7p*jO+nJ2(Qݒ/tdr?ZFaPV)Z12FZ!³$Z@_VPP8f50e{O݉C+\"h\a:A PA/}![-`J*꿬T0C1҇BTԘ@ULaC<:%$yPu`P #P[*-]LK5cc" 뢪w5[B:Qo9R3{ +wg19Xt{<@gnrƻjEUBKwGWFuRkL"b[>; T7jJ&e&߭V0NP-xB1$6jYk`Z#ݷHхf&-ե xG  澹#Cቒ'u=[0h;NX 0Y+d1 0*Mu\}ʅAyFD-H>vPI; 嬀m3}$aӕGxk"TU@hRCJBP}8Wlt$d0}A0[ }m0l{ˊc`ev wXVr,jc0PX `R99zDH<oɩ[ìƭpXY)rnob6 aӌZj@`$s5 c 0}`Fߞ*c_UBA:~4ucRinC!1,i5LHޠ{3aZ܊ʩjw @G"DKRUJJW)vQk~ۢ!fUWaxs*O 7Vl7tog~6fDxϬյ`ÑJ֠al!.S(O"Ax6ҥ6݁l.ꞨNgdO8tS5r6mNJpVԗF>;TiycEd{ىR$RuU~oeuoWY&=َXxgm+$8{ &d"4&p<)<)VM5\B,/ck$t3uSLՅ;m?#^9[8%RWi׮e"~)J}4^A[ӗ}cy1'<\zvXtd68G'-K 0/h25n`@$eq@ DZ(j1 ws.ɚŏR;f$.lx.6$8ˈ=9kU}k2-GiwtJRώIh_%p t^GSBU4RQ|Gq}-yJ9VmW3NgfLc)k~zr;ɊUcMm=C5iF{{jlpXY  ̬-&ݕՔP" Ɩe-T7챎6-"]S|x4Mxr)b ' !7Lf ÕY6/葄 (OPp2]NypJ70ʆ~_N6sCܘ0b ~}ǦX/ip1p$ړ݋9$9/)H) 5JQҮRxܨZ|,AV ƥ)9W|\ruxԎ.[>c  SmbT~V$r㏋l&&mPC3 u7BV<` 2kAN|oKy?hheU JInDog[beh́i$/s oCXT$P 睾k(1սoK^ɡG!@ BO +}2Q_x1x)b '/]!x ݠ`"pL }*Swn̘L4ce, B1l^vc;9v?mh!y(-YMB~hnO|G!:Ӷ^2E6?Ti~x,}הIJ}IkĠ!7مۧV> ߫u^8D+:-%f_m5W2/קM$./Bw* n (3 e MC^)Bj;'a^Ic#w]'?PQ|1STMa/L7 !쇿?!Toi7*bԼ3TD7!pC[}? Kc.q-wHn\Gqr =y+ Q{Z 9Z5E9AaB>,iITæ1٥}?ql=)[4$mwd<-:̼;CgnkvC 3hLQk@|OĎ<I=U{ɒ=)7C65&<[ -ܕeOG˟X/6BG,ҁRo~lY+^m|]|c[QƋq.hǨKZ=e,M%(Bp8m6 2DU6H(xl`-wN;Uohԕ~ZM0#58t?3 Hb  +ohYwϰY#9$@18I΃"r"Waizۇ VՒ=CqR}(ƺYqu'5|="9INo 組ؿ>!3+#Qa+VT^~*Xu5NJ~adW' ;Th4Zʸ%E~07DK߲N+?,&JFj,*JrDT.ZpW"wתa_!~<$Vϲfl|CgnmA[+u@@=?XJ{j4ctAo^ztFJm&k BEr ,ɒ>%i4|/{Q{@Y_NҡZZNi{F3fk SvJU2bC7V[,>ʕrRߝ~t0_%Q$)dF;Bj"oL5:Mso~}d&ENDYְqg#$EH;u( RcOl+@7 GypВ+GQbY!-80 >7g@ۖH zϋrrl9Յ+35Gn8K+S3c6dmbG>d+Of(@ݗ]8c@u%>PSrz~L𩖝+GC4;0LGsW9R(zCep5Cz#W:l7rCn)ĸ]"jN/7P Ϥ+.woa>?}KE頣 ,QLmNoM?\hy[!rTC5(fxYٗ?⛋LF`7@$tg4@A{n~"i\D/NΙᇉ~+qssW5JL|!ᩗW|j=ʒkHtX=JICy5wp(ϯ4g>8![ 6fp:j)('8k9OTMb.Bd,svsދi7濧g=CzAYsN75d`Q}r3{,Yg m2iO[T[;{K`@T Z+~yoe;{-߹'KaL.ˌS4LFߨMk`p"TEDc?`Flx1NjZZX #!MCsʨ F,p8xh&֦}|*?r7#*'P#28WhiWCkҥ'=>Ņ A1{#gsjGO^! ^:TVW&0 V(amQ6%"}*L7ϗYKSi6$$z[B.B7@nݔu\:£}L|,SYJ&ZQdPҞ~;B _VO >*~zn0{ep (Tq?LdL`pm6B ?BrGAM4g~%/|U;ަQQ^'*N)c&|U0&i@6oVM[YJq|T@`>?MܑEզ%Lq/:Hw0M6%d*q b|x>VԥȰeIɐ_N悎)&6>0nJTW teT͠(s#[9.C3 vYJmP\#T TL׉v7]Mm6r~^tL6;+׳oA=\Vq676hpJZ "};Ņ^y1I࿘тyZf.R7pLh:IS`)?R\kPww!'`Ͼ=]cEi}h`~BQEl"~n]3܉{6;}&|BAU( Ue@p95V:up dfV!>}x۹QB{G4.q3ZRGl~_V'gVl\`؇ߺJWƀMW_% uqƾz7wwɫD S<%H&,̔)gϕ) V B{l/#-*PUO4E3v'z'z E0Y1Z;R:3-6o;՛-R@9ϑVo M qJR27f_>8S ]RtWfV`^6pz" mwd7$BMsMV!+0o-ʹ2;Ļͤq4W{K(i_gVGlө' MqGrʁ'YKopiZ[ym"ub汼)K"Z+}+M୾Ѿh{'Vl$(@YgԾc2ڡ5ƍ-+RȆ}Ƥ;;!tu}*edsZ/n/.$^3Kb>^Y u]>Jk ! KD29#=Y"C msl+ ܡh d (vjh~}@LU"A4ԪZa揂_ą;L{̹- {S wAF=؂2eЏN߿"*Ѿ1]1)ߌUh`$בs"]aDA cww頕ùoK;lCDkSqinrSD e*^J)l2sU5Rڈ:_31Vmjl|#Mr[$ Iu+(9*zyQ7qГQ X`(u`$Ήl,8@XOH5{DV3mC|<¨UYA 5P>c6QvClX¨ifgh 7UFdv|ܿhrBQU]Xi$(VF.t &r@=$Ae8UoԚ7ThzETtÐ HXc͗[/FMgǜc>  h{ǨP6ixZT? tQKoarM)/Jׇ8[da8 Me-L\6-ԅs>?moa2=|Vn_ddq24KAqw5npB`w&E`8ro!"ye,[kG?). 1>7 lv[cH;H q8fBx+4|g0/}F^}ZVՅBB?|͗{E | Qq5 < /p4H}T9L(q~NP̄i 5SW;8RJ0CdM(*:D=nԘ,T밀'TŘ#$ IHIMwp#kc$=1-Q1D^h8ۭs-E &'QPrxu8_Uiu!o0&!(Ֆx8ퟻ>I3PYCٞ{BLoakI;;{@ל}+|6._4Mt`lM#F4se"UTY ]w Cxj˝1e85*J7D\ v{e ixB%n?{׸:&N"rͣy()LS By̺T*{Q^t5lDAc{h %Q@F\3QLCr3O0 ML>n8wrü"Jڬ 9uVOlЃEc_*+:{NisE*V,(g#,Lj͡Ǟ+cѰ)@bȎJ3L .Z){8F)\j6w2@)4}"DKQ],/e'B@,7,8%5ai9ߌ'gZwK#V!މ|EuV _<69Re?$JFW[58nA[ƕ#XPTMEr!Ғ (,v7JʽbL ?_+7izjG\˫P\mH.@\ND1f7-v\:#TtZ+%Ө/%/aCE: g9&],ui|k%+6w5[ü2 M hM}Dpz('4brP+aҢ2sF莸-|IZ,Xd) Q_#1eulUa |9;q\E{wHp&/C&oaj0?7\ӈ"&`2]ŮϮ JT@pP}qy,{ "kQ~#_#7,!c׵q+n Ar#nʰ#Uy-T8W (}rn ڮSDQR=.8Tuj8]PɺA\4%|)t8늾id.KēKL5ZJkI ֐|)[P~Xg[G9ꩩ"_@g@3@^ܙN%0\4x,BxGNު-EoS%K׺UKw^jwepM ORmߔ4H7,{SF_2튞{ k7٢7|jWO~ Fo|tߪ>qwE :`?X6.!p`\JeE>Dλ8k' vV?͍عAA zJsm"I'uR}0EQ${-h*0v8ˬG\0s3BSH++"kt.,o\~eWФ뗶|*JY--ՠH!~iԕ:+% ngYJ|`ؤq' JMh`=@^;i=mq7s|a*r6i),gܸ֬W4F&cG_YCszݝ@wm\?NYuߞy Lt>^w ;xIuXb"`t-W%<:^ؽ6;d>8}O,ҫb}f%zuO׏q_ PvR 功mq.䳡=J[qjb맼qW_>O:!_<%1 BKY$v%`3@rF v#!8kX[ѕsN{ |O ƒ&5@."QrVV~I\:!c}*()낽J!KZAȡ6pQ9[8{2OqQ@z4\qM=IG3%y8=]DVHRV6}*@Y+3a)KMw tDЕTMtO\L/^,O3tܵ$vcgP m\:xjEc'M2=jKƽaN儕tYr&C?q\Hj|1g' *4d'qFN]xobR9.#rM€f 06^(soMʊr9im>Aڙq/xQB }hr0C(%E8-Wetinz{ lOɠ)/umebu4lގ.[ᰘ%rr^_< se]9!.zD񺁻*A^;ʵW/5Ǻ+N0. i3t4Y̓ܣ6Y6S)L^\-=ChD{6Vǣb=l0ͦs)o|rni* 6Wu'.,b照8)<"R|>eBhM0=yV~9_3h_, 8S؏0YOR"#וصPg θ]&RʌF{6I15"D\[ O:u$ Wuײj襑Z zVQ8PuOgߡutʕ|dE v^:̯}{u"?xyٛdo8M+W0%& y)#ْ0o9p5yRPKUi{hkh.Ve$%'UH{(EZL[ 9c: OJVC5DmObܟ ԂɁ;!PUy9ZX<8t*D~BƘ@UA=[=Zhﻒ!9Vh3gz}́gNVD$!9XJ1mAlbvմV}*Hm,Ϥ@K?%sbpbs^Oo{քZG2URcUuXM[k%'90jJ$e<('_Vۀ=&+qI jDs <~%cMy!@vwFN5jy(%YzlƖԡL3 N_Aud x7z&C@[53h,sDԀ?6`[YI (E+(ZjԷU.'{V<ͯ HR1,p{&F1ʄ ܕl'Ra1P4&f:3bq[C1ޥ.^|dw]ɼ(;~lN;=l?XmXL݃n#޺-xwHQw vሹ_O=q.p`~]-R]fb s$˷n,"wi+/_ET-v.![6=t&v G{VwKT QN9yL^_M,UVB7#53M83_H' / 35"]xX>^#Hy?X`.Mswy6ZՐ.Uߋ6p"M'e][?%KjȁTvR+qxM}[yZ6Sx_r=.Irɯ'"aҴB85oiܶ*@-؎h=ȑ FN. ) ᬘgT|U6qy*&Z\pf]xona0o3\n(O#hDLI==ԉ>7JH9܉t!9Nu))(*֕l]!iqla{f%JAeee?ғf?͐] xT{PBs KˮL=Ow34"˔*?3lL`G 1&\ O;|һqR\-&IW z--7g^c_~vܗ}MH:Ŏ+ k:SLfr#MPv-Xʃ*II{:y>}_p$Sk:E(dCHC>}]^l) qw"?cwU-b&O0ͬB\/Jr_kVw`dcvCdj/]ગH(ȘD5qǒXiE>@:TB3$ystM+gZ x7> tIeŖ1j~MTwY0"c?7FʡƧ%IQ.WW/;vZ"(M "5W$nF3K-V( pܰ8 o]¾j۳=_@˽ {_)fc9pq`Wi&+{ .(>b&.:oQhuAXc;  CvK|O@,I <;.)َ]/#w_̎F̳/ː.)&?ZUU`aߐޫN"`tuQ<%[BgAhKwJ7nE<@lecwGJd`L9G0Ww?(]7&vs;U_oĕL1NӠ 9-ʽAT:%M&>ZBx׾+J]/2;l3Vf82tC/wvw`O$?XlFHGr|s]"\VySv.t |^~ӈ h#oo@Hk osC&Tׅ WQO[4Pm8׸ThZ խ.fJ|]pS"Kc#;T!D~ i(J] 3<:MʩB wϓ?J&͏tT;1Es`nִ-lRLb!L_)%hɦlX;c^髰|x{d^$$<\CH=\J B: OFpG]E[UV;;>t I/y-_}Ziicwjw],R ;mga[F+BFEϩHHcbH*WrWWމ֟^vl\@bS̲cn5b.N&oyJ8{](s0M*\s#!/S`اQۏ_$H;(sp mh`PFo/bFIӨ8haLMl!qAS6+ɹ"a(rZ4I mԚRgJP0ɝ) 0{:WZrSz(|AZ*_zC\sŸQ[!l񬋎/󫿾\" (]%/iYg.ѽ(q|YZ&s &Q0F`MݙzjT $fBCԳ {z *+?XzmŰeRW<ĶY~N;GK=x"3Ofc3{%I'(_qvp.-̈́ցMW7ow˓YQy1iwA}/(ɁwjoKT3MX Ȓ _iL2T+k?(f_ Xq\rt[2Fk`yW$uFDž;;c~ARa$; 2`JzW/6abQFq&`꺏QJ,6'XoCŷ|ؑcI( a+'^eT uX#V ʩ#sw0 ?'SbBB亵EGD)cxȭ1MzgmӯiZh@W>)bg[1Uz̒#&6^8 Dt %՝N-A-5>kB1M^%Tjlr!a~[;M@#MRY@Y N&'#SgVr aPS^kܪ (|_"8Q)zUߝ Qi3/'ׯcbmqv_B|&c?jz$eB|t 6BRs:ئs*Ok`"+<0ⱱc N (j&8Y܅R0px#5n(I`Z`c8 oav/X5IOt},чuԕH1a7xm=5b_*_nrTHlS>}NZ1 =/?f۝?C@6M*f1@ST䎋Qb[!\hEQ8IUWbK. Ykt?B,՗, ۧ69|Q *:55=ӈُ?RtޑWy}#^Ka~^`ǡ8pD,Y8f=Ny3#ua5$K:HyR&p28$M9qiZoc)xRf-p}8J!/ /JHtet5LUkivP&Ы]ISm# A~1l¿vL~+]{ 1*8sw;;-zEWr宠AҺaHHb~oYZXF)辠ښ5 'a;s{[Z޾#d C<]Ⱃ5Swx=PiAGDf\ RVxBŔN$Ws\@v+FB kF2'A2Ng5g -)Ӽs.&L;@\qhL ڴ(Sfq(:S04?%Ͽ2)0A">%!ǞJSe04 jVڐa:Zrefai’(ELKmʸ*T"`մqz7/q|A^ :wCX=ܲzS+! xjeg,|DN\.UH3Z=TD)ZP;h&9K6?#(shsxSmVfMoFp8gKR %4e\ tk6 vVFG,&[%03U=Ϸkvwi T@ڶq#;]srhuGzs:~hBȔ-g95 dW6/u(wގ”A +@}aw'G Y~QWM_Q` 4c,L|Vuv/+92*whi e`6wяS^"$ݔAuyw__FږcL,(\<AZC8g~(IGC2.hX ] +Q_3)[F ?w^̕iTG3*5~Y,4Cs .ۄc1A#wFɽtvkحg@{+ $amJ~b|/]4x k}>7I@/g E5Ipn][%67QTQA)P (jo\ZJ~ T:H.둴#1b2L͂xW\E<@4?z Ӓ2 1vZ9M\䑛I r+XϝS.O}0L 4z"#hÜ[S|B_U?ط|^2mh{^ Q3GMռ †<z/HYڈdBGCE- *EYyqF#R b̠#U;U?&6qgP<*+2f;][x6az(4" v靊/UK&Ę^Sz#֍2O"&Oiפ tt$SM܇B$1?=RQcPOL<"@U:(J,fSyͅYeuh\=@ȝ5M# 9PV6_!|{w%{yll.'liQm{Oߗ$*wO9g)cCqs@c#ۇ/Luc9DnWZqy)9M ƧoaK1M,Z9,Y%+5 9R,D3XG>ftV95apAexq}zf/JZhbxzKeB}糆~WDY>P\ Ydx]AꮡF^=Ks7$LSSߊ&-jL7j'}ق;1[oq4{ƺ. ! h-dM :Q8f"m4 T?fc VBrgllc|gR&4v20N|p'7d\cCpLX58(4:#ZdeiSVDƱȜAntd⪊ JBuap_+(etn͏1D\>3XuI5hvBVRKꇼ[*SaUHF\"bj 9_y"7{^F9 0|*%srݵ )nd(!1˙x ǦR2V QF(b(JkPNkQQZu#R? DN(=O(VR0\$X}`=S| qEE_ƑAT߾axR#-0?j`+}=mRt OXxXZR802dW2Tni-9_vu ,*ՍZ蚱0q#S|Zڏ-.4Mǖt>5*.dk>(m_B y )(,M_!>.9'xpՅ]vRvnPH| \=I[@#Ss9 0Qxj(?pŢ~'!zhnZVL掬o\ }P3NJaak\;W81{v 9X"}>H PY$ *16~Hˋ Q@lȣ;W&6 KSQa.YƩN]Rᴑ&Xwv8swìz84t2Jnt()%0Qh]P ]jKXG c ?;) '{5*ٱuxQZu~6xdʭP0DԩS3lxuՃ]ocbV [3OBuo+J7ћb\d. o (Bw ZGo '6;`~#L,ⱦ!k-@^4uJ<<Y#z "DPp[Z|#P7C~ nkֱv"5hM$3ش+p9'$ Z|ҢOwmJ}r$EAcYP>FÄ~͗+\$}t'Ż)s̈́Jo/hZ>`!DYJ3p{륓,$h AFn`}BINf^QƓz@.\VK$ʥ .cy UAf]⒑eTBqh32Ń1-r?> dЕ;+za SbP4@ԔMA7Ƽߨؾ(ew_!ؙ7xNҟt`xJuc|}<^T|8Qxq_!!2ܵ, D+ {ќ~ȨêE0B+1 [|HN4|WQa-B=v{Qx/H`Hu=1ocڊ#Y{,~!i@n+brD9raxA ᐚD9- 6]ýtXBPyh4}'^PRp;5,q&6ЀN^Oy i;@CZk.TʙŊgu,3BUyQ' =· l[*0>VGKŖEL.¶,U6YL_aǟ/сmhn 4`* DN4*…{jM48#' .\y)/F~ pI2y:OF8`D.Ev ZNrR2~C-ĝ/,XMqT[e!@6V C Uޞ/Jd{GK.JLr,oGK ;epQf-j҈v,Nx\bzJh?^D SLFf4s:=t"J yd +rok m/9F1Hid_T!5\~pfG3|CűywkںZ/L70v\ī$nzo zH~X <WWU]Orc,tuYD#6U*\5e*VXܟG_f 4%=_tBgl8B*{ܩw^Y۳B(Ƈ['{M>Wjl*?^jJr!1aT g]T L4 G߭S UPݦ ^G߆9fG"3HbѨ p񹼋 }Ўx9!r&ўH?PSv8s̼VpL -gG'^)5$rZBӉ]Qn;eyf~6 ӥ"za:fN%q%Fa$ R&8҃ENegn@Nh~kTmyx}{E#q,s_'έ{f :CKZz❅$fCkyhTb/37j%r7?8a?/RF\m7sbپo4e M[[e])B*=nqX|ngm2".6gKiEpnSK*n~K7h,\ا͕6Zm#Ұ8w h}>-ea[cV ş.D<\=[PP5;P⣄Ls=#`C]c1D<3;\{ @J#vő)GJQi}Xu9q)<nz+ rza\LkKx&.I66gy[6e7: Oݟ>V"rU\Zވlerh~ety`FLo'$uݬ0r4>ä_EGkB<MIϔײY &;KJK (;-D)S>tU l_[zEjȅMwϻ/4X6szQ5& ,j7Oxj=h> @mrts4\:ڎ˥7]D{vه8LʜX&&λ\ C)nt@Gi̍4r<L9}3l%s|5Lݣ]m OИD/hn#~[uG\xa`F`:@I9>iy[-GէbAQJuslgx/ 'Ĵmkoȍ =ڂkZvVx,_N|Kr"J%7ӱhQA8y܁f # `Ж7o۞ӧ)ޫ.k4Mt݀TzA8CzD`cnk.;^Z=gs1 VE:46Z۬"Jq&g PR@:hЇOARjd+99@rzÃLrEDeR̙4fm`u,N|CTαk:L)]ܨEoV`ȜަpdCi?1!Y}(M!e_Q֮uEQDM `xn(4q_(t}y %SCei?-ҡ`Zk d+D0mD {-kN颗e)$}^bwZvFB@4CCRHZ/SuވPfuJEj+G̵<o ǿ_k P&RAvZT8 #wn>/0.m+տMu}CP ]Dz>&+U‡i Hncb5W_> N,=?/Zg0CoII?]#G+,a*d-FRCO -@I yGuPx3ɗf u`b0\_/n ˿A@|y׎.ob{-6)m|7y0ڽod֏+p4Sj'd3XF4)k1OUw3`NS!誽BQ\iyi_]R3w@ӭy=ζkC lj&}}PxtmC /3bz:e6M~ #JaϔH?Ã% %[vˊ@gW/m ~C'Ǝ4S7gx2S;sjOJ7H9Sbk̺/L=6+ tMIITl*9D&7h3=6SWڢ3_Nkp R#7} Ԙ25q ֯`֗.$ $?<*!qDQ,a.qi~WB!g0#!NFftHU$t`^9rH aJ++W?h ,EQ8<6`C(BuP_~3p@ȯpf)-Y[d{k 8@]Kvi>EYGc[F^w$:W)V"f(l23\fTe gX& uF}dj-H|uo %l ڍ⯯{&&>LW=gGo\VIU"da֌l9p ynS # $cPh yb4ȟU4prnv3~GPSUpUN瓯h |6I-bn(J\hk!ɪȎ9/.q!?u+lnd:3z_F=bQU0چI%Pp[(h23UѦG (ɠ yY_-1(Q4Jӟ1E)youw?]|GLGOv7氤ֶI/80}G/\F4H\U#zEOHd/(/Aq;#ADc|j!Vv7ؚy, S)(O},OƸw,dOG. iSL`8DCbY@_A&4"_ׯ>v52o=o%_ 8LHe^nX\ ,sGiԫn"s l Bppt+NE!O(')hbur6ƀ$ swCUx,=G#xg#k8#٫O{ wfQK_a샯l$)G %C$ Ő WDǬlֿJE/U.Cl2Бa:B#tdpgJAp>Ѡv9}rL@z!Ehhz&bNN6Cyo!b:yjHMy\ } U%igrørp:*=٢@t Ԣ0S_w5'4a^ x- 3Hfz^zZk<@j;VcD2Rpfi"4/l"GDž|2v=-]]IV80 /sx+[Ϭ%kNʺCDp//Z@Tkn+hazV`DzF6OJ9=P?kg-X1bFPv03oSk/iJ/VS%Rޥ J/1 H>.Z&mg5k}=ts>j]y84Z 4q],m8Fcn◵G~(NySDo|n[ xOa^GhQHY(ƒMD0Z Ex Cٞ0aUdd)6|Hpca9un:ҫ; S\_ u5(4xU{[ 8VBڃ;[[Ocl:x>| DoYty3 I*.dT-8w\ԵycnC"%'tOW7<'/ E?eO}@l㗒[IVLf&8 ?Iy@Ԑs"F fao~iqFyP2ؠXxdM\@mαj 4A4+:,WF_Z\SRhh*w<}|[]5RA%n9u<y&<Ϧ:L NsD1`vI@%<$lz]Gfv5U3%D{YC5NSS?̚ꡅ10)8 ʢ]_FMp+tɚ5>*S);b9u= i܆Gvn嚱l1\;  2L~qdrp`bd]IwzNࣼY#%xN=YÛb;ȝ |/,OX޼A\Tblu9G6$){Lz@Pc! 3G 7 >zV̮& <716,{ 2H"%.~:YnunYQ+ CҬݻpx^Hǵ,XL;FnbЏIh ixs8͐?YC$~ Y%I 5z5_UyQuHCqoQ\mzYPͬe FI :cynJO +\. p=:Kv~ߴnUb#&q<vLZO' тWPj^==[S2cRz6Be{ό)C9\=M,XB]E1wJ#)8,GR6kHrg r ]D-U-0[;2MI.rNM*9~Κݒrr. |M9~dycĄ H%JƉd?gʵ'pwf չ(gGԫ\ׯ(6ɥŚXPC~Cl> ?WI mH!0/ eFf^~CKtFo~PkrdxnuJ'W4/_ٙFsz~xxRFz߽B0m#-0ۦ3 y{zÐh@n$Q3nߩcj+o{>** ,{-n,ze;톾_2͵k<#^{9dĚnxGGRa/.v n$6կ컻ԒCq -PjκQw;4CA!x;^'i@R]̻ !A H˘zXS[p]Umb1Ki@_7KSh{D -d3 P y ߑ#Ρx_yA a!E> ATp}qH׊ŠD6֙WFAH,T#!>yH sr#Yj/kp1L*?o`!Cֿti33LJc+hgG '&YxtFN"@WIP&=qAZ5U6bV&mi2oWQii.⣐1OV%\pށ6) 4Wlػ.ƴ` Rwܕ06 u2Ղ|&<ԽقoC".aqck}s垪 3kkK tu5(4/~V]Gy}1%x9Ŭj:;\RSg LNEwQcKΥ4%Z4AҪ(QX߀$-j-+sNcuVXh/ח $R*JIV5O;{hb)/O1 xlTMDRr'QycCڀɗU6M)Q.&9l9wI-+hH23Q]g|t DQdfhƾmv7;}o ,iyn_5hmoMw`Z@<h50oɺ`gښi4h)~d/Uh`xژ۞':ۈeqICFVo)j4ql8}XҥXEwlk<;sEj2_۪l/\a xp@Ol(=fٜAG1VD9ATY6G=1Ǻ!CHdμi(,JVwXwڧ@ iO*?.`Hϟl@մ'w wwce/V"R@gnD-mjB9=V 'lyp03Q'U.2UIH Т1>g^S[^nQZ1wy2NsM4 &iP&Q@Pwmo%ofveѶ7+lR9q%dJ_0S>]ERF/L5+<dP[]7Q!!ݕ.kU.djfo' x+gG;nc O*j7X){o7%#@Pxp7}8XK 4#-) )9Z辱)=2I*UV6PY`KABek63i]dhO yl:YlWB-rJW!B3b{2/zt,t$Q{,^4+|LJ }ӵ0q/f乒J&_lLH`Q)dM g똱' djEoA|OR?ZiZ΀bw*Ӓ?!u;g=ԁI߫֩5ڿ(IW`_W4:{4|_E @MAdJuDj~Ѡp5yFPb M'?p[a套ԁA՟H-m}OF2eH3^MbrV!Fo aTDKl0^y"slǞ/ys#v7 _q]qL3{=;˺SISΣTPx6q_}V7'K+!EFhSVEZ U*Ϥsyi*T-JǐM4Bu =0iӝu"aŒ&ݝ{ TNMm,-g|P~qrEȹf.6> A rz y'aHnY  'b@DJog]œІ፡2GZwFց J\2->B"a!&QLZA ԒLg4OAӃ_`ܰ2d O|,t'نw3[S*gztA}1a˺ ވPQ]1ȑ&?#$/"bFth5n.>A} bIQ#%qf2;y[]HQu:|xjn tKG e4> Bx 4 ú4KD0}2|vl%oݯcBS Nq0Jw&CC׭ )Ö퓺6=v~}[XWm>or()6n=T!"Ǔ%?iK9$m]Fx,z=݀oF&>ԩ~.GO)u| TЪָe/9؟k|SZPVc@߃~8q(ԨVZDX֊ev]S)ijKqi*_*| F(JKf?[Zxu'=eI. zsQm9N^ 3S =tUUL(59TôYHMÕ"у-&&9ڝ3syj-(m ;JX~"ezL hj"xk szLtZ J%yҗB iskx|Yt hxPWT*^z›l[~>J6F~h7m?}i W.| [)X+`5 E;"{ڟ Fa;?T&fbJ^5/Pjmqkz跁PIcd] nPlCU-4ԗkcH4C'R߅u,o?Wl&p-5=Hv Eέ>@H|fł[̘^+x mJX:"!xFs @97o~^So ,``<^\(f;Ip+˜2 b/ [TOݫc'9yO SfKDT]\GN5KLAbDcפAu _\1Ӹ Êk΍->Z 'OvTF<_~y^xb3gLЧ_T*]G4K $J@Np.595lq{ KL)7@,=By XxcC[O Vq1I;>p>'qfy =X>JwW)^ aD/ NwU#МlS3̓!?03$t_ <+{27o"֐P_-69x*X`bDVˌGqb;їC\&k;Sevh9sIS ǝ`fC:в>A5|7HC\eV&gH]Ci{q#n@Ă7j}9'$GRzu -U &槫`8`Y H=kNG=. *)YKZ_W`l/p/%#y^ɑKٰ氠"q:-6 xXeu;s=={ i-?u?Lm DvsgAwh>j%jK e)f۠Ef]V: *X&DR9@o>B~}f7S9r<+Q2+#Žn ޸U}oeWª=ƚýĆ p7| GZLIU8J+. 4lG,ëhM8>n1L OǮ{RZc4m?^ϛ|k Mk\yڹ!aj!۫%Q톆N#}Dy-"!pIR^S=e\ JÊZ#mBRJv>@1󀩹ޝ=Cr+ Ļ9,Ed*?xm;!$i?K64*We+~1/&x2 y!/LП߭H|6HKi 1j ,Xۍ|H ` C_ <{h" ՃzTᡭ}KLqPmswW!O] XMr{Qyl<*M#7BkRhFeyj C5neE zGr>rۏ ST`TI%F̓ 0pK2P,ܻZp郫spvVo2[rql *:|#z2>qdK*å1Rg(79o@)sR!Y~7櫐OdǃԀ?`Q]Hi po,hl5B$ 0\WQz%ެÿjr9$*7HgIpEs(+o?T1%S*z1TS8Gڝ.z=hݦjSK&ݑH,ϬX?' KRv-b(]~-S[FjHVdIF$-;"a^3-9zjzo沙fnc?x8cQz@U.N74X9+c쪥r|?(d8>t3.&VQ3tNzKdΗXP ӉqExKE}[D:rXHe۾Hc0GtːC_|{)WHA\dE_:kЈҺ=wgghTߪX X@}Zآ0ϕ=Y'> \z/6sF$ mG*C7) ~^ 6f/toJv"R$~n(4t(":K˜)eŚri 34H~|wk=eX:^MeeL D?Tʭe":qB8&s7:n{Jŋ*c~ȓFL?IXEi4sg SN٧Ba:=}Og1{r^00ͽn+j6 Qo|,e@D"B+ۥ9h'AW`!@z{ ]JY}Z,m D3>vLȸ<< XA2 ?ՈnD8<].~@ x]F5OBqL;"zΏjӢ%0CDm[np ӋƅT+h0k;QfIaϫk˃Dڝk{_ M _S[{Owg<-Yu/c۝:bjWLVqg> Vѷ[f"SQS*W_as!CGe ~P=2H3\1ف_"j*Cc:%Ph7/GĖ3:=EP)oOZt'H34w'hz1H\UTpFJ`J^ aHthHZ_0?A℥ %_)Tk;3:} R.Q=NkJbʇMA{=bȇ]o,qY#fr=TUCعmk*LP|*ɻahX%_6VZǓ^$F)Vaᛥ+4J9_Q@ګӝokp3$i # (g_.%eRcʫS}ӣp ,]թ#\XrJ|},eiI"4 4Qc9$y`kwV|{ԱLj&1U)2=Y\? xctlzd-vx"즞.1ߢAM:󘎣 stCTHGC2/D'`O)jɚriFL&>:ٚ~O<d%c-{] $A//0DO8^}(w68~~}ѯA[aM͹jy/Km#v}#_z»boVƂ6hګG_et)泩iҭsՇٸ!vfT !fXT&Y]u8>,cXŨ7GтS]a4Gvdl%#xˋs78t'"w g&~;ɹobpLpk %X4kG oYD bC+D`alwvf-t y6r+]l<޵;I>W'n{ ~ב$= 4qD]wwU"IP\mg>ȃ H8*e݁,\d-?&o[hbݳe|>bU`5X8vϬf1VG&BT+d~*; Xۂ{/x''vdJf 9ispDQ8,?%2 (LI'eYAQ*'vz5ؕsP,|H)~Oh5}i.™J8PTA=]|k.'Vw"\fUd@zb{W]eWxAEtTƃtkZ2Nۈp[?XSyWO5n'K1SzhWZ~IݜidSP>_^p@U}]nK =p vh׺\9NKҀR>$br|MY0'^~Ë>0 YZafex/data/ks2013.3.rda0000644000176200001440000000747013664111747013704 0ustar liggesusers7zXZi"6!X͈])TW"nRʟ ,bA5;=+ӧ{]\g~⌻Xt_0%M&P뗂 3Aa]bUOKFW.񴅩5k"$Q,;HHisӉf-ý{3B Ms=RtҨHUe68uډ'վ %()!Ƭ^D I3cW G])S;j>%iJ;]Y ԭD\aj} ܼO kS5/RۋnE (n@y{6~{V5 6z<iOėa? g^u-pjMhK.T?s %@@gXN ez7)(XS2\00"~o.z *FR(n=*O/҆|N1:y9L(2% $45Z$fpL !. iK$oMֿ&A9zm`Ъ74\V!r,!oORȹ+{l!/kct Ӯ?Ԙ@mr{.BOxoǤ 8cDWt"k,_T@@ L`R!l j@: Xd"#h#?oHG&AH&ڞO!u>} paDQ:%pyÍ^{eh`;3h+\4!"cXVү8 G}3+W{y_`p$eMm>gtδ_ 7u?p\#I}4&MG&CX&tO_?RAAօHSE ]y7 B8.kTO>b+rUㆿ|FYIvE}EmrJ }Ewse$7U 6nhpF* EB}`yQ 1v()sMK}Iaw>CAR E5J`2= /ÊLc_ȈӵQoU~o7B%NjS|w&Lk@WTs3$( W3`OCAIVHxusB] n5M Bf^V%J]Vd3_}W):VԮLdGϱSRH5A>_xKrf%ʄP* A\){޿!k)ٯK*}-3lN1GB`R#mkg{8~P,([AJ%V]dyI)ok☧܅p}#4^[Z9Ujg~t̤Ml)G%dob+=t}Y5X!9QR ܊gj ?l(d\s8Ҋ^ ³ DCpMM#?jAIq@,X5PkG5i ٴ#U۫ sAXY8nb)Xڹq2 jc dԱz1˳p1cŮVbq,ۏ0VӒ}ӻ˩TLPb&ky7 tC䂆o$!ý#14/7ϙ/&(}V5G, h՜;0MR)c/=2. BT\AS9(ؼtO1{t]tQtzy4!6#ڿ<X"/IvT#?lhdh$)d-̂ꃑId{K:ucOV Gc=BǠ-BS2@G[#-J`ˣd3ed)?_mNs9tݹOrwhOFeAD*Kgr#:=---Q cė(`s"wZ9I>eO 7/0o"#U~: '}.P4- CCA|S^1yET hٰ^>$F޺gYI~=ƛk~Mn{$CQPy=+)q̨24!0׽l ˼ANxIt#6sSlFKb*Giy3# RdM>0 YZafex/data/sk2011.2.rda0000644000176200001440000000460713664111747013700 0ustar liggesusersBZh91AY&SY(wߠ@ {Hϫj0y<|54dM44`<yLPh j R!ʩ@<Lj '=S)S!M4I$PTdڧ P4bP TЏSOP@he4g3Q62=&d 6Y{u=bܐh-#r&9S]zuVӪ>zm&EJJjB$` nq^/s4ٚ05[ak3QVEfi"JQA`c uJEZW@hJERFEZCeՑ$e xr$FTVYII3G7w)CjmR.:5}^)Ǖjݐyd%!t~3/[Cϻxrw}_Wz޾"2 s09=J֋^Kxnc.LMrst|vUN44nBu!tŇWUߛL/PԾ̬G)]fi[َ)E^HcIt7T&SWv 55PC%-r˩h{ @ц6$ ǎ"+`j8剏#pIfU(5 6YKQC߬r .LSZTƫTDӸ/^jh nYA0+yj%=象TMeNw ^ }Wi}tY\ T3츦n%ғoWH*WԼE 1EPH qFm!ڶPӌtأΨ&rʳGTR7hw?^i1H7Fǖv  =1鶀EpF'U|;Z2(p]fApO<&& "^{g(Epa%t*b !! Fk D BCUMpvQaŹg ^=:DIeՅxEPr|B1#PQ(sն"䴰DaSկzZBBs=SfsYPQk[6o"ɓrմîb W󲳶c(k[VהWnBI% ̏N7 :`^< P\=d:`Tf-#P! *=aR7ykF7Ypo]1x S  =훏!fJH>8%Ǻqb ArM"-Q{1~h <0ff>|$I$I$I$I$I$I%79ku+]a g%>IZ1` `0(*´B3E XI!4QKA$J_bȅBZ-Q!j[MD TZ$9nHZxhFb[%5bn 7hқW{1\%>٨ֵ4jZ4PmAm|q fEs 0` $C$I $H3I$0kZPkZAÂB|:!,yeb-[%2YH}VN|!U Km-DU'G듛}שۗ~aAdRDBH[lZKb["bLRbɅ# e7Vdb[@m(&t$ @N 0ImWËvQ("YhCejUh b hDdXYDN 0li]:il7w^"BN44)뿅"4ip!L A5 C^Iַ$cVG87}f_WLSNh4xpTB ),U62BE7  F)„@@afex/data/md_12.1.rda0000644000176200001440000000054413664111747013654 0ustar liggesusersSNP̥MLHWM\p튝M( u' ~'%Ź)ƄI93s!{o 0Hm$b6`2yҘM ʹyҔZee3V_@s~Azn4>Li{etWᶝ<Ŕ@IuBQw{&YB>㣮/G6?d*ïafex/man/0000755000176200001440000000000014076067000011750 5ustar liggesusersafex/man/afex_plot.Rd0000644000176200001440000010722314076034135014230 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/afex_plot.R, R/afex_plot_plotting_functions.R \name{afex_plot} \alias{afex_plot} \alias{afex_plot.afex_aov} \alias{afex_plot.mixed} \alias{afex_plot.merMod} \alias{afex_plot.default} \alias{interaction_plot} \alias{oneway_plot} \title{m-way Plot with Error Bars and Raw Data} \usage{ afex_plot(object, ...) \method{afex_plot}{afex_aov}( object, x, trace, panel, mapping, error = "model", error_ci = TRUE, error_level = 0.95, error_arg = list(width = 0), data_plot = TRUE, data_geom, data_alpha = 0.5, data_arg = list(color = "darkgrey"), point_arg = list(), line_arg = list(), emmeans_arg = list(), dodge = 0.5, return = "plot", factor_levels = list(), legend_title, ... ) \method{afex_plot}{mixed}( object, x, trace, panel, mapping, id, error = "model", error_ci = TRUE, error_level = 0.95, error_arg = list(width = 0), data_plot = TRUE, data_geom, data_alpha = 0.5, data_arg = list(color = "darkgrey"), point_arg = list(), line_arg = list(), emmeans_arg = list(), dodge = 0.5, return = "plot", factor_levels = list(), legend_title, ... ) \method{afex_plot}{merMod}( object, x, trace, panel, mapping, id, error = "model", error_ci = TRUE, error_level = 0.95, error_arg = list(width = 0), data_plot = TRUE, data_geom, data_alpha = 0.5, data_arg = list(color = "darkgrey"), point_arg = list(), line_arg = list(), emmeans_arg = list(), dodge = 0.5, return = "plot", factor_levels = list(), legend_title, ... ) \method{afex_plot}{default}( object, x, trace, panel, mapping, id, dv, data, within_vars, between_vars, error = "model", error_ci = TRUE, error_level = 0.95, error_arg = list(width = 0), data_plot = TRUE, data_geom, data_alpha = 0.5, data_arg = list(color = "darkgrey"), point_arg = list(), line_arg = list(), emmeans_arg = list(), dodge = 0.5, return = "plot", factor_levels = list(), legend_title, ... ) interaction_plot( means, data, mapping = c("shape", "lineytpe"), error_plot = TRUE, error_arg = list(width = 0), data_plot = TRUE, data_geom = ggplot2::geom_point, data_alpha = 0.5, data_arg = list(color = "darkgrey"), point_arg = list(), line_arg = list(), dodge = 0.5, legend_title, col_x = "x", col_y = "y", col_trace = "trace", col_panel = "panel", col_lower = "lower", col_upper = "upper" ) oneway_plot( means, data, mapping = "", error_plot = TRUE, error_arg = list(width = 0), data_plot = TRUE, data_geom = ggbeeswarm::geom_beeswarm, data_alpha = 0.5, data_arg = list(color = "darkgrey"), point_arg = list(), legend_title, col_x = "x", col_y = "y", col_panel = "panel", col_lower = "lower", col_upper = "upper" ) } \arguments{ \item{object}{\code{afex_aov}, \code{mixed}, \code{merMod} or other model object supported by \pkg{emmeans} (for further examples see: \code{vignette("afex_plot_supported_models")}).} \item{...}{currently ignored.} \item{x}{A \code{character} vector or one-sided \code{formula} specifying the factor names of the predictors displayed on the x-axis. \code{mapping} specifies further mappings for these factors if \code{trace} is missing.} \item{trace}{An optional \code{character} vector or one-sided \code{formula} specifying the factor names of the predictors connected by the same line. \code{mapping} specifies further mappings for these factors.} \item{panel}{An optional \code{character} vector or one-sided \code{formula} specifying the factor names of the predictors shown in different panels.} \item{mapping}{A \code{character} vector specifying which aesthetic mappings should be applied to either the \code{trace} factors (if \code{trace} is specified) or the \code{x} factors. Useful options are any combination of \code{"shape"}, \code{"color"}, \code{"linetype"}, or also \code{"fill"} (see examples). The default (i.e., missing) uses \code{c("shape", "linetype")} if \code{trace} is specified and \code{""} otherwise (i.e., no additional aesthetic). If specific mappings should not be applied to specific graphical elements, one can override those via the corresponding further arguments. For example, for \code{data_arg} the default is \code{list(color = "darkgrey")} which prevents that \code{"color"} is mapped onto points in the background.} \item{error}{A scalar \code{character} vector specifying on which standard error the error bars should be based. Default is \code{"model"}, which plots model-based standard errors. Further options are: \code{"none"} (or \code{NULL}), \code{"mean"}, \code{"within"} (or \code{"CMO"}), and \code{"between"}. See details.} \item{error_ci}{Logical. Should error bars plot confidence intervals (=\code{TRUE}, the default) or standard errors (=\code{FALSE})?} \item{error_level}{Numeric value between 0 and 1 determing the width of the confidence interval. Default is .95 corresponding to a 95\% confidence interval.} \item{error_arg}{A \code{list} of further arguments passed to \code{\link[ggplot2]{geom_errorbar}}, which draws the errorsbars. Default is \code{list(width = 0)} which suppresses the vertical bars at the end of the error bar.} \item{data_plot}{\code{logical}. Should raw data be plotted in the background? Default is \code{TRUE}.} \item{data_geom}{Geom \code{function} used for plotting data in background. The default (missing) uses \code{\link[ggplot2]{geom_point}} if \code{trace} is specified, otherwise \code{\link[ggbeeswarm]{geom_beeswarm}} (a good alternative is \code{ggbeeswarm::geom_quasirandom}) . See examples fo further options.} \item{data_alpha}{numeric \code{alpha} value between 0 and 1 passed to \code{data_geom}. Default is \code{0.5} which correspond to semitransparent data points in the background such that overlapping data points are plotted darker.} \item{data_arg}{A \code{list} of further arguments passed to \code{data_geom}. Default is \code{list(color = "darkgrey")}, which plots points in the background in grey.} \item{point_arg, line_arg}{A \code{list} of further arguments passed to \code{\link[ggplot2]{geom_point}} or \code{\link[ggplot2]{geom_line}} which draw the points and lines in the foreground. Default is \code{list()}. \code{line_arg} is only used if \code{trace} is specified.} \item{emmeans_arg}{A \code{list} of further arguments passed to \code{\link[emmeans]{emmeans}}. Of particular importance for ANOVAs is \code{model}, see \code{\link{afex_aov-methods}}.} \item{dodge}{Numerical amount of dodging of factor-levels on x-axis. Default is \code{0.5}.} \item{return}{A scalar \code{character} specifying what should be returned. The default \code{"plot"} returns the \pkg{ggplot2} plot. The other option \code{"data"} returns a list with two \code{data.frame}s containing the data used for plotting: \code{means} contains the means and standard errors for the foreground, \code{data} contains the raw data in the background.} \item{factor_levels}{A \code{list} of new factor levels that should be used in the plot. The name of each list entry needs to correspond to one of the factors in the plot. Each list element can optionally be a named character vector where the name corresponds to the old factor level and the value to the new factor level. Named vectors allow two things: (1) updating only a subset of factor levels (if only a subset of levels is specified) and (2) reordering (and renaming) the factor levels, as order of names within a list element are the order that will be used for plotting. If specified, emits a \code{message} with \code{old -> new} factor levels.} \item{legend_title}{A scalar \code{character} vector with a new title for the legend.} \item{id}{An optional \code{character} vector specifying over which variables the raw data should be aggregated. Only relevant for \code{mixed}, \code{merMod}, and \code{default} method. The default (missing) uses all random effects grouping factors (for \code{mixed} and \code{merMod} method) or assumes all data points are independent. This can lead to many data points. \code{error = "within"} or \code{error = "between"} require that \code{id} is of length 1. See examples.} \item{dv}{An optional scalar \code{character} vector giving the name of the column containing the dependent variable for the \code{afex_plot.default} method. If missing, the function attempts to take it from the \code{call} slot of \code{object}. This is also used as y-axis label.} \item{data}{For the \code{afex_plot.default} method, an optional \code{data.frame} containing the raw data used for fitting the model and which will be used as basis for the data points in the background. If missing, it will be attempted to obtain it from the model via \code{\link[emmeans]{recover_data}}. For the plotting functions, a \code{data.frame} with the data that has to be passed and contains the background data points.} \item{within_vars, between_vars}{For the \code{afex_plot.default} method, an optional \code{character} vector specifying which variables should be treated as within-subjects (or repeated-measures) factors and which as between-subjects (or independen-sampels) factors. If one of the two arguments is given, all other factors are assumed to fall into the other category.} \item{means}{\code{data.frame}s used for plotting of the plotting functions.} \item{error_plot}{\code{logical}. Should error bars be plotted? Only used in plotting functions. To suppress plotting of error bars use \code{error = "none"} in \code{afex_plot}.} \item{col_y, col_x, col_trace, col_panel}{A scalar \code{character} string specifying the name of the corresponding column containing the information used for plotting. Each column needs to exist in both the \code{means} and the \code{data} \code{data.frame}.} \item{col_lower, col_upper}{A scalar \code{character} string specifying the name of the columns containing lower and upper bounds for the error bars. These columns need to exist in \code{means}.} } \value{ Returns a \pkg{ggplot2} plot (i.e., object of class \code{c("gg", "ggplot")}) unless \code{return = "data"}. } \description{ Plots results from factorial experiments. Estimated marginal means and error bars are plotted in the foreground, raw data is plotted in the background. Error bars can be based on different standard errors (e.g., model-based, within-subjects, between-subjects). Functions described here return a \pkg{ggplot2} plot object, thus allowing further customization of the plot. \code{afex_plot} is the user friendly function that does data preparation and plotting. It also allows to only return the prepared data (\code{return = "data"}). \code{interaction_plot} does the plotting when a \code{trace} factor is present. \code{oneway_plot} does the plotting when a \code{trace} factor is absent. } \details{ \code{afex_plot} obtains the estimated marginal means via \code{\link[emmeans]{emmeans}} and aggregates the raw data to the same level. It then calculates the desired confidence interval or standard error (see below) and passes the prepared data to one of the two plotting functions: \code{interaction_plot} when \code{trace} is specified and \code{oneway_plot} otherwise. \subsection{Error Bars}{Error bars provide a grahical representation of the variability of the estimated means and should be routinely added to results figures. However, there exist several possibilities which particular measure of variability to use. Because of this, any figure depicting error bars should be accompanied by a note detailing which measure the error bars shows. The present functions allow plotting of different types of confidence intervals (if \code{error_ci = TRUE}, the default) or standard errors (if \code{error_ci = FALSE}). A further complication is that readers routinely misinterpret confidence intervals. The most common error is to assume that non-overlapping error bars indicate a significant difference (e.g., Belia et al., 2005). This is often too strong an assumption. (see e.g., Cumming & Finch, 2005; Knol et al., 2011; Schenker & Gentleman, 2005). For example, in a fully between-subjects design in which the error bars depict 95\% confidence intervals and groups are of approximately equal size and have equal variance, even error bars that overlap by as much as 50\% still correspond to \emph{p} < .05. Error bars that are just touching roughly correspond to \emph{p} = .01. In the case of designs involving repeated-measures factors the usual confidence intervals or standard errors (i.e., model-based confidence intervals or intervals based on the standard error of the mean) cannot be used to gauge significant differences as this requires knowledge about the correlation between measures. One popular alternative in the psychological literature are intervals based on within-subjects standard errors/confidence intervals (e.g., Cousineau & O'Brien, 2014). These attempt to control for the correlation across individuals and thereby allow judging differences between repeated-measures condition. As a downside, when using within-subjects intervals no comparisons across between-subjects conditions or with respect to a fixed-value are possible anymore. In the case of a mixed-design, no single type of error bar is possible that allows comparison across all conditions. Likewise, for mixed models involving multiple \emph{crossed} random effects, no single set of error bars (or even data aggregation) adequately represent the true varibility in the data and adequately allows for "inference by eye". Therefore, special care is necessary in such cases. One possiblity is to avoid error bars altogether and plot only the raw data in the background (with \code{error = "none"}). The raw data in the background still provides a visual impression of the variability in the data and the precision of the mean estimate, but does not as easily suggest an incorrect inferences. Another possibility is to use the model-based standard error and note in the figure caption that it does not permit comparisons across repeated-measures factors. The following "rules of eye" (Cumming and Finch, 2005) hold, when permitted by design (i.e., within-subjects bars for within-subjects comparisons; other variants for between-subjects comparisons), and groups are approximately equal in size and variance. Note that for more complex designs ususally analyzed with mixed models, such as designs involving complicated dependencies across data points, these rules of thumbs may be highly misleading. \itemize{ \item \emph{p} < .05 when the overlap of the 95\% confidence intervals (CIs) is no more than about half the average margin of error, that is, when proportion overlap is about .50 or less. \item \emph{p} < .01 when the two CIs do not overlap, that is, when proportion overlap is about 0 or there is a positive gap. \item \emph{p} < .05 when the gap between standard error (SE) bars is at least about the size of the average SE, that is, when the proportion gap is about 1 or greater. \item \emph{p} < .01 when the proportion gap between SE bars is about 2 or more. } } \subsection{Implemented Standard Errors}{The following lists the implemented approaches to calculate confidence intervals (CIs) and standard errors (SEs). CIs are based on the SEs using the \emph{t}-distribution with degrees of freedom based on the cell or group size. For ANOVA models, \code{afex_plot} attempts to warn in case the chosen approach is misleading given the design (e.g., model-based error bars for purely within-subjects plots). For \code{mixed} models, no such warnings are produced, but users should be aware that all options beside \code{"model"} are not actually appropriate and have only heuristic value. But then again, \code{"model"} based error bars do not permit comparisons for factors varying within one of the random-effects grouping factors (i.e., factors for which random-slopes should be estimated). \describe{ \item{\code{"model"}}{Uses model-based CIs and SEs. For ANOVAs, the variant based on the \code{lm} or \code{mlm} model (i.e., \code{emmeans_arg = list(model = "multivariate")}) seems generally preferrable.} \item{\code{"mean"}}{Calculates the standard error of the mean for each cell ignoring any repeated-measures factors.} \item{\code{"within"} or \code{"CMO"}}{Calculates within-subjects SEs using the Cosineau-Morey-O'Brien (Cousineau & O'Brien, 2014) method. This method is based on a double normalization of the data. SEs and CIs are then calculated independently for each cell (i.e., if the desired output contains between-subjects factors, SEs are calculated for each cell including the between-subjects factors).} \item{\code{"between"}}{First aggregates the data per participant and then calculates the SEs for each between-subjects condition. Results in one SE and \emph{t}-quantile for all conditions in purely within-subjects designs.} \item{\code{"none"} or \code{NULL}}{Suppresses calculation of SEs and plots no error bars.} } For \code{mixed} models, the within-subjects/repeated-measures factors are relative to the chosen \code{id} effects grouping factor. They are automatically detected based on the random-slopes of the random-effects grouping factor in \code{id}. All other factors are treated as independent-samples or between-subjects factors. } } \note{ Only the DV/response variable can be called \code{y}, but no factor/variable used for plotting. } \examples{ # note: use library("ggplot") to avoid "ggplot2::" in the following ################################################################## ## 2-factor Within-Subject Design ## ################################################################## data(md_12.1) aw <- aov_ez("id", "rt", md_12.1, within = c("angle", "noise")) ##--------------------------------------------------------------- ## Basic Interaction Plots - ##--------------------------------------------------------------- ## all examples require emmeans and ggplot2: if (requireNamespace("emmeans") && requireNamespace("ggplot2")) { afex_plot(aw, x = "angle", trace = "noise") # or: afex_plot(aw, x = ~angle, trace = ~noise) afex_plot(aw, x = "noise", trace = "angle") ### For within-subject designs, using within-subject CIs is better: afex_plot(aw, x = "angle", trace = "noise", error = "within") (p1 <- afex_plot(aw, x = "noise", trace = "angle", error = "within")) ## use different themes for nicer graphs: p1 + ggplot2::theme_bw() } \dontrun{ p1 + ggplot2::theme_light() p1 + ggplot2::theme_minimal() p1 + jtools::theme_apa() p1 + ggpubr::theme_pubr() ### set theme globally for R session: ggplot2::theme_set(ggplot2::theme_bw()) ### There are several ways to deal with overlapping points in the background besides alpha # 1. using the default data geom and ggplot2::position_jitterdodge afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.3, data_arg = list( position = ggplot2::position_jitterdodge( jitter.width = 0, jitter.height = 5, dodge.width = 0.3 ## needs to be same as dodge ), color = "darkgrey")) # 2. using ggbeeswarm::geom_beeswarm afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.5, data_geom = ggbeeswarm::geom_beeswarm, data_arg = list( dodge.width = 0.5, ## needs to be same as dodge cex = 0.8, color = "darkgrey")) # 3. do not display points, but use a violinplot: ggplot2::geom_violin afex_plot(aw, x = "noise", trace = "angle", error = "within", data_geom = ggplot2::geom_violin, data_arg = list(width = 0.5)) # 4. violinplots with color: ggplot2::geom_violin afex_plot(aw, x = "noise", trace = "angle", error = "within", mapping = c("linetype", "shape", "fill"), data_geom = ggplot2::geom_violin, data_arg = list(width = 0.5)) # 5. do not display points, but use a boxplot: ggplot2::geom_boxplot afex_plot(aw, x = "noise", trace = "angle", error = "within", data_geom = ggplot2::geom_boxplot, data_arg = list(width = 0.3)) # 6. combine points with boxplot: ggpol::geom_boxjitter afex_plot(aw, x = "noise", trace = "angle", error = "within", data_geom = ggpol::geom_boxjitter, data_arg = list(width = 0.3)) ## hides error bars! # 7. nicer variant of ggpol::geom_boxjitter afex_plot(aw, x = "noise", trace = "angle", error = "within", mapping = c("shape", "fill"), data_geom = ggpol::geom_boxjitter, data_arg = list( width = 0.3, jitter.width = 0, jitter.height = 10, outlier.intersect = TRUE), point_arg = list(size = 2.5), error_arg = list(size = 1.5, width = 0)) # 8. nicer variant of ggpol::geom_boxjitter without lines afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.7, mapping = c("shape", "fill"), data_geom = ggpol::geom_boxjitter, data_arg = list( width = 0.5, jitter.width = 0, jitter.height = 10, outlier.intersect = TRUE), point_arg = list(size = 2.5), line_arg = list(linetype = 0), error_arg = list(size = 1.5, width = 0)) } ##--------------------------------------------------------------- ## One-Way Plots - ##--------------------------------------------------------------- \dontrun{ afex_plot(aw, x = "angle", error = "within") ## default ## with color we need larger points afex_plot(aw, x = "angle", mapping = "color", error = "within", point_arg = list(size = 2.5), error_arg = list(size = 1.5, width = 0.05)) afex_plot(aw, x = "angle", error = "within", data_geom = ggpol::geom_boxjitter) ## nicer afex_plot(aw, x = "angle", error = "within", data_geom = ggpol::geom_boxjitter, mapping = "fill", data_alpha = 0.7, data_arg = list( width = 0.6, jitter.width = 0.07, jitter.height = 10, outlier.intersect = TRUE ), point_arg = list(size = 2.5), error_arg = list(size = 1.5, width = 0.05)) ## we can add a line connecting the means using geom_point(aes(group = 1)): afex_plot(aw, x = "angle", error = "within") + ggplot2::geom_line(ggplot2::aes(group = 1)) ## One-way plots also supports panels: afex_plot(aw, x = "angle", panel = "noise", error = "within") ## And panels with lines: afex_plot(aw, x = "angle", panel = "noise", error = "within") + ggplot2::geom_line(ggplot2::aes(group = 1)) ## For more complicated plots it is easier to attach ggplot2: library("ggplot2") ## We can hide geoms by plotting them in transparent color and add them ## afterward to use a mapping not directly supported. ## For example, the next plot adds a line to a one-way plot with panels, but ## with all geoms in the foreground having a color conditional on the panel. afex_plot(aw, x = "angle", panel = "noise", error = "within", point_arg = list(color = "transparent"), error_arg = list(color = "transparent")) + geom_point(aes(color = panel)) + geom_linerange(aes(color = panel, ymin = lower, ymax = upper)) + geom_line(aes(group = 1, color = panel)) + guides(color = guide_legend(title = "NOISE")) ## Note that we need to use guides explicitly, otherwise the legend title would ## be "panel". legend_title does not work in this case. ##--------------------------------------------------------------- ## Other Basic Options - ##--------------------------------------------------------------- ## relabel factor levels via factor_levels (with message) afex_plot(aw, x = "noise", trace = "angle", factor_levels = list(angle = c("0°", "4°", "8°"), noise = c("Absent", "Present"))) ## factor_levels allows named vectors which enable reordering the factor levels ### and renaming subsets of levels: afex_plot(aw, x = "noise", trace = "angle", factor_levels = list( angle = c(X8 = "8°", X4 = "4°", X0 = "0°"), noise = c(present = "Present") ) ) ## Change title of legend afex_plot(aw, x = "noise", trace = "angle", legend_title = "Noise Condition") ## for plots with few factor levels, smaller dodge might be better: afex_plot(aw, x = "angle", trace = "noise", dodge = 0.25) ################################################################# ## 4-factor Mixed Design ## ################################################################# data(obk.long, package = "afex") a1 <- aov_car(value ~ treatment * gender + Error(id/(phase*hour)), data = obk.long, observed = "gender") ## too difficult to see anything afex_plot(a1, ~phase*hour, ~treatment) + ggplot2::theme_light() ## better afex_plot(a1, ~hour, ~treatment, ~phase) + ggplot2::theme_light() ## even better afex_plot(a1, ~hour, ~treatment, ~phase, dodge = 0.65, data_arg = list( position = ggplot2::position_jitterdodge( jitter.width = 0, jitter.height = 0.2, dodge.width = 0.65 ## needs to be same as dodge ), color = "darkgrey")) + ggplot2::theme_classic() # with color instead of linetype to separate trace factor afex_plot(a1, ~hour, ~treatment, ~phase, mapping = c("shape", "color"), dodge = 0.65, data_arg = list( position = ggplot2::position_jitterdodge( jitter.width = 0, jitter.height = 0.2, dodge.width = 0.65 ## needs to be same as dodge ))) + ggplot2::theme_light() # only color to separate trace factor afex_plot(a1, ~hour, ~treatment, ~phase, mapping = "color", dodge = 0.65, data_arg = list( position = ggplot2::position_jitterdodge( jitter.width = 0, jitter.height = 0.2, dodge.width = 0.65 ## needs to be same as dodge ))) + ggplot2::theme_classic() ## plot involving all 4 factors: afex_plot(a1, ~hour, ~treatment, ~gender+phase, dodge = 0.65, data_arg = list( position = ggplot2::position_jitterdodge( jitter.width = 0, jitter.height = 0.2, dodge.width = 0.65 ## needs to be same as dodge ), color = "darkgrey")) + ggplot2::theme_bw() ##--------------------------------------------------------------- ## Different Standard Errors Available - ##--------------------------------------------------------------- ## purely within-design cbind( afex_plot(a1, ~phase, ~hour, error = "model", return = "data")$means[,c("phase", "hour", "y", "SE")], multivariate = afex_plot(a1, ~phase, ~hour, error = "model", return = "data")$means$error, mean = afex_plot(a1, ~phase, ~hour, error = "mean", return = "data")$means$error, within = afex_plot(a1, ~phase, ~hour, error = "within", return = "data")$means$error, between = afex_plot(a1, ~phase, ~hour, error = "between", return = "data")$means$error) ## mixed design cbind( afex_plot(a1, ~phase, ~treatment, error = "model", return = "data")$means[,c("phase", "treatment", "y", "SE")], multivariate = afex_plot(a1, ~phase, ~treatment, error = "model", return = "data")$means$error, mean = afex_plot(a1, ~phase, ~treatment, error = "mean", return = "data")$means$error, within = afex_plot(a1, ~phase, ~treatment, error = "within", return = "data")$means$error, between = afex_plot(a1, ~phase, ~treatment, error = "between", return = "data")$means$error) } ################################################################## ## Mixed Models ## ################################################################## if (requireNamespace("MEMSS") && requireNamespace("emmeans") && requireNamespace("ggplot2")) { data("Machines", package = "MEMSS") m1 <- mixed(score ~ Machine + (Machine|Worker), data=Machines) pairs(emmeans::emmeans(m1, "Machine")) # contrast estimate SE df t.ratio p.value # A - B -7.966667 2.420850 5 -3.291 0.0481 # A - C -13.916667 1.540100 5 -9.036 0.0007 # B - C -5.950000 2.446475 5 -2.432 0.1253 ## Default (i.e., model-based) error bars suggest no difference between Machines. ## This contrasts with pairwise comparisons above. afex_plot(m1, "Machine") ## Impression from within-subject error bars is more in line with pattern of differences. afex_plot(m1, "Machine", error = "within") } \dontrun{ data("fhch2010") # load fhch <- droplevels(fhch2010[ fhch2010$correct,]) # remove errors ### following model should take less than a minute to fit: mrt <- mixed(log_rt ~ task*stimulus*frequency + (stimulus*frequency||id)+ (task||item), fhch, method = "S", expand_re = TRUE) ## way too many points in background: afex_plot(mrt, "stimulus", "frequency", "task") ## better to restrict plot of data to one random-effects grouping variable afex_plot(mrt, "stimulus", "frequency", "task", id = "id") ## when plotting data from a single random effect, different error bars are possible: afex_plot(mrt, "stimulus", "frequency", "task", id = "id", error = "within") afex_plot(mrt, "stimulus", "frequency", "task", id = "id", error = "mean") ## compare visual impression with: pairs(emmeans::emmeans(mrt, c("stimulus", "frequency"), by = "task")) ## same logic also possible for other random-effects grouping factor afex_plot(mrt, "stimulus", "frequency", "task", id = "item") ## within-item error bars are misleading here. task is sole within-items factor. afex_plot(mrt, "stimulus", "frequency", "task", id = "item", error = "within") ## CIs based on stanard error of mean look small, but not unreasonable given results. afex_plot(mrt, "stimulus", "frequency", "task", id = "item", error = "mean") ### compare distribution of individual data for different random effects: ## requires package cowplot p_id <- afex_plot(mrt, "stimulus", "frequency", "task", id = "id", error = "within", dodge = 0.7, data_geom = ggplot2::geom_violin, mapping = c("shape", "fill"), data_arg = list(width = 0.7)) + ggplot2::scale_shape_manual(values = c(4, 17)) + ggplot2::labs(title = "ID") p_item <- afex_plot(mrt, "stimulus", "frequency", "task", id = "item", error = "within", dodge = 0.7, data_geom = ggplot2::geom_violin, mapping = c("shape", "fill"), data_arg = list(width = 0.7)) + ggplot2::scale_shape_manual(values = c(4, 17)) + ggplot2::labs(title = "Item") ### see: https://cran.r-project.org/package=cowplot/vignettes/shared_legends.html p_comb <- cowplot::plot_grid( p_id + ggplot2::theme_light() + ggplot2::theme(legend.position="none"), p_item + ggplot2::theme_light() + ggplot2::theme(legend.position="none") ) legend <- cowplot::get_legend(p_id + ggplot2::theme(legend.position="bottom")) cowplot::plot_grid(p_comb, legend, ncol = 1, rel_heights = c(1, 0.1)) ##---------------------------------------------------------------- ## Support for lme4::lmer - ##---------------------------------------------------------------- Oats <- nlme::Oats ## afex_plot does currently not support implicit nesting: (1|Block/Variety) ## Instead, we need to create the factor explicitly Oats$VarBlock <- Oats$Variety:Oats$Block Oats.lmer <- lmer(yield ~ Variety * factor(nitro) + (1|VarBlock) + (1|Block), data = Oats) afex_plot(Oats.lmer, "nitro", "Variety") afex_plot(Oats.lmer, "nitro", panel = "Variety") ################################################################## ## Default Method works for Models Supported by emmeans ## ################################################################## ## lm warp.lm <- lm(breaks ~ wool * tension, data = warpbreaks) afex_plot(warp.lm, "tension") afex_plot(warp.lm, "tension", "wool") ## poisson glm ins <- data.frame( n = c(500, 1200, 100, 400, 500, 300), size = factor(rep(1:3,2), labels = c("S","M","L")), age = factor(rep(1:2, each = 3)), claims = c(42, 37, 1, 101, 73, 14)) ins.glm <- glm(claims ~ size + age + offset(log(n)), data = ins, family = "poisson") afex_plot(ins.glm, "size", "age") ## binomial glm adapted from ?predict.glm ldose <- factor(rep(0:5, 2)) numdead <- c(1, 4, 9, 13, 18, 20, 0, 2, 6, 10, 12, 16) sex <- factor(rep(c("M", "F"), c(6, 6))) SF <- numdead/20 ## dv should be a vector, no matrix budworm.lg <- glm(SF ~ sex*ldose, family = binomial, weights = rep(20, length(numdead))) afex_plot(budworm.lg, "ldose") afex_plot(budworm.lg, "ldose", "sex") ## data point is hidden behind mean! afex_plot(budworm.lg, "ldose", "sex", data_arg = list(size = 4, color = "red")) ## nlme mixed model data(Oats, package = "nlme") Oats$nitro <- factor(Oats$nitro) oats.1 <- nlme::lme(yield ~ nitro * Variety, random = ~ 1 | Block / Variety, data = Oats) afex_plot(oats.1, "nitro", "Variety", data = Oats) afex_plot(oats.1, "nitro", "Variety", data = Oats, id = "Block") afex_plot(oats.1, "nitro", data = Oats) afex_plot(oats.1, "nitro", data = Oats, id = c("Block", "Variety")) afex_plot(oats.1, "nitro", data = Oats, id = "Block") } } \references{ Belia, S., Fidler, F., Williams, J., & Cumming, G. (2005). Researchers Misunderstand Confidence Intervals and Standard Error Bars. \emph{Psychological Methods}, 10(4), 389-396. https://doi.org/10.1037/1082-989X.10.4.389 Cousineau, D., & O'Brien, F. (2014). Error bars in within-subject designs: a comment on Baguley (2012). \emph{Behavior Research Methods}, 46(4), 1149-1151. https://doi.org/10.3758/s13428-013-0441-z Cumming, G., & Finch, S. (2005). Inference by Eye: Confidence Intervals and How to Read Pictures of Data. \emph{American Psychologist}, 60(2), 170-180. https://doi.org/10.1037/0003-066X.60.2.170 Knol, M. J., Pestman, W. R., & Grobbee, D. E. (2011). The (mis)use of overlap of confidence intervals to assess effect modification. \emph{European Journal of Epidemiology}, 26(4), 253-254. https://doi.org/10.1007/s10654-011-9563-8 Schenker, N., & Gentleman, J. F. (2001). On Judging the Significance of Differences by Examining the Overlap Between Confidence Intervals. \emph{The American Statistician}, 55(3), 182-186. https://doi.org/10.1198/000313001317097960 } afex/man/md_16.1.Rd0000644000176200001440000000364713667760652013340 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/md_16.1-data.R \docType{data} \encoding{UTF-8} \name{md_16.1} \alias{md_16.1} \title{Data 16.1 / 10.9 from Maxwell & Delaney} \format{ A data.frame with 24 rows and 3 variables. } \source{ Maxwell, S. E., & Delaney, H. D. (2004). Designing experiments and analyzing data: a model-comparisons perspective. Mahwah, N.J.: Lawrence Erlbaum Associates. p. 574 } \usage{ md_16.1 } \description{ Hypothetical Reaction Time Data for 2 x 3 Perceptual Experiment: Example data for chapter 12 of Maaxwell and Delaney (2004, Table 12.1, p. 574) in long format. Has two within.subjects factors: angle and noise. } \details{ Description from pp. 829: As brief background, the goal of the study here is to examine the extent to which female and male clinical psychology graduate student trainees may assign different severity ratings to clients at initial intake. Three female and 3 male graduate students are randomly selected to participate and each is randomly assigned four clients with whom to do an intake interview, after which each clinical trainee assigns a severity rating to each client, producing the data shown in Table 16.1. Note that I changed the labeling of the id slightly, so that they are now labeled from 1 to 6. Furthermore, I changed the contrasts of sex to \code{contr.treatment} to replicate the exact results of Table 16.3 (p. 837). } \examples{ ### replicate results from Table 16.3 (Maxwell & Delaney, 2004, p. 837) data(md_16.1) # original results need treatment contrasts: (mixed1_orig <- mixed(severity ~ sex + (1|id), md_16.1, check.contrasts=FALSE)) summary(mixed1_orig$full.model) # p-values stay the same with afex default contrasts (contr.sum), # but estimates and t-values for the fixed effects parameters change. (mixed1 <- mixed(severity ~ sex + (1|id), md_16.1)) summary(mixed1$full.model) } \keyword{dataset} afex/man/md_12.1.Rd0000644000176200001440000000527313720444316013313 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/md_12.1-data.R \docType{data} \encoding{UTF-8} \name{md_12.1} \alias{md_12.1} \title{Data 12.1 from Maxwell & Delaney} \format{ A data.frame with 60 rows and 4 variables. } \source{ Maxwell, S. E., & Delaney, H. D. (2004). Designing experiments and analyzing data: a model-comparisons perspective. Mahwah, N.J.: Lawrence Erlbaum Associates. p. 574 } \usage{ md_12.1 } \description{ Hypothetical Reaction Time Data for 2 x 3 Perceptual Experiment: Example data for chapter 12 of Maaxwell and Delaney (2004, Table 12.1, p. 574) in long format. Has two within.subjects factors: angle and noise. } \details{ Description from pp. 573: Suppose that a perceptual psychologist studying the visual system was interested in determining the extent to which interfering visual stimuli slow the ability to recognize letters. Subjects are brought into a laboratory and seated in front of a tachistoscope. Subjects are told that they will see either the letter T or the letter I displayed on the screen. In some trials, the letter appears by itself, but in other trials, the target letter is embedded in a group of other letters. This variation in the display constitutes the first factor, which is referred to as noise. The noise factor has two levels?absent and present. The other factor varied by the experimenter is where in the display the target letter appears. This factor, which is called angle, has three levels. The target letter is either shown at the center of the screen (i.e., 0° off-center, where the subject has been instructed to fixate), 4° off-center or 8° off-center (in each case, the deviation from the center varies randomly between left and right). Table 12.1 presents hypothetical data for 10 subjects. As usual, the sample size is kept small to make the calculations easier to follow. The dependent measure is reaction time (latency), measured in milliseconds (ms), required by a subject to identify the correct target letter. Notice that each subject has six scores, one for each combination of the 2 x 3 design. In an actual perceptual experiment, each of these six scores would itself be the mean score for that subject across a number of trials in the particular condition. Although "trials" could be used as a third within-subjects factor in such a situation, more typically trials are simply averaged over to obtain a more stable measure of the individual's performance in each condition. } \examples{ data(md_12.1) # Table 12.5 (p. 578): aov_ez("id", "rt", md_12.1, within = c("angle", "noise"), args.return=list(correction = "none", es = "none")) } \keyword{dataset} afex/man/mixed.Rd0000644000176200001440000010512514076034254013356 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/mixed.R \encoding{UTF-8} \name{mixed} \alias{mixed} \alias{lmer_alt} \title{p-values for fixed effects of mixed-model via lme4::lmer()} \usage{ mixed( formula, data, type = afex_options("type"), method = afex_options("method_mixed"), per_parameter = NULL, args_test = list(), test_intercept = FALSE, check_contrasts = afex_options("check_contrasts"), expand_re = FALSE, all_fit = FALSE, set_data_arg = afex_options("set_data_arg"), progress = TRUE, cl = NULL, return = "mixed", sig_symbols = afex_options("sig_symbols"), ... ) lmer_alt(formula, data, check_contrasts = FALSE, ...) } \arguments{ \item{formula}{a formula describing the full mixed-model to be fitted. As this formula is passed to \code{lmer}, it needs at least one random term.} \item{data}{\code{data.frame} containing the data. Should have all the variables present in \code{fixed}, \code{random}, and \code{dv} as columns.} \item{type}{type of test on which effects are based. Default is to use type 3 tests, taken from \code{\link{afex_options}}.} \item{method}{character vector indicating which methods for obtaining p-values should be used: \code{"S"} corresponds to the Satterthwaite approximation for degrees of freedom (via \code{\link{lmerTest}}, only LMMs), \code{"KR"} corresponds to the Kenward-Roger approximation for degrees of freedom (only LMMs), \code{"PB"} calculates p-values based on parametric bootstrap, \code{"LRT"} calculates p-values via the likelihood ratio tests implemented in the \code{anova} method for \code{merMod} objects (only recommended for models with many [i.e., > 50] levels for the random factors). The default (currently \code{"S"}) is taken from \code{\link{afex_options}}. For historical compatibility \code{"nested-KR"} is also supported which was the default KR-method in previous versions.} \item{per_parameter}{\code{character} vector specifying for which variable tests should be run for each parameter (instead for the overall effect). Can be useful e.g., for testing ordered factors. Uses \code{\link{grep}} for selecting parameters among the fixed effects so regular expressions (\code{\link{regex}}) are possible. See Examples.} \item{args_test}{\code{list} of arguments passed to the function calculating the p-values. See Details.} \item{test_intercept}{logical. Whether or not the intercept should also be fitted and tested for significance. Default is \code{FALSE}. Only relevant if \code{type = 3}.} \item{check_contrasts}{\code{logical}. Should contrasts be checked and (if necessary) changed to \code{"contr.sum"}? See Details. The default (\code{"TRUE"}) is taken from \code{\link{afex_options}}.} \item{expand_re}{logical. Should random effects terms be expanded (i.e., factors transformed into numerical variables) before fitting with \code{(g)lmer}? Allows to use "||" notation with factors.} \item{all_fit}{logical. Should \code{\link{all_fit}} be used to fit each model with each available optimization algorithm and the results that provided the best fit in each case be used? Warning: This can dramatically increase the optimization time. Adds two new attributes to the returned object designating which algorithm was selected and the log-likelihoods for each algorithm. Note that only warnings from the initial fit are emitted during fitting. The warnings of the chosen models are emitted when printing the returned object.} \item{set_data_arg}{\code{logical}. Should the data argument in the slot \code{call} of the \code{merMod} object returned from \code{lmer} be set to the passed data argument? If \code{FALSE} (currently the default) the name will be \code{data}. \code{TRUE} may be helpful when fitted objects are used afterwards (e.g., compared using \code{anova} or when using the \code{effects} package, see examples). \pkg{emmeans} functions appear to work better with \code{FALSE}. Default is given by afex_options("set_data_arg").} \item{progress}{if \code{TRUE}, shows progress with a text progress bar and other status messages during estimation} \item{cl}{A vector identifying a cluster; used for distributing the estimation of the different models using several cores (if seveal models are calculated). See examples. If \code{ckeck_contrasts = TRUE}, mixed sets the current contrasts (\code{getOption("contrasts")}) at the nodes. Note this does \emph{not} distribute calculation of p-values (e.g., when using \code{method = "PB"}) across the cluster. Use \code{args_test} for this.} \item{return}{the default is to return an object of class \code{"mixed"}. \code{return = "merMod"} will skip the calculation of all submodels and p-values and simply return the full model estimated with \code{lmer} (note that somewhat unintuiviely, the returned object can either be of class \code{"lmerModLmerTest"} or of class \code{"merMod"}, depending on the value of \code{\link{afex_options}}\code{("lmer_function")}). Can be useful in combination with \code{expand_re = TRUE} which allows to use "||" with factors. \code{return = "data"} will not fit any models but just return the data that would have been used for estimating the model (note that the data is also part of the returned object).} \item{sig_symbols}{Character. What should be the symbols designating significance? When entering an vector with \code{length(sig.symbol) < 4} only those elements of the default (\code{c(" +", " *", " **", " ***")}) will be replaced. \code{sig_symbols = ""} will display the stars but not the \code{+}, \code{sig_symbols = rep("", 4)} will display no symbols. The default is given by \code{afex_options("sig_symbols")}.} \item{...}{further arguments (such as \code{weights}, \code{family}, or \code{control}) passed to \code{\link{lmer}}/\code{\link{glmer}}. Note that additional data (e.g., \code{weights}) need to be passed fully and not only by name (e.g., \code{weights = df$weights} and not \code{weights = weights}).} } \value{ An object of class \code{"mixed"} (i.e., a list) with the following elements: \enumerate{ \item \code{anova_table} a data.frame containing the statistics returned from \code{\link[pbkrtest]{KRmodcomp}}. The \code{stat} column in this data.frame gives the value of the test statistic, an F-value for \code{method = "KR"} and a chi-square value for the other two methods. \item \code{full_model} the \code{"lmerModLmerTest"} or \code{"merMod"} object returned from estimating the full model. Use \code{\link{afex_options}}\code{("lmer_function")} for setting which function for estimation should be used. The possible options are \code{"lmerTest"} (the default returning an object of class \code{"lmerModLmerTest"}) and \code{"lme4"} returning an object of class (\code{"merMod"}). Note that in case a \code{family} argument is present an object of class \code{"glmerMod"} is always returned. \item \code{restricted_models} a list of \code{"g/lmerMod"} (or \code{"lmerModLmerTest"}) objects from estimating the restricted models (i.e., each model lacks the corresponding effect) \item \code{tests} a list of objects returned by the function for obtaining the p-values. \item \code{data} The data used for estimation (i.e., after excluding missing rows and applying expand_re if requested). \item \code{call} The matched call. } It also has the following attributes, \code{"type"} and \code{"method"}. And the attributes \code{"all_fit_selected"} and \code{"all_fit_logLik"} if \code{all_fit=TRUE}. Two similar methods exist for objects of class \code{"mixed"}: \code{print} and \code{anova}. They print a nice version of the \code{anova_table} element of the returned object (which is also invisibly returned). This methods omit some columns and nicely round the other columns. The following columns are always printed: \enumerate{ \item \code{Effect} name of effect \item \code{p.value} estimated p-value for the effect } For LMMs with \code{method="KR"} or \code{method="S"} the following further columns are returned (note: the Kenward-Roger correction does two separate things: (1) it computes an effective number for the denominator df; (2) it scales the statistic by a calculated amount, see also \url{https://stackoverflow.com/a/25612960/289572}): \enumerate{ \item \code{F} computed F statistic \item \code{ndf} numerator degrees of freedom (number of parameters used for the effect) \item \code{ddf} denominator degrees of freedom (effective residual degrees of freedom for testing the effect), computed from the Kenward-Roger correction using \code{pbkrtest::KRmodcomp} \item \code{F.scaling} scaling of F-statistic computing from Kenward-Roger approximation (only printed if \code{method="nested-KR"}) } For models with \code{method="LRT"} the following further columns are returned: \enumerate{ \item \code{df.large} degrees of freedom (i.e., estimated paramaters) for full model (i.e., model containing the corresponding effect) \item \code{df.small} degrees of freedom (i.e., estimated paramaters) for restricted model (i.e., model without the corresponding effect) \item \code{chisq} 2 times the difference in likelihood (obtained with \code{logLik}) between full and restricted model \item \code{df} difference in degrees of freedom between full and restricted model (p-value is based on these df). } For models with \code{method="PB"} the following further column is returned: \enumerate{ \item \code{stat} 2 times the difference in likelihood (obtained with \code{logLik}) between full and restricted model (i.e., a chi-square value). } Note that \code{anova} can also be called with additional mixed and/or \code{merMod} objects. In this casethe full models are passed on to \code{anova.merMod} (with \code{refit=FALSE}, which differs from the default of \code{anova.merMod}) which produces the known LRT tables. The \code{summary} method for objects of class \code{mixed} simply calls \code{\link{summary.merMod}} on the full model. If \code{return = "merMod"} (or when invoking \code{lmer_alt}), an object of class \code{"lmerModLmerTest"} or of class \code{"merMod"} (depending on the value of \code{\link{afex_options}}\code{("lmer_function")}), as returned from \code{g/lmer}, is returned. The default behavior is to return an object of class \code{"lmerModLmerTest"} estimated via \code{\link[lmerTest]{lmer}}. } \description{ Estimates mixed models with \pkg{lme4} and calculates p-values for all fixed effects. The default method \code{"KR"} (= Kenward-Roger) as well as \code{method="S"} (Satterthwaite) support LMMs and estimate the model with \code{\link[lmerTest]{lmer}} and then pass it to the \code{\link[lmerTest]{lmerTest}} \code{anova} method (or \code{\link[car]{Anova}}). The other methods (\code{"LRT"} = likelihood-ratio tests and \code{"PB"} = parametric bootstrap) support both LMMs (estimated via \code{\link[lme4]{lmer}}) and GLMMs (i.e., with \code{family} argument which invokes estimation via \code{\link[lme4]{glmer}}) and estimate a full model and restricted models in which the parameters corresponding to one effect (i.e., model term) are withhold (i.e., fixed to 0). Per default tests are based on Type 3 sums of squares. \code{print}, \code{nice}, \code{anova}, and \code{summary} methods for the returned object of class \code{"mixed"} are available. \code{summary} invokes the default \pkg{lme4} summary method and shows parameters instead of effects. \code{lmer_alt} is simply a wrapper for mixed that only returns the \code{"lmerModLmerTest"} or \code{"merMod"} object and correctly uses the \code{||} notation for removing correlations among factors. This function otherwise behaves like \code{g/lmer} (as for \code{mixed}, it calls \code{glmer} as soon as a \code{family} argument is present). Use \code{\link{afex_options}}\code{("lmer_function")} to set which function for estimation should be used. This option determines the class of the returned object (i.e., \code{"lmerModLmerTest"} or \code{"merMod"}). } \details{ For an introduction to mixed-modeling for experimental designs see our chapter (\href{http://singmann.org/download/publications/singmann_kellen-introduction-mixed-models.pdf}{Singmann & Kellen, in press}) or Barr, Levy, Scheepers, & Tily (2013). Arguments for using the Kenward-Roger approximation for obtaining p-values are given by Judd, Westfall, and Kenny (2012). Further introductions to mixed-modeling for experimental designs are given by Baayen and colleagues (Baayen, 2008; Baayen, Davidson & Bates, 2008; Baayen & Milin, 2010). Specific recommendations on which random effects structure to specify for confirmatory tests can be found in Barr and colleagues (2013) and Barr (2013), but also see Bates et al. (2015). \subsection{p-value Calculations}{ When \code{method = "KR"} (implemented via \code{\link[pbkrtest]{KRmodcomp}}), the Kenward-Roger approximation for degrees-of-freedom is calculated using \code{\link[lmerTest]{lmerTest}} (if \code{test_intercept=FALSE}) or \code{\link[car]{Anova}} (if \code{test_intercept=TRUE}), which is only applicable to linear-mixed models (LMMs). The test statistic in the output is an F-value (\code{F}). A similar method that requires less RAM is \code{method = "S"} which calculates the Satterthwaite approximation for degrees-of-freedom via \code{\link[lmerTest]{lmerTest}} and is also only applicable to LMMs. \code{method = "KR"} or \code{method = "S"} provide the best control for Type 1 errors for LMMs (Luke, 2017). \code{method = "PB"} calculates p-values using parametric bootstrap using \code{\link[pbkrtest]{PBmodcomp}}. This can be used for linear and also generalized linear mixed models (GLMMs) by specifying a \code{\link[stats]{family}} argument to \code{mixed}. Note that you should specify further arguments to \code{PBmodcomp} via \code{args_test}, especially \code{nsim} (the number of simulations to form the reference distribution) or \code{cl} (for using multiple cores). For other arguments see \code{\link[pbkrtest]{PBmodcomp}}. Note that \code{REML} (argument to \code{[g]lmer}) will be set to \code{FALSE} if method is \code{PB}. \code{method = "LRT"} calculates p-values via likelihood ratio tests implemented in the \code{anova} method for \code{"merMod"} objects. This is the method recommended by Barr et al. (2013; which did not test the other methods implemented here). Using likelihood ratio tests is only recommended for models with many levels for the random effects (> 50), but can be pretty helpful in case the other methods fail (due to memory and/or time limitations). The \href{http://bbolker.github.io/mixedmodels-misc/glmmFAQ.html}{lme4 faq} also recommends the other methods over likelihood ratio tests. } \subsection{Implementation Details}{ For methods \code{"KR"} and \code{"S"} type 3 and 2 tests are implemented as in \code{\link[car]{Anova}}. For all other methods, type 3 tests are obtained by comparing a model in which only the tested effect is excluded with the full model (containing all effects). For method \code{"nested-KR"} (which was the default in previous versions) this corresponds to the (type 3) Wald tests given by \code{car::Anova} for \code{"lmerMod"} models. The submodels in which the tested effect is excluded are obtained by manually creating a model matrix which is then fitted in \code{"lme4"}. Type 2 tests are truly sequential. They are obtained by comparing a model in which the tested effect and all higher oder effect (e.g., all three-way interactions for testing a two-way interaction) are excluded with a model in which only effects up to the order of the tested effect are present and all higher order effects absent. In other words, there are multiple full models, one for each order of effects. Consequently, the results for lower order effects are identical of whether or not higher order effects are part of the model or not. This latter feature is not consistent with classical ANOVA type 2 tests but a consequence of the sequential tests (and \href{https://stat.ethz.ch/pipermail/r-sig-mixed-models/2012q3/018992.html}{I didn't find a better way} of implementing the Type 2 tests). This \strong{does not} correspond to the (type 2) Wald test reported by \code{car::Anova}. If \code{check_contrasts = TRUE}, contrasts will be set to \code{"contr.sum"} for all factors in the formula if default contrasts are not equal to \code{"contr.sum"} or \code{attrib(factor, "contrasts") != "contr.sum"}. Furthermore, the current contrasts (obtained via \code{getOption("contrasts")}) will be set at the cluster nodes if \code{cl} is not \code{NULL}. } \subsection{Expand Random Effects}{ \code{expand_re = TRUE} allows to expand the random effects structure before passing it to \code{lmer}. This allows to disable estimation of correlation among random effects for random effects term containing factors using the \code{||} notation which may aid in achieving model convergence (see Bates et al., 2015). This is achieved by first creating a model matrix for each random effects term individually, rename and append the so created columns to the data that will be fitted, replace the actual random effects term with the so created variables (concatenated with +), and then fit the model. The variables are renamed by prepending all variables with rei (where i is the number of the random effects term) and replacing ":" with "_by_". \code{lmer_alt} is simply a wrapper for \code{mixed} that is intended to behave like \code{lmer} (or \code{glmer} if a \code{family} argument is present), but also allows the use of \code{||} with factors (by always using \code{expand_re = TRUE}). This means that \code{lmer_alt} per default does not enforce a specific contrast on factors and only returns the \code{"lmerModLmerTest"} or \code{"merMod"} object without calculating any additional models or p-values (this is achieved by setting \code{return = "merMod"}). Note that it most likely differs from \code{g/lmer} in how it handles missing values so it is recommended to only pass data without missing values to it! One consequence of using \code{expand_re = TRUE} is that the data that is fitted will not be the same as the passed data.frame which can lead to problems with e.g., the \code{predict} method. However, the actual data used for fitting is also returned as part of the \code{mixed} object so can be used from there. Note that the \code{set_data_arg} can be used to change whether the \code{data} argument in the call to \code{g/lmer} is set to \code{data} (the default) or the name of the data argument passed by the user. } } \note{ When \code{method = "KR"}, obtaining p-values is known to crash due too insufficient memory or other computational limitations (especially with complex random effects structures). In these cases, the other methods should be used. The RAM demand is a problem especially on 32 bit Windows which only supports up to 2 or 3GB RAM (see \href{https://CRAN.R-project.org/bin/windows/base/rw-FAQ.html}{R Windows FAQ}). Then it is probably a good idea to use methods "S", "LRT", or "PB". \code{"mixed"} will throw a message if numerical variables are not centered on 0, as main effects (of other variables then the numeric one) can be hard to interpret if numerical variables appear in interactions. See Dalal & Zickar (2012). Per default \code{mixed} uses \code{\link[lmerTest]{lmer}}, this can be changed to \code{\link[lme4]{lmer}} by calling: \code{afex_options(lmer_function = "lme4")} Formulas longer than 500 characters will most likely fail due to the use of \code{\link{deparse}}. Please report bugs or unexpected behavior by opening a guthub issue: \url{https://github.com/singmann/afex/issues} } \examples{ ################################## ## Simple Examples (from MEMSS) ## ################################## if (requireNamespace("MEMSS")) { data("Machines", package = "MEMSS") # simple model with random-slopes for repeated-measures factor m1 <- mixed(score ~ Machine + (Machine|Worker), data=Machines) m1 # suppress correlations among random effect parameters with || and expand_re = TRUE m2 <- mixed(score ~ Machine + (Machine||Worker), data=Machines, expand_re = TRUE) m2 ## compare: summary(m1)$varcor summary(m2)$varcor # for wrong solution see: # summary(lmer(score ~ Machine + (Machine||Worker), data=Machines))$varcor if (requireNamespace("emmeans")) { # follow-up tests library("emmeans") # package emmeans needs to be attached for follow-up tests. (emm1 <- emmeans(m1, "Machine")) pairs(emm1, adjust = "holm") # all pairwise comparisons con1 <- list( c1 = c(1, -0.5, -0.5), # 1 versus other 2 c2 = c(0.5, -1, 0.5) # 1 and 3 versus 2 ) contrast(emm1, con1, adjust = "holm") if (requireNamespace("ggplot2")) { # plotting afex_plot(m1, "Machine") ## default uses model-based CIs ## within-subjects CIs somewhat more in line with pairwirse comparisons: afex_plot(m1, "Machine", error = "within") ## less differences between CIs for model without correlations: afex_plot(m2, "Machine") afex_plot(m2, "Machine", error = "within") }}} \dontrun{ ####################### ### Further Options ### ####################### ## Multicore: require(parallel) (nc <- detectCores()) # number of cores cl <- makeCluster(rep("localhost", nc)) # make cluster # to keep track of what the function is doindg redirect output to outfile: # cl <- makeCluster(rep("localhost", nc), outfile = "cl.log.txt") data("Machines", package = "MEMSS") ## There are two ways to use multicore: # 1. Obtain fits with multicore (e.g. for likelihood ratio tests, LRT): mixed(score ~ Machine + (Machine|Worker), data=Machines, cl = cl, method = "LRT") # 2. Obtain PB samples via multicore: mixed(score ~ Machine + (Machine|Worker), data=Machines, method = "PB", args_test = list(nsim = 50, cl = cl)) # better use 500 or 1000 ## Both ways can be combined: # 2. Obtain PB samples via multicore: mixed(score ~ Machine + (Machine|Worker), data=Machines, cl = cl, method = "PB", args_test = list(nsim = 50, cl = cl)) #### use all_fit = TRUE and expand_re = TRUE: data("sk2011.2") # data described in more detail below sk2_aff <- droplevels(sk2011.2[sk2011.2$what == "affirmation",]) require(optimx) # uses two more algorithms sk2_aff_b <- mixed(response ~ instruction*type+(inference*type||id), sk2_aff, expand_re = TRUE, all_fit = TRUE, method = "LRT") attr(sk2_aff_b, "all_fit_selected") attr(sk2_aff_b, "all_fit_logLik") # considerably faster with multicore: clusterEvalQ(cl, library(optimx)) # need to load optimx in cluster sk2_aff_b2 <- mixed(response ~ instruction*type+(inference*type||id), sk2_aff, expand_re = TRUE, all_fit = TRUE, cl=cl, method = "LRT") attr(sk2_aff_b2, "all_fit_selected") attr(sk2_aff_b2, "all_fit_logLik") stopCluster(cl) } ################################################### ## Replicating Maxwell & Delaney (2004) Examples ## ################################################### \dontrun{ ### replicate results from Table 15.4 (Maxwell & Delaney, 2004, p. 789) data(md_15.1) # random intercept plus random slope (t15.4a <- mixed(iq ~ timecat + (1+time|id),data=md_15.1)) # to also replicate exact parameters use treatment.contrasts and the last level as base level: contrasts(md_15.1$timecat) <- contr.treatment(4, base = 4) (t15.4b <- mixed(iq ~ timecat + (1+time|id),data=md_15.1, check_contrasts=FALSE)) summary(t15.4a) # gives "wrong" parameters extimates summary(t15.4b) # identical parameters estimates # for more examples from chapter 15 see ?md_15.1 ### replicate results from Table 16.3 (Maxwell & Delaney, 2004, p. 837) data(md_16.1) # original results need treatment contrasts: (mixed1_orig <- mixed(severity ~ sex + (1|id), md_16.1, check_contrasts=FALSE)) summary(mixed1_orig$full_model) # p-value stays the same with afex default contrasts (contr.sum), # but estimates and t-values for the fixed effects parameters change. (mixed1 <- mixed(severity ~ sex + (1|id), md_16.1)) summary(mixed1$full_model) # data for next examples (Maxwell & Delaney, Table 16.4) data(md_16.4) str(md_16.4) ### replicate results from Table 16.6 (Maxwell & Delaney, 2004, p. 845) # Note that (1|room:cond) is needed because room is nested within cond. # p-value (almost) holds. (mixed2 <- mixed(induct ~ cond + (1|room:cond), md_16.4)) # (differences are dut to the use of Kenward-Roger approximation here, # whereas M&W's p-values are based on uncorrected df.) # again, to obtain identical parameter and t-values, use treatment contrasts: summary(mixed2) # not identical # prepare new data.frame with contrasts: md_16.4b <- within(md_16.4, cond <- C(cond, contr.treatment, base = 2)) str(md_16.4b) # p-value stays identical: (mixed2_orig <- mixed(induct ~ cond + (1|room:cond), md_16.4b, check_contrasts=FALSE)) summary(mixed2_orig$full_model) # replicates parameters ### replicate results from Table 16.7 (Maxwell & Delaney, 2004, p. 851) # F-values (almost) hold, p-values (especially for skill) are off (mixed3 <- mixed(induct ~ cond + skill + (1|room:cond), md_16.4)) # however, parameters are perfectly recovered when using the original contrasts: mixed3_orig <- mixed(induct ~ cond + skill + (1|room:cond), md_16.4b, check_contrasts=FALSE) summary(mixed3_orig) ### replicate results from Table 16.10 (Maxwell & Delaney, 2004, p. 862) # for this we need to center cog: md_16.4b$cog <- scale(md_16.4b$cog, scale=FALSE) # F-values and p-values are relatively off: (mixed4 <- mixed(induct ~ cond*cog + (cog|room:cond), md_16.4b)) # contrast has a relatively important influence on cog (mixed4_orig <- mixed(induct ~ cond*cog + (cog|room:cond), md_16.4b, check_contrasts=FALSE)) # parameters are again almost perfectly recovered: summary(mixed4_orig) } ########################### ## Full Analysis Example ## ########################### \dontrun{ ### split-plot experiment (Singmann & Klauer, 2011, Exp. 2) ## between-factor: instruction ## within-factor: inference & type ## hypothesis: three-way interaction data("sk2011.2") # use only affirmation problems (S&K also splitted the data like this) sk2_aff <- droplevels(sk2011.2[sk2011.2$what == "affirmation",]) # set up model with maximal by-participant random slopes sk_m1 <- mixed(response ~ instruction*inference*type+(inference*type|id), sk2_aff) sk_m1 # prints ANOVA table with nicely rounded numbers (i.e., as characters) nice(sk_m1) # returns the same but without printing potential warnings anova(sk_m1) # returns and prints numeric ANOVA table (i.e., not-rounded) summary(sk_m1) # lmer summary of full model # same model but using Kenward-Roger approximation of df # very similar results but slower sk_m1b <- mixed(response ~ instruction*inference*type+(inference*type|id), sk2_aff, method="KR") nice(sk_m1b) # identical results as: anova(sk_m1$full_model) # suppressing correlation among random slopes: very similar results, but # significantly faster and often less convergence warnings. sk_m2 <- mixed(response ~ instruction*inference*type+(inference*type||id), sk2_aff, expand_re = TRUE) sk_m2 ## mixed objects can be passed to emmeans library("emmeans") # however, package emmeans needs to be attached first # emmeans also approximate df which takes time with default Kenward-Roger emm_options(lmer.df = "Kenward-Roger") # default setting, slow emm_options(lmer.df = "Satterthwaite") # faster setting, preferrable emm_options(lmer.df = "asymptotic") # the fastest, df = infinity # recreates basically Figure 4 (S&K, 2011, upper panel) # only the 4th and 6th x-axis position are flipped afex_plot(sk_m1, x = c("type", "inference"), trace = "instruction") # set up reference grid for custom contrasts: (rg1 <- emmeans(sk_m1, c("instruction", "type", "inference"))) # set up contrasts on reference grid: contr_sk2 <- list( ded_validity_effect = c(rep(0, 4), 1, rep(0, 5), -1, 0), ind_validity_effect = c(rep(0, 5), 1, rep(0, 5), -1), counter_MP = c(rep(0, 4), 1, -1, rep(0, 6)), counter_AC = c(rep(0, 10), 1, -1) ) # test the main double dissociation (see S&K, p. 268) contrast(rg1, contr_sk2, adjust = "holm") # all effects are significant. } #################### ## Other Examples ## #################### \dontrun{ # use the obk.long data (not reasonable, no random slopes) data(obk.long) mixed(value ~ treatment * phase + (1|id), obk.long) # Examples for using the per.parameter argument # note, require method = "nested-KR", "LRT", or "PB" # also we use custom contrasts data(obk.long, package = "afex") obk.long$hour <- ordered(obk.long$hour) contrasts(obk.long$phase) <- "contr.sum" contrasts(obk.long$treatment) <- "contr.sum" # tests only the main effect parameters of hour individually per parameter. mixed(value ~ treatment*phase*hour +(1|id), per_parameter = "^hour$", data = obk.long, method = "nested-KR", check_contrasts = FALSE) # tests all parameters including hour individually mixed(value ~ treatment*phase*hour +(1|id), per_parameter = "hour", data = obk.long, method = "nested-KR", check_contrasts = FALSE) # tests all parameters individually mixed(value ~ treatment*phase*hour +(1|id), per_parameter = ".", data = obk.long, method = "nested-KR", check_contrasts = FALSE) # example data from package languageR: Lexical decision latencies elicited from # 21 subjects for 79 English concrete nouns, with variables linked to subject or # word. data(lexdec, package = "languageR") # using the simplest model m1 <- mixed(RT ~ Correct + Trial + PrevType * meanWeight + Frequency + NativeLanguage * Length + (1|Subject) + (1|Word), data = lexdec) m1 # Mixed Model Anova Table (Type 3 tests, S-method) # # Model: RT ~ Correct + Trial + PrevType * meanWeight + Frequency + NativeLanguage * # Model: Length + (1 | Subject) + (1 | Word) # Data: lexdec # Effect df F p.value # 1 Correct 1, 1627.67 8.16 ** .004 # 2 Trial 1, 1591.92 7.58 ** .006 # 3 PrevType 1, 1605.05 0.17 .680 # 4 meanWeight 1, 74.37 14.85 *** <.001 # 5 Frequency 1, 75.06 56.54 *** <.001 # 6 NativeLanguage 1, 27.12 0.70 .412 # 7 Length 1, 74.80 8.70 ** .004 # 8 PrevType:meanWeight 1, 1600.79 6.19 * .013 # 9 NativeLanguage:Length 1, 1554.49 14.24 *** <.001 # --- # Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1 # Fitting a GLMM using parametric bootstrap: require("mlmRev") # for the data, see ?Contraception gm1 <- mixed(use ~ age + I(age^2) + urban + livch + (1 | district), method = "PB", family = binomial, data = Contraception, args_test = list(nsim = 10)) ## note that nsim = 10 is way too low for all real examples! } \dontrun{ ##################################### ## Interplay with effects packages ## ##################################### data("Machines", package = "MEMSS") # simple model with random-slopes for repeated-measures factor m1 <- mixed(score ~ Machine + (Machine|Worker), data=Machines, set_data_arg = TRUE) ## necessary for it to work! library("effects") Effect("Machine", m1$full_model) # not correct: # Machine effect # Machine # A B C # 59.65000 52.35556 60.32222 # compare: emmeans::emmeans(m1, "Machine") # Machine emmean SE df asymp.LCL asymp.UCL # A 52.35556 1.680711 Inf 49.06142 55.64969 # B 60.32222 3.528546 Inf 53.40640 67.23804 # C 66.27222 1.806273 Inf 62.73199 69.81245 ## necessary to set contr.sum globally: set_sum_contrasts() Effect("Machine", m1$full_model) # Machine effect # Machine # A B C # 52.35556 60.32222 66.27222 plot(Effect("Machine", m1$full_model)) } } \references{ Baayen, R. H. (2008). \emph{Analyzing linguistic data: a practical introduction to statistics using R}. Cambridge, UK; New York: Cambridge University Press. Baayen, R. H., Davidson, D. J., & Bates, D. M. (2008). Mixed-effects modeling with crossed random effects for subjects and items. \emph{Journal of Memory and Language}, 59(4), 390-412. \doi{10.1016/j.jml.2007.12.005} Baayen, R. H., & Milin, P. (2010). Analyzing Reaction Times. \emph{International Journal of Psychological Research}, 3(2), 12-28. Barr, D. J. (2013). Random effects structure for testing interactions in linear mixed-effects models. \emph{Frontiers in Quantitative Psychology and Measurement}, 328. \doi{10.3389/fpsyg.2013.00328} Barr, D. J., Levy, R., Scheepers, C., & Tily, H. J. (2013). Random effects structure for confirmatory hypothesis testing: Keep it maximal. \emph{Journal of Memory and Language}, 68(3), 255-278. \doi{10.1016/j.jml.2012.11.001} Bates, D., Kliegl, R., Vasishth, S., & Baayen, H. (2015). \emph{Parsimonious Mixed Models}. arXiv:1506.04967 [stat]. Retrieved from \url{https://arxiv.org/abs/1506.04967} Dalal, D. K., & Zickar, M. J. (2012). Some Common Myths About Centering Predictor Variables in Moderated Multiple Regression and Polynomial Regression. \emph{Organizational Research Methods}, 15(3), 339-362. \doi{10.1177/1094428111430540} Judd, C. M., Westfall, J., & Kenny, D. A. (2012). Treating stimuli as a random factor in social psychology: A new and comprehensive solution to a pervasive but largely ignored problem. \emph{Journal of Personality and Social Psychology}, 103(1), 54-69. \doi{10.1037/a0028347} Luke, S. (2017). Evaluating significance in linear mixed-effects models in R. \emph{Behavior Research Methods}. \doi{10.3758/s13428-016-0809-y} Maxwell, S. E., & Delaney, H. D. (2004). \emph{Designing experiments and analyzing data: a model-comparisons perspective.} Mahwah, N.J.: Lawrence Erlbaum Associates. } \seealso{ \code{\link{aov_ez}} and \code{\link{aov_car}} for convenience functions to analyze experimental desIgns with classical ANOVA or ANCOVA wrapping \code{\link[car]{Anova}}. see the following for the data sets from Maxwell and Delaney (2004) used and more examples: \code{\link{md_15.1}}, \code{\link{md_16.1}}, and \code{\link{md_16.4}}. } \author{ Henrik Singmann with contributions from \href{https://stackoverflow.com/q/11335923/289572}{Ben Bolker and Joshua Wiley}. } afex/man/sk2011.2.Rd0000644000176200001440000001114713720444316013330 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sk2011.2-data.R \docType{data} \encoding{UTF-8} \name{sk2011.2} \alias{sk2011.2} \title{Data from Singmann & Klauer (2011, Experiment 2)} \format{ A data.frame with 2268 rows and 9 variables. } \source{ Singmann, H., & Klauer, K. C. (2011). Deductive and inductive conditional inferences: Two modes of reasoning. Thinking & Reasoning, 17(3), 247-281. doi:10.1080/13546783.2011.572718 } \usage{ sk2011.2 } \description{ Singmann and Klauer (2011) were interested in whether or not conditional reasoning can be explained by a single process or whether multiple processes are necessary to explain it. To provide evidence for multiple processes we aimed to establish a double dissociation of two variables: instruction type and problem type. Instruction type was manipulated between-subjects, one group of participants received deductive instructions (i.e., to treat the premises as given and only draw necessary conclusions) and a second group of participants received probabilistic instructions (i.e., to reason as in an everyday situation; we called this "inductive instruction" in the manuscript). Problem type consisted of two different orthogonally crossed variables that were manipulated within-subjects, validity of the problem (formally valid or formally invalid) and type of the problem. Problem type consistent of three levels: prological problems (i.e., problems in which background knowledge suggested to accept valid but reject invalid conclusions), neutral problems (i.e., in which background knowledge suggested to reject all problems), and counterlogical problems (i.e., problems in which background knowledge suggested to reject valid but accept invalid conclusions). } \details{ This data set contains 63 participants in contrast to the originally reported 56 participants. The additional participants were not included in the original studies as they did not meet the inclusion criteria (i.e., no students, prior education in logic, or participated in a similar experiment). The IDs of those additional participants are: 7, 8, 9, 12, 17, 24, 30. The excluded participant reported in the paper has ID 16. content has the following levels (C = content/conditional):\cr 1 = Wenn eine Person in ein Schwimmbecken gefallen ist, dann ist sie nass.\cr 2 = Wenn ein Hund Flöhe hat, dann kratzt er sich hin und wieder.\cr 3 = Wenn eine Seifenblase mit einer Nadel gestochen wurde, dann platzt sie.\cr 4 = Wenn ein Mädchen Geschlechtsverkehr vollzogen hat, dann ist es schwanger.\cr 5 = Wenn eine Pflanze ausreichend gegossen wird, dann bleibt sie grün.\cr 6 = Wenn sich eine Person die Zähne putzt, dann bekommt sie KEIN Karies.\cr 7 = Wenn eine Person viel Cola trinkt, dann nimmt sie an Gewicht zu.\cr 8 = Wenn eine Person die Klimaanlage angeschaltet hat, dann fröstelt sie.\cr 9 = Wenn eine Person viel lernt, dann wird sie in der Klausur eine gute Note erhalten. } \examples{ data("sk2011.2") ## remove excluded participants: sk2_final <- droplevels(sk2011.2[!(sk2011.2$id \%in\% c(7, 8, 9, 12, 16, 17, 24, 30)),]) str(sk2_final) ## Table 2 (inference = problem): aov_ez("id", "response", sk2_final[sk2_final$what == "affirmation",], between = "instruction", within = c("inference", "type"), anova_table=list(es = "pes")) aov_ez("id", "response", sk2_final[sk2_final$what == "denial",], between = "instruction", within = c("inference", "type"), anova_table=list(es = "pes")) # Recreate Figure 4 (corrected version): sk2_aff <- droplevels(sk2_final[sk2_final$what == "affirmation",]) sk2_aff$type2 <- factor(sk2_aff$inference:sk2_aff$type, levels = c("MP:prological", "MP:neutral", "MP:counterlogical", "AC:counterlogical", "AC:neutral", "AC:prological")) a1_b <- aov_ez("id", "response", sk2_aff, between = "instruction", within = c("type2")) sk2_den <- droplevels(sk2_final[sk2_final$what == "denial",]) sk2_den$type2 <- factor(sk2_den$inference:sk2_den$type, levels = c("MT:prological", "MT:neutral", "MT:counterlogical", "DA:counterlogical", "DA:neutral","DA:prological")) a2_b <- aov_ez("id", "response", sk2_den, between = "instruction", within = c("type2")) if (requireNamespace("emmeans") && requireNamespace("ggplot2")) { afex_plot(a1_b,"type2", "instruction") + ggplot2::coord_cartesian(ylim = c(0, 100)) afex_plot(a2_b,"type2", "instruction") + ggplot2::coord_cartesian(ylim = c(0, 100)) } } \keyword{dataset} afex/man/all_fit.Rd0000644000176200001440000000715613667760652013704 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/allFit.R \name{all_fit} \alias{all_fit} \alias{nmkbw} \title{Refit \code{lmer} model using multiple optimizers} \usage{ all_fit( m, meth_tab = cbind(optimizer = rep(c("bobyqa", "Nelder_Mead", "optimx", "nloptwrap", "nmkbw"), c(1, 1, 2, 2, 1)), method = c("", "", "nlminb", "L-BFGS-B", "NLOPT_LN_NELDERMEAD", "NLOPT_LN_BOBYQA", "")), verbose = TRUE, maxfun = 1e+06, ... ) nmkbw(fn, par, lower, upper, control) } \arguments{ \item{m}{a fitted model with \code{lmer}} \item{meth_tab}{a matrix (or data.frame) with columns - method the name of a specific optimization method to pass to the optimizer (leave blank for built-in optimizers) - optimizer the \code{optimizer} function to use} \item{verbose}{print progress messages?} \item{maxfun}{number of iterations to allow for the optimization rountine.} \item{...}{further arguments passed to \code{\link{update.merMod}} such as \code{data}.} \item{fn}{needed for \code{dfoptim::nmkb}} \item{par}{needed for \code{dfoptim::nmkb}} \item{lower}{needed for \code{dfoptim::nmkb}} \item{upper}{needed for \code{dfoptim::nmkb}} \item{control}{needed for \code{dfoptim::nmkb}} } \value{ a list of fitted \code{merMod} objects } \description{ Attempt to re-fit a [g]lmer model with a range of optimizers. The default is to use all known optimizers for R that satisfy the requirements (do not require explicit gradients, allow box constraints), in four categories; (i) built-in (\code{minqa::bobyqa}, \code{lme4::Nelder_Mead}), (ii) wrapped via optimx (most of optimx's optimizers that allow box constraints require an explicit gradient function to be specified; the two provided here are really base R functions that can be accessed via optimx, (iii) wrapped via nloptr, (iv) \code{dfoptim::nmkb}. } \details{ Needs packages \pkg{nloptr}, \pkg{optimx}, and \code{dfoptim} to try out all optimizers. \pkg{optimx} needs to be loaded explicitly using \code{library} or \code{require} (see examples). \code{nmkbw} is a simple wrapper function for fitting models with the corresponding optimizer. It needs to be exported for \code{lme4}, but should not be called directly by the user. } \note{ Very similar to the function of the same name that is part of \pkg{lme4}. The present function will be removed eventually in favor of the \pkg{lme4} function. } \examples{ \dontrun{ # basic usage require(optimx) gm1 <- glmer(cbind(incidence, size - incidence) ~ period + (1 | herd), data = cbpp, family = binomial) gm_all <- all_fit(gm1) t(sapply(gm_all,fixef)) ## extract fixed effects sapply(gm_all,logLik) ## log-likelihoods sapply(gm_all,getME,"theta") ## theta parameters !sapply(gm_all,inherits,"try-error") ## was fit OK? ## for GLMMs: require("mlmRev") # for data gm1 <- mixed(use ~ age*urban + (1 | district), family = binomial, data = Contraception, method = "LRT") gm_all <- all_fit(gm1$full_model) sapply(gm_all,logLik) ## use allFit in combination with expand.re = TRUE data("sk2011.2") # see example("mixed") sk2_aff <- droplevels(sk2011.2[sk2011.2$what == "affirmation",]) sk_m2 <- mixed(response ~ instruction*inference*type+(inference*type||id), sk2_aff, expand_re = TRUE) sk_m2 sk_m2_allFit <- all_fit(sk_m2$full_model) sk_m2_allFit # all fits fail sk_m2_allFit <- all_fit(sk_m2$full_model, data = sk_m2$data) # works t(sapply(sk_m2_allFit,fixef)) sapply(sk_m2_allFit,logLik) } } \seealso{ slice, slice2D in the bbmle package } \author{ Ben Bolker, minor changes by Henrik Singmann } afex/man/set_sum_contrasts.Rd0000644000176200001440000000156313664111747016035 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/set_contrasts.R \name{set_sum_contrasts} \alias{set_sum_contrasts} \alias{set_deviation_contrasts} \alias{set_effects_contrasts} \alias{set_treatment_contrasts} \alias{set_default_contrasts} \title{Set global contrasts} \usage{ set_sum_contrasts() set_deviation_contrasts() set_effects_contrasts() set_default_contrasts() set_treatment_contrasts() } \value{ nothing. These functions are called for their side effects to change the global options. } \description{ These functions are simple wrappers to set contrasts globally via \code{options(contrasts = ...)}. } \details{ \code{set_deviation_contrasts} and \code{set_effects_contrasts} are wrappers for \code{set_sum_contrasts}. Likewise, \code{set_default_contrasts} is a wrapper to \code{set_treatment_contrasts()}. } afex/man/fhch2010.Rd0000644000176200001440000000737713667760652013512 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/fhch2010-data.R \docType{data} \encoding{UTF-8} \name{fhch2010} \alias{fhch2010} \title{Data from Freeman, Heathcote, Chalmers, & Hockley (2010)} \format{ A \code{data.frame} with 13,222 obs. of 9 variables: \describe{ \item{id}{participant id, \code{factor}} \item{task}{\code{factor} with two levels indicating which task was performed: \code{"naming"} or \code{"lexdec"}} \item{stimulus}{\code{factor} indicating whether the shown stimulus was a \code{"word"} or \code{"nonword"}} \item{density}{\code{factor} indicating the neighborhood density of presented items with two levels: \code{"low"} and \code{"high"}. Density is defined as the number of words that differ from a base word by one letter or phoneme.} \item{frequency}{\code{factor} indicating the word frequency of presented items with two levels: \code{"low"} (i.e., words that occur less often in natural language) and \code{"high"} (i.e., words that occur more often in natural language).} \item{length}{\code{factor} with 3 levels (4, 5, or 6) indicating the number of characters of presented stimuli.} \item{item}{\code{factor} with 600 levels: 300 words and 300 nonwords} \item{rt}{response time in seconds} \item{log_rt}{natural logarithm of response time in seconds} \item{correct}{boolean indicating whether or not the response in the lexical decision task was correct or incorrect (incorrect responses of the naming task are not part of the data).} } } \source{ Freeman, E., Heathcote, A., Chalmers, K., & Hockley, W. (2010). Item effects in recognition memory for words. Journal of Memory and Language, 62(1), 1-18. http://doi.org/10.1016/j.jml.2009.09.004 } \usage{ fhch2010 } \description{ Lexical decision and word naming latencies for 300 words and 300 nonwords presented in Freeman, Heathcote, Chalmers, and Hockley (2010). The study had one between-subjects factors, \code{"task"} with two levels (\code{"naming"} or \code{"lexdec"}), and four within-subjects factors: \code{"stimulus"} type with two levels (\code{"word"} or \code{"nonword"}), word \code{"density"} and word \code{"frequency"} each with two levels (\code{"low"} and \code{"high"}) and stimulus \code{"length"} with three levels (4, 5, and 6). } \details{ In the lexical-decision condition (N = 25), subjects indicated whether each item was a word or a nonword, by pressing either the left (labeled word) or right (labeled nonword) outermost button on a 6-button response pad. The next study item appeared immediately after the lexical decision response was given. In the naming condition (N = 20), subjects were asked to name each item aloud, and items remained on screen for 3 s. Naming time was recorded by a voice key. Items consisted of 300 words, 75 in each set making up a factorial combination of high and low density and frequency, and 300 nonwords, with equal numbers of 4, 5, and 6 letter items in each set. } \examples{ data("fhch2010") str(fhch2010) a1 <- aov_ez("id", "log_rt", fhch2010, between = "task", within = c("density", "frequency", "length", "stimulus")) nice(a1) if (requireNamespace("emmeans") && requireNamespace("ggplot2")) { afex_plot(a1, "length", "frequency", c("task", "stimulus"), error = "within") afex_plot(a1, "density", "frequency", c("task", "stimulus"), error = "within") } \dontrun{ a2 <- aov_ez("id", "rt", fhch2010, between = "task", within = c("density", "frequency", "length", "stimulus")) nice(a2) if (requireNamespace("emmeans") && requireNamespace("ggplot2")) { afex_plot(a2, "length", "frequency", c("task", "stimulus"), error = "within") afex_plot(a2, "density", "frequency", c("task", "stimulus"), error = "within") } } } \keyword{dataset} afex/man/afex-package.Rd0000644000176200001440000000224013720444316014555 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/afex-package.R \docType{package} \name{afex-package} \alias{afex} \alias{afex-package} \title{\packageTitle{afex} Maintainer: \packageMaintainer{afex}} \description{ \packageDescription{afex} } \details{ The DESCRIPTION file: \packageDESCRIPTION{afex} } \seealso{ Useful links: \itemize{ \item \url{http://afex.singmann.science/} \item \url{https://github.com/singmann/afex} \item Report bugs at \url{https://github.com/singmann/afex/issues} } } \author{ \strong{Maintainer}: Henrik Singmann \email{singmann@gmail.com} (\href{https://orcid.org/0000-0002-4842-3657}{ORCID}) Authors: \itemize{ \item Ben Bolker \item Jake Westfall \item Frederik Aust (\href{https://orcid.org/0000-0003-4900-788X}{ORCID}) \item Mattan S. Ben-Shachar } Other contributors: \itemize{ \item Søren Højsgaard [contributor] \item John Fox [contributor] \item Michael A. Lawrence [contributor] \item Ulf Mertens [contributor] \item Jonathon Love [contributor] \item Russell Lenth [contributor] \item Rune Haubo Bojesen Christensen [contributor] } } afex/man/md_15.1.Rd0000644000176200001440000000643513667760652013335 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/md_15.1-data.R \docType{data} \encoding{UTF-8} \name{md_15.1} \alias{md_15.1} \title{Data 15.1 / 11.5 from Maxwell & Delaney} \format{ A data.frame with 48 rows and 4 variables. } \source{ Maxwell, S. E., & Delaney, H. D. (2004). Designing experiments and analyzing data: a model-comparisons perspective. Mahwah, N.J.: Lawrence Erlbaum Associates. p. 766 } \usage{ md_15.1 } \description{ Hypothetical IQ Data from 12 children at 4 time points: Example data for chapter 11/15 of Maxwell and Delaney (2004, Table 15.1, p. 766) in long format. Has two one within-subjects factor: time. } \details{ Description from pp. 534: The data show that 12 subjects have been observed in each of 4 conditions. To make the example easier to discuss, let's suppose that the 12 subjects are children who have been observed at 30, 36, 42, and 48 months of age. In each case, the dependent variable is the child's age-normed general cognitive score on the McCarthy Scales of Children's Abilities. Although the test is normed so that the mean score is independent of age for the general population, our 12 children may come from a population in which cognitive abilities are either growing more rapidly or less rapidly than average. Indeed, this is the hypothesis our data allow us to address. In other words, although the sample means suggest that the children's cognitive abilities are growing, a significance test is needed if we want to rule out sampling error as a likely explanation for the observed differences. To replicate the results in chapter 15 several different contrasts need to be applied, see Examples. \code{time} is time in months (centered at 0) and \code{timecat} is the same as a categorical variable. } \examples{ ### replicate results from Table 15.2 to 15.6 (Maxwell & Delaney, 2004, pp. 774) data(md_15.1) ### ANOVA results (Table 15.2) aov_4(iq ~ timecat + (timecat|id),data=md_15.1, anova_table=list(correction = "none")) ### Table 15.3 (random intercept only) # we need to set the base level on the last level: contrasts(md_15.1$timecat) <- contr.treatment(4, base = 4) # "Type 3 Tests of Fixed Effects" (t15.3 <- mixed(iq ~ timecat + (1|id),data=md_15.1, check.contrasts=FALSE)) # "Solution for Fixed Effects" and "Covariance Parameter Estimates" summary(t15.3$full.model) ### make Figure 15.2 plot(NULL, NULL, ylim = c(80, 140), xlim = c(30, 48), ylab = "iq", xlab = "time") plyr::d_ply(md_15.1, plyr::.(id), function(x) lines(as.numeric(as.character(x$timecat)), x$iq)) ### Table 15.4, page 789 # random intercept plus slope (t15.4 <- mixed(iq ~ timecat + (1+time|id),data=md_15.1, check.contrasts=FALSE)) summary(t15.4$full.model) ### Table 15.5, page 795 # set up polynomial contrasts for timecat contrasts(md_15.1$timecat) <- contr.poly # fit all parameters separately (t15.5 <- mixed(iq ~ timecat + (1+time|id), data=md_15.1, check.contrasts=FALSE, per.parameter="timecat")) # quadratic trend is considerably off, conclusions stay the same. ### Table 15.6, page 797 # growth curve model (t15.6 <- mixed(iq ~ time + (1+time|id),data=md_15.1)) summary(t15.6$full.model) } \author{ R code for examples written by Ulf Mertens and Henrik Singmann } \keyword{dataset} afex/man/md_16.4.Rd0000644000176200001440000000507113667760652013334 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/md_16.4-data.R \docType{data} \encoding{UTF-8} \name{md_16.4} \alias{md_16.4} \title{Data 16.4 from Maxwell & Delaney} \format{ A data.frame with 24 rows and 3 variables. } \source{ Maxwell, S. E., & Delaney, H. D. (2004). Designing experiments and analyzing data: a model-comparisons perspective. Mahwah, N.J.: Lawrence Erlbaum Associates. p. 574 } \usage{ md_16.4 } \description{ Data from a hypothetical inductive reasoning study. } \details{ Description from pp. 841: Suppose an educational psychologist has developed an intervention to teach inductive reasoning skills to school children. She decides to test the efficacy of her intervention by conducting a randomized design. Three classrooms of students are randomly assigned to the treatment condition, and 3 other classrooms are assigned to the control. Table 16.4 shows hypothetical data collected from 29 children who participated in the study assessing the effectiveness of the intervention to increase inductive reasoning skills. We want to call your attention to several aspects of the data. First, the 15 children with condition values of 0 received the control, whereas the 14 children with condition values of 1 received the treatment. Second, 4 of the children in the control condition were students in control Classroom 1, 6 of them were students in control Classroom 2, and 5 were students in control Classroom 3. Along similar lines, 3 of the children in the treatment condition were students in treatment Classroom 1, 5 were students in treatment Classroom 2, and 6 were students in treatment Classroom 3. It is essential to understand that there are a total of six classrooms here; we have coded classroom from 1 to 3 for control as well as treatment, because we will indicate to PROC MIXED that classroom is nested under treatment. Third, scores on the dependent variable appear in the rightmost column under the variable label "induct." Note that it would make a lot more sense to change the labeling of room from 1 to 3 nested within cond to 1 to 6. However, I keep this in line with the original. The random effects term in the call to mixed is therefore a little bit uncommon.#' } \examples{ # data for next examples (Maxwell & Delaney, Table 16.4) data(md_16.4) str(md_16.4) ### replicate results from Table 16.6 (Maxwell & Delaney, 2004, p. 845) # p-values (almost) hold: (mixed2 <- mixed(induct ~ cond + (1|room:cond), md_16.4)) # (1|room:cond) is needed because room is nested within cond. } \keyword{dataset} afex/man/predict.afex_aov.Rd0000644000176200001440000000301414071313113015450 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/predict.R \name{predict.afex_aov} \alias{predict.afex_aov} \title{Predict method for \code{afex_aov} objects} \usage{ \method{predict}{afex_aov}(object, newdata, append = FALSE, colname_predict = ".predict", ...) } \arguments{ \item{object}{\code{afex_aov} object.} \item{newdata}{An optional data frame in which to look for variables with which to predict. If omitted, the fitted values are used.} \item{append}{If set to \code{TRUE} returns the residuals/fitted values appended as an additional column to the long data. Recommended when data was aggregated across within conditions.} \item{colname_predict}{Name of the appended column when \code{append = TRUE}.} \item{...}{Not used.} } \value{ A vector of predicted values corresponding to the data in \code{object$data$long} or to \code{newdata}, or if \code{append = TRUE} a data frame with an additional column of predicted values. } \description{ Predicted values based on \code{afex_aov} objects. } \examples{ data(obk.long, package = "afex") # estimate mixed ANOVA on the full design: fit <- aov_ez("id", "value", obk.long, between = c("treatment", "gender"), within = c("phase", "hour"), observed = "gender") new_data <- expand.grid( treatment = "A", gender = "F", phase = c("pre", "post"), hour = c(1, 5) ) predict(fit, newdata = new_data) predict(fit, newdata = new_data, append = TRUE) } \author{ Mattan S. Ben-Shachar } afex/man/laptop_urry.Rd0000644000176200001440000000603114076011251014614 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/laptop_urry-data.R \docType{data} \encoding{UTF-8} \name{laptop_urry} \alias{laptop_urry} \title{Replication of Laptop Note Taking Study (Urry et al. 2021, Psych. Science)} \format{ A data frame with 142 rows and 6 variables: \describe{ \item{pid}{participant id, factor with 142 levels} \item{condition}{experimental condition (laptop, longhand), factor with 2 levels} \item{talk}{TED talk seen by participant, factor with 5 levels} \item{overall}{overall memory score ranging from 0 (= no memory) to 100 (= perfect memory).} \item{factual}{memory score on the factual questions ranging from 0 (= no memory) to 100 (= perfect memory).} \item{conceptual}{memory score on the conceptual questions ranging from 0 (= no memory) to 100 (= perfect memory).} } } \source{ Urry, H. L., Crittle, C. S., Floerke, V. A., Leonard, M. Z., Perry, C. S., Akdilek, N., Albert, E. R., Block, A. J., Bollinger, C. A., Bowers, E. M., Brody, R. S., Burk, K. C., Burnstein, A., Chan, A. K., Chan, P. C., Chang, L. J., Chen, E., Chiarawongse, C. P., Chin, G., … Zarrow, J. E. (2021). Don’t Ditch the Laptop Just Yet: A Direct Replication of Mueller and Oppenheimer’s (2014) Study 1 Plus Mini Meta-Analyses Across Similar Studies. *Psychological Science*, 0956797620965541. \doi{10.1177/0956797620965541} } \usage{ laptop_urry } \description{ Original abstract: In this direct replication of Mueller and Oppenheimer’s (2014) Study 1, participants watched a lecture while taking notes with a laptop (n = 74) or longhand (n = 68). After a brief distraction and without the opportunity to study, they took a quiz. As in the original study, laptop participants took notes containing more words spoken verbatim by the lecturer and more words overall than did longhand participants. However, laptop participants did not perform better than longhand participants on the quiz. } \details{ Own description: Heather Urry and 87 of her undergraduate and graduate students (yes, all 87 students are co-authors!) compared the effectiveness of taking notes on a laptop versus longhand (i.e., pen and paper) for learning from lectures. 142 participants (which differed from the 88 authors) first viewed one of several 15 minutes lectures (TED talks) during which they were asked to take notes either on a laptop or with pen and paper. Participants were randomly assigned to either the laptop (N = 68) or longhand condition (N = 74). After a 30 minutes delay, participants were quizzed on the content of the lecture. There were two types of questions, factual and conceptual questions. The answers from each participant were then independently rated from several raters (which agreed very strongly with each other) using a standardised scoring key producing one memory score per participant and questions type ranging from 0 (= no memory) to 100 (= perfect memory). We also aggregated the two different scores into one overall memory score. } \keyword{dataset} afex/man/afex_aov-methods.Rd0000644000176200001440000001334214076011251015470 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/methods.afex_aov.R \name{afex_aov-methods} \alias{afex_aov-methods} \alias{anova.afex_aov} \alias{print.afex_aov} \alias{summary.afex_aov} \alias{recover_data.afex_aov} \alias{emm_basis.afex_aov} \title{Methods for afex_aov objects} \usage{ \method{anova}{afex_aov}( object, es = afex_options("es_aov"), observed = NULL, correction = afex_options("correction_aov"), MSE = TRUE, intercept = FALSE, p_adjust_method = NULL, sig_symbols = attr(object$anova_table, "sig_symbols"), ... ) \method{print}{afex_aov}(x, ...) \method{summary}{afex_aov}(object, ...) recover_data.afex_aov(object, ..., model = afex_options("emmeans_model")) emm_basis.afex_aov( object, trms, xlev, grid, ..., model = afex_options("emmeans_model") ) } \arguments{ \item{object, x}{object of class \code{afex_aov} as returned from \code{\link{aov_car}} and related functions.} \item{es}{Effect Size to be reported. The default is given by \code{afex_options("es_aov")}, which is initially set to \code{"ges"} (i.e., reporting generalized eta-squared, see details). Also supported is partial eta-squared (\code{"pes"}) or \code{"none"}.} \item{observed}{character vector referring to the observed (i.e., non manipulated) variables/effects in the design. Important for calculation of generalized eta-squared (ignored if \code{es} is not \code{"ges"}), see details.} \item{correction}{Character. Which sphericity correction of the degrees of freedom should be reported for the within-subject factors. The default is given by \code{afex_options("correction_aov")}, which is initially set to \code{"GG"} corresponding to the Greenhouse-Geisser correction. Possible values are \code{"GG"}, \code{"HF"} (i.e., Hyunh-Feldt correction), and \code{"none"} (i.e., no correction).} \item{MSE}{logical. Should the column containing the Mean Sqaured Error (MSE) be displayed? Default is \code{TRUE}.} \item{intercept}{logical. Should intercept (if present) be included in the ANOVA table? Default is \code{FALSE} which hides the intercept.} \item{p_adjust_method}{\code{character} indicating if p-values for individual effects should be adjusted for multiple comparisons (see \link[stats]{p.adjust} and details).} \item{sig_symbols}{Character. What should be the symbols designating significance? When entering an vector with \code{length(sig.symbol) < 4} only those elements of the default (\code{c(" +", " *", " **", " ***")}) will be replaced. \code{sig_symbols = ""} will display the stars but not the \code{+}, \code{sig_symbols = rep("", 4)} will display no symbols. The default is given by \code{afex_options("sig_symbols")}.} \item{...}{further arguments passed through, see description of return value for details.} \item{model}{argument for \code{\link[emmeans]{emmeans}()} and related functions that allows to choose on which model the follow-up tests for ANOVAs with repeated-measures factors are based. \code{"multivariate"} (the default) uses the \code{lm} model and \code{"univariate"} uses the \code{aov} model. Default given by \code{afex_options("emmeans_mode")}. Multivariate tests likely work better for unbalanced data and provide a better correction for violations of sphericity.} \item{trms, xlev, grid}{same as for \code{\link[emmeans]{emm_basis}}.} } \value{ \describe{ \item{\code{anova}}{Returns an ANOVA table of class \code{c("anova", "data.frame")}. Information such as effect size (\code{es}) or df-correction are calculated each time this method is called.} \item{\code{summary}}{For ANOVAs containing within-subject factors it returns the full output of the within-subject tests: the uncorrected results, results containing Greenhousse-Geisser and Hyunh-Feldt correction, and the results of the Mauchly test of sphericity (all achieved via \code{summary.Anova.mlm}). For other ANOVAs, the \code{anova} table is simply returned.} \item{\code{print}}{Prints (and invisibly returns) the ANOVA table as constructed from \code{\link{nice}} (i.e., as strings rounded nicely). Arguments in \code{...} are passed to \code{nice} allowing to pass arguments such as \code{es} and \code{correction}.} \item{\code{recover_data} and \code{emm_basis}}{Provide the backbone for using \code{\link[emmeans]{emmeans}} and related functions from \pkg{emmeans} directly on \code{afex_aov} objects by returning a \code{\link[emmeans]{emmGrid-class}} object. Should not be called directly but through the functionality provided by \pkg{emmeans}.} } } \description{ Methods defined for objects returned from the ANOVA functions \code{\link{aov_car}} et al. of class \code{afex_aov} containing both the ANOVA fitted via \code{car::Anova} and base R's \code{aov}. } \details{ Exploratory ANOVA, for which no detailed hypotheses have been specified a priori, harbor a multiple comparison problem (Cramer et al., 2015). To avoid an inflation of familywise Type I error rate, results need to be corrected for multiple comparisons using \code{p_adjust_method}. \code{p_adjust_method} defaults to the method specified in the call to \code{\link{aov_car}} in \code{anova_table}. If no method was specified and \code{p_adjust_method = NULL} p-values are not adjusted. } \references{ Cramer, A. O. J., van Ravenzwaaij, D., Matzke, D., Steingroever, H., Wetzels, R., Grasman, R. P. P. P., ... Wagenmakers, E.-J. (2015). Hidden multiplicity in exploratory multiway ANOVA: Prevalence and remedies. \emph{Psychonomic Bulletin & Review}, 1-8. \doi{10.3758/s13423-015-0913-5} } \seealso{ \code{residuals} and \code{fitted} methods also exists for \code{afex_aov} objects, see: \code{\link{residuals.afex_aov}}. } afex/man/residuals.afex_aov.Rd0000644000176200001440000000607314071313113016021 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/residuals.R \name{residuals.afex_aov} \alias{residuals.afex_aov} \alias{fitted.afex_aov} \title{Extract Residuals and Fitted Values from \code{afex_aov} objects} \usage{ \method{residuals}{afex_aov}(object, append = FALSE, colname_residuals = ".residuals", ...) \method{fitted}{afex_aov}(object, append = FALSE, colname_fitted = ".fitted", ...) } \arguments{ \item{object}{\code{afex_aov} object.} \item{append}{If set to \code{TRUE} returns the residuals/fitted values appended as an additional column to the long data. Recommended when data was aggregated across within conditions.} \item{colname_residuals, colname_fitted}{Name of the appended column when \code{append = TRUE}.} \item{...}{Additional arguments passed to \code{residuals.lm}/\code{fitted.lm}.} } \value{ A vector of residuals/fitted values corresponding to the data in \code{object$data$long}, or if \code{append = TRUE} a data frame with an additional column of residuals/fitted values. } \description{ Extract Residuals and Fitted Values from \code{afex_aov} objects. } \examples{ ### Setup ANOVAs data(obk.long, package = "afex") between <- aov_car(value ~ treatment*gender + Error(id), data = obk.long) within <- aov_car(value ~ 1 + Error(id/(phase*hour)), data = obk.long) mixed <- aov_car(value ~ treatment * gender + Error(id/(phase*hour)), data = obk.long) # All residuals call produce the message that the data was changed during calculation. residuals(within) residuals(mixed) residuals(between) ## Get residuals plus data used for fitting: residuals(within, append = TRUE) residuals(mixed, append = TRUE) residuals(between, append = TRUE) ### in case data is correctly ordered before fitting, this message is not shown ## between data: obk2 <- aggregate(value ~ gender + treatment + id , data = obk.long, FUN = mean) between2 <- aov_car(value ~ treatment*gender + Error(id), data = obk2) residuals(between2) ## no message all.equal(obk2, between2$data$long[,colnames(obk2)]) ## TRUE # Therefore okay: obk2$residuals <- residuals(between2) ## within data obk3 <- obk.long[with(obk.long, order(id, phase, hour)), ] within2 <- aov_car(value ~ 1 + Error(id/(phase*hour)), data = obk3) residuals(within2) ## no message, because order is correct # Therefore okay: obk3$residuals <- residuals(within2) ## Same for fitted values: # (show message) fitted(within) fitted(mixed) fitted(between) ## Get fitted values plus data used for fitting: fitted(within, append = TRUE) fitted(mixed, append = TRUE) fitted(between, append = TRUE) ## No message: fitted(between2) fitted(within2) #### residuals() and fitted() methods can be used for plotting ### requires package ggResidpanel if (require("ggResidpanel")) { resid_auxpanel(residuals = residuals(mixed), predicted = fitted(mixed)) \dontrun{ ## suppress Messages: suppressMessages( resid_auxpanel(residuals = residuals(mixed), predicted = fitted(mixed)) ) } } } \author{ Mattan S. Ben-Shachar } afex/man/afex_options.Rd0000644000176200001440000000724613664111747014760 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/helpers.R \name{afex_options} \alias{afex_options} \title{Set/get global afex options} \usage{ afex_options(...) } \arguments{ \item{...}{One of four: (1) nothing, then returns all options as a list; (2) a name of an option element, then returns its' value; (3) a name-value pair which sets the corresponding option to the new value (and returns nothing), (4) a list with option-value pairs which sets all the corresponding arguments. The example show all possible cases.} } \value{ depends on input, see above. } \description{ Global afex options are used, for example, by \code{\link{aov_car}} (et al.) and \code{\link{mixed}}. But can be changed in each functions directly using an argument (which has precedence over the global options). } \details{ The following arguments are currently set: \itemize{ \item \code{check_contrasts} should contrasts be checked and changed to sum-to-zero contrasts? Default is \code{TRUE}. \item \code{type} type of sums-of-squares to be used for testing effects, default is 3 which reports Type 3 tests. \item \code{method_mixed}: Method used to obtain p-values in \code{\link{mixed}}, default is \code{"KR"} (which will change to \code{"LRT"} soon). (\code{mixed()} only) \item \code{es_aov}: Effect size reported for ANOVAs (see \code{\link{aov_car}}), default is \code{"ges"} (generalized eta-squared). \item \code{correction_aov}: Correction used for within-subjects factors with more than two levels for ANOVAs (see \code{\link{aov_car}} or \code{\link{nice}}), default is \code{"GG"} (Greenhouse-Geisser correction). (ANOVA functions only) \item \code{emmeans_model}: Which model should be used by \pkg{emmeans} for follow-up analysis of ANOVAs (i.e., objects pf class \code{"afex_aov"})? Default is \code{"univariate"} which uses the \code{aov} model object (if present). The other option is \code{"multivariate"} which uses the \code{lm} model object (which is an object of class \code{"mlm"} in case repeated-measures factors are present). \item \code{include_aov}: Should the \code{aov} model be included into ANOVA objects of class \code{"afex_aov"}? Setting this to \code{FALSE} can lead to considerable speed improvements. \item \code{factorize}: Should between subject factors be factorized (with note) before running the analysis? Default is \code{TRUE}. (ANOVA functions only) \item \code{sig_symbols}: Default significant symbols used for ANOVA and \code{mixed} printing. Default is\code{c(" +", " *", " **", " ***")}. \item \code{lmer_function}: Which \code{lmer} function should \code{mixed} or \code{lmer_alt} use. The default is \code{"lmerTest"} which uses \code{\link[lmerTest]{lmer}}, \code{"lme4"} is also possible which uses \code{\link[lme4]{lmer}}. Note that \code{mixed} methods \code{"KR"} and \code{"S"} only work with \code{"lmerTest"}. For the other methods, \code{"lme4"} could be minimally faster, but does not allow to use \code{lmerTest::anova()}. \item \code{return_aov}: Return value of the ANOVA functions (see \code{\link{aov_car}}), default is \code{"nice"}. } } \note{ All options are saved in the global R \code{\link{options}} with prefix \code{afex.} } \examples{ afex_options() # see all options afex_options("return_aov") #get single option aop <- afex_options() # save current options \dontrun{ # change options afex_options(return_aov = "nice") afex_options("return_aov") #get single option afex_options(return_aov = "nice", method_mixed = "LRT") afex_options("method_mixed") #get single option # do something } afex_options(aop) # reset options } afex/man/figures/0000755000176200001440000000000014076011251013411 5ustar liggesusersafex/man/figures/README-unnamed-chunk-7-1.png0000644000176200001440000001524314076011251020116 0ustar liggesusersPNG  IHDR \1nPLTE:f:f:f?b?b333::::f::f:::f:????b??b???MMMMMnMMMnMnMMbb?bbb?b?bbbbff:fff:fffnMMnMnnMnnn????bbَMMMnMnMnnn:::ff۶b٫nMnnMff:ې?ٽپȎMٟbٽٟٽې:nfȎې۶9+ pHYsodIDATx흋qW&"Jj&҉eMq ,0qo8~w0xg+(beS; $*Z(j %Н):F$ J,~7qVzٷ <*SRW OR7sӇFE9-=F=Qi+}?慘d􀖞Cm􋿦 [ Z7]{,"@Ke\eGS.~Qw3eTm<̓=iӃӼ=GaIF$IeJ'A(P t@ (5OSruD! )7 6>wjP:S(%Δ`I3%2X@L P:S(%Δ`I35aIuIEڷhl@$"[$2(~@zSm$5bYjw=v@Aq ("cjeŚPPM 9R "T}+^@]J(̔(LPBh$ix@bzДrXXVKcJEY  Jg*@}FQ$ҙPP>^;y:'''hA=L. hCfBZ@a"O{> uWCI*#IXP@(J|xA{PS)ͨOPD(!@SeZUҊdiA*n8Z,I+@64vK(~'dBU7b>(u>iI&,S26@M(N ҩTR($R@sN*A@aPbJ#BiD*$ h2xP:S*t-4T@_|4{ūg۟oO<)ұxPb@rzyzW4?*_|yfj bZſܩ 8d1pRP.,2:VDǀk;-{&UZvYc}"x#hJ%$W/PBKQ"6|[UW(xU?h4Ib) @am:a?%:MN UYhzظ{YD (†LqSL (T"BXIHX䍤 *.DY:LIjS|S%TJ RŃv2V6)Fi dii~sPl#ɴxY2RST5&Bk!۵ .EsG)AM@Qߧ1RkGhΒES+TfI5=&,"qkEs{3c+df JAAMIr)~@hs/"=t@)'@H@L1]9fʾ` /sK; m t 6ZT![՟3Z!cuZ&nV 65ItS0ˌAïWXWt;mߘaOHAa)vbezeٞz=/{%śr:<,EQ?z%g],+A}qrh}9(Esw]<k@*שl^V4hAn;3tLEs=.˲к*[6SKx9-Pqc>b~/nfeui.!LF^[-O9\< d15HBػ3 st]@/n^_}@{Y_hFf2M8&$hAq,^Z)waiVeſ2>W^_MNr?vr7{3d5/2Om%ԺsN8V=FY<97dhV4Rho8]i3ʬE(iܩ\Nh2f{6վ7FroܰB\@/o5[Z񐸗Y*;' )?`(a\`(:@O:9Am`6?3n2oC;k (b,u*M(ph~[X0~7  Аp5ލK&+|,]e@Z{@@ɖ*z\%C'Z}?@:&g`0ϬVsSf _qH%o$#g ?{|}8S]W[:olCx@CT{NdG=҉kz tE@ ןO񁪖/[l,^bj=’QOjUsuۻ0˼p!t-2Y;|o}EfΩV~sA%U=i_R{be:TZ,2h?AY]ΏOJvQ'vf|BQu (D:,gY9h=Q9hS[&m򨭫C2f3E0JHb?6,M oZKVm\+^Z\}0eMx"c>ݮGo079SSz/ uxͼs?hT}teMC HB=5*N\\b^d+NCA~6SW($.Y%X47+吽oۣ^lU-2 :Y-#IAdf} PK>o9#6BGPϥֿet@=1wX^̹A).@7x>>yvY[c1_fDe|^<$_l5WtԧAyIo>t//#h_͉l`4 Oڧ}5I5-=vp^AMtjFMcxWX;O(<wfqGv2(dpr7w_''770]O[@@ Vm-춡:ƫ^Q/#wy,yA9n=Pw]OL)~OC6| t֒RKw]0ixuNg@>yq82g1يGui(v (|PCU5\/;*>@L,S (vkz9t"̈́ʗ&| PPE ]aJFz]7KuNw͢|-2yZ&AmqZs,sdWdh][Ԗk%]jL>"eT+Frm1|-2r#v}SU / qZ7dL]A;w QF#,63(t;}ܪzaed7Yd\W't>mb`RCADgv \ ),(9v+~2(VgN ; {7{*h:5.{{oդҥ쨛#e6@E၉AU`ܳڀٍھ .EmŴA=etHmPzz_즳-hZtkMVy=lhm,f94~Тi6 A.@c\%켡P@c#HE>PUo*Viw 8u"Ų<^wۈT堘Siw(Y>e6p̈́@2,[isexVurfvci-CP@i93;PrF}:0nX|獡NUMJ4( jEJL:hEs% sfK(x}^&AI$JGPv%ԥQ}]K=@5P7J (>%- ˱\Զ4f-.pJ@=@]*^+@} O3jv:=^;B}z/B15&nzHuI(-wNN[(Kn)JDPɿ%9($┑$F%%iΒOgIuIEڧ$. Htd$%A^J!yiЩ((DuN糊t.=LVj%z$9(܀q?U4Հz/%%iΒOgIuIEڧ$4iJ(!"ˇξxJ%žxJ%žxJ%~@E@EQKE-TPQrexqUſZikI'u^^{ dfWS>-[!/;7+ TaVo?.^?Fz&vU<-?7"Q{\Jˋ,N3WzfM/Q|pz r*ʰڝ$Џf3U<~VI|GEmDA]Ii/"K4|;ֲ Ai-/ )PRWS>T_T^yuZ+nq{1mLxʧ)A{JxRq5OHH$"*Z(j [LJ:P %zue׋^Yvuj6__ Ƌ{W|w/ڳ-ꗂ/__z%@*ͳjr% ԯ,IU޽WLHh)ϮM!Q ep"B BFE8YdB%( /(ꂞ9xSѯa6B5At6Ao=o}nxy{_~4pܾ}{>ݳ>c{&2 I~6=sj9wyp;\<BN+vq?>^<>m g] g5 "l|k"orvg߮]mj%/Pn*l[QȂaVZy7{vZ(eZ` 08@;xMcbQd4xtc t4XS o#@?P D Lq[M|4׺RH37T3@_[ ^Ssu[e W͋@<߸xF2Sw*k^Pe|lP?5`c ?@I@R5%}{^+uGv(0lhw; JܼD9(Q,*!zmyro~G 36Pd*ʀf~4Y+b9.ԀaWk WmIA(-_rwdwz&wA7[5k_1۪S sxѠ_(¶Z'fsSSDyl^7*X)v |Χ[KȝzMM~?-,힆vSS@=腈y}Aڛ i<Q78.*RW#IExÞ>)exO-ul7en+HPϔۿo膮tnM9 j޼!#&1 **VA.MET(. D: @i hʀdj6ʀLJ"^ d3}Bȇɏ0v~»xj0 1b'i e M? u&{ <v? Կ:h2 o#(xV" 7ϔ^PކMw\a6棨q[2 Xmmj@L  wC峛 @4ГyGQ(pn é\_> 106#uS0ml"w7?W k;EzrE)u8`,@p)6 r@0˭ πq(jb( @غ n D1j_j;@Y M`ld`4B NE `+e0\ ٰsKX?_$ S 89Tn@ B 2wC PIc~$+ЮL*/^X  B@/Ȓ4gId,dYW4 Lu@3 h0)Ej 2Krz:E=2j9^r2hhgg(3@Gh2X T7e]#aP6d 4KdeAʂ F SmuC@d1@vLdhH ""@ʉ @0-;>2:_~`~wz𻿞k??~r֖i_g\oW xb4)ye<w.&|sX ?GB &[,A/?z0-7'8JMk+d#Yπ7}~z7' 5/a^W5x hKMЧX H:i;zAwOzAՊ{G؍َ{Gz.,,,bZ-Mr@yz-Q'cM郏Lpɣ}t}XA`A' cy{eӅX;$RܾB#N ;QބbIENDB`afex/man/figures/README-unnamed-chunk-6-1.png0000644000176200001440000001603714076011251020117 0ustar liggesusersPNG  IHDR \1qPLTE:f:f:f?b?b333::::f::f:::f:????b??b???MMMMMnMMMnMnMMbb?bbb?b?bbbbff:fff:fffnMMnMnnMnnn????bbَMMMnMnMnnn:::ff۶b٫nMnnMff:ې?ٽپȎMٟbٽٟٽې:nfȎې۶ͣ pHYsodTIDATx흋qWՇ,>tb}JeZ'-U#ᆕbv1$'wV+(cU$*Z(k %8OKr5*/1%&WyA)4 jL U^PcJMShrԘ@Ɣ\5ǟSzwy+W~_W~o&?oO|ހ~NctU2Q>|??Qm=} ihDX7 S}6 'yyM<6>|/'o;砝jJy*=>:u euLU(qJ_Y6Oeh"KeGeנ_/fc4z]{ZW]=s; ($W#JMShrԘ@Ɣ\5pxȫ0)"A:u-\(̔($(r !)ge'K/^G]PE/BxC. f)P}% (%",Aa&K3twzPQ:>>NPR"YJԋYEh*[fBZ SEʭpe~h@NVl&Ѕ94{T*Pa=y@V'BZr/Eв^OaeJ j$xiW橧 b'bB0b>wWOwg>iI&,S3.iGڠʭN2txA)$ӒGwN@@e=Mt1mPJ'BZL/X8P}%+@˹o$P9}_4f}տRLދ\#UӀ쯾^W+%LZΌ|+ B{/?A t1ܕ]i^~zwkk7jq{cQL2:RUR;`4}=ҋZҋoȽ^a"@YZ% jـn栫 L$b,-|Ŕ<^%JTP',N 4ڌ1fXJTY"~0K!AjV'UY j\O/:n7`O{EPPcJ(춟7`=5- W<@AR8),_ gIJ4v!"h3%93!z,ɄeJԴ**lWO,sle[ $`eAiʒy/~L>b;I%XY|P :eeR4 (f"v-1?Z|z k2c Fh,ЉS%Ԃ*L5h9k@]"qڗ)lEs{3@m2f3yK^"AA]ʝ$"@g )}/{ќL[L!<ۋ,RA ǗjOple&Kz a~{ } 5ii8>~*VebA}AދS)eIL7o[i}vԬr)4g?wCJ8*WK%N-נWS Ukyv+RkP u 8φ{ |5W_zR_ݷ(ZLʆJhnQN˖C}нM*/JnFJwڙfj܇^U]@JjE P@n[ wnTms+~q]B@ .Bu}~ :)TS0"$t0m%TmXƵի[nk/GZ]@#.fhUAYKU.zyfLϿ{[{.txW[M|*2+(XPmZ؛x~ZOا jU ga&Vv3w'p&2$4| @L(} ?v Ws @pj4E (9Ym.$ހ惂ǦcʐFĔFcNRpc2Nobs}uPXlJ:RUB km?,r ֠&{+ PKfL@!RzӭnjP^tut-p63c:@.:W5hQ+t,rP^Ba`fvKLcݹi}7i-55WUO[c\9WӅڭ͏߭zfhË zgA|D:<8itoA/^GYy5s.;^昣tjPl,9hhOd:p2h3ni67@IsPAvBqsfwQ&7l\P)/ 7׽axHWY*;OAAMPS\Ep֪v7/o^<46̀"7Ad[:חu~[X0Kܛy\vntA=i~iaavvt>5Bzg?mr^_OT^?sr2W#5؇]Y/Ғx<24ԠOT{Ͻk fKV{F(<(ۀ{wףӉzuSKF@AWz?ꇷU|fc?Qwn\{uA(8('WKFrԪuat!:8*t#l9Y9??5O=D /pGR}[fYzTK!wZ/7ϒ-ao.kPV@C~t;g~BӼDŽ/d>  質B=Q9躉L tIJ5^ ،ﳜ+^M%+@_՞!~"o9n#7Xfԓ>hmlu hAc[ AKi$f쀮;I. i7Lc 8>߸a6]/[@2`bQNjד%a}SUA^s@e*4*¨Y}'c ?of7C>-#~/~|x}:&B=v%ǩKm@p=sܲ^|99s5xajǙ5[UϲcP3YXCϼe26ӣh*cǠ:Nϸ"xtPss} tswqk(fx~mZ=&iUS qP8(m?.zv@mF K9 `Բ#2ETR}LT tIՠԮ?-A5wݫp|ŬArPԕdE:i{s2\ϥt^^Z/]p"=]nŤnՠфM1EA؆chಌz,-6,NtxQt {GX4 hd rŒhdVMz~=S= Yڳ9y^ve_61j6:*? dVMcoWunU\ jUMݫp|M}Qut=ʤ8wiVwþ !-it?w{Rau#ev@zYxA:l(Y5f :r~ێOY9( 㠕n)[AWoJvҙztOdȁ]7X(B[#=>>ejOجN;;N-zc|rnȮh77[jIzJ6MS@߻I(B=mHsrPLf2dF|a& DpPvݫp|1hۦH@ϙʂ]@r~f@)gԗmߋƭNU]XYpPݔ/H駀7NHH@]eP߄2%ԠTʾen^UMXb?>euGevP7Q@( vgq@KbjLݫp|IS6>s@ 5U8Pԣp|I/zS:>xW癩;QS')qTAr~M~uGu=' %; AUA$5ɿJ&o8AMޝHr\^"Z S@A-t&AMJh ijrOPBSpOS7 `EM~) f(>% <%"YJTTuMTTuMTTuMTTuMTTuMTTu*PE;Iy)< :SpOSK G!t>XX&?+=a Й{Ãq/>׮V bX)1M:<Ň .Q:SpOSKA-}0]kPqc#@g ,_P&KA-Z/ާ/g>US;*{뎼i8HXGڧ*>% <%"Yiq,Oh8Od}:Ki* I* I* I* I* I* Iz1QytS* ,S* ,S* ,S**He-TPQ@EY+xqU뫽}^qU<߱͟?OmgȗTPRWS>4T˺9}p +qs7tUv넴~솴@R$KvEkh\&v ݫ:ϊ6U%<PQ@EYKe-TPQ@EYKe-TPQ@EY}1/5XIENDB`afex/man/figures/README-unnamed-chunk-18-1.png0000644000176200001440000001017714076005651020210 0ustar liggesusersPNG  IHDR TcPLTE:f:f333::::f::f:::MMMMMnMMMnMnMMff:fff:f:fnMMnMnnMnnnMMMnMnMnn::::fff۶ېnMnnnMfېȎMې:nfȎې۶&s5 pHYsod&IDATx [ܸII&n\vm7-ɶЅI eRIXŶlK:|n0Z:*]     _Uj? A~vp!p~8?z9};'~e2<(%8*WI)jJpa~yϧJ$KM Ez<\$,P ?/L&uɤڝ7}4`z~0x6 Sq_=B$*U6g<<=J#xg!p~8?pߠ'b B@X!Ef9L77P@d^@d^ :R4x ^:M\B@ 5JvMlm)΄U!.Eh KpC@!BMfτ;z"L+bRV"?U?YMG(o#Om!phle36 Y [ $0Y,lY/w|Nۧ]`i..g; XiWmEts9;<fTt"Ɔ[ CM]j/#QSt&n h02h\aԩ X>wV+jMZ CH|h[`FWC7&@BH-Bw;314L8IxXhp+xHfd6kw֍s(U-ɕZz)# VG"MAaS&y {r[xTHpS}R}ͮTqؒ\JeQ)xPDоH$t [irl:)t\Zz2?X#L-~FAW3XO[ֵ T6Unm@Ps ]c\DH$t)i@vf_qϰ,M"lyYS 66qa5aWsNzZ8}=$k.aOۄ^(oBn˵eHfd SyvA~zƛv8s @ 7x$ C+h0½ 'R/J mclӭ2L:S~oQ}u5\7ra 8 `<&.h>?)-H]R16\jJʰY }]90oYrU CIᕾ!W6mALHE oݹxѾx^E"徧ɩS'[;IAt=b٧Zl Ij vWhv||,;5V@d9nQ~ӧc%?|UYI2W_)b@ʆ7-P>5VZRSl{mEqo45V:Dmm=FWذoE BV| IW:cj';7î:Eݬ ++9j87n][I:w$v@S_a'b^QpbxE<% |W.(D7?WQ׈-vA&(y@]Ll|ZJ[}1;G'Wm j &%Woo~.m5=VҤd^Lē,7-` .H6 1U2?@I `g<@oo _= ]w ^ juʛ\Y՞Z $-Eky@3}V6hw3ӫ w idY!Wa_/Hcg]^hN]59i=6rd>(![ %F tiS!Lp @ Jf?;0 vcr|~tϸD ܼLie2<3NwK<\W#Q-Ɖ ,Lˣ|ڧ Zn(edhRĠY Qh~A(CJY C#%[D5Ri)X-7 IdX/$Z/,woQO 8L[7OvkA{wP`5?u-y2 P25Iн"Sp& 3O ^ _Ow58%]L,K3:(VVѨzPn- K[@թ @&`AպGε|&lA0p;YXBg]cZ9g-hFȹ^NY:z @x蛻!ty{~<h_o枸P2= tC!p~q10.t"B:(Vh [J9([@g$0-I IDM%G$&QJ $"fJ!u1p"S D<\F[GMdIS9uD)&yD VEuDߊ @@0V4|ZM./f5   ؅5>gfz (?KȲ"dϪio|.W܏EzΗq4͓>  [oE|uq9Myk}a0yտ;~|M9gI-\]͹}wGƀ}6|%ΒfB?isbd<]`OWfO$ܾ.(T x д^}PDfu:>l؊y(?d}0w1wB1H!`!`!`!`!`!`!`!`!`;IENDB`afex/man/figures/README-unnamed-chunk-19-1.png0000644000176200001440000001127414076005652020211 0ustar liggesusersPNG  IHDR TcPLTE:f:f333::::f::f:::MMMMMnMMMnMnMMff:fff:f:fnMMnMnnMnnnnnMMMnMnMnn::::fff۶ېnMnnMfېȎMې:nfȎې۶Le pHYsodZIDATx흋۶$sZۺx,ݒn)ؘbVYLkuvlp %!<~a%oV.@"E,Xf~;+O %%%%%%0֙c6BLUYA @ U@`E7J`$8K`/ˢ0p^,PW@_iUp4)d> }02@J2} 0O!ң U:2A>EQP[CW4%)kEJ@#YYz䳟o=[Pnu~|B*ћ7˯!ß^7L8>h[}b[3ƶ0i(l0TiclXP4m4ȟ ~@D*Vb05{\n,(5!p4bD} $#s-f2U+;0[ Jөd)@1Bw[u(e'`8-As@A1B[|N_i Ub0w [1W"8:S9 V|@ `o?Fк¤9ޗy2wȜV07~| C[>ߌXstOig8:g޳:OȨ3X 0)̆kpM 9}FDyux^Qm#S2lW_v# vFL\J6V*+0A0A!.٩$zds 6<[ kmmV+-`7L} @yqWJLbgkp*mv&Wl7! ԆMp+l9QX;iGiKZ~ 8ׇ ^>ً;K3yի/vtt%Dd 2nhFYGwa?(Mw}2n`@]0\81γq]+k,юIm %5@WG{٤'I vIm*0[JHՂ6kumGAvVXpN ~%jERs5B6ݗ 2g\0 p4!8ɞf9f!U+-IBlӴ^ +kwhH!N\vh <2eF@vC4O4 U%SCЯUF`ǬT;/( aov^P2Ug% @2ScHZ@{8ɜ))t6|4}9-%.h^:*NՏF^9o7m~rgYzΕ@$QP[>Vy=UOZ~<N MÈ@1AmV?~`S:K4AΠ bIqP&nJ`N8=Qe#Va6X=GM2lD$ _~?ePSȒ beLhar*8`+\ lS(XwAZ Y96[Xx0hU,&k!g%6OԱV߭kvʻUQP%6N.'NppF? `&l"n 9/ho Uto*drvDdӧ)cΏ+4z=|@6EA1;s¨@Cf'v] 쐡4MM5VY sOOE@.d^]*V،X$ݾM 0)l)"$)ˊ4Q6bO@ #_@Jj}·(VmEdFbWz$pV <%e@Tfg%@㐎pV${@KUg%V  S|j[F/E ( >V<HZf"ֲ48xbtK ) - @,?gVK@RAʐ (s"P0ȜYH p p p p p p p#p X B  @`"lv_?Bp*×LYԼVp?+7kq3: jvFc8 NbrOy jS*u?#{J~}?K0*<Q¿G~'C\9<6óuSﳽ|x=w8p2Ksŋ$o yl_[@e _xp<$O p[-uj{l訢-57ҷCx#}k8",X F'OIJlQ /# ]4rqT#7tvԘmiAb1(ali h `TyW$7EG/ ]5&P{UO:  pPwN+_,FHT\? U @`"E,X ր8IENDB`afex/man/reexports.Rd0000644000176200001440000000063313664111747014306 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/reexport.R \docType{import} \name{reexports} \alias{reexports} \alias{lmer} \title{Objects exported from other packages} \keyword{internal} \description{ These objects are imported from other packages. Follow the links below to see their documentation. \describe{ \item{lmerTest}{\code{\link[lmerTest]{lmer}}} }} afex/man/ks2013.3.Rd0000644000176200001440000000743013667760652013351 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ks2013.3-data.R \docType{data} \encoding{UTF-8} \name{ks2013.3} \alias{ks2013.3} \title{Data from Klauer & Singmann (2013, Experiment 3)} \format{ A data.frame with 1440 rows and 6 variables. } \source{ Klauer, K. C., & Singmann, H. (2013). Does logic feel good? Testing for intuitive detection of logicality in syllogistic reasoning. Journal of Experimental Psychology: Learning, Memory, and Cognition, 39(4), 1265-1273. http://doi.org/10.1037/a0030530 Morsanyi, K., & Handley, S. J. (2012). Logic feels so good-I like it! Evidence for intuitive detection of logicality in syllogistic reasoning. Journal of Experimental Psychology: Learning, Memory, and Cognition, 38(3), 596-616. http://doi.org/10.1037/a0026099 } \usage{ ks2013.3 } \description{ Klauer and Singmann (2013) attempted to replicate an hypothesis of Morsanyi and Handley (2012) according to which individuals have an intuitive sense of logicality. Specifically, Morsanyi and Handley apparently provided evidence that the logical status of syllogisms (i.e., valid or invalid) affects participants liking ratings of the conclusion of syllogisms. Conclusions from valid syllogisms (e.g., Some snakes are poisonous. No poisonous animals are obbs. Some snakes are not obbs.) received higher liking ratings than conclusions from invalid syllogisms (e.g., No ice creams are vons. Some vons are hot. Some ice creams are not hot.). It is important to noted that in the experiments participants were simply shown the premises and conclusion in succession, they were not asked whether or not the conclusion follows or to generate their own conclusion. Their task was simply to judge how much they liked the "final" statement (i.e., the conclusion). } \details{ In their Experiment 3 Klauer and Singmann (2013) tested the idea that this finding was a consequence of the materials used and not an effect intuitive logic. More specifically, they observed that in the original study by Morsanyi and Handley (2012) a specific content always appeared with the same logical status. For example, the "ice-cream" content only ever appeared as an invalid syllogism as in the example above but never in a valid syllogism. In other words, content was perfectly confounded with logical status in the original study. To test this they compared a condition in which the logical status was confounded with the content (the "fixed" condition) with a condition in which the contents were randomly assigned to a logical status across participants (the "random" condition). For example, the ice-cream content was, across participants, equally like to appear in the invalid form as given above or in the following valid form: No hot things are vons. Some vons are ice creams. Conclusion Some ice creams are not hot. The data.frame contains the raw responses of all 60 participants (30 per condition) reported in Klauer & Singmann (2013). Each participants provided 24 responses, 12 to valid and 12 to invalid syllogisms. Furthermore, 8 syllogisms had a believable conclusion (e.g., Some ice creams are not hot.), 8 had an abstract conclusion (e.g., Some snakes are not obbs.), and 8 had an unbelievable conclusion (e.g., Some animals are not monkeys.). The number of the contents corresponds to the numbering given in Morsanyi and Handley (2012, p. 616). } \examples{ data("ks2013.3") # replicate results reported in Klauer & Singmann (2013, p. 1270) aov_ez("id", "response", ks2013.3, between = "condition", within = c("believability", "validity")) aov_ez("id", "response", subset(ks2013.3, condition == "fixed"), within = c("believability", "validity")) aov_ez("id", "response", subset(ks2013.3, condition == "random"), within = c("believability", "validity")) } \keyword{dataset} afex/man/ems.Rd0000644000176200001440000000536713720650616013044 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/ems.R \name{ems} \alias{ems} \title{Expected values of mean squares for factorial designs Implements the Cornfield-Tukey algorithm for deriving the expected values of the mean squares for factorial designs.} \usage{ ems(design, nested = NULL, random = "") } \arguments{ \item{design}{A \code{formula} object specifying the factors in the design (except residual error, which is always implicitly included). The left hand side of the \code{~} is the symbol that will be used to denote the number of replications per lowest-level factor combination (I usually use "r" or "n"). The right hand side should include all fixed and random factors separated by \code{*}. Factor names should be single letters.} \item{nested}{A \code{character} vector, where each element is of the form \code{"A/B"}, indicating that the levels of factor B are nested under the levels of factor A.} \item{random}{A \code{character} string indicating, without spaces or any separating characters, which of the factors specified in the design are random.} } \value{ The returned value is a formatted table where the rows represent the mean squares, the columns represent the variance components that comprise the various mean squares, and the entries in each cell represent the terms that are multiplied and summed to form the expectation of the mean square for that row. Each term is either the lower-case version of one of the experimental factors, which indicates the number of levels for that factor, or a "1", which means the variance component for that column is contributes to the mean square but is not multiplied by anything else. } \description{ Expected values of mean squares for factorial designs Implements the Cornfield-Tukey algorithm for deriving the expected values of the mean squares for factorial designs. } \note{ Names for factors or parameters should only be of length 1 as they are simply concatenated in the returned table. } \examples{ # 2x2 mixed anova # A varies between-subjects, B varies within-subjects ems(r ~ A*B*S, nested="A/S", random="S") # Clark (1973) example # random Subjects, random Words, fixed Treatments ems(r ~ S*W*T, nested="T/W", random="SW") # EMSs for Clark design if Words are fixed ems(r ~ S*W*T, nested="T/W", random="S") } \seealso{ A detailed description with explanation of the example can be found \href{http://www.talkstats.com/threads/share-your-functions-code.18603/page-9#post-82050}{elsewhere} (note that the \code{design} argument of the function described at the link behaves slightly different). Example applications of this function can be found here: \url{https://stats.stackexchange.com/a/122662/442}. } \author{ Jake Westfall } afex/man/nice.Rd0000644000176200001440000002010714071312623013154 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/nice.R \encoding{UTF-8} \name{nice} \alias{nice} \alias{nice.afex_aov} \alias{nice.anova} \alias{nice.mixed} \alias{print.nice_table} \title{Make nice ANOVA table for printing.} \usage{ nice(object, ...) \method{nice}{afex_aov}( object, es = attr(object$anova_table, "es"), observed = attr(object$anova_table, "observed"), correction = attr(object$anova_table, "correction"), MSE = NULL, intercept = NULL, p_adjust_method = attr(object$anova_table, "p_adjust_method"), sig_symbols = attr(object$anova_table, "sig_symbols"), round_ps = attr(object$anova_table, "round_ps"), ... ) \method{nice}{anova}( object, MSE = NULL, intercept = NULL, sig_symbols = attr(object, "sig_symbols"), round_ps = attr(object, "round_ps"), sig.symbols, ... ) \method{nice}{mixed}( object, sig_symbols = attr(object$anova_table, "sig_symbols"), round_ps = attr(object$anova_table, "round_ps"), ... ) \method{print}{nice_table}(x, ...) } \arguments{ \item{object, x}{An object of class \code{"afex_aov"} (see \code{\link{aov_car}}) or of class \code{"mixed"} (see \code{\link{mixed}}) as returned from the \pkg{afex} functions. Alternatively, an object of class \code{"Anova.mlm"} or \code{"anova"} as returned from \code{\link[car]{Anova}}.} \item{...}{currently ignored.} \item{es}{Effect Size to be reported. The default is given by \code{afex_options("es_aov")}, which is initially set to \code{"ges"} (i.e., reporting generalized eta-squared, see details). Also supported is partial eta-squared (\code{"pes"}) or \code{"none"}.} \item{observed}{character vector referring to the observed (i.e., non manipulated) variables/effects in the design. Important for calculation of generalized eta-squared (ignored if \code{es} is not \code{"ges"}), see details.} \item{correction}{Character. Which sphericity correction of the degrees of freedom should be reported for the within-subject factors. The default is given by \code{afex_options("correction_aov")}, which is initially set to \code{"GG"} corresponding to the Greenhouse-Geisser correction. Possible values are \code{"GG"}, \code{"HF"} (i.e., Hyunh-Feldt correction), and \code{"none"} (i.e., no correction).} \item{MSE}{logical. Should the column containing the Mean Sqaured Error (MSE) be displayed? Default is \code{TRUE}.} \item{intercept}{logical. Should intercept (if present) be included in the ANOVA table? Default is \code{FALSE} which hides the intercept.} \item{p_adjust_method}{\code{character} indicating if p-values for individual effects should be adjusted for multiple comparisons (see \link[stats]{p.adjust} and details). The default \code{NULL} corresponds to no adjustment.} \item{sig_symbols}{Character. What should be the symbols designating significance? When entering an vector with \code{length(sig.symbol) < 4} only those elements of the default (\code{c(" +", " *", " **", " ***")}) will be replaced. \code{sig_symbols = ""} will display the stars but not the \code{+}, \code{sig_symbols = rep("", 4)} will display no symbols. The default is given by \code{afex_options("sig_symbols")}.} \item{round_ps}{Function that should be used for rounding p-values. The default is given by \code{afex_options("round_ps")}.} \item{sig.symbols}{deprecated argument, only for backwards compatibility, use \code{"sig_symbols"} instead.} } \value{ A \code{data.frame} of class \code{nice_table} with the ANOVA table consisting of characters. The columns that are always present are: \code{Effect}, \code{df} (degrees of freedom), \code{F}, and \code{p}. \code{ges} contains the generalized eta-squared effect size measure (Bakeman, 2005), \code{pes} contains partial eta-squared (if requested). } \description{ This generic function produces a nice ANOVA table for printing for objects of class. \code{nice_anova} takes an object from \code{\link[car]{Anova}} possible created by the convenience functions \code{\link{aov_ez}} or \code{\link{aov_car}}. When within-subject factors are present, either sphericity corrected or uncorrected degrees of freedom can be reported. } \details{ The returned \code{data.frame} is print-ready when adding to a document with proper methods. Either directly via \pkg{knitr} or similar approaches such as via package \pkg{xtable} (nowadays \pkg{knitr} is probably the best approach, see \href{https://yihui.org/knitr/}{here}). \pkg{xtable} converts a \code{data.frame} into LaTeX code with many possible options (e.g., allowing for \code{"longtable"} or \code{"sidewaystable"}), see \code{\link[xtable]{xtable}} and \code{\link[xtable]{print.xtable}}. See Examples. Conversion functions to other formats (such as HTML, ODF, or Word) can be found at the \href{https://CRAN.R-project.org/view=ReproducibleResearch}{Reproducible Research Task View}. The default reports generalized eta squared (Olejnik & Algina, 2003), the "recommended effect size for repeated measured designs" (Bakeman, 2005). Note that it is important that all measured variables (as opposed to experimentally manipulated variables), such as e.g., age, gender, weight, ..., must be declared via \code{observed} to obtain the correct effect size estimate. Partial eta squared (\code{"pes"}) does not require this. Exploratory ANOVA, for which no detailed hypotheses have been specified a priori, harbor a multiple comparison problem (Cramer et al., 2015). To avoid an inflation of familywise Type I error rate, results need to be corrected for multiple comparisons using \code{p_adjust_method}. \code{p_adjust_method} defaults to the method specified in the call to \code{\link{aov_car}} in \code{anova_table}. If no method was specified and \code{p_adjust_method = NULL} p-values are not adjusted. } \examples{ ## example from Olejnik & Algina (2003) # "Repeated Measures Design" (pp. 439): data(md_12.1) # create object of class afex_aov: rmd <- aov_ez("id", "rt", md_12.1, within = c("angle", "noise")) rmd nice(rmd) str(nice(rmd)) # use different es: nice(rmd, es = "pes") # noise: .82 nice(rmd, es = "ges") # noise: .39 # same data other approach: rmd2 <- aov_ez("id", "rt", md_12.1, within = c("angle", "noise"), anova_table=list(correction = "none", es = "none")) nice(rmd2) nice(rmd2, correction = "GG") nice(rmd2, correction = "GG", es = "ges") # exampel using obk.long (see ?obk.long), a long version of the OBrienKaiser dataset from car. data(obk.long) # create object of class afex_aov: tmp.aov <- aov_car(value ~ treatment * gender + Error(id/phase*hour), data = obk.long) nice(tmp.aov, observed = "gender") nice(tmp.aov, observed = "gender", sig_symbols = rep("", 4)) \dontrun{ # use package ascii or xtable for formatting of tables ready for printing. full <- nice(tmp.aov, observed = "gender") require(ascii) print(ascii(full, include.rownames = FALSE, caption = "ANOVA 1"), type = "org") require(xtable) print.xtable(xtable(full, caption = "ANOVA 2"), include.rownames = FALSE) } } \references{ Bakeman, R. (2005). Recommended effect size statistics for repeated measures designs. \emph{Behavior Research Methods}, 37(3), 379-384. \doi{10.3758/BF03192707} Cramer, A. O. J., van Ravenzwaaij, D., Matzke, D., Steingroever, H., Wetzels, R., Grasman, R. P. P. P., ... Wagenmakers, E.-J. (2015). Hidden multiplicity in exploratory multiway ANOVA: Prevalence and remedies. \emph{Psychonomic Bulletin & Review}, 1-8. \doi{10.3758/s13423-015-0913-5} Olejnik, S., & Algina, J. (2003). Generalized Eta and Omega Squared Statistics: Measures of Effect Size for Some Common Research Designs. \emph{Psychological Methods}, 8(4), 434-447. \doi{10.1037/1082-989X.8.4.434} } \seealso{ \code{\link{aov_ez}} and \code{\link{aov_car}} are the convenience functions to create the object appropriate for \code{nice_anova}. } \author{ The code for calculating generalized eta-squared was written by Mike Lawrence.\cr Everything else was written by Henrik Singmann. } afex/man/aov_car.Rd0000644000176200001440000006755714076034142013676 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/aov_car.R \encoding{UTF-8} \name{aov_car} \alias{aov_car} \alias{aov_4} \alias{aov_ez} \title{Convenient ANOVA estimation for factorial designs} \usage{ aov_car( formula, data, fun_aggregate = NULL, type = afex_options("type"), factorize = afex_options("factorize"), check_contrasts = afex_options("check_contrasts"), observed = NULL, anova_table = list(), include_aov = afex_options("include_aov"), return = afex_options("return_aov"), ... ) aov_4( formula, data, observed = NULL, fun_aggregate = NULL, type = afex_options("type"), factorize = afex_options("factorize"), check_contrasts = afex_options("check_contrasts"), return = afex_options("return_aov"), anova_table = list(), include_aov = afex_options("include_aov"), ..., print.formula = FALSE ) aov_ez( id, dv, data, between = NULL, within = NULL, covariate = NULL, observed = NULL, fun_aggregate = NULL, transformation, type = afex_options("type"), factorize = afex_options("factorize"), check_contrasts = afex_options("check_contrasts"), return = afex_options("return_aov"), anova_table = list(), include_aov = afex_options("include_aov"), ..., print.formula = FALSE ) } \arguments{ \item{formula}{A formula specifying the ANOVA model similar to \code{\link{aov}} (for \code{aov_car} or similar to \code{lme4:lmer} for \code{aov_4}). Must include an error term (i.e., \code{Error(id/...)} for \code{aov_car} or \code{(...|id)} for \code{aov_4}). Note that the within-subject factors do not need to be outside the Error term (this contrasts with \code{aov}). See Details.} \item{data}{A \code{data.frame} containing the data. Mandatory.} \item{fun_aggregate}{The function for aggregating the data before running the ANOVA if there is more than one observation per individual and cell of the design. The default \code{NULL} issues a warning if aggregation is necessary and uses \code{\link{mean}}. Pass \code{mean} directly to avoid the warning.} \item{type}{The type of sums of squares for the ANOVA. The default is given by \code{afex_options("type")}, which is \strong{initially set to 3}. Passed to \code{\link[car]{Anova}}. Possible values are \code{"II"}, \code{"III"}, \code{2}, or \code{3}.} \item{factorize}{logical. Should between subject factors be factorized (with note) before running the analysis. The default is given by \code{afex_options("factorize")}, which is initially \code{TRUE}. If one wants to run an ANCOVA, this needs to be set to \code{FALSE} (in which case centering on 0 is checked on numeric variables).} \item{check_contrasts}{\code{logical}. Should contrasts for between-subject factors be checked and (if necessary) changed to be \code{"contr.sum"}. See details. The default is given by \code{afex_options("check_contrasts")}, which is initially \code{TRUE}.} \item{observed}{\code{character} vector indicating which of the variables are observed (i.e, measured) as compared to experimentally manipulated. The default effect size reported (generalized eta-squared) requires correct specification of the obsered (in contrast to manipulated) variables.} \item{anova_table}{\code{list} of further arguments passed to function producing the ANOVA table. Arguments such as \code{es} (effect size) or \code{correction} are passed to either \code{anova.afex_aov} or \code{nice}. Note that those settings can also be changed once an object of class \code{afex_aov} is created by invoking the \code{anova} method directly.} \item{include_aov}{Boolean. Allows suppressing the calculation of the aov object. If TRUE the aov model is part of the returned \code{afex_aov} object. \code{FALSE} (the default) prevents this potentially costly calculation. Especially for designs with larger N and within-subjects factors, this is highly advisable. Follow-up analyses using \pkg{emmeans} using the \code{univariate} model (which is not recommended) require the aov model and TRUE.} \item{return}{What should be returned? The default is given by \code{afex_options("return_aov")}, which is initially \code{"afex_aov"}, returning an S3 object of class \code{afex_aov} for which various \link[=afex_aov-methods]{methods} exist (see there and below for more details). Other values are currently still supported for backward compatibility.} \item{...}{Further arguments passed to \code{fun_aggregate}.} \item{print.formula}{\code{aov_ez} and \code{aov_4} are wrapper for \code{aov_car}. This boolean argument indicates whether the formula in the call to \code{car.aov} should be printed.} \item{id}{\code{character} vector (of length 1) indicating the subject identifier column in \code{data}.} \item{dv}{\code{character} vector (of length 1) indicating the column containing the \strong{dependent variable} in \code{data}.} \item{between}{\code{character} vector indicating the \strong{between}-subject(s) factor(s)/column(s) in \code{data}. Default is \code{NULL} indicating no between-subjects factors.} \item{within}{\code{character} vector indicating the \strong{within}-subject(s)(or repeated-measures) factor(s)/column(s) in \code{data}. Default is \code{NULL} indicating no within-subjects factors.} \item{covariate}{\code{character} vector indicating the between-subject(s) covariate(s) (i.e., column(s)) in \code{data}. Default is \code{NULL} indicating no covariates. Please note that \code{factorize} needs to be set to \code{FALSE} in case the covariate is numeric and should be treated as such.} \item{transformation}{In \code{aov_ez}, a \code{character} vector (of length 1) indicating the name of a transformation to apply to \code{dv} before fitting the model. If missing, no transformation is applied. In \code{aov_car} and \code{aov_4}, a response transformation may be incorporated in the left-hand side of \code{formula}.} } \value{ \code{aov_car}, \code{aov_4}, and \code{aov_ez} are wrappers for \code{\link[car]{Anova}} and \code{\link{aov}}, the return value is dependent on the \code{return} argument. Per default, an S3 object of class \code{"afex_aov"} is returned containing the following slots: \describe{ \item{\code{"anova_table"}}{An ANOVA table of class \code{c("anova", "data.frame")}.} \item{\code{"aov"}}{\code{aov} object returned from \code{\link{aov}} (should not be used to evaluate significance of effects, but can be passed to \code{emmeans} for post-hoc tests).} \item{\code{"Anova"}}{object returned from \code{\link[car]{Anova}}, an object of class \code{"Anova.mlm"} (if within-subjects factors are present) or of class \code{c("anova", "data.frame")}.} \item{\code{"lm"}}{the object fitted with \code{lm} and passed to \code{Anova} (i.e., an object of class \code{"lm"} or \code{"mlm"}). Also returned if \code{return = "lm"}.} \item{\code{"data"}}{a list containing: (1) \code{long} (the possibly aggregated data in long format used for \code{aov}), \code{wide} (the data used to fit the \code{lm} object), and \code{idata} (if within-subject factors are present, the \code{idata} argument passed to \code{car::Anova}). Also returned if \code{return = "data"}.} } In addition, the object has the following attributes: \code{"dv"}, \code{"id"}, \code{"within"}, \code{"between"}, and \code{"type"}. The \link[=afex_aov-methods]{print} method for \code{afex_aov} objects (invisibly) returns (and prints) the same as if \code{return} is \code{"nice"}: a nice ANOVA table (produced by \code{\link{nice}}) with the following columns: \code{Effect}, \code{df}, \code{MSE} (mean-squared errors), \code{F} (potentially with significant symbols), \code{ges} (generalized eta-squared), \code{p}. } \description{ These functions allow convenient specification of any type of ANOVAs (i.e., purely within-subjects ANOVAs, purely between-subjects ANOVAs, and mixed between-within or split-plot ANOVAs) for data in the \strong{long} format (i.e., one observation per row). If the data has more than one observation per individual and cell of the design (e.g., multiple responses per condition), the data will by automatically aggregated. The default settings reproduce results from commercial statistical packages such as SPSS or SAS. \code{aov_ez} is called specifying the factors as character vectors, \code{aov_car} is called using a formula similar to \code{\link{aov}} specifying an error strata for the within-subject factor(s), and \code{aov_4} is called with a \pkg{lme4}-like formula (all ANOVA functions return identical results). The returned object contains the ANOVA also fitted via base R's \code{\link{aov}} which can be passed to e.g., \pkg{emmeans} for further analysis (e.g., follow-up tests, contrasts, plotting, etc.). These functions employ \code{\link[car]{Anova}} (from the \pkg{car} package) to provide test of effects avoiding the somewhat unhandy format of \code{car::Anova}. } \details{ \subsection{Details of ANOVA Specification}{ \code{aov_ez} will concatenate all between-subject factors using \code{*} (i.e., producing all main effects and interactions) and all covariates by \code{+} (i.e., adding only the main effects to the existing between-subject factors). The within-subject factors do fully interact with all between-subject factors and covariates. This is essentially identical to the behavior of SPSS's \code{glm} function. The \code{formula}s for \code{aov_car} or \code{aov_4} must contain a single \code{Error} term specifying the \code{ID} column and potential within-subject factors (you can use \code{\link{mixed}} for running mixed-effects models with multiple error terms). Factors outside the \code{Error} term are treated as between-subject factors (the within-subject factors specified in the \code{Error} term are ignored outside the \code{Error} term; in other words, it is not necessary to specify them outside the \code{Error} term, see Examples).\cr Suppressing the intercept (i.e, via \code{0 +} or \code{- 1}) is ignored. Specific specifications of effects (e.g., excluding terms with \code{-} or using \code{^}) could be okay but is not tested. Using the \code{\link{I}} or \code{\link{poly}} function within the formula is not tested and not supported! To run an ANCOVA you need to set \code{factorize = FALSE} and make sure that all variables have the correct type (i.e., factors are factors and numeric variables are numeric and centered). Note that the default behavior is to include calculation of the effect size generalized eta-squared for which \strong{all non-manipluated (i.e., observed)} variables need to be specified via the \code{observed} argument to obtain correct results. When changing the effect size to \code{"pes"} (partial eta-squared) or \code{"none"} via \code{anova_table} this becomes unnecessary. If \code{check_contrasts = TRUE}, contrasts will be set to \code{"contr.sum"} for all between-subject factors if default contrasts are not equal to \code{"contr.sum"} or \code{attrib(factor, "contrasts") != "contr.sum"}. (within-subject factors are hard-coded \code{"contr.sum"}.) } \subsection{Statistical Issues}{ \strong{Type 3 sums of squares are default in \pkg{afex}.} While some authors argue that so-called type 3 sums of squares are dangerous and/or problematic (most notably Venables, 2000), they are the default in many commercial statistical application such as SPSS or SAS. Furthermore, statisticians with an applied perspective recommend type 3 tests (e.g., Maxwell and Delaney, 2004). Consequently, they are the default for the ANOVA functions described here. For some more discussion on this issue see \href{https://stats.stackexchange.com/q/6208/442}{here}. Note that lower order effects (e.g., main effects) in type 3 ANOVAs are only meaningful with \href{https://stats.idre.ucla.edu/other/mult-pkg/faq/general/faqwhat-is-effect-coding/}{effects coding}. That is, contrasts should be set to \code{\link{contr.sum}} to obtain meaningful results. This is imposed automatically for the functions discussed here as long as \code{check_contrasts} is \code{TRUE} (the default). I nevertheless recommend to set the contrasts globally to \code{contr.sum} via running \code{\link{set_sum_contrasts}}. For a discussion of the other (non-recommended) coding schemes see \href{https://stats.idre.ucla.edu/r/library/r-library-contrast-coding-systems-for-categorical-variables/}{here}. } \subsection{Follow-Up Contrasts and Post-Hoc Tests}{ The S3 object returned per default can be directly passed to \code{emmeans::emmeans} for further analysis. This allows to test any type of contrasts that might be of interest independent of whether or not this contrast involves between-subject variables, within-subject variables, or a combination thereof. The general procedure to run those contrasts is the following (see Examples for a full example): \enumerate{ \item Estimate an \code{afex_aov} object with the function returned here. For example: \code{x <- aov_car(dv ~ a*b + (id/c), d)} \item Obtain a \code{\link[emmeans]{emmGrid-class}} object by running \code{\link[emmeans]{emmeans}} on the \code{afex_aov} object from step 1 using the factors involved in the contrast. For example: \code{r <- emmeans(x, ~a:c)} \item Create a list containing the desired contrasts on the reference grid object from step 2. For example: \code{con1 <- list(a_x = c(-1, 1, 0, 0, 0, 0), b_x = c(0, 0, -0.5, -0.5, 0, 1))} \item Test the contrast on the reference grid using \code{\link[emmeans]{contrast}}. For example: \code{contrast(r, con1)} \item To control for multiple testing p-value adjustments can be specified. For example the Bonferroni-Holm correction: \code{contrast(r, con1, adjust = "holm")} } Note that \pkg{emmeans} allows for a variety of advanced settings and simplifiations, for example: all pairwise comparison of a single factor using one command (e.g., \code{emmeans(x, "a", contr = "pairwise")}) or advanced control for multiple testing by passing objects to \pkg{multcomp}. A comprehensive overview of the functionality is provided in the accompanying vignettes (see \href{https://CRAN.R-project.org/package=emmeans}{here}). Since version 1.0, \pkg{afex} per default uses the \code{multivariate} model (i.e., the \code{lm} slot of the \code{afex_aov} object) for follow-up tests with \pkg{emmeans}. Compared to the \code{univariate} model (i.e., the \code{aov} slot), this can handle unbalanced data and addresses sphericity better. To use the older (and not recommended) \code{model = "univariate"} make sure to set \code{include_aov = TRUE} when estimating the ANOVA. Starting with \pkg{afex} version 0.22, \pkg{emmeans} is \emph{not} loaded/attached automatically when loading \pkg{afex}. Therefore, \pkg{emmeans} now needs to be loaded by the user via \code{library("emmeans")} or \code{require("emmeans")}. } \subsection{Methods for \code{afex_aov} Objects}{ A full overview over the methods provided for \code{afex_aov} objects is provided in the corresponding help page: \code{\link{afex_aov-methods}}. The probably most important ones for end-users are \code{summary}, \code{anova}, and \code{\link{nice}}. The \code{summary} method returns, for ANOVAs containing within-subject (repeated-measures) factors with more than two levels, the complete univariate analysis: Results without df-correction, the Greenhouse-Geisser corrected results, the Hyunh-Feldt corrected results, and the results of the Mauchly test for sphericity. The \code{anova} method returns a \code{data.frame} of class \code{"anova"} containing the ANOVA table in numeric form (i.e., the one in slot \code{anova_table} of a \code{afex_aov}). This method has arguments such as \code{correction} and \code{es} and can be used to obtain an ANOVA table with different correction than the one initially specified. The \code{\link{nice}} method also returns a \code{data.frame}, but rounds most values and transforms them into characters for nice printing. Also has arguments like \code{correction} and \code{es} which can be used to obtain an ANOVA table with different correction than the one initially specified. } } \section{Functions}{ \itemize{ \item \code{aov_4}: Allows definition of ANOVA-model using \code{lme4::lmer}-like Syntax (but still fits a standard ANOVA). \item \code{aov_ez}: Allows definition of ANOVA-model using character strings. }} \note{ Calculation of ANOVA models via \code{aov} (which is done per default) can be comparatively slow and produce comparatively large objects for ANOVAs with many within-subjects factors or levels. To avoid this calculation set \code{include_aov = FALSE}. You can also disable this globally with: \code{afex_options(include_aov = FALSE)} The id variable and variables entered as within-subjects (i.e., repeated-measures) factors are silently converted to factors. Levels of within-subject factors are converted to valid variable names using \code{\link{make.names}(...,unique=TRUE)}. Unused factor levels are silently dropped on all variables. Contrasts attached to a factor as an attribute are probably not preserved and not supported. The workhorse is \code{aov_car}. \code{aov_4} and \code{aov_ez} only construe and pass an appropriate formula to \code{aov_car}. Use \code{print.formula = TRUE} to view this formula. In contrast to \code{\link{aov}} \code{aov_car} assumes that all factors to the right of \code{/} in the \code{Error} term are belonging together. Consequently, \code{Error(id/(a*b))} and \code{Error(id/a*b)} are identical (which is not true for \code{\link{aov}}). } \examples{ ########################## ## 1: Specifying ANOVAs ## ########################## # Example using a purely within-subjects design # (Maxwell & Delaney, 2004, Chapter 12, Table 12.5, p. 578): data(md_12.1) aov_ez("id", "rt", md_12.1, within = c("angle", "noise"), anova_table=list(correction = "none", es = "none")) # Default output aov_ez("id", "rt", md_12.1, within = c("angle", "noise")) # examples using obk.long (see ?obk.long), a long version of the OBrienKaiser # dataset (car package). Data is a split-plot or mixed design: contains both # within- and between-subjects factors. data(obk.long, package = "afex") # estimate mixed ANOVA on the full design: aov_car(value ~ treatment * gender + Error(id/(phase*hour)), data = obk.long, observed = "gender") aov_4(value ~ treatment * gender + (phase*hour|id), data = obk.long, observed = "gender") aov_ez("id", "value", obk.long, between = c("treatment", "gender"), within = c("phase", "hour"), observed = "gender") # the three calls return the same ANOVA table: # Anova Table (Type 3 tests) # # Response: value # Effect df MSE F ges p.value # 1 treatment 2, 10 22.81 3.94 + .198 .055 # 2 gender 1, 10 22.81 3.66 + .115 .085 # 3 treatment:gender 2, 10 22.81 2.86 .179 .104 # 4 phase 1.60, 15.99 5.02 16.13 *** .151 <.001 # 5 treatment:phase 3.20, 15.99 5.02 4.85 * .097 .013 # 6 gender:phase 1.60, 15.99 5.02 0.28 .003 .709 # 7 treatment:gender:phase 3.20, 15.99 5.02 0.64 .014 .612 # 8 hour 1.84, 18.41 3.39 16.69 *** .125 <.001 # 9 treatment:hour 3.68, 18.41 3.39 0.09 .002 .979 # 10 gender:hour 1.84, 18.41 3.39 0.45 .004 .628 # 11 treatment:gender:hour 3.68, 18.41 3.39 0.62 .011 .641 # 12 phase:hour 3.60, 35.96 2.67 1.18 .015 .335 # 13 treatment:phase:hour 7.19, 35.96 2.67 0.35 .009 .930 # 14 gender:phase:hour 3.60, 35.96 2.67 0.93 .012 .449 # 15 treatment:gender:phase:hour 7.19, 35.96 2.67 0.74 .019 .646 # --- # Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1 # # Sphericity correction method: GG # "numeric" variables are per default converted to factors (as long as factorize # = TRUE): obk.long$hour2 <- as.numeric(as.character(obk.long$hour)) # gives same results as calls before aov_car(value ~ treatment * gender + Error(id/phase*hour2), data = obk.long, observed = c("gender")) # ANCOVA: adding a covariate (necessary to set factorize = FALSE) aov_car(value ~ treatment * gender + age + Error(id/(phase*hour)), data = obk.long, observed = c("gender", "age"), factorize = FALSE) aov_4(value ~ treatment * gender + age + (phase*hour|id), data = obk.long, observed = c("gender", "age"), factorize = FALSE) aov_ez("id", "value", obk.long, between = c("treatment", "gender"), within = c("phase", "hour"), covariate = "age", observed = c("gender", "age"), factorize = FALSE) # aggregating over one within-subjects factor (phase), with warning: aov_car(value ~ treatment * gender + Error(id/hour), data = obk.long, observed = "gender") aov_ez("id", "value", obk.long, c("treatment", "gender"), "hour", observed = "gender") # aggregating over both within-subjects factors (again with warning), # only between-subjects factors: aov_car(value ~ treatment * gender + Error(id), data = obk.long, observed = c("gender")) aov_4(value ~ treatment * gender + (1|id), data = obk.long, observed = c("gender")) aov_ez("id", "value", obk.long, between = c("treatment", "gender"), observed = "gender") # only within-subject factors (ignoring between-subjects factors) aov_car(value ~ Error(id/(phase*hour)), data = obk.long) aov_4(value ~ (phase*hour|id), data = obk.long) aov_ez("id", "value", obk.long, within = c("phase", "hour")) ### changing defaults of ANOVA table: # no df-correction & partial eta-squared: aov_car(value ~ treatment * gender + Error(id/(phase*hour)), data = obk.long, anova_table = list(correction = "none", es = "pes")) # no df-correction and no MSE aov_car(value ~ treatment * gender + Error(id/(phase*hour)), data = obk.long,observed = "gender", anova_table = list(correction = "none", MSE = FALSE)) # add p-value adjustment for all effects (see Cramer et al., 2015, PB&R) aov_ez("id", "value", obk.long, between = "treatment", within = c("phase", "hour"), anova_table = list(p_adjust_method = "holm")) ########################### ## 2: Follow-up Analysis ## ########################### # use data as above data(obk.long, package = "afex") # 1. obtain afex_aov object: a1 <- aov_ez("id", "value", obk.long, between = c("treatment", "gender"), within = c("phase", "hour"), observed = "gender") if (requireNamespace("ggplot2") & requireNamespace("emmeans")) { # 1b. plot data using afex_plot function, for more see: ## vignette("afex_plot_introduction", package = "afex") ## default plot uses multivariate model-based CIs afex_plot(a1, "hour", "gender", c("treatment", "phase")) a1b <- aov_ez("id", "value", obk.long, between = c("treatment", "gender"), within = c("phase", "hour"), observed = "gender", include_aov = TRUE) ## you can use a univariate model and CIs if you refit the model with the aov ## slot afex_plot(a1b, "hour", "gender", c("treatment", "phase"), emmeans_arg = list(model = "univariate")) ## in a mixed between-within designs, no error-bars might be preferrable: afex_plot(a1, "hour", "gender", c("treatment", "phase"), error = "none") } if (requireNamespace("emmeans")) { library("emmeans") # package emmeans needs to be attached for follow-up tests. # 2. obtain reference grid object (default uses multivariate model): r1 <- emmeans(a1, ~treatment +phase) r1 # 3. create list of contrasts on the reference grid: c1 <- list( A_B_pre = c(rep(0, 6), 0, -1, 1), # A versus B for pretest A_B_comb = c(-0.5, 0.5, 0, -0.5, 0.5, 0, 0, 0, 0), # A vs. B for post and follow-up combined effect_post = c(0, 0, 0, -1, 0.5, 0.5, 0, 0, 0), # control versus A&B post effect_fup = c(-1, 0.5, 0.5, 0, 0, 0, 0, 0, 0), # control versus A&B follow-up effect_comb = c(-0.5, 0.25, 0.25, -0.5, 0.25, 0.25, 0, 0, 0) # control versus A&B combined ) # 4. test contrasts on reference grid: contrast(r1, c1) # same as before, but using Bonferroni-Holm correction for multiple testing: contrast(r1, c1, adjust = "holm") # 2. (alternative): all pairwise comparisons of treatment: emmeans(a1, "treatment", contr = "pairwise") } ####################### ## 3: Other examples ## ####################### data(obk.long, package = "afex") # replicating ?Anova using aov_car: obk_anova <- aov_car(value ~ treatment * gender + Error(id/(phase*hour)), data = obk.long, type = 2) # in contrast to aov you do not need the within-subject factors outside Error() str(obk_anova, 1, give.attr = FALSE) # List of 5 # $ anova_table:Classes 'anova' and 'data.frame': 15 obs. of 6 variables: # $ aov :List of 5 # $ Anova :List of 14 # $ lm :List of 13 # $ data :List of 3 obk_anova$Anova # Type II Repeated Measures MANOVA Tests: Pillai test statistic # Df test stat approx F num Df den Df Pr(>F) # (Intercept) 1 0.96954 318.34 1 10 6.532e-09 *** # treatment 2 0.48092 4.63 2 10 0.0376868 * # gender 1 0.20356 2.56 1 10 0.1409735 # treatment:gender 2 0.36350 2.86 2 10 0.1044692 # phase 1 0.85052 25.61 2 9 0.0001930 *** # treatment:phase 2 0.68518 2.61 4 20 0.0667354 . # gender:phase 1 0.04314 0.20 2 9 0.8199968 # treatment:gender:phase 2 0.31060 0.92 4 20 0.4721498 # hour 1 0.93468 25.04 4 7 0.0003043 *** # treatment:hour 2 0.30144 0.35 8 16 0.9295212 # gender:hour 1 0.29274 0.72 4 7 0.6023742 # treatment:gender:hour 2 0.57022 0.80 8 16 0.6131884 # phase:hour 1 0.54958 0.46 8 3 0.8324517 # treatment:phase:hour 2 0.66367 0.25 16 8 0.9914415 # gender:phase:hour 1 0.69505 0.85 8 3 0.6202076 # treatment:gender:phase:hour 2 0.79277 0.33 16 8 0.9723693 # --- # Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1 } \references{ Cramer, A. O. J., van Ravenzwaaij, D., Matzke, D., Steingroever, H., Wetzels, R., Grasman, R. P. P. P., ... Wagenmakers, E.-J. (2015). Hidden multiplicity in exploratory multiway ANOVA: Prevalence and remedies. \emph{Psychonomic Bulletin & Review}, 1-8. \doi{10.3758/s13423-015-0913-5} Maxwell, S. E., & Delaney, H. D. (2004). \emph{Designing Experiments and Analyzing Data: A Model-Comparisons Perspective}. Mahwah, N.J.: Lawrence Erlbaum Associates. Venables, W.N. (2000). \emph{Exegeses on linear models}. Paper presented to the S-Plus User's Conference, Washington DC, 8-9 October 1998, Washington, DC. Available from: \url{http://www.stats.ox.ac.uk/pub/MASS3/Exegeses.pdf} } \seealso{ Various methods for objects of class \code{afex_aov} are available: \code{\link{afex_aov-methods}} \code{\link{nice}} creates the nice ANOVA tables which is by default printed. See also there for a slightly longer discussion of the available effect sizes. \code{\link{mixed}} provides a (formula) interface for obtaining p-values for mixed-models via \pkg{lme4}. The functions presented here do not estimate mixed models. } \author{ Henrik Singmann The design of these functions was influenced by \code{\link[ez]{ezANOVA}} from package \pkg{ez}. } afex/man/round_ps.Rd0000644000176200001440000000216513667760652014116 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/round_ps.R \encoding{UTF-8} \name{round_ps} \alias{round_ps} \alias{round_ps_apa} \title{Helper functions for rounding p-values} \usage{ round_ps(x) round_ps_apa(x) } \arguments{ \item{x}{a numeric vector} } \value{ A character vector with the same length as x. } \description{ These functions return a character vector of p-values that are rounded as described below and without the leading zero before the decimal point. } \details{ For \code{round_ps} p-values are rounded in a sane way: .99 - .01 to two digits, < .01 to three digits, < .001 to four digits. For \code{round_ps_apa} p-values are rounded following APA guidelines: .999 - .001 to three digits, and < .001 for values below this threshold. } \note{ These functions are useful in \code{\link{nice}} and the default is set via \code{\link{afex_options}}. } \examples{ x <- runif(10) y <- runif(10, 0, .01) round_ps(x) round_ps_apa(x) round_ps(y) round_ps_apa(y) round_ps(0.0000000099) round_ps_apa(0.0000000099) } \author{ Henrik Singmann } afex/man/obk.long.Rd0000644000176200001440000000564313667760652014002 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/obk.long-data.R \docType{data} \encoding{UTF-8} \name{obk.long} \alias{obk.long} \title{O'Brien Kaiser's Repeated-Measures Dataset with Covariate} \format{ A data frame with 240 rows and 7 variables. } \source{ O'Brien, R. G., & Kaiser, M. K. (1985). MANOVA method for analyzing repeated measures designs: An extensive primer. \emph{Psychological Bulletin}, 97, 316-333. doi:10.1037/0033-2909.97.2.316 } \usage{ obk.long } \description{ This is the long version of the \code{OBrienKaiser} dataset from the \pkg{car} pakage adding a random covariate \code{age}. Originally the dataset ist taken from O'Brien and Kaiser (1985). The description from \code{\link[carData]{OBrienKaiser}} says: "These contrived repeated-measures data are taken from O'Brien and Kaiser (1985). The data are from an imaginary study in which 16 female and male subjects, who are divided into three treatments, are measured at a pretest, postest, and a follow-up session; during each session, they are measured at five occasions at intervals of one hour. The design, therefore, has two between-subject and two within-subject factors." } \examples{ # The dataset is constructed as follows: data("OBrienKaiser", package = "carData") set.seed(1) OBrienKaiser2 <- within(OBrienKaiser, { id <- factor(1:nrow(OBrienKaiser)) age <- scale(sample(18:35, nrow(OBrienKaiser), replace = TRUE), scale = FALSE)}) attributes(OBrienKaiser2$age) <- NULL # needed or resahpe2::melt throws an error. OBrienKaiser2$age <- as.numeric(OBrienKaiser2$age) obk.long <- reshape2::melt(OBrienKaiser2, id.vars = c("id", "treatment", "gender", "age")) obk.long[,c("phase", "hour")] <- lapply(as.data.frame(do.call(rbind, strsplit(as.character(obk.long$variable), "\\\\."),)), factor) obk.long <- obk.long[,c("id", "treatment", "gender", "age", "phase", "hour", "value")] obk.long <- obk.long[order(obk.long$id),] rownames(obk.long) <- NULL str(obk.long) ## 'data.frame': 240 obs. of 7 variables: ## $ id : Factor w/ 16 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ... ## $ treatment: Factor w/ 3 levels "control","A",..: 1 1 1 1 1 1 1 1 1 1 ... ## $ gender : Factor w/ 2 levels "F","M": 2 2 2 2 2 2 2 2 2 2 ... ## $ age : num -4.75 -4.75 -4.75 -4.75 -4.75 -4.75 -4.75 -4.75 -4.75 -4.75 ... ## $ phase : Factor w/ 3 levels "fup","post","pre": 3 3 3 3 3 2 2 2 2 2 ... ## $ hour : Factor w/ 5 levels "1","2","3","4",..: 1 2 3 4 5 1 2 3 4 5 ... ## $ value : num 1 2 4 2 1 3 2 5 3 2 ... head(obk.long) ## id treatment gender age phase hour value ## 1 1 control M -4.75 pre 1 1 ## 2 1 control M -4.75 pre 2 2 ## 3 1 control M -4.75 pre 3 4 ## 4 1 control M -4.75 pre 4 2 ## 5 1 control M -4.75 pre 5 1 ## 6 1 control M -4.75 post 1 3 } \keyword{dataset} afex/man/deprecated.Rd0000644000176200001440000000160514071313113014333 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/deprecated.R \name{aov.car} \alias{aov.car} \alias{afex-deprecated} \alias{ez.glm} \alias{aov4} \alias{test_levene} \alias{test_sphericity} \title{Deprecated functions} \usage{ aov.car(...) ez.glm(...) aov4(...) test_levene(...) test_sphericity(...) } \arguments{ \item{...}{arguments passed from the old functions of the style \code{foo.bar()} to the new functions \code{foo_bar()}} } \description{ These functions have been renamed or moved and deprecated in \pkg{afex}: \code{aov.car()} (use \code{\link{aov_car}()}), \code{ez.glm()} (use \code{\link{aov_ez}()}), \code{aov4()} (use \code{\link{aov_4}()}), \code{test_levene()} (use \code{\link[performance]{check_homogeneity}()}), \code{test_sphericity()} (use \code{\link[performance]{check_sphericity}()}). } \keyword{internal} afex/man/stroop.Rd0000644000176200001440000000464014071312623013570 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/stroop-data.R \docType{data} \encoding{UTF-8} \name{stroop} \alias{stroop} \title{Stroop data from Lin et al. (2020, Psych. Science)} \format{ A data frame with 246600 rows and 7 variables: \describe{ \item{pno}{participant id (preceded by study id), factor with 685 levels} \item{condition}{experimental condition (control/low demand, deplete/high demand), factor with 2 levels} \item{study}{study number (1, 2, 3, 4), factor with 4 levels} \item{trialnum}{trial number} \item{congruency}{Stroop congruency (congruent, incongruent), factor with 2 levels} \item{acc}{accuracy (0: error, 1: correct)} \item{rt}{reaction time (seconds)} } } \source{ Lin, H., Saunders, B., Friese, M., Evans, N. J., & Inzlicht, M. (2020). Strong Effort Manipulations Reduce Response Caution: A Preregistered Reinvention of the Ego-Depletion Paradigm. *Psychological Science*, \doi{10.1177/0956797620904990} } \usage{ stroop } \description{ Lin, Saunders, Friese, Evans, and Inzlicht (2020) investigated ego depletion. An initial high-demand task was followed by a Stroop task. The data of the Stroop task from all 4 of their studies is included here. } \details{ Their abstract: People feel tired or depleted after exerting mental effort. But even preregistered studies often fail to find effects of exerting effort on behavioral performance in the laboratory or elucidate the underlying psychology. We tested a new paradigm in four preregistered within-subjects studies (N = 686). An initial high-demand task reliably elicited very strong effort phenomenology compared with a low-demand task. Afterward, participants completed a Stroop task. We used drift-diffusion modeling to obtain the boundary (response caution) and drift-rate (information-processing speed) parameters. Bayesian analyses indicated that the high-demand manipulation reduced boundary but not drift rate. Increased effort sensations further predicted reduced boundary. However, our demand manipulation did not affect subsequent inhibition, as assessed with traditional Stroop behavioral measures and additional diffusion-model analyses for conflict tasks. Thus, effort exertion reduced response caution rather than inhibitory control, suggesting that after exerting effort, people disengage and become uninterested in exerting further effort. } \keyword{dataset} afex/man/compare.2.vectors.Rd0000644000176200001440000001071213664111747015524 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/compare.2.vectors.R \encoding{UTF-8} \name{compare.2.vectors} \alias{compare.2.vectors} \title{Compare two vectors using various tests.} \usage{ compare.2.vectors(x, y, paired = FALSE, na.rm = FALSE, tests = c("parametric", "nonparametric"), coin = TRUE, alternative = "two.sided", perm.distribution, wilcox.exact = NULL, wilcox.correct = TRUE) } \arguments{ \item{x}{a (non-empty) numeric vector of data values.} \item{y}{a (non-empty) numeric vector of data values.} \item{paired}{a logical whether the data is paired. Default is \code{FALSE}.} \item{na.rm}{logical. Should \code{NA} be removed? Default is \code{FALSE}.} \item{tests}{Which tests to report, parametric or nonparamteric? The default \code{c("parametric", "nonparametric")} reports both. See details. (Arguments may be abbreviated).} \item{coin}{logical or character. Should (permutation) tests from the \pkg{coin} package be reported? Default is \code{TRUE} corresponding to all implemented tests. \code{FALSE} calculates no tests from \pkg{coin}. A character vector may include any of the following (potentially abbreviated) implemented tests (see also Details): \code{c("permutation", "Wilcoxon", "median")}} \item{alternative}{a character, the alternative hypothesis must be one of \code{"two.sided"} (default), \code{"greater"} or \code{"less"}. You can specify just the initial letter, will be passed to all functions.} \item{perm.distribution}{\code{distribution} argument to \pkg{coin}, see \code{\link[coin]{NullDistribution}} or , \code{\link[coin]{IndependenceTest}}. If missing, defaults to \code{coin::approximate(100000)} indicating an approximation of the excat conditional distribution with 100.000 Monte Carlo samples. One can use \code{"exact"} for small samples and if \code{paired = FALSE}.} \item{wilcox.exact}{\code{exact} argument to \code{\link{wilcox.test}}.} \item{wilcox.correct}{\code{correct} argument to \code{\link{wilcox.test}}.} } \value{ a list with up to two elements (i.e., \code{paramteric} and/or \code{nonparamteric}) each containing a \code{data.frame} with the following columns: \code{test}, \code{test.statistic}, \code{test.value}, \code{test.df}, \code{p}. } \description{ Compares two vectors \code{x} and \code{y} using t-test, Welch-test (also known as Satterthwaite), Wilcoxon-test, and a permutation test implemented in \pkg{coin}. } \details{ The \code{parametric} tests (currently) only contain the \emph{t}-test and Welch/Statterwaithe/Smith/unequal variance \emph{t}-test implemented in \code{\link{t.test}}. The latter one is only displayed if \code{paired = FALSE}. The \code{nonparametric} tests (currently) contain the Wilcoxon test implemented in \code{\link{wilcox.test}} (\code{stats::Wilcoxon}) and (if \code{coin = TRUE}) the following tests implemented in \pkg{coin}: \itemize{ \item a \code{permutation} test \code{\link[coin]{oneway_test}} (the only test in this selction not using a rank transformation), \item the \code{Wilcoxon} test \code{\link[coin]{wilcox_test}} (\code{coin::Wilcoxon}), and \item the \code{median} test \code{\link[coin]{median_test}}. } Note that the two implementations of the Wilcoxon test probably differ. This is due to differences in the calculation of the Null distributions. } \examples{ with(sleep, compare.2.vectors(extra[group == 1], extra[group == 2])) # gives: ## $parametric ## test test.statistic test.value test.df p ## 1 t t -1.861 18.00 0.07919 ## 2 Welch t -1.861 17.78 0.07939 ## ## $nonparametric ## test test.statistic test.value test.df p ## 1 stats::Wilcoxon W 25.500 NA 0.06933 ## 2 permutation Z -1.751 NA 0.08154 ## 3 coin::Wilcoxon Z -1.854 NA 0.06487 ## 4 median Z -1.744 NA 0.17867 # compare with: with(sleep, compare.2.vectors(extra[group == 1], extra[group == 2], alternative = "less")) with(sleep, compare.2.vectors(extra[group == 1], extra[group == 2], alternative = "greater")) # doesn't make much sense as the data is not paired, but whatever: with(sleep, compare.2.vectors(extra[group == 1], extra[group == 2], paired = TRUE)) # from ?t.test: compare.2.vectors(1:10,y=c(7:20, 200)) } afex/man/sk2011.1.Rd0000644000176200001440000000577013667760652013352 0ustar liggesusers% Generated by roxygen2: do not edit by hand % Please edit documentation in R/sk2011.1-data.R \docType{data} \encoding{UTF-8} \name{sk2011.1} \alias{sk2011.1} \title{Data from Singmann & Klauer (2011, Experiment 1)} \format{ A data.frame with 640 rows and 9 variables. } \source{ Singmann, H., & Klauer, K. C. (2011). Deductive and inductive conditional inferences: Two modes of reasoning. Thinking & Reasoning, 17(3), 247-281. doi:10.1080/13546783.2011.572718 } \usage{ sk2011.1 } \description{ Singmann and Klauer (2011) were interested in whether or not conditional reasoning can be explained by a single process or whether multiple processes are necessary to explain it. To provide evidence for multiple processes we aimed to establish a double dissociation of two variables: instruction type and problem type. Instruction type was manipulated between-subjects, one group of participants received deductive instructions (i.e., to treat the premises as given and only draw necessary conclusions) and a second group of participants received probabilistic instructions (i.e., to reason as in an everyday situation; we called this "inductive instruction" in the manuscript). Problem type consisted of two different orthogonally crossed variables that were manipulated within-subjects, validity of the problem (formally valid or formally invalid) and plausibility of the problem (inferences which were consisted with the background knowledge versus problems that were inconsistent with the background knowledge). The critical comparison across the two conditions was among problems which were valid and implausible with problems that were invalid and plausible. For example, the next problem was invalid and plausible: } \details{ If a person is wet, then the person fell into a swimming pool. \cr A person fell into a swimming pool. \cr How valid is the conclusion/How likely is it that the person is wet? For those problems we predicted that under deductive instructions responses should be lower (as the conclusion does not necessarily follow from the premises) as under probabilistic instructions. For the valid but implausible problem, an example is presented next, we predicted the opposite pattern: If a person is wet, then the person fell into a swimming pool. \cr A person is wet. \cr How valid is the conclusion/How likely is it that the person fell into a swimming pool? Our study also included valid and plausible and invalid and implausible problems. Note that the factor `plausibility` is not present in the original manuscript, there it is a results of a combination of other factors. } \examples{ data(sk2011.1) # Table 1 (p. 264): aov_ez("id", "response", sk2011.1[ sk2011.1$what == "affirmation",], within = c("inference", "type"), between = "instruction", anova_table=(es = "pes")) aov_ez("id", "response", sk2011.1[ sk2011.1$what == "denial",], within = c("inference", "type"), between = "instruction", anova_table=(es = "pes")) } \keyword{dataset} afex/DESCRIPTION0000644000176200001440000000643514076173262012723 0ustar liggesusersPackage: afex Type: Package Title: Analysis of Factorial Experiments Depends: R (>= 3.5.0), lme4 (>= 1.1-8) Suggests: emmeans (>= 1.4), coin, xtable, parallel, plyr, optimx, nloptr, knitr, rmarkdown, R.rsp, lattice, latticeExtra, multcomp, testthat, mlmRev, dplyr, tidyr, dfoptim, Matrix, psychTools, ggplot2, MEMSS, effects, carData, ggbeeswarm, nlme, cowplot, jtools, ggpubr, ggpol, MASS, glmmTMB, brms, rstanarm, statmod, performance (>= 0.7.2), see (>= 0.6.4), ez, ggResidpanel Imports: pbkrtest (>= 0.4-1), lmerTest (>= 3.0-0), car, reshape2, stats, methods, utils Description: Convenience functions for analyzing factorial experiments using ANOVA or mixed models. aov_ez(), aov_car(), and aov_4() allow specification of between, within (i.e., repeated-measures), or mixed (i.e., split-plot) ANOVAs for data in long format (i.e., one observation per row), automatically aggregating multiple observations per individual and cell of the design. mixed() fits mixed models using lme4::lmer() and computes p-values for all fixed effects using either Kenward-Roger or Satterthwaite approximation for degrees of freedom (LMM only), parametric bootstrap (LMMs and GLMMs), or likelihood ratio tests (LMMs and GLMMs). afex_plot() provides a high-level interface for interaction or one-way plots using ggplot2, combining raw data and model estimates. afex uses type 3 sums of squares as default (imitating commercial statistical software). URL: http://afex.singmann.science/, https://github.com/singmann/afex BugReports: https://github.com/singmann/afex/issues License: GPL (>= 2) Encoding: UTF-8 VignetteBuilder: knitr, R.rsp Authors@R: c(person(given="Henrik", family="Singmann", role=c("aut", "cre"), email="singmann@gmail.com", comment=c(ORCID="0000-0002-4842-3657")), person(given="Ben", family="Bolker", role=c("aut")), person(given="Jake",family="Westfall", role=c("aut")), person(given="Frederik", family="Aust", role=c("aut"), comment = c(ORCID = "0000-0003-4900-788X")), person(given="Mattan S.",family="Ben-Shachar", role=c("aut")), person(given="Søren", family="Højsgaard", role=c("ctb")), person(given="John", family="Fox", role=c("ctb")), person(given="Michael A.", family="Lawrence", role=c("ctb")), person(given="Ulf", family="Mertens", role=c("ctb")), person(given="Jonathon", family="Love", role=c("ctb")), person(given="Russell", family="Lenth", role=c("ctb")), person(given="Rune", family="Haubo Bojesen Christensen", role=c("ctb"))) Version: 1.0-1 RoxygenNote: 7.1.1 LazyData: true NeedsCompilation: no Packaged: 2021-07-21 19:00:22 UTC; singm Author: Henrik Singmann [aut, cre] (), Ben Bolker [aut], Jake Westfall [aut], Frederik Aust [aut] (), Mattan S. Ben-Shachar [aut], Søren Højsgaard [ctb], John Fox [ctb], Michael A. Lawrence [ctb], Ulf Mertens [ctb], Jonathon Love [ctb], Russell Lenth [ctb], Rune Haubo Bojesen Christensen [ctb] Maintainer: Henrik Singmann Repository: CRAN Date/Publication: 2021-07-22 04:40:18 UTC afex/build/0000755000176200001440000000000014076067246012310 5ustar liggesusersafex/build/vignette.rds0000644000176200001440000000111514076067246014645 0ustar liggesusersTo0Nl&!! `qêR@PmyZ8v;[sByIͺ{~?v[&8:^7N"/a"I" n $)w hEt\ (5A.*OSi$JdDrPORy{U ^ǕcÒFq(j3 d =y""fB&pe0PfJ?KTAVgpA s ^99=}mA)d0#Xu~F)@x":D<=\ZZr6w?[n^?Yr\j~yk.ԿmAh!`o_1KTl UW3_Άѻ?5K/UQ򃉾ί7U,>BoZv7>Z27Xr򹡱bv>k~W\![kW]&J5jjXA+Ctcg;ٮ_|6{cowh]a/زUl`:W:׷u[r_bʯ! Ge%i R$E}>aȇuH,uW뵢]#4_+T|G ʁc̨oov@bV ǬY DlPbǐ^vVIɠ!7= Vޱ:| 6h({=ؽhLܡmCTL+D^؝WJ0s=ܣ['o&&& 0o;:WsS_Ԩ\+Ixʭ5 V~p_Z4Z Y+Ϧm!%PUlbgu*x4Vf؋!4Y$>`BT^7jM[S\CMJ;2:M@7:VTy5|JCWb0ޤe8v!1A?.'(/*#H6D]!q`WR:48C< Ci>iOC>mZ iuPuJ)3*WػjK6=Dm%;[l丢;{'WV~rB{TeE{d-hYr^gxʯ~hV}'=/ B*nZ=)׊¦$;+c>UqSګnfԦҫzfNx7cgy7oy;p㣰-4(~r_}gmjQƳL? P+z'{{R8YM6'nrµ͆XP*6|Z|W[֒;x>^Pv˒Я1*[ y/bwgrKy_hMSxTC8{5g/77νRK hνv'so+B< [щx83/3~Pv[1/м!lԼB:UZUoӎVUA|~{RC6Fge*/ Co'UZl6 s!7=lC_&ǽVH(bw Lo~a E_. lLHG_ dzovo7h^i xمmLuX}ߠAZsme{M죵|o>{5pC~qvy7o]gې,m{]x|ۄL[ C']zC3>mimvCjn>{ ¼Mش :mC-$ƬmBgv@kb&ڢ-AunzիmB !ۅNp6s`yyѶw]7_..F[{G kpu:{ySZ.#V+gmۄΞE],x}6 ;*xmBTET/B\f,3]vjt,?&L>oNh|_g Eb_|D<; /2qf:;XE{Gh=`+^ ]`<)۪[j[zt1[֖jLuVc n5bVcGS:^}n5Z[tt1&G4gpV°8'fDHu3AVz| 7[}_F&}~iybY'4AbfXp۬>,=vo˷h_X(}bٛ^#;ˮ}:}}碑d2mBmuT)\V˦xnzY';o;{ؒUpk_^ޞ̦;Rs,Wvd]dgq[ %n+b~_/{ouvoJݭ,r}ۍ)辗kUu&KZSu*zkwD%+#C޺3U zljU dh \*q.ݼf` Ce2{MՊ]cH}:]:׵'~=X,?K6\>ȽxEy7`˵QSe\7";Ϧ2Z|ZܶW6b՘vm[uʵ7Youj^=KA`A\ #lz|n=\;_YEnN@ff*ֽ-}ʼnQ\_īE+Lށm&༼~H/ t,3@>[s_Xg,~Dv85/Lc&8YɾbWYvsY' wˬc-EEMdXM11Z6~l9lh"c/[&ZqeL.g" m=AiToeۊy֛}_bXDVԨF ?L,l+rWkk8t%$>\tlpno -_,u/I)o57*6\'^WL12s6J>(}LwZbG%VHJ^%!GTʳ &<+:k+jaL1c,'U Nh 5y[]uQs1/u׍J~Nmo4${b8Zi5Rom9V}N9B 8 ar !7h,'@c9af[,- u^^I'k iND< oNT)Cߜ16 !u>;`'ړ/o#Sxj:zl^[x&NJ&m1c'WYSu\; wօ =wN;Q=L:&6,ic+STuC ~;S؞qҥNWw!5'58yJ[?-׾^M{Eǀ(?!uפ[x0 +K5 !ɍ[WKUȫIu̐نc A X՞\HEjA"^Ш؝@s3hUaP0(UL`'U006nn.AF7KFus*KՇ&_abg> Q0De8y> w -agYȳ[;>nAKbw͵!UuD/@`D7[MtL>\"mHD2@fƱ"nsCY,:>zN$}Q4íU\KmIBTd^`-VJoPڐ䧧 )06sjQR7mTI]u:"Y+$CG׷F_סFu*?bYM tsèo8@S7ː/ozTcXS?hbMB;[^hר2&z.#:WLjKJ[4lF%6wj|o#VCo#ʌ@S:UoTCvBT U(VZ^ͪ3CTV] 8fZbDPԲ[h= ء / t6 \j{k`8 +|!~W+n'{?1M qng m5|Eq]o㛊pC)V }MΒ9Zcwʻ{ |Zlv-~Uy.[^q%*tIzm}{=6J0s=Aȋ\+;| H5ήo՘]d.A^, 9\TKco\+<5lLW3_ΆʛW]@/O}{oowx`\=k346]X΢[Wl8O}9eb\`P댈>{r>5PlNToC]1/8gc=_+菾o}f,[7P cul.o9olB5a)ռNBԭfհ`~MpT߈og{[:&;|ߠ~_ԻFcG`RsT7ga13tmIVVQ~Ido\12;X?'}Gg96!G_wkc43/ynPC}XEa +=&^]W ׾5&\`?jzx _,?!ju^(Sq99=ePu l /<@E.]13?mQ\amW,e 9!}R6[^M?Wۦ3znϞ) SÿygySS~cyr#F&\&!`>^m+9缬Xh9.^w3ބCsW~Tp hШupcW"m֥9îfFDbw<"'*T lPoXZBݔ7kKolPcǐrYj;E:c9Pal٪ eVMj@{hZ"mj@U*rZTsV(p 4*t vi};|O] Ų(U4`5Z!<|5ecHCvf @W=m٫kAiJ43W}ϤǐzI?-y>ļEda!ePQܬY`nE_!ME]P:x8]~ ªD|h.W3p*_3Auդ:MXlnD,xPݒV6"p[ ty:W%dfEMNƛN; ]V]"䋉Y\4;άlS53!j2c, W+`J/1Cͽt_4NIռ@q)S{45J[Ʋ'v+R}CR`EC?-b\zZyuƾcqa,(Mu%:Bi#tOAypx:S&{:<jILN*ɶNKlƻ1܊,Eknܾ6Ll:R?#erY`_DzC4 !㩷rӧ5o oħ/6^-xB/9Y!_q/c_0P &>oӹ LY:NP4JUl\lú'e񤃱Ou5-P~u5e[i RR:@ v'ۢ`kCw(/<,i1oL]d9[cO_ (Eb;7f̷Ò9{'RWԛltN~7L`JsٵޚŶArL[8VO2qɋ॒+*N{ |' I,!fӈlFK6ؚdD@ DlzlLWڹ {bd!s.[\{xcՉ;dCWds6u/s5zػ'BZ׭|~vH*V1[-TD-2ܕ-G*a\'#ɇgu%1fPDHg ߜ\8?gβa3j-7Y+JaNޒj`& ?K\u\]g)2;dj>lr^ç⮤*c̕Y^*If D#Ho쀸ރ|9NAJnok"qV_;MNJmaêˤEco x*h|X?8TkAd'bm$(ؾuµxvٷ@cDgϖ8W`Wt pq{[Z 2jOBєI-ZMdt@a,qe6WE^ZPDf '_RlUQըY)d5ZZ@Z kuj'"'٧EŦ@y/${Nk#ϰ^8|ꡪM~8y&q|3Hh/rh:O@>X5-=:9 B䑖F.;!w6G#]:ZxVrWz\k|a9vM/@֛E\h]VZCjj囍KŨT'XD2d VJƢ=Oi1sF+!l2 B={Ng+97!G#KW mq_<9*KWGws+4T圠]Ho'< ΆvD {PӤ/C6@{P;ZabBނ~C<ͦqo tmʊdH؞J[INTwig}3uK9#>wAN\sj8k&;\Ys@MWE`&TieƳXYqr|LnT{M"vxwc&3fwWTT 4@5۫((%qZk5j '^W!k j-;9{,GcG/h>Zur%+jhD2:rrz<qfe64LYnGLcXayX~"oJȷnaU cr} *r@FKOB"YnI 9U 3˦;ٍɮz4)hS5CֲVmŢ&&e[gׇ,"j^,pV8y=%BMĪNiQ7/_A7ʮ 5ܪZTY?O[ǐ7=.#2+t"т"AeL{IS%[*BZ/dԺu넕7\=Gs/oYAɧ_yKX5yP%<`lrSz<4d B AZ~]Q]0'Yȳt`rJyv@0f7-(@f+TQYz7?ݏ:W Ŝ^[K1:Kvs&J*|~tT4>vjo,OMhג@sO˶).zjnO|G!7a.AN>PԽuh3M=FŸ|8y筝_c<-[C:Dƒh)!o}oRGh mZ'MRUǓ9z%5 JϠYy+rwvBOi|7acp&^E_N:,J`lୱCNEo| } 19_F[ />DxT`0yCWmitoeiͫr7G?!C߷PމQ5TRIDo!͞U)+d9LJ+)GҲ/eL dڑHKf]ם:vT6FwT\dAzOի`b4FkWI(d.O[NN;$1u|MG cjj501{8U•ete،˽ɂ̵+_N, Tcd͆r -ȷ0*nx UnjNAN~.c؜vj̽#:: 7Ys'oT¯ޅ|~!({wEho\[vqMKFŵO@֟z{43d2G9X>|m1C@܊[*+RzX\.?$4e*a qU3RrieuzuP琟'#&8YJ\#WPYwMWE'47Vϲ(0yVA"8SP͢ɢAL޶]'v@ z;èDPztvYds>dL@M BrvR=2sI 47Y-[7i\b; &ڀg!'?9Փs@Jp^ߦ\CמeW/pD`4MEϵuN!3~e R]u Z3H]^lr6k>r;+M PQQqm&srրT1 ozZ <1ٵP|\ԝvUrrktZE5艹oY8Ft!_o|o@P>@HڢUdO[t^jZ]vwr"S)e{$;r &TNUGkhK XEvPik9s0 $t+O1%8T8Z@#쁬AJd7!;^oXz+Oy!cJEނlCDtNBsN߈N/pMMt 89xd!J&t0NʘdU `ʄG 1f?x211ZJN/Ax :;IfD56N\H'1CrՕ3 |2]YȏZ N~;kE0[PεhW0y#WQ +t}Zk FxEc^8Zw$!VWÐ(Rq 89آAb(BJV9 C< i#U`LK8#^*ubA[#(3i!o%"5 |YkKm3.‡<17|]琓Jsc 3%2 Z݂6}aiLQ8c%7VP Bsqٱ5Ņ ҷyݬHs @p]͡`-^ɪXbt r1R>o^ecSxIVvRmL=6{Sy:J$OC>M%W`e!o%'7B779Iwv tv @fhlf_004<8xoPH}jz~n:< Y9Fq`k];c68̻B}#f]0}P7z+ܩWZs)JWCooӒ^5ov9} } (f_UYΏ?RFY|;pr%+KmKv;:O?UXL8k G!ݬsK@LŝvBLR7PkVԏ8,~biըԌ <Y/ ?i{t0 :ns^w NPw x%=7`* x}c߻-:~u?J1%j{G] eF$ҩz-g~N%*Ӵ~jN L}~GЅbZ}^ žP|jپy846]XGM_rk&zE*ygob[Z\amE_[ D莝sB`VX^M?eh1u?RYgvoJ>z=}JwMUSū/gȺďaEcKyeNc2E=4Q4Vޜ vÝ 7x"W˼M҄漬H*OR8.nuyu"ώԺ >#x4hJ5D~`;vJ5Km[];pSԆIcx )mR? <1^pB-.*GԺ<R.cFiR%Px(!K[BYUkQn7;U3|tߋt2=h$VƙL#{`5+]3EB 评lߪV5[hx๫p\ tpu,Ԕw:VYVΘ^[i/t|a'ӶV|pGOİ*g>N6ps҆/gTvHLg?#- bz9!Qsu:@!vQ)FIX˾lљ$uzJ0ّZw_&t} OҝnuqM,?HߘO&n!1!Ʋ+vJ[RͺsSi8z#&yդ;P0; LkP0ڔzsli!pc(;7 9_@WZ10$Zb{R&KiV&r@niTIaվ&13VwLb-0>B4Xn (sLLgh?oe:JRe:f .p$nsbנԨQ!QԘu .m^u:М*u6]`@hn W7g0whjմ2ˠ]{`FNUi\Ub}Aǀ{NNݖ N9ܪ:ظd۵6n alV9ኣ+R+&ct;IxDl nCo͍&pw h{)Ah#0=M3i 8~MpOpNb/f0 [?Mm8M J7*Xc0 MjgX˵vPD@y|ՎEb|4):t x4PejƃzFS"L'H"?->#kۮ\SrvN[> =W{# ݑ}MuCn7랠'Z%+ Iai xO&2ul˺=2pt#s xĊig\-F j-_'iVB[ChQV0 UXؙD ivr}eMCZƭA4iSD)ƴ;EKjɌ:zDxzbaL-{Ӽ|)s (Kfڋb:W!_1 kZxу]P+G m> B{d-?iGr7( X ˥R89[L#c'ޓ6"Gʢ,J La;vcM@vBbrx ʖZ OC>\;mP޲`r໨s'QtCN.1l"_ilMmr+2>f5ZL1 > \>zC%|"tx)T\;"䋉 /4I6g9q+j'C06yDx/Uݺi6x69.@"Mn[G!k:knɜ^|637slU4?|yb? Q(w|]6"MӢ39"uٗyTB1_=q;@l^p!Sdl1u#*g 7a$/BN>\f[; `PY 1dȐQA`kKtѲ"'0 dV*ؖ w:pTeM@NӚa/@({ $25= QBmZzc(9tv~D 'B7O!-J?=@:=UwFZ`5w:VAZ8.֩'}gu!4շTYQ9< QT1N,1x~5s/Oi|?@q`F}%%UCR:m{8>wԓkMpL2M8VmŁ< !]yZ2W-pUC l99?)դ,=`[AɷsmPLj/Ǝ:RnnjmTcIk9K-ѷO7y]^۟z1*jUy(c SȈ„HwTǔ=aSǔĊogP̩G1lo"l̘?RPBxaH=Rj(D .!w h%FT3ŭ+SxF4/N';J}e*J|HC]- 䌱G]oU(ƛHKMnx)M dk#i1%{E&?\I{'t#zEe`V:$X+& YkK]aIȓK);)Sƴuyh8ڨ$Ch@lMӄO,Yrs")'t%UYd1sx9C!ګA1Z' ,[&L-վM1ZwUmipކqgTY7!7{Y杀qYbq8*LȦ-:ƫ:uvAnkb&;PTyL!fXAS S#L>uo"6vfT>」^A}Y+E؂[&ǀO!'?>*w\GQ;whmy) *G!kDg0U;NCނ?*Q , J LvGDU* x ^^Zx*DjO \gŪDlBN~Q̰i; HR̢y_}\D#Ϡe0LB) 8+.Vn #ƐRg 쀕@X`M g(jL!|Yk˨v ŷNSiT9[*i $hN B3r\#34ץB;4G*]E|b:9 }Q_Jn꼬"L76/[{ rSSc}8 o I"7/%a kTq9ayr9=*ߟ`/e`8 fe߾|M9H>"a=YtN!ȇ?cbŶCno{i6@1dT!lܦ=]JܣM 5^w uN@h@ť %5Yg:6t;xìNBNܴ;1l"lLsp-ߧd>e":-y]gڄ9%ZޒZN;!w&'POdsޭ%<Ck m #2v3oٛF /|@+gx/!7!'<Db-Ω:[D$rw㝭1y doOi|o 8[- odKVn mux7f*n? du7:Xv6?M#f!z,!N>|e|ȥH[0x6ak'>ԺvET/BxNd7)x=$|3fO]b*+xMx6hHs Ƈu!47$|А {^U#g '#iSX ! :rvb+A9oy~_%9Kc&7ș&d X<<ᚊ!F?4d^oP{ 7acVdU$)9N&ZQ ~_$Y˯ʁ1іZbQȣƺYMC\"l5<?&#bb۽+:wq?ESd~c#QNBTk]T03a9*XMgk*GM+~m\tsAtC, k5*5c/ip] *~$xM"l!y Pۏx!:<|[9Y˯jC.G Gώ~"%}CU@ HҋDuU]G^Qc^Od7@ā'@zڲg)ٳyȸCNdvNu/AN~TzmǧzÇPU+#gnuFuJaa^guT-ZcqQ diBc5"Ubt 6LV2[Of5N\چ1z5/"rxƛwxJl WlSDc 8y&1%',[H'2KeU]6,nj5~,W ;R&=+Sr%LWfb/d-?gLxgrxh"䋉r|KӠ`ѬG1C|AbW7E30yKa991(rw`߄W!Q5A6SĨkarT'TH r&,f G?3bP-S(;3wSIg^C}J褥!>)z-LV~԰zMyj;6v x )Iҝǂض@>v_nr3՚/7ҝwy`Nb 샬թ[COl'zbyt^GersuN{ZiiauWO6`Ld/BjPjD2,2czjXW5,z r{v o%); w4ޖ@lWO{i|`U%q0P5_'^bS_0ٶt~CJ"̽ 7UF# %US\&m8Bn$k5ɭԔ˦x}+Ec?{Ȧj>d̨NUVMH!@ŵ{! XOL 4p'|!{̓NwF ; k j̈́kyLp7q6/1vҡ|RﬣZ]H_ÐBՕ hrStBځ kmۨ5* x2x'ǫ';A`nf kk(rj5uxOivXY̯s"3|Y/)v|P}{Y3FEIYLKտ/@:A4d8 /٭|oBjN[;'JC@NalԈT[7y|9zQ޺p%'9T{?TEDBnB@6w xrSLJЭu^lnQa@ G fznG!&Vϱk-BN o5ztxi3#Z! QtlNՙuoCN~14@O6ZĄ3jvv8 4wVΒ,XckPMMWf* Y;,HM]i$R^Y1c nګeT1Td}g4LIHcteV.P6; `j ZaP) ?k#jʩ"*{T΄NAJ>&=F@֛ֈSHɘx&ޗ`KSOE|ИFv)VBnܙ;<9YO+ _0Nܤ+^Z{j@[_RqCZ[[{5G/#)B&V*JP*f\]JCN .cF;nArA,ȑ(MoW\{q< Y{4w 'L8d=u6Èe`>sA '!kMz8*x*('"w!'?ܟvUGvc'`izJ =S.3?$ A`?~sC^3"3 :Tpre]Lp ]ۑq#SrFB{5aX%Azb֥0J}/W9ڒ!`dsy4q`vx݆ ރ|9JԻ[཭jc&"ߍx 'U_К,T{"sx1մTT1 KJu@_vBr\ٴnuZހl >zVUjǟͩ&JLVAֻK,i;KS–Ӓ9ծ>(}CT6mƌe#US#bxm*T>Gk{g^hckr4$M YVXZN@6wGe[91>l27&z|9D:*~:x8^]۷gܽC+s ?jx֒Sf^T5C<6* r1f*2 d#45Kݳ R(WA pѴ+IєF'[}b6[*YKE:jE;+q ]1ڰ!YU BN>)|X<1v7~NK罺 3gWg$"*Cib {y/nш1ApE1LPWօ ˤ6< ~b-qU"O!'O~K1H]}{Y Tx:iߨV迀u><%CbN>:m8kEzвY.SFjM>ܩ= 벸ƬRuYWNekQKq lq_G-dz_zߜ_ 3eB|)bE+= Jzy+^MR`j'רBp2% 'QBs72GKOa|KHtaOʋe_XNC֛LЩyOA}?j굗?T䵗Wc," `8'oyc;pr!6b- w h-@dFӐ'1TIHc*pE2AŧbF֍Ci!;zf3G kiuG*]D q nF ؈$f/:  2e/!ke%P뻩`7&l'NJNBN|0ZNATBNY+*hEYYV`[De iEy˼%Z7*ރ|Ϙ}%mgSr g OQZѮ5K=|EEkGQET|K h灤t\J:ѤӒCOSA9 (r)NxV@W4Fs !72 z|O;&w幽.T͜BNcIHU!,3 r1[q]ՌGw 4ڌ.u/!b+`9n䒨|Q[.tЦPvKUwx 4HXa^ZuCպG_ 4ں rb/2>ׄcKjWDm89]Ew f{ \aXt#T" /J;TYcK% r 6`6EOQ@_B%-APl@c(E}A/_N5eLd 8 _F"U_QR[i[W`'Q:< T5WbxlZ\ղ'ɂAOA2cEl.@6w aSŜ^|5y{Ѹ\^l0V qGM#}J :Ey(AjiTWSr9p?d{jz@ q] 3 LD/AdLK-3uTvCn\^|.~9ѩRՖDnA^J"V([_q^|95l<`#:, "LE3w89)K.]ۤjD&!D-FS@NZd,u4;Ja 3u64dszCHጰC@ mSrh"B=YAݕƀfU9ɗmNG qh2kHx!b#. xV_fpTZ9ˮS~@ܮ@6ZO]+%& Jh%uZ'y~.aNHv\/dhM.2K"~rtbmƿ.rx[߆BOA[*'V=,m6*p;Z: 셬_S΅_ rr* l݈]To hopd Lyאl.nA>X1:|8ds˯;{ـJ./AZ+QWi`'*N>IH4 'oڗ"|IFUҼN.YkG}1h{ $kE^(dUjZ&cjށ|'ZwW$Rؙ><1󋥲N#}h.iu!Od?5hF1fFu ЩPq=w*:~1C7n^~M$^E`Xp*"0uއ|0Edpr`a%Ƀ:6D?|.7T]i!,B?̈́\z%zi?ʵ"/A6yD.:l=UϳL5G*8y<|[۷̑6@&s PR\[V[}L):N dU+`uB(T*C< h]u+G4^|u]k_Ptf^(MYd~r#Bf6%:;J)"u5,ieEAьDj,)KbgO/[*9qoQF-d'+Khc5#4%Hz55:vЩj\FErRQqi[hO?!4NOt2kc iȧ̞N>ة߀Fd &xSqgW!_M:qDdkyjeEy ވtt3 wRq=IZ^!:X 0r ry[PRB>NCQvG;!4֎NdW7SlHy^|MdYb%%Br[,[;3D[:N3 1Ltՠn '_RnTIH7;,,*&~ٟYպiAsL?M E#p%v@H\+bpx cn,uβMuvK,Aֲ)u͝>l:kT\r<44 'U;u3eN}\\SZܼ o4 [p"<LvV{U`@=ìOr_~ڃ0d#>5]z( w kūdxHڨ/NCNR6\{զUyIX強(z+;*>k h"]z JF&­ v՛Ѽڃ$ %e(u;-e=SĦz`1 |(ed|O{9tp%Q$;7*`IbS̛͜79}ygѷ>Ro0S ւ.-y=!>b \2\`JsWQpKiTTʄ9?{ >^% FOi`;1'\}$H6Q4%w^z?쵭>bZࠔη 3UOj^ EGab7E>H#Te9{qr"ݰ«<øzbb:Dx[M8"[UiNQ|2ukXhNt*mT&Fbs,"ђSȿZ', |{NwCw+pyBQe8U/jo~Z, L:鳲S}Vrn)aqeU[اP^T ۳e[ӧ$\.dyBE e]jCڌVh-uOVdO݁Li n +I 8XIVv2^&UL>S.^)&))i6q)XRTLhO5l?\`Hߩ);ű%t:~)d{vtn}Y vr}V7 ɦ:?,ef+2aG `4O<$-p D*v\Xą` !e#u-e3Ǿ\Sb8,e:,cߩݺs3WR OG܄DqGR6phX\݉!Bc)knf Жr1pAʄ %pIʩSಔSˉ wV f,V5ԍzDg-)6C7E෥LP7sQ{v ׹pEr|S) IА䔢eo[Ye??2a3HʄC\i.,p P*vМ+w*F/ge,ءOݬ͖&kT6'e LrzMlw'L?3?q[)S}V\ʄnT\'LL FOa4[Ӕ)6ڔ뺱NkչHDmI]7nZʩs<>_Ϳ| Зn?މ'@[z3}qc@y@/ߔ2a3t&η+=H ܂47 '//vRw8n? U+__ $AkRNN.-Ю<Ď*7OpR&4<;gj}NS6)6݂.efW*wT0zPV`R¾[\gE5ʦ-Ry *~g'!nG*Ǣ !(AffD ^['ߏ( E L5rcp /"Tՠic)Hs3_|@7qe-BW*R>ZTq# q&qu` 繂n"m*@ #4r+iu3V%)7t(, ݭeHPHـMMV> ?'V80;'U6,"ij¼MSiw+Yl }6%zT^݀2RyPQw8ulɕwzTq Exu?q=3++FwLYv(g"`UiP$<GÏPߏTM槞g{zxr_ʾq"{R&To1IYoTބ*_GQNޒfӒ)ӒcC:290#\ȧT09tSދhSjs٩1}R;f'T\ p5INZwV6+V^.!\ηу ])lY)HOC:Eȼ=y̛W{![G5 Y1V'YgT5KJZh]Ϥl`1Ty{I30z[8O9y]vp|)gCw vx]ʄ6*(5ozI̖ht[yeK}j+c XPKbUHWHWgwa;H3kE1brxJz{JNv7 ('Z *X3 vDd2a) 2]WD8*%9]9)JРrW?8a*!naW? &z=KRqLtjWѫ}'>GR68GQ%*(nࠔniSSpHʄ O}E9u3  u(!0qA5iR4{*IpXHsRHdi*R1ȫcDZRLiP˶ z#*j_+ <"fxx!x!ɽ=2ᏢrQ))om7sm7*4ܶەnXQtŢLYpϐYʋD1 fPsDLTU7F5КtAT7F5C-wtd{xm1մa6Uy)ʨ$VΫSq g 7z]7W]Y|.e[}c9gIdc GP]쥪oAQ\AS 0!4354LNIh:T~q)!uTn )kvOOF#<): 앲v)&++#e„:K!󽒛Sv]3)͊tEZ^Gd)eˮX iSV?S "[QnIS8+e_w*wAڷSy[/r%ZmE mSI.H` {܌Mx**0#e[q<[ں] xO[V$'j9ݱgPL}Z*i;ػ働%Ax/o`l{vHYoQ-z8^|[ҹM:v+B`„a»0S| S1z aar3֠V` AwOpXKbyŸ+3;%ۥ[hzYk:=<1WU}vG2+& z4] B'gKNH 䎫>ޗF&02d T?3| w{3?SmND CmNъ ae71.QnZ dg=tT3[PG!z*~g fLƣzfR:ѤѓtgKyk]S6Yb6+1cNFEbr -eSDj= w x]zϪr床@Z%8V(vX=aѢ:֪M%tE˕-.7\RKkfQaܵj"Uɉ̗5yDZfš;H/n;KoSm]n+|4u*(4'?=aDcq9':&EzOlqal9-SQ(>dZuIKyEa^ݪE>*piDUǪLǗ0ٔ,Z^G3uik̨un6i)Hz$dzJiɞ|9.f$r9?1B!K5O4vU;\bsȤޤRqǀL=P$;]RK7ep\fP>)TKZFR6xcN'efe8%e[{8W8> IH%9aZfQRҸfg2eHJ3|@͘,۴@D&5&.-qޗɻ ` grLfg"ջIB'BeZ(;DpXʚcDS a?ߟ2pal9kh}, +n(nFAq̠1YN/IYTkCT\Sʚy&*P]-u`qm+w8 e#׶rTwd[XDYCOS!j)S׶3Y^+Z.eqv8Qi,/ <t2nFy5r xQʚgk`}Sn*𺔛K1 )XŽB/UE;"Qlsen qHbQ2?-\圪_Ej Q0K[U髲 FfNTU)H Bz]K?!hgxGzsյtIfDn"s\,FbD# Osɦ%0f2Az9ǀRnFh#whskW?@n{l,Z 3| CŷT0tv?0ӨRXFs ,5 LWTyy\`ìia sF[ Qkb-ʊ-+|;18gβ[wկ.%&],=gg*{h-`p{bH`{-3#=a#c7'밌:Npˤ 7@ݠV@HJLKw:A6&Y6iyzN`wv"u5`XzɼXI};(Э_7Z-x59-K`^),&+^Nh7LCԃp Hg<\zV၇g.f[|$lݍ~䝍+ex3$'~JQ)TI\~ϊVlwgCkZ,(杰SV>Y-8ۉ:-zs"֭ӧ! dOwEXYwRyV]>F7^joןmd<= 㧓~3yXz; #4ovNJ1Ӛ\xW><wX{H ǾB߶BJƮeqo,Wxne Jh-U\qV [qd66 3 }!\1(~ p{+3l QOwt!F'킾Q C&BhDdq'V-%%F[!r8cno5.1R+>wV> ɬu`]> Xu_bMZh~Vِz(P#ypLK<0!4Ewei;wBU& Fb=b^ZsrK^M*`Ō^~"4w0WhVm*o M0u37LȈr~Q!8 TЏB?fBCU3BUVЏB?nB@ff$3ιdhf`]~Wdw;?\@~tF괞 Y`UÙ#܅IROB?iBuZD= 37yEfǕ+QoBcuZf ffF+ P_`B7!F$a^݆Ʃ h_ BFESBBP8PXf|L~*LWwuQ B#T!M bTP*lhDkhtЀаTP WA Naw 4 P/OahHS/5^P5 qF3C䤧0>ԯ\_ 2 {S Jd0<)rTH!s44&ơqQ TWО.۫LW̯? 2{I}Q{,RQY05|4Rȟ ?7Fzgn``?Qgn e$o8LǏթ*P% `WВ՗X'I1*kfRbi+ۡV|xkP//^_J\]8̩wkp?%ֆ/So:n2SN^M_ n*_odtegXPo6(W\%~\ˋ3CX)"fDtyS@^xol^y-FybSxjYzmvF]<ōr>IVT>*r?qE~PP Bh.k3:yh7΀r~jDܷ.ݨyi"j@h.s+mwFsmw2jQBsM7+4 >xr8x=Vſ<~QVm\]_]e+|(.Vof,J}Qoq=Vs߅sѳV8L^k45P?=ԭ4j>o?0NWC!jB5 qMΙTEs*0xaJTWbe5uuM^2*Cy2Da}OKy)T5ҽǨi)ԓXO@&3$y!4(@hnI$]:PBsA?E­D D߭sCYv=nǬB*njgs^BBs3݆eĴhvyncz$@hVo??e-^2eV0lf5^٫[4xi/zs=[m_eE+ >-YSq%^ 7JA%$󺫽Sh:J>GoI3FMB j1e HlF͸ 3 I#L *猾ymk3]̊ҌKbJGywmq)VM)y3Jg`u^w 3>7?|nL/>M׺}q}̇l)sJh.Zf~3,F^/;/_6y+Fy M=V 8E68yTdS_ ri_ſfuF X+;获EoU= o1P;L0< -ūo2]l GX@-t<]}F3k@nib HǨwrXڷ?-9.\^_*](ؖKkP)c*q=ywa"Qޑ3:˥+fh=bQh۞PoX3[UgٵÐ27^$wAOO5A(B|XDm/g{-LLqALneJ|Hezh7j5Mn [-Dh[F 1j@h.^:ڣf͗rpqL JyXrdeK,K񱛾QcjD?)WC- xL½7!{EVÐ jOr\97I;b::C?uaPO~APP$H4 @&=c~ w|J:x{^osD͝f!zd+ƕ3Uo)g B"-[`? ?kbjOM/0%Sk%㟾;1U̵ݭH C+"ϖ"ŠzjD^n! F a DGdY-NK`,M̀4μߨ +X$Iە]2\ m>j`BhnvnrwSzRIJT\YWX+nZ  2QorY[Zv: jsK==lbds'^O%v{tAuU:A$\%rIh+vh"4dļ'mCw->'D`rwN`S\ӜsE%Wr PQ.j|ݮ7>Y#lADg.΄ܻ0-H&p+Gx2SZ);e`/vʵe!̼vk7Jx VS%NA.QNV+ Ao9rM+NV j31oå mf=bn@lOy$.V\k/Sx^~.E3#34p334\-*A_^\-4Z;7(5|\12|"՟9zڂg)h*V[[C# 3cC#ZFɊhkFFFQ5?<<*թ\-8VK^_nփ#r8 V~uպ8mը͑VT-s 5:mpe4] h[TV.vA[7Goj!]жh[ĸՍjug5>4,VpZlL!P-##‰qFGzB /m0nE[gB[CczAz޶DnonkU V+vU=m DGbCTӡᑁ1jePLUFpIDjBxMo@yCԶj+Mj;#2FFՏj7m+(5ƻH[CC5684:>UTkhdkA 'cWe_2~Mm D*Sضhrc;~E$-^_~] P-  t2)Q+= ʔLæ2E=Ue֪~βsV[[ʯBq}^PcPX'=>|}+(X.^=,ɰO,ޅϿ:}ai3]AP'͓ĵykh LBebg5rU+/bh· vαWqԉ9oW6)mBqN;Wl hk轙Q5`#WVI?N.|=/LLL<'5- f?>0;Rohԃu*JY5}׺w.k~jf.zNxj1zO?`+aX &3W[^^wV[bTom_pE>]y+,~[}<=j†:`^V=&2 A Vkn^Zz57/ԱmԱz/mcGՊRӖj7R[jJ5myU{Yl낳d\C8p;빮<x_iϥ ,+1Wywh52O`lz{ث 졝\{=ɰb[y6bP7[GC҉ΥL/ھC;g-X7|&eg9L.1|hbs"[ةƗɐWmEړxؼ#4֍Yԃbl a 7ÕwJ{y`;q[UDkLyi?h l*,%Q_wNlEWrDJN3S=sqw@46束~o/tsYqm˗9 xSzw w8.e_gKw|&=)T(MK^̗Q`@ۚ^6|g/k30>~3L` -&yAMZN^y{}p#L֟j'4Mೄwe(?x3V6SzW,-Mz5L18[ ϤSי|ROglbΫjVEU,uB9+J `@ڎn oo_c & 8C*= x_&o6 DVWR5: d;kGwrESCI SUఔ =,fVk=FLz#hZXZ6s8^عv)ݹXtNmR&lRq;L~WKQâQ6]UxSAa)6.V)%SK :m$ kOJw+Nv9[\;4/QvR60+yCA>|TW] OkvG ej%6z jmfBsƊSy {!ٝ2D~n_[dW6bV[Eg1V۪j: WHn:9/X,Z?SlZl=­V$"~ \#rz*[u,H +jYQA0_52{rR;ga3Zek3Gw50ѵ#e,1Kզ9S)␼Bڔrf@xuȘ.Mcc)5"]y^n`*/AW_*_MrAcިS7 };+#H,'Yk~7ڟ Y ߩ^? ; #e5i57H;튊ZIH el*Rz 'stMxJnvx\ʄ Ӣ%P''Lh V)\:!)/:ENRA}'DRu-)77gw]MpmC6xz0G;Ae-MC7e|kP W?gņ#˲h<} ^v.ݟ)mNC:Se1=Wc۵}ō~mv's+[oe5+nک F4Y^?E>KJO;~gUVk}̗adTǰ}ե|bLQyz7%_++kuqM9%'oo{o Dv ]a/6>V%E 㯼W$CW&Dj&wWH+$vѦ>Auՙbs}R:%cY*cǐJSu?-𹢗SwC>|DDǐRzzj~V`ٽZZm%ֆrGB!W ={OR,XyǪSk'YzX ?8+Ğ{^[oi3UXʭG\sϰ&[dثC T݊j* K:aVsm!7_TT뮤tŰjWL<"ýF~`xaމc6N0sQ|Io?x@.JJչ(I񵴤jYti}A5 ]-Z~dUzp̢GvN;ÐfL!tVt[s$ڀG k5iݵGˬ<+sdiP0Z^oO85:YX9+za"_O->@-6` 里X]ZՌu{DϾ ہ k}LUVa O5߾ O;$@nVm5ȵ!3Yb@̷ek~dotf|$蓌F:_Te!k|OӍXβd`_]g܋pde(_]n[C{Ab 45F 8ְ;tߒz8FpҖ\}j5 צ q`9l|8v@X\j~ڷ- ;V%pf#hCƚ.P(8ֽck߁:G]HJe4*EfL{;aaϏS3lZ#?U|Wu~Z[z olauTy+Zo/=Zo ((~/atꥵOQ@,N[oXЖ!ٳP ܳΫ.&rVa2 iKJ^wxc/|gq<зjb5ѝ.a=3'`9\ne.eNԁg5l,A;,+6%(,AGDd\Llz)'!JuђlE Z I)lw%JV<Fߣ q^,zŢ%)UN Z\6[L)-ɧ%3^/!yG ߅vijb)V 虴$jDɬ 5s [eUHٶ*_WUT0ZO(* ,W] { T;fTt 4G4F߿R5Y(@ؤ*4JԘË ؝AoaAHR:S2V ªtКoȋw.C0NrZᚥ9 63Ķ(&Gਉ#~Urs[;?Pw/.IuSQ/jAhZF٤^L\?0tJY];yy4F':FR9tټJA+L;;ød;n1o[[A*Fs(~N& ݼɠ;^/BFWoxM l1֩ |yrb`Drby r%t"++|w ފ@li|@%mGt "!:j3o˘W% pQ@sJϥN+7irQUK!R%Հ"y{ z 3bːwQdة&v #;|Zs9PO m%F-7' #Fџos+6ټAјL$ 7+"6je59ֲosw|j8w7zƺYQ+ _իSS7hrsE˕ĉFuaΦ*dU˪Uja?4}420>bDvgǸQ5]^8m<?$Dp/0ݡpVM&VRV ,kC>lP+e:%nl!P{+mCvJ չroUVs2?{ReIdLY"eF|٥?73"^ɶ,al 7!atS<4ދrD/r}8n{/0W $xL)eiOQ y1ͺ J ,Pcg+B @z35Ko/1r^E"PbǐF u? b;ds]ׇ%A<ڲ~#14oMkbKV!bW'订 Rd[S Cއ|j(k{k? _K026(m+TQt*=Jj#96 N'0:0\]\dXONeg:x/&fpWo` =G=)Fo-IYuz@0v5!Yr&S;Axw Dxpވi3|45jZTy̎UMHp슝}6|+dUV}cSB-7Ʒk$vQț%'ckdX`o~u?u{>ELixs oAy>1*c̷ÒOr8QϸP#[Z/7?gMVX;g:O[KycLݽdNԺWB2-D Z 4nPGq!ԱvD2ƺz⢃W _I=;mfjX"#/d4tv8y bTj+7Oi\PP4-Mg)_OYjf'n6Nis5Sq!Ol8hZJ[Vm&\) ǐ'{| E:.S?l_sniVk"dY㭊;R)JJ:1ِJJG'ׁ}~="WC/QZWhVut2 p}{#u2 nb`͗ nF{g 573U;kbkBOiď7Ѝ W*)o&w6ń缢v:h4|h/Y|H<>+ܡ9" A8# B;u,@|TEu vy}[o4 %ܓNvT|o CMz(i~HOiS64w#wQ8o+dKB>[M[tgr%k'-b WĊ>] |3=KgaAK{y_҈5u&?u,Yk \`Y+-Q$1ݔN虩`B'(;Yy!,*[R,x'a8f5ʦD\/AZ,W3%*$ϸbMS"HJqygS.SY/s妀9bަ3ꑙQdln0uYZo߳uh~=U^iuQq xr@Nζrzcnj)OMsyu>0vWRIH㙷u^,]zf#B `k+26U.;'-C`G}*bAϔx:[}Hm?&;njp@ WOA:y@ŵOCZS4Bs'e.f#٬8o9`3t<%PY8qcmz]%;׫17'FO!kypZHU:N$2!4F$ J"92;+qW$smѷWl"bea!k-CQemtJ*~&xM# qPםTHI-[G!kz_N+%sːTMŝ^_(QO N;trBҭ0tr;rT2|>!(SKʈdVfgGt)"QM%<)?kٷAZEVIc&:͗KUrŽd GhfzBfؔԘ Q@p÷Ky˧ct\$Ii iEDzml7aCodT^QZcZ#Z '?%|[=n|0̰Wͦ[&+x19~i6qS(ңf+rޘMIT_t x7l*x9uo`DOy~ՕE[S!iD}*V 4C\N;Hf[Yntl!5lmVe՗L;3g>݀~z-#ٟy5JZ pE` 1Pۚ^I vAx0 yZ/ 'jOwT>+g7;iQQ CnB;{O[RbEm,m+R+AIڒW/Bh܍LcARqWC>*!'nLǣE3RR{$WnVFVF3쟭/f \vl)ϰciWcoº<+ުM΋^ʚefF(.){M)rEyCV?;9dmH 1w11+ }gD8.3'7c FvC^Yvh*EA2-֣#rojsh~KLV7#[L>Þ{-Hk#l, r? ]RX];y*Pn#H˰g#)9M7zbqegwˋʛUprs7<\u`=ߗJ8:b/@(vSc4o ,nsWd AHkFi#"GG![Ԛ3M6:w xrf E#(E>ZWg!'_"Ah4ɲ0lR!^Z#anFw_,hS~!f*@[vZJv{!k- >U|& l7D2edY d@洑>0g*.ڏ9|I QT\FW:&B~K:o`"3Qߞ)_Fc!raDl l?fOxlT\n| hBafETg!'NP];z͂|Ҝ-- 1Hw9vvL4R%*pnf./6!i6EFi(.tA T`"W؅JbANZ`2RW @X_YV)|m tx'@ٔIoz,L92) lpDRf33T 6UpdsYX+"Q|x>M6 Zjʳ/*i 4Fo L,En܈EWFfUzޒ%( ټ(ĸa;ZWsS&Qߡn@Nߢʟ>ln?#TVL$dɆzdeuʺDT)q|_F Ճbt C}sIhO '7Hgwm-dZ|Q|"<V{eKrE_$B bb.ܵh3~06T5+ʀƯWUJ0"vH&9S+̪5* )DwS-?#&Wʡ.^1:vث&~CTi6 o ,S7Za˫Ŕ:.uT|7I\XaC-@RgQ}p7WYܥ :\fӕ"ʍ"tOa7 5C39|6V q|{m8*\HOBEj0;oۗHzE> 2ƌ\6ntNv]gq>G7)* 1k-ݪ6ä}#6b9eW;v@07i Lo+D40 n݉Ťs, -_ڮzbw89MHrwAe̊vP5?xm6TnZ;u|Ș:NoԼIwqaXyH zǁ={v`/Zq^݊t~Me ';xQնJ"_;[ubi1< d9zzeIͶ"xʹ4ߧdBx0մ|/e?=0[Q=Ĥxֽӛ=lCkMn։w.o@Z UZӎAK!{Y&w i= B{AeWȉpV.˴8[HnMZ@gKu=2bsx9մZS+)S^f-ǘrW^ݴYO fE$g!'75TӜ> Cn7fN`Nl.kQ;x _$YkT^S6! EA^xeEճM3|9}6L 92bBE9ol2s~ewn.sz x ~By=FPoך*%x4I| !½FѩG- b2L%9dY{/*du/ 2 :E{ן-"< kCA֚TkC="EǁIIc]hX_zșKr_~9atp~ VMinefDg'Z5Ԕ "moD'S Bh1 _Aل`V*- B+#*&*h " En9 m=?enzA~l --(+g Dܗo+%;:L/pm*,p^rt0"dFt^c O5cƀ ϟ5&N%3oduҀcUuJ;!wSI>=w')$8D,&ld}%H#KkD`/^c]EywayA됵ހ?fP&6dsy+w{<U Od=KT>~O)*{u_&ьWh٥w'D j/fxr6~tʫ-%)*_&.Sw5=os*m*~:ĝ4܄=*DU7`'d-RM7-ݐw.qaQ,Vt6[=g{C,CƁ7 kW=7 9vS{Jut)}cәD&KGq4CWhV*_! g{(W뤢zwEJ`!4:[^Wj__zTn7)50uMqoL3!nTBoBS@nnDC`OmnA{"[o3tAnM2*r5nәZyHu3lx6f| cc;^>1񲭔GOT0H>\1 A-%dx#;zC^QԵwC7hWo >ͦ7!i)33;<; w[HNZ-bxT\'Af;I' 18< vC9<ܜ9`bڝx9:(prӽzLMeκ bQy^.v sXj[ } *-F+4g<21V.҉_ey1[Ҽ3lSP뙂APxO%ۛ!86ra7nN!"ߘ 8y vW(G pv<m qqߎ>!܀ AMS: >=SqݐwԒcSUì:``7 0 c||c1HB4;`Zy!q C7:%8 ^{cJ,{mqja 9NGɗh"3ZMDw`lrxNM㝊mnx"hx;16qSq@s}vaUgWWd;WD_ނȆL"bvxrΎQqW ?;_ >MbAS  )o)}*C!>U܄7%v!ߔeh2S0"Jf,|x}3*-E6=ܡoɃ+4߃Мx'z%KXn˅孨2 -fȚF8FW}̹‡Q8V?d[(u})"|jeza{uSE#~5Z>P;ŧ < /l?^܇mAy."Fǁ? %D3sQeWQ8yjAbWXR]wxq@Me]tSտE1_m+BtF!7659g'MU~ؼ ݴUuGnN帞MvC>Cm|"vN&Q9 <Y+>-LtcǚAi8d-v%[.΄&B3vyJ=4e_ lniϞ%  OA6yfE$-ܵ=)ap̗"9KGu8sqMX6Rq _6vD]=:e]oaWE*Dv-S }6Bdv@nB@Dp/佱R:zM88%/U]@U"g "t_>"ߊH W3*n;dy$En-9N_%Oװk1 ~izRR- W7 km  kTW4_Rg!7V#ԔQˉ ܠQT|Koƥ y!D|bʱc>8Wٰ$ 34xӅvCSyJ?|Gyh^|56̇kl^(׺`حSdϡLiz)*΃1De8 yt*x}w& .U"N3;[0|t_@U݌  < uTN1X,.[N`0\*^ ߉":8"{xrݻX$+^KaCwbtxwNTOA֎>SS?ʨ`C@{t3 \D'!O_\(!l]7DZIdHDx 3sx rRq$devEC^riNA#;UAJn1;nZgͶL,kQ<Y+Ͷ)kZ I|⹿< *xޭou+㳔FcC7gڴ  K^?x+jшUWc9"w{=-/.3EZv㐵4hd *i5T ` ٕ+t p? [Vɯd"쀬a1T\+rg>9,o\Ήݶ6nT{b*oAi~˘4,0Q< ٤nԎpo"fr;&ܑ-!£ߑ%Qގ"ǀ3oG0ʯ$MQNZ:p[ ̈́Ϳ]yQbd[Ti*ܷs!O˫יl5gWD>Z)l_omJ; S$; A^K^3H"@i^@s^Z:]rx PUPt사V#ӐOoPvCZf^tY ]5!C/݄*&d3m|lA|b8*A{B9ߕ]/6d%^;S,Ju~`[94T ǿR<kV?lBVP;Wi{  YkՃ&زgJ'\ykAvOeK79G oD4D. &A'vMNRldtx s#^79LC6WFBi:Fzj6ûZceӐ ܩSIv@c#QU"YUh5Z; Y`E7q47xv]`ПϬKϠX$>TՊNCV<صΕjl.ro0.58*^2vd Fk E%$.&&H% LD2p F8E@Ś uwA޵:Bŵ; wV||jtA6wY  7w'vtɳ}.d뾲Ho@sLW͌iә+T&䰥ځG!7R, < ɋxu 5Y!.Logtn"59;2A@9z/;sX*ArN-8EDV;6}8@=̞Ez /"⇣C_B@:o;E #Guv8\^|92 9Dߪ Ykn;l?9)eW&hfwDyo >y8.Q*%d}E1AN,{šO..JGk; E?D!&:qcE'7UJ4wAZUo5 B=b|޳X̸B_].]+W*坬 8V䩝ިFtϔr*m>D T6Uu߂Vl]X7'1MǰiA}ŗ6H+y!wa4VavѶӼ9k ER?}cӿjqV;5駘U*y308D,E6Z'9[M[<ɫV0a GlZ?F%hOZ*hEi-Pl% jA8 9 Iݰի(} fdgy'Z 'bWc/nIZnx-=ɗ42)7-y]i('ۄMX +<ۀ܄u`RםK,Tޑ _*,x\ T< 9,n#La%Y̑UΎh G_{/oI`zl§/ Lg,<6+}d8|Vv)251𦪫CڀG܄Q\ $ң'(I$!)WjI$ _;𢔛p UI5T-FƁJ  WVG+3b<"&ŵJ@ i!/Yqv"ǯmy'dTޗ-1$oHJ|!NBMT' "BGqq6(6 MCBnRU?qgoCh.ڿNR^I})PdxW\=ˎG4lg3M<۠AIhޒjJA8,eӀjDuGy)d N{R6vռRgΚZ#]eB2DIĹo,r3"T9 Df}W<{ll-By#Ri)8z7 u]+5@ )LBO>3^)7"QI`F-ڢ񶖠^=Õ÷fό'w@gץldKZuPS776l1|~EUQнD 4(SPCH _vJ,Eb0Ǎ;O܏/ Ŭ=#en^s-2Q9؄{1Q9sfzEDHg3A B`)ZP ר)mJyhӱNjEtl"F)RM" 2n1GKFKiݮi^ec|6ТxFM( [;F&<Swb93j| cMKEV֍ ')]Q[>AlMMxS씲7)"exN:%aok5-):P?ţ(x]?V] XKU1$5Q0J/ahuK/v~d*K$~=per4~MQ$h$cXn3 ;ӣ52]ۃDيԅ2Hgh)%.ck:W>A)>P[9[đdN9 <.eBCҪq5vKYo Y)쓳,kGCk*lѕp&)})p96E jԛc鏱<:Du [#|Ez+y𨔛q<&ewFR<-܍44!.ҡ٩]F贍2j}΢>wQ4#'Vp2D,Y6_hW˼)wQT `NfBN!2ȭM=#Y ݫD`Ӛ9 wfjoOeK.sUxcqʳ51NKkl|D=\0p4=M+1|a9( 5(/M=ĘK`;6"Ľ'T\ p5F^QE 9r3VT!Y)XQƮL簉ORhW")=)yϤ#)XŲGD=x3a%ͽgr/NzA066RHV&D$V(;axuBS uB4N/ӟD#Wͷ. qnPVeЇ:T *K#٢@" 3 mvﲥ :wP;H@HqE.1~GtUrHP]4]΅R螺^NΪӅAvjQ%B'BjGQͰ;Eė} զr[^o2NCF. [>fQo݂euPWҸ7H5ͻa{g!4Et ZsdVhq}IgyӛFP}$$#Wys?Jeyo9|0#x/[4ޘP(3jU8#7sgY;4 LqsZ T.S!\Jw\j`d}%d{yPj=P_űA)T6=) >rG/1'5 9'W<pǟ$6g'fEzcPXWmEGAꡡZ =\v"< .e۔G8:kȨ}Uε`GM4p/k%w;J6W7lzem kS%j61~y tɨ://A=;@:GzҸ [=jJcwU~@3;o.٧ODXܺ+L"Ȥ܌LT))Ȕ}4ͪQ{{VUXxY&NUЫСWcksMK\\H*1j~λW*c˘XSLkW(M9oMpa|VD{pZbyS(~:FxW1<)fƣ:Ln$`'rUI+LI)ivH;R6bh56a4atIo2lJf?,-È2wQl>hD+ $eWVZ:*xY*{i.SaT/e3P$ ~byΞwN/RP8:Ynblٛuq)7 |UzA`jE\l s$?:7y$43rZ}jqS 3_gXI5KQֽ|Du`sRnFC*40-e/MQ+X+rrGX/(1+K"Ѵ8ÕksId6#HO%k0c] &vp4h7j4Ħ'VivJY/?AŵwK0f!)8Fe&O?F\É=Fŝ$L=_N%R|Qޕb %[$RUK&,>`Pq@uR꣙(ONeAWNSRֻ+'=R4l5m=wڈ9` uگ/KRnFL^fLD /!,zD^)+r [ʚW iH/0#e=WM>)koOe@LKq*lzOB Ca< jr3m* Lۯ1mQ(FM)"tx^zO'3KݔKYo2Z/TN&>R6Y1!ϦJ.ksGCd+'֘[' b zP)}@hz4MԞ04G$Ux񠊞PS~*xXʚ;j:Al-18<.e+ .iy)7c;LK&  qū-*]/pZLefrmeYa^ҧc<-!:%)jX7`+Jzz'ۥdgu=)igMa;ک}U .} yO$_a9g~s߼ThI鏭 }:"3*e:*nxM@25UcED&l`HbKM# J#{WStHnV8Xa`JTS>Ç6槂0Z^CQ#CK eLNLv; 2a^sV=#^{R6`FnI Zc 8!zd5W}fޣ_ȣ>vT޶t}C mf%ϝleg>zAOoyRag眬r0`>< a"ߜaeM{q1Rʾ3kD20ѿW@P't}^xx JU>e#셲S6j2 (eV5*.^(nUL O:g%޻S*3'eƗ o]h((؆M O}K'4.Xނ>=6Cࠔ [S!)k.=(Y/(+1»c&>44Ai}&}:>YAU: jpOd.H7>AR6pc84\ޑmwKl1֡3Qi2zk)e5-*E+[0<+βnlec5EwJl0OTpTk~| 9(PKBxR*P=E_qhl`Ѵ/trRC ?1[e˛tA"܂bGWSi'𐔛kG0X/m_9iY^٨Ӣ\gL><#R6˸睬C/ӇxN/:+}BlqlBoWzD;Nf>gxOt cp>67"U] 4Ϊx&Ls>IW c/>cto}k'ED;DK^}F3}v} x;)M 4nS聘0|hyu*BI #%vHd[.O,eCf7xR>D5`ȶ3R6`c㲗oPj+ñÀb1fnP(6:ka!<:2tI ^ҐG=5=]/2OSxYW1e3g)q>~Ç=L駃駛fjM?L?(Su-LLZxʙg)~x}`%+kc==<"լ\E((vf / t6\ԵP1YTlր*3|0 //0;oD,-:!/%X`˅孤 =,/aʿ4Y٠6//6h =2=/HoNŗ!Q0<=2(ܮaVzKQ#BsG`ՇǗ]]` r*9L -RJ^:'ljHAp/MAޙH5XWEYѶs"̜ͬ zImFQV믠ZPG)\x7i.Bf(Ihnqtd9/Ȧ{,Zt]= ʲClR@"k% =uI}HvTGlRiƲ)ަQbl{e }e4(OwS%]N -5c,߶iM;LxADPR&5 K 0q~-xw\X(`Po:0%47qs$(SzP"4祏jդ"<*M/]^ɱwԍ7?ӤS"O\)UJSȍ:NŢ]NA^jFԇs'o|1yEF@VW'MLhޫہnjځk\Ƒ2) ]`ٶB'ū EHG]:Ax ո#0h2 ƄG|3n0V<%X0Ko6ؗքHvb,w[h,Chy*{~M6d 8;m`F)+A=ރ3ܕq(\$ONNvMFf/\mnvn\0'*fi5]zhY}o:=ll S`2Wl^XOyZ=$)y7k]?c1+wXV~I<.=Sj0`@=+)e(h?PxKN^}h}/*Dh.;^?!qr[L]ςƮKzmԃpl>>&"֩FTT zHqCHKe SFvȰDJdJk%K'q Yd<ͦg(76撴\<&q.T:*r=vE0jF'l.6g`EsLRfrq.pɱ"]?YtS>Pۃ&>䓀-Oh=<_Jᙳ> LmZEV??fTOykFWLWu s\rʆ# pR+ 87Q 'hԥ1lӨ!2`9Ŵ( Ixje+Dxuox5('AZ,%!K|h6 -Go|VXnXfޫtE!Aqm9^NZ`,̥WG+1Aus!4Ŋ8isʜvEZ(DCzytu<2|5@s+k0/bV/)ZlA Z\] ?3qNp&̀s&6狵*`Oh.q{/e{AcQ/؈@[Xd }КKꛦldg+O]Oԃp_95rg?h=h0JLt4K]^=s]+wFE _гLbQVZC1)ښ1"ݑ@sɴ<0䷿fݠL zwpBܨ9h3Jq/F;8Cxչ:.lc9>[+W6~o<IL9Ӝ'/Ti3a} @{J@UtĕOMlM\VϢߧМ=pTt</ԝ} Tc"v5.tU&zhS'1bX'xQG{*.qYnck+L.96GajXϧB1|u9_0޺nT;.*n嬖shsF@-H 0t;Ȧܕ {jmq٪S@͵"" 4GQ]`Cp׺%e ]L/g^J,Nwm[xLa2E<({L_Ĩ/aѠѠcdWWkW[9Jο@, c>P初{޼@ a~]\)ѻ6Ҍg۽֊fi)tYI( {ﶍHnɼ[n{fOsy}OßNTPRݣ\"(ܦ ^Z`%rPY5S!X}`ѱ<[~d-MW?};$&p/_MhH?fdan}6q7&X BWN[.҉D['cgt4hTܲp ΠJ3t(DM=^1r1oӈjӎ ˖W?Qvۚk%+N6"' 5})A/Nw^E}>wc'+5Nã_tNHk*6F45#uKjrqC5s[Ә¨8k Wz'oyqL'anTI 4{F/&,YqQG[zS} !q[ ̦X:,xNN͖rvif ΄N]My bv \ ͵V *AhnSƇwzU~BEO:_ѤJρ!.$vqW*d;9>_?قaQl[#W/gr*  4"ƚSus`Ohn6c\yt̃:[%>ڣN: ҄} *Q!keKSBs/ƴ(llZI#OgcsAs*o\g3q;ggy+Y un$<Ԋj v_ƉDZ^c7 yI~|X.iym ,ʃ|ZG߇j/vں2_(}_6a:O35ڨ/LШSk__dtP|GDV+[_ r^^}ħ2<;yt<{KVJ6;țHWNȿ)pi]\]#&Z|"ZYR_˗!# ψ3:ݢARЊ!^9++_qBs|k~9||K8S`kjj FF TF4V3hSWA\ĸ~c^_)NMBnQ|EbpUˋ*@ ^Ȍ^?e3ê4^N"?26/\Ȍ\U%U U2#A~b*6M~8J=bѿ03GxS_-<5~ i#5 _5ؒ`C/fx@&ׁי&ax~am8s}k _{(f V8Z^ʑ X: Fob\ \I[pK3路wL^esg|oc7)?_0c!?mĕ@C.6mbgfG̹nUR>7@{cS T/KԥejZ>~]8vI'u0H;A㛍vÅhD,nӜvIq -GޜUwJI'htdRb`bVɯpVsN-pQ4Wu<Я~[QBs[WgIYeywYh>mx6sOVo H=El}6^ԵNQPi'L*n)ꏣ=>=k2b|GBt:ڽFVn;thn\S/6g/NjMN}7]]C~7~Qʪ==GFgdN+m?Yu4ssCR^P%4>jiY@^IɳKt=n~٣ƪۨUTjJ\@~ B듷?6@ݣ}5ZZ]vX>M agmߧ|-xyWKI~ԁUuheʍ BhnjiX7jV6Q??dD@{HqU&O,mk~zokٯ.xym ia!>}P ## pEg|'XCSp';f̾ hh [yڏ4a-99NȰEgFE@X2!4w0*/4BKsERy$ )_Eix.6Q «Uc6[TmZb3׾1/0c\& )gh3XBjk( ld,E /{U2&vCYT|[̕|\7\'H|@f`[|x:ϛi T2 +eu#O\r7ܑo1D[^]́,{tXO=Fqa3l1Jx_r~g+Vo˿6bj(F-qѝl_?5F~rM@z^zlTձmR~ӯoެw5bŗY]W;[Ĕ7i+QVmy;۟p7:Vc[,"j2KD+qivcD ,>f3_ɰjqֶdSՃ? ƯhyK lcNA8?]iwQ:ī9RI)|) QU6S%h28 7"Ӣ?.STtCa;Ø9`w`6#߫^Dr?pHFw)^T\'pX+&"B>44;4: ,_f4! JtlxxPp 3%7 '"Onv.k}]5],(D5Tޣ8ra QBsi&LPwqrpM,'O߳Ow }7_'*迡FӨQ mc%[r`WPt=;J; ʑ?] ֛F/b۞Ocq%Z|R1Lw !+a?P>)4'WC4S'xF1ޥ2u-6ԇ.Y-֌PL.֗uX7ƮT#FZwSFWWxt,Ec#bl4Z^P78s8UY_ҍժ ^.3j[Zj$<ۗu>QK5.x'J\~=C  c6 =vsʗKtgZŬM51id[SGBTsOڋ֒zqkR&\E <ܢ|<3'Ңơ #z֌PZHlI =ͼFW!Y&bG 9Ş&iwI<{ u D]f~Vͻ_Z#|?ɚ~?5Ķޝ`y 0ev>mYF=?DZp2OP}[v F+~IU #h(zlvSa筢-ݐo Lxg^ܰEg%s(sJ I@Aƹa2k%,/Ep$јkfJ!)Hr{ⲵf3w3lZbVLb5 'ey^~*؄/N%Ϻottc1-ͯS|7v7v/lXʖ`xcJ\:*KzV]zbOe ܋~kpn"e%.6(vp4.y-F[k)6RiL `^)'zG)=k_{6Lgdh cҺ|l)cY,&㵚K3((Ǎv0YEjhHB;-EwҠvxJFW*B<<"eB=JJ&A%e˜Q/? <#eT=Vv?R"߶YHywxLV8|FY5i2}[uڂ 3EWp=V}Ո]k+5t '# rI` CR+c ;쑲%5+@2a\+QܱĨJJYMQW!5)6C%zR&[q&axKT>պY*@֘Pa rX '< eIŵJ~ xXzۺ=~: e qU=-r 3%.PG`*vsq+X"֋n1𜹲\bjl݆>$LMT7lmі0a/3lS?O%ۛp&86raQo !tVhI&S~]_,ޕFl؛N^Q$ӎ=͠ٮ+ފb!6l,}ъT-uc,^D=V{voek P 7V:ggX>^zn}^mi2(nX7f|#P /ߜ'. fGFeY>> ;5KTPt+mIݫ%}ݲH:<ʂ]g9݀9'_,rsHɯ63s~*XÞ)g[3?űͭkJ1;~WPxSbۃy6UJ3vե<0ME'kWzirn(q@|X+f͋*;zV o[-3f"/8E6VW؈# mJ\lT|*hШ D`'NJuKmlk~7wCNDCTVsp;dUN !&RA|6?hYaꖺw:SNE+lnXB >:d4=%Şي y_z& lm4gs gm-{ kTn,tDfu U"4[}҆l.yN1P< #&!lB P$Ccsf6Cb^twP3A>g'a/*>A|4ku!-_q_s1e/Lʝ{idzEf=N I`d$1|ڥ@Z@&+=ro4ukv{d.4mJhҬgOœ_LD8A3a/<\=)M>,e^lep)aaӧw@nMHgмe:@֊z}G3欰G@֋)F; 4ŜϏl>?:'jR`$xF{羘CBs}h ZQ)0!6fN@2p 'Y43 mv:knTAY zpCgc3YAhnn*bcȹ_]@Ob9Nv=v}إR%YF]J_ӹÐʪ=rT5*3g[C( r[ ]/5vA/>D|4Ωt2 Y@hۀC W&p qC(i < v=gn>^RuaƆY3#of`F _7r/w_lotU  բ_6@sG;z(%.]&jk@qKl#r3:4pq1 2룳F'J7!nΨ}x(D^!ߍ=k=4<[>RCk HϰՍl{PʌO@>aLW6?.=wJ;< d.JUeD>EQ+q껩*d[ofUk &iЎH_) S1<܆V<9*hta1 z"\-]=s֞5eX&>灗!_I^Zz ޟ⫞Pܩ xr I$nlF]GcwPؾHLTlh'bݚɨja;vbu ͖=.,] <kd-/6P'#OiB\m ſ4 PXg*>7˺Ml)\/ZQQ{*l lnEe/r Uc.uKbJھz|Ѵ kjEhaWL?fˋNvz):cu퀺X 1c%`9qFs:kx[**~*Ĥq7dLß /D?ynr^gHI?q~ |咴\T3' 9~lHYJ8=mI42l;<T^ң3 I`7nc5YtV!6[ ?ģ#z5,*66"Sħ4.B\-ȎGۀ;ٶUFgecKܡFţ<ȸC던0Wma89{`R@%sg ߜ\8_aw 4Z@>bG( a,:u-/W̙gL_;șgCF񺬡'"uRί{!ǿFKߨ+d=lnu*(5ך1 ;f[U5ކ^%UoFrwp9Rl;d_iA|MZ W+1 nmcao؈_Z='+<϶}uA?ޛtrnn9*QjyEnaxL&La4)ҹ qu==QM*^T:H YkV L.[+TĬx^̧[n#9j&4Ui[E@)r ۽l롈˰;|ڛ}';cʗ +H&fF5^De/p?dPzDw| v(?%?<Y@=#'Ia`d3ߞ W); "cG,A46dU@+]wBֺNmSwAֺVho.T4dk"&^Pħ4nB\/3o*QB؞{e*B}aڄ/+V=|*SKWG:Ud'>;0_TVUvzAt>aȇuf_o &Qa.n64TizAۚj3gtCDş >ͦ_G^sHBۀ`WF)̳_Š:N1/hDl63 1{P$u8'w^~tٱm$.']`Ӑƣ,:9tIiV^|ufcbA|sEODfӘA >VsUTEmۨl5-~NN!kMj#;< 9{K=;z'}Ւ+[yUE#)`DIv,=5 1c&RFVd !00:tF[v?0x w@~깿 xr8Qn,jtK-(妪"* k%P3[T rr/fWH;F pr ETE&ܱH*\{!lhCIHaBR=eUk6XAd%?̀( A>M='>Sؼ~tۈN]vy[Y h ^{i<ɤdմ{'vo1& 8r ,gs7;9NmȂ&4p3ƴhyU!;"z 3Qy8Q>Bv@rvǡAMO*a)!7 ‰͗nh"W-9Fɾ:UuR#Ϙn=Z\UQdj~h2(N򟊿A|{0vlq.=}jB ;q/=U8}ѩY}mZQZކhT~=NhT5T$; iO4P'#o/NTI"T|Ks y/:D|5&" =bI6jՖk{ ̼glUEځ{!]Eŵ1Yv~Nxe ^ZN{!k{09MGFNiFln7Q+Wvx!ݜ֊0VeN*ʸ扩e7O[e*LU'2Z+|5էZ;r<O˓CÐ7?@ KU3Q0ꤣD CiJ.Ff p rVqVKƁW!_5%%. >k[ hZqx'aB 'fG3 ϴ ֈI;p&l7Sqo7c FySnmeO %޻Su WKMZOUL)iZE\Zհ<< ?6Sհyyomѣl-{떺تS,$LGe+MŷDMbBn͘akۄ!7* xrGp-zJUytN<Wz!^4y(]ހj[f"W _e_ބNR>oE} [A"]t"ՕUS9;8Vz~G%5eT=Wp+S(.$C7117 ͗ !Ռm} 'p?d[Ƶ2RVbo if*D|oAo o?ؗCrWQUG+asV|甪[PĆ.[Mƥ&d.ͤEmU)9 2c'BjƋ|"vCb- [&Sfd&Ʀ9X͊2rә/KdR) +9d+lɱTm(0dӗWBON:=qૐ_5jOFW!4N[ 19SY%HVvp~9H@攬SkA!<1 l#'kq: LC6w QiI`/vT]rtNC2DUdIzf xu # -$a2哌<}ڪC^+APVŲq>T}ؾqsv5teOȇZ7ŗ9zopV}:ث֛Kpd-'_Ri7vОF;t@;exCNA>*(wp V@٭hf:^1򛮗&jVP 1k8r1Ǭ@!w@䝄,(0P^q3%ϥrZr+<:IY۷-/ب& b`TveZIfjg{ $b,l*7xK*20VAL* d%FLvL3,N?l^Aֺ@S wη%;7 .9MRqǁ!v rnx8E&z?pkg؃1VQ!lIllJ%LCnBvU*. 4w p˹@ s<ڎ2heS!(% јqY)zVz+SZLݵh/hF]h.2dgyҐQ BsS:Yพ,9^޳LA.up`SwzzGywLTZr#r|j8 N~emhd;/䳳g\moh,V<bnbV٧-4EŸx'Vb5V*. u#溍ʟ^zyt!" Y+p@\|O8,lSW-x^9(rM CjY_;~BW~!5YCZ}-њڠ: 㻷'*ҬoJz#<YkXCZ$kl2oIscoD!1SOfoqfKѽ?XyxOP69v 'o#].P3'L^2 9d=v&7B)ڔOcUA$8@ K)qܶAmJhШr~EhfȜ/dM#^jD!iNK MTnBsR:6͜b6_].'ټ7_lBX&\@dž\oAǿ5!|A{{Ptfz|w(7V/0&;)r}6@xVn=ι+0T_o >Z1vo}!iF;zߏZ8$d***Nf3bό6V@/e}r:T+JK_?ΞSwj !"<v>px^U.<4O/CֺGX$< Ş^MОfCRC=jƫ)S`Xae;1vCY8_ri>+se'gsO{OrJvq{3CF.MN ^*n' ꚾӡ#JNM>9a}Zc4ۗ^gb-q/lxuj-t/نRl]ŨEwğ|n1rK}얃uo|ب֪\]_m/Xn¬w4pd0-v6TK߫C~5ߗw>Q5n;vޯw]0}c7v^κŢG_i% 8]4;wP-4Ȱ2n&͖";˖引f7gS\\{rEcM;x+#Fga/M؛|5V,XOmfK\.VF3y|[)R2Mhe W^1z۳ vH#%? [ Ҏ?Wn-8Y6Y퀷o7Svg N) ;T\+rwږfՆHB{J]m~ cfw`PpCÃC 4ߚCo|Jgjmjl&#:zvkxj|GzR41h="=)-6Ie_Kj4ALg}L7^ׯ yWK{Ovǻ;65dkcӆ kaCcŚ LUܙeV5V"Y544ba4{IGImPO݊䠾X"Z^CU.?Sb6c+ƫ%yvS{~lv-b SOKIMŘO_FuZ;8dC ,oh. <DړfS=i6<4;<|AYqI` PTlٝ0ݓcޟnP5?~'|um2ڬGUoqW뚯Y&G\9e&QY5)uo4A{K.|Wn\_5޼zE=l;_fwEZODcK٣D7@{`E+~ ގ;b/[qiV܊ av!J-GVť2F 5ˡ6hg{!5hpd_bh>b;f!6 n`lkhB:GșZ_$CTt>ucS`ofe2e"esWW[-gD'"'dn]N@X 'cw=? 5"ſm[ym0\"3["3XQ U">1[#atrrf|Z 96='"[a3SeK T›oƮƦef "HT@]hPzנ%[ 6;]!}*^|r*nyt?Lly["m+3/ [G:ggjxk?uW۞GYk } +]nمRlP(=|})t߬j0XG)Vs [Dt+-;J]gp"Vg9Wc眀~F:~)WDS ;:ȟmyλxT/qo]mTįٹ?CT(േwޟ B }u)z<-Uin(qA+ uyo U#zf.s=lY-9E6|Yume LlʭGE uwuіv.Ȼt5yW3 J.;#.Dft?澨6Aћ!n~P{"N*I#N _RIwBiWݷ9.j hJD@GGdؒ9"Uz%nG S!9O;"5G6T?5 ;5,YR ivKJ'딬bK<;kRʹӞ4Im8>ZT]wupРV=bSħ难ڽs]5=/F5@cz~V=G‘eѹ4REga?\5mЁ@ '| [TY@"D5:dCOb0g{,5fi6Djv_kD5$sk7t펬Q&ikۘ^|b#Q 띄|KųtvnW+qU % y1@BpP`G ?ZLTcȯC~:OſA|U[lV :,AOrBe"g69f !2N8!_wC {!SeN&4]@.x7p#+JrjOԜʎ=ےo|I WUa" kUxԖ4Wa*L1T9z\0vh^IjP[tOR=On) u~eco&Eg#OV6ERp*S~MMyi6KV7;ŀ~ZOkŮ[=F>kq^fS'P+gmJRuLg8'bW.Mgcgm7o.7DD~򬜳PȰs5TTsu f}vp\)2:X&#cCmˁ FF/]odJBu<jMMBlGXaykduU|Ռ'1KDc#y1rKmLl4Zw^vlT5|XL7w{]j=` YmmYmuU|r7UOTmk(n4]0}c#UD+q1z[Z/8#A0(D0^|clHhA|bjee6GԄs4fϗ Z:Ga+1(D# ">1[~U_a /:ƺ_bgAӳ\L9vKxu7ANЉ^ybT\ٝwywYxFwš_kRITγzP٭| ߘӖtLFmV΄-u'BiTJ<{t E2Hh5'+ˇ1<  ^x2ǬD&۴EYY˺зӐ,^TA;O-'OIWnl\2TMIJQ 3t-9{Zr\7wĎ=E,Eo[(Ya7gbd-/f{ ݔB=>Xlϕ9e nw7Ps%jmzP&养xY#5YJRNQn1_<7kt%@hn.ϰIk+bW|ri9'+\` ]BdwS>QFs[ܹ iKBt p~av|TIjN|?a+a-&]GXɉ[bUQ/jAhOⓈoM6v-:s _ hFq[QU)SB 5ز^a˪Ir| iSDC%Mw0;5(Tն$da7CG~yaV4ZGIS:9kA>gKyy됯ǮHO.xU] "ad4l+N>}簟[WQiC ]mR-\װza8!יvz婽zq '#gW+TFP턎B7ө-Uddm!m`IderkLB]-ȇڎ\՟tR=+U~Vpٹ꿷?#;Qy afex/tests/0000755000176200001440000000000014076067114012345 5ustar liggesusersafex/tests/testthat/0000755000176200001440000000000014076173262014207 5ustar liggesusersafex/tests/testthat/mixed_with_dot.rda0000644000176200001440000147151013664111747017721 0ustar liggesusers}پvW|. EJ+Fw:[A'% 4H}BG D RH! =Wﻣ]Iw>f;;yl jP($E e'¡)G*7}+fX̎^r))2'r ̬Gn6+[Qw/uv._9\Ee拕jy/t^f',ןf/wols.۟/nrq\|u?Wl_X1kjRtϭ\/*Cb%8N?.>7(焟ҳ(^9_=/; ep#K¹Cre|kSs$\%YDWbAB,x{U ,vyn޴|_`Ֆl1j\eR8<+&|۔+ٖGSJ7d0+@%We1Ty~\~jv[*!`Uֳb*]5LAպ.h @(&],ʹb_.wīd<[ŭ \MbD9eTr|hwJp wT ΡJ.^0CeBX:Aـxs}HAmB!1mK8DT|qm`x7sb</,l?-#>7׵k~|k> 7ijCCGuu GBDUspnΏoT9[,@*+%H̹|bŵ*l5^:kƻMU5 ylaD*d|tVԖ*,v9Jv3TL&)"r:9lRz\VYB&rG$zBrqTܦ\1WV-JfdҗBپ!gfPXN X+7 J*ep{yc#=v'A 7ʠRU䦂F%xyE)^nyKP~YHۜ-nIcOXWz|.Z Hpf;.vF]1d'{#5Vp(V;1Uk~6WT0E QIG4-I\nKHÅ SEd|Ov;ś"\|͇+U\&('IjO'ǽ#MREg>g iW^y|lcf\4Y X}9f~{dՔ!-{5'^АkLJ+0 !`n(W"うMݽsԹaz-WaV6B7Rpl_O$/0rDևʹl5;S)1&󡪟T˙kT* !4:v:Xgoe&>n%gu9(B՚~+}Sjx|M)NzpWetf`o_h>D5J}¿[k{@G[+I43^>lyVc#k?VYX,^x=MsoѺ7f{'YJ >a%7/MJ1dU+Xfd+]p%_.s=cU,iZDBknYݜe?YF{ -.w}-Cry[#S&%=y-0 Wr*ڝMf_<]tIXġ&SҖF1"1:gh}29WPYvo&4yK߼p[MN\3 u_4L*^SUZYQܚX FZ=[~P޸ƙF5ԤwOsǴoOiMAQKm hoAƳ2u\WO!_e.*{7d Z!EM6 zu>|+˗4 Q.]'OuF^BVINrCCso)6\HFD2I+}R+z;2.}MewȗE](Άf_uj%򚑐U2o m]օخ4VrճGX&.z'o@4QdEP9`ϲP!wg{%nd}O [jžurGӒO)С[ |04XA+W2P1; EWψH9, Fj4mT2B>AOiL(:0,ԧagK xTw5T'\\ք6?퀓{=>hjy2rB6ʸí*#-O$ ֍$mLBa{՗ۆH5/FF=m@tQ՗|$~eUv#ko\K\1)P#~-鬏'}$K_ ^dK>LLDWS] #SWhwro6VF} 7;s7!qNRR\ޖ>Ò6ȕ4QF;LZuyH+r5ns7mfE)B:Sw>=[*5cwc cZQ"!>z:ۉ;2$߬h g|3AO ߟϵ$@JP!ohg܍;yVK~(˒Q@ƙH뎾:;.͞K0oWح ؋uj?>w5qORB7B8NlV[7lG}6l od;+|:X!#%,+~XjTZ7t&Cڍi9Q,&oOi!>`vk5b9Y$O+oFZ .mf!|kkt$G*h%?8TT@!Oж޹Ζ)䭭;̰hg:%Vl投Q~|Pl<6܍#@6mZp[ϵVᶬQp>;qni)4fnt 8!פox ~bBB-hL5.뻢F r}RZnu I3ӺFKZxgj͸n\hS1*Ln '^f! Y(aK%t?H6I.S N N= "d!C jֈ*Q:}xd ʕhYsl:#s9RB]&ߕr.YjK3q8_\|.+;9klL V1 JtaضA7U G8Z>N382 dyQg|}b.ܙg^1:.5;֫UR]}D.A|͢ߔVX'T;z5"V`6؃(9|Yza9T^͙sbkwR?&79'<> ڰљĦD% 何4 Μ2> |7q~+\5Ǹ/khH{GcBStύfu![K!}m@ bܕ}>$bkl9+?e/Ze 9nA/iL4GGA`MN{~grgCT}xCޖidɸ{ %FYC/i6Jyoo Xhh VX^bn?ȅmͤ~ʋ 1G#>I Wrݭ^8yz4TSۧ-ǫ}N/yAQZf3Ė=eTX)~O JWФp`A|R=- fiЮd,pTQMlQ۹&=eW:Y]\_ؗ/XMN7:Cr5{BNxx|Ҷ|* ηhV\_ͨw{ 9Ol@ ]2[u 5WlMŽ|HɊ_ZbɁu}eb}*RBpٻe"4GNC)N_+pVix}f/{.Ԋmgr4Y)?|A$վPMk(s#\ENS&%D[gy'|N[N_xOoA $_ B?a;m'՛5|kzU]wj{g}0s {AWβicѠV7Rm)X(4->t?}n` r8MَMݜ)+hu4yّ66N=e96oKg&Efߋ} GPj8\uBJVɤwKqOJ2ͻ}$yˇ1a9}lW7e^;\.shy9e8o~zx.(j>]i {e*I֘Kl@_;L@yP!~ ?пȹs8hͷ޿i I 6zT*z."R$8)s7hY4%1?ꃀX<Ë8Uǘ"~smCݦ`E;1.{'JZ e+UgJWZ92z{BW*C4ti&zt>PS*-e %͞e=)Cw&T}r;eeʻ=Q+kŃNqkzC:Δ*?i z /L?!Ґ(yu(5kH"ߌn2 rV*v-g#v9Yfh_aݽn?wD5fL>1 X2纵Q!cUrlvk`[9 &|zhɽIH2soau$hMLɜ 2.&3)g1 {xdT.d'd !B>Ǜ&tOOZAf i"iEd۟rdP(P ԡ7&qA'W !Sѓ[Bib"dĄd{LVV'0P!-BZ&@Z(Ǥ+<QRKI""DdDe~#&r㴵=\ShJii@pL =Mh<x\$PfdJt [UgҊ@!)/5E;'Sg/6Ƽ->H$Z5~/E B%ѧ0oUiXxL 6)= Oۼ5i|Ag9d%.[Xɶ{)t)˭lcu#<ӒVE:vo484lW1\3% ̋pkc6olwLbaGz`*>rTe^gsr_^m\ѐWw ԛm}fěQrJnu=:A٣HטRuL{:>RWͺB~]M}[bC*kX}dX8t%ӟ15scۘqcΞ0 ]b+3喘Sg.*iI׮?y~wJ#&{Ԍ`cyn ;<{|jE&@݃&0A{z 0&: &-Wj$"8/|u?WUBCA-E`1e F1M.8o48-i-ZG&AtUmr@ŪL>v㱪BpL=EB|G S}g7N+&x*EȋcҗFIJ.[<ɅM!* *1 {4J'1I!+1P-.rɾM嗯xI3v)bs,_䨯dN+/˾\~ٷt f_* g_G #݄&p a= gjl=J3*: $is%?C*͞ҕhNDeߍh6uR9T_L[6gRt 7Ӗ.$(B_Um2ԶM~ة2/׋/8#Q:h|[8%XF T I{ 虹gJUmmKWhл>&P<"kdlj{ wϱLBgN"ۙ,ɟQCÛbQi=_/wWa&xK[hImW8j@QIOGm?='&rxbvs!)6ʟ?مI!$!$ ~c =EH<"2xpU&x*DȉcҔF) .hIwE-*z"pO\h+ދ)^{b]-ecb *D/낊M/тE8˳ʈLK7oL"BG<;#^+D8ID)ӽ(vm͖+,QŮl^ہsxƤb~$9Kp[T?)6$-nnzi{2->M#qvrqgcqDCrغL=q+Vf ]6Dڷ%XYIM'GQ}#:C>c|?)v9/m!BまM,) YjN>M$%rz iOrD/_ HzH<J)|#^)GU pi'粀@))Z}^ο|fi8Kۤ5-2\o9{ ꘸-r:\.YR+\:gϗs[e` G̷؆^ǂ К9GÎ=&N9@ :4GS m)b*gv,T9_]b w)Z͖7媻IU3xyk8bS iiWrd>bc2 `Cm um 2F^-ֶ͵P NINz qV;0K;F8('y@|HZ &{/S1.ݷ@5gq6;\:*.cDfɥꕭ}*YEY/ri`*äh\V΋NTݑmo}h ՛ډ#WYm )ʗ^rXhycl=/(tJ]z5h +q}IoklKܑ.g {h͌шcxyԌokFEΡs8kw@Xbo[Bι<`)wh:{T>uC]_ݶ|Eg4x{CNeocoKcQ-,79[f_LDP*uBhAjx Y%+ܷ2Ir.gpUc[&je­xyJW47"NWqOy7؉Yv&zpAZ<&U>K ડ! M=~KGf|n=퍅{M{Rl .W`48k$ޠ5Oq7'ۜ;ǸB d~rZ 8qoEIxw?] iP"d6ly 眕%ҠSh&k<9ݨ׶rijv}\׶aš`=hi`bqy)gf⦕žQcąg[d}|HZE D;Iҵ`1+X hKmp^eQ4{vŻY\G#s;M?UnG=~-ϛݫ5/<;>3o\໎}1{/\7k)x1G|]h6:wwGkgs:W>'Of;?\wMWOj×qu))3O=ⴹu^`\e;+NNsoZ6o޿^w͗z~ϗg>;`~sSf̏Ko4>9e|\;N3#>tfwx?$sݜ\k7uGa}󨕗[΍"='5{q{O/zckoٳ_Uk~ᓧ~g9Suf\_k?4Ksn?hwǝ[9ysݭO>EsٳJ~锒m/vէA^>d^so4{;m̋z.]ԻwQEz.]ԻwQEz.]ԻwQEz.]ԻwQEz[:9I*[xԡPkbDFR*kTK2HjZ]Ǧ\lhq]7)ABu<puo&LsKp-gp5"atr9̎tL/| _/| _/| _/| _/|CLGfO/o~oAlZkV|W2>ұv>IC<}{=Z?q3vuG,g;k}qėӀtha?\8->vm7]yn9x?{V:މbKߜ[!?<5sh i{$} Loxԁ߬eY΅g>wd^~ҹڅ!Azŧqn0]oV|y~/~Npn? yg&Яs­y ]}K78>+ޚq‰ '|ᵦ7ߟw;qɥyz㌅[vu||Y])pت}oWp|{A/X;w=ϝq|mwzϳv Ƈ=\8>q'K÷7og^#D/!/\~x[ߐɎvspl뤃c%y:]qMn}:YzB!쾌sgAˋ?h=m5+oگ1]c=kz|:mwonybfz8Y\d>7k;wr|v;MOC}6_e:ѳˇٟ;h|?쾠x[y'VӵNz;+oПwX8^'XY|gYͷ]>B|:zc ؟o^wP+NabxX͹6r֤ܜܜ+ڵ`qDxKᲂwyrc.VMǵCmܗb cCmXPOB"׉JuQcJgݿ2+~v|M L4-s޵α!ǽ\5~GD}_O$/bu0r"v;e"Q)g޹\|~gQ뮣2szi~Tz͏̹`C3gҾI{LG^`.Ygͥ3~L(ׯ֙ߙ}gr#z?Z3Y8/l?{zsW)j?;gϷ}m.zx*\Zus3)|c/sѺOi&{W:S{\|t빵gk<q獵Nϱ뽶DOzΰ?3_s>3_[uz9->Gjgkgkgkgk櫗j'}k^CjێW̤] 7^v5ykgkgkgk'Ug^[w`)'ܷӔ?kfM}{- 䏻5 5yc/ṋ)g_Z+k[|5?Yf[={ A6Sߝz7 Wߏ}Gvp}a]~"EO׌M/a|7yM}-xӛ vO_pßoaיִ.ұɅ7赭Zm}7O>{?g.yݑY7=mvҷ/:sԷ-?zCc ;5U-;?]^}_ey=mRswwqSY;kMO8Gjǝ}CTySks[#Jvs* }7-}}p|U] joc~?Oh]o:|?kS|>=õi}O8}Oq|W-a 6߻zgsڙvnοw|g}͝ۿrLf8o8|cv}?WI6ߙ{mOpl{m׽r֏Yv3ZW^'wmGc֖\V~/Y\9굷^COm?Wg->~UnN'zyWtPC'pyKO8ސr{]/^0s꽶۾׎=?ͳzM֯ {E. y}wpO_?{;kqqg- }7Ot}w{;kߏp}1W|W?u;WGLM{{<{נ󵥭A|oo믫z# y7~-qݯ3*tX_tlt}=k'zg㸆}={m}7N=w_u}3~w{/2ͮo5y&nwm?8ʚ߽tⅦ۞;?~y~>{y# wg<|ʟm~ВN\Y rߍ~Yw{f{-jw8^}@zֵ~5k/^W~{?87d.qz@*{yy6;;gfgn|_z9p١Пwwsiޯkپkckoy}gs|ɵAwڼWoLXhf~imc}|=?™=5NE;NXpe_}Џzj{egk 96yܼyS}׭/ZC ޏ [S<;7?ԟo5?=Xγ{m3_+βqqor}r}3_wfv~4SrӜqܜ7>P5ߟ={A5k'xk'|c"~ߗ7ykj{[zAg/֖Z8nwVxU ;w~~~|;_|.ߗG<.hoy?_NDg{i]׼)u^EOI_7.L:eΰiC׺6 loq.}w6_|m]g8o?]/[vwgX)wnf6{>μ͙yX}g6nױyZw$g~#շڬ?%?} 8GYflM(?^u8j?,| _/| _/| _/| _/|N(jFEQW>)WuQhEj*r(kfҗ-zX;6cx)v 6ʾZ|sN|V|ԆWj_1_ d3eA]W_ }vv)ѥ$~ݧܴpF{Wɻ:tU.w"Н Bu{I ZR`45'k(0\O6fۖo\쾕xV~'T["A@{`0:/w/| _/| _/| _/| _GܥR-lsBcsTP.,{FH5{Ab6ox \EKszr:\.V͹,g `4lb/_Gl>JC+ <`B -BV4*`Mbʼ=P*v"Xs/(v% 4.!|U}옘o/!7;B^R~))2'r,aV43mW{.vd6ܵїhkF|*}lJڑ Q8!Ŏ 7Bnj['^ |Q7lf{E{āXC]a+j3$}䘆Hs~p8l^˷dX5/9is YgaCN|=#DSL!YYqC?ɟudp9m 5L2 *fu/^'ܫ}f\jĄuڐ,z'9y?\w|PޙVo"=Ϭ[9ɳuͪ:>1vq$u1}g: $}2>̻ m3 ܀xPLJ?/d'{:N#Mi]ZCl$u~pp-Zu37u̺Ul.,rS\ɱ9䗥 N 5i!Nsl 5gvlPnw oFvJ򾒤rg8CNާk{iڗ\^Kꋦ1Af׻۸kگ] v.\'Toi~\|A?ǹwY5 >KlL*ENBVWgre,Hج,Oe ieuwf7!Ľ!Okwc:z|ϥ/T+2taU+Iuy{)_kw.zRv .夾9Z 'nZ9~V+pLXߦ9V\ϒp ,85!o]R 'q_y'Vu!Co7̐N='1=7VyD}dV{_M찰|xf 7)+5ֹ)NYn/Lhq8' #Vx5?yB~OY6zچ6PDW- [#!w09e{ DbCbu%A ;˻vscquO3{9kHZ$'?tʝjn33w/za}M_qw0qn?6P_BN6#M'ЉO{L+lĭ ]A{%R~-ٔ\ ik Qсl_T՗yfp)g!'3ٳ Bg3G;*dvYǃ[g4pɐ=[m4f'[KR |k֚!Z Y!{zrexg=vtȞ]ؐ=cn=a ٳnzȞfY I"""""""""""""""";֜I%썴;Pف@g)vf;Ȱ ݣ{G{tt(#=rm յ6T׆P]kCum յ64׆\kCsmh ͵64Fҵtm$]IFҵtm$]IFҵtm ݵ6t׆]kCwm ݵrm\)FJkg&"ϻuI\y"fy}Ykn$o 55 R'D23OTH ٍB8EZ*?Ȳ$Y%k}Wܗ

n^|p֦z+%,~[ nv܅ଷz!#8@H p $8@H p $8@H p $8@H p $8@H p $8@Hiadu^AFVY!@HiEp p $8@H p $8@H p $8@H p $8@H p $8@H p $8@H p $8@H p ^8҈p [ 82@Ȁp d 8m 8ZȀp d 82@Ȁp d 82@Ȁp d 82@Ȁp d 82@NXE3guΐ82@Ȁp d 82@Ȁp d 82@Ȁp d 82@Ȁp d 82@Ȁp d 82@Ȁp d 87[8 82@Ȁp dl5p '78 82@Ȁ崚pXmPJ)p8PO8P @ee8P ښD(p8P @(p8P @(p8P @(p8P @(p8P @(p8P @(p8P @(p8P @(p8P @(p8P @(p8P @;=Ypp8P @(Zu0bw¬O8É0 laApaAW€0 8€0 8€0 8€0 8€0 8€0 8€0 8€0 8€0 8XpaApaApF쀃0 8€0 8€0 8€0 l}paApaApaApaApaAg€֌€0 8€0 o٫vѧwNM`uYwm鵥?[C>ZxS沯_Z[᧗xy k:s*f_v>ZK]sWk ɏ|'ғYǑڢtVך}닎ͼif05sWwG,Oξs]v"-|ݡuk?8}f:޽ԮԚڜ÷_}'q.}?|ºߘK6VߚGekw>K%Ӝ"zxɍ'~+7߾tRj'o~oF>?e/|_i뾯ϹHB*eD4s<\q""e 'Tϊիcr2Xo̺Wփ9Y_G>YGQKZ[QoQ%?On1val4RTd\u3p%.v.pehe'SV^͎XǍZu+}pO y?"UKX%X = }0j#]4 sZ ?. qMå`KS\ͪͺYwx<+a%7s64eʊfݡP[eyc-+ vm l-bʉl(g_z>YߦLrC?-ćJw˹Mbx1חTXjK7Qx42?o_-8sMHf_%12neY ,k>͚biM3k^˚ϲ汬4k.K il>-\sy|5>sy<5|5 66gͧ(...............>]k0dg:\r ř%^YNpofpoVpow K;ܻe.w+]] = }>C> #> pw-OwO >>n-pw}wVpw}Npw!1)=sp=~~Ap;p=Qp{?{ܟ_ Sipπ{?ܿs_mm_K /_K /%_K /+%_K /%_K /%_K /%_K /%_K /%_K /%_K /%_K /%_K /%_K /%_K /%_K /%_K / 2/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e ̅^W _+W _+W _+W _+W _+W _+W _+W _+W _+W _+W _+W _+W _+W _+W _+W _C餎A: H1;X}'̐x/~$ { @v_{Aǎ\)Fʵrm\)Fڵvm]iFڵvm]iFڵvm õa6 ׆0\kpm õqmd\FƵqmd\FƵqmd %p!&PC xa xh!ZKZKZKZKZKZSњT5hMEk*ZSњ45 ihMCkZК4$ZK$ZK$ZK$ZK$ZK5hMGk:Zњt5h-Rh-Rh-Rh-Rh-Rh-h-h-h-h-h@kZ3К f5h@kZˠ Zˠ Zˠ Zˠ Zˠ5DE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKT DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4 DC-PK4Ԓ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-QKtDG-IPKR%)ԒjI $ZB-IPKR%)ԒjI $ZB-IPKR%)ԒjI $ZB-IPKR%)ԒjI $ZB-IPKR%)ԒjI $ZB-IPKR%)ԒjI $ZB-IPKR%)ԒjI $ZB-IPKR%)ԒjI $ZB-IPKR%)ԒjI $ZB-IPKR%)ԒjI $ZB-IPKR%)ԒjI $ZB-IPKR%)ԒjI $ZB-IPKR%)Ԓ4jI$ZF-IQKҨ%iԒ4jI$ZF-IQKҨ%iԒ4jI$ZF-IQKҨ%iԒ4jI$ZF-IQKҨ%iԒ4jI$ZF-IQKҨ%iԒ4jI$ZF-IQKҨ%iԒ4jI$ZF-IQKҨ%iԒ4jI$ZF-IQKҨ%iԒ4jI$ZF-IQKҨ%iԒ4jI$ZF-IQKҨ%iԒ4jI$ZF-IQKҨ%iԒ4jI$ZF-IQKҨ%iԒ4jI$ZF-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-1PK @-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%WK‰X rc'ɱNS8M rL& vnM b7A&*****$vnMIb7I&$$vĮNĮNĮNĮNĮNnM)b7E즈"vSnMib7M즉4&vnMib7MĮAĮAĮAĮAĮAf !v3nb7Cf]W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W W[nk M"/| _/| _/| _/| _/~}!%$>Ӳj9=(lCݫE=ƻK^{tUvj}F<,'bθ}!ҠiIIn1x#>/>$'..............[ݚ1)9eL ᅦ~H|/ᅦ߁!w{H|/ᅦ߁OO8g֯9[RmG#t{ؑȻ;ۇ#Ȼ}(>n5wP|~(>ۇ#Ȼ}(>^?ywGCwP|>yG١Ȼ}(>nۇ#CwP|>yGCȻs(>nۇ#{P|9yGCwP|~(>.>n#Ȼ}L슏;ǯ̏K?ްނv/| _/| _/| _/| _G^o y~|!|1_g rղ(@v1+wso +rM+V׿j<7ϞA/X_ϩn] M#,r;ǭ>GH 9;ӹܻ9}¯Ioy2ㅋ>1/&"'$蹀7sehZri)XH5W*$`{QF,J4(x1ORϾu~z==}nbl[ Rs>:\o֭t_=e9rϾ'~7lF˝X2K Rʡ6/R3-ߕ2y8LNo'4$ծ$CXZѲΪb1<:bxԿ}hvƏƏ5fӅqC9)uրÍ2}wbCy1$ I0ki| iI[Ht.mmb 7VɕWSʚtaZsλF^|{ G{w<2-Wrt,t&Vm9+zS(>DMOƜ͓+ˆ6+`xU@q?!o X+hp*/0. =;5e] 3 @w\n ;\.aip/G=Bemcs<IOoo:q0 ;3 >"i:C6TM˻eX\ ͫn ?Su|UY11 >kIH"ll3D`Ch|E`&"N8_~-7UVj|A] noGkwۧ_"xgHus Xqx0Wze4ӿl.E=m9V*̞czfKw1YUdƶ튪WR谦XISs۫r1[bA&eENKtV4zB#ڎMBR x:]ox6;5Wړ Aφ^QZiR* R$N;/cPT`}0hNʵ?Wִ}[j ~:;?Q;pΫ?֢o?=`k3n\ڒJ,ӗZqOq~5W|SNɬHwmGK :k例Ef4ߚ9;#kg_v9f~}ifMy t 3[^mj|jxm/|{t]m߸}ѿUA>>{Wao%?}voM#o5;L%n[9OD?w.Dmޚ O#S]3/| zawVğv;q羿g\sT䑣}gLܻy ~<kǽٷ]nu|N3}=y Ψ^!| _/| _/| _/| _/| oy]Otz_]'Ɵ>1D'EO?/}b.QOtz_]'Ɵ>1D'EO?/}b.QOtO߸^a'ΧĞ8/| _/| _/| _/| _G ''ڟ>1D'EO?/}b.QOtz_]'Ɵ>1D'EO?/}b.QOtz_]'Ɵ(?xO|>ph K v$فR  vqB(%#=JGip\kCum յ6T׆P]kCumh ͵64׆\kCsmh ͵tm$]IFҵtm$]IFҵtm$]kCwm ݵ6t׆]kCwm\)Fʵrm\)Fʵrm\)Fڵvm]iFڵvm]iFڵvm õa6 ׆0\kpm õqmd\FƵqmd\FƵqmd %p!&PC xa xh!ZKZKZKZKZKZSњT5h͕EuIWrR !*1vlYlnY~2a'>w +%?_W=cӣ 񝋾5);m|eo5/uw'>}fw;f?|3woE_;}涳s5ƎT̡~_8r3מri:u%7FoO;/n7Kq}\Voo̭欕G fē_9h=4. cg^{o5/Zfu9ܞOż Ts3wow~4/?oe^gϞc7,䦻Ƽ{75C慷^S涞ߴWsk+ v {?^g^󵵕yK̘I2%ϼ) mkmn?d;_m{ͭ~5{bV~#)-}J?/۟~sgռ/uy/|˼WߐSzi;= _?`eyos{p/Q9]_w 9؊ u봯r? ܾw0W;\lps hpZJxpІ,jR p'; v(q-7g_܁ CppG; 1悛8p-\. .nEEEEEEEEEEEEEEEE'wޭ9ySS,M\bNLqʇqNVV{;嵏SfrcGwC(Liz!W,)' v dpK- p+Tp;V[ n 3u[ \/uփ; Gw׀;{-55.n&p YspV Κ&m vp;]Bp{NpofpoVpow K;ܻe.w+]] = }ହ 0(8kcqpIpip׃g}}}ܗ}W}}7}܍nw3.[ {nw;; .p?#p?p?3pwܽ~>pw?ܯo=~0G= 1p{'pO3+{ = pς{BS7dԗ_K /%_K /_K /%_K /88_K /%_K /-gmggmggmggmg_Ki /%_K /%_K_K /%_K /%:p /%_K /%__K /%_K /_K /%_K /%t%8_K /%_K /%_K /%_K /%_K /%_K /%_K /%_K /%_K /%_K /%_K /%_K /%_K /%_Kine 2_/e 2_/e?/, 2_/e 2_/e 2_/e 2_/e uk;CkAk;@k>p/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e 2_/e X]~W _+W _+W z~W _+W _+W _+W _I[H+W _+W _+W _+W _+W _+_+W _+W _+W _+W _+W _+W _+W _+W _+W _+W _+W _+W _+W _+W _+W _+W _+W _+W _+Wʈ=K'Naaaaaaaaaa*Ep0? 0? 50? 0? 0? 0? 0? 0? 0? 0? 0? 0? 0? 0? Xs9?qr%x}XofHlE^?[Cb+WV_% Wp\~{+^ Wpὂ\v{%%pӺnZMi]7Ku ܴ.%pӺnZMi]7Ku ܴ.%pӺnZMi]7Ku ܴ.%pӺnZMi]7Ku ܴ.%pӺnZMi]7Ku ܴ.`&pn 0f7L 3`&pn 0f7L 3`&PKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTD%5@-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKTDE-QQKGء}CP|~(>_u)[u)W[u)Su!ZC-PK4 DC-PK4 DC-PK4 $ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QK%IԒ$jI$ZD-I$QKtDG-QKtyvuC&>5y0:0WupoB&TpgB7&Tp_B%TpWB7%CZB-IPKR%)ԒjI $ZB-IPKR%)ԒjI $ZB-IPKR%)ԒjI $ZB-IPKR%)ԒjI $ZB-IPKR%)ԒjI $ZB-IPKR%)ԒjI $ZB-IPKR%)ԒjI $ZB-IPKҨ%iԒ4jI$ZF-IQKҨ%iԒ4jI$ZF-IQKҨ%iԒ4jI$ZF-IQKҨ%iԒ4jI$ZF-IOuQKҨ%iԒ4jI$ZF-IQKҨ%iԒ4jI$ZF-IQKҨ%iԒ4jI$ZF-IQKć!Z2sSxCњsć̜C * * {*;*+5@-1PK @-1PK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI$ZA-ɠdPK2%Ԓ jI9999999999/Ɏ]Hߎt]v$;&v'ɷ#//ڼˢ θ|θ/zL4G :Q?>b}^]\aؾ6+ߟK|qb_5_*$/6n.WI;,+y}Fx? N /t0 I"]ܢh&tlRǮɧc#X*  .p0KڐDF5BDTrus,f!oKK ^6\fCZ97幁bL)cCJ5[(ijbn[|k0U;; [ٽ쾙,Ku$~nkǧtkYVoy GޔX3.+gZ L hXɸ4\RQ)u(l)TG;9e8 IrMsƏdƉJqhˡz[bq3nX/ޟ|:"=74^H}fuoUVgVtu!/Vsrej\ d쨢﹝C}Mt=5U:4^骶[yQn'wǮdzQ.}Z_C0z:7UR=OgXê~~,|ִZ;W9Y&txWMop3 P=C iع{jFv 4w'{6Ib\xw^m᭥@wr@ǥ2_o~[y?ޣ~49Mセ=)/*mVqEӇS5a9\1N=Ѵ^vw~S$MUuqh ^n]piLC2Ƨ*3na}zb47mx\_iphlKQLRFh~Cw-Tw Z8N|8bgC|\ΏUZx>@Ұq_uo1dգ,7![}NI\u\XKCp5k?5W-Kl/\**ﰖ&.7톘| ޯ c+mݢWHKۊDu~ =׿ 70URCEdp̞~'vφP`AlYk<9p-jäQEgr_Hߦ(X#W*n͕7}x_9_o$k`/UDQl}z!K+ez:zSy~ U\_Rɖw` RF𬢖9a}HBb0=(C,gԝgVj>bUUNtږolI\9Wg ʹkoo]/vy[N-ǩ85uSړXVV*j[A^I:r߭\Gy)z7 DB@)Esۇ@)'cY=D0 WʕK_8WK\tkJq1C?W+@WgWx|gf$!5νSj8tH:R#P 9.ݿT|On6W{ޘWJ>%II  |Y*G@Of50'zoعO7Vrn'MjW'\ sz"VuU罌ċj6rmfs][Q,thB>F)` _SeZ\!ҳOnVk,H̱YM@U`g@70KkS!7Z,Ն@*| _t+^p ڟ|Th[UC>14|q+ԅ8kز(l. f7 mVYါX%W]n=@=p(Py6dNZh}y(Yپr*V/#0(Z">rGfhQa%^գpMx:A&HڧYӤ&uukvޜsoဘ~/b< ~kdȮD-s^-À?&F҃$ݴ;;@4Q~=>>ҰI#ǿ.{@rr}cC\[7vCډ# bϻ;S'4M.1ԕ{m-޵# bC;Ӝ]©oylpXc\6Kﭻ[ 7ݱc y.㻘ǐǛNݶ齭wÍ2}OL~_9x¹?}h8;VO5ַ{қ,MϜx6y_y>ӟIZXeP}K $޻ꯇKk 84>!Ϊ߫qg2}Bwx(AkC,i|ٚrQWKq7;sų\ܙYRÚub 帝oi~HS_; 䜫Zo5WyYb9 S Γffy3LzOJ7F:YibM YZݚ-ž܂;z8 (5,v4T)F^s&Zŧ# q5\\'\9;6UdEhk@њuua|fvR k @߇S,>iՓTR|_+ ʄ4W:㟮HʘNRWq=Y&SO뻙lã­]˲d\aK = Bb-*dlVY7\.[ag}%Y*W[jT}|n~}*W!ןV-Gsׁ%J Q*:$@Y%yw[7Wh?[*wV7gO{#b|Gi8W 2Tښ+y^:f-: Uto&C5įx }2.k;w_$ߚXIq5[W&~qemHLumHO!ղOąq539סCxdˡuݜBhc氻'K7|"g5pYql8l]~1ڎ{CD+U yJӚ8XU&\keQ>0IpW8Ѭ[;ŮQܭӯ{:޳?4F;7~#Hn /#tV͊S֗LrPhUBwP}h}s[錍3kqӿDpڛ+ITcnWc|tW2(wi0ΊTMyKsLaY%-hf&O## )enVNeihz5W/6(ිy_~lLjpRax)7p[car3}ٳ!?ʩ9Y*ievq\=]yz*vM"g*4>6/Gߤhh}:xtW9}+WkgvmVP'_d2䊰ًpb_J$h,?&3لȹ}l4{t$xP0Q4bv4 s\}f@xyJ/?s AwewQ.\Fm<\T^zt@Q߰hX-n~o#a//zoi`.斫ثض1}NعB,V bX17sƈPYpi̱4o\>[KgGge~h.Vپ7[sB~"QfS~kȚ|Ru~2Z'B}-I϶ֹ;Hg Ywػ&ՎGM .fC1>"oבWGQJ\ۨm޴yع<鼛|Ng@b #tXje}g77BwRd V9;{]nhҺ:;--5zfIЁ-ZT{z֯υ>mX1Jt={EzeY2hg^kW{Ӄ]m=]T7gޕv+{h*-$trw0􆹾ٳ06ޜs +$";ȹϐcX}s5ɜC2].UKC>Kݱ~h a.k7EZ>~R]_W9/kc3_ec㳽Qxًݲ7皛hjjMYd٧K DD/'8!E3hfl4(ڍ)iپ&9f$bkF1Z䤘7SIIbY$>wwq/0uf22c1x}=tndXs[fXpbz^+=k4lNTh@-rn@*+ĠdLV[J_1Өh-W,~~_8-y F|s1Co(NG]j3ٛByAݓS`? 23nжNBxbl4Bh#@9lW z M)Otv s _LO#`{FB !>}3,hNl~V}]ޢO^*'pߧvgZw_(,ׂEyH*b6]E,os^aR0泙!:K6?'0"k/| _/| _/| _/| _ڇ;kp~AVv/پ3 !{컵Px[W >Y[R$۝eho7)ݗdoC;!Ib?VٍFfBx~ )G.D= hhO~ 6ij2UqMOe=+V0D~#ttEɦ[LPSk ?d]X:$@ǴcJׂŬ@. *iT?r.=[g[͞?{=}eY|l 9环2 WsguݟsC;_z\sKnM;_6~m_dy~waޠM]3I{n1f}S~sݷ5?ۯ4mx:93{XawwbG}4{S.|Nݏu}O٣\< nrCϽWkgW.ywl̿UuM>uoX{l̵?Еfܯޣ̞nY4?=S{vߜ:s5{bOv7QEz.]ԻwQEz.]ԻwQEz.]ԻwQEz.]ԻwQcw\'5:)wvԡPkbDFR*k{ERؔ Fqj\n֬,4rWc)F'ǝ#HwDc(| _/| _/| _/| _/|N~ȳŶ 5p>( ;oy_p*vzJYgY:v.=5g8i'zO ;>z7n2\zӛ - kXynks~]t~u~gse5m9ggw3//v?cvޚ7U{U;ϏmXuvJw_"7 ?} g!?߆tipϵ||-o~;u`7kospױtvau{^eCon/_okA<˹_?~>ޚv̟gt/otO;Ϸg|X/?bZ>?sΐ_CXq;NNypϯH'w^YɅg4pkk2}a>ßojWR:>>?ʣ}p>Iux=a>\x:;fNoA|d}l|3(Aڐ_C Nz8} zγr\krp|^6p8csx9c1g~o1~ js>ߞ~P?y ֎]sk??o8>?vv³aO~MۙWg|* ?kH? >V7w3ǻ,:x$hoW~[߼EP{?/gY/mO[۱aLyU4dU0gƷg[%='uq__ջ ''uffۿ? kӏ9j-O],|ׅX z0;\7=X3+,2~}O?p>v#{G>ZrC<+;о+{U_;GvdE7CA܁?, >r;XWqK0ߗ~`o_M/Տ!>wqsⷾ[;ˮ'} ]~]s_䮏9;+M>s ?.y]~z(Οyk_]N7(&ćn ҇n{O'^G {Ys^_0硁co4T|/}<^?k.w+_tHէ;1/zO}}_[ki0wc ~Cy̹fӦ >m [M{_ܵqZ||S?xv{c_,8%l)2x e{vo7]qUV/3߈o7eAY~43pV`G~f=m42-ވo7eǝMhC-3{-4xїu>y߇j8{ټU o/k̺ſ)udC-3onȤw߹qKpޓn?j5//o,վw9v/ן_v+ol,;\fo|+3U_81NqC/kPV|"-|=bv_{{wo—wݙ}k;`^3ߝ91}y3 +q+\t`ۡ}|c`說z߸1C?aӇ;hv#߽֯F8'<Xc|m[n?'k?wN[7j Oh{oZ~3ouk˖41xO}r?P/~yq#7`?{*S~jye<)_xV|vW:ֿ|f>pᓿzsOVu؍m|=q7a.WFp?g=o7v?SO9~wA'&7fsχfc>s/~@]yx_~ xq#m'N]`}{^}G_yChv7[-_|Sp?}mo1ZRKYo8 voݿ'QOՇOqݤ|1~={K'~x>iw/}j>no}~}\v U~DZڽu\]}KR:,l{wtצ u>߷_טem[w;̤G7ھF_tpq]p⃾ܠww=U'GqmR>o޿777$^۽g|`ʹ7'|دzh/1+f_x[٩{jpZ?7+OdvooߧuϷ޿OƂs1}ݿџuٽ?oK?rEf|ko_^~G!JqEG~)p#77d7&|o*v{MzơnI귉۽yz=/}񍍃.9b^=}Ona'is&)ͿxDX}ѽK{CΏ=DLݿ7ʧ,mٿ[ϮO^It-d]OzpMPu~=6~>_ŷvt<$Ӟǵq'+?]8ظgrK n?o6;2{i#MҿOusƓ}φQ?W|oO6ߖ^]ݿ7lJ{cISK|{$8-!gVI}}Ǿƶ?N\՘o};<'C>388ң5DisK%q4k|$:vo߭O};i&:o55Nwq]|{ŦƬ{`eNg?mzO];kU F_|cZs'|/=}_XT[r7f^$|o6{$=TM/ۜ&|pLԿ+MҿuO뎋~gcn6ϊuqΫvozWݵ緿 nKq'G~Ʊ1ߕΚ󿅫hl\u5'Laqju?Px?PhΚ)>MwCQ5qqqqqqqqqqqqqqqqq+Ѥݧe\ldc/yQ?EѾ+T\]Wީ28xĨjg>]50UjקԲʉԦng~Uj3*6fnr*U؝m{mvP×;:2Z{:J˴{}'yo рnT:}h_w3?A@g.=}!8888888888888888xL2U{RٍcR< rTT;2M*فIR16o{8V?2)=czq|}'Q_`>1TY[_2Q:d+i0X'\C"ʏ L$t?KcְZuz9qlώC|m+c>q=cb/Jqύ7-ߓ[aXo3Wu$q~\R`ύ'-@8(ߚL{ROu8Y}N李t|mgwivLfcΈX\l CL{+;d|,~³jc;ed{-Aϙl0".ܸKW1{3\?[^o&{ IjWVzL{swkKl~SFp3+%ete0G/pLą9~+8>,>w**VuplMK,mfuBmSu<3u;,JdvuPV}jzUd#Lfl8U]jy\vein½ ҵ N^Joev[8jѩ>&{.aWώ[oW/aus\|,o z]K;]Y{m cǗk`rq8 ݏS6Uq,:_a)2s3m5|]k2hm-۹&Os77.3 2oA&Of='CƌYٸY^>fvԱ+q~7m;yT=:c:ŕqFu{r{0[WxWMնSi=.P6=77C?6'Uay{FJ?2q`> }:]4ΙUv?ϊxsvP<>WmS{*ˋwzZ`y˱)-έؐ8\aqO͐64 qWa3Wg|qV%3ԧx֓Vpg=ڴ8Q}ґWӊ8fU>[կ{qqqqqqqqqqqqqqqqq`_ǯ_ZI%LTV G%\TWZԗJILRV$%)?I%6Ć0fbLl 3a&6ĆذVbJlX +a%6ĆذVbNl؉ ;a'6ĆذvbNl؉ '$6ĆpNbIl8 '$6ĆpnbMl 7&6Ć^bKlx /%6Ć^bOl ?'6Ć~bOlrb('6ʉrb('6ʉrblR_%K4)iQҦCI%}JY+Y+Y+Y+Y+5d$k&Y3ɚI f$mJ:dz)Lhd&%ɚK\5d%kYȚG<5yd#kYȚO|5d'k>YɚO|V&keV&keV&keV&keV&kb[,bEl-"Xb[,bEl-"Xb[,bEl-"Xb[,be5d"kYȚE,f5Yd"kYɚMlf5d&k6YɚM5X%iEZbX%iEZbX%iEZbX%iEZbX%iEZbX%iEZbX%!8!8[bClq-!8[bClq-!8[bClq-!8[bClq-!8[bClq-!8[bClq-!8[bClq-!8[bClq-!8[yyyyyyyyyyyyyyyyyyyyy]y]y]y]y]y]%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\#x['[|bOl->'[|bOl->'[|bOl->'z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|O(%tA:LXPFmvXei}fvMfdvMfdvMfdvMfdvMfdv-fbv-fbv-fbv-fbv-fbvmffvmffvmffvmffvmffvfavfavfavfavfav]fev]fev]fev]fev]fev=fcv=fcv=fcv=fcv=fcv}fgv9|fgv}fgv}fgv}f얙2[fvn-3ef.je&K[,m.K{,4d3L;;,>KS>M;d3L;d3L;d3L;d3L;d3L;d3L;d3L;b,;b,;b,;b,;b,;b,;b,;b,;b,;,6N8b,6N8b,6N8b,6N8b,6N8b,6N8b,6N^YL,W+bze1^YL,W+bze1^YL,W+bze1^YL;asJx}|:wx09wx09wx09wx09wx09wx09wx09wx09wx09wx09wx09wx09wx09wx09wx09wx09wy '8lq '8lq '8lq .'lq .'lq .'lq .'L\W.+ez2r^L\W.+ez2r^L\W.+ez2r^L\Wx1y.?1ywx1ywx1ywx1ywx1ywx1ywx1ywx1yw>x3w>x3w>x3w>x3w>x3w>x3w>x3w>x3w>x3w>x3lq >'lq >'lq >'lq >'lq >'lq >'lqgz3^L|W>+gz3^L|W>+}W>+gz3^W&n2&n2&n2&n2&n2&n2&n2&n2&n2&n2&n2&n2&n2&n2&n2&n2&n2&n2&}wef얙2[fvn-34N0dsM?7dsM?7dsM?7dsM?7dsM?7dsM?7dsM?7dsM?7dsϑfv^^^^^^lMd2B$1,2^L=bF&;{r27_pH&[G"{+g=/}B3w˙3ѷL-o gd\?I~3{L d D37xDF8&};[ћd-uzK˞=-{ZiӲeO˞=-{ZiӲea]$ɺ; '.ɤ.Rt^=?>2IW# cpZgܞ,sDm Gpx=xbH5$fbmlviݢŸiiq3fh={r{ܾO}Trq\msyרLPٶofWձzO~`%:ٚ޽5JA}JPu*3 _N*AwJ!s'G_j7/gFĠK^(Xd,[@rTzfik d/-I){j9R-^x.G٣ˑ娂jVuT цCr!G=jdfgUr%3*ruIBRehh%BJ3Jr33jrų3Ҭ\]\.W\V$U%Ϋk!G!\p1 &n# 00a#&"\p9+05р 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8qј1~ɑtVF4@4@')hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhA+tG{8Ѐmk$:pKt@t@t@t@]\u :p:p:p:p:p:p:p:p:p:p:p:p:p:p:p:p:p%ur%T.Wt@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@t@#Ÿ4p:p:p]+D6( @8Įp@8p @8p @8p @8p @8p OK@8p @8p @8p @8p @8p @8p @8p @I@8p @pPR80 p`p`p`Wp`p`p`p`p`p`p`p`p`p`p`p`p`p`p`p`p`FIN@T!=!80808080c(A-@       9^ A8Y Y d,pA8Y d,pA8Y d,pA8Y d,pA8Y d,pA8Y d,pA8Y d,pA8Y d,pA8Y d,pA8Y d,pA8Y d,pA8Y d,pA8Y d,pDxWFA8Y d,pA8Y d,pAvkt[rA89 9 䀃prA89 䀃prA89 䀃prA89 䀃prA89 䀃prA89 䀃prA89 䀃prA89 䀃prA89 䀃prA89 䀃prA89 䀃prA89 䀃prA*Ax1_ 9 䀃prA89 䀃prA89 䀃pr[[0v_G=Ƃ|7~w`oWԻ; U/[(^sY<淗 8{e`ځ3>k{}eiec⭣̻_Ӎݬ`÷_ozɌ 3G<4Nʅza xo\½us>3Oӿv*o'/|E ֡_zCnhFy#>XB5fKXW߳'n_Xi?)'spex{xBp ^O~M'?{_^=*}=8Ӌ O{/4lA1zg%_8VWszu(ۑnG\li Gn)7<4dS8;}xE@N?_SivUʩ*,|;r4<%ɶ$4*nGv(qeTTnW&5\'֍.(][3%O^֓z"QU=Z):^vIOUL / Ԇ?1?^ޫbC#q!нcд=TU!Qϳ<?02cy ѶmW3_s^)q0U-s2Y6mrTm"Vs$ދx6ɡMhߣ*mQ(qZkmpmV]Z]1>TjkQlUVUGIvױea-ݡmkE~7VWMjW#59)UUcqX[[W΀X&{?Eq|Xy;Rr\D/ME%c:_W|)2Eձ#gSvOQ7e뜵q:_y['jvW4fkf)&y[ҷ24P&[ʯ|Lҿ|L}zILشiӲeO˞=-{ZiӲeO˞=-{Zv٥O~"{}J^R!jW kUFx u#܀Z! oDx"-oExށNw!܈n &!7#|CFGnA>IO!܊pF w"|sw!4F<A_B2}_A*_C: < o"| AxC>?B1OB)?C9#"< _"<+_#CxO"<?" O#ᯙȋL&oA'_5_5_        n@5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5?WC^p{~ / _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/{~OP4r>=3{Pa*}{PtF*C t|ЩTb#Y[O֓dYl=Y[O֓d9l=Y [O֓dl=Y[O֓dk=YZO֓dk=YZO֓dk=YZO֓dk=YZO֓dyk=YZO֓k-hYkAZ ZZКւg-h9kAY ZZZւc-hkAX ZZւ_-hjAW ZZՂr[-hjAV ZZКՂbW-hjQɚMlf5d&k6YsȚC59d!kYsȚC\5d%k.YsɚK\5yd#kYȚG<5yd'k>YɚO|5d'k>Y+2Y+2Y+2Y+2Y+5$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,"-HK,&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK!-qHK%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|Ғ2iILZR&-)IKʤ%eҒ2iILZR&-)IKʤ%eҒ2iILZR&-)IKʤ%eҒ2iILZR&-)IKʤ%eҒ2iILZR&-)IKʤ%eҒ2iILZR&-)IKʤ%eҒ2iILZR&-)IKʤ%eҒ2iILZR&-)IKʤ%eҒ2iILZR&-)IKʤ%eҒ2iILZR&-)IKʤ%eҒ2iILZR&-)IKʤ%eҒ2iILZR&-)IKʤ%eҒ2iILZRN(%b"%6YbivYci[bvKn-1%f얘[bvMfdvMfdvMfdvMfdvMfdv-fbv-fbv-fbv-fbv-fbvmffvmffvmffvmffvmffvfavfavfavfavfav]fev]fev]fev]fev]fev=fcv=fcv=fcv=fcv=fcv}fgv}fgv}fgv}fgv}fgvn-3ef얙2[fv.ӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫӫ+96|6-atqqqqqqqqqqqqqqqqqo;ܢp߾N-6e:S{7 ߘji΋V ryoyyzgSUҾUG\i;vЧZ=ҲeO˞=-{ZiӲeO˞=-{ZReOhϤ oɤ ..о5. tv?]=. gtL@;.ОIh3@{VvVv&]= t*.О.Nt(.%ڣd@{$kq2]=L t(.%ڣd@{LhQ2]=J GtvLhWt(.%ڣd@{LhQ2]=J Gt0.'ڣd@{Lha2]=N Gt(.%d@{@{NhQ:]=J3q:]LK4N4N4N4N4N4N4N4N4N4N4N4N4N4N4N4N4NmǙQG&k=kpmV]Z]1>Tj=hg:(:l=0T[1VX:^ZuPJޱ|U. -_\];I']\E~~}YUrNs=GZڪ5&)Ϟc,eWpϱ?8y{%w?='=n瘿/=sGc~y}dnKlߣOJ|}d$qvcb/FcFŎ>Sc_5+K%My{M9k;T_jkUy]NRwo}S\Io%.;oꠙt<,n^av߶ܿgrEFcM@ǻk+ kuO Fw~+S֬Qk91Lg߿寠SPYJ?|Sۧ:|)EEΟ~EWAgprfW+P7?<1T瓻p7}Tm&15Oj qrl+6ϓgN{_9pEw7nig|{Lgk.;s9/;ϴ{2?ȫybʅ/82ݺKn?r+F_{ˣqPqS?'|~`qԃKf|?K;`򣴇ߺohf||U̸1sΓ@ㄯ\IM<Ǟ_o,[_7=4k׾~\Ox@`7lw91#5/^}PcVdu={o?8x@~E!8888888888888888xGpOst88888888888888888E<Gn'| ;TT K%lpTU O%|( ԗJILRV$%)?I%6Ć0fbLl 3a&6ĆذVbJlX +a%6ĆذVbNl؉ ;a'6ĆذvbNl؉ '$6ĆpNbIl8 '$6ĆpnbMl 7&6Ć^bKlx /%6Ć^bOl ?'6Ć~bOlrb('6ʉrb('6ʉrblR_%K4)iQҦCI%}JY+Y+Y+Y+Y+5d$k&Y3ɚI f$mJ:dz)Lhd&%ɚK\5d%kYȚG<5yd#kYȚO|5d'k>YɚO|V&keV&keV&keV&keV&kb[,bEl-"Xb[,bEl-"Xb[,bEl-"Xb[,be5d"kYȚE,f5Yd"kYɚMlf5d&k6YɚM5X%iEZbX%iEZbX%iEZbX%iEZbX%iEZbX%iEZbX%!8!8[bClq-!8[bClq-!8[bClq-!8[bClq-!8[bClq-!8[bClq-!8[bClq-!8[bClq-!8[yyyyyyyyyyyyyyyyyyyyy]y]y]y]y]y]%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\#x['[|bOl->'[|bOl->'[|bOl->'z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^z^'-IK|'-IK|'-IK|'-IK|'-IK|'-IK|O(%tA:LXPFmvXei}fvMfdvMfdvMfdvMfdvMfdv-fbv-fbv-fbv-fbv-fbvmffvmffvmffvmffvmffvfavfavfavfavfav]fev]fev]fev]fev]fev=fcv=fcv=fcv=fcv=fcv}fgv9|fgv}fgv}fgv}f얙2[fvn-3ef.je&K[,m.K{,4d3L;;,>KS>M;d3L;d3L;d3L;d3L;d3L;d3L;d3L;b,;b,;b,;b,;b,;b,;b,;b,;b,;,6N8b,6N8b,6N8b,6N8b,6N8b,6N8b,6N^YL,W+bze1^YL,W+bze1^YL,W+bze1^YL;asJx}|:wx09wx09wx09wx09wx09wx09wx09wx09wx09wx09wx09wx09wx09wx09wx09wx09wy '8lq '8lq '8lq .'lq .'lq .'lq .'L\W.+ez2r^L\W.+ez2r^L\W.+ez2r^L\Wx1y.?1ywx1ywx1ywx1ywx1ywx1ywx1ywx1yw>x3w>x3w>x3w>x3w>x3w>x3w>x3w>x3w>x3w>x3lq >'lq >'lq >'lq >'lq >'lq >'lqgz3^L|W>+gz3^L|W>+}W>+gz3^W&n2&n2&n2&n2&n2&n2&n2&n2&n2&n2&n2&n2&n2&n2&n2&n2&n2&n2&}wef얙2[fvn-34N0dsM?7dsM?7dsM?7dsM?7dsM?7dsM?7dsM?7dsM?7dsϑfv^^^^^^WK>;Tm:86<|4”oWuŁxul6\/ 7lWs^-.Z?2X_9ns hgon'U36KN6Yv|`bě~?}>:D~cHp~Yg̓r 6ߴ Ko^`C}j>lɻ+w;Gǎzo? &<7p>_<>v;G>=iz/sƶM2]eΚ$}C/.}Gvo/}'eμ5زlGG\/\՛xk|Cfݞe'viWVo{y>tn T;ceop+^=?hl ߰5?y~eO>m#~vY``û}ϼr'^\og$ -'U/nvGq8kc돗QqRFU}-eYFu|aBE p‰'!p Re",GXpJV!p&‹B8sC8"T HwBa-:5.FDB>8~ H7#L l@؈ a3¥!\ +Bx K^r^JkEW!5!\pk^z7 Mf moGx;ޅp#»ރ^އ~ ܌ABo!|#EcG'>p+m#|3w E] >{E"—pWp?? |wm <]!|C!'!a!GC/G¯~[!<{'BgLg" hkkkkkkk{"Z       Oɯo/ɏe4_5_yIBkkkkkkkk+       B_5_5_5_5_5_5_5_E5_5_5_5_5_5_5_       _5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_5_Q:::::::/tnˏʏʏɏɏ!::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::h/ # _/ _/ _Ϗ/ _/ _/ _/ _“f@/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _/ _bktohT'7777C77777777777777777$!oooooooooooooooooooooooooooor|-r>vyg&wJ?~;~4]vAMk4]ФvAsMi4]ЄvAMg4]dvAsE>WOSp%\>WOSp%\>WOSp%\>WOSp%\>WOSp%\>WOSp%\>WOSp%\>WOSp%\>WOSp%\>WOSp%\>+YJ賒%d>+YJ賒%d>+YJ賒%d>+YJ賒%d>+Y"-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL$-1IKL-@Zb%&iIZb%&iIZb%&iIZb%&iIZb%&iIZb%&iIZbK)dB,Q2]J!JK)t)8R` o` /` _ d"-HK,"-HK,"-HK,&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl&-IKl!-qHK$]F%ZhM$k5qI%]Jz)I=/ ܟ ؟o d%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\%-qIK\#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-HK<#-X%iGZ⑖x%iGZ⑖x%iGZ⑖x%iGZ⑖x%iGZ⑖x%iGZ⑖x%iI%>%>%>%>%>%>%>%>%tEFfv4tE0Ȩ dE/<ȗR88888888888888888xq4L; [,\=yKu[2ᙙuk>5u~wpyXf5}W%C!#ڣ,c:8۳u_~xb:V$GTV&ֆj뎟 OPu|@=ɟ^[c /K~~ yձMY5/]IU2);g"rJ$IұRUwX1VXXȻk#N|*N3U+R瓒9P2a3v )2>KRKƖ!K&*Zq:n|D_qfqmxLc߷lNК$o_Nh'Hy;̄{ڙuOcv׆ǫc-wn WC5+Ў yU:oݡKLry,[MW߻qy?c)nZ!N<8'NJ3ڙ,V'gm .]7yzilu}DwF3wP8=J]VV.!TZDZo|4U5u_W1E|ħ,mm em@pwkӱgd+C[F4SjFT;qj_Sy-} LG;7H)js,=O:RT3w3u߻u$s~^Ur& x=Pt moD8=l%л8M#4zgɲB埪{ٶ+[qFie[jmr&ilL'Ȩ Dq c }Pa%&wh4;]e39@n3 ٹ:41l4P<_Qdh @9v/_sQ$)l9XNx6Txn?ӄf]S;cb  M }6-;r;!gkEm lݭ݊ehgeutZGTvAL[yѾC6xkU 888P Ն+b}2V/,эebǏYL FdU;Uffܭ6\UkVWj~!V%g6U'=:}4C0F7^@{4q|_'/#q|G#4-0~Nq^-7qDS!ACy4jP+>cX88888888888888888x1~3Շɬo*|k Y)vytv9_]|;.gɾ fzߙ52׍ WcၑbujxvdX|eDfnwgՙ "ODߡ:ӞɔI 3Tjs:WG_3f%L 6&ѱzMW k>GӄRWfnЇ1ً6MVtUucK?Z*-fYf m#jG' .W.W]ZU :6WC ܠ uXacelP kv#cFoựIU quMgF=8mmiiSTz4<qi~T=n"W>o9?>>={דol)vA UUE*0IG-]eP믪6[VDv^15/imm~矯NY;18;42Pvn:%[٠s@eһv2TϪ n| lN~Ve,Lω\)U#jPo_gKǖRbm[uNᦓI;Tyv zfڡ΢-{!#uxu ڮ8ǎzK&̡ڦjjfLrbUTdIVWjqq{.^[E*Ƶj\ "j9*Z EIaQYs>LU1qqkt th͏ U$;5e`mrͅak%x6* U\&/7X[T*;p|JYf7͒ݼb?)ll/z+ikmܞh77V@& >96}t#?vsu.JvL8烓lw\-c؋m."& vy9K4?f ߺu[}ǝfm]8ֹ2uً퓿l&SOn+A?7ޮzl&޴~OnFcEUىH^8ΟO[؉oMl:>jNvq;\[L;&dL3~1g?,.r_cLݕn2KZ!7N_Aa@qJf ޶*屲}W+8wUspn-kMe;bn_YC:/%Sz C&ddvs2öQ랏UڋsO]lfGz!׏ZVa ޶SG5#>S\[aD^'/=/in u?Љ}Tm;> jCqs3czR\gdhܡ# vcYxHw;'̗;g2cWRw}V5]s|ĄjjSY^۽ƸηsP?Ѧy=%.˔}V1ܪ~U7qCZiӲeO˞=-{ZiӲeO˞=- r>·[NO E,lG6PS6Yi;ՆՆ3rw4jC81+9^{e"p@&rԿLp;"9D8*9z6B_&rTYv&rNˉ%d͏+D{騕QVÒ3S>3cQN(f"Gљș.'zo&r9I't=-{ZiӲeO˞=-{ZiӲeO.9h%0UR [%pUS _%ER_*%)3IYINRNr$0fbLl 3a&6Ć0fbJlX +a%6ĆذVbJlX ;a'6ĆذvbNl؉ ;a'6ĆpNbIl8 '$6ĆpnbMl^M6iD"ldkQy!ORaުLޔނ[t|2?÷VD&Ԇ `o6oNzPۏ},kTOlڷuxX.> VTdjO Uj- is}Tmc˶E; Q{die#?I[{d/;d(%/}x).gKS}x5ٯʾM}U?d 3ыC3$X9Vqb&ziONn",DDhBLRX+'OKɗ3|Q''Ifdh2Zuj!\ ?A.8#ma}uq 䗯6#\p[@{&֘ppppppppppppppppppppppp#99䐣 9Аc 9#hh6OR8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ѐ 8Ӏ 8Ѐ 8Ѐ/E3h[.E8Ё8Ё8Ё8Ё8w<}Hu@>t@t@t@:p:p:p:p:p:p:p:p:p:p:pzIH_B8Ё8Ё8Ё8Ё8Ё8Ё8Ё8Ё8Ё8Ё8Ё8Ё8Ё8Ё8Ё8Ё8Ё8Ё8Ё8Ё8Ё8Ё8Yh}x8W`8Ё8Ё8Ё8Ё8'?#< eW ! #E8p kW8 p @[8p @8p @8p @8p @8p @~E~8p @ȗ$NBp @8p @8p @8p @8p @O"<@8p @[အp p`1p`p`p`Wp`p`p`p`p`p`p`p`p`p`p`p`p`p`p`p`p`p`{     y r\ !rp`p`p`P43~[!<r5f,pAA8Y d,pA8Y d,pA8Y d,pA8Y d,pA8Y d,p%?Zd,pA8Y d,pA8Y d,p](фd,pA8Y d,pA8Y d,pA8Y d,po5!CA8Y d/G¯,pA8Y d,pA8Y d,p %o rA89 #䀃prA89 䀃prA89 䀃prA89 䀃prA89 䀃prA8͒ErA89 䀃prA89 䀃prA8-BrA89 䀃prA89 䀃prA89 䀃prA89 䀃prUy7£!89 䀃prA89 䀃prA89 䀃p恃

?hW#{XA]oӣ~3F\xv7iL?|eV5n zngAv_}7_NfFw+?/{>Y N|5w4O=W?yzkE_|-}a5xec%w7 _wNf>GW`w_7_?2㑿ۘV`=?]Xw̾Wߌp9P@S^t-js:{Y4||ݴ jU#UwUmAZX(Xy8VOX'keGَ| >jeK5ںJghDI] Q Ia?k*ͮ9U%$_mThxH%KmUI&ӓcU4٨_PFㄥ˖2=?n pDQj^Hkl%Xtg/T^ҫeZiɾ=W/^=X:X[?"!|4X+/wr)gAqp릖8{mM.W83fʹM\~u@KQ^?2T:06DZ\|l]__e'+rpqCu^ƪ( o\__u\xgIl@#C1iZ^zL~1H8>bOZWW.ђgT-uuSÀ#모ѱMJ꺱j>kdHyuxLCxeDdl^ڋ[\.xY3^IQ*chE>c׌*Ůbtz q"QqLf=Z +W\͉+*pMpq+ vKO:ءf/mi*eԈchő5J5---钧Ƒꨟ"MGV\]"P n6FQ23Wf/b4K(jLccH/R 3>8:~0ZA G uTLK(l\1DhtuCf*Q(3Kx[C#-޳2T,t:.Y%c:ݽRo!\RşLPkrTz dM2ht#ŢR _xq*[\Js_G@P]^L'pO#EYɡ= ._I}He+-~6?2814\Wr*NLDIb) _SZܤ[R=Pҵc8f![ĹQ.b? :P믄irTm Q9e%b\6PWz*&ӐG.3%cVxUVM <I>CxeC,RLG0Rf Фx( 2بxQ*Ûz=yE|PaܛhćXJ ǰ(J!vEڝ"6X (LGeɌFRkp46AZQt.d2*:& e]Tq)V{סƒa@ WjT;ŕ!(Kx 9[F j4 L)jo *WM/iLk $U)9uk&9 #8 VK6U$<=u(Z#J59h5\E%)U`bCLaluM9# 9x}5nc֨ Y% nW6igT,=} "<kݡW3_9v O,4Teu PGȆI̚&A~8 qdl&GOJnb~B[vZ4Nŷl>TEl11|ldԖ""RDx5Xvxj^ ;9:QRUUXׇ7ղ `BEFJ"qsowv?n oTa&JĝjMKߋU5D;N}Ϧ㑹*D~hν>&n< , ?1ĔFCͣ:nSD$Y<b_KS"RXQvgRQȻ$M+"H7%ka#ǸW)T*ݳ=q Ns&!DEdBW}B֖jmzgv=gwm^c4im,l @;=#eVq|}NajؽX[k!>_=.=wR"Zc2(^\eK|uhRTچ#Gc8Kr oaGjGQI@f/C,HWL|רZmMK I+Z'BL[Z,A卞6DIecw) V/6 ݠ<%ϔCR5wMoX-Et<ɓƣ!Jש'r@< Ŵ]Q[BCk.E d<_ם| c"~s1܋WyľV/cWMVJmxCM4mN}ߪ4#CPHHSfF42c"(PULX\JU3djAΒW[1$ ,>o9x75N&iަ9UW^kֹDs\$ͰR=/u ]s:xbwlpx$5^N4j^WS*uN(T >:glEE1`]m:n,}Mx薶:~*@xW|-GR/9- 9$OC2WDS v0BU L`0a{ġN>U9;NƩ[qBfYQBLL܆ҮywL܌OtmknRqEB AQƘ4iL˽=CdmΖrm+O Ø%[ffc P]Qn)[kc|'; ;ZbCl.5Fqp2{P]M=acQw /kvQI7J<55DEfO-vqo]5@?VŸ߻FZ'iU7zi;d=jG6![phUo!L$~˟{L2\z2/%7ߎQ9]TJg*,~Áߞt rV`lT=zu&a*}p챰26S\Zݰxzja~tq1+Ys'㎛?HB2<'ݵ#l|snef*$sR<10S|1x-=25i TRppܬ =g枢-W6(غrk9==|CRɕ(ɣz ʼn@66$GUGa?gmx7V pw4w T/rT\[z#>Ěz4Lu%WrY*'UKT 3 rH V-3&5t1BɞlPVlhj4X돞VOg-^GE=[3qt~{RF;ys;> q>Te]ɓTK@ďCӺ.ߋ]rP{[i2/k~ry'Iu"?KXrLΧbkr!G=FCnMA_^[>يjhBO ŤgTWVG RLd^u;$:XN3u燝SwX)~$Jѕ<ZݫƩgH<_#ZgYi"" =:A5$K^[FR.dEoFI+37bY7Afd"~7;dy-ŮPCӈǖrբǥjyZX784Իvqm`d"ƓX4Ykbt֫Lȧٻ ^9Q5O+~|M@ahI%tr7UEz[&43'FV‰H1 X5sZ1*jmM=`{Lj= />v'5̮J2_H~w>l=G8*llLE|pp,ι&1'~ޢ3bȡkӾbIʫuz*B N]~hrBV8O ԟ<"ӆD*_w%ƷCcp1ݐg˻K}%\6{׏ n$ ϐO}GfkaipnI+2a12 iltdl<"L3j,5NVT 'I&{{vac07/?iB h"/d.BjX<)0V,PIUc{Wh?aS::T-z" m k(,,28u!z,]8OJ1.L6K%T"O:e?nxI4 ɡohég,]ec[K9 ŕр)z bR8Ol <^PWޞDN-T{4%nYk'Zos?'hә&!lF@KBOxOoM);L;vV˒NO+z:8oHȶ.K{5c%|#b-,IN_Ϸj/E0䓦[3]k0;.D+K9 1wE%Fu0Ub?B/8(P8}q;_Qϝ4hyǽIS;YAڽݼ vxٹ䟖zqzL"uz{cDlFU 5/*i#{"1 ׷l:qgC }jN_1YYɃ “:T4R6WDLnЇ 5{bX>e !+ 1ҺkDu [WB'T;{8z<<9RI .#'OOTN|Js}"%K%rʦ&"]pdj?y~hV7wb{MzSG6^bo8BWzv(KOju=E2pZmEbk )Ue&pfX*6Vyew1,{9Mu04$of7Zk.,6˕>_= ȃ=n"z %6'TIJY,g^EN*Z3VX3N[<=#cϡ3kLt+>2ߔazЊTozQ%\ɣj{J `%ّWsTjY8/. heckf%CڜR_oξ^dŮ>a/o/kxEt'*SF*Y\%'ltV1#+M8_|[]&]2g~uR-9o Aqn&h85M Sj 9mƣA`RAqaOr_W5nY~yu2n+|+%S#V6MXԫ&HHlo 4=_yTu92jfNGzpQ]98L2@TBKPX/=SkuQϬ ף1"0<]amhd62QxV\!h_;aNs{çwe+QfV66Cʚl:r6;%f4*܏GN9]N^[c5dQ8\ Vg&@Nd,_+eX12Yd YY>2\TO Ѐ%'l@*ϲ\&%ϛ]+۶J%sw~_T@4fT;>&pBLX; 2V)M ֢84-^h³9ᭈdXcb}dpBE0o{8qêں9G S7@Q貺˱gew˛]3}+CHƝDsqIX7qW"zqo#l->1E TU]aXIumR+F˽[`z xtjɽs@ލC%ck*C;́> JL͏w/>wۂP:lIZ 1׻/" o\fsGЫ'o^N<v1GM 7TŗNX$dզKDQ|ݒcp^ts唖A987/8dSX?Y0::yB6*BN_k{>q};+vȟNW(nQ:F2@}#koy4:XuQAp2VNK {ޕ'FrP5 _^O7Ch5ḢO %m5\1B}Ŗ(Wiz; jC`E[ #_c.i!Q /,ܩ&ӧO] ttL#{ *]iޤ %tr?mdZ/STTf 47 tb8(ze[ufQ4iFd$ *sY;&ʘٛsM ͰL-/YLT~ܤn|J"3EZ٤rLwGzC)Oo<7]Lr{<*|Iw|7}8PK0OEt丬隔b9 q]@_l>rxbpK>Nn~*܍R(8#<6fz/9$K Gw{5Uk;CUSpz7ؾ"]bk  o7yjդ(a풃ijs|&^,k%~9E1eVN#֫Ivww]G>{Oƃ:sMƽ8.:`b u\rq]3rӣaLKrYlIE5øxz)(]6K>? =WGNQQ89lP?~dN VL' WWnⷎ5#'AdgJ&ߕIJkQVTSQz׆r w[CՔdgȤii>9P#NAgOKIFa~x=4<%CϏ%6ĥN t%L矯]G7.p06;XYJ`PyzyMS跟?iw_4F}CM.M;8(u.~s'*bZ7 d{qf1)zxtˊ#zo3C~ D.0(#u#iʇ\mM|GZ) ȡl]:U6e4@9ul)LO6=6*j"eD2cNr20MKTWx(n#+ny,7LAt^i\5zd]x:{S-$94#kSS=zht5u?^.;:=̂")\gUx}\k[pr%ٕfHndWYH$GWdzꊜrt"Yj-֢>IM%|:^xqѮi' CGk?$ϸ껼6Н $ #:75~3Ss{fZWPRE;l_5E&HU)jyI=vLz!cғtMV=3fVZ=aM&eїB4)\έCV3Uu_TدMmx+r#4k`$A iC>ly*7UG[hGFWue;w񭳼 κ]:<ש[xY|؏0 o="Pw폟ՇbvGtoș?w_4S{% 7iȮ_sP ۺс =Dh60b|dZ׷G9EtOObSs"$L7+(-;=X{;z`Xj-Fg;d@I]i9l{.u"|S HlՇv_yVژF݄C?̮#i[̠VA,,eɶ"K133333333ͺ7*ywoyrȢ,8uOߎyۇȋk~Ʀ u.{+cE-I?#/Gb/k~it]Slz#",\~i:>r&N;mX{ uoμXg.\1e]ovן}أlbv]7]!OoRjzᒩȷ}+Wom6]j} T_7&\j FͲv}%c}3ښ7kmLbbJK4m $mAo­\y_[Wk}.54@6X4~QoNSf+ ~oNq)]}g㋳LIc\.b.d}=8ESĊe Wmn2Pjܦbyg.nn-X:o}?nq4ovյ%bwݑv6_akk)vgI-?"6s}HE["Eܫ {4 S X@mlkqrwBb_vss]~pY=}~TZ'®Z-xf5D/2յkז>ĸujg9EtvhuK=xݒa\/s J>i>)ۯW(^//X/lnYV+{667Ԧ-ro<7nnvONK׮]vmYē|ꈦPxZ^7|f:Ktʹw%6u6}}UQM₲Ms]WXՈI?SҜX4yJÔYX717kisrUWCwu; wxB6Đ)qŒ c[t`8EoΝ{{lU[g+mn?l+W} E-VǾ4SLXHٍ}lsq85j˚}5v:[R/$:bd9oo?;Fgl 5+?[vYZ^A2? RJBĿ4,L{ 4bQ7פH/o_{Ya _@YD|O/2F?֌jF%[Wnr)`9GKu#Zk\ݎǺւu#֍w/K-{ I̱EzrNaU엷eό'U~{AFZث:rm0[@RLJwnA=EO $g*o<~6rcϦ%Ζ w{_9Ԍ^kU/b{q,csc:۪_⣺v p?X8UR7I_yc_ر6'2OE_bl/5[y?Pۿ>/pA]?(]Rݏ?k.pGjXȥ@sw~Hsyw>ퟬtbkia +erI?UuWxC4>6[{Dmj7%1.]4Dl!zl"f>>Zb@L_c4#k M|5 nuugO!]vI-~fGVr=5I?`Rں`|u^w_ڛmkG_Xkvl8cof!5>؟Y4^ˍyh~x^ƾ}Weftߝ+Gq_zM[εGV/l1yg_Ss3vCx7Ը^{u jfSKˣ}Joǥ'#Κ| Uɉ/[Tfp?96KqOGƿ\/*z+FWū7XS3![J7ŏ-ZE7?~l9̆bٲpG&㱷[|ƷQ4t-\^c]]c)vejm׸yĎK>r[bg^\Fo/ha"p콝kVRt;׬Z~L2?#3YE2^)+{4[f;-[/jp? ѽ&E{fwfǩ[;)")$i֜μSCklkk:AGc_屃\[B|%썭J|RӬ_<ᅃ7,j/u@_6>Nƿ-a7טub뼱7~6- y;Hōz9dϞkfM2}5 e#ԛ Y8%qz|7s{Mߛ} ׻N֒ߗ[64w:U)1b?^Eprb ۷_,LqsC5_7q]uN5ߜn'(Ko/Dۑs(zχbgɷ6~n^*t(A=FuhϿl AtԾ{~eW ~2WWO%;O|}'^}Ϳr,-'Ŝ؟Zs-s>aE9Mㆯ6c_u 5ץZ~>3c!)oϔgWkO#+`J_^h{j;-#"7B8\ga~9`SM[7p#t_8I8vArg5WX4> !bC.4lŪ+֭3c[S| eͺ +W.?fdP)C_Wl6Sڜm݈n秞Lo|}K񲹦Rrֹ5(zY~5nǽ?濏s{ _sOS͞ڎ JXy)ԇot0*ڲc_5A ULb)c^_uњBS6)wKzSFf_Sb F/ɣ/j 9ÿ{&c.Q3x<x_Q}cGng-n zKlj^n,kwY+v U8p 5-qv]hl`vO3/i)ro$ƒOMmׯ])sp.K7/ZEeuQv[bw8Ѻt uݵo8^z7-k^7o ["k]깿ߚoumuO+Gŗ;Џٱw#Pҵ+WZZ3Yv?=dYD Ev?Xy\͈Rrؒ'%cEX^aQ7RW5e1#A׮khu-ׄ>a+1s#mD{~nVYX~4qFO9oO;Ϣž^/Go{2=vt/Z'KZ3h;Q:,hάwmnOro#`g KW)&ko!w]W $cCH= ;.;lصfp+腫/jsv1P%]kvjclQfSyY5T?N+֜kAm:ǽ!fk$M'եӬyj?I2RЬ&inM6/)oC6K|ޝs˅_45溯mn^XڥGΝݗ=iU=kj܅LYΛt^b!T.!OiZkmU@+yêe]-I+֍]!'ٍb޸_r/uW`ۿPjk-uYYZRCؚLj㎑-ѥrY-nu?oMhY?fɌ]M]#S}P*}Ъ)ΆıUÿzXŹc|[m A|2۶ЧO؂IO(w7ES J|)xPVw_>Ýׂ1;agl |x >`>`\{p/h1/l_6_ ~%/cX[?<|1\DdJ4nOL%~* j'?| v[&~!Z-o v ~Gu'~'Đۿ|=_`+|# |S(+où xw/wn1K+-;IໃޢGǚC?|O ;ܝןߧE|?|?>xD _ ~ -wAϫ/تc͎!o=){ ap w~D Gl}<~T? kJ  cZ?` ?~q-σ^5K3D;x1xd[{ীw@ূB1xfO?E?`[>|kJ /؊'n?~N CZ[%`ogRVI/So~ !><&~yǧU! zo/ovqR/E4_!:Gr]/p?⻃-/f_~E9Ë ~g;(];W_B?*_%~ﰖ}cp 9@$;sc a)ǃ? i%Ay.<+|Z]F|˳NˉVJkUBϵ&kub7߇Pm^u~9Սb7?U<^"fFBw;À|NjEx,꿻6=bz.Oj/&ajBG_\K '~#{M+9zBI=I ~O'3D{C>'G>/@<ߋHҿL;P ϤFل׉?x!xYG[!k$EZxo!KYտP}O B##W*gĿ| ? xmg4rlk&Zo ;#}Oqt}lGZj~" 0 Z_R-~7x#A|ń; {vlQ?y}%!׺ P։jo.ͯrk 7B-?%BO%/ބ3Kg236@pu˃?\ϊZWz@3gB i]n5~!9@=OS%Fėg{4xt?ں1{yj-?u'z.r랆^@|9P|g!>n5~Gw߁Pǯs^w1@|wj_=a/{HKbkwn=P7?2[P(C'Gn Pןz?pj kF? wx?'6|[ Ɵ@|&_F$^O&@zFqٴ!tKY+9m ~[O'קŎ?PwI?;-?k_ gPl1Z?ylkWkhY2j/keF_A%;#i۳Nĸ|}Z-+%k4ZėЍ+v,Ol5)A3(5/WQm 8O'֏ßH{I@_?R^S/C'߭/0ZS$u#.vg_ S7~g =YzQ~=Q5Fu}H;q;5tej]*v/#Hؕ7tE^_I|'@u"6B3Gˎiѭb_wmbz;2]t=^E|mHQC<>=^Ry?Lty}zJmO$}$ X<#%@=tY7 9+Xby% /'n^{B#|>Nk$o7H31ny}zW}Kk_ woHz!񝁃)'b?PhDޡ~[/j; `9A'+u}QC"؉l;q{xB]y&kėMCOmQ{[?> эSKpׯQO"Mơ6c_D56BG| ߟ0Hﯷs~iT oEʄ>L  m ƟI|5o gG5|^?1vK;G]͇? MbC o_ίU»/SFO#ٕt_+Bկk_ns(/Cw#PMėj ӻG^Ө}>8JB͏}e*B@| A»wn;ǩ@[m?PP3k XB;RB^M|P7Lj߱bzՄ_C(v25Nk' jN'Hw6ߍP1>݈?ƿ;ƿȟc$twgKM#MGd,dms U/u^wC"j 6''|x=/mn4x#'jDBo%_6?PO#!vk;I?Pw}Wpm&pwϖ?8_6m} !?Bc!1؟ߒ!~ u~ @>_<+RBͿ~2sˀ_}-ϗzu[@]^o?2_0~nK%뺠q qtẫg4߉\B_6s[)mҐmei ƗgܶsZϗ~Ћ?ߦ뽫W^CI$Ih~RxW On!>B#O%bI1jN2Zcb_Fy\^oO9ηPlO!s΀Pt; ?&w$gb5w_JϹz;w_(v1j/k_ \Oseo _powg+*O+mBͿk"Zk9$7q o;P{Y w/y_Tpnߡ{zW a&xeCSbLO狧03gŞPsbz< b/_IjBb_CMkC_'P/n!oF5[7;Rwއ/B' Pc{j"c{Rľ# c|2O@?pď&>iO?g3/`}C}/i1wc|w> ]aO3Ib:I@}F֟DgwZϧIgbXg^g_@O6~㶨?蟻;eEPgrVL,?ﯹ^bˉrUjZXg5~ZOz>L9ZBߚog_K|~ѿw }F$N?P Ʉx>I*6~~zC 6ھeN  !ֿ^zߛ2 ϭ߉&=o`/P1Cb#B?Bl# r#{IjGG5Eď1;y >O[b5 S뿙b/$%/WsĶPw(wK\ P7%b ^#}{BW@| O%^/2Ə%ȏ;GW g>^ >H;S7xń:f5!ė+(b_I;kÉS!v :~GF5QF| 5##{BȯN-Ɵ3_(y~-v.9@ίsn3\'vՄno8_C/ PϏ; ,.zBͿŮ7Z%7;^*v9 5?.kˉ W]?B͟#}8 uh_o1ېwH%t~f5yG>5?y(C#드'P(קG33IOgSrM4i3~{F9}C#>XL{Bφ^H|)P?w%W r^B|u7o F ?%]kw I"y/B'pχb?PGz>z?qHpBmď~ cXB/ď?񒇉? 5O|oC+B;6ķ1'= !>w$kYRs>?I O#^UIb%ezI|.>_OX-#D&eG5~Q~F/D>+kqRI@?qm$3B$ZTa }*!wR%iK%ßLSK|6P7ITgm ^oxBߟMr9 O9z߉l +߲$uP[A^w%HIz_M+{^ P?-7XߒDvR;7_m1>?  .Pύ^$H篤Qbc/!*iC_ W%Pc5x⫁&MPkb^O"[,D5NTb3F5#Bi~|w'oE|O.{ҶbsF.B5W"?_TbKO.m0)Y@zIZ&\"v%:>}a5eėk)bWߞP_!W_lW]ƿZ-C!#~.ۻkOo7h𪿑&7Pۈ ͝bw?PwECw%_5C ~p߃b?P! 9N{u|{5cߚPq|?aԟنP.L_L _ ܑE_NKz/'5ʯuc [Di'ҿG΄ڿCj~Dzn !?MZO"ZO}_ _azC>~+=Y@>~'$C'>~P׏EkP#%B%=PWA|#wv%|+bݑԣ~NE0σwiGpJ_%WsJOΉk\urvr b^?Mȏd9%¿-GI^oK|o;B_ivKvF~%}|ߒ]N?P =_%˜I ֯S^י"B̥doz]?PC{ XGjzG5~G^oH3cP ~C^%_K>$Y5y~;$K1u\W8+ EOh-?nTS|u-7Z~:Z)@_t#kAA^oG|:\N!!ۋ`5<⋀:n~ B?1ߎPHl%e u@-+wkˉ';߇]柜yW _K3Pۿa6?PEMON5~OWF^F~N#> 5t`_xt?|, ':xwGŸIzwzI|Pχn|;BW;@|ljb'?ńZe)ė4zfB|y3[bg32ZYy?[\ u7QB_JJ^j#gP?J3x9>H_vBH;)Ez.Wt~ocx>{~|"g'"RqCS!GCw?&4^):ßYyH2k/?EtJ77Tb=#w#g!"Cq2_r!Z1F~ !x#?C]|Ctw"rEB"Bw"PbDWE5jRbF.BG_;nc~3=?Kz7ʏ )>b7z/e:w `5{P(v0= 5?k '\~#Lk# F;ᄚD5F 'ZI:~?4jN'~POp;m Į5?G<jsŮ4<ƍb¿Pƿ]2BK#2}ˈoGB;Z優?`?ˉXP!vE@qb/z_w 5=bz/5@_q%)_Ou^?@|# _S+_S6Q|/Ϻ)O?P(ߧ} 53Fyc!q+b_˯Wž15⫀54> ;B7ľ2Mkqo&};7R<2S>3Zw_1 u?ky? !w_7ȯ;b?Ÿ ^H|>χ~K u|~}_[w -B''~ .zLM6ﴞ ?X[bSD5~[|Z7PO-ƟL&}'9J'ZOL ŗ6B-_R+ R`O~6UK"(WjJSw|7:Y"]b$|qs^boTYS;z{K 5Ej=e~ėɨ_9K$S;_ϏRev3旬 ߕ.??w^ ~Ɨg$D~FxOL;uCxt&.78/1S?Pװ1Elc0>0^J] ӁuLc,?me54k 5t'3#T~>oE@~ : VΥ%#!ϩۋ3x?~;wvOPl1=501=;!uK#QK u@}woކ^F|=$; :6G57~/~ߛD/H/\w$tz7'ο4x ;j">x z][#χsؑ%9Z?"pB=?#O95vtC?lj)X~/vO P(v2'E5W4~.65 xT3Ά'P?Ybz-l{js΃?Ш?K~:.&?.!~2Hr+ ^wjW*'ď$uďz ^˿u|n$xBja~!G,*B߻4n 5=b_C7B3ʯ!^Cw͍b˄CѵOuWy?Ms?W;K—F瓗O+bMW>6Z׈.&5@~xC߆^I|-Kj~_Gſu?~. ]'7jy83#s#?X N]:OMF;s 5}+CG|PǍb?_ a5j~z ݨ7i_C;.m0M@}>u"5K!/Mΰi H|O /$_BizB|B_tZ&5~F^g?H1?7BJ_(V 4BY#z_Lt_vZj|95z_FrVOp??䬟Vg5~%;j|9 !WZu^P$}!gZVg5O%s?ŗ = }=#{ߗ/BX_"@ZR ~0o;?FOo9m#/ 6BBͯQz?(xnn}O|OIgIW(v'_˟bSoO9%BH7BL^";p4lC1Gl{C"~,Ɨ4m[j~l#~{jxB_S@㷐xͣ)4KĖ?PK#Z2g˞3sueI;kqGe/I[_= _E|*Yv5pMB6z+jb_K.BPe=f֓~O ?{po_i圝/H+?P^0AھC?xhO;\'<#S~)v4v؉^4jcĎ"B͟c#8?w1I_  x-\Nk=FYD{&/5Y?J~}PW:rC/$AB/cv ^?DԾ QW] Dk<? #OߑPc jO>gzQ ⿢D5q?~{w[k(3 u|eO2_I w)DC"BwW?*BNEH;DB˚фȏnGE`t9L9=ʫ>I6|~CBjE_}FH+D?P?t/{MzӀ ~Lo5~3 ~IgF3XXC.:_L1B;_ \ٲwP/{iHCB{+)6k^w-ބ?}"/g  6:?F5 };8B?wO#gjȞ>k?ClՄ?3#퀍 %}+;߿oM|govw#6Bn3ƇwFhC"$=U/~6 &cbŸD G[ wW3Zu}vFl-ń:>RX3@z~K Մ?rfKk݈\j6G5F~b+< ߨ~o4w(?;t#gO[kO*gcO'8 ? B*8Ox#:AtCH|>GO;BBͯ#|q\A|L$%& ֏s΃Ps#<](bߕP_8_&v5zC(b?P_?8 v 5z[Q[nGB[^N f7wBw^C(b8 B$H_>R'ŞB_ ^Aث?D_kW,C-#oF5[k?NA{zA~I;i?/?17ߙ燿;7b}د^G[ߋz#񹄪Ũet?;F|!*!rKjBzŸ'INg 1ZK~22z߇r>9ʀ~|E5~JQekF_ #27u0Rl~;-c4=?Ψ_=.ceL 召5珬3 ?^ !L`@?S#Q>=9.>Gƭݳ`HRl--i@|6b ߖ>dʘkK̀>?'>+E]R,$>"%#kqN^_B|9g؎ gY^h{'j_BWah !3v["kv7Zb C^o$>+o6#\A9 >#{_^bz-oˁ?v}@kc!?ڀo|q W:I}#>9`&bG0wkˑb'zQgb!}N@_^ 6v~:>N;N;k_ ˯SN2?_ ی΁.߳#}|>9C@#X!ɤW^;ok{ Xg3.]&v=.~?WbW?8*kj ƿa a^+v=#.B7AMԾ}e-w$ N[#$ ޟw ~|!~B@+<OY'S/ 3s({k$~k\ʿ=e5#@(>OQd蟡hϒ~W^w_\_ _\(2;w绗2ZįyE5WzkzF֐-jmֿC1;'|x[cc|bŸbz-C3|'O q^b?ѾDkoO.koOwb?Џz9g~9.O{>B>󥻿5O4?cgV5?qM>9䟻_LCJSO>Cz>Ȕ\ R@l5bUb Ư&>H?Y#V ~@߿"(?Fo@OKhC3̗9䀾Owg̮u%XB4`,pz6'e@<ߵrme~qEg!OW?u_D˜P/ug]Y(s8:kW[]Y#sWKz>s[#k]/ZQ>3MҝܐNh.v3)}À^Ɇ^7Yk7?C@o?N{;>B`_:. {utϩb?n? ~ P%vへ?ksϏs·r@??kܖ.Ϗ #"K.E@E5FV/'!`}p9Ј# }x&'w;6OP~ %M|P/7~u@?~F5}F=H ?d&6}SkbO_ 37{kO_ЏSb_Џbz }gZ~&"ϟ>24#⫀} ~$B?%' K_ TžH@_o"['Q~r@?F5OF&+ߔ>o/_wMϷYmk+DCZ_dee_ 5K֌zC3/S|i`V cg,Yc !)oYw%MVwȒ~*W@_"k"{GRȿJP+$BKG_Aǯ4g4kv!}?#?K;ϯػ:?-ħusuVK~wNr%u! HsVWw ՏQ>=H 8ʗ\00%gFz߇XgWŲzߟcz׷Ć?+>?fə?kkA`|1?F1?' K;̦gҬōWl zw?S ߟ o~;PdC" >;kC F?Lbz=H ^Gg@_Gg1F|}^?OEUjg!L ?~>#b_9W+~犝u-k'P\]C@_ Ů0"] >.kK{ _i/"?p4Я׊=n5uď z;O vF -[H?)[6ǒ^yrX|p'S3)Y}-!~6pbÿ0o}zQB- ׿a#F-"q%>w+O) ^?MX?s5x|+~e'z e}*  ߟ! 4&` ק~7}{Qb?z!è}ޯb?z }*crgb_?.?_}. ~|@~)+OחG^&7Ƈ?ϔ?#x{r@?? ~*p0~*%5eУ|b~oK|0Cz?&[֨ Kz>t<3g7?r$Y8;Yb &^Qg\so_ٲdWzG|瀾~rή +/Ew 3[2C=lSK ^%WQ֗ߙWP W*c|q[푿;̥wg2c o$XA];_PlɵQ^w" lw0C_E\ A|>?e{{o@]{%pكϯ'{F@I? AF~1>F?0op#~̏_b~^=| KO0"E@+G8+4ėlW4+zs oU@ֵL;;#Bg5doE|w׾Ŷo@~9 d7Zo'=Cύk?7,/$~p}%όGz }. ~'[S,mm4Z uww?~󇵆^BJwjW*BW"~-ou@3g55({7w Mb ^o&ڀ=@z>u~({o7Kl_w /}i;GԾ?Ę?ԘAd>ÀGOhc ^C"??o{O;\`x"_ibg_b/zE*bg_Pϊkol'v/v ؟ƿ(we ~!1T+Įl@\)v"~p2b?%kn6Z_'v[{}^`ԾmvmOI\bj=b4{Ş4>we@?~=n5įAw?=IԾ'Ğm?) ^O_}1Ɨ翈X {fO+ߝ^(zwVBx?%3H 9ī^OC0+?Aoi|x_} PG}c5Wb_ϏEl57ėV{`Ob_g `/_~w@E5Fr79 7G0#~@@NYڿE1nr/RKz-2`m9˩}@߾Ư .WW'|- C9ŸP9O `&x;gu|P'K,k:_ @52+]g5{J8)`L/YrU0'k]N7/Ϫ9 Ϗ򬛳kUcWFY€^zq9g_ ?v# 9~n~},vw'gǀ>_ !~ ZK_'v}k7_7 }@7E57O@߿G5FyK4{_];LBr@$S}Ԁ1={R>T ث^(O5H_l{Gbz$) ^OS@?c߉/^ ;p0b/?$Ͽh|YL+ T _ϹwzryxKsCM| ~?.ǻbzbϿ>0x(??t_}60;- V{_2G;.~/u|%s~5oO6? 1?ܣJ<Ϳ z}CK}x^T|dObpOL/y!lj On&Y@z_n@1Wr2ks/ 3׵!UG1a)E/ 'k^n1j-7x?:J]sUWPRk2|ˍ3_A+s=ϭO_7|o|~f)}~'>5orev? N/mm?7/}k1.FGikF9η&w#H?z dszߋx煔ܾ/ 'B/"~/ wHb#/W#wLCG_lG+c wtCg׿cPrE5x;RL~&G5}t?-Rm 1r[e5ėi~ko3l<>BJ_ n}e.7݁R$B!~9oh@~W!|}Ul%@:wؾ^# ^l#5lkķmw@"Q>8ηO@=E|߀迾_ܣϿޏA@p(bGz-@%{!wp^B^Q ?ڟhG!wŸqbgßg|?=l.b'_Зؙ^w2z)bzQ>=9η1ĻMs;swq>صw>}\ v@?p2C`5ſXRkzQ>󗑾[lwؕ+IlעwϷ7>ȽQ#Co"O7~7 y@?}`5W}@v ƿz{w狹wǀ^4Z=wW~{Ğ3~SC 1!'P{Ic[xDIC%~J@1'ǩ~O3?C;-/Yc|Yӈoz@%#YӉ׌:ۡ[o0ƻ8;# g X |S/b>kω!^Q?.OUO|KBX?~ K ݀(b; >@]?]&=B ~pboQv^k'y"ﴞ:?Oy:"?;P%2Ok QL uD5~1;_@<_hrҗP'|'&?*XyW9k3f?yg=j@y?-3H|6P%}^׉R`˱%B|=O%ozPdsE u퓵$?nZ7k *`~s0oK &?yC"Q~ #3? ; Cz+6| =;k&OΪy/_ ƟD|o&M}@8k<9+  = ǀ|9+hwM) 7uk+ }k#:'gSo9}"fΥ&vok;ؽ/ =z1Kki@A#?d <Ğ߁~Iϗ/\~`$x/ 0;!ߗ>2eskU | ?.&}~oO{@F2Occ}~| ^_T^"P?_u/Oľ?+~2Z7g>|+=.B7HOhhC/n^?/mӏ-/]ڿk|zh /l`NTtsE5~Q>o/g+)8f˜J@?ħb+k!ZCˉzS|9W_ǯc5~@z/_zoo~M^# H3I~=Zkz~'_ꚯ6F5~Q>OgPJ=ׯG^iLP 5_;`~PFŸL9ok5H3y?珁??6 @?z?~|E5x+Ħ_,C_MS@?"Q~'gQ:gߙ[ȯ &}˳FM'ϸ;gu)>@}w-$/rC[D|)'2Ko_jW_A|*~YzŐׇbO8hOwFl-#_K|a@`ԏo_&,w'.h/;3B">cԏR ~$(?\;t>9XhC!>3g;,B'>;e/.P??_X/ קN5Zė~2/׏#$|>JK6ӑ;%GĮ?-oħ];}F~_@"K](v_ ],v)}/kK~qg__eꕿD.v> !?*8)}F|*0v; N|xؽGaC%W?B0{sdQc|X8x}WO~`O  ?L?O?^?_ڝ %sZyYN @=;J|M@|ҿA|c@}~C|~|ޕitoj/ ge?U1sszs~_oI__57O6o3;L?:0[zY@OlYWR%>XBMK=B0ʧ{m~[gwHbj OY*})z_*@: ~ ^g_ @ zcO8߾d/?۵OΪg헺z_A|0ƯR܀Uz_mOq|\P~zB|}V^~|_K3׭;YA7۝T E g^׋| (__9^#XA 2?@l !7`p^!#H!6k%6k1F|3Կ-v!.!NJm@?ljj5ķv>A$wb^dO_;n3:w{ ׾΁ obz@ob\Kwe@=߻?_B+B⫀<>]׀>z݁'W7oUZZGs ^w-Џ" TF#?F<;?}ث^E|6Pg?w y@l5W+i|#:o? {0B{NGs@Ğ7quw}$p4)gz3F<؀> %F1*[α蟏D|y@TSx>?7#ZOQľ\Ɇ^A|9Koz5&owi߉~~@|]~}uDK>~@G5F|8߾5~a+cq[ɔCz>-=0 4 =^Uk,3?Ws/W#k\+?_P0v@ڟ ,XXz_ׯ&`wUa%=UD~+5b 㷋kZ|߁Q}Ks1]5F~MONu&~f@_.ΥZV-Bn2}0wHgEßϿħs} 7(BL|>¡b/Y8Ll;C_Prp }YpkCGp4C| ퟅo<=Nfz?>@? M@"Q>}ikǢ@=nK'oGh''(hc1K/Ií;_ ~iȏeЯC|pz {zz⋁U:SA=o#5@݈ pwݼZsWo/SEb'/ >}3xG1-gʵ@/kAbz0v a8D0k=0|7.ϟd:}YYx'?Lj>O)?Oko$So,vϩb{8M=z$eF~1wg«Ůo.{kk˟n>ϯ4)b7%ث^L|W`[ngX|bz]Wp;`|w6>?w{k?8^}zQpFc|F8Ȁg량k?9Ϗ^4xտH)}dҿJkj@͘SI>06֟];> Ԁ>?'^Q_؇gzw}H|Pϯn|?1/ Z`gw 35Fa _Sv @|wb?7Ed!?? ~I 19 m)?%ՏO|2ڿ$4oQc|> /ϑ'>?i|z3q^ ʄb~H쀚EH+g٢ ,"٢C/ P"YTd/"}Y@}~+VQMY_B޿*3]Q9zkruZߊDSW%?5~Q>F[*Cz~+:ß"9M1Z~=E@z~+5_秳I^7HoE֢7Yho[EP"+zߍ..U/\Q_oQOⵞCr&,^C|_tu|X4@h{\@?!92xՏ"Ā~~6k"Qzx#'~1Cz-.6R =;kWh7[ CۢĶK@_*Ez ]|[$g vb ƟK|~ۋ-7wEn·tޭ];-6Z|@l~!Ȩ?ߋ W+kShw[Ԁ6Z M;;G5.F|f#X|~ o ܞڿIlwz-w{&eߏ֏~cYHCO >OGh5ߏ8Ŏ7K9x̟C_):E*v}F|7wN'>gY@_bzmYė~g c@߿D5F_@k _H|:Nb?-ڿ}].P??u}M^9@~>sW_W`5Uķ _-v-{M^_kO?9n3wx|#ܭb_mg+} %P2CC>]b_zzF+z~A;Q{@=yXiC?B|O`X^?N^Q?|q#X,C}ϋ b/ +O eO m)[b<_kw_W}w ('?GFLO1r@?9C i|忥-dxKŸ/ħutbß}kC\`9b_ЏϟzQ>+~ kqXkDW'dXƪ88kt=C˚Yzeߋ\ocBΟ|#Y_^U| g|hUxl7%_iSq{wM^'>NXW}SoC&Oc}w)n]l`KOCt}MW%Ÿ`5N:C ^7}#>+>_^Z3ţ?䀾O ]T`XgRVrs/^ b9?-Or*~@_"ZݕPl1%}01@޻Dl }F52|po_ ![ Pw7˹C b9/o8_~Q^o Hb~&+Cnz*`{r|/{F5^}0ƻq_7x- }~?0!;TpX^É?OA LN?+,?쀾}'z>a*OO wص^E|:P_7> 60;;#vyb'}^@}~.ب_>ſ_BJW8ZMh 7 :Po7>7e5gEVW 6zN~ N~pw o: wk{ѿwc~fo?"{T^,`>bO_z$E@sX3«*Wݳs<@Qe_}L|S@ǀ^k׈ E9}{}C|.{bx@_4ھ?8 }o5GOΠ} ̀>'b_z)L gy^aO;ηoN@{m;L§<߈_зwnKVo GdCsZ܄kcoC%m7>ڷ{@O1iܝL{9>/0۞ėb<C:^R ?\Ԉo5~;ⳁ6_W{c Ư#Hϗ%>B~٫J>',L|c@?]PoJ糃G%4{X/s~A$?P+ñ;J@#?ZJh~>R5;䅋'ϏWt/%4| .Pxno[/xn%. Ā>/%>)`wg_ˡŮ?3^%Z܄0<`~BWl55ߵb#}a@?'(o2WDo~q~|J'Hb϶_I|y@?w=b_Џ=bOz-^{RW@~ ~_~aP^?lǨ}3OQ O-7?=/Luugz-e3 ӿ | ww+ ̀|F^Il6Twރۀh5{o\Awz;WPcWQ^lϨ}k@܏Ş"~kCwз;c%GʏD~~w_ [^ݘͿWj|l1_ z9@=&Eyէp9C:ߔ\/Āy'|Q*sz_!u,ݛ9~Stp,S5׿ _J+|֏JjKL^k/OiX-}kZJ;Pħ7= \Cy) :P2zzg3]ĺPϗ]#Q?u\i_sÅM|.>.C|2_ҡ_ uTZ 7 B$*!>x W: eKHg> `=C$ؙgcJ d%u~*4 ~ 1 [yoD=nbjIPkwןbK%b+ o)t؎I0w{r][uYtK|'g5^B|9Pqcjkc?5j|g~W_?NvHǕn [6o݈rob Iz;}~6iߓe=Q?q[O0 CON439P k\;kÉ ӻK??9e(Q>1cDϩ SR^a&4不~.=SK3,Ⳁqعַs.4Zs/ < ^瓾$_/E2`%"KP.kKϷ/>_/gƿ(+3%o e!NKh~_+v=9@^k/׏1&KYWpw_0V;{J|w ח۩~%c?a|O? Cbz0c^?F|^@~=.Z* o0wO=g o?cQ?G|}>s߯%_w_!+b3okzQ>}~8߾^{ֿc_/70H@ ^_U)ieB81v&xz;O { TQg3)B6$7?֧߉VQ5_o%X ޡ_N%?jS twXH/|炿Cz~/Z]Iu 84eRײ3]&{uY+!>+eזHPwYQ>=;=@|WVM|Pjj/ ]֎Z~-O6/ 2Y+ccυ ~LIJH|*P_׆Nw">ʖE}d/b5~7⋁XO+M0'FY0_z߇xTb:=n5@~|G5| g#өGF@_1z-13@33?ȿBh30?/0Vu}lJC"> .?>km/Ķ<߹z=Z|@lGC_NHl =_K|8߾}Fq[?+_wHϖ j@ Z@?kbwϖ#>HϖI@_= o#T6_l_OԾ>^ħ7=o  -#Ÿ~ħ~l; vH|~@>;H`W/ seۢ|J|1P׾Ďw}c5Wַ#Ŏ.Y6gKNj'><-;A CO$K@_+Nk@>9BO![@?ݨ_7 Wv=X?cs9 <]os G#ke?>΋kBe/@7]m5%O_*v93,B/'~f@ʨ 5"iGlt̛;]Po>~B?mbw_{>.vA|I@)v.җb(_ ׾{Po}=l51ϏY2ga?B;c»u[Il,w=!@_pדbz-) O= M@ˆ^?K|>sb/_#|>lWѿwI{C-n}|SC">'ػ'B%>/ۨ_+O'?_ pGb_Я_?!}' ?>kωE }}_'kԯ鿣 DIPz-a}~k߉27<?"孌AEB|˳Wy*x]W}:MdٕYz*/$>+@y }G~%\ Kz_A|)PWUz_mO:.>9G7~a}=x}VM|hqr5xt^.*#O ;y)n@=#Z^~\ֲ~|/˚PS@^4BK4k_G?-oɆ^%>Hry+N@z?(WBQ>B 噱|kO4k;nnZbŸ o6bz-[ 4ۉmU@?r.k퉯X>>b7z?vz@l }bzF\/[ z~)_K}FrCnމٙA+V?"/A^۷}[ (hr~+UlkubP_#z&~I/\~O Ϗ?5?3p$>"~z@_}IߏoF@??Q~ w?m)?; b¿S ?E'vx/FP|ρ_ױeԾSKB_ʀ#Zį g?x W~)u.k?O|~׀>/ ~m@_Kƿo]@?.3w鯤>_eoI-zu71ߔ`#n s=x.7w؟{ax~[?{̀~}qOzg~٭/~ K{Wz5(}#P|w+S%B5ƟP~%_wHϏŸ [FG||ME2uHh5~25u|*R µ!u~Uz-?:`0VUd9_V^g؇XTh G5~#)~X)%z_J8/kaEz_ED /g יu~UF5~{cg_O5+*Ͽa^?oP?v/kZEKؿbXC{_^O^^F|%qE~oC|z/Q Ӏs"|Jơ* _3Z + ^H_h|_*&_O|9P͟ bD?k(~O&}{/{U;7܎wHv?%ħsh|e.W̆?7o߬6@Jlm-km/Sm_Nls6o/Mb_Ͼb'z2<"@+|;bW@??ލk;`ooHW@/PbX@>~?70⿢><1'wXd|G~0W2zgϯ_ɯb_+^;%؟?I_ Ң|;+~R zr*[%z߆: _ntc@͏Dk$|操3B;]Z{/ងfTJNUf *%*K E|_~RJiSeķ K]+UWPן/0ʧ7m~KѿwOƴ ,[I^WǗln@oG|^@3Gz*_˟z⋁z>yR)\U@]*5Z~@d.Tv1/"3z>uuF|Wv'G@~^ /]"^ &~h@_>N+IĆz_'gRbD^?Ԩl c8 G(/H헳z8WPj)?^Lm瀾&D5Dw Sa_4WwXWn Yz-165}m׎[p_Bŗsv+Egplww*%*?-_v!>7>2oU^뷚B U*~UkuėwvgʍW+ߌ=^Tp~/sJ@߿ ̡?D0s;4B;| }>WyQ;RC"رW?&B5;ڗh`|PBϩ<]L!vgYbз?(WK;^@|!B ^_LD0xY/?D(G[ߵbß 8[h~_ b7_Џ|Co":o& ƿvz! ƿF/un狻"nEl-i ?ASIV> |w QGT>.O?ǭO= T^?M^Qɤ /?5_U(kH?-Ͽ5Gߠϛ ;_3k?'~6p[>>??}?8_\Hط^F~|?U%Kz~;@|µ;w+6}?D_!~. kw'kjZ?xwϿuu~U5wi~)F8nٴo 9`# 8<!Y \ JŚ /#XE]U u@ͯ*9KW5z_I|M@͟**٪:kjVV_K}~7g}>|q[/M;Lu}T~>~^w%>??TɞR?Tuk=z_ЏoM|P?ܕ^6O|z@|]@??_D7Xl(1ھw o5Zb A|w`)g T^&_@gԯ酫~@~~YjkIdF|5 }40P~ 뷕߆a@}>ppc^lOC?.?w[SzU;z)Yj~㷘i=̨4/\jgP?uB_+v"ZoW?x W }Yjk>u 뿑kM;k;~Oz^F'be~?Ow߁bßϿĎ4`ⳁwa;4B3ʧU]>?:b`9hc^?J` ;ko6Q(v2=)BO6ʧ+)?y7,s?7/D? Ʉ].?.kˈ/Kn|/Ҁ~k+/Q\/c@_n7F⛀~;qs^bOǿ>m?"0 A' ,뿇4o#zQ~)U= 9ǓW*w3!}?}C/.bz@?xYU+b?z*5|ڀ>{ })"[{}މkw E-!D5}>zcS(b_?5__E5O ϟf̟g;w? ѷ5OⳀ>%|+Kjdi('UW_:$j Օ^O!_P:-BӉovg9gG5~C)~X!z_H/c]]Ā>?J#z~wDxC}ݍ:KX~Z\h5~@?{rV7xoDK0{ m aU;d?J|0ɥ:gY@}{_Pjɩꁆ^ߛ€z?PG/[(Wa5?\n"XM?Xl(5}c?g0CxS4>V?bz- Y@c_8 O|!W֊IƟD|%gղWO}@_ً2:u3f#Ϗz?([Qz63=#w͗tφ?5b+O g!@?ՋŖ_ЗDlgC[J|)or1B`gj_C@Sw|7*]#SO oWӁ럵b&s&C_O|~@ohH€1;;&OYb?}XI]_^A|5P?t۞b{_Џ^{3/C_;7;}P^L|^QnB{GqQbz-hGQ#v? DD{Y^L>)b?%S#43|lc|q)!~:˝/0/t@rXx%}w/k.'$_U%׽?}sY5@=_]#vz~sV&C#n^FF|o2c@*{.|9!v;ibz-N wM@|wC^C|>b_"~|>?dGп%T?.$'^5I⋀ܿO= PǭOl53)bsz<zKFx_E a& jySC">'ػ{'B%>/ۨ}?/ׇ>"?>k_ '? /N@>_~-%w b::jzoI!l˶d'$aˠˆ\z%zw^Rz{3;#i-C/7[gf? 0_ib=?A`4Ɵ=/1 )(OSJb3pGȕ|\l)82g/0S? QA"H\ O/2?[c\DA= ~?`e_&}~9U0&1~lQ>XKw)jE7A%Z_̨yJVK4Va2F_zyJ4(_Ǩ|=%ڦY~Q֪6oBDg0 aA&fDq'ЁQFvyJCmZ~|mB&13xi\a F]K(x$'ΨkAVa vOۅZF?gi_FJ~8a)(UŌھp O_#%?\ z_ƨ:yJzP:4u7 QC_Ũ&72ЅM?tB8fu Q$#e O|P> b|Q3jg)>!/F8֯A0 ᤁ'B~-֟ #~%?E^|<'`t.wA0SO,DZ+“0~'BxA"!</dyJ_H+^_ɨkxku>K~ρ<_H;x.~|#χB2jy OH NB6Ƈu?&*F>.jFݿ_èIZD_TSh}Z-.9oeYyJs0j3O(_|/C"c|_|I~}Ӡ?Rۂ3 <_ȯf?6د+iJ~W?g%2SD?Eھ~3 _x(trDO~<ջQcᏂgu ߈b1S*0"Q)~-|rn/fc_3zF]3o<+N%_+<>od[1!gTl3 +y W9 sWl1SO XKXɾV/X O/r vbCvb"od<"#|ƨ|;Q>ˬ|!y*_!V~._/C.ʧp_ΨW O[%׈5 ZF]C<$ obkq 0-f ~يOwuタ|kdF]T{D@gV7TB]bg M"-~B?Uw)?Qй vD;J@W%~W8S; /ޏ"G=_(>O>W+lW+u^+)b{Ԋ?{p O; 9Z? y<3+np$+)H ~0_H T a/E\b !!F]<4/nC%D_OA8>R{3 1Ae=0~ֿ^5S}߈xh~`^F_)[h!1F<\p'[4?^qҐBQCZN_u_P?W<ޠ_R.TD/վwCx/E\&/4SO|q?+W<k= S_H;O _˨3w}9Q߳)U7_(g_+Gm_+SFAt;ſoo@+~j?oC.?O{>;LwYNl |%`DW}?QBA>/`>`IB~!?4/_Q_HOe_p1jh?)O4AF+ہӿcޕA+V|0~"ͯ<|_LD?K?Q! OI j/C*_ȨW) ~)bHnŷ0Q~`%j߆]oeyJ[QN_?C# g_c,Bo>m-dj7 /`s/DFy~%֟_"+VFݾ|Q/g4>he#'u_1~*"wվyAHo+uyJAl'c| n9S|qH`Ō O1bӾb?  qe<ߡ?⠯C tF9ifa|FZ`g p(?ȄbrFjyJ!_`af/E?j_Z<g!ZuB]C+ r/@区}W8S!CV/Zl߿!P Ј36@h1SHP'!}ɷ`]OWb?q(-yJ?&yt>A;8/faAҏ ĥ!V` O ĕ"}u_˨o(% ~%+)?Qeb ~6"OT]a_ O2S;!N_]/bpA-4a/Ưd{<א_B Eo-]-F]k \񍌺B8d|n0yJCakA Y'oCQU0~5nN7S]_è' ƯE\' A?"EG!܌S) KʨۯBoc a O RF]~`eZ)[ _&!Q4 W'!܎v c '?vHwb5}NIyJNCA}]˨ Z?0H)8~yD>OpOA3Cπb<#gBx6/d,/4S"F]@x/f\yJy/_/re_ +0~&8z9)W~|+!0ZunU5SBFk K^C$zl#oJ?-?Qϛ!| OEi~[?k{2y;wb?Q?j? GE_Ō:/AAe/A맯@0<5C|tju{lN=#_K! 2! g#[ T ~?1x_hɫBx +)3/B~?K~pA#EՌ-_S1/ "UA7 UӐ_AuG3Z?)? QP>?ߊH;5q?_Ǩ ? OCCcez[!4S?Qcevèw<]sCTqU?Jv ~"鏲- ?@2SW ~Kc|=#?9S߀_:oFl{- uoe_09 O (?d(_T$ƨǗڄ|)GVR8~ยy?f?nufǨ{]/9 ? TO/RQK O{!nW`&F];SDZߪ!/cA/gz`B#Fo+u O{1 ۅ~FaBBbANQ@w2j |QQO1}A!? ϨMg|OgA|(ߏJF] ՈO <Fi|ڷ2AW9O<c+LTۇxչ׉erCWQ/`_ OBDZ(^]!Fu~E*0Ʒ0mrÆUGQ#/q0퀰 O_(wT1] OD/վ!le}/q7'o(D$QEU}Bunb<)'C1aT} O_!tW/]ȨoZSyJUH&~-c k?ZWNAFZW+"Rt1Q|o|3b\-_èV_Umށu O{/CV݂Q=(}އ71A>F2}H7#}G1QG|5gO y.^~`RSC^\?~1Q | O^Sg/bF> OѐWM(gTU iF_ OC{ 7}#P{`]4S|%?Y}?ٌ>~ OPsiV?Ō~ OP?qNq`"E ~O/=/B=u? _(ٌ O?,4R uA~|!_߿Z__>b)Go! c%\6(8Ku_Wl j<ɫ<ڼCiWiO7bd%ʹ?qJ/2Ss7O+վ3~/ %rW0~\(*FJ? Ta|%"P_b<"OCU]]1/|F]_"Dj>+1~9je O|QZ_Hee<_+*DZ+niA tA*C 㣌Moc@͂@1VO:~R>f?qBqZ?h?"Ћ %.W71Ϩw>SF1~&aAʷY~n g3Z 6A/ҿ /˷QvC2j_̨nݫ9q(a,Dl8]:F 9V0YQFퟏ QGuZyw0ZA<@qn1ȯKJ ~⥢Co'?, !<Ռھ$k5TC?MZFO 3!3;=[]Z#nF?0X?¨^d@GiL bLq+_^,/|)ʨe0:Wq>Oq9߀+7Cx+B[@?SK]1(na F]@AwC} _(1<~d>hIBQ Q5O>&_Ǩ Q> 'a)G|F툫E0~ ~hAku/aŌ?~W q p+unīEZSw ֟_?u-AO Z\}Bokc|Qo@~A_u0{Ÿ CO2j[3$;!ͨQwD'Q,oqs0~QfbOG*CxocgvFp` _a].P#+ƋO`$P݈Ox)}jFOOE|H/Okb=:J?")]T/d$f B^Ĩg_1 ~_/f/0_,槒jOhVy#2L_a%[PSiL5_(p?5? qKϿk`.W2Sj?j5?F#yJ^f0A"5CkQ :M!迧3j.?.ZA' _0?ʝ#˙?I8k~ּFixNOo!Wښ@OG}) ~"R}?ھ q׏ 1,DAF?*~B+u o0QikEĨ 3jy0Q 7 ~-|Q/QF]:S36F]WGEgε/aq7"nkk}9#_u}߁ϥgH) g*m5 &1^N? O|b(cw;SG?8$f=?̨֤3S=?(P~1ȃB]j)~?Qe1jA|b@qw19!qoo=zxBw@v}ST; +G(Nϋu/"RnQ-\<= “ .Cx%EO`0SD_U2jj/C1ek_ͨ終axk\7\PZ_`|QMD-foYZ->f{g# ;0~>N>d!'wc> O[KiGBx?W1{<~C?fBcW2j Q' Wze!OU| g0~ OCAOE%>u}A"c_e_̨K [,xj Y_H *FU1S|5bHZ!Q>:Saȓ~O?5@ք725x?ֿ>Hߊƒ?Q?y*߃H/վAe[yJwH7JO߇)?'pq|&z~cW? <!ђ|j 0#|R_BCxku `|bB8aFݿs1[vF:uMy#}@A\B_HWsBIjL0)&埆<ͯIxw++!5~"=0~~&"\Zy^e?_i^KByJE1K!W0}ƨ[߁H_!1}aRH%Aeza?xu&χHau1O q̷PkO":aaBAuł<'ca࿈| C xc:f0 o!kf .jaSO#?S \1{12ԩ1~ o{<"a [WHהl-[ߚ~0f7bXR5S0j\6$򕌴oFG "8]Gg"P T߁ ux[ Ow~!"`_K~v_*u~ 6ec!J} Oo|wCy/Y9S ~6PB=?·(!T <[{ lK4A }C O_%Q!\su] O_+yZ|

qAqwa_T?FE< ǧBxA+==?Qp1/_(Ϊ;MBZ??yO \$ӽ yT̙oqOB~z-{WH#~տg .ת T7 ~6"ُZ 0~17 ~ ^E0[2!v/g`w]P1ǨwԿ1>H?Q~5S|@3u‡1~lAA G | 2jQyJc_ƨ?a(2!IQ区?eh?q~KqV \>GY+?/jF_C_(/a|/BA׊ 1N+m*uZQ)o_/o]¨}, CCKG(eU1~:n|yoo ~0MjHj+^_1{lO-ͨ?_~- 1q~yblYV-d_`_Ue ~!#*W1~ryJ?h_go?]_a={UyJ^SiIɂj`. O7 ~.f_Ȩ7 O7 ~1"6QOAo3O(.}%*re|xuVJFݾ0Y ODZsU1~:yJ!1WUڕ1Xu1~:W1S ~8 ˫vblF]NCw&!WGēb}7毷GzWU X_@ +Wu#yb}*x*Wa,D_W} O\DZ_9bZ?!bХ׫n F?_R QϰBO@8͌0Y%fQ˿Pw Q !?1?*2j< ac' 㛔>$sf<as QHGտ0OA$PG5StDZ`BFݿ</B5o_X'_/Si($_.}taAWH lbi0 O?q(?=گ! OWC˩g`&Of/0+eCX<\1S ">5,:} aH??of3{)7 ~5:[ 3 =yJm?)x;wbfF~pi#귅Q}߆˧ֶMŨf ~߇Z1QQ_3S?&oqC7>OCA:OB4fʯNyC^!1u; ~TkЎK5)v_HjՂ2Z51l\U+|_X/ʷ^ | ~ l(nTM!E/Ռ:m_Ur_ʨ#RwaNF? T]th}k+1:F=q4]Ϩ*߀xhkQuB<*y5R)F]T !a_73o2~PO|GB?-SC'yVbA2`! B._h+$(4C8u!mlBnp/D/j~p m_H?V)f)d5OO_èwC$>OҬO|'Cx 7"WOBxAࣈ|x!܃uπ<< nLu?A!4uEq|u'Dp3W3j<kE0hU:>yJ_"}4 a| N? O >&?$~ O488KqDc''/c;˿eOB9z3_W "䟉_?} aD*Zy*QΟYQd _덂1j7 Q[Qm~BT"\aCQ{ }>5SWs\?Q!A!.‡1~1NC>k?,%}>c:S:O@_Ĩ HQ9C`rFK^-(~P%_F?_-<72*c|)oD* w !=y^,lgCu'?~aD-yM?3O?uP~) dW /p4?Q`TD[3= O֐XQFڇxh?'ߋ+1ޏH# A N?V F?g_bg"Àa*lFJ?솰 O{?qHt LQ}c_HV꽘ƗpjPC>bI#%Q,G韆ID/)O ~"_ϧ |0j4/)~!?,cbFs?o_///cދ߈񕌺_F]o@Ocx(G~j}K3g6bF]@A" 3<CR?~,귐QCJ ~?^[gn_B5W2/2SD9 0~N~)?Q_[ͨ? o?Q;:CA!JGvd_?*귐Q7C?E/b2O5S3 ~ O0U\a15^\H3n_2>_H0 O1 n#osAү4B5Sa<]U5|3)jiylOQ|<i}|!?'_߀+k`o?o3UW{#+-S(&,_<׋gqy5G7#OOIoV~n61~"TĐ w: %>n0SW e"}#.:.5S >(ga| Ưb$׼AҿD MM l0COkfL-m}c}w@ O|;%}wA؃uv;S{qh}-};SWE׊ʨӿΠ[ h?NQM xYiXgY oCmcE!7SG-Ba a O ~..?[0~yJCbK8ۑ{Vp'Q ֏;?"KK @͝5Q3ߚbFz{6#ywV=1ދ(y^e?_~DF g1W) ~6.})ayJJq9}߃{x/l_c<4?T7߈u)7 ~:Nso:}0SoL"}o9:}G) ~.nyZ? Oːg>b}8 Ⴢ_Ȩ#>u} !|/d韆9< _Ĩ>Ku}A!>2F #_QϗdU_y1oa|7)owEu3j!Cއ< 㽈)_Ϩ%_c|yJׂ'7i<3??Q!1SLF߿,F?4lF|_D0j \#?*?{??_~oO[/f~HGQ˟Z*ks ~9bׯlk|Ռ->}V\}J~*{G$n]n^Da-- ,Q}xd-pmNĨ7aA|.uC0~_ɨ7n(J!VԿQbS?{un|#"=ߨ~#̨& T͂oa6oee<͐෋Eu_D4_F>;MBiً<_OL\L6vU4Xj͍`LTcqVk K] X;6yΝ[ws?'s?'u;7ށM۱uC~.&oߕۮڵyyjjL;Cvݹq>}A(/ʬt;vH{ʾ{m޽k~}]:*]WؑWաf#|ʮvʌS=멡Mtzjo%VfE(۷f(}{n޾qY*gM^ 5H,$ nmP m';|';|';|ϝϚ:Hh=-p B ޾;riehᚖ>lFG: qז4وʴc&ϿR?XD{R ۵uqlOYd8;M}Gb7<:Zeґ'(.TExbgc2S1}WǿJW9'qN5& gF/u܁+=gz{\eryNt&\o:a~T(Os9)vA &ߌ*tͨ7,MpWFM`Fߎn04T[&bQRHE7grvdqŬƣL:1L@k]܆oc{0OnEMq6Q`х'7ctYSIښdc}ʵ?VG э(F^p&@UF6sIҚzjo,稁wssNx٧.=>wj;=ܰ)deIE:5f"l9(9GKs[QڃE\hGX o=/xmَj,ļvzeqjq;|]qh6uV8n\-5nU%IK~('3,9T #]jxVV8&|  _4vzQc뭓/j읟Ԧxz$>[E<<-t@c& bDiL;#&8Og,F!h޹=bs?7D{''Xוƒ02 4$Ǚr5̗js՜gL8k}1Wu$i<,*Wk%^RHaD[ qqqs~gqVWPF~< lm+ʮOgsGeL^Lӭ9W|`]E'Fw6mg-.dSq`~6(8sf\o1`ذꁯjN#{tNe[e{HY }.3k9y 7UDŽ<6.훎bf;Le8{N^q)06f|gtؔ/%g [M?/Zqf?7Rz~o\D9[獇E؈y6b]zmA<_a}~ETc8<ׁ稻-z(u~ے ,b%ˏh[2!st<,yr:+Ԅc=J+Fqp(&/ǚXY槍&z6|? 忛5Vqde>26c~i[G}i,&\'g8-c1 <'/K}sֽ#7sg1M()+[1Қ8mVEOGѶ9teIdrMZIyytD?z:­sp<f3  8&۝[Jgs?2Fo+9I*nXkڣfwnyS#~,j3A޲:{ |qɹ8; 9n\^u=`unjX(3O''q>\~>OO>=IT[c4;Me-CC@׍9"GR'P;}S`߸)q r\_ܭܭܭ;79Tg3㹉3rSܡܡ<,wLn"eLl|V( MZsrvrv̛c6.j~t<[6&¨ ܹq1N8o4Av'vq0RÏX'Mɾd>PK}g)zsh5cBϮϷDb7`&j{ԩw4snsl߽l4sd4=P.9UnQa-n}{n޾q˲5ΓvQ,b%[z윚 2+r?s1y`D'o{e|e<*8'Ρ3Pgisԕ9/*|Ukϱkm;nyKgԣBեy(8>81V2<_x*G;|.'[ pBqwH0rT&y5{(}rU+ͣGNcQɑ#8:1=?AM#TmfQݞ2%U*ԀSJ%sZ 7cIvtG?2c΁#ڨH7JH/xH8VmBEj"ghY1=r'ecEZl#O蝢njлqזT>2Mw&>Oh qSoT[J5a184F[9}(={BPՕ%*.[b Le`b XghC{6!U~TEsv&t'td8H$CRYUp_aЩF+=ۛ<  D_ĩZڝ84<f}gO"FSYSpPpD?a% v%nTT>=C"S='AN@ @ӫz?t41du &j.Krpg* VA 餼;NlG=c݉Ρ440dTD* ֖<8)Zj'yٲ`]n?GUphԐRj#pi_Lw7sR5de4gL6X*r;$WW29:LcpUHvUKZZ:]u@1V}`_P`ORrE`rC^*=\:B ȜT,&hpOWP5 s/3aa+gwq;{{T;TDZ:,jFX)DZЖ E˲PxAhqnOt'o=?+}½KVyg*ڕLXn.SwֵL䊽`䖋i?D1Pj*&rJSXnUmrZrFy5ZN3I*;LR}dxЛA$\ԋf;Ro7#];BVrKt0`nBkH yS8Ȱs[Ī*slpzei~Xj.bfm>D=[UΜà[R[\t)#TR1UQ gPa}*f蒌UZzEɨ>帽5*^fg[j&'uia^ʊ-cB]zX)dQ5g}2.cԜ1a-HUefXHiJDn"K{UMfBN7$ @ŦrhH{yVEB!Ri㠒gȞ. r  gz$uw$,!hMt 6Ͷ5 9kETTSa5֔FY-,5l)ғ*RycszqVNBO6؆w {^5C8_T#kbD1zk@ސU@k# Eeu?|2sڝϘxӎ2q67~nG,O ᨓka5!IG5k[ SjB[U2L&ä{ 1gAKu&i9sa}htE.cՒM5JxJ-N qj ^5|1x e7}K6*ҥ4RF~>98bэHKK|mڒ8JCMj ZIbw k%gтn]X}+7kgaV=`LN YIit[ ps:ފhol}Q⤊ [W joHNsi({qSx|壒ګg [ivʺӗ1轆:ᨠf#J$Ԯy6 ߃uP;q7jANfa1*'wl9jyxٻjC`AUEđꫴ՝-= }#{'okB*C}A98& N&/޻uu( 9h Nޒ@G7lq71 r>eS / M{.y[,7*ŝ0ʠN@WV7PgM EDkC^5hRM)v)(h-U HKuY[݉[NMe[^P>J@Zvx[5,i7/=Y^ qNARh[P]gfYRϘi7p>U&ӅS禊:u*8f6 uC0 heg-2{>iZLxԛћ0; -sz]?}& M''& tm}̾>dDf# ]"0ЃI}0\him =|Ѿ[g%GlNMU j8*oBFa&'r Y7yp)sCz_n7[Uu uLiJ 2 cjɭu]h$Ͳ&ÖUN}B[wLCamΣ)jlFXhsKk|HPoϩ۷VnNZ%Ζ衇W"s#[;n'"t@m09:&U''l-萝j,TWwB6Zk\&v"|a[(caR5ԘjuS#k` J+d-μS@OӞC7W3NK@ :#8o߀QfU!uVɔ)) JJ_ժ*YbPX )Lj 97C9zA̭!SNO۴w{/wǠOSxhM>7dL[]/Д:Ŷa'373`tf p*47e1zz_YKj2 ϳ͓j%=W䎲A}#)XMvjၺök,-~'jݣ5P~0^Z{% ܕR*/ >۱1OXՄi մA%5LR<\o`e;hnBwiGN:ؒOYa}eNʊ-X'~]~5qqTstQa+MglwN0^eN)ܱ3FAa!G9Ji/-"zK7YZ3gn(Si>k>a'ܬ6hڶJՙB텠kR'[P5SR{^]S` :EpQvڪź}>zRˬ`QkıJV1u41hٌUT1'a2I5St' h5mQB[XK ?srM1SQͮolwѡtI)ǶT{cgL=dPκ&à>HJQ&v}ꑌft}f' Ad`Xp =grs/ -ͭhlu$JnXڿ?}t8ݓ#& z­SnGgMN9>ی7p2k}W7[OlZ;2l߅Ru[c9TeAoASȼ:T{x0u֑W]6 Fa"xU_: Gn(0h_F vXq[n9)Y C2j a~S;T;ypG +tJlu]L`[Z#a:ִ[[ZۛoujijrW1ޤ%*v>h0ޓ>yi4ΣPh]i sVԹFqع ^%j}˿mT*i\9?I;B~U%h|us@䑰*,475Ef`pa: Ѩ ȸ-5jfj̚5O;=EkY{NݧbMY@Z[ڭ~Ui=W'GBѬleL20ߗNvi!}b5pKuzVkb<lbqk 8nf1Pzk6`V1YA}ud:b$`;OM7V+G{}uʩ Zk7y:cOIuղ"bmvIn##3δqЁ1Mv&Z;:[[VE⭭mіX[K~>4}fv8 1VlO2jh'e!YoUt( n"ʔ$=j|z"v+|yx  ÉƴC3pkSք鋳HmSd݀U+3`#ɡ[an|(K^E;r<*">vesDyǕKZ쬽Ά}(GL=TҜ2gf,!;UuIxV-PV*7WZˇsRm:IV%I;{r~{6[&T,yO8n :kyǔnv` sAu[$دީA;N?pV,#-*][J˩IJjcVN$YPjCs:ǺPuN3: CɚVg CM )V>Cys:ƾP5Nq%v]2tJ(}9#NC:|;JYY,CW l܃9'\N.3=d=e0wL_pHOOTԱV?qc+aV:IJДRnP[0Yԓ3-$)P}*笜ܖ%)bIw ;BV,Drf|}==S'ƼtP 뚜Tbt`EauNkΖ;%M4 U*ݮ+:j-ѹ2z=iZ0짂NܜG䮩9g ?J):r+q8}hl+fEz8S-&YCq> :=gX +Sɉt7ԍ/RpeUfqVI3x tyZ^Hum='kP=bZU0{K5)Σ<rT:C$U':zBۊ/ nZW!wܣ4ھ:o7)[{F"rRsvT+՛-ız)~ w;gȷ2,ut*eա Cu!q]yFQй=\g,$3oT-r|'GV]Q#}Eg b{ⲥ eTSdYT Deʝy`j[t;ސɛ^qḫ)sw8#T"&G=WTpW8;G-PdQ.Sc'PmysUpdd69aۋs:Nqgc9ƳeV_٢N 9ܩμ^wwxNry, 3<J9\XdQ:m'z|UN6q̦]+GgPUOQl#GKWoGf^$;.Ggc,zݫ^3A-q15qxzOn3v%OTHI!,]법7{"v׮3^,sƇ2U߬Q?w+:Oug?\?{*M8aQܳ܎cKNYotbm:oM6U@WrKehJÂ*[psSKi|C7"*~;;pN'RYmnMxpNE"xԋ|kJ18[uad:NԳe/0|;Z.Ln8Ms쥼OŒKm%O2-Aݞ)tC ) >w O-v r4qĸ'IkzC.nCh{DOIF|T]7O4.=>>VS3BuqijlL>?ZlQV"Bq#˰Qp11mD%?/xBaGYb:}() R ΂.YըllR!k2[ܮ!_;/ L0 *y,0WoIXLqMd%ٱIӛTZA"_T>Gvs5w:%{89s;x2lԜ//d^AuW#2ΤAwu du;.[.-,\*$^\}fGܑ_ھ}{o0s>3-T}ޜ17[GcΜS6vN_!s)+Ac|TRڪ`Ƃ觞SWYԲh} hHet$թR̸[K6- ,QU}z+J:o2%絠ҪT8$kGVʩ(xZ-a.HMs}[gFN-Z,}fuJ }e;D'*Ry?>87\P5 ^j09帆IC{>5j9QܢW줭/FF^OqqVt`E.κAQTΆޚ1S|їmfg V y1鿡F?И  P+2ڗ&JV۲\W37HvK6<%|aqcȗp4٭_tO6SSV?sgW݄_s1;<_jW48]&Pkv4МA 9r'/(ͬ`oكʬq~ĹMXܮ+m²=3i^.Mw y{Ak(׬ńপ,Bku% /D&񊹡;- 5ht>v?(Q濩q)ɝឞuΰLy&z39o_#})i-#ߡ+l抖`ſצK h,F74l֡ފYtzGBbW7eˬpM֋|;z [31f}`5.C޻;i>B6"CSߨvR%kzyc+]$5 [9<8ξ=#ɡ&7{ΠZ:I}v(JO'S> mt}TЗsLԑ8qo#('-Rfb6vT:{!%G2'[CVB9o"uNXLP&,] kĨ*c'u,ٓ:e&m &E$8f8!6vK(jdB><ȎԱCS{v:Ntn ]sf`^CPpW7p* QriA>orlKvDmlzZ J]sk^(+ZXn< U62q)ds Yuk7o:w(#1{+9hjgnY9 g.|vRc E./F>/tz9ji/0()b+_襰E}ePf/8{aE`IENzyl6E1~[*-*{a 6a;3Czt }@hmЈm!':p<9x?LY+6:6{=U[RRsg91eshx֪uv/֩Lh=x1Z{]oסp mNԝ j_Ү@F,P|':nN 9[NEn] ȗِw_E߽kcɮoD)]Tt'5==skѫ9QrpV:M9N`>VY@i"%Wٗj>I:թcPDS>{Ih[OO uAΝAOu%CCCG}AXrU\hGjJfH=}HHhўMuA 9PP7u4Tzfu[G=hOfVH߄-}*ߴrз7,U+߁㉞9jީ|=鋛v|¤y}RkͤO5ȩ<ϒ}#iWv`[!V#0kwR(Y!Q=#r4s&dvyyIr^ߝ7w}x)(n?ltnLDюr%wL!L>iy'MzXYӥU]!\9n%\H1NIoLoKQ0 WXw4I2sjOV8?L9FseOtS2>eY؄ksf2wF\ŕS+ŘblTCUTRokU*f߭An=p"DYWPmU>3W9Z1 _6T% zG}ND6HT5Dz˟v> msmW{[\Еwжp3N/O"{o+eE9IS;Xic& E6DlnC߆R^X`gvE=\E{?㩵증gSֲ-gŮeN亜zN@BElL$˷L说R guabku95p̀'7Ir,d7Irolm]̆>&9£ed4^kThػ߱OnAH9г"]pyy7|6SLƝs:y RL圈9vPz(#QGCak_%US誑͍~o h*}K>~tk?JSl*~S<ؤq$ziBNyUdlS~ɉ 3WHlx/S·sV#(jSϬ\],UAu[U0144yr2t4RڬuvB;}~eP!ǯo dz/\:NeJ ه8C='өz}ՉT3i7B7V YVP0Hz;sbuǚ>ܨq$n/ ¿tr .R'՟ԨgoI,{3<؈Rߖ80sp{Vp,b{wBqvZEsju0w,)\=з[kW9Nt|w=]4*):EŶk3>\=m䭏r룰rN(mouVZ~x)e_`2Ho%F˴+}PxrƳ HN9}A$po[x [PKޏ;?l57A0_VQ O%Ғ\B~kҠtu$eAwlJ0ϩ(v@E^VJ rY\9X`1Xh_KIX,T >S썾<;.miDZb ~-\p} 24&OCR:ITJV;*]͙|].g+w~Ιʖßg|S qq1֩p|O2z( BʚCuM9lTJpJE(!QK(L|!/z<F?usǽ}C'ˑb;|o7͂].V;g7 Soi7;9{(}ʻIw |RmrliƳ8#Z#,}#fOGsƩQe*;/sC:t>Ë8"TI9VױmGJ7 2 ќ[@Y^WnNw/>7>ӽ+[#C-֗[dw`-lѯOOd$Z'tZ+܌Y!C"|3 ugD![$ӄ*AYTw]NUue8IE :ϙˬS}UVl,~ZTw;wȗb {$Yll蝰#ըd;'e#ˑ7y6s2bbcviExzuMu;dpxΣj4 kݾJdu-yN~w`\rrNmʮZIS*|6捎ߊ8^{COuV,NN$:б yұg t*lݎGTjjc9Ŧ]U4n.ich-xe7q \s ;"0gHo#QMċ 4zu sqݺWWFd_z%hp;+u#YPY{ssˑޮyd_q{qA-G56:_g'.e1eя۪&~0,g,~kLxq̦79K|)N-"a墳r}ʈr+8s8-}yGC,J.k(su l F7=y78/}.2d_{mBvmG}!(D+s|i,F+ũ0 ݏBm*,j7֝mueF*z' \ވ!^C? oNTgéMvwXM\ﭢmᵲov}mך-(N2q}+G\+M"k7bH߷uhnӅqյ!בSpٗ҇wEvɊ>9XU_׭zI?61otSetwQ2d7=hOΑo9ȇ;PUaҸy7HY&rNGҀ&Q6b:+N;\}&;m>_/ǰ]ԧKuk]c;*Vޫ\< ¶i_, Ct_s>wL{i2NNuW=Gi]LkNP?FY#K#בz;lOኬz9[7*[W2.f*W?b% >bk]_\"ǔ߳ۉtLl=qh!,Xȏq:Ƨ=N4ُ~gIIIIIIIIIIIIIIIIIh?_G˼TnZ6fUүm_mWLj׿:<":#<":#<":#<:#<:#hyYɺO}ud'>YɺO캫; K?y=oh0/D\L5XAvwsE'LI{Vo714@c) e~*1}03>>< 3l9_+_}]coT0>_gfT<ޖ:Sݲ\P77 %{Gw'aθ*^}}8{Uv &S?ŽZYJb7B {frt[YtyP 22i6FdjTVU^\z=@|>z=@|>z=@|>z=@|>z=@|>z=@|>z=@|>z=@|>z=@|>z=@|>z=@|>z=@|Bxo!z=@|>z=@|>w^A~?z=A~?z=A~?z=A~?z=A~?z=A~?z=A~?z=A~?z=A~?z=A~?z=A~?z=A~?z=AZeC5@@~?z=A~?z=A~?z?c/ ЃA z==@ЃA z=@ЃA z=@ЃA z=@ЃA z=@ЃA z=@ЃA z=@ЃA z=@ЃA z=@ЃA z=@ЃA z=@ЃA z=@? +ЃA z=@ЃA z=@ЃA z=@Ѓ{{.=====================================================================================eڕJI늊6ͽڼ87X&m}ULםd'>YɺO}ud'>YɺO}uuyzkV[~5f?)ȚOvuΙ_7\TקU?'?<7q >68k˫77o67'}dӫ;+^]yO_EU0t2_S7~O|KnCx W=XXyzW.5ў ;Kng馿eA}OɛN_}oo=_?!Ow>?|&I|ssMmھqV-nppo:TY@u]j ͗Z\=1e=BdZPt+="=[ _{͘SߪUj;w}{SEU'TM}__|[_QlU<1b_9ۨ sJyꨌJKOǻG&ryZܺRPS#JAtor+)?Ɵ²̲‚MR<0EH)>Uzb(:gI'`ĖQTZVTR#5ўtؑR,]rAӅXQ_PT;; ˋK̒~%^tV:5l~:G+]trayU^SQAaYѼ86k@^8//_VRT2/(mu\yYvΫWTR^Q6wZEќ^ﮘ]gڜ⹳K{i Cט!Wm|?ePw>1+*k*UU[.ĆSKHHWwzт‚>EVg痖"V< 1n|t`+^ӹa9~3}yyyyyyyyyyyyyyyyynC~hCM~?u~?4n&?䇺PC~hCM~?u~?4n&?䇺PC?Tz$"s%BHӪ#MHF$n#ۈmD6qѸhF4n#ۈmD6qv܆amqv܆amqv܆ې|5W jj_Urkan-̭0Z[ skan-̭ܚܚܚClj _*)6__V|Z[pkn-­E֢Z[rkQn-ʭE(֢ܚͭܚͭܚͭܚͭܚͭZ*ʭrkZ*ʭrkZ*br\-&Wbr\-&Wbr\-&Wbr\-&Wbr\-&Wbr\-&Wbr\-&Wipkfpk&frk&frk&frk&frk&frk)Z ­pk)Z ­pk)Z fqkfqk<<<<<<<<<<<<<<<<<<<<<<<<<DjMZ}Ut*]5}[.=w ¯BwVYY9NN:5GUibo#/.v[L%A*xMesJ my3?jްkbgoQg5wM]V]jrZvnՇJ̀'\g)R8­A!D}*6p, ~l3*s*j4 ߖc0mrx꧀bUՑ;LM< %R+HG:Rg.Hݐz"EJFrñEJE4iW%")RsH Gꀔ+Rw$6H^H ! RFi`PA݃u={PA݃u=߻|P*k7{~={~Y u^~qQHؿlP )HA R )HA |6wBEecN& )H^ )H_A R^6 niٜ93έ(pڜ=B1Q$EiHd}Yeմ/$/7l4wo&>He}z 5%.{%uwl9RLo]OF9n^}C* ؆|^SٚΕ]7vt g]?^ί_&ϫ{dtr!Aon0b.y`gp>_#ثcy8#^={AΟKu|vKSmzɷb 1[˹O.4%,"cyeuKfFy_=V87կ!%>t_jru{6_m0@ߧanㄿo ~?\ܼ9wq9[4N鶪ɾFBkjN_Zg -<&ێkjҊorʅS6i '6O&4K'66qۯWvP"osS#{uKڂڦarʹ2vBu_ 8?6igx/{k]op51gG|j$)mAfWx]3Xr呶 '}8񗿍=)ΝIzAEk>+0lSmr|Rݯ$/#T%\ŋDf&l1@wnE*?x|sX8wn1nPcd߷Mh|N\Me6rqn]?k Zg=o/O3]q^<=Lx|$) {b;8 JDw}G292v1z߾FxLV$9HȤ #d҃L #S S}s3?,aw~X]쇥 q/[BKc!WTR^Q澽lN²’iBU)*8_?3_84^tNIج"v{tb;~_?v\q#"M BH- Ej'{$#؄^'H] H=be~H5R,!6ibpM՗D;~~7 I¡BKBlpRha(v'Ӑ҅ؤ;)&c 5BlBqbt04ropoBp' )B -D4i&R HWӹ~Tt" X9+E4iIH'#t*iH#*nPG"8Dp @"8Dp @"8Dp @"8Dp @"8Dp @"8Dp @"8Dp @"8Dp @"8Dp @"8Dp @"8Dp @"8Dp @"8Dp @"8Dp @"8Dp @H?! 8X} T@8$p  H@8$p  H@8$p  H@8$p  H@8$p  H@8$p  H@8$p  H@8$p iӑ$p  H@8$p  H@8$p  H@8$p  H@8$p i_  H@8$p  H@8C}H@8$pvPUsa@v #@28 dp @28 dp @28 dp @28 dp @28 dp @28 dp @28 dp @28 dp @28/ dp @28 dp @28 dp @28 dp @28 dp @28F[H@28 dp @v^͍(ؠ(@; 8P+p(@ 8Pp(@ 8Pp(@ 8Pp(@ 8Pp(@ 8PpC7p(@ 8Pp(@ 8Pp(@ 8Pp(@ 8Pp(@ 8Pp(@ 8PpŽ%}vl\|%WH{p(@ 8Pp(қ+*8P TlT Tp@*8P Tp@*8P Tp@*8P Tp@*8P Tp@*8P Tp@*8P Tp@*8P Tp@*8P Tp@*8P Tp@*8P Tp@*8P Tp@*8P Tp>Ci78P Tp@*8P Tp@*8PZ͝ h@8аC84p h@84p h@84p h@84p h@84p h@84p h@84p h@84p h@84p h@84p h@84p h@84p)vH;4p h@84p h@84p h@tp@N@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@GH#} @:8tp@:8tp@:8tp@AAAAB B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B B tPtS݂>g>wA-v\Y?zsJ'w&AJ8slrɟƒ$ZӲsM J &SQX]o(\QXNOx{_bUY ݲܟM+,N]Dl!Վl4mfYٰC*Rie -PáUpAi~I?pI +&~fzȺŕ2hE jfG%qe[Vom|p ٿ_p88lTMQ)wVƮaeB2wU>eV}l ~n)T}lk浓_ 'x$x놰n -5\9BsKwfܲ&k Mod"96esK/>{iyA42Ͻ{-[r>~[?0?Ԥľ@=P}Xs-y_ǑL[J0u={PA݃u={PA݃ޏswauS>wP_BG},/%/ {CD#?Ct'IB짆fNN7\ FP؄;QN?t'ƛ N*gOOy;q`PA݃u={PA݃u=߻lhW@%'xD].z?KLNş?,>X8|p`烅 mqF܆amqF܆amqF܆amqf܆amqf܆ammmmmmmmmmmXqV܆amXqV܆amXqVF$n#ۈ3Xn$VGU}v+/%ݲ>*hB,E@\3ͼZȻ}$k%*ɶ[=S+ fÛ>lVe7t6^2wvaYѴHpm?t<\Kc?C[!oAeBJO?,qFszKe_ wqZ}zNH {G;C>:YΨ;+3~7]"4tz:k\ˠX͢vĎuv+{*c;_3,֬u_<=+o΄,ZA 3sw?өÂSkN8~J*{ۜ:B|c؋[ǎ\Ŷq䦍 1>Y03 79۴a:[ܪ~}_1vvZ?JqA/A {2ܿW[^~_P xGyrA<+{T[UJUU[nx({DU?(TM}7W*f5[^Ѹ0ܬ,ʨt}ŭ+E8u<DF*0N%Cمeec$)xva@R|Đ:uԓN'A-?}yIu={PA݃u={PAuw|\+T6OٱCK%Kj~!6=ZŜ2!Fz:pDtNIy}fW-8WRo#8DQA{pɰUY%j/w/l'/`wmƺ v\" 1Vg_/rw{/w{3o*ްZūջ8 y|__C]uNݲ6vߞZQX6G>lV X[̝]XV4ǰ޹@W`֚&\_Zn%\7 {ſEh];*{fV#^S#G ~MG wGn/NGn$h*h0: wGn8^y؛ 7-bo tIv{˹vI iHBMBMr؛ݷNboSv߸x4뾱}sB[_*"MG4YHH "HHs!GZtH tH 1&*؃?"8Dp @"8Dp @"8Dp @"8Dp @"8Dp @"8Dp U2wH܁;s_t-A"8AdDp @"8Dp @"8Dp @"8Dp @"8Dp @"8Dp @"8Dp @"8Dp  8X 8` $p  H@8}(1H@8$p  H@8$p  H@8$p  H@8$p  H@A;B8$p  H@8$p  H@8MH@8$p  H@8$p  H@8$p  H@8$p  H@8$p  H@8C}H@8$pvnW + d56P dp c߆@28 dp @28 dp @28 dp @28 dp @28 dp @F28 dp @28 dp @28 dp @28 dp @28 dp @28 dp @28 dp @28F[H@28 dp @((ؠp(@; 8Pp(@ 8Pp(@ 8Pp(@ 8Pp(@ 8Pvo@r?S(@ 8Ppŝ 8Pp(@ 8Pp(@ 8Pp(@ 8Pp(@ 8P8Pp(@ظNK (@ 8Pp(@ 8PbelH@*6@*8P Tp@*8P Tp@*8P Tp@*8P Tp@*8P Tp@*8P Tp@*8P Tp@*8P Tp@*8P Tp@*8P Tp@*8P Tp@*8P Tp@*8P ]H!} @*8P Tp@*8P Tp@},4p hء h@84p h@84p h@84p h@84p h@84p h@84p h@84p h@84p h@84p h@84p h@84p h@8V~Fi;H@84p h@84p h@84pU>@:8tpctp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp#>Aچtp@:8tp@:8tp@:8tpWƦB B B B !p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p!p:^y~nA~E~e J)|zw5$'VI.Bome샨k']7{PA݃u={PA݃u]nZp7n\KpzP6O2AYzǔTM+,q'zݛ0n,}#,~uY?Nm>~N݊I*'ós0/t49&SOpX?xkӚ4i/׻ ;/t-4J vaR7tf9tϔ5N~Nag-;|x9۫G.VL;"~|ms6ܢǙ7oղգ63r+Nۇa8CCQ﨧j.m1׷\0<ՕɺlΜXqp~+yo#Y5yi>}L70£֟[mu;X]G~yէ36~K~>[.ao~K^.g/Qؠg[f/o3zKЦҌ~w}?;KfM':sW|dtKf2mvc'^=;SKZ;و~93z1sut9z L3`㲧lMglqی}ӡʺzT+i|/+V斗*%;Ԃ2^i޺\P8ڣh:UVRS( ܛ*?Zmx%RJfm3-/̉F]VWKGPGeTZz>]?2֕":IW {s{^)HFJC9SO:1C?X&lҲ għĎb .Gj,oЌB]X^^_`\l+>o!f>8]좓 ˫Ҝb ˊűN_y~~Aow^򊲹*ЦtsWb ۾iW,la:(Aiޥow ش3kJn׏iw餮抄j{tjsf݂ԦRW,G= $OW7`AN$cv=8axI~ɜy~o*x% G~I峌 ]SW/GII=~-I&/%zZ1>?"jqa mVQX*:hAaL?R> L$$e*5y Gw?VK;k}}ѩ&?c+hRmICCr]%u=0LrGa$FW 8덇OOrIKjI2\uT%e}fV,\O%ťe nF]8VugV]4{Oٜ =qeW;h̊Whjc*xx륉ljųN % +/PWt)(j=م3X #> \x}{ģBn]uU^ة{jܛx~uq׫>ܹfדAo_RBU;34ŻuޕV=LLwF Mɕ׭^P'zSj's=[C[93ki IO2޶|Fa TibTIy<4baȏmShܴU]%&D苪=7t럢ieͧkJOU{qbI80_&~?u+\_}c.2@x@A$HH'0TvJ ࡉB9CsaMH_X£"bQmvf%GOD5I II#/JoD:S2P8-C%@W  hSMvhf_گV ĿgWc 7nƉ͒Ms~o.[o㺮갟Z]XZVXVɯjU U r7ڏ4x3jW^P8=nqТ#L#W.-ԜF]-!M-[yykr\COރo'>y(R 6OozzVJXv_fcnxeϭlvCYvA ׽b,AO>el}ʻ ^le,mTXr.K9yWYf튟>2}cል,g0s]37=v>Ye* >ቯ.{pYQ+#XO,g;)YQUlq3|U,\}=3;ͩ+a4K;vjY ~f-󷱜2iX ]6ZG|{XݛO<ʲ[]䲬pNx"z.sZ^, fcO}葁,|Nb:~':չ}q>ehOvg{u `),q_z=Z3bH]c܅'+gBCOa9,iK%,kٟ=se,q[@W^ϲWl,a/=u[,6ݿm|棆,}ԉgqmLkr?鱓~0gSȆ^ze5g9]ԥboKNۓMX#C9,KOѮXgX~gv0Swz˛w,}t' b1Y=m?|Yfɹ-~rڜF:O{Yt󟿑޺ŏoyMv dݳLat,}0ѧp+Yc=Yi{ʴXOwk|,oO}9d%˭y4|`T ? ˞7ϛ2GJWeϽe eٝBŎ7:xc?{zk,kV~J;d=7>)f|˙γ3܅6etY֗,4Y%k#,׆s+,wZOW,{³gԌevnnc>;-zb{x<,_,R̲n.K;~=뙟eYβ_玻!$7[n;j2̜ܺlGǕf qmK? =|{_ZaݱOe9'[Ϙz,e^`TGi8cFW_yew_7eCM,7={dӼc#Xw۾vIk{Y-yKgګ?A5~e?|轿s-2vffu,iZ7g9}+xbZO1~ϙ׳ܷYN+_`Y\+Yֈ{#e yJ Zt/?Cs\P猺4aY ٚel2˾J+,E1KaY;\9u ~<7oI=?ҡkn4}E,{(s]o&c3s__7|r{ջ_3XΉcyo *.2=Ҿ&uC,kҭ3͔/XNI>g?tssUmusg7ϛyr}`KQS/o`|LnbYC78XF>ϼ[e){e欫s󵷲 .tق,+iϟ=Ӄer2Z|+xRcY :#Ys=Vr{$}S4f]RMHc,4=S)dxzĦ,oie_]lެS6ڊq膽cUYF&u8eW[r_Oxe\cuT7܍+&YȔ,۵wc9]s[=]ˎS|òHrYk/l\wi=k_6%Β~};9QӥYhgEg\zg_~XN/Y5[Zr^8e*Kn>kǰU`.Yٽ2I,W\7XދWefyMߨye,GP2_}ztY쟮z]+جge/ܧs sͤE~?b:}O+N{nf˝x΋O&d]Zr/>Kfͯ\˜[YoodY]N)Qw$;eY ꍃY^ye?/8yyWпlәogk؇؄ 6,oK7 ݾu*L>Z6a ϫ,k/ɧ=M(x䴭i쨧 Ygw X)]/쨙u3myrY gYrgv; nfͧ^۽|$<\&֞3r(;bX̞/xxqǛ޹0eyw/OjXĦ宓=r#֝3}'2>uf8{gީo*uE;W̊3fc'Uv/?_q>fN_l7{}bhgk&Wiòw/q_v^9/yƯ`yx˾wcw wAuz~5λga|v{E{mnz;g<erRs*58-}%ie߽퓧?(M<\WrsO^o8 }"rvm2i;XfYbx"}=eO0g}PgΝpɻ_giyYGG}1mM=y_y+fO\27_uØw;]rI 3wdch[[w۴k*1'yYy-[b\s}G>{b6ϲWk҆?bM,󭖛ڼeoj_O֖e=9i_4`S=w+X=m'?}KisӜTK=NGԢm$1f]^`ckc沬i,3 hܟ5fY}ökYf3o;e|ڥoKa,3'> ˎ~,8Wc7zoyԳ\_XG"ڵfY?xY|laYN/7#KNβo,c#Ic-gYt| XV#o<,^~UG^e6=m`}KoMɑIܸ|e_˦na7DK{1_ڬwWIKG'8 G;~:qQqKhXccw(;R={ظmuח^ٴֱ.ٽa-֣i[&qZs/kK毶.{5QW%e>g~٬W\Yڷe]*ɛvt~mTpLg˯}-чXƒec'2>KkS$s3/t7;g-죚]}"y[2ϙpw%-v̍Gu],{Rzβ;eo^e'hjX[﮸5^ W-dY&μ;ڳFn?~˾ݗen,;pA#߻ l̲_:n#XȼKn2v/"LfY˯UwY^?#b>r ,s[Oci[; leʯ1;-҃'>Ͳg{g3CkXPgo\b+njp,sZs%ɷa-Q]GNxӿ9,v6~{SHں|Y^~ ׌O-|vMas9C͆3X1w/eߋOgm|;hWdKsv=u&o7sm˸ zr_0{fǿ 楾k럺!2&|޽Y6e~kcy5ŽkXX-Ʋ;mFo,3<򑋞d)ҢܙoZzʇ,kp^\̺c_qiqw'}xҁh4}br{<òǟV]_rpB[NX,ksWer3Al҅߾˭Lc?re}'aYQL:>Cgo:Qnރ-GҫnA)ygVuÿHܿfb/+^gRoFn;u)c&'yyyyyyyyyyyyyyyyyB;{::N,qj>gš~{盰cj_uX_jdּ1A-zO_X|y?sd/{]ZOC^vN<Տ8 |y688;z߯>zVB=RD=3?b|xa Ogy}xyϷqxK[X??ڿnlVK6Ej9/>^GSHw%,V}'//|~{"7V?omz>LίgmQ[%ԸW6 ]OB|KS%~NcK/OԻ '^"g~y Z?^~<\b6N 7|6WYq}mD;1ofq9^^~?n?',^>MCu0&!+)\Pr~U[8ogDӼ?.>^zg?'V/TX.qSxO_۸xWyogr}~qÏY}~;qܼx۞S"\b~'ڍC^O/^~aju<{<$_xwI7Lh~~W?'r+KJq;;_߃E%EEE'fV(!ߵS.#NÄ{4=$ZVX1ej|"Zf>'^+3W{8W=K{isk\ʇsi}zjL[c2?`廩>Cm3Ժ76O=Cmy["PK#a-ګjt# NV3kz Ck 8[5zNyj86&@4{nyE¤iEӋ ?46`P 5xM~Xkp>zO\oz{O\ow_( ?C?Q5iz;O\oz{Nǐc~bOzrBKKKKKKKKKKKKKKKKKŽfg-ͫfurOS{Ϳ|J½Kq]L~N{s`؄tԄx?U>#Q[tِYlO9T֯|cwuqgű 3Y ol-eC|QXs?d#Ofîwe}? =>:4> va#V~}c*Ko+^a Wbӵ̺y_V/w3d?eQ7~>qSذW5:{"3_hp臮=YЊ&l7\toa]AX$gȆtbőXSvu> Eg[5Lo  mgoo6y{wcVa'?ɪCRΨ業?{mU6١.1;iN;K6-zɲu9icƒsq3gT4o*K58s#6:v37='}r1x&N O|uĿw9g4xm^eVN淝gp7/_w'ss{;B~f-97ש׾71;#֜nVt[C&FIImf44ʼniQw09oO]y~YX|cOtCq7SN]oz]Nֶvt/;sƛ=7^t i3p`NC gSJ${,iK%I t+{Rg܆K^Έcۙ'^x~mF;ڨm4uN{v[7;='"y36 m蘭pΣ]u1[[lpF3kMo||oaa,3Y9u\x Έϸl6vGc--s g| =Ѷ==W:wkEXoWA{gm}[^=%MYYM]8y+T >#-nzpǞ1zZʆ?l7s г]tяӘ`{nf\^ u#7n蛭|oDz-^a{;V?MOÓYjw&q/67~if4^߳}uk?'_Na)?_df)y̾O_[ ^OV,uU/6^~Y_8g:q8pJ/eҶ?uݗ,e3_|Ĭ_J5n2׳2ܙun_|̖^_}Kl+}VOïo^-nfO}ssi̼ed~קt2OKs~逸tX[nqGc~w2/?Gs^I^h;/MZrnvdNf 8a3x;*{6z >Nfɹ-~{ߝAm[g^l>Z8]F>1AGϒ޿0kSN__8Nc=띌i78k}_$|gm[7ڱu)jj3N'}foh Yr#mo0g#bӳt:,jѵ gitNja;ۘ3`g~|!/,ӱw9^lĮSR~zx-Rg;KMvCkBrI=K{w97Q드=T~)~)]C<9)?tk[埒\!}~#KMnYYMzD;)e6tAWؾmoȺܴÞdް _}tu{0)EZ:륩[7d4qcZ]O(K=?o͌Uwh?KSYJ2;E/}ywd>JL@_]|6f_Fvlx?:E[+eCk9z%_)eћ% ^a2r*6pǿr/c_A/9# boÓз }ƅXN>z6߾Roޞ~sz ^> >w1s["}b﬩od[]~~#r{ǕγK[La?]\& +ԣ;%?}ך$f/632^}mEݍlNz p~φm3f}+Ecs㷍IU8Yn~dYd}9=gd ]jZ{I/:wgpftQəq9z/Yi:NFS5\?Uw,pXw=N'eCn蹚 Ǿsg\wú\xҮsJOg:Uz{Z~xjNV'zJw}>{[?7J:Ӌu/Mrl_xWߍdwlJg 7~ђ~ъ֫_%5'u6mc2iϻym9o`Z+l/.r<|l? ˮ?9F_]tD+ftD;Z'"vy-co{6||9jYJ7|rnYÓ_8ÒhL;;vۖ|9qMlH=aK~} \vVc7u{x {E?As6:Z{#~WGG~ͷo߶vG랴ɾ#m~v3~z9ÿxEG2c61}ܳz2N߷uXdfP3'܎:؛szuW$ZT8/# :ԕO=~jmiڃ[,p:^bp.jij_NFTΞ ]|׊b}~ң/e}_w#+Ww6poKO(,{~O:_?q;:eo!:9|~gydzOu2Xkt2Z|+xRc}V%᭸ߧUqՖ'dw۰w̹ѶmO5={ 8:;e_.썫>1|\˷Z2{K?NڜEx`᏾ȋw[l=F;0񽯿W0kʛo8,灥 vv6'wg^?XY<=quYߢWi |\F;|Nqy_g.PMnw|~|=-rf6l)wfM+^BvDW/[ VgCw_n-dM8~ .&Rv5c7̻dl McɒK~6 oyu]cֲA)M]5 6]e B'4%_񿜻u Y׼=N'v\~*v>q}Gm[ɿ$gٹ5[[B[x#>/ Ұxq*[7_o#?]ݾ! IYc޹oj5?{53~!z+Yϼ~xަz6ӛ^=ݚ'n?iK!^/|n~{C˳ߋ@=+_8z /!eY9 ݵlJI1;ION+Ϲo_ɧo朄q].ҸŬjgPAaB\esڮKGgS9Pd5~ymt7gPGߋ%Unj38}w굥sZtE H;3ºy-F?\tD1ZS_WmѺal{5ˋaԯݴzx+7ySУoyecِWXw}\=i/em k?̩?YIYl8^lpV&]2'뷐sNtZ24g_qR^=.{L|}\Wy{[rvsmyNUWʶ#ѯY'Onsc~j˜7nCnvXWM[IzU ?΀~ۯF z^}.adz˝Ţw|Zd4zmNJ9w3r(9dw.LsYŏk̬wSR|5?Sߝ̥:z:+̊3f;egJNawgKktӴ5m;?dmJiB=-^2^"so;k"?r^$9l}{)n+ƿSھ'>sC7|MN늣}Q~v.SF]t[~oO0Os瞷1K{_ĺRNm|i3OeְO!k-kvF=ehW~}rrXֱ?4κc7|'FpcyDzȲnP+yeS[وi[_)/GN>~w7b#[X΢Yl؈ع.|$l_elt֬'ѷ>v<|ۊ`3^;g]ƽZhNn!v>HFK{c\QNȆzOrV6y6s`dߚɉKXʗwoQ_,{˒ؐvYwB?ؒ{a?nW&8ڽٸ#߱x+; l5kӢg!ǯr59/gص ٠sSbOOfmϻ3|Fd\٬asQ7 he mEN~{pv zOz,tRn,V]55|>}rpOYE,zmAN9oλ}w~gv.9=?Ƨ ,zG x3X§])Fg wwxN#^<-c37r=]ߡKJwtmǷtƮomӮߝZeb~wƾ1}b^;'mh#drO8wi3Q>_G=֞8ܹ3T]=a3.Ms R3~F_8Iy.W8ckc:Dz lrۻ0ghuRgnP!Q]þퟶ.9}/擼Q%w_;۝zի97zN}g x7򱏔:#>_?; ygC]voޜvg=aƬՐ7~q̗˛Lvݾ7}x͂c&/:S4J8N;&,p|loΐzR_ΘyȦ,)O۾d'27yV;mlxxNekmH| FV@֋-؎^sdw˛' 3,Ȝlfo9߼zC)玻`3CJ~/\dMuU3Ôo>ӊ˾b<NéNzKv.6t۶z;wgCI 8? kWؑWVw}?~wOdYjθz-^{Lqs/kw'k^i}:1l̘A7;vwP ;fkI;~6}ȷU~wNTen}'M87[/q_c' s̔ 󻓜|\tȐ8iݓvlj.eFNƉ_yi3:f:ݧ{J: 6l{i/O)|fw~Љ4+fi~w:w}U}w:Ujuo~ pp~{nZ=%N252ǾĻo}iꕭ#-^r/쓹,p㬕ѥwl:)K熧oL`6Movg>[_q:/qK:pږnlקnyצkk@wlu{ v__"ۚ|ΘXr}׾ߘ/kG/N>n͇SXr;WcC>;|7ΐg]`r2:կo9TҭՊ,d_c{X>sˑz=K}{GgT( z|d2{YښE3:mu|XS+?a!k}KλR ײy!޼Y;9YwouYxzT~l5y53.lcƎn7ůXwLڵUV״|JNr0:a7hK%|6]u}_/dؘ̜YhBa3'Ŝ3Y^Mb/+ ?*Y^˜V8kxoa|՚+wێ\:=~gK~{Su;;yzv|5|N7>}Bf,>s]NFm~1?'O\ |'y騵N)K)~-~j' +>nݠϬU0/_;޻"NƄһ7~w2ϹkSRcw۟^ޔ:7iS~?o^Œ#zjݨSsw]iR#]k`ʹi{|y,>Ou|On$U4Nũj_aV6z>9<>kw/1yM6n+XrN7J뀇# N'ݯ }8&1I(<P=ф_=?2vs뚃<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃ<ȃjwi+*)(Kb@Ғ93W^?Exaҋ9ICCr&u=0L(,(Q+nWU:0$rII=NM**NSRQXR;p\PY~4}nqqɭ*j\IĤ$KLuuoaWA[xrT-z՝g^UPPKrC|YFidm5K,7ˍw4;[C32M>wQw[K :z;6Go#y{y7r|~!H7UǍ) kk5+ǻn%τ~P_LW^3~w>C};|a] H^}F u?@dzc9.;.uK-vNL&tl-J?ДX~{[6+S_5#6d]r~~]tQBL +K^;W_o> uC'm~f^xquk3ȹܺ$q^y{}P}r<V8H3ɶkirԦMoi} M㓼c <!M畝,Ts}﫣HȻg~x9=i\3m ݰPWCν{O?MA=K޾@[$\MhL5GmmQ.aIzG蕥~lOʇsgb}ox||1xr-w?yP][ýrz8Jx㛫 &ñ伓otu㶇=#mBEshb/X޷䵏[_e~w[q]#MJO>#y{yqK|T #@M:Mzڇ/p>=/pxke'q?ms u㡐9wWzIBu1ݯ[6n 1dzsw^Y ߏޱ6?'"z;vΏݔ1OUp9uxl q31+?Yວ㏉/$>%q~Ol'19Z?uuW/H?SN8&[#׿>!7!N!LA݃u={PA݃u={P㺻ܝxR>sg MsNAa{׼BCQ曞* U7U4-ttoDM:74bm #؄wg.Blr˝,&L!69XNr_d AbD;!~iN7bUw!6ޜ$&ں HG r >BlͽE͝s'U/ A݃u={PA݃u={PI^1鯤+W '5#fRkV|-_Z܆amqF܆amqF܆amqf܆amqf܆amqfFJFJFJFJFJFJFJFJFJFJ܆amXqV܆amXqV܆amD6"qKp=H0AG&%HȤ #d 韘c4,>a4,>a4,>)5,>)5,>)5,>)5,>)5,>)5,U8ɦ&6EBz݃syuϫ?8@X_ Zq5%w؝,؄HR67bA^.fU1^sǻǮ' &}ȶ[Vã* fj|烮?i{ǟYB_CWZ$Vx:^|:Y!G|ٟ?V7sqEqm57JMȚ oZۥB[-!O'U}]BooBo,!PT}Cp b.~J>R=^d{giHBBYB29ByH#v& q>}d! #@Tt,b$t$9HH'"A|.{E=y 4ٱғv{ȟ0UΨ9˼c:jMpؑ;Oa5"t_w6֫rR|LJ,_~6'vĆ_U!k7QZ.N_I-0󫶏m4,?tvDѷ>i/O=6/f) ˺= -+t;κW.)r~fMF[N֫NNjjɢU_C;#rˆcz]W__>嗯`ġ[2}U,e'-y}yP&szaܧ/iORn4YEt&k?6?{Ԩa>SoFf5zxdmæ8v߲;!MϪ7bo378߿p~'D- uY=yT:z1mtHxո+7|q1sg>=.M~6}xUac}-Oe,Lh t4?e'J}W*{Dz.Y^4cv~|OVBկJb-bW4b^{Կxb|[L&s s(+ PKGPGeTZz>]=l֕":W C0On;7TtU݀/ܲc:"?9~7U9}nQP8=nqТ#\PU~']X1sNW $XѦnџҌ܉ݜ7+=I mC}zc}-ۥc զɵsSr43JϨ?)~ɦDΞ4h+ʊ}_ >j pNɭ>#INlE%EEE'fV `HKecB-_V8=a !EzHbnYIyR¤ٖ')r gWI% N(X6yü}qkR\LJHJJAa1Ś㏄8γyN9w!;Jw'cgʡ2;^yyzy/o卽7^xy[/oI^;yyg/Gzy/a/7^z#岗+^{y/7f^~^~^~wn^{xyO/彽E/\rxy=/ 7üýw#w^{zy//^喗G})QQe@QLHG%jWgҠLQ֥l@و e3-)PlGYHٙ eW)S(mJҧ )QJPj:IYe}ʆ)R6lEٚ=eʎ(QIًe_~E.GPF)S&1+щՙ4(Su)P6,lBٌeK6m)QRvBٕ;eo(-Jҡ)CAC(R*NiR֡GY!ecʦ)[QlOف#e'n=({RCٗeKQ@D}L{u&) e]( (P6lAْ e[v)PvNٛ?JҦt(}ʐrʡ FSu(Q֧lH٘)esV)SvHىeʞ(PGYDRzeD9r0e"sr.Qý:e.eFM(QlIن-e;BΔ](RvMٟrEiS:>eH9rPJR)M:(S6lLٔ9e+֔);PvDٍeO^}(R,t)=ʀ2H92 W53/0;0~Jd~U= 2?U 3?E Q= 3]?- 3]? 3]? 3]? 3]? 3]_W?kBgwkguKgs+gqMtL-tL-W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_L1.V=3]?M 3]?= 3]?- 3]? 3]? 3]? 3]? 3]? 3]? 3]?ӽ 3]?ӭ 3]?ӝ 3]?Ӎ 3]?} 3]?m UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW?e 3X_g{g[g;ggg~g|gzgx{gv'juKgs+gq goMtL-_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_L1tLW1&V32?5 3?% 3? 3? 3ݿ? 3ݾ? 3ݽ? 3ݼ? 3ݻ?ӵkB[WqKgs+gq gogu_u_u_u_u_u_u_u_u_u_u_u_u_u_u_u?e 3?U 3Xf{g[g;ggg~WDM/tLW/tL/tL.tL.tLW.tL=5ݷ?u 3ݶ?YY$'? IO$'? IO$'? IO$'? IO$'? IO$'? IO$'? IO$'?e 3?U 3?E Uog[g;ggg~g|MtLW/tL/tL.tL.tLW.tL.tL׭n[o  7 7 7 7 7 7 7 7 7 7 7 7 7 73]?] 3]?M 3]?= Ut L0tLW0tL0tL/tL/tꛨn^]n]\n\[n[o &sM7M7M7M7M7M78M7M7M7M7M7M7M7MtLw1tL71tL0t na_3]? dgg~g|gzMtL/tL.tL.tLW.tL.tL-?)O S?)O S?)O S?)O S?)O S?)O S?)O S?)ONUydȍm\tyA:@͉@͙恚iq؞귳;Evgog?Ws5\ ?Wr5\ W#r5\ W#r5\0W#s5\0W#s5\0W#Ոr5\(W#Ոr5\(W#Ոr5l **Em^txE}^ x1Efq5Y\jW,fq5\j6Wlfs5\jWsp59\jWs\r5\j.Ws\q5y\jWW|s5\jW Zp\-jW ZBr\-j!W ZBqE\-jWZ"q5v.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.ex]Kg]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$dD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]KKt('eKZeGZveOZ@Ze%յTגZR]KkIu-%յTזR][kKum-յTז:R]GHu#uTב:R]GJu]+uTוR]WJu]'TדzR]OIu='TחR]_Ku}/TחR@Hun T7R@JuCn( T7RPJuCn$ՍT7FRHIu#n$Օ|eI$_Y,W+K%ʒ|eI$_Y,W+K%ʒ|eI$_Y,W+K%ʒ|eI$_Y,W+K%ʒ|eI$_U6;OVN^Y"s38383838383838383838383838383838383?3kw2۫|Byg:6N{8j%57h\}FĆglk챙[}k#Y_OoL(Vm'LW5ڂkmF̊Yϭ1rʽ,Q5g~e-8yU\PXs&7.7Hͤ洜̲V^_hI[Q%do+ohvl~:6nu7$=_^πֺf]eCƔM)SlMٞeGN({PEه/e?"Jң (#ʁ){uOp$AKـeef-([RlKَ3eʮ){S@iQڔORB9R(uJe= )S6lNي5e{);QvAٓeʾ((]J2(RL$bW#5ܫ3IiP(R6lDY@لe ʖm(R,Lم+ewޔ)PZ6CS(PT(5JҤCY>eCƔM)SlMٞeGN({PEه/e?"Jң (#ʁ)ߕD LR)ʺ (QP6lFق%eʶ( );SvJٝ7eMP! !C)JR4)P֣Oِ1eS攭([S@ّe7=){QKُҥ(ʈr `D"w>*Qý:e.eFM(QlIن-e;BΔ](RvMٟrEiS:>eH9rPJR)M:(S6lLٔ9e+֔);PvDٍeO^}(R,t)=ʀ2H92]Np$AKـeef-([RlKَ3eʮ){S@iQڔORB9R(uJe= )S6lNي5e{);QvAٓeʾ((]J2(RL$bWc5ܫ3IiP(R6lDY@لe ʖm(R,Lم+ewޔ)PZ6CS(PT(5JҤCY>eCƔM)SlMٞeGN({PEه/e?"Jң (#ʁ)ߕvՙ4(Su)P6,lBٌeK6m)QRvBٕ;eo(-Jҡ)CAC(R*NiR֡GY!ecʦ)[QlOف#e'n=({RCٗeKQ@DoȽ8oOԜTzSļ>b܌ض"5îĬ'1K̊KlBzNkT7o0&`L(((ǘ1 c']0vcO0fc1cB*0ٴ C0aq$QGcq<Ɖ1N8 t318| 1.ƸcWb\q-J0n¸cwb܍Ƹ0X80bx`Tv0x 0>0 0~)}V4P_W_ W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_W_@??*F' UWRUW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_UW_ 5kுkுkுkுkுkுkுkுkுkுkுkுkுkுkுkுkுkுkுkுkுkுkுkுkுkுkுkுkுkுkுkm :௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃$'? IO$'? IO$'? IO$'? IO$'? IO$'? IO$'? IO$'? IO$'? IO$'? IO$'? IO$'? IO$'? IO$'? IO$'? IO$'? IOg 7 7 7 7 7 7 7 7 7UooooooooooooooooooooooƆ&o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &on? R?)O S?)O S?)O S?)O S?)O S?)O S?)O S?)O S?)O S?)O S?)O S?)O S?)O S_Sr}9/rci)]^毸+`g삛] ~v!.مT(dܒ[rsK^n-0ajعvajعvajعNj8Nj8Njnjnj^jx^jx^j~12wܵ#3{#s`d=Qo~j~jAFjAFjaFjaFjaFjDQFjDQFjDUTċ/ڼˋ/bȋ\jW,fq5Y\jWlfs5\j6Wp59\jWsp5\j.Ws\r5\jWWp\-jW Zp\-j!W ZBr\-jWZ"qE\-j]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.%6f]bKlv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]Kv.q%a8]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.%cx]Kg]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD9VQN&˖lKˎJ˞KˁJR]KkIu-%յTגZR]KkIum-յTזR][kKum-uTב:R]GHu#uTוR]WJu]+uTוR]OIu='TדzR]OIu}/TחR]_Ku}/ T7R@Hun T7RPJuCn( T7RHIu#n$ՍT7FRH+ʒ|eI$_Y,W+K%ʒ|eI$_Y,W+K%ʒ|eI$_Y,W+K%ʒ|eI$_Y,W+K%ʒ|eImow۝꿽ZۜgqgqgqgqgqgqgqgqgqgqgqgqgqgqgqgqgqgfeWuj(tl:39qz9Kjnи 쵉 ˜9sg._X1kbE3GU̪%27X{}kVߺX|/'J-gjr3iyl9]6i MK-eo Rs]kͿlww@#=GzvK$j{`{^zjɗmy+/uXnK[xg7^zsXs{識,0"-ZWZmi=7r٦s?܇?qS65Lk{:Klc_-CA~|*wMs-?F-?-stQk~_[}s{{o-_~{>|Ϸ}w<߷䟻o|~Y/++ܖXnnmq{k]Xs:ۻ\ݶM%< a98Ӷ>[Z_m}]벖|-<ǿxZʏ+os#9Tf]!}okT}}A75W_oY-fV̚xnՈ93T5fq匪9+Dn܄ׇt|ђӶfdo+?ESp9ʿF޼nf)=E^ =uYZ'J'aS.}h@#1Ho) ʘ?leL忠2*co nyiK8ha(c/?w\ӻ?nD3ڦD%8W*ZMEG|;t-knk_׵翵{߰k_8a0bԒ=snx7y؍\<zI]r/_9anc.vw&؄I#Y5jz-!fy |g~Bcx]lvURV0 6%8x3Yj4,V,*TU,>wA&E46-tmlx3<95MUQ5rEjϼ7zV̒n&W$idiy|6\w _澫Vot# yi#ӭ^pA-_?sr]]D߰heNf1w{z}i?E6U}:qOE󽟜ӭٓkzD>=ΛwJWu0nܵy脩ipbͺH63m{WO_g/Koףϼ8{u7Ӷw\4KQ7j7ݲѩ7=Ktpxׇ(es|3w`O&,ݹ΂aOm}Mt1;{u9J=슮A>;yZCE=i"?/t__ZUbŇ_UI7yfOs=uJNxNWiku[jAztXyMNK{}OX3g=/* ".֛'pAɡ߳!g|q}{ &Nqgqgqgqgqgqgqgqgqins[mc&o?mr[mc&o?mr[mc&o?mr[mc&o?mr[m՗79(\'`Y vv./gB]hArKVn-9%7R[ sKvajعvajعvj8Nj8Nj8njnjnjx^jx^jx~j~j~jAFjAFjaFjaFjaFjDQFjDQFjDUTċ/ڼˋ/bȋ\jW,fq5Y\jWlfs5\-νNjm^ y14ŋ6/r5\j>Wp\-jW Zp\-j!W ZBr\-jWZ"qE\-j<[-gólqx8<[-gólqx8<[-gólqx8<[-gcs5\jWsp59\jWs\r5\j.Wsg]K|v.%>g]K|v.%>g]K|v. x<[-ϖgK%l x<[-ϖgK%l x<[-ϖgK%l x<[-ϖgK%l x<[-ϖgK%l x<[-!ϖgKȳ%l y<[B-!ϖgKȳ%l y<[B-!ϖgKȳ%l y<[B-!ϖgKȳ%l y<[B 7Oސ?yC 7Oސ?yC 7Oސ?yC 7Oސ?yC 7Oސ?yC 7Oސ?yC 7d쒐]KBvI. %!$d쒐]KBvI. %!$d쒐]KBvI. %!$d9VQn`97_-iY}nT/Ҳ'-r -ҲTזR][kKum-յTזR]GHu#uTב:R]GHu]+uTוR]WJu]+TדzR]OIu='TחR]_Ku}/TחR@Hun T7R@HuCn(Օ]( T7RPJu#n$ՍT7FRHIu#nuy_m%-Ҳ#-Ҳ'-r -ҲTW%ʒ|eI$_Y,W+K%ʒ|eI$_Y,W+K%ʒ|eI$_Y,W+K-;[w4l_'-r -2?O[w4liҼygKΖ-;[w4liҼygKΖ-;[w4liҼygKΖ-;[w4liҼygKΑ#;Gw4i9ҼsyHΑ#;Gw4i9ҼsyHΑ#;Gw4i9ҼsyHΑ#;Gw4i9ҼsyHΑ#;GwH H H H H H H H H H H H H +G#ʑ|Hr$_9W+G#ʑ|Hr$_9W+G#ʑ|Hr$_9W+G';Ow4o(3w=%i^Kze KLi7K:?SW|8ln>1Q5Ew3;zGy]%$cX{vKv::|wgk{ؗ+w87ŢeW;rzzWQqK'?n7b{hs֥_/V8Ē[iz8wqOq)/PqZvyXس}?s~z}ou|bC _厗)9qpɗ.3.*7g|b3q™~hŢRw\*]p8u>`qЪ/!ܓOXl?tNb;EͻlN}UtnS3>Zfe^_^|/,Y]݋(/x⨶⬂'Nkt.*xmMqUwN}SXk]{ԞZOFLR)ʺ (QP6lFق%eʶ( );SvJٝ7eMP! !C)JR4)P֣Oِ1eS攭([S@ّe7=){QKُҥ(ʈr `D"w.5ܫ3IiP(R6lDY@لe ʖm(R,Lم+ewޔ)PZ6CS(PT(5JҤCY>eCƔM)SlMٞeGN({PEه/e?"Jң (#ʁ){uOp$AKـeef-([RlKَ3eʮ){S@iQڔORB9R(uJe= )S6lNي5e{);QvAٓeʾ((]J2(RL$bW#5ܫ3IiP(R6lDY@لe ʖm(R,Lم+ewޔ)PZ6CS(PT(5JҤCY>eCƔM)SlMٞeGN({PEه/e?"Jң (#ʁ)ߕD LR)ʺ (QP6lFق%eʶ( );SvJٝ7eMP! !C)JR4)P֣Oِ1eS攭([S@ّe7=){QKُҥ(ʈr `D"w>*Qý:e.eFM(QlIن-e;BΔ](RvMٟrEiS:>eH9rPJR)M:(S6lLٔ9e+֔);PvDٍeO^}(R,t)=ʀ2H92]Np$AKـeef-([RlKَ3eʮ){S@iQڔORB9R(uJe= )S6lNي5e{);QvAٓeʾ((]J2(RL$bWc5ܫ3IiP(R6lDY@لe ʖm(R,Lم+ewޔ)PZ6CS(PT(5JҤCY>eCƔM)SlMٞeGN({PEه/e?"Jң (#ʁ)ߕvՙ4(Su)P6,lBٌeK6m)QRvBٕ;eo(-Jҡ)CAC(R*NiR֡GY!ecʦ)[QlOف#e'n=({RCٗeKQ@DoȽ8oOԜTzSļ>b܌ض"5îĬ'1K̊KlBzNkTh,8 01J11bL c0c&,{cŨUa,Xq!08(18D`q:ƙgcq>ƅc\r+1Ƹc% 7a܂ v;1Hc܇C`xc Sk1a<0; ko`{`| g_`| w?`>z(ீ +ீJ+ீ +ீ +ீ +ீR9f}Q꫏K_}$ +ீ +ீ +ீ +ீ +ீ +ீ +ீ +ீ +ீ +ீ +ீ +ீ +ீ +ீ +ீ +ீ +ீ +ீ +ீ +ீ +ீ +ீ +ீ +ீ +jTW_UWUUW_UW_UW_UW_t_}#c *ூ *ூ *ூ *ூ *ூ *ூ *ூ *ூ *ூ *ூ *ூ *ூ *ூ *ூ *ூ *ூ *ூ *ூ *ூ *ூ *ூ *ூ *ூ *ூ ꆚ? 5_ 5_ 5_ 5_ 5_ 5_ 5akுkுkுkுkுkுZe1_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_ 5_mC~gX_u_u_u_u_u_/# _u_u_u_u_u_ߣO.0_u:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:௃:oO$'? IO$'? IO$'? IO$'? IO$'? IO$'? IOIO$'? IO$'? IO$'? IO$'? IO$'? IO$'? IO$'? IO$'? IO$'?f 1 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 7 5_wM7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7Pu?)O ?)O S?)O S?)O S?)O S?)O S?)O S?)O S?)O S?)O S?)O S?)O S?)O S?)O SoGP ?A'h|4>tGN },;`qXw},;`qXw},;`qXw},;`qXw},;`qXw=L,abq{X&0=L,abq{X&0=L,v.%6f]bKlv.%6f]bKlv.%6f]bKlv.%ԙ]bKlv.%6f]bKlv.%6f]bKlv.%6f]bK⾝Ÿog͢ŋqΚŸogf1Io'r]#k|u5>ں[XXj]Kv.q%a8]Kv.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.e]K\v.q%.ex]Kg]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%>g]K|v.%$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒀]KvI u[g쒀]KvI. %$`쒀]KvI. %$`쒀]KvI. %$`쒸}vŽiŀC^jq/zZjq/zZj^Ѹƍt4qhDG:Xj쒐]KBvI. %!$dD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"vI.%$bD쒈]K"m`6HjX$ ,ImER"m`6HjX$ ,ImER"m`6Pj_fI,}%/eԾ̒ڗYR2Kj_fI,}%/eԾ̒ڗYR2Kj_fI,}%/eԾ̒ڗYR2Kj_fI,}%/eԾ̒ڗYR2Kj_fI,}%/eԾ̒ڗYR2Kj_fI,}%/eԾ̒ڗYR2Kj_fI,}%/eԾ̒ڗYR2Kj_fI,}%/eԾ̒ڗYR2Kj_fI,}%/eԾ̒ڗYR2Kj_fI,}%/eԾ̒ڗYR2Kj_fI,}%/eԾ̒ڗYR2Kj_fI,}%/eԾ̒ڗYR2Kj_fI,}%/eԾ̒ڗYR2Kj_fI,}%/eԾ̒ڗYR2Kj_fI,}%/eVo3dR||>>||>>||>>||>>||>>||>>||>>||>>||>>kw279q^-Sg^#'NZ8gI WA6xy7&u=[S'UHV?Jxu#GQ>ݷ!F# =f1Z`h6m1aFg.]1atFo>}1aQaaU1#1c00p#1Fa] dzkx}Bްacs"οWf誟Ike՝(^X1sT-+X;b 徬'һ(U kJ-*]Q5z{7}N/51U1뷾;j{Owo7rQs VV_+ *y9К*?J/!>?nsǖ)+ґ}>{kMk6Yd̶l$O[~_mV_zm@uhFn^zY6|7YZi6_yjYwG]zw6nNϴ{TGWPwWT}~a --=[Jb:K,6I{7n ˮDed7Ia%|f2FCŕ~çC[fvo.vozo[=ˮ͇X;6-<[zؼ&T5 l^jqD"{'pkU^tM[OὛ-sVn lu-l$Vg1M6~YN ?D/ ?yϽ+f[ [77^TcmM%MoP]-Ч7&Xe4ٞ:V_.b E0}z~cBuyװdOiłVlTmO3'5Sn3w 3? ߫pfEUys*WVS.Z0}ᢊ‘ϭXEW5a"7~ 4+sԖVf5`N圪9YZQ]U)A,Nnqe:OiMZfi)S@yu7(ߤ|Qg)|m;( :vj=Z5{᧬UU8jvNtt2983838383838383838ĉ/`os;3,w[!ٿН~aԝ~j\Osy2s;<adY.O\U:6.7]GT= O qWN[pz +fͪQp*}ifio7t~ˇYjj- SٿϜ5ǣkf&;G=>nVN#fs;=;J/xo~d9 a=`fwo_}ݟ]#՗ aURlL9#5:kso.̱͙^#Uf_P{!߽nfs ;gޜ3WV-?7.gV,_OIt\_pV~ӳ7K?}a%fQZU?Lܺa Pdߦշ LjWs,?r&9u 8Iኌf-Ƚ1j]g܁W-ȞQ+=qgрXiyAژ;bтZ>k?ˬ~f,3~/O~U+K|W>ѯa,oS7-sf[y7~̓MÝYǏ__ Y9G{EO5[~ńyX0&*__sʡp+)>ݯX V_>]uhEgl$|zƯӖ>vQeԦsy^f-o&x̯A ̭Z u"Ѝ._EH]-]ӿ _hRflrH-gR|w*jd3Qz/I:G^vؐԂ{t}0!J:6MO>ńGń=^W*1q>iVxr¢^cE#_[ImgbBkO~|K(ݿūwY:gϿD8Wr'uQ6ĹEm&gIU'7kEŔ>?%+En/7>ALXV-&yiQ1~yҽ` 7Oeo#DE{dki .HscNn7{>=7>},JfЕmE|S|D_QyܤgvNi^xȐֈ;vqCѱ_qmK'Mo1xQz|R=u>%}[[VF5YxEi=HV|϶ee~+J޹I^a"&%v ~(>DN }?f!3q$ȳ9T;D_z1tG#ZO.8D㿴`/s6p1ybʑL>]4_k$ʗܪ6>xm5<,&>Sϼp(޷ή?(ʺ+OSZL?;_y󲖢1k.~nbJO|wRՇZz]L-嬻h+J`}oV'ɧ{|e{~VOn>s1g]7?wh(-~gڿ(v/ggx(>o:~%?O|)ie-z3D [y:?9o(XA}r_Qnw-J=OV]ٺ݀*oOSv%d 0Q]rF?|(v;RLiZk.ʧ~)J(n/'&}!JkqF?&8[DəE /sr/Y~K| Q*v^(Ff²wԓEi;.cJۦ8_|n1.8kQ~ʷ1yK~9.7'&^|7?صY;_6\q/o^ġkn]Ϻ(tSe郋ڈBwޱ]f=}9a3&2\f,o(&^Ó(|NgYL5څk˺^7cDI䗯%N~萗V_tbӝ(;oG*J{Ə^ղqnQF J /M-g-e:x_ o7뉒ڳ8 JxW(;|Gmw(nߢOы~C1WVU|Nu7N}hQ2mE~c1i{bj(c5>cYcTV'ַzQbNM-~U؞u+eMS^r+_ܭbgD٣{V-J&~Fg;*{g^+Ż[Ko=N1=rҹ=,J|>)=RG7wcbrl6QRe]_)u?(gg{b㻈k_9]1?>EYY}b7fv;(j#zK(&[h,ǽ$_Um犒oZ21go=ۑNSEYNQ];\ϵy뎺N?)8<(=9|lc>}Nn[c9˧5(J}{z6yEWQ˿+/oԗ6NS݅sƯ'/JЋDºwT{HLRbq[M;߿]Ie6=ZQܰ9.vM4y^b||+Ŕ^o6y+SF>>gOB1Ԋ; ~S^X4鄱Dc5'>7D7/lϦ"1 <8%1WVt[Qw]ߔ{فC/{ñݫDٻ;? <ޙG\Kp%lͿ 9DL,{W|!g^c/F?+s(.ۉ)|LaxaTy tRDI]/Ƣl}.{HLy}{8F?rt,>7*1]|^\Ĕ}sx}e4q柊Ƀ}t Е׌{*Q4+Jvs/SkҢߥ_/ZW*Q"J9&'e޾?ş4\tObJlkف}^p([§D^w{d|>X2w/l]b7vh|x3'?(>.8?pŸ>z޼ń>.׊KOh7 }7dҡĄN)|q~=ŸW\RGl?`œ=#&X1iLD]ֵ/b(Yn<:'_1uMP>yËsv&ƏoWQ|+ Ӆnk0;,&;}Rl/]p_ޞ=O)J5{)b½g)NޫD Dq ɏ-]2 1;汢{c9m1􆫆 RLco7'ZsDIesoZ= obbI.O/IL8hᰮZnw! DɍwnBo J<|.'YU=wڧ,J~.|xu̺L>p+&>KG CP_߸v<*ty]<~=v8&|^LJoʽY/]r:_lEɲޥn') ;>z^3.ySyTL|aK&hbwѾ˲D۳[?|/c{hY{x+{ |߹oebBo[&]sb!&:vWy bBц=nQzPK.jح7]^;ky(Go>nQχF(aW|aPuφޏ~)]})>v}3oMQ8(Jڬ;Imu䅻yDOO?.ŗT>~l}#Eɪnް/)ю?!&bS/+J JJMQrʀ}~xR]]wR^d>bƒ+{?w1}(ݽG'J\ 0'7^zfFF1g|=zn{@Ln{S'58]^κ}xOW#&^\/RL7Y>1{}۱R1`C9~|c\#&xљx׳oQִܝؠ6]V t9%>uѣĔY#_=.lQ:a({/@Q6cUqmxYQ'?}(9+Ztɝ'~';?ۿ-27o?TH~ّR|L,Y/L3imUl֟l=_{NYFSG%t>zY%&Gw},Y?Oef땥7=}_6aٖ/~oa+gk_fyݯ߁.,9>vvT$tʾ7ylz\}?ޯ$=![`۳mz>7nl\_F]>01kU^;Fn:囿&坯mͶmo-Kog;.^ͯt.<^Yϛ&{^YsOw=>mOj[.{p{.ɿyhv.ݵ՟+yۡ_j{ڶokۮ>dz7[2;(;JĖ_G{U$},f9!yg3 ^Mɿ-&!{%tڌۯ|uj{f/_ϵ+=jyYϮy>fut7lf9o~-͏z(,Ixz].^)yϿ>{yfҲM}f}/0}}=>K[Ͽ]Y~ֶ{/[Bݾ>^n em!eq}٦g?7y3|u?op'7nq~O+瑿.})>m?] m7x{$|'J$6~]}-λ_e}smzϱ6C睭a>¼۹-}eWm/M~{>l(Gl3{@v]q(]қͿ]vn٦Ϟr??ߣ/׶]qm;??Kk߯}oovdgwvftyY-eo>^6g??x$6}i#_WbNn,|mZ?Wh{~3zrm7}Uxv{+{AD/]OWf?ۥ5'rts*T͙>wҊ⪅JH[juBuq.r?`BJKjEU+ +TU,>p9X[bʊӫTU8gVaeŌE/< ţL¼ɷJ#);vZfv䲚susi9J^Uh%<8ѿBgymlvVń1Ԧ/Cj~1ԦcU [2_eMZnnS17w|ش`N$ MeN}KhzrYn[z4=pEU{V.ZP1cά937aq[[~ /w/~ u;o*ѹKeo?|<߾ϷVE_6ok_Cl5+$|w<.w-]|d92d9D|O)>ŧS|O)>ŧS|O)>ŧS|O)>ŧS|O73fsK^?QoɃX]MSRq2I7">*Sǜz=ޖ~yoSwwTbп ˾+=| "̝gAs~L].z|_H;B;c~IQ8r v:Rp1rf/\xbĬ*-#߾S1ͽ{|s^7vKUqº+Q%}/+_?O{}wX=])#YNwr kíݖ~@lQ M_q}Bov8t1r 5Lɣ{\W^ էU}N9Zx/~s_mCtыC1kg;1Ղ>kpï~k]k>7!OM;MO~חڇC <>yŝgܧL!~꽾ޗGvb𜣎yrW|߁+~Jw>rp?I/ KrT9{GOO?5-Z{ o.o~|)ׄb?LqbT;-1n8L/=RxnkjI%-߳k^s=ӥ#v|QNb qV=={%==w_=^WC'}Iw///JO>k zMHZfȹ?~PSߞ|KRt}rw|~jշOʓ5:{x]u:;=?(Ha뚞AODص';߶xpҵk:{-䭴I;t3gQt=k~Sa݄^>!҃~/:´臱|nzҥO{o;~zHn[i8KU\=V%DX=kǞ>7=hV4 ]-^=.qүN ';-=^}u@ #5;ݫeS 㼞K]}zzbsW!}7^C[ {"\z~>|ң_Z_QN_zy&v & {CX|{{ݥ"1n:oBw?o1& #_ogo7oz`a'x\]7gT õv[9I6mc*/y?N ]vh%o{}ftG3oϳ8%KuoX"YygߎήSb҇WP޻sǩOօ9 SzǾ<]|r4yz?Ϛ_qjwܒ|ku`hzbzNӦ.[V^5x>5v6SNO|⣧ytwv~5C'V^\bxsWKic;z?#nf eߝT~h%==R=]r{kzJ=wCo;nӫJzsӛ}垞tUxȣzG҃}wFe{z痴Z}Ϗw9O|vxߕ7ENoqQU#+f/O<9 GZolzMsJuۧ8Uc˯ip ;KgBazZ9`̅_K_Y*=?*ݵI^ =yNMM޾+qҢN Vߜn?=_i/B_1Vk#6l|&n~a}7Mf^'ݓ.}ʆ=oH޳;Lɽn(Oڿ(vH[#GN\w`1/HeҨΪ\!`UrIE?`A}3Ek(9yx1̷cwuDıԉ 1qmPtygAS/Ĉn(9䁢h`{bzSt.]t!_ʪw/!uy#ň?j&zu#Wt1lsEl%~N֓=tZcĈ:Uw1v{nZx#S^]'{O|wѧGj^oIBxߌxp[CA'_ݩ gD,]ӄ}&~oǝbD)Fuc+7q~|DqSGysrr1xn(J4^ _.nvYu?{IO޲캱Vױ]%'L9gz+&=.8봺'].+0=yKIi#pO`f|%=iwt)=Qg~fsOv f=},{^OS3^N:1='ϚxʇǶy;-퇺˻i'|pdް]LEW{s"ҵՍHo>JTY9t{iOғ:̻XuުӃ}+ taEWa`Dz/>Z~NR.O|[/ ӓNNGÿqGmYҊƩvOFeǿngܹ:=hKV O}{:n a}.Y0}3cW+JEsuWxJ/^\~a>w҅}AGk{rO:׽4wF3sOxӪXŢчm'riZQ?X`^>a^l tgEx̚i?go~w/W"] >ͽy ᝶S.>cL5ŀn8q*1޽Rvs~.^uV7y$~K7y |aB>wQ{ 7w9MYn{(|'i%zѰBav̢V+?q*]t7,_R;WLj}ׄxMbpj(½C^ u!K`l?{{QhuE<2`ۅӾuYte׏]nOѥaO_ ]a׏z]-<>lܙE^&1?h1Çx@^vW__&p\ة=rט/sJ25}/hil4|Y"k}3^+V5M5Cݡ Ѫpiw>%,=,W`w}jQw'Mms_4{똨۟=j EQu;|s+N;7qkUWŢ+vutnOtdBt]wS\qܿVnmv4't\;aO;ޗwO{sQ5kX ٥Mn-ZuО/WXp~|{?/_:] l,M5o8sŮ钢߶L%:K~YY=]2tݘ.}Z}[bpNr]w<DjfŐ~뢶ɶ'gz fsމ_ߙ.4rOg=ugsO|a E{CH^'mH>]Y>쫾?%r 1/{ev/N1i/]^x=Wxq !.;uowqE[̼[=49Đ׻>Y(=_Yyo?qD+?"F<|Q u³S'?'z\RNxJ cЂk_>:=isMK7FxKagv\b=ns.n1W"7٢#w'z]Q~q~~m[ !zlp9i3(=ΰMݳ>6>;ooe٦%esVh5[t+|k_=]_޼sӓY 餤GNc̍#: gS፭.ƞ/~zLK;-KrO_j㞞t5޺*-jm%;9gyM*a/{6sftzЁϷ;dOS?K7[UׄvC<͒=CRןWk^9X 3{=MՉ?ӻ5c7vN{׎~vc_Ϊ>9;M>t߇Λ;*+1|;}嵋yڜk:߽ۗvW~a<~7,~Ǘ0ؙaǟ])Oy=Nv:?пq[t엞wk Zꔅ޽^y kp˗>tžh`FGun]K#n&?rי8i/y~clw6xˋgt'~-i|8tſxYK7uOs~Kwcmtֽ3~կx#~_tV<|^沫} ܡ}tu 9':3w;_iIO9o|魝3ɫ:/~ORtzg9/;Z1/_Ϲs,3Ox֋/J'<)s{^`;?\MoteGO=;'O,:婝Oy1f鞶g_6Ywwʫ7Gu'ɏ=/7o}WUV-qw_՝N9/#o}N']/>{?~ʯY?]}iu7lz3_4or_ӝ7eΏ{ؗv罹3qu&?.2?:Y/yg=?f+GwN nr>^In:o̎3mw;x[}Mwvk_>Oqʿ2o|3?{c?qO2Xs//&|U'5ܗw'N~A;zugε{KuxM}ܻg|ץ+}Ws5ӓ\=qk5iQͽ{ޞ>,ŗğ}wwW?_/{YWM?7qiw^U=kK'uo.6gWIù|oqo'sâ']qS}ۢY:SG?R\wg>Ϊ۽,`Owsk^Pۍ'?Άg||ogz 'ݳnso\/wMqOޝ{~R^wΘKotaϸcc?p3ٿ n7{[lzV%AwI_l̎z>I?/?3~(M!\w?v:{sg=;KO}ŝ箹sic~S?;:뗟w}sG?]sSuNz{ە>wo]|⇡_K$[]ŝ)\9Нv7;+~+`g󿸶i;ǿ5Ei3nz ^)fO2z]'|/_3s?zgNԿ/>?Y+g|ƣ^۟3c6n/ğv}cS7;O=j+;O}K_u6Ek{N,y=+~3Ͻ{ʘWΝԪw+nG~G=7ԫƸo^xum6~Nsi=W{_3~ٯV e}56ȕ10k޲rޤ{vw}WY1^{fܻ]uyZ=N랻|Gwpdcwe|?>m:]g{.X>+Oo-suWq}u7k-݁x>8=7?N{<}+tI/G737k/~фufĉ_fgt>1m{woe}M59wXOx܏84s8)8Oy? >aՄfa}dQG7njjjjjjjjjIPC}(9:碪W z.j(qC͡8T)]a7mW @?` mZup侶Kmۥ~߶Kv=biPV[珰#Z57;p_0/Wa3ح}cԼz;x?7tuAgm1?r\u0xs'ԗr`tǻ09P&;:x<9Cqzŕ{v_` 9 HE;jjjjjjjja|TC}TʽvϮJ-~0?(Ts5\k~sݵc+'sn1T_vS=>=6+mϭCi8?O~^ {Ce{mo3'w|upx5*Y5euS^|t~>ߺaձyJb,mT)FOlU7n>Ȩj\5\6LJ?6ŢѰ)ry?rqrې4_u_(z*~z15 H(u>FkC胼F=oX#S=wwQ5ySTP=^W߮ΛeUVld\_&շ+S~-u^9jnΕN{1Xm4T'c{qhzG]] F{תqloȾUM0OScտK/^u)׷7ޏ?RwAH絑j~n_:cqcRinлU.'cF/{W؅؅^CIW}f8WmkoTEL{s~lW{X}mY@ڶXy|ڮz/(c7:_ qړVlJK ~ޠU13^lPSMu<\9f;I<_Tqmo_Ǩ;VOy#WX_McZY"]HKuec|n"vy`:~:Cy>]b{h*yZS]UW?^hCBګ>@J\#{bcz sVW^ FF~zhٶʉsQŔ?w]{]:pϯǙk$sӪ֫\s zs~`9qlw~C0xNOs~>?crwiv}ov}ov}ov}h{$MQܱg{78`l~q~qI%#7wl|]Ɓ8Վ#r8"ӎ#r8"׎#r8"GЎ#rjǑ8oql`mh64 FE ͢ԆfQjC(Y,Jm(ؤv jCr{7ٵG-X:2ڱoo^1?R~M_L??4gpQ>xso6̭jjِ w/',n_Z?E?qq:a꽌}O=}%Qozcxʒ]wܵ}M [&;{z7V&v]GB^#G |_㇕҃uxf_1ΰ%ۛ5zmﶪ߭տߪbM0{F>߷M7;Fw_wo`Ž5X9tR; 'wgֿ`8cI'cq*icq&Ygcq.F0xb<a<bGa<1`<R 8q10`\q%Va<cNFm'UWcTUŸZ0q=1nIcsb3&Dy`"L䁉<0&Dy`"L䁉<0&Dy`"L䁉<0&Dy`"L䁉<0&Dy`"L䁉<0&Dy`"L䁉<0&Dy`"L䁉<0&DsmU2y`"L䁉<0&Dy`"L䁉<0&Dy`"L䁉<0&Dy`"L䁉<0&Dy`"L䁉<0&Dy`"L䁉<0&Dy`"L䁉<0&Dy`"aey`"}L<BX y`!,䁅<ۿքBX y`!,䁅<BX y`!,䁅<BX y`!,䁅<BX y`!,䁅<BX y`!,䁅<BX y`!,䁅<BX y`!,䁅<BX y`!,䁅<BX y`!,䁅<BX y`!,䁅<BX y`!,䁅<BX y`!,䁅<BX y`!,䁅<~b܋<BX yP]vu y`K^y`#l䁍<6<6Fy`#l䁍<6Fy`#l䁍<6Fy`#l䁍<6Fy`#l䁍<6Fy`#l䁍<6Fy`#l䁍<6Fy`#l䁍<6Fy`#l䁍<6Fy`#l䁍<6Fy`#l䁍<6Fy`#l䁍<6Fy`#l䁍<6F%Ư06Fy`#l䁍<v;}__ W?*yT? S<YGy"\"\䁋Gy#|䁏<>Gy#|䁏<>Gy#|䁏<>Gy#|䁏<>Gy#|䁏<>Gy#|䁏<>Gy#|䁏<>Gy#|䁏<>Gy#|䁏<>Gy#|䁏<>Gy#|䁏<>Gy#oa|;@y#|䁏<>Gy#|䁏<>Gy#|䁏<>Gy A< @ @ȃy A< @ȃy A< @ȃy A< @ȃy A< @ȃy A< @ȃy A< @ȃy A< @ȃy A< @ȃy A< @ȃy A< @ȃy Ap1͛lZeצC-̄ n=C}u!?YdY#ov}ov}ov}ov}ogǷߎްqDGpqDGqDGqDQ8Cd>ȟMO6g"oU/ܘE%v]>t՞~+uUUy|ݗ>>;^[`}i?ywϘfOƿvݯݝwYqOwʍ_ϟ8~?uCwo]5Nz{KS.ڍkW>Utf=Wb^wxyĠ[w}Kٝ󭟼eS2ʁ>{߻v; _3e{+~UOβ􄻯lWP]^r}tg>nr] nwf>+ϻ{>4Gz%ϸgtRU/:yQOsщ&]^\/pV/޺Y7WyM'y?zݧ?ub+NtOy~s/mw]qƛ~-mtn^s}'/~Oۜ~^wi#d]%wŋng{9gwOzwwGٛ% ׿l$!;yO-D?={޴t;_Sxp/Gug,ۛr+ojջ۴WQHV@6{3V^<'Whzj^ܷzOzX%.48:eh}tN=9vi_Dw6oK7}Y%cTʊEAoö_KTNeC{6 xoqhO`qAfab'&}0L&ƁGl>~Cv ?jغgm[ڸgWWE Kw m>xJ]QO4-:NtDɢSE%:KtNJ.=^trh$f*5kEMQ[EG+:^ti3Dg-:Wylj.]$zѥDET4-EW5{G"F{'':AtdѩE%:[t|cE/Xt P4E3Btѵ-DLj/:It43E+zJ]QO4-:NtDɢSE%:KtNJ.=^trh$f*5kEMQ[EG+:^ti3Dg-:Wylj.]$zѥDET4-EW5dϽRW DG :QtTG-:Gt@t豢 D],\th(Ƣh!JtZQSuD}QcDNJ$:Et љG=Ftq E Dt2AD4EKѕE ~r?sDѢD'N,:UtQDg/zE.]!Fh&Z]#VEQ_tѱE'N&:CtѢsE'zBE'.]*LtP4MEsRtjQhO5+uE=@t8 E'N.z,٢sDD+@xŢEWh,D׈5EmQG%:FtxISD)z\cD'Pt KD.MDS\])Z0ZG 84,}`K Dh0#4 "KK/1ugʏϼaco=wwwwb}=wa{2]1ݼ7]qS17Ox&Ƴ1<`܌BcUx-0ހ&` b =Ƈ0m4g1>E w`|]6w1q7Ə0~S{0~+`܋{?gUeX&;{ꏊ0Mu;w^G0u^0u^/u^mF:z:x &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &:ձ*^2u(^g2u$^'2u ^1u^1u^g1u^'1u^0u ^0u^g0u^'0u^/u^/u^g/u^'/u - - - - - - - - - - - - - - - -u.^2:U^2u&^G2u"^2u^1u^1u^G1u^1u^0u ^0u^G0uh;:~:|:zm3 mmmmmmmmmmmmmmmm׹ {ש eigLz׉ {y {i {Y {I {9 {) { { ,l__^wwwwwwwwwwwwwwwu.^2u*^2:UdDd<c4c,b$bK~0u ^0u^g0u^'0u^/u^/u^gK~G/u^/wwT. . . . . . . . . . . . . . .s:S:3WɪK^'2u ^1u^1u^g1u^'1u^簥Fc:C:#:::}:{:ym6==============={ױ {ס {ב NdՏd<c4c,b$baK~0u^g0u^'0u^/u^/u^g/u^'/u}V5 >>>>>-_c>>>>>>>>:c:C:#:Ձqy {pG:::s:SR! { { { { { {NUk9r5|ub1 {/hT4_nѦs9kbdM51&Fțy#obM71&FțyhbMQ41&F(EhbMQ61&F(elbMQ1ppӐӈӘӄӔӌӜӂSF -dBF -dBF -d"F-b"F-b"F-fbF-fbF-fFK-aFK-aFK-eRFK-eRFK-e2F-c2F-c2F-grF-grF-g F+` F+` F+dJF+dJF+^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%'l̤jy扚jy慚[[[[[[[[[*T~* _ʯBWPU*T~* _ʯBWPU*T~* _ʯBWPU*T~* _ʯBWPU*T~*>~۝/TS՝1zZmV[mV[mV[mV[mV[mV[mV[mV[mV[mV[mV[mV[mV[mV[mV[mV[mV[mݼUݿm8mM Sg+6iϮ7T=AoՏUاMWU(=Ct&g̪o/[[T6zNrr`dOI~W{kVzhqD'N*:](YE=VtE E#X4-DW]+jڢ/:JtXDN!:ShѹLj=Nt"D.]&:(h)Rta܏TϽRW DG :QtTG-:Gt@t豢 D],\th(Ƣh!JtZQSuD}QcDNJ$:Et љG=Ftq E Dt2AD4EKѕE ^}^+EljN(:YttѣDg#: :_XNj.].B4DcL]%Ft)j:(1cENjN":MtLѣE#:O8хDO]"Tth"梥Jբr?RhWzhqD'N*:](YE=VtE E#X4-DW]+jڢ/:JtXDN!:ShѹLj=Nt"D.]&:(h)Rta܏T>J]QO4-:NtDɢSE%:KtNJ.=^trh$f*5kEMQ[EG+:^ti3Dg-:Wylj.]$zѥDET4-EW5$ϽRW DG :QtTG-:Gt@t豢 D],\th(Ƣh!JtZQSuD}QcDNJ$:Et љG=Ftq E Dt2AD4EKѕE ~r?sDѢD'N,:UtQDg/zE.]!Fh&Z]#VEQ_tѱE'N&:CtѢsE'zBE'.]*LtP4MEsRtjQhO1+uE=@t8 E'N.z,٢sDD+@xŢEWh,D׈5EmQG%:FtxISD)z\cD'Pt KD.MDS\])Z0ZG*S>J]QO4-:NtDɢSE%:KtNJ.=^trh$f*5kEMQ[EG+:^ti3Dg-:Wylj.]$zѥDET4-EW5Ƚ,gy:;?Kb󱲯Ta;CΑ} "aT DVhXQQ308c#`<"1q ƥal؂q%0a ck0O6]qƓ0nx*0x6s01^bb` x0ބaVwa}F#ø ,1_cT .1Ə1~q/0~{1~G L7M7s"o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o &o'[^#[ - - - - - - - - - - - - - - - - - - - - - - - - - - - - -mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm1qwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww_ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .{{{{{{{{{{`{{{{{{{{{{{{{{{{{{{{{{q}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}???????????????????????????۩j-sA4"O=+.3'Q=IROzՓ6E,nfI3KYfV4&FĈQ#jbDM51&FĈq#nbM71&FĈq#nb$M41&FHI#ib$M61&FHi#mbM61&FȚY#kblh<6`C64`C64`COgym:N笉51&FȚY#obM71&Fțy#obMQ41&F(EhbMQ41&F(elbMQ61&FYǰANCN#NcNNSN3NsN N-dBF -dBF -d"F-b"F-b"F-fbF-fbF-fFK-aFK-aFK-eRFK-eRFK-e2F-c2F-c2F-grF-grF-g F+` F+` F+dJF+dJF+d4zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^K"zID/%$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIL/%1$^KbzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIJ/I%)$^KRzIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RK zIA/)%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKKp1jy汚'jy湚j*n*n*n*n*nF*nF*nF*nF*nF*n*n*n*n*n*n&*n&*n&*n&*n&*n*n*n*n*n*nf*nf*nf*nf*nf*n*n*n*n*n*n*n*n*n*n*n*n*n*n*n*PU*T~* _ʯBWPU*T~* _ʯBWPU*T~* _ʯBWPU*T~* _ʯBWPUmowPNWw_9kV[mV[mV[mV[mV[mV[mV[mV[mV[mV[mV[mV[mV[mV[mV[mV[mV[mս aw|ņ7ٵ' Q>j3L?k[lݴmCoh47o ">k㮡'G|Smۼ 7vЖ\sIC[Rmj~MϹp5Oe{}DV>UV|:r9#w‹@_kŞ;W۟wp{?1־toVoĆ׸÷}w_~j_ũwm/K{\t?3񪯙~K_cy%^'ȁOu?u~Uϻ_`k {'w;V?Mh|xh~雇lڻmω[wl޺S|֝;-cr9i'x?UU(-ךLug,_#ϟ?b֛6ef9 gձ<=BI8y=c$MN3?_P/w.{lkha i pZgI_#Lǽyë>| :-'t&|[^ޙšOL97Ӭgt>o㾗|ǝ駽n}3' <3룓7~ꯍpJ9P^O2OwW=]靅~=w?'wgٌ~zu6W]rvw~(G}/9[:3} }B7].3wnSr=M\guW=gt3:#UwH].RuTE"UwH].RuTE"UwH].RuTE"UwH].RuUŪbUwX].VuUŪbUwX].VuUŪbUwX].VuUŪbUwX].VuUŪbUwNuBbuX]':!V NuBbuX]':!V NuBbuX]':!V NuB*V~+_ʯbWXU*V~+_ʯbWXU*V~+_ʯbWXU*V~KUݥPoy|T].UuKUݥRUwT].UuKUݥRUwT].UuKUݥRUwT].UuKUݥRUwT].UuKUݥRUwT].UuKUݥRUwT].UuKUݥRUwT].UuKUݥRUwT]N]':!U NHuBRuT]':!U NHuB2uL]'d:!S NuB2uL]'d:!S~)ʔ_eʯ2WLU*S~)ʔ_eʯ2WLU*S~)ʔ_eʯ2WLU*S~)UrUwyUrUw\].WuUrUw\].WuUrUw\].WuUrUw\]PuW+T UwB]PuW+T UwB]PuW+T UwB]PuW+T UwB]PuW+T UwB] uPB]':P N(uB uPB]':P N(uB uPB]':P N(uB uP(*_ʯ WBUP~U(*_ʯ WBUP~U(BUP~U(*_ʯ U#~HGj\xk^9'=w8 uO7y_dSj}S/uou.;_uo\{^u?=[_Z} 5q/'ꥧqtpKλ,:{޻sk_Wڹq3o^՛W-x1K:{>q_6΍cSu?.]~_ggΊ^ԹC?z՚vyn~BkvvnMӟwosW9HiKnyo'︣sK^/< O5SVWl)yқ/3s†OY3u]lEꭃ^#|3^< o {:OxWO]FowsG_2s;޸hs:{эwt=[덝 oG;7|v_=}}ǟ΋7hK}O{y}tL=g>6{43΋>^tտpp:J]QO4-:NtDɢSE%:KtNJ.=^trh$f*5kEMQ[EG+:^ti3Dg-:Wylj.]$zѥDET4-EW5ʽcWzhqD'N*:](YE=VtE E#X4-DW]+jڢ/:JtXDN!:ShѹLj=Nt"D.]&:(h)Rta+=7+uE=@t8 E'N.z,٢sDD+@xŢEWh,D׈5EmQG%:FtxISD)z\cD'Pt KD.MDS\])Z0ZG*>J]QO4-:NtDɢSE%:KtNJ.=^trh$f*5kEMQ[EG+:^ti3Dg-:Wylj.]$zѥDET4-EW5}^+EljN(:YttѣDg#: :_XNj.].B4DcL]%Ft)j:(1cENjN":MtLѣE#:O8хDO]"Tth"梥Jբr?RdWzhqD'N*:](YE=VtE E#X4-DW]+jڢ/:JtXDN!:ShѹLj=Nt"D.]&:(h)Rta܏T'}h :ZtщEN=Jtl9E] zb+DCH4D UkD׊#ꋎ#:Vt$)Dg=Zt1D](H%KE&h.Z]-j-#)F{'':AtdѩE%:[t|cE/Xt P4E3Btѵ-DLj/:It43E+zOggWa>Vu0*lg9Op0[$̖ AaBj5*?: 0؈q>ǸbGc\q)e1`\8m՗_ c5a\qƓ0nx*0x6s01^bb` x0ބaVwa}F#ø ,1_cT .1Ə1~q/0~{1~G L7M7s"o &o &o &o9: 䫯$0M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7M7~[ -k|[o[o[o[oVT} }՗c[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o[o}ӟ 6o 6o 6o 6o 6o 6o 6Yio 6o 6o 6o 6o 6o 6ot8o 6o 6o 6o 6o 6o 6o 6o 6o 6o 6o 6o 6o 6o 6o 6o 6o 6o?>掉;;;;;`;;;;;si';_5=qwwwwwwwwwwwwwwwww. . . . . . . . . . . . . ?]w]w]w]w]w]w]w]w]w]w]w]w]w]w]w]w]w]w߽nx{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{}w}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}߿~??????????????????????????r>'k9Nk)r?8YmfގFo_p` l~o76Wf_l`{ l~o56 dK-B dK-B dK-B dK-B dK-B dK-B dK-B dK-B dK-B dK-B^$d{EB ^$d{EB ^$d{EB ^$d{EB ^$D^K"zID/%$D^K"zID/%$D^K"zID/%$D^^K"zID/%$D^K"zID/%$D^K"zID/%$D^ҶԬmK4mٟ-5{ӶLPKM~/C]6 7"t߃nk1e4zIL/%1$^KbzIL/%1$$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KzIB/I% $$^KRzIJ/I%)$͋)͋ehmb2ZۼX )9vd4/fl}fMl|SFd^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^K2zIF/%$d^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$\5B^KrzIN/%9$^KrzIN/%9$^KrzIN/%9$M|=eML3NsN Nm/SFk˔ю66lrcǍ76;lpc62^RK zIA/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%^RKJzII/)%%RuTUGAoPuTUGAoPuTUGAoPuTUGAoPuTTgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgPu UgmPC+w#nov{nov{nov{nov{nov{nov{nov{nov{noq}7oۆD0qFmbٛz]I^h?}Ne0g|-|Z? 'lW11U~t1`ǘ 'aL=ct0f` 1 c61b11c>Ʊ 08c!"0c,X c9 A#ˆ1#1 c%*k0b`8cI'cqjguz{u}kӚhL_jԷϚ0Ym{Mc][/?;yh˦u;8elݹ o>ʝw7zM Ör|Oyozsqj%gYǁ5 Fl)wҜ}<*o`㮡';۶%#0?RiUv M= vʡ=G<ۍ?~<khٽT9ih~;vٴmC\iޡ[wΡPyQDg6wߐ?sߺ_=TM_bI,I%;S6qX]g= z&mC;seU { lto*~Tů;̿Pie79H?>$wfF7G8@aWB4ZTF|q3tЮawnЮJl'~xhUF^ {ﮨYuO?sJ6 /HV}apz6Ov.v._Ƚ 'v7wm%OܽFcI.%!ל?eöMw7NisTnݵs{}wyMk u't0q[wlݳuӶmCPb~c@72nҲ_~KۢD*oE?:D<5iv:v#dL !~򘳣^[nV[mV[mV[mV[mV[mV[mV[mV[mV|W Z7N/;^|_`]|ߤCr/gl.>  kz_02~wCL.bǁk?k}|<չ_l.<;6mصil|-;w 3t|ηҬ?Y_=W ')#كYzHl?3|a[޷e;/{՛;Pz>7ljڬ1[VQ~_܄Iw{k"Kz + >Wڴy+?mhv {[jg_3rΫpçtoy /u/߹cϮcyhk?!q5p5͂k7ځ*7>`;78 v핚m)]iPAL5?dyx?3]o,:guU}]öK^g|oպ)>Os?[oxKԇx۶󊳶>ƲyC5 Wn}u)n 4/7zEk{mQ[G]Oٲw۶wnF=ݴc5!޼iϦ[vm>ܭ7wXlGݴ~cU+IͻX9khU;wx@Upۗ}QKEg=, nغzZ6*y5܁^L֡^ps;<ݳmC#=ưWܿ1w=7۷^7ԯ/k*BsY_м]k'ez{rv)WsNf~msXy瀜@;2#_]^:pAr`Ojh :al^@31}rz;>dZ>uO_ϧ7'6Og67Ss3=:i_{i1su.Lo6_`xoz|E] $:> |}W4)?m _87E(s?$7a_mM|9D惌Gsr5\FzlvFb5s7qrې4_u_(z*~z15  w(u>FkҶ#}9kyq`NTKBǫLj9dr*ZkLS`>לVHe*^U Er{(Jdx y犮Rﯮ[}qzr`xA^kxE#÷S;F;]ڨe)*FAo[2Ѫ~+6 2W*+G-ѹ {>jD}_}l5͹Whktz(y"Zվ_54UXc4U=VDWޟA}}~|x#}Xt^V;ö jSp/n0AgM*zuLR}~\Pz:}՘ }bVp:Zs1 {\:nhjZW@oVsDF]cc{ ]')^}\}(Qm2_"΁)]afjۊcMj:}XƣYj߬^`~1akO>_[Ѳ*/U{ڏ6:F|xz݋ 7s꺩+^_#l')^ڟ_*NvۻQ rL5]]+Kd^wNu,yzύYDn?TUb{(K r[e0Wqk ^waȱ]^{}=T/8O%w9z߫m/{r_{Ѳm5s}瞣ދ)ڻu;l_3HFUW߹z xڭsLBXu?.2/3`2>89}~xZ g{=S>>i:_>C~<{{{{8oQ/߽w{?6j?5߁߰E#GguٓsBl9Fm_^q_ܪW` #1 EY 8FZD_V'U,X}8c/oӫ-6 /ԗE"]ZZ[{{{{[4ZWKXOzד$'y=)IYf8f5%,mfY3˛Y̚Q#jbDM51&FĈQ#jbM71&FĈq#nbM41&FHI#ib$M41&FHi#mbM61&FHY#kbdM,>vypn9vm9vo9vcT;qx돣dkC`Y0,Jmh64RE ͢ԆfQjCi܏Ŧ1n/_̷߯Vyo˗9oܪb/ w"߿ k5|{`ϯzlcEwԏ^s}#|Gߞ]-ߪ;+x;nڵax[jo]f>_l?Q6׫POUk}6~w&pr;J p_!ӽ},DvB \ @Xd% \^_RQTT+ ȡ_Mw{;{y[5}Umt$_htEiS-8-FWҫ<*ⳣ^INj镧5 $B+ATI{U*ҫC^!B8̯+U*ZUONjOӏGρؙǏxYG@<[[[ kv L<&m)lT]0riag΄vaR&z?:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp $:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp f@:8߀ 0p780 p`0}MҀoG80 p`80 p`80 p`80 p`80 p`80 p`(Q0p`80 p`80 p`80 p`80 p`X,680 p`80 p`U?a^80ok} Lp` Lp`@R\yl9NXO:G/|qqT]Ϲ;\[=d-njwv-r ;1y[s'i;S?5n-Ǯզ?sB6O.D5}?^ur۫S~1|Hݶ<$˼-S^q1`K7kwkN_gr}ճ/*7۰yn(OTp۸wS98Q˶NM{u҅'pyy7,o][S^w^nxnKg9 o\Y-_qw(7_u fG[uӿ>4'S>{F;|luCm5_1ՃOt%)=?qb|i7?S{pw-dj[yWev_~dr㗢oz_u57| W=]qw99}Il4c)MsAjmáHӫC۫lW:gvVZJ׏-nkI{Q?<6%Una['qjKV Śh[&#lkG?HwK_:$=B`|ћ8jE; ~Q}!mjuHuhpZ0B孲tYwړ7tXW"öYOKȺltㅕR+i-r3oEKgG[")Vuӏ%蜱uxL6)?D$_Oqcn+nЮM2nOO?P KWܛ|f1[l\fpR*vW iIq:T~juEvvnq_G-lma"ER}5Eی)1ޝX~^7sCA;\z"VvTZV[ii^gwzJvT<"dG߅ `gjY 2(egȖm;lV-6ae̢?/ܹ;y>}oL5\l,;׶Ua#ap1Ĺ C}5Ca TZ"`~T14p4/3J:VK%;jK]juYvTnu3'tQgGi5H {b5b*wګV1n%^8S\ wjWvTAG2hYNHG|ަA38oap뻬__<;rzۧٱtFc/&8sXY9Ϊt-bA7Y؈u_M|w| MEU 77\ќȚp^F\/:G*b@K( Xos2[_\W\Vo]qyY|u3[c}[zS\rlw-;G,+e&?[.WVˎ7! X9fjHq>wYGQgh/G;Yc TÁs6mc7_v|cK>3!md(^|vRɐowGH3kijl'qGY:^kbݲ5bdfVr̎?-,ݟ-:\^mchXE:eVD#A0^3Yo3KG~+'K~EQ\~m8NK_se}7+]&k۴7Nenog=;oDoTvr?K};?aGh4/ʾ![Ʊu3?W \?sϖk"םX>]p-/op4>/wF1x|Lau"ol< d[U.Iv{6e+`uS;g^WGee~KZ߶Ш=e\;IK,>3kͪ[e9HdO˶1LmZeTl+l} N.Fm;ŏ<̏ܶ!)Q^b٨nNNjeܒqܽ2bZ߶ tZkb=kMgzZ {h4Cv7vɬ |<$@檫wK3eŶ剖l<}Fg &d;+ɘ{$;=+C;u2vs*l[Ҏ(^; w|V#5r9ZxGsq#}Ĺ8>Gsq#}$$>GHrI#}$GS)єh}4>rMGa&Ml>e6R6lD٘ e[[[[[țO|7'oy0d)RmS6l~f~.dK)K"E-"oy[Lb-&o1y[L򖐷%-!o yK[B򖐷&Dޚ[yk"oM䭉5&Fj H-% ZRK@j H-% ZRK@j H-% ZRK@j H-% >yɛO- oy [@FH[#yk$o䭑5FHBQ, (K%ŒbI@$XP, (K%ŒbI@$XP, (K%ŒbI@$XP, (ZIlBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%dj77777777777777777777777777XQ,(DK"%ŒbID$XQ,(DK"%ŒbID$XQ,(DK"%ŒbID$XQ,I-1%&ĤZbRKLjI-1%&ĤZbRKLjI-1%&ĤZbRKLjI-1%&ĤZbRKLjI-1%&ĤZbRKLjI-1%&$ԒZRKBjIH- %!$ԒZRKBjIH- %!$ԒZRKBjIH- %!$ԒZRKBjIH- %77777777777777777777777777XP,I($K% ŒbIB$XP,I($K% ŒbIB$XP,I($K% ŒbIB$X*M|/<>7|,<3>3>3>3>3>0000062o#62o#62!2!2!2!2!2111111313131313 0\w 0 0 0 61Mo61Mo6_,|#ˇ,| 3,^X*xUbUūW%J,^X*xUbUūW%J,^X*xUbUūW%J,^Lw>ӝtG|#Y>ay:Og|;g|;g|;g|;g|;g|;g|;g .` .` .` .` .` .` .` .` .`㄀6N8!`㄀6N8!`㄀6N8!`㄀6N8!`㄀6N8!`㄀6N8!`㄀B.d K| B.d B.d B.d B.d B.d B.d B.d B.d B.d B.d B.d B.d B.d B.d B.d B.d B뎍B6N8!dㄐB6N8!dㄐB6N8!dㄐ"6N8!bㄈ"6N8!bㄈ"6N8!bㄈ"6NXXXXXXXXXXXXXXXXXXXXXXXXXXb.t1]t3Lw1]t3Lw1]t3Lw1]t3Lw1]t3Lw1]t3Lw1]t3Lw1]t0%Lw ]t0%Lw ]t0%Lw ]t0%Lw ]t0%Lw ]t0%Lw ]t0%Lw ]t0%Lw ]t0%Lw ]t0%Lw ] '$lqB '$lqB '$lqB '$lqB '$lqB '$lqB '$,^%,^%,^%,^%,^%,^%,^%,^%,^%,^%,^%,^%,^%,^%,^%,^%,^ūūūūūūū}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?I\wMo61Mo614N}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6V<^&J<;gyg8g%9/gfo@ϰ>sXAK+,(R<;[kc>7- gK]]]]]]]]]]]]]]]}.x7`iGwĮ ԃK44v>ݝ- vj<3H3HHHsHsHHl$ڪ?60FS |Rjj>)55OJM'6iØlqt ҵliGW%IζOػa{,U:Ӳ} 3486G߯NSL7Ӽei6hRp}ˡ߈!Z_32^?CKf|o|l`qzj1W}]Cݿ# jj}fĺulVFtwI v/_ҒjzME ' v,ot-U -yv;j";ݯ`Wf)۝0?z|^ߟ;hܜ]e/mkkF61NKm5ƯvZܮZz=nwksNW^ YI;qP^+æM;6 vPaaGf ;6 v l6lXqa`' {l>DI0DdX+[[[ kv l ݫ&m)lT`B{aVN;>YΆGK͂@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8~ @:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@7a[a@zo6M 80 p`ct8bc'2 p`80 p`80 p`80 p`80 p`80 p`80 p`80 p`80 p`80 p`80 p`80 p`80 p`xOka80 p i{p`_Lp`&80 Lp`qM&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`{+0p`&80 Lp`k4 X X p` X8,p` X8,p` X8,p` X8,p` X8,p` XHp` X58,p` X8,p` X8,p` X8,p` X88,p` X8q<؋0p` X8,p` X/f6868 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`až68 lp`68 lp`ؽ4?8pp+p88pp88pp88pp88pp88pp88pp88pp88pp88pp88pp88pp88p*yؓ= 8pp88pp88pp7.8p \p+]p.8p \p.8p \p.8p \p.8p \p.8p \p.8p \p.8p \p.8p \p.8p \p.8p \p.8p \p={ .8p \p.8p \p.8p \p.x8y.>v/9#N+-3/Ӈd]R?3=Qm"^N志'p{/ry߼;ֲ0D{¼O]cu̺|\kraMCht?Z-KMٶzקܼˊT\5Jo~ǽ7 ˍ??+eâ7x{{brv T'\7<vQ6c-@9̓HRi6)32LQG˺˒,?䠳2`u-VSF3f"?p4ޭ6:P=.dq~/dGB9zP~l1f[K+(r :'/=S[F?.lG۲6Y ^=^uدgq~zVWE,V|O7"FoQgKk[VZ: SX,T*Kuש= }֕mmgVc2jR%.[+mxaԊrZ[ֱHnhUyE :g,m6y ۖvE'73񧧫NhwLMh:!bG/\d%Rқ:2꾔{kVƍ6YY?YV~_0x򨮥 MсxT*UJURT*UJURT*UJURT*UJURT*UPiMut]׿juWnu]M_Iuv_7麮&]}ݤUt]׿juWnu]M_Iuv_7麮&]}ݤUt]J?<#]XΞi叴So[j-C2rQ#}D(>Gsq#}Ĺ8>GHrI#}$$>GHrMGS)єh}4>rM&,MDe}mlHو1eʒy+y+y+y+y+7'o>yɛO`96R6,6lB\Ȗ(SE-"oy[D"-&o1y[Lb%-!o yK[B򖐷%-!oM䭉5&Dޚ[yk"oMZRK@j H-% ZRK@j H-% ZRK@j H-% ZRK@j |7- oy [@- o䭑5FH[#yk$o䭑-$o!yXP, (K%ŒbI@$XP, (K%ŒbI@$XP, (K%ŒbI@$XP, I-!%$ضZBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%$ZBRKB=oH=oH=oH=oH=oH=oH=oH=oH=oH=oH=oH=oH=oH=oH=oH=oH=oH=oH=oH=oH=oD=oD=oD=oD=oD=oD$XQ,(DK"%ŒbID$XQ,(DK"%ŒbID$XQ,(DK"%ŒbID$XZbRKLjI-1%&ĤZbRKLjI-1%&ĤZbRKLjI-1%&ĤZbRKLjI-1%&ĤZbRKLjI-1%&ĤZbRKLjIH- %!$ԒZRKBjIH- %!$ԒZRKBjIH- %!$ԒZRKBjIH- %!$ԒZRKB=oB=oB=oB=oB=oB=oB=oB=oB=oB=oB=oB=oB=oB=oB=oB=oB=oB=oB=oB=oB=oB=oB=oB=oB=oB=oB$XP,I($K% ŒbIB$XP,I($K% ŒbIB$XP,I($K% ŒbIB$cU\/"_by}.od#Y>ayg~}g~}g~}g~}g~}7`~7`~7`~7`~7`~淑md~F淑md~F淑md~C7d~C7d~C7d~C7d~C7d~#7b~#7b~#7b~#7b~#7b~c7f~c7f~c7f~c7f~c7f~7a~7a~7a~7a~淉mb~&淉mb~&淉m"4W+%Y>`FY>bg~Y*xUbUūW%J,^X*xUbUūW%J,^X*xUbUūW%J,^X|;Ώ!G,|t>ӝt3Lw>ӝt3Lw>ӝt3Lw>ӝt3Lw>ӝt3Lw>ӝt3Lw>ӝt3Lw>ӝt0Lw]t0Lw]t0Lw]t0Lw]t0Lw]t0Lw]t0Lw]t0Lw]t0Lw] 'lqB 'lqB 'lqB 'lqB 'lqB 'lqB ',^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^,^Lw!]t1',O2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!'lqB !'lqB !'lqB !'DlqB 'DlqB 'DlqB 'Dlxxxxxxxxxxxxxxxxxxxxxxxxxx3Lw1]?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟&淉mb~&淉mb~is͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lyūW%J,^X*xUB v?ҹ{lц%bMZ|}K;;'v-o׆{*W\yzP o{ᬆ=jeiV:P'byu-5&]䤞Yzs:+]˖vtUmkV C^={77ˋcR{7rfN5;]޵{9m}hF0h3r>u}~4LLf&z 5V ;hY3ol[va;v l/ؾI0FX kMk`i5tydb lS8av5&vC 6>K a,.UvUvUvUvUvUvUvUvUvUvUvUvUvUvUvUb>@9֜MGQrQTo: [t/KA^}ץTUUUUUUUUUUUUUUU?Zi? :[AI eʔ)SL2em=\L2e>3 $_l8zY%K-hY"QYݙxuraLiru[;e'k̬g86[QY?;?[^oMuh^@=~u­Z:A0^3Yo3KG~ۉ}-'K~EQa4.PBChal=by#KgnWLeLi}od 2/{v2މt7ߨ~>;(4v~Ž7ʾ![Ʊu3?W \?sϖk"םX>]p-/op4>/wF1x|Lau"ol< d[U.Iv{6e+`uS;g^WGee~KZ߶Ш=e\; vHw~f-ٺYuځ(xLz1P4(vIe_5m7;[.]ٶg:SKcX7]p X{e dzKٱgmyg,??;ɀliv2ɱMklvmEoaIeevַ-y oe(^sfa9Ƀŋ>n\<΋PxlF.t{q?9'Uxm2~hYƎ=l8jzyZ_>]]l;;[.^O&gfLS>md=!:9G-|iGUlNE;>+foO3?5]SwOe?5]SwOm! '?hNzZJ43֊-2}Ʋ|Jײ]+Nѝ)N|HYRYbU\0ݯ6IVMtv}zc ؖZzebk6mai4/~!QKgv {q"l_$fpX#,YXKgvb&Q+aJ`3jUՃtp^5:TK flt -3tvf8WNj錪$~!~ fŌIZzdfJ+EŰ6{aLݖ–N@ ՖN;v&}` 7 @:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tpoބ o8ޛMC*p`80 p`80 p`80 p`80 p`80 p`80 p`80 p`80q0p`80 p`80 p`80 p`80 p`X, 80 p`80 p`U?a^80je}&80 Lp`@\I1 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`S\A&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`| 2W`&80 Lp`fgz6X8%Fa8ĸX8,p` X8,p` X8,p` X8,p` X8,p` Xہ X8,p` X8,p` X8,p` X8,p` X8,p` X8,p` X7zEJ8,p` X8,p`K Z{4p`B68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 ga lp`68 lp`68 lr 88p8pp88pp88pp88pp88pp88pp88pp88pp88pp88pp88pp88pp8o(I`O88pp88pp88pӛM.8p.8p \p.8p \p.8p \p.8p \p.8p \p.8p \p.8p \p.8p \p.8p \p.8p \p.8p \p.8p ܿ={\p.8p \p.8p \p.8p \pfo857ѽK3vb6 ɂŕXlk"WˇzX^]׿*#2~v{V ^#e5-~Gӯ׿F˴keAʜs]oߪoU?eGz7-ƽ̶7/2Ͳzیe^Jr6mc)_}np+n/Y{l_u?R~ʏdo8ȷxLO܋WS)[vwYfu?_.b_5XyTS)/qdw?M]]]]]]]]]]]]]]]}=.1ҐVZ}UE`U߶gjZ~aH-x{Igy{!pGmbrKLZ﫥 &(& $PTbVL[Z:).TE~"ebRUޖ.UvUvUvUvUvUvUvUvUvUvUvUvUvUvUvU6iԜmˇt]|D.Хt\|<.Υ7'i&````````܇s~}?>܇sA#} >GrA#}4>sGc1јh}4>sa#}0>Gsa#}D(>`<[֡FYFF9FFyFR6m[?Ϋ=} eqqk0D)_i]bMkZ:!R L쿗8FZdͲkcOVobZI#r[vueD]l.l_%?M'7F{~O'ocy{mAUH}d<6łۮoȫUeMx7^:8tpoh@xCS/z8P/ԋ7z^ԋ74 p^ou 1HӲ?N|ǃ7SnVeWeWeWeWeWeWeWeWeWeWeWeWeWeWeWe_ˮNsnmu e#Le#,e#le#e#\e#bmEtPϣ>onr'~ͪ}{W.>||[_ഃ6ک<ϼucuqZrT=i?Vm> v} c˱vz* ?zዻ{z?ܴOoT/!n9fkyNyVꞻ>qlO;gQqn>vͥ6ytn'[Qǖ{?^򣏌yC?tu%_mr⶷|]b'X|·^sfwoq򡷟3_Ucԯ?xm?et|#/Ny'xO>߃|m#Wzl[սZ/S>+' }߶/.?#_8q}Ozd9iGor ~tUnMϼU/U S`-j˳7GN8qO)]{Dl,?m|o,oħsV ݫdZ;/V.ݱYOgD4:u)YskEg Zuh[avgHd[:x,oVNj[ޒUZ۴VxAi ;jw9`_T Gʌ^_&Ϩ]fSe݋eIwUYM M)u3dH8l rVkG^Mw^x/fGD9zP~l1v[K+(r :'/=S[Fe(lG۲6a`^wwYGQgh#F;Yc TÁs6mc7_v|cK>3!md(^|vRɐowGHU6g׈gN'2?geD{?U}#3r쟕`vn~Geny5թ zm;E{*) 'jl e-~1%^?N^>Y*+fwXhqZ+,IV^y2u0Yߦ%qB.u{6x;˼8yx'~sX ;Bq(l&Zs։|^\G7Tra<[6ׯӊ\wbvq&lߩŠ#2} 1ՉmOز/muWL&ٹL؎O>NKy]]-i}jF܋?@q$-}6Ϭ%[7N;rQ>.ɰ쫦fgYݼ+ۖ^gji氺+~k/x});L-/l]g >-N09i͖Rh-l;ɻ,<ےVvE=ge㨹]~i}Rb wYvly33[&)bٶ َGee2Ecݜ c# E6BHb~7H#dOH|1W1? )ob=Ix/rµi&dzDVٗ82Se43'9rwx:juȹ!T*UJURT*UJURT*UJURT*UJURTC}{N@58Z|>GrQ#}Ĺ8>Gsq#}Ĺ8>GHrI#}$$>GS)єh}4>rMGSI0K&QDYe)R6lLلDJDJDJDJDJ'o>yɛO|擷<~? )˶)P6?3?%%oy[D"-&o1y[Lb-&o yK[B򖐷%-!o yK[yk"oM䭉5&Dޚ[y#ZRK@j H-% ZRK@j H-% ZRK@j H-% Z'oy [@- oy [#yk$o䭑5FH[#yk$o!y [H(K%ŒbI@$XP, (K%ŒbI@$XP, (K%ŒbI@$XP, (KBRKHj I-$m~f!%$ZBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%$ZBRKHj I-!%$2PRRRRRRRRRRRRRRRRRRRRQQQQQQ,(DK"%ŒbID$XQ,(DK"%ŒbID$XQ,(DK"%ŒbID$XQ,(ĤZbRKLjI-1%&ĤZbRKLjI-1%&ĤZbRKLjI-1%&ĤZbRKLjI-1%&ĤZbRKLjI-1%&ĤZRKBjIH- %!$ԒZRKBjIH- %!$ԒZRKBjIH- %!$ԒZRKBjIH- %!$ԒPϛPϛPϛPϛPϛPϛPϛPϛPϛPϛPϛPϛPϛPϛPϛPϛPϛPϛPϛPϛPϛPϛPϛPϛPϛPϛP,I($K% ŒbIB$XP,I($K% ŒbIB$XP,I($K% ŒbIB$XP,IXb&rA>׋ȗXmKFY>dcOX_____ ߀ ߀ ߀ ߀ ߀md~F淑md~F淑md~ߐ ߐ ߐ ߐ ߐ ߈߈߈߈߈ߘߘߘߘߘ߄M_M߄M߄M߄mb~&淉mb~&淉mb~/Պ|}XCX>f_J,^X*xUbUūW%J,^X*xUbUūW%J,^X*xUbUūW%|;g#},ӝt3Lw>ӝt3Lw>ӝt3Lw>ӝt3Lw>ӝt3Lw>ӝt3Lw>ӝt3Lw]t0Lw]t0Lw]t0Lw]t0Lw]t0Lw]t0Lw]t0Lw]t0Lw]tqB 'lqB 'lqB 'lqB 'lqB 'lqB 'lqB WWWWWWWWWWWWWWWWWWWWWWWWWW!]t2݅%} yLw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]t2݅Lw!]u !'lqB !'lqB !'lqB 'DlqB 'DlqB 'DlqB 'D,^E,^E,^E,^E,^E,^E,^E,^E,^E,^E,^E,^E,^E,^E,^E,^E,^E,^E,^E,^E,^E,^E,^E,^E,^E,^Lw1]tG|{:Ϙ.fb.fb.fb.fb.fb.fb.fb.fK.aK.aK.aK.aK.aK.aK.aK.aK.aK.a㄄6NH8!a㄄6NH8!a㄄6NH8!a㄄6NH8!a㄄6NH8!a㄄6NH8!a㄄yUUUUUUUBg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg$&淉mb~&淉mb~_'lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?}6s͟lg>?GeUūW%J,^3e4SHVky{rlM=$ͽ.rwga˂ZGe# e#Le#,e#le#e#\e#)55OJM'RSIM0&C>t-[Uɾo>nǟ颭5˹tlL' "T,4o$rٿuڻ岍4y+3l߳zr7"oDW LWo.[,,[>X=mܧaU-+{WbȂZ'r[vue+]¥˗4 x+m (dmKDߎȎ}sc%:*qAJkv' 菞=euN339x97'gcyNjk[ښ%|muM4|m[htmk-ů`;j鵰4^]kc>&ӕB-fku3t3qN\;ʰ)aSaM;vp#aGfŽ͂ ;vl.x< w;v D; `[Cv[ [;&.riag΄vaR&z?:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp $:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8tp@:8Mo8ޛMӃC80 p`0$ p`80 p`80 p`80 p`80 p`80 p`80 p`80 p`80 p`80 p`80 p`80 p`80 p`80^u80 p`q@mv:5 Lp`@\5 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`&80 Lp`/^ &80 Lp`}o6/G_,%88ĸX8,p` X8,p` X8,p` X8,p` X8,p` X'X} 8,p` X8,p` X8,p` X8,p` X8,8,p` X8t\g={"l% X8,p` X8%Ƌٴ>8 lp`c lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`68 lp`~wس`68 lp`68 lp`vo6p8 88pp88pp88pp88pp88pp88pp88pp88pp88pp88pp88pp88pG$o`Op88pp88pp8ͦ \pJ.8p \p.8p \p.8p \p.8p \p.8p \p.8p \p.8p \p.8p \p.8p \p.8p \p.8p \p_a=.8p \p.8p \p.8p \p.8p{860sAeYH?o,|?otCֿ^Ȕ[^:ͪKv}mp%+wSەvX7-C߸ibU;-߼˿R=`mgp?+'[\{쏝]m䢫0ƫ6潿Wꥶ{!ᡋ<<z/(vu=B+>v-խ?Se/ꀲ;`zo]YN>~rF5ܯ9>n]{"z!ߺk+\Ǥ}g̿܃.,U?x}Us;ie oxOO:˃mAgyˌa{x9kL{oTȾתï7˯?\t7/;򎯵,>^.Op7]g>'_Zu/<]VO0SX?F;n+x?Wu)AS+/VcnES)7')+Gq/rϊ'rpw}ye͟&\\fYݣߏޞîز|]|3 x +?cJ_mM78^,Oc+_ߨNٴ%bS`Bj˳V6.Mgҵ q[>2_|]~e*/{#r][̛w$c-i.cuR+: ]]ʍvkxZGլgLfk4)ʮE-QMk*qX;jwN _T GL,g.Ų$˻*9̦4X]˦U:d2.w #TO;nnfK1kt쬴[֒Jpl4J¶KO>Ԗlϧ5ѶMF<"gϦW/xFUՆs6(-_Ӎ(y[&"|֡iԮ? eujO>HAu%8l[{ۙZԹtJgi9^X)b/"7Vtvu,bU^7pQK[GFޠsJQxV1ii.4΋is?Hwr5Y.~/UH g1ξy]rj^ W>S˟mB؞@PVæyYtSd 2$Spgv~@mu6v1Zu #2z%K&/m,)gȴt,=En^]v]ltدĖA~׃دA>I {5ق%jhkCf1ٱEs0`Y8>tfZrJ:MʼnT +CƊFv{T_40$sbNYtFʢv@S*OCYws3t|zyꩋ?y:_>sΓ_0GR]wl'BIE|ҨJKw;n{z4Pvtd[6C4XC )b׆قg7Z{9kFJ-rl~N {6Ίq'2qҎEZ k{5CU=Y+(8} )<{l `TQ\_VG˒eݝUT˯ٜ-a}w…]|ujg}vE\/}7YlA:1/+,i 7Ci* .iʂM ŦmK;un{{VlM<]L[|OsPvڵ7;jVAG"b#N<bTV=b@'Gkjgm֫oI?wO˳|\VeUו<[oZ\?@ ,kXKo-iދЭvcj8Q6>f ʖAaT\fwdMɖSlmQ[SGG֯<Ħ)?ͻ~đaŒYʚ'eÉu"]٭gjMS>DBsJUQpDA5&V(b 0 C4#]k1 XM?b-n sJ8nU IMAT>娓[YGTwt($1<i|yF8ڭoru^M7BK?o2OyM9Cw8/f:eD[UYYBtjKm!6cjv &Hˮl4%gZYز|Imm-X*gn|w47z!^ؖtk6uC}o%/ىҫJ=l~;ov?JozF2huï?]!Mnz3S8sS_ytEKyjx /5u1v2:7)X:d6ۥ[2d9t|m[}tǎ?=d:[K:ÿ2 oz2ݨW?&C&;`t~|3L7}텩w!W /w[|t:tCO}gtܶwl!-8t/_}it퇗6C]!m;nwo2[O3dK7ҽɐw /fҴ/2MqtҸiMޱi4Ny* :X3M7kq/ /PD7İ~F,\ -[3.*,)XĶ Y~t/ :wAʴ *UJURj}F4;FtZ5|q,X>fxy;@[]pOS]ry ,hrUyo5z\WCa@xHw.7] ˋ<W_<_^ҁK+|ߪy)P,Cn?w(a#|j-G> ߋp9oWؾ| p iV~@3poxHEn*oq?y7T=Y\la%mgV݃erUY~S NZl7uw;+;;W= ˖[(;n,tT:[:5-l,tut՝:07/6dY:Au.,?䝙Rww;;g>jί[\m^"p&d35wo՚c:sE>m 7"O[G:;yZuƜQo#,=:ˇuf14wv=@6;}yWwɕem '͖>\u{` èc3X&99<]|w]u w5<߽W|ssaa5,^Q!DNkx;;:e`/_,E?9SGY,M}G}G}G}GpfVyj\&g<[&gN*eXyW>aϝx0l݅O.qU:3Wg~W{w|Aes>g{?ws\{NyB_4g{?)Ra75corC+'o@~/g>< V/n_/zzsw^lcw^~ ]r~˵?'lywYyR#=R\^5ҟ˴畩zl7?uAOQ繏_ ~z*t/7V﻽/sg^P6x/ʗ/k(k4{/ўӴj~^,;ι=aٳ9M .s1 y]>9yJo'\^<_.헭Xғf'|CHQgFY͏6^mRh/|swsz7[\=ogG7Mn~u㞽1]zYYPvpG/NnQw߬Lxf+=;'2m~Nևz:Ǘ~m/uOj~aʧ޳\^(9y~Wr&[]Jv=/?_7wx_tIU3zϩ71]Z;rv~9ZH.7vZ+󭖍Z=<*Wt'|ݠl;;.[.[>ɴy=XU6_m9 -OWPj],7Vs8j>3r7r}n,sl~yRVr ]x^ؑ_ }8A.]rUK]*UJUR4$m< ){ zqR'-88){>|UyU]]V8Q Z,9f2񻏡& ކBlVlϨ_ɖ__ |կZ4-& <6f>UuCQOt1;F(][G{Xmz὏ sޱ^۲k<1o ^FjW*UJURTˇN{ 6t^86N8*&ﳊw]=(ݾozЪ~u&{yeUuuy˒ K6tR֦A_[Auׯ"FBl#ۋ_~eʴ.n:o5.\پ|IKi_tX*zիիΫo^^6'[o hZLSRg:zwGiR-"ԯS>֗D}7i\2zSO}ϫ\=_^RاTߏzSOau=oRT*UJUҵgJU5MG}ގϺU:nT#)gmWU~_WU~GoWU~_W~G.`kL\VʇFdƗ@fe&HfDfIy<<(y.s?>܇s~}?>GrA#} >Gh}4>sGc1јh}4>Gsa#}0>GrQ#}D(>GrQ#}Ĺ8>Gsq#}Ĺ$>GHrI#}$$>rMGS)єh}4>rM҇Y4% (Hِec&%o%V"o%V"o%V"o%V"o%V"o>yɛO|7'o>y[@- oy [@H[#yk$o䭑5FH[HB-$o!y [HBE-"oy[D"-&o1y[Lb-&o yK[B򖐷%-!o yK[yk"oM䭉5&Dޚ[yXS,)K|%>bOħXS,)K|%>bOħXS,)K|%>bOħXS,)K|%>bOħXS,)K|%>bOħX#c=;[w/,wz-["O˩%ZjbR;Wnj50s Z50w [6z l5 6Zx l51o_ov`iGwĮ;w;ֿkYز{i?O!߮}ٱ}b{Kwg'ݰ`}{7?4}Hmi|oH'ϟYoneQQv{3MN>ԭ .]Ժu [Vo0CݿKS+eW_Vۻ/1 7=dID,u 31,jymXj9+0\ѷ|luWhfM]9@S|z5Ҫ>]D ^6K}UVԿ*__DgYgLQ[YHgɝA.^_!ߖ/o~YL._1=\ >h~Z$nl~czޜWy,K1n~g=?}v|94ϔ_l6 g{Om/e'>wM\\y"]tbO74νoe=5Զ[g|(jHwצl=,}RK.7mۃ>]>wzsVbWɴ#l+_;-oVk=sBYKZK%/#Yt2ng[^_VNE-Qٛnc_֞!+|fC#eCf3hY|YbY]c̦~e*uh2} ?R+H7e.Ƚ[m]D|O˥'9T^{A=zreN= 5xc~<{4~{(gM'Ka;e~6[FKa*6ﰊmr`mbΚ7wFq6km#^W&*Y֘*@˃dynD/9c{鉾_VfvVZ,@s{+cHѲaR2ν:+*ΖnжyF} Ƥ"@NJv%'s=kSLiuJ.uuXWosY:iuR]V=.^/Jm>jHu:c$ 痴#%yId/96'>Kx&∶ l[x` a`;1wlO^a&MǠ&W"X K`M`&; +æMa ;v(0#`b@|$(LѰYc`as`Žy`6v"$X L" #9ml1 ^)%v:4m)lTF0`+`b ,dg; ~ٰs`΃샰> ؅>8`] Ӱ.}9a.}E/}v%+`*j5]:a߄} vFطa߁}v{nma?Ua?Oaw v/g~v?/a 7`0?{'؟a= +1'`O{ 4ߵt9`/j~ԴdOߙ^u;̩)BNfiVNf"nwbh#W^T*UJUR-;6U pemT뢩3د ]LsZ~%rf*r ,n:[ڻtpXQ9@VI:nþꡦZSWCuP]=TWdN]=TW5uSWCUWӬzf4YuP*UJU+}j]]i#mnaZ[eIk[pE&b(oYw,cY>,+xٲ#,;*g&W>-t]Zl9e}h/P8CuP#9~[`]݃S|ƶ?/_ô{^l 돰ncwh}}wCw;?_{}z<@9 bcj#ݿGOm@ۘՙ6c PaZɶ9 cV>}9kV1@_ò?e~eY#Nc?eb58}rNs|?vx~wݽykxO>9~a*8?ʸp˧HqSm^K1|Gwcv=O5}96qsz%Lϱs-W|:}~~q~êcΡx_j>6/5c 55q|XrUQ拢.ESo]Іݴt}y^9M[Snv{ZdY{>wisrmKc՞R<ҘYnYCaVͶ[txCC|cע i쩪|x_}9QNlfxjcUǤ=V鐃4ech;YiFٯy('-4oQ{꒖ʳAYlSV]-ZZ+bۄ,?`Xw?(^ ˺q]_TJURT*UIӳR*U隦>og]*}{uTґ*ʯ*#p7܏*ʯdu~`,P瞉7[*UJURTcozVT*]T}_ooJU:~ֶ~_WU~_w$Q~_WU~ߑwl{%--ȵz z 2e[Ӭz rUoAN-iV9;Sނ=<]{'ݰ`}a i~XGwsAeY }wg]Zeiwte[*o=[Ž zcW#yŇ*l.őWWz>4}¶+T.,jXmhK;+,F?{h?˅WZ/gϾ2yhfKZgכF+TW,]Z:Z:.-n]Ҋ].trFzM]{})?37|ȕ_/pgݨ|؝j_X>r37jzgox.W#j_C|lyesڧq/iGK.<%_s l,lS-\Kܖ`#6mak 3lخ` 7lDؾI ݎa!,Ű?l2]0¬fX6v l* ݓv0lء`ÎM̀ ; 6v4lxxq0a`' {l>DI0a{/̪i?amN-ċ–NHݰ`+`Kg΄va΅;a} a} q'`Đbا`}v 쳰>v /.} v˰+a_]?WaWî} v-:a߀]&[`7¾ 컰`߃}v3حn!X ǰ~ vn={a? }a~ װa=-waG#? Q_a={7Sa{y Z,4}rCSoij9ϩig5մsUiVM;Y5,jYf߁[j+4JURT*i|5uu9r-\F5cR7k2gxOS1LWUƌmF-!j,Y>o|;qXWR[lUz]xMhLrT+p_[K+u}??P\K^W{' '۵utu,YQYpZ˒~bxv_m[_'o/☞W.O4?- 7n~W|jeNTO 6c/ڔxcW%dW7G]vN_3uZÒJǢB+'5%~ҰgL5j(%Noi?{}zk?~ky}HVY i6uocM;ap:+*TNtv,Io$h_5>Jt6^[ˋEM`d95ґn&Z!Κ77|~,^W˝+⧚r6TN366Jl哴UMߓl)n &ź[Dm j,DG:(,z!N_sDm7fg|;ƛgg*WozZd O;X~<fSgU^go_iq%d-Mr=u;M5]{>N\q4@}+[8YZ%tdUɖSlāPG9[~C6׏220G&?I:hw+JLh+U`W0vSg0S q 41x`$ 98& NAիFLl"Lc 3mz5#uBYe.J˪\gbVܒ~n=(/~]!AZ9[ύ}X0wA*S7jhnkYvfe*dzeN 8EZ,]f,k>gYzo>?һ,-KRla<ߧvvY._re9]7Gki5m j'grߕ}JURT*]{)>X`=8j˞VWƼUU.]漣k]zYvݠ?ïl~ovl3:WYlUh䀾|wuYډ-hYѺA>.p8O4zs?%<>׏@^\H~l5E&vXˉ5bn+Ex'/=S[7~6m:0CU=[iGT>2Mb2.limWJWW[KG-;Y>peujG>v/>0\pmmgVaK;;.uZl;MN%[XyVNky+Z:;)V .μsa5{~{;2i9GID' Q?5Yܧul}.,]ujg}vED+;+~lYϘN!b,܉IމY~YbgIJײˬ>;]NXY!`Wy'>rλE$ucP7JTi|=J{ZH$1<imS8ڭoro4]˷_r[l ^[Wu`W6jj3__x|w4/< Q9@VHdj}3?g ~eo nRzetC}u!MX?hts4dw9ȧLtSO7d:ft n|s/pَCc8fӋ.p.Ccof2}Ϳjܗ~ɐu?E!qG!-VG;duq?u\OĐiZxiZҸiAj+8m6N⑶yתH\q@`ooeˆ Z,bۄ,?;u}JURT#1hv/d ۍ`61CΣq^.ߪvx M`@ktϳ} :@+G~0DsaZX^8yZ^Z!#/VK]jgWr8GQ CEW+,n9P^\?>˩\?}˽VH/q[@(r3Py7u7[}ryYzR7@-~S NZl7uw;+;;jO|6,[*nܻQlnXжyVw,PdkSt|aۃ\bgY:y7~[g.ww;;q_̺c+[\mN6ֿ=mcNccZssWgUVqyϋ~n⾧^mE˿\û~I{ofIy=.ߪo.KMpM)OݡgZVV||_^xQ {)Wg=gI: Ϳ/3$Ӟ7~}IwU~뛟CI{ol(E;9i[/~_%ܪ+V\?0OwA_~s&wYYi3s%ç^zm]>_[5{ڽ?t=/76fٕe^i*o}ui~koښ<<7Zd|v{ 7/nu5O_I<9l+|2FO1Gz^;}ӻk~=ۮ\]եb?y <_Ci7.MEf;AG<ӈ}>~IOM_^cKv};(|XJҌe`?! _]ާb; ?'y>U)M*^[r/=R)_RU$_X)eyÙh6.`SgW6l|K6?%yԗ z{L2$LvF)'֊lxԺZ8lзVqA $8%V\9A>M)l!ē W lWp?j_cZ:ͮL&R8U~ܫ z* b[(#<𣆵wPUxV>i #. \1C{"%1V>4mv[GfѦmR"BUi4i9dI&d6: J4tR>nN9p*B'r?FxW" kPچ,; I+w}8zqrG\8|u48&:* UX߱téAa/7i6@Klh98@x/3YTq uX=Ri+ < %>CߝӌJ߱#q  CGs%1$]z1x]澣;ߟ bu_artKc/Ż{WU톥5#S>}WLyLp7zc^z c̹1^L`}Q4ɑW؂ΏIqD*Np{Q|0 =?nˢfTwa)\u@_yՕ~'>s;IW;%d FXk&N'&U@~U=( *qfIHt׸W#ҬEJڐf>4wQxzQW/: IcD< $:̋4(cIcǍ(QIB41~aV1Pif{!Nb48kf)V2if{QfJyą%iN3rV'|sK٬Lcb'X'/'biSM*6 p:A #>D\^^lϯ@[pbu6viGWQլxrWz5*fFUpe3!KrqTԟYvmwQ;gvHvT֞ o ~j2;،Qb3Jm:?_\^8(R@@ON~C;{qKE#!Chb_aN@?@c(@ `P0@hp@9   1c#F0 p<`4F_ 'N8pg&LLL@#γ8p @H'#9n&` #B@ ?h\=0J{zi`. јlO,,,\ p)/ Xp%*ՀkK\p#7n[n]p^}<xC+<xIS<x4^X x 2k /-ۀwl!#ǀO>|%`#``3` +NS?6v7ovpxy_ܧ8@ rsw&Xvf|'.p'< O8xpppppp p p p p pxpxpxpxpxpx px px px px pppppp p p p p pT QA8*G pT (>:˩NuC^Q:)[9e+l唭SrVN)[9e+l>}VQ—jFSʌɽi|>Fs: 1nL5rlϤ0M4}cQ;5L7gxhӸCr4P8tN ZQzCR:^[\祙RMeJ:g,ũs6_xEZRp>Hן$qfڮdRw:GIگl,R'7Wj[&t۸Mr]&kfMJTF ]0IlSh2YR*'SVh'?>!*Rqa"I8 N Mz~f 3RiR9zEjƑu2Z`n.V wxfahK#z&UgMX[4S F"&봺U.bݜb*>lITpmuU%ɳN;e]ֻ dI&dI&̎dG>bL2dhl]zI&;zd2^x/ejzVx/e>m9k27n^e`7:ogӓog`wE^j[Yv$^2ؼmx;d5x L l&63L2$L2$Lcf&d2SvֿLlk$IZ=/e2k5=e2^xswOŜ5ll?x}0ގIx[7z0ގͻآx b-Ix;Uvl6lMO2^6;P俿_*Iʉ'.qC\^O8xp'< O8x".".".".".&n&n&n&n&n!!!!!%^%^%^%^%^#>#>#>#>#>'~'~'~'~'~QA8*G pT QA8*0|p,N:]NuzG~l唭SrVN)[9e+l唭񔍧ll>l>l>l>l~l~l~l~l~lUP VA*([elt<+V <.*+ņ ū$Z.Z烳U0+5g8M4(W'4t!-hdN=ܵ)$ŕupY6Ab(8ɞ/e!ΟG!U-P7EGhr}P 1x}XQ.}8'bPw 1bZ)B܅Nv{xh1(vaM„K?~p+?&l%/ L R[}_n~s%J&aRwk`9kJi2;l /g P2@q(]2@ -tԷ{N>p?pGizzr^  8 p8 8p$('j(` p4`8?; x^T 80Qĝ8pd)SNL80 00p`*l4t9s\q 7~ޫh?uL,@G {~F\<| XX.\ 2倿\ p5Ren?M;Vmw,pp߀a #G<xi3g+M/V^ x*57o x 6`-:>|1|   5modԧ.ogrl6l6fl6[qlfe'FN6p6KxI&dI&wR=^c8⪙<^hTdzW3]#P JM1_[kҸEкZ14сUbu&z|*T7ƺh.emٲ6P{)tQ*\}AyoEZ>hlH8HQ.)4닪RvtZ*qŭ[+༚Zma{7b.{ґ~Msi("F'ʵ-+lD55ΠNi5~t;U=6T4nH CGs%1$]z1x]澣;ߟ bu_aN؜H'8Zk*lP RiT܈t,EfTg_dvcfFg89qvWnWi)-C_86X;*5ild@'eOUD{]=Ay,QL ^]cTI v Յ`Mh8s.%'+T~Lq{VG^;|_ʯ+E~ȍܤ͊\|A*r"W*rh[ak{1Зi1V߰B.n\.UgSd,뿐P%W0}?MENQO%MuvUL2$L2d$F6j)zdz%=ZeFNKy{}Z;z*aLnFer29zy?6i[qнp9[/kY/h\At[>(OuI{Q<䁭1gwnVgk`]U}#b([{i/ؔdcN@sfO1 5LzAO@;v13?~A쩔VT;$C ^ #&Kyߑ+*_i|MRZWMkXҢ`U,F"`VYg\rA rj+ĿG\6@e %c5phj΃9'Zъu;pD 2Byx\}jA MCbP l7{3vUx;sA}uuD$ 22;:WssYdthX'&0n,ﮐnCeAߘ jj'6"]h5^)˶tіr՞^sc2d.N҆fVvV\r)u u7rԕwJ;&v=&k!hvEiuQ.6Sej}3<-dT{I=?ESjJ{$L`RJGs@+w_舩"Q6GG[酛OF?ѮOq#}FMV%@M".I<vyMRL&K9p -R\Na#q&0bX( æs}ɤPQ/Tv(Kv'v[uQR&krOʯN*{o&aM>T8x1}k;O]zmI/[}gᬹ7&ː'&{~N*Ϛt9p#ʶ*Y#Jʞ{w%&eӞ~#>&۪~y)<|5\ŵW<9#դTZmMʚlvӹuUg9ʃ[86*g:n:"[fsLߒIeT*7fbToX]q<ٿjV]>c(_Wc^U]BGAg|#L2$L2侓fD/wYP"^|N‹t0LKH}z|ĥkЇ>:OToovޟdϧ>\$|9uf隥OO"]g>@/gv`ZߘOϯχs4/N'q~I}{KzjکYfgG~9ЗSwO?S|}]|Y{YmN*{aV>Y-?޸f?~td%+_%#BY#kqS ӵqS %p%,N6M/hc."Y|:+ΰ8Shn3T+H$B uvn"c~O;,L٦}5g'z}wt%w$cڞXԴX3NJl*'K&4u-]bHZyZլ2Mx?sh3 o}.󝵍s<*VCbU*~Z7)4o E8'=7Y; H#2 ;45T_ڦpC2!i{8;Ia~H#GdAttۙMY v`;@ǭ$SVhgW ?*]F5}W^Xe_=Zt?^? NU:)%O̞YIxNxv-~eS,3r'{귂ȵ:?Zry?W_rrO_J6NЎQ^tբ8Ծ.ֵX@ko!K r=F:w Rx>IyrNʧP)d}9:?!˕H]z_,2?$ywn=i1~>|q`8~~Iz?U?y%?D쁳l\dg*_O?)@wI1m}-'wIyA_J9rVڵj}7*_&ѱؿY`/|8`P,KἋ=V,ϤrbB!O>@ͱR}/2T_~o1=RX*dW n$ؕv7q;I>qMy,c/}sǾ,Mt! *PT4U^PcG޽]>ʉ'.qC\^O8xp'< O8x".".".".".&n&n&n&n&n!!!!!%^%^%^%^%^#>#>#>#>#>'~'~'~'~'~QA8*G pT QA8*0|p,N:]NuzG~l唭SrVN)[9e+l唭񔍧ll>l>l>l>l~l~l~l~l~lUP VA*([eltT{u'eOri8)̣껷Ry =g#~k#ʉ 8kq- ni*EI\k48oO"eqY_a/,e’|T/,qqM~K`Yu8X+[i>2{,L챐=ca{#66P7*J\$K8N.$旗E RzC Z`O]]+j_S5q*>M(Hd6Ԡ ȯ I%d&VG$46HBSŢ,ԲP4D3GԹoI{xÎZ&~YN#Ѥ ,N}yE{;iq={ ~tTPm֤k P( 1εLl|^TgƇRqal|lC m6y)5l6X-vrAur:qL6դR مWY',8*\q!zAJ9$DFq>gZΉ7 miBX 874S.XlGFCaqX'QhNPN#`xqP̳ʣ ӨYfvF+0ucjēҫ mW53گ{- ؗ#$$Κ3un[YMFڑ#Q]T1ev"6Cft7qܿp{\?pQ܇dsw#!CJJ_aN@?@dU(CCe xcF`xh'N 8p*4@&L  8 Fg 8p>@~IG3I"FrL,@G@-~иz@`6FQ2>0hL'E?.\e,\pj5k7n w X.? p/><!ÀG<x$)ӀgVV</^x Uk5omZ;uw6|c'O>| `+kp\w^bi<PBM;^C. { cPd'{ EvPd'{ 9k(_CACӷ=F6[}I&dI&̞:TgV\5s8.Ŵ^IZg@^7|'Ѻa`mtrdP9v.keF"TG6 eW:rl0EgzV![=dl0]lrlPrCzlPvCVe'[=lI&dI&sK!G޺][%4˷R 'Ě.*C^roPWWR77EX\yr+xxӕk&&<'a)~~Po(%ҦIb ېnbNg*j?2}@>TI7U?cǷ}wH6|ᴜF׽:ۧ.V3s6*gyBr۾rT[7r]Uf4L K{<5JyOߍwcuEі3+4L}S){d|XdN 04{#4.Ϻa~_0I4^{5FyAyn0[MVgK1_b6}le}\w>.}ݢ)69 x۵2bɴ!35FLߨk,M~ INWu2 .Z{P1܁Ep\7u  F?(ѡ2*{SSy3)ZŴN7z՗UUj2qVփ+Tऺ>Dgu2 ny[tgRlPY]pz_ LֻFwE}Äsx3$Å[FmYS{4#Xp=$ޔ+K~ZǾ$ȱ/ $Ⱦ$Ⱦ$Ⱦ$Ⱦ$z_˱bblMb&e'(l9D1vÉbi>&dI&drIu>'/b\S*d2.yz(OU&U{uØZ1!%*Xu;!c6 U )G*FTd]h('R+nrw\ԊnCۋ;8CT_fږfmK}yP]$qu\`MU=6HPHMZ.ɽR>9})oȶOI?)ͩbiOQ dY#͌B}qsڷT?U/B/n#[D-plvFU0j9f/O$.T۸. |~Fca)0Tga -#kT=$O7$L",{ZfS0d|7Vts⴩NJW)T$_7un4G[1l'oЌHϵrmphF*=w 8ݠ_x7iNp}]X>4EM Jc %/v'R<6(iTpRyFm,r5;]SϨG\%Zդ.YحxZRrw q>wxѝs Jy;oT1Q f2kRNao|xO}I/B8?)U ")zߠԍmP4gT~m!\VfBEJ4!O7Hedu7ҥSI-j^[|b#pS_;\º{)=,.y2 B]:Fbѥ3 li"99A>beg~.a#k]^X:xW 2ksm3vF7ԏ qc@tk nfWjU]pt_T_), '3ܠz||hp 1|& a1Le!&c]a9(ԗci-ZnRF1*LΤBP&@$>Ţd}x=n{P֪ȋ|G+R}/QYk^/(UEnQJEmS8L}M|<{]5&#-FVRu Ur sʡ}mjI&dI&̞Cx>+n.Iqo"Ҝ 5kp`3ubV,yx.lTb #t>)F!fA/Hc:=cGsҮB}gϘ?;ȑ=̾j/~c! ^vb4M]WyݓYSWMkXgU!:Zxu:ZUfճq9/ߏ^7IAro-kpUl)Wi57-2$mmgeA lE{_.Rq#F]yCibgۨi⹶1fiMvɭS";ou0E^Ȫ&4hv>G'тlLfIMڳL4*7YJb/${%Tq?R{~*2n\ecxTqԿ^)HdW9"oh4˯nUO^AD+Rhw^$dj wxҒ\!%1Qi(.6H\`c0 z(BcYysrj~x́ogysNƩs󧯮rK9|l̓G w\ .7q׺}.9j˞\z}.\`mϻlr#śo6NȄ-)TFNګR$ym/)FUϵq8Yfյ="u5U%-ty$t LL2$L2%]Hx"]L9$R.q>N;/]t2ן6 8_NYf#uי٤7"I|>uR^?p|vjY>D7_No>ԝÓ_G_o֞sxV=^xVτ7}1_u8]>YzW ohtZT}_=tjdC \zzI8 qSGK|a1HV;Άz ex3,p0 U;J1 sP+nnBGytq,'KJoilɻó9yk`5{`DŽoqy5~]!IX9ց1:59̱֩ MtfkKCןk>VV5qFӭ*54 1曨rKip$|gmc$꜁,XduߩV nwJ" oB'*&It s:0 ;4M#C ;Ǘf:,Ð aH0NR&8Gd#w*i0]>G/v&iS4ű`;68q+| ɔDUAp2x<@=Q?Ptc)fЀ]zFy| Wj0W~9mhl[Ol{⋯?rw]qxॗNx_xĿ'qDs3n^ȟ(:V`؞;f\&`SM<{E5*W&[OuoQ`)ޣF.$uzz&nأѡbk^ٯL sK_և\mՏXyM x p/8z3/ȒץNyĢM> 贈Ӧ8ҿTrv]g,\[aϚn6(Mǎ,yϰX}rnuoj2?W~c?yԶe?+9o*rӏ~_>zKKtG>$޶fRXI pk޾_G)ؔx}J쁁]#7|N?SB[>Tǝ3;I],_{"T_S{ׯ |uٞכ__m&,|aQ'.?w voO x?oa y,c~PSI]tcTÜ/n ؿ;{FE05]eq|r"ȍJ~VW9oʓ>7Ho,p7eLZO! OxpO'w} r; u`)yVsJ:R~J98ܬR-_e ge OF^ٰ ,]p֗R_2Xj]L2$L2cf&Go5caڶ~bI&dI&d2;53$Jv5gue[-&R^B-69-(;\vxÇ~ˇW9q".7qyK\> O8xp'< O8\E8\E8\E8\E8\E8܄M8܄M8܄M8܄M8܄M8F;qbZ};V+̥6ipޞdE)PP^\%mErּ lW* U"{;;HQ/s4 ca>v>bKJos uchҞQ4͕ɲㄞm~oJ:ˊ.o=-w%t\ZJcoQw淧,ݧz(*QlԽv78]oMkk?zw |~I< ܨg=6t~omtf`L /y\`DPJQW-9<߹[Xk1w=ek&vͷQޅg==c~.64#gmsЕvRy5Ucqɯ8&wc$2GjPW$K2̓Vs#Y$!ҩbYjYzE#kܷMPt=cl/³bC)D>X!Wꄶ qͼ͚A S; :y9Q8&NjR)B+٬dF|. %KQB"8F 3C-4!,V[m`Tq6#ΰ8S(4'gY'VH0<߸A(fZQiԬas;y1FD]ՄĚW΄lőS]RkgMڙ:fv^vőR.In o ~dj2; !b3Dm:C?_\^8(R@@ON~CVVzqٻȚ d-/0'?r`A!a2рrpy<  1c#F0 p<`4F_ 'N8pg&LLL@#γ8p @H$#9n&` #B@ ?h\=0J(M @a4&[" .\ 2倿\ p5Ren?M;Vmw,pp߀a #G<xi3g+M/V^ x*57o x 6`-:>|1|   5mo8y;/4(o!&ܝe`{±Q(";(ulhh#L2$LvFɑu"dejq]qi8TL13nNuÂʡrrp]6ˆE*m, u.[=a(lCzVa.f![=bl;dNz(;!L2$LlCu,nKh$.oN 5UK5\T|)+Ƚ^ޠrrnn8NW~+LP]My O{S4-Vt)7HiQJM6$!W%v$JUS~enƷ}.Cod!鯏oDm~76i9{?uOU]g*eomT&~3Q>S7ӷ}a%|n:5K8iyk8g 34\-gYgVWi }Sޱɨar3iFi\u}!`ij{5|5ܒa~- LO0-?b2zm**V}\ES Amr[Ikeh=iCHgk QuY; 6AX 5&7Q:Ke4 ]x䝚ԴM1٤SgC3l)fl8z2wDU],qGHY Ջ'4AU˕Cxn[wF( f֜5[ nÅnI 7ef֤KUZk/}.*t"g"hfYa\ 3L dVe',;fɬ0bYy1\^[&[>Y9p{s~@ŠsRÕbCtrі`Vw/`n ('2%:TcV%z`jr2oy >ec\if&dI&drIu>'/b\S*d2.yz(OU&U{uØZ1%%*hu;%c6 V )G*Td]h('R+nrw\ԊnCۋ;8CT_fږfmK}yP]$qu\`MU=6HPHMC/ג<_ڙҞ.lOIS؜ n B֜5b,7;}+NS-6"oH kgT&_lhLB5߽ R W *n4( CuQqy>4F@CT}SJ$r˲75;n= C8Ngyc`Eӡ8'N8$iBuIySF#8i8|v K$\+6父 mtsS uq4  סͩԇ׼1Aixnd_߆`=JnR*( Enf0wy+$YӺ%+Rk^JN."NG/s{.A #}@ާ>(L39ilS9Gqh._ڕXg9GRWMx 5Cxˎ_̒qG~xvy^wkbxj"^b83 ѹ“H$Ѫ2͌KQ5(|yz&B{ɅjC D.eT%Csq?q V47ށ#:PyB,U;Y+о>qC7?^bO-fs&ޚ_nRŸ~h{-ޖ\P_]ICG՜\14s?7m>'K+䢛Фnn7ₚډbtͶ:$Z~EVʶ++t\XhLȘ˻ٮi7t}!W\{H]ču}oڶ$7j%vOe!{#poL D 1%U^6ij(3єnbda*ȒETR)QJ6:bȸ%wpEQ)QVzq ~kSc\刼u_j,Fc[k4(ځ(z%\ vwp+LPs[+$;<>&*>eF L`@sQD9룿s2)I*YyԻr?Yuiֱ/ްLkdaw_trR٣t׼<25ٵO*tn9@5{?}_ݻ=oIeUy/5Ǥ[p+T0/$|CRyhؚ5YJt&=7>mҤ k߯'bMr5)I\e,I:n:"[fsLؒIeT*M7&bTo\a<ٿjV]>c(_Wc^U]BGAg|#L2$L2侓fD/wYP"^|N‹t0LKH}z|ĥkЇ>:OToovޟdϧ>\$|9uf隥OO"]g>@/gv`ZߘOϯχs4/N'q~I}{KzjکYfgG~9ЗSwO?S|}]|Y{YmN*{aV>Y-?޸f?~td%+_%#BY#iqS }ҵqS %p%,N6M/hc."Y|:+ΰ8Shn3T+H$B uuvn"c~O;,+L}5g'z}tv$cڞXԴX3NJl*F$K&4u-]bHZyZլ2Mx?sh3 o}.󝵍s *VCbU*~Z7)4o E8'=7Y; H#2 ;45T_ڦpC2!i{8;Ia~H#GdAttۙMY v`;@ǭ!$SVhgW ?]F5z^=8p|}l1qy3>ΟG7.}:}o.lJ*޿.o2O7ڽ,uޘc˺cuK|2~6b{u_UzᦅUK/oy>'BoN— E]O_v˲)O^ޠX[QKc[zzH@KD;.[ 7a}zzTr|߆ͱ<O W?5q?|"/~Ӧ! |^C?@v/y*>Q o_WiŶuӆwo8H.^kΝB%3Ӛb-|o^Y?Ml ( 6iaB,>m%:gg5%=?tñ |!{'G@*}ނe'Ӌ#aҵpxG/Io` ߔ/ly+x?N)Mۏl2/bh2_]4g3GdtNHjycOQcz-8<ª0Dēw9'yRse ge OF^ٰ ,]p֗R_2Xj]L2$L2bL2dhl]zI&;zd2^x/ejzVx/e3e9+;\vxÇ~o'rE\n|'.p'< O8xpppppp p p p p pxpxpxpxpxpx px px px px pppppp p p p p pT QA8*G pT (>:˩NuC^Q:)[9e+l唭SrVN)[9e+lϏUt.f U}G8Ѧ~ݼԭzI }7%}a]9|pp;*uT2Ұ~r;Q]?U~w76@;`z[r-XPTP\1e}_v?9z#r/OߋC7T?դ A4b9n/OIU0,kEfMdZi^أJ`*Q%U:ޓݫ2#ViϨTJNqB϶pq%lӻWOV_^4t\+co`2_Wu-mO:y偽n{V,$KB?ߞ].4>n{lO۶oλoK. lx%T6Kə~X`_$:nI;cRYr~JD#Vn[j!p'x\/,Vd35* K @ @a4&[" .\ 2倿\ p5Ren?M;Vmw,pp߀a #G<xi3g+M/V^ x*57o x 6`-:>|1|   5m< [w^2i<PB-;^.:{cS)d'{Bv)d'{9_@Cӷ=F6[}I&dI&̞)TgV\5s8.Ŵ^IZg@^7|'Ѻa`mtrdP9v.keF"TG6 eW:rl0EgzV![=dl0]lrlPrCzlPvCVe'[=lI&dI&sK!G޺][%4˷R 'Ě.*C^roPWWR77EX\yr+xxӕk&&<'a)~~Po(%ҦIb ېnbNg*j?2}@>TI7U?cǷ}wH6|ᴜF׽:ۧ.V3s6*gyBr۾rT[7r]Uf4L K{<5JyOߍwcuEі3+4L}S){d|XdN 04{#4.Ϻa~_0I4^{5FyAyn0[MVgK1_b6}l5}\w>.}ݢ)69 x۵2jɴ!35FLߨk,M~ INWu2 .Z{X,M#e)T/ND9\&Ȳj5,ƛg-oݻd{iJk?'[sFjl)w+kL=Yv3s]&kfMJTF ]0I?ClJ8QiEx/U,14Q!x!ȪRqaIøݗ xNz~f 3RiR9zEjUu2Z`zg.V wxfahK#z&UgMS4S F"&j,ITpmuU%X <} Vj%L2$L2$ّGI&Tq?+Zo1dgVl_x/e3ZMx/evf^ (w&ٞ-&dI&d&ѱX3L2d;Zh&[Wb$2^xog浚Ճ2^x/̼{PH3 2 b_Af_ANdɾ,;We' d_A+Ȋapk`mlPgaޡa>P1܁EpCѰ֊uԢ="aYXn=*/]ǿ][ Vh#4ǗgB"bŀK p9ீ%+W\  7n w X.? p/><!ÀG<x$)ӀgVV</^x Uk5omZ;uw6|c'O>| `+k|IɨOW=\JRO9ش3qig6̦ٴdβM;N6팜l;36zVk|L2$L2侓 <Ù,wW=N^hTdzW3]#P JM19A-|W%4||l~lH8R$u꒔>.u4 [hn;jjE!E9Q~Ms("F'ʵ-+lD55ΠNi5|ax* &V׾5R3BQi : |[б7V*ܧ7'߲٥ї̧)dtEfT_dvcfFg89kqvnh-C_86X;*5iМld@'e.. ~޺Fca)0Tgawq^T k.P<cߔ0jj͎}O}PNYX:XMZPMUv1ۦPݫr`|qԹNhN(mijh<6C36S"?ʵ9Bݫa0wwLG#9ItE XKCSkޘ4Pbwѝs Jy;oT1Q f2kRNao|xO}I/B8Kxj0wT}'*~ZJoS7jAҨQ]W7sZ!e#W.U~h^)qC ]nFJ9nK:-Z bIG#(lv\m?UmuSͫ{+Y)]LeAυt ujKg(pEGs@s?}\F ֺt*dL'hgo({ƀ;-ͮ'ժ:ۻ~O둿jA RX`N6gA~ gw)bpLbJ%BLeǤ(WS5r`Q.N/%}= [x>L ^=cTI v Յ`Mh8s.%'+T~Lq{VG^;|_ʯ+E~ȍܤ͊\|A*r"W*rhak{1Зi1V߰Bn\.UgSd,뿐P%W0}1ʵkcI&dI&'P6bO Ooֻ&'i/6rZۯRy%W er7]/Si KۦkuzYzAAyKRܫj4'l98gu0\>.X k\ vhn@97޺K{$קtH}`G6o}QHfr ض'v2}ܾKP3rdϤ4ӯj%|+<4ᔴ&U;Ǚ`Uν,F"`VYf\rAKz $ -vhQSy8Us8Z`z@A^9\4qbG2'I17-lP$ %!_C^ Έ)}>Ypªu˰E M%݈.XLN?)H]AĘj\ NgAM̱ qUs1V=+‰$W2!sqf9xtIU0,kE9z>@Ec3.,9F9=dNˆ 0?vs >ϏUt.XȩS":BUQ% @)I-b\Y~x\vD"^ ŏkK/P1iwc9;MY̠EQjTZ0@"(\R_J(\M{#-RiM:@_iUZ"GϞY{qZdqy߷ vJmE&i&rRe :;_߸ƕ_tMBH%v~48_]RXSSV+#,FV+b쏇.Q*<" HXpdH#D#=NDk?Nv9l :Kt@|PỳdA~PXx9 v<$?&//Օm0t%ơZs9 3ID'ZϠ%TFFbEyZvU@[TV GQB&U)i*hJGKDn;"[ t'n1{GH'@nNl OS G.6Ȇ#ly/E>>R?NuzN'ݯ>pyopk>|?=>z^)Ҭ8['E_/K7kfCIatVC_Nݹ>T(4(rȑYXkA҈9i{H^y=Dxmӿ[s;IW;xsl|DTMO憉٠ߠ ȯ %ƍU"~G0Y$!ҩUޏ( P iCs7]qOu؁WuiM4F3/,NμHÉ=4v8/8* {^U&=".s]v}Ofţ[+d|M{v'OF{{21a^si_[k.5"k.5 Zd}~L6o}M9rPpv?qKU~`7pY$EI‹,0G=sG\/Ο7"q|=#&ssq)G-1*<*:]>e,i%q?9_jYǾ 2;lda eUxv-]+#= "[ WWWc_o+8l lhl_9ˊ}^ޅž u*<*|_?ZA( Rl@r'%G~(OQ5Am#+b5aO_I( (T]P!`V9 8ihi\%J|YsRŶOV nˤ^8EҬn#F4t1/sǢjv)B_0}U֑TbHJ(SYItf*"9^Iu|f5JHJ| Vi"m_f tQLQjl+q'=S럥ugsاz?[۸ Nx5Z~x(NCא6rYopӬ$/:tx{^j IhHPd7!TT *s4SmPREjo!Tg+F9,G~iڨKI%#n?GuS?)f>]ۇSYgƓf#[z9|-5qJZ[o3$]B%gH"n$9BFTPIB"m~tAL2$L2=(2^x/2^xog5ďRwϨϨϨJ.U>*;gTe'dQ3|F03*Dj;۔My^y'E[(~ΛOpHloMF k5n|w@:w"ws)[=cϙ> >S%ÓYLzj2|%u[LC9 ?Ix;}a1u pfC?f0<:}1Lb1I&dI&d-ѱX3L2d;Zh&[WbɎ vzfCq1:Ǭc'!;u ɬcNfCv2c[(`V^bCuס D+m |.Xp LJ˕Kf%BRJF;oJeMӪV2[})eV2aĬdtJfV22{,d챰=夕\K%4$tV2boQw淧,ݧz(*QlԽv78]oMkk?zw |~I< ܨg=6t~omtf`L ϙYuղJe/ Yv.Qsٓ[(\kb|J ޟЌٶo9@WJ{V2nmݲ}XWW*V26,&=5dV2ԺcYɸݴY1+9Y`V.L™ m 3+Ǭ\3 S[[Zo0$L2$L2o%;:kfI&3`Gkmdʶ[L2ٙ#2^x/̼Vӳz0^x/eMB\} GfcV%Ȭ >YETV >mA=rv&o|ssJ!IJb=Y)|++gDzn[),V պ]Z)4~-&rd?zMx$= 17M)k%z-žFIYj**hOUN~r닼ጬ\?K _4ΨkʔJC< l{`&s*jEhW7Ԕ4;v[a[k}ozDV3ppy%>'&bWO~I:ҝSM,5X}9I&dI&dܖGI&Tq?+Zo1dgVl_x/e3ZMx/e2gw1gMf`7 2k5lcvFglz2vc.(}0}kXm9k2ގkUf`7:ogӓAWB1>*\\91Wdsc}UvN1W>ZxecYz1h47 POϚHHnN0]=5@e/WȢQEULhR'[4y3T5Hn`K< KrJdʙQY,*ٓCQ[l>~|&JJگd?_+K}1;N$֨[QV N߆4_ULܠH"SpJ߶ȉƒ#s(aK#v#vf/ kgCcu6d#2Ua'h,nWlꎶn頳v݁`l'bǸdBzB&r˂F }F66Wp.ni:l:d6G%m#J? =Fƾn='Xkٵ6yQؠ8#x?hW2c~OI}z}t:^N&_}>&˩7K,=}:y::}9|z~}>8SY}q:翷Nۋ^3VoN5ˇ?8H}?fއ=POĻGk8Z/Οyq8H66Gq&}3ގ;p dI&dI&mɎ}ĚdL%;G[3ٺLv&ive2^x;32^xog匿Ⱦ¾¾±o'dT*}SEvoMl"Tɞk#>Vad"*23 w0 [u1lL ~eh84oPgaޱC|;\̨| z)Ya6~^xy[6wSq֕XaՕ;*vTеe1ea|x:q9p}u `I&dI&d}Kvt#$Lf*8֕md#H(YP\:1ɬcNfCv2Yǐ:1Jף|xY`Cס:PJ|{wݍS䊕>dQo%%a!g%}h%òiU+i+L^\bV2:A%3+=XrJ _Vtyi.Jw%t\Zs:+߷;@lӊ}{`[Sv={W}(6z^esBZͮ7nl5A5=u>r {}Sn޳|m}`:I:_30&w̬djYY ²,\;~({-.[s5k]ԌDe%cz{\mhF`lی7+mf%C=+n>d++S\V2zpz+j]ұdnڬv\0+&ʅ6ʅax\ cV.͙թ\hdI&dI&ܷ53$Jv5gue[-&Lx/evf^Y=/e2kJ!tBsυ]#1+YydVYyʣdVe'(; <+^)[y} f#bHfꃙ@>H.[.}vݢ.Sn'N$:}b_ѣǭjUYẺ212TJbV 3{Ta*Q=U~zrZUUkdWtloAZ)1eR;ϛ[t{cs7&-XI7=m?\i||؞.m=tĝwߦ\Jl#336ϱxI+t^/vƤx+93+=| B8xSM| =Oj,yƢft[*+W Έ]l9b7NEWkiP莎jP1֞>t򕊕3i"=7rz+j.?s҉tr =F <ɮ]RBv ̻Wz}5S|0rᚅU릗aH.:MJ:ZEh?wc1oV9m~#uS{TJuh<8 jg ]+4J\pg^,'IdBxH)xL6ChmTXc6!4yqt} 8Y?²1I cSI&qJ΅!N$&\&˝9{RDG //UcE.]!Yk׎1ZBٺo\T бjլEf"~[$Q6@"(\R_J(\M{#-RiM:@_iUZ"GϞY{qZdqy߷ vJmE&i&rRe :;_߸ƕ_tMBH%v~48_]RXSSV+#,FV+bOQF)"],2), equals(0.03)) }) test_that("mixed: Maxell & Delaney (2004), Table 16.6, p. 845", { data(md_16.4) skip_if_not_installed("Matrix") md_16.4b <- within(md_16.4, cond <- C(cond, contr.treatment, base = 2)) mixed2_orig <- mixed(induct ~ cond + (1|room:cond), md_16.4b, check_contrasts=FALSE, progress=FALSE) expect_equivalent(unname(round(fixef(mixed2_orig$full_model), 4)), c(35.6261, -8.1485)) expect_that(round(sqrt(Matrix::diag(vcov(mixed2_orig$full_model))), 3), equals(c(3.229, 4.548))) expect_that(round(mixed2_orig[[1]]$F, 1), equals(3.2)) }) test_that("mixed: Maxell & Delaney (2004), Table 16.7, p. 851 (uses simple F!)", { data(md_16.4) skip_if_not_installed("Matrix") md_16.4b <- within(md_16.4, cond <- C(cond, contr.treatment, base = 2)) ### replicate results from Table 16.7 (Maxwell & Delaney, 2004, p. 851) # F-values (almost) hold, p-values (especially for skill) are off # however, parameters are perfectly recovered when using the original contrasts: mixed3_orig <- mixed(induct ~ cond + skill + (1|room:cond), md_16.4b, check_contrasts=FALSE, progress=FALSE) expect_that(round(fixef(mixed3_orig$full_model), 2), is_equivalent_to(c(20.25, -7.57, 2.31))) expect_that(round(sqrt(Matrix::diag(vcov(mixed3_orig$full_model))), 2), equals(c(5.82, 2.72, 0.81))) expect_that(round(mixed3_orig[[1]]$F), equals(c(8, 8))) #mixed3_F_simple <- mixed(induct ~ cond + skill + (1|room:cond), md_16.4b, check_contrasts=FALSE, progress=FALSE, method = "F") #expect_that(round(fixef(mixed3_F_simple$full_model), 2), is_equivalent_to(c(20.25, -7.57, 2.31))) #expect_that(round(sqrt(diag(vcov(mixed3_F_simple$full_model))), 2), equals(c(5.82, 2.72, 0.81))) #expect_that(round(mixed3_F_simple[[1]]$F, 1), equals(c(7.8, 8.2))) }) test_that("mixed: Maxell & Delaney (2004), Table 16.10, p. 862 (does not replicate the table!)", { data(md_16.4) md_16.4b <- within(md_16.4, cond <- C(cond, contr.treatment, base = 2)) #note: the values in this test should not replicate the table... md_16.4b$cog <- scale(md_16.4b$cog, scale=FALSE) mixed4 <- mixed(induct ~ cond*cog + (cog|room:cond), md_16.4b, progress=FALSE, check_contrasts=FALSE) expect_that(unname(round(fixef(mixed4$full_model), 2)), is_equivalent_to(c(36.1, -9.07, 0.64, 0.03))) }) afex/tests/testthat/test-aov_car-structural.R0000644000176200001440000001630613667760652021147 0ustar liggesusers context("ANOVAs: structural tests") test_that("dv is numeric", { data(obk.long) expect_that(aov_car(treatment ~ gender + Error(id/phase*hour), data = obk.long, observed = "gender"), throws_error("dv needs to be numeric.")) }) test_that("non Type 3 sums give warning", { data(obk.long) expect_that(aov_4(value ~ treatment * gender + (phase*hour|id), data = obk.long, observed = "gender", check.contrasts = FALSE), gives_warning("contrasts")) }) test_that("return='aov' works", { data(obk.long) data(md_12.1) # purely within expect_that(aov_ez("id", "rt", md_12.1, within = c("angle", "noise"), return = "aov"), is_a(c( "aovlist", "listof" ))) expect_that(aov_car(value ~ Error(id/phase*hour), data = obk.long, return = "aov"), is_a(c( "aovlist", "listof" ))) #purely between expect_that(suppressWarnings(aov_car(value ~ treatment * gender + Error(id), data = obk.long, return = "aov")), is_a(c( "aov"))) expect_that(suppressWarnings(aov_car(value~treatment * gender + Error(id/phase*hour), data = obk.long, return = "aov")), is_a(c( "aovlist", "listof" ))) # terms within Error() are within parentheses: test <- summary(aov_car(value ~ Error(id/phase*hour), data = obk.long, return = "aov")) positive <- summary(aov(value ~ phase*hour+Error(id/(phase*hour)), data = obk.long)) negative <- summary(aov(value ~ phase*hour+Error(id/phase*hour), data = obk.long)) expect_equal(test, positive) expect_false(isTRUE(all.equal(test, negative, check.attributes = FALSE))) orig1 <- aov_car(value ~ Error(id/phase*hour), data = obk.long) obk.long$id <- as.numeric(obk.long$id) obk.long$phase <- as.numeric(obk.long$phase) obk.long$hour <- as.numeric(obk.long$hour) positive2 <- summary(aov_car(value ~ Error(id/phase*hour), data = obk.long, return = "aov")) expect_equal(test, positive2) positive3 <- aov_car(value ~ Error(id/phase*hour), data = obk.long) expect_equal(summary(orig1), summary(positive3)) expect_equal(summary(orig1$Anova, multivariate = FALSE), summary(positive3$Anova, multivariate = FALSE)) expect_equal(summary(orig1$aov), summary(positive3$aov)) }) test_that("anova_table attributes", { data(md_12.1) no_attr <- aov_ez("id", "rt", md_12.1, within = c("angle", "noise"), anova_table = list(correction = "none")) expect_that(attr(no_attr$anova_table, "correction"), equals("none")) expect_that(attr(no_attr$anova_table, "p_adjust_method"), equals("none")) expect_output(print(attr(no_attr$anova_table, "observed")), "character\\(0\\)") all_attr <- suppressWarnings(aov_ez("id", "rt", md_12.1, within = c("angle", "noise"), observed = "angle", anova_table=list(correction = "HF", p_adjust_method = "bonferroni"))) expect_that(attr(all_attr$anova_table, "correction"), equals("HF")) expect_that(attr(all_attr$anova_table, "p_adjust_method"), equals("bonferroni")) expect_that(attr(all_attr$anova_table, "observed"), equals("angle")) expect_output(print(all_attr), "bonferroni") expect_output(print(all_attr), "HF") expect_false(isTRUE(all.equal(nice(no_attr), suppressWarnings(nice(all_attr)), check.attributes = FALSE))) added_attr <- suppressWarnings(nice(no_attr, correction = "HF", p_adjust_method = "bonferroni", observed = "angle")) expect_that(suppressWarnings(nice(all_attr)), is_identical_to(added_attr)) expect_that(nice(all_attr$anova_table), is_identical_to(added_attr)) reset_attr <- nice(no_attr, correction = "none", p.adjust = "none", observed = NULL) expect_that(nice(no_attr), is_identical_to(reset_attr)) expect_that(nice(no_attr$anova_table), is_identical_to(reset_attr)) intercept_test <- aov_ez("id", "rt", md_12.1, within = c("angle", "noise"), anova_table = list(intercept = TRUE)) expect_output(print(intercept_test), "(Intercept)") mse_test <- aov_ez("id", "rt", md_12.1, within = c("angle", "noise"), anova_table = list(MSE = FALSE)) expect_null(mse_test$anova_table$MSE) expect_output(print(nice(mse_test, MSE = TRUE)), "MSE") symbol_test <- aov_ez("id", "rt", md_12.1, within = c("angle", "noise"), anova_table = list(sig_symbols = c(" ", " a", " aa", " aaa")), return = "nice") expect_output(print(symbol_test), "aaa") symbol_test <- aov_ez("id", "rt", md_12.1, within = c("angle", "noise"), anova_table = list(sig_symbols = c(" ", " a", " aa", " aaa"))) expect_output(print(symbol_test), "aaa") new_symbols <- c(" ", " b", " bb", " bbb") symbol_test <- anova(symbol_test, sig_symbols = c(" ", " b", " bb", " bbb")) expect_identical(attr(symbol_test, "sig_symbols"), new_symbols) expect_output(print(nice(symbol_test)), "bbb") # Test support for old afex objects old_afex_object <- default_options <- aov_ez("id", "rt", md_12.1, within = c("angle", "noise")) attr(old_afex_object$anova_table, "observed") <- NULL attr(old_afex_object$anova_table, "correction") <- NULL attr(old_afex_object$anova_table, "p.adjust.method") <- NULL expect_that(nice(old_afex_object), is_identical_to(nice(default_options))) # Test if sphericity correction is set to "none" in the absence of within-subject factors or if within-subject factors have only two levels data(obk.long) between_anova <- suppressWarnings(aov_car(value ~ treatment * gender + Error(id), data = obk.long)) expect_that(attr(between_anova$anova_table, "correction"), equals("none")) obk.long <- droplevels(obk.long[obk.long$phase %in% c("post","pre"),]) two_level_anova <- suppressWarnings(aov_ez("id", "value", obk.long, between = c("treatment"), within = c("phase"))) expect_that(attr(two_level_anova$anova_table, "correction"), equals("none")) more_levels_anova <- aov_ez("id", "value", obk.long, between = c("treatment"), within = c("phase", "hour")) expect_that(attr(more_levels_anova$anova_table, "correction"), equals("GG")) obk.long <- droplevels(obk.long[obk.long$hour %in% c("1","2"),]) two_levels_anova <- aov_ez("id", "value", obk.long, between = c("treatment"), within = c("phase", "hour")) expect_that(attr(two_levels_anova$anova_table, "correction"), equals("none")) # Test incomplete observation attribute incomplete_cases <- suppressWarnings( aov_ez("id", "rt", md_12.1[-10, ], within = c("angle", "noise")) ) expect_equal(as.character(attr(incomplete_cases, "incomplete_cases")), "10") expect_equal(as.character(attr(incomplete_cases$anova_table, "incomplete_cases")), "10") expect_equal(as.character(attr(anova(incomplete_cases), "incomplete_cases")), "10") }) test_that("error messages for common problems", { data(md_12.1) md_12.2 <- md_12.1[!(md_12.1$noise == "present" & md_12.1$angle == "0"),] expect_error( aov_ez("id", "rt", md_12.2, within = c("angle", "noise")), "within-subjects design") data(obk.long) obk2 <- obk.long[ !(obk.long$treatment == "A" & obk.long$gender == "F"), ] expect_error( aov_car(value ~ treatment * gender + Error(id), data = obk2), "between-subjects design") expect_error( aov_car(value ~ treatment * gender + Error(id/phase*hour), data = obk2), "between-subjects design") expect_error( aov_car(value ~ treatment * gender, data = obk2), "formula needs an error term") }) afex/tests/testthat/m_machines_lmerTest-pre3.0.rda0000644000176200001440000006155313664111747021702 0ustar liggesusers |$Gu0sX]_Kw^I^!C=^LԻ3ݳ= lCMpOB 8`gC$l {zF#H~|ի^z5@oׁ.EQJ*V)pN %,׮⡢3LQ* _e7@;sڧE>uOKcRyJ$ AdM!`niiӲ;B؊=វyexpJ]b2KrϘfꙍz#b~< noK\ 8V\ yZ╳kwԿwݍ.<\.!\Р\Vn .)|}܎8.܎ݸ?qvwq{ qy;1 wXd~x'kƭ,qE!G{Aש`A&FrsZֵ0;iVhr ! ln%7}䦟\NnǍcokM=\W-Nt#^ 81dBTxW/f\ (CJ|i(Ģөz;w&!?ؿsեrHrO*MHB4U8ݬASCf\6Te@O4"AvI0AzU|uW`N2IO=ҙKIYY.&h7dh޺mdiT$$s0=ZFCE=F 84'%iӺmYEyaSJw*4( W yŖS/Q/ϜVR[rZs(C+͕5²2zһ>zO.wJzGu:zi^ZG/Ku:h}>ZGGu:h}~ZG?Ou:i~ZG?rZ崎i:.Q&Z5vO؍kv-7ؕ<,+!υ&oR1j* fM(y#|wo#2SI4{}$5>,í 1=L=rG^`~tO .{.}6ώ/?q;i[?;po$8ʁz}yݿL}-c7=x/o—ޱ4_7s۰'D'gb 6kpůrQωoljtoa[~?޷MA w||ȱ/mI>Ǯܓt!b47|<'l%J̇ MO8c㤃`5ezDIM!?HJ} ZECf\o$7&)Er8J߹c'eGCt[iU1};NxDMeii[:,$kcBֈV>quuk׭JGkX%!n;&ou:UrE6%e 뤶G`N gS.6ʵ- 5'Wuy6y_%-{D*b,d^Vި(T'/ۺ[MGL@=Usք =n sdR 9(RuA9 0sG!3l? Y<4b@s!LD0Ԣm?9= u =ͬkXڀX(E qPx׀l2i%o;|̬d*!Ӌ3n.[1z@iR8VNH'Yff/}ܐj{%\06ro7v$튰cb+I3ԊBj/jmjE` |IbcA`\7jåiV0ޠ>|I`+'Ҙ r;agjd!GuS5jUSꎣٓrSQ /Xb ArOl8;˅–c.5-5DUrE< {QQ酑a}L ++uBr>,U Vq&\' q@ו")2.,U!.-H}DJgC%WXc \HrM^WhZ,¿%kB+ _._aHK" lF8-'0[qO"{ JW%qq]p+ot;^ ~g߫Ow>] =\k/~_/Ae_ ~PA$l& ~o/ ~uwa5HPNN!t:[ _5_+,_ _IVМj-dѻBd!p}GZׅqZ΅r*9 /ʍnJy;*C7׮T|6 [PSڷkE I!WU^6wnJ0-F\JDa9(,N+-=(%t2PO^G*$'\tDR=Zז2{?Kt.ކ߯IL&rrΕl35{gp-[bHzNIdl8<QFjR.kzRsEK8u).l46*)ldҜ \E.$UH JIJ0NIQiӶ&ZY3f*T7)l9U2J>&_"%1'bYc'kȱlY˦q!`3!T3,a@j)qb˕ͶI5aJ` Nͤ );#}ԋ#hobž%8N<pc|"@Og֏B*zs<*:SZFEtwgk!`xm -#fH@Hְ MuEwSHlo ?xrL噵m5mmv;cMWe]F`[FBMdWE& @.!ySlGg>M-P(&*^/9eu$G |d#]|ZŵKPW 3[}HoP#PGD8-@=~PW!{kwMGA1b;}3keĀ/IABZ9e޾E7)ׅZVÚb YZ uy<"#x\DW} lyR= d~W|zɖ/~/?)~?›?Q[z`0u]y |4k]|~Togo{ {ßNb zdkzAL9l<5IxK< ȼGW;ڷ,ĘbIUP$-&;GP5$E R*!K LvGlȄź9>.=sAEeÒ *\M4F/뷮l;BhzO_b"5?C[׺\cC6?y(||[^"9r":*BfzLmx{ 'Ob2g *3'8pxoTx?M@Ɓ"$* נIfnaK3nLq .(-نw3z^d("Pg8dMyt'Q5 S3]{iX@/L0wKIW1<cʇy} OzՃ\#Ǿ ~z'̓MzS{Cc)_._wbj=/{6EĭkwȽsTɱ:Q_ c[ B(HϘ }iݽbWz%>8G5ZPf1꤉)\hYMS@ЪSLZoԋU~N{u7oFt̋0^'feȰ]|G^NφsʨoK\mUE$}u~ͭj|ÜE z#[x^iZZ-1}~$tN(#量ʼ`nVɈ z2ciCB'7lx.þbe+X#zSO.U5h6zԸPq4]>rpǃUMlo67^7&k5}E [މ:4-^n|pAVN!pwjsW:.~?iRg N/4ǒr ܬgbGs5^|(M# iMN2 n_iR̜:|@VQQ理9n8HA?<*O%Fҳ.ᗾx6||͂HD\-%.] ru\vbS2ui%I5ӵ89|`~y; dow[)8_+Md靁FuǦNlv{^~=R5e޲Ay`[;f-s\Gu3YFse(/']"RWP'vidA^@2!&LyԳhAV!D׽B}A¦"o֝چ Ymµ o]~F3>p-;xckB7F wV-Z)\$3ŨI{xLʋ^ B̾L_0n}ȅ?1bx?6c%xYI~D[\=2)Ie<:yN([pd-Βqa#Cu.ԋTofW$1\G/3]zOvL!1轼"fXx;Y=` 873iwᅲf_tWxX/'IkG1!m.~iDSr4#U)%VYR>tS`HJY9Ű-x)RпA*oB>yZlfHY#<[mYZxn(U QJI[ylE1G)y9 $*2X$hAXzOK*6m@a-)^8E* 2k:cVPeR@ڎk8=p6nJ ?TgVN!τ:qmT$W2s3֓q˖x-ޏ2c={܋4iDU`a#qu79=9f߅gvw!0we!ٳc/;Nvl&;^9?qώ:u4쨃s#8e-3{{]3l|>}>p} :՚o|;m3lo$k}oi_=ϯ}1-xiOv%TS~{D?vUstSCôgL7z d(vJؒDKjؓ3lhmpTRiw{TUlY Py0ieV[6C5Y.xEdX'a!x^Z\/H2yS? ƷޖM'[6͂H_-Eq643ZV4|mߥo9EJ o3ɧy9N%KwފB70 c2Vy{Hņ鸀 iv̉+YFL+*%/CLm esZVr`&vdefw'ֆ zX{A~ HfHj^Ev0DLX(x3H-&&#[_ONڽ*B9]P@RA(` qܕSțPn#O+Q.#݄YFs7'{AM^bqa ԻptY:P$zbunr4yȬQGhT'EaX5̚wOC S"u`5+ x@q1euaׅ#c& . >O_TDEFȢI 1oIVYELz7w"1YE E2חoB7 &2ddQHD\%J$]Eǂr]yLl(~x u\`ʓ9<P V3ZpZoHA6XRy`pүQ"E-ܧytClޜAwuėDQ0 -$s`%נ}4,ɭ*ep DOVQ XlJ]qy`w9#?U55q[VYE UT4P&oKkvq2rVHe;eМLp\q{| v W^~W OmmAx^]!|kl*6&md+>Joa{Ol [VEl7嶐}1I}!݁t&u 5 w(kR劊vC*zPa_ZV泤,Mo1;Ȟ([:uI ,9Ia;.XsZ)Pǐ L,V(nH"7`aFiW27kB1BVE[T8m>l<9F"ۮ >RG^`>".)Bm({q8HNT"# 糒=j8ce񣰋 Bb1;ckQ@}0yfrpklB2 O;o 4 J0m9OMFiq\lEyrjSX)#fvJ{fF8e7+ىo 3@JBQəXLLDCEfVEb.&M綮=Kg8m# +$Oyy!JW|ƚ!&wj KC-r'KpSEV8KM- ZFϒ&v/۵u '0IڷU 82^aJ[]eUeIR7xNZ2R”$O6q0;b#W$_W>; FaHB/9c$I1I{f 3kf6V?S! lӦCDWB7X(8%R) %( h{4=H " B$q:\ L pVwIKL~ ZmfN?&imG1IRB,\!=1&> KL`015xNew{%d;Ff b# 'c%i hׄIg{n9Sgd'΋VߗdaG 9f%qFM0ɡVTİf@v aYcEPQ^,I{ [gtfđ ([$-ix>)L10q N .m-?wFiIhg[(3Cb8NV H Fօ 3Sդ^5fC#ddLx>3_u&iApiy-upn`0!4u 7z<cb=lNAEaL-ӂ,_^Ƣ#b]2fGbr2)%1ŞpZM^`]} Js])D(Tj&;qO\1*idǫ-W濄."p%C6^n ^PJ:Ero^nG~ui![Xwl̘}Ax0ڹTڪbuV<@phgTT0VRt2X˭Ug}5$&mVVT^*ɑGKH0G-';rE@jb:W.1p0Q8N)PGh⑺18ej,qUaA!W E%t LUNNzѺ1ls{#m<;gp9n{L2ͲL{$+7A"4`GL_eӋFu2omzE-0ّ/y@l[>y ߨR?k<ئ6.F)gBB 5ֈ—|Rw=Њ#h*;=Tx(;Ji㖑S]*D&x<56Yy>E;M{I6J̞+3kűu-)Q"bdM܌JiZoL, KtO($cENXcD^+?mH!n!#Kl"eXh+i+[[Oer}bxԄ2޳5k Zw$ר|jfu3G.b邅$9\R &t%J䭒n {R'NW}л[%=㤀- }6TK_`p% l5bCB#I1&\w&w ܉h5ws'ʌN2 )C;rḍQv2f-KY=M1\L>P8]0L&[;],hqzsl}Ae`h WBa4R77-lqiH&BvA1q,휞+7mm13i3&$` U6kik+ /1􎌨-&b" `"նc/4Bُc&]cm-mkikH&#c4s:皀$H3l=.MTh[,e]*pӊ.х%j/i9Ē ̕++1v qeme NMgqƨe6wiW ̦y/&E FE-,qMǍl^S1+NAbW 6N+l%AfsS8׼,̨){T*>~:*7iNwGz-<_#zN`1?C¤jՋ eZ{mQ/B=<+fp_e'PNːzTLf~JKQo!v,A]CrI }Ʌ +g.N!: Dqu&?;PB3 EڴH3#&nzX%j:AZ6Yq5BiEQBiCf3P5󵣤 x;;BgS.5{rM?݊sΘ6Zsn΍G@ `ꍢ:h5,)@ o1'D"nV$Kr,q! 2=؊ N/ @hE JUS P -z7ov3y3ii3pŖx=M1]=|YD`,.i#ڨ[M]K44X b0sstΎ59cl1SiS&‘b&AU˴VZlKB/lymdݗ6SVZ/{R3,5 );nLUk/7l=] gM3fPhVlsVqHk&^$AB\Zp pzcЛh>fV)Y0eCxсy8&lv2rFɯ&e$bs }Q ?1YWb$= R"HfgE BhR7DHZ=/lF 9۱ک(lI)Q>1\MqVRs%Je6d:h!8kW0a8ݒ#HBB$-)"}-TPKJpw2P:W(DVxm3cn2t沠NP /)DZ٠-{KLauQ'sFRFGVI4򫍑0Ļ` DŒ'9MII44XO a,D.Q|6SMj96Zl淏ܸ.|]zSu歝*@>f_`t:{Η}z6f-U;؞gOW w0y,q3a;i:g'U"K Xʥ 03F\Jl$5-(vFXs#3"qA3G2R&1/e@!*[_DE:6Z-ͳ};7oٺmct!8qVm__W ֛n I@LO6y8QC@[yVvauy% 2d~us|XVU%3fIcؖY't;OS|0AKg ] =RUp~ 'gӏm"ʙ30xtb[VVVq536k&mhb-kzMNhOIJlQl=9dB_d]H%҂(K})LLUTsnm.` n3 Fb6r^O8D$B\&_&pwQx~O:-^md=4}<Wþ=űjfNsp 2/̈ K Xª)8DY<ܳ5xӪI9@O"$<jdO0בxodOKޞ[Ԏh Uq)X}ӣTk}Km7IhyKr9=#-9h(N695@=paj,^"P]z TulzNդP4Lյ| ~l&1fJh("Z4i.rz@-ۣŢ4D\H,9ƨ[\# gwJ#%|jw5{TwI 3Q25睰bL Rm+<$o15J3]EQñ6MbcI^A"Olg۠|-?C9I ޅ hv:eq!0d DB*c Ptd44b4IPyW[gT;*)0'!S$Ɯ  cRYxUgKpM[y;,} $KRXueq<c݇1>/i[ذ,c4H=6aa61e ߂SW?6(.˔ EýhٞLrղmOtlPw9KwTǣ\_!DBhn׳̻/| 9\*Y_`5HxEH!Ԧ+4F!>UN,Q6 Mܿ?^i؋ظ0=W5oNa`xѡ9I֨!Dɲ7lkF`{ pGdčg:*6gMMЂXM'e8(A{G GDV0\3{()1dېD  6Dj?$]#㬝 u% #UPz;JhQB{AA_+\8 Z0FNdL Ʊ옞="'!CGkMJL  ($19+_fޥ=aYl,~%1RU]A.~naz:qȨC*}ZIe bk{^Bn{jka[GWab 2Y>f0:Z-XjNwuh\@4ftȤJÔb1Oæ8l>0.MCJp_{w&mJehh/jm`8uQ| _{u׷:|)3po_ =]7-O}!݁t!G)&q~j V8pBҮ'Zq'; ,Aןxxȧva stkV55\1]oN6D„MɷC-2k=J>|L,^*_sHx9Xo/jX^TC0a>J65%^n'^:^,1PyF1Qnq&Hk-dLښ \FxIU2?;GpFQ 2մc}` `DȞ◔lPfB\!e<)tqh ($T|׾z2^II}w §x]T}L~qȽ'y2䈰ן¿BIQ[^tUťT%~v,ȵyÃmow^=5UBdH+]&Zk[$^;U"[)#9-k$Yf`0q͏VȐPKtJB7=>?$x*Y lǾY.- M)r(BK"2;:.mqB7F\  Lf)[vlI)/-"K9^sD zJ=Lr& oBd% HcJHE 2.! $"Hw:0Rn ~07-m|?H2 r 0p\!#rŒ?p'1<9L$}Nh_+]MU$P2W@a8hy%?T>WPr Fapzh Si8Y*ד*8 h2UA&j;68 %D)0&80EBb1)SS N*OtplLj:i`|i»pLAi:WLRoLk5s8 ~:V&:f\GbIz? Xfyo ,dO|Rmm8=sȤ 7r#gap -Mh]nzlApV˦wQḿ,@Ýt@1 :QP"@.נw9=[` PPG`ljra4_qLʲH6P$9T5մLD&n=3Y JI5`OKhVŠaYYhkԑ2hjؘf u]XY @4WzFQϐ8ھWFt~],K,*Lt/0sD$Ro[1G4bِ|Xn$W;%G0~ce –/8xZy  N#L5k.`p#(#G~!dmJ-˸3 ^7HHJ\!029]p Y+uu$`qE̍jɂVh{j(tBc3^ٌ5Mi)Tl=WHO4W_bxT0I8>m26%fF4u`zm jg vnc,CovL3G='ZOs<|*ɣvicS{rC P$܈uH&&-ЧS|.CA|3J|[ ?3EŨR`!%fvmN;8_ǘ'U@,;.򜒞5گ(d-RzIw(+wy xD+eh.iS[ 8[پIJ'}YUe_Dخ )? $3f3jh &N{>>>^CN'>+f5}EI>ɞ/2;s%`_XѠP$sbH 4w3 6huEY*FV~J蜴F-;eOZHǪtf#.Ohz_Id8O@ƾj,OvTFN 3=r##p{G22~?9 0.:n(a*jK9PɎrUt-gTBjm fi-{J F"hkF8ZPm=d =@t7iph-苁p!8I8Wdw%&6w2c%Vdit;-$pku^dTuy<| 9ꯘ{SxUD'+o퐌~"iGT`Sb9,tCֲ% '_zR poYЯ7Ö!I( _c HL>˼&S30 C/;K-_Et.`D"c&#΋]9 MrxĆW)Jq_2`$1jK%NG2ՑuQ1[vHzIv>UK#k!Z=/  ׸y %6m@? Jtbt% Ye@#:h\36I1LKu.giwD|j)ߋh9iO+`S5_SW|,Hjd&p{NN{!dK(ɏ@I( "2_^k]&ؔ9iIomZqkTH̜:aVыhfC! HM(]e"=`Lg׵&/6IUa >Ypk6 XNce^8wMF. `ءU{Eu>Gg3؃"Sy0Ő F O;1MSx7ꪙ=QqKNL mo}t3m.bq$7i8{Ն/ks#k؉u\ Ne+hY.9z*Eƒ"s,Bzv-]\5-t$dk-LBvZ % 8=j1k"KD $węwbq$^Woݫ BQ^+hg(!r-wdda4Sb{g\f3[ꑟl>'%e%<ZWXHSyVP%UxR\\zC1v}8}Omyjrqy9FLv}h;8Nwg`|,L"ú4O\A3qjUku JI|Pf:GʣPL`̾- :@A@xxМD#'ԲG4 }5.W%X : 歛sk@ Ǚ.}:0Dkqh[ZT*^#J@E=]і*`fPjEXm{T .\됬D(-2DMԈJEGe<@0I0jqJ0o5FM'JeuS{. K/d w+sdխbf,ZlM7n)9мeBnJHlO@J{\a}cpfc~.%}d$2#1y:]Ȗp2Ag|w|;?)NY~R^|W@9D3!Z~TbpV,aKp˼;*_ONMe@XK8PVi^ɆI4 s%jDCѴ 9T}ZW6VTfl3SQ-nZv`ni-NNڒ 玝1+ʴpD_Y<5xTɑ"kZfZWr֋bksl4mH0 l ;z%?vƎ!ɥ. %rB$K&8RdvjIBHPH<1(O b߯E:oUZ+ >#}K/*6ǘ(Eay|R}2cZ')'i1np\qO/RmXs'^>ƛ>r_E˼,?3ګ]70 \=EZУk_ ^/#봳 \m|J[wq?Nyg3׬+M8g+YCO@[Au|;܃bvv)I׆u~\NXXL6ow>  ~w>}op~^m︼m_o+o]۽oǽn\gw'wzCxt[pCO룸=vpvvI v0~?w?K9뢸<=q1f'` zw=y7N(5ɺpIs~K:kn"u Mp|K\Ij?jiCJo)tLRBqċ\jF@Y>͍$/ó2~'?{͉/}mC_P~S8}2/Zi> ||uA=ދSg޷3wpgL=~jo Qǻ箿~~;>ﶿ~N+O\WOojtߗ~SRnno?~ ?~Ka[xu=(?uH|/uFeॵ;.OHωg?2/߷^ǧQ5S`%zO2uϾǃ?Gr2YYW>e-O~=L}}ǛgO[L=MPUxӫ]龵Uk.(S?)~w2+yԳ}{?~eǞT/|*W_JI >]^=O y(aqBu1g,QX|С4CNzzR@])3"'xpq :\5jEԖ.= jpJ jm(hsuqz2g6O+G#'38"rr9=L.i@;vp٫;aPMwe) ZPIE~)f~m̯5Y9.g6u䦗~rs9Y'杆%~]LJz&d~8@sufS]rEsmSJu7\s]&uh4݈F)7L^6jo#MZv0u"V:Y}l]_'yՐ&5q7W+kUaenw}]Nӻ+ݕKu:zi^ZG/Ku:h}>ZGGu:h~ZG?Ou:i~Z崎i:.u\2w4Wmt?B5HdW\(Ns@wD|==HC:vKV4_w'Km^Ȝ-.yӰߧo}jY.nJ6&}ؚAG}l#'CqIgˎ?},w6~x3y4( 4=G)uc,GPZ%iM0,mh `zH۶mS7՛tsBskQVRɶE 飶79(J:T?=Ԩc9Y% xb_<]R!tX.`Ě1Wvi=.&J"e ҼlAs&c [|WD+~3d!f;`ʼn4jka=9KI\hev.SL gY.I&Ռ\wwڈFiy`tdŧBW{Xj"&E(*~ ih3. W Xy_ w&EDbvA? JCrOG'!)?È4⨮4*m J&0Φ3[o-}enYX[J1_ɇ/p.?n),fzs_JJYܽ Ƅ%GOzF= pC`:75x#׾zyMಧ|Wyzt;׿koOοKGҭx2vӃw'/|iKuӿ}sx߾Ƿn?x?ym"WsU˧^{;qJ.aև;oz}wx?sҁ'5Op3 }k_?A0lg^_?增m?=ӭ%7tyo回0c_˓y?~}|g]Û#+Bn;!Bny}qBЖiBTN'|1F= '.RFE 'dN7K8InLrS"-26qsHOʎʿחNi.c;v>89Ȭ*\{+WLDr6+q=iBUBkdpQS !d\B{OakvtU$Dɋ~k>Mm`G=}'q)aa`L&U P,Z%Wm=gûhdh⍢Y-tޞ8%K𑌱>dm(I(MҮzrm`l"2O,d۞Sr#+UdX+Kc%8zkׄ[Z-,O˷^i-rvm4b.r|[V]t4V]4_/^w K{COyHR/t6c: o\:f5/!Z/ŷ)\eYꕭz֍Y|g1S\87ӵl)%OS5^懤 QYҒSZrS8tgaA`n1Y̺iiKR#iʒN,ʬVPF3(jǰZ|uǘiB%?A9%WH4ƅ>bGC1k1s~]/c *rlCog)Ɔ#ڣy0᭑ ~Pɮg^ kecz0㸮 DBrᾌ<,afex/tests/testthat/test-aov_car-bugs.R0000644000176200001440000003357414076011251017660 0ustar liggesusers context("ANOVAs: known bugs") test_that("aov does not throw 'Error() model is singular' warning for missing values", { data(md_12.1) md_12.1b <- md_12.1[-1,] expect_warning(aov_ez("id", "rt", md_12.1b, within = c("angle", "noise")), "Missing values", all = TRUE) }) test_that("regex works correctly in aov_car when also having within factors outside the Error term", { data(obk.long) expect_is(aov_car(value ~ treatment * gender*phase*hour + Error(id/phase*hour), data = obk.long), "afex_aov") }) test_that("another label bug (May 2014)", { data("sk2011.1") levels(sk2011.1$inference) <- c("A+:D-", "A+:D+", "A-:D+", "A- : D-") expect_is(aov_ez("id", "response", sk2011.1, between = "instruction", within = c("type", "inference"), return = "Anova", fun_aggregate = mean), "Anova.mlm") }) test_that("orig label bug", { data(obk.long) obk2 <- obk.long levels(obk2$phase) <- c("fup test", "post-hans", "pre tenetious") expect_is(aov_car(value ~ treatment * gender + age + Error(id/phase*hour), data = obk2, factorize=FALSE, return = "Anova"), "Anova.mlm") }) test_that("ANCOVA check bug (reported by Gang Chen), January 2013", { dat <- read.table(header=TRUE, text = "ID Group Gender ROI Value Propdd00 GAS0 MAD0 CPD0 2016 AE M 05_06 1.581 0.543 1.908 0.439999999999998 -0.5335 2016 AE M 07_08 1.521 0.543 1.908 0.439999999999998 -0.5335 2016 AE M 09_10 1.623 0.543 1.908 0.439999999999998 -0.5335 2016 AE M 03_04 1.569 0.543 1.908 0.439999999999998 -0.5335 2016 AE M 11_12 1.719 0.543 1.908 0.439999999999998 -0.5335 2016 AE M 01_02 1.509 0.543 1.908 0.439999999999998 -0.5335 2031 HC F 09_10 1.739 -0.014 0.0480000000000018 -2.347 1.9665 2031 HC F 01_02 1.763 -0.014 0.0480000000000018 -2.347 1.9665 2031 HC F 03_04 1.8 -0.014 0.0480000000000018 -2.347 1.9665 2031 HC F 11_12 1.793 -0.014 0.0480000000000018 -2.347 1.9665 2031 HC F 05_06 1.765 -0.014 0.0480000000000018 -2.347 1.9665 2031 HC F 07_08 1.654 -0.014 0.0480000000000018 -2.347 1.9665 2063 AE F 11_12 1.742 -0.027 2.348 -8.88 -0.0335000000000001 2063 AE F 01_02 1.634 -0.027 2.348 -8.88 -0.0335000000000001 2063 AE F 03_04 1.638 -0.027 2.348 -8.88 -0.0335000000000001 2063 AE F 07_08 1.604 -0.027 2.348 -8.88 -0.0335000000000001 2063 AE F 09_10 1.654 -0.027 2.348 -8.88 -0.0335000000000001 2063 AE F 05_06 1.625 -0.027 2.348 -8.88 -0.0335000000000001 2042 HC M 05_06 1.649 -0.014 2.058 -3.497 -0.8635 2042 HC M 07_08 1.565 -0.014 2.058 -3.497 -0.8635 2042 HC M 09_10 1.765 -0.014 2.058 -3.497 -0.8635 2042 HC M 03_04 1.677 -0.014 2.058 -3.497 -0.8635 2042 HC M 11_12 1.706 -0.014 2.058 -3.497 -0.8635 2042 HC M 01_02 1.618 -0.014 2.058 -3.497 -0.8635 2071 AE M 05_06 1.712 -0.317 -0.802 6.74 1.9665 2071 AE M 07_08 1.64 -0.317 -0.802 6.74 1.9665 2071 AE M 09_10 1.791 -0.317 -0.802 6.74 1.9665 2071 AE M 03_04 1.725 -0.317 -0.802 6.74 1.9665 2071 AE M 11_12 1.782 -0.317 -0.802 6.74 1.9665 2071 AE M 01_02 1.712 -0.317 -0.802 6.74 1.9665 2134 HC M 05_06 1.672 -0.014 0.347999999999999 -5.807 -2.5335 2134 HC M 07_08 1.657 -0.014 0.347999999999999 -5.807 -2.5335 2134 HC M 09_10 1.791 -0.014 0.347999999999999 -5.807 -2.5335 2134 HC M 03_04 1.633 -0.014 0.347999999999999 -5.807 -2.5335 2134 HC M 11_12 1.859 -0.014 0.347999999999999 -5.807 -2.5335 2134 HC M 01_02 1.653 -0.014 0.347999999999999 -5.807 -2.5335 2009 AE F 09_10 1.672 -0.027 1.058 3.36 11.1365 2009 AE F 03_04 1.723 -0.027 1.058 3.36 11.1365 2009 AE F 05_06 1.676 -0.027 1.058 3.36 11.1365 2009 AE F 07_08 1.622 -0.027 1.058 3.36 11.1365 2009 AE F 01_02 1.633 -0.027 1.058 3.36 11.1365 2009 AE F 11_12 1.853 -0.027 1.058 3.36 11.1365 2132 HC M 05_06 1.758 -0.014 -1.082 -2.857 -0.0335000000000001 2132 HC M 07_08 1.623 -0.014 -1.082 -2.857 -0.0335000000000001 2132 HC M 09_10 1.843 -0.014 -1.082 -2.857 -0.0335000000000001 2132 HC M 03_04 1.773 -0.014 -1.082 -2.857 -0.0335000000000001 2132 HC M 11_12 1.806 -0.014 -1.082 -2.857 -0.0335000000000001 2132 HC M 01_02 1.708 -0.014 -1.082 -2.857 -0.0335000000000001 2127 HC F 11_12 1.824 -0.014 0.628 6.223 -0.5335 2127 HC F 09_10 1.871 -0.014 0.628 6.223 -0.5335 2127 HC F 01_02 1.687 -0.014 0.628 6.223 -0.5335 2127 HC F 03_04 1.699 -0.014 0.628 6.223 -0.5335 2127 HC F 07_08 1.646 -0.014 0.628 6.223 -0.5335 2127 HC F 05_06 1.738 -0.014 0.628 6.223 -0.5335 2081 AE M 09_10 1.807 -0.027 -2.082 2.43 -1.5335 2081 AE M 11_12 1.917 -0.027 -2.082 2.43 -1.5335 2081 AE M 03_04 1.767 -0.027 -2.082 2.43 -1.5335 2081 AE M 05_06 1.776 -0.027 -2.082 2.43 -1.5335 2081 AE M 07_08 1.733 -0.027 -2.082 2.43 -1.5335 2081 AE M 01_02 1.775 -0.027 -2.082 2.43 -1.5335 2086 AE F 11_12 1.768 -0.457 -1.082 -1.76 6.9665 2086 AE F 09_10 1.769 -0.457 -1.082 -1.76 6.9665 2086 AE F 01_02 1.752 -0.457 -1.082 -1.76 6.9665 2086 AE F 03_04 1.769 -0.457 -1.082 -1.76 6.9665 2086 AE F 05_06 1.751 -0.457 -1.082 -1.76 6.9665 2086 AE F 07_08 1.728 -0.457 -1.082 -1.76 6.9665 2033 HC M 05_06 1.804 0.126 2.768 7.083 -2.2035 2033 HC M 07_08 1.784 0.126 2.768 7.083 -2.2035 2033 HC M 09_10 1.948 0.126 2.768 7.083 -2.2035 2033 HC M 03_04 1.821 0.126 2.768 7.083 -2.2035 2033 HC M 11_12 2.143 0.126 2.768 7.083 -2.2035 2033 HC M 01_02 1.824 0.126 2.768 7.083 -2.2035 2007 AE M 07_08 1.554 -0.027 0.488 -6.05 -0.5335 2007 AE M 05_06 1.643 -0.027 0.488 -6.05 -0.5335 2007 AE M 09_10 1.674 -0.027 0.488 -6.05 -0.5335 2007 AE M 03_04 1.593 -0.027 0.488 -6.05 -0.5335 2007 AE M 11_12 1.726 -0.027 0.488 -6.05 -0.5335 2007 AE M 01_02 1.517 -0.027 0.488 -6.05 -0.5335 6062 HC M 05_06 1.911 -0.014 -3.802 4.093 -3.5335 6062 HC M 07_08 1.887 -0.014 -3.802 4.093 -3.5335 6062 HC M 09_10 1.951 -0.014 -3.802 4.093 -3.5335 6062 HC M 03_04 1.798 -0.014 -3.802 4.093 -3.5335 6062 HC M 11_12 1.953 -0.014 -3.802 4.093 -3.5335 6062 HC M 01_02 1.772 -0.014 -3.802 4.093 -3.5335 2072 AE M 05_06 1.667 0.253 1.908 0.289999999999999 -1.0335 2072 AE M 07_08 1.587 0.253 1.908 0.289999999999999 -1.0335 2072 AE M 09_10 1.739 0.253 1.908 0.289999999999999 -1.0335 2072 AE M 03_04 1.638 0.253 1.908 0.289999999999999 -1.0335 2072 AE M 11_12 1.784 0.253 1.908 0.289999999999999 -1.0335 2072 AE M 01_02 1.662 0.253 1.908 0.289999999999999 -1.0335 2008 HC F 05_06 1.623 -0.014 -1.372 -2.317 2.1365 2008 HC F 07_08 1.6 -0.014 -1.372 -2.317 2.1365 2008 HC F 09_10 1.688 -0.014 -1.372 -2.317 2.1365 2008 HC F 03_04 1.624 -0.014 -1.372 -2.317 2.1365 2008 HC F 11_12 1.772 -0.014 -1.372 -2.317 2.1365 2008 HC F 01_02 1.656 -0.014 -1.372 -2.317 2.1365 2070 AE F 05_06 1.657 0.113 -1.372 -0.140000000000001 -5.5335 2070 AE F 07_08 1.579 0.113 -1.372 -0.140000000000001 -5.5335 2070 AE F 09_10 1.75 0.113 -1.372 -0.140000000000001 -5.5335 2070 AE F 03_04 1.808 0.113 -1.372 -0.140000000000001 -5.5335 2070 AE F 11_12 1.777 0.113 -1.372 -0.140000000000001 -5.5335 2070 AE F 01_02 1.702 0.113 -1.372 -0.140000000000001 -5.5335 2064 AE F 11_12 1.781 -0.027 -5.512 3.57 -3.5335 2064 AE F 09_10 1.724 -0.027 -5.512 3.57 -3.5335 2064 AE F 01_02 1.631 -0.027 -5.512 3.57 -3.5335 2064 AE F 03_04 1.607 -0.027 -5.512 3.57 -3.5335 2064 AE F 05_06 1.577 -0.027 -5.512 3.57 -3.5335 2064 AE F 07_08 1.546 -0.027 -5.512 3.57 -3.5335 2039 HC M 09_10 1.879 -0.014 2.628 -1.867 -5.5335 2039 HC M 11_12 1.918 -0.014 2.628 -1.867 -5.5335 2039 HC M 03_04 1.794 -0.014 2.628 -1.867 -5.5335 2039 HC M 05_06 1.787 -0.014 2.628 -1.867 -5.5335 2039 HC M 07_08 1.687 -0.014 2.628 -1.867 -5.5335 2039 HC M 01_02 1.774 -0.014 2.628 -1.867 -5.5335 2117 HC F 09_10 1.712 -0.014 0.917999999999999 1.293 3.7965 2117 HC F 11_12 1.75 -0.014 0.917999999999999 1.293 3.7965 2117 HC F 03_04 1.717 -0.014 0.917999999999999 1.293 3.7965 2117 HC F 07_08 1.587 -0.014 0.917999999999999 1.293 3.7965 2117 HC F 05_06 1.667 -0.014 0.917999999999999 1.293 3.7965 2117 HC F 01_02 1.663 -0.014 0.917999999999999 1.293 3.7965 ") dat$ID <- as.factor(dat$ID) fm <- aov_car(Value ~ Propdd00 + Group + Gender + GAS0 + MAD0 + CPD0 + Error(ID/ROI), data=dat, factorize=FALSE, return = "Anova") fm0 <- aov_car(Value ~ MAD0 + CPD0 + Error(ID/ROI), data=dat, factorize=FALSE, return='afex_aov') expect_is(fm, "Anova.mlm") expect_is(fm0, "afex_aov") }) test_that("ANOVA: ids in multiple between.subjects conditions", { species<- c("a","b","c","c","b","c","b","b","a","b","c","c","a","a","b","b","a","a","b","c") habitat<- c("x","x","x","y","y","y","x","x","y","z","y","y","z","z","x","x","y","y","z","z") mvt.rate<-c(6,5,7,8,9,4,3,5,6,9,3,6,6,7,8,9,5,6,7,8) ind<-as.factor(c(1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4,1,2,3,4)) data1<-data.frame(species, habitat, mvt.rate, ind) # should give an error expect_error(aov_ez("ind", "mvt.rate", data1, within = "habitat", between = "species"), "Following ids are in more than one between subjects condition:") }) test_that("empty factors are not causing aov.cat to choke", { data(sleepstudy) #Example data in lme4 sleepstudy$Days<-factor(sleepstudy$Days) #Works with all factors expect_is(aov_ez("Subject","Reaction",sleepstudy, within="Days", return = "Anova"), "Anova.mlm") #If you remove a factor it fails... expect_is(aov_ez("Subject","Reaction",sleepstudy[sleepstudy$Days!=9,], within="Days", return = "Anova"), "Anova.mlm") }) test_that("factors have more than one level", { data(obk.long) expect_error(aov_car(value ~ treatment+ Error(id/phase), data = obk.long[ obk.long$treatment == "control",]), "one level only.") expect_error(aov_car(value ~ treatment+ Error(id/phase), data = obk.long[ obk.long$phase == "pre",]), "one level only.") }) test_that("variable names longer", { data(obk.long) obk.long$gender2 <- obk.long$treatment orig <- aov_car(value ~ treatment * gender + age + Error(id/phase*hour), data = obk.long, factorize=FALSE, observed = "gender") v1 <- aov_car(value ~ gender2 * gender + age + Error(id/phase*hour), data = obk.long, factorize=FALSE, observed = "gender") v2 <- aov_car(value ~ gender2 * gender + age + Error(id/phase*hour), data = obk.long, factorize=FALSE, observed = "gender2") expect_equivalent(orig$anova_table, v1$anova_table) expect_identical(nice(orig)[,-1], nice(v1)[,-1]) expect_identical(nice(orig)[,c("df", "MSE", "F", "p.value")], nice(v2)[,c("df", "MSE", "F", "p.value")]) expect_equivalent(orig$anova_table[,c("num Df", "den Df", "MSE", "F", "Pr(>F)")], v2$anova_table[c("num Df", "den Df", "MSE", "F", "Pr(>F)")]) }) test_that("works with dplyr data.frames (see https://github.com/singmann/afex/issues/6):", { if (getRversion() >= "3.1.2") { skip_if_not_installed("dplyr") data(md_12.1) md2 <- dplyr::as_tibble(md_12.1) expect_is(aov_ez("id", "rt", md2, within = c("angle", "noise"), anova_table=list(correction = "none", es = "none")), "afex_aov") } }) test_that("return='nice' works", { data(md_12.1) expect_is(aov_ez("id", "rt", md_12.1, within = c("angle", "noise"), return = "nice"), "data.frame") }) test_that("aov_car works with column names containing spaces: https://github.com/singmann/afex/issues/22", { data <- list("dependent" = rnorm(100), "RM Factor 1" = factor(rep(c("Level 1", "Level 2"), 50)), "subject" = factor(rep(1:50, each = 2))) attr(data, 'row.names') <- seq_len(length(data[[1]])) attr(data, 'class') <- 'data.frame' expect_is(aov_car(dependent ~ `RM Factor 1` + Error(subject/(`RM Factor 1`)), data), "afex_aov") expect_is(aov_4(dependent ~ `RM Factor 1` + (`RM Factor 1`|subject), data), "afex_aov") expect_is(aov_ez("subject", "dependent", data, within = "RM Factor 1"), "afex_aov") }) test_that("aov_car works with column names containing spaces for between factors", { data <- list("dependent" = rnorm(100), "RM Factor 1" = factor(rep(c("Level 1", "Level 2"), 50)), "subject" = factor(rep(1:100))) attr(data, 'row.names') <- seq_len(length(data[[1]])) attr(data, 'class') <- 'data.frame' expect_is(aov_car(dependent ~ `RM Factor 1` + Error(subject), data), "afex_aov") expect_is(aov_4(dependent ~ `RM Factor 1` + (1|subject), data), "afex_aov") expect_is(aov_ez("subject", "dependent", data, between = "RM Factor 1"), "afex_aov") }) test_that("aov_ez works with multiple covariates", { skip_if_not_installed("psychTools") require(psychTools) data(msq) msq2 <- msq[!is.na(msq$Extraversion),] msq2 <- droplevels(msq2[msq2$ID != "18",]) msq2$TOD <- msq2$TOD-mean(msq2$TOD) msq2$MSQ_Time <- msq2$MSQ_Time-mean(msq2$MSQ_Time) msq2$condition <- msq2$condition-mean(msq2$condition) # that is somewhat stupid mulcov <- aov_ez(data=msq2, dv="Extraversion", id = "ID", between = "condition", covariate=c("TOD", "MSQ_Time"), factorize=FALSE, fun_aggregate = mean) expect_is(mulcov, "afex_aov") }) test_that("aov_car works with p.val adjustment == NA for HF as well as GG", { # see: https://github.com/singmann/afex/issues/36 skip_on_cran() ## takes rather long load("anova_hf_error.rda") #load("tests/testthat/anova_hf_error.rda") expect_is(nice(aov_ez("Snum", "RT", demo, within=c("DistF", "WidthF", "AngleF"))), "nice_table") expect_is(nice(aov_ez("Snum", "RT", demo, within=c("DistF", "WidthF", "AngleF"), anova_table = list(correction = "GG"))), "nice_table") expect_is(nice(aov_ez("Snum", "RT", demo, within=c("DistF", "WidthF", "AngleF"), anova_table = list(correction = "HF"))), "nice_table") }) test_that("aov_car: character variables and factorize = FALSE", { data(obk.long) obk2 <- obk.long obk2$treatment <- as.character(obk2$treatment) a1 <- aov_car(value ~ treatment * gender + Error(id), data = obk.long, fun_aggregate = mean) a2 <- aov_car(value ~ treatment * gender + Error(id), data = obk2, fun_aggregate = mean) a3 <- aov_car(value ~ treatment * gender + Error(id), data = obk2, fun_aggregate = mean, factorize = FALSE) expect_equal(a1$anova_table, a2$anova_table) expect_equal(a1$anova_table, a3$anova_table) }) afex/tests/testthat/test-aov_car-basic.R0000644000176200001440000002047113664111747020006 0ustar liggesusers context("ANOVAs: replicating published results") test_that("purely within ANOVA, return='univ': Maxell & Delaney (2004), Table 12.5 and 12.6, p. 578", { ### replicate results from Table 12.6 data(md_12.1) # valus from table: f <- c(40.72, 33.77, 45.31) ss_num <- c(289920, 285660, 105120) ss_error <- c(64080, 76140, 20880) num_df <- c(2, 1, 2) den_df <- c(18, 9, 18) md_ez_r <- aov_ez("id", "rt", md_12.1, within = c("angle", "noise")) md_car_r <- aov_car(rt ~ 1 + Error(id/angle*noise), md_12.1) md_aov_4_r <- aov_4(rt ~ 1 + (angle*noise|id), md_12.1) expect_that(md_ez_r, is_equivalent_to(md_car_r)) expect_that(md_ez_r, is_equivalent_to(md_aov_4_r)) expect_that(round(md_ez_r$anova_table[,"F"], 2), is_equivalent_to(f)) tmp_univ <- suppressWarnings(summary(md_ez_r$Anova)$univariate.tests) if ("Sum Sq" %in% colnames(tmp_univ)) { # to allow both car 3.0 and earlier versions ss_test <- tmp_univ[,"Sum Sq"][-1] } else { ss_test <- tmp_univ[,"SS"][-1] } expect_that(ss_test, is_equivalent_to(ss_num)) expect_that(tmp_univ[,"Error SS"][-1], is_equivalent_to(ss_error)) expect_that(anova(md_ez_r, correction = "none")[,"num Df"], is_equivalent_to(num_df)) expect_that(anova(md_ez_r, correction = "none")[,"den Df"], is_equivalent_to(den_df)) }) test_that("Analysis of Singmann & Klauer (2011, Exp. 1)", { data(sk2011.1, package = "afex") out1 <- aov_ez("id", "response", sk2011.1[ sk2011.1$what == "affirmation",], within = c("inference", "type"), between = "instruction", anova_table=(es = "pes"), fun_aggregate = mean, return = "afex_aov") df_num <- rep(1, 7) df_den <- rep(38, 7) MSE <- c(1072.42, 1007.21, 1007.21, 187.9, 187.9, 498.48, 498.48) F <- c(0.13, 13.01, 12.44, 0.06, 3.09, 29.62, 10.73) pes <- c(0, 0.26, 0.25, 0, 0.08, 0.44, 0.22) p <- c(0.72, 0.0009, 0.001, 0.81, 0.09, 0.001, 0.002) expect_that(out1$anova_table[["num Df"]], is_equivalent_to(df_num)) expect_that(out1$anova_table[["den Df"]], is_equivalent_to(df_den)) expect_that(out1$anova_table[["MSE"]], equals(MSE, tolerance = 0.001)) expect_that(out1$anova_table[["F"]], equals(F, tolerance = 0.001)) expect_that(out1$anova_table[["pes"]], equals(pes, tolerance = 0.02)) expect_that(out1$anova_table[["Pr(>F)"]], equals(p, tolerance = 0.01)) }) test_that("Data from O'Brien & Kaiser replicates their paper (p. 328, Table 8, column 'average'", { data(obk.long, package = "afex") out1 <- aov_car(value ~ treatment * gender + Error(id/(phase*hour)), data = obk.long, observed = "gender", return = "afex_aov", anova_table = list(correction = "none")) expect_that(unname(unlist(out1[["anova_table"]]["treatment", c("num Df", "den Df", "F")])), equals(c(2, 10, 3.94), tolerance = 0.001)) expect_that(unname(unlist(out1[["anova_table"]]["gender", c("num Df", "den Df", "F")])), equals(c(1, 10, 3.66), tolerance = 0.001)) expect_that(round(unname(unlist(out1[["anova_table"]]["treatment:gender", c("num Df", "den Df", "F")])), 2), equals(c(2, 10, 2.86), tolerance = 0.001)) ## check against own results: anova_tab <- structure(list(`num Df` = c(2, 1, 2, 2, 4, 2, 4, 4, 8, 4, 8, 8, 16, 8, 16), `den Df` = c(10, 10, 10, 20, 20, 20, 20, 40, 40, 40, 40, 80, 80, 80, 80), MSE = c(22.8055555555555, 22.8055555555555, 22.8055555555555, 4.01388888888889, 4.01388888888889, 4.01388888888889, 4.01388888888889, 1.5625, 1.5625, 1.5625, 1.5625, 1.20208333333333, 1.20208333333333, 1.20208333333333, 1.20208333333333), F = c(3.940494501098, 3.65912050065102, 2.85547267441343, 16.1329196993199, 4.85098375975551, 0.282782484190432, 0.636602429722426, 16.6856704980843, 0.0933333333333336, 0.450268199233716, 0.620437956204379, 1.17990398215104, 0.345292160558641, 0.931293452060798, 0.735935938468544), ges = c(0.198248507309966, 0.114806410630587, 0.179183259116394, 0.151232705544895, 0.0967823866181358, 0.00312317714869712, 0.0140618480455475, 0.12547183572154, 0.00160250371109459, 0.0038716854273722, 0.010669821220833, 0.0153706689696344, 0.00905399063368842, 0.012321395080303, 0.0194734697889242), `Pr(>F)` = c(0.0547069269265198, 0.0848002538616402, 0.104469234023772, 6.73163655770545e-05, 0.00672273209545241, 0.756647338927411, 0.642369488905348, 4.02664339633774e-08, 0.999244623719389, 0.771559070589063, 0.755484449904079, 0.32158661418337, 0.990124565656718, 0.495611922963992, 0.749561639456282)), .Names = c("num Df", "den Df", "MSE", "F", "ges", "Pr(>F)"), heading = c("Anova Table (Type 3 tests)\n", "Response: value"), row.names = c("treatment", "gender", "treatment:gender", "phase", "treatment:phase", "gender:phase", "treatment:gender:phase", "hour", "treatment:hour", "gender:hour", "treatment:gender:hour", "phase:hour", "treatment:phase:hour", "gender:phase:hour", "treatment:gender:phase:hour" ), class = c("data.frame")) expect_equal(out1[["anova_table"]], anova_tab, check.attributes = FALSE) }) test_that("Data from O'Brien & Kaiser adjusted for familywise error rate (p. 328, Table 8, column 'average'", { data(obk.long, package = "afex") out1 <- aov_car(value ~ treatment * gender + Error(id/(phase*hour)), data = obk.long, observed = "gender", return = "afex_aov", anova_table = list(correction = "none", p_adjust_method = "bonferroni")) expect_that(unname(unlist(out1[["anova_table"]]["treatment", c("num Df", "den Df", "F")])), equals(c(2, 10, 3.94), tolerance = 0.001)) expect_that(unname(unlist(out1[["anova_table"]]["gender", c("num Df", "den Df", "F")])), equals(c(1, 10, 3.66), tolerance = 0.001)) expect_that(round(unname(unlist(out1[["anova_table"]]["treatment:gender", c("num Df", "den Df", "F")])), 2), equals(c(2, 10, 2.86), tolerance = 0.001)) ## check against own results: anova_tab <- structure(list(`num Df` = c(2, 1, 2, 2, 4, 2, 4, 4, 8, 4, 8, 8, 16, 8, 16), `den Df` = c(10, 10, 10, 20, 20, 20, 20, 40, 40, 40, 40, 80, 80, 80, 80), MSE = c(22.8055555555555, 22.8055555555555, 22.8055555555555, 4.01388888888889, 4.01388888888889, 4.01388888888889, 4.01388888888889, 1.5625, 1.5625, 1.5625, 1.5625, 1.20208333333333, 1.20208333333333, 1.20208333333333, 1.20208333333333), F = c(3.940494501098, 3.65912050065102, 2.85547267441343, 16.1329196993199, 4.85098375975551, 0.282782484190432, 0.636602429722426, 16.6856704980843, 0.0933333333333336, 0.450268199233716, 0.620437956204379, 1.17990398215104, 0.345292160558641, 0.931293452060798, 0.735935938468544), ges = c(0.198248507309966, 0.114806410630587, 0.179183259116394, 0.151232705544895, 0.0967823866181358, 0.00312317714869712, 0.0140618480455475, 0.12547183572154, 0.00160250371109459, 0.0038716854273722, 0.010669821220833, 0.0153706689696344, 0.00905399063368842, 0.012321395080303, 0.0194734697889242), `Pr(>F)` = c(0.0547069269265198, 0.0848002538616402, 0.104469234023772, 6.73163655770545e-05, 0.00672273209545241, 0.756647338927411, 0.642369488905348, 4.02664339633774e-08, 0.999244623719389, 0.771559070589063, 0.755484449904079, 0.32158661418337, 0.990124565656718, 0.495611922963992, 0.749561639456282)), .Names = c("num Df", "den Df", "MSE", "F", "ges", "Pr(>F)"), heading = c("Anova Table (Type 3 tests)\n", "Response: value"), row.names = c("treatment", "gender", "treatment:gender", "phase", "treatment:phase", "gender:phase", "treatment:gender:phase", "hour", "treatment:hour", "gender:hour", "treatment:gender:hour", "phase:hour", "treatment:phase:hour", "gender:phase:hour", "treatment:gender:phase:hour" ), class = c("data.frame")) anova_tab$`Pr(>F)` <- p.adjust(anova_tab$`Pr(>F)`, method = "bonferroni") expect_equal(out1[["anova_table"]], anova_tab, check.attributes = FALSE) }) test_that("afex_aov printing", { data(sk2011.1, package = "afex") out_new <- aov_ez("id", "response", sk2011.1[ sk2011.1$what == "affirmation",], within = c("inference", "type"), between = "instruction", anova_table=(es = "pes"), fun_aggregate = mean, return = "afex_aov") expect_output(print(out_new), "Signif. codes") expect_output(print(anova(out_new)), "Signif. codes") expect_output(print(nice(out_new)), "Anova") load("afex_aov_16_1.rda") expect_output(print(out1), "Anova") expect_output(print(anova(out1)), "Signif. codes") expect_output(print(nice(out1)), "Anova") }) afex/tests/testthat/lmm_old_object.rda0000644000176200001440000066111213664111747017661 0ustar liggesusers]EټKZ$ :( llBeL$bY&iMg> xg3+Y13S̙BwW KUWWտUիוzތb A PPE% пZ WT(O$M$TV\R/SoA#J\r{J~K;iϾni;}Aa^)rw}&%0_u?|x*zۧ$[7i;sS|Cm7PW<WKYs@:@uF8iQ=J۫IT%?QE^jJCX |e qxȳ"Oc >, wE+IvI . */@1mT=YXi_,ΐxCR8(Z(=M?iyBEDLw4lb@z" E)]Э.Gl.x$FH渄*gi|i,Cs#R5G(tZlf* YscD4]jԿtɹJ UQNN'[[:;[**oJd8_(d$E#K-ۤDk4W PYV-JF,53|KB8TjjLVM{n*%:)ScgVj3#ֶ$ DeuI c8Y6OVOK1.`RcHU0J4TUUP /7xD)&E[M՝KAw w5W=䆲8!$5W& p?s'#>8"D xA_i h;'@a⁡*eq;B᰻I ɠpx< (Wh.qݑ(Dÿ=Nj^n{{xYU*j r@APL $@`$pG$ @Hv' WrZ0ȝ;)FqみiBXH/&UU%gZRWqK_Hd&!ר֣Ӷ%&GTJR e"ZK)9.2|ˣMǃ-,$]G B⳥\*{!"6C3EEZ3:u 3ePK*Id,WU@9$1 FR@,쯍_v eyL{rBިfmV>T}н)99LVXn 3  AZ)5:V]i*@]m$De%iQ8I-RDP煚 -QÐ^"-V.ː.ƾȍ3 _£tMKEhR)K]] IS˩^gΠRbn((-KUB^ Q.@?"ɍF@F jT=1gUK U JpXb& "c &ZA"gTr|4V Xo\g-_S4E}&Jtp(fifr9j](3j`' h7ۥ@9$-)=.Tn-rE%9[J\U1FL}EFdaF[X$yYflng3A~wLj EB[.#M&dH kq2c2F/8`|rsS} ت,C[9kp|jb ׶VޔUF#qIcLt'Ion?x݁h;>`0o*Fyz3իuc:L0)֛ZگcC5l3= '6OK%m}GZx,])UZ8FSelYIcA: rk^(y"@P4GӨ8J~G ņt,˭-kñM?7344zeoZ+vQu,֒=U7,z}Q(/J.' 3RJזHۣ1+$F'KY(<{_y p2 j )Q$/T w(qAi bP>ų\MjG&@~m,5 ax( 8Lm7'K l' h8'~eRFB+og~r#DgW;[+Zyg+-OKw"HrYy*H F**p'F+.RX=9 @3}#TH%Qj!E@2EiA#7ʱX m(]TwY -?"3aVc@-קAݗNc!߳- H&jT1z %&8;0=,% O( XAϥOq$hM?)9,;E_lzܪu S- q 6H`nwx+xv3Adc#]8IMķl=Q **vuBۇImat`/P3eCPiqiAB\zvZ/UwϤNfl:d+?80SӴp:jߠX%1UA KLDs. McNI3Yʤ&U& ӗ}YVʆ%3d,-'s}[{ uXSڭT^AbrbɌfX2J:@.mj|pYlSd`:ÜhHwLVKpm]e4)zM ?m;1ݍPn.>cu轼B_ұjwZ Yh}%-;;DtV:q!|o С+Р[&ujyVQcw% ukp\ۆF5#`Z]Ɣ98ꖟ=.Ԍ_@T/WC^,^MO"V6Ǐr$%ƏF 5 1X^1PƙT^EcV?TF% pĽ"t䷣!Ptu5t0lP@5ע:Buu\ TZNGh{G#KI'RaVÉQ EP-:)cB!_ ͺхhRXvF \ zs` V#Km*ؠ݀~jkgT?1r+vu, 4[Cz~ylF(V~/-. fDϏ'0{ NM(OÉny ;b6ǢmrC]@M ƘZ14uj j/=>&HGzs:@f6OM:KӅ4ҋ]vNi}mS˩\75d$HX"i!h_@jLFv/TRYƥl -&W9;zɠmt2\T&q8Q50WvS9r5sG+딒7VZ5ƥtVt5WaR+c!`5~#OY{wf/EԗM,3+%j~'"t`k!L+l\|iү9Pg6%Z)u0-֔U3i!0Jz}B1fQx@;~'N_MgL:\>$l Q0,=Cuw0̣igƨ-/ %b+kTvtb1MKH3>FDpѧq踃A(_cXvCq1]Qm!ne5L:)yɧ|b|g 7mNUSa\j7V#=q3e=/S4ۨlU*8(ng)3E}0ZfhĸzbDv3-3m͏zc!!gxuY*Wʱ!ԗ4:He8_宲3y$]ĥX­dK Q혪| ,̖M/{("(0[ 1puͰZΠLRN^UQ/ APRf/)yi=RNY0oqM+THPWLGcAP"#?ʆ|:U 3&"u`L vEEL{/WށWu;{ōcVSI %N>ݥ4"R@n;D# (KœMȾSխFv}>wAÃ'whNM)UJMy>`U6czsO(%m\dpC @*{wv3U#4,NxQt≨`ă/heY1DMY̠Sa]ǝv.I344p\B0!xU}Zq͗R$wAޭkwVmn󊲚l}okv/Îqb.0ږݴ2hZC۪  GKY2uT'XTRd!Ggi`RGFJХk<CMWGu&%{ z'_UX)Aoꚜ.'(\WĦjqo++B&Մe@@ŜT{F & UUuj(Q#Z x IbԜte8?@.cNU/6])3g)˦d(Ee?]$ MxAɉ0Ws#h'Q G׊Wk>S&Ve8R2 BUF )^9Py͸bINJR氞t~M¯,EڛTQnh͐5ZNt@j~ ay5c 1&WS~DίQԔ%&Ϩ5NYp?04莍I&'4Zk 4DRb6Yގ> ~Xׅz8՘0L{ %VU~<E'!M3$iǓM| be}gV{%qt Bu}ֈSnjw4,nrd]X OWv{b:h1 ՛@=UEDO Vpۆ;)9:٦AU@RgR#k,6:ְ 44#AŁ@]ҥ\]eևDjWvVxRB- (eEc r"-FL=3J05wPc74viUo;L%Q~ј6E-"uѝ^`.oQ)1p^Ќ۝ rP@"_P~P: %N ѽsA7#b[hӛ=)Uٶ p( Z;h˚░  `^FޠD,ԔLv٤cĞ.Q|pnz`:}Wͪve5tJh K|z.§M,|C4RNhЉ۩ViKF[I,k+c_ +n׏3Zb(KKەEFoh @QT> J7Y\KP7_nsaW,rT,JSp̺ ~BޏbQ0Ne`E*d  #it\7骪vY+=[=4axEZ%xCsndǕN!hF%N̆dbxOâwZ/gT6.0F!;@WΥztz.` W2Ƹ %k{be|V%4:͞532V)p͈9P/&K}@g- Wc5~fc?=yHU;\GAӨ tKE KP|n_܊ QhPuIYGkKo;ڹUNOigM*z5Dtc[5qji4Pr&ĸQ[S%MOqDB9I!ȹ8q=h(NĢIPw,]U,jAJuU@1ٝ ռN}B_ ěeWZi&!TPiNzQ?CQ<ٖa;UWn#-%UF:.0b)z3O1&*vpܤ"0cX͉P$tРmE[հ! LJ >lemӱF,~P];4 +$%d:}FLtMzJ5B/:U4}+daU]OKRNXf? -Gb%LŚ :c#Pe|~9Z|7D?^Fme=Iva }Iчr80%/M #?Ғ@BA\ڽ^=UY $1Jj EzR0uD43 ɥ5ƈ1]'t#Ű>yu*$%i`I D[v)-VbgokW*kR;e:=NRnPg~/sq( %|S&%Lz"s sG{._`<4" g:naKJd/{%+DzBꗙ+o_Q"7t$_ns]BeNz@50#}EhJr4M~+5\pEվ]u)[B}[!{uqaQs4E}ٺ񣹭Uokty=]KHQVҩ$5J%#I3iڥA=i^S{u #NϽ#ytYw0ݼn޼n! y7+yֳK+o;$V씻* Jk:?+>o.ˮw1AK y-J"S%/e6W\xku5cź|l)Ӑ@HDм?`MhximiR_HU9Twv9tPHnm6rl/!Ub'RO9gmI)5޽$V O]F+ܡf89DsR -=n9rÏ荍p|곜zO7-jV_8A{ȘUU%7KN7;@T3>]M>ഖO*WF 2?:j ƪ,Ts,~ KT>4ԭL\M gb"|/N8òv3A$V(LzQGq|eƪ@ʼn(>9$50lkV̐ɼ e+y}@j{YVUF`ұU֚yd"ʝW*}\0 m6w?ii^_-Lv C;rq6w[_; tAn3Oc@]MEWoRrC%+*Я8"ivd^z@h`FX(ָZ\lr•J(R2R(ۗAT ݙP9jx`fBJܧ$,p6j/UJuL嗪/mLG+[je /}l=$DZmUd8疁>l%_C寍@瑛 [z ؽk z-GfYzn?iLMWL 9QҦ,cy3j2>4'/*aK\2R(gIQ*uϫBY JJgXT1`gרaX$ [F y>A4bZl&@-oV5Eop/ƁtHP &PZ/$0_12|,˜x}rcjHP(~7leNz@kaFzU;zK!bqlwiI[Kl{ŧ)QߍSifϥ>sDi҇MjA D8Y8{<{S):v@y9:^pſm,dŌd{8'[4I0B!SPdKhJFm:YֈJAKfIL}p1i[.zb5{}i EјR&TJ1cQz' B`[MXu6IGLת&iIBqB4.;fsI7BEOxn CJ=.dKAQ ]1`҃3 dɵGw/KKR[`t}źej?|*])MqAnL8*N`k0oǒs lLbfu^ d!Me d-{FIW>)%JI\ǫ" !5)oMJ{=n:&9]:blK׌rtL7f 'WmnK ".-X$٦`<C@Z9/6,d;(@HU> KgjT$M" íM$x8R$K`G?&_I϶т-/=ǚmyug^mK_}n~7|PUeϖo+M^nˇ-ku3|VJ9lSg-|]7Ζ~tn'=Җ9{[>jǵ]m ɹ?ϰpG }_?テ-Y#l_:myxҖ-j/ǖo/my^.-쇖bˇ|g[>5ߟt4[ӹj͖t-wtv|=7~nˇ mG>gԹ]?ﳟ~:ݖ]6cˇ:|c<$e^ss';^1_/;}0lcl"ǣl"gl"8XMDN#si8U K$˩T+-IA-UL{EWۨMmW If=^gvW*ХY{%T+Z*rwsWlts9sƢqem$C~.PĿ҆ÐYx?B돟C]q}z#uו:xzAWO}˭7K,=}:z M:Miy#<=>z\t_PYy :?BE_.v匸›StonoGyí߷kN)?R^oVkpN뽠 3 Յs*?\C}3kzcx(].=;'{Fs1vt0ʠ4 1Ts8`:+#G0P8'cI˟RCqlR /0T>Jv:c(2x7jazJ\Zy9xs.J&M%bv!]a;pi<ƺǖc]LX|32:ͱFM¦br;:Z(,Zr5ta{.]q*ȐdÄ awLA~dqTG0a F}0?r&yQ<%_`<=w8hVCVC5l+EQcu Ҷ e%-ŋB_}w*S_ wy^ ԯѫ.:cbci,~;Ƕ2F_|7C'3z|}~uzW:383u>~+ݸ ?ow.ְڥC{e:S*ĽN9|H}R}]\cйrǗOpq͑!Wt+v‘Dzp곷ސ=rO}͟/zԋ\x..~26pҷ.} g͏G[Cj.t6_pkpW?2Ԧ˃_* 7f7&w!}.nW;ܹ]^$zֽkt?ӮrԆOhǷ?FSM/Gw9ޯ;ܩۂGx Mm{~yk7~x۹|%Kwj:.txK9opLTL5@^N>5Vnr͆ԏ}rOrs9'D݂~J8gWbaPï0T_2.^WYk-s2׬Z߉pҒR_4ЏnCk~V|L9K|;e)WM+OUjp}Un]pIv}\pwd*3;Oy??qS;+xEN_;q]ȿ5z>?n=xmo+_΁Ꮳ,0>;W.tU~>{<"/Ľ*rSE{FO{Np S/Z{/3!}s^T|\=wo<ͦ ޯ9jٯ|B]eλ~[|2wuLZ}w`.{ӑW3B=%|w?Cӕfz|<O˥q'>}YMߨJtB72R_ ڑjMkjWnPs=]xۏ8qU7+-S٥w3FQLcb5Z{'0'0&M]𷘺pi/)Hl,.9s9b$ 2?ko奝4,vR)qoaQ+*Jq_d<N3^a7`8%F #/Z(~|U _0|UWl3ZMZZŌgeCbTf: FKX]CA7ʠ+hKaYs0ܰ*28LjnJ6$8 .=-mwHD,|hK$PA5O9s9!.`iTܑIpKé N<18itjl5 uLvމv^žP`vǓmKINZxU^e]ypپ0m@K~-P cjBl6)*EVXBrts4֖ uIڟ>\]^p U tخ=' jV}1A?I0"R ,x26Poi79#~`͗[a6|l8Mf}Bhm!ɞ 1*1H"UMNy񢗙B2#ы4HD{2aeUXqy U n; hd=O12ʣzl4pQTdAYPYTUdAYЀ,h`4( ̜SF9jÃQрhz2vUc]5Zs`Q"4йNJơZ-5ª%MH6`f"eXݩaCv 1R% ^,MEܚ !Px]Uo e qdA6bADpSsM>r p0cb*P0Di/ ̀<4CwNF$} -J4w02,[f8![/3f[%y}W]~^ S%=;ʻ~v SθI}8jˣa_[zc{|=VJqoR|uI3ߓz֛*>x૿:~ s;|?93so/-| P>Էi {?sd|nQyPZY;C7r牾+w>[[㩧[q-;?uz?|-?]#}ۈs_7掝ue[dq-Fʊ%՝ǗbQ95HC-m~|\T7nV_Cnڤ W UG<9"ȁ #mZIqi>6>cbXtY{6t*2 ]'CP!֏E:jT|&#Á;T2W t9f &]w .tuQsH.D mF8B^uݟrIG`9 ޯf[a$.Ck/'8Ijn;P ^DnR'vŻՂE+)I󪽤K1z o jG%,OJ:H$)Ō,i'bq>gۚ+λx'}fE+dΫp! "}E >Z_ -1,"E=&jP 71]j{fQ#.%zUPd;D ] C)̐LSt-hJL5Q|P@- C$}C`#%7#q=5'p3@àdvz˃`Kt*yS*=.Id 覝.R 5K9s9H< WB+fFf"&VA}QoéM`$WrE*V b,RC\MQc:+%-U)Kg7 j!WE%ɖ( K~p#=sknW>N.o`)KHVe0r˷1H4I)-R'zf*F/IuS31v1lebW^S㛱?\;ه53iG97oY^;w|GSO͕-wS,8?z%;g/|G>{Ƿh!WLP' =cXu'5c^gj z2iyBEaw{T3Z'@=r) vMPO6)09ho?śjt8J<.``YyލR:$Wpfr1$X_@YD~|8bF|V8]߮fkA*>bBC4v&4LPβ< (aG@;-3]4Ю0X@8@Mh 8LɀjZ@u5j4ހ/ 84 t  @+v86\@h> 8=|9@G: рpܱW5fk2 !s#[@TNF\ RWB\5ЉI':|tL@g菀t]B@П]π.@+ +] *@WZ@O@п]@7 ̀nt+@w ݀t/t?=!@JG=q@k=I@k=i@zsu^K^ Wu@7m@z@z>eF@ 瀾?@_J{Si;C鼒l{y%ȑ/!W=v5`11D!b cC"11j0F ƨ5c`Q1j0F ` ` ` ` ` ƨcbZQ1j1F-ƨca:Q10FƨucazQ11F=ƨcczQ10Fh c4`р10Fhc4bFш11F#hzd&N8kCYG@UjVMЪ Z5A&hU4M$h"A HD&4VCjZ A!h54A4A4A4A4AZVKj Z-A%hZVKZA#hu:VGZA'hzVO Z=A'h5@ZAk h 5FH Z#Ak$h5FFtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHtHttUs9sC\Y%s3q:\,z:7 ?Zqz;|. 8qd ܕ̛"tN)1% ' hLzX3$,~N(Wt%O25.4-clqާ(F+_ R% %'Z=gOO?>e$"!XV;)H<~wDp'鳄qL366zJe(SDƽP>d}*]HlYNq9CСqW6G7(B;cԝP]sUH?Tኔ3ՍY0ڞo:>?9>JN)ky]>e+#<6Fm:r|ȩCو,\*-0ȹs@+ cUk ]U}RkZ|PQoЇȲyR3d+ѕ*]u:Rj0]踧-VbyA&A3n?^VDN%U HQgA梸:.3ɔivU_F&kgagL}&G AQW\PzoAf?{!M*ςކQA[oi01L:7|s9@qoP|sg/@6ps9o|N|ɧk>]&gA|O>]çktM3I$$>g'IR|&Iq$g疞Is9sIҋfP $d^NတM/S0֨{`{-^MBʭߵjp&ƻY~8ssU~rOy6k.uֱR(4I FbOdZ*i?It2Ǚq&7ɁX,;e7 ƥ2t}M."_<m5GԆV*'[ 6:GvaH<K0KҤdZ"V9Sa{) X̿A To麢{PRRa"g3&8i5":}6>N*VΊϮiso|6\O y,I,>yB/eߗ2KSdG?f6꒑^ڤMߵJf3{ѷ+gXo'rN)KK Km4ghO%y0|8ANn0fGغ~V]0&7w`,02/X `R-Ԫ!;4ty~U9HZXWG7J7`[[wL}9 ~٧M+ /ް ۡ@ysQEHk ?uVmV !E ʉoE;q5n5HP 7Q$ MNHߨqׯ eB毩)_^\2],xW2b),,](X5m2 0i3;ͫDHzT8NPoM\zdzSzG^,뵥\"JA0u.Y,-6)}K<IN*Gx=XFzգ឵rmGJ1EbBӬioCR5FM՞5k?mq,r[Y "ՄuZLy^~!'=CVR@Xm-CsRjUaݦOZv [)Xڔ\T앋'Lӹ7R*|N$|ު*w}O/H+Їx$巌J n5OW#/#5|* V96>E=6i[\&5ԭ%ZU:#RQ4 $'t O'3NHu< ص9Vgq FNN5 ON0F^Ԟt$XJoEp˥ 'Fڀ$ee O( A *WbMq$M4@'b+k2{Cɦ$R1!F :P $ J6dYPh}T.IJ=Fd7Hq$;*[TcyN ?OGc_V<̟?O>j&:z1e!o\Z:R\^OHxEZJeU#Rt2A!RVA:t Hj0t)$WJxfC(vl<-Ҕ5zE]]AeKYP! |\K % P|6) .W \T% L3d2Zx{T^ qfN3 f3)V[qr-0Pj^Xbc1 0BOjE|i,,K~8"-Vڒ{n=ȵсc`XtHG%)u g<+R`gnw`n)  Ů*a] ]P $]MatWss?â97.Eӎsyo{wK4;JՠNPq/kPyh{C80;gxoz:M4T6K˹nt_[)hamtC/ m0Bm"smjAGЦ QiA4/kp~a(:p%1SL1 v1r/f6QN//)MR]r3jJdM+y}S^~eۊWi2 N1w2#WD+ V2h eH²] AI^!+15^}8`ݑ(Dÿ=Nj^n{{$lUnne7ʋ%"T֩*+ȔulX #)FWqみ$/h'ܱ$^MK,~hNtlN? !šCuC϶ `LGkBG LVt̵.jʡ%V2*d/7 Z7cEoNvm..0tK@l+lQ5nK\'ąlsH7ؕoWX=ZK `,X d~e:4I55=CU ڽPy"YjZ&EP;_&ƒk V5e*mr=%ʫӈ N"uS|2dk!;Tv]lѸKJ--"QKn0.5 a(PL9E`!kv* = غcԴ-:K>+&*:)>& z %`Rȝ"}ē )y w& _3!w2lz.<{UYEc"RǘoVB:=dQN&ya+`o0k=^3>ww#F[qSrfVl:nbw&TUT] ]ꭖNJ>U&Mˇ5PFBoԒUá>xu=F/3,ڮxHUVԾ 9Ӝ  %Ugj^1j6=aț{n+$f}T϶Zg@lʍ}Tf5SQWsh0L)< vTA ZìN!-3f&b茬Gu W~f1h\|/OHxɼBJѕQT(f}NZHOfD!h^(m}`ttI/qz\w?T#b^5O@<8e1j|rSu7Ӳ&->`Xg0pץWj߶d(e@@s?G=s[ [6yO չ bVY}&d({vep/0t]*Pc]S . |Im!$ tlLm5fK^8\+bMʨ+pDAM(kGWs9s9n}9gįη,i9wur\qe\9q\q9.7};q;gC$(5~H0i9@=Ow۟ d tizA䞢IS1ɗw\(8}J6/!cRP)Gp9s91}9gįη,i9wur\qe\9q\q9.7};q;g]dd@GS'S{<6wywh$',n@t_ z˙` T[e~Izc c r}b1(xZSemRlnL 0pQMh ҏ'BZ=KOmZԯuߥT!M1B2aDWĻiIuG$6Ob,'5Oq%ݤ9k* E#rDY@ ᕐZs>VrRUʲn{B*^ߧv"нiXfS"} TJ0jNkԜ>@wwnQh;*'x(UPAR YhY67NW AG0cOU҂@ r|MT$yq66ŭQ~E@g(&C.!I U"nR-ֺe}GԞ7JvŻ붼hY]wT[^}~-X8I_AW~cmO{Ӊ>p-q^-u\i]Xt-ێU|o|o)Y|-|o僻U][Ӳo^l󎻠kMd_9ۖiѬ[m?<^tNF[>ժ}7ϖ8?Ə'mˇ_a-6-W}?[ʮC^Yw5m>[>sNz[>7>|矄-Ʌ4Q[q-Wі+rʎi݄}Zid. `8ac9jcʠ* &-RzqlsZ/&e䂛!5]]ҥY{ T+Z*rwsWlt:G9s9 m}j 4؋2]& קˇ!]?>F+u(1&f=>&?ʗ[oYzt.uz9Fxz|}>辠rt닾\q7fC6\ߎ :ϡ[wo>S.߬>+uf{A3f T~&f>yPN]zvU OZ2 EB?Z)݃졆vt0ʠ4 1TS9l0 QcR"݉Vɍ|ۣp el;&H)O"-P;"x[!0G]tt}U~* ;1>J ލ+ĥdls9xWR5i,ƪ0>_Bv2pi<ƺǖc]LX| Di5@H uj[xXլ0g[)54V͡UFx0=O.Yd w[2p7Ix51:Y`]hJMc YD矑,;6"{f=3Ԩ0!g3L`//L}0f'_aʫ?՗iZuەS|g_9=b'_󵟥6(z=꧗c޿:_s8G'3C?_!G>;郆7WL<~3N:gv_mr7#|vھWo3|2﷗T~ը5Gƥqr#{sOoHԥ+]z ?mN86?_n~3oNEשZ̽2Hi]9.ofAO?O9Omn35r1pi؟?rA/~nROۼ_YS/8u]O毫=u?tbSǴSw{Q:?k_G}{ĽK!Rrڄ{n8_=\tRϫɾO(˱3;3eG,g|wŧT+;?6Y tﯿr!]`EY~z*娕 _︾i3$J>7NqȢ9L`P쟠_٫{1cqfՐZO;{n_wk;]w/z}6XrĽ{ :EJ4sK37jVעԆo<| })Ӊ/|Ӂ3unxʕtCc;WTF/v*~wɣ/+ !CWqIW|^c_]7SMާCꗕi],OZ^{'0o1uBӚ_RX]s9s-rH`e$$͉yi' ˥T $|x-, uEEIs5|d;* } &)lBN*KJ8_W8/_"U-̪wVcw1Y*1Ðzi>%0eF>Iw KkH1F[t9vkG~\100 7,ƽ p A',ŜFzm‡DҩXTy9s96YN"{4>S4yc6qv(پk,ꈙ f=0(l})@^`vǓmh;4'2V*^G}fWޠ:~" `UaA R.X(%W+h-+Aկ ?}|,-Gٝ\U]3S$K=F(&R.hD |w 74 }syqo%ם4gn74lc+SONC8oP`_u?|x*zۧ$[7i;sS|Cm7P)$|y?8ongkM@M=lF vP@^N2+'8A"H]`r5%!gWNI昿M6Ks4%#\M,q2칮Q?/(mu]`0/@˹MVpOe^SrLl\t_P9?~*ʤI T͏MydOrw W@4UœmJ/ ޝK0zol4hLmz;Xyb#V[qy\Gf; hh=Gc?1)-Sq6 ( *΂J,, *ς*~YP,h@40 UfN)Jd`T#5AZCzh@F̫z2vUc]5Zs4Eh@(iHs]7)Cx`֘,5 x ?+?qnU5oCTlZ>̍BIH0.m>]n#r'XV+{Ƞ ܉fDZ]B)԰w&r:y9 b?sKgkPo Q472 nq- gQ%둑JRi HVCk7( M.UGa_΁!;Ngg0O|ԇl='̑{?RSrG)~S 0 WGYtk˝'Vln]zo59lԻvkm#:}aWwܘ;v֕N^P*Xq88o1PVd</ԍ` h uPK)/UjM*@:{֐Zl ^)!k)K'IƥI Yo?@bYx|},A\ţ3pz9|P+&ПʋίN>Qߊru|cNeOa`!sе3TxJJ#OS\gɗjjI_v@a,UMppSAU>m^[&p*d/.\L1(dR#Y&OYI%M :eN.ˤ, FW({K/H(C+hѭj-ݷ7D}lǤYr͐*QC)QcR"݉V--&RvGCZI-RD:CqlBLS0VS@T>Jo:p8)jJEA){lL1)HGQQjOJ`Y:;[:u(Ht(iN\:_R6ZJIGA$ضCkA;>ABiV h;Ay_Bh8/="h'@ h@n@+ 14x@ h"Ih2j@"@Qjh h_@SyM退%@:t( 8_gh.4@ -t8 hqh #h@:q`O 8i_PPNthBP;U)@} P hCl%d@:P' @g:  @t.@ŀ@t) _]o]J@W*@uz@7Mnt [v@w]t{h5=A@zP PG= 1@Z @OZ )@Ozг<"^2W 5@/7 -@ozл6z>!},(_(((cKK@_ h >jP?y-ŷ -2 (Ne@q-oNe9{h~MSvV9s9i5oX2ߖX09?@^~˹ISH7)qQh9AT|=aTC>{g!=䳇=ⳇ|PೇC䳇*N>{8䳇s9s_|  xEYﺭ 6)e o:c({-^MBq88r3x,l5*.:@AY8Z9+8baeeϱ霬)3 g>g>zp=5Y&集K3 > ye~_ /YNO=e~qX8\{$Ezi6}t *m >,Z)@{7pkm!>ӴEM܆ҖI1)8ck~ٗU͡Rp,qw \@6nn b1K^ݗnVt5,-9j{w}]a'/-쮖 o;|iͷt?}tAO6_*PﵨYoY[*Ȃ ,8 *ɂJ,< ȂeAY,hP{=-(?ԾP}GT>H^(0J@m'(dC ==vF.܀FhW@ hw@{h< 4$@U4P5 5}h#O}_/}%}2lӃוzz`l>U'V|[ql !_ڄ8s9Ǖf4#Lw[ϒg\MJ]z+tMfxp<1*M6̘>Z_&_fR8d$ۤX(`Aٟ ' EHH FҝMk=Tu&ҮOtށ5[Z5i"-, í"*J_rJisJT Mw\np*,.%ےNT E 8#R{?9}8Y,Xͮ qIuθa74x>GM{yԴu5_;c+Ro \U_x*my6_Rolɗ&/K#_Hbq#tMR|ilf^5 GkFǗ& kiI¶{qOpSjE"2$?aUKgۚIyYeph* U>( ERy'XV@ԃ}*lߴ0 nr KUC}pXf\P sޒŪ-\K9mhqG"Z*K9h)ך4HոY&-w"p"Ix\ r'.&AChyu>4&~QC܅Iۦ1̌Mx^( pTܧ6Z30l]Al6Y3h]M0jk?@kajN$|-}-#+-$ 0JA̐YJa`}tu$dA~=LWuD͗o#4z+ttZ]kENJOWsͲq}!I}6#Yl0t 2)P-ԋy8>DŜ׾m͗&O{gsO˚[4. CZ(0 # x]:%Ն- B4G <@i:^ l%RpQ {pa6z2i)'UVOi?gUʟW *_U^/|uĬe 8p½`UpQ>|rUrqJy|IZEimrz s9s;~¬uV Z dm0NhMVqդK^U$XJ_dϧ2_I+9ݖ+|j¯l{뤛oȖW7僾񲍇cG}orWsQe֤߱#htB{[G CƂ~;i˷aG˞OZQ|=f%:͞?[;_jˇ>[p⫶|O~9`+FMS腶|c:=^[>ewor/]^+[x[ _>#~킶|Ta we+^Z>{<[>Kl˅}-n絯#|3\E-Wl"78Xr}Zid. 'x-H:S6VąZEe-Rzq7oX0n|kQzt%Kf5Rj0]M]8s9|[Ƣqe k|Ln`_iaH,<ϡG>J?JoYt=Ɔ曆gvw^&_=./ܬGA/rFi@Yfз ׷#os]۵ 7zJݵY8^q |9 }1{^}Q26Z'BwR<PT. :]Ota3GiQ[~M5ov>}6>_¹o Ƽ7+4vuqoccK.huq&cM MtfiQ0ZU s&kRC~h*\atˆ;UAp% w s;e_o{7xjjZĽ/uِmĜ?^!ݚcP+VL:ǧ89TYϕWJcO{w 2 .,v;bSg%޻ۓOD_w-x?uKwtO]WoMoLaSۨwOVU ?s;~y뿗}/ߣ]ߖѢn恾 GoxɿvCogYhR_9JCOwvP;bt};e/0`c>:SoOjmޟm0|뾢sϻ_ȿ0|Ю'}ɯ"\U~O|!æ6JF_е"m { M| /ktX_~ò1}lo|ύ:ֻ>kHmet_Sw谵o=/>vNw{~ :y𮻲󧟫DnOkNX3`=btz k+6~tj. wWxi{z'~W{/o'9Ř?y𐏗tu./TɢO/;Zx= _௾14WO5gzɗO}=܀;I'qq?i^H|mrR<ۮx7O2o&{-W,ys|EG|2ԛg|ÂNSO0.Sli~[ {7j^+S8Ou5zѐ g~RVo\.?!rGBEc}._Sh*;ؿw[>:~n} ;wtޏan__nn{񛋻 x.o2ږ+|—VywդgEޟ߯m}W|rMvzڐ1]E7z- ~>岫 VJXskd#~+Zހ_M9R.O4A֪rkݴ]歛X- w*s}ETyNV;]_V1vpn~EU`[L]Pci$6zzys9o\1X~kE9m'moNK; ~kE=p[+T4Wj[yO2`݇݀`-a¾jU-|UU-_ղͬjp7ijQ>P~3B 3? PiC\SF8ogtxԻnG ےwkG~N>iaa1U#dp=a"4\>k \>\%N (ʠȋ's94tR?k 4ʠ#Nk3tQG1AanHoUK) ;lsGI?!R:LS+Kypپ0aׄ%<[ΣJN`\dد .#*>l_FGt3<nWG׆B3VVr;0q S~HAŠmC<wQQZUo)i%(wlԼ }_?P?j`BN%&mZ'U1OLCȨ7s߳7TTJ8Yg/!v/415 /h?E} ~_O}w(5өnY=ozUMw|:G>]INesάx`Y꽫Ϛl͕_cw^ׂbʹypqW_eSvJoZǡ@ȗmGߞG1N/=1%[1DBσHPb0_sEkoNwow~/wO GR j_ /TQC?L`@ {"0Av eQv 7рX@{h< 4$@U4P5 P ٨Z@u5j4ހ/|t@t`@:ͳ4ah:8Бt4c 8@~@'z4I%'jt<h) `U P' /&[ D@':)N 4@:Й@g: <@Ѕ.t1?П] /.W@?@WU 5蟀t ntV@@t^@Z ~@zC@z zГz Ӏ,=@h= @z @oz ۀ. >}#@FA[ 瀾?@_J@S`QFv'wo@.uou@qoP|t @ChMNr9s9ދ! &3k鳨UɴtIz L)! eIy̡҄r\WMDbIøB RgӤ,C>{g!=!=䳇=]|"'=T|PqCg'=s9[hPn/zm $dVNတM/mP|kC^Gk)jRnÙǙSf1fqPqeF=TS~Ц1RZJI3iĞ4Tb~&WS2wm"]_24 eVߍxk㹾uRrh.{WK&vs垧mJ|cQ_-LHLpɳ??~vTayY Yٕ; g.g.gHdUOiφ!Ϻe~_4I4\[eg Y,R}"vz,&C}-KSP%oT؟a/J1pڻ)m%]/)gÆ a Lz3/XIFKs$m i=GYJM"EyU ͢IS1͏ri.|u/"d뚪p_sgzP\Yԟ VδqC;M gۣϳeWVƷ WX4^{F]AAvz'Թ>N'&߹]5Rå˝Ubm)sf.h0\CNZVue-RbzfIef*V8%5Fd%TZҪx(w9Ø=п'%l3s9s9׷MsyoKz|[s-q\_;q;gyܹAT|EzB%RATeAYPITeAYPE/  ȂfA2'ضCkA;>ABiV h;A, h#4 ΀v4@ X@8@M'&ɀnGT P=@>44@tOt  @ hـ 0@B@Ph1#-t$ @:[&@{Nh (x@' jh) /( h@ЉNt2S*(c:t?:9\@:.t % R@tЕt5U@t- nt# )7 t' @j@zЃ0.@zcS g=y@/ZE@e@zk^_@oz[wm}C@'6g>W'6>=]I?7 | @6| [ul'ȆN>p Mhs9s9z\oF1tWye,ydݥkbMT*0 jgsdjΌLN%jua;(ʽAIHM&9pbP$h$imaٴ6pCU`2)Oǃ4\^#X3U*0¢0*TE*ĭ69 H ntAE6pPe/2 RbAk-XdIP$n;"uIIӇzoؗUw]ލ2_0Z[#=ՃNo7\t'sӕ6U/\J76sK@N/$1j {g&)4635IK~5wX$ZaINv ׽')IZvR󟰪3mMA¤ؼ_WebK@n JWNuP*n" EIR,ML  >oZIN79Vv>L,DWE3AAn.(9obY.]6\#G -A åhkMM tjdk~,Ԗ;TwTIea<UiNX4׼:RQk l!BxŤYmScf&w/PeTSutfn6.RQ 6&E~55j05] >BOƒxr[i~mbf,E xtO\?JQC>fvŷ?PőxgU:5"MRG\CƹHOfD8w `>duR6Pir~Gż[k~yqbNk6K oe-~M[|uh!-c`s.]mjZmۖ !WLhr4/n)8kte 2s=#vŬLMP^`G w*8)Vvyb>MѦK^C)SXM_8×t.Pb(㾇L=נgl!2[z,YzӐ\a=>DI1[ VJhyli IĢa$ -CCE25K(XY?,˽<6+tTx¬X 8,C>:%[gMt6ޚk9*^ -[.67%\KcB-xtqG"& TP5s?$Wp<)n:OcKKga͞Ee;UWA;Uo`͏HI|^lS{f9NVd\f|mriieauNkӼm}۲GUl1_Env}pE7}Tne6F "7߇قvp7mtIG+U ԛp눫"vM(Q -~a]FW.rehiٸ.WU``04]ɫ;V;&*;YmlVx;VxWMbiqXa&R&/ l•Spa8EW><:k!o-q3S3^Ӌ:cwC.p=_>{ۖ9ߓ[>u_/z~ƿm}118#o);;oȖӭ|-:b]|x3.~D[8paK~ iwꌏ|03W=-Z*=:h[>lg|{l.uθ/HagNrGW\rTA-)i[>`g|imtm8;Ns{Hncy-Zk 4X"XNX/jH x`a G%ѕ,]uPHx(wy71:w%F&A8s9E6>5E~.PĿ҆ÐYx?B돟C]q}z#uו:xzAWO}˭7K,=}:z M:Miy#<=>z\t_PYy :?BE_.v匸›StonoGyí߷kN)?R^oVkpN뽠 3 Յs*?\C}3kzcx(].=;'{FXG~utlaDݕ`a舎RX$.Z|ۣp el;&H)O"-P;"x[!0G]ttu;GNgL)w,56vgk;}.l}ۅs hyeonWi<ƺǖc]LX!D:IaNm Lp+f1ʡ9TܹOFمw> YnK&x¨51:Y`]hJMc YD矑,;6"{f=3Ԩ0!g3L`f.ߥv8е˱_[wWŗ-M?w5SĿ^Ԏ}?qiϵ_g_=Б*cۏycze8V':EO'qg/;Su7w?9}Uq7~~iY]5k*+&Ss\QE 'l`!5vv,|b; (J "  63&Kkߛ씷ٷ~9pyc,3&cwtbUm{=mt|~keKU6IsbyHnNob/O]&_|K#WLer^ft}׈ =ӏv"m取\3i_st=wVˢ9Sp0SKO'#/v@9qP8 ]~yJJ#3%+G#גQW}9~?Οқ6>'lÙȿwdCm +Ɠ>Be߬%tmñn>/G۴b'{&'.l${{F76{`~~GUl1867Z3w_9Ϟ>;~OAe ~zQq NlL2Sns]Lo?)xN$|v3{f`o>g ,Y_cz#'e^Y#n]0e`~/Ks;>Oܿbd1-3NYH5:5xeHr7C-,˃?Ùl91xߥX#tD`rL,7T^b8W6Ǝ)%XG-_1=e"-c& $< Cfޓ#,]P֗RkTRI%TRYMCNN"ks"NiI(XMkb|J~n0ѫj@, sz_*}W_sP^WWR`,5ƗHJv*%S.lZTTѽA_fK<^ڴZEނ|$Ό^6qu3MS!z!\@#7Ma*$O!T1<5JxZtj "ѽr]BMDv9/z8vCMڄS62Ie^ΈQ5iCMڄ[wM9lUݿJ*J*LG>TRIeTVnE%Ij=)/奼R̫5=奼R^[yH)$ B9LaF rXÆvp7cWve.3vYˊ]6c`19Xbs,`19LÄ9LÄ9LÄ9LÄ9LÄ9̘Ì9̘Ì9̘Ì9̘Ì9̘Ì9,Â9,Â9,Â9,Â9,Â9Ê9Ê9Ê9Ê9Ê9lÆ9lÆ9lÆ9lÆ9lÆ9Î9Î9Î9Î9Î9Á9Á9Á9Á9Á8w',dDf8mi'N–Eز[a"lY-e,–EزKX6%l,ac KXf"l&f"l&f"l&f"l&f"l&f&lff&lff&lff&lff&lff!lf!lf!lf!lf!lf%lVf%lVf%lVf%lVf%lVf#l6f#l6f#l6f#l6f#l6f'lvf'lvf'lvf'lvf'lv l l l l lDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDK^հӕwV΢W Ya>([)c]>wV_K⇚ y+2ǁ8`q %Ɓ8āqQhāq "Δɜ]TfJ \@P~;*yHc$Op嗸œv.3iTWcvn]l?;1Mѓ#̻}p{»eZl߭o,aB_N&8Xmd;_|y0 }엉QE/Xz:rp?>}2< |≲ilY"%Q iDc9u{L^QL`(▫Xs߆˜w^뙻Տyћo4<|W9O;-g{ @QE_wϋloPr~ΐD0&K|(R$ 9c?!'ϓW!S+ğp(g0F #H)9Q S7Ǣ;)C{(cw+ܣ" ރЯlnH*Ԍt# V)hWQ&]1n;S-v/~ cWQ'ĮXaa*JlWQEė)KdvKb= :YNR))o\'$NRO1 ",$\v+I.!Rϳ$%J?miםs)s:l^nS&Mj= D|cq+oWם.t{]~hNFOН\ B$0*:Uk@ȴi_Q]Op<+]wګ'35#g\SjgU1T5ѵ#GL#$oTKxOr&#:cT3F|ނAF8PB?PB4x+-Y&e@[y#=[K p+ p1; L`vp '78}}0b.\p%*~<p `0ZuaH(7n̒#9&0 0dx}🨚l 6;wp~S<x0 ?cO<x Ys/^x U kox`&]{>|0 Slgs_,|X_,,,,| X =*jZ:?~  ;&fV6vN.n=0Ǵ`?t[QF/2PsgzE_S0u :यSN:यSN:r)v~h, /TRI%TR8SSEZzN^]ai)(TbapYuÔ0ʡjDgv덊$k|-W yj{Ľ\O0۬qqm~\#D3+* &) i KiBJR YTIlBbK+rIbӥ~*K_)S.s]9;(-C[$BK=VV|aB9[:u#qU/{AUg~s=$oׇ;1|Zhu^I1PqJ{G<5bҼGwqJ&]_])ryW޿Wwsjiqh?naywM]j6Dy<řuřENj1ߪ=k^*MYM%#1y=. ~VHv2~{BCc`RjZ.gAҐ!SH;5uU6ixCVz$<n+ҡ1n/Kv2ނtF_wt 2g6ph7T?Z>)=83bXi~QkmYxlMh1ϥwueMњY/VC|װJ7p_nKEi{CxbyE*VF9 MTٔxK#I"Wf\ZVKCd[﬉UôMt Vah9["-]>:,w`C4UЅg[g_dU8XÑ1ؔz̟dCCK/Lrts溳>cv<!1k\W l{k}bNf} f=ܔq]Q:H21l?m/3渡x ]~cQn;hba΁BolQwd:«>36a~oy5W{TouϼϜ>t=m9o9{)C׈>Mv}=?>Vwsuy}BC@ْ=ݹPPIq@JHiq =4 @884M+Zp;j=Aϧh8ZZ2; z9p.5 7v.ttt\ \ c1 @O@/,㉹ ?\ p5`` `7?p-`:a_ pf-%c`:&0 % KSnpp7< x0iL<x$)Ӏg<x"%ˀWf^x&-ۀw3!#ǀYOf>| %`+B@PXX  ` `)``9`[ͥ~ 3z llllll   p >>U:AIO1t3vtYtigI'vt9k36[MQI%TRI%O | ܕoak])(T\s@i&Cgz7dYyRP:%djdE!ǝ_ZE]qjfBqIj䒘>h|NpGK Vܲ6͊jɌC(Vr>[ӶPײw]BDW~[\a|׭5l?OݼxHjP>Cįߛ.|xG {|jTѴ稝o| fw}"~_Q%f^HhK#19.J?Ckd??.Piywb -]xk7?9#R>4z e6j:&zEXM#kҥC1%nY'oCm0ɇKnX*DƻfPw$n'a%kaZ7$E/)-Ŝߛi-`dg1 B |%qG~ѽPyY2C) o&W);\ K~_èmz].U\Y(3&m&*QϓU_6J"BTFM()DJ J}B(%++!,fҴTjfMEG8N5Dy׺mj#tyI[ݽvvF$=>hB#(4 5qtRdja}(0i CkH͘quyic^2TUNKVʿ3S>&TPʍ[p+^TOՍt^'v2dASyAİm' gAbY r9X!,ʅ/%]^-(W)&R=Ǖ&%6?T& EZ ݊#,Z2Q. Q~+ʕNߋQjQZQ|Q.=-^'YU*~n1VH!';2,AmJgPQx-j_J*J*LC܈:F,~oQ`mV>nGƼJ?2WB|^zٟz{ d, ?mJf^[/%^mBqm *e%'t%5AvnE^<Еo s \& ;s孻|epNR>{"o}RHfJ"Tb:؉{pb},†w.:[- /Ri{t&hk~0El_%M-< 16:Or)F&w~n7$:R6Hn )Pp޼5t?M D=we`mE}D`SY1Ls > /XxߢLr]=)YIAyStWY}f/ojviѹ'ds/,k! ޴Vb7'N|D|7MN}|Nm PyD_=('XȘCo;$ H2QZL08!^ Q xfu|򟗸郾5!ZS:I Iͨ8Ӳŧ-?d?`A}w}(uQW7/r\>I<8Q?8ŚF稆9uHٲMjCg5>8S(iQ7qW]LemET5>$y_|7 F9B~Ff.2Q.d74׏/xwCR,N=WGz>bװz=4ɞonl}_\~?un~k3p  `!(p1u.61ݣ1MoypE談ȨRĐ¢ LkL>JAnI~~&ҍn sT"| 0EX2S)cH!EP_4ų-9_4Bsx(Y x!d(V X2+$Gr?WZ@\T M$\/CG?IRG-ޤD$T^e-f?^2J􆨊. q mxֱ>kZi⠫wtN8wjtw]CS;ejC1t?8]T]NջWBݾ {PqIi=xݟOAyh*-І,1 h~WŋueM0X%ZZ*,2GhZ ս~VT1wȞH͕+vbHɒmL2ﱈzvs|qH;[Ǎn^<8sδse6}~lg5-- Ɍ=Mf wgV&=-}Xf۶pz|Sw'k.upo s_Xd࿕n!nݰ/|0p-r.rQgqۂ@|䣁`7 -OY /A>_ _5i̇N翳mɓ?|gpZW7GSv>>6h:й#J^Ւ;_VV; {O$?gtb2|E\6pq#>O^ OQY|s5J>.܆B0j4B=ir"^I*,@Nxdiw+ܣ" ðln@ҸG|5FBmkL5M<滄+Eė^8l #7M,=41ξ|ϭ|آ`IZ!g3k0N_8N6IӐXt8v~^z?IW^y%tg=C((o[g$ڕ\(|~^ejm3ؗP$ $[zyVu=BJgE#84~{KZMX1}+¯(V//ƹLھƄdPf$/(MN%+a5 S`Y \,渽A%\*OD: n=WDBWa%;uⷀ~GT2:+9Y~[abT!V.BPQ_'IwZk\aHHGj5Ti*|)|m *Fc=rh|ksV"nnNbs94_F?ܬ̋Qyxf~R'ezuJ*J* hZKy)/奼&WkzZKy)/奼>孝6DD?Kyk}P޺[IKy7zP޺[Q&Wk{JmR޺īU&u7o}ӓV1>T#5Drٰˎ],`19Xbs,0a0a0a0a0a0c30c30c30c30c3` ` ` ` ` b+b+b+b+b+aaaaac;c;c;c;c;p`p`p`p`p`Hޝ8%NqBV8 [a"lY-e,–Eز[a"l,ac KX6%l,ac  YYYYYY Y Y Y Y  9999]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]‚. 5bTJ Z 9CirgFXX@?A?Sus=<HQ *,~zTWcvn쀮noB<1|-S7&Ԥx6 ~JqAZJ/в 1X!}헆|C'L~UZJ*J*uSI%JzУ*~SYT'Ht&}PÛvR^[xm6ިoMOR^[ΟփmR2==ZۋWh%^2ۼmQx뛞*xުSVEO3jvmwesڠ>:}cnc#wͷ}/ j=>WsO_խ5z|SFn=^k>͊ZG!;!5JxZtJ~gPR|r8>/>9]j}^|h* |yM} =j}.j}ZCNj}OpR{ZT,zU^Jej5f?b5Q+~PyIP{`Vg9~~Zﵑ;_|_ ӞDW-K]?/'Wj0P-`-$j0П*JR~H _2˙P ɂGE / q{+Z"7ρͯy妍܉KmXwew~?eONgp w] x_ z~\|V8'05|| o ϨY$ފYά&oe;]Vg[̿GM7ם轅"QE_wϋl#Vs-~/n#FjNZ$tZbFS+EYDzZH(-"/t<{;1?].4š·gHBD 3K }2beק?"|b%b0'-?8_u4O6>҇vXxRշ"&#jh@S%E9DD}AAjto[ b(F 3ɝ9E1QBbxl.fS> #$a<6ˏҊѤJ*J*fKz#PN%T+A8Oe[TRY#R^Ky)/ϼZzP^Ky)/奼>)o-eD&$ZQ^[xm6ިoMOR^[ΟփmR2==ZۋWh%^2ۼmQx뛞*x)/ ~ӌ~ӌ4 77͐~Lpo NM3Ii&8i.z%fY3r}h$U OEֽHݶ]LzpW;M>nW#N.;5وcl)^WaN:eo7zr: Ha/)\CROwg _``.)ح̙ ˽}YVr̍pTLg"$STsv-ߖ\.mA1eSڬJb8Ƽ)LQfXw"m) \K iLh~߄߄߄}&78fе)Xt|hI'Nd^0ާ~ԏ huɈ2#PgT3Hyz| !GeR^ky^_:?#WOyJ8G2UKO:oE/N-Uځj}#>9<r^ΈRDAJ&E^/IWkjCQ!edZC^Fٹ<?3XK+y> \3QIvcyη򤰼 {Kb8Ce12/ gDIcbe:&I_NվTRI%TR8(R^Ky)/MR^Ky)/孹}[;yKm2==n^%u7o}ӓVouTLAyO2$奼uWLAy6o}o7')/ ^F; hE3J3b'Ψ;~gTp :QdI; ф} Jj!ЏяձE4\'n ax<\O*,pI;uct5v3 |A?}7%|TeY>i3[&1C}p I5K]p?zmf$쓶Af-@Zs%n'uB@3m򞒘^1&ϔ"5W O2ڡ:.Nh߀LeցBb.:|kQ 4bJ+Qi!WLXDH%4 |:Q:[VqnϽ3{;}=MܒyCW+;>kf>Uw9!=??{pQ?wgzNWׁ[tue Y /1>_ W_X{rȏP5^Liy^WOy\2ZIfWƥ^TW(tycr y (Mt;N)/KZKAy6o}o7')/ DOAy6oF^Ek+eIKyVm6ިoMOR^[ o)PZVj5;xI Nj5^pRZuj|b=̇Zj/vͼ]lKuX|YMo Kx+\ZNx^R+aܯ[OBj=Z%g:|c7:0{>`¬@1SۋҝKf~0魇l7çS02î[^DŽ%/s'vf~Ei߹?~|58;;V,^>@{oP _v^Nln Mn./eԬ_zq=h8aw7w;{ɤ6wq⌻2K}9mPysǾ1ױ;~˾y mk'J Wցl=)#/5uz|fEǣD%<-Jx:S%3y?j}^9ZWZ.>/Hj}>4>zb}0KS*J*J*kG>TRIeTVnE%Ij=)/奼R̫5=奼R^[yJSHVyۅ\P{AG!''8=I Nj}Op*XK*i}/%IJ^ Pf?<]=0+oa?t]-ʝ/vB`/iO斥ٮEޗݏ_5`kQ jaTPOST{Dj/MwLdB 鸽[-MObnrFD6 ,ײՍ;pM Cv3톻bw}+ʎfu?n{p>>7g,^vof,gVܷ2zc-_#vu USG YBb訢/n{;_[Y y F #X'-^ZAi-HL•Eˇ,"=VY$ZiPh:=ǝ.OP3†Q^Ю](Œ;Syb$%u ,ݾH"4ZF mg!)d%.?9X`gzL_+cq;X6~%<Sܥb?H}rIOzlVfos nc&\81nWZPl}>?p:x4I_YVS:I }L(k~0El_%M-< 16:OrLRJ_ tk|L/U^zaI M= ,nQKс7eB.G"NVI vUsDj*\U.oS2 }.(z. Mۊ> b(||6_EKozR.2 9鮞.~_Ԥ \ӢsOv9_YւKa~s*C Qbۉd;3sS_+=atTW)(.A";#ɨ=DoutLhG>d~⿁ww{B=s?cY%nǦuo y֔NRsR3*Q5TC}|G|?C_2QTZ((lɂYA$ ]ʲN[{˛ {_\NE-=kݮ9gG^qˌ|geҵ>W-< רTJelti9?mxc=xS C9 F '5Ծ%h2>;H OmP!eL ݓno+ፌ5Sw繽 LGdߋt բ\|CNtۓ7wащn2pduECE#qd7]$ŧ?텪pwn|'\0՘NwoQa)kT㓅c%IB#1 j>_%"a7qv˟r'70! :C2$$qDq"*VU& D фi^=jтtLII2UCN 4"DKX0$"Cƨ8Y:)JUR$԰> h !5@+31::Z-+D 2'L1Ѯ£FyU Bn\Ė#/نT^,2mIDI391!D3]uT\Xk%Mb0,-2*a4qersܹ|_Oa0Iav,9TDWH%&sUT<3DJrي'[oT a0-rT rª9?;S޻\649Ҹ o։85.XFNW4t"fM~Q³YyF~`.u\fYJk*&1$YN xЩ,TRI%TRIe$21=b$4ًqx,^ F?#'GXjP|ptZ&鵖gQzUծ32~[#/_-]Q/Y7!E(ꋑItEW_F>aã]Z_֞sxZ=#=/ʧ,S kojCnW~JW^%/d.,CcOq{QP,l52l\A$Ɇ#%6_-cFΧu ^Sg n(B/qzl#OaM0y&]7[k]DNޥdv,]a!ʃUEn-wDcQX/9cQ9VV|k@4 {hZOUVv]#}Ƭ_w=Dy ^@O61n؝ K KJJp"ixvT,4uk`/^?p ۃe=;Z~u˂3W=* |SWRm⁽'[B\YÏzeo]z$vȫG0mϔN& cg~z =}r6$;{3;|V#CۈsZV} q^3D{Ps~hr, ]?w?iG^,e OBg8(f,K/Ô1A|EtGvuw&X;y`ݎ ZqL94Ù ߍQxXᐁ7T`oo0{v'~ ¹3uϿ^0=` ݴL<$[L_,{6#tCҜ)yW<>x[{ޜ 3e}5~|uMG'"11?#.CrmݓrδYx5Ceܑ _fX3q]֬S_MN>sX|;n4o/?eQVn )Gq49.}cr@[;ǼpU}Ns^8vBh^вԩWeȿ,Ѭ3\ߟ4;ը{ԔV^f#2c*Z|ݸ8o\FyҸ_|wW /{,}{YNgz܌,}ԙwݼ pH(/$?rܼw8_:LًX5HrZ$ڴ ;Ow3܁aß:>UU:uyo'Ck|x3wᢦ9m|F_ nOr[߶6[2i=Xd`5_/$]o,y<ԙs@s`Y-#N vzSr{S,߶O}#{7#)oXp|gɈp\1΋\{00 zOVtCcZ_K`wQI%TRIe} qAh]ybFZ&r $>|X.ѕwwX nٮJQTbG f$*-xBa~jGw]-Kw0tWKd$UX7]^U^aGWK%i`#P:FpŒEO(vtsj9s0 #, ¼_P cRg~ HXQ`MZEܴ>Tk+C"+ߴK$zU%Ap9J*j :u4t?YkN9pJNBy2lJ^noF%M&zU EdN] Kw˓S7J EF)CNŷ$uEg788܌"GB񕒔BxC1[P RT@qegtV_NeCMƄS12e^ΈQ5CMƄ[wM$Cr =)C_ϐDQg.gSIID0BQ>9Iue%?ǺC)OJH/kjr#)MwxIyT׃8kq %Ɓ8āqQhāq MydFraB3rXÊ6#A]Yb e.4) 7mK>\?ݘۀP~D7ҩiQMExn:WSGJ||r70aO>| <.? #Grw{ Ї$yhъ*p#%ArbTJӾ$NQ*-W r\~WfUவ+8b5 M*:@8@{/XT1wȞH͕+v7 .w8J(m&LȊ''ӝ-qq3;(p{og`{>?鳖[roidƞ&3po/8v+/\t׮u֏Ҙ߹9}x獁=&72l~i'lΤvlڄ;xS8v.mZ8uoy)pC e4߫ݹ_ fW Y /A>_ ~cW88s=d.jqrS6vcgyW9_#|Ec<^mܑ#G^f=i7Y @ ,9?gt"lq%>x_T^(|f3ws%#Vqߡz9p.߁phhw,v;X/ttt\ \ l; >~}1.\pj?l0p-`:P0p~y`$`FMF\Iq~_ n @cŀU2?ſ?01mw( p/>< x(`< x 4^x 2 x 6L>|1`ـ9| X |XX XXX{UՀ5u?~XwM̀-m0'``/`/~-O鶢>6_[sgl! ؅9Xbs,`19Xb0a0a0a0a0a30c30c30c30c30c ` ` ` ` `+b+b+b+b+baaaaa;c;c;c;c;cp`p`p`p`p ݉38Y48-i%Nqډe,–Eز[a"lY-e,6%l,ac KX6 YYYYYY Y Y Y Y  99999%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,t;?4FW *J*~% RPt%743%ČºH)\a~C ȵ\;LIx8·Q\yQt1"=CzHW!]=51{EW!CW.zHW Nz(8फRI%TRIe͒Uzn#~Y[۪:b["R{=Oes½~wBZ@RZjB6U[&\tJWJ\WNJP%I5?Ò|5uˣ_;"T$e3(Jo"|VX><}1-׈BFSHʌјʽW*{O*^#.{~g~D]kB}=RNC޿޿Ľ|HNP*N7N,8F%}x1om[[\Gy3*uMO-34?cUz"T>VJFb>.{\d>Ѫ-6 } ڦ;ojxJm`Ums3,iMed~bZ?Z*__ᑖHiih>UdXߥ$[E#,,Ud50N2ah6VϦDVo7XTN"6ȼu2XZ"nMmfbՄFx FKi6-Tiea ݅s%QNdeUiMZ%j&-$YNW¿uCbS;wPI%TRI%TRI}ʩx%=QGu?ZYzJ*z$R^Ky)/奼WkzZKy)/奼>孝6DD?Kyk}P޺[IKy7zP޺[Q&Wk{JmR޺īU&u7o}ӓV)>pA[~fTRI%TRIe]GJ*W҃UqTʪխ>IG/奼R^[yR^Ky)o}S[h>(Mt;H6jM/ۼmQx뛞*x?ۼe{zx&)/KZe[yx7=Iy)oU?0CО. 9X0!9,aErؑ!:Yݱ+ X2a,e.vٱ s,`19Xbs&a&a&a&a&afafafafafaaaaaaVaVaVaVaVa6a6a6a6a6avavavavava@IYݻgqi"N3qZJ6'a"lY-e,–Eز[a"lY%l,ac KX6%l,a36a36a36a36a36a363a363a363a363a363a6 a6 a6 a6 a6 a6+a6+a6+a6+a6+a6a6a6a6a6a6;a6;a6;a6;a6;as6as6as6as6as6KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX%X/]jBۛ.wn] AJ)BPX3r}h$U OEЕ iH ~;7K'DB7WR!g #Q=#9I&h7`l&.Usq6˃ c~%K+p{{9 < |1HyݹE9s8kS |.,'0 %ug}"py=Pn>cn󻋍l?A)@jt_W?Bdϯ,`u{x&|N'Q:H21l?m/3渡x ]~cQn;hba΁BolQwd:« MiZ P5d8niuKt^yhCtds5e/ns +:o~!iVp޸m 8vEcnٜCku#|&tH38Iq@JHiq =4 @884M+ooA #j~Pyif`a h hh 8`tp!3 "@W@7@&b@w@; `XV `8=zzz8?\pJU \ 0p`$`FMF`Œ?LG nX!P G(LLLLLpN]0!z7< x0iL<x$)Ӏg<x"%ˀWf^x&-ۀw3!#ǀYOf>| %`+B@PXX  ` `)``9`[Jw?VV~ `=WF``3` `+``;``'``7O^>_Lҙ M:}Egl6ͦ٢f N:-8l6盧Y gv4TJ*'h>QYJ7z&uPr &ݐfIq*CelQGGZ0u&a9!i"haIVљ9\WI0S׿0)*uYi w ݌,JvI¥8Sk%oiyf Mfi2VbA'I'$ GVUDP ҈E#$+bRS1Tvϒow@P,/qA֌B<&] Is_2VEyR|6|\4@ᦉ2Om;8j}7H6yVlQuCR/ḆIRmR)[B&/P_Iܑ_t/TjV(P ÛUJ"Bf8h(#(+>D^@bxzVA7ʌIIJci$~͡ҹղQS*o$~w+QR†@R7JJ9l%K4-ZEzQo5AG 8i^jȭ)]^Vhw=Ѽ/I`"iC3 Ag,Ykj#hX L4G9A_3f;>.#m]^Xx ksզBg쒕̔ rcV) FN7||4x0,˃iZŤ8wzx++(;=sUT|vzgv $,0Ô*aԟ˝)7hmҰvuU%QQe-7(lT|7?Qe7UuS&.;Fd6sM.̸7WɿmssQT̙MZUn&!LylQe],k6M)ߨ݃7tۣY5]Qe<Uxpfn;ʆ6-l,廊̠GmiQ[5O&E-RU6[>Q%oQe2u9<r^ΈRDAJ&E^/IWkjCQ!edZC^Fٹ<XPGٞ\;'ҡdE++H^"TT)g4 v3+ߎq8{Q%{B~G$3KХEFD)q}%>v{=GEXSܔbAzЃG5 > eʪEH"m*%G[dc4V(HƟ%X 9Zo,=<%JWuT~]KC^sٓW]`žE9xߪ{W޸lx gsvw?U=g{Cz랽;'j6?KcceyksG+lk|N>oYʕod9NSO=7 .ipi +_1 >/3N`81M^ צsȸb;:Gܞz|F`f/u<=s}Ҷ6>hzQƙL8yr.z ʵG5+InUR8px'z\xow[J|{0r?1}xT9:G~ΤMX عԷ_M i1KwT콾`ޟVۚv=퓺4x[`y(o .ٳː`xErGxY6SHR8~F-^FL"ؾM4ZX`3: y@hn1r$Y./KΝ}bU/N﹜`[Gx+bl6.EF7]vtZ99mgeM? i>6j`ݺᔖ.s_|eH;I,KqPvTRI%TRYMCNN"ks"NiI(XMkb|J~v0ѫj@, sz_*}W_sP^WWR`,5ƗHJv*%S.lZTTѽA_fK<^ڴZEނ|>X* 7N &fǡɹsc]>7C{ < I^G,97>=va{bd,3BY Kng_m۷;.\#S˂_%G%W>qrXo<1 8s+DEOW ***NQߕuac}A~Ve:)«R*t*݌ ,k|]::{'%uo*tT>/ЙuoqA-PD Qh2jH3A )PD!]DI!?l(C_ϐDQg.gC\fj0B}U~亲E^&8ǺC)OJH/kjr#)MwTNRq< @JHiq =4 @884M@F@,`Äf 9laG]Yb e.2m@3{'G(w=aok4O+wynMAU(?"鈛OԴxy<7rq $''1}tgpp?z(~}TywZ&0H"k 7Yb4-w!L%dq! : $&8VTKWpP74UtFh5pV_xg8b=J+Qi!W6t%ov>])qPM?sOO;[SfnwP.;qe6}~lg---,Ɍ=Mf _,%J7#pW^]1s'r/+zMnd>YN؜IMش w{!p]۴6pSᆇN]8ˊiܿW%s+#,<=\-0_|8/ǮJqq'\L{NM\*}mƂϮr S_GH=vy᛽۸#G{doXr~ΐD@%K|xHr$ 9<c_v'0r+p^)q kr|] G4B=ir"^I*,@Nxdiw+ܣ" (6)r<4_ɶWm`;Re,jUr0h.Iz؋S<^O_3{&c_2ru΁)(TSZו!#+>U('\!Ӹԋ .oJ.W=$Tt!9Og @ ɹnEnr[)C Mx6E9ڪ=XFI껱Qҗchcyb^;Pp3Mvۅ MĄ!`I zNw(;yQ8#JL9t2oƏ|SW;MTRI%TRYe@zP^Ky)/奼7qZzP^Ky)/奼>)o-eD&$ZQ^[xm6ިoMOR^[ΟփmR2==ZۋWh%^2ۼmQx뛞*x޸SHUDV^S ؅9Xbs,`19Xb0a0a0a0a0a30c30c30c30c30c ` ` ` ` `+b+b+b+b+baaaaa;c;c;c;c;cp`p`p`p`p ݉38Y48-i%Nqډe,–Eز[a"lY-e,6%l,ac KX6 YYYYYY Y Y Y Y  99999%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,%,PF!9Ҭ3fviVh$U OEԆ95IMd!І9C 2 \~gҨN]L:߄xb0b~zMIÄb)L9PrP, +Bi.q[z&^y0`üZ[vj#=P(L$D~ %z7^X[ ¼tLul\F5߮)}-W1S-+hQ.(Z(@(O(ߑY//>!sJؠ7Kn}i', ږraN;[}r[sNnɃo.ͻ6(>wb]|Njn}8!Ob,_q9v^6ɓN$ol|IIGj@Dw_Q]Op<+ԕ 91WOdgJ$G,* $$Ϊ3bW{kD׎P1Վ䒘j1r3Ht U ߷|ԿP{GT?P43g0>K-g_<=œ8Ѡ -<#"ƅN΀.]Y`🐲pz.p'/F_eW\? \ 00 0p=q pf-zi⿢ #9&0 US(=D?dSnpp7< x0iL<x$)Ӏg<x"%ˀWf^x&-ۀw3!#ǀYOf>| %`+B@PXX  ` `)``9`[Jw?VV~ `=WFo66vv2W w3^> ZmE}DmtW2@_`+I_I_䬅 CДYuV*J*2qb~% RPt%743%ČºH)\a~C ȵ\;LIx8·Q\yQt1"=CzHW!]=51{EW!CW.zHW Nz(8फRI%TRIe͒Uzn$So)s|*Wp["R{=aY*]* Fr-2QfV?TMS -@jV+RĖV6ĦKTϗĿR\r_wPZ*H!!W{ĭ~72Är*]^:R9 Z{HhO_wL5bкT-&2c4r+yk8åyw+|Mh9 8RNC޿޿Ľ|HNP*N7N,8F%}x1om[[\Gy3*uMO-34?cUz"T>JFb>.{\d孝6DD?Kyk}P޺[IKy7zP޺[Q&Wk{JmR޺īU&u7o}ӓV;Ks|} 4 9X0!9,aErؑ!:Yݱ+ X2a,e.vٱ s,`19Xbs&a&a&a&a&afafafafafaaaaaaVaVaVaVaVa6a6a6a6a6avavavavava@IYݻgqi"N3qZJ6'a"lY-e,–Eز[a"lY%l,ac KX6%l,a36a36a36a36a36a363a363a363a363a363a6 a6 a6 a6 a6 a6+a6+a6+a6+a6+a6a6a6a6a6a6;a6;a6;a6;a6;as6as6as6as6as6KXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKXKX%Ђ S*Nخn7ufx*+򹳢GAwsb Y=B)Ɯ(v+w4N۱AO"i>Mk?Yڴwםs&nڗgz&sss~1\lϘ[5bc+n m/!5ג/r/^)Y=+:oה+p0=*Y9CF5"?ѓ6ǺEy7tOo, zM,q9Xs-wn,VGxUTO/?}fh5lv?~9yv+s14;9獻JzE'_9O\0?'m!I%ƛp%wk4|/GݺB!$ǁ8@zhƁFqqhV|ނAF8PB?PB4d--Aϝh=œ8phh8pB@'@g@EnLŀ,< x(`< x 4^x 2 x 6L>|1`v}  9`.``>  @``1k7%eo+XX XX Xg/_~    `?|&}zt:oN^b6v l:M'؂N` N:;6r l~/i>*J*Iy>aTs uPr &ݐfIq*CelQGGZ0u&a9!i"haIVљ9\WI0S׿0)*uYi w ݌,JvI¥8SHP2͖1!c718-`mes pwn|'DNIoQ!U)jt+8cA|ɤ[}IyPlas&D^@bxzVA7ʌIIJci$~͡ҹղQS*o$~w+QR†@R7JJ9l%K4-ZEzQo5AG 8i^jȭ)]^Vhw=Ѽ/I`"iC3 Ag,Ykj#hX L4G9A_3f;>.#m]^Xx ksզBg쒕̔ rcV) FJ!j)\Pmh'T o]̏)3y{(3b-ы_yޅu,\}/sR~D}cו!sW}>PF+ɬt3,bB˛6CCe!9OgmM.*{Q帽 hj#.=Mty wI|zBνr4U;^0K} }fx{e<x=x"/}$TmQ4a-~ߣhA:&Ӥ(Y PBJJ^A}oPD_tK,Z)a J::H%qEQ*z&%[>Ux(W9O^لjf{Niy͆֒&] ww0#@+TPsIR̹**R;<3FXaJE0Pz&rVT.?RwӾG͛lŝ7UwD_#QeY::8l7,./3FkXTٰ-o-<Ɍ*36|v{S[EM7?uo:lǜpYJg؎Uh;7f6*[ow{=G >}fyߨ]W_rE0{Dg\`߲*U|yϬrUXzϹ,riT٦#[U6lp MooC[ˤ<ֲ ?JurF&ݯ<_vZ2y9F|r~y>(Z}12򃮗翕Lۋ^3ZNUˇ?Hy?Bjއ{ceܓs\d zR4?-z39im)m݌Vgoayh+txW.>cAw~߼G+aC!d2w wc $?y56#gMu|,͋^Gܞsrd.78lڢ9 /K9̇F'yWv;`3:Ge)u|M ,w?]2qv i܊G>x;;s6/@ҩtۺ 7s;ɛf;[?F\63/2f̟rt'/kXQp/n4˘WZ9=ο4\;O⭮X._V+f5a쿫ּfۺbYuM @ɜYp蟷A?ͪ}Hr?͜>at{ښ_ɾ6eCy܉?HY}rӛ7hncivuft՚wVsI=۵w|ag!;8/w[\ iDSGn9=| ѵ?ǝXwd/9,r"m>/ݡh!uW,?i@ $2f ;^]$K]L~b2,ݯ2eIp}~j 3q{/v"+wۓsk/;eA<N`_۴YeW7<׆;#ucwqb0X/ ܾ`9 z0jtm;m,pJXB,g#w'>,(·V$ĸ"mpKv_WR>M6#)Tl! UtWpD?jј_Zͮ?&#Z B +? e^j,I1ef,}BI@еQÂ;u$ej&$}5޺kF;J*J*Hz#PN%T+A8Oe[TRY#NRFLAyOoہvJy)o]՚^[yx7=Iy)oU&:Z[yK5Djm/Z_)MR^[xDnַF}ozRު@Z6B!ߜ!##Y" 9aA+rؐÎd=+;vea]&2ce.;vas,`19XbsÄ9LÄ9LÄ9LÄ9LÄ9LÌ9̘Ì9̘Ì9̘Ì9̘Ì9̘Â9,Â9,Â9,Â9,Â9,Ê9Ê9Ê9Ê9Ê9Æ9lÆ9lÆ9lÆ9lÆ9lÎ9Î9Î9Î9Î9Á9Á9Á9Á9Á9#){w"N8Mi&N qZFv$lY-e,–Eز[a"lY-%l,ac KX6%l&f"l&f"l&f"l&f"l&f"lff&lff&lff&lff&lff&lf!lf!lf!lf!lf!lVf%lVf%lVf%lVf%lVf%l6f#l6f#l6f#l6f#l6f#lvf'lvf'lvf'lvf'lvf'l l l l lFt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt Kt D륊^ ;]Yw{΢W Ya>([Hc]>wVX ^m!k9C,FU8 q 9ā8@804@84dTO͙r+_E~o@U 57\W`;jz#I<_O*,pI;u3jf&]b!M`= [(?;m&$&<[k,\<󰩇$A*N=(VKYiZVkڣ"K>ލ,/$܏D OxlwZ[ld/)vB@3m򞒘^1&ϔ"5WO2nĐIT[M\M-EPȨ~w>WtL5p\F*؊C6^B*mD\2q!qм &L?^@ΖcOTrE`{Qs{y`z}3|#05xΗ(/ny}6ʼsv2G^}w=\nYNgnmBݯ<4{~=7uc?.ܱ ^wڈ߱汇v_ x_,?$g*P|5p=}k̵NI_wnʷ}IN*ߺyO%ׯ/בtNk}GcEBZa6aTr~ΐD0-K|(R$ 9Xc?(i'ϓW!S+,)g:('n3#n39 娰9u㱟,:4LN񺇒_q=.0p r= HOB?C$<-HC# Ut ׭hT]ۄD$ /GXX$k4*gQ|)Kd*ZdE:I2rJtkp:I?Fx*$rAL_b"}H1`OJMH`;Rt|S6tjߔI)CBWPs.?4''Xv|.d!~P%I~5 il#R-xBWZ91WOdgK-G,* $$Ϊ3bbu}i0kkG(jGrI헌񖣟TL|A3HtZg烌p;j=Aϧh8~_Dh: s\e6F@;@{@%::.ttd.tdX Jl; >~}1.\pj?l0p-`:P0p~y`$`FMF\Iq~  n @cŀU2O OLa~L6pv;wJw p?< 1t'O< x,9/^ x*`57o x0.=>| )`6`3瀹y/_,eEŀV|``5` `-`GO~ll``3` `+``;``'``7#-8%0Vԧ8@Kk/}u:@_I_I_@Z?4MZ_kJ*J*'.FpQYYK7P l1-JW~C3SB8 .n2UWY9@\;ܑȵnQJ#|EeW:LWz#]=tCzX\t2t0被t9फ Nz(8!TRI%T,YE ~ߺm@"1{6B;?ǧr /%!^-q/K&q5<Fv Q)ǿT?̶=H)=;2bxih"B׮6Dw,bO'4?P.v6_YVefV&ƋUjk䯲 |QGGSzWY~ *=44{*RQݞDP*XaaJq•C z6%zx3҈r{F/Wkb0m]5&4«gpX0ZzpHuiyn|ϧN' [k.0ĝ+r*-Ik*)T[6YmY$qw`nW1O3ezu6SI%TRI%TRI}ʩx%=QGu?ZYzJ*z$R[h>(Mt;N)/KZKAy6o}o7')/ DOAy6oF^Ek+eIKyVm6ިoMOR^[ /)LOYJ*J*Kuo|tU\PF%E"B{-6-IRn({VH" 8pP7ޑ7wɥIzo}O{窙dD%;QG}3YL6'He'}0cÛ~2^۔x6m6hnMO2^[.ރ6mJ2=6zW铌6%^2mڼmxd.xY_sC\kC:,atءNaC|ˌ\" @.#qG<8x#qqqqqqXqXqXqXqXqXqXqXqXqXq q q q q qqqqqq8q8q8q8q8q8q8q8q8q8rag>viN vZӆvt`'fl-c|̖1[>fllX X+`#w#O?l _l `;vO{87Y[E+}c B6[f ي-dN-;Bd VT dI&dc'z +x0鉫ƳtJ>٣&GIdy7lmeR]X:JMcrh3Ȕ@<|mP(D<U ~oF+<%^_W y6)8E\ "I LmPHמP4S+NNE qߋП(ڡcoC{z~POBOPӿ IfID(Y$<]#A"~@CW@?B>O45Ai|X=E7,4"[${fݾ1,u(:Pэ8GM8(nXnu/D0qh(M WKڤI9WVqH[2N};Uq6J(T ( a6PD=GXU㟯z9mȗ;1~)ލ}ZM1=6TjeD4!5NS"B{DT[Ehݰ$+%6+%h&'#xpy-RhZ?R`3Y3tFTD^2Xɜ|GN] c6;b_ _w薹6SU4NNOvZ"J*FC*>!Ѝ(S ևdZT-GLڒyirP-ԋvq<MW4܆2䉾†{q<#> i–!(4*-)T>Tobj#hќ& \4G&a9x9ߗ!Ov&>Bb}tB]Z~39W "Z ]Wz)`[!=$v +"б yJ96\CX?rALd>+)a \"c( ^MVF A;K!V%pQ] ?X'*?媪ܪ#? ET*E~Z_(r"*r"TzEnPbE.~ն1t%ӨV#7t͡#o}rRsVސefYNpr"U"Y⼾yU$L2$L&OC٘.,qh|{6k,jOVZnގeN,]>.cuNv]ֲ]VFݶ/mRoˏlq۾\Ax J$s:rP`noSn[ɋ|+,+5A, Voţi t`O>qj!Z)'6vГ{* QҮ &͜JiX-{1#|KZ]D(7)h?PbXzZlB (ZjgDv)eAځ䴁Ͱ젉,;Kc3 |AY BSA4W$Lh=~0bae=0K  8̄NQgQi_rW1eIp)1e+ϡmSv;e>~Sv ){T<ޘ[W}ҴfSvץŔd}dgk)mYgĜ$}ཫ 1''z?1OQM_v%'-xfN$Ym,č{ ugjY5mm;bV"pgIxY-_L2$L2y$61E.HpL*^ N?'V|)]ϻPί uCzhk9Jƺ^t8}I#r(|=bStZQt=k|4?]sj/<0=]N .JZjG_z9_uaXCo?PiLPZ{E^hO*oZ7ZKUJ8~]VLE,5#_KĐ L>NbC~_@Z4PBWl|Bx39U~AQ^g*+w#a~]ר6[ vd.މ﵏P>/2"m\dY_nw5yXc_5YcxLfcM¶Dj:1`PVcU[n%0?sb"mQO$ܣ|A4VIQ[ #!UWܱ4 owU:k'5tW)8*`yOEyOMg$X3jQ3T{ /mS#V:t\Cw-5Q'=,oZGI{5L )}1T3I,`;v!b,Yu-^Gxw%5sSɹ 1AΗ*T~jyCo:Uм*M8זl6>çK0grKs1h+΅[ͧ?$qsŃfX.xa~E~n.rwNY²i*]ЁA?m|hksmOkGݿ+΅R;=ibkӚe)Ng#v=&7'wg6ɲ*U^^SI|׍J׶v+noro+X-DŽSp?6UA:?We0km>~K'zw+WQ"gҵrה]Nmu#5? %пaImMϷvoG(v߀0ܵl}J$)]Q>r}^Fx[OFjn3U<0q=_'K]dw1$L2ds$UoIud̓:&s$~kE[+D8wWw nY j#ւa[Cxreƾj!*GcZخeZ8jd4U ъr*ԨGQK<(ZGlƢp{{ ]5,h^'IXQֽ(A-I'T#_ol3nچ?jr2_ܴj$@|?dI&d$N=MOE6ډSdN2ʼn\L4ql-?7:ݯi@, wl_C+/B/oa(5S+<mꊘtץqދ8G8kœ_F*qOFIIǼXT/(QK$|نjpQ7:apSY@鸛gό,K$g®eUi~@1<i|yAl`v ܄3372Q̍:/ ܨQafnmfnw8ObI&dI&d29MU3$Jv.gne}-&lNRx/e6g^=/e2+~.&*jh$/:x0C:a;t8 >C|ˌ\" @.#qG<8x#qqqqqqXqXqXqXqXqXqXqXqXqXq q q q q qqqqqq8q8q8q8q8q8q8q8q8q8rag>viN vZӆvt`'fl-c|̖1[>fll &u&سBKG  kr1,MkyGZH PEچ**<م')5chMwE^b*Ua* V݉ ۽,MJ{Pia)wd3ZTE^kE>u>Osw =9sck(nkU#ud~t9bzvhc̩ѷZ}'Bc]>tŝQ۵zkwkU><1Z7zs' {BJ)s]E!zSH7?S.Xb vg|a@zosϹ^Cݮ:groYG^W-^SPh˳_wh얱P~jIP؁J G' 8]LʉBx#Ē>ס "-.,TQNz6B}:®%)áDR4LE~J*h8O cOj|r6 R {j4{᦭_Gpd+zJ _F8IzzXtl-BDxRl-*"FEqE_ш[*-#ڎY(Am*Z0^Q{&?'M3+""$'˒;+qROG)L#?Px.w,VԲSj' 3)11b'=AНL"O(zP>!ϊS͝TdW* VB䡴> IWmL`u&WG<*.Hx[gm?^.٭#WG\C$o%;؊[1b+Fb$_x_lX_b9mq}h%#'?@ w"@geW8@y*h-tz/@.y<@4OnN~g p@`@A`ŝ0| \p 6`HQp 8`D.J</ŕ%b^)W4 `*Ur0@sY\ 0`up#M7p+\nNyw 0{<< O< )x9^x^xW^x 7X6;`1,`)@ `G|S+V|9j/X%z _| ~`f_ `ovט`7>23lc_Er@]eS@{N)N!;N!:_[ũxY^&dI&d2yCoHKEƓAÈ]a($G2%Lsў5 nKìܾaD",'rofO90Nd%==dOC==lŃ.==CŞɞNPv==!L2$L6,YGO9 u#q{VaW() h\__oPt#ܟ{1vsc EǡF>S W\L&,*a)~shPJ*u*9S)ѦFfdim3[Id6ӈ?SsC5oK֡F_t߯D'n.S- tDy"k׽!U5gq3p r Q煷ܦZ&әƵ~NG=JyW'Xյh+&e]X[q_$x_ڿPvsꧪyh\}M-kC4TyL_j/O|kQ wC-ʻ!Jyce wG,g僿P/U=Ɖq߿5N1p#wapn%;^.U5eC%:Ө3%S.5y^%ߚ(}`m|jH2_":8 x䝚4ؤ Y Dx;4Ssmǹ)'.Ŧ>tUe.oe}.o ?Z>I]dN VG&ݏ2471C#> og84F[b.cu*%^RWGՖ엟z߶*UTJ˄Q' A iv&SVUfULS vG9.T7ٔxJOWCFiڿD;bp'%iF6MxmD6ψd A%@@9񔧅6J("+jeȖ[Nc!Y*h[2IL+~Z$L2$L2dr$;fI&`G]d[L2ٜ#2^x/mμz{0^x/e͙WeC;^~gI&dI&d)Iv4#T$L&*8ɺd9IG/e2^ۜy`2^x3-UџH3 2 b_Af_ANdɾ,;We' d_A+Ȋap٫gilbSAϾ>v=@(R5~/x/_tx'G^>GeW|W dW<ϾͪpJ#S'!Sq2E~eL[!`TP\/ho rS @p9rn .>1G*wB׮ً}.6!=:d\^1E=dO^{"7P]ݗH#$c/`+ǿu;qCF R+˵ t=ùKPQaL) 5%2@VN-@*NmjT> {9 w` _3-@;N^БN +ILz p @o38  pf `p8p69\n'<\0B p1F ~;GLpW\ pIϻ,q7~&x\ PP ~ `*{$*L?4`5p@%7p 06`]a>=p?x!x1x`SO<,s"2+:omwx`b>X!R@2>`9+V s_X Ko6|=?3&l`+6`'.? ~1\rKG9\lٙ-;eg8ٲdβ-;N p}E[W|L2$L2䱓p=xܕUX0<+&a#jwؓ:0WKͬRg!`G#SUy`%sGdc8U5wUDی<}8~=kߡ[3NmVix:"¯:=j]*Q uC7vDLZ'jR1kK CR/=>qsh 'ӯw6]mrʐ' s5'G$8. [v8tӨLxPSjEs(pIS|_f 3u5PNiyGXs 7O,̇5=^qx=>(,]JYyPv`6]=yK6:*ip)9N?qE49#AJVVqS`uXXɨ+\xGdo\@A2S!\]8xwlXL)+w|RЎk?8}_W7W]3H_uMw R H/dDU+\xy륀PՉTdIĹE 3xjp4 `ť LQ e=߳KNfV78aҲB$i_4s:=wɂGԾJTŻlչ%e Tv8U}+aa!fTZ,.店 +_LO +@G1)׌2iEl|D0](Iׅ:ϡa~=4%c]/]N:>aLVZsPOz h~4/ ^%ay`z(I]b3zO*=L1$=rDƇ~ wZϡε%ЪT<ߴoNիc~BJ A7 ) Ev!Ki(#&j+at ԸIGo\%tZXbiYZ^NwU2XRCe_e_mB_Fi-ȁ|h ԡ–yU@+ 1^5$/r#oiuTk Fπ5%*WıX7F7B{^~*"A>W~.ߌSy"/ԗE[  XqxǍv KP⾣x(f"~A8fF6̻pӉMMQLК mT&UlE!>] {Ef$kͬͅRYܷA?K8N;8WǙܵ?g<;뀯XZʎ{lq='w=o#g\=yL'’^sYhZ~io;lw6]{qnIkBMCGϺ/L#CEY3ie&IyBb۹ry kP,W?|tq%tuϼeuxK_v_P%-7hKuۯۮq6&i GpA\^IBa* NWRF_'5?t0..L)@쩅^5Rek4ԗ0>voPN9,O<Km8%LR4ڗ0](3V]x&+x +eqh$xIhdR 4#źĽHknN)Ƌ >#GWy ӄS{j$&_+*0k7e5¯KO0&3l;8֛oEIuzF嚧à1yDSɞǨX2O{oN‡z9/b$ͣ: +2_}G4ƇbMׯ9h(t3Mv?Hc1/mڼmxd.x]>mڼ:e{lx'/mJze۴y|67=xo]bs0QYP \Aȅ8x#qG<8x#30#30#30#30#30#     +"+"+"+"+"!!!!!;#;#;#;#;#p p p p p 'p"'p"'p"'p"'pBfl-lAMS#jm$9sFR4OhZ٭%yR i\'0K̒F8$^>fI^5d2ަī7di6Fsmnz2޺MviV>_JNd)>omn$eu򦽘$%yfIc䑓Y̒de'$/;%yٴ-gc>̢>0$&3,Gmme[â|&EyXY-ʫEiQ^%i(`8UGIZoQ>IF Eh)Y'lĦMov -jvwGcg\vHChkY{2+\Lzk[htGY§?yqQܜ'tHgy'vH珅a!)g*qZ͛7|<%ѣwu-Csx -zJ }wX_jq߮C?~E(/5Yg5™E1gկ,ҫլ-ҧw'*L2$L2$ [ij&d2QvQ߿L֭o$I==~/e2̫7?e2^ۜyUTsHx-]"1|YcY䓝"dd'';U,)^ȗfm/Y)xL4 S ̒|=FMf9w_|]z]uң#>Y49[}ܳtc9NՃQo5`VA#1 ݪ[&vD]x\4jj gI7ceGD^^szJߘBiTQTQR[ZV($bfVuJfVS>fV& VK'‰H+|B-oiF&K483,׻I&dI&dɆ-ѴP5L2d;&Vַb$2^xos՛ރ2^x/e w6NJNLx oAeWo~>omn$eu=o)}0cë>xoS+}0ަ͍IxW"CAj852žFƾFkd}LvN52٩5,+_#¢^+@Ir#m;JFrh^i4J|Y\F#FP\Ng3t[KE17~c_JxaW&'Lɔ3uWET#^XՇ ]|qa>S̫%ٖ|^.Q3e1(*r@BcBׄ}H_&r5@KQ;+;+;+ȕdM<! ȯ 1AB pat LY47ܮ1U=!LwE`KYHwClJ1#]G֏:~d}]TY?5+Yխd=zG#K?֏ IuXZ״)E3,餔/}_ Si=}9E感L*^ N?'V|)]ϻPί uCzhk9Jƺ^t8}I#r(|=bStZQt=k|4?]sj/<0=]N .JZjG_z9_uaXCo?PiLPZ{E^hO*oZ7ZKUJ892ҥ+X ~x)N.q݂\ zј+dz"Tْy3U6;`DG<'fS9.ܥ)>IF0 g-q n1q{-m;%(nQj}t±h9D:/ ɦ`Qu6 _NGw8}ޗdI&dɐN`2^xox`2^xog'}0cÛ~lxoc՛_۴y|67=xo]&|z۴y+ud/z_%O2^۔xdi6Fsmnz2޺?oJ.MM}|97e'dߔ㛲}|Sv6oBI*߬k&+LfV/Rnn\n\T+Mrh=S}yRO1g_~hS_^CMyɟ5$ͷ͞3Sfi2L/V:H3kyĒb[uA:R%VVx]}GGtTL:y5M7?f=6 JD[ ,{rR-'Wh)%o7QzYH~xax}m\LNŶ ?˲&PqYŦϵ>s>71VljU{J K`%sѢ.Bߋkg@b}X#7$yvhk_uε|^zN:?UONqeެ,C/~+)r󴥡^o޼-ݩG~.9*Ch+.p;`| :}KĻ̵ _vx\%B˕|H93xoekJ,z]XgOCcgOY:xWLzum}EF%CaJ+)5N$8" #i~fQ5aCZV0 NR ɒNR/nXD R͡`PGմ#g8tW /8^IE@ ~a H T1ÆAp9=EJbO-3 'Ki5xq &#Brx=RKJ G<L2K %$,ɇ,ɇ3K%yt0_fII&dI&d$;fI&`G]d[L2ٜ#6NJNLx o~xoS՛_۴y|67=xo]&|z۴y+ud/z_%O2^۔xdi6Fsmnz2޺Uy^́YW\̒<$1K,NfI^v2KY̒lږ䳱fQ^ILfdʶaQ>^f E,բ(YOC򪣤N-_($#̢|,`g6}nb7;n_x#\E3t`x];$!,˽\Xzmf{M &-4W:,ʇ{tkӟn j nrǓO[Z6 =sm^Kp-[su_R.?{Mao%]] G:$_\G\;B38-|v>v;ܺ!Ϲ,1|,NfOv2|Y䓝*ZZK,qH<`@)fIO>n#&?g};/u׋MT.ֺXQlőLF,zYmY鱜q\V(C@ U0nUحJUizw" jً}XC~õR(j]`PGSRXYiR)+#NB#[)h+niV @9rrߣ!*$vJ i{] )>eO v1sM'&@kIAJ>v;'/z\xy륀PՉTdߞs`# 2:"gzIYPհRV\ڠ^ e=߳܋;#fV78rxß]TQR[ZV(h-x|e<wq`T%FsA~IW疔aw&2)NT~&i4ǔg:L桽.!=MךYM.6(Soԧt3}j+݈nu MYjl7[){5Ո~;|C3|%V u+VZݭ@#Etys OύVsn̵4ՠť7.[wv[itAʢj:X~_Dž 5JwTR=J}P( {Jpf9#TN[ĴR ߦ7ofeХcX݈bFR[5⊮?1(w+dLQ s r qd\~^QP暁`sL1(Wl]8e,"Z(sQ/#zuWĒJzJYDlxE1f;z<观s nab~R݈u DeEEg`?8~zةNœK7<1 Dc(EK妯}wPKJ%k|F EJiEdߗU46Kǽ:e݈\zs#KL)rϥd:r+"jGL}t?Sfzo)[=U)[f|צY\b{n){륿M04l|e%1eNA}OL?4!ceĔn+_1e%+l?̯㘲ݺg)_~S';e4y1I:馬/iLW,Mbuʬ%YzƔ~N}kb^MLQlywSvcʓ&c GSvem1eQ׾Sif=k)MgPhELoӧ=So5c.;1e'jѹk2uFxyL١ؾWz,K^%͏PG:iN$7wT}W'Yr:_ߙٵ5c_sspaOs^)oU|7͵СCJ9y7_~%J.*Jm/=mF;}_yCUzwrCs\nv٩п>:ģC??~*(]\op B CXy׹5w|\~NH~OWoA/|Яmێ8 ȃ,lBr;:z1:wĶjSE;t՟!?T?zפGN\5գUOx]>yR??}DzJ1Uڝ^v-NgXHqn+پ{RMΏ[O ܲNk3_}5b!˄pz3󪬹s_%r}A]7.AZ~U=Ж_xjJ <];'\{Ǝ&WK/_xwUf&,Z%g߾uemz,rOeˠU/7{6tDھ>vkubtmfB=<^8`O I9O$>|D$8m[VdtE9lZ`P \eZQخEgyٮji6Z83Mr"\ 5' k$s~FMGONf㋛Q2SբH'L2$L֓ԩgF;q̉S8q#iS&7ݞ_ߍXL4 }a;!_B ԗSb TʊL\N6uE_+zvx" Q1N+L_F*qOFIIǼXT/(QH'.._aA)E>Mކ/7e#ó*U)TyeXJ䪾˩3~LƄD310S$3^f2F _隌I$z2Ć!C_H.d\p$Gp)~BPV707 E`HwI%ei5mtGJQE9\(/ ғ_Kyq" 75%2@VN-@*Nm@Nȁ| B :'܃\#,eE.%@LK<%_OO`[(%^K/bVmXwӼ,.G6`IG4?vB.M+jJUo'racǗ]mP~rtэP,^EopH?{A_ ?$t/ߪEXH*@O;nthX\Å>@?RРVkBOГ[ lCrfZMNК =V&UlE!a<+Z0#حv{[| }{څ+\;$ܵ?g<;뀯XZʎ{lq=')7't'9ler?B^2{OS|ca;͠i{܍sNZ:ͽGoZ:z-w|ufꥷ:(ʚy/L+c6EH:]˳VXbxC.y{ Gg.kwd[w.j3}Gv|:xWm׸<'@N6dQ8vQቼEqWSH+'F0 Xť%*o.UFV FڎP<<®%Iápy%W /8^IE@&~~a t *טzaà{apRS k4"> ߺ/z#0^'6hrUh4$+Ҟ9òTqaNegN6Fk&beDD{%Û6vIBP% J:/ sJ>jC2ynwPW(* SApy F.`w @P(7?l3|L_8$*Nu`tWT5>!(~Z&{g5|^ȕ\"W+ EQZES䗊\ \edQWUiT}M[ӯSoLNn֒bS y}_P*zMz]/ M.+W4Y0Uߪ R F, Ihc2D#ruJ$7wpR][dI&d9Jy6li2wɞ-lHlInQ[g([֩[lh:ruDE1F$:KxJ|oׯr8EgɓUQ'?&o=*#NDmȍeT)ļ{ JfS2LwɳMp==pKF:=d-u=k]gW{Ћ7jX?T<._}b/*v_gL~%=ՆN'_S;QGX1vMRmaRp8븢=T{hp?l&aFP<%2qA?2yL>@<=AX@=ٕJ7Hm0 . AUXX 3V|`-:/l ko?6W~;~ ?v[n-҄O77Jb7Aȅ8x#qG<8x#30#30#30#30#30#     +"+"+"+"+"!!!!!;#;#;#;#;#p p p p p 'p"'p"'p"'p"'pBfl-lUfl>1_ՀHxq|^5Bߧ#~E7 =p~_?= tDy"k׽!U5gq3p r Q煷ܦZ&әƵ~NG=JyW'Xյh+&e]X[q_$x_ڿPvsꧪyh\}M-kC4TyL_j/O|kQ wC-ʻ!Jyce wG,g僿P/UoX=Ɖq߿5N1p#wapn%;^.hhe=J,|.љF(Qx]uQ+*DkVFtAyPeڦl92 a;.ZW@}bOyS6 |_Ŋo\YhD|I[Xr=_,uWśq)~8[vQ\ 0 N  &o;+Q IF*i+85+p*^KUgzeRԵVZ׌s= C%ې/ wT:ƻ/CNX) WVq.#|ja8V<Qm1~}f(%vTJ*_39Y+;Bs1(5!fi)B?fVYg0mpکe9#2GJ.-5y@qX}nh#;YIԋdwu)Db4o݈ڍ"}"r'jR M%h冡Zt]9x4;^i? e} 9͓#~yG|}Ҩ=MJFe3'MLmDW-DK84GPO"46S7<1UH՛N_KS+o&='TQA[rj8QQO70l⓵ >_CljCWDnf5M gSʱQ"%OϥGF);I&dI&dHv4#T$L&*8ɺd9IG/e2^ۜy`2^xog'}0cÛ~lxoc՛_۴y|67=xo]&|z۴y+ud/z_%O2^۔xdi6Fsmnz2޺v^v9;fJa;{a%ꦴm E@+\+Æ,STAMdDN,?N[C 0:i(لPaI&dI&lbMU3$Jv.gne}-&lNRx/e6g^=/e2^pod&$[1^x6m6hnMO2^[.ރ6mJ2=6zW铌6%^2mڼmxd.xM9lɇ:a+tؠp*c~r#\f leG.r!qG<8x#qÌ8̈Ì8̈Ì8̈Ì8̈Ì8̈Â8,Â8,Â8,Â8,Â8,Ê8Ê8Ê8Ê8Ê8Æ8lÆ8lÆ8lÆ8lÆ8lÎ8Î8Î8Î8Î8Á8Á8Á8Á8Á8É8É8É8É8É8#%?/;N3vZӊ6c;1[>fl-c|̖1[>fl+!/EXRk^(FCK SJ;<2PʩjGĽq XF {h56lW&2j@uR?b <9EG^Dk2]GE4SD)ꐃ5 7n;նԸ"sD-GI;yJfזJyѥKTxt@4Kx~IGB.I)]RO¥5a4EHU2ӄ15a&a 3zG*ӂٜL*":2SCN ŵBjIDz,dX\ m!Rc Hg O:UJZ4qؿh,r)BGdFȞQ2G9Ÿ~MvU~jԛ\$_rj8?4L%Bih:'Z7\)بr `BԊ'URb4&mN >DդU n &B%묡EĽ%,+oX!-(aSxv\6gmcuM23 ^)[grE1e?YcǔmuP|LyvϹ/bSvz;g2gȏScbʶǽX1e {Sc߮=l2˘k/O)7~]ژ }ڌXHLUcJ[_,j9'lBQ3cR}ĔISfu{ʓeƔZĔ%i).'ǔ+^{bʓFlY2C7);v=SoXLyAJt ޶2໮s?SOlc._?̏)SEbqC=SңSŔW/);zd6ǔWdf<˜R1\Ĕr=KySh&N$s &NF9ezz4/č{F{*](Iׅ:ϡa~=4%c]/]N:>aLVZ1)T:(5f{C>. 9EjGIX.'JnX kS|AS I#u:0Qtx񡷟]Vssxz=GI"~/OoiF7A|XŪ_%Cɮh >o)URaP+O##AғGI\lX:"B |T^&Bc łO{^_[d B TW(n=P]Tw F[KApfk];)w}V =_:8"_ױpw5yXc_5Ycx dcM¶Dj:1`PVcU[n%0?sb"mQO$ܣ|A4VI)P.xBad1d*;6WʣUGwD*G_%?XS,冀( {F-{Jy/mjJk55V1GQH=|/U {"/"Ɵv&iSű`;z8AéfŽd!,cxEq~pUJj.ʧsbك/Qs)U*|0JJu~%ϫzyUEG7yks,9 B^e?S3즵>lŸP,{cfw]!x:휗}7v'^j%m'Om1BufC?~ÍyP;B{*D^}?u-GsmFz{hd%H~yWG%7.uЖ[Ё?v'e_ɭ`"-gs.}ŵ/M]_ C{>Ӳ]s~P՜k<|8?T<{:nIwt'hs:7UڳVo,wvf{A7ެr̼xf_ehM]L~ :r%oZk_w[Yܿ߁O֝uHY-UYŋl =mJξ't2*yt?obvUnjq <yֿ\<[)iP"g~4?kzw_qzU/u}U>|9u()ƇNJ+ZxxDžu szkP\8˰J׎gz*wz_y#O I9O$>|D$8m[VdtE9lZ`P \eZQخEgyٮji6Z83Mr"\ 5h'N9q'Nr}3mJ#۳і@뻑_4 }a;!_B ԗSb TʊL\N6uE_+zvx" Q10'hx\QR1ox5K+JM./iȥIó*U, ҆꒖q^?cfϙYr(fHsdf0Dak6]D)┤÷7 alfHah/ҷ Ye?܎\0̐"Mc Hz X9=jeRGjceiYzM[;ݑRTQ;p'/ĥ<8@zH +d' ehZ'6 Oy F>ta tXvp@sC|ˌ\"M [N+u{PK_:-*yY\nš*h~{\VԔ^OǎCF}bvO"~]7`8sf=FX/+U_oբ ,O$`'7Yr:4,zBF\BRhthPO8iiR#}Fܥ`46Ak7BەI7E*=Blsh|@(9Hzk.lf%/F3Hg;Ǟvs I.w~$m:૮ֻイ+ۆo`g{\Ig~ :Gθn{hkOÅ%:ЪקL'ߘwNi3hmZwܪքssћևu+_r}zmGGf ŵM_ίxs)k,,֠Xly#ЅnKyYZY쾆K~ZÌtѡ`q~5>o7P6Y,pxx"oRT4y! KzUY(뀷ԃBSأ\( HQ gGմ#i8t.J0'+/@`AS:ltݑ# bS {jdFćv;kˀPx2F Z%L*4s H8[Ji.}ޠR?/ W+ՔYzL9!z|-T{BZ/+L'W=8 uAvR,P+a6 "b1E ފ!nVV٥:Jލn7ynk.OݐpPr ¸y=| #vOEp ?g;e0u^)S/vtw3fL2$L6G)2^x/M2^x/mqVrd{lx/m zKx6oso47'/ dOx6oN^EoIx^6m6hnMO2^[*o܋9dhX"nvLˎ\B<8x#qG<qqqqqqXqXqXqXqXqXqXqXqXqX q q q q qqqqqqq8q8q8q8q8q8q8q8q8q8!GJ~^vc'f`;miNvb|̖1[>fl-c|̖xc6l4{gLc*ٗ<'#֔tQop\!Fʒ %HՖXYufOGtƹa̍\:a.bü^{vn#='Wh)%1,sCI6dkB$0OMMAZ5: 0X#EyeQ~bQ>[(bQT(_e\76Kz˾_oʴ,˿Ȅ3 WJqCGևCΧ 擬#S*2P)ryrH&Q~\P(  ǩ[L( 0+0hG5V9"t"SΏWd';%۷X""(Mn(%vS3v9rߘGN OQFpN5[aR+ۆڐL[!`TP\1BIns[ʏv+Q|q;6H9 ny^Ow0Bi2Fqw%`}}BQLj{"W*r"?S\/FkN_*r"7(r"G]WW*Q5oFo蚣zLZNgv2;8[ SIYP>/h*+ ˦ =Ai!pLR jQj5Lj0U[Y_aY 2-\b xJ]zxrzO_w?P(x7&?o*$_y%V!$L2$L&OʳQgKw]gKru5["5[[ge VuP,p֑#2UEdIt@<=ax>s\@Ev RdC.@ܥ+nl.0`hqk,\w xr)\ .&] p`8!0[&x\ PP .LgM+LY\ 0`up#M7p+\nNyw 0{<< O< )x9^x^xW^x 7X6;`1,`)@ `G|S+V|9j/X%z _| ~`f_ `ovp`7fB/M(+9pwV{7C)v-t1^̨njzI.fԋNfKv2^1^Q/qjWv2&dI&lR=~.qn҇o*OVD{—>SۨmKS,q/R%=KKVw?k 晹6I oMkM3k'P,ZwCS,2Y4k^߰@G31zqkb?GJw$\АZ5%zX6\3Z}9Q,>%RWUFwF$%骃15M2d 0v\ɵ łlAB6;u߸Јo-F n1zsYP.ԋ7S04tea$(&N?=M)nV %w$[SVqPp-j@VONUe5ݽhCS aHG|/k! z$J!_VЩuwc_V1=6R@J,*+ ]iGԊp­}y(#b-b$,G1JJ?PJ,Tw+fr>Ww*b%QjCRPq/~ͬRg!`G#SUy`%sGdcяP]k3Zj*XU27FvjJө~PRWZhV'E D-,OԲjA0#kK CR/=>qsh 'ӯw6]mrʐ' s5'G$8.Q{$Ag O:՛ڈ6Z4,͑qؿh,/4E(h%loȓxbX7bV~LzN;HVBpoa 1'k!}؜Ն8kkΘc5D?3J( P+8K1S8&dI&l2S=/e2^ƛ<^=/e2^pod&$[1^x6m6hnMO2^[.ރ6mJ2=6zW铌6%^2mڼmxd.xז -9G<)&[_o2olSP(Tz}^_ _AP!Qߜ$Mu d:)+ jo,?N[TC 0:vfx; +dF L2$L֣ zx/e&Wo~zx/e6}8y+9}2=66^%`M7osӓo˧`MRLx Ur$eMWLx6oso47'/ ^WDWD)Ly*:x0C:a;t8é8yȕ\fl-l9bړ#>Pў-B0nś#G`͊HxH!ZL oU3F>MG[io'dϚB;. YE)#p*}7[(?r(rj*tICR:Rɫ I/b#y tVMwU %ݝDJg(~T#E8o {#=S46ϫQzZ5:hQTFq%>l̩%TlVE>Rx^w#\ɑ>_#Fs^.)|E*NFx~Ob>!z|-QX#٥Uj&oW5:_@vR,WP J` ~Vi;H2{>3 #AJVV )'j;]L*_g&͆]&5 0MyJ%VB_(z+f o,RNcil̲:b`?8~zةNœAӦ<1̄ 5aCq;h>@Uet'N/)%U`a aG9y;\OЃc qy'b"vZR*OaՒ"[|2݋ɉV~Ew^D}cܥ"``Nb~@Nv;rXͦЎ(yvD wI5,UM-RW!`G#SUy` sGRXs5a5f4&Z}8r(;=$ThR4!kovmq{qDZuN̮-F6 =Kvht]RhK_k)hd cjL @fTG 9.UDtdk)D˓XȰ$*Cƨ*t2M%hN#. Z)JY7ISvfGZ=+dLr8'M?IIԨ7HVp#~iR JJ'ҦtN)o@RʱQ"7T%O<hhp)LƝm|Iz vMlc+YCŋ{+XVnB"Z$,Q\'\ngw߈)SƻS.c1e?D cL0g_c'~E1e盫(ƞS;"-ily;Ŕ-7nPL"v5<[kȍ)sgKs;Ŕm6?k%>}cJĖZRxNL/\Sveѵ}w[.y聕c]4nc߇cKygKc˜ǵ[eLnȒ?VzgLٶe{߈-_Obϋ)OvykL R_)[U_L^ywLwnb[gǔ>x`fOiLiw1Sv<)kkSv}oMKbٗ_μ9llg][vXu[c{34}lO^;=u~L)㨘Rǁ1\ǒx#ڼ mj.ɜ8exfNjު q dyϞh-kZlMu*Nc!{yy2t}OI&dI&Lf4e .sIiĐt~T9"Պ;yJus(_ t?GXK;iCX.寕V~t>G y N+4ʟg~ސApNZQ߉t%V;Cw|ZT+_rCk]/G>L9k|0}*>՟i\+~QR @[Mk|Fzt0_>V~W o+*C+zJ-pեr*Ȉ%ldp"$vd4PBWl|Bx39U~A9GqTdW* G]ŻRP+E,܅`NJ]zn:zϗNȗu,fsu|c^c=.Xju|mX(%Xj躰-NL?+}ju՘CՖ[ 54LH;Bq[T|# (*n*iGu3Mi` "Pt 7D/厍Uxh]<ѮJyƑW{j-{j=#QRK`|iҡz'x kq Ua|:`y{Ԣ=(oO"KUaH鋈񧲝Iڔ%`q`;vxPB?\c+o͹$ۃ>yNo^Ws72^2{:@:ڿ/YM6Cڱ6ם~Ϟ4vi[xCַ__v-@gP7ߺE?"TZL.>p,?D'L(. 0~\ϗR4Y]L2$L2"UEHn-SR2A-}Z0lsBO ]-D(~lW բlW v4]-ja9Z~UUUU=*z2eT-X{z<mB'~<.{H'6i|hKȯtOk0yK[X)1*JMeE CbsD/ŕ^P=N;<{~MHe4<.i()7%9v O]\l5wkJs8\ 4\@䩸Tkᙰ\*'^?hb* sq^S4x135LMxL?3S 9E235`fjyx#N_9L2$L2$L&Gij&d2QvQ߿L֭o$I==~od&6%^%`M7osӓo˧`MRLx Ur$eMWLx6oso47'/ ^Wײ2dWE~-yχ:a+tؠpBYyȕ\fl-l3|+bD<. HNP.ޣL<|+n4MYMLdtnrݲpTD@p M,ʮl({/D;A!]O.9 Hft%#OiӖҁp:G!tPm ُ.IT&k!FDxs2jhIۢpE)t ϻ C(V8HQa?@v]Q/,?_A5&dmV],v~J({C)'i(p_uBĔd}e(B{O+O >STsTO@yWJ<ƘjiWZ'6SP=:ˮ'QISz&K톚7eRm4Re5s]WGKr->OT%%(¨wA]Pɂ^S)z?.7xeUk*W02J!y')Tah(c#1cP zd`*FD*i8Ye#{E4qk(j88."%]&{ǙT uAw+|'y-E6&qfa]ݞTxx+#<2't{N#ݾh}~hyGiҙhr K + 79,P9 5P@6@*UB{UT&P-@u99񁜀@@.@@n@@5jj@Pc&@̀j ?@h.؊j #P' tPO 07P _@!Bt@-@ BC 0/ (h P} @W@0@#F $4hx @&M4ht@3f4h|@ -Zhr@+VEZhz @6mhv@;vh~@:tq@1@@'N:tzt"%@W]t(&P-D@w!#@I@O=z%+ׄt@} Ԟ??COXYݷl٣Cxq/^xq/:^ ^ Z z:c9\oJީɿtM˓U i G{Qot\`HO+m?m3yggva"=0 5S_r(w,Ψ?wȫl;*N"~EF~odyBᮄRki*\#8D(Xp1P3"FBl7Q6QeQ'N]ƯTj?(nad~ۢ"UyЈH`_P`Ɋ Pq䥝+ho,C籀)LD$m0ɭŲ?Q{|e8mj~DSc#vIyX>(b)o-R9%,4HDH5@)jeZ!v6$ی.3y\9Ҷrm+YұShfUKQ&;V%Y^ =4WW' zq֜ 2q:&\ٺRA%/*&]<Dr̹F 2RڴKN=JvkJ&+8Q?˹EoH_?r>dIIeR{_f 6QgICyR8CNgghƼ4dzj|'xI'x?'99;:<%!<ϦdzA<^ijA<^ij?t6/~\9c9"kR)"k.=:$7IM4$7ItI$iI$i˄9c9IoY3Go%)4G()_8+ROC > _a',Y/p窜OV=ĵӎs,,Pp}G9idqh@ȥ 8E)PIb$vGIl67N9+\ $RҸ2TrU_w?NXLxN](> }bN~?s_^MCEM{N;oېޟ?}LUnu,=CPR,ee{dt潀^)f~@]1䕳WY?PNۜb4Z1~Z1z/rQP늘b/_ y,f~o@~ob\W]R?Rjբe'&9~r9379~}+uyE/ryltQE}N^rRsWnn:pt+t9$mMC.ywӔ ˙yhxhJ\tB(E˭a=Ŏ+T`*<űEJBE_ GZNҧXd-+&(ԟ~P [1JvЕ:q#9A4}:ntBe rQEdF9= JOkaz/4Vi0uŽFw uT_30šEXZ߾(N (J}딞? QY6~G 'n|%*iyIdL]Œ 7-%{̋r/P}&GGj{{.M+ͽH<ş-_ݥaM*'ANt FQ JrX]0)7xP#&s1/.>~.v s%QbB5^MWq5_$Ÿ?qn\UU_T?1ǸoUqnp5;q1| }DoR@#H],om(yZg-K)_8(?(4yT_b.IsoJsCd)m%9QŢ] Ϩїs̛E6'dc9c9}Ĥb98~unaU=Jb?WLKܒUbܿ WJ7okĸgtT=0ߍ+Vq?ꋪ'&TM>0ߍf'1.?!CP(G:Nt@@ pnt]9:0!G&gBNLH reBnL3|` >g0 3|Épb0 'Épb0 'Épb0 0C` !`0 pf0 gÙpf0 gÙpf0 Åpa0\ Åpa0\ Åpe0\ WÕpe0\ WÕpe0\ 7Ípc0 7Ípc0 7Ípg0 wÝpg0 wÝpg0i uG6lЉ ؠ3talЍ h,#Ȣ9h,#Ȣ9h,#g,Eh|ϢY4>g,Ģ9hN,Ģ9hN,Ģ X4&`,EhM X4̢9h,3̢9h,3̢9h., ¢h., ¢h., ʢh,+ʢh,+ʢhn,Ƣhn,Ƣhn,΢h,;΢h,;΢>kK-ᳶ>kK-ᳶ>kK-ᳶ>kK-ᳶ>kK-ᳶ>kK-ᳶ>kK-ᳶ>kK-ᳶ>kK-ᳶ>kK-ᳶDiˢlBwcWNPιfB#"?axdMu^)FgU.UBR7B"]-K[Ŝ%=irB8k%C`lcl > X 6bTI]N6+ *=(Nn#dycto|UO}0SRIMEr$qUYxQ.ƔT>s$Y~&JOQ7wqCνS9af˷|^"RR9q#de'gpL,9N&J4p]|:ܢ+fq =rR$iFdM!,.\N38j TIk&Z0'Oo+&EyTB mvACh]7Ё& ɳ}Jo?o/{>O՚<lKȗP4:wE]! ‡̬(QXC>1")r$QkAfVɇ:zyK?V@ɏs9մsBQ֬YpeEy%҉_“ Sr%;9 |fҨM4+QɏpPC愪US\MN(SXJ@(JQr3&z;-Q[IJZ%֥DrW"֧ع(Z+6B9!cKX%!67:"U[* bL%SQdl83TG)\Kt-jK#kR B~S`8Fp˥%$dJKQVɘ *BҮo#b6E\M QIGƗ!GO:lyoWAWuŎ%xL)yl$/9kZ)Y-9DbY>((C U|"aHŷ($Y˸o%$ۂ&o61)y8Ŝ $pTT0Stw>9sSfIߺs*'K48u{Corq.{ F*r.˼_95/Qtj+ոv4r/C6Z(7ת~)Pn62 q ,W 9ByCC'ʭm,ӫqBofT;Bag-'-w><4B闔&j/[ V6tyP^]5^jufK9{ WhyPnL5^fE Ӭui֪qkkZ(X>$By9jj\{zl On\(7mvQԭPnuN5^j\*r UT :NKqljHQ<'wzgE??P`/w>$c| %uc,6]䆡\j̙sν:UX3UZ1s1lj<M~]D?3u3WO(7.˧'|*/7)ywy9.^yrtz+O>ㅕW>Vre#,]eɧC\*wD7'/y\rש*?%MYe啿NWU{_XzWv`d AAAAÄ>jPO?|*W%!ߣ#-"ad(4&І&< }B)c# C"Ƞ@P0"W4PC({MCY[]D+v|M2S4ȏ${xq9qSr +r}Y/Rt}uKO?O+wBJWd[K5(ކN}Ԥc6nۮɨؘT\OȦ3e1stsO,9e7boOޘ/G^B~<8}d/c%79%hCd7s vWSזLXL 'vM.y;ԘMyU/|T|#i*[/t& O>I<&ç2g4ooDy7i64't7|0#w>*Ack'Lÿ~e9ipMH9niL)ՐL/#u/1F6;kي6 e>3<][DZt|zt|ѶSc^̋'OYə%>>?^Od`frwPUNC'kο{>&t[nb^LzXc_2OXtqToJ{^T|*2|ۭcc6jwZSLHucdQt|QGs95ɵ#)M*C"vLǼUplSH2ݦy꫞t|t:9^FפYc>>w`t}b$d2O. <%ԇ|V~I/4Lli<.MhN&6sT%Iߟ9/MĤJR,OIזINn[,ugu} RffzJ~Sji(])cGof}61%/sy,)$IQܣjI]-此iN~mbz1P O=3n"'NǓ7$%tI~c)DIt|zEC])NO1\^p|+)橤4'M*7zsᩒP:M&K-fgi<,>拤޽drL]oTA|.~I,g_= s1sE.u rd +[I%'i$[>)F+-EJ? n~:y=04aS O :0ʞgp#óZgxV?3`ɂL-NleUhBy (vɀPFL-^;WyCRRA<}Us&sHN܋Iɻ# k8i菭*%Yh6#hv޻~@ $O1s1E`\N"XǩfI:N:qʣ(n&"~鶮Gw,RXuJK +?7&"*&,&b`/+CL:% /J>PT~cFmM^JBjRԵXܼb DJ/] å9Ң⪸jъ†;&yuXq7E0Cr-VM.N!uTKG$jkc@NT?)g0 3|Épb0 'Épb0 'Épb0 0C` !`0 pf0 gÙpf0 gÙpf0 Åpa0\ Åpa0\ Åpe0\ WÕpe0\ WÕpe0\ 7Ípc0 7Ípc0 7Ípg0 wÝpg0 wÝpg0i uG6lЉ ؠ3talЍ h,#Ȣ9h,#Ȣ9h,#g,Eh|ϢY4>g,Ģ9hN,Ģ9hN,Ģ X4&`,EhM X4̢9h,3̢9h,3̢9h., ¢h., ¢h., ʢh,+ʢh,+ʢhn,Ƣhn,Ƣhn,΢h,;΢h,;΢>kK-ᳶ>kK-ᳶ>kK-ᳶ>kK-ᳶ>kK-ᳶ>kK-ᳶ>kK-ᳶ>kK-ᳶ>kK-ᳶ>kK-ᳶDiʢJh^G֔EE!H|1tFOԑJ_A bf1H] )AA ba1Ȩdㄆn GDH/ svcG_ikEq} AQBُJ!!!հsiSsCI#KF\mqf6GݜQ d ~{. >(ܑؑԑ\Ɋ#@R-.:;4&!@=fWr5YCfBc,ߖK97HYV]_"o8]/TA3@,6UIϣk D 2/fR,3׈M1$J2Q>,̌^bu0̉10ue厣\w~@>~:ʜ)4^6\89j_ۘo*KZ2\}?ᇘψ&QO&_1clb$%*1ZHB(_zTN7z'`;\3s)]݌SQМzrv tziQdoC+fC,1(sB_ⲫ$uȞ DDP`/sFWSGl,F*&2:’ܑ4tKiKB@8:6G$*B؁vDŽG#"PA5ZmQ8 GS~ PH.m-С=bm/ŇXFUg5#NzK\.k#X0R*i^~xu$|' ZfHk3ǖ+9 #euvJYro""#l $ 0걉H;Gڔ-vS$GlKiN ~wI+j!lVv7JwVQhI0U;'_2~I/*d 2~XOrkO4 yK*Gu䮻DyiLlnU-T ?d5@!z qEaC}*M~aˆCm/VN5RV?(VHUxoX mBmDA `?`JvWEH {~?}ܞNIh<8kpn)jwi/1UYc9cyqt@ogڑ$%-IQ$osK%i\(vڀl$jAI׎TO3kGJroW<Ղj\sdg%߬5ŷ\e 9Ϯr(w"Vv]QuRH~[|qW5uVj Svɣ(>&"WxL?3<-fjq^աcargهAT[^kP|OL|kI]c`_Z[S>{aGu6gh:o%R\`KD?OUqI7u40E ,5^xB~Wp ()ah!c#1GP zd`*FD*٦)zs2n-w_E{8S[w8J5HNpE$Î$ά ۓJs`e_ni@-/:(Mc  SB:{fAH7B!BYUdT 2P ߙ-P5@5j T.# m8 C6 P}@ Cj zxPs@-ZD!j =tB#@݀ 7P _@!BI@-h(?` 0( (h P} @W@0@#F $4hx @&M4ht@3f4h|@ -Zhr@+VEZhz @6mhv@;vh~@:tq@1@@'N:ty @.]tu8@@7n%t}@=Jzs@/^JzCHg z?R{*hB s?5gvseMGYx,/% Yt/% A /% $A@rMSt$1s1?J?*"S5'Fj~$颹2MV~?`o\Dp{`zk.ŠJEsQYQܑW%dF):U-E|$]9|/UFpP+D]!!b͟g*E  C#oljVoSˆNȍ_ՒP:Ȏ~E)"A666#e߾K;AiVР YPIcS>#Y6MI`4[)eJ-]qhF$ ?$ VrI]Q ]<""Wʚ*rODny[mD-Hv.Wi۸öGT@Yb4*RZťLYZ䒬f/՜W+_UU58c4@ad`߈e.Bl[)a oa@j[.r=<"Wr\#u)JmإRJR5%(xjq6H\A7]9JrO2)Z i罯}E3QƏ3դ<)'33b^?_Wi5 <[ D~<OD-O-g -/ -/ :[?s15)u _tAu ~]_5u ^wwo$&Io$:$IM4$IM4]s1ߋ7Ib^D7 #xN}!M /p‡0щ,Um8asU' iǹK(lQqy4 D^RSR|Q$s ;]$6Ü.Wjji\* *\IAqWK'p%X<.~Z>1'9/eHJ ='읷mHϟZ*[7:U!Gfi()bz^=k:s^@~3W~{YjWWPR,(UemNTaJ~ezz-=͗g(f~o(I_uE_|1/S'/tqeD+H7^@ו_{nTA6!eJW~ԃ<4<4% pU: 0b^"%毄QreMb,ȖhO?GqYm|- k%;JjΑ sYgpdP7:!̲K}9("j~{rAe5d\B^K4:AahJ]kHS_+xl/sC:A$ uHU&CZٓ(jrOr²ї4 'BI-Gd9v,ǒk-d9EK4[Q#Pot$p.hHY,+3:M+NlnLH^#;z :HЈ"X o_Uj'UZ>ĉuJUEф,kEq7JW䴼Nw${FQrR.aMτZ=LJElq(>~#Rwr&^$oϖ`/0& F \:ZrڄFfԿ(%e9t ,.v} q Tk\eo['͸譸荸mM- ͷy.g,Eh|ϢY4'͉EsbќX4'͉EsbќX4'͉EhM X4&`,Eh͙EsfќY4g͙EsfќY4g͙Esf\X4ͅEsa\X4ͅEsa\X4͕Ese\Y4W͕Ese\Y4W͕EseX47͍EscX47͍EscX47͝EsgY4w͝EsgY4w͝Ecm %|֖Y[gm %|֖Y[gm %|֖Y[gm %|֖Y[gm %|֖Y[gm %|֖Y[gm %|֖Y[gm %|֖Y[gm %|֖Y[gm %|֖Y[gm lIޥkK?^ƯK;W 7 =k 5eW/H7-GXV)~BG/K?IY`uG~^~^+K|y }y?/Aǩ*C-->TzQܲ|*W"a \V.h 2di=\N)YW~"ILΕ`av{r\/o=pE$QBčTA8T2䰿'=-(mt!p* swrq =rR$iFdM!,.\N38j TIkf=reڤ(JHa-š4x@HԖVoXߡ} fCOIOY>A zwE@KI7!hY6N)sήyPxtEA-ArrϗzXxзv{|;PiYriЅB ZB#EaA!$ kҗ B7J_N)wmȹ3_jg3NgqYH< #l=i4+lוquxվx͙x8GkxrK˜XVm0:f<Z (&|ƻ#]^#$J7>@"+c^ KɴUFhDP"[ݙ xbJڕ07L2kՋl MKiT8| ħDJ /w.?.4l-{L&(KRͣ!s/dI]OyMP;?,*rts/2-_֔ }wRJ[8~mFHyP-b71:ZfbVUs͢wRdRfB@~^<\`PV.9A{5ubϳ guz{A:+z6On cr\Dz0v.ySJս#mL|&[چGʨb֖ _h_nU!5$1' [E9g/րjՠz7CPwt|҆@U qج-PlOL^{пtɽ6C^i~lY#{S _)sEbʲgs~;iQAU К &9.!(Mj)'ɏsNݿzcKmN ı-A~oj]YOyxxaz' <ѣ@7FB}.u] mݷejtDt/8P 1J}5 A^߸+QwWqA6u: {wXnpͻad,AՐ/wl voYǠ|G'^'ݿ6<;H/ }gU~ؕi6\ .d*߿q7ka<75E>7]|([lH;q~F(}dʇ#[B,95Hʳߩ谲VӴ-_f>sn zÈbh!6;\oC;|P}Rd1eܺ гjd< iվນ,n8^ vmW{mEhRTҥP6u>LԞ-L Ѱp1(Կ`O5D!PһgU@\뚂< !}Ϋ@NM3/zbhչA_:z?/*/w$x#cm)qSJhǏ}pY_^.z:Wr]&Q37h&1I984d\7k؉&=Zm$kR~Ĕ;쎠_tݝBՁL;az3t,>m^ۡ> .>vrMKУ͖OuPa Em%NP}76TLYWoTVL~XN(A&T8;ә~%_O@;_ a69ZQ~]C;Mo<Cxd>sL3U;5s=7)إS~[A:vh F5IE+&w(]|W ~ 5OͶM!CW葵SX/^Y,u~4C-Kr>psCo_{%$4;YIA_fB7ܱʻ;0=o'וF;k>x8_xѼQ/iGAo_AVC ^9i3=F wrg~v0vK{Aުfr>M=u ^w[S2v ksSx7M=NLG,~ coӪ~zc_VƶC|ǾK,B}' rOpл*vzapՆ`-:ڭvs Oo꽂3x!Ōoz@Wj_lou8p[ 2VЃԴ{B{+[&='Bp S&`!6ya` ~ڋN&Z7\bA710]IwMc7_2FL6o)&|H|F;mmxZ-HB ;pNd<F^WY^}06=>Xzc zzBv1AuGi(}B ?09m(G3>} Q˧j=c}g1e6A.Fb㫧\m{t|-"NU R߳>+ rrer7Y}s>7V,e.C W~&Z@4 K~|ì'Z$֢[.m4~ OªZ31yo>G]{&aWBgKmy-J"J[7<䟛dcgm# oG4wL%-f3OܢQj/26-|S YAիdtw1bJ/ΈhNiSl}Œ{Խ Sէ:T":-9]nzouωKp@zl\a'q9(o`m7 -^>Y?vsїf~Bݽvp}og!`rzשd'߾Ggm@~U#s!=v uc;ߐ"tH$zzn8C+۵]FF]u;o5/$ʞ>RMÖ秖oB_ؓTv@]meϮШj!d&b#]iK(]o~/?2m םU$/[ ʋ胞˺p&vL5gA5eAz6|&O0gW;f}J,3Zm,Xw|˿sޝp;Ӕƃ˟<;\yk&Ē&?-uRh\sF9gCL7,v_iYՠmgQmJwY;)w⿀>yi0͆ v<|'dC\vljR /tva0Θ n f~}Axum*VH I0HYwyp^g8S#$.R:by;>c6ԯbH3M)"7Ǟ(71ݻA`gs}^y?5ad{ub{6sIGWyY>K/oz1 I]v!'w(~'&n޴/rv*+i=9k^GA;EO$_+k#NԶ@{6fs荞k6MzUXxgp];S>tl '5wt;9$\8WegWd[ A?A==_J/9,;Jͻͷ ҡ5Zn zZס-vn440 mb/ى`g658Ky3> "`mk01tۣOh UBo7'8U ~0(w/Ҵr26=vְ/Nһ/C,]>7@QD.SFe =ԤM銹|z1T ʮ~wou1*7#P> zK͵7~=y΃=*?|7kd7Tz~pl+')/3'T;*O|j z%z>_yUu2Au˔-'՘vn>@}=s}9U(6ø\󘽕zC}wC^3h0{;h}4h\(Q׵`.M˾6W&?ぽ/;gψVbh!-سg|2FOsqCMrSEMaoMֶ͡/ȵʄ)O]+7ISgC tԂG`yjYz }֌&'B{nUsgo m{ y>N z1~wh~?s _@yºB;_mrĕZ?nG5g48mԇ;Ni_sK|O-׬V-b/7r37}KMJ`+z{Jmxpap}zKBKh冺<ۯ^ |C8hmeOܜ::ֱdj륢 ̈)G ê:H|^}0vص#'?8͈nw.ߥr͠?Of 3-`x+\R}1`Z+x ܇>)B^i]CU^1ҡByh +;~Γ@{|jpUk_=q 5`;c//_C>Fw 5[!5% ;@?3;H?@7Gnv:ؿG\Ǯs5S.|^ ~\aPq Wo5Y jGO2vHmd4.YQKvX6q؆N5OI1 ZAJ;6vpVwVv`sݦg{4qIwgg.;Yg}Y~1u.`/uܲ˷~<|_9m`|q;JgR.H xy!gجq`gL Mq{|n>ɜwkAyZnAϡd*s&.{DUŔŰ=YL?g {@viuL4ḱ[oPAKs:u>w^U%:EӎЯe=Gʱ?z?6CbTF`|=t-pqФ;[S@شL yW!о<&6~P^]֨ynfg\{]4@[~Ac(hWyA *8x:Z^?<uIFmͅ_WAVjW}7}Dޯ&{ ]bԷݡ+*]A]~b[I71v'v2tMo:[U!z[]Ÿp8z둹C xdp=Q)ynĜq22ec%zti#ʥCl7Хd~x\dV'rO߂>m=5pQf:objl< v4/F$ o9L/S ł.9MӞЫk\9=dZ7or-}n{&Ok ςjw΁|mJvz:ȃU5^51\nnp=w1]Cv x Sg0 NS'u]WӃ! ni{ֳO`鯘R\5;T#jaRo,4h5וdFٟ<А{  \FB=qX'^H#p /XYF> \\MT6A&iU4kH2ofYw8~ .=b[&ȯOI3A=D\: [ .-?{&Ct^_zb2v}NsJXi&+y]7 =ϙXk@}TrhZk.%b\jv[, ׿y\cPbmX)@?F7{zx4\4'j|pZ^ v=~¨ڷO_roki.9{+ԓz H׫6Д박r QӾSbK{1zqu;Lykث3Κ0EĬ+עzq#-sXֳ0\mLW{UqƊǗLz֦HS\qPO3Bf|_,u:"&?doh<c_&_|]A, v3o//oH *9C֟у(E+Ьw0t%l$loҳhcZq"ۢܠ~7K~ۗ Sx&צ8޽`×M6<͂q|y'\ԥ {_>o=g.DA-wC(ahu%'-w];~-b%ZﴗU`p3d,h;Y0DoZ)CUjC9-Vwsu04-~z\:hJ }?yWH`gN~mn C+u2`.PzS*ԻGsgT=m[ ȥoG{piQg[4G:vzKhJe6۽z=u315/mB} ]צAkC?jx342IsU=,6L;t{Oc8n?3C̛'ǡW1{Z?~^ #`վ!];-wα7[<oV)G"w9r{ VUߩ8,볆VQ_ְ)f*ůzi%(6nm\׃~5tC4EauߗF?coW+]ɌK{ʵ#ۍPe1dV'@Bւ_UP]VȞNӪ v*ѽcuT._/6tA^˛3a^GP?y?F2GIЮ.l<,d.{l6J T?OڡWgYBkԃ!t髣ྫྷO6};t3cVm#2WjEП䲡o.ml9>m|Jhw7%G.mA߾;U=xHQ&$&7;M{z7z; eҁK=?LNꋡZVe(b/]#];ml}^@[=n^qg%&/w[ M|ޢ聶u Gi ~`wՖMoc*ܺ3ALj?:쓆elome;1ihuBu-إoc|t_M? ^㷡; ?4>~F鵏rN<{Vs$@m7mE6,cZ_:|9hC۠G )"fݐM cUK jAx`nd[ZUײGJ?Z+G&?Z5>m(Dj_[B=^ٸ$OvdghjϮ ӗWCڂ]L ^]7h2W?N1jqCEah*IVEGâ}SG`|jOaPj>OOCzˀ==VfP=M[@zƏ=_hà})zv ߚ2/x{WP}8E<q #+=Q'?6߼ ="o=OmkMvqe=@ *z(5vP1S>5~ڬ;n<K76Ϙ5 [!|rv*bxj{J IA隆ܬU'Ƚl,@nTaf) 0N20Aen.Nkѥ9h^z\S}'kz\'/OYܢ͗锶j ,84nkww0L1ڷ`>1xel]\QQ гw/KA= YK2Ӵ _}TЇ5F8;ĔڒM7K{_kvzKi1ʗSWx6CN4r34f=)*];{ɇ;}jA@Y ~,s> Ⱥ~A4 n#CRM({_J藰*ME"hg7 [釦~㒭=fFC_:l3a@f9> z}sg7܈c9)>?` :E=@Duz}Ztg7]1ܗdjG\u|ڰ 䇗G5o'&W>=p|ʠ[:61ډN /.,!{_gkE#?A9ެgȬOYYh I_\R$<403M͎^6蓬ԪVQ~\z=ó_4wjUV7ٱ䣥}Y32pP?I=^~6h<{ 7ЯGF=m!}p$+@O[y^ϭ'Yvy=>|J1)طY-|@>;>Ci[kJi~ٞu6ԀOvt}/p9~3 G3r(GFf6qza(#hKS_Oso񖹭jNb2ξGK=|-(_MA=k O"u+7ߍk?lVm!α H(w߲nP]ׂ6MQ{}l}~}yBShrWhOrc3[@SJ+ϬWCŔY\ৌ<\vth5|uU7G?V߇+_ƣ' Dzq?¸'7N0Wol=s}|4-i6kf^֚5_%xWGʺ7b2^lRU⽫moiOzMۍv~~Hh_=رrwW߽MxU?h 7]}[O~ZzȽo:mAV~kֿ7Aytb!0˫><]Lj86kCfɕl={u#65Xaӈ, .P էYszՐ^ϵCNpm*1C}|`ŏ0me,>YjD}odf9n﹀ Wy]hKU߾E *~YS+ѫ٥05r )4Y<=ײرSSYC=@n_>ҩ,R'=5UdIy4{yg:M@ÑӻTieCS$/Նq7n7i&;_@S),9MvHx[HOj﯁3v.ձxXx[/pKM!kٷ-ؓZw\>xԝ'&s5@}!;ӑ;vSM)=^W+5G\WR[8Mџ cYnX>5{=-2@/~*ҮR&Sgn%&cڔ؇첏7Cee{}zg9O>z8] 俦˦I'>:+[m /)#&?-[:9+B6|Z2_B]}~ Xc3o{VZX ˼_Okh&/5 y;-+/o= 5H蹷Nٜ#`ߚgB}6<%w@4ݫʯ G-P20.>hZUЧMr^B~*M8घnD{(rAϗn9 C~hiV[_; hY\㔜;϶iD[=SyB!HhO+A9?X]{{fAU؁gۿ?? 9R)sǦ|A`jMhO=0z_s3|6ۯɬy/G}X=3&95# BSi;ohО>ٗT>3nڕUx蓱>B**o_?h']7E붯<וovdAKn?AncV`g2 vXy*4anMǣ)}' AP{>LpvE"Oo%$nq޲FB>l!} =ZBGGN1p_ vF';[N}:xoh/GQ~+g!u}j))y=Ryj=fz/AEﭱ{є[1>_Li u^g{wg]JvדZnh۴L_S˥~\߹Ћoᕌךvu̍+A2Pe6,[㎫aU]OR4B}F=l$r_+YWѧ6ans@m4s;scڇĠfTFSF8Au70A3{,-ӥ/'}ACЏr/{6𼕹?nݺO) ; w 0LwEB"uá(whʄI w}u&׹o8Ykh :6 flD{̊4ր*m;5Yxc!`l?&5ݶ g?ݧHP)Ԧ׬DS&'pj7m-tg4>zr DQvч7fBc1HG_3F 4 `;h/^gZr'ٗpa}u+|@3S۬3Ω-!Vgj/^jP)ȥʀڵ%ļ8< V3^2OЗ-[kN4dlKȿw̱~b)Ͷ: Aw_\dgݻס{ppWmEgR]u&仇^T1e:u19e~2uepSu׶ DÓ*vw0JQ{Mw"K U ܸ{ nW>O-[bl-vZroGmy|r~z d L7pN.9 j'b;M@<S@}OmlBcA}k BˌC_0dpRG͍A7S/% zJRR@U|>|6pWa>_?p$= ziUxTpȧ7A?j00|JwC߈p>qܣ ]5n?):i.&ji}YAK4Ĕ"Ge[@90s;9!h^.lǣ/^ 5V&m79דʞMf`]!ov@~ $ԛ/16[bشzr4ܭ8aeDjP? 86,K_~p7!TmO7+T_ 4<~090Y6S&:~r^=:ڭ]o9bEaf!&h=b{v7J(۽cFBQ^L>1r9AU+r|,]BmC1UeTD{X2+n=ZĩkB}C_{"1e7bfA^x s,bB^ЯZ^nj \hSzC|>ן|F"M=;yUw嚕ۚSI ?_:wcgk?5! _ͪ7zob;oY3; Lw|x3D_.B?ljb/CXw:^QVT{䀻:{.h&{̓:vSn]֠3;MD=V1YkUfvFN{{=,4l/91=SϷD/;l5U }`7j/&d.f9G@ xKc^g}n^4my0l7Xul^=ho;42\>pyC0LgYp]2܎F/ qfMSfcqMKowԡUn/m\UĔ嵲-?B+wV Dл" BUiK/ðj&*Yepab2})]Ēgnv+36蹩kmR!S=kY}hZ۪Z/ψ)f@dGwLW_ CRP?:{nL=w ݥP>&C+'UHOn_wݹn.,>Bn3]&;jCM =oE냽7lxϷ;:}+ɕ}NRI_WYB|SffA9NM ]4dؓ35cF׻.5߷فkeپ 3ZNzS>A>w֝CXI8 r3_>%G SF_᧥$h?Z Fz`h ~6]{edæT Χb4Hu:d>l?fEiK?]] =.Zǝd~^X1sʴXJ$C s;ZZaد|;b2[X*k.N@k}@ו,j. FQ6S- f>f5hc|l$a|}D-6V>I[ǥJY׸LD{PcPlNCvpʆ^NxU ~\&nпiL0\{C `|Z14z}6ȷZJ%>W tUJg\2 䖝a6|J/WmWw LNw5t#LkVaƨʗ{y;>q*o٠W75<:nvЮΜ\z}uJSˮn*&?0, +^hM޶V+9IM#4vJ w~Zz]w:u _i&R7<[*+C]F; غ=m !݊ܪs2_w]{<&x߽ hj;7e܄H|Jj=„`l[K-^y?~vf%/cy2}l -BDvy*h̀5RAW7I=hس*=WVKfa77Ǘ[b ʴJ/&sn syR>V[?K6 b@4=0z Uvڈ)%/G|N6ԉ^ rR'5}nk6 3&w,RBT_O4:;q)ͲYu!{B~ZFt4Hr3Xj=E>7WiםCuἧ-/Y8)m{ӦP}xζᛚ`wM]-l=t{OQfuj C+8f1 ?5AOʫߟ·7ELY>/y&![$FOG+^b 7Mef~r-w8\ ғI}B;,e.s\4U'.'̩vsz4ٲUugPmhza*{)!OF9K|?Q[`=Gϸ~閭=]=ӲS?B|o-Bg002sq18 /\ DZ ݢN{2ZMs?BjޓmHow'iz"R`bG??{!&O o1C]/Rw>Xl='үk=[s!#wS.^9V[kZQJAOGR5כT1^y|tP?fַv__zI0.} {(zND~nR:H@oSm9XdǺN\MPU{h9 #/{L)ɠgz4 vr', -Ӊ+~n46;4ψ$VS= s~ D& v7 ݷ;qϭ>̃L.}oޮT4_q @?/] %fe&FCx N1ONvҵ./w^\+n EsG`ܛ9i]B(JUOlvuTcϩbyl1w udِruځ|2&ZO? QֵI1IA-=*įm"҆|9 ]'1CgOӳ%B }-FL~2<< A 2iVYfw)ޘN8Yu6F#4϶Vu;dTmhŝC3j<7t }n|e]>*@[Mн h h_nkX?l}qZwd_}oWa.4.u}C2voh [fYs?iGC  ~7o}{1x % )[^>`+Ϛ]ԗ.!l;}sJmDhWҒ/کvK{i: sVz&=ЊԊz΋VBjjPUG'ml}Vz*~]׶*[ڠEVTJ@~=s@/|ot rQjq+`1>=$*=-B Wm&{o^FE`˃ۜ-;mdwd?oPe4߯)evYB,w+W=:fVv`O>o oN zR'p;Zs&ߚ5"w+EؓA[ r}qܡ`Ǘk?\ibyc4O%~s>|;oEf 4>i0s' B[D+㊓@zvzvF A+ [nGןîu~ڧ@9!~U;횃}T(yˠkA/c05G ] [9|`\SڣicC< zac^k-7~ہK2ހ]gzK>?v/ؑAuw%BN<ڿV6z:,XM3mKwZ#g[ ~\ε{W~oѸՋn=Ih(?i }y fΝ} /W&ZL=]?cP5㺹g/m5pOJ(1HBjf`'-v\ BZ0nS5ϦS?xmԮy3jM+sabʨ] ˕ެ}qzb2 /+`?/RvS/=h[]Xz:xijлvATw(ᑨ#ou=@>z8/& (lB'<#t{P.>&пg "̒on _ԵgTu`ܨ7]7}eS{L _^nk=61 +~Z+=sh]z"_YSϟ w:!GLK|@L:jZ =7r up _xlliWL-p~iЧĽK]^4lŶZhZ ^0|yU;-g;C`nBb2fPU ~=6w2o-}qLHrOV츕ܨ90^0iX')|7htKT=?>Q(DtKi:F@ߟ4G+tݴmu>j+={z &?7$B)VW?ێ>7Z7 {\!&s^߅cnhDWrk!]߯~.Ѫ͡y 2߈ړ {ANۃՃ/ #OdMx͗&/MW|tVz<~C/^vY<}ow8}5}m So,oe SV/ ?;|~m3 $ԁq}G*G@BeũLԦ3ZxE(w^_;?q57ǣ僖>#&{]ZLzbPcߠܫ4V|^{&K_Lu6r˭5v [fF7oraޭ5֜ AZ->GZ768^Gf>C47}G(xv!u 9K*"JXJ74l}o`:}`{ȥDE 4h#VK!h Qd*?K;ɻPvOHǭTO_d$Qůr*+Wv|.<OF.^YғO]^U>eY(oO_>yBƕ!翴z)ijWU`SoGtrC^6r>TSr+gy|cʮSU 9.+_B|SU~Jp雲!7+ <%I%}5&Ո:ߝ)/,4Rd"4iK.V @|"D3 v(ʓ"=RԖ^|/lz@T8#MfLK2XyXc&YL3ۇ1XA]QsB_'y` ѝuDP`/sFWSrtnȢ]ѡ<~6S}%t~B2qDE;0Hؑu:5"› QEOO:0f)?]?fZq2sMK$ot*my7ЁFYFa+ +3z<#i'ύ)ӌ#H݈]aӦU &rOa0Q8I!BSLջ6&zTH͑5AO#L9"0M'~Kq]͟zVѷpVv'''[=8Cd׶V+GcUkcyb`_*+{=iT#oTQ ^15g+"Ri!4oiw k]|Paj\M+;*K'n5MwRw+Tx7n [77_6rxjb\0ߍf'1.%?UwU%}` 8ŸwkƿIqXP JL]CLȍ 1|` >g0 3|`81N `81N `81N 0C` !`0 0 3`83 3`83 3`0. `0. `0 +`2 +`2 +`1n `1n `1 ;`3 ;`3 ; :Atf.lЕ A͑EsdY4G͑EsdY4G͑Esd,Eh|ϢY4>g,EsbќX4'͉EsbќX4'͉EsbќX4&`,EhM X4&`ќY4g͙EsfќY4g͙EsfќY4gͅEsa\X4ͅEsa\X4ͅEsa\Y4W͕Ese\Y4W͕Ese\Y4W͍EscX47͍EscX47͍EscY4w͝EsgY4w͝EsgY4֖Y[gm %|֖Y[gm %|֖Y[gm %|֖Y[gm %|֖Y[gm %|֖Y[gm %|֖Y[gm %|֖Y[gm %|֖Y[gm %|֖Y[gm %|֖].J(-:Վy~1av2_ 'xdv_v?OBC|#EACױaoSΩM͞4Nv.el d7" j 9vSRA,䤅WVy{UrY/T5&<"F?is zWe[R `6`˻ynT-dZI![f+-9~ m@"i[}_>}oGa[yѦ,r%l7Fd[ɶy'jĖj$waVLfo;J#0ḐgZKyYz2OPe.oƤ|*MϏ~M_O~?wf}j)=?Pv]nWw!m5ҲkTfjYyQC|p6p2UE'%[D}>:ɌH+kl5_wQ}A7䎿ulCb%SH1ؖGm5µ5V#JWTJ>h42N+䕜+^I^|탾$Pr^>_x%yɁ9c9cw1cyq9>3_cs[c/qUn>0@U=ŸoU5>0ߍf'1.%?UwU%}` 8ŸwkƿIq/Q x%yY$W'JL$/ A4WJ߽{jKb%1-@ke;勺ﰢ K] nV/WWJ~?o| -bW W+s};-WOxeȷ| :ĤOF|-1t 16iw=},[Q>۲k=y&P EjTl̕8H&]se!yڀJ[NƬ\p=u-V#ċcrOL?!sx#o̚Z|-V)O/Pc^ vdYQ~Fi-D|!36q%,se\m%qߊrf(2F"lEyiӒM 并ZQ~R+E_T9c9cw1cyq9>3_cs[c/qUnb\q1jzb\q1KS^G$!"^A"4W|Ҡ4eQ?"VJz^ (#+ITʻF Z#sCŚzɚ|rrGbGRGB/`m"ܦl>ՓŚZmO],ۯ,TW* ZX C3qńj-i=(iq1jz%}`ܿ_75Nb\3pK:K\UEUqq&\UyI _ \+t,Hndx72F& ndtF& ȤA4w#F+*ȤL幌=WvBvGrQvx\wWKm]q%QE[Z2pa_Szޛ9O׉S+>t/%R(`o,vS<%tQ}grDi|I֖ O(/NWcJW14wm Hz|HD"7uB]9foY۬0fm-%ר8O*/b1I7D̓4.YG_ZyDY"c;g,jgaB2BZj,Z鿆SֿZKو /_֎~ U25<\8AU_ߋ{eAzHXy ӏqqD\Y*鷣!y3u3WO(7.˧'|*/7)ywy9.^yrtz+O>ㅕW>Vre#,]eɧC\*wD7'/y\rש*?%MYe啿NWU{_XzWv^nn6gJ_ZP5 E_Ù,H33_nn_A7>@"YG&IgVus(:6@:LAx;=s k5Uf@ʀd(@qenoQ\[(Эsuy*E*CEi i"BB K\ШY(JLɜ)!S:ss|x^{3|ֻA?57Yl|O|mYl`b:F#ղZVjY-ڔl/_V~Y/_V~YeǍ~7k~o;/~|߿WIV~?wM?j/?j4c-_V~_~_߿NeOo7Y?I~z[Oo~y/oY?-7e旷/#L 8~6YS@ѲoSGeܴ=]6h Y>Bsl!ggG3(]/J1cB_2k_?%{ҒaZVqw}aW9_$mv3-"c|cZ@c:7'OEZ) # c|_~BE2X?/9 ??9̟A/>5SJ|E?XEǎ1ʭMK HՑ`N>p=ַd /ۓPR?mjS* 2ȴRMKS k3?}VrMe:o6wJmKɂځ>R>s9ʶT^ +{IqfOm"OK>4/'|؟칕g2گْ/[_cu/3 PFb̸)'*̥\5JƂSDM>^#vWPɁ 5$x*d'"Ӳ tu=`P\V8{z `u^^kv\Lu/Kcײ|o~Ӯ?YO ķD77_Fps޸[߶y:/y4i)w9}{sz@N[.87Oq}9linKtr4oI%`7`U<5kN[~;ğ<.M/GnpgOUk[1:{;\7bԿ/5ߑ"?z|8߷jnGZ>_ 'R\o<#7y0rO5?o:w͊9[/UJbLxfI<Yղ*z-gUYUI**ɳZVjY-eղeܯFVjY۲^ߎ?qղڿRYoK?/V7vv=b7jp/D~/bˏMXm?w5W~Y'ΓX俾cUgU'X俽eUUI[V%/oY俼eU]IUQX%1Y%1Y%1YqlmVZPQ^֏W?XQ;*XQ^(Q_Qw*bȪ(ɪ(?}f?}?dEg>PLj(jSZ'YS+RJsz{R &nvL 7S#*O>~RyEhDMXIdɫ]S\_VppG­v^߫D1V)?d7ardO#S|6KinE}c|cqyɝ;f sq4=jVk-w+Lj';j&q';MMm*WQHn?RQD׊_+[քP<\Q^mE_b͟|5+VE{&qO'?+q7*JOaUA5&05&2tzzuWj)F3B^?şVٲ~֟o}hտBQ?|?H V%TR?_&ZXfC0U T-$j/U w u?Ȍ_U t.YϟR;_uȼd_P)/o|_vأMqzm)N6K̬K=.Xnÿ}좵SJ:/%{6pAdyGOQ_JᴏRc?UIm^撔z4")(hM|s42sEY~o-e^!S-}?PAo6o^*?F©W&~9k¹\<\Pm_bdg|߮sbr"߾{46XOu_׷cdm'b'oۿs&NIB&Q} jcdw\1 /)yίU#p6AG G%w$%(9Ua k?B9̫ ^fT|8 bWk&!(޺@M;9Z8:s|ps-JJO(^T4@8UmcaxRܰaS,yj_/ A+v&(E:E4Y.ui ym A ̜:`ŽY](4uAZ6xNPRCQc!G Уؙ49_fВڋ_ޝi_\ǥ;aW['MI:"m5A j| ]?]`A ^=hAv=GP{$iJ,.c.M6zP v r@~j4?ͧ6֜ { E?\&d`UYFM4A?ܢP:|>afȳ[&Ĉ([ >i^ du[~Ҡ<4=OQ2 &LN_vԾsh}2e{S˗]VΣ1뤏aU 4}i%=x31WGN+=dtحDRV95i݇Pbgء@p엸UwvnM6EY}x3Il$A6-2N$X}q4/+tʧ]XFj:B+?>ksMfCe߇]*v SN ׾w}Tg^6MEhX^ bԑ!|гX]qyd)֢Gz=vcI ]?q MVNvl"#lI|OO56Ƹ¥E=,xpA :c}ae6 J(GP|6Zn(d>` *$ӽ _s..Keb Y 1`;|_[j;A&4bbȁ{b ߳IX#)U`~:[v&k6F8~{z<mebp%$\_|j p|"GG;|sͰF(Ϯ Qb6ޓ0B]u?lc gkM~t/c>!`: ~gY{8 eGL)=6 y>y?.^?*znSnDS= u&B?  ߞڣSOCL pyϥ% 7/e 'Y#!v)q ,))Yie5/(EpfY`a7CZehq࿠u!AM:QQ(w^Tm;` ޭ`(xZ?`%At]JN̓y~~jk];)ơzyUv`:LaQ -d7@XfXuAwv,fg$ _6uB.}) i_mz|qgGf 63wwQ8NZ8*09J2uYv݉4ȝa_v"vrxS\=,;hhKSJj&e4yw;AfXAy0.ca.gO@e=|sls71ŶN!π͏Tw̙?vȷD`W8χL`/N6[O:CQl8a~Qk-Tv|y'lu|gɄ+WKSY#W΀8kܥymI[ {>?";{*psz=2kXRJ?k~iY;~?pOk6o&A& yvѦ1o_2} 딜}?|{:Mfnyw?x3%-3FzDC<6> vl]W4U.L=~xP#;"븜So$I"/[Ϟ9ZwKn/dȔdı|{܄\6SK,njr]l#Ls9J˻q2aG6B>bɐY:OƑ;{z?8d|a/7rQz_7FylKA-×ߖqgzM{kJ.2+z_Rߔ |,7<tob$GBysA)5^r/LE{IQ*J+!OkՎ ̈́ʩ~oꌦu'}?8O)8?#~ȕT\5vՍ<g4r2|-+]7S10룩 ޝB8~y%Gr8q=O`0kEA'ma5_f|0y>K/F} Mn/;Q7ڽ,$)аQdƂ=u|iyf⡍ct $ߧ<|9'ґ7aKe{=Vm*V9 =mSin =[nw6wXa?>R wBS6|HjGu|Cb7-j׷ 2(Cej$7^1W0~YER`.ܥgDClBZ= ݼWq9[>ASM~WsLӔ'I}cgC'ry ^w zSMI8Ι?|36ms \Jfk#/fWP7_V|G"p.cguZ~!o41n"KeO襉bp_s&_&qX\(7aOM+r;]<NվC'ga :4;  ܑp~qa.|G< s-;G' ,-]t20 xzk% ?xgr?,im.>{%/w@oBsgz+G{(s gϟOSgCGXto{ߒ1-Q%f~+qn\_({2|Zl 2S귌ܶɒ? 8pafA%gFl7e{Ow>_s? z+vf(يil?k8؉RpKDk y7 r>i59XKkbcttM`p5=zkF].CuCFm#4@ :85`/?5 Ƅ<٬{1 b`L$tB2]{[;=o`׽Th=(1<-A>~7Vxл8hD}STs Q Y3OޝjgaOO^cESDM=Kcva=F@|щWD;8n1Ě&Ziw&9m衐  k+5qbm8꣤oO#~Sو#!Hz(GɶeO2%F%+ "KbK_q|||ۈߕ9,14x lW/a!V/!K&^j͚>cza:Sy^=d|̓6:o 8Ga,pf6xӢOT,Fp$ƈ uK9̧} z{P3MPj $q9G'#88U2!?BpۜOKnM1z)u8Ѡ.MC_n v5Բ`by*ET\<\4B!p28!5F,Z#`_j4Y9J \7&El4%x_h$J{{$^=]KPOH!_M|饜td`u2Af‡ Y_V5816jNA6,l43H~~xp R߽o\e‡fחg"W*:;y\͵,UU:bcV wljq=Fغo6W?5ރq|4{ $8#>dH- Bޞih]}}fkGaS/0ס'teLE<BSR~&vdBMMYfB W\:4s >Cu>LnLF[|Êes݈fE U]x?q+sO ?RC6ēZ4%H3ʡAI+!$paB0ĴQ'njAIOG|g!s]mނEu WffZc~Y~>shTؗ̀K_|mO,K=3sK=;+}[,x1i`ioO'﹖{|3r/px:}[ȱB^ng k<,߱0Tճ8z%)l_!-(j/!~vES:+vL'{ Ld.Cl}˹rD["1~q>a"q(F}XZwIZ2۩͛@q8ZiA:+d5 ~(L>;ʹI'W ,Xk CW&C͠k2pA"{`e,VrЖ&  QV|Ks;eq^y7!-|j6Я}cfUFJk uxʵ֦)s z6tX3ђM9wg2^/IJ1iDAi@Hp\g'/|>7<+h/s"~?srVN, iYAcD%ͦhnͪ]`"e$aco{5ۂ^r-yxZ![/B3Z߃;e7e/t>Y =q,H?Db\jD0֜dr16RA*-Ԉ^~Ͽ$Z[XsqKy7jϵ;zo!gHRۆo?2M <FnLZ5;7d]xts>\HEUL!7I#R ~!W}FرuH²Űᩣ#IHC/Ν#țǴuׂ˝fWՂJYښ2? ::k*MݝIv䙲.b\S i&#=2KI:=jD|AvWzȡܴe]ydBȩ`~װ'}6Jag-q'E1px8< 8qOmiS0, a\a1H` ȮSHS<.̄LhSVN^` f #Vo=?a.o-qSBbgl$c*!G+8qsf٤K: ']ϸ2մ3Y-i:XYcfc Wh Yg|ξ{}8Oxkܓ"rݒ2rAqd[H\_4OWn97T~N#Gw;5-OdeZe^e Mϙc:2ř8竟c>UϞFOB\u[YP%i<r s9adWMhNC)\Z8OCGLNWc%Yy:Mq{ fgwI Q] }p^o\yD YR~-OlO|#x,o2qC S 'Z6舴s;KpZ~ɹ=1p\ÜtC}ǥ]\g~jkKL?PVONﲲ] rE\ao= _Ĵ*\@g3ʞ-d.w\kbḷ3W Yp\}}:oa?ZJ*p4@^m0wzk+Bqh_5lˣ~}9}OhEoԡ] mP|e}YհܾK m WC7 ;8x8_A//$jŦ<zqQ~3^ƕ3<*Vrl̶~Y~9fy^N۰$ksɲE}ج1_=E3 eT?X9dUũopx}6s#[Pp-M#q]8c_ln?Bu%U&0n5+m0Q| nٕr 1vWMl#}7pN3*I|'l[19pϙ}|L īw72qdo'Q,7k\Mvψ\_ MF~!v]Vک'<+wv"40h:wdi~U̦,romt`{#]xAg7Y)^.=#VC|s|Fߜ"Dуfۦ) J-rhh'ص5f]!%;쑯?_bx[qW璢݊/Cxg$e`Sƹ)㼩vB|v7 7/bM<(Z2`5O 5~uJYy9WvH8VzYx[OzҾ4Yv\&(lĻYMAT^{<[;Yny̧Ж&G^jJ7xgE+ S8^}f.%3JƂ"aq)Rk\>civE!. eٽ6ы#.s\~Y$&xy{u2ÞO><uے L uE^d ahNm^WCZ'!/ZqzQ?y\=bܜ<-{y`dSʆMeވ 7r0ѕ"٦/i~ć: W b|~&#)-gۙr9?I9]- }7>F~NNwAđA~GR.FPz'625i9~ri WV h Rt^#WD0+\ mi2< ZFbXuś4y|0GYR^DKp%,:37IQ5U={'No?zcd V'%,޲b~}=?._7m>V lWFyw{1 ^_|e椅N8c} soK8ߞ\ /=biM_yy|(nWk=qc(䉼k /B ?UzUg3ueN[=v(|E!BebMjTkg̣e0t4xv q$k5Ug]={@83!AॵW ajT1arj$Ulr[f]T=AqfۛJn wr76{Vw[kŰL>[.XNucfo=ܠNJ"Lîn.eכ rli} _% my8sm^}\n1SդlES } NevpsRK{$}Mk뉆ӔDSi=:"<Z9[UUj!?GO,Y(/Ƈ?CPqe\3M=A^[aYAfL MC:^p^H:_LPJ -n4:)D]Xn<$̷;͜Y\`W}< ~l{ߪé[Ԯ]dE||#SNN#3s'?\[2?|gNL[krA xQ 轪*݊OQ-c0 ܟvmՇ>:|7L ? "FZ#sMAotOB=g˓7#ztsA8طDI A.n]o"1!<:]1.EL1oW}IP'2_.~ɍF ,W2׵\Q&Iݴ}-w_<;%o^cEF ؀醽ƕ㡟F\uyGq<T !ϦVm~ښc<;.m45[Y.n=/mKWR&ȧqj“3aWwHU֩C֍ S!sOEgw8O&^=}&8Aoݛ: ߉ooISBeöUПBZG*~5cA <Ӌ8zo_}4$x*"y~) rᷲCjyyl1!%uǥ4|s5Fޯ^+<╌Ia}{nHedvd9^,ߔ#,C{|??a ̇;WU xN®& 24'6G yܧ*/}1鑨G>=~8 ?(v'xbJ ^ݫ.I:P Gm 򲙰箆Ak(n6\ u9#>{fyuEQȧoȁ}I}K1~'׃8",kA|/0 >yRU;.eWmANu >C|8_*;nףN,(D| ٳrRɐ+ߗ |3W9CSW)93-脼o^TC^{j%W(]}x ޡyV臝l!?f~X9.ᖚ8-W6#_|[Y~ >"3@|~Rď+ {L<.xwoЖD:? >tlrR9a#g0M 5{} (St Cj!61O2x}Hm'mCGN]*:G؄0n?hV^9*I-Vh;VEb{Y9y,lYsY~c򋎬תO]#xe ^N熭< {iX8 \ G1FI3}{%xЏ=#8Bo1owzOKνYhJ]`ebv)KU ޠڐCk\ff]JG2˪z>^ x}P.XIpE7*ث먐Wܛ'`g&Hyy#o" ״4( gWIx'ʢW_dY{Ic߶#?{|pwxnҰO]2Bu:WYqz"/{"!4Y=e|h^{h[ڷݼ Yȭro YwpxwZikd ߶~oL'È௸|'a<^c;*w(3;]۹uۃ&q@7?Wt`lYO.O p*GmvQ'{s|kzM*TuYDNgRlښ؂Dxʕ F![fys7"=ql7:cܱyC>Z(qAcpɪ<\%o\e1oҠJqU\p[kM>1GgRQ*mO?Jx]xqJ dVsnOSq/NK[93ɦ91I/@(ͳ^[&Y{ܛlR6r2Ӆz/qxϦ4O~jΘr[I.W'*di6xJ[odm=He] JMHқd~"iݴ5iE Sj򂓹==w+Xh|VL ՇC?gKQRѲ/ 1I`7OIR#(u`'Վb <=iaŰ3 ӔXΘ+ KєE~4@wjLk PN(Մ^RMghTl Iڟ੧qMϚ.LS6{͝JYdaWq)n }W[ԏg뮦))~\."0ka)~ (74Y9?劗︲Tc㮲c.lR>yt}DE_[`9mn䖝&O'\ES iL`W6K&T'%17W i{1}åcu٦XgSE?vO)Y#3i &+Uo&EPv_K,(^S}Y,u7#vuTTya5̗}AR[{I |ĔTČ`6)i7{62Ogi\ q+R`{Mo]ȿۥgvM^\] `OJ&Öb[W]pi3Ӑ^s$D`~Gm0ȄO~t>rXIi< ӯٙA qNU˙ӌVO Z:NY~ٔ<_ɛ6^L{/4 O*6*C>xsTJ| ҢY 7vДJ&ijh-?lQk&ԉ= l\(Ip#5{:\\oImKc1~]HwΌK٥AO#^=̩({Ux3#`ыv\{i +|(臗 }u9C׍gG[6>]&>ͽ}zz{I|8?nKES˝QؾdI0 ޅy?Uq?4~nɣckˎS_/ }7 -NG:q$NIۜ>cWG_ >HEz֟3tF=`O5^~lS}k ~J;zpO^ ;I \zNүWx x:-nLJ*5΃TfNy迾Fo$cYll%[3\޵XC4:JH2$b),;qտ:6-|A<,^3{S65 ig X垖sO=SԐe7ɀ|V#K deoeܶ8Wxh/Sݤ1e h 2`2.¼j45nt@ !ֳ0v7] 3P(HWHnŞDxaI>eVUkGm$ |}߾rm ?P>R1,"*Kk Cj]aw#mmS&cwS )*ԷwZ |^b6\0G' v58vڋ-{Gϼcj8nM*bM~=/~[E3'.%/f7IZ?zs`ݺ2o#?:>wY?9ܮ{ظW Jq=[38d[rb4đ'N8rF3Oj{];v#"cs2G<ۚx-qڽ}Yp.ΐĖJ \*?`o F|b{xZ霂8x~_]!Mn$zS 7 sc| #ߪ0| BEFW[־RE?VN;b <&kvbTu㧳qU\܋JnF֪q4|qDȻQ_DWu6dz ԡn5H}4%^ A~8}'svHYS[8xx3<luh ѿ&-nh7z<*y6y8EQC58>䵎;7^|OmKmM{mڑ]|g[hjȝbiݏ%!3‡f0SO|ȱ6E~ыhJ̚=+ g!"I-L0G+wmM49,5c>Qz-%˶ßH}$B4vBUa<QG!־]4\Q<.n5Vsz_ w'}Tq,_o 0p/gy)wԁY[0wt%M>8Tjhþ *S)|kiru_gO.Nn㳑" ;; iہ/oNVnh9"s{ YyF[tP- K%*jY;gyUĈ u|%y9$UpC,͝$.~7(AUY"|T~v7#]5!GS]'y^ic9;?Nyݩ;0O"B x9l*G^"1㤕i"뤊3+/y 6, pPNsb?eXΞjUv<띀_Ĭ-?NFitC$\:xtl?eZ ZӆOޛ1dQg!ss e2˳\$)0̆QO& ?dWJnn[;1"ElSN.n~8yM|c*zZofZEeW醶bdjfKLU;mμ33O_"Mx*#^L/l:=r/ed\ȉY9TRs52RT? @\<ݹuZjKu{_eIq൦wSgܢ~"=aP٩cq2pްƼ:yd.졏8W`~mmU͢U (zw^RKͲ0'!~/\yO~RΊĎ 2A(^JABf1ipȅYΰ`asߗ$1IĖT?Kn>!"?V.1@4{?MfzpJKcv_]"ߗѩ'U]2[!Y12P`*U8)#/+4qpQEaxtpA[>V}Y3'pílsRɎR==eC̑Gi{Cf k/L\gЗC_Js]ҳ_1a[5)_+B/D\eK_sDͽ_qZv|IV/b`^ ZBA飮_)}aW-pTK4?/d⥏quO5l.U4BqU9&K.! />~qpq8䣴bW}rch2neJ7_!9"3z"!> xJ:U/Xެ{Q$VD~%z`?(#P) R.RQ+cg\4 |@^u]1ЎFrO7-FS" t4kίUOU7_,>YF!rc ]5 Ppӎc_\fYœlɈ [w2ۡgGדdoWktdXxC˔"7ˆ#f{C#/$SȖj*3#7ϱņ8}q~BiAM^GXϪ^].8(w6HRW7'E3c ވf=s_>Uw4|Iה}\/Hei'νihj2krDӏ c2/D20_ UUߊ<-]} 33ީ>ݕ}ܣS8y]rQz7rhٕ'4ٹ2LuTZv tk˶~Ժyig%ԉ0m wIKL){ q+ţq6/>u SOzڃx1KpfYoqcDdχ21>٭:j̲#]˶AS7+3Mw;=ynjoC<:R|X 1YYM'ndCw~4{{M86cs2,+qzfUQ/ i:& dHywd͓emJwFn?Sveoއ|A=oI4EE8 -ţ !N틞y5MvfۉN 낽Wۻ0z1R)-B¿0[Symx2)bG~voxt? 4ٗ;:~+|0PoFwws'{r8yzf+6kTJ"~[>[9^v4 kޏ]}ӽ`lŮ~q; ~9㚃A9M6^o  .f%HڶW/W< X~c+7Ӽj*a;}ZpƷ%Mxێ8(LDh/4 ^4 w5Ss7_Ofmgo*+ d|Ltc1Gg1U2+@UeAتȵo}1j/Ec1Nz0x$~[n$ZQA/0ssnxxi,}ܫ M5)!%l) CrոnxaoxSCFؿ<6־A_Q.Hfr/"cow|_ZC8_XnED7Wv t{5>Z_U t=31OHe~wdrF\n.ܖ@ aש#afex/tests/testthat/test-compare_2_vectors.R0000644000176200001440000000044613664111747020731 0ustar liggesusers context("compare.2.vectors: known bugs") test_that("exactly equal mean does not fail", { x <- c(0.309, 0.222, 0.293, 0.238, 0.33, 0.215) y <- c(0.313, 0.213, 0.306, 0.253, 0.294, 0.228) out <- suppressWarnings(compare.2.vectors(x, y, paired = TRUE)) expect_is(out,"list") }) afex/tests/testthat/test-residuals.R0000644000176200001440000000444213670111517017300 0ustar liggesuserscontext("residuals: check if it works") data(obk.long, package = "afex") between <- aov_car(value ~ treatment*gender + Error(id), data = obk.long, fun_aggregate = mean) mixed <- aov_car(value ~ treatment * gender + Error(id/(phase*hour)), data = obk.long) within <- aov_car(value ~ 1 + Error(id/(phase*hour)), data = obk.long) ## between data with correct order obk2 <- aggregate(value ~ gender + treatment + id , data = obk.long, FUN = mean) between2 <- aov_car(value ~ treatment*gender + Error(id), data = obk2) between2lm <- lm(value ~ treatment*gender, data = obk2) between3 <- aov_car(value ~ treatment*gender + Error(id), data = obk2[rev(seq_len(nrow(obk2))),]) ## within data with correct order obk3 <- obk.long[with(obk.long, order(id, phase, hour)), ] within2 <- aov_car(value ~ 1 + Error(id/(phase*hour)), data = obk3) test_that("Residuals", { expect_message(residuals(within), "Data was changed") expect_message(residuals(mixed), "Data was changed") expect_message(residuals(between), "Data was changed") expect_message(residuals(between3), "Data was changed") expect_message(residuals(between2), regexp = NA) expect_message(residuals(within2), regexp = NA) expect_equal(residuals(between2), residuals(between2lm)) expect_is(suppressWarnings(residuals(within)),"numeric") expect_is(suppressWarnings(residuals(mixed)),"numeric") expect_is(suppressWarnings(residuals(between)),"numeric") expect_is(residuals(within, append = TRUE),"data.frame") expect_is(residuals(mixed, append = TRUE),"data.frame") expect_is(residuals(between, append = TRUE),"data.frame") }) test_that("Fitted", { expect_message(fitted(within)) expect_message(fitted(mixed)) expect_message(fitted(between)) expect_message(fitted(between2), regexp = NA) expect_message(fitted(within2), regexp = NA) expect_equal(fitted(between2), fitted(between2lm)) expect_is(suppressWarnings(fitted(within)),"numeric") expect_is(suppressWarnings(fitted(mixed)),"numeric") expect_is(suppressWarnings(fitted(between)),"numeric") expect_is(fitted(within, append = TRUE),"data.frame") expect_is(fitted(mixed, append = TRUE),"data.frame") expect_is(fitted(between, append = TRUE),"data.frame") }) afex/tests/testthat/test-mixed-structure.R0000644000176200001440000004724114071313113020445 0ustar liggesusers context("Mixed: structural tests") # note: all calls with type 2 are wrapped in suppressWarnings()! test_that("mixed: Maxell & Delaney (2004), Table 16.4, p. 842: Type 2", { data(md_16.4) md_16.4b <- md_16.4 md_16.4b$cog <- scale(md_16.4b$cog, scale=FALSE) contrasts(md_16.4b$cond) <- "contr.sum" mixed4_2 <- mixed(induct ~ cond*cog + (cog|room:cond), md_16.4b, type = 2, progress=FALSE, method = "nested-KR") lmer4_full <- lmer(induct ~ cond*cog + (cog|room:cond), md_16.4b) lmer4_small <- lmer(induct ~ cond+cog + (cog|room:cond), md_16.4b) expect_that(fixef(mixed4_2$full_model[[2]]), equals(fixef(lmer4_full))) expect_that(fixef(mixed4_2$full_model[[1]]), is_equivalent_to(fixef(lmer4_small))) }) test_that("mixed: Maxell & Delaney (2004), Table 16.4, p. 842: Type 3", { data(md_16.4) md_16.4b <- md_16.4 md_16.4b$cog <- scale(md_16.4b$cog, scale=FALSE) contrasts(md_16.4b$cond) <- "contr.sum" mixed4_2 <- mixed(induct ~ cond*cog + (cog|room:cond), md_16.4b, type = 3, progress=FALSE, method = "nested-KR") lmer4_full <- lmer(induct ~ cond*cog + (cog|room:cond), md_16.4b) lmer4_small <- lmer(induct ~ cond+cog + (cog|room:cond), md_16.4b) expect_that(fixef(mixed4_2$full_model), equals(fixef(lmer4_full))) expect_that(mixed4_2$full_model, is_equivalent_to(lmer4_full)) expect_that(fixef(mixed4_2$restricted_models$`cond:cog`), is_equivalent_to(fixef(lmer4_small))) }) test_that("mixed, obk.long: type 2 and LRTs", { data(obk.long, package = "afex") contrasts(obk.long$treatment) <- "contr.sum" contrasts(obk.long$phase) <- "contr.sum" t2 <- mixed(value ~ treatment*phase +(1|id), data = obk.long, method = "LRT", type = 2, progress=FALSE) expect_output(print(t2), "treatment") a2.f <- lmer(value ~ treatment*phase +(1|id), data = obk.long, REML=FALSE) a2.h <- lmer(value ~ treatment+phase +(1|id), data = obk.long, REML=FALSE) a2.t <- lmer(value ~ treatment +(1|id), data = obk.long, REML=FALSE) a2.p <- lmer(value ~ phase +(1|id), data = obk.long, REML=FALSE) if (packageVersion("lme4") <= "1.1.21") { extract_anova <- function(anova) unlist(anova)[c("Df1", "Chisq2", "Chi Df2", "Pr(>Chisq)2" )] } else { extract_anova <- function(anova) unlist(anova)[c("npar1", "Chisq2", "Df2", "Pr(>Chisq)2" )] } expect_that( unlist(t2$anova_table[3,]) , is_equivalent_to( extract_anova(anova(a2.h, a2.f)) )) expect_that( unlist(t2$anova_table[2,]) , is_equivalent_to( extract_anova(anova(a2.t, a2.h)) )) expect_that( unlist(t2$anova_table[1,]) , is_equivalent_to( extract_anova(anova(a2.p, a2.h)) )) }) test_that("mixed, mlmRev: type 3 and 2 LRTs for GLMMs", { skip_if_not_installed("mlmRev") if (require("mlmRev")) { suppressWarnings(gm1 <- mixed(use ~ age*urban + (1 | district), family = binomial, data = Contraception, method = "LRT", progress=FALSE)) suppressWarnings(gm2 <- mixed(use ~ age*urban + (1 | district), family = binomial, data = Contraception, method = "LRT", type = 2, progress=FALSE)) expect_that(gm1, is_a("mixed")) expect_that(gm2, is_a("mixed")) } }) test_that("mixed, obk.long: LMM with method = PB", { expect_that(mixed(value ~ treatment+phase*hour +(1|id), data = obk.long, method = "PB", args_test = list(nsim = 10), progress=FALSE), is_a("mixed")) }) test_that("mixed, obk.long: multicore loads lme4 and produces the same results", { #if (packageVersion("testthat") >= "0.9") { if (FALSE) { # that never seems to run... testthat::skip_on_cran() testthat::skip_on_travis() data(obk.long, package = "afex") require(parallel) cl <- makeCluster(rep("localhost", 2)) # make cluster # 1. Obtain fits with multicore: m_mc1 <- mixed(value ~ treatment +(phase|id), data = obk.long, method = "LRT", cl = cl, control = lmerControl(optCtrl=list(maxfun = 100000)), progress=FALSE) cl_search <- clusterEvalQ(cl, search()) stopCluster(cl) m_mc2 <- mixed(value ~ treatment +(phase|id), data = obk.long, method = "LRT", control = lmerControl(optCtrl=list(maxfun = 100000)), progress=FALSE) expect_that(all(vapply(cl_search, function(x) any(grepl("^package:lme4$", x)), NA)), is_true()) expect_that(m_mc1, equals(m_mc2, check.attributes = FALSE)) } }) test_that("print(mixed) works: only 1 or 2 fixed effects with all methods", { data(obk.long, package = "afex") expect_that(print(mixed(value ~ treatment+(1|id), data = obk.long, progress=FALSE)), is_a("data.frame")) expect_that(print(mixed(value ~ treatment+phase+(1|id), data = obk.long, progress=FALSE)), is_a("data.frame")) expect_that(print(mixed(value ~ treatment+(1|id), data = obk.long, method = "LRT", progress=FALSE)), is_a("data.frame")) expect_that(print(mixed(value ~ treatment+phase+(1|id), data = obk.long, method = "LRT", progress=FALSE)), is_a("data.frame")) skip_if_not_installed("mlmRev") require("mlmRev") # for the data, see ?Contraception expect_that(print(mixed(use ~ urban + (1 | district), method = "PB", family = binomial, data = Contraception, args_test=list(nsim=2), progress=FALSE)), is_a("data.frame")) expect_that(print(mixed(use ~ urban + livch + (1 | district), method = "PB", family = binomial, data = Contraception, args_test=list(nsim=2), progress=FALSE)), is_a("data.frame")) }) # test_that("mixed, Maxell & Delaney (2004), Table 16.4, p. 842: bobyqa not fitting well", { # data(md_16.4) # # F-values and p-values are relatively off: # expect_that(mixed(induct ~ cond*cog + (cog|room:cond), md_16.4, control=lmerControl(optimizer="bobyqa")), gives_warning("better fit")) # expect_that(mixed(induct ~ cond*cog + (cog|room:cond), md_16.4, type=2, control=lmerControl(optimizer="bobyqa")), gives_warning("better fit")) # }) test_that("mixed: set.data.arg", { data(obk.long, package = "afex") suppressWarnings(m1 <- mixed(value ~ treatment*phase +(1|id), obk.long, method = "LRT", progress=FALSE, set_data_arg = TRUE)) suppressWarnings(m2 <- mixed(value ~ treatment*phase +(1|id), obk.long, method = "LRT", progress=FALSE, set_data_arg = FALSE)) expect_that(m1$full_model@call[["data"]], is_identical_to(as.name("obk.long"))) expect_that(m2$full_model@call[["data"]], is_identical_to(as.name("data"))) }) test_that("mixed: anova with multiple mixed objexts", { data("sk2011.2") data("ks2013.3") sk2_aff <- droplevels(sk2011.2[sk2011.2$what == "affirmation",]) sk_m1 <- mixed(response ~ instruction+(1|id), sk2_aff, method = "LRT", progress = FALSE, set_data_arg = TRUE) sk_m2 <- mixed(response ~ instruction+(1|id)+(1|content), sk2_aff, method = "LRT", progress = FALSE, set_data_arg = TRUE) sk_m3 <- lmer(response ~ instruction+(1|id)+(validity|content), sk2_aff, REML = FALSE) sk_m4 <- lmer(response ~ instruction+(1|id)+(validity|content), sk2_aff, REML = TRUE) t <- anova(sk_m1, sk_m2, sk_m3) xx <- anova(sk_m1$full_model, sk_m2$full_model, sk_m3, model.names = c("sk_m1", "sk_m2", "sk_m3")) expect_identical(rownames(xx), rownames(t)) expect_identical(rownames(xx), c("sk_m1", "sk_m2", "sk_m3")) expect_is(t, c("anova", "data.frame")) expect_is(anova(sk_m1, object = sk_m2, sk_m3), c("anova", "data.frame")) expect_is(anova(sk_m1, object = sk_m2, sk_m3, ks2013.3), c("anova", "data.frame")) expect_warning(anova(sk_m1, object = sk_m2, sk_m3, sk_m4), "some models fit with REML = TRUE, some not") }) context("Mixed: Expand random effects") test_that("mixed: expand_re argument, return = 'merMod'", { data("ks2013.3") set_default_contrasts() m2 <- mixed(response ~ validity + (believability||id), ks2013.3, expand_re = TRUE, method = "LRT", progress=FALSE) m3 <- mixed(response ~ validity + (believability|id), ks2013.3, method = "LRT", progress=FALSE) expect_identical(length(unlist(summary(m2)$varcor)), nrow(summary(m3)$varcor$id)) expect_true(all.equal(unlist(summary(m2)$varcor), diag(summary(m3)$varcor$id), tolerance = 0.03, check.attributes = FALSE)) l2 <- mixed(response ~ validity + (believability||id), ks2013.3, expand_re = TRUE, return = "merMod", progress=FALSE) expect_is(l2, "merMod") expect_equivalent(m2$full_model, l2) l3 <- lmer_alt(response ~ validity + (believability||id), ks2013.3) l4 <- lmer_alt(response ~ validity + (believability||id), ks2013.3, control = lmerControl(optimizer = "Nelder_Mead")) expect_equivalent(l2, l3) expect_equal(l3, l4, check.attributes = FALSE) l5 <- lmer_alt(response ~ validity + (believability||id), ks2013.3, control = lmerControl(optimizer = "Nelder_Mead"), check_contrasts = TRUE) expect_equal(l2, l5, check.attributes = FALSE ) # parameter names need to be identical (same contrasts): expect_identical(names(coef(l2)$id), names(coef(l5)$id)) # parameter names need to be different (different contrasts): expect_false(all(names(coef(l2)$id) == names(coef(l3)$id))) l7 <- lmer_alt(response ~ validity + (1|id) + (0+validity*condition||content), ks2013.3, control = lmerControl(optCtrl = list(maxfun=1e6))) expect_is(l7, "merMod") expect_error(lmer_alt(response ~ validity + (0|id) + (0+validity*condition||content), ks2013.3), "Invalid random effects term") expect_is(lmer_alt(response ~ validity + (validity||id) + (validity|content), ks2013.3), "merMod") }) test_that("mixed: expand_re argument (longer)", { if (packageVersion("testthat") >= "0.9") { testthat::skip_on_cran() testthat::skip_on_travis() data("ks2013.3") m4 <- mixed(response ~ validity + (believability*validity||id) + (validity*condition|content), ks2013.3, expand_re = TRUE, method = "LRT", control = lmerControl(optCtrl = list(maxfun=1e6)), progress=FALSE) m5 <- suppressWarnings(mixed(response ~ validity + (believability*validity|id) + (validity*condition||content), ks2013.3, method = "LRT", control = lmerControl(optCtrl = list(maxfun=1e6)), expand_re = TRUE, progress=FALSE)) expect_identical(length(unlist(summary(m4)$varcor[-7])), nrow(summary(m5)$varcor$id)) expect_identical(length(unlist(summary(m5)$varcor[-1])), nrow(summary(m4)$varcor$content)) expect_equal(attr(summary(m5)$varcor, "sc"), attr(summary(m4)$varcor, "sc"), tolerance = 0.02) } }) test_that("mixed: return=data, expand_re argument, and allFit", { #if (packageVersion("testthat") >= "0.9") { #testthat::skip_on_travis() testthat::skip_if_not_installed("optimx") testthat::skip_on_cran() skip_on_os("windows") require(optimx) data("ks2013.3") ks2013.3_tmp <- ks2013.3 m6 <- mixed(response ~ validity + (believability*validity||id), ks2013.3_tmp, expand_re = TRUE, method = "LRT", control = lmerControl(optCtrl = list(maxfun=1e6)), progress=FALSE, return = "merMod") m6_all_1 <- all_fit(m6, verbose = FALSE, data = ks2013.3_tmp) expect_output(print(m6_all_1$`bobyqa.`), "object 're1.believability1' not found") ks2013.3_tmp <- mixed(response ~ validity + (believability*validity||id), ks2013.3_tmp, expand_re = TRUE, method = "LRT", control = lmerControl(optCtrl = list(maxfun=1e6)), progress=FALSE, return = "data") m6_all_2 <- suppressWarnings(all_fit(m6, verbose = FALSE, data = ks2013.3_tmp)) expect_is(m6_all_2$`bobyqa.`, "merMod") expect_is(m6_all_2$`Nelder_Mead.`, "merMod") expect_is(m6_all_2$`nmkbw.`, "merMod") expect_is(m6_all_2$optimx.nlminb, "merMod") expect_is(m6_all_2$`optimx.L-BFGS-B`, "merMod") expect_is(m6_all_2$nloptwrap.NLOPT_LN_NELDERMEAD, "merMod") }) test_that("mixed with all_fit = TRUE", { testthat::skip_if_not_installed("optimx") testthat::skip_if_not_installed("MEMSS") testthat::skip_if_not_installed("dfoptim") testthat::skip_on_cran() skip_on_os("windows") require(optimx) data("Machines", package = "MEMSS") aop <- afex_options() afex_options(lmer_function = "lmerTest") m1 <- mixed(score ~ Machine + (Machine||Worker), data=Machines, expand_re = TRUE, all_fit = TRUE, progress = FALSE) afex_options(lmer_function = "lme4") m2 <- mixed(score ~ Machine + (Machine||Worker), data=Machines, expand_re = TRUE, all_fit = TRUE, method = "LRT", progress = FALSE) afex_options(aop) all_loglik1 <- attr(m1, "all_fit_logLik") all_loglik2 <- attr(m2, "all_fit_logLik") expect_false(any(is.na(all_loglik1[,1]))) expect_false(any(is.na(all_loglik2[,1]))) expect_equivalent(rep(all_loglik1[1,1], nrow(all_loglik1)), all_loglik1[,1]) expect_equivalent(rep(all_loglik2[1,1], nrow(all_loglik2)), all_loglik2[,1]) }) test_that("mixed: return=data works", { data("ks2013.3") ks2013.3_tmp <- ks2013.3 ks2013.3_tmp <- mixed(response ~ validity + (believability*validity||id), ks2013.3_tmp, expand_re = TRUE, method = "LRT", control = lmerControl(optCtrl = list(maxfun=1e6)), progress=FALSE, return = "data") expect_is(ks2013.3_tmp, "data.frame") if (packageVersion("testthat") >= "0.11.0.9000") expect_gt(ncol(ks2013.3_tmp), ncol(ks2013.3)) expect_output(print(colnames(ks2013.3_tmp)), "re1.believability1_by_validity1") }) test_that("mixed with all available methods", { data("sk2011.2") # see example("mixed") testthat::skip_on_travis() testthat::skip_on_cran() sk2_aff <- droplevels(sk2011.2[sk2011.2$what == "affirmation",]) for (i in c(2, 3)) { sk2_aff_kr <- mixed(response ~ instruction*type+(inference||id), sk2_aff, expand_re = TRUE, all_fit = FALSE, method = "KR", progress=FALSE, type = i) sk2_aff_s <- mixed(response ~ instruction*type+(inference||id), sk2_aff, expand_re = TRUE, all_fit = FALSE, method = "S", progress=FALSE, type = i) sk2_aff_nkr <- mixed(response ~ instruction*type+(inference||id), sk2_aff, progress = FALSE, type = i, expand_re = TRUE, all_fit = FALSE, method = "nested-KR") sk2_aff_lrt <- mixed(response ~ instruction*type+(inference||id), sk2_aff, progress = FALSE, type = i, expand_re = TRUE, all_fit = FALSE, method = "LRT") sk2_aff_pb <- mixed(response ~ instruction*type+(inference||id), sk2_aff, progress = FALSE, type = i, args_test = list(nsim = 10), expand_re = TRUE, all_fit = FALSE, method = "PB") expect_is(sk2_aff_kr, "mixed") expect_is(sk2_aff_s, "mixed") expect_is(sk2_aff_nkr, "mixed") expect_is(sk2_aff_lrt, "mixed") expect_is(sk2_aff_pb, "mixed") expect_is(anova(sk2_aff_kr), "anova") expect_is(anova(sk2_aff_s), "anova") expect_is(anova(sk2_aff_nkr), "anova") expect_is(anova(sk2_aff_lrt), "anova") expect_is(anova(sk2_aff_pb), "anova") expect_output(print(sk2_aff_kr), "Effect") expect_output(print(sk2_aff_kr), "F") expect_output(print(sk2_aff_s), "Effect") expect_output(print(sk2_aff_s), "F") expect_output(print(sk2_aff_nkr), "Effect") expect_output(print(sk2_aff_nkr), "F") expect_output(print(sk2_aff_lrt), "Effect") expect_output(print(sk2_aff_lrt), "Chisq") expect_output(print(sk2_aff_pb), "Effect") expect_output(print(sk2_aff_pb), "Chisq") } }) test_that("mixed all_fit = TRUE works with old methods", { data("sk2011.2") # see example("mixed") testthat::skip_on_cran() skip_on_os("windows") sk2_aff <- droplevels(sk2011.2[sk2011.2$what == "affirmation",]) sk2_aff_b <- mixed(response ~ instruction+(inference*type||id), sk2_aff, expand_re = TRUE, all_fit = TRUE, method = "nested-KR", progress = FALSE) sk2_aff_b2 <- mixed(response ~ instruction*type+(inference||id), sk2_aff, type = 2, expand_re = TRUE, all_fit = TRUE, method = "nested-KR", progress = FALSE) expect_is(sk2_aff_b, "mixed") expect_length(attr(sk2_aff_b, "all_fit_selected"), 2) expect_length(attr(sk2_aff_b, "all_fit_logLik"), 2) expect_is(sk2_aff_b2, "mixed") expect_length(attr(sk2_aff_b2, "all_fit_selected"), 5) expect_length(attr(sk2_aff_b2, "all_fit_logLik"), 5) }) test_that("mixed all_fit = TRUE works with new (KR) methods", { skip_on_os("windows") data("sk2011.2") # see example("mixed") testthat::skip_on_cran() sk2_aff <- droplevels(sk2011.2[sk2011.2$what == "affirmation",]) sk2_aff_b <- mixed(response ~ instruction+(inference*type||id), sk2_aff, expand_re = TRUE, all_fit = TRUE, method = "KR", progress = FALSE) sk2_aff_b2 <- mixed(response ~ instruction*type+(inference||id), sk2_aff, type = 2, expand_re = TRUE, all_fit = TRUE, method = "KR", progress = FALSE) expect_is(sk2_aff_b, "mixed") expect_named(attr(sk2_aff_b, "all_fit_selected"), "full_model") expect_false(is.null(attr(sk2_aff_b, "all_fit_logLik"))) expect_is(sk2_aff_b2, "mixed") expect_named(attr(sk2_aff_b2, "all_fit_selected"), "full_model") expect_false(is.null(attr(sk2_aff_b2, "all_fit_logLik"))) }) test_that("anova_table attributes", { data(obk.long) symbol_test <- mixed(value ~ treatment * phase + (1|id), obk.long, sig_symbols = c("", "a", "aa", "aaa"), progress = FALSE, return = "nice") expect_output(print(symbol_test), "aaa") symbol_test <- mixed(value ~ treatment * phase + (1|id), obk.long, sig_symbols = c("", "a", "aa", "aaa"), progress = FALSE) expect_output(print(symbol_test), "aaa") expect_output(print(nice(symbol_test, sig_symbols = c("", "b", "bb", "bbb"))), "bbb") new_symbols <- c(" ", " b", " bb", " bbb") symbol_test <- anova(symbol_test, sig_symbols = c(" ", " b", " bb", " bbb")) expect_identical(attr(symbol_test, "sig_symbols"), new_symbols) expect_output(print(nice(symbol_test)), "bbb") # Test support for old afex objects old_afex_object <- default_options <- mixed(value ~ treatment * phase + (1|id), obk.long, progress = FALSE) attr(old_afex_object$anova_table, "sig_symbols") <- NULL expect_that(nice(old_afex_object), is_identical_to(nice(default_options))) }) afex/tests/testthat/test-afex_plot-default-support.R0000644000176200001440000000572214076043262022426 0ustar liggesuserscontext("afex_plot: default method supported models") test_that("lm works", { testthat::skip_if_not_installed("emmeans") testthat::skip_if_not_installed("ggplot2") warp.lm <- lm(breaks ~ wool * tension, data = warpbreaks) p1 <- afex_plot(warp.lm, "tension") d1 <- afex_plot(warp.lm, "tension", return = "data") p2 <- afex_plot(warp.lm, "tension", "wool") d2 <- afex_plot(warp.lm, "tension", "wool", return = "data") expect_is(p1, "ggplot") expect_is(p2, "ggplot") expect_equal(nrow(d2$data), nrow(warpbreaks)) expect_equal(nrow(d1$data), nrow(warpbreaks)) }) test_that("poisson glm works", { testthat::skip_if_not_installed("emmeans") testthat::skip_if_not_installed("ggplot2") ins <- data.frame( n = c(500, 1200, 100, 400, 500, 300), size = factor(rep(1:3,2), labels = c("S","M","L")), age = factor(rep(1:2, each = 3)), claims = c(42, 37, 1, 101, 73, 14)) ins.glm <- glm(claims ~ size + age + offset(log(n)), data = ins, family = "poisson") p1 <- afex_plot(ins.glm, "size") p2 <- afex_plot(ins.glm, "size", "age") expect_is(p1, "ggplot") expect_is(p2, "ggplot") }) test_that("binomial glm works", { testthat::skip_if_not_installed("emmeans") testthat::skip_if_not_installed("ggplot2") ldose <- factor(rep(0:5, 2)) numdead <- c(1, 4, 9, 13, 18, 20, 0, 2, 6, 10, 12, 16) sex <- factor(rep(c("M", "F"), c(6, 6))) SF <- numdead/20 ## dv should be a vector, no matrix budworm.lg <- glm(SF ~ sex*ldose, family = binomial, weights = rep(20, length(numdead))) p1 <- afex_plot(budworm.lg, "ldose") p2 <- afex_plot(budworm.lg, "ldose", "sex") ## data point is hidden behind mean! expect_is(p1, "ggplot") expect_is(p2, "ggplot") }) test_that("nlme works", { testthat::skip_if_not_installed("emmeans") testthat::skip_if_not_installed("ggplot2") skip_if_not_installed("nlme") data(Oats, package = "nlme") Oats$nitro <- factor(Oats$nitro) oats.1 <- nlme::lme(yield ~ nitro * Variety, random = ~ 1 | Block / Variety, data = Oats) p1 <- afex_plot(oats.1, "nitro", "Variety", data = Oats) p2 <- afex_plot(oats.1, "nitro", "Variety", data = Oats, id = "Block") p3 <- afex_plot(oats.1, "nitro", data = Oats) p4 <- afex_plot(oats.1, "nitro", data = Oats, id = c("Block", "Variety")) p5 <- afex_plot(oats.1, "nitro", data = Oats, id = "Block") expect_is(p1, "ggplot") expect_is(p2, "ggplot") expect_is(p3, "ggplot") expect_is(p4, "ggplot") expect_is(p5, "ggplot") d3 <- afex_plot(oats.1, "nitro", data = Oats, return = "data") d4 <- afex_plot(oats.1, "nitro", data = Oats, id = c("Block", "Variety"), return = "data") d5 <- afex_plot(oats.1, "nitro", data = Oats, id = "Block", return = "data") expect_equal(nrow(d3$data), nrow(Oats)) expect_equal(nrow(d4$data), nrow(Oats)) expect_true(nrow(d5$data) < nrow(Oats)) }) afex/tests/testthat/anova_hf_error.rda0000644000176200001440000001016413664111747017675 0ustar liggesusers7zXZi"6!X-5])TW"nRʟx8OgWF7,ا$ͺ]{¡u?n~ .\G$U"|y;ᑘ; F%~$"(n _StʣKAJve+䮵7?-q';>2wȬC#Gv;T?q83[wȤЅ⣝%w*T=&"X/h*ܢ<Ց+ĸܽ<˿[>ys$M)U™xN 7.s[/+ckF-K7_)V B4g/81Cn| rΜU9(dB5{niV(ܺyTCܖC4 NS >srҌX,T#"aCXOHD1ä+#\ beBjg<GC""zyt63s@8 Wzozh>葿w)+D*hĘqA\l?MQk|Zsm`%}C|byۇ$xXA4pɥG,0ނx^\M],E{ y4ZK1ؗӁˬtҦ:Y1\£HҪ 9nj s9|b2E;7ROf.:.kVHj"XLs1gnKsXr?4*b)7r 4ެ2nkO}nTH=9u,#?N~HSy<Ży$ 4ioΪ| F"ν0+5Cg`OX.oT+-_<6VEH6u ɧ($ [6LO|,eSDast~JX@=@ʝM oRs\\Rz ʘ K4nv VɲkO`wd״lR:6^^etw?%B#:L(N^S,TEBI2@e/J.[VM`w?,v_8 RsOIZ'%# Du?0+m-5#d1&xo|<!n u]47;} 3j(p i^Nx?졪ܗ Dhl.(6 t!d̢5l0ԍb>0bl'wäZ|(Ӕ&| -SCq ;rJrTk 3mMUBZ̈ ʛ#&nq+# d< A#WT~a}zQQEN ~ɒC{D^ڀV8ϙ{f<ϒ%&Œ FRi p'_KQްn(إX^&B.UDilxM9ACR{Q15c7,=*&>3 %>áMh.[9d/w.o_! a]x+=eGJIITU+T 8`]'4Z$/]tI'X=CWgF|f>X(G0W!Xh!FQdvO|DTF \V!Khg;4:fs 2 y_gS݌:h+U%TSE8סbNN2:_Q RoO': U\y'9<N3y(nՕᓇw`ʀ \}zMdhTmD&6t)Ó՗b~ay=a[ 1mexXM+x}g.yuRC05עw>}8.$ ^G#mdݖ7Ċ˱P( r:fZΝ] ]8eYI IҦ@F@YIr2Ih5y:B{AŎ#Tvױ`@A3eņ0k4h>{1-IE T* ^d~B̹Ybs뷨R d~EuqLj-G(g;))VI ">qឭi{v_\eX#]$ bz5*d2nZacf*lnR* H9 ɩ8%|rɉ0*xW'{7= kl*0DlUx,K A+bw!+EHYd Q{Yϯf?+_:Þ. 4 =1SK9-9;t1D rϪ|&U va{ҕTgllgVZQ!ʈ6.2])௻, w RǧSzKrnI9{4͜$-H 'z\i #'&=2'&6xwMi/\ݶCT̀WRa #9{hn 'QލъϽn:uI_Vk^)OxؖO K$vdFUX+up0Q½eQ#[ruo _ œ#{D+fJy, p4Efw6FZC4nOHѹ̓ZvԑV:ݐ{;A6HEq-L6ٟъkC׿^A&]-{u.XqILa{\5T( ºԙfŎpiFNb -H7M9dbFd+>s3@TN^lѵ<agH\h9=:e&ǽĽ R\ eſѭ/SҺR?pJK|ϤYuto/[Җ yl* h R$bAynpơSPH!BMS=6BסHAWw7Q-`۽]b ͏B]frD҂X{/%TFdl_ t6Yƪ%,^I= g\ H! >]k@\JʨvU|&At<)88z)c[q w9F)s[{RO=;*"N~u\'_$\EDf[/IE /%n{ƇK 8V.LjrLuEͼz(Z#[U|o{!*,6De!p)U74KҪH4OsODi J6+ 6V>/T¶L'yѐ4EmS?ESbLb qZl3KWu|)dQwv[Wbz37K/-L*aL%!VlZ[ȋ1`1 U1,Be1Iz` ؠ0F|?x8΅|L7e2@Bm6]{HWa}0JT .'^߹(;Ǿ܏ ŕ o@;̜ yU ɁXo@a]?_tkGj"xooGrpb{2+.$Y/gY@rz\C+{v Oy.O *$1D),͸V .2<>)RFe&+LpUQFJ2`p &3CN_띑nH U_$pdl' u|a*"{ r}: 8ƊWq5< n9_c5؎F.x>AUTRz6-ӛ~5^IAsc|oN>R{tCw+sOG.YV $rԚr+~/bj,qHm4XRDzl M%w 6)=bz\Lxjo([Q//)לP!?R0PKlcvPf|*1m1hFsxP\{&J  Rf 7Sz-E-gUZ!WT>z:c ϰa%LH'>S8Ud8B @=(>0 YZafex/tests/testthat/test-afex_plot-bugs.R0000644000176200001440000000545714076045331020234 0ustar liggesuserscontext("afex_plot: known bugs") test_that("mixed models with Type = 2 work", { testthat::skip_if_not_installed("ggplot2") testthat::skip_if_not_installed("emmeans") testthat::skip_if_not_installed("MEMSS") testthat::skip_on_cran() data("Machines", package = "MEMSS") # simple model with random-slopes for repeated-measures factor m1 <- mixed(score ~ Machine + (1|Worker), data=Machines, type = 2, method = "LRT", progress = FALSE) expect_is(afex_plot(m1, "Machine"), "ggplot") }) test_that("response variable y works", { testthat::skip_if_not_installed("ggplot2") testthat::skip_if_not_installed("emmeans") testthat::skip_if_not_installed("MEMSS") testthat::skip_on_cran() data("Machines", package = "MEMSS") Machines$y <- rnorm(nrow(Machines), mean = -100) ## was a problem if it came before the DV column Machines <- Machines[, c("y", "Worker", "Machine", "score")] # simple model with random-slopes for repeated-measures factor m1 <- mixed(score ~ Machine + (1|Worker), data=Machines, progress = FALSE) m1 pp <- afex_plot(m1, "Machine") expect_true(all(pp$layers[[1]]$data$y > 0)) }) test_that("merMod objects with missing data can be plotted", { testthat::skip_if_not_installed("ggplot2") testthat::skip_if_not_installed("emmeans") testthat::skip_if_not_installed("MEMSS") testthat::skip_on_cran() data("Machines", package = "MEMSS") Machines[1, "score"] <- NA m1 <- lme4::lmer(score ~ Machine + (1|Worker), data=Machines) pp <- afex_plot(m1, "Machine") expect_is(pp, "ggplot") m2 <- mixed(score ~ Machine + (1|Worker), data=Machines, progress = FALSE) pp2 <- afex_plot(m2, "Machine") expect_equivalent( pp$layers[[1]]$data, pp2$layers[[1]]$data ) }) test_that("binomial models plot data correctly with factor DVs", { testthat::skip_if_not_installed("ggplot2") testthat::skip_if_not_installed("emmeans") ## long format binomial GLM (https://stats.stackexchange.com/q/322038/442): drc4 <- function(x, b =1.0, c = 0, d = 1, e = 0){ (d - c)/ (1 + exp(-b * (log(x) - log(e)))) } # simulate long form of dataset nReps = 30 dfLong <- data.frame(dose = factor(rep(letters[1:3], each = nReps))) dfLong$mortality <-rbinom(n = dim(dfLong)[1], size = 1, prob = drc4(as.numeric(dfLong$dose), b = 2, e = 5)) fitLong <- glm( mortality ~ dose, data = dfLong, family = "binomial") p1 <- afex_plot(fitLong, "dose") dfLong$mortality <- factor(dfLong$mortality) fitLong2 <- glm( mortality ~ dose, data = dfLong, family = "binomial") p2 <- afex_plot(fitLong2, "dose") expect_equivalent(p1, p2, check.environment=FALSE) }) afex/tests/testthat/test-afex_plot-vignette.R0000644000176200001440000001162314076043226021112 0ustar liggesuserscontext("afex_plot vignette: saved objects replicate") test_that("glmmTMB object", { testthat::skip_if_not_installed("emmeans") testthat::skip_if_not_installed("ggplot2") skip_on_cran() skip_if_not_installed("glmmTMB") library("glmmTMB") set_sum_contrasts() tmb2 <- glmmTMB(count~spp * mined + (1|site), ziformula = ~spp * mined, family=nbinom2, Salamanders) # tmb <- tmb2 # save(tmb, file = "inst/extdata/tmb_example_fit.rda", # compress = "xz") load(system.file("extdata/", "tmb_example_fit.rda", package = "afex")) expect_equivalent(summary(tmb), summary(tmb2), tolerance = 0.001) skip_if_not_installed("cowplot") skip_if_not_installed("ggplot2") library("ggplot2") p1o <- afex_plot(tmb, "spp") p1n <- afex_plot(tmb2, "spp") expect_equivalent(p1o, p1n, check.environment = FALSE) p2o <- afex_plot(tmb, "spp", data_geom = geom_violin) p2n <- afex_plot(tmb2, "spp", data_geom = geom_violin) expect_equivalent(p2o, p2n, check.environment = FALSE) p3o <- afex_plot(tmb, "spp", id = "site", data = Salamanders) p3n <- afex_plot(tmb2, "spp", id = "site", data = Salamanders) expect_equivalent(p3o, p3n, check.environment = FALSE) }) test_that("rstanarm plots", { testthat::skip_if_not_installed("emmeans") testthat::skip_if_not_installed("ggplot2") skip_on_cran() skip_if_not_installed("rstanarm") library("rstanarm") ## requires resetting the ggplot2 theme skip_if_not_installed("ggplot2") library("ggplot2") set_sum_contrasts() cbpp <- lme4::cbpp cbpp$prob <- with(cbpp, incidence / size) capture_output({ example_model <- rstanarm::stan_glmer(prob ~ period + (1|herd), data = cbpp, family = binomial, weight = size, chains = 2, cores = 1, seed = 12345, iter = 500) }) b1n <- afex_plot(example_model, "period") b2n <- afex_plot(example_model, "period", data_geom = geom_violin) expect_is(b1n, "ggplot") expect_is(b2n, "ggplot") ## make cbpp long cbpp_l <- vector("list", nrow(cbpp)) for (i in seq_along(cbpp_l)) { cbpp_l[[i]] <- data.frame( herd = cbpp$herd[i], period = cbpp$period[i], incidence = rep(0, cbpp$size[i]) ) cbpp_l[[i]]$incidence[seq_len(cbpp$incidence[i])] <- 1 } cbpp_l <- do.call("rbind", cbpp_l) cbpp_l$herd <- factor(cbpp_l$herd, levels = levels(cbpp$herd)) cbpp_l$period <- factor(cbpp_l$period, levels = levels(cbpp$period)) capture_output({ example_model2 <- rstanarm::stan_glmer(incidence ~ period + (1|herd), data = cbpp_l, family = binomial, chains = 2, cores = 1, seed = 12345, iter = 500) }) b3n <- afex_plot(example_model2, "period") b4n <- afex_plot(example_model2, "period", id = "herd") # b3n <- afex_plot(example_model2, "period", id = "herd", data = cbpp_l) expect_is(b3n, "ggplot") expect_is(b4n, "ggplot") skip_if_not_installed("MEMSS") data("Machines", package = "MEMSS") suppressWarnings(capture_output({ mm <- rstanarm::stan_lmer(score ~ Machine + (Machine|Worker), data=Machines, chains = 2, cores = 1, seed = 12345, iter = 500) })) b5n <- afex_plot(mm, "Machine") b6n <- afex_plot(mm, "Machine", id = "Worker") load(system.file("extdata/", "plots_rstanarm.rda", package = "afex")) expect_equivalent(b1$data, b1n$data, tolerance = 0.1) expect_equivalent(b2$data, b2n$data, tolerance = 0.1) expect_equivalent(b3$data, b3n$data, tolerance = 0.1) expect_equivalent(b4$data, b4n$data, tolerance = 0.1) expect_equivalent(b5$data, b5n$data, tolerance = 0.1) expect_equivalent(b6$data, b6n$data, tolerance = 0.1) }) test_that("brms plots", { testthat::skip_if_not_installed("emmeans") testthat::skip_if_not_installed("ggplot2") skip_on_cran() skip_on_travis() skip_if_not_installed("brms") library("brms") ## requires resetting the ggplot2 theme skip_if_not_installed("ggplot2") skip_if_not_installed("MEMSS") library("ggplot2") set_sum_contrasts() data("Machines", package = "MEMSS") suppressWarnings(capture_output({ mm2 <- brm(score ~ Machine + (Machine|Worker), data=Machines, chains = 2, cores = 1, seed = 12345, iter = 500) })) bb1n <- afex_plot(mm2, "Machine", data = Machines, dv = "score") bb2n <- afex_plot(mm2, "Machine", id = "Worker", data = Machines, dv = "score") load(system.file("extdata/", "plots_brms.rda", package = "afex")) expect_equivalent(bb1$data, bb1n$data, tolerance = 0.1) expect_equivalent(bb2$data, bb2n$data, tolerance = 0.1) expect_error(afex_plot(mm2, "Machine", data = Machines), "Could not detect dv column") }) afex/tests/testthat/test-lmerTest-support.R0000644000176200001440000000254013664111747020623 0ustar liggesusers context("interplay with lmerTest") test_that("mixed allows both lme4 and lmerText calls and exports lmerTest::lmer", { aop <- afex_options() data(sk2011.1) m1 <- mixed(response ~ instruction*inference*plausibility +(1|id), sk2011.1, progress = FALSE, return = "merMod") m1b <- lmer(response ~ instruction*inference*plausibility +(1|id), sk2011.1) expect_true(inherits(m1, "merModLmerTest") || inherits(m1, "lmerModLmerTest")) expect_is(m1, "merMod") expect_true(inherits(m1b, "merModLmerTest") || inherits(m1b, "lmerModLmerTest")) afex_options(lmer_function = "lme4") m2 <- mixed(response ~ instruction*inference*plausibility +(1|id), sk2011.1, progress = FALSE, return = "merMod") expect_false(inherits(m2, "merModLmerTest") && inherits(m2, "lmerModLmerTest")) expect_is(m2, "merMod") afex_options(aop) expect_true("Pr(>F)" %in% colnames(lmerTest_anova(m1))) expect_true("Pr(>F)" %in% colnames(lmerTest_anova(m1b))) expect_false("Pr(>F)" %in% colnames(anova(m2))) expect_true("Pr(>F)" %in% colnames(lmerTest_anova(m2))) ## following tests only work with new lmerTest (March 2018) pkg_version <- "2.0-37.9005" skip_if(packageVersion(pkg = "lmerTest") < pkg_version) expect_true("Pr(>F)" %in% colnames(anova(m1))) expect_true("Pr(>F)" %in% colnames(anova(m1b))) }) afex/tests/testthat/test-mixed-bugs.R0000644000176200001440000001447713720274213017361 0ustar liggesusers context("mixed: known bugs") test_that("all_fit = TRUE works with emmeans", { testthat::skip_on_cran() skip_if_not_installed("MEMSS") skip_if_not_installed("emmeans") skip_on_os("windows") data("Machines", package = "MEMSS") m1 <- mixed(score ~ Machine + (1|Worker), data=Machines, all_fit = TRUE) expect_is(emmeans::emmeans(m1, "Machine"), "emmGrid") }) test_that("inverse.gaussian works", { ## see: https://github.com/singmann/afex/issues/74 skip_if_not_installed("statmod") skip_if(packageVersion("lme4") <= "1.1.21") skip_on_cran() set.seed(666) id <- factor(1:20) a <- factor(rep(c("a1","a2"),each=5000/2)) b <- factor(rep(c("b1","b2"),each=5000/2)) y <- statmod::rinvgauss(5000, 1, 2) df <- data.frame(id=id, x1=sample(a), x2=sample(b), y=y) expect_is(mixed(y ~ x1 * x2 + (1|id), family = inverse.gaussian(link = "inverse"), control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e5)), data = df, method = "LRT", progress = FALSE), "mixed") expect_is(mixed(y ~ x1 * x2 + (1|id), family = inverse.gaussian(link = "inverse"), control=glmerControl(optimizer="bobyqa", optCtrl=list(maxfun=2e5)), data = df, method = "PB", progress = FALSE, args_test = list(nsim = 5)), "mixed") }) test_that("character formula is contrast checked", { data("sk2011.2") # use only affirmation problems (S&K also splitted the data like this) sk2_aff <- droplevels(sk2011.2[sk2011.2$what == "affirmation",]) sk_m1 <- mixed("response ~ instruction*inference+(1|id)", sk2_aff, method = "S", progress = FALSE) sk_m2 <- mixed(response ~ instruction*inference+(1|id), sk2_aff, method = "S", progress = FALSE) expect_equivalent(fixef(sk_m1$full_model), fixef(sk_m2$full_model)) }) test_that("character variables are treated as factors", { data("sk2011.2") # use only affirmation problems (S&K also splitted the data like this) sk2_aff <- droplevels(sk2011.2[sk2011.2$what == "affirmation",]) sk_m1 <- mixed(response ~ instruction*inference+(1|id), sk2_aff, method = "LRT", progress = FALSE) sk2_aff$instruction <- as.character(sk2_aff$instruction) sk2_aff$inference <- as.character(sk2_aff$inference) sk_m2 <- mixed(response ~ instruction*inference+(1|id), sk2_aff, method = "LRT", progress = FALSE) expect_equivalent(anova(sk_m1), anova(sk_m2)) }) test_that("mixed works with long formulas", { data(obk.long) obk2 <- obk.long colnames(obk2) <- sapply(colnames(obk2), function(x) paste0(x, x, x, x, x, x)) expect_is(mixed(valuevaluevaluevaluevaluevalue ~ treatmenttreatmenttreatmenttreatmenttreatmenttreatment * phasephasephasephasephasephase * hourhourhourhourhourhour + (1|idididididid), obk2, method = "LRT", progress = FALSE), "mixed") }) test_that("nice.mixed and print.mixed can handle old objects", { # created via: # require(devtools) # dev_mode() # install_url("https://cran.rstudio.com/src/contrib/Archive/afex/afex_0.13-145.tar.gz") # require(afex) # data(obk.long) # m1 <- mixed(value ~ treatment * phase + (1|id), obk.long) # m2 <- mixed(value ~ treatment * phase + (1|id), obk.long, method = "LRT") # m3 <- mixed(value ~ treatment * phase + (1|id), obk.long, method = "PB") # save(m1, m2, m3, file = "lmm_old_object.rda") # dev_mode() load("lmm_old_object.rda") # # load("tests/testthat/lmm_old_object.rda") expect_is(suppressWarnings(nice(m1)), "data.frame") expect_is(suppressWarnings(nice(m2)), "data.frame") expect_is(suppressWarnings(nice(m3)), "data.frame") expect_output(suppressWarnings(print(m1)), "treatment") expect_output(suppressWarnings(print(m2)), "treatment") expect_output(suppressWarnings(print(m3)), "treatment") }) test_that("nice.mixed, print.mixed, and anova.mixed can handle objects with full.models", { load("mixed_with_dot.rda") # #load("tests/testthat/mixed_with_dot.rda") expect_is(suppressWarnings(nice(sk_m1)), "data.frame") expect_is(suppressWarnings(nice(sk_m2)), "data.frame") expect_is(suppressWarnings(nice(t2)), "data.frame") expect_output(suppressWarnings(print(sk_m1)), "instruction") expect_output(suppressWarnings(print(sk_m2)), "instruction") expect_output(suppressWarnings(print(t2)), "treatment") expect_is(anova(sk_m1), "data.frame") expect_is(anova(sk_m2), "data.frame") expect_is(anova(t2), "data.frame") }) test_that("lmer_alt works with GLMMs", { skip_if_not_installed("mlmRev") if (require("mlmRev")) { expect_that(lmer_alt(use ~ age*urban + (1 | district), family = binomial, data = Contraception, progress=FALSE), is_a("glmerMod")) } }) test_that("lmer_alt works with NA in independent variables", { data(sk2011.2) # use only affirmation problems (S&K also splitted the data like this) sk2_aff <- droplevels(sk2011.2[sk2011.2$what == "affirmation",]) sk2_aff$instruction[5] <- NA assign("sk2_aff", sk2_aff, envir = .GlobalEnv) # set up model with maximal by-participant random slopes sk_m1 <- suppressWarnings(lmer_alt(response ~ instruction*type+(type||id), sk2_aff, expand_re = TRUE)) expect_true(inherits(sk_m1, "merModLmerTest") || inherits(sk_m1, "lmerModLmerTest")) }) test_that("lmer_alt works with custom contrasts", { ## see: https://afex.singmann.science/forums/topic/trouble-with-ordered-contrasts-and-lmer_alt Subj <- rep(1:10, each = 10) Item <- rep(1:10, times = 10) IV1 <- rep(1:5, times = 20) DV <- rnorm(100) data <- as.data.frame(cbind(Subj, Item, IV1, DV)) data$Subj <- as.factor(data$Subj) data$Item <- as.factor(data$Item) data$IV1 <- as.factor(data$IV1) contrasts(data$IV1) <- MASS::contr.sdif(5) mafex <- lmer_alt(DV ~ IV1 + (1 + IV1||Subj) + (1|Item), data = data) expect_is(mafex, "merMod") expect_identical(colnames(ranef(mafex)$Subj), c("(Intercept)", "re1.IV12.1", "re1.IV13.2", "re1.IV14.3", "re1.IV15.4")) }) afex/tests/testthat/test-afex_aov.R0000644000176200001440000001410014076011251017060 0ustar liggesusers context("ANOVAs: check that afex_aov return value works") test_that("split-plot produces an afex_aov object without error", { data(obk.long, package = "afex") split_plot1 <- aov_car(value ~ treatment * gender + Error(id/(phase*hour)), data = obk.long, observed = "gender", return = "afex_aov") split_plot2 <- aov_4(value ~ treatment * gender + (phase*hour|id), data = obk.long, observed = "gender", return = "afex_aov") split_plot3 <- aov_ez("id", "value", obk.long, between = c("treatment", "gender"), within = c("phase", "hour"), observed = "gender", return = "afex_aov") expect_that(split_plot1, is_equivalent_to(split_plot2)) expect_that(split_plot1, is_equivalent_to(split_plot3)) expect_that(split_plot1, is_a("afex_aov")) ## is same with numeric factor: obk.long$hour <- as.numeric(as.character(obk.long$hour)) split_plot4 <- aov_car(value ~ treatment * gender + Error(id/phase*hour), data = obk.long,observed = c("gender"), return = "afex_aov") expect_that(split_plot1, is_equivalent_to(split_plot4)) }) test_that("purely-between produces afex_aov objects without error", { data(obk.long, package = "afex") out1 <- aov_car(value ~ treatment * gender + Error(id), data = obk.long, observed = "gender", return = "afex_aov", fun_aggregate = mean) out2 <- aov_4(value ~ treatment * gender + (1|id), data = obk.long, observed = "gender", return = "afex_aov", fun_aggregate = mean) out3 <- aov_ez("id", "value", obk.long, between = c("treatment", "gender"), observed = "gender", return = "afex_aov", fun_aggregate = mean) expect_that(out1, is_equivalent_to(out2)) expect_that(out1, is_equivalent_to(out3)) expect_that(out1, is_a("afex_aov")) }) test_that("purely-within produces afex_aov objects without error", { data(obk.long, package = "afex") out1 <- aov_car(value ~ Error(id/(phase*hour)), data = obk.long, return = "afex_aov") out2 <- aov_4(value ~ 1 + (phase*hour|id), data = obk.long, return = "afex_aov") out3 <- aov_ez("id", "value", obk.long, within = c("phase", "hour"), return = "afex_aov") expect_that(out1, is_equivalent_to(out2)) expect_that(out1, is_equivalent_to(out3)) expect_that(out1, is_a("afex_aov")) }) test_that("within plus covariate produces afex_aov objects without error", { data(obk.long, package = "afex") out1 <- aov_car(value ~ gender + Error(id/(phase*hour)), data = obk.long, return = "afex_aov") out2 <- aov_4(value ~ gender + (phase*hour|id), data = obk.long, return = "afex_aov") out3 <- aov_ez("id", "value", obk.long, within = c("phase", "hour"), covariate = "gender", return = "afex_aov") expect_that(out1, is_equivalent_to(out2)) expect_that(out1, is_equivalent_to(out3)) expect_that(out1, is_a("afex_aov")) }) test_that("afex_aov object contains the right things", { data(obk.long, package = "afex") out1 <- aov_car(value ~ treatment * gender + Error(id/(phase*hour)), data = obk.long, observed = "gender", return = "afex_aov", include_aov = TRUE) expect_that(out1[["anova_table"]], is_a(c("anova", "data.frame"))) expect_that(out1[["aov"]], is_a(c("aovlist", "listof"))) expect_that(out1[["Anova"]], is_a(c("Anova.mlm"))) expect_that(out1[["lm"]], is_a(c("mlm", "lm"))) expect_that(out1[["data"]], is_a(c("list"))) expect_that(attr(out1, "dv"), is_a(c("character"))) }) test_that("afex_aov objects works without aov object", { data(obk.long, package = "afex") aop <- afex_options() afex_options(emmeans_model = "univariate") afex_options(include_aov = TRUE) a1 <- aov_car(value ~ treatment * gender + Error(id/(phase*hour)), data = obk.long, observed = "gender", include_aov = FALSE) a2 <- aov_4(value ~ treatment * gender + (phase*hour|id), data = obk.long, observed = "gender", include_aov = FALSE) a3 <- aov_ez("id", "value", obk.long, between = c("treatment", "gender"), within = c("phase", "hour"), observed = "gender", include_aov = FALSE) expect_equal(a1, a2) expect_equal(a1, a3) expect_null(a1$aov) skip_if_not_installed("emmeans") expect_message(em1 <- emmeans::emmeans(a1, "treatment"), "multivariate") expect_message(em2 <- emmeans::emmeans(a1, c("phase", "hour")), "multivariate") expect_identical(as.data.frame(summary(em1))$df[1], as.data.frame(summary(em2))$df[2]) ad <- aov_car(value ~ treatment * gender + Error(id/(phase*hour)), data = obk.long, observed = "gender") afex_options(include_aov = FALSE) an <- aov_car(value ~ treatment * gender + Error(id/(phase*hour)), data = obk.long, observed = "gender") expect_null(an$aov) expect_is(ad$aov, "aovlist") em3 <- emmeans::emmeans(ad, c("phase", "hour")) expect_message(em4 <- emmeans::emmeans(a1, c("phase", "hour")), "multivariate") expect_false(any(as.data.frame(summary(em3))$df == as.data.frame(summary(em4))$df)) afex_options(aop) # reset options }) test_that("better error message in case of all data having NAs", { data("stroop") # stroop_e1 <- stroop %>% # filter(!is.na(acc)) %>% # filter(study == "1") %>% # droplevels() stroop_e1_na <- stroop[ stroop$study == "1", ] suppressWarnings(expect_error(aov_ez( id = "pno", dv = "acc", data = stroop_e1_na, within = c("congruency", "condition") ), "Try adding to ANOVA call: na.rm = TRUE")) expect_is(aov_ez( id = "pno", dv = "acc", data = stroop_e1_na, within = c("congruency", "condition"), na.rm = TRUE, include_aov = FALSE, fun_aggregate = mean ), "afex_aov") }) afex/tests/testthat/test-mixed-effects.R0000644000176200001440000000152614076033712020031 0ustar liggesuserscontext("mixed interplay with effects") test_that("mixed works with effects", { skip_if_not_installed("MEMSS") data("Machines", package = "MEMSS") # simple model with random-slopes for repeated-measures factor # requires: set_data_arg = TRUE m1 <- mixed(score ~ Machine + (Machine|Worker), data=Machines, set_data_arg = TRUE, progress = FALSE) testthat::skip_if_not_installed("effects") testthat::skip_if_not_installed("emmeans") library("effects") set_default_contrasts() em1 <- emmeans::emmeans(m1, "Machine") ef1 <- Effect("Machine", m1$full_model) # expect_false(any( as.data.frame(ef1)$fit == as.data.frame(em1)$emmean )) set_sum_contrasts() ef2 <- Effect("Machine", m1$full_model) expect_equal(as.data.frame(ef2)$fit, as.data.frame(em1)$emmean) }) afex/tests/testthat/test-afex_plot-basics.R0000644000176200001440000003205314076043174020533 0ustar liggesuserscontext("afex_plot: basic functionality") data(obk.long, package = "afex") # estimate mixed ANOVA on the full design: a1 <- aov_car(value ~ treatment * gender + Error(id/(phase*hour)), data = obk.long, observed = "gender") test_that("all input type works and warnings are correct", { testthat::skip_if_not_installed("emmeans") testthat::skip_if_not_installed("ggplot2") expect_warning( em1 <- afex_plot(a1, ~phase*hour, ~treatment+gender, return = "data"), "mixed within-between-design" ) expect_warning( em2 <- afex_plot(a1, c("phase", "hour"), ~treatment+gender, return = "data"), "mixed within-between-design" ) expect_warning( em3 <- afex_plot(a1, ~phase*hour, c("treatment", "gender"), return = "data"), "mixed within-between-design" ) expect_warning( em4 <- afex_plot(a1, c("phase", "hour"), c("treatment", "gender"), return = "data"), "mixed within-between-design" ) expect_equal(em1, em2) expect_equal(em1, em3) expect_equal(em1, em4) expect_warning( em5 <- afex_plot(a1, c("phase", "hour"), return = "data"), "show within-subjects factors, but not within-subjects error bars" ) expect_warning( em6 <- afex_plot(a1, ~phase*hour, return = "data"), "show within-subjects factors, but not within-subjects error bars" ) expect_equal(em5, em6) expect_warning( em7 <- afex_plot(a1, c("treatment", "gender"), panel = "phase", return = "data", error = "within"), "between-subjects factors, but within-subjects error bars" ) expect_warning( em8 <- afex_plot(a1, ~treatment*gender, panel = "phase", return = "data", error = "within"), "between-subjects factors, but within-subjects error bars" ) expect_equal(em7, em8) }) test_that("ANOVA plots are produced", { testthat::skip_if_not_installed("emmeans") testthat::skip_if_not_installed("ggplot2") expect_is(afex_plot(a1, "hour", error = "within"), "ggplot") expect_is(afex_plot(a1, c("phase", "hour"), trace = "treatment", error = "none"), "ggplot") expect_is(afex_plot(a1, "phase", trace = "hour", panel = "treatment", error = "within"), "ggplot") }) test_that("mixed plots are produced", { testthat::skip_if_not_installed("emmeans") testthat::skip_if_not_installed("ggplot2") data("fhch2010") # load fhch <- droplevels(fhch2010[ fhch2010$correct,]) # remove errors ### reduced data.frame length # fhch <- fhch[unlist(lapply(which(as.numeric(fhch$id) != # c(NA, fhch$id[-length(fhch$id)])), # function(x) 0:29 + x)),] mrt <- mixed(log_rt ~ task*stimulus*frequency + (1|id), fhch, method = "S", progress = FALSE) p1 <- afex_plot(mrt, "task", id = "id") expect_is(p1, "ggplot") expect_equal(p1$labels$y, "log_rt") p2 <- afex_plot(mrt, x = "stimulus", panel = "task", id = "id") expect_is(p2, "ggplot") expect_equal(p2$labels$y, "log_rt") p3 <- afex_plot(mrt, x = "stimulus", trace = "task", id = "id") expect_is(p3, "ggplot") expect_equal(p3$labels$y, "log_rt") p4 <- afex_plot(mrt, x = "stimulus", trace = "frequency", panel = "task", id = "id") expect_is(p4, "ggplot") expect_equal(p4$labels$y, "log_rt") }) test_that("lme4::merMod plots are produced", { testthat::skip_if_not_installed("emmeans") testthat::skip_if_not_installed("ggplot2") Oats <- nlme::Oats Oats$VarBlock <- Oats$Variety:Oats$Block Oats.lmer <- lmer(yield ~ Variety * factor(nitro) + (1|VarBlock) + (1|Block), data = Oats) p1 <- afex_plot(Oats.lmer, "nitro", id = "VarBlock") expect_is(p1, "ggplot") expect_equal(p1$labels$y, "yield") expect_is(afex_plot(Oats.lmer, "nitro", "Variety", id = "VarBlock"), "ggplot") expect_is(afex_plot(Oats.lmer, "nitro", panel = "Variety", id = "VarBlock"), "ggplot") ## check that id argument works: d1 <- afex_plot(Oats.lmer, "nitro", id = "VarBlock", return = "data") d2 <- afex_plot(Oats.lmer, "nitro", id = "Block", return = "data") d3 <- afex_plot(Oats.lmer, "nitro", id = c("Block", "VarBlock"), return = "data") expect_lt(nrow(d2$data), nrow(d1$data)) expect_lt(nrow(d2$data), nrow(d3$data)) expect_identical(nrow(d1$data), nrow(d3$data)) }) test_that("afex_plot works with various geoms (from examples)", { testthat::skip_if_not_installed("ggplot2") testthat::skip_if_not_installed("ggpol") testthat::skip_if_not_installed("ggbeeswarm") testthat::skip_if_not_installed("emmeans") data(md_12.1) aw <- aov_ez("id", "rt", md_12.1, within = c("angle", "noise")) p1 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.3, data_arg = list( position = ggplot2::position_jitterdodge( jitter.width = 0, jitter.height = 5, dodge.width = 0.3 ## needs to be same as dodge ), color = "darkgrey")) expect_is(p1, "ggplot") # 2. using ggbeeswarm::geom_beeswarm p2 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.5, data_geom = ggbeeswarm::geom_beeswarm, data_arg = list( dodge.width = 0.5, ## needs to be same as dodge cex = 0.8, color = "darkgrey")) expect_is(p2, "ggplot") # 3. do not display points, but use a violinplot: ggplot2::geom_violin p3 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", data_geom = ggplot2::geom_violin, data_arg = list(width = 0.5)) expect_is(p3, "ggplot") # 4. violinplots with color: ggplot2::geom_violin p4 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", mapping = c("linetype", "shape", "fill"), data_geom = ggplot2::geom_violin, data_arg = list(width = 0.5)) expect_is(p4, "ggplot") # 5. do not display points, but use a boxplot: ggplot2::geom_boxplot p5 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", data_geom = ggplot2::geom_boxplot, data_arg = list(width = 0.3)) expect_is(p5, "ggplot") # 6. combine points with boxplot: ggpol::geom_boxjitter p6 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", data_geom = ggpol::geom_boxjitter, data_arg = list(width = 0.3)) ## hides error bars! expect_is(p6, "ggplot") # 7. nicer variant of ggpol::geom_boxjitter p7 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", mapping = c("shape", "fill"), data_geom = ggpol::geom_boxjitter, data_arg = list( width = 0.3, jitter.params = list(width = 0, height = 10), outlier.intersect = TRUE), point_arg = list(size = 2.5), error_arg = list(size = 1.5, width = 0)) expect_is(p7, "ggplot") # 8. nicer variant of ggpol::geom_boxjitter without lines p8 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.7, mapping = c("shape", "fill"), data_geom = ggpol::geom_boxjitter, data_arg = list( width = 0.5, jitter.params = list(width = 0, height = 10), outlier.intersect = TRUE), point_arg = list(size = 2.5), line_arg = list(linetype = 0), error_arg = list(size = 1.5, width = 0)) expect_is(p8, "ggplot") }) test_that("relabeling of factors and legend works", { testthat::skip_if_not_installed("emmeans") testthat::skip_if_not_installed("ggplot2") data(md_12.1) aw <- aov_ez("id", "rt", md_12.1, within = c("angle", "noise")) ## relabel factor levels via new_levels p1 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", factor_levels = list(angle = c("0", "4", "8"), noise = c("Absent", "Present"))) expect_equal(levels(p1$data$noise), c("Absent", "Present")) expect_equal(levels(p1$data$angle), c("0", "4", "8")) p2 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", factor_levels = list( angle = c(X8 = "8", X4 = "4", X0 = "0"), noise = c(present = "Present"))) expect_equal(levels(p2$data$angle), rev(c("0", "4", "8"))) expect_equal(levels(p2$data$noise), c("absent", "Present")) p1d <- afex_plot(aw, x = "noise", trace = "angle", error = "within", factor_levels = list(angle = c("0", "4", "8"), noise = c("Absent", "Present")), return = "data") p2d <- afex_plot(aw, x = "noise", trace = "angle", error = "within", factor_levels = list( angle = c(X8 = "8", X4 = "4", X0 = "0"), noise = c(present = "Present")), return = "data") expect_equal(p1d$means$lower, p2d$means$lower) expect_warning(p3 <- afex_plot(aw, x = "noise", trace = "angle", error = "mean", factor_levels = list( angle = c(X8 = "8", X4 = "4", X0 = "0"), noise = c(present = "Present"))), "show within-subjects factors, but not within-subjects error bars") expect_equal(levels(p3$data$angle), rev(c("0", "4", "8"))) expect_warning(p3d <- afex_plot(aw, x = "noise", trace = "angle", error = "mean", factor_levels = list( angle = c(X8 = "8", X4 = "4", X0 = "0"), noise = c(present = "Present")), return = "data"), "show within-subjects factors, but not within-subjects error bars") expect_warning(p3nd <- afex_plot(aw, x = "noise", trace = "angle", error = "mean", factor_levels = list(angle = c("0", "4", "8"), noise = c("Absent", "Present")), return = "data"), "show within-subjects factors, but not within-subjects error bars") expect_equal(p3d$means$lower, p3nd$means$lower) expect_warning(p4d <- afex_plot(aw, x = "noise", trace = "angle", error = "between", factor_levels = list( angle = c(X8 = "8", X4 = "4", X0 = "0"), noise = c(present = "Present")), return = "data"), "show within-subjects factors, but not within-subjects error bars") expect_warning(p4nd <- afex_plot(aw, x = "noise", trace = "angle", error = "between", factor_levels = list(angle = c("0", "4", "8"), noise = c("Absent", "Present")), return = "data"), "show within-subjects factors, but not within-subjects error bars") expect_equal(p4d$means$lower, p4nd$means$lower) expect_error( afex_plot(aw, x = "noise", trace = "angle", error = "within", factor_levels = list(angle = c("0", "4"), noise = c("Absent", "Present"))), "length of new factor_levels for 'angle' != length of factor levels" ) p2 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", legend_title = "Noise Condition") expect_equal(p2$guides$shape$title, "Noise Condition") expect_equal(p2$guides$linetype$title, "Noise Condition") }) test_that("labels are correct in case variables are of lenth > 1", { testthat::skip_if_not_installed("emmeans") testthat::skip_if_not_installed("ggplot2") data(obk.long, package = "afex") # estimate mixed ANOVA on the full design: a1 <- aov_car(value ~ treatment * gender + Error(id/(phase*hour)), data = obk.long, observed = "gender") p1 <- afex_plot(a1, c("phase", "hour"), c("treatment", "gender"), error = "none") p2 <- afex_plot(a1, c("phase", "hour"), error = "none") expect_match(p1$labels$x, "phase") expect_match(p1$labels$x, "hour") expect_match(p1$guides$shape$title, "treatment") expect_match(p1$guides$shape$title, "gender") expect_match(p2$labels$x, "phase") expect_match(p2$labels$x, "hour") }) afex/tests/testthat/afex_aov_16_1.rda0000644000176200001440000043576513664111747017243 0ustar liggesusers\MpElV0I9 lų@1 QZba y|{;wnv6nBbbbZ{ئZk=a~xoB%_;P/ּV|-6[f'8Rg.ʭ+]3:*H̒/^G]Vp#_>v 8|li|g)G؟@ \W8;ŪjYIE@di>t e~ sOJX03g<6끔.j ڻfX8V=j㰙V6HkUKJ|ia([Q^ZoӞVvL-P]K+s3[3+3'u&s oA~Z']J?Ͳ58zc;Qfc`jlo<3j gS-xz3iEV7Vl-|ixcӵo06}w&ֶf-\֫l7v/_9oZ;/ mnQn(v5ZMieEjQs_݇XgG_(|at'_7yM-7Z)r~>=`&?$-X oh ?}2W^Sgu˄^-7oڊ6^oVئp_MJpfc[﯑O-k _ϖOPPH.Ih.`H z͍MmmN=?yk)oő[}X[b;|[/ͯ%mbtdƫo9Xۚ¿r;w@_~b,Qܥ<_c_9;vݰi1NYm`fe߂ߗPVcs3$$OT7XelY4*' 7=G }?~Fߡ^[n?2~qd/U4dD%Mh&H×oulyu^M *$t7FC=AD_13?:nn; } AZi } }~p2aTiSa:?nז^xp}-M7oULp9ǝ-Lo6^e<wyxԶGZ/$xkϙ'o~dTu8+fV~ڻ?YwE⺩֜xV1R9U|&3S ii`i|-ǻu/;{f/_5cLΠ ,kS}{OՎWq(vp ܇"CP}(>qE܇"C$/ilyӒIuQf(X=*3o=.+G]JN1S4|38*|msķ>S>n&ό+v St{dlގ?1*RzoUCdu3w[0ԦxފK>/#΂72rq#z5C<l6g _*ܖ3V&9E9f>gds`1ߥ}I$]0s'{<5d'׭j#R}ruleL?z-WlƭC$nzhxqfy囆wp`DJ~wa$͋gm?Iom΃o;e0:cY|tûs, 0%+.ʈy_9E|Z]3#T} 8(>i&KXX^-~౫|V/@g~:9'o iдN9Y:-=B/ߨI_GZt2*SOx*E7[tOq#u -kk"~?⡏؈7Չ׶K~+W|i?9[{Uց/N=(OB#>\q\V+}9}7.} ? = G,/=svݾ/ 80zs肳vK]9b̲t֢utރ/ox0 U@E+y2:7s@^nct.WץS(ӫ2s`D0:͖/;$nGy'ΘTӹ5j{eйw_I^sUة'V󮥂/9I}8̩|VyO=.{qʸe܇2CP}>Tp*܇ CP}>TqU܇*CP}>& ח:1lں)1s"Na;~w2_q/{T/Ȣ?vAE)דc|w(qqs|yˍl{AׯtgT<-/cFG_||G{O .~G3ckQtFwK]68RϟW` U͟|o%~Ge{NzK`~k{|UACs?!qs:Us;y!ȿEpkFAD شL.eO̠(8v)(Տ뭆vay7;҄|Hôip/ / ޓ4zy}:-7; '+-,߃'k7N=9z]9Hqʹ{b (vs ]p^̪(z Fz9X.|o@|p"Q9!Yߐg}n}vz0SJb?/H5}~ Fx^' ϭl?|E13ZZDly6~s=l?t;_g{ٶbFb7nr=f'ߏc'3yry3JmͯO)h+岤Ix`0  &$<0`LIx`j5܇C P}>pj-'_mZ3w`o|/ Hhwkk0~Jô6Oat$, [U MO(M+qza2SaP|Fu͗産rp¯"ߥ]ŝ}[g$}lYά_iZXi)\'N{h C9sm\w=c|٥p,2eٳYY+Nk71 t84{83"D>_\;_V[Q//7hHf˥o ^4?Y5Fz^q`{#_eSӟ:{;lyw㓯c fT]˗:{_Oy;Uۿce&^wroW7WWj|Z`E\^}Q}LLJ^DrYF|-(j}F\Ϗ[$i60 tjMHXnt(7zS{sX;8eMi:M)Ў^_>כ F ԛL~g@Z^W>Lx~ 6;-ScsTY.4Ne9 fyxj N m)9o*LqqY韆.✀B*-K}ۢ{f'nfֶG쟎Ma܅ E)D1%Bwj v ՙ{w\OZ)R(Q_a{g{{P>tI$f!-O*s"E_Y[l{NkxӬD *@Ky| *RH"ӢcTPC7Y6 dX՜hOлf ߓwI>t$՝”koMl?QlJD(HR^pʑ[F"6Ǽl"(y I7m-2NYNm"E[r`qƅ GX} yMeNbMڹ'IcK+VK/)R?OtIx\CDžߋ 8FMP8oHq#_U 4ĀD#۝p0ݾh=_ zqFG\n/M4Ӧ=%ik#wl&IJUpI'sܲM"Eϛ w?_`.b8V|I +Wz$R?֜"B.lSXovay[i OSl ng|; ;?8޳DO84M4PwCFʝnLCt)q>|k8;x RPzbPwj~yޢ.?W5٠בv !z|lɝgDCgPDCWvަNh+a=X@ĸ+ҦB=:r"xs~$ھr9&G#R`u^DC֞XNҳDCW|`I邒f0=svnDy}]%Iݣ no4Kmx'itbN9x l?Si_&ϲ,V@or{D7/ҝhQٜDvfghy)D]ٗB4d;헑 onC^ӉN<|"hXcGW}'$^7kW":-%y{E'!:ށ,7s( 9a=tIauW/m֨D}c_!2a }lQN:g XQP"C4pDֆW8/shBۆdkV]?nHm O4;.q̙-G 'AgN$Jg"}-E;̔OLhš$0_/x]8]`|mEg{Ϊi/WWؒ~Q=z b4o׵Y9'QHo^DG p ;"-hvy ^?|)OhKԡdIw զc~QC$]RiZkSSw,)0C8C PC ¸IUqS90+i_}fqdx|]Ÿ/;Mz:ŏ&e[aA>QdkuJw__ Q?l\5ŒF4ًޫ]` %_,Z犵>7GO"baaN5-='{g <΁(zΉJ?s_/ϋA˟;xܤXűgJ!fSIzv>X_Q0z/ Os[L\>/?8J )3hwlT#;0#? \UK_#J0ݏlLjnD22@cȱv$ECsO'7YH?gf_~' Gst=La;|7_xà :n p8d>(3t"z.K YՊWdX2"=|~D}G!hYrdߒtzA?N`C7s ^ԚIdԧ0DѠe|L6kǾӧk '[HTE;ܟ?t~2;(=ΧxU Hh??t ݇]o|C/qhb֏lECAuǙ=Xu{OӔr~ه-)"ugJ$QoyKwؑ-1(Q%'zMDnsY/Yoo=]l^'" uku!ٳ'DklKŁV]Iҵƹukogu9f`>?w8w0h>ES^'(z;|݇~6ǟ鐕rm׬Rbň!D݇=RIYǴ)_D(ƌDt8F9aL%7L'ø.Kwܒ[gOzd߭7+c2Ψ%{D\ug I׮)nz~vV4''h>PBx/ǃ(.'pkz8݇S|AyX?ˡ1_r=BM5Q `J]TSJL#{n9 Ϥ.%?+z)YaN*U\6Ƙ`(psUCGin k#4xTrC~\E֪(lD"څs$ F/=%:M"fPC9(1l/>g}8z4Ƒ_(ޡyWF{iZ? WaI(g7-z6Et=ټ;NXu$!kSFŻB6m̕?ZΠ&٬df+M̋HGï9كcPO^=qaI?E#J7} [|xVfDz>ӽrNIҵn~Y?Du^#(nr ?(cYCP84:n yG/qusA)P,tLvio1ǎ+guKFԽt{Z5SlJD=*QJ6nހQD$\zݦ^D{hȗ<DfHg]=I}^n#=G5r?:~Q^ݖ$]eۤ@aȿ̾N\Aq OLq1q/Ax2OFqIPC͠o`Ces|R-/޵:{㲒JcGg3Be{D]҉-$[#~ࠪ*Q75Mg/Ⱥ ^URLct[&?XIԳ d6W'W&xOd B$SJMFm5Qq٬rHt':ᭈTF3'pnſBC ?4NC5נr'Q3Pܮ<t>\oLuFm= L>$Қё1; 6\#z,~}V ?Df9׽<9\9Q7v 5o<$1pd Itk<ߗ!:r ٻAM^4$'fpވ0c'j .#-:읂gkU~y3H #4ZX}`4rF|Ax%;tFsܹ2Pts|aDaZM"z$fLDn{ f%z,o]u:(f1QW -˺IJKn1KϖmV$QwGZȺ>͉ICLrڝd74=\lY;`V9nr'~Ockz)D;'ޫ}do82w# Hҵ-ZNTiӹW (E.G088UYxs_|:8;h<=p=Q(.Ai|ތӠ*]ZqvvC&< zdi DnWc}9&fvo;Q u;u}')QInk%Z&;DHҌM6n{}7jz b`g81=| GqPUx);h8":Om~ǘs_>U08ܮooNY_dbZ=_Fڡr d/:pѣo.&|XD]ש1*UmINtZ;~ڧ(%Q>i뷷!`N}d˵Ƹ՜!.A̰*Y'Uzn0!]ƆDDm_{NdfMU$zDYRm"w)EKuT^xI˫r"DUzGv{ڑ[tnEln2>v)Vd :9E|=KԽcyԃdyⓢ,${rX1Jy_>Mc#f .x[c ,/"k9Eq0t/UhU~{(8t\?LQ\Cp's8ޡ}bS8i(/APCYAx?>428i_A 'Rd'#FYAF(E8.Q(va 8q"g=|TN2yIh4]L*_+ԼdwNALJ}ݰhaV҇D\bphFg$܈tw 0"9ozO;youmSpvfo rS{S,- >wܓ* ˪ضDb"(K4PBӉW:k:шmǶDO|hzEMI_}qƽ2ڹk@ve^tDdi`Bd6$є#vϳ@A}@%t"ԓN w(ޡ\9ǡ4޻)#Z/  x{S/BX^Qy1sjXpOD}W$.ڧCԯꐡjic|&p"K$ ;=G':DZ'6DϟMY2ćWDƟk|~h~;(ChA H׉&UnhR*sEgnPD4۳T>f6hVSJۀ6D75Z2+*i M[_Ot{/ڥ}^zDwK`оsQd&{DR?HKhA[~m4kk&gJP4ތ1¦008p:2I:`TZhf*Yi_ D%Mo;c9/YM/r>Mh^g$٨/gsoJYKX/AYX a~!z/,(]ué@ayLlTgll]a}bTZb n$IW](-}In2hYO޿ ڽ{EfDvHT1gȳgD'УҝefiEt%rESDb/0Zf=2}ѝujiug8MTͼj:YJ":]ĻO/JΉzFkU3D|dQy N. %j}]yqnϫ򞂅I.R9WHkqh.4k,umc2|4w Cap^\RT4 r|`мWM睃7 _u*؟W.O %vHlM''Z9YkӴ$?D|m GKv(^D/VnaދDf[5'Q%:Hl5DUu7 j]BTcvS֗eDoI<RGtJriDH$~13ѹ3ov}GCT`խaK< Cq7.ܒ9t..;yѼh kL;A=Y`dXΰ|x9M{isnl0 =,J[]A\[Uh3Dy~ɪ "jASDkJtݑ׽5ZfIд b7rϛJ\l˥DˍnH_1 ':&fʈgrbZ&b)DSDTQ^=QsҔYD ۹Q_͆mi$:M\q8e35?qfAӉlkљvΨO}o; K^|0|=0̶ɮ@9| O'"Ŷ5X {Y扁 JoŀŒod/~FGED\*ʗg.3Rb?ٗS@tA.DtkCsbHVAVȽWɨz吤+>w#{$A -`^蘇:37Dt'N>D'|/6iKTA׽fqQȘp)xeW+I@ͭ_\x蔭3w':Upd]Ͻ{@˿-5h6zô+ףVoX^)z=Q҅o ϶";2 vQc;@tRH+Ɏw}J6݆]A8u *2;.]sߞV)T wԏF׊.qxoA#ٛ7v%_f'IW(0ɐ,ɋ$(צ%"1w;ʡϯ[ITU󚑓7"j蚗܁ڊ-":YlfQuVȖ=bE^t}Zq`}Z^Vj`@a{i)X nόM3l9y3]hSG ȂEYؗl'R(}"6JDYxCw!YW>b(LMDžf4̨jZ Ht6U:`e#dא[AtagudHiLtxǓ]{-+tŸ;S]Nt$(+ƐlyUx'4>_̹/ o|~5.ŕaiJ=r(ԠTzѓݬ;-$*EO&I:gv&Ϙo 3=E4g̮jRGR/,"޵yM}f(2")<<$ z Qek'#DƋﺟet x4h튠EDk4{N4=܇D2hU=![;vuDL5ƴFWΡRD՞?a?x+@_Ճj\˥δa|"5%SHlmf͞=2#Ia@c3eiKu"I3+75|h4Hdp߱(^mlQF<]m ٫VݳIY&ށDi,nV)W摭#]Nqv "},Aߔ15=L;ȑ$~s?~frIP8u`RGEw$IޕYI4?׹Cq$Ϸ5FƮHcK˿ݿLrD÷~R^fG?sl:+IM{ѓ=Wk[XK$}߉K͈lb}X?Ox(OL$iʧ]?5K`{$p{&Y~^׌J4cBY}n'ZRK4zɗlSVUXF#™6$AdNԝDQ;1fE|[9)ErQ.g~(*[˙?(>E{9/rQRGQ\TO+g"rQ*g\ErQ_]rQ|EV97g⣨\T.*\ErQ9EQT.*3srQ|wʙ[(>E}K(>Ero\E~97Z.rQ? /(*˙Q+GQ+gE\E?^rQ|}97/*ϖ⣨\Tc97/*g⣨EQTP(*o*gE](*73s_hhǶa6ъMCb'h4c\JA`:wr*̏[ Mހ ^g=?͆rGS$N6Jo7ńo//\^(a PNZo#,ԼԂ[M-j"/54I~nO[$[-;7izVaO\,Ş^04b\ Kfbw(>pXzi4jۋe赦 Ӿu^O%?X&r3;؏]QXy/lQ=RɹDZ-rUl쮁M\}{$}>_!A«n CqBPT>9?`踞Mk%ˮ>\ ~ ]P@3b Ķ;)l%|"g;G/g̯Ddn6s#m݀5H<[yEI$mC4Zx{m`:]" PxF h; "a:"&\?;<2BNjqPGhp9cy/Ml?xo^! Ldԟ볕l}_j!,wAq+Z(B>^3}eN;5L-YUdXvދb!鄮g9n͋c{L[lQݏb4 F2%GeӘΟ1rZT!0 V_{bI}]9UBeba[6wjxؐ^BҧoWf+qŗc6l5y1SjZ6y+^f-"g kH%6DL ].b{=4-NusH לMn\pr%,cV${ibBlAG0 {oǞo_ܻU1hѐ:gqh5ڈ$ʮ@/Z퉂 f i 1A`^p=+63/eĨl_ g`bB ΏN}Opq=?o]8wt4"A<+^ž[2Ha6T94Þ Ikfcl"" V iMx;nT$4? {n;z=xR16F&huMVǗOCjzF-#Qzߟ':Z>Mz5gSm*bSo;/ [0׽Ha=~HP Hvvmz`.$'_.kHugIgvcg@ ^nDqN}-n"s|eSwH-EӐ? 8>fJ갦#8h ׫g̀q*ӓlYS0ܨ$vǓԓFz_YײϜZBM39|v:ngQ,ԫ)Nx?{ sd5VnvMޟ E|L}H#V~X>tӜ s@i.`3H[ƾwFҌɎ{#ca }p]"fVM8EXzU^"i0I`( 9H6xR:b)úhS灤iW#nD~מ:[>uɞ Xf+txHYv'٬uyj絳"Wݢo'LqB~|`V',dVcRHT̊Dzib"iZB($5oθIӽGm#iGw_@ 8ZGϊup?u{H$]2;=J[>{ ] J>F;۴JI8|qkTo2ID|`%$pK7J, ,Gw ۸tGI,>ip " k*a﬙䊍 >'|MvanڮuE6Nu9;7kZ;72r6m&Fz3$g}p' "鸐Uacn~6\?g\%b#&NN}QŞҫuחGjUl< duGO2Kz#)?Dہ"-^#/|$j0Ha2SIWLN8qE ,* AӹG{g IWh^PxEsk !A=OnqkCb.yI!a$.Fžz 'Bj~Y+5l$-Hм|a[$-; kFLm@lE!/~heNKN8>%V90`$3vx$J'+?*_wն(x}<\+2UjǎM`Jq4xDvH0Ubo+qI!VIRy?т7'*Xa<<_BaX| ՈՍMSOXriVx-u5]sC l3lZ̦yug.hIY+(xl ˏ}9}u4f$H0E[D HA^H0ԗV q*+Wt=L{qYpn 5>b,$Y|2덴=H0ī>KYdOFgo9%IFT3 %/OXIx3d#~_Kx<=^gD8nŰjxv|=lW.¸k ڰ<ʕMY(l가'/ -([5}Ҭp\;BVv-1Ik=pytRzcGl5z;otc(~ppN\7rXgnlV$YްIqXnإ|dkԄ"eȌ 7<ƴ9`Mm(ؼ*m\:VM}t)/niQW~l#\ڱEo;ot|/N?,E=[[ *cY鲝]N7 $acYwhyRJ*HZ&wj1(Kllz z6~||)'26 d'ywM3FlE X3t<[Nո4?p^el ʺ V' Q kE7As~ \.['``;ql6ͮ-&&Y3}nEa6v&L:c{;vnvƲ[tO`qeijC{ƽ; guVWWl;3s; 5?=5V㡘ӎȬWF϶j`F>~cT`}?*FJ>X=bUuqWj)ǎVMhvvSǀ7؉]N~qI;d|⦌,"J[ =o$]1>qZT g塆uGkWA 8WQB Qy(ʏ',>O ҂W-^9z?H(<amu|N]Sd萾4~GKaH:9YOpg;S*?=&$%n녤wLN$P"-IbTRcTzԽ&ulZ.F?>lPI°RݲOE?HpwO$8:< >k=|],ڏ21 aI$g=o_ g]tγ6dcӻܿ ,Wv,nί?F q:tvIp$8:ne IlV8lRyn;4K΂0v-t\qwq(i'<}aI =9zt ]A:/^ 99V$ I6n=ƖRشAVd [Q(WJ~t 6{i'aݓ|.Pڹ%Qt˗꫑XFX61GM#7t  Ak}$}U&3Vg$1"y`$Gt2uMmBhI jb]'i R\IGE:w߆A|hEwSF=F=VH:v2t$8#3p/H(Jg]_s~a?yx?# |/ݓO 糴jß~>(ƺoNյ?T* ÷:k(<̳c;6^e%%620lUYQHzÓaS5lrJ26HѶH(JhA w(>9_r<#tR00giMgz2"AL"iH:N%rKh;Va Idh~)ֆ%İ#_͋OF+JV@ b ^>Ӳ*tĞiQؒyG wg.bF}ze՛cw\ys܇+H:o{橣uI>HApSi>M}BA`36[(r-j,z>s<= ;u_IU~z)9o[ d\Z<׬|H:iL}>]0qޔgk#.myc^?'s^Y1}ܪznQZ\I_]bj)~h3?n ER̳bPŴG4_X H \+@zZ!gpC.>׽>>'^Dey R98|'?|8 DNÐ6æ,9cބ Y#6(n 8Z -bƖe,J ͱcloCt_WӺĦoH:p[yݱ.Hp~ͪIq*t\T>J7JSf1R Aqj7tb}N=+KFc>8|n񛦺sLy[u\zJuZKCVGo-FtO9vhY$Sq3$A ,=}H5so{C؃gd_T :v9`!Nպp*E߽jR"Tv=_c_ejˬTЛ)M ]=cGoS|js}+˺Q};y>-[{wâOomNt1ū,ye+Ct;36D~n`A yOQ5 I.5-Z $jc"y׌ V7}Rd슥%G.5',$6A }6@2^е"[zomHbX7YHLБcqHvXvZ~W@'c{_.ц갨I3lB,e#Zҳ~nwH' Q >8WK])7q++JҊrZLneƧWHQ6 CgdxY@$6GѪȵ^gjN_E'AiʔbMS62d-bOp{xǾ 9ӱ|յ>=j<^fHc56o\ኵ11yY^IUVU?6Oi 6N`di/u$eڪ[]kG/4ì[8/tR4$|љ#yJ~uƚjŝQ8]A9k5﵁f'D_ү$wzP$o"(-J]}Yy Bj<^lOP;U J[;:WT V`⓼~k'([ᆲ}(`d=4qPt<)w嬏깳at}c~HWlgH;5*lƘ  ^l@@}L1}Lڊ ݳI99=q B_>ݧ66eOuܕR3 ɯ{9Qs/ر*J]/IG@?I&:nW$u)|zkP8.ӺJ^}xzؙ`/Y)?QZ'G[ͩ+PG0dN=JU0~Ң)K ^O\3f`=@ϵ5O7ucSZGĥcO(@- lի l^Ń bₓe-*,6= r4>|v=[$X򯫑tzU 6Ggl~Ak$](d1oF_Ң(oK3DQEjGQZ4(-J4۞_J(-JvmM(-Jҿ7öN(-JҿfaJ(-JhaawEQ?l{_hlNJ {UPt_ݻlO[0}wo0̿}ao XM(;((|_>"_pg=tuzhc/LByYb(zh;(^ }8 X߆IhmiP}يmwe(_i%GC2l>\\Jw74G C!PwC;SS;Qw 8aԨOiBV}'\LѻםOaN}tD LץAѸrҥ өY@i/GNjn'gwnd4,ԑA k{ҷlٳ' JRsl;6>:aSwPњ G@H@e- sʖC@K{k ]YmxPO>b'}E3Pg`P1m;A/]fuZ$8vN/6ӞZ?z:؎CõU:D(kKtY)tϕrȝ&GyWlޠC>[}N ڢ7\NXZTrВ.u"8?fIt֩˅+ALjUGn|\l? P,Nޞqϰu#߱sM>{ҙykϬgTZ)Ux@Zj_|>z/!ulѡ/q_s}z/[xƚ} llLen8yֱcX]a/5&ہq& (X? B䄶cC4WX ?Oſ/ƈ 8R\ ?^Z~ik߭cRͶ69?\/;q>A9oB1jKG~.7_}  NsGܫa/fS[yVѹ/*vr.$iXӹ}'9+}3M?z[D_{jm!!{|\s'{hL3é;zkfyUS˟Fԡz}1pӋ&%N8'cB=Ec\:8g[V ??Y r/*-~op{Iv?dH]s@4 x̨{aH7v ea{Q|*ׁF k\gBDo?&取gJ¿im^dk(&/_+##z#:Nu6L;ij!'ۃnc=ٲ$],XgfXv)C1O|+Q /pXq|䔣|\Mě?x^c m3~ %Z/S9p3\~6P.xCy =Ms|Lb8g)"3NHKޒJW=O:ͻzeA5:z6u?ug&j.Xmk6Q|`<׽t3}pDuz@^`{w&ԦrRpԈSA΁I@=U_Ӊm߶vQKewD@涺GRHyσ>VLYtoV.{D_0I:A ~jt a $V ? ^jk OtVKs]6<^*﫯ЫP8Yc/Ztk"G:BY k cfԩXYxH6z˳z7j)kP{4JMgfc}"͚ic9 'Sag|v=lP|>1=6V-VǦ,a۵gQwtg{N!0~w3m`?]n rOa^n`JPF:s _kA(]SIgp":]l0O~[{pt{Q ]9>w~pʶyOWF?{{~8ry5,J Z}h$⊜w}Y߼OgRkhtsokĿ?d*8ԕ,kq%Wک?*T :2"}:n˪w2FU+sf; nl~>ntέ"輾kyRv?t:%Q]T@v݁B$Ep\ʮ@ڳ;Jk4kb_(#5YQoæL(lT]sچ]gYysnϛjF,RW!ybB :nFy|4(`C~g~q5OEi> ( `TzX]WIa:s'(>`.J'>9_nkNo̲vS@#@Zu :tw3 AelirXHb5xwN6DUbM3YUaʰ} @cr+G P}Rn45y_` Py?cw(=i\|WoecoL~OgKGBg=b0'xc^ΠaxuT{I:!N]PRr1z?bÑE.Y]<^`R踀#c a;;XTX/H7oDZ8v{(E}=hڼXͷdo ߨ͝|>6>T;#_8`w}uHsw7C6vxۤV/bzDEMmxA Pp^Ad3'?2Ec6iɫF{n]bvM1uiz={9_?q=VC9Ա2na!y5Wȓaۡ6aFl9o_V8~#v|s{a˅8V_UeV-[[!i*{'Rt Ӝ-k8V8kӅlG"Xq =[[lAw3ffggyhtHi'v2n^0UW=m16خMe \Es2kN74Saz)\ey=8 *-ՠBSkXXoiNRrG_-=tnjQ37")\!Gyٓxڨ:YmGIVc6eY 1u5ug^kq7֝}惂VIjS/3zVz a@B;lYbnnS)]W~:O1Sudohllz <g Mk L:֧Ӭ`v?ZP|D #hYLH*¡ø_QnVly[qެlxݔdGvbgk*=Gy wUyם""ۧ7=wƯxU~yA_|mwl#+5˕M,vL:c5F^Oyg@1|olK{-nF^7[{^: *;mi xi6NFG&]8?[uҬo^oG"*yohrη;h~) | WaՂvsۧ*u 9YpY4nCB '[xQ|;] ]%o|>.r|):.A9p;x|j+L 3 6)ݗӕ҇)ZR{ںYN?9Φ/z.R}H3tqCSÙ7gҧ}aH:_[uļ5>ʅ>]]瘹oi {{+Ϸ|)O.އ oIƮ+n SO N+ ǀÌl@RlӖtқ{M}jgYr9ɇKϥV5T=FWy45ET;sQ0S<^0sx ʉ푇8 VfL >.:#Pt8 ;'xH[~wև9p?߶t]%Ө==8^s@9ד"A?u18V0CxX`x&szP—+&3#ED}$IbbȒaf4ibZ|Q꓋ 8pL أeu6脹!q@ec"O9|Y:Z>|?zŵ 6d}.g9FHC 5 =C?^ѳ#8xޙ7{w}GTqiF-G >/#a߹>7ǩϧC vCxm`:??h=t U(st g̵룲VtCz͗tCEfl ]'=~F:,@kaalCRץ5{@yo'%s {ËWNRnM_&}^GG"*wSEBQ`U4~?V@]q;Gt 4C1څ{0wQnTC'vbW$] Z~`:c[OԂ  l_z?a{ OH-ۿ5Wϯ3I˞~g ΁S%[npmYwEįo _iD_w_MrL?b_靝+}6.Fj]p.k91,Ooݬѳg{L~;Iԁ7:xM =82ߺ0xjZq /b² ԑgWm~B׶b?cY?]Px{E\Clj~iz :_]N%ηU+C +,Lx7A-X@WdܤveK ea=|&1klu'H]nd֎.hb:sru_ӧnu[x$&S:c>vNv|ڻZ5+S@ v=wKѾ?3.B7z>Xn]83y'ĬǼ|X|<'ȳṰMc얣RӇwy`Y"^hUEdݎ}>=6N7!]}b/oVBit0i=jxگVuLy֯++^8h+'>g==jGVt;x WzKG)t>sX̻a5:\")O K.9Yt@nPPcieib!;PEk~B,KUP:Av>RW )]~gdhӥ^SK3 |RG]iģf'ZJ\pt\ױ^p.rQW{$*.CLşwڤJyq~mϴۯxzz)uMGs͢}{v8 聂~#Y\m}_+<]Q[Xvٟ:(W6T TjˌxK˯͙槆s!^e8o}WCxG$4vcD^m{¿ ̌>r9y-ҷ0[Η2ju0B4o5# $)S2+҄WPv¯6[V-x9}G٘WYC oVPb.|qp0]-p\a>ࢧw=+'x({-su /)"sNlmܓNSTۼGl?LwO|:ڥtu*NghvvټWtDY cBpJMqȥt՞1ыyق3uit+niR%޼DCE:|~Kǡdn?~]@Y?9VWN>z1,mF*}KnYOɰ,M{~j!|z'UpN@ _M3kʦXD o [622^?ن kN˽7@Z*_Z=-p d+M.4k.{RF4_<@OEG9U@Qp˰֠x{ PhcɑtťңWȝ.ii r'/>= mbKEsK?mv0nlF+]]+2O;d :YP7!k ]L$btۮUw{KDŽo*"]Dr9k,G #`pO+.qH@T߈o^\h EqGC30}=uDtC`~,+5|8Yw$(Yn2j zBjp{#ox7֤~C~Lr=uGWOPuHSl{TFP‡+.җl |ѿZs Mt֓%2>t v^-:OT?QƏs~x4{QF(?ÿӮ n?ˉ/ ǿO=/W3?]?ܯl"!>W 'r|]]x?5bU՗F%2遌cytuY>CzuMF|mBgas]*ӕX% 0NXXYw3|7vQ ϐv 8rQo (Pq=WB=?(>\s/Aڏ",/^ }!Ӡ*o]mX~lg:5G\-D')oh$Ȏ:BHo\ԼQč.rCPQQn!(nE* [AP!8h*"=N\W{|·O4OR$Mu/j53ۺK v\{4OaKd0EPlx<K&~|Aer^YFo,ueAyi_I.S qnpV79CƸNl2퓣 Õ-".8>C6y{2ZrOȦ%>n 27VYw#E~n W'~1(1#{C߸hv" Wѐ wkѧ֐L/ĽӮ%f$.C\>tq')2veelb +IoD6F] +miM\v`#LbJy]r1X=g\wmǐQ8zZqzԮsd+(Gz@qiBMcO>%rnSتSq -'TK[/{Ol;w; Q1PƋG;LD3j#zNh5zN@~r2!sqq^H6RSdD χ/m-J]I=+DIew2s=?A\Ѫ+zY!⳪\lr^q@%ASs3o\ˍAY=#cQQ/i+'zw?l} m;/qL޸~aϋ9_4=`Ij߮\c9>T:7b]Iϝ1iC z5{X!V#d5? fU9qW}zخrv{ϐtbi!o[aUI-܉H'go&{'# y%k!Ґ퉎jj^䙔˷n&M9TD^$ճzVuQ<|Ne|ǝ>/z^)^ 9bɨ[ ѐ [l#Z+4<ծ$#I>ؼ K_ ~ ޾X˄83_2dnճO֏(`{bRܞqQh2ƓSO}*̣1цpC0hR@&n/?Q,G^;p^W!b9Zblh ÉF&S<7<rJ{ wxi̭w =\(ݢ&tႩR\lP%o>sOm܈9䍧j߃vdnճO_ݻx(ɏ]V,j0̑l^Mqw[藯vY|}mVs9W}J߫۬O>+_Y7vs= \/Ht`~6s܃|҃5\e|ׄF1l⒤Qgdɴշw$Jm5>ooy/9a]qczV?=W[Ԥ?)4_ZYkߤ-9q!RHj$͓ sfZrNIvponL_VYG4l8曯ܽa;__v11퇽GxUOv{_6Rzv[i&pbe>F#9$`</ 0L\Fr9 0? $B>1<#Ef&g?g@hUYT>gk=݃;Ho?B6Wǘz\۱ocunxXjsGF~Ĩ|k^4);} ׮{{d/y=aB/\9A槯o*yΠOU?GrLצ]1zR~L27-pBF7åNȮ'mO )0t*,.s:N\f97y|%zo?H$6^T%]o1]Iz%왢,Ǎ`RtkJQ(3\tL];Eӽkn؀ImdʿdǏLz9mE ˫{ lu,Ź~F_q^: }w\ߖpJkÓj_~#6+q=mic+<]܍j1;up鈒֭VY? "o>|&=WrO',mNzɓ5swrN.77'Ws4;N)ɏNeE?LzwD.~bW7GuSHmv e¸Fg}܃׍sS8 n~7e|rQ'Ց]xr׹Ɓw2F;31ܨ1mSnN%LnϜ s2`iڄiQ+j#}N[w2J( w:р;pG h&JhO=UўD{ZhPA6T dCPA6T dCPA6T UdCPE6T UdCPE6T UdCPC6Ԑ 5dC PC6Ԑ 5dC PC6Ԑ udCPG6ԑ udCPG6ԑ udC@64 dC@64 dC@64 MdCD64 MdCD64 MdCB6 -dC B6 -dC B6 mdCF6 mdCF6 mdCڐTVR*vUD]5ѮhWC)튬)))))))))) oO+.VNV.`*[KeѮhWU&Ujv5EZ]XJWVo_޾F}zZUgW]zvUUgW]zvUUgW]zvUUgW]zvUUgW]zvVpG[[9Y[X)bƶ4xjGk4xt#Ůn*[EƫxuTn*RZ4^Kkx-UjTmRZ6^Kkx-UZTkjRZ5^KƫxuZQo:-J5#"Z EfJ1 b4h6jӠ<* #1 JҠӠ* ʬҠ* ʬҠ̪ ʬڠ̪ ʬڠ̪ ʬڠ̪ ʬڠ̪ ʬڠj ʬ֠j ʬ֠j ʬ֠j J֠j J.^N1L6Nי{@=Sj|O=%LL)+@ @33333333333333333333I}nazCjkt:x;.d!oVJ'M˂5&M^ޱLDeQ$^D噧31%&*}[K&%*7ۿMT.GT._koDuƒÉTfDҞaîi=6i`riɊwg57U&*LN oU*dsĦ!+J]һmʑ]/ڞ\!*5.F6&*զK lET4o,hQzRiD%iDMGu\aݖ}p;FD1ҭC2 .}$\8cA'r2ݼaDekvjDe7] *>(<|6Q)隿Q$sdLܾei윻}ݦc!-x#lٟF˹v2D%Ggp٨iě(wKJc->͈fe_ 8  {:]$1%~': hmNx Gc@76Ȋs36O#|UF%*5^~ns\Nw?;p+cQěTCkVpmK4q%-j"e7;ĞI܎e,mć=b_!޷[D &5ˉ7oE7F\~x-_cnS׿L՝o7>|XE|xg٦E]jrY^ΰCdE x\p?orx3I3zhRWkf?N[Divzˑ㈪y*R&'UEiLQ- wyi,q?b[ǯS̀č0mG|DJےC8hS rK B2(҂ |VWCqh\9zȯ t. +uKev '= ނ /} P EA$a aP7c ( iQUAPuAMA-#AG+Ez }A010V  0Qa L)`,SD tA!3a lA[2u @ "AKAAlVRAeP 8 Br N vJV AX+UsMYa lm!u |K<a - W[|}3@^ `A/u|f9Ww-IZ{m0d$8h87?˝^N+VCv $]ϿR:0+zY bmvu'Z^JFNVؙ)݄qT3GA (Q˕ ~Q$\Em,/ F>YgDKuo^vvVLӃ L6n _bCkje;֘!)yRj42Iym-Id"I+LiU[,Aijăbib^yhCÚX9-ܮRu-]6moO#ȡ^MEn^MPW][U_o4^4 r0i%VVnF>FwvqZab`G z}ZPDץ^_22ynQ#W˸-JX?{Y=W՝ȎJMgG+ [s;g:^ ^IJ'f\̾I:}HqmCZMW.mAZYpvgx[]޾j#bx*;N1*#al_bQ4egC|J+;fgx%̧"Ev.M&==}Nv9lJ+'g+˿RuAmAMn/v.Ϊjxzf O|jEަ-4PUŖF<{qug t<7)rhHпʋ++?hEa"ۗGco.埿YG/n0|䣺?wMx|x7 ۍ>6ħ9Gōߦ9M dB/ JF_ Wq,)Pj f~7?P[B7 Sף%GX?~<#JtmM;5EG(n%=}73&emnR7z;}k5 #Q0M5?EMEk aѲnLg2p Q).PҋJBG8:حļ+j4ؕT;KEKk߰ld>e7FS+g8V8Άbx뵴 8Zig[ł9-V_f/?v5HxڙQ:`.wa>ׁNG) Qzw FA}p<{!D1׮.40jT7#-h=vǩLtuAa<5Z\Ou^~kaAɷBܤ A:X}[\0_xu<ʡOxz1K|(aDx{v)mPohZe.(07OߎʟHRhZ!S%4 ~ޘtzH3K(7Gˍ7R &{FTco,ID8.4Qx~iy׌yҘPM:ѷ"3 G.H7و)91xj9u}+ e@ۥ}&q2`9FXQx#$g)*~g:]fy˲>V1z~dv)H+bb#}ًّ>z|ڤ4jCz{䤑-IƻR2g>yٝ76NgVTH3ja:Ga< ]:QjB{0JyjvyÁ=t>|yִl@&s8! `> 8Y>=mP6Wz-9a392N9T!MFݰn0$ez'A|xwky<Q럹~ӸJ|m9Մ0,-#=(,9EX?ç:'̡~&IpEezn1Ѳ*h:f|zgg|$O>ʯR /uBMnj6ݟ- G?`Ȫ 43|pv?k'<\SdU|bh:fFf'?M8&Kcso#8pYkNͿ98ñ?{.9I8想Y8㮚~~GlzH@0U4жJMƷKhsuD&M7,U'A,~gϰ؛vTuyaD"E=FT U~T!M>`}X-Cp)[~5?6l`5_O1ލ&<3gT/J\? o#֊?>hF&E} N& O(d.PGr뽌] c`qPO폟jX8XY[ZZ٣Z8Y9Z[ I,wv+`)Ac[hp \ .ȅl撓{ްɐ ZK_17 Ï oRМ#dVК0B[Fh2О:0BGF #2BWFAz0BOFA0B_Fa#(0@FP0`%oȯ0? ~gWK$>+? 7z}3&,Yy>fEݱ Qw*#v{7讫AzctnFh= )A:mvRx C'hH_M yp`#=<#L՛&sC5pv3{peSbF솇3w&A؝t3uEgJ̭Au# i0^K1ۇƁn|x}rNǻ}Xo8LļlpC%^Mެ./FA~K?)اv*ĉkxv'tIOFMe=#/ ystpij`ʔ mVuK.t1_d~.\{t4\ >hyͭV/D_ @/T hWQ_NO7*|'́s*Xla = U~~o-`4){П~S T5 ՟WJ=ou {@ގßb|b/XJ,s^a ~.] wҳjm˫&E@wb ~Woc ~..PO'A@wpWwiѥُ;p}k}k}k((/6ϾM}kȌom-$=﵀®~G1¶Q`yA/7M6 ȟ"?`~m-CKC"Oc\c_{.'.|B6l]ll퇃=`+E9 _e+;(d= TЗ~_lz:dʿxs #$+PO1) Az+P4(  d^ 68 ;`1 00OL7a2;Ļd_7|Jjԭ7waG]&\?1WZnkQOe9%A״G72޵ʄb/“1#w Xl:]s?ͮ4xr]歵_.wҴNFf]ߣtYr&!&cH.+\ 4'T?F-y~oĥݨ}SS{.)g#a$7 የg8>~ OORx+NL3g5N~t w{sLO}p]Q鷍7jDѷ~vy1oTH͡I=xkݣIJsQkϽ)즲#lxm[?O˕7v/EYj_v^%+GӨY5'#dtu55IyBS7ʩ'tKɍ#u75jgRrVchv?Ɵ ګxjӐV$|9`)éf&>ylsf jG.m)tՕ۫)m/ nPY: őNϑd#jVM3#n+>'sMk3'םW~eFuȮ ם#O.UOijGԌټcYΦk3sNs[T>!j͜ﵪp}idA*rV{'z\J"ju)sU6F$k-YּBQ뮱^nׁu2Im~REY06,n'ݽZ&D^'Gg '|ɼCs"%E;K:>7}T[9dl{^ɲI}d+"7'N<20h+Af_zMpm{dd?2ݪ-n KݍO>aĜ̹D]sȜ{U>o/93u%v[?fSm?9UtR?{nEkDNSn mp .`[ W$8Ww+ l ۽v+WvI'nb%I1FSX)EI WCi\3v{T:j`lxSdZkZopټ!U](=rh:Φd}BBuHi+ю!\on(շpRzz JXB'j^"GW=ijhjhjhjh6j|h#Ȇ6lh#Ȇ6lhCJJ]eѮhWU&Ujv5EZ]5e5e5e5e5e5e5e5e5e5e57JC}zzvrw(-ϭ6TVxB>z말LiHץkM[v ,70):V5d٨n&K(̓PoZr}Zߺ=nX 1mB< j @.NAISj: 8-^ x0a ^4(qz^a_??0=Oսb$)@Y[&u^8$^1 0zZ3g`oL߁dq<|2 8m㾠8SA-L@N`^,j3:> ns!x7 1{@ Law1zr2dful첲C5 B)Od|@fScSy@jYowE{ RR+H[J~J2F):y(;5zD]>=xY}) %<<܏31B{(a9<4)v){yJuʃ{%<5! /ڕ?̺(uZt{U+P}U TQ S BΊN-:;8@Fz{@G,Hg !" 9j</ ہt >ص@@@[`>lQ@o`y\:GOh`iF&.˪`SإE k]l][t]1]xhB) C؞aכwud׊Ak8]m0/Xh: r@W '1&墮5F0&1`FWY+- }؝Θ7B< 81tY@]{/"Οkfʃ>}l 6h֋Z[Z6 ]'wy7(QsAwo#[ai)Vdɒ%'䀍'jQ'I[Ź6^2x!Xo;5ǒ%K6Bǯ~cN-g_΋$β6c|:b>W&CK,YnD%}bjt#tńX+=rRK[rs\Z'?%K,i1^7_?}*nD$B>D޿eMHުt ˴|Xd&A _K˼OiDt_z<тO2uu*Kr&#j~Le_ƒ%K+JW43$?ڃ^aq2~D=r@<eb2JKX/(ڀ#y0~X,;L:dK,Y2ɇ?~pثgm xa JSrGcdc|kX&ohc#y掖Gai^:I%Kh}"{>)}ZYXn8R-$0c-*˸ oejW睰L;zH, l-#ygbӛ4CBK,Y&rVG})vcq=OrwSpd<[c~?DѮ>ZXuxO6 gX&tљS;Z4˹vYdɒ忏ߧv! Hǯ| G/|CVEDtIˣ 2&XVJi;n:I9ӊ\`߹O"UHgK,?y/:.k kA!y_|"OWW?˨]-n2@_^OTd͹MTiK>t=XF<Y,#>~|&Q<*$Pb~=#WF}?er"2hW_O,2˰9痎FF<4udՃx>p\CF};/Rcih,#g6&C8-vl:ˉyqaXȌnb84 ?>1[X7waa!>xn|\Y|ٖ>cje[$sR06 >Szt%brby eɈX>)0?gJ)&{:c*[ր=;<ҳw<߹G|d4cUX̐#qrp|/K8ޫ=hG8 |:N?—}S3ƙ-#G2e`7 ڴk3_,u}9pGt@P 9WW8 2xxU rUrbXjď8_=Ϭ6o+cyPtCxnkaf3'xdD޵X깎sd Kyh~_ 7g@8_̋׍?-Ɱn>3:7:J𜊣o%aw#-,Mgg|Sޱs f~n,cKhe9.?wCH wR`y`~Q:YhMUK{5ԥ;Eu:gn2Xcu>Fky2){ښnͫp$s*RN-uY7ёvth~|~90?BWaWkpU8޷C$pB_G okf$lB" u4l.>^>1(œ?0JRj9# Ϭ`e_sXd-~[sg>%xX @8x\ hSO콑^-K0 xΩS9/#;ӽOXJ,M?x7)=K7Ax>vi=, w{UgD˓9˰ tTR3ϳab3uˮ?whH,{l.[Nus p$˗}ˑm{$ma{23lA|-e^C?Czp ws2woOaAQQQXl79fM$۹Ww埱aέCO<۴KaAdztJ=:EՊ}AxnԐk/즊e,5!s+,:0y'=>,w K-~3, ~WLqh8nDža#w܍\+v]fLx_ڥJ0^ҽsTIx>y8, dS$Чx) 9g"jWa;Mm@}xƍۼy4~;,\飼tQO<-o,d͹]YKS,4u'= n<dRsGsT6{ѕ~+ ϐ~ >CB>*c5~ |E9 @8 '~Λ寢2I kt]醸{5,xHcޥs=0Kna,w$n[{N[ϊ{U^X/ߢmx&n~K;ozӴ]~kxN7yFnaxH2|j>/^sChry;8>gCw+q`{~x继t$vVK++MDctn5 KܓvvXߓ$v^R;/ b:+dzu6;zZ}J'Rsc#LyW8av#p> oOU00ԞcƋ syo! ~c d4oƘT"E%@s&~1rWo-GXz4F+w ^垮EoK3gZ,ꜬhK9c彤W_<7M6n]'`c&mEPeobyYUlghAq=X_A?}A@ wxul'}=@}cR k,w֢k0Uۿbx^[#3[K}vh6#^|Kg^fߜXzK+rӽ+Ʊs!M[+ሧI/[xu}8sjsb<ǿgyXv0~*OKZ]>m~]o^G|X޿b=8bjWAg<"YF:Ba9qca;7apG7ƒEl߮o?:}{P[gXJ<KOui}L>7O ,vV[|vGl)Ea%Rd=Nwd{<禶sWtKVőӅKo\)}bG>r_{sGm3O{L3to2TÑ,sXHܒ}w%?+@\5| 89c}Qb:1p2 $%~ =X`ET3dxi{pi,z\[Fh>,wJ&|Xo=[,wuy^hIv~ >vp}A81 r 진 s.lw?F0@8 9o~$gBՖ[mqӐkW]Rf/w5r87]ҁJXpnn|._)Xs!֡vsM)g[T&=˽cmHҫMČEIx)i+<;׵ųvy,̕ jwω{w ty_$]w!nR%s$W?I{p> |_4[`{· o_v\y=!J7P5ފݾ}6,ܠeI,=4-r\ٱrgӳտ<q7ҳiK_xI T׾];m X鷾lb<:w,,Nvn<'?(FXzחݍsOxDó 6 ύi~g>˃. OB팶\dyB͑wX Yu~pJmp_>2c4Zg2x ?;g AP~!ۑat ?42(nug}`*IfU6h1<?27ӏ|ߪdmXHp˝#f錋w34Mm,w5VE`{[a9#<-nj,ww<{tO7:[˗xz9[6{w:ϛ 6bi^[ߨxjVgz;wiKoG]s2YxlaOgɿ,?ldcOKj&l2t;XFm_mGɽ+dQrͭ|?Z3 Lls֞Ux.=vIIݵ,L3TCa ==.2$QhZB VNő7_ٰ!~6~نqXLmqAdfő8M_iyPM ,clc'nepUΗrx^_=7˄[\ebT.rԑ+9c0<]zv&#Zϳ2xc2E<#LϳMVx+8TÒ_"EԔ2^MeXfV緍eOU2 iΤ`eGkq#=<;w@S(O J4ig)gx~ / 0@Ϧkς@>Htat8ގ#YdXF\{tkkl&`YT᳏PVX*7Z3zxH:`9n>K`973`9Y4];m`%,Gk:zc7^_KQ:-rLaihm]L jׇNr_^b9)q߰4\?l7ZLrn׈ܪXyǯ: v4ވBW)?L}S8w~G*8> wa{-QfRMO_I<%~ 1?f }A >EGF&|\{bi2s!x>=:W,;tnA2_G;~p^4w?`# { KMou|d,l~Is, k> Y4>oԧ,ǝ0)=u,+9[zb9^k׸ʏx~xa~w=|M@ %~}T _K1MOp\p;fxbbD; w smmBMgxn[)ڂѪ}rОN[͙9"˅#O]a.,ގwy$у8%ڟ#8y{*mbL,v(džWN}/槎y`9kͰT25# KHCo-^>r $KKPhz'm@5eRoƌ $-in,;Nx˿]7.=N |<"'C)@_*E=Qo_w3x:N3bgw,yྵ ˱j&.skOX+vB;</Kkq rڡJ:,g-ԛSd~3,5ZѳIg]/rNzsynʵ@,^v5!p$KTϹb.ԩ~8EeVSAwTKu?/oK`-d\ЖXjt,GTuK=3,z1BÞG㿮|nhp w3MBN@eHв Я闹gE-JgL%p|f&R`@ wţ}AN@<]<gax~cy KnM3M3|K>+UmNrG?K/y&J2r yXTWq>&FssXNp>G·,MX;xxxb23,Wm3pg%aynIHXf}QV>?]PVK

nXZiCNLX6?V6 zC\{gV}=j7p} =^H 1:J ,۬3Vu5=Ij"'s҉Xf!*3D2{o’ٌGZ#Xf=p$2Gį[%BţT,)Cy~DL X2ۯY#A;`yu %C܂HfѩXMt:# kL&Dz۴Y8cKYŞ&X+_ng*S+O,'1F޷ ǿg WR#y3DJpq[c[)Mq$ʤ21ߐ  3:_2}Z=R5{=aRt KgKbs*Rk]0|`ę=Z]7c܆#vk7n1X\um{ s‘LPiΧww߬` ywqOw-4Ync^8<|WwX]sGr Ա1Xnm5iev8ѺktzJ8 l3"^VXn,]V;x#O]i'x<*G2y/!UX%P7&l#H[x+>;7sv#xH^X&Jh3A6đWcytǑfH&/,OtÅq$NyFK2z^{fq7COV`Y=gZOdWԟ<ճg#gߢadnzۇY=gJOb?ҳճzVw_lYY=/WYY=_/OYY=_lWYY=~UGV_lߦg#g==Wd߫~zg#gYGVy=ӳճOObYYS>{d/Y=Y=o~}V{Y?_lz?zgN=YIObg#7_l?M9-?Ѳ-s>/e E _q )7+˓8.qOf0hfe] c:^'n Mq߽ܸ1zqxGq­Uf2dz;i.By&s<$bS3H"wFc.KЩ 17Ţc&}#{hquOEY0ڲl }yW*_2M{@<3^)y)X"~7 ļN!t:1󥐕/;#BsWC@R4Kh34>WfY3@f H$dsB?X"^>£y<AAI7x.úh9[Aoh^7h_ {#sz o4?g7s|)!鿜&DmNG!??2En_w ^g݂Zf"-٘!"™_7u$y޼<{DMz|Xf-Sl{:ӫ4ĔԶ9 3jBLM8a+յs3wwB ny'ļw4"8et\6ar/3G̽qz㉐dBEQ$Nl$auĩg9  aA D?}tM,$ϸRDѧӏτ$30q$<[I*=$"o݃ےDd !*|!$C sKCI8qY7?ƽnS Gp\I3n= xr7#>~E8@G)lq=c/vP/ Yr1q=3/AV@q27觘7! _GʴVH ^Ctm^?H2݉œZ#FOr8bO"{k~(͞ ģwk("捡J|BU[{ <$v?1q͢kq!8"S]+NM,$+E<;skF4qj۽ !ɘ{Ϭx7dž\)tGL]= @s&3 ϧS#f--;_9>c[ VA,Yu@S)SmA6Dmy)[J鯈G;t6C1ˢvYx%௖+ h5yNr <&O3@p?'2/4A?㹁q- -s7KW) GlCqs3sv } h?]EgĨkDǂ6]Txz!*w.&OW2 uJEL0Kp<~}ѽވ  0Xז6u Ę${ c5[Tpq#>$nvlgIr;|qSH2|q!#>i"fc?VW@L9Ƴ o Iq|[9$q>ëM;"^:ݷHr ɼmzIDߛռ9bNnCu$׬$ryt9uLp:5DB@o4׍lR Iif?bBB1Z_c̐bH3wB3-KUL~* d-@AO+h&@4h.kηɵdoP>O?^7qq 7~v#OfGђjAVmrUxu@Txk._Uf"4S( JDTtc"52WH;- %6<=IP?@ź]@K!IjQMZ HAU [(z IsOl)+\ Is>I:5I:o}[ )7P ROi"5Su jŮaKzAԌw;IP+ WKk}I"d)>Bo[4 I_əu9,IҪQپ9+5$)u4hH=p{嵐$Eu.9bp3$ &CȽd4xc@Z('eh@)y xAK=nHA4{G@|R< tFc%_3].t2Ɵ.NF7Zv\ƅ<_7CGIׁeX >x(S3dHV,~$cwJ[ixH26jʭ.CifE! L aiiG$ΖԖ4GLH*X 1:Ƥbb S7,E^:h2 G,5L1Zw޼;|u$p&~$$ud\BA;csG~xf>biH@9"FG3+$qATjMĘi{;w%Ę>q$>5yI$~c4S($T+9cH"  M /Hr MT 7~(͓@ь+P&,7Kە^tGpA. ?C ;5D~=ЯTOn߽qe8Zh: pUMBl-@0#ȨxY'Dea6!x9ި,Yy& %ՐDu="4`,uAkeO5g6$Q~GY$=8പ~2CwOIvon>$9rNQƗ[ 4NwurM6$ @Bcus"GIs{r{UO!>1ݒ8/ G{ IjlUN($1ig!I2IeWHBf]nCn $4^H*Z2MKZծ$ -_LBզl-5%PB$zҍq=d4~p 0Ci@MoZ<iqX0@ ߯ͅq2_ _KѲ8n%-s*05{7 T/'>x߽ =.%.}䁨Ofh8ڗ 4ffj":j:!No1:>}b #-2>v}߹ T)Dq@?xWS68ђ'@%:'o"j4Io=;rpku}csHPߴc‡UO-ѡ<)Dc7:C=}q*?$';2H}O 11DhHR۔sZ@c>F^q;T0o[az$1M IQ +#f+$Ϟp~H7M<_0nDn@n<]AzW_~ >ڋq%k6L?zr-C߂DS| |bm0B~bA9'Cf~H3,bnH9fg=GWI܈#:[[1 Qc/B%O_]%vi ݾZS`$YԼ׋"OBš G'7Yl3$2%Y*Hb#W+-Iek|3$P1&搄f >gڶҍq=gn=4NXDGZ3:ބΑ;_ F+TA 8sۋl u,' Q4Kڻ R7Z򱎣h>#Ehy챾(iDMZ"B ˶;n8nU%hߑ*EۚA: C>VGD^NN˾nc}67fLtyIhCyQ=%L>[t}5tQMGW0rqfBӝ_'y.Qyˈc^Fa1xcAo*6ݕC p"t; ,"bv([%ߎԴMn땕7nwp>!` q|ĉQ^?$/LRIZk[ IEuH:,3$I} AM{˴O$9Ԇ!ݲE Ubҧ}B{KcЎbn|wQ&F8q {8}8@~煂"Q4I1+۾b^}9zt} |8߶t9bjU`ϭ!ɴf+:LY6bܹ7Jo!fjOҤ_NFj] ƸY|_p_=ޟݘ~70>D,? hHy{ٓH>|gEVvԤ-}eN"}/Rf_D2A)QO4oxxI={#`s 1zG &CWT؂3sKM'"w{sR֖V͇$B6| btgNYwhފÜ H"Z Op?qV'sGI' @zN3 @8Ƚܦ;]强!k e4:9WGn?~eV$rnZkdsĔa8.Q"P/۩xܚJn둕/n𽙿zc>t~spCzԏ#RP@hBfrkBq3$4\)u; ?H}I$qA?pH2֫/ZIW EH9q&@%vE!hs 9vv$rz͏8r"b`/#D<|0]}{اd1SA^3s4ܽA%] & I\h3Xէ>EPFF12~H2ċnAk=ZOK$'n*wh)>GGB1CVw Iu6ߌvfH3Ksw.0~dAU3p^MEzt^ǐ%'|^y(붖s3ifK`{ ]S1Dij 0@jHHOaثès/^soߒ-ϣa/AG03D-,uVa3OX",94q7$mRt}]E{>EF@lW˸X# )r1]IzOj Iǎ^6bڲIJUg\m'-$qfB8ad\LwYjn&#Z~H~ID}h b@̓ dϋ䞆#&4bƨ)o%Z-$ti3, [qtubd=;ƞ$o%b̰q&I $3"{8mhrH"sb..~;!D]{wϙI_y<^p!+_g({ IX;ŽW& <6/3G|3yrtLCWg}6ş]KY֟k_Ig[\k]CÔ@9H܉O[l,ȱɝWEeni;}!mWT#P6qO Fe1dSҕ % nם!F<[e+Iz0)$fIHB-Lw 5=Γ1Csf XiBki{6b8fS~饐|%ҵ\݆ ɟ٩RkH3 #+?y,96O.>i3΂=9S[pTyuuʟUՃrcHi:߭dŢz˸r~nRi3#i;veC661Uą\|cےS\;!*={w+ g9Iȿۿx̛ Q|  +!?m;o|夁a>kw+\9$k&zdeV+mh7ڟ8p.سyۭF&sMC;ةR]Grt>~Sb'sjʤQn.Or!->Wgʭ]0Iw݆MZ;]Rwޏ't(q ߴ6_6Xڼ򩎺?<^R$7m{5!*lHC%Cr [PqQ/^k_-xqklHC۝ JޛJ#uO=3DTs5.ܥ 0?(Qs$ͧ >U{ޟ,h{zC)oO[q; $D10GeeV;eM*8c0Agc@:8HHUZlLvkr] +*#O; H2dZ@!ӛ͕$Z,st*$Q(1\>$I w< 1\teކ$?.WIm#^}Eڟ~bMbW MWCLIѵӆ$"]}V$ώu{nbDY ݽHxSsHcAt:hɥeGHb[ewdI"wsRF1bGGL\1Ei]ʿRFD<}?t 4_1{0^a:<`,{hλr8${nIJ^ n@)Ňǖ!}A FWml yCnv1;L]VbHu WExpd7ĜS#&qB$}d kDZ{;vdd7=]A!/խO Hf-*$qA:_$IkB'ÿ~" I$Z 1IFjy!$q6IxW,o$QK4DϾ@^~ W?|:$̿ gCҢw n ^1+,3ۏ#|A)$?zI R?j(b潇-6@Y!/W"fw 8Lb:kKH+@\9򯾞XK2zdaڋ&xt*:p;ĐVӜxsvau8젩5$Y9KwC%\v 1?ywTČ&.}?(gbZ&7S ɴ쫖:DqA˵e\*@+^NhXf4wID0^!@@AAKsS;^ߊT=ggHx%CQ̟H> x4!]۴]Ioυ$b,zbeV/p<c *y Ie͚Bۼ/ړIN[x˫o!K|$}=EnGbRVuC9{*HVWLgI߲ޕ1نxS!L64oI_|~ +8Vz@ $1 ā#B$oVA']ނrQYI$<}H+ajUu ^X? YAh\ʬʬOdeVfLYʬc#+2+dGVfeV]eg#+2+j7?2+?%SYy~$YjGe?2+߬<GVfeVLfd?2+2ܨ߬/6Z :#UoH+pRO8}0:\軛|^@f p0@jPſd߉bn`ݭęO-QnNnQ冿'*CݸLڀ9պk9j95;Q4ݐY6g;*OB}:8}B\?)mU"kKrGk"c4G0QeDڛ(/zv8?!R6]E9~EsogF%m_gv'MDndL=JKw|5 A%Ĺ۱8}rUy#d~ם{!J h !򞤾\"Md5Y=z@{go#җTС;qf]ԵD"s[heKl^^/ {횽ܸn1rWYLH"%ArYTar9k鞜=Dz|dU'7ɰ_\q~K;}Y)0;dá3LOj1-\@Ħ4Y8aYy-r4dڌϛ-H'?86th2#wIˉ &*ȔpQg&r^D?sDM sa9{7q5lϣGz43 ׉G]!όfxͭM/ wy/!%3ᴃFѠ](V~Ԏ l ~w /SFbG\cė}C3Z@}/Ҍ#v}(OFˣt~rq=_\@|X aڅ%7q;:ĿO"E8x AX͉֓}qoݽRHw+5%o2+դ$muCڞ$ [+fXSdN'אg>>?1rӇD+oAwa`C tHQJ0{1wz񣧺dnװ38ySɓ=gvOK /oy1?wߤDs+;xt<͉@ve4`gYpm 7h.@7'Mu95Q4|s9bj/@(q~ f4daw8߁-sLi9.Mgڑ$/-zME?'i=s㯠[y4Mm}vB?? "e CdK)-d+-6d+**I YZHi2ӊJ%ٗd}ӝsvx^=yΙ{,3$<;l#N%oqYn0A~tx#O)s%CX;aaVwa8-;܁ =~#zPk]3+'[*6Vs?-NIyyLn"Ό Q#:_#J"#|ws* v 4/~V8W&>|Ip<%7sw{NA6'^.1ZdJvun2mf(},1R,raZuVgޡwc09C-Tv &}˰w' $G t]~;LUl)vzVJ SRv-oKbXaޣddܰN:DVNny󫄯ⷖDTbo`YK&KbEkG?͘%v<5 tvIbVn2$2M(9l{7Vzֽo~+7yAuj"J{yt׃jQ^bIM wޅ-Ht@{o;;Zvm K^n^I}InD|˩\Ljw VP_ a, 댕5{BJ273#pW.̚:Gx_y?pL;ɳUݤ 6ztX?ۿ]Op+ø9oG6\/GOf=gQs+Ӟմޔ; .^4{Yt~ ^ ګ戚ئK Dg>]B y>=Ss.۫8vtb~x/?G3mnNs;hG;iG-O*~^L߅ 0ΟЋÁ}yG(|1̃p |!fڭQǑ4$܋}Wͽ:˷śȞtbI_#6*-%Jl?^;?Kd-ORs~;E-H9,lف8>?bDAG'D[-J=Bo? %ތz#;M3VFxwr"\$R?}PP/Ü_<0Lӽ_'8tOвzXW-FbG\{4 ;;gVq|ŷ5.ÃE_sVVܽ&92[@N_q mۋ_<zntnq㈒ o 4u+ฒK7/˃`|۸; 8OWT}@ÚK:'JЎ!,領镠<,W=)&vz{c㎐` Ng9Z4fQhwKS􏐿zÃ=t9 ?E??a#H}205{;^ԑ&8ܛRx>K_@wqm Agݏn 7 ;7~7 ,'Bq7]I$LbX_:\CO岂KG1G('=͝\ՂfıJѦ7N=̹L56r1XI7{m}Y=8ʏXۏp$b M\:n+b5NjziDBzw}Ox-k}(J>:f_]MQ<1۟؏:of}lS{ohuJZt5ŦlJT %/ŴG%CMX{( W ¯]g7<,7z@eyрLʣe0o+Lvژys ,z9OQ =k?6/ b~2\ o?p ,.|IgǹxFS8. ǏcX\򁙇EbDށ&)f(T7Kٲm''O3sSުЊ(pd1ġQ:O8ſ;l}mPٙό%D$Og[D>qZP>LS"νy&rxQxn%loǗVRUAzN!eı7[%2t*M#΍U X:B~Q<~NY<-QDTx=Xdo"_3GE0x^0ik -ra?3<$&ƌBsD a@ g;'[|?gA?c1*I0= Ȳ '$q]a#aFNyI Xkd+.òeǏNQ 6lMu1^,(iZݧh,M^>ߦ\-ilӉ#m{L&o+(t^D$MJh~ ;gEuh}+G=|1' .M.{TK-ŎKnPqt9&+76oK\շI#D9g[$ð;2r& :ۇĎ wo5Mz12h2F_m1|+=3"p/8wyv/0if|AQ"k^ snXXg֫reh%ߛ(0 LM\*+ZrZʵӼ$/{4rZh.њ(SQP2ش88Pj\^4fYVp  xރA$AFKzvn}`y"}NQD… #-ܹ6LpYtíXI{+.^(cVCNζV8[ò&U^]ֈN|bϋMz _!翅zB?]`A==p8?Ἳkd`z:#|r|-v Ay^DZ£!+5IK KݿIjo|,VjX"I;0xvʳ˰ĚUg:F}?4@1Su+pnwc?9YDd%.lx(`"9b0<,7[7fCr p]336%N=%pt[ڥ g'\k*3=doۜ|ƞ8C[^eY{eLܻj̎܀szgI9GO7l칓 \X?=_  ^IǮpD,5rpeqaJOD{d3?"w`H7d#e`I+ g`D}݈CS6~Mae*fb,f>;U?(]e.{Tg"lkKcy_]mN\lUG.DIw/|n^ỐXN;`}2W\so#nwSZ9s# w.[n͋ 9.Gԗdpw~xjc!{9s7?,m?-wmᾣxL[K+\gr{v݉ܣ֝d_ܕF<>D9ػ&7tඒ!ܱ{83eKUSK 6ukjnu ܊~|kw(L;9JLgyƳxx&'!8G|_Ya4ql5 :? uQxL|rKWߤ8hFo,k4%bE &!rT/ة5ȷK[A:`Wf%12'Ȉd%6ӜƂSIH 2ycIz^bs`"uG0/r^u1;q8Yj,r鑦  -6qjim2uúU9.V8]p/SP87TMm]] 7+oםVO?7Dg m?^fN/:~d|Y`DQ\;c1EPIXUJzlv=u?w sCp@ͱFL­5Ǎ9^q5 Vqg*r e/z?7HT-ܷa9܀W rqVƎ=/[/>u|A< A9bɡy ؍ecHN2Yc5NDj&5vM>/\ak{X8(k{_SA/\󊈔,jz KY|9ӉTuLJdzlc=`k3 o2yn%a9ph"qɛz,7^=jc~OL0ǣZ77yn}ͻ]e=u_|ȍoQl͜0"4>E)ykɑ}=Yb"spZVfqݝq6Nc^sG6;cBOSl}9;r箭5K9]|xt@o|{v&cp3ҋ:$~&zCSNkRȹ;{/wmA>R$/qu} w<|orn-9xc}hkC'2wւOSm5D }b0Hh~e|1̓E&ҋR<ǔ y~(@gOm0?x<gyp<1~.^?$|O,{~ g t=?gyeŃrEhmVlޭD8sAeD~GtD籩O]:aXү+F7m'}"] .g?^fIcVۭ鈕 km>Di LQ/3/`"gd%;D|03pe7ETazsDs1`ay/ AQd>*{^6ԗ `ȉ̸5Y%lɏNzf]]'eb7,8KvYN ^2+@;"}d ,}w1\x?`![L*$NJט wb/V3uŮyau[l4 fn0)N=`"Y}-&= 8k~pcCf"~;̎gwQ|&~ s4S(a2=%LxC0Vzl'WXlC6E?3kւc攖1rcd6>WlR%3UݫN{v= ;`roOH&qnB!^~{캓[6["=AZ#xDzY_{o < n|wב >G8z3ޣx?+]2$֧[agy _"ө gDQtץ_Oīm=KYE^4,%/KVf?}xkW̢n-S4E{DR|´1ﲈܣ't'. krǃE&ҋ"7#I~nW;z~H5#y ȏWżL~v1Ndy4ĈA]{aW6pϙ8vlZ R7J .agrx;Dk[!Ob72L[r&@sb;kFTbevT"{Ezƴ7X(x&}*^8L]^YV97fIbXw] uF}e5~E9cU^?,!̥Z.yxwV6':qɛcM7HbQrO;e`"HGfzSטpn*wN9Z-^]n+6zty&}'c[0_]N?d!/{>YyDz^#wi0P@<>eNfL3hŒ'62P8\o ̏m5 7&|V|Mt# v]\uAn5DŨkÍ}&O*|<vLg\a,7^<=w;yv.%p'eܒkT㱉w}J\c.Ž{};H2q1̇ip\}E8pzV;N =|+v~΋ݮNz:;_q5zͽWk)s 5#=V+jh׃E&ҋ"g_7tRmr|@nK&np ގ;u:ݱg\?źUw oZ҃G yXŵ}Ulj~ /G$A:0?=~f҃5|_+ ?S?ae%SV;v1m#nfQnqHJ/k^G*Kʼ%;8I pw/$v>N wNDlFˋ>&Z*||@-gtEτdo^6Qc[ إCd>Xƻ0Ҥ([&14 qB,7^<=/Vuw |޳ls<>OYf;wQUi;rݓ㮟<)1o^\zRzh,̊VEm&JzMZip": .ڿiw| /չM&+}<$+ 0}!&E 3~8xr攓DW׈K/\Ȧ_^\=]D Lbm|g 67=Þ%fm&Ϯ{pó\ˋzg%qϋOK} /j;9:xiהGxت}tKsrMSL#q7Y슁*>q׹{Zc9wk,ј_$`py/a3>w0ălİ{sN˸Ɏw"H 7^wy\|ZLmgCXk;1p۩pC.ڍAE/]|I\o_V*'kyZB/ו޹5wŏWjJFT.P~0U}#vΝQT|k‘N+HAwgew=r3|<ذC/~pYf}\8tpM< EX{I="H/9ฮsG+q7kims2r S*_k:7M0?}unD7Hջ&۹~K/Ľ L|T8}:&q]}R՞1&=^oXn_\ktWLZGUv=Q轡KnTd;_c?xrW|㋻7:wxZxsgy(".Ml{Px{P^uoVNn.J.n?5#^IDvVL&.iMIfߍ~;_`GGm ^i^^<TJ4~’X-kNwU5_U~,1-kVypXe@KWb_ U&//U.^uj&cJX2e{XrQ!Wt W4{d8t V9unX[3 ZP*ǘS~ֵDlSI|V |[rXsXςpKX慸&XT!-JfJC*U6-1GPxEJY23T{7bID 5xw֬O醽m|UmhUjlu몰7$f {¢}ث4#؇M%w\~IҔ-%q_ceWwş䃽|y<]~jػr/}޶Y=w*?vWW/^z{y٤CA_&r|WaXj~a8V5!ϼJF{rkA勘G02m V".nr؛V_U.:ث'6o=j/\:CY>RA+z<U."\1!U^G,md?h<,u)1xl/Ll~IJjz"E 釒6~ᓥ%)DI1PҕnQҝD^%})}%)Qd%)D`JPR;b(%ʔP-!*%jSA&%ZСd%p)N^%)A%d%)1d %c)G1%)@DJL(DdJP2iR2̤ (MJR2sJ,(O%%VVPRÖ;JR{J(}%ΔԾ}WJj;Pe,d%+)YEI>PNI[<(YGzJ6PMxREIPMVJ|(FI"vPK%Ԯ}ClvSR/0JvQRگe־/{7j%1_Gkw%aF~ kbrp[nNqUXZmZ-u^ ̧8qussv/P#0ڟ]$X'u2ǷnuP H7D|bZ)|O酲0櫰f5JFЈQ$ %$઴Ei Pms\g_UY*NξZC|mj"8u}Ƌ5FE"p\ n^ 1AIX:;9¦t ;GW7%nvNnnreg5TI&?P6~W ycg&SWY'Lº]j٢DUB?R9bR;/AP71:uq-'%tڎTN࿴++Gwk࿻m_A9D>2KKi/UmNKၭ][̷sudo X:)'v'r;K]\Zr3c2oaca2o զoJ\_7ihiZ©\ͭk)=הD%X"i4gI dI+fIȰ-Kڱ=KdYҁ%Y҉%Y҅%]Yҍ%r,Β,ybIoaI_cKDQXjKM_[ߜDQф0D~@]!?{WXߝ߯z!?ݭE0j,. ͍cy4v|G u~QsD 6s`+jYSScͭ,,l\,Z2fnJT % &:-tWӺT'@4bG#W4|;[,qo/ I@ߺt6wo$φnoMZ3M頨-Z ; Zi1[ǡi_<?z:<6xg[#uTaUfmoɩoW8v}8uPj9n}#+iL@>edS#\vQTm|NDϟ}1uڃSyu`"H B |3`: Nj@{<4<[#-A wž='o 4Yfk߀:Жc9lps:Re,j%,++%<%8q藙r藘ă#xI |9 |)2DJ(9NI %i$S-%)@gJ)wU1bTŨQ/F_T/fHhJ(~6Č)ܩ %TĨQ'FOU?1~b)'~b+('~b$`J(EI$%)ɦ$ӔBJ))%e\ %)AI9%P/F_U1b5࿂8UqTũS/N_8u}ũ+N]_qSW|%)~M)I 3'>P5_J uWRB]cqwJ~ z#{apc ^`7P-m{pc ^Ha7->{0[ nҳD4"f?D$aqη}+}c4O##¨4V?.~L/_~Q~n_-fDh,|qϖ{X}o>y/}?y(|=XNtuʡi>N\ެ!s2`#҂Cb hYx ouMꔉ-3AWu#֦FO51 mBp;!a9`ek5 (5lNZN9 qwoVZY'+]-fPqZr#༈FE?A/8N߆ǭZg32g2j] GY 9 Zwb|6~.~&b7Jb)OJQrJ(ɦ$ӔSR@I%Ŕ\˔\:%7()ܣ!%(yJ3J^RRI]=bTŨQ/F_U1ʵrbό JS2eJ(n 1=֮~V(7.Q£:?bΏu~Ĩ#F1QGl%)D'%[(d%)K u~(ΏX<%;J u~Ē)9F JR)IU1bTŨQ/F_8UqTũS/N_8UqTũS/N_\~ĩC| %!>~ĩ4qkJlj(YH%xkm[-vTU]YfQZffkdDB}&NVL <`PC7p t( _c1OMUI>[ߟA˺4zXzOx(ԻY/M<8ֵܑnPJ+m#ʥi7Tγ̬k nN5B?q l{os#StO#r}>"AOH;jP$?w_5E ٺ'΃mBmAz{ xX~cZ{n=,q[Ncn+74m?}J_?[`8l*1TM}֒nD~?;bl#{IcѺ4"ߤlgglD^HFO#ҷil]cgil6^co@Dx_Fjww?~M*c]&PX{+O4:}_ϞWb<`ENm)>6^fӏ {=m)>6NE"LB+vKZ*̎G ;ʧKΏ|{~֧W->?{75x׻Nk,9?ԙ[OR ]^%~v i8uol_m =6tnP窡{g@;s9{zDx,6n[R7oՒe7ҊSug$YקԭE hAWǩy%"H/ҋQz_1^ӁZ۞kmgWaz'+'r,/]S롩/F]7p|{?oԵ7|S[}8uޛ|C8u|>'qqԘе.HN"Ue%_7 FΩaeE;tڦ8Tb|08Z({I[+][5 `}V]i5(WA"q́l8*Y,Xbƒkۉjiiac|spRӿv+|%-O݃9\Tb_6p(.nK\Ogi):^(fX/; gkWN5ڂoX7tA.uVn TJJJTT[֝0ΝФP_8s%-]ݔBgg-)Z^[nrvxbzV1̚?BwFs :V Tvh3GoDdffff染{~6_mO??Ǐ-`n$44^_]~?~`m"];E/}L'wo߿g-VHD"S!8?bQNi,-l.^>5i{Ϟǿz=iߍE˓E˓9 ݃ɢu*ϣ%G#9I.<^&=z\0R߬5{ZN?({9^~Dwsr<,?^ZvSZI{`Ne浿6fF/E/rf! 5eau<w%n4wrzA*4ҹNҤa}%R yEwO^WM!~z<]z_l3duf Zeuq_U͑)INH⷇J4pmGIs ֿO3H|,٧p}Y?twQ,bpݖ\&o[^.Ǵ\8, ^BWoi7쏇{Q7?ljGސ&;]R- xvf Nj~IudSGk m_\zMyz/>=gYna.Sv j,1yEIHE;őf>0췼5{NG?Vi=^Yp ;73Tjim7^k邳;y_؉x\Gr6¥#zi~]۟')x]]+';M%ۛ즷]^W:l*T-GždFV`GyM^ Q3]w"_n#unDugY*4LY::e/- Nž˜ҡH7 Qe=ޏ6s|`_]]okT_ږ%kc_v,wkc:`_j& )*mTmu6IS01ڬ 95N euMۍ=/ RAr[2׏n0iCCAW.| PW=ƆcC`lh064 Ɔ&cCdlh264 MƆ&cCblh16Z -ƆcCblh+ #~MΪv;΢-H I3:sX%"ռڶ>ZN/eo'*yq6)ޟ x x $prP.@P7 oJ0χas_gp1i6:xL@x,gxFF#`svYzYmaYɰl˲+ CkGgAŷG徢 Qi㙳)WS~9+]`/h&\oFxsqga<zD,xYXdzӛ \Vy0"E>12Í~:[^{Eۏhu:iaM\&gDl ;_󣺖"ٚޱGЏZO̮]ZO5ޖl^!+y=]{yR|'/nڝ <~:^- p%O.{*:޶|R"{ބ ){O!|>#[ x}^;e+#Ϣ˥6&;CrwQ^< ճv$i:֞8ů97'{ o*^ hњ߁o!זaCA"`J$4UIZ f鵁^:+=L7k0@A:Mgx\[xeWdWe ^Sy]Y6&IveXn=c„0a~L˰zZgX`oLߎ`u<|2, 8>8@=-L0޳^l؋^-{Fg2[œG4&M`^< 'A\;vysYu9,gXav3Mxl#zqW :88QGG'uq>ONdqoq21s [j ? yAzuiv 4jg*{1ٍ"^w>oZ7BO0Ed7GidЧC 䟟R_` [.h. 悪*h. 悪*h. 'jkjkjkjkjkjkjkjkjkkkkkkkkkkkkkkkkkkkkkBs0I ' *qޭ] ︥Fk<< *iSe]E?9W ,:}k^y!nS醟'M:HNӶB*8z(+9bhm>ri[2q6RkH &??%*>WԛϟTYщ~ؿ~<=3G $wt@; l>uCZ_¶ @6/ۃtI >ص@A@[`>ta /9z |» KvizV[G ]gD3NבlKeaכ$w!zk:!ܥ'Gk:]낗ЎGǩkl*< 8a5,Z]`kBKƛʲY]i9t|TipzÉ Oz9kO}HOsS(qD}>@P(t-8RYZ; 0/kmigUߠW>o[7Iۻ^Q%6h {p N"( 9`IFEڬ>診Vm$^70)cx"(6B~}vY^FXɧ&c-MCvux$d|QDEj>o얲 #XHK~D2OeQ$n(Crvn}"(4/^*^w ~;8lSDpĻػ.gTn{trM@"(MA#_Cy.Ռ݃[p;s/8ɴ6ExH+5 E⦋m!M$>+,8}EDEG?d*_ <=V\h;.ؿC2wc'=C2ujsHĞREfQ($ o*FDEM>C!8{!/,5JB2aU HVxh1mV_A2eMSa(:hmi~UIK% EQ?oX?O_w9B<K b/L5J>׿)A2vن[JmL}SY$n578{JH$$epJj."suV}vCa=O}rb=rx2! f|;H #qx/x$\9ٮ_ŐL;g(IۊO,O(>B<>` IA: k?>HyEXzrE:1$i|X5ɃGFwB2Xu0Oh.G<@2A;(f=VErz|."(G8$ܮqg~lϱ*!^w됌s}˨H+!"A v\V6D2)# y(P=?߆?8[UH,,JpMs{===޴oYHle]o$)?;xE2nˣqWϑ<0%ĭESNDҤС gEQg5@|qоÿx=8_?Q =jvxEbl;[#e<}ANc!auX0Ley!kç vQ"2+,Z#rZxai?e`y 2ءYsN]/Uh37y脌᚝ DyGڟGrg.^Q#3Q=~ K~M,X qh'yaAn,ۊdpa7ž 1T>ɰ{#kNyUb<*Ϻӽ6"1,y4o̻0c,$w/[vYHF5ۜ =3%oe>=hݖ("oYa.k'2q6nO e?B ?:< A;?fQz<`gk$G m/m/؞7 &^ҧ1+p4=382_Qx#?vj7s/[3 MHde ɹHfYyxW =dhKwD 6 _qҊ:H}T4Uk'Hġ_fJuE3$w7&vs6Qfa;Q$ʍmAR}Da!"WіG0K0p|lW y1ٰcE<}M#?mQVs*6d`t~m$f%qg#;҃mH:7%'̚%\D3qSD*a?!>ՠ(sU'4/~ҡBoq9-![3j{Y3򩽃Bgju{Elϝ Jg f>`g8 lqc/o9J1,RCW^H<5O &UHC3ns$1`Lvl!ޢxɰX;3z 鿗@͚"]} JedC\eyJcQ(tDRڋI@\8C=hh72ob#vK1{[ ĐܩH ;n{d7 4&dqRH͚6}+>nC2X݋0i W@n#&>JЂL4xۂ.c6_yx:$[[ OM*ڠH[dXx ]6UɌcg/w,'q%,߿ Qz;fl7T%\Uh`GKm=5 I>iGJɝ#{(7v0H`R@Msݏ쾢W ;E2;9t!CLo݋f@ EK Q,C8Sf`*^??sA*ؠPwH;HyzQfLH8+晏xYHvOs4F6 0h.zDʋOZ[Lft9Ͽt/>xП1zp wȯ3AyW8|q:>|ۮ$"I_oJyxvIM̹sP#9Cr'g]uhKʹc.dwf7yq޺Huz8SMՐ V̓OѼi5$C.fֱZ *N4g;"Qz$rN{? Y~ _`:hCq8. a~n^S+c=hi5$}zK[QI.]|xYh$ ;!/+.z4;[f阚HLQng! Zdhr]8ɠÕ tGf}hzjG%4?jkuz~M?yQVG/$C߬ꬻ /j"Ql+dLuY;,N  1$/G ,֗_f<>'C?WǁzX*:?8.k.]]nyI]3?>ܱʽHv`ϝ MVEJlЬvTs9ҽ{yp$BsFE>}z"^9ќj1.=&=мnɠ\E3{p#4Kǐ 빸 (嫞ň!i?"5fta6B?Ϡ48_0?NdGM,A]ɪ\zo+c& |dǫfuQHn?yG/h#LقDׂz>f‰b$de,*w,HyfRh.uD2]ĭQsМ}Ig4m]ܬz.LH4+c& ݡ&w와杼cKlA(3C BR&P:fF7y?07f<; ԓB0$Hy89;ָ2p'~mb{r>Hn-_G%h#?WHnZ9#q{iHJx/͉.̵C/^mz"4JGU` ˳W#S;\)4S]K X'B:yɟ71aHF.6y{HJl$:LTVHo2^I%'6:J@?_a 8oOU0=z/3^I:8M؞cC|-0_ay{A7cLĶ\z>\3LS>}T%;9 sѮfLhkuVjN;"0Go4nZGF o.eM D3:4lz ;F"Y,m67ɀ{ˍSAxVUhZuE͘➯ T|\Wt>o"QU:6H(<_%H'|{<  B2OA{+s1s/y2olc{a~<bS*HlsVGgcei$tf᷎g"飳U͋m@r[tֻXژgǯ{wvi$~:df؉yPوHwJ_)vF6Yl0$w6Kꬅ1}4ގkd@;r4.qS&#qߪf(['uw I՜,<2C#1*_A?u$?`;ES-c)l|?;)dyO |j)+ $%~ =X`E$'B|7|'z2X=IDa蚴sHniZv~4}ǺnE[Eop@=>s!Z`43F.;0jMڭ5Gsxɒu'm>jqh군_}C_N/SCfHOxk]yfU`q'hV"4EfbyQ=7\˃42o*CA~Q$*-ռT[=fݾ_E~ >ʠ~ >vqc.?%+Ϲ KiFhxtɄɚئ荒2tTzW ^"w#c&Hn+ DsTH~2[f8l3IN׾h枎Hnk}>=CsEѼ]Z*5#IEҷU̴E^W}wߜsk 9{jfUN5Shh۳c;:fF9ZМh.~zi4i&Dyڞ>6"$_I_eFO8-|,N>Ma @~p03Wa; ?^?9W(Vz^.yS]r+czo0۴ΒmǰE $=ڎ f+ܬiT4fHzsy2[ii{LD3؁p!>MP wy}Er/5A3^`"nש|9ޡ 8 OcJb+ybg$}gKoǠzm4)c_5Boư`4מ7z d6ZfџZHw-y41:ݪP$*lARbDU' ixn%Ou\ϱ"1Ͽyk4}z6u#o3~?+lÍ JM!B/6*Xuƿ#śku遯м}x7HzM=m^h5ʛ"%mK\5[$NfdH:HnmV]Qʰ{w@TnGhkl$?p`I4w%j7٣ӧhx>M$wxe%XEWvv}yݫ"է h~ӯR$$t́ee2\bR4bOC"?d+DyG+_ъp@!7=0qtb姉hFj?# k-_ڏd3bע=8 o!cp dV>i< ⡿;̲ Yx l]e/x~FB{.V*s>A,Pv}n: NVX|B2xN FHn2_ɰAI!k)HܑUɌI?qFh H^J~xdA盐mW<]'4+|MB2/~UQĒeҽdr GH2{P\jrc["_<, =>":4K$$Oդɥ,MǦ O}HRwۇ-ԝJ/ﺦ"t&g\+oa3$=o81+͸a/{o![cz#\<|egsJhV0m$S@|2 lo&z'L!1~@>Q =k.a ,^c"-"sQYF _ u>$Ceedn"߇}B`ݗ oF*$r JjO㺡yuÀ4$V_^dr"iڰՕhq&/z=Mt{~]g#6wc"1+ƗE>h>p E"ȝH%eHf!ίSi_Zd&薏+͓N i Ekuטn<;w@S(O@ @e&4π3$w{q4CA>Q2tWRA؄8~8~zxl\8[47 ?CsGϩvHr4<<:JF%7rZC4]Eb9٦CS7fygoSś9G4=! EDCqL+W4on]Ź"V4`$]پArC1K'=Br'c9eS$oLBR7Ȣ=ܫӇ^LERO|G)3$1&N$+Yr_6c $GHXlwwPl̿pׁ}A?^ zI3K#Zۑ2C8?k:LA1h4m:Hp㚡]8Pv&N z>AmVHU- yVeHNl24_sn"9> 42o,w^TbUv͇f WdYtIfjH$+).߭W8H =?4 d>Br$՚#9^mk˖hGn8踣ݶDEv"i,eA'4?Crnoŷh}֜,B3rc=-$Mv1nK vAGC/44kY 9Q͂ho]Dxk4|G="VTl,4;ƴDgn:e j.ŗ&I Vئ!v+US)Hzb¹"$=P$cF2#7w>dB1mtN 'mK6<)rj'۴?mKmJkH?ܿE,4Hi8yy 馪Qj%3ArÌGǑ ];07?$Y'>\A2:uAY4{nლqHSk:C~(Hm=n늙?O4|dKK*cJIM(ܥ-?G2SsC럸jWiHj м8_;EUmP8S&mWG#G[]f ($.e/cVG˔]=X"Si47k|-GfX 7U2.NHm=ܘu%%`FϛRÚ۽> EtWM<3Ȼ=Q$N%A$S/kuEHx`-P$R*T- @2-,É- (op~+q{Aw90$y^Wld򯗋\Q$6*#8~E,nJ^oѾR5|C[ǷC?"ӓپHszEדپHk"(ҋ߯'}ՋH/דپHgEQ֓پHgEQГپHԋH_ғپHҋHoԓپHo?mx3: :0>X b 8/ %5n?z O`-LX!\@b6~`ٛw s2^(fxhr؞r-f׼xqt*Un0{ґ =^dQMeDxyő:,(e%-^3S_02|}ڒa E V S0cY]w.u9K %y j}0yf>nҭ;} %p֐D鳔m 1+n8A4\/ĦIk #wn'$q1ɉn;XqsyMzfx(pӍ!29 wztiSĎ`ݟ0ϐ5eefI t\ϑ xƜ/sۀ/YA?I09p,hDPdPC( t8SA_Ӽ ҃㯙ag~9(o4 #D; /oݸacBIc'nf4@Ty|Nޖ0mݕyv0Lo~#)'lf{uY_|0i܇ uNY/0,ljeIHwfxa`XdMlκm+==حan[4U3 ?y\99[,m7(2}aSH"*wAb)3u\$BIrWݻ),~9d7H"i܊Hf^[ JDH89 Yu=Xn2{474n<WLhN3 = x@Q A@R2@GI,a=c//vv#8^oA3ci>Kmޠbn8"93kzegV>@;زS6ʣޕbV7+ z$Ȃmčw[;)ma;uEt$$5WxA]*0I0^u͝RH"ZRݓ&%l{Gj-8~>c+vWeڣ8]δ0[I+2Q'18{}%/fe!8]-ތaUɞ{fY0ys^axjfpON 1c7E0U;KzBR~uȝӶ II51z#^E_gL <0hiiAb%; R~ psI{Pіp(y  Dv#CA8G:̵g^|$xn}\Fs!ou B _ژ_{Igsv~tlw >`|G,ߨ;T $V29U!:Y)\dxbꁹ}WIY3!3 G}ukR t_<$o;$O1]4Utyh4$F.:dwIHv!1r٩ z.VAbcݳT|סqTMcbHW N Ĉɭ}$ɂCS 1bxWBDG:ZAb mkAz?- #FpMi7ygxun&Yp6w`xԥA{ZOطop|V4Ӿp߫7^ I$88=3% $5e@9#?=ǎ+-)0V;"{DwH걶_prGn~} V>.y@Ǐ.z<>$l$$qG!b#!=X- 7n5 /a$hrnp* =19It{8QgLK$?Y_4n2Gە-t#pAq7;5dj_On'Y"_qE_mA t8Aӗ Epɲ0#[Ϲ N 5.veb3dZs1.$J|TYl+d/X׉Ur0gLnΦ$QwNsEMLa6+^{}'~rշajOV] $FGߺ+y$ֹCYyC*ş >)IJ%B꽍\zaVSHPw$6jxvꝐDGoب/hI:8$f|o/! M*6ߊƏDHB#83$uUN}S=+AbZ/Zԫe-j@b} HBI} C$Hbhɷ =X- 78_[B3ý57G3%M5G'4AH?#ƕA$-\ D~!q_M)zƳ tqtA?8B\`:/Dc fٚ%3T^]{-S}ILc[N`0swf'6{Б$n Yoh1a / I!4 n+Tsf:tym3HShФCR~wcet*?Cᗣ:C|v,/$//$}Nǁȃ_İ]gJCb#^8P;z)HLEo)f7{ׅTc?aNذ I(;OSHLWio!~o |p53Ʊ5< -kH: zו'twq nqtUgeo9AofvAB#qŇZ靸6f#c}UR1jmJ4PnFָg ǫn_9ԭ92d8{"G=+ryoPIs! _|Ƙ#5H.w齆a~GaUyK2Kxd^$JTL@rWCba(Лz~{(Qn&QBH8rݬ:Áޭ<(ZP$6șg䩻w vӔ3'jVC" '[@bׇ$zy-s~7f|c)'EtNwsZ#td:Gh~) eִUA e\9 9n,' ;I%m=8:9ȃO$t>#inP^2q i(׊ѳ1;,ve[g.]f4c/C<̙癹s̙[$s)H%-#<5䣝]OL\%N&8`3L Lq8Xכ T=0JELO׬|XLxfY6aJ_}kղ=30l~-t' ~AA|^[D Hڞ0-ݡ40+®Sǜvv|0mWς0"9ɘ0{k#wYo J ϽV1RA6ūrGB8;_L$x_ qH?*[\L1E0Z+R~׋G]m_ܚgNQACL?qVF¸})^ޘpύtB q@2S8LZ0fp(#<{K6GLuN葨b6Ju!ˍggӉ ;)h\' \$F/]SL| wG<؇^ c|T|Lwzo S'7h:,o+|D!& =,0uͣN`SwlM1hIݘ055jZ_cƕ(p㛷wL)b[wli  .=+l?D:;שYaڜ+ѫ_kt\KhglG;8sԫX[R9tn+.hš;4{:)C-ܾb OzاW*=g5uM[S[#UDs!Gϧ?q&m&'ê&5C/1iˢ77iIM|c@ /nԨJ8g'N68LzIRUWLjEÇMI˜q]=_b qZq=I #8ޣ@LlkAhkLxq9pGJ GYMM|~2ܔBL|a7LjԎĤ-Ycr0|{*Ǻ%D'YbibK^s#{+ڳqxԠ"M;ڧʪvɟ]Q7NM4~ǣvLnڭpΧ:3mA}#vDMWn>|1m^IGߢv/x,)јEPڭ ^5й\텄 mnzD8lɲ] | قSּxb|Z_,ńx{b40aw?x߽I[7hrN …}ms2ة&mc;aRr BhmRN8} . vyp"*[Lc3NلIM0cËaҘ=z,"Fc]Y"/+e¿;%唗t̐sV;ݴцG387SPm}'Y8G6_vUo‡J/W5,&zyb}TP\i0zL->롔g FNm~8J د9\/ftt¾y-~Mݳk&vv_/`SZnF8-;o1ؘJh_,oK>@8Yfm.Σ&`vS&y%Ty?)N!I{k!49z\3{ 1i+;ǔaR?9~n(&mFp1/&5wķݾ`}.iw&Eя-]䱮G,NGD'GjĹ /ϖuc>9ȧᛃmQy&䏉 F;9TVfi/M)iP;c8h uk*')Ё*vE"zhGZKYw0ѕi'No(cRó6o(}#w\-BˮnG g?uc Lڢoh&WCLJe°m1i#aոcպsZ4J>19.FS֝ä{51B8#եW'&t1L'r%L6&NP:_!X̒фu1An0(ރ7C+0qm+vb(x _lm5wsBm`]f)J(%0~gEcWjwGקDLtxCшybK:eEva %1Ai'քL͹ 2*",xUyB# k_.[)@wHe|im1ṍ_ .SȹC혡s[%$U"+o1J&LfrL譽rKL֑:hLy]U"”V 8yY-ߧ / bmc [_~ '{ SYI;rpń+'?~M.k}+揮?,g2nHL4b:"* #}oE,4_L|sWgahY Ô+_~8X|&\٤h=(FJ`NDToQ9ji+g$S  P 7|R4!aa#S ^J6ޛ0Ƹ0kٰƝ;PrMTݨ)‚V,ń:=X,[ܪ!& ]I&ɍ0vwƽb@y <(_?f_AqVY> ڸ$0=%3^Y"2{HKX{%N(Q?HGC5H< 3VI7޺(K2%w:"uyGگ!#{/ar7/{x71baVύNe*b'F~pbL~n)sߤaJ%}&<Խsi )haIti\C1Ac+0aVYNaqZgWĄe-f%pX:ma,9&8{VL&%@){x=c`D$+Masz6a|6{1AǷƄYRvWa/oO1u#̴]/Bx&b!&8Q[G~J怰xm;a‚Sn# mM&09ÇA|Nq&L Il Wt%LV6.IwuGP^0A G>S0a ڿm'Lk/YPg,& =zlBxp0ATw-1!z/{&谣]1I"K/2ho>6ʰg&~Y} 1` ;c.oOƄ!_gm Z rKfOV y5IqI8 #|6&hm@BXZP>%&L {cIaw76˖„g7Nz}Ǿ$)#bQG1@bTD\_y ?_|z?\neIiD]FF|+-D =#/gA~wdHF# _w8=V'о[-Tm T"Qoñ!ʼnEgzfr aڌX10*kqܠ| ƈqAo#\GWGmp/X\1}Z;pҽ˧IٵIKw/ibT.Fhqo=(Xxbo:\t;Pz)R/1HX{}aV.[κ GgTVZ=~_\͎a % /2AvN,ܯK3+sXܼ>vG`>-;^Z2@W dA/A]p;X_d0>1#S* N2|`T1sQE̅H1,|#{}qvٹ䇈˖JuīYRDTJFS<b#[.C?uEaT/. G;FŠ}lEʼnb;K}&?UaXC's.ck|7}'b qBO>Hi?D߇o_#wSCw_>>1?숋灂TٙV{u#G3^g~i1u'pfeOA,{Cm "q/1]p6%9+7[oEȅÎ a^Y0s |UB`yQu9ɭȌon9l2kۢBxrF`C.3Ё7.͝ "so-OM󳃴@brc2"ڞ1FЫo ׎) ݢ(-)\0!Nm ᧞Jiky,Ï3LA}Aʅ=H˜ap)>HΔCsb0D`Ѹ,?%Dƿ")_bJ-<1sF>HsΟ ?GlʿV.@Ly;KEzQ=3GzdlǸ<_~}5'i*wFѣM_s)䷱Hqd'I{i4ݹr@0rft+*̅6~5 2A]&H /wvm?QCdbOXtYc4~+J_n)tuϡuk ةpEýτVI߯1/]ce JЂ}VYG g#<|ä%g@1 3 IV41otx /0i1. fѦˬ3mMSV,k{eh:PL[rgUsEn/x#2-},a,sG߀ؙaBt^ct^ã0| C`p3p=vdj@edȌS0te:2ڙ>l5 sBTsLD1NyxF;N2n̤3o]" D'LROx ΜGdȗ/j7v2SSS#,d> q[|A1zʇOQ?,Bo5tsW%LY< U'm|xvT:p pؿ/׹AC7"i10Wqt Ѽ2;x6]bkrչbp^:w oa\}w`r<݊ʍ0=[ MNV#^_N#]/7ֶ?1/u.|D=7j~ xx/@ [[W&LX3;_i>ڨ h,#EvM v<"sK!c|@7%zLJ Cm1giJٻ? ΋  97T$;1Sz\FƐ{՛bإV<[%I]Ś_ ߫x\S'6"y*>'~!g{J,W:|?W {I _!ӣ ,y>f4m]3p &Ea 1xze(r wXa΄!ܸoawl xw&.}^h9M%G}3{zNE5=@K 6iNLWn] 3n' }Ԝ翵WF%{6ykFK&6p&}"W$z ZL4?M2?.χS|.k\JT>_;m0:S `Ȗ$C`\cQ|c7 y5͑_l NHk(͗6yn7 mhl-~wFl3oi ,l˖6 'KGnI\jAA1z~*iGs&&=Y?S~Co;1}*"9KL6\׭bL~'fEYh&Ob}cF^ƫz=8b-yvSz\&=W2_pԒ֌|Y^$a͸ c&98qC;9xoUT$1YG 9tw;X93* px\Ws@7^?q+_<iu@lUA΂QyWŒɧG~wy)~_P h%L~[XKzmU!J)J1NI5@uM \\/vMF#f߁9X ZX/$?X{L3nJ/5UFп޻.WOh:kyV=ӽ{cKO߯/{}@Hdz޳yd-n]ۃ";~ʒs̃jC{2犸J D#WX3Fl) `/ȏEQt=hz??zg:O[1(P 4җ2h|35GNʥ+pGb!Bo&2^y)3FfYF2T9z|do9*w  y,@3G_RK Z$f͌_)DhWx3(J}/-8!RB٥jEe,еPd tv)\I(+&%.cl O&G۩雅5vKHL`#O:6ܠv*;Cꋇgtn'cR:o?Ro\M+6zO}=g+/ZF08y #꿽[ֽgٵ2{!~$X Vq{Xdzr)F71mD5Bu8<)FsK>Ke-EUK:л#y"z9H2_8 E Ft`~Zcȋ3d'uSyn1j#1s+E&D0N0wTX|Kt֟YE〿|g8FE!_x}fL=,z"?8(dڍGS6d/t859xH]_iikew+>6#M;H}7hYg瓧>n&M|0:l= cOݔCu{T )k۟ڏ5l~/7ïr׫f [vP>B&s Y4qMP.Ow*dn[p{Xdz "Dz[2q|)H-|ɞU:r˧ N|{><6\b=-aGX`;)g-;Nu=S\??2G e#?(Yg&06fRR ,?*z6,TڬV!4߼I^pѧ ΎnM~#zL|d >D9u}as qkvc%g37ÒVH^Xt<ӤŌ=?L /y.x|,S/8b 4 ֟:mix֣kR0]x0^' mf4m͘ 3rNIc$?'G"S<ͼ0HmAƁX<.f<1ҖH^"&l eqsC!|H?;?&-{ғu'|T}Jqy_8!2hϞXo`{h ۆ5CDi/DYGwY d iΙ.7ZF61.1WWׂEOPweкl9S$KH&_cfn2va(z_/jp4d`?P!ӗ0},uHX67f ̰g`-8s'\l9u FaN/9MZZnK**w~܎<A{xrV\_k5鯈gPkG\Oa{@@x~o=yAh0 rAV1SxbC.ڧnXˮyG`xȊ {^lMYG ? Mc8s)f v&]ic$_<r}6ho2^.yg5>E/z==2Kܖ1TLtZ:m+o/y{~9^:.gξR8zSζڵqAn2:-w\dWdl엮J޷^ ~΃ .*YZ0AjOm4qfgGYT3>o}a)s4+O~rhhD>C2N拓P~28J0I ڢ3RuVkwxP1* U^1Ӷxz$kW`Ϛq%g`fW`TYr.m; g,xjAͿ\}溿Gce'j*A{zxqT=|ҁ1vp O+c$z{?̎L;)vm讥{͎VER^.wF5AyT맗K8oQ2S<׮£vn޷c5}ڷ%:9=KQ+˶X_J4^zr^]5t̃kjRU{t>g9KGISZnDڜ,Gy7֡]szk⵩u VTA)͛fSWSS\.Wl s|U,mSq7rR=[]J*Оi}Cʋ[^ОM?|Mqfxi(p |]li^þg}~>(QA_@׶Rl5^M>ZmE[u*glS%Q }p:,i@K{c^OkxQ^3 yȁ Tk}N 3x^NlzJ2&s{ChH C>Ev%/=nnѴ;ݮhsBnOkak9>LLnz/?9ы7T4$?:` QY۴޴Ɂ^')O Ww LPܐnRRÉq,QgƧCu*\gw,MoD2Dq\;NwNܠ ;4i7#]6CKzZۊ)'uzi2׋>teL~!9;LW{Pk*ě?K<:ѯ*ӎKw>k!9]JPG7G!K)Y-iT؞Ô?Gl-c,xEz^їhM0z>@>E{z__<}Y[g؇ZdV Ay,62`~%zV@3Goi<G %ԚIJ@?i(k?ґ dWb<KaN{dYaʳ+>iKf4;}Ҥt$L7|O0;DVǥz ;ȁb!gIΫt%CLkpIyu\X 4xv-ƍ)X2\P?%7v!Ev%CO ,@D'O'3q͑^gчe_Pg1~z}yn?q=uR@zoC }@L]kDr{!˨)3ڀY0ꨅpXp1w['2,9mvo[nOӁEs so9f)ӽ%,97nm]a0W:"u)̟1ᎎM^e7,괪[9l*c$zw֓،Fz<2Grs":P\&.X8y=Nu?!^|8, ?DG($G邺%c>J?ΐ@ >>_`+p.xP(!}A|ה;W¯D,A_Œ6j hew?Ot$j1c.py6ٻ~ ‡s%E砗%)U]4ai/|h So>ROGЉy4&{х q:#dzb>}:l/W2s\k]!y/n'"=y.!"H.$H}XnXpEO|^0\lxt7L(Y1H>R(KG7l\h:/͜k dCO#pm}a!04=Wz38TִNWְ";HY__o'QY{$O=|/#8%껏&~I㋓HEf}rYg}=\X>ٸ) ci3xJӹ# -\~ IBKZ^g6t3 <"~0LPx[ ^3q½PX'Ri{pѭwAFp_?<A?k(]uq~q:J/ Qy/+_,&3z\ƈsQ0Sjs2u$_/ѷy=. Gq %4W]23F5p"8кQ-ABߥ;ԉ+]E2><A%wq{NVXuz}zdTW<ָh"Ax(cƀ+L ȴlNM=ky ˆxԶܤcpQ ͜_8^hUZH: gق~u/%eD/y d͒$<~Zz2!ʲ1[(` {PNY0qhȖνE#z v ͜oނ nx d< O=liw("$ ;?mc$z^Gz}ƱWN :kXYA9r•;zt)xL/HtZQy.'?d?ecO\YRMp^o7_~^\`ˀmցns67sx),jQ]1 ƛ\ 7|A zޯ_<A%߯$c\6[5D]2~g) ]v6Sy^|Lɸ%z!wʴeC$,LсC[+tvl:hWޔؖW9~([:FЦxoq2M}[~]D^v (L;>:uuB\%/]Рm=;cYslût\ ؐެa/X{ykW]J5[ל*]37+t g;{NL+sqHDt|w~A@}LƉπgKr4m36@fx'e 8] N)]\ I]yu>t?X3}b_ <A%OOpa9O!=Uftac,h?!ϓ·*W\Gg=ƁJ?Pdp9&@U^ :?L\\i7X:*fĂՃaM&%ޫMjqĸҝ =0tXd^?=qO-gOٽn1`tڱӂeN^w kXЕ+y޿Zfdޏ GA|h}6Ggk_+] =b2ODzBʣJtmA;Mfw+GG xEv%zӓy2&8.tӴ•">=K/Je#ڣӅQ)\?&#ۨEuaTdCۖqݱ}Ԉvl`)jԱ_(4kv 1AqSz拲s?Q$~I<YLL~^G 4WiO=mMH3Ҹ,qOx~`<A%OO%]z?xiF/QryzZEӧrڟB=aӮb%ż}P׻4)]?=|Z`<9dU%q>Gs뱮:BYimƃ=/76pk;]y`d7jRȜ4&?՝#F#Y<ؿD?x:ُ@4$1&JWmnO{G+K' I?cfgj#hgO'iOۛtt62vWEyfMKHvvk LS[4:u(aw bvn3_DL:.^sn$P:*?gp >sFUz:/K8C 􄵗M:=WGL3С=Ƹn@o8j>16Sv4=#Ӟz׼-JXćCWDr_eSzQz}/OV*>ny%/S1Im\>.ޡ~=cW彋6rڽws-W9eg%:g9W߶ZлO~ŏ]y:jcO;s|"Rk]WOIaS}S# P>PӶ_HD֡?F<ݣo4FKԗ)~^ Jj{o/n7:H4ǛӍ9Ԏ*gm|N8lKZW.p|v?eOoN:4"u7ͬfS/{JN,K6ƹOy3:~2w]Xt'OFziq r]#Ԗ{F[Q :#R ::BzS×2SB_ vGڐ2dά#t- ?7팸iHO2gjӘTO]s}2z~/00 9|&VUAtN!5|4&>@)UrJȑ:9 GHi#rDljĆFljĆFljĆ:NlĆ:NlĆ:NlhĆAlhĆAlhĆ&IlhĆ&IlhĆ&IlhZĆElhZĆElhZĆ6MlhĆ6MlhĆ6Ml:ĆCl:ĆCl:Ć.KlĆ.KlĆ.mHTVUWjTjVjUjWTV[SZmMښj5jkTV[SZmMښZ5jkjԪU[SVmMښZ5jkԫW[S^mMښz5jk4iT[ӨQmMښF5jk4iT[ӬYmMښf5jk4iV[ӬYmMI4Ufbe粳V>T>T>Ԩ>Ԭ>Ԫ>Ԯ>ԩ>ĎM8VqVXƱFcZ5k8aW]vjUaW]vjUaW]vkUaW]vkUaW]vk%s asqqQNխڲ3;Yd5N֪;Y:ܮJoVS;]5뮥ZݵTjuRZ]Kk^w-뮥zݵTuRZ]KkQw-5ꮥFݵԨuRh]Qwu4NJN5tDZ)R4khJѮS+?j{SjyVC;j|VZ-j^gZ>Y|Vz-k^gZ>kY|֨F-5jyQCZjPSö1ln}vZJ)տR{J)f;7[z}KR~Ծb[k!ﵐZH{-R^ ԿBk!ﵐZH{-R^ 4Bk!ﵐZH{-F^#h|4u4hn)ss7RyͣǮQ W^3qs+G7 l۸eo(4$egMƔ%T zy[L G^i5._?;i4}(yvAY^Wy"=5}(X%4`(k&Wsx9aP1Zpy]PpJPf0`P6Ga([ԅ?.(\ըpP6=Aٔ992x[R@DoTAi񉻅~ֳٿ^ș "A7UlJ @/2]A@VƠLcLq{V2*2U!Ilڣznl!ZBN[{kP6 llA@Suɚisڂ&ދ9f:hӞd\<I{doveR>ULʭrʮ^7ky|0=5Sz3 Δ|<(n뗙e **[9ݾ AYC`v5x1yoz ?oNHci@37!m-RodWG3 ?qpb+W1a Tt[>(/8kW08P cՊ!¨"‘GMՅQC5QKje0F=aq0W}DfApa!h(#q018V xa F8Q' 0NFa4)8U ta4XC,a-sq0FsaFKaFkaƪw?0.Eh/jGatƪ\U;݅q0.e¸\WJa!Uq0FOa¸A7 c~^q0nFoa&UEFa)XpU~s0VG >a_ˬ/ +.OTwՀC5tvp_'%nHvs_.dpQ j%TiUi7Fd'NYZ{ވ}UvAFOVQPY[áF9...ʌj`]Y(׮Uo?X1|UE 5[ kF"FcV[l wU_EιZ|. ?iQSi=^^Uy'5Du'V[ PW[y~iVkP_mzrBb߲u]?//ƚ߲7?O~XuRܿ`7ٳg_X)_kkk_S>EGuwW7<Ы*PpZIc2 UU߸ uk`O5oTZ]]3N?VYէ _}!ǩy K;M?@ jg~ѥz~鳯57a^?]R}2Ҥ +Cbbt*rxvbWWy$89/Gn!SS֊;qO@J>k]j }B_^ //4ߎ:=ʋjުm6@\>Ţ6%tPZUNn/qxy|D(= fg'}R>ۚ'd$1߈ӟG~|R"^&an˪b"n+QE6ac%:O}(Odo_U|҇_ FEQX.ua`Q Aq5zDroxΈvx2`]TolJ"So'@d#iQL⪗1 ;ww*&?9#^0|  }QsGV2 fـ>\1{\R!(-gOt;PVۨ D4QS`y7(Ӊ)Ӄѓ?tcr۟?/Ejs\^m,:-UW6edg~T]Em+V_xd?- <'(A' 4++>hx4/;jUF>C;3t@y /hnXQ@xyOW5c z8iv~LlL:7GݕLb.v9UUZm4DE}MnCFj1z֔yڷyZxPsPO{%PzJ!J L^uۃsI`4 Z` ʇ_`-rGR!gàOc._xQn:)5@=]So_ pIj@g#3,?sG=|Q΄$rUFCFZ%c<g/>~щ;*ɏwz#/Q>R{Q:ͭshȊZո  a݇)G)k`Ȇ ̪ =\.JG~ g7ܐw^Q*Ye59btkH55zeLeRx볹JC^?WOE,?'{[+})/*; 8?N'"ӷ~yWcɗpych彫"VnUO=*.rC_>*02#pIzɯ0i k|I;3bbdu$"|?]N}v#yhwzv!y>mkl>vz}->?گO6]\NgKVE?k>yڡ*q;\$sXgl9Y~=NPr'X+RÄh!4t`6,S9嘱-%cDA8-?9tpp\|Xgl9Y~}r=ݕ_~V5z#؏~},0[})P1~lՎZW9K88(2+_jr~mmF6zƿX"ECjHD_ewo&zҕ}/#b6?X}AyYk`V_Tr]y|GNu;DϤ5+TEv:c\<}Go"nq\rsr=sX~rLx"nG\.=SoXBM3ׇ %)<ퟁ@\iGx9zc}Τ\/M9rfϏӉ4s&맣>gg_c?rĆXyD@+J'1uCPkY}kwrT*h5uXE^c1|}xW}:5}h,TQ֪ӿCA_yk"XU?VU$c/Q$c\dLKcz\gK7߽ w7VFYd?5ҫ}!Ӱ?isTƁž|h,6VD<@vnn6փXػ ,\k T`\X_Se¶$e,뺐.v璓zYǯb隻} =b#Vl̊؄X)+6c؂[<+b֬؆۲b;Vlϊ ؁;b'VTdά؅b7VTb؃{b/V͊}X/+*G33>v~QdOwy_-ozI},W;{wҨ4+8Lw7`cM3@G`{IiiQ+]PQ~8OGc 4?{gOovq)+?>?F__y\;st/~id~|qzt~?{_7hsj;d+]?Ҿn?i||}c?'y?g?&b_,:7@O }[% zdmd^B6%k;씊 NdHv2dm'J1ck;bO;:KE'd񘻩Eվ,,9K]qǵ2Lu+kakl^U"}Zz@i>Eqe98 afex/tests/testthat/test-emmeans-interface.R0000644000176200001440000002242514076011251020664 0ustar liggesusers context("interplay with emmeans") test_that("ANOVA functions work with emmeans, univariate & multivariate", { skip_if_not_installed("emmeans") data(sk2011.1) a1 <- aov_ez("id", "response", sk2011.1, between = "instruction", within = c("inference", "plausibility"), fun_aggregate = mean, include_aov = TRUE) em1 <- emmeans::emmeans(a1, ~ inference, model = "univariate") em2 <- emmeans::emmeans(a1, ~ inference, model = "multivariate") expect_is(em1, "emmGrid") expect_is(em2, "emmGrid") expect_equal(as.data.frame(summary(em2))$emmean, as.data.frame(summary(em1))$emmean) expect_false(isTRUE(all.equal( as.data.frame(summary(em2))$SE, as.data.frame(summary(em1))$SE))) em1 <- emmeans::emmeans(a1, ~ inference*plausibility, model = "univariate") em2 <- emmeans::emmeans(a1, ~ inference*plausibility, model = "multivariate") expect_is(em1, "emmGrid") expect_is(em2, "emmGrid") expect_equal(as.data.frame(summary(em2))$emmean, as.data.frame(summary(em1))$emmean) expect_false(isTRUE(all.equal( as.data.frame(summary(em2))$SE, as.data.frame(summary(em1))$SE))) a1b <- aov_ez("id", "response", sk2011.1, between = "instruction", within = c("plausibility", "inference"), fun_aggregate = mean, include_aov = TRUE) em1 <- emmeans::emmeans(a1b, ~ inference, model = "univariate") em2 <- emmeans::emmeans(a1b, ~ inference, model = "multivariate") expect_is(em1, "emmGrid") expect_is(em2, "emmGrid") expect_equal(as.data.frame(summary(em2))$emmean, as.data.frame(summary(em1))$emmean) expect_false(isTRUE(all.equal( as.data.frame(summary(em2))$SE, as.data.frame(summary(em1))$SE))) a2 <- aov_ez("id", "response", sk2011.1, between = "instruction", within = c("inference"), fun_aggregate = mean, include_aov = TRUE) em1 <- emmeans::emmeans(a2, ~ inference, model = "univariate") em2 <- emmeans::emmeans(a2, ~ inference, model = "multivariate") expect_is(em1, "emmGrid") expect_is(em2, "emmGrid") expect_equal(as.data.frame(summary(em2))$emmean, as.data.frame(summary(em1))$emmean) expect_false(isTRUE(all.equal( as.data.frame(summary(em2))$SE, as.data.frame(summary(em1))$SE))) a3 <- aov_ez("id", "response", sk2011.1, within = c("inference"), fun_aggregate = mean, include_aov = TRUE) em1 <- emmeans::emmeans(a3, ~ inference, model = "univariate") em2 <- emmeans::emmeans(a3, ~ inference, model = "multivariate") expect_is(em1, "emmGrid") expect_is(em2, "emmGrid") expect_equal(as.data.frame(summary(em2))$emmean, as.data.frame(summary(em1))$emmean) expect_false(isTRUE(all.equal( as.data.frame(summary(em2))$SE, as.data.frame(summary(em1))$SE))) a4 <- aov_ez("id", "response", sk2011.1, between = "instruction", fun_aggregate = mean, include_aov = TRUE) em1 <- emmeans::emmeans(a4, ~ instruction, model = "univariate") em2 <- emmeans::emmeans(a4, ~ instruction, model = "multivariate") expect_is(em1, "emmGrid") expect_is(em2, "emmGrid") expect_equal(as.data.frame(summary(em2))$emmean, as.data.frame(summary(em1))$emmean) expect_true(isTRUE(all.equal( as.data.frame(summary(em2))$SE, as.data.frame(summary(em1))$SE))) #### data("sk2011.2") ab1 <- aov_ez("id", "response", sk2011.2, between = "instruction", within = c("what", "validity", "type"), fun_aggregate = mean, include_aov = TRUE) em1 <- emmeans::emmeans(ab1, ~ what*validity*type, model = "univariate") em2 <- emmeans::emmeans(ab1, ~ what*validity*type, model = "multivariate") expect_is(em1, "emmGrid") expect_is(em2, "emmGrid") expect_equal(as.data.frame(summary(em2))$emmean, as.data.frame(summary(em1))$emmean, tolerance = 0.1) expect_false(isTRUE(all.equal( as.data.frame(summary(em2))$SE, as.data.frame(summary(em1))$SE))) em1 <- emmeans::emmeans(ab1, ~ validity*what*type, model = "univariate") em2 <- emmeans::emmeans(ab1, ~ validity*what*type, model = "multivariate") expect_is(em1, "emmGrid") expect_is(em2, "emmGrid") expect_equal(as.data.frame(summary(em2))$emmean, as.data.frame(summary(em1))$emmean, tolerance = 0.1) expect_false(isTRUE(all.equal( as.data.frame(summary(em2))$SE, as.data.frame(summary(em1))$SE))) em1 <- emmeans::emmeans(ab1, ~ type, model = "univariate") em2 <- emmeans::emmeans(ab1, ~ type, model = "multivariate") expect_is(em1, "emmGrid") expect_is(em2, "emmGrid") expect_equal(as.data.frame(summary(em2))$emmean, as.data.frame(summary(em1))$emmean, tolerance = 0.1) expect_false(isTRUE(all.equal( as.data.frame(summary(em2))$SE, as.data.frame(summary(em1))$SE))) }) test_that("ANCOVA with emmeans is correct for univariate & multivariate", { skip_if_not_installed("emmeans") data(sk2011.1) # a1 <- aov_ez("id", "value", obk.long, between = c("treatment", "gender"), # within = c("phase", "hour"), covariate = "age", # observed = c("gender", "age"), factorize = FALSE) # emmeans(a1, ~ phase, model = "multivariate") # emmeans(a1, ~ phase, model = "univariate") # # emmeans(a1, ~ treatment, model = "multivariate") # emmeans(a1, ~ treatment, model = "univariate") # deactivated, see: https://github.com/rvlenth/emmeans/issues/32 a2 <- aov_ez("id", "value", obk.long, between = c("treatment", "gender"), covariate = "age", fun_aggregate = mean, observed = c("gender", "age"), factorize = FALSE, include_aov = TRUE) em1 <- emmeans::emmeans(a2, ~ treatment, model = "univariate") em2 <- emmeans::emmeans(a2, ~ treatment, model = "multivariate") expect_equal(summary(em1)$emmean, summary(em2)$emmean) }) test_that("mixed works with emmeans", { skip_if_not_installed("emmeans") skip_on_cran() data(sk2011.1) emmeans::emm_options(lmer.df = "asymptotic") m1 <- mixed(response ~ instruction*inference*plausibility +(1|id), sk2011.1, progress = FALSE) expect_is(emmeans::emmeans(m1, ~ inference), "emmGrid") m2 <- mixed(response ~ inference +(inference|id), sk2011.1, progress = FALSE) expect_is(emmeans::emmeans(m2, ~ inference), "emmGrid") m3 <- mixed(response ~ instruction +(inference|id), sk2011.1, progress = FALSE) expect_is(emmeans::emmeans(m3, ~ instruction), "emmGrid") }) test_that("mixed works with type=2 and all methods", { skip_if_not_installed("emmeans") emmeans::emm_options(lmer.df = "asymptotic") ## in all tests, data needs to be passed because of nested evaluation. data("sk2011.2") sk2_aff <- droplevels(sk2011.2[sk2011.2$what == "affirmation",]) mixed_kr <- mixed(response ~ inference*type+(1|id), sk2_aff, type=2, method="KR", progress = FALSE) expect_is(emmeans::emmeans(mixed_kr, specs = c("type")), "emmGrid") mixed_s <- mixed(response ~ inference*type+(1|id), sk2_aff, type=2, method="S", progress = FALSE) expect_is(emmeans::emmeans(mixed_s, specs = c("type")), "emmGrid") mixed_lrt <- mixed(response ~ type+(1|id), sk2_aff, type=2, method="LRT", progress = FALSE) expect_is(emmeans::emmeans(mixed_lrt, specs = c("type")), "emmGrid") mixed_pb <- suppressWarnings(mixed(response ~ type+(1|id), sk2_aff, type=2, method="PB", progress = FALSE, args_test = list(nsim = 10))) expect_is(emmeans::emmeans(mixed_pb, specs = c("type")), "emmGrid") mixed_oldkr <- mixed(response ~ type+(1|id), sk2_aff, type=2, method="nested-KR", progress = FALSE) expect_is(emmeans::emmeans(mixed_oldkr, specs = c("type")), "emmGrid") }) test_that("emmeans works with mixed and expand_er = TRUE", { skip_if_not_installed("emmeans") skip_if_not_installed("MEMSS") data("Machines", package = "MEMSS") m2 <- mixed(score ~ Machine + (Machine||Worker), data=Machines, expand_re = TRUE, progress = FALSE) t1 <- emmeans::emmeans(m2, "Machine", lmer.df = "asymptotic") t2 <- emmeans::emmeans(m2, "Machine", lmer.df = "Satterthwaite") t3 <- emmeans::emmeans(m2, "Machine", lmer.df = "kenward-roger") expect_is(t1, "emmGrid") expect_is(t2, "emmGrid") expect_is(t3, "emmGrid") expect_is(summary(t1), "data.frame") expect_is(summary(t2), "data.frame") expect_is(summary(t3), "data.frame") }) test_that("emmeans with mixed & expand_re = TRUE with pre 3.0 lmerTest objects", { skip_if_not_installed("emmeans") skip_on_cran() load("m_machines_lmerTest-pre3.0.rda") # load("tests/testthat/m_machines_lmerTest-pre3.0.rda") t1 <- emmeans::emmeans(m_machines, "Machine", lmer.df = "asymptotic") t2 <- emmeans::emmeans(m_machines, "Machine", lmer.df = "Satterthwaite") t3 <- emmeans::emmeans(m_machines, "Machine", lmer.df = "kenward-roger") expect_is(t1, "emmGrid") expect_is(t2, "emmGrid") expect_is(t3, "emmGrid") expect_is(summary(t1), "data.frame") expect_is(summary(t2), "data.frame") expect_is(summary(t3), "data.frame") }) afex/tests/testthat.R0000644000176200001440000000007013664111747014331 0ustar liggesuserslibrary(testthat) library(afex) test_check("afex") afex/vignettes/0000755000176200001440000000000014076067306013216 5ustar liggesusersafex/vignettes/afex_analysing_accuracy_data.Rmd0000644000176200001440000012407414076011252021512 0ustar liggesusers--- title: "Analysis of Accuracy Data using ANOVA and binomial GLMMs" author: "Henrik Singmann" date: "`r Sys.Date()`" show_toc: true output: knitr:::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Analysis of Accuracy Data using ANOVA and binomial GLMMs} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r echo=FALSE} req_suggested_packages <- c("emmeans", "dplyr", "ggplot2", "cowplot", "ggbeeswarm") pcheck <- lapply(req_suggested_packages, requireNamespace, quietly = TRUE) if (any(!unlist(pcheck))) { message("Required package(s) for this vignette are not available/installed and code will not be executed.") knitr::opts_chunk$set(eval = FALSE) } ``` ```{r, include = FALSE} op <- options(width = 90, dplyr.summarise.inform = FALSE) knitr::opts_chunk$set( collapse = TRUE ) ``` # Overview This vignette shows how accuracy data can be analysed with `afex` using either ANOVA or a binomial generalized linear mixed model (i.e., a mixed model that uses the appropriate distributional family for such data). Accuracy data means data where each observation can be categorized as either a 0, which indicates failure, miss, or an erroneous response, or 1 which indicates success or a correct response. We begin by loading the packages needed here and set a somewhat nicer `ggplot2` theme. ```{r setup, message=FALSE, results='hide', warning=FALSE} library("afex") library("emmeans") library("dplyr") library("ggplot2") theme_set(theme_bw(base_size = 15) + theme(legend.position="bottom", panel.grid.major.x = element_blank())) library("cowplot") library("ggbeeswarm") ``` # Data and Research Question The data we are looking at is from [Lin and colleagues (2020)](https://doi.org/10.1177/0956797620904990) and investigates ego depletion using a novel paradigm. Ego depletion is a (social) psychological concept originating from Roy Baumeister's work which can be summed up by the phrase 'self-control/willpower is a muscle': An initial use of self-control, such as performing a demanding task or resisting a temptation, depletes the available self-control resources so that subsequent tasks only have limited self-control resources available. The paper introducing the concept was published in 1998 (references can be found on [Wikipedia](https://en.wikipedia.org/wiki/Ego_depletion)). The ego depletion concept was extremely popular until the height of the replication crisis in psychology in which researcher also struggled to replicate the key ego depletion phenomenon just outlined. Recently, Lin and colleagues developed a new paradigm for investigation ego depletion. Their primary interest was on analyzing the data using a diffusion model, which will not be of interest here. [Lin and colleagues (2020)](https://doi.org/10.1177/0956797620904990) task followed the usual approach for ego depletion tasks. In a first phase, participants either worked on a high-demand task or a low-demand task (variable `condition`). Then, participants had to work on a Stroop task. The Stroop task consist of colour words (i.e., "red", "blue", or "yellow") displayed in a colour (i.e., red, blue, or yellow). In each trial, one of the three words is displayed in one of the three colours (e.g., the word "red" could be displayed in red or blue). The task of the participants is to press a button corresponding to the three colours the word is displayed in (i.e., participants have to ignore the meaning of the word but focus on the colour the letters have). The Stroop effect is the finding that it is easier to select the correct colour in a congruent trial in which the meaning of the word and the colour the word is displayed in match (e.g., the word "red" in red). In contrast, people are slower and make more errors in an incongruent trial in which there is a mismatch between word meaning and word colour (e.g., the word "red" in blue). In other words, it is difficult for people to ignore the meaning of a word when having to decide which colour the word is displayed in. The variable determining match between word meaning and world colour is `congruency`. The hypothesis of the ego depletion concept is that it moderates or interacts with the congruency effect (i.e., difference in performance between congruent and incongruent trials). In particular, the congruency effect is smaller if participants are ego depleted compared to when they are not. We analyse this Stroop data in the following. One of the new features of Lin et al.'s (2020) study compared to earlier ego-depletion studies is that both variables, `condition` and `congruency`, vary within-subjects. That is, each participants once performed a high-demand task followed by the Stroop task and then also a low-demand task followed by a Stroop task. This was usually done on two different days with a week time in between in counterbalanced order. We then load the data, called `stroop`, which comes with `afex`. For simplicity we only focus on the data from Lin et al.'s (2020) Experiment 1 (the data of all their 4 studies is part of `stroop`). We focus on the accuracy of participants which is coded as either 0 (error) or 1 (correct response) in column `acc`. We also remove all `NA`s in the response variable and drop unused factor levels. This streamlines a few of the calls later on. ```{r} data("stroop") ## extract data from experiment 1 and remove NAs stroop_e1 <- stroop %>% filter(!is.na(acc)) %>% filter(study == "1") %>% droplevels() ``` A look at the resulting `data.frame` reveals that we have trial-wise data. That is, each observation (i.e., row) is one response to a Stroop trial. The data is not yet aggregated so that each participant has one observation per design cell (i.e., denoting the average accuracy for each participant in this cell). We also see we still have quite a bit of data left, from 253 participants. ```{r} head(stroop_e1) str(stroop_e1) ``` # ANOVA Analysis We begin with an analysis of the data using standard repeated-measures ANOVA. ANOVA is probably the most common approach to analyse such data in psychology, but its use is somewhat questionable. The reason is that ANOVA assumes that response variable is normally distributed (or more precisely, the conditional distribution of the data after taking the model into account, i.e., the residuals, are assumed to follow a normal distribution). Here, our data are only 0s and 1s which do not follow a normal but rather a binomial or Bernoulli distribution. Nevertheless, analysis of such data using models assuming normal distribution such as ANOVA is not uncommon and in many cases leads to the same conclusions than the more complicated model discussed below. However, as we will see below, the results can also change. We set up the model using `aov_ez` and specify both factors, `congruency` and `condition`, correctly as `within` factors. ```{r} e1_anova <- aov_ez( id = "pno", dv = "acc", data = stroop_e1, within = c("congruency", "condition") ) ``` Fitting this model produces a warning message telling us what we already know. There is more than one observation per participant and cell of the design (i.e., combination of our two factors) and the data is averaged before calculating the ANOVA. Note that if we would not have removed the `NA`s from the data, this call would have failed with an error as all participants have `NA`s so all would have been removed. In that case, we could have added `na.rm = TRUE` to the `aov_ez()` call to ignore the NAs when aggregating the data. If we take a look at the ANOVA table, we see a clear main effect of congruency, a somewhat weaker main effect of condition, but no interaction. ```{r} e1_anova ``` The observed pattern of effects is in line with most recent failures to replicate ego depletion. The main effect of `condition` suggests there be some general effect, such as more errors after a demanding task, but not the predicted interaction of condition with the congruency effect. The original prediction of ego-depletion is that it reduces self-control, thus resulting in attenuated Stroop effects after depletion. This pattern would result in a significant interaction. We can look at the effects in turn using `emmeans`. We begin by looking at the Stroop effect, that is the effect of `congruency`. ```{r} emmeans(e1_anova, "congruency") ``` We can see the usual Stroop effect. Accuracy is higher for congruent compared to incongruent items. We also look at the effect of condition. ```{r} emmeans(e1_anova, "condition") ``` We see that accuracy is roughly 1% lower in the ego-depletion compared to the control condition. We can also plot both effects. ```{r, fig.width=6, fig.height=3} plot_grid( afex_plot(e1_anova, "congruency", error = "within", data_geom = geom_quasirandom, data_alpha = 0.3) + coord_cartesian(ylim = c(0.25, 1)), afex_plot(e1_anova, "condition", error = "within", data_geom = geom_quasirandom, data_alpha = 0.3) + coord_cartesian(ylim = c(0.25, 1)) ) ``` # Mixed Model Analysis ```{r, echo=FALSE} load(system.file("extdata/", "outputs_glmm_vignette.rda", package = "afex")) ``` A model with a more appropriate conditional distribution (instead of the normal distribution used by ANOVA) are generalized linear models with a binomial family. Because we have repeated measures both within participants within each design cell and across cells (i.e., we have within-subject factors) we need to use a mixed model. Thus, we have to employ a generalized linear mixed model (GLMM) with a binomial family. Here, we use the canonical link function, the logit (an alternative would be probit). In our call to `mixed` we indicate the fact that we want to estimate a binomial GLMM (in contrast to a regular LMM) by passing the correct family, `family = binomial`. We could further specify the link function (e.g., `family = binomial(link = "probit")`), but because we use the canonical link here, this is not necessary. As for all mixed models, we should begin our analysis with the "maximal random effect structure justified by the design" (Barr et al., 2013), the *maximal model.* Because all factors vary within-subjects in the present case and we only consider one random-effects grouping factor (participant), the maximum random effect structure involves by-participant random intercepts as well as by-participant random slopes for factors congruency, condition, and their interaction, as well as the correlation among the random effect parameters. If you need an introduction to the topic of the random effect structure, consider reading our introduction to mixed models ([Singmann & Kellen, 2019](http://singmann.org/download/publications/singmann_kellen-introduction-mixed-models.pdf)). A worked example of how to reduce the maximal model in case of converging warnings is provided in the [mixed model vignette](afex_mixed_example.html). Another important decision when fitting a mixed model with `afex::mixed` is the choice of the `method` for testing model terms. The default `method` is the Kenward-Roger approximation. However, this is not possible for GLMMs (i.e., it only applies to LMMs). For GLMMs we only have two methods available, likelihood ratio tests (`method = "LRT"`) and parametric bootstrap (`method = "PB"`). Parametric bootstrap is generally the preferable procedure, especially in settings with small N, specifically low numbers of levels for the random effects grouping factor (i.e., few participants in the present case). However, parametric bootstrap can be prohibitively time consuming as it requires refitting the model several times (suggested is at last a 1000 times per model term/effect). The main factor influencing the time is therefore the complexity of the random effect structure. Even with only a moderately complex structure, such as in the present case, it can take days (even though computations can be distributed on a multi-core machine as shown below). One rule of thumb (for which I have never seen any actual data) is that with more than around 50 levels for each random effects grouping factor, likelihood ratio tests are probably okay and parametric bootstrap not necessary. Luckily, in the present case we have over 250 participants (i.e., way more than 50), so we decide to use likelihood ratio tests as a method for testing model terms (i.e., `method = "LRT"`). ## Setting-Up and Fitting the Models There are two ways on how to set up such models in `afex::mixed` (`lme4` provides another third variant that is not possible in `afex::mixed`). Before describing both ways, the somewhat surprising fact is that the second way, based on the aggregated data, is considerably faster than the first way. In the present case the first way takes more than an hour on my laptop whereas the second way takes only around one minute! To understand the two different ways, it might help to recall some basics about the [binomial distribution](https://en.wikipedia.org/wiki/Binomial_distribution). It is defined by the number of observations and the number of successes and has one parameter, the success probability. Because we want to estimate the parameter of the binomial distribution, the success probability, we have to pass two pieces of information to the `mixed` function; the number of successes and the total number of trials. The easiest way to do so with the current data is by directly passing the accuracy column `acc`. It only consists of zeros and ones so the total number of observations is the number of trials, and the number of ones is the number of successes. The following code sets up the maximal model as discussed above using this approach. Note that fitting this model takes more than an hour (likely several hours). ```{r, eval=FALSE, warning=FALSE} e1_mixed1_v1 <- mixed( acc ~ congruency*condition + (congruency*condition|pno), data = stroop_e1, method = "LRT", family = binomial ) ``` Before looking at the results, let us first discuss the alternative way of specifying the model. Note that the second way is usually considerably faster. This way consists of two steps. We first need to aggregate the data within each cell of the design and participant by calculating the proportion of correct responses and the number of trials for each cell. Then we can pass these two pieces of information to `mixed`, the proportion of successes as the dependent variable and the total number of successes as a `weight`. These two pieces of information again provide all information required for the binomial distribution. However, note that it is important that proportion times the weight provide an integer number, the actual number of successes which cannot have a decimal part. At first, we need to aggregate the data. For this, we can use the following `dplyr` syntax. ```{r} stroop_e1_agg <- stroop_e1 %>% group_by(condition, congruency, pno) %>% summarise(acc = mean(acc), n = n()) ``` Then, we can set up the model. Note that we need to pass the total number of trials as the `weight` argument here. `mixed` now supports the exact same syntax as `glmer` so we can pass simply the unquoted name of the column holding the weights, `weight = n`. The call to `mixed` is then pretty much the same as above, the only differences are that we have to use the `data.frame` with the aggregated data, potentially a new name of response variable (here I decided to use the same name, `acc` for the aggregated accuracy), and the `weight` argument. ```{r, eval = FALSE} e1_mixed1_v2 <- mixed( acc ~ congruency*condition + (congruency*condition|pno), data = stroop_e1_agg, method = "LRT", family = binomial, weight = n ) ``` ## Dealing with Fit Warnings Before looking at the results, we see that fitting produces quite a few warnings. These are reproduced below in the way we would also get them when simply typing in the object name (e.g., `e1_mixed1_v2`). The following are the warnings for the first variant, `e1_mixed1_v1`. ```{r, echo=FALSE} xxx <- lapply(outp_e1_mixed1_v1$warnings, function(x) warning(x, call. = FALSE)) ``` And these are the warnings for the second variant, `e1_mixed1_v2`. ```{r, echo=FALSE} xxx <- lapply(outp_e1_mixed1_v2$warnings, function(x) warning(x, call. = FALSE)) ``` Both variants show quite a few warnings. The warnings are given separately for the different models estimated (i.e., full model with all terms and one model for each term removed from the full model). However, none of the warnings is the dreaded "singular fit" warning that clearly suggests an over-parameterised model. We therefore will be working with this random effect structure going forward. Here, we have two different warnings suggesting some numerical issue at the maximum likelihood estimate. One warning tells us that for the result returned from the fitting (i.e., optimization) algorithm the absolute gradient of the deviance function is not small (i.e., there might be a better global optimum that was not discovered). Another warning relates to the size of the eigenvalue which suggests something similar, there might be better solutions in the parameter space. More on these warnings can be found in the `lme4` help at `?troubleshooting` (or `help("troubleshooting", package = "lme4")`). Given that both types of warnings are not too dramatic, one way to address them is by trying different optimizers. `mixed` makes this easy via the `all_fit` argument, if `TRUE` several optimizers are applied to the output from the regular run (make sure to install packages `optimx` and `dfoptim` to use all possible available optimizers). ```{r, eval = FALSE} e1_mixed1_v2_allfit <- mixed( acc ~ congruency*condition + (congruency*condition|pno), data = stroop_e1_agg, method = "LRT", family = binomial, weight = n, all_fit = TRUE ) ``` ```{r, echo=FALSE} xxx <- lapply(outp_e1_mixed1_v2_allfit$warnings, function(x) warning(x, call. = FALSE)) ``` Somewhat surprisingly the fit using all optimizers produces more convergence warnings than the previous fit. However, all warnings are of the same type as for the other variants. Another way to deal with the warnings is by fitting a variant of the model with reduced random effect structure. Hopefully this model will not produce the warning, but similar results. If warnings are more severe than the current warning, fitting a reduced model is surely indicated. Critical warnings that make it necessary to reduce the model are for example a singular fit warning or a warning that the algorithm did not converge within the allowed number of iterations. Nevertheless, if this were a real data analysis for a manuscript it would probably still make sense to reduce the random effect structure, beginning with the correlation among the random effect parameters, until the warnings are gone. Then, we would compare the final (i.e., reduced) model with the maximal model to ensure that the pattern of significant and non-significant effects is the same in both cases (if not, this needs to be reported transparently). An example of such an iterative reduction of the random effect structure is given in the [mixed model vignette](afex_mixed_example.html). ## ANOVA Table for GLMMs We can now print the model to get the resulting ANOVA table, that is the table of model terms (i.e., main effects and interactions), as for the regular ANOVA model. Doing so would normally also reproduces the warnings shown above but is suppressed here. We show the results of the three variants in turn. ```{r, eval=FALSE} e1_mixed1_v1 ## variant 1 ``` ```{r, echo=FALSE} cat(outp_e1_mixed1_v1$output, sep = "\n") ``` ```{r, eval=FALSE} e1_mixed1_v2 ## variant 2 ``` ```{r, echo=FALSE} cat(outp_e1_mixed1_v2$output, sep = "\n") ``` ```{r, eval=FALSE} e1_mixed1_v2_allfit ## variant 2 with all_fit = TRUE ``` ```{r, echo=FALSE} cat(outp_e1_mixed1_v2_allfit$output, sep = "\n") ``` As can be seen, the results of the three different variants are extremely similar. Especially the fact that the results from variant 2 and the variant with `all_fit = TRUE` are pretty much the same suggests that we can have some confidence in the results. As for the ANOVA we see significant main effects of congruency and condition. However, we also see a significant congruency by condition interaction. As a reminder, this interaction is the precondition of the central ego depletion prediction. ## Follow-Up Analysis and Plots Let us first look at the main effects as for the ANOVA model. For this, we will always use the model with `all_fit = TRUE`, `e1_mixed1_v2_allfit`. For easier interpretability, we also always set `type = "response"` in the call to `emmeans`. This provides estimated marginal means on the response scale (i.e., in probability units after applying the inverse link function). In case of the default (i.e., `type = "link"`) marginal mean are given on the linear scale which in this case is the logit scale. ```{r, eval=FALSE} emmeans(e1_mixed1_v2_allfit, "congruency", type = "response") ``` ```{r, echo=FALSE} message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_2a_cong_out$output, sep = "\n") ``` We again see the Stroop effect. Accuracy is higher for congruent compared to incongruent items. We also look at the effect of condition. ```{r, eval=FALSE} emmeans(e1_mixed1_v2_allfit, "condition", type = "response") ``` ```{r, echo=FALSE} message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_2a_cond_out$output, sep = "\n") ``` We see that accuracy is roughly 1% lower in the ego-depletion compared to the control condition. We can also plot both effects as above. We essentially only have to replace the model name in the calls to `afex_plot`. However, we also remove the `error = "within"` to show model-based error bars. ```{r, eval=FALSE} plot_grid( afex_plot(e1_mixed1_v2_allfit, "congruency", data_geom = geom_quasirandom, data_alpha = 0.3) + coord_cartesian(ylim = c(0.25, 1)), afex_plot(e1_mixed1_v2_allfit, "condition", data_geom = geom_quasirandom, data_alpha = 0.3) + coord_cartesian(ylim = c(0.25, 1)) ) ``` ```{r, echo=FALSE, fig.width=6, fig.height=3} message("Aggregating data over: pno") message("NOTE: Results may be misleading due to involvement in interactions") message("Aggregating data over: pno") message("NOTE: Results may be misleading due to involvement in interactions") plot_grid(pp2a_main_a, pp2a_main_b) ``` Finally, we can also have a look at the interaction. One way to do so is by looking at the reference grid of the two variables. ```{r, eval=FALSE} emmeans(e1_mixed1_v2_allfit, c("congruency", "condition"), type = "response") ``` ```{r, echo=FALSE} cat(emm_2a_inter1_out$output, sep = "\n") ``` Alternatively, we can look at the effect of `congruency` conditional on `condition`. As will be shown below, this has some benefits. And because we will use this `emmeans` object later, we assign it to `emm_inter_1`. ```{r, eval=FALSE} emm_inter_1 <- emmeans(e1_mixed1_v2_allfit, "congruency", by = "condition", type = "response") emm_inter_1 ``` ```{r, echo=FALSE} cat(emm_2a_inter2_out$output, sep = "\n") ``` With this object, it is now particularly easy to see if there are indeed differences in the Stroop effects across conditions. We can simply use the `pairs` function which will only calculate pairwise comparisons for each level of the `by` factor `conditions. Because of the significant interaction this shows that there is evidence for a reduced Stroop effect in the deplete condition. The odds ratio are around 5 in the deplete condition and over 6 in the control condition. ```{r, eval=FALSE} pairs(emm_inter_1) ``` ```{r, echo=FALSE} cat(emm_2a_pairs$output, sep = "\n") ``` We can of course also plot the interaction. We use violin plots for the data to make this plot somewhat appealing. ```{r, eval=FALSE} afex_plot(e1_mixed1_v2_allfit, "condition", "congruency", data_geom = geom_violin) ``` ```{r, echo=FALSE, fig.width=4.5, fig.height=3.5} message("Aggregating data over: pno") pp2a_inter ``` For reference, we can also make the plot based on the model using variant 1 (i.e., based on trial-wise non-aggregated data) which produces the same figure. ```{r, eval=FALSE} afex_plot(e1_mixed1_v1, "condition", "congruency", data_geom = geom_violin) ``` ```{r, echo=FALSE, fig.width=4.5, fig.height=3.5} message("Aggregating data over: pno") pp2a_inter_v1 ``` ```{r, eval=FALSE, include=FALSE} save(e1_mixed1_v1, e1_mixed1_v2, e1_mixed1_v2_allfit, e12_mixed1_t2, e12_mixed1, e12_mixed1_t2_red, file = "development/stroop_mixed.rda", compress = "xz") ## load("development/stroop_mixed.rda") ``` ```{r, eval=FALSE, include=FALSE} stroop_e1_agg <- stroop_e1 %>% group_by(condition, congruency, pno) %>% summarise(acc = mean(acc), n = n()) capture_call <- function(call) { warnings <- testthat::capture_warnings(eval(substitute(call))) output <- suppressWarnings(capture.output(eval(substitute(call)))) messages <- testthat::capture_messages(substitute(call)) list( output = output, warnings = warnings, messages = messages ) } outp_e1_mixed1_v1 <- capture_call(print(e1_mixed1_v1)) outp_e1_mixed1_v2 <- capture_call(print(e1_mixed1_v2)) outp_e1_mixed1_v2_allfit <- capture_call(print(e1_mixed1_v2_allfit)) emm_2a_cong <- emmeans(e1_mixed1_v2_allfit, "congruency", type = "response") emm_2a_cond <- emmeans(e1_mixed1_v2_allfit, "condition", type = "response") emm_2a_inter1 <- emmeans(e1_mixed1_v2_allfit, c("congruency", "condition"), type = "response") emm_2a_inter2 <- emmeans(e1_mixed1_v2_allfit, "congruency", by = "condition", type = "response") emm_2a_inter1_out <- capture_call(print(emm_2a_inter1)) emm_2a_inter2_out <- capture_call(print(emm_2a_inter2)) emm_2a_cong_out <- capture_call(print(emm_2a_cong)) emm_2a_cond_out <- capture_call(print(emm_2a_cond)) emm_inter_1 <- emmeans(e1_mixed1_v2_allfit, "congruency", by = "condition", type = "response") emm_2a_pairs <- capture_call(print(pairs(emm_inter_1))) # pp2a_main <- plot_grid( # afex_plot(e1_mixed1_v2_allfit, "congruency", error = "within", # data_geom = geom_quasirandom, data_alpha = 0.3) + # coord_cartesian(ylim = c(0.25, 1)), # afex_plot(e1_mixed1_v2_allfit, "condition", error = "within", # data_geom = geom_quasirandom, data_alpha = 0.3) + # coord_cartesian(ylim = c(0.25, 1)) # ) pp2a_main_a <- afex_plot(e1_mixed1_v2_allfit, "congruency", error = "within", data_geom = geom_quasirandom, data_alpha = 0.3) + coord_cartesian(ylim = c(0.25, 1)) pp2a_main_b <- afex_plot(e1_mixed1_v2_allfit, "condition", error = "within", data_geom = geom_quasirandom, data_alpha = 0.3) + coord_cartesian(ylim = c(0.25, 1)) pp2a_inter <- afex_plot(e1_mixed1_v2_allfit, "condition", "congruency", data_geom = geom_violin) pp2a_inter_v1 <- afex_plot(e1_mixed1_v1, "condition", "congruency", data_geom = geom_violin) ### experiments 1 and 2 outp_e12_mixed1 <- capture_call(print(e12_mixed1)) outp_e12_mixed1_t2 <- capture_call(print(e12_mixed1_t2)) outp_e12_mixed1_t2_red <- capture_call(print(e12_mixed1_t2_red)) emm_e12_inter_out <- capture_call(print(emmeans(e12_mixed1, c("congruency", "condition"), type = "response"))) emm_e12_t2_inter_out <- capture_call(print(emmeans(e12_mixed1_t2, c("congruency", "condition"), type = "response"))) emm_e12_t2_red_inter_out <- capture_call(print(emmeans(e12_mixed1_t2_red, c("congruency", "condition"), type = "response"))) emm_e12_t2_red_pairs_out <- capture_call(print(pairs( emmeans(e12_mixed1_t2_red, "congruency", by = "condition", type = "response")))) emm_e12_t2_pairs_out <- capture_call(print(pairs( emmeans(e12_mixed1_t2, "congruency", by = "condition", type = "response")))) emm_e12_t2_pairs_p_out <- capture_call(print(pairs(emmeans(e12_mixed1_t2, "congruency", by = "condition", type = "response", submodel = "minimal")))) pp_e12_inter_t3 <- afex_plot(e12_mixed1, "condition", "congruency", data_geom = geom_violin) pp_e12_inter_t2 <- afex_plot(e12_mixed1_t2, "condition", "congruency", data_geom = geom_violin) pp_e12_inter_t2_red <- afex_plot(e12_mixed1_t2_red, "condition", "congruency", data_geom = geom_violin) save(outp_e1_mixed1_v1, outp_e1_mixed1_v2, outp_e1_mixed1_v2_allfit, emm_2a_cong_out, emm_2a_cond_out, pp2a_main_a, pp2a_main_b, emm_2a_inter1_out, emm_2a_inter2_out, emm_2a_pairs, pp2a_inter, pp2a_inter_v1, outp_e12_mixed1, outp_e12_mixed1_t2, outp_e12_mixed1_t2_red, emm_e12_inter_out, emm_e12_t2_inter_out, emm_e12_t2_red_inter_out, emm_e12_t2_red_pairs_out, emm_e12_t2_pairs_out, emm_e12_t2_pairs_p_out, pp_e12_inter_t3, pp_e12_inter_t2, pp_e12_inter_t2_red, file = "inst/extdata/outputs_glmm_vignette.rda", compress = "xz") ``` # Analysis of Two Studies with GLMM The `stroop` data set contains all four experiments of Lin et al. (2020). So far we only looked at Experiment 1. Here, we want to look at Experiments 1 and 2 to show some additional functionality of analysing accuracy data with GLMMs. Let us begin by preparing the data. ```{r} ## extract data from experiment 1 and remove NAs stroop_e12 <- stroop %>% filter(!is.na(acc)) %>% filter(study %in% c("1", "2")) %>% droplevels() ``` We then have a look at the number of participants per experiment. As can be seen below, there is a clear imbalance with Experiment 1 having a lot more participants than Experiment 2. We will see below what we can do with this information. ```{r} stroop_e12 %>% group_by(study) %>% summarise(n = length(unique(pno))) ``` But first, we aggregate the data for analysing it using the second variant introduced above as it is dramatically faster. ```{r} stroop_e12_agg <- stroop_e12 %>% group_by(study, condition, congruency, pno) %>% summarise(acc = mean(acc), n = n()) ``` We are now ready to fit the model. However, because we now have to fit 8 models in total and we also have more data at hand, fitting will take quite a bit longer even when using the aggregated data. Especially, because based on our experience with the data from Experiment 1, it makes sense to set `all_fit = TRUE` here. ## Estimating Models in Parallel Therefore, it makes sense to reduce our fitting time by distributing the estimation across the available CPU cores using the `parallel` package support provided by `mixed`. Note that this simply distributes the different models across cores (i.e., each individual fit is still run on a single core). For this, we need to set up a cluster, `cl`, and then pass this cluster to `mixed`. ```{r, eval = FALSE} library("parallel") nc <- detectCores() # number of cores cl <- makeCluster(rep("localhost", nc)) # make cluster ``` We can then fit the model using the new data in a similar manner as above. The main changes are that we add `*study` to the fixed effects part of the model formula which estimates main effects and all interactions with `study`. We do not estimate any random slopes for `study` because participants are in only one study (i.e., study is a between-subjects factor). We also enable multi-core estimation by setting `cl = cl`. ```{r, eval = FALSE} e12_mixed1 <- mixed( acc ~ congruency*condition*study + (congruency*condition|pno), data = stroop_e12_agg, method = "LRT", family = binomial, weight = n, all_fit = TRUE, cl = cl ) ``` ## Type III versus Type II Sums of Squares The default `type` argument when using `mixed` (and the other `afex` functions) is `3` which estimates so-called type III sums of squares tests of model terms. There is a somewhat heated discussion on these topics in the literature which I do not want to rehash here (more can be found in [our chapter](http://singmann.org/download/publications/singmann_kellen-introduction-mixed-models.pdf)). In short, the distinction between Type III (default in `afex`) and Type II (recommended by some vocal statisticians) is about how to deal with imbalance (i.e., different group sizes). Type III sums of squares assume that the imbalance is random and estimates a model in which all groups are assumed to have equal sizes. In contrast, using Type II sums of squares the differences in group sizes are assumed to be meaningful (e.g., as a consequence of different group sizes in the environment) and the model is set-up such that the differences in group sizes are represented. Remember that the first experiment (study 1) had a lot more participants than the second experiment (study 2). However, the default Type III tests treat both studies as having the same sample size. In this case it might therefore make sense to also look at the results with Type II tests. For this, we simply need to add `type = 2` (or equivalently `type = "II"`) to the call as shown below. ```{r, eval = FALSE} e12_mixed1_t2 <- mixed( acc ~ congruency*condition*study + (congruency*condition|pno), data = stroop_e12_agg, method = "LRT", family = binomial, weight = n, all_fit = TRUE, cl = cl, type = 2 ) ``` Fitting both models shows a number of warnings similar to the previous model which we do not reproduce here. Let us instead take a look at the results. We begin with the Type III model. ```{r, eval=FALSE} e12_mixed1 ``` ```{r, echo=FALSE} cat(outp_e12_mixed1$output, sep = "\n") ``` The results are now more in line with the results from the ANOVA analysis. We only see significant main effects of congruency and condition, but no congruency by condition interaction. Furthermore, no effect involving study is significant. Let us now take a look at the Type II results. ```{r, eval=FALSE} e12_mixed1_t2 ``` ```{r, echo=FALSE} cat(outp_e12_mixed1_t2$output, sep = "\n") ``` These look quite similar with one difference. The congruency by condition interaction is still not significant, however, the p-value is below .1. Taken together the results somewhat suggest that the congruency by condition interaction is a pattern mainly found in (the larger) Experiment 1, but not in Experiment 2. In the Type III analysis in which both studies are weighed equally the interaction therefore does not reach significance. In contrast, in the Type II analysis in which the additional participants of Experiment 1 have a larger influence on the interaction, the p-value drops and is nearer the .05 cut-off. However, the difference in the interaction between the experiments is also not too large as the three way interaction of congruency by condition by study is clearly not significant (and as the highest order effect, this effect has to be the same for both types of sums of squares). ## Follow-Up Tests for Type II Models We can now of course also plot the data. Let us plot the congruency by condition interaction as before. We begin with the plot of the Type III model. ```{r, eval=FALSE} afex_plot(e12_mixed1, "condition", "congruency", data_geom = geom_violin) ``` ```{r, echo=FALSE, fig.width=4.5, fig.height=3.5} message("Aggregating data over: pno") message("NOTE: Results may be misleading due to involvement in interactions") pp_e12_inter_t3 ``` We then plot the interaction of the Type II model. ```{r, eval=FALSE} afex_plot(e12_mixed1_t2, "condition", "congruency", data_geom = geom_violin) ``` ```{r, echo=FALSE, fig.width=4.5, fig.height=3.5} message("Aggregating data over: pno") message("emmeans are based on full model which includes all effects.") message("NOTE: Results may be misleading due to involvement in interactions") pp_e12_inter_t2 ``` Both look pretty much the same and actually are the same. The reason for this is also given as a message when producing the second plot. When using `mixed` Type II models, all follow-up tests (which includes plotting via `afex_plot`) are based on the full model. However, Type II model tests are not all based on the full model. Rather, for tests of lower-order effects higher order effects are not part of the comparison (i.e., tests of two-way interactions such as the congruency by condition interaction are compared against a reference model that only includes all two-way interactions and not the three-way interaction). We can also see this when comparing the corresponding `emmeans` for both models: ```{r, eval=FALSE} emmeans(e12_mixed1, c("congruency", "condition"), type = "response") ``` ```{r, echo=FALSE} message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_e12_inter_out$output, sep = "\n") ``` ```{r, eval=FALSE} emmeans(e12_mixed1_t2, c("congruency", "condition"), type = "response") ``` ```{r, echo=FALSE} message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_e12_t2_inter_out$output, sep = "\n") ``` We again see that they are identical. Thus, the Type II outputs do not actually reflect Type II tests. A more appropriate way to look at this two-way interaction would be to use a model that reflects the Type II tests; that is, a model without the three-way interaction. A variant of this model is part of the `e12_mixed1_t2` object. However, because of the way `afex::mixed` creates the set of tests, this model is parameterized in a different way so we cannot pass it to `emmeans` for tests. Therefore, we have to refit the model without the three-way interaction. We do so by changing the fixed effects part of the formula to `(congruency+condition+study)^2` which means all main effects and up to two-way interactions. ```{r, eval = FALSE} e12_mixed1_t2_red <- mixed( acc ~ (congruency+condition+study)^2 + (congruency*condition|pno), data = stroop_e12_agg, method = "LRT", family = binomial, weight = n, all_fit = TRUE, cl = cl, type = 2 ) ``` ```{r, eval=FALSE} e12_mixed1_t2_red ``` ```{r, echo=FALSE} cat(outp_e12_mixed1_t2_red$output, sep = "\n") ``` We first have a look at the resulting ANOVA table (note, we suppress the warnings again here). As expected, the Type II tests are the same as in `e12_mixed1_t2`, because they are based on the exact same models. We then take a look at the marginal means for the two-way interaction of congruency by condition. ```{r, eval=FALSE} emmeans(e12_mixed1_t2_red, c("congruency", "condition"), type = "response") ``` ```{r, echo=FALSE} message("emmeans are based on full model which includes all effects.") cat(emm_e12_t2_red_inter_out$output, sep = "\n") ``` We can see these are now a bit different from the previous one, but not by a lot. A better way to see the difference is to use the same approach as above and look at the estimated Stroop effects for each condition. For the correct Type II model these are given by the following call: ```{r, eval=FALSE} emmeans(e12_mixed1_t2_red, "congruency", by = "condition", type = "response") %>% pairs() ``` ```{r, echo=FALSE} message("emmeans are based on full model which includes all effects.") cat(emm_e12_t2_red_pairs_out$output, sep = "\n") ``` For the wrong Type II model these are given below: ```{r, eval=FALSE} emmeans(e12_mixed1_t2, "congruency", by = "condition", type = "response") %>% pairs() ``` ```{r, echo=FALSE} message("emmeans are based on full model which includes all effects.") message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_e12_t2_pairs_out$output, sep = "\n") ``` We can see that as expected the magnitude of the difference between the Stroop effects is smaller in `e12_mixed1_t2` (5.73 vs. 5.13) than in `e12_mixed1_t2_red` (5.81 vs. 5.06). One way to approximate the latter behaviour without actually refitting the model is by passing `submodel = "minimal"` (which in the present case is identical to `submodel = ~congruency*condition`, see also [the corresponding `emmeans` vignette](https://cran.r-project.org/package=emmeans/vignettes/xplanations.html#submodels)). This does not produce exact Type II marginal means as when actually refitting the model. But at least approximates those. ```{r, eval=FALSE} emmeans(e12_mixed1_t2, "congruency", by = "condition", type = "response", submodel = "minimal") %>% pairs() ``` ```{r, echo=FALSE} message("emmeans are based on full model which includes all effects.") message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_e12_t2_pairs_p_out$output, sep = "\n") ``` Finally, we can also use this model to plot the two-way interaction. ```{r, eval=FALSE} afex_plot(e12_mixed1_t2_red, "condition", "congruency", data_geom = geom_violin) ``` ```{r, echo=FALSE, fig.width=4.5, fig.height=3.5} message("Aggregating data over: pno") message("emmeans are based on full model which includes all effects.") pp_e12_inter_t2_red ``` # References - Barr, D. J., Levy, R., Scheepers, C., & Tily, H. J. (2013). Random effects structure for confirmatory hypothesis testing: Keep it maximal. *Journal of Memory and Language*, 68(3), 255–278. https://doi.org/10.1016/j.jml.2012.11.001 - Lin, H., Saunders, B., Friese, M., Evans, N. J., & Inzlicht, M. (2020). Strong Effort Manipulations Reduce Response Caution: A Preregistered Reinvention of the Ego-Depletion Paradigm. *Psychological Science*. https://doi.org/10.1177/0956797620904990 - Singmann, H., & Kellen, D. (2019). An Introduction to Mixed Models for Experimental Psychology. In D. H. Spieler & E. Schumacher (Eds.), *New Methods in Cognitive Psychology* (pp. 4–31). Psychology Press. ```{r, include=FALSE} options(op) ``` afex/vignettes/introduction-mixed-models.pdf.asis0000644000176200001440000000030513664111747021754 0ustar liggesusers%\VignetteIndexEntry{An Introduction to Mixed Models for Experimental Psychology} %\VignetteEngine{R.rsp::asis} %\VignetteKeyword{PDF} %\VignetteKeyword{vignette} %\VignetteKeyword{package} afex/vignettes/afex_plot_introduction.Rmd0000644000176200001440000006764214076011252020450 0ustar liggesusers--- title: "afex_plot: Publication Ready Plots for Experimental Designs" author: "Henrik Singmann" date: "`r Sys.Date()`" show_toc: true output: knitr:::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{afex_plot: Publication Ready Plots for Experimental Designs} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r echo=FALSE} req_suggested_packages <- c("emmeans", "ggplot2", "cowplot", "ggbeeswarm", "ggpol") pcheck <- lapply(req_suggested_packages, requireNamespace, quietly = TRUE) if (any(!unlist(pcheck))) { message("Required package(s) for this vignette are not available/installed and code will not be executed.") knitr::opts_chunk$set(eval = FALSE) } ``` ```{r set-options, echo=FALSE, cache=FALSE} op <- options(width = 90) knitr::opts_chunk$set(dpi=72) ``` `afex_plot()` visualizes results from factorial experiments combining estimated marginal means and uncertainties associated with the estimated means in the foreground with a depiction of the raw data in the background. Currently, `afex_plots()` supports the following models: - ANOVAs estimated with `aov_car()`, `aov_ez()`, or `aov_4()` (i.e., objects of class `"afex_aov"`) - Linear mixed models estimated with `mixed()` (i.e., objects of class `"mixed"`) - Linear mixed models estimated with `lme4::lmer` (i.e., objects of class `"merMod"`) - Models with `emmeans` support. For some examples see `vignette("afex_plot_supported_models", package = "afex")` This document provides an overview of the plots possible with `afex_plot()`. It does so mostly using the `afex_plot()` examples, see `?afex_plot`. We begin by loading `afex` and [`ggplot2`](https://ggplot2.tidyverse.org/) which is the package `afex_plot()` uses for plotting. Loading `ggplot2` explicitly is not strictly necessary, but makes the following code nicer. Otherwise, we would need to prepend each call to a function from `ggplot2` needed for customization with `ggplot2::` (as is done in the examples in `?afex_plot`). We also load the [`cowplot`](https://cran.r-project.org/package=cowplot) package ([introduction](https://cran.r-project.org/package=cowplot/vignettes/introduction.html)) which makes combining plots (with functions `plot_grid()` and `legend()`) very easy. However, loading `cowplot` sets a different theme for `ggplot2` plots than the default grey one. Although I am not a big fan of the default theme with its grey background, we reset the theme globally using `theme_set(theme_grey())` to start with the default behavior if `cowplot` it not attached. Note that `cowplot` also has the cool `draw_plot()` function which allows embedding plots within other plots. We furthermore will need the following packages, however, we will not attach them directly, but only call a few selected functions using the `package::function` notation. - [`jtools`](https://cran.r-project.org/package=jtools) for `theme_apa()` - [`ggpubr`](https://cran.r-project.org/package=jtools) for `theme_pubr()` - [`ggbeeswarm`](https://cran.r-project.org/package=ggbeeswarm) for producing bee swarm plots with `geom_beeswarm` - [`ggpol`](https://cran.r-project.org/package=ggpol) for producing combined box plots and jitter plots using `geom_boxjitter()` ```{r message=FALSE, warning=FALSE} library("afex") library("ggplot2") library("cowplot") theme_set(theme_grey()) ``` # Two-Way Within-Subjects ANOVA We begin with a two-way within-subjects ANOVA using synthetic data from Maxwell and Delaney (2004, p. 547). The data are hypothetical reaction times from a 2 x 3 Perceptual Experiment with factors `angle` with 3 levels and factor `noise` with 2 levels (see `?md_12.1` for a longer description). We first load the data and then fit the corresponding ANOVA. ```{r} data(md_12.1) (aw <- aov_ez("id", "rt", md_12.1, within = c("angle", "noise"))) ``` The ANOVA shows that both, the two main effect as well as the interaction, are significant. We therefore inspect the pattern underlying the interaction. There exist two different ways of plotting a 2-way interaction. Either of the two variables can be depicted on the x-axis. And before having looked at both cases, it is often not clear which visualization of the interaction is more instructive. Consequently, we plot both next to each other. For this we simply need to exchange which variable is the `x` factor and which is the `trace` factor. We then use `plot_grid()` to plot them next to each other. ## Basic Plot ```{r fig.width=9, fig.height=4} p_an <- afex_plot(aw, x = "angle", trace = "noise") p_na <- afex_plot(aw, x = "noise", trace = "angle") plot_grid(p_an, p_na) ## try adding: labels = "AUTO" ``` Before we can even take a look at the plot, we notice that creating the plots has produced two warnings. These warnings complain that the plots depict within-subject factors, but do not use within-subject error bars. However, the warnings also tell us the solution (i.e., adding `error = "within"`), which we will do in the following. The help page `?afex_plot` contains more information on which type of error bars are appropriate in which situation and how to interpret different type of error bars. For ANOVAs, `afex_plot()` will emit warnings if it thinks the error bars are not appropriate for the chosen factors. Comparing both plots, my impression is that the plot with `angle` on the `x`-axis tells the clearer story. We can see that when `noise` is `absent` there is hardly any effect of the increase of `angle`. However, if `noise` is `present` an increasing `angle` clearly leads to increased RTs. We therefore use this plot in the following. ## Exploring Graphical Options and Themes We now produce a new variant of the left plot using more appropriate error bars and change several other graphical details which make the plot publication ready. We use the `factor_levels` argument to `afex_plot()` for renaming the factor levels (for technical reasons the ANOVA functions in `afex` transform all factor levels to proper `R` variable names using `make.names()` which changed the labels from e.g., `4` to `X4`) and the `legend_title` argument for changing the title of the legend. We also change the labels on the `x` and `y` axis. ```{r} p_an <- afex_plot(aw, x = "angle", trace = "noise", error = "within", factor_levels = list(angle = c("0°", "4°", "8°"), noise = c("Absent", "Present")), legend_title = "Noise") + labs(y = "RTs (in ms)", x = "Angle (in degrees)") ``` As the additional output shows, changing the factor levels via `factor_levels` emits a `message` detailing old and new factor levels in the form `old -> new`. This message can be suppressed by wrapping the `afex_plot()` call into a `suppressMessages()` call or via `RMarkdown` settings. Note that we could have also used the `factor_levels` argument for changing the order of the factor levels by passing a named character vector (e.g., `factor_levels = list(angle = c(X8 = "8°", X4 = "4°", X0 = "0°"))`). This would change the order either on the x-axis or in the legend. As said above, I am not a big fan of the default grey theme of `ggplot2` plots. Consequently, we compare a number of different themes for this plot in the following. For all but `ggpubr::theme_pubr()`, we also move the legend to the bottom as this better allows the plot to cover only a single column in a two-column layout. `ggpubr::theme_pubr()` automatically plots the legend on top. ```{r fig.width=8.5, fig.height=6, dpi = 150} plot_grid( p_an + theme_bw() + theme(legend.position="bottom"), p_an + theme_light() + theme(legend.position="bottom"), p_an + theme_minimal() + theme(legend.position="bottom"), p_an + jtools::theme_nice() + theme(legend.position="bottom"), p_an + ggpubr::theme_pubr(), p_an + theme_cowplot() + theme(legend.position="bottom"), labels = "AUTO" ) ``` The first row, panels A to C, shows themes coming with `ggplot2` and the second row, panels D to F, shows themes from additional packages. In my opinion all of these plots are an improvement above the default grey theme. For the themes coming with `ggplot2`, I really like that those shown here have a reference grid in the background. This often makes it easier to judge the actual values the shown data points have. I know that many people find this distracting, so many of the contributed themes do not have this grid. One thing I really like about the last two themes is that they per default use larger font sizes for the axes labels. One way to achieve something similar for most themes is to change `base_size`. One general criticism I have with the current plots is that they show too many values on the y-axis. In the following I plot one more variant of this plot in which we change this to three values on the y-axis. We also increase the axes labels and remove the vertical grid lines. ```{r fig.width=3.5, fig.height=3, dpi = 100, out.width='50%'} p_an + scale_y_continuous(breaks=seq(400, 900, length.out = 3)) + theme_bw(base_size = 15) + theme(legend.position="bottom", panel.grid.major.x = element_blank()) ``` We can also set this theme for the reminder of the `R` session with `theme_set()`. ```{r} theme_set(theme_bw(base_size = 15) + theme(legend.position="bottom", panel.grid.major.x = element_blank())) ``` ## Saving Plots and Plot Sizes To get our plot into a publication, we need to export it as a graphics file. I would generally advise against exporting plots via the `RStudio` interface as this is not reproducible. Instead I would use some of the following functions which save the document in the current working directory. Note that following [Elsevier guidelines](https://www.elsevier.com/authors/policies-and-guidelines/artwork-and-media-instructions/artwork-sizing), a single column figure should have a width of 9 cm (~ 3 inch) and a two column figure should have a width of 19 cm (~ 7.5 inch). For Word or similar documents I would export the plot as a `png` (never `jpg`): ```{r, eval=FALSE} ggsave("my_plot.png", device = "png", width = 9, height = 8, units = "cm", dpi = 600) ## the larger the dpi, the better the resolution ``` For `LaTeX` I would export as `pdf`: ```{r, eval=FALSE} ggsave("my_plot.pdf", device = "pdf", width = 9, height = 8, units = "cm") ``` ## Data in the Background `afex_plot()` per default plots the raw data in the background. It does so using an [alpha blending](https://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending) of `0.5`. Thus, overlapping points appear darker. Examples of this can be seen in the previous graphs where some data points in the background appear clearly darker than others. The darker points indicate values for which several data points lie exactly on top of each other. `afex_plot()` provides the possibility to change or alter the graphical primitive, called `geom` in `ggplot2` parlance, used for plotting the points in the background. This offers a vast array of options for handling overlapping points or, more generally, how to display the raw data in the background. I show some of these examples in the following. The first two variants display only points, whereas the remaining ones use different visualizations of the raw data. Note that depending on the specific variant we change a few further plot options to obtain a visually pleasing result. For example, the `dodge` argument controls the spread of points belonging to different levels of the `trace` factor at each x-axis position. 1. Add jitter on the y-axis to points which avoids perfect overlap. 3. Size of points show number of data points at a given y-axis position: `geom_count`. For this geom, adding a call to `scale_size_area()` can sometimes be beneficial. 3. Violin plot: `geom_violin` 4. Box plot: `geom_boxplot`. Note that for this plot we have added `linetype = 1` to `data_arg`, which avoids that the outline of the box plots is affected by the linetype mapping (this is in contrast with the violin plot). 2. Display points using a bee swarm plot, which displaces overlapping points on the x-axis: `ggbeeswarm::geom_beeswarm` 2. Display points using a variant of the bee swarm plot that even works in case of many data points: `ggbeeswarm::geom_quasirandom` 5. Combine box plot with jittered points: `ggpol::geom_boxjitter` ```{r fig.width=8.5, fig.height=16, dpi = 125} p1 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.3, data_arg = list( position = ggplot2::position_jitterdodge( jitter.width = 0, jitter.height = 10, dodge.width = 0.3 ## needs to be same as dodge ), color = "darkgrey")) p2 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.5, data_geom = geom_count) p3 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", data_geom = geom_violin, data_arg = list(width = 0.5)) p4 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", data_geom = geom_boxplot, data_arg = list(width = 0.3, linetype = 1)) p5 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.5, data_geom = ggbeeswarm::geom_beeswarm, data_arg = list( dodge.width = 0.5, ## needs to be same as dodge cex = 0.8, color = "darkgrey")) p6 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.5, data_geom = ggbeeswarm::geom_quasirandom, data_arg = list( dodge.width = 0.5, ## needs to be same as dodge color = "darkgrey")) p7 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.7, data_geom = ggpol::geom_boxjitter, data_arg = list( width = 0.5, jitter.params = list(width = 0, height = 10), outlier.intersect = TRUE), point_arg = list(size = 2.5), error_arg = list(size = 1.5, width = 0)) plot_grid(p1, p2, p3, p4, p5, p6, p7, ncol = 2, labels = 1:7) ``` ## Adding Color to Plots So far, all plots were shown in black and white only. However, it is easy to include color. We do so for plots 2 to 5 from above. To achieve this, we have to change the value of the `mapping` argument. ```{r fig.width=8.5, fig.height=8, dpi = 125} p2 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.5, mapping = c("shape", "color"), data_geom = ggbeeswarm::geom_beeswarm, data_arg = list( dodge.width = 0.5, ## needs to be same as dodge cex = 0.8)) p3 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", mapping = c("linetype", "shape", "fill"), data_geom = ggplot2::geom_violin, data_arg = list(width = 0.5)) p4 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", mapping = c("shape", "fill"), data_geom = ggplot2::geom_boxplot, data_arg = list(width = 0.3)) p5 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.7, mapping = c("shape", "fill"), data_geom = ggpol::geom_boxjitter, data_arg = list( width = 0.5, jitter.params = list(width = 0, height = 10), outlier.intersect = TRUE), point_arg = list(size = 2.5), line_arg = list(linetype = 0), error_arg = list(size = 1.5, width = 0)) plot_grid(p2, p3, p4, p5, ncol = 2, labels = 2:5) ``` ## Plotting Order and Error Bars For graphical element in the foreground, `afex_plot` first plots all graphical elements belonging to the same factor level before plotting graphical elements belonging to different factor levels. This provides a consistent graphical impression for each factor level that is particularly relevant in case color is mapped. In case we have overlapping lines and error bars or use thick lines, we sometimes do not want that the error bars also receives different line types. In this case, we can simply pass `linetype = 1` to `error_arg` to overwrite the corresponding mapping. This is shown in the right plot. ```{r fig.width=8.5, fig.height=4, dpi = 150} p1 <- afex_plot(aw, x = "noise", trace = "angle", mapping = "color", error = "within", point_arg = list(size = 5), line_arg = list(size = 2), error_arg = list(size = 2)) p2 <- afex_plot(aw, x = "noise", trace = "angle", mapping = c("color", "shape", "linetype"), error = "within", point_arg = list(size = 5), line_arg = list(size = 2), error_arg = list(size = 2, width = 0, linetype = 1)) plot_grid(p1, p2, ncol = 2) ``` ## One-way Plots Without Trace Factor If `afex_plot` is called without a trace factor, a one-way plot is created. We can customize this plot in very much the same way. Per default a one-way plot contains a legend if `mapping` is not empty (i.e., `""`). We show this legend for the left plot, but suppress it for the right one. ```{r fig.width=7, fig.height=3.5, message=FALSE} po1 <- afex_plot(aw, x = "angle", mapping = "color", error = "within", data_arg = list(), point_arg = list(size = 2.5), error_arg = list(size = 1.5, width = 0.05)) po2 <- afex_plot(aw, x = "angle", error = "within", data_geom = ggpol::geom_boxjitter, mapping = "fill", data_alpha = 0.7, data_arg = list( width = 0.6, jitter.params = list(width = 0.05, height = 10), outlier.intersect = TRUE ), point_arg = list(size = 2.5), error_arg = list(size = 1.5, width = 0.05)) + theme(legend.position="none") plot_grid(po1, po2) ``` One-way plots can also be split across different panels by specifying a `panel` factor: ```{r fig.width=7, fig.height=3.5, message=FALSE} afex_plot(aw, x = "angle", panel = "noise", error = "within", data_geom = ggpol::geom_boxjitter, mapping = "fill", data_alpha = 0.7, data_arg = list( width = 0.6, jitter.params = list(width = 0.05, height = 10), outlier.intersect = TRUE ), point_arg = list(size = 2.5), error_arg = list(size = 1.5, width = 0.05)) + theme(legend.position="none") ``` Sometimes we still want to add a line connecting the estimated marginal means. As `afex_plot` returns a `ggplot2` object, we can do this easily by adding a `geom_line()` object to the call. As we want to add a line through all of the shown points in the foreground, we need to add the corresponding groups aesthetics to this call: `geom_line(aes(group = 1))`. We can add further arguments to this call, as shown in the left panel below. ```{r fig.width=7, fig.height=3.5, message=FALSE} plot_grid( po1 + geom_line(aes(group = 1), color = "darkgrey", size = 1.5), po2 + geom_line(aes(group = 1)) ) ``` # 3-Way Mixed Model ## Data and Model ```{r, echo=FALSE} load(system.file("extdata/", "output_afex_plot_mixed_vignette.rda", package = "afex")) ``` To exemplify the support for linear mixed models, we will use the data from Freeman and colleagues also discussed in the [mixed model vignette](https://cran.r-project.org/package=afex/vignettes/afex_mixed_example.html). These data are lexical decision and word naming latencies for 300 words and 300 nonwords from 45 participants presented in Freeman et al. (2010). The dependent variable we are interested in is `log` RTs. We look at the same model also discussed in the vignette with factors `task` (between participants, but within items), `stimulus` (within participants, but between items), `density` (within participants, but between items), and `frequency` (within participants, but between items), for a total of almost 13,000 observations. We fit the model with crossed-random effects for participants (`id`) and `item`s using the final model, `m9s`, as discussed in the mixed model vignette. ```{r, eval=FALSE} data("fhch2010") # load fhch <- droplevels(fhch2010[ fhch2010$correct,]) # remove errors m9s <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus+frequency||id)+ (task|item), fhch, method = "S", control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ``` Note that going forward, we disable calculation of degrees of freedom for `emmeans` as this speeds up computation and/or avoids messages we are currently not interested in. ```{r} emmeans::emm_options(lmer.df = "asymptotic") ``` The ANOVA table of the mixed model indicates that the three-way interaction `task:stimulus:frequency` is significant on which we focus in the following. ```{r, eval=FALSE} m9s ``` ```{r, echo=FALSE} cat(aout_1$output, sep = "\n") ``` ## Which Data to Plot in the Background For mixed models, one important decision is the random-effects grouping factor(s) based on which the raw data plotted in the background is aggregated. This decision is necessary, because without such a factor, there would only be one observation for each cell of the design (unless the full design is considered). In the default setting, with `id` missing, the combination of all random-effects grouping factor is used. ```{r fig.width=7, fig.height=3.5, eval=FALSE} afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task") ``` ```{r fig.width=7, fig.height=3.5, echo=FALSE} message("Aggregating data over: item, id") message("NOTE: Results may be misleading due to involvement in interactions") ap1 ``` In the present case, a message informs us that the data is aggregated over both random-effects grouping factors. However, this leads to way too many data points in the background. Let us compare this plot with plots in which we use each of the two random-effects grouping factors in turn. ```{r fig.width=7, fig.height=3.5, eval=FALSE} plot_grid( afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", id = "id"), afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", id = "item"), labels = c("ID", "Item") ) ``` ```{r fig.width=7, fig.height=3.5, echo=FALSE} message("NOTE: Results may be misleading due to involvement in interactions") message("NOTE: Results may be misleading due to involvement in interactions") plot_grid( ap2a, ap2b, labels = c("ID", "Item") ) ``` The by-id plot looks usable. However, the by-item plot has still way too many data-points to be informative. Some other ways of displaying the raw data, such as violin plots or box plots, seems preferable for it. ## Ways of Plotting Data in the Background We compare violin plots or box plots for the by-item data in the next plot. For the box plot, we increase the width of the error bars and use a consistent line type to distinguish them more easily from the graphical elements of the box plot. We could probably further improve these plots by, for example, adding colors or using some of the other customizations discussed above for the ANOVA example. ```{r fig.width=7, fig.height=3.5, eval=FALSE} plot_grid( afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", id = "item", dodge = 0.8, data_geom = geom_violin, data_arg = list(width = 0.5)), afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", id = "item", dodge = 0.8, data_geom = geom_boxplot, data_arg = list(width = 0.5), error_arg = list(size = 1.5, width = 0, linetype = 1)) ) ``` ```{r fig.width=7, fig.height=3.5, echo=FALSE} message("NOTE: Results may be misleading due to involvement in interactions") message("NOTE: Results may be misleading due to involvement in interactions") plot_grid(ap3a, ap3b) ``` ## Error Bars for Mixed Models The default error bars for `afex_plot()` are based on the statistical model (i.e., the mixed model in the present case). These error bars can only be used to judge whether or not two means differ from each other, if the corresponding factor (or factors) are independent samples factors (i.e., not repeated-measures factors for any of the random-effects grouping factors). Of course, in addition to this the requirement of approximately equal sample size and variance also needs to hold. In the present case, all of the factors are repeated-measures factors with respect to one of the random-effects grouping factors. Consequently, the default error bars cannot be used for "inference by eye" for any of the factors. This is also easy to see when looking at all pairwise comparisons between means for each of the panels/tasks. This shows that for the `naming` task all comparisons are significant. In visual contrast with that, the two error bars for the `low` versus `high` `word`s are overlapping very strongly. ```{r, eval=FALSE} pairs(emmeans::emmeans(mrt, c("stimulus", "frequency"), by = "task")) ``` ```{r, echo=FALSE} cat(aout_2$output, sep = "\n") ``` An alternative in the present situation would be using within-subjects error bars and aggregating the data by-id (i.e., `error = "within"`), as done in the left panel below. This is somewhat appropriate here as the factors within each panel are all within-subject factors. In contrast, using by-item within-subjects error bars, as done in the right panel below, seems not appropriate as the only within-item factor, `task`, is spread across panels. Unfortunately, it is not immediately clear if these error bars allow one to correctly detect, which means do not differ from each other. ```{r fig.width=7, fig.height=3.5, eval=FALSE} plot_grid( afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", id = "id", error = "within"), afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", id = "item", dodge = 0.8, error = "within", data_geom = geom_violin, data_arg = list(width = 0.5)) ) ``` ```{r fig.width=7, fig.height=3.5, echo=FALSE} message("NOTE: Results may be misleading due to involvement in interactions") message("NOTE: Results may be misleading due to involvement in interactions") plot_grid(ap4a, ap4b) ``` In sum, using error bars for performing "inference by eye" - that is, using overlap or non-overlap of error bars to judge which means differ or do not differ from each other - is highly problematic for mixed models, due to the potentially complex dependency structures between the means. It would be best to avoid comparisons between means altogether. Instead, it is perhaps a good idea to plot the model-based error bars (which is the default) and use them for their intended purpose; judging which values of the estimated means are likely given what we have learned from the model (however, note that one cannot interpret a 95% confidence interval as having a 95% probability of containing the population mean). The help page `?afex_plot` contains further information and references on how to interpret confidence intervals and other error bars. # References * Freeman, E., Heathcote, A., Chalmers, K., & Hockley, W. (2010). Item effects in recognition memory for words. _Journal of Memory and Language_, 62(1), 1-18. https://doi.org/10.1016/j.jml.2009.09.004 * Maxwell, S. E., & Delaney, H. D. (2004). _Designing Experiments and Analyzing Data: A Model-Comparisons Perspective._ Mahwah, N.J.: Lawrence Erlbaum Associates. ```{r, include=FALSE} options(op) ``` afex/vignettes/afex_plot_supported_models.Rmd0000644000176200001440000004456114076011252021312 0ustar liggesusers--- title: "afex_plot: Supported Models" author: "Henrik Singmann" date: "`r Sys.Date()`" show_toc: true output: knitr:::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{afex_plot: Supported Models} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, echo=FALSE} req_suggested_packages <- c("emmeans", "ggplot2", "cowplot", "ggbeeswarm", "ggpol", "nlme", "glmmTMB", "rstanarm", "brms", "MEMSS") pcheck <- lapply(req_suggested_packages, requireNamespace, quietly = TRUE) if (any(!unlist(pcheck))) { message("Required package(s) for this vignette are not available/installed and code will not be executed.") knitr::opts_chunk$set(eval = FALSE) } ``` ```{r set-options, echo=FALSE, cache=FALSE} options(width = 90) knitr::opts_chunk$set(dpi=72) knitr::knit_hooks$set(document = function(x){ gsub("```\n*```r*\n*", "", x) }) ``` # Introduction `afex_plot()` visualizes results from factorial experiments and, more generally, data set with interactions of categorical/factor variables. It does so by combining estimated marginal means and uncertainties associated with these means in the foreground with a depiction of the raw data in the background. If models include continuous covariates, other approaches are recommended (e.g., such as implemented in package [`effects`](https://cran.r-project.org/package=effects) or by using the possibility of `afex_plot` [to return the data and build the plot on ones own](https://github.com/singmann/afex/issues/65)). This document provides an overview of the different models supported by `afex_plot()` in addition to the `afex` objects (i.e., `afex_aov` and `mixed`). In general, these are models which are supported by the [`emmeans`](https://cran.r-project.org/package=emmeans) package as the `afex_plot.default()` method uses `emmeans` to get the estimated marginal means. `afex_plot.default()` then guesses whether there are repeated measures or all samples are independent. Based on this guess (which can be changed via the `id` argument) data in the background is plotted. Calculation of error bars can also be based on this guess (but the default is to plot the model based error bars obtained from `emmeans`). For a generally introduction to the functionality of `afex_plot` see: [`afex_plot`: Publication Ready Plots for Experimental Designs](afex_plot_introduction.html) Throughout the document, we will need `afex` as well as `ggplot2`. In addition, we load [`cowplot`](https://cran.r-project.org/package=cowplot) for function `plot_grid()` (which allows to easily combine multiple `ggplot2` plots). In addition, we will set a somewhat nicer `ggplot2` theme. ```{r message=FALSE, warning=FALSE} library("afex") library("ggplot2") library("cowplot") theme_set(theme_bw(base_size = 14) + theme(legend.position="bottom", panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank())) ``` Importantly, we also set the contrasts for the current `R` session to sum-to-zero contrasts. For models that include interactions with categorical variables this generally produces estimates that are easier to interpret. ```{r} set_sum_contrasts() ``` Please note, the best way to export a figure is via `ggsave()` or a similar function call. For Word and similar document formats, `png` is a good file type, for `LaTeX` and similar document formats, `pdf` is a good file type. # Base R stats models: lm, glm `afex_plot()` generally supports models implemeneted via the `stats` package. Here I show the main model functions that work with independent samples. These models can be passed to `afex_plot` without specifying additional arguments. Most importantly, `lm` models work directly. For those we use the `warpbreaks` data. ```{r} warp.lm <- lm(breaks ~ wool * tension, data = warpbreaks) ``` Note that `afex_plot` produces several messages that are shown here as comments below the corresponding calls. Important is maybe that `afex_plot` assumes all observations (i.e., rows) are independent. This is of course the case here. In addition, for the first plot we are informed that the presence of an interaction may lead to a misleading impression if only a lower-order effect (here a main effect) is shown. This message is produced by `emmeans` and passed through. ```{r fig.width=7, fig.height=3} p1 <- afex_plot(warp.lm, "tension") p2 <- afex_plot(warp.lm, "tension", "wool") plot_grid(p1, p2) ``` `glm` models also work without further setting. Here we first use a poisson GLM for which we need to generate the data. ```{r} ins <- data.frame( n = c(500, 1200, 100, 400, 500, 300), size = factor(rep(1:3,2), labels = c("S","M","L")), age = factor(rep(1:2, each = 3)), claims = c(42, 37, 1, 101, 73, 14)) ``` We can then fit the data and pass the model object as is. ```{r fig.width=3, fig.height=3} ins.glm <- glm(claims ~ size + age + offset(log(n)), data = ins, family = "poisson") afex_plot(ins.glm, "size", "age") ``` `afex_plot` also works with binomial GLMs for which we also first need to generate some data which we will then fit. ```{r} ## binomial glm adapted from ?predict.glm ldose <- factor(rep(0:5, 2)) numdead <- c(1, 4, 9, 13, 18, 20, 0, 2, 6, 10, 12, 16) sex <- factor(rep(c("M", "F"), c(6, 6))) SF <- numdead/20 ## dv should be a vector, no matrix budworm.lg <- glm(SF ~ sex*ldose, family = binomial, weights = rep(20, length(numdead))) ``` For this model, we will produce three plots we can then compare. The first only shows the main effect of one variable (`ldose`). The other show the interaction of the two variables. Because for binomial GLMs we then only have one data point (with several observations), the individual data points and mean cannot be distinguished. This is made clear in the ther two (panels B and C). ```{r fig.width=8, fig.height=3} a <- afex_plot(budworm.lg, "ldose") b <- afex_plot(budworm.lg, "ldose", "sex") ## data point is hidden behind mean! c <- afex_plot(budworm.lg, "ldose", "sex", data_arg = list(size = 4, color = "red")) plot_grid(a, b, c, labels = "AUTO", nrow = 1) ``` # nlme mixed model Hot to use `afex_plot` for mixed models fitted with `afex::mixed` (or [`lme4`](https://cran.r-project.org/package=lme4) directly) is shown in the [other vignette](afex_plot_introduction.html). However, we can also use `afex_plot` for mixed models fitted with the older `nlme` package. For this, however we need to pass the data used for fitting via the `data` argument. We can change on which of the two nested factors the individual data points in the background are based via the `id` argument. This is shown below. ```{r fig.width=8, fig.height=6} ## nlme mixed model data(Oats, package = "nlme") Oats$nitro <- factor(Oats$nitro) oats.1 <- nlme::lme(yield ~ nitro * Variety, random = ~ 1 | Block / Variety, data = Oats) plot_grid( afex_plot(oats.1, "nitro", "Variety", data = Oats), # A afex_plot(oats.1, "nitro", "Variety", data = Oats), # B afex_plot(oats.1, "nitro", "Variety", data = Oats, id = "Block"), # C afex_plot(oats.1, "nitro", data = Oats), # D afex_plot(oats.1, "nitro", data = Oats, id = c("Block", "Variety")), # E afex_plot(oats.1, "nitro", data = Oats, id = "Block"), # F labels = "AUTO" ) ``` # glmmTMB Support for [`glmmTMB`](https://cran.r-project.org/package=glmmTMB) is also provided. Here we use an example data set for which we model zero-inflation as well as overdispersion. The latter is achieved with a variant of the negative binomial distribution. ```{r, eval=FALSE} library("glmmTMB") tmb <- glmmTMB(count~spp * mined + (1|site), ziformula = ~spp * mined, family=nbinom2, Salamanders) ``` ```{r, eval=FALSE, include=FALSE} library("glmmTMB") set_sum_contrasts() tmb <- glmmTMB(count~spp * mined + (1|site), ziformula = ~spp * mined, family=nbinom2, Salamanders) save(tmb, file = "inst/extdata/tmb_example_fit.rda", compress = "xz") ``` ```{r, echo=FALSE, include=FALSE} library("glmmTMB") data(Salamanders, package = "glmmTMB") load(system.file("extdata/", "tmb_example_fit.rda", package = "afex")) ``` `afex_plot` does not automatically detect the random-effect for `site`. This means that per default all 644 data points are shown. When plotting only one variable, in which the default `data_geom` is `ggbeeswarm::geom_beeswarm`, this can lead to rather ugly plots due to the zero inflation. This is shon in panel A below. In panel B, we address this by changing the geom to a violin plot. In panel C, we address this by aggregating the data within site, but still use the beeswarm plot. Note that for panel C it is necessary to pass the data via the `data` argument as otherwise `site` cannot be found for aggregation. ```{r fig.width=8, fig.height=3} plot_grid( afex_plot(tmb, "spp"), afex_plot(tmb, "spp", data_geom = geom_violin), afex_plot(tmb, "spp", id = "site", data = Salamanders), labels = "AUTO", nrow = 1 ) ``` When plotting both variables, the problem is somewhat hidden, because instead of beeswarm plots, semi-transparency (i.e., `alpha` < 1) is used to show overlapping points. In panel B we again make this clearer but this time by adding jitter (on both the y- and x-axis) and increasing the degree of semi-transparancy (i.e., decreasing alpha). ```{r fig.width=8.5, fig.height=3.5} a <- afex_plot(tmb, "spp", "mined") b <- afex_plot(tmb, "spp", "mined", data_alpha = 0.3, data_arg = list( position = ggplot2::position_jitterdodge( jitter.width = 0.2, jitter.height = 0.5, dodge.width = 0.5 ## needs to be same as dodge ), color = "darkgrey")) plot_grid(a, b, labels = "AUTO") ``` For the final plot we also plot the interaction, but this time aggregate the individual-data within site. This allows us again to use a beeswarm plot (after decreasing the width of the "bees") and produces a relatively clear result. ```{r fig.width=5.5, fig.height=3.5} afex_plot(tmb, "spp", "mined", id = "site", data = Salamanders, data_geom = ggbeeswarm::geom_beeswarm, data_arg = list(dodge.width = 0.5, cex = 0.4, color = "darkgrey") ) ``` # rstanarm `afex_plot()` also supports Bayesian models that are also supported via `emmeans`. For example, we can easily fit a binomial model with [`rstanarm`](https://cran.r-project.org/package=rstanarm). ```{r, eval=FALSE} library("rstanarm") ## requires resetting the ggplot2 theme theme_set(theme_bw(base_size = 14) + theme(legend.position="bottom", panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank())) cbpp <- lme4::cbpp cbpp$prob <- with(cbpp, incidence / size) example_model <- stan_glmer(prob ~ period + (1|herd), data = cbpp, family = binomial, weight = size, chains = 2, cores = 1, seed = 12345, iter = 500) ``` We can directly pass this model to `afex_plot`. However, we also see quite some zeros leading to a not super nice plot. It looks a bit better using a violin plot for the raw data. ```{r, eval=FALSE} b1 <- afex_plot(example_model, "period") ## dv column detected: prob ## No id column passed. Assuming all rows are independent samples. b2 <- afex_plot(example_model, "period", data_geom = geom_violin) ## dv column detected: prob ## No id column passed. Assuming all rows are independent samples. plot_grid(b1, b2, labels = "AUTO") ``` ```{r fig.width=7, fig.height=3, echo=FALSE} load(system.file("extdata/", "plots_rstanarm.rda", package = "afex")) plot_grid(b1, b2, labels = "AUTO") ``` We can also produce a plot based on the individual Bernoulli observations in the data. For this, we first need to expand the data such that we have one row per observation. With this, we can then fit the essentially same model as above. ```{r, eval=FALSE} cbpp_l <- vector("list", nrow(cbpp)) for (i in seq_along(cbpp_l)) { cbpp_l[[i]] <- data.frame( herd = cbpp$herd[i], period = cbpp$period[i], incidence = rep(0, cbpp$size[i]) ) cbpp_l[[i]]$incidence[seq_len(cbpp$incidence[i])] <- 1 } cbpp_l <- do.call("rbind", cbpp_l) cbpp_l$herd <- factor(cbpp_l$herd, levels = levels(cbpp$herd)) cbpp_l$period <- factor(cbpp_l$period, levels = levels(cbpp$period)) example_model2 <- stan_glmer(incidence ~ period + (1|herd), data = cbpp_l, family = binomial, chains = 2, cores = 1, seed = 12345, iter = 500) ``` Again, this model can be directly passed to `afex_plot`. However, here we see even more 0 as the data is not yet aggregated. Consequently, we need to pass `id = "herd"` to aggregate the individual observations within each herd. ```{r, eval=FALSE} b3 <- afex_plot(example_model2, "period") ## dv column detected: incidence ## No id column passed. Assuming all rows are independent samples. b4 <- afex_plot(example_model2, "period", id = "herd") ## dv column detected: incidence plot_grid(b3, b4, labels = "AUTO") ``` ```{r fig.width=7, fig.height=3, echo=FALSE} plot_grid(b3, b4, labels = "AUTO") ``` We can of course also fit a model assuming a normal distribution using `rstanarm`. For example using the `Machines` data. ```{r, eval=FALSE} data("Machines", package = "MEMSS") mm <- stan_lmer(score ~ Machine + (Machine|Worker), data=Machines, chains = 2, cores = 1, seed = 12345, iter = 500) ``` As before, we can pass this model directly to `afex_plot` (see panel A). However, the data is again not aggregated within the grouping variable `Worker`. If we want to aggregate the individual data points for the grouping factor, we need to pass both the name of the grouping variable (`Worker`) and the data used for fitting. ```{r, eval=FALSE} b5 <- afex_plot(mm, "Machine") ## dv column detected: score ## No id column passed. Assuming all rows are independent samples. b6 <- afex_plot(mm, "Machine", id = "Worker") ## dv column detected: score plot_grid(b5, b6, labels = "AUTO") ``` ```{r fig.width=7, fig.height=3, echo=FALSE} plot_grid(b5, b6, labels = "AUTO") ``` ```{r, eval=FALSE, include=FALSE} library("rstanarm") ## requires resetting the ggplot2 theme library("ggplot2") theme_set(theme_bw(base_size = 14) + theme(legend.position="bottom", panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank())) set_sum_contrasts() cbpp <- lme4::cbpp cbpp$prob <- with(cbpp, incidence / size) example_model <- stan_glmer(prob ~ period + (1|herd), data = cbpp, family = binomial, weight = size, chains = 2, cores = 1, seed = 12345, iter = 500) b1 <- afex_plot(example_model, "period") b2 <- afex_plot(example_model, "period", data_geom = geom_violin) cbpp_l <- vector("list", nrow(cbpp)) for (i in seq_along(cbpp_l)) { cbpp_l[[i]] <- data.frame( herd = cbpp$herd[i], period = cbpp$period[i], incidence = rep(0, cbpp$size[i]) ) cbpp_l[[i]]$incidence[seq_len(cbpp$incidence[i])] <- 1 } cbpp_l <- do.call("rbind", cbpp_l) cbpp_l$herd <- factor(cbpp_l$herd, levels = levels(cbpp$herd)) cbpp_l$period <- factor(cbpp_l$period, levels = levels(cbpp$period)) example_model2 <- stan_glmer(incidence ~ period + (1|herd), data = cbpp_l, family = binomial, chains = 2, cores = 1, seed = 12345, iter = 500) b3 <- afex_plot(example_model2, "period") b4 <- afex_plot(example_model2, "period", id = "herd") data("Machines", package = "MEMSS") mm <- stan_lmer(score ~ Machine + (Machine|Worker), data=Machines, chains = 2, cores = 1, seed = 12345, iter = 500) b5 <- afex_plot(mm, "Machine") b6 <- afex_plot(mm, "Machine", id = "Worker", data = Machines) save(b1, b2, b3, b4, b5, b6, file = "../inst/extdata/plots_rstanarm.rda", compress = "xz", version = 2) ``` # brms We can also fit the `Machines` data using [`brms`](https://cran.r-project.org/package=brms). ```{r, eval=FALSE} library("brms") data("Machines", package = "MEMSS") mm2 <- brm(score ~ Machine + (Machine|Worker), data=Machines, chains = 2, cores = 1, seed = 12345, iter = 500) ``` However, to pass a `brms` object to `afex_plot` we need to pass both, the `data` used for fitting as well as the name of the dependent variable (here `score`) via the `dv` argument. We again build the plot such that the left panel shows the raw data without aggregation and the right panel shows the data aggregated within the grouping factor `Worker`. ```{r, eval=FALSE} bb1 <- afex_plot(mm2, "Machine", data = Machines, dv = "score") ## No id column passed. Assuming all rows are independent samples. bb2 <- afex_plot(mm2, "Machine", id = "Worker", data = Machines, dv = "score") plot_grid(bb1, bb2) ``` ```{r fig.width=7, fig.height=3, echo=FALSE} load(system.file("extdata/", "plots_brms.rda", package = "afex")) plot_grid(bb1, bb2) ``` ```{r, eval=FALSE, include=FALSE} library("brms") data("Machines", package = "MEMSS") mm2 <- brm(score ~ Machine + (Machine|Worker), data=Machines, chains = 2, cores = 1, seed = 12345, iter = 500) bb1 <- afex_plot(mm2, "Machine", data = Machines, dv = "score") bb2 <- afex_plot(mm2, "Machine", id = "Worker", data = Machines, dv = "score") save(bb1, bb2, file = "../inst/extdata/plots_brms.rda", version = 2) ``` # Not Yet Supported: GLMMadaptive Some models are unfortunately not yet supported. For example, models fit with the new and pretty cool looking [`GLMMadaptive`](https://cran.r-project.org/package=GLMMadaptive) package using some of the special families do not seem to produce reasonable results. The following unfortunately does not produce a reasonable plot. ```{r fig.width=4, fig.height=3, eval = FALSE} library("GLMMadaptive") data(Salamanders, package = "glmmTMB") gm1 <- mixed_model(count~spp * mined, random = ~ 1 | site, data = Salamanders, family = zi.poisson(), zi_fixed = ~ mined) afex_plot(gm1, "spp", data = Salamanders) ``` afex/vignettes/assumptions_of_ANOVAs.Rmd0000644000176200001440000002644114076011252020036 0ustar liggesusers--- title: "Testing the Assumptions of ANOVAs" author: "Mattan S. Ben-Shachar" date: "`r Sys.Date()`" show_toc: true output: knitr:::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Testing the Assumptions of ANOVAs} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r echo=FALSE} req_suggested_packages <- c("see", "performance", "ggplot2") pcheck <- lapply(req_suggested_packages, requireNamespace, quietly = TRUE) if (any(!unlist(pcheck))) { message("Required package(s) for this vignette are not available/installed and code will not be executed.") knitr::opts_chunk$set(eval = FALSE) } ``` ```{r set-options, echo=FALSE, cache=FALSE} options(width = 90) knitr::opts_chunk$set(dpi=72) ``` ## Foreword by Henrik Singmann As all statistical models, ANOVAs have a number of assumptions that should hold for valid inferences. These assumptions are: 1. **Observations are i.i.d.:** i.i.d. stands for "independent and identically distributed". Independent means that, once the model is specified, the conditional observations (i.e., residuals) are independent of each other (i.e., knowing the value of one residual does not allow you to infer the value of any other residual). Identically distributed means that all observations are generated by the same data-generating process. 1. ***Homogeneity of Variances***: the variances across all the groups (cells) of between-subject effects are the same. 2. ***Sphericity***: For within-subjects effects, sphericity is the condition where the variances of the differences between all possible pairs of within-subject conditions (i.e., levels of the independent variable) are equal. This can be thought of as a within-subjects' version of the *Homogeneity of Variances* assumption. 3. ***Normality of residuals***: The errors used for the estimation of the error term(s) (*MSE*) are normally distributed. The most important assumption generally is the i.i.d. assumption (i.e., if it does not hold, the inferences are likely invalid), specifically the independent part. This assumption cannot be tested empirically but needs to hold on conceptual or logical grounds. For example, in an ideal completely between-subjects design each observation comes from a different participant that is randomly sampled from a population so we know that all observations are independent. Often, we collect multiple observations from the same participant in a within-subject or repeated-measures design. To ensure the i.i.d. assumption holds in this case, we need to specify an ANOVA with within-subject factors. However, if we have a data set with multiple sources of non-independence -- such as participants and items -- ANOVA models cannot be used but we have to use a mixed model. The other assumptions can be tested empirically, either graphically or using statistical assumption tests. However, there are different opinions on how useful statistical assumptions tests are when done in an automatic manner for each ANOVA. Whereas this is the position taken in some statistics books, this runs the risk of [reducing the statistical analysis to a "cookbook" or "flowchart"](https://stats.stackexchange.com/a/193695/442). Real life data analysis is often more complex than such simple rules. Therefore, it is often more productive to explore ones data using both descriptive statistics and graphical displays. This data exploration should allow one to judge whether the other ANOVA assumptions hold to a sufficient degree. For example, plotting ones ANOVA results using `afex_plot` and including a reasonable display of the individual data points often allows one to judge both the homogeneity of variance and the normality of the residuals assumption. Let us take a look at all three empirically testable assumptions in detail. ANOVAs are often robust to light violations to the homogeneity of variances assumption. If this assumption is clearly violated, we have learned something important about the data, namely variance heterogeneity, that requires further study. Some further statistical solutions are discussed below. If the main goal of an ANOVA is to see whether or not certain effects are significant, then the assumption of normality of the residuals is only required for small samples, thanks to the central limit theorem. As shown by Lumley et al. (2002), with sample sizes of a few hundred participants even extreme violations of the normality assumptions are unproblematic. So mild violations of this assumptions are usually no problem with sample sizes exceeding 30. Finally, the default `afex` behaviour is to correct for violations of sphericity using the Greenhouse-Geisser correction. Whereas this default may in some situation produce a small loss in statistical power, this seems preferable to a situation in which violations of sphericity are overlooked and tests become anti-conservative (i.e., more false positive results). Thus, my position as the `afex` developer is that an appropriate exploratory data analysis is often better than just blindly applying statistical assumption tests. Nevertheless, assumption tests are of course an important tool in the statistical toolbox and can be helpful in many situations. Thus, I am thankful to Mattan S. Ben-Shachar who has provided them for ANOVAs in `afex`. The following text provides his introduction to the assumption tests based on the [`performance`](https://cran.r-project.org/package=performance) and [`see`](https://cran.r-project.org/package=see) packages. ## Testing the Empirically Testable Assumptions `afex` comes with a set of built-in functions to help in the testing of the assumptions of ANOVA design. Generally speaking, the testable assumptions of ANOVA are^[There is also the assumptions that (a) the model is correctly specified and that (b) errors are independent, but there is no "hard" test for these assumptions.]: 1. ***Homogeneity of Variances***: the variances across all the groups (cells) of between-subject effects are the same. This can be tested with `performance::check_homogeneity()`. 2. ***Sphericity***: For within-subjects effects, sphericity is the condition where the variances of the differences between all possible pairs of within-subject conditions (i.e., levels of the independent variable) are equal. This can be thought of as a within-subjects' version of the *Homogeneity of Variances* assumption, and can be tested with `performance::check_sphericity()`. 3. ***Normality of residuals***: The errors used for the estimation of the error term(s) (*MSE*) are normally distributed. This can be inferred using `performance::check_normality()`. What follows is a brief review of these assumptions and their tests. ```{r, message=FALSE} library(afex) library(performance) # for assumption checks ``` ## Homogeneity of Variances This assumption, for between subject-designs, states that the within group errors all share a common variance around the group's mean. This can be tested with Levene's test: ```{r} data(obk.long, package = "afex") o1 <- aov_ez("id", "value", obk.long, between = c("treatment", "gender")) check_homogeneity(o1) ``` These results indicate that homogeneity is not significantly violated. ### What to do when assumption is violated? ANOVAs are generally robust to "light" heteroscedasticity, but there are various other methods (not available in `afex`) for getting robust error estimates. Another alternative is to ditch this assumption altogether and use permutation tests (e.g. with [`permuco`](https://cran.r-project.org/package=permuco)) or bootstrapped estimates (e.g. with [`boot`](https://cran.r-project.org/package=boot)). ## Sphericity ```{r} data("fhch2010", package = "afex") a1 <- aov_ez("id", "log_rt", fhch2010, between = "task", within = c("density", "frequency", "length", "stimulus")) ``` We can use `check_sphericity()` to run Mauchly's test of sphericity: ```{r} check_sphericity(a1) ``` We can see that both the error terms of the `length:stimulus` and `task:length:stimulus` interactions significantly violate the assumption of sphericity at *p* = 0.021. Note that as `task` is a between-subjects factor, both these interaction terms share the same error term! ### What to do when assumption is violated? - For ANOVA tables, a correction to the degrees of freedom can be used - `afex` offers both the Greenhouse-Geisser (which is used by default) and the Hyunh-Feldt corrections. - For follow-up contrasts with `emmeans`, a multivariate model can be used, which does not assume sphericity (this is used by default since `afex` 1.0). Both can be set globally with: ```{r, eval = FALSE} afex_options( correction_aov = "GG", # or "HF" emmeans_model = "multivariate" ) ``` ## Normalicy of Residuals The normalicy of residuals assumption is concerned with the errors that make up the various error terms in the ANOVA. Although the Shapiro-Wilk test can be used to test for deviation from a normal distribution, [this test tends to have high type-I error rates](https://notstatschat.rbind.io/2019/02/09/what-have-i-got-against-the-shapiro-wilk-test/). Instead, one can visually inspect the residuals using quantile-quantile plots (AKA qq-plots). For example: ```{r} data("stroop", package = "afex") stroop1 <- subset(stroop, study == 1) stroop1 <- na.omit(stroop1) s1 <- aov_ez("pno", "rt", stroop1, within = c("condition", "congruency")) is_norm <- check_normality(s1) plot(is_norm) plot(is_norm, type = "qq") ``` If the residuals were normally distributed, we would see them falling close to the diagonal line, inside the 95% confidence bands around the qq-line. We can further de-trend the plot, and show not the expected quantile, but the deviation from the expected quantile, which may help reducing visual bias. ```{r} plot(is_norm, type = "qq", detrend = TRUE) ``` Wow! The deviation from normalicy is now visually much more pronounced! ### What to do when assumption is violated? As with the assumption of *homogeneity of variances*, we can resort to using permutation tests for ANOVA tables and bootstrap estimates / contrasts. Another popular solution is to apply a monotonic transformation to the dependent variable. This should not be done lightly, as it *changes* the interpretability of the results (from the observed scale to the transformed scale). Luckily for us, it is common to *log* transform reaction times, which we can easily do^[But note ANOVA no longer tests if any differences between the means is significantly different from 0, but if any ratio between the means is significantly different from 1.]: ```{r} s2 <- aov_ez("pno", "rt", stroop1, transformation = "log", within = c("condition", "congruency")) is_norm <- check_normality(s2) plot(is_norm, type = "qq", detrend = TRUE) ``` Success - after the transformation, the residuals (on the log scale) do not deviate more than expected from errors sampled from a normal distribution (are mostly contained in the 95%CI bands)! # References - Lumley, T., Diehr, P., Emerson, S., & Chen, L. (2002). The Importance of the Normality Assumption in Large Public Health Data Sets. *Annual Review of Public Health*, 23(1), 151–169. https://doi.org/10.1146/annurev.publhealth.23.100901.140546 afex/vignettes/afex_anova_example.Rmd0000644000176200001440000004156214076011252017501 0ustar liggesusers--- title: "ANOVA and Post-Hoc Contrasts: Reanalysis of Singmann and Klauer (2011)" author: "Henrik Singmann" date: "`r Sys.Date()`" show_toc: true output: knitr:::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{ANOVA and Post-Hoc Contrasts: Reanalysis of Singmann and Klauer (2011)} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r echo=FALSE} req_suggested_packages <- c("emmeans", "multcomp", "ggplot2") pcheck <- lapply(req_suggested_packages, requireNamespace, quietly = TRUE) if (any(!unlist(pcheck))) { message("Required package(s) for this vignette are not available/installed and code will not be executed.") knitr::opts_chunk$set(eval = FALSE) } ``` ```{r set-options, echo=FALSE, cache=FALSE} op <- options(width = 90) knitr::opts_chunk$set(dpi=72) ``` # Overview This documents reanalysis a dataset from an Experiment performed by Singmann and Klauer (2011) using the ANOVA functionality of __afex__ followed by post-hoc tests using package [__emmeans__](https://cran.r-project.org/package=emmeans) (Lenth, 2017). After a brief description of the dataset and research question, the code and results are presented. # Description of Experiment and Data Singmann and Klauer (2011) were interested in whether or not conditional reasoning can be explained by a single process or whether multiple processes are necessary to explain it. To provide evidence for multiple processes we aimed to establish a double dissociation of two variables: instruction type and problem type. Instruction type was manipulated between-subjects, one group of participants received deductive instructions (i.e., to treat the premises as given and only draw necessary conclusions) and a second group of participants received probabilistic instructions (i.e., to reason as in an everyday situation; we called this "inductive instruction" in the manuscript). Problem type consisted of two different orthogonally crossed variables that were manipulated within-subjects, validity of the problem (formally valid or formally invalid) and plausibility of the problem (inferences which were consisted with the background knowledge versus problems that were inconsistent with the background knowledge). The critical comparison across the two conditions was among problems which were valid and implausible with problems that were invalid and plausible. For example, the next problem was invalid and plausible: > If a person is wet, then the person fell into a swimming pool. > A person fell into a swimming pool. > How valid is the conclusion/How likely is it that the person is wet? For those problems we predicted that under deductive instructions responses should be lower (as the conclusion does not necessarily follow from the premises) as under probabilistic instructions. For the valid but implausible problem, an example is presented next, we predicted the opposite pattern: > If a person is wet, then the person fell into a swimming pool. > A person is wet. > How valid is the conclusion/How likely is it that the person fell into a swimming pool? Our study also included valid and plausible and invalid and implausible problems. In contrast to the analysis reported in the manuscript, we initially do not separate the analysis into affirmation and denial problems, but first report an analysis on the full set of inferences, MP, MT, AC, and DA, where MP and MT are valid and AC and DA invalid. We report a reanalysis of our Experiment 1 only. Note that the factor `plausibility` is not present in the original manuscript, there it is a results of a combination of other factors. # Data and R Preperation We begin by loading the packages we will be using throughout. ```{r message=FALSE, warning=FALSE} library("afex") # needed for ANOVA functions. library("emmeans") # emmeans must now be loaded explicitly for follow-up tests. library("multcomp") # for advanced control for multiple testing/Type 1 errors. library("ggplot2") # for customizing plots. ``` ```{r} data(sk2011.1) str(sk2011.1) ``` An important feature in the data is that each participant provided two responses for each cell of the design (the content is different for each of those, each participant saw all four contents). These two data points will be aggregated automatically by `afex`. ```{r} with(sk2011.1, table(inference, id, plausibility)) ``` # ANOVA To get the full ANOVA table for the model, we simply pass it to `aov_ez` using the design as described above. We save the returned object for further analysis. ```{r} a1 <- aov_ez("id", "response", sk2011.1, between = "instruction", within = c("inference", "plausibility")) a1 # the default print method prints a data.frame produced by nice ``` The equivalent calls (i.e., producing exactly the same output) of the other two ANOVA functions `aov_car` or `aov4` is shown below. ```{r, eval=FALSE} aov_car(response ~ instruction + Error(id/inference*plausibility), sk2011.1) aov_4(response ~ instruction + (inference*plausibility|id), sk2011.1) ``` As mentioned before, the two responses per cell of the design and participants are aggregated for the analysis as indicated by the warning message. Furthermore, the degrees of freedom are Greenhouse-Geisser corrected per default for all effects involving `inference`, as `inference` is a within-subject factor with more than two levels (i.e., MP, MT, AC, & DA). In line with our expectations, the three-way interaction is significant. The object printed per default for `afex_aov` objects (produced by `nice`) can also be printed nicely using `knitr`: ```{r, results='asis', } knitr::kable(nice(a1)) ``` Alternatively, the `anova` method for `afex_aov` objects returns a `data.frame` of class `anova` that can be passed to, for example, `xtable` for nice formatting: ```{r, results='asis'} print(xtable::xtable(anova(a1), digits = c(rep(2, 5), 3, 4)), type = "html") ``` # Post-Hoc Contrasts and Plotting To further analyze the data we need to pass it to package `emmeans`, a package that offers great functionality for both plotting and contrasts of all kind. A lot of information on `emmeans` can be obtained in [its vignettes](https://cran.r-project.org/package=emmeans) and [faq](https://CRAN.R-project.org/package=emmeans/vignettes/FAQs.html). `emmeans` can work with `afex_aov` objects directly as __afex__ comes with the necessary methods for the generic functions defined in `emmeans`. When using the default `multivariate` option for follow-up tests, `emmeans` uses the ANOVA model estimated via base R's `lm` method (which in the case of a multivariate response is an object of class `c("mlm", "lm")`). `afex` also supports a univariate model (i.e., `emmeans_model = "univariate"`, which requires that `include_aov = TRUE` in the ANOVA call) in which case `emmeans` uses the object created by base R's `aov` function (this was the previous default but is not recommended as it does not handle unbalanced data well). ## Some First Contrasts ### Main Effects Only This object can now be passed to `emmeans`, for example to obtain the marginal means of the four inferences: ```{r} m1 <- emmeans(a1, ~ inference) m1 ``` This object can now also be used to compare whether or not there are differences between the levels of the factor: ```{r} pairs(m1) ``` To obtain more powerful p-value adjustments, we can furthermore pass it to `multcomp` (Bretz, Hothorn, & Westfall, 2011): ```{r} summary(as.glht(pairs(m1)), test=adjusted("free")) ``` ### A Simple interaction We could now also be interested in the marginal means of the inferences across the two instruction types. `emmeans` offers two ways to do so. The first splits the contrasts across levels of the factor using the `by` argument. ```{r} m2 <- emmeans(a1, "inference", by = "instruction") ## equal: emmeans(a1, ~ inference|instruction) m2 ``` Consequently, tests are also only performed within each level of the `by` factor: ```{r} pairs(m2) ``` The second version considers all factor levels together. Consequently, the number of pairwise comparisons is a lot larger: ```{r} m3 <- emmeans(a1, c("inference", "instruction")) ## equal: emmeans(a1, ~inference*instruction) m3 pairs(m3) ``` ### Running Custom Contrasts Objects returned from `emmeans` can also be used to test specific contrasts. For this, we can simply create a list, where each element corresponds to one contrasts. A contrast is defined as a vector of constants on the reference grid (i.e., the object returned from `emmeans`, here `m3`). For example, we might be interested in whether there is a difference between the valid and invalid inferences in each of the two conditions. ```{r} c1 <- list( v_i.ded = c(0.5, 0.5, -0.5, -0.5, 0, 0, 0, 0), v_i.prob = c(0, 0, 0, 0, 0.5, 0.5, -0.5, -0.5) ) contrast(m3, c1, adjust = "holm") summary(as.glht(contrast(m3, c1)), test = adjusted("free")) ``` The results can be interpreted as in line with expectations. Responses are larger for valid than invalid problems in the deductive, but not the probabilistic condition. ## Plotting Since version `0.22`, `afex` comes with its own plotting function based on `ggplot2`, `afex_plot`, which works directly with `afex_aov` objects. As said initially, we are interested in the three-way interaction of instruction with inference, plausibility, and instruction. As we saw above, this interaction was significant. Consequently, we are interested in plotting this interaction. ### Basic Plots For `afex_plot`, we need to specify the `x`-factor(s), which determine which factor-levels or combinations of factor-levels are plotted on the x-axis. We can also define `trace` factor(s), which determine which factor levels are connected by lines. Finally, we can also define `panel` factor(s), which determine if the plot is split into subplots. `afex_plot` then plots the estimated marginal means obtained from `emmeans`, confidence intervals, and the raw data in the background. Note that the raw data in the background is per default drawn using an alpha blending of .5 (i.e., 50% semi-transparency). Thus, in case of several points lying directly on top of each other, this point appears noticeably darker. ```{r fig.width=7.5, fig.height=4} afex_plot(a1, x = "inference", trace = "instruction", panel = "plausibility") ``` In the default settings, the error bars show 95%-confidence intervals based on the standard error of the underlying model (i.e., the `lm` model in the present case). In the present case, in which each subplot (defined by `x`- and `trace`-factor) shows a combination of a within-subjects factor (i.e., `inference`) and a between-subjects (i.e., `instruction`) factor, this is not optimal. The error bars only allow to assess differences regarding the between-subjects factor (i.e., across the lines), but not inferences regarding the within-subjects factor (i.e., within one line). This is also indicated by a warning. An alternative would be within-subject confidence intervals: ```{r fig.width=7.5, fig.height=4} afex_plot(a1, x = "inference", trace = "instruction", panel = "plausibility", error = "within") ``` However, those only allow inferences regarding the within-subject factors and not regarding the between-subjecta factor. So the same warning is emitted again. A further alternative is to suppress the error bars altogether. This is the approach used in our original paper and probably a good idea in general when figures show both between- and within-subjects factors within the same panel. The presence of the raw data in the background still provides a visual depiction of the variability of the data. ```{r fig.width=7.5, fig.height=4} afex_plot(a1, x = "inference", trace = "instruction", panel = "plausibility", error = "none") ``` ### Customizing Plots `afex_plot` allows to customize the plot in a number of different ways. For example, we can easily change the aesthetic mapping associated with the `trace` factor. So instead of using lineytpe and shape of the symbols, we can use color. Furthermore, we can change the graphical element used for plotting the data points in the background. For example, instead of plotting the raw data, we can replace this with a boxplot. Finally, we can also make both the points showing the means and the lines connecting the means larger. ```{r fig.width=7.5, fig.height=4} p1 <- afex_plot(a1, x = "inference", trace = "instruction", panel = "plausibility", error = "none", mapping = c("color", "fill"), data_geom = geom_boxplot, data_arg = list(width = 0.4), point_arg = list(size = 1.5), line_arg = list(size = 1)) p1 ``` Note that `afex_plot` returns a `ggplot2` plot object which can be used for further customization. For example, one can easily change the `theme` to something that does not have a grey background: ```{r fig.width=7.5, fig.height=4} p1 + theme_light() ``` We can also set the theme globally for the remainder of the `R` session. ```{r} theme_set(theme_light()) ``` The full set of customizations provided by `afex_plot` is beyond the scope of this vignette. The examples on the help page at `?afex_plot` provide a good overview. # Replicate Analysis from Singmann and Klauer (2011) However, the plots shown so far are not particularly helpful with respect to the research question. Next, we fit a new ANOVA model in which we separate the data in affirmation and denial inferences. This was also done in the original manuscript. We then lot the data a second time. ```{r} a2 <- aov_ez("id", "response", sk2011.1, between = "instruction", within = c("validity", "plausibility", "what")) a2 ``` Then we plot the data from this ANOVA. Because each panel would again show a mixed-design, we suppress the error bars. ```{r fig.width=7.5, fig.height=4} afex_plot(a2, x = c("plausibility", "validity"), trace = "instruction", panel = "what", error = "none") ``` We see the critical and predicted cross-over interaction in the left of those two graphs. For implausible but valid problems deductive responses are larger than probabilistic responses. The opposite is true for plausible but invalid problems. We now tests these differences at each of the four x-axis ticks in each plot using custom contrasts (`diff_1` to `diff_4`). Furthermore, we test for a validity effect and plausibility effect in both conditions. ```{r} (m4 <- emmeans(a2, ~instruction+plausibility+validity|what)) c2 <- list( diff_1 = c(1, -1, 0, 0, 0, 0, 0, 0), diff_2 = c(0, 0, 1, -1, 0, 0, 0, 0), diff_3 = c(0, 0, 0, 0, 1, -1, 0, 0), diff_4 = c(0, 0, 0, 0, 0, 0, 1, -1), val_ded = c(0.5, 0, 0.5, 0, -0.5, 0, -0.5, 0), val_prob = c(0, 0.5, 0, 0.5, 0, -0.5, 0, -0.5), plau_ded = c(0.5, 0, -0.5, 0, -0.5, 0, 0.5, 0), plau_prob = c(0, 0.5, 0, -0.5, 0, 0.5, 0, -0.5) ) contrast(m4, c2, adjust = "holm") ``` We can also pass these tests to `multcomp` which gives us more powerful Type 1 error corrections. ```{r} summary(as.glht(contrast(m4, c2)), test = adjusted("free")) ``` Unfortunately, in the present case this function throws several warnings. Nevertheless, the p-values from both methods are very similar and agree on whether or not they are below or above .05. Because of the warnings it seems advisable to use the one provided by `emmeans` directly and not use the ones from `multcomp`. The pattern for the affirmation problems is in line with the expectations: We find the predicted differences between the instruction types for valid and implausible (`diff_2`) and invalid and plausible (`diff_3`) and the predicted non-differences for the other two problems (`diff_1` and `diff_4`). Furthermore, we find a validity effect in the deductive but not in the probabilistic condition. Likewise, we find a plausibility effect in the probabilistic but not in the deductive condition. # Final Note Choosing the right correction for multiple testing can be difficult. In fact `multcomp` comes with an accompanying book (Bretz et al., 2011). If the degrees-of-freedom of all contrasts are identical using `multcomp`'s method `free` is more powerful than simply using the Bonferroni-Holm method. `free` is a generalization of the Bonferroni-Holm method that takes the correlations among the model parameters into account and uniformly more powerful. # References * Bretz, F., Hothorn, T., & Westfall, P. H. (2011). _Multiple comparisons using R_. Boca Raton, FL: CRC Press. https://CRAN.R-project.org/package=multcomp * Singmann, H., & Klauer, K. C. (2011). Deductive and inductive conditional inferences: Two modes of reasoning. _Thinking & Reasoning_, 17(3), 247-281. doi: 10.1080/13546783.2011.572718 * Lenth, R. (2017). _emmeans: Estimated Marginal Means, aka Least-Squares Means_. R package version 0.9.1. https://CRAN.R-project.org/package=emmeans ```{r, include=FALSE} options(op) ``` afex/vignettes/afex_mixed_example.Rmd0000644000176200001440000007451314076066650017521 0ustar liggesusers--- title: "Mixed Model Reanalysis of RT data" author: "Henrik Singmann" date: "`r Sys.Date()`" show_toc: true output: knitr:::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Mixed Model Example Analysis: Reanalysis of Freeman et al. (2010)} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r echo=FALSE} req_suggested_packages <- c("emmeans", "multcomp", "dplyr", "tidyr","ggplot2") pcheck <- lapply(req_suggested_packages, requireNamespace, quietly = TRUE) if (any(!unlist(pcheck))) { message("Required package(s) for this vignette are not available/installed and code will not be executed.") knitr::opts_chunk$set(eval = FALSE) } ``` ```{r set-options, echo=FALSE, cache=FALSE} op <- options(width = 90, dplyr.summarise.inform = FALSE) knitr::opts_chunk$set(dpi=72) ``` ```{r, echo=FALSE} load(system.file("extdata/", "output_mixed_vignette.rda", package = "afex")) ``` ## Overview This documents reanalysis response time data from an Experiment performed by Freeman, Heathcote, Chalmers, and Hockley (2010) using the mixed model functionality of __afex__ implemented in function `mixed` followed by post-hoc tests using package __emmeans__ (Lenth, 2017). After a brief description of the data set and research question, the code and results are presented. ## Description of Experiment and Data The data are lexical decision and word naming latencies for 300 words and 300 nonwords from 45 participants presented in Freeman et al. (2010). The 300 items in each `stimulus` condition were selected to form a balanced $2 \times 2$ design with factors neighborhood `density` (low versus high) and `frequency` (low versus high). The `task` was a between subjects factor: 25 participants worked on the lexical decision task and 20 participants on the naming task. After excluding erroneous responses each participants responded to between 135 and 150 words and between 124 and 150 nonwords. We analyzed log RTs which showed an approximately normal picture. ## Data and R Preparation We start with loading some packages we will need throughout this example. For data manipulation we will be using the `dplyr` and `tidyr` packages from the [`tidyverse`](https://www.tidyverse.org/). A thorough introduction to these packages is beyond this example, but well worth it, and can be found in ['R for Data Science'](https://r4ds.had.co.nz/) by Wickham and Grolemund. For plotting we will be using `ggplot2`, also part of the `tidyverse`. After loading the packages, we will load the data (which comes with `afex`), remove the errors, and take a look at the variables in the data. ```{r message=FALSE, warning=FALSE} library("afex") # needed for mixed() and attaches lme4 automatically. library("emmeans") # emmeans is needed for follow-up tests library("multcomp") # for advanced control for multiple testing/Type 1 errors. library("dplyr") # for working with data frames library("tidyr") # for transforming data frames from wide to long and the other way round. library("ggplot2") # for plots theme_set(theme_bw(base_size = 15) + theme(legend.position="bottom", panel.grid.major.x = element_blank())) data("fhch2010") # load fhch <- droplevels(fhch2010[ fhch2010$correct,]) # remove errors str(fhch2010) # structure of the data ``` To make sure our expectations about the data match the data we use some `dplyr` magic to confirm the number of participants per condition and items per participant. ```{r} ## are all participants in only one task? fhch %>% group_by(id) %>% summarise(task = n_distinct(task)) %>% as.data.frame() %>% {.$task == 1} %>% all() ## participants per condition: fhch %>% group_by(id) %>% summarise(task = first(task)) %>% ungroup() %>% group_by(task) %>% summarise(n = n()) ## number of different items per participant: fhch %>% group_by(id, stimulus) %>% summarise(items = n_distinct(item)) %>% ungroup() %>% group_by(stimulus) %>% summarise(min = min(items), max = max(items), mean = mean(items)) ``` Before running the analysis we should make sure that our dependent variable looks roughly normal. To compare `rt` with `log_rt` within the same figure we first need to transform the data from the wide format (where both rt types occupy one column each) into the long format (in which the two rt types are combined into a single column with an additional indicator column). To do so we use `tidyr::pivot_longer`. Then we simply call `ggplot` with `geom_histogram` and `facet_wrap(vars(rt_type))` on the new `tibble`. The plot shows that `log_rt` looks clearly more normal than `rt`, although not perfectly so. An interesting exercise could be to rerun the analysis below using a transformation that provides an even better 'normalization'. ```{r, fig.width=7, fig.height=4} fhch_long <- fhch %>% pivot_longer(cols = c(rt, log_rt), names_to = "rt_type", values_to = "rt") ggplot(fhch_long, aes(rt)) + geom_histogram(bins = 100) + facet_wrap(vars(rt_type), scales = "free_x") ``` ## Descriptive Analysis The main factors in the experiment were the between-subjects factor `task` (`naming` vs. `lexdec`), and the within-subjects factors `stimulus` (`word` vs. `nonword`), `density` (`low` vs. `high`), and `frequency` (`low` vs. `high`). Before running an analysis it is a good idea to visually inspect the data to gather some expectations regarding the results. Should the statistical results dramatically disagree with the expectations this suggests some type of error along the way (e.g., model misspecification) or at least encourages a thorough check to make sure everything is correct. We first begin by plotting the data aggregated by-participant. In each plot we plot the raw data in the background. To make the individual data points visible we use `ggbeeswarm::geom_quasirandom` and `alpha = 0.5` for semi-transparency. On top of this we add a (transparent) box plot as well as the mean and standard error. ```{r, fig.width=7, fig.height=6, message=FALSE, out.width="90%"} agg_p <- fhch %>% group_by(id, task, stimulus, density, frequency) %>% summarise(mean = mean(log_rt)) %>% ungroup() ggplot(agg_p, aes(x = interaction(density,frequency), y = mean)) + ggbeeswarm::geom_quasirandom(alpha = 0.5) + geom_boxplot(fill = "transparent") + stat_summary(colour = "red") + facet_grid(cols = vars(task), rows = vars(stimulus)) ``` Now we plot the same data but aggregated across items: ```{r, fig.width=7, fig.height=6, message=FALSE, out.width="90%"} agg_i <- fhch %>% group_by(item, task, stimulus, density, frequency) %>% summarise(mean = mean(log_rt)) %>% ungroup() ggplot(agg_i, aes(x = interaction(density,frequency), y = mean)) + ggbeeswarm::geom_quasirandom(alpha = 0.3) + geom_boxplot(fill = "transparent") + stat_summary(colour = "red") + facet_grid(cols = vars(task), rows = vars(stimulus)) ``` These two plots show a very similar pattern and suggest several things: * Responses to `nonwords` appear slower than responses to `words`, at least for the `naming` task. * `lexdec` responses appear to be slower than `naming` responses, particularly in the `word` condition. * In the `nonword` and `naming` condition we see a clear effect of `frequency` with slower responses to `high` than `low` `frequency` words. * In the `word` conditions the `frequency` pattern appears to be in the opposite direction to the pattern described in the previous point: faster responses to `low` `frequency` than to `high` `frequency` words. * `density` appears to have no effect, perhaps with the exception of the `nonword` `lexdec` condition. ## Model Setup To set up a mixed model it is important to identify which factors vary within which grouping factor generating random variability (i.e., grouping factors are sources of stochastic variability). The two grouping factors are participants (`id`) and items (`item`). The within-participant factors are `stimulus`, `density`, and `frequency`. The within-item factor is `task`. The 'maximal model' (Barr, Levy, Scheepers, and Tily, 2013) therefore is the model with by-participant random slopes for `stimulus`, `density`, and `frequency` and their interactions and by-item random slopes for `task`. It is rather common that a maximal model with a complicated random effect structure, such as the present one, does not converge successfully. The best indicator of this is a "singular fit" warning. A model with a singular fit warning should not be reported or used. Instead, one should make sure that qualitatively the same results are also observed with a model without singular fit warnings. If the maximal model that does not converge and a reduced model without a singular fit warning (i.e., the final model) diverge in their results, results should only be interpreted cautiously. In case of a singular fit or another indicator of a convergence problem, the usual first step is removing the correlations among the random terms. In our example, there are two sets of correlations, one for each random effect grouping variable. Consequently, we can build four model that have the maximal structure in terms of random-slopes and only differ in which correlations among random terms are calculated: 1. With all correlations. 2. No correlation among by-item random effects (i.e., no correlation between random intercept and `task` random slope). 3. No correlation among by-participant random effect terms (i.e., no correlation among random slopes themselves and between the random slopes and the random intercept). 4. No correlation among either random grouping factor. The next decision to be made is which method to use for obtaining $p$-values. The best control against anti-conservative results is provided by `method = "KR"` (=Kenward-Roger). However, `KR` needs quite a lot of RAM, especially with complicated random effect structures and large data sets. In this case we have both, relatively large data (i.e., many levels on each random effect, especially the item random effect) and a complicated random effect structure. Consequently, it seems a reasonable decision to choose another method. The second 'best' method (in terms of controlling for Type I errors) is the 'Satterthwaite' approximation, `method = 'S'`. It provides a similar control of Type I errors as the Kenward-Roger approximation and needs less RAM. The Satterthwaite method is currently also the default method for calculating $p$-values so does not need to be set explicitly. ## Finding the Final Model The following code fits the four models using the Satterthwaite method. To suppress random effects we use the `||` notation. Note that it is necessary to set `expand_re = TRUE` when suppressing random effects among variables that are entered as factors and not as numerical variables (all independent variables in the present case are factors). Also note that `mixed` automatically uses appropriate contrast coding if factors are included in interactions (`contr.sum`) in contrast to the `R` default (which is `contr.treatment`). To make sure the estimation does not end prematurely we set the allowed number of function evaluations to a very high value (using `lmerControl`). However, because fitting the models in R might take quite a while, you should also be able to load the fitted binary files them from [this url](https://raw.githubusercontent.com/singmann/afex/master/development/freeman_models.rda) and then load them in R with `load("freeman_models.rda")`. ```{r, eval = FALSE} m1s <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus*density*frequency|id)+ (task|item), fhch, control = lmerControl(optCtrl = list(maxfun = 1e6))) ``` ```{r, echo=FALSE} message("boundary (singular) fit: see ?isSingular") ``` ```{r, eval = FALSE} m2s <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus*density*frequency|id)+ (task||item), fhch, control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ``` ```{r, echo=FALSE} message("boundary (singular) fit: see ?isSingular") ``` ```{r, eval = FALSE} m3s <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus*density*frequency||id)+ (task|item), fhch, control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ``` ```{r, echo=FALSE} message("boundary (singular) fit: see ?isSingular") ``` ```{r, eval = FALSE} m4s <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus*density*frequency||id)+ (task||item), fhch, control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ``` ```{r, echo=FALSE} message("boundary (singular) fit: see ?isSingular") ``` We can see that fitting each of these models emits the "singular fit" message (it is technically a `message` and not a `warning`) indicating that the model is over-parameterized and did not converge successfully. In particular, this message indicates that the model is specified with more random effect parameters than can be estimated given the current data. It is instructive to see that even with a comparatively large number of observations, 12960, a set of seven random slopes for the by-participant term and one random slope for the by-item term cannot be estimated successfully. And this holds even after removing all correlations. Thus, it should not be surprising that similar sized models regularly do not converge with smaller numbers of observations. Furthermore, we are here in the fortunate situation that each factor has only two levels. A factor with more levels corresponds to more parameters of the random effect terms. Before deciding what to do next, we take a look at the estimated random effect estimates. We do so for the model without any correlations. Note that for `afex` models we usually do not want to use the `summary` method as it prints the results on the level of the model coefficients and not model terms. But for the random effects we have to do so. However, we are only interested in the random effect terms so we only print those using `summary(model)$varcor`. ```{r, eval=FALSE} summary(m4s)$varcor ``` ```{r, echo=FALSE} cat(outp_m4s_vc$output, sep = "\n") ``` The output shows that the estimated SDs of the random slopes of the two-way interactions are all zero. However, because we cannot remove the random slopes for the two way interaction while retaining the three-way interaction, we start by removing the three-way interaction first. ```{r, eval=FALSE} m5s <- mixed(log_rt ~ task*stimulus*density*frequency + ((stimulus+density+frequency)^2||id)+ (task||item), fhch, control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ``` ```{r, echo=FALSE} message("boundary (singular) fit: see ?isSingular") ``` ```{r, eval=FALSE} summary(m5s)$varcor ``` ```{r, echo=FALSE} cat(outp_m5s_vc$output, sep = "\n") ``` Not too surprisingly, this model also produces a singular fit. Inspection of the estimates shows that the two-way interaction of the slopes are still estimated to be zero. So we remove those in the next step. ```{r, eval=FALSE} m6s <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus+density+frequency||id)+ (task||item), fhch, control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ``` ```{r, echo=FALSE} message("boundary (singular) fit: see ?isSingular") ``` This model still shows a singular fit warning. The random effect estimates below show a potential culprit. ```{r, eval=FALSE} summary(m6s)$varcor ``` ```{r, echo=FALSE} cat(outp_m6s_vc$output, sep = "\n") ``` As in `m4s` above, the random effect SD for the density term is estimated to be zero. Thus, we remove this as well in the next step. ```{r, eval=FALSE} m7s <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus+frequency||id)+ (task||item), fhch, control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ``` This model finally does not emit a singular fit warning. Is this our final model? Before deciding on this, we see whether we can add the correlation terms again without running into any problems. We begin by adding the correlation to the by-participant term. ```{r, eval=FALSE} m8s <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus+frequency|id)+ (task||item), fhch, control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ``` ```{r, echo=FALSE} warning(fit_m8s$warnings, call. = FALSE) ``` This model does not show a singular fit message but emits another warning. Specifically, a warning that the absolute maximal gradient at the final solution is too high. This warning is not necessarily critical (i.e., it can be a false positive), but can also indicate serious problems. Consequently, we try adding the correlation between the by-item random terms instead: ```{r, eval=FALSE} m9s <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus+frequency||id)+ (task|item), fhch, control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ``` This model also does not show any warnings. Thus, we have arrived at the end of the model selection process. ## Results of Maximal and Final Model We now have the following two relevant models. - `m1s`: The maximal random effect structure justified by the design (i.e., the maximal model) - `m9s`: The final model Robust results are those that hold regardless across maximal and final (i.e., reduced) model. Therefore, let us compare the pattern of significant and non-significant effects. ```{r, eval=FALSE} left_join(nice(m1s), nice(m9s), by = "Effect", suffix = c("_full", "_final")) ``` ```{r, echo=FALSE} cat(outp_comb_anova$output, sep = "\n") ``` What this shows is that the pattern of significant and non-significant effect is the same for both models. The only significant effect for which the evidence is not that strong is the 3-way interaction between `stimulus:density:frequency`. It is only just below .05 for the full model and has a somewhat lower value for the final model. We can also see that one of the most noticeable differences between the maximal and the final model is the number of denominator degrees of freedom. This is highly influenced by the random effect structure and thus considerable larger in the final (i.e., reduced) model. The difference in the other statistics is lower. ## LRT Results It is instructive to compare those results with results obtained using the comparatively 'worst' method for obtaining $p$-values implemented in `afex::mixed`, likelihood ratio tests. Likelihood ratio-tests should in principle deliver reasonable results for large data sets. A common rule of thumb is that the number of levels for each random effect grouping factor needs to be large, say above 50. Here, we have a very large number of items (600), but not that many participants (45). Thus, qualitative results should be the very similar, but it still is interesting to see exactly what happens. We therefore fit the final model using `method='LRT'`. ```{r, eval = FALSE} m9lrt <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus+frequency||id)+ (task|item), fhch, method = "LRT", control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) m9lrt ``` ```{r, echo=FALSE} cat(outp_m9lrt$output, sep = "\n") ``` The results in this case match the results of the Satterthwaite method. With lower numbers of levels of the grouping factor (e.g., less participants) this would not necessarily be expected. ## Summary of Results Fortunately, the results from all models converged on the same pattern of significant and non-significant effects providing a high degree of confidence in the results. This might not be too surprising given the comparatively large number of total data points and the fact that each random effect grouping factor has a considerable number of levels (above 30 for both participants and items). In the following we focus on the final model using the Satterthwaite method, `m9s`. In terms of the significant findings, there are many that seem to be in line with the descriptive results described above. For example, the highly significant effect of `task:stimulus:frequency` with $F(1, 578.91) = 124.16$, $p < .001$, appears to be in line with the observation that the frequency effect appears to change its sign depending on the `task:stimulus` cell (with `nonword` and `naming` showing the opposite patterns than the other three conditions). Consequently, we start by investigating this interaction further below. ## Follow-Up Analyses Before investigating the significant interaction in detail it is a good idea to remind oneself what a significant interaction represents on a conceptual level; that one or multiple of the variables in the interaction moderate (i.e., affect) the effect of the other variable or variables. Consequently, there are several ways to investigate a significant interaction. Each of the involved variables can be seen as the moderating variables and each of the variables can be seen as the effect of interest. Which one of those possible interpretations is of interest in a given situation highly depends on the actual data and research question and multiple views can be 'correct' in a given situation. In addition to this conceptual issue, there are also multiple technical ways to investigate a significant interaction. One approach not followed here is to split the data into subsets according to the moderating variables and compute the statistical model again for the subsets with the effect variable(s) as remaining fixed effect. This approach, also called _simple effects_ analysis, is, for example, recommended by Maxwell and Delaney (2004) as it does not assume variance homogeneity and is faithful to the data at each level. The approach taken here is to simply perform the test on the estimated final model. This approach assumes variance homogeneity (i.e., that the variances in all groups are homogeneous) and has the added benefit that it is computationally relatively simple. In addition, it can all be achieved using the framework provided by [`emmeans`](https://cran.r-project.org/package=emmeans) (Lenth, 2017). ### task:stimulus:frequency Interaction Our interest in the beginning is on the effect of `frequency` by `task:stimulus` combination. So let us first look at the estimated marginal means of this effect. In `emmeans` parlance these estimated means are called 'least-square means' because of historical reasons, but because of the lack of least-square estimation in mixed models we prefer the term estimated marginal means, or EMMs for short. Those can be obtained in the following way. To prevent `emmeans` from calculating the *df* for the EMMs (which can be quite costly), we use asymptotic *df*s (i.e., $z$ values and tests). `emmeans` requires to first specify the variable(s) one wants to treat as the effect variable(s) (here `frequency`) and then allows to specify condition variables. ```{r, eval=FALSE} emm_options(lmer.df = "asymptotic") # also possible: 'satterthwaite', 'kenward-roger' emm_i1 <- emmeans(m9s, "frequency", by = c("stimulus", "task")) emm_i1 ``` ```{r, echo=FALSE} message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_o1$output, sep = "\n") ``` The returned values are in line with our observation that the `nonword` and `naming` condition diverges from the other three. But is there actual evidence that the effect flips? We can test this using additional `emmeans` functionality. Specifically, we first use the `pairs` function which provides us with a pairwise test of the effect of `frequency` in each `task:stimulus` combination. Then we need to combine the four tests within one object to obtain a family-wise error rate correction which we do via `update(..., by = NULL)` (i.e., we revert the effect of the `by` statement from the earlier `emmeans` call) and finally we select the `holm` method for controlling for family wise error rate (the Holm method is uniformly more powerful than the Bonferroni). ```{r, eval=FALSE} update(pairs(emm_i1), by = NULL, adjust = "holm") ``` ```{r, echo=FALSE} message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_o2$output, sep = "\n") ``` We could also use a slightly more powerful method than the Holm method, method `free` from package `multcomp`. This method takes the correlation of the model parameters into account. However, results do not differ much here: ```{r, eval=FALSE} summary(as.glht(update(pairs(emm_i1), by = NULL)), test = adjusted("free")) ``` ```{r, echo=FALSE} cat(emm_o3$output, sep = "\n") ``` We see that the results are exactly as expected. In the `nonword` and `naming` condition we have a clear negative effect of frequency while in the other three conditions it is clearly positive. We could now also use `emmeans` and re-transform the estimates back onto the original RT response scale. For this, we can again `update` the `emmeans` object by using `tran = "log"` to specify the transformation and then indicating we want the means on the response scale with `type = "response"`. These values might be used for plotting. ```{r, eval=FALSE} emm_i1b <- update(emm_i1, tran = "log", type = "response", by = NULL) emm_i1b ``` ```{r, echo=FALSE} cat(emm_o4$output, sep = "\n") ``` A more direct approach for plotting the interaction is via `afex_plot`. For a plot that is not too busy it makes sense to specify across which grouping factor the individual level data should be aggregated. We use the participant variable `"id"` here. We also use `ggbeeswarm::geom_quasirandom` as the geom for the data in the background following the example in [the `afex_plot` vignette](afex_plot_introduction.html). ```{r, eval=FALSE} afex_plot(m9s, "frequency", "stimulus", "task", id = "id", data_geom = ggbeeswarm::geom_quasirandom, data_arg = list( dodge.width = 0.5, ## needs to be same as dodge cex = 0.8, color = "darkgrey")) ``` ```{r, echo=FALSE, fig.width=5, fig.height=4, out.width="90%"} p1 ``` ### task:stimulus:density:frequency Interaction As the last example, let us take a look at the significant four-way interaction of `task:stimulus:density:frequency`, $F(1, 578.77) = 11.72$, $p < .001$. Here we might be interested in a slightly more difficult question namely whether the `density:frequency` interaction varies across `task:stimulus` conditions. If we again look at the figures above, it appears that there is a difference between `low:low` and `high:low` in the `nonword` and `lexdec` condition, but not in the other conditions. Looking at the 2-way interaction of `density:frequency` by the `task:stimulus` interaction can be done using `emmeans` using the `joint_test` function. We simply need to specify the appropriate `by` variables and get conditional tests this way. ```{r, eval=FALSE} joint_tests(m9s, by = c("stimulus", "task")) ``` ```{r, echo=FALSE} cat(emm_o5$output, sep = "\n") ``` This test indeed shows that the `density:frequency` interaction is only significant in the `nonword` and `lexdec` condition. Next, let's see if we can unpack this interaction in a meaningful manner. For this we compare `low:low` and `high:low` in each of the four groups. And just for the sake of making the example more complex, we also compare `low:high` and `high:high`. To do so, we first need to setup a new set of EMMs. Specifically, we get the EMMs of the two variables of interest, density and frequency, using the same `by` specification as the `joint_test` call. We can then setup custom contrasts that tests our hypotheses. ```{r, eval=FALSE} emm_i2 <- emmeans(m2s, c("density", "frequency"), by = c("stimulus", "task")) emm_i2 ``` ```{r, echo=FALSE} cat(emm_o6$output, sep = "\n") ``` These contrasts can be specified via a list of custom contrasts on the EMMs (or reference grid in `emmeans` parlance) which can be passed to the `contrast` function. The contrasts are a `list` where each element should sum to one (i.e., be a proper contrast) and be of length equal to the number of EMMs (although we have 16 EMMs in total, we only need to specify it for a length of four due to conditioning by `c("stimulus", "task")`). To control for the family wise error rate across all tests, we again use `update(..., by = NULL)` on the result to revert the effect of the conditioning. ```{r, eval=FALSE} # desired contrats: des_c <- list( ll_hl = c(1, -1, 0, 0), lh_hh = c(0, 0, 1, -1) ) update(contrast(emm_i2, des_c), by = NULL, adjust = "holm") ``` ```{r, echo=FALSE} cat(emm_o7$output, sep = "\n") ``` In contrast to our expectation, the results show two significant effects and not only one. In line with our expectations, in the `nonword` and `lexdec` condition the EMM of `low:low` is smaller than the EMM for `high:low`, $z = -5.63$, $p < .0001$. However, in the `nonword` and `naming` condition we found the opposite pattern; the EMM of `low:low` is larger than the EMM for `high:low`, $z = 3.53$, $p = .003$. For all other effects $|z| < 1.4$, $p > .98$. In addition, there is no difference between `low:high` and `high:high` in any condition. ## References * Barr, D. J., Levy, R., Scheepers, C., & Tily, H. J. (2013). Random effects structure for confirmatory hypothesis testing: Keep it maximal. _Journal of Memory and Language_, 68(3), 255-278. https://doi.org/10.1016/j.jml.2012.11.001 * Bretz, F., Hothorn, T., & Westfall, P. H. (2011). _Multiple comparisons using R_. Boca Raton, FL: CRC Press. https://CRAN.R-project.org/package=multcomp * Freeman, E., Heathcote, A., Chalmers, K., & Hockley, W. (2010). Item effects in recognition memory for words. _Journal of Memory and Language_, 62(1), 1-18. https://doi.org/10.1016/j.jml.2009.09.004 * Lenth, R. (2017). _emmeans: Estimated Marginal Means, aka Least-Squares Means_. R package version 0.9.1. https://CRAN.R-project.org/package=emmeans * Maxwell, S. E., & Delaney, H. D. (2004). _Designing experiments and analyzing data: a model-comparisons perspective_. Mahwah, N.J.: Lawrence Erlbaum Associates. ```{r, include=FALSE} options(op) ``` afex/NEWS0000644000176200001440000011513714076011251011701 0ustar liggesusers ************************* ** afex VERSION 1.0-x ** ************************* Changes in afex Version 1.0-x Released July 2021 Significant User Visible Changes and New Features o ANOVA objects do not by default contain the aov slot any more o emmeans() for ANOVA now uses multivariate model as default o Default p-value method for mixed() is now Satterthwaite: method = "S" o New data set, Urry et al. (2021, Psych Science): laptop_urry The following changes are thanks to Mattan S. Ben-Shachar: o Added new vignette: "Testing the Assumptions of ANOVAs" o Added predict() method for afex_aov objects. o Deprecated functions test_levene() and test_sphercitiy(), which are now part of the performance package as performance::check_homogeneity() and performance::check_sphericity(), respectively. Bugfixes o All vignettes should run without suggested packages present. o Added ez to suggests, to avoid NOTE on CRAN solaris. ************************* ** afex VERSION 0.28-x ** ************************* Changes in afex Version 0.28-x Released August 2020 Significant User Visible Changes and New Features o Added residuals() and fitted() methods for afex_aov objects. Thanks to a pull request by Mattan S. Ben-Shachar. o Added new data set, stroop, which contains the accuracy and response time data from Lin, Saunders, Friese, Evans, and Inzlicht (2020, Psych. Science, https://doi.org/10.1177/0956797620904990). o Added new vignette, "Analysis of Accuracy Data using ANOVA and binomial GLMMs" which uses the new Stroop data. o afex_plot introduction vignette and help page now refer to ggbeeswarm::geom_quasirandom as a good alternative to the bee swarm plot. o Updated the mixed model vignette which now discusses going from the maximal to the final model, singular fits, and is based on latest lme4. o Mixed model chapter uses better layout and added final reference. Bugfixes (most bugs in this updated were reported by Frantisek Bartos) o objects estimated with mixed(..., all_fit = TRUE) should now work again with emmeans. o afex_plot() works with mixed models estimated with mixed(..., type = 2) (i.e., mixed models with Type II sums of squares). o afex_plot() did not work if data had a column called 'y' that appeared before the response/DV column in data. o Better error message if afex_plot() is called with variable/factor 'y' for plotting (which is not supported, 'y' can only be the name of the response variable). o Better error message if afex_plot() fails to recover the dv from the formula (e.g., for brms models). o Better error messages in case of NAs in the response variable for ANOVAs and mixed models. o afex_plot.merMod() method does not fail any more for models with missing data. o afex_plot() correctly plots data in the background if DV is a factor in a binomial model. ************************* ** afex VERSION 0.27-x ** ************************* Changes in afex Version 0.27-x Released March 2020 Significant User Visible Changes and New Features o p-values are now per default rounded to 3 digits following APA recommendations, thanks to Marius Barth: https://github.com/singmann/afex/issues/81 To achieve this, a new argument, round_ps, was added to nice() which accepts a rounding function and defaults to round_ps_apa() via afex_options("round_ps"). To reset to the old rounding behaviour, call: afex_options(round_ps = round_ps) o New p-value rounding function round_ps_apa(). Bugfixes o mixed(): check_contrasts = TRUE now works when the formula is not a formula (but e.g., a character string). o Better error message when ANOVA formula does not include an error term. o Should work with both lme4 1.1-22 and later. ************************* ** afex VERSION 0.26-x ** ************************* Changes in afex Version 0.26-x Released January 2020 Significant User Visible Changes and New Features o factor_levels argument of afex_plot() now accepts named character vectors which allows: (1) renaming only a subset of factor levels (if only a subset of levels is specified) (2) reordering in which order factor levels are shown in the plot (order of names within a list element determine order that will be used for plotting) Bugfixes o msq data set is now part of psychTools and not of psych. Fixes CRAN check issues. ************************* ** afex VERSION 0.25-x ** ************************* Changes in afex Version 0.25-x Released August 2019 Significant User Visible Changes and New Features o Better error messages for ANOVA in some case in which data shows structural problems (e.g., missing design cells). o afex_plot() now first draws all graphical elements belonging to a specific factor level, before drawing graphical elements belonging to the next factor level in interaction plots (does not apply to data in the background). This avoids inconsistencies in plotting order between error bars and connecting lines. Bugfixes o Correct Type III ANOVA results for character variables if factorize = FALSE. o afex_plot() for mixed or merMod objects uses actual dv on y-axis. o afex_plot() x-labels and legend-title display correctly in case more than one variable is displayed. o The default method for afex_plot() can now aggregate via the id argument even if the corresponding factor is only part if the random effects terms (see rstanarm examples in vignette). o Removed certain non-ASCII characters in examples: https://github.com/singmann/afex/issues/66 ************************* ** afex VERSION 0.24-x ** ************************* Changes in afex Version 0.24-x Released July 2019 Significant User Visible Changes and New Features o Added possibility to suppress calculation of aov object for ANOVAs, via argument 'include_aov' (with default = TRUE). Suppressing the calculation of the aov object can significantly reduce estimation time of ANOVAs for models with large N and within-subjects factors. Even for small models, a speed increase by more than 10% is expected. For ANOVAs without aov object, emmeans are always based on the multivariate or lm model. o Added test_levene() and test_sphercitiy() functions for assumption tests for ANOVA models. Thanks to Mattan S. Ben-Shachar. Addresses #55, https://github.com/singmann/afex/issues/55 o afex now depends on R (>= 3.5.0), as it uses binary/serialized objects version 3. Bugfixes o Sum-to-zero contrasts will now be set to all character variables passed to mixed(). Before, only factor variables were assigned sum-to-zero contrasts and transformation into factors happened only in the call to model.matrix() (which then used the global contrasts). ************************* ** afex VERSION 0.23-x ** ************************* Changes in afex Version 0.23-x Released February 2019 Significant User Visible Changes and New Features o Added afex_plot.default() method which works with a wide variety of fitted objects. See new vignette: vignette("afex_plot_supported_models", package = "afex") o In afex_plot(), renamed 'random' argument to 'id' argument. Bugfixes o Corrected bug in afex_plot() vignette and examples. Correct argument name is factor_levels. o Removed reference to ascii package from documentation, as the package was removed from CRAN. ************************* ** afex VERSION 0.22-x ** ************************* Changes in afex Version 0.22-x Released September 2018 Significant User Visible Changes and New Features o New functions for plotting results (means, error bars, and raw data) using ggplot2, afex_plot(), generic function for afex and lme4::merMod objects. Furthermore added two more functions: - interaction_plot(): workhorse producing interaction plot - oneway_plot(): workhorse producing oneway plot Error bars can display confidence intervals (the default) or standard errors and can be calculated using a variety of different standard errors (e.g., model-based, within-subjects). o Added vignette introducing afex_plot(). o Updated ANOVA vignette to use afex_plot() and the multivariate for follow-up test. o Package emmeans was moved to suggests and needs to be either attached explicitly or called with :: Option 1: emmeans::emmeans() Option 2: library("emmeans") and then just emmeans() o Added call slot to mixed objects holding the matched call. Bugfixes o Error in ANOVA examples using emmeans corrected, see: https://stats.stackexchange.com/q/360900/442 ************************* ** afex VERSION 0.21-x ** ************************* Changes in afex Version 0.21-x Released June 2018 Significant User Visible Changes and New Features o Smaller package footprint: The stringr package is not imported any more, all calls to stringr functions were replaced with calls to base R functions. The coin package (used in compare.2.vectors) was moved from Imports to Suggests. Bugfixes o ANOVA functions produce accurate emmeans even for ANCOVAs, see: https://afex.singmann.science/forums/topic/precise-estimates-from-emmeans-across-lm-and-aov_ez ************************* ** afex VERSION 0.20-x ** ************************* Changes in afex Version 0.20-x Released April 2018 Significant User Visible Changes and New Features o follow-up tests with emmeans for ANOVAs (i.e., objects of class "afex_aov") with repeated-measures factors can now be based on a multivariate model. This provides separate standard errors for each estimate and more adequately accounts for violations of sphericity. To use this model either call emmeans(..., model="multivariate") or set globally via: afex_options(emmeans_model = "multivariate") o ANOVA functions now allow transformations of the dv (thanks to Russell Lenth). o better (i.e., simpler) examples for mixed (use data from MEMSS). Added example showing how to use mixed() with effects package for plotting. o set_data_arg argument of mixed() is now per default controlled via afex_options("set_data_arg"). The default has also changed from TRUE to FALSE. The reason for this change is that FALSE appears to work better with emmeans. o afex_aov objects have received an additional attribute, "incomplete_cases", that contains the IDs of removed participants due to missing values (thanks to Frederik Aust). o afex should now work with the upcoming versions of car (3.0) and lmerTest (3.0). The latter thanks to Rune Haubo Bojesen. Bugfixes o removed bug in mixed that caused a crash if check_contrasts = FALSE and the data contained missing values in the IVs. o removed bug that caused a crash under certain conditions if stringsAsFactors was set to FALSE in the global options and repeated measures factors were present (thanks to Will Hopper for the bug report and simultaneous fix). o set_data_arg now works for lmer_alt and mixed(..., return = "merMod"). This allows to use those objects with e.g., the effects package. o afex should now work with car version 3.0. ************************* ** afex VERSION 0.19-x ** ************************* Changes in afex Version 0.19-0 Released January 2018 Significant User Visible Changes and New Features o afex now works with emmeans (successor of lsmeans pckage). Bugfixes o lsmeans did not work with mixed objects if type=2 and method used nested model comparions (e.g., LRT or PB). o removed warning 'Error() model is singular' when units of observations have missing values for ANOVAs. ************************* ** afex VERSION 0.18-x ** ************************* Changes in afex Version 0.18-0 Released May 2017 Bugfixes o aov_ez did not work with more than one covariate (https://github.com/singmann/afex/issues/29). ************************* ** afex VERSION 0.17-x ** ************************* Changes in afex Version 0.17-x Released April 2017 Significant User Visible Changes and New Features o Added Satterthwaite approximation (method="S") to mixed(), which is implemented via lmerTest. Satterthwaite approximates the degrees-of- freedom of an F-test, similar to the default Kenward-Roger method, but requires less RAM. o mixed() methods "KR" and "S" are now obtained via tests on the full model directly. No restricted models are calculated for these methods. The former KR method is still available: method="nested-KR" o mixed() now per default exports and uses lmerTest::lmer and not lme4::lmer(). This can be changed via calling afex_options(lmer_function = "lme4") o afex does not depend on reshape2 any more. It is only imported. o All arguments with "." in the name have been renamed to use "_". The old names have been deprecated (i.e., still work, but should not be used). check.contrasts = check_contrasts, test.intercept = test_intercept, args.test = args_test, ... o Names of slots of mixed model objects with "." have been renamed to have a "_" instead: full.model = full_model and restricted.models = restricted_models o afex_options() now uses the global R options accessible via options() (with prefix afex.) and allows to reset all options via list (i.e.,: aop <- afex_options(); ...; afex_options(aov); works). o renamed allFit() to all_fit() and argument meth.tab to meth_tab. Added method dfoptim::nmkb() to all_fit(). To use nmkb, dfoptim needs to be loaded explicitly via library (see examples). o Added argument all_fit to mixed(). If TRUE, each model is fitted with all available optimizers and the best fit in each case selected. o mixed objects have an additional slot, "data", that contains the data used for fitting. o Added vignette with extensive mixed model example. o Created forum for providing afex support: http://afex.singmann.science/ Bugfixes o Sphericity correction now correctly displayed as none if all within- factors have only two levels (bug removed by Frederik Aust). o removed bug when calling nice() on afex_aov objects created with explicit effect size. o aov_...(): anova_table = list(intercept = TRUE) now correctly suppresses the intercept (bug removed by Frederik Aust). o aov_...(): return = "nice" did not work (bug removed by Frederik Aust). o aov_...() now supports column names with spaces (using backticks), see: https://github.com/singmann/afex/issues/22 Thx to Jonathan Love for fix. o changed license to GPL >=2 (as it call some function from GPL >=2 packages). o removed bug that mixed() object with type=2 could not be printed. o removed bug that model names for anova.mixed with multiple models were incorrect. o all_fit() now uses a data argument correctly and passes it update(). This again allows to use it for data with suppressed correlations. all_fit(... verbose = TRUE) now correctly signals if a fit failed. ************************* ** afex VERSION 0.16-x ** ************************* Changes in afex Version 0.16-x Released April 2016 Significant User Visible Changes and New Features o added "correction" and "observed" attributes to the anova_table slot of afex_aov objects, which is used per default by nice(). This ensures that nice(object) and object always return the same data.frame. Also added "nice_table" class to data.frame returned by nice which print the value of the slots for information. Both contributed by Frederik Aust (who was also promoted to author). o added return="data" for mixed. This allows to obtain the data set used for fitting a model. Can be useful in combination with expand.re=TRUE and allFit() or for obtaining predictions. See ?allFit for a simple example. Bugfixes o increased required version of R (>= 3.1.0) and the following packages to ensure afex runs with older versions of R: lme4 (>= 1.1-8), pbkrtest (>= 0.4-1), and Matrix (>= 1.1.1). ************************* ** afex VERSION 0.15-x ** ************************* Changes in afex Version 0.15-x Released October 2015 Significant User Visible Changes and New Features o added p.adjust.method argument for ANOVA functions (anova and nice methods). Can be used to control for multiple comparisons in exploratory ANOVAs (see Cramer, et al., 2015; PB&R). Functionality contributed by Frederik Aust (https://github.com/singmann/afex/pull/3). Bugfixes o ANOVA functions work with dplyr data.frames now (data is transformed via as.data.frame). See: https://github.com/singmann/afex/issues/6 o formulas for mixed can now be of a maximum length of 500 characters (was 60 chars previously): https://github.com/singmann/afex/issues/5 o aov_car et al. did not work with within-subject factors that were also included outside the Error term. This was caused by the use of regular expressions not appropriate for the new stringi backend of stringr. Thanks to Tom Wenseleers for reporting this bug. ************************* ** afex VERSION 0.14-x ** ************************* Changes in afex Version 0.14-x Released August 2015 Significant User Visible Changes and New Features o new default return argument for ANOVA functions, afex_aov, an S3 object containing the following: (1) ANOVA table of class "anova" (2) ANOVA fitted with base R's aov (can be passed to lsmeans for post-hoc tests) (3) output from car::Anova (for tests of effects), ANOVA table (1) is based on this model (4) lm object passed to car::Anova (5) data used for estimating (2) and (4) o added support for lsmeans: objects of class afex_aov can be passed to lsmeans directly. afex now depends on lsmeans. o added afex_options() functionality for setting options globally. o added expand_re argument to mixed which, if TRUE, correctly interprets the || notation in random effects with factors (i.e., suppresses estimation of correlation among random effects). lmer_alt is a wrapper for mixed which uses expand_re = TRUE, returns an object of class merMod (i.e., does not calculate p-values), and otherwise behaves like g/lmer (i.e., does not enforce certain contrasts) o added three new data sets (Singmann & Klauer, 2011; Klauer & Singmann, 2013) and a vignette showing how to calculate contrasts after ANOVA. o ANOVA functions renamed to aov_car, aov_ez, and aov_4. Old functions are now deprecated. o first element in mixed object renamed to anova_table. o nice.anova renamed to nice. nice() can be called for afex_aov and mixed objects and returns a nicely formatted (numbers converted to characters) results table (which is also the default print method for both objects). o anova() can be called for afex_aov and mixed objects and returns the numeric anova table (i.e., the first element of each object). There also exists print methods for those data.frames. o summary method for mixed objects now calls summary.merMod on full model. o afex does not depend on car package anymore, it is only imported. o afex is now hosted on github: https://github.com/singmann/afex Bugfixes o ANOVA: for "aov"-objects, contrasts are only set for factors. o compare.2.vector failed when the two means were exactly equal (due to an issue with median_test). This only throws a warning now. o compare.2.vector documentation updated for coin 1-1.0. ************************* ** afex VERSION 0.13-x ** ************************* Changes in afex Version 0.13-x Released January 2015 Significant User Visible Changes and New Features o added ems() function for deriving the expected values of the mean squares for factorial designs (contributed by Jake Westfall). Bugfixes o aov.car et al. stop with error message if a factor has only one level. o aov.car transforms id variable to factor which ensures that return = "aov" provides equivalent results. o changed regex for detecting "observed" variables to work with the new version of stringr which uses stringi. ************************* ** afex VERSION 0.12-x ** ************************* Changes in afex Version 0.12-x Released November 2014 Significant User Visible Changes and New Features o ANOVA functions give informative error if some parameters are not estimable (most likely due to structural missings, i.e. empty cells). Bugfixes o mixed(..., method = "PB") does not fail anymore when only having a single fixed effect (thanks to Kiyoshi Sasaki for reporting it). o aov.car() failed when a within-subject factor had empty levels. Unused factor levels are now dropped. This bug was probably introduced in Rev 126 as part of an attempt to solve a bug. (thanks to Will Bowditch for reporting it). ************************* ** afex VERSION 0.11-x ** ************************* Changes in afex Version 0.11-x Released October 2014 Significant User Visible Changes and New Features o added allFit() function (written by Ben Bolker). o mixed() gives warning if nested model provides worse fit (logLik) than full model (when fitted with ML). o print, summary, and anova method for mixed objects are now identical. o description of returned object from mixed() extended (Thanks to Ben Bolker, see http://stackoverflow.com/a/25612960/289572) o added return = "aov" to aov.car which returns the ANOVA fitted with aov (with correct Error strata) so that it can be passed to lsmeans for post-hoc tests or plotting (lsmip). Bugfixes o all required functions are now correctly imported avoiding CRAN warnings and better functioning. o data argument to lmer calls in mixed set correctly. Note that still contrasts added to the data in mixed may prohibit use of predict.merMod() or similar functions. It is recommended to set the contrasts globally to "contr.sum", e.g., via set_sum_contrasts(), for correct functioning (disable via set.data.arg argument for mixed). ************************ ** afex VERSION 0.10-x ** ************************ Changes in afex Version 0.10-x Released August 2014 Significant User Visible Changes and New Features o afex does not change the global contrasts anymore when loading the package (due to popular demand). o new functions to globally set contrasts: set_sum_contrasts & set_treatment_contrasts (and some more wrappers). o Added more mixed model examples from Maxwell & Delaney, Chapter 15 ("Multilevel Models for within subjects designs"), see ?mixed and ?md_15.1. Thanks to Ulf Mertens. Bugfixes o removed bug when factor levels of within-subject factors contained "+" or "-" and were not converted correctly. Added tests for known bugs in aov.car. ************************ ** afex VERSION 0.9-x ** ************************ Changes in afex Version 0.9-x Released April 2014 Significant User Visible Changes and New Features o added function aov4: another wrapper of car::Anova for ANOVA models specified via lme4::lmer syntax. o added return="marginal" to aov.car which returns the marginal means of all effects (i.e., grand mean and mean of main effects and interactions). Is also returned if return="full". o testing the intercept in mixed models in now only optional. The default is that the new argument test.intercept = FALSE. o removed return="lme4" from aov.car. o added argument intercept to nice.anova (default FALSE) which allows to selective display the intercept in an ANOVA table. o added method = "F" to mixed() which only returns the F-value but no ddf (and hence no p-value). Experimental, not documented. o renamed colname "stat" to "F" when method = "KR" (mixed). o added tests (currently mainly for mixed()) via pkg testthat, see tests/testthat. Bugfixes o increased requirement of R version and lme4 version. o print.mixed should now propagate all warnings from lme4 (i.e., also the new convergence warnings). o lme4 is now loaded at worker nodes for mixed (default, turn of via check.contrasts) ************************ ** afex VERSION 0.8-x ** ************************ Changes in afex Version 0.8-x Released February 2014 Significant User Visible Changes and New Features o removed renaming of within subject factor levels to names with length 1 (which was introduced in 0.6). o helper function round_ps which nicely rounds p-values is now exported. o warning about numerical non-centered variables in mixed is now a message only. o added examples data sets from Maxwell & Delaney (2004) for within-subjects ANOVA and mixed models. o reshape2 is now again in depends but coin only imported. Bugfixes o the default effect size (ges: generalized eta-squared) was calculated wrong (the error term for the intercept was not included). Sorry. This is now corrected (with new examples). o removed bug that aov.car didn't work when running some ANCOVAs (thanks to Gang Chen for reporting this). ************************ ** afex VERSION 0.7-x ** ************************ Changes in afex Version 0.7-x Released December 2013 Significant User Visible Changes and New Features o nicer output of print.mixed Bugfixes o mixed() correctly converts all non-formula arguments to formula correctly to a formula (gave error if formula was a different object and not-available on cluster nodes). Prints message if formula is converted to a formula. o Using multicore for fitting the models prodcued erroneous results (did not use correct contrasts at nodes). Now the current contrasts are also set at the nodes. o mixed() sets REML = FALSE if method = "LRT" and no family argument is present (i.e., for LMMs) as LRTs for models fitted with REML are not recommended. o on the cluster nodes now only the lme4 namespace is loaded (instead of using library) to avoid a CRAN note. ************************ ** afex VERSION 0.6-x ** ************************ Changes in afex Version 0.6-x Released September 2013 Significant User Visible Changes and New Features o added LRT tests to mixed() which should replicate the recommended test by Barr et al. (2013, JML). o multicore estimation of (g)lmer models now available through package parallel (argument cl) for mixed(). o added experimental "lme4" return method for aov.car and ez.glm (which fits the data using lmer). o reshape2 and stringr are not any more loaded when loading afex (are now only imported via Imports) Bugfixes o Type 2 tests of mixed() were implemented incorrectly (i.e., they did not give what they should have given according to the description in the help file). o aov.car() and ez.glm() now convert factor levels of within subjects factors to be of length one so that long levels do not lead to problems when constructing the call to lm. Thanks to Isaac Schwabacher for noticing this, see also: https://bugs.r-project.org/bugzilla3/show_bug.cgi?id=15377 o mixed should now work with missing values as it construes a new data object if the model.matrix from which the different versions are fitted has nrow different to nrow(data) (with warning). Thanks to Daniel Bunker for reporting this. o mixed should work with the newest version of lme4 (>= 1.0.4) and the newst version of pbkrtest (>= 0.3-5.1), but not with older versions (due to CRAN policy to disallow :::). ************************ ** afex VERSION 0.5-x ** ************************ Changes in afex Version 0.5-x Released May 2013 Significant User Visible Changes and New Features o added argument factorize (default: TRUE) to aov.car and ez.glm: all variables are now factorized per default. (now it is necessary to set factorize=FALSE for ANCOVAs!) o added argument per.parameter to mixed() which allows to specify variables for which each parameter is tested (not only the overall effect). Can be useful to test for ordered factors. (only implemented for "Type 3" tests) o added more informative startup message (thanks to Robert Volcic and Lars Konieczny) o mixed, ez.glm and aov.car now check for correct contrasts and set factors to contr.sum if other contrasts are found (can be tunred off via check.contrasts argument). Resetting the default contrast to contr.treatment should therefore not interfere with afex. (this is not intensly tested, so please report anything) o mixed checks numeric variables if they are centered on 0 (and gives warning if not). Bugfixes o checks if observed variable is in the data and throws an error if not (nice.anova) ************************ ** afex VERSION 0.4-x ** ************************ Changes in afex Version 0.4-x Released February 2013 Significant User Visible Changes and New Features o added generalized and partial eta-squared effect sizes to nice.anova (this also included adding observed arguments to aov.car, ez.glm, nice.anova) o added new return arguments to aov.car and ez.glm (nice, lm, data). o changed default return value of aov.car and ez.glm to "nice" which now returns a nice ANOVA table (nice.anova) o mixed has method = "PB" for obtaining parametric bootstrapped p-values (e.g., for GLMMs) o added alternative argument to compare.2.vectors. o aov.car (and ez.glm) now give a warning if observations are missing on within-subject factors. (As before, cases with missing values are simply excluded from the analysis) o had to disable saving of the previous contrasts and resetting those after detaching afex due to CRAN policies (no assignment in global environment). Bugfixes o Bug when running mixed() inside a function and handing the data.frame over as an argument fixed (thanks, again, to Florent Duyme). See bugs/eval.scoping.bug.R o nice.anova did not work with a model with only one within-subjects factor. ************************ ** afex VERSION 0.3-x ** ************************ Changes in afex Version 0.3-x Released August/September 2012 Significant User Visible Changes and New Features o added function compare.2.vectors(). o Name of function univariate() changed to univ(), as a function with this name is part of package multcomp. This may leed to problems. Thanks to Florent Duyme for spotting this. o added return argument to aov.car() and ez.glm(). o added rather dubious Type 2 tests to mixed(). o aov.car checks if each id is only present in one cell of the between subjects design. Bugfixes o aov.car now uses do.call when calling lm() to avoid local variables in the call to lm() which could led to problems when working with the lm model. o mixed() now passes ... (further arguments to lmer) correctly. (Now mixed uses match.call and eval on the call instead of invoking lmer directly.) o corrected bug that was introduced by pbkrtest v3.2 when invoking the print method to an object of class mixed (again thanks to Florent Duyme for spotting this). o removed bug when factor levels of within-subject factors were non-legal names (solution uses make.names). afex/R/0000755000176200001440000000000014076067000011376 5ustar liggesusersafex/R/residuals.R0000644000176200001440000000622614071313113013514 0ustar liggesusers#' Extract Residuals and Fitted Values from \code{afex_aov} objects #' #' Extract Residuals and Fitted Values from \code{afex_aov} objects. #' #' @author Mattan S. Ben-Shachar #' #' @example examples/examples.residuals.R #' #' @param object \code{afex_aov} object. #' @param append If set to \code{TRUE} returns the residuals/fitted values #' appended as an additional column to the long data. Recommended when data #' was aggregated across within conditions. #' @param colname_residuals,colname_fitted Name of the appended column when #' \code{append = TRUE}. #' @param ... Additional arguments passed to #' \code{residuals.lm}/\code{fitted.lm}. #' #' @return A vector of residuals/fitted values corresponding to the data in #' \code{object$data$long}, or if \code{append = TRUE} a data frame with an #' additional column of residuals/fitted values. #' #' @export #' @importFrom stats fitted reshape residuals residuals.afex_aov <- function(object, append = FALSE, colname_residuals = ".residuals", ...) { if (!append && attr(object, "data_changed")) { message("Data was changed during ANOVA calculation. ", "Thus, residuals cannot be added to original data.", "\nresiduals(..., append = TRUE) will return data and residuals.") } e <- residuals(object$lm, ...) .clean_model_values(object, model_values = e, values_colname = colname_residuals, append = append) } #' @export #' @rdname residuals.afex_aov fitted.afex_aov <- function(object, append = FALSE, colname_fitted = ".fitted", ...) { if (!append && attr(object, "data_changed")) { message("Data was changed during ANOVA calculation. ", "Thus, fitted values cannot be added to original data.", "\nfitted(..., append = TRUE) will return data and fitted values.") } e <- fitted(object$lm, ...) .clean_model_values(object, model_values = e, values_colname = colname_fitted, append = append) } #' @keywords internal .clean_model_values <- function(object, model_values, values_colname, append) { if (length(attr(object, "within")) > 0) { # In long format mv <- data.frame(model_values) varying <- colnames(mv) mv[attr(object, "id")] <- object$data$wide[attr(object, "id")] mv <- reshape( mv, direction = "long", varying = varying, v.names = values_colname, times = varying, timevar = ".time.", idvar = attr(object, "id") ) # add within data code <- data.frame(.time. = varying, .index. = seq_along(varying)) index <- object$data$idata index$.index. <- seq_len(nrow(index)) index <- merge(code, index, by = ".index.") mv <- merge(mv, index, by = ".time.") mv$.time. <- NULL mv$.index. <- NULL # add between data between_data <- object$data$long mv <- merge(between_data, mv, by = c(attr(object, "id"), names(attr(object, "within")))) } else { mv <- object$data$long mv[[values_colname]] <- model_values } if (append) { return(mv) } else { return(setNames(mv[[values_colname]],rownames(mv))) } }afex/R/afex_plot_utils.R0000644000176200001440000002703713667760652014755 0ustar liggesusers afex_plot_internal <- function(x, trace, panel, means, data, error_plot, error_arg, dodge, data_plot, data_geom, data_alpha, data_arg, point_arg, line_arg, mapping, legend_title, return) { if (length(trace) > 0) { means$trace <- interaction(means[trace], sep = "\n") data$trace <- interaction(data[trace], sep = "\n") if (return == "data") { return(list(means = means, data = data)) } else if (return == "plot") { return(interaction_plot(means = means, data = data, error_plot = error_plot, error_arg = error_arg, dodge = dodge, data_plot = data_plot, data_geom = data_geom, data_alpha = data_alpha, data_arg = data_arg, point_arg = point_arg, line_arg = line_arg, mapping = mapping, legend_title = if (missing(legend_title)) paste(trace, sep = "\n") else legend_title )) } } else { if (return == "data") { return(list(means = means, data = data)) } else if (return == "plot") { return(oneway_plot(means = means, data = data, error_plot = error_plot, error_arg = error_arg, data_plot = data_plot, data_geom = data_geom, data_alpha = data_alpha, data_arg = data_arg, point_arg = point_arg, mapping = mapping, legend_title = if (missing(legend_title)) paste(x, sep = "\n") else legend_title )) } } } se <- function(x, na.rm = FALSE) sd(x, na.rm = na.rm)/sqrt(length(x)) rename_factor_levels <- function(data, factor_levels, status_message = TRUE) { if (length(factor_levels) > 0) { if (is.null(names(factor_levels))) { stop("factor_levels needs to be a named list.", call. = FALSE) } if (any(!(names(factor_levels) %in% colnames(data)))) { if (status_message) { warning( "factor_levels: No factor named ", paste( paste0("'", names(factor_levels) [!(names(factor_levels) %in% colnames(data))], "'"), collapse = ", "), " in data.", call. = FALSE ) } factor_levels <- factor_levels[names(factor_levels) %in% colnames(data)] } for (i in seq_along(factor_levels)) { if (is.null(names(factor_levels[[i]]))) { if (length(factor_levels[[i]]) != length(levels(data[[names(factor_levels)[i]]]))) { stop("length of new factor_levels for '", names(factor_levels)[i], "' != length of factor levels.", call. = FALSE) } names(factor_levels[[i]]) <- levels(data[[names(factor_levels)[i]]]) } factor_levels[[i]] <- factor_levels[[i]][ names(factor_levels[[i]]) %in% levels(data[[names(factor_levels)[i]]]) ] if (status_message) { message("Renaming/reordering factor levels of '", names(factor_levels)[i], "':\n ", paste( paste( levels(data[[names(factor_levels)[i]]])[ match(names(factor_levels[[i]]), levels(data[[names(factor_levels)[i]]])) ], factor_levels[[i]], sep = " -> "), collapse = "\n ") ) } if (length(factor_levels[[i]]) == length(levels(data[[names(factor_levels)[i]]]))) { data[[names(factor_levels)[i]]] <- factor( x = data[[names(factor_levels)[i]]], levels = names(factor_levels[[i]]), labels = factor_levels[[i]] ) } else { levels(data[[names(factor_levels)[i]]])[ match(names(factor_levels[[i]]), levels(data[[names(factor_levels)[i]]])) ] <- factor_levels[[i]] } } } data } get_emms <- function(object, x, trace, panel, emmeans_arg, factor_levels, level) { if (!requireNamespace("emmeans", quietly = TRUE)) { stop("package emmeans is required.", call. = FALSE) } all_vars <- c(x, trace, panel) emmeans_arg$options$level <- level emms <- as.data.frame(do.call(emmeans::emmeans, args = c(object = list(object), specs = list(all_vars), type = list("response"), emmeans_arg))) emms <- rename_factor_levels( data = emms, factor_levels = factor_levels, status_message = TRUE ) emms$x <- interaction(emms[x], sep = "\n") #col_y <- colnames(emms)[which(colnames(emms) == "SE")-1] if (any(colnames(emms) == "SE")) { colnames(emms)[which(colnames(emms) == "SE")-1] <- "y" } else { colnames(emms)[grep("CL|HPD", colnames(emms))[1]-1] <- "y" } attr(emms, "dv") <- attr(object, "dv") attr(emms, "x") <- paste(x, collapse = " - ") if (length(panel) > 0) { emms$panel <- interaction(emms[panel], sep = "\n") } else { emms$panel <- "1" } emms$all_vars <- interaction(emms[all_vars], sep = ".") return(emms) } prep_data <- function(data, x, trace, panel, factor_levels, dv_col, id) { all_vars <- c(x, trace, panel) data <- rename_factor_levels( data = data, factor_levels = factor_levels, status_message = FALSE ) ## we have to make sure that if data already contains a column y, the correct ## one is used for aggregation here. ## the old code below led to problems in this case # colnames(data)[colnames(data) == dv_col] <- "y" # if (!is.numeric(data$y)) { # message("transforming dv to numerical scale") # data$y <- as.numeric(data$y) # } # data <- aggregate(data$y, by = data[c(all_vars,id)], # FUN = mean, drop = TRUE) #colnames(data)[colnames(data) == dv_col] <- "y" if (!is.numeric(data[[dv_col]])) { message("transforming dv to numerical scale") if (is.factor(data[[dv_col]])) { data[[dv_col]] <- as.numeric(data[[dv_col]]) - 1 } data[[dv_col]] <- as.numeric(data[[dv_col]]) } data <- aggregate(data[[dv_col]], by = data[c(all_vars,id)], FUN = mean, drop = TRUE) data$y <- data$x data$x <- interaction(data[x], sep = "\n") if (length(panel) > 0) { data$panel <- interaction(data[panel], sep = "\n") } else { data$panel <- "1" } data$all_vars <- interaction(data[all_vars], sep = ".") return(data) } get_plot_var <- function(x) { if (missing(x)) return() if (inherits(x, "formula")) { return(all.vars(x[[2]])) } else { return(x) } } get_data_based_cis <- function(emms, data, error, id, ## colname holding the id/grouping variable all_vars, within_vars, between_vars, error_level, error_ci) { error_plot <- TRUE ## SE/CI calculation: if (error == "model") { emms$error <- emms$SE # emms$lower <- emms$lower.CL # emms$upper <- emms$upper.CL col_cis <- grep("CL|HPD", colnames(emms), value = TRUE) col_cis <- col_cis[!(col_cis %in% all_vars)] emms$lower <- emms[,col_cis[1]] emms$upper <- emms[,col_cis[2]] } else if (error == "mean") { ses <- tapply(data$y, INDEX = list(data$all_vars), FUN = se) sizes <- tapply(data$y, INDEX = list(data$all_vars), FUN = length) stopifnot(emms$all_vars %in% names(ses)) emms$error <- ses[emms$all_vars] emms$lower <- emms$y - qt(1-(1-error_level)/2, sizes - 1) * emms$error emms$upper <- emms$y + qt(1-(1-error_level)/2, sizes - 1) * emms$error } else if (error %in% c("CMO", "within")) { if (length(within_vars) == 0) { stop("within-subject SE only possible if within-subject factors present.", call. = FALSE) } within_fac <- interaction(data[within_vars], sep = ".") indiv_means <- tapply(data$y, INDEX = data[id], FUN = mean) J <- length(levels(within_fac)) ## Cosineau & O'Brien (2014), Equation 2: new_y <- data$y - indiv_means[as.character(data[,id])] + mean(data$y) ## Cosineau & O'Brien (2014), Equation 4: y_bar <- tapply(new_y, INDEX = within_fac, FUN = mean) new_z <- sqrt(J / (J-1)) * (new_y - y_bar[within_fac]) + y_bar[within_fac] ses <- tapply(new_z, INDEX = list(data$all_vars), FUN = se) sizes <- tapply(new_z, INDEX = list(data$all_vars), FUN = length) stopifnot(emms$all_vars %in% names(ses)) emms$error <- ses[emms$all_vars] emms$lower <- emms$y - qt(1-(1-error_level)/2, sizes - 1) * emms$error emms$upper <- emms$y + qt(1-(1-error_level)/2, sizes - 1) * emms$error } else if (error == "between") { if (length(between_vars) > 0) { between_fac <- interaction(data[between_vars], sep = ".") } else { between_fac <- factor(rep("1", nrow(data))) } indiv_means <- aggregate(data$y, by = list( data[,id], between_fac), FUN = mean) ses <- tapply(indiv_means$x, INDEX = indiv_means[["Group.2"]], FUN = se) sizes <- tapply(indiv_means$x, INDEX = indiv_means[["Group.2"]], FUN = length) if (length(between_vars) == 0) { emms$error <- ses emms$lower <- emms$y - qt(1-(1-error_level)/2, sizes - 1) * emms$error emms$upper <- emms$y + qt(1-(1-error_level)/2, sizes - 1) * emms$error } else { emm_between <- interaction(emms[between_vars], sep = ".") emms$error <- ses[emm_between] emms$lower <- emms$y - qt(1-(1-error_level)/2, sizes[emm_between] - 1) * emms$error emms$upper <- emms$y + qt(1-(1-error_level)/2, sizes[emm_between] - 1) * emms$error } } else if (error == "none") { emms$error <- NA_real_ emms$lower <- NA_real_ emms$upper <- NA_real_ error_plot <- FALSE } if (!error_ci) { emms$lower <- emms$y - emms$error emms$upper <- emms$y + emms$error } return(list(emms = emms, error_plot = error_plot)) }afex/R/compare.2.vectors.R0000644000176200001440000002144113664111747015007 0ustar liggesusers#' Compare two vectors using various tests. #' #' Compares two vectors \code{x} and \code{y} using t-test, Welch-test (also known as Satterthwaite), Wilcoxon-test, and a permutation test implemented in \pkg{coin}. #' #' @usage compare.2.vectors(x, y, paired = FALSE, na.rm = FALSE, #' tests = c("parametric", "nonparametric"), coin = TRUE, #' alternative = "two.sided", #' perm.distribution, #' wilcox.exact = NULL, wilcox.correct = TRUE) #' #' @param x a (non-empty) numeric vector of data values. #' @param y a (non-empty) numeric vector of data values. #' @param paired a logical whether the data is paired. Default is \code{FALSE}. #' @param na.rm logical. Should \code{NA} be removed? Default is \code{FALSE}. #' @param tests Which tests to report, parametric or nonparamteric? The default \code{c("parametric", "nonparametric")} reports both. See details. (Arguments may be abbreviated). #' @param alternative a character, the alternative hypothesis must be one of \code{"two.sided"} (default), \code{"greater"} or \code{"less"}. You can specify just the initial letter, will be passed to all functions. #' @param coin logical or character. Should (permutation) tests from the \pkg{coin} package be reported? Default is \code{TRUE} corresponding to all implemented tests. \code{FALSE} calculates no tests from \pkg{coin}. A character vector may include any of the following (potentially abbreviated) implemented tests (see also Details): \code{c("permutation", "Wilcoxon", "median")} #' @param perm.distribution \code{distribution} argument to \pkg{coin}, see \code{\link[coin]{NullDistribution}} or , \code{\link[coin]{IndependenceTest}}. If missing, defaults to \code{coin::approximate(100000)} indicating an approximation of the excat conditional distribution with 100.000 Monte Carlo samples. One can use \code{"exact"} for small samples and if \code{paired = FALSE}. #' @param wilcox.exact \code{exact} argument to \code{\link{wilcox.test}}. #' @param wilcox.correct \code{correct} argument to \code{\link{wilcox.test}}. #' #' @details The \code{parametric} tests (currently) only contain the \emph{t}-test and Welch/Statterwaithe/Smith/unequal variance \emph{t}-test implemented in \code{\link{t.test}}. The latter one is only displayed if \code{paired = FALSE}. #' #' The \code{nonparametric} tests (currently) contain the Wilcoxon test implemented in \code{\link{wilcox.test}} (\code{stats::Wilcoxon}) and (if \code{coin = TRUE}) the following tests implemented in \pkg{coin}: #' #' \itemize{ #' \item a \code{permutation} test \code{\link[coin]{oneway_test}} (the only test in this selction not using a rank transformation), #' \item the \code{Wilcoxon} test \code{\link[coin]{wilcox_test}} (\code{coin::Wilcoxon}), and #' \item the \code{median} test \code{\link[coin]{median_test}}. #' } #' Note that the two implementations of the Wilcoxon test probably differ. This is due to differences in the calculation of the Null distributions. #' #' @return a list with up to two elements (i.e., \code{paramteric} and/or \code{nonparamteric}) each containing a \code{data.frame} with the following columns: \code{test}, \code{test.statistic}, \code{test.value}, \code{test.df}, \code{p}. #' #' @export compare.2.vectors # @importFrom coin oneway_test wilcox_test median_test approximate statistic pvalue #' @importFrom stats t.test wilcox.test #' @example examples/examples.compare.R #' #' @encoding UTF-8 #' compare.2.vectors <- function(x, y, paired = FALSE, na.rm = FALSE, tests = c("parametric", "nonparametric"), coin = TRUE, alternative = "two.sided", perm.distribution, wilcox.exact = NULL, wilcox.correct = TRUE) { tests <- match.arg(tests, c("parametric", "nonparametric"), several.ok = TRUE) if (na.rm) { x <- x[!is.na(x)] y <- y[!is.na(y)] } else if (any(is.na(x), is.na(y))) stop("NAs in data, use na.rm = TRUE.", call. = FALSE) out <- list() if (paired) if (!length(x) == length(y)) stop("length(x) needs to be equal to length(y) when paired is TRUE!", call. = FALSE) if ("parametric" %in% tests) { res.t <- t.test(x, y, paired = paired, var.equal = TRUE, alternative = alternative) parametric <- data.frame(test = "t", test.statistic = "t", test.value = res.t[["statistic"]], test.df = res.t[["parameter"]], p = res.t[["p.value"]], stringsAsFactors = FALSE) if (!paired) { res.welch <- t.test(x, y, paired = paired, var.equal = FALSE, alternative = alternative) parametric <- rbind(parametric, data.frame(test = "Welch", test.statistic = "t", test.value = res.welch[["statistic"]], test.df = res.welch[["parameter"]], p = res.welch[["p.value"]], stringsAsFactors = FALSE)) } rownames(parametric) <- NULL out <- c(out, list(parametric = parametric)) } if ("nonparametric" %in% tests) { implemented.tests <- c("permutation", "Wilcoxon", "median") res.wilcox <- wilcox.test(x, y, paired = paired, exact = wilcox.exact, correct = wilcox.correct, alternative = alternative) nonparametric <- data.frame(test = "stats::Wilcoxon", test.statistic = if (paired) "V" else "W", test.value = res.wilcox[["statistic"]], test.df = NA, p = res.wilcox[["p.value"]], stringsAsFactors = FALSE) if (!(coin == FALSE) && !requireNamespace("coin", quietly = TRUE)) { warning("package coin necessary if coin != FALSE.") coin <- FALSE } if (!(coin == FALSE)) { dv <- c(x, y) iv <- factor(rep(c("A", "B"), c(length(x), length(y)))) if (missing(perm.distribution)) { perm.distribution <- coin::approximate(100000) } if (paired) { id <- factor(rep(1:length(x), 2)) formula.coin <- as.formula(dv ~ iv | id) } else formula.coin <- as.formula(dv ~ iv) if (isTRUE(coin)) coin <- implemented.tests else coin <- match.arg(coin, implemented.tests, several.ok = TRUE) tryCatch(if ("permutation" %in% coin) { res.perm <- coin::oneway_test(formula.coin, distribution=perm.distribution, alternative = alternative) nonparametric <- rbind(nonparametric, data.frame(test = "permutation", test.statistic = "Z", test.value = coin::statistic(res.perm), test.df = NA, p = coin::pvalue(res.perm)[1], stringsAsFactors = FALSE)) }, error = function(e) warning(paste("coin::permutation test failed:", e))) tryCatch(if ("Wilcoxon" %in% coin) { res.coin.wilcox <- coin::wilcox_test(formula.coin, distribution=perm.distribution, alternative = alternative) nonparametric <- rbind(nonparametric, data.frame(test = "coin::Wilcoxon", test.statistic = "Z", test.value = coin::statistic(res.coin.wilcox), test.df = NA, p = coin::pvalue(res.coin.wilcox)[1], stringsAsFactors = FALSE)) }, error = function(e) warning(paste("coin::Wilcoxon test failed:", e))) tryCatch(if ("median" %in% coin) { res.median <- coin::median_test(formula.coin, distribution=perm.distribution, alternative = alternative) nonparametric <- rbind(nonparametric, data.frame(test = "median", test.statistic = "Z", test.value = coin::statistic(res.median), test.df = NA, p = coin::pvalue(res.median)[1], stringsAsFactors = FALSE)) }, error = function(e) warning(paste("coin::median test failed:", e))) } rownames(nonparametric) <- NULL out <- c(out, nonparametric = list(nonparametric)) } out } afex/R/ks2013.3-data.R0000644000176200001440000000646613664111747013542 0ustar liggesusers#' Data from Klauer & Singmann (2013, Experiment 3) #' #' Klauer and Singmann (2013) attempted to replicate an hypothesis of Morsanyi and Handley (2012) according to which individuals have an intuitive sense of logicality. Specifically, Morsanyi and Handley apparently provided evidence that the logical status of syllogisms (i.e., valid or invalid) affects participants liking ratings of the conclusion of syllogisms. Conclusions from valid syllogisms (e.g., Some snakes are poisonous. No poisonous animals are obbs. Some snakes are not obbs.) received higher liking ratings than conclusions from invalid syllogisms (e.g., No ice creams are vons. Some vons are hot. Some ice creams are not hot.). It is important to noted that in the experiments participants were simply shown the premises and conclusion in succession, they were not asked whether or not the conclusion follows or to generate their own conclusion. Their task was simply to judge how much they liked the "final" statement (i.e., the conclusion). #' #' In their Experiment 3 Klauer and Singmann (2013) tested the idea that this finding was a consequence of the materials used and not an effect intuitive logic. More specifically, they observed that in the original study by Morsanyi and Handley (2012) a specific content always appeared with the same logical status. For example, the "ice-cream" content only ever appeared as an invalid syllogism as in the example above but never in a valid syllogism. In other words, content was perfectly confounded with logical status in the original study. To test this they compared a condition in which the logical status was confounded with the content (the "fixed" condition) with a condition in which the contents were randomly assigned to a logical status across participants (the "random" condition). For example, the ice-cream content was, across participants, equally like to appear in the invalid form as given above or in the following valid form: No hot things are vons. Some vons are ice creams. Conclusion Some ice creams are not hot. #' #' The data.frame contains the raw responses of all 60 participants (30 per condition) reported in Klauer & Singmann (2013). Each participants provided 24 responses, 12 to valid and 12 to invalid syllogisms. Furthermore, 8 syllogisms had a believable conclusion (e.g., Some ice creams are not hot.), 8 had an abstract conclusion (e.g., Some snakes are not obbs.), and 8 had an unbelievable conclusion (e.g., Some animals are not monkeys.). The number of the contents corresponds to the numbering given in Morsanyi and Handley (2012, p. 616). #' #' #' @docType data #' @keywords dataset #' @name ks2013.3 #' @usage ks2013.3 #' @format A data.frame with 1440 rows and 6 variables. #' @source Klauer, K. C., & Singmann, H. (2013). Does logic feel good? Testing for intuitive detection of logicality in syllogistic reasoning. Journal of Experimental Psychology: Learning, Memory, and Cognition, 39(4), 1265-1273. http://doi.org/10.1037/a0030530 #' #' Morsanyi, K., & Handley, S. J. (2012). Logic feels so good-I like it! Evidence for intuitive detection of logicality in syllogistic reasoning. Journal of Experimental Psychology: Learning, Memory, and Cognition, 38(3), 596-616. http://doi.org/10.1037/a0026099 #' #' #' #' #' @encoding UTF-8 #' #' @example examples/examples.ks2013.3.R NULL afex/R/md_12.1-data.R0000644000176200001440000000523413664111747013507 0ustar liggesusers#' Data 12.1 from Maxwell & Delaney #' #' Hypothetical Reaction Time Data for 2 x 3 Perceptual Experiment: Example data for chapter 12 of Maaxwell and Delaney (2004, Table 12.1, p. 574) in long format. Has two within.subjects factors: angle and noise. #' #' Description from pp. 573: #' #' Suppose that a perceptual psychologist studying the visual system was interested in determining the #' extent to which interfering visual stimuli slow the ability to recognize letters. Subjects are #' brought into a laboratory and seated in front of a tachistoscope. Subjects are told that they will #' see either the letter T or the letter I displayed on the screen. In some trials, the letter appears #' by itself, but in other trials, the target letter is embedded in a group of other letters. This #' variation in the display constitutes the first factor, which is referred to as noise. The noise #' factor has two levels?absent and present. The other factor varied by the experimenter is where in #' the display the target letter appears. This factor, which is called angle, has three levels. The #' target letter is either shown at the center of the screen (i.e., 0° off-center, where the subject #' has been instructed to fixate), 4° off-center or 8° off-center (in each case, the deviation from the #' center varies randomly between left and right). Table 12.1 presents hypothetical data for 10 #' subjects. As usual, the sample size is kept small to make the calculations easier to follow. The #' dependent measure is reaction time (latency), measured in milliseconds (ms), required by a subject #' to identify the correct target letter. Notice that each subject has six scores, one for each #' combination of the 2 x 3 design. In an actual perceptual experiment, each of these six scores would #' itself be the mean score for that subject across a number of trials in the particular condition. #' Although "trials" could be used as a third within-subjects factor in such a situation, more #' typically trials are simply averaged over to obtain a more stable measure of the individual's #' performance in each condition. #' #' @docType data #' @keywords dataset #' @name md_12.1 #' @usage md_12.1 #' @format A data.frame with 60 rows and 4 variables. #' @source Maxwell, S. E., & Delaney, H. D. (2004). Designing experiments and analyzing data: a model-comparisons perspective. Mahwah, N.J.: Lawrence Erlbaum Associates. p. 574 #' #' @encoding UTF-8 #' #' @examples #' data(md_12.1) #' #' # Table 12.5 (p. 578): #' aov_ez("id", "rt", md_12.1, within = c("angle", "noise"), #' args.return=list(correction = "none", es = "none")) #' #' NULL afex/R/stroop-data.R0000644000176200001440000000463714071312623013767 0ustar liggesusers#' Stroop data from Lin et al. (2020, Psych. Science) #' #' #' Lin, Saunders, Friese, Evans, and Inzlicht (2020) investigated ego depletion. #' An initial high-demand task was followed by a Stroop task. The data of the #' Stroop task from all 4 of their studies is included here. #' #' Their abstract: People feel tired or depleted after exerting mental effort. #' But even preregistered studies often fail to find effects of exerting effort #' on behavioral performance in the laboratory or elucidate the underlying #' psychology. We tested a new paradigm in four preregistered within-subjects #' studies (N = 686). An initial high-demand task reliably elicited very strong #' effort phenomenology compared with a low-demand task. Afterward, participants #' completed a Stroop task. We used drift-diffusion modeling to obtain the #' boundary (response caution) and drift-rate (information-processing speed) #' parameters. Bayesian analyses indicated that the high-demand manipulation #' reduced boundary but not drift rate. Increased effort sensations further #' predicted reduced boundary. However, our demand manipulation did not affect #' subsequent inhibition, as assessed with traditional Stroop behavioral #' measures and additional diffusion-model analyses for conflict tasks. Thus, #' effort exertion reduced response caution rather than inhibitory control, #' suggesting that after exerting effort, people disengage and become #' uninterested in exerting further effort. #' #' #' #' @docType data #' @keywords dataset #' @name stroop #' @usage stroop #' @format A data frame with 246600 rows and 7 variables: #' \describe{ #' \item{pno}{participant id (preceded by study id), factor with 685 levels} #' \item{condition}{experimental condition (control/low demand, deplete/high demand), factor with 2 levels} #' \item{study}{study number (1, 2, 3, 4), factor with 4 levels} #' \item{trialnum}{trial number} #' \item{congruency}{Stroop congruency (congruent, incongruent), factor with 2 levels} #' \item{acc}{accuracy (0: error, 1: correct)} #' \item{rt}{reaction time (seconds)} #' } #' @source Lin, H., Saunders, B., Friese, M., Evans, N. J., & Inzlicht, M. #' (2020). Strong Effort Manipulations Reduce Response Caution: A #' Preregistered Reinvention of the Ego-Depletion Paradigm. *Psychological #' Science*, \doi{10.1177/0956797620904990} #' #' @encoding UTF-8 #' "stroop" afex/R/utils.R0000644000176200001440000001040313667765044012701 0ustar liggesusers check_contrasts <- function(data, factors, check_contrasts, type, warn = TRUE) { if (check_contrasts) { resetted <- NULL for (i in factors) { if (is.character(data[,i])) { data[,i] <- factor(data[,i]) } if (is.factor(data[,i])) { if (is.null(attr(data[,i], "contrasts")) & (options("contrasts")[[1]][1] != "contr.sum")) { contrasts(data[,i]) <- "contr.sum" resetted <- c(resetted, i) } else if (!is.null(attr(data[,i], "contrasts")) && attr(data[,i], "contrasts") != "contr.sum") { contrasts(data[,i]) <- "contr.sum" resetted <- c(resetted, i) } } } if (!is.null(resetted)) message(paste0("Contrasts set to contr.sum for the following variables: ", paste0(resetted, collapse=", "))) } else if (warn) { non_sum_contrast <- c() for (i in factors) { if (is.factor(data[,i])) { if (is.null(attr(data[,i], "contrasts")) & (options("contrasts")[[1]][1] != "contr.sum")) { non_sum_contrast <- c(non_sum_contrast, i) } else if (!is.null(attr(data[,i], "contrasts")) && attr(data[,i], "contrasts") != "contr.sum") { non_sum_contrast <- c(non_sum_contrast, i) } } } if((type == 3 | type == "III") && (length(non_sum_contrast)>0)) warning( paste0("Calculating Type 3 sums with contrasts != 'contr.sum' for: ", paste0(non_sum_contrast, collapse=", "), "\n Results likely bogus or not interpretable!\n", "You probably want check_contrasts = TRUE or ", "options(contrasts=c('contr.sum','contr.poly'))"), call. = FALSE) } return(data) } ## paste function that can replace stringr::str_c and differs from the way # paste handles NULL arguments as last arguments. # It checks whether the first or last char of the string is equal to sep and # removes it in this case. mypaste <- function(..., sep) { tmp <- paste(..., sep = sep) if (substr(tmp, nchar(tmp), nchar(tmp)) == sep) { tmp <- substr(tmp, 1, nchar(tmp)-1) } if (substr(tmp, 1, 1) == sep) { tmp <- substr(tmp, 2, nchar(tmp)) } tmp } escape_vars <- function(names) { if (length(names) == 0) return(names) names <- vapply(names, function(name) { if (make.names(name) != name) { name <- gsub('\\', '\\\\', name, fixed=TRUE) name <- gsub('`', '\\`', name, fixed=TRUE) name <- paste0('`', name, '`') } name }, FUN.VALUE='', USE.NAMES=FALSE) names } # decompose functions from jmvcore decomposeTerm <- function(term) { chars <- strsplit(term, '')[[1]] components <- character() componentChars <- character() inQuote <- FALSE i <- 1 n <- length(chars) while (i <= n) { char <- chars[i] if (char == '`') { inQuote <- ! inQuote } else if (char == '\\') { i <- i + 1 char <- chars[i] componentChars <- c(componentChars, char) } else if (char == ':' && inQuote == FALSE) { component <- paste0(componentChars, collapse='') components <- c(components, component) componentChars <- character() } else { componentChars <- c(componentChars, char) } i <- i + 1 } component <- paste0(componentChars, collapse='') components <- c(components, component) components } print_legend <- function(x) { sig_symbols <- as.character(attr(x, "sig_symbols")) if(length(sig_symbols) > 0 & !all(sig_symbols == rep("", 4))) { sleg <- attr(stats::symnum(0, cutpoints = c(0, 0.001, 0.01, 0.05, 0.1, 1), symbols = rev(c(" " , trimws(sig_symbols)))), "legend") width <- getOption("width") if(width < nchar(sleg)) { sleg <- strwrap(sleg, width = width - 2, prefix = " ") } cat("---\nSignif. codes: ", sleg, sep = "", fill = getOption("width") + 4 + max(nchar(sleg, "bytes") - nchar(sleg))) } } afex/R/zzz.R0000644000176200001440000000473714076011251012366 0ustar liggesusers ## set default options for afex_options: .onLoad <- function(libname, pkgname) { op <- options() op.afex <- list( afex.type = 3, afex.set_data_arg = FALSE, afex.check_contrasts = TRUE, afex.method_mixed = "S", afex.return_aov = "afex_aov", afex.es_aov = "ges", afex.correction_aov = "GG", afex.factorize = TRUE, afex.lmer_function = "lmerTest", afex.sig_symbols = c(" +", " *", " **", " ***"), afex.emmeans_model = c("multivariate"), afex.include_aov = FALSE, afex.round_ps = round_ps_apa ) toset <- !(names(op.afex) %in% names(op)) if(any(toset)) options(op.afex[toset]) if (requireNamespace("emmeans", quietly = TRUE)) { emmeans::.emm_register(c("mixed", "afex_aov"), pkgname) } invisible() } .onAttach <- function(libname, pkgname) { #assign(".oldContrasts", options("contrasts"), envir = .GlobalEnv) packageStartupMessage("************\nWelcome to afex. For support visit: http://afex.singmann.science/") packageStartupMessage("- Functions for ANOVAs: aov_car(), aov_ez(), and aov_4()\n- Methods for calculating p-values with mixed(): 'S', 'KR', 'LRT', and 'PB'\n- 'afex_aov' and 'mixed' objects can be passed to emmeans() for follow-up tests\n- NEWS: emmeans() for ANOVA models now uses model = 'multivariate' as default.\n- Get and set global package options with: afex_options()\n- Set orthogonal sum-to-zero contrasts globally: set_sum_contrasts()\n- For example analyses see: browseVignettes(\"afex\")\n************") #if (options("contrasts")[[1]][1] != "contr.sum") { #packageStartupMessage("Setting contrasts to effects coding: options(contrasts=c('contr.sum', 'contr.poly'))\nThis affects all functions using contrasts (e.g., lmer, lm, aov, ...).\nTo reset default settings run: options(contrasts=c('contr.treatment', 'contr.poly')) (all afex functions should be unaffected by this)\n") # \nPrevious contrasts saved in '.oldContrasts'. #options(contrasts=c('contr.sum', 'contr.poly')) #} else packageStartupMessage("Contrasts already set to effects coding: options(contrasts=c('contr.sum', '...'))\n") #packageStartupMessage("afex loads the required packages (e.g., lme4, car, pbkrtest) in an order that should not lead to problems.\nLoading any of the packages (specifically lme4) beforehand can lead to problems (especially with older versions of either).\nLoading nlme in addition to afex (before or after loading it), may especially lead to problems.\n************") } afex/R/afex_plot_plotting_functions.R0000644000176200001440000002114513667760652017537 0ustar liggesusers###if(getRversion() >= "2.15.1") utils::globalVariables(c("error", "y", "x")) #' @rdname afex_plot #' @export interaction_plot <- function(means, data, mapping = c("shape", "lineytpe"), error_plot = TRUE, error_arg = list(width = 0), data_plot = TRUE, data_geom = ggplot2::geom_point, data_alpha = 0.5, data_arg = list(color = "darkgrey"), point_arg = list(), line_arg = list(), dodge = 0.5, legend_title, col_x = "x", col_y = "y", col_trace = "trace", col_panel = "panel", col_lower = "lower", col_upper = "upper") { if (!requireNamespace("ggplot2", quietly = TRUE)) { stop("package ggplot2 is required.", call. = FALSE) } if (missing(mapping)) { mapping <- c('shape', 'linetype') } else if (length(mapping) == 0) { stop("mapping cannot be empty. Possible values: 'shape', 'color', 'linetype'.", call. = FALSE) } tmp_list <- as.list(rep(col_trace, length(mapping))) names(tmp_list) <- mapping error_mapping <- mapping[!(mapping %in% c("linetype", "shape", "fill"))] tmp_list_error <- as.list(rep(col_trace, length(error_mapping))) names(tmp_list_error) <- error_mapping plot_out <- ggplot2::ggplot(data = means, mapping = do.call( what = ggplot2::aes_string, args = c(list( y = col_y, x = col_x, group = col_trace), tmp_list))) if (data_plot) { if (missing(data_geom)) { data_geom <- ggplot2::geom_point } data_arg$alpha <- data_alpha if (!("position" %in% names(data_arg)) & ("position" %in% names(formals(data_geom)))) { data_arg$position = ggplot2::position_dodge(width = dodge) } plot_out <- plot_out + do.call(what = data_geom, args = c( #mapping = list(ggplot2::aes(group = interaction(x, trace))), mapping = list( ggplot2::aes_string( group = paste0("interaction(", paste0(c(col_x, col_trace), collapse = ", "), ")") )), data = list(data), data_arg ) ) } for (i in levels(data$trace)) { tmp_means <- means tmp_means[means$trace != i, c(col_y, col_lower, col_upper)] <- NA #tmp_means <- tmp_means[means$trace == i,] plot_out <- plot_out + do.call(what = ggplot2::geom_point, args = c( data = list(tmp_means), position = list( ggplot2::position_dodge(width = dodge) ), point_arg, na.rm = list(TRUE) )) + do.call(what = ggplot2::geom_line, args = c( data = list(tmp_means), position = list( ggplot2::position_dodge(width = dodge) ), line_arg, na.rm = list(TRUE) )) if (error_plot) { plot_out <- plot_out + do.call(what = ggplot2::geom_errorbar, args = c( data = list(tmp_means), mapping = list(do.call( what = ggplot2::aes_string, args = c(list( x = col_x, ymin = col_lower, ymax = col_upper, group = col_trace), tmp_list_error))), position = list(ggplot2::position_dodge(width = dodge)), error_arg, na.rm = list(TRUE), inherit.aes = list(FALSE) )) } } if (length(unique(means$panel)) > 1) { plot_out <- plot_out + ggplot2::facet_wrap(facets = "panel") } ## add labels if (!is.null(attr(means, "dv"))) { plot_out <- plot_out + ggplot2::ylab(attr(means, "dv")) } if (!is.null(attr(means, "x"))) { plot_out <- plot_out + ggplot2::xlab(attr(means, "x")) } if (!missing(legend_title)) { legend_title <- paste(legend_title, collapse = "\n") tmp_list <- rep(list(ggplot2::guide_legend(title = legend_title)), length(mapping)) names(tmp_list) <- mapping plot_out <- plot_out + do.call(what = ggplot2::guides, args = tmp_list) } return(plot_out) } #' @rdname afex_plot #' @export oneway_plot <- function(means, data, mapping = "", error_plot = TRUE, error_arg = list(width = 0), data_plot = TRUE, data_geom = ggbeeswarm::geom_beeswarm, data_alpha = 0.5, data_arg = list(color = "darkgrey"), point_arg = list(), legend_title, col_x = "x", col_y = "y", col_panel = "panel", col_lower = "lower", col_upper = "upper") { if (!requireNamespace("ggplot2", quietly = TRUE)) { stop("package ggplot2 is required.", call. = FALSE) } if (missing(mapping)) { mapping <- "" } if (length(mapping) > 1 || mapping[1] != "") { tmp_list <- as.list(rep(col_x, length(mapping))) names(tmp_list) <- mapping error_mapping <- mapping[!(mapping %in% c("linetype", "shape", "fill"))] tmp_list_error <- as.list(rep(col_x, length(error_mapping))) names(tmp_list_error) <- error_mapping } else { tmp_list <- list() tmp_list_error <- list() } plot_out <- ggplot2::ggplot(data = means, mapping = do.call( what = ggplot2::aes_string, args = c(list( y = col_y, x = col_x, group = col_x), tmp_list))) if (data_plot) { if (missing(data_geom)) { if (!requireNamespace("ggbeeswarm", quietly = TRUE)) { stop("package ggbeeswarm is required.", call. = FALSE) } data_geom <- ggbeeswarm::geom_beeswarm } data_arg$alpha <- data_alpha plot_out <- plot_out + do.call(what = data_geom, args = c( data = list(data), data_arg ) ) } plot_out <- plot_out + do.call(what = ggplot2::geom_point, args = point_arg) if (error_plot) { plot_out <- plot_out + do.call(what = ggplot2::geom_errorbar, args = c( mapping = list(do.call( what = ggplot2::aes_string, args = c(list( x = col_x, ymin = col_lower, ymax = col_upper), tmp_list_error))), error_arg, inherit.aes = list(FALSE) )) } if (length(unique(means$panel)) > 1) { plot_out <- plot_out + ggplot2::facet_wrap(facets = "panel") } ## add labels if (!is.null(attr(means, "dv"))) { plot_out <- plot_out + ggplot2::ylab(attr(means, "dv")) } if (!is.null(attr(means, "x"))) { plot_out <- plot_out + ggplot2::xlab(attr(means, "x")) } if (!missing(legend_title)) { legend_title <- paste(legend_title, collapse = "\n") tmp_list <- rep(list(ggplot2::guide_legend(title = legend_title)), length(mapping)) names(tmp_list) <- mapping plot_out <- plot_out + do.call(what = ggplot2::guides, args = tmp_list) } return(plot_out) } afex/R/afex-package.R0000644000176200001440000000027213664111747014050 0ustar liggesusers#' \packageDescription{afex} #' #' The DESCRIPTION file: #' \packageDESCRIPTION{afex} #' #' @title #' \packageTitle{afex} #' #' Maintainer: \packageMaintainer{afex} "_PACKAGE" afex/R/obk.long-data.R0000644000176200001440000000562113664111747014157 0ustar liggesusers#' O'Brien Kaiser's Repeated-Measures Dataset with Covariate #' #' This is the long version of the \code{OBrienKaiser} dataset from the \pkg{car} pakage adding a random covariate \code{age}. Originally the dataset ist taken from O'Brien and Kaiser (1985). The description from \code{\link[carData]{OBrienKaiser}} says: "These contrived repeated-measures data are taken from O'Brien and Kaiser (1985). The data are from an imaginary study in which 16 female and male subjects, who are divided into three treatments, are measured at a pretest, postest, and a follow-up session; during each session, they are measured at five occasions at intervals of one hour. The design, therefore, has two between-subject and two within-subject factors." #' #' @docType data #' @keywords dataset #' @name obk.long #' @usage obk.long #' @format A data frame with 240 rows and 7 variables. #' @source O'Brien, R. G., & Kaiser, M. K. (1985). MANOVA method for analyzing repeated measures designs: An extensive primer. \emph{Psychological Bulletin}, 97, 316-333. doi:10.1037/0033-2909.97.2.316 #' #' @encoding UTF-8 #' #' @examples #' # The dataset is constructed as follows: #' data("OBrienKaiser", package = "carData") #' set.seed(1) #' OBrienKaiser2 <- within(OBrienKaiser, { #' id <- factor(1:nrow(OBrienKaiser)) #' age <- scale(sample(18:35, nrow(OBrienKaiser), replace = TRUE), scale = FALSE)}) #' attributes(OBrienKaiser2$age) <- NULL # needed or resahpe2::melt throws an error. #' OBrienKaiser2$age <- as.numeric(OBrienKaiser2$age) #' obk.long <- reshape2::melt(OBrienKaiser2, id.vars = c("id", "treatment", "gender", "age")) #' obk.long[,c("phase", "hour")] <- lapply(as.data.frame(do.call(rbind, #' strsplit(as.character(obk.long$variable), "\\."),)), factor) #' obk.long <- obk.long[,c("id", "treatment", "gender", "age", "phase", "hour", "value")] #' obk.long <- obk.long[order(obk.long$id),] #' rownames(obk.long) <- NULL #' str(obk.long) #' ## 'data.frame': 240 obs. of 7 variables: #' ## $ id : Factor w/ 16 levels "1","2","3","4",..: 1 1 1 1 1 1 1 1 1 1 ... #' ## $ treatment: Factor w/ 3 levels "control","A",..: 1 1 1 1 1 1 1 1 1 1 ... #' ## $ gender : Factor w/ 2 levels "F","M": 2 2 2 2 2 2 2 2 2 2 ... #' ## $ age : num -4.75 -4.75 -4.75 -4.75 -4.75 -4.75 -4.75 -4.75 -4.75 -4.75 ... #' ## $ phase : Factor w/ 3 levels "fup","post","pre": 3 3 3 3 3 2 2 2 2 2 ... #' ## $ hour : Factor w/ 5 levels "1","2","3","4",..: 1 2 3 4 5 1 2 3 4 5 ... #' ## $ value : num 1 2 4 2 1 3 2 5 3 2 ... #' head(obk.long) #' ## id treatment gender age phase hour value #' ## 1 1 control M -4.75 pre 1 1 #' ## 2 1 control M -4.75 pre 2 2 #' ## 3 1 control M -4.75 pre 3 4 #' ## 4 1 control M -4.75 pre 4 2 #' ## 5 1 control M -4.75 pre 5 1 #' ## 6 1 control M -4.75 post 1 3 NULL afex/R/helpers.R0000644000176200001440000001113613664111747013177 0ustar liggesusers#' Set/get global afex options #' #' Global afex options are used, for example, by \code{\link{aov_car}} (et al.) #' and \code{\link{mixed}}. But can be changed in each functions directly using #' an argument (which has precedence over the global options). #' #' @param ... One of four: (1) nothing, then returns all options as a list; (2) #' a name of an option element, then returns its' value; (3) a name-value pair #' which sets the corresponding option to the new value (and returns nothing), #' (4) a list with option-value pairs which sets all the corresponding #' arguments. The example show all possible cases. #' #' @details The following arguments are currently set: #' \itemize{ #' \item \code{check_contrasts} should contrasts be checked and changed to #' sum-to-zero contrasts? Default is \code{TRUE}. #' \item \code{type} type of sums-of-squares to be used for testing effects, #' default is 3 which reports Type 3 tests. #' \item \code{method_mixed}: Method used to obtain p-values in #' \code{\link{mixed}}, default is \code{"KR"} (which will change to #' \code{"LRT"} soon). (\code{mixed()} only) #' \item \code{es_aov}: Effect size reported for ANOVAs (see #' \code{\link{aov_car}}), default is \code{"ges"} (generalized eta-squared). #' \item \code{correction_aov}: Correction used for within-subjects factors with #' more than two levels for ANOVAs (see \code{\link{aov_car}} or #' \code{\link{nice}}), default is \code{"GG"} (Greenhouse-Geisser correction). #' (ANOVA functions only) #' \item \code{emmeans_model}: Which model should be used by \pkg{emmeans} for #' follow-up analysis of ANOVAs (i.e., objects pf class \code{"afex_aov"})? #' Default is \code{"univariate"} which uses the \code{aov} model object (if #' present). The other option is \code{"multivariate"} which uses the \code{lm} #' model object (which is an object of class \code{"mlm"} in case #' repeated-measures factors are present). #' \item \code{include_aov}: Should the \code{aov} model be included into ANOVA objects of class \code{"afex_aov"}? Setting this to \code{FALSE} can lead to considerable speed improvements. #' \item \code{factorize}: Should between subject factors be factorized (with #' note) before running the analysis? Default is \code{TRUE}. (ANOVA functions #' only) #' \item \code{sig_symbols}: Default significant symbols used for ANOVA and #' \code{mixed} printing. Default is\code{c(" +", " *", " **", " ***")}. #' \item \code{lmer_function}: Which \code{lmer} function should \code{mixed} or #' \code{lmer_alt} use. The default is \code{"lmerTest"} which uses #' \code{\link[lmerTest]{lmer}}, \code{"lme4"} is also possible which uses #' \code{\link[lme4]{lmer}}. Note that \code{mixed} methods \code{"KR"} and #' \code{"S"} only work with \code{"lmerTest"}. For the other methods, #' \code{"lme4"} could be minimally faster, but does not allow to use #' \code{lmerTest::anova()}. #' \item \code{return_aov}: Return value of the ANOVA functions (see #' \code{\link{aov_car}}), default is \code{"nice"}. #' } #' #' @note All options are saved in the global R \code{\link{options}} with prefix #' \code{afex.} #' #' @return depends on input, see above. #' #' @example examples/examples.helpers.R #' #' @export # afex_options <- function(...) # { # dots <- list(...) # if (length(dots) == 0) return(ls.str(envir = .afexEnv)) # else { # if (!is.null(names(dots))) { # if (length(dots) > 1) stop("afex_options can only return a single element.") # for (i in seq_along(dots)) { # assign(names(dots)[i], dots[[i]], envir = .afexEnv) # } # } else return(get(dots[[1]], envir = .afexEnv)) # } # } afex_options <- function(...) { dots <- list(...) #browser() if (length(dots) == 0) { # branch to get all afex options op <- options() afex_op <- op[grepl("^afex.", names(op))] names(afex_op) <- sub("^afex.", "", names(afex_op)) return(afex_op) } else if (is.list(dots[[1]])) { # set several afex options as a list: newop <- dots[[1]] names(newop) <- paste0("afex.", names(newop)) options(newop) } else if (!is.null(names(dots))) { newop <- dots names(newop) <- paste0("afex.", names(newop)) options(newop) } else if (is.null(names(dots))) { # get a single afex options if (length(dots) > 1) stop("afex_options() can only return the value of a single option.", call. = FALSE) return(getOption(paste0("afex.", unlist(dots)))) } else { warning("Unsopported command to afex_options(), nothing done.", call. = FALSE) } } afex/R/deprecated.R0000644000176200001440000000340214071313113013612 0ustar liggesusers#' Deprecated functions #' #' These functions have been renamed or moved and deprecated in \pkg{afex}: #' \code{aov.car()} (use \code{\link{aov_car}()}), #' \code{ez.glm()} (use \code{\link{aov_ez}()}), #' \code{aov4()} (use \code{\link{aov_4}()}), #' \code{test_levene()} (use \code{\link[performance]{check_homogeneity}()}), #' \code{test_sphericity()} (use \code{\link[performance]{check_sphericity}()}). #' @rdname deprecated #' @keywords internal #' @aliases afex-deprecated #' @param ... arguments passed from the old functions of the style #' \code{foo.bar()} to the new functions \code{foo_bar()} #' @export aov.car <- function(...) { .Deprecated("aov_car", "afex", "aov.car was renamed to aov_car and is now deprecated.") aov_car(...) } #' @rdname deprecated #' @export ez.glm <- function(...) { .Deprecated("aov_ez", "afex", "ez.glm was renamed to aov_ez and is now deprecated.") aov_ez(...) } #' @rdname deprecated #' @export aov4 <- function(...) { .Deprecated("aov_4", "afex", "aov4 was renamed to aov_4 and is now deprecated.") aov_4(...) } #' @rdname deprecated #' @export test_levene <- function(...){ .Deprecated("check_homogeneity", "afex", "Functionality has moved to the 'performance' package.\nCalling 'performance::check_homogeneity()'.") performance::check_homogeneity(...) } #' @rdname deprecated #' @export test_sphericity<- function(...){ .Deprecated("check_sphericity", "afex", "Functionality has moved to the 'performance' package.\nCalling 'performance::check_sphericity()'.") performance::check_sphericity(...) } warn_deprecated_arg <- function(name, instead) { warning(gettextf("'%s' is deprecated; use '%s' instead", name, instead), call.=FALSE, domain=NA) } afex/R/laptop_urry-data.R0000644000176200001440000000604314076011251015010 0ustar liggesusers#' Replication of Laptop Note Taking Study (Urry et al. 2021, Psych. Science) #' #' Original abstract: #' In this direct replication of Mueller and Oppenheimer’s (2014) Study 1, #' participants watched a lecture while taking notes with a laptop (n = 74) or #' longhand (n = 68). After a brief distraction and without the opportunity to #' study, they took a quiz. As in the original study, laptop participants took #' notes containing more words spoken verbatim by the lecturer and more words #' overall than did longhand participants. However, laptop participants did not #' perform better than longhand participants on the quiz. #' #' Own description: #' #' Heather Urry and 87 of her undergraduate and graduate students (yes, all 87 #' students are co-authors!) compared the effectiveness of taking notes on a #' laptop versus longhand (i.e., pen and paper) for learning from lectures. 142 #' participants (which differed from the 88 authors) first viewed one of several #' 15 minutes lectures (TED talks) during which they were asked to take notes #' either on a laptop or with pen and paper. Participants were randomly assigned #' to either the laptop (N = 68) or longhand condition (N = 74). After a 30 #' minutes delay, participants were quizzed on the content of the lecture. There #' were two types of questions, factual and conceptual questions. The answers #' from each participant were then independently rated from several raters #' (which agreed very strongly with each other) using a standardised scoring key #' producing one memory score per participant and questions type ranging from 0 #' (= no memory) to 100 (= perfect memory). We also aggregated the two different #' scores into one overall memory score. #' #' #' @docType data #' @keywords dataset #' @name laptop_urry #' @usage laptop_urry #' @format A data frame with 142 rows and 6 variables: #' \describe{ #' \item{pid}{participant id, factor with 142 levels} #' \item{condition}{experimental condition (laptop, longhand), factor with 2 levels} #' \item{talk}{TED talk seen by participant, factor with 5 levels} #' \item{overall}{overall memory score ranging from 0 (= no memory) to 100 (= perfect memory).} #' \item{factual}{memory score on the factual questions ranging from 0 (= no memory) to 100 (= perfect memory).} #' \item{conceptual}{memory score on the conceptual questions ranging from 0 (= no memory) to 100 (= perfect memory).} #' } #' @source Urry, H. L., Crittle, C. S., Floerke, V. A., Leonard, M. Z., Perry, #' C. S., Akdilek, N., Albert, E. R., Block, A. J., Bollinger, C. A., Bowers, #' E. M., Brody, R. S., Burk, K. C., Burnstein, A., Chan, A. K., Chan, P. C., #' Chang, L. J., Chen, E., Chiarawongse, C. P., Chin, G., … Zarrow, J. E. #' (2021). Don’t Ditch the Laptop Just Yet: A Direct Replication of Mueller #' and Oppenheimer’s (2014) Study 1 Plus Mini Meta-Analyses Across Similar #' Studies. *Psychological Science*, 0956797620965541. #' \doi{10.1177/0956797620965541} #' #' @encoding UTF-8 #' "laptop_urry" afex/R/predict.R0000644000176200001440000000366714071313113013161 0ustar liggesusers#' Predict method for \code{afex_aov} objects #' #' Predicted values based on \code{afex_aov} objects. #' #' @author Mattan S. Ben-Shachar #' #' @example examples/examples.predict.R #' #' @param newdata An optional data frame in which to look for variables with #' which to predict. If omitted, the fitted values are used. #' @param colname_predict Name of the appended column when \code{append = TRUE}. #' @inheritParams residuals.afex_aov #' @param ... Not used. #' #' @return A vector of predicted values corresponding to the data in #' \code{object$data$long} or to \code{newdata}, or if \code{append = TRUE} a #' data frame with an additional column of predicted values. #' #' @export #' @importFrom stats predict fitted predict.afex_aov <- function(object, newdata, append = FALSE, colname_predict = ".predict", ...) { # if no newdata, get fitted if (missing(newdata)) { return(fitted(object, append = append, colname_predict = colname_predict)) } # soft factorize numeric data for (col in colnames(newdata)) { if (is.numeric(newdata[[col]])) { i <- which(colnames(object$data$long) == col) if (length(i) && !is.numeric(object$data$long[[i]])) { newdata[[col]] <- as.character(newdata[[col]]) } } } # get predicted values pred <- predict(object$lm, newdata = newdata) colnames(pred) <- colnames(fitted(object$lm)) # if any within, needs some clean up if (length(attr(object, "within")) > 0) { within <- attr(object, "within") # make long ~ pred <- sapply(seq_len(nrow(pred)), function(i) { temp_pred <- pred w_rm <- sapply(newdata[i, names(within)], make.names, unique = TRUE) w_rm <- paste0(w_rm, collapse = "_") temp_pred[i, w_rm] }) pred <- setNames(pred, rownames(newdata)) } if (append) { newdata[[colname_predict]] <- pred return(newdata) } else { return(pred) } } afex/R/round_ps.R0000644000176200001440000000300013667760652013365 0ustar liggesusers#' Helper functions for rounding p-values #' #' These functions return a character vector of p-values that are rounded as #' described below and without the leading zero before the decimal point. #' #' For \code{round_ps} p-values are rounded in a sane way: .99 - .01 to two #' digits, < .01 to three digits, < .001 to four digits. #' #' For \code{round_ps_apa} p-values are rounded following APA guidelines: .999 - #' .001 to three digits, and < .001 for values below this threshold. #' #' @param x a numeric vector #' #' @return A character vector with the same length as x. #' #' @note These functions are useful in \code{\link{nice}} and the default is set #' via \code{\link{afex_options}}. #' #' @author Henrik Singmann #' #' @encoding UTF-8 #' #' @examples #' x <- runif(10) #' y <- runif(10, 0, .01) #' #' round_ps(x) #' round_ps_apa(x) #' #' round_ps(y) #' round_ps_apa(y) #' #' round_ps(0.0000000099) #' round_ps_apa(0.0000000099) #' #' @export round_ps <- function(x) { substr(as.character(ifelse(x < 0.0001, " <.0001", ifelse(x < 0.001, formatC(x, digits = 4, format = "f"), ifelse(x < 0.01, formatC(x, digits = 3, format = "f"), ifelse(round(x, 2) == 1, " >.99", formatC(x, digits = 2, format = "f")))))), 2, 7) } #' @rdname round_ps #' @export round_ps_apa <- function(x) { substr(as.character( ifelse(x < 0.001, " <.001", ifelse(round(x, 3) == 1, " >.999", formatC(x, digits = 3, format = "f")) ) ), 2, 7) } afex/R/lmerTest_utils.R0000644000176200001440000000677513664111747014571 0ustar liggesusers #' @importFrom utils packageVersion #' @importFrom methods as #' @importFrom stats anova lmerTest_anova <- function(object, ...) { # Produce lmerTest-anova table for lmer-model fits (lme4 or lmerTest) with old # as well as new lmerTest package. # Standard method dispatch for all non-lmerMod objects. pkg_version <- "2.0-37.9005" if(!inherits(object, "lmerMod")) return(anova(object, ...)) # non-lmer objects if(requireNamespace("lmerTest", quietly=TRUE) && packageVersion("lmerTest") < pkg_version) { stop("Newer version of lmerTest is required.") } if(requireNamespace("lmerTest", quietly=TRUE) && packageVersion("lmerTest") >= pkg_version) { if(inherits(object, "lmerModLmerTest")) return(anova(object, ...)) else # lmerTest object return(anova(lmerTest::as_lmerModLmerTest(object), ...)) # lme4 object } return(anova(object, ...)) # *merModLmerTest objects and/or 'lmerTest' is not available } lmerTest_summary <- function(object, ...) { # Produce lmerTest-summary for lmer-model fits (lme4 or lmerTest) with old # as well as new lmerTest package. # Standard method dispatch for all non-lmerMod objects. pkg_version <- "2.0-37.9005" if(!inherits(object, "lmerMod")) return(summary(object, ...)) # non-lmer objects if(requireNamespace("lmerTest", quietly=TRUE) && packageVersion("lmerTest") < pkg_version) { stop("Newer version of lmerTest is required.") } if(requireNamespace("lmerTest", quietly=TRUE) && packageVersion("lmerTest") >= pkg_version) { if(inherits(object, "lmerModLmerTest")) return(summary(object, ...)) else # lmerTest object return(summary(lmerTest::as_lmerModLmerTest(object), ...)) # lme4 object } return(summary(object, ...)) # *merModLmerTest objects and/or 'lmerTest' is not available } is_lmerTest_class <- function(object) # Check if an object is of class merModLmerTest or lmerModLmerTest # Bridges across versions of lmerTest inherits(object, "merModLmerTest") || inherits(object, "lmerModLmerTest") # anova_lmerTest <- function(object, ...) { # # Dispatch the right anova method across lmerTest versions # if(is_lmerTest_class(object) && requireNamespace("lmerTest", quietly = TRUE)) { # if(packageVersion("lmerTest") < "2.0.37.90012") # return(lmerTest::anova(object, ...)) else return(anova(object, ...)) # } else if(inherits(object, "merMod") && requireNamespace("lmerTest", quietly = TRUE)) { # if(packageVersion("lmerTest") < "2.0.37.90012") # return(lmerTest::anova(as(object, "merModLmerTest"), ...)) else # return(anova(lmerTest::as_lmerModLmerTest(object), ...)) # } # Default: # anova(object, ...) # } # # summary_lmerTest <- function(object, ...) { # # Dispatch the right summary method across lmerTest versions # if(is_lmerTest_class(object) && requireNamespace("lmerTest", quietly = TRUE)) { # if(packageVersion("lmerTest") < "2.0.37.90012") # return(lmerTest::summary(object, ...)) else return(summary(object, ...)) # } else if(inherits(object, "merMod") && requireNamespace("lmerTest", quietly = TRUE)) { # if(packageVersion("lmerTest") < "2.0.37.90012") # return(lmerTest::summary(as(object, "merModLmerTest"), ...)) else # return(summary(lmerTest::as_lmerModLmerTest(object), ...)) # } # Default: # summary(object, ...) # } # afex/R/md_15.1-data.R0000644000176200001440000000645213664111747013515 0ustar liggesusers#' Data 15.1 / 11.5 from Maxwell & Delaney #' #' Hypothetical IQ Data from 12 children at 4 time points: Example data for chapter 11/15 of Maxwell and Delaney (2004, Table 15.1, p. 766) in long format. Has two one within-subjects factor: time. #' #' Description from pp. 534: #' #' The data show that 12 subjects have been observed in each of 4 conditions. To make the example easier to discuss, let's suppose that the 12 subjects are children who have been observed at 30, 36, 42, and 48 months of age. In each case, the dependent variable is the child's age-normed general cognitive score on the McCarthy Scales of Children's Abilities. Although the test is normed so that the mean score is independent of age for the general population, our 12 children may come from a population in which cognitive abilities are either growing more rapidly or less rapidly than average. Indeed, this is the hypothesis our data allow us to address. In other words, although the sample means suggest that the children's cognitive abilities are growing, a significance test is needed if we want to rule out sampling error as a likely explanation for the observed differences. #' #' To replicate the results in chapter 15 several different contrasts need to be applied, see Examples. #' #' \code{time} is time in months (centered at 0) and \code{timecat} is the same as a categorical variable. #' #' @docType data #' @keywords dataset #' @name md_15.1 #' @usage md_15.1 #' @format A data.frame with 48 rows and 4 variables. #' @source Maxwell, S. E., & Delaney, H. D. (2004). Designing experiments and analyzing data: a model-comparisons perspective. Mahwah, N.J.: Lawrence Erlbaum Associates. p. 766 #' @author R code for examples written by Ulf Mertens and Henrik Singmann #' #' @examples #' ### replicate results from Table 15.2 to 15.6 (Maxwell & Delaney, 2004, pp. 774) #' data(md_15.1) #' #' ### ANOVA results (Table 15.2) #' aov_4(iq ~ timecat + (timecat|id),data=md_15.1, anova_table=list(correction = "none")) #' #' ### Table 15.3 (random intercept only) #' # we need to set the base level on the last level: #' contrasts(md_15.1$timecat) <- contr.treatment(4, base = 4) #' # "Type 3 Tests of Fixed Effects" #' (t15.3 <- mixed(iq ~ timecat + (1|id),data=md_15.1, check.contrasts=FALSE)) #' # "Solution for Fixed Effects" and "Covariance Parameter Estimates" #' summary(t15.3$full.model) #' #' ### make Figure 15.2 #' plot(NULL, NULL, ylim = c(80, 140), xlim = c(30, 48), ylab = "iq", xlab = "time") #' plyr::d_ply(md_15.1, plyr::.(id), function(x) lines(as.numeric(as.character(x$timecat)), x$iq)) #' #' ### Table 15.4, page 789 #' # random intercept plus slope #' (t15.4 <- mixed(iq ~ timecat + (1+time|id),data=md_15.1, check.contrasts=FALSE)) #' summary(t15.4$full.model) #' #' ### Table 15.5, page 795 #' # set up polynomial contrasts for timecat #' contrasts(md_15.1$timecat) <- contr.poly #' # fit all parameters separately #' (t15.5 <- mixed(iq ~ timecat + (1+time|id), data=md_15.1, check.contrasts=FALSE, #' per.parameter="timecat")) #' # quadratic trend is considerably off, conclusions stay the same. #' #' #' ### Table 15.6, page 797 #' # growth curve model #' (t15.6 <- mixed(iq ~ time + (1+time|id),data=md_15.1)) #' summary(t15.6$full.model) #' #' @encoding UTF-8 #' NULL afex/R/fhch2010-data.R0000644000176200001440000000566213664111747013666 0ustar liggesusers#' Data from Freeman, Heathcote, Chalmers, & Hockley (2010) #' #' Lexical decision and word naming latencies for 300 words and 300 nonwords presented in Freeman, Heathcote, Chalmers, and Hockley (2010). The study had one between-subjects factors, \code{"task"} with two levels (\code{"naming"} or \code{"lexdec"}), and four within-subjects factors: \code{"stimulus"} type with two levels (\code{"word"} or \code{"nonword"}), word \code{"density"} and word \code{"frequency"} each with two levels (\code{"low"} and \code{"high"}) and stimulus \code{"length"} with three levels (4, 5, and 6). #' #' In the lexical-decision condition (N = 25), subjects indicated whether each item was a word or a nonword, by pressing either the left (labeled word) or right (labeled nonword) outermost button on a 6-button response pad. The next study item appeared immediately after the lexical decision response was given. In the naming condition (N = 20), subjects were asked to name each item aloud, and items remained on screen for 3 s. Naming time was recorded by a voice key. #' #' Items consisted of 300 words, 75 in each set making up a factorial combination of high and low density and frequency, and 300 nonwords, with equal numbers of 4, 5, and 6 letter items in each set. #' #' #' @docType data #' @keywords dataset #' @name fhch2010 #' @usage fhch2010 #' @format A \code{data.frame} with 13,222 obs. of 9 variables: #' \describe{ #' \item{id}{participant id, \code{factor}} #' \item{task}{\code{factor} with two levels indicating which task was performed: \code{"naming"} or \code{"lexdec"}} #' \item{stimulus}{\code{factor} indicating whether the shown stimulus was a \code{"word"} or \code{"nonword"}} #' \item{density}{\code{factor} indicating the neighborhood density of presented items with two levels: \code{"low"} and \code{"high"}. Density is defined as the number of words that differ from a base word by one letter or phoneme.} #' \item{frequency}{\code{factor} indicating the word frequency of presented items with two levels: \code{"low"} (i.e., words that occur less often in natural language) and \code{"high"} (i.e., words that occur more often in natural language).} #' \item{length}{\code{factor} with 3 levels (4, 5, or 6) indicating the number of characters of presented stimuli.} #' \item{item}{\code{factor} with 600 levels: 300 words and 300 nonwords} #' \item{rt}{response time in seconds} #' \item{log_rt}{natural logarithm of response time in seconds} #' \item{correct}{boolean indicating whether or not the response in the lexical decision task was correct or incorrect (incorrect responses of the naming task are not part of the data).} #' } #' @source Freeman, E., Heathcote, A., Chalmers, K., & Hockley, W. (2010). Item effects in recognition memory for words. Journal of Memory and Language, 62(1), 1-18. http://doi.org/10.1016/j.jml.2009.09.004 #' #' @encoding UTF-8 #' #' @example examples/examples.fhch2010.R NULL afex/R/reexport.R0000644000176200001440000000011213664111747013375 0ustar liggesusers### lme4 #' @importFrom lmerTest lmer #' @export lmerTest::lmer afex/R/ems.R0000644000176200001440000001204213720650616012312 0ustar liggesusers#' Expected values of mean squares for factorial designs #' #' Implements the Cornfield-Tukey algorithm for deriving the expected values of the mean squares for factorial designs. #' #' @param design A \code{formula} object specifying the factors in the design (except residual error, which is always implicitly included). The left hand side of the \code{~} is the symbol that will be used to denote the number of replications per lowest-level factor combination (I usually use "r" or "n"). The right hand side should include all fixed and random factors separated by \code{*}. Factor names should be single letters. #' @param nested A \code{character} vector, where each element is of the form \code{"A/B"}, indicating that the levels of factor B are nested under the levels of factor A. #' @param random A \code{character} string indicating, without spaces or any separating characters, which of the factors specified in the design are random. #' #' @return The returned value is a formatted table where the rows represent the mean squares, the columns represent the variance components that comprise the various mean squares, and the entries in each cell represent the terms that are multiplied and summed to form the expectation of the mean square for that row. Each term is either the lower-case version of one of the experimental factors, which indicates the number of levels for that factor, or a "1", which means the variance component for that column is contributes to the mean square but is not multiplied by anything else. #' #' @note Names for factors or parameters should only be of length 1 as they are simply concatenated in the returned table. #' #' @author Jake Westfall #' #' @seealso A detailed description with explanation of the example can be found \href{http://www.talkstats.com/threads/share-your-functions-code.18603/page-9#post-82050}{elsewhere} (note that the \code{design} argument of the function described at the link behaves slightly different). #' #' Example applications of this function can be found here: \url{https://stats.stackexchange.com/a/122662/442}. #' #' #' @example examples/examples.ems.R #' @export ems <- function(design, nested=NULL, random=""){ # modify design formula based on nested factors specified if(!is.null(nested)){ terms <- attr(terms(design), "term.labels") # for each nested, get indices of all terms not involving their interaction keeps <- lapply(strsplit(nested, "/"), function(x){ which(apply(sapply(x, grepl, terms), 1, function(x) !all(x))) }) terms <- terms[Reduce(intersect, keeps)] formula <- paste(c(as.character(design)[2:1], paste(terms, collapse="+")), collapse="") design <- eval(parse(text=formula)) } # build two-way table mat <- t(attr(terms(design), "factors")) terms <- tolower(as.character(attr(terms(design), "variables"))[-1]) # resolve fixed/random dummies if (!is.null(random)){ random <- unlist(strsplit(random,split="")) mat[,which(colnames(mat) %in% random)][mat[, which(colnames(mat) %in% random)]==1] <- "" mat[,which(!colnames(mat) %in% random)][mat[, which(!colnames(mat) %in% random)]==1] <- "fix" } # insert 1 in nested rows subs <- strsplit(rownames(mat), split=":") if(!is.null(nested)){ nested <- strsplit(nested, split="/") for(term in nested){ rows <- unlist(lapply(subs, function(x) term[2] %in% x)) cols <- colnames(mat)==term[1] mat[rows,cols] <- "1" } } mat <- rbind(mat, e=rep("1", ncol(mat))) # insert numbers of levels for remaining cells for(row in seq(nrow(mat))){ mat[row,][mat[row,]=="0"] <- tolower(colnames(mat)[mat[row,]=="0"]) } # construct EMS table ems <- matrix(nrow=nrow(mat), ncol=nrow(mat), dimnames=list(Effect=rownames(mat), VarianceComponent=rev(rownames(mat)))) # add nesting information to subscripts if (!is.null(nested)){ subs <- lapply(subs, function(x){ new <- x for (nest in seq(length(nested))){ if (nested[[nest]][2] %in% x) new <- c(new, nested[[nest]][1]) } return(new) }) } subs[["e"]] <- colnames(mat)[-1] names(subs) <- rownames(mat) # rename #-of-reps variable to 'e' invisibly colnames(mat)[1] <- "e" # fill in EMS table for(effect in rownames(ems)){ for(varcomp in colnames(ems)){ effectVec <- unlist(strsplit(effect, ":")) ans <- mat[varcomp,-1*which(colnames(mat) %in% effectVec)] if ("fix" %in% ans) ans <- "" if (all(ans=="1")) ans <- "1" if (("1" %in% ans | "2" %in% ans) & !all(ans=="1")){ ans <- ans[!ans %in% c("1","2")] } varcompVec <- unlist(strsplit(varcomp, ":")) if (!all(effectVec %in% subs[[varcomp]])) ans <- "" if (effect=="e" & varcomp=="e") ans <- "1" ems[effect,varcomp] <- paste(ans, collapse="") } } attr(ems, "terms") <- terms return(noquote(ems)) } afex/R/md_16.4-data.R0000644000176200001440000000477613664111747013530 0ustar liggesusers#' Data 16.4 from Maxwell & Delaney #' #' Data from a hypothetical inductive reasoning study. #' #' #' Description from pp. 841: #' #' Suppose an educational psychologist has developed an intervention to teach inductive reasoning skills to school children. She decides to test the efficacy of her intervention by conducting a randomized design. Three classrooms of students are randomly assigned to the treatment condition, and 3 other classrooms are assigned to the control. #' #' Table 16.4 shows hypothetical data collected from 29 children who participated in the study assessing the effectiveness of the intervention to increase inductive reasoning skills. We want to call your attention to several aspects of the data. First, the 15 children with condition values of 0 received the control, whereas the 14 children with condition values of 1 received the treatment. Second, 4 of the children in the control condition were students in control Classroom 1, 6 of them were students in control Classroom 2, and 5 were students in control Classroom 3. Along similar lines, 3 of the children in the treatment condition were students in treatment Classroom 1, 5 were students in treatment Classroom 2, and 6 were students in treatment Classroom 3. It is essential to understand that there are a total of six classrooms here; we have coded classroom from 1 to 3 for control as well as treatment, because we will indicate to PROC MIXED that classroom is nested under treatment. Third, scores on the dependent variable appear in the rightmost column under the variable label "induct." #' #' Note that it would make a lot more sense to change the labeling of room from 1 to 3 nested within cond to 1 to 6. However, I keep this in line with the original. The random effects term in the call to mixed is therefore a little bit uncommon.#' #' #' @docType data #' @keywords dataset #' @name md_16.4 #' @usage md_16.4 #' @format A data.frame with 24 rows and 3 variables. #' @source Maxwell, S. E., & Delaney, H. D. (2004). Designing experiments and analyzing data: a model-comparisons perspective. Mahwah, N.J.: Lawrence Erlbaum Associates. p. 574 #' #' @encoding UTF-8 #' #' @examples #' # data for next examples (Maxwell & Delaney, Table 16.4) #' data(md_16.4) #' str(md_16.4) #' #' ### replicate results from Table 16.6 (Maxwell & Delaney, 2004, p. 845) #' # p-values (almost) hold: #' (mixed2 <- mixed(induct ~ cond + (1|room:cond), md_16.4)) #' # (1|room:cond) is needed because room is nested within cond. #' #' NULL afex/R/afex_plot.R0000644000176200001440000011216313703564204013512 0ustar liggesusers#' m-way Plot with Error Bars and Raw Data #' #' @description Plots results from factorial experiments. Estimated marginal #' means and error bars are plotted in the foreground, raw data is plotted in #' the background. Error bars can be based on different standard errors (e.g., #' model-based, within-subjects, between-subjects). Functions described here #' return a \pkg{ggplot2} plot object, thus allowing further customization of #' the plot. #' #' \code{afex_plot} is the user friendly function that does data preparation #' and plotting. It also allows to only return the prepared data (\code{return #' = "data"}). #' #' \code{interaction_plot} does the plotting when a \code{trace} factor is #' present. \code{oneway_plot} does the plotting when a \code{trace} factor is #' absent. #' #' @param object \code{afex_aov}, \code{mixed}, \code{merMod} or other model #' object supported by \pkg{emmeans} (for further examples see: #' \code{vignette("afex_plot_supported_models")}). #' @param x A \code{character} vector or one-sided \code{formula} specifying the #' factor names of the predictors displayed on the x-axis. \code{mapping} #' specifies further mappings for these factors if \code{trace} is missing. #' @param trace An optional \code{character} vector or one-sided \code{formula} #' specifying the factor names of the predictors connected by the same line. #' \code{mapping} specifies further mappings for these factors. #' @param panel An optional \code{character} vector or one-sided \code{formula} #' specifying the factor names of the predictors shown in different panels. #' @param mapping A \code{character} vector specifying which aesthetic mappings #' should be applied to either the \code{trace} factors (if \code{trace} is #' specified) or the \code{x} factors. Useful options are any combination of #' \code{"shape"}, \code{"color"}, \code{"linetype"}, or also \code{"fill"} #' (see examples). The default (i.e., missing) uses \code{c("shape", #' "linetype")} if \code{trace} is specified and \code{""} otherwise (i.e., no #' additional aesthetic). If specific mappings should not be applied to #' specific graphical elements, one can override those via the corresponding #' further arguments. For example, for \code{data_arg} the default is #' \code{list(color = "darkgrey")} which prevents that \code{"color"} is #' mapped onto points in the background. #' @param error A scalar \code{character} vector specifying on which standard #' error the error bars should be based. Default is \code{"model"}, which #' plots model-based standard errors. Further options are: \code{"none"} (or #' \code{NULL}), \code{"mean"}, \code{"within"} (or \code{"CMO"}), and #' \code{"between"}. See details. #' @param id An optional \code{character} vector specifying over which variables #' the raw data should be aggregated. Only relevant for \code{mixed}, #' \code{merMod}, and \code{default} method. The default (missing) uses all #' random effects grouping factors (for \code{mixed} and \code{merMod} method) #' or assumes all data points are independent. This can lead to many data #' points. \code{error = "within"} or \code{error = "between"} require that #' \code{id} is of length 1. See examples. #' @param dv An optional scalar \code{character} vector giving the name of the #' column containing the dependent variable for the \code{afex_plot.default} #' method. If missing, the function attempts to take it from the \code{call} #' slot of \code{object}. This is also used as y-axis label. #' @param error_ci Logical. Should error bars plot confidence intervals #' (=\code{TRUE}, the default) or standard errors (=\code{FALSE})? #' @param error_level Numeric value between 0 and 1 determing the width of the #' confidence interval. Default is .95 corresponding to a 95\% confidence #' interval. #' @param error_arg A \code{list} of further arguments passed to #' \code{\link[ggplot2]{geom_errorbar}}, which draws the errorsbars. Default #' is \code{list(width = 0)} which suppresses the vertical bars at the end of #' the error bar. #' @param data_plot \code{logical}. Should raw data be plotted in the #' background? Default is \code{TRUE}. #' @param data_geom Geom \code{function} used for plotting data in background. #' The default (missing) uses \code{\link[ggplot2]{geom_point}} if #' \code{trace} is specified, otherwise #' \code{\link[ggbeeswarm]{geom_beeswarm}} (a good alternative is #' \code{ggbeeswarm::geom_quasirandom}) . See examples fo further options. #' @param data_alpha numeric \code{alpha} value between 0 and 1 passed to #' \code{data_geom}. Default is \code{0.5} which correspond to semitransparent #' data points in the background such that overlapping data points are plotted #' darker. #' @param data_arg A \code{list} of further arguments passed to #' \code{data_geom}. Default is \code{list(color = "darkgrey")}, which plots #' points in the background in grey. #' @param point_arg,line_arg A \code{list} of further arguments passed to #' \code{\link[ggplot2]{geom_point}} or \code{\link[ggplot2]{geom_line}} which #' draw the points and lines in the foreground. Default is \code{list()}. #' \code{line_arg} is only used if \code{trace} is specified. #' @param emmeans_arg A \code{list} of further arguments passed to #' \code{\link[emmeans]{emmeans}}. Of particular importance for ANOVAs is #' \code{model}, see \code{\link{afex_aov-methods}}. #' @param dodge Numerical amount of dodging of factor-levels on x-axis. Default #' is \code{0.5}. #' @param return A scalar \code{character} specifying what should be returned. #' The default \code{"plot"} returns the \pkg{ggplot2} plot. The other option #' \code{"data"} returns a list with two \code{data.frame}s containing the #' data used for plotting: \code{means} contains the means and standard errors #' for the foreground, \code{data} contains the raw data in the background. #' @param factor_levels A \code{list} of new factor levels that should be used #' in the plot. The name of each list entry needs to correspond to one of the #' factors in the plot. Each list element can optionally be a named character #' vector where the name corresponds to the old factor level and the value to #' the new factor level. Named vectors allow two things: (1) updating only a #' subset of factor levels (if only a subset of levels is specified) and (2) #' reordering (and renaming) the factor levels, as order of names within a #' list element are the order that will be used for plotting. If specified, #' emits a \code{message} with \code{old -> new} factor levels. #' @param legend_title A scalar \code{character} vector with a new title for the #' legend. #' @param data For the \code{afex_plot.default} method, an optional #' \code{data.frame} containing the raw data used for fitting the model and #' which will be used as basis for the data points in the background. If #' missing, it will be attempted to obtain it from the model via #' \code{\link[emmeans]{recover_data}}. For the plotting functions, a #' \code{data.frame} with the data that has to be passed and contains the #' background data points. #' @param within_vars,between_vars For the \code{afex_plot.default} method, an #' optional \code{character} vector specifying which variables should be #' treated as within-subjects (or repeated-measures) factors and which as #' between-subjects (or independen-sampels) factors. If one of the two #' arguments is given, all other factors are assumed to fall into the other #' category. #' @param means \code{data.frame}s used for plotting of the plotting #' functions. #' @param col_y,col_x,col_trace,col_panel A scalar \code{character} string #' specifying the name of the corresponding column containing the information #' used for plotting. Each column needs to exist in both the \code{means} and #' the \code{data} \code{data.frame}. #'@param col_lower,col_upper A scalar \code{character} string specifying the #' name of the columns containing lower and upper bounds for the error bars. #' These columns need to exist in \code{means}. #' @param error_plot \code{logical}. Should error bars be plotted? Only used in #' plotting functions. To suppress plotting of error bars use \code{error = #' "none"} in \code{afex_plot}. #' @param ... currently ignored. #' #' @details \code{afex_plot} obtains the estimated marginal means via #' \code{\link[emmeans]{emmeans}} and aggregates the raw data to the same #' level. It then calculates the desired confidence interval or standard error #' (see below) and passes the prepared data to one of the two plotting #' functions: \code{interaction_plot} when \code{trace} is specified and #' \code{oneway_plot} otherwise. #' #' \subsection{Error Bars}{Error bars provide a grahical representation of the #' variability of the estimated means and should be routinely added to results #' figures. However, there exist several possibilities which particular #' measure of variability to use. Because of this, any figure depicting error #' bars should be accompanied by a note detailing which measure the error bars #' shows. The present functions allow plotting of different types of #' confidence intervals (if \code{error_ci = TRUE}, the default) or standard #' errors (if \code{error_ci = FALSE}). #' #' A further complication is that readers routinely misinterpret confidence #' intervals. The most common error is to assume that non-overlapping error #' bars indicate a significant difference (e.g., Belia et al., 2005). This is #' often too strong an assumption. (see e.g., Cumming & Finch, 2005; Knol et #' al., 2011; Schenker & Gentleman, 2005). For example, in a fully #' between-subjects design in which the error bars depict 95\% confidence #' intervals and groups are of approximately equal size and have equal #' variance, even error bars that overlap by as much as 50\% still correspond #' to \emph{p} < .05. Error bars that are just touching roughly correspond to #' \emph{p} = .01. #' #' In the case of designs involving repeated-measures factors the usual #' confidence intervals or standard errors (i.e., model-based confidence #' intervals or intervals based on the standard error of the mean) cannot be #' used to gauge significant differences as this requires knowledge about the #' correlation between measures. One popular alternative in the psychological #' literature are intervals based on within-subjects standard #' errors/confidence intervals (e.g., Cousineau & O'Brien, 2014). These #' attempt to control for the correlation across individuals and thereby allow #' judging differences between repeated-measures condition. As a downside, #' when using within-subjects intervals no comparisons across between-subjects #' conditions or with respect to a fixed-value are possible anymore. #' #' In the case of a mixed-design, no single type of error bar is possible that #' allows comparison across all conditions. Likewise, for mixed models #' involving multiple \emph{crossed} random effects, no single set of error #' bars (or even data aggregation) adequately represent the true varibility in #' the data and adequately allows for "inference by eye". Therefore, special #' care is necessary in such cases. One possiblity is to avoid error bars #' altogether and plot only the raw data in the background (with \code{error = #' "none"}). The raw data in the background still provides a visual impression #' of the variability in the data and the precision of the mean estimate, but #' does not as easily suggest an incorrect inferences. Another possibility is #' to use the model-based standard error and note in the figure caption that #' it does not permit comparisons across repeated-measures factors. #' #' The following "rules of eye" (Cumming and Finch, 2005) hold, when permitted #' by design (i.e., within-subjects bars for within-subjects comparisons; #' other variants for between-subjects comparisons), and groups are #' approximately equal in size and variance. Note that for more complex #' designs ususally analyzed with mixed models, such as designs involving #' complicated dependencies across data points, these rules of thumbs may be #' highly misleading. #' \itemize{ #' \item \emph{p} < .05 when the overlap of the 95\% confidence intervals #' (CIs) is no more than about half the average margin of error, that is, #' when proportion overlap is about .50 or less. #' \item \emph{p} < .01 when the two CIs do not overlap, that is, when #' proportion overlap is about 0 or there is a positive gap. #' \item \emph{p} < .05 when the gap between standard error (SE) bars is at #' least about the size of the average SE, that is, when the proportion gap #' is about 1 or greater. #' \item \emph{p} < .01 when the proportion gap between SE bars is about 2 #' or more. #' } #' } #' \subsection{Implemented Standard Errors}{The following lists the #' implemented approaches to calculate confidence intervals (CIs) and standard #' errors (SEs). CIs are based on the SEs using the \emph{t}-distribution with #' degrees of freedom based on the cell or group size. For ANOVA models, #' \code{afex_plot} attempts to warn in case the chosen approach is misleading #' given the design (e.g., model-based error bars for purely #' within-subjects plots). For \code{mixed} models, no such warnings are #' produced, but users should be aware that all options beside \code{"model"} #' are not actually appropriate and have only heuristic value. But then again, #' \code{"model"} based error bars do not permit comparisons for factors #' varying within one of the random-effects grouping factors (i.e., factors #' for which random-slopes should be estimated). #' \describe{ #' \item{\code{"model"}}{Uses model-based CIs and SEs. For ANOVAs, the #' variant based on the \code{lm} or \code{mlm} model (i.e., #' \code{emmeans_arg = list(model = "multivariate")}) seems generally #' preferrable.} #' \item{\code{"mean"}}{Calculates the standard error of the mean for #' each cell ignoring any repeated-measures factors.} #' \item{\code{"within"} or \code{"CMO"}}{Calculates within-subjects SEs #' using the Cosineau-Morey-O'Brien (Cousineau & O'Brien, 2014) method. This #' method is based on a double normalization of the data. SEs and CIs are #' then calculated independently for each cell (i.e., if the desired output #' contains between-subjects factors, SEs are calculated for each cell #' including the between-subjects factors).} #' \item{\code{"between"}}{First aggregates the data per participant and #' then calculates the SEs for each between-subjects condition. Results in #' one SE and \emph{t}-quantile for all conditions in purely within-subjects #' designs.} #' \item{\code{"none"} or \code{NULL}}{Suppresses calculation of SEs and #' plots no error bars.} #' } #' For \code{mixed} models, the within-subjects/repeated-measures factors are #' relative to the chosen \code{id} effects grouping factor. They are #' automatically detected based on the random-slopes of the random-effects #' grouping factor in \code{id}. All other factors are treated as #' independent-samples or between-subjects factors. #' } #' #' @return Returns a \pkg{ggplot2} plot (i.e., object of class \code{c("gg", #' "ggplot")}) unless \code{return = "data"}. #' #' @references Belia, S., Fidler, F., Williams, J., & Cumming, G. (2005). #' Researchers Misunderstand Confidence Intervals and Standard Error Bars. #' \emph{Psychological Methods}, 10(4), 389-396. #' https://doi.org/10.1037/1082-989X.10.4.389 #' #' Cousineau, D., & O'Brien, F. (2014). Error bars in within-subject designs: #' a comment on Baguley (2012). \emph{Behavior Research Methods}, 46(4), #' 1149-1151. https://doi.org/10.3758/s13428-013-0441-z #' #' Cumming, G., & Finch, S. (2005). Inference by Eye: Confidence Intervals and #' How to Read Pictures of Data. \emph{American Psychologist}, 60(2), 170-180. #' https://doi.org/10.1037/0003-066X.60.2.170 #' #' Knol, M. J., Pestman, W. R., & Grobbee, D. E. (2011). The (mis)use of #' overlap of confidence intervals to assess effect modification. #' \emph{European Journal of Epidemiology}, 26(4), 253-254. #' https://doi.org/10.1007/s10654-011-9563-8 #' #' Schenker, N., & Gentleman, J. F. (2001). On Judging the Significance of #' Differences by Examining the Overlap Between Confidence Intervals. #' \emph{The American Statistician}, 55(3), 182-186. #' https://doi.org/10.1198/000313001317097960 #' #' @note Only the DV/response variable can be called \code{y}, but no #' factor/variable used for plotting. #' #' #' @importFrom stats aggregate sd qt formula #' #' @example examples/examples.afex_plot.R #' #' @export afex_plot <- function(object, ...) UseMethod("afex_plot", object) # @method afex_plot afex_aov #' @rdname afex_plot #' @export afex_plot.afex_aov <- function(object, x, trace, panel, mapping, error = "model", error_ci = TRUE, error_level = 0.95, error_arg = list(width = 0), data_plot = TRUE, data_geom, data_alpha = 0.5, data_arg = list(color = "darkgrey"), point_arg = list(), line_arg = list(), emmeans_arg = list(), dodge = 0.5, return = "plot", factor_levels = list(), legend_title, ...) { return <- match.arg(return, c("plot", "data")) error <- match.arg(error, c("none", "model", "mean", "within", "CMO", "between")) dots <- list(...) if (length(dots) > 0) { warning("Additional arguments ignored: ", paste(names(dots), collapse = ", "), call. = FALSE) } x <- get_plot_var(x) trace <- get_plot_var(trace) panel <- get_plot_var(panel) all_vars <- c(x, trace, panel) if ("y" %in% all_vars) { stop("Variable 'y' cannot be used for plotting. Rename variable and refit.", call. = FALSE) } emms <- get_emms(object = object, x = x, trace = trace, panel = panel, emmeans_arg = emmeans_arg, factor_levels = factor_levels, level = error_level) ## prepare raw (i.e., participant by cell) data data <- prep_data(object$data$long, x = x, trace = trace, panel = panel, factor_levels = factor_levels, dv_col = attr(object, "dv"), id = attr(object, "id")) ### prepare variables for SE/CI calculation within_vars <- all_vars[all_vars %in% names(attr(object, "within"))] between_vars <- all_vars[all_vars %in% names(attr(object, "between"))] ### check if error bars are consistent with panel(s) and warn otherwise if (error %in% c("model", "mean", "between") && all(c(x, trace) %in% within_vars)) { warning("Panel(s) show within-subjects factors, ", "but not within-subjects error bars.\n", 'For within-subjects error bars use: error = "within"', call. = FALSE) } else if (error %in% c("within", "CMO") && all(c(x, trace) %in% between_vars)) { warning("Panel(s) show between-subjects factors, ", "but within-subjects error bars.\n", 'For between-subjects error bars use e.g.,: ', 'error = "model" or error = "mean"', call. = FALSE) } else if (any(between_vars %in% c(x, trace)) && any(within_vars %in% c(x, trace)) && error != "none") { warning("Panel(s) show a mixed within-between-design.\n", "Error bars do not allow comparisons across all means.\n", 'Suppress error bars with: error = "none"', call. = FALSE) } tmp <- get_data_based_cis(emms = emms, data = data, error = error, id = attr(object, "id"), ## colname holding the id/grouping variable all_vars = all_vars, within_vars = within_vars, between_vars = between_vars, error_level = error_level, error_ci = error_ci) emms <- tmp$emms error_plot <- tmp$error_plot return(afex_plot_internal(x = x, trace = trace, panel = panel, means = emms, data = data, error_plot = error_plot, error_arg = error_arg, dodge = dodge, data_plot = data_plot, data_geom = data_geom, data_alpha = data_alpha, data_arg = data_arg, point_arg = point_arg, line_arg = line_arg, mapping = mapping, legend_title = legend_title, return = return )) } # @method afex_plot afex_aov #' @rdname afex_plot #' @export afex_plot.mixed <- function(object, x, trace, panel, mapping, id, error = "model", error_ci = TRUE, error_level = 0.95, error_arg = list(width = 0), data_plot = TRUE, data_geom, data_alpha = 0.5, data_arg = list(color = "darkgrey"), point_arg = list(), line_arg = list(), emmeans_arg = list(), dodge = 0.5, return = "plot", factor_levels = list(), legend_title, ...) { return <- match.arg(return, c("plot", "data")) error <- match.arg(error, c("none", "model", "mean", "within", "CMO", "between")) dots <- list(...) if (length(dots) > 0) { warning("Additional arguments ignored: ", paste(names(dots), collapse = ", "), call. = FALSE) } if (attr(object, "type") %in% c("II", 2) & attr(object, "method") %in% c("LRT", "nested-KR", "PB") ) { full_model <- object$full_model[[1]] } else ( full_model <- object$full_model ) x <- get_plot_var(x) trace <- get_plot_var(trace) panel <- get_plot_var(panel) all_vars <- c(x, trace, panel) if ("y" %in% all_vars) { stop("Variable 'y' cannot be used for plotting. Rename variable and refit.", call. = FALSE) } if (missing(id)) { id <- unique(names(lme4::ranef(full_model))) message("Aggregating data over: ", paste(id, collapse = ", ")) } ## prepare raw (i.e., participant by cell) data data <- prep_data(object$data, x = x, trace = trace, panel = panel, factor_levels = factor_levels, dv_col = deparse(full_model@call[["formula"]][[2]]), id = id) data$afex_id <- interaction(data[id], sep = ".") if (!(error %in% c("none" ,"model", "mean")) & (length(id) > 1)) { stop("When aggregating over multiple random effects,\n", ' error has to be in: c("model", "mean", "none")', call. = FALSE) } emms <- get_emms(object = object, x = x, trace = trace, panel = panel, emmeans_arg = emmeans_arg, factor_levels = factor_levels, level = error_level) attr(emms, "dv") <- deparse(full_model@call[["formula"]][[2]]) if (length(id) == 1) { all_within <- lapply(lme4::findbars(object$call), all.vars) all_within <- unique(unlist( all_within[vapply(all_within, function(x) id %in% x, NA)] )) all_within <- all_within[all_within != id] within_vars <- all_vars[all_vars %in% all_within] between_vars <- all_vars[!(all_vars %in% within_vars)] } ### prepare variables for SE/CI calculation tmp <- get_data_based_cis(emms = emms, data = data, error = error, id = "afex_id", ## colname holding the id/grouping variable all_vars = all_vars, within_vars = within_vars, between_vars = between_vars, error_level = error_level, error_ci = error_ci) emms <- tmp$emms error_plot <- tmp$error_plot return(afex_plot_internal(x = x, trace = trace, panel = panel, means = emms, data = data, error_plot = error_plot, error_arg = error_arg, dodge = dodge, data_plot = data_plot, data_geom = data_geom, data_alpha = data_alpha, data_arg = data_arg, point_arg = point_arg, line_arg = line_arg, mapping = mapping, legend_title = legend_title, return = return )) } #' @rdname afex_plot #' @export afex_plot.merMod <- function(object, x, trace, panel, mapping, id, error = "model", error_ci = TRUE, error_level = 0.95, error_arg = list(width = 0), data_plot = TRUE, data_geom, data_alpha = 0.5, data_arg = list(color = "darkgrey"), point_arg = list(), line_arg = list(), emmeans_arg = list(), dodge = 0.5, return = "plot", factor_levels = list(), legend_title, ...) { return <- match.arg(return, c("plot", "data")) error <- match.arg(error, c("none", "model", "mean", "within", "CMO", "between")) dots <- list(...) if (length(dots) > 0) { warning("Additional arguments ignored: ", paste(names(dots), collapse = ", "), call. = FALSE) } x <- get_plot_var(x) trace <- get_plot_var(trace) panel <- get_plot_var(panel) all_vars <- c(x, trace, panel) if ("y" %in% all_vars) { stop("Variable 'y' cannot be used for plotting. Rename variable and refit.", call. = FALSE) } if (missing(id)) { id <- unique(names(lme4::ranef(object))) message("Aggregating data over: ", paste(id, collapse = ", ")) } ## prepare raw (i.e., participant by cell) data data <- prep_data( data = emmeans::recover_data( object = object@call, trms = terms(object, fixed.only = FALSE), na.action = attr(object@frame, ".na.action") ), x = x, trace = trace, panel = panel, factor_levels = factor_levels, dv_col = deparse(object@call[["formula"]][[2]]), id = id) data$afex_id <- interaction(data[id], sep = ".") if (!(error %in% c("none" ,"model", "mean")) & (length(id) > 1)) { stop("When aggregating over multiple random effects,\n", ' error has to be in: c("model", "mean", "none")', call. = FALSE) } emms <- get_emms(object = object, x = x, trace = trace, panel = panel, emmeans_arg = emmeans_arg, factor_levels = factor_levels, level = error_level) attr(emms, "dv") <- deparse(object@call[["formula"]][[2]]) if (length(id) == 1) { all_within <- lapply(lme4::findbars(object@call), all.vars) all_within <- unique(unlist( all_within[vapply(all_within, function(x) id %in% x, NA)] )) all_within <- all_within[all_within != id] within_vars <- all_vars[all_vars %in% all_within] between_vars <- all_vars[!(all_vars %in% within_vars)] } ### prepare variables for SE/CI calculation tmp <- get_data_based_cis(emms = emms, data = data, error = error, id = "afex_id", ## colname holding the id/grouping variable all_vars = all_vars, within_vars = within_vars, between_vars = between_vars, error_level = error_level, error_ci = error_ci) emms <- tmp$emms error_plot <- tmp$error_plot return(afex_plot_internal(x = x, trace = trace, panel = panel, means = emms, data = data, error_plot = error_plot, error_arg = error_arg, dodge = dodge, data_plot = data_plot, data_geom = data_geom, data_alpha = data_alpha, data_arg = data_arg, point_arg = point_arg, line_arg = line_arg, mapping = mapping, legend_title = legend_title, return = return )) } #' @rdname afex_plot #' @export afex_plot.default <- function(object, x, trace, panel, mapping, id, dv, data, within_vars, between_vars, error = "model", error_ci = TRUE, error_level = 0.95, error_arg = list(width = 0), data_plot = TRUE, data_geom, data_alpha = 0.5, data_arg = list(color = "darkgrey"), point_arg = list(), line_arg = list(), emmeans_arg = list(), dodge = 0.5, return = "plot", factor_levels = list(), legend_title, ...) { return <- match.arg(return, c("plot", "data")) error <- match.arg(error, c("none", "model", "mean", "within", "CMO", "between")) dots <- list(...) if (length(dots) > 0) { warning("Additional arguments ignored: ", paste(names(dots), collapse = ", "), call. = FALSE) } x <- get_plot_var(x) trace <- get_plot_var(trace) panel <- get_plot_var(panel) all_vars <- c(x, trace, panel) if ("y" %in% all_vars) { stop("Variable 'y' cannot be used for plotting. Rename variable and refit.", call. = FALSE) } if (missing(dv)) { tryCatch({ formula_name <- names(object$call)[2] }, error = function(e) stop( "Could not detect dv column. Please specify via dv argument.", call. = FALSE )) if (is.null(formula_name)) stop( "Could not detect dv column. Please specify via dv argument.", call. = FALSE ) message("dv column detected: ", deparse(object$call[[formula_name]][[2]])) dv <- deparse(object$call[[formula_name]][[2]]) } ## prepare raw (i.e., participant by cell) data if missing if (missing(data)) { try(data <- emmeans::recover_data( object = object, #trms = terms(object) trms = terms(lme4::subbars(formula(object))) ), silent = TRUE) if (!exists("data", mode = "list")) { try(data <- emmeans::recover_data( object = object, trms = terms(object) ), silent = TRUE) } if (!exists("data", mode = "list")) { try(data <- model.frame(object), silent = TRUE) } if (!exists("data", mode = "list")) { stop("data could not be recovered. Please pass data via data argument.", call. = FALSE) } } if (missing(id)) { message("No id column passed. ", "Assuming all rows are independent samples.") data$id <- factor(seq_len(nrow(data))) id <- "id" } data <- prep_data( data = data, x = x, trace = trace, panel = panel, factor_levels = factor_levels, dv_col = dv, id = id) data$afex_id <- interaction(data[id], sep = ".") if (!(error %in% c("none" ,"model", "mean")) & (length(id) > 1)) { stop("When aggregating over multiple ids,\n", ' error has to be in: c("model", "mean", "none")', call. = FALSE) } emms <- get_emms(object = object, x = x, trace = trace, panel = panel, emmeans_arg = emmeans_arg, factor_levels = factor_levels, level = error_level) attr(emms, "dv") <- dv if (missing(within_vars) & !missing(between_vars)) { within_vars <- all_vars[!(all_vars %in% within_vars)] } if (!missing(within_vars) & missing(between_vars)) { between_vars <- all_vars[!(all_vars %in% between_vars)] } ### prepare variables for SE/CI calculation tmp <- get_data_based_cis(emms = emms, data = data, error = error, id = "afex_id", ## colname holding the id/grouping variable all_vars = all_vars, within_vars = within_vars, between_vars = between_vars, error_level = error_level, error_ci = error_ci) emms <- tmp$emms error_plot <- tmp$error_plot return(afex_plot_internal(x = x, trace = trace, panel = panel, means = emms, data = data, error_plot = error_plot, error_arg = error_arg, dodge = dodge, data_plot = data_plot, data_geom = data_geom, data_alpha = data_alpha, data_arg = data_arg, point_arg = point_arg, line_arg = line_arg, mapping = mapping, legend_title = legend_title, return = return )) } afex/R/allFit.R0000644000176200001440000001272713720265743012756 0ustar liggesusers#' Refit \code{lmer} model using multiple optimizers #' #' Attempt to re-fit a [g]lmer model with a range of optimizers. #' The default is to use all known optimizers for R that satisfy the #' requirements (do not require explicit gradients, allow #' box constraints), in four categories; (i) built-in #' (\code{minqa::bobyqa}, \code{lme4::Nelder_Mead}), (ii) wrapped via optimx #' (most of optimx's optimizers that allow box constraints require #' an explicit gradient function to be specified; the two provided #' here are really base R functions that can be accessed via optimx, #' (iii) wrapped via nloptr, (iv) \code{dfoptim::nmkb}. #' #' @param m a fitted model with \code{lmer} #' @param meth_tab a matrix (or data.frame) with columns #' - method the name of a specific optimization method to pass to the optimizer #' (leave blank for built-in optimizers) #' - optimizer the \code{optimizer} function to use #' @param verbose print progress messages? #' @param maxfun number of iterations to allow for the optimization rountine. #' @param ... further arguments passed to \code{\link{update.merMod}} such as \code{data}. #' @param fn needed for \code{dfoptim::nmkb} #' @param par needed for \code{dfoptim::nmkb} #' @param lower needed for \code{dfoptim::nmkb} #' @param upper needed for \code{dfoptim::nmkb} #' @param control needed for \code{dfoptim::nmkb} #' #' @details Needs packages \pkg{nloptr}, \pkg{optimx}, and \code{dfoptim} to try out all optimizers. \pkg{optimx} needs to be loaded explicitly using \code{library} or \code{require} (see examples). #' #' \code{nmkbw} is a simple wrapper function for fitting models with the corresponding optimizer. It needs to be exported for \code{lme4}, but should not be called directly by the user. #' #' @note Very similar to the function of the same name that is part of \pkg{lme4}. The present function will be removed eventually in favor of the \pkg{lme4} function. #' #' @return a list of fitted \code{merMod} objects #' @seealso slice, slice2D in the bbmle package #' @author Ben Bolker, minor changes by Henrik Singmann #' @export #' @importFrom lme4 isGLMM lmerControl glmerControl #' @importFrom stats setNames update optim #' #' @example examples/examples.allFit.R #' all_fit <- function(m, meth_tab = cbind( optimizer=rep(c("bobyqa","Nelder_Mead", "optimx", "nloptwrap", "nmkbw"), c( 1, 1, 2, 2, 1)), method= c("", "", "nlminb","L-BFGS-B", "NLOPT_LN_NELDERMEAD", "NLOPT_LN_BOBYQA", "") ), verbose=TRUE, maxfun=1e6, ...) { stopifnot(length(dm <- dim(meth_tab)) == 2, dm[1] >= 1, dm[2] >= 2, is.character(optimizer <- meth_tab[,"optimizer"]), is.character(method <- meth_tab[,"method"])) fit.names <- paste(optimizer, method, sep=".") res <- setNames(as.list(fit.names), fit.names) dots <- list(...) for (i in seq_along(fit.names)) { if (verbose) cat(fit.names[i],": ") ctrl <- list(optimizer=optimizer[i]) ctrl$optCtrl <- switch(optimizer[i], optimx = list(method = method[i]), nloptWrap = list(algorithm= method[i]), list(maxfun=maxfun)) ctrl <- do.call(if(isGLMM(m)) glmerControl else lmerControl, ctrl) if ("data" %in% names(dots)) { tt <- system.time(rr <- tryCatch( update(m, control = ctrl, data = dots$data, ...), error = function(e) e)) } else { tt <- system.time(rr <- tryCatch( update(m, control = ctrl, ...), error = function(e) e)) } attr(rr, "optCtrl") <- ctrl$optCtrl # contains crucial info here attr(rr, "time") <- tt # store timing info res[[i]] <- rr if (verbose) { if (inherits(rr, "merMod")) cat("[OK]\n") else cat("[ERROR]\n") } } ## reset call slot of refitted objects res <- lapply(res, function(x) { try(x@call[["data"]] <- m@call[["data"]], silent = TRUE) x }) res } #' @rdname all_fit #' @export nmkbw <- function(fn,par,lower,upper,control) { if (length(par)==1) { res <- optim(fn=fn,par=par,lower=lower,upper=100*par, method="Brent") } else { if (!is.null(control$maxfun)) { control$maxfeval <- control$maxfun control$maxfun <- NULL } res <- dfoptim::nmkb(fn=fn,par=par,lower=lower,upper=upper,control=control) } res$fval <- res$value res } # #' @export # summary.allfit <- function(object, ...) { # which.OK <- !sapply(object,is,"error") # msgs <- lapply(object[which.OK],function(x) x@optinfo$conv$lme4$messages) # fixef <- t(sapply(object[which.OK],fixef)) # llik <- sapply(object[which.OK],logLik) # times <- t(sapply(object[which.OK],attr,"time")) # feval <- sapply(object[which.OK],function(x) x@optinfo$feval) # sdcor <- t(sapply(object[which.OK],function(x) { # aa <- as.data.frame(VarCorr(x)) # setNames(aa[,"sdcor"],c(lme4:::tnames(object[which.OK][[1]]), # if (isLMM(object[[1]])) "sigma" else NULL)) # })) # namedList(which.OK,msgs,fixef,llik,sdcor,times,feval) # } # # #' @export # print.summary.allfit <- function(object,...) { # if (!which.OK==seq(length(object))) { # cat("some optimizers failed: ", # paste(names(object)[!which.OK],collapse=","),"\n") # } # }afex/R/aov_car.R0000644000176200001440000011246714076011251013143 0ustar liggesusers#' Convenient ANOVA estimation for factorial designs #' #' These functions allow convenient specification of any type of ANOVAs (i.e., #' purely within-subjects ANOVAs, purely between-subjects ANOVAs, and mixed #' between-within or split-plot ANOVAs) for data in the \strong{long} format #' (i.e., one observation per row). If the data has more than one observation #' per individual and cell of the design (e.g., multiple responses per #' condition), the data will by automatically aggregated. The default settings #' reproduce results from commercial statistical packages such as SPSS or SAS. #' \code{aov_ez} is called specifying the factors as character vectors, #' \code{aov_car} is called using a formula similar to \code{\link{aov}} #' specifying an error strata for the within-subject factor(s), and \code{aov_4} #' is called with a \pkg{lme4}-like formula (all ANOVA functions return #' identical results). The returned object contains the ANOVA also fitted via #' base R's \code{\link{aov}} which can be passed to e.g., \pkg{emmeans} for #' further analysis (e.g., follow-up tests, contrasts, plotting, etc.). These #' functions employ \code{\link[car]{Anova}} (from the \pkg{car} package) to #' provide test of effects avoiding the somewhat unhandy format of #' \code{car::Anova}. #' #' #' @param id \code{character} vector (of length 1) indicating the subject #' identifier column in \code{data}. #' @param dv \code{character} vector (of length 1) indicating the column #' containing the \strong{dependent variable} in \code{data}. #' @param between \code{character} vector indicating the #' \strong{between}-subject(s) factor(s)/column(s) in \code{data}. Default is #' \code{NULL} indicating no between-subjects factors. #' @param within \code{character} vector indicating the #' \strong{within}-subject(s)(or repeated-measures) factor(s)/column(s) in #' \code{data}. Default is \code{NULL} indicating no within-subjects factors. #' @param covariate \code{character} vector indicating the between-subject(s) #' covariate(s) (i.e., column(s)) in \code{data}. Default is \code{NULL} #' indicating no covariates. Please note that \code{factorize} needs to be set #' to \code{FALSE} in case the covariate is numeric and should be treated as #' such. #' @param observed \code{character} vector indicating which of the variables are #' observed (i.e, measured) as compared to experimentally manipulated. The #' default effect size reported (generalized eta-squared) requires correct #' specification of the obsered (in contrast to manipulated) variables. #' @param formula A formula specifying the ANOVA model similar to #' \code{\link{aov}} (for \code{aov_car} or similar to \code{lme4:lmer} for #' \code{aov_4}). Must include an error term (i.e., \code{Error(id/...)} for #' \code{aov_car} or \code{(...|id)} for \code{aov_4}). Note that the #' within-subject factors do not need to be outside the Error term (this #' contrasts with \code{aov}). See Details. #' @param data A \code{data.frame} containing the data. Mandatory. #' @param fun_aggregate The function for aggregating the data before running the #' ANOVA if there is more than one observation per individual and cell of the #' design. The default \code{NULL} issues a warning if aggregation is #' necessary and uses \code{\link{mean}}. Pass \code{mean} directly to avoid #' the warning. #' @param transformation In \code{aov_ez}, a \code{character} vector (of length #' 1) indicating the name of a transformation to apply to \code{dv} before #' fitting the model. If missing, no transformation is applied. In #' \code{aov_car} and \code{aov_4}, a response transformation may be #' incorporated in the left-hand side of \code{formula}. #' @param type The type of sums of squares for the ANOVA. The default is given #' by \code{afex_options("type")}, which is \strong{initially set to 3}. #' Passed to \code{\link[car]{Anova}}. Possible values are \code{"II"}, #' \code{"III"}, \code{2}, or \code{3}. #' @param factorize logical. Should between subject factors be factorized (with #' note) before running the analysis. The default is given by #' \code{afex_options("factorize")}, which is initially \code{TRUE}. If one #' wants to run an ANCOVA, this needs to be set to \code{FALSE} (in which case #' centering on 0 is checked on numeric variables). #' @param check_contrasts \code{logical}. Should contrasts for between-subject #' factors be checked and (if necessary) changed to be \code{"contr.sum"}. See #' details. The default is given by \code{afex_options("check_contrasts")}, #' which is initially \code{TRUE}. #' @param print.formula \code{aov_ez} and \code{aov_4} are wrapper for #' \code{aov_car}. This boolean argument indicates whether the formula in the #' call to \code{car.aov} should be printed. #' @param anova_table \code{list} of further arguments passed to function #' producing the ANOVA table. Arguments such as \code{es} (effect size) or #' \code{correction} are passed to either \code{anova.afex_aov} or #' \code{nice}. Note that those settings can also be changed once an object of #' class \code{afex_aov} is created by invoking the \code{anova} method #' directly. #' @param include_aov Boolean. Allows suppressing the calculation of the aov #' object. If TRUE the aov model is part of the returned \code{afex_aov} #' object. \code{FALSE} (the default) prevents this potentially costly #' calculation. Especially for designs with larger N and within-subjects #' factors, this is highly advisable. Follow-up analyses using \pkg{emmeans} #' using the \code{univariate} model (which is not recommended) require the #' aov model and TRUE. #' @param ... Further arguments passed to \code{fun_aggregate}. #' @param return What should be returned? The default is given by #' \code{afex_options("return_aov")}, which is initially \code{"afex_aov"}, #' returning an S3 object of class \code{afex_aov} for which various #' \link[=afex_aov-methods]{methods} exist (see there and below for more #' details). Other values are currently still supported for backward #' compatibility. # To avoid the (potentially costly) computation via \code{aov} set # \code{return} to \code{"nice"} in which case only the nice ANOVA table is # returned (produced by \code{\link{nice}}, this was the previous default # return value). # Possible values are \code{c("Anova", "lm", "data", "nice", "full", "all", # "univariate", "marginal", "aov")} (possibly abbreviated). #' #' @return \code{aov_car}, \code{aov_4}, and \code{aov_ez} are wrappers for #' \code{\link[car]{Anova}} and \code{\link{aov}}, the return value is #' dependent on the \code{return} argument. Per default, an S3 object of class #' \code{"afex_aov"} is returned containing the following slots: #' #' \describe{ #' \item{\code{"anova_table"}}{An ANOVA table of class \code{c("anova", #' "data.frame")}.} #' \item{\code{"aov"}}{\code{aov} object returned from \code{\link{aov}} #' (should not be used to evaluate significance of effects, but can be passed #' to \code{emmeans} for post-hoc tests).} #' \item{\code{"Anova"}}{object returned from \code{\link[car]{Anova}}, an #' object of class \code{"Anova.mlm"} (if within-subjects factors are present) #' or of class \code{c("anova", "data.frame")}.} #' \item{\code{"lm"}}{the object fitted with \code{lm} and passed to #' \code{Anova} (i.e., an object of class \code{"lm"} or \code{"mlm"}). Also #' returned if \code{return = "lm"}.} #' \item{\code{"data"}}{a list containing: (1) \code{long} (the possibly #' aggregated data in long format used for \code{aov}), \code{wide} (the data #' used to fit the \code{lm} object), and \code{idata} (if within-subject #' factors are present, the \code{idata} argument passed to #' \code{car::Anova}). Also returned if \code{return = "data"}.} #' } #' In addition, the object has the following attributes: \code{"dv"}, #' \code{"id"}, \code{"within"}, \code{"between"}, and \code{"type"}. #' #' The \link[=afex_aov-methods]{print} method for \code{afex_aov} objects #' (invisibly) returns (and prints) the same as if \code{return} is #' \code{"nice"}: a nice ANOVA table (produced by \code{\link{nice}}) with the #' following columns: \code{Effect}, \code{df}, \code{MSE} (mean-squared #' errors), \code{F} (potentially with significant symbols), \code{ges} #' (generalized eta-squared), \code{p}. #' #' @details #' #' \subsection{Details of ANOVA Specification}{ \code{aov_ez} will concatenate #' all between-subject factors using \code{*} (i.e., producing all main effects #' and interactions) and all covariates by \code{+} (i.e., adding only the main #' effects to the existing between-subject factors). The within-subject factors #' do fully interact with all between-subject factors and covariates. This is #' essentially identical to the behavior of SPSS's \code{glm} function. #' #' The \code{formula}s for \code{aov_car} or \code{aov_4} must contain a single #' \code{Error} term specifying the \code{ID} column and potential #' within-subject factors (you can use \code{\link{mixed}} for running #' mixed-effects models with multiple error terms). Factors outside the #' \code{Error} term are treated as between-subject factors (the within-subject #' factors specified in the \code{Error} term are ignored outside the #' \code{Error} term; in other words, it is not necessary to specify them #' outside the \code{Error} term, see Examples).\cr Suppressing the intercept #' (i.e, via \code{0 +} or \code{- 1}) is ignored. Specific specifications of #' effects (e.g., excluding terms with \code{-} or using \code{^}) could be okay #' but is not tested. Using the \code{\link{I}} or \code{\link{poly}} function #' within the formula is not tested and not supported! #' #' To run an ANCOVA you need to set \code{factorize = FALSE} and make sure that #' all variables have the correct type (i.e., factors are factors and numeric #' variables are numeric and centered). #' #' Note that the default behavior is to include calculation of the effect size #' generalized eta-squared for which \strong{all non-manipluated (i.e., #' observed)} variables need to be specified via the \code{observed} argument to #' obtain correct results. When changing the effect size to \code{"pes"} #' (partial eta-squared) or \code{"none"} via \code{anova_table} this becomes #' unnecessary. #' #' If \code{check_contrasts = TRUE}, contrasts will be set to \code{"contr.sum"} #' for all between-subject factors if default contrasts are not equal to #' \code{"contr.sum"} or \code{attrib(factor, "contrasts") != "contr.sum"}. #' (within-subject factors are hard-coded \code{"contr.sum"}.) } #' #' \subsection{Statistical Issues}{ \strong{Type 3 sums of squares are default #' in \pkg{afex}.} While some authors argue that so-called type 3 sums of #' squares are dangerous and/or problematic (most notably Venables, 2000), they #' are the default in many commercial statistical application such as SPSS or #' SAS. Furthermore, statisticians with an applied perspective recommend type 3 #' tests (e.g., Maxwell and Delaney, 2004). Consequently, they are the default #' for the ANOVA functions described here. For some more discussion on this #' issue see \href{https://stats.stackexchange.com/q/6208/442}{here}. #' #' Note that lower order effects (e.g., main effects) in type 3 ANOVAs are only #' meaningful with #' \href{https://stats.idre.ucla.edu/other/mult-pkg/faq/general/faqwhat-is-effect-coding/}{effects #' coding}. That is, contrasts should be set to \code{\link{contr.sum}} to #' obtain meaningful results. This is imposed automatically for the functions #' discussed here as long as \code{check_contrasts} is \code{TRUE} (the #' default). I nevertheless recommend to set the contrasts globally to #' \code{contr.sum} via running \code{\link{set_sum_contrasts}}. For a #' discussion of the other (non-recommended) coding schemes see #' \href{https://stats.idre.ucla.edu/r/library/r-library-contrast-coding-systems-for-categorical-variables/}{here}. } #' #' \subsection{Follow-Up Contrasts and Post-Hoc Tests}{ The S3 object returned #' per default can be directly passed to \code{emmeans::emmeans} for further #' analysis. This allows to test any type of contrasts that might be of interest #' independent of whether or not this contrast involves between-subject #' variables, within-subject variables, or a combination thereof. The general #' procedure to run those contrasts is the following (see Examples for a full #' example): #' #' \enumerate{ #' \item Estimate an \code{afex_aov} object with the function returned here. For example: \code{x <- aov_car(dv ~ a*b + (id/c), d)} #' \item Obtain a \code{\link[emmeans]{emmGrid-class}} object by running \code{\link[emmeans]{emmeans}} on the \code{afex_aov} object from step 1 using the factors involved in the contrast. For example: \code{r <- emmeans(x, ~a:c)} #' \item Create a list containing the desired contrasts on the reference grid object from step 2. For example: \code{con1 <- list(a_x = c(-1, 1, 0, 0, 0, 0), b_x = c(0, 0, -0.5, -0.5, 0, 1))} #' \item Test the contrast on the reference grid using \code{\link[emmeans]{contrast}}. For example: \code{contrast(r, con1)} #' \item To control for multiple testing p-value adjustments can be specified. For example the Bonferroni-Holm correction: \code{contrast(r, con1, adjust = "holm")} #' } #' #' Note that \pkg{emmeans} allows for a variety of advanced settings and #' simplifiations, for example: all pairwise comparison of a single factor #' using one command (e.g., \code{emmeans(x, "a", contr = "pairwise")}) or #' advanced control for multiple testing by passing objects to \pkg{multcomp}. #' A comprehensive overview of the functionality is provided in the #' accompanying vignettes (see #' \href{https://CRAN.R-project.org/package=emmeans}{here}). #' #' Since version 1.0, \pkg{afex} per default uses the \code{multivariate} model #' (i.e., the \code{lm} slot of the \code{afex_aov} object) for follow-up tests #' with \pkg{emmeans}. Compared to the \code{univariate} model (i.e., the #' \code{aov} slot), this can handle unbalanced data and addresses sphericity #' better. To use the older (and not recommended) \code{model = "univariate"} #' make sure to set \code{include_aov = TRUE} when estimating the ANOVA. #' #' Starting with \pkg{afex} version 0.22, \pkg{emmeans} is \emph{not} #' loaded/attached automatically when loading \pkg{afex}. Therefore, #' \pkg{emmeans} now needs to be loaded by the user via #' \code{library("emmeans")} or \code{require("emmeans")}. #' } #' #' \subsection{Methods for \code{afex_aov} Objects}{ A full overview over the #' methods provided for \code{afex_aov} objects is provided in the corresponding #' help page: \code{\link{afex_aov-methods}}. The probably most important ones #' for end-users are \code{summary}, \code{anova}, and \code{\link{nice}}. #' #' The \code{summary} method returns, for ANOVAs containing within-subject #' (repeated-measures) factors with more than two levels, the complete #' univariate analysis: Results without df-correction, the Greenhouse-Geisser #' corrected results, the Hyunh-Feldt corrected results, and the results of the #' Mauchly test for sphericity. #' #' The \code{anova} method returns a \code{data.frame} of class \code{"anova"} #' containing the ANOVA table in numeric form (i.e., the one in slot #' \code{anova_table} of a \code{afex_aov}). This method has arguments such as #' \code{correction} and \code{es} and can be used to obtain an ANOVA table with #' different correction than the one initially specified. #' #' The \code{\link{nice}} method also returns a \code{data.frame}, but rounds #' most values and transforms them into characters for nice printing. Also has #' arguments like \code{correction} and \code{es} which can be used to obtain an #' ANOVA table with different correction than the one initially specified. } #' #' @author Henrik Singmann #' #' The design of these functions was influenced by \code{\link[ez]{ezANOVA}} #' from package \pkg{ez}. #' #' @note Calculation of ANOVA models via \code{aov} (which is done per default) #' can be comparatively slow and produce comparatively large objects for #' ANOVAs with many within-subjects factors or levels. To avoid this #' calculation set \code{include_aov = FALSE}. You can also disable this #' globally with: \code{afex_options(include_aov = FALSE)} #' #' The id variable and variables entered as within-subjects (i.e., #' repeated-measures) factors are silently converted to factors. Levels of #' within-subject factors are converted to valid variable names using #' \code{\link{make.names}(...,unique=TRUE)}. Unused factor levels are #' silently dropped on all variables. #' #' Contrasts attached to a factor as an attribute are probably not preserved #' and not supported. #' #' The workhorse is \code{aov_car}. \code{aov_4} and \code{aov_ez} only #' construe and pass an appropriate formula to \code{aov_car}. Use #' \code{print.formula = TRUE} to view this formula. #' #' In contrast to \code{\link{aov}} \code{aov_car} assumes that all factors to #' the right of \code{/} in the \code{Error} term are belonging together. #' Consequently, \code{Error(id/(a*b))} and \code{Error(id/a*b)} are identical #' (which is not true for \code{\link{aov}}). #' #' @seealso Various methods for objects of class \code{afex_aov} are available: #' \code{\link{afex_aov-methods}} #' #' \code{\link{nice}} creates the nice ANOVA tables which is by default printed. #' See also there for a slightly longer discussion of the available effect #' sizes. #' #' \code{\link{mixed}} provides a (formula) interface for obtaining p-values for #' mixed-models via \pkg{lme4}. The functions presented here do not estimate #' mixed models. #' #' @references Cramer, A. O. J., van Ravenzwaaij, D., Matzke, D., Steingroever, #' H., Wetzels, R., Grasman, R. P. P. P., ... Wagenmakers, E.-J. (2015). #' Hidden multiplicity in exploratory multiway ANOVA: Prevalence and remedies. #' \emph{Psychonomic Bulletin & Review}, 1-8. \doi{10.3758/s13423-015-0913-5} #' #' Maxwell, S. E., & Delaney, H. D. (2004). \emph{Designing Experiments and #' Analyzing Data: A Model-Comparisons Perspective}. Mahwah, N.J.: Lawrence #' Erlbaum Associates. #' #' Venables, W.N. (2000). \emph{Exegeses on linear models}. Paper presented to #' the S-Plus User's Conference, Washington DC, 8-9 October 1998, Washington, #' DC. Available from: \url{http://www.stats.ox.ac.uk/pub/MASS3/Exegeses.pdf} #' #' @importFrom car Anova #' @importFrom reshape2 dcast #' @importFrom lme4 findbars nobars #' @importFrom stats terms as.formula xtabs contrasts<- coef #' #' @example examples/examples.aov_car.R #' #' #' @encoding UTF-8 #' @export aov_car <- function(formula, data, fun_aggregate = NULL, type = afex_options("type"), factorize = afex_options("factorize"), check_contrasts = afex_options("check_contrasts"), observed = NULL, anova_table = list(), include_aov = afex_options("include_aov"), return = afex_options("return_aov"), ...) { return <- match.arg(return, c("Anova", "lm", "data", "nice", "afex_aov", "univariate", "marginal", "aov")) dots <- list(...) ### deprercate old argument names: if("check.contrasts" %in% names(dots)) { warn_deprecated_arg("check.contrasts", "check_contrasts") check_contrasts <- dots$check.contrasts dots <- dots[names(dots) != "check.contrasts"] } if("fun.aggregate" %in% names(dots)) { warn_deprecated_arg("fun.aggregate", "fun_aggregate") fun_aggregate <- dots$fun.aggregate dots <- dots[names(dots) != "fun.aggregate"] } # transform to data.frame if necessary (e.g., when using dplyr) data <- as.data.frame(data) # stuff copied from aov: Terms <- terms(formula, "Error", data = data) indError <- attr(Terms, "specials")$Error if (length(indError) > 1L) stop(sprintf(ngettext(length(indError), "there are %d Error terms: only 1 is allowed", "there are %d Error terms: only 1 is allowed"), length(indError)), domain = NA) # from here, code by Henrik Singmann: if (is.null(indError)) { stop("formula needs an error term identifying the ID column.") } vars <- all.vars(formula) #--- Russ Lenth added/modified code to detect transformed responses: lhs <- all.names(formula[[2]]) transf <- setdiff(lhs, all.vars(formula[[2]])) if (length(transf) == 0) transf = NULL if (!is.null(transf)) { origdv <- setdiff(lhs, transf) dv <- paste0(transf[1], ".", origdv) data[[dv]] <- eval(formula[[2]], envir = data) # add transformed version vars <- vars[!(vars %in% lhs)] } else { dv <- vars[1] if (!is.numeric(data[,dv])) stop("dv needs to be numeric.") #check if dv is numeric vars <- vars[-1] } #--- end RL changes parts <- attr(terms(formula, "Error", data = data), "term.labels") error.term <- parts[grepl("^Error\\(", parts)] id <- all.vars(parse(text = error.term))[1] within <- all.vars(parse(text = error.term))[-1] between <- vars[!(vars %in% c(id, within))] dv.escaped <- escape_vars(dv) id.escaped <- escape_vars(id) within.escaped <- escape_vars(within) between.escaped <- escape_vars(between) effect.parts <- parts[!grepl("^Error\\(", parts)] if (length(within) > 0) { effect.parts.no.within <- character() for (term in effect.parts) { components <- decomposeTerm(term) if ( ! any(within %in% components)) effect.parts.no.within <- c(effect.parts.no.within, term) } } else { effect.parts.no.within <- effect.parts } data <- droplevels(data) #remove empty levels. # make id and within variables to factors: if (!(is.factor(data[,id]))) data[,id] <- factor(data[,id]) # factorize if necessary if (factorize) { if (any(!vapply(data[, between, drop = FALSE], is.factor, TRUE))) { to.factor <- between[!vapply(data[,between, drop = FALSE], is.factor, TRUE)] message(paste0("Converting to factor: ", paste0(to.factor, collapse = ", "))) for (tmp.c in to.factor) { data[,tmp.c] <- factor(data[,tmp.c]) } } } else { # check if numeric variables are centered. c.ns <- between[vapply(data[, between, drop = FALSE], is.numeric, TRUE)] if (length(c.ns) > 0) { non.null <- c.ns[!abs(vapply(data[, c.ns, drop = FALSE], mean, 0)) < .Machine$double.eps ^ 0.5] if (length(non.null) > 0) warning(paste0( "Numerical variables NOT centered on 0 (i.e., likely bogus results): ", paste0(non.null, collapse = ", ")), call. = FALSE) } } for (i in c(between, within)) { if (is.factor(data[,i]) && length(unique(data[,i])) == 1) stop(paste0("Factor \"", i, "\" consists of one level only. Remove factor from model?")) } # make formulas rh2 <- if (length(between.escaped) > 0) paste0(effect.parts.no.within, collapse = "+") else "1" lh1 <- mypaste(id, if (length(between.escaped) > 0) paste0(between.escaped, collapse = "+") else NULL, sep = "+") rh1 <- paste0(within.escaped, collapse = "+") rh3 <- paste0(within.escaped, collapse = "*") # converting all within subject factors to factors and # add a leading charcter (x) if starting with a digit. for (within.factor in within) { if (is.factor(data[,within.factor])) levels(data[,within.factor]) <- make.names(levels(data[,within.factor]), unique = TRUE) else data[,within.factor] <- factor(as.character(data[,within.factor]), levels = unique(as.character(data[,within.factor])), labels = make.names(unique(as.character(data[,within.factor])), unique=TRUE)) } # Check if each id is in only one between subjects cell. between.factors <- between[vapply(data[, between, drop = FALSE], is.factor, TRUE)] if (length(between.factors) > 0) { split.data <- split(data, lapply(between.factors, function(x) data[,x])) ids.per.condition <- lapply(split.data, function(x) unique(as.character(x[,id]))) ids.in.more.condition <- unique(unlist( lapply(seq_along(ids.per.condition), function(x) unique(unlist( lapply(ids.per.condition[-x], function(y, z = ids.per.condition[[x]]) intersect(z, y))))))) if (length(ids.in.more.condition) > 0) { stop( paste0("Following ids are in more than one between subjects condition:\n", paste0(ids.in.more.condition, collapse = ", "))) } } ## check for structurally missing data # within-subjects if ((length(within) > 0) && any(table(data[within]) == 0)) { stop("Empty cells in within-subjects design ", " (i.e., bad data structure).\n", "", paste0("table(data[", deparse(within), "])"), "\n# ", paste(utils::capture.output(table(data[within])), collapse = "\n# "), call. = FALSE) } # between-subjects between_nn <- between[!vapply(data[between], is.numeric, NA)] if (length(between_nn) > 0 && any(table(data[between_nn]) == 0)) { stop("Empty cells in between-subjects design ", " (i.e., bad data structure).\n", "", paste0("table(data[", deparse(between_nn), "])"), "\n# ", paste(utils::capture.output(table(data[between_nn])), collapse = "\n# "), call. = FALSE) } # Is fun_aggregate NULL and aggregation necessary? if (is.null(fun_aggregate)) { if (any(xtabs( as.formula(paste0("~", id.escaped, if (length(within) > 0) "+", rh1)), data = data) > 1)) { warning("More than one observation per cell, aggregating the data using mean (i.e, fun_aggregate = mean)!", call. = FALSE) fun_aggregate <- mean } } # prepare the data: tmp.dat <- do.call( dcast, args = c(data = list(data), formula = as.formula(paste(lh1, if (length(within) > 0) rh1 else ".", sep = "~")), fun.aggregate = fun_aggregate, dots, value.var = dv)) # check for missing values: if (any(is.na(tmp.dat))) { missing.values <- apply(tmp.dat, 1, function(x) any(is.na(x))) missing_ids <- unique(tmp.dat[missing.values,1]) warning(paste0("Missing values for following ID(s):\n", paste0(missing_ids, collapse = ", "), "\nRemoving those cases from the analysis."), call. = FALSE) tmp.dat <- tmp.dat[!missing.values,] data <- data[ !(data[,id] %in% missing_ids),] if ((nrow(data) == 0 ) | (nrow(tmp.dat) == 0)) { stop("No observations remain after removing missing values.", "\n Try adding to ANOVA call: na.rm = TRUE", call. = FALSE) } } else { missing_ids <- NULL } # if (length(between) > 0) { # n_data_points <- xtabs(as.formula(paste("~", paste(between, collapse = "+"))), data = tmp.dat) # if (any(n_data_points == 0)) warning("Some cells of the fully crossed between-subjects design are empty. A full model might not be estimable.") # } # marginals: (disabled in April 2015), dat.ret is now used for aov() dat.ret <- do.call( dcast, args = c(data = list(data), formula = as.formula(paste0(mypaste(lh1, if (length(within) > 0) rh1 else NULL, sep = "+"), "~.")), fun.aggregate = fun_aggregate, dots, value.var = dv)) colnames(dat.ret)[length(colnames(dat.ret))] <- dv if (suppressWarnings(!isTRUE( all.equal(target = data[,c(id, between, within, dv)], current = dat.ret[,c(id, between, within, dv)], check.attributes = FALSE) ))) { data_changed <- TRUE } else { data_changed <- FALSE } if (length(between) > 0) { tmp.dat <- check_contrasts( data = tmp.dat, factors = between, check_contrasts = check_contrasts, type = type ) } if (return %in% c("aov")) include_aov <- TRUE if(include_aov){ if (check_contrasts) { factor_vars <- vapply(dat.ret[,c(within, between), drop = FALSE], is.factor, NA) contrasts <- as.list(rep("contr.sum", sum(factor_vars))) names(contrasts) <- c(within, between)[factor_vars] } tmp_formula <- formula(paste(dv.escaped, "~", if (length(within) > 0) { paste( if (rh2 == "1") { paste(within.escaped, collapse="*") } else { paste("(" ,rh2, ")*(", paste(within.escaped, collapse="*"), ")") }, "+Error(", id.escaped, "/(", paste(within.escaped, collapse="*"), "))") } else rh2)) aov <- aov(tmp_formula, data=dat.ret, contrasts = contrasts) } else { aov <- NULL } if(return == "aov") return(aov) data.l <- list(long = dat.ret, wide = tmp.dat) if (return == "data") return(tmp.dat) # branching based on type of ANOVA if (length(within) > 0) { # if within-subject factors are present: # make idata argument if (length(within) > 1) { within.levels <- lapply(lapply(data[,within], levels), factor) idata <- rev(expand.grid(rev(within.levels))) } else { idata <- data.frame(levels(data[,within]), stringsAsFactors = TRUE) colnames(idata) <- within } tmp.lm <- do.call( "lm", list(formula = as.formula(paste0("cbind(", paste0(colnames( tmp.dat[-(seq_along(c(id, between)))]), collapse = ", "), ") ~ ", rh2)), data = tmp.dat)) if (any(is.na(coef(tmp.lm)))) stop("Some parameters are not estimable, most likely due to empty cells of the design (i.e., structural missings). Check your data.") if (return == "lm") return(tmp.lm) Anova.out <- Anova(tmp.lm, idata = idata, idesign = as.formula(paste0("~", rh3)), type = type) data.l <- c(data.l, idata = list(idata)) } else { # if NO within-subjetc factors are present (i.e., purley between ANOVA): colnames(tmp.dat)[ncol(tmp.dat)] <- "dv" tmp.lm <- do.call("lm", list(formula = as.formula(paste0("dv ~ ", rh2)), data = tmp.dat)) if (return == "lm") return(tmp.lm) Anova.out <- Anova(tmp.lm, type = type) } if (return == "afex_aov") { afex_aov <- list( anova_table = NULL, aov = aov, Anova = Anova.out, lm = tmp.lm, data = data.l ) class(afex_aov) <- "afex_aov" attr(afex_aov, "dv") <- dv attr(afex_aov, "id") <- id attr(afex_aov, "within") <- if (length(within) > 0) lapply(data[, within, drop = FALSE], levels) else list() attr(afex_aov, "between") <- if (length(between) > 0) lapply(data[, between, drop = FALSE], levels) else list() attr(afex_aov, "type") <- type attr(afex_aov, "transf") <- transf attr(afex_aov, "incomplete_cases") <- missing_ids attr(afex_aov, "data_changed") <- data_changed afex_aov$anova_table <- do.call("anova", args = c(object = list(afex_aov), observed = list(observed), anova_table)) return(afex_aov) } if (return == "Anova") return(Anova.out) else if (return == "univariate") { if (inherits(Anova.out, "Anova.mlm")) return(summary(Anova.out, multivariate = FALSE)) else return(Anova.out) } else if (return == "nice") { afex_aov <- list( anova_table = NULL, Anova = Anova.out ) class(afex_aov) <- "afex_aov" attr(afex_aov, "dv") <- dv attr(afex_aov, "id") <- id attr(afex_aov, "within") <- if (length(within) > 0) lapply(data[,within, drop = FALSE], levels) else list() attr(afex_aov, "between") <- if (length(between) > 0) lapply(data[,between,drop=FALSE], levels) else list() attr(afex_aov, "type") <- type afex_aov$anova_table <- do.call("anova", args = c(object = list(afex_aov), observed = list(observed), anova_table)) return(do.call("nice", args = c(object = list(afex_aov), observed = list(observed), anova_table))) } } #' @describeIn aov_car Allows definition of ANOVA-model using #' \code{lme4::lmer}-like Syntax (but still fits a standard ANOVA). #' @export aov_4 <- function(formula, data, observed = NULL, fun_aggregate = NULL, type = afex_options("type"), factorize = afex_options("factorize"), check_contrasts = afex_options("check_contrasts"), return = afex_options("return_aov"), anova_table = list(), include_aov = afex_options("include_aov"), ..., print.formula = FALSE) { barterms <- findbars(formula) if (length(barterms) > 1) stop("aov_4 only allows one random effect term") within <- all.vars(barterms[[1]][[2]]) id <- all.vars(barterms[[1]][[3]]) id <- escape_vars(id) within <- escape_vars(within) error <- paste0(" + Error(", id, if (length(within) > 0) "/(" else "", paste0(within, collapse = " * "), if (length(within) > 0) ")" else "", ")") lh <- as.character(nobars(formula)) if (length(lh) == 1) { dv <- lh rh <- "1" } else { dv <- lh[2] rh <- lh[3] } formula <- paste0(dv, " ~ ", rh, error) if (print.formula) message(paste0("Formula send to aov_car: ", formula)) aov_car(formula = as.formula(formula), data = data, fun_aggregate = fun_aggregate, type = type, return = return, factorize = factorize, check_contrasts = check_contrasts, observed = observed, anova_table = anova_table, include_aov = include_aov, ...) } #' @describeIn aov_car Allows definition of ANOVA-model using character strings. #' @export aov_ez <- function(id, dv, data, between = NULL, within = NULL, covariate = NULL, observed = NULL, fun_aggregate = NULL, transformation, type = afex_options("type"), factorize = afex_options("factorize"), check_contrasts = afex_options("check_contrasts"), return = afex_options("return_aov"), anova_table = list(), include_aov = afex_options("include_aov"), ..., print.formula = FALSE) { if (is.null(between) & is.null(within)) stop("Either between or within need to be non-NULL!") if (!is.null(covariate)) { covariate <- escape_vars(covariate) covariate <- paste0(covariate, collapse = "+") } id <- escape_vars(id) dv <- escape_vars(dv) between <- escape_vars(between) within <- escape_vars(within) rh <- if (!is.null(between) || !is.null(covariate)) mypaste(if (!is.null(between)) paste0(between, collapse = " * ") else NULL, covariate, sep = "+") else "1" error <- paste0(" + Error(", id, if (!is.null(within)) "/(" else "", paste0(within, collapse = " * "), if (length(within) > 0) ")" else "", ")") if (!missing(transformation)) dv <- paste0(transformation, "(", dv, ")") formula <- paste0(dv, " ~ ", rh, error) if (print.formula) message(paste0("Formula send to aov_car: ", formula)) aov_car(formula = as.formula(formula), data = data, fun_aggregate = fun_aggregate, type = type, return = return, factorize = factorize, check_contrasts = check_contrasts, observed = observed, anova_table = anova_table, include_aov = include_aov, ...) } afex/R/set_contrasts.R0000644000176200001440000000273513664111747014435 0ustar liggesusers#' Set global contrasts #' #' These functions are simple wrappers to set contrasts globally via \code{options(contrasts = ...)}. #' #' @usage set_sum_contrasts() #' #' set_deviation_contrasts() #' #' set_effects_contrasts() #' #' set_default_contrasts() #' #' set_treatment_contrasts() #' #' #' @details \code{set_deviation_contrasts} and \code{set_effects_contrasts} are wrappers for \code{set_sum_contrasts}. Likewise, \code{set_default_contrasts} is a wrapper to \code{set_treatment_contrasts()}. #' #' @return nothing. These functions are called for their side effects to change the global options. #' #' @name set_sum_contrasts #' @aliases set_sum_contrasts set_deviation_contrasts set_effects_contrasts set_treatment_contrasts set_default_contrasts #' @export set_sum_contrasts set_deviation_contrasts set_effects_contrasts set_treatment_contrasts set_default_contrasts set_sum_contrasts <- function() { message("setting contr.sum globally: options(contrasts=c('contr.sum', 'contr.poly'))") options(contrasts=c('contr.sum', 'contr.poly')) } set_deviation_contrasts <- function() { set_sum_contrasts() } set_effects_contrasts <- function() { set_sum_contrasts() } set_treatment_contrasts <- function() { message("setting contr.treatment globally: options(contrasts=c('contr.treatment', 'contr.poly'))") options(contrasts=c('contr.treatment', 'contr.poly')) } set_default_contrasts <- function() { set_treatment_contrasts() } afex/R/sk2011.2-data.R0000644000176200001440000000571113664111747013527 0ustar liggesusers#' Data from Singmann & Klauer (2011, Experiment 2) #' #' Singmann and Klauer (2011) were interested in whether or not conditional reasoning can be explained by a single process or whether multiple processes are necessary to explain it. To provide evidence for multiple processes we aimed to establish a double dissociation of two variables: instruction type and problem type. Instruction type was manipulated between-subjects, one group of participants received deductive instructions (i.e., to treat the premises as given and only draw necessary conclusions) and a second group of participants received probabilistic instructions (i.e., to reason as in an everyday situation; we called this "inductive instruction" in the manuscript). Problem type consisted of two different orthogonally crossed variables that were manipulated within-subjects, validity of the problem (formally valid or formally invalid) and type of the problem. Problem type consistent of three levels: prological problems (i.e., problems in which background knowledge suggested to accept valid but reject invalid conclusions), neutral problems (i.e., in which background knowledge suggested to reject all problems), and counterlogical problems (i.e., problems in which background knowledge suggested to reject valid but accept invalid conclusions). #' #' This data set contains 63 participants in contrast to the originally reported 56 participants. The additional participants were not included in the original studies as they did not meet the inclusion criteria (i.e., no students, prior education in logic, or participated in a similar experiment). The IDs of those additional participants are: 7, 8, 9, 12, 17, 24, 30. The excluded participant reported in the paper has ID 16. #' #' content has the following levels (C = content/conditional):\cr #' 1 = Wenn eine Person in ein Schwimmbecken gefallen ist, dann ist sie nass.\cr #' 2 = Wenn ein Hund Flöhe hat, dann kratzt er sich hin und wieder.\cr #' 3 = Wenn eine Seifenblase mit einer Nadel gestochen wurde, dann platzt sie.\cr #' 4 = Wenn ein Mädchen Geschlechtsverkehr vollzogen hat, dann ist es schwanger.\cr #' 5 = Wenn eine Pflanze ausreichend gegossen wird, dann bleibt sie grün.\cr #' 6 = Wenn sich eine Person die Zähne putzt, dann bekommt sie KEIN Karies.\cr #' 7 = Wenn eine Person viel Cola trinkt, dann nimmt sie an Gewicht zu.\cr #' 8 = Wenn eine Person die Klimaanlage angeschaltet hat, dann fröstelt sie.\cr #' 9 = Wenn eine Person viel lernt, dann wird sie in der Klausur eine gute Note erhalten. #' #' @docType data #' @keywords dataset #' @name sk2011.2 #' @usage sk2011.2 #' @format A data.frame with 2268 rows and 9 variables. #' @source Singmann, H., & Klauer, K. C. (2011). Deductive and inductive conditional inferences: Two modes of reasoning. Thinking & Reasoning, 17(3), 247-281. doi:10.1080/13546783.2011.572718 #' #' @encoding UTF-8 #' #' @example examples/examples.sk2011.2.R NULL afex/R/sk2011.1-data.R0000644000176200001440000000572013664111747013526 0ustar liggesusers#' Data from Singmann & Klauer (2011, Experiment 1) #' #' Singmann and Klauer (2011) were interested in whether or not conditional reasoning can be explained by a single process or whether multiple processes are necessary to explain it. To provide evidence for multiple processes we aimed to establish a double dissociation of two variables: instruction type and problem type. Instruction type was manipulated between-subjects, one group of participants received deductive instructions (i.e., to treat the premises as given and only draw necessary conclusions) and a second group of participants received probabilistic instructions (i.e., to reason as in an everyday situation; we called this "inductive instruction" in the manuscript). Problem type consisted of two different orthogonally crossed variables that were manipulated within-subjects, validity of the problem (formally valid or formally invalid) and plausibility of the problem (inferences which were consisted with the background knowledge versus problems that were inconsistent with the background knowledge). The critical comparison across the two conditions was among problems which were valid and implausible with problems that were invalid and plausible. For example, the next problem was invalid and plausible: #' #' If a person is wet, then the person fell into a swimming pool. \cr #' A person fell into a swimming pool. \cr #' How valid is the conclusion/How likely is it that the person is wet? #' #' For those problems we predicted that under deductive instructions responses should be lower (as the conclusion does not necessarily follow from the premises) as under probabilistic instructions. For the valid but implausible problem, an example is presented next, we predicted the opposite pattern: #' #' If a person is wet, then the person fell into a swimming pool. \cr #' A person is wet. \cr #' How valid is the conclusion/How likely is it that the person fell into a swimming pool? #' #' Our study also included valid and plausible and invalid and implausible problems. #' #' Note that the factor `plausibility` is not present in the original manuscript, there it is a results of a combination of other factors. #' #' #' @docType data #' @keywords dataset #' @name sk2011.1 #' @usage sk2011.1 #' @format A data.frame with 640 rows and 9 variables. #' @source Singmann, H., & Klauer, K. C. (2011). Deductive and inductive conditional inferences: Two modes of reasoning. Thinking & Reasoning, 17(3), 247-281. doi:10.1080/13546783.2011.572718 #' #' @encoding UTF-8 #' #' @examples #' data(sk2011.1) #' #' # Table 1 (p. 264): #' aov_ez("id", "response", sk2011.1[ sk2011.1$what == "affirmation",], #' within = c("inference", "type"), between = "instruction", #' anova_table=(es = "pes")) #' aov_ez("id", "response", sk2011.1[ sk2011.1$what == "denial",], #' within = c("inference", "type"), between = "instruction", #' anova_table=(es = "pes")) #' #' NULL afex/R/methods.afex_aov.R0000644000176200001440000003203714076011251014755 0ustar liggesusers#' Methods for afex_aov objects #' #' Methods defined for objects returned from the ANOVA functions #' \code{\link{aov_car}} et al. of class \code{afex_aov} containing both the #' ANOVA fitted via \code{car::Anova} and base R's \code{aov}. #' #' @param object,x object of class \code{afex_aov} as returned from #' \code{\link{aov_car}} and related functions. #' @param p_adjust_method \code{character} indicating if p-values for individual #' effects should be adjusted for multiple comparisons (see #' \link[stats]{p.adjust} and details). #' @param ... further arguments passed through, see description of return value #' for details. #' @param trms,xlev,grid same as for \code{\link[emmeans]{emm_basis}}. #' @param model argument for \code{\link[emmeans]{emmeans}()} and related #' functions that allows to choose on which model the follow-up tests for #' ANOVAs with repeated-measures factors are based. \code{"multivariate"} (the #' default) uses the \code{lm} model and \code{"univariate"} uses the #' \code{aov} model. Default given by \code{afex_options("emmeans_mode")}. #' Multivariate tests likely work better for unbalanced data and provide a #' better correction for violations of sphericity. #' #' @return #' \describe{ #' \item{\code{anova}}{Returns an ANOVA table of class \code{c("anova", #' "data.frame")}. Information such as effect size (\code{es}) or #' df-correction are calculated each time this method is called.} #' \item{\code{summary}}{For ANOVAs containing within-subject factors it #' returns the full output of the within-subject tests: the uncorrected #' results, results containing Greenhousse-Geisser and Hyunh-Feldt correction, #' and the results of the Mauchly test of sphericity (all achieved via #' \code{summary.Anova.mlm}). For other ANOVAs, the \code{anova} table is #' simply returned.} #' \item{\code{print}}{Prints (and invisibly returns) the ANOVA table as #' constructed from \code{\link{nice}} (i.e., as strings rounded nicely). #' Arguments in \code{...} are passed to \code{nice} allowing to pass #' arguments such as \code{es} and \code{correction}.} #' \item{\code{recover_data} and \code{emm_basis}}{Provide the backbone for #' using \code{\link[emmeans]{emmeans}} and related functions from #' \pkg{emmeans} directly on \code{afex_aov} objects by returning a #' \code{\link[emmeans]{emmGrid-class}} object. Should not be called directly #' but through the functionality provided by \pkg{emmeans}.} #' } #' #' @details #' Exploratory ANOVA, for which no detailed hypotheses have been specified a #' priori, harbor a multiple comparison problem (Cramer et al., 2015). To avoid #' an inflation of familywise Type I error rate, results need to be corrected #' for multiple comparisons using \code{p_adjust_method}. \code{p_adjust_method} #' defaults to the method specified in the call to \code{\link{aov_car}} in #' \code{anova_table}. If no method was specified and \code{p_adjust_method = #' NULL} p-values are not adjusted. #' #' @seealso \code{residuals} and \code{fitted} methods also exists for #' \code{afex_aov} objects, see: \code{\link{residuals.afex_aov}}. #' #' @references #' Cramer, A. O. J., van Ravenzwaaij, D., Matzke, D., Steingroever, H., Wetzels, #' R., Grasman, R. P. P. P., ... Wagenmakers, E.-J. (2015). Hidden multiplicity #' in exploratory multiway ANOVA: Prevalence and remedies. \emph{Psychonomic #' Bulletin & Review}, 1-8. \doi{10.3758/s13423-015-0913-5} #' #' @name afex_aov-methods #' @importFrom stats p.adjust NULL #### methods for afex_aov #' @rdname afex_aov-methods #' @inheritParams nice #' @method anova afex_aov #' @export anova.afex_aov <- function(object, es = afex_options("es_aov"), observed = NULL, correction = afex_options("correction_aov"), MSE = TRUE, intercept = FALSE, p_adjust_method = NULL, sig_symbols = attr(object$anova_table, "sig_symbols"), ...) { # internal functions: # check arguments dots <- list(...) if("p.adjust.method" %in% names(dots)) { #(!missing(sig.symbols)) { warn_deprecated_arg("p.adjust.method", "p_adjust_method") p_adjust_method <- dots$p.adjust.method } es <- match.arg(es, c("none", "ges", "pes"), several.ok = TRUE) correction <- match.arg(correction, c("GG", "HF", "none")) if (inherits(object$Anova, "Anova.mlm")) { tmp <- suppressWarnings(summary(object$Anova, multivariate = FALSE)) t.out <- tmp[["univariate.tests"]] #browser() #t.out <- cbind(t.out, orig_den_df = t.out[, "den Df"]) if (correction[1] == "GG") { tmp[["pval.adjustments"]] <- tmp[["pval.adjustments"]][ !is.na(tmp[["pval.adjustments"]][,"GG eps"]),, drop = FALSE] t.out[row.names(tmp[["pval.adjustments"]]), "num Df"] <- t.out[row.names(tmp[["pval.adjustments"]]), "num Df"] * tmp[["pval.adjustments"]][,"GG eps"] t.out[row.names(tmp[["pval.adjustments"]]), "den Df"] <- t.out[row.names(tmp[["pval.adjustments"]]), "den Df"] * tmp[["pval.adjustments"]][,"GG eps"] t.out[row.names(tmp[["pval.adjustments"]]), "Pr(>F)"] <- tmp[["pval.adjustments"]][,"Pr(>F[GG])"] } else { if (correction[1] == "HF") { try(if (any(tmp[["pval.adjustments"]][,"HF eps"] > 1)) warning("HF eps > 1 treated as 1", call. = FALSE), silent = TRUE) tmp[["pval.adjustments"]] <- tmp[["pval.adjustments"]][ !is.na(tmp[["pval.adjustments"]][,"HF eps"]),, drop = FALSE] t.out[row.names(tmp[["pval.adjustments"]]), "num Df"] <- t.out[row.names(tmp[["pval.adjustments"]]), "num Df"] * pmin(1, tmp[["pval.adjustments"]][,"HF eps"]) t.out[row.names(tmp[["pval.adjustments"]]), "den Df"] <- t.out[row.names(tmp[["pval.adjustments"]]), "den Df"] * pmin(1, tmp[["pval.adjustments"]][,"HF eps"]) t.out[row.names(tmp[["pval.adjustments"]]), "Pr(>F)"] <- tmp[["pval.adjustments"]][,"Pr(>F[HF])"] } else { if (correction[1] == "none") { TRUE } else stop("None supported argument to correction.") } } tmp.df <- t.out tmp2 <- as.data.frame(unclass(tmp.df)) #} else if (class(object$Anova)[1] == "anova") { } else if (inherits(object$Anova, "anova")) { #browser() tmp.df <- cbind(object$Anova[-nrow(object$Anova),], data.frame("Error SS" = object$Anova[nrow(object$Anova), "Sum Sq"], "den Df" = object$Anova[nrow(object$Anova), "Df"], check.names = FALSE)) colnames(tmp.df)[1:3] <- c("SS", "num Df", "F") #tmp.df$orig_den_df <- tmp.df[, "den Df"] tmp2 <- as.data.frame(tmp.df) } else stop("Non-supported object passed. Slot 'Anova' needs to be of class 'Anova.mlm' or 'anova'.") tmp2[,"MSE"] <- tmp2[,"Error SS"]/tmp2[,"den Df"] ## provision for car 3.0 (March 2018), for calculation of es if ("Sum Sq" %in% colnames(tmp2)) { tmp2$SS <- tmp2[,"Sum Sq"] } # calculate es es_df <- data.frame(row.names = rownames(tmp2)) if ("pes" %in% es) { es_df$pes <- tmp2$SS/(tmp2$SS + tmp2[,"Error SS"]) } if ("ges" %in% es) { # This code is basically a copy from ezANOVA by Mike Lawrence! if(!is.null(observed) & length(observed) > 0){ obs <- rep(FALSE,nrow(tmp2)) for(i in observed){ if (!any(grepl(paste0("\\b",i,"\\b"), rownames(tmp2)))) stop(paste0("Observed variable not in data: ", i)) obs <- obs | grepl(paste0("\\b",i,"\\b"), rownames(tmp2)) } obs_SSn1 <- sum(tmp2$SS*obs) obs_SSn2 <- tmp2$SS*obs } else { obs_SSn1 <- 0 obs_SSn2 <- 0 } es_df$ges <- tmp2$SS/(tmp2$SS+sum(unique(tmp2[,"Error SS"])) + obs_SSn1-obs_SSn2) } colname_f <- grep("^F", colnames(tmp2), value = TRUE) anova_table <- cbind(tmp2[,c("num Df", "den Df", "MSE")], F = tmp2[,colname_f], es_df, "Pr(>F)" = tmp2[,c("Pr(>F)")]) #browser() if (!MSE) anova_table$MSE <- NULL if (!intercept) if (row.names(anova_table)[1] == "(Intercept)") anova_table <- anova_table[-1,, drop = FALSE] # Correct for multiple comparisons if(is.null(p_adjust_method)) p_adjust_method <- ifelse(is.null(attr(object$anova_table, "p_adjust_method")), "none", attr(object$anova_table, "p_adjust_method")) anova_table[,"Pr(>F)"] <- p.adjust(anova_table[,"Pr(>F)"], method = p_adjust_method) class(anova_table) <- c("anova", "data.frame") p_adj_heading <- if(p_adjust_method != "none") paste0(", ", p_adjust_method, "-adjusted") else NULL attr(anova_table, "heading") <- c(paste0("Anova Table (Type ", attr(object, "type"), " tests", p_adj_heading, ")\n"), paste("Response:", attr(object, "dv"))) attr(anova_table, "p_adjust_method") <- p_adjust_method attr(anova_table, "es") <- es attr(anova_table, "correction") <- if(length(attr(object, "within")) > 0 && any( vapply(object$data$long[, names(attr(object, "within")), drop = FALSE], nlevels, 0) > 2)) correction else "none" attr(anova_table, "observed") <- if(!is.null(observed) & length(observed) > 0) observed else character(0) attr(anova_table, "incomplete_cases") <- attr(object, "incomplete_cases") attr(anova_table, "sig_symbols") <- if(!is.null(sig_symbols)) sig_symbols else afex_options("sig_symbols") anova_table } #' @rdname afex_aov-methods #' @method print afex_aov #' @importFrom stats symnum #' @export print.afex_aov <- function(x, ...) { out <- nice(x$anova_table, ...) print(out) invisible(out) } #' @rdname afex_aov-methods #' @method summary afex_aov #' @export summary.afex_aov <- function(object, ...) { if (inherits(object$Anova, "Anova.mlm")) { #if (class(object$Anova)[1] == "Anova.mlm") { if(attr(object$anova_table, "p_adjust_method") != "none") message("Note, results are NOT adjusted for multiple comparisons as requested\n(p_adjust_method = '", attr(object$anova_table, "p_adjust_method"), "')\nbecause the desired method of sphericity correction is unknown.\nFor adjusted p-values print the object (to see object$anova_table), or call\none of anova.afex_aov() or nice().") return(summary(object$Anova, multivariate = FALSE)) #} else if (class(object$Anova)[1] == "anova") { } else if (inherits(object$Anova, "anova")) { return(object$anova_table) } else stop("Non-supported object passed. Slot 'Anova' needs to be of class 'Anova.mlm' or 'anova'.") } #-------------------------------------------------------------- ### afex package - mixed objects ### # just need to provide an 'emmeans' method here #' @rdname afex_aov-methods ## @importFrom emmeans recover_data emm_basis #' @importFrom utils packageVersion ## @method recover.data afex_aov ## @export recover_data.afex_aov = function(object, ..., model = afex_options("emmeans_model")) { model <- match.arg(model, c("univariate", "multivariate")) if (model == "univariate" & is.null(object$aov)) { message("aov object missing, substituting multivariate/lm model.\nto get univariate tests, refit ANOVA with include_aov = TRUE") model <- "multivariate" } if (model == "univariate") { emmeans::recover_data(object = object$aov, ...) } else if (model == "multivariate") { if (packageVersion("emmeans") < "1.1.2") stop("emmeans version >= 1.1.2 required for multivariate tests") out <- emmeans::recover_data(object$lm, ...) if (length(attr(object, "within")) > 0) { out$misc$ylevs <- rev(attr(object, "within")) } return(out) } } #' @rdname afex_aov-methods ## @method lsm.basis afex_aov ## @export emm_basis.afex_aov = function(object, trms, xlev, grid, ..., model = afex_options("emmeans_model")) { model <- match.arg(model, c("univariate", "multivariate")) if (model == "univariate" & is.null(object$aov)) { #message("Substituting multivariate/lm model, as aov object missing.") model <- "multivariate" } if (model == "univariate") { out <- emmeans::emm_basis(object$aov, trms, xlev, grid, ...) } else if (model == "multivariate") { out <- emmeans::emm_basis(object$lm, trms, xlev, grid, ...) if (length(attr(object, "within")) > 0) { out$misc$ylevs <- rev(attr(object, "within")) } } out$misc$tran = attr(object, "transf") return(out) } afex/R/mixed.R0000644000176200001440000015460714076011251012641 0ustar liggesusers#' p-values for fixed effects of mixed-model via lme4::lmer() #' #' @description Estimates mixed models with \pkg{lme4} and calculates p-values #' for all fixed effects. The default method \code{"KR"} (= Kenward-Roger) as #' well as \code{method="S"} (Satterthwaite) support LMMs and estimate the #' model with \code{\link[lmerTest]{lmer}} and then pass it to the #' \code{\link[lmerTest]{lmerTest}} \code{anova} method (or #' \code{\link[car]{Anova}}). The other methods (\code{"LRT"} = #' likelihood-ratio tests and \code{"PB"} = parametric bootstrap) support both #' LMMs (estimated via \code{\link[lme4]{lmer}}) and GLMMs (i.e., with #' \code{family} argument which invokes estimation via #' \code{\link[lme4]{glmer}}) and estimate a full model and restricted models #' in which the parameters corresponding to one effect (i.e., model term) are #' withhold (i.e., fixed to 0). Per default tests are based on Type 3 sums of #' squares. \code{print}, \code{nice}, \code{anova}, and \code{summary} #' methods for the returned object of class \code{"mixed"} are available. #' \code{summary} invokes the default \pkg{lme4} summary method and shows #' parameters instead of effects. #' #' \code{lmer_alt} is simply a wrapper for mixed that only returns the #' \code{"lmerModLmerTest"} or \code{"merMod"} object and correctly uses the #' \code{||} notation for removing correlations among factors. This function #' otherwise behaves like \code{g/lmer} (as for \code{mixed}, it calls #' \code{glmer} as soon as a \code{family} argument is present). Use #' \code{\link{afex_options}}\code{("lmer_function")} to set which function #' for estimation should be used. This option determines the class of the #' returned object (i.e., \code{"lmerModLmerTest"} or \code{"merMod"}). #' #' #' @param formula a formula describing the full mixed-model to be fitted. As #' this formula is passed to \code{lmer}, it needs at least one random term. #' @param data \code{data.frame} containing the data. Should have all the #' variables present in \code{fixed}, \code{random}, and \code{dv} as columns. #' @param type type of test on which effects are based. Default is to use type 3 #' tests, taken from \code{\link{afex_options}}. #' @param method character vector indicating which methods for obtaining #' p-values should be used: \code{"S"} corresponds to the Satterthwaite #' approximation for degrees of freedom (via \code{\link{lmerTest}}, only #' LMMs), \code{"KR"} corresponds to the Kenward-Roger approximation for #' degrees of freedom (only LMMs), \code{"PB"} calculates p-values based on #' parametric bootstrap, \code{"LRT"} calculates p-values via the likelihood #' ratio tests implemented in the \code{anova} method for \code{merMod} #' objects (only recommended for models with many [i.e., > 50] levels for the #' random factors). The default (currently \code{"S"}) is taken from #' \code{\link{afex_options}}. For historical compatibility \code{"nested-KR"} #' is also supported which was the default KR-method in previous versions. #' @param per_parameter \code{character} vector specifying for which variable #' tests should be run for each parameter (instead for the overall effect). #' Can be useful e.g., for testing ordered factors. Uses \code{\link{grep}} #' for selecting parameters among the fixed effects so regular expressions #' (\code{\link{regex}}) are possible. See Examples. #' @param args_test \code{list} of arguments passed to the function calculating #' the p-values. See Details. #' @param test_intercept logical. Whether or not the intercept should also be #' fitted and tested for significance. Default is \code{FALSE}. Only relevant #' if \code{type = 3}. #' @param check_contrasts \code{logical}. Should contrasts be checked and (if #' necessary) changed to \code{"contr.sum"}? See Details. The default #' (\code{"TRUE"}) is taken from \code{\link{afex_options}}. #' @param expand_re logical. Should random effects terms be expanded (i.e., #' factors transformed into numerical variables) before fitting with #' \code{(g)lmer}? Allows to use "||" notation with factors. #' @param all_fit logical. Should \code{\link{all_fit}} be used to fit each #' model with each available optimization algorithm and the results that #' provided the best fit in each case be used? Warning: This can dramatically #' increase the optimization time. Adds two new attributes to the returned #' object designating which algorithm was selected and the log-likelihoods for #' each algorithm. Note that only warnings from the initial fit are emitted #' during fitting. The warnings of the chosen models are emitted when printing #' the returned object. #' @param set_data_arg \code{logical}. Should the data argument in the slot #' \code{call} of the \code{merMod} object returned from \code{lmer} be set to #' the passed data argument? If \code{FALSE} (currently the default) the name #' will be \code{data}. \code{TRUE} may be helpful when fitted objects are #' used afterwards (e.g., compared using \code{anova} or when using the #' \code{effects} package, see examples). \pkg{emmeans} functions appear to #' work better with \code{FALSE}. Default is given by #' afex_options("set_data_arg"). #' @param progress if \code{TRUE}, shows progress with a text progress bar and #' other status messages during estimation #' @param cl A vector identifying a cluster; used for distributing the #' estimation of the different models using several cores (if seveal models #' are calculated). See examples. If \code{ckeck_contrasts = TRUE}, mixed sets #' the current contrasts (\code{getOption("contrasts")}) at the nodes. Note #' this does \emph{not} distribute calculation of p-values (e.g., when using #' \code{method = "PB"}) across the cluster. Use \code{args_test} for this. #' @param return the default is to return an object of class \code{"mixed"}. #' \code{return = "merMod"} will skip the calculation of all submodels and #' p-values and simply return the full model estimated with \code{lmer} (note #' that somewhat unintuiviely, the returned object can either be of class #' \code{"lmerModLmerTest"} or of class \code{"merMod"}, depending on the #' value of \code{\link{afex_options}}\code{("lmer_function")}). Can be useful #' in combination with \code{expand_re = TRUE} which allows to use "||" with #' factors. \code{return = "data"} will not fit any models but just return the #' data that would have been used for estimating the model (note that the data #' is also part of the returned object). #' @param sig_symbols Character. What should be the symbols designating #' significance? When entering an vector with \code{length(sig.symbol) < 4} #' only those elements of the default (\code{c(" +", " *", " **", " ***")}) #' will be replaced. \code{sig_symbols = ""} will display the stars but not #' the \code{+}, \code{sig_symbols = rep("", 4)} will display no symbols. The #' default is given by \code{afex_options("sig_symbols")}. #' @param ... further arguments (such as \code{weights}, \code{family}, or #' \code{control}) passed to \code{\link{lmer}}/\code{\link{glmer}}. Note that #' additional data (e.g., \code{weights}) need to be passed fully and not only #' by name (e.g., \code{weights = df$weights} and not \code{weights = #' weights}). #' #' #' @return An object of class \code{"mixed"} (i.e., a list) with the following #' elements: #' #' \enumerate{ #' \item \code{anova_table} a data.frame containing the statistics returned #' from \code{\link[pbkrtest]{KRmodcomp}}. The \code{stat} column in this #' data.frame gives the value of the test statistic, an F-value for #' \code{method = "KR"} and a chi-square value for the other two methods. #' \item \code{full_model} the \code{"lmerModLmerTest"} or \code{"merMod"} #' object returned from estimating the full model. Use #' \code{\link{afex_options}}\code{("lmer_function")} for setting which #' function for estimation should be used. The possible options are #' \code{"lmerTest"} (the default returning an object of class #' \code{"lmerModLmerTest"}) and \code{"lme4"} returning an object of class #' (\code{"merMod"}). Note that in case a \code{family} argument is present #' an object of class \code{"glmerMod"} is always returned. #' \item \code{restricted_models} a list of \code{"g/lmerMod"} (or #' \code{"lmerModLmerTest"}) objects from estimating the restricted models #' (i.e., each model lacks the corresponding effect) #' \item \code{tests} a list of objects returned by the function for #' obtaining the p-values. #' \item \code{data} The data used for estimation (i.e., after excluding #' missing rows and applying expand_re if requested). #' \item \code{call} The matched call. #' } #' #' It also has the following attributes, \code{"type"} and \code{"method"}. And #' the attributes \code{"all_fit_selected"} and \code{"all_fit_logLik"} if #' \code{all_fit=TRUE}. #' #' Two similar methods exist for objects of class \code{"mixed"}: \code{print} #' and \code{anova}. They print a nice version of the \code{anova_table} element #' of the returned object (which is also invisibly returned). This methods omit #' some columns and nicely round the other columns. The following columns are #' always printed: #' \enumerate{ #' \item \code{Effect} name of effect #' \item \code{p.value} estimated p-value for the effect #' } #' #' For LMMs with \code{method="KR"} or \code{method="S"} the following further #' columns are returned (note: the Kenward-Roger correction does two separate #' things: (1) it computes an effective number for the denominator df; (2) it #' scales the statistic by a calculated amount, see also #' \url{https://stackoverflow.com/a/25612960/289572}): #' \enumerate{ #' \item \code{F} computed F statistic #' \item \code{ndf} numerator degrees of freedom (number of parameters used #' for the effect) #' \item \code{ddf} denominator degrees of freedom (effective residual #' degrees of freedom for testing the effect), computed from the #' Kenward-Roger correction using \code{pbkrtest::KRmodcomp} #' \item \code{F.scaling} scaling of F-statistic computing from Kenward-Roger #' approximation (only printed if \code{method="nested-KR"}) #' } #' #' For models with \code{method="LRT"} the following further columns are #' returned: #' \enumerate{ #' \item \code{df.large} degrees of freedom (i.e., estimated paramaters) for #' full model (i.e., model containing the corresponding effect) #' \item \code{df.small} degrees of freedom (i.e., estimated paramaters) for #' restricted model (i.e., model without the corresponding effect) #' \item \code{chisq} 2 times the difference in likelihood (obtained with #' \code{logLik}) between full and restricted model #' \item \code{df} difference in degrees of freedom between full and #' restricted model (p-value is based on these df). #' } #' #' For models with \code{method="PB"} the following further column is returned: #' \enumerate{ #' \item \code{stat} 2 times the difference in likelihood (obtained with #' \code{logLik}) between full and restricted model (i.e., a chi-square #' value). #' } #' #' Note that \code{anova} can also be called with additional mixed and/or #' \code{merMod} objects. In this casethe full models are passed on to #' \code{anova.merMod} (with \code{refit=FALSE}, which differs from the default #' of \code{anova.merMod}) which produces the known LRT tables. #' #' The \code{summary} method for objects of class \code{mixed} simply calls #' \code{\link{summary.merMod}} on the full model. #' #' If \code{return = "merMod"} (or when invoking \code{lmer_alt}), an object of #' class \code{"lmerModLmerTest"} or of class \code{"merMod"} (depending on the #' value of \code{\link{afex_options}}\code{("lmer_function")}), as returned #' from \code{g/lmer}, is returned. The default behavior is to return an object #' of class \code{"lmerModLmerTest"} estimated via \code{\link[lmerTest]{lmer}}. #' #'@details For an introduction to mixed-modeling for experimental designs see #' our chapter #' (\href{http://singmann.org/download/publications/singmann_kellen-introduction-mixed-models.pdf}{Singmann #' & Kellen, in press}) or Barr, Levy, Scheepers, & Tily (2013). Arguments for #' using the Kenward-Roger approximation for obtaining p-values are given by #' Judd, Westfall, and Kenny (2012). Further introductions to mixed-modeling #' for experimental designs are given by Baayen and colleagues (Baayen, 2008; #' Baayen, Davidson & Bates, 2008; Baayen & Milin, 2010). Specific #' recommendations on which random effects structure to specify for #' confirmatory tests can be found in Barr and colleagues (2013) and Barr #' (2013), but also see Bates et al. (2015). #' #' \subsection{p-value Calculations}{ #' #' When \code{method = "KR"} (implemented via #' \code{\link[pbkrtest]{KRmodcomp}}), the Kenward-Roger approximation for #' degrees-of-freedom is calculated using \code{\link[lmerTest]{lmerTest}} (if #' \code{test_intercept=FALSE}) or \code{\link[car]{Anova}} (if #' \code{test_intercept=TRUE}), which is only applicable to linear-mixed models #' (LMMs). The test statistic in the output is an F-value (\code{F}). A similar #' method that requires less RAM is \code{method = "S"} which calculates the #' Satterthwaite approximation for degrees-of-freedom via #' \code{\link[lmerTest]{lmerTest}} and is also only applicable to LMMs. #' \code{method = "KR"} or \code{method = "S"} provide the best control for #' Type 1 errors for LMMs (Luke, 2017). #' #' \code{method = "PB"} calculates p-values using parametric bootstrap using #' \code{\link[pbkrtest]{PBmodcomp}}. This can be used for linear and also #' generalized linear mixed models (GLMMs) by specifying a #' \code{\link[stats]{family}} argument to \code{mixed}. Note that you should #' specify further arguments to \code{PBmodcomp} via \code{args_test}, #' especially \code{nsim} (the number of simulations to form the reference #' distribution) or \code{cl} (for using multiple cores). For other arguments #' see \code{\link[pbkrtest]{PBmodcomp}}. Note that \code{REML} (argument to #' \code{[g]lmer}) will be set to \code{FALSE} if method is \code{PB}. #' #' \code{method = "LRT"} calculates p-values via likelihood ratio tests #' implemented in the \code{anova} method for \code{"merMod"} objects. This is #' the method recommended by Barr et al. (2013; which did not test the other #' methods implemented here). Using likelihood ratio tests is only recommended #' for models with many levels for the random effects (> 50), but can be pretty #' helpful in case the other methods fail (due to memory and/or time #' limitations). The #' \href{http://bbolker.github.io/mixedmodels-misc/glmmFAQ.html}{lme4 faq} also #' recommends the other methods over likelihood ratio tests. } #' #' \subsection{Implementation Details}{ #' #' For methods \code{"KR"} and \code{"S"} type 3 and 2 tests are implemented as #' in \code{\link[car]{Anova}}. #' #' For all other methods, type 3 tests are obtained by comparing a model in #' which only the tested effect is excluded with the full model (containing all #' effects). For method \code{"nested-KR"} (which was the default in previous #' versions) this corresponds to the (type 3) Wald tests given by #' \code{car::Anova} for \code{"lmerMod"} models. The submodels in which the #' tested effect is excluded are obtained by manually creating a model matrix #' which is then fitted in \code{"lme4"}. #' #' Type 2 tests are truly sequential. They are obtained by comparing a model in #' which the tested effect and all higher oder effect (e.g., all three-way #' interactions for testing a two-way interaction) are excluded with a model in #' which only effects up to the order of the tested effect are present and all #' higher order effects absent. In other words, there are multiple full models, #' one for each order of effects. Consequently, the results for lower order #' effects are identical of whether or not higher order effects are part of the #' model or not. This latter feature is not consistent with classical ANOVA #' type 2 tests but a consequence of the sequential tests (and #' \href{https://stat.ethz.ch/pipermail/r-sig-mixed-models/2012q3/018992.html}{I #' didn't find a better way} of implementing the Type 2 tests). This #' \strong{does not} correspond to the (type 2) Wald test reported by #' \code{car::Anova}. #' #' If \code{check_contrasts = TRUE}, contrasts will be set to #' \code{"contr.sum"} for all factors in the formula if default contrasts are #' not equal to \code{"contr.sum"} or \code{attrib(factor, "contrasts") != #' "contr.sum"}. Furthermore, the current contrasts (obtained via #' \code{getOption("contrasts")}) will be set at the cluster nodes if \code{cl} #' is not \code{NULL}. } #' #' \subsection{Expand Random Effects}{ \code{expand_re = TRUE} allows to expand #' the random effects structure before passing it to \code{lmer}. This allows #' to disable estimation of correlation among random effects for random effects #' term containing factors using the \code{||} notation which may aid in #' achieving model convergence (see Bates et al., 2015). This is achieved by #' first creating a model matrix for each random effects term individually, #' rename and append the so created columns to the data that will be fitted, #' replace the actual random effects term with the so created variables #' (concatenated with +), and then fit the model. The variables are renamed by #' prepending all variables with rei (where i is the number of the random #' effects term) and replacing ":" with "_by_". #' #' \code{lmer_alt} is simply a wrapper for \code{mixed} that is intended to #' behave like \code{lmer} (or \code{glmer} if a \code{family} argument is #' present), but also allows the use of \code{||} with factors (by always using #' \code{expand_re = TRUE}). This means that \code{lmer_alt} per default does #' not enforce a specific contrast on factors and only returns the #' \code{"lmerModLmerTest"} or \code{"merMod"} object without calculating any #' additional models or p-values (this is achieved by setting \code{return = #' "merMod"}). Note that it most likely differs from \code{g/lmer} in how it #' handles missing values so it is recommended to only pass data without #' missing values to it! #' #' One consequence of using \code{expand_re = TRUE} is that the data that is #' fitted will not be the same as the passed data.frame which can lead to #' problems with e.g., the \code{predict} method. However, the actual data used #' for fitting is also returned as part of the \code{mixed} object so can be #' used from there. Note that the \code{set_data_arg} can be used to change #' whether the \code{data} argument in the call to \code{g/lmer} is set to #' \code{data} (the default) or the name of the data argument passed by the #' user. } #' #' @note When \code{method = "KR"}, obtaining p-values is known to crash due too #' insufficient memory or other computational limitations (especially with #' complex random effects structures). In these cases, the other methods #' should be used. The RAM demand is a problem especially on 32 bit Windows #' which only supports up to 2 or 3GB RAM (see #' \href{https://CRAN.R-project.org/bin/windows/base/rw-FAQ.html}{R Windows #' FAQ}). Then it is probably a good idea to use methods "S", "LRT", or "PB". #' #' \code{"mixed"} will throw a message if numerical variables are not centered #' on 0, as main effects (of other variables then the numeric one) can be hard #' to interpret if numerical variables appear in interactions. See Dalal & #' Zickar (2012). #' #' Per default \code{mixed} uses \code{\link[lmerTest]{lmer}}, this can be #' changed to \code{\link[lme4]{lmer}} by calling: #' \code{afex_options(lmer_function = "lme4")} #' #' Formulas longer than 500 characters will most likely fail due to the use of #' \code{\link{deparse}}. #' #' Please report bugs or unexpected behavior by opening a guthub issue: #' \url{https://github.com/singmann/afex/issues} #' #' @author Henrik Singmann with contributions from #' \href{https://stackoverflow.com/q/11335923/289572}{Ben Bolker and Joshua #' Wiley}. #' #' @seealso \code{\link{aov_ez}} and \code{\link{aov_car}} for convenience #' functions to analyze experimental desIgns with classical ANOVA or ANCOVA #' wrapping \code{\link[car]{Anova}}. #' #' see the following for the data sets from Maxwell and Delaney (2004) used #' and more examples: \code{\link{md_15.1}}, \code{\link{md_16.1}}, and #' \code{\link{md_16.4}}. #' #' @references Baayen, R. H. (2008). \emph{Analyzing linguistic data: a #' practical introduction to statistics using R}. Cambridge, UK; New York: #' Cambridge University Press. #' #' Baayen, R. H., Davidson, D. J., & Bates, D. M. (2008). Mixed-effects #' modeling with crossed random effects for subjects and items. \emph{Journal #' of Memory and Language}, 59(4), 390-412. \doi{10.1016/j.jml.2007.12.005} #' #' Baayen, R. H., & Milin, P. (2010). Analyzing Reaction Times. #' \emph{International Journal of Psychological Research}, 3(2), 12-28. #' #' Barr, D. J. (2013). Random effects structure for testing interactions in #' linear mixed-effects models. \emph{Frontiers in Quantitative Psychology and #' Measurement}, 328. \doi{10.3389/fpsyg.2013.00328} #' #' Barr, D. J., Levy, R., Scheepers, C., & Tily, H. J. (2013). Random effects #' structure for confirmatory hypothesis testing: Keep it maximal. #' \emph{Journal of Memory and Language}, 68(3), 255-278. #' \doi{10.1016/j.jml.2012.11.001} #' #' Bates, D., Kliegl, R., Vasishth, S., & Baayen, H. (2015). #' \emph{Parsimonious Mixed Models}. arXiv:1506.04967 [stat]. Retrieved from #' \url{https://arxiv.org/abs/1506.04967} #' #' Dalal, D. K., & Zickar, M. J. (2012). Some Common Myths About Centering #' Predictor Variables in Moderated Multiple Regression and Polynomial #' Regression. \emph{Organizational Research Methods}, 15(3), 339-362. #' \doi{10.1177/1094428111430540} #' #' Judd, C. M., Westfall, J., & Kenny, D. A. (2012). Treating stimuli as a #' random factor in social psychology: A new and comprehensive solution to a #' pervasive but largely ignored problem. \emph{Journal of Personality and #' Social Psychology}, 103(1), 54-69. \doi{10.1037/a0028347} #' #' Luke, S. (2017). Evaluating significance in linear mixed-effects models in #' R. \emph{Behavior Research Methods}. #' \doi{10.3758/s13428-016-0809-y} #' #' Maxwell, S. E., & Delaney, H. D. (2004). \emph{Designing experiments and #' analyzing data: a model-comparisons perspective.} Mahwah, N.J.: Lawrence #' Erlbaum Associates. #' #' ## @import pbkrtest #' @importFrom lme4 glmer nobars getME isREML #' @importFrom parallel clusterCall clusterExport clusterEvalQ clusterApplyLB #' @importFrom stats logLik terms as.formula contrasts<- model.matrix model.frame anova #' @importFrom methods is #' @encoding UTF-8 #' #' @example examples/examples.mixed.R #' #' @export mixed <- function(formula, data, type = afex_options("type"), method = afex_options("method_mixed"), per_parameter = NULL, args_test = list(), test_intercept = FALSE, check_contrasts = afex_options("check_contrasts"), expand_re = FALSE, all_fit = FALSE, set_data_arg = afex_options("set_data_arg"), progress = TRUE, cl = NULL, return = "mixed", sig_symbols = afex_options("sig_symbols"), ...) { dots <- list(...) data <- as.data.frame(data) # adding droplevels() here seems to lead to problems # with factors that have contrasts associated with it. ### deprercate old argument names: if("per.parameter" %in% names(dots)) { warn_deprecated_arg("per.parameter", "per_parameter") per_parameter <- dots$per.parameter } if("args.test" %in% names(dots)) { warn_deprecated_arg("args.test", "args_test") args_test <- dots$args.test } if("test.intercept" %in% names(dots)) { warn_deprecated_arg("test.intercept", "test_intercept") test_intercept <- dots$test.intercept } if("check.contrasts" %in% names(dots)) { warn_deprecated_arg("check.contrasts", "check_contrasts") check_contrasts <- dots$check.contrasts } if("set.data.arg" %in% names(dots)) { warn_deprecated_arg("set.data.arg", "set_data_arg") set_data_arg <- dots$set.data.arg } if("sig.symbols" %in% names(dots)) { #(!missing(sig.symbols)) { warn_deprecated_arg("sig.symbols", "sig_symbols") sig_symbols <- dots$sig.symbols } ## real function begins: vars.to.check <- all.vars(as.formula(formula)) data <- check_contrasts( data = data, factors = vars.to.check, check_contrasts = check_contrasts, type = type, warn = FALSE ) method <- match.arg(method, c("KR", "S", "PB", "LRT", "nested-KR", "F"), several.ok=FALSE) #################### ### Part I: prepare fitting (i.e., obtain model info, check model, ...) #################### mc <- match.call() formula.f <- as.formula(formula) if (!inherits(formula, "formula")) message("Formula (the first argument) converted to formula.") dv <- as.character(formula.f)[[2]] all.terms <- attr(terms(formula.f), "term.labels") effect.order <- attr(terms(formula.f), "order") effect.order <- effect.order[!grepl("\\|", all.terms)] max.effect.order <- max(effect.order) random <- paste0(paste0("(", all.terms[grepl("\\|", all.terms)], ")"), collapse = " + ") rh2 <- nobars(formula.f) rh2[[2]] <- NULL m.matrix <- model.matrix(rh2, data = data) fixed.effects <- attr(terms(rh2, data = data), "term.labels") mapping <- attr(m.matrix, "assign") fixed.vars <- all.vars(rh2) # check for missing values in variables used: if (nrow(model.matrix(nobars(formula.f), data = data)) != nrow(data)) { data <- model.frame( as.formula(paste0(vars.to.check[1], "~", paste0(vars.to.check[-1], collapse = "+"))), data = data) m.matrix <- model.matrix(rh2, data = data) warning(paste0("Due to missing values, reduced number of observations to ", nrow(data)), call. = FALSE) if(set_data_arg) { warning("Due to missing values, set_data_arg set to FALSE.", call. = FALSE) set_data_arg <- FALSE } } # check if numerical variables are centered c.ns <- fixed.vars[vapply(data[, fixed.vars, drop = FALSE], is.numeric, TRUE)] if (length(c.ns) > 0) { non.null <- c.ns[!abs(vapply(data[, c.ns, drop = FALSE], mean, 0)) < .Machine$double.eps ^ 0.5] if (length(non.null) > 0) message(paste0("Numerical variables NOT centered on 0: ", paste0(non.null, collapse = ", "), "\nIf in interactions, interpretation of lower order", " (e.g., main) effects difficult.")) } if (expand_re) { expand_re_out <- expand_re_fun(all.terms = all.terms, data = data) data <- expand_re_out$data random <- expand_re_out$random } if (return == "data") return(data) #################### ### Part II: obtain the lmer fits #################### ## Part IIa: prepare formulas mf <- mc[!names(mc) %in% c("type", "method", "args.test", "args_test", "progress", "check.contrasts", "check_contrasts", "per.parameter", "per_parameter", "cl", "test.intercept", "test_intercept","expand_re", "return", "all_fit", "sig_symbols", "sig.symbols", "set_data_arg")] mf[["formula"]] <- as.formula(paste0(dv,deparse(rh2, width.cutoff = 500L),"+",random)) if ("family" %in% names(mf)) { mf[[1]] <- as.name("glmer") use_reml <- FALSE } else { if (afex_options("lmer_function") == "lmerTest") mf[[1]] <- quote(lmerTest::lmer) else if (afex_options("lmer_function") == "lme4") { if (!(return %in% c("merMod")) && method %in% c("KR", "S")) stop('afex_options("lmer_function") needs to be "lmerTest" for method="', method, '"', call. = FALSE) mf[[1]] <- quote(lme4::lmer) } else stop("value of afex_options('lmer_function') not supported.", call. = FALSE) use_reml <- TRUE } mf[["data"]] <- as.name("data") if ((method[1] %in% c("PB", "LRT")) & !("family" %in% names(mf))) { if ((!"REML" %in% names(mf)) || mf[["REML"]]) { message("REML argument to lmer() set to FALSE for method = 'PB' or 'LRT'") mf[["REML"]] <- FALSE use_reml <- FALSE } } if (return == "merMod") { out <- eval(mf) if(set_data_arg) out@call[["data"]] <- mc[["data"]] return(out) } if ("family" %in% names(mf)) { if (!(method[1] %in% c("LRT", "PB"))) stop("GLMMs can only be estimated with 'LRT' or 'PB'.", call. = FALSE) } ## do not calculate nested models for these methods: if (method[1] %in% c("KR", "S")) { if (progress) cat("Fitting one lmer() model. ") full_model <- eval(mf) if (all_fit) { all_fits <- suppressWarnings(all_fit(full_model, data = data, verbose = FALSE)) all_fits <- c(default = full_model, all_fits) tmp_ll <- vapply(all_fits, function(x) tryCatch(logLik(x), error = function(e) NA), 0) full_model <- all_fits[[which.max(tmp_ll)]] full_model@optinfo$logLik_other <- tmp_ll } fits <- NULL tests <- NULL anova_tab_addition <- NULL if (progress) cat("[DONE]\nCalculating p-values. ") if (method[1] == "KR") { #lmerTest_method <- if(method[1] == "KR") "Kenward-Roger" else "Satterthwaite" if (test_intercept) { anova_out <- car::Anova(full_model, type = type, test.statistic = "F") anova_table <- as.data.frame(anova_out) anova_table <- anova_table[, c("Df", "Df.res", "F", "Pr(>F)")] colnames(anova_table) <- c("num Df", "den Df", "F", "Pr(>F)") } else { anova_out <- lmerTest_anova(full_model, ddf = "Kenward-Roger", type = type) anova_table <- as.data.frame(anova_out) get <- c("NumDF", "DenDF", "F.value", "F value", "Pr(>F)") anova_table <- anova_table[, match(get, colnames(anova_table), nomatch = 0L)] colnames(anova_table) <- c("num Df", "den Df", "F", "Pr(>F)") } } else if (method[1] == "S") { if (test_intercept) warning("Cannot test intercept with Satterthwaite approximation.") anova_out <- lmerTest_anova(full_model, ddf = "Satterthwaite", type = type) anova_table <- as.data.frame(anova_out) if (!("Pr(>F)" %in% colnames(anova_table))) { colnames(anova_table)[c(1,4)] <- c("NumDF", "F.value") anova_table$DenDF <- NA_real_ anova_table$`Pr(>F)` <- NA_real_ } get <- c("NumDF", "DenDF", "F.value", "F value", "Pr(>F)") anova_table <- anova_table[, match(get, colnames(anova_table), nomatch = 0L)] colnames(anova_table) <- c("num Df", "den Df", "F", "Pr(>F)") } if (progress) cat("[DONE]\n") if(set_data_arg) full_model@call[["data"]] <- mc[["data"]] } else { ## do calculate nested models for the methods below ## prepare (g)lmer formulas: if (type == 3 | type == "III") { if (attr(terms(rh2, data = data), "intercept") == 1) fixed.effects <- c("(Intercept)", fixed.effects) # The next part alters the mapping of parameters to effects/variables if # per_parameter is not NULL (this does the complete magic). if (!is.null(per_parameter)) { fixed.to.change <- c() for (parameter in per_parameter) { fixed.to.change <- c(fixed.to.change, grep(parameter, fixed.effects)) } fixed.to.change <- fixed.effects[sort(unique(fixed.to.change))] if ("(Intercept)" %in% fixed.to.change) fixed.to.change <- fixed.to.change[-1] fixed.all <- dimnames(m.matrix)[[2]] #tf2 <- fixed.to.change[2] for (tf2 in fixed.to.change) { tf <- which(fixed.effects == tf2) fixed.lower <- fixed.effects[seq_len(tf-1)] fixed.upper <- if (tf < length(fixed.effects)) fixed.effects[(tf+1):length(fixed.effects)] else NULL fixed.effects <- c(fixed.lower, fixed.all[which(mapping == (tf-1))], fixed.upper) map.to.replace <- which(mapping == (tf-1)) map.lower <- mapping[seq_len(map.to.replace[1]-1)] map.upper <- if (max(map.to.replace) < length(mapping)) mapping[(map.to.replace[length(map.to.replace)]+1): length(mapping)] else NULL mapping <- c(map.lower, seq_along(map.to.replace) + map.lower[length(map.lower)], map.upper + length(map.to.replace)-1) } } # make formulas formulas <- vector("list", length(fixed.effects) + 1) formulas[[1]] <- mf[["formula"]] for (i in seq_along(fixed.effects)) { tmp.columns <- paste0(deparse(-which(mapping == (i-1))), collapse = "") formulas[[i+1]] <- as.formula(paste0(dv, "~ 0 + m.matrix[,", tmp.columns, "] +", random)) } names(formulas) <- c("full_model", fixed.effects) if (!test_intercept && fixed.effects[1] == "(Intercept)") { fixed.effects <- fixed.effects[-1] formulas[["(Intercept)"]] <- NULL } } else if (type == 2 | type == "II") { if (!is.null(per_parameter)) stop("per_parameter argument only implemented for Type 3 tests.") full_model.formulas <- vector("list", max.effect.order) submodel.formulas <- vector("list", length(fixed.effects)) full_model.formulas[[length(full_model.formulas)]] <- mf[["formula"]] for (c in seq_len(max.effect.order)) { if (c == max.effect.order) next tmp.columns <- paste0(deparse(-which(mapping %in% which(effect.order > c))), collapse = "") full_model.formulas[[c]] <- as.formula(paste0(dv, "~ 0 + m.matrix[,", tmp.columns, "] +", random)) } for (c in seq_along(fixed.effects)) { order.c <- effect.order[c] tmp.columns <- paste0(deparse(-which(mapping == (c) | mapping %in% if (order.c == max.effect.order) -1 else which(effect.order > order.c))), collapse = "") submodel.formulas[[c]] <- as.formula( paste0(dv, "~ 0 + m.matrix[,", tmp.columns, "] +", random)) } formulas <- c(full_model.formulas, submodel.formulas) } else stop('Only type 3 and type 2 tests implemented.') ## Part IIb: fit models # single core if (is.null(cl)) { if (progress) cat(paste0("Fitting ", length(formulas), " (g)lmer() models:\n[")) fits <- vector("list", length(formulas)) if (all_fit) all_fits <- vector("list", length(formulas)) for (i in seq_along(formulas)) { mf[["formula"]] <- formulas[[i]] fits[[i]] <- eval(mf) if (all_fit) { all_fits[[i]] <- suppressWarnings( all_fit(fits[[i]], data = data, verbose = FALSE)) all_fits[[i]] <- c(default = fits[[i]], all_fits[[i]]) tmp_ll <- vapply(all_fits[[i]], function(x) tryCatch(logLik(x), error = function(e) NA), 0) fits[[i]] <- all_fits[[i]][[which.max(tmp_ll)]] fits[[i]]@optinfo$logLik_other <- tmp_ll } if (progress) cat(".") } if (progress) cat("]\n") } else { # multicore eval.cl <- function(formula, m.call, progress, all_fit, data) { m.call[[2]] <- formula res <- eval(m.call) if (all_fit) { all_fits <- suppressWarnings(all_fit(res, data = data, verbose = FALSE)) all_fits <- c(default = res, all_fits) tmp_ll <- vapply(all_fits, function(x) tryCatch(logLik(x), error = function(e) NA), 0) res <- all_fits[[which.max(tmp_ll)]] res@optinfo$logLik_other <- tmp_ll } if (progress) cat(".") return(res) } if (progress) cat(paste0("Fitting ", length(formulas), " (g)lmer() models.\n")) junk <- clusterCall(cl = cl, "require", package = "afex", character.only = TRUE) if (check_contrasts) { curr.contrasts <- getOption("contrasts") clusterExport(cl = cl, "curr.contrasts", envir = sys.nframe()) junk <- clusterEvalQ(cl = cl, options(contrasts=curr.contrasts)) } if (progress) junk <- clusterEvalQ(cl = cl, cat("[")) fits <- clusterApplyLB(cl = cl, x = formulas, eval.cl, m.call = mf, progress = progress, all_fit=all_fit, data = data) if (progress) junk <- clusterEvalQ(cl = cl, cat("]")) } #################### ### Part IIb: likelihood checks and refitting (refitting is DISABLED for the time being!) #################### check_likelihood <- function(fits) { if (type == 3 | type == "III") { logLik_full <- as.numeric(logLik(fits[[1]])) logLik_restricted <- as.numeric(vapply(fits[2:length(fits)], logLik, 0)) if(any(logLik_restricted > logLik_full)) return(fixed.effects[logLik_restricted > logLik_full]) } else if (type == 2 | type == "II") { logLik_full <- as.numeric(vapply(fits[1:max.effect.order],logLik, 0)) logLik_restricted <- as.numeric(vapply(fits[(max.effect.order+1):length(fits)], logLik, 0)) warn_logLik <- c() for (c in seq_along(fixed.effects)) { order.c <- effect.order[c] if(logLik_restricted[[c]] > logLik_full[[order.c]]) warn_logLik <- c(warn_logLik, fixed.effects[c]) } if(length(warn_logLik)>0) return(warn_logLik) } return(TRUE) } # check for smaller likelihood of nested model and refit if test fails: if (FALSE) { if(!isTRUE(check_likelihood(fits))) { if (progress) cat("refitting...") refits <- lapply(fits, all_fit, verbose=FALSE, data = data) browser() str(fits[[1]], 2) fits[[1]]@call sapply(refits, function(x) sapply(x, function(y) tryCatch(as.numeric(logLik(y)), error = function(e) as.numeric(NA)))) fits <- lapply(refits, function(x) { tmp_llk <- vapply(x, function(y) tryCatch(logLik(y), error = function(e) as.numeric(NA)), 0) x[[which.min(tmp_llk)]] }) } } # check again and warn if(!isREML(fits[[1]]) & !isTRUE(check_likelihood(fits))) { warning(paste( "Following nested model(s) provide better fit than full model:", paste(check_likelihood(fits), collapse = ", "), "\n Results cannot be trusted.", "Try all_fit=TRUE or reduce random effect structure!")) } if(set_data_arg){ for (i in seq_along(fits)) { fits[[i]]@call[["data"]] <- mc[["data"]] } } ## prepare for p-values: if (type == 3 | type == "III") { full_model <- fits[[1]] fits <- fits[-1] } else if (type == 2 | type == "II") { full_model <- fits[1:max.effect.order] fits <- fits[(max.effect.order+1):length(fits)] } names(fits) <- fixed.effects #################### ### Part III: obtain p-values #################### ## obtain p-values: #browser() if (method[1] == "nested-KR") { if (progress) cat(paste0("Obtaining ", length(fixed.effects), " p-values:\n[")) tests <- vector("list", length(fixed.effects)) for (c in seq_along(fixed.effects)) { if (type == 3 | type == "III") tests[[c]] <- pbkrtest::KRmodcomp(full_model, fits[[c]]) else if (type == 2 | type == "II") { order.c <- effect.order[c] tests[[c]] <- pbkrtest::KRmodcomp(full_model[[order.c]], fits[[c]]) } if (progress) cat(".") } if (progress) cat("]\n") names(tests) <- fixed.effects anova_table <- data.frame( t(vapply(tests, function(x) unlist(x[["test"]][1,]), unlist(tests[[1]][["test"]][1,])))) rownames(anova_table) <- fixed.effects colnames(anova_table) <- c("F", "num Df", "den Df", "F.scaling", "Pr(>F)") anova_table <- anova_table[, c("num Df", "den Df", "F.scaling", "F", "Pr(>F)")] anova_tab_addition <- NULL } else if (method[1] == "PB") { if (progress) cat(paste0("Obtaining ", length(fixed.effects), " p-values:\n[")) tests <- vector("list", length(fixed.effects)) for (c in seq_along(fixed.effects)) { if (type == 3 | type == "III") tests[[c]] <- do.call(pbkrtest::PBmodcomp, args = c(largeModel = full_model, smallModel = fits[[c]], args_test)) else if (type == 2 | type == "II") { order.c <- effect.order[c] tests[[c]] <- do.call(pbkrtest::PBmodcomp, args = c(largeModel = full_model[[order.c]], smallModel = fits[[c]], args_test)) } if (progress) cat(".") } if (progress) cat("]\n") names(tests) <- fixed.effects anova_table <- data.frame(t(vapply(tests, function(x) unlist(x[["test"]][2,]), unlist(tests[[1]][["test"]][2,])))) anova_table <- anova_table[,-2] LRT <- vapply(tests, function(x) unlist(x[["test"]][1,]), unlist(tests[[1]][["test"]][1,])) row.names(LRT) <- paste0(row.names(LRT), ".LRT") anova_table <- cbind(anova_table, t(LRT)) rownames(anova_table) <- fixed.effects anova_table <- anova_table[, c("stat", "df.LRT", "p.value.LRT", "p.value")] colnames(anova_table) <- c("Chisq", "Chi Df", "Pr(>Chisq)", "Pr(>PB)") anova_tab_addition <- NULL } else if (method[1] == "LRT") { tests <- vector("list", length(fixed.effects)) for (c in seq_along(fixed.effects)) { if (type == 3 | type == "III") tests[[c]] <- anova(full_model, fits[[c]]) else if (type == 2 | type == "II") { order.c <- effect.order[c] tmpModel <- full_model[[order.c]] tests[[c]] <- anova(tmpModel, fits[[c]]) } } names(tests) <- fixed.effects chisq <- vapply(tests, function(x) x[["Chisq"]][2], 0) if (packageVersion("lme4") <= "1.1.21") { df.large <- vapply(tests, function(x) x[["Df"]][2], 0) df.small <- vapply(tests, function(x) x[["Df"]][1], 0) df <- vapply(tests, function(x) x[["Chi Df"]][2], 0) } else { df.large <- vapply(tests, function(x) x[["npar"]][2], 0) df.small <- vapply(tests, function(x) x[["npar"]][1], 0) df <- vapply(tests, function(x) x[["Df"]][2], 0) } p.value <- vapply(tests, function(x) x[["Pr(>Chisq)"]][2], 0) anova_table <- data.frame(Df = df.small, Chisq = chisq, "Chi Df" = df, "Pr(>Chisq)"=p.value, stringsAsFactors = FALSE, check.names = FALSE) rownames(anova_table) <- fixed.effects if (type == 3 | type == "III") anova_tab_addition <- paste0("Df full model: ", df.large[1]) else anova_tab_addition <- paste0("Df full model(s): ", paste(df.large, collapse = ", ")) } else stop('Only methods "KR", "PB", "LRT", or "nested-KR" currently implemented.') } #################### ### Part IV: prepare output #################### class(anova_table) <- c("anova", "data.frame") attr(anova_table, "heading") <- c( paste0("Mixed Model Anova Table (Type ", type , " tests, ", method, "-method)\n"), paste0("Model: ", deparse(formula.f)), paste0("Data: " ,mc[["data"]]), anova_tab_addition ) attr(anova_table, "sig_symbols") <- sig_symbols list.out <- list( anova_table = anova_table, full_model = full_model, restricted_models = fits, tests = tests, data = data, call = mc) #, type = type, method = method[[1]] class(list.out) <- "mixed" attr(list.out, "type") <- type attr(list.out, "method") <- method if (all_fit) { attr(list.out, "all_fit_selected") <- rapply(c(full_model = list.out$full_model, list.out$restricted_models), function(x) x@optinfo$optimizer, how = "unlist") attr(list.out, "all_fit_logLik") <- as.data.frame( rapply(c(full_model = list.out$full_model, list.out$restricted_models), function(x) x@optinfo$logLik_other, how = "replace")) } list.out } ## expand random effects sructure expand_re_fun <- function(all.terms, data) { random_parts <- paste0(all.terms[grepl("\\|", all.terms)]) which_random_double_bars <- grepl("\\|\\|", random_parts) random_units <- sub("^.+\\|\\s+", "", random_parts) tmp_random <- lapply(sub("\\|.+$", "", random_parts), function(x) as.formula(paste0("~", x))) tmp_model.matrix <- vector("list", length(random_parts)) re_contains_intercept <- rep(FALSE, length(random_parts)) new_random <- vector("character", length(random_parts)) for (i in seq_along(random_parts)) { tmp_model.matrix[[i]] <- model.matrix(tmp_random[[i]], data = data) if (ncol(tmp_model.matrix[[i]]) == 0) stop("Invalid random effects term, e.g., (0|id)") if (colnames(tmp_model.matrix[[i]])[1] == "(Intercept)") { tmp_model.matrix[[i]] <- tmp_model.matrix[[i]][,-1, drop = FALSE] re_contains_intercept[i] <- TRUE } if (ncol(tmp_model.matrix[[i]]) > 0) { colnames(tmp_model.matrix[[i]]) <- paste0("re", i, ".", gsub(":", "_by_", colnames(tmp_model.matrix[[i]]))) colnames(tmp_model.matrix[[i]]) <- make.names(colnames(tmp_model.matrix[[i]])) new_random[i] <- paste0("(", as.numeric(re_contains_intercept[i]), "+", paste0(colnames(tmp_model.matrix[[i]]), collapse = "+"), if (which_random_double_bars[i]) "||" else "|", random_units[i], ")") } else { new_random[i] <- paste0("(", as.numeric(re_contains_intercept[i]), if (which_random_double_bars[i]) "||" else "|", random_units[i], ")") } } data <- cbind(data, as.data.frame(do.call(cbind, tmp_model.matrix))) random <- paste0(new_random, collapse = "+") return(list(data = data, random = random)) } get_mixed_warnings <- function(x) { full_model_name <- names(x)[[2]] ntry <- function(x) tryCatch(x, error = function(e) NULL) if (is.list(x$full)) { warnings1 <- c(full = lapply(x[[2]], function(y) y@optinfo$warnings), lapply(x[[3]], function(y) y@optinfo$warnings)) warnings2 <- c(full = lapply(x[[2]], function(y) ntry(y@optinfo$conv$lme4$messages)), lapply(x[[3]], function(y) ntry(y@optinfo$conv$lme4$messages))) } else { warnings1 <- c(full = list(x[[full_model_name]]@optinfo$warnings), lapply(x[[3]], function(y) y@optinfo$warnings)) warnings2 <- c(full = list(ntry(x[[full_model_name]]@optinfo$conv$lme4$messages)), lapply(x[[3]], function(y) ntry(y@optinfo$conv$lme4$messages))) } warnings <- mapply(function(x, y) c(unlist(x), y), warnings1, warnings2, SIMPLIFY=FALSE) warn <- vapply(warnings, function(y) !length(y)==0, NA) for (i in names(warn)[warn]) warning("lme4 reported (at least) the following warnings for '", i, "':\n * ", paste(warnings[[i]], collapse = "\n * "), call. = FALSE) } check_likelihood <- function(object) { full_model_name <- names(object)[[2]] restricted_models_name <- names(object)[[3]] if (is.null(attr(object, "type"))) { attr(object, "type") <- object$type } if (attr(object, "type") == 3 | attr(object, "type") == "III") { logLik_full <- as.numeric(logLik(object[[full_model_name]])) logLik_restricted <- as.numeric(vapply(object[[restricted_models_name]], logLik, 0)) if(any(logLik_restricted > logLik_full)) return(rownames(object$anova_table)[logLik_restricted > logLik_full]) } else if (attr(object, "type") == 2 | attr(object, "type") == "II") { NULL } return(TRUE) } #' @rdname mixed #' @export lmer_alt <- function(formula, data, check_contrasts = FALSE, ...) { mc <- match.call() #assign(all.vars(mc[["data"]]), data) mc[[1]] <- as.name("mixed") mc[["return"]] <- "merMod" mc[["expand_re"]] <- TRUE mc[["progress"]] <- FALSE mc[["check_contrasts"]] <- check_contrasts #browser() eval(mc) } #' @method print mixed #' @export print.mixed <- function(x, ...) { full_model_name <- names(x)[[2]] try(if(!isREML(x[[full_model_name]]) && !isTRUE(check_likelihood(x))) warning(paste("Following nested model(s) provide better fit than full model:", paste(check_likelihood(x), collapse = ", "), "\n Results cannot be trusted. Try all_fit=TRUE!"), call. = FALSE), silent = TRUE) get_mixed_warnings(x) tmp <- nice.mixed(x, ...) print(tmp) invisible(tmp) } #anova.mixed <- #' @method summary mixed #' @export summary.mixed <- function(object, ...) { if ("full_model" %in% names(object)) summary(object = if (length(object[["full_model"]]) == 1) object[["full_model"]] else object[["full_model"]][[length(object[["full_model"]])]], ...) else if("full.model" %in% names(object)) summary(object = if (length(object[["full.model"]]) == 1) object[["full.model"]] else object[["full.model"]][[length(object[["full.model"]])]], ...) } #' @method anova mixed #' @export anova.mixed <- function(object, ..., sig_symbols = attr(object$anova_table, "sig_symbols"), refit = FALSE) { mCall <- match.call(expand.dots = TRUE) full_model_name <- names(object)[[2]] dots <- list(...) modp <- (as.logical(vapply(dots, is, NA, "merMod")) | as.logical(vapply(dots, is, NA, "lm")) | as.logical(vapply(dots, is, NA, "mixed")) ) if (any(modp)) { model.names <- c(deparse(mCall[["object"]]), vapply(which(modp), function(x) deparse(mCall[[x+2]]), "")) for (i in which(as.logical(vapply(dots, is, NA, "mixed")))) dots[[i]] <- dots[[i]][[full_model_name]] anova_table <- do.call(anova, args = c(object = object[[full_model_name]], dots, model.names = list(model.names), refit = refit)) } else { try(if(!isREML(object[[full_model_name]]) && !isTRUE(check_likelihood(object))) warning( paste("Following nested model(s) provide better fit than full model:", paste(check_likelihood(object), collapse = ", "), "\n Results cannot be trusted. Try all_fit=TRUE!"), call. = FALSE), silent=TRUE) get_mixed_warnings(object) anova_table <- object$anova_table } attr(anova_table, "sig_symbols") <- if (!is.null(sig_symbols)) sig_symbols else afex_options("sig_symbols") anova_table } ## support for emmeans for mixed objects: ## @importFrom emmeans recover_data emm_basis ## @method recover_data mixed ## @export recover_data.mixed <- function(object, ...) { full_model_name <- names(object)[[2]] if (inherits(object[[full_model_name]], "merMod") | is_lmerTest_class(object[[full_model_name]])) { obj_use <- object[[full_model_name]] } else if (inherits(object[[full_model_name]][[1]], "merMod") | is_lmerTest_class(object[[full_model_name]][[1]])) { message("emmeans are based on full model which includes all effects.") obj_use <- object[[full_model_name]][[length(object[[full_model_name]])]] } else { stop("Cannot find 'merMod' object in ", full_model_name, " slot.") } if (is_lmerTest_class(obj_use)) { class(obj_use) <- "lmerMod" } emmeans::recover_data(obj_use, ...) } ## @method lsm_basis mixed ## @export emm_basis.mixed <- function(object, trms, xlev, grid, ...) { full_model_name <- names(object)[[2]] if (inherits(object[[full_model_name]], "merMod") | is_lmerTest_class(object[[full_model_name]])) { obj_use <- object[[full_model_name]] } else if (inherits(object[[full_model_name]][[1]], "merMod") | is_lmerTest_class(object[[full_model_name]][[1]])) { obj_use <- object[[full_model_name]][[length(object[[full_model_name]])]] } else { stop("Cannot find 'merMod' object in ", full_model_name, " slot.") } if (is_lmerTest_class(obj_use)) { class(obj_use) <- "lmerMod" } emmeans::emm_basis(obj_use, trms, xlev, grid, ...) } afex/R/md_16.1-data.R0000644000176200001440000000355013664111747013512 0ustar liggesusers#' Data 16.1 / 10.9 from Maxwell & Delaney #' #' Hypothetical Reaction Time Data for 2 x 3 Perceptual Experiment: Example data for chapter 12 of Maaxwell and Delaney (2004, Table 12.1, p. 574) in long format. Has two within.subjects factors: angle and noise. #' #' Description from pp. 829: #' #' As brief background, the goal of the study here is to examine the extent to which female and male clinical psychology graduate student trainees may assign different severity ratings to clients at initial intake. Three female and 3 male graduate students are randomly selected to participate and each is randomly assigned four clients with whom to do an intake interview, after which each clinical trainee assigns a severity rating to each client, producing the data shown in Table 16.1. #' #' Note that I changed the labeling of the id slightly, so that they are now labeled from 1 to 6. Furthermore, I changed the contrasts of sex to \code{contr.treatment} to replicate the exact results of Table 16.3 (p. 837). #' #' @docType data #' @keywords dataset #' @name md_16.1 #' @usage md_16.1 #' @format A data.frame with 24 rows and 3 variables. #' @source Maxwell, S. E., & Delaney, H. D. (2004). Designing experiments and analyzing data: a model-comparisons perspective. Mahwah, N.J.: Lawrence Erlbaum Associates. p. 574 #' #' @examples #' ### replicate results from Table 16.3 (Maxwell & Delaney, 2004, p. 837) #' data(md_16.1) #' #' # original results need treatment contrasts: #' (mixed1_orig <- mixed(severity ~ sex + (1|id), md_16.1, check.contrasts=FALSE)) #' summary(mixed1_orig$full.model) #' #' # p-values stay the same with afex default contrasts (contr.sum), #' # but estimates and t-values for the fixed effects parameters change. #' (mixed1 <- mixed(severity ~ sex + (1|id), md_16.1)) #' summary(mixed1$full.model) #' #' @encoding UTF-8 #' NULL afex/R/nice.R0000644000176200001440000004213614071312623012444 0ustar liggesusers#' Make nice ANOVA table for printing. #' #' This generic function produces a nice ANOVA table for printing for objects of #' class. \code{nice_anova} takes an object from \code{\link[car]{Anova}} #' possible created by the convenience functions \code{\link{aov_ez}} or #' \code{\link{aov_car}}. When within-subject factors are present, either #' sphericity corrected or uncorrected degrees of freedom can be reported. #' #' #' @param object,x An object of class \code{"afex_aov"} (see #' \code{\link{aov_car}}) or of class \code{"mixed"} (see \code{\link{mixed}}) #' as returned from the \pkg{afex} functions. Alternatively, an object of #' class \code{"Anova.mlm"} or \code{"anova"} as returned from #' \code{\link[car]{Anova}}. #' @param es Effect Size to be reported. The default is given by #' \code{afex_options("es_aov")}, which is initially set to \code{"ges"} #' (i.e., reporting generalized eta-squared, see details). Also supported is #' partial eta-squared (\code{"pes"}) or \code{"none"}. #' @param observed character vector referring to the observed (i.e., non #' manipulated) variables/effects in the design. Important for calculation of #' generalized eta-squared (ignored if \code{es} is not \code{"ges"}), see #' details. #' @param correction Character. Which sphericity correction of the degrees of #' freedom should be reported for the within-subject factors. The default is #' given by \code{afex_options("correction_aov")}, which is initially set to #' \code{"GG"} corresponding to the Greenhouse-Geisser correction. Possible #' values are \code{"GG"}, \code{"HF"} (i.e., Hyunh-Feldt correction), and #' \code{"none"} (i.e., no correction). #' @param p_adjust_method \code{character} indicating if p-values for individual #' effects should be adjusted for multiple comparisons (see #' \link[stats]{p.adjust} and details). The default \code{NULL} corresponds to #' no adjustment. #' @param sig_symbols Character. What should be the symbols designating #' significance? When entering an vector with \code{length(sig.symbol) < 4} #' only those elements of the default (\code{c(" +", " *", " **", " ***")}) #' will be replaced. \code{sig_symbols = ""} will display the stars but not #' the \code{+}, \code{sig_symbols = rep("", 4)} will display no symbols. The #' default is given by \code{afex_options("sig_symbols")}. #' @param MSE logical. Should the column containing the Mean Sqaured Error (MSE) #' be displayed? Default is \code{TRUE}. #' @param intercept logical. Should intercept (if present) be included in the #' ANOVA table? Default is \code{FALSE} which hides the intercept. #' @param round_ps Function that should be used for rounding p-values. The #' default is given by \code{afex_options("round_ps")}. #' @param sig.symbols deprecated argument, only for backwards compatibility, use #' \code{"sig_symbols"} instead. #' @param ... currently ignored. #' #' @return A \code{data.frame} of class \code{nice_table} with the ANOVA table #' consisting of characters. The columns that are always present are: #' \code{Effect}, \code{df} (degrees of freedom), \code{F}, and \code{p}. #' #' \code{ges} contains the generalized eta-squared effect size measure #' (Bakeman, 2005), \code{pes} contains partial eta-squared (if requested). #' #' @details The returned \code{data.frame} is print-ready when adding to a #' document with proper methods. Either directly via \pkg{knitr} or similar #' approaches such as via package \pkg{xtable} (nowadays \pkg{knitr} is #' probably the best approach, see \href{https://yihui.org/knitr/}{here}). #' \pkg{xtable} converts a \code{data.frame} into LaTeX code with many #' possible options (e.g., allowing for \code{"longtable"} or #' \code{"sidewaystable"}), see \code{\link[xtable]{xtable}} and #' \code{\link[xtable]{print.xtable}}. See Examples. #' #' Conversion functions to other formats (such as HTML, ODF, or Word) can be #' found at the #' \href{https://CRAN.R-project.org/view=ReproducibleResearch}{Reproducible #' Research Task View}. #' #' The default reports generalized eta squared (Olejnik & Algina, 2003), the #' "recommended effect size for repeated measured designs" (Bakeman, 2005). #' Note that it is important that all measured variables (as opposed to #' experimentally manipulated variables), such as e.g., age, gender, weight, #' ..., must be declared via \code{observed} to obtain the correct effect size #' estimate. Partial eta squared (\code{"pes"}) does not require this. #' #' Exploratory ANOVA, for which no detailed hypotheses have been specified a #' priori, harbor a multiple comparison problem (Cramer et al., 2015). To #' avoid an inflation of familywise Type I error rate, results need to be #' corrected for multiple comparisons using \code{p_adjust_method}. #' \code{p_adjust_method} defaults to the method specified in the call to #' \code{\link{aov_car}} in \code{anova_table}. If no method was specified and #' \code{p_adjust_method = NULL} p-values are not adjusted. #' #' @seealso \code{\link{aov_ez}} and \code{\link{aov_car}} are the convenience #' functions to create the object appropriate for \code{nice_anova}. #' #' @author The code for calculating generalized eta-squared was written by Mike #' Lawrence.\cr Everything else was written by Henrik Singmann. #' #' @references Bakeman, R. (2005). Recommended effect size statistics for #' repeated measures designs. \emph{Behavior Research Methods}, 37(3), #' 379-384. \doi{10.3758/BF03192707} #' #' Cramer, A. O. J., van Ravenzwaaij, D., Matzke, D., Steingroever, H., #' Wetzels, R., Grasman, R. P. P. P., ... Wagenmakers, E.-J. (2015). Hidden #' multiplicity in exploratory multiway ANOVA: Prevalence and remedies. #' \emph{Psychonomic Bulletin & Review}, 1-8. #' \doi{10.3758/s13423-015-0913-5} #' #' Olejnik, S., & Algina, J. (2003). Generalized Eta and Omega Squared #' Statistics: Measures of Effect Size for Some Common Research Designs. #' \emph{Psychological Methods}, 8(4), 434-447. #' \doi{10.1037/1082-989X.8.4.434} #' #' @name nice #' @importFrom stats anova #' @encoding UTF-8 #' #' @example examples/examples.nice.R #' #' @export nice nice <- function(object, ...) UseMethod("nice", object) #' @rdname nice #' @method nice afex_aov #' @export nice.afex_aov <- function(object, es = attr(object$anova_table, "es"), observed = attr(object$anova_table, "observed"), correction = attr(object$anova_table, "correction"), MSE = NULL, intercept = NULL, p_adjust_method = attr(object$anova_table, "p_adjust_method"), sig_symbols = attr(object$anova_table, "sig_symbols"), round_ps = attr(object$anova_table, "round_ps"), ...) { # if(is.null(es)) { # Defaults to afex_options("es") because of default set in anova.afex_aov # es <- c("pes", "ges")[c("pes", "ges") %in% colnames(object$anova_table)] # } dots <- list(...) if(is.null(MSE)) { # Defaults to TRUE because of default set in anova.afex_aov MSE <- "MSE" %in% colnames(object$anova_table) } if(is.null(intercept)) { # Defaults to FALSE because of default set in anova.afex_aov intercept <- "(Intercept)" %in% rownames(object$anova_table) } if("sig.symbols" %in% names(dots)) { #(!missing(sig.symbols)) { warn_deprecated_arg("sig.symbols", "sig_symbols") sig_symbols <- dots$sig.symbols } if("p.adjust.method" %in% names(dots)) { #(!missing(sig.symbols)) { warn_deprecated_arg("p.adjust.method", "p_adjust_method") p_adjust_method <- dots$p.adjust.method } anova_table <- as.data.frame(anova(object, es = es, observed = observed, correction = correction, MSE = MSE, intercept = intercept, p_adjust_method = p_adjust_method)) nice.anova(anova_table, MSE = MSE, intercept = intercept, sig_symbols = sig_symbols, round_ps = round_ps) } #' @rdname nice #' @method nice anova #' @export nice.anova <- function(object, MSE = NULL, intercept = NULL, sig_symbols = attr(object, "sig_symbols"), round_ps = attr(object, "round_ps"), sig.symbols, ...) { dots <- list(...) if(is.null(MSE)) { # Defaults to TRUE because of default set in anova.afex_aov MSE <- "MSE" %in% colnames(object) } if(is.null(intercept)) { # Defaults to FALSE because of default set in anova.afex_aov intercept <- "(Intercept)" %in% rownames(object) } if("sig.symbols" %in% names(dots)) { #(!missing(sig.symbols)) { warn_deprecated_arg("sig.symbols", "sig_symbols") sig_symbols <- dots$sig.symbols } if(is.null(sig_symbols)) { sig_symbols <- afex_options("sig_symbols") } if(is.null(round_ps)) { round_ps <- afex_options("round_ps") } # internal functions: is.wholenumber <- function(x, tol = .Machine$double.eps^0.5) abs(x - round(x)) < tol make.fs <- function(anova, symbols) { ifelse(anova[["Pr(>F)"]] < 0.001, paste0(formatC( anova[["F"]], digits = 2, format = "f"), symbols[4]), ifelse(anova[["Pr(>F)"]] < 0.01, paste0(formatC( anova[["F"]], digits = 2, format = "f"), symbols[3]), ifelse(anova[["Pr(>F)"]] < 0.05, paste0(formatC( anova[["F"]], digits = 2, format = "f"), symbols[2]), ifelse(anova[["Pr(>F)"]] < 0.1, paste0(formatC( anova[["F"]], digits = 2, format = "f"), symbols[1]), formatC(anova[["F"]], digits = 2, format = "f"))))) } anova_table <- object anova_table[,"df"] <- paste(ifelse(is.wholenumber(anova_table[,"num Df"]), anova_table[,"num Df"], formatC(anova_table[,"num Df"], digits = 2, format = "f")), ifelse(is.wholenumber(anova_table[,"den Df"]), anova_table[,"den Df"], formatC(anova_table[,"den Df"], digits = 2, format = "f")), sep = ", ") symbols.use <- c(" +", " *", " **", " ***") symbols.use[seq_along(sig_symbols)] <- sig_symbols df.out <- data.frame(Effect = row.names(anova_table), df = anova_table[,"df"], stringsAsFactors = FALSE) if (MSE) df.out <- cbind(df.out, data.frame(MSE = formatC(anova_table[,"MSE"], digits = 2, format = "f"), stringsAsFactors = FALSE)) df.out <- cbind(df.out, data.frame(F = make.fs(anova_table, symbols.use), stringsAsFactors = FALSE)) if (!is.null(anova_table$ges)) df.out$ges <- round_ps(anova_table$ges) if (!is.null(anova_table$pes)) df.out$pes <- round_ps(anova_table$pes) df.out$p.value <- round_ps(anova_table[,"Pr(>F)"]) if (!intercept) if (df.out[1,1] == "(Intercept)") { df.out <- df.out[-1,, drop = FALSE] } rownames(df.out) <- NULL attr(df.out, "heading") <- attr(object, "heading") attr(df.out, "p_adjust_method") <- attr(object, "p_adjust_method") attr(df.out, "correction") <- attr(object, "correction") attr(df.out, "observed") <- attr(object, "observed") attr(df.out, "es") <- attr(object, "es") attr(df.out, "sig_symbols") <- symbols.use attr(df.out, "round_ps") <- round_ps class(df.out) <- c("nice_table", class(df.out)) df.out } make.stat <- function(anova, stat, symbols) { out <- ifelse(anova[[paste0("Pr(>", stat,")")]] < 0.001, paste0(formatC(anova[[stat]], digits = 2, format = "f"), symbols[4]), ifelse(anova[[paste0("Pr(>", stat,")")]] < 0.01, paste0(formatC(anova[[stat]], digits = 2, format = "f"), symbols[3]), ifelse(anova[[paste0("Pr(>", stat,")")]] < 0.05, paste0(formatC(anova[[stat]], digits = 2, format = "f"), symbols[2]), ifelse(anova[[paste0("Pr(>", stat,")")]] < 0.1, paste0(formatC(anova[[stat]], digits = 2, format = "f"), symbols[1]), formatC(anova[[stat]], digits = 2, format = "f"))))) out[is.na(anova[[paste0("Pr(>", stat,")")]])] <- formatC( anova[[stat]][is.na(anova[[paste0("Pr(>", stat,")")]])], digits = 2, format = "f") out } is.wholenumber <- function(x, tol = .Machine$double.eps^0.5) abs(x - round(x)) < tol #' @rdname nice #' @method nice mixed #' @export nice.mixed <- function(object, sig_symbols = attr(object$anova_table, "sig_symbols"), round_ps = attr(object$anova_table, "round_ps"), ...) { anova_table <- object$anova_table dots <- list(...) if("sig.symbols" %in% names(dots)) { #(!missing(sig.symbols)) { warn_deprecated_arg("sig.symbols", "sig_symbols") sig_symbols <- dots$sig.symbols } if(is.null(sig_symbols)) sig_symbols <- afex_options("sig_symbols") if(is.null(round_ps)) round_ps <- afex_options("round_ps") symbols.use <- c(" +", " *", " **", " ***") symbols.use[seq_along(sig_symbols)] <- sig_symbols if (is.null(attr(object, "method"))) { df.out <- object[[1]] warning("mixed object was created with old version of afex, table not nicely formatted.") } else if (attr(object, "method") %in% c("KR", "S", "nested-KR") ) { anova_table[,"df"] <- paste(ifelse(is.wholenumber(anova_table[,"num Df"]), round(anova_table[,"num Df"]), formatC(anova_table[,"num Df"], digits = 2, format = "f")), ifelse(is.wholenumber(anova_table[,"den Df"]), round(anova_table[,"den Df"]), formatC(anova_table[,"den Df"], digits = 2, format = "f")), sep = ", ") if ("F.scaling" %in% anova_table) { df.out <- data.frame( Effect = row.names(anova_table), df = anova_table[,"df"], "F.scaling" = formatC(anova_table[,"F.scaling"], digits = 2, format = "f"), stringsAsFactors = FALSE, check.names = FALSE) } else { df.out <- data.frame( Effect = row.names(anova_table), df = anova_table[,"df"], stringsAsFactors = FALSE, check.names = FALSE) } df.out <- cbind(df.out, data.frame( F = make.stat(anova_table, stat = "F", symbols.use), stringsAsFactors = FALSE)) df.out$p.value <- round_ps(anova_table[,"Pr(>F)"]) } else if (attr(object, "method") == "PB") { anova_table[,"Pr(>Chisq)"] <- anova_table[,"Pr(>PB)"] df.out <- data.frame(Effect = row.names(anova_table), df = anova_table[,"Chi Df"], Chisq = make.stat(anova_table, stat = "Chisq", symbols.use), p.value = round_ps(anova_table[,"Pr(>Chisq)"]), stringsAsFactors = FALSE, check.names = FALSE) } else if (attr(object, "method") == "LRT") { df.out <- data.frame(Effect = row.names(anova_table), df = anova_table[,"Chi Df"], Chisq = make.stat(anova_table, stat = "Chisq", symbols.use), p.value = round_ps(anova_table[,"Pr(>Chisq)"]), stringsAsFactors = FALSE, check.names = FALSE) } else stop("method of mixed object not supported.") rownames(df.out) <- NULL attr(df.out, "heading") <- attr(anova_table, "heading") attr(df.out, "sig_symbols") <- symbols.use attr(df.out, "round_ps") <- round_ps class(df.out) <- c("nice_table", class(df.out)) df.out } #' @rdname nice #' @method print nice_table #' @export print.nice_table <- function(x, ...) { if(!is.null(heading <- attr(x, "heading"))) { cat(heading, sep = "\n") } print.data.frame(x) if(!is.null(attr(x, "sig_symbols"))) print_legend(x) if(!is.null(correction_method <- attr(x, "correction")) && correction_method != "none") { cat("\nSphericity correction method:", correction_method, "\n") } invisible(x) } afex/MD50000644000176200001440000001773114076173262011526 0ustar liggesusers385b6262522dc6c664cf532b3b841cad *DESCRIPTION dbf5de09fb237ef3ee541a866eb587c5 *NAMESPACE 174256fb83a87c30d8aa99a673b88015 *NEWS f1855157de4c2f156eaecff514e787ee *R/afex-package.R 9cdbaefdb62cb7d4f5a54690f629319b *R/afex_plot.R 68c5c84c54221f1a25623ad43316a23a *R/afex_plot_plotting_functions.R 2f0a18755c3b9c2f4d2d02f57db038c0 *R/afex_plot_utils.R 3befdd5034dbf0f5c59b5c174bd3f8a8 *R/allFit.R 6ec8995abe02a7c16e19adc5198c5e10 *R/aov_car.R 5b5a5ab970991775aafa5141361ba6fd *R/compare.2.vectors.R f0e85b3925024cfaf7ee2a3de3607373 *R/deprecated.R 823e2b7f40ae776b43f1403f548e40de *R/ems.R abb2ccbe363b89d79bf950de26537a0a *R/fhch2010-data.R 0a8543fe9ad185bf2be5fc9f8b378add *R/helpers.R f484a2891f769af0778d7295f6556e49 *R/ks2013.3-data.R 25539c28c7decc0e06805c9161b5d8a6 *R/laptop_urry-data.R 68a8110f85a87c51bb32660e6342fec5 *R/lmerTest_utils.R ed8a50281ff47370a11a28ed3d061c61 *R/md_12.1-data.R 7de7557aef96b1ba615bf51cef5201fd *R/md_15.1-data.R 8761a7d8052bda59468c67683f595cb0 *R/md_16.1-data.R efd9ac90bf84f209488f73b82a47d1fa *R/md_16.4-data.R c23d449a69cd44de964b746afa4254a0 *R/methods.afex_aov.R 53ac5d5b4d72b1ae07a5fa43e83cd4f9 *R/mixed.R e26cd31c4dc820e1a673b98af4129779 *R/nice.R f4f4a684611b79e3ad013175d6da479b *R/obk.long-data.R 37869db8889d87bf4f8bdf8b24f2fcc1 *R/predict.R 0010f31aac9b17a630749f5fca09f252 *R/reexport.R 3aac2332241180403e8e9fc236465be9 *R/residuals.R 884ed62e0efadb6d58628b170e43a5a3 *R/round_ps.R abc252494871e78961adb56c0ac2e11b *R/set_contrasts.R 8ed2be5203994d149b25c0bbac75fe33 *R/sk2011.1-data.R 50834454549aac18f646d46b2c9f338d *R/sk2011.2-data.R 4dfc4f458c9bc3be0f024de81a693ec6 *R/stroop-data.R 92e62d65b5c9784c3b0cb21d014c2c08 *R/utils.R f6eb4b13abe4d8b80a71167c60326d23 *R/zzz.R 500c38caf264e17837b0a8e26a6a2699 *README.md ff55813b9112456ce859207b992b98aa *build/partial.rdb 01bcad71cc499f245807177623233b50 *build/vignette.rds 67d99926047ef78d0e5dd54b89ae9eb7 *data/fhch2010.rda dc520acd438387964b4561483968f18e *data/ks2013.3.rda 0a0c718ec56f4a1d0f6798a2fb8fb967 *data/laptop_urry.rda 4df2c0c2a5a52ff004bd015e90f8e328 *data/md_12.1.rda 5722056139ad1750e737931076c518d2 *data/md_15.1.rda c5cbc6a44d15c506cf4a913a1e453e86 *data/md_16.1.rda dbe295d0e59a0fd4cf4b73965ddfd16b *data/md_16.4.rda 387538b02807392eef5f8de5b6f55cd7 *data/obk.long.rda 87a9f9f971f46d20fb440385652b3771 *data/sk2011.1.rda 30d68b1cca41bab8e71a24b7b48489be *data/sk2011.2.rda 9275bf3a99cd99755aa5c94ad273e096 *data/stroop.rda 0c2a3d41b0e144eccbda07ba0971636d *inst/doc/afex_analysing_accuracy_data.R d713de54fb7c53ad89f24667606193dd *inst/doc/afex_analysing_accuracy_data.Rmd 7bc077782a8eebc41f136d74fa3f3cd3 *inst/doc/afex_analysing_accuracy_data.html 4d1597afcd12cfd8c213f5fb5e17fd9f *inst/doc/afex_anova_example.R 4d9de25fd1c1f2fcf5a0005f3b0935ed *inst/doc/afex_anova_example.Rmd 17d0629ee744f0f9d4a9827f81458487 *inst/doc/afex_anova_example.html 593bdad45832f03056a8db16716d0fe2 *inst/doc/afex_mixed_example.R 527b5700b7a8f92b8fdccfbc997f1943 *inst/doc/afex_mixed_example.Rmd 8f86ea609fffef0b3a4f7def05f2546e *inst/doc/afex_mixed_example.html 093d76932e03df7d1294c168b6b58524 *inst/doc/afex_plot_introduction.R c3bdd00420f2501417bb6eaab8ddd138 *inst/doc/afex_plot_introduction.Rmd 89f723183de66787b1a5c991cef5b26f *inst/doc/afex_plot_introduction.html c5e382cb0df5b696de2b636e4e47bbd6 *inst/doc/afex_plot_supported_models.R 559c128cb305057c55a32562f4f08a2b *inst/doc/afex_plot_supported_models.Rmd e9cbbc90fc1870470a89e1b5173ae1f9 *inst/doc/afex_plot_supported_models.html 1e22b8bf9018811ac2a1c2a69d586b17 *inst/doc/assumptions_of_ANOVAs.R 7d342d442940613d14c3543d9a811a30 *inst/doc/assumptions_of_ANOVAs.Rmd d2a66ba7298dde856a76437d77dd58b6 *inst/doc/assumptions_of_ANOVAs.html 7e7a3e4a029f7f1b59b8bec52e1431b8 *inst/doc/introduction-mixed-models.pdf 7a06a8abee3f7b7865e044a3b0a9d802 *inst/doc/introduction-mixed-models.pdf.asis be7e906e7e0c7e77cd0ba5670c4cb1b7 *inst/extdata/output_afex_plot_mixed_vignette.rda 0518c2eabbd1e912bf8c6f9d881dc37f *inst/extdata/output_mixed_vignette.rda 9c70f6a52129d26e16ef621db1d5f73d *inst/extdata/outputs_glmm_vignette.rda dff54ef95f6d969143be97a33678531f *inst/extdata/plots_brms.rda 31ed9f0fe0300a7bb2da141bd149fa2f *inst/extdata/plots_rstanarm.rda e5724edfa49c26d3b68a066dcf5e6e98 *inst/extdata/tmb_example_fit.rda 4bbf29ffd439d90f008a086426f237d0 *man/afex-package.Rd 8731ddaba19e87cff7204e121f64d9a5 *man/afex_aov-methods.Rd 8ecd73d107a696e23a5fbcbd61c36d00 *man/afex_options.Rd ad6933f1405abdf976bdde209df4463f *man/afex_plot.Rd 203a4d73b9e42001f1c434760a8b3048 *man/all_fit.Rd 336a4ddf7a2585cf2d98785903168450 *man/aov_car.Rd e3de35a9b317358e0a255ec5a646f7a6 *man/compare.2.vectors.Rd dcd65bb1d646c5c2a00b5065d8acdda6 *man/deprecated.Rd 1c4f6aca44fabae929b426528b8e9f66 *man/ems.Rd 2e04a9a7372242bc7bfc2cc3a0eca4e3 *man/fhch2010.Rd ec8bd69d6acbca748c773714e2bd4baf *man/figures/README-unnamed-chunk-17-1.png c93048113335f86aa5636298f2dbe3e6 *man/figures/README-unnamed-chunk-18-1.png 681e173bd1dc91e4162df5340944f809 *man/figures/README-unnamed-chunk-19-1.png 1962402182bb153800da2547384dd50f *man/figures/README-unnamed-chunk-6-1.png b2e160c1be0f6c4c9b555f5077f891c2 *man/figures/README-unnamed-chunk-7-1.png 82393746f43a00810b5a74e2ba160816 *man/ks2013.3.Rd ca5ea13c3371b53610ad70063ba91e91 *man/laptop_urry.Rd 56786b695cba78e59c962bb05211d365 *man/md_12.1.Rd a79d3e7b6cc9caf347cfadc4a32f66a8 *man/md_15.1.Rd 12564519f974db19d2fcaaddc0e1ca25 *man/md_16.1.Rd bd91c2867b41314bd5e07a53a2921e4a *man/md_16.4.Rd 11e3ddd8377bc79a0d2bf8edc3a2e93f *man/mixed.Rd 8255277543c281cf57410cd570808afc *man/nice.Rd 4d65a1fb80548509757c5c1ff3488a16 *man/obk.long.Rd 8c6823fdbe4ce532eafa0a3d5477d973 *man/predict.afex_aov.Rd 17e1c5210d2e6ab226a70df8c9178512 *man/reexports.Rd 91a902ed2d9848ebe49b2ba02276c8e2 *man/residuals.afex_aov.Rd 47d015be0d9b616aebdb453073af9f31 *man/round_ps.Rd 9eaee6215c833fae87ee3eb3ce93f6b1 *man/set_sum_contrasts.Rd 60d4ae785ecaea1546f696c8336bda34 *man/sk2011.1.Rd 9c91dea2ec292b4e18a06cba516ef29c *man/sk2011.2.Rd c006ecc3b3538fb8593b5ba9f3289576 *man/stroop.Rd 24ef3ebe1b7dec6e3a22760eab1ab2f4 *tests/testthat.R f85b110afca888b2a29075ea44b239e4 *tests/testthat/afex_aov_16_1.rda 72be28e9b3a9a84dcdc46c417c2681e7 *tests/testthat/anova_hf_error.rda 8e1d7042dd7d30ae9eb8734f0080e5bd *tests/testthat/lmm_old_object.rda 34150eb0876b348943477a65c6e8a7e9 *tests/testthat/m_machines_lmerTest-pre3.0.rda 6c14ea76e8082da1001761f83c2cdd64 *tests/testthat/mixed_with_dot.rda 0f79b314eccad8e1c5861bd84caa3b9b *tests/testthat/test-afex_aov.R d3e255fd57bd86c0787160110672f094 *tests/testthat/test-afex_plot-basics.R 9b38baf988bd737eae091afeb09fb58a *tests/testthat/test-afex_plot-bugs.R ffb26be2534e73782d36168a03084aba *tests/testthat/test-afex_plot-default-support.R cc44590497a490ee7b615b24938805a6 *tests/testthat/test-afex_plot-vignette.R e6da4bdb437ae929b2002d9364d464e4 *tests/testthat/test-aov_car-basic.R 9c922714122a3222e9c27f3d24ce2c4d *tests/testthat/test-aov_car-bugs.R 357740a43bb4c2ec65d86228926211b6 *tests/testthat/test-aov_car-structural.R b06950f36237997bd95475ae5bbdb0ab *tests/testthat/test-compare_2_vectors.R 4c9a55078ba827a2ff7024abbb695d2a *tests/testthat/test-emmeans-interface.R fcb2759e0aa312b06dd5dccdcee58a28 *tests/testthat/test-lmerTest-support.R 65406b4c82385af103cec98d770e20c3 *tests/testthat/test-mixed-bugs.R f50a54a9e9740897e7191294bd549aab *tests/testthat/test-mixed-effects.R 918ca6997765089f7862c267e8d3b609 *tests/testthat/test-mixed-mw.R afaa8a6c7913c056e5ce81fd622b02ec *tests/testthat/test-mixed-structure.R eb21a8ec751d39f2024a999bd888db4f *tests/testthat/test-predict.R 939a4580c65808088a0262a0c90859cb *tests/testthat/test-residuals.R d713de54fb7c53ad89f24667606193dd *vignettes/afex_analysing_accuracy_data.Rmd 4d9de25fd1c1f2fcf5a0005f3b0935ed *vignettes/afex_anova_example.Rmd 527b5700b7a8f92b8fdccfbc997f1943 *vignettes/afex_mixed_example.Rmd c3bdd00420f2501417bb6eaab8ddd138 *vignettes/afex_plot_introduction.Rmd 559c128cb305057c55a32562f4f08a2b *vignettes/afex_plot_supported_models.Rmd 7d342d442940613d14c3543d9a811a30 *vignettes/assumptions_of_ANOVAs.Rmd 7a06a8abee3f7b7865e044a3b0a9d802 *vignettes/introduction-mixed-models.pdf.asis afex/inst/0000755000176200001440000000000014076067245012165 5ustar liggesusersafex/inst/doc/0000755000176200001440000000000014076067246012733 5ustar liggesusersafex/inst/doc/assumptions_of_ANOVAs.R0000644000176200001440000000451114076067244017235 0ustar liggesusers## ----echo=FALSE------------------------------------------------------------------------- req_suggested_packages <- c("see", "performance", "ggplot2") pcheck <- lapply(req_suggested_packages, requireNamespace, quietly = TRUE) if (any(!unlist(pcheck))) { message("Required package(s) for this vignette are not available/installed and code will not be executed.") knitr::opts_chunk$set(eval = FALSE) } ## ----set-options, echo=FALSE, cache=FALSE----------------------------------------------- options(width = 90) knitr::opts_chunk$set(dpi=72) ## ---- message=FALSE--------------------------------------------------------------------- library(afex) library(performance) # for assumption checks ## --------------------------------------------------------------------------------------- data(obk.long, package = "afex") o1 <- aov_ez("id", "value", obk.long, between = c("treatment", "gender")) check_homogeneity(o1) ## --------------------------------------------------------------------------------------- data("fhch2010", package = "afex") a1 <- aov_ez("id", "log_rt", fhch2010, between = "task", within = c("density", "frequency", "length", "stimulus")) ## --------------------------------------------------------------------------------------- check_sphericity(a1) ## ---- eval = FALSE---------------------------------------------------------------------- # afex_options( # correction_aov = "GG", # or "HF" # emmeans_model = "multivariate" # ) ## --------------------------------------------------------------------------------------- data("stroop", package = "afex") stroop1 <- subset(stroop, study == 1) stroop1 <- na.omit(stroop1) s1 <- aov_ez("pno", "rt", stroop1, within = c("condition", "congruency")) is_norm <- check_normality(s1) plot(is_norm) plot(is_norm, type = "qq") ## --------------------------------------------------------------------------------------- plot(is_norm, type = "qq", detrend = TRUE) ## --------------------------------------------------------------------------------------- s2 <- aov_ez("pno", "rt", stroop1, transformation = "log", within = c("condition", "congruency")) is_norm <- check_normality(s2) plot(is_norm, type = "qq", detrend = TRUE) afex/inst/doc/afex_mixed_example.html0000644000176200001440000054564314076067165017466 0ustar liggesusers Mixed Model Reanalysis of RT data

Mixed Model Reanalysis of RT data

Henrik Singmann

2021-07-21

Overview

This documents reanalysis response time data from an Experiment performed by Freeman, Heathcote, Chalmers, and Hockley (2010) using the mixed model functionality of afex implemented in function mixed followed by post-hoc tests using package emmeans (Lenth, 2017). After a brief description of the data set and research question, the code and results are presented.

Description of Experiment and Data

The data are lexical decision and word naming latencies for 300 words and 300 nonwords from 45 participants presented in Freeman et al. (2010). The 300 items in each stimulus condition were selected to form a balanced \(2 \times 2\) design with factors neighborhood density (low versus high) and frequency (low versus high). The task was a between subjects factor: 25 participants worked on the lexical decision task and 20 participants on the naming task. After excluding erroneous responses each participants responded to between 135 and 150 words and between 124 and 150 nonwords. We analyzed log RTs which showed an approximately normal picture.

Data and R Preparation

We start with loading some packages we will need throughout this example. For data manipulation we will be using the dplyr and tidyr packages from the tidyverse. A thorough introduction to these packages is beyond this example, but well worth it, and can be found in ‘R for Data Science’ by Wickham and Grolemund. For plotting we will be using ggplot2, also part of the tidyverse.

After loading the packages, we will load the data (which comes with afex), remove the errors, and take a look at the variables in the data.

library("afex") # needed for mixed() and attaches lme4 automatically.
library("emmeans") # emmeans is needed for follow-up tests 
library("multcomp") # for advanced control for multiple testing/Type 1 errors.
library("dplyr") # for working with data frames
library("tidyr") # for transforming data frames from wide to long and the other way round.
library("ggplot2") # for plots
theme_set(theme_bw(base_size = 15) + 
            theme(legend.position="bottom", 
                  panel.grid.major.x = element_blank()))

data("fhch2010") # load 
fhch <- droplevels(fhch2010[ fhch2010$correct,]) # remove errors
str(fhch2010) # structure of the data
## 'data.frame':    13222 obs. of  10 variables:
##  $ id       : Factor w/ 45 levels "N1","N12","N13",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ task     : Factor w/ 2 levels "naming","lexdec": 1 1 1 1 1 1 1 1 1 1 ...
##  $ stimulus : Factor w/ 2 levels "word","nonword": 1 1 1 2 2 1 2 2 1 2 ...
##  $ density  : Factor w/ 2 levels "low","high": 2 1 1 2 1 2 1 1 1 1 ...
##  $ frequency: Factor w/ 2 levels "low","high": 1 2 2 2 2 2 1 2 1 2 ...
##  $ length   : Factor w/ 3 levels "4","5","6": 3 3 2 2 1 1 3 2 1 3 ...
##  $ item     : Factor w/ 600 levels "abide","acts",..: 363 121 202 525 580 135 42 368 227 141 ...
##  $ rt       : num  1.091 0.876 0.71 1.21 0.843 ...
##  $ log_rt   : num  0.0871 -0.1324 -0.3425 0.1906 -0.1708 ...
##  $ correct  : logi  TRUE TRUE TRUE TRUE TRUE TRUE ...

To make sure our expectations about the data match the data we use some dplyr magic to confirm the number of participants per condition and items per participant.

## are all participants in only one task?
fhch %>% group_by(id) %>%
  summarise(task = n_distinct(task)) %>%
  as.data.frame() %>% 
  {.$task == 1} %>%
  all()
## [1] TRUE
## participants per condition:
fhch %>% group_by(id) %>%
  summarise(task = first(task)) %>%
  ungroup() %>%
  group_by(task) %>%
  summarise(n = n())
## # A tibble: 2 x 2
##   task       n
##   <fct>  <int>
## 1 naming    20
## 2 lexdec    25
## number of different items per participant:
fhch %>% group_by(id, stimulus) %>%
  summarise(items = n_distinct(item)) %>%
  ungroup() %>%
  group_by(stimulus) %>%
  summarise(min = min(items), 
            max = max(items), 
            mean = mean(items))
## # A tibble: 2 x 4
##   stimulus   min   max  mean
##   <fct>    <int> <int> <dbl>
## 1 word       135   150  145.
## 2 nonword    124   150  143.

Before running the analysis we should make sure that our dependent variable looks roughly normal. To compare rt with log_rt within the same figure we first need to transform the data from the wide format (where both rt types occupy one column each) into the long format (in which the two rt types are combined into a single column with an additional indicator column). To do so we use tidyr::pivot_longer. Then we simply call ggplot with geom_histogram and facet_wrap(vars(rt_type)) on the new tibble. The plot shows that log_rt looks clearly more normal than rt, although not perfectly so. An interesting exercise could be to rerun the analysis below using a transformation that provides an even better ‘normalization’.

fhch_long <- fhch %>% 
  pivot_longer(cols = c(rt, log_rt), names_to = "rt_type", values_to = "rt")
ggplot(fhch_long, aes(rt)) +
  geom_histogram(bins = 100) +
  facet_wrap(vars(rt_type), scales = "free_x")

Descriptive Analysis

The main factors in the experiment were the between-subjects factor task (naming vs. lexdec), and the within-subjects factors stimulus (word vs. nonword), density (low vs. high), and frequency (low vs. high). Before running an analysis it is a good idea to visually inspect the data to gather some expectations regarding the results. Should the statistical results dramatically disagree with the expectations this suggests some type of error along the way (e.g., model misspecification) or at least encourages a thorough check to make sure everything is correct. We first begin by plotting the data aggregated by-participant.

In each plot we plot the raw data in the background. To make the individual data points visible we use ggbeeswarm::geom_quasirandom and alpha = 0.5 for semi-transparency. On top of this we add a (transparent) box plot as well as the mean and standard error.

agg_p <- fhch %>% 
  group_by(id, task, stimulus, density, frequency) %>%
  summarise(mean = mean(log_rt)) %>%
  ungroup()

ggplot(agg_p, aes(x = interaction(density,frequency), y = mean)) +
  ggbeeswarm::geom_quasirandom(alpha = 0.5) +
  geom_boxplot(fill = "transparent") +
  stat_summary(colour = "red") +
  facet_grid(cols = vars(task), rows = vars(stimulus))

Now we plot the same data but aggregated across items:

agg_i <- fhch %>% group_by(item, task, stimulus, density, frequency) %>%
  summarise(mean = mean(log_rt)) %>%
  ungroup()

ggplot(agg_i, aes(x = interaction(density,frequency), y = mean)) +
  ggbeeswarm::geom_quasirandom(alpha = 0.3) +
  geom_boxplot(fill = "transparent") +
  stat_summary(colour = "red") +
  facet_grid(cols = vars(task), rows = vars(stimulus))

These two plots show a very similar pattern and suggest several things:

  • Responses to nonwords appear slower than responses to words, at least for the naming task.
  • lexdec responses appear to be slower than naming responses, particularly in the word condition.
  • In the nonword and naming condition we see a clear effect of frequency with slower responses to high than low frequency words.
  • In the word conditions the frequency pattern appears to be in the opposite direction to the pattern described in the previous point: faster responses to low frequency than to high frequency words.
  • density appears to have no effect, perhaps with the exception of the nonword lexdec condition.

Model Setup

To set up a mixed model it is important to identify which factors vary within which grouping factor generating random variability (i.e., grouping factors are sources of stochastic variability). The two grouping factors are participants (id) and items (item). The within-participant factors are stimulus, density, and frequency. The within-item factor is task. The ‘maximal model’ (Barr, Levy, Scheepers, and Tily, 2013) therefore is the model with by-participant random slopes for stimulus, density, and frequency and their interactions and by-item random slopes for task.

It is rather common that a maximal model with a complicated random effect structure, such as the present one, does not converge successfully. The best indicator of this is a “singular fit” warning. A model with a singular fit warning should not be reported or used. Instead, one should make sure that qualitatively the same results are also observed with a model without singular fit warnings. If the maximal model that does not converge and a reduced model without a singular fit warning (i.e., the final model) diverge in their results, results should only be interpreted cautiously.

In case of a singular fit or another indicator of a convergence problem, the usual first step is removing the correlations among the random terms. In our example, there are two sets of correlations, one for each random effect grouping variable. Consequently, we can build four model that have the maximal structure in terms of random-slopes and only differ in which correlations among random terms are calculated:

  1. With all correlations.
  2. No correlation among by-item random effects (i.e., no correlation between random intercept and task random slope).
  3. No correlation among by-participant random effect terms (i.e., no correlation among random slopes themselves and between the random slopes and the random intercept).
  4. No correlation among either random grouping factor.

The next decision to be made is which method to use for obtaining \(p\)-values. The best control against anti-conservative results is provided by method = "KR" (=Kenward-Roger). However, KR needs quite a lot of RAM, especially with complicated random effect structures and large data sets. In this case we have both, relatively large data (i.e., many levels on each random effect, especially the item random effect) and a complicated random effect structure. Consequently, it seems a reasonable decision to choose another method. The second ‘best’ method (in terms of controlling for Type I errors) is the ‘Satterthwaite’ approximation, method = 'S'. It provides a similar control of Type I errors as the Kenward-Roger approximation and needs less RAM. The Satterthwaite method is currently also the default method for calculating \(p\)-values so does not need to be set explicitly.

Finding the Final Model

The following code fits the four models using the Satterthwaite method. To suppress random effects we use the || notation. Note that it is necessary to set expand_re = TRUE when suppressing random effects among variables that are entered as factors and not as numerical variables (all independent variables in the present case are factors). Also note that mixed automatically uses appropriate contrast coding if factors are included in interactions (contr.sum) in contrast to the R default (which is contr.treatment). To make sure the estimation does not end prematurely we set the allowed number of function evaluations to a very high value (using lmerControl).

However, because fitting the models in R might take quite a while, you should also be able to load the fitted binary files them from this url and then load them in R with load("freeman_models.rda").

m1s <- mixed(log_rt ~ task*stimulus*density*frequency + 
               (stimulus*density*frequency|id)+
               (task|item), fhch, 
             control = lmerControl(optCtrl = list(maxfun = 1e6)))
## boundary (singular) fit: see ?isSingular
m2s <- mixed(log_rt ~ task*stimulus*density*frequency + 
               (stimulus*density*frequency|id)+
               (task||item), fhch, 
             control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE)
## boundary (singular) fit: see ?isSingular
m3s <- mixed(log_rt ~ task*stimulus*density*frequency +
               (stimulus*density*frequency||id)+
               (task|item), fhch, 
             control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE)
## boundary (singular) fit: see ?isSingular
m4s <- mixed(log_rt ~ task*stimulus*density*frequency + 
               (stimulus*density*frequency||id)+
               (task||item), fhch, 
             control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE)
## boundary (singular) fit: see ?isSingular

We can see that fitting each of these models emits the “singular fit” message (it is technically a message and not a warning) indicating that the model is over-parameterized and did not converge successfully. In particular, this message indicates that the model is specified with more random effect parameters than can be estimated given the current data.

It is instructive to see that even with a comparatively large number of observations, 12960, a set of seven random slopes for the by-participant term and one random slope for the by-item term cannot be estimated successfully. And this holds even after removing all correlations. Thus, it should not be surprising that similar sized models regularly do not converge with smaller numbers of observations. Furthermore, we are here in the fortunate situation that each factor has only two levels. A factor with more levels corresponds to more parameters of the random effect terms.

Before deciding what to do next, we take a look at the estimated random effect estimates. We do so for the model without any correlations. Note that for afex models we usually do not want to use the summary method as it prints the results on the level of the model coefficients and not model terms. But for the random effects we have to do so. However, we are only interested in the random effect terms so we only print those using summary(model)$varcor.

summary(m4s)$varcor 
##  Groups   Name                                    Std.Dev. 
##  item     re2.task1                               0.0568715
##  item.1   (Intercept)                             0.0537587
##  id       re1.stimulus1_by_density1_by_frequency1 0.0077923
##  id.1     re1.density1_by_frequency1              0.0000000
##  id.2     re1.stimulus1_by_frequency1             0.0000000
##  id.3     re1.stimulus1_by_density1               0.0000000
##  id.4     re1.frequency1                          0.0179993
##  id.5     re1.density1                            0.0000000
##  id.6     re1.stimulus1                           0.0445333
##  id.7     (Intercept)                             0.1936292
##  Residual                                         0.3001905

The output shows that the estimated SDs of the random slopes of the two-way interactions are all zero. However, because we cannot remove the random slopes for the two way interaction while retaining the three-way interaction, we start by removing the three-way interaction first.

m5s <- mixed(log_rt ~ task*stimulus*density*frequency + 
               ((stimulus+density+frequency)^2||id)+
               (task||item), fhch, 
             control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE)
## boundary (singular) fit: see ?isSingular
summary(m5s)$varcor 
##  Groups   Name                        Std.Dev.  
##  item     re2.task1                   5.6826e-02
##  item.1   (Intercept)                 5.3736e-02
##  id       re1.density1_by_frequency1  0.0000e+00
##  id.1     re1.stimulus1_by_frequency1 0.0000e+00
##  id.2     re1.stimulus1_by_density1   0.0000e+00
##  id.3     re1.frequency1              1.7966e-02
##  id.4     re1.density1                1.4422e-05
##  id.5     re1.stimulus1               4.4539e-02
##  id.6     (Intercept)                 1.9374e-01
##  Residual                             3.0030e-01

Not too surprisingly, this model also produces a singular fit. Inspection of the estimates shows that the two-way interaction of the slopes are still estimated to be zero. So we remove those in the next step.

m6s <- mixed(log_rt ~ task*stimulus*density*frequency + 
               (stimulus+density+frequency||id)+
               (task||item), fhch, 
             control = lmerControl(optCtrl = list(maxfun = 1e6)), 
             expand_re = TRUE)
## boundary (singular) fit: see ?isSingular

This model still shows a singular fit warning. The random effect estimates below show a potential culprit.

summary(m6s)$varcor 
##  Groups   Name           Std.Dev.
##  item     re2.task1      0.056831
##  item.1   (Intercept)    0.053737
##  id       re1.frequency1 0.017972
##  id.1     re1.density1   0.000000
##  id.2     re1.stimulus1  0.044524
##  id.3     (Intercept)    0.193659
##  Residual                0.300297

As in m4s above, the random effect SD for the density term is estimated to be zero. Thus, we remove this as well in the next step.

m7s <- mixed(log_rt ~ task*stimulus*density*frequency + 
               (stimulus+frequency||id)+
               (task||item), fhch, 
             control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE)

This model finally does not emit a singular fit warning. Is this our final model? Before deciding on this, we see whether we can add the correlation terms again without running into any problems. We begin by adding the correlation to the by-participant term.

m8s <- mixed(log_rt ~ task*stimulus*density*frequency + 
               (stimulus+frequency|id)+
               (task||item), fhch, 
             control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE)
## Warning: Model failed to converge with max|grad| = 0.00347544 (tol = 0.002, component 1)

This model does not show a singular fit message but emits another warning. Specifically, a warning that the absolute maximal gradient at the final solution is too high. This warning is not necessarily critical (i.e., it can be a false positive), but can also indicate serious problems. Consequently, we try adding the correlation between the by-item random terms instead:

m9s <- mixed(log_rt ~ task*stimulus*density*frequency + 
               (stimulus+frequency||id)+
               (task|item), fhch, 
             control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE)

This model also does not show any warnings. Thus, we have arrived at the end of the model selection process.

Results of Maximal and Final Model

We now have the following two relevant models.

  • m1s: The maximal random effect structure justified by the design (i.e., the maximal model)
  • m9s: The final model

Robust results are those that hold regardless across maximal and final (i.e., reduced) model. Therefore, let us compare the pattern of significant and non-significant effects.

left_join(nice(m1s), nice(m9s), by = "Effect", 
          suffix = c("_full", "_final")) 
## Mixed Model Anova Table (Type 3 tests, S-method)
## 
## Model: log_rt ~ task * stimulus * density * frequency + (stimulus * 
## Model:     density * frequency | id) + (task | item)
## Data: fhch
##                             Effect   df_full     F_full p.value_full  df_final    F_final p.value_final
## 1                             task  1, 43.58  13.71 ***        <.001  1, 43.51  13.68 ***         <.001
## 2                         stimulus  1, 50.50 151.03 ***        <.001  1, 50.57 151.38 ***         <.001
## 3                          density 1, 175.53       0.33         .569 1, 584.58       0.36          .547
## 4                        frequency  1, 71.17       0.55         .459  1, 70.27       0.56          .456
## 5                    task:stimulus  1, 51.45  70.91 ***        <.001  1, 51.50  71.32 ***         <.001
## 6                     task:density 1, 184.47  16.22 ***        <.001 1, 578.72  17.89 ***         <.001
## 7                 stimulus:density 1, 247.85       1.13         .289 1, 584.60       1.19          .275
## 8                   task:frequency  1, 75.03  81.10 ***        <.001  1, 74.09  82.77 ***         <.001
## 9               stimulus:frequency 1, 165.95  55.85 ***        <.001 1, 584.78  63.29 ***         <.001
## 10               density:frequency 1, 215.83       0.11         .739 1, 584.62       0.11          .742
## 11           task:stimulus:density 1, 259.93  14.52 ***        <.001 1, 578.74  14.87 ***         <.001
## 12         task:stimulus:frequency 1, 178.33 110.95 ***        <.001 1, 578.91 124.16 ***         <.001
## 13          task:density:frequency 1, 228.12     5.53 *         .020 1, 578.75     5.93 *          .015
## 14      stimulus:density:frequency 1, 101.11     3.98 *         .049 1, 584.64     4.62 *          .032
## 15 task:stimulus:density:frequency 1, 108.10   10.19 **         .002 1, 578.77  11.72 ***         <.001
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

What this shows is that the pattern of significant and non-significant effect is the same for both models. The only significant effect for which the evidence is not that strong is the 3-way interaction between stimulus:density:frequency. It is only just below .05 for the full model and has a somewhat lower value for the final model.

We can also see that one of the most noticeable differences between the maximal and the final model is the number of denominator degrees of freedom. This is highly influenced by the random effect structure and thus considerable larger in the final (i.e., reduced) model. The difference in the other statistics is lower.

LRT Results

It is instructive to compare those results with results obtained using the comparatively ‘worst’ method for obtaining \(p\)-values implemented in afex::mixed, likelihood ratio tests. Likelihood ratio-tests should in principle deliver reasonable results for large data sets. A common rule of thumb is that the number of levels for each random effect grouping factor needs to be large, say above 50. Here, we have a very large number of items (600), but not that many participants (45). Thus, qualitative results should be the very similar, but it still is interesting to see exactly what happens. We therefore fit the final model using method='LRT'.

m9lrt <- mixed(log_rt ~ task*stimulus*density*frequency + 
               (stimulus+frequency||id)+
               (task|item), fhch, method = "LRT", 
             control = lmerControl(optCtrl = list(maxfun = 1e6)), 
             expand_re = TRUE)
m9lrt
## Mixed Model Anova Table (Type 3 tests, LRT-method)
## 
## Model: log_rt ~ task * stimulus * density * frequency + (stimulus + 
## Model:     frequency || id) + (task | item)
## Data: fhch
## Df full model: 23
##                             Effect df      Chisq p.value
## 1                             task  1  12.44 ***   <.001
## 2                         stimulus  1  70.04 ***   <.001
## 3                          density  1       0.37    .545
## 4                        frequency  1       0.57    .449
## 5                    task:stimulus  1  45.52 ***   <.001
## 6                     task:density  1  17.81 ***   <.001
## 7                 stimulus:density  1       1.21    .272
## 8                   task:frequency  1  53.81 ***   <.001
## 9               stimulus:frequency  1  60.64 ***   <.001
## 10               density:frequency  1       0.11    .741
## 11           task:stimulus:density  1  14.85 ***   <.001
## 12         task:stimulus:frequency  1 114.21 ***   <.001
## 13          task:density:frequency  1     5.96 *    .015
## 14      stimulus:density:frequency  1     4.65 *    .031
## 15 task:stimulus:density:frequency  1  11.71 ***   <.001
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

The results in this case match the results of the Satterthwaite method. With lower numbers of levels of the grouping factor (e.g., less participants) this would not necessarily be expected.

Summary of Results

Fortunately, the results from all models converged on the same pattern of significant and non-significant effects providing a high degree of confidence in the results. This might not be too surprising given the comparatively large number of total data points and the fact that each random effect grouping factor has a considerable number of levels (above 30 for both participants and items). In the following we focus on the final model using the Satterthwaite method, m9s.

In terms of the significant findings, there are many that seem to be in line with the descriptive results described above. For example, the highly significant effect of task:stimulus:frequency with \(F(1, 578.91) = 124.16\), \(p < .001\), appears to be in line with the observation that the frequency effect appears to change its sign depending on the task:stimulus cell (with nonword and naming showing the opposite patterns than the other three conditions). Consequently, we start by investigating this interaction further below.

Follow-Up Analyses

Before investigating the significant interaction in detail it is a good idea to remind oneself what a significant interaction represents on a conceptual level; that one or multiple of the variables in the interaction moderate (i.e., affect) the effect of the other variable or variables. Consequently, there are several ways to investigate a significant interaction. Each of the involved variables can be seen as the moderating variables and each of the variables can be seen as the effect of interest. Which one of those possible interpretations is of interest in a given situation highly depends on the actual data and research question and multiple views can be ‘correct’ in a given situation.

In addition to this conceptual issue, there are also multiple technical ways to investigate a significant interaction. One approach not followed here is to split the data into subsets according to the moderating variables and compute the statistical model again for the subsets with the effect variable(s) as remaining fixed effect. This approach, also called simple effects analysis, is, for example, recommended by Maxwell and Delaney (2004) as it does not assume variance homogeneity and is faithful to the data at each level. The approach taken here is to simply perform the test on the estimated final model. This approach assumes variance homogeneity (i.e., that the variances in all groups are homogeneous) and has the added benefit that it is computationally relatively simple. In addition, it can all be achieved using the framework provided by emmeans (Lenth, 2017).

task:stimulus:frequency Interaction

Our interest in the beginning is on the effect of frequency by task:stimulus combination. So let us first look at the estimated marginal means of this effect. In emmeans parlance these estimated means are called ‘least-square means’ because of historical reasons, but because of the lack of least-square estimation in mixed models we prefer the term estimated marginal means, or EMMs for short. Those can be obtained in the following way. To prevent emmeans from calculating the df for the EMMs (which can be quite costly), we use asymptotic dfs (i.e., \(z\) values and tests). emmeans requires to first specify the variable(s) one wants to treat as the effect variable(s) (here frequency) and then allows to specify condition variables.

emm_options(lmer.df = "asymptotic") # also possible: 'satterthwaite', 'kenward-roger'
emm_i1 <- emmeans(m9s, "frequency", by = c("stimulus", "task"))
emm_i1
## NOTE: Results may be misleading due to involvement in interactions
## stimulus = word, task = naming:
##  frequency   emmean     SE  df asymp.LCL asymp.UCL
##  low       -0.32333 0.0455 Inf   -0.4125   -0.2342
##  high      -0.38210 0.0455 Inf   -0.4713   -0.2929
## 
## stimulus = nonword, task = naming:
##  frequency   emmean     SE  df asymp.LCL asymp.UCL
##  low       -0.14294 0.0455 Inf   -0.2321   -0.0538
##  high       0.06405 0.0455 Inf   -0.0252    0.1533
## 
## stimulus = word, task = lexdec:
##  frequency   emmean     SE  df asymp.LCL asymp.UCL
##  low        0.02337 0.0413 Inf   -0.0576    0.1044
##  high      -0.04017 0.0413 Inf   -0.1211    0.0408
## 
## stimulus = nonword, task = lexdec:
##  frequency   emmean     SE  df asymp.LCL asymp.UCL
##  low        0.10455 0.0413 Inf    0.0235    0.1856
##  high      -0.00632 0.0413 Inf   -0.0873    0.0746
## 
## Results are averaged over the levels of: density 
## Degrees-of-freedom method: asymptotic 
## Confidence level used: 0.95

The returned values are in line with our observation that the nonword and naming condition diverges from the other three. But is there actual evidence that the effect flips? We can test this using additional emmeans functionality. Specifically, we first use the pairs function which provides us with a pairwise test of the effect of frequency in each task:stimulus combination. Then we need to combine the four tests within one object to obtain a family-wise error rate correction which we do via update(..., by = NULL) (i.e., we revert the effect of the by statement from the earlier emmeans call) and finally we select the holm method for controlling for family wise error rate (the Holm method is uniformly more powerful than the Bonferroni).

update(pairs(emm_i1), by = NULL, adjust = "holm")
## NOTE: Results may be misleading due to involvement in interactions
##  contrast   stimulus task   estimate     SE  df z.ratio p.value
##  low - high word     naming   0.0588 0.0149 Inf   3.941 0.0002 
##  low - high nonword  naming  -0.2070 0.0150 Inf -13.823 <.0001 
##  low - high word     lexdec   0.0635 0.0167 Inf   3.807 0.0002 
##  low - high nonword  lexdec   0.1109 0.0167 Inf   6.619 <.0001 
## 
## Results are averaged over the levels of: density 
## Degrees-of-freedom method: asymptotic 
## P value adjustment: holm method for 4 tests

We could also use a slightly more powerful method than the Holm method, method free from package multcomp. This method takes the correlation of the model parameters into account. However, results do not differ much here:

summary(as.glht(update(pairs(emm_i1), by = NULL)), test = adjusted("free"))
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Linear Hypotheses:
##                                  Estimate Std. Error z value Pr(>|z|)    
## low - high, word, naming == 0     0.05877    0.01491   3.941 0.000162 ***
## low - high, nonword, naming == 0 -0.20699    0.01497 -13.823  < 2e-16 ***
## low - high, word, lexdec == 0     0.06353    0.01669   3.807 0.000162 ***
## low - high, nonword, lexdec == 0  0.11086    0.01675   6.619 1.11e-10 ***
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
## (Adjusted p values reported -- free method)

We see that the results are exactly as expected. In the nonword and naming condition we have a clear negative effect of frequency while in the other three conditions it is clearly positive.

We could now also use emmeans and re-transform the estimates back onto the original RT response scale. For this, we can again update the emmeans object by using tran = "log" to specify the transformation and then indicating we want the means on the response scale with type = "response". These values might be used for plotting.

emm_i1b <- update(emm_i1, tran = "log", type = "response", by = NULL)
emm_i1b
##  frequency stimulus task   response     SE  df asymp.LCL asymp.UCL
##  low       word     naming    0.724 0.0329 Inf     0.662     0.791
##  high      word     naming    0.682 0.0310 Inf     0.624     0.746
##  low       nonword  naming    0.867 0.0394 Inf     0.793     0.948
##  high      nonword  naming    1.066 0.0485 Inf     0.975     1.166
##  low       word     lexdec    1.024 0.0423 Inf     0.944     1.110
##  high      word     lexdec    0.961 0.0397 Inf     0.886     1.042
##  low       nonword  lexdec    1.110 0.0459 Inf     1.024     1.204
##  high      nonword  lexdec    0.994 0.0410 Inf     0.916     1.077
## 
## Results are averaged over the levels of: density 
## Degrees-of-freedom method: asymptotic 
## Confidence level used: 0.95 
## Intervals are back-transformed from the log scale

A more direct approach for plotting the interaction is via afex_plot. For a plot that is not too busy it makes sense to specify across which grouping factor the individual level data should be aggregated. We use the participant variable "id" here. We also use ggbeeswarm::geom_quasirandom as the geom for the data in the background following the example in the afex_plot vignette.

afex_plot(m9s, "frequency", "stimulus", "task", id = "id",
          data_geom = ggbeeswarm::geom_quasirandom, 
          data_arg = list(
            dodge.width = 0.5,  ## needs to be same as dodge
            cex = 0.8,
            color = "darkgrey"))

task:stimulus:density:frequency Interaction

As the last example, let us take a look at the significant four-way interaction of task:stimulus:density:frequency, \(F(1, 578.77) = 11.72\), \(p < .001\). Here we might be interested in a slightly more difficult question namely whether the density:frequency interaction varies across task:stimulus conditions. If we again look at the figures above, it appears that there is a difference between low:low and high:low in the nonword and lexdec condition, but not in the other conditions.

Looking at the 2-way interaction of density:frequency by the task:stimulus interaction can be done using emmeans using the joint_test function. We simply need to specify the appropriate by variables and get conditional tests this way.

joint_tests(m9s, by = c("stimulus", "task"))
## stimulus = word, task = naming:
##  model term        df1 df2 F.ratio p.value
##  density             1 Inf   1.292 0.2556 
##  frequency           1 Inf  15.530 0.0001 
##  density:frequency   1 Inf   0.196 0.6578 
## 
## stimulus = nonword, task = naming:
##  model term        df1 df2 F.ratio p.value
##  density             1 Inf  17.926 <.0001 
##  frequency           1 Inf 191.069 <.0001 
##  density:frequency   1 Inf   3.656 0.0559 
## 
## stimulus = word, task = lexdec:
##  model term        df1 df2 F.ratio p.value
##  density             1 Inf   0.359 0.5491 
##  frequency           1 Inf  14.494 0.0001 
##  density:frequency   1 Inf   1.669 0.1964 
## 
## stimulus = nonword, task = lexdec:
##  model term        df1 df2 F.ratio p.value
##  density             1 Inf  15.837 0.0001 
##  frequency           1 Inf  43.811 <.0001 
##  density:frequency   1 Inf  14.806 0.0001

This test indeed shows that the density:frequency interaction is only significant in the nonword and lexdec condition. Next, let’s see if we can unpack this interaction in a meaningful manner. For this we compare low:low and high:low in each of the four groups. And just for the sake of making the example more complex, we also compare low:high and high:high.

To do so, we first need to setup a new set of EMMs. Specifically, we get the EMMs of the two variables of interest, density and frequency, using the same by specification as the joint_test call. We can then setup custom contrasts that tests our hypotheses.

emm_i2 <- emmeans(m2s, c("density", "frequency"), by = c("stimulus", "task"))
emm_i2
## stimulus = word, task = naming:
##  density frequency   emmean     SE  df asymp.LCL asymp.UCL
##  low     low       -0.31384 0.0448 Inf   -0.4016  -0.22613
##  high    low       -0.33268 0.0408 Inf   -0.4126  -0.25276
##  low     high      -0.37741 0.0466 Inf   -0.4687  -0.28611
##  high    high      -0.38644 0.0472 Inf   -0.4789  -0.29399
## 
## stimulus = nonword, task = naming:
##  density frequency   emmean     SE  df asymp.LCL asymp.UCL
##  low     low       -0.10399 0.0499 Inf   -0.2019  -0.00611
##  high    low       -0.18230 0.0441 Inf   -0.2688  -0.09580
##  low     high       0.07823 0.0519 Inf   -0.0236   0.18004
##  high    high       0.04902 0.0494 Inf   -0.0478   0.14588
## 
## stimulus = word, task = lexdec:
##  density frequency   emmean     SE  df asymp.LCL asymp.UCL
##  low     low        0.03713 0.0403 Inf   -0.0419   0.11617
##  high    low        0.00933 0.0368 Inf   -0.0627   0.08138
##  low     high      -0.04512 0.0419 Inf   -0.1272   0.03696
##  high    high      -0.03479 0.0424 Inf   -0.1179   0.04828
## 
## stimulus = nonword, task = lexdec:
##  density frequency   emmean     SE  df asymp.LCL asymp.UCL
##  low     low        0.04480 0.0449 Inf   -0.0432   0.13278
##  high    low        0.16331 0.0398 Inf    0.0852   0.24140
##  low     high      -0.00729 0.0466 Inf   -0.0987   0.08411
##  high    high      -0.00564 0.0444 Inf   -0.0927   0.08140
## 
## Degrees-of-freedom method: asymptotic 
## Confidence level used: 0.95

These contrasts can be specified via a list of custom contrasts on the EMMs (or reference grid in emmeans parlance) which can be passed to the contrast function. The contrasts are a list where each element should sum to one (i.e., be a proper contrast) and be of length equal to the number of EMMs (although we have 16 EMMs in total, we only need to specify it for a length of four due to conditioning by c("stimulus", "task")).

To control for the family wise error rate across all tests, we again use update(..., by = NULL) on the result to revert the effect of the conditioning.

# desired contrats:
des_c <- list(
  ll_hl = c(1, -1, 0, 0),
  lh_hh = c(0, 0, 1, -1)
  )
update(contrast(emm_i2, des_c), by = NULL, adjust = "holm")
##  contrast stimulus task   estimate     SE  df z.ratio p.value
##  ll_hl    word     naming  0.01884 0.0210 Inf  0.895  1.0000 
##  lh_hh    word     naming  0.00904 0.0212 Inf  0.426  1.0000 
##  ll_hl    nonword  naming  0.07831 0.0222 Inf  3.525  0.0030 
##  lh_hh    nonword  naming  0.02921 0.0210 Inf  1.391  0.9847 
##  ll_hl    word     lexdec  0.02780 0.0200 Inf  1.391  0.9847 
##  lh_hh    word     lexdec -0.01033 0.0199 Inf -0.520  1.0000 
##  ll_hl    nonword  lexdec -0.11850 0.0211 Inf -5.628  <.0001 
##  lh_hh    nonword  lexdec -0.00165 0.0197 Inf -0.084  1.0000 
## 
## Degrees-of-freedom method: asymptotic 
## P value adjustment: holm method for 8 tests

In contrast to our expectation, the results show two significant effects and not only one. In line with our expectations, in the nonword and lexdec condition the EMM of low:low is smaller than the EMM for high:low, \(z = -5.63\), \(p < .0001\). However, in the nonword and naming condition we found the opposite pattern; the EMM of low:low is larger than the EMM for high:low, \(z = 3.53\), \(p = .003\). For all other effects \(|z| < 1.4\), \(p > .98\). In addition, there is no difference between low:high and high:high in any condition.

References

  • Barr, D. J., Levy, R., Scheepers, C., & Tily, H. J. (2013). Random effects structure for confirmatory hypothesis testing: Keep it maximal. Journal of Memory and Language, 68(3), 255-278. https://doi.org/10.1016/j.jml.2012.11.001
  • Bretz, F., Hothorn, T., & Westfall, P. H. (2011). Multiple comparisons using R. Boca Raton, FL: CRC Press. https://CRAN.R-project.org/package=multcomp
  • Freeman, E., Heathcote, A., Chalmers, K., & Hockley, W. (2010). Item effects in recognition memory for words. Journal of Memory and Language, 62(1), 1-18. https://doi.org/10.1016/j.jml.2009.09.004
  • Lenth, R. (2017). emmeans: Estimated Marginal Means, aka Least-Squares Means. R package version 0.9.1. https://CRAN.R-project.org/package=emmeans
  • Maxwell, S. E., & Delaney, H. D. (2004). Designing experiments and analyzing data: a model-comparisons perspective. Mahwah, N.J.: Lawrence Erlbaum Associates.
afex/inst/doc/afex_analysing_accuracy_data.Rmd0000644000176200001440000012407414076011252021224 0ustar liggesusers--- title: "Analysis of Accuracy Data using ANOVA and binomial GLMMs" author: "Henrik Singmann" date: "`r Sys.Date()`" show_toc: true output: knitr:::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Analysis of Accuracy Data using ANOVA and binomial GLMMs} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r echo=FALSE} req_suggested_packages <- c("emmeans", "dplyr", "ggplot2", "cowplot", "ggbeeswarm") pcheck <- lapply(req_suggested_packages, requireNamespace, quietly = TRUE) if (any(!unlist(pcheck))) { message("Required package(s) for this vignette are not available/installed and code will not be executed.") knitr::opts_chunk$set(eval = FALSE) } ``` ```{r, include = FALSE} op <- options(width = 90, dplyr.summarise.inform = FALSE) knitr::opts_chunk$set( collapse = TRUE ) ``` # Overview This vignette shows how accuracy data can be analysed with `afex` using either ANOVA or a binomial generalized linear mixed model (i.e., a mixed model that uses the appropriate distributional family for such data). Accuracy data means data where each observation can be categorized as either a 0, which indicates failure, miss, or an erroneous response, or 1 which indicates success or a correct response. We begin by loading the packages needed here and set a somewhat nicer `ggplot2` theme. ```{r setup, message=FALSE, results='hide', warning=FALSE} library("afex") library("emmeans") library("dplyr") library("ggplot2") theme_set(theme_bw(base_size = 15) + theme(legend.position="bottom", panel.grid.major.x = element_blank())) library("cowplot") library("ggbeeswarm") ``` # Data and Research Question The data we are looking at is from [Lin and colleagues (2020)](https://doi.org/10.1177/0956797620904990) and investigates ego depletion using a novel paradigm. Ego depletion is a (social) psychological concept originating from Roy Baumeister's work which can be summed up by the phrase 'self-control/willpower is a muscle': An initial use of self-control, such as performing a demanding task or resisting a temptation, depletes the available self-control resources so that subsequent tasks only have limited self-control resources available. The paper introducing the concept was published in 1998 (references can be found on [Wikipedia](https://en.wikipedia.org/wiki/Ego_depletion)). The ego depletion concept was extremely popular until the height of the replication crisis in psychology in which researcher also struggled to replicate the key ego depletion phenomenon just outlined. Recently, Lin and colleagues developed a new paradigm for investigation ego depletion. Their primary interest was on analyzing the data using a diffusion model, which will not be of interest here. [Lin and colleagues (2020)](https://doi.org/10.1177/0956797620904990) task followed the usual approach for ego depletion tasks. In a first phase, participants either worked on a high-demand task or a low-demand task (variable `condition`). Then, participants had to work on a Stroop task. The Stroop task consist of colour words (i.e., "red", "blue", or "yellow") displayed in a colour (i.e., red, blue, or yellow). In each trial, one of the three words is displayed in one of the three colours (e.g., the word "red" could be displayed in red or blue). The task of the participants is to press a button corresponding to the three colours the word is displayed in (i.e., participants have to ignore the meaning of the word but focus on the colour the letters have). The Stroop effect is the finding that it is easier to select the correct colour in a congruent trial in which the meaning of the word and the colour the word is displayed in match (e.g., the word "red" in red). In contrast, people are slower and make more errors in an incongruent trial in which there is a mismatch between word meaning and word colour (e.g., the word "red" in blue). In other words, it is difficult for people to ignore the meaning of a word when having to decide which colour the word is displayed in. The variable determining match between word meaning and world colour is `congruency`. The hypothesis of the ego depletion concept is that it moderates or interacts with the congruency effect (i.e., difference in performance between congruent and incongruent trials). In particular, the congruency effect is smaller if participants are ego depleted compared to when they are not. We analyse this Stroop data in the following. One of the new features of Lin et al.'s (2020) study compared to earlier ego-depletion studies is that both variables, `condition` and `congruency`, vary within-subjects. That is, each participants once performed a high-demand task followed by the Stroop task and then also a low-demand task followed by a Stroop task. This was usually done on two different days with a week time in between in counterbalanced order. We then load the data, called `stroop`, which comes with `afex`. For simplicity we only focus on the data from Lin et al.'s (2020) Experiment 1 (the data of all their 4 studies is part of `stroop`). We focus on the accuracy of participants which is coded as either 0 (error) or 1 (correct response) in column `acc`. We also remove all `NA`s in the response variable and drop unused factor levels. This streamlines a few of the calls later on. ```{r} data("stroop") ## extract data from experiment 1 and remove NAs stroop_e1 <- stroop %>% filter(!is.na(acc)) %>% filter(study == "1") %>% droplevels() ``` A look at the resulting `data.frame` reveals that we have trial-wise data. That is, each observation (i.e., row) is one response to a Stroop trial. The data is not yet aggregated so that each participant has one observation per design cell (i.e., denoting the average accuracy for each participant in this cell). We also see we still have quite a bit of data left, from 253 participants. ```{r} head(stroop_e1) str(stroop_e1) ``` # ANOVA Analysis We begin with an analysis of the data using standard repeated-measures ANOVA. ANOVA is probably the most common approach to analyse such data in psychology, but its use is somewhat questionable. The reason is that ANOVA assumes that response variable is normally distributed (or more precisely, the conditional distribution of the data after taking the model into account, i.e., the residuals, are assumed to follow a normal distribution). Here, our data are only 0s and 1s which do not follow a normal but rather a binomial or Bernoulli distribution. Nevertheless, analysis of such data using models assuming normal distribution such as ANOVA is not uncommon and in many cases leads to the same conclusions than the more complicated model discussed below. However, as we will see below, the results can also change. We set up the model using `aov_ez` and specify both factors, `congruency` and `condition`, correctly as `within` factors. ```{r} e1_anova <- aov_ez( id = "pno", dv = "acc", data = stroop_e1, within = c("congruency", "condition") ) ``` Fitting this model produces a warning message telling us what we already know. There is more than one observation per participant and cell of the design (i.e., combination of our two factors) and the data is averaged before calculating the ANOVA. Note that if we would not have removed the `NA`s from the data, this call would have failed with an error as all participants have `NA`s so all would have been removed. In that case, we could have added `na.rm = TRUE` to the `aov_ez()` call to ignore the NAs when aggregating the data. If we take a look at the ANOVA table, we see a clear main effect of congruency, a somewhat weaker main effect of condition, but no interaction. ```{r} e1_anova ``` The observed pattern of effects is in line with most recent failures to replicate ego depletion. The main effect of `condition` suggests there be some general effect, such as more errors after a demanding task, but not the predicted interaction of condition with the congruency effect. The original prediction of ego-depletion is that it reduces self-control, thus resulting in attenuated Stroop effects after depletion. This pattern would result in a significant interaction. We can look at the effects in turn using `emmeans`. We begin by looking at the Stroop effect, that is the effect of `congruency`. ```{r} emmeans(e1_anova, "congruency") ``` We can see the usual Stroop effect. Accuracy is higher for congruent compared to incongruent items. We also look at the effect of condition. ```{r} emmeans(e1_anova, "condition") ``` We see that accuracy is roughly 1% lower in the ego-depletion compared to the control condition. We can also plot both effects. ```{r, fig.width=6, fig.height=3} plot_grid( afex_plot(e1_anova, "congruency", error = "within", data_geom = geom_quasirandom, data_alpha = 0.3) + coord_cartesian(ylim = c(0.25, 1)), afex_plot(e1_anova, "condition", error = "within", data_geom = geom_quasirandom, data_alpha = 0.3) + coord_cartesian(ylim = c(0.25, 1)) ) ``` # Mixed Model Analysis ```{r, echo=FALSE} load(system.file("extdata/", "outputs_glmm_vignette.rda", package = "afex")) ``` A model with a more appropriate conditional distribution (instead of the normal distribution used by ANOVA) are generalized linear models with a binomial family. Because we have repeated measures both within participants within each design cell and across cells (i.e., we have within-subject factors) we need to use a mixed model. Thus, we have to employ a generalized linear mixed model (GLMM) with a binomial family. Here, we use the canonical link function, the logit (an alternative would be probit). In our call to `mixed` we indicate the fact that we want to estimate a binomial GLMM (in contrast to a regular LMM) by passing the correct family, `family = binomial`. We could further specify the link function (e.g., `family = binomial(link = "probit")`), but because we use the canonical link here, this is not necessary. As for all mixed models, we should begin our analysis with the "maximal random effect structure justified by the design" (Barr et al., 2013), the *maximal model.* Because all factors vary within-subjects in the present case and we only consider one random-effects grouping factor (participant), the maximum random effect structure involves by-participant random intercepts as well as by-participant random slopes for factors congruency, condition, and their interaction, as well as the correlation among the random effect parameters. If you need an introduction to the topic of the random effect structure, consider reading our introduction to mixed models ([Singmann & Kellen, 2019](http://singmann.org/download/publications/singmann_kellen-introduction-mixed-models.pdf)). A worked example of how to reduce the maximal model in case of converging warnings is provided in the [mixed model vignette](afex_mixed_example.html). Another important decision when fitting a mixed model with `afex::mixed` is the choice of the `method` for testing model terms. The default `method` is the Kenward-Roger approximation. However, this is not possible for GLMMs (i.e., it only applies to LMMs). For GLMMs we only have two methods available, likelihood ratio tests (`method = "LRT"`) and parametric bootstrap (`method = "PB"`). Parametric bootstrap is generally the preferable procedure, especially in settings with small N, specifically low numbers of levels for the random effects grouping factor (i.e., few participants in the present case). However, parametric bootstrap can be prohibitively time consuming as it requires refitting the model several times (suggested is at last a 1000 times per model term/effect). The main factor influencing the time is therefore the complexity of the random effect structure. Even with only a moderately complex structure, such as in the present case, it can take days (even though computations can be distributed on a multi-core machine as shown below). One rule of thumb (for which I have never seen any actual data) is that with more than around 50 levels for each random effects grouping factor, likelihood ratio tests are probably okay and parametric bootstrap not necessary. Luckily, in the present case we have over 250 participants (i.e., way more than 50), so we decide to use likelihood ratio tests as a method for testing model terms (i.e., `method = "LRT"`). ## Setting-Up and Fitting the Models There are two ways on how to set up such models in `afex::mixed` (`lme4` provides another third variant that is not possible in `afex::mixed`). Before describing both ways, the somewhat surprising fact is that the second way, based on the aggregated data, is considerably faster than the first way. In the present case the first way takes more than an hour on my laptop whereas the second way takes only around one minute! To understand the two different ways, it might help to recall some basics about the [binomial distribution](https://en.wikipedia.org/wiki/Binomial_distribution). It is defined by the number of observations and the number of successes and has one parameter, the success probability. Because we want to estimate the parameter of the binomial distribution, the success probability, we have to pass two pieces of information to the `mixed` function; the number of successes and the total number of trials. The easiest way to do so with the current data is by directly passing the accuracy column `acc`. It only consists of zeros and ones so the total number of observations is the number of trials, and the number of ones is the number of successes. The following code sets up the maximal model as discussed above using this approach. Note that fitting this model takes more than an hour (likely several hours). ```{r, eval=FALSE, warning=FALSE} e1_mixed1_v1 <- mixed( acc ~ congruency*condition + (congruency*condition|pno), data = stroop_e1, method = "LRT", family = binomial ) ``` Before looking at the results, let us first discuss the alternative way of specifying the model. Note that the second way is usually considerably faster. This way consists of two steps. We first need to aggregate the data within each cell of the design and participant by calculating the proportion of correct responses and the number of trials for each cell. Then we can pass these two pieces of information to `mixed`, the proportion of successes as the dependent variable and the total number of successes as a `weight`. These two pieces of information again provide all information required for the binomial distribution. However, note that it is important that proportion times the weight provide an integer number, the actual number of successes which cannot have a decimal part. At first, we need to aggregate the data. For this, we can use the following `dplyr` syntax. ```{r} stroop_e1_agg <- stroop_e1 %>% group_by(condition, congruency, pno) %>% summarise(acc = mean(acc), n = n()) ``` Then, we can set up the model. Note that we need to pass the total number of trials as the `weight` argument here. `mixed` now supports the exact same syntax as `glmer` so we can pass simply the unquoted name of the column holding the weights, `weight = n`. The call to `mixed` is then pretty much the same as above, the only differences are that we have to use the `data.frame` with the aggregated data, potentially a new name of response variable (here I decided to use the same name, `acc` for the aggregated accuracy), and the `weight` argument. ```{r, eval = FALSE} e1_mixed1_v2 <- mixed( acc ~ congruency*condition + (congruency*condition|pno), data = stroop_e1_agg, method = "LRT", family = binomial, weight = n ) ``` ## Dealing with Fit Warnings Before looking at the results, we see that fitting produces quite a few warnings. These are reproduced below in the way we would also get them when simply typing in the object name (e.g., `e1_mixed1_v2`). The following are the warnings for the first variant, `e1_mixed1_v1`. ```{r, echo=FALSE} xxx <- lapply(outp_e1_mixed1_v1$warnings, function(x) warning(x, call. = FALSE)) ``` And these are the warnings for the second variant, `e1_mixed1_v2`. ```{r, echo=FALSE} xxx <- lapply(outp_e1_mixed1_v2$warnings, function(x) warning(x, call. = FALSE)) ``` Both variants show quite a few warnings. The warnings are given separately for the different models estimated (i.e., full model with all terms and one model for each term removed from the full model). However, none of the warnings is the dreaded "singular fit" warning that clearly suggests an over-parameterised model. We therefore will be working with this random effect structure going forward. Here, we have two different warnings suggesting some numerical issue at the maximum likelihood estimate. One warning tells us that for the result returned from the fitting (i.e., optimization) algorithm the absolute gradient of the deviance function is not small (i.e., there might be a better global optimum that was not discovered). Another warning relates to the size of the eigenvalue which suggests something similar, there might be better solutions in the parameter space. More on these warnings can be found in the `lme4` help at `?troubleshooting` (or `help("troubleshooting", package = "lme4")`). Given that both types of warnings are not too dramatic, one way to address them is by trying different optimizers. `mixed` makes this easy via the `all_fit` argument, if `TRUE` several optimizers are applied to the output from the regular run (make sure to install packages `optimx` and `dfoptim` to use all possible available optimizers). ```{r, eval = FALSE} e1_mixed1_v2_allfit <- mixed( acc ~ congruency*condition + (congruency*condition|pno), data = stroop_e1_agg, method = "LRT", family = binomial, weight = n, all_fit = TRUE ) ``` ```{r, echo=FALSE} xxx <- lapply(outp_e1_mixed1_v2_allfit$warnings, function(x) warning(x, call. = FALSE)) ``` Somewhat surprisingly the fit using all optimizers produces more convergence warnings than the previous fit. However, all warnings are of the same type as for the other variants. Another way to deal with the warnings is by fitting a variant of the model with reduced random effect structure. Hopefully this model will not produce the warning, but similar results. If warnings are more severe than the current warning, fitting a reduced model is surely indicated. Critical warnings that make it necessary to reduce the model are for example a singular fit warning or a warning that the algorithm did not converge within the allowed number of iterations. Nevertheless, if this were a real data analysis for a manuscript it would probably still make sense to reduce the random effect structure, beginning with the correlation among the random effect parameters, until the warnings are gone. Then, we would compare the final (i.e., reduced) model with the maximal model to ensure that the pattern of significant and non-significant effects is the same in both cases (if not, this needs to be reported transparently). An example of such an iterative reduction of the random effect structure is given in the [mixed model vignette](afex_mixed_example.html). ## ANOVA Table for GLMMs We can now print the model to get the resulting ANOVA table, that is the table of model terms (i.e., main effects and interactions), as for the regular ANOVA model. Doing so would normally also reproduces the warnings shown above but is suppressed here. We show the results of the three variants in turn. ```{r, eval=FALSE} e1_mixed1_v1 ## variant 1 ``` ```{r, echo=FALSE} cat(outp_e1_mixed1_v1$output, sep = "\n") ``` ```{r, eval=FALSE} e1_mixed1_v2 ## variant 2 ``` ```{r, echo=FALSE} cat(outp_e1_mixed1_v2$output, sep = "\n") ``` ```{r, eval=FALSE} e1_mixed1_v2_allfit ## variant 2 with all_fit = TRUE ``` ```{r, echo=FALSE} cat(outp_e1_mixed1_v2_allfit$output, sep = "\n") ``` As can be seen, the results of the three different variants are extremely similar. Especially the fact that the results from variant 2 and the variant with `all_fit = TRUE` are pretty much the same suggests that we can have some confidence in the results. As for the ANOVA we see significant main effects of congruency and condition. However, we also see a significant congruency by condition interaction. As a reminder, this interaction is the precondition of the central ego depletion prediction. ## Follow-Up Analysis and Plots Let us first look at the main effects as for the ANOVA model. For this, we will always use the model with `all_fit = TRUE`, `e1_mixed1_v2_allfit`. For easier interpretability, we also always set `type = "response"` in the call to `emmeans`. This provides estimated marginal means on the response scale (i.e., in probability units after applying the inverse link function). In case of the default (i.e., `type = "link"`) marginal mean are given on the linear scale which in this case is the logit scale. ```{r, eval=FALSE} emmeans(e1_mixed1_v2_allfit, "congruency", type = "response") ``` ```{r, echo=FALSE} message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_2a_cong_out$output, sep = "\n") ``` We again see the Stroop effect. Accuracy is higher for congruent compared to incongruent items. We also look at the effect of condition. ```{r, eval=FALSE} emmeans(e1_mixed1_v2_allfit, "condition", type = "response") ``` ```{r, echo=FALSE} message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_2a_cond_out$output, sep = "\n") ``` We see that accuracy is roughly 1% lower in the ego-depletion compared to the control condition. We can also plot both effects as above. We essentially only have to replace the model name in the calls to `afex_plot`. However, we also remove the `error = "within"` to show model-based error bars. ```{r, eval=FALSE} plot_grid( afex_plot(e1_mixed1_v2_allfit, "congruency", data_geom = geom_quasirandom, data_alpha = 0.3) + coord_cartesian(ylim = c(0.25, 1)), afex_plot(e1_mixed1_v2_allfit, "condition", data_geom = geom_quasirandom, data_alpha = 0.3) + coord_cartesian(ylim = c(0.25, 1)) ) ``` ```{r, echo=FALSE, fig.width=6, fig.height=3} message("Aggregating data over: pno") message("NOTE: Results may be misleading due to involvement in interactions") message("Aggregating data over: pno") message("NOTE: Results may be misleading due to involvement in interactions") plot_grid(pp2a_main_a, pp2a_main_b) ``` Finally, we can also have a look at the interaction. One way to do so is by looking at the reference grid of the two variables. ```{r, eval=FALSE} emmeans(e1_mixed1_v2_allfit, c("congruency", "condition"), type = "response") ``` ```{r, echo=FALSE} cat(emm_2a_inter1_out$output, sep = "\n") ``` Alternatively, we can look at the effect of `congruency` conditional on `condition`. As will be shown below, this has some benefits. And because we will use this `emmeans` object later, we assign it to `emm_inter_1`. ```{r, eval=FALSE} emm_inter_1 <- emmeans(e1_mixed1_v2_allfit, "congruency", by = "condition", type = "response") emm_inter_1 ``` ```{r, echo=FALSE} cat(emm_2a_inter2_out$output, sep = "\n") ``` With this object, it is now particularly easy to see if there are indeed differences in the Stroop effects across conditions. We can simply use the `pairs` function which will only calculate pairwise comparisons for each level of the `by` factor `conditions. Because of the significant interaction this shows that there is evidence for a reduced Stroop effect in the deplete condition. The odds ratio are around 5 in the deplete condition and over 6 in the control condition. ```{r, eval=FALSE} pairs(emm_inter_1) ``` ```{r, echo=FALSE} cat(emm_2a_pairs$output, sep = "\n") ``` We can of course also plot the interaction. We use violin plots for the data to make this plot somewhat appealing. ```{r, eval=FALSE} afex_plot(e1_mixed1_v2_allfit, "condition", "congruency", data_geom = geom_violin) ``` ```{r, echo=FALSE, fig.width=4.5, fig.height=3.5} message("Aggregating data over: pno") pp2a_inter ``` For reference, we can also make the plot based on the model using variant 1 (i.e., based on trial-wise non-aggregated data) which produces the same figure. ```{r, eval=FALSE} afex_plot(e1_mixed1_v1, "condition", "congruency", data_geom = geom_violin) ``` ```{r, echo=FALSE, fig.width=4.5, fig.height=3.5} message("Aggregating data over: pno") pp2a_inter_v1 ``` ```{r, eval=FALSE, include=FALSE} save(e1_mixed1_v1, e1_mixed1_v2, e1_mixed1_v2_allfit, e12_mixed1_t2, e12_mixed1, e12_mixed1_t2_red, file = "development/stroop_mixed.rda", compress = "xz") ## load("development/stroop_mixed.rda") ``` ```{r, eval=FALSE, include=FALSE} stroop_e1_agg <- stroop_e1 %>% group_by(condition, congruency, pno) %>% summarise(acc = mean(acc), n = n()) capture_call <- function(call) { warnings <- testthat::capture_warnings(eval(substitute(call))) output <- suppressWarnings(capture.output(eval(substitute(call)))) messages <- testthat::capture_messages(substitute(call)) list( output = output, warnings = warnings, messages = messages ) } outp_e1_mixed1_v1 <- capture_call(print(e1_mixed1_v1)) outp_e1_mixed1_v2 <- capture_call(print(e1_mixed1_v2)) outp_e1_mixed1_v2_allfit <- capture_call(print(e1_mixed1_v2_allfit)) emm_2a_cong <- emmeans(e1_mixed1_v2_allfit, "congruency", type = "response") emm_2a_cond <- emmeans(e1_mixed1_v2_allfit, "condition", type = "response") emm_2a_inter1 <- emmeans(e1_mixed1_v2_allfit, c("congruency", "condition"), type = "response") emm_2a_inter2 <- emmeans(e1_mixed1_v2_allfit, "congruency", by = "condition", type = "response") emm_2a_inter1_out <- capture_call(print(emm_2a_inter1)) emm_2a_inter2_out <- capture_call(print(emm_2a_inter2)) emm_2a_cong_out <- capture_call(print(emm_2a_cong)) emm_2a_cond_out <- capture_call(print(emm_2a_cond)) emm_inter_1 <- emmeans(e1_mixed1_v2_allfit, "congruency", by = "condition", type = "response") emm_2a_pairs <- capture_call(print(pairs(emm_inter_1))) # pp2a_main <- plot_grid( # afex_plot(e1_mixed1_v2_allfit, "congruency", error = "within", # data_geom = geom_quasirandom, data_alpha = 0.3) + # coord_cartesian(ylim = c(0.25, 1)), # afex_plot(e1_mixed1_v2_allfit, "condition", error = "within", # data_geom = geom_quasirandom, data_alpha = 0.3) + # coord_cartesian(ylim = c(0.25, 1)) # ) pp2a_main_a <- afex_plot(e1_mixed1_v2_allfit, "congruency", error = "within", data_geom = geom_quasirandom, data_alpha = 0.3) + coord_cartesian(ylim = c(0.25, 1)) pp2a_main_b <- afex_plot(e1_mixed1_v2_allfit, "condition", error = "within", data_geom = geom_quasirandom, data_alpha = 0.3) + coord_cartesian(ylim = c(0.25, 1)) pp2a_inter <- afex_plot(e1_mixed1_v2_allfit, "condition", "congruency", data_geom = geom_violin) pp2a_inter_v1 <- afex_plot(e1_mixed1_v1, "condition", "congruency", data_geom = geom_violin) ### experiments 1 and 2 outp_e12_mixed1 <- capture_call(print(e12_mixed1)) outp_e12_mixed1_t2 <- capture_call(print(e12_mixed1_t2)) outp_e12_mixed1_t2_red <- capture_call(print(e12_mixed1_t2_red)) emm_e12_inter_out <- capture_call(print(emmeans(e12_mixed1, c("congruency", "condition"), type = "response"))) emm_e12_t2_inter_out <- capture_call(print(emmeans(e12_mixed1_t2, c("congruency", "condition"), type = "response"))) emm_e12_t2_red_inter_out <- capture_call(print(emmeans(e12_mixed1_t2_red, c("congruency", "condition"), type = "response"))) emm_e12_t2_red_pairs_out <- capture_call(print(pairs( emmeans(e12_mixed1_t2_red, "congruency", by = "condition", type = "response")))) emm_e12_t2_pairs_out <- capture_call(print(pairs( emmeans(e12_mixed1_t2, "congruency", by = "condition", type = "response")))) emm_e12_t2_pairs_p_out <- capture_call(print(pairs(emmeans(e12_mixed1_t2, "congruency", by = "condition", type = "response", submodel = "minimal")))) pp_e12_inter_t3 <- afex_plot(e12_mixed1, "condition", "congruency", data_geom = geom_violin) pp_e12_inter_t2 <- afex_plot(e12_mixed1_t2, "condition", "congruency", data_geom = geom_violin) pp_e12_inter_t2_red <- afex_plot(e12_mixed1_t2_red, "condition", "congruency", data_geom = geom_violin) save(outp_e1_mixed1_v1, outp_e1_mixed1_v2, outp_e1_mixed1_v2_allfit, emm_2a_cong_out, emm_2a_cond_out, pp2a_main_a, pp2a_main_b, emm_2a_inter1_out, emm_2a_inter2_out, emm_2a_pairs, pp2a_inter, pp2a_inter_v1, outp_e12_mixed1, outp_e12_mixed1_t2, outp_e12_mixed1_t2_red, emm_e12_inter_out, emm_e12_t2_inter_out, emm_e12_t2_red_inter_out, emm_e12_t2_red_pairs_out, emm_e12_t2_pairs_out, emm_e12_t2_pairs_p_out, pp_e12_inter_t3, pp_e12_inter_t2, pp_e12_inter_t2_red, file = "inst/extdata/outputs_glmm_vignette.rda", compress = "xz") ``` # Analysis of Two Studies with GLMM The `stroop` data set contains all four experiments of Lin et al. (2020). So far we only looked at Experiment 1. Here, we want to look at Experiments 1 and 2 to show some additional functionality of analysing accuracy data with GLMMs. Let us begin by preparing the data. ```{r} ## extract data from experiment 1 and remove NAs stroop_e12 <- stroop %>% filter(!is.na(acc)) %>% filter(study %in% c("1", "2")) %>% droplevels() ``` We then have a look at the number of participants per experiment. As can be seen below, there is a clear imbalance with Experiment 1 having a lot more participants than Experiment 2. We will see below what we can do with this information. ```{r} stroop_e12 %>% group_by(study) %>% summarise(n = length(unique(pno))) ``` But first, we aggregate the data for analysing it using the second variant introduced above as it is dramatically faster. ```{r} stroop_e12_agg <- stroop_e12 %>% group_by(study, condition, congruency, pno) %>% summarise(acc = mean(acc), n = n()) ``` We are now ready to fit the model. However, because we now have to fit 8 models in total and we also have more data at hand, fitting will take quite a bit longer even when using the aggregated data. Especially, because based on our experience with the data from Experiment 1, it makes sense to set `all_fit = TRUE` here. ## Estimating Models in Parallel Therefore, it makes sense to reduce our fitting time by distributing the estimation across the available CPU cores using the `parallel` package support provided by `mixed`. Note that this simply distributes the different models across cores (i.e., each individual fit is still run on a single core). For this, we need to set up a cluster, `cl`, and then pass this cluster to `mixed`. ```{r, eval = FALSE} library("parallel") nc <- detectCores() # number of cores cl <- makeCluster(rep("localhost", nc)) # make cluster ``` We can then fit the model using the new data in a similar manner as above. The main changes are that we add `*study` to the fixed effects part of the model formula which estimates main effects and all interactions with `study`. We do not estimate any random slopes for `study` because participants are in only one study (i.e., study is a between-subjects factor). We also enable multi-core estimation by setting `cl = cl`. ```{r, eval = FALSE} e12_mixed1 <- mixed( acc ~ congruency*condition*study + (congruency*condition|pno), data = stroop_e12_agg, method = "LRT", family = binomial, weight = n, all_fit = TRUE, cl = cl ) ``` ## Type III versus Type II Sums of Squares The default `type` argument when using `mixed` (and the other `afex` functions) is `3` which estimates so-called type III sums of squares tests of model terms. There is a somewhat heated discussion on these topics in the literature which I do not want to rehash here (more can be found in [our chapter](http://singmann.org/download/publications/singmann_kellen-introduction-mixed-models.pdf)). In short, the distinction between Type III (default in `afex`) and Type II (recommended by some vocal statisticians) is about how to deal with imbalance (i.e., different group sizes). Type III sums of squares assume that the imbalance is random and estimates a model in which all groups are assumed to have equal sizes. In contrast, using Type II sums of squares the differences in group sizes are assumed to be meaningful (e.g., as a consequence of different group sizes in the environment) and the model is set-up such that the differences in group sizes are represented. Remember that the first experiment (study 1) had a lot more participants than the second experiment (study 2). However, the default Type III tests treat both studies as having the same sample size. In this case it might therefore make sense to also look at the results with Type II tests. For this, we simply need to add `type = 2` (or equivalently `type = "II"`) to the call as shown below. ```{r, eval = FALSE} e12_mixed1_t2 <- mixed( acc ~ congruency*condition*study + (congruency*condition|pno), data = stroop_e12_agg, method = "LRT", family = binomial, weight = n, all_fit = TRUE, cl = cl, type = 2 ) ``` Fitting both models shows a number of warnings similar to the previous model which we do not reproduce here. Let us instead take a look at the results. We begin with the Type III model. ```{r, eval=FALSE} e12_mixed1 ``` ```{r, echo=FALSE} cat(outp_e12_mixed1$output, sep = "\n") ``` The results are now more in line with the results from the ANOVA analysis. We only see significant main effects of congruency and condition, but no congruency by condition interaction. Furthermore, no effect involving study is significant. Let us now take a look at the Type II results. ```{r, eval=FALSE} e12_mixed1_t2 ``` ```{r, echo=FALSE} cat(outp_e12_mixed1_t2$output, sep = "\n") ``` These look quite similar with one difference. The congruency by condition interaction is still not significant, however, the p-value is below .1. Taken together the results somewhat suggest that the congruency by condition interaction is a pattern mainly found in (the larger) Experiment 1, but not in Experiment 2. In the Type III analysis in which both studies are weighed equally the interaction therefore does not reach significance. In contrast, in the Type II analysis in which the additional participants of Experiment 1 have a larger influence on the interaction, the p-value drops and is nearer the .05 cut-off. However, the difference in the interaction between the experiments is also not too large as the three way interaction of congruency by condition by study is clearly not significant (and as the highest order effect, this effect has to be the same for both types of sums of squares). ## Follow-Up Tests for Type II Models We can now of course also plot the data. Let us plot the congruency by condition interaction as before. We begin with the plot of the Type III model. ```{r, eval=FALSE} afex_plot(e12_mixed1, "condition", "congruency", data_geom = geom_violin) ``` ```{r, echo=FALSE, fig.width=4.5, fig.height=3.5} message("Aggregating data over: pno") message("NOTE: Results may be misleading due to involvement in interactions") pp_e12_inter_t3 ``` We then plot the interaction of the Type II model. ```{r, eval=FALSE} afex_plot(e12_mixed1_t2, "condition", "congruency", data_geom = geom_violin) ``` ```{r, echo=FALSE, fig.width=4.5, fig.height=3.5} message("Aggregating data over: pno") message("emmeans are based on full model which includes all effects.") message("NOTE: Results may be misleading due to involvement in interactions") pp_e12_inter_t2 ``` Both look pretty much the same and actually are the same. The reason for this is also given as a message when producing the second plot. When using `mixed` Type II models, all follow-up tests (which includes plotting via `afex_plot`) are based on the full model. However, Type II model tests are not all based on the full model. Rather, for tests of lower-order effects higher order effects are not part of the comparison (i.e., tests of two-way interactions such as the congruency by condition interaction are compared against a reference model that only includes all two-way interactions and not the three-way interaction). We can also see this when comparing the corresponding `emmeans` for both models: ```{r, eval=FALSE} emmeans(e12_mixed1, c("congruency", "condition"), type = "response") ``` ```{r, echo=FALSE} message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_e12_inter_out$output, sep = "\n") ``` ```{r, eval=FALSE} emmeans(e12_mixed1_t2, c("congruency", "condition"), type = "response") ``` ```{r, echo=FALSE} message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_e12_t2_inter_out$output, sep = "\n") ``` We again see that they are identical. Thus, the Type II outputs do not actually reflect Type II tests. A more appropriate way to look at this two-way interaction would be to use a model that reflects the Type II tests; that is, a model without the three-way interaction. A variant of this model is part of the `e12_mixed1_t2` object. However, because of the way `afex::mixed` creates the set of tests, this model is parameterized in a different way so we cannot pass it to `emmeans` for tests. Therefore, we have to refit the model without the three-way interaction. We do so by changing the fixed effects part of the formula to `(congruency+condition+study)^2` which means all main effects and up to two-way interactions. ```{r, eval = FALSE} e12_mixed1_t2_red <- mixed( acc ~ (congruency+condition+study)^2 + (congruency*condition|pno), data = stroop_e12_agg, method = "LRT", family = binomial, weight = n, all_fit = TRUE, cl = cl, type = 2 ) ``` ```{r, eval=FALSE} e12_mixed1_t2_red ``` ```{r, echo=FALSE} cat(outp_e12_mixed1_t2_red$output, sep = "\n") ``` We first have a look at the resulting ANOVA table (note, we suppress the warnings again here). As expected, the Type II tests are the same as in `e12_mixed1_t2`, because they are based on the exact same models. We then take a look at the marginal means for the two-way interaction of congruency by condition. ```{r, eval=FALSE} emmeans(e12_mixed1_t2_red, c("congruency", "condition"), type = "response") ``` ```{r, echo=FALSE} message("emmeans are based on full model which includes all effects.") cat(emm_e12_t2_red_inter_out$output, sep = "\n") ``` We can see these are now a bit different from the previous one, but not by a lot. A better way to see the difference is to use the same approach as above and look at the estimated Stroop effects for each condition. For the correct Type II model these are given by the following call: ```{r, eval=FALSE} emmeans(e12_mixed1_t2_red, "congruency", by = "condition", type = "response") %>% pairs() ``` ```{r, echo=FALSE} message("emmeans are based on full model which includes all effects.") cat(emm_e12_t2_red_pairs_out$output, sep = "\n") ``` For the wrong Type II model these are given below: ```{r, eval=FALSE} emmeans(e12_mixed1_t2, "congruency", by = "condition", type = "response") %>% pairs() ``` ```{r, echo=FALSE} message("emmeans are based on full model which includes all effects.") message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_e12_t2_pairs_out$output, sep = "\n") ``` We can see that as expected the magnitude of the difference between the Stroop effects is smaller in `e12_mixed1_t2` (5.73 vs. 5.13) than in `e12_mixed1_t2_red` (5.81 vs. 5.06). One way to approximate the latter behaviour without actually refitting the model is by passing `submodel = "minimal"` (which in the present case is identical to `submodel = ~congruency*condition`, see also [the corresponding `emmeans` vignette](https://cran.r-project.org/package=emmeans/vignettes/xplanations.html#submodels)). This does not produce exact Type II marginal means as when actually refitting the model. But at least approximates those. ```{r, eval=FALSE} emmeans(e12_mixed1_t2, "congruency", by = "condition", type = "response", submodel = "minimal") %>% pairs() ``` ```{r, echo=FALSE} message("emmeans are based on full model which includes all effects.") message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_e12_t2_pairs_p_out$output, sep = "\n") ``` Finally, we can also use this model to plot the two-way interaction. ```{r, eval=FALSE} afex_plot(e12_mixed1_t2_red, "condition", "congruency", data_geom = geom_violin) ``` ```{r, echo=FALSE, fig.width=4.5, fig.height=3.5} message("Aggregating data over: pno") message("emmeans are based on full model which includes all effects.") pp_e12_inter_t2_red ``` # References - Barr, D. J., Levy, R., Scheepers, C., & Tily, H. J. (2013). Random effects structure for confirmatory hypothesis testing: Keep it maximal. *Journal of Memory and Language*, 68(3), 255–278. https://doi.org/10.1016/j.jml.2012.11.001 - Lin, H., Saunders, B., Friese, M., Evans, N. J., & Inzlicht, M. (2020). Strong Effort Manipulations Reduce Response Caution: A Preregistered Reinvention of the Ego-Depletion Paradigm. *Psychological Science*. https://doi.org/10.1177/0956797620904990 - Singmann, H., & Kellen, D. (2019). An Introduction to Mixed Models for Experimental Psychology. In D. H. Spieler & E. Schumacher (Eds.), *New Methods in Cognitive Psychology* (pp. 4–31). Psychology Press. ```{r, include=FALSE} options(op) ``` afex/inst/doc/afex_mixed_example.R0000644000176200001440000002743014076067164016707 0ustar liggesusers## ----echo=FALSE--------------------------------------------------------------- req_suggested_packages <- c("emmeans", "multcomp", "dplyr", "tidyr","ggplot2") pcheck <- lapply(req_suggested_packages, requireNamespace, quietly = TRUE) if (any(!unlist(pcheck))) { message("Required package(s) for this vignette are not available/installed and code will not be executed.") knitr::opts_chunk$set(eval = FALSE) } ## ----set-options, echo=FALSE, cache=FALSE----------------------------------------------- op <- options(width = 90, dplyr.summarise.inform = FALSE) knitr::opts_chunk$set(dpi=72) ## ---- echo=FALSE------------------------------------------------------------------------ load(system.file("extdata/", "output_mixed_vignette.rda", package = "afex")) ## ----message=FALSE, warning=FALSE------------------------------------------------------- library("afex") # needed for mixed() and attaches lme4 automatically. library("emmeans") # emmeans is needed for follow-up tests library("multcomp") # for advanced control for multiple testing/Type 1 errors. library("dplyr") # for working with data frames library("tidyr") # for transforming data frames from wide to long and the other way round. library("ggplot2") # for plots theme_set(theme_bw(base_size = 15) + theme(legend.position="bottom", panel.grid.major.x = element_blank())) data("fhch2010") # load fhch <- droplevels(fhch2010[ fhch2010$correct,]) # remove errors str(fhch2010) # structure of the data ## --------------------------------------------------------------------------------------- ## are all participants in only one task? fhch %>% group_by(id) %>% summarise(task = n_distinct(task)) %>% as.data.frame() %>% {.$task == 1} %>% all() ## participants per condition: fhch %>% group_by(id) %>% summarise(task = first(task)) %>% ungroup() %>% group_by(task) %>% summarise(n = n()) ## number of different items per participant: fhch %>% group_by(id, stimulus) %>% summarise(items = n_distinct(item)) %>% ungroup() %>% group_by(stimulus) %>% summarise(min = min(items), max = max(items), mean = mean(items)) ## ---- fig.width=7, fig.height=4--------------------------------------------------------- fhch_long <- fhch %>% pivot_longer(cols = c(rt, log_rt), names_to = "rt_type", values_to = "rt") ggplot(fhch_long, aes(rt)) + geom_histogram(bins = 100) + facet_wrap(vars(rt_type), scales = "free_x") ## ---- fig.width=7, fig.height=6, message=FALSE, out.width="90%"------------------------- agg_p <- fhch %>% group_by(id, task, stimulus, density, frequency) %>% summarise(mean = mean(log_rt)) %>% ungroup() ggplot(agg_p, aes(x = interaction(density,frequency), y = mean)) + ggbeeswarm::geom_quasirandom(alpha = 0.5) + geom_boxplot(fill = "transparent") + stat_summary(colour = "red") + facet_grid(cols = vars(task), rows = vars(stimulus)) ## ---- fig.width=7, fig.height=6, message=FALSE, out.width="90%"------------------------- agg_i <- fhch %>% group_by(item, task, stimulus, density, frequency) %>% summarise(mean = mean(log_rt)) %>% ungroup() ggplot(agg_i, aes(x = interaction(density,frequency), y = mean)) + ggbeeswarm::geom_quasirandom(alpha = 0.3) + geom_boxplot(fill = "transparent") + stat_summary(colour = "red") + facet_grid(cols = vars(task), rows = vars(stimulus)) ## ---- eval = FALSE---------------------------------------------------------------------- # m1s <- mixed(log_rt ~ task*stimulus*density*frequency + # (stimulus*density*frequency|id)+ # (task|item), fhch, # control = lmerControl(optCtrl = list(maxfun = 1e6))) ## ---- echo=FALSE------------------------------------------------------------------------ message("boundary (singular) fit: see ?isSingular") ## ---- eval = FALSE---------------------------------------------------------------------- # m2s <- mixed(log_rt ~ task*stimulus*density*frequency + # (stimulus*density*frequency|id)+ # (task||item), fhch, # control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ## ---- echo=FALSE------------------------------------------------------------------------ message("boundary (singular) fit: see ?isSingular") ## ---- eval = FALSE---------------------------------------------------------------------- # m3s <- mixed(log_rt ~ task*stimulus*density*frequency + # (stimulus*density*frequency||id)+ # (task|item), fhch, # control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ## ---- echo=FALSE------------------------------------------------------------------------ message("boundary (singular) fit: see ?isSingular") ## ---- eval = FALSE---------------------------------------------------------------------- # m4s <- mixed(log_rt ~ task*stimulus*density*frequency + # (stimulus*density*frequency||id)+ # (task||item), fhch, # control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ## ---- echo=FALSE------------------------------------------------------------------------ message("boundary (singular) fit: see ?isSingular") ## ---- eval=FALSE------------------------------------------------------------------------ # summary(m4s)$varcor ## ---- echo=FALSE------------------------------------------------------------------------ cat(outp_m4s_vc$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # m5s <- mixed(log_rt ~ task*stimulus*density*frequency + # ((stimulus+density+frequency)^2||id)+ # (task||item), fhch, # control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ## ---- echo=FALSE------------------------------------------------------------------------ message("boundary (singular) fit: see ?isSingular") ## ---- eval=FALSE------------------------------------------------------------------------ # summary(m5s)$varcor ## ---- echo=FALSE------------------------------------------------------------------------ cat(outp_m5s_vc$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # m6s <- mixed(log_rt ~ task*stimulus*density*frequency + # (stimulus+density+frequency||id)+ # (task||item), fhch, # control = lmerControl(optCtrl = list(maxfun = 1e6)), # expand_re = TRUE) ## ---- echo=FALSE------------------------------------------------------------------------ message("boundary (singular) fit: see ?isSingular") ## ---- eval=FALSE------------------------------------------------------------------------ # summary(m6s)$varcor ## ---- echo=FALSE------------------------------------------------------------------------ cat(outp_m6s_vc$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # m7s <- mixed(log_rt ~ task*stimulus*density*frequency + # (stimulus+frequency||id)+ # (task||item), fhch, # control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ## ---- eval=FALSE------------------------------------------------------------------------ # m8s <- mixed(log_rt ~ task*stimulus*density*frequency + # (stimulus+frequency|id)+ # (task||item), fhch, # control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ## ---- echo=FALSE------------------------------------------------------------------------ warning(fit_m8s$warnings, call. = FALSE) ## ---- eval=FALSE------------------------------------------------------------------------ # m9s <- mixed(log_rt ~ task*stimulus*density*frequency + # (stimulus+frequency||id)+ # (task|item), fhch, # control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ## ---- eval=FALSE------------------------------------------------------------------------ # left_join(nice(m1s), nice(m9s), by = "Effect", # suffix = c("_full", "_final")) ## ---- echo=FALSE------------------------------------------------------------------------ cat(outp_comb_anova$output, sep = "\n") ## ---- eval = FALSE---------------------------------------------------------------------- # m9lrt <- mixed(log_rt ~ task*stimulus*density*frequency + # (stimulus+frequency||id)+ # (task|item), fhch, method = "LRT", # control = lmerControl(optCtrl = list(maxfun = 1e6)), # expand_re = TRUE) # m9lrt ## ---- echo=FALSE------------------------------------------------------------------------ cat(outp_m9lrt$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # emm_options(lmer.df = "asymptotic") # also possible: 'satterthwaite', 'kenward-roger' # emm_i1 <- emmeans(m9s, "frequency", by = c("stimulus", "task")) # emm_i1 ## ---- echo=FALSE------------------------------------------------------------------------ message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_o1$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # update(pairs(emm_i1), by = NULL, adjust = "holm") ## ---- echo=FALSE------------------------------------------------------------------------ message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_o2$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # summary(as.glht(update(pairs(emm_i1), by = NULL)), test = adjusted("free")) ## ---- echo=FALSE------------------------------------------------------------------------ cat(emm_o3$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # emm_i1b <- update(emm_i1, tran = "log", type = "response", by = NULL) # emm_i1b ## ---- echo=FALSE------------------------------------------------------------------------ cat(emm_o4$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # afex_plot(m9s, "frequency", "stimulus", "task", id = "id", # data_geom = ggbeeswarm::geom_quasirandom, # data_arg = list( # dodge.width = 0.5, ## needs to be same as dodge # cex = 0.8, # color = "darkgrey")) ## ---- echo=FALSE, fig.width=5, fig.height=4, out.width="90%"---------------------------- p1 ## ---- eval=FALSE------------------------------------------------------------------------ # joint_tests(m9s, by = c("stimulus", "task")) ## ---- echo=FALSE------------------------------------------------------------------------ cat(emm_o5$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # emm_i2 <- emmeans(m2s, c("density", "frequency"), by = c("stimulus", "task")) # emm_i2 ## ---- echo=FALSE------------------------------------------------------------------------ cat(emm_o6$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # # desired contrats: # des_c <- list( # ll_hl = c(1, -1, 0, 0), # lh_hh = c(0, 0, 1, -1) # ) # update(contrast(emm_i2, des_c), by = NULL, adjust = "holm") ## ---- echo=FALSE------------------------------------------------------------------------ cat(emm_o7$output, sep = "\n") ## ---- include=FALSE----------------------------------------------------------- options(op) afex/inst/doc/introduction-mixed-models.pdf.asis0000644000176200001440000000030513664111747021466 0ustar liggesusers%\VignetteIndexEntry{An Introduction to Mixed Models for Experimental Psychology} %\VignetteEngine{R.rsp::asis} %\VignetteKeyword{PDF} %\VignetteKeyword{vignette} %\VignetteKeyword{package} afex/inst/doc/afex_analysing_accuracy_data.html0000644000176200001440000067201714076067150021463 0ustar liggesusers Analysis of Accuracy Data using ANOVA and binomial GLMMs

Analysis of Accuracy Data using ANOVA and binomial GLMMs

Henrik Singmann

2021-07-21

Overview

This vignette shows how accuracy data can be analysed with afex using either ANOVA or a binomial generalized linear mixed model (i.e., a mixed model that uses the appropriate distributional family for such data). Accuracy data means data where each observation can be categorized as either a 0, which indicates failure, miss, or an erroneous response, or 1 which indicates success or a correct response.

We begin by loading the packages needed here and set a somewhat nicer ggplot2 theme.

library("afex")
library("emmeans")
library("dplyr")
library("ggplot2")
theme_set(theme_bw(base_size = 15) + 
            theme(legend.position="bottom", 
                  panel.grid.major.x = element_blank()))
library("cowplot")
library("ggbeeswarm")

Data and Research Question

The data we are looking at is from Lin and colleagues (2020) and investigates ego depletion using a novel paradigm. Ego depletion is a (social) psychological concept originating from Roy Baumeister’s work which can be summed up by the phrase ‘self-control/willpower is a muscle’: An initial use of self-control, such as performing a demanding task or resisting a temptation, depletes the available self-control resources so that subsequent tasks only have limited self-control resources available. The paper introducing the concept was published in 1998 (references can be found on Wikipedia). The ego depletion concept was extremely popular until the height of the replication crisis in psychology in which researcher also struggled to replicate the key ego depletion phenomenon just outlined. Recently, Lin and colleagues developed a new paradigm for investigation ego depletion. Their primary interest was on analyzing the data using a diffusion model, which will not be of interest here.

Lin and colleagues (2020) task followed the usual approach for ego depletion tasks. In a first phase, participants either worked on a high-demand task or a low-demand task (variable condition). Then, participants had to work on a Stroop task. The Stroop task consist of colour words (i.e., “red”, “blue”, or “yellow”) displayed in a colour (i.e., red, blue, or yellow). In each trial, one of the three words is displayed in one of the three colours (e.g., the word “red” could be displayed in red or blue). The task of the participants is to press a button corresponding to the three colours the word is displayed in (i.e., participants have to ignore the meaning of the word but focus on the colour the letters have).

The Stroop effect is the finding that it is easier to select the correct colour in a congruent trial in which the meaning of the word and the colour the word is displayed in match (e.g., the word “red” in red). In contrast, people are slower and make more errors in an incongruent trial in which there is a mismatch between word meaning and word colour (e.g., the word “red” in blue). In other words, it is difficult for people to ignore the meaning of a word when having to decide which colour the word is displayed in. The variable determining match between word meaning and world colour is congruency.

The hypothesis of the ego depletion concept is that it moderates or interacts with the congruency effect (i.e., difference in performance between congruent and incongruent trials). In particular, the congruency effect is smaller if participants are ego depleted compared to when they are not. We analyse this Stroop data in the following.

One of the new features of Lin et al.’s (2020) study compared to earlier ego-depletion studies is that both variables, condition and congruency, vary within-subjects. That is, each participants once performed a high-demand task followed by the Stroop task and then also a low-demand task followed by a Stroop task. This was usually done on two different days with a week time in between in counterbalanced order.

We then load the data, called stroop, which comes with afex. For simplicity we only focus on the data from Lin et al.’s (2020) Experiment 1 (the data of all their 4 studies is part of stroop). We focus on the accuracy of participants which is coded as either 0 (error) or 1 (correct response) in column acc. We also remove all NAs in the response variable and drop unused factor levels. This streamlines a few of the calls later on.

data("stroop")
## extract data from experiment 1 and remove NAs
stroop_e1 <- stroop %>%
  filter(!is.na(acc)) %>% 
  filter(study == "1") %>% 
  droplevels()

A look at the resulting data.frame reveals that we have trial-wise data. That is, each observation (i.e., row) is one response to a Stroop trial. The data is not yet aggregated so that each participant has one observation per design cell (i.e., denoting the average accuracy for each participant in this cell). We also see we still have quite a bit of data left, from 253 participants.

head(stroop_e1)
##    pno condition study trialnum  congruency acc    rt
## 1 s1_1   deplete     1        1   congruent   1 0.626
## 2 s1_1   deplete     1        2   congruent   1 0.550
## 3 s1_1   deplete     1        3 incongruent   1 0.872
## 4 s1_1   deplete     1        4   congruent   1 0.635
## 5 s1_1   deplete     1        5   congruent   1 0.660
## 6 s1_1   deplete     1        6 incongruent   1 0.667
str(stroop_e1)
## 'data.frame':    84667 obs. of  7 variables:
##  $ pno       : Factor w/ 253 levels "s1_1","s1_2",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ condition : Factor w/ 2 levels "control","deplete": 2 2 2 2 2 2 2 2 2 2 ...
##  $ study     : Factor w/ 1 level "1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ trialnum  : num  1 2 3 4 5 6 7 8 9 10 ...
##  $ congruency: Factor w/ 2 levels "congruent","incongruent": 1 1 2 1 1 2 1 2 1 1 ...
##  $ acc       : num  1 1 1 1 1 1 1 1 1 1 ...
##  $ rt        : num  0.626 0.55 0.872 0.635 0.66 0.667 0.538 0.927 0.583 0.588 ...

ANOVA Analysis

We begin with an analysis of the data using standard repeated-measures ANOVA. ANOVA is probably the most common approach to analyse such data in psychology, but its use is somewhat questionable. The reason is that ANOVA assumes that response variable is normally distributed (or more precisely, the conditional distribution of the data after taking the model into account, i.e., the residuals, are assumed to follow a normal distribution). Here, our data are only 0s and 1s which do not follow a normal but rather a binomial or Bernoulli distribution. Nevertheless, analysis of such data using models assuming normal distribution such as ANOVA is not uncommon and in many cases leads to the same conclusions than the more complicated model discussed below. However, as we will see below, the results can also change.

We set up the model using aov_ez and specify both factors, congruency and condition, correctly as within factors.

e1_anova <- aov_ez(
  id = "pno", 
  dv = "acc", 
  data = stroop_e1,
  within = c("congruency", "condition")
)
## Warning: More than one observation per cell, aggregating the data using mean (i.e,
## fun_aggregate = mean)!

Fitting this model produces a warning message telling us what we already know. There is more than one observation per participant and cell of the design (i.e., combination of our two factors) and the data is averaged before calculating the ANOVA.

Note that if we would not have removed the NAs from the data, this call would have failed with an error as all participants have NAs so all would have been removed. In that case, we could have added na.rm = TRUE to the aov_ez() call to ignore the NAs when aggregating the data.

If we take a look at the ANOVA table, we see a clear main effect of congruency, a somewhat weaker main effect of condition, but no interaction.

e1_anova
## Anova Table (Type 3 tests)
## 
## Response: acc
##                 Effect     df  MSE          F   ges p.value
## 1           congruency 1, 252 0.01 242.95 ***  .247   <.001
## 2            condition 1, 252 0.00     5.43 *  .003    .021
## 3 congruency:condition 1, 252 0.00       0.10 <.001    .757
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '+' 0.1 ' ' 1

The observed pattern of effects is in line with most recent failures to replicate ego depletion. The main effect of condition suggests there be some general effect, such as more errors after a demanding task, but not the predicted interaction of condition with the congruency effect. The original prediction of ego-depletion is that it reduces self-control, thus resulting in attenuated Stroop effects after depletion. This pattern would result in a significant interaction.

We can look at the effects in turn using emmeans. We begin by looking at the Stroop effect, that is the effect of congruency.

emmeans(e1_anova, "congruency")
##  congruency  emmean       SE  df lower.CL upper.CL
##  congruent   0.9763 0.001201 252   0.9739   0.9787
##  incongruent 0.8867 0.005876 252   0.8752   0.8983
## 
## Results are averaged over the levels of: condition 
## Confidence level used: 0.95

We can see the usual Stroop effect. Accuracy is higher for congruent compared to incongruent items.

We also look at the effect of condition.

emmeans(e1_anova, "condition")
##  condition emmean      SE  df lower.CL upper.CL
##  control    0.936 0.00345 252    0.929    0.943
##  deplete    0.927 0.00375 252    0.920    0.935
## 
## Results are averaged over the levels of: congruency 
## Confidence level used: 0.95

We see that accuracy is roughly 1% lower in the ego-depletion compared to the control condition.

We can also plot both effects.

plot_grid(
  afex_plot(e1_anova, "congruency", error = "within", 
            data_geom = geom_quasirandom, data_alpha = 0.3) + 
    coord_cartesian(ylim = c(0.25, 1)),
  afex_plot(e1_anova, "condition", error = "within", 
            data_geom = geom_quasirandom, data_alpha = 0.3) +
    coord_cartesian(ylim = c(0.25, 1))
)

Mixed Model Analysis

A model with a more appropriate conditional distribution (instead of the normal distribution used by ANOVA) are generalized linear models with a binomial family. Because we have repeated measures both within participants within each design cell and across cells (i.e., we have within-subject factors) we need to use a mixed model. Thus, we have to employ a generalized linear mixed model (GLMM) with a binomial family. Here, we use the canonical link function, the logit (an alternative would be probit).

In our call to mixed we indicate the fact that we want to estimate a binomial GLMM (in contrast to a regular LMM) by passing the correct family, family = binomial. We could further specify the link function (e.g., family = binomial(link = "probit")), but because we use the canonical link here, this is not necessary.

As for all mixed models, we should begin our analysis with the “maximal random effect structure justified by the design” (Barr et al., 2013), the maximal model. Because all factors vary within-subjects in the present case and we only consider one random-effects grouping factor (participant), the maximum random effect structure involves by-participant random intercepts as well as by-participant random slopes for factors congruency, condition, and their interaction, as well as the correlation among the random effect parameters.

If you need an introduction to the topic of the random effect structure, consider reading our introduction to mixed models (Singmann & Kellen, 2019). A worked example of how to reduce the maximal model in case of converging warnings is provided in the mixed model vignette.

Another important decision when fitting a mixed model with afex::mixed is the choice of the method for testing model terms. The default method is the Kenward-Roger approximation. However, this is not possible for GLMMs (i.e., it only applies to LMMs). For GLMMs we only have two methods available, likelihood ratio tests (method = "LRT") and parametric bootstrap (method = "PB"). Parametric bootstrap is generally the preferable procedure, especially in settings with small N, specifically low numbers of levels for the random effects grouping factor (i.e., few participants in the present case). However, parametric bootstrap can be prohibitively time consuming as it requires refitting the model several times (suggested is at last a 1000 times per model term/effect). The main factor influencing the time is therefore the complexity of the random effect structure. Even with only a moderately complex structure, such as in the present case, it can take days (even though computations can be distributed on a multi-core machine as shown below).

One rule of thumb (for which I have never seen any actual data) is that with more than around 50 levels for each random effects grouping factor, likelihood ratio tests are probably okay and parametric bootstrap not necessary. Luckily, in the present case we have over 250 participants (i.e., way more than 50), so we decide to use likelihood ratio tests as a method for testing model terms (i.e., method = "LRT").

Setting-Up and Fitting the Models

There are two ways on how to set up such models in afex::mixed (lme4 provides another third variant that is not possible in afex::mixed). Before describing both ways, the somewhat surprising fact is that the second way, based on the aggregated data, is considerably faster than the first way. In the present case the first way takes more than an hour on my laptop whereas the second way takes only around one minute!

To understand the two different ways, it might help to recall some basics about the binomial distribution. It is defined by the number of observations and the number of successes and has one parameter, the success probability. Because we want to estimate the parameter of the binomial distribution, the success probability, we have to pass two pieces of information to the mixed function; the number of successes and the total number of trials. The easiest way to do so with the current data is by directly passing the accuracy column acc. It only consists of zeros and ones so the total number of observations is the number of trials, and the number of ones is the number of successes. The following code sets up the maximal model as discussed above using this approach. Note that fitting this model takes more than an hour (likely several hours).

e1_mixed1_v1 <- mixed(
  acc ~ congruency*condition + (congruency*condition|pno), 
  data = stroop_e1, 
  method = "LRT", 
  family = binomial
)

Before looking at the results, let us first discuss the alternative way of specifying the model. Note that the second way is usually considerably faster. This way consists of two steps. We first need to aggregate the data within each cell of the design and participant by calculating the proportion of correct responses and the number of trials for each cell. Then we can pass these two pieces of information to mixed, the proportion of successes as the dependent variable and the total number of successes as a weight. These two pieces of information again provide all information required for the binomial distribution. However, note that it is important that proportion times the weight provide an integer number, the actual number of successes which cannot have a decimal part.

At first, we need to aggregate the data. For this, we can use the following dplyr syntax.

stroop_e1_agg <- stroop_e1 %>% 
  group_by(condition, congruency, pno) %>% 
  summarise(acc = mean(acc), 
            n = n())

Then, we can set up the model. Note that we need to pass the total number of trials as the weight argument here. mixed now supports the exact same syntax as glmer so we can pass simply the unquoted name of the column holding the weights, weight = n.

The call to mixed is then pretty much the same as above, the only differences are that we have to use the data.frame with the aggregated data, potentially a new name of response variable (here I decided to use the same name, acc for the aggregated accuracy), and the weight argument.

e1_mixed1_v2 <- mixed(
  acc ~ congruency*condition + (congruency*condition|pno), 
  data = stroop_e1_agg, 
  method = "LRT", 
  family = binomial,
  weight = n
)

Dealing with Fit Warnings

Before looking at the results, we see that fitting produces quite a few warnings. These are reproduced below in the way we would also get them when simply typing in the object name (e.g., e1_mixed1_v2). The following are the warnings for the first variant, e1_mixed1_v1.

## Warning: lme4 reported (at least) the following warnings for 'full':
##   * Model failed to converge with max|grad| = 0.00378454 (tol = 0.002, component 1)
## Warning: lme4 reported (at least) the following warnings for 'congruency':
##   * Model failed to converge with max|grad| = 0.146845 (tol = 0.002, component 1)
## Warning: lme4 reported (at least) the following warnings for 'condition':
##   * Model failed to converge with max|grad| = 0.0860405 (tol = 0.002, component 1)
## Warning: lme4 reported (at least) the following warnings for 'congruency:condition':
##   * Model failed to converge with max|grad| = 0.0181415 (tol = 0.002, component 1)

And these are the warnings for the second variant, e1_mixed1_v2.

## Warning: lme4 reported (at least) the following warnings for 'full':
##   * Model failed to converge with max|grad| = 0.0142323 (tol = 0.002, component 1)
## Warning: lme4 reported (at least) the following warnings for 'congruency':
##   * Model failed to converge with max|grad| = 0.134205 (tol = 0.002, component 1)
##   * Model is nearly unidentifiable: very large eigenvalue
##  - Rescale variables?
## Warning: lme4 reported (at least) the following warnings for 'condition':
##   * Model failed to converge with max|grad| = 0.120362 (tol = 0.002, component 1)
##   * Model is nearly unidentifiable: very large eigenvalue
##  - Rescale variables?
## Warning: lme4 reported (at least) the following warnings for 'congruency:condition':
##   * Model failed to converge with max|grad| = 0.0534769 (tol = 0.002, component 1)

Both variants show quite a few warnings. The warnings are given separately for the different models estimated (i.e., full model with all terms and one model for each term removed from the full model). However, none of the warnings is the dreaded “singular fit” warning that clearly suggests an over-parameterised model. We therefore will be working with this random effect structure going forward.

Here, we have two different warnings suggesting some numerical issue at the maximum likelihood estimate. One warning tells us that for the result returned from the fitting (i.e., optimization) algorithm the absolute gradient of the deviance function is not small (i.e., there might be a better global optimum that was not discovered). Another warning relates to the size of the eigenvalue which suggests something similar, there might be better solutions in the parameter space. More on these warnings can be found in the lme4 help at ?troubleshooting (or help("troubleshooting", package = "lme4")).

Given that both types of warnings are not too dramatic, one way to address them is by trying different optimizers. mixed makes this easy via the all_fit argument, if TRUE several optimizers are applied to the output from the regular run (make sure to install packages optimx and dfoptim to use all possible available optimizers).

e1_mixed1_v2_allfit <- mixed(
  acc ~ congruency*condition + (congruency*condition|pno), 
  data = stroop_e1_agg, 
  method = "LRT", 
  family = binomial,
  weight = n, 
  all_fit = TRUE 
)
## Warning: lme4 reported (at least) the following warnings for 'full':
##   * Model failed to converge with max|grad| = 0.123381 (tol = 0.002, component 1)
##   * Model is nearly unidentifiable: very large eigenvalue
##  - Rescale variables?
## Warning: lme4 reported (at least) the following warnings for 'congruency':
##   * Model failed to converge with max|grad| = 0.137517 (tol = 0.002, component 1)
##   * Model is nearly unidentifiable: very large eigenvalue
##  - Rescale variables?
## Warning: lme4 reported (at least) the following warnings for 'condition':
##   * Model failed to converge with max|grad| = 0.128127 (tol = 0.002, component 1)
##   * Model is nearly unidentifiable: very large eigenvalue
##  - Rescale variables?
## Warning: lme4 reported (at least) the following warnings for 'congruency:condition':
##   * Model failed to converge with max|grad| = 0.130338 (tol = 0.002, component 1)
##   * Model is nearly unidentifiable: very large eigenvalue
##  - Rescale variables?

Somewhat surprisingly the fit using all optimizers produces more convergence warnings than the previous fit. However, all warnings are of the same type as for the other variants.

Another way to deal with the warnings is by fitting a variant of the model with reduced random effect structure. Hopefully this model will not produce the warning, but similar results. If warnings are more severe than the current warning, fitting a reduced model is surely indicated. Critical warnings that make it necessary to reduce the model are for example a singular fit warning or a warning that the algorithm did not converge within the allowed number of iterations. Nevertheless, if this were a real data analysis for a manuscript it would probably still make sense to reduce the random effect structure, beginning with the correlation among the random effect parameters, until the warnings are gone. Then, we would compare the final (i.e., reduced) model with the maximal model to ensure that the pattern of significant and non-significant effects is the same in both cases (if not, this needs to be reported transparently). An example of such an iterative reduction of the random effect structure is given in the mixed model vignette.

ANOVA Table for GLMMs

We can now print the model to get the resulting ANOVA table, that is the table of model terms (i.e., main effects and interactions), as for the regular ANOVA model. Doing so would normally also reproduces the warnings shown above but is suppressed here.

We show the results of the three variants in turn.

e1_mixed1_v1 ## variant 1
## Mixed Model Anova Table (Type 3 tests, LRT-method)
## 
## Model: acc ~ congruency * condition + (congruency * condition | pno)
## Data: stroop_e1
## Df full model: 14
##                 Effect df      Chisq p.value
## 1           congruency  1 321.00 ***   <.001
## 2            condition  1  11.08 ***   <.001
## 3 congruency:condition  1     4.23 *    .040
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1
e1_mixed1_v2  ## variant 2
## Mixed Model Anova Table (Type 3 tests, LRT-method)
## 
## Model: acc ~ congruency * condition + (congruency * condition | pno)
## Data: stroop_e1_agg
## Df full model: 14
##                 Effect df      Chisq p.value
## 1           congruency  1 321.05 ***   <.001
## 2            condition  1  11.10 ***   <.001
## 3 congruency:condition  1     4.23 *    .040
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1
e1_mixed1_v2_allfit  ## variant 2 with all_fit = TRUE
## Mixed Model Anova Table (Type 3 tests, LRT-method)
## 
## Model: acc ~ congruency * condition + (congruency * condition | pno)
## Data: stroop_e1_agg
## Df full model: 14
##                 Effect df      Chisq p.value
## 1           congruency  1 320.96 ***   <.001
## 2            condition  1  11.06 ***   <.001
## 3 congruency:condition  1     4.23 *    .040
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

As can be seen, the results of the three different variants are extremely similar. Especially the fact that the results from variant 2 and the variant with all_fit = TRUE are pretty much the same suggests that we can have some confidence in the results.

As for the ANOVA we see significant main effects of congruency and condition. However, we also see a significant congruency by condition interaction. As a reminder, this interaction is the precondition of the central ego depletion prediction.

Follow-Up Analysis and Plots

Let us first look at the main effects as for the ANOVA model. For this, we will always use the model with all_fit = TRUE, e1_mixed1_v2_allfit. For easier interpretability, we also always set type = "response" in the call to emmeans. This provides estimated marginal means on the response scale (i.e., in probability units after applying the inverse link function). In case of the default (i.e., type = "link") marginal mean are given on the linear scale which in this case is the logit scale.

emmeans(e1_mixed1_v2_allfit, "congruency", type = "response")
## NOTE: Results may be misleading due to involvement in interactions
##  congruency      prob          SE  df asymp.LCL asymp.UCL
##  congruent   0.982434 1.44579e-05 Inf  0.982406  0.982463
##  incongruent 0.909378 6.89756e-05 Inf  0.909242  0.909513
## 
## Results are averaged over the levels of: condition 
## Confidence level used: 0.95 
## Intervals are back-transformed from the logit scale

We again see the Stroop effect. Accuracy is higher for congruent compared to incongruent items.

We also look at the effect of condition.

emmeans(e1_mixed1_v2_allfit, "condition", type = "response")
## NOTE: Results may be misleading due to involvement in interactions
##  condition    prob         SE  df asymp.LCL asymp.UCL
##  control   0.96299 2.9834e-05 Inf   0.96293   0.96305
##  deplete   0.95570 3.5437e-05 Inf   0.95563   0.95577
## 
## Results are averaged over the levels of: congruency 
## Confidence level used: 0.95 
## Intervals are back-transformed from the logit scale

We see that accuracy is roughly 1% lower in the ego-depletion compared to the control condition.

We can also plot both effects as above. We essentially only have to replace the model name in the calls to afex_plot. However, we also remove the error = "within" to show model-based error bars.

plot_grid(
  afex_plot(e1_mixed1_v2_allfit, "congruency", 
            data_geom = geom_quasirandom, data_alpha = 0.3) + 
    coord_cartesian(ylim = c(0.25, 1)),
  afex_plot(e1_mixed1_v2_allfit, "condition",  
            data_geom = geom_quasirandom, data_alpha = 0.3) +
    coord_cartesian(ylim = c(0.25, 1))
)
## Aggregating data over: pno
## NOTE: Results may be misleading due to involvement in interactions
## Aggregating data over: pno
## NOTE: Results may be misleading due to involvement in interactions

Finally, we can also have a look at the interaction. One way to do so is by looking at the reference grid of the two variables.

emmeans(e1_mixed1_v2_allfit, c("congruency", "condition"), type = "response")
##  congruency  condition     prob          SE  df asymp.LCL asymp.UCL
##  congruent   control   0.984783 1.77534e-05 Inf  0.984748  0.984817
##  incongruent control   0.912742 9.42464e-05 Inf  0.912558  0.912927
##  congruent   deplete   0.979731 2.35033e-05 Inf  0.979685  0.979777
##  incongruent deplete   0.905897 1.00894e-04 Inf  0.905699  0.906094
## 
## Confidence level used: 0.95 
## Intervals are back-transformed from the logit scale

Alternatively, we can look at the effect of congruency conditional on condition. As will be shown below, this has some benefits. And because we will use this emmeans object later, we assign it to emm_inter_1.

emm_inter_1 <- emmeans(e1_mixed1_v2_allfit, "congruency", 
                       by = "condition", type = "response")
emm_inter_1
## condition = control:
##  congruency      prob          SE  df asymp.LCL asymp.UCL
##  congruent   0.984783 1.77534e-05 Inf  0.984748  0.984817
##  incongruent 0.912742 9.42464e-05 Inf  0.912558  0.912927
## 
## condition = deplete:
##  congruency      prob          SE  df asymp.LCL asymp.UCL
##  congruent   0.979731 2.35033e-05 Inf  0.979685  0.979777
##  incongruent 0.905897 1.00894e-04 Inf  0.905699  0.906094
## 
## Confidence level used: 0.95 
## Intervals are back-transformed from the logit scale

With this object, it is now particularly easy to see if there are indeed differences in the Stroop effects across conditions. We can simply use the pairs function which will only calculate pairwise comparisons for each level of the by factor `conditions. Because of the significant interaction this shows that there is evidence for a reduced Stroop effect in the deplete condition. The odds ratio are around 5 in the deplete condition and over 6 in the control condition.

pairs(emm_inter_1)
## condition = control:
##  contrast                odds.ratio       SE  df z.ratio  p.value
##  congruent / incongruent      6.187 0.010362 Inf 1088.115 <.0001 
## 
## condition = deplete:
##  contrast                odds.ratio       SE  df z.ratio  p.value
##  congruent / incongruent      5.021 0.008404 Inf  964.109 <.0001 
## 
## Tests are performed on the log odds ratio scale

We can of course also plot the interaction. We use violin plots for the data to make this plot somewhat appealing.

afex_plot(e1_mixed1_v2_allfit, "condition", "congruency", 
          data_geom = geom_violin)
## Aggregating data over: pno

For reference, we can also make the plot based on the model using variant 1 (i.e., based on trial-wise non-aggregated data) which produces the same figure.

afex_plot(e1_mixed1_v1, "condition", "congruency", 
          data_geom = geom_violin)
## Aggregating data over: pno

Analysis of Two Studies with GLMM

The stroop data set contains all four experiments of Lin et al. (2020). So far we only looked at Experiment 1. Here, we want to look at Experiments 1 and 2 to show some additional functionality of analysing accuracy data with GLMMs. Let us begin by preparing the data.

## extract data from experiment 1 and remove NAs
stroop_e12 <- stroop %>%
  filter(!is.na(acc)) %>% 
  filter(study %in% c("1", "2")) %>% 
  droplevels()

We then have a look at the number of participants per experiment. As can be seen below, there is a clear imbalance with Experiment 1 having a lot more participants than Experiment 2. We will see below what we can do with this information.

stroop_e12 %>% 
  group_by(study) %>% 
  summarise(n = length(unique(pno)))
## # A tibble: 2 x 2
##   study     n
##   <fct> <int>
## 1 1       253
## 2 2       132

But first, we aggregate the data for analysing it using the second variant introduced above as it is dramatically faster.

stroop_e12_agg <- stroop_e12 %>% 
  group_by(study, condition, congruency, pno) %>% 
  summarise(acc = mean(acc), 
            n = n())

We are now ready to fit the model. However, because we now have to fit 8 models in total and we also have more data at hand, fitting will take quite a bit longer even when using the aggregated data. Especially, because based on our experience with the data from Experiment 1, it makes sense to set all_fit = TRUE here.

Estimating Models in Parallel

Therefore, it makes sense to reduce our fitting time by distributing the estimation across the available CPU cores using the parallel package support provided by mixed. Note that this simply distributes the different models across cores (i.e., each individual fit is still run on a single core). For this, we need to set up a cluster, cl, and then pass this cluster to mixed.

library("parallel")
nc <- detectCores() # number of cores
cl <- makeCluster(rep("localhost", nc)) # make cluster

We can then fit the model using the new data in a similar manner as above. The main changes are that we add *study to the fixed effects part of the model formula which estimates main effects and all interactions with study. We do not estimate any random slopes for study because participants are in only one study (i.e., study is a between-subjects factor). We also enable multi-core estimation by setting cl = cl.

e12_mixed1 <- mixed(
  acc ~ congruency*condition*study + (congruency*condition|pno), 
  data = stroop_e12_agg, 
  method = "LRT", 
  family = binomial,
  weight = n, 
  all_fit = TRUE, 
  cl = cl
)

Type III versus Type II Sums of Squares

The default type argument when using mixed (and the other afex functions) is 3 which estimates so-called type III sums of squares tests of model terms. There is a somewhat heated discussion on these topics in the literature which I do not want to rehash here (more can be found in our chapter). In short, the distinction between Type III (default in afex) and Type II (recommended by some vocal statisticians) is about how to deal with imbalance (i.e., different group sizes). Type III sums of squares assume that the imbalance is random and estimates a model in which all groups are assumed to have equal sizes. In contrast, using Type II sums of squares the differences in group sizes are assumed to be meaningful (e.g., as a consequence of different group sizes in the environment) and the model is set-up such that the differences in group sizes are represented.

Remember that the first experiment (study 1) had a lot more participants than the second experiment (study 2). However, the default Type III tests treat both studies as having the same sample size. In this case it might therefore make sense to also look at the results with Type II tests. For this, we simply need to add type = 2 (or equivalently type = "II") to the call as shown below.

e12_mixed1_t2 <- mixed(
  acc ~ congruency*condition*study + (congruency*condition|pno), 
  data = stroop_e12_agg, 
  method = "LRT", 
  family = binomial,
  weight = n, 
  all_fit = TRUE, 
  cl = cl,
  type = 2
)

Fitting both models shows a number of warnings similar to the previous model which we do not reproduce here. Let us instead take a look at the results.

We begin with the Type III model.

e12_mixed1
## Mixed Model Anova Table (Type 3 tests, LRT-method)
## 
## Model: acc ~ congruency * condition * study + (congruency * condition | 
## Model:     pno)
## Data: stroop_e12_agg
## Df full model: 18
##                       Effect df      Chisq p.value
## 1                 congruency  1 453.65 ***   <.001
## 2                  condition  1   10.43 **    .001
## 3                      study  1       0.14    .705
## 4       congruency:condition  1       1.72    .190
## 5           congruency:study  1       0.33    .566
## 6            condition:study  1       1.60    .205
## 7 congruency:condition:study  1       1.46    .226
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

The results are now more in line with the results from the ANOVA analysis. We only see significant main effects of congruency and condition, but no congruency by condition interaction. Furthermore, no effect involving study is significant.

Let us now take a look at the Type II results.

e12_mixed1_t2
## Mixed Model Anova Table (Type 2 tests, LRT-method)
## 
## Model: acc ~ congruency * condition * study + (congruency * condition | 
## Model:     pno)
## Data: stroop_e12_agg
## Df full model(s): 14, 14, 14, 17, 17, 17, 18
##                       Effect df      Chisq p.value
## 1                 congruency  1 482.39 ***   <.001
## 2                  condition  1  11.57 ***   <.001
## 3                      study  1       0.21    .646
## 4       congruency:condition  1     2.86 +    .091
## 5           congruency:study  1       0.28    .598
## 6            condition:study  1       1.42    .234
## 7 congruency:condition:study  1       1.46    .226
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

These look quite similar with one difference. The congruency by condition interaction is still not significant, however, the p-value is below .1.

Taken together the results somewhat suggest that the congruency by condition interaction is a pattern mainly found in (the larger) Experiment 1, but not in Experiment 2. In the Type III analysis in which both studies are weighed equally the interaction therefore does not reach significance. In contrast, in the Type II analysis in which the additional participants of Experiment 1 have a larger influence on the interaction, the p-value drops and is nearer the .05 cut-off. However, the difference in the interaction between the experiments is also not too large as the three way interaction of congruency by condition by study is clearly not significant (and as the highest order effect, this effect has to be the same for both types of sums of squares).

Follow-Up Tests for Type II Models

We can now of course also plot the data. Let us plot the congruency by condition interaction as before. We begin with the plot of the Type III model.

afex_plot(e12_mixed1, "condition", "congruency", 
          data_geom = geom_violin)
## Aggregating data over: pno
## NOTE: Results may be misleading due to involvement in interactions

We then plot the interaction of the Type II model.

afex_plot(e12_mixed1_t2, "condition", "congruency", 
          data_geom = geom_violin)
## Aggregating data over: pno
## emmeans are based on full model which includes all effects.
## NOTE: Results may be misleading due to involvement in interactions

Both look pretty much the same and actually are the same. The reason for this is also given as a message when producing the second plot. When using mixed Type II models, all follow-up tests (which includes plotting via afex_plot) are based on the full model. However, Type II model tests are not all based on the full model. Rather, for tests of lower-order effects higher order effects are not part of the comparison (i.e., tests of two-way interactions such as the congruency by condition interaction are compared against a reference model that only includes all two-way interactions and not the three-way interaction).

We can also see this when comparing the corresponding emmeans for both models:

emmeans(e12_mixed1, c("congruency", "condition"), type = "response")
## NOTE: Results may be misleading due to involvement in interactions
##  congruency  condition     prob          SE  df asymp.LCL asymp.UCL
##  congruent   control   0.983752 1.54389e-05 Inf  0.983722  0.983782
##  incongruent control   0.913573 7.61899e-05 Inf  0.913423  0.913722
##  congruent   deplete   0.980078 1.88459e-05 Inf  0.980040  0.980114
##  incongruent deplete   0.905551 8.25395e-05 Inf  0.905390  0.905713
## 
## Results are averaged over the levels of: study 
## Confidence level used: 0.95 
## Intervals are back-transformed from the logit scale
emmeans(e12_mixed1_t2, c("congruency", "condition"), type = "response")
## NOTE: Results may be misleading due to involvement in interactions
##  congruency  condition     prob          SE  df asymp.LCL asymp.UCL
##  congruent   control   0.983752 1.54389e-05 Inf  0.983722  0.983782
##  incongruent control   0.913573 7.61899e-05 Inf  0.913423  0.913722
##  congruent   deplete   0.980078 1.88459e-05 Inf  0.980040  0.980114
##  incongruent deplete   0.905551 8.25395e-05 Inf  0.905390  0.905713
## 
## Results are averaged over the levels of: study 
## Confidence level used: 0.95 
## Intervals are back-transformed from the logit scale

We again see that they are identical. Thus, the Type II outputs do not actually reflect Type II tests.

A more appropriate way to look at this two-way interaction would be to use a model that reflects the Type II tests; that is, a model without the three-way interaction. A variant of this model is part of the e12_mixed1_t2 object. However, because of the way afex::mixed creates the set of tests, this model is parameterized in a different way so we cannot pass it to emmeans for tests. Therefore, we have to refit the model without the three-way interaction. We do so by changing the fixed effects part of the formula to (congruency+condition+study)^2 which means all main effects and up to two-way interactions.

e12_mixed1_t2_red <- mixed(
  acc ~ (congruency+condition+study)^2 + (congruency*condition|pno), 
  data = stroop_e12_agg, 
  method = "LRT", 
  family = binomial,
  weight = n, 
  all_fit = TRUE, 
  cl = cl,
  type = 2
)
e12_mixed1_t2_red
## Mixed Model Anova Table (Type 2 tests, LRT-method)
## 
## Model: acc ~ (congruency + condition + study)^2 + (congruency * condition | 
## Model:     pno)
## Data: stroop_e12_agg
## Df full model(s): 14, 14, 14, 17, 17, 17
##                 Effect df      Chisq p.value
## 1           congruency  1 482.39 ***   <.001
## 2            condition  1  11.57 ***   <.001
## 3                study  1       0.21    .646
## 4 congruency:condition  1     2.86 +    .091
## 5     congruency:study  1       0.28    .598
## 6      condition:study  1       1.42    .234
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

We first have a look at the resulting ANOVA table (note, we suppress the warnings again here). As expected, the Type II tests are the same as in e12_mixed1_t2, because they are based on the exact same models.

We then take a look at the marginal means for the two-way interaction of congruency by condition.

emmeans(e12_mixed1_t2_red,  c("congruency", "condition"), type = "response") 
## emmeans are based on full model which includes all effects.
##  congruency  condition     prob          SE  df asymp.LCL asymp.UCL
##  congruent   control   0.983835 1.51410e-05 Inf  0.983806  0.983865
##  incongruent control   0.912916 7.55995e-05 Inf  0.912768  0.913064
##  congruent   deplete   0.979895 1.87376e-05 Inf  0.979858  0.979931
##  incongruent deplete   0.905955 8.10300e-05 Inf  0.905796  0.906114
## 
## Results are averaged over the levels of: study 
## Confidence level used: 0.95 
## Intervals are back-transformed from the logit scale

We can see these are now a bit different from the previous one, but not by a lot. A better way to see the difference is to use the same approach as above and look at the estimated Stroop effects for each condition.

For the correct Type II model these are given by the following call:

emmeans(e12_mixed1_t2_red, "congruency", by = "condition", 
        type = "response") %>% 
  pairs()
## emmeans are based on full model which includes all effects.
## condition = control:
##  contrast                odds.ratio       SE  df z.ratio  p.value
##  congruent / incongruent      5.806 0.007814 Inf 1306.888 <.0001 
## 
## condition = deplete:
##  contrast                odds.ratio       SE  df z.ratio  p.value
##  congruent / incongruent      5.059 0.006805 Inf 1205.405 <.0001 
## 
## Results are averaged over the levels of: study 
## Tests are performed on the log odds ratio scale

For the wrong Type II model these are given below:

emmeans(e12_mixed1_t2, "congruency", by = "condition", type = "response") %>% 
  pairs()
## emmeans are based on full model which includes all effects.
## NOTE: Results may be misleading due to involvement in interactions
## condition = control:
##  contrast                odds.ratio       SE  df z.ratio  p.value
##  congruent / incongruent      5.728 0.007817 Inf 1278.953 <.0001 
## 
## condition = deplete:
##  contrast                odds.ratio       SE  df z.ratio  p.value
##  congruent / incongruent      5.131 0.006999 Inf 1198.815 <.0001 
## 
## Results are averaged over the levels of: study 
## Tests are performed on the log odds ratio scale

We can see that as expected the magnitude of the difference between the Stroop effects is smaller in e12_mixed1_t2 (5.73 vs. 5.13) than in e12_mixed1_t2_red (5.81 vs. 5.06).

One way to approximate the latter behaviour without actually refitting the model is by passing submodel = "minimal" (which in the present case is identical to submodel = ~congruency*condition, see also the corresponding emmeans vignette). This does not produce exact Type II marginal means as when actually refitting the model. But at least approximates those.

emmeans(e12_mixed1_t2, "congruency", by = "condition", type = "response", 
        submodel = "minimal") %>% 
  pairs()
## emmeans are based on full model which includes all effects.
## NOTE: Results may be misleading due to involvement in interactions
## condition = control:
##  contrast                odds.ratio       SE  df z.ratio  p.value
##  congruent / incongruent      5.828 0.008192 Inf 1253.988 <.0001 
## 
## condition = deplete:
##  contrast                odds.ratio       SE  df z.ratio  p.value
##  congruent / incongruent      5.110 0.007365 Inf 1131.878 <.0001 
## 
## Results are averaged over the levels of: study 
## Tests are performed on the log odds ratio scale

Finally, we can also use this model to plot the two-way interaction.

afex_plot(e12_mixed1_t2_red, "condition", "congruency", 
          data_geom = geom_violin)
## Aggregating data over: pno
## emmeans are based on full model which includes all effects.

References

  • Barr, D. J., Levy, R., Scheepers, C., & Tily, H. J. (2013). Random effects structure for confirmatory hypothesis testing: Keep it maximal. Journal of Memory and Language, 68(3), 255–278. https://doi.org/10.1016/j.jml.2012.11.001
  • Lin, H., Saunders, B., Friese, M., Evans, N. J., & Inzlicht, M. (2020). Strong Effort Manipulations Reduce Response Caution: A Preregistered Reinvention of the Ego-Depletion Paradigm. Psychological Science. https://doi.org/10.1177/0956797620904990
  • Singmann, H., & Kellen, D. (2019). An Introduction to Mixed Models for Experimental Psychology. In D. H. Spieler & E. Schumacher (Eds.), New Methods in Cognitive Psychology (pp. 4–31). Psychology Press.
afex/inst/doc/afex_plot_introduction.Rmd0000644000176200001440000006764214076011252020162 0ustar liggesusers--- title: "afex_plot: Publication Ready Plots for Experimental Designs" author: "Henrik Singmann" date: "`r Sys.Date()`" show_toc: true output: knitr:::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{afex_plot: Publication Ready Plots for Experimental Designs} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r echo=FALSE} req_suggested_packages <- c("emmeans", "ggplot2", "cowplot", "ggbeeswarm", "ggpol") pcheck <- lapply(req_suggested_packages, requireNamespace, quietly = TRUE) if (any(!unlist(pcheck))) { message("Required package(s) for this vignette are not available/installed and code will not be executed.") knitr::opts_chunk$set(eval = FALSE) } ``` ```{r set-options, echo=FALSE, cache=FALSE} op <- options(width = 90) knitr::opts_chunk$set(dpi=72) ``` `afex_plot()` visualizes results from factorial experiments combining estimated marginal means and uncertainties associated with the estimated means in the foreground with a depiction of the raw data in the background. Currently, `afex_plots()` supports the following models: - ANOVAs estimated with `aov_car()`, `aov_ez()`, or `aov_4()` (i.e., objects of class `"afex_aov"`) - Linear mixed models estimated with `mixed()` (i.e., objects of class `"mixed"`) - Linear mixed models estimated with `lme4::lmer` (i.e., objects of class `"merMod"`) - Models with `emmeans` support. For some examples see `vignette("afex_plot_supported_models", package = "afex")` This document provides an overview of the plots possible with `afex_plot()`. It does so mostly using the `afex_plot()` examples, see `?afex_plot`. We begin by loading `afex` and [`ggplot2`](https://ggplot2.tidyverse.org/) which is the package `afex_plot()` uses for plotting. Loading `ggplot2` explicitly is not strictly necessary, but makes the following code nicer. Otherwise, we would need to prepend each call to a function from `ggplot2` needed for customization with `ggplot2::` (as is done in the examples in `?afex_plot`). We also load the [`cowplot`](https://cran.r-project.org/package=cowplot) package ([introduction](https://cran.r-project.org/package=cowplot/vignettes/introduction.html)) which makes combining plots (with functions `plot_grid()` and `legend()`) very easy. However, loading `cowplot` sets a different theme for `ggplot2` plots than the default grey one. Although I am not a big fan of the default theme with its grey background, we reset the theme globally using `theme_set(theme_grey())` to start with the default behavior if `cowplot` it not attached. Note that `cowplot` also has the cool `draw_plot()` function which allows embedding plots within other plots. We furthermore will need the following packages, however, we will not attach them directly, but only call a few selected functions using the `package::function` notation. - [`jtools`](https://cran.r-project.org/package=jtools) for `theme_apa()` - [`ggpubr`](https://cran.r-project.org/package=jtools) for `theme_pubr()` - [`ggbeeswarm`](https://cran.r-project.org/package=ggbeeswarm) for producing bee swarm plots with `geom_beeswarm` - [`ggpol`](https://cran.r-project.org/package=ggpol) for producing combined box plots and jitter plots using `geom_boxjitter()` ```{r message=FALSE, warning=FALSE} library("afex") library("ggplot2") library("cowplot") theme_set(theme_grey()) ``` # Two-Way Within-Subjects ANOVA We begin with a two-way within-subjects ANOVA using synthetic data from Maxwell and Delaney (2004, p. 547). The data are hypothetical reaction times from a 2 x 3 Perceptual Experiment with factors `angle` with 3 levels and factor `noise` with 2 levels (see `?md_12.1` for a longer description). We first load the data and then fit the corresponding ANOVA. ```{r} data(md_12.1) (aw <- aov_ez("id", "rt", md_12.1, within = c("angle", "noise"))) ``` The ANOVA shows that both, the two main effect as well as the interaction, are significant. We therefore inspect the pattern underlying the interaction. There exist two different ways of plotting a 2-way interaction. Either of the two variables can be depicted on the x-axis. And before having looked at both cases, it is often not clear which visualization of the interaction is more instructive. Consequently, we plot both next to each other. For this we simply need to exchange which variable is the `x` factor and which is the `trace` factor. We then use `plot_grid()` to plot them next to each other. ## Basic Plot ```{r fig.width=9, fig.height=4} p_an <- afex_plot(aw, x = "angle", trace = "noise") p_na <- afex_plot(aw, x = "noise", trace = "angle") plot_grid(p_an, p_na) ## try adding: labels = "AUTO" ``` Before we can even take a look at the plot, we notice that creating the plots has produced two warnings. These warnings complain that the plots depict within-subject factors, but do not use within-subject error bars. However, the warnings also tell us the solution (i.e., adding `error = "within"`), which we will do in the following. The help page `?afex_plot` contains more information on which type of error bars are appropriate in which situation and how to interpret different type of error bars. For ANOVAs, `afex_plot()` will emit warnings if it thinks the error bars are not appropriate for the chosen factors. Comparing both plots, my impression is that the plot with `angle` on the `x`-axis tells the clearer story. We can see that when `noise` is `absent` there is hardly any effect of the increase of `angle`. However, if `noise` is `present` an increasing `angle` clearly leads to increased RTs. We therefore use this plot in the following. ## Exploring Graphical Options and Themes We now produce a new variant of the left plot using more appropriate error bars and change several other graphical details which make the plot publication ready. We use the `factor_levels` argument to `afex_plot()` for renaming the factor levels (for technical reasons the ANOVA functions in `afex` transform all factor levels to proper `R` variable names using `make.names()` which changed the labels from e.g., `4` to `X4`) and the `legend_title` argument for changing the title of the legend. We also change the labels on the `x` and `y` axis. ```{r} p_an <- afex_plot(aw, x = "angle", trace = "noise", error = "within", factor_levels = list(angle = c("0°", "4°", "8°"), noise = c("Absent", "Present")), legend_title = "Noise") + labs(y = "RTs (in ms)", x = "Angle (in degrees)") ``` As the additional output shows, changing the factor levels via `factor_levels` emits a `message` detailing old and new factor levels in the form `old -> new`. This message can be suppressed by wrapping the `afex_plot()` call into a `suppressMessages()` call or via `RMarkdown` settings. Note that we could have also used the `factor_levels` argument for changing the order of the factor levels by passing a named character vector (e.g., `factor_levels = list(angle = c(X8 = "8°", X4 = "4°", X0 = "0°"))`). This would change the order either on the x-axis or in the legend. As said above, I am not a big fan of the default grey theme of `ggplot2` plots. Consequently, we compare a number of different themes for this plot in the following. For all but `ggpubr::theme_pubr()`, we also move the legend to the bottom as this better allows the plot to cover only a single column in a two-column layout. `ggpubr::theme_pubr()` automatically plots the legend on top. ```{r fig.width=8.5, fig.height=6, dpi = 150} plot_grid( p_an + theme_bw() + theme(legend.position="bottom"), p_an + theme_light() + theme(legend.position="bottom"), p_an + theme_minimal() + theme(legend.position="bottom"), p_an + jtools::theme_nice() + theme(legend.position="bottom"), p_an + ggpubr::theme_pubr(), p_an + theme_cowplot() + theme(legend.position="bottom"), labels = "AUTO" ) ``` The first row, panels A to C, shows themes coming with `ggplot2` and the second row, panels D to F, shows themes from additional packages. In my opinion all of these plots are an improvement above the default grey theme. For the themes coming with `ggplot2`, I really like that those shown here have a reference grid in the background. This often makes it easier to judge the actual values the shown data points have. I know that many people find this distracting, so many of the contributed themes do not have this grid. One thing I really like about the last two themes is that they per default use larger font sizes for the axes labels. One way to achieve something similar for most themes is to change `base_size`. One general criticism I have with the current plots is that they show too many values on the y-axis. In the following I plot one more variant of this plot in which we change this to three values on the y-axis. We also increase the axes labels and remove the vertical grid lines. ```{r fig.width=3.5, fig.height=3, dpi = 100, out.width='50%'} p_an + scale_y_continuous(breaks=seq(400, 900, length.out = 3)) + theme_bw(base_size = 15) + theme(legend.position="bottom", panel.grid.major.x = element_blank()) ``` We can also set this theme for the reminder of the `R` session with `theme_set()`. ```{r} theme_set(theme_bw(base_size = 15) + theme(legend.position="bottom", panel.grid.major.x = element_blank())) ``` ## Saving Plots and Plot Sizes To get our plot into a publication, we need to export it as a graphics file. I would generally advise against exporting plots via the `RStudio` interface as this is not reproducible. Instead I would use some of the following functions which save the document in the current working directory. Note that following [Elsevier guidelines](https://www.elsevier.com/authors/policies-and-guidelines/artwork-and-media-instructions/artwork-sizing), a single column figure should have a width of 9 cm (~ 3 inch) and a two column figure should have a width of 19 cm (~ 7.5 inch). For Word or similar documents I would export the plot as a `png` (never `jpg`): ```{r, eval=FALSE} ggsave("my_plot.png", device = "png", width = 9, height = 8, units = "cm", dpi = 600) ## the larger the dpi, the better the resolution ``` For `LaTeX` I would export as `pdf`: ```{r, eval=FALSE} ggsave("my_plot.pdf", device = "pdf", width = 9, height = 8, units = "cm") ``` ## Data in the Background `afex_plot()` per default plots the raw data in the background. It does so using an [alpha blending](https://en.wikipedia.org/wiki/Alpha_compositing#Alpha_blending) of `0.5`. Thus, overlapping points appear darker. Examples of this can be seen in the previous graphs where some data points in the background appear clearly darker than others. The darker points indicate values for which several data points lie exactly on top of each other. `afex_plot()` provides the possibility to change or alter the graphical primitive, called `geom` in `ggplot2` parlance, used for plotting the points in the background. This offers a vast array of options for handling overlapping points or, more generally, how to display the raw data in the background. I show some of these examples in the following. The first two variants display only points, whereas the remaining ones use different visualizations of the raw data. Note that depending on the specific variant we change a few further plot options to obtain a visually pleasing result. For example, the `dodge` argument controls the spread of points belonging to different levels of the `trace` factor at each x-axis position. 1. Add jitter on the y-axis to points which avoids perfect overlap. 3. Size of points show number of data points at a given y-axis position: `geom_count`. For this geom, adding a call to `scale_size_area()` can sometimes be beneficial. 3. Violin plot: `geom_violin` 4. Box plot: `geom_boxplot`. Note that for this plot we have added `linetype = 1` to `data_arg`, which avoids that the outline of the box plots is affected by the linetype mapping (this is in contrast with the violin plot). 2. Display points using a bee swarm plot, which displaces overlapping points on the x-axis: `ggbeeswarm::geom_beeswarm` 2. Display points using a variant of the bee swarm plot that even works in case of many data points: `ggbeeswarm::geom_quasirandom` 5. Combine box plot with jittered points: `ggpol::geom_boxjitter` ```{r fig.width=8.5, fig.height=16, dpi = 125} p1 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.3, data_arg = list( position = ggplot2::position_jitterdodge( jitter.width = 0, jitter.height = 10, dodge.width = 0.3 ## needs to be same as dodge ), color = "darkgrey")) p2 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.5, data_geom = geom_count) p3 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", data_geom = geom_violin, data_arg = list(width = 0.5)) p4 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", data_geom = geom_boxplot, data_arg = list(width = 0.3, linetype = 1)) p5 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.5, data_geom = ggbeeswarm::geom_beeswarm, data_arg = list( dodge.width = 0.5, ## needs to be same as dodge cex = 0.8, color = "darkgrey")) p6 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.5, data_geom = ggbeeswarm::geom_quasirandom, data_arg = list( dodge.width = 0.5, ## needs to be same as dodge color = "darkgrey")) p7 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.7, data_geom = ggpol::geom_boxjitter, data_arg = list( width = 0.5, jitter.params = list(width = 0, height = 10), outlier.intersect = TRUE), point_arg = list(size = 2.5), error_arg = list(size = 1.5, width = 0)) plot_grid(p1, p2, p3, p4, p5, p6, p7, ncol = 2, labels = 1:7) ``` ## Adding Color to Plots So far, all plots were shown in black and white only. However, it is easy to include color. We do so for plots 2 to 5 from above. To achieve this, we have to change the value of the `mapping` argument. ```{r fig.width=8.5, fig.height=8, dpi = 125} p2 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.5, mapping = c("shape", "color"), data_geom = ggbeeswarm::geom_beeswarm, data_arg = list( dodge.width = 0.5, ## needs to be same as dodge cex = 0.8)) p3 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", mapping = c("linetype", "shape", "fill"), data_geom = ggplot2::geom_violin, data_arg = list(width = 0.5)) p4 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", mapping = c("shape", "fill"), data_geom = ggplot2::geom_boxplot, data_arg = list(width = 0.3)) p5 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.7, mapping = c("shape", "fill"), data_geom = ggpol::geom_boxjitter, data_arg = list( width = 0.5, jitter.params = list(width = 0, height = 10), outlier.intersect = TRUE), point_arg = list(size = 2.5), line_arg = list(linetype = 0), error_arg = list(size = 1.5, width = 0)) plot_grid(p2, p3, p4, p5, ncol = 2, labels = 2:5) ``` ## Plotting Order and Error Bars For graphical element in the foreground, `afex_plot` first plots all graphical elements belonging to the same factor level before plotting graphical elements belonging to different factor levels. This provides a consistent graphical impression for each factor level that is particularly relevant in case color is mapped. In case we have overlapping lines and error bars or use thick lines, we sometimes do not want that the error bars also receives different line types. In this case, we can simply pass `linetype = 1` to `error_arg` to overwrite the corresponding mapping. This is shown in the right plot. ```{r fig.width=8.5, fig.height=4, dpi = 150} p1 <- afex_plot(aw, x = "noise", trace = "angle", mapping = "color", error = "within", point_arg = list(size = 5), line_arg = list(size = 2), error_arg = list(size = 2)) p2 <- afex_plot(aw, x = "noise", trace = "angle", mapping = c("color", "shape", "linetype"), error = "within", point_arg = list(size = 5), line_arg = list(size = 2), error_arg = list(size = 2, width = 0, linetype = 1)) plot_grid(p1, p2, ncol = 2) ``` ## One-way Plots Without Trace Factor If `afex_plot` is called without a trace factor, a one-way plot is created. We can customize this plot in very much the same way. Per default a one-way plot contains a legend if `mapping` is not empty (i.e., `""`). We show this legend for the left plot, but suppress it for the right one. ```{r fig.width=7, fig.height=3.5, message=FALSE} po1 <- afex_plot(aw, x = "angle", mapping = "color", error = "within", data_arg = list(), point_arg = list(size = 2.5), error_arg = list(size = 1.5, width = 0.05)) po2 <- afex_plot(aw, x = "angle", error = "within", data_geom = ggpol::geom_boxjitter, mapping = "fill", data_alpha = 0.7, data_arg = list( width = 0.6, jitter.params = list(width = 0.05, height = 10), outlier.intersect = TRUE ), point_arg = list(size = 2.5), error_arg = list(size = 1.5, width = 0.05)) + theme(legend.position="none") plot_grid(po1, po2) ``` One-way plots can also be split across different panels by specifying a `panel` factor: ```{r fig.width=7, fig.height=3.5, message=FALSE} afex_plot(aw, x = "angle", panel = "noise", error = "within", data_geom = ggpol::geom_boxjitter, mapping = "fill", data_alpha = 0.7, data_arg = list( width = 0.6, jitter.params = list(width = 0.05, height = 10), outlier.intersect = TRUE ), point_arg = list(size = 2.5), error_arg = list(size = 1.5, width = 0.05)) + theme(legend.position="none") ``` Sometimes we still want to add a line connecting the estimated marginal means. As `afex_plot` returns a `ggplot2` object, we can do this easily by adding a `geom_line()` object to the call. As we want to add a line through all of the shown points in the foreground, we need to add the corresponding groups aesthetics to this call: `geom_line(aes(group = 1))`. We can add further arguments to this call, as shown in the left panel below. ```{r fig.width=7, fig.height=3.5, message=FALSE} plot_grid( po1 + geom_line(aes(group = 1), color = "darkgrey", size = 1.5), po2 + geom_line(aes(group = 1)) ) ``` # 3-Way Mixed Model ## Data and Model ```{r, echo=FALSE} load(system.file("extdata/", "output_afex_plot_mixed_vignette.rda", package = "afex")) ``` To exemplify the support for linear mixed models, we will use the data from Freeman and colleagues also discussed in the [mixed model vignette](https://cran.r-project.org/package=afex/vignettes/afex_mixed_example.html). These data are lexical decision and word naming latencies for 300 words and 300 nonwords from 45 participants presented in Freeman et al. (2010). The dependent variable we are interested in is `log` RTs. We look at the same model also discussed in the vignette with factors `task` (between participants, but within items), `stimulus` (within participants, but between items), `density` (within participants, but between items), and `frequency` (within participants, but between items), for a total of almost 13,000 observations. We fit the model with crossed-random effects for participants (`id`) and `item`s using the final model, `m9s`, as discussed in the mixed model vignette. ```{r, eval=FALSE} data("fhch2010") # load fhch <- droplevels(fhch2010[ fhch2010$correct,]) # remove errors m9s <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus+frequency||id)+ (task|item), fhch, method = "S", control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ``` Note that going forward, we disable calculation of degrees of freedom for `emmeans` as this speeds up computation and/or avoids messages we are currently not interested in. ```{r} emmeans::emm_options(lmer.df = "asymptotic") ``` The ANOVA table of the mixed model indicates that the three-way interaction `task:stimulus:frequency` is significant on which we focus in the following. ```{r, eval=FALSE} m9s ``` ```{r, echo=FALSE} cat(aout_1$output, sep = "\n") ``` ## Which Data to Plot in the Background For mixed models, one important decision is the random-effects grouping factor(s) based on which the raw data plotted in the background is aggregated. This decision is necessary, because without such a factor, there would only be one observation for each cell of the design (unless the full design is considered). In the default setting, with `id` missing, the combination of all random-effects grouping factor is used. ```{r fig.width=7, fig.height=3.5, eval=FALSE} afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task") ``` ```{r fig.width=7, fig.height=3.5, echo=FALSE} message("Aggregating data over: item, id") message("NOTE: Results may be misleading due to involvement in interactions") ap1 ``` In the present case, a message informs us that the data is aggregated over both random-effects grouping factors. However, this leads to way too many data points in the background. Let us compare this plot with plots in which we use each of the two random-effects grouping factors in turn. ```{r fig.width=7, fig.height=3.5, eval=FALSE} plot_grid( afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", id = "id"), afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", id = "item"), labels = c("ID", "Item") ) ``` ```{r fig.width=7, fig.height=3.5, echo=FALSE} message("NOTE: Results may be misleading due to involvement in interactions") message("NOTE: Results may be misleading due to involvement in interactions") plot_grid( ap2a, ap2b, labels = c("ID", "Item") ) ``` The by-id plot looks usable. However, the by-item plot has still way too many data-points to be informative. Some other ways of displaying the raw data, such as violin plots or box plots, seems preferable for it. ## Ways of Plotting Data in the Background We compare violin plots or box plots for the by-item data in the next plot. For the box plot, we increase the width of the error bars and use a consistent line type to distinguish them more easily from the graphical elements of the box plot. We could probably further improve these plots by, for example, adding colors or using some of the other customizations discussed above for the ANOVA example. ```{r fig.width=7, fig.height=3.5, eval=FALSE} plot_grid( afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", id = "item", dodge = 0.8, data_geom = geom_violin, data_arg = list(width = 0.5)), afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", id = "item", dodge = 0.8, data_geom = geom_boxplot, data_arg = list(width = 0.5), error_arg = list(size = 1.5, width = 0, linetype = 1)) ) ``` ```{r fig.width=7, fig.height=3.5, echo=FALSE} message("NOTE: Results may be misleading due to involvement in interactions") message("NOTE: Results may be misleading due to involvement in interactions") plot_grid(ap3a, ap3b) ``` ## Error Bars for Mixed Models The default error bars for `afex_plot()` are based on the statistical model (i.e., the mixed model in the present case). These error bars can only be used to judge whether or not two means differ from each other, if the corresponding factor (or factors) are independent samples factors (i.e., not repeated-measures factors for any of the random-effects grouping factors). Of course, in addition to this the requirement of approximately equal sample size and variance also needs to hold. In the present case, all of the factors are repeated-measures factors with respect to one of the random-effects grouping factors. Consequently, the default error bars cannot be used for "inference by eye" for any of the factors. This is also easy to see when looking at all pairwise comparisons between means for each of the panels/tasks. This shows that for the `naming` task all comparisons are significant. In visual contrast with that, the two error bars for the `low` versus `high` `word`s are overlapping very strongly. ```{r, eval=FALSE} pairs(emmeans::emmeans(mrt, c("stimulus", "frequency"), by = "task")) ``` ```{r, echo=FALSE} cat(aout_2$output, sep = "\n") ``` An alternative in the present situation would be using within-subjects error bars and aggregating the data by-id (i.e., `error = "within"`), as done in the left panel below. This is somewhat appropriate here as the factors within each panel are all within-subject factors. In contrast, using by-item within-subjects error bars, as done in the right panel below, seems not appropriate as the only within-item factor, `task`, is spread across panels. Unfortunately, it is not immediately clear if these error bars allow one to correctly detect, which means do not differ from each other. ```{r fig.width=7, fig.height=3.5, eval=FALSE} plot_grid( afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", id = "id", error = "within"), afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", id = "item", dodge = 0.8, error = "within", data_geom = geom_violin, data_arg = list(width = 0.5)) ) ``` ```{r fig.width=7, fig.height=3.5, echo=FALSE} message("NOTE: Results may be misleading due to involvement in interactions") message("NOTE: Results may be misleading due to involvement in interactions") plot_grid(ap4a, ap4b) ``` In sum, using error bars for performing "inference by eye" - that is, using overlap or non-overlap of error bars to judge which means differ or do not differ from each other - is highly problematic for mixed models, due to the potentially complex dependency structures between the means. It would be best to avoid comparisons between means altogether. Instead, it is perhaps a good idea to plot the model-based error bars (which is the default) and use them for their intended purpose; judging which values of the estimated means are likely given what we have learned from the model (however, note that one cannot interpret a 95% confidence interval as having a 95% probability of containing the population mean). The help page `?afex_plot` contains further information and references on how to interpret confidence intervals and other error bars. # References * Freeman, E., Heathcote, A., Chalmers, K., & Hockley, W. (2010). Item effects in recognition memory for words. _Journal of Memory and Language_, 62(1), 1-18. https://doi.org/10.1016/j.jml.2009.09.004 * Maxwell, S. E., & Delaney, H. D. (2004). _Designing Experiments and Analyzing Data: A Model-Comparisons Perspective._ Mahwah, N.J.: Lawrence Erlbaum Associates. ```{r, include=FALSE} options(op) ``` afex/inst/doc/afex_plot_introduction.html0000644000176200001440000230207214076067221020402 0ustar liggesusers afex_plot: Publication Ready Plots for Experimental Designs

afex_plot: Publication Ready Plots for Experimental Designs

Henrik Singmann

2021-07-21

afex_plot() visualizes results from factorial experiments combining estimated marginal means and uncertainties associated with the estimated means in the foreground with a depiction of the raw data in the background. Currently, afex_plots() supports the following models:

  • ANOVAs estimated with aov_car(), aov_ez(), or aov_4() (i.e., objects of class "afex_aov")
  • Linear mixed models estimated with mixed() (i.e., objects of class "mixed")
  • Linear mixed models estimated with lme4::lmer (i.e., objects of class "merMod")
  • Models with emmeans support. For some examples see vignette("afex_plot_supported_models", package = "afex")

This document provides an overview of the plots possible with afex_plot(). It does so mostly using the afex_plot() examples, see ?afex_plot. We begin by loading afex and ggplot2 which is the package afex_plot() uses for plotting. Loading ggplot2 explicitly is not strictly necessary, but makes the following code nicer. Otherwise, we would need to prepend each call to a function from ggplot2 needed for customization with ggplot2:: (as is done in the examples in ?afex_plot).

We also load the cowplot package (introduction) which makes combining plots (with functions plot_grid() and legend()) very easy. However, loading cowplot sets a different theme for ggplot2 plots than the default grey one. Although I am not a big fan of the default theme with its grey background, we reset the theme globally using theme_set(theme_grey()) to start with the default behavior if cowplot it not attached. Note that cowplot also has the cool draw_plot() function which allows embedding plots within other plots.

We furthermore will need the following packages, however, we will not attach them directly, but only call a few selected functions using the package::function notation.

  • jtools for theme_apa()
  • ggpubr for theme_pubr()
  • ggbeeswarm for producing bee swarm plots with geom_beeswarm
  • ggpol for producing combined box plots and jitter plots using geom_boxjitter()
library("afex")     
library("ggplot2")  
library("cowplot")
theme_set(theme_grey())

Two-Way Within-Subjects ANOVA

We begin with a two-way within-subjects ANOVA using synthetic data from Maxwell and Delaney (2004, p. 547). The data are hypothetical reaction times from a 2 x 3 Perceptual Experiment with factors angle with 3 levels and factor noise with 2 levels (see ?md_12.1 for a longer description). We first load the data and then fit the corresponding ANOVA.

data(md_12.1)
(aw <- aov_ez("id", "rt", md_12.1, within = c("angle", "noise")))
## Anova Table (Type 3 tests)
## 
## Response: rt
##        Effect          df     MSE         F  ges p.value
## 1       angle 1.92, 17.31 3702.02 40.72 *** .390   <.001
## 2       noise        1, 9 8460.00 33.77 *** .387   <.001
## 3 angle:noise 1.81, 16.27 1283.22 45.31 *** .188   <.001
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '+' 0.1 ' ' 1
## 
## Sphericity correction method: GG

The ANOVA shows that both, the two main effect as well as the interaction, are significant. We therefore inspect the pattern underlying the interaction. There exist two different ways of plotting a 2-way interaction. Either of the two variables can be depicted on the x-axis. And before having looked at both cases, it is often not clear which visualization of the interaction is more instructive. Consequently, we plot both next to each other. For this we simply need to exchange which variable is the x factor and which is the trace factor. We then use plot_grid() to plot them next to each other.

Basic Plot

p_an <- afex_plot(aw, x = "angle", trace = "noise") 
## Warning: Panel(s) show within-subjects factors, but not within-subjects error bars.
## For within-subjects error bars use: error = "within"
p_na <- afex_plot(aw, x = "noise", trace = "angle")
## Warning: Panel(s) show within-subjects factors, but not within-subjects error bars.
## For within-subjects error bars use: error = "within"
plot_grid(p_an, p_na)  ## try adding: labels = "AUTO"

Before we can even take a look at the plot, we notice that creating the plots has produced two warnings. These warnings complain that the plots depict within-subject factors, but do not use within-subject error bars. However, the warnings also tell us the solution (i.e., adding error = "within"), which we will do in the following. The help page ?afex_plot contains more information on which type of error bars are appropriate in which situation and how to interpret different type of error bars. For ANOVAs, afex_plot() will emit warnings if it thinks the error bars are not appropriate for the chosen factors.

Comparing both plots, my impression is that the plot with angle on the x-axis tells the clearer story. We can see that when noise is absent there is hardly any effect of the increase of angle. However, if noise is present an increasing angle clearly leads to increased RTs. We therefore use this plot in the following.

Exploring Graphical Options and Themes

We now produce a new variant of the left plot using more appropriate error bars and change several other graphical details which make the plot publication ready. We use the factor_levels argument to afex_plot() for renaming the factor levels (for technical reasons the ANOVA functions in afex transform all factor levels to proper R variable names using make.names() which changed the labels from e.g., 4 to X4) and the legend_title argument for changing the title of the legend. We also change the labels on the x and y axis.

p_an <- afex_plot(aw, x = "angle", trace = "noise", error = "within",
                  factor_levels = list(angle = c("0°", "4°", "8°"),
                                    noise = c("Absent", "Present")), 
                  legend_title = "Noise") +
  labs(y = "RTs (in ms)", x = "Angle (in degrees)")
## Renaming/reordering factor levels of 'angle':
##   X0 -> 0°
##   X4 -> 4°
##   X8 -> 8°
## Renaming/reordering factor levels of 'noise':
##   absent -> Absent
##   present -> Present

As the additional output shows, changing the factor levels via factor_levels emits a message detailing old and new factor levels in the form old -> new. This message can be suppressed by wrapping the afex_plot() call into a suppressMessages() call or via RMarkdown settings. Note that we could have also used the factor_levels argument for changing the order of the factor levels by passing a named character vector (e.g., factor_levels = list(angle = c(X8 = "8°", X4 = "4°", X0 = "0°"))). This would change the order either on the x-axis or in the legend.

As said above, I am not a big fan of the default grey theme of ggplot2 plots. Consequently, we compare a number of different themes for this plot in the following. For all but ggpubr::theme_pubr(), we also move the legend to the bottom as this better allows the plot to cover only a single column in a two-column layout. ggpubr::theme_pubr() automatically plots the legend on top.

plot_grid(
  p_an + theme_bw() + theme(legend.position="bottom"),
  p_an + theme_light() + theme(legend.position="bottom"),
  p_an + theme_minimal() + theme(legend.position="bottom"),
  p_an + jtools::theme_nice() + theme(legend.position="bottom"),
  p_an + ggpubr::theme_pubr(),
  p_an + theme_cowplot() + theme(legend.position="bottom"),
  labels = "AUTO"
)  
## Registered S3 methods overwritten by 'broom':
##   method            from  
##   tidy.glht         jtools
##   tidy.summary.glht jtools

The first row, panels A to C, shows themes coming with ggplot2 and the second row, panels D to F, shows themes from additional packages. In my opinion all of these plots are an improvement above the default grey theme. For the themes coming with ggplot2, I really like that those shown here have a reference grid in the background. This often makes it easier to judge the actual values the shown data points have. I know that many people find this distracting, so many of the contributed themes do not have this grid. One thing I really like about the last two themes is that they per default use larger font sizes for the axes labels. One way to achieve something similar for most themes is to change base_size.

One general criticism I have with the current plots is that they show too many values on the y-axis. In the following I plot one more variant of this plot in which we change this to three values on the y-axis. We also increase the axes labels and remove the vertical grid lines.

p_an + 
  scale_y_continuous(breaks=seq(400, 900, length.out = 3)) +
  theme_bw(base_size = 15) + 
  theme(legend.position="bottom", 
        panel.grid.major.x = element_blank())

We can also set this theme for the reminder of the R session with theme_set().

theme_set(theme_bw(base_size = 15) + 
            theme(legend.position="bottom", 
                  panel.grid.major.x = element_blank()))

Saving Plots and Plot Sizes

To get our plot into a publication, we need to export it as a graphics file. I would generally advise against exporting plots via the RStudio interface as this is not reproducible. Instead I would use some of the following functions which save the document in the current working directory. Note that following Elsevier guidelines, a single column figure should have a width of 9 cm (~ 3 inch) and a two column figure should have a width of 19 cm (~ 7.5 inch).

For Word or similar documents I would export the plot as a png (never jpg):

ggsave("my_plot.png", device = "png", 
       width = 9, height = 8, units = "cm", 
       dpi = 600) ## the larger the dpi, the better the resolution

For LaTeX I would export as pdf:

ggsave("my_plot.pdf", device = "pdf", 
       width = 9, height = 8, units = "cm") 

Data in the Background

afex_plot() per default plots the raw data in the background. It does so using an alpha blending of 0.5. Thus, overlapping points appear darker. Examples of this can be seen in the previous graphs where some data points in the background appear clearly darker than others. The darker points indicate values for which several data points lie exactly on top of each other.

afex_plot() provides the possibility to change or alter the graphical primitive, called geom in ggplot2 parlance, used for plotting the points in the background. This offers a vast array of options for handling overlapping points or, more generally, how to display the raw data in the background. I show some of these examples in the following.

The first two variants display only points, whereas the remaining ones use different visualizations of the raw data. Note that depending on the specific variant we change a few further plot options to obtain a visually pleasing result. For example, the dodge argument controls the spread of points belonging to different levels of the trace factor at each x-axis position.

  1. Add jitter on the y-axis to points which avoids perfect overlap.
  2. Size of points show number of data points at a given y-axis position: geom_count. For this geom, adding a call to scale_size_area() can sometimes be beneficial.
  3. Violin plot: geom_violin
  4. Box plot: geom_boxplot. Note that for this plot we have added linetype = 1 to data_arg, which avoids that the outline of the box plots is affected by the linetype mapping (this is in contrast with the violin plot).
  5. Display points using a bee swarm plot, which displaces overlapping points on the x-axis: ggbeeswarm::geom_beeswarm
  6. Display points using a variant of the bee swarm plot that even works in case of many data points: ggbeeswarm::geom_quasirandom
  7. Combine box plot with jittered points: ggpol::geom_boxjitter
p1 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.3,
                data_arg = list(
                  position = 
                    ggplot2::position_jitterdodge(
                      jitter.width = 0, 
                      jitter.height = 10, 
                      dodge.width = 0.3  ## needs to be same as dodge
                    ),
                  color = "darkgrey"))
p2 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.5,
                data_geom = geom_count)
p3 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", 
                data_geom = geom_violin, 
                data_arg = list(width = 0.5))
p4 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", 
                data_geom = geom_boxplot, 
                data_arg = list(width = 0.3, linetype = 1))
p5 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.5,
                data_geom = ggbeeswarm::geom_beeswarm,
                data_arg = list(
                  dodge.width = 0.5,  ## needs to be same as dodge
                  cex = 0.8,
                  color = "darkgrey"))
p6 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.5,
                data_geom = ggbeeswarm::geom_quasirandom,
                data_arg = list(
                  dodge.width = 0.5,  ## needs to be same as dodge
                  color = "darkgrey"))
p7 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.7, 
                data_geom = ggpol::geom_boxjitter, 
                data_arg = list(
                  width = 0.5, 
                  jitter.params = list(width = 0, height = 10),
                  outlier.intersect = TRUE),
                point_arg = list(size = 2.5), 
                error_arg = list(size = 1.5, width = 0))
plot_grid(p1, p2, p3, p4, p5, p6, p7, ncol = 2, labels = 1:7)  

Adding Color to Plots

So far, all plots were shown in black and white only. However, it is easy to include color. We do so for plots 2 to 5 from above. To achieve this, we have to change the value of the mapping argument.

p2 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.5,
                mapping = c("shape", "color"),
                data_geom = ggbeeswarm::geom_beeswarm,
                data_arg = list(
                  dodge.width = 0.5,  ## needs to be same as dodge
                  cex = 0.8))
p3 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", 
                mapping = c("linetype", "shape", "fill"),
                data_geom = ggplot2::geom_violin, 
                data_arg = list(width = 0.5))
p4 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", 
                mapping = c("shape", "fill"),
                data_geom = ggplot2::geom_boxplot, 
                data_arg = list(width = 0.3))
p5 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.7,
                mapping = c("shape", "fill"),
                data_geom = ggpol::geom_boxjitter, 
                data_arg = list(
                  width = 0.5, 
                  jitter.params = list(width = 0, height = 10),
                  outlier.intersect = TRUE),
                point_arg = list(size = 2.5), 
                line_arg = list(linetype = 0),
                error_arg = list(size = 1.5, width = 0))
plot_grid(p2, p3, p4, p5, ncol = 2, labels = 2:5) 

Plotting Order and Error Bars

For graphical element in the foreground, afex_plot first plots all graphical elements belonging to the same factor level before plotting graphical elements belonging to different factor levels. This provides a consistent graphical impression for each factor level that is particularly relevant in case color is mapped.

In case we have overlapping lines and error bars or use thick lines, we sometimes do not want that the error bars also receives different line types. In this case, we can simply pass linetype = 1 to error_arg to overwrite the corresponding mapping. This is shown in the right plot.

p1 <- afex_plot(aw, x = "noise", trace = "angle", mapping = "color", 
                error = "within", 
                point_arg = list(size = 5), line_arg = list(size = 2),
                error_arg = list(size = 2))
p2 <- afex_plot(aw, x = "noise", trace = "angle", 
                mapping = c("color", "shape", "linetype"), 
                error = "within", 
                point_arg = list(size = 5), line_arg = list(size = 2),
                error_arg = list(size = 2, width = 0, linetype = 1))
plot_grid(p1, p2, ncol = 2)

One-way Plots Without Trace Factor

If afex_plot is called without a trace factor, a one-way plot is created. We can customize this plot in very much the same way. Per default a one-way plot contains a legend if mapping is not empty (i.e., ""). We show this legend for the left plot, but suppress it for the right one.

po1 <- afex_plot(aw, x = "angle", mapping = "color", error = "within", 
                 data_arg = list(),
                 point_arg = list(size = 2.5), 
                 error_arg = list(size = 1.5, width = 0.05)) 
po2 <- afex_plot(aw, x = "angle", error = "within", 
                 data_geom = ggpol::geom_boxjitter, 
                 mapping = "fill", data_alpha = 0.7, 
                 data_arg = list(
                   width = 0.6, 
                   jitter.params = list(width = 0.05, height = 10),
                   outlier.intersect = TRUE
                 ),
                 point_arg = list(size = 2.5), 
                 error_arg = list(size = 1.5, width = 0.05)) +
  theme(legend.position="none")
plot_grid(po1, po2) 

One-way plots can also be split across different panels by specifying a panel factor:

afex_plot(aw, x = "angle", panel = "noise", error = "within",
          data_geom = ggpol::geom_boxjitter,
          mapping = "fill", data_alpha = 0.7,
          data_arg = list(
            width = 0.6,
            jitter.params = list(width = 0.05, height = 10),
            outlier.intersect = TRUE
          ),
          point_arg = list(size = 2.5),
          error_arg = list(size = 1.5, width = 0.05)) +
  theme(legend.position="none")

Sometimes we still want to add a line connecting the estimated marginal means. As afex_plot returns a ggplot2 object, we can do this easily by adding a geom_line() object to the call. As we want to add a line through all of the shown points in the foreground, we need to add the corresponding groups aesthetics to this call: geom_line(aes(group = 1)). We can add further arguments to this call, as shown in the left panel below.

plot_grid(
  po1 + geom_line(aes(group = 1), color = "darkgrey", size = 1.5), 
  po2 + geom_line(aes(group = 1))
) 

3-Way Mixed Model

Data and Model

To exemplify the support for linear mixed models, we will use the data from Freeman and colleagues also discussed in the mixed model vignette. These data are lexical decision and word naming latencies for 300 words and 300 nonwords from 45 participants presented in Freeman et al. (2010). The dependent variable we are interested in is log RTs.

We look at the same model also discussed in the vignette with factors task (between participants, but within items), stimulus (within participants, but between items), density (within participants, but between items), and frequency (within participants, but between items), for a total of almost 13,000 observations. We fit the model with crossed-random effects for participants (id) and items using the final model, m9s, as discussed in the mixed model vignette.

data("fhch2010") # load 
fhch <- droplevels(fhch2010[ fhch2010$correct,]) # remove errors
m9s <- mixed(log_rt ~ task*stimulus*density*frequency + 
               (stimulus+frequency||id)+
               (task|item), fhch, method = "S", 
             control = lmerControl(optCtrl = list(maxfun = 1e6)), 
             expand_re = TRUE)

Note that going forward, we disable calculation of degrees of freedom for emmeans as this speeds up computation and/or avoids messages we are currently not interested in.

emmeans::emm_options(lmer.df = "asymptotic")

The ANOVA table of the mixed model indicates that the three-way interaction task:stimulus:frequency is significant on which we focus in the following.

m9s
## Mixed Model Anova Table (Type 3 tests, S-method)
## 
## Model: log_rt ~ task * stimulus * density * frequency + (stimulus + 
## Model:     frequency || id) + (task | item)
## Data: fhch
##                             Effect        df          F p.value
## 1                             task  1, 43.51  13.68 ***   <.001
## 2                         stimulus  1, 50.57 151.38 ***   <.001
## 3                          density 1, 584.58       0.36    .547
## 4                        frequency  1, 70.27       0.56    .456
## 5                    task:stimulus  1, 51.50  71.32 ***   <.001
## 6                     task:density 1, 578.72  17.89 ***   <.001
## 7                 stimulus:density 1, 584.60       1.19    .275
## 8                   task:frequency  1, 74.09  82.77 ***   <.001
## 9               stimulus:frequency 1, 584.78  63.29 ***   <.001
## 10               density:frequency 1, 584.62       0.11    .742
## 11           task:stimulus:density 1, 578.74  14.87 ***   <.001
## 12         task:stimulus:frequency 1, 578.91 124.16 ***   <.001
## 13          task:density:frequency 1, 578.75     5.93 *    .015
## 14      stimulus:density:frequency 1, 584.64     4.62 *    .032
## 15 task:stimulus:density:frequency 1, 578.77  11.72 ***   <.001
## ---
## Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘+’ 0.1 ‘ ’ 1

Which Data to Plot in the Background

For mixed models, one important decision is the random-effects grouping factor(s) based on which the raw data plotted in the background is aggregated. This decision is necessary, because without such a factor, there would only be one observation for each cell of the design (unless the full design is considered). In the default setting, with id missing, the combination of all random-effects grouping factor is used.

afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task") 
## Aggregating data over: item, id
## NOTE: Results may be misleading due to involvement in interactions

In the present case, a message informs us that the data is aggregated over both random-effects grouping factors. However, this leads to way too many data points in the background. Let us compare this plot with plots in which we use each of the two random-effects grouping factors in turn.

plot_grid( 
  afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", 
            id = "id"), 
  afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", 
            id = "item"), 
  labels = c("ID", "Item") 
)
## NOTE: Results may be misleading due to involvement in interactions
## NOTE: Results may be misleading due to involvement in interactions

The by-id plot looks usable. However, the by-item plot has still way too many data-points to be informative. Some other ways of displaying the raw data, such as violin plots or box plots, seems preferable for it.

Ways of Plotting Data in the Background

We compare violin plots or box plots for the by-item data in the next plot. For the box plot, we increase the width of the error bars and use a consistent line type to distinguish them more easily from the graphical elements of the box plot. We could probably further improve these plots by, for example, adding colors or using some of the other customizations discussed above for the ANOVA example.

plot_grid( 
  afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", 
            id = "item", dodge = 0.8,
            data_geom = geom_violin, 
            data_arg = list(width = 0.5)), 
  afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", 
            id = "item", dodge = 0.8,
            data_geom = geom_boxplot, 
            data_arg = list(width = 0.5),
            error_arg = list(size = 1.5, width = 0, linetype = 1))
)
## NOTE: Results may be misleading due to involvement in interactions
## NOTE: Results may be misleading due to involvement in interactions

Error Bars for Mixed Models

The default error bars for afex_plot() are based on the statistical model (i.e., the mixed model in the present case). These error bars can only be used to judge whether or not two means differ from each other, if the corresponding factor (or factors) are independent samples factors (i.e., not repeated-measures factors for any of the random-effects grouping factors). Of course, in addition to this the requirement of approximately equal sample size and variance also needs to hold. In the present case, all of the factors are repeated-measures factors with respect to one of the random-effects grouping factors. Consequently, the default error bars cannot be used for “inference by eye” for any of the factors.

This is also easy to see when looking at all pairwise comparisons between means for each of the panels/tasks. This shows that for the naming task all comparisons are significant. In visual contrast with that, the two error bars for the low versus high words are overlapping very strongly.

pairs(emmeans::emmeans(mrt, c("stimulus", "frequency"), by = "task"))
## task = naming:
##  contrast                   estimate     SE  df z.ratio p.value
##  word low - nonword low      -0.1804 0.0236 Inf  -7.637 <.0001 
##  word low - word high         0.0588 0.0149 Inf   3.941 0.0005 
##  word low - nonword high     -0.3874 0.0250 Inf -15.515 <.0001 
##  nonword low - word high      0.2392 0.0250 Inf   9.583 <.0001 
##  nonword low - nonword high  -0.2070 0.0150 Inf -13.823 <.0001 
##  word high - nonword high    -0.4462 0.0236 Inf -18.880 <.0001 
## 
## task = lexdec:
##  contrast                   estimate     SE  df z.ratio p.value
##  word low - nonword low      -0.0812 0.0235 Inf  -3.461 0.0030 
##  word low - word high         0.0635 0.0167 Inf   3.807 0.0008 
##  word low - nonword high      0.0297 0.0245 Inf   1.213 0.6188 
##  nonword low - word high      0.1447 0.0245 Inf   5.910 <.0001 
##  nonword low - nonword high   0.1109 0.0167 Inf   6.619 <.0001 
##  word high - nonword high    -0.0339 0.0233 Inf  -1.451 0.4676 
## 
## Results are averaged over the levels of: density 
## Degrees-of-freedom method: asymptotic 
## P value adjustment: tukey method for comparing a family of 4 estimates

An alternative in the present situation would be using within-subjects error bars and aggregating the data by-id (i.e., error = "within"), as done in the left panel below. This is somewhat appropriate here as the factors within each panel are all within-subject factors. In contrast, using by-item within-subjects error bars, as done in the right panel below, seems not appropriate as the only within-item factor, task, is spread across panels. Unfortunately, it is not immediately clear if these error bars allow one to correctly detect, which means do not differ from each other.

plot_grid( 
  afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", 
            id = "id", error = "within"),
  afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", 
            id = "item", dodge = 0.8, error = "within",
            data_geom = geom_violin, 
            data_arg = list(width = 0.5))
)
## NOTE: Results may be misleading due to involvement in interactions
## NOTE: Results may be misleading due to involvement in interactions

In sum, using error bars for performing “inference by eye” - that is, using overlap or non-overlap of error bars to judge which means differ or do not differ from each other - is highly problematic for mixed models, due to the potentially complex dependency structures between the means. It would be best to avoid comparisons between means altogether. Instead, it is perhaps a good idea to plot the model-based error bars (which is the default) and use them for their intended purpose; judging which values of the estimated means are likely given what we have learned from the model (however, note that one cannot interpret a 95% confidence interval as having a 95% probability of containing the population mean).

The help page ?afex_plot contains further information and references on how to interpret confidence intervals and other error bars.

References

  • Freeman, E., Heathcote, A., Chalmers, K., & Hockley, W. (2010). Item effects in recognition memory for words. Journal of Memory and Language, 62(1), 1-18. https://doi.org/10.1016/j.jml.2009.09.004
  • Maxwell, S. E., & Delaney, H. D. (2004). Designing Experiments and Analyzing Data: A Model-Comparisons Perspective. Mahwah, N.J.: Lawrence Erlbaum Associates.
afex/inst/doc/afex_plot_supported_models.Rmd0000644000176200001440000004456114076011252021024 0ustar liggesusers--- title: "afex_plot: Supported Models" author: "Henrik Singmann" date: "`r Sys.Date()`" show_toc: true output: knitr:::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{afex_plot: Supported Models} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r, echo=FALSE} req_suggested_packages <- c("emmeans", "ggplot2", "cowplot", "ggbeeswarm", "ggpol", "nlme", "glmmTMB", "rstanarm", "brms", "MEMSS") pcheck <- lapply(req_suggested_packages, requireNamespace, quietly = TRUE) if (any(!unlist(pcheck))) { message("Required package(s) for this vignette are not available/installed and code will not be executed.") knitr::opts_chunk$set(eval = FALSE) } ``` ```{r set-options, echo=FALSE, cache=FALSE} options(width = 90) knitr::opts_chunk$set(dpi=72) knitr::knit_hooks$set(document = function(x){ gsub("```\n*```r*\n*", "", x) }) ``` # Introduction `afex_plot()` visualizes results from factorial experiments and, more generally, data set with interactions of categorical/factor variables. It does so by combining estimated marginal means and uncertainties associated with these means in the foreground with a depiction of the raw data in the background. If models include continuous covariates, other approaches are recommended (e.g., such as implemented in package [`effects`](https://cran.r-project.org/package=effects) or by using the possibility of `afex_plot` [to return the data and build the plot on ones own](https://github.com/singmann/afex/issues/65)). This document provides an overview of the different models supported by `afex_plot()` in addition to the `afex` objects (i.e., `afex_aov` and `mixed`). In general, these are models which are supported by the [`emmeans`](https://cran.r-project.org/package=emmeans) package as the `afex_plot.default()` method uses `emmeans` to get the estimated marginal means. `afex_plot.default()` then guesses whether there are repeated measures or all samples are independent. Based on this guess (which can be changed via the `id` argument) data in the background is plotted. Calculation of error bars can also be based on this guess (but the default is to plot the model based error bars obtained from `emmeans`). For a generally introduction to the functionality of `afex_plot` see: [`afex_plot`: Publication Ready Plots for Experimental Designs](afex_plot_introduction.html) Throughout the document, we will need `afex` as well as `ggplot2`. In addition, we load [`cowplot`](https://cran.r-project.org/package=cowplot) for function `plot_grid()` (which allows to easily combine multiple `ggplot2` plots). In addition, we will set a somewhat nicer `ggplot2` theme. ```{r message=FALSE, warning=FALSE} library("afex") library("ggplot2") library("cowplot") theme_set(theme_bw(base_size = 14) + theme(legend.position="bottom", panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank())) ``` Importantly, we also set the contrasts for the current `R` session to sum-to-zero contrasts. For models that include interactions with categorical variables this generally produces estimates that are easier to interpret. ```{r} set_sum_contrasts() ``` Please note, the best way to export a figure is via `ggsave()` or a similar function call. For Word and similar document formats, `png` is a good file type, for `LaTeX` and similar document formats, `pdf` is a good file type. # Base R stats models: lm, glm `afex_plot()` generally supports models implemeneted via the `stats` package. Here I show the main model functions that work with independent samples. These models can be passed to `afex_plot` without specifying additional arguments. Most importantly, `lm` models work directly. For those we use the `warpbreaks` data. ```{r} warp.lm <- lm(breaks ~ wool * tension, data = warpbreaks) ``` Note that `afex_plot` produces several messages that are shown here as comments below the corresponding calls. Important is maybe that `afex_plot` assumes all observations (i.e., rows) are independent. This is of course the case here. In addition, for the first plot we are informed that the presence of an interaction may lead to a misleading impression if only a lower-order effect (here a main effect) is shown. This message is produced by `emmeans` and passed through. ```{r fig.width=7, fig.height=3} p1 <- afex_plot(warp.lm, "tension") p2 <- afex_plot(warp.lm, "tension", "wool") plot_grid(p1, p2) ``` `glm` models also work without further setting. Here we first use a poisson GLM for which we need to generate the data. ```{r} ins <- data.frame( n = c(500, 1200, 100, 400, 500, 300), size = factor(rep(1:3,2), labels = c("S","M","L")), age = factor(rep(1:2, each = 3)), claims = c(42, 37, 1, 101, 73, 14)) ``` We can then fit the data and pass the model object as is. ```{r fig.width=3, fig.height=3} ins.glm <- glm(claims ~ size + age + offset(log(n)), data = ins, family = "poisson") afex_plot(ins.glm, "size", "age") ``` `afex_plot` also works with binomial GLMs for which we also first need to generate some data which we will then fit. ```{r} ## binomial glm adapted from ?predict.glm ldose <- factor(rep(0:5, 2)) numdead <- c(1, 4, 9, 13, 18, 20, 0, 2, 6, 10, 12, 16) sex <- factor(rep(c("M", "F"), c(6, 6))) SF <- numdead/20 ## dv should be a vector, no matrix budworm.lg <- glm(SF ~ sex*ldose, family = binomial, weights = rep(20, length(numdead))) ``` For this model, we will produce three plots we can then compare. The first only shows the main effect of one variable (`ldose`). The other show the interaction of the two variables. Because for binomial GLMs we then only have one data point (with several observations), the individual data points and mean cannot be distinguished. This is made clear in the ther two (panels B and C). ```{r fig.width=8, fig.height=3} a <- afex_plot(budworm.lg, "ldose") b <- afex_plot(budworm.lg, "ldose", "sex") ## data point is hidden behind mean! c <- afex_plot(budworm.lg, "ldose", "sex", data_arg = list(size = 4, color = "red")) plot_grid(a, b, c, labels = "AUTO", nrow = 1) ``` # nlme mixed model Hot to use `afex_plot` for mixed models fitted with `afex::mixed` (or [`lme4`](https://cran.r-project.org/package=lme4) directly) is shown in the [other vignette](afex_plot_introduction.html). However, we can also use `afex_plot` for mixed models fitted with the older `nlme` package. For this, however we need to pass the data used for fitting via the `data` argument. We can change on which of the two nested factors the individual data points in the background are based via the `id` argument. This is shown below. ```{r fig.width=8, fig.height=6} ## nlme mixed model data(Oats, package = "nlme") Oats$nitro <- factor(Oats$nitro) oats.1 <- nlme::lme(yield ~ nitro * Variety, random = ~ 1 | Block / Variety, data = Oats) plot_grid( afex_plot(oats.1, "nitro", "Variety", data = Oats), # A afex_plot(oats.1, "nitro", "Variety", data = Oats), # B afex_plot(oats.1, "nitro", "Variety", data = Oats, id = "Block"), # C afex_plot(oats.1, "nitro", data = Oats), # D afex_plot(oats.1, "nitro", data = Oats, id = c("Block", "Variety")), # E afex_plot(oats.1, "nitro", data = Oats, id = "Block"), # F labels = "AUTO" ) ``` # glmmTMB Support for [`glmmTMB`](https://cran.r-project.org/package=glmmTMB) is also provided. Here we use an example data set for which we model zero-inflation as well as overdispersion. The latter is achieved with a variant of the negative binomial distribution. ```{r, eval=FALSE} library("glmmTMB") tmb <- glmmTMB(count~spp * mined + (1|site), ziformula = ~spp * mined, family=nbinom2, Salamanders) ``` ```{r, eval=FALSE, include=FALSE} library("glmmTMB") set_sum_contrasts() tmb <- glmmTMB(count~spp * mined + (1|site), ziformula = ~spp * mined, family=nbinom2, Salamanders) save(tmb, file = "inst/extdata/tmb_example_fit.rda", compress = "xz") ``` ```{r, echo=FALSE, include=FALSE} library("glmmTMB") data(Salamanders, package = "glmmTMB") load(system.file("extdata/", "tmb_example_fit.rda", package = "afex")) ``` `afex_plot` does not automatically detect the random-effect for `site`. This means that per default all 644 data points are shown. When plotting only one variable, in which the default `data_geom` is `ggbeeswarm::geom_beeswarm`, this can lead to rather ugly plots due to the zero inflation. This is shon in panel A below. In panel B, we address this by changing the geom to a violin plot. In panel C, we address this by aggregating the data within site, but still use the beeswarm plot. Note that for panel C it is necessary to pass the data via the `data` argument as otherwise `site` cannot be found for aggregation. ```{r fig.width=8, fig.height=3} plot_grid( afex_plot(tmb, "spp"), afex_plot(tmb, "spp", data_geom = geom_violin), afex_plot(tmb, "spp", id = "site", data = Salamanders), labels = "AUTO", nrow = 1 ) ``` When plotting both variables, the problem is somewhat hidden, because instead of beeswarm plots, semi-transparency (i.e., `alpha` < 1) is used to show overlapping points. In panel B we again make this clearer but this time by adding jitter (on both the y- and x-axis) and increasing the degree of semi-transparancy (i.e., decreasing alpha). ```{r fig.width=8.5, fig.height=3.5} a <- afex_plot(tmb, "spp", "mined") b <- afex_plot(tmb, "spp", "mined", data_alpha = 0.3, data_arg = list( position = ggplot2::position_jitterdodge( jitter.width = 0.2, jitter.height = 0.5, dodge.width = 0.5 ## needs to be same as dodge ), color = "darkgrey")) plot_grid(a, b, labels = "AUTO") ``` For the final plot we also plot the interaction, but this time aggregate the individual-data within site. This allows us again to use a beeswarm plot (after decreasing the width of the "bees") and produces a relatively clear result. ```{r fig.width=5.5, fig.height=3.5} afex_plot(tmb, "spp", "mined", id = "site", data = Salamanders, data_geom = ggbeeswarm::geom_beeswarm, data_arg = list(dodge.width = 0.5, cex = 0.4, color = "darkgrey") ) ``` # rstanarm `afex_plot()` also supports Bayesian models that are also supported via `emmeans`. For example, we can easily fit a binomial model with [`rstanarm`](https://cran.r-project.org/package=rstanarm). ```{r, eval=FALSE} library("rstanarm") ## requires resetting the ggplot2 theme theme_set(theme_bw(base_size = 14) + theme(legend.position="bottom", panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank())) cbpp <- lme4::cbpp cbpp$prob <- with(cbpp, incidence / size) example_model <- stan_glmer(prob ~ period + (1|herd), data = cbpp, family = binomial, weight = size, chains = 2, cores = 1, seed = 12345, iter = 500) ``` We can directly pass this model to `afex_plot`. However, we also see quite some zeros leading to a not super nice plot. It looks a bit better using a violin plot for the raw data. ```{r, eval=FALSE} b1 <- afex_plot(example_model, "period") ## dv column detected: prob ## No id column passed. Assuming all rows are independent samples. b2 <- afex_plot(example_model, "period", data_geom = geom_violin) ## dv column detected: prob ## No id column passed. Assuming all rows are independent samples. plot_grid(b1, b2, labels = "AUTO") ``` ```{r fig.width=7, fig.height=3, echo=FALSE} load(system.file("extdata/", "plots_rstanarm.rda", package = "afex")) plot_grid(b1, b2, labels = "AUTO") ``` We can also produce a plot based on the individual Bernoulli observations in the data. For this, we first need to expand the data such that we have one row per observation. With this, we can then fit the essentially same model as above. ```{r, eval=FALSE} cbpp_l <- vector("list", nrow(cbpp)) for (i in seq_along(cbpp_l)) { cbpp_l[[i]] <- data.frame( herd = cbpp$herd[i], period = cbpp$period[i], incidence = rep(0, cbpp$size[i]) ) cbpp_l[[i]]$incidence[seq_len(cbpp$incidence[i])] <- 1 } cbpp_l <- do.call("rbind", cbpp_l) cbpp_l$herd <- factor(cbpp_l$herd, levels = levels(cbpp$herd)) cbpp_l$period <- factor(cbpp_l$period, levels = levels(cbpp$period)) example_model2 <- stan_glmer(incidence ~ period + (1|herd), data = cbpp_l, family = binomial, chains = 2, cores = 1, seed = 12345, iter = 500) ``` Again, this model can be directly passed to `afex_plot`. However, here we see even more 0 as the data is not yet aggregated. Consequently, we need to pass `id = "herd"` to aggregate the individual observations within each herd. ```{r, eval=FALSE} b3 <- afex_plot(example_model2, "period") ## dv column detected: incidence ## No id column passed. Assuming all rows are independent samples. b4 <- afex_plot(example_model2, "period", id = "herd") ## dv column detected: incidence plot_grid(b3, b4, labels = "AUTO") ``` ```{r fig.width=7, fig.height=3, echo=FALSE} plot_grid(b3, b4, labels = "AUTO") ``` We can of course also fit a model assuming a normal distribution using `rstanarm`. For example using the `Machines` data. ```{r, eval=FALSE} data("Machines", package = "MEMSS") mm <- stan_lmer(score ~ Machine + (Machine|Worker), data=Machines, chains = 2, cores = 1, seed = 12345, iter = 500) ``` As before, we can pass this model directly to `afex_plot` (see panel A). However, the data is again not aggregated within the grouping variable `Worker`. If we want to aggregate the individual data points for the grouping factor, we need to pass both the name of the grouping variable (`Worker`) and the data used for fitting. ```{r, eval=FALSE} b5 <- afex_plot(mm, "Machine") ## dv column detected: score ## No id column passed. Assuming all rows are independent samples. b6 <- afex_plot(mm, "Machine", id = "Worker") ## dv column detected: score plot_grid(b5, b6, labels = "AUTO") ``` ```{r fig.width=7, fig.height=3, echo=FALSE} plot_grid(b5, b6, labels = "AUTO") ``` ```{r, eval=FALSE, include=FALSE} library("rstanarm") ## requires resetting the ggplot2 theme library("ggplot2") theme_set(theme_bw(base_size = 14) + theme(legend.position="bottom", panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank())) set_sum_contrasts() cbpp <- lme4::cbpp cbpp$prob <- with(cbpp, incidence / size) example_model <- stan_glmer(prob ~ period + (1|herd), data = cbpp, family = binomial, weight = size, chains = 2, cores = 1, seed = 12345, iter = 500) b1 <- afex_plot(example_model, "period") b2 <- afex_plot(example_model, "period", data_geom = geom_violin) cbpp_l <- vector("list", nrow(cbpp)) for (i in seq_along(cbpp_l)) { cbpp_l[[i]] <- data.frame( herd = cbpp$herd[i], period = cbpp$period[i], incidence = rep(0, cbpp$size[i]) ) cbpp_l[[i]]$incidence[seq_len(cbpp$incidence[i])] <- 1 } cbpp_l <- do.call("rbind", cbpp_l) cbpp_l$herd <- factor(cbpp_l$herd, levels = levels(cbpp$herd)) cbpp_l$period <- factor(cbpp_l$period, levels = levels(cbpp$period)) example_model2 <- stan_glmer(incidence ~ period + (1|herd), data = cbpp_l, family = binomial, chains = 2, cores = 1, seed = 12345, iter = 500) b3 <- afex_plot(example_model2, "period") b4 <- afex_plot(example_model2, "period", id = "herd") data("Machines", package = "MEMSS") mm <- stan_lmer(score ~ Machine + (Machine|Worker), data=Machines, chains = 2, cores = 1, seed = 12345, iter = 500) b5 <- afex_plot(mm, "Machine") b6 <- afex_plot(mm, "Machine", id = "Worker", data = Machines) save(b1, b2, b3, b4, b5, b6, file = "../inst/extdata/plots_rstanarm.rda", compress = "xz", version = 2) ``` # brms We can also fit the `Machines` data using [`brms`](https://cran.r-project.org/package=brms). ```{r, eval=FALSE} library("brms") data("Machines", package = "MEMSS") mm2 <- brm(score ~ Machine + (Machine|Worker), data=Machines, chains = 2, cores = 1, seed = 12345, iter = 500) ``` However, to pass a `brms` object to `afex_plot` we need to pass both, the `data` used for fitting as well as the name of the dependent variable (here `score`) via the `dv` argument. We again build the plot such that the left panel shows the raw data without aggregation and the right panel shows the data aggregated within the grouping factor `Worker`. ```{r, eval=FALSE} bb1 <- afex_plot(mm2, "Machine", data = Machines, dv = "score") ## No id column passed. Assuming all rows are independent samples. bb2 <- afex_plot(mm2, "Machine", id = "Worker", data = Machines, dv = "score") plot_grid(bb1, bb2) ``` ```{r fig.width=7, fig.height=3, echo=FALSE} load(system.file("extdata/", "plots_brms.rda", package = "afex")) plot_grid(bb1, bb2) ``` ```{r, eval=FALSE, include=FALSE} library("brms") data("Machines", package = "MEMSS") mm2 <- brm(score ~ Machine + (Machine|Worker), data=Machines, chains = 2, cores = 1, seed = 12345, iter = 500) bb1 <- afex_plot(mm2, "Machine", data = Machines, dv = "score") bb2 <- afex_plot(mm2, "Machine", id = "Worker", data = Machines, dv = "score") save(bb1, bb2, file = "../inst/extdata/plots_brms.rda", version = 2) ``` # Not Yet Supported: GLMMadaptive Some models are unfortunately not yet supported. For example, models fit with the new and pretty cool looking [`GLMMadaptive`](https://cran.r-project.org/package=GLMMadaptive) package using some of the special families do not seem to produce reasonable results. The following unfortunately does not produce a reasonable plot. ```{r fig.width=4, fig.height=3, eval = FALSE} library("GLMMadaptive") data(Salamanders, package = "glmmTMB") gm1 <- mixed_model(count~spp * mined, random = ~ 1 | site, data = Salamanders, family = zi.poisson(), zi_fixed = ~ mined) afex_plot(gm1, "spp", data = Salamanders) ``` afex/inst/doc/afex_plot_introduction.R0000644000176200001440000003106114076067220017631 0ustar liggesusers## ----echo=FALSE--------------------------------------------------------------- req_suggested_packages <- c("emmeans", "ggplot2", "cowplot", "ggbeeswarm", "ggpol") pcheck <- lapply(req_suggested_packages, requireNamespace, quietly = TRUE) if (any(!unlist(pcheck))) { message("Required package(s) for this vignette are not available/installed and code will not be executed.") knitr::opts_chunk$set(eval = FALSE) } ## ----set-options, echo=FALSE, cache=FALSE----------------------------------------------- op <- options(width = 90) knitr::opts_chunk$set(dpi=72) ## ----message=FALSE, warning=FALSE------------------------------------------------------- library("afex") library("ggplot2") library("cowplot") theme_set(theme_grey()) ## --------------------------------------------------------------------------------------- data(md_12.1) (aw <- aov_ez("id", "rt", md_12.1, within = c("angle", "noise"))) ## ----fig.width=9, fig.height=4---------------------------------------------------------- p_an <- afex_plot(aw, x = "angle", trace = "noise") p_na <- afex_plot(aw, x = "noise", trace = "angle") plot_grid(p_an, p_na) ## try adding: labels = "AUTO" ## --------------------------------------------------------------------------------------- p_an <- afex_plot(aw, x = "angle", trace = "noise", error = "within", factor_levels = list(angle = c("0°", "4°", "8°"), noise = c("Absent", "Present")), legend_title = "Noise") + labs(y = "RTs (in ms)", x = "Angle (in degrees)") ## ----fig.width=8.5, fig.height=6, dpi = 150--------------------------------------------- plot_grid( p_an + theme_bw() + theme(legend.position="bottom"), p_an + theme_light() + theme(legend.position="bottom"), p_an + theme_minimal() + theme(legend.position="bottom"), p_an + jtools::theme_nice() + theme(legend.position="bottom"), p_an + ggpubr::theme_pubr(), p_an + theme_cowplot() + theme(legend.position="bottom"), labels = "AUTO" ) ## ----fig.width=3.5, fig.height=3, dpi = 100, out.width='50%'---------------------------- p_an + scale_y_continuous(breaks=seq(400, 900, length.out = 3)) + theme_bw(base_size = 15) + theme(legend.position="bottom", panel.grid.major.x = element_blank()) ## --------------------------------------------------------------------------------------- theme_set(theme_bw(base_size = 15) + theme(legend.position="bottom", panel.grid.major.x = element_blank())) ## ---- eval=FALSE------------------------------------------------------------------------ # ggsave("my_plot.png", device = "png", # width = 9, height = 8, units = "cm", # dpi = 600) ## the larger the dpi, the better the resolution ## ---- eval=FALSE------------------------------------------------------------------------ # ggsave("my_plot.pdf", device = "pdf", # width = 9, height = 8, units = "cm") ## ----fig.width=8.5, fig.height=16, dpi = 125-------------------------------------------- p1 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.3, data_arg = list( position = ggplot2::position_jitterdodge( jitter.width = 0, jitter.height = 10, dodge.width = 0.3 ## needs to be same as dodge ), color = "darkgrey")) p2 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.5, data_geom = geom_count) p3 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", data_geom = geom_violin, data_arg = list(width = 0.5)) p4 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", data_geom = geom_boxplot, data_arg = list(width = 0.3, linetype = 1)) p5 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.5, data_geom = ggbeeswarm::geom_beeswarm, data_arg = list( dodge.width = 0.5, ## needs to be same as dodge cex = 0.8, color = "darkgrey")) p6 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.5, data_geom = ggbeeswarm::geom_quasirandom, data_arg = list( dodge.width = 0.5, ## needs to be same as dodge color = "darkgrey")) p7 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.7, data_geom = ggpol::geom_boxjitter, data_arg = list( width = 0.5, jitter.params = list(width = 0, height = 10), outlier.intersect = TRUE), point_arg = list(size = 2.5), error_arg = list(size = 1.5, width = 0)) plot_grid(p1, p2, p3, p4, p5, p6, p7, ncol = 2, labels = 1:7) ## ----fig.width=8.5, fig.height=8, dpi = 125--------------------------------------------- p2 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.5, mapping = c("shape", "color"), data_geom = ggbeeswarm::geom_beeswarm, data_arg = list( dodge.width = 0.5, ## needs to be same as dodge cex = 0.8)) p3 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", mapping = c("linetype", "shape", "fill"), data_geom = ggplot2::geom_violin, data_arg = list(width = 0.5)) p4 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", mapping = c("shape", "fill"), data_geom = ggplot2::geom_boxplot, data_arg = list(width = 0.3)) p5 <- afex_plot(aw, x = "noise", trace = "angle", error = "within", dodge = 0.7, mapping = c("shape", "fill"), data_geom = ggpol::geom_boxjitter, data_arg = list( width = 0.5, jitter.params = list(width = 0, height = 10), outlier.intersect = TRUE), point_arg = list(size = 2.5), line_arg = list(linetype = 0), error_arg = list(size = 1.5, width = 0)) plot_grid(p2, p3, p4, p5, ncol = 2, labels = 2:5) ## ----fig.width=8.5, fig.height=4, dpi = 150--------------------------------------------- p1 <- afex_plot(aw, x = "noise", trace = "angle", mapping = "color", error = "within", point_arg = list(size = 5), line_arg = list(size = 2), error_arg = list(size = 2)) p2 <- afex_plot(aw, x = "noise", trace = "angle", mapping = c("color", "shape", "linetype"), error = "within", point_arg = list(size = 5), line_arg = list(size = 2), error_arg = list(size = 2, width = 0, linetype = 1)) plot_grid(p1, p2, ncol = 2) ## ----fig.width=7, fig.height=3.5, message=FALSE----------------------------------------- po1 <- afex_plot(aw, x = "angle", mapping = "color", error = "within", data_arg = list(), point_arg = list(size = 2.5), error_arg = list(size = 1.5, width = 0.05)) po2 <- afex_plot(aw, x = "angle", error = "within", data_geom = ggpol::geom_boxjitter, mapping = "fill", data_alpha = 0.7, data_arg = list( width = 0.6, jitter.params = list(width = 0.05, height = 10), outlier.intersect = TRUE ), point_arg = list(size = 2.5), error_arg = list(size = 1.5, width = 0.05)) + theme(legend.position="none") plot_grid(po1, po2) ## ----fig.width=7, fig.height=3.5, message=FALSE----------------------------------------- afex_plot(aw, x = "angle", panel = "noise", error = "within", data_geom = ggpol::geom_boxjitter, mapping = "fill", data_alpha = 0.7, data_arg = list( width = 0.6, jitter.params = list(width = 0.05, height = 10), outlier.intersect = TRUE ), point_arg = list(size = 2.5), error_arg = list(size = 1.5, width = 0.05)) + theme(legend.position="none") ## ----fig.width=7, fig.height=3.5, message=FALSE----------------------------------------- plot_grid( po1 + geom_line(aes(group = 1), color = "darkgrey", size = 1.5), po2 + geom_line(aes(group = 1)) ) ## ---- echo=FALSE------------------------------------------------------------------------ load(system.file("extdata/", "output_afex_plot_mixed_vignette.rda", package = "afex")) ## ---- eval=FALSE------------------------------------------------------------------------ # data("fhch2010") # load # fhch <- droplevels(fhch2010[ fhch2010$correct,]) # remove errors # m9s <- mixed(log_rt ~ task*stimulus*density*frequency + # (stimulus+frequency||id)+ # (task|item), fhch, method = "S", # control = lmerControl(optCtrl = list(maxfun = 1e6)), # expand_re = TRUE) ## --------------------------------------------------------------------------------------- emmeans::emm_options(lmer.df = "asymptotic") ## ---- eval=FALSE------------------------------------------------------------------------ # m9s ## ---- echo=FALSE------------------------------------------------------------------------ cat(aout_1$output, sep = "\n") ## ----fig.width=7, fig.height=3.5, eval=FALSE-------------------------------------------- # afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task") ## ----fig.width=7, fig.height=3.5, echo=FALSE-------------------------------------------- message("Aggregating data over: item, id") message("NOTE: Results may be misleading due to involvement in interactions") ap1 ## ----fig.width=7, fig.height=3.5, eval=FALSE-------------------------------------------- # plot_grid( # afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", # id = "id"), # afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", # id = "item"), # labels = c("ID", "Item") # ) ## ----fig.width=7, fig.height=3.5, echo=FALSE-------------------------------------------- message("NOTE: Results may be misleading due to involvement in interactions") message("NOTE: Results may be misleading due to involvement in interactions") plot_grid( ap2a, ap2b, labels = c("ID", "Item") ) ## ----fig.width=7, fig.height=3.5, eval=FALSE-------------------------------------------- # plot_grid( # afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", # id = "item", dodge = 0.8, # data_geom = geom_violin, # data_arg = list(width = 0.5)), # afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", # id = "item", dodge = 0.8, # data_geom = geom_boxplot, # data_arg = list(width = 0.5), # error_arg = list(size = 1.5, width = 0, linetype = 1)) # ) ## ----fig.width=7, fig.height=3.5, echo=FALSE-------------------------------------------- message("NOTE: Results may be misleading due to involvement in interactions") message("NOTE: Results may be misleading due to involvement in interactions") plot_grid(ap3a, ap3b) ## ---- eval=FALSE------------------------------------------------------------------------ # pairs(emmeans::emmeans(mrt, c("stimulus", "frequency"), by = "task")) ## ---- echo=FALSE------------------------------------------------------------------------ cat(aout_2$output, sep = "\n") ## ----fig.width=7, fig.height=3.5, eval=FALSE-------------------------------------------- # plot_grid( # afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", # id = "id", error = "within"), # afex_plot(m9s, x = "stimulus", trace = "frequency", panel = "task", # id = "item", dodge = 0.8, error = "within", # data_geom = geom_violin, # data_arg = list(width = 0.5)) # ) ## ----fig.width=7, fig.height=3.5, echo=FALSE-------------------------------------------- message("NOTE: Results may be misleading due to involvement in interactions") message("NOTE: Results may be misleading due to involvement in interactions") plot_grid(ap4a, ap4b) ## ---- include=FALSE----------------------------------------------------------- options(op) afex/inst/doc/afex_anova_example.R0000644000176200001440000001313514076067157016704 0ustar liggesusers## ----echo=FALSE--------------------------------------------------------------- req_suggested_packages <- c("emmeans", "multcomp", "ggplot2") pcheck <- lapply(req_suggested_packages, requireNamespace, quietly = TRUE) if (any(!unlist(pcheck))) { message("Required package(s) for this vignette are not available/installed and code will not be executed.") knitr::opts_chunk$set(eval = FALSE) } ## ----set-options, echo=FALSE, cache=FALSE----------------------------------------------- op <- options(width = 90) knitr::opts_chunk$set(dpi=72) ## ----message=FALSE, warning=FALSE------------------------------------------------------- library("afex") # needed for ANOVA functions. library("emmeans") # emmeans must now be loaded explicitly for follow-up tests. library("multcomp") # for advanced control for multiple testing/Type 1 errors. library("ggplot2") # for customizing plots. ## --------------------------------------------------------------------------------------- data(sk2011.1) str(sk2011.1) ## --------------------------------------------------------------------------------------- with(sk2011.1, table(inference, id, plausibility)) ## --------------------------------------------------------------------------------------- a1 <- aov_ez("id", "response", sk2011.1, between = "instruction", within = c("inference", "plausibility")) a1 # the default print method prints a data.frame produced by nice ## ---- eval=FALSE------------------------------------------------------------------------ # aov_car(response ~ instruction + Error(id/inference*plausibility), sk2011.1) # aov_4(response ~ instruction + (inference*plausibility|id), sk2011.1) ## ---- results='asis'-------------------------------------------------------------------- knitr::kable(nice(a1)) ## ---- results='asis'-------------------------------------------------------------------- print(xtable::xtable(anova(a1), digits = c(rep(2, 5), 3, 4)), type = "html") ## --------------------------------------------------------------------------------------- m1 <- emmeans(a1, ~ inference) m1 ## --------------------------------------------------------------------------------------- pairs(m1) ## --------------------------------------------------------------------------------------- summary(as.glht(pairs(m1)), test=adjusted("free")) ## --------------------------------------------------------------------------------------- m2 <- emmeans(a1, "inference", by = "instruction") ## equal: emmeans(a1, ~ inference|instruction) m2 ## --------------------------------------------------------------------------------------- pairs(m2) ## --------------------------------------------------------------------------------------- m3 <- emmeans(a1, c("inference", "instruction")) ## equal: emmeans(a1, ~inference*instruction) m3 pairs(m3) ## --------------------------------------------------------------------------------------- c1 <- list( v_i.ded = c(0.5, 0.5, -0.5, -0.5, 0, 0, 0, 0), v_i.prob = c(0, 0, 0, 0, 0.5, 0.5, -0.5, -0.5) ) contrast(m3, c1, adjust = "holm") summary(as.glht(contrast(m3, c1)), test = adjusted("free")) ## ----fig.width=7.5, fig.height=4-------------------------------------------------------- afex_plot(a1, x = "inference", trace = "instruction", panel = "plausibility") ## ----fig.width=7.5, fig.height=4-------------------------------------------------------- afex_plot(a1, x = "inference", trace = "instruction", panel = "plausibility", error = "within") ## ----fig.width=7.5, fig.height=4-------------------------------------------------------- afex_plot(a1, x = "inference", trace = "instruction", panel = "plausibility", error = "none") ## ----fig.width=7.5, fig.height=4-------------------------------------------------------- p1 <- afex_plot(a1, x = "inference", trace = "instruction", panel = "plausibility", error = "none", mapping = c("color", "fill"), data_geom = geom_boxplot, data_arg = list(width = 0.4), point_arg = list(size = 1.5), line_arg = list(size = 1)) p1 ## ----fig.width=7.5, fig.height=4-------------------------------------------------------- p1 + theme_light() ## --------------------------------------------------------------------------------------- theme_set(theme_light()) ## --------------------------------------------------------------------------------------- a2 <- aov_ez("id", "response", sk2011.1, between = "instruction", within = c("validity", "plausibility", "what")) a2 ## ----fig.width=7.5, fig.height=4-------------------------------------------------------- afex_plot(a2, x = c("plausibility", "validity"), trace = "instruction", panel = "what", error = "none") ## --------------------------------------------------------------------------------------- (m4 <- emmeans(a2, ~instruction+plausibility+validity|what)) c2 <- list( diff_1 = c(1, -1, 0, 0, 0, 0, 0, 0), diff_2 = c(0, 0, 1, -1, 0, 0, 0, 0), diff_3 = c(0, 0, 0, 0, 1, -1, 0, 0), diff_4 = c(0, 0, 0, 0, 0, 0, 1, -1), val_ded = c(0.5, 0, 0.5, 0, -0.5, 0, -0.5, 0), val_prob = c(0, 0.5, 0, 0.5, 0, -0.5, 0, -0.5), plau_ded = c(0.5, 0, -0.5, 0, -0.5, 0, 0.5, 0), plau_prob = c(0, 0.5, 0, -0.5, 0, 0.5, 0, -0.5) ) contrast(m4, c2, adjust = "holm") ## --------------------------------------------------------------------------------------- summary(as.glht(contrast(m4, c2)), test = adjusted("free")) ## ---- include=FALSE----------------------------------------------------------- options(op) afex/inst/doc/assumptions_of_ANOVAs.Rmd0000644000176200001440000002644114076011252017550 0ustar liggesusers--- title: "Testing the Assumptions of ANOVAs" author: "Mattan S. Ben-Shachar" date: "`r Sys.Date()`" show_toc: true output: knitr:::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Testing the Assumptions of ANOVAs} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r echo=FALSE} req_suggested_packages <- c("see", "performance", "ggplot2") pcheck <- lapply(req_suggested_packages, requireNamespace, quietly = TRUE) if (any(!unlist(pcheck))) { message("Required package(s) for this vignette are not available/installed and code will not be executed.") knitr::opts_chunk$set(eval = FALSE) } ``` ```{r set-options, echo=FALSE, cache=FALSE} options(width = 90) knitr::opts_chunk$set(dpi=72) ``` ## Foreword by Henrik Singmann As all statistical models, ANOVAs have a number of assumptions that should hold for valid inferences. These assumptions are: 1. **Observations are i.i.d.:** i.i.d. stands for "independent and identically distributed". Independent means that, once the model is specified, the conditional observations (i.e., residuals) are independent of each other (i.e., knowing the value of one residual does not allow you to infer the value of any other residual). Identically distributed means that all observations are generated by the same data-generating process. 1. ***Homogeneity of Variances***: the variances across all the groups (cells) of between-subject effects are the same. 2. ***Sphericity***: For within-subjects effects, sphericity is the condition where the variances of the differences between all possible pairs of within-subject conditions (i.e., levels of the independent variable) are equal. This can be thought of as a within-subjects' version of the *Homogeneity of Variances* assumption. 3. ***Normality of residuals***: The errors used for the estimation of the error term(s) (*MSE*) are normally distributed. The most important assumption generally is the i.i.d. assumption (i.e., if it does not hold, the inferences are likely invalid), specifically the independent part. This assumption cannot be tested empirically but needs to hold on conceptual or logical grounds. For example, in an ideal completely between-subjects design each observation comes from a different participant that is randomly sampled from a population so we know that all observations are independent. Often, we collect multiple observations from the same participant in a within-subject or repeated-measures design. To ensure the i.i.d. assumption holds in this case, we need to specify an ANOVA with within-subject factors. However, if we have a data set with multiple sources of non-independence -- such as participants and items -- ANOVA models cannot be used but we have to use a mixed model. The other assumptions can be tested empirically, either graphically or using statistical assumption tests. However, there are different opinions on how useful statistical assumptions tests are when done in an automatic manner for each ANOVA. Whereas this is the position taken in some statistics books, this runs the risk of [reducing the statistical analysis to a "cookbook" or "flowchart"](https://stats.stackexchange.com/a/193695/442). Real life data analysis is often more complex than such simple rules. Therefore, it is often more productive to explore ones data using both descriptive statistics and graphical displays. This data exploration should allow one to judge whether the other ANOVA assumptions hold to a sufficient degree. For example, plotting ones ANOVA results using `afex_plot` and including a reasonable display of the individual data points often allows one to judge both the homogeneity of variance and the normality of the residuals assumption. Let us take a look at all three empirically testable assumptions in detail. ANOVAs are often robust to light violations to the homogeneity of variances assumption. If this assumption is clearly violated, we have learned something important about the data, namely variance heterogeneity, that requires further study. Some further statistical solutions are discussed below. If the main goal of an ANOVA is to see whether or not certain effects are significant, then the assumption of normality of the residuals is only required for small samples, thanks to the central limit theorem. As shown by Lumley et al. (2002), with sample sizes of a few hundred participants even extreme violations of the normality assumptions are unproblematic. So mild violations of this assumptions are usually no problem with sample sizes exceeding 30. Finally, the default `afex` behaviour is to correct for violations of sphericity using the Greenhouse-Geisser correction. Whereas this default may in some situation produce a small loss in statistical power, this seems preferable to a situation in which violations of sphericity are overlooked and tests become anti-conservative (i.e., more false positive results). Thus, my position as the `afex` developer is that an appropriate exploratory data analysis is often better than just blindly applying statistical assumption tests. Nevertheless, assumption tests are of course an important tool in the statistical toolbox and can be helpful in many situations. Thus, I am thankful to Mattan S. Ben-Shachar who has provided them for ANOVAs in `afex`. The following text provides his introduction to the assumption tests based on the [`performance`](https://cran.r-project.org/package=performance) and [`see`](https://cran.r-project.org/package=see) packages. ## Testing the Empirically Testable Assumptions `afex` comes with a set of built-in functions to help in the testing of the assumptions of ANOVA design. Generally speaking, the testable assumptions of ANOVA are^[There is also the assumptions that (a) the model is correctly specified and that (b) errors are independent, but there is no "hard" test for these assumptions.]: 1. ***Homogeneity of Variances***: the variances across all the groups (cells) of between-subject effects are the same. This can be tested with `performance::check_homogeneity()`. 2. ***Sphericity***: For within-subjects effects, sphericity is the condition where the variances of the differences between all possible pairs of within-subject conditions (i.e., levels of the independent variable) are equal. This can be thought of as a within-subjects' version of the *Homogeneity of Variances* assumption, and can be tested with `performance::check_sphericity()`. 3. ***Normality of residuals***: The errors used for the estimation of the error term(s) (*MSE*) are normally distributed. This can be inferred using `performance::check_normality()`. What follows is a brief review of these assumptions and their tests. ```{r, message=FALSE} library(afex) library(performance) # for assumption checks ``` ## Homogeneity of Variances This assumption, for between subject-designs, states that the within group errors all share a common variance around the group's mean. This can be tested with Levene's test: ```{r} data(obk.long, package = "afex") o1 <- aov_ez("id", "value", obk.long, between = c("treatment", "gender")) check_homogeneity(o1) ``` These results indicate that homogeneity is not significantly violated. ### What to do when assumption is violated? ANOVAs are generally robust to "light" heteroscedasticity, but there are various other methods (not available in `afex`) for getting robust error estimates. Another alternative is to ditch this assumption altogether and use permutation tests (e.g. with [`permuco`](https://cran.r-project.org/package=permuco)) or bootstrapped estimates (e.g. with [`boot`](https://cran.r-project.org/package=boot)). ## Sphericity ```{r} data("fhch2010", package = "afex") a1 <- aov_ez("id", "log_rt", fhch2010, between = "task", within = c("density", "frequency", "length", "stimulus")) ``` We can use `check_sphericity()` to run Mauchly's test of sphericity: ```{r} check_sphericity(a1) ``` We can see that both the error terms of the `length:stimulus` and `task:length:stimulus` interactions significantly violate the assumption of sphericity at *p* = 0.021. Note that as `task` is a between-subjects factor, both these interaction terms share the same error term! ### What to do when assumption is violated? - For ANOVA tables, a correction to the degrees of freedom can be used - `afex` offers both the Greenhouse-Geisser (which is used by default) and the Hyunh-Feldt corrections. - For follow-up contrasts with `emmeans`, a multivariate model can be used, which does not assume sphericity (this is used by default since `afex` 1.0). Both can be set globally with: ```{r, eval = FALSE} afex_options( correction_aov = "GG", # or "HF" emmeans_model = "multivariate" ) ``` ## Normalicy of Residuals The normalicy of residuals assumption is concerned with the errors that make up the various error terms in the ANOVA. Although the Shapiro-Wilk test can be used to test for deviation from a normal distribution, [this test tends to have high type-I error rates](https://notstatschat.rbind.io/2019/02/09/what-have-i-got-against-the-shapiro-wilk-test/). Instead, one can visually inspect the residuals using quantile-quantile plots (AKA qq-plots). For example: ```{r} data("stroop", package = "afex") stroop1 <- subset(stroop, study == 1) stroop1 <- na.omit(stroop1) s1 <- aov_ez("pno", "rt", stroop1, within = c("condition", "congruency")) is_norm <- check_normality(s1) plot(is_norm) plot(is_norm, type = "qq") ``` If the residuals were normally distributed, we would see them falling close to the diagonal line, inside the 95% confidence bands around the qq-line. We can further de-trend the plot, and show not the expected quantile, but the deviation from the expected quantile, which may help reducing visual bias. ```{r} plot(is_norm, type = "qq", detrend = TRUE) ``` Wow! The deviation from normalicy is now visually much more pronounced! ### What to do when assumption is violated? As with the assumption of *homogeneity of variances*, we can resort to using permutation tests for ANOVA tables and bootstrap estimates / contrasts. Another popular solution is to apply a monotonic transformation to the dependent variable. This should not be done lightly, as it *changes* the interpretability of the results (from the observed scale to the transformed scale). Luckily for us, it is common to *log* transform reaction times, which we can easily do^[But note ANOVA no longer tests if any differences between the means is significantly different from 0, but if any ratio between the means is significantly different from 1.]: ```{r} s2 <- aov_ez("pno", "rt", stroop1, transformation = "log", within = c("condition", "congruency")) is_norm <- check_normality(s2) plot(is_norm, type = "qq", detrend = TRUE) ``` Success - after the transformation, the residuals (on the log scale) do not deviate more than expected from errors sampled from a normal distribution (are mostly contained in the 95%CI bands)! # References - Lumley, T., Diehr, P., Emerson, S., & Chen, L. (2002). The Importance of the Normality Assumption in Large Public Health Data Sets. *Annual Review of Public Health*, 23(1), 151–169. https://doi.org/10.1146/annurev.publhealth.23.100901.140546 afex/inst/doc/introduction-mixed-models.pdf0000644000176200001440000057373614076067245020560 0ustar liggesusers%PDF-1.5 % 233 0 obj << /Linearized 1 /L 194526 /H [ 2434 326 ] /O 237 /E 66878 /N 16 /T 192857 >> endobj 234 0 obj << /Type /XRef /Length 100 /Filter /FlateDecode /DecodeParms << /Columns 4 /Predictor 12 >> /W [ 1 2 1 ] /Index [ 233 252 ] /Info 40 0 R /Root 235 0 R /Size 485 /Prev 192858 /ID [<1afe497dd876b61c74ffbc0e0d8d8db6><16e47cc4be96e28b0e3c855154f94949>] >> stream xcbdg`b`8 $85AF " @H\ u@=PX@HWX101>8J s@㍁v(Aet9 R endstream endobj 235 0 obj << /Names 390 0 R /OpenAction 419 0 R /Outlines 367 0 R /PageMode /UseOutlines /Pages 366 0 R /Type /Catalog >> endobj 236 0 obj << /Filter /FlateDecode /S 197 /O 262 /Length 238 >> stream xc```b`lb`a`c`0d9`xnMks:KNF5f>4gwn(x|(薅qeK29jN#yѬic|+iG)ػR|/rһ⼨cGK٤,ݓj3eW,%@E"K2Ypd){ ?io >-J:z כB'@> endobj 238 0 obj << /Filter /FlateDecode /Length 4696 >> stream x[YsƑ~_Of4:Fɖw$^Grlh h;,JvU֝ǗY`{Ż߿W*Ow*J~lmˌ\n?oo:o۱S9֝PƎ՟nTRU3pK)Ok~lw5IqkUN#o<}8m X:, <\I\R9.W~c]6k&Mj#؀ߑL-i(>ه'&e#A lªR:G3vJKu#1nڤhBdX*Oeĝ`_*2sQ(|Գ [ [d,A$㮼rSPСvމ0 Dhxyʰ~:?qU%z 5%HX5Zհ { T\ sv;ޒW  Ǻkp0YҿMt{u^M$ &2 kn6lzU~fFD ,tkduSFMXbBBf5%'!ճ ζKAK {o =I| ^" vrQq^r:#^T['YT:vQ+EerհYK:DVr>Tm{GY h$✳3~`o Z.>֍GFIjFc梇;_c8cWyG$yAE}S^˴w6@qEs-vڷZYo,(]k#!hUIL=RW &h?p #RXcmpBڃ¯c] /Ka Nܰݣ3wl3dMP?3Z3ЏB5(,F뉘XNUA8{3f##}NI 2:eդ4Ic%ĹA\,϶8?&Ik8.(6#coC#%w- Xޡem*hԛI2#9u6IP)0H,T*$Vbɀaa!ecLǣGN g:V,P!xp:JO]y.pN:8 ت& #࠘=p^E0q[u0c AQC}@9#[4+O߆r]?0]{ /ߕyge2]9V yEiD O9Mp^%x:󃏶e@p4'[md V0ْ؇(j(Z!cpRhxvc b*JYnTJSx}XuRMhG-Hzl2V/!18P+Ox)6FՓ*!m4MV` D22Yȹy`;97O27?mr bʏwe$V D]=QO#!ӆlڴF;~j:WoXo}^Z6o?x < Eo(@]tSUGB6AIwlB֪=Ht@;J`3F@=R?BG~d}r`R1Eq'vMBC'QlVl_JyAҟ9늒q.W `=|̔ĔX. &[u$?**e6J]\Ǟ㲵aLi>cɱ%Gi>X\Siʛ&#Ws1Ǧ}b-@[yqF! $Z>{.rڜ н]xՍ䑏|`3-dMxNvS_dG`Ssdy|}iС9ti`7T<$}`/ĸ6;nF > AOañx  r\}Nq:9!HrhGXzrKzy!!H EWiܶJX޺ʜ`fsZI"06 5\[pnRy,^e$ydWq}we3&AӟEA`%KSXYoY(_IEX!S[!_JMzSBWN_Y_Bsˑ~pcCwͳ%^x 8C;_od] ,d7PpulWMyOK!;D ST(}4Svdf[/~:fUŻ`&' <ŭ{Q:([l<@cm]5Bjn`c?LPe1D4-H6[~׈qh:ekaW}~ dBN6_oBrL?/2FzgR;Ln93qJ&m(\{# J׮4:R\6r۰Ǡ*U9N;`8 endstream endobj 239 0 obj << /Filter /FlateDecode /Length1 749 /Length2 780 /Length3 0 /Length 1311 >> stream x}RkPWU8ƎⓂ7$ټ@##2@ʣ&,ݘlB2A/RQ+PkGP Q)ņ2,.1fj$!HLN8#5X% M}QKG1#csNu-k@0\ xBOk4.P5-$uuV 4% [tjW c8nTߐaH 2%0 2 A\ӆ% & ,>{O*:hߢ Z-P9Jȗg&YZEaّݰ]H~G)>dUw!'R,m;ܚ!{EKq |_~uI:#eWG3zq'(s&6Jme@"03!˳ :135}𠈦 ^.AO6dynHE Gs_o+ߵ[HBDXN0Bwץti kl}WǩOa<gՅfU߭՘Fhis >zzNB1/'8^@DO ,WQrcQP-\⟺Uᢺו'ӟ35M5#]]c%jpvFp4r.O%v'OIq>prҬk5Oj_ -޸Ot?/5X.'yI_kj#+eWbJȸUӒLO u2nWT\vx2L`^}{=ZW /MI}5wNvJ+ vL/9zc)}ֽ4O]|ɻR;q۪kj^`tIϽJ';hO;]{8n[5̙U}NҷYx.=Ep<;ً)\8ZKgnǴ %-cw46G5ULʔ3 '9-`圄sgO܃s+":,) kv89dv`;<}b|G].%sn endstream endobj 240 0 obj << /Type /ObjStm /Length 4159 /Filter /FlateDecode /N 99 /First 889 >> stream x[isܸ_Im n J$[Y>k{˕(+i㡤UU!ݍ2i$ULH<4C4itL 39M([BXV2!F Vcܔj JReB{ !6 ʥLDN CF8G 8,B;!Ax;D`Bz+j׊bRKT{D%=1#!a` H$D!F9AK4`J*%cJHz!T0BOe,Hi0ʹPx6iibT$RI膘@vJ1c 4^oSEhZfVd0 KHp0' a8))?d4s蒆9by |N8`& v`et)(AK)Ѯ4h*Δ *+$b!!4OBSCЃA  a< POfӴPP0 ?C82`h`_~uq~8e2jTb[>u2; tOOoӓy8~&fl-_eï(e_ϊe,ӳMn_G{~㗇?>iQ,ڰ16a(l=>".ت+h0ز{':tuBOWG?7miu4, 2~Q!GTW@Kɫwǟ@xvӆt]u` ڰÎTb>~"x:pdeS4ixEW{G?(v`1囎y?.Gϵy[7O497x>yûigjLaZdĻ+^Mq?S˿$_DHTܞ3#057h a|WDLRG$]H|X >qv a*ۻp[%_a# aRiv| mnIU"la0=QvO.8 +Uk` X\U j+'b6$WYZJu{TS|ni*R-Hwp"<%Aᴑ!PO"*# |\4+Ї" }EN0??l-i5y44[,IW(fgv=/. ƯF>lYM;t:bew>?.1l1gQ- sĻ7 ~o3+!r0F<1WӼB̐'6é' ?y` DYl/'O׬DՔK] x*^S 8XD0~K0Mv+w 1$q* ,(:pN'%T50)0,I|9y֮f<* 4Ś nţXOK]+S%:ʌ4.c|Z5Q tҔmI}붻i A ~ S< 䕨-v(Gz[{k: OU~."b{Xt(m,C_ji2DŽg;ѡ,% 1)jIHeD&$c~t*;2(DoΧkIhM])EF!m[@7Bvf+c?zqt.C`j;:ekCvt{)0ZORe%YCMS4eHV,MzWӝ+znK\L?jחpԔ+"a_{:3%;c I0dW:"yhG@=eӖ!L,3{@iO:% @׭RI'hC[%aI-3(qp(UJrxLSӽ*tr5ȓ% 5h:EkUS u"~h'¯ݶ~֞.vT_EY.B+ziZoDCpgDYVԲ$6ei,i$]>]2;eI*˚4F Wam[>LjY*4ɍ:a2&FmC#˶ g[ U]I7joihIne! Dw[jUfB;Y&!4Ю]ש*ui}۹BܨF-b7[jim# fW7\;bok [YrMт6BfŒUW7W8HF-w0a>X}K*NFӬsōjm"[CEY6)F /٨_\2@.-E Q=^x`4oףI-r!Hq0Hh3[#nCv|fiHH1&1{5?+/\j#D^>> stream x}RkTSWZ(zDBn,I"Br & $J| Nf1@eA4 O-GRXh"Йڵf?go`' r%XPJwNpw98a`"tΤ1 "DFH T*D ,ӌ "&@,EP3b/Qƭh 0 gN@`L $p4yN)0p^2]$GdW#8D)U""R % Q,"8Dd xC%0.CPX)TAh1V(sY DL;<%9+ 'Ra,2W ~- ߵ/ETIT LO q t1 :@H*qin(FG@8 1lt #D48N0_hD \k{B_R^ӗpcሄߒ@#H $Oݑ燩NP,62LqWb%Id+8!? `Y&9{t*DX_cp-9s`m;︤Һ5OWՓ ڇ+&L~湧 Rxvx奏nx{[㑫#΅̟}GWC@t,.n!2Eǫ2"쇉Yxd2Tֱ׎&wNnϻ+uJ/) rӇE;/'?4G+g4c"ɔxgU7D"q:.0A=,6IyK_`uYGg1=u6ol?};;s`㷩eIF6۪FU]MߺSr5d &ߓجe5\- 9 b/pBnV2'̸Gmd֮ysWc6ѧ+`Q[ )qA=GrovBstUZVYQme9% ?Paڤ/ii͕Ikw̶>ymiW?mvDs̷ö#{uQe~Z . Tcd;a>AM*y]VJuv5.*kb9m4OG][2+ m"7gr;VޗY~C|؟&0+]@;${$,>q٢<3SEwݮaI[WC.ؾSPO-u.=opxoiOOE\K7!ݷ 'w Np UzcwImc_nȕpbC7S̭rfZ =֜T8cAMZU]l}}lYM}cY8^}Yk.v4eSGD$|i 6y]-x}VTI5T;4;. Y+pp:Ry1=ſ{ 6:>@<>-?Z5fK $z|݉C| |Q};92qQ&6r$ם)ƫS> stream xuRy*DR;{y뺟yTiX7UUS.HG lFG@@H8" 9S < :z 0 -^o r7C h@m@[280+` ˖E[Rlub!:d@AUk΂|L`& (( tV w  -&` xOs%[ޜO X(?;ht?0 AN0pB99:YXz%0 wt.@:,N   |9\ i8:;OGK 8_B"$]Ȣ-1JC0wޗ0v@ @JGP]?vHKI:zİqhKM<31 /+5 :~[sND?ʪ 0;hNӘy6\<>hu2o~A~Mo28.$&p#BHG6=+(3T73S"z#9کkayX|)zlՄàZL%Emm٠Bj}Į?XD ?G6g=? -{O}ٽ CIS6sʵNfd % 1 wKҴG0OwyֆİM+2-TĽ),0JǒmnksZКm~o.sL.r}9 3MhD5ڸ{ yM3.9 %W(Ά ROOqnc?c5%E D%3{Cpɓz3owşrmsk>k_6jS12ΛeiV}j~{ J=~t=I RN2Ar(D bu: E6 zL)0-(^5%)nHH6l;;)ỻ~^R'!'vּۏmf Wtj G3q~O릊loe )uϋ־|^|a}4\UݨRr\DԛS?C{pBu:^X*V;C b7m9qeO.Bd&ғ4Y7+;z-)&jirGc4v~9GzPTzĈdh:xئ6U>*8JUvu[wv^j5#Ŏ{~gܛ V.e޹ޟ_+a#eyf/t6ݍ_/]ʞkVH5S'6V+Rpw+D I# K@Ϙ,4DhvBS3X'C;V"/ o~8,sud]6=%ݮ>QUU^esGE:_b CcA/U߲n8.]~,7u1QY3wR R(Ԝ N|[N,(J}HU@g[ S9/ 4 endstream endobj 243 0 obj << /Filter /FlateDecode /Length1 910 /Length2 1799 /Length3 0 /Length 2430 >> stream x}Ry<chJ<#9EiȎx233Dڐk:TT mTDҁJ$K2 o|| Hh: l\DU8"v"-cp TDlm'Gez`VΆ%X d@lf6;; p_x: ry"J@Z L/* Lʂ!` !>G;BeB46 /s !p _x62!6HyЬ&` hl_M^0Ѥm:tD `N@To<Fo~!_ MQs*`d/[i0b3<rhIw b,0" 8|$%&D `hwLX-0 G `@blwZ1{a d6r![n87&G=kiG<&>[b#~ќ j`_ G 'B Iy 􎎰 ?/~5r\_o8  @Iv1fA7 Uim~dby<&CȆ(~]黂 Q'n<'nψE paEURr~m 櫬$krK7h\Dz髨P+Wd1w3#,=B$̐eEڲY} tzD(j:\ Hhu&BgCBvDA̓Ϳn G/fiIouTVSsOfm݇S({hNdxڬ)9-B1i5 - OrJ)ͫͱZ0+vT`WP1dS{-=kJ1{%&Oʐ]6>)?eߵ8y,V4qd m^Pa=CSmhS7[V4YT]Q?R4"]w/[S`hÇ'Dڜk}R̺g^ZW XΓkX{F;%zy썚H<*Y&J6hfp.WpVd2G^aV1H4#r7ߡh :w{xELpqܺ٧> J;T"nGMirB OkũS#uʒŲ i"JXdof*K1'5kyXtE.?c`jml5rY:ͪ q51 h^ΪkPM[e-Cz[ rK{޽mᱠ$e#.}1sJVP_1Yd~rVevQ k\\\rZvG<B`xbفT-ScQ zQ6UhDG%irϛVp3|{`u^S>jVx*˪=zl_֛ܒ\vҲNdG͍rɧTXT (k=RI䭬V葧]$]G_~Ostv$W?Uo'NIeea-ͻ#Ned=y6YdS[Ob3eǓ{ʭ."m2oRU?5̛\vыϨdN#US>KJ'1rqcjU0Mbr쭗SDx ^avŮڠ t]27 {.btyfX^t"w8ωC1w3_,`}BӤ{SS^&'}0RUcfC Rc*=8njQNpጦb;tQI]Xe[^=%m+n+zqL>)&g{`8M&6zRxS:TP_0tp=#TS>)ʯ9\e%HW*,'?ƚP:ZFg0E+d;r3Ѓ:Z!oa=i媫F֥ ot>ե>\{ި'_U Ævm^T{/[K^`V9֛ٓА _USp endstream endobj 244 0 obj << /Filter /FlateDecode /Length1 830 /Length2 1395 /Length3 0 /Length 1968 >> stream xuR{<tCJ%јҲE4F3ޝ1; RlÒq[8X%tq]A+[QZ]y:~~wMgW,o  1::_ yV 2D#x8;a"!'QH"bx aގ2h@Т$LqN[lo*#1aQ ͅ2 b #?bp2DŽ\9#  ɉ ڛ 6w֭cA+ -c~nj 8 V$Y@>`P  '0ں8CA"$`  R 1ʰX y1"' >4 ~\xK]yLCx<ѳr;w,-p,`cI1&E% K|`@1R>h&LR3_bm[;0THk5B).Ӧ3җY%ݹ0|ثBTm"g0b y䫳;q#&}Kٗ@M񐾍&?]yL@K4 ;K4M!楒Y@XP.mOFe!R͒r6t2rzZZ0?1>}=v*ZIwr]}{ G{љ%Hv,yxvl֤ٱ7ZIdEZ(L>VD_Zums %Ȋ*;p4"l==:"NS9- *5̓k O!,D389ooDyíq})r_nMMٞ?A$݄G:aY#N<b8`o7ʙէ! R<Ǎ ZQTn}ZR})wޟN)3V7G(JoJ[D ~jvĺ4uDn9z0NjzL %bNe墶VOVV (-}|>{rCMYU6v؋> Sn9aUGjcc2&p R.?0koJ~BohW';q?xD߿HySUFP)1W=^Ra񜮹QG+7)Ѭ0e}`.Tu:{5O<'1?)u?l\IdYL[0A|rVϷL#NY|g~e}[lNK:S{`a{TՊ1jzWJvzɺ=u#ifuA&l.^V[V9?GMK> qvj|Ʊ<5Ff? ɿX8syF20i3'mY:=ik^ȯ.7 T* I^<o՜u܄1j{m=6uZ~,[ૻփ,;^֪-k Khy8YNDѧ&m}Mc-q;XOԼ$DVQsfmʛ]gwzfJɺ#&f#vg$iM9X5O.=ay7_M.9x5y7=?:_6*sD푯Łɭe~k4SK^?o4וw=5mg*-sBp&8A?l!;zl+5P2[":nT8W5x@hcW K{_D6;uDee#IkY93/5S{n_8tނWDU_VSqMQO/ګm endstream endobj 245 0 obj << /Filter /FlateDecode /Length1 864 /Length2 1121 /Length3 0 /Length 1715 >> stream xuR{\Se 7&%<0D.gc*"C)6qdvO1D5R0*(x) - b:_y}}ώuq(NDg @puqvv~"ˆПB^B$@( #K |CH"$"G.A q.t!n3q$aKDb{t =ExXD aCA[,;`~, C\X&KGC΄`q, <@ Ä\H$G'"1caN+*Aa-Մ؀F7@ub$DY̅fWH}i\60#Np \XH7-e8 b. )6A AI!xgf:٩qnGzu_P-)}Q/{q6Z; Mh7J1705P;tM>dE:Ɯeш旙޲Zc\kTN;'k;NNH0;}9}nTJ^8Y̦C% ;wnmV;2jo74CZ]b-9>K#WM8vo#ի`eMzΣ>oMg/R}UE4XwO-MS1xl49 \lJ\9rUVYQ^UO[9@u" X~eĝe?68: -ϙAm㋋C/Ѝ{׮ҔԕR5 pm:l@'t  ozMHу#Ɨ\2/V_urn-O^5%͖)s/,YW淚[Գ"whn{E4,-\*Zz9f|ɚ?W-3\cD X-Z|"RyiΆY*{۴9酿N-ѠG# U+WS+'w~QU^mv`ී{>4Kbt ۟~ p"n.}d]t@OȎϟszd++>˺I~|X+_oǧ283dx*!ʒ:eZ;dV[eS[nBܦ걧t_>NPΖ1g8EC!kUI?Z8+Hx]jrDٮ8]JK.Z;xJVZ M籊`P}ߏm{F7~uL3ыf|یE|/r%id{Jz T~| )9M G+]Dz"4szGCcso+m큽c> stream xuR}<FHSBḣ1j[kyw4ԑEoJJ|Nl9{)'|D΋;k\us}maxi\QYxRq }#(,DvQ@&b0ܰ0o7͛ )L!RUD9(8 `D0+ $"ϕ/iH}cK.I|:[eEe `~} n(sh"a)e('bhg"\Hć! 5nωܿ˓'nΣ4L)n_ۡXaaWLO:ȻGwɒ߁Z${Xm0RfO:W/ϟڦV4WKd4[CrkT݇ë ]sN5ŵ& x03!5ԵrxeR01Cn^*Q 3MZOf*K?_eEVr8;Zb|V/Hڱ78gߡuvp'tYz&ȜaъOm/kdQ 1'jn-SshEj8AJMoJ1X[9\4JSz&Yla]o$ae_|,quh٥dO M]5+[dȒʪ7%wŃ |۽ܷ/RkoQ=)K޺%Uz9InޤU!'ug}Z~A5XHߙ̐ƷB5SWLFUQ|ñWx?koڗէS4%nXd`1>$ 뽿yUGu g_h55[ܽ\K]ߠ<ӢRˊpC~Ίy#wf7Y93ks͎qhTgrm͕ 4xܕ{?g_Yx&܎ hov!nQv~rs8h±wKfMc< _qs י?nh- V) _}~83q3n1⇃j+JuOT 3hOjrʬ-^#R.hu endstream endobj 247 0 obj << /Filter /FlateDecode /Length1 1630 /Length2 19071 /Length3 0 /Length 19916 >> stream xct]&v$vŶ۶]UmN*VŶ}8_cqkkɈL쌀bvtL9 #'%;9;.:% ௜ Lhlag P~&...823RUI?%Wh1kk9Cd m @Ϣ6tXX{:$ E/5Z8YM,{/ @_t*VoV "&&!,LY2T;*sڙ?0v/:&vN3'7!.fVM1YnFU?~y/0v&i.I[5@;nuΘ'2-3ݹ;wxv/p}IJa]_ZW{M}4gҩǾh/5EO 2u A1L=jQfBQ`wRQIpʟԵ=qj}f'J#Z3GᡞȾ}|8X2ClS$gOWWʥjDU7OeobwЙ/X̾@0 .I]2&~Qҫ\<[a_;N\ኵ?lZO#-dDU\ i"ȉ7Z'@&ʏ%X?V+XC R6P}@7gNty((iJ}T+Njو%\>eY9? -ۅZ&}7 UbӦwd.ٝ]^KvWw([ ₀Qt.GðDH4,\/kҢQPc#vԱN~VpJfO$^a&kU@5?e1= i!vMj ADZӡmZ)jg'>-TᶑfENf5s)>/ OGKoW2(\}Cƌ+TzJyըq5z (b~{֣LPL=GڛJ܄BcOH&G M@h~{ʣ{=C^Es :d$~pΞ Iܚ/Dkc<]^ˏKV['}[w ,h!۸u3>KXsBCƯž|Q[*H|19ݜ;փa{e+ZrmT"H izR:Xt<\v'&L74`VN$6|JN]4-}GT`rFf'ۚUm9 .mW7gErCM+l ('ȝ.8y'vMAv)a~3WEOےWh&9}BxseqzᘤGKퟹ܇+j4jMAkED|~p ( /%0+C^eqgakMiغx)=ת)7aYG.X'ѿAyx_(Non{6Ć<4P.E3y {/Xrq01j#h֨wg; B䈀O#  <٤UUԄRypT L$ eiX܍tk61V^e1=wuMÎ}[7so?>æ"z\O䛔3M2 *.h9-,lXV,!y.7w/Uom ǴӇ3"nxl,sF>\W^BغqjEQa$kY *#~-1ѣؿ8{ )/Y|CCPQz="1Qxm}qө$ /ZJ"/相ū*Uy{f#8|no;uW@sݔQ k͒ØS1i^T~ikEeX=5q.8Mp? 1-"JCwU(~~:2+x6s:H[#g􈖂$IV8De323Q;!\G'1d|%Js7E~(mT:ٝO:Bep#vbTUq A"^$dʹhK ˱ (R|퀝S')ĭx;=C Q60.ijpDl+@w(X΁xEn]] R*~#D x# u׌Z̨Pkyo/r&|Cc;SPc(١8_X8"{&X֨58§Kb}HHK4/1EKQ$I ;!Kl:ے'KGAH`HVVtR։ijE7G@aΏMmy|FrX&*U@shd k)oVncӣZ|~<39CI3f8=v#RE.m!SXImDJ=\>*_?<ԢDžEZn͙¹,B)׽i1QP\RNfP!쩔Vɝqx,o,S)z==kZk_%t+kO%KFy{FB$@d"@A(PO',q.r#p'NJ<+9re]s59a7ȎhE>`52Myǵٞ;*b)hIL7!j29W7iYߙ3jnڛ#4]bV2wfM+(J%e0d6y$*>yo($#~R呉U* [`Qx}oI !Xƛ*7x<ݽ(YELmUCiiD)u ݮ *> 7\0_PqX#; J!Xa\^R4Qfs+  -'q`Y'ɜzgEgĶ戏ُAHc8LD]fr]l,T cp@Ѵ~RbWIeF9xo]9kt<(;;xauA5q7Mƒ -wɤB^izR$>y+E'á207 *Ԧ>~:[&l:ʠ,`LP*T7yU{ڂVj{i IQ%dU&"2*+%fw07xFH`& >Ҿnu98 u+P&yDJݡ))!r$$L(b:aMTc8FeLmS|zYJ뀼12>.LhuJ6fVO#ƐUq^:r?FX3u3LmM=RY(n-T߂א@ۦ8 _Th6 eH0&()tgYs fȬ~N=ʑZAs}M, mϔSW7hΆy:`F, u+&|H=L (ֈNigD"9qzUsV<4tSHW|m ܡ>H>(/+M01NJFdjPhr!^af!QAɜBR񠞥/j!ۤh wW,C1f%֯8`t=@[*lʥ|z'a4b *)_HH"s̫}4,+9\uhN~NikZYJN}^nPh>ljgW[rfSE4٦Á&{u# Z{M@lvcT9R&z#GnԾiږvfSZ3x0(xbD,(i9V+F䣷m8k*~hϡ dT8rJLU7 FñU) U`<q*wټ¤A#(jQZ)+)K ؐ/Ir~M lN u͑PZ 3۾>/N0A+UZj76h2PǏp jJA 7cl53}w  唧7f5tgˉGHws׍Fؿ8x\j<]?6@Hc;' 铒Txy],Byv6e_jṂ+O:S3S^sLh\cA(υ+Ԓ%(ѰdVZ r j3e}t>(F؝d`F8qKı"he&YD}Hׂ^vsq#]{!4M{+H}53%s[#{#L.;@g&ɿ?y$,WѽO⽖thh0.MVg謴=Q9fQ)ʼn`?ǟgABa[M>Ylr3/ 0?8NͻYFGXzdPNL# CP5@I~á1>;׿$~aNjbrՅzLUYPn`-!<(= ׎ 6VW SIrlUsZ6Q L<>̓p4k/ iv4b3$i<[1>'HQЈRf;i: ,qa0ִ-7]-N'L5 u _]N,1P pS )2 lkdݳV8ZyHC'%ҜCbuƁsM0~QHU'{& "ڼޢEY"S7msi>DCrUi+t8X}; ^8\ܪ1 ;Ӗ!` 'o֬[_8P7o^MoJR\Y{:L-޷~/K tCzQ뜵LX.Ӂ .CdʅWsӻ~ wK}x^gW3Y!u3s?3q^TF Y3}q-ȵdggE^#ww5#c\\YZ g]oXiUlUF L4\.JEDžy>BF?!2~35Y'ߋN=*75-oAn[\zCF8GI>L= 7]?ИKtիCfdԣVxr8H_YsXl6R v?DŽ~[C:UeTuC<3  "{,oX@V@%KL#=1>d<򫫄}w$b2Ji1IՊjn&lRUK/X `qMZ tx!JƮu/Q<'u:GcL}0~SU?="}a  4&y@zOf)ccy~.$4},T,0参d&%#!nicN-+.>2@i8S# w.a^]* 50dƜ6L0)Y~dss9RZu/X̱N$Ba:n  6D`}[mo ui\f FcuZKE.%nmi.Nȏd6/o`4}`[ζ7]kLlx'傒!}e+2-m[o68ld'q BBs9 GX]Վ$ˆHM&V$jd S_&Ɍ=h`s,U85#Z;BcJ$b{S}23hE@a% c}O{BS:f9,, }FV~t %"]CquB7\ȥj@j&NM-/4<y(a/\ou?i`w(ہ;S| ^$qN^lPC H x3gb1?_ kU ' yլM<8G$Q,ٮFByyMPؿۮ{rQy.Au\cbbG9d̴9\aNjQ)/*i >Pߥzp!Wbm1:!Dߚx(,>4}I8٥įc!ɛ~}*}.,ԐN *4=9|4e783X-s ttPJ?tMg;!sbwYOSsv6u6Lh}#ח\/ά,aHg*pxopKz^ʈ uBaK$@~]~ `텱@kڊ ͸vC?*FusΕ ܎汱Y2e?V]p:-Kim.!wFxM%^7E=qr3;©R B(}( &_OwvYwdTDsJh `7d& 3%"F!O$|V8nAU'oZs.Sz쌿(t٠nDBA姹)Bno)1ɈZshw ByXOHG,v\((Nb[1zbLY"Vqn#X'Q2Ȑgf7Vh/[#3;C,˴#Z3T{>J 7=T݌!#m`m9V(] q=K^&47/=aְ W4iψy><#r(cP`Z e&se][,|6P&ՙW ςHM:y(C0ENfg0gZUߵ\~E`ghàzCF7 O V—EmfɄ"S^- BNa7C.b|X-E7m&Js0P(h"DI&SAuL:[JIE ^ڣa Ml 1Q?1>S~שՌzZ^mX鷶cxtAdUyp^\{T az D!nE-L-buyjvH*aV%"hM< Ӽ>Bڗ40X1qSnaZZ|˩*RLUx9AM*kSא`ÃV ;6c~Ш0LRz:"^ؓdl},N8 ٓrqI "ݧbvMU,^u&Ikΐ;q{.XZ_}EUOU6biV KQJm  CJ4 Z)u&16(]WZU<ۗ2;_W5D` S|d >@zwN79O?!ӝ&*K&JB*_S.y)Ia`sOۇ*8CU :E$e%Wtv-dwct_Z)I3P#f ׿tL EޫfwzPM3 Ö:4wk#hT,b7'uQW`:qjS2)V,E!ñJhĥB/0;vdhDê|FD;s77)0SrbaUUxWgniG؉z0O^Tt`vad0.F"VdUλzMFYD%vMFگ"֢Fo鯀B|!_ZÇvP|2;Ae4{mo}*꺦D5娻sа+qljfNNׁ%l~iSrw=;k\*d0Ɵ^!-:10b(pmLoe {7:$ʂY91}[S &ֈKJWcȩ/Qt/;dHƻb蔪f~rUl(0_(I&O ];C7JZBRZlzU2YQ2QK =~N 4+͕Zd (s],r ["z13iܪ%<٢|ZW|-ʨ$VIj:_rJ@y+6QH]u8jD IJ o@]tgX7[:LPϳ4V«߲֘q'cC|{3.;*!*FYb:eՐ$-hzL}-c&Efڶ[0{>+dZn[tZ@*}Pn|WMA([˖=S8f$nfMfy6L;DZ7JA +4}[Ŝ~]FEݼKߨJjY%]P68XY7' g[Lq.vi"}8,.V+HQ0:(DN<'0zHbMG=n7m68U[cgjm";ՌʰޝJWu*6c=r-Li S227 yzίm,*&Cma9˟8|?*@TY;A OӜy0bIpy\Ã`SK;T ,1-t膨_2RϹtr$]nMA߳1&GfAоQG(^r^vH)@yWG~TYN_".+-ROGBr֌Md R+JCR-[T}=ă"9?PF0 9aNW-K?xtLҗ +EŪKRXŭí >J΅vG;Nj)yM&JtAC7#JIsѾZԾ|!gR/3裝FD ;  C@ u@Fdڀ@m&%il"yyPQ2$55`Fz>8eRˬa0/HĚ+___]#٘*9pylk qhL, vTkQ{ܝٗW. {~Jмޮ-{p[0dI?<~STJ+ U9#σu!vQۄu*Oq8 :Yd"[$ro 끇NaqHW'XpeSvŔ?2)JI S]cUȽ13y5foʫHT*$0 LH>ZT\1CҴoj;XM Ĕi,z EAkiRֽE!US?,=kPFjz>$ ؀FF.JU\9LJ# Ƃ. rb$@ bI0B8M$M} q^E"} 8Ϛe_!\kauo]5]USgi볧Vi<*v<z*ly 7+ցVAdrjK{X9J@QؿC7L% NKV7[ #rH&Gu Jx,rfh2br|QnNz ؈U"PIzwǨXM#'%V j( ϥ8ҥU҈w|jM,Ύ<EDs?G՚˿5i>7Fwn:N|dad:1 Wqw5:c`N6EE*X+Zݥԡ]Q˄^6*p&fcQ!8 X:Ͼ̧Jf"kǝ0Wfsd`Щ!Qg l+i(Gc~@tISi &kY_-<C*=MRtD;s5Ĩe_/5Ibgc`΍?(E"\IZ0Q<_!"Ȕ4&ΘӅ@gjkN(/>{}R3Y#'9/:ӷ/Eɷu`:~d=mph:m ##hҗKIGpJeXNl"{SަKw!]r#e&j.H耨c 6 tfJUQQ2|\P(!b9m*PĂk:lg +Rz_"̹2(oE#2&Rc 7s=ߎ|j?@ s>v\!7@|$} {f֌n^Mѝה}o)+rR-`MT!F|]W)ؒ 'J=0VT0uA/$pnȑ|q,PMJX7xKN!Q!h!n;^ic徼&ҭ;F:KS3-Y8<&!50ǰ /=lD0;| 2_O$mjSxDjM 梸O$qrODH XBGQ\GӲ4Sw~{|EOcr} /5sѴ"q 8<1nyj-/#.r#*MMVec.q3C[$"Cse0Mtah!.cI(r G讄]{zn=G%N 㓮>vÄ2%a{ ׺@ 9o20pnO\ę A'дyΧf7 5jd) *%Jlȃn !hơt rr\W-[Y5`cyz{D"j+rÿܑ\-c#isԫT/:"8UtF'CvnE/vo4Bm( ,3Wj7^Q+-o(bET-$_zW=}pH3^qIFTÈy\+K" qЭYCx<<۲T#Zq#ʲ¬7ޣ^Z<2W:ꋢG:,9j#UXǮiϓ.疿L>LV\6A]KOn?Ddc沇/1{.oOݏ]97 ZFĘϊJJ5susTaq_m`ocMQ,fe-$QsCr7v+̎b@~NSC\nT׿w /Jpg'SfLīl9OzӅs?;Q`k5k+khn0٧DZO}?UvQҠE4,h}\(LbtI C'b>XOv@.s-iG䊇$C>edyKS@pߚ/5Kwp !iZL:/o ~1lCQ(z`A kdzm rsM_i EhrW#Aj _\=Iܾ~'؋'L럶jޓ!LAkVJt/63 Y7OsYЊ =匍! ̑3/["\9ip$%U߿eFn"c{Xlp/>w{"s =AsJ ! 8fcajbCin1hMky8fMv`ANq)\=zl跿d8Es e:0P"L bzvD 9mf T㩍PG'%[ё櫉D ?<2=|wB =ÕNNQR{2dL <DeM#CJ'9 AiWXb?^S_Y2Zc3$Q80shTLًx07I 9#W}-;-VI80oh0uqTxL{"ғ *B2!_FwMSӃ/"u_5!ڎR97L@a];1q{t]$Ud` Q dAOxxH&W$=X^6< }rg\a``5CcY1tKc"R9/a& ȕIWEd#ߡ/p:sUNcNvˆvcihۇsLϔ* txT:uVVNё(W Yy4rN3waYxn<2v=ww]D3Dm$]<1\{Sz'gS*~q2- KE.qA6QӦ:I/,(Mow9۔4#}4?Cxr˞Io(Sf9J{dՔIGeOVN솆Fzmx:2]߉a-]Mb?뭁R2:p2Cԁk@[!./qph'@F!iUuaR{dcq C։_g3@^=kqY3H¶,]ƚJqR/h/ H#f5kã+Á|~`S = P?LCP.u=HACHd<};'+ͱYpc%~i/XJNN[6bHΜN+iSkrUKCk[YD*:${v7s`Ő.M gi3Ϊk.}WIŴ{yln r@J$G 3}5|SWQ3(?~k6kM_JP#Ypt'cT]Ԥ>eSJ}=?0M'Ѕ ,&E6rƜРI_5oX?'DՏI%3a}/ ecgrHX+1`>;T6CVå'jb/wW )ܺ%nKHQBXgrÏG k\5vfp je$y0oݽ ?X$KzZıgĝI{F3̝@&!+ᤡ%'/.;;-e][e]Ac%i3j!jJ€ō8 qvt̑D3ퟺնMT]ʲ(oRz+i e Ό@ ;جA) :wA$0jy@֔3zj=^n2 KrpeՌ2WKCđ<1U^>bhBS[8(s!> f|h3ޠn_>&,@H0K8'945m15hYʛS`9sI5f]a.W=<3V=0iv Fؕ/M 3s7C}6"Xw`z=$̣qx =*um̋T/P^մ*vi_fXp:mViKgϕ4BvJ5K{/x݇.!H ޢͪ*tG!ehMYoFvϒʹ)).NzIk죢;YNy endstream endobj 248 0 obj << /Filter /FlateDecode /Length1 1647 /Length2 15280 /Length3 0 /Length 16132 >> stream xc$ܲ%\m6e۶mf.˶s7f'w{Ŏ$'QR67J۹330,m]UmU.F6;9NĀ&37779@@IMKK\ƞt4PwڹT.@  - TPHNPr54Y휁3{'Ϳ{;SZsf% 08;M,=L@tKg;pXڙظS_ rpaKdldUILuX/ 7ijoOKE],.@r6Fs%spWΖvY hndjtvK>[F6hc7vp̋=vSW܀N foFv6Sߔ;DoEyo=Wj W#ۿ=hw @ϲ1rp,M?F6 wN!lgW!zfv-%,=J.&3#/)W &YXX!nQGZ^FDmw*\<ISx3spY8>ƿϑ',odeb`bb ?sbdgw;4lobR?2%; >PޤVRPk]e^:2{ OKkzFid 荞Jh-^k%>xZO$ݹE3ȃ(?) ='P4$` uVF=M+i5 G5BΨ@H͢WbJe0^IU#0wejp7QN2- h|DG~T +M9Wb鷧 'ZU3F"*1w^R~*=Cՠ>m̭EbǢ[8?8fCk8hRO!4bojvaQzre gUMM3+ja0r4 ʈ~cR`@J0Ktp0ٶᴽ/}#I+in8c"GVD|J_fTL#F08ѝ9]j9~R+}pXa =)EwG[zTAkQ]}֊N"V{6NO˯rEw Pƞ4׋z`ɓ%-r0< H[Gdyk n7&tYbxase4v $ BM {Z4͏Y_q8] tPPgFUvjrAÞ2/ >^fKRt P g٪&3p= ۟^|iQ6"~n*0 ";CBE} /)uq]W$0a'j;R܄q*bV݅1𶤱mUJ8f*e\o6x 0o$[a{6:5X!ɮhx48+C]{r6.`C;y@R"x{K2z\ㄅ5oеJ a6efZ~Lm16*OJPP)'P›`tבښOS&TC~DMr1/TsL數bZ yhLg1GUM`L:K=8,Δ~ lϩ֠T0K&dv+@ГrҊ7[=ܶNU2FexAd\+LJMjcfTb~ &M9¾6~`f /*F`~짫Rɣ›l&Qի|YZt?O-;w*9țA^.Ld^s QwJdwO4>pxX14c͞# uMlReyflrLߖ&9t ÄÛXA۫=EBV׻ng,{X3CIJxK_ȉbmdPH5ŰfOF@ P[zTӶW8̳NC5KmCe4_SyU+Vw7 W?7K/eX碕 v< L;?N57VLZ%R':t0zڔ^Detgr2i>􁁴k:VRK}8c.Dz d *?-1q_Cz2ryJ7As߂˟rL!2= 0 PM1IǯxZU ݗ)ӊf@:åa&ms.j.D$Kƴ]Uf&T_U`n'QFMSa}a2'ɢORJTbX³Lv#l+щZ`\5.KyD|؈gLG+(2ا.cS|X D/FH ׳{Р%$={ qĨ6gI;'9fY!61mXN")`D݄ЀK)JP/G8T|bN=]xfa& YuKѝ{j棡1w~Qx4E[@3\F߷]AsR rvрͲ% ̸2]N]nSiɏ3J\p͌@Wnl_2ItJ[!ImhJ4Vo'Eјz&vuJ#;ʣ)V!~!iz:ʰУJV8`>h DVĊx e0ՅDRO1UC|ClBB9btj(ni4~>{NvopD0C Q)W@%h7aklV|AMCHaG@6T_;j BLzҡ(F_o 3b:wsiYF?$ )jSR{5B3\+vrE% ߚ]%F"k;5H\muN~=Ӎ\bC0:,fNj=84ޏRV^daqZГgQ}}c,&xg'E)$/)"UH)~Rt^lvKD[~ٛ]8I죢X<v]pG^kB_75DLJ(:Bm߼ᆓ-'ST.`]y?]v?2Sb503^%[9'$'dbMZ_\Gv6T<=(Ǜ"$A dS;jN((fܾ>ٳTۚ%> HSÞdD\>!;*DLE67>P*՝wV+x00Do^K ތ_ƇA{+lQDXX<h:ҏ'\)<}:Qي[s_ɱ4#X̭"B+;ݡ OhJeb9wZ5?rQݧ|` &Dht!p0&=5V* "1snQ4jL ɻ8ϑr:ï23-=䓬8Gf B/.$Q3/_#)`h9ܔBp!LnGwW,rUډv_5KB-'L7K9si~ +Gz%ef7o8jbjm-0N c#Qq!cj|NlSB,Y>k pPB.!Dؤ9~^F%3npKdXҗk2W naoꢿ}.vw]-J&ɯ64]8Sh1] ry塛)؀*GlwS-VK\~dG ͽ3)uKgJ],6~<5Wt86!2*ރ7< ʕr KZ^?&MN5m9Uxqx:rt%Q o`@C.Tn&vP.n<-GϵW!m՞{kF$V19kzg7C) &>,j"s폫HF)?k!tRLPhBb׌ǻ9 1 f h,_;ʒ&h·s:/}SAV[j 1jlx<[&]4AoC:YWƒ˞[cF$5+'hř&\r0hGdJG EZi7N*r'ؙO:⮅ ~'tx$'Kh:;>㤍l[(M%LK>/FGH ytg՘Ë[&p"SMt}9v #$uܢͬRXj] n^åtY%;/h=] ZD_)&iwXqز 7܏nm"ݞFkm"fbyTkN;L[*ڶwu~j~T3#XcB׬JMF{؞Ѓ}*Nt\O#o9WŬB؝҆@VtF/fzѨq_,i\+kpb!Ŋ{q{>gF(/҄N r/R;[kIRN㈗x6SMqurh zz8=/HcX8{2Lxl.Ygh)Më h6N)y̬ dZGۦ-trk=f"0/F<3Z"Ax4mN^C mo MX󆴐TS $q Xv""QIj3_&֠ þ(=h;0}n-1OFL DMI i%¦8zzlbg-l(';0ƉawQh{2njhV*2ӇPz,!>okf/TT9Mq/]KuP|tCܴΧ:ʵiiH-Éj=X+ϵő <3=Ʀ_%6f ?T.b/5kk~)Bq!H[..ӋRod-Ͱ 5z^8Kum$^ʛ=QׂZt,pڅ?vx # "hA'hc 'bEG F_UHr {#CW0b Yp%;pAI6h>BJg vDn:ȹ^N0% 4Wl Q$YS+}s{t M8uq 'OGE!+|>א(5E=m1A幄ޢv+wxyt8qֱgg]mlK/vM৩Z 9 ֡|p]){;Ur/oaՑ*[Jz NkR5^5iG%W=!$f@ջr:7^d`i@џ- Іj TI˖,FWۧ"qJP^̞HT]As : )Ogz5ݒWBzn^YG*hRyTJw*b̩EYu ;O>'1(.ÝZ-Nw wѳcIquӣtg]UVw'mal)&ʑi -]WTEHT!c)m> "!i+3̎+b jGKUZ ÐptedrQUhф=5}WBdr ۏNcChkU;I@JS57#<+rzٲ.4l>@uA~z̬Jߧn'tq{.Q(ArncͳxuT#%_~*:{;Zp_ʧ6`IY1G{OVi$p$c->ת*'4< L‘Wzʎval>O)O.1 /|ku: *$ |ٙ'm`o+ jn! TR)|xgO4$`p.Cnx<@ӫKo"7`ހveDS` BzsWۥ[N〴e 9lWK ުYec &{m17~ԝ NfAKGa 22kԏ +]&ӈdwbZ n7XXYIkES- /̿ z]gl=A;i&Rí l$N)= ;щ„0p±-;;(ZmK0Hy.sk ր Dc|Ӄ%/2E pÅgmcF54c͙;#e!# I`u~ D;sюwVl:قno:J3Bx{ǧهt[! [Ez }dktNb ^p)=[4iX( ʠ q6h Rն X OO )IʥYKm>L"E%y&4YdzT7#ob%(e['V.J<\̬zzX5\4gDgfY "CSMm* \( ؅~G;c+eleSNC~]ȣRj݋s2)LqiװTqOS|)6q%e r7lsDC޴l5r "by`F`j>r&̙KM̃xq,:CQ.Hwe] VS9"#u3pdcw AUF*qBnTĀv,W{`$C. ^/+2^a~} dBm|b:3c 1\=M >sűͤܓ6 j[ŸQD\+ĪvQ+D{L\lh`Aq<TM>K-s>ɹ}D6g'VXEʓR. ˞]FhX]Ev^и ڵM[3ċ9@JY:I(M;(ZJ؍Co;ۊeUo}OhKhp06d9Jn2Ƽ͑B4Yx jv't%ݥй5St Fk@2y]rOʰFͤs _NLX+ũMC爀PFglA|v5WR]ZS Lđ: Z/ʘGD#ѮfS:nNo(|"0K透H5^A}7%d.á$3p}6ѻm [ЃGJ&X71 !~p,FtMĹK?_v#1c&V>BnFͤ`%4dpvd !nl]4O0:P_9~ Cl]/ԽŒ_ ⷚYiWz@ɯUBZ{3*iftBYnڐ֘ehݼl}h#=xN$B~U:| 庣7f/,Jk㙽 VKe8ZY|cj dWKDu2ACUۮT.S`H+w= ;OS:cfҀdXf"@P}/@Z@ch}в/6C'"7yY(z`Pc$Ev`'H0ퟳY,HX[D dCH!P;Ӗ\8yE ZdJ ?H'Yw:&^D=+Q|(H>4ɘ8$@ YuBYܠ"z)L;&; Gv2Nq_i:Rȝ\2:#?S%>KQ4LjFtݙL7 \%,hA4,$u/0n_!;]^la}b;Xϳ&y $:!5ÉѤwH<̛z^ƹ'zԙa|NAfwф#0W|u }V7ķDm_{@Ծ\@<0.#Z6EdGד̜.h{}w0q` x:`ދ%.X[nk͉~B腦U]-̿ކͽ7Q!qѐ=LNN!mĩSh is] =X̢ɘ]u1? xC[%7ݱ#hw <2C?P`f QDIbvۼ3D iT([1%5Lk䝰Z|t]Zg}yK;F} ݓc~W#RZN=[$Os.[m1 !EV;2(_+ƻ8QET (QG2ʹ6,o$Vcyb}iyf&t|)Ʒ~N҇Sgc&i8/p3 XBYї 9_mGmM}Z*a_5+k$Uu6xހ{Q2,(]iXG 7LƿY~j`v^bhG\ PjϹ)^}(. uhO"A e#۟ TDju sjf& [+%ƍk^P`|K~8bf/by°| ? e^((}f0~Qcs7CA@Y A=48YkMu Gk%sXM"-"Rvʏ g2Nq-ԛTSANp>5YtH,ܐ >Kh_q#)DϧoջY+{jޒR+ᅄhyhı܈3_lld%-_Ye2nIz-!|nA-":WLJ3)33eqʙ R-q :D|v&[T7rKdFΣl3n913qs@8%| :٠_rjJН9..W_o2v(q!vV-:%)o.(69eۃ㘔7r d+a XFPp)OUosL|߻+M -|\ϤYݥ/tK\׉[" /n.q"22NE;Ui6AFދ/*9`* cN !<ٌjk)zE_TAh2\UjF~mOLYm^ aI,Cha .yτVH"3Px_9#\o^,fl oU`T&pҬ~h*$]؁ WE,5$58Su#Aq7bg|Q5P%)&\'k%Ť w bM<{_nWnx"t8#sS)LEd B8?k@j+C@(UX2l08OF--C^t%\+3ll S:;b{WO45sa떾Ȝ-s=xxo|D.Tez엻ᴤ҄bt0Aǚ0o M5 vc)6(T[^/Y%'Gv x$e~1gk%Cj‹9lEB8(.II3'U#}sEC;,c/U rgaЌ+D;N a15yXWk *_:Cɇt\d')wO1Oi.*z3O U15֤oڦN5zw!$a)KEZ% gsoOh1 O*p4B”057NӔ1!#v3;@ƎF97|M9*\z2 G%bt֥^CY =8lWqJ)>_Gq-Uu &)֚s%7s&@cO6y 'v '0lq[c*د;{"OA:e1{ = sb tV2=/ďbACTC-޴=;]#9'tԲ'.V!JӘM<~5sK9 {ZDnM{XQK@ |0>Ѳkp3s =}<%4$_JBx7R:$ߕJ &wཉr`=~֜pB D%saDi] ay {j#7g{d"6Tlvg[RMIml3]KC֙w4:YN7vti0VI32\$GCM)JNRN+՞ ~Vqy..pD1I͸iBӝ9hb5&W9mΥӵK.(q.3ϘwAB8Ѐ&Λƈ^Չ7$4qЬ Jo.$%dj€%*gk"|`qYMѤay=eJCn`Ë> 1{Oǧ3,ɶ``wUNX{8qbL"hN+KƾNs5F[RC{l0TCM&sjdvn 9~g}N*qPcWscͪa%Y!Pk cjS(C^)*5]rʼʷT[ 0S_B^{<bՓA7uWJx~ލ,"_@ d+OA-ŻjwT*-y] |V2vs7 M:qߚ(hyd#7&|?f -Zd/6bV=D$A ":M|9J\V jBN 'gfط^>Iə=]p Trszpdw](@E o@ȈiTRg!6? ˨S< ytY3=KY|}GmޜyT[=XS|I~j/#qS /fJk͂<侄N}Spv<[UW5VFOB,f +R(+[Òsn|=\t8V GcVh h+w fVaNg#ď&VV5Z[RfS_5C /pDnw专ukՈS-H'R#=Ekzy|Y:^U*_D?4e2J2xR6 IZ@2jp -"1KDLz~?~`MܭXmnn`hK`t!r#j9 ]ŰCY&sO8)xf2|_61܍BXB#4n3SiHZ@hyVʝ+Vp4߬ˈ|b"a8JGU1ёun?/6b0PV4(+~}%eȩ|ڧAۖ(Guq^~m GFv2W4`Bh ]فU`uce+g+NS)\=@6`s~ԳKGQek١ u0|z[~ױdkIA;#`QJb`@VU4$~}fLQ^FENmۘ> stream xYێܸ}WN0"2$6b8Nv X5]:xn/V.ERDǔЈ“*9<9a< |DP OID8E=E$ˈ$ IJpHJxr/R#1r H T ?R@GOB JJAXPsCCv HSCyF!1PPQGB1S'1gL db%B<1H:Id@ O#"7xㇺ:OiaټvB_lW9*%o=LZ։g׭4+}(i"b5"+Rt,2C0d|[:+3փ8R!t'NF>7P.etj,RM=%+}䖵'z]?ӿ?Kڞs7s!Qiƞ!\*sԝO_:>FSu[#gSef2V&`,@v@ <]K"J:@lXUdn+XIѷ)=]_U:f'ݴ+[@(@4Y]]?'Xk~GZ]Utu&ԊJT/?94iJЌ]74i 9CpǔΊ4׺RYӼ(K;ܕhz .`S;5+ n{b_~jgP 1c}Q1haCC:]hO: k7'nL]fͅPOjLk:㋆=ì\E4Jj YC˨2[uNjUbo{d' `aYBS,T~@@1EZiTN+a-qt<'2Pviy}?ML֕ܙ? f%L-7SG~%~gs|7-lg[}84g'Uw+&F_([W :Ш xw^#o̻\a b<s1ا67t! <\iաY2oOpVYܨz SNj T> stream xZko_1{ŢI 4$Ab!0p#*E-=g$;l9EC s^Z(a #ŊqqBW/tAkD\0>Z{ߌ"wY+~ WxV(\ϣ$| lN+j-V$N$ YڋD:tI)ZQB+1Zh! kk X= 6ce]`[6s2m#oq sV=?,c&&P; <`@Um'P m: йsiD 5[Qob/^oߓmŤǮ|xyg⨚'MweWVsg)òN.jJ  _C4Fx<컪FmX6|*#DT0KiwaG i·W]C]JDŠJFM%OZz` 䧲TS899%"T#Ac(4_m懸-?%GBA&jPYsR(RUO:!PWn9a%ɦ9"FEQYhE1Bڇ9CB]jcVX|?(`W<W'bY#jrvd\]{=o=^e]eUF[jbƋFؽz6π8ͨv#*}vO 1i1\Tp!bK<ߦj#brىZk!N⃗]9\-?/UVr69b<5{ \QiFmRwa+fG[rqLJ<KrKͳf^}pTOVydbpZ79m`)rw &YFXЫ ;[&̃,V6 )TekT%/@=I d5Nˡك.&]pZ#BF=SM@@p}+#>Ϫ̦hC2{@0:]{Ϧ=*/6瀭/$?>[n\O4ML#bݜ e3kx?z|w]O?mF]?v'"{n -iSiI#5̿y\.,JEV,"noPEovCjUv(-oϠi}NdQT`V7u-`el@V;RI٭0YḀJ endstream endobj 1 0 obj << /Annots [ 424 0 R 425 0 R 426 0 R 432 0 R 436 0 R 437 0 R 438 0 R 439 0 R 441 0 R 433 0 R 434 0 R 435 0 R 440 0 R ] /Contents 2 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 363 0 R /Resources 442 0 R /Type /Page >> endobj 2 0 obj << /Filter /FlateDecode /Length 5991 >> stream x\Kvϯ襺j/<'{*k/%"uIiz:>dCiWi|Vw;uw2+23ݧ]1dI]&0u>o&U_?|?~_Q'M2(㥺4V- UM5>5#*~/:;ywu?8m6uKy~ʸf|N4 lȿ9&<˥g s;U4 瀯8.^Ǧ;ZTEz"M{ k|TƷ I umm=;2X7Rn6t iTw9|yXܘ}Yr^̊Vs^T7jGuG|+6~j']CӉ6{Uwu&ٿD ]xټ_ͿH \xM]r"U$HytU>g-'VªP#{}nv2dqC}c<3*Yp_.uw\Xurw]?航|.  ۸>Yxl3~ bsߍ4!BkJ; zz|0/IJ'i7KT>u- ?}e,K^u2@ݮ>.xVi>)ӑm/\jN~Tn{/ⓁW۱H9vE;.>kd%XF bR6VFaXn' ;<]S]wBtx(H0rvt= 6=gOBaD6SP!gD&b5)_@q|a b‡ׇO%S]XX_Q߹$%Vfv&DԂ6/ +63 @Bq6:|+j<Fa#GPkXy|x2Գcl(󵭐ZZ~^}OkeL4%DL *x 68rV%MR:5xN$ " hg<р:WkJDؾXB$qV M(l `* 1?``C-qN6yi+D(\?i3W^ՅOᅈzPȬ|*jY>} k~Nd?Azh7=?w\U\M 6gF :j$W3j\{*92PHMů#'vհ?= ^ `dUy6 (r-bh@ٷlt8b\`oTcC"C-,9N2g'gB =êF:SO^r^l"xڐV~7U!ns{#6Pэ pbgz1I.gLCPolT-#(MߪΗ+M| ǧOf'Kle Z֣4`Џ%QP'(wر2V^&0/w`cuN..e=B"ÏO \j9 4‰~Bfs@jGdC/Cn]Nz ݙQ:P4nd|L`oc {=,ױ$JaĂBA?2%gK*C.@7-̺5ΝqF: t5U AM9ɮAB#!ɘv`"h7c2K,F_L*^|N. Vkg(#}] j2,\%^(cD(W9!73Pwh4##}nЕ =t@(mXuj3f< K{x/ı*f{Oi|ѱ_Ant/'sabz۳f_x"1\4RD6RCѮ.Xɚm=`붂H;Oj,+isdU1vn\_`МWրP f{|!1!n 90V` *~& x:4_9N@0~P]>mX FkW0N4 )q_ ,ݼ{āg>Nz#<OqLujc[)KK\;~|&x8 l7bWb0=SZl}T̊YoNՇ :U++YDWTIJ҄,r4S6  TSty&$3ٷ uw"ڑ-FT`Yw$ߠ*nRm~ tə(+1li{Iݩǽ0^ꙡCQbN@OfVAM VT-A? .DtE4bA'`.0*Ǟ9'~+|ہP*p y "?<; zU/sа.]R9ŬisVKѳ桑`# wN}{,B kjϵ8dW>k&pY-/ ;%FZ0L#\QͼE 8O. ={6X{CFShǨ`'yac1+϶s3/Kt7ن@!gjnD/rOVѹ`v7=tCXb د 55?5N}y&hiRX x:q.O4-E}ؑdAթC`aN/TзSPjfH@SKAsK.tQ଎ k%ŶPt*Z⻪z} X&@hg I?HKHDe广bx&V 0ƙbG m%ͷ?BGPgl84ztlLY~HI. & E%F 'Y4on-$S*%j^R] 4ib$}QOO9c! -gq{o_ރ.tFiZ +m) SеKR]bœ[{LXM,I c"R`P"s5HE]Ǧluw81&XM+(V9'=' qF L`,A=?u&}#ۋ ?X!F:cC#*~X;r DrMIYyb mRccrAI%q5^F{ڂ|KLp`a5y5guQag gjK0[n;S^?(9P7ӚQS|pK]Oi>֧f<{ܼ'N: GU ]X-&\>=?O΢ M7rP/#gh 6ŒX`K榕cСQz? Zfn(W~z'whr,ҜR2_+ se˵*Pa@uCaZ#Rg@),1#k"9YxaĖʘ#SJboJ';M}Fk{lKVLlGdν醩<*ghXdA/l9;\O8 ߮olIzAw\;^B[%sH(,(`O*bqF@xYH[ 9 }23/b*|/R- 8mHGQ+hU=>/A⅗Z5jஞuւ;]"jQ Ivl3/x[jb S\!ѹC7dW[!%z^1pkAk(6!Z=.X.Iב% }㉒Su,  e!IVx| 3 JSA6v6324ؑĹ@qgf#6sؕ&fj{HbA@VI $.l%PȲPTyiNԋD9ؤ,{0ц&TfPy=t|,:q2B6)V^ =q~Yc-*gYbe?ڂe_)D}4[jHʋE9aK>)~.l8q2˧*N>9t;xyX EkbbbqV[@^Q0M??_Y~MRR*^8J3ǨI5{mw2B\(Bp\5fR<>ك>wϮU%$Կh|zrywldwL~"^*+~<MARx-[Lw b {Ms"}3` Z"NYQ/Ww;h$΢MZ)r ^\i SW #XD$A*%sT2`s{NibGsl(Jy+711qq^̀L,6Rd&'GrУ^z0ѕ`j!|͚4DbI~,Vq#-@X'*g#%ȿXH.^K} w-+zRnOU7իt+wփEvJQN&kkqx'aw$,9Ů/a|ΉsSWI3eUQn3UnhNQ'%5xyijK^j{ J+SgK͔?#)c@_j,4Z$4*k)BoXOZD> endobj 4 0 obj << /Filter /FlateDecode /Length 5964 >> stream x<ے㶕~UWF\vxRJz6U<%v7IԒ$AA}z"q/yſ-*L᤽q277û?۵*򋺨a]aLaftaNBN)>TޅöUv{uPCB&KS7./BK}`MXD!,dk|f-(L) ,S7YOJ\~nc}}Jw״.vGmru͟P*.Gk^(:t+IikRV<K7laަ߇9P7 P [@y˽[ _s Mǰu*” ]BS 6 a ݪo# jw +"Q[ @](LزaJDL' 1<T]1"ibp["bHP3.SGG+ %Fz7t&209}W(U:TaZY\X~grDJUfRByR"1#ΟU6cI- kVLP l,=wQ}mvam;llɢj: טQ/ ‘4ɣ6Tw=}l7LL*XՅF.gSQR@Jʂu3-( EXH0vm9t g3`NdzH4EzAk勲h}֕[G6Ti׆vKH MPm{:8X/.ƷFvS`t95C7$|P{kR#@WbNݶ&1]?os_3( LJr󥻿zفHsT@|f=7+Tptt}69b2=K'|_N|CM1p,(~ ܒ` /J0,j),-1]l^Pn6@- *)R]0 Hn$yB_BD*Je~‰dO&n+~ڤ/B乓Q¸7c ,ˋO@Sv #.0{l=TF;PBl"8rn!$ z,4&C:q͜⥋>;{)ؑ=Ԗ,cVZn/Sw RN^ Vo1QVe=VYQT b%b?E+N5+n *V%6D؀<9ꄃp73n_$n2 .ɆM Pm|<1FzZu}}M|U`E,Tc;BΐXH"wnSW&}w8!0c8~= }"O {gE ^gEa(C"1s0v7pu_U q" Dvèt )uֆ6??[~"?4~Ik kSD Z12RTx=!Z+2 gfMYk(׺ml` ‡R]:.rC]K3Ch"]͏F?0(mYj0Awl֐mu(m hdQr;qzqTK,cl*I1ȧ4ȧ)MK- u"NڻW9P< vZڏ W߱# Šb5Cp/ ІIxG elZ1&iOi94R`F W>p|b =߶|[Ω;rd(e$c Ļ{L@@ux:kהb}7K̚YTMyh{)PFT s<[bdZ ΧP1Զ P:v!;bnZxzfdQ w5_Y.=a ̫êѥ|[MeDys"DV&% )HG0.I"ʒ>@qt֬fP|Is-.A N(qGR9d`A`}xL4], M!{b4QZcMn6. ˼*l4O*6;\EM(|2 Y&`b"+: de7f>B&fm7|8lz W]i8I6bYJW,isӧngY4ծ12pBۊKyﱗZiN T!\*Ai57VGzi9)vcvW1heh27tcn6>P㕳$ hXd7o\1i;09`@z藜" 0#C(U1=%d5.vMLhϜA]ӝ> k\ّiN?šbBJ,Z76;l3\v_OƠ21\uC&cB-SR.KWRˢ(?}WOϙd.I“$0@Ô0%%0_0}|&i0i k.JR6/dlbP7L 0[p:Ðߦ=zFWD eo!c&L6tA鼞MHhMϠ5-  =IQdce\z6 n6-H٢eaLj @h\ŏG(&VV~r*M"'ͨ[d U%>2|W/l ]t.9If^/׭)۩Ǚ#vy]o%\Jidք^ztbfTc 0C> :9;<N D%:zh< )AvT<̀_V|l3yHR@p(@/Qcmta_(xgv圚]S+%1ep%㣔r+6~OnG <O? G%d nWa-*plEibK3ŰyS a_s*Ұ|6_B pb^^tSҋ3,2 @z'hc>^I٭'R`r̕6hf_pbHif^yWQ ʻ* 1K1cKGIoqFa*sf99Ǩ:q! F!CcJ ~T ʄ?N; Kv1]&xebm.kOf>&6,#ۍ;R0]di9[<`eÉTnpTI[^U:3cg‰g}$da0!@dKRA!)cQhy.Ib"Om s?$9U]*?g6_޸$w)){+"(rLIr\yw!?<] i_01Ȉ#;9q`˟󉗛VS^,zACBt&Z1a'eL>:go.Yh['D~'$O{. ), Iw+#){nn}Þr?h*o4ru8mlj5;qaXnCcC$AQ*~ 㜳+> endobj 6 0 obj << /BBox [ 0 0 432 720 ] /Filter /FlateDecode /FormType 1 /PTEX.FileName (/compile/fig1.pdf) /PTEX.InfoDict 460 0 R /PTEX.PageNumber 1 /Resources << /ColorSpace << /sRGB 464 0 R >> /ExtGState << >> /Font << /F1 461 0 R /F2 462 0 R /F3 463 0 R >> /ProcSet [ /PDF /Text ] >> /Subtype /Form /Type /XObject /Length 3209 >> stream x\Ko91>$y M a0`/)QjfsH۟*ȯzCi墟\PÔJv^\t/?Ww4ϳ_߿;58Y]z>4؅fu]]zԢߵ8_qoz2Y[Y{/?sq{e/c2fL*):V/<ϻyCF{c&(,nO /wzscT죞f\X+网;XO3qȊB *HK:U%I/~3gR~{:{Jip7&ϳ;SIhO``2Q'_nɛng2O(=hn7>oi0Rw~~XƋX+h/Y'4^|ƓufCO&!ޘ&Nj1^d?!1Pb&MӓFLѕ3eps^/?]|w= `wؼ?(F"YR1YKc\7΢^G)@W*ajNޗ0O#7|;ѕxi~;S/@?y^L0d06Prd4 8e\+~xbh"$̫,_%2 qaF4蔈\n.?]|jY3ށ0ߖ$IfmŃaN04:~}]a鲼Z&l}2ϣ\s1Ͷb73/+ج;ɰ#+=0\ |kwzT譋o,.st39 `%T K,)^@A" UJX񉙜3L OaldBBŴAwt$"-7$:D~jXe!FHUCn #Ax9?eaBdS2RX!:f@BgQpg_05QC>"b}pܳ1t\菩>VAWTسx>4?piI}58>lbŊ=fN;h>s|e]KÚ9}TR1H%F1^髽8>1[ _xi2t.e3$SҰcN_i9>U.%8O4TI`zT}{#`8 NiV9[>tg`~Ym;u*ޓUz|V9κ8!lGKI wzg)w4q}l+"y5z.vg(1gR?ボ?AJ`rK$@rX $AtrI`(J L-  A).|"Vԑ@2-X Xຎ`H灆'+=sA@+t@A!l)`(!=%%l)`(!`]SBW X{JH{JJXqվ@LG iQŠ+=%3v6%RjbJK  O]B M=ɏ drVGNWűSu)ڇcfrF@Vr,1Ȱ{? r`7i@bX4~h#r ߹&2nr A[fɁ:Lr?oW*ey*S,W%^2y=Zx-ʠ,VV%nYEʠoQeP(x2([AaE-ʠ,ޢ w7(p2(vʠQiCa{dueѼZ,aTsuoqB6X9)R>']l`xd5^q‘> +,)" "@ %%,ҙEB"Jg %~Y$"o P䷈xH([DBaE$-"0"P/b2"H(_DB OY$S1͂qoQDEuISsEF Ylb7+dѯB/8" YkԐE E!6<;dѯC;Fp`,5vȢ`cQ$!~(a~ vȢ_c, 6vXqESC i$dVGG M""! QH(EBqE$^Dc} AFi4v NUu4 J.A1~sϕC endstream endobj 7 0 obj << /Filter /FlateDecode /Length 517 >> stream xmS +8⃽VnӪͭ$A!V}@[E>0̼yo poln}VbtwOB*ײ]SVu )1PJ̈́gp_* E*],g:WS yM8j!wZV%KJ˼W6]Ƙ40˂ 9.BIG&B3ƺtmUMWw8Q'Ɖk.m9&%b _b7!5B3M^+CZ¿GYu AApUVuಣ4xo> stream xwTSϽ7PkhRH H.*1 J"6DTpDQ2(C"QDqpId߼y͛~kg}ֺLX Xňg` lpBF|،l *?Y"1P\8=W%Oɘ4M0J"Y2Vs,[|e92<se'9`2&ctI@o|N6(.sSdl-c(2-yH_/XZ.$&\SM07#1ؙYrfYym";8980m-m(]v^DW~ emi]P`/u}q|^R,g+\Kk)/C_|Rax8t1C^7nfzDp 柇u$/ED˦L L[B@ٹЖX!@~(* {d+} G͋љς}WL$cGD2QZ4 E@@A(q`1D `'u46ptc48.`R0) @Rt CXCP%CBH@Rf[(t CQhz#0 Zl`O828.p|O×X ?:0FBx$ !i@ڐH[EE1PL ⢖V6QP>U(j MFkt,:.FW8c1L&ӎ9ƌaX: rbl1 {{{;}#tp8_\8"Ey.,X%%Gщ1-9ҀKl.oo/O$&'=JvMޞxǥ{=Vs\x ‰N柜>ucKz=s/ol|ϝ?y ^d]ps~:;/;]7|WpQoH!ɻVsnYs}ҽ~4] =>=:`;cܱ'?e~!ańD#G&}'/?^xI֓?+\wx20;5\ӯ_etWf^Qs-mw3+?~O~ endstream endobj 9 0 obj << /Annots [ 453 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R 474 0 R 475 0 R ] /Contents 10 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 363 0 R /Resources 476 0 R /Type /Page >> endobj 10 0 obj << /Filter /FlateDecode /Length 6191 >> stream x<ێu $=S7,%g + l N7gROM}έbuJWUf6;xfqxЬ/ea#+IH.T\Sc n!?p4vg}u C$ z5է07p(xN nO,` Pjuj<W:+ ,7Hh@ ?M7pGX P~g.ѤV >r%3"@mh,ChFى ijfc?7ح,*Y\R]YoBAO.[S"svmX`@ai-ҙ L/ hT:e6݊bK ۰lM=q `C;m[õV@/,Kަ.˜W]-BD[D#f-R[u=`3.ɋBɭU:Seqx R\W<-m:" \PYM)}.,_xn5qZ;<5 Cp&BfMԩȻZx _Y/iP`^v-&1, |@Iv"O7"NfVW?i#M'q=9 i[:iaen3HIy-)yHZ* #=ή@XIQ׵Vgh9c0̠EըOPO.[ C@v8Ttt<+M0YuB{7-wIR[G&YV$YgUJPA'rvIu ;ּc`, X(ԌO>ތ H*>^\lJ@5sōnxZOb,l}'hDe#ۖwUx6U07WRmt[|xvfT#Kҵ%!;\ka}szy6d{mPj虚iR4Ϫ'M+3ʐ¶rj``7yM~%Fvj%~~Z/Bےk\M ˛3.>Kwu$;(\]rd듼fNf<4c.h4ȀZZJ1ޯû8tGukn"9c`31s@9h3ŞN"S ?uúmJS,yRtaI?8Rҏb'."URN^;KZ7}ExN\Sy.9#0"v)R y"ih\l5Θ"TH.5PmU|2(~ذj%SXŏ!n} ~D- 5z)UTtC!GsA! uWAr%(7d"ucmz|`k"Pː4qRغ2"8VA{Lc10q104l!XZQہT]1 ꚕk6, < )6C;rGqq9ҭİ6@5Q5/ms##q XÙZqbZyqȗJxS(OĔa \d&ֲ_oe^&^fpd=@)!|EV,oO%JF9qj»I$ aXd9s>GFÖ]DM}->j60cǵ~h0h[Eha]'.g`TcmGWNNh=X]dD|ӑE*za eyri8c & '襊>;s.Cs :yNbሢ2}lnO+qBVNقMc{fC"ׅ4e?dsU% G٥DZ)ߏ!Џ"DI H|2"iGj${FŒN.W)gpt2 5֫*#lak|&l<0D4DV)pJ  W2 >}aj$x +SXN+ 9ZzܟvLpl}!+Xo °Wpo9I"s 9p \֠_gM'`ݫùW@0_ޑf6 ʈQJ+ V#n/zɼvd՛T`JP."h&ٺ{unZNP{9+a` H`]smÞ9TOPšpJ.?|CE/A:?}YlvvzJ-X2}ۮpQ3u紇.L)Y|tGD,zZrIu{ j'.yUꅛ(c=r:`]+Cⵈ?2j}A*3W+E*lwřI'{sݿ 6 0ۤJI* .nв&&"ҧ!c=%+4M^]ξd`VAoc\fʒx̘]-uuzr1_?-T.HcɥbajF)&iӺ c_}P8IHDZtꈯY^'+Ǩ[KzwA΁ODd1<;J5?6n΍tw"BKlP 5bsh+G- A;PEUTSPȽ TҊnU|Ώ~B4<肮3V7L3P"_[&X׸" :XA-7x5\[V{V`$MYӜ A66!zݒ*t{Ӗ#O)H iq _.jo䂹%J$P%܌|tyb YEew"z' ;/W^;E*-¨ %F E`ud# #|]e $l鲪/b;yK%}dȵs{^aŦq&qZn < 9SBfY5,+ѲHV ~0'9& /+Vb6^(-;;6IW+{HF&Qs9̮8.b2iT(QT:T*d #gKf Tl=O]c#F&⽷`qmHV)ǁteVԡ(61]\Ϳj1~ݹ_Xڊ a{E4F<`OT$:K |[h]<0Vٺ4 9Ie~$nĝz~jnnce2 \8Ǣ9rFA]p /phxjCqEIs>lHE6#3reBuLA1nolJ4di |xX4d3Eqc9qoJXN`y՛ !M'_πyGXha'fl_ТEÎi|CdI;d4ZD~߲w򩴣R%WK&[=xBDZ9"z{r]yP8c"%B򡉢0_F4Nm@}M8GÈw%9C%r<`i{UWhjid'iSL]`/\:fѴsLLXWϽnː|yO(hXt *U|9>ku!6A~wF.T/s Ń$G@ endstream endobj 11 0 obj << /Annots [ 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R 47 0 R ] /Contents 12 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 363 0 R /Resources 51 0 R /Type /Page >> endobj 12 0 obj << /Filter /FlateDecode /Length 8247 >> stream x]㶑p:I僓M.suuUq>h4i,iv=IPY]jkEM&MMW߿.j-Dct!rf?Y]FVH#x](ơKǯfBw|/߼^17Jo&d^>ܵYt~\YuC|^]϶YWy(fFۻvf5㼨6T|zlwǐْ 8,jVhhp2Xa^wAhaӻ>\q6ݫ޷%0@' :h˲a>? fe9Jմ\])e"U<|@⠳%3(b<}I\m[o\Lqw{nKQ1/65m|e+Gn,otg;GBkpLA3^fiV3<ځIlxCmfح7[bz׫x̉Y0=w$pmtvw ._{8_Ňf~`1-Iݵ`23Tr ޥQӦ4[:>z(=jg\g]BE۬7ݜp84Aöe%߮7xжnޮ,lEYeCg4H t/ Y2K& 8Y:ir`"ޯC\@kSHʌ@Zi@L R8.iWaYtپonws\7VNaWN4o9g-w]QcjVZV\n/E죹0-uo/^! 2XM|oGEk0E NW9P:1rh*;SA\Lх/)=/{'(Xz,Kxs?_':W7fD~}n92g!^G JR`EH(qЩYm5CfhN$$ < N>Ͽ3u褷F0^M5]gTesgm5Xk3XM lܼCqo9ڕf۬ ZSkВYq.M8ɪmp@kr/=h r=а-rkQ_ә,!VrN۞alhu )WB;G̽DwZшUtt=,Z3xH2HQU^[<\dJ43'O Y6 ^77$d6q$DpW]S UWHfnx+I`k>.χP<4)UHECK>6ЦvQ˰YWo_a&|"9&adqW9)-$9K.. {&7;+VȺRl6 ]*Y 6OuQS! 'ɫـb6dֹoā&OSrR *Ȃ AJb`fE@؉bEVB[p1յ xCg"BocP`晈0UaD8!;D!MhD(RT^JKŭ+\l)ܖǀwFFg󰊡p&S50zL0zD?Z> Ov&>&}0&u4&@\$x s^Y)Ҝw`zA: -cgŻh6ZM $D:IGp UYR0>P|x(e"[.Ab%?F\ge3"xYf.Ds iB3M(Fv;g`D[#OOvF#RSW-޽gNE N;Swd?Џ{hDžuRЃ El'$Ju)Ug BbH[,3dW kI@؏a{gNB*- |uHCMSL% >-65RXVmT Ru7*jV8!-e!Ah \B{L-8 4MkpHܴNO& %X?G y]2X -iJ)4Ɣ)RYI^, qВB[`=4a/|Q@Ĉ L/00qJ. ^O<]]0eidDfqJSI%ǰaoRM_[h %aSD"]Dm8.r/^BS٬CA2-ς C`*FYU>w>QpT'mbϹ,tb"r1`3B]bHc[hJ[z64*Fd/9St(Gy^( #L $*]w ңd4-uٲ $~ "V rΒ͵ "0;A ,ʉXO?+`X' +v?עbx}'N& ʢ4!/Y!K vT#D 1%zb}y!sQ Rk9#w@$CdHr A˺i|*H͟BqftU@y8ןrRcSGX!q+$êȠBqV/o54Xj"/P6̒UF4&caRR@ ɈPr_O/wfpCpE'H 6ĚN]ΞLT<>fV\֗縴zf}f0:P㩎PsE9Rss<qI看_s(D"FsFK}h}Ι91h}&0q9>\|pdgc>gi}qYs.F|}8302Z37!F2iRꔴ{s.~9g@ٯ,ϴ'ӣ>([{9\s.|}9_ b9c¤>8]s9h>@猁$9-t9TS?>G+SBxc-F4b2`"I}N}ԶRsf}Ι 9!s΀h}f9GAVP=lIsnpy3" WSu>g̖vs1+dhX5M/WCkbSI+v@M Iwo/i; XiL@Wؼ g $Tޭ",Oe!:cPanɈ-*Nx'<{It;I2&ixx0'a3R& cf=A5s!$LVd_aŋTH,gv*T~7b1o6$l%%/ ͆?lqՆl2Yc߫ cm5i6˷G?ֻ (#TۣɈ*]=y|{x}!˷G?o@#; G~{to~6ݏ Ov&FmۣGÑwFqgqdg`d݆1$6GzA,ySJ;S9~{t x ӣ˷G?o# 6nئۣZ݆1\=~{Ԙ6# 6xdD.6wF0K|{ LԦT[RۤJQ0?J+뤉J%1d-i­ *[\^qT 3Th p޷:,h*f,x*[jܯ21Ō,>[Sq](N1IYc5"iu`N8Qds(&M Rء~2r 0L$6qߪW4@F9):5}ʮaϜa1G+%KRr){}(` ^BHv%M*a2…i\QWARrp@6=VLr[k~邿Yƛ_HIK݅(IaiH,*0ZbEX$559nxƈ\]W7WLS嵠9͌|}mI$,_후viV;UŦO͖N׷_ee sټj:ߵ7\0gaU+|BMfiW`.q@"?c5H[]Q|uzRJCAzl#%y_p|k|ے0".ƘN6@?B,Jw SI]jL` svܣ"ic[4IZ|NG)5_{9xdƧ6LJ-pאش/Bfjh~+?5Wۿu˘qdzx@,RiUZF"0@w+ YT*@:}IOWX`%gӷwqg\/M㮴w-jEMOb |s ys۸^yJ}m#O=>R{ S;|!դŁRH@p2AE)+o9iWEwY_IP0Y#6u}Ȏ86`1@Q w30UnՉw.;P_ڿ3V;pJUC |W(p[ ϱ&! |7I"ɽ p"LnAN@&LTMqO D5-cO{P!RPeձ< Qޜz@ +T!gl/dVܓN@ﵘOd%TO#zäҾO;M!&*G{ZQ3lJ a9*{I[iV**U!꺷o%f\ ff*fu |Y?S/=hPɶF#ĜjIg%|҅;d[O|+D_('fFGm_W5 v:ב0n^ɋ$w)Kk%>,8}*uFE!/*>1>SH( +Ɔ&!6>QOG =weAe5?&/Y;sfwh"alT fB䷴_4. 8XUsxr>Ŷ'lÇLeYOfԕZ7ծ,\ᛖ-0=R,YVx z=4entxЁnϮa+1-2¦irD}6.*#n י$*?e9U,خК^J,3X~l`=|5_rf ^氤H03h"F+)`lw|aͦ>W75QΦvZMZ\I_,ūF4Ċ #/V50o6/҂ endstream endobj 13 0 obj << /Annots [ 48 0 R 49 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R 63 0 R 64 0 R 65 0 R 66 0 R 50 0 R 61 0 R 62 0 R ] /Contents 14 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 364 0 R /Resources 72 0 R /Type /Page >> endobj 14 0 obj << /Filter /FlateDecode /Length 5992 >> stream x>nQ_n-Ja_t0zğx Vgapkݮfy*A;=C- $(QJ#B V;>UᲢC:?ehS;'\vOG}a'R=b,pw[.O#`u]td1a?0ȩ7 MQʜoG |UŨ%|n}vS33aԡ ?7dOaVD3l~ hBi pGtႠp:H8YlUɅ )!€%S;"_S!"qKM|Z-|hg.%\$ (`nŀڋB@[5hw/;yV`_=r; ee:KC502e[|+.'<؃@W 2!( R,JDsyclfU\AVVժxFױ8l6X[kWl hQGvoOg0C%߃f7t= .08 =[Z8|a?F6ZE>uS'/m. J9TryW#\>| `aYcۀw(L[;LQ0JPRNI e6qC#1ncл5՛xh aN*$B`aS pkBk6GgEF{_wD 4<bvaA$m~FU R>I}-Z{2ԏulY :~LWCշp3ec3= CE[OMcqz`}3ZHQhՑԐ"T;]:aYe0!L˺ H1m$7Lƃbt h;Ǖ o|p=76#QmL21C<d9ѐ:;<> /Xh+Qe5O<+E84@4 WYG ?lF4h&nFa@W?͖p+~fv\;1aw'j>ذLJrލ eLQzǏyو 6YB6`*~E Z $s\HFcPz#8ByLe*--=W.SHz`ˀO\iш4[ۻTPhJfPBx/6cIbc+lrJ]fl$c4%UaasYW߶ |rF^WXb(FU"vlF#QU>=6mmWM$;Bsg1rlkQi۬! uI|C68brKE2}TUfW#6l^GEH*{M4)>y,B@ڂi4@T57䫬00 #fQ-E"bр&0c369V!Z@ UW,u0^-?mVѰK]TS[W236އ拆 ]2D*6vv'aYPQbh~ݢ+QcđX1dK$&6CzWu\ ^WU੕f02yH3kP+ȃ>O|YV -@DŮqY`M7 /I j A܆0ϼ])uA,0"5Kn.\36FŦhۙp:ܼcͻDbkD gi : q=h$Ӌ}keya(=Ǻۓ- Q/ &{BGku'9e/x+#P#6`C`8??r WgdٌoX-iv"FM+zqN$CVݒD})o\yr݀F ۵^BOx6 ]!;2JpV|'LUZH_, BBSQnJ&s[5"7O=Z \: °^['d#,ԅ#Mp!ScY/;^ ((,#ccn+WPe|'u?2¢Sl{..R82Vw ykIC4 yuV毉e0LȞ rYNxL?$ȜAe9&Ojlfg'O /ӖY!a9;8fm_¼:1(ז.GDȀD–5{6v;NaxD +Pט`R km̠at%v 67-V}ձ$xReJó"˫u91i9A>-M9!Itг Z,uȇBKB&7yVT(8qjg1p11о j>r5fy6}/Ma8vU;R1݅wtK#aW5 6?G9b0!}*DK݁K ?!$GUH;WBk ؞ƾH.{~$#ͦ#"(؉mBSBP[B!hrV. X[^I]jmzRezf ''ݞfXߴ,jA7>"Fi13 |t,"fv8-1׬prխhVs FY!Qn0dv5 U*@[]FNZ VHvCG8AC^&F¢>1?ؾ-FPU,a S WP4<45r>6wnT7;LW'H`KZZ36ՇNҙM:Xq%uMRq7i ߐir"z)3d;>4,]jH_ (Í7k^,#=׋  %@q%a8'+`F,T |8p[u~͹]yAWxhfIac|ph%gX Ø9.20E(~.h͈VbV̘Lv9\ Q+$ J pzb{ġhuDJzb} qj 9: 5J*2_ zbL V+ۍ\l| z{D.H>ppGqoT3X"K@?AV Ew1clP숰4ieaׂR/ ;@٨b2gKq,4h[&ʅ K3cZK%$/0TGSv ?%[R1B·PLx437ǚbG 1&K S66͌O[fƥ֐TY)q6ݴYY%oؖH )5WOM=r,*=&p 44*W[YEgT{PIL@^8M*'$k*G½59ջx}SLUC. ҵ*Gi^f븐4ص I~jF yÕe~nu $}eԜKX5m ]&(KW;9OnH2cGk pBEI> ,b")_aM댴B6bzIS[f!l (Ġ&0hZ\@n:&G=3ߞLvo2Sx^ǖ'h-Ӱ4{0;xwK3kEN` 7q7?q9sUTpvYf6[([ɇV80U;mIM+evoXn?s/tI9-̟縫\cą b'` MI2I/jTWd=Q[~%0xpDx=fW'Z*OÃޘ/Lϟ:zWW2cR 28Wݱ 5j+XW\=7_x(<%%*1*y>8IUh"5zh0i:( Ft0*F:pZJ͌v6 :7ɠ߂ڶZfm+t5s!V (ø!71e3^L +2 &r2KB BLJ硙Prf$o9u~3 '| 4fpIŢ|bA_HVt|X}ח=IR%[3FN;r>kE| ۂF;< * ko⾤JGK xh GVfL) ?!K ;"2;̪oUlgⶶXqa&qlt{R('H+h3]$vʕl0JW[~w endstream endobj 15 0 obj << /Annots [ 67 0 R 68 0 R 69 0 R 70 0 R 71 0 R 78 0 R 79 0 R 80 0 R 90 0 R 81 0 R 82 0 R 83 0 R 84 0 R ] /Contents 16 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 364 0 R /Resources 88 0 R /Type /Page >> endobj 16 0 obj << /Filter /FlateDecode /Length 5529 >> stream x;]H-t$7I >y;;>m3t@M_|%$4H"ȯ@ߨ? d"|{~g"39It[ yÇ&VEOo>|^)e5m8&v&c,ZE&Ksv.#wJ&aX'˻VyQY}](X_,cYYLM˾.oZ|wh9ip1Zk~EV=ҝΣDi$FՔEہr$, 9RU"`$k4Q( U%pАLQ\SEj6c4"ycC{ 0IY_SBjn i/Ga0]S$ 8G?|?SL.ɯHHj~/8'@Ԑ+bY4IKLYjDHG37(WnxE.'g A'm1D&0*&ov:ҩ0d% *iED)IB:0<=#cclG-\g@w݅i;T~&=B_#]`*[\߻&)O"JHBbƆ5lG.1e_cC/]`\hcuB^F +wD3`ۿҹUB OK^ER*r]ra4ς80_&v"k*-lrv?ڢWfdKJ Czfw>kh &klR:~fse|?_HScP|E#ha@"0iI5*Ld,+n#"Gv`즳 ,Y ~{TO vVxsDnGj4IbHdhJÉ+?R {#+AԈߥ[XY3!E "텴w"_xsT Wl({*kۖzŒ;/y*p:)h`RKNwvʧqk"|Dm8akeV%d' tZy8-y.hK]5rzH F$,7RWV;Jnl:_H>hKNg6ȖٝI8=t:FצQ{9E[jVqؠMNPL.J6>էK3x%9!hpf<$JI_Z+U,>񵘂صt'qJ!7;G`@M&B&0u ` \]++_IǮȖbת& B5Ն1A#ʱQ˞?ctuhMa qZ훖e^KHXt*22Zɀ ڮ{v4/$c`"Y T& tf\˝V?6sZ\60+kڼ4 ( \ 6_x Z%9ɼU2b(;sn (H\@ h-¦.tY݀0xq%0]oLrdy㕓R(Vƴ=:B^ޟٖ~\I@ayV0_eQkb%Gb—M]rggCEY=Ap+Z4uʿųVk-`t>0jXٕ|Dw]$x+.Be!w$(0{ ?/(·,xgS XCEfrB0;+831+-]i[+5nЎux]`@К,8; s!h&uXjF&8`٪-c m[o9Z.ȟyJlcֻAhטWg=FxlU]M#qAژ<. ]/IVJ4fa7؏J$}В'S~I(NmROWxӥ&fB7kB}rs}()v Wg'0|D"2' O ޼{wu`@{h3 mfi")nzF{MhlSaNv ^]S3Zfꍕצ 3bXymF9" Y+YlrpgMaS}Ҙ4Һwe9yXP% TEgYr hz_9+.d>hؘLgyV2J;r CkBLD^5?(B"JȑY~!gPS웻f;"$ e셯re_i(YZ+%X0=7zvӆE ŇdLRnOƒI/MpXAJ5R2oy"W};sKXQP{iM錑`VlL&ؿU!ӫ zpJ!l]$ĨJc_jXD&3GEA/&i޲leo72*YRDxCl#dM fgʺH*݃P fɧbO\?s5؁uװߴN#2pzz"jN;s??F8{񙺍9@bk̯GqZQq$!Bx3$՞@mSCs&=R'*/OCxia:OY&1.8s}%$`-9PnWW4 ٔ9P@{ɯ'%Q*G KP::BIp^V+'?l2\T j 4duG{a UxPj6/->>vT,23K)*E|ޕC%߳uAA8|G\ֱjdp:aFTHNMOI,Y=Mh78J+)<ũg-DLbW ZRv*!U5Xan>#>(xq+1M&_\%Գ_7(-(`,Ul \#!8i5עܦ.W@'["SJ/֖AIgnwu; f 9Hdo2WRdrKǠ$U} f'bW+#'u(K>1qdQU66Ba]9b9D#o3Ruo}M)w51st}S" _텋ra(1?i'?l`Y G@&b 6Rۮ?Uk+$ ߛe@@!mF8 E/ By䃋SL5zrxESe1^ qB*a!@RF$^'mZ aS; #epAJRRMUw!H5k?W?_aB8O)zٟ^us>Xl{H#O7T|z'xҥȓ`9$Ny 0i11^L&Cˊ+m KA\-鬒46?ms6&y6&' ~ְ6h"qnIE:MHae]2bBAގmգGXN̠K2aYم[,+EtyɜdD_4"SKAt\L׹g?96^p] jkځinVX"Yt8&)5ZW ᅃNd8w<*#AH*m[_4;rtSpYrH qh mA\9sPҡ x_k endstream endobj 17 0 obj << /Annots [ 85 0 R 87 0 R 91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R 101 0 R 102 0 R 103 0 R 86 0 R ] /Contents 18 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 364 0 R /Resources 104 0 R /Type /Page >> endobj 18 0 obj << /Filter /FlateDecode /Length 5668 >> stream x\YƑ~_OF50E ѮlJn,D4j+yu֬4OLRwOw?|g_]-?ޙ%VL7&_sŹ};Z\na-4oh"3ҩF츙GM)󱰽|]w?gnfW;چqx2 |'fentN 7:,-́z3xXtHf⢜ qlP/ҽ ,= 0q:(خR%,ǶGO4K`2KTnsq+ iP@X*]Zxj䠉t>ĚY}/kJƇJu=\ykaΗK&jH] nj@_wZ(C*I|\c4l1I=u * UD.#u GK{ B5pV$7fNo>L=;îzn'~ 8B &L=1_6pϞK:z.4\L"DR#ϼo7Ycn/1v Kt~%E3&rqd:iC+ٌ"}t3ʲ0DS$pS"r.UD4e+&7Vygt,7zck/i5 }x1nb2^ߚ)7Ƈy|#e,!+c=eh Td4 s |%FG՞pݪ%#J@j0痢g1?u`v,իZPi": +5,<Q]05/Vj|@\!*?i)CL(C͌F( 6_3CD3<6֚'ᪿdjL+tY^ZdzM_i813NU͔Ij`=cϋ58%UO$U0[4P[4*MGEVu<= V-VF,0a t5CXR@(LpUi &/Aڲ00$ oy:|h&)l+W~=Fq+c?HjuIZ؝~1[㟈FY/=~QU/{+yE VP" @FavR*1Lh9n츱O^1R6Q7L Vd@ق%`Aqؼ$er4`AVHb ŽQeS#NDЪA}wn&P[r*)?:l2NYj0V"*JUd䬆zhfz6 -4nOVy\.21!'X2In?~{eoI 5(j Q4x:2ɵ&`J~#G5д2]jR hOHcERN׺!K^T}Q ?I 6 fhc˵Զf`c4FiǯP˞}ٞQe~\ơt1_DbbG W .Ďk>AO1H0j?/23+Qp*9]Ӆ]uђy-6)΢DLYica$ryʐ ls8+q:!OL0&d2d̆uK,ArF|H1n&K Xw6 .z"RB:WR8Ő*"rv^dd+Kv iv-'aܕ4_Yuxyֲ1UM']'dly&t^p&ĊnBY:ڱ/^tԐ03Ś,l'l|A2ZoXVh3.-|6W|K{w_KhOs |+_NR?zCPwF3جܨ'!1Gjc1āHn.G)3v_n {2m * t'g},0K`z`)km!qBxeo7&0عM_ۆSyZ!,PE1% kkgK7@ae:eYJ@9ب\v^28v7hp櫊!˞ eFmczX!͛bxC@ޅ=h DNEQ6@c>Gfv\0]VPvߵL揫z#<\HtಖdPB%y^l/-MRوі5&; 7DyBmhn :ͱPrf>;I 9uSG52@bo*F.12@D[6gG=g =Wb@|C$nj~J%f("" 4 tN;VOԭOн>)g6i_aJ0W%g&ϱȆpj~\=&|iԻLJj BJr"z.cFRGIM_ zC߮󆑻jcp¦ͮYCq*M s^?{= 3ל^_y+x~7ۄ Bsf.JGn`Ą5uK[l gd>ʱKK1xLi"1u:^% ķ~6Z^DArcEsӀ!ml&6EZO_ Je34-1wX=E#uT!\l]NBw#hD'HLM}\$G71ZƏ6/`aUϛݔTm[n{s*'{>^sB%0{%XokXᗉ!M0H6c-bR=$DJt1~Z}ߠPw΂S.t~ϟ] u0DZ1?* "Ȥ`M;2Jޥ-_P 2Ǧ+r؄-܅sHx}'}OfOHZ)5"^Jz Ob\PڊYgCGo0 ! FA)#ټBoK}cϘSl'?r~ endstream endobj 19 0 obj << /Annots [ 107 0 R 108 0 R 109 0 R 110 0 R 111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 118 0 R 119 0 R 120 0 R 121 0 R 117 0 R ] /Contents 20 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 364 0 R /Resources 124 0 R /Type /Page >> endobj 20 0 obj << /Filter /FlateDecode /Length 5767 >> stream x[YFr~_Ov k7 u*$ ;+ $,Z_2pp]^BVά/Ãy|elCkTı.nsq5kBkq:kݔ뮒FטM_@E rvsڧS p,!)]WR @lYUW 7>FR%aWƺ] o;j]E]`xPIxT^k$#<ݵ0EVnj< -|>9>!5Ҟ*!\ھi:B­_vu6̃( _f^qlFܞ~+F\+$:Rj3;k<rR+C2jsUGM7%83G ['*8ЫskmY|#:bkZL,'+nݔ>xr6O6Gb{fm, ^[!t eb+ och/YXZ(lvn߮1$x++QeG/BņYJ ^GD#Y_pzn;-PuW0(e]5C1]!N]O[9b4#bҟyI2?CW(VJkK:ԶHvEYVXξ$ƴ^>nÍX?;xpו~ķK# 'nʪ_kn~MWIxȲ*H`0 2R_ɼpM }iUE6HLjAE[2AlʶN>?&L-bԶQ$.X^FOgK>9E TBTcf6/Jɣ:v竝@({͵!匮a{D5\Ș Bv u7Df\;ʕUf-r5ũ=0AU*.S-bW(q<3wͺPaXX K@宺 U' u/CMP|Vu7NLus+e ҒOt ͭ݉VlUR IB/)+2@ Jl2=9TۜyBwzSgwY B/NWcN}uV/bOF DS 3~KQRsa7+mIbQkS2?ޙ |FOW V.mēW"_O.emM_#xFثDjexM`my00xyoWp#넏rd[CrYI7߾t^c8CA$V4QxM٭T ѐP%o 9 e'&8^<>ŃBs 3%|ST1sƓ#/3ވrCפ'n?z|b ҺeH @;zhnUN'cR$ӭ((+ hdT2֪qT[2-"YP׺Q zgW=U2Rǂk~9d`'d.5/;*fDV13XVz"yq-Ȩy)qgBPF]/Юq8"R #EL>I5`33uPJ4X ^?Z Ù:Q4rCY\d!l LU'>&uG-ܲ\bW)Nf=((QЁEFG^Ǒ& o{jŴ7>Ct;{0%"eJ)4F\׍9C磌 Y,AV^f6A.uI.{ tdCHD@`>$[7uq[q.MvP$.hJ Ytڀ}cyMx'2`b!#*u=}?Nqh{{Ed]G/O̸\h R $$L>Ja( \jf:iZnZj|0 o2Xhp嵯`-l| *@_7*cŤrٞNdt R0gH|;~*cR)3 zb}X=}})\w.ͽY$Hs]#x0K/(F:fq 2V2*ztqԦART'ALaՇf\GvfՃCY,d QCZZwSx *=" $*P];Jիo%҄^՗+ㆬ,* 8|>qhh:3?U݆B]1) SĒ\wɺQ?g\f!~L΂Q"5W2- ̘TgȚÅ%ġp+B82B:;O6w[Kf@3`E j "-74Y1Tf%y&rkEi&R$#-ϔf҆^ AN"%gjw1 ۨ9+NX. lLjAr?~Kо87'^{a=#Ыsvɷ*ƢÏ~8)bNzjl^}H,Vu8R ۭ8cݗ,?֣%gf asV$DfAb+gy6U]J{v-&qڪ';2usaw(,=7 g0hW=Na`Mo4H}hEU4 endstream endobj 21 0 obj << /Annots [ 122 0 R 123 0 R 129 0 R 130 0 R 131 0 R 132 0 R 133 0 R 134 0 R 135 0 R 136 0 R 152 0 R 153 0 R 154 0 R ] /Contents 22 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 364 0 R /Resources 155 0 R /Type /Page >> endobj 22 0 obj << /Filter /FlateDecode /Length 5570 >> stream x\[oF~ϯS@n[ɓ8wYz(6%aYb[EcE;Jnn|227X&ϳXO&чoǿҋe\f0^T-5LK(cKd-8WA839~Tc36p VҨ=6U}0ӧ$U$EקqVu܌:ALS^/#hܪ4|n4>-$MjD>4zjNt̿a1>T#0"Ii,p ea/16x >~\FiL랹26p#}ejB{x>(Wjꮓ8?ݪ$Rہ;y7)j{4uMtjf.=?wM~=4+Q|`8h=0с)Ht9>GMIԞ*U]+. u}'.UNtP-07Vh=?-Jk MaO@qL 7-OJ O1X8KW rqB'(!-"_IkS#P EܣoDwLwR:.F+dߑ͜I4U OH(i!<&H~l&ɶ.zI hUmO!H6tAhV?q; dp ́hIG"0E盽:myg,0NEhslT*:X_&$/k?_:,vN6V7w%-cšEKBD bQ<ǁYB&!媂gy_ L@5IRY sB=,gVFa-I׳Nh 6աMa7\h%v(38.&dEDWx-KgjA~DkeXIM̒|R'Q~8U)vܺWne2;ۗ9[0JLhn+saoer]UP>eհ l-%. ^/|$h娊DŽ6tgU8\X@C /1 Ό a$ΡFC h\C K'4Sq2S1l%R&0'M{~w[Zҭ?U(: ۪_MM?I񻨯/'rhp>٧](̙#R*&^8> `ZD%GBYhW-RO-UWS2ek<ӕF@=q]XޱBYDAI>0Չ׶)bïn_Ew8Mt7Yg 84xʆhJ\"3cK$w-Ny/t.M_5T.X T--2 q.aJԊG[ 7!m mO@awؼbPǠ.w'Z +pͭJ]ed/*pg[uJ\.%S5JqGNw&,%"͌ ֠yZU6 [_" W?n,D>| vQp:r) H|酽KQTiU&qR.  oeK_/PnYřZPԌHQxG\&x.bPô6Dio I+M~JAчO["!$龕02jtViT}+sAD·r8I/6ϳcT>$( Yc /d8K%q~/d{ViJM+iuP'kԡkd#Tl'D>H&#L"s bNQԂvyK}Py}Ϗ`3@OH&{h8+rc=lP ^|O/ZKFWJ 4|,*E]N=ws Β|5.t9F^"|kʺ 㸶gpp<7%D`73Xx݁.W܂Q]<: Bsntj;™D$Y-odО抜}E0BW1ŰZ?AA <ݧ#XPA CL{ƒd`cI-0ÅD ^9{ǣ0D8A'-.ݤ~oGK뵬j,WGRf'D$zM_^U/N.$&}D1Z$e}O`lSoNnZ])y9IؾJ4!7^^c#CV@1()_&.1⸮BYoDm*!'ܗM_wi,>A=6 %cܺTk(Az|(cِ<[YY!b*OQN̠<ӯxҔ#Y*ܷ\%vwHH=.c#$NBmO2J>l?bI#Lb nS ?ue#d'{~J$k͝=Q^Yda4F1/5Js@T+_>ڢƤ…2N0>J2]걽sbu 7yQ@⹮_7¾t2]dwH endstream endobj 23 0 obj << /Annots [ 161 0 R 162 0 R 166 0 R 163 0 R ] /Contents 24 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 364 0 R /Resources 167 0 R /Type /Page >> endobj 24 0 obj << /Filter /FlateDecode /Length 4977 >> stream x[K㸑P^T-/>ж3=vsL8(%1,2IuwMloL$*6|AD>̄j?o70xu*Ib&^϶QLRl$`H¶w?n##w,97~LCߥ|m% ,hIOEMQCχٲW|%ƕcW $϶qaq /NX*)st+:Y];d6I?̟@{8Ȣ[h@^:eֶ?f^'41KBFY˼w<5KdfR "0E% =G%}fy_55|Y6B.{bJ +j,Od02?(0CdN!25Jl;'/;PC4Iby'7o#G@d˛k[ãEJO&e9s)CXcŌHұr?k쑾Nκ{U PGVR-˫]tctd ;7O~qXosNB,$Ny^@TN8AFg= )0Ư(&51 q<w}VpZqw>ڲJ}9yyڜ="0ɜL\G1MCMjZjd7#&f M5uG+*;lh.j"uTLX~- $Pm > n_Ű4 sفiߟi0 ^:l!X^@ QU}>n }J=1qsGöz*#i=Urj ~F95mV{N5_hrz8U };H<c02@}v EP}g>~\[W&zkP\SdəLz?Np`<"$\rf-;1ںmE~8_Jj+P@Wb}'acgw* A"Q#)ͧ* D><Ȗ5D0݄H'y_{ZZ%-[Xη:+%*| LQw.IJԀeKr܀9[[d` .5/LTq ɫ/ cܢUh5Nm=ǎ޲C[f#X|'S 6@Mڮ*4顇S.DGBZEav=RB35ZSl3 Mgv8#Ệ${X uYUZNFѤ;uW؎״Zk*_ e̛ՑC3ĄШonx+ʰAaYOŌJE(izPQX+װ2t om;C p n.W1T7 Z)hRՑւ_i_X*zZBZ@fnKTָ+' 3e0>34|9`ęl4 "E8BYU4ø9e"Bq0t5Kb`Zzo-ޣC;#$fW\k uAn(u}?0͛㱴a"l@Gk#~/c˥1| owПoP{ uOBlX(MhQᨼ2XU4#j6_QS(.ߗG'= M;,d2'ʵ@--QJfZΉ #몲sxvmwp le\6Dh1P~ !rFw.bHZOon':n5*A~st#~qp;_A'Cw$Ĩէ`gr%0KF3}JX`~4P9 :`qKbnQJz[]C&œi:8x1H1s)XMfy8Cg:!h$ NѨX; 56KCxLt<S {bPߞ{*sTKDB>1#N@>!ߤ.{YZΞ8eN#bf}wF{Qͱo.S,8zX0Uw>_AZRW$ޏGcVTSI? rd 8} $oOGa)pr8*eiH9lTP \BJPUW8*qZ0c 9>?PׅcTVd6w` cHw06ȢE|ikCUs.vmvڃ, ;<8YmKS3,DvqrA ;X 0?, iox;^[PlCh$(M.΍o:`b ghn8meѺ2j)3LqApeM-6r6C3z6YP6N091dw٬?ZӒt=jW\YbJ~ .$p=Jv,ͣ#)>4س$ց,g,CeJEX*ܲm8Q&+۷W).l΍"tف B L}SBLfG)!U}Λ[∤dtyYbA"볹30&zCzH4^fɈw0[.#)B19cl.0[smO}Ű!H.srU=s z욦RUYh[\ze!p, Ɏ>'-` f6kŇ0tums:oC^` ze Ir8ET_&ѻK6К:FI(R-֤2ɕ% rK)y~[˲Q0{1]GTW.hdx(Qռ9b&)G:p Cbu٫ںziu$J(0PԆN0p>P%ţA;ٜUZ8.mfC^תT'VֳA 3nnVDE(ZI@)_Ї1soW(L 9gZd|oz_<O;WUv>42B?Zޕ& i<3P*PnPn f7nixȥLg7aD޹e58̐*`0 ^H;nN1QuuD0 #b5Hsb@|9X2Ш iarܙ,2 ]Cϭ=wy]њn:EG9v65kDےDxE$%1{p֏M -I OJ&S84@b훃uBbƽK$$HŦ_+2/$Ozu n,͜‹dgtSzÄEFLK.o1AvN^,o{j=BnRvE? tKjB?l5rU cT)k}̷Աr?'~}@9Tķ?(1"l(5qv%ưs[E2Ezi/ :%Pch>7xAF endstream endobj 25 0 obj << /Annots [ 164 0 R 165 0 R 172 0 R 173 0 R 174 0 R 177 0 R 178 0 R 180 0 R 181 0 R 175 0 R 176 0 R 187 0 R 179 0 R ] /Contents 26 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 365 0 R /Resources 183 0 R /Type /Page >> endobj 26 0 obj << /Filter /FlateDecode /Length 4885 >> stream x[Y䶑~_QoT."0k:֚YeU"K$k1}x55>tq$2-7wW߼}tܙlvZRsy{~󇛝N_\)ae+'Znv6˅Sf0y_%Oy%l")%$O^4?RqY l6)CUpȆ[}ϯ4Fmq&N~Qn@F u<izOe2̈́HٶÖv{*jhAOl^ͳ2{&ET{QHr!'Η]5Cyܾm;bF#38ᴚ8(ŗ5eR6ន}L3pWE#JD;|"LG^}z8ɠ,Ș 36[|VQR' 0ݞe PRyH,93>%+\AIX11w#C&\q.Tf X/_E2 u7ɳ"w9M˿Q4S.43G2 Yk--C{--CfīS5,ia7Zn/ρ'K"lΰ{ Qff"YIx=!6) Q#(hG&vSE_ Wa#,jdz{;Dl]V|+"$N.ofրWEN iG1f\5ѪQrvmS? Pr\ xa$b ! Z'1¨QBf/Zj)Xm׋XIgᓓvAHfq? *uiu5X#CZ(g M jd',,+ff7;9teїdHىFvNz*!Ww1|b$]]iC\ e3.piQ|襂cRr;:w_4U0N歝6;8C2)!phlBD]U/v?6! f!K]cƑ%/ƻ=&[k2ǹp.pM ?T=;|:tF(s"W 앭;H-&Cٍ? Vly Doiexb|q,l$s_xBh@A=|moRO X蛬T웈<1|s+'/jIxO yIV0)k%+_,L:NA6KR'ߋ|Ào۪q#z_B?\BzPMv5tM8AB< Ka1YLj0Mb;聣Zf{ F iVq@9b_,'ea2i,A,z'0T|@+d==L%T%=kl9\DpX!V҃}rx|"-4w@f2>yH.r+3 X6`Ep(ayd O k vKs,G&).i!夌K+qc+Tri++k!üTcsvզ +CT\ Tʑ| ,!hx0QkǤbϨZgs#8|=zsc0KNBf" ~ۡDFJG!nK24%Jk.W3ezVgPe胝 jPE*2Xl ~ K'_'Zr/^L8|31yd)M?fG0On20*^FXcZ`SY{\zL_8ϗ<: L<frd)-P_z|Àjd0Б\J\ϗB+lMk }E(sH[ 9S9a@PEH?ddәb: ]ޱ7ޱ5*r7i|7K7KIxu*d :[90kIND2 ).,,6YYuK[XډN{S b'7'/cau-6YAAAmj}X )qXYdiV2/q"zη g6 Um o2\aBTx~Ud# |ܫh (LS=~>lD6ATM.:/hw=U#R4; 1TLD9]k1|QUHNO@\P2B<:TRzd) E\Yo<&k.Bґ:T!u¿~IO8bY/1ќRch#(1(?iVdU9B$$gzlPih̺H|e N:_}B\Zű>`Z5y" M4, ExxhU5uK{1('µoEͮEFr"1BS%tUpY"k_]Bx`0Y-xNAsx(T_μb L.x<-2h+:1PL/9SX]o=?T i[B=wxa)r*n*k=SU֌@f&y 諱E/BD8aD<|,4Kä4tmp\yQr #'#=F 4gh'ߔ F__Ҋá4V]Dׇp~?s*oZWQN$\ǓU/_k5KR]nt46h2%%W g ,~Fy2{ p٤qR=7 1u~?r{? Grq_EƵs>t˾RQl,߿+H 3讍LjE@8yv(+,?aF]/eL2Fx4dе}]N$`Tpj˄'~N#_|y#c_Mɘ==s~0=jd: b=X|,4=Bƫ|\nYi=(%iVGSx܇l7N-KNxx{ 9 k*R<wvGk endstream endobj 27 0 obj << /Filter /FlateDecode /Length1 811 /Length2 1134 /Length3 0 /Length 1706 >> stream x}R{TW>C\ bLBV$*C2dF&H@PX ..L-("-"K)QȊ sq~߽tw1xIg1 W@$  &QILɆ $\?e Waɬbsɉ1dC@HHP̐9,C\Ȱ !A%Q$GĨBCRTI08ΐ˼ʽP%"( wcb"l1΢Jx[ BE0D.'Q0Ԝo߻q`Hy@0ePU?}\#@)XN.OLQL\G2B\(5 Jjl&Ij 8 @$N b&2˽΀)tLLbU:s5I?b2$Pe(ĀB +\ꮜK섷|"APνL78(aC\9F=Ugߧqɏ: ޭѼpqʆ\ԖG,'a'ul#< =-A֊Ufe#Zc(6;T֡گ{] :ǒ+;wEKɯ,\4ڱ޾Lle"{u Da,X0}gIqI70$[TH_k/զy%y>zL5g贄ޛ«)S79ga7鮏k6lYӄحꦧ ٱmGP4O> endobj 29 0 obj << /Filter /FlateDecode /Length 5407 >> stream x[Y6~,;BEq5 Y 6ME7/GmɱG"/YUtg~ŷEzUEӫwWI|eiꟁ) Ik!߼~DO/^kHq S(MWaBw}: {T6#מZ%ͱ>rK9q4?UV,< DG5]8\(8\B8T@$I?\L6iztXP <y̍/..j>R?j.8LnwtEfE=o箚 x\ae}7m <8@،<8xm:~N<W=?,V>CžB՟¢*vᲐSߕ-1MgTЕM 8Χ3mQXV]zlsI׭hKN%n['2yon+*+Jy74sJ,@(Q7zkLr;<'k"OTq4xKKOk#Qa ̼[gq.ǖVkpe'l^j&"'QxFQp8=G,(Py5_+7/a8Ͽ28B>&ZLM YѱJߗnk~u9;X X$^HRqdXnf j`Jp9p15LCS\w*ɱm[sM#ys=4Dц@\B^UPV8#%Q!,.%Ǟ ';X o$bTN% "%|[P> BK(!fL i\[ h)G]n[zz_{!P;M뽖ZxZ ՙ_`eHLիSŦGxڊ 7F*b:qn&FXCRhKvߪ~0t$Ztta!w!-̀GXM|sxAֱŒ=螗z+cx%s;p%ɦ@(O({B3cO]a~y>d 71prov9#~.E'pG{Yr1g!ѴK8TuWm&Xl93K@k0Su<EwbTa\snN ;OKim\J,BDgtqH#׉oVՆtthlNskjmdGgjl8*f qG<s;7„zA`h)[Ѱ@k\bSԥ$];$XiЇ>@g[Gqy>_-6(b.j&bGxeoXV7IIC5ũ ~ZH"jemv?fLr ~%1qOM+}Jo-<4.V"@ψ 4xCCl8C/%O s$ 2 /\Q S:$NCS$`0D,>xQ|9: PDP]Np7o?!dy'Ot1L&1ӘXho#x-YBk#cИ#=В⇩׈fM@T3 YS`5[떖E@tDR :Un?Bd{z0+Xh:֖(4jwp/&Y,k`uw܍wI RH7jeV`R*PH Uǹ"qÏP#5a_& s{{a(x.r.* vʶ>XMc*!95DƆcC-W9P%i(OWm 8p'ХW7=GS5!MTf0 w_ƵLòp"~*^po=5U/|2_@ u|?"OXUS.s 89VZԉ4"ZNxGzOy߲9HP>?7=HC@^˗&η[ؐ*d(Ega8 _ņ%մ|W!!x4@b@B/Lȑ~Sn]v\EY?.1Plukt:#9Dn%X>Ifg#)XRY⫸O¿< cbv3 '3:# cӏ]:srmY/޻, #Ik,m\VG!У&G Ly2t_ic /:49g >%sㆰ`$N_fx@ZDSΊÈ Kn0CTf|cF6c)ي5d_>* .{@x%`lJ14 |=xb a= d w@|Bp `Uى,|#/1u9^8_wѾ R?Sr⪣ɭ2FWGXF"-,s8 H)7^qX":[C*f ,}]a%{aQ_ ,֞2"u pFB /I%lC. [jXM~>7II X__r|6)<š;ݯa!~[أIKx,\mvcO]ˑֺy?AF.C<n:Zen. "V.?@G5i炪, ԱВ J)d#Skͱaөggq#t`$[#2zcId⺲{%6[> endobj 31 0 obj << /Filter /FlateDecode /Length 5391 >> stream x\Ys8~_'\ 7I'YnZb,)RMRIܿp3()U}g*eggg٫ǟ}Yݧ3 &>"Dޭ/nϗ/." 7x7fb DT"`Y38hZ-UgK!zYb_f "mfnl۝ȳ . pzα`6kl F D#(9ÍI}%aH;y.2ҋUz!|i'i6麺ksI=Wu5M^>siIm.xHWK`ҶaP_vCԐyk=b3OvжZgEx cɢ qW5HҍmL X:Cymi ۴|ا O.*̷ǐ HgS0+b԰i]sҽXrYG`?;u3'o,+b&r} o%)#+u} Z3=A?6X>Ox2цMd.063xn]jenlǵ8w2\E?Wgٲg[ j Ej|X ,$ݘl6`U3zd*ަ-XfQSpݣf H%= 焵hԲM۴3QCˈeDb];gÝ">;C9ޔ9x9ea`A(fؠPri !Þ p42>Xbք{d˞Yt r,c9TE, 31d8ewT`?b0I/"6sH- >khS) pkieYlUWeI#@yay*u(Ӈ}|uzmSjz6fBDE:dv[|ds4 `3~ffM%1 UAK6v,>Eh`ՑG$lxn,Ej>xTe5Ea;h/iag &>$gxѱDMO܊hGs19#ul%̫T_%\ |`M. $wa/` L%P"Uʏ&f,`*w<(1+Mҡ˸ֱRCL%:bpك< Ћ^Kj5Dd#ohA6- Sk/p 7 6Ȅ:Jjn X>Zw)/Y}TK{PVB"vKHRl/9nsqv)&RFarsdg&ǬN}Bx4:2-qd(#DR\Qǩu1f<z1/}2Mִv 5NŕUE֎s㭇Fttޙ 9{" LImF.'Ŵdn3DdG4M"x Οɉ)uUӒyg'ĝ?uF g PAm*@<޶c4 m#yXV}W]juWs j{ial!نs*7_v4؁oli!p4݁ڪn+82}l7=c䬍]9*V=/Љ#P8c*{')жH ڬ/;wUXV\%t_GƳm!-? 7" U$'lPl>*v}PtG,7Eact ٫ ȱy`%оIGA+h(O/oO az3vL76mj-EvRr;&4hҏAs[trJ:L6:l0>lw~o{8ѩ?CYEGf<I9F:S'JN t5jg!4ε'0Φ[܃$" 6@ю/ZI)r}6@0mP| Ł;3O*6 *ZXuM^l5l՝=Stf.z{iIA?xG46f u6G#)5{}ci0baP;k좠-GqlX*e{H-p}A6(LzEu̟2#-[|mWpV-*ۍD,~{ӑm(+V*a a ubk AoJ7I #g$?qT4)(\*p|ScU]Q^\5m5VF;s/eSөTiM^VrnS0 ' Oi^BjMaAg.xd6#{C6f1W#hohXwX}൑VAQX\AhK# k鰤p ?ӟ áK}=y0`Ӹ UyP-q2 >7lӴ^QA\]a!PK^^7nWWl=.X1Tu_Um鎺k3 `5:yA' S@B]i@=MvM<^+8)Γr$ԇ@-O8]mӟXh2^XEsl >Gȃ)FCOpv>W8-tdھO X3=:ݚb~lU]xTR_M}; UD!x5? > G`XDW sA2 ^jc7uQ;K=ih` ~H^"w:8(%Q>`af|&x7E]xQCjXBҡv#,L'.a&(o'Z\c0yb5X^͔H 2JNPNކ&MHTZSerWeᕭP1 JY?5&6]JŻ 5?{M=|⎇k@Up"@mj;_W)+|ӐWzd(5/MX6pNwbRQ(E6Nje&0_><Ƽ461m:rbX@a?|W|H&\(L(@Q(@uXaA^2Cʑ ƒ#L5vP/A(}psm'`2W,7QNeXl2aS3R\Vr,?E',agh2$YjR}2јm%lk!"FS^]m\hUNɒOz+ߕ]`?z :de38,4`yN^/R"̬@P"(`%x~_d[Lg\lg`D;o{ܗ8KZg P4~M~b9dg[r@J F l$4B'6։ 1#/! 8 C'CH$DQV ǡh>EM /S5#y $;YƣHfˉclʌ*N `4ֽhbZg5eܧ^Cb<1{uU{76B4f/W< X,OcT٧pnp_:0^l-B{Psف >8cT㏆qSsq̸8#1'ꯈp5htU RFޢ8bA2qzy 1nޱ᜞[C˵bi A{J3)5VNEϤ@&an.?]i;RL&%zr? d|"Z(2دA ÎP=ד9L—+! 32&FsV_ zО/dp6AOrgB!GN(Q@ (_ے!ѷzݤ[~OYmI=m"L. ,b_eZ ֽ/P_8bB endstream endobj 32 0 obj << /Annots [ 299 0 R 312 0 R 301 0 R 313 0 R 302 0 R 314 0 R 303 0 R 315 0 R 304 0 R 316 0 R 305 0 R 317 0 R 306 0 R 307 0 R 318 0 R 308 0 R 319 0 R 309 0 R 320 0 R ] /Contents 33 0 R /MediaBox [ 0 0 595.276 841.89 ] /Parent 365 0 R /Resources 310 0 R /Type /Page >> endobj 33 0 obj << /Filter /FlateDecode /Length 4569 >> stream x[[s8~_'/Uapͧ΃xIl'egfΩLh PV8[߷ J!$.jnhvď.9˯QHFGB}>8=h[;)bi$`i*Aw yp HBT,R1I)#S2zr:dhzW ӬIݽLDS_PyDjgC? >3A4f1oe :8i&6)yJNЈqӦUn'Z]Rn@aHsH$L:O,K ΤO`I2T* ףq3&ïx/媔ͳn"x^d3iy;pL y팷D*J."\HFCgfl=Wt4R[ l`jAƫt.LDo7g[`q1&1E5&PʌDV;K aÈyU$y92IUqܐrbhpFcfQSϧlH,k%ZD}kHv@Y'o0>M|_t l5S{^&M'dh Q+_Uj*&Rc !\1]+XVS֦tph䍻9_ѡQ,ݴXQ vZ7`2AR 򒺊4ي73ζMȄ%ɏJWӡi[մ5@No3°,fMPY2?uH٣^tjE<ʔ]vA?GBNp&+\U A'K [Ŝۧb>]:kdn>{0w !@SnOkYsR#ݵgYl} De`ϲ"+'pF܁ z J{Vܱ "Bʿj`FYVCO ҂e_UELct%pƝ!UU U$,3ٷΫt g0,E@3ӣWS M%!2-%BFiL+ШeU v0-vϲL &2+w@^&Kw_)Xyٕv_}җ _k9aC X%\q0|{24Wk\0qLBBKpQ)bZQMJ(ƌ$-e //ktp&+R@s5 1S걮4Te"Df9tz ,?%s6!, "ꅃ>[/hy$w2u55(۲87-aSwUig#⤳KSҀtw- a^b,.Ro*0Fhϳ"s!.o إ&x]8PՇ|UYKVx=g..hnr[?Q^#{IZ<ɂp ]tш[VM"쇛z;ŅeM-Ǩ`P [ άvi>Vun@+t}lhԋjݾ퉳`g{Y9`fʊr%b ̪1L!si0UɺA6X>0|(_@¤0p >==!1do_؞Gr_d2ۨbOE1e<<-7wcKqT7ᅸn&/,R3!u]U9)h 5uysl|^.-y :ʿ9SVMr]d6PHꙙgy^_L3yҭ%.ha mHDc7ɎYM6P`)uRTySޛxq ӋU жk X[}/`5[gug ظrS^tA p\!t?-+j3^Vj~Š:!XO&>~AqGBhC<;2@ޏ07gUATe;ѿZBLL 1J\sᦗ >P|%iKФ nt`+hفdȉ,NǔlY݃)7)#lDbU26Њ=z5*@Jhl1x.86~?mp[?PS^@0sVH\;Toٺ3PvƱGx5ƭn=W]Jftѕ .!˜ chP\Dmk_6/r8 qSm$ՠpU/\RۘzE|MdP0LT-o SQ/C% ?P%~`a*JlYGtnݕ)MS:ЁˤL96vU;oݏ޺ KޝuuGS,4v\h5/څOަ}Vw;VI#ڮwD"ۓn3SE>*&QW".kp*E Υ? I8]@ި~gǏ q}P = HQӑdNjDz0f"6 ^bw"^"cj]'V`'r/evC'+FVyu-T[3gvo녽ʭ3b}W@f5`n4j3ɘr /IO961NkaoQAEz\QDȁl,oӜr[tzn;&頻]2vc"ֽӤ}k̫`x 1f^,H#[>Kk+<oq#'_ޣJ bo°J7 \:ݟ-Oqa2>OGۮC0@\^P]CmJu_^fFŬ8;"{}9r}_܆e)u=YˆQ(Y^d!v";i [.Od}}B%c2!=:=& ɲo.~νurCmW\w]N|Toۛ#NKc 2(8&Nҝ+D2ө9wSu;ǂ.,mk7ZsEeH+g4GI&ħy>9Ų0+F"Yzi^bg[|O%@(kLgn.ojG~8z@Oγ=ݹ?r XS7~b 9Bh?ĹM%AUSđLm*SO1 AMy=NF2Ҡ+}zޟ_2Nya띁> stream x[]oF}_1b-Їl[-kԒTl#vb;HgcEiD;$FX/I 6:a U&XapSi)'Z, 7 ׸|38>9{ H'2 ;A7Ruش$ A cq3|d<%HF/>"8耝kV[!/pg|,D&=C5QDHEĖ ! ՀbjH,FZ7Z$l9?MV\& B [x_PhM'| ,p6ʃʀPCGm $&bm!*^/  E`Hp怒 ^26Qᙊ"?*Ѥa|~>f)lw)0Cj{F?;~Fi[BxNJټqw~;1-?'FX6O/|#&?apb2C,vo}x& 1xeXnII ӽ~N)`C/NYضjj7bckb-O1?bx 5$ia&E NSbi)䗪>_?ˌ$ÉsBa=OgMR`R|2 PY8`@VPd匕d82pU2-%Y5M1+Gl|=wol>o%G2B۽ጜ_ɫ+2reK? \_'oh Ue[=-x67%fꇗoyt+#@|;,LA] *•';KRq*#B#_w[dsQҎqdS'u%aͱ|\~ $ 1,`T8L pNE=oS-' *cAK aΟQ)nnջ_NgM=[m;TF()+'aA## Uo;= 3V"S@<WF&wllUUQ/Ţ<)겜ggxTpXP}XFk/<2QV+@np@ rP{5ت{ 7#FqQ:D1)B$\:$c?VƼ՟MU_ʷJ#j{e\I+>>fѧAL$qkٝ5UUE";=PxPB=B2wnq`p(XOլȺ= H*X`B B}ϧluY;aq1YBe#豷g$J kI ur]^s֮<4]WoKF:&Jk0}a$Z@h,G9W R' Pb}gR Fe>zbDr>l1i#kwһG9݀`g;RS#"3 n{S=ȁZ\Y2u%/BE`b@?,q&߽ղ7݋Y\Tr{*ffn;YWlX/\_Ǿ'˫M/ˮ} X8:#_Yf9=/닢͢lF:?fP 1N5knqY4&g*ɽfn!in%]p.y[LWe`Qjso[P=N!_^vW5dAvLڰ@buXoca#1 ;9ObNԚ*zn+֣\x r.AUCT𦪗e62j !Z?DqJǃvw,חK<ȱO e;c\W8 Ljhg]n,ϧŪg8C0&>@͑tܦ* {:|kzNi{5m].R3&FP Qcr ǭz^.ʺla}c52.Gss6СܲW̧zGu*y!Иq>s=^r '•6l)7N+h|=$ 4CsP$G(R>4<F|6[m<+~,GU7IQ.R1\Vui Içk=gb#4 .гy ٨ 92q ,GEyD<+;s]P1tN=_pQ_>DT jǛ GanE_9qRt',(zşħK uOY4*/p:>9l稣WYFN;QCԦ@(H+\4 Guy63y˿@+e`sd ‹A(Xy==F` F>v4?P(,^V8*U r$3o7$o{ey*#NE5;_i;A 3uh-?ߺendstream endobj 35 0 obj << /Type /ObjStm /Length 2833 /Filter /FlateDecode /N 96 /First 854 >> stream x[]oF}_1ɃGt>qvheKV ~ϡdq䘤@;{T(6 p"k}\0UW/,ijp-R> !>᪅W#1[މ(dJ@B+m7}> `  ?SǤ!Bh11GaI!2ß0 #G-L4ƘoEx [ 邌150X& i4MJ8MUUgAKI3h_O7ᲆ t@Jp,? ̥V6p:}`Oa"(L\0!J2<1"*bБ gaA0D7& bp- *o)sBH E2H$GCĩ40;/"LQc(D 7 cNm*K; UR P0$yIk&g M Xo> hp֠7߈?Vo( FֳtpChL ;m$U Hd-!J°l'Z˼w\']P3<-|˧32}A*m0wQӂcjM}CL2.nRVv3`j؈hY)'Ţ֕я/5D\bT{<?b4i+53IlvFIF^ ~>k/J1紺_着n+A&fc}I*XXuꤤ;@)l` Ilˑһ:}_题(Qv3m~buĂ{d6?Y7x6/Mj,VtP 9\v }n<H傴v/1'hK~B?q [r5մ^\šlY;VV5 A\wް%d? W~ @e,VFb}z>:;grdwI]ݔˋ/p4Q>2 Z<^F [,58=:5?f9v (%u.=Xwו n:=Rpd2r Tb:n&}.ߏWjU6c!ǡp\`Qz@зtoUs9eQ^<rn"]lA6NuouA/hE"scdYTryXW#+9fzq<ނr|f'A=p,)l;1=vyGX>^S{[U+]@knTs[v:,eێi(:!{ۺr-d Eyp.&i2@7M&P7b6sƆ!11ex e" EK r GD#\L,DGMX@rH%gg |UhvQ/bvh0:AmNMGɝC<+1*y=>PG22jH?K>Ʋ&Ж[U+h׳f:+oJNvs-p5\;Dϳx_VǛt#v~t+;zڒ$(@]ɫL"P Tgϻj!->+0,ED򎁵NNJ $A=} ֣ LŬ m#p8ӇN} jfۭG {7eWpb62 3"kD KoCa7Im脚 }jr݇_qtZr1XwK29U42"d'fqb9}IVϩRƜx/eBAA-yB7Lo8S!7.Xf-q?;ؕlT}B{Z!Nendstream endobj 36 0 obj << /Filter /FlateDecode /Length1 739 /Length2 922 /Length3 0 /Length 1452 >> stream xuR{8TiUӍZtLƜf4KTj\Rf(c s8sQ%X-K=EV[Ze++J'\ {}z9|߱4xR,vPư'!XZ.a1`r1sIg8Й1A".yxe^*8tb:ӞAaB@H"(><a㥪q-ƕd`M6dK)cTr#>S Dz #,ETOU>!#*4F!JwD K! 2\ P)`Jd$@c@'_"@a>Hk0?LHh <?u++%0JX J? w4j2E+VLb1c)`0BZWXMKC1"UD;Qnғ_ ޾gJ'zVԴx&/LB ^eyϛ,}JSk+BN7P~}\Sb'{Rz׀@]_ᢽ*?FdGs-߰kOc`*1u5>p;+3z.ckѓ#{.n)Dn77ժ`pAxQv00s.eu/GKUP*^ݱ.AlphֈjEssu[.z3sw]mLvM^>zu_;gmB4=ʃ" vU[i- 6aw;5w~{nƪ݌[ˏ q9Pfֻy=)ݷXKmu/ g61uf/&=#{)V^9G9Cóʲ +v/}4xpK ʶN qL a蘽02õg$Y^r]SB7 B #j\6=3LY$nA+#NiIϺ󦢔j/+ovV̵8^=*Pwmk3P]4paƖHǢ"cap\'*~vkY145@S-'Qb {Ndǩ0k1SgZ-'e>+o>\t*^pܴr~IyfRMYS)3v.+SйKݜݢccS}Wޚ&K=ܤ>B8m:{`^YueuKK\v{$r[wU\pTZyi26vzOΫ~ b,)$fF6.FLL9t,| endstream endobj 37 0 obj << /Filter /FlateDecode /Length1 1656 /Length2 6321 /Length3 0 /Length 7288 >> stream x}Tw8kEDE cEgD'ʄh$zDD=^K%Eg~{o1uyOH/8 B"|ll ( ;+BPq H4Gk 4 2""|kj s&l]y@nhZ;;z6sZ'(㯾Os 0[;$Cj sw*su`n`^Pk0 ie@"ܡP# XWLf us'G¬нgD`nz7+3 M:[ hw2 SP)9[aζ~!ax@h$`޽P/@^g8}HXCD@k$*D@k$_#tk/׈||5u w "1tMȿďDCߕ5_^"`nGE7UBaV"t+m?}* an> ;\!7Z6q#6D+]ݱv:@sm Z]ݬ㟧|Gt ANOs X%aP.atIA^>i /~m G=Ќuh\H6 WAI+n0au=u~:Zqsl7 ]"?z~G}%C`H=owٟuf A"`^||'?f^+EwUb\*@܍,?Bk +gEg}!)FPgA0D&X#i٠-䕄h|p"٥Ѵc~rsdl"!UZ.V RHh`Y]?RCf^{瀃we*}LƐ b {GC_B٥f1S'D 0~Z ;i3Đ'Ky(DhV%̘E諈80=E2q~;[ܸ✉Wko-Wf)\|;W1͇ы3KM*SU>66ש{Q2.>vn3MLNX%mses&[OG8 })ȹ{w.6.%*Up4F6;+d96-%Xϟ c3Ge gxH{ɔZ^}^J\QXw|¹1fI;E$ xwG2>GاF]_pH1gyDC p܃ 3M ɢ¼(t_G *]LϬElDNG3[2ގ1񊏐Sja"3)t8rwEÌ=y__/d7Z?& 8O]NLIEJR z3{8kDm¦7!s eSSQ0ENcX>Y9gҧ6¹,\Ù^&.2w"*ԏ9 dpt5.=8Yvw=5y 6<{lUs U`0\GFQ€JEVi.d ѵY62X:!Qub}yGYY " <[Õ ac3^cW/˚yD*g/,_Ow`i9'8UbdTF3¼,zI#1 e=, P,(/z<,9 Lɂ>z=\rGϋv؜sю+oi}^a UWIݨݔq8Ɍ&~aV Mʪjf\)I` ˯{`8b9QĪLU /(ޮW2oo"JG>,3۾q_ ԞO&td?\)V]+OC݂ 'kp¶UpW 94UP6 ?4GK;xa2CФ@AQF0{%D(K׺|R7dփx sN',g.M ߥwm{[2]~ɿ8f3+9Hٗ %8(%a?Ԯ͕y+M[ǔh5y5o%U~FFtEL*G՗7%^6=8!qy.^!3sɾfGpQ\@lWL$?{' ɨwN%1iھ_vhS50(H5_t->hԤ ~fVa3mS;_'T~4qѴɍb*ʼnVe u7OһHYN01wnIcfg*UX}-f1CXl/*ɒӶ: +q}]NS#{y̥rF w+ҧ $* !B1l=j|4vNnAkZ yo{Kֿ!ۓ 2zlr+OPQ2r;m~o,7qD*1.l]|I#ztͯ@P3BT1YMn3+"3*UڤTV> c/8xc%yN4JqB9PĪMAAa`dRF8ȂTKeM6x=K|7W:aa`¥٬=Fx骞 z9\AWHH?C/}ˤ `bNJrm͎Is)_%e yqMgŤ&T|3:9Q{lLM6gd6CHiA) "xv0!0M[L!J͞3-gb8E.88đsr [ZK+e.Uzv?]qiO2Ⱏ\&TGz p:T:$C]ߊtMH3bTmf%Ev݉#j}(~~>%R՚F+ qv2'>lUl"PPRObO54un#+|iL794O1l*ɜKz.{|dNKQ O~rj1"vJousED ݼuQ ̪,Փ* Glb'iQICFSr[YS*k"Ld/"n)dYw(B5ډ!H߶Q9҃w ?B;"J!5/N]YPprb[ z'*;kHSDc% Rƃ0R8@#ܛܻ잧z<)yG--1<$Ý'w46xiG=a&aSoҷ 0W{4-E.:ibNVv:GEwPb[M;UH@g F^H0*z4uwX+$ R|U -˜օxsVJbtջx[ܑm:{[ =6Q *t)ѵ7vͧ.vG?ٷWж汬`s.Ya0йkw?3/9QmEl0=wKT'jym\`L<7Ԣp׳[p BƤ,(8]fѰm#927D :/1ʶ\XzesCQZ-R)w% }?Hs_lV\>o1A lH4*={qM z=^Dw QiÃMT 8qfSccE 4}߈ה-5-,^z<ѡG:9`f{dv 4X{Z*Gi+,mNGŤ Ud9xTERZ%dvJ,ŅsWyZ%Oti|n7+rH5cG>n![P|GPltܻ05J6GUJ,Ś8lTvsB>.vu|ƚd.M̢Ѹ&&KBIdW;KDV \.h y'^BD,GΞUӽm9VU|ϲ{ <E|k^3,kdv<9u&-X! \ ;?,7OqVAQ'kn uIW{B z θ/SxPn;MyZ|WIGU4Z_Ghac񇞫evZDҗ!V q$? }/Ӗv{y[mBKF#!P8ql`My-ᒊ'6=2:w @g.B#meŅJTJS͚glN2%|xcc䟸1Uï]p+aNIvNREa*3'l0 &L?r853l2ڷ,c _҄\OG endstream endobj 38 0 obj << /Filter /FlateDecode /Length1 1626 /Length2 12130 /Length3 0 /Length 12971 >> stream xweT\.]w \k ] n!w|ߙ3ܹ{>UOTd0w0:]X98ʬ* skV db6q tAi{ -@O_&SԼy:[[to/n ;G{-QXv 5}U96@9\Mf 3``64gX# 19b8쭝K'[\`3;W-fa{ ldx˪&-.V&.v~S,,\*o[750vv3xo`"`8,M@oab՝ o՛8:yavqYpi׬(-: w7&`;9]-%2ۿ-K{5cޖ gʀbbomrWk]?J:ؙN%`7Z88!vլ]̬&vo[ 69YAoR+'ǿ贬llߨ< am6.Zo:FRbrqsݽ7@>Cʿqbd w02`3Fl6i%KmFߗ<= d`&hRC=8.mv0ȱ^ ϯʡ7%tS:aRo]E|;$I.5co];^Q#Hy 8^qu 'v.'[F?jxŐt(#BVNqIr`ȏoYaZo ? z˚.(9%89|OQvbVHz'pӳ 2۲ux^5TXt#ugiL2j{Ys#ŤM=k ȚK }c+Qdqv5MU69Trv+O/iEWk'Y5oG*I)WL1ݙtsLA0bLbɒKlHDĘjnWi[%5W}(<>q@i"m"'C;2˂ `_wvoIJ_N u9`_\'PKE{ ]!%ˤjIHAjK&f<^8x zk*f_ }l4v\_yŸˈ(4oQEjWG"7-=Aw<-ba-S#؀7g}sC`w$/J\; Vsq{~d "9l:_:\\f g' QS9ղM(#?k{FZ)uf$4s׌E&3Tg hE4~w|RJ}nFjwcS[ |+e]maF"xN_|i[v qg3cGMдaXTЅp/QGU_^ |N8xGc4];DiGL&ShSɏНGv/A!T=َDA]fmxZ3H&:EhCcV/fbV.}lol!@ҏmOt;<-0mdY|\?ph0tlilG0"͟-ՌIjf}-%cEsQV/ qޙ 伽"x^36:i7hAG*Ÿ-ȁ>D8WmGR>݉8T)#6~bMF!n?%1^62QO9/dG\cd0ǓoY2Wt~ B%zk(A{FP0V~m&c"-x뛹kL|LI J%?!fI1.Z( ;@.6[uMs׶;RF&!|gsC(Sf,X<.Mpgd(daU#:g$xVZaHXV{= Un1PϹ]'$" 9|W^UV֥Yj4k3 O{`&2Ef P3$L9?t;oB~%Lo1y<̱z%[#dPw$2܉N))طeJ2kf$nO_j,B Trrx)ctUu:|T_arX'[ loЭ:J {nkH1I믆&}inJUJE،RxӤ=M''+9`ZnaqP&߇3KZĈ+ӸL~#\Xwh-kf!\O%~Q^Ɏ=o-LI'K#`ҾsDF/'#.u$^bg{&3Uj2@Ț^y~KA9:Ҽ Pr[Ii?"#eEŘWjHG+Bف`c´М|ɶ||1䪔L7'1CEX P@TF/m81:*ɟ+ziSP͕(enL%G7NnLRA"ch'( ?ڇļAOT!,iۥ~drѣd Lۿ>5fЫ@gBk/}w%$2O*G,Q9dű6؛82X`ϓ*{GAZ[?l $3aym+Z+ Wy5LWMj*u"NhK#C3zΜx-}hhhD֝Hrf.0KdV%>HKP₳+/61HaQ5>2xxfwGbhW#!A1 GOSEp7ȄG[LTQc:B>`+X1{ *SpM =!>6C[c#2txzx??)F猂X$R#V$%2''wuW2 b 8]l`30oM*Dƿ+a ,k;CXH 8bЈxN\UA+oNo`bG,ju[GhF2BţskJLJ6P?&;ok>+kWo \zQvŋ&"gϥqXܓ (=挩U #X6 aT^cs}(hPHA'݌1v6{ܕi0r(g;Ca#>["#i^r=j-CQ"/"T4̯ I=-prTtZAe|/v"~`;FrƱK93XԞ^8쨓L`2~IZ\9v@4yyzY|B:gO0O5. {=8a*6y&~km@UޟEM2V3KhɲZc"Nn5I@Hݏm%OT|lK̜kr$UI)_FȲ1k~|=tmL'ZhFS{}oӭp>Qg dH5awW<d1M`*#;~"2[D3ߨ#j#QlaRn>kPJ6#QцI$E֋ ;>ĔPcݧ80+L&H1Ϫ|,Ä)L8(:ɟ[SzDd7-Q YcjkEG.?8K i~YU^iK$%p8#8A &XPYDr왋QSVqM0NS34r;zz2X蝾0[À^QyFmح R#;ɂ1Ș%@78!)I2LԵz|o޽j %CU2 Ƈ \ڊP&BԴUߞpQRo7Μ !K6qT?ba]]^efђZptZ85IDx LAĢ(OH#gPU$]A;RC ):JQԪQg[\mEM6RE;\NC!w%A!،:/+I#G dS=Sۦ<;faSx lzUQ>&Mp:U"fpӖ[K0cޛ@16*V=l  Nx3- qvDδiy!rra FډX,܎iC=J)TzGl*]ǒg/P[MqQ>>{ڲ}[{@c4{QՂ/l; )Dig&v/4n>[|I 8U5vm`PPy5L}d)j굵8ރ*sR uk xN*Q#{}/ F2e-}U 6=PGVl<-|vTYo%/Y [{5+e` X{OaD3qj Q ,]mm[E&-`R 3(&î^BL͐&ugqp^Efi c5ރ64$ȵ}5;q_jb-Ks W[5(=GYQ}%K')AIf|8 e5s}.Ĵ!PņY4㚂ޔi+o#AgN~fP I΃YL:N 7j'2+O7|}X%QQq%~ _ӑۈwZM`s)ZstfJ[@#Yn\?^'-7s&5,ui(w_s)|C6!fHpP( {z ĹA $/ RɔZn Aq{䷕g}LPK!JUt| GUAզIj139TP5EfP|(ASc6y,Ɖ kU>ݲa|OMu烑D 1]hBtq;sS69-Aq#K0 n?KeW;xpP }RbB8Ӧ: oA.Uw ,GZ,IxPC\t-b<W(N;|2vs \ .b>/8 n,1w.y@50RsbH/6JXohR _A; .LkD_#w)˶wm0|GbL7kL5Z+gZwOmB'.n 8 >H_b.I6sI}G&R]mb6kKs)]0GG'{`a8Qy}\:;|ݙhMW!%R@zZ|2.}^4asK|J r.1+A $XUbLI,A&1I{O叶yJ "8Xw?)Z(fR_N͗4ӐK_:P8zY>5\xt:(r1I75PV1'ؗ,G܍N%]HDGHnC̅/2+!Vx@{ikyNj*% OKт2 MB{?UgԂ&D;m]5ۂi<i+P̀QTBz, iX`bG1u^y؜4S2Ͻgj,˓he~S)+NOGmQ=aل$?B5|*j{@0+QEfǓb8rY?[ҟQT> @aAJމ4JQ I hʽ%40l)8r dc5)QyAZ.&06u3J.w]^Y'[0FV`VJԕG:e6+˯4![[:aK~+eRRz:҄E[nuϞl^B%,m/L_פQom ph!+ ZEtMWv0!p!vI*^,q'A}Zvv]w_4,+]xd)N H7i{gyuJ(N+1ݽ\.}4+r H9*v8|"}[[l"N yKq*Mz8䕉(|1XF\=وx#Q]bŚ :F 3Bsiߕ@I8?+^7=_81sg uX@,(-g簈oEݜ#'wHV-!NZǨ Aj5{Ǖ~2iL)W̿vR}&}",:T'& 2_C&6 kP{ʄ FL'&O6=a Xç ZH!hvH&C,猩-X O0lGX~b}5F6TXM )00z,>R=sg3ի} |ϾBʙ ?Nno3 &:vk6+Y8T^MrNbA^0d=­*"' c,ҊD..#4d9g˫ ]dkSОNO}ѡx?fWUz-;IwhcNT0D!J5}_ȩk|5Ȳ0'WJlNڃYނIӥT{` s*C*w w~gd4({K]2͇֤MiY Mh cw[vRDm+s6>t8ggL SpGiZM=92v^m0ldÆ<:>Z4_<<= (@.T*iZH6f ܭ:+B{)j `isNjc^Pv gjּJ׋1f :wkk`:p] 3F$:6 ʑˎt$0h\IfU C|8]#cc9``#ߞ+DZ[Ma%fJ nw{\AIr5RTNswõ^=!\Μ].c/]d`n]9R6g%ΧFާ\ATuO ԕ>r6ֽu|9 @d9`(;ßa (U(V_gn)X0flCqKN[Gbf!WcƅןJ+ߺv_Y ryfcW'~y&2H@_; "=In6hV^SJV]NY;`_׈|޴{y>2DT3PGIidq]:Sٜ%{\楓6EIsDF}!<k6OW z&M Gr ulqx͙H328&>!y_ ?6v`k)\ݢfک@_Xv^X1:Ul eᖃ],0]!­'U+mtQ?b%6?@T_ bXa=QĎK/ p~N׳_,\z/9ls3}K-=↉aQ<%Q:!V {ņUCh*: m0/$sW)G\שԡk!9%7ڤYߦ4{SnzYj[ ]݁s` w? \l BL|]QT[¾QmeJmjdD6%.DyP 6mWyߒd=Tp)+j1ts9f&j7a$> stream xTgXSVHT¦ "!*H*M"lB $! U EtP@z/) C3s=Ι{?[ZZ{^B|&(Ǒ%0%I2û ō@FL^HH""H)^ Opqd h1Xмnbg tAH4a C đ@QO?Ca[#A)\$ C   @;D|&"pdz ؝Gx;Id!JV-u]$ OyFdGȠ700$CM!#1Gex08\ ADaABC>{9yULPzI)JN$K΋H~Q?1/xtA"3#J)> t0Ɠ))Le?'? ?"?"'O?Sxbw3e pet "Ͽ(ZEWǡ)KB1$72.3K#  $b18"R`0  wġ~nQڦ7uͦ=r6L‡ nGu8{~RRĥdEE9@QN&z#A&b(?Ov?hx8e2HO"""4hADҿ#\~M$h45HB 92 w' wá}J/}{/}h`^6f ȋ} aLG- ~Y~15ޥW#M] :+t _}t1̹֒y3/t֯P7~KRFz2Kq$#ԃQ&06jn [+ uFؽzckU ;8J]κ.oi9T%BWދkO-RZ>0pֆ2 ']Ge߶N* 4z( lxQM^9wlsy{}*wש:_}jlݧaAAN3ЪJ`gJkqaEs}cN?WzMvg`yuW۲՟"\Xiw(D̈́:}>O<>URs9h7^l8J 8{T=E?Ƣ&lrOdrՌbӿkz0אָ$Ѿ71Ő~Q^fl5D~C\}y񳼚4cL{|1GPV sTMl=6} <`k3ʭCK/x!M7A_C>J'7u^~csW@ 2u%Jf>׺|_BjlZ:VH_E~>K:v%9v؏TmS|k36ִx`6Ɵ ?rV|R8_LCV*<^dnn)2; vG8/[-;HވS˕-I5+ ũMl>>L֭͆1ae\+RI=%5&9 j Rpb_>G¨FVr˿56`Εk\)"ƻ_wә!>cp(gWrZV. jE-ٯ| '4e yy7> j:LvH%oؑR7 N.UwBZQopa"fH޹b̺AIF=Ie gzT `!m,S=ə#)#ܧm身''_1Ps ,{ ЎحOCguSBϺ~bsJ7n&cyZ M_ BB#ZQ2 jy9_ _[qNaxv1Z;N\d -kE۷ c^12pm]Ho`E4 T7Mê92GKt&$ Uppm)'vߥ,%\sF?ϡw-{v]+He@kLN咑R\LtJwV6P|`fMӚzـcV94Js\~ʢS.d2bJQmY;,O9s-1%*֛~f?ǹx͸kQ"ݽUŖlT"b&9KO?—Y1BBqfdDG9\cVĞ?Vlc4Oqܻ>Q&k3lԦ "iM 0 k{JOz?ja@H6Y,;U A\Lt ㅥSa飁v22 !ʔ?n}up^U~Zn2)o1Dm0׈5y) {=t ַWcV^K1G]xx#Bvԣ9O]9~]%>IqgvʿAoZ 7V2PU8{D4#1gCcR6o߲.%亥-mrF}=K!a{fQ|/)?lRbgxA8 }z,niqc]#IK|Ts`XCdˆucԐy$Fz3zTbQWk{$Ͻ^_ŗjS蛔L}Q-/;88PTk9.hqx͂ϛc>1wN`aIJi gt59ðnd;rEnҼTIW/^KVc α_|STjA=}f2~b8yX֌&6>쩜݋?2{?KMeSzaBoO&3eNo棫wϘx{Z>P/cA`֋_]ˬxIoR-[O "t>Zg#חBi.- g[78(-y4=WnzɁ.,׾}_̤Җ浺6VIυY[$7G%F7a|X;Gq+%|s-3f3BT6 BE_VW))c~JU}.Q'_ΏA쿶X,wS=%ovB;]+Rc_z3lSrJ!V3WժA$Τ$Nv|xpNjzU9Oq璠;T2}xfN|c[!V楩\ʾ NtwmM:Ua:AlIU8;EfJ1+"!l [o%/eisi {(WklJV8/0] ZrXfBujw*fGdzlkW5L8ǽ Sf endstream endobj 40 0 obj << /Author () /CreationDate (D:20200502065952Z) /Creator (LaTeX with hyperref) /Keywords () /ModDate (D:20200502065952Z) /PTEX.Fullbanner (This is pdfTeX, Version 3.14159265-2.6-1.40.20 \(TeX Live 2019\) kpathsea version 6.3.1) /Producer (pdfTeX-1.40.20) /Subject () /Title () /Trapped /False >> endobj 41 0 obj << /Type /XRef /Length 170 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Size 233 /ID [<1afe497dd876b61c74ffbc0e0d8d8db6><16e47cc4be96e28b0e3c855154f94949>] >> stream xcb&FFV;&Ɨ R|DJL , ";jnT;AB#, ̾ "<07خ`k (k1 gR`Y9b`Yo0;̖B 'L]XD B\b?`3GQ4qa$ W endstream endobj startxref 216 %%EOF afex/inst/doc/afex_anova_example.Rmd0000644000176200001440000004156214076011252017213 0ustar liggesusers--- title: "ANOVA and Post-Hoc Contrasts: Reanalysis of Singmann and Klauer (2011)" author: "Henrik Singmann" date: "`r Sys.Date()`" show_toc: true output: knitr:::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{ANOVA and Post-Hoc Contrasts: Reanalysis of Singmann and Klauer (2011)} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r echo=FALSE} req_suggested_packages <- c("emmeans", "multcomp", "ggplot2") pcheck <- lapply(req_suggested_packages, requireNamespace, quietly = TRUE) if (any(!unlist(pcheck))) { message("Required package(s) for this vignette are not available/installed and code will not be executed.") knitr::opts_chunk$set(eval = FALSE) } ``` ```{r set-options, echo=FALSE, cache=FALSE} op <- options(width = 90) knitr::opts_chunk$set(dpi=72) ``` # Overview This documents reanalysis a dataset from an Experiment performed by Singmann and Klauer (2011) using the ANOVA functionality of __afex__ followed by post-hoc tests using package [__emmeans__](https://cran.r-project.org/package=emmeans) (Lenth, 2017). After a brief description of the dataset and research question, the code and results are presented. # Description of Experiment and Data Singmann and Klauer (2011) were interested in whether or not conditional reasoning can be explained by a single process or whether multiple processes are necessary to explain it. To provide evidence for multiple processes we aimed to establish a double dissociation of two variables: instruction type and problem type. Instruction type was manipulated between-subjects, one group of participants received deductive instructions (i.e., to treat the premises as given and only draw necessary conclusions) and a second group of participants received probabilistic instructions (i.e., to reason as in an everyday situation; we called this "inductive instruction" in the manuscript). Problem type consisted of two different orthogonally crossed variables that were manipulated within-subjects, validity of the problem (formally valid or formally invalid) and plausibility of the problem (inferences which were consisted with the background knowledge versus problems that were inconsistent with the background knowledge). The critical comparison across the two conditions was among problems which were valid and implausible with problems that were invalid and plausible. For example, the next problem was invalid and plausible: > If a person is wet, then the person fell into a swimming pool. > A person fell into a swimming pool. > How valid is the conclusion/How likely is it that the person is wet? For those problems we predicted that under deductive instructions responses should be lower (as the conclusion does not necessarily follow from the premises) as under probabilistic instructions. For the valid but implausible problem, an example is presented next, we predicted the opposite pattern: > If a person is wet, then the person fell into a swimming pool. > A person is wet. > How valid is the conclusion/How likely is it that the person fell into a swimming pool? Our study also included valid and plausible and invalid and implausible problems. In contrast to the analysis reported in the manuscript, we initially do not separate the analysis into affirmation and denial problems, but first report an analysis on the full set of inferences, MP, MT, AC, and DA, where MP and MT are valid and AC and DA invalid. We report a reanalysis of our Experiment 1 only. Note that the factor `plausibility` is not present in the original manuscript, there it is a results of a combination of other factors. # Data and R Preperation We begin by loading the packages we will be using throughout. ```{r message=FALSE, warning=FALSE} library("afex") # needed for ANOVA functions. library("emmeans") # emmeans must now be loaded explicitly for follow-up tests. library("multcomp") # for advanced control for multiple testing/Type 1 errors. library("ggplot2") # for customizing plots. ``` ```{r} data(sk2011.1) str(sk2011.1) ``` An important feature in the data is that each participant provided two responses for each cell of the design (the content is different for each of those, each participant saw all four contents). These two data points will be aggregated automatically by `afex`. ```{r} with(sk2011.1, table(inference, id, plausibility)) ``` # ANOVA To get the full ANOVA table for the model, we simply pass it to `aov_ez` using the design as described above. We save the returned object for further analysis. ```{r} a1 <- aov_ez("id", "response", sk2011.1, between = "instruction", within = c("inference", "plausibility")) a1 # the default print method prints a data.frame produced by nice ``` The equivalent calls (i.e., producing exactly the same output) of the other two ANOVA functions `aov_car` or `aov4` is shown below. ```{r, eval=FALSE} aov_car(response ~ instruction + Error(id/inference*plausibility), sk2011.1) aov_4(response ~ instruction + (inference*plausibility|id), sk2011.1) ``` As mentioned before, the two responses per cell of the design and participants are aggregated for the analysis as indicated by the warning message. Furthermore, the degrees of freedom are Greenhouse-Geisser corrected per default for all effects involving `inference`, as `inference` is a within-subject factor with more than two levels (i.e., MP, MT, AC, & DA). In line with our expectations, the three-way interaction is significant. The object printed per default for `afex_aov` objects (produced by `nice`) can also be printed nicely using `knitr`: ```{r, results='asis', } knitr::kable(nice(a1)) ``` Alternatively, the `anova` method for `afex_aov` objects returns a `data.frame` of class `anova` that can be passed to, for example, `xtable` for nice formatting: ```{r, results='asis'} print(xtable::xtable(anova(a1), digits = c(rep(2, 5), 3, 4)), type = "html") ``` # Post-Hoc Contrasts and Plotting To further analyze the data we need to pass it to package `emmeans`, a package that offers great functionality for both plotting and contrasts of all kind. A lot of information on `emmeans` can be obtained in [its vignettes](https://cran.r-project.org/package=emmeans) and [faq](https://CRAN.R-project.org/package=emmeans/vignettes/FAQs.html). `emmeans` can work with `afex_aov` objects directly as __afex__ comes with the necessary methods for the generic functions defined in `emmeans`. When using the default `multivariate` option for follow-up tests, `emmeans` uses the ANOVA model estimated via base R's `lm` method (which in the case of a multivariate response is an object of class `c("mlm", "lm")`). `afex` also supports a univariate model (i.e., `emmeans_model = "univariate"`, which requires that `include_aov = TRUE` in the ANOVA call) in which case `emmeans` uses the object created by base R's `aov` function (this was the previous default but is not recommended as it does not handle unbalanced data well). ## Some First Contrasts ### Main Effects Only This object can now be passed to `emmeans`, for example to obtain the marginal means of the four inferences: ```{r} m1 <- emmeans(a1, ~ inference) m1 ``` This object can now also be used to compare whether or not there are differences between the levels of the factor: ```{r} pairs(m1) ``` To obtain more powerful p-value adjustments, we can furthermore pass it to `multcomp` (Bretz, Hothorn, & Westfall, 2011): ```{r} summary(as.glht(pairs(m1)), test=adjusted("free")) ``` ### A Simple interaction We could now also be interested in the marginal means of the inferences across the two instruction types. `emmeans` offers two ways to do so. The first splits the contrasts across levels of the factor using the `by` argument. ```{r} m2 <- emmeans(a1, "inference", by = "instruction") ## equal: emmeans(a1, ~ inference|instruction) m2 ``` Consequently, tests are also only performed within each level of the `by` factor: ```{r} pairs(m2) ``` The second version considers all factor levels together. Consequently, the number of pairwise comparisons is a lot larger: ```{r} m3 <- emmeans(a1, c("inference", "instruction")) ## equal: emmeans(a1, ~inference*instruction) m3 pairs(m3) ``` ### Running Custom Contrasts Objects returned from `emmeans` can also be used to test specific contrasts. For this, we can simply create a list, where each element corresponds to one contrasts. A contrast is defined as a vector of constants on the reference grid (i.e., the object returned from `emmeans`, here `m3`). For example, we might be interested in whether there is a difference between the valid and invalid inferences in each of the two conditions. ```{r} c1 <- list( v_i.ded = c(0.5, 0.5, -0.5, -0.5, 0, 0, 0, 0), v_i.prob = c(0, 0, 0, 0, 0.5, 0.5, -0.5, -0.5) ) contrast(m3, c1, adjust = "holm") summary(as.glht(contrast(m3, c1)), test = adjusted("free")) ``` The results can be interpreted as in line with expectations. Responses are larger for valid than invalid problems in the deductive, but not the probabilistic condition. ## Plotting Since version `0.22`, `afex` comes with its own plotting function based on `ggplot2`, `afex_plot`, which works directly with `afex_aov` objects. As said initially, we are interested in the three-way interaction of instruction with inference, plausibility, and instruction. As we saw above, this interaction was significant. Consequently, we are interested in plotting this interaction. ### Basic Plots For `afex_plot`, we need to specify the `x`-factor(s), which determine which factor-levels or combinations of factor-levels are plotted on the x-axis. We can also define `trace` factor(s), which determine which factor levels are connected by lines. Finally, we can also define `panel` factor(s), which determine if the plot is split into subplots. `afex_plot` then plots the estimated marginal means obtained from `emmeans`, confidence intervals, and the raw data in the background. Note that the raw data in the background is per default drawn using an alpha blending of .5 (i.e., 50% semi-transparency). Thus, in case of several points lying directly on top of each other, this point appears noticeably darker. ```{r fig.width=7.5, fig.height=4} afex_plot(a1, x = "inference", trace = "instruction", panel = "plausibility") ``` In the default settings, the error bars show 95%-confidence intervals based on the standard error of the underlying model (i.e., the `lm` model in the present case). In the present case, in which each subplot (defined by `x`- and `trace`-factor) shows a combination of a within-subjects factor (i.e., `inference`) and a between-subjects (i.e., `instruction`) factor, this is not optimal. The error bars only allow to assess differences regarding the between-subjects factor (i.e., across the lines), but not inferences regarding the within-subjects factor (i.e., within one line). This is also indicated by a warning. An alternative would be within-subject confidence intervals: ```{r fig.width=7.5, fig.height=4} afex_plot(a1, x = "inference", trace = "instruction", panel = "plausibility", error = "within") ``` However, those only allow inferences regarding the within-subject factors and not regarding the between-subjecta factor. So the same warning is emitted again. A further alternative is to suppress the error bars altogether. This is the approach used in our original paper and probably a good idea in general when figures show both between- and within-subjects factors within the same panel. The presence of the raw data in the background still provides a visual depiction of the variability of the data. ```{r fig.width=7.5, fig.height=4} afex_plot(a1, x = "inference", trace = "instruction", panel = "plausibility", error = "none") ``` ### Customizing Plots `afex_plot` allows to customize the plot in a number of different ways. For example, we can easily change the aesthetic mapping associated with the `trace` factor. So instead of using lineytpe and shape of the symbols, we can use color. Furthermore, we can change the graphical element used for plotting the data points in the background. For example, instead of plotting the raw data, we can replace this with a boxplot. Finally, we can also make both the points showing the means and the lines connecting the means larger. ```{r fig.width=7.5, fig.height=4} p1 <- afex_plot(a1, x = "inference", trace = "instruction", panel = "plausibility", error = "none", mapping = c("color", "fill"), data_geom = geom_boxplot, data_arg = list(width = 0.4), point_arg = list(size = 1.5), line_arg = list(size = 1)) p1 ``` Note that `afex_plot` returns a `ggplot2` plot object which can be used for further customization. For example, one can easily change the `theme` to something that does not have a grey background: ```{r fig.width=7.5, fig.height=4} p1 + theme_light() ``` We can also set the theme globally for the remainder of the `R` session. ```{r} theme_set(theme_light()) ``` The full set of customizations provided by `afex_plot` is beyond the scope of this vignette. The examples on the help page at `?afex_plot` provide a good overview. # Replicate Analysis from Singmann and Klauer (2011) However, the plots shown so far are not particularly helpful with respect to the research question. Next, we fit a new ANOVA model in which we separate the data in affirmation and denial inferences. This was also done in the original manuscript. We then lot the data a second time. ```{r} a2 <- aov_ez("id", "response", sk2011.1, between = "instruction", within = c("validity", "plausibility", "what")) a2 ``` Then we plot the data from this ANOVA. Because each panel would again show a mixed-design, we suppress the error bars. ```{r fig.width=7.5, fig.height=4} afex_plot(a2, x = c("plausibility", "validity"), trace = "instruction", panel = "what", error = "none") ``` We see the critical and predicted cross-over interaction in the left of those two graphs. For implausible but valid problems deductive responses are larger than probabilistic responses. The opposite is true for plausible but invalid problems. We now tests these differences at each of the four x-axis ticks in each plot using custom contrasts (`diff_1` to `diff_4`). Furthermore, we test for a validity effect and plausibility effect in both conditions. ```{r} (m4 <- emmeans(a2, ~instruction+plausibility+validity|what)) c2 <- list( diff_1 = c(1, -1, 0, 0, 0, 0, 0, 0), diff_2 = c(0, 0, 1, -1, 0, 0, 0, 0), diff_3 = c(0, 0, 0, 0, 1, -1, 0, 0), diff_4 = c(0, 0, 0, 0, 0, 0, 1, -1), val_ded = c(0.5, 0, 0.5, 0, -0.5, 0, -0.5, 0), val_prob = c(0, 0.5, 0, 0.5, 0, -0.5, 0, -0.5), plau_ded = c(0.5, 0, -0.5, 0, -0.5, 0, 0.5, 0), plau_prob = c(0, 0.5, 0, -0.5, 0, 0.5, 0, -0.5) ) contrast(m4, c2, adjust = "holm") ``` We can also pass these tests to `multcomp` which gives us more powerful Type 1 error corrections. ```{r} summary(as.glht(contrast(m4, c2)), test = adjusted("free")) ``` Unfortunately, in the present case this function throws several warnings. Nevertheless, the p-values from both methods are very similar and agree on whether or not they are below or above .05. Because of the warnings it seems advisable to use the one provided by `emmeans` directly and not use the ones from `multcomp`. The pattern for the affirmation problems is in line with the expectations: We find the predicted differences between the instruction types for valid and implausible (`diff_2`) and invalid and plausible (`diff_3`) and the predicted non-differences for the other two problems (`diff_1` and `diff_4`). Furthermore, we find a validity effect in the deductive but not in the probabilistic condition. Likewise, we find a plausibility effect in the probabilistic but not in the deductive condition. # Final Note Choosing the right correction for multiple testing can be difficult. In fact `multcomp` comes with an accompanying book (Bretz et al., 2011). If the degrees-of-freedom of all contrasts are identical using `multcomp`'s method `free` is more powerful than simply using the Bonferroni-Holm method. `free` is a generalization of the Bonferroni-Holm method that takes the correlations among the model parameters into account and uniformly more powerful. # References * Bretz, F., Hothorn, T., & Westfall, P. H. (2011). _Multiple comparisons using R_. Boca Raton, FL: CRC Press. https://CRAN.R-project.org/package=multcomp * Singmann, H., & Klauer, K. C. (2011). Deductive and inductive conditional inferences: Two modes of reasoning. _Thinking & Reasoning_, 17(3), 247-281. doi: 10.1080/13546783.2011.572718 * Lenth, R. (2017). _emmeans: Estimated Marginal Means, aka Least-Squares Means_. R package version 0.9.1. https://CRAN.R-project.org/package=emmeans ```{r, include=FALSE} options(op) ``` afex/inst/doc/assumptions_of_ANOVAs.html0000644000176200001440000040426714076067245020015 0ustar liggesusers Testing the Assumptions of ANOVAs

Testing the Assumptions of ANOVAs

Mattan S. Ben-Shachar

2021-07-21

Foreword by Henrik Singmann

As all statistical models, ANOVAs have a number of assumptions that should hold for valid inferences. These assumptions are:

  1. Observations are i.i.d.: i.i.d. stands for “independent and identically distributed”. Independent means that, once the model is specified, the conditional observations (i.e., residuals) are independent of each other (i.e., knowing the value of one residual does not allow you to infer the value of any other residual). Identically distributed means that all observations are generated by the same data-generating process.
  2. Homogeneity of Variances: the variances across all the groups (cells) of between-subject effects are the same.
  3. Sphericity: For within-subjects effects, sphericity is the condition where the variances of the differences between all possible pairs of within-subject conditions (i.e., levels of the independent variable) are equal. This can be thought of as a within-subjects’ version of the Homogeneity of Variances assumption.
  4. Normality of residuals: The errors used for the estimation of the error term(s) (MSE) are normally distributed.

The most important assumption generally is the i.i.d. assumption (i.e., if it does not hold, the inferences are likely invalid), specifically the independent part. This assumption cannot be tested empirically but needs to hold on conceptual or logical grounds. For example, in an ideal completely between-subjects design each observation comes from a different participant that is randomly sampled from a population so we know that all observations are independent. Often, we collect multiple observations from the same participant in a within-subject or repeated-measures design. To ensure the i.i.d. assumption holds in this case, we need to specify an ANOVA with within-subject factors. However, if we have a data set with multiple sources of non-independence – such as participants and items – ANOVA models cannot be used but we have to use a mixed model.

The other assumptions can be tested empirically, either graphically or using statistical assumption tests. However, there are different opinions on how useful statistical assumptions tests are when done in an automatic manner for each ANOVA. Whereas this is the position taken in some statistics books, this runs the risk of reducing the statistical analysis to a “cookbook” or “flowchart”. Real life data analysis is often more complex than such simple rules. Therefore, it is often more productive to explore ones data using both descriptive statistics and graphical displays. This data exploration should allow one to judge whether the other ANOVA assumptions hold to a sufficient degree. For example, plotting ones ANOVA results using afex_plot and including a reasonable display of the individual data points often allows one to judge both the homogeneity of variance and the normality of the residuals assumption.

Let us take a look at all three empirically testable assumptions in detail. ANOVAs are often robust to light violations to the homogeneity of variances assumption. If this assumption is clearly violated, we have learned something important about the data, namely variance heterogeneity, that requires further study. Some further statistical solutions are discussed below.

If the main goal of an ANOVA is to see whether or not certain effects are significant, then the assumption of normality of the residuals is only required for small samples, thanks to the central limit theorem. As shown by Lumley et al. (2002), with sample sizes of a few hundred participants even extreme violations of the normality assumptions are unproblematic. So mild violations of this assumptions are usually no problem with sample sizes exceeding 30.

Finally, the default afex behaviour is to correct for violations of sphericity using the Greenhouse-Geisser correction. Whereas this default may in some situation produce a small loss in statistical power, this seems preferable to a situation in which violations of sphericity are overlooked and tests become anti-conservative (i.e., more false positive results).

Thus, my position as the afex developer is that an appropriate exploratory data analysis is often better than just blindly applying statistical assumption tests. Nevertheless, assumption tests are of course an important tool in the statistical toolbox and can be helpful in many situations. Thus, I am thankful to Mattan S. Ben-Shachar who has provided them for ANOVAs in afex. The following text provides his introduction to the assumption tests based on the performance and see packages.

Testing the Empirically Testable Assumptions

afex comes with a set of built-in functions to help in the testing of the assumptions of ANOVA design. Generally speaking, the testable assumptions of ANOVA are1:

  1. Homogeneity of Variances: the variances across all the groups (cells) of between-subject effects are the same. This can be tested with performance::check_homogeneity().
  2. Sphericity: For within-subjects effects, sphericity is the condition where the variances of the differences between all possible pairs of within-subject conditions (i.e., levels of the independent variable) are equal. This can be thought of as a within-subjects’ version of the Homogeneity of Variances assumption, and can be tested with performance::check_sphericity().
  3. Normality of residuals: The errors used for the estimation of the error term(s) (MSE) are normally distributed. This can be inferred using performance::check_normality().

What follows is a brief review of these assumptions and their tests.

library(afex)
library(performance) # for assumption checks

Homogeneity of Variances

This assumption, for between subject-designs, states that the within group errors all share a common variance around the group’s mean. This can be tested with Levene’s test:

data(obk.long, package = "afex")

o1 <- aov_ez("id", "value", obk.long, 
             between = c("treatment", "gender"))
## Warning: More than one observation per cell, aggregating the data using mean (i.e,
## fun_aggregate = mean)!
check_homogeneity(o1)
## OK: Variances in each of the groups are the same (Levene's Test, p = 0.350).

These results indicate that homogeneity is not significantly violated.

What to do when assumption is violated?

ANOVAs are generally robust to “light” heteroscedasticity, but there are various other methods (not available in afex) for getting robust error estimates.

Another alternative is to ditch this assumption altogether and use permutation tests (e.g. with permuco) or bootstrapped estimates (e.g. with boot).

Sphericity

data("fhch2010", package = "afex")

a1 <- aov_ez("id", "log_rt", fhch2010,
             between = "task", 
             within = c("density", "frequency", "length", "stimulus"))
## Warning: More than one observation per cell, aggregating the data using mean (i.e,
## fun_aggregate = mean)!

We can use check_sphericity() to run Mauchly’s test of sphericity:

check_sphericity(a1)
## Warning in summary.Anova.mlm(object$Anova, multivariate = FALSE): HF eps > 1 treated as 1
## Warning: Sphericity violated for: 
##  - length:stimulus (p = 0.021)
##  - task:length:stimulus (p = 0.021).

We can see that both the error terms of the length:stimulus and task:length:stimulus interactions significantly violate the assumption of sphericity at p = 0.021. Note that as task is a between-subjects factor, both these interaction terms share the same error term!

What to do when assumption is violated?

  • For ANOVA tables, a correction to the degrees of freedom can be used - afex offers both the Greenhouse-Geisser (which is used by default) and the Hyunh-Feldt corrections.
  • For follow-up contrasts with emmeans, a multivariate model can be used, which does not assume sphericity (this is used by default since afex 1.0).

Both can be set globally with:

afex_options(
  correction_aov = "GG", # or "HF"
  emmeans_model = "multivariate"
)

Normalicy of Residuals

The normalicy of residuals assumption is concerned with the errors that make up the various error terms in the ANOVA. Although the Shapiro-Wilk test can be used to test for deviation from a normal distribution, this test tends to have high type-I error rates. Instead, one can visually inspect the residuals using quantile-quantile plots (AKA qq-plots). For example:

data("stroop", package = "afex")

stroop1 <- subset(stroop, study == 1)
stroop1 <- na.omit(stroop1)

s1 <- aov_ez("pno", "rt", stroop1,
             within = c("condition", "congruency"))
## Warning: More than one observation per cell, aggregating the data using mean (i.e,
## fun_aggregate = mean)!
is_norm <- check_normality(s1)
## Warning: Non-normality of residuals detected (p < .001).
plot(is_norm)

plot(is_norm, type = "qq")
## Loading required namespace: qqplotr

If the residuals were normally distributed, we would see them falling close to the diagonal line, inside the 95% confidence bands around the qq-line.

We can further de-trend the plot, and show not the expected quantile, but the deviation from the expected quantile, which may help reducing visual bias.

plot(is_norm, type = "qq", detrend = TRUE)

Wow! The deviation from normalicy is now visually much more pronounced!

What to do when assumption is violated?

As with the assumption of homogeneity of variances, we can resort to using permutation tests for ANOVA tables and bootstrap estimates / contrasts.

Another popular solution is to apply a monotonic transformation to the dependent variable. This should not be done lightly, as it changes the interpretability of the results (from the observed scale to the transformed scale). Luckily for us, it is common to log transform reaction times, which we can easily do2:

s2 <- aov_ez("pno", "rt", stroop1,
             transformation = "log",
             within = c("condition", "congruency"))
## Warning: More than one observation per cell, aggregating the data using mean (i.e,
## fun_aggregate = mean)!
is_norm <- check_normality(s2)
## Warning: Non-normality of residuals detected (p = 0.041).
plot(is_norm, type = "qq", detrend = TRUE)

Success - after the transformation, the residuals (on the log scale) do not deviate more than expected from errors sampled from a normal distribution (are mostly contained in the 95%CI bands)!

References


  1. There is also the assumptions that (a) the model is correctly specified and that (b) errors are independent, but there is no “hard” test for these assumptions.↩︎

  2. But note ANOVA no longer tests if any differences between the means is significantly different from 0, but if any ratio between the means is significantly different from 1.↩︎

afex/inst/doc/afex_plot_supported_models.html0000644000176200001440000065714514076067241021267 0ustar liggesusers afex_plot: Supported Models

afex_plot: Supported Models

Henrik Singmann

2021-07-21

Introduction

afex_plot() visualizes results from factorial experiments and, more generally, data set with interactions of categorical/factor variables. It does so by combining estimated marginal means and uncertainties associated with these means in the foreground with a depiction of the raw data in the background. If models include continuous covariates, other approaches are recommended (e.g., such as implemented in package effects or by using the possibility of afex_plot to return the data and build the plot on ones own).

This document provides an overview of the different models supported by afex_plot() in addition to the afex objects (i.e., afex_aov and mixed). In general, these are models which are supported by the emmeans package as the afex_plot.default() method uses emmeans to get the estimated marginal means. afex_plot.default() then guesses whether there are repeated measures or all samples are independent. Based on this guess (which can be changed via the id argument) data in the background is plotted. Calculation of error bars can also be based on this guess (but the default is to plot the model based error bars obtained from emmeans).

For a generally introduction to the functionality of afex_plot see: afex_plot: Publication Ready Plots for Experimental Designs

Throughout the document, we will need afex as well as ggplot2. In addition, we load cowplot for function plot_grid() (which allows to easily combine multiple ggplot2 plots). In addition, we will set a somewhat nicer ggplot2 theme.

library("afex")     
library("ggplot2")  
library("cowplot")
theme_set(theme_bw(base_size = 14) + 
            theme(legend.position="bottom", 
                  panel.grid.major.x = element_blank(),
                  panel.grid.minor.x = element_blank()))

Importantly, we also set the contrasts for the current R session to sum-to-zero contrasts. For models that include interactions with categorical variables this generally produces estimates that are easier to interpret.

set_sum_contrasts()
## setting contr.sum globally: options(contrasts=c('contr.sum', 'contr.poly'))

Please note, the best way to export a figure is via ggsave() or a similar function call. For Word and similar document formats, png is a good file type, for LaTeX and similar document formats, pdf is a good file type.

Base R stats models: lm, glm

afex_plot() generally supports models implemeneted via the stats package. Here I show the main model functions that work with independent samples. These models can be passed to afex_plot without specifying additional arguments.

Most importantly, lm models work directly. For those we use the warpbreaks data.

warp.lm <- lm(breaks ~ wool * tension, data = warpbreaks)

Note that afex_plot produces several messages that are shown here as comments below the corresponding calls. Important is maybe that afex_plot assumes all observations (i.e., rows) are independent. This is of course the case here. In addition, for the first plot we are informed that the presence of an interaction may lead to a misleading impression if only a lower-order effect (here a main effect) is shown. This message is produced by emmeans and passed through.

p1 <- afex_plot(warp.lm, "tension")
## dv column detected: breaks
## No id column passed. Assuming all rows are independent samples.
## NOTE: Results may be misleading due to involvement in interactions
p2 <- afex_plot(warp.lm, "tension", "wool")
## dv column detected: breaks
## No id column passed. Assuming all rows are independent samples.
plot_grid(p1, p2)

glm models also work without further setting. Here we first use a poisson GLM for which we need to generate the data.

ins <- data.frame(
    n = c(500, 1200, 100, 400, 500, 300),
    size = factor(rep(1:3,2), labels = c("S","M","L")),
    age = factor(rep(1:2, each = 3)),
    claims = c(42, 37, 1, 101, 73, 14))

We can then fit the data and pass the model object as is.

ins.glm <- glm(claims ~ size + age + offset(log(n)), 
               data = ins, family = "poisson")
afex_plot(ins.glm, "size", "age")
## dv column detected: claims
## No id column passed. Assuming all rows are independent samples.

afex_plot also works with binomial GLMs for which we also first need to generate some data which we will then fit.

## binomial glm adapted from ?predict.glm
ldose <- factor(rep(0:5, 2))
numdead <- c(1, 4, 9, 13, 18, 20, 0, 2, 6, 10, 12, 16)
sex <- factor(rep(c("M", "F"), c(6, 6)))
SF <- numdead/20  ## dv should be a vector, no matrix
budworm.lg <- glm(SF ~ sex*ldose, family = binomial, 
                  weights = rep(20, length(numdead)))

For this model, we will produce three plots we can then compare. The first only shows the main effect of one variable (ldose). The other show the interaction of the two variables. Because for binomial GLMs we then only have one data point (with several observations), the individual data points and mean cannot be distinguished. This is made clear in the ther two (panels B and C).

a <- afex_plot(budworm.lg, "ldose")
## dv column detected: SF
## No id column passed. Assuming all rows are independent samples.
## NOTE: Results may be misleading due to involvement in interactions
b <- afex_plot(budworm.lg, "ldose", "sex") ## data point is hidden behind mean!
## dv column detected: SF
## No id column passed. Assuming all rows are independent samples.
c <- afex_plot(budworm.lg, "ldose", "sex", 
          data_arg = list(size = 4, color = "red"))
## dv column detected: SF
## No id column passed. Assuming all rows are independent samples.
plot_grid(a, b, c, labels = "AUTO", nrow = 1)

nlme mixed model

Hot to use afex_plot for mixed models fitted with afex::mixed (or lme4 directly) is shown in the other vignette. However, we can also use afex_plot for mixed models fitted with the older nlme package. For this, however we need to pass the data used for fitting via the data argument.

We can change on which of the two nested factors the individual data points in the background are based via the id argument. This is shown below.

## nlme mixed model
data(Oats, package = "nlme")
Oats$nitro <- factor(Oats$nitro)
oats.1 <- nlme::lme(yield ~ nitro * Variety, 
                    random = ~ 1 | Block / Variety,
                    data = Oats)
plot_grid(
  afex_plot(oats.1, "nitro", "Variety", data = Oats), # A
  afex_plot(oats.1, "nitro", "Variety", data = Oats), # B
  afex_plot(oats.1, "nitro", "Variety", data = Oats, id = "Block"), # C
  afex_plot(oats.1, "nitro", data = Oats), # D
  afex_plot(oats.1, "nitro", data = Oats, id = c("Block", "Variety")), # E
  afex_plot(oats.1, "nitro", data = Oats, id = "Block"), # F
  labels = "AUTO"
)
## dv column detected: yield
## No id column passed. Assuming all rows are independent samples.
## dv column detected: yield
## No id column passed. Assuming all rows are independent samples.
## dv column detected: yield
## dv column detected: yield
## No id column passed. Assuming all rows are independent samples.
## NOTE: Results may be misleading due to involvement in interactions
## dv column detected: yield
## NOTE: Results may be misleading due to involvement in interactions
## dv column detected: yield
## NOTE: Results may be misleading due to involvement in interactions

glmmTMB

Support for glmmTMB is also provided. Here we use an example data set for which we model zero-inflation as well as overdispersion. The latter is achieved with a variant of the negative binomial distribution.

library("glmmTMB")
tmb <- glmmTMB(count~spp * mined + (1|site), 
              ziformula = ~spp * mined, 
              family=nbinom2, Salamanders)

afex_plot does not automatically detect the random-effect for site. This means that per default all 644 data points are shown. When plotting only one variable, in which the default data_geom is ggbeeswarm::geom_beeswarm, this can lead to rather ugly plots due to the zero inflation. This is shon in panel A below. In panel B, we address this by changing the geom to a violin plot. In panel C, we address this by aggregating the data within site, but still use the beeswarm plot. Note that for panel C it is necessary to pass the data via the data argument as otherwise site cannot be found for aggregation.

plot_grid(
  afex_plot(tmb, "spp"),
  afex_plot(tmb, "spp", data_geom = geom_violin),
  afex_plot(tmb, "spp", id = "site", data = Salamanders), 
  labels = "AUTO", nrow = 1
)
## dv column detected: count
## No id column passed. Assuming all rows are independent samples.
## NOTE: Results may be misleading due to involvement in interactions
## dv column detected: count
## No id column passed. Assuming all rows are independent samples.
## NOTE: Results may be misleading due to involvement in interactions
## dv column detected: count
## NOTE: Results may be misleading due to involvement in interactions

When plotting both variables, the problem is somewhat hidden, because instead of beeswarm plots, semi-transparency (i.e., alpha < 1) is used to show overlapping points. In panel B we again make this clearer but this time by adding jitter (on both the y- and x-axis) and increasing the degree of semi-transparancy (i.e., decreasing alpha).

a <- afex_plot(tmb, "spp", "mined")
## dv column detected: count
## No id column passed. Assuming all rows are independent samples.
b <- afex_plot(tmb, "spp", "mined", data_alpha = 0.3,
          data_arg = list(
            position = 
              ggplot2::position_jitterdodge(
                jitter.width = 0.2, 
                jitter.height = 0.5, 
                dodge.width = 0.5  ## needs to be same as dodge
                ),
            color = "darkgrey"))
## dv column detected: count
## No id column passed. Assuming all rows are independent samples.
plot_grid(a, b, labels = "AUTO")

For the final plot we also plot the interaction, but this time aggregate the individual-data within site. This allows us again to use a beeswarm plot (after decreasing the width of the “bees”) and produces a relatively clear result.

afex_plot(tmb, "spp", "mined", id = "site", data = Salamanders, 
          data_geom = ggbeeswarm::geom_beeswarm, 
          data_arg = list(dodge.width = 0.5, cex = 0.4,
                          color = "darkgrey")
          )
## dv column detected: count

rstanarm

afex_plot() also supports Bayesian models that are also supported via emmeans. For example, we can easily fit a binomial model with rstanarm.

library("rstanarm") ## requires resetting the ggplot2 theme
theme_set(theme_bw(base_size = 14) + 
            theme(legend.position="bottom", 
                  panel.grid.major.x = element_blank(),
                  panel.grid.minor.x = element_blank()))
cbpp <- lme4::cbpp 
cbpp$prob <- with(cbpp, incidence / size)
example_model <- stan_glmer(prob ~ period + (1|herd),
                            data = cbpp, family = binomial, weight = size,
                            chains = 2, cores = 1, seed = 12345, iter = 500)

We can directly pass this model to afex_plot. However, we also see quite some zeros leading to a not super nice plot. It looks a bit better using a violin plot for the raw data.

b1 <- afex_plot(example_model, "period")
## dv column detected: prob
## No id column passed. Assuming all rows are independent samples.
b2 <- afex_plot(example_model, "period", data_geom = geom_violin)
## dv column detected: prob
## No id column passed. Assuming all rows are independent samples.
plot_grid(b1, b2, labels = "AUTO")

We can also produce a plot based on the individual Bernoulli observations in the data. For this, we first need to expand the data such that we have one row per observation. With this, we can then fit the essentially same model as above.

cbpp_l <- vector("list", nrow(cbpp))
for (i in seq_along(cbpp_l)) {
  cbpp_l[[i]] <- data.frame(
    herd = cbpp$herd[i],
    period = cbpp$period[i],
    incidence = rep(0, cbpp$size[i])
  )
  cbpp_l[[i]]$incidence[seq_len(cbpp$incidence[i])] <- 1
}
cbpp_l <- do.call("rbind", cbpp_l)
cbpp_l$herd <- factor(cbpp_l$herd, levels = levels(cbpp$herd))
cbpp_l$period <- factor(cbpp_l$period, levels = levels(cbpp$period))
example_model2 <- stan_glmer(incidence ~ period + (1|herd),
                             data = cbpp_l, family = binomial, 
                             chains = 2, cores = 1, seed = 12345, iter = 500)

Again, this model can be directly passed to afex_plot. However, here we see even more 0 as the data is not yet aggregated. Consequently, we need to pass id = "herd" to aggregate the individual observations within each herd.

b3 <- afex_plot(example_model2, "period")
## dv column detected: incidence
## No id column passed. Assuming all rows are independent samples.
b4 <- afex_plot(example_model2, "period", id = "herd")
## dv column detected: incidence
plot_grid(b3, b4, labels = "AUTO")
## Warning in f(...): The default behavior of beeswarm has changed in version 0.6.0. In
## versions <0.6.0, this plot would have been dodged on the y-axis. In versions >=0.6.0,
## grouponX=FALSE must be explicitly set to group on y-axis. Please set grouponX=TRUE/FALSE
## to avoid this warning and ensure proper axis choice.

We can of course also fit a model assuming a normal distribution using rstanarm. For example using the Machines data.

data("Machines", package = "MEMSS") 
mm <- stan_lmer(score ~ Machine + (Machine|Worker), data=Machines,
                chains = 2, cores = 1, seed = 12345, iter = 500)

As before, we can pass this model directly to afex_plot (see panel A). However, the data is again not aggregated within the grouping variable Worker. If we want to aggregate the individual data points for the grouping factor, we need to pass both the name of the grouping variable (Worker) and the data used for fitting.

b5 <- afex_plot(mm, "Machine")
## dv column detected: score
## No id column passed. Assuming all rows are independent samples.
b6 <- afex_plot(mm, "Machine", id = "Worker")
## dv column detected: score
plot_grid(b5, b6, labels = "AUTO")

brms

We can also fit the Machines data using brms.

library("brms")
data("Machines", package = "MEMSS") 
mm2 <- brm(score ~ Machine + (Machine|Worker), data=Machines, 
           chains = 2, cores = 1, seed = 12345, iter = 500)

However, to pass a brms object to afex_plot we need to pass both, the data used for fitting as well as the name of the dependent variable (here score) via the dv argument. We again build the plot such that the left panel shows the raw data without aggregation and the right panel shows the data aggregated within the grouping factor Worker.

bb1 <- afex_plot(mm2, "Machine", data = Machines, dv = "score")
## No id column passed. Assuming all rows are independent samples.
bb2 <- afex_plot(mm2, "Machine", id = "Worker", 
          data = Machines, dv = "score")
plot_grid(bb1, bb2)

Not Yet Supported: GLMMadaptive

Some models are unfortunately not yet supported. For example, models fit with the new and pretty cool looking GLMMadaptive package using some of the special families do not seem to produce reasonable results. The following unfortunately does not produce a reasonable plot.

library("GLMMadaptive")
data(Salamanders, package = "glmmTMB")
gm1 <- mixed_model(count~spp * mined, random = ~ 1 | site, data = Salamanders,
                   family = zi.poisson(), zi_fixed = ~ mined)

afex_plot(gm1, "spp", data = Salamanders)
afex/inst/doc/afex_mixed_example.Rmd0000644000176200001440000007451314076066650017233 0ustar liggesusers--- title: "Mixed Model Reanalysis of RT data" author: "Henrik Singmann" date: "`r Sys.Date()`" show_toc: true output: knitr:::html_vignette: toc: yes vignette: > %\VignetteIndexEntry{Mixed Model Example Analysis: Reanalysis of Freeman et al. (2010)} %\VignetteEngine{knitr::rmarkdown} %\VignetteEncoding{UTF-8} --- ```{r echo=FALSE} req_suggested_packages <- c("emmeans", "multcomp", "dplyr", "tidyr","ggplot2") pcheck <- lapply(req_suggested_packages, requireNamespace, quietly = TRUE) if (any(!unlist(pcheck))) { message("Required package(s) for this vignette are not available/installed and code will not be executed.") knitr::opts_chunk$set(eval = FALSE) } ``` ```{r set-options, echo=FALSE, cache=FALSE} op <- options(width = 90, dplyr.summarise.inform = FALSE) knitr::opts_chunk$set(dpi=72) ``` ```{r, echo=FALSE} load(system.file("extdata/", "output_mixed_vignette.rda", package = "afex")) ``` ## Overview This documents reanalysis response time data from an Experiment performed by Freeman, Heathcote, Chalmers, and Hockley (2010) using the mixed model functionality of __afex__ implemented in function `mixed` followed by post-hoc tests using package __emmeans__ (Lenth, 2017). After a brief description of the data set and research question, the code and results are presented. ## Description of Experiment and Data The data are lexical decision and word naming latencies for 300 words and 300 nonwords from 45 participants presented in Freeman et al. (2010). The 300 items in each `stimulus` condition were selected to form a balanced $2 \times 2$ design with factors neighborhood `density` (low versus high) and `frequency` (low versus high). The `task` was a between subjects factor: 25 participants worked on the lexical decision task and 20 participants on the naming task. After excluding erroneous responses each participants responded to between 135 and 150 words and between 124 and 150 nonwords. We analyzed log RTs which showed an approximately normal picture. ## Data and R Preparation We start with loading some packages we will need throughout this example. For data manipulation we will be using the `dplyr` and `tidyr` packages from the [`tidyverse`](https://www.tidyverse.org/). A thorough introduction to these packages is beyond this example, but well worth it, and can be found in ['R for Data Science'](https://r4ds.had.co.nz/) by Wickham and Grolemund. For plotting we will be using `ggplot2`, also part of the `tidyverse`. After loading the packages, we will load the data (which comes with `afex`), remove the errors, and take a look at the variables in the data. ```{r message=FALSE, warning=FALSE} library("afex") # needed for mixed() and attaches lme4 automatically. library("emmeans") # emmeans is needed for follow-up tests library("multcomp") # for advanced control for multiple testing/Type 1 errors. library("dplyr") # for working with data frames library("tidyr") # for transforming data frames from wide to long and the other way round. library("ggplot2") # for plots theme_set(theme_bw(base_size = 15) + theme(legend.position="bottom", panel.grid.major.x = element_blank())) data("fhch2010") # load fhch <- droplevels(fhch2010[ fhch2010$correct,]) # remove errors str(fhch2010) # structure of the data ``` To make sure our expectations about the data match the data we use some `dplyr` magic to confirm the number of participants per condition and items per participant. ```{r} ## are all participants in only one task? fhch %>% group_by(id) %>% summarise(task = n_distinct(task)) %>% as.data.frame() %>% {.$task == 1} %>% all() ## participants per condition: fhch %>% group_by(id) %>% summarise(task = first(task)) %>% ungroup() %>% group_by(task) %>% summarise(n = n()) ## number of different items per participant: fhch %>% group_by(id, stimulus) %>% summarise(items = n_distinct(item)) %>% ungroup() %>% group_by(stimulus) %>% summarise(min = min(items), max = max(items), mean = mean(items)) ``` Before running the analysis we should make sure that our dependent variable looks roughly normal. To compare `rt` with `log_rt` within the same figure we first need to transform the data from the wide format (where both rt types occupy one column each) into the long format (in which the two rt types are combined into a single column with an additional indicator column). To do so we use `tidyr::pivot_longer`. Then we simply call `ggplot` with `geom_histogram` and `facet_wrap(vars(rt_type))` on the new `tibble`. The plot shows that `log_rt` looks clearly more normal than `rt`, although not perfectly so. An interesting exercise could be to rerun the analysis below using a transformation that provides an even better 'normalization'. ```{r, fig.width=7, fig.height=4} fhch_long <- fhch %>% pivot_longer(cols = c(rt, log_rt), names_to = "rt_type", values_to = "rt") ggplot(fhch_long, aes(rt)) + geom_histogram(bins = 100) + facet_wrap(vars(rt_type), scales = "free_x") ``` ## Descriptive Analysis The main factors in the experiment were the between-subjects factor `task` (`naming` vs. `lexdec`), and the within-subjects factors `stimulus` (`word` vs. `nonword`), `density` (`low` vs. `high`), and `frequency` (`low` vs. `high`). Before running an analysis it is a good idea to visually inspect the data to gather some expectations regarding the results. Should the statistical results dramatically disagree with the expectations this suggests some type of error along the way (e.g., model misspecification) or at least encourages a thorough check to make sure everything is correct. We first begin by plotting the data aggregated by-participant. In each plot we plot the raw data in the background. To make the individual data points visible we use `ggbeeswarm::geom_quasirandom` and `alpha = 0.5` for semi-transparency. On top of this we add a (transparent) box plot as well as the mean and standard error. ```{r, fig.width=7, fig.height=6, message=FALSE, out.width="90%"} agg_p <- fhch %>% group_by(id, task, stimulus, density, frequency) %>% summarise(mean = mean(log_rt)) %>% ungroup() ggplot(agg_p, aes(x = interaction(density,frequency), y = mean)) + ggbeeswarm::geom_quasirandom(alpha = 0.5) + geom_boxplot(fill = "transparent") + stat_summary(colour = "red") + facet_grid(cols = vars(task), rows = vars(stimulus)) ``` Now we plot the same data but aggregated across items: ```{r, fig.width=7, fig.height=6, message=FALSE, out.width="90%"} agg_i <- fhch %>% group_by(item, task, stimulus, density, frequency) %>% summarise(mean = mean(log_rt)) %>% ungroup() ggplot(agg_i, aes(x = interaction(density,frequency), y = mean)) + ggbeeswarm::geom_quasirandom(alpha = 0.3) + geom_boxplot(fill = "transparent") + stat_summary(colour = "red") + facet_grid(cols = vars(task), rows = vars(stimulus)) ``` These two plots show a very similar pattern and suggest several things: * Responses to `nonwords` appear slower than responses to `words`, at least for the `naming` task. * `lexdec` responses appear to be slower than `naming` responses, particularly in the `word` condition. * In the `nonword` and `naming` condition we see a clear effect of `frequency` with slower responses to `high` than `low` `frequency` words. * In the `word` conditions the `frequency` pattern appears to be in the opposite direction to the pattern described in the previous point: faster responses to `low` `frequency` than to `high` `frequency` words. * `density` appears to have no effect, perhaps with the exception of the `nonword` `lexdec` condition. ## Model Setup To set up a mixed model it is important to identify which factors vary within which grouping factor generating random variability (i.e., grouping factors are sources of stochastic variability). The two grouping factors are participants (`id`) and items (`item`). The within-participant factors are `stimulus`, `density`, and `frequency`. The within-item factor is `task`. The 'maximal model' (Barr, Levy, Scheepers, and Tily, 2013) therefore is the model with by-participant random slopes for `stimulus`, `density`, and `frequency` and their interactions and by-item random slopes for `task`. It is rather common that a maximal model with a complicated random effect structure, such as the present one, does not converge successfully. The best indicator of this is a "singular fit" warning. A model with a singular fit warning should not be reported or used. Instead, one should make sure that qualitatively the same results are also observed with a model without singular fit warnings. If the maximal model that does not converge and a reduced model without a singular fit warning (i.e., the final model) diverge in their results, results should only be interpreted cautiously. In case of a singular fit or another indicator of a convergence problem, the usual first step is removing the correlations among the random terms. In our example, there are two sets of correlations, one for each random effect grouping variable. Consequently, we can build four model that have the maximal structure in terms of random-slopes and only differ in which correlations among random terms are calculated: 1. With all correlations. 2. No correlation among by-item random effects (i.e., no correlation between random intercept and `task` random slope). 3. No correlation among by-participant random effect terms (i.e., no correlation among random slopes themselves and between the random slopes and the random intercept). 4. No correlation among either random grouping factor. The next decision to be made is which method to use for obtaining $p$-values. The best control against anti-conservative results is provided by `method = "KR"` (=Kenward-Roger). However, `KR` needs quite a lot of RAM, especially with complicated random effect structures and large data sets. In this case we have both, relatively large data (i.e., many levels on each random effect, especially the item random effect) and a complicated random effect structure. Consequently, it seems a reasonable decision to choose another method. The second 'best' method (in terms of controlling for Type I errors) is the 'Satterthwaite' approximation, `method = 'S'`. It provides a similar control of Type I errors as the Kenward-Roger approximation and needs less RAM. The Satterthwaite method is currently also the default method for calculating $p$-values so does not need to be set explicitly. ## Finding the Final Model The following code fits the four models using the Satterthwaite method. To suppress random effects we use the `||` notation. Note that it is necessary to set `expand_re = TRUE` when suppressing random effects among variables that are entered as factors and not as numerical variables (all independent variables in the present case are factors). Also note that `mixed` automatically uses appropriate contrast coding if factors are included in interactions (`contr.sum`) in contrast to the `R` default (which is `contr.treatment`). To make sure the estimation does not end prematurely we set the allowed number of function evaluations to a very high value (using `lmerControl`). However, because fitting the models in R might take quite a while, you should also be able to load the fitted binary files them from [this url](https://raw.githubusercontent.com/singmann/afex/master/development/freeman_models.rda) and then load them in R with `load("freeman_models.rda")`. ```{r, eval = FALSE} m1s <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus*density*frequency|id)+ (task|item), fhch, control = lmerControl(optCtrl = list(maxfun = 1e6))) ``` ```{r, echo=FALSE} message("boundary (singular) fit: see ?isSingular") ``` ```{r, eval = FALSE} m2s <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus*density*frequency|id)+ (task||item), fhch, control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ``` ```{r, echo=FALSE} message("boundary (singular) fit: see ?isSingular") ``` ```{r, eval = FALSE} m3s <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus*density*frequency||id)+ (task|item), fhch, control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ``` ```{r, echo=FALSE} message("boundary (singular) fit: see ?isSingular") ``` ```{r, eval = FALSE} m4s <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus*density*frequency||id)+ (task||item), fhch, control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ``` ```{r, echo=FALSE} message("boundary (singular) fit: see ?isSingular") ``` We can see that fitting each of these models emits the "singular fit" message (it is technically a `message` and not a `warning`) indicating that the model is over-parameterized and did not converge successfully. In particular, this message indicates that the model is specified with more random effect parameters than can be estimated given the current data. It is instructive to see that even with a comparatively large number of observations, 12960, a set of seven random slopes for the by-participant term and one random slope for the by-item term cannot be estimated successfully. And this holds even after removing all correlations. Thus, it should not be surprising that similar sized models regularly do not converge with smaller numbers of observations. Furthermore, we are here in the fortunate situation that each factor has only two levels. A factor with more levels corresponds to more parameters of the random effect terms. Before deciding what to do next, we take a look at the estimated random effect estimates. We do so for the model without any correlations. Note that for `afex` models we usually do not want to use the `summary` method as it prints the results on the level of the model coefficients and not model terms. But for the random effects we have to do so. However, we are only interested in the random effect terms so we only print those using `summary(model)$varcor`. ```{r, eval=FALSE} summary(m4s)$varcor ``` ```{r, echo=FALSE} cat(outp_m4s_vc$output, sep = "\n") ``` The output shows that the estimated SDs of the random slopes of the two-way interactions are all zero. However, because we cannot remove the random slopes for the two way interaction while retaining the three-way interaction, we start by removing the three-way interaction first. ```{r, eval=FALSE} m5s <- mixed(log_rt ~ task*stimulus*density*frequency + ((stimulus+density+frequency)^2||id)+ (task||item), fhch, control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ``` ```{r, echo=FALSE} message("boundary (singular) fit: see ?isSingular") ``` ```{r, eval=FALSE} summary(m5s)$varcor ``` ```{r, echo=FALSE} cat(outp_m5s_vc$output, sep = "\n") ``` Not too surprisingly, this model also produces a singular fit. Inspection of the estimates shows that the two-way interaction of the slopes are still estimated to be zero. So we remove those in the next step. ```{r, eval=FALSE} m6s <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus+density+frequency||id)+ (task||item), fhch, control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ``` ```{r, echo=FALSE} message("boundary (singular) fit: see ?isSingular") ``` This model still shows a singular fit warning. The random effect estimates below show a potential culprit. ```{r, eval=FALSE} summary(m6s)$varcor ``` ```{r, echo=FALSE} cat(outp_m6s_vc$output, sep = "\n") ``` As in `m4s` above, the random effect SD for the density term is estimated to be zero. Thus, we remove this as well in the next step. ```{r, eval=FALSE} m7s <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus+frequency||id)+ (task||item), fhch, control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ``` This model finally does not emit a singular fit warning. Is this our final model? Before deciding on this, we see whether we can add the correlation terms again without running into any problems. We begin by adding the correlation to the by-participant term. ```{r, eval=FALSE} m8s <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus+frequency|id)+ (task||item), fhch, control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ``` ```{r, echo=FALSE} warning(fit_m8s$warnings, call. = FALSE) ``` This model does not show a singular fit message but emits another warning. Specifically, a warning that the absolute maximal gradient at the final solution is too high. This warning is not necessarily critical (i.e., it can be a false positive), but can also indicate serious problems. Consequently, we try adding the correlation between the by-item random terms instead: ```{r, eval=FALSE} m9s <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus+frequency||id)+ (task|item), fhch, control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) ``` This model also does not show any warnings. Thus, we have arrived at the end of the model selection process. ## Results of Maximal and Final Model We now have the following two relevant models. - `m1s`: The maximal random effect structure justified by the design (i.e., the maximal model) - `m9s`: The final model Robust results are those that hold regardless across maximal and final (i.e., reduced) model. Therefore, let us compare the pattern of significant and non-significant effects. ```{r, eval=FALSE} left_join(nice(m1s), nice(m9s), by = "Effect", suffix = c("_full", "_final")) ``` ```{r, echo=FALSE} cat(outp_comb_anova$output, sep = "\n") ``` What this shows is that the pattern of significant and non-significant effect is the same for both models. The only significant effect for which the evidence is not that strong is the 3-way interaction between `stimulus:density:frequency`. It is only just below .05 for the full model and has a somewhat lower value for the final model. We can also see that one of the most noticeable differences between the maximal and the final model is the number of denominator degrees of freedom. This is highly influenced by the random effect structure and thus considerable larger in the final (i.e., reduced) model. The difference in the other statistics is lower. ## LRT Results It is instructive to compare those results with results obtained using the comparatively 'worst' method for obtaining $p$-values implemented in `afex::mixed`, likelihood ratio tests. Likelihood ratio-tests should in principle deliver reasonable results for large data sets. A common rule of thumb is that the number of levels for each random effect grouping factor needs to be large, say above 50. Here, we have a very large number of items (600), but not that many participants (45). Thus, qualitative results should be the very similar, but it still is interesting to see exactly what happens. We therefore fit the final model using `method='LRT'`. ```{r, eval = FALSE} m9lrt <- mixed(log_rt ~ task*stimulus*density*frequency + (stimulus+frequency||id)+ (task|item), fhch, method = "LRT", control = lmerControl(optCtrl = list(maxfun = 1e6)), expand_re = TRUE) m9lrt ``` ```{r, echo=FALSE} cat(outp_m9lrt$output, sep = "\n") ``` The results in this case match the results of the Satterthwaite method. With lower numbers of levels of the grouping factor (e.g., less participants) this would not necessarily be expected. ## Summary of Results Fortunately, the results from all models converged on the same pattern of significant and non-significant effects providing a high degree of confidence in the results. This might not be too surprising given the comparatively large number of total data points and the fact that each random effect grouping factor has a considerable number of levels (above 30 for both participants and items). In the following we focus on the final model using the Satterthwaite method, `m9s`. In terms of the significant findings, there are many that seem to be in line with the descriptive results described above. For example, the highly significant effect of `task:stimulus:frequency` with $F(1, 578.91) = 124.16$, $p < .001$, appears to be in line with the observation that the frequency effect appears to change its sign depending on the `task:stimulus` cell (with `nonword` and `naming` showing the opposite patterns than the other three conditions). Consequently, we start by investigating this interaction further below. ## Follow-Up Analyses Before investigating the significant interaction in detail it is a good idea to remind oneself what a significant interaction represents on a conceptual level; that one or multiple of the variables in the interaction moderate (i.e., affect) the effect of the other variable or variables. Consequently, there are several ways to investigate a significant interaction. Each of the involved variables can be seen as the moderating variables and each of the variables can be seen as the effect of interest. Which one of those possible interpretations is of interest in a given situation highly depends on the actual data and research question and multiple views can be 'correct' in a given situation. In addition to this conceptual issue, there are also multiple technical ways to investigate a significant interaction. One approach not followed here is to split the data into subsets according to the moderating variables and compute the statistical model again for the subsets with the effect variable(s) as remaining fixed effect. This approach, also called _simple effects_ analysis, is, for example, recommended by Maxwell and Delaney (2004) as it does not assume variance homogeneity and is faithful to the data at each level. The approach taken here is to simply perform the test on the estimated final model. This approach assumes variance homogeneity (i.e., that the variances in all groups are homogeneous) and has the added benefit that it is computationally relatively simple. In addition, it can all be achieved using the framework provided by [`emmeans`](https://cran.r-project.org/package=emmeans) (Lenth, 2017). ### task:stimulus:frequency Interaction Our interest in the beginning is on the effect of `frequency` by `task:stimulus` combination. So let us first look at the estimated marginal means of this effect. In `emmeans` parlance these estimated means are called 'least-square means' because of historical reasons, but because of the lack of least-square estimation in mixed models we prefer the term estimated marginal means, or EMMs for short. Those can be obtained in the following way. To prevent `emmeans` from calculating the *df* for the EMMs (which can be quite costly), we use asymptotic *df*s (i.e., $z$ values and tests). `emmeans` requires to first specify the variable(s) one wants to treat as the effect variable(s) (here `frequency`) and then allows to specify condition variables. ```{r, eval=FALSE} emm_options(lmer.df = "asymptotic") # also possible: 'satterthwaite', 'kenward-roger' emm_i1 <- emmeans(m9s, "frequency", by = c("stimulus", "task")) emm_i1 ``` ```{r, echo=FALSE} message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_o1$output, sep = "\n") ``` The returned values are in line with our observation that the `nonword` and `naming` condition diverges from the other three. But is there actual evidence that the effect flips? We can test this using additional `emmeans` functionality. Specifically, we first use the `pairs` function which provides us with a pairwise test of the effect of `frequency` in each `task:stimulus` combination. Then we need to combine the four tests within one object to obtain a family-wise error rate correction which we do via `update(..., by = NULL)` (i.e., we revert the effect of the `by` statement from the earlier `emmeans` call) and finally we select the `holm` method for controlling for family wise error rate (the Holm method is uniformly more powerful than the Bonferroni). ```{r, eval=FALSE} update(pairs(emm_i1), by = NULL, adjust = "holm") ``` ```{r, echo=FALSE} message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_o2$output, sep = "\n") ``` We could also use a slightly more powerful method than the Holm method, method `free` from package `multcomp`. This method takes the correlation of the model parameters into account. However, results do not differ much here: ```{r, eval=FALSE} summary(as.glht(update(pairs(emm_i1), by = NULL)), test = adjusted("free")) ``` ```{r, echo=FALSE} cat(emm_o3$output, sep = "\n") ``` We see that the results are exactly as expected. In the `nonword` and `naming` condition we have a clear negative effect of frequency while in the other three conditions it is clearly positive. We could now also use `emmeans` and re-transform the estimates back onto the original RT response scale. For this, we can again `update` the `emmeans` object by using `tran = "log"` to specify the transformation and then indicating we want the means on the response scale with `type = "response"`. These values might be used for plotting. ```{r, eval=FALSE} emm_i1b <- update(emm_i1, tran = "log", type = "response", by = NULL) emm_i1b ``` ```{r, echo=FALSE} cat(emm_o4$output, sep = "\n") ``` A more direct approach for plotting the interaction is via `afex_plot`. For a plot that is not too busy it makes sense to specify across which grouping factor the individual level data should be aggregated. We use the participant variable `"id"` here. We also use `ggbeeswarm::geom_quasirandom` as the geom for the data in the background following the example in [the `afex_plot` vignette](afex_plot_introduction.html). ```{r, eval=FALSE} afex_plot(m9s, "frequency", "stimulus", "task", id = "id", data_geom = ggbeeswarm::geom_quasirandom, data_arg = list( dodge.width = 0.5, ## needs to be same as dodge cex = 0.8, color = "darkgrey")) ``` ```{r, echo=FALSE, fig.width=5, fig.height=4, out.width="90%"} p1 ``` ### task:stimulus:density:frequency Interaction As the last example, let us take a look at the significant four-way interaction of `task:stimulus:density:frequency`, $F(1, 578.77) = 11.72$, $p < .001$. Here we might be interested in a slightly more difficult question namely whether the `density:frequency` interaction varies across `task:stimulus` conditions. If we again look at the figures above, it appears that there is a difference between `low:low` and `high:low` in the `nonword` and `lexdec` condition, but not in the other conditions. Looking at the 2-way interaction of `density:frequency` by the `task:stimulus` interaction can be done using `emmeans` using the `joint_test` function. We simply need to specify the appropriate `by` variables and get conditional tests this way. ```{r, eval=FALSE} joint_tests(m9s, by = c("stimulus", "task")) ``` ```{r, echo=FALSE} cat(emm_o5$output, sep = "\n") ``` This test indeed shows that the `density:frequency` interaction is only significant in the `nonword` and `lexdec` condition. Next, let's see if we can unpack this interaction in a meaningful manner. For this we compare `low:low` and `high:low` in each of the four groups. And just for the sake of making the example more complex, we also compare `low:high` and `high:high`. To do so, we first need to setup a new set of EMMs. Specifically, we get the EMMs of the two variables of interest, density and frequency, using the same `by` specification as the `joint_test` call. We can then setup custom contrasts that tests our hypotheses. ```{r, eval=FALSE} emm_i2 <- emmeans(m2s, c("density", "frequency"), by = c("stimulus", "task")) emm_i2 ``` ```{r, echo=FALSE} cat(emm_o6$output, sep = "\n") ``` These contrasts can be specified via a list of custom contrasts on the EMMs (or reference grid in `emmeans` parlance) which can be passed to the `contrast` function. The contrasts are a `list` where each element should sum to one (i.e., be a proper contrast) and be of length equal to the number of EMMs (although we have 16 EMMs in total, we only need to specify it for a length of four due to conditioning by `c("stimulus", "task")`). To control for the family wise error rate across all tests, we again use `update(..., by = NULL)` on the result to revert the effect of the conditioning. ```{r, eval=FALSE} # desired contrats: des_c <- list( ll_hl = c(1, -1, 0, 0), lh_hh = c(0, 0, 1, -1) ) update(contrast(emm_i2, des_c), by = NULL, adjust = "holm") ``` ```{r, echo=FALSE} cat(emm_o7$output, sep = "\n") ``` In contrast to our expectation, the results show two significant effects and not only one. In line with our expectations, in the `nonword` and `lexdec` condition the EMM of `low:low` is smaller than the EMM for `high:low`, $z = -5.63$, $p < .0001$. However, in the `nonword` and `naming` condition we found the opposite pattern; the EMM of `low:low` is larger than the EMM for `high:low`, $z = 3.53$, $p = .003$. For all other effects $|z| < 1.4$, $p > .98$. In addition, there is no difference between `low:high` and `high:high` in any condition. ## References * Barr, D. J., Levy, R., Scheepers, C., & Tily, H. J. (2013). Random effects structure for confirmatory hypothesis testing: Keep it maximal. _Journal of Memory and Language_, 68(3), 255-278. https://doi.org/10.1016/j.jml.2012.11.001 * Bretz, F., Hothorn, T., & Westfall, P. H. (2011). _Multiple comparisons using R_. Boca Raton, FL: CRC Press. https://CRAN.R-project.org/package=multcomp * Freeman, E., Heathcote, A., Chalmers, K., & Hockley, W. (2010). Item effects in recognition memory for words. _Journal of Memory and Language_, 62(1), 1-18. https://doi.org/10.1016/j.jml.2009.09.004 * Lenth, R. (2017). _emmeans: Estimated Marginal Means, aka Least-Squares Means_. R package version 0.9.1. https://CRAN.R-project.org/package=emmeans * Maxwell, S. E., & Delaney, H. D. (2004). _Designing experiments and analyzing data: a model-comparisons perspective_. Mahwah, N.J.: Lawrence Erlbaum Associates. ```{r, include=FALSE} options(op) ``` afex/inst/doc/afex_analysing_accuracy_data.R0000644000176200001440000004766014076067147020726 0ustar liggesusers## ----echo=FALSE--------------------------------------------------------------- req_suggested_packages <- c("emmeans", "dplyr", "ggplot2", "cowplot", "ggbeeswarm") pcheck <- lapply(req_suggested_packages, requireNamespace, quietly = TRUE) if (any(!unlist(pcheck))) { message("Required package(s) for this vignette are not available/installed and code will not be executed.") knitr::opts_chunk$set(eval = FALSE) } ## ---- include = FALSE------------------------------------------------------------------- op <- options(width = 90, dplyr.summarise.inform = FALSE) knitr::opts_chunk$set( collapse = TRUE ) ## ----setup, message=FALSE, results='hide', warning=FALSE-------------------------------- library("afex") library("emmeans") library("dplyr") library("ggplot2") theme_set(theme_bw(base_size = 15) + theme(legend.position="bottom", panel.grid.major.x = element_blank())) library("cowplot") library("ggbeeswarm") ## --------------------------------------------------------------------------------------- data("stroop") ## extract data from experiment 1 and remove NAs stroop_e1 <- stroop %>% filter(!is.na(acc)) %>% filter(study == "1") %>% droplevels() ## --------------------------------------------------------------------------------------- head(stroop_e1) str(stroop_e1) ## --------------------------------------------------------------------------------------- e1_anova <- aov_ez( id = "pno", dv = "acc", data = stroop_e1, within = c("congruency", "condition") ) ## --------------------------------------------------------------------------------------- e1_anova ## --------------------------------------------------------------------------------------- emmeans(e1_anova, "congruency") ## --------------------------------------------------------------------------------------- emmeans(e1_anova, "condition") ## ---- fig.width=6, fig.height=3--------------------------------------------------------- plot_grid( afex_plot(e1_anova, "congruency", error = "within", data_geom = geom_quasirandom, data_alpha = 0.3) + coord_cartesian(ylim = c(0.25, 1)), afex_plot(e1_anova, "condition", error = "within", data_geom = geom_quasirandom, data_alpha = 0.3) + coord_cartesian(ylim = c(0.25, 1)) ) ## ---- echo=FALSE------------------------------------------------------------------------ load(system.file("extdata/", "outputs_glmm_vignette.rda", package = "afex")) ## ---- eval=FALSE, warning=FALSE--------------------------------------------------------- # e1_mixed1_v1 <- mixed( # acc ~ congruency*condition + (congruency*condition|pno), # data = stroop_e1, # method = "LRT", # family = binomial # ) ## --------------------------------------------------------------------------------------- stroop_e1_agg <- stroop_e1 %>% group_by(condition, congruency, pno) %>% summarise(acc = mean(acc), n = n()) ## ---- eval = FALSE---------------------------------------------------------------------- # e1_mixed1_v2 <- mixed( # acc ~ congruency*condition + (congruency*condition|pno), # data = stroop_e1_agg, # method = "LRT", # family = binomial, # weight = n # ) ## ---- echo=FALSE------------------------------------------------------------------------ xxx <- lapply(outp_e1_mixed1_v1$warnings, function(x) warning(x, call. = FALSE)) ## ---- echo=FALSE------------------------------------------------------------------------ xxx <- lapply(outp_e1_mixed1_v2$warnings, function(x) warning(x, call. = FALSE)) ## ---- eval = FALSE---------------------------------------------------------------------- # e1_mixed1_v2_allfit <- mixed( # acc ~ congruency*condition + (congruency*condition|pno), # data = stroop_e1_agg, # method = "LRT", # family = binomial, # weight = n, # all_fit = TRUE # ) # ## ---- echo=FALSE------------------------------------------------------------------------ xxx <- lapply(outp_e1_mixed1_v2_allfit$warnings, function(x) warning(x, call. = FALSE)) ## ---- eval=FALSE------------------------------------------------------------------------ # e1_mixed1_v1 ## variant 1 ## ---- echo=FALSE------------------------------------------------------------------------ cat(outp_e1_mixed1_v1$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # e1_mixed1_v2 ## variant 2 ## ---- echo=FALSE------------------------------------------------------------------------ cat(outp_e1_mixed1_v2$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # e1_mixed1_v2_allfit ## variant 2 with all_fit = TRUE ## ---- echo=FALSE------------------------------------------------------------------------ cat(outp_e1_mixed1_v2_allfit$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # emmeans(e1_mixed1_v2_allfit, "congruency", type = "response") ## ---- echo=FALSE------------------------------------------------------------------------ message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_2a_cong_out$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # emmeans(e1_mixed1_v2_allfit, "condition", type = "response") ## ---- echo=FALSE------------------------------------------------------------------------ message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_2a_cond_out$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # plot_grid( # afex_plot(e1_mixed1_v2_allfit, "congruency", # data_geom = geom_quasirandom, data_alpha = 0.3) + # coord_cartesian(ylim = c(0.25, 1)), # afex_plot(e1_mixed1_v2_allfit, "condition", # data_geom = geom_quasirandom, data_alpha = 0.3) + # coord_cartesian(ylim = c(0.25, 1)) # ) ## ---- echo=FALSE, fig.width=6, fig.height=3--------------------------------------------- message("Aggregating data over: pno") message("NOTE: Results may be misleading due to involvement in interactions") message("Aggregating data over: pno") message("NOTE: Results may be misleading due to involvement in interactions") plot_grid(pp2a_main_a, pp2a_main_b) ## ---- eval=FALSE------------------------------------------------------------------------ # emmeans(e1_mixed1_v2_allfit, c("congruency", "condition"), type = "response") ## ---- echo=FALSE------------------------------------------------------------------------ cat(emm_2a_inter1_out$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # emm_inter_1 <- emmeans(e1_mixed1_v2_allfit, "congruency", # by = "condition", type = "response") # emm_inter_1 ## ---- echo=FALSE------------------------------------------------------------------------ cat(emm_2a_inter2_out$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # pairs(emm_inter_1) ## ---- echo=FALSE------------------------------------------------------------------------ cat(emm_2a_pairs$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # afex_plot(e1_mixed1_v2_allfit, "condition", "congruency", # data_geom = geom_violin) ## ---- echo=FALSE, fig.width=4.5, fig.height=3.5----------------------------------------- message("Aggregating data over: pno") pp2a_inter ## ---- eval=FALSE------------------------------------------------------------------------ # afex_plot(e1_mixed1_v1, "condition", "congruency", # data_geom = geom_violin) ## ---- echo=FALSE, fig.width=4.5, fig.height=3.5----------------------------------------- message("Aggregating data over: pno") pp2a_inter_v1 ## ---- eval=FALSE, include=FALSE--------------------------------------------------------- # save(e1_mixed1_v1, e1_mixed1_v2, e1_mixed1_v2_allfit, # e12_mixed1_t2, e12_mixed1, e12_mixed1_t2_red, # file = "development/stroop_mixed.rda", compress = "xz") # ## load("development/stroop_mixed.rda") ## ---- eval=FALSE, include=FALSE--------------------------------------------------------- # stroop_e1_agg <- stroop_e1 %>% # group_by(condition, congruency, pno) %>% # summarise(acc = mean(acc), # n = n()) # capture_call <- function(call) { # warnings <- testthat::capture_warnings(eval(substitute(call))) # output <- suppressWarnings(capture.output(eval(substitute(call)))) # messages <- testthat::capture_messages(substitute(call)) # list( # output = output, # warnings = warnings, # messages = messages # ) # } # outp_e1_mixed1_v1 <- capture_call(print(e1_mixed1_v1)) # outp_e1_mixed1_v2 <- capture_call(print(e1_mixed1_v2)) # outp_e1_mixed1_v2_allfit <- capture_call(print(e1_mixed1_v2_allfit)) # # emm_2a_cong <- emmeans(e1_mixed1_v2_allfit, "congruency", type = "response") # emm_2a_cond <- emmeans(e1_mixed1_v2_allfit, "condition", type = "response") # # emm_2a_inter1 <- emmeans(e1_mixed1_v2_allfit, c("congruency", "condition"), # type = "response") # emm_2a_inter2 <- emmeans(e1_mixed1_v2_allfit, "congruency", # by = "condition", type = "response") # # emm_2a_inter1_out <- capture_call(print(emm_2a_inter1)) # emm_2a_inter2_out <- capture_call(print(emm_2a_inter2)) # # # emm_2a_cong_out <- capture_call(print(emm_2a_cong)) # emm_2a_cond_out <- capture_call(print(emm_2a_cond)) # # emm_inter_1 <- emmeans(e1_mixed1_v2_allfit, "congruency", # by = "condition", type = "response") # emm_2a_pairs <- capture_call(print(pairs(emm_inter_1))) # # # pp2a_main <- plot_grid( # # afex_plot(e1_mixed1_v2_allfit, "congruency", error = "within", # # data_geom = geom_quasirandom, data_alpha = 0.3) + # # coord_cartesian(ylim = c(0.25, 1)), # # afex_plot(e1_mixed1_v2_allfit, "condition", error = "within", # # data_geom = geom_quasirandom, data_alpha = 0.3) + # # coord_cartesian(ylim = c(0.25, 1)) # # ) # pp2a_main_a <- afex_plot(e1_mixed1_v2_allfit, "congruency", error = "within", # data_geom = geom_quasirandom, data_alpha = 0.3) + # coord_cartesian(ylim = c(0.25, 1)) # pp2a_main_b <- afex_plot(e1_mixed1_v2_allfit, "condition", error = "within", # data_geom = geom_quasirandom, data_alpha = 0.3) + # coord_cartesian(ylim = c(0.25, 1)) # # pp2a_inter <- afex_plot(e1_mixed1_v2_allfit, "condition", "congruency", # data_geom = geom_violin) # # pp2a_inter_v1 <- afex_plot(e1_mixed1_v1, "condition", "congruency", # data_geom = geom_violin) # # ### experiments 1 and 2 # # outp_e12_mixed1 <- capture_call(print(e12_mixed1)) # outp_e12_mixed1_t2 <- capture_call(print(e12_mixed1_t2)) # # outp_e12_mixed1_t2_red <- capture_call(print(e12_mixed1_t2_red)) # # emm_e12_inter_out <- capture_call(print(emmeans(e12_mixed1, # c("congruency", "condition"), # type = "response"))) # # emm_e12_t2_inter_out <- capture_call(print(emmeans(e12_mixed1_t2, # c("congruency", "condition"), # type = "response"))) # # emm_e12_t2_red_inter_out <- capture_call(print(emmeans(e12_mixed1_t2_red, # c("congruency", "condition"), # type = "response"))) # # emm_e12_t2_red_pairs_out <- capture_call(print(pairs( # emmeans(e12_mixed1_t2_red, "congruency", # by = "condition", # type = "response")))) # # emm_e12_t2_pairs_out <- capture_call(print(pairs( # emmeans(e12_mixed1_t2, "congruency", # by = "condition", type = "response")))) # # emm_e12_t2_pairs_p_out <- capture_call(print(pairs(emmeans(e12_mixed1_t2, "congruency", by = "condition", type = "response", # submodel = "minimal")))) # # pp_e12_inter_t3 <- afex_plot(e12_mixed1, "condition", "congruency", # data_geom = geom_violin) # pp_e12_inter_t2 <- afex_plot(e12_mixed1_t2, "condition", "congruency", # data_geom = geom_violin) # pp_e12_inter_t2_red <- afex_plot(e12_mixed1_t2_red, "condition", "congruency", # data_geom = geom_violin) # # save(outp_e1_mixed1_v1, outp_e1_mixed1_v2, # outp_e1_mixed1_v2_allfit, # emm_2a_cong_out, emm_2a_cond_out, # pp2a_main_a, pp2a_main_b, # emm_2a_inter1_out, emm_2a_inter2_out, # emm_2a_pairs, # pp2a_inter, pp2a_inter_v1, # # outp_e12_mixed1, outp_e12_mixed1_t2, # outp_e12_mixed1_t2_red, # emm_e12_inter_out, emm_e12_t2_inter_out, # emm_e12_t2_red_inter_out, # emm_e12_t2_red_pairs_out, # emm_e12_t2_pairs_out, # emm_e12_t2_pairs_p_out, # pp_e12_inter_t3, pp_e12_inter_t2, # pp_e12_inter_t2_red, # # file = "inst/extdata/outputs_glmm_vignette.rda", # compress = "xz") # ## --------------------------------------------------------------------------------------- ## extract data from experiment 1 and remove NAs stroop_e12 <- stroop %>% filter(!is.na(acc)) %>% filter(study %in% c("1", "2")) %>% droplevels() ## --------------------------------------------------------------------------------------- stroop_e12 %>% group_by(study) %>% summarise(n = length(unique(pno))) ## --------------------------------------------------------------------------------------- stroop_e12_agg <- stroop_e12 %>% group_by(study, condition, congruency, pno) %>% summarise(acc = mean(acc), n = n()) ## ---- eval = FALSE---------------------------------------------------------------------- # library("parallel") # nc <- detectCores() # number of cores # cl <- makeCluster(rep("localhost", nc)) # make cluster ## ---- eval = FALSE---------------------------------------------------------------------- # e12_mixed1 <- mixed( # acc ~ congruency*condition*study + (congruency*condition|pno), # data = stroop_e12_agg, # method = "LRT", # family = binomial, # weight = n, # all_fit = TRUE, # cl = cl # ) ## ---- eval = FALSE---------------------------------------------------------------------- # e12_mixed1_t2 <- mixed( # acc ~ congruency*condition*study + (congruency*condition|pno), # data = stroop_e12_agg, # method = "LRT", # family = binomial, # weight = n, # all_fit = TRUE, # cl = cl, # type = 2 # ) ## ---- eval=FALSE------------------------------------------------------------------------ # e12_mixed1 ## ---- echo=FALSE------------------------------------------------------------------------ cat(outp_e12_mixed1$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # e12_mixed1_t2 ## ---- echo=FALSE------------------------------------------------------------------------ cat(outp_e12_mixed1_t2$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # afex_plot(e12_mixed1, "condition", "congruency", # data_geom = geom_violin) ## ---- echo=FALSE, fig.width=4.5, fig.height=3.5----------------------------------------- message("Aggregating data over: pno") message("NOTE: Results may be misleading due to involvement in interactions") pp_e12_inter_t3 ## ---- eval=FALSE------------------------------------------------------------------------ # afex_plot(e12_mixed1_t2, "condition", "congruency", # data_geom = geom_violin) ## ---- echo=FALSE, fig.width=4.5, fig.height=3.5----------------------------------------- message("Aggregating data over: pno") message("emmeans are based on full model which includes all effects.") message("NOTE: Results may be misleading due to involvement in interactions") pp_e12_inter_t2 ## ---- eval=FALSE------------------------------------------------------------------------ # emmeans(e12_mixed1, c("congruency", "condition"), type = "response") ## ---- echo=FALSE------------------------------------------------------------------------ message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_e12_inter_out$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # emmeans(e12_mixed1_t2, c("congruency", "condition"), type = "response") ## ---- echo=FALSE------------------------------------------------------------------------ message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_e12_t2_inter_out$output, sep = "\n") ## ---- eval = FALSE---------------------------------------------------------------------- # e12_mixed1_t2_red <- mixed( # acc ~ (congruency+condition+study)^2 + (congruency*condition|pno), # data = stroop_e12_agg, # method = "LRT", # family = binomial, # weight = n, # all_fit = TRUE, # cl = cl, # type = 2 # ) ## ---- eval=FALSE------------------------------------------------------------------------ # e12_mixed1_t2_red ## ---- echo=FALSE------------------------------------------------------------------------ cat(outp_e12_mixed1_t2_red$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # emmeans(e12_mixed1_t2_red, c("congruency", "condition"), type = "response") ## ---- echo=FALSE------------------------------------------------------------------------ message("emmeans are based on full model which includes all effects.") cat(emm_e12_t2_red_inter_out$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # emmeans(e12_mixed1_t2_red, "congruency", by = "condition", # type = "response") %>% # pairs() ## ---- echo=FALSE------------------------------------------------------------------------ message("emmeans are based on full model which includes all effects.") cat(emm_e12_t2_red_pairs_out$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # emmeans(e12_mixed1_t2, "congruency", by = "condition", type = "response") %>% # pairs() ## ---- echo=FALSE------------------------------------------------------------------------ message("emmeans are based on full model which includes all effects.") message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_e12_t2_pairs_out$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # emmeans(e12_mixed1_t2, "congruency", by = "condition", type = "response", # submodel = "minimal") %>% # pairs() ## ---- echo=FALSE------------------------------------------------------------------------ message("emmeans are based on full model which includes all effects.") message("NOTE: Results may be misleading due to involvement in interactions") cat(emm_e12_t2_pairs_p_out$output, sep = "\n") ## ---- eval=FALSE------------------------------------------------------------------------ # afex_plot(e12_mixed1_t2_red, "condition", "congruency", # data_geom = geom_violin) ## ---- echo=FALSE, fig.width=4.5, fig.height=3.5----------------------------------------- message("Aggregating data over: pno") message("emmeans are based on full model which includes all effects.") pp_e12_inter_t2_red ## ---- include=FALSE----------------------------------------------------------- options(op) afex/inst/doc/afex_anova_example.html0000644000176200001440000056420714076067160017454 0ustar liggesusers ANOVA and Post-Hoc Contrasts: Reanalysis of Singmann and Klauer (2011)

ANOVA and Post-Hoc Contrasts: Reanalysis of Singmann and Klauer (2011)

Henrik Singmann

2021-07-21

Overview

This documents reanalysis a dataset from an Experiment performed by Singmann and Klauer (2011) using the ANOVA functionality of afex followed by post-hoc tests using package emmeans (Lenth, 2017). After a brief description of the dataset and research question, the code and results are presented.

Description of Experiment and Data

Singmann and Klauer (2011) were interested in whether or not conditional reasoning can be explained by a single process or whether multiple processes are necessary to explain it. To provide evidence for multiple processes we aimed to establish a double dissociation of two variables: instruction type and problem type. Instruction type was manipulated between-subjects, one group of participants received deductive instructions (i.e., to treat the premises as given and only draw necessary conclusions) and a second group of participants received probabilistic instructions (i.e., to reason as in an everyday situation; we called this “inductive instruction” in the manuscript). Problem type consisted of two different orthogonally crossed variables that were manipulated within-subjects, validity of the problem (formally valid or formally invalid) and plausibility of the problem (inferences which were consisted with the background knowledge versus problems that were inconsistent with the background knowledge). The critical comparison across the two conditions was among problems which were valid and implausible with problems that were invalid and plausible. For example, the next problem was invalid and plausible:

If a person is wet, then the person fell into a swimming pool.
A person fell into a swimming pool.
How valid is the conclusion/How likely is it that the person is wet?

For those problems we predicted that under deductive instructions responses should be lower (as the conclusion does not necessarily follow from the premises) as under probabilistic instructions. For the valid but implausible problem, an example is presented next, we predicted the opposite pattern:

If a person is wet, then the person fell into a swimming pool.
A person is wet.
How valid is the conclusion/How likely is it that the person fell into a swimming pool?

Our study also included valid and plausible and invalid and implausible problems.

In contrast to the analysis reported in the manuscript, we initially do not separate the analysis into affirmation and denial problems, but first report an analysis on the full set of inferences, MP, MT, AC, and DA, where MP and MT are valid and AC and DA invalid. We report a reanalysis of our Experiment 1 only. Note that the factor plausibility is not present in the original manuscript, there it is a results of a combination of other factors.

Data and R Preperation

We begin by loading the packages we will be using throughout.

library("afex")     # needed for ANOVA functions.
library("emmeans")  # emmeans must now be loaded explicitly for follow-up tests.
library("multcomp") # for advanced control for multiple testing/Type 1 errors.
library("ggplot2")  # for customizing plots.
data(sk2011.1)
str(sk2011.1)
## 'data.frame':    640 obs. of  9 variables:
##  $ id          : Factor w/ 40 levels "8","9","10","12",..: 3 3 3 3 3 3 3 3 3 3 ...
##  $ instruction : Factor w/ 2 levels "deductive","probabilistic": 2 2 2 2 2 2 2 2 2 2 ...
##  $ plausibility: Factor w/ 2 levels "plausible","implausible": 1 2 2 1 2 1 1 2 1 2 ...
##  $ inference   : Factor w/ 4 levels "MP","MT","AC",..: 4 2 1 3 4 2 1 3 4 2 ...
##  $ validity    : Factor w/ 2 levels "valid","invalid": 2 1 1 2 2 1 1 2 2 1 ...
##  $ what        : Factor w/ 2 levels "affirmation",..: 2 2 1 1 2 2 1 1 2 2 ...
##  $ type        : Factor w/ 2 levels "original","reversed": 2 2 2 2 1 1 1 1 2 2 ...
##  $ response    : int  100 60 94 70 100 99 98 49 82 50 ...
##  $ content     : Factor w/ 4 levels "C1","C2","C3",..: 1 1 1 1 2 2 2 2 3 3 ...

An important feature in the data is that each participant provided two responses for each cell of the design (the content is different for each of those, each participant saw all four contents). These two data points will be aggregated automatically by afex.

with(sk2011.1, table(inference, id, plausibility))
## , , plausibility = plausible
## 
##          id
## inference 8 9 10 12 13 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
##        MP 2 2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2
##        MT 2 2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2
##        AC 2 2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2
##        DA 2 2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2
##          id
## inference 37 38 39 40 41 42 43 44 46 47 48 49 50
##        MP  2  2  2  2  2  2  2  2  2  2  2  2  2
##        MT  2  2  2  2  2  2  2  2  2  2  2  2  2
##        AC  2  2  2  2  2  2  2  2  2  2  2  2  2
##        DA  2  2  2  2  2  2  2  2  2  2  2  2  2
## 
## , , plausibility = implausible
## 
##          id
## inference 8 9 10 12 13 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
##        MP 2 2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2
##        MT 2 2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2
##        AC 2 2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2
##        DA 2 2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2  2
##          id
## inference 37 38 39 40 41 42 43 44 46 47 48 49 50
##        MP  2  2  2  2  2  2  2  2  2  2  2  2  2
##        MT  2  2  2  2  2  2  2  2  2  2  2  2  2
##        AC  2  2  2  2  2  2  2  2  2  2  2  2  2
##        DA  2  2  2  2  2  2  2  2  2  2  2  2  2

ANOVA

To get the full ANOVA table for the model, we simply pass it to aov_ez using the design as described above. We save the returned object for further analysis.

a1 <- aov_ez("id", "response", sk2011.1, between = "instruction", 
       within = c("inference", "plausibility"))
## Warning: More than one observation per cell, aggregating the data using mean (i.e,
## fun_aggregate = mean)!
## Contrasts set to contr.sum for the following variables: instruction
a1 # the default print method prints a data.frame produced by nice 
## Anova Table (Type 3 tests)
## 
## Response: response
##                               Effect           df     MSE         F  ges p.value
## 1                        instruction        1, 38 2027.42      0.31 .003    .583
## 2                          inference 2.66, 101.12  959.12   5.81 ** .063    .002
## 3              instruction:inference 2.66, 101.12  959.12   6.00 ** .065    .001
## 4                       plausibility        1, 38  468.82 34.23 *** .068   <.001
## 5           instruction:plausibility        1, 38  468.82  10.67 ** .022    .002
## 6             inference:plausibility  2.29, 87.11  318.91    2.87 + .009    .055
## 7 instruction:inference:plausibility  2.29, 87.11  318.91    3.98 * .013    .018
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '+' 0.1 ' ' 1
## 
## Sphericity correction method: GG

The equivalent calls (i.e., producing exactly the same output) of the other two ANOVA functions aov_car or aov4 is shown below.

aov_car(response ~ instruction + Error(id/inference*plausibility), sk2011.1)
aov_4(response ~ instruction + (inference*plausibility|id), sk2011.1)

As mentioned before, the two responses per cell of the design and participants are aggregated for the analysis as indicated by the warning message. Furthermore, the degrees of freedom are Greenhouse-Geisser corrected per default for all effects involving inference, as inference is a within-subject factor with more than two levels (i.e., MP, MT, AC, & DA). In line with our expectations, the three-way interaction is significant.

The object printed per default for afex_aov objects (produced by nice) can also be printed nicely using knitr:

knitr::kable(nice(a1))
Effect df MSE F ges p.value
instruction 1, 38 2027.42 0.31 .003 .583
inference 2.66, 101.12 959.12 5.81 ** .063 .002
instruction:inference 2.66, 101.12 959.12 6.00 ** .065 .001
plausibility 1, 38 468.82 34.23 *** .068 <.001
instruction:plausibility 1, 38 468.82 10.67 ** .022 .002
inference:plausibility 2.29, 87.11 318.91 2.87 + .009 .055
instruction:inference:plausibility 2.29, 87.11 318.91 3.98 * .013 .018

Alternatively, the anova method for afex_aov objects returns a data.frame of class anova that can be passed to, for example, xtable for nice formatting:

print(xtable::xtable(anova(a1), digits = c(rep(2, 5), 3, 4)), type = "html")
num Df den Df MSE F ges Pr(>F)
instruction 1.00 38.00 2027.42 0.31 0.003 0.5830
inference 2.66 101.12 959.12 5.81 0.063 0.0016
instruction:inference 2.66 101.12 959.12 6.00 0.065 0.0013
plausibility 1.00 38.00 468.82 34.23 0.068 0.0000
instruction:plausibility 1.00 38.00 468.82 10.67 0.022 0.0023
inference:plausibility 2.29 87.11 318.91 2.87 0.009 0.0551
instruction:inference:plausibility 2.29 87.11 318.91 3.98 0.013 0.0177

Post-Hoc Contrasts and Plotting

To further analyze the data we need to pass it to package emmeans, a package that offers great functionality for both plotting and contrasts of all kind. A lot of information on emmeans can be obtained in its vignettes and faq. emmeans can work with afex_aov objects directly as afex comes with the necessary methods for the generic functions defined in emmeans. When using the default multivariate option for follow-up tests, emmeans uses the ANOVA model estimated via base R’s lm method (which in the case of a multivariate response is an object of class c("mlm", "lm")). afex also supports a univariate model (i.e., emmeans_model = "univariate", which requires that include_aov = TRUE in the ANOVA call) in which case emmeans uses the object created by base R’s aov function (this was the previous default but is not recommended as it does not handle unbalanced data well).

Some First Contrasts

Main Effects Only

This object can now be passed to emmeans, for example to obtain the marginal means of the four inferences:

m1 <- emmeans(a1, ~ inference)
m1
##  inference emmean   SE df lower.CL upper.CL
##  MP          87.5 1.80 38     83.9     91.2
##  MT          76.7 4.06 38     68.5     84.9
##  AC          69.4 4.77 38     59.8     79.1
##  DA          83.0 3.84 38     75.2     90.7
## 
## Results are averaged over the levels of: instruction, plausibility 
## Confidence level used: 0.95

This object can now also be used to compare whether or not there are differences between the levels of the factor:

pairs(m1)
##  contrast estimate   SE df t.ratio p.value
##  MP - MT     10.83 4.33 38   2.501  0.0759
##  MP - AC     18.10 5.02 38   3.607  0.0047
##  MP - DA      4.56 4.20 38   1.086  0.7002
##  MT - AC      7.27 3.98 38   1.825  0.2778
##  MT - DA     -6.28 4.70 38  -1.334  0.5473
##  AC - DA    -13.54 5.30 38  -2.556  0.0672
## 
## Results are averaged over the levels of: instruction, plausibility 
## P value adjustment: tukey method for comparing a family of 4 estimates

To obtain more powerful p-value adjustments, we can furthermore pass it to multcomp (Bretz, Hothorn, & Westfall, 2011):

summary(as.glht(pairs(m1)), test=adjusted("free"))
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Linear Hypotheses:
##              Estimate Std. Error t value Pr(>|t|)   
## MP - MT == 0   10.831      4.331   2.501  0.05890 . 
## MP - AC == 0   18.100      5.018   3.607  0.00459 **
## MP - DA == 0    4.556      4.196   1.086  0.31350   
## MT - AC == 0    7.269      3.984   1.825  0.19408   
## MT - DA == 0   -6.275      4.703  -1.334  0.31350   
## AC - DA == 0  -13.544      5.299  -2.556  0.05890 . 
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- free method)

A Simple interaction

We could now also be interested in the marginal means of the inferences across the two instruction types. emmeans offers two ways to do so. The first splits the contrasts across levels of the factor using the by argument.

m2 <- emmeans(a1, "inference", by = "instruction")
## equal: emmeans(a1, ~ inference|instruction)
m2
## instruction = deductive:
##  inference emmean   SE df lower.CL upper.CL
##  MP          97.3 2.54 38     92.1    102.4
##  MT          70.4 5.75 38     58.8     82.0
##  AC          61.5 6.75 38     47.8     75.1
##  DA          81.8 5.43 38     70.8     92.8
## 
## instruction = probabilistic:
##  inference emmean   SE df lower.CL upper.CL
##  MP          77.7 2.54 38     72.6     82.9
##  MT          83.0 5.75 38     71.3     94.6
##  AC          77.3 6.75 38     63.7     91.0
##  DA          84.1 5.43 38     73.1     95.1
## 
## Results are averaged over the levels of: plausibility 
## Confidence level used: 0.95

Consequently, tests are also only performed within each level of the by factor:

pairs(m2)
## instruction = deductive:
##  contrast estimate   SE df t.ratio p.value
##  MP - MT     26.89 6.13 38   4.389  0.0005
##  MP - AC     35.80 7.10 38   5.045  0.0001
##  MP - DA     15.47 5.93 38   2.608  0.0599
##  MT - AC      8.91 5.63 38   1.582  0.4007
##  MT - DA    -11.41 6.65 38  -1.716  0.3297
##  AC - DA    -20.32 7.49 38  -2.712  0.0471
## 
## instruction = probabilistic:
##  contrast estimate   SE df t.ratio p.value
##  MP - MT     -5.22 6.13 38  -0.853  0.8287
##  MP - AC      0.40 7.10 38   0.056  0.9999
##  MP - DA     -6.36 5.93 38  -1.072  0.7084
##  MT - AC      5.62 5.63 38   0.998  0.7512
##  MT - DA     -1.14 6.65 38  -0.171  0.9982
##  AC - DA     -6.76 7.49 38  -0.902  0.8036
## 
## Results are averaged over the levels of: plausibility 
## P value adjustment: tukey method for comparing a family of 4 estimates

The second version considers all factor levels together. Consequently, the number of pairwise comparisons is a lot larger:

m3 <- emmeans(a1, c("inference", "instruction"))
## equal: emmeans(a1, ~inference*instruction)
m3
##  inference instruction   emmean   SE df lower.CL upper.CL
##  MP        deductive       97.3 2.54 38     92.1    102.4
##  MT        deductive       70.4 5.75 38     58.8     82.0
##  AC        deductive       61.5 6.75 38     47.8     75.1
##  DA        deductive       81.8 5.43 38     70.8     92.8
##  MP        probabilistic   77.7 2.54 38     72.6     82.9
##  MT        probabilistic   83.0 5.75 38     71.3     94.6
##  AC        probabilistic   77.3 6.75 38     63.7     91.0
##  DA        probabilistic   84.1 5.43 38     73.1     95.1
## 
## Results are averaged over the levels of: plausibility 
## Confidence level used: 0.95
pairs(m3)
##  contrast                            estimate   SE df t.ratio p.value
##  MP deductive - MT deductive            26.89 6.13 38   4.389  0.0020
##  MP deductive - AC deductive            35.80 7.10 38   5.045  0.0003
##  MP deductive - DA deductive            15.47 5.93 38   2.608  0.1848
##  MP deductive - MP probabilistic        19.55 3.59 38   5.439  0.0001
##  MP deductive - MT probabilistic        14.32 6.29 38   2.279  0.3310
##  MP deductive - AC probabilistic        19.95 7.21 38   2.767  0.1342
##  MP deductive - DA probabilistic        13.19 5.99 38   2.201  0.3741
##  MT deductive - AC deductive             8.91 5.63 38   1.582  0.7577
##  MT deductive - DA deductive           -11.41 6.65 38  -1.716  0.6772
##  MT deductive - MP probabilistic        -7.34 6.29 38  -1.167  0.9363
##  MT deductive - MT probabilistic       -12.56 8.13 38  -1.545  0.7783
##  MT deductive - AC probabilistic        -6.94 8.86 38  -0.783  0.9931
##  MT deductive - DA probabilistic       -13.70 7.91 38  -1.733  0.6666
##  AC deductive - DA deductive           -20.32 7.49 38  -2.712  0.1501
##  AC deductive - MP probabilistic       -16.25 7.21 38  -2.254  0.3446
##  AC deductive - MT probabilistic       -21.48 8.86 38  -2.423  0.2600
##  AC deductive - AC probabilistic       -15.85 9.54 38  -1.661  0.7111
##  AC deductive - DA probabilistic       -22.61 8.66 38  -2.611  0.1834
##  DA deductive - MP probabilistic         4.08 5.99 38   0.680  0.9971
##  DA deductive - MT probabilistic        -1.15 7.91 38  -0.145  1.0000
##  DA deductive - AC probabilistic         4.47 8.66 38   0.517  0.9995
##  DA deductive - DA probabilistic        -2.29 7.68 38  -0.298  1.0000
##  MP probabilistic - MT probabilistic    -5.22 6.13 38  -0.853  0.9885
##  MP probabilistic - AC probabilistic     0.40 7.10 38   0.056  1.0000
##  MP probabilistic - DA probabilistic    -6.36 5.93 38  -1.072  0.9588
##  MT probabilistic - AC probabilistic     5.62 5.63 38   0.998  0.9719
##  MT probabilistic - DA probabilistic    -1.14 6.65 38  -0.171  1.0000
##  AC probabilistic - DA probabilistic    -6.76 7.49 38  -0.902  0.9840
## 
## Results are averaged over the levels of: plausibility 
## P value adjustment: tukey method for comparing a family of 8 estimates

Running Custom Contrasts

Objects returned from emmeans can also be used to test specific contrasts. For this, we can simply create a list, where each element corresponds to one contrasts. A contrast is defined as a vector of constants on the reference grid (i.e., the object returned from emmeans, here m3). For example, we might be interested in whether there is a difference between the valid and invalid inferences in each of the two conditions.

c1 <- list(
  v_i.ded = c(0.5, 0.5, -0.5, -0.5, 0, 0, 0, 0),
  v_i.prob = c(0, 0, 0, 0, 0.5, 0.5, -0.5, -0.5)
  )

contrast(m3, c1, adjust = "holm")
##  contrast estimate   SE df t.ratio p.value
##  v_i.ded    12.194 4.12 38   2.960  0.0105
##  v_i.prob   -0.369 4.12 38  -0.090  0.9291
## 
## Results are averaged over the levels of: plausibility 
## P value adjustment: holm method for 2 tests
summary(as.glht(contrast(m3, c1)), test = adjusted("free"))
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Linear Hypotheses:
##               Estimate Std. Error t value Pr(>|t|)  
## v_i.ded == 0   12.1937     4.1190    2.96   0.0105 *
## v_i.prob == 0  -0.3687     4.1190   -0.09   0.9291  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- free method)

The results can be interpreted as in line with expectations. Responses are larger for valid than invalid problems in the deductive, but not the probabilistic condition.

Plotting

Since version 0.22, afex comes with its own plotting function based on ggplot2, afex_plot, which works directly with afex_aov objects.

As said initially, we are interested in the three-way interaction of instruction with inference, plausibility, and instruction. As we saw above, this interaction was significant. Consequently, we are interested in plotting this interaction.

Basic Plots

For afex_plot, we need to specify the x-factor(s), which determine which factor-levels or combinations of factor-levels are plotted on the x-axis. We can also define trace factor(s), which determine which factor levels are connected by lines. Finally, we can also define panel factor(s), which determine if the plot is split into subplots. afex_plot then plots the estimated marginal means obtained from emmeans, confidence intervals, and the raw data in the background. Note that the raw data in the background is per default drawn using an alpha blending of .5 (i.e., 50% semi-transparency). Thus, in case of several points lying directly on top of each other, this point appears noticeably darker.

afex_plot(a1, x = "inference", trace = "instruction", panel = "plausibility")
## Warning: Panel(s) show a mixed within-between-design.
## Error bars do not allow comparisons across all means.
## Suppress error bars with: error = "none"

In the default settings, the error bars show 95%-confidence intervals based on the standard error of the underlying model (i.e., the lm model in the present case). In the present case, in which each subplot (defined by x- and trace-factor) shows a combination of a within-subjects factor (i.e., inference) and a between-subjects (i.e., instruction) factor, this is not optimal. The error bars only allow to assess differences regarding the between-subjects factor (i.e., across the lines), but not inferences regarding the within-subjects factor (i.e., within one line). This is also indicated by a warning.

An alternative would be within-subject confidence intervals:

afex_plot(a1, x = "inference", trace = "instruction", panel = "plausibility", 
          error = "within")
## Warning: Panel(s) show a mixed within-between-design.
## Error bars do not allow comparisons across all means.
## Suppress error bars with: error = "none"

However, those only allow inferences regarding the within-subject factors and not regarding the between-subjecta factor. So the same warning is emitted again.

A further alternative is to suppress the error bars altogether. This is the approach used in our original paper and probably a good idea in general when figures show both between- and within-subjects factors within the same panel. The presence of the raw data in the background still provides a visual depiction of the variability of the data.

afex_plot(a1, x = "inference", trace = "instruction", panel = "plausibility", 
          error = "none")

Customizing Plots

afex_plot allows to customize the plot in a number of different ways. For example, we can easily change the aesthetic mapping associated with the trace factor. So instead of using lineytpe and shape of the symbols, we can use color. Furthermore, we can change the graphical element used for plotting the data points in the background. For example, instead of plotting the raw data, we can replace this with a boxplot. Finally, we can also make both the points showing the means and the lines connecting the means larger.

p1 <- afex_plot(a1, x = "inference", trace = "instruction", 
                panel = "plausibility", error = "none", 
                mapping = c("color", "fill"), 
                data_geom = geom_boxplot, data_arg = list(width = 0.4), 
                point_arg = list(size = 1.5), line_arg = list(size = 1))
p1

Note that afex_plot returns a ggplot2 plot object which can be used for further customization. For example, one can easily change the theme to something that does not have a grey background:

p1 + theme_light()

We can also set the theme globally for the remainder of the R session.

theme_set(theme_light())

The full set of customizations provided by afex_plot is beyond the scope of this vignette. The examples on the help page at ?afex_plot provide a good overview.

Replicate Analysis from Singmann and Klauer (2011)

However, the plots shown so far are not particularly helpful with respect to the research question. Next, we fit a new ANOVA model in which we separate the data in affirmation and denial inferences. This was also done in the original manuscript. We then lot the data a second time.

a2 <- aov_ez("id", "response", sk2011.1, between = "instruction", 
       within = c("validity", "plausibility", "what"))
## Warning: More than one observation per cell, aggregating the data using mean (i.e,
## fun_aggregate = mean)!
## Contrasts set to contr.sum for the following variables: instruction
a2
## Anova Table (Type 3 tests)
## 
## Response: response
##                                    Effect    df     MSE         F   ges p.value
## 1                             instruction 1, 38 2027.42      0.31  .003    .583
## 2                                validity 1, 38  678.65    4.12 *  .013    .049
## 3                    instruction:validity 1, 38  678.65    4.65 *  .014    .037
## 4                            plausibility 1, 38  468.82 34.23 ***  .068   <.001
## 5                instruction:plausibility 1, 38  468.82  10.67 **  .022    .002
## 6                                    what 1, 38  660.52      0.22 <.001    .640
## 7                        instruction:what 1, 38  660.52      2.60  .008    .115
## 8                   validity:plausibility 1, 38  371.87      0.14 <.001    .715
## 9       instruction:validity:plausibility 1, 38  371.87    4.78 *  .008    .035
## 10                          validity:what 1, 38 1213.14   9.80 **  .051    .003
## 11              instruction:validity:what 1, 38 1213.14   8.60 **  .045    .006
## 12                      plausibility:what 1, 38  204.54   9.97 **  .009    .003
## 13          instruction:plausibility:what 1, 38  204.54    5.23 *  .005    .028
## 14             validity:plausibility:what 1, 38  154.62      0.03 <.001    .855
## 15 instruction:validity:plausibility:what 1, 38  154.62      0.42 <.001    .521
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '+' 0.1 ' ' 1

Then we plot the data from this ANOVA. Because each panel would again show a mixed-design, we suppress the error bars.

afex_plot(a2, x = c("plausibility", "validity"), 
          trace = "instruction", panel = "what", 
          error = "none")

We see the critical and predicted cross-over interaction in the left of those two graphs. For implausible but valid problems deductive responses are larger than probabilistic responses. The opposite is true for plausible but invalid problems. We now tests these differences at each of the four x-axis ticks in each plot using custom contrasts (diff_1 to diff_4). Furthermore, we test for a validity effect and plausibility effect in both conditions.

(m4 <- emmeans(a2, ~instruction+plausibility+validity|what))
## what = affirmation:
##  instruction   plausibility validity emmean   SE df lower.CL upper.CL
##  deductive     plausible    valid      99.5 1.16 38     97.1    101.8
##  probabilistic plausible    valid      95.3 1.16 38     93.0     97.6
##  deductive     implausible  valid      95.1 5.01 38     85.0    105.2
##  probabilistic implausible  valid      60.2 5.01 38     50.0     70.3
##  deductive     plausible    invalid    67.0 6.95 38     52.9     81.0
##  probabilistic plausible    invalid    90.5 6.95 38     76.5    104.6
##  deductive     implausible  invalid    56.0 7.97 38     39.9     72.2
##  probabilistic implausible  invalid    64.1 7.97 38     48.0     80.3
## 
## what = denial:
##  instruction   plausibility validity emmean   SE df lower.CL upper.CL
##  deductive     plausible    valid      70.5 6.18 38     58.0     83.1
##  probabilistic plausible    valid      93.0 6.18 38     80.5    105.5
##  deductive     implausible  valid      70.2 6.36 38     57.4     83.1
##  probabilistic implausible  valid      73.0 6.36 38     60.1     85.8
##  deductive     plausible    invalid    86.5 5.32 38     75.8     97.3
##  probabilistic plausible    invalid    87.5 5.32 38     76.7     98.2
##  deductive     implausible  invalid    77.1 6.62 38     63.7     90.5
##  probabilistic implausible  invalid    80.8 6.62 38     67.4     94.1
## 
## Confidence level used: 0.95
c2 <- list(
  diff_1 = c(1, -1, 0, 0, 0, 0, 0, 0),
  diff_2 = c(0, 0, 1, -1, 0, 0, 0, 0),
  diff_3 = c(0, 0, 0, 0,  1, -1, 0, 0),
  diff_4 = c(0, 0, 0, 0,  0, 0, 1, -1),
  val_ded  = c(0.5, 0, 0.5, 0, -0.5, 0, -0.5, 0),
  val_prob = c(0, 0.5, 0, 0.5, 0, -0.5, 0, -0.5),
  plau_ded   = c(0.5, 0, -0.5, 0, -0.5, 0, 0.5, 0),
  plau_prob  = c(0, 0.5, 0, -0.5, 0, 0.5, 0, -0.5)
  )
contrast(m4, c2, adjust = "holm")
## what = affirmation:
##  contrast  estimate    SE df t.ratio p.value
##  diff_1       4.175  1.64 38   2.543  0.0759
##  diff_2      34.925  7.08 38   4.931  0.0001
##  diff_3     -23.600  9.83 38  -2.401  0.0854
##  diff_4      -8.100 11.28 38  -0.718  0.9538
##  val_ded     35.800  7.10 38   5.045  0.0001
##  val_prob     0.400  7.10 38   0.056  0.9553
##  plau_ded    -3.275  3.07 38  -1.068  0.8761
##  plau_prob   30.775  4.99 38   6.164  <.0001
## 
## what = denial:
##  contrast  estimate    SE df t.ratio p.value
##  diff_1     -22.425  8.74 38  -2.565  0.1007
##  diff_2      -2.700  8.99 38  -0.300  1.0000
##  diff_3      -0.925  7.52 38  -0.123  1.0000
##  diff_4      -3.650  9.36 38  -0.390  1.0000
##  val_ded    -11.412  6.65 38  -1.716  0.5658
##  val_prob    -1.137  6.65 38  -0.171  1.0000
##  plau_ded    -4.562  4.11 38  -1.109  1.0000
##  plau_prob   13.363  2.96 38   4.519  0.0005
## 
## P value adjustment: holm method for 8 tests

We can also pass these tests to multcomp which gives us more powerful Type 1 error corrections.

summary(as.glht(contrast(m4, c2)), test = adjusted("free"))
## Warning in tmp$pfunction("adjusted", ...): Completion with error > abseps

## Warning in tmp$pfunction("adjusted", ...): Completion with error > abseps

## Warning in tmp$pfunction("adjusted", ...): Completion with error > abseps

## Warning in tmp$pfunction("adjusted", ...): Completion with error > abseps

## Warning in tmp$pfunction("adjusted", ...): Completion with error > abseps
## $`what = affirmation`
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Linear Hypotheses:
##                Estimate Std. Error t value Pr(>|t|)    
## diff_1 == 0       4.175      1.641   2.543   0.0647 .  
## diff_2 == 0      34.925      7.082   4.931 9.81e-05 ***
## diff_3 == 0     -23.600      9.830  -2.401   0.0702 .  
## diff_4 == 0      -8.100     11.275  -0.718   0.6882    
## val_ded == 0     35.800      7.096   5.045 6.42e-05 ***
## val_prob == 0     0.400      7.096   0.056   0.9553    
## plau_ded == 0    -3.275      3.065  -1.068   0.6036    
## plau_prob == 0   30.775      4.992   6.164 2.41e-06 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- free method)
## 
## 
## $`what = denial`
## 
##   Simultaneous Tests for General Linear Hypotheses
## 
## Linear Hypotheses:
##                Estimate Std. Error t value Pr(>|t|)    
## diff_1 == 0     -22.425      8.742  -2.565 0.080611 .  
## diff_2 == 0      -2.700      8.987  -0.300 0.984918    
## diff_3 == 0      -0.925      7.522  -0.123 0.984918    
## diff_4 == 0      -3.650      9.358  -0.390 0.984918    
## val_ded == 0    -11.412      6.651  -1.716 0.380066    
## val_prob == 0    -1.137      6.651  -0.171 0.984918    
## plau_ded == 0    -4.562      4.115  -1.109 0.725892    
## plau_prob == 0   13.363      2.957   4.519 0.000374 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## (Adjusted p values reported -- free method)

Unfortunately, in the present case this function throws several warnings. Nevertheless, the p-values from both methods are very similar and agree on whether or not they are below or above .05. Because of the warnings it seems advisable to use the one provided by emmeans directly and not use the ones from multcomp.

The pattern for the affirmation problems is in line with the expectations: We find the predicted differences between the instruction types for valid and implausible (diff_2) and invalid and plausible (diff_3) and the predicted non-differences for the other two problems (diff_1 and diff_4). Furthermore, we find a validity effect in the deductive but not in the probabilistic condition. Likewise, we find a plausibility effect in the probabilistic but not in the deductive condition.

Final Note

Choosing the right correction for multiple testing can be difficult. In fact multcomp comes with an accompanying book (Bretz et al., 2011). If the degrees-of-freedom of all contrasts are identical using multcomp’s method free is more powerful than simply using the Bonferroni-Holm method. free is a generalization of the Bonferroni-Holm method that takes the correlations among the model parameters into account and uniformly more powerful.

References

  • Bretz, F., Hothorn, T., & Westfall, P. H. (2011). Multiple comparisons using R. Boca Raton, FL: CRC Press. https://CRAN.R-project.org/package=multcomp
  • Singmann, H., & Klauer, K. C. (2011). Deductive and inductive conditional inferences: Two modes of reasoning. Thinking & Reasoning, 17(3), 247-281. doi: 10.1080/13546783.2011.572718
  • Lenth, R. (2017). emmeans: Estimated Marginal Means, aka Least-Squares Means. R package version 0.9.1. https://CRAN.R-project.org/package=emmeans
afex/inst/doc/afex_plot_supported_models.R0000644000176200001440000003064214076067241020507 0ustar liggesusers## ---- echo=FALSE-------------------------------------------------------------- req_suggested_packages <- c("emmeans", "ggplot2", "cowplot", "ggbeeswarm", "ggpol", "nlme", "glmmTMB", "rstanarm", "brms", "MEMSS") pcheck <- lapply(req_suggested_packages, requireNamespace, quietly = TRUE) if (any(!unlist(pcheck))) { message("Required package(s) for this vignette are not available/installed and code will not be executed.") knitr::opts_chunk$set(eval = FALSE) } ## ----set-options, echo=FALSE, cache=FALSE----------------------------------------------- options(width = 90) knitr::opts_chunk$set(dpi=72) knitr::knit_hooks$set(document = function(x){ gsub("```\n*```r*\n*", "", x) }) ## ----message=FALSE, warning=FALSE------------------------------------------------------- library("afex") library("ggplot2") library("cowplot") theme_set(theme_bw(base_size = 14) + theme(legend.position="bottom", panel.grid.major.x = element_blank(), panel.grid.minor.x = element_blank())) ## --------------------------------------------------------------------------------------- set_sum_contrasts() ## --------------------------------------------------------------------------------------- warp.lm <- lm(breaks ~ wool * tension, data = warpbreaks) ## ----fig.width=7, fig.height=3---------------------------------------------------------- p1 <- afex_plot(warp.lm, "tension") p2 <- afex_plot(warp.lm, "tension", "wool") plot_grid(p1, p2) ## --------------------------------------------------------------------------------------- ins <- data.frame( n = c(500, 1200, 100, 400, 500, 300), size = factor(rep(1:3,2), labels = c("S","M","L")), age = factor(rep(1:2, each = 3)), claims = c(42, 37, 1, 101, 73, 14)) ## ----fig.width=3, fig.height=3---------------------------------------------------------- ins.glm <- glm(claims ~ size + age + offset(log(n)), data = ins, family = "poisson") afex_plot(ins.glm, "size", "age") ## --------------------------------------------------------------------------------------- ## binomial glm adapted from ?predict.glm ldose <- factor(rep(0:5, 2)) numdead <- c(1, 4, 9, 13, 18, 20, 0, 2, 6, 10, 12, 16) sex <- factor(rep(c("M", "F"), c(6, 6))) SF <- numdead/20 ## dv should be a vector, no matrix budworm.lg <- glm(SF ~ sex*ldose, family = binomial, weights = rep(20, length(numdead))) ## ----fig.width=8, fig.height=3---------------------------------------------------------- a <- afex_plot(budworm.lg, "ldose") b <- afex_plot(budworm.lg, "ldose", "sex") ## data point is hidden behind mean! c <- afex_plot(budworm.lg, "ldose", "sex", data_arg = list(size = 4, color = "red")) plot_grid(a, b, c, labels = "AUTO", nrow = 1) ## ----fig.width=8, fig.height=6---------------------------------------------------------- ## nlme mixed model data(Oats, package = "nlme") Oats$nitro <- factor(Oats$nitro) oats.1 <- nlme::lme(yield ~ nitro * Variety, random = ~ 1 | Block / Variety, data = Oats) plot_grid( afex_plot(oats.1, "nitro", "Variety", data = Oats), # A afex_plot(oats.1, "nitro", "Variety", data = Oats), # B afex_plot(oats.1, "nitro", "Variety", data = Oats, id = "Block"), # C afex_plot(oats.1, "nitro", data = Oats), # D afex_plot(oats.1, "nitro", data = Oats, id = c("Block", "Variety")), # E afex_plot(oats.1, "nitro", data = Oats, id = "Block"), # F labels = "AUTO" ) ## ---- eval=FALSE------------------------------------------------------------------------ # library("glmmTMB") # tmb <- glmmTMB(count~spp * mined + (1|site), # ziformula = ~spp * mined, # family=nbinom2, Salamanders) # ## ---- eval=FALSE, include=FALSE--------------------------------------------------------- # library("glmmTMB") # set_sum_contrasts() # tmb <- glmmTMB(count~spp * mined + (1|site), # ziformula = ~spp * mined, # family=nbinom2, Salamanders) # save(tmb, file = "inst/extdata/tmb_example_fit.rda", compress = "xz") ## ---- echo=FALSE, include=FALSE--------------------------------------------------------- library("glmmTMB") data(Salamanders, package = "glmmTMB") load(system.file("extdata/", "tmb_example_fit.rda", package = "afex")) ## ----fig.width=8, fig.height=3---------------------------------------------------------- plot_grid( afex_plot(tmb, "spp"), afex_plot(tmb, "spp", data_geom = geom_violin), afex_plot(tmb, "spp", id = "site", data = Salamanders), labels = "AUTO", nrow = 1 ) ## ----fig.width=8.5, fig.height=3.5------------------------------------------------------ a <- afex_plot(tmb, "spp", "mined") b <- afex_plot(tmb, "spp", "mined", data_alpha = 0.3, data_arg = list( position = ggplot2::position_jitterdodge( jitter.width = 0.2, jitter.height = 0.5, dodge.width = 0.5 ## needs to be same as dodge ), color = "darkgrey")) plot_grid(a, b, labels = "AUTO") ## ----fig.width=5.5, fig.height=3.5------------------------------------------------------ afex_plot(tmb, "spp", "mined", id = "site", data = Salamanders, data_geom = ggbeeswarm::geom_beeswarm, data_arg = list(dodge.width = 0.5, cex = 0.4, color = "darkgrey") ) ## ---- eval=FALSE------------------------------------------------------------------------ # library("rstanarm") ## requires resetting the ggplot2 theme # theme_set(theme_bw(base_size = 14) + # theme(legend.position="bottom", # panel.grid.major.x = element_blank(), # panel.grid.minor.x = element_blank())) # cbpp <- lme4::cbpp # cbpp$prob <- with(cbpp, incidence / size) # example_model <- stan_glmer(prob ~ period + (1|herd), # data = cbpp, family = binomial, weight = size, # chains = 2, cores = 1, seed = 12345, iter = 500) ## ---- eval=FALSE------------------------------------------------------------------------ # b1 <- afex_plot(example_model, "period") # ## dv column detected: prob # ## No id column passed. Assuming all rows are independent samples. # b2 <- afex_plot(example_model, "period", data_geom = geom_violin) # ## dv column detected: prob # ## No id column passed. Assuming all rows are independent samples. # plot_grid(b1, b2, labels = "AUTO") ## ----fig.width=7, fig.height=3, echo=FALSE---------------------------------------------- load(system.file("extdata/", "plots_rstanarm.rda", package = "afex")) plot_grid(b1, b2, labels = "AUTO") ## ---- eval=FALSE------------------------------------------------------------------------ # cbpp_l <- vector("list", nrow(cbpp)) # for (i in seq_along(cbpp_l)) { # cbpp_l[[i]] <- data.frame( # herd = cbpp$herd[i], # period = cbpp$period[i], # incidence = rep(0, cbpp$size[i]) # ) # cbpp_l[[i]]$incidence[seq_len(cbpp$incidence[i])] <- 1 # } # cbpp_l <- do.call("rbind", cbpp_l) # cbpp_l$herd <- factor(cbpp_l$herd, levels = levels(cbpp$herd)) # cbpp_l$period <- factor(cbpp_l$period, levels = levels(cbpp$period)) # example_model2 <- stan_glmer(incidence ~ period + (1|herd), # data = cbpp_l, family = binomial, # chains = 2, cores = 1, seed = 12345, iter = 500) ## ---- eval=FALSE------------------------------------------------------------------------ # b3 <- afex_plot(example_model2, "period") # ## dv column detected: incidence # ## No id column passed. Assuming all rows are independent samples. # b4 <- afex_plot(example_model2, "period", id = "herd") # ## dv column detected: incidence # plot_grid(b3, b4, labels = "AUTO") ## ----fig.width=7, fig.height=3, echo=FALSE---------------------------------------------- plot_grid(b3, b4, labels = "AUTO") ## ---- eval=FALSE------------------------------------------------------------------------ # data("Machines", package = "MEMSS") # mm <- stan_lmer(score ~ Machine + (Machine|Worker), data=Machines, # chains = 2, cores = 1, seed = 12345, iter = 500) ## ---- eval=FALSE------------------------------------------------------------------------ # b5 <- afex_plot(mm, "Machine") # ## dv column detected: score # ## No id column passed. Assuming all rows are independent samples. # b6 <- afex_plot(mm, "Machine", id = "Worker") # ## dv column detected: score # plot_grid(b5, b6, labels = "AUTO") ## ----fig.width=7, fig.height=3, echo=FALSE---------------------------------------------- plot_grid(b5, b6, labels = "AUTO") ## ---- eval=FALSE, include=FALSE--------------------------------------------------------- # library("rstanarm") ## requires resetting the ggplot2 theme # library("ggplot2") # theme_set(theme_bw(base_size = 14) + # theme(legend.position="bottom", # panel.grid.major.x = element_blank(), # panel.grid.minor.x = element_blank())) # set_sum_contrasts() # cbpp <- lme4::cbpp # cbpp$prob <- with(cbpp, incidence / size) # example_model <- stan_glmer(prob ~ period + (1|herd), # data = cbpp, family = binomial, weight = size, # chains = 2, cores = 1, seed = 12345, iter = 500) # b1 <- afex_plot(example_model, "period") # b2 <- afex_plot(example_model, "period", data_geom = geom_violin) # # cbpp_l <- vector("list", nrow(cbpp)) # for (i in seq_along(cbpp_l)) { # cbpp_l[[i]] <- data.frame( # herd = cbpp$herd[i], # period = cbpp$period[i], # incidence = rep(0, cbpp$size[i]) # ) # cbpp_l[[i]]$incidence[seq_len(cbpp$incidence[i])] <- 1 # } # cbpp_l <- do.call("rbind", cbpp_l) # cbpp_l$herd <- factor(cbpp_l$herd, levels = levels(cbpp$herd)) # cbpp_l$period <- factor(cbpp_l$period, levels = levels(cbpp$period)) # example_model2 <- stan_glmer(incidence ~ period + (1|herd), # data = cbpp_l, family = binomial, # chains = 2, cores = 1, seed = 12345, iter = 500) # b3 <- afex_plot(example_model2, "period") # b4 <- afex_plot(example_model2, "period", id = "herd") # # data("Machines", package = "MEMSS") # mm <- stan_lmer(score ~ Machine + (Machine|Worker), data=Machines, # chains = 2, cores = 1, seed = 12345, iter = 500) # b5 <- afex_plot(mm, "Machine") # b6 <- afex_plot(mm, "Machine", id = "Worker", data = Machines) # save(b1, b2, b3, b4, b5, b6, file = "../inst/extdata/plots_rstanarm.rda", # compress = "xz", version = 2) ## ---- eval=FALSE------------------------------------------------------------------------ # library("brms") # data("Machines", package = "MEMSS") # mm2 <- brm(score ~ Machine + (Machine|Worker), data=Machines, # chains = 2, cores = 1, seed = 12345, iter = 500) ## ---- eval=FALSE------------------------------------------------------------------------ # bb1 <- afex_plot(mm2, "Machine", data = Machines, dv = "score") # ## No id column passed. Assuming all rows are independent samples. # bb2 <- afex_plot(mm2, "Machine", id = "Worker", # data = Machines, dv = "score") # plot_grid(bb1, bb2) ## ----fig.width=7, fig.height=3, echo=FALSE---------------------------------------------- load(system.file("extdata/", "plots_brms.rda", package = "afex")) plot_grid(bb1, bb2) ## ---- eval=FALSE, include=FALSE--------------------------------------------------------- # library("brms") # data("Machines", package = "MEMSS") # mm2 <- brm(score ~ Machine + (Machine|Worker), data=Machines, # chains = 2, cores = 1, seed = 12345, iter = 500) # bb1 <- afex_plot(mm2, "Machine", data = Machines, dv = "score") # bb2 <- afex_plot(mm2, "Machine", id = "Worker", # data = Machines, dv = "score") # save(bb1, bb2, file = "../inst/extdata/plots_brms.rda", version = 2) ## ----fig.width=4, fig.height=3, eval = FALSE-------------------------------------------- # library("GLMMadaptive") # data(Salamanders, package = "glmmTMB") # gm1 <- mixed_model(count~spp * mined, random = ~ 1 | site, data = Salamanders, # family = zi.poisson(), zi_fixed = ~ mined) # # afex_plot(gm1, "spp", data = Salamanders) afex/inst/extdata/0000755000176200001440000000000013720444323013606 5ustar liggesusersafex/inst/extdata/output_mixed_vignette.rda0000644000176200001440000013222413720507264020741 0ustar liggesusers7zXZi"6!X2V])ThnRʠ3#ŧi)Pawǔ-ՍZkջشUXm5\ +!J: fm%z$!{ۯ)˸%W+]:5 gOŀ4(CJj@x,D7_'ieaQm T[~j}E[Nw BuzE7w 6sM0:f!H銲\A(;Zl[~]h`$6V#(箵j/QBGұb'%n>c~I㗒S#G;4bO;1Bj KbՏ/g&]ˮ Kz XrWڨr{}Qބ,n6NfTL_JrP*l~483o@&b/ZF"a80(=j}n h^%Z Pm6;g+Sܦ D%  ݀ U-kz҃=֌ǻ0ز6cw{R b9BOd:oW,Vk T<uZTc X!H]>O^e.Z=M {c"  DZ'd܂fQ`02Q7& &M8Yb8d%dG{wҵx^㙜DkK¡h*vPLyjP^E 蕑YK6B _L Xڼw_ң3O {}t.[߂g!g2|YWPq_?_MR^mKHav6Rmz6pɎHoR:"`f Vgc&,7ʃAʇ4R骠HnI%fޙXi+ s1"|T9 2jv0AT ǎKd''7HWr؆<զ[KZk}Ss'ph.9|Ex%qQ7 ݹ`j@فFqn@8X+j,1?d[g頽Tm%욽$9qS.s4tQ}w9ZkA=xALקui y,7B!wNۯ2UK%킑kuv Mi A±^6|܍!ֳguA " b֔C >+7\ATUmۈ6-!q:xymHfġKLK%>1ShLu t _d g!78w9G9g]; 簿`]I4[R;8Qt [isIo-e0 ]dNui7 8VFSt3~ ȐqP*c+WJrI4@r@'F#&խb)$}.w}V>tbXb 0GeK[aR|DD_tP4twL`|Z"X;;b]|}&~M)]mDj%`SҎ[8+h K aE("AVgf]uAgQE0\h'ojiGL3miMZ 3SʷҥR rMFOp1@&#Gm**. nA8-pʱt=f-"LsA_/^s#mURu> to@&K̯ qV1B/nwJV"-%ukpw1 [aE7ߦQ'49",sD;8}T!:QUsœ=^T3(f<)dÕ!k##.M:]-/ @:K' 3rG`v~Y Ť;'7=` jluC[ ڴb};B05p3:! &g?ގs8WsZ`#,bH;mF^mJQwK2`JЇ⃏/LrƻgS:@ڎt`E$vflϸN|ɝh[xFz'V$< gzCE7cS+%i`ELQtn۵D绎fDKk`Qv2[QMYaCy!SoZ/'3ge<}-ВujڲiԳp qP,z:.4^YOgtLVM/ZLcѠޒQXou YeAAX]TlW܃eík˚HxO'4Bbm4Tٜ2@O}G)G/Bnˣ-< ZPhћ< dL1 ru)2އ\LKhI9׃y¹sUPT4x9@̻ ~CyAX }u[RBjHT0-mP}xg|lihuI$@8+ll[|,ȜԂF}䜁D_uYЇ44am0 Jǵ qxX554mEHQ7Xh5%j&u ıe}5~7E'F@uEwlʊ,f#W{ ֨3Jg"%nX9|!FxӼQL_MHRB,;"VS%ۧ?&4 ,\'sVIa%B_+|5h*zMx.}?"~ },H]KhHu]\?nƛI?ܷcbfIKʞY[nSgDc4PwYvݰqFpcY`:mWG Zp'#ʛGBm2lg>19!c3Ǹ*8T؎q˄SLOgi䁇]bMZAOk ŮxJ]y%Zr2џ)z543OE]g (lǻ=Bf08Ovw}:$ޠPiTBl*}vzDE?+d ʬvpo㘠? /36n1߈⬸-lcb1?48~lx?U豦ݭ V;͒5|.Iw*%/2 ;Nmؓ`;iN2>cGF>q,C^ ZfGWUl4<&\hJ}Vdh|4 h+d-c[:}UYFjkkM:@9A 3ʣF9=y0jci/1dPqCQj؋Gv%;%Jk@[`t,J a +eofG>#o^\8AQ21*ǮlK;n7K7^Y08 7 #E_`-i:C{:޴/ 0lD|rwCg@ĈQq,d,9MC=9ps\{ztjO&VmJG9Qq]Mz|j/OeS"4:X7{ôp/\t*Ay+{sy4_~ȄWC+B93s?FK#ɞ0H2"#̗:N݇`§R`7яyY4ϲ`r傗eD'=6Juȑ"p? ׁldWEIl_fUWpj.nnk4 1QqW/]F*qa"F;@[-.4TWꇾ W^޴yUQB_%Y2 ,/unk܏;zѥW{Ѹ5 *iF8wB }#S 5`6 6n5$hύGpG P[/~}ˎW6x| ̛Ȋ~4gjaPzږWΨ-~flJ}m:x?r4:(3o.\`0,%" w ߱k +$ZEK%cEe!nIqSim@$p 0&m BU[@+`D#KR\RJbw]AJ8&qu~kIKf1ioJɎ8J{ JYr8m@ĭD7) 02iwKNDD.940v[%EB-YxϑLѪ*T^9',yX$A"y`xRn7PExZ|:ӰFuv XhۨJP}% mD#ܛ+Rͮx8ꇧc7hNaf+!IcC92w:.|wq,ȸ|iͦ1x#y'Լbݘ3o5K:\xRŃm?:Ve&`Ɛ[j`Z<c( q6C7΂9߽F?=5;6)Є Пx[O,0 7wD %Q^d/070v윺7;ZqdǶT54ӱ/dkXD. С7a' λk~n$xr\º& G\`H]r9zbSZ^J"=]&'0wׯ=qe"y0ݑ!Xm^KV.B̎lV3- G Hԧ"ָd㕌"eX\ia_*MÑll(ɘ/ǻTL/ey#ƖV(S-ᢉw+9kGbɡ> W OpwnKNmtG:vDлٴp2DL-Y>F/Y"` <~ &;ӁMn W饒1Y#y欕 ]lEY]Ad` 0|)2z_%]>9o!$ׯD º_b۳cǐl|+jzP3SA?,_5 YT|A6>L8A!0b1o7Z8.IQk@k^NR!bc08p4$]$ؑnVm$>V#s#gp>~#FgtW%fכx5)[d͞'&l 4W&ڮ ^1Oς`ټ9gZr1zVi_{NZhuX'I5O% @!z)DrR9p<1?5jafn{wlqy2x泵 `vNQ*4)FҦRLKy2k+Wn g5F4LO&NN/)6, 1G.F8>2bF^/jFTvO쾻 )֡l*A45N_"͕{yy| j>oU{[Jtk+Q~> yHp5z!}FщJ5K _D; C 8֔?hxw6 &4Ш[Eo3"=R7{E d˿ Hh5*kZ`*|hXTvӈ!x9'c,}(n\=8/HyZ>6\$K fdH|r-ېyqԀuh ʩjv>0³\e;f#d0o&$B2hAI1߉Fyjt&km`:I6vih^܌+xdC.%P%=IsB$/>Uu\/*  Y (ٵ.Z6gS*ݍRFw")GF"50&E-ףQX[ymT"RV:ZFmURIRXEl3oJ*ƫL?3C,4Se)F/q?sTecnMLk.BGvյ+ S#?DfTyr.R%ٿ%SFmk4*] 6C6~U,6ǽ]~KS:E\? r 'S:Jnp2@儚0H~N' G33H yC(0sYR K/k'N_S%\Wދ+*--9),2GJD`Ṿ &uaߘ5ax/W?inAaq|MlBGAB{0RRj=j%C D4cK WiR7gS,2Y\$ddZGNڝ߆t+5P_Jw]#p| U'º5cnTim =@f[HYRI鲨#i?DK+q| Դ2Z[hd++hվJ5 fmh`p:.6xt]w(&i.t,埘|҄;@=&^7 d:iƹVMv"AĒy+۶@"ՉZ%pIjz9 J2ꑬ)H>]ðu̮F3#a'qO$wQm8KS-'F<4Õc4>5uQO \S]ݍ#| Y! i΋oO l8 ]ktԮV7{ۍ.i&&i142(ZIt+13{(^ -G<6\ڒY5dÎvt. uk3ae;G,Aj@굻1eŷq4\dhZ9_HQ3#Ft Y̢k1h[m3(Ͽx=q)H0]LS5Ң6Ղf܂լW-MVߪNIs=0׆0?v7[/AU?@"*;gmF$@7!'$劗 ]AzW鉸ByhXz}+0k n"=-%`RhnРj9F0 He8QxeBwO3}?fQ ?=;2R28KScPKxSsr,KKh3IH5A|嘝kƵ;K)SZd{Ͷ)x54s_d usMD{"9]UNtH! s¾% H1$H*0N[ѭoK0[IBs봖Ocwq :<9@ EfLa%B1Gk9Cn ?"BH!M\1v>GhEz@2}9 * P@ /˯_ӗŨ%.zn{B1pE0op8}c~=%S92 3Ŀfz\+ts͗hG$M=lP{q6?7{)"0>]ʹ#v¨>‡d;+b1zP#V*X8 Z IGMxL>M@ ?q1bNʵTzr'^#덫(Qb:50RM9`52B4b6ʄ:oKyF  +TqFi~j|YŴؗ~c9,gs#Ol٪!d龍 }y0H6hYۙ͂F Œ+q r2YIo'pM%2@@t,Qڕe'kc1Zko}INnLRU#ff+A`@6%},  LMfpv_'b! qn8-L`F DsR±[(%p*'ʍRXfǰ5ɖvPXFZs~voD߈hTƷ<o ЦvmTӸ#{"2I,Hl H0 V*ƯiU ]0WHc߇>7w̶D6@HQhAXytB9}6A>!3TG<سG&ǢU0WD2uf7qzs_Inz:l:Ac VCLY:XzNP?Ii ]\yu%N ?6YFJ0/D'Mu8'JGƾ?c 껋 Ph`2F~ '"kHp͠XH$y̓Zaƹ'%g,ސ`ہK)„:}~Geড়XYx;^O86.@nrSRS*"yP7h1ʘ?VƲt*4 iXVWy |+`!ơ}QۙgFwv ^&ZGjxd!m/!ۏ޶Ozc2IhJAw^xƮY%r>q+2 -˲u*[ΨmvkMb_~1ʓ-m?Z}Giw[犁Lʫgy-ߝ!Ν,w}؀Gtb$)"W[Wu˝WTZzA|ё*pGNؐz*. #!*ڿ1v$< sSOn- JH Yt#Tё=ZW0պLO`, rI8Dz]Mx9ЏMR*CX96zQb\Ww xz-BxSn bb#7-}<24fLB^?Ȼ|b . \f@ T.gIӟTk׋8g*<;]e^iҚT $+E-^ 6UݵP'rq"Ihɾcd?)F `h;h`3`I!咰jG=>} " (#@K3K5XLwW&™ѵ,x)LŬ}u=Y1@N|VM?TXTz㧯cLCZT?#Dcb{ܮ4tݥѨre!xii_ͳCsr@s}kfݖS+MQ.I]09Wk Y:;U\OتJ[ 8 &f\L?a zf$Xs\D6{=h"!|YbvlSq+R*~KzݑzzvHwEїw}O5V/Lu]ŹORB8E~ʡ:VʀkFcmºV k屰th+%z[zkM㣔Xc'/|ob8D.%bOqa㵅{ f}|4'|dH0*(}Cc6rܴsl Nv:AgrQtM/\Ny)b$IP `i48'p`P >S~31: jyx!R W9k:YpE +^o5\rA{QwK?UyI@N zFXk3NdY]ȥh,ԱLŐ@EWAL/tJ8nđz`/V"@rm85%oڔk;5lߒW'Q.-Q{D1 +8,`B{qgGb n'C'A#l*SgnJHtdGkv"5L`{GX=;4Z~/zp*T&`'Pb"|o )<)ۛI(p#JBW +Sʏr:Fp03pϸ@麑.Q=4,O8x ԧVm/8` UpeC+L7LNLO 2&`m,"ի*HUxAJhe':j`(2=0L8yk I!B\HNG=Z*I{|=t Id>sX]~23g~S7uΌ!]rR[wJt=:,ݴo>EIf̅pNhk!r1t&E=᩼G D/JڗbGU(kImƋn;2es?)ّtGBw iwj㮇gU.)tѥt6Wqj *C$to5npQr3qakS12U?"R IOF3F)td)EJ \zN.J{+CZbGݨ|H@Ԩօ%,q95z8urd?Ƒdlc능{wFwl^<HnZP_J̯%9Q?n\["'bї\Z$jngF h_uփΠ ߢf<\q(Q. czc )Ȧ&fIqCq`OZY ҎDsn(T/z>>mL*¢m/ABqfMZԥ6wF4'GGm61k!gaܑfvOgX Hatr> }ɑx|%NEF`> /OUFo u%} P[U@k0eOGo*_zMo̎xN%m*%]HG 4%YSftzQn6% MS^ =hPfDz~4n)y8wt턏.$fȍ%@ی~ K`%V :KIɕW};/i"wëɿ 8o(f+?(&`#*Kh[xX–XtQbH(TYkIn&+0wING"ɰ BX?nv(ҐKGpGdv|'. D)wPKX2^|/lmڢ5K.NJ((=('hn3xq pnЧtQ8'5J?f537_*˜Kd:jW Q3\>6Ak0:>A\yv#W~w3ރc F?5#) 4!u "Z,2PP RIJn2=BUEhSCKcԵ۔ؘRd`'-䂍i1ג< jd+#T-, Vt9ix'GE1U!r%'g$wܶl8+1nO\hK$r,hx<0Uw"I3YR]h0B.@,q:sLphqZrNE':{>Z`(}1!L ӡїokTWJ /\nQgDx:8-3 f}j8%OݜZ̙`,eTHs M7srAܼؖ_MMz1RJ||t1%I#6$ 2Eu04)ol!̬HEѩ&>oZkoT«P ^Y=1'Z$"%BN[ymR}Breș:P3p lJGD|Ҧɲ .S 'wmT(^ }دSMӠF ԑ1C@wD(CX/.q>v9%pT5w`Z~zVbE*,Ljx]7 DZ#l#|aD /:_3ZP3.vg||8퐨T}zIs]`ӽnP><(d:$xC(`ǣ${upXgpHAQzwnD#KzX͒àd; 0Q2YEA*/,6u}ojh-0-,i}; !WVoF*TtGjbsi%+紨"v;JH4윫vr (1eO g,xƸ*c>9Ne$|t"4jo߄DSQspxE`Y-F¹;a}֌$v0ͿD4|-_y&rH׵$ teVv@Zejl>r1Y!Aҹ޻Lf}ON d]Y./ػEjm*]a)Zfܮ7BHبR(xřh5#SլXˇ ߲@E3(wnCH\h$n EIT,M>>L)r'.{c38dri` H:Xx;p4Z*-G25!gBoJ݄YmlLp%+AHzIe誤ٜX>z;A mœR6f3s _Ssi1^ٺ[>QVzl KcL`Owj_.UZ{lWQD}.G?\2\h!yN_!4O,V0B!Y"b,+^ Ю%^#0Fk~$j)ETׇBۦc*-$AگK[?FpCV^t-8B?wL䆾]*S{>yEhGNqq3.<rLhAgb_`|߅K50KVڠ$/ jl6vzuO]FW i$&xQڵQ+|ts*xP&CY8F"CYMo6ƠD^ޣГkLhx{!8aidō`:nM$[@؏aoҝU,`#W?w SZ SM\_z*u ٙhu7uWC* 8FX PQ8�u#K ~FF vr *"c0"w*hY˜NeOt/bڣCr{d,c̛Fް.z=1Nc Nf"i!N:vm,2fsR⋮G.sk%Q 7tczO$>T.R0O`l~UJ-q-nSj*ƸjܴȰnTĖȋE\HTG%o/HQ)gruWZi|HWސ4Ͼyɳ:xѱs$GSwsXjuP֙ 1iϻytF z\"%{-#c@K]pكAG&(reZD(5E﹦Ħ²m.֢ ~ Ox&JIevd:ᙷ0uzW'` mAE?Xd'xK5Mj_ ##@L7O]jY;c\j|q)mv  %aHT`eя+; &Tp?kodjŧ:j6Pa }$%5 4Rxi.Inb ă92h M;u3OrWZ=t̿U3,53
?u#%Y7]d0/Il  Vv-iEGg1D;#6O?27O %jewb/imc]7FUV;xJBG易BXvR@?M>&L e u-pʱc,Ezc2+}4Jf;lƥKAljԎ[_2s%ʸEajūOHJ۶WlrirouiKq<0{Q }LxD AZ,+7=?K;y4[U}@Jq`QRԔt6Ww٫AfW°|p+!ȗ.|7N IV==1Ymcu0Kgy$Q ݣ(oJ:mk6[2.CmaIqt77u\y"à%@e`6XkJV}d`0nKC!q^C TQ HlUܨp$Oum8t 7h׻L,c+vqTʰy'4ֽ/j_$3%H iRtp.ko%Ea*{Q$"4 ă?Qpu{ƠxzJ+uxB aI{byf)8=EM:3\:Uý:v+qӺ:nۣ$K;exJRQL>&Y@#򝯠k@1Ï%ߣCer$=-H ࿠piC٣mG9-_4*ZY;G}j 7S^r$J?s@ԯ0%Q gMjj"zUq&DTZ`YKɡwdd()-,d.hȬ鎆5܍cҳ4Q@b0X KC_@k0"{X|]÷z#¨b,W(6 j{ X2 sX$a-X_Ȍ^! A -4/=38-6x!卙?#bᶌd%U!9/pWxZ熟}@LYnP&GAQ~)M~#4f3遚297kښIg(AX<>Z}pͶg#'ӭ+fQlBCA}zUEpiUw kIU?Ty ;/wYq/`jA@zy^ 3 K=֖p=V*XfYmD<bCMWW ŗKx d鲤ke {F'mkkK_h3~wD }l'HZ@|ݎ$a: ӈ|Cվ˸se[ңi#+-2ek"y= ܊4jNRsYݶŝt!s} lzP- ۥIh=/ȓxoSrÖ]-iX^iSŽ4b`KnS yX_Jf{1 TQ^>^goYE_|^lF꘳-]QC. i{_"]Aa tqec.~HK aDn*o.KwA'{I+LwEo]ᚇFv0m;MZ&2{ \dE_!8`Vйl> U2 K 0d(}b?"&6ɘcoiIu:. &uyODeLѐߚ9~^A-Qim/`Ukپk1E|0=ď , ^tzЯ)%O^Zx0_l$hE͘ 5j"Uu`0UM ΣF4jglC/9d KJBQ+?b"DÇ4L˛ |D5mEʐXryzCϗ]{bFܼߖ7D5A$Bƃ!inr)_:H@fHGvI(`JWMՅjXRxh`6[0K_*RHєe"k&mvŏ-Ru-hhZ0B[,ڌT f|Uz&"/ ^v Y{$ٯG ĦwY^c-T6{-Vf1̹<}$z#N; c*Wui[ 8p9i 蜷Os͍@_\cuͅ&p˳ =/^DEdXaK睮X,YgZ"oыXo|}?3>$"͠tR)U:<&LG@bDvP }!d \cF)́qr%+`fLaw$nnV}Fjς#}\,_&1ll(/z*9ltmodam{/0GFV֠ȆTrydA+oR`Q8幀C>Ʋo[~~%;s&p^)62JdB]2=ZW`?=ӝAa8m낁$]" bF"(ܪKpdBWHVii97]9â3%u1ί.vet] uNAu4R xVhWH^Sݒ}/G^yba1hǗsjճfG.CxI`U|p.=db|hI:j9Ô$ J-%ru|A[| >A{ TsV|'l39٬)͝QLxb%Es`4.W$Gl٬;ؓW1lc·BAwYW@q=y$y/[hpE%ļXgD#CkD#`,$%Yg_kW3O|0 &唁Gm[/QTD@J`6+̗CxjX{k8KL2q|Yuj._/n*dO"Oy\ l$x7.,NM H5(qY--O~1k7?Pd7t;lp&PVuJҭM{}a &ox:J#GKQ."R4Ъ*Jy{kTeK,(-CԱu˕"x&fFZ˸ӎنiKكsCOÒIHX5 j 9{so|OXc~+l/AL,Aၔm+{O݂Q\g̕J9$DUÇ2N?i E50,IN=L1[*76:mS=q<5ZsY=*7c{ KA:^?mnr nг˱!-^KG?MH6Vk2K꘶ nZa-,bm+2IE RV5^'\?rӻe"{`:V.×Av&!K) ،ΟQ`gQ(P#@5,03<.l*Jv aGXу9+| Q1y> P0,\Ts[q[xD͞Y] vZ*KM}SEfV=6*XbϠVu޷j! e Ѡ,E4=T߆3$%,CCT ٛ1Ѱ 0Lވ4v/q 6ŊY"z)bRK&`z7:3  > ޟS8LczrR,kVT{7CQ C8f \^!M~' 6}#a?-1߅l3'f^s'T+A,=:[q-GV8_Ą~ZT:iO6T?cbZ$yۊIVw.wlH.-J:MS >?JYi ִB- XCɭ$".V=}X"nT_B47gWԀI;_m(۷_bXv.deVo>nKr$Tt;y`5Poǧl ̷ȑUXxRW_փVX!HU+7jOecGr*?湢3]|J]>˅hkXrTYCXM2yL,zFiw"&JfM$ ({QV)<ZiIǦ9:7+r{آ4=c8'3%"BB$_7Eb/6ƣ^y㢮G7F[4G_Kd<W`}ˉq.k]^IK|V|۳JĜӷxϢI R섩e+ˑM Ũ 6e+H!PDtW RjTe(c":B UsysS@,J0lj&Z'EP(װ| C &s;A䪥t^U/bD?b K5#R76–gi7@7R>y+U`"^ vΖ$u'W='66#:ڑ.LUM21w}~CF-%m=sr.`gG~|X :mc<ȗ=9wF ,Kmr _A7pJi2a ֬E`8>AH1yqBkHT%%|6B~j}bmY|eqʟ_ueYH͠\RTԛlb}4'Ue wYg#ɨ̭$l2aabe;DڰSpf%TFK' gDV:"i$1#[q~u2#wܢogXaj{݂h~~#QW{r|DMq|4p\ J?Re׆Ep遗 1KXS$zCFzK\Km\ՠ v/W9y\ϾD:]fppIBO_ZFJ _6(vJ8frBSvh tْ\U]-!2bv{=DsA_cZXIlc3-ƒc/ZU[>O:VQ YTI㠤75dA^\ _`\4x3  -ۯxHwG;]տ[ˤpwr.[.L%- ;ZYϑI.W`l% ;UI+)a2Y ư&;h-z] B[ c.yȳuDC`@mmU8P5 Nݡ QR+y;{2K"_ٿwMyly !t i8ȋ:I7B< .P͟H@JqK3`$ $ڵG*fEVv? 4̚mS¢-6/q79ū3\Gd+@D|,jc. 4%e9Ls WvQ ֯9+{F' <ƾ F1%'Vt܈MmہH]2^&g߱x7q!A$+e-_F#Q Mj>m.WKXÙ тc|ϛ X|N(|I8/]7_]Beicwj鮋]޼z#t%g ^_~6>qޤs_f@a24TSvX98l8+[,MC6WuƜwSqVMԊIb8 -`݃`(LpnтـNee ɶ[_ !R]48 q\ղC\ω O^LG5Q󳶲X/N:aΪ&Zfn-̒%:͐뢲SOT~QҦ3"3@ 繦G5"P [-?|O%0~yRzj'%:c{X0 .C~5ΈVT׫IpG5?*JJf+>Ӌ/e4+%c;y+؝G/.hmWxt_4 Ԩ$ g tyV ,6Dz|!)%F%tk͸sVv&nMHW0t1 *NN`O1-ՎM'RW!2UV/ %2dcޏurJ񒉱[RbUv1.dɑ>P (`ҕ2 }r/q[$4 kєupE1K1@ RpӬ-<.ݤq|S!Yk?5|q!yҺ $r6K^!Wvy^żYU FfqGDOQ s>' Tsp~q{$bhdz^Fm1Y m+'pMP3U,4 M& $ܩ'O6/&k8_ )Fa[u>/;.si=*;su [g6WQƌZBn]\_!Bdmub»ң}\uIJ'w'kNFw G-K 8 8"*<0 ?|c=7 0űz?x.yZWr$}8D?^nPywoOVc1jXQfiLyW]~2ꕺOHрljs6O R i$WOY: BkAܩbG4-[%?Dg.4 iVK='EZ?G߱DPc+hfOQU?R1ITk;D,o\ܾuFZ Gu5>~a۹6_iQ_އMҵZ6G 3bzGP T_d(`( j];pX~e*px"žGZmZ tMd%W~4zz\ȨexeѠo}Z?xO䅨<2n亊^M HZ7>X+~' J|W\*ۺJ(*iտ^COEfQԿȬ(3M<z$a/OK(Ln25PGMiͤqb+9͖dګ;&r"M;Ӳϖ}f|JShUL>Xbm9m( .g{ ȂWbD@ 1}V[# HAzY;ߩa( lN ڏޮ]*6k6#oyҺB uNyЛ,\4cI7$;N6S*܍Iײ*C춉Aw&:ryq& >ar:J%bdnU$.esrNjfA~>ܿT/[Y5zO~K7"p!argnC |uBשK5[`+o /.)R9Sи։YkX\!<+}kFoѡBv)G:#dՅ# I@ym b[-mF.=I/ڳ[Jχbm;l^L~La77ڔ•D$ wCecm Oa3=EJ_ͥ2AxoԫrCɇ}m`瑧 ѷW@3qx䔙֨}+M;_Jq^qZMtEGhL:\·7 TV͟A jG5PXldK者\spde'88j'ㆾ.` fGA?c$${owE| 1:3Z˦վڍ pʪ~yTrE}EGGPbƋ|CEv>2՟Znͺ e`+_ 9/RWúqCu!1.P5nf q")l<%U [ĊlVNSP7~! %zpk,cA] yzχE*sݨ8@A"Qp@2}]ܢh}:9-6;𱚘t<5㸸<\+3ǁC1?d3D_c9a3S6UsC6-TLsR[":y5dޛSvcTPz_K*{CޓQ~GHD|ejF c/vaʀ !;vC9s7Az*Y?Kh6c<-w\јkIZ`.v#Fda 0Oջu@G> 1T%_G\ڗId3-f*x+ c~dj_( ҷdAlHݹQGR@8uj[?#`oqҥu?5]u;DGwWub'j`S&z&Gx\=T͓OE;?Px1C#2J( ^]Ѽ VT2-G+qqD״hY'Mߛf1͐֯2~?o(v|f"z~hyB6>+@WZ'K衟7\$dMmk*n,,c6R%BضxyGbCyr* V "HIUR}K?-^A(XI;tIjYY!TK쑲h*Bx 5#1k.V S}`p^ w;o=PjΖ%aed)}JU @B n]kds,ۢ[ ohD';a"Fogê&(7 sS~Ohq,k'f6t̓:&[xO<[h=:HNpESZ䁢vqILXlt[=t[D2Hea3 QKxI`^Ԑv ,Ӱ o _SPW#mm5"X2pn@!ռxfIw; 4 VhЄ4yБ߆|xҊEƲp5ڬx+z ֨j1'OYՖ)*T2eZ%V7Q i4+p-e_kN7YC sCNT08$ fi R|+:XodVvҰ"?ˀaf 8)'lf.KekV"o\\qAJ!ܪc+d/ }1D ,D+V-Y<=rF`O6Kf^NGgX(CJN2 1J21 ;\6`_Eitqn ()~\]RqtQqLT$9C/meQVcpY9;A%mM@O`.ΓlM3 "Tg16#_stkX` {og88Cx, ߵW&M?3iFJZI$\[ޛv<bE=†{tYᜂW<Ӝs RD42 o:d:R:zr;s'"p>A JٞDHXx ۽P luF_Db&S͆c/7g⃉"Z*Mz^-P| |$5ø_ >52ns䏬?cl D9:Z$/G@{v8_22/sfYe[žVNT!rޢ(5v +|tr>+6ߠD(`6]uDu3*JV{"rrW0xz99Ӧ,pohwfF,>#jL]Ȥ̧k4]\!Ė;xx/kÇq ]S߼5\,njy!IVJ+:s^3+N㠚Sc};uӵJI 0oc`gb7{#1g|Dr0_/,pbƲ"T8EI{I}9='@l!%cRL1ZDd1tp";Z/."[C$M?**>c`$ݩ0T7La]7oxe@Zo:ez%"+m\0+1ߵ ]J3[))B*;FLBIkb zC-/B.a?Ʋk,}CvzWlYEː߇6@67F'l)S|/A͢^f'h|'{,#<_y.%[?륈E9r9?.\iEA"ֿT ˬ;&k9޻4_{p3*@lZIAJgP]W#|> JGN؎aE1B!KZUKn:p>os35gYP:Y-f/!h wWS)7)eANrwÌބ\u ǽ:MEtB%,o3tD]w]n| H&=!f}H[~HV9_^#+W:C*&iNw75VlNv]1cHV*qʢlEStM4c&t{߸^]-2ICXiE!-{"?KBwh(#VLyG^J̕4;_֌l`Dmۓ1%4 I"Me'uc f.WYёCŤL@+:u򁁣ϑi+`Qp< F##2e @|wͩ;3n&2?ъxL0G%qWR$0 G\vy~t![af >YLƀc(Nz<~ҳFMWgC|*Ppأ!vW5o91?] I92B-,DH >!ڥn!"W6P.X+L*H3((+"Tn`.޻I1y"_ cJтaѓva[WPƔ~B3KlKVh|r!D)́4;HL6C!TZZ)j]]]6^ۏ$]Uue|otZ"ɦONĐ7" \j)  1xD\"[~Ϥm5>˸qw3 M&<#ةzvO%R mm,[ m}G47QųVXo ,:%;&'qp01aݧN: %"5=l|:lv]JVMQ?>L-sY=]apC> uEc.ʸíh=&~iM>m$k! J6 ) R8ODqZXXYи3GJ`|9Wİވ.7Yb/i2"-F,4[±L'/ hw_*˗,";ˊ-BBH J0]α,83yNWp"QXRAX\;b.v)CJ \z<4l=QEʙh͚4}iQRکk t[C><4b-J?ˬK1k*""H`'W ZԅJlF4p#kb'i`.&6&k1ėЫG& mX[*͆IDh]G-z/oȫ^_5ԌfyC 2VV$%2uԜ/֝$M@`'髧-߶D`Emr +oO;}4Y`M*6X9{vȣ;\M)0FjL Ƃ|dq쭷Cy<;ǒƪ)IѨɮ's|!Q%`(v:޳X4v~\ЇKd~Ihj>t!SU7=w3[*v4t^_Qj3ZS1r-Nrl$WDT90mɈ+޾fBmN28 UX^2?*G61|m&۞zci:w k_7ܞ] [͉q>aC/_5xmxVJ"ёPZ]GhBp5wƦ>;g &a< hƓE}|Ϻ3R7!P@ >(Xjz eā#JFi7)^^2ǘhDJ>'LBy?k9ݿ LCuj|̞Pfܿ=q n}Xl h$PAB\I`Ayv"ʠ 6{NnpHK5^4A MU<O 5!INwNz+L{Cm&,#Dž(G##,Yo5])=d\gޠ}F}.Np,e1]5Xx>%h؛_FlhQ>1]鑳`,@tKl,>\ je@־$UDg [)[޲[]gx=ynI cZJ?M@s\r@R=놺ŽMx);5U슾ɴ+;ޗE1/=a<+\|HزFr "!#`V"U]5/GS{>Q_z#t8{@/@^wH1xIAr QŻZ>\0T HDn,Y iak|cq2?wF,;{݀uF$Lv/ 0ؕ6$дvl{+"֯g:޹*]ʡMaOAdgMMi`몡|mw0Ohzi!̒&穡 S0{FE 1%PN:Bx~kšU-a;$W/_;O $ vRB-bJ?wH`#47Oɥ*9&qPLQ!4~ ͕L=$F_L~mlW XMvԲƲˉ !/г4H~~EQ;?wLܲkS[RrF tUZ8d+|B5t2 8ʲٜf{/dޯBY~ssE j>]T !o^3c =x7-30uQzWt$ZSW9rxCSaSK onXŚi.4эAфY%/@g_ <'n J$}[T+]q(<4& 5h$;'-I. ס0>tEa?@b:W,qxƉF3||r}nUZs Mm D&pzu8LnoZuT2#}H{a6n K( teΉU[A5^8=/nĩS6*fP?Y%L#8`o|O@Ug:/h:I6LӲj/agW3^5z1ȦuFNaVL!#>7AhU.Do*.E̒|&M)@Ƒ.\@fc>+ai]T) _рV0b,#gkF] Jv+OG|TU٫2aWSϣiqØ)k#at40(v_d$I9_/{[R٭glm_D:\-jx n p)¡ Sdݰ? {CoTwl4,_x+z$gpoͼ?i+GEmѼVtU+>GAXM zs 4 -DL2UeWMWTʔn~"9M~-᫉0R<<>gMI/SعU@6~4x[ړ=|ĠQ"鑞fd ΦIgvwٮmH^\[d d!lk=DGum6^#Rt\cfB<'fV.dKV׿IZ6Xy2qcY=-Hu zGwP"٨+C]~1\~28j"WUqȟ|6x~Ljz"lcdF:ֱWK9sK7u_)x'ևg!/ nmԚ;PK@ U-r p2 ~>%މ҃zdpAExNtHՓcd+{!3`fsc˘P^vC}9h Zk?9W|]wWwG}Mfߧ PPHһV7pQ {i Ώ52˻7]0X@B7'vr}]BR!y*,Re:͟)OWO8:C % p!qɺJ5O &lGLZI<6=>wv9FH38Cs 4ED4@j#3@1vo]Z?r#I'0/:Pr2J홐嬋PQ.7xAg=Ya hf$WGv>̐<Ƃ͗rGU2զ nx͕Jձ";ͨIRu iT|+(mDNkVP+_("%qu+[0:ÇQoי'ТڵȭX6 J<վWU%\>z{ |(pOGD2*C{} NE0uce+R95Uʩ$aw{ءB9ɔ {pk= * t=`@Dmx.?Ur~nΜK辊He1EBfT[6[V*`cdߚvom̼ Yom;`:0ޢ9IhHMb!wԼ'Dx:jN(Zw7\7޲:^Y3+fw_ts:*ʹ).{*$!oyO;RZfR5>|3.scJd塣uϽ јL&> &W3ȣ[Bx],6]p;u 3>=!n/Ddc#B׬\Jrkp#`$(E9mx; ;R~Vu&GyyXȊPZ<^IFTNQN]Az'0nNp'Q ikll%)[W{񧀤Yd[Ɓ&B&ܲ,I߸Ymbo¾'cjiHXH-ͮQzNoȈRG{"885t, 'IBDtB"Fc9_KjdCrj4I=bԢp˜èp_ä׊c*yQoz.8#Ɛ,:Ir#6A@km8mZ1ؾY2i+l5\b/Eءh~% }SZub(q9u6p*ʖ#]$1(~umU yXLaKhxVKפ^ 7KFܕ1<.eh;63|`6D\O4:qchv> 7&p$?Uތ~{8?cra)w<=l//zZe=GE˥<45hCކ4R}y&bf]xR]Z ~C\#xY.\!i'eEx)G/V{2X3lk\בUm}^pSrQѬVz) $0[Gt;Ս|s.-$B`&y4F¤VIgL4<(t=4 Y8(o8oLIZ1%OQ1ˣV!.z}Prez}Z1yxhM8#>/yTq煿ˋ ?akʄx#1ځyX4j86r#|' k"Fv+ !=6UwRP Hso$;޵vZ~م=n'ZMX* .UnB2qp1E*LxGJz͓T(ߟRT?qJfbaGQCm`݅PzxF)o6@qUMIS@׷廅rqUp e=UT8)H G&5LbSfWJI)%9+Ljںo~9 TХ'ğyPs嘚[`B2 ,| TjsEР#{ AgU9,U&ަM3 WW)sGiAH-P>MU醵Hy1*eS+)۟uKɆ+-ZYu"* '$ɼkTw5,q~+XfLy#y-#'i߯r 3BgsY{m[OD"x`%<x,{QgAZn ˙EB!0{M/^^"0_O|TTdz \ݽ\*ӇEhM ~Qbk"GiPL8txtG^}ah(:R|m7抇͞;aY:Rox>e3;*+X'ulċŽq-J+kz_{JM$ʗWO}I`l6 =NAg .ENcJ)>cʙfrbp8KM# J,]^"4'3izvϷc1{09#=!{|b=I|\!DvcdHV'$Hצܘ"GP—K<ƑɎT@ HbD ghy1O7d!@t kvBUm 32g`fhNl>ŗOXS AC'4%C4*x+n%9xlaO(hfP(:ը3FQJ 7]kC]/DTm ;taɊy˵fs4q͌dw  y^-]GYNٯ8۞L/(+\x7?w* i_ 3|T:n ?_5\+ݒQ2jy$vnԿ9e:epL>ݻ!oEWnG}:׀#$ Sb9D&(] G-L VZ6b*,rJy*5*0 YZafex/inst/extdata/plots_rstanarm.rda0000644000176200001440000010735013667760652017374 0ustar liggesusers7zXZi"6!Xj$])TW"nRʟoÞz .nb U󗵷NxiJ=>kUXF6A"#o0%tp\26ۦ;e"XEj O>-*{cЍl_b`f1&̪KWGrb,BCfao@UouR̭S i ZMWWI$p`K3G:,D>^rj,܎ F4]qz<g VO! {n{ȸZKo<?Pz~@HʼnNPmԌ7&Tt -g0}s!f;JSR+nWq$vF5$A]i!6vb,ӡZ'k31Ǧ@=#H]ʙ `ͮTrX֢\577fKQ>}U܈ q[hM0^@zi_~@E44SZ^s3;z٪ESPDα F+eGUPTV#gĜW+n-JyG2߮9y'3T<] '6Yi!25hitfҬGiKSfNx_JF,P 37O9WcR*!1Y=%t#ZZ~$z-kalp~E"9~9mT{Ho!ZL y0*l2RϏ1~w˔6X13]v :oOjqz/L^̢/esʂY1{øvg+ UN^H+ObE6.s߭hH`&4!mr)*j6TÔIⷭamoʬ~Z4c -.^Mg3.ߔC=@dPQ(-FFh. | vT]싱tV w߯#ڴ|10o҈ϋ~hm΁"=AQ;/i]js&ݾ.bLkڦZ/.g\_6TPUaؙK{ǤˏƷp A6T<^[]dfMM,oG* AN@IϪ8w'x2Y9'|ivRSB9;ˈMA$C0'_ 1ll}d -r#RcJ!<N419aO| QUmDbK:i;d  61+C$74/Rn8I΀ҁ:QEKq"nPr oƙ-QLbU<#PIذ5Tufgɠ5Wk64z֣g)jF|m^n"h)~& Ab$K5B̊O7-ԍRR (SsiP8 4M*vVO~"ppI'R.}o)deܭv1eAn9vEdIp`eA+Jc^L7&hwϠvBkhe"\#Yzn{,w8*nh(2Lۆ(fa-Hk|ȳti()\ vebUzҕE`\w{ň `x 0ږljv.wQvn wJӿ٨*fbH[˃lޚ7֜ւbSgy}`sTfWCnB /~e[8!쏎Kiq{exm;o.a:>믞J1b匈_n2 7ǐRO]i?)` =Ķv>Ҧ&y>FfџXI $IYR`Vo =HU0vz=ķJώl .mTgNm 8*+U{VXWaΔzp]}Dt;/ ~"Rv;Ur'Û:>5A ^(+HLqkSyo(% tsh}ް2sk! *NeM]Cܤy 2PfI7-Xw׀qS cTv} YCs."SUG4RM@0Dgopf{#ē I?C GsԚ,HwBnοCvxeJ|vGݗڥ̠wfa >U1kLn'c}0TrRZF:B5</ 3\0qNyr) ~f !ИVP/hsS?to;y;v 3g w QS+1is[z!;c}j?{? 39.D<"=ll~&Xcݤ(ou]hy]:ƔechNE=*Ko|k=Vvfu&@*{<0ar|cq߃>ZZ̮NVWD聿y[lz"i CeB z܌0{#XN'aY#[UHi| Rb&W}I_Uƃv'"Pi7ʮ=lm/Μ+&$wAM8j`LT,eoSE^gRBM;nP /mеG Q&(]zx$[HD9]iIGvf@ &}Z+Wx&`23$6J6 ,iZH ΝT& L҃XDJB k%-QږAFd@j2ϩL ZVJ"T8͝pDK96ihJ'(1[V<%Q *5f>`ҨR!0$aNS)ObYl ʩsek:H `LrCn !T9Z;ˮD1X5V*}Հt}b!3^xx'FۨQ:Y9R[5)+="wWoQL -켄zX k6J ( BcD%J«L'\w|Gm~kdsXuh9.^c_G\v{ڶ/gSUC+jM@yu_|/7}0H*]2d[a*'$;:)fruȍ#x+xļHD} C O1tBauRSח+ͬ] 3AJ:ro@) Tkִ6 uN .gn!@dV,A͝}ge3A<v7 a'z0uxߘQ.(J24!6:nFm_r~TmO|| CS99P޲@@w]C8 8jmtGj. t y^h>@+=+ bJL~~<0/#Ts9>vH3\i ^=/u1݂r[ǞV1ә`ppKgD&0!U.y3kjq&.ATx=KpPc"E}d_Tw:/ ZATpwwJyK[3&TJS:7TUT@ dzpI{B ^_4ADxT#=QE~`+Ȱ%!`kৎà(hΡQH歫p ^b %H\ A?Un̤6~c4ݽHC<@݌-ţ?x#wN#_Es'ZP9&@iP_~HkD4?Q"Myn("vMԑUTzQLp1 ?^mKW$xeSM ZudY\s ?~Vm*V~9H|\+łlYbTAy]wP{yYux knϢ/è kn uk!rQMiRQ -JN/YFt!`F^o(R"2z"1 ռjj-:>̶hU%ŕ6)M#R;D^&cb$k;+#i4/4%ɚ`ޱ"bM_5@{N&Z"qۇ"9g@ɜh Fԫ%;fX נ[w9N4pA׌9D\e~-#C?@ᆷRA,U1GڏFiӴ/D0HWE$ji#D ca+A ͉)#nDA@t4>[d %qƂuF|d*0AWGZ~U/ekAժxPYH\TdB@Hϩ>ǡMOhα7Ͷ=9L vs;uoa_x95?i6|v30RWh=xpx3\i7O-ꗥ?q;a48:cAW-h OFLSnT2:R Eţ&]V@N10gX[vw.@{E 3$b/- CRv߃٭E%| qg {G p%.&-+b4?Csn0=T*6( M4*(˴eln/8|=!'nrxmFH7LBQb|e9y!<^qcϙ뒯HfRα ÍR8ےݲN&pod8IZ*x^](韎[efW@Wɤ!tv\ ،4g6쪼VIU&/mW7OcƮ{&/獹7QKQt}iq"㺲E5W^&m[W:$Wںr|"7Lǭsg0$5mڟA†#=cR=YÀܞpG^sБ6hU0 w]IJ6/.XQRm m\TyՐQ哢dPU  4̑48߄_PE7zZnpU>4] S|9s_D+XF Ridàr7?Q̍q7ލnaI/Qj,gi_U-c~sńǸ`T2ک-sƷU_?zeцaܼ9D}sLypy9k1::n9RZF_HuhW5ĝ7Xm:NFT(m|lԍD[Azѕhz[ͮ4a> }j+RJ:uU2}$ z;yLv AK >4Gk%إgN` &-\a҂)c=[;$JB6! k^AL<|X̖ω4UbSwڿUz" #:F!lm_,eϪ-K xTܵ=т=d{Y>Bgf/DDi 7 )<\<@=/s=q3 n8(0OJ nɟn_YZ>%S?*U'qE#G\GkpXO0a }S긠Ro閘_h;ppxu;8pA)0,$BGՃ2p*Q||i%z`+X ߋvdHZ`ۺiʭ}pBtQg,"e&"P4N(нtNAH\vRUM4M]p풬 =ʮG vgn 8+XPp M#QL0?r5SbެLYM"13#=^c; JcS0} !b<{Ӎ}'GLg_{h,WL#ڀj52R:}^!R C.jFy/F (L =BZOTF6!;ɋ;,5P xmq,f':Vs}Oՙ18g(D,>N\[>3Nmk*E93Wj d?ܩ$UGWSB7SM$I&"!MY7]*iѾ+pFPg86r%ke#$S%>of'fC] HXw[ yFXP;(<2dfn@]#.0\BY670cD.2&kCbn|8$D+v)bP@^_8$R$$ܟM. o~N̴g d3^?2kc, {ucTmrtaNΥyКwM;պQۊXA4d;/ S"OzINUX7J*vd#0f&aI(zc}(jta //$[.oӻO&l/0~]m`C%Gy!AZ P5kpj ۣfԞAT2ALi-weYAh4P,="@W wrXLa7_go7IDrlNC,>:̂s-C%Zw;&K|F:6x@`|N%LQ0$r\BX׏S^[Ǥ:BOEm!5}]J$[ 49x wL8*$] neĶg_bWkG W!,d,h{hMiJ8?ZMaR%,>b{^wn^'Lr l9`h1ϧ\ɴZBQǗ:׽ibv"u, Sg՝qdk hd]ދs4#K8ˌp`y$YTJUǢHv꓉^ucPV2KZ4D ~47 gT#CfaY!͞v+3o7D|uvK̫C8s_ طKm!96="rP~qy{y;o`K% H^gB1ǸOLγp.#5QH0Ǖ9.;? = C 3h%'f:Ўfk*WؿΌdB 2`IBFֺ0MOD16*At]ALvp(2~t Y| `{(]R=ҡ~~I9lu֋Z ){⫌`&CㅥÁlMy =7g(Ψ>C^4hv\Goh^A8vz; ؼZty:@H2!tQvOǟ]5Er9n$tazhH%^^0Vµ>.).ƣc$C?2^v~!76羀i|qLN&1YzX X:|AkG >۝V.F N/@k].cW񬴩J=JpSfњLm f TUC@ s߿ 7O^RխZny0J0fȝ\k x1^_N?5:pp[t&]oSDϵsO$TgF}K:$Ǥ@ƘǢ]T7^Æd0s$&LX>5ڍ;YXRt=Mpn<5>bO,7A cc+^!Jh0*0W1p7Cd]>fxT^5~=y="v{:?{6OS9qź҄Si;`Һע&/zF1-vi tmO!pvlgI4#8f z} M#2HvsAs P:[8ޙ~ [5~4:,6>J:cD2a3TYe2 []z B L˱_% 62.!2+o}6 ̭\DTuN~T2m%2`ZfwSlOquE|K)6N=d'f7Xu2"<C1ljHncnfgzY_V6 ѱ+1m&Eo:e13t8B ;BqmIѱ0/mqI@2*m,..4&SIZ%n|M@P`VJdKy ~<ȪHNBK\ w1jiL1Q^}jzxd:L CѼp:FegC[`8deaDU)Mip9PQ,+& 8ybaS(nI~f'KA9EjF!U+g7?|U{s,fU >lc γ- ;5lP{-j^`c?"7!k( Vipa׉eNReڶZ =iӡ]SCm:G<`~E>>bݑf9X5a%IzLSX@\%hYv'yC0P68njN: H 0b^[ [Hz uɦee{ڤYŪ`2n!4^1{̲ErC tCT I*JSh;oBJwǢZ~LA55ޑu2Jy_&%VYh);Iff.w4 qV?ΗRpճ>#͋'M9N<ؒ3ʓ^4r RRzM;H& L0k-f#l߲ƝAcg3 4u/є Ohn$o t2nIz?Y^ExuϘ-l 9[߾iqLӦ Ms&kڮ_yq@crE-'ԧG84,~ }h'xP >!BEkb2@Drf1:x{x& N[ɰ1-ӻ"C\G01Vy&h4T~Ϛ9t_F10ȽJŷ{5{"q󳂠J'}/x;+{U_Mƺ6߽zm-#qȸ-u[syz´'&<um"SŌC HI@R.cEl,|jcv?t$!U:bݐ<d8Hu˧Y M}22\Zd(?J4< F >{k9ƫy[ 1U%:6%{mO|E|Gϝ0wIVp;^bM ҬhE I!+5C,ZE!.'%YmȞiqWN6DX e7|EJEV*2 uAyjURM:5eo`JSCCwlIӪ s8恁oJVXTo/J7A-*QL·tOAD~ WgO[e~g.R]YuY^KAuTׅmv01z<莰$\$I/iq:bLh"ycvt&эަmƹL8/@e} RܽWʅ] `mx{wb?d `,\L< hHHp [*a?9{kIðBsde>vغyS)"b~T1:Rˁ#كV9/2׸NoyېE]r9 G[̈O<832u3^QW0f1"}*eXJ:BܶP|pI&5AF]fHSD4pj~v.Zj1X^3zd_PL#o%)lY#-5 }r-vt -ФQOޠE.J=wͶ ,(Ɯ IvOˠ cf#Blm:|%Sҋ[swL a{k5ݱuԂMMW-}jϞ4)LJwOX"r'=9_C;Ҩ7HTBHfk& Vx1Frֶ;2?%s~uѧavB8ri.zϗ,]b= ?eGU̇YkOb bL}g1=6\Qn4rh ՞J}bX9JAg l@Kn.si~qCd[\b2pǂ(.bBlFgy] ǶQEZoWk67;ܲƣ܋#.1`Kb $ķ֗g`X}pPExO|hjyH,wd>CGkZ OugʔSu{&׃y5á /̶{: cPIP0VɤD閬O _fUdKC,tajId~?ZB>\G.A$IЋ( D'Gm{VikGj,*e]0!-±Gͱ=K:,>MVg}Q`8:{/ U'i^֓7\a!]'UNfVRix 8zQW_E֋bGAgJ|^ )so->K[KBc+sh 2=S!ʡ\rZV q4ec$zLt\nPNH:C4& g:|DKu1;hZdֱ:t((Dc* -%bTV|]2 y^90$'2 5Zv+z:v:~dYef[20-O}0<%iߌoVSqiB$ 5_.6hу JM!p'4dltF9_8L2 ^'+a8>C$o̽kztQ81c{A(4Öy$]ޫB}+rb5[r/cN Cmity;ugվg=[_|jǒ76x z1xNd/--p&oD9_6U/FRtu7D̒IπY8tsx4B.%&Aʔ.2fgHtk̇6 .a^hoFa /p+ܭC#=] S.&aM GUE Wm?E 5#erM=Kp'ӡ3eρJJi`Vs7z?s%p za'wU0Iֽ.W-KmNzk|5BsGܙNl9TԔj;7Ko#!ee(=䣁0fm~ޫ Wll mvr1rlu,"*&`zJv̡ gN{K%H;_GCg/LZQ?JЛE(җ>O6)oOF^&y^[%_; HBƣ2ymq'XW$P{ +gʌiYabDEjbGfcS2"e<4x_%px^ۋʹu)jO^H[icM*Ib$:a_vˮDѪ/V)D_poȐRz'zOԎ篘Kl%]5.uUFȧOcD//)8BwGە?XSu_-s4P5k!Wt Ka 54<5]SJipQ:*B`iMk'Y%s4D'Ơc$SzK*#% `߄vGgmbxr&0RZFXRͽ~ (i-*0ax7 a5XfП_ch&LAwg 7%r}jd, gbOp8!Y߷ ԂwIEU9gM#@I#ygq\~miQoOwO!A.p6ڮ_)sypa 㰂+(M5e';3Ykob-?b0g2vs>A~tiB.ن5F)3kkQ`t{N Hֱ!,>śODD "L {6`I6<ew3eNnb |+MTޏ@؂0v.<m)YӰj߂y$?Z kBYx҂MM(3x'd]ls|Ty/c2-t|\v)My^xg b^y8-=NG ~ of}=tfuvB{x,St W/uo15v:S侚b:?FϼLemט ȕS!&F'z$")#n7/% PH+W3D/M53twM8Ԏti, LV`F`dڡ\.rk8݇c[@)#ˎKO_&bP.mDusd7ỻܘG4_ڢ?uJAh-dL*~E|)ؘdeTMoG͢5M7ZV^qPOk3@k\-/t y"H#v `ic&=R˧i!q1ߤ8wO6˼4}᜶a=x٣3Pq8t3[E;حr0 t"ɮ9F!gdG&9.*?;@\̓?]E½S5O5@Wo%'mNTzvolpӂdq` G]1d0F ^,Qv{;<[Վ /epw7l*As:wT5ﶺ g:\=#bY9~VfndF.J׮𦵠8u>@'[)nuO; ɝ(1[.`?t͐ #WdR$]d ]^jCϳt 2_"VRVsoshTܤVy͍?@L3z9FqtȘ"pb!:((X[s#3ˬe㘨LOǔrD^Gg |́ב- Yily.9ӆwU9T٪8hDW`BüJLn_SeM-)?*ycv!2Tsn$"g̻+GJviDЫǻQ~)V=,+DN569)-vG(x%^BZm͝H1^Jeisa^*p|bYi9ϧjwUT?ƜP%͡_gdO޴iGbDݗ0)O$џ`k:3pE7M.GA`Nvuuu+ GEZYI YǦA(142lW0m?vX|N)Yp Vً&CM|?rDer:,r?Qn}S4/OV|SGLrirkkGh'o`L*2H{f%u5႞^dEet *m/ÉyD-Hڥmo4HWyJ68b}/10DŽjFtn7b@"S_c|'…[|+ZO# Sjj7x<{{'{m#t\#,;K[pVI/#:SɒT+GgùЀw#Ԅ~'q+\uVQ{ kc-3}9<~Zs}ּ1z>s&_/bbϱu4Kg8j͚BĜ1!wɨ-F߳JH" `dDzmB\DŖFmHX:* v&%d~U_lhV7Cȕf3 yiex / k.Y0H~ajig' AN|p*C3!ۙ̉j[Д?W>?bNg6P,C^ K??;CS,dqp/3ԎkyK ^ƹl ײfi2Y 5W 6CMdLGGV+ r1~HuKtu֫bk[KxP=QsY`XƯPhHO;\1nT73qrќ0sg9xaCݺʠD2L_3)#6mrGy笹Upܰi &g|+L=A>_ L֫to@Gk#/)Կ^E?tݸc.݉2i+蕱.,WIC`SkM"ZG'y ~OVte@|ҽ@ps8%C 7~qc1D{OQ[UV?W0|ߒ鋸V&{đR6YPDvV8V&†a$z!$r5W` ~<Yc PD,x-11S8=Hs'%mY m RZؑaL+Zs|EEB`Xl VJo6BKt|_0U$dh27*))vz뺎.} ؔgWTz9smNijەH. +r ;S9G\bw|I 38(yuҭ+B%*2*ݟs5bbO5}'ۂF2'":*.AqgV'b|lݒXHh!NF‘–#[9A7ڞػ>r+)0hpwyܢ)E 62%l67ӗ^΁hV7 D(6^ɰ?`M5E8 ײmΨeF꓈׬åzƋ tYI߬ c׫,ٚjtW :F]G9IQ)e=q chP +qۏXg.C,:MW^ձ'(#RoI0ͨWsJt w(7Tx?ǺF<3Jh/)fJ,Zur0bCpbnں-oT_W8LSh'0g:٩j9( ]Z q6֕hToZ@jw)\\zz"U8fRL CG}u!\(# |=PbJY 7z"S΍%'j ZqOKAg$M!O[n?JN.׵x!`nigZ!#iW' (,%kqBJٯ,\<rl-Q)p PvhF:yGS/z7jFЇ^&$KHSP0/63=[hq~\^D`k,G=Tn~QX Dդn|40VvK.LEҊnu\[A4JG[śЦI>fd8[@hvX k6f=Y9mȹ[5xB*vIj4uf乄^R6zo Mҕ ؉^z/=/ qAb3_1˶]L1t#kCNeAM,J9b{yxIqmQ۹v$)_w_C>mn:@&c 6VfJJthg4L|C9 QMU<h'di"o7'u_$n^nʈ|Ee;O­QQҋ0bldp C $(]Aaj76oh]6nxʽ}9{|pwţ03.ӈp6N6 T)v-r-3U̎H5Xs];Rb;Fct .#+E-`ȡ"Fcm󄟯s.X>FaTgAmkJJH9%YF!n]6鼆cB;яCvmds ue5|zcf9!3h@nX .y'G/Tm4lDUJZC;.v#G֯~2)g;+09=Subn+^!s QtЬ DN79tߏY+ZN֗1yC$sTk=R+g7vsqOf.)|W\EpbJ;T~4P5jJrNjM܏tҪ-` ,NG%`)4b[FI[EmŭCP͹6w|pDx̽+dR/.S?XmX>f|a6Ց{О`-&eTP-08ڟb'a$aޒ×8sCUѢ`&MNu&\ߕBђ)nFIӛ€]hQIyH kֳ99ܡOd͔\Pj@9BKDmʋrz;HoAKgr1+ ;Cv:}H5O&ʕHO p6@ͷ>&ϖHG1K6{;A!P<0L))Q峜J`O%449vבr;GO$V4Ei *Rk(?;Q878XN[5B *QL/?=j.Kac/YS^h~vQCGBdxҊA1 Ǭk맥+TYkiI^NYSsgd-0; myrq~[q?l{Bj@,l+.y76^o-I ߢ+-)l.'AħĽ 5[(qnԋkHK#|..4@BjT6`0uw4ɤڊG|=$Ja [n@[f:]ܲۛ|!rSdsuD- I*U6ttJʡ=/ԧh F[aF> #37~?7\X9R( DS"_^\!:wQ/1 +H䘑0ˍCHBXQƮ@纩J{T7S=<|FY"Q,)&8SVNraޠ7>2 N AvSek+rrlBl̨o,n{eƊP:EyhNlu͎1/:_ū_T{&<~AkÈ:0M)>6f8"Ugoa_ȩ2o7 //#RcUl hN@nL!FPS2daDI)B)yU}#ڝTDymFGf|6(4)mw>x*>{sd_^FVUGU%aXBTGhY-ð.nC7gvX99/Ysi\81T ms`3loqrd4ۇ}䅈h59jhMn!Hh+tAx{z>N XVңL!/2m Ɯz' Xy<;lAΠD5I  I=ߧf%5L=BNBE/V DF0]jf/+,!Q{e}LRjwkٵTAxZ~@u!! )Mo)\Nˍ6U+"?ܣ{PX*Ix l-p tyŘ+lŠ60 us,z*=$`?l?͇L,4ͅ@zE?gb.טNGa{?%ѻ|OOnH@Vsw!u:D3&q.G!1܋7 ^h$g#:YMUv3u TJ}; cI ##ͅ =+|#~O]qJsxVE4w#l ۙԳpY&"ݵR{UH_1ZSZ^Fw εn #f'+ƂXxF6We,?U5g)__Q,/?Z"<>25NE`KD@ 2W\ZIp(NʸV}AHcäN&Ko]{9moe|5OOcg\^! |WbG83( 9AN!( y=7@&]eEj ~dz":)_^ʼ=l2CQu˞vH/QwX~UK7Ku{WvY+a8i|[`3sIjޓZ.wN(j:?fط+mIė<46afuTǙPX"bqJCIӄ`H8R؍%ī&&( R ӿQ$h0ARgfRXz:#Nob8>Y6?Cv 'Lze0谔/ο͘O4b4U|Q'ao}GK° | ^kQM7 9*3&皒pSIXRҹ7ט1K@W̍[HNa& T[Y %yīǬ+B,zz8&9UBE $eCpg ࡜nؕ?V[3 {Kdb/Aw{Sl?b]#',(T͗ ^}0d&5`[dĺ Fa5@1iTuXbU8T֬qF:7R{C5'\ɯ1h%l* <lJ ı⺵ KΊn-CR .3 b=$HVG^0E^Y Pդǻ&@E;abЩnc~wAe~f}mI愚 SH`LЬ0QJ]=o&Ί9|eϐ1}ӟMzC"6o]M~q'ȋ6ICz81c=ᡩnp&I&)wD݈)B~;?sb+0"$h?bԠ%[8GQZaBv̡, ]Z05&NOerO>SãDg}xKM)z={vM~UqnJŔ_ey?h'SOiK&KfcQ mHynkH~+Z-%a#cMd t@w2pڦK_*c!1 ^6\4b{fDMCg=|*d']/x0x5lH,S$6!S oma>z5=ݦQWw\`Zg CFE,|~Ӈ5]Ĕ[N1$\ BRj- 4냤M_Hiz*Ӈnx^w4 ڤT_mb;?'Pنvt3 ܖaul1#X!rCrժbHV*qe:KN7|0)| [U֭gpUV`s +_;iCn p~(zD?qޏZQ!iɿR ljr<9ߞ˜fwFԷH5m ݪ'-l[Y{1Xy4vUݍ"ӹ\v&W2[za8E c;J8!Xh!k/a!4zoRDC>:U,|mcmF˫Z ĐT[>L7:NcR~yGOѼt"n9;2PGmCWRd)դPb!!%:⃇ VoHNڦ pXP:TŰhg&#K#Q/&16 w5mxv*R,aͷDyb@y hE(V: R&lM#yA@lh)wqx[8;}j#u0Pُ^,ڴa Z#i>ÜpǝO_R@e.VX0X i=ّC1^(ozO1.03L}gomte>UF4#cm.rOzJ}U^/R S=E(XBi`8o?F^^dgyJ '@9R0o@)?!bzdVe%5b^Ob h DZ4R\%ɀQ\%Ѐm7| SQ^-]{i_+~G K#SGDsZ_eSm2lޭ!.bI͛ R؉Hz^hԉn=Oheƨ8J6+vJ]K \)!H>0ec_Ɏ*p)a(f{XA2\o!Ci =៹ێJY^GikO"jD@ c% ym pBqz3sCV gONLb'X"׺ߍHAK嘲+ d%ush_#=x/ J+ caډ;#q^_jji ~,Jn ܐ'37O9!kBȫ#1]vab6&Or2Qp56 hlI0Dwbg:I !\.jG ڶ7 IXpy'~ UUNts7vL[KݥJr~`MPbJ-÷ΏbXĂ!#0lh&UMG;/Uh =HV#.dWb8'-i ?m]E-DZhvVϷ Ao `h(U+qsr<7AjsY.f]zڵGQQ9Fdjm׳+h^SodX8|P}9X̀#]j) "NT~aLgVǎ`.p<=6!.CP0$ !VP:pYXILY*xy'WeLtf#sQY Ǐ]L{ޚ[\zDqDfpx|"Mu6z~0%/5(M&$)zGWK`EWZ։kpP}Tip.9ԯROI[sgZH|"#j8>mo|2$Ó~ȇe:͂Y]~/]Y1}>"X1l\y!ޥ iFn2z-~|z~KZs<~qyEwAqRzu5aky |3]A x6S~! 9ߕ2TN8N8齉oǷ|by2*Aד8fLεԾ[%ZxS\~hi܂wΘǽ +x(ٸcl6TCي)$)vhE{H$!dż_3\ )AFr 1KݻV7)h& r:pz^,'j_Yq<$ WΟҷ.,]} !2g=xCmGӺK#srd,c;}bka!^bRU2S\0dV[Cy 侥4z҇dhϏ`-t,<I{[+SW+6ۃ; `d(h^^_5m .sBfQ ?@p8,h.C^N4QLbbO P@ .Jnw冑wnpxߴӠ"g!CZR4?F)"D]YhC޵}BytwF]:c|ˍ}ܓ7pm7{C0`OCwGVEAS3$,fhY"р'}"JO^קۂMZs—iXͧ_^8XJYcf> *jAO댖xK Uwk-CyDjkyS# % z,pIWEJgp_s\៑Ad~N7fa<՞nm0w9{\vx:J2zq;>}i3 & ,uǞ2M>EY9%ܞTho{OrmJ-jYy\mIKV2 >0 /)Ƨ 74W͠kfuT3MHkgN9ڴ;u>w ]Ù,v-_!z%E7K4HܸBh嘛ٖAܫ YKwY;/Q#ziCR`C܉O 4gYUEQ`̙2ҍP~Q0Y W~Se's^Z#yTW¡=K-7[q*U|ļ]i)ԌvN#iBh߻;rn@ف_11 p[ SƇo eO%o_2kKYl$:Vql!g7ȕUvᥞj\(0TVQ<Ȅݔu{v.%챭}z/UAj[ bNUIe'P#'Ui g7D+!d|0wM|!_D߯5iɄFp"?j\]*M'It:{^FP cn8T&|>^rRR(,UaaDxI:!7TOXZTX2 9#cb.YlW]kN4+& )v7o>|:%-_I%1=۰X*rx@ȕ 4 *2Ef2:mq:jW ݰ9aU$&اJw拮7=Dﻨk,)ޔ&+-jJiB x-.ӁF/%xGXAv_)O4X"M\ZUiš8.1oH:,wT!V4Ż=b|~.l {7G"uOEջ$*XLko/YpO ϼ8wWU% C4-\?}E53knt [-Ҡiծp]b zyHj Թv&T&Na~َ\H'T}'*f%0\+ϟz@ҫp8&I_eQO}@x59*1eGgy+3W|ca|k @ˑ ɡ{p8nu26>rW!ئ`}9^X1.Q)>7Tȉ~ɳO_]com[a3B*Iyr ?& )lI(R%T*ƀ?DwS *m^vܣFp8*1aVT8Bp;wҌ VdOA ~9_Y/0 YZafex/inst/extdata/tmb_example_fit.rda0000644000176200001440000007574413667760652017476 0ustar liggesusers7zXZi"6!X} {])ThnRʠD5=g8Mr7檮z^,&6}Mބ)[ݕШżnF~VޤkAc TEoIckTfڎ~٤$ ԏ}rjy_"IOӶJ@ˀJrli${MwYy[I * ߛ4ؽZ@O|sl 5;yll2Wrr"2ʃå Y1edꐩCCC.g$jec8{?KŽYqN:UHL9\Jy8IA1WIquEyC4PB0 K;X4C ;%FdP)]`){T04TPq8Zq<Pm.=NԣoTP8u_2Bs_AG\]xJ,O˹|Й3P1wn!.2 c^c Vr@=0l%֎A␧DI2?T~hSL0[\V Kw5v:p|% S:q >|4lhWb@C9DͺL9+-h]1=3R1t]u0mjs2Y7;c(#|bV54czɉ$zˎMFU['yc~Q#-+L՛1iWކ{Vr^{\x>]0U\hY3U MK̖T 8^fSk˿P>AI3lvh(!BBu@vvkcV범c Sϴ焨2\$xOz@)Fw8-o.Q'| tT wKώ1*)W%A))Y@KF}$AڕJ#܊8Β*zFFG{(3" _xk՗}:sr!( '"s"бQ}єkn<Ŵd<=%2& 8+ dLq[ yj#rF֗0տ0dTh3Sk+:$F*AԾՙ:.Ez;yhCK\pR,ƨĨ5SsOߛodS&as6|qƦT B pBAJ!PDgUv8g}* G AӰ\E;AL2X(*f:+7EtUkj\=ۤ2 9!a mnhC٭6%P&r Mp.BiQýd2[`{n#}H8-&X22~ow`AO%o|3vIJI?[a1ôBut>m6oC&g[&8 9{̪Ԡ~ .?ഭ>=9Z?lR&#Q&t\7 $&KF>}qf>JMbL-Ҭ`BټZ`@vPXϨi0?0n:Z͊){dyt"{ӉzonZUQh" jV!A2]1ݫ v]sxEbnFu ytOJR؝˴rgvwuKšZJ 6|!$?,`^1X]];>euD쁉Jκ(,yukIlƠQׂ S0># :/)(9-Dج\n\E{$FNh/Sc+Ew X9mN\ܶRv[̘ a+dpjM KJ?>3O}aJX.\H(.׾jKlt\IJW&(ʭѯ&_({֧C:_$ksۈ6UYvL@[6*JUI21N)fE|mUaׄs.= "4ͭ5n:[{$@g_L)W LV75G7p$`= ]L;ABj*lfv\sL^|J0m?'B $Dz\+S$.a VY+jHjp87q?&kv{x -g>I1aZ(A[(Z13E-Y>AcX$K=@AM2&kPٕi@҇Ø5j-!Ew[O*yÕ֭E䂰@z)\ pȺy?ŧk ?+WF^3Qo yf(o=[H os;;d8 /)c-IR5W^'J=>S@lهP-6V@ :I ]tL`H۬y+bߦ((hp(keH5 (ׂ꼁mK3#8D["[)[*DW-no0='h{J5a4N`)~|wG) %igi~-,M Mשzx7IΖ:gmMvˌn,g(y]G \L{P(#8gI l 1 _EY/͇ܽ{`h.ؒ6[ |\l~4oƒ^Lɜս7pqրIL$gP!x5|/+^ calL }@)e.yg73Mm>NRGXdڮr ye&s-3%쫼 ӆ/9R"<7<5J{ y_޷'[QjjتFP'Bnԑ@ȼj˞Dr2"-'ӈ.e 8lLXا`?֝_0'wS݆ 7!:qv1 ) /K3y_ _#m\1}TCˀ)}?%1nߖqǂf_Z>H i7LVBB \tWVdo!nRSwY/=)BaCbo`MV)=7I2) >VD(@wm / ; 54љłk<\, ȁ1]EAh|Z>=6}fb|]9gtb/mP)vW A=2Wy D-"-8.NP>𦝮3aށ#\_ A!"bU6TYӜ!9=M 9Kӡؖdϸ;Ye9Nq,jCP!d zu $޴{),Mʾ0:7)b(,hD)1CY94*}5c!}Ǔk;ES3n?9} !Á,lȊܕ3<ͳWv}'D؁k\pB ~S 9rA8~da|g09% 'c͋Q9M=WBA~*+*Ja1B*c9[H~< _ePd,~0Pq'wxJRe%Uy3uؒ~+dcr ਒$YhI8>~O:ЂZaM;6F?Um3OԵ&&gE}+!o2s؜%D < mcM\V;=rjVoCP"-T`&Cd"R0r[3NlNH<"ɧ[L:'2[oA4x0gT}6TNL#/_ii7ĥِQ5'zmd 2 '6A`|wp0A;>J L疄Yi³[g뱽!3>2m9 {G˴=:,$+V&V=AșsS2L`{E Yј =?~XFjJ*Jbַ=aE*Ā˰R(8T+/K8vOҎńR0n^)YfP6LB9\s]w_W_2WMh9U2JQytԣ ,!G5.f @NVx0c:q:67kn|8 2xyEac@ )wC{;6_^˛5PL[]QW(׷-0$VPco`KjI&6&8>4 ]2 *P$u eC#ji  0՘Y03n tc])&S'yoטuSWЧ7ecW; 8AnzٷpmĽdy^&F rgUsJA U .؇=Wo Xh=?eG,SȠt\%aRѽ10\m6`zdto슿O֋)sl.y~ [nM?-LE;Z : n{\R'CjбSH2Qd|QT'vVѱsGڣ>}>Q܀mظM'v ?[X,{iK6L (ɒt4nAuOΟ՛jT(㭚`36F6retI״ٹF37ū:0ąܨGVQDn0(RuN;⣲+ \?Ykd[)H"b;$AcU:پUͽE P /x,T|Kq3pv5*Ư[:SF4֜f C/H SнQbn'c>U%%ciU 'Jp)#zӸ⹹YUYBT؎BU!;MdR:1* #5*tĆ19b7ixlj@BHRR7 !Z7\8 Q8wߖ~־Jޮ^eM[.?\]li}Й5ScG{U,;͏޻q@2^a{!nW{k=xZT=Q+x}ýJK^}[靈FZ͑(=ۅHqS >z~MWxߤL424;2Nxq@'xt6Sdu{in0FϦE 4ڌ16*T[pB̌~ZF6Zi0K]8@5i!o%'kI*&V@=/O`\c♺=z*7&;أON 1kP鮅lyr$<∦ |7yO ku\jygOܳK)s_PHU3qAK~<2}PI+I~m-׊x)  1_S5ŗX*.I,179]㈉Us"IMcf~g { x^3n$2Z hh"t=oRD9ɱ .`Aa;mv=WAY3)#h9NHEXyx-J )@$a7ݺD j1B # 8o>;QbG-e75)xܰ(C[a[kSEh'jZW0{mWkҁ1*$ )T W`*_7dyݜ!1ׂS}+/YT=|a%:2T<#A˶ҨT,f“x &1W;^Z܀ .uNeJ+Ӝ&Ϩ-H  ~Mו52J ZT jOg2jD0isMLy{Γ%ghKEP!5P)@<V,ƿ6:\mw/Ȓzqf4 PPGA <")Me! LBɡyIݖA.>R /rG9/oYϧKzm4We{GkDNrfΞNzo`=L$ds;qXDInLk(TFoQvrwmBCLTAwZ y|UvYӍ+ GNJw*/8]&mJvB"=9K ~m]gcZ'I&L x"ʕDYD-|6X2)MHk1j5>)=)rrOyTx$"xAuTy,+1H_-c9Y'噷?pKxlPYN}TƊ-q83.'݂~@:$2Tۨ9x+&q^a> G˕O w@*rv~+Q]G#y 䶉8|T۬p*`_]~vX8)F`-ܑ4X}Ov =;[rvo~ДK|+,Y1NPjjڨ_lGp z9JQ̌b;_ejټ`%?l$r3N%233:". T䩅Ut #au?m(@'~'@3#|{Vk?"sH ;4@0xkQށſ8/* M]dut=jujR];!ѯKa2UЅLA4C|ё'\~1c{*Ds=2+<ru^'?Y s[?YT0˪|D^Dlg97{VAAm \Y~Y$nNn?NEӺS U$^>#pPoj;Jg=)/> Wc+ ;t!=JBaTpV G g]ߟk AcHDX)Dt$#ZkƢrԟ(iOń 웾%^^wrj}IVtOI*1"~d3k>>3ө _Y-J:9:.3̝sD;q --Y5YMpR7K(A v#UQ.LeF/n%H(Mziꑰx1~?Ub[Blӧ?K QQuISNe.^-gO/!rb<5ίQ%lYk3>s{Hyʡ)u,g5g5xK#^ܴHQHM{pOXFֶ'R++P),g Տ{ȉ-ƣ{&ӣFP5eM-hK): -yKݛ s! *1Ԛj- <ǟkO1ނn\0ƸHrT_E; O.vDGon 6k xGݔ️mT& aQ2\JAdKN.m1R"70Z+/z`}%ز % Fy&if~K$.$ZQ{n0J 0xV!WUg(۔c GKb`2ܰIFդʒx8NawiNh.O2 TXEScuJ}]W(d4-q/q@IDnhͣf%~缈.08m4)x*"cYDpad{/F4ldlEJV"kO|[}BZ1?:0}4[,#)p*o~)METZ[~Ky+1o1@y"XYZM!΁mAggg+<ťV ٪%ޘOfC [,ַ4)NBBj?.8wⴒ$#Ѱ.3k^ԫ~gv ^I!u73 #vK]'XUPb1b] 4`Q޾` eOMsuַTj)QYdLcֈ1bqm XXA=٤{軾\/ Qy%>iYI/<%~$!xDͯ,LʉI#ӈ{ӹG4n (iu;Xr߿akɯW&Nf<L DWܚw16e=Vз!_]vdH\];lx'NJV1e iJzԯ{%לQ16drΟV<~~aniG㈡V|-UspJ/{Π}' ө^xQQ(>u>[%t4.p6Qӝݝb]j>٣*ǚehX/uq}/&ۉ]M\qȡ1>J^yfޘ.PF<Vt$p(+ ecgep"  Q^/&Hj|8dfgan{^ Q/Hj0Z6zFrz[5)!]*"ĈԴiˆY"q7|7w fZ>5rԞW}Մuo܁}&_˳JT8ùN"aLk7S VrVXyTYi=l|0f5zL+"iг֟Br{;,5,:?1W)W,Dsh5^ :3o-V$a4WZ_w5cX,70׼. d*V.X7߇&弬7y7:*ݍ{qҷOZZIJv`Q6^FHf?e (]YnFXA (\Pa\?rt=T[bg[(ZjDㄚeoy(!l"(e8߽DeukGL-qӡE~777sI&O !;*ݕIQMgxjj2BL,(lvNlғ;)CV0t _>BLn=y&c(OUۖ .eqOWKM7 Ω帝=]UF6,(͍2qеG‰=HzlrxE.^%%9dblmx1]{M$υpFޑ`<.OX 1+0"t9:0Ԩp(s`~Y5̐#4.)O+PWa? y2"0~yv,WTIe9i ʣJuj5fRb/Vѫ'ښc;o_sJ}BݚB}V/1"3PBH(\0B6 "q[UBPW-нߺr֪g6גYyP9VI@ .C8[&;ouVv=* ~;Оz-{] xJ{nQ}]|N +WE`8oQsuhN3]NpkWaAcqw=&,icrl2 FIPTP,1v.d_7[7{],[ ?v)-;<t͟գ׏^MK[0B >`*[ ʎu.m etT_﮾<AveI=0Bz3POWog8ܧԽ4(I5}sIwMo͈vHnsOsR|;wq66[QR(=ݑƋdι rzVF˨Cg~?a @ɔ/e5Y>Kh!b'=bNԜs-GDZ3c։lL*c5{,ӺǞQ 5].]$'zt$>\Xk7F[)B( N.WDž[pB:h b5}zWjF?ˈ0}09K?4OK=@mm<¿-V,t&qRr\-Ñ1&) XY딍brg>LB$IZ0&ٶёAv*{ʴIݽ">?mn>4? :dbsLavՌŸnXbr(iZ?HpH88F 'ISv u nem%z?l½JLU;\9Bd=Ml0uA|[J-wNG@r޼Ӊ#hh2EixGT%Pe0MNǾan'zM \#Q%{WΝ!MXߴcIU[zm0@n^mdJeQ9A W(P?~/6eجTsH$4Z%E 3.澙cps c -mw"zE I{<Bm؃wsz<66<N/9boyo\M,k<{йY=E*!AVF6 QjS/5"+&\qpQ _J1"D2Lq&iMly|gB:Eɨ8:Lk*}52vnpy k`/ 6x|k^׌aMc\5?)‚X+) gQ8MwPfCl*]~W67C:ҭkקh-%~Н6@E?ݘ'Ixv(uxU$KìVݙd<)W6u QPÍ]_tVxI-f_GǍ,ba%xB_# *a3ST¥)U,d"6b>2A!ƥ$}nC$?9) __~l(<Ғq_]o ǘcwp@/pKIv2kqp!N=5Uj. + Bf=J~Q6Pl۠vq|OPB=2iъ~;?'=n HI`VbNG-+q]١FiJVHu~5z:<, P`4 [<^!1{u%?Cd JL8ݙ?*+U|3/.S?e<;g&9xE0դݒQ7i~~({se@y+]ݥ덷dnb@T5P^Q9홛O~_O@F6nʺt5#syAP9z8J$rz%,=PyƵQ.Kϊ( yQG-] 2䡠4^d27;mWEC҂=Fń^BgO ΄RɳY&>R:|OS7X d}t6X80T=De]lc}.]JugH%?Ua^xൗIϩl'b[MIN8> UPz@BvlVA|le. w(jh*Gu(l|$ Ī^Γ9q[r`s.6RD{g}NfnK`kn;'åE^۬S^'A}Dl;4: aR˚]N}skҔj9ۧ{_®SҶ҂ee CR2Y(98{3%pEty}7hwb'Fu]j?&ѕ.ej}o\6c +'UhGnPN3w3MT7_ͮ޽i.`cІe =S~!z^MkkdP˼F?'*%pkS[Vݻz~\ڔӻ#~J@ KLx vw+[4N)?^^*T(vķ(>ftP[\][?ֲ$k4˦lf~PR{u 7Wl$/a6jCy?ɜƱ{v0کBS[B>Ldd>B@` Љ=R|])^*ѭeQY!Q0}mWlI R.Vr`VN$P2H#y1eC~)VԔ vx[H@DZi#3SlJ;Qp3 Shf-g3TZS Uл^0̡gDp 孾XZCR3&uTvW|1"CĮ,:ӆKGyJϤ`=H|縇ўQ5O}YNm7eDM3)5BCU8ɰQ+Ů1.OLE)K(k5+-}: _AQE2*}X;MdW`y ǃB*ف~}vτ> /{w 33{i6"ჳ`NJ+*aզ x Xm5QX,,g򢣉 z&exOfDJn0^?*hP+wn.bijb_a)S|b]UVg#b?0n5fetJLcW@_`(tRbk3W'fq U²A q{ OKJC%mURJ10!6$#+XG.+ߪ~sU6eo3*V) 7A Ep9-CRne7N9`)ZhSievKZt\ tuNF˔a`99;zx#zՕl,ǡ=rMՔ<-NpglT_|[3y8Rs+D]H7B.+ md!-@\=iaR3ɦ7?>S.au]{i#ަvo["F..xLkxdmFRSO-5xlN7ms]Aadx`t#&?wߙc@ˋxسG9E{!8OrgfpI#zm0Q8d{J0eX3 k855'g\?H0H:9f B2*pQIK/ f(9QR{%Oma--lj4AD#2KP# 96άpq w(-sPB$)JdH`&])ӏw`-bs 3m Bh.%%@'ºrku ̉J[gi>Y,D|$Y~$zv,oTu_Al{=<:,@mB>GQ]R}eSE;fz!чW>r 4 M}| KJW:jf&u>1Z-qpr[;Ћccy&kCQ"8vL _Ezdrg55uX# *ڈA#A}܍LmrVi7ʞQmH X$kNmg,Iϖ(TAG|*T=$/TSN7T{Mz=UrZwA-'ƹmV"Tn Xh8nq1emzbVEk{wskLz{mddz\P ’"jb.tF,ۧOyFb43ZŹEӰ0pkLZWM*͌DHyag.O*7Vvv:>N=bĒHQ{\0iéSZ0]n$-jk'FSk){AOΣҐWK2ZJz2Uے j q5"{|<z6V~1 \H3+Kڲ=Eo͓;TqgTiy.j$̼^+~QIr^5=qyMH'OcʏXD(?{h"Dr&hi}dPZbfuK%vdw+jP{G5(^1IrCAd_G7#`wu̐[$U'ө7'$Ln~ bcVº^`OU@SsLY^p+D.AȂ? 2C=MjlղKݩ".p$w_J TB! ČkLD|[JA4Ƿڛ@tpf5ǭUY&YzO Vaʐhąpt*?GmWn$Y5,R8 +*c-::yv Ids%aQ! Z.vk(Dʸ9$,'n h9~su KW-XGٳNFRgn'?Zb Kb6xtg|]RKe{AJi2(JXqI]kiVs^B_w/zPqr/A{14;dVKx+cC{|odIM#ࡱ]_k`}<&Rfk:$ĴN'I \FC \ [ ~7$~P7CBtjE*}ь GPfa 7̊Ta72'_ZwByxX;#3 \(ʺ۳=NII{_ ӳ#KȨ-vy8"]2?V "9D#q ?>t $tZJ(h:yoZ 9J=M";^b_Wݴ $0տjA}! WsZx{a5 'b|On? 8=/3xWC&E6ңfy]/U͊3pdJH ėHnhqr<#vGOҒJU'Q C 8<>ex`O \ 蘭2ZF45齠2tACާke\"nǘ ]bӊ|VWE)0w~_qsB}C%v]tmAS JG,84m* ((`X=W*$0<fl;\m$DT7yGږbQKPz/yz>: eOgeMZ럗~ꤍHJ: }9U]NҒ@hcY}_o;EY Ʀsډ}!F\T<4otⱛ7M] ~LZƈOR%|2 fn[~SlDpoYrVJ'ތr%`jvO4巌Ԥ=Yay\jJ)̂u[r_4[V$iZ4)U`'^+b.%#h+݀ >f{ͩ2!Dʆ-ύpm4Anh(I8'd@ƯN`pT~(u|_4"{o!TSY ƴb]^%c<)|ZЪ瞱Eb[&R#[ṉ'](՜nn]:9-d ~ d*|pȭy):gh!gr&!(453گzڽ*f˲bkҘs9mzzUsܱ25!\kump1ݐ!̣mTnsG +ADg5`M+.@ LcϙRuZX$@ =ڊ/[;U)@/XcrvCߊ_fF͇D HԾSKS\S)"@(mdQ".[Q}NN{'C8?~NGqƼrhZ6+%h.8lWXb퟊y&ںܘw)XQ 홱 JsI΀PV )e`U ԁ.NDtוT@1h-KpT ՋL1H ]](Іi'o g1Ȼe&A,kIl-ٷ1uXИaF6E  |0Ѩ<ӂ[/U*KR)QY}4D(-5nE=$0x}~^ (Ϩ~&#'sEɷM& ,7a%7~pB,rP'.Mz=i #kXyQcsGt}j +$6 VtC0/k}M f'p9%"XoXT] Hrx$}nvqkWR!ss#gvDTĊ{ǎf6W5C~duxTGpv_}fA-|ߏIVB[xLHr}1⡾7?0˷1c i+OzIue\+]j+1hgoߐX<]K.gfPBe$3g@an8>* YCᑫ _l۸2G\Zd9w)&)ONmˏPn? C 쉺 B98jh]g1U#9p pauW.Og+WYpʤ{c49s@Uf T^mn5TG>`E$ Q{(4cuzՀ/;/[KwFwhD VOHtfA}R)j7m6FYA絯ʬkl4!\ " Tb 3lw1v؄F* ld<3dUcȳzs=xaݗ-O9s*oPǟ~Xv뀮{gC{OL}Fz^vQWI}CiQz|.Oňh Öt>ߙWJW4Cŭm}^8NnG`5rb e}_!78phL"|S}9jdV H >(ĜZpL O43GS?/$-zX"RBݐƵF+& (;| DK'Ha֟K\ +cAGl5%D`ףq~JmRcrSE2N,zƌ(U9fNo2CPz&RL,a4P%{wwtۯX;~Z%ާƜjn%i$yVd2DC䈅|gNc6ߦj%W?Lux8F{]fLRL0pYcv(uY5IжU7} vOőn>ůB suQ?"~=[9'ďSEC({*./lEHkpP$y\O*Y~eҙ8pu A!yȘ};['.؀2/TjNv}98 :nʢ;&>~>YfV=X=Zm͍*p6 e,H9Fr>hSC( Ɍ֦t#Dzk,ߛf h}fy bgmeY#5&*̱\D.8EԱk&,j Xb$"#첽\;lR-o6}Ra( "=FT&;n ͵e\}Әr[waڈoWh%=~b[s!XqX,:Y~3AtglԮ<9>2+U>Yohp[ມ*jd풁)kL3(=]R6UWoC7.My(#I(󓋳Y3/h㇖lPjǯ$Wo%Cx^yo>", ta+Ǥ3aI7x, [qK0)DXIU;`_iΨQ l#QK2nBxHHsz1Rh韦#;3 A5@Bl%8]Mk >Q+Q"0|fdM4v)+wle H !P~(·{Z p剙] 0#.DkBeӱ|Hߕ0r{z9eFv9bfpwY~'L`9Tƥm^uͬ3R㿌u=6^"|R( @uu:tQ5\ȮV+JֆzD~*-eIءIYQʾڒi 7[fp0iyst (zt'h4f6OG(NJ%r]];gt3{=:m!^ŴA}-'vWt0S{$685gn4ُǩF47oѐ7d*1RrjDIJѽ?$&j V)@c{gyai.I|4甫ϕ7锘)͉%I|3]ꉂF, 9MK\Th'MC66NUiEp9Qt +fI0%0 lh Dv82sxlJ:eW1{ Y\u,Kq^Pyb㗅W5DyPsDʥdF0p&3HI& \ ϳ?`Uv^0YV1!뗂/"0r| Km&_.Ӎ}6B^#3I4clOǒ6ŶcWCƸlzpeμǨ+칙Z=]ַɉ99 #޾7.ΖڙME~=u뉥"Ȍ8@4aE読7iX^΃~o/mDU![00>x}FB 9d/'ꛁz=*춣f0 FH ǁI~yVҤ=G|7Ƀ߉[ wBڔ@%KB}Ζj!U$^vm9A:|Guk^٤;*\lk8/r6U{ gn'p'$C -S>橯F#},w8ZۺSzq]_$w))Pir&ȇ\uFqzL9xD'=tېO<QcejV?PҕQ_ 1 <&8ߎA-TȨ/k83>ULͨj&oCl-*v 8J֭Rc`ܨ%q;y%Y2½?h?) ڒ Dnbb5F $ U糉On|l٬ 3rZH)'أ,;-zifRa /hsU{T3ާSNɠ=2@&#Vs] .$KV{:+]\rQMDZ0/}ZiOi ,/?!}n[ĉBvz-EH*,LS%,;f1l%]S3U76X.xjUFW/J& OǴ*Z;p-] ݝO6)}ρ#jΛz3tܬ%Q-';Jˀu`Y ,5 _þg t$0"k,<$Q'kqBu{Gb!v!]-;L,F '^KFnl { UחXsJd,KU޶_JlTh[~kڠu L]*:-!θv&x-^fZ{ŦI-D`VI W@Dt,Xs\X/% ؝Q_ ub5h] aWY¼|&+(~eGgɺ6V͵ۆ!C' K^)2]@WrGN;Sae5Ǿu9wN#Ҟs&·. /-@uf8g=Sh.U":!aC|R/LdshBx+={UۭV/iuT8$ah`*hYw;N$x;2b A`Ύ7MF5gbmj$qD<߅}A~ߞ0OIK 6 C_2Y3K6IbJJnN0[EJ!{"ƨ%`q PKe;&(e\XLKL[SD֪VNf]OS͗wItwZ}%.= Z:߱X؏Ċ!3>3PhTT}*#bQb{q234FpOHԵ*vn}+L MN7!$54 $ LP%L,PT*KtE\_x%F]hӤ:wIZb̡887M,nk&xR/3C9Wb2(,*`F?aeG`daQY^z b0Acf|yV>2GNު=/5m N9n("ˮQUnH8yѻi}xPo˅~MT-4T 9ĪOoTaV"JAtн,:Y6JzhY+;]߫yԩi-L)G8V2J*S"L"Jw҉AɖerYC^ݰ =ָa˟Ȍ5xq`Q#@zJ &ILqHNi7Z 53iLKiG+?im8BΊDjbI\7mctqZD&.v3p0p_G;|T{ã`׾< X"q}IlZG߻ĜF[iU%r>0 YZafex/inst/extdata/plots_brms.rda0000644000176200001440000006576413667760652016524 0ustar liggesusers7zXZi"6!X~k])TW"nRʟoÞuT7!JG&&X&l_˳a 8LB(Q#fxX@t7GK[7;߻'qa Ii/}mjU--p,GwS/ŖXJ &az:θoju_g^5lLa;d{?<y՜*N:]>ћ.;!/|sD9ی=KQQba'~صk#N$%PC*0 S ]AO%Qt،>ʔ? #s 霞WV&׃I0[ myG۴Xt"ˊ @=P =N+hlK]Wx]OvcZe'No擋l#za.A=˩,`'8)s#t&doxaJNw\ޗ*Jj` v?uKfHJ^5{:b hp3ҙ})8<(BpL4RՂ? |A0_9ul)m(3x+fp"i>=zN䁊gϡG0o' 9ZbҢGY ܈NRIW?|{(lg{~N/8w>1/S"7`b7+q1]ĪkR2RhemxZVr72o2 ]V 7r(&Y&82+AD:6fe@A\h-i;މrMש9Ji!^$/Va@|8re^dbHrN3cZвu0G>cNT7e?D>SFW 3e QkjH ]%r7R'QI*VCe ƤJS y$Ċ:1.b1{.߾L''Ȇj.5|D=%oFpZKraf! `yJ v^cX O^_BJp䦰B.܇LAwִ۳g?1R v4sv].@6¨Lzܸ#))lA;[+][OƳ0P@n,hWZX ewNʭ'1i򢤊>?W}R~.hxam* 4Jz3#!qMWPd(9DO e}NtЊ18K9Ĕ $h[S`fHA0.bh>6I]So'ͮj$f~]ID#"7Bm=(24eT M;Vtp{+ִf^W Y?1nxXdZYEI􏪹KmK_'eh$q@?׳Qk?<%٤ɵDٛI!)c ZyZ-/?bgs &h*G|udԎ)neDpa&/bߔi=VR$PC#بhB p2 3)"d>Wޤn+|\%\:[9r6e8 6@i1%6TfАu oZ~U!3CpdfB ~bWfU lŠA5 vJ6ku8^'=S!ɓu(*2^cu(?>j*1;'\gW*EgMFLtCߙ^"!P~jӊM<'?5 6C ;gLpWi; r#K~jGugI\cNsecY@=*plpQjKswͭ1|TPSErwO{8;yEL, O|| XW힙u!A/Q9;p͐Mʱ -eƘ9Ș ԰m:7QR~ZhUI.5,ś.jWToil@]WDT'L_Mas_Ndd׎fg9ֳBk(3e-a^xftiq+|ekrEwߡ][ 0C>],k)fzѱNes xAփ7Ҽ/der g0 =tZ!_۪c W*,1L:˪{/OSSQ`8^&ĈU*^{é_&r֧šm!I?r`蛔=lN WGxVحXeެ%#O |$jiCJ Qy.}aB!@|X v4.upL yMd?4 6}F'Ȭs-M(Wghhݖ30=q?Yqr$2!cⰄ|&uu_hn 4QO <>IH*87R3?Q\oJ!$\ʿ ڡ589!]#q(u7K-=Vf>#.F=R3ݕI躔{[C KY3ƼhMi5hf6DDOCPaqWZaFɓ Oqo ( { O.FIMDZ.a'LEW0)/Isjzy1_,a25`0nSҏ&ӅT\j6Z(@":,G5ea#@]4 LT lmT;q$PBrdX97fҒ=c'3 )jt{+b!?4iX\ۀ4pF>5[ɮw *81')wc!CQFHp+FWsl@O<;V\﵀H HKάk>UQ.;?p=~ب])wQNX^3`1oMK%IM(]V?{B%9_u"DkMaTnd[Vc!oy3?9 9+Io;/! 6K7k"W/㓈L]QKp|Nۅ'B| P]XQ0(n~f⪲5toק&L6A| 㪓MZ:ޅoFE[N{Ѐؗp"(jbn/KFU#[[l]klGjʦF8OViwX&nh-Azg`l'CO@ѳ>ؐPX[6h&-!#r+RP7SI'H?Φ큣Wn:Wm;Q(՛`HiRDs)> s|B~Sᒝw҅rpϫKY"˺JN+1Ku8Ŝ{t-#Ü} m%Ykqd]GܞQҖ+%h*h¥)N{U|xy4W}|Zzn])X:BGj FcG0 7;LEj!7h"i+]Tp/J/W6moo7)2*RC7: gM&־ hd+>ȮE/FMc ĊM7 Xmq`rٔR*sQqruwl7fe._t=ݺU}=OV&1zjsw?8:y7)%ntj׍OXIDT>ԍVW b H| 6]8BfG$-j_P(WtnmG[0N{lUڄl*dd:|1o$S]zXpM0'ں7ec2 t+̩V=͍zjB&ԼO#%ap)POU(`44}79Y>; FG'YnM2Z/U^!D4:g%-s]ˊ-rW)72-e@DH9s(_Z:wW A&?/sP$<' TƐ\vix`&AM=pQ,RRs=mW͓«Ls56ԉm&3V##։r`~K)/'355V544o×QHNǏs<(ôDqs XE0΀[pr-+)s+;@Zs< jUugx_Q6MϴvN)U&%Tѩ~l$H]+[$Ov!\r3!πEq1x`DTcKAx)wYo^I<$zQe^IjOCv\7YB& Ss0L'.df'5bd5Q^. JuE;ƏEy}xR1Iz6k^gjAd6:8"i$np K)W ]x֥KŒq [zP!JiϪd)'VF CmHkl![$ˊ;h.8{4{,D[(NJ$.2=a5`-ufh?#Ԙla\ 'P~*&k`O ̀i~OʌQft"%? bd 1|9^7EKA{ 6ZhD:$)ݣ-v V>3Վ8t[ 5)jK@r,,!:'+? *3٭^Lrg9G6C0( 3fx X[2qvMsL9](j| yS0 ,;aojWJO1Mlk$#rj3x[5*^߬ IA͂,ǟw?'}Iɸ\ p (ʪeƅ$M"G'jأ5"JSS)0z/)vF\bD( 焤lBi]l4" IBNߐ]rHjPU\Mվ㤖0MG`BBwvV%q܅]>(7>£x"oa ͘ C("|ӽӳZXl߀v6*TnB3! RK#ԣEA@YwȑT݊MzR^%.;.uD10C<8½pɿ.oгy4=]/Vlr6KHy^&q+ao0{t2VEN}g{{#{r4~fE~#m7k]8QGzkI>Cr ʮ-;Ooc~0w"/ WP X4T`N!?J~Z?zv>[sqvd!w68 d VY`رTL;T e]i$~D~Gv1oצeɳi'TM<흓n|[7'-/X^vѝ4%2D1gT?"JR!*=#5j؊3NNX#mzWEb+IgRf%,q/r} aŀFOU/1/YZ\>T 2X(o̗ڗ4\h~K&Ht־ۯU%PT>W:Kԇ=L3_$@zտAqnqC!SUAŘRI9_v=fIf Iۺ܋䜁Fԍj&KF0޹ :Mz@;=<0J5P䅞O}UPXf#9 21' qqjFe;|׼ϖiU`6$1'sfG>=\q٘\Ad1jN0'T;=yѺCc'е?])9;t,&r4MT ^|hMzzX9zR?}D՞x[KGdNudz.l1qA}\#q3M*Ipwl×]VFrpL̈́f7Npsa[$_ę^j Ǚ4dY46kP}|\-%g9WHlLUoh q㬠! fƆâUS9l.CZG 3Eo`2]ײ ~'z(DNmj/*_wGUo-g$G8d"wNb`~\p&EU.!(x TgNսv&C~S{@Evi ZF%Њ:ۤo(:o FWxB0RڴYy'Rpw^^4q'KsٸuU>?8NoN Vo`?)X9 `W*Vi9Tթ$Ve:)9l3hQ|t#2x՗ 9 ~Ω6ע9t|z(|T+ԧeF׽<PZ6֬V|}kbR$7i$va9Ns"|:?iŎap῎l6$2L0( .aּȉ\Kf)J  kcfr޿"AG<҇'E‹nպMGH!MCpњQʠ=P&Ձn"ha\Wh!h崈".9c hiVNܖ[a|;yi~ESzYۘYTÒ:҂vc8;n -9bq3UU`{锡U(&Y$4I v !S+ "{x C偻D4uo8G4"CMkBb|>'Cm"v%Fm$uٵНNYǢF‘}wک[mx'򴶾neL< oZ-FS'DMSy >9cl Ǔ-E5k` Bufv7"9{`!(3.Gw*#,["giW_~ȕ)6Av/l={Ɉ)Bߴw|zT BǞq%5#pQ(PVc8ԉ O`ø;(KضFeCrL~u;װ"u1DX2v<I%h~B,pژ4If_ޓOOы<5&ȋޔ) +/;}1.a2QRn3Ұ-J܎v _!ferNt)SW"uj |gFL/L{@TxsSȲK%͚ośhd凙IbH/4%ՆbD[Tm!;b2L-jY1s/>T6 yp%F'UmZaeӥUATBTE܄]'!C :IB(E4Jp(cWJW5 `'d5ٜigPƆj:F-U=ZL }m;us;a&(hvlGpW)ee("8 S$;^gZb؄hQN%E3eLAԣ!iPtifa (Pz7Kp'fm,MspbANqmޱGM, iH& eg9:.yavpgkR4zᮠcd܎ᐢN)uD:dNJċ?\kߏc.-ߌN[_8uЇSAKobQ@FA% Ym ҫ| { S\WLKIHi /EwZL'gjX^+L5/z],r-%7EJu@_) *&@I+‘y6!?0vnٹN،Lܩ@AY;BnaԁDHISd%Ԋl?/_!JdKx 8y>P.>!C|` - 29Yr=D7uKӾ>;>_R^Ju+ȯiwB A/+?n;N΍sބ_lt1mzvqfLb8]vx4[U"ro]$|r-+BW_ ~rO$Jrep/~SآjDVEԩ\,( mպ[Y|g"2qѸ^KZw Eo"nc?9(7SNn ne8 sշS F%rFBK}Xힲ'+ 8WGtcOX^w׵TGC kHb"u|]z8W">(wdG}O_~3pt y:f2uu҈HN-βNvC_m_l~w=!c)w~iL\`PTe8S3eIR7v9l?^] _lգ`J -M; GȐ VUb𼁻")_ȏn"dV[(lKϴ6;.e]Ay4'36}BO` 1H/5t6FHF/Ћ3mU@ _*@BiTo6&]g:f5=NP;й҆I`]-d+srK+@l \F+E;B7MSSV9ҳD!߉^0#$;#T<\pZ74[`5dv&vd(p*;a߸x \lҀrx-ȗ$4"'CsXPD/4[9S4 @I*& M¦73y!M3%P̝Ryh-O-/jS_9I ?8 IXc@l]*Ӆ粲bJ࿠=,g@+`,,!N|YE085$IF )=B !ƺcy2b)->ov\8(]\5?t/?)١YC2 *Xvd}/po+"@y˾)A>.T  Jr:*G2R֝~z(W}6؉5pܽt99rcMa#=b٩muq\ 0pVp-CQ$ et/th >0 \v*YF#p(nM.P%A} Q6>Bc[V˙EnqnPYYkz%qk4ZyݗI bNWs1q@6 \/4>KKr`~/̚L&>O{i/u3%[1xJ{mexbPU vUHf'!OWé5.SmDevj`Dz&+.Eߓ?EPb>$)WNLz~gMmE=%A` \ЭlVI)[wC.=1g8" Y9kNF,yb8% } P^C J+r9kA+ne(wbL21ϻ0 Sj\ Rh+#^ ?ZL6!Đ_U Fp 5:}&7é'c_@ 9 p 4LJ$opdsh(eSGJH f~[wj)“=h>8H34mPK ;%^"jh&փ`#לs.C[ !a #Tζg7b ^ KǑZcZx]j,B e2;nj ë(+kn)6s]_)I6t |Jܥlq>T`˴ רXJ\GO= 'g<4d4ajg,㶽j/gJL,@@*Ûq.kGkO/3WȬ靤&Z qne"z4KebF -gJNjXHiZ,WN_3c`L',0I$7fAV|4dϢ6~}WԢWP v(Rg˵ س)`0'h8SAk<r\&'7kS=lcS0vdRylgկ| Q v,Zc?{p3XH8]T(D,o}nijIBDo4_F1WDX LpjrHe^]h-`{>rt#W JB^' "*MNz=Qx#L⯪]#' "׸V9(y.NdҾ.;윊o3sξQUƃguα:j&2vsr<::ejq!,CaLKb',5S."y~C uJқ H?i/KK_ 2K1& [ un߭:$|eaG5ca<&T6a<99迠JAzћahiq;E[,*3cC~ò׹ģA Z Pڹ#.hU}G9F 9/{ eک"4]+nsAlGl8.g'깱D^MI;(f22Ȧ"d1{F:< ]ʸYMj ɑd-D^k( qgES._<6 3Cٖ=Ui n\6$VBDݺ 1oegd*3D?Mݚ& YAak a/[,'|2܆Ĩh߆E[nQ_nW(.% TP;qu ȗQRxƗ mӺ2!l y 2N޶,^^I4(ձ|^ rq?|~b ||fMH틭Df$?8|}QH6 mgzz\nE woC%{YiȂl%uqƘ}\żE\`V"r︮y8PA\Zh]$J<`U*[>l-uRNB| !>~R;vF6B\[~,#F@'Si =@aW"2@gAkWe(d+߆- Gx >O ;[y!䊄Uڐ=G|G%JՄsn %8v}[ufs2qy4J8 Ē X@pS48u<1sKZ 0J4Ǧ]8cJPCmeƎJwl_)2PA( 8 - V$Q KC(y_ԡ\hFYi{cGiNVΟj5rB-)Y W}t9K ^?#9Rι;?t2B2(Ĺ3h$ab;֫9WʩѕX v:2㤳R' GDLC]kVĮ |7[V\]P86UڈQWxc6z>Jj{Z7zY{ڙN[J%,oi`~PX4@,RR[KlpRG&4; L _tX").⬾_=|^cȑj_+-ڎ lH|#S6βZ'` m#?/Cc2K%QyVNK%;%ԙ ϝNe{"=F/>(&A4xC(|V_p:* +4yN`N W]>HƧѻXTBtq@H}B#_Rz-} f ޽KS&(+zbk64c0jʀ$رRsyv+o͖9)(SU@m>) @aݣR 9GO5дL%voFMZ+&hX㢵z* g4KȐ˝Շo@Ӷ2[}Tp.R%ϯrY~jO MBE}+zuK羡W?|5QL'L̊6 ]A=JSԲ.?1.U]El /!e|^t(Rnf+4xx[?i_P}En,׭jvA}TvR@'?bT3#cm!9=!y~?1ȃh/PPq;網ng6jIIZTo\=V #wꓚ(-4=*G?/\KK *AbZpS1MGQ] 7X*.\ʲbTFe !uo%A$k6ֲe\5`s64ʃx \K͟?27IN^T6ur( 5pH#}$VP)<n ܎Ꮤ2 +NSl2*wd9xf9CaW 8*\o2~M@nSd|S _}('PG5j U -1`C>ޑUmPpp2+1G׻P<+H`.vWBhauc?$3O!M>K2 ]h`Z8^dS":\};4)%܋њ4<˹9\ܑ$@H[0۰X78dkh.wgK(kYU[sn٪͇-<#SA!1"ˆ IGZv&i91& (hCg=; u ֖ySKRJ.| eWNpF^졋(jk|b٦Mn'"KQ3!}vU>`^k&t c޿ݨVB:GX1}7^ CqUm [ _]JKu)Ȑ]{>pn%ƤKfl䨾*]DN3[93T,'L2`d_ۆkߙ-w`ɇ?\9$OV-^!׻ml`E}C3O|u.|f?g|ȑ ~]Q6+a&!e^T4qx Ȕ`|2K4)4]Q9Eb/-;"|z=$h|iY,◗6fIb#*}4RoO\g.T_1a׶kE}dA?U8HDƴ2|utPtG!j)Lg)5{f=+`f4KrsyZX;=[bZ.uR|Bۤڵ- _ L+v d텱* fI܌[[Q*sE KZuEy* jͳn\jt\}ZC`Wo]Mェr {)4vkF^IrC2_FzK!9#C%7ڷy&%ˇóB\ J(3H*B@_ߌ5Co@e*S2 'W5&Z MEk#0`Ӡ#GViE$*GB#ߓM 2S%n:!X,nYUaak>B HѮ.qG=v:eCJ!n3 yY,y2fc㜳3X?5sjV{T MT+%\߆z 3[_)Z{cqc ߻H[ Q9ߺZ*y 1x5p[7HW“6LX`Jj7>u*!|xuh_ѤW^՛aҔ%.v@5Xz-2i0ժR㡣2!g9 Ѽtj@ >¾/"LO=U E w['6ynߏYϏ#d+wt6}&0p EkWj-ބ\u3:m}QLWW![LL&/%Rݦo]b@!'ſgs+~ӷ;6X_mak;K[2sТ|qV5G{7!x: FMhCj6fK;Nޓl^!G*%e~fss 9U~n6^ նI1bOI'mQJ؞RXNɶ?B&WsاWKp;s2BSW[7ЦsqH=CB"fu[דŎDhC|@ yhqD]gk:_Qtl5ǸAK-ZQ7}g~I&Eq$ nI!aWD_xpNh&q(9PZbgzq6rns]ENH8lξ,g4fj0^Gb'{.0\cA og4n$ELsOh{ Yӣ5#2 #Z>N/]:Yng@\,0M9ԭ[iiМBcìТdÕ:`6RŘQn#D<{0A'Sh^'XL"oq2kױ4ZHhvi;x٦+0h=&i徛$ŋo|=AbT7iq#u@%WN0@k%1='},jO7IC^s-|tu;\>Dxs]k/t46?՛yMƞU D(v+\./92*~FŚvggV0 "ϲ~RO[>FEe Yu}ij(5#}_%K;d5h_..,Q<5` h߹>[OؗNdC۲|0`D]gV;Tyofnbt3\xMJ>F0^|K./|oz|8K'r0Z(#tՌ7gqx8U1C5wP }(xL3|wW xN'L:"Dam-"'ݽ" e9)ieSbU;iw'A[g I [5CpR*p Y89;5G؞l_ͯ-p"86Ƈq7kfZ~ Z%4)UzZ)O.|eT,SGjƤ:nw]V%N{ZP|}Ф}:FE-)6-v:N>X2N'!$ӻxcXͲM5ޏ^{ k¿Z6hxxsIٻR7M1>~P醋߾A_JX<ޫJڳ'a;Co]}r_ژ`3Xav߾/o3]m٨NPߙt%:JT_v}0 S`D /V,sMnN[hʶ>X|O%'9|B,q+##4fWDkXcϰ- Oc] tzSzlv>2@Л* ;>\뜩Psh1w ӣz{ɠWe ekۤP/7 !>gj١DZ,y[KPraf3J ӓvѸ5W2Ae>P͂; P +o2ϽݳBk(:;|#OD>уqm[t)gRoaZUڃN|'!7ޡFߖYbyxQJx{%Pɽ?&YdIpbn35]\> Gr4n꣘޵:B .IuجlhXKyH 'X6E0QU-]m״}`ؑ!v5]"Oxc^pNwuԠ^COEa^cXoHż._#Ylr>P&%sPdr$s1sH@m}f 6:JL|`ga~K+7rH9h 4Ol#OsE;5 !.PT#xjn fYL\+sZpnc7\z:i]sm4U T``Jd _pd}Ov|Nt&;&g.=gBqfa'}ū߿-J!'bpyATx>⦐OQauYN 34TS!P!Qd1(I*Xa>.vk8Ydc gpNH._'0_xnr9R9Ŗ> pV_uY6;N!mo­ޚpj%Wo cx~i[k3ҸnB?=,j7oMr-t nȦ vMp#6rahІ@F4DoeNas7uH7/b!l&cd"`Q6g6Po(͹SNN푍'ᢰ$/pxNP:50;]{Ir *HK"#^ 1r aJ Uܥ  oXByvaPU:5+RJe$Eˋ$䂫/ W+x1)c4U5+ֳ7?4:.vL/rtn(> ~#YsX}(8U|4U[=IU쀘y ֹxݲXuYpΡUT1qҫ&g X($;[["Ub5KimCGx}X{|Y i5B Yp-cpTj "_#[3,;IEgFȟ{] Fs:TA5klԆrdZ,9Qb$l)Qt H)A&Q @IYH>+^e *̮ϩP[!2T u!ЮY1-~ulYd1=pO=h8܎ܿ"~ߨreHh ߽鯈5E)@t{14!{nFx讲?3E%Et$VQ\dMow&@ۄlʧ!("q%Lrt4h?- %"$9#T X˶4<`Ypx¯ɁZDE7+MńXD >1CJ91v' d^)(D2on،|*l|C '&mtal?`$$f#q=q4~BIa&:OUrޅ ~ty"uUfԟAF)k0a8g!jXslYrCG:.w&EP(V'];4>M]M'R*Z)zg؂U@ +b' ⌀s]e]4zv`ET9i YZ?rr<kb1ac" N(DwP<;~W%Ud(kT-?Čy'캝X$i6i_whX.ے^}4y{g"s+ʥH*3ۈaCFMm4zjnX\Ywݴ)Ҽi|Dv;O2-5I' .EF웹#'şZAҜZDhK6ZO+{ gMt[돇)۟P5o<)Y.2ԯ?M 7 M%bT['3ˡӐ[JNDN7;K vRk=Olm߀ڃ ).]Ye7b4PP?8bޅXHأI_\y?O!ո~[6,IOڜK馅$R Ԫ|JY}?ͤ#]"f[K%*+nVلg4`Ds(Kmo6cqzx"BaBYt$d2;#P )ɮ縎MLE=\&b A<}qϦS \E&(h'lPP Vkg>?"Wc2q-ĸôLG0 YZafex/inst/extdata/output_afex_plot_mixed_vignette.rda0000644000176200001440000044653013720507461023011 0ustar liggesusers7zXZi"6!Xs9])ThnRʠ3#ŧi)Pawǔ-ՙk,^}%;<.2(<\^ 31`tbh%NGC5b=ܑ߬MTdCHubhHǂa絾_P=I]؆x BkYGW~ h!D:!y t`^_TLZ*=?|QV̯Hbi!oBbOqJ-lr[r{h+&_e& 8"K(MQX̓YfǴ ཉMC(.TYw%zjz>+ /٠;Ap'L+J}v[ ў(0JSZ[h 橨 `yTud1 L/fZJL6YSn1'xw235"~+zdRP4^kH&4ie^67%rq+ g|'_/k=x=$Ңmj_Tm1Q6M!?D=#*I#qѽx2Ul {24VW, _U-§,9;Ĝ4¾$Fa_AJQ:]z(rV՞4>e]g4kNV ßs,U?dwozNw2/=qqhp sm4vxf@~7tm-"ٰo~ǿ0'7۵em&ؾy#V$ʖ:iUcI OfDM$j"A5Lھ 9T|VD SkF49}ԣWXnvڡK@uOn FWlZ54Z@Ӈ(3=dR61]"UL+k$4dO]=NG׭heu3E-.`Rs.Ҕty 9vcqΔԟ?Ⱦʙ|(g ZR?Fly>%g"+7MbVHGk :\b*ZyG6<( Ƚ/ar/ (aW(bK\n&:dļ pw{ #|pE؋mP%SR Ǟ1-/JntF:ҟ@ 3=yɐVG ȁq8dL+A]Y}Wj!s]/ᩪ{\Iep?l8s`c{x6H(j/t&Zrdꂩ I\o g""$DBcHQq:%#J̅H&?N#UfNv JIM8_lNcr=ve@E*{a+/$r'`zhV>h̒jZUR}кUЫT+Gu@n 4,P֖b!#y|sn|[I܏hsh:[ Iogg:v ~WFaM3W Pn'$="#s 4|;9 0ϣ!{&+4U2mZ?#ΙODWv갪540@w(4Ӷ7cV %6KUFn8iNE)).=6;,Cv^AsC#w{q(~%@hd}FӈRnǙzWK%F;/|0cUnm&YrR0 j~AJC)kc5(^ x yZN)T0<$V0m-uFH|l#ӽh{K([!"qU*2g~SG(6D?5EI? =u9K+]SGQali6zVfSCorXǗnՁbQ v[WD]EJxZ즂" oɭnM4ED(1[ci”`6{xG\YJ匨~n(pAe5  o J<Y͎ Wwb)4e2nWL\ l` yz:yoz?C@x?140GiZJ%tSg=&ڥdu<&WcAƄ .oh^h\Bn2J,AsO/Lİh 8`Aԫitc.6deDu$~J(F-c [%FWݥ&+CP;GdIIyi@D6GI=Y|y͚@طX/caNt5qiެ"mg1Trp%uZ6XG~$-خ'`0dq*ϬfV8Yfce@"ހtL}/:tѼ(13_ŊTZ֣ցÄV73i y@ո3=/039Qyc,z\4[KHhtYNx_v;u7 rWޞflaXu^k1ȘZxXF_$ĕ#kIk\vk#q *WKc7U"ޞ,L;gN]]|vo#:RYbHFZy>X,tĹTH{~ mC$g->!@I#/2ѺkP4c2\\\7\׷>>0Up`Hps'M. CUiY>-U.#M?CӸʞͥQ,%wYMc ʳ;ם)=T>"QSB~NM~x( *.ܙ@}0A,&ڦ Υq-Ae1/x*H(0zjW,JO(x ([,grrl8Xw3yL9HZ9zn};22! ^=;Po~$ Ya8Ĝ9E߁ّ54 uQHHO Osp̴|<8_ q;N\RO`O9ON,kY~ :ʀv,4Lcy1~> _ LnBf\_4" \><';&<,րEn_ĒҒoX\P@Ci[9$\;P_{[xgob&N>?q!YW5P4M!Y@գ J !|mkq.q5P o^]Mjv ab*.?nL-3ѷ>P~Hc3;1Qq<#xErF<kC"nFfӌ T n&X6NJv;-oV~K@Ic*: ;MD@V{U?AYUSĎ44o ذRQ>ر}O ]~PORiyWS%vAiI<9)@ƲU{.v{[0~z>i t&V/v!1# k:Iu~iԧQRoT(,?a=V>¥DG"ĘNq8*/_&a҉F{肧“(ԯ&m jB#8l1w`1>j+KiLU[c^f vDMfi–4< Vbw(KzG.WOp' 8<}E4=X1KS$d;Y˖! sGW˛'r#Lmu|C/reF}?Ft%<7B =!|Ls`{˧>":\ t f-χ"@9<#'J6ql&% .֩u:kqpւc;$ bb{ Ō8Na645VSlHϣd]Ke|r·&([Dtl2gZKwY\Gz*Xjl8a{sfE}XKdD 6@۝"*˯YYvG 6UL}3_V@w\&Y;tcl Ip~֥QB_KodV<3gaJiE+ ;RJ@ߺ}_0/czR-7qjP}ZWǻ".L{+F|pĜ= o?U~ o^(ir`3QGIӉcXaլ }ByDI[[E-2UIQ%ds4O- @*!UՀoϸ=;PGy?\rv$xuz6@yt>C$FSp&Z7Kx뿳q4&AsJU 4icI}o ]3U?[?B ^$rc6wzWP#hAG x Wf6 s6n3!TOxjq=5\vp6G֟nfDc-`=~7DNtc+H 9G`z\pPJ~^]oGЮ1E yMP~]T=h'f5U;f-y ( E"e: <,EdРi})Z1ܔxA$D!}Uhx;^63&7=9p2y6p B]M] i}n T]#$ƢE.C2o$ԅkލ#Oߜ$]7a$k*զ@Qy,:Ī 6oP Le6FkDCᕞl7Eއ-hdNk+>DDi#jטzkba8V;&o\.*^S}<Ď#}rQCaBH(B@O: pl)ɬ?e<gd*M ̅G)+| ,l5Q6JeJޚd+gþp¿5Dl7vFh?#֋V sn#L3͟3\x'@G6..'8餰^MWPMDkHdoFD!UD3o 0ihls1$<\k#I. +U:¾4hnz`$e!i b7ڜeiw`J|zNDCS8apK!r⨧zx}ԃ&o7Դfjs -D5ŜMR]6IP=QF:vnIf~Ӎ.`yC {HlB<ܒaK{u= !'Z]JSx$~|#.k3IW6ny;DNmXYzQ> p3o+>y־u$iPf&yٍ8'/NSQrJͤ1`.ɪ#}ln񚷈b1duĕE9YaUw*ߗx{8> "VF2zSuc~v0zT.wKtIpG 7(Zf%gG!FrT!CgiҜn Xb~_2XŖ>})?g 9_C,14lJ։Uu9647AFjViɒœp\u #~:j~/4Kꤿ+Y|̀K̚l+vϬA-oI>*GPwy<.ne'˛=HAXIrԍo3b 7Zt9m +}9Yj0I ejvxF9:PvnD)l&WbB[J'{5RE bVL>x7l7ЙuceWf6y}jj8'zk^_Rׇ29w8S2N`ihK۫5r<l6/_UD{(]8r'5z5rdkl -,%XLis ~ePkJ4<λRwvʏ矅Ȉ.z`T\4~M1j~Ł;I̕Ih{ɎF+"Ǽd v`rAH [iΩF}\u'ʚswcÿ;(džc&b|bHWH~Stp{ML .SFkh81BZ9)x<O>8坝eBY/ W=)He4O' :1/&l5b3K w?i1;?ڙS3u=#%;Un+bwE1!ni8ͦ>\T|>=t۫3/mWs6]cٔ,+W./G6 /x]O/уw/( 2] `f"9[2d[oplZ~*{`R)rY-X].lUv8;w CzMD*Szq7=2ck๰k\9oK >޾딧zpLcMS[}+(5@T ހ_R-ɋd ~NS }=aܔxh-UrWQ3nX^l56aGFO·OIڽ$Cs͙աIүc){/*o29'1`@4T!kGtW.W].0ؕUNZ+b+00B&( on4oԅZyA[rW! 1y6=TKLb3}%YiBGc*ܬXAqӳs G|kӝqqM pBS 4[gV&Aΐ!Vׁ(MKq9ߨKt;A;?#DTUģ7Lsa<7w@OŇ80 BKudb4ex؁[gy^.E(WxzM`e@n_u4Hv- 50 xiQwAxR4481Zb@be|{&7!yHpG[8!*t4fF!q %9I#Xm4k7T(qB0j{#YhT5 2?߯AX/C#BJ0z9j38hR@H)?JXcr]s2T]J̒-/G_Ԛ!%ߠG;5:8h.N#r VJJ6i4.PFǵE[۞1YZ^sO1mpU5/S"В7bu!6ݟ6z[]3й:$3Oa hMQYDziȨk@tmv3IvK[ׁJJA:o|X-&PR'EW ѥ}~bЀY\e&Ś{ }F^fX( \'{/ L+*΀9r ;') 5sؘF'v6*!miAA&yIEEב9hx~cv?D#ByI@ʛA&[-9l/neA\iY?~qN2Uzh(GzF@h3Yq\ew_6O'(9۾v4]%c49ZV|i?ˈ;~r>v#.=fS184Vw6V4{_jWN=FƁZIGL7^X[xJ$ܽM{X+VJ|e]5j&DLVN]>,Xu.bTr BawLƥZ?.{>|Y{<ϖi:Xg%N7<D >wK"3TF/QF ˓'l)wWZ#w !5`?hOg' C,>-iiƖ@ "3vRr׆C!zu}uTp$gWg s6֝j\&d[U>Z'D$+xi>W٤'$M1Fպ_@;bιbii͖> q*%M;P(Wx ~1߇.j7^_0^`M"gZPnTm_ uuT^sq) L+2~>,IR[#ogfkbE9S?_iqy^ ?u Ș6Z39پH1Ofh!6O"qS}L'k^bN'~)SȘ*y*QYD\~Y0MSr\ILChz>6VֽeNȁdD e Bȗņ\A1BfM ̐fFo0sfq- LdƵuUAO3]/i$_[yOfg/ BP|Xϱ !3e.ƿCGl{PѲ vZZi^$nGl^#_3Uͦ{n(YBOsv {x|xZqD1LNP0p5SF@iN<*O{ՅE}݂q 09zEsBd/xMntO:z&X7z+iYC+~OxaJ~2=.j֝l~k˗1&  j^'QXDoN!Lhixm߭zdJHdRo2f  tH޷܁l©veìNNB>qW "M)A _ˈ] SPtV27y) c?!Jr*"=th8#J.Xڂ\n4߅/`ʤ]{>q9&/U)g&Ee-'ꍹ'Y5Y,Ͷ!p1:X`Dcedq LAl˜tFԤҞa xhe&Dy p ]z۹N7bZasuZRէ] ^ g͟:)nG`CzB>7wm$p'F\fva[t Gx!_f˔dd[?'i`0mg۸g} ÑZil0Ab':#ӱ$BBG5RLj.-cjD"ó7Af&&Bص p::l =dӛIPNm/^Ń %9 1NèOR_x /4bڱJ/s)aavd-JsSwtQ |,㋒Gq3wD0a˛O) N TT!>&5_*;Dy,Nud` '9pf J-S+տ(Ĵ%ŗ\Š|\K]8dz|;6г/zm WIc(d?D>޾34)I' 'v+C„tU;*FM F%dA_YDh ·d3Z1N@L`T^q)CD (2Ge㇏^6 @=cF P3h) RU[SN⤗aRwvj[/(+%1'?nF79@\;JӜC=4Ce=DƇ+]4Ϧ[;fyaZ:tGEX2C3lHDVM1RmO+6{:R3O\2 IҐ߁Є ŸraxWc!>.NzT\ܟhuT]Wt{o@q)X.04<<3NG7{CmQ(#:]RoS9 `K>S*I@)OdKԫODml!sC Q0躁-b6"ҏ?I^S[M_ 7R`*UMwPWb gJWu&) V,'buq=pB 2nIA&f:k:ğ @R6sh$! eS)"U.u`v`s},s%uUujsʤf8:KwuRT0@CC4EDujq+췢‶v|o6$u CX}l3QbAzQ34cbʚC@/ {jN6?sN'rj;b}N,X7O%#t{ jʆ}TL~Ȇx*!mV ХNǸ!U} cэէOg/Ms>Y^*:#G!/ kusvѳcjܼ5PiyyҌ%f<Ӑw’}T}YjcFJ5NGZI'3-2?1io -P3#&+*u#c*ཽ3F[|m, 

`;?J3MV8ysHj[/,G&X,$7 XEcq`t@^ø 髊DLUSdςWT풵͎ NǴoهdt(;ۿUC&,V?[)3bVMÄ-tU^߭2 @UmMʱXQ"T,KEONo`aWQ&h'S(!Уq3v ,+ õ*"U "Q:ۿ'һgOx}M\-B#fz Ϋ>Ĝ\?nRBN3XQFI?M8IX5"GgnCx@U?v 2e]*`kR302Ӳly˅[Br9Hk!Թ}07Y}ow2TK8]#6* 2kX@J3]ؐ{V^PKp2.4Pþ♝_/Ra\Xf< ZS֬U}LLosjն ?U]ȓt)3ƿJ4ɠnl&dɃa42Wτ,rPaR>xx-cS5Z$4EM+1W?= ~@udpNݹm"/"opɭU#RVͮI?-./ű'+ -0ԅ_L@0>Drc4>E%wUϡоyɝ0cib7ŏĂT 7fZ #ip H?]E9 WHgm@d@Az{I\s"cSygYmъQ,b1/ZFij}CnG,0 =*)2F*[bO~ˠŔTmbt|btRKN$wXUovN[ ,z$ :aL;.!i$b "h$E5PTj:?{bq#CDm RݮjU0-6.%gy_L?i9դ,,p iQð3vNt ȴjo)Uʂ j`BGE6ÿSbIcByE].M3|<$w=E ˓A1Į,Rb% {Iu]ۑonj+GF~(S%;ʗ0rGuQ{!:ԬKiRE pHz?4jH m`%9Rҽ-Z3.{=l/DMJc1~y!|c-R4%JtJ6(rvd٨/|9ڮUaUO :KgU Q.R'wkjbH3őnS3؄nB&sU bMZ_rtW!eE fZ ZqvFiNj$[L)oi_cjMYj5,rp R`FIV9Hqߨ-/??U dRx ;ub{e0J=KIY3*GCh"k)E*}IBϹk@`XE>{oJ19F]UKH{zg 5~!:EonCB_FT5Y=ttX#ݖ$(`/H"hS{wu&ݜ|WVRUg2|I%Y=sXvEl|k`^3TZIr٦5:,봫5ЌЖP$a[ӷ9m1:D Z4LU=C j9M<㋢{ VG)O8Ԡe,m&|Uyv@cL#p{^lHr -t/cp Ќ UĆB[Y]+T#*|prԞ}$O}輸7Eh5wN?Y1㨚7CgWl ҷ /]qRaQW ?'/A8촆5[]&b”6X㠜d qa;`^뺌rĺ 3v+WuX~]LI#Cy]iRǕh~>"{lX:LDVDN?h},1Κ;)$qs%fzKyynH}ݢ:J;hpN M奮gaTQ:@W[tmwCuN\;Dehφ[:p}SkjLIB6bBK~LŤ۶]uEeR0` 8˯t%6lh*+U4LbLuh[p"f& r~%a</@f8U,EV#vyxTU4{ypޒw;W2T$BܿL(ul:1=nmy^$<e|I֥PǽyCXG* ԨҟSŶ v)y7,P$^$C5nVa9U5Mq-ۭz2{W(&5Ht*}Ƅ[N  +:(.]:'H{2W絾Q$66Ɍb TJtIg4.͐tP ho*|}.VD$ji&:jcilop|7gLH5ԦO[ڣ;Gą]sNB\ǒ?8kRr|Jjd/MT^7ӫw]bƬ72WX֠@I"tR}AC!ZdfiXKA-1LF F] L7:)N:#J2sJf4%'u~=+]K[%ٌbuvAY{hyN] O"EjFoijT4! ..8zZdd21^9AA ƽ~?**o3cs7Ultog(gru`Bq! ;U "<9COJWRX]n8*#baRj`y^0i!^IՌZdnr u<amnaw$:UM3-Lo,v@~ʮ"WOGVA7|'XI'k35}ă~!dQf2 ߚ>zuc$H*+13'*Ul>̍…N$=O3@b-"ʕMhD_{'7AlG&ODڅz >u|=.bY)Qv %W[DV&F8a˞]_ŚrO['x|Oxe^/넓 q۝ըJ諻@ i9-Lܲ+i3!>Ej]MI/eC,cA"nfn͖Q}^ڐkn彡7ϳI>!v# Z/Z7mjT9ثDm}IgKYŦ}ls#{0jM{8v)+}>s3%Ϯk[W2hvϚY0|EU"cz AFc0D3Q>lt>yɺ"$χ|Y&zkz}_ʆ6n*bNSct ua>jAlኛ3 ~0 RM7!\bGp{ZT/U\_|{IֈG1GgY@Ҥ: Z=Nu#S8v_Fm @l0& Z8΢Ι\|A*Ab 209:|r (b_0u* Z-SFa^LG)KQCPJ)rѓH l [`},u`wpT$:2L#hgљb/%or0AwO#Eh0UD;ޓ)) j߹Z_\O1!:->sZGAWX۝(j3.`yS_bh x.~.xr&Y|=w]6νBC11s+EjBu[ ~y@5ca3-ykym=!~8'ﯬ 7 -Cǹ? c2 /uFDGXL.nB˘sdoyBLj>z}y|y2ln_Ye%x G ~>Pj6֚?Φ;(^G|<&]q'xV%w"i3x=5).{fB1헺 @W' |p/.8UϢagdk\aͥ3|Iu0294(-.sRi,jX7%rJv(۹W[Wi1XY& =$0g{uPWGWe6U<vNV&9ŚUȅ~r2ʖiͧ*+ϋ?#1As._)I!?Rz\kzٴK'p͑C+ۏ~_in\Z/ҎgJr<@BHo69厩.)+u5ţr\/N,o1lii[w]eoH WYL1Pplמ)M`O H[Tc2Y/sibjc~4]=P_7V)dR5/|wDj*J,,Tzg 3ItoTgS!tY4Or'vu\ܤ* JXRJ>K$&Z* vD>鯱ae+1 >bC~Ya8Y--R.m5i%5Gs q‚Ǔ{(ڎc?Imߎw[kG,+T\GVQ6rz: NbW@AئGmb,k)^p&X(P%b<GoBU`=E=~Mz7bYc~ .U1h;'`BdUͧdy2;v@Z 粐 FdloDą|#:sc? r2YEk+P+Id\٣,S!Җh@4Ts7jKvw< F&pӲ1oG^kCd+JFX*Ft +ȅ@;h]E SgNlvvU~c@hD ࡺ# 43FEr͝{_R.W["Ʌs| i 9"dݍMFWL~)_^:T%jU ve,_ j/YFI!29f̫ՆR;}#سu ec&V}yZξ!!1U{\Y_z؀¨nBD,OT L L^b'ط{`~8Iu,"ʶπxޖCS~1: mve}Ж ;rJHs,XFR$gvւ]nKGKѿB:Ѫǽ0EFQ UzG4 T}Zm@2 q+ md]ְ_slG`Ϯ6R `q`9|{b"+J_nJkŵi:B*`f0NH1@N~O* \[Q6mW[@K,iXA9#2{jqsq`<ab^I8='6/sFS6s1F!S3̵D(q+Sw@6xmKRx#,Kw_Vii1`{Fq@̟R뻶ܜ䟶g3/{ ΤQI {E㇜1?|d }@n0wM\ -(qD)2@nB~ T(wox;*Nv@u-mq=+g׹QEڙ׷g~Sy'HϮ.lݳ"(mzk#j FtwI35`@*S,e6vgA#s5!#NUo1T3m1džSso;5Rh,q2?ԜqBxo?8,ȯk UA 3t\A_,AS{G :RGp4פtN-dëmSB7 ^VwL(˶~AX&j2MmUGbgSuXfB27 zh%L#yx ˿Q}szw Z]['8,p-A$XA܉ɖ#o`gP*um3?8d~*mKU%; ㏥4]c ,ll?UJcrm`:Jl Jy7:Z$lnEYk[G"px%?r}j& ]w3S3ѵ{L&`\]qOT9_;}<ࠄq$$8)>:";HvFsC2)␊}V=y䴮0J},^ZuPE"0K(5G fV82 9Y?]^F;?Wϰ`9Fc>G)q[.Efp0zp͡E_.+ b2,`8B DQenP(@ }n {3ߡSR' Rg)$w9|Bi4=q|󄂼蘩,zph0"_U( gu?j=aWEۏATAqVܝv}J܂Xmb Y4sUboAU%FHҸߛKLjH1=rbc\Y;sOyL瑀M9fD2FC$T_ogr27 ݗPGO[f_'YΒz|ziQTf.Y"Q*( L|u5/^k"%ٙuWrN.^z#4̔I$3p5ӕYR%u ۖsLiNz.ZU_\W3|-Scrᵉ>[S<$0%TM#O + R =gU _25\,tdBy"S=r·wEx-)9SQɢb5!:u~{ O+'/'dB"p,F/ l+xs_[X"n8vyQ2_Nרn@q5,TXqzIq~%Ũ"K*;09- &Rq喙Bg޽hR [wJc|EU~YVّTb(3~9KASi?g{)7XkLv1B]5co ҿE SUbF[̻3ob ?y;Kpxΰ!UmɵTza6 *z48tƕfVY#vqz\b7>jk\GZ3/:.H_~wI[c -:KGo茢 {Ԑd|ޅ1O,B[3b%'BUwRl?$a~U6:@ZI R<}? '-5յ~iڜ)5dRB0Y-X.wLx'\q݇}b_ɣP:Ёt=-ĠMLx. cŇu(ZnT/ĉ7".E^ ѓ`lӟ ф>m' u/zAT:T9e1!yXK1͐EbR'JD`B͏cr[D”!x?)DͰw'H]Bф/lei;Mp"X}.H>qݖc\Mݎ]Bu-|Thߕz"r"1 F%:SV~gT` (KdEoH+$WȿZ\7\q7׌WsVD3cPO|}MYJʬBmC qW>c 7O|g|}/Cc7 vS:XXkQn {2`QTv䉚)mXNDCFlZ{I&DnRwM4o!ٰ+=3h @h>v'ȀބC F?}Qy&W+1S/TGVh2k\ !SH* O {2W.|7J;"ھ5w&+%tN;TNZʜb̵xb¤Hgf6hW<:/F5">w]w)ft?Y 1u/j5qx;au=1ڞa3qy7{t2KNG\ٲND=|#18rН8:c*k:Ê"pmH8&0 >:] 9!LVj"EmYk P:c:8Ū-K#mOj6b̓'t>҅Ǚc<;'<6M;?-ygdŨzQcOs^j@/5g.^mbd(2 od(`@Re9RTy?8%5ڐo닸I|+0ӁjFc>WHG)b2ûYF@uˢ{?VMwQʝ/ Fsf ׷מTT NRi"tLEC -E/2c✥,e;L\7ڹZ38-bceՔͷl̯Z/aM^r ~; j,(rzYgPRWHW*i]nwq I)XݰB>ݲx/JtgPhL%Ql9OZ\0Rײ{c4mAP*,of[93meo@uh 5w2:I 6zh=TTޘb OV셆-J蕽"ro48nh7t 0me,8с sXt 궣ܦ]Ml]cs{7ɺ66)ظBѓ}@dO @x (r2;mKX4̙u[k1˟jeGl|.SQE)~mGN%BDBsa2Dp1 }Jו36ެ#S4G0\C9=YqWuSaV8`#—8$V(n(2V5BlxP@1ZJwU_/YYRБh$'sBB&ԗϮ"i  .4] dbBP+ӳRy۴;M6Ϭ(Kx@N_E91ַҺ'$)gFnN4]ʙbzRWܰ 2M"!|p]| EWZQ p`ڎ;W[7m 9025(QC3*+MKm u2 k+K[vŻp# aT%X)* ~f*> rlebbyttiWXxIcEb&X&-`7b9/V:u«@^*"HnȢH TcLU^S 㩟4N-/XzA+2OeLPk!uq]W0p;u[qݐ ׯ`HXwup.tKjcLyyZtI> iÇ8_&[0/xކݭ?$GV"R -=|m'_baf$ۺmC2\92!9l꧹x jHtHd"D\ȐqGٓ7/h&Zj k8E/_ N+WH!Mf# %L@jf, Utx 1԰0U2)#)[̝,k!#' z1RǵRJZKl܁C=œ~9[W|5-lኤ.ZbސPr|};+5NE}lJ? dU)s0:xE欔 tS^pvhI2; =vyšK|B adU?cThs%_\yMGx8L vyMDBa?t;FWWT<0>w]k>;We@W#8K ڳ'׺%QiSnl ^ԃ쉜\oSދwON7o;C?n_y7^YlǮc_:wŹ5}\ޫc87u4)30xğ ߓj[?&[Ρ=hh[c/M-PC?_JU8{\hh!؅p} p;se;_7kuT+Tef>hRx1.ƷӅ~Q`X^u`daU@eh#6 +]yI~Dd䩔+g[30uda`0dfl"z/=ajBMneP_+w0nE<"m_ !kD ﻎєMM~N v5 !z'ͬ qK2sRL\St%ˈ \ź_6 ||E1K@;;P#PBs'X3Y} ;-pA"0ǥKVuoٻ091YWd(M#N^Ԃ9 V*?lܡ !v3>% ѡwU%?U)DZ\ =K,@3[ +&ʴ]̽h;Lc[^VLHT&9O^g $oY9%`. #b_[?J OW49QA,2$튤(LէyG5f -~$?Fکs3  wni= O: n2Gt3,gȄˢ'g=w?l"<3?xsk辤u`J&x!m\o#Uj9ôLPsXzr0v!)ơgm_7gd(BagZdӨR Wa0!XRd4-b.Š%uA> Jyq\O_fh"ĘƑmc\'*93ـu^H(]J5+DJO+~F=w^7}x.U<9^Rzi`Uz&á^hxZ3"E(.X؄ ھY'ϨZɞ";s#Pw05NDg-ۦ] Ʈmk5괁xaq /YFkYߏz&‹pI?CKft%a妾?Bzɇb0jh9D]SE*^)epQ  ƿ-Uk2̑v˔<%Xl>dC$C ?A\``n6-0=ll2oDN_np¤ܧb Osf5Q<]GW{@Cm2: &{zҰZNkM Ŝtd!83kz(zyU/ZnZ=n78CJ#ӍmhrTrp8{+$ +dk4z_<20fba3;$<˷1kG_ ƽr)s3*G>.a2+'E%+1|fYYvJ7t1?w+ S(,a:Xٱ8nⓊC_g_5썺Q!2טaF{ye pN2{%&Duw6Cg`=,'6 F. ],D.i/9%_ ɠI )v?}4"߷|{ocri'F冏ԃ4T,50)*,!>k_E4"~eG–$yhZRYKp;!qXeUՍ 2E9~XzӚɍԘ.Qm3 oe#;)`@(Ѽ=t{ƥ)#ۘ>kl(e0n6?p8ϒǦSˎlFԬ:eeSTƎO5 ~ Gs'γ9#KWYgrk5-XBx(n;ޮ҂5!fl9HLVaF[{, M6{O_Af Z{M@6[m%ݼ8a~Bnp]b. ylfJ4"N enء+?UjW/Es"HM@PAi>Y5A/Xpfv ޑ7Nx~sݧhbqYcKi ~(ptr3'+!2lޯsA۳idS"EerPASHKL1][ʛ0"Ǥ`.|㌂6Lm{g:\q qr|ۃLXWcMݭW{V{竲n }!{Spy !ea1cpJdi4țlnOeGg9H4T恗3խHmwxj-qHAձ|,0 .UTn @d:=:A݇n h;ص=dX+xLp ~ fo*1vo~h&YGS4#uw@oV 4Ekԅt Ksu42ddOhK!A?\U 9t1FݝMMZb 3]@-{7yf34-kU]q  Y߷I>*Ndx/fOR-͐a_w43Cc򛇔74ƀv+XGj5f%=g,950eِ&'S' iٞڈ[s v ʘ+Y-/ryIEϊKU =--1,dI|ͷFRQȊ4VXקR0[Ufͳyͧ*_Z>)o]jX?T0eP'`ͧxZv=М>"-Q.&ڝБ)>'ɑnYq/vg)0Jxec Z,Ns|=q4zAΫZ1jZ ˕eE]ί6yVQQ.e:Ohj/Ib'9U#!)0J W?:\_~\XcLLDHe+u j`|.أrȝG&pm*[lx&ES E4$ϒNuGfףG` MͳoTlJK] oydL{Ŵ!zim`1 ֱ(]r1}ćcenm^۟}ic[ȈR_;7y`W-` swFpir8n7(#\#k؜SuJqaSl(g;BQrT˰H&䵾 47΅]lG.|W2 G3u65 ܄T(.hoWw'(mpeP9LNOE\wlGYTB?\PAb;3m}/ؘK#{8Γk .8xQ6* L2UGP\eoXqۮ'_,,>b ?{Z{N"}) mKBӒBx#Dw~,@usҌgl{EurE-{,t *D:8P y|RRel=ҿY|Ɣq5nTx bz,o ~=4c_>@%ܝ=f<8=?u muRa&om&e1OBBS I^h!/t~ 'YnwOK4Eۈ<;'®ռK{T\ޤn ^gQmot1@E-e>E+eU,pg܋t/M/!9^aSrKEawt[Ӷ)A[?wH,z^, K7D3 A:*gxj[cb&-JpUKEK4..o): SYm}* {kD]f}NuCxR/Ocj!̮Ѭ< Nmܰ{j,0V=͚)|?1moNM K9t4) _KΎ53ioYH ~áơ %/R{l+MRM"~ tZ>%dV}[*un6x!E/n?S\ N\ʂlG '̻# z i2OHO^m[UTAxWN׾Uqx ?/ڝjDcZh)AzgJE/*\gpbll]԰m9"O-"VRyK,U#-]n_7/EIԃC9aCjj>Wu(lF 2kkeU SCeS=OO6u:1KagǢ<㉶١kV 8qS]/ApkνFzλ㟙l@@|n7 Ǐ< 3(%bG-K] ZM,t_ǎW;HᅩԌƂ D!?wџgذņ?&W:] +PP-q fiO:綾$IG E <`XeU?c̮[- QXodIstM~n e`0+4Y'?1Ҕ6wazlcL!,~snG$"Wkĉ'faz^Y":X d J=m8Kߥ$o {_MG_[wL߽`S'#MKnG}Yt7Bذ !z|w1L{hlyj[) Y!L)zsY?(8tZU sEHa|4Ԋ˷8`9qR":wm[)۞+ePr& \ٸ j̰i5(6Pj%g+N Cf 0luK zf}j'8kd$M}N,,f-)ce&T^/]BDg݆Aohfwy#<)o|kqW'W6WrgV x)'`d=j%ҙ*~~e^v/hR24A[ Jb\/ ߏET77dAL!z{k /2\fXv+mE:J &vI9?K; )+%=#LSN$ۧGE~Vzbuȏh`/L:c%6[yh 4+%fgdɑ>-dץψ;Gf5y]gHtWX&eh莩cIP;{EQgSeg<4\#])ƟW<+@I-H@@?q%O5}[)7|FXRYP b4Qgb`V 1G vDqRcX[Q|1(7mݑ0wq(_1w7i]ywHv5=`]Pe9n]EAV0ܝFnq!B[3D)#G[%5WP(hkQfCb.T(kCs\ z!S<4q댅C%~\e qW͛5gf`oRbќwfeBK 0nQ/lFߐGgvm=' 2Pz鋏9-*hAnz1ZsP1Ĉ_TCU8(|/ao~da:8 F T.s?-=֧G,DmX%ܐ^ࢭoh@9+3TF`5G۟R {jue@+ofYu{'*eFwZ(.1 c5-lثS= @bzcaAimǂ~:]+c T3}MSUW$oE̖ǑǽuzRE(6D(CK('L9.ͱR{ee3As²iD1 52P8?ZZ=ܼ=GFgl"}xg(ڜl]0P|o\',/LL>p% f=8O#6= ^ßm7s" >MK;Lqˎ0Iάg%shf ;dg_Lmr!Ŵ+RsLĒ..椗 yV=sa#5@))VIށ_DMR}% @W_G]4Rb} ggyA'8^X9=mg0XGGY^V;2Y.F!H~DV bTч*QXjwKrPWRt>V̶࠘Ku&KŇyBѢM2Yz b>Uj;=#vrK95Ȣ˱$NeF޽/p{c0x%듌nJvilwI{hilG%2ZZk~vOb /J59Nc{7s6ge+QYp\c*Zy.%$a{4v,7jdL * 8|t- PJ6} )4ZVh'ԯv)$:ە,"D A+ЏFo4}[ν́ǎ<YĤO"`hB:"hYM/3B l8%@A Ee򊵔4vAE'`R0ahM/u\LcmQ*&-d_q=0,Uw'DcJpx^D%Z`˺3g=9使,v*tϫi>2 Wv76hS VEm}R,1|2!P>kM6PX=4 :_C>~%!A;0rlnhԃhijAo5/F}HfR[TXY~#}]/pu^FW67.wXq"GQi cG "G9cbD>+QY"6KJ;q,?hs_1ȭV#,sSfIpo񃕭u`_8>J `# ~"DnԸ=XƠj lz$~}TS)PAJDKn\Ut~vl7* -QT0 ptXҳF. /7`1z Kv*ӸA|\?D`{6Tȵ8$^Uw$bDq7V삺ުi(sbHѰ5N؇t Lhj;SpW~a֔;Mr <2mM^D $3GE9xȯ*{"*(z66en#%I\lG0QgF=Ls˪x` .E@ӲT W|([;ڳuH ;62 ZuxFX,WRѱ?j̧SsN8>FV_R%A&?`_\4?W}mvژȧfRIܐCf6/g쩨uu++WǽhPϻ0`_)Koۜ6=Ky_ ۝PHm;]&.q9/ڧ _eF-f(=n1ٙ5*IYG4ڔ^$Ϧמ8{kzw2%PEOin\h$u0AӖ> f -7bΌ:z$bb2=;@$4o&pgЋ@i 39^U1 N" l.uwFZ,jbul{-Z .oJP_!&pd)'F . `ny# y4\ـK"aт)ꭚ$dKeRE-P08GrγWW1)(Ч%~߿P-J@g܁]3-M3`Y!ZAU:1|1B|HIfкED"|H $ vb?꣔?H !T' }<(CsFm0 O+iԠ gubIIsGz[=UN dR;x@2rζbHF=/io)Wj"yi*ּQݶ #YK?7 '?*uZʚN9O-9l6Wour~o$#y u;ڒ$ѸXYb5-E O_aXRCi9N5FDc}N$BG9aΘ)_NJ'͎q uU<\4N9[D^XdGPctdy';0uMn[xrxC p$ ÊMp7 Io dv4|y{akWϻS5jj+x@aD~p\M.=DQvRs=$ڰ[ym;{ RL`Eu RChJh_H$`frʻw#F/TfFq>aIqҦ Zs b-iLYhR(ǻmƻ291ny1:-ќ͕  1r',^ f=hg#m<ݱXqw!$!iG^dfLכ~rʾ{VUWRDw;Et--|SC9Tavg|8ax JBzI?Hٵ?~nGP)'D9ӥَ郃&VlAy\e"_~p5 EDMDEh{RSTFkky؊" Sv_;qIM*+fgUH̄z[LKI!0PҴh_Ì: fñ!bzAkUuqV@ ِb/Ӭeys8NWO"wj12ć yTkoC1HāL> XGL0J(DO ! +idtKjaZdI7;ᓅ QΕjɀ^yF6s͹h/p# ԅtF v&S Lx’I螵UkZ:,# 52.3H`ľM_p;/s~i} 'P~p xٗM!J壜- NJAȅ(-RR|&|AID_@[\R4^?*0Ј)9gZ@6RH#TޘgW !jdqqB箲C'1V lV^ΨFa^= |88"\la4P.7-k Q9T}3.==$sb|ЕLz؀McPv dL-|Ɵn@AS8Oaט*Sy(j|ڕX:cı7+P `ЕS瓑yw,s[1rn|:|)QG_yTBUU?cuRjuM9X#aܩ򻥈-mit5cxԖj,1hQ<2T<[+@z~=V"À*u闌V:\eq1$ghst>SO%C*.}i+c.CT_IkGC##?=/ҏg^j鉭1_rKEh(hviSNt͸d9ڬ% e-&%CC^Hprn#"Lޓ,+]e6},-3>W 4Aky@GsJ:Q} :w9vK_PRcSVejC)$>@i9ygGQBl?M^РAҌ\tnbU=gc0hCM끯4x_AFE<ALwz%t&k 4wn8F]T zX#+| 5=3{aIim(u݃O@1=-&`YUrnqNMI`rx \`l߀;l{,:9l ^̍z4zkmPU\d_S]D>}V+,CWֲM(|Nҽdoo8zLC@G+Gx>w9.wXWj8QiV]Tw/cV 1A{:&6U)Ȑo([>Ԛ+4]ng]p]/jbvQH(&Y[U0j׊so"S!;~'],EQ#XC3m5\@*Ou0 =qB5# q𴇔YA&\!2׬_Uo{+Yqūs^eo~! }X]T .o_\ذ Sz45KgTGԋ?XөI|u$Yۇ}ա/rJ^=E!3y8.y qc "*_ұRHX3tu#YoLME/R]tݤ^OedK'[7&0f;ЎFq?"FG,45_"Xpm9$7ǘJfLB&<^YqeTx?=dN&F36> 0KR \:b|ibʦ,OvU5FL7Q8"$xs" {v&BWVQr˅bXHWϨ'Ri>lGbD/7xL0QkJZUJ2Pt+WYsj%S8&i[&ߐY@PK}X%r-k-5Y15ₐ c]/"h.vtBDG0Ba $u)E k=şSzY CvF*8?oW n,8;qg@cQ4NzXA{^]+" ʧx2al2{kЯJ}` @K?0g}U$*|*BE v"iF,YSV:SC]i_a;:8J۠u5Vu&.ɔV8 0ݼZ0x[ouJڸ'J)@{u%ΠP~)rטXbR1,E⦈ oD9/~Sm#&d5W{IPcn"́'ϼ;\r,NnNME2S0Pw- L48.Sɺz-ZZ+B0q.O܌ssi£fIҲn>-Uk> "ϼ#ۤ-g3w7?SW$kKKIa?z=>4`z&wmMwCR4/BʑeR!èYaBN/ҍxt2`Џr$ĨJDCsUCJ7Δn}1 h*й'r!۠Ը̹n}<E&qϭ_\L@?OsJ~h."TCyMU}Yl$ EHT\n)-}GB\s ,r91uceP"> BC(ܴ=?s عityX#ϡ;CAZW1m1گ+Y Fpa"z 1[6pCũ% 3A\_ )u9[:9Z&D<一 0;3~{2*Pi$jBnJ) _9'*ba XKV/0>u%|/  YLna#-+nIqR?}zdI>)3h>nd2[} [ >gZȄҘ ƟrX|?&u@8L*| x =U'6 zjK߫{a6䑎Z;CSuf{\vnJ^dV/tcNB[ :|OyqnN_&CX udaNHj޿nA|ޕSc mXEe %d`y@Fsǻi> H'hU'Hhjt7P? ^p\ [|>nC^VWe(Gu@)xb>c%U߶yЮ7N9>dxHvO4b0}'J/ ~\^ϐ+֠O @|[ڏ{b>r3 cir4e 5xƪۥKھEgrSfzKgf6!Vѱ3 a߉nR2QoѣC2!p^t ZB#ז9|]'HTMaRA']5WyG:% Cu.&; 1ߏhCxB cO3 ̏|۪0'nӢ%Ya+I=Wut YaX+̔؉FPqHgl`ZC'Q7k`ړE>[9(`U Sq*1=P @2mJj@ TLq}ڀB:ĝ,^R0|b7&yV=YDť1ghCN#1&="i@P7Dc8ApJI2c'E M0˟ځSvy,`͔AbtTmg?`Ap$k&%Ҹ8s?ZIp&H_j_HWhCp|ʡh&WŘYWd/z<eO1eh`~X?TSwG$Ia\pAUbs̶n1PmNۤmU W϶EUI=_Nyў9~+^h-g6C51t O|.V{fNpOG7gN$8 M^m=<91Rf#c_-=ګWa'+kFV[BII,px ]>Lx@fz߿97Se-q,_s枧bt3,L=j$b0,G ~K-:D;bw4𹱆!Z|k NŮE42J q_a=%r vc16kEaxg< M&oAL,ot9O,|}rY}:km5reJo@W=j2@ajʵlnY2ӟH@e: PI4x4=`dhb_%.>u0b_ qG BM Q!E^D@_tOk^H"؇+.0 qBwvw7ÉeU 4RhWLr跇<{i kQn}U=\", YRL[#ԉI[NZ74 #2 LT/YЍ)&'5PhRY-f}>#)HxBGƂ.dYZYjO"Hnef7fyl.:Dl u!-GHc˘ urJhlyicQ7A<ÿnD z턅0|Io%!XZ֭n{<f -U~G1e5@LJSw+(4.!&#`^cئCX~Y /Q9g uZф|>8fr!l~JYD=ȏ[ÔxU쎰AacD;e@o;pLyQ)MgqkAϨ8kz$$,nۦŏ*Ʀ}AACꝢ(.)_*٣ Ӗѣ 0*5 _&]hőO)#ce+t~}3n IgtJx-'S#0U0TM Hoמf4KS;7-F=E2b ݷ)ԼDxF-o x5[֞<EAޗZW–AHzϱ$ ( (uFU k7%6?O]G 1G 5WމA?YtБ"ʺvS9խҀ ۾40m2sTOU.zA:4,5-!ZS#<n@’/UǾ(e ʤ)0mKg}3SL.m`7A{P$ӊ2fALt^$8w8:/c?amsWL]=1!^nZŜZd[YYo+-͞H&*f\_Oy@_N31XE3PH<{dΊi#ǜmI[觛St Bgt;51Mqsl\Ė)q)$ij * 'ORӠx(dYuO3yT%E=\Jk$f>hEh##D7>W'Ίj*D7jW,66 ۃcVʬ&@[fEE&{ Q2^A~0QWDŰ_"Fgn62:hq| ?[`BRH@D{T:xhYӯV0:΁`o, OEaFtZRڀRt 0B5r֨Vaw28Wҹ1k ێ\LA޻O 'AXmUϦE=`TfS^Y`fЯR :nl'We սcH̳ *񺴒ʑuG!j/\_F4cngPb鄊D/B#Y7)" x'2fқ|eQX(C**P`B)~6} tIoTȷ_}N[/t#37[;yA,1;bh6@8oc0N=b#޸77uj F`#UV_tKFO )LLTBPa n# Ȝx%ۓd*hMp` ɥ0-Jk'Unc0f21aZDIwЭK9'&wvDPJo]%83fʒXqgV#_WYG7ֈ]ꋠYkMc J"E٣HMI+h((iNVԋΚ8r+eJwՓ0lJ|K CJtg$%!Ldhr}aJ/Y=.;?XwowgBJ){`ݏA \5q.Ax `MG"DnD[jwn6x1p{ޞnhߑ-2tfF_0"*K1[% BݘMH9I8LS })Zk%3տH\X(q頢"0&ŗھZ㩑x%g)\?8/ r;vL|F2+-Q˘슦t8F/3ٷpxof ]{ Ɍy{J\;3=&Q.}.6/vBEg=f&ѧZ-#%?*ۧx$gȻkea4XO J&ݔ&6[?D5\K1Sh:j֑B#.w>/7 [s<>Pa5؀z,9-d4j!,8Zc Y7Jքd8RI5Yl]W\2Q)rqL`7bU a7!=M_΁&P6m<@} G9B5oe%g`mƏԱdF7W ^$JkݧTqaIFh~BZ ]u(pJ[w|6!0 ?èId.`ck1Fߩ"SWR*Xgh3gl1y/r6i<|D} ;n~B1-T|i;]V`}ʫ Zba[h2TSBM%'Y! Q %}AY4Ң#2kEkHďa5HמGQCR%]9N|R{۵pF}UYyt^mf0 ᘽ}xԾj$F!#OlY4ď<`k`(8\X3r~!m J!3= Ǭ}WD(1ʼnW$O 2 ,ҥ+ dMMyP{13fU޸\4">KѼ0^xQFHEx.pxVv;qO88U0 j~I4 aKΤvS?.^V7r԰o߯4 ?ҫ`BFٶDZ&o9ACїC5IgXM`tFm=vDFF j7HR3M"DE/vqv2$pð++}),=$N(vBrQȽȴGm+qmNd;.# i?*ljR[4Վ> a\7Y ai3fiW 1(-|5h1( goɃr}K9%W&GyUT70TʗI@Z_UxjA:|ch@)7)HYDM@Fg01I_Vnu.C+뾺EZt7)= Q0&wߖ1u?LS Vެm~;gX"s"ˏ/$/ow!FhIQP[KzCSy҅U 5Ew73컵1[‘ƣIE8_ qojU2je Ût%(cuAL>0#OuL9e7<,m& w1F  = 'Cbs~چx;H-d+'!PFcf2I_/pP4 xHf 6+3/ˢl)tG4C[r, >4ٱg!dM0 ~lun䔀b8V?jĨ?S\9 ?H%7@x^Ѭvy`;"ׂ(ci;ȨD3=yv%@ P->m8h0--2sT Ʌoщ[M>Zw, j1X`-QFo;*T-9`DJ%) 4$Tq-ah@G=y y)Y5 ie*f =%j Qc]B:a´aՊ͏ʟ)RU9-u?~wٓDcbiKڝ?y4@pQEIE, [w)e&I:x+Y ̋=WB;ߋd| EvARcĺk?OL㹗UCNnZ-){h"WRA y|J oN\,q>w@Yuqj=as[+_ĸ {2 R^@}968V7g cghy}z\/; 4(MnO-Y`?ƂQigA|dso+iW79_ 1I)^D*~915Oղ׆6B W;KdZ bq{*M|O6NÐ$u5BWl`o|/jRi{_XRd^F+S΁x8,\;\*"[FI^#Jt-7wH?RD}q&|!Y_u3Ts"76k@0LbR:FR=8OLl*җ?f]\yv&Nc4ϤT}[Biy3c~H>9d;n|Tӣ~/%J 'yow4?pcYh@LM{oE !q˨/Wuŧlm]6?`7fa+\G&8s~HR@oP0O+elGmGxw 9R7D{+vhފ+Cr `W@ ד:4kC@g|<,ɷ!mZyDžeF}`9,P)ոс BI7&R.tD|sO1,GbOor`Wa4`Ѩm]+(s|=kЫg<_KDA%Ek |i 0䉰fsļS%~QS=hex4z9Ua򰒃nE2@9!鷮:IcCIYeYH]m\%Z߻G0%Fv)P9ЅA]dy9tfnb8{#5oV 1+S].y* #PS/&-W$"BnD!2ѹ@w$ѥN:35_m/?Y_xli Kne؄qTJL0\VUP(*<Ɨ\E8ǁ.[0.u*R9'*Zn$yRn[OPDe>[{(P I"ƀw z~6Z&)4ےS9 N{ʃ(LwPoBȿu~b0lGՄ!/ÉO ܬAE9R_`^ 8(#*7ͷp4S3] p7E׏b Po5l6SV{k-mY7}vc0W3Lߥ y[\%.h{cS֦lV %ʭtJBc0'#lPSDmOŁ}w|c9m?WqJ_Χmֵpbt=KnR#S;ZaiN?hBIئC[\`ʷIkWY[]g*w~B%LQ~*LΥT~Kn}3횦! {7QF{Zz8F-2FimD&"탑ZBIypzn~oFã|-i7<Ͷ"B8ǶVc𜱨pų|Q8@u p&@O®c[>ǴirVa"aoQoBnu׊+q.7 @~ҹk[}G= kň Isj\4U3(9LJ<œkD\,otŮ4>nr]w~wL%[Pc;I8*Vv݅g5QBF8싀k6tՉxciCP4.yL\Ȋ=~3JIJk1pg7AvmʄwH揦NP<,vTR,0!һQ}hA>^ڮ졒StJ~Ɇ3*yt> (溒wEڔ̃ڤdž|ފjңV긣*!WtANP 4vx9A';'0&sHiG]1_G޳rR9II"sv@nz*Spx U N䉙(ex1p ̝J&;xu uvB)J^9(4j3:Bӑij&yq~neYXtP0^BI& ]Jϗ"q^=="NÀZQxϑ,\d 4N>c˟~Qņi6dUc1΋|.`tv ʻ&sVyO׶ddݍ ?ha f%5k1d3 _*? K9$ɼy)!hllN'MZӺXw镭IYe(B  zj ] .zlFPǥ7Y/=5c<)pF8DvYđ%7MOi,D=^c_J<o$|:S)÷!%~"5:2݇iR3sEHױ[_O&KBr}oԕm UvDx'tн *kOjo«aD|"5ĔwcD^VY(]{d)  N֑B&UUT5`0~ԉbx6X#pjs>4^ Ǹ76cR3lL2UAn VBס $JǁˡXE)mfE̷ؖOJ&w΢1IrTI=NAY{XLp#0!ia(G'DQQ$ D9!$7`.xbF5>c!>jCA ^6sIzsbmH;ϫnq} dk_x, Ȉ:,g^h:{-u}IVu"ee"# -Q'q*;c>( K(̍u8ĵ_dɱ̿$4ͬIӀM8pDzxCLĹI,?n<(L=w4[̫m=lk9 y IL+ۜmrDlq:J*ԧRM>d1xZb3 rh-s{mZEDMHtRpa I8 ;B3,C2 ͻ$Q }#tDn,td1e^җjl^3Sf#oBD1RF@e’ٲƦKɩMN{j؇X=߭yY:Wvh V8nf /]% _4SDn\ =JnvJ Qt؛wH` a@?KLq۱a7;At=%ý-3J1 \ƯN1Unm<(AP>'ˌd8D(Ķ1ʺW?9ԡ#3v{8?` ı8.MZ2|fv%vlUzpY!揜TU>0b^pC:<I>nr\*>Ms!oT[ʳ 9 W:e*Ei*-Boħ͋,dIg* dMɢ=o1' 6^d<G>xh7! j@ńxjLp T+`t{{ɖi "~D"|&F$v8ɇ.3')zueV } (B&5%=hX몵LbVM5Б2rl2]&1I⼯\M&=<,24{zke/ 4H$|, `Dψ0}t#j]Ie@HVpmr#C`~mU<20_%qiG<ܷLn%R֥HƇQz f)xn_Mo;.`O@~ G6Dk'APޱM'D,a'p5½3 v/67]{ 5(l"-kBbiM {0t6:P zЯrWs?Ds"/ ܛ]ЅÐWԋ^ @f^ @&wTTݜ;]n[7@d3_ʉ.?V0Sd|nmqH*' bci z>&"DX{i4,oE$@H/ \pX6{=G)x=X`8qsfN5?}I7eOy y]fӪүLEEsDoR zot [jW0$4.;|z֧\i1j\P~(d;{,osbBLaЁ`Fxtͳt#bMɀ0k !_j|NRSb"iPDSE&aܯ&!U4,Fab5=kϸquZK?(X)9` }Q}H.3?LuUo̺ l&pB;s&z(124!Gx^}ۑ+xt߆B]v?]~$ UwU?y$fW3\ʕR-kZJWMLS>}cj0`ӣ(wOZ T@-齇.v,P%.bz%gMͣ{qy3Z@n(%D3+c21Kذ D]* 6̙`W)i\<"؞;bP蕚vc@ HՑcyWeĘ> >U hLn:ה,P4G(̳X?cQn?k8/=}Z S&BNM7X+m'{!o~8#lDU^_:I_ںFW8֩4#tVfs"/ٌ2L;C_K:s@S=zQi,2\Ua惺/OZrou» HϔhV 3Voc{ H1,\K4$N? k?d1ڸ)-՜#qPk"K^-8NVzW6UԨ2BCy`̙~ˍhZ#*$Tu?gUk}hLUS% ֎9qi8.&Mn0b.\†1(KǍBDQ'8nF3UlΤEU#X"ʷ+T8ߤe(y3,i,mΊ7* 0·.o=.KU X> @=K߬EmC Q< QGp@+JF<= RR3dx(iWD=hBAGgiH+Z9/d<}#6%u#qiFWe}EwdvGt[PUH$%:vP.f-~9cýg|0.O% mu,%̿bJ[ˡ0QMr/6Gs$\4EbUJ Թ6C5SZ|.W h "3/;4t0\]jO]NrD3Mo Po/MEC&9ԅCm38/bj׷KK}H/hht\8J/h,u}*u!(1~2ZPR 5MXJwe6LDUSCҹ9̂F!dWdȟ[ݛC8* 2Ylrwc b|4w{z'.D% 側yY"c$kfJ3X3ZWrzFg2x N-6ܽS"J] Kh9ስ?ALTG~# zz;F[5ʖk #j% ynJiy>X6>>VJ=XPnG(kʶLaّ Riꉡ.u7'+MTB$DMXBVA] eAKe,QUv&:?VXӬR9I|ָHnghefLwY)ᛨsJ#NbR ?(/齬Fagd8ͷKXS<&m1J+%Dx+VTb.#Ibphm]U[l'قAfE٬$׳(toI4ɡZGLìR|`z mh!7ؗثRGr>-: #M1s"'R^95ICG:ܤ5:GpH ~sLKQ @$ $CŠ5q@4hCqwo {59aiu0Aʭ[6.LJкm/ !2FP>Hk@qVYdC}܃,1KfA@lrS1`x GvnhYnBAA-]^ {Ju[MGMᶻ|.f(6XqxKi=KC*2u24^5FvWl֘D bڰc*Ahvܥ,:׎{pnV:>aSpU9yTTJe33jb p:xa @H)#T zwkT &SYCϗݯR)zw*~"I8/JW,B#0Ħe1ݼhg!ܙYL6(`PkPJUg[i5fw&{Xqrp\F 2.Xy{((\U2ɠ-H*(XNi +K`ݠ]6֫b,}0,rwEԧ .X^o5{6c./>0"EbC,B!%adp8>oQ-a?z*'P?Vz++&:%N?O=E@v,Nj,u:?.zlR=:XB+׃@^CJ_됑4TCNȭwC0(2ju~c2۴]-am{6XYӓN"jWρ6D>Ћ[c)7B;e8ޥDׂ&[q+ΫǛ41/WJ`sʲ^RԵ!VnRdUG.X-,ZMS'{ZtYPc֝Wz;-_/?,62Wm}ʞ%Zѧb &_7R$Ծ0R\γ%Lv=qJk@>t$w6 XyOE˃־V)ɪABfT]!|FmZ14c}M>d44ϟ+djs}77&`_{LMG+'->0 fu>#^#`Pe!>0|Ze& ebOxYgjHU \C!_Q,RC( b9ɿn 4G53[O/_QrSrG|ŞF}2 66SΦY# 7 iNx|?wn ʊ^|uSY\1jix'{{ 򕃘X!G5l:D #c% <ڜ敻j0%k99% )HyoZ@GsChxs.Sߴ=n.݇b:ĎOr4BfS{lќ4B$6Cwm6_c& ppOfGf(1EhĮ}<׆j6 H< c4|M a #AgnTI ֿ('Ji^!g5-gAI3`PzJ$,'Bv|C ȧ@iuv]= ]X>óBTrR7F& C < 9|.i;R\==w*[DD&TILWjG>o}d l3E1&[~g&ZE2NT+ujp.0k[!=zP6N00 ɘ,q1^VG"VjqQ"?2p/ϟNtVMfW}n.9YäL3HZ#wiXkbFPs[ xjR,\NoHD&EF;ޟxfLsu p#YՇ_12Y"u|D]߬1a ^hlndz|(~v01XJ C{T{)5]Zb^Jve)}"K Goq͵)F-8m^V Mt[4*w-R,yK ^L+:7,JtKK' m~ӣ%AW0 ']K<{QrzKc*gH}/VA\Sl|E|ʦ(Eߒj='m]2Be+BsnR"Ijq3!66kUY#Wu/X}p25W$IQ'~a+64^ީ9-ٍ`?"9Ӏfd[zb[f–u_דVz_*mW6okzGoV0i(' Dپ3 RCZ/d4)k8LBe3!0yCմgDr3\/> 1PӦVygW!nڞ3>jG ^V{\wA"W n׬ ꫬвIj7 \Šmk%s Tɏ7;H8azi9XêEN )LrNYe-LufXD^SK^[>2r FG }7=6(<5d*}H`SU@a׽~%9 ZcW!?)@wR]j滝 FDޑMt2xM_>S=:tUmN(x +y~;;Lm, z]HTISȃ$RsEgUw Z <٫7',n<*^? hx1 Uh_)7:KM12Q/u. . $sޘBmǬxq! JowI΋_$4H6YA܁df1'PWٟ\iAɖL(urtU^Q+eQr|G"1j_)0O gmQȲ<"JLl<9?|| s%0U4g $t9]ӧ ^etaذl"^iHUP! pg'@6diYgpIs(˂|J]%K5>E'w޴_dRvy`& &b[O[|ˎ RV I>Ymn̬G`"IX(G~pKczJA-[]g}0y:ym+8HSB$9D>(sFaA‚pk`[jA1,*׌N⇴e=<4hG3=rjs"DP:t)%4i[D녳T5(41'‚ b cf !:U t3݆]&O.c\,u+_ԠeK:ݨՅx:F2zQf29Ety@ PWqH5!ܰb8D*]~ʝux>TY\V #թzͭVFXr4A|BNx?ЅؠS@=,hL&E zʤ{)H@qXSRY\,8<>5ꨨ6kiJ~AHo [9Rf/d v1#4j|5,[{ccC ݄䩰l!h@y _4d(x'+%yM8VK K,;E$ԇA[2+ӓb:|+#Q~+c5+Ym^=A !6~qrQkf{RJ "\7C0sCF|./vuù Jv%ڰ'j/&ӬVj?J;rj<*!K)s{L$bVJk39F).m[wR ѽöh{ְD["9W>,hEU򇯯o$bz-As l I֧,h5n 8Gdu:E_](2:p,Nwkۂ&(DmZ=2ڀ<,N3{xuO';1Ԇھ!1Zad E5볢3cn68"/8-B͞hgYj|0B=sYWC`L8sTI ' L.P{~pcP'Q%J2EeZuh߃'B'HuJNףeQ:E{Ҫ7_6+ Hr}n,5/T+Y#rC_L%%ϹFBJ(2o)=PW #D-wڲ|.UFHЯSq5)޾+Hg۴ɁЬ燎1RFͪf6c=v :d7}$:t\٬yn730M$ x _daؙ5]+,u}bmf }oqRusqﴞ(X~||[mgƦ4U)"KѿpIk2JpR(_=[?pajzoXY'8f9 m]^yqleHgBOJ>6.}*ibOQID?'Z84姎҇gw|->6';ޫL@إ+D/GYR1K's8螱"G"ޥpsg$W{Zc\.N{8PBJ}~g 65Sո^$bJ`df?=glq T%`xUEBj^cYPD

S窣dbP E8t]]ȯJrۻNKB3Jnu<}p(s4`z?{IͿl ̿^kB8xbXХo1}.DGPݚYV OGz>۳x߷"4CšGbZ[izrU:|0L'x3+1~fޣL;æ~eشe߈T0߀\Аee.[-^6b(h| ]`!Aqۀ0/htcvGjЮ`-xHq8jOV-g:Г #(=țOTmjC$`K4 x Vx<]N!Ҕks> OoŌ#[@q OWN议O[饙v9Kort+@:=,wL$2=e ʜe(jފWdXXb|B'~~bㅘM!lf}z`p9 O<6De9O$3)7MƳ3[3% QSMJ?JP4> Xg}vG%g& :ApOq]uV{i ]/Fc/ RȤy903W1b"C}{!dΊ ] Ͱ;8kKSbyAd-de;¿d2}oō7(p,C7<rJ]3,x>3T;:nA]|uv!-\Ad 9v_vӠdNbkOjroL;!fZX){)~*OWРt} )mcW0RЧӜ8^$Ѷr`>%+ű%M4=@"xAl\5rL(n=䴦-t)zK* ws jVT3aG9,N~(''RҿwzR:J ܯ]-.Y{ 2=P`UcKο}Dm:̿SV#%4F\k\0jwK62$[9\/O0u;B)RV29e*/3ogˡx4o]{l3z/z [>J ֡n|1r_Ǔ 7킲VQoT㍧U˞{&3^Li|ЇTߜ̸{T6T `+ qèfumNhكX;ӔL,s=/! E]oHU&f"'5~7!#O+mnb``zV$#Tej{"EK!Dׄj@ټ z|1P`AҤ(moA5loDHIE׹ֺkDn X-t6/ q,5=EX!xCKcc[m{h-OX`#lJԨqшA~Hi  K$ 6H%`"TY ލ>I۬Ϫsw\ 6lF8*Rn$2Ë%\.k33w4Ese="-赯3rQgDl nzQ%nUYyIYzY|#EՓa; jh6/oWxy>5duU6d.: wYs۷ȝ(40)9?eaYˡ&/F]AD~ <81!oT^*1x6ggƿ4I:ꂁR:G+Zr#dKf h~h4^T9Ƙoq9N~Y'XQzs`zo\ LDKM ARC˚2mNjl^10v J_+|l 7Rm=9LS1JKS_][↰]bv2)o~)'+i+%W[XsiJ֋ҩ#hGX8aM᫻d,dNiDLݮǀ;YR~Mׂqy7n|K͎0$󜺖)2iCVғ7NhNb&w x?z*.-f  -R ƦHڎ14b] ;Me?M{]Wg7d_~J%|IvFA`7У$P'ʛ*;1X> WEc?vprӗnVq@ON%Z1FOXv2iI䘻Cw>4!^/2hiOFS; WI%As'Z5)Cͨ(VYtn2)ɧK'Һ^1sVӺAwOiS Q^G MmxXy( l|`VL] [BA`Flӧů?@n2jѲdmԆvKSJf38k tN$ DZA JBՕ_)ɄY(nxibSH~ >6Muˣ9<f3UZCE\߆K`aTH/SQ y_FM25UYhfVМYeĨc8[HSri =*>i^}L$Vݧ6!Э)b؋"E]v1fX7ҜPDs^ l(#{@DS*UAt=4 wH֢}le>/.T~_908y:lu8H+jl"m%ǫ>_Wd"Th?^X*ȰB0K:? _+)4XrxO$t h@&5sf>zy ST7&OA :H[&/W~k((dGUCU8O)@sJa쾞M'Xq @t=kW}ꇁ#=G3\V2 (@SߖMBizˁt9kEfo"rs2 QT]9I;>ǁK]^ohSb& xwe dR F(fKg"" 6Tze5eJ.h HA,[WaS - #>MS׬vORB i1nB5F}&09Of-LPӴG|W+}^~GטVg'/ }rk6+X=SC wӂ!QsA^2%Gx`+Li厭f3o ۧHW^0`S:c;R7:Ά&ofÔ6d@(C|Vg&#nб`sݝ`$`tDAG7ۚhi9f8g.vȡ*U>Idѝ=v@k~6aה6t0d* 4W?LzQ˓0 | ā`Yl4<zqt tՃ3*t 'hp)kbD}_nQֵ?r[{T,i 綄$%B܉޹@qJ'ن a<U1VpuZQm|-f@:atCDdLk>4ݔʼ6}͝2Ew@kcJX.3m9[ +?Gb*FhvflhaI,z,-G7cQ-;@?IIdY#=dX@WZD(&r a0k0X@< "H-EHڲ)]>^rG)\F8y/;^JJ/4LB4e(*;x{( kOH u[ $w9CK }>O<3 M:Z71,[{5}6S.'`nrN@nuI5Pi P$If:?PaP:$Dwc'\"Wlzà)}q\)lnv[\TQ]+k ˲2rh ҉G!0L!*;ߥAmb, ߁|UˁJrb(m] /\ ff ۞S] w'꘠c{ ЎA``R2dZF$ˊ!Mjî`4ɺQcX-DL ݸr% ^Qo܌cHܱPm::X؝ Yg^%<^9X9u2oP, !~#NO/ 33ZbJUD?ءjuڻ=A{ Szx( l/{U`ʑK̚D$L~̆eQpy4z`KC'L܈H H2հǩͼeq8kxoO+;z]0NTķP!UzЌy^^p}\c3`w0ʞYH'c?@cJxeesC:ձV7(isM1ѧnSz$BT1FtNJxDWII X T󈵓xӹ(`6ayf<L =GIpO| _.g5PaYm!u!3qЎf3" )ctaw@n4"D3-p%ldH< w/){1H{sz6ZNTrYbY JWT,hRe_n~1cm8t;f"3 bA py^FNG!ԴNZjσо!̱ex,\38#z [vRo2WY؀y='+CDwrӥCtCnatN݉vOL영#Aq_*Lcų.$8Pm.[SF;v7_=Bn7Z= |K;fsm qp2h['ĈRp, u65 ]dN=U4ݯPaS<tE{J^+"™noAm\١ӏܓ~9~Ѧ5>fW`r8P$BzfwsB}м|LS+g_5xl#r}*'BɁ(Ã|"&WO]W/>G˵ۡ j9,\ Xw4ҽ%PoY>8yBm'B.1hؑ+6.=ӆ0"=Rw#w:eAmc=."ۉ+!OY?'fj< k=&XmH ^e~`9:}MQ>Z&:$ɲB̖&u(63 x[&\pFzg\<؂%m`?rri|;Ys0$wToLT'3M9~g2;2HY& yIR(aavouTRsNٞ:ƶ|2{bZ+{8Z[{ w"_fox&XԾ$V^lpeM $iͤ8)7,?sAϛ`gvKrFHCZ˔*:JɠC\Iʅ3@un=XĬ qFHQhw"?j7EUZ17]jV2GDZ2acӑ)os+ZME/7wd㤸Z<^,_7 8]=$ ЗQVÁ'&XhյW͚V;ͯ"vzI޸]T pjkJCUމob(zlmѱ!~hӵDךK욡mԜ :quLf.7 lo2*Z۩.wa;D:"`"׻$cd +T]e`58-K+E6yh6JlƬ{y){Fb ٪àÇiS!NH&)&SSQ(e349ňrs6Ńk#ۋC^UC` j7Ȉ lOdF<'ڤAV(,`P3Š}1,^RT<,(XΒd{zi` ΣÅ nh p1x"횻KZ 2k>^ `J}3K<= +Bp]6] *TJf;(°{lVqfQ›eM$_ZTuͼMuPϾZ܎ ݛ]XULriD%QLCܹ~b؜Qp `KGLʉZ`E=c S-Y+.bp)0aѮY]GJn+[Pq(W@:,Ru ` KÌs.c)Ep14mWw`4gE&ZISfS 14+FC+W24~:2Mt`_eFOxF"0pCXtYOӒ)P?u ->ڦu슓/DҫtſUX\-7c>?sAg% = $jL(;V7k$=]ŕtkRʟ\%<rI?b>\t]![l=JBW P"ۨuǷ[xu S?c W:ݰ!`Xm6-vCdoiS#jQ?Dj+zD'êoe-/}"m+=} ĺ֏A8F6lm 侧PΥ6!LБ6RnjHKVtS1\#MJEJ֤O ߽M l_O6?Zb7ej񔹛XRϡUZMl1V#eɕ Ŀϓ{0 Ny(yN4GB.*Y|Ftڶ*cI.Lk^z4n+Y}<\;w/w-'ߞ*XTvs#8MXNO3&IKuGCoyV81öm8#N޲ؾlpAb^XR 7"'x 7{Ah"J$@ J|PQ,ML2m^OR :.ݑ-1ltݡlVL~}Sm&ŪuHPT{$A4}W_RP0Zmty\9cQظWU=ܷ4 G0S㞔3j\4=wÕ($v}4O.bi-zW"ݡu{-x񾸤xjnI9z+"p#Y(}IߢSiV5GcH[q؉\^# G9O$F~ [h+-Uqii2d$0#H nw^6A"Uw@Xdjñf!m8@P,Knr:Н{EaNF f+Y UjLSmҫ6׷!hgZ /3/b<Gbtp6$NL!oR5Ę >cCſ<+B? Vdt$>_ Ndw`@ۭh݆جĆxMoG&.x#AVle.Sl-V{SѲ77 pjN:~WVmAIEcN)I>4䘴| 9}xKg nFY'D;s&D n1.]&S>Ml. ޴(w:>n*/KTW"޺Hp@z]`B ˁO>T55-|oN`1ʘ|n=͜Bぃ2^ s -́BFZPVy9=<-:=QCzTXW!(?nZ\I g俇Qo [9lw`,|5&(,|˃@=B 5T|hY|)&ܞVU+L% UXKxZW(/㻥xаfQoQfܪW/e:+  2XߞM_&GRn139v8%p~*Z,صtbV^mfr?b:=Uwkj-MwդL(EX AWYkl,֌NdǢ“Wy.[ v彣&5LGȚ4G: R-1 QwcLtWi? w+|Жy`%mf;<޻A_Z%?-* v ֑M ~C^5Q:  FPC!KB n;xlGlW O7v0]+cLa-oH-e s}~/Y/26ڮVuNv'09zw| 35c.cRrGgRt@oAB>C<&5_fDi_Tx$]r*\)kB\4*]-#te,gD^{KH’M~O{f$ҧ[Dڋ7[?R,[޲ljamȴ0DëEga^a<&/ <-xv<0g1j᝕w 27)0]Jk}l;rȆUlY,o53O[ ${cPBU ֣i+ I0,i\]C,s㦆>ƛ[F'7k?B@ +@wls{%V;l,4.$- ;2аCsړ aqO?I&bMQP'C*zߛ9ps@YQIV[/Iг&<1{H.I^v݅%(m48 13DD@mnjFx/i'PNrkc̾/L/S88J+ߡzvS*&?x"agcU$hdۯwfڞ0PO:!SeJM-$%oM[C9UJV8ͨ6Ȋ\x܁+_=>{Gj}ZMֺ&d#ܟ0dAsՎz}r}w0 Г XVPRQig}1E `H+K%BK̸fKjI:T +) Bpqn):n_94tsr9m pH^Xi Io)T<$_7X2{UX\/6q瘰nj`˃Mdꦡ[ܭG;/XD2AjP2,1CS,YDWr;r3'OH #g*Dp9۝pX)e^\&/\z:2VҲ&YrT( 73$ QET3%s/M+97 `8JY9yQ>+|TtĻ4!ieUlyCk~cW{FЖ9dbz͵>ٓa6iGc::vmkʤ*2eV35KV YR:j2)q[5g終G}cFNC$_,k, D :ȸ=Oѩus2lV83נSûYE8*6K8xcQ˷N5y|35| r`֯!.xb@O0iL ?S4r ׸jQ5k(2m v~4ُ)J㹯ێIarǎ9A]wCK5]RVz]q,$B{Z:.Tq; 2xF̪4Yc\Ĵߛ+H t*B[ę=`Uɑwԅ!x_c9[kKW ߮yNjجTӽ 8+Q3j0=LY }.e{^|+4TakqC疏c2W-lI2胝.b-&M}UYbQD%_|i r|],hah{"(,[ċu iyO>90ŲBvUJnhV./l݄U1#7A );zom3P6P~EcئrSZuARg2Χ2e9LeЌR(&R!ynRC@"̺Yv,Uz%aѴeL#0K> &!,jQ.bM 3[E{\Ն(z U7:#-5ゟ"0"dy;# X1h51n&V#Y|ܣ[+t*<]iW e#B3T_b]"@e.l -ԈBRs5n/<)yQ;5N]f+շ{G'~+0?ǤI:a9k .`<ܤqPo-$ms&Sk/xɌG2恞)wR%W< E>xEhYA12 $N$_ªLm$ r8װU/O JCIO*fs6 v {,^yxB4k eaWǣ2g|řOz\m=-=,΃ti߇`ְh{300&sa†˱R+-veط|+Fkqe>. 8J^@L*]HB\'^1I_k)T`Tyؔ矈^ң|oAFoVܱVcTw; ΓbG>gIҨL%wߤ:YGeV1Ŷ.2R_:[M]Y_$!|HK:R?JMjJzo.J\R\ѡ *lvG%-t2ıWs8XŶi~$\:7Rk`[ X >{o]UȆر8$1CO)wZrh&Chۖ٩3+'8P#kV\+JE%_vnGp~ E[>B[KZqeHWa(`!Dpb]gF4p}DYCb}+!.? \ApK`KͿTkWv~5=jجS+UlTEQ|yߎu*V+B@{u{<8ܙ6؝5Y6ʹJ1G}xA[]tSQxCsyB,*^(*{4*s01u?q+ GUmu8TnnJ9d B gKaeټ3l3{pLjDn Q5`4 QY#92՟oqܑIA}֔8㠋m~Q&>IrJW.˯e!/skϰ#5:w7R4s"[k2PĻF:TsARYŝidz {F:a2r5,?N_y=D: zl;T} -1u ),3Z{yN$o+GW3FzsSki _¸^{5Ieͮz#LsWI`6[C eMY~|U6Cle%r%jQYu^Xq3_. a [0\pjW.O%畦 !4jquwnAl)Xhw>% N:B*6Jcꇟfi"*=Kx.7r 9>|p%.fN ^nQoNZURܒY* > ~bq3.97 %K,MKGçEN-G.CRpG4hA~K]"jB(ܭ3_]aD0]83@];GB+PUם m3Lm=J/.PQ=p{%2UXq0?[Fm3 .jRA I*!Bj'!>1W_a<>7eS/ b ZPzTux:WepK]V.X/n`}C>)nwH4&oy߄8z`ެԁچp S~N3mAY@|[u\I0S V\epy>t]+>->{ѻ9x˚+E'vxEy3Ij,`rM5]fXkrIXpd[rsC'f2GV;`Yɗ]]F4.̟$Apm"Oޑ7cѰ}ѭ>LVyd &?$X L`x^0=y8:I A$Xʟ#/ikesƓM] 4%bukX}%k :K(ay; ܀iSA9nBcfݛ|+٦} uFX}uB5rQwWXiAmeK-Z> ԯA!pU17SkiꈰCgBD=ny8^j$V:b&}}xqCG b꩟8˂dzI(tPW %BhdO#0k>A Qgg:UdŠP~ q%.[yqA_C\q;9a:[/g) [VXs40S]`yKQZZKAv_;z!HVK> W 2x?.I>* S65ʅfuecSƋjw^' ЕuLdu卝A7\{0ڋL !}7B=`{Wl`)7P2RҲQUj4ֹqkݒX Vٌla6yp*鴃'ZNUrHPY%2D|d.V=_ڱ(!v[Gr'ɼc]@lJ[&:w:69c\4/蕀EU@͖s'#ϖ3}x5gn+ \I %kx-xfO*VTfκS JUw!wyGrk4hrM@-_UF")z'DaL#2X`S1.IX&ˠIQxqpQ))NCPUِkgwL튩1XbǠXq?m>8d6^IwºYL8#u~7%\ͬ{^Y0H YWt,P؈ C Mqa`uo(BDCUm3AO}.J:)S ')Q][jOP:N~ts3E)tVyQT^WLdR ے5m,ޒƕD=l/o;Y([`2Pyb(RD f j'xmLn ޘ?џͯ6+w`͆\j`XLg޽ZJZɳtlD־kr1+Q36˶,(娲o!'XIR7":_Xd*GQfJx7b!}Fq>cMƅPTG4oU2[%<_9*cSsIdm˸n7Ȇ>n`*8 wI7@>5s n6b Ra>QE}J_UqI/%ePE`n)fe97SjkVϞm F7s0cR@b)${USXXTZKЋ<*Q |zHAqoqGa/nHLcknRSU\XcTS `ú%/7 yqʹМazU?A<{%'=K yu5rvGv@hA?9EdzZZ D7bKл0 'B_W+H|#@Xcl0r; :sBT rPWrb;XcAͰC/Ǟs|xjBݠPpېA&۪0]PQU"wU:Kle!u}Sl jyGt5E A>`! noM!(g1#2$C/B6+^TDt[QhSrZP=s5a4j#7q0K?2 F&&1w>ϜYCWi1aסx$i.iV:N`}p2"zx9h+D X$8 8-+<|ۗV1{*ש1?ipL |C1GȚQ,њ`9K#l!bw{u:Dv]m.Q^bKAOJlTv(gl)Hk;*|mYK^Gtn'bTQJjU_< v+踘QzLJ-cHA-|??Ko۟5':>FXJ0wȹKllh]"4i%Dtņ}3is{iq6̣մWDRK\%)+zO\yfEfE E0z&3fqɕ C|:Pjm:Cv4I| h\܋9l={x!yo~ 0b_v=l'OH 뷬SB$ HB`(lP+R dU^ȋ&B(RۙꀽSMǠ+_^egAWI޽^N~;@;87+؇2{ R$E4l`!uGFaF׽kا=k }jpld`ͱ'Tv';`mA~e/;MsPHnJ!RR!Mh KPd_t'F W;ҏ^wbR$8%<ۗI/S[VpKq)ZjßeO;`0ήVF|Kp[yġdZy?})NAZtT%_\)q&<2 ]Ow%;lKq2ѹvvJogHur+x6?1}2}g~WHu+4e2iޓӖROmT)EuXB'ODf_G1ObZiqۙ7iKk Pu#UIuz }ڹ ~ ;S1GA'>׮7WM%+UxֳeGb{|&l6J$)] $gDrj]oc!^D"d5.%Ќ;RT]ëƩ#x)5Tŭ ְQ )o#&^gΆ%C,Q$Eӂ54#I0S5)^UbH@]/ls&qAp7zd|fpdp|l9iɾ7pz]9+&i<5wv8LF.fw\h8-1N^R׭em.^] Ԅ),^c^ ҎRjjJ5i|O¢79q#(t rk`ߩY'z+Md3;*Th$N0m#F |W ci<;y3Jx^kBV!2o?MwUP +{l9dhs-oa/%I5QN -Gن}ա,c-"oNlYe q~WSm޺ W01ЏJk^߅q5D\E0!I)E,'R/J~ ʐ.C̗RC}̘LԚ Y}vZqa0GA;Y>qitX/2MK8T''VR}^*Gn.7kx۬wdp } v+]4 k{{ =<ZKH \[GNޣa5?PGٌ{9h&Jޖ>8\ 6]G=r%#{:xZ&F s=0w9 SB4r 9v#5ح} . ˱4mժ\GD잮w+.-(,El܈{0Ţx~/JƦ5 z_}q7=#F1KrH)FNݻnWkmb\6H휼RYք~A]6|OS);$AU,&^=ԓӥ?LV_L缘>$grO3k]1Q!7'e96I_7с%e`k)0}6e #ne- C jdPڋ^ӭ!>*SpB0ueqPk>:ghNSxڿostwRDʗ/^wTf #Ԃp"/VUd4c =] hZqܡnq1QoMkKСB"֗"9lq|8rpOUF»IU ?4\r$8k[$)utӟ 绯Ӵ"ý_r yV"$L\JHz">4231P)!{exXlot>1Du>fm?^bXLC??~M85E5j^{!Fʤ/gH2ɘQ)}d bg( yo?YQmYLrVz-w;wOW5YqqvI}Ugײ٩ [!.;VMǥޭ )?Ai%]S|TTf;ִaܱLwk^ecȢ zGFU3 :>Ybz0TSZ}ɺRF>L^e]ְjv'+sp-.'b^)Bɓ]z,caVuϬwH13M$X=ܓ^KWpGKs'{i={ yeҟI/.V4j~ie|`O88rj >&v63R 2%@q2kT=Geq7VtİDe}Vd1U/%LsiVsccGpc ʢOLЂ`{9Tc5trS%~ռɥ89׿~Oq`r;,/aIhbq88uhcp:\V|ύmNOؔο*s^a%惂P.0ʥʃoiΞ 9Vʁenu6O,5$R`^V[ l=XZeah?^DZ qDtecMaW)oC~YxW.T:. >bi'ݍnTQ='5x?MkscS;/Q C4ݙT[W|,sH [mN⠫X!!m|˼EϽ^n~Uyӗ,&sD]|~2܍qAI ~|P]X4{| 4QЧԟLc[U }7CA.iJs?!4wM{ox0Cj3[18m7zNo) ꪼ5HyY^RJ܊X H ȡOT_O7GW\BGCCS *mFu p=Y ַG@cW,'lefj" a͂O Ml5*Bw(|X2C5oqJt`]3Fqz"{ΡǍWwOԄHw p*g+_cA7ړD)%iÞd#]2eKX%26Wqp?{A[0=Vѷd~V~жX0cW;>vOͥNʍEsT\бM'TBܪnF]Y3:`EUU獥Eax(dqaG#=܏ݺ.Bzf@,^jFP-ߔ]PHGu+.S3o)vHuBqgY5<)dD8^Pa,sjTA-/!: m-nd0ֵxJiA$owE6hKmvuVau"ejl~5bLMdM>E.Mz\c ?P׋%24eORM/t,e\S!i$~K wAEI5INPܺzDߌڔl,irka;h*& (&isʟea狢$f}'tzf\aÜt{CYVC%Su}z~ kGW5(ɴJ`c٫5𻖈>'xbt$c2rU8'˔ʰy"XFjRԡiJkaĥn R8<:ɓ~崾:xD3'3De(T]˒_ؔ^J.nj`@uF[2~Z-ZQ1)~=X-ЦUIXoU0`,CHElR湻3۩ e|%KVcoVKGz߸Wvf-,>q byC 5>nIRC U@z{˞4zec vM٩Acl'ԃnAHlVӽ(938͈vq a2)*9B$ Ѵ (-u q7U:C;RͦY {1# Cʞ) g}l)} Q!U5񰷴P3 Q 'Lýx!㮫jUyxYxYA4]ɻ: oY& SAP Ϭ+zz;uX㯷p&L.PR{]vmgEmD1yxؾƟ$OJ+ :k:E&M&6ht+x n*x2܁BR؈g1cy0CEA`'CHt CZ}!DzS; #JE҄we.#x"=G$ѱH҂=Es-1m1)Lvxt*Kȕ[MVwX-lTjnGRHAַ7n2ÓR_-Gl*;:죕m=]0,Qƶhz2Z%JüuE ٵKszXGU~ RL x8S]Y=a^dڶ[@bKk* f -Y7zt98)(9/A"79>m4^"#Ós~~FRY@Pv跷 `s=bݬ.¦d* OsQq Zk:(q+Gz[@?b CDGE&xWnaY~#.3AFF Ҫ0Cz 1 F+œVx'GaGLK w`.RrR6H5 %5@iT$fe}\Nt0ćÙ8cgz:Q<~="̩o6 d؊`̒ /}u#$$uG,ऍ|fǮ!8CcMyjָz#P`M𹎟cM!PrESD͗Y@z8vmJs㓗%/kҎ=/} $61攨 䖬!~ҤWk~oLxLݚ?b`o$NgFfyH 6(tAƊL S9D c~ǧ](;@4@ye]ӥQ{]FxQ.6M} J5̏ȖdHx3o!rdR =0+݃y;yYY_:xpC< E)*䓰F[0ǝ 9󌕓a,%YK0VV 䞮wn|uX qHPS_M.e 7jBުD5Ju:$}ʺ"vP!D 7Ɉ Q%RnrJq0"&܌45EaNi_ u4Pvh2&qu6, .om_ ۵LGP#`u1mPVNYW6]Ҹ_XTFzR:;LJ^vNt @Iv)Pħ IC6(d7 CRUН̩wdR'M_FzLvȢxeC!/7BIV Zm9#>G$ t$3cDV+&zˌB6|%vV{9>F >Dsu}k',aIOv̊3̪]lBZV"7Y1hy*~dfy8,0ͯ gd}x+͢G_АO񠙋k F؄=SR?HhȵH0;Iߔgf$j8/DW n`ddOjzz~/|jB *xauB{ Pg: I/1S>uFĻ$6+L; Bf<7{rpz'ǩ"Oܒ] 0R;/y#sl]xZYfhc"3u;DҼ?] {b.?4CO2Yqb%?YZp>E;`so?9A^ڄ&[[Xi4&zՕtUVCBusohD(Pj={lU8^|*%h}fۄikM/~QJ7OYN|N#_pnKQS W)Bz|yA[Lʼn.%:ǬU#( ZxROs2[jo%m/Gs/1«/ q  xV,f!DOڝB~wP<.8m[E#B(w1HRxQCHGnr/^eV #v2;`ffOQfTgp]hS#4]M TQ09Yr0A6B"oY3m~;X90ho bXŃf%ſUiB[3CՖPe.פf*#=/CԝȠɪLcĆDiJLQTB(!T^ $ +npul{џI3!nLƺmGj,b_`h?Su1!iK 9.rJ?Y 4 PwP=ǕcڿsV5]˨PO1,0}?YPn ?`)Zm؟~mg^_ݶڢ@g!f~P U@3_aDڗ[eJ%:BYY0tcqN::cp۪VMB n߹1iI?qA3=YMX A)s_j,|O. (C σP[$†P+]˷o},cX4\?tB*uR " Pݓt$0OGn gm(SN`$kث2RήOmDNkcjA|jkڜN%,.i}|!UKd]'*;$$wྡྷe0S" :O +h):|/՛]{O)!x7#EԙʇK|فD2Į~d J eR>Cӓde; z'TopMNU}B?_>Kdb~(͗+dK :Em[PUک8Z1Ļ׿⵷aMN-S 0>׾;k+ Y/"i !k fF1W{X?;@[>O,k:Q-fm|Щ'n{&`Sd-4;ߗ H)ٚxrt2!e);eOttkʣAYn>Zw D"=s]?UHIӝ|Jtӯ}H9u7 (2U7ͦjjݾ5C*}Hŋֿ;g(<ĕ ! \zmqJy͇tq$mE>(wW._Gʘ˴~"&Ւ<^/eӎӚֵXۑtCHkD1 I>4קUxfa+ߤ E! 218\BU3wME:s |Lt9 B gb1A䓚H)ܗ/3q(,B>63W׮ї&{x268!ͻ&%Fs2/r)Q`pfn)р6G8LEa?)e"TC/~mNy4ّЫZ1SX!bI`թo#,I=nܤeLnXڕ\}VG?@\sq-Z+d L#+Rs|uij,L8%'z3{m;Q`n'M+:S[l~ ~XIqb줈70Ũ"z9#IoV d}CDuM $&::xAxDolQQ\+@@&KDnߞxr&kFxG6r)- i>cP岜& ul*?COkua"*XF}*:Vծ7#4.h ꡯv)O>;J"`|$9Y 5Xm-ktϮЩk#q7ŸH~#s;->~MW (ʷ&y<=,mL׺q^duLBQ љ"|^ss4 }qqm % ~̈C7KѾZPBqPLl~Hp7Ϛ{ d$/Yyc$ҁ6hc˚ y"hq95 "{6]Dy}Gܝg+L'Q̍ON*jLcgsShYDސz#X^0{|8|Wa>ӤxbHL]YPҞ1Ycy ,HUR 4#kU'.1i菳o򸒙 P" hI V*׳A QVb޽mkA9Pd?;Nuf`zF/0M 7Lj9= +[&.b6*ǘymA DlA*LRkxL%lɪ'ZSi8fZeWU*cx j.λae`l5 R% lJ.;%\ܮ =8i $"Xģ#8z:m)BN~M.mڶM! x9x\gBA6shޥ]mv?Q3+ӷOgRG炞Uv ޺f0@Flb / =R}dqsAM18J(~u9F;%S1,]qHHX;TQ*vZYzGJnnܙ#͢k^Ys @C/Nmt iMaTrBf a\RfhZƕD}=_u~+I&,̉6> q)#N Bo`^̀.VȘ_-j:'ZwW4ȻRcTΦLQQ5軉?̟!NeA%p@p?%y+y|Ƣ?1'%м-bؾ*[wdyuEo!_Jśy}4!L14 v͑d-` ȼ_x೐~2)ӅY}MwaFdK\Ճ~$Ad]:/UnK韃 9vv蒹ʓE&6(i7]3 59^A862 ٯ:Èz^J\u$!D`%~?hȆpdA\5r1Ն3C N]ϓ $Ob+N;KPNxU|ΆH` {i!݉ dj.i!2W`՝ā R#1J-\ЉeuûF&b+90RI70M[,ʚl՗Cda@e_(=c]60PNtVl {x~L 2ң)΋XHedLR=6p ID-̼B~bې#Z'v&*T.ً w\3p+H$KeLM|l}kt{51AM7ISflfoS╖QAn" (dgȜ-&~i?pC?͕ `dyӮ_.v8 7 6n<*MZVԹ$n fD ߼.PߞuU-Vo"ǿ`u 2}0lQ59f'C qD䤮^PK.. mebܖ\dvdaS'V}q-=K/q8lJf&S`nt($ESE'W7We7=ihsv@5Ұ}6H9-ʙKrﭕݏypˌ˾Lmoϐv-f:0b*sǸp@kO􀰅@7QNagTTsn--mX4)HUhۂ`$_z$~-?wHm#|4!oءU!ɴb%śՐoogx%p"y)Mcyg8g!̸\ec:oNF+°> ^i} X7הM(QF3 COclH,]AWBnUۊAm#'ZSN^It?'M<8B$Ǽ#^z2%0TN`V{ܴN.V鉴^i_^].ܜ}eof/.$ 0$=fi[P¡t&WlfchgףfN imKj"H  k;{xr]~yBE^r[k̸sL5~Io}D$.DRW ]61u@tCvoyY~0\\㝍KqlhMcxuq8gpOEtpݐ|ݚ\ҋ֓X"^=N/ 2ZOdƜXMr$/dar:%݉@9Ds+~Nfփ*nZ?E+9ԐCt0!K7σ:Ve~HtV%;>RR)_l Snn"fN=I+GNRVDFTu,0PT"_p;27 *Z&r 9$p#_(˅ѕ~*'uF׬LX6w%)$>3q+17Gt~/V˼4YQX0G똯uWn9f\MWsmsS|11np#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfB.5m*BJ[ۆkE#&tMʛf@֬nz>SbvY[ڭR+t[ BS=)d ;*lߵ;Ľ._>KfBqxY (F|0.Ve%S61opMG ё`α'\YfRXD"2kKE LU͏; HNrDo9mu&=tu8ͻw;{ʟD7-`rFTu,0PT"_p;27 *Z&r 9$p#_(˅ѕ~*'uMدՐ%S61opMG ё`α'\YfRXvYZsoxzoR$^chx%*^zMFU㐑,XV[\:f rH˶ )j.јUXX`Kcdhf 0,QvJEf9#ܒ-BOzZo|nI[tѣO%0Cnqv;LO)ZޥįT6Ȓo^?> z: ގf3jN!gSzh[y# ])tWEz@-IK,;B)2{Őrҧ6>dF{]B!٣rمX|3|8-JOׄ%NA(*ё+~ u@x,[R S)6Uݔ8,l3;Eۍ~iLEoqC3$+^+}{|oA!2U*`k7sndvjvnPVg4ᕊOIo gy=`v0muHm2D"٬oMLn.H..:*Ы^-}@tf?Ȝ]{T]RG~mR[O@A hK嫋uN"N"(0'<z@f.q-jIdFiE-"Qa~$Z_$#&@nG`ʇ!TpX3qnp2]/! $ΛorVj i(Ǹo)y no~=nMX˒Zv^8+eѼCO#,koC/dC|e5f`J煕 9 e!xT6F1fC9af2/G<2uA2|EmCo 1@%U )7!4Zu=Ej'7=eNxh$"mX,X>0x2r]8D%U~ 53#.xDf2ũ! XQ mʶe"jLSaHPyZ\I.Ѧ6Bgb!ےaY0 Z}L{;@>]?Ybn Be4JaP}q4As|@2@ݧ,N1ڠL׬h[9֣?A+4"Q^샿NOgEK M5:stL ج:ЀXu<Ꚏ4%^9/Z {…fl8!TDQf~%vCNM$Q L^!-y{`"g̚Qc޻7k5V}Ą֜`KGĉLOkuQ)^Map u+Sm|ǿg@ހmͬЬM&u133?t*+wb1EXT)3hx' D;*n$^(&QbBiR8+oQ!"u>8!ĐJ/kϜ_npwBƗ\fd:v+[~"$} CהDbގv' aBc׽J$ 7$Nk{1$GWǯ =*V*=#˴ :;|ؐk3tr5vh8Fg[u): 1<-Nv|8W"ip:6>xcJsW( P倶71ƴeOpc)h)@J-TK[~*'z|6nōKvv~D9ه ?Blpqv6 ^8~Q&$o4n:sZ~Epg?z3$i)V4BHWp0QDm]=p@p9XbɍQc>@v9$fDv[9k]f` 3dtoqq#/pz,gqyzkNCt^Pl9]=놬|*A)>'T@$%zW;~UKR|w}M5v_w X,rIu 3+FAI5yS٥OcKߏ.C{Zg9dC}vv)%2K$:, GNOV3LChw0)$»uV Ov;efw; _K/cc!K )5{-CV P1vC27ȾzeFjD,*YxnIv i)z]M*;6CAB%hf[{8 "@TTaRbp>Ҟ7e@sN+$)PF褫 I-GȜ3WOg 99'kBfs20+8V`)N^M fe^l$rV-dcj&%H:SK3t=Ph;g: B9uu9 <_j4qvD'31\z NrQW4N"EqI?'Z7@OYV8[Ͳ܆ٿ.S݃cL%Ã5AyklnA #h](*Ibbq[{n3sI@DCQQ:jEA|z g (P!BpG2 +IS)'7~y柠|<7s v:s3CT_w/zf(ҺE5PҤ4N04A>qV#' NER;{-exʳ4*>]vw0#$׮K~$Hlu괎p;xG^d6S^yc 8ίN Е\62XV6-^/[=BWHBQٴ.lVMlcwԖ#fsKixblcvpyf5W=^|MOZ 0]v@F,P;h,R33uЛaPj O ܡ_&&K8Dzu C̍ƞmf[%uic2*ꦫG36E0I/k .>?e,@z<ʸC$,IpBo e0k9G'֕2 SƐ)O\ RzaZ{:u&m3XgM"];k'NW Ǜ%QYas;DlXm{Ҋ8C t7{aE4zlԤ{\rvjbL tNЁU?ޛ ^,%Yh"@ -& W, hQ`U0BGϙ7s!69+9@36A`h$Զo>LH΄W(D.e>=a֢/s/JAqMKäYKZOӷe~ߊ݄{#?ѫ< (FB&To ^Gz}s NJ*oDFa)$*L㈯#ް ^6 际9 snXNwḾj%_9Q |o?|Ly?p$NDf}t*#SryY>MAϠ7uԺ?STHxEyUаgi<;h39Nie,^ַϻ1K1(͙J[o/7!TKm8 ls~4^{EúghV-Ϧ;7ChW31: #ZVqhΕv#MchCW.2& _kI[x;bqrBt'4{a|@Yj\ucXx|73hIa L`HK2y|yZ`DciRL$&{e7:Ty6Ȫǫ؁cewϪ]at)/oPLv/ejbƚы=m_HSӹF#HxZodA!NDsHUMom<5'V.ϲ{ߞⲽ47f\rNH<J/,}YN@αno{wDאu$Y,JtEs=;cx 5܄E-"1h(-FJ~)U#MU@CPpT$:l16Ct!Q[T) y%+%i"k!9%?t E4]֚Pl4pn忿Tkuz.wj=Ha jDΞ4mku(U.{g]9( *ϰ.qi. bHRVka5b#=vҝEwdG ѻ~wr}BէWP C#l8GFtoYaVE, X"%{"3Xi㬷>X|]*DZ'ntÚ臁ʇ&Pke89f=_)1'6 3 #m[2nmS/iYY"dcO첐j87 IpBOwLlUr|}8]ǀ5cRj>[Ag6}D Jؕ&9=TDžX3K~TS\TFا+h6d~}!ȡFAe_B!y_!kB64ʟ/j8oP#RtcX=-p+$щWp֑H̄HTiHWBL\{lY #*3 #СB`A?u- RV&xRu7ㅾ lbOFF"R;D|m8\ݔ؆}T6"Y̘L] P 8nOJڅDDTFazS)!0 W4E&ћʅٹ"kV6Dg*d6.BDyM({'ϫA;0LWrLT4UL,&ѣasNzFdcp|?A{[1$ $ +gŘg<0W wÐ^wQЮB6BVI~̵"e{BG7cG\+;#%͔*3+w+ P>AXw\._56^>{r?kKy6ɷc fQ! $ @ !͡ |o:Iw+,k?u?Ì}^zJF:>Jxw_E'\L9y`Mfu uAv%+pP OJ:oZ9ª ]@.4'a itYm~srE||rDodAS!CgɆ=êW@pdQ6>XFHg%~9TG1ʬZj37hp}\!%Xz@'+'`=/bz c{F*HMCbe3:9{~]][/#VA@ @I5E'/)69Z2]Ǵ ʾd0ihB &)N]2KTͽN;tˤOI1Ft )"i^aHH`eSb?T)[یALr? "<[.вxbA ܜg`P?ofbH.{x)c3}ƈhu)7êhi3AL?kfF>RE"ý2nn`qy b}T&.g=[l93s3by'1T 5|T̾kK(SXҵ{eicL1`i^tA1k1Njפ[|D<  8~w} ӌ/\'k#) E7YLmɆm8/4T{B(/ث$L~xkY/U D iMBHXk WnDB@b1%fr$4E{]@æJ,kÁ<井+VCrȬ~ ų5Llz<T:(:{۸k$[‘|Ro%Q,߇Qb2){9߭§uH5^!3ݿJb4{J,\dk7ƥA-GϰvoGIzsIG8]<̕Ї +_GY9jS<{8E-<6% j 98 Jԇ&ZEE=:.be6c pbu<[2>.Ɏog^&w3`zO_8~/yPP'e\z ܬا$f4+hvF=6x!WNc^Zy23  5^Oąۥk@8y \>v҄ %/LKݩh/aF`}q\cٰNt3`GzFis㫱: 2J" CAWyRnz"M-lrc|Nz5Xyu[7=|zi#PYH01_8Ȯ!IVJ# RmU铦)G-vDW2KbU c%/AIZ~!Yp^q~Z8jJV\(ʿ>ѠE.8&YO%-W~]]ڰBqjy#BYu|NA*XPw".^\8A7+$:Tԟݮzf_P^J'u۲1C֡gnmӝrBD8Q C>@uW${1_>.q!@|f2Ƹ )-Vv4B}sϷ`tC+=j/g aT\/ecK:.QGmۮ(5 fVeDUW"܂DǡЬiGb8$: ( G *v~a , &(p!d FnKPq8\f@e]F--H5<ʣL1EJXcEB<4|F.,ٺx{6xX:;PLNGBFPtkA3 &fY"պ<0Z`>']b+GV 6jBvw/Iܢ[gTԿ3/úzH+1N162Tr\k{@Gs'0Nzřuƾ$N$XH)7! p۩P]ku',JF>DZTJckx'$x@#g1}.SVlG>YGe˰$_W*d18- 9p]WZwdW5*'_&o˩kQd'De.|3p35)ۂe@rULiq8gPlM#!X8 MՄyb/$mqWpO5tۣɺEd!NdNsc1=]z:F $io#JQaps`,|>zqm2ˢt Oіqu =ܓqQ@uD 5$QdO['쏝޾d P ~$ ЉT`V  x)H˹)vYވIISVq!zW$vΟxc]v*;G( 0COvS'|8 םzd;ty \p Jo znv0uCڎޖϏ1*O@*1 {^%WܷB wqf!T-Cr*|uϊU'@XbjnŠ& '2} |HWʡl&^Uup\2%M.35XLby@2΢Z ]wyBQ]lTf [ ]uxǶ eFڤwL[ u.Y\Q* o=K1.3Kl% AFHhJogWO8l^.i?JuR6O(,s&y}~`͢rҞٗVӈmfےs"FOo?^kѹaRSRhsdz}T6x]FesjWt$ODYZxb@5,7fFz}AW &^9$Y|5<8tR/C5@C?W1awB=+} `]Ec}Fp[+@j_D Iu:46;8#lL(`'#}XE{<2І ylH:maym sTT[ț5VedBߤ{ג[3&m 2#+ K6yB~ZGkvY,[PuwxFΊ;ڼCaAHrҒ>k[}x3#7J }qSHȔ`_B@iyMp*^ɛ1<\ Ԩ(' O]NO%DzGD*\‹" 1|gH=bNخx(s[uXXa[͟gY欉 7(ӣMp$8YX{(k7n aN 7nv}"t+Kr0` 堮owW;rCWXC 7ߛ)F4$~b#1'C~FM;.q!`7M©>jtUD'WPhݕՍ_dMaiSYӣO&mZ)[-J-b{ xKo 7Q*ھ_"5RnnW'"U;uK_q$[>uXb,JA%![I;״E/7y_S {-c/S=.o'3ǣc ](.yfS xZfcqhAk*NEdEj/R#m>ki+}d޲(b4_\E&ߛeCN@@GhqDg(}}3Zv)9C  hwGl# oղfU}EFaĎGn ")T{Q'e@@D o+`A3Ew Tf mxKAj7<}:$yɈA_#>K#yiʺ!,b3m AdYC50 UZ 뵾Ow74I ,[v:)Xc5s8#;|WGv&8E޵uu 2T;,t]jARŕER0wZ^0ĂG+ɧ2o0 _lA]be378mˣB:"^Eu$yz>ic!oeZ(rfw{4;Zj+'`Xa{ᄿ g.F"/萴 K7OZa( lG1~i#,QӦ̻oc+N`uQɟ;Bq X#CF98@UNݠ%^2~6q.nAQx(nʯ@d^d<'oBnv@ @'O9j]J$I(xU(/9|r\GAH?M:TT-ㅔ֡'QMl %:x#lP.{"ח2 V&zaɴ4ٯfz˒dz*4So!Q zdJᆹڅXQ4%ab@T7]͹nWdVJ[4}6] t#@9sO̭t?7OV FJm[Tl_b W#J{Φ\| 2(j<07ϛJL*[y~+E (`$Vrn̜ćO7%[h$i{"0kUVh.*a$&Ҹ6A,", +m}?WRD  ha\ hDonis5N""1KPX9)d4% !1:H"Ó@6/b@L/65%1CB̀,!-On|w%a5rL:siڜvJwP;0B QX9AO3\0 u|QxDr_`\lvܯ M:ñmE-vESd@)}ʛHiMg{2%\Y'r|5wp6g.pzu`N-YS׮YHI,hwZIs[ _{/ʶׄ -i3ZnfN >͎@b+ț,X {.G"oO0'S1KY_yCJ7~-: K+8Ja_#7WXV.'[(`8{g[q+rUK055@>a1{:+ױHVy+0o9u ^5"RRB|Ӣj^'xҸ0T0uWc&a:@yKҫOZZVoEsidD;MBd01QȶIg?6{0Wb͈ISi$2|5 >rkݗEq?׾U}4AyWӗ-0y<{*\Tt;3h}_W;0v$A_9X*Yy:ʅa|S]$y'SY&Dil﫨ł$?o!^# .^RPWHiT RܜBIx@Jczɳ2{ #UXdӋ]"ȄCT\"wG{<܃gmLb!@ZxW_ڐNfNY6bynv$YKL@bVbb {i &%が gW)MYt0 ܨxfZ|0^۲ϨHt$*妌9SB;*g&12Zϊvgk!?WnрLC~C7bJ]ɞ98 emǽ;хo'U7W/Y)hL@vS#7]t4\q3bZ^O2kR_hJ:qū϶v4? W dHvw_2v[8Nnt5k`u-Pf,Hl[Ff9IohK{Z֊ni:'b]&aԖNhJ-9y0}E#!Go3?DDT&JS8?r]r x=$W Ј~^PS:OOHԜ6E{ E /'>m07ٕ9ˑSNd3l )(\.t't"2-*vL.Md1$t϶X'lbG/1i{Rto.N48+u?* xΗN XVjv( `?<5VxVs܋l6~9e:i3-);vmJ,Z2/eg ܆MTeoqyyLs], y_{Wf !}1hj{`@Am̮ilknG`ZyFF\ɢ.jO \Pfdڞm`<ڋ!`UH~@Ej*m#ѣe┛ĖJ+7 ;EѨ~MMܗpRwAJn'hVY uRf ٰTv'rM4Wh"Fg d.R]*K:Ss Cj'AxWs0N x1-w ʮ:Xj$\X zLSd$lf\EuB mcDzr)em;WL*d[íkhU|ݢ!T8=~V2PQr}= LS7rcA^M9e'tm/9GemӼ[UWW4P{KUZEC+NO_VCg*7pf[u D[b&n s!Mbg$KN4@EI9ùkkuF|OB0>Q8.iרHjHLК*lRߖk!q]{Lw|ffl1ˆQWs:4_͛b||&neнڱ ʽ.D5/,=U2g|2RvUе2ϜMk8ekCXϙL#pHԴ+7N ӌR럍/$oj1 ۇ2`jѶ0zznX.ukD4B'zY6iB󧜟f2= o!.?T*Qry Z0Apw߫TVC>/L07O{&k ꫠw9j㟯A`=zFg= {)|ÞaM1/"K,@s6a<3'G'v,=w,׿OfESxu1DkcБg&Q I7{Н!'r-d5=~KuZV l~Ԋߐ ?f=0+׹؃*DlL}sh8/Jy #b9Lj:(Kaů)Lxx| rT; uEWGtead&IOB5LUrJ(Ck&zxkmd[#R]uD#EC)3~@0w:"c[r[.#̣z9`oԎMgwo uFu}SH~AЫ">s ,݊O9Y-.Pq",']2>t>S\䑑*ubFO:LsMF$Q>c5kCoJg=~]'cˬ~{URxe@/%D+#" v~_H{NoQF@&d h} XYo^wբ5g*~qr1ѳƍH~L i FLDž+ ##PJVo}d4f zNgUCYxXpn2/ m&.╬Hc=ArMHeu1Suش865whC4٥ffZLVt0RϱH:'t_}jlܙ ij_7cLR L.0=Ӣ`vSci0^bN=\Z4&EU!| KM DO#sPQO+TjvP %ձ1&6LZmtԸKpΚ8u;YR'%d=1Ä8|>q;aܤ$m!(sV}KT6Ua F}XIK=^O~2fc(66Y}"=x_M͐K^ YysoY0ln+Z9?%&z3曫Y ?&S pU<0Q[o̢+3A\.p"a/]^/ܟ^U[qiz- |=Kc{-Ɣ`ȍ ^JSҕ{c BG/Fya ٔow~Ec?6x4jfV.\aVhӜL ;RMF4Q)FC:(Dpw(fL+3ЂG\9{t8|!H!k1S~WK߀8yrh_Ow9<\ƾŧ(_*9QuΦ3ߟ`㈀e9%LKR0B@0nM)tSE'|Vm1LMeN@+;2>0ehD.)zDMw « pHMfZC>%"(xLP0xKb Ps[ٹz'm0.4NB*9 H] >i O?'Kd j*i}* 9D#xvd9j6 `j#4m2{ݒ8_V=U)(ug[x-+LIJT\ΜvA_90:Fw%]YX] N,pR[Zϫo IͦzSɽG VjwHpϺMNF!Ů&]^ޗlcaז\B0uѯxoRdwș?blԄ~>3o3W6zH"{",k?|apGZZk}˛\V ݘjD_qӝ+Lwn PlLmEL3Bs89pR ^=w^{LD%QV 9MlKt=:|-묲sy]VJs  <{+uM! J89[Oa4 V߾ Jg\P[oʹ]ۯv >g7 UEUJYbC9 eDF]SU DWY}f4-6?twRj@1QwF\6['|)|>2~bŝd5OQzPۢN ]RpS` m%y#)[K}?sQfu{"sxI?(:E沶xӂت׆Q_Sm?"G5?. _oש6 (d!o'X?DT }1o[gа{y Hv.caຳfSkSQ$"z՛ݽ'ӞcyjYW0J.P5lY+uYV}KGܜHL[#osT*=[ǔ`C7ʖaB`dN$B]OGxF@^%O(0'0hN!VF$! f2h"<lN5d#zN-yaw~G/ȎC.ߩOUi UEgL Թ&fy{Hݎx b%pKibϛI)<sفXsesE~+%Иo7>XmOʇ݄PnQ64LI[6dD\2 ܨCL<ġdCZU$5d]V4$O+ ef< x)Wu*0wǓ0ew*t u0jDg@`Й!tN y4q;zM@0.L3ca+3X_R?9z$%S2oyqd<ūﶩ͞1 nIX/\ '!ꝟMn\ u\P㫴FHEG&\>R#gW4AǘI H%l8ޥlU>w.ؚ.Od4Bm4$Xs^;tZX-)1*Ӂ#=X̫W`"֣)ne.GpGqfin}tt%Eҷ>o:zPd̜RM&{"O, A֓Yw 6@ֹ4\ZȊ3eF$B52 Qd"35 Epz+H̳Iq'2_PYQi OIK1y~#+jѝ N`Gcxkg#I$UGr0{й=B&+voƓٱxi}'c16]gUb5,$\aAuQ#G1i/<,ʛcjen:ٻG19eʓdؾ|ca]c7 6D?azuM<gذ)EGA~fQM#+%OrMd=MXuF+5qiGۄ18{"E<^p8n3չPuyy-,~Yo;κ7x ߒ`%~=NQ(5Z] aS uV=wM'e(Mdq?e Yq vN(MP<drƐS0! tROqE]}Qgg鋧ˉúv`K ƅ#f^ hL*_1`=#<{B;j WIw#96XR uaTI0xT⨮BqgődGP]o$F<#߳ ׂ]2e )60 7h0q#j+-.9{Ug:r1?3 YJ;h+ o bdH9Ûbp E@FPD;L+d/Mk'dUNy |)@[aƝ7dm9/j:O=g=F?۸) [ҌX/]~ՖV;u؍U$Ǻ|!N@)kA[ j3մ8}"-\WlL'@ZKTgr]Ae lΒ*t3P5SӆK4NII46.Kh0-zxQ*N^LOa7C戺Q1y5ՁZc]<1'ȘJ %F*j\*Ӯ_(5pA 5V^Uq+k9m׺0)Nv Oj`熭l:뼪C TK=s>l^m",SoiAZUyg7`7p\jΑ;+\P!#!c;3p#=Cj}㋒w"z:KT5RwsݲAfkHj:?+؇'R j2LRw:GcA~k6 b/2b~*A#IQۢm/XZT{,TovlJI֚ 9d78)Q5[H㧬h1ɏ3F{yj 6("+df)%f:2 r~N4FH<@u,0BEC"E˟*=dqcHF;uGv8A{C/T0k¾`>T>" xpqaae]"O!~32i|݉-4-|Uv^$\"\-|,ʸ##!LBa~3uJݳ,S3hOxgi 6g+LJ0_q_ Y4&w#)5$õxX`r%O i6E@v!M\iYH>k΂ȟۇ>M,cb/62k'Xq&לP=_) nsZC5 a3$$BS|'3H1?6Xǿ.6췫 u_b}!F?.= EM'df@M/oARࠫ~ N+&̶f!Yc&dT`JQ R445-Uhf##GA["ڋGmsn;@}#yE{=txk4e@{m]{2xġuwjB^ ;roE`L |O]goqsn$H[fT0!/X`Rv KbHhyU6ޘkBu.EGrNmMQfR"q^/:':@7XvՠΕυ 4]rkj%zI9a4egٔ>Y;f al0l΁& uA. tZ R\NƗk)1Wo!J3q!G12V2rvX\8ǃe.(uh^c' $lY+XY<}/[D7 s0 Z?f L`Z7П aT;T1$P U)#=_q\@_x ~N|Pl%UQ=RRaGMu=X!W8q(W AFZ[?'`, 4VB|ێش͹tduZT5G [en{D*F!(l]i VŔa(@'t~o \s _hmwkuZN&̄ <=> 6-N( pdƾE+b Ud5ȠYK 7_n8FvN;>ȻgUv^ 8yzVfx;Y5u"(Tb)="PL8;Āۢ/8k}Az>񡀑9 >֔ m `P<0p (YEP#04ѴE719_bZ@ecx'vBˍOl1CFrA2~`a%"~)1b73?fDPMvevȷe@lڧHRU[iJ1`1"j $KKRQ56N&`i} bIE|P x|wv5IK!*^`O0IS8Ql>#Mݘ4Pj$/04#Yrlh fY 5{*$sq9\uڶNȄ {ldHyЗƪ?`?|K>84僽B;Oc8% ~h^G/ 'P,B5 '>{.'/bɻȥiZMԂqOIC%4oЫej7PG#Z%OdwknXAj=oYlEQY:0[o[B!,TY'q?,zNڔS[t*=Ea砶.{&nW.)'vc&f~٣Ӱ>'CQh9N*5Ա7Wg\9s\=̵ĥ4SzjzKUdZ'-s*}W+5vk&v$f ߙv:_6&y(byɕ2޼֕̎i>e/(гӂk]\5l2ZE8#UW@H!Fȡ$?U[&a|gJ>,w(Q_忼`V5!hdDJQKR`\s4y% w.iP^|t}l,$0=#lKQ6c`3[cMZ"^4D? D fwhIN geq߯i0Zt6` ض;SdK`e>E\㣛w͒qKw t8ZkQ }7@2u4 =_pʚD8MS,UDp YrǍQر#}Lˆ%W}̸yU$sW{SGBFS}L:ޣPcQi.Bom$w#rGHV8TYDw !/CsW/6.R /vEuF{R,Vr1ی&4eۧq-^&Dؽ0sa3DžLK8HT.͔ @ƈ U>C&")f].}"?Dzؿ)9s˧¾4V2FDbݩVZB$錃:@hgЭ@ntVzK.@!yz0klY#+n(9LB|8.,oZr:b:ɞ}~x8%2q4k{q^Zަ蛇21f-!?WE?!cʒp-M3bۆ#Cz@Xb/FSPT7)Cf,hŴ9+ho?(QJKLR@1 ^  'kyMiFBGZqŵy ,%V) HT/uDI^SVDRt+#yw3r6 s4[s*jc,ġ,Wl!>DG*>ꕠvE:.8dҏ/> #gg%mG܉(V&4wwVE0ʞXJtJ8,2FeߡLEN)z\S%ؑ,/dLM!T'm`aK6Ǹ`vP"pmjÒоAdzi֦:ykkmtBjܳ .~6 J/&JU'יoS9Fdy|E쌥8jvLE" l*TMZҼ~(6I i * 0!̒' tCmX Emie ]nra?/RhSz("nGRRg۝\AI^C;'S>.\)sPNhڊ}Id&_ a>X͛,f\4(QFF3w^WS$ x@:4ǩԣ,^HU3GshlS]֥F;t3֛jumU4!R#Y~@q{Rp4ogYO 6~ʽ\BR?:xqXz&6=]z,]Nc; tk\SrT2I*RhfDsJ- G+O劾ޜi#71\o~isiU}>m2X !7f&f{!6UgDL82neaKEo4&F'm13"X.,a!gn 6L29{]b( _6DXQ26A2smm5_5J5Qy{k@ÎAQff2D>Btޣ=< ċ|8j 4!B(vl4J͡ *"@)4 fp/t(Jr&Ltf}L,>! Zy2SV>58n;uÒ ce \`pkW֪ҧ\uExӈ׸ ns;]NƑX@YW(%vOg@~htG8tbYWp |1SIdO;ǯEYqlZ3ݶ+ cu'jFV2'1h$r? XѨ(sY]741"'_!HC&%9gkO 2JzLю 2^H}޴>PqfVDV26'2lځʙ*wNq)zt#^ bs93p~L,ъcU)0EY)X. lT tklxs#B@ŗmh_vnd%a7N0=mlpÖ4EY\tr3͌ʩp.xTVBE<|iC†o&aY!xgc~ œC]2R2esz8KY.>?7LtJb|,)LUiE2qR,@m-t ]]^bpVz9B'p_BAC:_>*YT01(7sz w7qەn<\.GJn6QFK(,*5"\N=mmuY3Oi ۻ߲IE6Ḽ\m 5Rklq>M[>kW1ZO ];^'6OA{\`PDP=3!-0)'dj|b1|Hc} +$h-sTXkFm>T4fu~S@3V=:u9Z fZX#tZ̵=>ލOlsx.\eڲ|6x @u 磄:kc4y bhR O=P\|D$mZ!p3];֫peHeѪR >)Oc4C5_~( tySwc UcY)b7o X,?옞o kBSlǢr(A,KP"=Lϕcc>ã.b5ugճ"uAaD ?nX xn4|wyAGa!sdc3&G1ອ'V$A.)ZKw)7g0&Z~?+c\[&Y 3Y#:6%OMbMxZqrځ0D qu0zg`2#x!Җ"ª߆]iTbbT7*t#8R32^3~f$ ks% {sv%GNPS[@ h3}=f2ڑuɔx*<5Qrv:. 1~|x<<5;2ylM QC*Dd3M" +/`!w0iT_ Ks3x+&0P Ɔ/K7a[X(J}vjnq=MPƼ򕷨3i$.QpAX 4ImT"<ΉtaO!Xt,lב 輣 p8S@I;TMǤ=F9,6fƳHT<m<N}ȧT4ԡnTrԡT?A_\(Nuu{\h3R26'lG9C]5J8;)IҸ)r tcԴL.p& ש|$=ݫKhfpq/\c 5&qWգ&/nq4UnA$tu@qEDWh[$Rw/L,\2:[jHϒ-CSt&2 [it+Z0eB 9@u.F&d ?xcz5̸Z'pd¢WUq DKE !npP+N>d"rYgWO.':B1R9$'/oBILb)^gL@̙kؑ.rˆS@rhN;c $ıle)ke$tf9 8Ю&J 7 ױ"QGqxVLu~%Vv0Q#W9 (Uz1TQ0:-DSb/=Yo^$3oiS-f&̸F= ~ؕʆ1*1ƨv<儙:_( PKћzړ +Oytq~8挈j:>v|а&:beo_$dCKশʥ{mu:Ijƅ4ķ GFBUc,dd  YnhıUsg+۵|y5$M] X:mmT 6HltϚB*lႂf-C\޽q-@3T h weuz vzr_/h-n: vݳ(Uu5 v*|}OqSK}jI鱘&[abHuoo܊!ԇ稯GAv'[$,Rm>3MB{9ڽ@@8G5|MXUkD0z:OpX8'ήP}>W'ZdaI-la7Va8`}wDv9 UkY%3yUR6bP0ڄƑvp+z=9 򨳉>Tp+VL{;fQ@p+#J_<+Q`xF5^dXf!JD KuL`s k2C'^)+md-G. '`){e2{ z袆:|fc܎]fPk R|3̲uT1e6z}}4p'h3R&!4zIF #U$a S3?F~7 5mODnPU{ZRCʱ1ZNJc= oi7?}wA'΋72Z:V~b8 ^p>gvo?B^ u qይ* Q~ E #dEs6쩣>N#,gFnwXnE:kb&P |( 6tܲҴ9!11\M,+$Ej[!?&%(6H*^d!uTS* ԩ|3k nũnWK|Q p[-k4+辛x#ǩ\zagC30>/qJh ٛؓ;%M&]7U O9 pՆTD>SlS{jU&" %. H$:rٖA`r@Cad߄%z"V"O􌇉q%+Kauq uE?.`lV3`f C߂?..!6r qܺ(L=@x+H Odܧ'-͜ 0 I~5h׉cc8lD.gt2.YEP76GNסㅽ `/K; `VwVAtԀTT*O1(: ]snĒrQ ?RϮvn,$[>sKh:eqz$5Pw TtDVS1g2TBN[ U/H0(d@`<:É,Ki| 2d08Kyd2|=Q#`) wi= 01 1U"^R bΓt $uѧ啼^CF*j!mD@Ŕ_񴌇{ i3L\"*d<<#Cp;f հcQyS-AS~vTf/^J<ڒ5)W#8 K1L(d@9F5^EZ`0$ }`юqH&𥘥оҞ (a]>vBd`s˫EÅ NmBmJ-kRi k>c.>in$)M>w!xվ '.8R:lcWDs蹝7ή>L.c=I9;>dנ\VæfR|~1B ^ $#Oy-i} Eyz-\78 _3λtN7w͢X&L@0 ZmcY*uPhrTuqfJ wpX?}/U$bOdtJ$ 1tep|j n'pGSXczk!%%ph4 +w= gW0뿂{;McSf.mPwطu7̾=/gVոsY&SB3M$lKw͇knyK6 [T(qmh@1 JU 'ݦThy߿StVWɕj ǡs5jSG>S4WAx,OlR6x,h_n}BeG${`$K(8t*bv 2L*9q8IȶgK98YT5x,%bEiե;mZi9}zM"2k94P# 5{Y\GLT$S E)~fJ.FIU+ aYo;Nנq E6/OGFH$.S|_1wS}<KqWrW ʶ1dsHH>Ȉ($V|dT`+o5Hظ ?wjSJؠ=HUw}ϾӀW;tE&Gȡđ5~,V@'8J7ӚT5õĀbKeޫ`b{7RQrg6uB-Jg9wv?* XtԀuhi6&H/ kiH[L98?Ee-o,GNl؉Zve},%0o<$ r"5Q0 E/"n+?f|5K!̜ Ŧ@Eu) gj ._<1twx|2 i49WnPӸy_ɦu5ÇQZ;ȅ=%5|[U[J8eX]˃,J&?uvJβydYn*֜@O.v1(j޶,AfJYb:ZW\mHRN6$z<6Amglf8)?X09"J$EE%TƕX }*~ͫNN^r령sl0)gD^2n,ٜm ͋~ng+2X;95i c>l|cZAw={]o\CIԪU68eUx—U;1r CNcu_b=mZZ=B>@^SIoѴr AUVFwQ>P iYkPQupr7Ғ4Zs`AgjRMAki8[RI=ƗDB\,Q"W$.dMDKpZ&(g-͇RB :3l(Ӳ]rdb|NeBxB 89~s-5Z!.RE]̈́wfmHCD=DB>0D+@<(~ώdn--)Co&{{XĥL.qɬ+m, 1-j< M+j З=vԚ㪋-&AG`)1'X8=2q4OeK 9O[ydY ([q@(ɍ7`ng\hχaްC/\BxWp-=8fM)nMDAZ}b3]M^/mHƑ{h4АB܊(Ag ey~.Њ':vlҹuÛm@lthRĂ]dԅݲq}u6 Ejr담G2?u/JYq JeuO~)ȋ|97_7'Om4R|wȐ03>V*'ۤoev=qsޭK)ͦd:\[|_w xbP Ek1O7c7LpYQūZlȺ4&Uy*db4~pw2J}}|{>DUW*h3)˖ j'-R4U#_xP/3ѪE2@BLt6s_R %reU5j O1xR|Y2K dNfv37޲1br6sq~.~C2gR13[,x~] T VF9wQS-[1M=f̦#۵D!O-nc' FҾরz;lb_ңVrYM=e_`+]'4yʚFqk^8}h" wC@=|M-ӭqϴKңBJ;w-X:s1c |L\0 )F&f=n{DJ4P /w>u]e,$kGp2Y'(PͽDXsm~HlEerˆfE0i$Րu HW r]Zh5(mxMg7.e8M:wքUOS7AHs*+o'w(b܅naD,Zp5Uj`+=JcB ʼn$3+?o>m%w-{ʸޫq!/!gjfA:tܢlb#Y5Ln5l6:x-gRjv)$]2S9^E;`8|soicAJ=@MI$_gHт?@qgME.ݯ):V7T:eZ*0ZC{>®Ya&6բ[jLvoRRPMLXdΐ47~ij(kn:Kx^mDg)P5P̣XޫQ TaCΠ |7l7E ?G14+G5`@ ΥN~Sn ^68)IMy7tl;*6nNwU-E) EW#V&b{jQa {>;݁#׻ub hb߻![Ⴄ݆ѯvO-i+F4CMI>yF5ᔓD8ƒl֒_FNNv^˰y~YB ,?= l#,u],PAr>+bUJʗo#-4bdX䯆:Zq(*m0,`IȥJou$r| ޔf!ޏ]f ^8v Nɦ;VLxK:bn5=%nI6߾OU_L'^i;ׁ;$w])[97vaē0]3IX^9@ӑwhnFs#ÒE: Wsg571tر+96h`zmϜջM"Ey@Z˶&  !8ͤePc4a;`\dDV&m#m_ z~N =&Q,Kn%%!J]=gKQv_vŁ-n୫OZNYAԠslWZ},d/_򭉥 W71gl=<.D ]*3N^w|E[40EpaTTF1:εr]ơ񦔚s0ռBiunHL[X@݋RdѸ7R1b N<쑎XtԖų#CҊ#ŒUB0bPy9b.' L6OR|wO$uz5>_-tW"a=^ ;@ȺSX H_Y}^ m>ۀ"ObՀl/=(DxXKڶP ^dwxVc3$,/z{2<\R!? 7㎅f*$WS ?9Yf6'e(T-=v)4$s&FvS{M-$Նj4q[nS",{=5ݹ/8*x uyv.qz[A[6/d"2Ӹ_@;tG$0.,^򸵸7ARAFv=#w~sks'F.ܾC"_qH`}z)8c(3]~lK4i8 (a54" hU\2I4Aݑ'RP>,?1e %YQrE 2 YIɲ_[R B*W-x&D:I&um"L9O1?%ϣ u ;]FoY,c`r<۠}G A iFYbS|&PVGuE4q.R/ Gp!a;Y2#!VK䷛4nݡqqMzrq@FLx"nuii niϑꓡ'|,FdzK3˭B =Ӣ_X_f?NCvb/V.wDv|4fO3 Ir^ٰ3ٱ S2g<po_Ni-%O-jxqm|N ~0nyzCx ZJ/R0 &T-INO( ٖy,BaCU J}h@LԵ1bs"e囍HсGͮ8v&s4ۆ}bpׇِj#UrmkuUh+W{'w`^ڑ~AfO1v,7[V/>#~{nFW\zJE^aV'/ QEbA@V]G& Uvڟ4uݸg`(#@t I7ˌϘW("tR9lR{[9Yp<œq*u|ZΐCT_~H5U XmZ'͍+PbD֭T0e 1̳AZ=[PbFb=3!(A-Z`3zH=6yo Zwdh CRRbL\||,XDNIeBz4 +Wx  !zm'd͝;$A(Ii-]Q_zF+离Y YI JGNeG̨/Uc5%SUVhZ=@ ͭ3^{/a)q~~)GR˕_T#۶zk䌫y|_ԏZ\g){' j廉O,{rc -P WSiSB9U;/!L+]Z}6)%:{OpC_w̻uUD{w]&nMFXnT|t;'\0 CA[nҋ?dC uh[f61) %8m?!+r(ԋ"˙գ: Oݐ>Nc8CrH|ehㆌ{, +rU2 x\̜EF b!GT9ENXni~pa/ĔMגƭjZ i;eSցVk֥xdV l3GIPMzG?R!!#up]损ԩ1,Y5 h◭k +1GTj/w^qsgVA%6"f3ϳVcxi$1M=r%)L- UxT`OԁB bmW8VG ؖޮ3a/djrB\9Ǜ JeA JsZH$v(BBמw7:><@?#ptfz\Fyo^,EF<,ڴZV8'՚x4FI` 1t̺{X[peE .n{%/PV ;-48KPIsv| :ě$͓ `BE\ِҒj%gWlRYm Nnٵw``0`boBQm a.(|@yS۶BB=ۿbqT˺=Cߊ{8MZzϬ^ HilBjfF5ub֥߯vz}4@>؆Y4,ԀW܁P:x:2f?s.{@o&P:!#[XS>$\CT/>@iM b݋Yxi? (JEe*`AzV9j$L35`멃ZF'0^M4Vydou>Ҁ4D#r~J;HsI˭ J = w~z8'TgbݝG48~A-+6TDJ&1ݔ"~а:|sI/ȱp7xᑃB)ɐ*yAqxG VڴJ8a!y}I+}1 4gFL |itO&!gЋ_DJ˩xA/V֌63C8X!m@.cf;WxE9O60^ bћ2M: ]$'9fG^)U9@bg["ϴKHͽ~w MjMA*o4j[vl72Th o'ĄQBSh g%?Z\!̓m.:tRrE_/[2)»gzi^gXcؚḯ.y^ )suL.y/6W$pɰY'OvF 0ձ89۽5]f<&;dm:)҄o bv1mi*:TH\Q&FLTG?2VYDw.~*HTѿyղ "kV> >LW1SI],λ#%W"ר ,dtcMluAY }`3f!վj Vs;F7d`9}rFIe8u{?Nj0iǠܟ `$^%}GhuoǛ[^ٿ=U`TCxQMiJ![/5̹o1vé8YmW0:W+so>b.w QB 1͖QBH}tH֎59gG"aZ]M+j6P"?UIH% pȠ[[+_P9yYdۈŗ!ѫ<>#bn-qN" .cc6g* 9&5N^ ے7c78H z8±#ڨΎs1X$ɚʏ`)ZKzj~۠-$mkDv Nh'=Mg4ZIȿI:zלZ|=:5i-LdeF$i/U5rC4htr$?-09/=$!=eQ٤Ol,WvHEeocz66J2ηEo`뾡(g@侸/0T-mx{8Vb*ʼ d J:@GMp=)YU B[!-gZFkÏP|ɽQ-l(]vn2xfR*82}{,)hy]/owDof %h-{Myfl)KIb܄e'AjRߔ[V[VRO ,%y?Ŏr#D&`#@^K~HA%>5k U?҉+0@\l.f%&x<]ĺF%@qF v9xc}Y`bI% Ɠ$ranNH+ C?ָ%!+ۄoA7p#j cZ>{y\|@28T6d%(Ϫuw9UoD{W"O]safX埊筿bE#,zqO\~Sxi+#9ݘ&,0 s $jش7K>40(>6ᰫ'mբ[~ PڼZǙcˇᯍ^& 5dQ̓_}ureCu5E @o&EDS#$8sL>:14@X^B)]8Pm^uƖR_"H=*$mj `R1-Lf^K68Ssw+3* `cCּUxqjnf"5nX:aHdJ6fZM2(#v!f)L19-pyOv'I71t ]nTaZz^z$Mh2ypR[ȯgaVJ nL_2°)H:sG(%U6[haX]k)+cwfyK٦ ϼ !Rd%&$oHVw!IygPJ[E WJݖj4rꪭjMʮ 74k2Vpb5-&KFoC kxuCW~‰Y(.֟ "B^ZU^&}HޒG|Y_H7^_)}+8c?T?_3v|Č二u ;ےrP|53ɵ[\*'ny"aQp CyRj/?Yڏ`bpM$j0vcp11x\SJ)F$Z04'ĉxf(}uhuN\WH… ]owNO[j˽ʖ\ ֎Ɯ]0gEoIvvGVqֈjUS 3Բm~bٝ1ˍ u+(2yzp3!IhV/:k˯}hZep4fzK]A "=K8:T}w3`6迷E}TiN%tl9]S|b>S}i zClVKB\ᶀp>B?_xTzXN9͖y)|-$/+Nr+I,N>rJNljo+ X1Oʸ&jO$#y~lTyb"^"wPw#NE-W*z]e0iac2mE .cZrYhLej{S廘*\':MZ6E=$<}i7@ Mֹ,aaA z01g‘~b)C$KeRN6aTN{>s ؊y?QkvC'h PtjLi1l,Lu5OB0x)Z5%;ƄL/dr4`cr?&Ov SBXL5"JR!]@B.%m%?J#Y]+=îcg-}XG(Rj{QGa p/+h۞&R3nؿ hOb#:3CV_nx;EDžF~= X1,z&SŵjLPo`GVzy;יD+|F7vH38?>'F(״0N^֨D,n8pˮ p5cF -y† -޷7bꊬ/λ8T6WCPA4}x2nVVB /Q~Q%U4PE`頔ЭQ|)`9MC͈biȪXxi 8b?GzP{Z<`Tj(NWYnz-lgp1:j%lgF`'ڧN}s؞bp_+0M|mS2CqUܔ:FY([G6( _-M˭M?}.ZjzF`H%Hu,LK1<":ƑOͰ79E _RZ7v6Yְ',xAŋw|C!9ITZgFѬ‰ R #ؐ'Xt+qY*l+l 1OF*$բR7J@z}UvI؜Խk~v5X\0thjדT Os{jKuZ(Gگ,1)1KQк^O@fg*܄sHT -Ù^cKJSn)#~Z he 5Y}Ys|yU ҿiTdś:g5S7;*ꭑ$!lb/|cZ>t2.?DB'3Zv qnK(ټ8aB6|}D>3zFAFI_= mlj}(RL{zהǡ-h:/ Hmiwj&m4B@U#CB&"sݑK}[*?x=HL<$j,:Y ;\0*^V#ڍۦOԭHEBL1ҤDioAIKqJ("ngNN0ya\_ S%%(aF ^ KS$˘eV-MZJ*`vl#kzcbjYk(6čJ+R]oXSmzUjs)A /_RTzGet0S$pWtˍ槝SF@H ؿD*.02* oUӪzP yJa$H%YVmHա@tph5?n~izqLID`Ps@i5SJ8Go!äNwcOl/i6LU$rptzsR~lE&.'/eO{ۈ4l,0;YcȗܒIBy 6 MJIM@YFbMm3y V)rf/8ݺ'zG1$q禜iZw_ l(04UxcԊnQmbqnN v=H5o, w@j},ư.X(E6ݮEeq/U7۔AJ(+oLU Vep}R%(կ@FןR/V'+\~z 9:0]EKDT+/=LWdt@uZ\һs^ߏ^bāPlE8C6A Aj(5 A~ ߾ɡ3AdwL "/RwrfdF8 2aVTca;c|j R?JmURd=1èa Wج&%bk%6l(0&^N>.!zDQ3ÑҡO[t'ꋷ3c!\GA-梙2\&DSu sȀI_Ez"ൃz&~"w}a0Ʌo@d%Y^joL9Fm {M:%ʁ+B ^)zj죉Vg k!Z]U0^bGXc#x|A~y{ ܆)( e@-UԿX:XI>1~k%+1Dhg.u݆VSI&{GM/M3[7FfRUnq&H6j`+FVDSNr\UلtҢ>u.H> x!ʦlF)J @tS>F S lo61Зl ?<|a𾺢_$E7@v$IaN9 `TvmGB90TEȎFڈԳwȻy0 })!רoҖ0.].Ssz}Q)V\ jk%n`6t>ې`]!"^E6 t;f\b磁ܓ%q ZY0wW,etBQ  9϶>kF_6lYCE}WjÙF-Xلt;>h/Wnf-Pěý <`.σn ClRZ E(_W,9xqz8QQSh/ 8oO'@DƄM'l_@\S oɑ>1~4+v? c`x S:&q :XdhaM7(Kg}xEDɮBˊYp Zٌ~D/x+h ^XȐ  ;QΤϭn+QM]c71 s:ʖ%k6G,l@|R$GxmmaV,OvO%G"q/71p~^*uKha6*_n,agI%k'6k(GSpݭB`#a;ZQ-M)Ȼ6 Bi,Z{nΕ T_A0ydvZWE w1*\ -uLoeњ(>7p/X%S쒽.oz-nHhLvn~my^%|Cr:gP*;yY~laOaݡlՖi譈3!CѪkz z hV\ݻL/3 of!gN ZٌϦ89HC—s$ 6oWDU <= I ʱe,?A|wx(9$fQ!R5mvA-gxWI'p?Ӿ3C ְ}x?EܔoexPvS*SyJc0hsBuUN/" B8 |'w64(O8PQ F(?%b;*&eg ׽KO?\7|\h/*=vByϤ-iCȲŗZ\Q?no8Z4{`~rje$C-z'.v- 4$ky߲Q:aԌ])/ewH~\zwAyHTH")7YE֩>%t،s cG}̟y~wP}!FUւ*`Q ,s?6"iw;#zl $`!*mh+,#BGLt( I K9xhGV >R#DKK]w{cFzr7ޡ8 Op7CnUVebW$%<:iESvyb lOhq8,7,_eە a (2pmlH0QG`6MQpwM\@]#C O܄C>ǃ1qj3_Zz2ƙC-~$o3PRΖ9];Uj  Tn.]KE>'-9*U>~yˇCk"}PB| j:9C?]7Ħl{TV`#" صجp蕏- CU͓8چžͰPh8 8ґbI/ .8)dhjS,iӵ~=΋ل͇X|=(zXlLޠw|P:9'2Hl2|r U%n_&9vae0 0cfSBG[V NMn\7]'pEO,-h @Y ~W5m GނM7& 1YW_{CRɞ?yqK: JO/_Sh&t OrߏJMƜ[!mOVa"I[E mE<>:-bqɦ [[&qÙq!( Hx`čY-_=$ap`Hو bH DDo[mqC6#0] ,6yV} `So#7V}_tͳ7^I+ pW+9qLjtmukFK֎&z6~_?,Z}nr/loi`Mm-ư uj0!5) rlto}:" a@Bm-\#0Nuw?\89 ?y(j2q$YxdW*jHKIlBr =nvx'؁ 1$8<w^ʶPg .1ufBA=5yӿVQ'*t#6a.o|/Q`or'3Y{ּ Hkz[2k4j=gw"VnX14x=IRzOt4a(x-'H4g\`Cl;ȭQNhJ:גwni=Z!q)hnS*r.nv򖝾ЊW3)_? \+PAgw _G"ˇ>?@+ͺ],I O&I (PCC8XĀ@KH!ǒϰxfid$7f\f6 VY@7ʛb|d"U@5bHOA@hH'ة݈/ 7J•b85\#dZa{4qmpIZ8RK-5B A孽Ds|GG) fPկ-y 6bh nRO[VVkN`l t&c v+DBtlA%dԥh=.a@%sz*&ox0d"(^la7Q5Ė4HT;2=?S?͕END@' KpgPbÛb థ9o\-}I~Si{h 4׊Y[{8Tl|~3v:WN% Y5O6?*=LVI'mmi{+_@h69L(#@j),|,а:N3.^aPJaD8XO{MtUY`H鏅>?7x1H9,' ]#_ T$F.rXjbz:Zd{鄛"^Hhw N0R{_LYdigO{vH(`V1k :>3[mVua8-W 0)53>ïV9G*@E${.ۏ:[(k'{D# |:38˾h Gya}׸ƬMr,ZA(~]A ;̀IYpYJ%w'௉bw8;<>%rS(e@SuPK,ni95IH4k{ƙ~0CoKQGa`e*@:KFϟOP"EYWٺquoBzDQiOC&҉C:p'~?}aP&7ƄozH).O1!hVs+w\Z"zHZUF 摻h6vxڕ/۳z9 o=.wR [oI\G!8͓_Y:VSu;Gh\S'6ECq`jȣQt^?P)mka"nXGAө]MGLt-+xjKGS:bRB0:/>3`Wl5{Q ve Y-u' 8Bqn6r#|.|FUnʰB9`x[/}vZ_df*n=~HJC)ymڕ UqE.0c Z5%"*g&OA~v`2/SHۺ6|jٖJy1ML'"1f?<mB4M$v-40&ӆ ie\cđ6| B> 8%4q3 vN2{8 2 k=3w111WAxWc/oݣx4гgkieq_MUżhY2*侼4zV#IƼ#N) M`p~C;@/yԂy n-"cF]]*!l+s}eY(1sV(9U~5,8}JAI[/:|V0aCs&۳nQ^Pv UOGJ#Κv%ōd,۰䆷 ,8+Ždt I]"8.lt_4D op wʺW +_LV/IG&M9*xl`4s./,(1G]-l5W Wgn я znSDaxyx=$&qUKjڠ*]&'(Nf6[B)1  EyVnwWAtX L,/ér;wT8{ jUi<O3^7u!Oɻ]?KLr$Fd2e>1^(Zl!>n]lD>T%}w,SG؇j\DLlIEt8nx8B3nEnRu-7;?R.SXCfcMkZtî;R<{N=—llwo'xx[5Dt*`Ƅ',IŠ5S#^Sja5n_E"\ Fok/(J$ʁahXW4(j/kYyB L = e0 3xe/DSwCPMmۦO:dhh)^Tn.Y!]4'fT{2[w":‡5I442tKIx=2%MJ=°O~0Y1^gb;҉!bռvXS# W`˱k"_|fS=΁c;w{C<'Kd4d/> sUaėy;&\}]K:wy~5EҠ扔h,gb>l \k$$l*]IZg鼻!%s@%թ>-n&GH #b!!rŢ>#^g7aHiLݟ ɔ_T˅z0#SV9Ѳ_:ouGGxoq cП$pۙC!lT!-nxNj!jf[`(ʑ)/U_M _ŠdETmH=‹+s4: OD!`mId p9FfW*QBF<:ԝ ƀMYOG,Cˤ'oݝt╛7=*4{p%rs䯅?O@A!(ł|Ͷ%#G|woiAC 1w0J,S{u*Vj/mI&dCJ5pYEE4Cq2cs0J!Tk+Z#v'1\W "i6[4^Ub"٦/1xpSgwMPv۫ߝQ.X[6 K@0اWe"h34q^(?Io4?\ȅF6},nT?UQ}׺(~ )CplIQޡဢB&&?Ed6nM?S!ȒJ>ۅY# r "浞U #}]I,dk-:'} N,4I{PyXQ86?*ni_4n, }nɞhw3zb7V30 ߍ}6Ms7FҨG dNu𒁺^ّ݈aa o8dzܾ_YC35OۜG/fGL=dxNyy9ʀ|hs7't HF׿/V3n im،?ĕ/&^J}MF[SsvjnUsk8>xO/#\f7 1-%R[o+DQFlV48<3P!9 %rUaYTK65g ׾k7`x£S1ßOjڇ%k9a&Z+~E(_rA׻G_/Wj: 31q~v$<0(n@  &IUؒܰ?08ɛ6ɦsm<8'SO~u=d EުF'2ШD}ɇdLX}xkŦ8x| ~Td Wɖ$*vKoLAQh|Du<-D(Уglޞ]w @T &B |/̗ =a Yҿ( PHtP,@"ˊa ul~ܘ5&;ޛZZ1(w_V{ĕan(gT^ @zʩL2} r=&?>hD}{g:ݣ^?8JcC@C2Njk0\l=}MO(/.~Gaˁ^ś:rKxZ#ϯA:، 1xN=|"\*B.zn.Jнô(DT/ SgXAA^&Z"t?#NM󝇷rS 3i۶F9!Lqr1:3.9*2|EQ/xkKN7RG U&V04.c "/xVj(*5c!Lo0FskȁHI +iJ,BJĄ@&_F4#51˓ jeOaP#)eQbp72@edK ]? ޤ> p{ZCEI{-Ĭ &;k/v-[Y'hTd"-h/`o\ ݶ6N7R@`AךBvZsGٞ1JhVy 9gaJ]O mأ2Ōdc};ɞAa'=<ى2LhW#]{w{9P$sic7ĤuesE¨Я n^f{"6Jx Gff.SR'oCT6x ~^[_p}(cER;e_2|৾#•oSvYUm*$ V.2c !Z>)6 Kt_) `uh!CquP%%2J&ztEk5bwhvn }k6pfp0p,\iᲨՖdX#\&Z%+Ùo TĒuh_-f .^Åo;:(IrT O?дsqyZc݌Le=iY7ĭ2}].םF^ښgn)d$sDL:el#?V:kk!=:AMRLy&DEڔ%\|/#om-P8M(+JYK3Z4iv,MhIx5OKZ.[9vĤVy2ZH:8 وD[J|"YҗeNl3 Ѕ@Wi}E:k6~*{f؄Q)("U1|0OTk|P6=nBC1)>o` ^.1j<&0,R9;G j\87lEʖ|N߁vw-6ea0#Wi?OuL+GK =:ituNHu!c$h#T+ ,c9lR .f>V /,ѢKD6g-5C lzA^E  ( H 7F4Fcj@TEu]` ?̝W#|םS%#6lN$iRqaܽ7O s0Ћdc$Z-C/uԇFt?WEryO/&`%t:8omm5Bi0 +zZܐ\\M((qQc]$I^i⺟dň7|-X553/BcjeIpGREe:ɫ&B$Aױ5.A esTe$Ts?'[PY'FR(F)_X2L㮴dBV(F8EQoJiN4>d%ODJ{l{aUA,u|R Dt97_O#eQWlR TtѳDil?2Q%Y/ BS$yMpc >|dAP:¢u;˻_Ny򇎭Ps5%[:u cTT_=I#M$p}$h%hVvDMhߔTq zKWoC,^\P$ᙟ<O$ :Hs}l!EDĺ'A[g3jk\壙s.#.UωI`+JF}ajx㳀L$6%1 ZˬEЈ^xyx. # ļ\>|^5!_`{u>Bxj14>cdseb y3Z (:B}ݭ5|Z H.)*껛fI@4j'Џ][0 $ZV6 p e )džʂ?z[zxTl,SlHj p0Փsh[‡âG*)W+zUrgG ]͸KL9zxEa|0nQ,>Ɣcy̘ N"š+)@La^_*LOI7}9]p4l$o5އ*8~')`b6`sұt5?,_CGMj!|r8h6L^sϒeFZ24VzT{E8*@ C+b]̕r"B]b1{z+ftuu|>caxNznaP]'pC)c5Bb=Qfڰ=%ջ  j&:KJ>'jUCXNw үMc/^,Pvz,^n)i0CIZ4bXUS;.+=VV5hS>* ȥ4 [gČ o+ "UVj1_A5I>3 q! "!A(JX9){7Vig/ؿb4/%5bD.Fa0C*MWT[liW9,1 iMՕmFLϡU^RpՇ!~}؀B^V!n< p@SPCENe6wAdK&"j ].rɗfT#lf+Ƶ`}AGAx茫 nD>#S%q(zگ;Ic oL^7K 1G&+- W ܚ"eK^]LPorx z_S)/\GY֯NU |Ƨb=)T9 ޯˋX4 m7o2Ŕ0e귵3-rxwpq[A8d8(۬a,K't0) %̤3]'UQ m;L;}hBp-Zܑz m5>pq 7SC;;!Sk(w(6hKݣ>(wi,#<]BWҹ`fZ?˵[Ϊ;n!iv;s0KBÖSF0 zVkQOf/ #ܓ8X7H:tvAi0 =pÄ=nʹK'b0,m;(b Venbxrk*?Ws%T'%O~dD ueڛjrjoz:`@s)8=eޭH#gnsk`f&y;!cKvcAvA.YӂO{'0jS[ JUrRNVͯc1$k\./'ݼ7פ80IMd21}R +6͠ImkU y<:5ŸϓmL"HZ]~К {(``XqMU 75t=[v"I>x'  (r*[] !l%?66yF s9UwU_~>?4:?ovtJ_d vly[dtW+u v&cfNPwO$i|cv'B囑c_' #} M\6cu/,C~%(0㫽g-лan._әIn_/T@Vmq cRP0ڀI& l,IT]?ꦂQKeD0{ D:.נI)NᕕU![BH걟HV*U:cnUjry|xPE?*!G}0@Gu],]7'b}+0d6WYp)Ej2*l83lǙ|%Qcsn!4M้ %=@ՐY| OםMLmo;W[҃IdByؗDu+,>xRg2[ps[x;C4Rۂx)Q#" $PNcƴ Z M'IއC9LLt\&;褤nVO++ ۳^\1׌?E-^Ǻs^\ F1Q@ '{powKg[N@[2}q]?kqS,Yi6ZOTgSkYvI?a]O3uu$Kp3; ߌop9ЬeԾ튛敻4gL_^},Qp"ME(}`ik44N՘ )JULI{fğэWw1DM-OT{gNm4 4zM@UkW/^,ϖV}SCT&j=&0#2v2޶qX4SjD|B;ph(s#*%k8Lgs![bzB5l I&\Ry-e{:B_Ƞȷ=}mcuZA-̱q=.sW<*4 7,g46V@+xu3So$8Y"uT[FN#-C̦n sjҏZ#zƼDDU-oj߼ ohR׹%K}7tDŬ[O l2EP XMF$] L %*.I$ ?DaOW P||$ 8e=ù{h묤!xZjBوB;/\=OW_VY o?;~4fD BCun c0l=l؞ J!w_JzN_列{dm4O7qX8rXj"ݏ+#vLtR%Av7ݶiEdXC8*1fi%%o68GA{]&hD=x¬lBWFR!eKc2+;2)ݶk#]l)V2V bHĜ"+,J6!|voxWs+䆏0@~zʷ2-Q"fלuZMp,B EWk?2L.`+9 j;zU4QZ@+#DZgeQl4:'f-%,54S}&)R^sHin_Dݱx1^;$ % Is&ʁ}4$!Uh2Ihi9Q˂*R {~6鍬Q}OjD4N}0kQIXT,Adkϓ2+edSgkA~7DE흀vhz8v~ryh|U^]ƶz ">o$n\*8 R}GQG=Di!dΜWX _&Ƞ][q]a>i%xWm2֐KѼV=J.Nq)1ԗms:UU y-=?j@ׁװP;@m"-E#ۛzYCxϨv|Ɏmq]b&7UBѳo)tZ YCeprP -b1f@~+sDwE Dl*`1ij,<hR4C[yn#$ 0"@'eLa yM;FGהӵho CIx#jܟ)@v;`DI8+^UAM`#`X~m7` 2eJވi6) )(MVJ̫~ sݣBź7x$zXCwͭ DE&-xm ZaG :L0}vo*@Sd@W T?1%W4<'^߂s?vVK<'V*P-V&a{}g36rcAtsO 8P"(j*#A~/(/]w ZEof6]!B镒x:d:U1M?z%<xDW|pC핈LBE[9xJY r WJF͋sP!t웽~‰2FZ&b>Vѫa^LN#3柀afȷ̰g@2ʼ(ˬm G~RJ أ$;?",8,=)'m 9`1eG2cf_|3͑SԍsC#]{-橑V4GG4zM?Py;[,z~@z'8  b|%rmLnZ~3do|]g'{Z=uca="3oСL7?.SЁZy6xɷ$Yѹ{b^mH`-3 p;M~o~Ad? /iƭ2aZp1ݲ3=VBuv+ת2\ ӸD@mkmp58Aeʭcm w$Ų:]5Vj#.ggOk);OCuyC9(f^fpbϋN&E΂0 OIoʜPL!ZԷ፟mgkm1-88dIH_ NݙhVa"ԪPȜC@!Rf\R?~Ʒ t%U=H:2!aH:md7n1'!xwȗcSbVU9!$Ea8_bE{wtd-Dr;54lǞ 1HM5!c8`OSJ޵:5X&nnmT6NoEOPӭ0-#/C)H< &3MWaExveL~HfID7%׍S,K{N:-LI{B{-` yꙐOgx)TI@1+qa=.@?L&W3%{zG/'$Bs+4E`(Uyy&YaE#Ⱦd_w5ʏ?z?Tp$%"%8C)P=xx<>^ D3H$UUqm[i.HU3}+ђGnbᔼTZ07~C`UqUwÐ) َtU0-> [{?W ֕R֓/ƘT<5nr"o+>ޅY$0)7!\hgںsۙ=x7(sJaŢ<CꕯA[+c.< h/nB{6 Ją.8wzuoزYv[{bUP!dR4YHcP9q&^ƢpJSx-yqddϵ8TC6,fLF,ت̥j඿8@?WK(m-,ayX2 #䳲oZtI(S v3a>2X,] |w6ʆ*J"xK9)-봝P2B9&-UZ;Q-_g + Z.*"Ո%V"  )*?sh&Ssl yCim<=R\O![Q-LÆDϒc\Wut3*Z#%>Yۺ֪pF0=/Y RwBA^SA+)~LK*Z8MU|֗ZܘIfM##%mu:3e] ,V%@ ؎ :!s92 Mw#;zx~e-_klkbrB~t'_5д¹z-*}V5_8Lߙ;+k)PDݔ-G<wJ?%jh-Z*IpwJ`3ve(Ymqϯ2tW*W>frfɪVITFX`􆠂N=@|@h.&"nw<٪U)D'M}?,Kz \kT5mc0mw^D10Už*E(֝z6$x*OknSl:5# \pƺݚ'rvWCe}H^" bzzUˊ$|q13ɑ8[) lHW-ɳy?Cxu"X⠷W=\eaP'١#zFGi7%2I?cB{u^NuY[m"zl!jqZiD+}s ^pp,E8̡z.^fA"sy?X7@M.FhƂWjNw:ӣhQ73KQ\Bޔ96hAW75ytxf)=֑$4!Ig I;S\ݼPJAP?3FBYKmܒ(_X0} ȼ@#.|ݏO֩UaT:>Tu͋H6GLH?J$}D"6xb}آ`V 40/V7!I)诊del@nOjJL^h<$kކZո 645,Uky$eN־qwu[3B85Y|;L&/yݭ/ZD6FN-vlB l$"l`kh 3)1to'KUKyxn줧 RIf9΍M6ske:Crvt|B>+*œƈ2lBLĉCzV˿o~]c-eF|Co;gZ.* O7[r{>[同)2UnDC}ÎypKʫh7<ʬT@2 /A#qˤ'Fg+Y( 'Pp@!h kSۄz7>a:rŽ?}zJ?S$sSc!j,ݯ㯞1ը{suԨӍ bBN_3<&l^X'A?v V=9$1Xy$ \_! >~y;>},5M(vVnF,ϻC"1ןhߜXa* Λ4ߜ Ư\LL%YZ(l%z}OUjn~UC%h!?x2\j=I1]7ub"Ma)s-,jo\B )T]#!@JT D&ŒHc~cne!k8JĹ)@~o&LqV5qe?Lkn)Lf<ᏘJx=š UI# _4i>]{*Z/FĥR&dEYRr/A+PҐEq__tANf ́"18"zdraS~s=NBgCYۺo0`x %<ɠJ!gSeI'P޷?*dwBr.g9[Ane&1]be,lhl>)vqP7@;p${3֏!D]xD2 frk.9Qk#KV'Wqо̑JeLv+ݼKb–R X~|p'XjZ4e0=4 Ou)Ri*RE(8_:A\U+uaBBũA֎k ?Rϴ?8Az;0QXF/A@2TVcO6g6_?8bk%\LJpe mYA:0"p-fw+K4 m昩 I۫\75}ߣ;"}f5"Ez,OpO,-"BTW.lKSo!p ]tˆG\KH̽<߫YR55Oy;~,|:[Ja6F5 wΔp?c@ .ԺǼ2̰+U&m,HwNƝS[Ɉ$c`څR6m 3$ BrEpʂJM >LVPXΉF@ɶ[+o, P)\}i~A&CbM _>-OC~V퐼6609sČkIߙc8F`0=p_n2 ̵fNg1@69ݣ3do1xLbo3QRa>`OQH9<wGRy:8%rjkM0Ċ)+i&}OV؆&0*:ygmFt}qerMM y_ kԟzd~ Au?٫x nd# Sy⩢ϧ8!o7tJC@6׽tE +MlGޣuZ4kLӝ`=JIGL$ *Pǜ]-, {72MD@i*bDC-<]:L+f+W(E(3.fN[Ǣ]K@Ӓ.Qf;FJd9W˫9"h5>._3`Q7j${Rf1|aBBrmt;/پ0m{"k p " m"@d&;-s\]Fx6UJ'gdnR` g*,]GuvOO41)L{˱XCS,`5|Ateq12njd@S贌tRe~^dN'0jwy*åg ]1 HQXo01qRSy -sYBR s R^@O@̮(51akHB;%^.s )2 `ޭ&FHg7<B>"Qj74,wrVsT2KA٬o5^08)FxB?zj;EaP]virGyZ6xֆ\HGycL!}rS%Oo%wwOniJRE^vQ/mޛnjgO&GG֓n߮ć'a`[f T (*pH溾/)#M yt+TNAv˭ob8gX~)cq[ѷœL \'m@ !߆:UOdOߔ-sF* =p\YΥU qL0q<9j< kt@dIp) W'EzIR: `6AQ$HJθvT6潮M$V _8>@bG@%M-w6xIχVƷy)GYՑ"c/I&t1*P}Lݮ ΐ-I[Gf~iMJu(+吧6 hACeJ[ހFw)z7iI*?TH1Ddp0׾Ho%$-]ҟ`7Y9Y,_e[] xIHc-7ۻa+} ѧa?<㝯n"C=z˩R Iϔ,q^\Hf(B˨׮R}^x+58 y+YƮ8߂w*dVhco 2~ T.X@ݾ|UK58L)<'j8=RcN:!%go*r?*K~V =vAGriljW['P2Ǭ$#4-u[ ҅_ܪEҵyA))baXoBgIEKDd5 |'tmj:2Ħ3%غ3J'Ў+u-)Cx+gqēd> s<$&"rbBzݥa%fc#)$C>RhR%S-lKTu;/u#5$n . cȇ9z 5s1ƞhSuPzIf" v, }sq.r~ߘ 8cǵ=*Ę`p[qQLRA xDy}>*l-芖p> 'lȮ9A۷OAU*nI+Ϡ9hhK:}QJl椁=Oy5ߴ9+ Gя?a ;ݩ @ppgk[ߠ_n Oa%m_> P@Dd0ԙx)q^,a8M6ᨔ _7;ٝćM+&Yr~E#u^=TiV2 ~߰*h$hRYϒGQOIf&J~P p_>/df&=_ީs @Ռ3?:/\{}}z`k/ϲ{޲K|;55FpGMZdMB1[IUc?(c'kϠ^ʨKq'1|W囊#FÈY&CM+- т1'VݧXX)!V^5J7Ad hPu!ą<l*Oƛ-)gJQo? VdB7 Ӥ|y}IHk=0#Wn` 3& @U<-HݡCcS%iPrCvK|m.[Ax|kNdϧ!obcM)sٕsC U|lGf8MHa;f<<ٓjl/ePm Y(@'c|dB? 1 VtnWbCakLLFC5n̹ok.Kp,b:r%p }IGZHh368 + 0#Z /2B_`De 4:o9,UݲpPTG4l|&d;0Io/@l( ^lIL-ǽJܑTJLʤF VuO?- P nNNS{ &+[ЙHI9UQ%h{Ynj.R;%*Ll5^EP!`Ӵv8/mԟgpwk%zl*;gH(zXz$=9'Ikq=ӡrQnF록RALe$]ǧ;s~xi4wv2X.v:yJ:u`% #^TcMN`^( 1-.7%˖+}ap_5-]Pb۱b{*hV=R7D%ɏ=E^X8q`2]JU WuZ/I`{xgx,ʡy30aϦ)xP '_H %(!Vg'rVi32܁C*!j9e,XlBDp_[Ґ:ΧQ27kLm5)̥B:<9S#k Mg((y [oB"P y崷(dPܑݱ%x = w"hz^wbpkASXF4iMX=Xl.#Eլ8iLՙfnnUO) B zGk 5` D#ky徆ڌ_*He#X,%jm#^#c}0hrYs: ՛cLP`c q܎K/-.pgd' L&~%N0%V0%(XUِ;| .SY5~1wU[~:?G tk_gA xsDNYJ$b f>+]R-SoJn (ROz ]>щk~o[:X,{y@quh@%a91(|{N׉V{ Oc/ؘP0Ju*֜K|nc|[z*әIH|U*hh,aHq') M_2q+.ѽXwOZ[8]YL=i=Ƶ` Gl&Nc"Vѐ鈬!M^"csVFLS_okBR LBȠ6\^ȠmAzk` =5ca Q ]QŠ(ҤпeXLzE[Ќ(qW7VPkQ-WfTMvؚ+ULh rorry#s*,#z]R֓TK&>?:FtfJ",5_+QvXD̂+|:PC vo82%.Ag7, xyy`R(eŁCcC~A+Kq#J?aJtB|D cR.gi{'(;|IeH`E$ !p}FC`S]-MSYL qD hQ/T5$=w0T-cթuc >L ҃R^1j5la+vr3%_}(6]qyOd.x^/Z .xb:95 S>U˷"!\Yv~xJpYDa [QԄQ)A9 .W ̾_409@j6Q=qo?`  .A ^!̉=1OKɣJy' 0_5$4n\Ioqr_==&߳ gػP|MܚjȾ(*|)-Ag#"DׅB[s'n`6@|kr. 7S*4C:l hPoLs\8QdU^Ћ7K]鰈6ڋ"Or2xt˝S 9'A5ݹ8UlYGa?xG;W-exn~Uk,D(d5)ކtnk8~_}-'Yf)'ȃ-}T\sh癉4p,~㬚W_&$/9& ɪRO{B(tv K5PO8YL)e慐ӵTh$ˬ?[d$/$`RӘ(WegbI0nhZIn{A+|rcz/"^W 9l)olLAh dLMWgtXՇ1k0Xg ÷ 0lQNV5&N sr/*+{InrYM}Ǥy݅k)!NuE #uH>̈́AIٰV eHQ=0*#˶٧;؅#cv|\1/#M_jYSd%tp'~Zג [ꡡgqp{%p5 W>ڡV@DCJ.Ւ|o.n@!"*F1$mv|VoOKas$4eB\-I6|_7Y7m1h,S}},O!YͣA鄚9 J!Vy; V⬄k/bNv#݊[Mڌ oh3j{RWB>9=GJZZ ɪDN,/ 겞$Vsg_t9T~pSlyr?,1#8ݼ,s4%Pƴ >(2ڴ9Jb"0Xd"\!mtӂ,Xݰ2D2@ؠ˼ƩREwJp,2u&pz;'/Rk,حeMz^1R5`+kSEi3kI}Qo#V{xW_3)L"{#I8 츹 5Y{3Zs<{0h1P| V~Q^}FAXiMh0O4idgr2J )f)$N *A3ن[(`p$piYXƠ'%!Aͫ`'X!I&-s+fcyS@3[Q/Is +y{0b߰W lV",o ޳Tχ-:KŵSmc(+tF8pGvǔXSVԹU*:ewW 1NBiJ:2sȳ*ߍ'W4ˍi"dT A9Xsbrc< S(޲XK޸=n3jj˅JܴӭH4F)gy]QUC.G~'f(O"}2?|Պeey kFp/$K vơo}#)Y9^)9K(RD8E~*kچA`2{g]&1؅iQ (7b"*Ƚ9([b~Rl fw_y! hX\ds];AyϡBU5λ6 3d /) ~/zM/ ŮŠ--}fd[>`U%ۋ 9_nתxyy^H4Fr:Jd>L7LB ߡhQʔ;8P ԡKBƜ}ȑSTu6–OBڈ5 -J>!=gwj. _{zӍ,T Z}|ߋx}xO! ]G׈7M"6R.ד,UFRP-xο>xQm/Wc'@T!4!)qz6DR]3(ћ~g"Ǹ"WQqс5,\QbJI'Ԛ)wj܆|j>mUݿq!iS}-ZepMka3v) 0ۿ|$W 5Z ~ [\x~cukS9!Q\l:, xI)9ް{n" wSCcV, Dwn)1f~N!cCo] }hd TH7=AFT)`ժ9I%ȿ} SuL?"1DQ7HֆzWԂdLj0FMRv$T{EyWrpurM%e<QݚLHpSaZoVغg7+;_ {~VS?F~7:wЩu 0F/:yY ~BH>tq`pN ĆQ~er(K^+ 3>9hmtDG* 꾯'S,X s8(& t~m- ]8/K04VDXl*Axa?eomG*(ݫ\×)*3J`n[֌B$ C r Ǟ.` }ςWj7K&6Ud ]q" \g(eG[E8ԟ뒵19T|]4jDMؓ̅cJaWq>5@*c9d1-O:*Q~3?Gqze ֋d=#(sn8X؅'߶·j r[,ǪRxpUqZȭ}RKetaSP#uk*ˆ|ڎ% ߔb1Q^QSH!\.j[0On'E0 d[^j(5} ZJ1(]ӠFB[QP8j*O`dwt4䆓NhjɧYhD˿NQ{օ$|L6 I>?>Y-,Tq7A4HUP16\6l}Y  n5vڃ2ftUkE2o)^)06 1GC29b(N|S<`s|17k7F6a\utzoLYN%n#vCϖ G wQ g\O~TfKJ*?AK҅aM( =C V_֣89;2D'5v"B<wֱ|@% 90v|ĵH AG9l ٴͱyQ@UioIt-|NDpR]26(g}X.0ǼG0 k^0~T0p 0[V( AKUVE9+" ,fy9!<L;YPzp&0|v5FRI4ּŷ6Nq 7TF|/ȱy".S]pTN#S+_t m{8=R$ Gfg2 zf4bPFg~E2eR9c1f>M MQY ❩#;3^S;0Ԁİ$A?VjUk">ѪEf|υ[A(8jj@ں7@IǧJDMItS{=Y˷w5⃺bwsРZ^pKl$p&;xYYu`(9pDOyKˉ ?"s-DRg)Fˑ֊;;<  PMv10r2c9-@:)J)Կ]9 ';*DVv*Ŗ,#QLd."MӶ/^ck= d5_d(Cpɀ ZB ql&c`(o?bOn*wW~33g0 Ct5Q;r_=@+&K?ۜ5Tͭz+!YݕG dY-1$mʓ]%o e?:J].TѰ{xik5]}W9=ppwT S R{d0vٰ\hj:|=a*19@QBIGm++$vli[-ݜsj)L_{D^'qYAN=ߩ\~3Wx va"h)2=jzQǜc2lu$g|b>Xo6*èfCy;z/H@ADv~4TCdWhz,*"G\ -bis0^-w/?C/<PS@B(Fe4>C 1؞Ζ< PWO+iZ #m-PCɒ@IUi>?;ט &cN_=[ֱ˜N_"wf{9 )O&n}9< H: 8RMMs͹F1n 8Qɾ$_K&$i$)VR0Lhf=dP ȇ&Um5a# f$u(D`ɮ˂sW؈诠)z4'͛@2w)G%{s]OT>6W!`.c` S(bJت~(3//)<$d=_&1s>Q3I_Q0enc6AZuLԀhk>8p\ B>+z?VuR͖659=eڌݐG`+0%,],9{Dl_s1c<՘q/;,ʝT!.ƖeSDK/,߹*hzcnm׋Nܓ|_ Kбv][6}{E#W=+f٬MHMp"zX󭕒[anxxĠ ꨼Ǎa#Գq)3umMԄ^ RP9#%BnQSa.B[&s{*hw&uPDZj4VZ퍬Z |OqbKw6eQ@n|bi`\TLҙ=70?qNz0I})f45z7ΜVN@(dh[5K0x24 ^dYBm:Oۧ#4Wɴ/@3:ԧ}^080(BV|h~l$ ҽ lIhw Nćp︉y3˾fO<-X%$_4Rkr9ͨxs`mj`NM+LĒѣ3 A^U'IszG!3wq6^t?$ų0X?q^<jŌ-&ʧxn껍Pe+tX*2"1_bnXiIwE}h ĂD;P%Yו+? WǓw;ne 7 B2fKΝU&D^jtz82b>Z4veৠ[ĥ% }6iۭN1+% @0 ײ-4n>[a@.mJSث0.iOiu`舝s!{4<ռJ1/"uNw, ?`|Q .y"#lZ@|ck̵wD7fn_` 6-oKY7!M#6Oӎul5Y{cQ-F[=/VQۡn`:&%yȸ%M& [/NqG܁GLHs~t'Y‚%ڏT' 5=n,̖;,,zf 1CAI^Ht%֨@=àS䟌Uze#9't8PR* %-d':C4@~>61ӭ=&%Y@}qfsL()<_+9oD7PňI9`un豺;m{~EǃHoKx5ӈT'zClt ,  m<ɸrJ{;y,&).XTEMB:6V҄#qG-pK02F{d P$_2½NjC"V-O{h(ک^Zfpa Fc$}*|] ;{U(az+'Tg ~ + j4l\m? *.)BAC<R2EhZغbum,;KNj]s&!Ѷ* Z̡#en[xŽ/HP]&!f % lzMp+)iWQF15vvcG"p4$9'%nw?~>47-\#c.hwUjER։ggWRr؞88hDG$λ]~bK+R]BB%C$Do)X 8wBG7q*A3PҦNP1ARdD.VB{7xSNpA5Xg)SGs7 ]M#AZ%描}`+xM20~(ҭ姓Sj=P)T@(懙u~M޺ct=87^1JM sC/ە5$U>갫0>F \N?|^?N.)dlCk4~ 0-df0RYVTl*xLn|֔}w>J&.&367z%Gr׿!?Tv_ix@nrR<@0 Y0%5vȍ,!V0-Dؖ*&>'ggi.p<zVAؔ[$rZ)ނLh"p\3FyKBa_ `.Z23w_]ISmb~cQ "U2H}Δ:qv%ْ9eJm5ׅliL؅s'2M9_FӐm ы.]}C)f4Ewjm/n>BMA Y'󭧝b >J MU1zF@#ΔA_ <1_RAZTDzcQ5NPdg`(@o-b|mtXL&G}%;j*9捷O'c&)򠃈PApw#[Ü/{C썧+0asZu)@b9?o:7@]$2}  Sm%AȴSt0 %"/ѹ5?n`,[']84}M(iyj9 J,N؆vDX-vv1PN;O!3w8_ U0ZgBm55ұ rvaR1˓b|K u0ҕf\Al8 hp<6Q])WiXggޝ7nc"%^^I} wi+Bac$܌= nkQt̖Tn? $[h%>ŨMyzv.N jM8aX&}pC~cG`+xy נUT G 2g\@Q#=L"ZJ=6`џ]E@oKraݔD>fE۲4+:XW#0(IűkMIO|ă+z(G@E>y5&s;# (YLd׍8jDFQ1q{70Ě{ 3{%T2s(N~^V;yAAǣ3m b~Q'},bc2@e Q;ׂc3B!c'\1@Q0xb>X".lf*Ԛ!1ƸZ@])u+wl,8=")Xv++|zuIPa656P, ocՠL1;SukM7:C5@߬dDmxYױ/vIti#~ ҹ]3ȕn]\f8"![BkEE, c.:hKγr+9<@?W7R&HjGAK)<$ MHl^GZ)i 8첔s-jekw&oaZB^p0A've)-kߏ}c;%u@{.sr ^9Kttp6Lð<-Yߎ߁.- gM\B{QbﯙV:GE܎∤ >1\~iXĈOd3ZX5EM9$X d'(Ů"?M:-̽U UԠ:e@Í/E\3V#j!a WrrTa6…Kġ3r8FX}*PlI1ԟt|nAL$ ^ WNw(wm4|TY;ŕ~\͞)`Դ4:fàtI׻ iZ쉤`8Spr,ṕ=֟8m>y<=6 yJ5o_#bŒQ;e{~ 肪Z]DD9<()vBV><1)L]A+x? 81!]0ҙ{RI/=R4ꩱpΖo9+ .cTRȄhWoakRG^~@j05B?%,l`Ժ=*'@WE{Hq9h&? dbp& c˓G:ۡ&Sw{j&"'Q8$J)>\'_*(9, şƼLf?ɺe.{$ە|C#Mڳf3@rT Ҍ6\RHFѯu)cWB;OwۊW!L/& H @PPߓE0n{_H1i!mXЄ^{LX଺ E}y/C\By==Af::DyQb^ C1N~+~h)bwe\w#pQJ)g&;Kܑ& yIUN32:KHeQB94K9Ht.b5F8 YjBBk|sEv۬=D4}p!$ 0dzm˖n_ cǧȾpA?Ā: |D׃"|o  "e?׻{ArQ{":q *~{ZyW:^S'u<jQnGO~i% &*ͅS$%m]|$kS)f|JV+ܬku;7 ΎLjf/)eImGWÅ57X@] ePotahDxݩcThfڶL`-GVw4IRde q@z`;:OS黆W[ IT2NRLVgLI77P; +KFHEBr)Y""nN\0ek H4QwSt U!MsUdy#Sy:QX= _fhC _} .u7WXL{w=(\,aDz,kT]:>fЈcщ@qd% IBNta=r2΅ ФZpϣN۷2ĸK:׺{Q"IhQ1+>{ GAEy ^a Tm_oBӁ(Zh>+Kotmt_gu3_F,q0)U`o_3hozȇCyX7Yz-uy;t`o ?Iu©#SXQ] #Dr T )bK]FĞ,!Y1sZn?b@߷x΍kiTTR ˧[^ m|?o,_ af2:g+3ENzYpDHJ#*mx65*8d0G-ٍz&8j2W/ 2W*vi0 yEbHjvD ˥Ea" h`01^ۚuKve}Ϳ]˼C~f% ^>x:X;^l4tqXwQ9TdjjnHsW[ jX9끸a 2 ܳIP2$;?k%~cQYq*>IcI&qJs4Y[W+C-hS HRŋԈ}oa%Em& 0\O69;Ι@#!9~N,vjW瞌QeE֛H萫d}'k#C:(0 k  +zkq& MU7V[\S}]os`zG'WIxM\>`%qQRO!V67 \]6Nw]Z8>,-h硰o Lnl<]%$} X y|o<iB_qmj`ͅI.1@HYݾs*%]d]v6"ZEx]PDd1xA7U̍(jYp Z4U @;a?jhx%.~ҿ-j:U:+_BQbLBjy;~$1x}{ijHk"| ]r08Iφ 7#U)Gcgb?7*Lj]U`G,4.} #TmDё!ODʟ& Uz6<ө ZOsaDbՕ}]+T{T 87s\YqE-+Aǵs=`2w(9nlߎ܋v` %!$}!-ӽҽ%E1E EqM"Ȇa$i{C'/%`"1vz)y,5ۍ!G-\'oBVoTnFG{ߓ Pke7)c4K-ăGEZJw}pHQPրASw`q j1$/&^" \V7 _"dBW)h;`(t,i@9X&!)UR~(bŒ?Hȝ^qHHh fsIE4ogōk͸ujO<1^oD'Za޸+FoY}bXTb{Λ2UTժ|bդ9>tQ >B^Y"{kDP^X@bAsAg˟eh^?4'uף]x PԒ׳+%ͽl+jE g0ͭo˜+f)+^J2ppM,Q>|Ɩ'Wz?)uD.3W;|On! ³]gP'ʢ~ z;? K1|xOz$) zo A;% ,(fY$ ЇA߲z9]}a զGI֕,Xd#ܡeȓ*6L t_`Ai]ӧWy.MOI]@bEg/zH>Aio]_Wgq9%}D;ή0xQ(|2ΪY{E]_< M81\Z0`J_ˠ{6]Cq҉o%7%zo/µ7lHfЍ->^V·𹑅'F U$+< e4up잶Wk⥋'u ~?i_ Ԭ5?א_jB:8TP킯X vҦʂ-휪,qˮۤ}}ى&!Jm~L`R˶׼Hqh0*(_^.ENp y\ܶF0VkW(w[fsuUx4޷%ٽ2ԡ';F1n:鸚1߫˞jZp"A |9+ދK-NnJ&?V!Dq}!vges8S^jKb0xz]h*'rdWq. >2k^gih@ ojՐ&5˗lі pnZu$84fexRt۠t3#C!(鲂jd{=Kx|KtNu,3ٍF ܈kjA@GZ{{vk]#^ Brl.+옑LHg祏_~BgÌ=8>W Pd#tƅc% U9sAr+AZG .b,։%JpvHCnuj tTzr g6c1_VE_!,ogf;ny0lM3\ɨT1Pg=lQ9y8TBG">l+<aɄkӺRu8"0&WfsOS^&}燬r:SyLiVOCӬ9֡0FZF9L_;:Wz]$lu)(٩J#CK|WvN*=,eifOͤyn֪2N sd_y 3b< #+{M@/nH}zxf<ʟcG[Z*}OuiBnw1:{bO p](}bȬPF{Ȟs>}7/TΗKV 2lR uVCd*cѠ%m~1c7jZt^&ע@dl= cӣ̄UPqPQ1VyWw!%7Ԩ(pzuϕQyEC:զ]xN?怙ε8SSTs r½^ e7ܔ) إ!QT廙K{\o8X7gҗ4eRu:!G#%!4;Hw `^W}93Q «߈bjp;i6)8@ß@\)Yܝ ]Pȏpj_Ex6Υ85F˵gĠ1Δa}:vPfI2BWeq@dDml-I8i9xTIJ/ev`L(63|ϔǑqc >oeaj mwb}1KepU=1'z gWP'[s宜,:oy:Sh m'[1Vn <vIԏb'9  9xd2/S| H 09Ju G~z^IX/⏜05N> H›amoE9T "W F7v" nzT۶Wn\!Λ of+ +^M)GU:e/ev#TIaE [wLWڜ*'#au64Sنs/|dŨBnNɑՅ xft-gWgq"^P*ڞ61$ 5 (nm$_ao:_SِJl#B^9xթH7h Pj p?"PiW~\me%=ׯ )C栈0 >6&ԓ񻙻:ISb fJ΅fCg@d߉Aթf1cq匪ȿgwq: _;vw6j? ncl:[2jGlv.sw609HduZ|:$~W@=^m%5_ouWpnj~Y{Dg?h& c3}q Ս-^RL}fĉ:K71+&a,73P|K!`R|?;]vtcnT\wߓ[ `=P])yDx{w恏ү ~c"PK5y`]P+r7ܲ\bK44kAa6%H ӵ[5{[q|Vl]Z~F)I{m>`M/s]EJ(]PhAna 7e Ilq {Fz3F[ \]P=ͽ\@fW58a˟LwjAN/}m]kt](=-bVbL)3V7o ~ʞ0ɭPZlqChjib(S7g\4l@K6q aCA1H[哀`n5cdֱEA^=^tXҴb)iIYgRa̽ i#tHqQtqC򖌥.Tƾahۯ'!mVNO,rUElr Μh Ҿb?1"ce]֌Fkc}}F4pDkf}L6wWg9 7j e\u&)3S .?'Z 7)="f1\I[ hRcCͧ5CNe߀Tk2яJ8\W_*XE[_,ȍ~ۢ j  (2WJ:КNqӲaw*v뜎t%¯ ,s.dkp{G_AN U:9ȿ+݉6uE44p'+S EЦܷj(kB(Dl_iM%6LAonhJ:1w4Sr~^[}G1y?c~N$t'VdJeWbP4)1b b蛴MJK18޽cǸpXVY2s 1sWUS͸ 0yhd%$m &g2Z ᬀUckIa亵p'rc닏9M`ZT9UW<7[ b7t}$Lp\UGM<(יy#*BiNo`zLQВ9sdn 녁ኖ[bi )s!f=D3;_xQvFɋWc*K|WAnH$Lʬm:3{n^әZᬑŕ/xf  J8ZX='lsiϻ  ;zvu. RLMeFh:]b3qi,NOq\)i(c;BNN%8==*QVr-׏/AuFKߜ .CgϤQ1:7wyT}豨&Xzdo ^ֿ0~K}[1Jr˗t̥5 u:p jWfYHPz>[+8X}ì%q(bu&Lj/6OsLORZEG` "\\$&N7SKf@_yޭī+?r%my BSI>b6WU o@z̴wӘX%9Ӡ: NUrgiklCA׌bʯ9t\U_cv&Rhz_禺Eھ!Ͷ^ۯS8j`pEAAP+H@1ԟ.O~z+?W>=*Z/3UÉh:eY^mu+\\”ӽzkU Yn?љUm+Dѷ˻&kT.  ˷j[J !ܖaڍ` [)9dN򨹗wwKڕ,L8C'GR#_Rd!dNW<Lz %yHn}q;qGͿA@Ɔ <"g" (yFd7~lo?|v@\A*daqFBhc^WAzwAk]YܧtđM>WC=Qwi_R/7Fe񢉠l,PDDu]C~$V/R!u(Y͉joZapfT~bEF44j6^Pgx*,*˥;hp7? }%ۦSdXI&47y(NQg @HX]oTfj;)rU:,8&=(kM7RWvu"#KXםu22"#bv8dEPd0|/7XqF`}!PSbK`'8n V3Omp!I OdƅLzSMy1X+Z˺zA#oJbqDhѾ(A) OT1vZjXch.BHP9#cs7@=jUYtL6]9I.2,*_1}z EtĚdM0;Gd qMǔ ͶCqM։3h$ث \k:2GVMe i#+d%.OYuvS1 ڰVFxNf,7&>z J ~Rʃ<6*9̈v|{W0k ^½VJ-jXmڑ%6 5G]$I1 jc8 Vke ˤ-KF . )gy5hpGlWjU\?J=V?{c`c\Q,ޱm04?1nv3@7`tN|e71n+sǖ=S]yRT.PgW&$BpzrPv 9#`o1=ʾil<ȹKdebao+t ){!JDmw6n=z$)]j* Xhmj7l _"XQ!;++WRǵc,z/`E*؛P*Uc(Hnxf^ld3;x2%R4֥tͮ^}tZ?qĥ p??5SSQ9A$|$ԜAjUk a2߇&D;a%#Eqd/ˇesTDY /+9O Q)ƨ~m JBW|Rqe=Uf㳈drw{XIExxM̟:'8i蔕 p\IC9p]+ "sY8u-&? P˼Β7M{aQru rqoH|RMH'~bH#V YKZ˶{@]vV:S.)IFh즁1 ~ D&G| 9;) Oq߶&I`L:,a\z\N * Ǘ0 .R,FKpP`^өOH#9ڣ6j|gUsFӑ6_ t.Yǒd-gk[Ns#,bQӍZmliPm$΂]&-*FPNN-e mɮ_gF ZsYQx (_bJYj-~>?yWzec J;_RA,0s:{"E-W2(ayP–YjA$5\dWZНEzM~"{PA"k& *;^?Pa_J[ lN1]Ik9[RW|eX8 eHH5 :a{G_rspր,;+6BSm+ídΠl.ˏ>SqÆaevԮ2Oc!ĭ9AU{Vw(le6tJ)8XXt+K߬\HevkQLflmq^N~7yk tÔo1eU \9A[SÑ~@|wwl%'H_ Z %1hQreYX/[=w{ûL@K- ?'7i2XWyلBJxy EٳkL HZ]إo(t4˸ghN2syA*"G’`=[,aL[F7?ni>KFԞz{Fy=z>ÛZn?W,.6F* 2KN& Kb:zuC o+_ceNHG(ZgZ>C me+fY#ApY\&ҢvQ7x%V\L\ @\NLrpCD-a$J˞. F j /+!%@zmx`L3'ޠde)g^'s?$ƲQ7ƩrV]ڍ_3 埗Neii-B:^ smvk?} Bjjݍc\tS?#N2odɕ9֘t4 o[l'Zs9ܽs2j{[f'<uQRze9Q#wZE ,mwJ$:x/6))9wB4(G=7q4s^sdECI^W3%3]W{cPF00Х^姊e~ `1l٘&G6ӴPikntKs=n/TˊWɾgOZ˄p'DFѳ]#Bl"|$7>Dr B~<(M:.3 *gC^]'=@`xãuIMW])a 9DS|MRBqޕqjU}|uK (TZ=vhq#K]ze8P1x rN leu;Ȭ4]Nj7U_h:K,I}D Pe1 )K'3W(Q(2esY\$g{;On2\7 ۑs < N:tE ڧaؤog-];vkY:{+!QYd673~rRHsiz{qyl1D俿/ZJMI [ B__L,X5ȼגt_'x*|+v)-IRT[=Ƛ簿҇`2*cfnf8J@BUG8إ0Zgn_ >h6]ɞg)tb^dN܉M%nFaŎĿ &=b0sY~_ÆOz7w0GVQx 2%Stkm 2kkE@~NT3a%Q" qF˃Lzn#,083;WaVED&zUF ǞLP'ݾ6A ҽ"cf;zYw6]6*K9` VJEAGV,\"+n X}1C E(u6O6m=~J~@1f5+SO3Ӗ0+U(!DJh ,f*ݪ(}Jx'~f/k 3vN(A3U$v!'u^lF-kIA&Yqų1ce&vpeئ&sG<~-Jv< 91˻|K\C}Bc_YpԈ"$&ȫ ߳'r8vr.|rq 7ɍ04WncҩJ,&W g~Vd VMa҆r=]+O]-O',hnx[IlUQ2 j\=/8SG(ijup=Ow Wux-j%?El{Ҹ &YnXc+swQװeǴoJ>iHlccr6i k$hZx!`gvԽB5q`hw,2 fE- !6ըk 1 tU j}VsxslGc4#-Jn;!3yLs%ly.'ʁ/cK+-c/E@$15>*RD sP)ųwqڃ1M5[- a"ܱn6tuq@LV'` er/9ӖaN@jcy!%Xz,9hYHȒz+b.Zyi0~vP^dOo8Pbك.gu)0@7[aQ/us=Yx^̶hquZp[b3(h &]p DE@W@]:X2嵳|[>] SrtvcTAd G]ތHdP'e3J42k,{d(E c1[y"]tIO?&kƆ@~?1*, $jfYa'qC{fx B_Z6T({FLMC|mEEHcZd UDH]k \^+q/N HGqAbVլ.ʼnV8 +a@A:ͅn8%5rCt/g2 GIw<@otTh3i֑˜jJ -M3t2T&ۡPD~Dx /1dK-MeG˰fe{u)6 l7=‰^>yG*b  d0\ڱU s$ 0pİJ}wT4WΑ7/Ҍ׈3Bpd*P /&b{ÅoEdUY2)S$4S_?ͣ6PZd\]xAO ٴ0`?t]2?|q/r'(Uڮ*`x&w*|Oa2i0fan #]dD%ܞ#p숫 I @p$H˲k ֭U8⻱a ]ɤ>F _b+@`%ʬ4_]4id 8 ވw\Xi n z^lz/%r`UM~q[l,(!8Kk"#hDqՕ5+G7PsPSx.LTN̵wWs῝" ǖ)!PTmptAog]v }]DVVݠilُԺdÖ2D˂kJR~ʃ'X}$zHpdpW2\I Κ=J6zX3t?ڊֆԻ*vG+eKL^eZ QY 2]Kxlsւ<| ; ygq)l4J܀bVN-im={CF1StEaI4PW$pC00)ԆUdoPMgC9Ntoz{sIBrI[#Kn.}qᲂxe 43bg\k~0Cߋ2~f"vAX詷嫘F|GZ\m3F#YoDobpS\S*3;%Zcbj;[{C]vgFt 1 t`|8!G~}TvEɂGl>iӚfϤϙ4өSSO>[NU3cOLappͪx ʡrs]@MV^e^*ewdO0{wgУez Ed^REesjX kϛvm*1X $Ė)P2pVQEʩT:6&8e ~%ăŵ){Y=|X?AXN2%ʮB{YȎ뉹2.ڮ ċ .eaDXiq7AfHRҜٙI9ztBw|{C@>Õ?yW@;;^ `Ftlng¤g1@{1c~z}*qQks8۶2Bk)KD{zZoG [{.`p-b"Įtݥ*L%;-~rhyZdU1xvlwf:( Totܒ3;pZjs=R^S={{ ԬCGazCHFUo/%<<}# p>rzCu8LBOPg88fNiU\Kb 674!F-Q4mB-un{˳~z)Hph2kacHBLfUwjs0lZmth7l\3m.v22@V VMJe0!T* A~6 $k*EAqԥQkڈ#uBLYy18G9ͫm0ǽDq&P'4f`x|3 Πw,3- #o ;c>@Mj?0V@K(,A~gONG9c`IMwI$9@#3> N*%|pY]?s2%PHC?s4dn4N$O _ ~Mو^X]t~K$Kg;N7j mˁk+@*~דD6nxe~Lؓa%ܺ1>O(.1Mh|c[NAx/pP^lY ZUp(l7'8ǣy!;$t@RZfH‰*wP;j9`z~]"za++z7"HQ ט:o8M-ܪoOψet3KT6qO߶EfD\G巑{Vo}@)q $Ke_3T(q+~c9~!ؠ <_G1ޔka@TZ {t?@s -?%O@%0-!;g }ܼ"h M&&e3LBC9ڛmZn|E{u8s-~i4Oi3/} %T),Xc97d(sO3@rsys;jy$nMM] p6wjNjrVѥ=WóoxYV_)UU^oaWùYODUb8Z-,vɳ mش$0O2] `V chuUg1O)dgvREXTMǠQ\ЋwB/$DIf'ow"aTX@B9E_R\RVQvۮ9z\$S)Y{>vbQԫ\Dq2KU?i(UMT%ex[oROIjZ`9nPLm Sk|ێN !8T#~-`N:,$lL_1-nG/2˅CX9pI8#3_(9X5s<"E㯙ӉLxiD$=ɕy$lj NǰG ܻ=аϝ`oLtu SIL݃_k`} G[AF.W+Ҡ6ߢibT2oѼ 1=f (d:8@A5 'pݪw0xV˦Y/(&;fp b qI4W e% #Uiq_.g+߯pT3pa{y Ki(JNV$+,GhkxN ;\'v\'fI(qĆ@K ɑ 7 6c惻>s8V:'6JXhG "Vn+nv,*߄ɕ9LvqdϺoahHݝmkb c5`0r9e2o)ը2Κ|&h% q,"0v/kabDT)$~uOEw>_7I1p!tC k/xu)F{ wg V2 KMaW7Llbd1 %ieay br˛n!7{d|B,i ;4 v|O->OEBpE5/þR03s!f5.byb5Z*wT'hU4͐sьEȥ<.aZ_\\t'.P=5'PSJ8 "'\@6bC&9~KSD/]7cٓCν-H|w?vq:T(8S&&OpU2NJRrZ;S&R ҏ'&ɈL1@̈́ʃ9-o#T(S }9!m0bh&Sɔ>{>HUEW'p|]WB;c:ܧ8@}ʩn9F ZDK@!i-b vWDZl20%m D%}\A|tZ86tLr|,o:ܻ-T\P黯W]SS4A".~6V.QjYmMLr T@ٗ3e誱nXuIkx 0pʎo;ͺ;>##V!:7fIgyS )N_vLd:,dPg k\/ؕ]lBi(#(Vќ߼'d@Z6ac{,r'IkN. 憐փz)-*^!fIBm HkuX XVF⿨,V2*ck. ɡ%+3[!J0M{zf))>| riŞh|'c~1vb19)BsEc\p&X!ܑEd!v[#; 1=Pz5xEKY lǞ#(I\ " zk$Eҧ ̶R/oº$_hb W3%g:b[Pe Er\ Fg wF)EI$`KHLZҾ:$)"M}&h6X;0m6mr5)msӊ2=z ~N%l u7,OzR]94_gۂѮ F&F*Tbfg+S-HwILxN cUQ Lم? _^{ښߧ=Gٔe)`F\/l5)UU9[T(@|w2Tf[jg]c9n]8&6} S-]/\ Ce MU4݈ˊ uuwqbS @8tPAZC^ix8:lA4` 5fkѳ; ֍0x}ʬ`NAؐ_<\-6=KB,h1revo5wi91 P8(`jS>ׂ.+Ib=KeXƚ>c 䜿R6r=Uf((AfHKx*Tw0zݢLlmhWA`4"=k_xY.hWցM/ s:_J*m,)0uA>EV2#iKE*e em0p%:c狫i!_NA7i$:bǩnyɕ c~T=fuBd;]҈f5NX?s• 1}$&wXtWC-7898$ jE.~2D aɨWGEbvA;nH1F E}IAGg IѤ<6LK A Ք!Q5_L(%2ˑN>@0Mykig J#z :2Yn7W,^2+C`&13zonơ9ʻ[K%a>1&wCW-W~S[i$ӓ$T&5[UzԳqqX5a-Y6*K4V FlVLkR &wNHNqΙZfR(40PDUUR1Cb ,2v+ rS a!7BXAnA+K R8?D*mTaHvinmdky2b"zBbh 6z}ʃ _)#Wa$E9mh2*/1o?KHC82G_iK{iReC6 Zuy1npψM!sDExZ5VЇ{ɜ,*M[&?2[ KFJ`d?*\iIEAqUyzϳ#VW:i*tdk[c5STpJLKhbR%C&:ejxغ*D"N%o"5-<~ S(B|̚![=t>QEUIPV) q>TuFӷi9&=Vqer #swZvzVlk3y9ݘYvn#XBX+QF 8=<o=]JNq {d5\tG0TqhNҕb$<ɋ VQ%qXs(|7ijqkq5mw)M_lp3zC]\zo"⚺ u $p-+\ea;+2 8`I2z*^}OLmB}^AbEȮ:'~+7.^\\"p"fHH`h /Rg%v,s.=͜zsQjw)v)QM$Tsgmr1=ZvQZRi=F{HPυ>PLHc] S2*8^h.q6ѥbCeWPdDBn^b(:UoM/lNsTt3byKk^&wLZ] ay`)Gwq[}ޡё6w(KQaCDMKv.՜ג)!\ڪGD, 6ka>ꂾ 2xzlw<>qNH4*l(Lcb*OT2{!ey6?DӉASYFIfESVENn$~Isۍkf|24~aS}ЉQOMN頚h[ˣ1aSt\\fȐ?>E2 @D L1T5 SzmQR!ܻ7r%k9.vB~P~`ǩЃ&5IeCe_04_xoo==iW G_n&Fփn؉w}.(ojj[S-#.[J`>m j8vKWRӯd9ǀ@Iw.aY,QqfYr?bwc], ;PY1džxb񏐢3RNJgd G槖1FҘ/Y]m M=dT8)&dKv0дGæTM56Y[.VsNc<有]&MtI\h~ \RG'=UUgBc̱>Rؓ/F-.|6M~Z"9xn)$)!$wc:Aaȋ5i>|^l 'ΊI\)˻=,9YklPweu\Ih);S+Y^ĆmUKC[௲^)/9L- e__zIB%(alÚfڰgw'g:S77rA&jHu׎ZHN45r 1՚I}@˸K1Ժ&/c7:5rD@8Lbe` 1xWi=n y$2_ǔ?x&I-sGA/vr6H72ܖ6~Hc!5 di!I@E.n E LxDZ^>.\v\4?5>C,^ x2FOBMQ< oC^+"J@f/^+r'*r($6{TPXZ7TUé{~B tqlM4P`)ض-.8ާ&q2>ؙ;XVW݄<%CDiҀU/}5 fʼnoVӾS+r!i-.y-t Pbde-:mjCqDD$kGI'>75m aWg9#F)^{68 5ՍH==2n0vENen9 f 7 S.^eX(W=wy [aIe8ww@,/()g]' h6t<(co w=7&XOU_A~C}V )!""SdC?**(yUqD?U,a#lY"\M>*s i<xۏ`|Aypĵ`(,x<\1ׅ9]vחƹ07J*©Ӳ XNI- u`DJ&[ISt1$^8;1m9\+Muڄ5&qQ̆0!yCfu̥}p4(2j&UM\G Sixnz^+%hli